From d60b533ec403b34933e1215cb318347958674bbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Mon, 25 Mar 2019 23:22:11 +0100 Subject: [PATCH] Initial: Offchain Workers (#1942) * Refactor state-machine stuff. * Fix tests. * WiP * WiP2 * Service support for offchain workers. * Service support for offchain workers. * Testing offchain worker. * Initial version working. * Pass side effects in call. * Pass OffchainExt in context. * Submit extrinsics to the pool. * Support inherents. * Insert to inherents pool. * Inserting to the pool asynchronously. * Add test to offchain worker. * Implement convenience syntax for modules. * Dispatching offchain worker through executive. * Fix offchain test. * Remove offchain worker from timestamp. * Update Cargo.lock. * Address review comments. * Use latest patch version for futures. * Add CLI parameter for offchain worker. * Fix compilation. * Fix test. * Fix extrinsics format for tests. * Fix RPC test. * Bump spec version. * Fix executive. * Fix support macro. * Address grumbles. * Bump runtime --- Cargo.lock | 32 +++++ core/basic-authorship/src/basic_authorship.rs | 52 ++++++- core/cli/src/lib.rs | 17 ++- core/cli/src/params.rs | 125 +++++++++++------ .../client/src/block_builder/block_builder.rs | 8 +- core/client/src/call_executor.rs | 33 ++++- core/client/src/client.rs | 29 ++-- core/client/src/genesis.rs | 6 + core/client/src/light/call_executor.rs | 53 +++++-- core/client/src/runtime_api.rs | 14 +- core/executor/src/wasm_executor.rs | 9 ++ core/finality-grandpa/src/tests.rs | 3 +- core/inherents/src/lib.rs | 4 + core/inherents/src/pool.rs | 75 ++++++++++ core/offchain/Cargo.toml | 27 ++++ core/offchain/primitives/Cargo.toml | 18 +++ core/offchain/primitives/src/lib.rs | 31 ++++ core/offchain/src/api.rs | 99 +++++++++++++ core/offchain/src/lib.rs | 132 ++++++++++++++++++ core/primitives/src/lib.rs | 29 ++++ core/rpc/src/state/mod.rs | 4 +- core/rpc/src/state/tests.rs | 2 +- core/service/Cargo.toml | 2 + core/service/src/chain_spec.rs | 8 ++ core/service/src/components.rs | 63 ++++++--- core/service/src/config.rs | 3 + core/service/src/lib.rs | 66 ++++++--- core/service/test/src/lib.rs | 1 + core/sr-api-macros/src/impl_runtime_apis.rs | 4 +- core/sr-io/with_std.rs | 8 ++ core/sr-io/without_std.rs | 19 +++ core/sr-primitives/src/lib.rs | 15 -- core/sr-primitives/src/traits.rs | 33 +++++ core/state-machine/src/basic.rs | 6 + core/state-machine/src/ext.rs | 47 +++++-- core/state-machine/src/lib.rs | 52 +++++-- core/state-machine/src/overlayed_changes.rs | 7 +- core/state-machine/src/testing.rs | 4 + core/test-client/src/lib.rs | 1 + core/test-runtime/Cargo.toml | 2 + core/test-runtime/src/lib.rs | 16 +++ core/test-runtime/src/system.rs | 1 + core/test-runtime/wasm/Cargo.lock | 9 ++ .../substrate_test_runtime.compact.wasm | Bin 56589 -> 59673 bytes node-template/runtime/Cargo.toml | 2 + node-template/runtime/src/lib.rs | 10 +- node-template/runtime/wasm/Cargo.lock | 9 ++ node-template/src/service.rs | 1 + node/cli/src/service.rs | 1 + node/runtime/Cargo.toml | 1 + node/runtime/src/lib.rs | 10 +- node/runtime/wasm/Cargo.lock | 9 ++ .../release/node_runtime.compact.wasm | Bin 923293 -> 924466 bytes srml/example/src/lib.rs | 9 ++ srml/executive/src/lib.rs | 15 +- srml/support/src/dispatch.rs | 84 +++++++++++ srml/system/src/lib.rs | 2 +- srml/timestamp/Cargo.toml | 6 +- 58 files changed, 1154 insertions(+), 174 deletions(-) create mode 100644 core/inherents/src/pool.rs create mode 100644 core/offchain/Cargo.toml create mode 100644 core/offchain/primitives/Cargo.toml create mode 100644 core/offchain/primitives/src/lib.rs create mode 100644 core/offchain/src/api.rs create mode 100644 core/offchain/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 319b9c4cdac74..23cd0ed6f1995 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1974,6 +1974,7 @@ dependencies = [ "substrate-client 0.1.0", "substrate-consensus-aura-primitives 0.1.0", "substrate-keyring 0.1.0", + "substrate-offchain-primitives 0.1.0", "substrate-primitives 0.1.0", ] @@ -2029,6 +2030,7 @@ dependencies = [ "srml-timestamp 0.1.0", "substrate-client 0.1.0", "substrate-consensus-aura-primitives 0.1.0", + "substrate-offchain-primitives 0.1.0", "substrate-primitives 0.1.0", ] @@ -3978,6 +3980,33 @@ dependencies = [ "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "substrate-offchain" +version = "0.1.0" +dependencies = [ + "env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 0.1.0", + "substrate-client 0.1.0", + "substrate-consensus-common 0.1.0", + "substrate-inherents 0.1.0", + "substrate-offchain-primitives 0.1.0", + "substrate-primitives 0.1.0", + "substrate-test-client 0.1.0", + "substrate-transaction-pool 0.1.0", + "tokio 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "substrate-offchain-primitives" +version = "0.1.0" +dependencies = [ + "sr-primitives 0.1.0", + "substrate-client 0.1.0", +] + [[package]] name = "substrate-panic-handler" version = "0.1.0" @@ -4110,8 +4139,10 @@ dependencies = [ "substrate-client-db 0.1.0", "substrate-consensus-common 0.1.0", "substrate-executor 0.1.0", + "substrate-inherents 0.1.0", "substrate-keystore 0.1.0", "substrate-network 0.1.0", + "substrate-offchain 0.1.0", "substrate-primitives 0.1.0", "substrate-rpc-servers 0.1.0", "substrate-telemetry 0.3.1", @@ -4222,6 +4253,7 @@ dependencies = [ "substrate-executor 0.1.0", "substrate-inherents 0.1.0", "substrate-keyring 0.1.0", + "substrate-offchain-primitives 0.1.0", "substrate-primitives 0.1.0", "substrate-test-client 0.1.0", ] diff --git a/core/basic-authorship/src/basic_authorship.rs b/core/basic-authorship/src/basic_authorship.rs index 579ac17fb1b78..be8ccc5356fb2 100644 --- a/core/basic-authorship/src/basic_authorship.rs +++ b/core/basic-authorship/src/basic_authorship.rs @@ -20,7 +20,7 @@ // use std::{self, time, sync::Arc}; -use log::{info, debug}; +use log::{info, debug, warn}; use client::{ self, error, Client as SubstrateClient, CallExecutor, @@ -28,15 +28,14 @@ use client::{ }; use codec::Decode; use consensus_common::{self, evaluation}; -use primitives::{H256, Blake2Hasher}; +use primitives::{H256, Blake2Hasher, ExecutionContext}; use runtime_primitives::traits::{ Block as BlockT, Hash as HashT, Header as HeaderT, ProvideRuntimeApi, AuthorityIdFor }; -use runtime_primitives::ExecutionContext; use runtime_primitives::generic::BlockId; use runtime_primitives::ApplyError; use transaction_pool::txpool::{self, Pool as TransactionPool}; -use inherents::InherentData; +use inherents::{InherentData, pool::InherentsPool}; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; /// Build new blocks. @@ -115,6 +114,8 @@ pub struct ProposerFactory where A: txpool::ChainApi { pub client: Arc, /// The transaction pool. pub transaction_pool: Arc>, + /// The inherents pool + pub inherents_pool: Arc::Extrinsic>>, } impl consensus_common::Environment<::Block> for ProposerFactory where @@ -144,6 +145,7 @@ impl consensus_common::Environment<::Block> for Propose parent_id: id, parent_number: *parent_header.number(), transaction_pool: self.transaction_pool.clone(), + inherents_pool: self.inherents_pool.clone(), now: Box::new(time::Instant::now), }; @@ -158,6 +160,7 @@ pub struct Proposer { parent_id: BlockId, parent_number: <::Header as HeaderT>::Number, transaction_pool: Arc>, + inherents_pool: Arc::Extrinsic>>, now: Box time::Instant>, } @@ -201,11 +204,23 @@ impl Proposer where &self.parent_id, inherent_data, |block_builder| { + // Add inherents from the internal pool + + let inherents = self.inherents_pool.drain(); + debug!("Pushing {} queued inherents.", inherents.len()); + for i in inherents { + if let Err(e) = block_builder.push_extrinsic(i) { + warn!("Error while pushing inherent extrinsic from the pool: {:?}", e); + } + } + + // proceed with transactions let mut is_first = true; let mut skipped = 0; let mut unqueue_invalid = Vec::new(); let pending_iterator = self.transaction_pool.ready(); + debug!("Attempting to push transactions from the pool."); for pending in pending_iterator { if (self.now)() > deadline { debug!("Consensus deadline reached when pushing block transactions, proceeding with proposing."); @@ -303,6 +318,7 @@ mod tests { let proposer_factory = ProposerFactory { client: client.clone(), transaction_pool: txpool.clone(), + inherents_pool: Default::default(), }; let mut proposer = proposer_factory.init( @@ -325,4 +341,32 @@ mod tests { assert_eq!(txpool.ready().count(), 2); } + #[test] + fn should_include_inherents_from_the_pool() { + // given + let client = Arc::new(test_client::new()); + let chain_api = transaction_pool::ChainApi::new(client.clone()); + let txpool = Arc::new(TransactionPool::new(Default::default(), chain_api)); + let inpool = Arc::new(InherentsPool::default()); + + let proposer_factory = ProposerFactory { + client: client.clone(), + transaction_pool: txpool.clone(), + inherents_pool: inpool.clone(), + }; + + inpool.add(extrinsic(0)); + + let proposer = proposer_factory.init( + &client.header(&BlockId::number(0)).unwrap().unwrap(), + &[] + ).unwrap(); + + // when + let deadline = time::Duration::from_secs(3); + let block = proposer.propose(Default::default(), deadline).unwrap(); + + // then + assert_eq!(block.extrinsics().len(), 1); + } } diff --git a/core/cli/src/lib.rs b/core/cli/src/lib.rs index 1d335c9b649e4..8fa133ea797f5 100644 --- a/core/cli/src/lib.rs +++ b/core/cli/src/lib.rs @@ -419,11 +419,20 @@ where service::Roles::FULL }; + let exec = cli.execution_strategies; config.execution_strategies = ExecutionStrategies { - syncing: cli.syncing_execution.into(), - importing: cli.importing_execution.into(), - block_construction: cli.block_construction_execution.into(), - other: cli.other_execution.into(), + syncing: exec.syncing_execution.into(), + importing: exec.importing_execution.into(), + block_construction: exec.block_construction_execution.into(), + offchain_worker: exec.offchain_worker_execution.into(), + other: exec.other_execution.into(), + }; + + config.offchain_worker = match (cli.offchain_worker, role) { + (params::OffchainWorkerEnabled::WhenValidating, service::Roles::AUTHORITY) => true, + (params::OffchainWorkerEnabled::Always, _) => true, + (params::OffchainWorkerEnabled::Never, _) => false, + (params::OffchainWorkerEnabled::WhenValidating, _) => false, }; config.roles = role; diff --git a/core/cli/src/params.rs b/core/cli/src/params.rs index 7b9b224da963d..ee014e1e8ecff 100644 --- a/core/cli/src/params.rs +++ b/core/cli/src/params.rs @@ -53,6 +53,16 @@ impl Into for ExecutionStrategy { } } +arg_enum! { + /// How to execute blocks + #[derive(Debug, Clone)] + pub enum OffchainWorkerEnabled { + Always, + Never, + WhenValidating, + } +} + /// Shared parameters used by all `CoreParams`. #[derive(Debug, StructOpt, Clone)] pub struct SharedParams { @@ -205,6 +215,70 @@ pub struct TransactionPoolParams { pub pool_kbytes: usize, } +/// Execution strategies parameters. +#[derive(Debug, StructOpt, Clone)] +pub struct ExecutionStrategies { + /// The means of execution used when calling into the runtime while syncing blocks. + #[structopt( + long = "syncing-execution", + value_name = "STRATEGY", + raw( + possible_values = "&ExecutionStrategy::variants()", + case_insensitive = "true", + default_value = r#""NativeElseWasm""# + ) + )] + pub syncing_execution: ExecutionStrategy, + + /// The means of execution used when calling into the runtime while importing blocks. + #[structopt( + long = "importing-execution", + value_name = "STRATEGY", + raw( + possible_values = "&ExecutionStrategy::variants()", + case_insensitive = "true", + default_value = r#""NativeElseWasm""# + ) + )] + pub importing_execution: ExecutionStrategy, + + /// The means of execution used when calling into the runtime while constructing blocks. + #[structopt( + long = "block-construction-execution", + value_name = "STRATEGY", + raw( + possible_values = "&ExecutionStrategy::variants()", + case_insensitive = "true", + default_value = r#""Wasm""# + ) + )] + pub block_construction_execution: ExecutionStrategy, + + /// The means of execution used when calling into the runtime while constructing blocks. + #[structopt( + long = "offchain-worker-execution", + value_name = "STRATEGY", + raw( + possible_values = "&ExecutionStrategy::variants()", + case_insensitive = "true", + default_value = r#""NativeWhenPossible""# + ) + )] + pub offchain_worker_execution: ExecutionStrategy, + + /// The means of execution used when calling into the runtime while not syncing, importing or constructing blocks. + #[structopt( + long = "other-execution", + value_name = "STRATEGY", + raw( + possible_values = "&ExecutionStrategy::variants()", + case_insensitive = "true", + default_value = r#""Wasm""# + ) + )] + pub other_execution: ExecutionStrategy, +} + /// The `run` command used to run a node. #[derive(Debug, StructOpt, Clone)] pub struct RunCmd { @@ -266,53 +340,22 @@ pub struct RunCmd { #[structopt(long = "telemetry-url", value_name = "URL VERBOSITY", parse(try_from_str = "parse_telemetry_endpoints"))] pub telemetry_endpoints: Vec<(String, u8)>, - /// The means of execution used when calling into the runtime while syncing blocks. - #[structopt( - long = "syncing-execution", - value_name = "STRATEGY", - raw( - possible_values = "&ExecutionStrategy::variants()", - case_insensitive = "true", - default_value = r#""NativeElseWasm""# - ) - )] - pub syncing_execution: ExecutionStrategy, - - /// The means of execution used when calling into the runtime while importing blocks. - #[structopt( - long = "importing-execution", - value_name = "STRATEGY", - raw( - possible_values = "&ExecutionStrategy::variants()", - case_insensitive = "true", - default_value = r#""NativeElseWasm""# - ) - )] - pub importing_execution: ExecutionStrategy, - - /// The means of execution used when calling into the runtime while constructing blocks. + /// Should execute offchain workers on every block. By default it's only enabled for nodes that are authoring new + /// blocks. #[structopt( - long = "block-construction-execution", - value_name = "STRATEGY", + long = "offchain-worker", + value_name = "ENABLED", raw( - possible_values = "&ExecutionStrategy::variants()", + possible_values = "&OffchainWorkerEnabled::variants()", case_insensitive = "true", - default_value = r#""Wasm""# + default_value = r#""WhenValidating""# ) )] - pub block_construction_execution: ExecutionStrategy, + pub offchain_worker: OffchainWorkerEnabled, - /// The means of execution used when calling into the runtime while not syncing, importing or constructing blocks. - #[structopt( - long = "other-execution", - value_name = "STRATEGY", - raw( - possible_values = "&ExecutionStrategy::variants()", - case_insensitive = "true", - default_value = r#""Wasm""# - ) - )] - pub other_execution: ExecutionStrategy, + #[allow(missing_docs)] + #[structopt(flatten)] + pub execution_strategies: ExecutionStrategies, #[allow(missing_docs)] #[structopt(flatten)] diff --git a/core/client/src/block_builder/block_builder.rs b/core/client/src/block_builder/block_builder.rs index 39969fc157dd3..63e18e827984e 100644 --- a/core/client/src/block_builder/block_builder.rs +++ b/core/client/src/block_builder/block_builder.rs @@ -17,15 +17,15 @@ use super::api::BlockBuilder as BlockBuilderApi; use std::vec::Vec; use parity_codec::Encode; -use crate::blockchain::HeaderBackend; +use runtime_primitives::ApplyOutcome; +use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{ Header as HeaderT, Hash, Block as BlockT, One, HashFor, ProvideRuntimeApi, ApiRef }; -use primitives::H256; -use runtime_primitives::generic::BlockId; +use primitives::{H256, ExecutionContext}; +use crate::blockchain::HeaderBackend; use crate::runtime_api::Core; use crate::error; -use runtime_primitives::{ApplyOutcome, ExecutionContext}; /// Utility for building new (valid) blocks from a stream of extrinsics. diff --git a/core/client/src/call_executor.rs b/core/client/src/call_executor.rs index c7872718745ab..0dad56be07403 100644 --- a/core/client/src/call_executor.rs +++ b/core/client/src/call_executor.rs @@ -19,12 +19,12 @@ use parity_codec::{Encode, Decode}; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::Block as BlockT; use state_machine::{ - self, OverlayedChanges, Ext, CodeExecutor, ExecutionManager, ExecutionStrategy + self, OverlayedChanges, Ext, CodeExecutor, ExecutionManager, ExecutionStrategy, NeverOffchainExt, }; use executor::{RuntimeVersion, RuntimeInfo, NativeVersion}; use hash_db::Hasher; use trie::MemoryDB; -use primitives::{H256, Blake2Hasher, NativeOrEncoded, NeverNativeValue}; +use primitives::{H256, Blake2Hasher, NativeOrEncoded, NeverNativeValue, OffchainExt}; use crate::backend; use crate::error; @@ -42,12 +42,15 @@ where /// Execute a call to a contract on top of state in a block of given hash. /// /// No changes are made. - fn call( + fn call< + O: OffchainExt, + >( &self, id: &BlockId, method: &str, call_data: &[u8], strategy: ExecutionStrategy, + side_effects_handler: Option<&mut O>, ) -> Result, error::Error>; /// Execute a contextual call on top of state in a block of a given hash. @@ -56,6 +59,7 @@ where /// Before executing the method, passed header is installed as the current header /// of the execution context. fn contextual_call< + O: OffchainExt, PB: Fn() -> error::Result, EM: Fn( Result, Self::Error>, @@ -73,6 +77,7 @@ where prepare_environment_block: PB, execution_manager: ExecutionManager, native_call: Option, + side_effects_handler: Option<&mut O>, ) -> error::Result> where ExecutionManager: Clone; /// Extract RuntimeVersion of given block @@ -84,6 +89,7 @@ where /// /// No changes are made. fn call_at_state< + O: OffchainExt, S: state_machine::Backend, F: FnOnce( Result, Self::Error>, @@ -98,6 +104,7 @@ where call_data: &[u8], manager: ExecutionManager, native_call: Option, + side_effects_handler: Option<&mut O>, ) -> Result<(NativeOrEncoded, S::Transaction, Option>), error::Error>; /// Execute a call to a contract on top of given state, gathering execution proof. @@ -140,7 +147,10 @@ pub struct LocalCallExecutor { impl LocalCallExecutor { /// Creates new instance of local call executor. pub fn new(backend: Arc, executor: E) -> Self { - LocalCallExecutor { backend, executor } + LocalCallExecutor { + backend, + executor, + } } } @@ -161,17 +171,19 @@ where { type Error = E::Error; - fn call(&self, + fn call(&self, id: &BlockId, method: &str, call_data: &[u8], - strategy: ExecutionStrategy + strategy: ExecutionStrategy, + side_effects_handler: Option<&mut O>, ) -> error::Result> { let mut changes = OverlayedChanges::default(); let state = self.backend.state_at(*id)?; let return_data = state_machine::new( &state, self.backend.changes_trie_storage(), + side_effects_handler, &mut changes, &self.executor, method, @@ -187,6 +199,7 @@ where } fn contextual_call< + O: OffchainExt, PB: Fn() -> error::Result, EM: Fn( Result, Self::Error>, @@ -204,6 +217,7 @@ where prepare_environment_block: PB, execution_manager: ExecutionManager, native_call: Option, + mut side_effects_handler: Option<&mut O>, ) -> Result, error::Error> where ExecutionManager: Clone { let state = self.backend.state_at(*at)?; if method != "Core_initialise_block" && initialised_block.map(|id| id != *at).unwrap_or(true) { @@ -211,6 +225,7 @@ where state_machine::new( &state, self.backend.changes_trie_storage(), + side_effects_handler.as_mut().map(|x| &mut **x), changes, &self.executor, "Core_initialise_block", @@ -226,6 +241,7 @@ where let result = state_machine::new( &state, self.backend.changes_trie_storage(), + side_effects_handler, changes, &self.executor, method, @@ -248,12 +264,13 @@ where fn runtime_version(&self, id: &BlockId) -> error::Result { let mut overlay = OverlayedChanges::default(); let state = self.backend.state_at(*id)?; - let mut ext = Ext::new(&mut overlay, &state, self.backend.changes_trie_storage()); + let mut ext = Ext::new(&mut overlay, &state, self.backend.changes_trie_storage(), NeverOffchainExt::new()); self.executor.runtime_version(&mut ext) .ok_or(error::ErrorKind::VersionInvalid.into()) } fn call_at_state< + O: OffchainExt, S: state_machine::Backend, F: FnOnce( Result, Self::Error>, @@ -268,10 +285,12 @@ where call_data: &[u8], manager: ExecutionManager, native_call: Option, + side_effects_handler: Option<&mut O>, ) -> error::Result<(NativeOrEncoded, S::Transaction, Option>)> { state_machine::new( state, self.backend.changes_trie_storage(), + side_effects_handler, changes, &self.executor, method, diff --git a/core/client/src/client.rs b/core/client/src/client.rs index 37ee1b5ce011a..26ba126b85c31 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -33,9 +33,9 @@ use runtime_primitives::traits::{ Block as BlockT, Header as HeaderT, Zero, As, NumberFor, CurrentHeight, BlockNumberToHash, ApiRef, ProvideRuntimeApi, Digest, DigestItem, AuthorityIdFor }; -use runtime_primitives::{BuildStorage, ExecutionContext}; +use runtime_primitives::BuildStorage; use crate::runtime_api::{CallRuntimeAt, ConstructRuntimeApi}; -use primitives::{Blake2Hasher, H256, ChangesTrieConfiguration, convert_hash, NeverNativeValue}; +use primitives::{Blake2Hasher, H256, ChangesTrieConfiguration, convert_hash, NeverNativeValue, ExecutionContext}; use primitives::storage::{StorageKey, StorageData}; use primitives::storage::well_known_keys; use parity_codec::{Encode, Decode}; @@ -43,7 +43,7 @@ use state_machine::{ DBValue, Backend as StateBackend, CodeExecutor, ChangesTrieAnchorBlockId, ExecutionStrategy, ExecutionManager, prove_read, ChangesTrieRootsStorage, ChangesTrieStorage, - key_changes, key_changes_proof, OverlayedChanges, + key_changes, key_changes_proof, OverlayedChanges, NeverOffchainExt, }; use hash_db::Hasher; @@ -84,6 +84,8 @@ pub struct ExecutionStrategies { pub importing: ExecutionStrategy, /// Execution strategy used when constructing blocks. pub block_construction: ExecutionStrategy, + /// Execution strategy used for offchain workers. + pub offchain_worker: ExecutionStrategy, /// Execution strategy used in other cases. pub other: ExecutionStrategy, } @@ -94,6 +96,7 @@ impl Default for ExecutionStrategies { syncing: ExecutionStrategy::NativeElseWasm, importing: ExecutionStrategy::NativeElseWasm, block_construction: ExecutionStrategy::AlwaysWasm, + offchain_worker: ExecutionStrategy::NativeWhenPossible, other: ExecutionStrategy::NativeElseWasm, } } @@ -343,7 +346,7 @@ impl Client where pub fn authorities_at(&self, id: &BlockId) -> error::Result>> { match self.backend.blockchain().cache().and_then(|cache| cache.authorities_at(*id)) { Some(cached_value) => Ok(cached_value), - None => self.executor.call(id, "Core_authorities", &[], ExecutionStrategy::NativeElseWasm) + None => self.executor.call(id, "Core_authorities", &[], ExecutionStrategy::NativeElseWasm, NeverOffchainExt::new()) .and_then(|r| Vec::>::decode(&mut &r[..]) .ok_or_else(|| error::ErrorKind::InvalidAuthoritiesSet.into())) } @@ -871,7 +874,7 @@ impl Client where }), } }; - let (_, storage_update, changes_update) = self.executor.call_at_state::<_, _, NeverNativeValue, fn() -> _>( + let (_, storage_update, changes_update) = self.executor.call_at_state::<_, _, _, NeverNativeValue, fn() -> _>( transaction_state, &mut overlay, "Core_execute_block", @@ -881,6 +884,7 @@ impl Client where _ => get_execution_manager(self.execution_strategies().importing), }, None, + NeverOffchainExt::new(), )?; overlay.commit_prospective(); @@ -1339,7 +1343,8 @@ impl CallRuntimeAt for Client where Block: BlockT { fn call_api_at< - R: Encode + Decode + PartialEq, NC: FnOnce() -> result::Result + UnwindSafe + R: Encode + Decode + PartialEq, + NC: FnOnce() -> result::Result + UnwindSafe, >( &self, at: &BlockId, @@ -1348,15 +1353,22 @@ impl CallRuntimeAt for Client where changes: &mut OverlayedChanges, initialised_block: &mut Option>, native_call: Option, - context: ExecutionContext + context: ExecutionContext, ) -> error::Result> { let manager = match context { ExecutionContext::BlockConstruction => self.execution_strategies.block_construction.get_manager(), ExecutionContext::Syncing => self.execution_strategies.syncing.get_manager(), ExecutionContext::Importing => self.execution_strategies.importing.get_manager(), + ExecutionContext::OffchainWorker(_) => self.execution_strategies.offchain_worker.get_manager(), ExecutionContext::Other => self.execution_strategies.other.get_manager(), }; - self.executor.contextual_call::<_, fn(_,_) -> _,_,_>( + + let mut offchain_extensions = match context { + ExecutionContext::OffchainWorker(ext) => Some(ext), + _ => None, + }; + + self.executor.contextual_call::<_, _, fn(_,_) -> _,_,_>( at, function, &args, @@ -1365,6 +1377,7 @@ impl CallRuntimeAt for Client where || self.prepare_environment_block(at), manager, native_call, + offchain_extensions.as_mut(), ) } diff --git a/core/client/src/genesis.rs b/core/client/src/genesis.rs index 9ee003368524e..7ebae4c558895 100644 --- a/core/client/src/genesis.rs +++ b/core/client/src/genesis.rs @@ -90,6 +90,7 @@ mod tests { state_machine::new( backend, Some(&InMemoryChangesTrieStorage::new()), + state_machine::NeverOffchainExt::new(), &mut overlay, &executor(), "Core_initialise_block", @@ -102,6 +103,7 @@ mod tests { state_machine::new( backend, Some(&InMemoryChangesTrieStorage::new()), + state_machine::NeverOffchainExt::new(), &mut overlay, &executor(), "BlockBuilder_apply_extrinsic", @@ -114,6 +116,7 @@ mod tests { let (ret_data, _, _) = state_machine::new( backend, Some(&InMemoryChangesTrieStorage::new()), + state_machine::NeverOffchainExt::new(), &mut overlay, &executor(), "BlockBuilder_finalise_block", @@ -160,6 +163,7 @@ mod tests { let _ = state_machine::new( &backend, Some(&InMemoryChangesTrieStorage::new()), + state_machine::NeverOffchainExt::new(), &mut overlay, &executor(), "Core_execute_block", @@ -188,6 +192,7 @@ mod tests { let _ = state_machine::new( &backend, Some(&InMemoryChangesTrieStorage::new()), + state_machine::NeverOffchainExt::new(), &mut overlay, &executor(), "Core_execute_block", @@ -216,6 +221,7 @@ mod tests { let r = state_machine::new( &backend, Some(&InMemoryChangesTrieStorage::new()), + state_machine::NeverOffchainExt::new(), &mut overlay, &Executor::new(None), "Core_execute_block", diff --git a/core/client/src/light/call_executor.rs b/core/client/src/light/call_executor.rs index 5bc77112f8152..00a3d8895beb1 100644 --- a/core/client/src/light/call_executor.rs +++ b/core/client/src/light/call_executor.rs @@ -21,11 +21,11 @@ use std::{collections::HashSet, sync::Arc, panic::UnwindSafe, result, marker::Ph use futures::{IntoFuture, Future}; use parity_codec::{Encode, Decode}; -use primitives::{H256, Blake2Hasher, convert_hash, NativeOrEncoded}; +use primitives::{H256, Blake2Hasher, convert_hash, NativeOrEncoded, OffchainExt}; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{As, Block as BlockT, Header as HeaderT}; use state_machine::{self, Backend as StateBackend, CodeExecutor, OverlayedChanges, ExecutionStrategy, - create_proof_check_backend, execution_proof_check_on_trie_backend, ExecutionManager}; + create_proof_check_backend, execution_proof_check_on_trie_backend, ExecutionManager, NeverOffchainExt}; use hash_db::Hasher; use crate::backend::RemoteBackend; @@ -80,7 +80,16 @@ where { type Error = ClientError; - fn call(&self, id: &BlockId, method: &str, call_data: &[u8], _strategy: ExecutionStrategy) + fn call< + O: OffchainExt, + >( + &self, + id: &BlockId, + method: &str, + call_data: &[u8], + _strategy: ExecutionStrategy, + _side_effects_handler: Option<&mut O>, + ) -> ClientResult> { let block_hash = self.blockchain.expect_block_hash_from_id(id)?; let block_header = self.blockchain.expect_header(id.clone())?; @@ -95,6 +104,7 @@ where } fn contextual_call< + O: OffchainExt, PB: Fn() -> ClientResult, EM: Fn( Result, Self::Error>, @@ -112,22 +122,24 @@ where _prepare_environment_block: PB, execution_manager: ExecutionManager, _native_call: Option, + side_effects_handler: Option<&mut O>, ) -> ClientResult> where ExecutionManager: Clone { // it is only possible to execute contextual call if changes are empty if !changes.is_empty() || initialised_block.is_some() { return Err(ClientErrorKind::NotAvailableOnLightClient.into()); } - self.call(at, method, call_data, (&execution_manager).into()).map(NativeOrEncoded::Encoded) + self.call(at, method, call_data, (&execution_manager).into(), side_effects_handler).map(NativeOrEncoded::Encoded) } fn runtime_version(&self, id: &BlockId) -> ClientResult { - let call_result = self.call(id, "version", &[], ExecutionStrategy::NativeElseWasm)?; + let call_result = self.call(id, "version", &[], ExecutionStrategy::NativeElseWasm, NeverOffchainExt::new())?; RuntimeVersion::decode(&mut call_result.as_slice()) .ok_or_else(|| ClientErrorKind::VersionInvalid.into()) } fn call_at_state< + O: OffchainExt, S: StateBackend, FF: FnOnce( Result, Self::Error>, @@ -142,6 +154,7 @@ where _call_data: &[u8], _m: ExecutionManager, _native_call: Option, + _side_effects_handler: Option<&mut O>, ) -> ClientResult<(NativeOrEncoded, S::Transaction, Option>)> { Err(ClientErrorKind::NotAvailableOnLightClient.into()) } @@ -201,15 +214,24 @@ impl CallExecutor for { type Error = ClientError; - fn call(&self, id: &BlockId, method: &str, call_data: &[u8], strategy: ExecutionStrategy) - -> ClientResult> { + fn call< + O: OffchainExt, + >( + &self, + id: &BlockId, + method: &str, + call_data: &[u8], + strategy: ExecutionStrategy, + side_effects_handler: Option<&mut O>, + ) -> ClientResult> { match self.backend.is_local_state_available(id) { - true => self.local.call(id, method, call_data, strategy), - false => self.remote.call(id, method, call_data, strategy), + true => self.local.call(id, method, call_data, strategy, side_effects_handler), + false => self.remote.call(id, method, call_data, strategy, side_effects_handler), } } fn contextual_call< + O: OffchainExt, PB: Fn() -> ClientResult, EM: Fn( Result, Self::Error>, @@ -227,12 +249,14 @@ impl CallExecutor for prepare_environment_block: PB, _manager: ExecutionManager, native_call: Option, + side_effects_handler: Option<&mut O>, ) -> ClientResult> where ExecutionManager: Clone { // there's no actual way/need to specify native/wasm execution strategy on light node // => we can safely ignore passed values match self.backend.is_local_state_available(at) { true => CallExecutor::contextual_call::< + _, _, fn( Result, Local::Error>, @@ -250,8 +274,10 @@ impl CallExecutor for prepare_environment_block, ExecutionManager::NativeWhenPossible, native_call, + side_effects_handler, ).map_err(|e| ClientErrorKind::Execution(Box::new(e.to_string())).into()), false => CallExecutor::contextual_call::< + _, _, fn( Result, Remote::Error>, @@ -269,6 +295,7 @@ impl CallExecutor for prepare_environment_block, ExecutionManager::NativeWhenPossible, native_call, + side_effects_handler, ).map_err(|e| ClientErrorKind::Execution(Box::new(e.to_string())).into()), } } @@ -281,6 +308,7 @@ impl CallExecutor for } fn call_at_state< + O: OffchainExt, S: StateBackend, FF: FnOnce( Result, Self::Error>, @@ -295,11 +323,13 @@ impl CallExecutor for call_data: &[u8], _manager: ExecutionManager, native_call: Option, + side_effects_handler: Option<&mut O>, ) -> ClientResult<(NativeOrEncoded, S::Transaction, Option>)> { // there's no actual way/need to specify native/wasm execution strategy on light node // => we can safely ignore passed values CallExecutor::call_at_state::< + _, _, fn( Result, Remote::Error>, @@ -315,6 +345,7 @@ impl CallExecutor for call_data, ExecutionManager::NativeWhenPossible, native_call, + side_effects_handler, ).map_err(|e| ClientErrorKind::Execution(Box::new(e.to_string())).into()) } @@ -509,7 +540,7 @@ mod tests { let local_executor = RemoteCallExecutor::new(Arc::new(backend.blockchain().clone()), Arc::new(OkCallFetcher::new(vec![1]))); let remote_executor = RemoteCallExecutor::new(Arc::new(backend.blockchain().clone()), Arc::new(OkCallFetcher::new(vec![2]))); let remote_or_local = RemoteOrLocalCallExecutor::new(backend, remote_executor, local_executor); - assert_eq!(remote_or_local.call(&BlockId::Number(0), "test_method", &[], ExecutionStrategy::NativeElseWasm).unwrap(), vec![1]); - assert_eq!(remote_or_local.call(&BlockId::Number(1), "test_method", &[], ExecutionStrategy::NativeElseWasm).unwrap(), vec![2]); + assert_eq!(remote_or_local.call(&BlockId::Number(0), "test_method", &[], ExecutionStrategy::NativeElseWasm, NeverOffchainExt::new()).unwrap(), vec![1]); + assert_eq!(remote_or_local.call(&BlockId::Number(1), "test_method", &[], ExecutionStrategy::NativeElseWasm, NeverOffchainExt::new()).unwrap(), vec![2]); } } diff --git a/core/client/src/runtime_api.rs b/core/client/src/runtime_api.rs index 435a7d70e6fff..77d733f64ed5c 100644 --- a/core/client/src/runtime_api.rs +++ b/core/client/src/runtime_api.rs @@ -24,10 +24,12 @@ pub use state_machine::OverlayedChanges; pub use primitives::NativeOrEncoded; #[doc(hidden)] pub use runtime_primitives::{ - traits::{AuthorityIdFor, Block as BlockT, GetNodeBlockType, GetRuntimeBlockType, ApiRef, RuntimeApiInfo}, - generic::BlockId, transaction_validity::TransactionValidity, ExecutionContext, + traits::{AuthorityIdFor, Block as BlockT, GetNodeBlockType, GetRuntimeBlockType, Header as HeaderT, ApiRef, RuntimeApiInfo}, + generic::BlockId, transaction_validity::TransactionValidity, }; #[doc(hidden)] +pub use primitives::{ExecutionContext, OffchainExt}; +#[doc(hidden)] pub use runtime_version::{ApiId, RuntimeVersion, ApisVec, create_apis_vec}; #[doc(hidden)] pub use rstd::{slice, mem}; @@ -91,7 +93,10 @@ pub trait ApiExt { pub trait CallRuntimeAt { /// Calls the given api function with the given encoded arguments at the given block /// and returns the encoded result. - fn call_api_at result::Result + UnwindSafe>( + fn call_api_at< + R: Encode + Decode + PartialEq, + NC: FnOnce() -> result::Result + UnwindSafe, + >( &self, at: &BlockId, function: &'static str, @@ -99,7 +104,7 @@ pub trait CallRuntimeAt { changes: &mut OverlayedChanges, initialised_block: &mut Option>, native_call: Option, - context: ExecutionContext + context: ExecutionContext, ) -> error::Result>; /// Returns the runtime version at the given block. @@ -132,3 +137,4 @@ decl_runtime_apis! { fn validate_transaction(tx: ::Extrinsic) -> TransactionValidity; } } + diff --git a/core/executor/src/wasm_executor.rs b/core/executor/src/wasm_executor.rs index 7e6833bb7839f..42af29e9bae03 100644 --- a/core/executor/src/wasm_executor.rs +++ b/core/executor/src/wasm_executor.rs @@ -520,6 +520,15 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, Ok(0) }, + ext_submit_extrinsic(msg_data: *const u8, len: u32) => { + let extrinsic = this.memory.get(msg_data, len as usize) + .map_err(|_| UserError("OOB while ext_submit_extrinsic: wasm"))?; + + this.ext.submit_extrinsic(extrinsic) + .map_err(|_| UserError("Calling unavailable API ext_submit_extrinsic: wasm"))?; + + Ok(()) + }, ext_sandbox_instantiate( dispatch_thunk_idx: usize, wasm_ptr: *const u8, diff --git a/core/finality-grandpa/src/tests.rs b/core/finality-grandpa/src/tests.rs index 6daddea562450..7e0537ed7b09a 100644 --- a/core/finality-grandpa/src/tests.rs +++ b/core/finality-grandpa/src/tests.rs @@ -35,8 +35,7 @@ use std::collections::{HashMap, HashSet}; use std::result; use runtime_primitives::traits::{ApiRef, ProvideRuntimeApi}; use runtime_primitives::generic::BlockId; -use runtime_primitives::ExecutionContext; -use substrate_primitives::NativeOrEncoded; +use substrate_primitives::{NativeOrEncoded, ExecutionContext}; use authorities::AuthoritySet; use consensus_changes::ConsensusChanges; diff --git a/core/inherents/src/lib.rs b/core/inherents/src/lib.rs index eadd45ba9e67b..7d2324bc933cd 100644 --- a/core/inherents/src/lib.rs +++ b/core/inherents/src/lib.rs @@ -31,6 +31,7 @@ //! information on how that is done. #![cfg_attr(not(feature = "std"), no_std)] +#![warn(missing_docs)] use parity_codec as codec; use codec::{Encode, Decode}; @@ -43,6 +44,9 @@ use parking_lot::RwLock; #[cfg(feature = "std")] use std::{sync::Arc, format}; +#[cfg(feature = "std")] +pub mod pool; + pub use runtime_primitives::RuntimeString; /// An identifier for an inherent. diff --git a/core/inherents/src/pool.rs b/core/inherents/src/pool.rs new file mode 100644 index 0000000000000..2c7e953696a55 --- /dev/null +++ b/core/inherents/src/pool.rs @@ -0,0 +1,75 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Inherents Pool + +use std::{fmt, mem, vec}; +use parking_lot::Mutex; + +/// Inherents Pool +/// +/// The pool is responsible to collect inherents asynchronously generated +/// by some other parts of the code and make them ready for the next block production. +pub struct InherentsPool { + data: Mutex>, +} + +impl Default for InherentsPool { + fn default() -> Self { + InherentsPool { + data: Default::default(), + } + } +} + +impl fmt::Debug for InherentsPool { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + let mut builder = fmt.debug_struct("InherentsPool"); + if let Some(data) = self.data.try_lock() { + builder.field("data", &*data); + } + builder.finish() + } +} + +impl InherentsPool { + /// Add inherent extrinsic to the pool. + /// + /// This inherent will be appended to the next produced block. + pub fn add(&self, extrinsic: T) { + self.data.lock().push(extrinsic); + } + + /// Drain all currently queued inherents. + pub fn drain(&self) -> Vec { + mem::replace(&mut *self.data.lock(), vec![]) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn should_drain_inherents_to_given_data() { + let pool = InherentsPool::default(); + pool.add(5); + pool.add(7); + + assert_eq!(pool.drain(), vec![5, 7]); + assert_eq!(pool.drain(), vec![]); + } +} diff --git a/core/offchain/Cargo.toml b/core/offchain/Cargo.toml new file mode 100644 index 0000000000000..8cd1d2edc557d --- /dev/null +++ b/core/offchain/Cargo.toml @@ -0,0 +1,27 @@ +[package] +description = "Substrate offchain workers" +name = "substrate-offchain" +version = "0.1.0" +license = "GPL-3.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +client = { package = "substrate-client", path = "../../core/client" } +consensus = { package = "substrate-consensus-common", path = "../../core/consensus/common" } +futures = "0.1.25" +inherents = { package = "substrate-inherents", path = "../../core/inherents" } +log = "0.4" +offchain-primitives = { package = "substrate-offchain-primitives", path = "./primitives" } +parity-codec = { version = "3.1", features = ["derive"] } +primitives = { package = "substrate-primitives", path = "../../core/primitives" } +runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } +tokio = "0.1.7" +transaction_pool = { package = "substrate-transaction-pool", path = "../../core/transaction-pool" } + +[dev-dependencies] +env_logger = "0.6" +test_client = { package = "substrate-test-client", path = "../../core/test-client" } + +[features] +default = [] diff --git a/core/offchain/primitives/Cargo.toml b/core/offchain/primitives/Cargo.toml new file mode 100644 index 0000000000000..4d10e08f92dd6 --- /dev/null +++ b/core/offchain/primitives/Cargo.toml @@ -0,0 +1,18 @@ +[package] +description = "Substrate offchain workers primitives" +name = "substrate-offchain-primitives" +version = "0.1.0" +license = "GPL-3.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +client = { package = "substrate-client", path = "../../client", default-features = false } +runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives", default-features = false } + +[features] +default = ["std"] +std = [ + "client/std", + "runtime_primitives/std" +] diff --git a/core/offchain/primitives/src/lib.rs b/core/offchain/primitives/src/lib.rs new file mode 100644 index 0000000000000..c05e8dceb90ce --- /dev/null +++ b/core/offchain/primitives/src/lib.rs @@ -0,0 +1,31 @@ +// Copyright 2018 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! The Offchain Worker runtime api primitives. + +#![cfg_attr(not(feature = "std"), no_std)] +#![warn(missing_docs)] + +use client::decl_runtime_apis; +use runtime_primitives::traits::NumberFor; + +decl_runtime_apis! { + /// The offchain worker api. + pub trait OffchainWorkerApi { + /// Starts the off-chain task for given block number. + fn offchain_worker(number: NumberFor); + } +} diff --git a/core/offchain/src/api.rs b/core/offchain/src/api.rs new file mode 100644 index 0000000000000..5d2a636be3924 --- /dev/null +++ b/core/offchain/src/api.rs @@ -0,0 +1,99 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +use std::sync::Arc; +use futures::{Stream, Future, sync::mpsc}; +use inherents::pool::InherentsPool; +use log::{info, debug, warn}; +use parity_codec::Decode; +use primitives::OffchainExt; +use runtime_primitives::{ + generic::BlockId, + traits::{self, Extrinsic}, +}; +use transaction_pool::txpool::{Pool, ChainApi}; + +/// A message between the offchain extension and the processing thread. +enum ExtMessage { + SubmitExtrinsic(Vec), +} + +/// Asynchronous offchain API. +/// +/// NOTE this is done to prevent recursive calls into the runtime (which are not supported currently). +pub(crate) struct AsyncApi(mpsc::UnboundedSender); + +impl OffchainExt for AsyncApi { + fn submit_extrinsic(&mut self, ext: Vec) { + let _ = self.0.unbounded_send(ExtMessage::SubmitExtrinsic(ext)); + } +} + +/// Offchain extensions implementation API +pub(crate) struct Api { + receiver: Option>, + transaction_pool: Arc>, + inherents_pool: Arc::Extrinsic>>, + at: BlockId, +} + +impl Api { + pub fn new( + transaction_pool: Arc>, + inherents_pool: Arc::Extrinsic>>, + at: BlockId, + ) -> (AsyncApi, Self) { + let (tx, rx) = mpsc::unbounded(); + let api = Self { + receiver: Some(rx), + transaction_pool, + inherents_pool, + at, + }; + (AsyncApi(tx), api) + } + + /// Run a processing task for the API + pub fn process(mut self) -> impl Future { + let receiver = self.receiver.take().expect("Take invoked only once."); + + receiver.for_each(move |msg| { + match msg { + ExtMessage::SubmitExtrinsic(ext) => self.submit_extrinsic(ext), + } + Ok(()) + }) + } + + fn submit_extrinsic(&mut self, ext: Vec) { + let xt = match ::Extrinsic::decode(&mut &*ext) { + Some(xt) => xt, + None => { + warn!("Unable to decode extrinsic: {:?}", ext); + return + }, + }; + + info!("Submitting to the pool: {:?} (isSigned: {:?})", xt, xt.is_signed()); + match self.transaction_pool.submit_one(&self.at, xt.clone()) { + Ok(hash) => debug!("[{:?}] Offchain transaction added to the pool.", hash), + Err(_) => { + debug!("Offchain inherent added to the pool."); + self.inherents_pool.add(xt); + }, + } + } +} diff --git a/core/offchain/src/lib.rs b/core/offchain/src/lib.rs new file mode 100644 index 0000000000000..cac960f2506f2 --- /dev/null +++ b/core/offchain/src/lib.rs @@ -0,0 +1,132 @@ +// 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 . + +//! Substrate offchain workers. +//! +//! The offchain workers is a special function of the runtime that +//! gets executed after block is imported. During execution +//! it's able to asynchronously submit extrinsics that will either +//! be propagated to other nodes (transactions) or will be +//! added to the next block produced by the node as inherents. +//! +//! Offchain workers can be used for computation-heavy tasks +//! that are not feasible for execution during regular block processing. +//! It can either be tasks that no consensus is required for, +//! or some form of consensus over the data can be built on-chain +//! for instance via: +//! 1. Challenge period for incorrect computations +//! 2. Majority voting for results +//! 3. etc + +#![warn(missing_docs)] + +use std::{ + marker::PhantomData, + sync::Arc, +}; + +use client::runtime_api::ApiExt; +use inherents::pool::InherentsPool; +use log::{debug, warn}; +use primitives::ExecutionContext; +use runtime_primitives::{ + generic::BlockId, + traits::{self, ProvideRuntimeApi}, +}; +use tokio::runtime::TaskExecutor; +use transaction_pool::txpool::{Pool, ChainApi}; + +mod api; + +pub use offchain_primitives::OffchainWorkerApi; + +/// An offchain workers manager. +#[derive(Debug)] +pub struct OffchainWorkers { + client: Arc, + inherents_pool: Arc::Extrinsic>>, + executor: TaskExecutor, + _block: PhantomData, +} + +impl OffchainWorkers { + /// Creates new `OffchainWorkers`. + pub fn new( + client: Arc, + inherents_pool: Arc::Extrinsic>>, + executor: TaskExecutor, + ) -> Self { + Self { + client, + inherents_pool, + executor, + _block: PhantomData, + } + } +} + +impl OffchainWorkers where + Block: traits::Block, + C: ProvideRuntimeApi, + C::Api: OffchainWorkerApi, +{ + /// Start the offchain workers after given block. + pub fn on_block_imported( + &self, + number: &::Number, + pool: &Arc>, + ) where + A: ChainApi + 'static, + { + 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 (api, runner) = api::Api::new(pool.clone(), self.inherents_pool.clone(), at.clone()); + self.executor.spawn(runner.process()); + + debug!("Running offchain workers at {:?}", at); + let api = Box::new(api); + runtime.offchain_worker_with_context(&at, ExecutionContext::OffchainWorker(api), *number).unwrap(); + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use futures::Future; + + #[test] + fn should_call_into_runtime_and_produce_extrinsic() { + // given + let _ = env_logger::try_init(); + let runtime = tokio::runtime::Runtime::new().unwrap(); + let client = Arc::new(test_client::new()); + let pool = Arc::new(Pool::new(Default::default(), ::transaction_pool::ChainApi::new(client.clone()))); + let inherents = Arc::new(InherentsPool::default()); + + // when + let offchain = OffchainWorkers::new(client, inherents.clone(), runtime.executor()); + offchain.on_block_imported(&0u64, &pool); + + // then + runtime.shutdown_on_idle().wait().unwrap(); + assert_eq!(inherents.drain().len(), 1); + } +} diff --git a/core/primitives/src/lib.rs b/core/primitives/src/lib.rs index 67b99f7ebc81b..38ecec0fa4e06 100644 --- a/core/primitives/src/lib.rs +++ b/core/primitives/src/lib.rs @@ -76,6 +76,35 @@ pub use hash_db::Hasher; // pub use self::hasher::blake::BlakeHasher; pub use self::hasher::blake2::Blake2Hasher; +/// Context for executing a call into the runtime. +#[repr(u8)] +pub enum ExecutionContext { + /// Context for general importing (including own blocks). + Importing, + /// Context used when syncing the blockchain. + Syncing, + /// Context used for block construction. + BlockConstruction, + /// Offchain worker context. + OffchainWorker(Box), + /// Context used for other calls. + Other, +} + +/// An extended externalities for offchain workers. +pub trait OffchainExt { + /// Submits an extrinsics. + /// + /// The extrinsic will either go to the pool (signed) + /// or to the next produced block (inherent). + fn submit_extrinsic(&mut self, extrinsic: Vec); +} +impl OffchainExt for Box { + fn submit_extrinsic(&mut self, ex: Vec) { + (&mut **self).submit_extrinsic(ex) + } +} + /// Hex-serialised shim for `Vec`. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug, Hash, PartialOrd, Ord))] diff --git a/core/rpc/src/state/mod.rs b/core/rpc/src/state/mod.rs index c2e5f885c99e0..168c0bd692732 100644 --- a/core/rpc/src/state/mod.rs +++ b/core/rpc/src/state/mod.rs @@ -35,7 +35,7 @@ use crate::rpc::futures::{stream, Future, Sink, Stream}; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{Block as BlockT, Header, ProvideRuntimeApi, As, NumberFor}; use runtime_version::RuntimeVersion; -use state_machine::ExecutionStrategy; +use state_machine::{self, ExecutionStrategy}; use crate::subscriptions::Subscriptions; @@ -298,7 +298,7 @@ impl StateApi for State where .executor() .call( &BlockId::Hash(block), - &method, &data.0, ExecutionStrategy::NativeElseWasm + &method, &data.0, ExecutionStrategy::NativeElseWasm, state_machine::NeverOffchainExt::new(), )?; Ok(Bytes(return_data)) } diff --git a/core/rpc/src/state/tests.rs b/core/rpc/src/state/tests.rs index 436d413b1a7be..f28e63b15d62c 100644 --- a/core/rpc/src/state/tests.rs +++ b/core/rpc/src/state/tests.rs @@ -221,7 +221,7 @@ fn should_return_runtime_version() { assert_eq!( ::serde_json::to_string(&api.runtime_version(None.into()).unwrap()).unwrap(), - r#"{"specName":"test","implName":"parity-test","authoringVersion":1,"specVersion":1,"implVersion":1,"apis":[["0xdf6acb689907609b",1],["0x37e397fc7c91f5e4",1],["0xd2bc9897eed08f15",1],["0x40fe3ad401f8959a",2],["0xc6e9a76309f39b09",1],["0xdd718d5cc53262d4",1]]}"# + r#"{"specName":"test","implName":"parity-test","authoringVersion":1,"specVersion":1,"implVersion":1,"apis":[["0xdf6acb689907609b",1],["0x37e397fc7c91f5e4",1],["0xd2bc9897eed08f15",1],["0x40fe3ad401f8959a",2],["0xc6e9a76309f39b09",1],["0xdd718d5cc53262d4",1],["0xf78b278be53f454c",1]]}"# ); } diff --git a/core/service/Cargo.toml b/core/service/Cargo.toml index 353a3a99736f9..b2f431a5db336 100644 --- a/core/service/Cargo.toml +++ b/core/service/Cargo.toml @@ -17,6 +17,7 @@ serde = "1.0" serde_json = "1.0" serde_derive = "1.0" target_info = "0.1" +inherents = { package = "substrate-inherents", path = "../../core/inherents" } keystore = { package = "substrate-keystore", path = "../../core/keystore" } sr-io = { path = "../../core/sr-io" } runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } @@ -30,6 +31,7 @@ substrate-executor = { path = "../../core/executor" } transaction_pool = { package = "substrate-transaction-pool", path = "../../core/transaction-pool" } rpc = { package = "substrate-rpc-servers", path = "../../core/rpc-servers" } tel = { package = "substrate-telemetry", path = "../../core/telemetry" } +offchain = { package = "substrate-offchain", path = "../../core/offchain" } [dev-dependencies] substrate-test-client = { path = "../test-client" } diff --git a/core/service/src/chain_spec.rs b/core/service/src/chain_spec.rs index 45b61f0eebdfe..78aad64dd0730 100644 --- a/core/service/src/chain_spec.rs +++ b/core/service/src/chain_spec.rs @@ -116,35 +116,43 @@ impl Clone for ChainSpec { } impl ChainSpec { + /// A list of bootnode addresses. pub fn boot_nodes(&self) -> &[String] { &self.spec.boot_nodes } + /// Spec name. pub fn name(&self) -> &str { &self.spec.name } + /// Spec id. pub fn id(&self) -> &str { &self.spec.id } + /// Telemetry endpoints (if any) pub fn telemetry_endpoints(&self) -> &Option { &self.spec.telemetry_endpoints } + /// Network protocol id. pub fn protocol_id(&self) -> Option<&str> { self.spec.protocol_id.as_ref().map(String::as_str) } + /// Name of the consensus engine. pub fn consensus_engine(&self) -> Option<&str> { self.spec.consensus_engine.as_ref().map(String::as_str) } + /// Additional loosly-typed properties of the chain. pub fn properties(&self) -> Properties { // Return an empty JSON object if 'properties' not defined in config self.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()) } diff --git a/core/service/src/components.rs b/core/service/src/components.rs index 94f5e69c8f395..e89921742bca7 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -21,7 +21,7 @@ use serde::{Serialize, de::DeserializeOwned}; use tokio::runtime::TaskExecutor; use crate::chain_spec::ChainSpec; use client_db; -use client::{self, Client, runtime_api::{Metadata, TaggedTransactionQueue}}; +use client::{self, Client, runtime_api}; use crate::{error, Service, maybe_start_server}; use consensus_common::import_queue::ImportQueue; use network::{self, OnDemand}; @@ -150,7 +150,7 @@ pub trait StartRPC { impl StartRPC for C where ComponentClient: ProvideRuntimeApi, - as ProvideRuntimeApi>::Api: Metadata>, + as ProvideRuntimeApi>::Api: runtime_api::Metadata>, { type ServersHandle = (Option, Option>); @@ -192,14 +192,14 @@ impl StartRPC for C where /// Something that can maintain transaction pool on every imported block. pub trait MaintainTransactionPool { - fn on_block_imported( + fn maintain_transaction_pool( id: &BlockId>, client: &ComponentClient, transaction_pool: &TransactionPool, ) -> error::Result<()>; } -fn on_block_imported( +fn maintain_transaction_pool( id: &BlockId, client: &Client, transaction_pool: &TransactionPool, @@ -207,7 +207,7 @@ fn on_block_imported( Block: BlockT::Out>, Backend: client::backend::Backend, Client: ProvideRuntimeApi, - as ProvideRuntimeApi>::Api: TaggedTransactionQueue, + as ProvideRuntimeApi>::Api: runtime_api::TaggedTransactionQueue, Executor: client::CallExecutor, PoolApi: txpool::ChainApi, { @@ -227,14 +227,35 @@ fn on_block_imported( impl MaintainTransactionPool for C where ComponentClient: ProvideRuntimeApi, - as ProvideRuntimeApi>::Api: TaggedTransactionQueue>, + as ProvideRuntimeApi>::Api: runtime_api::TaggedTransactionQueue>, { - fn on_block_imported( + fn maintain_transaction_pool( id: &BlockId>, client: &ComponentClient, transaction_pool: &TransactionPool, ) -> error::Result<()> { - on_block_imported(id, client, transaction_pool) + maintain_transaction_pool(id, client, transaction_pool) + } +} + +pub trait OffchainWorker { + fn offchain_workers( + number: &FactoryBlockNumber, + offchain: &offchain::OffchainWorkers, ComponentBlock>, + pool: &Arc>, + ) -> error::Result<()>; +} + +impl OffchainWorker for C where + ComponentClient: ProvideRuntimeApi, + as ProvideRuntimeApi>::Api: offchain::OffchainWorkerApi>, +{ + fn offchain_workers( + number: &FactoryBlockNumber, + offchain: &offchain::OffchainWorkers, ComponentBlock>, + pool: &Arc>, + ) -> error::Result<()> { + Ok(offchain.on_block_imported(number, pool)) } } @@ -246,9 +267,16 @@ pub trait ServiceTrait: + 'static + StartRPC + MaintainTransactionPool + + OffchainWorker {} impl ServiceTrait for T where - T: Deref> + Send + Sync + 'static + StartRPC + MaintainTransactionPool + T: Deref> + + Send + + Sync + + 'static + + StartRPC + + MaintainTransactionPool + + OffchainWorker {} /// A collection of types and methods to build a service on top of the substrate service. @@ -338,17 +366,14 @@ pub trait Components: Sized + 'static { type Executor: 'static + client::CallExecutor, Blake2Hasher> + Send + Sync + Clone; /// The type that implements the runtime API. type RuntimeApi: Send + Sync; - /// A type that can start the RPC. - type RPC: StartRPC; + /// A type that can start all runtime-dependent services. + type RuntimeServices: ServiceTrait; // TODO: Traitify transaction pool and allow people to implement their own. (#1242) - /// A type that can maintain transaction pool. - type TransactionPool: MaintainTransactionPool; /// Extrinsic pool type. type TransactionPoolApi: 'static + txpool::ChainApi< Hash = as BlockT>::Hash, Block = FactoryBlock >; - /// Our Import Queue type ImportQueue: ImportQueue> + 'static; @@ -382,6 +407,7 @@ pub struct FullComponents { } impl FullComponents { + /// Create new `FullComponents` pub fn new( config: FactoryFullConfiguration, task_executor: TaskExecutor @@ -416,8 +442,7 @@ impl Components for FullComponents { type TransactionPoolApi = ::FullTransactionPoolApi; type ImportQueue = Factory::FullImportQueue; type RuntimeApi = Factory::RuntimeApi; - type RPC = Factory::FullService; - type TransactionPool = Factory::FullService; + type RuntimeServices = Factory::FullService; fn build_client( config: &FactoryFullConfiguration, @@ -462,6 +487,7 @@ pub struct LightComponents { } impl LightComponents { + /// Create new `LightComponents` pub fn new( config: FactoryFullConfiguration, task_executor: TaskExecutor @@ -490,8 +516,7 @@ impl Components for LightComponents { type TransactionPoolApi = ::LightTransactionPoolApi; type ImportQueue = ::LightImportQueue; type RuntimeApi = Factory::RuntimeApi; - type RPC = Factory::LightService; - type TransactionPool = Factory::LightService; + type RuntimeServices = Factory::LightService; fn build_client( config: &FactoryFullConfiguration, @@ -564,7 +589,7 @@ mod tests { // fire notification - this should clean up the queue assert_eq!(pool.status().ready, 1); - on_block_imported( + maintain_transaction_pool( &id, &client, &pool, diff --git a/core/service/src/config.rs b/core/service/src/config.rs index 7bafa4c83e338..b7a3b8ba141a5 100644 --- a/core/service/src/config.rs +++ b/core/service/src/config.rs @@ -68,6 +68,8 @@ pub struct Configuration { pub telemetry_endpoints: Option, /// The default number of 64KB pages to allocate for Wasm execution pub default_heap_pages: Option, + /// Should offchain workers be executed. + pub offchain_worker: bool, /// Enable authoring even when offline. pub force_authoring: bool, /// Disable GRANDPA when running in validator mode @@ -97,6 +99,7 @@ impl Configuration { client: Arc>, network: Option>>, transaction_pool: Arc>, + inherents_pool: Arc>>, keystore: Keystore, exit: ::exit_future::Exit, signal: Option, @@ -77,6 +80,7 @@ pub struct Service { pub config: FactoryFullConfiguration, _rpc: Box<::std::any::Any + Send + Sync>, _telemetry: Option>, + _offchain_workers: Option, ComponentBlock>>>, } /// Creates bare client without any networking. @@ -96,9 +100,7 @@ impl Service { pub fn new( mut config: FactoryFullConfiguration, task_executor: TaskExecutor, - ) - -> Result - { + ) -> Result { let (signal, exit) = ::exit_future::signal(); // Create client @@ -169,24 +171,48 @@ impl Service { )?; on_demand.map(|on_demand| on_demand.set_network_sender(network_chan)); + let inherents_pool = Arc::new(InherentsPool::default()); + let offchain_workers = if config.offchain_worker { + Some(Arc::new(offchain::OffchainWorkers::new( + client.clone(), + inherents_pool.clone(), + task_executor.clone(), + ))) + } else { + None + }; + { // block notifications let network = Arc::downgrade(&network); let txpool = Arc::downgrade(&transaction_pool); let wclient = Arc::downgrade(&client); + let offchain = offchain_workers.as_ref().map(Arc::downgrade); let events = client.import_notification_stream() .for_each(move |notification| { + let number = *notification.header.number(); + if let Some(network) = network.upgrade() { network.on_block_imported(notification.hash, notification.header); } + if let (Some(txpool), Some(client)) = (txpool.upgrade(), wclient.upgrade()) { - Components::TransactionPool::on_block_imported( + Components::RuntimeServices::maintain_transaction_pool( &BlockId::hash(notification.hash), &*client, &*txpool, ).map_err(|e| warn!("Pool error processing new block: {:?}", e))?; } + + if let (Some(txpool), Some(offchain)) = (txpool.upgrade(), offchain.as_ref().and_then(|o| o.upgrade())) { + Components::RuntimeServices::offchain_workers( + &number, + &offchain, + &txpool, + ).map_err(|e| warn!("Offchain workers error processing new block: {:?}", e))?; + } + Ok(()) }) .select(exit.clone()) @@ -264,7 +290,7 @@ impl Service { impl_version: config.impl_version.into(), properties: config.chain_spec.properties(), }; - let rpc = Components::RPC::start_rpc( + let rpc = Components::RuntimeServices::start_rpc( client.clone(), network.clone(), has_bootnodes, system_info, config.rpc_http, config.rpc_ws, task_executor.clone(), transaction_pool.clone(), )?; @@ -299,12 +325,14 @@ impl Service { client, network: Some(network), transaction_pool, + inherents_pool, signal: Some(signal), keystore, config, exit, _rpc: Box::new(rpc), _telemetry: telemetry, + _offchain_workers: offchain_workers, }) } @@ -321,6 +349,7 @@ impl Service { } } + /// return a shared instance of Telemtry (if enabled) pub fn telemetry(&self) -> Option> { self._telemetry.as_ref().map(|t| t.clone()) } @@ -337,11 +366,16 @@ impl Service where Components: components::Components { self.network.as_ref().expect("self.network always Some").clone() } - /// Get shared extrinsic pool instance. + /// Get shared transaction pool instance. pub fn transaction_pool(&self) -> Arc> { self.transaction_pool.clone() } + /// Get shared inherents pool instance. + pub fn inherents_pool(&self) -> Arc>> { + self.inherents_pool.clone() + } + /// Get shared keystore. pub fn keystore(&self) -> &Keystore { &self.keystore diff --git a/core/service/test/src/lib.rs b/core/service/test/src/lib.rs index 03047a3a9f05d..1735382bb23ca 100644 --- a/core/service/test/src/lib.rs +++ b/core/service/test/src/lib.rs @@ -120,6 +120,7 @@ fn node_config ( rpc_ws: None, telemetry_endpoints: None, default_heap_pages: None, + offchain_worker: false, force_authoring: false, disable_grandpa: false, } diff --git a/core/sr-api-macros/src/impl_runtime_apis.rs b/core/sr-api-macros/src/impl_runtime_apis.rs index 5cfb5fcc9321f..8bdf977303bcd 100644 --- a/core/sr-api-macros/src/impl_runtime_apis.rs +++ b/core/sr-api-macros/src/impl_runtime_apis.rs @@ -469,7 +469,7 @@ impl<'a> Fold for ApiRuntimeImplToApiRuntimeApiImpl<'a> { }; let context_arg: syn::FnArg = parse_quote!( context: #crate_::runtime_api::ExecutionContext ); - + // Rewrite the input parameters. input.sig.decl.inputs = parse_quote! { &self, at: &#block_id, #context_arg, params: Option<( #( #param_types ),* )>, params_encoded: Vec @@ -615,7 +615,7 @@ fn generate_runtime_api_versions(impls: &[ItemImpl]) -> Result { pub fn impl_runtime_apis_impl(input: proc_macro::TokenStream) -> proc_macro::TokenStream { // 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)); diff --git a/core/sr-io/with_std.rs b/core/sr-io/with_std.rs index 8f9a67c167bf9..1f4ce56fc9b0e 100644 --- a/core/sr-io/with_std.rs +++ b/core/sr-io/with_std.rs @@ -218,6 +218,14 @@ pub fn secp256k1_ecdsa_recover(sig: &[u8; 65], msg: &[u8; 32]) -> Result<[u8; 64 Ok(res) } +/// Submit extrinsic. +pub fn submit_extrinsic(data: &T) { + ext::with(|ext| ext + .submit_extrinsic(codec::Encode::encode(data)) + .expect("submit_extrinsic can be called only in offchain worker context") + ).expect("submit_extrinsic cannot be called outside of an Externalities-provided environment.") +} + /// Execute the given closure with global function available whose functionality routes into the /// externalities `ext`. Forwards the value that the closure returns. // NOTE: need a concrete hasher here due to limitations of the `environmental!` macro, otherwise a type param would have been fine I think. diff --git a/core/sr-io/without_std.rs b/core/sr-io/without_std.rs index e3cf8318a6891..a4d62df30b16c 100644 --- a/core/sr-io/without_std.rs +++ b/core/sr-io/without_std.rs @@ -283,6 +283,13 @@ extern_functions! { fn ext_sr25519_verify(msg_data: *const u8, msg_len: u32, sig_data: *const u8, pubkey_data: *const u8) -> u32; /// Note: ext_secp256k1_ecdsa_recover returns 0 if the signature is correct, nonzero otherwise. fn ext_secp256k1_ecdsa_recover(msg_data: *const u8, sig_data: *const u8, pubkey_data: *mut u8) -> u32; + + //================================ + // Offchain-worker Context + //================================ + + /// Submit extrinsic. + fn ext_submit_extrinsic(data: *const u8, len: u32); } /// Ensures we use the right crypto when calling into native @@ -594,6 +601,18 @@ pub fn secp256k1_ecdsa_recover(sig: &[u8; 65], msg: &[u8; 32]) -> Result<[u8; 64 } } +/// Submit extrinsic from the runtime. +/// +/// Depending on the kind of extrinsic it will either be: +/// 1. scheduled to be included in the next produced block (inherent) +/// 2. added to the pool and propagated (transaction) +pub fn submit_extrinsic(data: &T) { + let encoded_data = codec::Encode::encode(data); + unsafe { + ext_submit_extrinsic.get()(encoded_data.as_ptr(), encoded_data.len() as u32) + } +} + /// Trait for things which can be printed. pub trait Printable { fn print(self); diff --git a/core/sr-primitives/src/lib.rs b/core/sr-primitives/src/lib.rs index efaf4146fc60d..2a53c7ba4cec9 100644 --- a/core/sr-primitives/src/lib.rs +++ b/core/sr-primitives/src/lib.rs @@ -393,21 +393,6 @@ impl From for AnySignature { } } -/// Context for executing a call into the runtime. -#[derive(Copy, Clone, Eq, PartialEq, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug, Serialize))] -#[repr(u8)] -pub enum ExecutionContext { - /// Context for general importing (including own blocks). - Importing, - /// Context used when syncing the blockchain. - Syncing, - /// Context used for block construction. - BlockConstruction, - /// Context used for other calls. - Other, -} - #[derive(Eq, PartialEq, Clone, Copy, Decode)] #[cfg_attr(feature = "std", derive(Debug, Serialize))] #[repr(u8)] diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs index e5a58850e747c..ef3f133df6b85 100644 --- a/core/sr-primitives/src/traits.rs +++ b/core/sr-primitives/src/traits.rs @@ -270,6 +270,24 @@ pub trait OnInitialise { impl OnInitialise for () {} +/// Off-chain computation trait. +/// +/// Implementing this trait on a module allows you to perform a long-running tasks +/// that make validators generate extrinsics (either transactions or inherents) +/// with results of those long-running computations. +/// +/// NOTE: This function runs off-chain, so it can access the block state, +/// but cannot preform any alterations. +pub trait OffchainWorker { + /// This function is being called on every block. + /// + /// Implement this and use special `extern`s to generate transactions or inherents. + /// Any state alterations are lost and are not persisted. + fn generate_extrinsics(_n: BlockNumber) {} +} + +impl OffchainWorker for () {} + macro_rules! tuple_impl { ($one:ident,) => { impl> OnFinalise for ($one,) { @@ -282,6 +300,11 @@ macro_rules! tuple_impl { $one::on_initialise(n); } } + impl> OffchainWorker for ($one,) { + fn generate_extrinsics(n: Number) { + $one::generate_extrinsics(n); + } + } }; ($first:ident, $($rest:ident,)+) => { impl< @@ -304,6 +327,16 @@ macro_rules! tuple_impl { $($rest::on_initialise(n);)+ } } + impl< + Number: Copy, + $first: OffchainWorker, + $($rest: OffchainWorker),+ + > OffchainWorker for ($first, $($rest),+) { + fn generate_extrinsics(n: Number) { + $first::generate_extrinsics(n); + $($rest::generate_extrinsics(n);)+ + } + } tuple_impl!($($rest,)+); } } diff --git a/core/state-machine/src/basic.rs b/core/state-machine/src/basic.rs index ead191a3c05ad..7b2a95464e653 100644 --- a/core/state-machine/src/basic.rs +++ b/core/state-machine/src/basic.rs @@ -24,6 +24,7 @@ use trie::trie_root; use primitives::storage::well_known_keys::{CHANGES_TRIE_CONFIG, CODE, HEAP_PAGES}; use parity_codec::Encode; use super::{Externalities, OverlayedChanges}; +use log::warn; /// Simple HashMap-based Externalities impl. pub struct BasicExternalities { @@ -151,6 +152,11 @@ impl Externalities for BasicExternalities where H::Out: Ord + Heap fn storage_changes_root(&mut self, _parent: H::Out, _parent_num: u64) -> Option { None } + + fn submit_extrinsic(&mut self, _extrinsic: Vec) -> Result<(), ()> { + warn!("Call to submit_extrinsic without offchain externalities set."); + Err(()) + } } #[cfg(test)] diff --git a/core/state-machine/src/ext.rs b/core/state-machine/src/ext.rs index abfde7ee7b9e0..33074c70590b1 100644 --- a/core/state-machine/src/ext.rs +++ b/core/state-machine/src/ext.rs @@ -20,7 +20,7 @@ use std::{error, fmt, cmp::Ord}; use log::warn; use crate::backend::{Backend, Consolidate}; use crate::changes_trie::{AnchorBlockId, Storage as ChangesTrieStorage, compute_changes_trie_root}; -use crate::{Externalities, OverlayedChanges}; +use crate::{Externalities, OverlayedChanges, OffchainExt}; use hash_db::Hasher; use primitives::storage::well_known_keys::is_child_storage_key; use trie::{MemoryDB, TrieDBMut, TrieMut, default_child_trie_root, is_child_trie_key_valid}; @@ -58,12 +58,11 @@ impl error::Error for Error { } /// Wraps a read-only backend, call executor, and current overlayed changes. -pub struct Ext<'a, H, B, T> +pub struct Ext<'a, H, B, T, O> where H: Hasher, B: 'a + Backend, - T: 'a + ChangesTrieStorage, { /// The overlayed changes to write to. overlay: &'a mut OverlayedChanges, @@ -81,23 +80,34 @@ where /// `storage_changes_root` is called matters + we need to remember additional /// data at this moment (block number). changes_trie_transaction: Option<(u64, MemoryDB, H::Out)>, + /// Additional externalities for offchain workers. + /// + /// If None, some methods from the trait might not supported. + offchain_externalities: Option<&'a mut O>, } -impl<'a, H, B, T> Ext<'a, H, B, T> +impl<'a, H, B, T, O> Ext<'a, H, B, T, O> where H: Hasher, B: 'a + Backend, T: 'a + ChangesTrieStorage, + O: 'a + OffchainExt, H::Out: Ord + HeapSizeOf, { /// Create a new `Ext` from overlayed changes and read-only backend - pub fn new(overlay: &'a mut OverlayedChanges, backend: &'a B, changes_trie_storage: Option<&'a T>) -> Self { + pub fn new( + overlay: &'a mut OverlayedChanges, + backend: &'a B, + changes_trie_storage: Option<&'a T>, + offchain_externalities: Option<&'a mut O>, + ) -> Self { Ext { overlay, backend, storage_transaction: None, changes_trie_storage, changes_trie_transaction: None, + offchain_externalities, } } @@ -152,12 +162,13 @@ where } #[cfg(test)] -impl<'a, H, B, T> Ext<'a, H, B, T> +impl<'a, H, B, T, O> Ext<'a, H, B, T, O> where H: Hasher, B: 'a + Backend, T: 'a + ChangesTrieStorage, + O: 'a + OffchainExt, { pub fn storage_pairs(&self) -> Vec<(Vec, Vec)> { use std::collections::HashMap; @@ -173,11 +184,12 @@ where } } -impl<'a, B: 'a, T: 'a, H> Externalities for Ext<'a, H, B, T> +impl<'a, B, T, H, O> Externalities for Ext<'a, H, B, T, O> where H: Hasher, B: 'a + Backend, T: 'a + ChangesTrieStorage, + O: 'a + OffchainExt, H::Out: Ord + HeapSizeOf, { fn storage(&self, key: &[u8]) -> Option> { @@ -329,6 +341,17 @@ where self.changes_trie_transaction = root_and_tx; root } + + fn submit_extrinsic(&mut self, extrinsic: Vec) -> Result<(), ()> { + let _guard = panic_handler::AbortGuard::new(true); + if let Some(ext) = self.offchain_externalities.as_mut() { + ext.submit_extrinsic(extrinsic); + Ok(()) + } else { + warn!("Call to submit_extrinsic without offchain externalities set."); + Err(()) + } + } } #[cfg(test)] @@ -345,7 +368,7 @@ mod tests { type TestBackend = InMemory; type TestChangesTrieStorage = InMemoryChangesTrieStorage; - type TestExt<'a> = Ext<'a, Blake2Hasher, TestBackend, TestChangesTrieStorage>; + type TestExt<'a> = Ext<'a, Blake2Hasher, TestBackend, TestChangesTrieStorage, crate::NeverOffchainExt>; fn prepare_overlay_with_changes() -> OverlayedChanges { OverlayedChanges { @@ -371,7 +394,7 @@ mod tests { fn storage_changes_root_is_none_when_storage_is_not_provided() { let mut overlay = prepare_overlay_with_changes(); let backend = TestBackend::default(); - let mut ext = TestExt::new(&mut overlay, &backend, None); + let mut ext = TestExt::new(&mut overlay, &backend, None, None); assert_eq!(ext.storage_changes_root(Default::default(), 100), None); } @@ -381,7 +404,7 @@ mod tests { overlay.changes_trie_config = None; let storage = TestChangesTrieStorage::new(); let backend = TestBackend::default(); - let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage)); + let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None); assert_eq!(ext.storage_changes_root(Default::default(), 100), None); } @@ -390,7 +413,7 @@ mod tests { let mut overlay = prepare_overlay_with_changes(); let storage = TestChangesTrieStorage::new(); let backend = TestBackend::default(); - let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage)); + let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None); assert_eq!(ext.storage_changes_root(Default::default(), 99), Some(hex!("5b829920b9c8d554a19ee2a1ba593c4f2ee6fc32822d083e04236d693e8358d5").into())); } @@ -401,7 +424,7 @@ mod tests { overlay.prospective.top.get_mut(&vec![1]).unwrap().value = None; let storage = TestChangesTrieStorage::new(); let backend = TestBackend::default(); - let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage)); + let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None); assert_eq!(ext.storage_changes_root(Default::default(), 99), Some(hex!("bcf494e41e29a15c9ae5caa053fe3cb8b446ee3e02a254efbdec7a19235b76e4").into())); } diff --git a/core/state-machine/src/lib.rs b/core/state-machine/src/lib.rs index 135c1dfc6be66..0500aa72cfcc3 100644 --- a/core/state-machine/src/lib.rs +++ b/core/state-machine/src/lib.rs @@ -23,7 +23,7 @@ use log::warn; use hash_db::Hasher; use heapsize::HeapSizeOf; use parity_codec::{Decode, Encode}; -use primitives::{storage::well_known_keys, NativeOrEncoded, NeverNativeValue}; +use primitives::{storage::well_known_keys, NativeOrEncoded, NeverNativeValue, OffchainExt}; pub mod backend; mod changes_trie; @@ -153,6 +153,25 @@ pub trait Externalities { /// Get the change trie root of the current storage overlay at a block with given parent. fn storage_changes_root(&mut self, parent: H::Out, parent_num: u64) -> Option where H::Out: Ord; + + /// Submit extrinsic. + /// + /// Returns an error in case the API is not available. + fn submit_extrinsic(&mut self, extrinsic: Vec) -> Result<(), ()>; +} + +/// An implementation of offchain extensions that should never be triggered. +pub enum NeverOffchainExt {} + +impl NeverOffchainExt { + /// Create new offchain extensions. + pub fn new<'a>() -> Option<&'a mut Self> { + None + } +} + +impl OffchainExt for NeverOffchainExt { + fn submit_extrinsic(&mut self, _extrinsic: Vec) { unreachable!() } } /// Code execution engine. @@ -252,17 +271,19 @@ pub fn always_wasm() -> ExecutionManager> { } /// Creates new substrate state machine. -pub fn new<'a, H, B, T, Exec>( +pub fn new<'a, H, B, T, O, Exec>( backend: &'a B, changes_trie_storage: Option<&'a T>, + offchain_ext: Option<&'a mut O>, overlay: &'a mut OverlayedChanges, exec: &'a Exec, method: &'a str, call_data: &'a [u8], -) -> StateMachine<'a, H, B, T, Exec> { +) -> StateMachine<'a, H, B, T, O, Exec> { StateMachine { backend, changes_trie_storage, + offchain_ext, overlay, exec, method, @@ -272,9 +293,10 @@ pub fn new<'a, H, B, T, Exec>( } /// The substrate state machine. -pub struct StateMachine<'a, H, B, T, Exec> { +pub struct StateMachine<'a, H, B, T, O, Exec> { backend: &'a B, changes_trie_storage: Option<&'a T>, + offchain_ext: Option<&'a mut O>, overlay: &'a mut OverlayedChanges, exec: &'a Exec, method: &'a str, @@ -282,11 +304,12 @@ pub struct StateMachine<'a, H, B, T, Exec> { _hasher: PhantomData, } -impl<'a, H, B, T, Exec> StateMachine<'a, H, B, T, Exec> where +impl<'a, H, B, T, O, Exec> StateMachine<'a, H, B, T, O, Exec> where H: Hasher, Exec: CodeExecutor, B: Backend, T: ChangesTrieStorage, + O: OffchainExt, H::Out: Ord + HeapSizeOf, { /// Execute a call using the given state backend, overlayed changes, and call executor. @@ -324,7 +347,13 @@ impl<'a, H, B, T, Exec> StateMachine<'a, H, B, T, Exec> where R: Decode + Encode + PartialEq, NC: FnOnce() -> result::Result + UnwindSafe, { - let mut externalities = ext::Ext::new(self.overlay, self.backend, self.changes_trie_storage); + let offchain = self.offchain_ext.as_mut(); + let mut externalities = ext::Ext::new( + self.overlay, + self.backend, + self.changes_trie_storage, + offchain.map(|x| &mut **x), + ); let (result, was_native) = self.exec.call( &mut externalities, self.method, @@ -505,6 +534,7 @@ where let mut sm = StateMachine { backend: &proving_backend, changes_trie_storage: None as Option<&changes_trie::InMemoryStorage>, + offchain_ext: NeverOffchainExt::new(), overlay, exec, method, @@ -554,6 +584,7 @@ where let mut sm = StateMachine { backend: trie_backend, changes_trie_storage: None as Option<&changes_trie::InMemoryStorage>, + offchain_ext: NeverOffchainExt::new(), overlay, exec, method, @@ -730,6 +761,7 @@ mod tests { assert_eq!(new( &trie_backend::tests::test_trie(), Some(&InMemoryChangesTrieStorage::new()), + NeverOffchainExt::new(), &mut Default::default(), &DummyCodeExecutor { change_changes_trie_config: false, @@ -750,6 +782,7 @@ mod tests { assert_eq!(new( &trie_backend::tests::test_trie(), Some(&InMemoryChangesTrieStorage::new()), + NeverOffchainExt::new(), &mut Default::default(), &DummyCodeExecutor { change_changes_trie_config: false, @@ -770,6 +803,7 @@ mod tests { assert!(new( &trie_backend::tests::test_trie(), Some(&InMemoryChangesTrieStorage::new()), + NeverOffchainExt::new(), &mut Default::default(), &DummyCodeExecutor { change_changes_trie_config: false, @@ -838,7 +872,7 @@ mod tests { { let changes_trie_storage = InMemoryChangesTrieStorage::new(); - let mut ext = Ext::new(&mut overlay, &backend, Some(&changes_trie_storage)); + let mut ext = Ext::new(&mut overlay, &backend, Some(&changes_trie_storage), NeverOffchainExt::new()); ext.clear_prefix(b"ab"); } overlay.commit_prospective(); @@ -862,7 +896,7 @@ mod tests { let backend = InMemory::::default().try_into_trie_backend().unwrap(); let changes_trie_storage = InMemoryChangesTrieStorage::new(); let mut overlay = OverlayedChanges::default(); - let mut ext = Ext::new(&mut overlay, &backend, Some(&changes_trie_storage)); + let mut ext = Ext::new(&mut overlay, &backend, Some(&changes_trie_storage), NeverOffchainExt::new()); assert!(ext.set_child_storage(b":child_storage:testchild".to_vec(), b"abc".to_vec(), b"def".to_vec())); assert_eq!(ext.child_storage(b":child_storage:testchild", b"abc"), Some(b"def".to_vec())); @@ -889,6 +923,7 @@ mod tests { assert!(new( &trie_backend::tests::test_trie(), Some(&InMemoryChangesTrieStorage::new()), + NeverOffchainExt::new(), &mut Default::default(), &DummyCodeExecutor { change_changes_trie_config: true, @@ -908,6 +943,7 @@ mod tests { assert!(new( &trie_backend::tests::test_trie(), Some(&InMemoryChangesTrieStorage::new()), + NeverOffchainExt::new(), &mut Default::default(), &DummyCodeExecutor { change_changes_trie_config: true, diff --git a/core/state-machine/src/overlayed_changes.rs b/core/state-machine/src/overlayed_changes.rs index 865ee86105aea..56e69323e878c 100644 --- a/core/state-machine/src/overlayed_changes.rs +++ b/core/state-machine/src/overlayed_changes.rs @@ -375,7 +375,12 @@ mod tests { }; let changes_trie_storage = InMemoryChangesTrieStorage::new(); - let mut ext = Ext::new(&mut overlay, &backend, Some(&changes_trie_storage)); + let mut ext = Ext::new( + &mut overlay, + &backend, + Some(&changes_trie_storage), + crate::NeverOffchainExt::new(), + ); const ROOT: [u8; 32] = hex!("0b41e488cccbd67d1f1089592c2c235f5c5399b053f7fe9152dd4b5f279914cd"); assert_eq!(ext.storage_root(), H256::from(ROOT)); } diff --git a/core/state-machine/src/testing.rs b/core/state-machine/src/testing.rs index a9ed13eb8e577..d03cc8e76dccc 100644 --- a/core/state-machine/src/testing.rs +++ b/core/state-machine/src/testing.rs @@ -168,6 +168,10 @@ impl Externalities for TestExternalities where H::Out: Ord + He &AnchorBlockId { hash: parent, number: parent_num }, ).map(|(root, _)| root.clone()) } + + fn submit_extrinsic(&mut self, _extrinsic: Vec) -> Result<(), ()> { + unimplemented!() + } } #[cfg(test)] diff --git a/core/test-client/src/lib.rs b/core/test-client/src/lib.rs index 6eb6db4d4bcea..4a99df65a5467 100644 --- a/core/test-client/src/lib.rs +++ b/core/test-client/src/lib.rs @@ -128,6 +128,7 @@ pub fn new_with_execution_strategy( syncing: execution_strategy, importing: execution_strategy, block_construction: execution_strategy, + offchain_worker: execution_strategy, other: execution_strategy, }; diff --git a/core/test-runtime/Cargo.toml b/core/test-runtime/Cargo.toml index 812dd4bc28faa..6132cbbb1aeaa 100644 --- a/core/test-runtime/Cargo.toml +++ b/core/test-runtime/Cargo.toml @@ -20,6 +20,7 @@ runtime_io = { package = "sr-io", path = "../sr-io", default-features = false } runtime_primitives = { package = "sr-primitives", path = "../sr-primitives", default-features = false } runtime_version = { package = "sr-version", path = "../sr-version", default-features = false } runtime_support = { package = "srml-support", path = "../../srml/support", default-features = false } +offchain-primitives = { package = "substrate-offchain-primitives", path = "../offchain/primitives", default-features = false} executive = { package = "srml-executive", path = "../../srml/executive", default-features = false } cfg-if = "0.1.6" @@ -45,5 +46,6 @@ std = [ "runtime_primitives/std", "runtime_version/std", "consensus_aura/std", + "offchain-primitives/std", "executive/std", ] diff --git a/core/test-runtime/src/lib.rs b/core/test-runtime/src/lib.rs index 36950bfb1b517..74ec56240c8c0 100644 --- a/core/test-runtime/src/lib.rs +++ b/core/test-runtime/src/lib.rs @@ -94,6 +94,7 @@ impl Transfer { pub enum Extrinsic { AuthoritiesChange(Vec), Transfer(Transfer, AccountSignature), + IncludeData(Vec), } #[cfg(feature = "std")] @@ -117,6 +118,7 @@ impl BlindCheckable for Extrinsic { Err(runtime_primitives::BAD_SIGNATURE) } }, + Extrinsic::IncludeData(data) => Ok(Extrinsic::IncludeData(data)), } } } @@ -377,6 +379,13 @@ cfg_if! { impl consensus_aura::AuraApi for Runtime { fn slot_duration() -> u64 { 1 } } + + impl offchain_primitives::OffchainWorkerApi for Runtime { + fn offchain_worker(block: u64) { + let ex = Extrinsic::IncludeData(block.encode()); + runtime_io::submit_extrinsic(&ex) + } + } } } else { impl_runtime_apis! { @@ -480,6 +489,13 @@ cfg_if! { impl consensus_aura::AuraApi for Runtime { fn slot_duration() -> u64 { 1 } } + + impl offchain_primitives::OffchainWorkerApi for Runtime { + fn offchain_worker(block: u64) { + let ex = Extrinsic::IncludeData(block.encode()); + runtime_io::submit_extrinsic(&ex) + } + } } } } \ No newline at end of file diff --git a/core/test-runtime/src/system.rs b/core/test-runtime/src/system.rs index d48fd153da9eb..ffc01182d47fd 100644 --- a/core/test-runtime/src/system.rs +++ b/core/test-runtime/src/system.rs @@ -242,6 +242,7 @@ fn execute_transaction_backend(utx: &Extrinsic) -> ApplyResult { match utx { Extrinsic::Transfer(ref transfer, _) => execute_transfer_backend(transfer), Extrinsic::AuthoritiesChange(ref new_auth) => execute_new_authorities_backend(new_auth), + Extrinsic::IncludeData(_) => Ok(ApplyOutcome::Success), } } diff --git a/core/test-runtime/wasm/Cargo.lock b/core/test-runtime/wasm/Cargo.lock index 028bd07427f98..d8eda0e88eba0 100644 --- a/core/test-runtime/wasm/Cargo.lock +++ b/core/test-runtime/wasm/Cargo.lock @@ -2346,6 +2346,14 @@ dependencies = [ "substrate-primitives 0.1.0", ] +[[package]] +name = "substrate-offchain-primitives" +version = "0.1.0" +dependencies = [ + "sr-primitives 0.1.0", + "substrate-client 0.1.0", +] + [[package]] name = "substrate-panic-handler" version = "0.1.0" @@ -2446,6 +2454,7 @@ dependencies = [ "substrate-consensus-aura-primitives 0.1.0", "substrate-inherents 0.1.0", "substrate-keyring 0.1.0", + "substrate-offchain-primitives 0.1.0", "substrate-primitives 0.1.0", ] diff --git a/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index 7b12560812913919885bb94ea0f66ed671d2558c..a7de97ffb9e649e474fabdee7525fa30f3df5715 100644 GIT binary patch delta 20972 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 delta 18406 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

uK`%!`5rYw`fZbEoUZrVqOSoOCRuFX}O$ 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 diff --git a/node-template/runtime/Cargo.toml b/node-template/runtime/Cargo.toml index 8155865730e6e..2ba64a3a9cdb9 100644 --- a/node-template/runtime/Cargo.toml +++ b/node-template/runtime/Cargo.toml @@ -25,6 +25,7 @@ sudo = { package = "srml-sudo", path = "../../srml/sudo", default_features = fal runtime-primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default_features = false } client = { package = "substrate-client", path = "../../core/client", default_features = false } consensus-aura = { package = "substrate-consensus-aura-primitives", path = "../../core/consensus/aura/primitives", default_features = false } +offchain-primitives = { package = "substrate-offchain-primitives", path = "../../core/offchain/primitives", default-features = false } [features] default = ["std"] @@ -48,4 +49,5 @@ std = [ "serde", "safe-mix/std", "consensus-aura/std", + "offchain-primitives/std", ] diff --git a/node-template/runtime/src/lib.rs b/node-template/runtime/src/lib.rs index 888a9b0dc4c83..fd82b399d3759 100644 --- a/node-template/runtime/src/lib.rs +++ b/node-template/runtime/src/lib.rs @@ -14,7 +14,7 @@ use primitives::bytes; use primitives::{ed25519, OpaqueMetadata}; use runtime_primitives::{ ApplyResult, transaction_validity::TransactionValidity, generic, create_runtime_str, - traits::{self, BlakeTwo256, Block as BlockT, StaticLookup, Verify} + traits::{self, NumberFor, BlakeTwo256, Block as BlockT, StaticLookup, Verify} }; use client::{ block_builder::api::{CheckInherentsResult, InherentData, self as block_builder_api}, @@ -182,7 +182,7 @@ impl sudo::Trait for Runtime { } /// Used for the module template in `./template.rs` -impl template::Trait for Runtime { +impl template::Trait for Runtime { type Event = Event; } @@ -280,4 +280,10 @@ impl_runtime_apis! { Aura::slot_duration() } } + + impl offchain_primitives::OffchainWorkerApi for Runtime { + fn offchain_worker(n: NumberFor) { + Executive::offchain_worker(n) + } + } } diff --git a/node-template/runtime/wasm/Cargo.lock b/node-template/runtime/wasm/Cargo.lock index dc4429be3d01c..34fc8036ed992 100644 --- a/node-template/runtime/wasm/Cargo.lock +++ b/node-template/runtime/wasm/Cargo.lock @@ -1273,6 +1273,7 @@ dependencies = [ "srml-timestamp 0.1.0", "substrate-client 0.1.0", "substrate-consensus-aura-primitives 0.1.0", + "substrate-offchain-primitives 0.1.0", "substrate-primitives 0.1.0", ] @@ -2510,6 +2511,14 @@ dependencies = [ "substrate-primitives 0.1.0", ] +[[package]] +name = "substrate-offchain-primitives" +version = "0.1.0" +dependencies = [ + "sr-primitives 0.1.0", + "substrate-client 0.1.0", +] + [[package]] name = "substrate-panic-handler" version = "0.1.0" diff --git a/node-template/src/service.rs b/node-template/src/service.rs index 5f1a375181675..2ff5041f76e76 100644 --- a/node-template/src/service.rs +++ b/node-template/src/service.rs @@ -62,6 +62,7 @@ construct_service_factory! { let proposer = Arc::new(ProposerFactory { client: service.client(), transaction_pool: service.transaction_pool(), + inherents_pool: service.inherents_pool(), }); let client = service.client(); executor.spawn(start_aura( diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 37de34e4020c3..c4dd70fc51728 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -85,6 +85,7 @@ construct_service_factory! { let proposer = Arc::new(substrate_basic_authorship::ProposerFactory { client: service.client(), transaction_pool: service.transaction_pool(), + inherents_pool: service.inherents_pool(), }); let client = service.client(); diff --git a/node/runtime/Cargo.toml b/node/runtime/Cargo.toml index f72a525846e59..6c0307d47e1f7 100644 --- a/node/runtime/Cargo.toml +++ b/node/runtime/Cargo.toml @@ -12,6 +12,7 @@ substrate-primitives = { path = "../../core/primitives", default-features = fals client = { package = "substrate-client", path = "../../core/client", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +offchain-primitives = { package = "substrate-offchain-primitives", path = "../../core/offchain/primitives", default-features = false } version = { package = "sr-version", path = "../../core/sr-version", default-features = false } support = { package = "srml-support", path = "../../srml/support", default-features = false } aura = { package = "srml-aura", path = "../../srml/aura", default-features = false } diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 9f2d8772922f2..0ca1aff7cb054 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -58,8 +58,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("node"), impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, - spec_version: 42, - impl_version: 42, + spec_version: 43, + impl_version: 43, apis: RUNTIME_API_VERSIONS, }; @@ -288,6 +288,12 @@ impl_runtime_apis! { } } + impl offchain_primitives::OffchainWorkerApi for Runtime { + fn offchain_worker(number: NumberFor) { + Executive::offchain_worker(number) + } + } + impl fg_primitives::GrandpaApi for Runtime { fn grandpa_pending_change(digest: &DigestFor) -> Option>> diff --git a/node/runtime/wasm/Cargo.lock b/node/runtime/wasm/Cargo.lock index 356ee5f62ebfe..4bc3dcf6da941 100644 --- a/node/runtime/wasm/Cargo.lock +++ b/node/runtime/wasm/Cargo.lock @@ -1297,6 +1297,7 @@ dependencies = [ "substrate-client 0.1.0", "substrate-consensus-aura-primitives 0.1.0", "substrate-keyring 0.1.0", + "substrate-offchain-primitives 0.1.0", "substrate-primitives 0.1.0", ] @@ -2666,6 +2667,14 @@ dependencies = [ "substrate-primitives 0.1.0", ] +[[package]] +name = "substrate-offchain-primitives" +version = "0.1.0" +dependencies = [ + "sr-primitives 0.1.0", + "substrate-client 0.1.0", +] + [[package]] name = "substrate-panic-handler" version = "0.1.0" diff --git a/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm b/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm index 30e0da2028b8e4ee23700d5c5eedede037a18962..7dfb5fb461e0ecc92cb89da180454d38c471d291 100644 GIT binary patch delta 210370 zcmeFa2b>f|+CM&3Ju^GIJ+sWRyKIE59)e2_DvN+Z14|GTxlR0We}bj3A=^zTfJe*_mZkd{2G<|MzpQOjlQYQa$z5Q=zZB ztIxfQ`pmfdKzU{|aD*ZSvtqk2~hbNr#_2dHkd!k2@w1wvIXJ)O^NIm~_HPlMg>-^09pa z;rhL;()t_4dG!P2^$Wj{xgvSLwa^kG6vz*^2#R<(Y=!Y(NVEurLJWET<>Mhj;ewE8 zDMVO?!-XOgvcg3IC7I-B3kw-8wqke>iB=)TmXzW*77phJ@ls}L#80RkZ=s5CC{QU{ z=+C3EqGW4UQXUS4OHgwtRDxV(WuZ1@Wo1>$3JEDCtE+JE6Al45fB`kI~j1zGiP?NsQ#_c-o;nQ z_~7xAjye3uQzjoje$ok(PdMh}z?JoGxVU_#EH)`8oP^jT$DMHUF^3;DZv4?>1J~A1 z0QqOl+!|{m12^fat+CcJaI@ZhYb+rHx9Dq4{B8Qdt+8?$n4@3W8tb}KV6JpVAA9W4 z#~*pZNe7LeH1?QD?t~K#AMeK;{x=g9m{-4lPCIdX{b@OE#U1stavX7I{i8Xh$-8Cl zl~M#;VP7J4nrrQQwfseciFkuRo25|ntWY6DlfGjljqB2a*2Fg zE|#n0YWbObRlFvW|CXENdbvTalk3EK@s@Z^u9a)#=kj0TA#tzxLcSs2l&{M#J8!}1aNp!`OzkSpbKxmnJ%v~{JmMb?WKY!M@_v3?Y_-;1;44`PaZ*m}fz)OyTX zY~|hjWzU5R--+DtK(G5P+YYFJ5=zDwS#}P>@%t=0Kj7A1vn1dq;tQ=nz|IS}Pk+5M z5bqMOpRK>|@eR4wKqcK^os(C8{gPgLNtKH~IieyV-N5izj*8UAgbE@s)uvoyhRlqIp8wj+p<4yo& zToG4z=6TO|>d#o(eQ!BXh1?`^D=Q|LCtBwO@rcwpsF{G~0OF8i$${RV3KOy*ei9)T z3%Q~$5mBKLv9Jp1f1hC&Cqu*`huK0Z7YIavK#px>+@KBb!I55$P5D6tUXH}psj%fF#0N>)IV{c%N5*@8bO<<%c@m!#;V<1oys50?^ z;Wbt%XcOui2qy3}O`}LhtF$H%LIh|jI|iz1SdY7Y;mRjUgjVhIN*1nrQp);GPpE|( zo*pAcftoq_i^cuH`-6e0qTT($+o6fPzq!y(bD*h|U66`OJ#Q0MD%i60DzR_5d8ka0$E?MwyOT$FBIg?_2f1-uYTS0gOdxT3LfVkU+4ZPCc4(h*h1;X91*>j z9YTf1x{=YbxjqWeB|C;fWIGf}Gf)6;oIJ25j<{+mRs9*ySH{){>e@lexcN>_^w#?L zT2(&=pw96@ol8(l?`Z<+Jszm{nC#nO_EXvKW%lxgP%lc# zz~c;Dg+P<$=ljin;5UC8X=9oXj)={%>QCCxqkhrLPI99WlHjn|W9-!s@;_Ds9Jiec z_+<^?i`h>gywOM4$X$xwb4l-GJ_MOsfLu3%-fxg@S0Z9(Jg>m>DMr*Iu!Moj5qOV* z%MfVN((OKJ-}PI%IZaw{_7=8O_#R5dQTkf6^cJhRRMfkx%Ub<(kv&+X5IL_#k!M-t zVnlq)z;py&V&EbKrU(QsL|{2%Ex=+h?{|nBOozC-i7;R73G>aU zV>i@s-VW4}ysAkZSEcLlROR`jOmyoNl|*Sl~3{yj>n2PPBC`>mF~r8`##Z5(5}z3}*}?XG3?(YCvl&!cR24wH|x-E;Un!XK=URy(G~lE1Gd^NVWi zq||WvZ(?(p?S9PXp|*PivH6Sb-o)phZTE6M$JlN?pNH7)JU$QJPAi?|Yo$kgt+Y+1 z6h5@l_p*NC>V0z`1#MfR^xO44*Qj!oNR6M58vcCGB4R}Bhx(oy2Ose7Cj9xg#~=2f zSp?xgdr-j1qjIzca?HoDH(+E8Ts6ZUYQ&6UC|XW|k;{trS+`H}GbGi<@S8U%$wCwF zI&Uf}>V`VsvTXMg(qVtwoy$h{v)x#88OUuKV!sD+r5qNwYK{a--p=lr+f~!-IDunCd=9kTtN9#YyEpQ=hwa|X=kB(9F`xZy_aZ*~+3pXlr!Tug*|BL#-(o2J zu21RrNa>L;H=*>)9;ML%(jyPL1}7V^D;Bd8!LGQ~C-8e|0%Kr*zy8Dxqmrl(1jcW! zO9EF-oIJ_Nb-MzZrI@my^srd}9qc9llTMP{aeMz4dr7L3tR^jc+wPU5?XI@_3g36J z-9C8iY`eSQ(aU!G;nCAhy1U}p!*-`Kb9dXliqCGg`vnViwcWG$-o8 zXu5`X2v3#me#K`Se+m*D9c%AV?6;YLj0y}oYs!=<&j)I(0ECEh&yKRR29s8AQsS1@ zA(FFCGmlM)(PqL_X}jO^Sz)_x^I2}t9hD~7MTTHc`viN21WP{91lR%>)liR-o4!G-4S?K zpvG4iHC}!$xL$zL*Fsx9&1x{|TFGa=!DMh6lXDCv%Y00h6O-z@nqYF5hY9rE3#=k) zyD#!-*FXM#_uQp^(Pb=JdPkF@cX&ky{c@`#exfK^eUh!gv1NP*aIAE6gAROQ)pB?u z?22JAIIGew0k{|HAKq9c*4HPWYgfPi{dhKjYF-ln=lKBID2P@<+v8N<|AX?bX)Wuq zV6evm5YLQYhJ2}s#B#%df~nv@4r;sv9Ejm5>*F7lmi$bK9xM?-&gm!-c5>|K1yIES z*M`$0ji3uhQ4SqN65g17KQ7GOM3ke5WsIE%@ zc)(RgSDG6z!v%a=900^*xXvajF$r!ixCjykB&EI^T78jL_NmZ_-Y61 zgBu<6X|6(_9;nFB?0-Fg4_!F*-H`?HGb>_S&n?V1U~l1xcbg6%~4 zk8A1wNT>Np0 zSFg_z$Hw~E%DxM02i4I0KV)U-r&TU8^!GFDgbdj=^w%flA;a!|hE~Y1EvtszwY0^t z`q`j}gi4Y6T~_KIdL~k11N`C+GHlJtFhF;TBEvvGLjoDT&B`!PKgtXkunY=ZTHKPA z!PWc406?1@08ok4%~`2~^!qU}QokM&Rk?$`I-=j09F;ze2E)^V6`04lA_Jd?@gOeI zi>25vHpFkV1l4|>RcMG;Xh~+FrKXS`m^O_mzH`5V?zRW5# z)GM?sv(R#{&@jJHClvZ3tI#m7(DKYeD?He?*&@=W7$rUzTqju^7!k|oB1pdC%H^&x_K^geN|~P*Y(AYWlaSNsWL95*5Yujk%&Y_>u4{a(1YqP&q34)I-8AG2BC9 zMJ5s}JtSsCLEyG1@kv&R5nhRvnI%?vwA$0BRcjRbIIGZ}UZGW)g`V&Vjr0q(N1>0h z3XSv%J&{@HNe{MB`GBnrN_?1AVw6|n$;=W@nG(5s`OTE+!-Z&F>39U&%PW8d;YOi+ z+JkFvzd#4H@M?R&KKx`lb%Gz#86bfRSr=Z|H6<#JoZO zxwZL!-GT7Oj+_5&?YD5@{#Pbj)x8TIGjmmr)}p?If2(#A;~ zE8ZE4{MZ$M2+Wjzvv+QgFjX?pe62~s(QLN=Ja$LW0sem|zD?0hHcytO*?uzDFX7lc z6&p(>e;dv>-%RtdbUS#0hCl}XnbD2-{?4&xD@=xL{?5%|&YIa1T#;-f#UF-q77!i* z(){>+fiQ;+Lz#LeX%tVcX+O8IaSxuKd~cdR>m3TMQNAJGn5+kRy0NK(!*pBpP4YAu zHxOaR6_<=6H6q-&_sX0y6ZthfkAxl``Ztu^pz(HB)X19_%m#Ss7fQMC;z-}S;U8cpF zPg}#ZXm*-CrQw}~=qv26aNHJm%%^bMofK4U}O8>Vj*t%caE*L|8>CIR>I55-y`8uaXsMIX7~T)p;V zQ5AjwXUzdZ=o2wkY-yPIiC8Qmn;%;oaCeUHt|z`FiyHR&Oq?Ud3jM++@hl#*KNmCc z*ifEZruX?mw9VV{gvXwEH~r5q#69x%`*n{m#bbbC-wh}p{7Ot0!fm+hYcV+}U%bB| zXRGKT#Gr;g--!VN5&HCP;zco7kNRG$^BS|ol^Cw?4$Agognl_F4+UPmLb9E`!YW6x8KJtktB(xHae(gGkW7jv_1M&8d=@tQxwA|Z&Rk*7KauDy=Q8>#S?A7p61>_EBAsF} zg4MqA+pJHB%TvUPhIMgyuqbv>1PV=+L6D=$R{1Ix-%F2bDXW0sxR$aOoVmB994tVb zZwlp=V9@j;IrFC&G)VugSXTWqmvU>-?l!9~QJ}k8vZO(_lDi18zpg2f(;D&jdG>vY zJQAckymWh>73v#HqGtMuQEzm#5h9VipIEN)f*S#Q)27bZ-FNcNURt_oIKr zAyxzbky8|!CfsfJ>mgNggk0R9FRhZhQuLRFi}Y(%^0a6prO^csRkBcsSM)?j9*>6C zI&u#@$`Y~%9(yL_Vvyf%D;-hNSPZIa8cc!!4j#l;=)vtkhZXwic5-(ysv)nv>?*}- z-DfAcH(GC)wv*gThzs=UYS}*ab<(io?^L9c9G|0;FBqPn{{PZ`FB}d;mB2lk>C5X%u^NR%YeY>9>eIFC|2P*rHR)HdwTjvzvlmM3IRV&ppzRF6Js=VP9xH6)&B2ii!OIj+X3JEci zSzoEj9g4doR6fwb>O~2P=hw#as7!L|oP1S`O5>C3Q~}BuP_dJx*xe}WRFNAUSI5oA zxWu7aMz94vIVzUNZ~%8y;FL3dc!vRQUx2}EuBIrfP8v+?3`{B}J7rmzlzEuohKeFp ziKQ4~QsrTyfQj-kv7q*xI;V`O9wHHgNI4L}sRJTXUK`7?Rk^CHbIJ`OttThzR2vi` zwL$c3RA6eso=Kw;F;`*y1S+Ti*Fj+CGjLpCAya_+=;b9&+Y3-ETL!zkG08!;IbJKB8x|Bd?&q;RhV5 zuTxPpZz3>3;1+sB#2X`UtA&c{f_}2FAO>p%M~)(tZDdL0>s|ZFoeN?HGsedmt@8Eh z{bbKb3lkAPOW)fMrpdc{O+VS@z!>I*uGk9#pQ{)q+ahic9#~4GtHw&`=)1Wd;I z;3!Br4tEU1n`avB!uZ~@2jW}kk^SYK`s)7j&?HtEgIkX6Bz(80Q4fIPcAhRVPK$N(jl41iFOK^UI~ z%0zh~V!&w#O)4EDJ7N+o_2T}rL?+^T?m*eatwp|NR-KA7pJC+Fcx#z{dl_$q={F#& z^3!iqkrva%xZgs=^j}=r29JNZ*nJb#x4QDL;;%YyknGtV>(DqOn>yN-jvenxY2(shGmqF0oyr13)6%S}h1*Bb5Y$z8a&JODM_J5@hA2$pxQer=FEpdjS4 zhmSSV{r+~n$6(pYf)3IL4F-f;^jU*tf2T>d^^0I_6`-~?V3U9?8q#kKh84O+|1emN zj+jGD&>js34v_~5G<8?4EGxPadVn%tElKO9-tU<#gKZahf+ot0n z?IHcwp>kgl(u;=5c1ev@9S^*pH*Cz!gQ2lwz`6fn)Iq`B$HUOMP(sWDvIb@WgMq6Mbdi|L-c01dTf;-%^XN zpNeM9TH~Y(>x=i49r_aAEz)qt?{X~e(UJBW=z}}KgcGm^DtKw803K+l9VPF_oMo|IKU(h7FlujkIo}%aHds{NZAb!1gWvE0k%$bEytYe% zH}QQM2JDL&OT``l8C&a&o9!x0^Q1ck>by#|i9e<<-XAl;_ZsH!FK@?9g$-j4lm`m2 zN-y}6oG<3GzM8!^A-i-Tn%j5wC|FBm4Medg!Ic$hP7j{lPJ2V%PRqj84z# zx?>T!MPK5*z2d!nd#oIVw4ukr!Lmi4ew-XpdhgUF0jC^mQx&)#rxJ6Z*4U%f#{EjK zJx&fmtyRa%A-Q@A{Cd6Py9c!UNTduGe2vlTj>imdl^%M69H|~)9m4J4Brxa5-z#<+ zZ1#NBdNRi5+SqCCTl$_8!v-!)x~Q@P?v@`Phj0bmDks7FTq@l* z%5iZZR#Z3%cgs0w_KK8_lHv|czSytDi4`3UZUoo2fZdT-MU-`#)bRf}-T zMQ?XC<7?bJr;ody!QDWSzV1g1_H)1DqdzW)+TFd1Rqf$U=VL$; zr+f@{7cg=NyuG#VV+;;;A7H{T_d7m@gXSaLi!MNLPxo2IjKneWQSQwQ?&TIcd%Km+ zXw2UB;gt%7Aj!rb9tWwTr`m2OynW}r>Ep)9Hr6v!mgs5YWCw6%{y149XP>1vj+1+} z-wNhAhZ^n()pcmBox($Pf;Cu+a96w`tjC-v4;NeYgD1-Vs9^Jna{rFZkcZ@XT2BHLXl`leQ<*u-#FOK-%Jy;8Iwn`;Pas`!NB0KH5`m7~J;+_aVfNmqdab;;x}45oa`w_(wWI zUyu6oQzcL3;qmnit51=aNO{BA`qR)_5N(EhH_$z>;o?F40s+^; zw60ZctXQ?e334~kHSoTdrxo+O+wj)u@U68>)qY}Qs}28z!z&k~JLRW4y6v(?aj7ho;(&(o%jBJ`=+i4?dBcXwr7gXeA@aF%^v+j8 zbsnTIxDx)h7xk(uWo_9gG!>-2jn~B)=4B8jtoNQ^chP4|u)FHTGi69mor!xqN9l7k zE(2ZBP;!+VA4H!%e-@P8llr+?@&s|V-t9VB0eBC*P9D0)B7x2TEx!-9Y=Zlko?s}6 zFM^8C;pEobcGozrA_*GUPqDvg*mRxDl@_L0`h|PsVS3DL85aW^#?F@aNV)uBU2s43 zV#B^S%O@>3(JSZ3i-dSW&z&nf$mxsp^K+qD>vhRIxpQ$eHdMh$M}yts<9TCpFL+B9 z>&f$E>lRzCgX+Rx95&I=*jU~3cG*@hohRE$SmwyqIX)=h6aWLv$-|hYxW1FH=5|>l zF4W_1mt6qKtlQz(7Ed?ad53H%F`sAPC;L(M~SZy`R^ z=RGWYw0=it<$PVc-W`(2`I6QzKPCt0mXAQoM|JNN*FPe=i%ay< zN95TYz#fH*d7=LMYar^6OJz&F_EA|Ho_)*X0k=peUz2SZ+d{X0OtuZLU~DWMo2&ov zsLa)8J|-go>ioxc1gN6`K+R$R@Txv;v1|unoW59&N(RBa1-JkK-Vw0y4S0~v(#G?U ze3OuhlF%?ZqBe#dE4Raq?gZUx9RGmA%9+En{^|56lJ&yJ<=$0|+0d_I z9D(t0r!QJe;e}|aCGtuxIyEejXGC5!bw(%a3Cm@N#01=Q>M}~n3bfS8F=bUKR*L)3 zOp-olsoXcbQiJ|ceZ(WOJ-O08Z|;2W+Ff^v?zT*J77sLxSq2fwBlSQkTqdUPT`q@4 zIGzODXC9up0;B&RJz|A?NO^HLKm0h6O8~hV+-Acbq&Vq=3%}h;>9pA!9xr&OHi_E4 zfiJ?y5bY;6@rjIax8dlO@>|jEBl&Bb%=)A!Wofa$AcU&8AoLZhob`ns{iG}lKmQ(A ze||CB!;hF%$zQ5%&1*YU+tWK#TaQ(Du~DEqBSrezT&u#>$L<5EK%>%hH|rix$^D8l zVj`X!7%4NKk|SH)hc4xdE=g|$IDV<#{FK}YJ*Dbt$c(2=JL+{$%K|8}&!3iBU~TS# zXXQ+$InT)<9WokFegj}Du7kp~Z?u{EK^o&aIa^lg+n+Pm-V@KsCtH7b^FVWht*>r2 z+&nO?L|(gDFL++gOX<3kUcmawW<7EDPO7Xb<=oL(LUen!H%aWFq{SG8HNM3^}#(hG+uqC(EFO#EG-?Umz zFOKrmY`itb9L}sgrY+WkUzMlri}c&C;_7c# zFIfYV#xQypUHKZ8c8x0DBZF>L`jgjWZTPuc(f5nJzW>;Z7|XWkAK#Nb^>u48i+)l+ zx>k;Cu?+J#_SWY)J#??urLP;m>>jVfbn~;%dtG*es}@n6JjGt{hP?Ra$C8GJ-jL^r zN|%?3Wsp5HNGUJZ=MIb%=yTt~T~*$|d>}^n@H*(D3-y8PFcxQynzyZ!gXI17`lEGn zU`E28jJs&PyciZ|*#@u728|dE_6Ts8u!j=Kq7r^&$h0xc% zBRgQ?O|=!Kx4)RduflL(JpYa?9*zsqXgI@f1$|4WNG_(eZcA@vpx9VfG#gj1b`!zO zvG`d;@?qNcRZHMBG9IfZkBxynnpkhF}bD}A;RT0cS}ku z&v?qy)9I8otCvCm;M~M^nGC_^E*})9P&pFwMpU8q*&_c{#LjHSM=S@%AB4z26?q!9 z|F=-dqZ?lS7N(^btv}c*dzHWiLl<3ZE&>SL@|`fRqZ@jBM>}z}9=Z)n*rWB5Z7_^S z>%G61wQ4jyPbh-zL72i|acfvC7ZyLtn)uOr;rCeVAKeiDLFNi^w=Vxte$#H1z;rDT zhZBWd1D)kzFGzoxX*R*mAhESiHEM7W%Vw5_#3Xd@b-IlA-bky{9bGxntA2N zRyTRx54u8F2g>eh2@G(`b}ZAruS%@uuc)R4U?pmE5%_oM6zL*YEgBzZ7mUHvQa zRyFj>vjz!l@Mt*2wk{Nnn=ndZ*1yCQ{X)#@E*5B!kH>u7GvB)P*VL}>Z()^ZY?6S) zz23s=&}r+VvY-oYng2Wfos^Vkw#V~y{EOmW4F7EW8^s&wpVwzC4VJ^-bDN&0X1!Qsv_&eXQZOjvnBN9b%mp5Djx(AlA!p2+%k|3s|qxqYAAGJ-(&Y zy0~RJQ(-z&k(a5y2$|kMrk#tCWL(f#G^bFr_L6i#x-3KH^k5l6-Z{eZj4F;RL^~Df z?3E@Ht7vU9i37DLwuDyw@D{gd3CHU1{iLUwUe#VNsd=?f3M{J`t~BrDb7hZ zkw|B3>(y~iE7Va@j5^@D@k!C1Nk#hEVhh^|y^8kLQ;Shihjc|drE^y|=GKRnpti4z zt=9W?M0z_zj!p;}f34FQA>){Lx*$|)QsE-gCMt#e8M{m$v!yQFjP+Fb6*CDtHol(O~b`-nog5S}Tq=I7;O zJPgM$C&+I&uhfF4G+*CSX6@RktsIEK)9lEkAci1s+%~~gbCiIS5^L)r2b)6jb-di# zBNKeI$d=|(KQo4$1OOB*pPM4@`d zV48)U82r)(c76Z?sjw6ZCx-vQ4d%#4G_MWy7NTR?Sufh^AIhP&9NnV=(&p%)71lUx z@~}DQgwBtp(c=V4VD&cwle1D!thQQnAItd|S)6H7Z%9~$I#y}rjJ<%{*4ou2E|m1{ z!w}(&rV9{)QA_;HlbjhoxFNXI#>0E;B&ZYdBA=S>#W!R)32f6__ z04JQ=${EECF~#s;#?d@(^W>vE4aHW-jPso^P$a|fhoPEn9H5>K)Fr-$Ig|!uhzH0( z)l2nogOlr=9|QowebfMCiUH&-!f-Z!&XKBzGc^m4mL4E@s03g&Ia$lfwgPdd5|;k8aYDsmz`di+#)K>$|4u= zL#Pd(df6hlMvwK-v1+pzjjcH$JnIsW*AcM_uW_t|;xC+Px}w>pA&^l>xz{$FX9{9s zw)Ui-P7ud22nrUr&;}(7C}8UXJ#4K#NH;Ut+2Sv~upvVhpx=ZpRUT*|16n8rT2-^4 zrKyti$&#kZ7Pvri_>md>;(Iap%{es@GBnzP%_M{b{Wb?qhk(BYOLZf>U9x&F`ND1s zOtCbk>=C&57U9VW3{dzZ;mpm8?fWR3{T4I;#XW|}C@$Cllh|i@EhG7ctw}ap##wel zuq~qg$Qufi;cU3V;9%I}-4-!cbs3FyY82{1-a$@cs#yvl)(0UaGw^is`!;|90{X4l zy5=*H>}+IW(r^=*Jg)k3MGAIPU5snWv<|=_+uvddfQ0Hsv$3h`&n2*LaAVkG|vnw5qKjh&`6rK(e%W|g4_ zqS@V7aEMsNZ(FV47A(_iuxSbcfXFIDVz6k*u7uWB3HBV6SSd`;>E!jCm83S)acfyh zHgZU!BIgO>^&~j12J7P(H}OL!`*VX+iJ@g$IRt$QK3V$`A!)hbUkNta{Lh0!o^^K>uN16doel z4|}3ulI!%8&Q{f-rXn<&76ck~Z2b}9_$XP9i_^jK#fIgN6S^gohNVI|&N5y;ZIC6z zW~L2d@~&?7^n4FbNj$57XEk_zRSM6m8MuZmU7NC%%)qh$SYBc> zf3Tc;gsO7xh28H_&V((J%Ld{ZViG0!TEkQ9oCXDSx}Mm@DnIt`$}{f%(VT79T2;7} zAo3Z2_Mc?hnbc27Kskk=o+VU;bG9)xQU+!OFbLlB?b&r$=OE+q4C8d0u2yk)97JA? z)4O%GDo=o64676jD9469M3=kx`kqA1Cj!WmRH-u_n~f)^R?bAcPr|>G@ozFvs!E(v z8^bP1)Q!==BJ4ekfoxUdtp_$XA|o%t^323i{a9D4R8;8EZDE^N=+C-Z)sZf+U~}+6 zHr=M1)h}6st=CkbpGj4WzKnMNEfsck<8Yj_Nh&`%@ws#-)Hz=e#xEt>_zF&I=W7mk z-*EKX%t3C88RWh-gWOi>mOI~}CTAPV;L9E*&JP?INAcG90Fd;6$2m`!_Xc_#sw*~T zHl}Z?l?ka5I#(=J>cua{zA^6@Li|8wbqx$m{D@|TK}}gWn&8j+Cel6G1=Pc%+8Ga6 zC!xKQ@sGsiHf^7fv0Rwn*pZ4np2DjtIdeYluCpdW9*0t>@bL>MjQ`?I00Q{ zJk%kqte`W2+He9`Grl$klMJ?(nm|Q3UfHz1^atIoR>=v<9;;f7jzv*pE8o^DQ4?tE z!F0hNEm33ZA(ng?uO=8v50wVl4$vL!#wTNVwYmpfv|*tq5NG(PoDF7GX^8W-1(_oH zlr`c{BMKl*N;>aY&@g5QA%|@RE`J8u3q#2o#Yz)$JPpW{orcZc#$E%AMj!d{q!n4% z0*{oG8!8xt>#+I1l`-jvrV-zh08&Y30#wQwAX(wb^oa;(umg*OrtXO8Gh@w15Q|hx zW7hlyDNH>S{|-a(!&S?Sk^NA0m@%T&p_y9lF!GFkyF=Ob;R?CHwZlD2<}hG;xUpl9 zpp%^~bqotThi0m^mM942as>3!k&yAD(D2a!;IGt9$Dn&03z!h9m%_z1=-do-v43*L7V;6wst zFlgKa!ITU}bl)25*b2_zx%J4K#dFN|*1j-{*P^#oreChHiiFf3)>u80FPXUs7P2@> zS#ZmEXACTOxID0p)`_A6lgZ1g@xT~0s(61JdhHPD0-;Au`;i^A-lA0282Xl~BtDI}PxJ_tNh(<{BX z%Bmdw11|h$)iL8DjX^rF?S6QS(ZtI4BE^7M7>IR4h4c}HiCYY~!2s%#7TO$aPrvSX zYrmEc!dE~Ee9%}Vpxst2PJo8o3J*watjMbsBtflsFTrO~ylQQRe1)LKj%EM126})5 zU63iL#==1lYK?^>(1D=45RzE zv(#@re7`mLwrGNH%V<1}FGBb*gx&c!dI;HdmyTPHc?tJq+$3X@?*D;kHUQCZC z#`k(lCX5F3@G_7B$WUFExK|`mG3bL&9@*-BpBE z1yd?jg+BpRUyJ5A^EFD6HJH$WH(x_jxNXzi*@>{3kt$mrHwyh}mDOQ11fw~gFuEC@ zP~w_OVW;h-aHB7U8&gvFjmH&yHv>|K6Jn@?Bc~^YHhnFoS`&IvsO6y7F5t?GKJm$w zT|qCrr|JJdCIc^=AafEUM-%M*}N-@K$J24kJrHo0L&vPDego% zb>3czxA=5|Ks84vMmIyJ&dt!N|?C5d-j?iHbgVKk#Jmqd*yig@FS^Xw_0xUBj)yY zZF9d;Do3B%7(6IZ=X?vvrVAv1=`hR~rdb%CFJQDc{9On=?0JnbFgepPCOH>dZmx5Q zg>n5-eDN9oSY<@0NR~DkX*T&w@AcqNOwQ_=?M@?-EUZkjVc^0;{m|4{m+bbHey^`2+ z`ZAN~X`*};QNEfeUz5W2T4FoPaudMzU%+-iZR}k=V~EvSZ@tYLU4gI8`P9n-c3^Gn z9WU44=U6qZ-)TPA%a}R7ZJ1Zedqm9f3dSI8v{qJ?{cB?zGVnLyEc^}n{c2Al-q{R;+o93m4gKuqig>ip}s|p zaNWUu{hpxzI{LN%(ylj+;`|CW7>Ew*kA|LIhdJIv0tI2flrNyhQy6I2Ie&wt+Z#5# z?;kJ$3=nV>V43AaRZ=?%Q$&1qP@M$kao*kmv-s#ZjIbs8(P384y>`M7gFJ|?jkSkh z!w^kP^v|LcpN*Y|&N-Cqsg^t0IhXVP^DI|EjQL%Gli5V9z0E0Gw4Lrh+^RWoKqEDJ zs{uaTPzM3kn+)J71lr-?ApX_hUmyJ24gdN^pCQ&h9n6;N4VL%yJxIjc7P%Bqn4d-_ zs~_bgzK+xDhg*loA5V99PhsfMBVZ_A989Z$OE7abo&M4wkeY$P(z%R|i_2jVI`u)f zy^l{?1>?ij{8E~AP90Li_K&OI_S1R*^2-;Hp1_%N0>>9?TpS{TKyX zz#!M9BQ586C?MwmF!Mm9{Rys}gK!l0U`%mGML$8lgVkPj&LQexSb2#&8u16Kz0CrB z1fkI;GzOu4`~`aC!+f6EgD?j!CO9i?huk`m<5it{pL#>|P`3@XCY33lI8|YL82MwtX>IleQ($!Iga; z-)*X7>Ivk+)qSYh9Qw4#wjuiZy{yWlr!B^i=Vo8kA(o&`E6l^J1cBCvsY78{!Ygt#r?7{Ph`k~CLU$CEkXaa2e;sb32{auj zb`l^T4v?n-y2G%?84t=CJSpcPh%9yLm<$I5>M`}3Tc>Qc#HA(*G+sDaPAxec#+DfE zwS>z3hVb!ntS=r$!q8=tL`!TNdmz{xKk=uI9!iHp2({CD!+LFXEa$VfIuf&6Sl4D1 z1dtdnkpU=7gkR^1H5o))4Fs>FOKtBiI?8JsO&^J6XoF->oiGV~@%V}OIquYix4vrH z!-}tI)*udmuxz2Y){2S&DkyGT^O>*&ed0HEZv)F4&B2nySF;Tv0L<||ED^#IAuJKX z5;SYQ1{RO{03zt%z$oX!YOGVI#;U&zi_I76FV5KLOCV;W&Y2?AX;eB>un4?H;-OB< zRy)bR4@ZL0J5$W?X+#oe!-s4SEMWQx}Ly_?;#u;`e-ExRDHy50F#{Q=@K$ zKd*V+dZkbogEu`D5YJJU2w3Mc&7x!m`oD~H2F}R}p#L*SV-zsboQX6D@t+}`fpb#9 zT3#uEkE1Ct!RSq(?!5wi<^~7`yfwkDfzrf6p=QHe!!l-2T`%govj&Cx6)@hY>jXZq zeIHY9gm477UoEI^g3us{u|nPK$q#lhBCFBZ_aifot2>L(KM)8y4JIPs;Jd=udyTa_ z_~;;f_|!N!!@FkkjM~ekiwwL=EdtJgEM0@HIwH1Of*lCr{~YK(Jmx}>R--}7z_0{#_N-SI!JgtnuQ2@f@__I zW+9a%cxW9_`2QO2slr>Dc+j#OQ~kwL7-EMQNLZZ#w>Ab+g19+YO=S-w0c}G-+Yr!O zFZT$D6(JBUWC&)^kDwM@H544H#*lD6pkp|C1H4z$)XN;d37JXZxQd1WEHyO@ z>6ldL2y-}ZK`8|1nJEkccS0#Z1aZ>^M)ELLxf#ajk4b4HBa9oP5D)VQEM+DmNuCJ- z?*!j6Wrh449%BN_P=wK2J!FH?xj;6fINTP^7iR*&V)0bza7Jm`-}Ga6rGY*EXg-8Z z<4nLNEU$Dpo-~w>G%XGXN7LfI5HSU7h+g?r|I0JwY37ncw-6CpKY$SC&pd8|p?DY( zVaK7wn#GA6N-L!U-vS3mo38_nd9>`-sMIM>FmH<7R+NFAD9 z;4PXr*wk@LfQOb1osQJwa zINX;8XuJXCYS<28)0e`gFNIBC%BjE|u7r&+@Folci{CVX&4Iej;W$P-a5TUeW=%m1 zr9ea{!yhMKKH+`_#8Z3_lVli99D-bgF=${68W@8a{oMo6s3lM(V{1h;5427({-$ik z&uNzN#?U6G4d0U^IOS-{c-x376ViN7>ja;}F0EuNJr* z2pnxiGM*|RL(|-u#dsQ_M#|Wo!zRe>s+=wI&6_pg7&1Fd&;-7QXr)}IeMV}Y?a5OtTBjDM#fX-^s*X$^=L8{tCxUQdAY63z21 zb9(CwBvX9Af*Bf+T_M<11F|!~{xu|q1_U7Y0IIoS7+~;PCZk~na&7Itq#3o++KM%1 z5OgjH>X9)m%0_^L%?bwfgBj+DBA{s0M6dpo?4o^47t`%y!uXTIYx|}fm1HnOW-&bD zi+Y?n`bf<;S2{i@)FZGtZM96OM^Pk<0A?+Y2Rc&C_PV4p`Di;l2-soZHEPj^gj#~( znx-8RX>>N-YxgG`wLm7g*X}^uOQsTi95N78i$V9GdJI;lXEfPrDd4dE79BJka=?Gu zPY^JG8CL%SPq1?gEBetFA#X1T^#qE%C=h~q4S&g#uuuHgpp$2!0~k7x@hQ&|XCd0x zIUb_^sJn_A9@!5Nc#g^t0mG@JiO8O@J?~j$tALc*T!}24v6;=4@c&^8rSWR96LN1Q z>_tSa;Ubf={C~1fJt5LthXO0)-6{1`s-g`UcpmNQdM~kulLE z)@(fJGYLuorZL|#IRt+AEHX*~$YpMS{WEcHvi%h{e$(BrwC%y6Bpzgut(s>MdIQDt zMS;Dp_{Ews1(ds7v3~Fx5O`l8)HM)GabEx%(%2iT}zbLAO8VzCs!$7TQw$Ak|srf^~Pwi(gh0nqQ7 z5sfisAcM6=+Tq4Hpk}xSRzkoGn6`rBS8~1<1k4B{L@#ivdzo&V2NcMDK!?6YQ-{@X zmO^m{Qz!$h5p`xF;oVf2g@TM;Ca6HXs@SWttIDn^XoQJvaQvMJ;zt|nKyVuOj00era~X`a0S`4QK(N1e>S3%z97B#%srvV`EPX6 z7uYSDKbSEEK&MY;z(ehy%*aK>W_so|fqrTNNmjlIu;MKQC^2}WA8f>WEgA@-B0?23 zKw(yI6bI%>_~UsR9~h%CK-B=-Vj1w+oDsnYmWBlVm8tBbUz$Gph3TWo&(TRSISWvp z*gW6}dvJKo0?-@>^ByyJ0Vd*MU_wq~8KHm&rNM`?P1?Oo;Z6-?KAbN%Lp1Q;fO=F0 zs7I!W7BR3!6k&}hg6jFxJy1g)2@T9CpE~w5;mitt)dv9cUg335fYv15MmpppntT@Q zYIM1uE!9@T|Fh+Y*t1fZ_skAzt8HNav%mzjI9rnF#_5iXDW^M@lYOT=c|=Vx!Mk@x_dIk@ zZ<7v2F*q*+4*Ww{i={eFoo@sX1}hXv@TjZ*hJ*av$>4cAuyvp=0i|gK7B7<%i+CMm zL@lC|ZV{Zd9O&R)84J715YR>vx?O5(?c-o{Ynl115s@^yuN;XmkB}6?UE)Z;XKtwzLPI{=7d9mKk^&!HEDGE^l6x zg2q^a5dZ^2=mG-_fS~K13!Kfsg6d)axB)X8;Yue6rq08uS(X{o+pL2w1Ul6qFm{(g zRW!FCdY;)*-wsoipvuFh|3n_Pti8gE%|W6{=x{)CsZ{4n_Pk3WwNFd$JzHuoki(H; zr1sL3)K)TMN@^#geP3)bf90*;Y8qs*QEDsIg=Wj$4DjSasc@nErYfeSpmkGaVg_Y4DR>?@x&`>`TpNpGVsJULi%CvBz6Il4A+dCH zC677G{bg7q60ogmbkVq?~Jbitk#UeVAp=K3pfc6a0D!`{D*3if!ZzC* zvCG!ENn$bSW@P1lv!rv2bng_-tvFiY+$OQ=G>6$`oimq*C+11_H0O5dp5feq0>ZhI zhb``sI0bXJgq%6^rP|e5Al(w+fDfRn1yWssviC@Yi0r+fdX%wOdiS(0WP+OMz1)YF zB(g=F`x)I4s|wu#^dhOQ0`Q*1T#cI=yQq65+`8AuX>$?{QeDdvR=87_a#IRkRO28r zE?Ps$2l2zB)*u+i`I(Z2LmR4&D!SaWcXo26!Wzilkr@396#%+xlRd_aruk1)!0^-_ zV<4l~4^2nckDT4v(7-;(TEA?Xaji7+!j2fGF^8Acall2=$gA#wYgmz9fJ zq%9_7kXM+Y>Pda$NmlVuhu}^(Y$HMaX6}ij-3F&&v8#+38fOIsj7*INsK~+Cz&$g+ zX2Tq$z_72$hB-!)eH>H(Tx!D{#EUUm8|Ef*2>8VfbIZLAbIIj~gFU>8(;VC-ijDuK zW}BhbSXQm0of6Vv3c|nSvfGaY>S4^6L%e^|nskL!c8jd?oWFt6J^xD9G@uUO0>}RW&Vi zhD@j9W`4Z;9dOO|Tzk#u+FDbIdOgK8+^3HgJ+7ev!?ic$2&@>u;x^d4f>>NT>T}Lq zbZ&4Q7Q0bI=KHB6wnYO3K{A*yK+U6@@>supZnZ@v~L)W+gj zwG^Nh*f$x_q^iMQ_U5Z$0(aDB0#o=?z5 z2Mn|_X5U@#favlO`6!T2`@;#Q`nHmrg9IuIJiXwpe+@V*(UZl67LDU^T~ktO7l-pu$7^zi?y8~}yl zU|v!V1t!;+|Yh#3)rjO@+>ta~qEsd2B5GXE>C8g2ZSsFK#lr~B$ z*MPI6^~0Z&R&JKb5Lc`zHZQJB;CPDWGo%&#Zz8Q&S^QPfnuPf5ptu4A5-QVu=SeFQ zeAqIi6+Nkmw4x_%C#^|#r5zX7-&|Ug7{nm1=x`L?%+V*UCNTL(i>oiKo@i!CE4`;! zI3&)$Mp|)K7`y2yT&~&yacv^4uccVhR9cyUbD2$~l^blDNNbWS$XVk0$lWjC_Qxb%m&HNJQ|{=PW^Kij2@GZ2xPg1Luvs-^K){+vqgZg`qLB(L$3q4Weg*jxJ`~IMfX^(7g5O}_GWTSdbLd~fve zR&0zKg3+CV?gW69eLWVBI+M19W zQ`uif>MTlg*BB|Cq)c7il++u44XI!FX;L#OP3knI0ePCzNl&UV2mjqj4Im7ux1%%@ zFr{uP)ewXxq=q2;2c%Bzmm;NgQ%Wb_{xzh=+Rsl(HIud{wGrVg{V_J1(#ii+fn-TF zfM}l7OxT{%5QJnCQbQ2_15yVw^v9J=N&Q}PlulAxgQ(l->Zg91)J)o*)JBA}NL`mr z>SigOOs#VoZTR!LI*Zf*qIps?VS7>=5$?i)Bz2P^1Ob#z{t8{4sX#zz_;ucd`{)i~ zX4k&f=2(x;of^~qjW+%$LdZh`dRK>wpH@JmJJnyUpmr8Kb{-%WUDf$pX zKS(;pu*8UEZR23VlAciCOO?de0(tS&=OpLX^uJ)tjy}PaEc1^0sF;np^3*n|zCi#F z++vDP6~blO-Sf`==&j)}HjztLDlV{%&G9l z4I??~OZcvkVhkx%QjPH;b*K^FLSc+IPxTKqo{l)WnR$Q_3mnxP>$zV!NT3tO|BQV! zb;M#T<~n$M3%>y#TQE5fC(R-|jsGyoz*A_b2Wa3-q{SsctS0gTo*%sxLbGn{EeJN= zuBE<%80>;>^aTjR1IT%-YMYGFScVXjmuCQdC4k0VlmPmQY@o04fz}?-*IG#* z>MI)CR#*E_(~<`P4=54pYw{FISqpNC>KVXqq}VP2Ovp#YRD=q^{dan(MaOz;{3$0lW7H zY=^?P(6BJFfEUr-gLQ7_UJFYk3wfW$eY}a_{?w%!i+HIEIEN zKNo9IR6e}eq^EbY2}lu~WFj+`Y)MBzIfVTMTCQI};BlUwaEn!ve9)>1;5G;-BK45f z8<$-L9B$0`f4seUoLoiK|3A0;_S{*zXFADbnam`q?g@~D5W<=OA*3UOgshVwOTrem z;Djw9AZVZm42T;BQ7(c=!j2FH7X}nCfC7pNh>Cy@2KNOO^ife!fA7z!dwXU=P@eA} zzgJ$9d%JEer_MQb>eQ)Ir=ATe2+I7e=s1SzuP3N}jAw%B#}iCHArNZ^aA*8ULloS1wEMPy9kemd zmE9AV&XRq(@4T4+PbUQMh21kL0lq`QA*pnKDxtu4Gzsf|pXx|FI~rEz1a7kbjtV zwPT$)C$NkBd`bh}UrdQGXjA)zL1g&Ro5}D}LIxEtvEl#Ylny_#k|xaE|0HDCCNc~^ zf!2OV$_{t6xs4OFJeSadJ7nwJ7*zs}-X<+R5g0MXf4`p?KS+on{4)k127Y8v;t%nc zKb)PqJFX&9T9C3m?uYVAmIppVW)_(W(BV0w!w=I?H5Rk6g%CGLGtK+(~4g;ns0Ve;^ zOg#UJ?6m5C4Kky^G8SY;fK1Q-8`i*=qv+}sfhHo&qlp*eS)TO{7kUO{h3kKR9OSnJ z(!_q5b-yq=t6#rF8hH(^st>>RtYd1bK6w@G7h<7)745eP`@CYA-S1NF@wIyH`Axz- zzpsf=YX7+sJp_EGVGn`(nSNCLzI=&%c(u~R`HCS#?muST9|nN+N5Jw**lUBq`fCE# z|9Y@qPr-W4etWR~l7RKM6f9rAiX9x+L)xQr0^Qn2}o$b7g2V8^ylZt`&7VZy4>pVnQGW0OXx16<@58^SK#L>Le@|lDRhNO z4PHWhWI#8X-ABS5EulVEYb04hQOF>^DutM3)0MSM_0AU%?)E02(no=WrE3zY?T`YV z&CI@j;lXU12H*Pwmyf%TQ}Z9<$sfzMw|>Gymdtyfi0}DCw!IqHT1h}5mw|G14HPzW zSjMUGWF>i?g%-YysXlRyIYd!x?#Z}MT4faH{aXM2Up!-sovss&2kSteO2~Y@)#5&# zlKDFO?MDeM7^FAUAf?%BNZhe!%z37%ZWifoBGYCgT~%{dZTY*&YEPHHn|4UMTP%-I zk|2yi2F9&5FgV^^%fx}_8pxXoBSF8`Ti_<9>35WFTgmcX!J=>HY0G zQw(SEl9%)vhBUe}ClZn`%t4klzVGVnsA>}Yx&L#mV6E;qzc6!I6_blTm5~GzZz#pj!fp~be={lu>x^$ zX*l}$^dlbnz81ptTWvK&r8#N|DTZrkNgJ*uq(!df9*V28BjX3pXu`uLMG~o>J)>zv z{Jt;t2DY*=%mI2Q}N8U{vP&(+l$b58dy;FWqUuLsxt7&{Zb~SCc2VX7clpW?T5qX+}|AkUzB9?yj2KYz~8m zHQTK)Z}k{W0lszkN2h;`@ehTwo8Md+=N}66x1hPANT&;%s};onT|`V?9*dhR3TC;a zxuW2C-OZJq{X>JFUrgnB4g!LcFux&rzK^HwT_Efn*a`C&^JMXz?@gZcPiHnS()9?s z5858peqekp4{)OpBMPY`NCnCf46^}=O5?#$GT=#&0+o=AA)|ZFdF99_+MuW zlVScW|2We>&hU@Z{bRL%^!UfS^ymolr}>|&{Nq&rIE6>w_-nJr1|i+`;lkss)5F$k z*iv5?WWxFgwu%GyQI0W1yhucuI+5%X|EJhSOPTaPgx@=!Lj2R=Dj(U1beZ^(R0oqo z&SQ$^R6qvG&DjSws$!96BLG|Q$8i}lyQPAy|DVG-)uG!kH(E5Oh=@kGTwKk1ei+=Y z<|czm#65=sK9onq`}r!cRCQk~gc8 zGA&wdZh<=2eDGUuHtuRD-LfXmXNJ$HB4A-8t zp0Y&20ZaXqO|e9vE|3(C5kZ6`nv;uwP=pl|z?(r(ywS0w2R&~ABLtsUSeU@r?;e;l zDv~|`M(yh=L}5OG(VST1uE635xPcM2(^dim9SkF9?-Lklj;qq#mdrV@&}V`1bLN(% z6o2IP0g=T)i2I=05RvP?O!)!c+jQp?M0-H4)OK|R-yRStO}yaL`9Ow?T~R71oDdTw zh?1?%9rXWxk`z?nNcn3`*RX?k90WC_EkN ze=W6yx~nL@dobewD(96-Ttlq}yV=VkSf=`$>@5>|io5v@hzB$7j?5fM0#T8ZJ#-^V zx`9#L#%#UzytH@vCF$$+fU6vFl--9(>cQ@8~@+SXhs+%mk}&8dqf z9pbmwllz;oQ2Sp@u&R&7e;n&G_U0yKZExk0F?09nnE?Z87PzF5vfXBx6Mo99dumbe zG_ve4>SDwHI*!-sM5^6tX;Kq3C=4@MM!k3C! zMK`w_JI@@%!90NhCOinMIUnT%A>W;XF`sf8;JDTC&&T&P5vZL#?I0##fM^>)S$QX? zshDqIYg5o467kW`*%I{nIXFN+ua>rwAaVb&yzr$Zd*>dS{R}XOH^GM|RMbzXW_3Lw z5?XqVNGWd^PdIVJ_N1Z}BbL{V_sC2Z`QWQ8Yc0;0X~p#+*r7SUuexNz9}$JemKQ=d z##3*~w!I7d=r>t6#FQ=aU%5OV@^s_v=E; zfuB-D-|NG~D*NdWo8S#$Wn8@FrtH2Y9ehK>NFJK^_xJPme*Q5%4sXuxb`VIuI#K`k zR{!=9Bw)N|l^d1Z9OOHn>C|^v$lIkK^mgg3nVMbt;f%LSqje52HtAQr{)=knruleO z(*3ZdwJzV>l#2>2LxWH$nU+&+j`Ehav<((2Z$JnBX(Uy_*k%Jk-t z__bEswy%7p1%qb`ViyW`f_%8~7-%%X=CAqoaSuCBcy18Ir@O$<7&9U!m z9c|fRP5DC#1wPbb-m@`M`g?!xWazT+*Kep#|5Ts;rGEZ9?O3%}L*`;o05zGgYt7|% z*qn4q(0WNYxJ_cIYD8{OvS%fktPHJ}X@I_8BlmKR+z)8belQ)c9}1gk{lj5JOOVF+ zm^)Iu9^KlQR+R+y-f&0u%mJ)r7Y2Af&X+dzgM*F3clbuNc9R;vS)kn_3&pLWtyMU$ zP_tcO``v-*s>XadKKCkm?GPA&z?KAo18+w_`F-brJYgD#msQC)wXk z$n0M%#j8G>ZRz{L-Px7d;IY2xU(9|v2p)_7^rh@3et!Jk>^c1GYq*bV6A!uK$HBy= zYUZL$HL$;Nyk~iD<=Mn@C!VY~E~@8!2+y+p4las#s!YJ&==h?o*~2qG`&0Z(KHN3_ z_ttD-bdG&q3$9S7JHr^{Mh^n*2UmUT8{fU^rEhk|4Uc5E=qO=)?<3rFE8~NW*phBI zY><{-88^Q$3bh=wWjkZ2I;Ze1{ZcT9#(4#W+Q~_GFEv4W?i<5@iTm1!999{(W}RzT zO9Z8`63Hyth-TVU=?&J%ODe3md4>I5)2hm8JsiDXQ_0RR>|ZGsSbpQfz-iU#JuWC7 z9Z!8UJAAeO4S%A!mGfNK&3zD=$`f{BN2w+MjR6I8xRk*GhwE(yVxfUszpTEbd_m>& z{pExFV*|=tgS&EN6aXXzirY0fB>(7}3h0KfT7m6b2=iM97C8ISY)&EjJhc{Ei{=eYqi~phgQ1DzW1q0DAY&*QQQOet>kn;*tTyE8fl)1yj zg(-j`v)brQLV+zQG~lne+O_+D?Qj!(!u!Hb;Th?7cXK+DC04t-7vEW_@2{nD^& znpZf1l|i6kS4IzEw2>WX8rSM9ouFZ)QD-)VC{v*kRtyYJf1EravyLos(5Px|(X%Ux#ox&s|+{DZiPbFDD6Tip!G zf*;29oWfzA#Y|u8AK01!l0(mKtQ#ZWzA>882`_ILW3i+lHBDP)=PxRYv2LptJ{Gvb zZDrVFu3pDTG-k=3KOMm{wwz_E!um?kfF>>H6|g3INCEpRnL2x@*cN6%<-Kg^Xz>)S zp*zL%WWoq41mw@j-VjvQV{H%?g39@rX!Lcg01Di`jf)ElTqitO>Z}nTs*Q0$X>5vp z)0|iXcZf@yw5p6ZjSKgdknbKAj_bryp`IJ}j7QRnT}w@vZle4=aam_DPNShz?Mw$i ziyNo92GFTCWLw$!E{(3N%)6f;UYQ&blNk4?vLE7KxutJWDNC+e3N zV3&D?libdX;W2*o)<1~Hu7&=|Al@aO8U$TOW)~L5%I=?4xR?E?eL^KDO=P2C67gzw z)%B>88DG0G+DlU^rx9kxm8L45%^p}{_ne(6?KRt#_O4_~`%rXW{-*KQm9Kg->}MR( z)6tLq{oV@wf~%iHPV(qK`E8)TV{J)7%!|pZHvM3D)$@h1#lpfkyHP@NXMZ5mB}X$@ zBOQp`nMnr^q8GF1Y(*WNO-J9Mjvh=$522%T)X_s{x0UA7$$6}j4xqnBF`N2{d4wnCkreOZPXs-xpP znrMX({Scj^UxJ8f;?&wS(KrAinPpOlG)*)LA_4SP(?o-7?1yn)!J)pvhh#_PL4I}k zHzF{N0@$(qHS(uH)G4L~%>OLmCEbwlqx2Z#<-LhA$@^;IAnQ%3DKpCju2YhIEI4m+ zW0B{b{qmgfT@vR%nK32h_#)2~X-H5nm`je(mmp`D{52xi`;C9h#(>Pk)at$XgT}>y{ zGImE3xQ<5qhtsLtyh=^0lHsJS4b!W08fJbX6;pY=qib!ci`PMVhx)9UT@!nCXd-!& z5mst;U5B7=*MKN3sS#}jgj&kqGXA>xTMp3{^LLDhN2P$}=Xf7FpTpdb-KsX_obNGkL2XHa z6@f}>FdG^GP>vr)UD*84!lFuVMr-YXJhoH(`ZE~Pj&&=gU?^g_Yjk^=sTB!q^E3Yq5=%7y7So*|Gi&COgh3?Yb5hmbj(D z%~H2aULwm9wkW|CrS23bUO#AaOT`^7F*wypV= zh(I*k9Y{b%T{@ke;BmGRbW8f3*e`2PJQZEgrn6O&FOoH^1W$7-cOd;vTw6NPWQ{@< zG%{RF{MDr2!~xQe72rfzcew7Mr~!&R*a4t)E(O#y!x^SG3s6ZL6N*JCq;m>o59n!b z4}K<)zN;n`{ZiE{&)K!iuZf%%piS|snPB)n{VP-kXBYaQYn)Sp8EntMSpY3~aS}`a zT%OqFcpc>OpN>EJT()!kc$b+SOv}sw*q{CBQTC#yyA1Ep1|z<+cNf3>Vs#%Hs?3@S1v&nPZ=3@#2a7EHkh9JJlBK&1PA3qv7GtNv#v(;W?*aH;9Rjhh?$rz zPRojMZIho26EY8IMWh#!(QDzw{Ppp;LO8~%FAT(LF+Tfe+0J<8i`kuaDXB6Q!3y9( zKSh;nC1r>}Kb4wV^Pd!zc1b$A+i0J$UKuAaKa#DB9tOlViMKtU9j|;CRwl+XTf?0W zwjPU+>I>8JTlU3lg*JbyFYs;B7lPx)uf5=_?M_iN=WSQ(`{!3OSYE6ZgSjz(#dh#s zR1E7U`p$K!c@faEYMl_6TUNpux+d~1h<6x!QE!iUgCIlMl>pYvY|FUH9lsjCfiRaab zoyOIy5~&bD!~aY-xp`G?vq2r}DUZ?ge<;i5G4l#@t#Ruh^DCZ;iu>MaDoBQTNdH(# zWLLYK_Dzvn+G);8;lp)novPyB80u%yK3Az)-HxTm7?h#0ENvIb;+kdZ%~x>?8N(FD z(qe&@yA0E@eDMJIhPCq0{Vu3Xjq^3h&^<{U-8*ASjsi8 zy_fBq_3S)c$fn*!EF!AXeQ0qcf9 zYB1sQyM_|FLy`hO+<#Zq{da)G1$a@3b4>un4S1)OK1z&Krz`LP?8*RmJ{ADaRXWJ= zak+_pA^_T}bcd0o&sPQR)}XSjuJo{gendb&YCwNYK!4qUeoR0=E}(HL z1-;)8FyBXs(9|84}0rg`6wM{_1Y(V`4`XdTT zKNWC46G`A`6uzH}WWPv$v)K5hVEUChiyv&J^c!{Kw+Tfd;41+N_wR)A-zSM}_>HSG zuLiS6m0lA?{uop)D*Y*#oh6z!K>j(H9hCkO9AwG~N4-U#*9|3qGmQM*W8@!c@83`# z|EYGY_nAb`j9=ZB9jDpxr5|PY8cO36v(D==E-I|cpBta`a&}^E_I&i^Y4hM*STc_om3!>lha&M zKbPm{sZvnoD*;^@fS4D5ds4V-s%lg<7ikMZnufSZB}0i9&PB61)1&FIW^5w)G)q1W zk$p%(I=Y{h8j@M5gVHh^OAN?}#!d_Kf*Z5C3<0H|_ckyQu;^-KF^t^ptm4*F*q3~r z^9s|fIs|s3_FK%GB;%)-22C#($rF15)&xy23mm?~@(t1g+*Mxl0QK{yOG_m$AtPXjIil;PYr!FTU~-UG|rt-N!Y1pYkM8@uvTNt zOvuc$49#aT|JmwL1m87&>KECDAvvRYlhIrX`tm{aoVR0oa!d1>RwH~nsx-8j9a^JO zP!h$&Q<^p*MFYkIw+J@DudrYB-i6uNI0Vzdgv@yEnC0P0$H6b?OOhRQcAXo#mL)RF z(uy31YHZWyx(oY=3OgF5yH^>aHQmwLFbypfD-Oi3L;Gd`C9CE9KG071#U9~0%h<2+ zE^5SCX;NKtrHYQiQ%Xf~SN|I%`XpXzsg}D+1!*=Ukb%#q(b8o-k4LkX=vQ< zC^Rl1jtiwOW)j`Z0lg(KP)n-|6hwmGNSQjwIj$TqsxeU+{& zb-XtOoS@#WRBtf^=*kAm{6=883DcJUxh?BBgzf_3g|KR5mcAvv>oi4Ap=C8H;81Gu(`^w{M!#H$kz!^->hpls0gL4 z823PRub}D^RQCz0`%|dCEU0im&dSfY8L0dQdWsPTK5(=h1XKK#-(-t|h$Y%CD**-{ zLv#bPkqAKoW(2s#`3B)C?@oT0>)loX@vwk+M1VaiNWLcMzMg{fn80~l;5?xmUHPvC zapl2=c8jRog)d={$%eW5=0fZ6k?mt9Pi}VmVvU{HgG zS?By_W{|%TPDpk!Ww7yIk+|Z3eX*t!JA&iqwoiiZg;j}r08~)`561CeNJH)C_rN@>ZMW4 z=qWFqryX8A)vWSmRK8TbUgl=6QNffd-R>PdRg9}k0e6`@SY%NvWSKJ$Kiy@k+#x;g z&^2!V#f5C1LoVC3KEk&?-nY)Nk^a^{@itp8byo+qo=IEJ3~D`-U;d`nhYxC<)n|X} zAAH-byQT8sNc)~mTPJBi-*xBm_I<~ipO}S(`O5~j&eHg8VcsLYT5CN>TZd4!*5~QE zK5r|6={)mh+>(7|Da3}jcwbox5fo-QoX$v??-t0uKi|#J*x?~_9k9yuvc=84sC>Aa z#{haMaED{*cLxwr`z1z@N=mF}DRNlq5D>^Pn~ovfQ<*Ex*Fai87Fjf>Ps?al1PHWl zhjl;Xu}GY@pF6Clv>zF1J}509xx>cWAE~6hyx6Vo!OBo4*+N8ZxH)jA&&Qf_w(LgT z?o2({Ey)8oIWZQwHFI#a=$66gy&62OwpVm!vRCBRvQ^|xhqde1vS$#ub2JEZZe1d5 z0(TxeMQjqebBW!w#`VlAEEQ&}HuhalaVJ0WSI;T1^`Mb|hK<$UWaOS@zb@vN1i>Y# zR9pt|IRW1}2zUg+SR??zOAr7&EZHqV@FA)J~C1+gOvJ$%Aw6JdEP8BnGvjp-Ik#IxC?0D z0+^!8rq%(V3xnDs0eGVTT{N$7Q_}CH2$4kPIn!vX2CR{Vx;Na+ac0fqBocA7VFR~X zoVSR7V!FV+Ypx}0#k7L263;7GF)6w)-6NvsBCVMusaG6QxK#{STG&ihsvy| zlAiLCg=ie&4-hME(bkYw2}@Z|gn3!&e3ut#9vSHtYb=cP5b+o^7T$9algWFl42J(n zW)mR&pTPPy(vO9aZhik)xI>@;C0;QGdx>*kS@y=(+gPY~XK`<+9Q^6#z8So@-6cqL zjfi^Nb9Lu~M|Yujm~j{N_<_Qn8MpWOjWIaR_1Y{DxU+iP#rE3nM%l=b2I0!f+@)+u zI_N0|^dsl8U_OU+J}AR8W9M>vGI(@LvNCJ*e27Wn-G2C-FMKigqywl*iF62kIM5in zEa)FZAE5$`qASd12}%RE5hk&5#0f>5Yq{Htgn1fDHj*?Sreo<+nmx>act0y@GmZOg zSoZ;bn-RatoT?G!xtPpW!9*oa2YzjtT0WaIXOxyE%xAsyd!k$|t79{t49+dD*up_; z=?GVGXS`&bb~D}kxa^E~(T;WF%^H!{(XU=Oy#)T3db6%IBiR+uBj0O1H3G@4=<>}_ zhi1+*wB{UJpgQ;j9af-#Xxen1mhyyg0C_hSoN^} zXaKA~@;o@s^WZoRWcD+mMF8_m$mSR8Ra{A!sg*|(xgNxFn9;Lgw`apdE+<@gwU%n` z6G6gZ9^yXDgXXii~fB|{&Rav3>o z8|Vjtt1p2ooEEGLcc=>hU;T`SUU%b#DfFSco-rf1?hWu?l1m?>j<{1%=te3__@W=n{yOTc%6*p6 ztTV7#oGFN;EIX3TDO^a!aF&mA7LqHQW-I0ZX+fN|(0&x7Q=RvdL=L9ukq(A5<|gwV zw@d>z$A#uSu6zGFz23v?QvdpSUKjh^j%IiojDn?i-YTBv@E5>v_G6cf5m$b;pf1>|`#cAs#EB_Ci3EZ;+!s2e4DY7vqrx|qkH)t z8JEMUni7@*E6Xl8XHnIvklNv0d{B_wBG_Xg>>-U~5!|uRYaD!%3bEDhj-`(8((|PW zL5|j3Mx9;s8a{H}+UaC+@;%bz#0Ka>t|LE>zjbKf3%P*&JYcM@;bmQU#adE8Q+eT9 z-~a3^%D{L=rU~>Mm39&pi|QX0CUjG}c>!|9M(Fd)e$h!~pi{6Gi0X|#1hzxCboJAx zp0FpPPuHqyjX)2P(!;!IDVpd49mT|PU`~wpJP}Z-pSX`k# zNRM9Y7O&N?eKvrgJ#5*zW$e@;A&;^V`#Y-tXTbdT0v|CH)fq?2aG)Ezwbo+qVh-*i z)kbbgmKlfN%FG5mcAS+MIz>=jUM-#QMG@32Ie}d!jZVlO23K^Y11@kc8$s(=xovRi zPbl>~3EfhU{CcWV=YDE_1%@Vxdp<3}G;L!}9J&1y1>s*QS2fG6|b1-78_M15@yA(gUd!CF&OX#BHx56h&aC3L{522mD zXnn%uZL*m~25vA=OykH7zDYUui?)H$&szW$+KdWZp%G zjQg_L2m3lMmE7j`| zMULyL4dK>FCJ?g$AhMPrFulG4wbZ_Wmm}ihT;S7P8*2*Mcoy$r?p0-gpL2ghBvb<% zUVn!|L^_A+P7KLr0L#2sG@cdAZ@!7sl}%_hpc=M3!H z({BT2yQ4&xo}X8$!I^U-0MGyqN~dvIb!nBRx16Eiw~~_F1*i?p;jX)|A2?d#*Zk=~ z*V9XH9FNQd_P-{+1xUd!xZmt(NIqK3e8zVt8rt?*0zFPKxt>T1aKwU%-jJ)k%pV#NsP*H-aVLp09adLLvjVp zfgjl2z}5hg-edv_5e>flRu{r(yf{KaDcSHk9hl!p^f;bXO(=m<)cpab*4MPU_kDgo zQ4`eX=jpT6plY)!_s0Rtd+}DHCI|_+(i{ArWqCs;VL&z^nOvDNWO8MxIZHE6YBl;j z9ku08px!|kVTsGxPc)t2Ve~;9Ufs09Z-V?k?MEqp@IbE=t|w4eCC*?ee?ZT?Cf&3{ z3jYZ5zX}E&$BJKmj-ys3f9@u-zAXynxZxYjLZ765Uqtw$u@4b+CMm$L%T&Tc@j*-Xxste; zL5VCFH)#6vfx@8SbDW>6T0aSx4IW~>GCXOPa4Z8M{zL*X(P_v*KpC`sdazj0dukvn z@Q=z~lY&gu77a*H@#^!cptWQDWOo**uA=&Tg8WbA?z@*Z0++RgbE~6;Tul7T}T=+DoOFC<;z^`2T+1Vhpl zUg^shXdT*l=J=tOa8wBvdm`f=9MGdDs4Z`N_^^5upVtyj zS^Y=?D7Sh0k*`u;O@QH*?+{E7^W)L}9{jKXC4w zNw2u%I_Xu`r>O;}oRfX0)QA@igkq;hx{4zIgn>L-F(Gwq;gLa*+o&p-uYQxsj3N?a zR_qGlo{}XO4G%jq`QmoJTeth&GVph)HNi!rc$3rm@xO;Nw@}%Tm$Sp-!$yQ7PV67Q zTi-l>QKc5Sg?O1SDlCyx6`G7cIU2eZr7q?y(D;?0@bxqvLG7!l8!HNr$kaSga&+yq zJ$0Z^cb-@Scswl2x0}GB(;PGKqC&u~97$}ngIdG!)#3SrM9LR3+%}$a&kImnnD*(< zTDq64`r_I0yMqb+gM`q}S!Vacl+eCXKhD0F5c>HVp7P(%ef_z1y-xGrAeswLZ~| zzQip$q_8!}e<_HUj|w|FDIq(uW!7}lq~HDo$Ab9EQQ`EIi$+7piFoG?WDdx%B>%Y` z0=Tqaw7(@FShu+lq0$7Gq5rVlQJ)Vf+{XxpeRKsk>zHN48mdJ2SLUU#Y(Evu_@dw*uy7d9X`;f>YoUeR$FE9Gb4&0D zn=*j;S#8xkG;JZ29H&0b6JWUX;jxuG&Q%$I#)hXK8PesJ;X2)W{u(TndRxB+i^Hiji>hv@bKv^&2EGNxU?CW%=Ec3GVNG*1qmql_Zj?zbN$ zWgMlkfHN4_ZY!Na)>iEfi#f|B^;D5c5=lX(^j!KWyy7I>&@)%1Pj$@3D}T|>ZJ8W1^UDOy2U({bmJZ9J4=_zC2N^E zh`nE4R+q~K>jRleTj_&x(E1SMEPYtMSszK=vaZNf&MtjaZdn^Muyz+=Y&HFV$y{ZAbQ_4YY2s z@QoMik_Mrea7ewpi=^WVE%X5pM%yt?PkI}1ZKacxO{nGJNy372JDLayw5d$VW-O~d zs^$m1=qz0;k}NioTqlxzN+h{nB>A*Ra)U^+NhH~vlH^8_=z#ixM2%g$3&+FSf#zg~PosQyP)a z8F7&Q=jMB9IK+bZuLmBkYeIgHN0=`vtkbcsvD+!d%l@AwAvK<(fXc{UUe}5nGpwXp zFUR;Vr!hFZqCq$T-*K@OC(rzvF+Iv%It{YR!i%inWQWWgL3S2t7Y8!N=9rc|TM?{C z!+ijA;n12+hAeC;T}JuwE58AJRN)@T;fPiU&qQHE(RhjR()I|)FqWt@)7FXt)>o%qwqMIZx z(y7C8_gnmKOpED-b9dh3yT3A}roP(S*Og1l>cyokaE550uXb*SRaz=b(MI#HZtQQ^ zeq&8}>r(VJ_0ryPF7Cli{MJ)ILcwRffau?YqU=$4}1={t71_n-q;n6JYW#$B>Vao)u38p#n>T85zvp2tH*~O)v7z% zQjV@s<><5@dP#bj)C+HSNu&n;k?{|mOCwRox_IdL6c3#v;vq>tR58izAt6HyK)Egx z5wMxZE(8dalP=)`@mkkI{5Vq6W}pXpvl27$?c>8u)kFY!v(JA~56G)2UTPgXKiFJz zite{WbGdESWn94@NaoC_!cU;&)PZE_A~j{ugjF`Ni{vWtqmMQWt8(-z=k}{$qS{Y` zRjz~_sbt)6TN~4b!bB3Wb%Z;H_Yq#9pf?ztnOA}}98B>V#agDD-rhGNq6I8oiwesA zJ?3INyUXT+vn^YjMnI^AqQGHH6T}2d{EDA0`e8FkVp0ehLoYJ3;)j-oW2@!LQ9b3d z0jhoZc7wG2|0K;#mlYmOsg_!(<1N_P5m^eq#$mPdO2j263W?X1?D&eJRfU!IA{R&0 zv?x1(@_oR-8W>;sd~>PF={uB;X9EL}0v5c)EzxeOHW!NqZn2p&23IDl?V(}~VVDyK zV3^>7dT?mwX!lNU$2>yyA89!7+swQD`wWi7PL)^V2B_pvWZ zy2jQzH#~lAO4!z>D16ZR*eyEUb(uSkT8G7(Cxye~+b4(lVq2{y`#dZ@a&kCfTpGU2 z&ciimgz7w8lt4Bn9=m(EQ#^IIuxYe!e{l2u6rDBSVZ%J8aFePmI52dDu1Dj%mg|5c9g9ssKw}Ci}i&Mf0X`A&)C0%c; z&5^A_c*)}_aHk}=J~jU6lfTuGBF(nFoW8n`Fg@Jxo&Q0R+j16grX`F+1l)7B=-1I=x(QO?q%Zm9rkJ z%UM<7?0>e#IAB_j*9CW`p{32^L`^~74VYfU`&u>VxLFpz2DSm3%wsNt7Oj6Sat*6p zRJXd(BcX=&EMSC9xgQLQx`*9n9DU~47 ze&<|4zl$Xl%|yRVi^aF>9iEJk?rYu$W2>a~LDRx}ljlxx=k##K?$T33Na+>edaJU& z_FKBMC7BXUuK4}a!%Kp{^fm1lZp;Q>kFT2%9!n_Qzs(5W&121h;j~~ye8+*|(P|}} z8Q!YrT{FY`+SSmTVW%(gg$IR~5`Q;4D?BO)j*AI)bvku@qY^&e%CP}DBfr50y8T#u z!|d>z!SQ`P?+Axy$kTgBcyW_>0T!NDh~mPI!3w z{>q$i&-8u2L&Jl4zv$3#{Sc1^-+i`Ri<9E!xopgQCm!-}LwmgKs7yn=2jpBm*GcZN|=f8XXu>xz@(3;&gCkDomvJTEvYKJ3VF_h3QadyWi0 z90ZTY(b3^&>Nl`yMYg`9!`Fky`|e&I&f-(wYb(O74I?lAhQ0xZ28EnXX7RjyYy8B? z;r_e6e*Gix_fdX4E#Si@a_^g&%NsI&GU?fA83kMW;-BN)P6_v|zg@L0?R(cL;qpw= ziLOrKC(F{vtqVuSy`Kt4_Wfg3cw`VPh`a9(N5`K%GyEuQ@y~aK*9}U`Lh!iw`EX`D zb5*!Ho_bE$)|WXWymC+`FhBFG@MqN3b#}NfkL72FSCRPpv%@a`Ygv5C8v6QJ->qxH z6`5dV{LDHg=aK8e`#~q~M`nW)`zD?r{w(>{)>nRSn8{K2TNj2C;)T88Vo!zja#tse+q zf;KmNFnnJIQduMOKN5a{PyhZ%_!y68R)xd*p1&eIA>jKx(;6nm``=POqVIx@;gW22 zfeYiAz2Vq++!f&m<88fRV|?Mq!y$R_EX^q>DnsRBpW)iRrJo32&Qj;zpA5gkgt_>e0qv5^vy6}Sd_-Yu{`-SxGS9sw-9vB)Q@L5tG>%0H6 z;q{D>_}}k>XBK@P*jw%iU!=C*+!J<+5q+<%bLu0#N%9r1$5nMf-!)$dKi&YayFGwN zFzy@{k9a7&+Bgy792Eclq44zh)(685x012Kj9tfI(Hvt4`j?WpN`h{k7{C1B4k|hO zqrQ?)(F)8zCjQ;Z`qub~`@*y1(@(4)8t=C?T;^N0aWOQ$f2(zE+QZ>`al;oM3BTOD zQrdZu*`oQ0_<~2nUk9(p-7ja_`riFDWM1ZyYvMb<4#WQyDUDF9e=PiGP#=enhwllZ zxcWFiMe*jx!*)u2 zp=MB4kHsnR=f4@gKe!^^|H-gCMAJoB*_go}rLrm8Q#>_3 zOs=4((u*5q{L+(QXXdIe#cz;RX#G}r?%Y-AGn{mA<;JCWjAjX&iSkf9tuUlA48?^h zoFz%6l?i`B-H-Za?OO**RB_$Jy6^YR(giDM3lrCZSj5I4tvJ@ z=j;c4Cw!{mjW2D5Z7T*!TW(Xf^2V3q-Jc5g8uQe>)>K2%)Z_PBQ)qw_>%Mw#Tzx7$ z5I%bFDJFo&;=`T}FCV!bK2+|9b#(dHPltDt=h|n&wLA*nMKV7YpYq-Cufd}D*k{8D zEtSly%q-g7As{2;N1qLM6UzShEb`aj93Id79{aRFdfxZK8T$6c?}bYzynOq^b#lB6 zDtfDQ6rbQ68|t5F$L5hLN#FsM)eui}9m4*u`2@dMuv zj}8{cBYqH`giv_T55h3WymoKg`&>95_}07hc-`df*J14 zvNKkBJzh67IynAEN7R~T`p$XLlulGup)WJLZd#Uww;mgFm8<$-h%u^Wmw4N$Q6o?f zxggqIHiQY8Uq!lO1q;~3%qs-6h+pf7+Ow31pFA(x;~-haV74zZrYrZ~D}>*z*Iz|F zm1jQjFilkM&h->mqu|Tn=c|KfCuClYP-0$>XT2A+?%o!a5USm6(TI9G_+KBN(H2cU za%)zrrPIOFC_t(3lb4Bgb&>)S*-2WlKTXRl%g0R%Nj?Ct+iJI^XDY6zgj;s}T3a*> zgZOQwMvX<_!gpMjNefWUPvYLxq1`udUID)0(A)Y@XnksHnrY$3)*24eZ?}yXuUlF+8>aM@_ zR@kLoblz!%!`O47i!LeU>2QA|<3~oz(tKObjCRro80Om5sTc_^%z&u=;;~2EYsPOYe?$De?{6 z3;>xf@7MNbl>GYM_@PnJZYfU2v_}m=!SE2=5Leox{n9UYwMTmdmH4IhXjJBgJ5{J0 zPdy`Qh|eC)4KLW$rjCx zh@V~+b=1Gc_(*yYFJxq<09?@#mFu5TZKL8PBcieWIWpbv%#$>UMkyxQA>+s!jLHDq}VljQN5=-5~Q#ea9u~I!u19}_}IWKDK zUQ_Fy%snu_Vb5fzYRDoHu+!L1=G*H;e8G9qzKdxyS@`7EnT@I5wU}TDDw`N(qby2U zBIG2XEtNe}+Ctt*q}5Uh+Zx6{9ve;Q{LP&eIYOuN*H7-Ocmav-@VSDNT|(*&9yF zZp%uaRa-g1=o-@umcVq;U$Js9SJY}%72D#?E;?+wpT%rE^h#1wpT@AGM8Jn~Z(b00gK>O`<<&-WFOKgtYNV#?V{pb@QC4oaNrXA7c#dnT48c%Z z%J_L?Lgsa5qWI4{MZ2J^j@j9?vV(Sx_E~Nkk&m4=3_d{(k~CT7+SQ2vs` zz1X3}vv2S_L>n)dm{*&q>gF$6Jja?db9#OJ)Xq_7wPBx3-R!#JHw9j=4H3pJdpH`| zS(dUPn3qn)YM1#7(xQQ|I}0d7UH%9b%{lw8y91~)TeNdjVB^Rs_`VszGZpJ5o0-9S zR156&T%?yZ&Kfqmx3}8cTU=g1QS-`}`o$<}DzyQ7TXC^#v*I$!sa(d&6$KAW3p`#l z08FDBc3at|6p&3NTbA0oJsC=-dAkqYz)q-KB+@P9IU_2k^)9~Z-X~&UvtWRT! zJ)84bkPA9UC-qTPbuk4)2%}fc;vG}kl(dgj&@hMZHLx76~W_$d# zDbWGJudd$Rl>RhjRJ?lk$l=i9RZ{f9nxtwgo^Rwr7=C8=sB>?qEAh@M?`PO}u!Py{ z=@a{tkbqoE)j+nTPg>%2kj7lp{^Oc631c-^h7*o$x*|bT9MK z>vb2EZRyU}+-<0o?2oqC?1Gc0us0I4o({W=Ef1%MIMOJTFGyyQ-lTX>!;xy_P!sh1 z?kt@-m{}2Q7ZYqZY3$g5X&Q`o*dS{Qi2+EgW3`U}#=vybp3%YkEv9a+*Gn5Ijd0n5 zJagWH&tJ!OXZu%;vD+&;H~+^Qx7L+*MpxN|F}QiJXm5?T=k|)G!QQQVM>Da*^)22z z8XvSY8HuIJfXMpz;(emsv2NY7Pc)24tv-HypQyaQ_!d>uO99D*0W1}$_ZuN4Bm@(t zFeijoXS(){_8PPC$wVZ2Gua2ypGe4ypN!AhH#(K!R@0)|F3=dqc*HVP!qFR##!ib4 zdl$Y^<_AW!)7$)dw87S+S$e9QQ_u?WFv7ZbdKrzSe|9yuWA@8XI1;VAf-luT#(#|g zKp0D@YNeuUiJzHWm?pJm~oY{M%J@_Jq#gF^h7IxS^XgQ%N(UTKszg z0(teDco-5#A`U&Php2cW)zy?XJYRb%KN1B0oF26=7D4enF!+QJEo$`Dh7X7U_ZOTH0KF!jTtp&-p~pG*w@Bw=z- z=?2A<--L%}X|p2l-xyS8lx_+tdnrQy~AN2;@I|Lh1fswj)|kWxB%m6FWr16oI4hSecS4=JDYNL_3Ylxwd33SO2*4 ziB)wMRM~hyH0~%-h23`>W)hAlDvo|jfRaZf6QR&#-zx^fK#|`1=+oPK%B@r`EkhIC zK9~uZZV6Z%H_V7iBQ>GEn(1-vQpBWfOw7KDw_jYD5gk}%sxVDy8yWC_BCCjhA(PUa zb#BhN$hi6Ex$HT_aNOb+T;>+M-%XLq9l7P}$zNEHb4%{D=>1m&z^iPY#T_x?X$41X|YZGO_O0>3hi?%4C5S#wr2HIbmj0YH89` zP{$q~kw75Cku#$)9Dh7_CU%nM`0Vk~a2}tV8OH^`L0f zeu?M;3vLhIiWhWSH>GvF}49z^Hjl?S1xah~#^Xwu{a z(<=vHdf58%Fpue#DW*eVI*h+{P*e``@gEL~?yN`_YmS#`68vcmWkNCU=|AamR#dP9 zhn%1(&F*^HhVoEXxD-F4Ntc(GyL|lOtf+G--)Uq_4`G3e-;x1?aKP9dm_jo?JKS93 zA4*-i0q1^Iy}?ak-w#9~EXd&NQ6=%bN;I`yzjvX!-K9!VFZ-eyH&vfMR*80EReE0~ zIwVW3t7k_$b><8_HViL?^#Bhnsi8Vm8&_sW+|syXC|?cWbxJXqf|SdX!Yo7x`P~oY zHZmymVkYUTxL<-y={7uYq7)-KMl5BqjBiQSyjz2wSypt19nwJj8QwY#H33qWvbXyqV|<`shka5s23 z(oZ(cB(TL7zk~ICF1~}uB;VI=eAJ)^E#%w~cZ^$J{D#1j15reP1u_-C5&!)i(UGE0 zvP$RMakwliGcqI>_Z%E`Q0rv}M>}=o4u=_l;zHKnT!6zme25zcw8t`DA3HdjT&4O# z`52ck9}A|t&BpaAn|WTU(c6jHv%x4xCeed*EFdA4SAiqGo=`sSaKQ2zypS5Egkjy~ zOb4!f$HBe;S2*19Q`C|h0W2FCtkY?M0eYIGA_n_+`MYybqu$|8LowQCU6~^|J#LkoaZYKqJ1w!J_lEIP zbD|Md^lVAIGvHSq%{76jbVT2or1NM>(=jASKJ}u+@Is$dg03hTf`Nyu1QLQYYZ>d3 zB+Rj0C0C!TfFvPA#3mHbx5uCH*cigPiAiX%hE3aqoO8UK@#*a>T2b4ta~qp1wc z$x5G0W630jGsRrD8j-2x3k+cJ)hxLv2ucAz{l-!yv=1-`i_%-s^tXwj*t#pN74|hL z1E~grud{r7vI6kmgw5m|ujeG+T9YJtu}(>iX4;^EZSm=Iqg@ZMsY7Y9Gpg(7)s}H5 zxz@A+L3B6R!_u0}kx)AR?%Zg4&=NP#i+1HPZC*5HY{8v4z;b+d)*a^NQ8z27V&Kk< z*UpPhV3X_Fc`Om~ar0r(^l@z9X>u)@I*zvS9xv|`soxr(bXYW@in`6zoIumW51WF@ zKvc&(l?CqPn=Wd#QDKWdS*>86yKS!${-zh3>XGhx(J~VLMhOwXs3keK=TbCo`K?fj zS*>t{EN&d@>WQ1?M+=A9YU89WL?G-BDiK zq4CGC;$>J`^ZCjtx0>AH9k8@&bi1uprSa4AqjQi_2QP?@`2VxlEUo){&7yuTC-UjAFJsZ_l_U`UIr?hhiG+z?OJTpTWnj%>`i3Xzl0(c+UAMe`@L zfIEG!!UG15|G|Jt%@0)#rq=kmMbUzeChp8JUh!3S4B(V_=Hh6Nnc}RhYmsmC7Po}O zy0u2M$lJ;-=#+({P5D?aWp}Mx?-rfTqGW7&EsTQea!b5rakSU2=@=3p)}Rm{)&|gf zQJ_lig+=1#C8#>R@suUe)M`sAvHFEvzZeT^npvaUKI2vb37gY!wHJt>bI*>YSRKTGzi{C9WSJpo$VuO)eEj&8}bgn9Qk( z9Ap|6R7?!+-N=#n*lv`(zs5b?(dcn4iDlv38chcYqWGrnXs?L_tZ!RCm+aoxUIu*p zYy9u-=-fT(ix)GsN^%j(ZK=5;u|y_p6H)2>N@pSxjro*3o5FJ8@c6W4(U>vm*fp1X z!d2~G2fklbutb?Ie!Mg~Dof4r{>!4#!)(1YxR!X;vS@65Zn=hc{GnyhvBQ|xFErU1 zn9iYjKK{qDsB`8|W4|#gc|4OP4(e&+CqGrsZCcSaXa z&U;lGhE}L6U>vd@7*W^RyEvS2AvHToN_03{>%ZTLk`+Wh+@HGX4J@UWV7Ah`^|PMO#dpUmU&;)F zG4?t#nv5(w;mBypBqkosZ#jZwBJsaY3^aO$^kk>U)pN{&n3S9qKyA;(_Z=DS6FeUO z{>W(hsP_e^p9=mL9nn+NkILn=gJ1N_qwqx70IIx`fKIY`b;iybq;nAA#@qFOFEWx$M+;Xe&wjB;Ut(#LA2qmEkrt& z1p0D-z++N@bRV(7$4U=idn)nAE=xr2~=;tHm09Hu7E7aQ;K);4Nkqiep=lqUOz=a+aI?= z>Y~{@?H3qF?)fF}C4sv*kZ|`;G>-asEp&6o1SQoUVAk&Z}GDD;pI`M zc}TuR@yP^>qKHP3SFWx~1csSO{D&lo9Y69&BLkH+;pJ0=j@lN!#8`d~^rR8Fj!$6Veb6_N?VRKr@98(Sye%#r6TPqc z{&Wni(|K7x239A0f2O#q3^)P}hFizfaVCGb%cWmPuQTIl(XAU`$QQizwdv0zUvT!% z60oVJiFl`Dv8XfciB&W%pzsxeu^{3s9V|Xkm2!9~9a$uPR=mf$mS8dj-50A(sJs2= zext0$jGKQxOSNWd%=pPPL9BWuKN{`xX9M@S_^D%~5vOWhSub2!x?);4)qW|g^_3E- z{^REY_XTk`5@VHj{j+=uoy~OQxKLMd8)jQ6eyuo%(m0dP4jqH~AU&lxL zRBg3EQFVL&I+I+RcrlBi?1UANT14|oN?uDz-KQ*p_aXABpq>NrXN#8y(#&nx+xV=l zXtdvB9Fl4+!E{Rk{F?e=QVxNn)#v{K`ps_vJ)Xs`*dxc38wcbcHDx2HdD3FVguOTc&3B%47R(wG3PeNJD(h#G5Oxh za8zt9%50V`+Kw=n!ajEuo6E)GnQCtWm*Pqsx>7d2Vi+zxAGwx~!{hd0(JlvPW_bv- z`TQmiG-9QqaTYMKV*UOY%WWM@J2^2K<}?T{H{K8C9C_KyO&_ zJ+4*zmbJAl?*3YRTYTKGsH6NrL-5_X@`Icd z2P+e02YAS4ny;$-)}*}ffHM`CA5?x+t^8Lhzf)44;B3Ct`&6pU=;e1@6N*&4ul%Gp z(TKwo-Z`^jAt%6X@Bm2lIXDyDB3&Q_1QssZ2Z8xqOsM&5j~FY1*``Yo?qzS zVa&|(|5$8o4Q`Xnr5PEbaqFJvXdKVkbu?kCgn1oX%0QL9%-=&whQe*-tTv$M2|j6) z2?&gUv1Q@VG?4h{o~UCCn(bp)zLfcXt_>J(;1O@Gj9d1ma+HG;D;g2j=uX z-potpfTGhEyZlFv8mSS;?43*4bJKOO=SZ=q`LHJy4H71>pdaP5Z{L$KHjq)%Y75#b z=Jro*2PQHyqD!-b%h@Yo_v{GpX|)tTWTOr-iWD^iZbSUJGosGJpCT5O7`iZbJ3aJVMvJnje+id2lhcaqF-tnswX}jtpti(6WnYd2v0(@p13Q6<5x}9U)izu=j@l z+9#PI-hAj}r;nIqz!5PwJJT((BVQ+}INIp{uzzide|HwH{S9%)|Hs^$z(-Lu{o^~c z+cUkJYXc#WgoN4UO1M$E&k2W|5)n@j5k)beA|i?+i;9SMJh1TwPkx^Gh^)8aFrX;n zqmQBwDj+H-C@2a(iu}J-J+s+xsPFs!|Nr0n$p>bqr;qCD>gww1s_H4QQ534z6bQM% zVR!0IkcTR(ArOfRVeudX1XClqJNk^ylO2}KvY=xkJa{;eE`o0mztOml*5V#|Ne}n< z1>9>BJ*daohz}<}t^-M{;l*||0V6hu!lVlD4D(=Q!8>@i;-gQcG!!t+(RQwQBj=G* zSXcz$+&-KTc$L&6B?ETT zA)E<$W9|1_pR@jVJF9Xpw)4;XA9a%t|EN=5|7yW!-x#78zk}FpPPGdfpP%Xvq)nMN zk6`tq)KuGPg}H1kw3 z3J%~)8d~Onph0AZRGzg6jKRi{E8%qI8An1~!0v?QMp$BN@j*`??7i9YAVc+@W)~)W zhXBF|G)CUui?~i|Ulw#7oQPo=gA`m33l><81Ac`qq+1FB2YNAd2$j+)K8_4%JL8c! z5j@se3Obm9vt|e9SOG@|8+HLS9LGAt9D|`w@%Mu~$KInQ3zfr|2(r{6u44tN$0c@b zglCdYrauU9;UQAD@K+5GT)KWl(IACX1VRjZrjd8aP-1u_d!>7qusRFN4fhFU59eJ1 zIYyhw*FvG9)9nT{8eVUxwP;9no^H2n|0hV$y#{@8Iq(lCpVS2KQetqm8cJrmS%wa3}mSFnp4TsF+AGs9vWvi9? z^irHUdH#+qFSDEUx5ycxHO4b%I38?VVib1gnmW=~J(B0#) z4^Xwbe1<(c%;s^pc4eOmUT)u-Pu2PcFi;oi)%aGm_;R~zw2DcnZJ-)9-vp@Ibvf`> z^N7m0!Y1og40g9N1|Q@Poprl%pu{&w_sr_@oILcK1=feIuv>H!6-Dv9qWDo)!qlZ5 zwptEeU_Jv?G`JU1gr}5d3>>BTH!*FYjF~tVb5(q%Jrs`%X4=PCs}*pPsdBDJb04$S z#+mjB*dcbf5)KFH`uCJk{}Buc51SVb-4}gs=2aZ_<6lOZ&^8OP=;lDWsY| z%g*U?q{+$P3JE)?-W=7Sa!nMRh-PhlVJh^v1=h8O9)xeX5vyLgXEDrAx@IzY!xadxG%_%zjv&XaGt zBb{y@%;j3^NSJ9>N!D4u=_#H0;ng!eZEVuZRh}KHQ||QBibASXsQ0h3o#D4b5aqRr zz3#$J7Z$f@aRAFF+e$=>!+HcC0S1snvmoxsPI(CMHjbAwuhUZ@bUt^r-A|obW8G%7 zOMX{ly<@1BD=i9WbM{JWu+dIEv(oC<>QU1$DF{`ENpZ6o$$b#pFl?R!7M&{qG%UE$ zi&Rdv)etId5eGUPSMc#Aeq=HMi@BE zdGC91FG3Vd`ayIuK2(c-5cdP1KD)$ND)-Ttbu3iVgj*I^aU(v z`j2!_>kaS)HTeenXk)j^z1_}N-_L zkAc=%H^ETERk?Gp7+$wiy?+zi`-X0|Z@|Y}Z?^lIKR%@1zqt<1&pGBTOfZP2)Nm<& zmC}9@oDxz*h;764&e5dD`k?ErY{$>D8>_y{Y^gm;Hr--BOVY+|x7rh|1v^`CU7ph>UId1)jQO-+Ywe_6}3{V(&5>>8Ez!=?y$?vn&s-9I~XHKgZ}GI zVCm&mYV@6)Hgl1Evij~$dm8#MZoWO;_%iwNd^ zoHzL_9X6bmPHtJ?_f>oXY0&RI>iI|PlMTd6dlXX!lvDJWU1GeYx<6+3HI}F=9>aO@ z+v+);xc)JF0unnv4vtclJo9n8Dl_MS4PIrB!)8ovxNE8X62b?)yc7=k9$9u&B5BVD zN4qx(XU>}Bi%CrM{N0!fP%{uCU5L$&NyePf&s5G!_GIfmjwYh6ddWUI$Dcy3{*hey zl0DlrZ~jdUcojskM&0)+EP2)%AM!N}=$fSanw??du^Cs(bs%R@!v+}jBC{04=ja7u6xg;Vzu=VvMxTLT0A zHLAxN?#3Bw?EbANdjsUS0mu4=(*e6Lj?=qj_ewIsJC~)eYP>|-B-gF6Lk8OU;4S+P z!`h$|KVEAqGoQi@Ktm3tDxp?`8vQIeXPy0fHcPP!x#27+5TXYXPw%hW^c0Z$4XSP8Iu1;AGz_4tE{5|6&C!KK!X-n5pzX-zaHt2^Gb z5(6l-i&m#VMP)=k1J%$5oWmfnk!!Of2A|>3hyjxFRb;u<8GZu_0U2oS_x9U}m3I6O_LYYE{Wj62c>lwEM9mSZP|eT&D}L{MSPi&c+)hX) z!Kl}rqMa(dLv%-V&rC!JzzgmW;o|KN^O?6_esfy+Paalx-XZQxD?h!{Qp3Ua(J>HT z#WBf#*ub_h`ZC1{brA2TZnU3c^ge2xdT$qw1GlN)c7Z;yXz#Y&u9wjr_L4k#Fm5hc zNYnqkpAcjs4HGCz1*RaygIrHRzJR-Ct$KSm9G^z0uXbaZ+ol@*2=`5({71Wao5xo6 z)xjbtre;~-ft8FI-|h7-{}rEZS*iZVVxC;o!E zT{Z6)`(*Q}U)1Jbu=tKtk-c_Dzl|Wo+q5?P0rlG80Yw|eRcr{7=x_LH>wiFho)lae@CC$6YH9N_Os~O(Z9k{3t_f?#bzF{w|=!p1V^}g z6+kVBAUm#L9D$9c%K4AI2;}l)Ca8?<9A5A-sB_{6L#g>DO z-a#61mc;N*0$GLo+#CoudHO3KW>%?1nX-PU0->N(?21qmHRYF#Zei?G0VmBdI(vy% zpa3WM)utWhVR*`d6>8=mcI%d~v*#uq_FlzpjMU_thi@{6nndALOS}HC^Rnu+q;e0~ zd1EWc{38mrE@l#0@>2^|+WACt_klXQD_sM3c5y$6k0ln0Zs|9Gaki$G^mr$>8bIbA(+#bF>%)K;@2rK zszK}H5EKLlc#|B9gA4;4Hf|5`QJkFLQ09&By5yDP8^>EA)uoOI^)AjoMJ>5#}BIWL#zg>1tjd7h3*m?Ld&Sj(@0@av0 zqf8@u2t7H$nH0ciXdD(FN0@94d}wf3pGG1i zFr08OF47g7X8DI!J#zD7&yY<{~c!1B_x}-C8-L>Akb0h6F03xrBsB} zfvXB0*mruV>iUo@s<#Vb5wu5eZ-q5D&5T`YSxAm=2=WbvO^Q6QTrkA) zdAOf!Hez^>0(-=nZiSj}%XlmJRgoFoq?@et%e^^0_bBg{wehXg8g^$P&J~=!i3NxNi zU6mRfmdy`8lkX=a!w&Eu9H(aT;Z}~0e=?IHRRGv{E-xIkTF|nvcQB` zGCCqpFlMSH5$O)}hd|@>U}Q2QffqQUAdnRA&qm;t&V&dr7z{#cmkjwRBbBcWz@dyr zsyrB}SWtNp^9mmksZSDOu>Cv;F=00Dif1M)nv(df6ZTNJbj z=pz!)!RYg3Yz4`sC2XIx6+2B$6d`Iey9ZE@YjqFM5TQ`iRj202k_7$y8Qg-zp8Nr@ zxxlY+F}9tlAS(nIK2vt$v2_>kL+Of<43=NVvMx1u@s%P`rVD=%=_08)U!{zw%sZI} zhDfXS&x7DF28H^IC-s4Y(R?P-;mPMuvM6#@smW1U(srMLVX%jDR10K^Q5GMO`!L9L zizK76RRXza@&Lj3AEW}p0EVi}c!3uj<4!Y%JO5%4EV4y9H*0%|fdY^|N)JL7 zci#I-$TFOvjXIlaP{2X2szDWL6QhF3z^$+IqgI^r97LE^L=u|(X*)pD%PD`t^Ip)L zh)kLyAZ;)`>d|3GpC~Y`X~HmVMb18GxR1z{4i!6&Og+GCgF5{T@Z9Re6QG)+Ecm+M=}x^K<}COSoFf3w776+yX( zH71$Mr=~-u&LS#OXUoILJ1kqJzILaj1q4tBGU9q9dB$ZsoIF66gYHOcs;NBFQj4jkbaWhL;8!r(d41 zSV9gCs2swgLCVGw&2@GCaoej$uh-@!a6TE@@!4S0smi4$x zhVGFuVoltDlQRj?FZMQ&9TKEiO(B$&3MpjLP)w|a*MuFP2Qq}m6r?zlhoPC*W|#o< z!3t9!e9#TDKdwMQ97(aK8ZBj52hUEM?0VB!8P82yvM3umRZlk&q*2jL6K|~LI&jb@ z5b)i0>UqC7Cvl=(szpOt4i6L)hqEQH&q8E-GR6bav1cxEh^}ip#0#DeHtSgY4v}P@ z>T1+QU?4J`LSQt=wXs|$2Lcd6?LyNM&xAQR>APV}m!gschW~#;CW!BVW^lWzj5(Z6KqMS2FcvrVOXV$QUh4sD|+Cv(!OWLV4jD&8w)D^T4rc0Mh5FomMrZi2kw5I!UFfKGE(-7<7!^g0n-=AR^K!|pT zUJQxQ2i$MO&#MWD*pEhdopfePx)DE}>ZY|ztuB^bjHo(LEPHpRNeYua8bcpLUVhqN zdub`SF#|YFU0fpj4kLu2oS?Bk98M31QrKqDv=zV~P-;0@d_D%oexO7)XsA2F3|uo) zCc^cqbrV_C+h4i>LP~n}all-VGkZYQ3Xoc$sZw*ANN0#gWd!n}R7SVkqFKKyloxH$ zrM9)9g}@)_JH++xo5)5G?HC2M1WO6Po7R6GhNM#c$1#8bf6|z~!8u*aR;w+jO$9ly z-4$t*$!f{dI5a!>8V9G&XZ=i(E4GQ#Smm~7V^G)r}W()@*n7WkC=BdzRCJ(U@k7en@#9hXD! zSR0oePe>o^y37N`d9ZPO?R6}Duyg#>)L^4AW+}O9L{o{AYjt^3S<;6tAE*7KhXK0E z90cS8iO{V?IVqnwZ%Gu(d2qo7&6L6x4}MNTHxVntPlUs3g<)+C)P+@LGua<#d$yT;2alP}Ss?DJMwQoWl33=PK5Jv0l@i7Z9 zDihLaL#t%b!*leu%p)Ox1^hD=Ja`T%QqF}314?-s(TS8eDs~PnfQSr)igEuoz8e0{ zpW-WdV3O@j8pPFxGx6zopu7lXbq$?BxtI%gj0x;7pfXy@80~0zWKmx=xWFN68`O{b zONuk5qyiG3sZ82Bhlx>5iZ!p_6J6N)1)PaAbf$A&YyxKF1kIcS0cQeQgSR$ej^Bt> zQ!l`&tyZ_ha#^X@{YonDOk^YXx^(~y-HTLV)RewdaP6qjhuq5t@u@OaNf9TC-3~BK zpWqZdPAmJHP3)I^TgOCSUKSt z=&`}rrS7=cWf-d&xLEaarx8XIJgGZf1ejuU%6&~XZ0vN;4h0M|2(^FMX$1+ftTNte za8?Mk7*p$f##%67n*xSGbfrgXzR@T+9Y}r^^zb8_@aQ-lD=FF?JyLv6 zqZuQm9xap2voV`d9U%qWN2(2F@Ziz z&OmR^bjCUT0T(PXGy!;I&;s#FzGx*o;zq{-bdygGa>a5~acfWxH4Zz(Go2HMvO^21 zLTJo!PR?Ki%Npl|hh{~93%si(t!0A~bDW_VDa+^V&TzVY%A!ZDe>{i*v37tZiykRK zoruI4LD2^+dSrPW22rTOHnJG`6P)vDLQHTjsEiZm zV1~(o;~F_L24aDj;WUDaG>A?LvR7r{QI)|8gl_F7aOo#LM&xxHfiE3>?oNXG&!PYO9M-UuvOr zE~aCORE!qJ^mH1TOZ{A_B@=UG6R4G|ioQZjj)->(#xJc(NLj#~lOk)K1UPbQBP~z^G!b?gsDz-N z&i+{@-4%mLz(D(JAg3_QwbK%L7~~WQQia%h2Ronw@F-MJueLQxK?O1mB&47MZ2HpC z*r7`T8dEE^0~M(%5O5_uW0V=OgFOv-XAl(tG3S9`E~j|y1WN@mUK4PnxUdNjQe4#42iWY8HnBf|W;i9lAw4T7KHPWY+^R#Fv}bj-tO0aM3Q3nV@?z!vpRC#NkWNM^RI zMG`-E3QHt6Bb-SxQG5dWREfBWLcP&Z#s=tHA@Z^1MidZ)?{Kr( zDC2q^q=957veCH4f5q?Lwz5r#<>tGcv1v!KkZOLE?8S>B1RA({Fp1Nn0u^>f55PoN zB}u%W)~Ix#>!`~}drOMt3A72A08s}Ia265=hda0|mtxGE=fG)k8hx&e*|jV)K|k>c zca{cplT^4TepX?{8iD5$JYlg;>wc^cp4$RCRPZJ|hvOZB18fK;pg~j&HsWbQhwBc( z;iI-+XsM@T^1OlWh3X6>Dsi?5<32h(*IAEH5CP|P!M@&%*5wcc?9a;`=a)l>V{XxF z5ccy_un+j#;aUU|aV7+H|OrGtcVFN4Mp;fe4= zcoKLLo(Mm6TdOnfXbg;(x;eqePi=e9CbDG1-{KQU8)IQysp$mb4FiF;I}16;Jj`~l zq+dAdV<_2R48(x3$KQmZMI?$C?v6mE6W6B@0M==$f5I-uX{LWtcQKc6gD}y?Mto>e z`vF8d!71VQgd05c6vHtbgs~yXc%qh!&(o4|Jx?+w@%9kO_%q_K5WE7;d3;jhOy)C$ zx`Oe4P}22|KX`(iuV)AtO&!^|&KyApXzGWe$dpc#Zq;1WMq4&L-40g=&k;`sgSMUy z)Dr%_IjT$6ab&}AL$W53Z-SPiCji~fgjypQOy~HYLg7nyN9>U8Qp4CVzuH;0JIiT> zC`+wU8(7+*LR1*X*Cj)q0g1%V7@U<)!cLg4R}O%qA`SpCRy;^vgxfB?)jn|iNg=Nc zJhJdep4kfsI`>ma%7`L43`C|W!r3c+2F1tXtl@zM)XsGgRH z(&a{#)lD`wAtAQzCYwY0Ilh~G?qH$tIQZpyRhf{eAQZ;C%ce$-8rWTShWp5s-DN*K zmUov|VT;zUhm3b1;cDn)@_G0FkT7-i>En*rxNmLhm-4JlxfHBTm-J$5QNL6p^-&*@udeGYdPGy3AkVu_ozzFR z%HF+#mt&K_-@ZcK(nmglR=f3;r>D8@tW%5n$|2^HYt_!alKeMYxRM+Sestw|#x-h8 zxx6JC9#^!1f(%FtgW6XvC;F8)@+!ZepL_(7CF=JFie{<{`h#v~syq72V_*rrroZfM z%u;fIyc9Lg9su&KQRYB7-me783x;s&K(3_WvGQz`zVcX%_)N9%SlJGhymzeZg-Wsq z$&09xLGtYEv|hs{L7h`624vs(2=|$BcI_kTrAl!ZI)fp*1wL0_OcJxqdbP!v81h}I zzPwYkI=E=jd@&8q1Xc4z@1Xi+kZf7(MFsSS$BPNbO?{wL_rY=knp!wmwlzLh>jujb z^m6B5*$@vgM7EKByXvRQL~EZyNJU7!_b5crZ%|0ZO=75;J45tCjmKXpnyBqF#0kb5 zs@LVBC%M*Kak*%NPke>#tCx%0C~d?Q@bTKKHV+YnUHrBJ8MvaEY&)w1zHMhax+vLj ze}u1PXA@g62ah}?^sIC(HF1b6F>m@s%^M=itowd}A>T-q93o+>og6w;j>Em#$)|>c zkr}Tf-x?wBGhuUk#u(YSi1-0t96+9G^Wdv$x|`sN&Zf5aj|4H)B$tnrrfKX^t43k_ z_nz7@O721F%_mAS{r=-b9RJm*Mki5L)$=5|0$C26BuAsb=#%B6#!E@#6#1Zm)J3O) zF!v-gPLn72&7;W7FpBWNjEc!pFaTKvbE3`h2OS%!wYj>nx-NWI`}IR?eBoF``p4>_pVy^x_BeW8r=9oFxUlqJarE|lx2qVuOx^~txU%6io5#)}b* z0MBoy$rs36df{}CP^Eflx}1#qTU;t1!sD$=F)8+_eV5ALk@e@xBs?+ROYWa3|6^jP z_9f(l!lrxeL0)Qijn!Vw9x8>ZSryJsZn{>6Oxy$V)pfGeH@GJ4BT?R;8+CV^Cr2NH zFe8YEMmH|Q&I`L`SKqk&xaORsx1@?Z&dIC?oO2CIW^hTOx9AnB{q-{8&wigjy?VV| z1gDI#H^{p|X8UfCJB?Hy9#}4$CUb6<8AinxGpKL21y#dG(qMyS*sBmxYZnI)HTA~} z1^^Rx(m_ERssBi9i6S%)9*t60)u|RMtV!hhu)>;kFoOuXhRVN19!=izLvMkWbf2oa zMV1;jtCwz(L+MIm>sFBTKK0zKvb8!D|CyWbR;{XJQwgT2z1HyQQZMy6bZ%pn>>s51 z;&;l4NAz-pnb!}-b;;Z2%i9c$YEuQ)hr;t0fbgt0OcTc2s{MK_=9v6V{w3N21Uj!* z-;NXm)Z%}M;q>9E6GZ1UcE3RVcsCY0&o9jjS&&B6Wd{rLZ zDSr^^_+Cuf=@6ZOkP#>n=X%`bM3in|0&+v%cSLcbue8OK?$(=E1l*u&M;Fk@FS!nH zIk48{w>R`#Sih~KH|a+7+eh>kaWnMWCjFMF-@esvS^6!phh8(>Z2fwG-m(zMkDIt@ z9^T;AqTd$KTZWsf-yWv725vq5_9DIIV1eOstLe>l^Yq&~ddqbi=(jKEE!)l4Z#(s9L2ySDNlTBb7PBsy} zL12R`Qq(+f561%7mIfQl0yIouL%W5UNmr%AHi*FvXPR9owF%idLx05p6WqW)x{0Ve zfSsE_M=;?WY~>o}jI~WJGB+S3 zRg$GGafHUy2?)D@8qorWqJa!>PLKdPLA)Gzg?9}81Ui9be-Nb($VyNz5P6@m8X`j# zuVoxd{Z-4b6#J`|QN>|eMyf_1?iuh~Mtig_pwGDAgePO&K2z{$8a@yo+)1fj2nrDg z%XE-Ji+E)b)8xNYHjp4y17?+0sJMktLF6!D!Qw!Y!z8eZAB`%b5|ijkQeqlz0yF{v zGeQos^+<(p(r-4-Kwdowf=^?WDbcG8)?~VH5FzFef=@5PF`UT}H%QPrNTI|Lbp*F* zfY5OY<%S@_1hXPo5D~6XWJQq1J6DKJq;nt=;3tq<=Na_gy(g(Zz-dC9Cx|5)MjcdR zC>Hh@Pdq_a>oT>ood6NEhi7__ksR`)3c4&WLXQX%0Th4lt(j#a9X z1Tq~D7*SWfwoN@N^}5BFyUK4wWP?BE5q?DfH7zz3ioRlN~RaEy?KoLDz!gBCaH5 zd7zV_;^ySkX^~FGkqakln*%xsg>+gLY(#_L)rdYljg=!x=f)7ihz>wIunCPte7XUn zBEm_~tYk`#;5ANZ$c~33*@TnmjRX`Dl>AH}c0woUDFJMSiJ-z9kB{QP`E=$blN4^m z$Q2EOecbF%b@(WzOO)ccJi6|95bd_&Z4YYaCfez>)P=IO0Wv zFrG##%n<63%6}P03{Gm;`RErD{8%S@D%witMv4E=*wNn_%3vXp8yFFBcOJ%!NWk3z z?FVi%IW8oIBp!LQI^gaJ(t*|IzVb@1RJ{3Rat+np{6Zt{Z+@Ad@`6Iv?*j6uXV6KE z0IM#OCA za3ce-zVHx1&5dY|MSBaNxveDjzRy?}}9KL{7lXv*0a<2a zm>^<8MpVP37>__Dji9t7*xi86>!r~2K&Uo%fo~ofa&Zj`kf63o;j|=VbT;P@P?45p?RDgP7LkZ`E%47xBC%NP0O;6DTh(ge07qGQ#h z@jdtN{B}H} zoh{Bc-c*aS#gv>kp{($bgQ-=coE&i_vdnHM3e}4_VkGh{&linV%cvNOtV}b3wk}-OJI_o(*y2$cUH>9H5h58UvH>Hxj=Z z{|ovzqzH=!p!>e5XsE7kEH<<{65bZPg%x*yfSnj_+JRHdHfm0>I2v7gu~^(^X$&S$ zD-pJ7ELYHffHrXYDl^kY?_JJ*iMG#Fr)z@4wDUK z5UDY;AdDhr557`$kk*;c(0&Gb39JgF^5gXqdt!yURaU3LO zB^^NWFc3r>q!8J?>66dw=Asn>HFax_IH3kq4v z7JRQ+wW2YvrBc>U#y%^in~QQ=cyt9|D%QT8T+Vq=xiH=j>r>C~hU5{BIN++gikc zp4qKMp0Q5NZ!M-GDwJ#^IvP(UySEVrolo~{E4CQ$Hf<*cp@oU<#MuDz-FD()JlytT zf_^knHSI-b{kyR$=)j%9Xa1e1=5`R{jaF)V2l0sc#Bz0OM={Z`)xM6R#M<-~OO`E< z5>N3-w?QW_K~Sc8u8XLzemY8=z)NcY41>0_+b{;nla3Z~1Fg+CMm%-s*G`?p%pe^W zKHn8x@rHl@O(Ii?ZsJP%FsGXsPtPm6W6as^z)`Eai`MG&?xG~^!{gn>-Sql)579u=){9yX2>Yu$usc#eEpGt1l(bBN`vP}f6W=>HT_CbWTTGJUef+^SbGX>dv z{0O;_jvuSvQ+@l29@$SmT5AyU@T2PbzG9(YzPBsp|3#a-T(%#%u3XHZgI=>AW{cPQ zTvz0%ihiP547XUDn2OL{VF}f8qKWBGzj53HxlzsUCthgj_Z4ed+Rv!R#5;ITHU%m$ zHmV!@i=)kX53B0_++zfpYp8lo5Kjmp8e1V+bY|B=?r76W z5I2NwNdh^i6j2JD6nZH^=I%&{sAGqVrba})H&hhCo(|mxqrhpGtW>{Oh(;Z1OCW%@ zUt!Q)4ne_h5PIV70f&nrW=H?y#ie!n^6%pzYJ}9_k(d{I)wGeK15NmYj1lHj8rdNr z%Zn$7A$~|$-&n*832V|k-=j)K5e4Z`)$fiH1;$qO%_#A^5lU`7QH(MEyzrQl#l?OO zLJC#sRUgpRe|NHY5Y^v!3f8l&>XlQ(>0pZmr;1`cx||A=uj|xPr;2MSGVjr+iL>ar z;52a*I=S{VaSBQ{8_gw0jpkKt$!O64C2K~DN|fw4Ml?^0&FQZCczMA6K+7R})$4oB zR#|nE9vvgP87tKnV?^)9Kd#c3&U#>ftLGJCWeZ_tgqnAHZ4~csP8SrGIW!hB(T}S6 zSn&ri)a(q=-}v*2fT2d}zHwr-pUp>;*B+y3i>iMn)~(&@vNHvlXU#tog6>jfj~9yK z4=)^#)d0`XS>mW7Y;a;IM0T8fTEoWlV2DRWcdO&i;^G&aB_^Txr)LQ_&A7(LjvCS2 zZlE^oHKXRLkJYHN#hA06f0TodW_%YB1_w7aybV39ErQJg<**?ENiKvC12V^6oV4FT zdMw2KHxEPhE7G4~IPK2{&qoXS=<=O~hRT_Mk*l4TXC8G3ODzlh>CEoiMfGhPY@oJI z5W`gVK#|eh1IROX_W%N$=$a0Vx^0-KA6bZFjw*&ujUFiC>Vb1aec%4`2#jRiIn0)u zoh$kswG0Oed72MlUNay1iv>X4eXcm}h!7rg2!!=Cgl1n4gY0bStw9Cq^ogPZvl)R- zkNX?!E8%k!;r<==<)JZBXI#={gZqe|X&%;G414e>ji7IY8Xb-c*? zuQR&?=ZO~9!uQFFNg3~ji`3vs5mOgm0Eu9=id-l<;L+nkF&Xn?@r7bMuC0YNbcBz) z0xn%L3dsyt|Eky&@P^gurYWKnj~Aw34zIrJA}XHjcoFy;$`73?Mo{^DC?+<6`-ZtZ zEGDS@b5pUct5NSv6-!Y5%8Mb%tyT*!#`sreDtkr7bG|?81yQYcZcx;^}s!`z4 zOYm5&&Y3Qn<8jk;aT*@qOcxLR1)V*1DO)GAs6YHNF|FujETk0FK;pqZ{~;_QIvTAG zb^H1iqWxdU6l~CX;!JToO}Q&YTlLEf(Lsf-6b(tnDZUb$Gyd?H_u7h7_92c@%anJe zI7*#43%y*bZk;6x|Dv^;S>l#l+H8RYP>+Q*--uSL2?=o)Y*`!wCg;KEQuWV-n3`tQ z=4#_v&^4^F3yg*8+S#Jae0`Z(GF$WpcpM`+c$K)-C|7q}1q0lfYWYdR}zBRSPv%)jAkuexil=vlZn7&4i$nzOVSWvCfsSJXFC?VKx){tNW>x{fIX z*2gE9yBDeE^Kf;Xzk%nEu1Gh{6!_8h>@z#_0X*Fz~?E@S||0^^-w@8RarNP zWB!6n$KD`rLQyt>K5&D$!gyI-aU+bRQ-jD+n1eU{9Y7ZNFksVjhI#8!HTGr*xXabt zn?>1Qfbq`FyhGsGg3^vsw}>7QOc|&PaIeWywec2Fau87MZ^gdc6W4t|I&ZTBl`wC1 zF27X}P#8@|<==*#MtPMu*}UT+b#E1D5>uw8iZ|qbhCb$!ht$cpK^R!BF1ro#%2M^@ zZ4hcSHquN?F^5@sAfO9qrruc~I+ApD08icA{q(y2ZqdVgHc@Tv5n=tUjT(QCm`)!) zy+_<$cjjDnFT4|KRMvgWiF({8#_$!DybHxTy@oUakKZQ-BhT*p#3gu~d%q}d1g3|O zjjZwrx|l(5aO@2&?#JMc7o9H=rL6s3pe z==Y#F3ANnwAZA&O`s_hg=k;8O>0G0(Sjb@PUMQO2Eq9T~ZwzQ~6ak$z1Yq|*{2y{J zho}t|4It{b2pqIVJ+MezhDXDPK)I{cDG!NB-d&t&fPL@~#Jbfg>tQhikLw;57axj@ z$Rn8Ht5v^8#0{u!-6O04$aoa;G`8uFibwHi@|ZXoSuTA{==(nFAoI7!P-3;}`nXtX zJgas-4$^;Cxr;?U^u)+bc}v;k{`SdMuB?5)#8-asHY3`UuBg}fddN% zvcZaVMM7&zXa(yLrwv(MwI$TwR4txHCEb^cW_X;j9QxnYYUy%pMpmmfE3o(A#6oq^ z3N)}b_dtxr$#CkCWkLl}0FFcm6r@E7! z-v>z>HOU$OgousgyFMTg)xSRwci?g1hvGV8zncGqIGg(U+Y{W+&QFSdxTi|EaNNR? z6{$MOL^T$Hs?*e}PEXxQ1~s4ukOe$4T{^`evBcIYPaIdV$}^*g%w=%sKq}7&eI(hyeDo)n0qGVfOw!aZE^lqgJOLLTHpM?RZ?>~CV5unos(?G3WM z&KN<;1$31xbu%a?CIu=2-67!bBqZ{@#mWqGW~w=WV{ST5VW9X0dLNE_fR}7sBp)2d zn{t{3?nZHrg2p~R=`z-ni}MB|~|riV=x`y0njU(rH~a)%{OHh>57=)1pfbs1A39yA)-T@wWeI zaYY}Z1n^P~RtCUw5&3}3F=#5n@{PH&a9<5l4@eZHnV;cWJ!TD;W7R3ymk7lSq zBdMxWm_^$mUM*4tz~vdgWI{u+@-Xgh^(>4iexv(YOb8^$A2<-a$jM64fK7ll^9k02 z3J$7=Kx#9jV}Ndt80eZ;A_lk|!8_Y@pTa?K1lR>F5D`)v9>k`*6giFvGG-RIG%SOX zvzK5Yg}dF`&w+`DRnLEjjvr1t@6E1MA}8xGjBc zL)@nw4{JHnI#61BLIgsaNGFdo_jCF>Wi;M6e(GUZ7+4BUkKMlM^sBWC0q%Mjj;Je)n}>1^Wsc6t!{o^3~vu^PehUJG$3%oPF7{S08kMeVR|Bw;B~^22-el= z^rhm2qA*~jFYPFs*BxX4;H%ZzrJ@)N4fOy3s<;ED2kOe37SF9jD*&kgFF*sz7G8vJ z1(T>}H1YasoBN1k6AOTMYo&8E*j*4=LDCo@hA&JV144b|G zVnbW}eJgRx9bRn4SOKa8#=?%B!dQXE82V46nBky6*UH%7 zlocSzz#EDbEqJ5=W(t%6Vft(+kH%Aaozv&ApooZiW*Nk$h}yPHEXL6WNhExxgfI6e zMFEcJ0(vyq^aEdM0ke6+GFnQz1nO&C_0*{P6ZA6MDGRjaae(a&AcF&>S?K|VQRX?T zxpT;^#xj+tfLQy9M9|%Eir;9)m`*9@9f?#l_+)*Mg8#4-Lk=mL5z(Tg7Y~p&F`_J@8(8sZ zR-}qw5{)#k)zm`gnSfVMGU_h(fDSIfVljiL+ek8*X=0(XCy~gk>5n~I3Osg-iz6`A zD4YY>A(h`11gpTDBU?XABN92N84wUm>}k?@X2x0S4X!>?#X;>x?(lbBjfT z!F8L(RO^prP((IRv$sGdcDCT)=A11ej|$G*f=xYZ9`jUki|9*fzitu7 z_-W-|;`f{C(l4V?_0|Q}kNEQHh1L%}@qFqj>uJllTb=g2)mZ-i0x(Z%qgl^eg*0UM zJa0AeQgLbW^5?DA<{wMd_s?5>(#|FM^bji;ogOX$@<4qVYS2>aKKSu|wbbfJW6*)FrytHbP!y+#+T+}u81*_GeAMSWT-HQ*cp;>Wt%<1R_6pcs5kOGQ_q1ZuHy{vY> zVD$nev|nbe0d?(LX5s81**a+n!}@?IDogEOW;Ii%y=Y|+!62x%y8K0}$oN3r^`g}_ zEl*oBl%e)7wF-PnT{asB)UgE`?l2# zXX&}iWqswW3Wrp?<w7h#Cw>XT0aOpP-B zZJp;ewuWR^s4t-l__xKnfQ{BgxZv@&jn*9G%>N7^u2W}xhJpW5UGbTvUGQ<$_Q0(A z;GzrI1s_+MYb%d`d}cKb14amt@J&*&FBlL&7gvR!TisA$k1wp|YR2cNZi|}#Ik$+U z5oqJaFD$ZI*!_j|j|dF`JYolD-Kd&;W;yEJO;#DQ?A>JbqdGRzIH+qkqwibPmz%98 z@pkJLYwAJe8mXpVTK(~D|Ca#ZhA*vF_&sE+Ri-}w(xRvdNFSz?j@55v>XoflYyAFZ zD`3Jw-B+Ap&Q}&?c;_pN^hxDkTPJ$R=6D1lLWX-NGT!@|@&D7;)+m(Xj-UUH)$$M^ z?>#mYR&RV`l}5fah*7PPF+(l-+NuvVQ6VNYYF~~I2jkk=#?|+y$2v7}n>7HfJhKg0 z9;>!(vpV5Xvfb(e44t&yT5!m4@851sL%FHnT75vJ|M=EwVHjJIpL}PHH&C+YP778q z$r(E>1Ig-&@2#1|2zG)fXad(kolU>?;Z9{hwGH=L8qsws?*~TpsXtg}q5Nw91gBI9>UbY3I^kEz&5y^(#TCvj2l`>r}`85T4aV|FK4;!BZa$q(*)CAL}}N z8}plWGIB2c4Fft>ZTQVJj=`5jYwohsgs$5=IRzjZX; zF5i#IzeTD2)|q(wmEP8={6DNIcwF}fXn%|P#~&czv8wa{9wXEP2dswpw(Nj45Rd%_ z2-EYM+ou{e^AmP2W9{|iWa06Etu2Z)excP3K+F;lnP*d2nZ$eFXnfA3vY#g+S z_{Il0=VSbq+(8d~JWAMKU_|R#_QOPB%WV4&GXd_&ZelDH`NGlvf6qd;{{n|$_MM{z z7BF2q+DdJS*ewY@c#`TnI3WRPe>a4J*6cn#e|pAjT#;0#WERwov``?boi0f&a5ueY zs%CyqHL2!h*jbgF^9VVJJ#tk!UX{LcUQojT`#>LP!TJ2}IbJ9HPG{45@<4`tzEHdF zm$NXA7d{|K3yVig&3F*eLcHHkKPVeo+dg5lu(uyXaEKb!a-jsDP-iccS327A?;N?gupdlsr?VhZfU9KKP=Bg4evcH2P0^4!6Wht`uNPFvcLCi zMc1`DkIBxe_oMQHBYfQG)!0C-{Xep$>i)P~SU087V#$VOX%)xe-DUR0CSf*qG$h6S zxLB@8FV&+7j=!By1t}F_O$l9IbeTc=9PQi{ty0aOkj=XuR%%HTV2<=tUHyby50UbO zC*>N7x6$}%IW`DXT(Lx6La}jvT#|~7lZ-tl8<;>|m*)}ibb~tadAJ|l@i>$o@Vk#~z!UYo6US4&z+Ao;Ebb!}NLm*P#WkaNv-hPtZ8%2%CMBJNv_n!Hlp z4ngz4O1U^!`xQ7i9pSw^qW-?PO14X6Iq+={!b}-XK9Ear@J(kq&^Xh!x&d7Wh&?O$ z5yNeyED(t2BZ2|XGRQR!++BR%4ZJqfcVulP=YN>qWkK0Tieji0EHwa%poHoFhl>PuQPhdWP!YPDnpdu(D z>8|oMK^(m4g9eF^aOAxa#+@fHnx;#hQ6tRX`JlnhGRmQi!@Pnff=?PaQYCegMtxv4&A1h4Uq{mjU3d#wXz8P0U8OyJee+1A{?Ob>YE>D!=GY?T$q zCQI*=*GsrKtJ3#nzuGWmAHRz-`;zU};gUHtfAxFv42L9NOzQ4|7#<9gk;;F;l88$(iX8KK^wS} z3(OwCdJgx{Xmv4X&4F^O(v1#}Khgg~?8=m+@-_x;gqMDQD&)nPVKDy^6( zgPLKTQbL|TCix~%68w6|R0a4AW?@F5b7Zr^LK&jTbnbvaaoAILHW3(t5Ct4jTWFFH zOrC8}29h%(dDmbtGN5ylje1}<;Y=M`J-P}9Qw4mOH3HOm3@<(r>322B)DLtLWg9dp5`~jNa;+KqiHb&5{==YgZ@Arh)hm~9C;{D zM+vm#I*o}p)pLpm6*SOlpqE>eWmKKx-)NT$h3hA%`LjT3uKXK=oD1O z8iIdYP9b!~MU}Az*p*x4Kat65WsBX!D0nhCoWT362_8D0hvUjv%*~9&0b)~xnP`Ua z__5|F-ol+0YYF6*Qn#8=x0*OH0=WrwE6a&bMz;bn%pdi{XEI+s_66MV&;fJw60`KUIKC8x22>f!fg0Oo|2=kd@4U>CLNZq^<67hCJ z*_-9Z=*1VCaqCEp`fank8SM7@EeN3Yj{0(o9N&zb*LY6_zgrHy;XS|478FG+AGdFZ z)p=ja4~=J3@2zqX)}T#WQJJNF$73}47T`)s5JJ3wP90(CN=qb7y+SM`2p9l6a6b{p z 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%0Ap`nP)Dus%3EUeB=tzW>f6XhgFk$jE3DLT6Bc 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 z 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 F{{n1K4%q+z diff --git a/srml/example/src/lib.rs b/srml/example/src/lib.rs index 81a4a7a4ef7bb..8b5347d1a2476 100644 --- a/srml/example/src/lib.rs +++ b/srml/example/src/lib.rs @@ -214,6 +214,15 @@ decl_module! { // We just kill our dummy storage item. >::kill(); } + + // A runtime code run after every block and have access to extended set of APIs. + // + // For instance you can generate extrinsics for the upcoming produced block. + fn offchain_worker(_n: T::BlockNumber) { + // We don't do anything here. + // but we could dispatch extrinsic (transaction/inherent) using + // runtime_io::submit_extrinsic + } } } diff --git a/srml/executive/src/lib.rs b/srml/executive/src/lib.rs index f2073ff73878c..0fe4b9e33d772 100644 --- a/srml/executive/src/lib.rs +++ b/srml/executive/src/lib.rs @@ -23,7 +23,7 @@ use rstd::marker::PhantomData; use rstd::result; use primitives::traits::{ self, Header, Zero, One, Checkable, Applyable, CheckEqual, OnFinalise, - OnInitialise, Hash, As, Digest, NumberFor, Block as BlockT + OnInitialise, Hash, As, Digest, NumberFor, Block as BlockT, OffchainWorker }; use srml_support::{Dispatchable, traits::MakePayment}; use parity_codec::{Codec, Encode}; @@ -65,7 +65,7 @@ impl< Block: traits::Block, Context: Default, Payment: MakePayment, - AllModules: OnInitialise + OnFinalise, + AllModules: OnInitialise + OnFinalise + OffchainWorker, > ExecuteBlock for Executive where Block::Extrinsic: Checkable + Codec, >::Checked: Applyable, @@ -73,11 +73,11 @@ impl< <<>::Checked as Applyable>::Call as Dispatchable>::Origin: From> { fn execute_block(block: Block) { - Self::execute_block(block); + Executive::::execute_block(block); } fn execute_extrinsics_without_checks(block_number: NumberFor, extrinsics: Vec) { - Self::execute_extrinsics_without_checks(block_number, extrinsics); + Executive::::execute_extrinsics_without_checks(block_number, extrinsics); } } @@ -86,7 +86,7 @@ impl< Block: traits::Block, Context: Default, Payment: MakePayment, - AllModules: OnInitialise + OnFinalise, + AllModules: OnInitialise + OnFinalise + OffchainWorker, > Executive where Block::Extrinsic: Checkable + Codec, >::Checked: Applyable, @@ -319,6 +319,11 @@ impl< }) } } + + /// Start an offchain worker and generate extrinsics. + pub fn offchain_worker(n: System::BlockNumber) { + >::generate_extrinsics(n) + } } #[cfg(test)] diff --git a/srml/support/src/dispatch.rs b/srml/support/src/dispatch.rs index c6151d23903f8..10ef979b61827 100644 --- a/srml/support/src/dispatch.rs +++ b/srml/support/src/dispatch.rs @@ -117,6 +117,7 @@ macro_rules! decl_module { {} {} {} + {} [] $($t)* ); @@ -135,6 +136,7 @@ macro_rules! decl_module { {} {} {} + {} [] $($t)* ); @@ -147,6 +149,7 @@ macro_rules! decl_module { {} { $( $on_initialise:tt )* } { $( $on_finalise:tt )* } + { $( $offchain:tt )* } [ $($t:tt)* ] $(#[doc = $doc_attr:tt])* $vis:vis fn deposit_event $(<$dpeg:ident $(, $dpeg_instance:ident)?>)* () = default; @@ -159,6 +162,7 @@ macro_rules! decl_module { { $vis fn deposit_event $(<$dpeg $(, $dpeg_instance)?>)* () = default; } { $( $on_initialise )* } { $( $on_finalise )* } + { $( $offchain )* } [ $($t)* ] $($rest)* ); @@ -170,6 +174,7 @@ macro_rules! decl_module { {} { $( $on_initialise:tt )* } { $( $on_finalise:tt )* } + { $( $offchain:tt )* } [ $($t:tt)* ] $(#[doc = $doc_attr:tt])* $vis:vis fn deposit_event $(<$dpeg:ident $(, $dpeg_instance:ident)?>)* ( @@ -184,6 +189,7 @@ macro_rules! decl_module { { $vis fn deposit_event $(<$dpeg $(, $dpeg_instance)?>)* ($( $param_name: $param ),* ) { $( $impl )* } } { $( $on_initialise )* } { $( $on_finalise )* } + { $( $offchain )* } [ $($t)* ] $($rest)* ); @@ -195,6 +201,7 @@ macro_rules! decl_module { { $( $deposit_event:tt )* } { $( $on_initialise:tt )* } {} + { $( $offchain:tt )* } [ $($t:tt)* ] $(#[doc = $doc_attr:tt])* fn on_finalise($($param_name:ident : $param:ty),* ) { $( $impl:tt )* } @@ -207,6 +214,7 @@ macro_rules! decl_module { { $( $deposit_event )* } { $( $on_initialise )* } { fn on_finalise( $( $param_name : $param ),* ) { $( $impl )* } } + { $( $offchain )* } [ $($t)* ] $($rest)* ); @@ -218,6 +226,7 @@ macro_rules! decl_module { { $( $deposit_event:tt )* } {} { $( $on_finalise:tt )* } + { $( $offchain:tt )* } [ $($t:tt)* ] $(#[doc = $doc_attr:tt])* fn on_initialise($($param_name:ident : $param:ty),* ) { $( $impl:tt )* } @@ -230,6 +239,32 @@ macro_rules! decl_module { { $( $deposit_event )* } { fn on_initialise( $( $param_name : $param ),* ) { $( $impl )* } } { $( $on_finalise )* } + { $( $offchain )* } + [ $($t)* ] + $($rest)* + ); + }; + (@normalize + $(#[$attr:meta])* + pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident> + for enum $call_type:ident where origin: $origin_type:ty, system = $system:ident + { $( $deposit_event:tt )* } + { $( $on_initialise:tt )* } + { $( $on_finalise:tt )* } + { } + [ $($t:tt)* ] + $(#[doc = $doc_attr:tt])* + fn offchain_worker($($param_name:ident : $param:ty),* ) { $( $impl:tt )* } + $($rest:tt)* + ) => { + decl_module!(@normalize + $(#[$attr])* + pub struct $mod_type<$trait_instance: $trait_name> + for enum $call_type where origin: $origin_type, system = $system + { $( $deposit_event )* } + { $( $on_initialise )* } + { $( $on_finalise )* } + { fn offchain_worker( $( $param_name : $param ),* ) { $( $impl )* } } [ $($t)* ] $($rest)* ); @@ -241,6 +276,7 @@ macro_rules! decl_module { { $( $deposit_event:tt )* } { $( $on_initialise:tt )* } { $( $on_finalise:tt )* } + { $( $offchain:tt )* } [ $($t:tt)* ] $(#[doc = $doc_attr:tt])* $fn_vis:vis fn $fn_name:ident( @@ -255,6 +291,7 @@ macro_rules! decl_module { { $( $deposit_event )* } { $( $on_initialise )* } { $( $on_finalise )* } + { $( $offchain )* } [ $($t)* $(#[doc = $doc_attr])* @@ -273,6 +310,7 @@ macro_rules! decl_module { { $( $deposit_event:tt )* } { $( $on_initialise:tt )* } { $( $on_finalise:tt )* } + { $( $offchain:tt )* } [ $($t:tt)* ] $(#[doc = $doc_attr:tt])* $fn_vis:vis fn $fn_name:ident( @@ -293,6 +331,7 @@ macro_rules! decl_module { { $( $deposit_event:tt )* } { $( $on_initialise:tt )* } { $( $on_finalise:tt )* } + { $( $offchain:tt )* } [ $($t:tt)* ] $(#[doc = $doc_attr:tt])* $fn_vis:vis fn $fn_name:ident( @@ -313,6 +352,7 @@ macro_rules! decl_module { { $( $deposit_event:tt )* } { $( $on_initialise:tt )* } { $( $on_finalise:tt )* } + { $( $offchain:tt )* } [ $($t:tt)* ] $(#[doc = $doc_attr:tt])* $fn_vis:vis fn $fn_name:ident( @@ -327,6 +367,7 @@ macro_rules! decl_module { { $( $deposit_event )* } { $( $on_initialise )* } { $( $on_finalise )* } + { $( $offchain )* } [ $($t)* $(#[doc = $doc_attr])* @@ -345,6 +386,7 @@ macro_rules! decl_module { { $( $deposit_event:tt )* } { $( $on_initialise:tt )* } { $( $on_finalise:tt )* } + { $( $offchain:tt )* } [ $($t:tt)* ] ) => { decl_module!(@imp @@ -356,6 +398,7 @@ macro_rules! decl_module { { $( $deposit_event )* } { $( $on_initialise )* } { $( $on_finalise )* } + { $( $offchain )* } ); }; @@ -477,6 +520,39 @@ macro_rules! decl_module { } }; + (@impl_offchain + $module:ident<$trait_instance:ident: $trait_name:ident$(, $instance:ident: $instantiable:path)?>; + fn offchain_worker() { $( $impl:tt )* } + ) => { + impl<$trait_instance: $trait_name$(, $instance: $instantiable)?> + $crate::runtime_primitives::traits::OffchainWorker<$trait_instance::BlockNumber> + for $module<$trait_instance$(, $instance)?> + { + fn generate_extrinsics(_block_number_not_used: $trait_instance::BlockNumber) { $( $impl )* } + } + }; + + (@impl_offchain + $module:ident<$trait_instance:ident: $trait_name:ident$(, $instance:ident: $instantiable:path)?>; + fn offchain_worker($param:ident : $param_ty:ty) { $( $impl:tt )* } + ) => { + impl<$trait_instance: $trait_name$(, $instance: $instantiable)?> + $crate::runtime_primitives::traits::OffchainWorker<$trait_instance::BlockNumber> + for $module<$trait_instance$(, $instance)?> + { + fn generate_extrinsics($param: $param_ty) { $( $impl )* } + } + }; + + (@impl_offchain + $module:ident<$trait_instance:ident: $trait_name:ident$(, $instance:ident: $instantiable:path)?>; + ) => { + impl<$trait_instance: $trait_name$(, $instance: $instantiable)?> + $crate::runtime_primitives::traits::OffchainWorker<$trait_instance::BlockNumber> + for $module<$trait_instance$(, $instance)?> + {} + }; + (@impl_function $module:ident<$trait_instance:ident: $trait_name:ident$(, $instance:ident: $instantiable:path)?>; $origin_ty:ty; @@ -556,6 +632,7 @@ macro_rules! decl_module { { $( $deposit_event:tt )* } { $( $on_initialise:tt )* } { $( $on_finalise:tt )* } + { $( $offchain:tt )* } ) => { // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, Copy, PartialEq, Eq)] @@ -584,6 +661,12 @@ macro_rules! decl_module { $( $on_finalise )* } + decl_module! { + @impl_offchain + $mod_type<$trait_instance: $trait_name $(, $instance: $instantiable)?>; + $( $offchain )* + } + decl_module! { @impl_deposit_event $mod_type<$trait_instance: $trait_name $(, $instance: $instantiable)?>; @@ -1086,6 +1169,7 @@ mod tests { fn on_initialise(n: T::BlockNumber) { if n.into() == 42 { panic!("on_initialise") } } fn on_finalise(n: T::BlockNumber) { if n.into() == 42 { panic!("on_finalise") } } + fn offchain_worker() {} } } diff --git a/srml/system/src/lib.rs b/srml/system/src/lib.rs index c1a5ff9d9a47a..62bdc5156ac06 100644 --- a/srml/system/src/lib.rs +++ b/srml/system/src/lib.rs @@ -124,8 +124,8 @@ pub struct EventRecord { pub event: E, } -/// Event for the system module. decl_event!( + /// Event for the system module. pub enum Event { /// An extrinsic completed successfully. ExtrinsicSuccess, diff --git a/srml/timestamp/Cargo.toml b/srml/timestamp/Cargo.toml index 413c487214454..30c3779f31c64 100644 --- a/srml/timestamp/Cargo.toml +++ b/srml/timestamp/Cargo.toml @@ -21,11 +21,11 @@ substrate-primitives = { path = "../../core/primitives" } [features] default = ["std"] std = [ + "inherents/std", + "parity-codec/std", "rstd/std", - "srml-support/std", "runtime_primitives/std", + "srml-support/std", "serde", - "parity-codec/std", "system/std", - "inherents/std", ]