diff --git a/.dockerignore b/.dockerignore index 9d62f3c5c13..f8d69280893 100644 --- a/.dockerignore +++ b/.dockerignore @@ -21,3 +21,4 @@ !zebra-* !zebrad !docker/entrypoint.sh +!testnet-single-node-deploy diff --git a/.github/workflows/ci-basic.yml b/.github/workflows/ci-basic.yml index cf3f8f80373..1d273173929 100644 --- a/.github/workflows/ci-basic.yml +++ b/.github/workflows/ci-basic.yml @@ -34,7 +34,7 @@ jobs: - name: Install formatting & linting tools run: rustup component add rustfmt clippy - name: Run tests - run: cargo test --verbose --locked + run: timeout --preserve-status 1h cargo test --verbose --locked - name: Verify working directory is clean run: git diff --exit-code - name: Run doc check diff --git a/Cargo.lock b/Cargo.lock index 180b5dd3f1d..26b1a51a752 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -240,7 +240,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -251,7 +251,7 @@ checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -430,7 +430,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.108", + "syn 2.0.109", "which 4.4.2", ] @@ -853,7 +853,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -1135,7 +1135,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -1183,7 +1183,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -1205,7 +1205,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -1624,7 +1624,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -1701,7 +1701,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -3158,7 +3158,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -3199,7 +3199,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -3297,7 +3297,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" dependencies = [ "proc-macro2", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -3372,7 +3372,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -3412,7 +3412,7 @@ checksum = "6ff7ff745a347b87471d859a377a9a404361e7efc2a971d73424a6d183c0fc77" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -3442,7 +3442,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.108", + "syn 2.0.109", "tempfile", ] @@ -3456,7 +3456,7 @@ dependencies = [ "itertools 0.13.0", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -4246,7 +4246,7 @@ checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -4332,7 +4332,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -4590,9 +4590,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.108" +version = "2.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" +checksum = "2f17c7e013e88258aa9543dcbe81aca68a667a9ac37cd69c9fbc07858bfe0e2f" dependencies = [ "proc-macro2", "quote", @@ -4707,7 +4707,7 @@ checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -4718,7 +4718,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -4830,7 +4830,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -4990,7 +4990,7 @@ dependencies = [ "prost-build", "prost-types", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -5004,7 +5004,7 @@ dependencies = [ "prost-build", "prost-types", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -5134,7 +5134,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -5247,7 +5247,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04659ddb06c87d233c566112c1c9c5b9e98256d9af50ec3bc9c8327f873a7568" dependencies = [ "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -5461,7 +5461,7 @@ checksum = "d674d135b4a8c1d7e813e2f8d1c9a58308aee4a680323066025e53132218bd91" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -5581,7 +5581,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", "wasm-bindgen-shared", ] @@ -5615,7 +5615,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -6552,7 +6552,7 @@ dependencies = [ "serde_json", "serde_yml", "structopt", - "syn 2.0.108", + "syn 2.0.109", "thiserror 1.0.64", "tinyvec", "tokio", @@ -6656,7 +6656,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] @@ -6676,7 +6676,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.108", + "syn 2.0.109", ] [[package]] diff --git a/testnet-single-node-deploy/dockerfile b/testnet-single-node-deploy/dockerfile new file mode 100644 index 00000000000..cfcd68c5bc4 --- /dev/null +++ b/testnet-single-node-deploy/dockerfile @@ -0,0 +1,30 @@ +FROM rust:1.81.0 + +# Accept build arguments for Git information +ARG GIT_COMMIT +ARG GIT_TAG + +# Set up Rust and cargo +RUN apt-get update && apt-get install git build-essential clang -y + +# Set the working directory to the repo root +WORKDIR /app + +# Copy files +COPY . . + +# Set Git environment variables for the build +# These will be used by the build.rs script +ENV GIT_COMMIT_FULL=$GIT_COMMIT +ENV GIT_TAG=$GIT_TAG + +# Validate the presence of the config file +RUN test -f testnet-single-node-deploy/regtest-config.toml + +# Build zebrad with the required features +RUN cargo build --release --package zebrad --bin zebrad --features="getblocktemplate-rpcs" + +EXPOSE 18232 + +# Run the zebra node +ENTRYPOINT ["target/release/zebrad", "-c", "/app/testnet-single-node-deploy/regtest-config.toml"] diff --git a/testnet-single-node-deploy/regtest-config.toml b/testnet-single-node-deploy/regtest-config.toml new file mode 100644 index 00000000000..5e2322674d9 --- /dev/null +++ b/testnet-single-node-deploy/regtest-config.toml @@ -0,0 +1,24 @@ +[mining] +miner_address = 'tmLTZegcJN5zaufWQBARHkvqC62mTumm3jR' + +[network] +network = "Regtest" + +# This section may be omitted when testing only Canopy +[network.testnet_parameters.activation_heights] +# Configured activation heights must be greater than or equal to 1, +# block height 0 is reserved for the Genesis network upgrade in Zebra +NU5 = 1 +NU6 = 1 +NU7 = 1 + +# This section may be omitted if a persistent Regtest chain state is desired +[state] +ephemeral = true + +# This section may be omitted if it's not necessary to send transactions to Zebra's mempool +[rpc] +listen_addr = "0.0.0.0:18232" + +# disable cookie auth +enable_cookie_auth = false diff --git a/zebra-chain/src/orchard/shielded_data.rs b/zebra-chain/src/orchard/shielded_data.rs index 1e379d92548..b0551bd2dec 100644 --- a/zebra-chain/src/orchard/shielded_data.rs +++ b/zebra-chain/src/orchard/shielded_data.rs @@ -49,19 +49,23 @@ pub struct ActionGroup { /// The shared anchor for all `Spend`s in this transaction. /// Denoted as `anchorOrchard` in the spec. pub shared_anchor: tree::Root, + /// Block height after which this Bundle's Actions are invalid by consensus. + /// Denoted as `nAGExpiryHeight` in the spec. + #[cfg(feature = "tx_v6")] pub expiry_height: u32, + + /// Assets intended for burning + /// Denoted as `vAssetBurn` in the spec (ZIP 230). + #[cfg(feature = "tx_v6")] + pub burn: Flavor::BurnType, + /// The aggregated zk-SNARK proof for all the actions in this transaction. /// Denoted as `proofsOrchard` in the spec. pub proof: Halo2Proof, /// The Orchard Actions, in the order they appear in the transaction. /// Denoted as `vActionsOrchard` and `vSpendAuthSigsOrchard` in the spec. pub actions: AtLeastOne>, - - #[cfg(feature = "tx_v6")] - /// Assets intended for burning - /// Denoted as `vAssetBurn` in the spec (ZIP 230). - pub burn: Flavor::BurnType, } impl ActionGroup { @@ -100,18 +104,19 @@ impl fmt::Display for ActionGroup { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let mut fmter = f.debug_struct("orchard::ActionGroup"); - // FIXME: reorder fields here according the struct/spec? - fmter.field("actions", &self.actions.len()); fmter.field("flags", &self.flags); - fmter.field("proof_len", &self.proof.zcash_serialized_size()); - - fmter.field("shared_anchor", &self.shared_anchor); + #[cfg(feature = "tx_v6")] + fmter.field("expiry_height", &self.expiry_height); #[cfg(feature = "tx_v6")] fmter.field("burn", &self.burn.as_ref().len()); + fmter.field("proof_len", &self.proof.zcash_serialized_size()); + + fmter.field("shared_anchor", &self.shared_anchor); + fmter.finish() } } diff --git a/zebra-chain/src/orchard_zsa/asset_state.rs b/zebra-chain/src/orchard_zsa/asset_state.rs index bd73a604c00..0c9d6ae8b96 100644 --- a/zebra-chain/src/orchard_zsa/asset_state.rs +++ b/zebra-chain/src/orchard_zsa/asset_state.rs @@ -3,6 +3,7 @@ use std::{collections::HashMap, sync::Arc}; use orchard::issuance::{compute_asset_desc_hash, IssueAction}; +use orchard::issuance_auth::{IssueAuthKey, IssueValidatingKey, ZSASchnorr}; pub use orchard::note::AssetBase; use crate::{serialization::ZcashSerialize, transaction::Transaction}; @@ -380,16 +381,11 @@ pub trait RandomAssetBase { impl RandomAssetBase for AssetBase { fn random_serialized() -> String { - let isk = orchard::issuance_auth::IssueAuthKey::from_bytes( - k256::NonZeroScalar::random(&mut rand_core::OsRng) - .to_bytes().as_slice() - ) - .unwrap(); - let ik = orchard::issuance_auth::IssueValidatingKey::from(&isk); - let asset_desc = b"zsa_asset"; - let asset_desc_hash = - compute_asset_desc_hash(&(asset_desc[0], asset_desc[1..].to_vec()).into()); - AssetBase::derive(&ik, &asset_desc_hash) + let isk = IssueAuthKey::::random(&mut rand_core::OsRng); + let ik = IssueValidatingKey::::from(&isk); + let desc = b"zsa_asset"; + let hash = compute_asset_desc_hash(&(desc[0], desc[1..].to_vec()).into()); + AssetBase::derive(&ik, &hash) .zcash_serialize_to_vec() .map(hex::encode) .expect("random asset base should serialize") diff --git a/zebra-chain/src/parameters/network_upgrade.rs b/zebra-chain/src/parameters/network_upgrade.rs index 40ac420fbdd..ac654e87f94 100644 --- a/zebra-chain/src/parameters/network_upgrade.rs +++ b/zebra-chain/src/parameters/network_upgrade.rs @@ -101,10 +101,10 @@ pub(super) const MAINNET_ACTIVATION_HEIGHTS: &[(block::Height, NetworkUpgrade)] (block::Height(1_046_400), Canopy), (block::Height(1_687_104), Nu5), (block::Height(2_726_400), Nu6), - // FIXME: TODO: Use a proper value below. - #[cfg(zcash_unstable = "nu7")] - (block::Height(3_111_000), Nu7), - (block::Height(3_111_001), Swap), + (block::Height(4_111_000), Nu6_1), + // FIXME: TODO: Update height values for Nu6_1 and Nu7 when real values will be known. + (block::Height(4_333_000), Nu7), + (block::Height(4_333_001), Swap), ]; /// Fake mainnet network upgrade activation heights, used in tests. @@ -119,8 +119,9 @@ const FAKE_MAINNET_ACTIVATION_HEIGHTS: &[(block::Height, NetworkUpgrade)] = &[ (block::Height(30), Canopy), (block::Height(35), Nu5), (block::Height(40), Nu6), - (block::Height(45), Nu7), - (block::Height(50), Swap), + (block::Height(45), Nu6_1), + (block::Height(50), Nu7), + (block::Height(55), Swap), ]; /// Testnet network upgrade activation heights. @@ -143,10 +144,10 @@ pub(super) const TESTNET_ACTIVATION_HEIGHTS: &[(block::Height, NetworkUpgrade)] (block::Height(1_028_500), Canopy), (block::Height(1_842_420), Nu5), (block::Height(2_976_000), Nu6), - // FIXME: TODO: Use a proper value below. - #[cfg(zcash_unstable = "nu7")] - (block::Height(3_222_000), Nu7), - (block::Height(3_222_001), Swap), + (block::Height(4_222_000), Nu6_1), + // FIXME: TODO: Update height values for Nu6_1 and Nu7 when real values will be known. + (block::Height(4_444_000), Nu7), + (block::Height(4_444_001), Swap), ]; /// Fake testnet network upgrade activation heights, used in tests. @@ -161,8 +162,9 @@ const FAKE_TESTNET_ACTIVATION_HEIGHTS: &[(block::Height, NetworkUpgrade)] = &[ (block::Height(30), Canopy), (block::Height(35), Nu5), (block::Height(40), Nu6), - (block::Height(45), Nu7), - (block::Height(50), Swap), + (block::Height(45), Nu6_1), + (block::Height(50), Nu7), + (block::Height(55), Swap), ]; /// The Consensus Branch Id, used to bind transactions and blocks to a diff --git a/zebra-chain/src/primitives/zcash_note_encryption.rs b/zebra-chain/src/primitives/zcash_note_encryption.rs index f459c319d3b..c054bebed61 100644 --- a/zebra-chain/src/primitives/zcash_note_encryption.rs +++ b/zebra-chain/src/primitives/zcash_note_encryption.rs @@ -59,7 +59,10 @@ pub fn decrypts_successfully(transaction: &Transaction, network: &Network, heigh let is_decrypted_successfully = match bundle { OrchardBundle::OrchardVanilla(bundle) => orchard_bundle_decrypts_successfully(bundle), OrchardBundle::OrchardZSA(bundle) => orchard_bundle_decrypts_successfully(bundle), - OrchardBundle::OrchardSwap(bundle) => !bundle.action_groups().iter().any(|group| !orchard_bundle_decrypts_successfully(group)), + OrchardBundle::OrchardSwap(bundle) => !bundle + .action_groups() + .iter() + .any(|group| !orchard_bundle_decrypts_successfully(group)), }; if !is_decrypted_successfully { @@ -71,8 +74,8 @@ pub fn decrypts_successfully(transaction: &Transaction, network: &Network, heigh } /// Checks if all actions in an Orchard bundle decrypt successfully. -fn orchard_bundle_decrypts_successfully( - bundle: &Bundle, +fn orchard_bundle_decrypts_successfully( + bundle: &Bundle, ) -> bool { bundle.actions().iter().all(|act| { zcash_note_encryption::try_output_recovery_with_ovk( diff --git a/zebra-chain/src/transaction.rs b/zebra-chain/src/transaction.rs index 6305479d5e2..97af5abf2cf 100644 --- a/zebra-chain/src/transaction.rs +++ b/zebra-chain/src/transaction.rs @@ -56,6 +56,9 @@ use crate::{ #[cfg(feature = "tx_v6")] use crate::orchard_zsa; +#[cfg(feature = "tx_v6")] +pub mod versioned_sig; + /// A Zcash transaction. /// /// A transaction is an encoded data structure that facilitates the transfer of @@ -1130,7 +1133,6 @@ impl Transaction { /// regardless of version. pub fn orchard_flags_union(&self) -> Option { match self { - // No Orchard shielded data Transaction::V1 { .. } | Transaction::V2 { .. } | Transaction::V3 { .. } @@ -1157,7 +1159,6 @@ impl Transaction { /// regardless of version. pub fn orchard_shared_anchors(&self) -> Box + '_> { match self { - // No Orchard shielded data Transaction::V1 { .. } | Transaction::V2 { .. } | Transaction::V3 { .. } @@ -1467,7 +1468,6 @@ impl Transaction { /// pub fn orchard_value_balance(&self) -> ValueBalance { let value_balance = match self { - // No Orchard shielded data Transaction::V1 { .. } | Transaction::V2 { .. } | Transaction::V3 { .. } diff --git a/zebra-chain/src/transaction/arbitrary.rs b/zebra-chain/src/transaction/arbitrary.rs index 4b750a90ec1..acab46ed12f 100644 --- a/zebra-chain/src/transaction/arbitrary.rs +++ b/zebra-chain/src/transaction/arbitrary.rs @@ -806,19 +806,19 @@ impl Arbitrary for orchard::Shiel let (flags, value_balance, shared_anchor, proof, actions, binding_sig, burn) = props; - // FIXME: support multiple action groups Self { action_groups: AtLeastOne::from_one(orchard::ActionGroup { flags, shared_anchor, // FIXME: use a proper arbitrary value here? + #[cfg(feature = "tx_v6")] expiry_height: 0, + #[cfg(feature = "tx_v6")] + burn, proof, actions: actions .try_into() .expect("arbitrary vector size range produces at least one action"), - #[cfg(feature = "tx_v6")] - burn, }), value_balance, binding_sig: binding_sig.0, @@ -1180,11 +1180,12 @@ pub fn insert_fake_orchard_shielded_data( flags: orchard::Flags::empty(), shared_anchor: orchard::tree::Root::default(), // FIXME: use a proper arbitrary value here? + #[cfg(feature = "tx_v6")] expiry_height: 0, - proof: Halo2Proof(vec![]), - actions: at_least_one![dummy_authorized_action], #[cfg(feature = "tx_v6")] burn: Default::default(), + proof: Halo2Proof(vec![]), + actions: at_least_one![dummy_authorized_action], }), value_balance: Amount::try_from(0).expect("invalid transaction amount"), binding_sig: Signature::from([0u8; 64]), diff --git a/zebra-chain/src/transaction/serialize.rs b/zebra-chain/src/transaction/serialize.rs index f074ca7fb6d..a1e77a1e837 100644 --- a/zebra-chain/src/transaction/serialize.rs +++ b/zebra-chain/src/transaction/serialize.rs @@ -32,6 +32,9 @@ use crate::parameters::TX_SWAP_VERSION_GROUP_ID; use super::*; use crate::sapling; +#[cfg(feature = "tx_v6")] +use versioned_sig::{SighashInfoV0, VersionedSigV0}; + impl ZcashDeserialize for jubjub::Fq { fn zcash_deserialize(mut reader: R) -> Result { let possible_scalar = jubjub::Fq::from_bytes(&reader.read_32_bytes()?); @@ -408,24 +411,28 @@ impl ZcashSerialize for orchard::ShieldedData { #[cfg(not(feature = "zsa-swap"))] assert!( self.action_groups.len() == 1, - "V6 transaction must contain exactly one action group" + "TxV6 currently supports only one action group" ); - // Denoted as `nActionGroupsOrchard` in the spec (ZIP 230) (must be one for V6/NU7). - let csm = CompactSizeMessage::try_from(self.action_groups.len()) - .unwrap_or_else(|_| unreachable!()); - csm.zcash_serialize(&mut writer)?; + // Denoted as `nActionGroupsOrchard` in the spec (ZIP 230). + // TxV6 currently supports only one action group. + CompactSizeMessage::try_from(self.action_groups.len()) + .expect("nActionGroupsOrchard should convert to CompactSizeMessage") + .zcash_serialize(&mut writer)?; // FIXME: consider using use zcash_serialize_external_count for or Vec::zcash_serialize for action_group in self.action_groups.iter() { // Split the AuthorizedAction - let (actions, sigs): (Vec>, Vec>) = - action_group - .actions - .iter() - .cloned() - .map(orchard::AuthorizedAction::into_parts) - .unzip(); + let (actions, sigs): ( + Vec>, + Vec>>, + ) = action_group + .actions + .iter() + .cloned() + .map(orchard::AuthorizedAction::into_parts) + .map(|(action, sig)| (action, VersionedSigV0::new(sig))) + .unzip(); // Denoted as `nActionsOrchard` and `vActionsOrchard` in the spec. actions.zcash_serialize(&mut writer)?; @@ -436,7 +443,12 @@ impl ZcashSerialize for orchard::ShieldedData { // Denoted as `anchorOrchard` in the spec. action_group.shared_anchor.zcash_serialize(&mut writer)?; - // Denoted as `nAGExpiryHeight` in the spec (ZIP 230) (must be zero for V6/NU7). + // Denoted as `nAGExpiryHeight` in the spec (ZIP 230). + #[cfg(not(feature = "zsa-swap"))] + assert!( + action_group.expiry_height == 0, + "nAGExpiryHeight must be zero for TxV6" + ); writer.write_u32::(action_group.expiry_height)?; // Denoted as `vAssetBurn` in the spec (ZIP 230). @@ -453,7 +465,7 @@ impl ZcashSerialize for orchard::ShieldedData { self.value_balance.zcash_serialize(&mut writer)?; // Denoted as `bindingSigOrchard` in the spec. - self.binding_sig.zcash_serialize(&mut writer)?; + VersionedSigV0::new(self.binding_sig).zcash_serialize(&mut writer)?; Ok(()) } @@ -526,11 +538,12 @@ impl ZcashDeserialize for Option> { action_groups: AtLeastOne::from_one(ActionGroup { flags, shared_anchor, + #[cfg(feature = "tx_v6")] expiry_height: 0, - proof, - actions, #[cfg(feature = "tx_v6")] burn: NoBurn, + proof, + actions, }), value_balance, binding_sig, @@ -544,9 +557,7 @@ impl ZcashDeserialize for Option> { #[cfg(feature = "tx_v6")] impl ZcashDeserialize for Option> { fn zcash_deserialize(mut reader: R) -> Result { - // FIXME: Implement deserialization of multiple action groups (under a feature flag) - - // Denoted as `nActionGroupsOrchard` in the spec (ZIP 230) (must be one for V6/NU7). + // Denoted as `nActionGroupsOrchard` in the spec (ZIP 230). let n_action_groups: usize = (&mut reader) .zcash_deserialize_into::()? .into(); @@ -558,7 +569,7 @@ impl ZcashDeserialize for Option> { #[cfg(not(feature = "zsa-swap"))] if n_action_groups != 1 { return Err(SerializationError::Parse( - "V6 transaction must contain exactly one action group", + "TxV6 currently supports only one action group.", )); } @@ -570,14 +581,6 @@ impl ZcashDeserialize for Option> { let actions: Vec> = (&mut reader).zcash_deserialize_into()?; - // # Consensus - // - // > Elements of an Action description MUST be canonical encodings of the types given above. - // - // https://zips.z.cash/protocol/protocol.pdf#actiondesc - // - // Some Action elements are validated in this function; they are described below. - // Denoted as `flagsOrchard` in the spec. // Consensus: type of each flag is 𝔹, i.e. a bit. This is enforced implicitly // in [`Flags::zcash_deserialized`]. @@ -587,11 +590,13 @@ impl ZcashDeserialize for Option> { // Consensus: type is `{0 .. 𝑞_ℙ − 1}`. See [`orchard::tree::Root::zcash_deserialize`]. let shared_anchor: orchard::tree::Root = (&mut reader).zcash_deserialize_into()?; - // Denoted as `nAGExpiryHeight` in the spec (ZIP 230) (must be zero for V6/NU7). + // Denoted as `nAGExpiryHeight` in the spec (ZIP 230). let expiry_height = reader.read_u32::()?; #[cfg(not(feature = "zsa-swap"))] if expiry_height != 0 { - return Err(SerializationError::Parse("nAGExpiryHeight for V6/NU7")); + return Err(SerializationError::Parse( + "nAGExpiryHeight must be zero for TxV6", + )); } // Denoted as `vAssetBurn` in the spec (ZIP 230). @@ -603,15 +608,15 @@ impl ZcashDeserialize for Option> { let proof: Halo2Proof = (&mut reader).zcash_deserialize_into()?; // Denoted as `vSpendAuthSigsOrchard` in the spec. - let sigs: Vec> = + let spend_sigs: Vec>> = zcash_deserialize_external_count(actions.len(), &mut reader)?; // Create the AuthorizedAction from deserialized parts let authorized_actions: Vec> = actions .into_iter() - .zip(sigs) - .map(|(action, spend_auth_sig)| { - orchard::AuthorizedAction::from_parts(action, spend_auth_sig) + .zip(spend_sigs) + .map(|(action, spend_sig)| { + orchard::AuthorizedAction::from_parts(action, spend_sig.into_signature()) }) .collect(); @@ -622,9 +627,9 @@ impl ZcashDeserialize for Option> { flags, shared_anchor, expiry_height, + burn, proof, actions, - burn, }) } @@ -632,7 +637,8 @@ impl ZcashDeserialize for Option> { let value_balance: Amount = (&mut reader).zcash_deserialize_into()?; // Denoted as `bindingSigOrchard` in the spec. - let binding_sig: Signature = (&mut reader).zcash_deserialize_into()?; + let binding_sig: Signature = + VersionedSigV0::zcash_deserialize(&mut reader)?.into_signature(); Ok(Some(orchard::ShieldedData:: { action_groups: action_groups.try_into()?, @@ -903,11 +909,17 @@ impl ZcashSerialize for Transaction { // Denoted as `tx_out_count` and `tx_out` in the spec. outputs.zcash_serialize(&mut writer)?; + // Denoted as `vSighashInfo` in the spec. + // There is one sighash info per transparent input. For now, only V0 is supported. + for _ in inputs { + SighashInfoV0.zcash_serialize(&mut writer)?; + } + // A bundle of fields denoted in the spec as `nSpendsSapling`, `vSpendsSapling`, // `nOutputsSapling`,`vOutputsSapling`, `valueBalanceSapling`, `anchorSapling`, // `vSpendProofsSapling`, `vSpendAuthSigsSapling`, `vOutputProofsSapling` and // `bindingSigSapling`. - sapling_shielded_data.zcash_serialize(&mut writer)?; + sapling_v6::zcash_serialize_v6(sapling_shielded_data, &mut writer)?; // A bundle of fields denoted in the spec as `nActionsOrchard`, `vActionsOrchard`, // `flagsOrchard`,`valueBalanceOrchard`, `anchorOrchard`, `sizeProofsOrchard`, @@ -1206,11 +1218,18 @@ impl ZcashDeserialize for Transaction { // Denoted as `tx_out_count` and `tx_out` in the spec. let outputs = Vec::zcash_deserialize(&mut limited_reader)?; + // Denoted as `vSighashInfo` in the spec (ZIP-230). + // There is one `TransparentSighashInfo` per transparent input (tx_in_count entries). + // For now, only V0 is supported, which must decode to a Vector == [0x00]. + for _ in &inputs { + SighashInfoV0::zcash_deserialize(&mut limited_reader)?; + } + // A bundle of fields denoted in the spec as `nSpendsSapling`, `vSpendsSapling`, // `nOutputsSapling`,`vOutputsSapling`, `valueBalanceSapling`, `anchorSapling`, // `vSpendProofsSapling`, `vSpendAuthSigsSapling`, `vOutputProofsSapling` and // `bindingSigSapling`. - let sapling_shielded_data = (&mut limited_reader).zcash_deserialize_into()?; + let sapling_shielded_data = sapling_v6::zcash_deserialize_v6(&mut limited_reader)?; // A bundle of fields denoted in the spec as `nActionsOrchard`, `vActionsOrchard`, // `flagsOrchard`,`valueBalanceOrchard`, `anchorOrchard`, `sizeProofsOrchard`, @@ -1432,3 +1451,173 @@ impl FromHex for SerializedTransaction { Ok(bytes.into()) } } + +// TODO: After tx-v6 merge, refactor to share common serialization logic with V5. +#[cfg(feature = "tx_v6")] +mod sapling_v6 { + use super::*; + + use redjubjub::{Binding, Signature, SpendAuth}; + + type SaplingShieldedData = sapling::ShieldedData; + + impl ZcashSerialize for Signature { + fn zcash_serialize(&self, mut writer: W) -> Result<(), io::Error> { + writer.write_all(&<[u8; 64]>::from(*self)[..])?; + Ok(()) + } + } + + impl ZcashDeserialize for Signature { + fn zcash_deserialize(mut reader: R) -> Result { + Ok(reader.read_64_bytes()?.into()) + } + } + + pub(super) fn zcash_serialize_v6( + shielded_data: &Option, + mut writer: W, + ) -> Result<(), io::Error> { + match shielded_data { + None => { + // Same as V5: empty spend and output lists + zcash_serialize_empty_list(&mut writer)?; + zcash_serialize_empty_list(&mut writer)?; + } + Some(sapling_shielded_data) => { + zcash_serialize_v6_inner(sapling_shielded_data, &mut writer)?; + } + } + Ok(()) + } + + fn zcash_serialize_v6_inner( + shielded_data: &SaplingShieldedData, + mut writer: W, + ) -> Result<(), io::Error> { + // V6 difference: wrap spend auth signatures with VersionedSigV0 + let (spend_prefixes, spend_proofs_sigs): (Vec<_>, Vec<_>) = shielded_data + .spends() + .cloned() + .map(sapling::Spend::::into_v5_parts) + .map(|(prefix, proof, sig)| (prefix, (proof, VersionedSigV0::new(sig)))) + .unzip(); + let (spend_proofs, spend_sigs) = spend_proofs_sigs.into_iter().unzip(); + + // Same as V5: collect output parts + let (output_prefixes, output_proofs): (Vec<_>, _) = shielded_data + .outputs() + .cloned() + .map(sapling::Output::into_v5_parts) + .unzip(); + + // Same as V5: serialize spend/output prefixes + spend_prefixes.zcash_serialize(&mut writer)?; + output_prefixes.zcash_serialize(&mut writer)?; + + // Same as V5: value balance + shielded_data.value_balance.zcash_serialize(&mut writer)?; + + // Same as V5: shared anchor (if spends present) + if let Some(shared_anchor) = shielded_data.shared_anchor() { + writer.write_all(&<[u8; 32]>::from(shared_anchor)[..])?; + } + + // Same as V5: spend proofs + zcash_serialize_external_count(&spend_proofs, &mut writer)?; + + // V6 difference: versioned spend auth signatures + zcash_serialize_external_count(&spend_sigs, &mut writer)?; + + // Same as V5: output proofs + zcash_serialize_external_count(&output_proofs, &mut writer)?; + + // V6 difference: versioned binding signature + VersionedSigV0::new(shielded_data.binding_sig).zcash_serialize(&mut writer)?; + + Ok(()) + } + + #[allow(clippy::unwrap_in_result)] + pub(super) fn zcash_deserialize_v6( + mut reader: R, + ) -> Result, SerializationError> { + // Same as V5: deserialize spend/output prefixes + let spend_prefixes: Vec<_> = (&mut reader).zcash_deserialize_into()?; + let output_prefixes: Vec<_> = (&mut reader).zcash_deserialize_into()?; + + let spends_count = spend_prefixes.len(); + let outputs_count = output_prefixes.len(); + + // Same as V5: return None if no spends or outputs + if spend_prefixes.is_empty() && output_prefixes.is_empty() { + return Ok(None); + } + + // Same as V5: value balance + let value_balance = (&mut reader).zcash_deserialize_into()?; + + // Same as V5: shared anchor (if spends present) + let shared_anchor = if spends_count > 0 { + Some((&mut reader).zcash_deserialize_into()?) + } else { + None + }; + + // Same as V5: spend proofs + let spend_proofs = zcash_deserialize_external_count(spends_count, &mut reader)?; + + // V6 difference: deserialize versioned spend auth signatures + let spend_sigs: Vec>> = + zcash_deserialize_external_count(spends_count, &mut reader)?; + + // Same as V5: output proofs + let output_proofs = zcash_deserialize_external_count(outputs_count, &mut reader)?; + + // V6 difference: deserialize versioned binding signature + let binding_sig = VersionedSigV0::zcash_deserialize(&mut reader)?.into_signature(); + + // V6 difference: unwrap versioned spend auth signatures + let spends: Vec<_> = spend_prefixes + .into_iter() + .zip(spend_proofs) + .zip(spend_sigs) + .map(|((prefix, proof), spend_sig)| { + sapling::Spend::::from_v5_parts( + prefix, + proof, + spend_sig.into_signature(), + ) + }) + .collect(); + + // Same as V5: create outputs from parts + let outputs = output_prefixes + .into_iter() + .zip(output_proofs) + .map(|(prefix, proof)| sapling::Output::from_v5_parts(prefix, proof)) + .collect(); + + // Same as V5: create transfers from spends/outputs + let transfers = match shared_anchor { + Some(shared_anchor) => sapling::TransferData::SpendsAndMaybeOutputs { + shared_anchor, + spends: spends + .try_into() + .expect("checked spends when parsing shared anchor"), + maybe_outputs: outputs, + }, + None => sapling::TransferData::JustOutputs { + outputs: outputs + .try_into() + .expect("checked spends or outputs and returned early"), + }, + }; + + Ok(Some(sapling::ShieldedData { + value_balance, + transfers, + binding_sig, + })) + } +} diff --git a/zebra-chain/src/transaction/unmined/zip317.rs b/zebra-chain/src/transaction/unmined/zip317.rs index dc6c8277378..db346ec6095 100644 --- a/zebra-chain/src/transaction/unmined/zip317.rs +++ b/zebra-chain/src/transaction/unmined/zip317.rs @@ -162,6 +162,17 @@ pub fn conventional_actions(transaction: &Transaction) -> u32 { + 2 * n_join_split + max(n_spends_sapling, n_outputs_sapling) + n_actions_orchard; + + // TODO: Add ZSA issuance-related ZIP-317 terms to logical_actions formula, like: + // + // let logical_actions = + // ... + // + n_zsa_issue_notes + // + CREATION_COST * n_asset_creations; + // + // librustzcash already includes these; see: + // zcash_primitives/src/transaction/fees/zip317.rs, FeeRule::fee_required + let logical_actions: u32 = logical_actions .try_into() .expect("transaction items are limited by serialized size limit"); diff --git a/zebra-chain/src/transaction/versioned_sig.rs b/zebra-chain/src/transaction/versioned_sig.rs new file mode 100644 index 00000000000..8529be93c6c --- /dev/null +++ b/zebra-chain/src/transaction/versioned_sig.rs @@ -0,0 +1,162 @@ +//! Versioned signature types for transaction V6+. +//! +//! ZIP 246 introduces sighash versioning to allow future signature algorithm upgrades. +//! Signatures are prefixed with sighash metadata (version + optional associated data). + +use std::io; + +use byteorder::{ReadBytesExt, WriteBytesExt}; + +use crate::serialization::{ + CompactSizeMessage, SerializationError, TrustedPreallocate, ZcashDeserialize, ZcashSerialize, +}; + +/// Sighash version 0 for V6 transactions (zero-sized type as V0 has no metadata). +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub(crate) struct SighashInfoV0; + +#[allow(clippy::unwrap_in_result)] +impl ZcashSerialize for SighashInfoV0 { + fn zcash_serialize(&self, mut writer: W) -> io::Result<()> { + // Sighash V0 has no associated data, so length is always 1 (just the version byte) + CompactSizeMessage::try_from(1) + .expect("1 is always a valid CompactSize") + .zcash_serialize(&mut writer)?; + + // Version 0 + writer.write_u8(0)?; + + Ok(()) + } +} + +impl ZcashDeserialize for SighashInfoV0 { + fn zcash_deserialize(mut reader: R) -> Result { + let length = usize::from(CompactSizeMessage::zcash_deserialize(&mut reader)?); + + if length != 1 { + return Err(SerializationError::Parse( + "invalid sighash V0: length must be 1", + )); + } + + let version = reader.read_u8()?; + if version != 0 { + return Err(SerializationError::Parse( + "invalid sighash V0: version byte must be 0", + )); + } + + Ok(Self) + } +} + +/// A signature with sighash version 0 prefix for V6 transactions. +#[derive(Clone, Debug, PartialEq, Eq)] +pub(crate) struct VersionedSigV0(Sig); + +impl VersionedSigV0 { + /// Wrap a signature with sighash V0 metadata. + pub(crate) fn new(signature: Sig) -> Self { + Self(signature) + } + + /// Extract the underlying signature. + pub(crate) fn into_signature(self) -> Sig { + self.0 + } +} + +impl ZcashSerialize for VersionedSigV0 +where + Sig: ZcashSerialize, +{ + fn zcash_serialize(&self, mut writer: W) -> io::Result<()> { + SighashInfoV0.zcash_serialize(&mut writer)?; + self.0.zcash_serialize(&mut writer) + } +} + +impl ZcashDeserialize for VersionedSigV0 +where + Sig: ZcashDeserialize, +{ + fn zcash_deserialize(mut reader: R) -> Result { + SighashInfoV0::zcash_deserialize(&mut reader)?; + let signature = Sig::zcash_deserialize(&mut reader)?; + Ok(Self(signature)) + } +} + +impl TrustedPreallocate for VersionedSigV0 +where + Sig: TrustedPreallocate, +{ + fn max_allocation() -> u64 { + // Sighash info adds only 2 bytes overhead, so signature's max allocation is safe + Sig::max_allocation() + } +} + +#[cfg(test)] +mod tests { + use redjubjub::{Signature, SpendAuth}; + + use super::*; + + #[test] + fn sighash_info_v0_roundtrip() { + let info = SighashInfoV0; + + let bytes = info.zcash_serialize_to_vec().unwrap(); + assert_eq!(bytes, &[0x01, 0x00]); // CompactSize(1), version 0 + + let parsed = SighashInfoV0::zcash_deserialize(&bytes[..]).unwrap(); + assert_eq!(parsed, info); + } + + #[test] + fn sighash_info_v0_rejects_wrong_length() { + let bytes = [0x02, 0x00]; // CompactSize(2) - wrong length + assert!(SighashInfoV0::zcash_deserialize(&bytes[..]).is_err()); + } + + #[test] + fn sighash_info_v0_rejects_wrong_version() { + let bytes = [0x01, 0x01]; // CompactSize(1), version 1 - wrong version + assert!(SighashInfoV0::zcash_deserialize(&bytes[..]).is_err()); + } + + #[test] + fn versioned_sig_v0_roundtrip() { + // Create a test signature using real Sapling SpendAuth signature type (64 bytes) + // Using fixed bytes for deterministic testing (not a cryptographically valid signature) + let sig_bytes = [0x11u8; 64]; // Arbitrary 64-byte pattern + let original_sig = Signature::::from(sig_bytes); + + let versioned_sig = VersionedSigV0::new(original_sig); + let serialized_bytes = versioned_sig.zcash_serialize_to_vec().unwrap(); + + // Expected format: [CompactSize(1), version(0), sig_bytes...] + // 0x01 = CompactSize encoding of length 1 (just the version byte) + // 0x00 = sighash version 0 + // followed by 64 bytes of the signature + assert_eq!(serialized_bytes.len(), 1 + 1 + 64); // CompactSize + version + sig + assert_eq!(serialized_bytes[0], 0x01); // CompactSize(1) + assert_eq!(serialized_bytes[1], 0x00); // version 0 + assert_eq!(&serialized_bytes[2..], &sig_bytes[..]); // signature bytes + + let deserialized_sig = + VersionedSigV0::>::zcash_deserialize(&serialized_bytes[..]) + .unwrap(); + assert_eq!(deserialized_sig.into_signature(), original_sig); + } + + #[test] + fn versioned_sig_v0_rejects_invalid_sighash() { + let mut bytes = vec![0x01, 0x01]; // Invalid: CompactSize(1), version 1 + bytes.extend_from_slice(&[0u8; 64]); // Add dummy signature + + assert!(VersionedSigV0::>::zcash_deserialize(&bytes[..]).is_err()); + } +} diff --git a/zebra-consensus/src/orchard_zsa/tests.rs b/zebra-consensus/src/orchard_zsa/tests.rs index cfd871fb17b..94b421cdd7c 100644 --- a/zebra-consensus/src/orchard_zsa/tests.rs +++ b/zebra-consensus/src/orchard_zsa/tests.rs @@ -21,11 +21,14 @@ use std::{ sync::Arc, }; -use color_eyre::eyre::Report; +use color_eyre::eyre::{eyre, Report}; +use tokio::time::{timeout, Duration}; use tower::ServiceExt; use orchard::{ - issuance::{AssetRecord, IssueAction}, issuance_auth::{ZSASchnorr, IssueValidatingKey}, note::AssetBase, + issuance::{AssetRecord, IssueAction}, + issuance_auth::{IssueValidatingKey, ZSASchnorr}, + note::AssetBase, value::NoteValue, }; @@ -220,8 +223,8 @@ async fn check_orchard_zsa_workflow() -> Result<(), Report> { let (state_service, read_state_service, _, _) = zebra_state::init_test_services(&network); - let (block_verifier_router, _tx_verifier, _groth16_download_handle, _max_checkpoint_height) = - crate::router::init(Config::default(), &network, state_service.clone()).await; + let (block_verifier_router, ..) = + crate::router::init(Config::default(), &network, state_service).await; let transcript_data = create_transcript_data(ORCHARD_ZSA_WORKFLOW_BLOCKS.iter()).collect::>(); @@ -240,9 +243,12 @@ async fn check_orchard_zsa_workflow() -> Result<(), Report> { } // Verify all blocks in the transcript against the consensus and the state. - Transcript::from(transcript_data) - .check(block_verifier_router.clone()) - .await?; + timeout( + Duration::from_secs(15), + Transcript::from(transcript_data).check(block_verifier_router), + ) + .await + .map_err(|_| eyre!("Task timed out"))??; // After processing the transcript blocks, verify that the state matches the expected supply info. for (&asset_base, asset_record) in &asset_records { diff --git a/zebra-consensus/src/primitives/halo2/tests.rs b/zebra-consensus/src/primitives/halo2/tests.rs index 85d6957e28b..cd3c3bcb3b9 100644 --- a/zebra-consensus/src/primitives/halo2/tests.rs +++ b/zebra-consensus/src/primitives/halo2/tests.rs @@ -18,10 +18,13 @@ use orchard::{ use rand::rngs::OsRng; use zebra_chain::{ - orchard::{ShieldedData, ShieldedDataFlavor}, + orchard::{OrchardVanilla, ShieldedData, ShieldedDataFlavor}, serialization::{AtLeastOne, ZcashDeserialize, ZcashDeserializeInto, ZcashSerialize}, }; +#[cfg(feature = "tx_v6")] +use zebra_chain::orchard::OrchardZSA; + use crate::primitives::halo2::*; #[allow(dead_code, clippy::print_stdout)] @@ -81,7 +84,10 @@ where flags, shared_anchor: anchor_bytes.try_into().unwrap(), // FIXME: use a proper value below if needed + #[cfg(feature = "tx_v6")] expiry_height: 0, + #[cfg(feature = "tx_v6")] + burn: bundle.burn().as_slice().into(), proof: zebra_chain::primitives::Halo2Proof( // FIXME: can we use `expect` here? bundle @@ -111,18 +117,16 @@ where }; zebra_chain::orchard::shielded_data::AuthorizedAction { action, - spend_auth_sig: <[u8; 64]>::from(a.authorization()).into(), + spend_auth_sig: <[u8; 64]>::from(a.authorization().sig()).into(), } }) .collect::>() .try_into() .unwrap(), - // FIXME: use a proper value when implementing V6 - #[cfg(feature = "tx_v6")] - burn: bundle.burn().as_slice().into(), }), value_balance: note_value.try_into().unwrap(), - binding_sig: <[u8; 64]>::from(bundle.authorization().binding_signature()).into(), + binding_sig: <[u8; 64]>::from(bundle.authorization().binding_signature().sig()) + .into(), } }) .collect(); diff --git a/zebra-consensus/src/transaction.rs b/zebra-consensus/src/transaction.rs index 3c3701d41bd..9745a2d3693 100644 --- a/zebra-consensus/src/transaction.rs +++ b/zebra-consensus/src/transaction.rs @@ -514,6 +514,7 @@ impl OrchardTransaction for orchard::OrchardVanilla { const SUPPORTED_NETWORK_UPGRADES: &'static [NetworkUpgrade] = &[ NetworkUpgrade::Nu5, NetworkUpgrade::Nu6, + NetworkUpgrade::Nu6_1, #[cfg(feature = "tx_v6")] NetworkUpgrade::Nu7, ]; diff --git a/zebra-network/src/constants.rs b/zebra-network/src/constants.rs index 2af851f72ed..aa8e1ab90e0 100644 --- a/zebra-network/src/constants.rs +++ b/zebra-network/src/constants.rs @@ -343,7 +343,7 @@ pub const TIMESTAMP_TRUNCATION_SECONDS: u32 = 30 * 60; pub const CURRENT_NETWORK_PROTOCOL_VERSION: Version = { #[cfg(not(zcash_unstable = "nu7"))] { - Version(170_120) + Version(170_140) } #[cfg(zcash_unstable = "nu7")] { diff --git a/zebra-rpc/src/methods.rs b/zebra-rpc/src/methods.rs index b69be0de656..f38a6e4108f 100644 --- a/zebra-rpc/src/methods.rs +++ b/zebra-rpc/src/methods.rs @@ -306,12 +306,12 @@ pub trait Rpc { /// /// method: post /// tags: blockchain - // #[rpc(name = "getassetstate")] - // fn get_asset_state( - // &self, - // asset_base: String, - // include_non_finalized: Option, - // ) -> BoxFuture>; + #[rpc(name = "getassetstate")] + fn get_asset_state( + &self, + asset_base: String, + include_non_finalized: Option, + ) -> BoxFuture>; /// Stop the running zebrad process. /// @@ -1369,35 +1369,35 @@ where .boxed() } - // fn get_asset_state( - // &self, - // asset_base: String, - // include_non_finalized: Option, - // ) -> BoxFuture> { - // let state = self.state.clone(); - // let include_non_finalized = include_non_finalized.unwrap_or(true); - // - // async move { - // let asset_base = hex::decode(asset_base) - // .map_server_error()? - // .zcash_deserialize_into() - // .map_server_error()?; - // - // let request = zebra_state::ReadRequest::AssetState { - // asset_base, - // include_non_finalized, - // }; - // - // let zebra_state::ReadResponse::AssetState(asset_state) = - // state.oneshot(request).await.map_server_error()? - // else { - // unreachable!("unexpected response from state service"); - // }; - // - // asset_state.ok_or_server_error("asset base not found") - // } - // .boxed() - // } + fn get_asset_state( + &self, + asset_base: String, + include_non_finalized: Option, + ) -> BoxFuture> { + let state = self.state.clone(); + let include_non_finalized = include_non_finalized.unwrap_or(true); + + async move { + let asset_base = hex::decode(asset_base) + .map_server_error()? + .zcash_deserialize_into() + .map_server_error()?; + + let request = zebra_state::ReadRequest::AssetState { + asset_base, + include_non_finalized, + }; + + let zebra_state::ReadResponse::AssetState(asset_state) = + state.oneshot(request).await.map_server_error()? + else { + unreachable!("unexpected response from state service"); + }; + + asset_state.ok_or_server_error("asset base not found") + } + .boxed() + } fn stop(&self) -> Result { #[cfg(not(target_os = "windows"))] diff --git a/zebra-rpc/src/methods/tests/snapshots/get_blockchain_info@mainnet_10.snap b/zebra-rpc/src/methods/tests/snapshots/get_blockchain_info@mainnet_10.snap index 9fadb83a0fb..14ab275682b 100644 --- a/zebra-rpc/src/methods/tests/snapshots/get_blockchain_info@mainnet_10.snap +++ b/zebra-rpc/src/methods/tests/snapshots/get_blockchain_info@mainnet_10.snap @@ -71,9 +71,14 @@ expression: info "activationheight": 2726400, "status": "pending" }, + "4dec4df0": { + "name": "NU6.1", + "activationheight": 4111000, + "status": "pending" + }, "77190ad8": { "name": "NU7", - "activationheight": 3111000, + "activationheight": 4333000, "status": "pending" } }, diff --git a/zebra-rpc/src/methods/tests/snapshots/get_blockchain_info@testnet_10.snap b/zebra-rpc/src/methods/tests/snapshots/get_blockchain_info@testnet_10.snap index 14085ee0770..ccb010ddc1c 100644 --- a/zebra-rpc/src/methods/tests/snapshots/get_blockchain_info@testnet_10.snap +++ b/zebra-rpc/src/methods/tests/snapshots/get_blockchain_info@testnet_10.snap @@ -71,9 +71,14 @@ expression: info "activationheight": 2976000, "status": "pending" }, + "4dec4df0": { + "name": "NU6.1", + "activationheight": 4222000, + "status": "pending" + }, "77190ad8": { "name": "NU7", - "activationheight": 3222000, + "activationheight": 4444000, "status": "pending" } }, diff --git a/zebra-test/src/vectors/orchard-zsa-shielded-data-1.txt b/zebra-test/src/vectors/orchard-zsa-shielded-data-1.txt index fb2c040185a..1e39a0bf238 100644 --- a/zebra-test/src/vectors/orchard-zsa-shielded-data-1.txt +++ b/zebra-test/src/vectors/orchard-zsa-shielded-data-1.txt @@ -1,2 +1 @@ -01024f3b1b4de23383f8266b54629446bf287f117f153fa5cd87b39a6d7e0d1ff79dfd24051fb4a5a6e21227834fb8d9d1ff8bca7ea7b76d3e8c061b2c58837cba37137aabc3773fbbe4b0b996f8f139cfea6931074cf75c3927fbd6530031d05f095130b94772a7a585523112bca3c7cf083dfdf11fefae84b0ebb36517bf121634866c8e3dfe5730d86ed8a8e6da11ed2878229c2ebd7d6a4dc6075710a393ce14f80e2e9a0b07f0f2768769bf5fce00e536579c3e9629fd88bb90a0220c0657b36de4bc04a98934925a4bba939c9454612abd0cc44c166ff6e17131ce6f3dccc1df74a39c4f318a9ce11131b7b29e20cb55fb664cbe6cb52fca3044a8a4606bea2713985055223d9bf95fbe242c2ed153732cb8224544a501ca8028aa02586430aae74b7ba6675e7c50b700222650a8f92af2755465949347ef64264446e7baccdd24dfe5eed8b875e28a68dc076627f4ca233bb46bc7f6f1c7782f256f84bfacf46a53e5725c33b43dd4c09658609bace1225560d98f9f95d0e8baf08801eacfe760b5c8e1a0da5091072384bd2d1a89255ad8f15af94b92283a40c280ba27099cabc61953944a3d3ac8386cbfe06071c764c366d918618f21c9bdbb14bacf0c64ddc52052282772f25c01980d4e4bf08bf70fa92fb3ab55728d9bab3af961d5042b5e4e3a237ecc3ee5b3a75145b7ba95aa2ac755211b70c73adf39dcb9823bdb4817aa673cfcb9a9e93f65fbfc4b383c5e6f9d8165cac7c6040368488627752edd8df31d516e359d8a96b522a32e9d1ccdc71773ea34b67de0549d736810e7e107fadc5490c068c6c422e196dcf2630abbb0732e4e21bf610a5e6fcd737ee544fb7f431037dc373fc2645648d140b91f772e22d1c5d107c4b1bf55349cca7fccff69babcda70aec29b87ce22698781fcc01e2cee5cdf244a821fd0d112d5e11e6e8939627218faecebbd9b1cf53211a8cbaedb8d2cb4e25ea424a89275ebab0797f248778f74237fdb3c48631ae3bf48b45ac3ea7147eda2db9b5c14952335b3628dd08a6270dc9d71623a0ffef56b6f426ae5596b00c796b3ec3c82791469ce92f406621a818872e42646c68d4fdcdf1c33d3fbec2090b9af99754c64ae752c06e25978cd6f809c67fcad98cf281709f137e45e488d13b6aac6594d907df375b9fe74584c1f2621ce55de3b8361789673a92701e2a76da503cb9790c1802259b57b8ad6b8567fcb097d75067ab11dcd9dcfa11d4fb6f807adf81749cec10b0bb20c3b8ae543fead2985c1c68946c0f8c2793a89b66f8254ff98bea0045ff4e0530c657be54ae45b8f50322752459e5c9d33b67c40cb341430a8886abef137d0cd98d4b528ce440fd0cd26209b8479a5fabd14f67bd1b0f9cf6fd228fc182adcc729fe6bdb999df4706f87b8ff5f841556762ab0b8e75cc351073e9e5dfc688e88fe78879e79b3ed17ab7ae05dba2fd68f479766741d65986db5d7745ada9895e047f76d6330f13ce0d89ff504c665dc6eb2d4816d9cb2c55e234134eb967438cbc7a3a2252aa6038a4442184d9becc59de88426f2096a9f8f83332020ffe1db8093a87a982f4f9315c6a009c986675faa6ec306994bb88db010c18b2cc502405be8e10b44ffc3e5c444dbdfb4830e2e6d365633b6aa49993b8bc0217228e8869f4a942616556d3274ead57c3e844997389f834e22568bc027c5ba500af7ee2c30d60a0136ece1defc4df879d161878110ba19d354bfe3db352c7a5c9b535a9a7c5397ea9ba2742b243e01a839933764c58deb9367bf1260151ccd04f85edcf67cd2737a2fb9eb6ee6c19a086e2bcbe7f4ff030611e8be36e7d308eb3a9548f949b364b030b5a3dcc973b9333e195ad0c02f554e0e92b8cb0dfccc8dd2f23038a2db7b13875c9959996505f56f35965b10a5965cdc8ce2e59350133f7101b078e0c544a9869bc22ad7bf283974b4bbbae2775f9bb1f3a903dc7690281cfaa1c56c6489ed2347977e82ba8f82fb4a48dc2046ce367e50668a2b49680eaca7a7a88690fcdb67c745ea2d2758ea8c678d45262ef6af5b0f4f6151f9457eaa17caccd58117f6f9933465fbd10e9b73a884c810506c2a2efbed5dd10e3cb4a14412a28a22458b35f19570c5b87a3c53781bf9651abee5c08c54ac21b4c4477c8c536695f738dc10da66f97fb1e00663b56c424e530fd66453035a3fdcccdf6d585dde0012ccb1460e03d48c4eceef63cb00715752dc591c2e0e3fe3228b53d6f797e4e29d6680db82941e7d67ac29cb6b841ff4c1b92a4a4f327e8a556bd6eaed35518dace042f385516e88f449495ba33df9eac5bf21ef85d3901192868e74f54321fb191bb351e21eac264f5d02929f332a6f88e93164877cdaa06d372ba1bafd7298f9cae2871e3c0300000000000000000000000000000000000000000000000000000000000000000000000000fde01c17cfd1b7aa8632813e611ba8502084522f3cb4c9a4a9fc2ae8fb0902de65b68f068fba988b8c181bdad47d44d3a2e1ecf69c2c49f8b69ede82cfafc67924ad81448ebce0db9bec9d0e3761e25e809257ff0d7b29cff484c336da2ce38dc5941c011d8039e72b6b53f008f030d221264242cf1efb966e9179d71c4792df9c2a353765544107080f76893ee30230faea7659e979816db3b6db9ea59f4b947d7504a74fdd9856cf69f30382bebe722723a09a22afc0cd63ad75703581472e23c4b1c7a72617a868bab3790a46e243c060b7e97d3e5f77f81e3ddb8d10c6fd05e2b25058ec4dd4470a72fab4f53e41eba59f4bb0d9457036820aeb847c7bc1647581328f86fb96dc1f5dcac5d7cbc221cb5513cf57964b7c9aa07fd1c94d4548700744a6387bc253804a2acd781ae4463be6aa7cc1ed046cb9233c00591f2dda4dbedfb37558c24bb85d05e2cf4c1f72d9d9e3c0176b980d7771686c0bedf0f423a370edd5158e75d4aba724309fd52157f5e7ea6a0b31adfa70f86c5f01eadd361d167bd4880f4d32498dd5e8cfd23ca90f925fa79e7ea7560bb04f7434c4803e95314e74c15a62671b830eeea026a718dd0969710465e99282ce78f208a5f8313015cd2feb1613f21712840279ce07b64146c0425a1482ea99e9b616d31e8d4c346e49dccf30456bca5d1480e77341a717f7288beaaf960ee15d844ad681fdf3be342e377d9847d19ade5132a978a8ff14d2e2cc80742f0d89b682fd245f651f3c729674cf50c872a75691c255316dc04cd0ddd11a3182fdad371a52116659fd876fd68303513feb3701c9df8935c9c86a8075210d401eaf2c7815d317f709f22153f5d9f2652aca2fbd0627ae5a38ccc8b61a13cef40c6caf3b5ad51afd5c3a076fb6a2587a215849d9c62f565bc977167186e6aa8b29f05c382a028ae85e0d2bca52326ebb0528e9e9adac1eb7085d816a7cbff6ee1df0530722b125681cfdaa5a2522138422fed411a164ef599072c7dfd11dbbf7e73baba76e19fbd556679a7fa3e3c14334c61995d9028cfde2d5d3454c608fa3167aa40b0be494fceb3da27fad031d03a4538958d3fe556599af0bc4e565a44488100e0b591fb59f2400058e5447a55fdfe1d4fac969ae8d54cfde99b3f0189d5405cd9bb5f813551022a6e3f5b07c916064b9da98580dc0689d3a10dcbd9da061a8fddaf36c23b1b4c918fd47721072bff8ab52825f0ca00ea1911338cba97a933279ea39ec47c20a2e0ed118a77caa5737bbf4494ca070490a081cc6949bff6241a6e89ab4cd83869c29690d5eadc29e07f9322b25e7e0a66bdf225d443d5584e2df54eab02186573d9d729949fae28230998d792b1a0d05ea1ee0ee1fa6d1631392e0ee1b606223ab2fa109ae349b8dd520ec5dd246fd4dce7fc116d802a581c4aef4bff21ac533ba11646f7b51c7a63f85c80ad1c31e640322ae7af1b7005ed386e8713ed64a37c29ae0a94c6f43031dc7f82e08479fd413a9c5c21b02c99c638c0a8166139e996d1baeb0b1fd30a1f51bfa2ee552c3fd17f517da095cfb58c7db31e03a92c3db1fac4886255a9ac23c6d569cdd1996ad45ff45940930a997318d451e80914d9b6418fd9779bae9764af5d2ba1990c7f01828c18416528ccd3edd362ca6e002b38290c74e77810478889a761d764ce1186f8a1dea8712e01629c9ae17c0b63d205cb410bd82766e0f8b392c6570d7004ff956fd1e89e306fd9519a5db3e465e06aa024801341651f3b6bdfea21012c5699c2726b6c4d911124ab7b8dcfc00766c2a338d4aea2522a4fb31b4c8638f636a4fbcae0c347af7dbba573169121870c8091fc70671734d48af6d51159716749a075b852416a95bfecc264beb21a769ff4e3c9c5023cf797e71a67df709d0b3d00ff717f9c701ae0fcaae410bdb0f47b996119c28965ef68afb173edfce1c4c0ba64099914f968837098ac1d17b9d5678c580be16c419e9928bf9dec96c361c1b4f395aaec054850bff51b1736adf3595b7bad6518588c8de3d940e90237b5ea7f56334e2c83058e336cdcca14d62b1e0e229b9c470d9746f644efeb23fc9bac52beb2ab70cff3e67528b0d9044637a10193864fe68567f45dc2f142e39a38ec6c12941850440353d31b9472a8c9aeb3d1b37725164848f604b9a6454eb9e24ff936f2aaad3a455484877684ebac2ec7568800ac3e804d35807cebcea9b374ecc9787f5077c7c10691d269ad84a1df62ec5233edbb7dc0e1317b126ca8ead9a28fbafdfac1bf3ae4937c468423567c166c618d758ac92e857252b854832545fa8a74721aa4a8c82822999eb2c80b007279c2fc084becb59184fc1a020f4b31276a774f671a84db1148ac389d00afccf74fb9c4e9531a12b17c9f75196cb33492941d733fd0fbf08554dd7ee858607b90cb1052e7c7755fcb45193d96b88e5efbe519fc703c2b19ca09b4d88d07d35f9943904b80354d65b62d6417f46ead03a6107ee1735dde1a2fb8236e233399c52e5771ff1ce0112bb9e3da40d3a79f403aa58dab7ac9d13cabe3ebaa34b4dff2b2ef73276ec2be8ff54c684dc6f3ace3a1247b14e55bde8b8687710590dea7fb51f4024f8522a3440a4703fd1af635641e6d936c03c03fd69eef8449f6239301dc1541dada303536a16d2ce1eda2e3de2ac3ef36e74698d08c96d1ddf46dd3aeab0192994c69701b0bd093e733c20ee0c3b0f4b496997edd1a089cca6388bdddaf44a3bbeb56831fe0cedfbf25c21460a64ef8e9b93b54dacdd407e9adcf425fd2a63351925966bda7d50f3823029434db64123563f886eb6f7d7b28ac14b7c6b5f5727eb19ed24ca18ea060c2042a66147120964354364f405ab49fd1e8b05ea34f23c630d8765ec6a73b70eae2abb5f780e93e677ece84d541d651aceaf5284bba032021ddc7a15012290fd1a933ad3844822d65643eec51a7ea5873968844088671b05b4b3411b00a55b512ab6ff74d8db8e260db4ba47792c692160c89723901705fbe445aa71c5adc8257699cabbdd22f25b60fb5c889ad09c7a2830f6df3cfc0e82ee5d7f165b5dac9beb6bb48deeca18da046817595c2c0f4cd46c4b5c113d31a5d15090997960ba2e854f0263611f698110241ebf7231af3fe6439c886ac71d9375b7c45b87f4ac6abe5cf826ea820d4b678d65bc29ae3b8b37d5e1bd157805ce1273b9e56fed0b3a2afec754a759327f6704a6ff42371421f9afdd5ec7a30a7ccddc4b0b04562f1fd16a02bedd4c97539400fee5782be45041750e5f4daf048ecd59915696c62171e8314ad09f2d604d582b7735572cfd5210ac2fc7251a043e5ffc19b1c4d04135053bfd48ad1eae26c99a9b631dd5f6d43b8af7933f9834c5a00c5698d91618d75dbf6b7121557e7a094fdadcc5254e3366f4de490ab30b9eb207cac1022590319db8d3626a0d81aa0f205d3891484dcc6d8b407942ff0fd94de791b15d46cbb1d62cd90a3fc41f72519b53f28cff7fb3d30941d6696c382ff08cd14a783b6e593f2c88f5604313f2b7b80bea6740b2368af266d45c09339e3ba3b227ca88c6d03083b6fd46049c7c0aa82c21d46c397dbb33253b30600fe31f796950dc09932bac3363c76c705d7f23f3de0e1bce3a42c00d30c169690dbd20cea04f096ac6b4c4dfa260496edfb84032d3a348430fb5357e8aa7871f0849ee5973d5669de1efce65863748997c75033d25ad84304510acd3f94005e42b670a147fb04b02a74e9d1b5273ff0204ea956c5611ff5468fa9b1d474611f80b0fb6dde99477826f196c9168f314b7196781ceec2ee5ec210c94bd90726c5317b0cab154d7e382d97f006169730477deaa81a2501c9ddd2a6a8746681442aa2b4290e35103ca6b39df34e5e6ef6c1427d0ea9d71749188962d896ca859157c17473058c66d851baaf051d5021e349cbf171db9c8c06ae11bf7fca1cbecc0f21f7942bfb6504a57c82373474b4ce1bf5af9b7a8198982bf17e63492ec943aca3e1f5a69cbd46c5337d224944d82a5aa219f3ea05902cf4ef4e83e98f27d95a82555eccf59067c502e1151cca43f37426684105f78513436ed138859b22a14da1eef7405a285fbbe1f72ed7ebf8a5907da9360d2ffb1d067dda10de9b4768acf13689ff9bf23c35b4c6e0a645d293ccd0b46d5f26ca4a2b38df6b5884ca0329929e72a2485f81aa2366541ffb1a733435c30917cd7387c1a0671d5c40a426da601da1e2d8bb09da80b791870713a8e60507ee576c5438f9dd6423adae12f93a91eede37edab8308253dc4f7db84d488f9a82d4cf680a633246f40d341752421627e01ab9db6caf27baf27fed19c3a208d7439b482a9ba3435ab53b42494616ba138fb7c56f05332cdd647d9e8ec518c01937e4665bd9fc7ee7b072452b82b3443ebf75874bcbde6c585440caecf2b6d659f344fdd92d8bfa840a6084787e7cbf03b664b0b3c52210590bce1041d64826e2c6c8ede27bf00dabb30ca85b44881b14a83ac3af83656ebbb389ab5c34b459232848fe67fc51ea957dfbea48390fce0502f44454dfb1915a717d796f2bc18f06d8d0a739f3751f92b3157a4a0138de35ca09e90ffcb94862f959688fa86d2f9526c28853f73b934add66b7463c573b315ca934bd55540d80d15c67f9f67175523821f13504c3f3d6a3b8aa672c8f020544dad3af78fd6a962c1babaf654cd3280bf763b444cb28eaee3d0578ff6b9b3401152d5ed101ef9fbe4c08df45c55153d77d46098a39a7045e9e663a7053a63c7186c010bec8756837c352dc459976ebd9da5e7b45a1835739a84ec1f4ec7214cf524642d3c06ee129b98f6bed17629667e8ae05706824ffaa6f5e157e92cf1a639a55ff8d5ef045c06417a0b959e5eb93d23479915bc231f53aaf9584e7da1f6388c9027b3ae01035c0fde3cf300bcbc289921be8a148dcf83418a9a885e829349545972df1e526c4256abf288ed3483b9d7f7c9772fa577518d24775174f1b765a3c54cb8c8d1a4eb898aaad023daa3b58423145cca88e7d6382a0fe25c2196b37b2e0d037e8ba8fa294caa29bf35b36c458217922ec76cb61214c5b27412fad9cbd34e596d36a2ac909ed004917cadc54d874c5b93041594c8c8a1885b020540e75e2ba6fe86491775057630f1399df495344db366c59c3c8551b05f7ff31e9ef34f36e0ff99ae1853c7b8536fdcba0456b937023b9b296afb2e501e46130b3953a1d3fdfef4fcc55539b23d67cd65b759ae468fefe0f4a7b5211ddee123b5ed08921014b471d54f065c8ea750ea25e7755468d6277710692536152db5a29f3dec2c4296631766ef280b07d1da8f12efe6c771df9b9a6fa64d2b26c030a17a086fbf4c3a72fdb7351d1e7a9d9b2214e0c6accf0ce3336d867738699ce023113a3e2a30b01e84ad0e906361d0b5f501bf7a75b9c71e4580e47dee12391870cc132d6bd2e7961e87be6ce1aa90c5085fdbbc0d126adb57a27342a0a9f27ae021468ba4ea45e535a2f095fe3e78071fefae9a97c29a609fd7fcbde1bbaabd211442f22ab226f5098cf596751e1ca852425cc11c26407dbb8de3bee681f1cdc3bb1c104204a8f3b91c9d0698c739eb1b03941cbf6728800a0a92289841bb6cd17004f8ec77a2566622b3e6447708a89d8465ae985528a3e5b6c6eddfdb94caa3e88bc9c1def29f403889f25ecd9af8a8f95ebd5e6c167c870188793903afe901efe47aeba1c9f79348f36aae4343a1f703b9ac018d7001a937f57b51e5c502b3b51f8e77805055ecd408b1fc59435ceac43ae205ee3e069b6e7c20d51878e9a07c8cb7c3a6159a2b1bcc002264f7bebc6b35e1b6895c21682f6d6e0f289261629acade803146b5c2850949a2ee9d8c080d121f6ade9c5f9032b6ca244c3479a1b5d30e59cfe033f2777748eeca7684efa05bdcf59963e9e4d6aa90ca24e09512a8ec4f6bb1f6c9c8d8ace283f3bd36efe40b5f6d1403f45e5846b05299bb6d7254a4ddd0a36b1b893791fe318e05b2432f5a0bb2926a7f3d4530d28d7eb4c7a251ee068fcf981c33b680a31bad210b9ba6eea516137ef4d6ae42a542b034c6c0912e4f86adf41e86463b5b6b6ded2314c93629a636e7169391ae885ec08369023c600954ea059e2e081f39cc95fa77bd963ce335fafca84353ca1136138da2f20dc88ff68a499abf9e83353f7e1ed528b19b6b5881a0184098ce60d7e3eeb620209b05303c2ce34524415ca4885ee1a39d4299aa900750f4762275a6ad624431477f840c58df2ecd0c5fbb925402d6ad457148f5895aeac562c48f9f0ad2fb10fa7cd9629347820e3f98fb51b6f174407ba6c858ac1aa43a3d61c8b5431ca740eb8d798fca971c47e59606573812b3fd7b197f393f27748b64f023f814641903c7a96d59746b3124f36c55f820a1409881775789a83dd66fa5366bb3fe645021aa63ea89e5dbed007cb7772812eed82b6e2cbd94b3b2f94091c1d22142131d20bcd0b9b3536a2f451598019ba8ce69e7e3f60d14bffff429b2f6a0891b21016365058dc069b75a4404eabe3dbdb9105e3025cfa212dff7e83559110847d20713b72d1da9c3b86e7f05e92ab57ef6e64b4e2f649605a73c2e837d69baae7ebd000ed3a947b766b03e2bbe50ccfcddc0851b2b374efee1af5668a50688c4b65bd3ba900cfc67b3aae5746e109afc7321fbd5dc5758703a29f90b669fb2f53de8c30206e2e89a47242b50b22fc532cacd1827a71ce52fc7a65e829dcfa8d65334b1af54ee32b3327b16d3d5a1f7bd11b35470cc336f12615e5128c554ad88ba99a2849d6f9a5bbb5886dd4a61393aacd0081ccaf880879aff5c10da8c216fbe4182edf2fa6b14fe97da97a62f4d052543c80657d5ef828cba8a2ceab3afca17271140f7ad539ceee75a83d93cee1b33d09302ec7d1255be8f03422733586e817a51bb066eebf376ec3f57435a76572c9677008ea62ae6ec06e2372771f60ee42250b156d8dda94f4dbe4a05852e1ae65b07d0fc754c7eb5a34bb90083d1611786c22519b1b208d4c20bb7a8622ed7f745b29676acfbeb9fe9894bd405c279ea3c007e6c66d42b7b10dbf2160c1645ee97affa14345b32363d4c5b08f688df07dd3177b23822e9a3e6bfb4fab1c933952de849e15d6f9797ba62cd63cce033185e112f9ed91cb1ef00197ef7c9c8eeceb48c2065b957558e3a6295e5a7be8ddf7583e3e3ac6bf3759a4a8e62830c785899132e87e2ea36dd07684142bfdde3bdf1e0f4a84d6d4478a134b7722a9d9f04f0182b91dbb10d49e0651a8c8af144bc8e62ff0e276ec1632cbf83d74423b286d091fec4666b84d852b27408feecf0037ea384d91c3c832cf8d6f2cceeec0444747aff65daf6404a4d6af7325f17182fd151b4de835faf3c34882b73d49d61363e58d2cdf3fb34fe6a47367cd78ced76091237353c403a42f7a7db06c71bd53056af8ff42ec9422d126e4f4eca8a64d151f2e6499293bb7646f949926ff28d52f03550467e353043ee2934153e939e40b4415db2f4ef11b4a8766b935ac8f3d4d623664b9c9dc8b1d241512ab8bb9e06af913e0c7b7962d41951d304aac35369b58819b42d9bf2511bf9b9976607f6027e627ad8787cd8c984a1bf42deeb484506f1f9967f2bcee7e09c60812bda9e13f9f3d2b7f93d78515b3e16ef497875a04ac9cceb8d5501962e98111ca2a236c9a4330bb9b16d3753b20f016fbb809893bb4a51f361a6eff0b87a956c742cf439ff916a4c55c2bb443cf4f9836c4e67c71833d050a53459f5583489a91b23adb764b1a9839789901d31eae4f83e8530405af73f66d0963e960d021ca9be5919df5ec2ea7b34d5243b10beb3fc755863316836b2fbb53414c1dde45fe7002abad1b8c3cf9f702465ef59c51fa34221e686ddc29cdc9c80f6531b0a2fcb96cab3cf48a13dd426567b1980d758fdda6ed900957e7b8667133f89119cd5cc022f8862ee7023c154ed3c7482da0b1205bae66292585684cc82f1822679ba7c6e31794eef0244a4fea5a452162e47093378183cc99ac0c68d569abac05da14ef0a9a3d2aa907d948d4a19ffceb086305ec684f011e67c2079519708ca2bd215ba9501ba75c30d1fe2b669792c51ad132e2f39a47af98eab7f38cdf43d342c0c3992e07bcea3c18aa0fd0c6164a48e2f21065d3d8695b43f42ccc3b0e449ae0e58b3e6255550dbc16c612968010500cbe8bd75ef6bb607df81e9d540e56c4c176a363d5a31e34dcb7a6be9f556dc9bd5fb187dacbe45c2bdd8df82f4e4e2835bcf85310371832b2190d0596ef8f818c600a81fb10b46098c46b2209d8b0296d1fb1b4b3f8372ffae2101d248e417b53b61606920c10246921c18d8dda130e403b3937368af801fc4f515313425c97adb525e4ab15a8664d25b815ac25f1fdc5be58b68d00b01ac9a622dbc0af1b63ccfa30ed0602efbef486dd8e7945943d89177e215153d9331960b5a3feed03b95fbe684e9f0e8f9b924713e28e99f1f64a4f70949ffc323e21d65612e385c115624a7f246fa392bd98d1d87fd2cecccead2a96444f665e34758713301b919f70fb31a4ed19cbe95b9851d90d584769f4afcfa8e4a6c44a10e56e8dd838471b20af352d499daf5446b0dbb5070ca265edaae5ad62804fcb2faf08b54c35c44a57bc7a5850407203af2bfaca86201545b721f1f32dd761ff12991ff1809ef1e4bcd7cf1820d2857281aab9dbd2aebf47a15ad968f24060bc3d419fdae05012bd9c159fe09b17f7b6462bb08bcd78ea4b705c7aead08c7d1a0e5679903da539932a92bd78ab3edc6f8bfd3af8d4bd789c7dad1079f6186e8e28e64408b6d48335c5fe8c316a2131b70471e3665a4bab350f97bf4c4794326711019ae19cad1304b2abc790da3824c19d2ad8ddf331933c5f200f9ee8e8a7451cfb356918cccf62ff6716911f782fcbfe4ab9cd39dcde7b90a65a676da464650fd3a4b4a75074dd7bcbfe0cae5d2eaf8f9e865f29172ae83b63b4ee1a6bdc0709a885908505afa4cd847fd58fad4e5ff96fa39d3ee5e0890aeaf428c29d6500154d1522655533c2421bbfade685f8b9217d781dd8fa413133a2859485b186e810c344cfd49df117487a4696986dffe4d34e3cfda36895973daae012265b396d01489e67a4e0b1ccf60c630fa018aad7d65a89b9dcbe631ba5891df5580c735b2e124789d6d04515bd06896677f2f6ffe3f07b418875ba36773e558e6c8cbfa53d3e35cf7c1ea6247861f9353db27826b95bcaf0afdc54d44bce63e9f65b9d592b2fb0ebbc2d09532ea15fa1a57b5b44ee9f478efd2454a52c46ff3d4f8df39daedaf0a1927ec46a38b69e44ba19a110a98ae5ada516d21951eb46d2f2641160181932d9a1baacd097f67b2d258c54d93dd0fc6cb3db130aeb2ca376b2560b7d013bf92f618c3735c7ebdd38db122629f12e32d27dfda83bcf8c20dc65f22eab9f393a55b355dbdb496e321f4f82c14484887b085ca62a0a3a4d0c2d6dfa804d3e7b920cc0a12975c1e2a9a1a68255164abe07a17b5ffa4cb0a87b18b3e9e4cb89e1d27cfa1eb0242fd8585e4a1bd5a4744b680b558ec3aefc9455f002f418b5b9bbe08954ea57b0a06cd0c6437ab4ec33f396f5eb8a2c3e63450a3ab8781bdc9564372f743416b1a60bf71393ed69a2666e30f75841d04bf2e56e3afe8cdaa381336faca15c2746416318ff73de73213b0afa5a1ae1c855b94d9b92b2c1514695bb02655b4082fcf1c5004841adef51a51f9fa2f736fdf573e5717a2e1e220b349c15aa1b8860d42a65e8fff39ed78f51eca12a0154225f630dc67b6136810b2942d9a713a8b950166865831de348634a24a2dc9e035015069cb2a84cdde0cfa6cf066be8a82cd4567fb5c6b90fdf1bf2fef482b02c9641d0dbc66ad55e12ed04d4d8915a493abd8bee7ec670058a9bb41972c200d8b0a35ddcb82d9576ad228f357c26d2f8c51e7b1c9015124ef46c52e5ac4b6c9c1bc48f7ce13eea301ef88abf3a8b191e782543db418293a3fa451fa830b411fd20360283b20439f862dba3c6cf2e0831c2c3aa1fb56ce734caf6d092b91facbf3df554ebbb606d615904b3631d8782fa3a3ea0581fdb68a7d87cc4c3ba59645dff6834a0bb409e5a496a07e1a77ae0a3053740f8b9fd5bff8f6bec65d622b1e55c80cd991aaac2693c9aa9179a9fb6f81fbf10a4f0f8094e1855b0f44a7c57cf19340bc81bec340a58d1a314b8b6ec697b023d500b5f9577667f42f0e7578dcd0ebddcc7e58ab5e59198145dff35115ce9223d7ecd668d14e60d5976014ff80e131089c929615541c8e182b9e862e0ae2f70a67263ca6dfca71f6866ffacb78119b9cef7d962b4f2d75e2440902dc0e620c83eaaaab7eee2fcd18828124c5fc4a8f1147b017df22e99331b69ba08e7c27c5398a562374c1b5d874a7758e1cc530ac90454af1ba5f73a5b8251bdb4671f1b0ea7cbd33f4358eb52eb04c7fea14b54e1564f59431405668e2b3afaa2e4ac975d382059a7bb60404d7ffec82af648bc4be634797c4d44c2ea3cfaa6180225d75cd76ce05b98268a3b6bba050f2f33ceb126ab31287bd341a0120a000000000000008bdc33e41bbfac714be1a07b266b120263af89add962df7e752c0bb7c039ebb3879fdc162c1f7072e7670c16cc824ff719ffa8fdafb900fd3b5c04ea718b2b2e - +0102d758a9475a0662e299e5c50ba1ed56f3cfe02631f4718d597b4dc898b9634cbc92f8e08b3e7d504c6874abfd98fa4e33ea2e109e1411149cad20d6615d222d1882681028a3a47661261f49469e7479926be3cb5008eed5db3459caf20cfc8b301370ea9f2dcbe934f2a1f2e7ae539d36b9888c0ee278a1d6285c06442ee67f3a2b3f7239c9ce5d8a4740d23d00755267b2552ab52bd31d25b35a4afee240dc98196caab7818aa6b83473e832058c5cb4603128dbb28457db1f8cee0b3f606ede81382db3ee90dbbbfbdf963d62ae0f6a9adca4579bf46c65865b63e57f25d60d40d50847a9de5e2ea8bfc760c0a3b6ad99690dd35be2876e694f183e2d42b0aa802d66c1dd1284041d9a370ec17239013c9e34c9181b90db5511b7073c3e746e2dfc301463b915f18a42c96bba67110b234f072a980ab15090f86d5c631d27ae37b5c599ba4bc5e2fe0aa0498d5175bb22ad257340ab5c3d7f606991f0126464863283ed2b529b05c9d8b413c1208443f94f547b08f0bd81697cb35ceaddcd716090add4a4625e1436be2e7eaedb281a235e52d2e7374f7f5950434383cf6d90f4afc2a7f2f88627acdde13c626e2a82d3ed0aea8976a0931b7ad9ad008cb7abb6e236b1a81b7c0a382dc0633c7f115db16794fd32c034b02a189c7a2d9baf341cee216551465b8aa58a5468e35d204b31980e9a7ba8e1c41b8af4b9b40126897f0847e7f5cd990b2334ddadf8db66dd804371e3c673d3f312f0ee909c711d6257c49fcb4513d1c5d2c565c810f7042ad6b8d55e2db9ae81631a62a0c9665ff27720b58f98ca1ed6ec3712b1356547aca2385f1234549bd9bd0cd75db99dd3b038998442eddd76c012c090798a514edc3d88722abd18547f55f1f0f8b0849804806b968af345f6980eb263e252027caca310083c4a8e769081984e18018ce318a11f56759189c9923d0bf0bc8fe48fc534845131ad14b9e90e1acfced67465a5ea16769d7596fc04ee94717fb33ac53a33c0c24632033d802aaf3a003a89034ecc179520ae5ec5b1f7cdec721e5e8fb28f449e5c57e3991d1c47ac0d6c6bc070005c80650aa9288c2859e21e3d7055fba3b9220464df29b1d6e3273e2fa4bdb4a9d610c09ec7dd40c48255980048015752b7fb1c676250192767bb081dd73231e881b3be73caf3fab53599451cdfd5774d54230f35f3898be64805f2b8e528dcb0f6b108f4145325262a2f06ffaee272105dc2270293a31d2826e353c7877dd459b28bc2cedbfc1b4eecbd5b5e877945f5bbd4126376a667c22f1d0c7b9484eacc8e2d10e9898f2ae66d21078308c21de58f5d891fc468f5e285891a1740bb8db85a29acfe11ab76b7d6dab21366a518e0a0270156d0bf60d68aab7f1ad93ce15a4e6bd14acacefb59194ddef7654715f87d29a4f32c5d19dcd77f0c04c6fdb26c6a7e56904b35e0f060c89793894b0433d7e3ba255513e4e4108993a6a3f7c27b47955f37a6abb8bc9366dd30705f9898624ede8e30627edc0af02c884875d35e7115d761717e1564e6499d90f7e962419e0d4e17ba12de33812dbbc035db840023fef69449115367bc5dfd5900e46fd407601ef5cf55640a8953212137d42eadb3d48f8041df9d3a537ed0eefffd65b9d3559ad31e6366e1a805291707a44381b3aedbbdb2ef0372bdc96b7473426b01e79831ad0a45656e3d60ebcdacabb87f234822c9788a52cab52461ed287b147767f9edb8c4cc7ff0e0cc2d545f3473750b831eccd1f1f393ecd7f62444b833dfe2628291c7110292ac82b91cf960b77a4d441347570a37a2a42934385702d1018117e22270135b1e721e6ab251ad3cd5505fd5d966a74df3bf47388547c1869473d7806795e7c4ed37d95b1c1d526e886e8b06531c245bfecd72d258027eb8f584799371da1911eb2859ec0e7571b109cc39f7e93995ab053925e9014f002be80a0d38447ca0e596be9b0d1944c2733131c3f21961a2c1e6e138557a9ea3372b170cf68082cba6b921dbab3eb6cbe8ba3e34f5f3a9b92617bbebc45fae1b8f4a20cc50cd6e169b8928101eebcd7eabec395aa98ca7a946aafde3e7e807ac0d3dfcd542a35c071cf8315c552a89684acb6e5a41af4d158522482d3aadad9eff8b9087e19800e761e3b255e6538e7574e7f1685c8c2a8dfb998ac163cab944f55e6e9c5f6fabcc316471f5247381efaa041ebbbd74634c13b28a84de906f7386c0ca49d12c2a80f6985afd42bdc35b8a3d01c22cd6ab295d4ed4837c78562086a284a67886f820dd060201b855b580d71b6f5dfcd95dedffa6324a2de3404f6e60b04c941a5a5cb52688f660896e192cef8786db2c00835d6755e7f5e686b804ba4767134127bff4d0061604841cc2c84f948de65a4434490300000000000000000000000000000000000000000000000000000000000000000000000000fde01c5c44599902fd9ccfcc44cb5a588e2d17fe156d5a120d4a7e69c9daa003203a002328c618058345dffb7ea0f0688d97b009c4a5917d31aefd5ef4b9c4861d580c756e93e4bae47988e0346c34d93637dea76c3b7e41631f9abe74351691a51820cff64ea49d56a522634e04579280d592be6dcf2643c533baffcd28d22a56169f84573f7863d2faa3abeb61be52243b4476eee5bf74b541416a33e39bd5c3a386bc9ea573303dd96f52952cb82eb7032508fa5d709a02266e591c9b7f89b9203791b5f189aecb747d94fdf6264a2e371dbbb926545bfe14bc1117211f9c9db81041bcf6813db23a291e51255227051745c2667dfe1732b99628dbe2949cc6f436527e3480a09d4b5e63ad4ba2b8350dd350ddd7e47d86353e90b5e0da2dd7b50c2f86da1a85a3de53a3a8d6111cef73ff014a47a7f3037d4c3a87dcbb09849d1eb6a9726d9716a2fdec97923c729823e37885cfbf5ff7a37649ce71e7dd6a879049128fcbbc29a37ea90c9a84a618db63fee999eaae844b516687541cefe270be252f41814f98ccb7cbd0fe8bc3664ac9b96ee3d480b6c9d873b74bbf8bb830ac128a89009bddbafc45152d4caa83998d6e6613cd84d9892e2d9a4066feb409312c5d2e936658f70af9743f121b47027083d6ae979d3d8fb01e61f4e3751cb6051270ba93d0d76f1eea5646fab89b8846be20fc577abb7a321b0cce85f16f1cbdea454871cd273b5b70c056df5cd2fdca2174216cdac72eaf7b7d9657d0ce77246607144f7a202e83774f95e969981282a2c5e580d3eedec39be25a9f1729463b15b15870b2b9a75f1da8d5d1cfe0f5b080e9922ca0c99d0d8d4d83195eec301807d2614d23a34f6bebdbf0c2337d7fb19cea5f7ad9612b39c1b634579062cd829f3a5b339d3ca46b3c1ebca5a01ea3010089504c045697029de489e84d9883ac7a5937d5dfb52f81fba08a4c567360f3df89234e0ef53dbf6dff9ca9402c493351611f10d7b6175e62283fb37ebac9a9e1ed40ff0c5caa28206b4f69845cc483d72c7292c5629b1e55c7cd5c90ad37047b1be2245473bbd710c54a10ec7b68202ef7bbc11a83e41de15efc1f54a4d516ffd7eefbfc743bf4ce441e52213149bad4475965a6b0ab51cb1fb92f5354b2bbb7adf5a895ba46e7bf6d586870f6b52bf96d16150a3347fc910ca8e789367142babb41b0894e9ecb36d054e2efd8a1326b2f2092d14ebec69d8c9635c7296cea2b0c70697622552d9e87dae493724923d62875a13c95edd23185900a646260c35011e8f9881f8698d15e07d2db5ad503e33164b8fc02ad491724a550ab4cf2a23a0f09d28df14c97851ce01bab447b12c9e066ec026529e92dfac37fedccd1423a165209eaa2daaee3c1ce672d55b6b5bfe257a3b96ee9224fc59c58b99d9125843a9d6a0b56eed9a3e34f962f5de003c2cfa45fcb63baf7ba4b40b9ea8e65a2dd218a8cb00a8ff06e4540e0e490a115acb337045459ef582b00d86d317b5c647775735cb5ae479c0748002a6f44bb8771659e54681c921e87e9b9cd59cc15430f4feb2b3c5e58f33d7de554506143a9a49ff0c0313b0d68667f01db189c249ca4d722c7eea20382c7df66ab0ec93c3694f6e7cacd66fb70c836a8de9a1759c45e2035da392ebccf4a1c748ff202c4929c70d3a783d338ac015374bdf502017093479b8ed6e0fa7c48fa6e367d01448db467d94e5c80b623e40095936eda3ad123f08ab5212f8dea0869e4ba53cce48c5962bf42513a459c1cd9694eb45fd8b540956fc53956564a27e31714fecc0f020f44ced66859549e4f43c071624b07677a39c9699995a92195996263fdae0599a5eabb5dc44aac49c0f84a08e2272c5f4b40bfa0d76008ca73b10febe99fab2a681c497aa46a1327925581615f8f3a2a10124967658ac22ff3f7c0b30680e80a3189643b0e7fe2665605e6bda5f9c0f42471c98b080c4375499ed84daf095c18784a0b49f708bf691c156bc5e7fc76115b0a35a9588b8cfe5583d0030e3af9176505acb3f4930994282ff1eb3667a6b90037633c849348c6bdbfb46e4afb432b5a969dbf6152ed130b171b9fae70028ee17b305b65328a9905efe0baf962e02a72507be5426009e9dcc506078feec57d3770cc7432fdf3f6ded57a27af4fdbabbbee933a345ec5e02078757f77de3b0098ee2fee2a1c0054099f425854658303fdf54454ea901a5897a49847f2d2781073650e9ebf5c7f9484f09db1f1f32e19a615a9ea3ec6c0743009dd6d3a4ef069b549ab3d052c2145124f08b4f82bb70b5afee0d109fc97a11177685442d7974d9f5d6e28b6d7bdd95914c81aa64e298f6b581e49f5638ec59c608135b58ac7f7ec09b3d004ff950aa673fb03aff6b016f38b2fe688cb1db9919da8feec2e100f58a93f047c627d6f1bc327808a0f52253b0ea8c1121fd8bc41eb418a728695aec9f1a5a57450ec28caa454937128ad1c417468d514b2266fa469eaa843256b977575a7e5bc3a6f67e33adab59a4e3c0f2a22a45fec743813a912800a4fa0c21e7f64ebb47eb79ca205669b8a5555df1ac98295a5ad34f9d80919c8a76828a237ab2cd2b540ee894dfd22d79e12d3e902eb4d55e91cd53b254db589f3a9235823c8ac24a5977480f8b83a143a7a61622f26496a6458d39248f4f2b9fe8200949dcae3e054ce93d15f30b7cfed85ca711413ae6c5277421fc2699479133cb27ec665275184f1d0425249724d8bcfd53b31b73742f2403ef43845b7c14b006e9e79af93a50da5aee15d14149ed342fc2807e1a852c885d0e3b9f82839112ccfef7258d6e6409e4e13063f7cc737e1805f3ed523ee8d49a129f2bf1a02a2e8b35631dcb7ade1af8c7691c0f98b990101b8384dde95181a3f2df94b59d13eeeff85056718117dac2b6affcc11d8657fedcf242ee9dd003e6ed5d22553030b13a598a6f086aa8dc0776908fce99b09286970334356c45b879cf75a8db3fb32aaeb1915e4cc953848ee0aa5ccee11a107e2f60f7c99fe9e09afa62553693f4cc8a857b589c0864829a9f3376437e2e0024a6202c79dccabc7e8159a0b3438121553c2fd75b372ab13d761816b35a628390fc70f8f77fb20e0e0f2344327217edf3ef3de6c9f853c770ea68570327cdfbf325e08ad7379a05c5d176ec2b2a4b3f520c02265082bb332badaa2569509cbb355071ce03e7889cad51a91f30244c66b716c602c470dc39c345e5c8475b90b3c1e2a2d39ff76267f1d31f4e54448da4ae7fcb188c5141fbb065d7b31dbc00f4a5cb119cc2bfc74cefd39bbb130b2bef42b79ba835250d6c4fffd0891c33f09b6c207206b56f9855e7ed8e64c9d726fc229eb85261668b1c2fdb6d5649eae8e8eed75379845ead4888ec54bb6e17f91350f110e0e1a48bd5fecaf92d188e8e8d5e0513e3b6daa4dd9274b100d5c82be17363771cb7625341529ac2f28187263c6be6a08355e5e48e00f70392605e09197558ee2e7da86cca004e2d8f7627327fd170b124b9fe4173d003a48cd272e07a1e80a6e2ae3febce79cfeda4e67d1240319d800e234fb5ef8e71976cb7f8ac258a6d20a72debd188ca3ad40cba763d7a5b94611f1f79466e51703d12c365bf6104b113808284650f4537e6cfa42514d34e9872ccb2e0312e492c77ba23af7e5f8479ffdaae33247075f59068585762d33056a3e0b0a71d3ba1065dc9eef68c9b06b5f0544da20c921714e06a38f815a1c79f019a88113438f7d2065b7851cac5e832872bf16af7b6538775fe0d7f5fa7032c90cb2f3838469acbaea86cddadf57733b136a532533c147b363e5559409a24738328d1d17eef28bc5c32d4ffcebf87a98b70f4d7c094ee71d43fb7cab37dbf64e3231934dd4bf864d8483ed7d2228ffa3fac4fcdef408a77fcce2ca372ceb3b9d3a3109072ffebfb6fc39b6d50ca6879d9ddf2e87697bdb029f5f6f003ec68b22230cf15c52de76b7230bd4fbf447b1e2b14ff5de73044eda163ccd317a967dc72d4ed76e5ae514078822454abf4c15406e4df0ea9ab6a7d52573f1c3b1f28d7b12b15d28a891caf9cc529f6fd62e66e44901c443dd845e1356370f7d371dff0c3e64d64fafc1c830f9ec8091247c82435ba3c4ed2c2578b2dc6e2e3ce8ac153e25933cdaac2b91a687813140cee62c62bf6bd4e8216c9356ead956f9ba960c6708a181a3914e4073d1f78fc8b5478026314a816ff8012bfda6e0aa59962c53893b64e1d54eb28cd54dfd7a2d687f4da09ab377c2808450a1dfdb93eca252f50f1d0dfc51a95081d072afcabc84d1d9ba453005e5c89c0b33c9aef02837d37b4c16ed519005a4d45d937b23c8ed377c820f651cb24e2dbe57290b152ce7b0341a3366d18d5be2adfe1a12f64305ca3f8ef2ff3e454bed2acc7968038c22dba59b1000baebbcfa70b7e4ae7e574955dcc20e552010e46cc34bfdae55791b24579505956da6f7e4f7ae97d351f3ce38ae9e570c58ec8cee36c6198e5e4ca4a439582106ee0869109d533bcae8f978d8f48449db4a00784dd9a5605c8c6dd036585d1f98df203a09094d3a49726fb7983296638fa086d5026118faf78e6b544907112aea6b553c4ecd9d757c37fa342e89f3426403fe7a308badacdab0ff9dc8532326db965f8ba6cad16042d0a6a8675aa08b5790fb1c89718ee5d543b52dc0effc29282f480ee5d4599c7dbe6c0aab1fe727aec585f7728a27dfae3ae15d05b183091dfe8277ab5ad5bf3744f3e6636caf7c8f3168c25db979500903c77b129c16289c1b8ec91ce5e13b1ef3f2f40316c7dd953d6ae8a9d9801821f0883e4c64850c7d963d86afc3eb29c7af2d4fbd37e04a63dce8239d7fe97962973b1fa463eb08cd359e72f008c6e2309ee07957286eb2f125d5fe504123ce06c0b4f27b15741be922af7688033e62f1cc07468b86bd844d6f28224e84de0a0ee214fb5bf0470e1ee1edffb62d51eb888d042243ce3dee8dc945011fb013eeb7191d2bef5aab21bc5e0a411df8a4351983e892f6ead4609053d21c71449a9a882808a803a9b2131a3b64e293f566968f7b40cc7a312a20a2e74a327566e3580cb6ce87796e3f343978812aaedcecc219e16bc58da65bc968e69579de629970b9bda505c0b08a217c55f00747be4b2aa7afd8272eff12e9b6ba29cc733eda23898d08699173210e099db524babb23ce30c428696bc29a3ffcb82111c63620e76154a923f33e7f23f73efae5a2f497e9f75289d2ba1fb282b0e5813612285f137e7c6b276a3269257f06f998b5e39e9143b2d27415bc5d62b235a1bb50acb499f13779293270cc15b155e8cb270d8fe07d08a9616c18f791b3004fb0d50ffe7de61910aa3df114390e49851e758d889d209a8799342c75f56f4dd07211874dcb135d0ed4ddb7bb057b302d7ae9bf6aefbc9031846f7b01d4e5b29bab7527d7a074c5de95ad30f306e29affffe6c98a0bd988fe87f845ab05ff56d2b008f19fb695bcfdaf1242a009a2b99dac7957e2ddc52a8d4be9def8c8723639b7f7f0ab21508fe067585b161ce7c38102c6674cc72ebf2de45214e169a37c236e99120e37bdc0ec68a74ce0369228fb68a50748e301bb3e16a214d47214aabac30d18e3892c8960d3b983e13c144eed6f8713f69f768362f8d20fcdea8fc3bfc18e46eb442bbf640ea2669e1153ff401843d0cbbd3877461ac0df7b42682a5156d7d78516ddb90956c3e6693e78d1d50ae7bfff909ac3ac412b31b305c8fb6cbec1db3b8f13cf426a2a6a9b1d7d093098541a5ae9e3f39df7d53610ca9efa75629ee5cbe8160b89c57fea3026491640865e4e675b2f83b6f560c17ecdc68a64ab203930d2adc0bb23765d410fe5ff599f25bbb1533d9aee1e5312b4feba892cc4eee412aa04b0108041acbd23236a07a923cd1fab5e8c6ac1e7a65d8ff8d291e221565ef2776b2dd1784dc81e90cc2f2605a614d0df66f952036a50a002a9f8299ba705bc0f5174f997f7750a8ef502aa07f86f0f0bb327c2e21a129b752b7ee7c3009792c6846a317787712c7f40e4e896c6f63f0404fb1fb35fe0d612d2885c70dce6a09d6e60b080c6d50abf4d24d359350ccfcf4874bffb5eda519039998b00a49043b2b3faf73ad1c53df28ec75121bb2ab83415cab8085bfcf14db790e44ca41c960bc13b58b448941a839a5ce2d27a29d068fe294738470c533d3ad375fd0b9995cae44f14ace8061f346f2917177b82f134f640d0d5a0399b2c35846b00e18882a5f807cc3a75e11df6782572761bf560335e957061da665689958be0ad81841e7e4fce84ec972a11671032d8b6acd28540a1e0d9d76e970da7c20be60752a7de87e5fa8555600a0e130e3c76795250a835d73107c68d062b996237bb7def3929acbfba8aa28a2b252830e6f0f13bdd020cca374b6bc9cc05085c663985585e561c0ec7330e5f1b18333b1052917a1e07d7bd8a7d836f7726a262e24f4bf283f43eed0daea366572037b821c3617e0f5d086c1e09a6170d2b24f61c8a4d966623cc7fd2ca58f2c934a1e75db6c5bb3cc82f8ffb4980278184311f7a77000c10d33d30da0c6a3e5a3f788dbda3367d0b43d6368f71d2ddaec7e64f9b63eb79c0b288f737d4030a3c08d776ce4f4ef8de30de1d3aa10073f52aa16df13b862d2a5b7b2b7bbc3817d00745f984d138d6d4146a4bcb4eb345d602735980648addf1d74227372891394613096582d747dd8ec8f8a0156ee74f630097aa100a07d308909c4e2ac93c1ae11997a1c03d82cb4b8c45c5d7765df52002876ca99dc553b7cb9bfdf33192cb7930e77d575b2a38d4d0fc8282708b5771750277f429f1e87dc62316d1fe85aae42e9f1698e9b5347b8c4b6956564b825d5f1b7489037858c551eb61f4bda5ba97263d067ef4a5d0c667fd5509352cbbb70dca5186f976cfe3d0aae584e92ecd2d0ab9b0085203ddb596a052d7b7d281834594fcd31a986ddea706fa6989dbe8aa2bff57009e46c3e3b75a8e1638ae85f8fd168aa3bd5a3bc39062e8721aa4dc1f1873a8734931c17eeccd127abc3852f4ca7aeab5a180187be4f5f16c7fe8d73a1045ac48459cfda05f5230a37d92879f6a074d8c6c8b25568359389aad98c098180409ef04f752a78e2aec043bd86a5514a7fef7d5903dee006e8ca13dc6b4152cd222b599cfe7221808c289533124d7582de2f9c8ce2653c8d3e0db904ec7833d19df5f3ccc75ba2bf96ccced92a692081121edd51e8625ef39aca8740e93770f1722f830fc37e7d3dbf65c636f3bcd25fbd719d54e7d1a7f48af2fb5eea397187565e973690bbc784da176b2be3e28dfc313131972d0926b53ba9dd30f02d2189b7a9f65bdecc1efd5978294c0b84e47ba1e2a05cfdb714ffb81bbaa479ed52423b99ba74f715cf02ed5e1e58ab0dc9e006fa3216abdde03838e3841b04ad021c0b1fc57a763d2e1814acf9cfbfb79b9eef688d24fa89b2fecc48919cd5fd329e4d14bb5455535eb270f197ba75a0ee451edbd4dc4fca64b89d0aacd4c6a82036c34246a209338bd22586828b15ed277c7ca08ff1f440cf91be538b408b0e71c2d5d576f168c0d395387fd233f11c46bc2c032dc22d861ec42dbf977520d0405be3e6ec41f1b92c51cb2b4d33441a3fda4d59aff52df04630239a596c7688b01b327a84a3f82f0c5fd09d7d6c25bb1da75175a6cc5f122664463b8a5645b9d33e3dda3a866a4b6b5406dbdf2e71d4167a99766e93c1d778d86fa5b5d4f9d3b1fea3fdc2c489396ce9b858485ad1e4779598623aac5d99beea93e5b21f14d0913d918daa12f198d2a6e83f64c52f4293e626733a6b11df9b757210a45858e611237534125cf50d4606185765df93319a11a2c16b6b0a4f60125f84245d0189d1b80ad621c6ea3fedc2f44dda8a5ae6ee7c35cd8ff2a407bef09cdd85b6cd06c24242e088cce2247bbac0bcbae1f53a4dc60eee3646b5aae6e5f3b9f2a39b7160cab62e0d5c70d7c67d2e8ec4238992344a63e5a039298ca575a131324aed0ba0d1dc1f893ef429ab850b8776d744d1af20fddf270cfce7e3f6a578a7d9c885332b05ba4cad88d3d7bd255fd98541302f015f4fe938f21a8d759c2fee510085b26aaee302269579202552a76196dc63ecac60b6ac0db1af5c6b7e3524890f8ca2e591083640912289a5e4a8b541d2a481da9338b988b7c312082e5b3484567b8010932b0e33f1ffb3324be6f9d9721ed2b8b2dc2e01e1eafc4cc193e4c6920ca388294c97fecb7c9a43e2b41eb10214a7137ec9cec6df9be0c831288ef0a13b32f3317b7998a50252e86f5549d17c2da9d1f90dd8f29d7b648727312982f777532ec64c50378d493890d4ba563d80bcc34e1274c4f9282a51e9bfb8cdc4c624b3132bc36550f4e7194818c3e006d1aecd4b04ab78a7a663e873a9116f1944075374da61e22d67d373bc59334fe9d740b1c871ce022d3ab714c3ed834dc180b4f3b1c6bb1d9e6cbd711e0b5bf79031a9444dd950d367ca39aac423b7ad313512b0d9d4509207e44baeeb344b32af387708e7cbcb94d5503d67d63151f6522ac972459f88d9be0261655d6e615c2c1958d716beffed7cd609b8242bd04002924a60edefad55df3bb408c9263a36beb787f3ca5e433f2f9bd519a3e817c10bd63310c5cd3e64e21aba35eda6fe59d1773cf8b804d4a6ed07a471aaabbd38f1e07b00f46bcd704666a1df99da2ee4a3c8d993aeb4ffba04d03c96c93f2ac4d329ac11bd6446f140d72492de9ace9e29911b665677768d55f94ad914cb80fcf156f1f2504fd175f7d862a5618b1d9dc79ca42193fbe01f86c74a26446d8d30a42b7330c818342716176973bb6b7e297257da8bf059819bc8b6109787216cbe019f0ef2ce85346935d1e85b6d5590afdbabf561d4e0c44924a35e5745e4811782b75ef3e02d1a6335e798e6f5f776499e599ba6d185fc3ab596652d107ec2d99e8a1a01042e362605cd6b1fa79e857c87b81f90922792573f4bf74d9ddf8435f1371940415718dd127fd6e672e4e255396b8cb5470e5d2c2c1f8ccf7e8f9a22ba3f1e939b6be32861d0a912ce789749ce6c92a5f3a323ce2f520ad34f3ce1fc148f0b21546af442739e6557700d239083a3d6231fe9689d798f5b1657bd5feb84eca200557e3e7040628d9487315c34573766c3bb49c8864402fbc5af1969908233b8607e24000e7f3d4f1c658dec748fbadc0ac2caf1da187f51bc5d9a53a89f0458c364419c0d198c3283ce3fd6ddc9173cdbafcb4d4733287b14f926aee8a4952bc0e30e5639ae50d87733e3ecca7b515a03758f922eee03d1caf5c3dc23daf48981cac4df5771152f5c39d008f81a7a74deb39a277cd6ff6c49cbcf060e59f08f638f29a436a3e4580d3b0d43e2309a0e577df6dbccb3aaa213e03918028a33d0081c181497e5f68fb9512a70635c59df00603c88d111e6eff3ba934c6f471889e22a6e822cb50712c49df18043aec77193fcbaec6ee05be305b593915a5848c93bd5ecdbaed970d79a6f7c7dedd8536b0cd66a81cd666d25877fd3813631d3df51cb50e45945722816708654884a232db6d6c7a8abf392994cafd0689bd499d8608bbc3a52afb06a02d4efd237c0b821ab2b62c37c81f935c1e584d61ea167b7e3fb4e4b703c4f20331d9671668e218e24f4e1900ec630775090656837fd5081c85e18d7683496cc59c63cac4d4bb8e734ba46187be046ed3b68214a720b029b002da020de1ae00216e5ce2f4db5ce82f2e93732148383aff1e2e68a456268565382c80cd953927d7fbdee1acc6df51bd3d3d9d2b5dfab20a777fb561ea7de7561a0419d83e45c0ad50225f3f80a1384508de3dc8651b5628ca16445da2b54d98198feb8a0e319bc97c74648b49898a809e878bf8fabff69c4eb94ce92980b896086f02593aa1ceb6c3e6c61851c04063dbce58e76755aaad2bed088ab9d13cac34e91438192411c454f242b64fc390d35b1980c78cb5ec47c495f6cfd90631223a065891367e069b4425206b9e8fcf55b0744a86b95afa10195a9cebace5f6b883d1424e73e02bea54e59a6d0e1e53a4eb70060d25d12dad3b564ffcce9e967f1a3937e6817a48548eea1560e3cb28a9920aa87c29e8ce00c6d853271c66552f3625fda5f652d4ac4e03155da3b588fa739c7f32e2e626577cedcdc4dfaf47dd998b9f046445b9c59fc236c9247bf5de215017af27a8b9975b9552b2c8a09a46805af79fc5cf65cadf9fc16ce4ea5a815983ecb9a409212f1a680bda1379b7d00a00a8100882e94461dddae37e1845f4aeffbfa8337c467cd0a9c68f5f95aa389a22cf6c6a34768bf8683b7d8dafbadd6860d979f923348b0c1c6a3d4c86d5231ec39ce4ed982292d1ae138fdfc0ea179b65c8b2f79f360a62819f268e4fe454270100c155d9f721f75e54579e9ab2d2857f3383fda8af901982d3d79c07e27f6e7281cba3e9a8818a886797843d16fe96f0d2405f658af56991b460036c5dc63dae0e0100e0dd0a81fbf5e39f9157170af633c9ca33d88eedaa288e168ceb859617aa2080ac3f162d6dcdd9c0a6f8ebfe70ecd4f07ef5950f1039984115733c394b40393b0a000000000000000100d0d19b8e7b63ef557b3f01b3931d0c662ec50310e1596e56941e0fa50679b48fca7037901fbf92a234b143a8afc277de2250849834eb9058029eff849203761e diff --git a/zebra-test/src/vectors/orchard-zsa-shielded-data-2.txt b/zebra-test/src/vectors/orchard-zsa-shielded-data-2.txt index 3f1e99966c6..92528d8c400 100644 --- a/zebra-test/src/vectors/orchard-zsa-shielded-data-2.txt +++ b/zebra-test/src/vectors/orchard-zsa-shielded-data-2.txt @@ -1,2 +1 @@ -0102f4290671353bef3137938ad3c19f403ce031cd02b2bd7a9ff0ca5931c926f11b8dcaeedc218a06c9b18cad3cfd2325ef92175e4c56d3f3736a6f955bbde34f2f43da326927a4fe6c6c908da15c119f97ad7d6717e8c435a79c2a52c18dbc4a2485d4dd59237372e1bf05271fccb957c0b2a73653b1a37c7673462fa093d581254059ad5b842b4ab3c3bff9c28280997fd86ca2280924bb0446a071aa526ff4b77a5d8a454b0dad7c5e8dd68bc56ce1dc6ff12e3e2ebde71ebd2eb890212804633efd9978683d03e2d34c6c877b6eae49b10764196463c17e7ba55b84e3f6b37fd94ac2f838ea1564e3148f7eeddeb96371066ba3af4c457fb99639af4cbb83a015aaa05fdc88b8aa13a4c5e95204c5e5cc06857db9f4db4f7350f494d40bca23ce813690e217380899d274f1bfc8a827e553530285aa991818d87e377aa400be8c6f42f2539a50ac9b948be567db444c074668f01c8b34e22ef5850fc18a84090b435f1ce2543b3fd0b1c08da3af5da34b37356cc3b3f41ada1f1a71cc45fbe8efe3f5d66fbfbd3cc270115646d9d3c4df0c2648d7d035ce81b915e8dba15d5023c4f03dfe10165ada52751ae623ce8f67d751e46fe0fb240360f31b90e687a0501833085ff66cedc379d0120dfd0a19c526118b673a31ddc38faa944a6aa9e3da4612d99df26e34570c5905cfac8c574bf064833ecd7ab54ee079abab62a24e346db3256d0209019cd16b94cc4e01f19cd603950d26f5b489175331aca94de6ac8651cfc03bb19f68ac96b3c92286502866c8e928125df7206e319b914873b03dd1a2834aded1f83e8cfc52cf7ab9549543ee4786d22f38a97923ef045fdbb10b46acde7462b4468be762c9b7303f0ec00f4dd9baab2a1bd87bd4f230de86f819c92c893bd75a5ae92ff02ecc42ce997e07d194a3e23cb22ec6ccf9cb40d891da0ac7a250c5946975d161040acd6a5cf23bacc06914db40998b207c2111cc7f3422b622adc257f2bdd2d4686d91d060c1570ffc0978740fd0a76bb3fcb30882b6d385a9ebb76a4fd8b8fd54b38231fd163bee73c6a244855f000290b105ef894eb192144b76d9b5d90b36497bd47386a2d3a10a7f680f2d21a76fad444a9ac7854c348556b3f027ce157b38ca9f10087e4710b087d5e1c24390780980ff46117ab7a16c3ac5a7ed2302d7c0b83eefe000ce2d728cc0008f1730eb171abca1739ee06ef3dbfb6e08ce39149cdd86a6f58500381bbf8308719098881b8a07b3680964fad01d12dc126b51ace097c878fb6f51c21ddefe16ebf79ae90f03adf4a7ba95996784f3b1cc36a238f7918f2e9362d5918d08c2f2cc6287b2b0c83495ae58efb8bf41239c52fde650301f09bf41e3e49c222bd44340ea62e694e225800f454454f57caf94cb8d2aeb46d74cf14e3bf6082fd096b1a5cc9482fb38033e0f211b57de4eb6bdb10a1eefcc95ab60c032a16f79f6410905a22753009fc52a386c3b75904037fc54231389ae0feae1bcf1ba4448c443afffbabde645cc1f979b4946d69b377d2ed69f5cd54d70b487d75c64f69b7f992d878feb01d55f01ab04a72d9ace2ddea585a07e4f3a630a4819082bac6886aa30b997ecf42716025ffd9fbe71e30a60f4cb5d33f06958120df4c13c6881eaeb584de08f15509c8a6113c9e345111256782d0a80d1498129aedfb7cbfe363ba19cb580310a4e0a344935a83ff5453e11a5d92d8eb417f5a9597612958b1010e0b905fdea6ab82757265786da6f1f795c5d17043f87c9ef39373e8e56c4293ce2d395c7fa9cfed867a957685202c8ede20d68aa246d1691384189ab13f5d447feec2f5e42d3069b10d9a7c10fe092e24230eddf2e3d4610aa9ffa0f34f470c0f8fb266a04910f72df83d288ca5f7a63fa91a09b073abede9e8ac69b66ae6eecb6b1d3be70beb96900daefe17c115e8314d67450400e041814102a288a12a46dbffca9f4a5c9eb4dd662b2a77accac11e2be2232702604ab20bcff9c5fafeea3c0de46d9206b8b76602d622a4887d14e65152d4e8661f0d2bc8d36854b2fa1f53d049f80dc91d38200de7d8d2b76c62a40a95ba0eed75c875db840a936adf112efa309fc0671dcac6ffe391b6575a30dad023d82eb8445cb44724108d464ac67f699326f65d02c60fa7bdcdd59693be492471daa14273785d095dcbd2192a71923f598f93699c82ce20b5b0360a877d0c99ec62d343cf0dba820309b6ea373a17a02ea0521e284a7be8fb1da91068ad18bf48865a39c8ebf9aeb1bffc5647a2b215c37da597a550f4f78ea49ac8356b9ab32d3d65d2a498656a6677c529c47f4f12851750c51fe22cc839c381fac04a57edc9fc61d660e28c5aa87f89a96ef64a1ab686a8457dbf548605409956ad15e4146f40300000000000000000000000000000000000000000000000000000000000000000000000000fde01ca162328d9306fe484d816701fb73093249a96dd4ec6ff6acdc0ce67be149ea8494778c5f33b6d752ca2c91317b3ff8191be4fa5a3373dc5a078d560a60a604b67d81e5584a0498b57b0a0878facbce7b163bc2b494b2b74fd33b0b9a009a3837204fdbfd817deec75c2977436b14668f121a3006328537cf05771d52e46eb73e452cd2cd453a7fb98613f012d8567c09cdfbf054c7e5ab3a08530baef1bbda1cb0f14ca307ce1c68a49b61d4dfde19fe099d7bfa7db5b48a7aad65feb45d3ab11d4e3da76fe91423b389b7ff6cf15c70e1b63737353ad62ed7655972a7697907be97e1f10f3736fee0bbc4fbebffcc2d473acb6d7371f13b26e99cdf83464e14efd04b449d10f98c70d81be2a92d3a29eb00881a9d1951dd206fe2ff97792524ff7c6a2353ef42877d2a78b9efa7e1f0d81c568e8482929279e987f0367f111835dc4c0fd63fffc6360d5b9fd220596d213dbd84bce8a362dc7d80c723774c034d83baea8188b8eb6f37cbf0e66ad0877821e1fb006d2c4bb36a8652fadc940a5dad25833c568866ea6440d8b598e5b3d89d46f471dbd37914477b7b7bb0b12a4d66b789b14b69f9aeabf755b221606d3e48bbbb9f80bbfdd51c99da28eb8e2bbac7ee190a9e9fd3da880ab8df8e06d48c790b46616bdda639ed5bad615c658bd4268331fa9fa49901345c92c01c4ddacf053e0cba3e1bfbf1ab5af8687b28a64559df8cd361fd0dc34fd89d70956528a6c298571e7b8abe4e3b1c72a42fe39b0398d4e70633f13283bb9bfb7965c9dbe5275100c9e34eb21f38bf91b6e2fb2d95d7f35196ff177e3d36fa59c3a68f959045bc3894fe9d88040bac7759f23f89f12d48424f175ecad466af42d570578785d81de73fe749ade7a217f220ccec8a1a71e9ac7c19cac2dac858297849f180382af001b178427acf1f008b8be0fe1f726ce7aa9efae9a39e1b09dfdc19d97b673c88fe4d0e7447427d53b93c98ab034b5dd84f7100f1d10643ee477fb24027878b802404041bbdfc7b591c9c51c990afbe746d9510a3dc71fac2f9e4a1557fcf93ac8f81f49eb2c1eb6176f6ab8093bb5c2de52930eac3f794001bbefc6b8b76648dae98ec6e64715d01cd06665581b3b29d0e30a3ecacf57bd1578230c8bbdd392524072d4cabf43d821dcd57bd2e9559d85683e33c959aec75276607095aa6eadf9cc257be3187d6c7b2bf898cb3fbcf723b7e5831ec18f07cfee4a679527fd45d6384acd22d93a18e669b0b9c3b9eaca06e1b36aa1bf7133d5a702f8678c2b46d1531c86004cf3530c3174f6395f1c1fd593278a7c75f2603844599f2cd0f3d7f061472958e7a8796269337d023a190082fd7f4b0106c0e8693e1eee8362ad16907742b26b124fec8fb8fd4050686aa3a84d123b980741dbec476b42428a391c360fc3fd3f4dac03674d1745b2122eec227fe4f005410525c9fe2c43b10e037243920b4cc334f4b721c0f752d1fd54de00a9b863cfb3b4de8e4009dbe7755adbc45b775eb80735e55f61c7b110797d68acd3738fa9f66d8613c182c6b3c6112f4220407dce6127cf7811d31702b7d78c4375b31e8b3b7609dc64807f76f9a5cb73959d70ed753e230883ddf6d9cefc9d71d9d7c2bdcb4930bc2ec5f235369ba6a83c8c0c7f2ec96574e0ea86e03324039e9f9607ad709090bf91c718a39b9d0074fa8ede6df0072d9b627dfdb3a483e9d82bef830afe31026818236c60b3ddef30cd98bb364248e6ed26c5d6218debf859ba227e4d270c78ea267c0978a4442437bdb0eba01b9dc6b5b24c68d13fbd57d13a926ad73f04782b7cb7f9b990ee13d8432e169cf00233c0bff5489957993166109be00b138ea1ef707d2ced481a5f79c55bf77597debc76e24e72bab5078a9cdabb9d696108aafdd1fe9fa46bae35e514fb7b90e32b28092264a6f150fe62627013280c87c242b3738bd825efc1c422eec42bae5ff7c927ea554aabce89c122d79df63f01794fa6ea080d4799ef132ce994c64feda5200e59b5f558ca31406ff9e749779510506c258498d67ae8cf177a8b6c9777dedb7a2d785d91926fac8009085b70980b3a3069477a8196de03c47c0c40162448fa7c849a6841fe6f0974c9ed87d0ed277ca1aa471fabf5d54e0758bbe2efca2d46e4ab9a4a0b356834217ec5f1f9d107b03fb39836a8423959455c784f9888f237b8661b7f61e64739015dae72cadf9d0f0e89fdbff5fa92f2d9c2b46379cefe274df4b73351161b8301281f900daad4b74bb7b8fd1b6de293cd6fc0e44e0c1256a3c88e487b5c6396f56d82e7fce06fd6df72553211e381369f2997d6067a5b25a2c79fd13b445cee1a8e9b1f33ae635f028feb2d47716813817cea8dcbaf512aaeb6db30e3b924fc9c0017f06e1de15453c2a9ddccc5b899374a0a1d415872ae7e2e9880b1b99f7b149689f42eb0cc4a56c26190ef40bdd0b31b8a46c48cf2784f0926ccb291a58940b595f33064990d3ea82aea1537c7ad5d5c77119b0aff8cd52048a191b40f4df7d0647ce324c9e7befef9b6bcdc050ee8d974912b3568833262272ea3f89312be68f98cd2aa6169b9991df68810c06ba52d32f44087bd9fe7adbb95f2b72a6d137eaece59ba7e1ab652d8942a4b940723982e287fae4178ce6bbc7b72cafe5afa6f09062c75e437c04b12a288e9baaccf31204eada712c00e323bf731fca404b7edba0181beb597a2510e16968c397ebe66211de340093c1522ea5c111aa7998a838ad84319a1999df57667c31f52973f016b85806296900aca2a18b3470b473cb8dfd4909d5c73959269100907f97c6c019aa750f837b8c086f3ad81fb4bdd846a6c4703e33af76764c113a5b843b22c429bada4d871c09461421550c7bc70a8100e3eae97806342cde5232b75fbd55a1eb0be009df690c9ae6d7a52c3fd459bff0845ddbaa98a85fe488e8b47d165a6e10156ece45ebbe9ac0d00e31aadaca171b75b60d92bee482b64c3c8a46a77066f9fd00e4863939074499a21a64cfc3d2663fa8f9de44382fc2bea725da3e16b151ae8183438e24ad5ea5571e3bd6499a91a3a58879f26ce3d94aabc4d2a7a61f9b3b6e1a2f90eb19de10fd3e4299a6d162ef8adfc289652a43241b4b30f35b0458437d17b21aba6e60d61f2f9939ebd684cd23211c04e6a0e66639b2172beb4ecb11461a0755671bd1819422a279b8eb07900a8d28457da27c11f662530aeb2b1860a50834da3ebe4d63af3baf263519aebc02f783114e7fb4f663c8e04118d6b739d34974f3707cc4fea70ec761d7ae98bec4603980b2ab408535cc952da8e8ffac1fb0b4f91f2df2451e14f0ab5deded57abce0102a07074662fdab890817cfb1f57f67d93f4348794ea20ec2707aff9fd41d73349af94fe7160c7c67b388989d8326d02a055f9f99f4a38efcc6fe2a7495d2ad7f6d745da9b98cbb7c517fb31ff076ac6937cd974c5f23b32cf9e7eaba5f143c74c4aae9deea5a79d846a739a0ce194b651a45c4ada742ab9e599aa66dc52eedcc0a25d022c27decd1a71282b0209783e9d443d937e1f08ceb39566da5055e2185f3fe20dc879fba6f0a810dda7acdef8390b699f530638e040d4c99a59cbdc8489fcb565c635fedf9546fbe53548b3d7c02686882f683c1d8c689f22db125f6fd2c27db33302a2e932c2e2a6d192d6e4b3a25739839d382457c91cee7408a11a8de41072f6627a8b4c52ae739ac438cd0c62eb31f580223fa7dce00a141b07000677ee4b04dc7113c554a03598c621cc240c11fef91e055593e2c285fc0595cfba2ae88b8f76e03e5514b53460cdb4206485b01005da19fdc3e59c30744867b645b0f8ac8179e3c32b5963939ca204d755ce5cbaf892157032f19c78111ad999ad0dc7eb7563fa3e418bca2c307c83ba205ae72d468613ae8f6e025a3cb00c13fa01a52cbc4e7f492071946a7cef8b4d79f0fe031f23077d7cc2fbc33d142bc4f2f74c6bc4b6a4b876c26e9bb4db17dc5433eaa1c68322259ad5a9ab0c100a064d8fba364a9b1a11849862664e022a3cc8445d21063e16d972d5a31978ff14ad5e8d64327f241914054c1d864aff5c554abf465b9e8e03c6fb24afd104891f74cf99c7fc0e3350388c135b1df3c07d472344e6f66dc2247698e01c4011d30eaf285a1520cb95d11e8c8d94bfc460467bb39dc652fbfa1b221a7c75e113fe4974f963580e2beb9966111779c24ad5810691068d35bcb73e462faa9e8a57e450f8420f536e35d45bff98f35d51def1895c7746bc8886112ce29fef65c65b1e51a0c74e179dec89f3d18e47210f7e24388b47d559ba1c8308a39cecb0108bf58095325922483759eefa9739f9e4fb02a027b998f2e41481141ccaf16c440f442a95cd4245f540a3e3bc797745b2f9e864c7480a1cff44c000f3a62aa94cfd03e1a4069de03e9dfa2ba7e51b90a33edc4752d7b7540600c4222c4962b0c273576a0d9fcac66999d58fcf1359ea2750e726036c34ea95b7e83335a4e7797aeb8426d64aa897c4d386553e852b3ecf3203e7be174acb43017413af97be803df2bc91958ddde78ef42d5e7d08c147edaea65a36b5110d07c29c017700daed2d58e4c6083bdb7b9d36b900034ea4f9fe801bcc1c3b9a04115fab30990b640d4d645cfc35e01defbec27c88401604068850da516f9a2cf0a05b0c1a15f1e766fa992dfa6ce1d0b6ca95be2d62860cf2902d08163c3a5361c5bf470cad51018e2f7c251688d2bb475b33c3c03573eae0be23ba5335d82638199dc12994270ac7ec85d2eb1aec9debaaa6060b20d1dc8ede3bb4eef745064aba65050b1981edf8be86bbb479e79552eb8b62e7296e19e9ee7d1f73efe9810413718b075b217279c05fefe063ba0a2f9aff7156881467464b671a6199bf15cfe579a23dd260a2c3fc824839fd808ea9a132c0e25898613709fcb341fd6dcdbf6d6f2c093f9229e690febd6e0aca45c173c5496928a0c478d0036607f4500cb7014e8a2432b661be42e60a498d29ffacfcc5a3897780a3d4a701a9cb1729dabe01a420388e2cf5768a355114ae58665aeb0cb7200db10eddf343f13cbb3bc935b17f0037a0536b908b968797c702d3b275f97d859b00a13ed6a4a520b5e1e0d1661f4806ecfa8085e6ef1d137f50acca6fb4ddf7f08b48b7e321b6dcd76e525c7abbed0a87fefd01e1a545518c636e644ba994163cb33e7d071b9d0df66ef8482c28d111e0f7a8846f86490d91ea645e5d79849959bed3eede7e76597c6c52bec7e4a539c196f10ba257d8bb5d28a6d2e6c4f71eb1cf80def43db8517d4b04f626c6a81ceab9a697d95234e15d89d2665e3c30ea4ba404df7ae8a61333595fa3978c2927c519d665043d5591280879c0e171f5c7ba73edbcc4aa9f4acdc0f1a128f2e82bed5e93e060785e18d897396bae1096a77ed47900a21dc76b5dac4ee874975608bad3d12f8b384dcb11aff6033f0e3d42db636c325a73e8d52fc73cdac3887711ef9ba886b33007ee7e181c3bb65045286f4b9f58631787d3f2069a88817b7a0600b1c0a8ef5855302bb696de787d3971194a967e14392d693431b9089c4fdd35e2d7fc7e1779bb8a937991dc7cc508caf6c428e70b98f288b30556e79ce87116e4c6da53f914af76800d4b39b21c951cbc0c27b70f4c1326a9360a21f07f9003f25bac96ef4b0c5cbf8c08585e4aa9fc7783682c227e5157dcd4a2dafadd8d0abc183327cee74d26ae495d541dedbd80c58eceeafb6a51ed9edf0db5baecab0aa6d4b37e3f5235b3e9cdef7e36d49b62d7607f2ed9691ff6250bc95d53b1932460c702a3eaaa202c91158a54c4456cd52e397dbd12ce9283273b7fcb4c6c1211d04136867fc6e097f92d0369b061a22fc261f30f6883c79e6fc43e3de4adc90d904261f1605836a509e63d71c0944951b55a785158fe585192f4975c40e64227b007ee4a929a71356e5c544a094d340cff1c6369453331f9d706a3c1b62ce5015d9aabe25abe59d77065762948bdd79d9bbb7be3a1528db8d291530e859a592f29c5e161affc67d93015b642070d1e99ea1e08b52d4243b658c6ff103377f8364c3ef216004a10a004928c6ab59e1b43a6f67165989308579b9bb9bdcd8aea136fc249ebf5169577c2aefd433cfe25b3f79acf8e2edbfed9c21df68cd2fa321aa67870bb3fc6b0f2e9ff6df33c3afd5baa4c460e58e8c53b544984339a329910e4df7d4d6a6792cb6e18bd89d4dc7ffd1c6e9abdc1352a18c0ba6851a9279f091cab2f13d86b1940751b6fee1c45e321622fcd8ecba25680d732e7cd05bb3531323c8418c5003de6777b0fb43794a1536a1d9227d37736702d1318601972063e10501b2fc335b39d29b3de1beb100f09f8947cc3c8a2bcb221b3dac76dfecc305a488f6533060bfdbb078c9a66ac1d267e6da37b601843c2edc0d6c93711a030e0a3b6a94df5d2f3327d686e80f7c19add6fe90b7fd78fababb975cb638dd730c14df21e3f6c410268e856727b6e7b3a074e32b5d83b2e78c5f810a7d67835394d8cdfa98f74dcd1f913719b91a471f7b4e87b473beed4f466dc33d4e3f2ef018945d1ba3b90a7930ea6ce25783ac121f27a8da60414a8aaf8e12f342880a435f888420bacbfc8ec04d19bd5af2beb8651549966c017b9f1cbfae18c74c5d72f67eebfff65210284f3af647902e9ee2623043ed4b5024d60807b62a7575dac0b7b6a24bf84576903154d21a8d112b829fbc867818e43522033d03b09c88896064ff6a2bf3eb09f90236e856b0e8f5c3b8eba0fcfdc1f6429decfe93c0f447231bd3017d0f93c548c4f2de132822664ea9a9f3e35027641195f070787176499382ba6bf5bc24c4281b4e33d4759c7d3373350423cc3342898c40ccf8f7d0ac90387dc1129ae8349f3fc08ae5695235a60c16c775d9027a5dfbaff2ff13c14af32fd5b7d95d8ea77c45d7aeb97d85f2119528c7f1bc646a5280786b51ee3ebe433613b8b324f492da4f4d9cd905eb613733cde62c468b40fde0e665ce6e485081f8245338c196dd93206d84d336651debb3fa32747062dd22409670e2264cc311212357ed7260c0ce60c07f4700353b8bded183d0dbe89466b0ae5e61fc6e55f3a9dfdf7ccbc6c141edb0676ca9637f3b7cf133ea6026b19167cad0ed20145d83f822dc6b34da671ef93a797037c83cd6a78bf4887a77a3bd448ce36b7419a361d23bbfc380809eae943a1d745dd48adba14cbec5047802adf7cf14c42cb7fad14ccda903312a370c16008765e92131eaaad3543640a730536ad219ba26c71a638f89d68023ff84180ad2bba492ec225829023371250c8391786b56c9cf3037912851f15610af6f0ebc92ac3beaeb3f0d8e2bad0f71d8927c8531eef02c57d5f0430245a0792a1d43d6940a2ec42a982d10c6ccc4cf04271b42f7af9b1f7106d2653fdb3140e70fb09de43cbe161edf6a87854cb095e8cb258cb721c1bb89ac327447da14ac9ffc24cf0f0f5cd1c76f2afbd6af7b6a4d100c7051f55a06fcaa6166b1a16ab3d59cfb5ecf620fbea9e3119012fc50cb72ba19c0f27dd05c09efa1038b38f2f210095babcdee74b31285981590109945f7dd1c0723a52ec606df118f6662c2036cf95602abe35b285e3003d4cf4d61fe7e43801c296424f066e792ae1b40ef4d4743b5187b36f1d0069b3bf8b2eac27e9e1f6c185bd0745ed2e35117f8d72c7d2f7baf560788ecdb2a5c2d78478bbffd56ee74e3abf27b57ea128166d34bd3680b02ebe149e863a52c29041184ef47ba9ec306cfa946f935160f311d0317eff2d9b915b4c2af8c5a74a1c540b0e429346375e547194a2cf0971983cab1e30c26a4192961b1eeff6c40d698e8bcc3bbb9afc8812e4cd7077675f800eb7cc82fe6fcd06697f67b12f4fccfb0dc93d2863ad9565c250c2c9290c6caf1a648f70cd7e23ccbe4c8221e2f6d1c1f6467d22888723b787fee45cdd33345a0815f9032fab1cf968703caeb08ee9ddbbd42d0872ce861afaa9390df4df51321912e620e9437811c14b425e1df6eb3da98e4589b2864065ee7178aa811b78770f260283386172f00ce67c7456a736b1f0735a5a97426993a160febbe28be75817d991743d26ae0374455118d9291445c1f4da308f425cad02555c90301e39c9238477e4546d4e9ebfede49ba184b95b58f09722c1a040c86fd24a993a3b05281088c3e30d5d1b948e7b2d8b4cee07ebc63c274eec8e7695acc030fe0dc164a631c5a8cf792fbfb0d5b046d7debac64decad1c97b8c6fe7dd95f45f78bb79d8726088dd7bc87977a1b559cb9795df85c435ffa7303e80136879fb27e1cc131e410d82f4da0786015038bd5dbd506eedf9b16a5bff2212c3bfab58d58d37da1372e2fb222406c7913e6d7ab7112baab458ab0953f37d583c6a6683848b29bfe713ee73ac634387657834af96228b5b472dcd7099fd9e10fbc7077d214eefef09b1ef001784a9e8d3f86fe0f8094d1a0edbcc858c1ba499753378b900ebf9ee4281a39015fd7d0dab5f2049037045c37056c6a840d5f813566fd90a824d516515e034f1242d42359a794a5688a9b271aec6f659b2807d994fb551ed86fa7be25c82670dc34859bb54dfa125538784fa27d374324e1614885f1d7e2114e792be1dc027bdf37005e669bd40647d143e61ec6b8d8644251a01d5a3a08e7a1bca4aa8419101498ad3736c655c55b997912c599c0342ec64acfa9c1c75e0ee2d3a172ac3d622b990a80dd2aeca2b8e3b06bdb7f662f4c60f4ee0846ea76fb7dccccd363072842fb961abce07c5895522f0ca58413a60b1db0f5f43d3a30729784b9d8723dd72372666cc131a332ae8671ba456d2f72f7be517bd419b9410d1af20c10b60d4411ffc6e691ec9ba84df4ba049a2be9e95120de7a8f36825c71c916992e1e1b14643b991c5e025f035530929afbaaa6a8593e0e08c535c9c3319621648edc1cfd6c6c6109075b19b7474581ccf4aaa8814ae1d83da11cec030eacffb8fb6d3b1b0c86ced3f1e5ffb7fdc59bc77a0811132dc24bbf6645a65511406ade0166900a2d271e574e26c8ad8f2bd2f29969cb255f0127ff43285c9989313257a63a0f2e7ed88b31070fcc34f7c1f1f8fdd911311724bfdb488c0798043d62bbba7e27f1763291abe668b9c59fdcb0ee261193b5f09ffa91311547d925962130d1843e237d30d01fb65860df9831e88157e556ddfe9b81916bfc95e2a7da9a8643b337d4ed2afd8a5dd99f577f4a677855501edc111552889d2e8eed3b36819957ed2d20bcec1a8a41028b4e882e06732155498b20860d8f55805edfbba9b088b61891ce678657cb4b57c57eb03720f44df7563103214e5da7d1c9b009b6bb4474bb9160f75a932ce961fb5ed2d0e284b7d9d0c179ba62c6abed15c38c8279d4416991d38929f9e5556ac24d474cb9437b9df730380f5cebd62927e946449328355cae01388889f5530f033bc7c88dcc846aa42c6b77488de5972868ea1fb0d733721b2b453bac88f8c1d5c9f6261868bec190e83c19a4a3c08ae958648eb093a2cca85d5146b9a4912d2c6ace1712f648600c5b7b2f79d6167ce64052f50df731dfa4870172013cdc3ba806cf110583b3a3112ca744497a1a5b4986418e5a065f492de9b43839b7b293ab1dde4630591bd5ce75155598b1d27d2a7d8372d31e73713be2fad3aecaa64052eedc3551364aa1d3b13f35f09a1eff9df6e78ab67cd114ace23de31f0c16cc9f8cfd96cd737a3db7e172c079a80726a60568bfbd05d1bd9177678f34617a78efdadff4fd4c952475bd38b0da71d1254550384079abcedb9b76b074c8e43836dc835ab6165db7e27385edced26bb995ee7728a17f7809852b4db1724d2988b241ad7bfa94ddf5d54ef581f3d6ad8a4d11f3f443362e353f2c2c3e5db8461d43fe5bfb98f59a412dbc8d99feac52668cc62738789ad4d7f82d63608fa050b3b0bfe98ae6a431f6505b9d1e178534324ac0f255ecc40930d5babca2a49f0b2d8e5c491cc57194b326c4dc0666a1007d812c498f618de8dd21a0822b5ccf889570c23503fc5b936df320bba2fbd3fdf0c28bbb6258cad892a7aafcf45b69a87896d87ca74a8ff7d967b02007f9c794b12963c62c7bd7dad5c9915ccd1e442851c66133b7fdf42384942f020fdd58c7984c906dd02d816d375cbabba2e7af574620db72aea85de10031ac3f948a41ddfdbaefb7ba80329f2e52bfdfdee01d0f1752102cf0c4fe52e647d07e13854628669ccbec3d1ae54e5a8912ca24c40992cfde82d0b079e3f2edf496f7d42af0a4e6af0a0d9144780d7016b692bb79f37e56c2994268449cf35d55a9f3f325f258e1f4c7d29e9b695ba523057af3f83ba7f5ae40c60120bea6b48943c751957e03004a40ab372ce134bae029c60c6b47c5affd297c7af982b1453b158010dc511c8174d7de15ad75f295e69eed725e83d8bb44d3f9a378461ca9824393225ece5e2fbce467c25a7ac5347d3cc8df6e386ca5a8c8a4296c54a276b403ff035913c51ff4ace6213438dc24eb99d7f477c5429fc397c116408fcf6ac736f46b151d601352d9c599ab401456433e0a00000000000000c514e674b2a4acbb7f91836216bb7dd917eda1bb61b997ba5c9d11f5b560a9bcaff624ef9a8204123e2fb05613c79617ce79185122f3af203847ebcef900463e - +0102e1d1fccefff78f73dfbd9438e586b16ff3c5dc330100f57c2dc888a950ad1e2e1cfad1385abbda4ed7b22537bb2edee2ba4ad0a742ca472f5cfdbbb31cd1961e3524d4fdb3c10441dad437ee445a32c8b387fd2fd22fb9d42f1e2c0757258d34d89bee26489f9d4d4c78f666606b25e3dec7d3b674409db74396d1f1649c92185c579a3ff0484f80df875c23784327da36ce2877065ed42942017e268e19cc32401e62e96670067f555717ce488dfbc80f666d2160a717fe885c60c8726eac5c3e76d878214a8648192f52f20c6273c023d3c9f230f50744cfcf2fe37c97ddb831c0f3634157d5ba453a8fb7c9ca269f5caf2e671e9471fdb34f25d0fb240f15d297ad7282d228a06a29a8a81a7db4410013f7f9ce9eb4bd0e3bca30597a09c084fece11fe47e09f32b4c401f50f6747a03959bc7c3a7b520a318c4e87e3de3915c3292e4cb50b39065fe1aee501293953d051b798b7512311d05892134e0508b029a5a3bde8684ac254179c321b189715061db1d6ca0afa1dc1cb52b3c5c5519683df8a694833c2a3c75fc8955add1cda69093f5e602d6ccf298aa1c5cc33f187437b082320ffa4959bfa53b42dd71a0898d6c85ead293e444b0b2c8a312d48b72a523f7b424e5de4540e57e5d6840e5812826e0080cae38cd9031c9e82819fa1f62648a5b1f64b07b7047e870e00a70126c243a6c5c55f44ceb0b900cd04c3376e4800967d95b9773bf0af4dd51ecb535767db3312241610d5a6c8e7c641ac449f61132c41e4cb86a74b079894a70756c21e8c6875f4a5a38158d1573e3e259736ddd3d8ba7d4a02c0d5b2cc64f3e9f42cabea09bd50a24c00603471f1546a0941de4a66a77f4286b085f461dec4de3a349bac4339564a1cb87d727b6fa6815d20468363c7c7a5fb199bcfc86564d8a4126e67d8a9c8cb263457e326c98f228d36c75034a5201685da8e9ec62102927ab5f8af2e7429511e9d5b8edb585b75745f0bc3aff08750cdf882b473c3752c994f0764cdebc181d5f8d64b1911abd35820f3f16ec95777d3534f8632f11351f080bdf76c9e00c443181c800fc11a1620329a1843d441a79e92a34dcb9cb64fc2980751709bb92e86ffd5c5fc494ddaebdf8f6d6b0d764c3cba47c08ba32d154966b571a100e25a3ea1758b6d86fee454cd63963d45bee24204c93bd68a1c0f86691e9ee273ccc0d56659a3448a5dd60d3cd23a97c4c0793e82ad386a99f72d7eff1c853a7898795c190a196ceed7773ef74a4512f225038655aa3e223ce7d34572c629f43d3a57f2502d72183a8a52706fca6f3875256c8bb52eebc0ac1b46473c372eb7ec2ec611665fa341c417c6a56347d64dc3ef16787c3385780f27698ed59c039464dfe9ab1bf83fb43c23dec1c77df2be5d737e186c2a64ebb372a246ca5581409d231dd788008fb6def0f66ef100fde3f1f050e6493ecc590a73d65048553fc09abdac7f7c679bb1eb87c595613eef1cccedc0085ca5907dc98c8215902e84c46c2191cd4ec942fa66464263eef82466549e737990c39aa95ffa7839e73f29c197a4daa92db95a9938a18ac2c9236bd924fba894d8f11f63016bb293d5975bf70595fec9b8edf7dbdbe6c66e58ff6483267ba024ed80112eb42b2c14873ac51a5c8e7d5c0fa461aff63ac09182e5c89cc37dadab8f6df171cdaf6174c9a291da9d8b645c84bbd82893dc3dd399dd187cdd317101d1386c3051220f911f0066af4b90b8f99f14a5e12584a7e629842cf5a5f5df364fe9071f11e3eb73435b27b73ccb0ff5be6522ff2d9c199ea0f917a0f36567bf5de9637db6235e0970b8389f49de892a25df79c5b77b36ec05e890c067e575b0ed9813b94aa4b595fc881ac3c55f65352ad37c3654a39c97e1579f06187c0a1369b6e0af4cabf89b52589596f3300d864fd7d55650228f76fadb93721deec3ce900b39056995225d6f08dd8c9bfcdb158d10af65bd6e13e7e6f186f07048951081643abb33cf7a2960b48ed042d17e19f16de2022c3f9e0abe656cf86f73d922bd5ba636cc9a756b1b3faa7602f6ac68e438f6a043a2727ebb2cfdf384a098cf914105274eeb543df44fe59fdb7e422a3f6b57d87926abdc9c11981d1a12ffeb9caf398b3a44f92a75a1023aca719385373e041a8fe06af3a3237c100158540648106570a841fe9bd4d505ea75e24653b9c3d13b6776eddf2eaa9373ecbe1edd3911ec10fd16fb990df9677bfd34b090af26f12e7517170d9792bcee18078bc87786f58b4907631275542e33440b1156663045a4d97cade61e57a7d552a2ed2f02955b39a4cba2173b513029b5f88274786b5f45c6943f27e0099789b4ede6775592bc98cbb63c89d44c9f08b44d0efa33ae364a5cdb583b908c21fdfacc900300000000000000000000000000000000000000000000000000000000000000000000000000fde01c9ed40d13e2dc1da6b93089fdd83a9fa7356b0a0ffbc029c1a66c597acb07f426c42a657bb0fd84e3531eef39c0ca9542cd678361f58ae88b3c6b253004fbda25906059ff1feedc9d0e3354e687ea86fa0cc08b016295936aa938b902ab537f37e1057e85ca3d1535dfee8061c35bb51561f9294bc5fcbdde01f613cce1d01a84d80d44c2245073ae9de67a21c08b481b1408135b8de329fb565b871ab7544f00ca2425b47709d70dc02f97d85c953196d1c8d158b302e669f576f9fbfb7d39239f60ba76ba92a1500ab1d854300847c47e3f85d0a83c77e7604b51937bdc5a2893a384327464f2cc9d0c81679c2f22872d27dd2a7e0f0736e0b81328991de62ee807d8023f0931b608f5e2dedfe0fbe1f02bea7b6ba9e66aece58fc4ed53cfa6207604666ed7cc0f830af9f4f4178af85f9d7a3d9916a10483e3580cc42cb2b5b68b498dc2d670fb7befb5c8abc08c241614de04de2bc13ee3ed2f8355c15628117c53f2639d3212f4696351973459b9aa6b70aea8936ea610789131f9f0ed829d1018dc8b24e553cc62b79de553e41f000c57220356a727eca7c1d451a06f21509eb6172ec5e7cdf7ae37f1b32e8cc92db744b5e597180ac25774eee02cd9af9ff999ab07bec96463e959214edff86d329db071286eab7bc0da4a5e83ca3684781cb7e9872b6987a8d7a905626629df9238797cd178efd8d1d18fe758d3ed0cff4caad995037035b950fca88919de28c73a5058e80115554cc57216bf49a831a703f6212a2acf91e5a7a6604485031b6bc1aebfaeb3f97b816bc9ca558d13b4fcc205a2b7a53253f81e69a2e4ba9b275a027461cc48922293d39d626c560ca878f81c579324b6206eb3083866485912a663f79f887bf54bd380e7f0e688349571c5cbb61225f96b09fae88ffc6a52c0068bb99135d6eaa702e0b989bd8c0b8846bbe0d56fda1f02021c2363a2d30a772b8797edd3f8ce3867802b269b814e0761f5abcd1e2f0c6127b8564b14d0384f7a66a62c316cadc2adb3e98f3eeb821bbf01a83b134add6ece319f6be5b3b71a44aef17672548652e932d0067fb70eb5e0ebd5faee78751f1c27a5c309e9ba5989f0c037c35c267fd6f30900ad40cdac18c1a6381ca3430b0d598bc10301b7a4dc28ff393154dc56ff0f271bea950b94612110de946b92bcfca738d957bd4493b3ec135523a84fec899bea8c49e5710491cc7cd0527c87451238f60e799d560295187a36c620596f169abd99f90ddf1e3d987094241de871aa159883c6dfe8f4a1a18fae9e420f02693d574bb3be95b8eb0a82c9a518408942dc8f7783c4c989ce2d144830ec8a65df3cf13a24b5699cb89752fc143beb158dc484d4f0b6d2cff5d5d260bc83531e63a62957679b5e36aff2b73e47ee6a597342daaec9b690571c51cce87d3fc13a42c66dd058d9663170022d0aae949f6fb7751e8ebf6dc0272c8332ea86af4b07fa05ba73ace68c8c503d6035d80d4f04a5fefb6e3d28452118cd618ee97506957f9b4567b5adc1127cc3f1669188b67fdc2a1583e6b09b1ab190a7fa8c6542ce99cb11a80b7e8424ae08313e9d7c79686d03979ed69a3703437cabf8927a0ce47488dee25fe3dd8e2a42eff0abd071c81f3f2a83f1d5099241040b04a8eac04ce08e3d320f99352eb1c63f9e184b9f0ca08ee83c603f5a6d868a48f9bc9865fbd4a53ec8b93e1e1f52483fc1bdb88bc11f522ea0db8690ef2af902dc1cb3ff7c454d13fe3ca3c52ff77a71da519aeba5f44adce0eefdc7e1431968e298647d1aa130e753b630ef314e6013f065e2499f3dae4604005ba8b9df4e430cbe6df1f29123271beb8cb708435ff3e6d469f5b37674fc20dacf9d3454c3139ffd1387751603d9e170e278a95a1d0dce5b0663151dbfa9ef18135a75042adca3d1b4d2cd5cc1824d4f93c49aa36e0770277997f99faf114f8067bff554d71556e0df612fda48130bcb80d58dd45c3fdceb8ae889e170c3a0d87f0776972b6e525bfb752d3bfc525873e3370eb2535f99a8e958f7e21a032fa9e067d82c4f44b682aab759b94b61a9d9a5b51e57af697e35f0c13db54759765dbfa63e7c935942d16b429e4f34b50925dae528c63d09036608108adafbac76a132a937c35d22a45925ae77b6e0801525efd4974c2a74b03154b90f5968f508030f1d493ff97fe6362805b4c8b9615d243aacb111f878e6bed0ef01aee609f06f5c3af5a820aee0aead48ac15a8afe2c544af1b0dbe6ef7b2b9e3afffbd07c4e1a291bc8ee7e193ed912d7971fd745d068740988bbc9e3dd5183e8deb2cf93ec9b1eb97c479f32eb230007c966c3c14869112002a850bf0545c46577e6a182b9ad4e144240d09438cb642f8b052c74dada51d8568b07253c4787338209d029a2b5862b2a74c3a5a5214119edf2e951caebae828fc8be1dce64a987e25a0c025c4ecba70f773572466f0227e952cfa90c5da3431d61c9265955cf001f68d8066d3ca68d97382097284e4a51b59f319e8313fdf2b174b1ea5f7ddba1f84cd48c10c1139cdf623204a22069fc981e8bd16f4081d3c5becf1f35657dfb3bda705610b728f59a84a5144c6c1d3ed3d89b56c5f2e2d0c590886a6ec4c55c7f7551f00d097e927ddcfc7175a87b1cd59c686c0e2e35f27a184a9227d7d1ed4cda2708dbe0e2cdfaf41ffec9e08ba2c531d1d839629c0055de77efda0bcbb92d6b14af000ee2e27727de2ced4822f5c1bfcd2efcc4f34097a21a95c4d8cdb2e07c0bd8a35e832ddb4fd2043485054c75cacaded4dcd111912a888bfa81d0810397ea9f31500337e0e2def71934a004ba9a66d40110e1e0b83317a56025189bd08df7c31f4197f3ab51c082c0a2ce8856d56208e3133512a5ccfeb9648d27fb72a964c27110cb06d12b0fea3514046857a44d18d85f28315945f59bcec2b5a4ed46351eaef0c1306d17b69f5426ced6afdd26f516430a3178b439716fbd8fb5fcb3d7d4cced184eca4b7adb25f1a609448c428431afc35267c0d325e2ef24eed0f80939337e9158561b3a0a5a7b1aaa6fb0afb56ad4ffe3c4c5be5f5a054a65840ada7b1c2a010b3db49ffb194ed46b8d0a8759a10197119a94a3bc5867d5e2f1b94e8fb60d1eb11535849d0b95d47f44c1c864fbf3af52d431cd95e53bad00181b86c5af70faac82e7b5dfd28a6cf360e6955010336a03202a4517167b10cbe6a73e2caf797db9a3f5b8ce67c603f03aaefc313ae5682389b6d7b6e6d3cef6b6c20685dc2f72eefba92cf64351e4ed5f23b680abb07042697d58ce1944e7e038855490dda9e056d7326881563e2b713a3b65297bb7dde3a9dc443b98c639b51fe9e645270fbd94bce82760739e0030ee435307c457d5c3864ef8d099ee5c7a324eb20264173f139c64000a3e3ba0d3440fcc6b39a78d52f8106cb2559555fd2b935c2c0033dab2b8969de7e91f700228ad73363bc9cae1fb3dc9edf6bdbe0f467e2cffe9fc95eed384e20e67b3b37aa53b7fda458fae22f09f123019764d9e56ad8ce69e83e8546ee845405e312319eb5f5f8e66e53ca0d95dee6eb589ee7ddab62a0eadbbf8f267d5a20d1fe27d9b2a6592a4d98b08215d57d8c12cac838d0b8388273c0e3585c6f6e47dd03460a37724a4e2a68de673d0760a6766a00ff9b249d5a3f8a74099b5cebf95db5041b0c3b9a63ccbaa3ca1edcde64d842fe2bdc97c62ebd1db08efc223be01bee936b3adb281b709fc79a1119eecaf035a33515b843925b2ffb2ec4ee46aefb3abd1700a55d680aa3f0ec18849f27461fba3ab0dd96e6ba7349c4416d922595ffc087bf115d15d31bb334307b87802aeedce352ba435970feb8cfdd08622770e102b6a7fdd67a96aee2f626e4be1d0806390c3df487a2a5d86e151ae5a7125faf128c6a37b748eb87fa133cb7ae0b5894a3160d6d79f3229f6a735a73f0a8a2eca873f69ebf5fbac139942411c69e2eba8ab539af209b3acad1482f2775f9e6a86a6cb5cb27d440edf3a608a570f8837b5690251cf0bdb1d1f08d207e252e1b78b7aca5d553e8f4deae100f59f42750ba88fc6c8b506f7acf61d67dd2bf987b9a51bb0c0d3f6e8705fbd207628f5b30db736e4d1cf9fa1fa74873540090fe9ac9869baa08005baad815e41374ba4bc1a6c1a7bd09110d3267268eda8b8ff4390615e82ff4284d04beac3e1cbd2b0e5a1c91532a7285b54dc8a450eded8e209b0cbdd028430b8a53e109e9062c52393ee663dcddb27c9d9b438f4fb62e1ba95331abc7007fb3db0ec16b461dd97fc9986578a0193b732364c6e44c81beb6730401b1c00fbf37d2b86cac812a08500940ed3b1b7e0123f0f20ce29c08a8d6391e03162daabbd7adb0fafc44193a90b3f9d50ea8e5af714a6d28b39f9198616f0788004e3d8f30a91ba407e516e2741cba8b08954669ada04417be766fdea06a78ff19845c8c925fd8a5f31f1ddc3b5f640fd6f14bd1ca0a6a7c2bb3ee892161ab270bee77c875e4f00a5d523c3d3b5991c3c9156b36577e5e3d972293cfa5508da8e0f5f6f984bcd7f7af0039341a0278b0a4b4fdd451115e1fea3e03c22604fb3ff4774111a1c6e28a03890d2924602321bb2b5badcd4161f58ec58369d980140ee9ed1ba0121dd3ecc21f3b391135e1807790d1af2b6639ca7dd49c2c3e6fb6b012a83545d18c375fd9573d5d94b7337f0d364e1057d8594f84f2a9ab3d9cb1914743d67c97e2c21b25190d20d801d7696c24890881e8caa1088187bd9b1bba2170f70bdc2840dec779a40b239e764a2c981eb190581470d67c95ac10f97af0afcd88ef19d0b13b357fee0289ef5e5b64d0b43901900e8476445dcd192760165bef402946d7ad0ff7b4b50cf18d74b399e5198f150e84d744efeefbcad021c57389a9dadcf73f69ec6243168be31038756203e9d8030210354ce3c65a4293ca5ecf682ffeceb4350adc0c0f2204d40dd6a1617dec6f0efe0ea3a2bb63a03b692ee58f6d46a2549405b7460d64ce397e445ca8a207e3721fc4a04110641d84113c3ec8cd05d8dade6506a53a4ede8fcf1b15d616d40dfeb7ec8ed47bcde134dbb6bdf4f02e6b2ac5f38243254c4e32253706773268d13ed50eeebead236d84e41e7b8fc27b64739d1584c6036e45de411a0045b3dcb8bc36876ac9c522738d8f355b3383ea1fcc4e4a6aa42580e7b4b17bdc186bf16b9a33d70bccd04f0609c423463d16065ac33bee7d7409d02a92f93cf871bf871fb30c336735f741c23b2dabc44f3746f375408a74bb2cef4265ddfc0c044fc63dbee5ad50d4eacc572f4c3208ed324bdbb49ba38cdb250a3fa5214f7a8ca751cb6a6d7a6f3dfca89ada40b76f18837ea56110baad51283b68c83cca68aacd9112d68c7c51a912e9f5f59a7567d4ebafacb740cefd043b2c0b476fefbdfd1450a67e2eea24d0f9907e9feaf610db7a29818fa450caf40389cd775fa6c0701f5c20f466b15802e9688f5f0722d9f9a07ca7c713e20cc82e84db57d39796f9650ddf8dd1277ea3403aa403067540b1d48672b2636521c72d10df287d1852feb94b265d4d3c1a0b6d591a0a2f906f36d0c28d1dce97fb4d08bcb927bcf12c1ccc1896e3bead0ae3dc96bbab5ef0b74172e4b3ca02f97e4934e452a17fec867a1ad622c226b9c37eb3fc48db52c4c8901855eeac9719e17306196e8809ed3c2d06cf613e8485ada6cde1d14f5b783b0f3916261e7453b52015c4ff582f77425a50c9eab6f63511d7278b26f645ad920e3b7d4238a927c66d35ded52e695be407feb13cfbdc7b7fd83bc344b97ff74147121747ee5dbc3c1f126fa8f637071542c2c61b61b1565bdcc06e6e7c59121fa1e26bc73984639c4625bd34b4719e828210118adbb81a0c1714387cdb779697f99b4b3d7b7a015d24268d9075ac91d7bd4861f18c18935ad2a28a77f6c283de64c4309fdf7e2067481e1d61283fa3d2d4c27c3eb6f32f8ccb9fe2ab26a1f3efa9357b0cba2086c977168cd7ac455d4230644d256a297c2ee3cf744812969acd7c7304c717cc2ed16d19d1c5f9ceb8a87bacb915bbc733586730b0733b5f27bb2c671a3176ee756f8932b0b9882d7512a35b7f1d2b4e5a00343b326e8321d0a1bddf86f802ce49ceeb35fa7729b6430c08f4524d57cf062a4b2d374a56748a05ae5f5cbee65a84d81e2dcf836b3b02fb3a9cdb9feefb0a273b2ba9d3e1df3a8bf30f88b2c132e63dcd364cc3527514e3e240dd955bba068a7555d6fc0c9aa8cde96668f0c7f2b2078b1401e1e1087cf25669785946f7b032c8126f1b70726d60808bce68e2cd266bec030483c14e544016c4cd0e156d35c653a44c31247d7a86ca05eeec20e8dbcbf008287ff84a781e41dca7acee4c4b419c3949f5d48d35d5105a25906825cd870b2896e3fa293ef4aabef92454826a53ca9258694544627d17bf9db84cb0c3fb4329ac94ee7740fe2fcbafafe17f25217b968e27fdd5bfffb14dbb59b89edb22dd17794268808b2b93cc7eb6326be2c382702458fba5777db10f41464a34409b100a051df2777c313ed7df30b244e71a3cb914bba931b9a45224a632e22378706e125df2be3ebb1835ece35ebc8b5b806b551915223ae4c5bf9e4e0aba2380fe771190f4cdc9ddc764572b3a22f2d6ea562a773ed163557190a8a9352d4996f15935fb7e313b867ec7361ec1a46c3bb748cce7dbf69b9d7e5cec607b4b0f376d9b3070ada08ee65b8661f5eebec29e68d9fceece03061162c0612d7e16c17e10950355cd7d088d7346943db760fb834acb900549c11989823526f01c59d23c705f14ee61eb00a28c7dc418e35d15a103af37c621ffddfdcc274e2967015b74209c112e5feecfe1c7119af0a2efff61daab1ac6ebb74861456e423d659d4aa94afc1ab150e2bf4165169a37eb3399699b11f9740e9e7e7d6c564ba8dd590ce078832baed3735d5f4844ae0c5b7d450c22f69939ea99b6bfa4cfdd2c64543658036f045273b4cbfa9a852a061f02d19fc925513ef9f70f16cfb30207f3a23598ef27342619eba544b487ec86b077337be08b6d0d9d91355c2940cbfa5e4ea5d76013186a6188354dd8debed672f10dd1fecfc43295332d57abf19e1272764ba1fde91546b442059fff1423f0bb2bf5458a963cdd8432bb90b20f196d6dfc6d0c5f3f28d87b02a5433c576dd8c5fc426e19c601d731f996fd5b72bb3f68e3f94a942e33d6895ec98db92e7edc20ae6c90f3978c15fbfdd3e18bf2571686843c56f871158002327b6f7388af7d735ff4ee300ee7304dd5ab1dd88165b0eec04c51f1e52a942d03fb008625e8a71686a04d80aa84ecca73d11681b7994be19d3112a92c07b6ce2d5b7eb441666e953bf4c8255c5acabe105415366bd8c560f3cbb0095e2c9392b219c54a12341982277c41420a07d423f8a16fa047485b8a83167a232d132d15ddddda5fcf60a7bb6f51351c713388336bf16df1c267c494daa274dd6935ecebf9228b6e00b303ce934b04c7a29bd2fb7febf926af19e04089d8592346141b24a5eb82e8e1e64d233716cae1561c5a816dbc3605896315ad96008a0c0532b0a6803ed1e29c4ba124b6f9edd2df842b0d0bb55b0ce71d38404c9ff584de05d00ea392ee46759f6b9aab6a4d1bca53c499ee5f88ba84e27f1e56983eca961606354eb3b7c5056caab9320202844e838d78cbe4a3209cfef7c93e3e6248a9277db07a5972f4f6e107ef7a769a2cf94a3ac0a37c79a64c41a7c1604c84d5452eec3f37611ce2090bd46a15a5fc308a314687c94af5ba5c1c68a0c409894522356c814276b5ced3534a324534141561b4e39445265ca6c113a1e29e3620250e3726c1a3af366c91a4b6d82f2338d1339b267159fbd02df735ad5d57a2880a271c5be9d06e0d92c91e31c92e937de701cb9d0df9ed0e1693b0998dbb6c7d7cb914b4d9a3ce601094210a72a53036e38a3814d5b681e492a32b54cde965c5b2220f50fcbb1e19836a5bd10a8f3908e464db8007f3379f9226b24aeaf45464dd2c016cfe0f424d91c8c447c5c50ac7bb034b04e5c4c6d13445c5c35f7ba1d9d7ec0388ff79ff106a9c324b4d2a09621738a020c814394d73d556418f5e253366da3ae2c600bc712a3074abcccfd7172c9829b3e332cdfb1ae59ca564c13c63072731aff6991290c3a4484f2d426b1145a2d1e18c7dcfac81218f43ad0fcf5d0bd82c900bdeb6b749f28a755bd3881f9dfaab9c65dca201ac320535f186cc23c1123dd6dbc062e7fdb528f05e3aae05f93b73aa295b918411ae357a85532f4bd83c15b306124cce2c6d06ebd033ad5ddf7dd689bf43914647b3c0ae60c9720cad39076b9a0aa4a3e8c60959f0df04d3a2692c6b2699675166edcbe57995bf49780d17360fa2362c781524f1f9d79f3200979b6bb807b067a4b6d9dd917091acb42806fcfc9274ae37a3ac0823dd2b0c632f17b5cb45b2a7b5e1e211edb784fe988e25c4545e122e8d040501def2dc1ff506d4109fc3e2087cabfcb7bfa45f3e8111166c0c9a41cfecd5733209103ce7ec7727de6d48c3cc875b85b5805e6662b7cc36dea737f1a0735aba5a691969d64302312b67c2b0ca99ceee3e6f48f486d6cf2d5dc1600960dd2498811900bb577ad9be9d35873d52ad6e2621003de594256507b13d16750cec0da0a54fb762294246d0a50742e88fb1287be27cc96452b0b5100e6b42a5f33e22bfe86d406d471f1e28c3b21fa510d7ba7ed73ac83d9f00e01782dca90e727f60b7171d42868d134422cf75bf9365316982f90a504839e211025909866da194960b2b650a2795b5521957cadd8850fd1631b02ad0d79a7c502d3d2ff44410dbcd01dd65690efb6841a23da3d62d5aa333de20ce46227c2dcd0201a949a974fedb88faa5c2831fcb427ce3eff270450f80321c4b050c82cc8a1bdb9156633fcde91798dded5f3129dce43fe6e500ed30ffe496f16fd52a23f82ac184773858e4124c85d5925b4884258ac7ada1df76c35712473b6c93c700ab3bf0555e572cc94f0ff02a32f29d852d096058443d4132c8a1bf078604b4f9fa11a880ac942e0f498d5fd78c3e82c9c224e42f7b01a0d6b05a2202131452deb42024131744fa66a33c245bd570b57439087c904e80789b9bd70b16079288c6c821a66c05dc8896831b562380d7c8fc08c238398480f6f1d6d9d48bbc5fefca691bf0e8b6c8e9ea8c0534f1bee22738746a68e566f923a9e2be15f028dfc947181595c7a47456774e123650b2ff0b18cd017a8c8342cce1cf4ad5379ddd46cba527896c06db596488ed7b47a5a3d975a92a6bf6d1f6828dc5ef808329dde0617d2a31979f7a94597857351f9f30f0e70cf08cf0fbd144f3550e25231be909bb86becac4c5dba079c31988d282c31f6cea78d514c44e6a4d7ef91d92500f09a6471db01992ce3b5750a53bf44464d0388909148fd2f899bd39280f4a6eb072bb503824377be0ad71e18247e2eef9e74cdd07436268298befd23352fe037ebac08e35ae55854248d5f9f96e5ffc18f873f719d675509efc6b79422f59ba57fe025815f972b47e382fe922530f070f558e7a430c3f1f3f3fe5da5bb02dfdab3ea37402b57c7cc691093963687bee381ce43c9b7084476669af82dc2ee3de9860f9b0a6c5f358aa8d73e27763b2a6a33e7304a0ef10772b557371a208b02fce71fb69a3224bdddd87dad368a79b81ba9d9d902352de5c8320a13e53e677703c3990a3ba2dda2662c8cccd48e9e39d1ca793bf1452e0dbb2489e23763997421a94b2ea9ed52a473c708574aa080001a0c12ee4ac17f017e30d79bcfea5957154af7bad2b037b35c7b8d2bf4db2e78686e94d629717fb99f032d0afb961ce661936b3fcaf7894397719a163f555dd16941c811baf71ffa749a6a463fa3365229625c4a9305fcf258e03af5128eef56a37ecbaef0afc3a3335914cfb89e8be68310d643f2070391c427934480594e88d26b9c73b73b8fe79d9ea30b8cb196c78666f13d185806aa895b9fab7a4bf34cbc87daf50d73416e65c855c21a8ff21cf60fc45e20e111e8a281c4146e99c05e81ec55360f8642120925fcce01098ed5e7cda6686ad7a36d9113b061488d1349980e94ca09b5255875754f505625cd03ff8c89124361eb3b22e022ff654fc2bced458a655f59d3a6de10dd8a8fc3ea26e0e23d3d5ae07305d65c42ba6846149b102a9c018e652dc993dd25db3a130a2434ddeb4120ee94a781f6baee04d90e3eec7f57f2cafc3680da975de49df671f5cece28653b18521830411f90ceae04e4dbf8367cfd765675a47b4349c2c92924c2d21bb9f25a55ebcc48e03c87c518c638bd7a448bb3a16a7269be2ddffbeb9d3624e78a11b71a90d0694e8b6c4aa9648df20b85dbdead1e8770c2fd545bb032594e1be0c1b010042fca913a19796818592ef67961ecf2e5926ce63b03aad5bc8766d26d70d5918a8014a4aafa56339ee14ff27f35e89bdc71e118e91ca543ba471cd5c036e6910010091a5221414c6466f1f33e9a5b9412bef666629cfb9fba4b1bb439b49ae274c03155ecd8665e725ff5800931946ea6a3b98aae7a562ebf4488ad447cc0e85a5150a00000000000000010014accf14294c3596020ef4c7867caad84410964205f07e185f8c80cd23093215d25f41f5f3cf55656c45386ffed8eec5a773bb8626a9b914cc8ed99aa081b51c diff --git a/zebra-test/src/vectors/orchard-zsa-shielded-data-3.txt b/zebra-test/src/vectors/orchard-zsa-shielded-data-3.txt index ce1f63fc782..0a4d6ee0e69 100644 --- a/zebra-test/src/vectors/orchard-zsa-shielded-data-3.txt +++ b/zebra-test/src/vectors/orchard-zsa-shielded-data-3.txt @@ -1,2 +1 @@ -0103ed2e55fe065508f141dc03d6c18a3b0affdd1fa65fe080a84ec40720c2d36ebc5272e5a5f810345fb6cddb4e526a375c7ce45aaea9acd00efa2279b8bc2cff234614bb9372f5fe6180783dddba7e44585c362da61552bb73645a422d7bdcb9b8e16f3e5b5d40c2d806d0f585a54ba61510172e612713232ec2da3c0075280d36181e7869205422509238404bad7f16da27a7eb8c01ed61d784e9396f788aa33cdade57165e84558086b7722ccfc88071e6729ef652e2600d8c1e800555f5e11e0f4ed32e545d3381106acee5c329282e1cdcfc4f138ff97e90e7dabcafca6d3bcb600f472b14b93e43166880d1b8398146028e8f8d007d4035661406a0b7853c91f05befd8836230f7118cc61bd32512b2771ebf80c5991611d955c8c3e3cc8d83d8a6e1adbf5d71528bf2276070c607178702245ec0e3f6f8a302f709db577fb82a1990a879bfe7df3b5a2a42aaaa8b701e5ad2a449579934f5b2c92f47a6ca62b0adabc22f4abee89ccfd2842ebcf088df34794da0416349564649422848dd6cf21ae592afeac3fd5bd140689e4b45dfe7b65aed403a4e32fdc89dd81647e15a9b7a38b428487331ccf966eb60a66b4d7ba69ea0c17a6e51bde0146a3db14764434642247a27a8f6c38f570600d783eccd522ad08a8344489f18efb05f6ffa45a2c39f3e805e6a287dc42ab6e9acf08afeb406d870b1a39bd903cf54e836459de0d3004189b86d2d5c3ad03f6b96cb4556554ef63ab4dc2fc5dcb4663bd49c481773e3e98dd6c8a1d9bdd4224d9d646f1ec446227b2573386715d96c0f14ba5a92a4bcea9f5878f75dd30528d307d4706caa855a7955029905150e0b9224f07f22e9477ad67ab6a375f1fda01da59b45b05e4c302e87a95b92ab90f8bd9fe4c923c061f36dbae32765822a6c14c73d6dab812f31d61f447b70b7d126de98cd9bf5ec25bdc87b9f7e184d55dd61d0e46c1aeaab817ef22ff43da7514438bd6bda9e684a07aa3650677eea9d3510041d0f45b0f956d02ddecd615a9c7ec3f137b17d4fd45dd13c933a08f8e0a638d3c5501b07df334b358b2d6cf71fc0e1717fddfd5c55cfb02f234332e1f4b8892f03e7315bada12d92c236d097b6041a5292b4a21c71019731d6daae7497243c16883da375fce31aca5e105ba66177cf382196d58d037b0d0882be766b410f46de7035960e27864064cb8e40a8ece60890be813b3632fd61d1dc8daea61eb80b5e8cdb74ca1d3796265b82fbeda0a40be43a3b386fc8d6b892b8dd6acaa699a492f09881da0cde963ddc1f34540d8ff4a9d78ae9750404a863909e14d110f0f447b23d824d11a75ac6e127c01db79d3c11d44aae5955c4625f1dd127869e72dd55ff9c95e30f5a0442a39059292b8cf23e11b966c9e1a127b6553da9ae4bc52d6e9774085231aead6c346bbf324e71277887647a02a6284fd3f5f06ff1e62df3790f9fbbe08922864481f46f7569295d2e3678a6e2ac94918c7baaacf08a8d2c5a34b0475c64a7f92daa6284a97472b55cb65d97363c8fdd090d0ae30dbc2c2e0d526f165afc115a48ee60841dc517f87be40abd81f929d42c3c996d6035a4a943dd233d66ef2b0dc941bae55912548cfdda6d5995495d2e2d2add2c12d302e8193044ee09c2d47fe5a1e2794cba0077a8a5b654966f7432a4fdee6a4b7017b0c48cacbe7b4ea933a17faf14024b74368243328b77a773e872659da2ca9620eabda87d82f65160d90b1d52ec8d62eb50151148c5c923b06e2abf95c1fa370bd0dc23726fa841a119c436e9e7b0ecfb6579538a95bdfe70a7414c85f0a21edb0d6bad5c025f80806390af5dbac15a96251c125566f58a2811c975274122d56fb1bebf47cb66ddf56f7100aaeee1614e784b2bd51cd3bdccb8d3cfd28107392be64b1014e6721305dad73ac07f394914a53e255dc16c7f20a968a050c288e2261a22a982e9069090a672589f399c3608132d066fde22e370ab725471dd3c8d397bba18f8c428f2a115d128c3281aab2b398a9df7711428a6238bbe0359addd8f38a78be52f58fab72e1022a161d9865ea6c98d31e6d6f34fc4351299a1579a1edfed90b620c5e87c8227f6a241909053cfc0df3b12ba850ab79d3f58da14752e60665e902fe00a83e77308a9144e9675826e726d972e7fc9687e983eeb14488939b71052aa9029d0ee3cccd5193899ae5a80af14d766bb3dd26088d22ad1522e8d855eec3b56da382d03e3cd564dfffd6b53863373be509fd395799554a2a0583d23f0d9a934a91524431dbdf921f5cabcb136490f4e757763712de7fb00048e7e027fdf471c14bc82b23d234eb5ff76452a9a2f0994b90b216c348a76dae65e355b1f0d2bade27ef62cac2c9debc3d027f59431b0c1c4fee2f26a07a44fc1c2ea56672b76c14056dc23a8c87d654e586fe873e0fc3c087b25822730d695a26876c00ad31fed19d85843bbad58f9ca97aff5b8c39ffe7d407a48239916e48889a6692d70e09323f62277f24415cbd7ee1117f6f073abcae20ae120204c2027f9858bf345e41e8a9755e4b56c40dc2e6624dbf7bea9fd80555b3112fb12219c94805351964bd56a31921fcd89e5db7c7397a19ca78bba6a4835f4aa0648dba44cad7cfb1fa12d81097b50ddbd99f82e395a4f0573f51093e74ec774e4ea12bb990c5b161126ab8fb1440c2993bfd25491206220436c3ff619cac39a717c7f003dc5eabc372803d3473d03d966a7ecc6558d2db257e5992de1003fe56dea3fed54b5085ef002ebe00991c473047a84959d1fca33b2fc0f64d78d1af5dad1029bf7c862d04e66ff345d8b7fb142a5932f8a14e20c14231a0d460db486ec2bd5dedcb3b2ecee5cece1fe677caff36c7521367c4cbc42c3848ca6a574e57ce716c77b509b554549a7eaf08cdf9299447c1ec6b91b85efae2a40898eb09fa4184447ac18fb6e7935fd360c5666523205975ab5c01d129ac75d818f0f3be92e7e2c0e84c79f3a5343a9033f694ae133991df87dc4959d16130fb91296837aa501e77e0992bc8560192396f64d9e2d8910018f4729ada0099a6ccc2ea623f5c895d4d98182d1d25e357b48e2eb846a14954771ef4dc60d5a00fac7312d88631c2a8e7dda8d4c9ead9c14ea8bc84e3821c0d126abaede2695ab8a7bc74f30f3a056d8041e563989776de72eca7323fe89125a359e226bc28cf5f5b2daf81b6bb011ff4a4bb4bf8c5300f6118fb8b42a39cec9626ca1d8197185c5a26ae3e5c13ee17079e5e417f934d5623d8b9896a50a99277723e6c335e941fa5716ed3651ce0e7fd11effa11e58207589311a6cc0a7afc45f1b3f0072701cef5de450023552e625e77d666264154a3dbe0897ba00a7a0f5209ad03e2951ce81d6168c348268259da35c459455c24c50e72386f54cce07f60fc648ad2c8e1d3cb78bda095c7317db25ae2455442595c3019cbcfb84b9223facc841c51baae1c345e5e063aead519d94812e7fa57996b9801fa4c138b9d3ac8d09601c7f6c08d18774c322a4ef05186865b17c1e8c5066ee5484a9270a7714c0c2bd5b1226288e32472ccc057035a9c41d0ab7d5c5a31c92c2298320290a17880300000000000000000000000000000000000000000000000000000000000000000000000000fdc025182a8902b4a3793bc4cfa8ccddd717185c3ccb9b9a327fedce3377eeab36ba3e2cd23fdf22ff824a58d2444c02e2b2ad39a32de12e62072de4b2d3c14eaded0e25fa1690591fdc286bcb29d452b8d478b6f463ca50816ee14e749032c141001fc264c14af6893894fdf25e9c6b69f62a904654e220517af1d486dbe0844bd012ca7f297a43a5daf345ed0fa8249666201c3405af3bef0a79eba95f72f72faf1a67d6cd04ebc21a280d56ca7b955a23f94ce614a98892c88f7504ab3ab9ae223f6b76d52293cd618fd2b03c76562cfd8d70008f67b30d964f153075b9199563a4b0d5ae8d17cce108084e22cc211117316545f81069b55ae0f2051d79414e858796e1396b5440ef6350aaa44c3620dfd5a4d8dd5d470509fa59d0ea95853043bf913ce59645517b2470bf9415ab689a023fce0df410c8204423b5d1d16c72ce32232b6e090195ef53fa2efcf311a6ca1962411a68197a750138060bf56cfc8eb7a7f9738556ad74e0a2f92d017441631f9ed527431ea30e59f003900d890970279f4fecba621072c8b2c2eaf40afce48735ff56bae0dac0d0700ab1a78d1d39185b84e76829377f066758c07c594f0c3d8b998a35b54bc3bcf89bc5b6d3aff7bf90e5e451cfa79dc60bce2c0d1be3cf5191dbe013c59dd92bf047d2fda46e292b77070c1892605a7eefffd4e01c0eb79bf97810a758d6198bec2e0a6c6aaa249d40a354f149c192ac8a77148a3a8aede7c76ab28b4fa76984105c72b306f42a3ec6c4bd102e00198a603dc27644048b0688642cb129b76a03eee5cfd752788e1312d44f83724ff10419da66457f9688f0670d7c6bda1a77653fa207705cca051ba132db7f4a28ea83d25f7bbbca64db74a17b45c340704498d314532ee6b11093a1ebc763a63b234efe3c7944490c222d4aff1d6cbb3b43e43849503480084e2f950c5abf1e05a6c36b4854fea2e27ba11f779f8c1b7d9e7fa5d17b6f67777e06adccd7df8950b7f1ee32fea85fbc9ed12509b5a6a2e7d87c6dff9108b29e881a15873e799644c085c7da4ca4ebc281ae1171b0d57f69880906188761229862845ad0573ae53d3ec74a321b2dd1f948c7f23c7a86aef4673606454757c9aa6880dfa333d44ff11db14aa7624c482d3e0c1eb2efa609df912eee2bf793f72d062e093de6afea94e86b01ca86f81b18bd4247cb621b5180a9ff3209be39d0952c179cbd7a71701cb122cdcb7b6a14af29877a56b0657e2aee606d072c8442a5a2386fd6f555f8cc0ce1cad545c437af97d8b6f6cd5aeb73160fdf5679ff4b1c9ebf6877a800e3498e406cd4ff18fc05fd65ce186a4787fc08089f707fcac6885b3583f4818ba3a1ddbc5cb1b7db76ceec245fa9b91f35e0c9279d1a7b3a4783138b74a5b5b85a4290435dd8e658b00dcaa33484e4b3de2bf80975fa73b0a090b08d3242c7e0a33833b6572a35fcaa7d4cd0e2f9434743adf4e07e7d49333ea1078ecd21aabb7dcec6861940ef05cdb8a8efa7dc11721030da88c85e8e639ef2f8283479e06b88c8e3f095862b5c67f119a643355a35157442ab39f0013a69efaa8ad4648343393a11cb27798c3ba4fde4f9b334d21b28b21eac8f69f1945f556eaff53f0d5796d9770910965ece9695e2c86177a66281b1740a385519ef5834138f929cb5550548a3b0b1d76f6e60f49a43c57c4fe8dcce5a6f2cef94ec9537578ad7ec2509719ba5fdbe561d77c8f20d363bd3c99735d8f413566b49958aa4a329b719fd30e2ebd7c445ee78d79b83f7996de5a2e482ac1e3c2cb5ced92a784a8402f6f7bc727efc97757acfafc19f2d1c7cbfc59372f00d2d744e058746949f3d0600373298a1dbe45dcc94322f70a9a3af8da8407f4a1f22eea2e94252771cb530e13c7cd57691a7848b1f401473ab3886c16520bc0c84fd26a76949b52c5026befb00f911f0ead83e78d74c17d60a624072510dd8da3f110b742d6abef12809b4f7bcb15d4c899b444259085ebc7f4217ca1e630de9e421addea8ed8b96c785f6606d464d8c1f695811c225430deaf7d428cc1961aa1908f5345b3f757bdf82515057b5a325e4824afef6bf88e8724011ba00da5803445917c0f6e2fba34d2d90e40245a3f9f7d466e0d6bc10d51bcc50978b0b6f2fc6a7e73591c6d6decb1fba38801c19abdd66f21e61ce9034f101e296e991329bc7fc29faca2f2ad1051c47530261933d2abc7849ae42a71fd52f37d0d41f80b488173d54505343aa0a000ea57f2205b3705c1523499d8be7e60107a2bc6e8ae8300342dd9418f6239abfeadf0cd14c215d14720a8e7935e117dd572ed67e15defcba9e466c1030281bb0eee754dbf19c259add47bda2f0f6cddbd9dbdee93411b324b8e10b6a142d7c8112406d32f19618ad55991cfc90f47d628e89a1678835f45b4f32ceb241612c9abaaee8959cf9c76da8022822af6a967e87847acc41fef08d87b2237bb4d9a793e7c63e5535914fd1477f334c3ed523f7ac9360dca7a9832480457d7ef63b7cbbb83c11932586d41bf2b0bc81f0e0edd1a00de2d715efeef3715f82737fab942996cb49cf5f63bff304d8e23bcf6769ffae6c372218bece4a66bc60ef4104fb3ea6d4dba9384e87996cf16050821aca71e5e0765f6db238b3661e00c413f1fe377f7c6c805389415a6f40cf01fea0b0d42397f9fc5f6375cbaaefdfd5db218919d490e47b0cd62ec141959952e78ade7e6f3ee4b4e1c735800cd03d346e74c5b6531c1b98579d718c9eb3df71254a88f99ee833b317f9b281cc2c0928b09c123856e30c42ec5750453c7b0fe820b3a2efe02b83e36bcba3344fd272f8674bcd255047161dae8656543f6cd7fb9356c8365a7733667cbcb49eecb4b5ff1e91f31714b02db69291ad7bfb20b0e12790810c483e3d20c108bb93ccc1f31d83221628f8a5f7dcab5d05fa4319df315a4112409b91ef18abaf81a806a739120fcb441d3099e86d4a97010acea334b867f685757851fbbe82d83686f2c671f25b31f922e90a367b806025310aea71b090d65fd0bad33f69310e93f277580985c8d1310cc54afceaf3afdc7ee763d96446ced414cde8d9fef4b6e2f873f9868dd395b79193e1db155d1bca0e4ed3edc2155f603bd2463cdbdd3fa5f18bfe3e04545114ae0fbed2a1e7cedc10cbfd5fff385c6b8e7527732e989f4a6acccfa4d9b3067f12f395fbca48d8b6c9a3e4a7a6fbf7f79af8bcba08b454e0d7010efcd9aa663810a337ee56469738ebf693a804b61b2f2f33d7e0370cbe5f122aefaa669c79c29b3e789c6114791037fff7db3546ac70a5032425c55d431b347d63cb808e98c034a034d637e7dec8fb27076c6094d4e21ed5751dd8e21ef1139929563dd4fd173e40fb98ac23b9cafa7a4a7b1c1f385078fd96f2ebfa92e2790c5e0113c4c28007bcfeda38b06f5da7e3bf60593898af6e80acf23e3000f6811594e49fc945a214a134e8fe22f6d081c456e82fb4839cd906bdfb97698be7ad2bf99795dd754500b437ef8048c572289b4b3179267dc202bc699203c2a625f479764acc4d73b534e5656ecf8a8b3319502dda95748b4de8d27419f23c8691983a19434665cdb406eb5740d43908910206f7e54b19736e8ad2eff910fa7fe16395eccc4a1d27210630b2efaeaf1cfbcfa009a13bc83c3d20d2f28b50acbbae0c9293221a5340ef3dd784f659df3e8838f273af5526b93f71d18e0f9efc82b2cb2f5430d8b748722e9c4de76327417c0b2ddbf90c0a1fb31e623b4d549c5505a24e4b19ba0aa37a302d715dc87314987cc65074090fd723d88f21693f21f5df8d006f0afaf4df9732c93eb35aa9dd65336c5ce4672d2b5a0c22710dea62bcdd9f4772f7e737ef132bfb59d99a3bdc2670a0a5915ae6290086c24c7c1602f6b060bb39ff187f10bb3f7442557696e943de62d6a90cfcdac9bfcf6ef25d927dddebdf51fdb8856c2e384b44749c31b2179bed543022ff3248706340482c3cdf7fa71d1bbefd99aaab1693fd06f0176e5fdc97dee40d57598ab1ce8d07819cdbb23fb2db14ab33ce6f127d522acc6a945772f1039b03965b3487c79cb4c6a6aa6f90bbd76a6f9f97553366f274510d2e4bf9261eabbc8dec5c96b25f9e2e5a6f715f048b2412f1fcdc243a8051ab5e61722ca66c2d0ec397919204dc22ebf951160c91a3604880e72520138d38f31cc2abfc204d82fa9a0bb7ad962a0f83ddf97fb65b934a5af615c23aee56d8feedd155e9c01ccf201e8f453a3ef138e02e7f08e15befeb75a16d3812c9bf9464c92f7b0b493e82034a758291115ada4fce8d666566e28667040f6e01b5de9917795eba14cbe9969b0e8fd7f2fa6feea2af20f213657a1dc4c0797e28322ada29d781b0d78fc5e1f2fe2c7198382dcfb3dc512f90248d6a49aacd991ea77d34348f330e71436dfff776eaf69eaaa58d50f751438ce7d5acabb27aea197c2275a85121454a51c19f406be3f6262b45b804fe8697793a84483ff0aa6f1fc0d5b0d1bd9ea1bc1b439831ee5b9b4d6937e20be05fd0a4a655138b29fcbb086603fca7c61f39fe1fcfafb90b3ae89b7f446684ffd6e058c49aa5455886e63fb01e4246c92f5ece028567b6cb6fe0a4d8cb566d8ff8f00403220616981bdc154e437968c32487d263d677c35886e530d57433339a72121662c4de2d278c9e0469b1cfa71bc03aa5256570a74e9d8720b6d46385c7e50022b91bda9826df4820aa6d08f04e7c2b32c87c34d1e97904db63c97318eab4203ec9ef6d8a7ae7bc000beeac841e0151f56a08e40c02e41cd9d05f1572af57a03bff14d560f00ce60cff1d8adcd8833f5efb719e3b06500568718a9718534e53d8bc2c7285b2b52122ee97196aab9f6acf49164762beadbc0f7971b0f7c90a3c202a72f2b65acc940961f3abc0ed0d01f88a0bb9f20cb1d3b7240e9f9d04c26d23b029001d7d3dc307ab050095411a4b6d199b55651eaeaba0939b49dead6317e0be8558dc1faa7f2ed49c1e870cdcd9d20ffa02a23c15dfc8c99c8ada2964a96bcae65148f021f23ed2e5e14be1e78efdc8fd16301c23859ec22e4bba867b4ef905e5cb776647cf3edf33010f5dc2628df5a8b285feae5e3280214992ac99e92b9c6cdaea15ee450870d3b42adb545f2586766c6223ee31bbe497cea00a3c7e301714d6cc0900723df7386d562185346cf315138f2dd047e5b71893d60b72c443237909c71e3b590894e03923da374d8cf7ed9dbe5c6a6fba22d1d0bb1290d077909d0433c3444008d93c8eca683563c0f56e73597ba763349102f2f46eec2e8cb845215e05344735a79c727ae13d7a2164a882e0fe9e88f60c2d4315301595ffc3eb063477957d01b5f5f6ea39e0ea96355f16f7f8b276b8a9431a31baeb82e0234ac90cc426390bc4dd0b7c862cf18a8a987169c355c292e7f51ed8d928f68b874099cfe863422c21645786d382b3ece28e1b22b4546396e7429bf82235ba4bded306121b7e1f350ffd44b037ccc7e7993fcaddc477f356eb29328f876955a3929bf450dc40fa160f491d0782396ae5dd68b5f22478ca34052696667cd8511795e5db94e2253930f2bf7a2d2a7134a3abb9f9f7fa3217d548d0099a2cd932a66335d6a3f7993d2777ae3499f6627bb583178709225664f72b42fcf0111b10ce9db3ded7af9e06155483949b058db23d12bf1ff3033052c10f8cb2815294bcc331886eb15562ff13aa370dfa80e5991b5f9d96a6151ef73d782b14cac899ecece7bf6e85c744d8193a1a2da774d3c610590084c6f0bef9f9adbf763bf337777a967a5b1411854e2b78bec43f80c9dd89aae712b0914c00b762a2a79a9df2c4a6b02531164896592defa6cb54d4a2e9eeea1976eb10f6fbb749cfb7c877153f26d44a07a3b7004723aac06ee9bb2066a6de50aa9114884c210ae69e2dff6686e06a4e59df4dfbd72da33b256b05b9119ee67b753a7664ab02aef200a90dfaf43a5e4aa0d91fa84210e2b5e1c442788f4cb4d71b64e8adc517dcefea1a97bb51d1fb210ffab3b2211a0537385c337e55dd7a83abd2f39ae9d75bec890d9be8031c16672e2a77f91114df19158c70181d5f8f43a8dc3b262cd28ddc1a485b917cdfdca1115962aa832a74b448e0531416b53043f8bc7fe0a967ba4b67892855b08a1d27219e55506634a72e25a490bff570d21efac780db6073f2698e3b295ba3949f3f81c7a858e63ce61db5e82bdad1f860c47f4b88191c2e7066a0da11e1ebf30ea90d8b6e39bf209ae8a88648095a74033ea38515eb6a44809a8440fbeb525fc1a069b4269d481490e32c55fd3c77b182a70236ddd035e3085e9a24262657f775bb99aaaa785917e32e783bb4413f7e62a818312acbf3a16753c52c6057751a0f3403be68c7792fabc3428b92c5e70ca6b833b3aec58fe9397c0a8c11a5c98b12d288e20663a6147171bf92352482e86e6cd714f01ad39f81fb2d9e0f1a0f38a323dd51c193fc1cdce3f1acf3ddc6bd5c78ff51746a742f8656e122f2f3cf6a17c1eb9ca08e302d2257411da47ca07b5a881cf8230cd33a32ff9e1d4c1bddd7359fb2fd4f16e111888cb7e7dafc41508f06d23870fc25aded68dfd8a73d9b20d55f6ed47373e638517c8300476ae7afed6bd8ec76f46ba0f46f679cf34c1b4e89bfa5de39c0a1004ee568a59b7130285b5b63111d11c0fe40050ce33770dbfdb82c89e47906360c616679df1e18042f91efe59e2750a0e0a8408c2e25fa6ab9329a767e86cbb40a58e52d49ea15e2f29193c8fa15c9540834e807b34c51d019cf6ca5bb38683627a993dccc1235a8b4dc26d04e45a2afd7d55a153812e60a52442c399f452c0500a0284f1260dac5c72ec6cd2bf35b4a8ea4d1beccbdd1cf969095d83e85749c3db79f69e7f0e3fe28ca19e042eaeadd4a4be2ad3aac47a68d9987189f6c731a274ebffd786230015319b8d063c3c02a63f1644d29292cde32465723e337cf0f132b1904588b0bad0d2e98589cbc332d6f40c556aa3dd43be9d68ef43122235005b6541c31bf4b4e60178e8c45f8fc93ffe1fc36b43f0f32477093812afc74b30ad395ad6fae4911b48b715a410651b2d42664ae5bf374e10ddb32b3c5d0f17c3a2d6a9537b3684b6f97f69ef7c26eed77ce981499046809aa2be27b0a4224e908b08b49bbab299968de2cf3bc2b1888d9fa3408aad2c7657925048fb70cbb8217e4eb7915ea2b65e32c40e2f969208fe39774bb4c18dbccb00f6f9a7514a80f0bfa6e51a8e790b939556a57d8b32be1da720af980ce799ce960e22c165a44e8278a0a63bad886664bfdd37b49a00eb0c9d77130631be26173b1ad06dd0eaf151cc832da2ab40050c09397ea9d1500e0fea6bbec09b49763954e743cba3ae5eb072223e7bd8544eab01aafffb27b023253c43a208b6d5652fdf066fe41d4630f3f29b9b54e964fa7b7063d52b6114b922c77df523fa462d7aacca7c8756744b32b04c8d67b62042aae128cf75e563e991d46ca8830b797d4e03f03d46a4255730a361da9abf9b821a313c8158d9794bef6e5a993170a91a47b2194e2e526f7390f8f01da7d75ef5996ae037275ccbb66da04b5cbce4707dfb036d7a0f515c4b414cb1beb5b4638a2dc7883a380447445e6ac0ce570d62b69078f30f5f28ff1bd0eab3448b9f6428cf3f56c537c0be0eb349fff60dd79fc2506636c8e692b772e322a968d64c8950be356b027a3fe86a4019bc3f724642415e2d585db0ede13630f3a4c340d117426576878f6e620fd67d3c1ee5d1f0bbfcf3c64b36d1c24264c1da96ac77ced1647b7a46ff430bbb1b352051ece9652e807cf9f502ada762be60d096efb7a8c503dcb147a5003c2befde2c140ccdd2d9708635ddaff36328d7b177354efd57b8c9fa1266b63f1e77ed9bcdd7107d606c7f178ec854509d47e9424c8330237ab960a90de04f233dfe4b31725d55b09b95dcf04170ca0cbd5bb463b8834a73230c00628b3281b4c7e99e483c2b0c4ab4d3671015f62e710d439392ab058f4755252c8314331f4366ff692562e241f15ec8e1de48c56113067f8241c263973557094dc0ce7c21daeb59e99d2d451dfa211d75add61cb603c6dfa8a0e2b25e3dffa409237d8ed3d0e24f08c97a4e2eb2b0837762a85444ef5d7303436fcacc67f1878b4cd47682571ce2b60926738a4c5812b3b56f6b1c76a0e21b4255727b9c8d709f81e1591e04207f8accd81ff781feef5c5c1eeee737ec5f0c61f3785fecb0b0be5463759a0acd3c9841fcccd2b95284313df36ebb6000957b53645b8132b9237e1de8e23d11e5a3061cce514194bbf2551e235eba09f3a029f0855334ae08c3fa3bc3329ea3f21867712a495d9f3b5b2a9fe9575eccd6814a418d95324a4ebc71f9211430eaab9974d39a2343e8a9c55461788149101b75b4c1dad7e0899f3a2398fb23ab891face3020d2aa48a976204778f5729b0eee4a6027940decb86bd216aa5d25f7801a049870c8aee20cebfcb4e7082376eae71d910e800d25c2554c1af6442f58c7f7e7acb2d6871858a33b2b0400e66374182fe113fae8627650973a851ed66379a026ca28d523172624ea3f2e42825ec977b09f1508f54ca99b4a9fb415e143a19c660609550d58059b8cc3acdd770b3e57d5d607057e8ed6a3331443187bb58bc58cde0cd04992e2eba23bcbfa56b92b6bdc881a770385af2553a9262f7e15c1f7e41e52e0db95c5248f208e6412e8628dc64a0103c39b1b16bdd65bcdcef15ee55ef3396493f58f95bef1d8909a03c150b6600178555aed6b10a46399ff37752ceb127ac246a79b92bd1f80e6f7fe673ff8673cd80ec9c729b19d792e55e0e8c819c29d9c8c97f5ad67596a56948fc495311b10b012c537fa598fe2f6b0114a761f8c9b1d43da70d63e4013747d5692e38fd4062a315786c0f31880d826ba72d7d417b09db547a9271d55f0925b8effac33b82b3b585c7f55635d29c68e44452e49f1de93e76d8b2d8d8b3c7d83885b50ce7b026b839ec416aa5d5e423cc6ec74ffd9cdf56b81d8b73e666764548d8ac2cb363ee594b96636f943b71f26b7e8376bbce80b703a2a20d86af7a366a202c04fe81a77e3017e225a468e71673ad9849f54d1c7c59444d757dd92864a6ee9749340297cda7ce5b5961015a7effba5bd6b6966b70ef3d4e04fc77ad582a7f153d5aa01797611de0c1f6f80d185d079db55d2f2468556ba0312a4fd14e89a978a1e2c1a6316827064ebb70d01afea9cb5419bf37ae94b8d8404771cce4b8c0e0e6ad91efbd012fce412b87bc5d5d1e6cdfdd30a6faa7844122fe2c25cf153d6f5dbd6041df051647ae8e7c71e4fdb103f65010c9683e84e3e3b3b5e3696d0ed8c344e21aeb105e07ef44b60a1316ded99b938c7a604c36df9f2690b65d9a018831d5c14b4d62240e1f54a2fea30df9afeb230b8a0166e2f50f3136a62595f2eba71d5069d8d68434a322e29830e5d2c977e512fe672a6677675f4fd90bf056180aee6313f169142a0d163df5dcf0e8c78018b8f3fc32b29a0d3ab20539a62ea3535cd01a644dfc3b21834610b5c77504ec3afff783e43f3f21b8e3ce8e3af28bf004c2bab266657faad53888b90889765648d29af6354a977d7d10d09db603793a9fd0c3677fac179d02f679499c61428b61b4d6b2e38b90ff77d6810b01da9c5f3f8320e5b5fa8b2735e117e6f778d186267bf6c1c8052f08135eafd488f1ec7dbc31a25deeb1de657da8383efcd5275c0147555e21e1514e38bda69d0f164cbc35a24f3084f3fc9d037016f250f708613f1d14addb975aacc1ea141fc74cb27876315b194ea5fc8c5803a9e3ea962f6f19185a51a246f7cba95fea0633f47aa3d511ded73c5ad640d4852163edfb412c3958b34be0444fa91c47e777614760f544139e673dc495bd7881bd8a6247c12d81d8504265ceca63faba56923b929c104b9124d57d34fc986b30c102f8a10622399e1f28341d74473c812fbc76d1ee6d3671dde51fe4acd47433824408e82065f965cc3e286983f6932831a49c768282487032a0832a8a4ea0db766c9441cf8598a1aa2a1ac2a77cc9cb8cd0ef0b5a1585a235b611026ec97739f01243f39456c13b9a81d17ece5242a8dcd933a948eb2dc01de591732a03e76cd4f05633602631df8e4c519ef945cedb6c67682f2f354c01f9e8a5892f654655d5f667bbd13bbb6a7c936a033b69369351a71116877205d38cf70a43b6b3c4453afd078b9cf9ba7de2f954afe5d470484d99cad735f19e90f67572b943bcee16cfc9e249e9c810919b54d788355e1ab05dabf5e628b007e334dd8e8f263c2072cc776b323bc9ba44b7e567fadb74d87ec266ff30b39992828ebc675e161c5579f3921285945fd0fbf38dade79a93a5d2472681a94325d1411d3eef8b366c0041b079b4634571e918904de6cc66f9054128ea20460530a6a1472125bcd89bedf69068a4ce21abe352985703c1f1b4c5c806121c4577af18d1ef7760ac19698961d3abe49a91036ddfbf8acda5931963f6f3f201121733f8c3837792617e543ddd7fb21486d561c89317fdef684fca4cfa9d930e3c2818ad02f7da67fdee5f2595d953babde700ea1f02262fd728f7729896043255ce17389059d713f3771c6ebd6140b848c2369357267614e23e04ea360b82250bdbd5bf10685276dd89de3dd72b160220087bf76024118b229ffcb9a9af90d73b05fffbf34dcf9365bdea53aea88e398e8b974c36532bfb71851dd60d3437428f896a77536206db82c8a9e61c071686c2475f5a44ad6d5a58e35cb5b0e4fd5993b27daa01880b2db8ad4f516010306169d98acbe25ec62b3d9a930efb20b5a60e4edfc75370b4ba0e3507f5b1d28e73d257a59d467d3fa617a33abd5776a8a24998396552aad9076aa1c882e12a7df682e96b57946f7166e2c84c63e0bce2fb38b9618500d765ab040839ff7bd08fc5937de066b65f6619fef01307616384c3cc9909265217546f0da5e4a62e5aa4ea575ba369efefe605c56f28be2ea7ad3134843ff8d21cefd42f7c089f6d1b2a1614bb99f9f3dbbc1cac695241247b4203e0fbab18106faa81a4899ede001f64b829c3ca639b111b1b47148f75f116160ffa484b0590a91318c934795ce2e6113f5dab44d6549bf239ccc1cc80c2596bd7e12c9e90f13827cb925e4f748fd924c460da5c0ad2ef83851bfb575297ac182776811cb6a2170ec7687629f7da7260346b87fbd072feca5efe570f9d0adf105751c259242190cc992e5f7fdc0202ba6284a8fb9fe8b0663cfd3e73f3036a8255b041245631c22b8ab546efa65dd6ca03676c9dbd891f3d8191b4be9a6ab8ba8da8ca0b4a03df90137c6e4de3a01d5ce63b75e7cb7d88a0716eec876da05618cb68fe0cc4220ee6a5a539696baa8ed122029821ae7243fef89341fa47b80d7c727a8425f4a147df65c6a2da1f784ecfbfe5296e84bbde6f6d4c0f112f0cfe5f406c00b0f73280daa09f747d41aff44380431f3feede05054f8a6bc87c0ee986429c090243d3aba05998c156381ad3925d86f14a4b0e57271a2795d77f351f84de808a4cb7c13ca6a1f4c1b29835e11626d28977b0d88684baa190140c422aa232cc84c372f35e82b6c992c1a6473a9248f340421cc572e2ac8d8d102257e57bd3fb1e10c7b2e0ba921f643238429237e10d31641b5de2370c0c2e2b400da5870ff23d9540c3f5872559924448b96f278fbc9701319c42ef7e87c4d5be63d1958f1141ae26e3a5678e1d92f9a4a72bd4fe44042bcd0aeea7575f5a309ffc4cbbaa9116ddb0e363b1a206f78e3785f0ff8a4b68b2f313ea6d27795da1710f5a0b86c4256177335143be2e552f316018036177177c8d6168331ed6014257960b7e69bef55d48f2a4398bf30ffc63f959a341de2073e91667eb3d32d876fba93d6c1b18d28dbd23904a285252402939ef8e425fb5aeedb7fb2b693c3c179ada7ca19a173d361111a66f7837a5349125a5afb924a2a91dc0820b22c86259739e113156854dd1ad924f599d0ea861083c6aafbec4861b480db2688f9bba94c5139e5b9d8450a81850140074ed040bee3714c12ecc3141da177321ee4701f83d9109559056f113f8b2e09be9000581078b442358170c1c74595ad2fd9720ac7fbeb958ff1eb0e16cb208391d30fbe84657818052c9887cd3705933c87b8db7670b697a0fa16d51948188929086cedcbaac7db4d16b497779fe4a9f9ee2b4935ed6ee7f654b0abb3ee8ad65ed2ace59bc8a5fcebba38e7d8e92c9de0386309883b0fe63c135b508c232b2373dc1fa4658172dad6908b2313d512816bdb84a04ef65f777efb10ed49e51f5b055d1f3b0408bee406f279346374a06ccdad0ddfc6844fffe005022a4a492ebf9fcd0065277e0d9a9715ec8446bd2a72f84c72e23baf4208ccfaf3f181ce33ab4ec93dc5a66c953f1c973e32263dcf5e8b24e232ffed4e7c729aab68d0d82db34b2c2f88f690d09737264dd5b5bf5ed73cae82b31f074c1029ddefb607240418c34f5f133c7266582d0f822111e0dbd011e644c30ec0780501eea66e701fb3466a5acba3b95d77d1ba2e1f13984cce00a99a91f2c222b2014be7354e18dc8617d44afa0e1746305f674dc195b4f773fc8bb6f04a393d73f69fbac7e7ae77956225eb2e1ec9a185933230adb4bbbb86c3dc8f90e3276b46606a62f390c7ba8571ca5e0d21ac84fca33eae24199bbef8f0da35b443e21c341d701e1677261c1e483d67e9451fa6cbcd9256e2b7fff4897657a0ada198cddd339b4f4281e54e9c5080d03bd4f182ea97dc24a1baf77eff050e670dd2a575d80d71ca0ffec39c81ed5fd174a42da8e17f9dcae943baee37cdbf302e9b04a2bae913d4afa7df222c85a5e2d637ef8eb186da1f9ac294a77a336ca8533c51cecb905d8c83e86240a5b0bfcf37483d54e4f3b29901ee8768b0b19d7649a236c3a822475eb0f16c2e37aeb2a251266c877009bbf5ead26983691aa5de59f83c44f8927298c0475762a9c443b37fafdb2ef7584ad02579150700a3ce15abe67f786f8c840083da241f0a91679680899ab643c3bf72701ec95c142fe71414aebbbfb80f8e787110e03415d29e7612702c183839998eeeded5b6cb14713d05e97e4d09edbbeb6fb2c88297b94b57b85425ed6acd227a8cfc8e996f69bdf0a0cc90505115e12f17d8e36c00624407481a91c534dbf13f50f578bcca3f7a667a71a07d61ac149b2e54f3fc0934d718376d5a0e18c848515ada3a1b1e038a219d73ac25863236aad3141267b54ff44f3b43af6377c95f059c3cd84b1f0383376a6b82e676beecf976a0111327002a88a3f44f19ceeb0d40e7874941de4e917f66ad8690f8810959f629f7a23ca85a988c2ccefaa8d237ef06ce418f3edbeb75377a595856afe5e91d0b4ca9aac165ff6d7b4a25d20ad0ee82f8e224f064c6b6bbffe8b157d8b28c503268f8b1129f75f24fd52ec0dbad5053008fab6b99b079009ec44dc27ff6003b81746383060dbc7504939b0ab09e3b84cea547d170c51c93f0048f815b414da5d4a18f38b82e3094b749c566922099712580b37474b78c99b336eb84c728c394e918061e9067d6c924a9b5a7f00ffd7a8f90ba930f533de19b2d91664c789a8f49abfd9172f7c7516d7d0315eb6d35b09ef0f08790a98e5488f31d6ea1f1d97d597a7d2bd3ba93143289593fb9ebdb96de6dd4702ba58ce1bdfdfc6b98cb14c6d8551a3c51f2ff317b4ac823d8a542f859bd478ac1e4edc618969ee990d8177c3124562481b4f6c46cb5b5b6315caa98003cb6df3c4bc7f50efb043a325c94553e9fb139f03ad59ad8f7bf54006b96a067614065d383dbf690f4860a611985ae4035612e0a000000000000000fb96269a43f661871dbb5f875ead7f000aaa3289f0389b3211f2abff1434ab316814f210ddb691c89ed0d2332b4758c08d1e5a92aa228f781025c21bf531521 - +01031ae3baa73554cc2eecd294374cdc98296dd3abff4434e05ecf7ae347f15fe1adb3ba9b95ba33e5e08201d381840199ee6c8d1da9487ae161404df7c75ecf7a3ddbb0242107706fee344398a9f327fa9a7f1cb8fc39bf78ca32890ed79532da0160f3693424f41523277c7a20026921da903b7fa34e361078c9c24e720d354a25bf4872332f6e078f9d83222828a42c488855245c62c12022b7ade826b55904270115451db9f04e21f880dbd13cf4ed1841a99d2bc30dce89081daf0b00d9cc91ba45e071dd897a6cb9d0f66026ada3bef739c3e1f471201299f4c08ea695eead540f1e8ddca8181a12681ddf2aec60b5725964ef66b047dcd840549532f45d10e8a053d9aeb97b9da1ea07de956f84c9e91415a7a64db9cf7532bfb2940eeb4379480e74823dbc09728221a248033b86ad27ca2b4ef10f2dd8e3f2b390f13ce1849bd02a76a53a5e41bc628bdc7b8639669550fba0d511e9b744264e427cc04edc133e925c26a5f752475b917ce6abe51dfbd93160e6ffb1a5483856677b2368fa1ab02561dac4858697eac74a196e7dcb26995b1da0f499c28140dbc303c5ffa3922e4b82338da5095dc2d7f8c5bdbe35b9a7160270f581be47905b9f03deda9466c26e48456f0beda8ca25ae624ee2a8e367cfbb7a172bffcdf64f6467da6140361991aa9cccee5e24f3ed2364b8815505b356fbab4bf1450a07bc0ba10b04e4cf5b02aa9bdc26f1c5d0112fa76945214e7f05c97bc0bcaef60f363bf2f2b2f76565c66736a87b798e9d8a1f47d732471201538d1090cfd41e5a89c6c431ea27e0eff00ead7c412bd8272cae68085468df410196ad47f486fe4652b7ec6dad8edf26d99e88da9f7c93acd7fa8911b3b9145bc174a0eec5e66e180cca95079d2e9bd8080b22b3c428dd7eea1d09ee58663b1a6de0bc041215602b505a8c6fde8c9400db72c6c6ebfd2dcbdbf2df4c43f1c78a4436cd686269325f962142098f057dbc62b16f6e3f5b0994d663aebfe20b5bdb4ebc4674c51568c5028b8e34a5dd7905323ac2577da41a74e5a9e729bb3834dd55f0bce7c896f283d033e96d9bb7f32c36ab85f2f5ba5ac14f6716c561e92f3b6c67d0c4a2965ad8177ea7cd8b0571a07e26b930285d0dd9e24a25fe11aea9fece921a4390afd8f7b0e855799497022f52c5c841dddcc2162022f23571d654beb15e9fc74e004f034022f92eed73596284f1540cdf5dc9a319472c6ebf32f7ed26492c7876caab2012718e15fd2ebe64f0ad6a5d076388e82e04d83ac64bbc063932d8af1d378f241ad1cd828ee662d60357260937a465e167320d1cd3cd63a41008e9e0388ed00d75a08d59a8aa0834fd4bb4d29978438466a0843d5ffafb3c04ccf4db853fe7db8cab6461c322219479e02d7a4e71a8142b6489d4771eec568ba5102caf616ce61a6fcda915865c3b1fcfc4678d1bca9089edc463d67b035b6c0c1954ab235f1e0be8d462dd987624cc74349d48d784f41b61cc4b0f3d263f54acdef125bce3b946c8b7f7164f7ebace6f6eb0a637c3e709d7d128bf48ed23c46f7a2a29d465118dd2e465f12b007b49e37507427110b9060c6d6cf176b99a4205185fba7e4024213efa60fcb9b7f7c5ae251989135dde72ec3b050ccc4a0679675276e43e3b3b90eec73b8fc3acdb4a0cf49bda26af0d1be6c16422a4e43d1cae2b3112b07c55f2098409a4e4d7bfb413b896bfa0bb5f0d135ed5967d3306bdbdb9e6e37e1ed488504132227fae9d86d437b7303ec9b249d3c6ad646dd2cef2c833eee2d0e1fbda612add1f103fbb59fe3371192a77dcba1a04605db4221e6ff900d5a1f9edaebd4dc1da49c5c6779c6955e7ab2bbd42d325203a4382f98198de8d124928079ee9b12067e08bac6f362cc800198be34e4886f2d97a4f58df2ef04e414273322ffe22867a6a545b4a3b5bba316afd0c32756ed402354ece9e8f43339c8abbb153b532c1683c5e4a6b03b34beb4d121681dc06829770036cf8ea234e463877a045e0ac178e5d689959056cf2b008491313d90377b64d5a101eae347a60d4b1a0519101ac2b1a2eb8c64177c2ab75a2ffbd62bf368ac4b23f92ee4dfad91af3636e568323a29f6e20d1e0ba810befd4b9e804dc6baa8dd60299d6077cbd1e250cc03ee3700fb3dd3aafee233d8796e285798244117652b81a23ccd1b7530a790c542fc327529336cebb1abafa661c4b579c652caca2c914d45a6f41a47168d1d2acd3c0758aec58c7ef5c50556b70568e7a31920e5e403f5f3a92259a1332e87eb6d867f18c881f1861df5d3ef25e8d7d29297f8d8f5f333efd92cf9fb37f3100a0bf77ba7a2ecf91fa4cb1e0b7ef46e9c37582f679f1bf5a728179fcdd23a3aaada05a75107c4e24e13a31e3d884733e171b1c5bab8b4507d18322a330910473def769bab0f87ac0ffec28bf2b8b6953f67ed8962a79d78d4ab3a02a65f0aaf75e9cc22f7ce97fa91851dd02ca23a7b7b93bb3dc53d21d479aeea7607c8d6f3a3b80452164488a586cc6b88f031edaa2496ec17b6d7d06f779cec75a9de8a3bde3f7edbcb9f503a9d7f1fcb7202a6479a78f8357741756615e1b55e501fb9c7008371681f1c83bb4535e2b546ca2a84bdd04060cd0a4338f40d14874818f226f0df18e8fbdde981cdd6e49bc9998cb167da6c9376c369463b4a57f58d8b279154aa9e192094f520b4ac5af3d15b4bf0c03a0ca51b5d171d5f56bfff48fed8e9b87721002eb3eb3aee696c6a833e50c1b4e81f35e6de1ce5779aaad99d06a965bc46baaf80dfdcab49b4993590bf1894f2939eeef27d8c0f76991b3f523325d62d6fa35ef6b8fc6813d7276be164106faf1d27a7e3e319cb9ba5ead5e23fe1350a294a13afe15d3d23c88e68f40f0e39e4b5820d74260a1d40c1498923892eb5236ad410e88839182a0af01734310db28fb96c444e386baf2d04f2175ec2fa52d8c9cb3874d3660f670dd92a392a8419791b4fc7482e3674d705e26dca27d5ddafb0452dfd9d1e1fe337c5f70cce2ec99a1092ae326016732726bf172f1a627c9e0339e692579fbadb9f36e1e1b74e4a059aa91ec7e8f1211a623e1bc2096d19583336915176ab5e07f9e58a578e65fe72a5c1cb2eada5ae00b1b4214ed28815339042ea650e6f3420d798cf9c0dfdca711e3239f39ed66d8e52da2347c592d66ba2a007b5121ddb51956d184c41f16d0800d4c7ceb397566c19ff3613eaec815473b9d3084f8dea54e598402aea8af6cf1a984ac6c02e7c3117489d11f459bba9fcd400a66230f778441fed017439d5d96b0b09c470c226d44fec208ac8951c9ec1433b831915f48be797ec69928bde378a3a2c721cca75cc21982e635a21c914e46704786ccd849adf257eeb48e21b7292dafea117a2df32bf396cfda5b49857a1e9938755201045abef96e72db6851fd5d7501b935ccf62bdb6312185afd0f6d21b5a8944ec459fc315ce282957274d61d72913abd83705adc579e185e947c2ecf41672f5340094ffbb91f2ef7d977d86851a73a62fd69fba084ea3fbc79ead9dc6d8f3c3356f0058e96671fb8ade01391ec05410f0a881080b0afb740c7e9fa7b0300000000000000000000000000000000000000000000000000000000000000000000000000fdc025c997e454bb561481e16c278b1ff2a04821023d5c37827e547cd7f5ffe4abf00059652b0600051e31e68bf61924cfa3e1e1046a7d5cf7e7e1682a2c23bd489daef2e342ef295e6a314468792e6bb90575696c7ec9e7938efcd0fb820a7c56ef8e074b460486c0345e55b7679cf565230b832b8cb03be0068f5e45ee081e827134858573a439a647303552f6921c8bf2c64cddb20d64ebf37992365997f40c4a167ec5790b38d18982ae4baf1d847a55122276ce0948d7da6d3dccc49296b784035f0d345fa00677ffd0bfcfb8f8fd11163482fba3142367d18b012b46abbd2608f8d8ea3e2ac76b485da5e0f174c83985f4d26fcd9a4abbfaadd877896899539230b63611e85c473e290858b03d773a68dcbbdca6c24715ffaf8b6a0b37597a913d7fd77539daaf63bfe75b6c59fc0c779aceabef956936147c7a69e0b704f28a58c63c5a40cfc97af65c28968dbdffef5944d9a0386c2669d926cb53412b24bda81a2a257baa693db99e8cdbaeb31d7cb9ee1976b7af34719c035846471e582d0329fdadbf63ef4a8bea1d539ae5c7eeedcdeb4e001321aeb0827e3e4ad124aac98056696deb6a1e227a8e13acf5a6d346f1ef1d1f8fe02d71fc7f9448741e3b9d80d2c625c7a2edb6947d96a298b53551bc39e5a56c3858fdf3c4e903e9f3b949a7280098ffbe2c282b6a8cab84472005c5f56eed501ed541be420b88dde9bdc4ab11d4c63c8b985505b44b0f7b5d697ff4043284321839dfaef62be94fa60becffeec4049ac871fe5c5a98a2733719c917cf21fd1c975771819e4519a39322c65f13ed0599d47c6d26fcd6221d389850ac6921607770089eafda88b395022cfcfcf77c755887142473a836246d0ae4f994933b5a2890fc0dea6aebe81e5a9368da69e951dbb66169858ab0e06abf5e8144a78a3d47941459244c9b458ce70763be692a4d41bd854f74809c990f6bf72690be139993bb80e8d30299ebfb18918d2e6df88627b22fc4554e8ac8ea56c1d5d8780ea843e4bd4c4d249e1d029d958346203904d2a2f88a1082729935ba883976a912b60734aab4798c89d54df68fc664adcbb88063913673d5991e98e8b862615f1d5148b9fb2eb9dd673376d99c6439db2cfe67905b0bd144e04924e85476e04ccfce6d2abc93ebb952235b9ba06a905bcc34d646718b133feacdfda3d85e1cfcd589a6163ee47771d59cfd7dbfaeaaf2c804fe1250d1975d3eebb601e963b5a825a4c2b4424bfe5820dc300dbf59a271ac8242d64247294c31939fa14d3b6a057fdf0bb165814996be3c5f46966528abbda5770d26adedef305a5df55c682baf05a560f99038795ec7c89ac911b29392862b9e35fba47d4e33349f88f6038d93b46d618103bd46ab47ab3e6a84b8abd13be3813c838a0d1492d379ef75a2d9069290c55a76772fc983d4300bb1e674d3efbb3247daf9221a61e9ede0d5b1ccf83e4af49bc12f08579a9fd21431c9fd36041b0c8201584e616808ad563a7d97537009817e0561da2db47a514218c5dacb9c1ef734948de91d8ac8375d5f66bb8b477def099fc5aa1c335d2c9eb1307119b7a6fb28bac5011db959911441492a49bedbde240245df95140d32dd8f892db2d4d670c9f2c991ce96e3f706e54b609fd6b79f302214c4410a4b6158a9d807c3a3e0dc404bd595d7c4652c2f8e816ee3d1ae81837777fa697be7d10c9eea2ce84191c6621d8adbe86bed10dd6674371b42ae32d4b9cb431066c13b963522450791279a84c1c6d49dde3bc084d489cd0cec46d0298c5421877077e76e33eee9bca914d45e1533df6dccaad397585d9ca7f9b1288a700cbaedc8e630f29a74c0f33394ce6389604f1cf00fab2742bc43c8095c7ef34a63f84e578d8916119af796810a984e94b9ac3804039b08da3133e6f31bf470b3c5cbfb1a63687db2ebd6b4e7caa0aae3502749a51b7063b6172889202ba6d5845bb7f11edabe1bbab07b88c30124caab8812f475fd3132144585a21b80ebe3e319e252b64c025d12f7561a29844a75274ee4c98a442c5a203f6f2843e67c277f6c82abfeb903c59385da18196c104832a61fa087e93659c6259a426d83007fb322338b60a37889b652e4bc40dc52febcb141e472498288c159595101d47b62c6466ad28738c6ee155b8ba5c9024473aa675cfc7051835acd6706d16b16fc25b26ba1375055ea3b1471cda37db27f4505a8fbadd0f46506639ad056cd830f83309114e167ecabecbd848a66711d6fc2eed804e8fb4e54120540fdf37e592841a7be76b57c6785478bc6a7eac159f92561c97993c54063664d2eaf0f469b19185989776eaa20b637b4ae99bdb0a134bfe0f5075cff6202d35a819dd0e53b540c090e7ddd0ebf1d4ba00fa00b84beed4044de2853896153251c435cb3a3ea410265ca1c27bd5f1fde0de1848a7d59d9e728502bce2f276af40b9eecb9d008103d74723ebec160ba5c18d7a9d8a938d72778a2c9dd5e3dec185cd8a834f433739ae2d78725408fd1a02a37a9b03ecea0612537cb081f7e0e8e96143f0e4cfe8bdc6d411df4db31d23495e0601ef27ba40953b14662e38d486ba4fa1f150cfdc54f4a4ca711c52936d79fd5b15d05feeb9dafb2e9a4ec691d99aed94b11b54cb2b01dc2618109da4cfabbf743a652c3b2869807d7561a06d38dc7e435e52c0bff04fa194160a09d57f13b568a75f5585aae9d4db0bf716bfc4d28b424e71064381a2483e89f26b705313847759e150837d44d1513b1c70d45d7b6da5c0a2ce29138eaccccfc8d04471294d18bfd9135d8f84cc40f5f094b2961229b3cb3820d596b5c83cd3577fe646bb9c7da61b657cb9b2000e46ad4c55514c6c7b6fa02712ad4de6ea9ba67cee287b397aa42a5b999aae3a5870d2acdfb13515c4b61c36873d3bcf897b58929d9f0b97377836be800fb09742ddd34c8dc5f22aeb09006cdbcb37b5260cd233f28e8b54c8b1dd455c8ed7c70507d9794915d4e1714e44122789761945d39488cc33dbdd9b25a0952c7f60f3a2e1dc00cbf7181cde084b66cc71a169d16b78cfd379287caf796876d57616a35aab6e9f7f0c5e34f4138b1a2a2b95cecaaf63d4b85183bf2f7bc1d46cfc527833733db0428c6fc388a424dc9fff34dad1be04cc11d568e5ce14e78f91c4fd82594d4dab793caf4e4efe14918347a4a40b9fdbe9c8b530f46f7e073c32420d37a515a2e5f6956ebeb2bd45fc132c5c61896b2ddbc1db42387858b62c0ac42e9e79b3b69079d22c09d8bb747b40341b7cbaa5262d38e489776123e035cef6ee7d85c88cf8062330a6fb8cb37e8e147b554b1b90b79052eb80fb7b99f783753e9ae0bf8c99edd11ba3dde3d626686c4bc4ef0c889becdbaad0b35250d15cca71dee858b79cdefb0544ea94ec8d6c8120405f8e956d65398090ab1b67110ae077d9017abb1bc189e3c2d7643485b5f60991bf4e57ada6d080ee45ef4fe72d733368b5acb16c924f5147fa4e217ad6952a4da3b9535f131480e36620007d3050eb20b4c94a080c0a6876356d6261e9cf8590c627962b5d2610ee7fc64469755e7f393645262bdbb7753551f900e0d44dc6d7c0fe7053a80bc108ef3b3507c9120fb73b3b5c78e0c2ed2fa3191dd9bb10986bfb06393dcc3b20b2cfe59a88914bb92fc7e747a7a503d4a149cb81a773fb1359a27778ab924b02d72da4dd83b072efeefaf2daddf8eafc79be7589899d3907961d1e76d25a3e40cc26d3a8f5d68a3f4cc2de54b880ae95d8cf4befb83729f83e57855e9b5848a33d173b69a9068894c7a66f46760acbfbde268d09bcecfe8023288a1e7cebd4f182b3aa545189fbc89d177ef8aa26be458eddacd65a5de06522c85150a5a476a0caa26ec0e750679fca0c013091d7b65f67cd64372746ae00aa29edd24db04dc047a3744cf3965a05c4c944a99da1da4c31d00d62215002bfa932b4c55483f842c2a71f20f31b9cea7f0c756c1b5a0ae15198b045f0769e5cf895f9c78c35d82145cfcdb3ffe625cfc293361fc1edbc89dd97c2ee4d53a56c48df894b5526d6012b8aeb1fa333bb9da22f93afad3194bc7b76d026cd7412e4bb47a90bd1c3aab232797e9f86c8180684b382949874c73101c4ec7d774eec3662f14a9474cf7a81bdb257ddde95e2f2de9512c4c3d00073af6388166a56bb275c757e9f6057b271282304b133ffa5313a6b39f802e6a5e8a86e41d36dee88aee6a01649bb0d1d703a0077919aa42c951177aa2cfe0ae1db6b719070b3de0e587c73753f0cfc51a3ef444286cc799a803f054a7e86098ec5e5a3bc80ea4f9e27aad76fa4b2b8b102f90e03b2fd0659b8bcc5901cf1bcce59aeadff0b170639df0cb8ec90f70baa31795559dba6dd69337dcbba83f3fae9b71cc4cdf3e28739998290d78f25d7ad512174618e769f71da13821fa3c8c119fe4851e888bd991aaf9e6e37df5e23c17295c6d3019382b43b187a4788bd121ccd5626ac3f01952dcdda1a1aa1d22ff7932863021f081ec21b6e0693a198f70640eb125b14e145485d6d900ce44ec9f400e98d3b00e27a75db98a83eec1816c2fc5cf1e462f862fd11a9ed648dfc831b505422f5fd9779bf340b4b1b13790c064dc0d3371e3b2518e05920090c67b03223f9579c74f1baf659fc2caee92d019673190f8353a9b8c1987cb3207a3fbf0df3f2c260076a13a3d9231c8acb5ea3fe50a4f968c739f5a34ab5d8162711f07f70d6528472353b6aee56b4d93c59b04642ba69505029c944b67b4b9ff2603c89306b045ff9c9e8511177727ddf8f2255de20095f709095305e1a4df650b7804be1234a9d56abb31839efdcb0644e2b75489c71b8eb00704f0a04a3f7714c9987a3a45c4fed34ee052f6a9e52ee1cbdaa299399973dc38481de9900546615dcc98349be898df6c6bd1d37940566eb1663a43912504ec8285de74af54fb4c29aca53461eaba2845bfe172623749c728121aa3ad1f5114cfd4f02408d0f57d34c2f31d1ff1f1a2e2bfef743d13ea0f8683e73b74bd72e63281033f4fb8046099cfa93b76efddec6509eff2aecd3e73e74120fb91bcb73ad19d5ae10474cf8a72554c240e2ddfb5c52fb19181b44a069b06ac7c166497515b28dfa8a47b1caf10ad932e963fe9a46f285a0426f4443889f2507e33510dcbd292a3fe66bc2558bf1e1e029fb80c713de75616a76052c658fb4da09baadf914ffbdaa1a65a2af0e4d62e2cdf8d97b30f4b0a9f32762b024e25930363668a753702a0128613171d09bb382037625ab44235d466630b350831ef22b453bf5c7764c58038c15b0e2204f1170afe1ba4e4dc865102c8b1c0e50e38194bda5dfb052e710791185a6660ff6c81032e3924218094eb390d4b2ca8e7b58349796a439f3599e191656845e74993ef1d48ba34d1fefa37ee4d90baadac4eaf983351aaf10fff6366c8b3f2df09375e35f50b08396d95d479baed3f72ffdc27959c6659340d441e2c76087c4a3bcecd03d118431f1d8b6d6cce7a9918d0cf200de24384ba79e66115f1cd542c71955a2fbd47951a543fb673ced09a4543292edfc3edd92eb5f5541b85b0bf64d987433d7b3cd98607b5d6095566319a808d6f279350598493e80fd6d78694596c2a763dfbd0d8d1a5104a278167bab42cecbe353dda3787c825a162eb6994d9449af011d8f72946335988316c087263975e95e18989c139a008535ac3d2d49ec55eab0c3fea05374c784ccfa6ce74559b4c2401c468c0e80a53bb9bbccd05faeec40e3da49501df22d6074429adc83fe9e5ce2713d951cd03cb58cb715a5af42572f43b7ef35b73323fec09cf28c29e20628fa6c59ffc6836c389d792b92b81f7aa6d185b9059a08d2841974142ebeb0a7d5459ea26f068432d40a635ae5c87b98f9808bb42c49836389afcd483ffa9f921d9413ff6f664b7363308c60079859101f612e20c3ad0e3a6482fd2079af1a247afd0a04d249c63ed6c9eb7fa804401eeea21bb0995410d8229d0cc77e949348028c8fa77026b430a6e33faa5f4bc78275f18eed40a10e5c6bb0a6823d909358cc0197c814be53b588913be7343d9549e1c12c22afc358b189c18098b2899b82c70d7bf100a9adfc44e2bfac7fe2d6621e6367b3dea7c8d8e13fcf3438d58a54314af1183b3da36cdce2c5ec2c05ebcfe2e0b72f6016ce2c77bd2db164e81d75f550550569651c583ed09136dbb68d043fd38be5089c92e7a3e97189d8807049710c22935a78f71e207a9e8ca05d97d47b423f2b62d09c398604eae1e9070155b718fb1b180cc98b6207f2e45d00d073d30150e6ed0ce728bf06ef4e281900c50e09f48467531c25419e5d72388227c0b1e0e50763c95269e503fa08dec77a0f7396d692f5657a1c4ec031d806a62ea4d633c48afcb78de87e209849f8c7d681c65ec3304e39af4337f09f8221b9073b2b33eb5f87ca4b671a6ab54227d0e95c19618f6155ff815f7da53b9846eaea3827f1f09761b6568367ab26158314f7df386bf1f2cdb0827dd78bd29f3a303167b2928b4f6d3332fabf035a5ef681dc805379b1d28165e2128dc1475bbd7bf951ccd22378676b51851916358c4beea72e2c6dfb409651b5831b11a8484c7ad63caf919d41b12d22420e92b8309e51226437a004312801bd2831da80bc3bd4e664f3e338fac8e7b48e903d4d9ce98ed6b086cab31aa1b01f9e006a7cb0d8bc1b48d8c0020a89c3c3c1323101e4687897da358c606016c7913fc837457fd77846d412c0a32d8b1e9ddf78c654dfe8a193e7092159cfda85e078ef2323c1e6ece8d8ac12b3fd1a510ef3e6e08090af342d3178aad6f36f854bac190b04fdc8cf5659f3703fb57dafe001eec8321a6e70d3aa912eb2e57de7029ae1a00d43d49d959367f2a21bc20af608d0a04fbb5040d8f585402117295fddad3c1cc9d79fab8b3d11f3d95e54000ce5565009fb1d1347e037c6b8ed41bc6438e81ea2bdcdaae49436610adf48c2e7ed85028feff0391af6365eeb9b165a054bc21cab7cfd135f4fe0c0a32482a956145e6b91f3364fda7013d9e6d082ac1eaa1c5fa18876f826eb91622ee1b1f5b54566b66c314fc687de0549546e31519bd35c56a9d9b2be5e3011c3a76583460f410d39d3b828cc7376adb3a33c4bd5df7d58644ad71f331544c332bb0562b480ef608e052bf1a528a89a6cc96c75bf8d67d4bc669861a4d4d1b0133f83f16494e02edd1945b2f077e50f4b52dbd0066324c2cd3b15a2cc2d6f60c034c6be70f81f1470d9635aaa08e879fc84b4634a8b4e2cbf52cc3a61a66d5c721ddf652fc81f434cc4f45b7a74480346490904156f2d2f44033511662abdc2b03c99e092c649dd2cf89dd42db5286d01b2d3dbdc5546784c7d4d3515656143b299573256b97daac0217e696d65ad6bc11c2ac156d63e64e5d6f5be537af4f563bfa5242e5311f2afcf5521837520d0591b63d0ebe2ba541afa138c2888df3521fcd766c31bd7e9866cdebe36943b0c0392f6c97863ce932734020b9310dfe2a09a0b2a1ee3c745d3de513d7ac4795a0d1f99239075c8cb464905374931ac87c330af7b0e44908e40f94be523f5151acb85fbe8575cfa6b890c97c82bdfd9993225d15a9590e4aeb4d3ba8a2c22cdc7170aecfe9fa1d1845cd36ad7ee21000dd39a24a2c4c4c77168767362a96de525b4a601ff40b64efe2bfb3e98abfc193f72bf2691bd3cee6148024cebb4c6b0ddbff488e15b4f3cda8e2a3f1592ff817e2199bb7e80b1817b34753d159d1f607ee53f8757a5fcfbcf8d3288e4172a89875220ed8de0c667e037ad7a804a3af980b3ce74a219e5148400460f850e4e8947d1a52131ce1757d3084abd93d73cc5530601344ab990bbf0df52d797e6be537b02ea810cb79b28ab65c2da9e89f3e9b59f2f6ded0b5141010d329cd9317bc07a215a6160a2c366b9bdc41da5a2413fc818b267e988f4cfd2e68a415a61c0385aa2bd3d03835ba7e875813c35d6cc8e65b71e6f467f2d1eb22409d10567045c1600a5585588355163d974e8a12b066a1294f9fb83bbe5664ef5ffdfec6d99fc29e1a591f2e3e7a7805eaa9db255124f1b02f195866eb82452b560d3035bfd77e033a40210a34a5d0b8839748ab10429ffbfe024e36b721188cfcda8292c4e6922228dd14475643e9634e8139d86ed65a3284fc32d0df849589eee02b6d4f794209199955851cfcc552819e217bb3a330e16871cc3cb0e34ff4aef5a4b025bdd24035b6081df174bdf2394e8dc1908791a455766233e16d43193f07ef2f30f0f5ff2ed0b69cfbf97aa8ac68f550cdc7ae1526be4ebacbaad40d85fa3ce56cba3b980ee30812991ed4df704ed75bbf4d4d114b7d65669f58639a481c0d6f3f6fff5229ae7ed166a49753b054baf15b744b75633b05d93a64bb113e3bdcdb5a61f235327027f2515f2451a2eecdeb6a7e506b971807477549d3f7759085e8a6a414e034c838a1c3548304cdbfea33e09e8ac1ea859007556be89a9c04ad16004a747d3d2c61a5f39fb2d60430bf8c4a79ccc0a22fe9a1eec8a639d77286660bfa9f031befd78b1be15ef8b8bcb48fe1c7002c98e77a66c744807b7dc0dbed326b3aaf0125273ab1eb2f4e49b78f7616ca57cf8faa02a041716b916b79c516092ac0751cf0680e855b96fa2670aef7f39f6c249a7e397a308252a3edd45f0312e57aa738832f466738a0115a6e3247ec8acdb78fcd81c64a6128ed16c324e27a198c210765f53fdbfa923142c506658d703076e28a21329da3558b817a5af1ed69186e30257285c5724da4e60a67538dfd9682854d89962053458fa05178a070bf92a103933cab011c3d407e10f6449d80f3cc6b062c235be55da86ed783a7870baec50080322d961afc35f35fd1e93e8e477ab476043f8023cae827b5099a42633ca80d5c1ef1cdd3fa30e25fda7ab3d2c11856df2ea75db5c1a1b43419bafe6a80091fcfd13396daedefc55a065919f9daeff4a6effea22947c6b0d90edcfda157b122204ce9e45de54098e15013aee0ba9a866d3468b67ee006ed7eed754a4a549b1c68552682cf2ab302b5c16c26aa00d4ea96468f7c3b073cbe0cd9bc11339e092599caf2d6c49c8b1fc35fb42468c69e50680a3bdaf14f082b4c0c026943b4eb07770fc5c03dc01392e5b92f4131c27e131e5ef866d8b4135f87727e425b8add2bfd1687833a6c9b937f81eb8737730a6bb18c136b7cff8893fc9cdd4bdf81f114c887ed2f87d26f844fde04e64278d2ceb4d5b9a55af5244672d457e126f1293cef7d2f616a86efff6c70c3d16e800771d6ae298ee9b85f6b8ac2accd04c8151b0c60c02f37f1719d9efb75eff6d97922063790437db066d56dc37a3bb42cd937c6bde2c491d44cd92f73fcaf577a049cfcabefbf4767a84126a021a73730221571723d814213e74385b1741a24c5c5d5d8fed93b77ba1f5e7507c5139fe57731133a5bfa4a2dbf4450b86681688ae48db97d812a1464a5e5c475a24cdbcd662d0e84c10e68a1b1de5d19fadb11b9228b5222a2cf30951a228fe2f636ff6fdb0827838f89b9a7dead617f818a41f6fe894648298204fcb175e212f84cde0052183a4959886bece93b834ad1fd37710815aab6c7be3e511c29d26556a488fa7a2c157b94dfc08349d7ba786807ed6d4e60183c3d96b2c3fd6fd08eee07092ce7265ddd0d782dce2e62b1b4ec311c669534ea875d6f6e35e597a3dda561d3c5d528942ce5fcdc901d8d792d241a024d410cd7e78403e5539dee654214f1be59262b3b14877feeebabc6f48f341483e5e53a7da5e569567757dd0a74a1276e69a11ffead36af4237e862abfa5db2458f1cf2392a5cee6fe01c7218281d86a8dacd3717373812ca494bae58746ad7a38abfaf19665abb388184a8a035193e4246491578ed7fe85a7ce1a0d28c8e009c47f26db05b7d168bc3b71ea9b61e866cba1120c5a845022d8d043498a2e346367eb903edf2f562097b7c174c35f1071c8bab2c540157d62ac7fb63051dbde7a9852ae051d513bc788cc6cb373c2fa47b7b6010e90ae959783a4162fd595649ddcbff886d3244062e1131a062cb52f60dfcb83a43b875c6602d7573242ed538128ca67f7ffab3638e354d638873734372863118ba14c5d7f581d4ab794720d3e639b80d08e803e0364b8218f86cce839f3a062c02f49e949e2bd27a7d95add7d503d547045d9a56627151bf3c032e9c63b6840c4f847eab6ba4b986cbf1be4c32e111f7debdf403c1994c12083e8cfba4b5c93e015b3fa9712f17909fc32d26c2054f525c254c56498ab391e7354ec2efae4537342cda8e9c194a2aa6bb3c809ca7e56b3554b0ba86e9f74ffbc68caf4e4fba3bd5c80c3f09cca605151c807c44ac7e7b1b77a4a3a8648498ef73344a3d5c5c1cc48ca30eb8de9cc647ad98789234e74a821897d1da1264c5c6cca8ec092d372da199e1e8be3736216871fa94c9e3368c89d0a6319259f41ca7d023788b02f236567af3b7be1b727b022b16195f8d59ef8480334a4b558e7cd271511d21e37732c7713d40a20c080096bba11aec28a4ced2115ff525433a4058eb04ff1951df2c414b803cc7eac5b02e4da9c2c8b595d79d038f524d636481187e3a95342740371561cd4cb0676a74304bebaedd295d8ce13413415fbd54f313c84b60ba75781eb632abe54084a9ea72384b2fcd553ccf3e2dc6a55c738a7967522bb82334930b7e3910e85b03aebdecc12f72f95f0adb252845341f24e1b0be334b4a56f96b3942bb551465f96912fd9a55960ef17ba812baa445596016fa6f06ebbe1fdb0330d695c8d57aa8b4db3b3bfc1c33a69abffc3b431b1671317930e25b53cefe8e359bc5bde5bfd73a592b552b6852ccbc801a6749ced3862c81d7f1c074acc96d325928e45548097206f5607e3b69fae60d373ad100686b03be10bc79bbe766e736c71e37187772adf4271a02a6a27f051dec9fe40e86dba8d58c0ee2885fb4622f80b3de9549a81aaa531e642685fbca2e102eb873def5a19773784341b53d393bb1a1b5808979a221abd62c23cc3eb1541f6ca1fbf61fad0906fccc6c7cac820bdad173f10c168dedd493428f8aa6df8502c09a39205b7c0e68a05a9e7cf06232843768f3c44c6ae07ee5176ddf7122c8a5188b2ca46f3e4263dcc5930949581a7e83d3f60d2efd13a0918e6769588bec206dc3f2d71ac813f465ffb5c71965173700c04094c36128f57a68b967ec2c0c717984eb82219f9b7289337992ae95133f5a25b941b9775884b5537258639baae508d8830a078e1d92df50f359a26e25de16a6d35a515bc0a60fc75225ac638e0b5e8bf53a0af9519d0325f42978d7258c9123f6a36ed7074e985b5bee15cf9e718f8ea060f556a029f4295349faf503fb7c41e55955b01dd7278421d69e607297b212ea37680e984b876ad7e16ce235beb36a216b9e7d85c1b37062267e85dfb0c7f18e953b231046d093368f4da33ec5e08805c2fbe1538b4a39c9dc0af879c782107153b3819b7818f4dfbe11a311eda886cafab3fd373579d8678d334dc9945135d9883e92cff6c3d1d372425233ab0fea2fc9f49fb10e4ff78706da181bbff09d15cadf546d32ee4ab0e1da3a1f0fbda4d50eaea18a9fca81871710da01ca3612690decff39d6b5f96b518f7c15c10a46bb594cecee0370ab6e6fd98cbfd1c638f9be45d8e392d4bd0fc2c19d173837be196e2eadc7948158561be0e05364c0dff6548d9378908d9bf7a35fa8122b53f71d3d9906dd51de4473c6324bf9752e27d73418bb4cf3a038d912e2be3d06f571af70191579bc63e963ab1bd3c0f5ca37ac5855738a3b1d3712c7a8d83b070ac45dad5047105a1dc1caba30d7a3ab65f535e6dfede67d6de60b0216ba3a655199a3265b3ddc2cd2b6c41abb8740944db436e31d09a076197711b4b83c27867a79033b89a10a3c848dd027cc9701d6005db6ea33125e61a05642e70160376dfcfa4582521630e10266bd16223607b41b9fded99cc418d7db097b92274e24d3da3f001cbb9d20bf0fe0b65931fad7e0e582af25c4201bf186a5c92638bc0efa7fb56345adfbd86af4557a8eff4cc8268f306c0cdb573b6b74bef964b82513560e47a2cb9f3096adf046127efeaedec3ae4f332a9cf013c45318422f0d050e9cb57d48ae9686277bafe86391c7335b5938f4294f69533ce8e46ec55a6ecf01664f866ada91f6be2fcd76c9106d4b3547d16dcae9da92b0de3cba070602fc32efbf619f8d408e1f7cdaf8ae7c82fb92f8f480a818ef525c61cde558d10b370cbd17bbcccb2ef9dcfdcb27d5f9dbe0eff56b2b7f9683c027f2162845d583e41b2f3b68a0253506c34077ff05d742206bc55f82d0bda74d506b03622ab4e27e1c7a46ee3255b7c2b9a03ed5864da3529ebd2918555ed69480873523c9d11dc92dea332fc8d5b173e2d4fb208e04c1712fca0de7a3d811512fb1e94888087a002088ac75ab9c9521ea6332e39e6b5cff9849b7dffefeff872841f24d27550f7d10935ccea4bf675e2eb912487551401c4b361116152e870a647146ea2a4c6623151fd2ee1c71608bc69ace1c179191f8ee399e6fc7e8ad0ba267de38ab16178918bfe5a26bae64a57efc6c00444be7e36407bc3059dec50c809d426610812de685714a496345ab87244fab0554f68e13428b0384d20f912f371f110a44cdd863bb2c4110fbcf56eb34f182e22b450fa92ea9d02d122ab6f4cb64b084db6419782e657c5580fd7531b196f70153549efc666cd0a20d9d0380603dab92e68fbe5e27d2ff350ac63dbcb5e9211ff005e7a9c9640e469be33a23a226a93f6805e7c7aba3ee686f95938b17a63f307c96db489b6cb6ba3d2a24b23d6bc252a07d497208d4ff2ba9f0bd991a8f55b621cc7db7aeb39697f300272113431a6e8e930184ac07dfa68ecb907227d241cb4b45933b202cdbfaf70414cfa5c7e4d803e605ba89321f19e29270ffa1be7374729afd311478acaa58c4f8816d964eaac526b89bb2bae5fecb68ef579182138eca328ff62360fbf3a2a62fa38ab86743bbbd81e3896572e55a73ec0338c29a3780af7173a54c2949cbc19dc58c88c2414b63011f98b8e036a9359aa117cdaae44076e88331521b820dfea78c77fbb0f1012efd0c8e98ce8e5a6d0361bf65f826e8a076d2a5c7177378e7b07dfeb5411a2f5576151e57276d6ff0c9015e0fde3c20078c32535ffcd2fd1aae9099d0de18226c16d6904c55cc0a3905a43e001c0beae62f0900fb9b23922506ced4dd9ab166d8347632193711de51bc190333bdd3131514127ecd60cf9a66ef541e6770a43c0cbb913989e21fc56961e42279a8886ee11629093877e95fc0e93e932ccb6c6a71c6c3076c9026dc1dd7732b9dad5625078b824c041324ee2425d60c8a2de0fe9b9bf598770977c066abdc20d7756f7a0b72b8bddd5dbcee09335c70245978760f1ef29f0d27445c00436fc96591ad14b78d527564140b56b21418dbb72ef1f7cca1c537297b3ce3c44826dc12141e6fd3cc42d4b63c7cc65706b892244ce52f8464d826bb838539306cef01f2d26bfe22e70dae455eb774f64b3e0b451594a53071be1d0100ce5549fa356d3126da860e23f91ab2ea5af9078e7e032ebb441fcedb5823441054756edee35bac7cecbb9c7c8c901bc44ce71fd380ecea7d6443bf551c9df3390100c6cace0a3736db223a5a027da742d12f0ac1521a07887f0bc49679471abb6f04fcb7dbcb273ff2c0aece3ab12cc821a75213a65b68baf0d45ad87d342239633d0100ed3de17e44fb9505804308a8c60f66d271ec8ffbd4d7ef9aa51f441d4dcd9518cc547d0ee36b17be605ac6a2c2d42df5c5ee689290a5a68d2d636c2bc5feda340a0000000000000001004426e6587662b928ecd4e831bdbb8d80e7311d237cbe38d48c2f82eb017058a9bb25978200a1eca376c9400231f1873c63b4c9ba3fe43c8d202435570422932c diff --git a/zebra-test/src/vectors/orchard-zsa-shielded-data-4.txt b/zebra-test/src/vectors/orchard-zsa-shielded-data-4.txt index 31f33779a97..6c341e7faef 100644 --- a/zebra-test/src/vectors/orchard-zsa-shielded-data-4.txt +++ b/zebra-test/src/vectors/orchard-zsa-shielded-data-4.txt @@ -1,2 +1 @@ -01045657a7f63b0b91b7853f04e96e4ecaa76fc32015a3882e205ff0e38c5565c41c71a8b38ae742735596adcd4a876186aab5b89ddf29c72fa3f8a10a689ec0db098eb4682e1e4e46a10d7b1ac40f7c040b42743bf9c9eeacba41c3699db1aee5a90e5a955705db832d49c84ce14e83091ff5076b5f902fdc2c84629cc99bbda01fe22ee765a73fca7a1ffb8bb32c7d3c3233942bb5c64b573fa68421a0c8cc32ac3642bf84bc270af56491f5a1933bd3eb30f41a36ea37fb0f6daf5b7eb47f729b555eb44912f2a8e33c0ebb89833cdb040665f1849b1ed716149c8455c227e7d3f909c8d01471d017f58e1b0a254878310c4923094c0388abbf814a66a898985cca42877582dd705e1d19203190848b8d9aa64f67ad49a832c49229761dfa0e87012b580f6750a16c77ab7c48b847442b245274380fd469a049411c5da871085de88fdd20d2f393bf14dda5ad2d7aefd428d8e5bf19af6e720bf1dab9b857db7bc5258eadf526876f79dbd1a0d1a95c4ca93527fd7524b3fdf8389af606ee89600c549b1d0746bb88933f66838e3297d8576aa7d1a568982568671d08811c3b4bd7173a7a227cfa4fd28d45518052a5e8e683ad79831e00b59877a66e62097892b87623468d862f5cdad08e129ea243941c935915871619fdc4cdde1b507a387efb20a653f6d6d139eadac1861757b59cb15ba6d2835e7937cb464d40fb4d5abf2c82d463f3027eabcbbc86f968d401c4870415d8cd2967eb275850128ec3b2c730f57dea7de5b9dc874357cbaeea4104e9b804dce22c11ef7a07f5f3813e405bf5f1c8e5f23e2871bf8fb283538d1b4fa8cb9911efb5e80a20d7f9b3f9db337a8b3060080f555e21d6ff43eb170683fd3e6b21e2f9396ae8183385038a050dc17effee95ddaed126301a2407ee2c90bf10f43df756f8aa87abdfc90b5c79a19fe468df2061846d4e788ea07ce4b38cc0124d69dc37144a56b174eab33d669418c127323aa9e25b17c945747da687f07402df66ac228e58e88cab652d4266660116b05550d4e6edd6741040256cbb239698a37b80f3be9dda26d726ea06bc1281fd9b0f16722b6d7f82fbfcaf79fdc087194421fd63e634796a6eeb44104f47610b3d4dce52a0d0556f018acedecb39189d10341708a95ad8e103e5ef53de85574c1c734958be9914285bbe15d17b5edf2f73deeed82be29264855efd620f321b634a381ff4c1ae4bd5f40e3913c252b8e49a2da80bc9e3d5d24dd276f60523ed758fe266b86ebf4ace3e7a6eca3cbeebfd4d620d78bcbe780839f6a55ac5269b8fae359202a8f9507dee1948b008fa13f0ca7ea637e887afa718ee94702777b1382b70da0c8574b3078cae818041fea38f16373334bc5994e6deb7ba58872017839c86ca0aafbcc4f15d3b01c3395f8ccadad20c452ea435094063ea3e580b8621536f51ee1742450b2c48bf2647a09d4babd92c2e92c89762ef4d48c9881e8d3b76e605678586f658ca06df6d533cfbac4aca93b7b76e09408686b9be1a0b61fb36c2b82e14a0202095e54017172ecdb8a2922f270fdcdab4e9e5af8aee777a5caef4f614cd6e55013fbd25282b027c17ccec2b7c676a718781e559e7c755ecb70d386245201411eb5520e9013156a02918cb299998e843d4850b5ab52cafe429e3b31f96d1cbf96e5216d4777d4aec8729aef0739e9f98a89b74b3fa58da137efaecb3cd5cd2f4e4df14a473d59e24fd1bbb1e8db8dabe2255efdeeacbe4c278645230f8b55ee65db1f187ee97f5a55fefd54a80bd99304448c8098092a4644e16a8f321365dd05bf8a0d15d19a883b43c4b540bb13bf98fe0e37f5970bfc91d31cddd34a52d27c82e0aa03f5a0c7cbd1f56d3ad38fcd8f634f62c1bd108e47613cc93309c960537672dea56dd014689ceed7167c0adff0954acb51d746087dfa5c6eca234b3918373af11559d44c766cefbb8c0f597fd397b658ae1cf7ae32096dcd2bd15f0aa9273254f0be42cd50dcb40c556712f2a3e2617755e7a9db2d1ea5115e14f2fe1651dbaf639c3f24cd32430320d15d459fe509fb64ac4714bb770d250f2b750231409c090a230fd4cb9c64464389e64c56415490fc699b85486b099628481b7540a79ab986f2a8405176a6ef4741c27feea550d7236e144c2396dde91d56d407fca11fc84134b1d18f35243ca03df9036d6ca3aa39103510bb5310e9fdea40d078bf27cfd06e64087bfccb17f5a6b03e7626e934ec6a4ebe9f38f98a256c74cca06fd93c4ceba22dd46229e89bc626dfc748df1b61a7ee95a13e2f79803272651ec52ab087af7960dbdbc0075d029b635c167f88d48e03410e88425d6581baa36982b6e5efc75f5835e3a576f22e86a1b9ceb8dbb2f1107d4764ca484f19c92ccd27288f1efcc7d33b1815b4c14f25048486d89495a496f3de3b931818b0553a4fa34b261301ccf52ceac03a9d4cd631fee99e401b1de7e8fa641568d769dfd03e44432e656d0622f335532b84f83038c07233121243010317af6e315c0f8a3b296a958bc7fae8fb74e1e27f9e3823dbe6c2aa3aa2ec9efbaee4a280b6928933e1ead6717110ccc089042f5b11a51109fbc1f1180e4ca77a2f1da176565dec82624ae3cc39aaa74fde38f81dde34396661e4cb4bacbac9a78b1dfd7c22417054876309f72204714dbc906d127851b05ddd06b48eeb7ed05d5c33fad4436c5b8d5aab1ec56c06fb7d46c3998e3c44b8bbeef9fdcf4e751736ea11ae6a79b9682553845eb38fd9f9ac6814f530916617dc82adcc374288ab19dfedce2ba4084ca4a4a180abe2289f67468d560d018ff6d4e3b5801c74c0b410ec726e1022f6d185fba9934398f1a5ca6ba4bd711c3d74b37c5b09522a7a9c590d8d740bee6fe950f5c246065ed1d949252a0aa2c31808469efebd6d1421b3dac541141064d0d7c6288ffb1ef4f1ad6bcbc797429174286849c57c77b7fd49569273cdb125a0e6d5f06ed05e8a448b36d9306fc7e3230140c185504798c822ed09f9f494759760fa1c496cb127fa625f3d6a0e470db81289d727c7bc06dba7987bc1fe1129b9d26523b5fdc4199de027731cdffa29a1b551ee479c311cb095655b6a697036fc656fab91a0d0029a7d8b581f06df3c6265ec176d02ce44638788530ea7a808f7e73e622876212364a83ccc435b7700b3d3a61412193a24502af998fc4a4b960cf662297d286b2ae23c4770ff47b3fe109ec48d3f0b4573c399eaab77638ee1c7ac0f809713715d1763fddddc6e13b713307359d68a451755872eab1b9186f8b8b9f9c51edb27659f61d74234f49e0aa76a4db752c455fc2475d93018d1ea9d2938c3b1686ede401ec607167b86766811bcaa0764f4223a6e31663ff8bc059d1ab82e56494179d04108ba27506d6da2b78a5c2527393f17d5aec3189b7c06e3c7256eae7a399e9e63efaf52445542587fa13c2d0c7c4ebbe1c8a32ab8e2f2c76fb331f1c7f2518e8876e6c4502b150e306fb8d19208d26403dcfbceb89b99d048f0e694d0cd781ae42998fd07cb041624c6c51c08c158a88b000363758527f6262a5d1c2ac88c7873d891ac52295803f93596d6926fa85f793f4dc05911ca3acdb9dc5f42289eaad9734aa3e76c4f38c39b0713f1efd810c0ba4ca48054b4394aa363429f316259f33d652e05ded16bde9a53b04c7aa2697aa9be8e4b3caba62620d1693675f968ac6cf0417a721b8f28519ca84c56995a1959c36135ceb4c5bbd24935b4993a96575f70664c0eeb479cf8b1ed86fb1095b4eec2c7cb2f9f20d3300938a3b293bf46c27bab17ab0cc6b281da52e7ce393fba11079f01c2a80c194c297c321b81852d9149c67323db04b57f15a7fbb879f6153d7dd9d2e924258cce846af9ae77f90673ec23342b29c7e709b0ea00d4d1dfa4e97fcb3ab79a715d33534a0febc4f7fa84a4247980fcd9028e793e2450f0e4be47ff533f2921d724d2cd0d2ebce935b9a51ea936cd00c32b691f84af198b08962794fc7f7360f22399bf8a6e5ab99b1916dd55fdb7af1b54b7a817d6640f873182f50b18305205f23317fcaf00dc2806d0c9c804ea904f3fa8a7dc6809132223737cc8b23aa3e5a4497c13dfe6cfc1b145e4c16a4f24a7914a0a14223cf53b9665056559edb234563c3693ebd6e05224ff0e63c72c278189bdd2cda047e8c206413a032034d3826268c5501a372e1f4044296bc9bde02f385862ac1175c4d1fd649ab0787791d9ba11a792d2ebabeb531b4eb8c61e961a7fda7dde1e52830656ed14af2a41f2ee26c0d8f7649eb34ce4fe7864b7fa4a7decca73e7c2a4b12c7c90a752877333da7b324a600014a20f9eeaeb1e0302f380c97caa3f4150effdb5c854ad661798d6f094226f02deb9ed20c1d94f12097c69d76b92d1fec4a846f026839419d67815f90616be38163616cb18e2816c688ac301fd55d3260ea660371549d6c9cb63111afd3c183aa0d2533fa0467816c9d04d01f54fe5cce2f54ecb01c9be5c508b7ca75610f2ad40f26c93361ad01a488fb4ac9aeecb58e503df2f43ff6ba4e1fe5551c307dd107f32439fdae2e2c43b6a8c0e1ad20fb90392b7dbfaf7e78d2c8937877c5b0f6eae2b58a2e67e132203087094f73655fd09caf9d488a81faa049f073993a7260ecf1ef788eaf578c11fa28d4769b3f0d5bf16cc1531be532f9ac89dff1793eb5decf8b8939bea1819aef444734a7cf0ff7e4e4a4721322b6acab8b6340af1497042c442f997bf2dd37a9a602a83b912a1a2abdcf128ac937cad5c40051672df256a2d586b2bf610300000000000000000000000000000000000000000000000000000000000000000000000000fda02ec1e22a9a7b6ae8853409e7a8dab9bd384502bcec91f852080a7916fc77ed9b3706a645e8cd7718861b6a647adc3bd7ce02cba30070b8c5ef7fa168c53fbacc007dc9100b7ab16d69b58d4d5617a2949dfae7752a3afd488dbd00182163687c26a49f25b50a1155ffe0b412dcc798022118c96e34850758595ee6728a981264971e7f70ac7b77a244d4ada133b976ab472afea1048a213dffc9208a75a06f5d8ae3803ce6f867a634ded599d4b01ad464e3e1d9db35531dd41bc731affb888ba8cd213c0a85dfae04f10085027b7a5c7b986a214f7158a6ea49f149074cffee3dcfd03a791131a0286a4a2b06a2016ccec8e7c67dc7a5f3838d96e688bdf47783d135580e1742d68c89fa9de5f73a456fa39e9514be267fac1e673e222b979b19ffcda88a6e0dd8cbf300e81b324bbdcabd24f3ed81ecfd527d415132e2b8e09fc0a6bed9be2d63ae9c3b5e18f19ea303b9bfd3208b9b6af6635fe2aa3e811d91bcc4a3f522ff6705f67d1adc05beef30f37451e6c58902e40cf5dac16317aabbd40faccc6e1f7dd725ea85534974a0c7786dd7ad1e1276ec79038c5f60a90728e0934c72f1d30a363e567e842d2a323803bb20de1710765845ca006855229f10c4a4efd38990084b46bfdb2a1c91bbc2e94dad2d8e8ae0350fc05eff450ce799e547efafbe77f67ab16ffa4376eca0a1b22fc421eede9091e3914eba9d5936bc584f0f6b749a60cbe2847945eb0106a49c43531d8a7040e1f1f47e74dc8bde0ea1427b0973483b0722e41876cab360b9ba407bf7118046b859c5307af5422da3080bf5bdb226974a02d0625cb2a024a2773a0c507172e7c6cea0719d09c7d32540026a89813e4e5e2ded17e05f12a6b36fa995d6e0f604e23a14d4a8a68d6909091f34850fee64d9f4599a6307369de4cd9c79eefdc1cc9e1ec7c868a5bf3fbacb2f6ac1d68100221da6f99c00ac84f618d6b57237e83c3c4f03cd5b262d7534fee127682ca86fdc739fe4dc0ce96db2a35caac25528a75999709fbe5bc16639a20bb4dc71ffc07320d6311c180ebd91d3133681a28ec5875d8638283d75772b178e6e061f699cfaf6f954680bacf232eea3efee50c1eb9c3135aa51ea82088222fecd2e252366c6a3112b31075bb34117dd45b635f5cc9ce31acb803ac91f3500c1cfeee9ec7c3e85d34e0c41e71b546cf6448d1c458256f8f5b5745fd22bbf8ab81c4ed7d6f7308f3689864dc201b3feb748da5f021f755dcb0e49f854113166a796ce3d2c91ee2668f54ffe8739e09bbe189ceaeaadb6cdfee3bc3a4526241ae83812a3e45839245500ed82694ec79f5bd720d286b082dc3fcb913bbab28b7fffe55fa01bf70630040bbcf116ff5aa8a686e12d06d33be1bbde50504584b7f7160be802c30f4e7286e3acae65e3b20bd2cf8664797ec242c8d1ec1911542caae6dbdc41099b46f8e4f39625adb6ebcf2891e0655fd0a585938bbc8ccbdfac45c1cf51ae5ab25922f708107f2b26d994a6c58ab2024b614e481241dc30fdbb890b05fc5824717bb4635ef1473b596ebf5ccb1155480c9231d9b80729e4ce1cebe59d291f9c5b4215013425fdb4c889f307626952e3012c4e427974e483a0b2b3e77386b81f0abf11eee92bb4652deed3ce7522b94ccb485e1b3cdfc5ef7629cc3775986c006f5baa41a10842edc723da5079030be0e2960439778827026901f7c7f55794e6457d781d6bd2f64bccb0b95f86c562e6058dd7f179902141e5a03539353cea2e9f60b7c37388821e3e87d92fb8c4ede7e8568bbd2a5f7ad85284b545549489292bcd1e50431ac98be4e5268bd815a20b70989db00006cb26ee9a46eba4d47bb18f8e8c41355e85d9a417da69965617ba90b42ecb0fd647f88d85504a324856bc82858bfed6611fb044864dbec0543c28c1fb8df2844ef3bd73a31289f0b3eac9ffc007ec130d2bb0e8d00996d1edce7ba125b52d1dd3317f919ff4082a69b76b80abfd932b2e0a8705af68053420d53ed8a5b88ce3ee07cac8bbf31d4c75a312c32142be047371667d486ef6aec7e87f840b42a7be686c0f678f3d4da43c736c1a0765a012401c27c58d0c717212bb1ebbd9ee2292976bc7d02eb1abdded2ff6740e0cc4a38701ac7ef45da612d01e67ea5b072210f256ddf5b8fe594dd78f21afcf4bbf20ba81df68698110e371b5c79597dc6c76f66c9dbe841a13278248426ddd8865ff44db1efce92f379447d4797f2aadcac719ad86a5353c1567e1dbe7e77a02e94525eb49bc47bc6f7755f7b813c917f788085543e39c2639b349734120f7b39ca231a5687ee4f89462711cf09cd4048871fa17208cbd6bfe166919321a4fb5cf7f84a3426424c174938e97d8b5cb171836acfdec2f9c4a13047fb43585d6fb5a0c7beb4c81516ef2eea347671036e2e17c41addb67a3a7ee4a53eb7f4b4c7a9051133c63a8d8866e4bd539827bbfa65e54f99f2e03964bd5d474e1abd2708c22f73b19060569cae8065540f7b2e42af82bd7d9e0d92b69cf9e0679fbd93321b738c93f826e0d86ab6b8212a768b060dd72b95bd82f358989d416cd27bef6244c3798ee25e54bc5f2db1988114a7295bd2c9a3d1b75253074631cb01d653912bb9013d07380e0cb88a47c0c6b1ac0188a788092c66a33716d874b51460ba7801d1ab1f9af8076db5a2f43351d30fb39ba580243cc9b0714d5beb46a70b7e8d6a16ed00e234cff498096a6d57f4e17c0fd4940b6a08a2563bdc06bb6fc489960099372265de1cd57dc0e64d9f0e7e3d877234fabfc87a075bdbe47c51683d046c31617fd090ade8438a686cc2860cb0773fbdf8018ec89c3a67053231c0f7313f9705db54215725c5197e6f79dc73f0ddf58dcefcf4b27e9d1018b6842621d4906e545cd03f68b4a073410bb10390ea252bb31c5456a017c16c19398e9d60ed072758f72b97683af005f8502e9cceeebf989cba68906b1a3bddb024daa4348407f1723a16d5945bc9c829a0ef637a881fd87f35ddb8225b85672b3373460e35a405a23024462cac383a1c4549eba95b88902a91dedc6056d69b15473a16b20283e5f9bcb8f6b739896c4bdd4f2cb4f9cc084795b5f8204952fed1f37dd18758723f6516839912b8556f420d4e403bbaa55d7e96ca0e72f4b827da366d4436e6cd674b60ec9b9554c71285a408a244a903e4efc4ae345bfb43922f1cdcf34a411e995901c1113dd8c2e7ab0150ccd3ed1ad45d5e4f347bf2a9e5a838d00ef74f929bb1cec67c20b785399153b99fbef3ebc4c4dba3c48ab61088fddacf078d4563bbe40b0dd68d03c41022001d072265826b45dab649e2b8641795dcfaf6c37d82b3f470b824e3f23772d7fe123c4a409e0366a43f6a89871590196a012a1de65ddbc6956a543f32264fa0332369bc856fda3105980fb835bb6040033c3b596e771f6e214f9d367733b84c4877a762e3bf47efc3689131c735dba5fe5d22d8f75898a67bf7b90ecdfa938447ba1241bcaf76fce84f3173fcc6a31a72e108de1cb2e14f03a78a1afb036c1041fb4b24a4b8d8ac99584fb37a58d2dcf3b328efb90815eb850c12f576186adcd23aaf7112c6e49d6e70c85309b3aecc15ee24a53a74083017a165a503ba5fe99fc58e6dd9c9d4b99eb5722176fb8ade041dc15588713f9d9ad861bb3291e394dc18c0b75599da9194484df9fc8dd94901133d23c4aacb74c937c549ecb189fccf99d19044035a73573b3770669594614cd87f6e984b4e205278f31a51c096da5b29efa974a93cb4b79f30b10366328f80d0cab3601635175a2e82c6447a095913636c009c414ef2602289b0511c7042ef0c2864b664bc9b16187a8daca950bf54643f794cddf898706b6e3136ca290b38838fae18b06de6d66becd54bf4ed3c2e37b8baebae771b9081b3a3b25cf07afd3c93aeeb0eff97b56bff0ee80418d1c6bb9a04544eab9801a511ca96b2ec2f533dfd5637cd0c9ba5deaa9e576d1f0afeae1bacd9498211c4282b7ace673eae201e63a19b590c353931932e10686c7351a2df98eb287e97e26547708c6781cce72c89e03b95c2f2f4de5db4d6176f2cfdb214a1495e045ecd7720d87c10765bc07f79daaf0a4592386dcc14a3d641617812588893bc59c74a056b1a6cf45a24bdaf9ecd515517da7fb141140bd0c4dfe83176f7afa0defdbb9e6bd09a7ec9aaa0cc73cfa093212fc1c033e9f7713f181a5839d1a36f12440555b73b96711ce953ee9fd5217e2527384f7ac94df4c2c911bc5bb3a02b4b207f418352647138f13b67a5f3694dd5b61009f8c472312f70f58ed8ffdbc68ff0caf51ef1a736ff18cc16f826654002b0d634716606305d052bdfe94df4d4563f409cd02b1b4c0b36efc1dd7434ec1b5238684345839d624cc3d3c07d1b42baacf43b5961ea987993fc11d0aa44ba3709038cc48c36732ebb0cc4aab707c58d4bbd688f8243e60f376ca3c8cbb6a67405b96eed6c9b48309840de72b577494151070d8a0339778d934f4484d924f83a2d5ff53573ddf33c499d4ca3e37f4abbb1c1b12a004f7c5c967051a4cc842911f9929932ea55a8b4466302bf599f6f00686015af83b44761fec9bf847e63b4cb304ad59efb5236de3149ac96ee6946f1420bfb24e04851c51bbfb43fbe77464f1bba0f0657d1cfd6ed56f221c1e735b4f27e75bf018b3f6848679205f60c0156bf6c9257783477689a38ea87c52f0d97a65e847ef05bf1bde0698c04ef84754aa03b2fc5d3e273ee968c8c3ce6a4039d8412081b7018854e7927f857dbb01628d9aaacd249863ac527a9cfcf42f4912b577dc0fbc126255164eea1a335fbe42021770c7c4877f82363e4f1741fc1c0f5c00a914211146dbd5c4c70ea61bb965789dc680353a89a91cf377c08be5ae0cb0e008a2f12355ca63e822082674145c43ca187227dad3e7082744bdb058c587c2dbdbdfee07725cd2ec5200b591031e23521d665f12adfd659c1ffd73048b85984121e4bd0d612860ce39357efe930af398f9d6d50a4996510dc7a8c481fd7adfbe8134803e30b28de64ce85a6cb314b1a28a5a8d57bee3a502e8cf70c19325db3d11469f3f733b3556695d84e088bafaff1301e2f529406aee12ccfce302db8dcd2dbf461bd009011f52fa6441a3e9483d3f8a0d9ff8fe645b31054a731ff02fc332f95a11a572f8d2632fa8f20f3a443e75b32727fc528bb34f21af86378301ad5492431beb4641c7d5b464163e3631508fbe84f7dd939ba7987449b85efb6664ee0c2c1322bf71aa854bceeb4907158529e89d750e56c3e4f7765fba7cddd29d5a69ff220ee807b63246ba892fa1678cce0e6160306f1ec0600ecd88bea0b8ffc69bb12972ed716fa09350ea3cd20168916006912b0678ea8953b1e7741a6a0c4771d6358e6027dbb3873441eeced0a9b00e1dae9fdd6bfccc041286557ba9b74fea5f0f3beb555cdcf16f8faf2b4be979ab87940907d7850952ccb2679eefa2e5a23a21a873817444253277cda4f9e03d11579bb1547ffd1b9450a6a82534ce7d7f0f00039ab2d9778c909de5f94284a5d9e325d9a5a4d92d83f380e3eb46f5432e000fbee857d52e16cac323910ef1cb2c47eb631b16e59256b50aa99e22da50152023ab73bfac5dfb95569280b369b402ee609022e13675ca3de0697ba8021e81c23969876026246b4cbe3ab51036c90cdc51c8be73f5fa6e5bd13cd176d52865bb25413df4b8518a7e03736af94b9bce90edc74a4531ad90c3170570c593be4c4e18e2d3b85a853265bed4bf9b1bae993a77277e2d8b400cc0fa2c48818475977e1f5bd89c0ab5481512e45b4f03fe39a5696da2eb25a5933387555ed9264a0a4306bc8fbd20e9e540c9c20cf2ff3224ffccc78ce5a6b878bf6e1d205afeeb303d0846e28eb9cd9c3e741acd97b362b44d62f3d43cd35cb3de854e53ab0df34bfb3f76ae240d4f348cfcbda45c14f96b4773c03000abba45649c235ba4459f4a3539cdd596c39d20c33503dd4662af3c9e0fde24898aef54d35ffbad0c06ea712e09a3ac98d038a5edf24d9752d11a3b07bb725df170d136b2275cdd4e7aecc4d306dc9c08c027cc70ace88524778f81e117afbb277675f6477a2cdd288930f1b018852e87108a080ee04a7fceb7b536cf650435d773c7c78811a7b2df47a3807429c92e62e26e3daebc1abee2b8b41cb50b8000e844c623f43865a4fa63fdd8501829e2dd7e7c8e3093109ed3a5459f4050e568d0dd57b89892930e06d60222c504c375cc8acc866c48ad1cf589bfdb728a13d300fd7099e45abfeb90b5fd70ff20e59b14f98b836783c7874e1f9f781557be3e3a5d0eed5b21b3f4c8e887f9de34fdd11bd75da1ced14e0473d2917780ff787a17be227e637a2e92db6a9964e313807e3b25d7d0617310e2a91693b82d331d7f4a4c6f2095c0b20dfd731f63c92bf150e6511473d9ce07cbb51f212cb1a47210b0ccf8a010edeb8a0dd07d3785229ce884325cc00523f766328a5582142c692cb5d197fa18311b8aa01ff34f1126c94c98f5bde08ef5c172c202d3918f800952261bcd9d799f521d2e00cbab2832ab6505431aab4a9a0333c2c3bae91152e6e16890d12912d2d21aaee6a7a0621d0eb3cb8534fc0fdaa896f54e0d14d378b252d3cb8b9cf394a11cee6053c4172d7e1d02ce0c48c5d4064a2c8536ddd86a9a36a4e6667a88ae880566a1e5f6252c628ab5f04f69e52c7ba4648a22a65645b2d2ea2dbe064d536f739004e0c47b09b6258e68afdeef764d4eee2858fe5642ea6bd170f65c58ca317f98ae687d9e154a1260f6936b661bc846000309ac6b9d932b56f277bec7891cc39bf8b83e6035c427a1a1c999dd6b74a64a41426026a4be6405fee4185525579d4e47c818b60d5bd712bdf1344c7c2de881586843c7646d2f1749f95220223912a5c1f47a4d075e044719c1ac42e89f96e097ed940521f68fc8978465b337d6d36ddd42094e303113fac47617028457c6f3bc2e2188456ef59689c426b089ee44c3ba50f73120037ed7bac08c27ac7243e9579d2105da4437683446adef8e5c15f9935ecbca0553bc802c96a88fda391bc7cf4ddbd47a7db54d0cbfa1b35b3a8dbd264022b83c7927a413817ad8b57d5b4f842114df6b0329ceadd742f3f47595520b77541900ccee94e02f04ce577506e38ea4220ebfafd32c7467f3e5fe3fc75131adf63528c2829bdbb6133e3326fc752856fa4435135cec51e5ab94abf97cf1ea9299461debbd4648a4593df89a178029020e7226dde961478c23bb188a1a7845aff50e0c7f062a04fbb9f6b985ecee4d7e948de6c30e4595fdb5498d3cb740aab6944c1b9ff0abc21041d42415d1c41ff132c9ab73d91a90fd786d748755f8a55a4fef23b23ffd9023a66b7864e9e9d632e904f5abbd897c6b4d6d6ad9c30105d7bcc634597f42579e1a6f145bf80349bcf398dad77e4fa12e67b592915c7946e444fe3e2f6b5c2f5b9178e01dba5461aebfcd0809e23cd8111799dc166117c4c1f7ca01f78a2e452ceeb18284ac549b95a73535d6950d96f329503479eda94f54e9e028978ded84a69682c4a084a66e5dc5ab16fb1fa4c7540116f812d24c287a3b0119e87a3aa8b69a11d7be71026cf03ec15f2313f1d01d27462cf1e2c5ababaa9f274066824f0c5aafc317c74e3ef5b8598f2bfd12f229453d2b6854ae145d57751285d9c057bca93c7f4776dedc03fe55651e8f346a9abbb3dd121a23e0d5431b2a14b9cc4890ea215544565dbd0b98368975ecc7e8d12492832b76b32c8c44783e6f72fe086cae6e1d16991f63621093910e57ed76baea5e4a0713545b6ba84f1689b37c61dd2cf9eef46f551adfc6342ab21c9478ac8817f9f3ff3a7e940d300da47dd1cb88bdfa64df6d019a67d09839b3136127fb459b5a7407212f0e2b3f345d3933c0d17cd2c63f2d9336ea29073e890173dc744dff66cd1a11ac17256c2325b5f41f1267ebd419603af348ecd4e1b34710a6b92b738d6238484fcbebd515d914c6f0d97fa59fcbabb50fcaf9af105f0d4eb47c7f75edd83f80c0c47b111e76a6905da2194d62d12028a5c76f06b8b02e145b927b9d88c49d0774413f093fd801f73ff8e8cc061188088380b526dd3c146a2630613820a04e7b6afb71f002d20f729bccf63d2f08f2a283dbf4e949607f68429d6ba81505ca4f5dd3c4b3113521c3c577d07f4a0fc100546b59e3061044600bc78522efa121e168df0cf9257a628373e06894baebd44643cb626ef5a8dcd8941c03907b8378bcf877b6f51af69937e27fa743b4ecce270238298f1420ddfec19f3379d2bddbd32bfa0c782ba90b46e2c0cebb408567261c65b9135bec68b8b7302dc8f2b4cfc8cb333a7b23401137145964676b5c57754192568110c5c7627528f2580454a25ce312d03b1c1e9e755394619c2582378047dc52d5a669e74a3696676f167f21aedda8211027746ab01ef8ae6b1be15ae95f15f7de5443a833af53007c5e941e7b38eb06fc02adb0860cb1fb379c9f55a226f1fe1ff1481cfec3aec1f30bcaf3daf33122402647ae3faaf3f3bc71f681935c89c845a92ae16164f24f1a152c07760551ab7d1b2208707818dfa213ff7fa3ab7c5e8ebf16b252da1588f87b3379f86799023b2e4b4f4641c277ac8149c0b27b8e7c14569bc5a152bb19ec9552f8ee293a70da2944de86c6a5cdda7a13065adb6c11693ce4b59b76fc83c933dd87366e0f6ca7002ace55351659701b2d83ddffcdd6f559a5bc4140574789142c6d23ded0dec8144805bf4cae2d351ad9cdedf72ef052a8caecc96e81a90c208f285c228262830c45ed2891a0c7c1b5adca3c808f84f2ac51f932131ea23359ae971a238ec38225605fea5ed37bd0dea4b92c37998576c9e6c75ac9f84f2bc2277148486bd66517d7914a94a0571f99af5828eee0be31062a9e80b2be73413cc2b3fc4c77f692164dd9a90b2fed552f7f0ab8d1a840c538824417afc61b954da7098449e39ec72287ca2a4425d4b368dd2f04936e90b0772c6cd17229973152a93d63fdc767d03b921c973e1b83fb7a51b551d39d311f574bd3a4dd0d3ee80bfeb612f0f5c51315bf72d84851bfd23a22b6e6b23da3c2763e739e912df732dbedfc1c572cef3f19f1db23d934c55431b94eaea8e2d1944e3948ef6ea34f3deb76f1067f332d4c186c7c8c2c411836133c30ca68e590ed74244a85219a34339dea483683a21c791f548f9cd8d4f7ff29285b9069553d1600be992871f164560cb775930fb6b69e187284195c4286b6ac8f1fd024e3230c6009679110398a7fdde14206d256dcd82981154bd8dc9da5c07e4185c96e22db3de4ed4b9840569710653eaa8d435a8a2bf008640400e6798171a0988ade63ae691fee01751405f5def545290374dfee24c9b0d4299eb87422a63717b8c680afa3af0ec21c4de3e0719bd202b06b8f742829c1e6af367de4f6652111ed862c81d7f90bf162a818842636ab2a19c872b3231fc320b9c1bffdaa36a48da7f11b77e6ee5865399f7b3f867eb06d6b81d68d0c9234158b9a5beb48d3144ac725cacf593c568d5382d9738bdd87bb5f6f17891e842652943f27aff2ec84646bfcd7cb19264228aa722693e84cff07afcdce4203be1e5242c015826e1061625c556e9057be34fb41b433a3bbe71827399497b3158ec02a1f07fb6b6455efbb1632a3720fc20ac00437e851541d57573eca8bd53eb53bbbca222cbf561990d60eec850afde3b2b318ad784a5e0d705a8ef029520b46bad87012460d3d63dd72720d1a47f46765e1e1b80b08f201f432fb3a733e39106ab32d84230cedbd11dcb747ee6d8143df2dc0150d45b1eda048126169333fee911b7074f6d89464d3e4db4f413129e9e7f01021424f2ae0a40b23bd59e40bd11eb31616fc79f36d196a86e5efbf38f7e043f666c6f0f353e4ec18b8d1243a729ff98cbd9614a4a13a1b5b6a8bcdf8b7580e808e899951034adde3d7dd470cce9b5fa23e0856f2a97c2f9c5cc77b3ec11faa188d20fc67b6357bd755985e19921289502d7ca0340e784531aba53aa0d6772a0483e81d634c7e5f1f8086d420da08c18b751a6a755f98fd0b0e7f2f2145229206882cbf5ddb55378a6244b60b3750a7606f67abc0fdc311ad98f9867d287e44ff53aa7ef860c1c1a0d53d713490502ef5a5917c9b60246983000c0d893a00d033e87cc45b69c173b95b51041fcc593f32cfe82472c92d33873ccd195cf19af9d99e068d5745ed2ee04a19ba3af41bf72e6975044a9a3402fa931ff2bea46b1e39b2cff5933514911d0df18032f1910bcd71d5b03140dde5ea95a46b9380acfb769840221086abffadec02a21c36782f31fcd1c185c2f1601e2b6c95cfb2b7467dbc7936bbe814102bc66f1e376938ac6deaa1e3056b15465d1f63a4eeb15797eeeac6aa422dc29c59b4c2f105d84cdf1c328ec24fabe6eb0ed45cddbd6bd0072c09a716f0001ad2ffb77f9b3aba51c58880220937653dc6082ca1ac1b0359bea80cb4a06a4ba841772129b23263851f00e48fff4d2e001c7981fb17268d1e30a97d78cdb6c95d428f717b69223fe40e8964f37617e945ad0bcd51ca21d0001423b12b7df229022143a8a1f0229b815fd419ab11efb5c3f6fbed61989072da67ad8ae90187e5a06e62f9fd182f7dc77f5529494d21f2c06a8438d262ed118d6dd32039a03760323e657c9a9d0c47f6cabdbed19d84559455fa40e78bfe1d9f8eb3e737863846e4f5fb2bec5804adc08d9ba1565e387287529f9f562538f86ff480520eac01c4ac1cf3a9a5db1040db9a7383d05cb1064b6e4449f41feff10277e52cd45694ee703bbfd73cab1441311b0976375c28deedded4cf0df488227bbf5065298d066413953c40b1b01a330e00243de9d9ced3508167400c1404588584798565fb1e91a8c4c12b607405b3de3e90d234d3cd0d6243e2de4a96d30c1c813af58c8295a590a6af6dba8a092e94dcc73a1f2edea2fff48f3bde49b8d6e16ee7b022c3df2743fe86720eee1e1207271d47d5e2acec6ee27182888718f5c8a6905488cb70569303193f5bb30e31acab1c6ee22dae707ee88af3075a485ac591db002b393a47b250fec2b48b2c11c2e4c4d179eea23a07cffa16431a73d21602835ef49dd53b5934468fa3ad3e59d901d83c0eed64fd8acd0c0eb07962e28aab552ea39e00b3454a1fd6c39417ef220b2e4556dbac2c904a6d9549a0d4a297fab1f8f1b38b2b4e7cbecd8bc7040b6dec8f181ac5447dce53a866ccd92125041d6b99aea02b6d039f284621a525fbf2be6e8d7bcb1d8c60efabaa2e2bda7a87feab334304cf9f435e4523b659329e9aa4a90343402225ebfc653f29dfa97269f06bfa5ffd6f4f5921f77303c01c30dc45cdb583fe8eec13afbb034705e6ce5c8a6f4ce54e27cdbf0a8c03806c370343500414d9f31b926e379697896e7cf29b6b6d398d390b24878238faa6363ac75222875af12f3155cbea75ba76ffb8cb79316e35ff4cac29d978f53bd6bc0c9496346d5b21723311f0993b7f3b5f6b895a9f2bbfd0a4f9a975e68be1b977357704a4feb75d5160ed640de35fda1f189e076f6ea447bb8c99a5490205ae123a2724c929aa3f4b94058bc34542421107e06ad26299a943bd741d990be547cc00cac5a42017578808f88e3c4e55bd5db487f890ebeb16ad1d8dc798f36b68ce383650517ed3517a8b11e447fb396750495aeb1997924c37ad339d12642ccab42a22e1db92fd0d56830184e42a13cf1c32f705fd0c076c039fa41b400aa9db8e0caddbfa782bf86ff58bc9446fb97bd3eba5faef09b9c241fccff5d18c3dcbb31e9b8ff02051cddb678f64db087ddcc1eb6656bb59c9a60a02052e5e4959ae3303623d69e2088ec12b29e0909d2888ad455ad0999cdadcdabb698bb5222ef3731f017f728eeee534d475120e31861ffafb0ee6c5ff0780f0e8e2f1ca65cb876731ed113b2893a6fd9999a06b280e2fb04754089ef456c7fcec367be99cbf4b671c002631fc22a3116950b0a8a6da7fb9b81fd212b2074e8a4dbcce424d967fee1ae04ff4dd7153ca518b61becff30bdfc2368c6ea73b0e3daf85cab610a29fad019767947985cfc62c81d79eae9a1e418fba49bbf52851bdb848512488cecda50b471e0ec10463f8666c8960a768558dccdca9748acdb07510bd6461a58fdef72710a74c2afe12fe38f5a04da7f0191b0a78f8d65c7e3fd1db376b15c1669a4313d2ff68944c97316107353b0c0237aaf941ab854125938a0a2295a5161a50eb29d274fe75e650ba73ffac7cb6e82c6cf5a7e8ee8e0e536060b40d74b9b9ad6e3ef5a2e7f3510ec9804fd7c41febad6f038db65c57857f81a83c9b983db2ec90342702f8526c5e920eb4566aa05c0103473ae7db1062bfdd023c76625babcd753cb71813807bf485b69196933fc749033f83712c217039ba565a8a71d093c7870677ddd4c96436cc2a74e1de515d596c51e7f72d4adafffe5d59f6145b4335cd16ff1f0c7759bab04cb5ee49d072b4285eb987a5e318d3cbad1ba1e49d4828d7086b6fd79699046cf140b07b013989f7330d2cf6e48df5f656463312c2291b652bc857a06aa9c047f1b245f277496fccfeb3a82c27d9a3c5a82b6f9c12b59db3074e1fc7b0f796a16003d84be6ffa00bd9b304533ee0ed5d536eed86e7bdb92a0e0cef64c727b0120abd5d854aa4c346384acfb0cd1ce39bde31cc8a9f997a001150a7ddf91cce8ea57ff6a720b3706dc0813eb87f5f59bbb5a51ce021ffc5cb191ccc1276c54fb564a25a9fddc91dd98ea7648d9d342670dabfe0333f3f7ed518b18dbb27b0fa4b58b175e69ac5eb4482c892d07d94d7eff271508072408e6b0e5a2efedf5e72c53351301d3802b360a2ffe196a21796b6e8edaf5aa3319b240915e069c468d0fca39b337ce9509f9cfda8482a9cd45aba6b6089fe9403b34b13c8f348d5032381ee6bfe40f79196bb835be3d798f8be0ada38477e386e27342e2899e7976faf7a4acbedff498cd78286bc460f4fdbe64e85259be016eeead118390aadb1d41a838b7d3722b097eac17db047baee7a9b55402882008b1868bf0f9ad2ceb43a8ad5e15c7313aff12f0ad045c4970ab4a27d501ed4bd1a0831e01a6502662424c4d45038d963716d90be7419a2db0ce620425fae00025999a3532e23a5e8f9b25116aa69ba7fb00afa261698559b09ed0555283f66a0e522418b30a5b7bc944346eac86c659d7c1ecf286a0f0d7a9072cb81c6428d3f6eaa8ebf3819f42c6e65fdb30468817f9036d5ec148d842ee9d6d1cb06278fcba65fc6371efffcf75e90ee8b16e57bea3a00d91b6eb0457269951ef77c42dad47cc7e2381269cb6e5d6bc3c98237db67b126ad3176f6bb810aa12fea539286ee1eae787d34095ac62ea324883693abc214f618cae9adc3f9027dd62d62d2ab57e694546913ef9ca7e47a50248ad1c89029f41f8c6ce823a268b440276eea283dd1cd34aa2dba06f064d7c39b45fc9a839a2cb967dcc28ea7f9db3310391eb079b057034d28091e8238ea96ee601ad18cd069015cf9195daf8cadfac40cbe0893f22255523cc2ec5553c75b1b64e522bae4da14672e174c36c26d1c3c3987facd520e855317f81bfd019dc30758aa8812a3f8a6f2b8ee656189674baa89d0183a2b7c450a324333ff6f5a8e17165be8b3d2af9fe51923a12682b8ad0273cbc4ddd699e8b3278c96269c8a20b9fea7fdf692296a663f3603e34bf5b99049f4da59192c4af8219bb8d1cb4177d2cc8fceabd1efdb5333bdf26dd4f0630cd1791c7f07e3c2f6082c7f8f1a938d10866260042d3073ce804fac593345d46ebbbdc1c7fdf6e2f034bfaec4e916e95b3b81c97329543f0090113e30e581f70e21841bbdae8de259024e05a1a26eaecbaea91470d825ab9a72ba9c423a9715cd1e80714fdf97513f200a89cfb9521e606ba1c7da6f2963481c59dc8de91081025da46e94ebe50c4b39127477fc1096c5567005ea196f1875efa6d6f9fcc5dbf15fb548afc1d19a18262a4720aad938010d57c3bb221fb3c900816a06640f75b900639f2b31ffb9e81888ed6e2bce67387ac1b5184379f8981c28517e3cbeb8019091e5a5d8512a1103cce28fc45a9a006f0714adba5308a272675ebcd91f0a2ccc3a2eaf0a1ba0302e61ba6981253dcce355473b0f011cc4ca592ead33a28e5243dd32947d01220f374e3f4280d2549c911ec92ea29a006606f9b77b67092413160588da3f07f1d12d1ece9e3a29a0d17658770889ee1ed64f6851ba3b7974b65de06a798bd9e9d92f4d64121420c59cd73712e440c749b0ab87c246bae4e82584f6681b6ff8838d30cfcc41647866ccf5b9de3d8085cdc597387e0d21c96d71ccc814a7e181053c30ae2dfded348f927a74ddecc1be5b4f54bf6b964484bc0708f644faab34c6e52fcde40e03aa622fce5f57669dd473528acaedfe49a22eda03028e46dbcfddc01ff18e276dc642a50fcfcedd07f5d94b3a8ce021adf2177d4df45e5e5e864ddc14952e4fbf2c48c1dcd8f778b969e5026d4648e290dd9c1819729c786f7f8ae60cb3d46cedfca0c7aab10e8cb7bdcce517f5c391c380c64432dc8de1693017552c0ce3335d9925b97993c29e65bd51b3b5c736e5f033f948e6416aa5de88a5210e31300f3e291fef821489eb61a3a8fac79c9371404c6f4ec508dae4bc7960c0397a801b20d82306a92073618d0d7024c81e8d69297110aa0058b40f228f71ab21f7ece49048e1a5befb2d0e4d7aea8355d81491084edc6bf5c89f27e014ac880f024bc6c9c9b4bc8e32cf96e63adb18617f23fb2754b2de26aa0b0f480d84d734436debd05d11e69c7912a3710755a446d43a48a128b6b1b9b471531a36d0190ccc80f011ad4db1cbfc82ac44d72f57ac7a4f18198f4816efbacdc661d6553a0ea106d1175c51ec575340a0f10e67bd3deeed5a053951da5092cca0fb772850261d3bf96db0f8fef71eced5d500aa09dc3dda8ecea3dab2267519a031df88c208965121e05e30bd9f65d7b28b0eef7b12d75e0275328443c75981ab5eacb5063c78c67cc784a8766e3efdc1791eb221e81435b65637a835523d952fa339ee0931f2317cae7d96f8878e8773de3cbee9272b9cb6e72c444b9441615069be089e1ea4b8179644bc4b7dfd7e3b6a4c229e33dbd564e355f2e6716a78d01a1ebd8621171e770e8ddedaaaf18cb1925d1940c718b85fd5a5685fa21e5b91c0e0736f2b6f1c55e05218f648e222ffb43d78aac0f31242e5ca0cb516808b20c94c1d1e1583a5ea8bba033f2d057b1f09f85b78aa6adc304e7a48f8f0947f56aef1054a01531cf8c99983726d4db2f7de7550f649b8fe0c988d76dc72f8fb4d9970795037d3e8bf9da6c2025e87ba2dbbf5ee957125488e30d9a96cb6d1b9552f9223858019359c96a0323db0f1e3f5cc63920c73aeb01c66d8f0f9c80ef1b7e964e54615490c77fff7d8ba68dd44ae05e1ede888bed3d3075941dc920a9c541066b42033b40d454b195bd766c20f75411379782b238601d574e79f4d25a8a4b2a617681a81c51886f3c2623a5b493b00a85dafbe12b9289b9c9df74dda83a69defdf770ece36ed2aab7c1da93b7dfc585b5eb1b1f1b918a97958053f2dc8b3c4dacdc338e9db3c5c259dc6275f7c664789b4d949a7e45dfa43cd8c3e905c7ea7b5d69516d3847fa6b85ab9b525b21a0765517bb226e40522d889f9eb742ae60b134a6f2424fec4284fd5f00ef051ab166cc44d9a28827d5725b30ff5de6e0de1d8e1e61db2fc7de7e6ab82f1fa07e3b07681a450565e836c101b6efcf02347238cb842122d14a5ca4aade68d2eb8b61addc6f6d43c61378c929135ce5938efc28716d8825b86da2c64341a4ac4da0c3b1b7e19ef8d264f8a8ce25a1405f92b5faf188199c8a4543809706b9e4eaa5633ccdbc1b07c48d61a81b82730283454c1dff7f72a593fbba8ef32933b7e68a76c448f77902cd8c9a1c7acfdb0f63997baddbb8b314b90ad81ccee835c039278fb9d8964e648164dd5b47f32358cea390ccd8b4f2e738355964bbc487f203a0e7ff7f9bfac3e6d759c4af11e6b4a250eb3587a501ae0232d0ca3072620877c5645f26e991401b66afc2e4323b43c347765baec0697c37d708e1196455405b4cbc40a26a54bb763e0f64baf07ba9880f46758a034ae2ddb441c9a5e6330ee71d6c9d91d3762bf4fdea3c47c3881fa71d52ad50a5910c66818a2e4b9c8cca7c89f12b2d27dd073ac9a867436fd8ce02583deff56e41656a52be368ee0abb6d4e1c5d3033ca73676d12d7c647498afb288053a74f3fb79edd0509637a75eac87f32bd485e4e3720aea28e3d67659a694719ab09fe2628caa63fb79b714ec1e0a0551de6179782d5cd9227288fdb2364526b8b19cb14135cb2a214ce796b2793c97fbcd39fcecdca5997ee146f8db75ba5004b2b5012111ce1f5e8fdaedc4899cef394cd47c7e554c2ff71a080c5b6a9487f30e0d2910e2a422815d8dcb04b5b7b3550dc89c2a10f683c425208f6820bb016729c88e42402f602b2e4942edfef92d30fdc5368fad72ed901c257d17af04f99e99a7acdadf38de1c237614ff2a090a13e82b3a8b901b5851cb5b39ccb2fe955874e2c64122534d14b2435caa74e15e9727647341684b1cfa7725a9e18709a4ff87f792b2f848f93e457a783ad0e45da874348c9b3f516e1b7fce60e1d91bb71b87bfcb33c7bfff67bd6e71f45b836da0ad193362eac5378a253acc9b3b04d4c0401b1693c94953ac4a8e0f2de7ecf185cd91e5970a5928444e9ef82f91c38a7fc6bac39b7a139b03c435f18962cb5cbb575b72db9e25726aeef37db7a2963c0b4883197271043ba81cedb697d4560d1540e6b8722e94e65f1cbe047253113b78430ff843713b3a66418a5a5de402498cd16d1629f5905171c296a0efe75cc57369dfd730c220e161a26d922b839711654afa6a865e8926fe09c2cfcd225b77563c7b5869d6d394c9eb24f580020d953ad7025578eec4a8830d8543d3ae4e5436d85bffb0001ef08930d9c10e57db4c4e6404886c7eea8362beadaac7045ea3fae6abc97129c8234a7e653bbac64aae1bed046faa8cd5243dbc52789ba4da93080a7e9c0030a00000000000000cae3981bd9a3d856131e6cfbd3644906942c69d678c8950ce339b6b06002449543e58c5524d00e2120d3c37d467f60a77d631a254ebe7fc286f584ab8e4edf15 - +01043105a77b1bd619f86968bccb4490bee4741e8fd0d7be082329366e3a08f9a1add3951d9d920f6bf8f93228120d5b04c7f6a13b0eafe6c90bfe47b44adc54bf2c6b98fa8deddcc22d993d65cf2af8f261b29fad85c6d374339acb83d7ce2e4830b7e8ec2bd8fb32c3efc13ed667021a3032ae4cc03c96c6838cebabd443257c3728c3b17d58e5ac87b5d92aa688f0ff24bef4e0702de71911a66aef5b5918f63f7cee7b9d95acced7f7eb07dcce2d4db764312d65bd88ef3c1338c24565814fc375fee73d6d3e2d4835a657366e878efdf5dff1614998a261133770a133c6b596bf8143fbd2a6b565c19556ba9a1c679d2980f281e5d5c4f703dc543744208cf858a497dda18354247a55e566953e2fda4e7df6aec7e1fb214d168c915383a064124679870daf07591c0d18e77439e7684a46bc7077d685b307cfd7e89f1fc64f2af97a9da7663572459d73a09c0b7e869252a0376b66e607ab0c6d9ff8d0b2a26fdd6044826333e81731165123cf394fab412679f79679892da3f2ccbfc89b638c312504b7e72ba38000f836994b45b0136a31db91637587513fdb39e3abadaab0105d46aebe79ffa9f33290006e5321a9be53127244448cfc76d446dfd3f15d8453be982a2277e15024c3d24eb3b47cc1305186f38a46df5350d92d827057d75c76829c0b918346664d07b6d1745f8114608c07c8e16ff764d22af5310bedd98ab2536cdfbfd7c4ae5a543bb25c99177b751278d195a961eee3b11390320aedabd498ef4a1480f99374fb80c334fbfc41f17f18b90871ce8bf95d2c37b2126d9cbdcc83aa3931c2e4aa9252c6c7178210644f775796f6ccb63378b685bf220fb8a25c9db56d3e3b50e20e100c01cd022b420eb295645c6d1c5de7139925ae5c57b4a7a3e1392dfa5edfa64a1354e26241bc6eef3e428e5ec50aaedf581ded8dc2ee5b33aa6ddd37ffcf20c43dce705328b06cefceb843fcb4b072f37bcd92b512e9ec8d8185cb221c445a75d8eb6431aa15511ddf0746e548280f2e2e31260390dda4ac27c1e2e1e7471a6a5cd0d2635eead70670836f321c4458d87d8dac8a47aabd6701eea28060e6f07e6b88239b4122facb74c75afab8432194f0d320c13f5341c3e0ce96c2586ddc16dee1245d6e677978fe01b8d8dafd8d4bfcf9c83ae2afa18ee7123e0ebb4772a02b0fbb95b767da7ee4c686ac72ef8d5742cc6dd4f5fcd9db401fc54748312e4956ce8245ac38009c08421332c6f3fbcff675257c1a19f1fde6335eb25ea3cebbbb253fccc535a6017b5336b8c49807476c5ea0deb95e031bae564784dcc5d4e0e86e93976a395c2d117db620a2940a953afa352f99b897a7eb7a6d4a3df1ee9923fab430ff30ab1aa8f886fd28eeb47a8099ac94748568840e5b36051796a731af675ffa3f46310ff73cc924b6363a571c39bde8c13c2fc9558c10ec33e936ea69518830d71aa36ab29fe2b3365331e7ed4a32a3314ad65a633fdebbf0c68340fd26c04f8d2bfe225643773c4e1ec83670b205aa6e6c7ec875af6f815a27e9b5094fc43dad9678f232fad58aad12673fc3d5030a8cc1f054f6f5b7e12479afb95501f64a57a2603465c33bd7bac32c9b74e67c842d631bd34094bd1159caea0583786698b71e0c5ee4ba38a42ce20ae848d1bcadc18b14b4307650a773aa197c64f83f27df2c4c6934cabf57589133efa5fe8b2dfcc2a3ec35059c29d4b9ed9436b179d3e626edb5fd122ac96d1d721222f2cdf0795a4fa0a07c466c926128deff352b9b7cd18c31419ffb97ce326ca53a365fbd099bbbb7d5aa010c3fd8be868f63444a9dec6b156e9b18b18717fbc1425efcfd593eda892d25c55ee7286842f57edf061f9b331205d5328288856ea336a737221dc95dfeba99fb042999a351e1a8dd6259f7229ba1c7ce9a269532d7b088ecf6aba757b0883130e4e10db523a38fa4389357e5099072a96576b2c4adae10b030a6e6b0c83b297ef53d84f184757ae8e1215040c02eb3a2bf535e24e3c14171890b560f0405d640bcf0380f0a20b81d830a541e027f7d08000c39308ff7025370be6c63e2fac88ae3265a8dd53c245d3df227c621a34c32c66770d2f10c8a1c9b8aa79cd812bed358ab57e221657bb7409bb1a081ab89dcdad8985f2e46dbb8c20520eed0dd68f5a525f6827e30f9cb4f42ba1376def87471297a42565c6bf0da39e73640421afe617e93222db87c61e886fc524d3212e2e7eda30cfb06884a847a2940fe6dfcd8cb1678c651c442c1166f17acdcc6efc3edf9f084f2dee1741567e7b12a535cee11d89f37620c1556aed4693e1f5c5c695e135bacd2a4ff574ae313709a70da8879762a7386e40ffe9541c29ebaea16578ea23015bff8eafabaee77df3c4ba1b00fe1a4ef122b784e2aa4b7715890e6ad6b53f8b7df9fe71b812020a1f63a822a37a348b6de0cbc926cb6a6be8e1ac468d816b37775e03b57dcbf63784978ce732795476f5faed1c27a787f613e7b107b369cc5aeb992f26f5695b4d9e76960caa1413f305c9535155c8fee5ae3342fc385a06213d018de4f8309fdf7623c11b122baf317aa01a501f8d4aa2d7df72d3319683cf12e41996114c4f500904d70eb1e43ecc6b755342eb31f7a01d0eb38a993c21241174144b7da535416632e7a87259d2568f3c9933c8b36ef8f0073dd900add73f333fcc3b6b1966a1f5409eee7aa811eb170d46c9c31e64ec6fe9a9c6cd35e12d719cd1c04eb1b35d0568bb484a20a566f933092f02c38ec890604c174cb4fd3e39b7fd33d1d6714eee86bfbbc7a9dbee83b569aa9194d1d45bf54918f4dc5c9d600cc6667fbab66e8a5eafb75757c2a93ce9f5009d706bdf02978a44d38f6db4475a571bc2c99a56e1aa5337baa00c1ec94f2228719bd4267301e33c37e1524bbecef941feeed2ca731267a44a0e60bbe7a6647b18322888d41db2e135a0dfb9d18e113f674aa377be9fada2c5d9f0f0f9a85621fbac4f18c4c2cd8bda69d1d22e2074d83443b2f556ef8c1f71053ea9a26861c8a477c7e370bc39f3940d20e85484e6f9f914f0a4c9647fd7a836090b7ac3d82dd5d528ace71e9e37807e306bc09ae0b422beab54c6546cc4c578c09740f271fc46a5438d9c3cafbde7f7ddbe55d70b25be69678e09e21fbd4dfedaa9e18ad02b13769d0fa0bb1fe16edb0fff8191f7d94b9d5ce3e457702d00d849bc0df4a23e27c2012c66b4dc47f0d2ff1353c1442e0af445c732e7ec1beaac30e735ab66ea48797459b78dd9f8dab65b198c57eabdde3bd3f80ee659da7603b0cbb4b387476aee42dc9fffd82ee623e4c7eb9db8ea36b643163644d00cb19b3a80e67f775cddc7ce9771f8dadb330ec7dec45c2dad266235d3e248c7f7a04556ef8cc42107fd6d645b0477061ecc7ed9eb62a11de3a8fc721e4da990242a1409bd01f860c94e39b8340f064310e6591d8570e4a9e5eb0db4673ee7d0081f30afb73bd7b09face4271754206fbf0f39bcaf1ccbc89e6e3a9c2a2bcfaaa80c24b308d1b4f0e78deea8bce5106761fd1fa2e18ba0652ddf41f7ef6f0068d947f625d5067fc9cef34c38a3dec4a6daf22c6110ca2de50ae4f347575d7f6d5b7ac6b5ec6b86de7c752270692f14693e14be10b5e124d2a5895f313979e90248462da24794eca17595d0578b7145afc841e8c784b0a303ac19cc3207b00735aa676b1e234c3488e4885dc839f98108b630bce2e143995d5e9919565854357a76a9c9760064d17c4369ec95bd0364790ac9dcc94e60249bb63e4d9d89ac2c169585d9022991b78086688f28576ac0691d26e559f3b02bd1f477e2d21864617bdb585a3257ed489e444524c70bc89374213518cac44e3ac387c4245c7a5316b8e8619a1768ab9561b87596869b93e73d9f20a9feb29c9d4dea387bb6e31ab8c42f5aba2e6445db2f6e6ca00f2b2d3ced82f3b26aa6a720728a438b0d252ea38c792ad8abedfe0bbf9ed7adac457b79314993719626923702c236bb078abeaca4ecae8f276fb0561aae67ca7afb251ac8ac9b4fe6456707731fb079faca3b6e98fa618f416e3a6583e84044373d28a42cfbe864e93ee6ae0b5b70eb974a67629d4f02e10a7bb9a0e7137ce43646b1d9a26ded08e4268124c10932a8fd1271a45827003c491dbf304e59671fdb3dd995215117684e8e122768ed7699fd6fecf38041dfa4ab74f23d9fe7cf6735665002b868d76bf27800e7ff35cf9b67cf5377c2199699eb27a18ad35359bca2e5090c14b04b7bbeeee2917815e10d1cccfab9c2f01f42ee00a59398431d492731a30de8db7473eb1d9552447b99c491582f9cd7de2d11fcf3ba52188dfdfa90058c4d5fd251924f4af66589c20ab8f4fa216bf0d8882f061d01bb5fe7379cd204e8fddcd6dda142268d21106eae43f5c1d66b4a426d6e89dcde6cb82dbc5ce4ddb79390d76463cd5b179f5b5fc1cb6826de2b5ffcf4c06236d0b76a7115f473671e9e2f1b89deaafa895e3d6c80beadc071e6bb937670d73ec7afacdac7028bf3f724bcd5bdae9a1f87334ac3854f743a4ad8bd48764b61552f6047df7350f4ae713321b3335dcdb401523e71dbb72d0d06e2cf1f2ae925bc4ba9608d4fb0b1d4b8fe4f891f6f96a860d0e626aa0727fcc3644eec839d2c94f6b4e0b04c9c4365c47f7c434aa32f328c5b89af6b7ae4a0c910810c7778c6e2bb7f029d954b3df9da73905f9b1d5fcbb7fd81a6d21c29214acf3d0f8bdfa3a38446f4657a7b8c55b614dec37e00353022f383a000348f4982d6f0848f1b7675a75259bb08d0300000000000000000000000000000000000000000000000000000000000000000000000000fda02e5c12d90497da39c16a225cbb28ccbd98224da918e2ca6c2d3316f1cdf06fd69041a17115dfe84e573c56a05805cf1cb172521e4067e98cce8909cdcd687d97acaeb506af3aacd1010971a069d33d12e02c465e787adf5e9dd2ed89a7713d4e37fffd59e725463b5f01ce68208d428e30386506073f7adb818814a76dbc5d5f1814d8f96785b4e23c62ba8aea0953717d0d34c10670c1391c3178b166fcc5838e8264962a2774abd6a50464c6189c49a6e95568244ba384fc3bd5d6db0e0dc0a2ead3c0e6c7a830ca11ced871886d7b044e9471a6975c8f9d356dabbdaff84b076d2d0905322faf6c2b196d2532ac52511768c545b35efd4cc86d5dfcbf15dc9916d341f300de53ab0e6f7eb365d4d188dc29b143bfaef7acddf18b85633a1323431013d724fb3ff71cbb73726cfb165898b1b6f0fd4107c021cf095b3d58478272b4d913131ed08be4d630fdac27ff5cb0bbb6e03c036fb602771835063b0611f4b3ef1cf2b79da86ffdced0fead3e8f993ab3da47cd69bb789bf172665f04bb97918f99222c5fe87b6a7acb9b219633c5522f04d3fff7f8282fe890c8f73c0213a3f1fc45d019377364f7c94fac1533c99fed61042a316921711f10fc5b6992094f3c9aa507b0ea8c5949c52c09046b56d8491a57fd9379a1a129a1f5393f12471a72d64e38c4ea0ce59a9f38ef2f02156cb1463b43c6d214367dadf30f9da012580ef56e5b486c7e1afd88d8cd68d7bb178f78aa423e2ba0c041313fd97a8e5b063c53c30f5c32fb0c0058dda75acf3e8f41a7fbc48d76ac1cf47189a1f085ed035728da2af3b5541b41831959d6afe21088624eb2fe208b4808e111a2000cb61e513a803ed3384018ba44b2457b2da9072276921ed8e6af04625dc880ab09ef538bd6b85c0cbe4f282b6439179cc788d0acf2bbd599165ece895f4e6dd128448a76fcbc9710c9cfd5be30db3617b901c8956c5c88e6a12d1c0bdc8f32d91a18b5079a7a3acc8c826b976b90518630ddfb92d112ef5b2c92dc6189b9a40ca1896179ce786e4f7535402d9c3c0284492efd72361a844628eaefc21405c3e9b89e40348107585287f0aeccc1522c86f793268f46c994b1909c2450d95bc4cdbe6849dcdb05420287bb05c4a335b121c05c9603e5d749545ba767ff2585f45786c55f712b4e40d31f26c4598044a2da0c5d9b48dd9f2599d21722425fba333298759752358cf0d9ab52ccba15b19838dc60746727dc3536ea67060ab87aaf20054d2a583f831e681e4971f0e2e33630f52cce047fac051e20270c1248e2c25fafc24b0bad522b2ffb68c4080e49217a3542c4a7b965dcd8c8ef021a055634d111cc37bfeddd09b2d6db733d14b123cc97716a97bdfa849ed6785a7617924ec4082654f93fff764a614cfa5174b30b9d385536d7ae690abb793908e2c93f330c2d0a32a00498216b6ca3fe7c1cdc5658fbfbf89ca9c5288f6814d55748d664a53060f797025f6c50bee288370f003febea32d1758f21657eecffb3c11db656303ead7f4320660adb4e1d8416212c2cadc675af627c4253a9e48a2db1e2ef76dd9229331998ea965974061b60fe16f4ae6671f0055a6eef17f3af066f65c99159a5a40607c7ae3168c70e7d72f8eb8261e3cb53a989d3c3da00429736ce019b8c1b04e11eddff68ae5c3e36270dc1f99c841940286b3a051f3a3543e7e7149e469cb359dd26bb73b24a93d4e7d2f877120870b6d59df06ed5100e07367850208ca7ac7c3eb83c3b10c62746423e5262a79026069d27662bd0d4e11efe78b20793983f7abd3541de06fdc88865b4379fd166b15d9d06e7a10a7befa1c7caf572ce32d862fabfccffefd9cc16e28e7d0ae089e95d59ca00cc8f499febe79670c0c5b85ae73d0868b2a4b342527820c26192fe53aa7dfe9b8a3967ef000c41584ef421d1e7dd4378d63e1a2d66b9a5265684d07311ddd69ce9eb39d56c2cbac897ed391a83ad90dbad9a233ed87d48ee3b10477be7f2039cbfe7868f1d25311edfdc2ca6e540796630fe6a444629498e0ff4181bc79992b0aa85c16d411c596a40ce0b09dbf093fb351c4c1ca2b9229f6d29acc2afa60c132bc8b552b7f5b3a91fbe9f111d168c825bbf942089cd4daf18142ca7074a88f20157b6693d30fd9f08943827f1816ba7346fc1f276b0238935fd48ef236de70136b5e7cb3e4b66c3d2880731df6ae74cb812137b24e0eaecb34d3f8362009494e339c462562d7959b9de028705e90548a51d951fd2aaa2bf9834e2ac33df03a743bdbd23a0707b419e3020fc8c083b4af9bba7a6432d0276ba7a490cb2fca24f7c6b36203832dcb30e29bf8f15f8cffc05af5dfb6aebba2ad3fe797dd0cf02449723d1cbef76a543501503f7b3d4d5f99e41e347aec07abfade7aae6a471ae43d7e35c6c0c53ffd85ae62b134095be4d344e7d5d8963e84fa1078fc50c7efd6954cbad87e0b58039f40bb0a79ce405f4fc4cc1cac3738b7550f43772bec56450641b530bf679c35f1be519e1c19c375c23ec78373c0df43eb03b5625fda284edd7fb7fdf0b13f22fc3d10c0acc3119f321f142b2e0bbc036834b55cdc3a00a091239922f25d83ba409840b87e814dbf53ba8eaac4d0ef41cc1cf6ef62753cad3bbaef40ffc544f87ab5508b148563fc4d405b1557f8856f60a2f49223043f97bc5c4b6f2cc5763b7410f9ddf9f8da761f336ffebe43b9102c563c8f6797e36d3080eaeafddecd9ba09b92e52f8514278415da775aa6475582d1ffb7fbeea1836dab0fc9cac782b47f4b6847439745391812e43dfbb3e7e73f4b3f102618ae359ed162a1b7ad09587395537f7f164f5063d1467898344fa629ed93717ba630acb6e88f259ed82105008ae8e9c3c9777c3dccc7f9cc600fae68826ca0794093792192d4d95ea7aa79af689901801ce6527f9e873ccd7a7df7e67bc9b68eb21bed1ba75a51aa08823218d410b8008701cb0e09450bc741eae22e7c70c674cc7dd5066b4f244cb01c3a6ffe686e2b4f80b6b5a9e6b2cf48b578a1cbd0cab2afcdc3b4c4033d423a77bfa8ccfbb081ae7c6854d5c90a048ecbf479174c63496d1aeb148509b4b8266abf6663f1ea52b3abc0e6743ff9480fdd0e5d0b1765135d87605674affc0f379f7d22ee915c61953dd21d8baff954df4708680c5f85559b485b5d9c22cad91fedf9182f5b58238e6cfadd250278e94b349781b2da4b4019e0a72261af58a5eec857b748593b56b604b685d1ce2352cea8b480dfd816f9c7a8ac6b7d7210d6ce6612fbc6cb71ab993d9f42f0a343ae4501cc87da4ea434eaabb484b9d2578e8e109286041828b75d562c755d1c05db81be3f717783b785b20976b5849b36258ed1ca0b6eabf18d447213c23d576792fdcd6c418c9eb9bb1836a36a57625e404d0d84c2bcdb7daf6f90493cd457cde1b5c47137679b245408196b42251ba0c80cb6ec21e48be059b9b9e169321a90d35aa4bd922e08a39bb1c837ae6c484784039944e4d2729ab0cad2173e7056c4b393dd6e3de32f0c7065ca50872a0fccd110bc26fe92006c59d5a0fe216b3e8ec6c9dd42250738baf02e1a16a4b2eb08ba6a390155559ab6c5f06cbd25e463f6b9de834e2124752a7cc0f5825f77718b4a08c74cde5b4b730f4ef637496f8298fe8086366493ff9c66161d985cab2a2ae634a5a006dcf3ab8e481417fe952d48e2b71580e3cd9ebc68f96d3314664c4669b8593ad2d7a349245dacb7fe11b1ab33aefc0fb9811a327f37eb49f7d48c6a18bd0c369164d17ac6fdfb672a61f5dcf19de38c698ce8311d19058705d2458485934902942f2ba0c53500e110da888963f3f496e677b2d75b8d8c5070d56e2c1794fa68130db3cb9c2ba954259adce7b4f71b4091d3e5cc1d2406ff2c143abb0979f5f72f6510aa3b853960f0d997a43fa2e862a0fcaa9ce2c29fb6aac9049171a9fdbc19d1488b6aaf08687e92368d02a7b57697f35fc8f135f5b16505fc1f734688c83f06505d7450f850e1c128fef6cd86e754cd666e90a631f760cd8687ee02cecb8e01b867b63f2c66228b79999bed8eeaca1ae7df1375c1f339c07d5f11b7f5801a14a39974496639ad5fc5ba84cfac53c48c468c82e75d1382358b154ccdd3759b4ef8459a0e4b9944f449282d3036403e855790b55db62bef4a396e05da55d7339c2a338bedde5f8db4926c425f634b272eb17fd6ebb281cbf13bb6f240b07a3e15105619d12d892081e724de9f3f5e7cf52459e0a7f13b2d913ce24068e78f37bba81b51ab27785b41c45e556ed758344fe8a89f75f2bc2b3603be6f5ef5aeaf28c03f05bda42497f46ab0a01180219b83fd3d49361a1ac41f87fdaa7be2635d5a50a78ef0943d150f274bbd85e426b8e2cc608da253da2505adc31bee1b9cae62238b1e510eea38b64a5f9040d7cd2f97125ed5e7acd5aa1edfba5a9d50edc5448096f65defccc38a061e9742340a7aa0cde1f68645031d0ada0d41395a515a85531a23f7ebda10ca4c9d3c42fa24a607f3965e535d88e118024ea577aeca53ea2312769a7716e1999f7e9a0a2ea194b01c55d58e9e56e78c98e8a48b3f118910325013086c180734a7807dfe9c7027ce68b652f5a287ca1f25e478383b176264f02c6d06088c364f3fabad08562bd4f7089d909e329444946e52870a50a4ed5d80e7d8fc7894000ea4ddab406c63a3f0a8837de5d744f3ed9c3607f37c1a50d7717b716b063a77533f1e900598ea63a932a61a52ed901425efda50489f451a8b80f1454f07a414450bdcfdce5dab9be6bf77b471ea0fa964ce1c19beab1666a0a38522fee34f07d67abb444f07dbdf50dae3756ee232ce7fc9d582e6116bdf0ef0090dffb49c936c165e150dac9c7f247db3aa8fa5c834fa7b82dcdc4d96aa76429e4011a02539636a1676ae965e238c091c6d17d85d06f4ca64f9c054a30d0dd1a9b882f576c37ab11867f70360549d0b9d3030617fab6ba688aa341428d0dc11f8afc87f15bdde21d1ea2fb238c9c50e6ab3d4ec5dee319684012285675445723596a7d370b4cd82f472843017bae08493c27d83c3da009badd2925f64c868b1f8431acb243c7862470ba657bd35db850e52cf50e5f540db4bcff6dc456dea33a8f154eadb931816648c2d6f0d54419ec56dbf5e7de795b696648e2e69c93c21494121602f320fe704ef420ffbedb586311b56446131a04cebbddb59cb77d2c21b2e5295bed55d3ad5fca57bfb80b9a4919abde9f54cb06bbe27f6407572c880bb75fa28a272937cd480c884602458a1178df72f7a08bf3644517308511b7f4222d505d54e3427770445bc356f4d434d966a265ebd3071f550bffd2606c63252e2da56494d64e5a62dd9716d9b4f8df89a1b04c95dfed4289c8c1b797ab03e5345d688d301a1641e20645d13c9d655385f78627ba0f411df2b7b168cceb6e290d2e9446609453b82b7396fec715c755162ea40170e28bc2a17ab919ae02aa492be7c971e5bd740baa9e0af1a4ca6230e7206f8c4d640d0377e4dd543cf160f50c569cd4ca0c3874fb83faaead9d2f891b4be3ce91ae95a5ed0b500811db7f7627fd061d60813564a2396723310616b87498663f178589953c959abaea5d3ae3393fd07966557a7ef2e9f697468ced77e4edfb97b2c76ee224023355b64b40cf1b3660720d94c45df5e2021d44eb986fa63ad4395c838694f365bca00abca9480fe352ab36e1100459df4a9d748381fddcc1792561f7605ddccef7d5f1a8f16f03fff3bdfbc75b289ba6403cac676c7affad0d89961540e50ccdf590f42cd0e11cda2c70652e22cf6e92e920184f2ac9f905757b676a0a536701535421dc34de22e49796a8dc2b5cd3b20ca4a135c8f627006ccbac3e463249582a72061aea430badb95a50c4f44ce3ea962a563b1120dfba66bce9acc934d56b8d17840c1b3b37353ca058353309e9cac672ea3b232d7ecfd6997c093f61bc930d0d633342a819d6e7dad84211ebf646574af5d1ab8538a37a907fafbc50c4565d9e9f38f4322c474a5c45723cc078be6beded086631341f943f1fa25da636a14dd004ee95792b3943e7ba2420874ffa767c0bb84a28ce5d666ff22eb85836ef4c64b9d61a761bb9c31c13cfec1de2cd3ea58844d7004e7bf1b6695541d58f85c859c83e3b563e262e1a1354896ffbf5cbcdce2ac9f14eae066816342891b2e8484c734142f417e8619067b70c48a09195bf154ff4926513e46e9c8efb9d7c737cd35c5c5db10c9b5c94c7d5c36a6c276412a869c2064e2ff5c6b0eb404c6b3598eeabca1713171c9d5671922d63adc6f1fb413a04fa2358c1dd01f65ab9babc4f1eeb6ce1792b74642513e87e60430e52d9f0186d6b738c72a123d657f6a9f1bfcde0917f03297ce1c002d1cbbea59819f36d8b2b567384d7b5b933baaeee781942e2fd0d360c8a2fcb062708be315854650417931a225918fc4c527eb9887d87c99f5aa76a14f6f817622ba6cee6813649006ff4fb64f6cd70d309f7f8596b73003fe158cd307975d23d9756c7bb5fe68ebfcb536d7b063572f0dee9a965511ca7c2ea20bb3de37dabdc2451b677b56f9988f371cfb41ec56ff1555b4a4480cfb227bf88213cff87592e38e4b5320d0e4dbb3f5713e9d4fee106fe92fb499289d1c8cb2dbc24dc13e9264677c664f4455f54bad3d21e54042c6703023609e862853fa1b20d211c65ff5a4d7bb694bc5c8a3185f7dd9887759382b10a867bfb6adf7d88db661e60fb2db77d464a4a6dc8584ce3af61f0e23b452d3d3a5da91752a3796d33950f10ec431fe2e93172492d573fcea70fbe80dee9aff6337203bb8da203ed26f71d632e514c3453914dcb7015c425747446142edaf180b865c50b06689c7598423c4fc47bebfbdc70d62edd4c16d7c6c770bfb552363ae52658c9e2f8d42a3d981814c9acd343764f812dd9e019e7174ec72eb512ff591b07bcd438decfbba08f14e0c454034a8afa8d23290277eaa2c1cce24455e084874c3a39ea033f47c24337c17a6c23cf094d863a07fbe0abf6a443c77dabde5529325bf14f7a58ff2f61381e78ae7444750f7b68309918ac86b70fab9305ee987d91904b36a6ffa8a3e13113e4ee4491f863f6b586c42dffbb7ac943f63fcd9152fb263f77a79c4f2ebb3db23198af1cb542b6e925be4ae09b302d3eff198db59a39831ed88b438946ef08e3921a57490125eeb7f7a03571fbdfb7661334a116ea80b29e6d638871a0e13bc8e8098994c588fd1b8af01f34e39e784369bf531df438de50623203e84cff3550a8b6304ef258855d547cde04ad02cc10f0e3cec8e36e399342455ce997021fba8def35abebe21bfb1bbe2a573edacc127f93a58a88ff91b4fac686d026812ba877c08d266e9a4dca11aa719bf446342439b119e309220a0b4274867aeb01176228f2e32e3ab4896a85df14a867994035fbf30ce2b19ba066c4c0c4515ccd060707199c8ed882aa62027fb056ef7269d2abc723ce136ce806e35b3ad2a1c719b2bf97d6a24278c73bf357277e4faa92bbb7d3b77fd3d36c0e057c189d365e0855e3b8751ede6034ba4783f1f417b6e80f4e43dfd43969f469f2601afc06b63d67765bc03a2118e045a1b19cefd7188cf15f437e42db21037d58fa063d4b2c356b9b4b30366697fcda49fbf786ec6a9e3598f230375acf9914151aa7578db22f069121d30e36427a65c42eb031c31d6f9c687129e188d0fa29f1179023f1d0359efd4aed78408d5379914da957e2480fc0e228383d0dcc02b2bad1ffbe854c2c785519757da801e1f7b8a5bc06ee999327201b846d5e8393d0eb4381ea1cc02b50db176d14c99f862af53ab9ffefd460ce4c5b48565ce51a09d9b2647e94423b9d7a7f5adafd079bb261ee0ee44478b1a9c2b43ba22fd44c1f18d51c2e2dc01764de9e3d096e8692d88a8fe351fc5d4a78066b53ffe5fcac340ab478c7b7aa001279738dd4415c3af07220e572523b1ea8160414ff52b1a32dfb42f15b040b0b96b2fc85a72536e33e370e69b624f6079fede061f917b1a44deb63494d624a2499dc898a1e55c57543669771c77ee24e53ab40027dd98804e755f790ace5a60f762a78d8ed17d111202871658a7493dd112ebba3d9dbccbbf068fbe1b8cf72348c48dce522854d4f40c997539314eeebdf2782252e13e1ae5addb5230da07b1339c96bec42442045e7c50d0adc3604fd1fc7879e0e3b33992b8438c572c5f70516b93c31e210f3bc6193efb6678d29c45d828e0e6e6be1be7ca6e38152a9e9378e3b2671b681ed3998b10826bad9b9173e365ccbe52b7db241c01b539598c539e849bdf52d5e1c1c0277f187b38d78a09d0743689bb6a6f9a8a62d123ce4a73e77235268717c01462d8f4848a1e38857f3673738b83e1bed31544b265ed598130e6575deca4937f1b013e55a04ad78ea4deca9c40357503b2ac25a7128baa4133017498a3ff097f77f3ded5c33528978f5c01b79374d00a3dce6ccab0690a420603c1d8acc77014ddb827ef0b19e849291ef798a9129d25b042339010cfb7c37d043793d606bd93ef2c5484eb48add42b086b212c0173ebdb8cfa892ba7c220563fba16fa02d2424baec9dd4f5b9bdd3a7974df7fe9dd39d79c22d658fbb8a3127894e91d0e52d8dcc74b0cb7aa24efdad0d476d9e955f31b9b7e9ab84f24c2d3616286bcf016f0ae016f420aa832b5c259a0853ffa39c592b08d4e1a75411373a1c41ec57e7853082b101e497e01d03045b55089148124c605f9ab1b41d0e2008deb56530da7528279dc42bcf8ee786c8f52632c8a48fca10270365a5a79928aa12b3d5a81fad37677aebd7ce404e9cf42c5809093e09e7f65cf4ec639b6b09890daf28da1347c41f38f2ed0af9334a0e5565d1c3f1898fe58466507f7b2e368e50c5c0ce71158fdd382e2f681d45221d507f6eca8bbcf6acf44d61570fdf3ae1965eee15ae3cc2685b49b98e7e2069d352617ed7bd683b00cfbe6f8903b31aa151f3a1c9640a7f12b8d4be1af4cb37e61d8a2c688efc98f2c839ae01330601141746076725841f209d8658d3ca6214d5f6bdf777213d098708fd1a78106f2efa1e248262c7900768220cc6f2a538d7e1d242a3c7c497b35f2f9c26772ddf0846b540183dd3b7f898d65e7317738677d0689f4d57a61ffd8c0c11bf7f7bd430287e25309ac41efe6e7154a5dc8f8c17028c5dea040c2e84adbaf5dfbb09c520c7f6abf808bb5f79d09a1199d38cf549379bb8bc46a216247e3d7587f6dc571de782ab76596217e8b9c34e7630d7a11bcabf9fd23b7315019766d7a82406b9378440c3a1963cf44621ee7b7cbaee4cf3d3288ef35d6bdb603d549ad678d1060b0dabed664f443471888ed39c8b4438396f78b1cd5a2aa57cbb45a09edb71c52a2cee9fe1146f9740ff10f5a65918078fc0c17bfd9ab184a836973d2c38fd5b1d56c1dec43371c078e9e0b1f361f04378f2ece01364b4c87147dba18b9d4bca37246c5fa08884c6cb9aa364b1d6ac0905393a937b581a78fa3b2c25f3a284100c4d0b4e1f9abd93f4d484b4d97efaadf7981b3bb93ec3c6c69901ab33f269b408c10005a1c0888c37ea67879cb799fbfdaddd43863c24a5a535c30b661d364109ca9cc4b7780d02260b2eef3facc50fd8932ca84b19c3638183d766bda02ed73809a97a6d23bc6745bdf1aa1ccdd50fb7b98e719e75801f24315810bd8b71bc073aa33a225d15734c638674866bedf3be5ed390ab13ef29d2220cbd4018a70b1431caa4db67b7d7b5af7aa200371cea9a628a20b7a1f6221e785f8bcad4fc8537e1ab8787bc00125e75ae60ad68f14232cd5cd00a001e7ea4c8601126a9a4a73866cfb114624ec8b1bd2e49cc8eeed5e2fa1b83e994320490a4322be28796b527850fe528ebeee1f9a0fb08154db3feb4992111df21aa9f296cbef7b5b07ae92988e335e303cc2bf5e03caae2daebc43e27b23d2889770d7f19ba7e3a83e1d31d83bdf428f417aa71760aa62a95e428fda743c67fc5f6b5c36d95aa3459331c3c35268ae82f663c7b0bdb7c2e3b240b3cb4c9043c847a788bf3b554489593fa0cbdbed912c07366a426becb2e83ff15266742417c127229aebf614ebfebcdbe353c2f6244120795f3f5ca6e5c246205e2ac664efe1d8faa777e7a0a120b7f663def4d5683f7268977ed467a86ed2298491b4de9e905cf01ed5e1d920951d65e283960cde7b6c505518295e8df57d5bb5d43aa05a0c5c7a2f76360f5c7aeb3e82b07b3374975e0fa53c0ce9a0349e5bb26eeb29acf3e53fe6deff7d934b9a6880188eecbad3b7cc676214ad7451547d0974a0b8b92c3f425aeb73cd05fca0d63387431f63d069ee9b9cc8f02530bea952c10a2e22c3b9f1e6d088c9d3e6e87891af41f700b9b35a86d3d555327c66b8083d4ecc00e4e6ce0042081d256d532802563dc212901c3e37b14e9d9ab137132506e397f27523c819da16fd8c6ffbf7034b6fe46c6afb9ed48fad57fb17202573a34e9450455fffbbe52966a701411ce03400a2a035cef280478d58860f108a062521ce07a27a9bcd575314c7fecfb120ec80b9201f1c6f53c11b2e720ec14a6cfc681b69e18db21e8334c393b4583e11240aee9d7178dd9d6cc5f61998f065c2571e314a1e4a60504b62a732243e10b205453d8d56eb7fed58d2c384be1a7d79c947cf1aed9361d1ea36a7b7094e18f33869105b8b73f095de1383c23b326c079ac67fdc3416b3252b8f0ab1b89b1f225c4a74e03770036f1d1cb661e589c422a9dcb3d999498a2b60de6146fa4831a0ed89cce118b6a66f6889b5bb9fe7392ff6169060d7002e4931811a58d1f4b8b2f7953c249e6e808f22871eddf977cc4ee0963b84d4f428474a4a002a9a9fbe536df0e33c1232e58e504b0aa161807c67e492c57ffa6bed242c85d8187901d8e399757a6a921e9c10b3560fa96c589e2fa00fd726b2b7ce379492701fbc2d42b2e6c412695cc4a07e750ceeb252f413a311757e22d25db2b59957f6d0c95269b2202e13c2674536ab3109ce34573462b58f7d82b3162319d24adef365d02209c23ed4add2334309d74ca95191a42c42fb38ef566a1439aaef929268c7872ae360299b2ee00fc4f4259427c98c10a06fb0571ced49d4cf35731e4678ef7f5f37f1ec7782cb414ba51b2e031f5baac7f070543bda03c44086505c171f7e5d866ce240bc2b504f5f809e4ef459b7fd1e36037aa4c05423d5275953d4d911e759402194b25e350a865249d551e4c2c7717a7aa040568ed37cff702b547c8b19e14753d23ca26dcc78a569785e6105aa2c9cd852020311eeb10a272f019f2ed5c68870b23e96538d8779ac183556134935c1277c3e85e0e893cc1676424fe202b6eda1411bf5ca98662022726b63071555a243d416bfaf8c0471e80cf24201ed8c41c2565787734f67a2ddd6930f8e9fdae30dda0e977e5d86bea85a91c62dc8921552359f037908be19a56ae053960da09d53110cafb1e1ebc5a8ce787798dbb6394203bf9d8123b1472cd1092b94c52afd88ab267933c0cf16bff2e19c8d1b53de80b2834e615b39af09a3192278128b30624a2c179b46218864dc72d1b60f10b120e0e5a866942a6a2bd26715a81376144337cc13687162249575f6d3f7d7a4788037ef95909d5e832785ff3e391b269e3db75b2cf95783778aff49a328ed5074e39298e673c01a7acb3cc8c280d150271a6ec5b69156dec16622b0b30b45d193b0950e22a2f632f1d9fe1fd7746e28ce88ff14c24a94b8a92b89df70bb69255741fbd25b0a8a093c5f5d995b824d563e87c2b89f91a51cace6bd122bcbc778d9c0299e7c64846f61ebf43b297d47c5ecd7e44868e0cdd3bdd423150a85e4bf7e4357ad6fe1532e26b898c47fdc1555917fb22cd65567c531e47df9451eb144c291aa906ecbcbba38c4d4f63cf5f1d0d6e585256d675c4515ab204e8dbfca9f28d17d64d722d1c5ea996f3432f06fc0906166f5715f425f0eaa7ad81c7cf6a19f03cd4c3b2e1f9935f7b80412e2c1e09acd66f817d42724ed31b7a2bf23a3d3fb915adf3f2145e3bde89bead0ad9662137951cd961809ed9e38f707e1ba0c533fd0ec3a2a6806d87588d01244a0df8c26d372f3d0fa1f10754feb299a228812de900c95a63a5c6491ca306601968fad2f342d0969aa7ebb866380ce4bcf6ecb1153799e5ff024c3c0480e965ebb5a2014147d89f864d0618180804d3a75670643939f5983a76875fb9e3d61a67795ffb3caa608789261430ecfa2432a2d93b32750536c1f0883cfab271bd75195d2b044a88e0b7d1eb139fd3f74174283d012e352f1d7779d8a2d3f94b5b656d63d930e8350346a67ffedd544fde174fbd2f55092d895cb7691c0f8427d0cf80bbd737ead912d9754dfc7907eb8d6654a897959b0d3e1fb887369be8519714ad5b29a0b6945dee9e571bf260e129edc8bdd809c52703301c307056a1603144b25058d8712685ace784d8169992c324180f8554f010960df5cb3fe14e2703c223a9040c037d69d520f0d0f658a629e60954d592c83f35ccfde1a1fa7d7c65bc57b7049dcf30b3603343432e7d40a916dd8e243928398417c7550bbe7b7c106c9bb8ca04a03eadc9d942e6e70c7d775707456972d72b33976520132eb9da1c095edfb351254fa8fe2b82a5ac4c9b46f7ed923949490744a54cf8b99f47eaeef8bf84dd0d47d6b8dfa6ccb54f5ea1e32316de36dd2f11152f631bf9c35213e13cf3071f407d2a55f682952a1c490087b74056ee51391fed65388bc074ed47de92ffe6499a271c7490b329fef5ae30a4785c8dc576c23a9fd16873ed351aad952fc103576c057f612fb0758c769d0e93ef319e2531702881c5d4e0af34547c02afb6b41cb126e1c32dbe0749731d5f2641e2a939fd34200c1951438da8be5326f721c6d7b35c924d557d0116c5c79ef4daba1c3d7b4a3c4da32c6b63355a3fc921ecae1450f30ff17383b9679e18f7ff0a9b35ccfe1c3d4cd91b3d9e5f42716af02a779329afa094e3a221f79fe166119573c78391e32ac082e6d95b829a6c5e37eddd2553427d611ae4e242043c44e260a428957b14382075b9771e908ed0ea4236cb38c70305684c842b91fa48ad9ccbe4864b11e8233ba91d1bc860f4583d2139558365e8c6f15122f2160dd119934f550acc464d2b4a2ca0891f691348eb53cff879022a5697ff3d14a1efd389d99e2ad12471e50520865ad576bb92b39c33297cd1c3d250d2f29b70f84f40c0eca9e860d5197a14c863399838c04f02f89f5abac10ac3ef8cfc12fb9db38e0c6d0b1e36e377c73be1ac1b0135516d4cf0ccda1c49c07ebe62ee87456f5cea1a401467a67ca662267392025273e2967224de54ce0ba4dc41f2ac83310aebb70fc7a013d312a9b836caa9946c41a57f12b7137084d5d20d40ab85fa6485b0822bee58ba4a4175db07b2e151d160d5758ff80f14aec6427641d7c23e5fcfe00e3e241123a276d287195c33fa9e3897581617d6bb8788ad6fe6d75497e751bb5278659063cbac050910007c3edb49859236081ebda27a5bd091a1b373296c94bb8191d8fe72b0fa6a239264bc22f5a9891c8569221db4b75dbb23a7014133904423f97ec7143d113833c14e546af07c6d1faa398146eb15e65d5e479a0a35d484b4f990ad5e05b6732a7728ef368a001bae25b1f15e4df931704e776d417ff178cb9c5aa0ff472b2d3497494072cef817c376cdcbcabd6f33e74417466bbf77bc71c402b933b1dc90341ef0ccd9e4d0f0d44b4d70d87658de0ecba3b9decdc187b98ee35e0340a59424df90db3b06faf6f4f73c2639796df703948e8b12f021782b30dbd14830515321312cd18356238b4851bf39672260d17e4743f87b706b5be3c1fd18d5d27a2f04e2cc65174eaab0186ca9b08a9fa26e18030eddbfcb5a06b39550b18d8aa9b41ace0776652d60cc2131e862be23d8b1a020eea2bb6ab582e581133e18779e9037c9a775d3ec6a279409b6ca7383b703a838f4defe96f0f60a7e3f327b6065070946c4412d88e2f6e98310fa5b2b044aae5905505de2362217b3c9d51e64c04431478722bdd3ccb276e5dfe72bf91d528cad65a065a9ea6b1956e58cab897c2f116ece4272e140d59ee4979a4223db02e20df302f4dcda09b04f261de5d0545c39f62f6828e394d38f47af161afdb5fad46470919f41e3ab3b0cd556c4f24ace2cee643c75404df2a6d4420e4e21f3d123e3f3e6ade955b956001c3f808659f93f9fecc324de15c9d5956ba88e31bb2c7958a9ae823a86fda488eecd8c5d22ef09538285f9b32cdbdace01478a9857c82add29c46d2894d7b215dc392a1326d224a0d2bf64ea0018bf4b5ecb735c1ec34cce4b37575da1a63861b8dc008a6d4022896129772506bd17a73f8752dfd3e0ab016e9da07a40a832718ce042d8f07032d04e7bc763bb023971f41c199839f7eb0d0e5d5410564e57d5d6f908d4c1622aef2e71ca0b9fb05c931e6c42e443b3150ece85978bc109d39b2c30db2f04680fb4aaa350d6a65d23277679070c5a39b8f55906954376d0649841d258da6df63d8970f814e4b9f3385a91ea3a2523f978167b849a21bce86062e143533c342a352621c7f25827df47f71bcacc0c928fc418376cfd4e89ce80a7e17f4b97f9972b4b98ec20969e629ea4cf53e7207f7db2d951bd331266ab9fc4b511df2d79a934563079b3adab41a74d2a82cb361b7ff0016970373e1f7560174c0d75e1f4c4286afa1e81a1a0b12ea61f3ffd15d9a43cc4a7984079f40b43fb15558f70f97f1e212817ef0fa8cc2a41ac0ebe23371c7486da6c39cd9d8fb3414c4685b2d8421d42bd1a3b852a170efea11e5fbc487651103e4797f88491e3862f3a436ecd493fc78a2e181c12a912854d3b107f716fe75c1eb965db7c9995121f5c432391f51c5fd93b11f37af442f0f4d1ac462e31817d2733012588c781bd6feec9e661b82c239a89e90757e30e198e7d2c607692913fe5e5d97bd74cd802e46a0a3424513b792deace4063182c237751d2daecb63eda35c1afe27117903f110d2181fc4d2d54313ff517bccfc1c12177f65fc847bbe61619c9a66957973721c486906345272e2c3d6e3d3b079915f579082a476f49356f0010ccee119db15b0d6fe24e041cdb8842a030091d3160c99d46e21421558be4eb93aaefd9d9564595f85470e4083cabd208c0f8fbdcfe885e192368346b7391e7c2cfc450fbfaa6e4ae6a9a4e3ac234bcb25138895d5c11c599a62dfe7a5774cda0efb9cf425fdc9be8d571c71990e482992c0749148b7d964b895d77e5bc0f1e771b886ecc7fa8d8ca535950276c05c1f9052cda653ca98d05d682181492f9307a6fc2edd1dcbe2eccd03403045f47ecd1b8a50abf6811d94d0a15dd9f20016a249371bd92461c30f81c068235906c2db8f7254bd022b68f582cadf0aac24e18c2e48438a3d39c4d6d1112d5077e878d9d46794e66751ca7e09d5092eb05117b9decc2f4cf5df435646cc27318b30f24b39221a8d1ca97e03ac68532dd6eec015230a4eb7ae4589200fd19953a4b1d2e85c8dcb11d9d09d18927bae8bf4d83d4d800a9704eef6e8b7f3d2419099819fe1360b84f9f0ca4eb9ed8c655f52946bfcc8ce7b0c15000286cb7c1d31cbdf9ae98d9d64c6be1d6971f0dd4ceface357f2b957f05538d90748088cbff80afed401501de5ad846dfe40ac2a8391945d4e519c1b817a483f609742257ec20090bb85acf6247312256613cdc9bc3ccb8cd407dedea86ea11adb379504738103b2e0ede7ef081e862ee2719cb874eb59e3641fbe4acf5a2a1113074f37579b86b8d2926372bb5c0b53ae690c39fd244f2453bf00b1906e8bd14ead02273a82b9082ad07aa99d34529447df7c1bb5bf8a78c2ed6aa4ce376e1738d897fa1b6014568da6dae712c4275e4d513ea14df694a72b4cb7956b20b94576e90c4f4980a9f2b5220b6ffeb00b41a69ce3442910b6634cf67a67e974a689cb315622bcb9ac68bac491d14f3109cc847924ca52df322467c727fb0fee9f25aab8e519a22187d0d2f876a89a5eed13e35d3e07e1dd5b340fadc1f68014339560152fc43a83656ed51eec245bc35adc39724270ce7feab68cbd95db0ab5b76275e21ee0312afeb13962e31daa6a56e4430cc65d5a8bc0f5d3d2c00239c33c4ba84e0d0a3c712a9faa630193c81ba2b2939d7b2b6d18dd530c98c081a31c9303db9aeb23903b507bfbb029eb3846f9f886a20eb63760d6ab7f4520d68ec3d9d6bc435f1857e36f18075e121ae8601b3cf64d1a3ecd54e4b2f2755c6bafee52e9391d76b17c192349f3e00b2a71a1ff8a89a8760b58e2d482e1854233f0ac65ba3e640eee5cf3c2272a47378a304128679dca92c06afdfacc526805560a0b88d3d41aacaac213abb62bf3f5d46c9f6a2429fdac92f8640210fd629f73de667be0f6c21c3efd1375ca02ee7c1c6e16e3fd6ba6e6454fea71332f55fdfbbc3e4a59def2548673f2d616341b37ac2c70b866bf983b104ed48a1b1497176c789dedc11e3fd18b756905a74cada58465494f34275c0db253065faeb04b3b28b84d411758463508a43a4fc2f32fc0690cffd74e3bbf34c56e3c7d5484ae0e5eed3235ee8c24448d7b89d9147a7067e0f05cd518a9fd8526bfdd889ea238d9308aa74247e74cfa0bfce2e7946e1c525bbaae08353dab6c8d91247a4251b259a75027f78e65807a0359d01aea204a8e0195f08b1cfa27e344961813ac8c155629feefbf6f3aa1d10886a3701007eb6cadf9181c199897e1bd7f664d6701daf57f050ccee90243ad33e4876292a81b94e0a759284f0f4d7420a5d89c08910614d074bf555228d93486bac93ae300100d29af7b4bb1a18542983f87592b29d3b92d0d414c0ba0c9eb5a14e1e5605ee8e2dbc5339792d7e9b61294a0ef5fa0f81ea3aa4d4a24ac00adb36e02319820a18010066b65baf6d547292b9f00529ec30c941d63c562090301a71a4ba2df79757e095739d879bd0b117bff8fd90e712111ef2e1fc3cc14bdda114b56631a5d4db403901008d81d36aed4f68965bb4f4b45476800ba84d09c090163f33d5cce06b4c01f4b01ced05baa9d7270c75fbe10f2a2c9e23c02486f91733d6a4162f824a80dbb80f0a0000000000000001001f0c1ca735541137005fe46fe35ea2eefbee946244619eee1cc51309912474b464bf3de6f4db91dd44c740ba3a8e7e41af2aa9df3a775b56d8f3de362ec2031c diff --git a/zebra-test/src/vectors/orchard-zsa-workflow-block-1.txt b/zebra-test/src/vectors/orchard-zsa-workflow-block-1.txt new file mode 100644 index 00000000000..8bc02287f09 --- /dev/null +++ b/zebra-test/src/vectors/orchard-zsa-workflow-block-1.txt @@ -0,0 +1 @@ +0400000027e30134d620e9fe61f719938320bab63e7e72c91b5e23025676f90ed8119f02d7bf0f7d0d11636183d03c1dfb8992871ca2d609d1b3b7f9026d326f727d15c10000000000000000000000000000000000000000000000000000000000000000f2fa494d3fa60c200202020202020202020202020202020202020202020202020202020202020202fd4005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020400008085202f89010000000000000000000000000000000000000000000000000000000000000000ffffffff025100ffffffff0140be4025000000001976a91475dd6d7f4bef95aa1ff1a711e5bfd853b4c6aaf888ac000000000100000000000000000000000000000600008077777777d80a1977000000001c1d1c0000000000010232de274d7acc75ac97149e063106e7b2c306e156fb53ec5683c0372d382b861e5c6bd944d71a75fe8ab41560cf577122400411d316b553461a28bd01a52042320b2176905f04e3722c1ad9fd61b5836ed7c730164e6c7ad338b62e268133969cd9e88d91459a64ab94d35237209892ecb01560342c4d66731c92a26739cf312b9bc671f36ba61f0ccaf721965a1c544cf52cec716f43f5ce7594fd7a38c5ae25cf0d5bba65c1ea9d30ab10d3babaa27b49398a4940073ee28c309ba1a78c3f103f57cfc000a1062bc874bf21b2aca3e321ffdbb6a0d5c91f607e4fc1ecddbfc31902f6c18d1a33ab0f2ff852d7d3e667df7cbfb834578536f77bf13e6103aa806acf3f1142dd58fab8c1ecdcf1853e4633636080ba8ec1f20fc8ec32610c89a951127994624845aa17c68c59e1ff7c33902cbd135f0e238e484e10825a95bbe4c04de01077aafff36868aa134986cdf19bc06b08cec2af46665b46ed87ae7d1682a82a689629e60834d9d78f03328a37b1be8a76aa32870b88994a37393a7ceb6fc9652af879933d662dc3e82e152b5b84ad85959544270a1c4ecbba82dbe40398bddb449596d8175412b5528b7fa08534a603cea9b402734316722a6c0675e7e5155e50014c021baed8620720e57d2d0c79e0db3953f5fd6729a44c1fd380f9581e8b7ca47efc54881f54cca709378000ee4feeb2b327156e8d15b99ae7dd4b9d2b29f9adf8a0de4e6edb1ea2d6e21b93d6f075e9a4514327a53c03618961cbe84760aa3f9376ba94bffae846e7a592283b990f0121d19921d2829bbf6e8de3595f28e6f03547dc773a0a40d36ea2310f97b289b8e51d4d2c5570134f3a6e5f615cf0da21c850fae083d539bf83807da707a1c1c8017e1365d9eeb60f3830e2b90ec793f1c7e1157602c871e73efabe209f2fd1742b3e92b69ae291ed232934c3e70fea0d6f0d3ed162282b6484be8e08b3021cb152e6a49f73c906d8dc4804900b7b96d34ba082e5ca5390b9e405160c3e1373efe270d7bff197cd1179969604091ca3e5375cc31cc41999896cd33ec4e5fb950ae4454f570a2edbdd6d89f39a41f3e15ced3efeb77bf9f3028d33776ad63835ee6c542c9467e6951275c099574f78a3a336d77631e55a98bb160b507f18c73b0be251dfc15085e0e215d34bcc01095444829fb794c0a97617b0928f8dc4a3903cdaeb92c7f3a8feb7f012b7258b82573539183953a67d80535f296bd1365f1bce53f39e14099fac7a673f0c09797b18525498b770fdb7a9d4b4b72e8d142435717426e4f8c5a3bdbce2b5ff21d429b3abf310f2aa41ca3294e10507c52c7320bc9d5faafe6e5fd7106d72f61c9dc5341fc9de535f6d2511f737bfd47c8b7413c4d2b41dfd9b9d8c99cf74d60a664052813ea9bc2404047fc31d5600dc6a46b9b7ff03d99d73daec27485cb19a2e31e059bf8ae9679f62bb86f0269e171d46883f4140545dde2eba26c496458b470cfcec2f966f658b790a39997ecd6cf2790d6f5da81847c0027be1dee8b480338664e1c61fcf0311802fda81b1da6b375a7efb02b1bc5518536bd1534a3b4994b980dc2313bc29607fb277d3e5104721aaf2a9b85bdc86b9cb4bfaf1ecbf16632e2d2d3c27d86c8cf5037d814e74c70a13f07fe8cb2ba7b7eb3737b2085f3c07893dead5dcba68fe41c74dd2ca102456f68248e21f674c06a87ccd997410b0ffd0e9d8d638144a56b5128d4fb597e88d71348727d5f42ac222dba55f4d6d15b4394f42f7926f8f416c6bdb5059585f63a4722306f71b9939234e9b813fbfd669f2f1367684fbbeeb404113f2067c548d02d5278e4ae43123069aa794db95d64582ef5efc6e85c604b2c8cfe7b674b61ddd6cbb8f5b134d40dea6e5cdb90dfb172ab0c8c830ee7f66843bea19b80c5fd0221c266ad77f2b31d25e71c4014e01253205998c1ed6d308ac2dbf2ec22d04232cf6523b39eafaa0830c98bd52d65f60cb88db981e9de1d6e239f30af6331c58d0ca45e8056fdf3d2f50d349afadef99add2b4771facd4623dc34997536b15aa7a62bcbc7fcb7690bb9435f9d0efcd60674d682d83b7cdea9040cf2d02428f81aecf9a47aa208f5f6af3b8ab70bd0b455fedd5f79a41cfd801a8c7776820e2d1de7a4767a65a81a2373e2b10c3fe018e03a8107d72117a6f22ce0e17c4b36987d7344bf3d458adc4f04b1e00b01c2a37115772f82c90c9c3607efdf671effc3feeed437cda9292a26bab6dfc16d5bd04576e5fa858fb1ed18cb174539669d98eb7ec200e65f6553d34a4659c9d2d03608ed41a5b099ba86184f3bbf3fa23461b4bf142f727938ca8dea636f31bba3e73f6a2ff0acce72ae4f604ae7c6121a1dd219ab7424619fb7e81fcec114a2c36d8f45ca424e9fb07ae2935f1dfd8a24aed7c70df7de3a668eb7a49b1319880dde2bbd9031ae5d82f0000000000fde01c3f6dcb809e2f2053c78bff8d879d80e4b0bc8b16f9b90d2d44cce577d27de624651e8b14c508bb1241dd373417196462dbe9f7c59e938e22c5b6337b636c6ba25fc82b90bdd9b6bfe0c13d753f0ca1d8717e56ae6a0ac398f62788d9dab69ca67d5c5b98b9a86ba271997e5871b79e8277a4b11ad09bae366129dc04c211318756b7421e22cb0f0de5144114e3a7bbb797a144c876d5d77e3ac4d6d91af824bf3ef9edf2e798619acae2589a001e3a1d1aa2b47bed1c09d2aee2c264f677079202410375d2f51b748c36c480e86e122c790ab5a8effa17cbe336dcaff84e2925a9e8a3130f30cec1dd260ef6949cdb86a943cc248b7cdeeee5a14326872c1f044d708dcbde6c2c9a0780285025eb5ea4ea189ca779b07b20619f221b17cfab80c580ab06c9d27a649891cbf9d1442569bf7bd189805015d2ad25503499a9c79679b21d9b2d835dca3ec8f2ee14915ab9f9e3b84e72539e443142b4f21e496f3fc1c669af146cfce7b43ca7998cf33a503d4d584fb7cf5379d07d604c0d7c713079347c79c9cc063293d35739fb42e8e2a42d80329818fee704d805ffb7f5cfa837cfeef10563be627f4759b9ae82a6ed9f1144880db656139fdfcf2ad03e71249fe83101021989aeebe0c70d3428bb0dac4017b8b3f755a23da64be6a09fc11f6b15368ff996650c8ea850b2476ba9c0ef2da18b82da996075d6476c58ea438d63f43b8aa0abd77a416f4173cd57c86a70e8456577e1e0364720b89a606077b79da39275839509ffdaf8a25500ba11d3e56fd5fbfc620d7b9b1e2cc4d61bf6945e284a27b4c7e0879d634bf1914a4d9b9bd72f9566f3935bc09f3aac3ac522b17b7cacdf9e49ca2b00ed3234df426be7388b0e5279b006b963351e7287912f149f5eea0f7965f59fdc5f64b6208a6064430105773084a1e1107047267b07f3300bce119f7011373d991b89e2674de9d8b655052ddb27c9704d49e52d921596a2fd2c5f8307683f533a497609df7723c10d0b32e7eedfd8f17a1fc9e72545c5b27acfd37bd66c01768743d87b982e3b33588d96d39ee5d7f46f371a59b5be3a8dd06b8917e262c1cf55339d85b9ea18dab68f29ec5456328a6c4fbe5688f2b6bc00ce1bcddeeab526625a382ce070d4a2872ac0e69aab93e101c7d8e47e18828fd9e5a2f0ac8ce4c080890932fe5f1a49139574e94f5ff2ea528ccdac7df6f32bfffede5c68068c21e8b58ec45597fbe417cef41ea977ce58bffabb4a63233b972b028f09696be67c4a1cc399999a09445888ee85d883d1a5762c930d28212e32839518354ff925eb3ea0f40dabdc30ca0a48a65607b0d088c95b453034769db536dc8a3c61d1f728a76ec9c868aa49148ca9376714fc1110c335a4b494d59409f55d5f8546a9d682d430806ed274209d7d995c205e47fb53bf75ed5c6533113799756c4e648571ad7b41a7f238143d93b1e93d5c8fc1729682735f67d71b541232b0acf347ce4fe494204cf005597faef6a5c824f753beb4fa7b3827e27a301367a0b720d04a959f7ee96dfe586b55a71bdf2c3cdb0764f3b96c814b9922e6b015cabe4e384085c310449ec5313f8fcc4af2be1d812ad19a4fa5bc94c72bff98e7f87847c22229f82872da0e7e1d328600be8226b5880a90fb135d223f454e068c2f8f76360f730ceb42e606bee3f145c67eb4a8aa617677f5376af014865f3f923611afb152ee773c9a71d9e3fbe6152a874e7c5062772f6cca0d3c8547c89ae62cc6e583620a19da1c7f7b7370b07335f7314d305321e8edbdf95ba8a93818e0a2172f95d36bbc064c15c3a29d303c842ce87217dfd3e018dda643e4f5562cdd0fc547730915aa9649bffbe57e69aa0da551d77f59947105ddbf99d73c7c1565537401cfd9efb36716c43dac66422bb9273e6e297582f6bc1170c247d8e9b4dba419f86c8053d0034c1154827a17b4b2eaa1d94c5169bd940d678f2059c28342d7bbbdb115bfea240d27f35e0077f0a784cffea43e59595bdcb8ffc294a31b5a60bc92798ff651ab4ad2a85169952f3f08575a45d578b0375c47b31a9143bb203daf115a37b100f810e86b0116678c0737b7024a4ea6b9a2641d4daf6ff42d4862130f4de3b3627aec8ee904a50373219b1de0fbb237b1a52459c2a08be1a1f1c82c1852634a9361af230d3168788a63523b871062318c2a8a84df84c48ab47aea9c9ab0e2d72fdcfe396ddb9f369ce14d43a077e3809a15a433056ec97e059fba63b26c5d87de7bfb67b0d99a2af8f5e11bf42fe224f232c81b42cf460b020f6dc48bc0bcccd446bbbbf1f9ec6dc89a06252e0f38abd23ba8b8fd7dc70aad77ee48880bbf114b788999fb144b0b307ec70337658ee2888232a393da42e0b77ab526eeae28bc871f787fe83b8a35c342e768ad040c84a9403d695824254e218739509c4f2e6ab23afe52d2fe23df4622ad9c8a85a8a5e1f9e27279ffad590e7f67ead3649fc99c06d03fc76557e8aaf999e84f30b9d116ade05d2dd8feca3f9e020e9d590cb1e984a3e1acd20d79207a59802a05cb9f77ff74c7eb124fd41f18973f902576f2cc25de04fdf07de81ec1ce46cc4aebc8725632b848ae29cf12dfb8860ad9d30f53f2b69ec4ec3fdfcc8ad0d86da08a946a7421797bb51f8b0d9c98c2f2468645d0c84823604af825b22a060dc14fff401fe0aabbe81310f5359ded87b83251aba5c14a7a62ea02a1c68c7ae4514a545c988ad8acd7aafc850521fae846d7c059f1c6008c82ef1cdab9b26e457a7a19158bb9ee7dd6e319f92a07e24300c421a36242f9347d601161f40006ec3d69b21d3ca4311faf62f62b05f6a1fdcb863188dbb4246f3edefe1a65ab4b619a1a1f4f51429e843aad12250285783fdd418ebbdfc6469d40584667762735eb8fc89320fd48287bf8e30b851982345d52910c2d60ab9bc29080f49b55b0f70236828946c41efd80efb9fac51f62f0e4e889156d4f8a7cef16d447b330b1950e2a4f54431aa65f026a318eb00ad0fe50cc947e0275c82353e0bdf629f0aeda5f081d802ed511d60583af0f200e835f20edd96a3d69b364d6aa686c2c08bcfd21979c9d995813a0382ad3e26921dccc1df46df37a412c20259159763f683eefe19b8b720df3de5fd57b00cf4609df3cdb66726c60897dd8e082b74bc555453b52a4c6b2af3b062fbbf455c6161f6816a74df11566ce6ff2b58369fd385412feb6d06fed9e29958fc6b64b99c13827e582aec4373b96b39b25714a2e3c19816022c9b112d65379caf1e4f087ec1970dab4d2fe2f03db8960992a0236c42f79f797b0665808506a05f88b5be9071eb3bc3ffc002e33f083da4a31c6455a74f063297f36e4291ca86359c7f52b372f4745ff4ab710d6ab6d722424ee556afaca36bf194df3d55fa0761b842685f91c62e9221c49bc5421e620f2428cb0f985a810a605165d45c7435f0dffc9aef608fd8c6bffa3657e4a0db47a975d2335644877d7ba80921a8de81ef712f40023139571e4d6fb9a9b2f22a50fd7bffe2f7d9a0099c39fcbb5b97f7253b7d9395a3e6a6d3b0a688ffe7ab27c6e21159e2c8d3fc30448246d21c973d4c8c2b8f47603c0fe3e75d2ca6428b257233006316996d1aeb47d6c749a3fc3e6625e496b410ba622f23ea0e7d55ca312ed728d4af760e35c216ecd704c077fe5b184cd3d5b34779473ec4f5fc649207a4f72734b058746473d34865fda4b14c58343dc56772635bea90659cb2be46160f9f4dc47b3a5790a442856aacb85010ddc9ed8ebe81754c812f531d3cb6a5590e87218593c5fbc6e43b4fab9acc532425182a7f06e2edf994fc49605c21959a644014fe5d2df091ee0ff7eb8c6cd39b4ac5d413ab9238d6ad949080c4dd7c582064b24329a71c2949f69af70d43c5be889ae3d5a592962c9e80ea033d21184529425f840e29b9f80924bae76f35f6e7016f2dc334801dc702c674728c0b9621c225d3f7865b7dcf034049c1b0e740c867a7e99668224fac5ff5bfb63850ba7ef83d8f2b3203e1da17808e3471900f8407eebe10dd52ec35bd70eef8c71f3e0935792c4d2dd13c75fd57f79bfce2755aded7e324e410921c5aefb823bebfefa15cc27582b95567b610c23d79f42fc9ee8e2b84331fd27b276943e0d2da4a1dd5e74bb9f209f5cb325016268039d08908237a28a43f93e21c5bf34407629f49807706bad517948171bfbc8275dd92ac925a722ffb3722913ba54a1bd6d7f73106be90e105ecc75151c85c026e6bdc51d6a0905f75525197192d73fb153ed441fa8af73600cfb80d916cd55d10e92dd2005ab0b3683d60ead4b96c5605b79a2720f491b8a64b55d6005117b09c6d95051a967595d1c52044a80ef59f98a5e2258ca974b3b1543481d20365cce10fe7cbe2ca17dd6beca0d432de5adf402b30d2a3eaca2e142972b4bf0d459cbe3faf940b612e8ae0ed62b96d2986ebe976d6995a197aaf1953bcc977070f326fc5a12c6bd5d2eaf60c1118740d83c1426a5252a90e94bb4f1c4cba0031555cc6f9a79fa447435ef1526356bf370babb5e3142aa86b877812a3530ca47fcb0b474ee638564d59acdfa1c042753d30983fd9d978902c48b2e6263ca8efd3a9f639812f3b55448c0641ac02c1e46668648fd6e60cd25dd59a0da09c1ac46a0ef88a99f644739349e2f97e017aa791721464f30fda92016d15099d1f05bdf9bdaa0ee91a749b8da690cdad21b1ca7969895cca541da84354142e53932df6821ad6c20ec57bc552b6df155581468b54b2304f46909c409e20078d0470c9f5f119820839e523b0afc0677f5a515f1cc26fa4a06675359bf6469925750ffa7f6139c2040d4fbc1e38bcdbfeee71bf76206211cc65b0dd51c83a1e42c52db621c36bbd0867f444f0d5726555c3e1c88093587330a829cb02656582105e7d79255536e27d8ce5c2d62657150e4cf1a82dd07a333c67f1057d68996f739ed110656e70cbc1d6dc165e58000a633f61d960d88a6b36112bbfdd1f263e601da817c76faee168900d4e89b65a7c01bbb3bc52a8b8de90e8318d8cd5cd5b03d7c3332dc3e910a94c589774d802ad53114275029551ce436c69b8d3bf619b781754e3722791e6e32eb328d99ba535c8d4039418e957edd937a2bd246e93d2a2b7c7e9b8523fc1909cd789017783d7fbb953d3e7c11cf1a173df9cb03dbfc3f385c8a5803570793db7c290c3525dd93a9e93a725928a7774db58c73692c49ea7bdeaefeb339bcea818a0ce3fc555aebda2400ee0150480a4bcd5f694da47a5636167d8b281ec519d05675b1fee9c14281751f04dbe37e1a9603f86cf82803cec34eb5d47ad42874ab21edede9d999797d3b3ea75eb1e2ae4d78ee1843f13aeb9d30df8103682710e2ffdee90e9cb90b71f10a9d250af007f605091096e52bfebc74297d732e9c2de64761dae8516c308f622aa2f216acbc1eeac257b0235ef9865fc01283df7833254d392b5c51667108152ed3d66165e17977ee45da87fcf7a4d385bf4dceea87b57256706a7a082d480827a6050ebe4d1cd2f61bc4f44cb14d1e1e23535c956657d00f7bdba2f503207d0ce6e98381396f7fc4ad13ef86fcae4314c64e895a5070f35ebdd89d8676a82332f9ed90c2d27ad6b579829ff6afa70ea805ced1f506ef1ec747c80d0a8c460339650f5e1bfd601f2a3828c543e62392df77acef0908b37b90d93a5a00cad27f09cae95b065e85e0350ce4223405195adeeeba4f78ec411a47d89fbdda9f753a3297625c5e8876e4140662923f83f0c7642abd42850f7b0f54b8c7bce054a03112f7d2adadbaa3afb6f9b15144de8954ead7278febf47af6053b203be1f11d2d0c41442eb9c35cdb49a38dad2a4184a5ef1050084c07b071859d82c4bd28f70a1f1c5c789cf30d31eccb2650d92edc14faaa2f6a954c6a2bf29ec024d560f1ca1d48870d8a67b8fdb7388f6629d43df42f6e91f47dcf344ba55115db1c14935b267ab2766bb514928777fcae6f364a513fa4bca15a37c6b8863779203b573ff03993c3d82cb8bf30075f167afcff1046058d1adef5cb057138e9976ec40ac4b430bf8b8369a4a2cb4d7f41e02b05a1180df8606dc8e5846d731d5caaf995ac752d06cc33ccce1e404a877d9ae9465c4b00ee114471b7f8240cb45d2291e968c536a42e8567913b32014d08176503e05d2833ffecba3165a47db46eade9f00ccb39f87c1098e28e04589d9fa8d2312da49684bd33c2b174527039260f67fdeab726ba17440238f2c8ff04949c7e4e73c340f9307aac7112a37722371966e5ee9e190fdbd48de38801d66e80bc79c36aa761012f716cc5537e20e6c397c07f41052db306ca68c50a9d329bc767c69b8e62a1a8e4b8be7244aa358742ad6a31167c0859e0c4c26becaa531e5ffb9e488cabe5822abba4ea560522a83e0a70471cc9325c1bb7e6b9ac7b0fdb4d1a216468a17bb1dd87b20baf362b4dc03fa268bf163617d13654463b593938538299bcda6e88e34c5d70de6c9058924359655bb59a15e54f01ad6a9ac90d7f4ae32fb86889e837adf48c1083f9138d696ffda9a2b00cbfcff2787d46bc293dc657069cb80e40d05f2e7571ecaa6b0bf2319ad9030708ddfec3d5c42bc91b268455022ddd0e9bab65abe56d11ca68062bd71b132b24168fbe06076f08e21e8fca681c25ef8c6249ab82715d8d409b0f0b40aaef64e00e084e296454baf2a213f837e4565e7843ff0acefbef7efb206ba42d43f622a10e34c17f59fc5462073e53015afe85f9febc3487030a7a65f2957b6c6ff2b2a71a92c4a855335eee07a7da84bcecd43a65b7341855751b8f8d55a1cc35cfb72c00ad627798f61484817fa6cda601a43b0d496bb16df14940e87b31f4323d8d0e3a4caa5e995e9ba83bcc5fadfcad47bd32b981d1ea3304975403b58d79c02f952ea35b81d728d23e83bd409d59d0f7adc44807b3eb9aeaf6a5fb48a86f9cbfa33246a79c147d8924ba65a6682f9bdd8154f92a371c04cd26359c46d45d2974200bc72d5542955d92237010f74bfb5172e138e8c8752e0561cb3916950eaa186f0ef9b0910280949f952b38dd0173541c503cc2a16dfde8e5cc127eb848ca239400d0b0b1c863f92f3b2ade1d88a5858caaee7cc165acb4284171842570b21f512f8da482b054fffea8c08fbbe31f0df84259986d7e4a94a40584df09d5b1f0103a4609477aaf794496c2c25d0cc5f8f6f23ee7b0bbc2606d84aabdc4b51b4d9a260af77bcc7eddcac082d4c43e3084029a08c50a4742a4680e9e1334b9a954bf09ca81ef708ae36bd252e68bb0db6f0df6d5fb78b171aa4735996cd38d8b24243523d5ccf5bf7ae4687250cd40a6a13e53b1e96a09e4d7d986bf5f6ab40dc4ba03b790c62fc3d0c97571376ae44ae6d692d83f4ab5e76125543c212c939609b930782694f150fda65a47268c8ec96e7496c94c251f90315ea24a9fff409cc9d90c62357aa63f1debace0030969cbcb66fc63b0f4d7321d030808fcd8fb68831c3864a282f42e227a5761017f31ef46d0a9a1b36a93b87be974c13a5fa0728b393eca4960ff83257676801180e679a67a9f23de91597c4cd3be17a70adf5f6a8c0c8c7fe28d5369f2a30d82a567c005c21b06de6c8549f6b6cee38ff517982bbb0f7064e32e111e6517e394896d2fdb416148b097770cacbe9060f1d88492486e253d87add10662d6af8c7484b0773b2fa5b2b8cc82e2c075ed8b948f063b639e03b33c24cbaa5ae64dfc87e08fc7c431eb5a83c20b3d5b81294b56c18797e340175f70b57f914ee38f8769c32a40b996c870354a25baaa79e0b12155df90d60a1fd6e756d6f31a36432f6db8ef209f239a5038fd605df54e38d151e475d8ba3a11a742189462eb3015871c410c252e6845bfcf024d258023cdc6dcea2afa0fd92c16c45bcf539dc1b7ef8d324a6b73c5b8da3ec57889a1068ef87c99ce710eea1d39147a41382bb0e8b41d956bd2f30512e91d59c53606481ea7d04009b4a83329d77b8b851ac012261491e8bbbd5cb751b2b2e42d00daccf436495ff8fc00bb2705f0aca87e8b291a113fc3f73a2e0874a7cc661320304846d33151dd8a99d61c878edf710f2ad0ea4ba3738c5553ec6cac9d1a400c41b2927a43b669fa134936efe46d8c159b3d13f0aa1d3e9f688898025b1b9990e05e9e44758813f4c25d310c7f822e6bf251f5616aba59381b44a6a32560d4df14fadf3ac945c27e63e13276fed8fadcd23708b374df0d9e45392256eb486c348cffd74361d3af5f277f343b146e5c611470e2303d607c8c38086de2c9b03ec4a3dc0ad275dfc2156f9d1a4aa291881bdbce5e5dd17dbf07771952701156c9d5b523fba81c96146fca8811b855653d04d8bf7a6dc36bff79dfadbf43c6202f875c7a6f2d979170915ee52294f07b4e99b54c8ef35e53fb1b7645080738699aa49e570059235520fa5a8f244d712c9576b337c3a52c6273e5a19a5e5840ea079c872ebd485ae6b8cd0d59226f26d7bf34ae9001d6abeaa79a9b3c6f232679a675281bb2fd3219f979c5580dd9cfe34b5535b1e1e4aafda8e780fccdd169a0cb43b1841df3614be7035b0b11e9a347a27905fba72e9c9567c57fdd38d386a4be7b3790592187d5b71a944331e234bad2eda5f70542db56417752d4ab76480f9d7fa30b1ee98e3af21c7432358274dd3099ef7a52a06072137258292fd33b164b7dc3f3ab5b4b3329237ca3264fdee7f89dcb74afe205dd5313486a2d06f3f75a31f9970467f16860921b1e2250aff0ea7feb175ce8419496f17228095dbbf3a27ca6a03d04518a0cdd1a2f16ca475bb56c9923b4537681e4da4874a312b8d489ef1b0c6af6fcdffceb5efd1d0f8804f36cb514192c9d355c88ea05cc6c2ca4daa58d66edc5bebb6df26d3d3df285c245f3253bd0fe66212fd355a0d0e33b4beb9adb68cc83eee633c0378d26c37d9a0c5e561e543f839dd1f255c0d75d9187a1865eaae5f941631688de48291a402b8c9462f21ad31dc1b8153a82d53402f332683a5fdfe3b608f1781439846af78cd8d02fe4ef2bf61efa3799cfa901aef2ebf993fa8a2c9acaff60d4630214be87bb55c8e3d04717599649df8dfd9f022a80fa14ad47b2c4991f26103809109998849134533e085067526bea97174caea89667bbb35a63a9efe95e03463f58b8f1990d6ff743ce4bf0bbe6744665ba86fe141513e73d88bdd3a5c1b87d0e82409bd88c1542a6f0c7880881ab8f6d8671da01abc1929c56615991c29c720798f178b84e1410d912eefa2607b15a19755be279b4a5abb2d1a964b476bdabaca51d3e7e54a3384aa3e30d10b0a084c778370f2be30d5af28e62e9637424be02694de7ce7cd6a959e56a771752ba5ea1008d14bfedd24752e87480867f2a0f092b63923137b20195d2c5ec15d7cf77641bf51609f1a184211daf602e5e0bf8178259cb7089caaf4a70b3795f301f26668cf502c0808ee1a8f0c6cb94deddcc8976c1b215db44a0b8b5e3db0260227d7327ed729195647c03186b6029790bbd207813ba0988467513332dec8b770961645c6035527a7226bdf2314bc7b68999a9d7cb0493c32003a49ac877b36d4b77fa33bfd49af531b04450950492cd7be82e108aaa8c6441ca3ac8d0f1f998fe5a4387150be2aa909d8c31cd279e6222b5b5564b7199d552b4ffa309c9ab8a404a284c857f07eab73ff13f92394e48966b078a040090fde758052a88f71bc8cbd62d4bfce666bd2b59f0b306f0d864dd9eb93b37045506513aa7fa623a7fabab030c7fc36f34a8809d859992f1edace4bdb6d536207c64a347f54121a0a1c59649ebc5f5c42edda097fae7d384e9df57189263d7f4c62116fee3ca0ba125eaf6f54a7c7f1df139e2ab5638305a541409b4875df364bb613047009aade81d1fa1afea8f6eb80cec3b1113f10db3693841ce1f131eaf1fef5c973eddd31f4237ce001b95d60578b88a3e0c8dae96dcb35b5f2469e4a8bbb54aaea242a46b609f37a120fa29e97a667f2b26a97894b136ca6aad51d65b1f9dede1a85e31b42e9f1c9c6497e39c4cf26edd3bddf3c0817b6fe4200fa076429ed8d772a87913f72b7c01f5954f25497a263d75db10c26e23609b2aae3e95fb881ac2b34bfdfba3dbebdfe35b908e299af1182c58e5cd22664fd58c59b9785ae7c8f2c3dc9ec8fab37b7165d229c620873ff294768748702c09d1092b9911cde96e4b2ccf98655f355ae957f63bcbcc5bb939a2aaf1d249e14d833baaf558ee287ce00f3a7495818c388d8e4922c6ccf16a55524711df691a197f2ff02c3de4209e5100e204a580ccfa7bab1d124b042beeb3c93f1057a34e4f770dbfa73013cdab39e31ab2afc94c5d00e6101aa49016b8334ece04b16da2fbe4380100609b30963d52bec43e4c49046f5583d8d3e5ed43fb86693ff2ff1b124006ada1652aff2bfa7b68b0a909953e22b15129c2749017ed1b93b27bc41cba5ef0e02801000e2f9b5222c1d8d732b0dabb9892710d0f56b3f9f64334d6e541fa347b31f987257030fcf9c79f2994f0bad1064622dc87a83e884b6f124622bb53e90879750b00000000000000000100867da11116ff3ea4c7c92a1be22f406a73a0af422f465273a4bbf24c1b570e8eed992d65fada6ec857a3aa66d4ef38cc700ba8cd29bd57b07c2964b2bd699a00210080a0835b85a29f68b95d0e0339bd20ca08b2280240bc0741c33918a6a25c138601ce2c6d87d0184c1799a254ed03047cf57a3bfd49b8a4438d496d741cf5aca6bd02cc36601959213b6b0cdb96a75c17c3a668a97f0d6a8c5ce164a518ea9ba9a50ea75191fd861b0ff10e62b0000000000000000024f27d1100632833749168d206bce845932c580e6a9a0e3b3248b90ded27a920b4913046e7dc70aa533de6852e052d17b5b4ae15e0dd912cce7e52f2fb30f16970bb16e6a1b5b714290ec87832f086e3a375125a34d32814fb4a0063e5242fe684ff8b144c6e6aa918eb92e803000000000000c574610f80dcaa42e990330a168ee5c69ee41d2dbcbda07dadb5a35b86149e2a6e9dbd721d5a8899afc380924d7c3f3d2f2e8c6e8a9a2cede927cd43124ec40e000100410022c840b145fdc7ea3b54070c5fa0b0a0544f49a6d67d24e66b61725f579cbcf29f20af47284c1efe9501c2c0f0e9fd3d396061d3c653451cff52a16d9e7eae58 \ No newline at end of file diff --git a/zebra-test/src/vectors/orchard-zsa-workflow-block-2.txt b/zebra-test/src/vectors/orchard-zsa-workflow-block-2.txt new file mode 100644 index 00000000000..6279ba68862 --- /dev/null +++ b/zebra-test/src/vectors/orchard-zsa-workflow-block-2.txt @@ -0,0 +1 @@ +040000004857519825ace8df0c136ea906c84186a08289804ca92136a2accb5b2a0d73237fc1caea96f9f155f5ca179a4cea64227ccec90601e7b1bd343951afaaf69d53263828365fdbcc29987bc48ff88a38370d836e14881e067ae2593d084780b4d70a104a4d0f0f0f200202020202020202020202020202020202020202020202020202020202020202fd4005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020400008085202f89010000000000000000000000000000000000000000000000000000000000000000ffffffff025200ffffffff0140be4025000000001976a91475dd6d7f4bef95aa1ff1a711e5bfd853b4c6aaf888ac000000000200000000000000000000000000000600008077777777d80a1977000000001c1d1c00000000000102f241118b2ce309887cb54e04f285ef3e7044d4d89a65b48115bf4cfd6f9896182d2bbc0a5a3bef45b0f3dff77322b3b58dcc50bf06f702a02703126476579d16a215e195852ef780b03873cd2de6a98a7d1a62dc87af7680e86772446b5c94b1eb788ea1ae1376e3da5c2e63b768b89dd18781480027047f8318034f87777521faa5bede05e4c073aedfad76dac1541ac0ba3339c4416f25f3470e208ba1a2bb13d422ed8864ef01094df0cb59d6dd618cafb298dfe2dfb72e8b89db270b160cb6a35f47c6fb91b34fcbe3f79166cfd591a3b6f93aa5e259b54bcd06dfb3559ac58858241ce27b057232c47a42b1a2fce5350890e37eac2af7aa5b7f7670e4438f2b4153ba7df5e1efc39d02d611e97ac5a27678d677ded19581bfa267ef635bc53d7577437e538488062a5742e995d45bb27225569f898c716f6e56874073c2fcafde094807f54b8d4086f30f8120308314683b40216a8037f67a42a336cb0bd03715af7032b3acb4cd623ea1c5e0f13535ff4d43c604305927881727d3aec74c0cf25ff3409283591aecfa6bb353cb6fdb93d22184ee775e60165674c70ffcf8c5e960dec18392f0e7708a365b8e3bc4540cbd271f1778e3e49e3278f846d8bcdfb07420131a205f6df385978c9d419b7067e5703b824ed396a2939eb5271bf8d97db5c13f095305494b27d979065bc53ee874a8f4eedd9fb2f5fd910b1d013bfd601ed98a0e8b5e8b4079b0c070b992db0bb1a3d460d6512c41b585aacd4dd31531dd993ddc4d07f1fa254343dc7f6b0e9430e091778373c9bb5f97b7cf41f109d0a466431785ea10c01d1bc1bced022b65de89d7e68e506d18bf3a48737497fcf0864a8957c0d8d364c60f5332982478be920db2debb59f764140ff19baaf754fb92c15d04b6402ecccde5c9edc02b676a6c4e421ece044e07c2d65ccb9db0c7a7b4a4473febe4574c6e5fcc13bb98e650c99f0d22d156bfb997880070884828a4ac8013e795157555f0873c09f0c74a618fbf3f7601896b08f9b47cce7b1e744cf56a809d8c3f21509aaa03e4eea4b05bc6e6c38e5dcea51db462cb39a278cfa1c6ea88e1a0aa968baa499324e5b53989b0e701ae2947cb5fa6d1805038d764b52dcdb815fb279d1ca08a73f32861a3c575d69b3aa04bca7d6d2443782293764eb8266088d1ef484d60e946170f847b956bcfdc58f29a9da594bb48f13eced3be11c8bd65b825736ff8d7c84579d84a2d3ec3ddfedba5a9d49a6d5e26d5171a662a0379a3a9ac2a54069a7929ae68c2052864064632419dcc5712a4dffc999dcd0b93ae02764c1bc44aa6f48559361834afdfea92853e65a581722eb45b9bd427e06048767893be9f8e159a09f296c801296937e3e49b6dbd603f2001e0b0cb64e101c75880fa119c02379c5bbd992c41b42c7541529ffd99e7bf280dd61700802815b1c78f60b1b6b47ee263cda1e7385c31fedf3c161b794a1fed77d7983779ad18ccb55e861c4fd6c8563a89eef199d3127e7f9d7c4a8652a7953641567d5eb1392b5bb9258f4dbfa39ad638b1decd0680b5f040de55002301fc32a168bc7571e5744f4baf8f298069797ac9219e93591800e284d423bcd89111daa473af8f7135dff72c5d44b49c848ccdeb5bc2ad9cbd447fa6e7b5a7fc3d1b71fea307f8a036d90d0bd14cfe84b141134ed138e17a1dea008e7e8369f0d0b80535974201e2891708bf22d0f979362d7d5475dd1f048c0462e17e35567b18a42d1c62c1a40c83d9a8a2d82b56926cd6944d4b54e2d19bfd90f27ab41d163ee9d4fe7fcf952026fe69b8ec19c23740f8de6da64c23adb4b26b8c0d99799e144980aa8b00a2bf62d4d2d34b16110d730f0e7d74ef2780596b58312026a2ec5c014415b19b912097e783dca10ae8b7ace8c14540a1c27d291210197e31576dcfa0dc8b8e8efc628dd0e1266a1a7d8a307a63e936dc50b1b795bdb2d9439f9922133bdd8d5cac7b647a641ed08993a233c8408688349648a13a3c323c16408ac20ac180e54d624fa2cba1d62d2d0da978e7ae3ce90a901194a8bb06c45a505d54f0e754e1e851fcab54118c38b0248a9c82df53c0dd66285410032f528e1f27cc61336927804680f6d26eee5e9670d094c0a0477213dd5dc23cc6e8a7915c13ddb8c810750309588821d32f7cf6024b3893d869d950b07a5e005b376faec992ed2615d540f4b330f5fd99461cdc382fb52ec354455da172df92335c3c92ed685bf27cad6019e468fd753180c5d3db1473f481f47f2f9617c65028225ebb977d3085723c1cecd31b07887e6a16ca101acab9d6a95785fdabe33c661202fa7a9c0f5fe283180f001aad1569acb68e0b8c787d40186a45ebae456357f620f2b02de4d879a013b0d6ecb91ea075071f970640f0488ccec7918221afe0c4157f56b5061cf333ed5cdf458deedb92360000000000fde01ca7ac2b5c6827393ebbe834f9a037a3c968d2d5b5ceb34a449526335d16f2e8b299750391903fb2955904d7121ed341ebc1c2dbaa1b2dc56e45b38bc006e4f13e1497b5197713290903db72384e2c4a55f92ef841bd8d682d00aa8f8dbab67782754262afad5ad6935805579ee8b44b6c1e944e93eac64a0eb6efb1297bcb4694382d4757ccae338c9b6ae5f5cafc5aa6a6faf0c2c61040f54bca79ea17318a05be90b29bd1323b88528750ee701f2ba804fe8c575470fbab71d8ca7b6109a0bc86c79107931c4a03b11b2b320c2ff2eecaf0d6a80ba97997b210d54e90b9b690fb0583d2d9ff175d12519e1e2f2a8d5608ebb5c05d593dd4f7619a3243ec280a81313de562fec5466955d6c4c4bae349fdb1cddae13166ac4427d69d0cb86e2fbd8de1608b2eccffae90045a9df955beaf4ad5372701c8cc7845d47d445f201c48d6cc66ff3fcbb33a5c0469e9f87a2171fa59adfbe264e0392fc607b5470d8fd4bb68f755bc1ad1490e264e6482f2f0dfa1d63a44b573abea01aac25bd32505e697a8b407cbf2e65902f8cdbd5638bbda7b6f1ec4b6a8f91a8d9b30cbbf72b71223b888f7fb4468aaf2384cc1fe314cb09a7f07e8fcf28554b5310041efed2ee1ab321c9109b1cd8d83ec1b9608872a22b4fb52ec9f8ab6ce0792d07d79e616db0dd26d6742540700308b23b89926586f723d413a7672415816d673d03de50d5e6b1003e3be5eeb3e028d8b9c5cba0d39c65bdb8bc1bec6415332d077bfce869df76d118aaed686eaca41aad835231f92a19525ae34f84a9b89b98342c03b0b50387e64f64d1cae3d3baf9d9982a9fee6cbb4902a6da89dabeb855ea89bcb2be427b8fc408fa90e7ad20647a457f03c45ee276f17633540accd994929a4f419c4a038664cc7ca2c9dbf585bd0bf9c9386500c81ae3a3ccd24e3ab73af7af7b61d71744e61f9a678734e11aea29e7dc46b02bf4e563474c9b62b0920f151a29a65483682ae968195da27a14cd3821535b9f768978eb78e052909fadfa5358f224c2c552f967ddf5e4122da5f5c5c6e5693c1417d32f78a0ab1a18624a84ee530f11eb7343c8694e2ea3602763725425263c7385ef31d4ebfd6c1a5ddf2140f098f8b12bfc0068ee65dfcd3de1e64647ed8abcb55ef3033a4e14334b8f95acc3bd23e703deac44c88c08dc284c44ac027cb918a8c0a4b398b1fd3c0a0bf3226005eba5e842b7ba4c5ed24be05f59c1a5e20326fc9348bcbe1fca374420843aab753342d931c79f34c78f82a5a0d611816dd71dfa011ab389b80bfa51615cd0e364a48001925f833a3c5e9cf27ea5368c4a27c45910ef2c9b51f0b9a67990d380f567df675eba3cb6a253788eac8d694dc0b2dc298cae8aeb95a153caf37af972f61d3972846889fd702a5e6c5d96b29decf8e94e0194e353264f1e67ec895e7945e8a36fc23eba473192d0e32f94fc4c7e3435cf1463cce675c6d23ff97ddb8b54b49ef25d1f1403c77f5a90c1b674be717d1c05ac04d90a842f04a9786744f8e3541ac3868634c7fd7ddc1b914e4b291d00771913699c3014196b4d51b72628975a48e29d3baf9859c00af414896ff933a02942d433725a24743b4a162006e0db794e6fe18520bf62375ef2482f833834cee472d35f3de2c877a6de75e8b051f20a90cbd3c2c76757846f3ef83e3298fa1a65f905d0d7b632708615744f87e188baebe71d1d5b7523c37d55edaff4ac1ddeeff8ee7917cf17d932076d9776c17b758a21d7b43d841f8a8bff61834697ee5ee161f62c972032a6189ac44797d079224d7a719035ab2a7e4d309cbb4357af52bc2b75c2ac29cad1ac9cf323eed360e96844fc2af8837dd302a06bb7570402170dbe7de0eef4716ae58cb8066f1b5a7b1a4e9ddf74138914d6580cf26b01f9ae53b28df2e041ea1de6835c24af1830f0497949dec2890e9a15c7d27a83f998a60a3b9a3770046d8db7dd2e791b79b985c5a8a324743b5f8969bcb200d4d0b9e7c11255a3e0215a3d61d6b7902e39bf1f01edf1f11b38df185e843458ec511062b8dcf8e46a85f0c984343e0a1781d2b3b163c1ecfe797d0340c745fd878044ca28aa91d63fad063e40855300bf519b3545fdc195cab8a0526e715a17423cc6c1a5e554e178f76c629534e32a67e368600bc6102a7604f5e157433f35795eb916b529179895488f91ace815b6b10b2daed42f4fa7b6176ba26e440c105afd406f0bbf586c199dc6ad0e079e546d503bbe725b3c7ee6435e6cbc824ed874335356d6723e1ffb7e9e7005ec8ee53a134a0739ac6cf653eacfe4139bea4fd8646b6ded484ada12c8f1cbe71624b3945b45dbc4bcfd48f9163131586136cd181afaf8ac987a0e5791a1c29b7e597cb7b2e739f8f7bff2eed4195efaae644ae070aab3a08e50b32e700ac8d3bddd7aa88117d6aed4ee899b7148340cda14aa5bc87f13dda39c0ddd1fc04e29b05f033321b84ddee93ec0e57b749d3eef4f10bb76ae074814e9274599919c2fa2810013e0fe5ee439f7dd671eff3e80116b7e7869e8bb359df539f1ea6d64f2dbfe00aca1bc557915d151df4a5acd4025f77758362e85050285d3833f0ffbf12eeae55322d5f88447eae08feff98efd541dd36b1a7f66e5a305e2d5e0c514bca14bd48040183bcaad5576ea4ea16838beabdfda29feb22c664deafe60497055b75fde378010ee7066a7c055f60f792e44646712aa677f80fb5adab140ecccd706074025805699a80aa728acbcd605aa61aeefb8351d2fe4af264a482791e1a9c030896d120243a5c35fa1576ad9e94977f7d24c63771355705008fde0f72edcf982221e2177999759240eee0878bc5491de953e9dc6fd2aac32d6e9b275f244ef4d1f82530b503ab6bdb74d8d4e47bedd03b06413ffd814818de99a6b8cbd7405a77e4e20d83f3b146e51fc9330feefb055862bdfcfcaf9085e376c7fef753f1ea15764218b650b60004d720d01cbcb0154f5fd8f8d9a6f88755c35538995d02d1cef2d439e1e34b1eabdefb022f5b2e6dec94ce9a4d3bfe412cb92909fb74975a97654f047082ea424d30da3d62fa80ee1252322b66d0c1446816f87fe68e67811312b41275d247060dc8adf93da19c4608ee2a4b78cedd752b2eda7269a02cc407985d27a33653b8dd7e000fbe66cc98ad5aaa8d1a154cac00a35ccbb04329cfdebe3b38c67fe612ef013e48385d936fca6a2a377db479a5a695e645d94b9c8ef8253226d5fc685bc9a861a9dd2c9f1ddcb35de7948f6171f7f6f8b364f4ae3ae46f1c2f27a1ec42eb947c6034d8f0e3c606fcae66da1412def172e13a25b3f13abf1004af2a508e00c35c8db31c028899a4b95fd52c8c047afb97bb45a3290a358bf21a8d150db24c0cd4ef66292477d2361c1507179bfb2ca3e90b88d1390e3f8bcf15d964005c45323fdefae0a3314a889935a9619fa17cdc9fb20d8b4040ce4cb72a4bdfda8cf3bd91c269599c2404ac9ec5ec131405397eb69cc393502a6902252fbe1beb4670751a63228336ab5ddf738f86f8d9c1a20bfe95f7b93971b2c4d308b6c30cd8ff18b0c31e04773d0206d8a34bbd02422d133c7a3bbd62d923375b172ad9deafd6a18d874ede3724df19d7135584105675436378fa441956bee2de18c692172539dcf5a06c8b9a250e8d68ccf6339dae539966809f5235b5b2fb55060b2b851f48434129a4e7f543b33a19dea8ea348c9c7e3c6397e0a235cb7482255b7f980548945233a494c1189b3a72d5008b6da396902e6cf9141f01fd40ef00f7cc734915fc7fcf74d88cd6c052a752f33b8c9cafb806e13e1d1c4f46cc8c3ce802c13fa82d5b044052404443bb65d60d0a542424204787062092155b625b0c6e8f9b8fef65098d2d1e4167bd5f58c1bbbf8e3fa75af1ff48b7920392f2222294835af103f615c6d75ea63bed664d24a5dd8cdcd1265e0577960ff9dfa3f10b59b11e2f906e09b748bc8383a51ce8575a5d4eff7325ada9ecdc08d9eecd032735e3a9aa1b8a42a230284122d182a00c40517402988ccc28b18e82050187172e6cf1038d0b2088257090c76c850f4f237a8bda23d00d132b9d11aaa6b8de8b07d450dc239d3a896ff88ac07fe7b0861d842131354d7ce0e71c96df7c89f0221fc2721958a29975407de245b576442bebf0bc7a51963d7f9378f4e6b24f152a05680fd0264c29dc10a3d4e316b964258e304e518bab0c89854e287cf11802fb3a70318e52e8745a545b6e4afb0a339b4fe9ae6e8fe3350a900f81dc5c80b57d0dc34e3e52a9831dcf33d2fa47fd490f50483b7eaa573c277e3a23a61a34e53435650351f053c4d69dba8ac18eab53c774697ffa25524304f55943541b8ce2832ab73965ba95199d0c1aebaa55a179b351e9b79e284dce434a1d30f9493ebcdd036b2c3072b27f77ebdd27b33d2c4443b270c67f29f4f99cffc888825177ac9c306ab3c441f9470ca3c310dc7a1d912bbe35724fd7bd83b60f3c2c9e6f27e158306dd8b047b0dcb56a58b09d74807097e3ea6c48ed18b6afde4ef10048269749121b8595b6ab2e7ba989eb9119da48f2b8628c65bd30ecd8e712dc373a7599e813dea0908b3cf4a3e944a1a13312add7daf4a6e7004e47c267fbdc381785b0cc0d283c858e61a0a5f91b883bb3d021b11d5f570e1f3e8c1b321dbbe2f1f460491ce276363db26d67f4a5c4b52e90d60cb18f3d8e54f05ab790975a7b4fe24313008c8ffdc5d9a0a6f49d2f6f5e0de636f4c659114fe6b93b95beab18c2e1e9f4178394374e929f79964e4be30fc6832b849dfd49712b6dd9125b0cad541c0d2313680bfe5e4ad570a974da190fc7ed020c65c912c30e4e688ab03bdf0a4239e82bd132576cf5ded576c37725e8e7281c7ac1f89c6315d43403bd4cdb21f819582f9908ed6278290a030b03588b24362eaa55dd7af62706a6824531aaee48ff5a3349b50bba17457dfe5e3d14c0597392d5be2eb195a4d68602b340e9a2bb53c23ce1bd4e52b5413bf784add458238c55472d3081a246560e049e340e94e983050d18d6758d68d30af7cbe184987e6faa981fbd91f14931987e78fe982e5d20460fdc95097345158687ffa97e4b0a2cb7cd529a407344a0cc6cc00c7d8cfbc1b40ed1785ecb679adac85afd12e64eadf8ed5befe9b7fa275acf8d24dd451ebae5024afac634f6a57c3c7353f36e692f8402749162ff743b718454a35c465bdc6f0c3906d2d1b965597af4d80b2b199f929d39281658f18ca235f25e4c5fd202983d1044e86ad8d4e4087e343dcf43b50505593f786745b547605b18714e31f084069acf7a49593716e71f0305df1fcb2793e4f116605c7edc8ca82a17afecfed822209c5283705c2a6d2551239f64ee12dc9f39613fe01e4a7d68efec4c99d4c30d573465ded99ff280d205cedfd957b920e454dbed872913c05168695e9e3e3302e6af149dfa9cfb62a10db495c3b1890e057f69bb6f6f8473f108438908f3a73a00dbe6673dee6fd622c005a410a83c8110a9b22804474bfe43cc1bbbaa205f3a035c574370a76bae3d08c0550edbbbe16c344b706c9516650ab7b6ec2b2da40d5fa1ae8acc2c459a497e995eb5f7d93e7e5a336517c3b5e94df6ab2f8975361711601d32c7db2d04c334e5f25b6d6519fce5630ed5a47528809fdf68c3f6c722ce8244accad68c6fa96fc65e56fe3c8ecc3fc858afd19d0ca8c5bf6ecdb472326c5e153eba59a4ff48746166d97b5f02614a4f18642b1c0fdec9109c90601c3f3c1fc762bb2bb9f72fb635f7783d64199cba2be725ef4d9e2d8124fe4a50a60d848b21643e648ceafd8897c50f57d436bc426a115603a263116bf32bc357622c5016c11e6e4d1fc45d8df2b25da996ec20c37536858f6f3f8b82ad999512d428fff007e7eaa5fe917bcc16952b75f8b61a276ea34b16fad82e9b4d959d2a0f27f5dc05fcbfeb18f527433753acf22f9860f525a8914bcdc1699b9af28014f736872d7596e48646199ff957ac0bbaa7039ec9cd9c0752106d0f3db24ec3f84323554d6f50c2237160f78b67cc43297fc3088cb3718b96f477c44f9c6e7e539905211fdd6e04c17bb9faefae45562725851eee2ac5483d224f43567153f7cb91324488affe1e50a1212af1c52ee7cec44d4cd883c4f86dd6c95b75ca97c41da41d2166dade2c5e5335091363d8cc8d4a462f156edcf0237801fa231e61d6b8263751faa7b9f6ee4baca3982de862118f822d66bbc9dfd9633cee0726f8bd6b15281723e74a44a225cfae2cae3d118a036e205ba8a232dd50feb5050d45bd588b3ce086b0966ef78d06e1ee1999e3abcd5d80fe12c38f2ba3ef2a3ba2bdeae2c036982472abd72c2ec4d8bdc15de7ea865f9d2b0971bcd47d39d3df4e88246480118b651ea269583d7345e902071e2eca93f9c4f65cf561e5163c12757e72e93b024e7b1b60425af4709ccd1091bbd6b2311f88a5d1d9a55d22815cc77caa85a504dbc5522b211afa469aceb65e611f921800969e6e8b817637f75443075b2ddd2af74b7cbe5763f6729d6e513204da49652f14a5bb9000bfddb7c8090b63b88c2ff7b9f84733b51f7f7a90e9cca73ffc44eb87013bf77dafd015c62c8d6ba7271eb6b60ac3542ef92f3d224063b949aac134eb7353e5762709dc782134e744d42e8bdb81fa5019ed109bebc599c41320ebc33c340583fb063ddc7031b695126e19d015eda79ae501437d8f8a3ec5e764f0247ec60f7e525cc9c6f2aff5f2dfae3d9d85e8bc975338ae7fd193bd6e67de07d96788013d0deafe6b76495854f9493e3bdb2410e688c32fef4898e1dd3eed09cefa3a5d4fd81829717f4666eb296d02e8d2984de329130761ada14d2249fbd18a1dc4e0daba6da6c803817649743e1eb3798b75013394850761617b5564e85eb82e5a24407e8a50d6d3704eb14a54030d874c21b6831850da00b80693d85cb6b4c08f8b957448e035e0f9077aa7e200ffd7bf5f62da988c91d2bb6e1db2709ce70ec443b360f88e0828fe57fa57180b820838990beea1eeda793d2ee8193f3e28243950ec3aaabcb0ffc069c26f263c5a15bd5dfa62e843ce4286a5864cd6d6a797c605be15aa530da558189a96962ddbf054d517123fc1f95aa5fafe57a674622b9dafb43817e7d253f4acde57322f5028c95ec9774d5bd4e7bbcfd9186ccde50f2ff78739ea4c35b8b0eb00a02f08a9af872a2a599a59704b5392a198215f80417a8989b8aa0d0e1e264de0044618e8ce4a1d27459048c4a4eaf43816ccbb918a0632c8683b342f193c9570ed66086329ec25b2dc1947e526ee151a5eb9c67edcaf1e007983bb220a78b5a9a14d1e26ff78cd479a1da60304a501390d54102aeb7c7752cf5a0daccff4e4d0afe134e4869587b497fb2ffed338e9c8bd8fe1e27503e2af401a093dcae57cd943d81886c2f08200f0c2974613dae4b358259a346a98a4317ed90bc3050286ccf97f0dd29ea2d79a10406da58363f67770883ae4bd69ad69351b8321ec64e4fd1fff3a394243f18b201236cfd93405d648ee5bd96d58c29f9af9c2f64acfdce489652c42d3553559bed749e390d8445a04d47d09ed7a2de1c726bc73f881ad6630db065fc8c69a39fc798fc400a7fd7b1506b2f0f79b247fe2c42290047969c004a10ead36a2a60538e9b42957730f2cdb08612c0facd7c01754f714b18cd45f75a226ea1de2b9764d0413fc887f71b595ea91dd2f7c3e996084136617b8e5c611882f829c7cd03623b13e6290f96afc51ac5795f9e32946efb63a0ba7fb3a6ed2de1cdf2c38cee8f6b36f3a7f923f5320c04dbce729595edeaaf4f2f6d6b8c89e852d90b13e1e5091634384754e69627725f8c1c351301823e023b75c450538b7a63d26aae2e60140269e8683e0ea53a22fb06167e3b58ce81725bdb37e73b1331206a1791b9ff8f36bb27079fefe73b8608f0ab41a54aea08345c36a22480a575f3fa60bed30b26e4eb2c4f0d661d0378b3718df0b9eb61ea57fd60cc74de3dbee1e9d29d1b236bd22a24e9beef88410f62156c62652ba09377f698b05b0df0c361b69304b322bb6abb5fb8ef0c20e02c4c52fc5ad6bfa7a4688f976518b0efee423a971b145809107b132e14f992dcecb426f5698d7610fc8098b432242e23c142cea8d84fbda7e2195c6e38ef04ec6f36c50a99b92723032c2ffae20939a76163e2cfa75fe273c419829d751da757079bdd5579edee20782c666be38069f3586066ce36c150781cce80c3beab4681b2fb2b228e5f9662beb3579b92648e2147810fd38fd6f391134619007272796ffa240244dc7d687ac2576ea04d5567ae5520f4f5690eb77417de753f70b12eead15bc867622aaf86ca3efb8ebdf1c69ea580d3a83db55c0398d831de99ee22f612c1a3162397d6de412820e18404e2bee7227d1e9664e5cf773de37f65910bcc268b3e422fc62e4ff47204fb7adabc574fd106b14d7c3444d652b91dd01a8f4b33550ebf9914ff557dce4a070aa8cc397452a99e82b336e8fb7a1cb9e31ede9d52385867cee162052144830a3bc648f32710d937c3e3db620b6ab7ae1076760d5c83fdce3deeb2d08b4d1ae26802e68c845231cf581e5723c208338c667866db9f13f03185c219821ca12cca1a2c9059618370f6680914fbb11909b7f74b4866026e7f4157c8c059830763f08e04f7822e01f13cf81b3b378a4d9728fb637a7c0c01c68f7f266d15c01ee24a86b0545bdcd08e84ec27b4f8fe0051b34be761a7d0e2fdf0f9592fe7822663e7bd81a87d41f35ac24e9c4eb28f740a3ab020732f4c0904e3245dfacfca22f2260fcd5355c1f2efb41404c29055323f2fad42a29c8c88a1d420c781ba53aae19f3e237410a263fb264489cb51fabc8d26e8d2f12196cef83ec1c491faf03ae493a92cb8cf8ce017d002e0718382fab8078583353083265b24ce3488a89de647b7b09ca1e9b14200987af22e6e1b8902bbfa1ec11b5b803d0e34dc51575dec1b39286a164eb2f3a1b844f3757dec28523233b6959f37c496d4a4b4e6d5eb3aa7b4db3352f23a23506edbd3c043a41110afdb6616b5eb7ced0258d0164bee24f7280612871d7551c3283b5c405f1b32598ce9dc3b9169a7f6a68fe20a7a16408059c418de3ca21233cf71269c4b552cae579740cd66dfc300c2f121a2122d8b3d968c843a950dd22d112deb6790082e4255a7349b2df6de8c33d816358fd95d3ad29dc9a0b84241742869eb79ab3ee20d62d3577fd66d2ea36962ed455fc0a65a8290c00b0043e30023544f672a78bf19540ba62fe460d27ba73514bd946e7cc69bae6c46208f01e5506c53dbebea118d9fe4ee71094d55a099ab675ace21e31bfdce965b8b3620e317a9f22bae6edb7b170070eac6e53207ed08b2459c799e2b01e9f5d2a9ce1132df13e376ed870d8dec1a1a21bfa5835a160cae78e1b6296676eee3996b3d22d1e4ad9335edf785a72b80f392ffa47d9e8d97ffe9b6c4dc529b65865d2fa87b6dbb0ea30191fb4ce68585799fd5fbdcf7f25017d946ff4d632e81d161806868564aacb7207b4f26e9fa118eebbaf83797a2ecdff6d465fa391812f6bbb93b9b9aff3599408f448ec2d273ebfe272cb232f27e0e8a83b6ab0d7561b39e1b092ba0db98050c2398d264b1162a0d4ff6f8afcadd6e863addf9dbf33806548c7cd9d77f48269963eeb1ce02effa30492ae9bb7bec03da1380c17989b221ce2c0fc1df05f1434efbb4251d17b630f44352fbaabe40cb2ab3ed6c1349c9f9801128503e709034a03dd70fe61c1c3389791095a7928d184f12ee6449ee6398e8c08b0847ab8dc4875a513264f9fd368643273d479b2f411938fe015ca3c3dca5a140f2cce6190105ea369a279dcbe57f3ff0bf41437a981022d63fe31726c46478181af3ca1479a62ad0d569d570752d0ffe53fcd875e8b8f260e895f1b3b74cbc72c01e2b7944ae202e6320b610a36f521d928b1842f216c20f30b305461844d91f8281d07b74b528f4c8e117dfa6d0a87b6bb72d9e595c514f8834b44e66c78f4d4270ff5c19e994239faf0d6b2c2fa2455d392f284d13f92cd20604a64e4bd90e81f33c2f2e284e2857cc43c63fa5d5a6ed93a5e22cebe87ecadafab90c5b90882a5d8813f4dca00b0564722b8f2c5240836d67e2e453c1adc134dc05d203ecaf5ba6ca5bec78a7b8e2d6f74d3def21ac522f3891df75e92c67d8966ea7eeb823580e8604b71a4e2c40ba4962e13ba3a9487c91d83857bf0a5df923a0d76ad0fde0adcc6c9477cb6bf9cf3e92ef9b8195834c87fe868c421f15444b1a5b7cd412ea0ca676c0484e9eca9dea62651ccb1cad08648fb223b9d44ddcd885ecda7585e01cc542d066c76a3042b8cf86c029252c768c2e46da39ec8cf2b599a824f0f88210100fdbb1cb6b8ce1f4e46046e75d68d9fc04e1439215cb88d5b7adeb7a9afd91204b569c4f32f0602ed3f370180265602121134e6a1c01f492399fb96d631264b220100bb236c67d944ca6223f786cb88e96cdef7218b18e59ad87f2b1e213d0dca561de102fbb5d5f698aad4f2a96e6a0076b8cc5c05ba4c5085634d22b6311f8fe83e000000000000000001009457c1b8017a5cfd38a1908d4390017400ec6963808d7fdf45ff08dd081c59a435344556915fa1310401a2af69d3c6251115ffaab6099452f28c0e6b3210c72d0000 \ No newline at end of file diff --git a/zebra-test/src/vectors/orchard-zsa-workflow-block-3.txt b/zebra-test/src/vectors/orchard-zsa-workflow-block-3.txt new file mode 100644 index 00000000000..56602252f7a --- /dev/null +++ b/zebra-test/src/vectors/orchard-zsa-workflow-block-3.txt @@ -0,0 +1 @@ +040000005ba77f13c960d742c71d10ca37417f5d946dd8856f74682b4489efae9aa5aa866f2a89c783665bc6555a2be4cc2d25d3775b579fe56c5a4a77b0ec921ecb21aad5a6fb36cb9b85ad878b5240cb4934cdf395ea443b161a3fdd514214f155079e0a104a4d0f0f0f200202020202020202020202020202020202020202020202020202020202020202fd4005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030400008085202f89010000000000000000000000000000000000000000000000000000000000000000ffffffff025300ffffffff0140be4025000000001976a91475dd6d7f4bef95aa1ff1a711e5bfd853b4c6aaf888ac000000000300000000000000000000000000000600008077777777d80a1977000000001c1d1c00000000000102f004291b7fae5dc4abca6bbd50eac8d8034922c33e6ccb312949f9069753183402a9c0e8b38abe29dbe03ea0de7e988fed2ccb33c7b84d453185c932903a451b49b0e9956369376e152de7fdc80a51eadc8ee75f7541cd5e5d64d5fb6904c530ab56469dabe049383d83b82aefe9c9ec6099514a7d57f8c2da9cd49b7ce8f90a6ee3e8572b9f6eaab0e45324b471a21ebfc5e0f744faa27d3bc14ed2a5c662a12cd8e9077f821455ac8e84752b739c1f4d6bad5e4edbd2209f86ad9b733744222ea528cfbebcb1e022e063c6f82548b1759988bf2a92032b69c229625d9b41efde74bfc06407503ace4b0ce436ee50f17aca51a6fd4c23817d94475e5ed96e9e6bc287d4e0707911a8cea62d38dbda9fb76736a381d9860d543f2124a97ed6c410e0e2534b7ad3b184d2f5d0f2b25e57252ed42eb8e85e7b36878d38561b93ef972295cbb06219ec40e0cb964a38c58d77b7fca3501e092e4a70cb9c71fff7a9070e0fbb6e48c8f8d5bcc10ca834dea1ba7b8f95b583a3b8ceffcb0f0799454d7b9b9f949d6e778c6b5b4064fb8d83027ffa0f47f91967f11502a03406088be3485615aefe1554e7cef599fadaaca7f4f9c8da80660c535096e5fd083a29baaafecc337634c2a66f2271914b2b504c56bf1bc1488c5ef89876b97daa371cfe9c4918b16ddd08ccc0f38e3d6e768c506083887af8564492fd3abda6e2163e8fb117c1f0604f9228f18d228bea801b2ddf53aeeaea8f945cbf9ac95a06ac85d3bc2d433c9d058a96fe1fa49f560209b770e75e60fa4909b68164fe75d7b092ab862740d9fa9b98291ab9972c799f355ba1c20737c2dc80bd27b5bf1069014ce08d0d1af7222ec3d69e475f4e380bf106b4aba0ffa6c06d299be9ce8996afa3fb966289adbf33321fd742294249074e641ed1654ee077825a807d340935e63b0f790421d2c1489af7cb00fc645fb2ab94d4e232b6feeb03074b1bc514516f32a35418e0964320912e65ba2a434b04f130fb0c718072de346f6a19f5654c6758df9718ba54621a1aefc374856f605ddde4b38b7c86df3b5eb8bf904e74c456fdd752d957e25f454634545a78a708ca4a62b2bc31c51f9d07c2b220f1204ae1e83583ee1ba93d4bac64bfeb299a075863f1c8574930cc4257615c03942ecb5237a92c6cfa6ff1482229fdba748b1369b98ffd3360a195336bcc275faf1d6093d17d37d356bc0ab9d3419972b2715f78f788c1e255fda7dc99bd64bf9b2b43ccbebe7b61c58320b5a5207754087f6489c50b1fb87111248e8f3c2ab6e24e3527cd5e2231378d0143647ae5cf31e122bbbd19971bfd8a0eb84d143c347af0cffcfed62e855552198eb7907f965d819a065dd7da36e2930059bb692f7ca0f802ff63b3fd1eeb4d2ee5fe3fb51555867767ff01b29942861bb1d5e1be0a70a6a626c5105790684de09c8d6333434581d6b7070e8c40119dcaa29e4b0f03793b33d3b85c6af3c8f77ed5a1dd978870d6a760b5f49b67c3844a7695b7008319840f283a04423ab75c3eac8e5f7f9ddb4b4483823e53b1691eb4364f63c11997167d4925d4439fd0877b03ccc4fda7a65a129645656f899efec62f1025e14a83bbaeb71ffb8267f86e6b666a03386024204a4766f1c1fe30dcc47ad9ce54e8b9bea5178aba47fb609aff2c1647b303361cb1a47a57fc4fe13a1a42787530c7f18dfd00e48ed9c82597fc4832d6710826b785f616b5e0bd8b4aa94494f91a1c9a18f699f7b8be1873b19a8d1d562b94df7d85f359a4bca6bf0f9578358ff96fc67fc1c80f076de39805da6553ac3ca8f91e6df0f0640d3b8ae32af43f0be00854e623553c7d74acf8d686d9eb2724db54beeb932f13cd4911c0bf3d0f74f346abe9ac5d61fbcdc6d4cc11d2f3d9a2b00e458f20252bfd7172599c3042007a7621edfe0e332ab9d974e8afe49915b5fca4f82980d254561ea786bc8a34bdfcf7f4737a82b4937ea8e4ec38188f649e3c24e611f982832e649391e1a12b1fa5dfd151d9c6cce7817f8ce06b119229791a870de57d1f62bcc89d27cc4a6444a20ed0e42f5103ab6e099b934380d251232a1ddecc1a9a4501883dd63e50d00c83b6a1565d57225b6d0809b67b538bb2be4368a01738e7ca404b6e4cf965c27841124ab42cea0357f89a74ebb16f903789f8b4e0f8e852ef64e872ce4ea40dd3882bb0423e24304a610d1dac5051918c7646b704c65dc6571899d5fcecf31adb7f0d0e11d0f88c578ffdbe393e21cd697c4c5ec70df1c50c6cc5100f85866de476fafafeddf5b41b2a663eaaa5dc17337e1d515eeadd82dfc7a98cbba00a0f7c582b05f85b9a79640d6ee831d3e3537f547051939324e11f112ff25a9e15c15605eaa484b1d1fb52daa47683107804083d076244412fe3a29d63420289e26e5600631ec2c335138bab56b0d186fc6df0b01f0000000001917cb982d92f5e3b74e5c2f3451a5b027dc882a75b0ce76a3f22f83507085fa20700000000000000fde01cf147a972acb95e978c3d9f55ad6075f928eeb62d9bf2d9d33e346d98beb2a08fd5bd276b63f3e158848aec0a0cfad43495e2565fc550b0ea123a9db658db6e066b1e0b343c34703cb6a8b38a0db8d82b9c6bcc5872fe4b383d669f00f8e00f9df31667eccd6cb074a46110ced3f68fdd59487ed69be97f03e4f458129cc705379add415e5f7f9137321689a0f64db744a929f8089b72409da48aa2c2f43fc60b885b6de074e0e947061e6d259ccbddf8a4f3f571512e1ee05567164307f84a089036b91a036d5cfe02ea2507a1e4f0f1c7a742efe91d17500e67c5ba0ed08a1598472d389d88bcfd41953f3427be6b3db084ff0c89ee1b317b59d38f8b2db417beedb560d5c119330a75e327680005508edaafedc48f2ec9deba43e876c484962bc8d54929c180aabc445c464acfcb8c3eb85d8ae7c79b8202b1d1ee44939bb9ab5bb339c343389c2b37adfd8990205ffaa05b99d582f392d228251c29bab2349c788128abfdd6e6fe5ce87bb5e2009bf7b901f6de498418ecc25d705a88e53bcfcf7698c8ada0e58b224bd28f36d76578a5449b57fcd60f0604de0df7b7cca16f82d87f56011e28b8adabb22cfa085dfac360f9f3965a1a2385adbe49fb21964d5c5f854f305caf2b352de416f9d655ff5af16be17ab0dfd74e4ae4deffb024c86580c15d9cd2d6adb836d17f978ba30548fa4f627113e7fd57243ff3e930b9f5111a9a0934e8e584ba451464c07cf9f2d64021ce8dfcacf946acacf2350b1fa9273cff0b98e4e4917e1cb54b9c6ef9ae89ac38f9ddcb9ee4b48bc6b3649a9485951617a325bad531b85c42ee119bd0947b2456023e568dd37fa8f0126ebf8ed2a4345d0b1f6abca9428a6e252925dbaf4174f220a110743693bc65a2af9e228b8f1ce77bb1a5dafc05d636f6d0382778abf5e4fd9a29dd3ef97f287a1ebd29ba21b8773c28d0b2e620dda8d0eedd13ab6d09e67cd02e6d8628dde1d6cd740e9dd04d7d208d214b1b42f2deebbcdf01137865bf5e4f92966a2360e660e46f9d85692e81b1463662fff3175ff5dd30c35f7cad9983639a1657322b0ca5d7a6a3c3e5d78b13801bb272be1fc364520821a36a47285ace2251465358b22b8ecca595b4f7feffd8f37ad2310aab411257b440d5d99460e4a381ac41713d610b061741d2ea15e5a91ffd234fc884188af174ec4895f67bab4a85b10a496147386b88fdee438fd11d4e9a317b9fe5ee1b2fc31b2e4fe976b91a0b222c5f244a811a21ef1bf1dc4dbe8542eb880a889b3caf600ff0d6f5c92752573f67b09e48933e18ec5c2e7dc0f1c4b3c655e4dcbf72be35c78faef41765cb0f51b496745058cab298093f85c2dbc544def635377668ae59b43dd53aaeef07bd3988ef5664acfd3126fe25abc0f0174b8c31166b3d22abc443c5d1c73a98a5aedc7f1eec58a7f237a46c09b5c0aa148438a5453cb42b4a98297b94ecf910c99a40c29f5af5184e159e546a1dab0ed332bfde7c75d2d3bf97973fb06ae7cf28cf80b2223be0bb0099b2a7429e8d8c6c4905d69cd6e70fbacadd9270cf20a5b5e4504a260d3ada8084d6541f48d90ae70d164c1261592a2f4294b51a1612cc520b0fbfa2835c3d34a673878601ee72a17367764bc71d69ba0d9d3849e3f8eb6228adfbeccd454957063dfa9c403f923f72fd51960efd0f780787e4cf55b2a68db0259cd154e36d7a2a8ff9c82dac7fc69f3696b5016d41075c251e0137cb675af0fa76044d80955a084bb72a854dad0f99266ad3fce937ca66a8e693e7a674ede3ea1ca14151036fba7ceb669ea1803cb0f9f4cef763b291ab99b3913e7a0fa337cf7534f47124902b917bf6fe4c0b21c1ebff18709812a40f6743f439365ebe76f3295aa43b5757b6d8aa534068194f6190e19768262300eae53331f46ac12330ea14b08b3e979732cdd5dfa3b202a57b96678ebd4407f881db5f2adb448907d93bc92c824d97111720886ac8975e942ac7044a915b6f0065a6184e8fbb0f01a3e0f345f76a4b252c205e42d742f4447170e5415d98a914f484241bd7fb074f3df82485bc2afc3c8d7006aaaea3d4aa7af261fdc8dfd4a74ce80606179070265e6902f4bd6df8950ca2632045473cca607ec05b4cdbf8c595b8e6c7311429da02d64c0572112270284fd36f7e389c465f1406d40c8be768d6fa5ca8f0afc13d4237f0a96e44f200a1c68e37e78bd55f5e167d7f466c69710693e5194209599cdcc51e204b7e554a27cb60d750435f0a06568d3abae757bd7f52263539eb9105217b3cf497240502b3cd4eec18ca0701e070797e1a74004894d66799790fad811ca3b90b41c2c8089d500166ca1ccf7210ca52436a9068978acc4ecc94af614ad7ad22acf9f9104fb93f60c544a3955b92d0ac7a6ca75f7fec80cbed79c4474488f0eeff68865d7b1486ea01d2f978f4f267f85b6a5f0d3d4dc287d0191bc531b76a8093bb45a27b1f3efacf7d5d74f051ced5bf294312ba50574b7067beaacee81a673cc03f25930b37745b91eb787c7c34d8c88ccfc60bdb00264670b3790affef4030292f14e62fb960fabc6e127d42ec5170ffee22835482b207c9936e06aaa333f577ff3f721bc0d7a65673dbc4d8bbcea8ddaa0545f9af1a4e1b0b1e9a192b594a7dd09f6f28654af3c647f4c2362b4ffaa8dee0125f14b0b232b4c86480b6e029b8b52a1c0f14e40530c9a2eaa46ed8c5dc5ba897c383cdcea42a26fcec13f8954ae54f31001ef39ae542dfe99367b70d409a163e07ee9582f584b4c99d40786accaf2cfc0bf1027826ed6406a562b4ace917605a4bfe8aff0cbb4f6078fca401f7adb63c360e193bdf6656d97fb23a8b630f1bfb5669697bd719479887e2cc125e5d545431faf277657c6101e6b0de165f9a2a55e12e43038aa402e245f23d691d3682412bf72eec2dd856a19d1ac92fe789f3764caf0f4fae2eb8dd09967cad91eb39ff3fb23ec4938e9c235d6b693e265624d5fb3bd4cd29d80b6742249377442f77ca2c64ec59153c31c1f0b09c6f8fd7b65ab3d37ad13e70a4fa59d0036b729d06052f6f33ef9b009f7004ae331415f68d58529f030139fedd803ccf695026b41f1f26b97085a6b7e81fae97a60e6bf4c31fdbc54b9a72075ea7873cc0d903c5ce5012081319ffd7f0b2c4eb61f452a64e5bba22329dce8e41c76bb2603d557b581737f84e6bf1d2db403803def3e19bd4114fb020d35a962ad11b1c857fe84452a733743eac0c4a48f9f790f7528adff182b343419e297517145f258917f1e4743d0bfd8395a2983b99e22b319bce55bdfd686cf894693c89d160bcbb37262df08a3ea5f5efffa565e39ab7cc1da6514bfa246bbf27f8de8cb6bd794368b36edd0e21b80655508eaed5aacd9f6e0a38c801b3589e0bc01eb582f716fa47904c44e736202ebb67473da8cfe24b08139cad38be74aaa24a986aa420ad8254ba5d52072f2ad6b7bdcf6489deb974a12a70e5c6b32fdcd3d264eda855240aa00b5c14e10b7b5b0dd5bfaeb90d8631f91a34db8d4635cd25b4569d6d23782243512873542d46eec4245407f3a988dfb5e0163da2177c0b224d7115c34d446f8848649353376d4f74c405a523a0724d9c2cbcc9cf34937305f934b2abae7a186594c2461710c71d750fb49b19d28daba94d0fa40c756f6251f2da3518cfad25f15016012704e5165732193c4f13cbccee7978affb823a400f91ee5054b009d50daecfad68144874d3958c089f5ac0d03bba0de445441d5f261bb9a57d81f934657d685bb6314bcd09e8f4f8dcd5071ae65786a4a5e03a070414ff437de3939fca6782faee0736a3bb2a92df7f25e9f4bbb7d4e2bdc7a14b16db88f8d532233881ab437ac910e026deff4d3c4d98da4cb5a3e8b2b975a6e911b60e5eb04b156334e03c29b90821dfa54461c6099ac5efd5739eff53f877c7cc54def43f015f5223930f12e80c7110cfdd6fdc038955298a194b79f479a84e43886a39b3561c86863f4572c70ccf29239a93ef7c49e13fd6360472ce04b8d9d7576421aee76e57f93a214d0d2be2bdb114964eec450a742e624668a3a6b35a9e261a872f5b1e11eb25b20cdd171f56eee7deb2bd4cbcab25d46cda0cd59f3bd3ddc24078e31387a96788d83b2575ef1132bb708d830b59f938247cc647400fb505f2e386f8b10d3aaa7fa46c2445f2f4e11f8d8d1bb5ab4fc64cf7b069a1627b541bea9361a1ce7f498625bb1e5a15a12ea96def3b5656f053451834104677821a38d6f008deb95f852f67f30b66bb4835d5e9d772ba77deb98f208f702bbf91d59e786e0a88315815456d5617b7d55c99b5cef6dc74f11f070c3676d89bf72fe7564eac120e2123af1f53e230ed3cc08d597ee756d18b8991183ca0d67794e9be597794efc3412b0cf0418f3d130bffea423e9a67087c8342bfeb32e4ea0814a777fb461c04d085e55962ff1db7c25291df04d7165ce4cf8bfcd9eb99cb0f9b1ffad98859e7951cc5fa7e9f1f5e338d1595639d1c294869110c623c089868984191cfe306f53e6e675686622323d579abd0592b32859f50780920334bc2f0b6ef827e746f09e3b04164e2c33101bc7d35be404a6ed4a0281ec543eded11143f1b66d1cdcae1e8a73b47eab205da1ef3388931d586b13f7816f2fd35e457611a79ca62984e4b53b4a1fcb41236be8b6973746e23ef6cfe262cf57c3810416cad02be9a8ed6e9533ca20abbe836aac25fb67c9b6fe29d6b059c0922e6a2e20542bc9949d325adf2aeae89e90a1b805b3789811b56f79b4ce266a4a7fe228705eeca27f7c0c30b212d66dee3630dcfed56b0da0232cbe8814a866b791085530d81d8cd27782c9136931b28837138a79886bd84ee6b79222152c21d89fc5eb506ee08e83c1cd8a3ee782ec3b9a90ba320719a2042e3a376a1552081717d48d11b2a4944ba6479a765936c626de634cc3eec0fe21256beeb8b64550b9863108df491024bca785a50b18ca803b15203d22f5fb3d14a2469cc5f01bd439f8020fec0512445c5335bb2b9705a03a3640b797533ae85ee47c4d83c7d8ed852d145bced9b2275567f60178391d03624450acdd1fce14231bfceba2e54a1bf9f15f398f55f13874cb0363adbac86b9b3cc3e65acdc2df5c4423a59b8c830ca8633f10758cbaec645b706258c9c88633b59303fb4c05e859894705f644f3e46e06982c6144edbfec2da7ffb582ecd0788cd12c86e421abf82e2a4e3f368957ccab8b2e9cbf3361c28bf76746157cc8241840583688f1829b74902d35f80c683a49f42f911f11fef98d5962fd1dd43999195293cfdcf7b47347c92687e6717b9e1393f0ea5788af7d1f8cf30a8d5242d05f228b65bb2355467cd29f6dc0a1c75a99e60d67ad2075e105327017b00821e7ce823c515c9b6228c4f5132222d466abead48f4a008029e14f6e09623944dfe92781167ce6c6c0d1643a7964075e300f14af0033e2c2c22e4720e199652e34a452a32f1d548cb602a6be1592d87c7c699c6e0d614a1d766c6988123815474b823352c13cb9381e5bf82a9dfd413a3f88f68a5b46fbe978d77ba8de8d07073dda9b20c8d80b120339aa7e2b7f4acc5cebf0ad93e96bca67bdde01da95e6785e43368176d8c37f291a0542bbfac2c52945becb52ca6661c4aa68733433f5bc271eb3925d08a6f81a18a0bbd5aa608f1029318c56ef9ac2ddfd42a623794b7f511fcbb29637fa72bb780d2705f799644845a4dbf79c8429a7e864ea5c5e08f66aacbb33b5e77829241de88a5fd893e6d3113b17e77a325d9094b4a1680277730452f9806a32533efa6cd319f0a83cec908a8f0b97ab06175b8a1d59ab49ae21b22b7a438945ba4ca4526634353cd4e2b97e302bfb9a69419df011edcdd8b3cc2bfb0da32679ecba47cbb17792f07482a630848a13958666d7f444d73d492b03c8480b910ab49c7bb19c9299faee0e12bdb32f985ac9ae911da51e8430c12199503d21f2d1b34411d7ee831cb8959dd4ac688b14121eab2215439b9272b4b3eb9a5a4be11cd7f178f365025210cfa56c9265eee9d0e1f6d50158ad5087ba94e5a62b30512834a4ace8f4ebf3a5535766a4bbcf7fc4d6158899f71e5129cb35737e3148c1cdc226d612d0676f02cafc9273d0d6712c2b337b2692757eb81099e2d784656277d54250721298a25e62602afb6b82603635ab6ce28542ce65ce904420aa76930d15d4974e49e9ec71e45ca07040927fef5f4c8d5d78ace828c8c753d066aba3b015530c2c5eaf1763cf0d9d3f273ba695a6bc0bfb8f4264850fd9eacc28d4b08817a21e87d7fd07e9e18ac7d9a1ee9a9105f3aba700c15c9613cea13519d273d5a08f31f4f94b4df5f7af84a47bc354747113536b5c240b22fb60616cb72c61bc0ec4b2f179bca0b262c3b679cd3490a5de6b643ff0623785cc94f55b6841a13c08cd517a73f8f841047f4f235cc7f10755c12881b5ce766066f31c4b8ac0e1687861141d1bedb0f5243856d8701ca8fdbd53afe27b950837fe2c6d3e94a712fd23c9f5c749d3c6085cd097b648343c800cd204a6b71fee983f0986174164814129e0b9979aa7a1be4317a0f4026593cc905e3cd535e4c0bedc9dcdde375f206cdd122357b8856f7981a771f39fb1d8e791dec389c8c62fec0a4f2464ce0e13c53dc173ca8529bc8421814be9f90ffa30e643532f4076d1177960a031585e709f74a681ad831700b73c9be8f0caba789caa83844f6b56cc5050488202912990a895134c2cc0723d7958e560c439f3424402d4a17f143e6c96d9e5939d4a1c610b9efdf27794e335f40eb7a01ba7b8633d447b9519ef40e1dd6f6c6eb398173242f2684962f2b9efd9f34f33a9ebdb3cab8b33749f3025da7f7b9e82f52576c3ba0edc80e99b5a2a4e92bc37856f560ead408c2bf99cdfe30de66be54ca5d141b4e485c2aecd68ee9170928ee991ea0d2ce1a84cea82e50626bbd6e8390cea12500838ae0d7bed0acf8912a01ef9bcc229cd39ec9b0e10cdcd7efcfa14dd8fb094282f01f3f440bd3b9965ea3d39bbd0c799c0590b8901f4954cb9cd3ad6bde37be86c550c9932f354778ad467e3a633df2045bb6806f288ca0fe9b52c9bedc3d5d44deeebec3d6e303c81306af5067c22dea387d679546bef6bd9d636542c8206ffb92b1dcccac65df6968ed9468687fec6b5db9f30cb7be320912ad8a3d91278f8cab1ee05fa52c8c3d77b01f6aae40b8eddeb500a0b3c557c82dbd94f6f23d95d91b51bcef105fe86f68f9dca32f8a68fef8feb9b56d1d47269e22e1b06d306225b7cd46f11b0636d44ca75fbe6be9701c24a0f40acec80ad8f527719e353fdc631350b028016c0543bcd0ab3bad9089655244fd5119bf73c250d2c306e0131534a85dcbadab8addf13108f3f2e28c49f439f84426ea3e3fd7df2066386738a346c943ce9f476468b6ca2fa23ae2a5e293304a9ff8f618c790cfdb4c50aa1d904c4c4d5e6302b705cc88babbf8e90fae87ed25a0ccb0b56343578ffdb3b00d601b7fed89922644dd011b9677ee1a200d9d06bde1ec9301f40636811a6ed5033479588fdcdb50fd3c8e1f3a10d2cfc30c2b6ed47c926e9dc31ea64d4e55643cde2ce4986173111ff4b3ed68251542a3ae3b90a38767b68dc4474b19f436900caba016e99fd1820ac710b422ad32e75a896f9f7609d5f44e40adbc792c6bf71672b7a5ab845e8ae0c5fb49e2e6fe9a60ab4b1a1938bbeb3f8ad5a55b5d55732dcef12362fc5fa263d57cee63411f4f7e536b0c1d38474294daf1e7ffc5e70f39eff87e1d3c7ade76eba18ff9d0f13b150d05188ee18049c8b59b5c7393814203b364fdad9128a642d1ad0a97443c3388f24e2c592e1d432fcbe5fe86e40c352075407e1e0ec299852d1f331959f482c6c9e3af1cce715cd48e04fc78d0bdf60bd0943d189d595f9787134de0d2812af45f6fe87ed9c804e2d4d866eddf03713a2c04a0da83df0b580b27664cc1725a44d95aae8b6a819bda654f3e8e0b3b051a14899fb83910ec51966b6ce8ef77719fa16abd02ede10d8933d038c82996f737f4e0620b8142118e0f83235a2d5d4c8afbc49fcec7c5f411d6b04d8ef1fa823e94251973a604c630fa07d45cc1ba130bc6e48c84e3a59c1f8c9ce698975c5a208e6764ff5d2fc066e37b4594d20dcb6bdf845dd371f720bb5f0110424a70a20c7b5bb9762ba46ccb1b1e1d1d0fe255fe884c8ba8f6ad1d95d09948ff6e042d0a1c8a76f58ffeda4f99a8357d92c363ea6af31968f047c5fe1199ac915e04370565fee1f0c2d1507fabf3760721955f160f528e3511af9b8d8d39bb735be44d36693f372c3647111a5b931e11d30151cc9d65cf599d3c050c580a902a4f52d110f99a823e40e57324feaee292797411050253e4ec5432f7774fb81ee6ab88fd295f98b2da11b0f197af92c9c6dc263c8ead80cf41dd436aef915da9924a1a1f346ce068013edf0e74621ef95114544addfb0e88a2fa1ac48eb7af6a44f7a517185381d4c3004a42ccec8a024440ef37718aeca21c6dfbb8725e53cac57e0ff81193a77974c8a8cff10f0460a65c3aed1d5be1b150648aaac603680bf6947ae23e90c3d287f056c32e7a7d4ee567eab30a0eda534dc5500feed2e7b930b33ffd2ec0e6e1b1bf4b400aa60479ddaf4ab68e9555ef29a20540d44fdacaf0e76d1603b83b1d31bc3c812db8bfcd5bff7f3e9c25a34ec71edf4e3d284ffdec79736138473416180cc51b17875a4c49604c73916699b8fbbbd4d0b8b7c87d84d7c1a70e4c7c67c2d5c168914e297a77de6884d65952e03fbada40ddb3ddb2fa2c2a742b74c1685411de9a638678f7cd8a5e689c9a11028a412e222192935abbd783d210dd13618c10208ffa5947567fafe6c1769eb269712048ac0471dafabe98ce8f231ae7ff7ce5a2f8b0640b00db2f438bc2084ba52030c6d73917e86937cff20523525c834e0c35c398da8bf758ed3e60457681cfe29b16ae806bdd03a455bd360fc43bd6d21600fd8595df6d04bbe2f07be9197e88c793c22d8a81ee2c48c504a99e21c7e035e96d57b2aad58330baf43730ad76d9407c7c599e32629c161435372f776cf70f3bfeb3c1285b2a74126b90ab56a5fd1bb8d5c0e32229310e5dd510895ff02174c102a88a18e253d928c42fb31155f80b0e52a356a0e995a8828830e604f5c3072137208203ab3704eedf8aa00983ad048289026540070b2627622fc06bc37a977c11ffef850823915fcde092f1511689373acedd77a96b36cedc0b3931585e20120b81f2a025e332c4b4705597f8b61798d801daea8bc4e725eabf5a08cb84e26f6ff967d3a7e84cbd25c93be19981fe31bdc452792f4651cc072f4e958b29bc0ade569f0c9150788184cded6c008a9e0a4ffaeabe9d3d0ee51e2d755bf8594b5b2b3d509c4cf4c0a7a2ec6e8cca43cf25ad028caceae8b55b48a6a165a5376c88ee042723f930810887e94c2a4f64644141891f99fd059f2b3d08c77c9e3a602a2dc1c128ebe05ee669ebd0cb7bf22ebeccf4f89cc60d825b341772f323afc7bea1102accf9ea17d51611d82dada48224b9948a07279238275a101a25f9c4732d051411109542c6f68a15352f79a961f23e9ac3c1bb6ae4c05a9bdf7730e548ef36953fae3a9282be604266ac981c0510e4eb9a76852776e1db833ff1ab8f4d430f886fc3170c1ec97b08d03179d9401f8c6e4881891b2e27399985cc49ef542848d682eca06eecba4ce654d11c5088b220fd761f76c9b45dceb6f17d556c1b5c757c0b7e3b5ed82a8fded93d33cdc923607188c13c6afd93239b090f4d6222f63ad50295561d30a7d533806fcd8d06b8e05c71a0cc601f3f220113be9ef67119df61158a8a85414d07702d16ef110649bebea8d1e7a3706775180ad2ad9005436bfc87692f88d9ae0b6c58e0713b2f48f59a7828069c401d1ba38d20e30bcac0c0c2580f1224606b5ad24c1cc16430a4be60f1a7e7cb598e57315ba81d4304c6bfea512f46b5b97023d0e13e0b8d3d26f05b01a86c95b185a986cf44ee4e613698ee70d1e5ac24997e529c2fb8f27c60ac1aaea008c0229b42bd1f55deca61f73916ed9f330462ff76c97b7e5e2fc2f03ff3ad574fbcfc39fd246ec35130a763051d6107a4aad1965b3a82abffd1d3b25f09ee3f35faf026791c5943d3d1d0b08db7cf86b47ea77b5984e86e1b238c694ef9832130470ed2e03d4adf2c06198e81b89833dcf307b0ae9c7cffe3b177076960d462341f494b11ab6ababa9fecdc44cac92e96f1401c1eec1a851f5df02c173bf8a088f10232799ba2f0564714b12399726bc03382775bbb19fad60b935f14e1b1dc93ab0e0be9107b03d3da1e0acea7d724b48fac5d31edbf8328dcd0e60287bc54be104b806f380100ebf20a747b8baf3616a1d1d37d127aee6edd7fcfe79be425a80f515446069fa2836eb53169f38c26b3cb48aeb10d2cd2bc955af73ce2fe7c1615b9b7d260a1200100f68ccb7184d91dc5f953a2d7995b56515cd4fba3f08fe3a7f4828ed81559630ec4e71551c92c7368c2c5778a8d966c4bf1dd6f48b3a82642bf41acf88855fe2f00000000000000000100f48732fe61d7d9dd2bd0f7d87cc859b050798002075d3d1c0946eebb79d6fa28bc4dba2c580005375cc5a8380e5281105e6d5fb9c80b3268cc46627957de6a1300000600008077777777d80a1977000000001c1d1c00000000000102a6bd0668f395f60493504c84fa31f9ef4c5b91db0d7680c8a306c59dcfb0700bbca04009c930d604b0570b57deaf4498a0a7e8ba68735c65a1db17d769c66f1dec1e5765887f99be678e9a69fbd999845a079ceb04971758a5d5a7750d4be03271445314e677da41dd93388598f39681841f47dbebb89d45d8b4a346424c3d1739b1a1e3d1869801214b48f9010ee2655db32a761969b13b2ef1f288a456243c1d8ab2ca04f2c1d192d6720ea08c18261c76107f27f0779e05c95dab7bcebbb2f440f8866cd8cfaf71aad9cf308d1fbe993cffbadb687ae6e0743c818fb45728d63791424fcb816f7352e890b6d92a107afdc785a55bdc2ab82280dd343d347b78cdfdd83adb577525373a67483b3ac42ececeb0a3a080930be42008e1011539f295f9ddd1481a8d6ace4a15246fa8446ae9eab0df28866284b68a0c4034a7aecf1fc720d9465afb64460707071134a190c9e02ff5c002a4b596b109f04d3aabfef46b7081101fb807d2b702181b44027b94aab47b8c0a482afbb398150dfc7db2d64fc164d9e75f519e9e38d5e4cbbadf799ee816e5e58ad2900dce38096c0fcec4d259be1bbe7a60cb22230d47a70e1252bfd8ca3d96376329aef2018a6edf938b3b07c8c10ab6a5a623370267565ae3e51d3b71f42bc452c03e9bd25af0c7911886d98b7b4c79c03fa585b2acefaccfc00d9533e3a5a5a4b1c263d427974dd66e6f1012b0ba2a5e76e76a7cd3c31c50c393e58c739a452ded07100e48cc5beeb59d003784b7aace99b35e4dd0a65b38c1c075164e54c065c1828faa37e837e8568925671035c82997b22e8f79370daf300b2471c13b80690494cd008d6a3d74200640dbbdf0ba0f0a6ec70ed1dca3a44cec2dd3ae2fc8dd0e5047b46d4ca159a9041f51d2b8c6c2a16b71bde1c750d53c6487a5453e8d83bbff9a00d67fbcd0a667c91394b6b83796d200e022e9648e76dd0ebc4ee597558caca1ef835df89d3e2bdc637c1ad722ec1e4f0f1305e4676f32ac14f1e38b13bb581e9a0a1313638fef25c14b36c215df8c86cc05a5a50145e5e942b05e27cfddc42295b0f103b79510de175c5b4be227eeb26240fb7586b0b986da1a1cad038ddce03c62632107e74b14d88d9d04f142b41d7f1a666359647b4d2b6de21eb7e14cbdac6117a590fe125136963d885dae17cb251ba79fa8054bf8b4707aad3290ea8e10be59b8fd52d9017e53e9e329ee632559b1e2c54c4344a066749da8e962c21abc1e17502e39c1f8a5d4aacacd1da4e5f5ad3ee5825e5d3528af14eb06409e1178c4118c91d2ecca9484b2eb9fdd3af76dfb21cca08e56a66869b337d80f2bc0cd86b0416809332bdd246ce438cc04f6e0266850bcd3bc07199080b94e29c04a1c94e8bcb90d6a1a233fd5eb78dcfd05c29e80b48a6fba9f0b50bf051623337a9305783841f3a1e907b63a262c1a18230e88ff6f2d358fc2b4ef247c1087258f7691cfe9dd188f8d743534c08999747d5d539e2b409f9ab90cfc29da288c392145c1acf05a3c099b8d1d41d53cc3f80c0418fdec0b125feca2a4b0165ceccd9c23582116762c401c294c80fd03b392698e50207aecee626ee9da4c788eed8ade089eb17f37db0170bb2a33d96763c771f62f31b8048482c51a8bbd961bc5248dfc8c6944f6c24c17f7299f4edd9a3ccde228175c6f092620bfb0f3740fd1619e98982234d21aa9b610c9bc257f16ebb58f07215a7ea41959ad725139da7a88f8c47396b3ed9c98d90029961811d80e2b6d931646a8a875eb736b5eba16f35bcd77e820ce96ab231a6279b5f5e12b02b1f3324932d346df1235ce2319f77a1d07bf6614273c7a1e35eeb4aa6ef1ad2507775eda1bd2f0b59d6700f86ea318941e730126b5ba4e20bc6bfe992f9dcda4adf2a34134594e6d94d89807154a40ae24d7d55014120b712984017c7292ae37c4c42f6bfaa4af5252555b994098a27d44ec833c70e8a42f62417f9b089ef4ede34abec75020be18486bff2457265f41f88560b366a0e050d670c11c467b465f8cc06137573282f1f6344955f1a32498ddc162bd888c9c5f25ee8b05b5941e307decc726866d4f7f9b3b71c66e3cf410c8f30799674efff1f6f4c720f671deeb4acbff16c75567ceb03656974fdc6c81dba378b7767033812e6f91099b168a177758058bccc267234cce4f88a00e2236d55c2de099c7304ffb8be26f3b746fdb80d73ba262902f859193fbbf6bf8e2ea0fd222d1d835e5f75e9f9f3c3621b9362bfa330d454b73ec244bdf1cfb694b0aeaec94ccd55dc17c09052dd1440f95f9bc433b8e0f8fbff31e2036d015e0895df5daa58a2752b1cc18054d0f83ff6810b3aa24f66e2ab9013b52a1643cde90fc2242bb164177a7382598b80a2c076244412fe3a29d63420289e26e5600631ec2c335138bab56b0d186fc6df0b01f0000000001917cb982d92f5e3b74e5c2f3451a5b027dc882a75b0ce76a3f22f83507085fa20200000000000000fde01ce22549ecb4ad2de881226dd97be9afc4ed87d1b38b4b1aaff9b3d2fef9ed5d81becc57695e87b17e01daffd65d9b492dd27c13b57a521345a2db9b28445f2cbdd0d5d2ff26f16d3f3525e6d924090292c78337ce3f750e015b5962f6905c493e53e35649ae8754d983c4887b4d6ed1a72f167e5b7de6299dc60f6791333287af5968bd098af4527f6f16e07acf0966cfebb733154c4abd02f0a95ff08cf0690128c5adcfba7a43f2a5c006ed19a48abcfe12d30074dba878335d48ced244cd28287a24cba787ee1c5cf7b27971aa48998d9d241159b986147b46f3f3a7f4930343115f8005763f6dd71599796e1672d6b7d1f0b7d8f596bad51c27274201092b8f380df21889046eae37b2465d042f6dac1f271790025d2a2fce441d86a1398142f544668319ffa2ea09419c5d9b32dcc727af180cf85dc633c8fce7b1f9f6924a6471ca7e55862f32ee12ec8c1e8b8772f235c07973c68cd543186927ae26b908920eb270805ac4281016d0708edc0c3458164cbfaa3b728197be2ea0511d06d1d9f41654e89c5ad0fc62417345251af81fc3e8401c8b2c2331984ffe9f3c9b0cc502e0e6a24fddaa3dbd3927e71eccd53c80930802b3f97e1bb57191adeb98d03712970153f5e4e118545211ccdc14787dd70b6af429d773ceb00f859edf9119c3dd963fa66ee8efa339efd98575fe71a359d1d6743c60cda345bddf4b4d230eb3870a3f4082aedb0343f02ba5d91d480eeeaf754e14d06067e25e589b88aa9202bba9b9f612452176f1cda6571115275f275d67b927664cff9f27119aa13c3c9834f5567e98a17b2aac359680f27adba33a20bd8045a77ca0fdf8cd63e6395127d04846bfddb76b4aca75156e465cc44d835317e7ba16ee154c25ed572020ca4537c966c26ab29f5284f0c4abd8cf1389efe2b961eeb867d2061cd8002d13f98efbff93f644d912b1fa6869d901590e5e07b146a7bc8ab7a30e6a28c425a7cd066d58a53ec0fd861bfc913a9b586c45201a3ff25daa48abbf4919e8436b85ee9ad2bbab09bb4354b9378a9d1f81eca13667ea6a00dd87abf27226425d0c9a503fbec5cb268b1baab1152317cb8da0ea4a4d7a44f2c4a4d1d521883bed2eb57655308e4b91dc8dd44e6eca83453b0b6eda55522f4dcfeaffafd2260e61842f04b5cadd6c281354566db8a054ae3805b074ad2f43c35c8c792b2f0003c3e9033b421d697afc08272edd1e9be40ae95c53305f0f550bb5725422ff24e2fdd52e58f7d60701e6fd1c29c45d84a601fb09979d15fb46a31ce4a6c643f8efc5e50bde2c70c362caeb6a471b48409f7ec3d34af1732e96e0858fe1c33c25b70a8b0e77aff19b3c7ad1d461fdb8ab34bc4d073ae5e819ee1e6fa647163e4be69ed980be8eed9bd72ab27c535a69d05e86aa0c3a44f43ea7de40ad6a8f6433224040b1145e76ec8e5d34fb234bc93da3d88e9d20b035e88bbb7b95451e8628c3c725857deb0fecd360f4ea9132a8f7d050ace1b904961094bb495ce4cf7e9705247b34d18339b25a5e25542ca454ad40022cbddf45a82f3233ffaf0b083288fcc6952764f2a6df496e5a0fc148b757a9b48c94a6b57a246e0d541b9c0814903242eb9a052fe2d20baf2b54c62a1ec276260c6f388db80ef04dd2c8ac6f77dc2c3a9f80236ac3cdcfbe8053d675142536141cce25e4f4c8649ee776d6d7e1669a5349978bfb296b08cf3325ae5e9d70d9cd4243d310dc24620b14bd331df5b4444aca31407ba8a45d75e4e1bf818fb859629305312ae0c1527fc4711774fe2afc42d42b3269e576d9692a5a25175ed3c3d737e69d1637213ae8570285c5c59c9707608feb0699eeaa562fba4197144ee30be505c39c7ca62529757ec1760b9ea2d85512e6d33721265a5e55ce294d7a31d4ac3da76b1f8066e4e0a1ca59b81fdb01068f9a52847182a9ab323a5058d91a2bb8de0bfffc84c1938fa47ab098d60d6801976210efb15f679435930e6329a0034e49bac8ad70800034ffadeb7dd2c18a9f324a2001d63fc5fec0d20a6e22641f1ea90785d81b9da37e574cdd42c0554c9b83de25233d18bd27c990d9f32fb63667e902d463551c35ed44f365a3761819800b36178e8f4d609f5e9ff5b7d5e72773680db0096a8434484308e46c4efde16a370e06affe071c65b6c4f730ad7569f811e0c637379e3a4032be09045b942c7393b2ca43f5bc5ed297f8d6973b215a42fc785eb41f74858c6f5ab113555342a30493385783fba9f7cd4e67a042e7f11a777bcfee756afffd6f6e4e3ba63e2a92be1328d295308768f680a2340b68d4b644b99a0deb9e075d9dd0324b9f76124f2c14cafc4845b19521872b17fd2bdeea332a5924a3b7d1c551eb94376f9ce12720e8cbd957676aaf0c530ab0da5a5dc2a16cd542ab54b73d98f6d53009fd36ce0892c201658bf181ea6d9a9b8996a71ca5fa4377a48162a026615872e6089746297d85039fd1ce1007231f2ba185bc13a5322f7e862d5719d52defeb9a8d424b193913d9acd4376d1c990f319e083dffa0aa6322948886ab390d26703573195c2b7e64a5e457817080480da5cc0eb1759efbd64d87a44365a678bdb598511c7e133aa67384b62d63c5a8ddde1e8c7c590dd02dacf8c8e54738c9890799fd5ca83ebf7c86cc3ee95b8e54a22a7c507da5bb55dc8f75e34abea9fa8e2296bc199a0cdbd5aae8001d4fbd98d51e7c0ba67c58e656e3f3e53c8496fdf457c7f931b1389e7d6edff3dc29df0baf929dd18f045afa1133716705045cc9459bd25dbf0622ee8f21b50814f59f0a39df6252a9b30300760e695af5b153145abc9c95eae20efac39206d2b84c1e9242d2b5bb7e0a7a3da5edf70a3aee5a5715b8add667bd1481e9c0033acb6d5c753b1c0ba420d934d5787c5d86b764d2a14e4ec8bb8f20180ce2e518fcb10a1fc36178bdfbcea1eb68584553fecfac99ed1bda5b1965513c12ae2a5d987ba7e3a37a8addb927ef82f90a823454ab3f08fe33f896d4e5d52140334a82b49d287c9b03eab486430c1cd462fed36d7b009a56a5c118482b572ae74717fe3cb135f2d2c863f09314db092c2a15bac418fdce46e879cf55491813fab7cabf6d5753f8e172a98b003916851e3ae9bd3ede75791dfc24cd232248058e1e87b99c36e2676e449d6fbd807b2a09adfb4cdfb456c32d92564220da951084c3033d23c626a098ab257776b4849a1e7cb7c84a6e99c4e5638d3eaa7b6a16c4a2c5d488e1e89a9d32f6c9d545970b5d750a165fb14224e0f3f05f0c1b9e3ffc54aa667bd83a7abe2bd85c69c7d41b78811ee42a0038fc8e2d57cbb855de3946e0c9d562e2b8bc04f18577210a36568c8bc3a558c54c05a16979a926a1f70d32b443320e60573834cb9cbf189cceab7cb14a0ea087b3013ed72a55d113381c346837f8d0a72864157b2f95dc6dd3c65f84826a31e2f456ef4be3338d69b2288e9e99caf0606fc33d2021a712e0c75cf7dffe6af7dbc1d770e56c768d28d101276e448e99ac649811b0a628c6f74a11bfdf1cb5da4f1dccdca1989c3ce8c321038d2e0f111f6a9929fb4294ba937e8868bdb446a174fc7bb3f975bbfa09c71506a755b1829026bf29200736e7c6bac1e8c2033f9522eb8451657e7744d6cb335df5f4ffdf6106590da5dbe6ba74f9e766e039024a11b52de7a3f0119a3dff0c306c66167d1c5a7a2573d8b404b9b377b1fc0a2fd86ccc2971256161b1a88501634ad7c42cab02662055e9e9aea6f2f0f83d6d02566ef334a931605e7f63511dfb36b806c6d42eb5631774cfcdbe8d286b8c4624d90210fa7bd048b315d85c18870323f67d9b89145cdb6acb5351271095c2e25e75914108fa6b38c172929d3953ded865c10ec730a666366611b63815532db2a6bc5dd4a97b705bbd3e818c3f26e6e93095abbe3170fd723eb44d6a0915613f05c630d69c911f676e6bb89f12d2ce5640f06ba4cbe00932c746bf626c0e4629948fdafcae4773fcc00c959a2da092f8bd622bb2825e4ce204a0676c2e706ca69662bd97aeadba92183a60c53d0fcbcbfacd6dfb009afb89bc813bf4f6e9d8019c8926e4aa04c780779bf5222d22e744abace9cf4d04b1f1991daa146cd7af8d5d13110f51687f84e90ae6b71efebf4a2a75a5a05b71ddd410a2d188e62365626628dd3a446ae6e4b3dfd555321000fb7eb77105673075b3c1901fca2ecd63baeef5e6ac23888b218ae3af400dd026aaaaba60ce4830ccd59814f2fd9383f69875cd324dcf648e00f61612aa0101efa5139eb3675563bc853eea0bc4117c7f1080e1ee4574b0fa8ca0baa34f2a7f1bb33013a8be6ea75412b7edc1db09d5e3944401c2cd8a42b5d6b4257f3e3421b9503c253eb2acc4e408d124393b10625e369a48e85518a8c2660c0efb1b3ffc769cb89c034e188dc294d21d6aeac0baff02211a5876de26c6f5b8601dd10ca4de173468a7d5ee2e37c34ba5878813462225ecfae44abb961dfc68ccc1303daded3e611461c6da6b6926546459d95efe2923547c60c18d00504f5d173f69231b8b58f4e9f834f021d8a922193644581b48ac98810624db0478190dfcf4612672dd8537a86b2d447438f2bcbbe19b8eabac018690f0e4f6f5d54744ceeea316f0f61e5682b3cbb67ba147798433f40fed150145d1ab01cfd0a8ed5d08a0242317e101f6beadc1b5430863c16a9856e7d82a7985ec86e207fd6758182786ef1fbd1732b9c394262be1f5a453366317d88fe739b08a59bc41faea239e1c8e5c2d1476a4434838842b1e45aaa1d26b09af1492996c3e519aa91c749aa077740c3171106f5a82d32a8015dde4eb3a25d5c471896443c6f462d20ec791923f851312f5cc09898733b9ea87d4037dfe53f95ba81e630a6ec521638bd657bc773ce41df5c39c8f1450fde31abf9d78f61816fc5481922d3216f89b24d3d3bc21d6793114f50cc2582ab94ed543ed5400c9f89761414e44415b8525f11fe5b4589b91397ebfcadca32f688634655b1330f5e186c982357426f432eedd9883fc8485302efc2783c14bc53990349e622f88fa6eb0926f5ca6b964155b5d62f45091f94123745a2982f420dd45fc4b347dc7dc06d5d634bcab5553d75fbb72d2b0041a4a1e758cb02305cfd09823280e7865787d6cf5d8037549644d52af5311b6b94ecd02c8cd9b9697912001612a870b37f2d82e9904738ba11d01a139a0c30b382646166b7b2b416b82c87b511169ddef7294ab3c081903cda1289aebea20e31c8bef2a6cac3136816e842114996c0cfb159f42fe8dcfb7abcbee358ba1ac62c75ed43c019d7652fd38ce38d532b797c0d5f84d34a23f4944c66bbc3a88b91759f29714c6830225950f6ec8f93f8abc0abc858233dd0fad4d307d034c3a3000d895263948141e143a6de17d825c0a9b11d40ac26a309b9a319ba67e7dcb30c176fb263f1e4d6e9a92a973ac1f61765afb18d0b93eb2b64c085969f529bebf6bc125210c8c0fe9adfe15d4d3278c6152eb94b41c120736d30be267fbee1c0489337e9c18be08bb6d1fb893567f840b6e763cb23a4b1ea79011a38ba53cb09f4ace7a293143cca129345187eabf9b5e551eb173bbae341a6542ffb47b50e36340de2a7a02de37c58b4d78924b55affa2e105cae7b0ecc5c7c43245db720ddba377347270eb907b0add918cb30157ee0a238081cacc4b12e4c3fcb935b1401e9305f20cb24ceda5bee4b0c9cd2289209dcb81ae11003f5ceb8cc1f50673d9a3b2be13d64384475f402ce5a33a3e9e4eea10b621ad7dfb566d47eecc1c8ebc9e914d597be3928fcf3cdf36c78a3b46f0ec99766359291faa68c407ab6d211a5477ca8e0ef38e5319b540f4f8244165317751bd8e3e964d00e6f7ef438a686160bf8759a3e1655a13ecbec00edc0121a1fd458d93555411c83ca9d934111253aea08294e573e3ce36e7d8aff40f709dd35e864665f8b813ba96f134b826ef7329df1568479117f60df4dcb0fc39304728d4522f07dd6be21f3e101f28ee3958bc5305bf8e01239b6c00fda41aff18b29cbc62910a9d4d8898cb6d934af44997248cd8375410513669cec0ab9383e724b23d102321ed0a42ec0e98d726370793ae6b8edcdf00e207c6e70f0a4e7b2589a1e5f4280c7e78d4e95dc5b83ea0f341e1b623e664b0f6244c087abac22bb7161db45dad05f752730c0463d1fba37b083875d15dec93cc34b39af821031b18123370e0ea3e7c8a89d83cd16d056655cfb6bd8d6d7de19e996f61076725313aba4e8fe23242b1ccb81b6b1132a339fda5117c503a90c1d9d80258925754e6fa9d2d95bbf9c8fb7adbd4d14ae7829fd47a665a936062602294c610a0d1fe7219b03c615d3ecf31bc767b199a17e4082b5a6934df4001c30b5385b67d053caf91551f5412c6da755a179f18e1d646374671b82c5dfec212ed76db3cdf3dcdb55cea1d9397e4ecf92ea441af29d835c91d5f626863132f4303f0587cee80cfbd198ccfcecf293dea3fb2aa5c1177df38a1a4440099579551e587624ffddbad17478194eec4d4c72ae52ec1195c5383f3be9c0ee2b369cb203a07d6b2175a0fd8737bcee3b0209a374028f86793bd1933dbfb2ccd2c2fe6e1c60f216b70aba69d86aea02c338d457b88f65a99f5365001815b9875c1940ba1d387d6d0257fc787318283dabe3819dd57064f526ce45dc593804bff72c04c30b53258dc37d325f30cca46c1951d31f8e35807067a166aa2dd1a91cb3c1ef7a38a7e9b9d2160e10a4468f8b8f4d0494e85ae59aa88a5c4397c53b0a28270bdf0c1d168a48eeefc88476c1a9c89beb8e215a2587d9b86314fac20f63a5df186a0c5455b3374d3b8036696aaf31232b9f672ed5ed6e533853fd338ab69ffe6d2610b4a230abf450120ec2472d15fc1fbe43d1102a896ce5ac4f9c1260d6b13cd51a3afd114ed70bfa996685629db2e7dd332c3728fc01e2dbd2e584960e9d350c27e12b99b7de5fc19228e9e6afe73c7c0b57c602c32f5ca4a88b33ad93e3621f08d51493c2b7eb01ba52176df94cad1dde033572b6b556277a5a2c5314b2a4930be21c6f76e167f683771de64ad7f63d446a412fb975e776c38d414cc935785c2a42afed04b31ba476b0f66e9cefcac2f3d3b051fd4906307e16fe493e9ca69723113b7ffb8670deea5c0f20aaa2a59f0206916350ee1044dab3ae7518eb5e58230f9a4ef1e4110426f99cb10c50283021255b60a88ed3a5f98ce2446991e72b2bbe98c3be89195944ec243471a9c91dd72ac05a5c291ff206603e78c9957d263151e9169ef357c311db4aa4c643c4953f972e7bfdd637931d35618bbc35e0c80c3992fc777119b0bd26a78931dd8556d4833d91d1beef758cb5400d8a253e1f310a87abbc6a2479322540a1d437ad93e5cebc8ac5defbbcd0bdb9c08e31156e10b486b290fcd417e0765df551769bf133e251d0065d8b85ae161ce0ee9ef9b30cb6d9e6d89946dc4302b04be39c6a687b4a8601d52a88074975d1422282f67a2b8326ca79aa61243bfb5294614779dc51695d750ed5eb9d32bb2306aac062be2bf39eb647c746178add99289b9fa888ce408a36908a315c6168060efe972ac9090d3db3fae104ffc52d16e186c8c51bc761dff612e76ac1073443f5a41992be1ccd861d702f08f1cf557250537baf794e515cb9880a14a4f24d35cb1b8f323221e99be9abbc7dd59a8cd098e3644b338890b73745e8cdb3259fae6a6e88e90c3caec188ff8645d98edae416c9fbd6ff8e13b625d7c0bfded4da323ee948f0430433db02c6fd0d7dff04b6f6155f4258106da6eb3e60fd980d9fe2f9768866ad03f2a34a36f8b70adbb2b85c18fcbbb42add8a371b5305369825fb349189b59d1820ccbca779e911fe3c2d74f1af2420e7a598fc0134862930835c22f79452a125a9485744b005da8dab851009f05e4aeb14ff5e31b538626e85081ffc9eb4000608af195749d015699cc9bb76efd435bb541d7ba4f017fc1b6d0329fef87eb13dd74cda86d596a1dd6e9dfc416f73be5b5fd337ae8738de8db38f4713820865315d3d7df0c7e31789b0a77cbf6dce98ef4dd0f628444b1398c821372e8df3e61c240432ed9a1b22a0d20c5df67fc2de03867b93dc3fed170d192ef7970575c23760ba6d18c52ae37d15c3210de51b40437a3ce608d31a1261d9c3f178f93d642c106e7460aec45fc70c6413ebb02cf12af85c1fa7b13972fc0655ff718a1f8616801eddf9d6133389466ea14046efdc82857902537baeb3cf22488394c4e7be2bbf9137f4ad4fe7ff4d7cc312b52886ad3f42cb36ecbbed9377c48e675d4fdf12c257d0c989497e1707e6712749cd211a3cc59702b7404adc9741fdce53c3eb023a51c35c92bd7ee392ec83cb8bd209657c5a9f8e7996fe38759ead1d7a95460f2d1e0033944771b8f7a20863a3bb65241b11bff03d6b8b443bc1c5f34656f73ba7f83568ae24f43c820d89c953e90565cd97cf0639ec548bb8cede1186f7f13e5220bae819a8dc8909c8ed8b275a3cfa23e844fb1f0300d41fd8bf8484159c3d520b3e9408e21a6f44d67f8d3e322ac696b69a4b9f0ba0c6b8617941b06f0a0dd27ab3df7a5f47d28db8568bcf12b2045d5426c18d87b39b375b3efb3efda612b4a1ab6a65dab6113f0e6daff1471a0363967864c45f2b8d0f90a23e5c2c152106fa209504480ad74c6b87ebf4b80269f2acfb719df7871aa9776b87e8954408bbd298a011ed3a2e43afae6fde60fdb8985966f4873dabb0aaddbdce515edc128a687d488728e00b3076aa6b4b69d3d9a92b17ae3dd9078fde8c5937bf3d67348887412124b82c44ffb68f3b7e10ae8e730e8bd627430a72130c2a23ff875107d83ace72a4a63024042c616396949aa124555f6f74f39e85a4cdb82a8e6db4235c2221fe17a26957e62abaaf49300fc93cb2874ec730483521d0d07807ec410b5cadce93dd5131d9adb5c1fe7db9b0399a4739da4b2a9ee2aa806c882e1c400991314206b5923090da3a6e5248bf453c3b1b690512da0481dd46198fe0887923abf4ccdd18328da41d9cab5c630609cb33363ba3eb28858ce5c456543ee3373f26133185d48b34cc390be2026a18fd43412e2583ea140408b6cf1269e0d7a2005f746beb07c3023ee7dcad648927f47029d67d23ad5f929c1754a7d07cd26638797bf33abd838bd6b8ae7c7684b6dfb50dfd55a6cbf369f2ec1d001858b8b01c7ee96cd2b5681cf29a153d69ed46d89ed573ea51ad7a4d09ead4cf16d2c8760e8189b9abfeadc476defd46bf2462a6f30ebb45ed336994ab2a9cfc460d6a9034cdbeb35c38b4e9d07f7e4018a9228cdfc1a0207fa9e2a4e84df3ffc3b4e4902e7a86f84ee90737e24ce957c6f2f48f672efc8bf4e9ae862bd04d30a85ff48234f306952585d29f10e8cbbe804641d7a76d144ba67820677eef901d80876ff80cee4aca014516e51950f8c9c72f27977cc02d9ce6b30e9575c5a2ac6d6c59900bd50dedc0b3916c97521dfadc5000ea237806d09ff9908f53c57bd6164cc57a93b899ed36421fd062b29aaed05e3e388b87013403a1818e91f3de61070288591d46f845c2c63bbacf217615abc1b25b6f9f5df128e1f688c498677d4ea7e128bb24041de619a90ce6a8d8c2fcf7c8455d15a5c18f44bf9f11a752007973d15a8d2f06dc7b28bd80336b6ad387fa8d2ea855e5140a14c7ccf63418106f5486d6967aec7f9ea071a6e34797b793b2f362856e0503d22b91ed367c71b11906d5ca84cb9b5befe63ccfb1ba3c79ee7bd38a0a33d7beecb09ff6a5ad3996709184e022af8dc4436cda0c62b9948ab3a5739ce75be148825355e97fad013b940e7847a246ec8ce6680ea83bfe553a93c74afea7134fbe8deb36dd59e9124f024213c12ec7fb853b5734e07ec6c54bbc1ec80d2926b8fc6eea056eb12e9fddf0b692b59fdaf8b5542007e3ae9ccb7d575908d98cf85c2c52a1ef781841ea1bc46535f0113fb6d6db368fb2068ad788400076fd2fc833f33e7b55ae7ff8946cae929507a227d335f24eca76f8e589691e3387a68e8076af9b11dcfe0154a2567c0b14fab240e53683531170f9801ccefa7b97765903f929fe314c92f7e5f46d15800f6fbfd081aaed0b704f5e1b8cb36f83253b5296c1241a058ccf301b3daea48a4b968e7a478ff1e319e282131df793e47577a5fbc63f455fd8d4d218188908efbd3c99e24567c76ec68bf0085466d478067c93290baf83062e0bead72c1dfb9836219d2b2014870fd339072898e2dab9fd1ba27cb2a2c360847e44403235b4cf928697693afa82cf9eb0fe75aa0349db9b2dd9bee2fa63fcb67e77983223b6815fc91628d51cff62bed4648c00e510f8544130e7054ae0ca60db12bde60e97c47656290100b7486df3f00336949a2a3ed968d86e07b04ea4f008552c55f2d2aa2fac8409006855ff058e289bb443ea992b948936963a1090365b0473417e3c6b784c5a4e1401005ece851aa35065f27efe1bfee6955ed7e6fd90e01fb4df8811980f7e561be6afc4faac1e059176e68e0c2fb170f28743f23e374f4ff70f96de50c6b2fb73a43a0000000000000000010082853ab42c9dcf1a0ebf6656acb888910924cf96853f66041ff47e2812c6e3a5546975e3e93bde047fffe1b5f3be160dd61746a427adaeba3b932fa2e833bc0c0000 \ No newline at end of file diff --git a/zebra-test/src/vectors/orchard-zsa-workflow-block-4.txt b/zebra-test/src/vectors/orchard-zsa-workflow-block-4.txt new file mode 100644 index 00000000000..a850d0d4dba --- /dev/null +++ b/zebra-test/src/vectors/orchard-zsa-workflow-block-4.txt @@ -0,0 +1 @@ +040000004a54459c6c04efb7b4f1107ce4b1c4b12366914df3d3f1cfebfc3a2c53effae9dd8e57a96a960d651f3b25ab4ff91994e9d3ed895acd3507fbec3c2813d27bcf9fa3291d421289e47111138dfeb1dfa3ae3be9e40080f168a28a971090ecc61322254a4d0f0f0f200202020202020202020202020202020202020202020202020202020202020202fd4005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020400008085202f89010000000000000000000000000000000000000000000000000000000000000000ffffffff025400ffffffff0140be4025000000001976a91475dd6d7f4bef95aa1ff1a711e5bfd853b4c6aaf888ac000000000400000000000000000000000000000600008077777777d80a1977000000001c1d1c0000000000010291442b349e6b79567e68d960efe013e53d938872327facc9cef87c0929f820250fd884dcef65f5b634dbc0b12967bd3f496e64f6934de2fc77a7bdb75a10452d2b9856cf6181989f065acc166d50b6ec4c206c0d7b6b2e1e3e2f0128a2ad870e72a7f7516b6687e9dac5a0bab76b1254daddf0d11054d26435425d2524d37d0eae86b235728ba5becc70302e186a41b4feb78a6eda7893645812d3e21db5b99dbc544af3bfbbba53e6a7fda43f5dac3a3924c657f58d1d814869c7ff5707103846fa7374b76bba0215e6e572664471195583f37d932051f2e78612d7ce7abf348faed55bdb56eacfe82a0dc8e59668a0445eebdf8663dc98c137be0bfc2edb90464c50c202dc642684e20b87bdd4774d1b2fa10dc5003127b2be03b64fb8cf38f5c9a32f579c084061254e574075deb45f9098424aab3fdc520d2a4f2f5320fb6ec49cd0c31e12c2232447ef887532d2ca7f4e8e61779527d18f3543129e368da25c6a3c5273666d1fb6a313e32e755880e084b58dfb8dbcffb4f4a257c778c81d84fb9fec5e86609562089da4775d51cd3872e9708ba5568847cb9617eafdaa5427df4f8872d664f85561c3813b0cde75a163e9629bdc085d96f987898137ad1771861e39895f68bcb5a6b0afcbdcb4e6bdd62d92a1ba4a94ffde7b1e502a49fa1da5c32b24f048218281229042ec6021caaac28b974472a64510b730476785d9f48fdc93a919516205fd83a2e13bab64fa419ab47bd6f75987cc1b61bcd5be74835ecd1b36b1560f8409217e7677044692f3eaedd07761bf54b6623e738f993806d540bd0d4de7f6eeff0a045afdf07c7844029b1cd4e95f58b795177b7543a975c2a24fac20caf2ccfdef8236c922599669347a4f99029205b97de30048df26610f196b6f5684b97e2a0ae6f4e2619a62f64910cc0ba7cc11c8aee5c04dec78cbf3189b035ab4f80a98e04795237c62145b45369af435e6e7d97fe8fc47da039f1e716c3cb8bf363794e6454360f25b1656fe3959c916bc5124ac9118f063437f43d9f32b73c05267b44ccfef97b16e39728990b2bbb9acb826e0274f3e4e3040f5edd7da04d972bd9287356c6872eaa4f273f1d976a9e4135e484a79f54476383c4b4f060bdaaaf18051086017a75967f8f8889cf1b1d0a263da3c09df7aa4c72a9cc5c9397d141c39ff91d5dc2473b57a1a11ebc1802cb44d4001f0fd6e5ab3e4084a9e61d839aa78ee49c64bedc2cffe383a454711c51c1a078dd3f124d9c0e56e96410c4f6413185e123c6043c7a34120dcee0c448ff68378885ae716e759168a824666fa88c0dc584cc86f40698e1bb280c51b31c6db7df88df699acf1fdb78e78963d51f49790ff835afcf0a27615362a224504353fed8274394902d83886590fb635bd5d10f7fbd4b2f2b0305c280cd5cef0e168efa26ae124d83d96f11bfdd8f3e6d9c3cd9e9322a1dd850d0c39df9a7f7b1e4ae3d199df282fe65dabfa7f6ab21a14d790ba2ebb1041c3cb632974b79418ac0fa5dbe0ba053ef37cd2eb143d5871188624db529bb8af3daef4edd976825029b93ef6781458efdad8d06c28dcf3442a2c283d0b2341f700943574363c13ad939d35b3d2cb82f89d486bb4dc55c967c8db57764cc7a6607506fd946c5aed0fe32efffcc3da5a724aae9ab51d2c8984224eb657f69e6ea22e7a6d390284c37b4e451d7a82a060bf4e5d9570ee67c59173a60afb5cfd305a5ad51854a033596d3f7d03c85734084c3256d81a02c8e91f1421d19c4c4ddb5e1da98e8c511d6ae6dbc9483e2300f7c6ba6bfdb57e47f359c7f19de099c3bcba9705758039314521a6742656fae99f5284036dc7d7c9d4ef0aa0a33239ddd16ccb8c040896baa960ead31b33d5572030782e48c210558c621b14304078775366b031386bf14465c43723cf3ce5441b8fe20f7c1e31c3601b5ffafb2b1b698647078ccad70819b326935a44abb04ce4dd57f5ed1939dd6e833544fc9a51e786c065feb4ebefcc91d259935f5877bab8769115029d207fc9d4d3ef430c42acc010ea6e692c0b03055bff1f569bb5a65b08fd292ca216c24ab328f4664085084a17028fa3842d1167d8c0cc8459dde371d2a7bcc0b27a45a33455e1356ca2d0aec0f9f1c4c7a6630aa080c65c7bf55cd7955ee00992400b829a4a76b32f67d2926c7df31e2d4e16d4761322fbf21f91c7ff87cc160a065ca81870c1a3b9951d6b72f47f597a2775a246c05968ddb8289c7b6f081e0549890beaeab9329af73f8b9677aef8f6198397b7c73f88010a88ed55513d20d1915e70dd6b0547781ade569e3377542c17388040b1493e990324e02ce377ee78c8d05ffdeb69dc73f3b0810d1e2d294270c4a020749b4c11a3420a4941e10d36a160b996b307493108e84f99b3624d86feaf09b99c7c0adfd78aa6e89b6f7f1ea1860045513a0000000000fde01c4bcb7daf150f02871a1440addce9977b2c67e1e163b4ac60d9fd2ff15a385aa0a3133f7a70b3af4993bc1f4f9b75b9c1107fcb6be76d3b7516cff30094bd443c4527578836a9a5da05ebd5964406324e132b10ea5ce22c4fb3cf9ae146cfda1a80622a5c10ff924b252957ec24feb4d9e290bc9d55e66b8d50279cea005ea28440db88e6f6ecc5cc04bfa3a5ab055fc455012bafba9ee9570b7ba75454fa40bd97e6feab8a993d5d27b229fd4f5d43fe1a3a743d1e285ad77209935a2abe8f8d0ee4ea90161d78521b71f95e1ac80cf0722b6357a61d25b7282ddc45ff6f7d1b38604d14b7b4390c9a8478f18bc77ac3baaf7bfe744887a97952b27a270ee1bcf8efecfe111a64eb046b6ee69b8dac43da74216ad49ad0bc8adbfc1a6f19a00f247e878559a237450801b8c6c3b3f8c022ec5bdf6e9604bf14253df80b85401807d5e63c85950296c20ff0d268c90c8a08c01e52ebcfd314fc4fbe4fa20277293cd444b074aa1b4d4f52887b3b59c089fd61978358414a7fc38de8b1acb9cd1ba936e8314db17c757a1658d3024c729e7315e7d2a69a8208297651123f62890fb819e944fd808c77c72494bed55f29644f25eddc9ae2a7dc24fd4c3f3d4e512841d689b28dfd804d798d5ae8a0bc5fbac76668b6b9dc29b8f1f30f811c9c310208a910b65698fbc406892952e50b2c38a47f0861268ebf6cee0eb1b5831ca0a1d70d6ffb8aeedeb9373bd5f0974a3482d9f951bd2edb97d15e7d9cfac977373d7b0a674106cf8299c74a820d7dca51fbf72b73ba5612866f2a583fbb38b9bb1f889a569fd8be4afed5c17e74691debffab1ff098b2e39122afa8f7402228a32cd0112ccb046ba663fbf165758b033c7937de2f2e78b46147c0f6bc26a3763b2d6ceb2ea11be97efab1f473add301f2ec6ad50a0a3db25592a2ff5303e74b4ebd3c1205a2fbca5387649dc1c3eb041a83488220663897bce3a56f6248bc9f129bea884f8323aa30bf7d1fa4f3256124b481a26cdb237fd06f09967b4872bd77ba105c3d468780ec9939b13492fea1dd7c2e91b7f5d25c981cfa4fa65a81182c8178027ac33bb1e23d22d122294d6887e5bdde03171ba3734c6e557e61109927b7e35991fcdc9546627d92029051d1907166041e52811c03d8947882651a484f96a24ea1a45d8bd1945b626968d61862c3985cee51e16370bc80a6cf0354ad222a43cdaf2cebb5da011f7124ecbf2ac4f34723d8efb06d9f7d0b7c81606d35c209724ca1be74369cbb84f84d6e41887002ffd11beb49febc8372549d8b823803362afc9dd42523f90a32802eb6d8dda8935b07f5a55865aded7cfd8108e4850c9ac404f48e9de0243a8d342b38cb028ba054d341f1aa3d9a0c4c68d6d2da57c09bd0f05b50223d23a7d0516f68342c6cdea04fe2e0eaddf543c2f567347b7169abc7a51826ec7c54a47a98b72884cce01acccf9a758508489b5f22f06caba8fe870b237a10297b6b25cedb1f619ad8da1345d2525df7c0d743dedbca9d6601f08c44aebe05097c3427956216df4b3a5cae230014407f626b22967c71ab6f780d2f9d3bf0e9f048741bdd302cd4d51e1b5c5cdba168251579bb98d68191100b74390ef2fe3a5a98c3c18433697d98cc332ab83a6b00e35c3259239b2256df9bda9b61fbbe781069500d3fe8a2271df7e75629ab4e5924bf6b37397e0036eb523db5d403fea1a8e8f35abc2cdfd32032832de5eb14685d6418ca2067fbcc3bb9eb9c2a4c89cd3a52339ca0ed413bc103a4f29947200f1d8588988afb02fed593ccbb4eb2f9fb004b16b163f23cdccf0cf6ff773785f103a3e1dc68fabfc043066daa7bc0f7d74bddf2a0b5c8a0b6c8d23c112344b29b2402b9b51c12a08839dc60a031d64641c62786d92adaa09af2d470af6f0a5ce7ec4a6d3505b7b6f7757426a672024c0ff9f25928da34ff599cfda96c2ac2cc180fe1f7e4605c6a379baf3e83b8aad07c351db105d4d799433aeab2d891ba2be9fc89586d0d72809b7c740c8e8146a317924a60578788eec8848b2953d03210c8b74261a68d961908e3df871e96b5b9fbc63a619d90dd8513819ba83e243d997303694f2dfa8afd41350a4213f9675e7b298ce7b8dff844acc42bb42352c5066cd658c938c23f2fa9e37f4fa4a6c45030b37799e8f8992016496e7b229d5630110858fe94fb95b5d67fafbd2df1a6115ee974b79347797cffe610386a76e8097717bbde0fe924483a4ee28b8b69c7512dd5350d7776ea40de18e91a163b33cb7714d241f5611b5048637907b34ec928206ffeefc1afd997e91178acaec557bc654f6fb03334de8df05f2751a2f3382c690a16977ea8ccad2d1683386ab5ac944d31f75250d65fd22e6e8baf1bdd633ef08b4d9640e637a57e116c4c1026eaafb4809789627d547774692db01ba0f50b899a37ece47fe27393e9a48fcb800c3c5bce08ea4fb9afa524ad534c3a4312f824f63a01f627419e04f2d032273e257216869ffc3515223afd0f2cb5207fa18502de12c3b00ee0aefdbfbb69046645f96ef6610d3ca8d459f9234a550e5bfd404967d60790f52df24a73ca2d2d85b4e2a05d616c1561df3c2e6c740c360429e7182cb11507617ffc31597bb93cf30a84e5dedabf138c399963416073323888056848d705f0e5e0fed30fb44e4af14b7a60824adfb034c0a19f1283951fd38bb8be8b1d6f199dc5ac6c6de2d924322c62bad1c137956586819c283fb63575ad35ead5a8270c98f75cb4a8b71b734d06d01131901302a03105aff7dabb227cdf4e2293e9e9719a132ec26937345d14ed22b6005cc7fe0ec44974ffccac3dc9a7eab539d51ab158487298ed471c9a9e562bfcc27a5105158fc96e0c645c22c1365fc3de818f6b4f1c9b26e708d5c00c3d5e7cc8b5f6910ca76227190d0710123e9525e156aec144e19bb41473759d479b53bcd0db6b491467304fa5685f27dc528de61cb036c1399fe5523cb45665d6cb8e88a8d13dec00ff35aaaa54f20a40f1b0761be10826ef74476cf20418df6d543fb2a765dabd1bf7698221c9e02518a8671d494c4377b2a46bfc55520ccb309ba327674fb29850905346b0ff6e1970418349756726d8252157e1f788b906db305796d9afdd97db936397f85b5004b7c75fb05be8a49753f706598a13b7b390e0dca3c57a889bf279f7d856922c2246ff215fec5281b29dd6c54b1181f59270ee5ac6cdf81791c537a4a933f09b04234c4f1184874d95c1f6dd03e258097f9d0612a9734e9df83679ceb5d0321d10df92aa1fda15ec4c6c6fe21d8b23c39f635a995065237f23c400124731bf011226a0c71c8fcfc2569b6f610cae9f58c4ff8088224dc20cf282ffba85fe0ccd2aed8faef245426415343a5d7705f75fbdafd2224e0c9c77dce9b34b959b770d03d2274a5392dc4fc1f1f0b867403f407fe4ba71b4344839ac96ab96324c7ada1ec4a16cc5ed1622ec860768e2920b1e03e447632b5243179c2c51b770f6c3b41813d78a370894808065cfc42f80d162c6c7de9a8c31e2e2404a76b53d885b6f262563075722c048dfe1adca75d27a62a4fbe856a77b359e599e66317c6faf180402166960fbdcf0db63291b562a2c31eba97fc804c54d1ad6b726a6c0be65ec2deb21f7a8dff38f043b91bfeea9757cc889cfce962b85f8043820144475e92031b27364231797c0463a4887264b3dbb92401a6d0cf2310ba414c4791089d2d63a55fb9db709ada3194cf081568771670d762e30abca7aa1d6219ad240813087030f03f231388e49f35b12e818e285c9b5ce3a5a2d9a9a84c608f1add6799ed2219be66f9f5b263f0176a09323479110b5ab4e12119e08d212106eae1209d7a128208fd61088e7608af5502ed23d958058bd3e07d201b44109a4f858af1e726e2d30f1fca652e7c44dc8696bf067f742fbb1cd27aa72ca1d82a81706a196a9973c7618aecd0fe9d94094f8d9cf5bde84f55b267de8a1dc821b0ca9ba9b88694333ca08060fd7ccdba4618134b300b35e5c7570e11034d4cb6394b629f8ad261207a7d00bf100895cc20962b1e1af9e2ce01e514c64d71d88ac63722a89031c4e168772ca4374a0f4a4b7e59af46a5a55b52ce02f40de9b9b283fff8feb13afa8210f8566e8009f40158a94452dad543c10ea8e00ab6d1aeb1a36fac551c97fbf23946f18b6b1c8e0fd0e626ab0aa37ab08c409696822de6eda7b9f59366560a3167e2ae0e3692ae1dcfa04a096a9b775202fae03924efbcf37c2b5e29d9059970afa7eddec2cbf6b638f001bd5aa7f41f8eeebbcc29036b1441eb5a6f02eda3d17700b4892d08e4fcafba743bdb8589b4b9d4dcadaa70cbe1651a57102cf25283a9c0bad063240a0c0e7d0f7c4da6a0e2edaa5c4213e8ad21f88e7065b9f0d943950a1ec66acbcd43a3e0ffe21650a81b38b91aa364b5e5f26526e0559c90e8437e344731b6882a71bfe6e43ef082a4cbbb1bd8ac765fe10c59a2837fc976573120915c627cdbc32533af915d25c52015525e3db94c9fcb4c01b3734de39b9fe34734095e22e9d9c514ef04198e3f537237ad54c49e47b196fbe76d91054297616bc11e60c83e91eab4e59beb9a3cf507a84f74270cccee8766c238d9325adcb3fb8a3b36dcaceffd56f933ba1cf440968044933bce5c7871d7475f2708682a238b4e8c42ab48a784ff0ade9bc73b7708eaccf2fa46acab29d4cf1dd7298d28d0ec01bff89051f43a71497cfd124becae848aa0fa5cfb126ecdfbcb9ab34e31a2ca5e47ca03eb8bc56a00dac4f27857f810b4e7bd72afe2fe50b8d996e03bda33b89652c622025c397d65239625d1a73fb7db31c920e3cb943f4c15321ae815d39eb42fe3bfdb9dbf77ee2e4baaa3a3e73dfa04ff5fad7eeaaa547ad988e143d01285ce32a15b6a99311169b17a74dcb8f1434179776743846d27e579d0f4a7e29d515231234045610dc5f98bb35a8e512a998a7521a796975cd09799289563121a43b2755ba4ed4d045aaab3e2c0a2db2ba88d453240694b9ee3bae3c840e552d59ab55f873fdd5fbf272a7088a8ca06a7e865b959ece5ec88016a327a8dacb198fcdacf258d4503a8f5d1f3dbd84aeb0e1783b9153e48e68d024b4a752d6003f9b6f5d19fb1abca75b47628674138c25e0864ec1e84b3440d6cb5227af39bc30ea5c704e8420cf303ee0473e03a570be5c0e784ea2af54881ae6a08f08914a30c5d465e587ce7609bd3020c0fc1393385c072146753f7c2067ba3453fd2bf51c1df88d0bb7c83764bec6f56a5a7c7bbdf3ff7317f0c91372ad66099443e3c204921a4bd7afa91d95ab22beb7c0a5fa952db549fa86c615b6fa612918e97cad2c2398d6074b58358f5c23c51b2b0697e5fa7a001bf2dab4cc9f4fc3bb8e56102773e270180c3e8f85acc10f38e2367238958503bf9aa5b8e1a76dac934203dc250155f53b1567c62e078e4e43ef1a0b3c730e1782049e21783e65ca1b755e0d24526b5300d5839b2e16b501a5a6113aea6969073f3d1dca2eeb0df5dd4b10802613f65c54d3eef4d5b9e72befb7769247f1446a70f87a09f3db4bf29a7d0200306f532c6ff6e16f67b58d150fd9be41a0da78fc947631f2c9b5f929a0f2ddcc237ec0969fc042a3728c75d0ea25794914f9eaf67710daf3480f5b6465e610fa19cd4cc1a28ddb82f5add77d629f9f87e626d71e10ecb5a5ba53743cde4c5dae048e6997695cc873993d01e5b2903ada88a1b9056ffce6c823106726e34a87a60ac8711e2d3be3ca7a4d9c9fc501d74baff8fe080ff845151dedd4bc54af0c03334db452b4f2af145d117c2446ace0b6b3daa4786471a04b64b157fc37720b13210f791ccadb500c0171ddcf8573808140709518bb3f120c031b4c4ff4369d183cf3d122895d74db417a45104b70091d8cd81e7e2e28c7c558dc7f0e6ef7f6411402c8086e42a71987159fcd92be6c33120dd8400e18ebf92f5e288e28d7678d0764569ff556ea282a27b9821cc0d0ba5a532904c219a6ec8eba337f1fc32d903ff03c83f475a0d83cfbb3cf0bfe39e40799ef162db2df9d6d9dffcc99a80ce300fd9248e40b669b8333271db8e097584b0029ae0b1b2f26dd1ae751f63f4bc6272e30850fab392137939d8ea3b5c7a26b38b22c8c6dd8bc29a3374844386dc0393c3b06ece37b1631447b8eda30f6e81d44f5ea9fab8c6e6eeea8c72ad4543d16fdd5df812a38fb81cbc0de55323d583c5ed6f6b86a299a6b3e56b779bd1534205771a136156565dc19fdbae6c588fea58c9d4eefc02a77b8fcc4e025abb2cb1f789d155ce52dcc8b61badfafc67cb95a043aea83220f26683378b3e4c7dc673008e53002f7aaba82e80e2692ca897c845c080c3d2a37e6b81f5af6f2cda03e330eb8fb7a35b96cf72207d1fdb194e71adc4e0668286d56a3bccfdeed4da2ab35a73de2e4857ec8a0e43ee3e6bce31f7b7721b572590059a61e9d6982292d9b0b43e8c71368a1e24577ee6c4400d95c777905f261b07e25f255ee5a64c997612ab0547dabaab96d7e775c51f816eec49a4992e2acef7dadcb43b97a28da590420b0fe94fc0cd7c846b91756332a5e65c403dcda14af976dda0ee1b4c121e7f8220a26f01fea6f57146b544a618f772103486d32b9573c6245947207ad62450829f747326096839dc602cbd110a27fee9a6da09debc48349d2bf01bc7e1c1c3127746cd2cae30bbaa4573cc5fe0758971e57a04bfb88d5fcd0769b4ed2c2f8053c86a53f64b3ba0f2f42e3ce632fed09431feec605b9a7425ac05d20753bc56d158d8a07f7d7d9bfffed6e4cd2041fb8366f1a391cb0e81962a20851ed5a58b017ac870e8a52bc16491626f1ce2aa65c4e09512a963ba24b09bc962029c90b8522ab473369d1cb64373c56fdbf775146e683c26bca67abdcd13f6205e9cb7f811635a60393f8fe6dc8103a59fe6127f259b863e93c2d94df46f975f174854f83149f3b9af249f0bd0c0e59d4f266cb3551e7b95ec00f2455c30b59907f321d043b8de304ad33566e4f58f1df8e3b69596168c86a0631a187a7b8a9ffab34ad912310c82c3ffd1d771f9210bad56f31e5ff5da97d780ba58a105d1cb7066f22c10cd428c56d0b74c00f8b3eaaf25e95d809b6153db31bba4d3d2ce550defaf8b804611376bdfd31458de4ffd368fa27d915a47cfa3a8a19a8ac7146b070979bff2e72e8971bde1c77c4773397f8c537de7afd1c2f2ee7ec03981a62d6cef7c0113346906cfd4d2596dd6d6246ace3a79f190b88bb3245f88243cdc52f1c72431e16600c6ee1bb17334dfe91e1285bd11ec49ed70d0f42cf49ce2c6919788647970815a07e5334622a4543dc621b0c1f3975394e23928bf03045d48369c1a44a7720e66c1a877caca8d9ea59cb56023b580ff10afc968a25fc68511ab7ca61cda50ca9f083fc34141ce80285934322274671e174bd49e0da3c32a7f0a2656f742609d269f2154cf939bf3553a58e26673c91105f86a4dcdb293b79d43cdbd53fd7334b4b2212bc20c48d1295ac5b8daaa5b611d71e04afdc7ec56f7e71efb6d64d091f720543afc6b40879c0e20c4f6c73d30a9c46dba343c1b0160b91930e7e3a20066420a1a1e9901e47b3a0039235b8917fa853d000ef72bb8e3507d2121894387cb32ab6d397beadfe6d1205b56c4bb23fdf4b1fcbcee78db47eaebed40bc9143337e09c054ece2940feddcdc31ea78976a0f24e2d8b80eeac6529e2c9db26379936a1cec3e52c5eddc79a4ea55128ee826a03769a3e2141d9caa0cc2935201ea5c39f53118a3bcc5063a8726f742490a83b9326a8a0cbe4475a3040d9e238134ac709354b68c60f46323c8fb5e5f9deedd1935d9bdf3d64f23c85ef8d26eb26b62a43ca3e46b224cc78d2a708ff9ffaef1fa877bfc45bc724ad7d617ec9bc27b2736a96652d7e7e9a407358b18d7bbad9a5812b2883f27b9b166eb880aefd3764b4bc4246861f7229ad3ac2c1d3466baf8f33ed425e2a68ea6d3a5ecf641d2c1293beade93ed6cbde2e0cecdf53ca172685f9a67b2076c468af815cb35d8513691f01bc49c4c106dc491b7c3ec5954cccd346ae13ed686f2f6eb9c50d25861552329c3131116753cac647a9293b8cce67ba5b4b657e941f023dd86d4c7a1b074ea34f580b17fff6ee83a2c4621a425a588c5b7e187f0de39266b0b4e46ef10dc50c4c031ce7d9ba98444f70fed504581d36e197a4dffd9d4a7387d88bc3f72ca9d80fb2ae75dddc5bf88feca1d95668a7902fceeb8890a53252d094274b0b1116b674d333c5ffcc4316fe786df7090c958f01192762258fc71003e3c99511395f08263517e3146de82d9acf056d991e6b33c76140a87c1444ced342469c8b3861f77db08e985a12517e632a35a1ce1ea1cdeb62f15976a13d336f677b81d03d4f8666f0e812c5ef819cbec653b5805f0dc721ee5845717a8c680fc4f3d19c2588cf1331d42dbdff7cee8f4b8dd3bc08b64e84b512f81f9d6871313c4bcaae1b9bbddc88199b779636aa7e956146132b297b9e43890912467a68f05a3a95d01012ae70fa4bb55456269d04ca6f71c0311c51ae12d48a2533e70dae1e6edb530b0c163bfeac8ebd0cc05894c0cdad9b3e117dce724522121e9c3ae9f22aac1305c4784e142bdcec12308b6abc8cb9935f9269aa43d6deaf8e337a92579f9abb04c3d9414df0a487d52dc1b11dbd62903c2f6b0e8a3e95181e8d0bd1261422de00a2701c760a7b8bfa21fd32a82e2f1e06fc3a873eb888ccbfe7cc81fa4d0a542a4d9cc64514239efd46bf2aeaff097e8475721cc54e881266f8813a0bfcea9318ba2209a3494b2fa0e4829569bcc39d4f9bf43a231813fecc45fe63a4093a4d366c30db9aa9a979958a0c13e538e3d03197efea06d127136f22f4d0b291e0493d2ceb40c2a6af016fc3f1715a46a8dcce96a2ff24c97a7e1f16f7e335a1cb000651c9196930ea1355e3b0293d9d4efc93cb352e0264f2ebdad7aafac968378433ac8735bcb0e0c278e431e285bc6069771088d0e6c3d295b022ab78e7cfa5891562bebe78c10feb0efc71447d4d8b2f75b0bb7d7ca3b95551caaa04037b393c17a8a5d9ba9326a450cc31a84ec0a902bca5b41e9a6ce326090a4195ed1947772b6e51e804378f2030a505965f15e7d207cf3b4d4d68a57f6381f024871615ec2e8ac921d38284bdc447219c406dd1f84211f93dc9585ada378fc6b704ec398c02d9926392d83a209314304e09a135fbce2a4cbc0b9d6a688ef9d3b81849d94e0a93e8cddf964a10d8b0f6ae66dbc1b6fda1f98373529d407239464f2e5a8e873df968324696e7c28de4cb7e639fb337f4395578818301ea9d26c8fc4f5b975617c00ddfa88d764a9ea3450e028f2b84abdc5aca12f9bc7cce6aef97a94884792865b889f247f0a445969b88a0868738803cc542f3e3e4a891742533ede58bd69d6ebb98b7aaee00dd8e14e7a48c13a72c1e6004d03e4c93272e9e1341bc4c772f875ea6e4c182999d857242fd98d59a2239854bc84fae95550f938cc76475efa6fa2af8f7fc091c9d3a72691f5fb6311d4e6f39b13fd81f9f1c1dacabc365c41cb420bd15a70ccf4776c80efd0a55a98287f1b5733797d832f4fb6a24b461f2aa7c8390729a7fed77579a11af4d58037ce7201c5b4db134e3c3ee6c2849563b13c23e0289f027149a35ed7034ae5e9561b37bcba6621f29841231dbae1b5e7932b077690d2f605ceec2022265d9b15b8f6dfba97305740e13ac305a8c1d58439c0a45fdd2dd5b0849a8b7c83c97fe8b9d9eb4c98246a71af5be66e5bcd0d505095569a90e7f4c355e4e7e93bb15f752ee7b314d8f37d5645944d8a1a10f752d00463c726e4d177a46e02504d5e45fc9e4570aea238597bc545ef66b710e5f58290e1d09688113c3fb65fe73681bd37443449396ac4a67aea37e63b98e0c6dae0abe276214e8f291676c73146b2c5a7e0a77698790592db2afe7bce921c5ddc11e19f69535e4d185ca77c76bd309910458fd0a2c49ffd10514ae503073fd853ebd9bf03314aaa5dbb4f0a46e5965ec63de4a0f4498568a1e54c97eaa2b73e0f91df8c88419ee95d9cabe1a10f30dfafa3f11c8b9e42b9abab126e4e124be43bf1564d6467793229c17b03653f78ee20e77202350a88bda0f8d6d715f5daea3e691c15a2d1b72cc2cc4c62ac46808a89a8c1bd0af6a48cc6ae0deb11699d24d51b9185617bc415b3d47894621d69c6da4182033fd739297132752165de37954748153df8f38707c7e75de332464206ef1614b60786afead7c245b077bc1d6150e040c288dc1be59407d19c74d849ebbb141c769a915f421f2162e2551f20138d835ab3ab1b69022a95a7d69e415e961d49e7dd298d7cce37ec873946b01778a30250100e63eecdf55b2f8ac28cdc425fdb5aefd15d8f8098e96b4a9bbd407d801c3179838b54a096947557e834631d3ffdb453f091738cf8e155729ecbef8cad7159e3c0100ecd6dae25fae63e719880fbf59d76c207ce2e370fa947385be2a6508c4b2ee080029de141487b5686c8a25f782db94ea11970dd24ddd83e801f097bc331984050000000000000000010012aed79ad19b14b505d2e76d87d570dbd40a1eeec8f5423cf9609ac38a50763b3600f3513cbf9b9a25adb7810e2483165d18f8232a2cef74235e29278c155738210080a0835b85a29f68b95d0e0339bd20ca08b2280240bc0741c33918a6a25c138601ce2c6d87d0184c1799a254ed03047cf57a3bfd49b8a4438d496d741cf5aca6bd00010100410018495934af52154aed322e093e8548927d969ea0b95beb91c45e031ceadc32ec5df0395df5a202b88f6d6239ef11bd29e82c53ea3f6d52b4cb972845ba874db3 \ No newline at end of file diff --git a/zebra-test/src/vectors/orchard-zsa-workflow-block-5.txt b/zebra-test/src/vectors/orchard-zsa-workflow-block-5.txt new file mode 100644 index 00000000000..b9f3960256d --- /dev/null +++ b/zebra-test/src/vectors/orchard-zsa-workflow-block-5.txt @@ -0,0 +1 @@ +04000000287a2bed23aa02b10d4fc939faa37a7b5d8d92c84300afcada7e16b24affa26514e2ebe3f8acbf926cb983b9031c6933119ebe605bdace1792e537f5546fc7587bf5f7c1be2ae3818cabc18466bb1b63043c18cd68838b606c6b6ed5d4528c8d22254a4d0f0f0f200202020202020202020202020202020202020202020202020202020202020202fd4005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020400008085202f89010000000000000000000000000000000000000000000000000000000000000000ffffffff025500ffffffff0140be4025000000001976a91475dd6d7f4bef95aa1ff1a711e5bfd853b4c6aaf888ac000000000500000000000000000000000000000600008077777777d80a1977000000001c1d1c0000000000010292c184d23c3870ed8aa275c9aeaa0a93d30b041372e4e6fcc942496e65767db4e92d0a5b9a15aae11dc2e3f35118396bae5181869ba61e8b63334d5d7631a31968a109732249190107638729972dada017338cd27d19f6ad4dd741e54599c09d542d1a9ffc55be4fb5a059814547106abd1bb4c4b4deffc9de1f6dca19a95d192582c15afc195255038e12a31022f48e8a6f79de0887d6ee88589403bbc0823e9a6bf81d4ffc13a2c1cf3cae11a6ad5b395cde83346599c771181eed56990cf3fe1220c254bbf8f3098151c59e418f2d13d6ed3ecf5f6e6ae644e292af23d9fcfaa9b1b33f61013a003048e9d7cf628ccdbfc50f0d967445e1bc80bc1e4a3810c94fbf724825695cb44ad3eb2549dad9093e18812d43627a2e9a578fba1634a2355e43df744e665b2b67f2d6f9c4108d832d3e139990cc9c98aa19831e03817f68d9ed9148fd1dd998b3a7131768da1ed293985d8282c40f150d43811a358371459f3db393e91d0073baf8f435a5d451e1364fd9d7586e52fd6697cad639849b1483917273eef779c434e3c464b0c98b66139716f6d65d9412950496de39a32429ec29ac8dc3b127d7c5d9f0ca644dbf28c3b5e265efde2dfd3cbb56a1c9d83aadd9b1ea1066f38a8a4d8f73afd6b27e65be6ba30c02ab72ed32021fb9e477ebab31abde7a57ed17a5e9a0cd0e2c202483c9a9127de49bf48bc6f0445f3321b4cb7cd5919dba5f56956cd84f97d65e38d05c92c9b1047d44ffec8a199fe06845d81c5555e4fd9f6a946bba614555b56fff4570ece8443d333ffbdea4456de6735200e0baa79a76f950a09cfe2aef75eaf733f61ca442d1e11487eacd5a2332a5f043ca2ee1e016ee5a19992447e44bf5f72d309ac66f60f6c2a8bf04d2452fe486d8ac0d14b13598d05c19a6081d73c72c55d375ba6e0ffea534982dfd335058f3a01bf6b5d1d13891113c57147f47697ef19d25b242bf875ceae0577ffb604e1acec03ba8982c6a785b849eb1b57d565ac9f6c4baa31940b2bfa16677f0d5803e78bf6a78eb0d9e6278b035c406947406dd1fab4c21bc1228d24ca9b674aad200175e1198c56da90299400fa5e921a3e2d1b88ae3342c641e8e2782a6a343f13fff9325c8cc1aac346be6be6dbdebcc4cc30ff9244c5e9882be3a80576509411086d30ee2e689100cf323ab4a84dc87967b5d98aec639b3599f2873b754b1e3e08738b3891f5b32b1f28221a564da7f3770190604bdb02d9422b412fbfb3bb4d22aabe69cc06f558000ccc6ea1459738055a82acd82713ffdb8999144dd15c61dbdf52f062346a48bf40a524d3d4b4085ee361ebca17ab2f6be7f3765091c91d72c907ab3c2bd670c3e977d23d958c4170f1f1ce58da191fb7b97fc0980577eb04cf0b171930f8ef71fd7bd5603cf23e4d80e3f8f6ecb771e765ec2b5ab25df5ec6fc677f119ef53b9c55a606011236243d4371f9a5dbaa0985e98e0af0010f74997a367c580caa7437211a46a3c6c1d747bfd6b46f38fda115565753236ecc1b11c072ba5a047e59e2d7a36308dfdb5337a7f2c077fb5d2ada30bebd2b649697dd06950fa05b4592d122e0614963b54fe38bb6da3ab017193c3e3172e63f7c127182552345ab2fdf797007928528673b0b06f34016e60d6d318f5eacd4e8aea3a996048bb8285efa7812e8aac974f89807fc2f1746e0b1003fb5847c4bae58b148a37fa6fd8f4f2cd20394a7d1079da9c913ecad2740e8c989cf1d563f9e5ab309af669139049630862bfdd72a43e231abf765847f0141afe15d8dc3d5e2e7d8e3254adf183326a588fbda94942eee5e758cfa12b5043ee0fbdad3406412d55c52cfc94f7f01e0134ae97e96dcec67ca6b0b68f6bd18e3f30737bd01d68ee900875ff46f4a317ae1d5e4e6b02817867edfe0a5cdefed180b381923837b6e1eede9129253d3f642a4b85afa5aa47009c03493d020a0697577ae72a1852db9aa9fd0f5216aec68ac210ce64f742f0017234ad28a71078fd0d43699ae5240503d3fe37c5355f008c351a9f75b7ceed7f4a5c8f2a9ee10fe7384060dbbb27ac9bd10c5b718ba63dc3f15dfeaa18b67a0e319ae6cb2492069e429aa0a5dcc4bfbe770fc6aa498c1615c590c8037fe11e8ae22945344cb2a9bf070add4302f5d60b7fa34d5d0eee55eedd9e7dcb46693b11d2c4e528951012af4f836b541ad8206e3b345d9098723d5ae80e675841ed296fa21e69542a77fa26eb5054330a609b31298efc84bec53c69e812181d79ad4648f3cfa4c04afd8bec7ce832796b016ff06676122fd33861975c8e7bd63bf64de82abb5b4ced18048294d511cd883e9436f7eafa4c7277882fa5907fcd5f2c8183a2354fd2e2576d574d5de43c9907033916a005e185a730bd00704af9446ee497bed61cc203189519532bd81f2b42ff1aada8a44f19965f373390000000000fde01c7a9b866111dab0226e8b93d05767ed3acd90d5d4d3e828760b4e01c4057781b8862e723866b4f4dd35d5a54bf65d69734baa73391df377948ecde4c3a68795101546bed2d59c6faf41e1d5c38ea7b495b445458c89d9e270502d0c1c2a97a419abcf4d19536a885ac19c98cc41e387a8e4939b045b27e133ec07acb6946cc40e080c4632918735ebcba8283109c15435d9ea82e12be569ad5c12fceaa83818b7aa6caaca065c14fa3307c5c3a089616d353b39e1de7edf917a9c1b47b33ec12829f8841da86d8d16333632055adc3dbd4543ae9ac8905e6c8953b1c0e72ca39590247259aea14391ae8c95de00172591467fd3445fe925d30e1d8c3a4d6bd722661683d8451b0d135e69a06300f28794b4109278c5f7151f3bd66f56446ce02222e502a91eb0825b5bf2f030a94eacc7ea40ebf1df2475affcfe9fa3637f541b56806cf012785d190c9d0acedbb004b25e8f4c4ea7c472c0895fa86c7a46383b3aa1d611ab4a15ce0fe87ed7ca2d44c3275da659c0d69d48a70ee116e0bf4881d635655ffd693bb902be32ef520833ab6aa1b0877d61ed7fbcb16f19be6aa0b4f82542018be4be3352507d3fc7e7496f4af0d9d8131e23a8afb8924526e760a5966b0a088669a0bcbc0e0482b2c9ace52739037efbe62fde7ab8c8cd15cb520bebbb83ff581f562024ceeac9e8ee10656bbc1ea5c19ea1ad83bb342c087db991dd26f72bd39ce4bb76c2df26f54caab5311e0654d24d726322a5b614c696ac94b5b74706ae4427df8d0491d43f0ad0d7cdb200c4ce1c884003545d46b7de5ba5be25b58a8750fb3ca944a931a07a9090d47d688f0f6f5d0cc44347b5d0a66b05ad40892b9f217618535f7157409f9aa4e394d8ac5df54e18c2a1aa5f15cd730df120516f8636d7de121e6eee75503c8dd9ba2ab078654a449185b5e072f1e98dfed10c3e76d87a84573f97387741652508b16dd3ccebba5fd792340fb8e1a19de4dcc699ca23ac6bfb3597ca65643601fae54efc83ad82dfc34b857e21f2abbd0f0bee91750561a2e1518e06ed2533be6742a99cdefebe1e42c40f59f346940fab81b26557f54fae69ee604824a93b8d52993e9dfd1f3f462c738cc148b07c00eff0a959766b4ad599d12948de617be9b42f1ce93195ebf1518eaac440da2b82042a334686c5635e6da1e19ccb570d17bca6e7d095bcbf1cbc6f6271e410a697f55c531b2b5e303317f43f09ec09cf62eac60d626fe20c102842f0e233c7d4b5b5821a44c4f5f0a172557a74f913bea849cd1f872d1b1f562e1143217b3572058309312a2f909447de9ae7424028225986d51670ab1aa28e6996667ad453432625b1626313fd2af1d07d69df7bc2d841d07f8be876053cdac3fa14bf4319809d85cc8d2a68be59f58f583ec8743c24b999bcad51e97881407f4a1a3bdff72f0b24e72649a9f4aeced575a85d61429ffd2a74fa99b16eacf0fdf2bc81740e1516a096b3ca402cd196607163969b4af6bc1845c41409fc92b16d8699fc201956b2569cadc602d463102d4d82999ffda72981915f79f5370f5dbca451ae8be4922fe7877fa93224276c0a4919290bfef987b7870d3f976faf78a0d0bf25b328123a711828e0403f744aadfeb694832867c7574a05fff5f363634a7d4a89aab0bc04a708a0d529253ccfdf95a6b57d48be2d2108c36fc12d37b67eb3f5342d66aa21436cab37734f55f5162c697c127e5890d5318081ee8b4ba287b6be53ee8cc53f916cb88c066efe17df0eb8b79e15bfc694168a68136beab88ec7e0f0026d182dcde6285714a65ef267fd15edbb948ceaab0e8658b8b5fe12e26e7f4d4600529ec160dd7c4aee06b254878583f021095791ca0c7e6f082a371c49fea430e3a8081a52767147919b41fc0c20ab57b5799a0a8299497c13d56837b741da03aa86171abb71d5806f05d6eb642235ca9efa2856c00bfa8b1feca1cf8814efc7c62627a7c3da402b419fb5a287c4d1be72d078bf50bee3e6910baffde9145a205886931738a965b7dea24328b290d7a1b2570e23723ea53c9cea5fc2ed80236b3f273b9612a40029e3aefa4f3b98beafb35931ec529d702bd6fd828b98d45197a4701d23afa38373e418dbf3e7f76342c0f9a82ae9295edabc639450efe99115c7e5197df41db3a7f9b14788620e2404bf1c133645279decdf5f2e8f0237c871801a283df32ca5e175f49d90961c18e559caafdff38fe168d17a00db47ef9cded18f09b1f2871cc36501d1d83651287851a158236ee2591ed663c6e2bb071118eec1a343e2033ec4191fbfa9b649fb9ec561e20f4f245a37ac949d1da26aba58afee88517db7ad3f3b39c6157a2bec575cb594dab03d1f719c770dd7bc2d9f8cb4451a9d37e9f007561a265c565482c2dc2896cdc2c65816e2bb3fb4ece2536452a5306364661465648ac7c9b60d4fee00e4c58a24408b399ad87f2c3d98ea3b7410050968eba0e9b4895240441dcd9d3d15f026b7362bb0c756d57c5a49769fd18a1cc73eb42b4345ca6096d1c304320869023d94eb2c8e2999ae0c15a482b4308b2ea6874ce63be00641631b290a1b43a83ac6b4f0414f18974eaff55f728c3e362f2babd6eaaa2f682468beb7086928f56a5b63cd2fdce8fd84d7d41659f85baa35531aaeca294ae73683df2b9820cb935f92a5e93d44917a4d18b8d41cbff29b3287040eaf5adf7e2f09ea2fb26377af79cfc9fff1503774e15266d9b725be40137afce9e4dddaa22255de4daa7e6ecb7fb58e63f34c5ec44fc1135b6b0dc1cf38b8396cad9cd4ab743cfb8aacb03e756fa7020f65230bbb5e1b60c7a82c7c4f2ebe2188e73427a6d4aa146711872f791fc4748a9f4624697a04eedf0f9e4a443ee29df5f37cb1d13601a277f2deaf652eef584311dd39dda759af6613577cc72b1a4db56f5679c242572e21f1a880b23269f9ee61f01ff8a617a6f4c71941ad00cbfbc38a9440f06d4621c437e0bca9223497cc9ec804b709ab87739c68c0713a356c3132359e5149e566f9933486493a3a74634c599a27a338f5586402aac52e615760a76f14a60ca89d6899b46af094188b836871a8222b1a6613d48ae2df0d020defcf8d8870fe007783edfdc58dbb383cd9d933a030cc60720288e5ac733a553633e41f6f7886b72bfd981c1c4733f2acc6197b6a7b8f660de6a5786e100c9e17ced8ad769ec3381e51b6ac1ddd476dbd8100013b1f446b9ce40eb41ebd04b481d69799b6d9bf5f3da6badaba83251fdc2de6d207f38087e6562e370b78352cb470cc6ea0ba2e24dfbcfa1378b8d2ab1cdef65ef42ddd44ac9714fee67134d5e2357738099075753adbd50bf74a44ce8ba4f6f472bea70e0a72006210800e36656f329117f4e9239053fbba11d22b422af95a3541a196addfa804062048189e915487813097c7ede4d6849e53988e88032949a281d201ca9216fc8da816040ea2e2ee146cfa7c37175367425c882cbcc8ab3acb4dcf87b1fdfe52d347bd32a3cd43ad8330f74db9da313feee5a82726ea18a63371c40d29b3ad28eb6d291f4f4940fb1fc43ac7c1af69d132c04130f0fd35519cfa7e17e3595a424b00fb3dffb57ff10a7c5acd49d8782687aae08e281f4596cc9a433f59eab740a7d0c716dc5790806aacf7fe8a27670d2a6022ac73a38b47f89d28aa4b9e52c147ecfb3929c1cbf5c3d79b9ec122b106bae8e10cd03dc6e160990051d9bea7501636450890a176b88233c5df00be5e79f2ff86d42f9e803164db995e807e501d23cae525cacad65bc2f870d7476ae9f83e165a877e605e735c0bc62cfa281a7133e0631da04dd5f3ca6c644fc43314e11e0a4124c07bdeb52763a3db32b24c3c948efe1ca71f63d1bbab3cf49cc9e73d0d6748a826aafaa4e4069b3e84bb1e6be5ce491bb8704c1b3b7d4644b2c9e41f1241529cc12c8bf0b2d3e9a853a33b27806fec17f2e55831082952dadb357cb030f7d9b244943d8913494596b24f94be4caa1617694be0dea7025d7fbb3acb14c3c9c18a49de003d43b8ff10eaf258e4cf312d326f0ad5ed59342ceabb8a8ed5f82752784384f21388c03a3d4bc606da90386f179d7a3d337f2150f85bcc05149ab0e9ef73892e48f0c3d88f569462782fd79e2729d9d5a2d5e0a51357928af3c69483f26852b49b4ccf0513d647c3f0e018e621360a2b3c3dbafdd6350e0171361450774d15f408eeee7b8a8c4612a30f35402cd46e59d9af71fafe2575af2f2ad11e01b9d674dd2738da8a6b27d53ec4d6702f34b3328067fbdb088e485891ed6eb4f296a501dbbd90b8606af8f5e3c2cc2b1722a920fc07b60774719862d07a613f3288706e8572e29183af8fa382d8e268075c7e911812c9b60b8e2693b6d20770d72717f204b5ae598b4c5c1ee600d1451f89f5e22b0850319346dc560a89a8344b5e794b98141be40518b7f27fb856900722f19c4c014eaae065fea32963c8bec8f69da977a9fa8f9980a81dd0a128552feb128be464c873ca6e8e78f49d4b2547b5bba8dfc8a69cbaba044e5b9e05cb092ac239c44a10362f1b6d41b66c0dfaed132ff494a70fd753c06d97cf0d0e7a18eaf36df46151f69a387fa7dcb921d0709a1f40ecc244daaa2effb4b255cd6d0054cb6780a8a695d3e78a664c4b1f76634c0a1e6645f01e6c07aead791e1ca03f88995b7b764c3b59c56aa43c459fc6ad2fbadd8799335ef382ec53575faf8116f7bb520e9b49c5622c6ecc57d09410ac4904257c8533a7777e1f3e5707367a3021c9e93fec43d4cc269d59de0a1049209049dab9538d97e8dbda6ef7de4bad0a96b0d88ad54edc7a30e788d92ca11c3d55a874b923301cb3f6291217d5752721c2bb7b69c2bdc25657cc8e73df1278153911b63365fa6c2018e3debce2b8db2900261a9408eb11242f0584a76c8089fdbf1eb5d289742f171bb934376b8e5d13d76f5dde3b00513c87502ab8b5b5590475be9ab64b5a6971706ed66db44db301a459fa56ca2c4adf157b0706109b4ff5a7af72cecabd85fd2d39b1fc53a1c83ef90779a1ca5bfca3a9a49061c6736b31738b712bce31bad51a548d131d3bd70ca7be7c330ef3c5257fc0c508d0db852920122ccf07c20d727ebc02a620bd122fbe9e65bb47a5580798bf7ade436f6aaf79307c1484c73a0206f615d5860b7432801dd6771c43a483a9b5020c49d01208f7f499d24410de01eef939c70d757727a700731ab09c8a9707da01b9ccf6b4ebf78d49da0099232e54c0df652f0a723d833b8159686008c71d45b72d87fb092234de65011bfeaa96a01f2f1a67cb3e2250f1924c8f052a7f1e0f843352cd19be0192f9a1a550380c17b2a2bbc5c87927d33e4b7b2afacd3d8329adbf2a7b1fb2bd970294715b5b09aa6d6d8e307994160e8be8b636e5bd2f9eada01ea5dd3df4a054a169a034e29100e5d13b84032c1c7a0a6e310414844390fa9c96a59bd4fae74ca315c3fb75543b5653dde2c7df18ea83e80925e61cdcc915493988da613669971970f87e021eba449ed1958b6d29434e5a0ec98a6121231f0354393144284f21f92f4567f18cfc82daae6d4a0d23750d133cc47b226c492fb9f2e884e0c0f438288c341689afaea46f12128f351f764724e317a3a6f72a356f1b6dc427e39162771f53e7a8b5166d69b6f3005e08cb5522c27c637998ab08071dc148745e87f80e9dcee2822ddfb3f227de1cca105969daecc28c4fa5f7165a844218c9a5ac0d98c17fbefa21b726c050a0061a183f0e92d27fb097533ceecc236a74bb32a5d77ca6946246cbde703015ffdf9a35658cd887b59f57dff7bee8d8562af2efe13a2eeddf42016c5ebe60898233e83eaebac183d9dbadc8fabc82e6bb7fd7eb4d8ea92812c5c3b7c439976c4c7bba0774f5cd1734923306b8125bef027788412b9594a8b13f78a5cbcd9babae1d7d16457aebfe2f3e9376c325451e68796a0359b8d36e0a56b81f1f3218b0ee24e510c3064bf4c7fc464008e23a099e3cbf19fdfe273cde4ea8fd4207c223d9eefa16a55a4629c4abf8d702cf69bc6c9c572db01288e613c4e3a5edfbb3d256270b19f4717ce7d2c2488eb093811aceeedc85bfeb03f88d79f695de67e81b2ff9ad3781c4351a6bef1c6860257d2ef532ad03250edf48702fe60abd70aaf6475dcb10237ba57c0e61ecede278b179ac86946ac84bbe15a7f221fa84430344102eae0af8bc25cc29e032fce6c4cf6e9a6c129bd90f58c35ab42d2daf01bccce5b2453b2736e17cec732886afc8388a4d71298a62561ffbb8a7903163d28060c3f7203a9a8f8ab32eff98e7729bb9380c687610e5a09fc289c5f95f45aacf1984cb6f259d741134fa9bb3bcd6692f18a836a065268bab9dcf23a9d657a8b6dd321dad1326e9ca14053ab620a4bb104ac99e1a953cbe775a720068c7dcd065d7a50c3c0d713817431231e289cc01c0187f1deafc390654373fb4e824c5962ef5b40f812be67f43e05e034c0555483414507fe7bbdb302018d661770361370d99bb471d36ef66d24342871e3288cc4e66330770af1170605c2c88f523220990c2174dee1fe17362d2c714b316ebc7d665a3760ab341e24bb889ee38295dd66d1c88a675001655409dff64427641639db8b74cc91451154a255440a550a44d5f53b97241252053f9472631235a290981043660d695104e5273baa1bb76c3b536b6519a5a268f6174a1569a4671a9b583bbb3539a121e52d633d2384d2a55d2d50d360109095f6c8c59150b23069ac85222450024a79da05a95d54263e6f4fedbda41275e29217cd888f397fe02051afd5c532a1f3f73ade49c1be9bb4853b6ff18ec488a0e87fd4c6006aac81ec12590525b26a6c72355f4bad32050354eac757b0cbd1205b750343cb75373c7abaca352bccfeb07fe57363e10256aa57e937efc0e1fab0c7414ea0b2796199550dae7a245da89099a65a95e2076a026c1975302d201840e4cae2478408c5e31dfa14d4f42a316fa8c7aab7fc96d85d7bcdd910e9d6ff81f04b24ff48783c99f20e0c2e5f877c414895d65ae51d44b83d1703766a1383f07744d1de63c330ced8611db60753f64ea9f5f474d1da0f50c674b8b2058c4551f3791bca32f2b2e56906b0e29e17b00096fc52113a3c38182ca3349b7ff3eda3f2b1b0508a8b1aa24cdce11367c6a030647e1b137ea3a4dc3b525e54fc3ffdc3765e73769888957d2c19bb4f9b46a176b69838b7bc48bc0978f59df202371bb2f880a272e84a2efa617e6ec8162a9c06b99504686cf0619f7ba13a9971fe9f1328deabee75adf3095773b05902e95e9cdf904719a11081313899d9475bb23262b2d7b3a9433d588e60a41cea0ee5e4273d1e0ec01dc022f5d869644639787b910ca07ac75bb6a08c78d5394e54a73e6b8f7a36c57f45ac4062f1a914e693c990ed848351ef61858fb88fc10452ede7709bc40a76a71d015c9a02a4816178daf1526abcecb04f129b65e5f7ed08cd4bd9b4ce98d2509e383897fbac1f26f476c34dd524fa83782b523a504328c90c9471ba1a8b6671e4cfd6e73259c15574e8a3bbbe5465127c512d048419d0db087e9fbf911a011576e06772c7d2ce5ebf2b61b27725564a78a6ce9185647b9b73934a505bbf707dab3d9032a71bd4fe6226410ca4257a881365f96e8d96f0f2c539dfc322b48fd79fb29245fa4dd8f5250bc0198c28c8f1b1d2009bfae471d738bd6dd3c0f29b3d413f5ba96fde2460e51db18b66ad6bee8c8046aa66a7af9eeaf73d632a5b302332ae10e170662785c498303916c5d3db7dec64483f9f55c706bc9e9c1c9f0edf97385517b402f443188670ac48d1998ea76e508ed0f254b535b879cc83ad2dc78c9ffadd28ac1ff98082c001bbae2532b570e23be66836d25fffd555bb0b208849dc9f7f536c832be679030be882c55a777ce0785820f4e41e593405d1214f2acdf8b4f302381da2572b625b2be40a3585bc9c30ccd27525068d70387d8c2cf204fa9f6866de875abcb2716d6509fbd73a99341acba06f0f65cd95c5552c9b6a58f87b1c9e7531886bfeb30071a8370fd688326b5011c7835a93831a67fa48e43033ec9904f1497626a8529be0dae098685f001b18a14649233f72d536f276350d710ec57fa58ee8a9eff35fa36e9d7249614e30b1045d4f164f1f9029b3ae4634a7163bca936f3e0bae01799a45ac8b1da7da27e3715e235eaab21c73dd965fc6630f1abb1c2dacbaeaa2d4dd7d095dfc1df46c87f9ce9059138187899e1fa12c682022ce714d89aac741ee0b037f8e34d6a5163b2dbc1921ac209796f4af27f2197b471e0849272a91f2a32749a034cca05520b762a32a22da0210e038c1485378720d1df8fcbdbb9c00d33fad3f150358f230478ddd492f4f4eba97ff7cece470d2bfd3e43e38991632ac06b6342ace010ac4263186affa5ec2bb00cc9986204476129aeeff96e2bfd0cbfc250e1c32bda2f153547cc3be80a557f141eecbdae505fe8072072a818150b1773c24963448a7e1568379d23e80ebe0f76a0444f988679e263cdc4b31c921629e4d49d12ff31d55af17998dc067235811af368ffceac71d99efe162bff0220283a80487e177ccd2299538dcf653f5307012afffe867dcedfa67c83e83ea309998998070f403a1c6fef6cdc6f3b1d7736959f4d8571cc398dd1605139fe88392afcd40444fa4d094036f4cce9fb6980403900336cbc7b0097ae176409e6d93fe1660b3659a579a9f0f85306d3a2a5060a1241f2adc469113af174e7b71e7d2fca9000d8002747c7065b232cea32d1169c82bb315df0d602a5f9cfd9713a2625c795b2938d6a9cdc58347466f81a1fc25a0f33bbae3ce114dcbb55d5c126850445d125c52e53cb7f3109295cc920ef2e931413021a0ba8ad610b363698090b14991a093f5542f2871a104ba928e59a2f0c63cf762afeae2c8fcba64b2747e62ebe4a77d0af3d3e2d05ca6dbcf2533f92ddcdc24702d67d9fc21a5d8a2ff5090ba6ab1f3fbded762d09022f059a122fdb75aff00cd688fa9c485c3bf0b0695f9f15b37afa92e0fcd88337d8a645b272e033776ae474690d0691a644b3e905bb1ad2f2ec80a4fe7e588978b1e11c52069cd046d4c5e5b3a8f73386e30be6fe193ffa82ad3a15fd832e55aa8266aa0d7d70fee48d980872646725349905f469430127439cbc5eb74cdd85aff5269f4a328e8c8e610dd5fe6ff661ebb0f551f7dc1090a1f2e5c0ce97f014e44bffbc02dfa57aa6dfc17d810194a4bec163dfff5f3dd91fe8311c6d6962d1fcf1931017a93042e41d0cac8929f5a44c4b176777bd029ce983a08da0fcff0293b2a5a11108513b7a82dfb52abdd6d753179ce9b18ab83f33d398d4f19af884b6e6dcae6f82aac92c7cf7e36c50d9f8d66350a1e18c948b73eb631564a1eb5a825470401c3c41d51409be2eff1430180617de248ef63ea017b4ff0bce4e843c5873dc06748644187e25a562e5105fc8f41bb5daa91333d66c57f545f3313de6997926c05454f8eb9b423eca2d0a0a3a560783b5f02a9860154f14102c0346bbaea850e3a4fcd9567af660a1b8f2136f4dbdb701d12e38b0b4c91abbd6e3a02510aad8882f2fa7a238024028624db7c5616d8c5abca496291e4456d0980dcc2b10c856583701e796dcf5cc919a4f4d29111a8b994dd03116c9f663a88e0d24c8d4e732fe0151755f13eff676beead78b5696ca85e9c53c64539975e83d1a50b8771600e58c192cd3c28f81fbfc8f673846a8efecf87a3557c2849ddd4ae76625799c240fb56ac075ceb820406a9244408607f9ce680e2929d3fa3a04fabb2785aec2bcbd287d4432e4e7e59a082e5e8b36bed08e001db8d02534c5468af81fcc19ee4303ce13897dd517d8cacdff65bfbf22428a412b18642510e714542b44ab892ee2a9014600e359d5f2b1645d314ce28136276a7518e659ba470bbd71ec24fe4fcb9cc3395d34668ad1100aabeb78ae5fd1b6da273680e926df2bde485e327e4deb37a883595a8bda57948aa7a7d86a5bb5f2d296a3cd6030839b1b135495cf342cd8152e9e2279535d8ba676b0d49f7e385dd708026eaf6944995df260685b28791dc09e77ac4ecf64af7023171fa2653ded414fad0e9ee87f9b24df60fffdfdcea23ce647822361b609c0a87e70b10fb2bb0b291976acfb90d69bcf92464d7b78c46875f52197243ba4320448b258ddeb84b0412c5ea5e94bbe4a6fe02cba122d75b5da83978c54f53270d38f5f4507f2eba9ddae49feed9174186e1b99d6337809d186b8dbeb8a86687d51cf9168e27f1047fb0eec332321243364319f5fa24e14dd223faf5ec04891083e3670c1d90134a7252695e84411747e15b8fcc87edc904807af29c24d02b99387c1edf61eaaa4dac61f01009f36c0a4e83e421fb04144405c34718b10078f5bcb7dc7cb228799b59bcf2787c4a6dd9a58bb6db2734a3d23153453ff712c89abe71d1aebb617ab392a9ae81c0100fd7bd3a315eebe47ff72369aacd32aad2a048d4d84fce13450b0f5245952d59aeb828159e9c26b2ba18797781ca87badbede3575d8d2406299c14dba1c8e5a2f00000000000000000100ed05b1a83eb82d579348ac909f20a2f4b84f54b548e9c72eb863c45b808c091d5767989ec3881db204bca70e9d0991a76c75f4d254fbc49bc45c78196cd6c325210080a0835b85a29f68b95d0e0339bd20ca08b2280240bc0741c33918a6a25c138601ce2c6d87d0184c1799a254ed03047cf57a3bfd49b8a4438d496d741cf5aca6bd02cc36601959213b6b0cdb96a75c17c3a668a97f0d6a8c5ce164a518ea9ba9a50ea75191fd861b0ff10e62b0000000000000000068b155695cc01cb84051a921b2d7af4a2d571d9a581db37eda3107870d644a1a5bc6a5386ff4e8d589d673fd34c6b13f572d9fa308dfba669903a260d304178f70bb16e6a1b5b714290ec87832f086e3a375125a34d32814fb4a0063e5242fe684ff8b144c6e6aa918eb92d0070000000000000ad166c1957f0f7a34f9ba457eaa2c4f4f8857cea9e4f899035c1cc5ff37050b57bfff0bb62dd7b8813ed9db70b840a13231494c2056543df9fe09701912f01b0001004100c4678517dcb7ce02898a15e1d9f5d1c8b553e8732b369039e903989891a14efccc5c98e22d5168970aa8c850429ac680a20a4c7ebae477fe22aa14d34d92b513 \ No newline at end of file diff --git a/zebra-test/src/vectors/orchard_zsa_workflow_blocks.rs b/zebra-test/src/vectors/orchard_zsa_workflow_blocks.rs index 6bb9118fc4c..aaa47b67792 100644 --- a/zebra-test/src/vectors/orchard_zsa_workflow_blocks.rs +++ b/zebra-test/src/vectors/orchard_zsa_workflow_blocks.rs @@ -24,31 +24,31 @@ lazy_static! { pub static ref ORCHARD_ZSA_WORKFLOW_BLOCKS: Vec = vec![ // Issue: 1000 OrchardWorkflowBlock { - bytes: decode_bytes(include_str!("orchard-zsa-workflow-blocks-1.txt")), + bytes: decode_bytes(include_str!("orchard-zsa-workflow-block-1.txt")), is_valid: true }, // Transfer OrchardWorkflowBlock { - bytes: decode_bytes(include_str!("orchard-zsa-workflow-blocks-2.txt")), + bytes: decode_bytes(include_str!("orchard-zsa-workflow-block-2.txt")), is_valid: true }, // Burn: 7, Burn: 2 OrchardWorkflowBlock { - bytes: decode_bytes(include_str!("orchard-zsa-workflow-blocks-3.txt")), + bytes: decode_bytes(include_str!("orchard-zsa-workflow-block-3.txt")), is_valid: true }, // Issue: finalize OrchardWorkflowBlock { - bytes: decode_bytes(include_str!("orchard-zsa-workflow-blocks-4.txt")), + bytes: decode_bytes(include_str!("orchard-zsa-workflow-block-4.txt")), is_valid: true }, // Try to issue: 2000 OrchardWorkflowBlock { - bytes: decode_bytes(include_str!("orchard-zsa-workflow-blocks-5.txt")), + bytes: decode_bytes(include_str!("orchard-zsa-workflow-block-5.txt")), is_valid: false }, ]; diff --git a/zebrad/build.rs b/zebrad/build.rs index efac0a69774..21fd4049597 100644 --- a/zebrad/build.rs +++ b/zebrad/build.rs @@ -6,6 +6,7 @@ //! When compiling the `lightwalletd` gRPC tests, also builds a gRPC client //! Rust API for `lightwalletd`. +use std::process::Command; use vergen::EmitBuilder; /// Returns a new `vergen` builder, configured for everything except for `git` env vars. @@ -18,6 +19,18 @@ fn base_vergen_builder() -> EmitBuilder { vergen } +/// Run a git command and return the output, or a fallback value if it fails +fn run_git_command(args: &[&str], fallback: &str) -> String { + Command::new("git") + .args(args) + .output() + .ok() + .and_then(|o| String::from_utf8(o.stdout).ok()) + .map(|s| s.trim().to_string()) + .filter(|s| !s.is_empty()) + .unwrap_or_else(|| fallback.to_owned()) +} + /// Process entry point for `zebrad`'s build script #[allow(clippy::print_stderr)] fn main() { @@ -52,4 +65,13 @@ fn main() { &["tests/common/lightwalletd/proto"], ) .expect("Failed to generate lightwalletd gRPC files"); + + // Add custom git tag and commit information + // Use environment variables if available (from CI/CD), otherwise try git commands (Can be problematic as the docker image shouldn't contain the .git folder) + let git_commit = std::env::var("GIT_COMMIT_FULL") + .unwrap_or_else(|_| run_git_command(&["rev-parse", "HEAD"], "none")); + let git_tag = std::env::var("GIT_TAG") + .unwrap_or_else(|_| run_git_command(&["describe", "--exact-match", "--tags"], "none")); + println!("cargo:rustc-env=GIT_TAG={}", git_tag); + println!("cargo:rustc-env=GIT_COMMIT_FULL={}", git_commit); } diff --git a/zebrad/src/application.rs b/zebrad/src/application.rs index b26734f943a..5794e7dc556 100644 --- a/zebrad/src/application.rs +++ b/zebrad/src/application.rs @@ -295,6 +295,8 @@ impl Application for ZebradApp { let git_metadata: &[(_, Option<_>)] = &[ ("branch", option_env!("VERGEN_GIT_BRANCH")), ("git commit", Self::git_commit()), + ("git tag", option_env!("GIT_TAG")), + ("git commit full", option_env!("GIT_COMMIT_FULL")), ( "commit timestamp", option_env!("VERGEN_GIT_COMMIT_TIMESTAMP"),