diff --git a/src/containers/anchors.rs b/src/containers/anchors.rs index d30e6116..d9beb866 100644 --- a/src/containers/anchors.rs +++ b/src/containers/anchors.rs @@ -20,22 +20,18 @@ // limitations under the License. use std::cmp::Ordering; -use std::vec; use amplify::ByteArray; use bp::dbc::opret::OpretProof; use bp::dbc::tapret::TapretProof; use bp::dbc::{anchor, Anchor}; use bp::{Tx, Txid}; -use commit_verify::{mpc, CommitId}; -use rgb::validation::{DbcProof, EAnchor}; -use rgb::{ - BundleDisclosure, BundleId, ContractId, DiscloseHash, Operation, Transition, TransitionBundle, - XChain, XWitnessId, -}; +use commit_verify::mpc; +use rgb::validation::DbcProof; +use rgb::{BundleId, DiscloseHash, TransitionBundle, XChain, XWitnessId}; use strict_encoding::StrictDumb; -use crate::{BundleExt, MergeReveal, MergeRevealError, RevealError, LIB_NAME_RGB_STD}; +use crate::{MergeReveal, MergeRevealError, LIB_NAME_RGB_STD}; #[derive(Clone, Eq, PartialEq, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] @@ -153,34 +149,6 @@ impl PubWitness { } } -#[derive(Clone, Eq, PartialEq, Debug)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_STD)] -pub(crate) struct AnchoredBundleDisclosure { - pub anchor: EAnchor, - pub bundle: BundleDisclosure, -} - -impl AnchoredBundleDisclosure { - pub fn new(anchor: EAnchor, bundle: &TransitionBundle) -> Self { - Self { - anchor, - bundle: bundle.disclose(), - } - } -} - -#[derive(Clone, Eq, PartialEq, Debug)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_STD)] -#[derive(CommitEncode)] -#[commit_encode(strategy = strict, id = DiscloseHash)] -pub(crate) struct BundledWitnessDisclosure { - pub pub_witness: XPubWitness, - pub first: AnchoredBundleDisclosure, - pub second: Option, -} - #[derive(Clone, Eq, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB_STD)] @@ -189,50 +157,37 @@ pub(crate) struct BundledWitnessDisclosure { derive(Serialize, Deserialize), serde(crate = "serde_crate", rename_all = "camelCase") )] -pub struct BundledWitness { +#[derive(CommitEncode)] +#[commit_encode(strategy = strict, id = DiscloseHash)] +pub struct WitnessBundle { pub pub_witness: XPubWitness, - pub anchored_bundles: AnchoredBundles

, + pub anchor: Anchor, + pub bundle: TransitionBundle, } -impl PartialEq for BundledWitness

{ +impl PartialEq for WitnessBundle

{ fn eq(&self, other: &Self) -> bool { self.pub_witness == other.pub_witness } } -impl Ord for BundledWitness

{ +impl Ord for WitnessBundle

{ fn cmp(&self, other: &Self) -> Ordering { self.pub_witness.cmp(&other.pub_witness) } } -impl PartialOrd for BundledWitness

{ +impl PartialOrd for WitnessBundle

{ fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } } -impl BundledWitness

{ - pub fn bundles(&self) -> vec::IntoIter<&TransitionBundle> { self.anchored_bundles.bundles() } -} - -impl BundledWitness { +impl WitnessBundle { pub fn witness_id(&self) -> XWitnessId { self.pub_witness.to_witness_id() } - - pub(crate) fn disclose(&self) -> BundledWitnessDisclosure { - let mut pairs = self.anchored_bundles.pairs(); - let (a1, b1) = pairs.next().expect("there always at least one bundle"); - let second = pairs - .next() - .map(|(a, b)| AnchoredBundleDisclosure::new(a, b)); - BundledWitnessDisclosure { - pub_witness: self.pub_witness.clone(), - first: AnchoredBundleDisclosure::new(a1, b1), - second, - } - } - - pub fn disclose_hash(&self) -> DiscloseHash { self.disclose().commit_id() } } -impl BundledWitness { +impl WitnessBundle { pub fn merge_reveal(mut self, other: Self) -> Result { self.pub_witness = self.pub_witness.merge_reveal(other.pub_witness)?; - self.anchored_bundles = self.anchored_bundles.merge_reveal(other.anchored_bundles)?; + if self.anchor != other.anchor { + return Err(MergeRevealError::AnchorsNonEqual(self.bundle.bundle_id())); + } + self.bundle = self.bundle.merge_reveal(other.bundle)?; Ok(self) } } @@ -311,247 +266,3 @@ impl AnchorSet { } } } - -#[derive(Clone, PartialEq, Eq, Debug)] -#[derive(StrictType, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_RGB_STD, tags = custom)] -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(crate = "serde_crate", rename_all = "camelCase") -)] -pub enum AnchoredBundles { - #[strict_type(tag = 0x01)] - Tapret(Anchor, TransitionBundle), - #[strict_type(tag = 0x02)] - Opret(Anchor, TransitionBundle), - #[strict_type(tag = 0x03)] - Double { - tapret_anchor: Anchor, - tapret_bundle: TransitionBundle, - opret_anchor: Anchor, - opret_bundle: TransitionBundle, - }, -} - -impl StrictDumb for AnchoredBundles

{ - fn strict_dumb() -> Self { Self::Opret(strict_dumb!(), strict_dumb!()) } -} - -impl AnchoredBundles

{ - pub fn with(anchor: EAnchor

, bundle: TransitionBundle) -> Self { - match anchor.dbc_proof { - DbcProof::Tapret(tapret) => Self::Tapret(Anchor::new(anchor.mpc_proof, tapret), bundle), - DbcProof::Opret(opret) => Self::Opret(Anchor::new(anchor.mpc_proof, opret), bundle), - } - } - - pub fn has_tapret(&self) -> bool { matches!(self, Self::Tapret(..) | Self::Double { .. }) } - - pub fn has_opret(&self) -> bool { matches!(self, Self::Opret(..) | Self::Double { .. }) } - - pub fn pairs(&self) -> vec::IntoIter<(EAnchor

, &TransitionBundle)> - where P: Clone { - match self { - AnchoredBundles::Tapret(anchor, bundle) => { - let anchor = anchor.clone(); - vec![(EAnchor::new(anchor.mpc_proof, anchor.dbc_proof.into()), bundle)] - } - AnchoredBundles::Opret(anchor, bundle) => { - let anchor = anchor.clone(); - vec![(EAnchor::new(anchor.mpc_proof, anchor.dbc_proof.into()), bundle)] - } - AnchoredBundles::Double { - tapret_anchor, - tapret_bundle, - opret_anchor, - opret_bundle, - } => { - let tapret_anchor = tapret_anchor.clone(); - let opret_anchor = opret_anchor.clone(); - vec![ - ( - EAnchor::new(tapret_anchor.mpc_proof, tapret_anchor.dbc_proof.into()), - tapret_bundle, - ), - ( - EAnchor::new(opret_anchor.mpc_proof, opret_anchor.dbc_proof.into()), - opret_bundle, - ), - ] - } - } - .into_iter() - } - - pub fn bundles(&self) -> vec::IntoIter<&TransitionBundle> { - match self { - AnchoredBundles::Tapret(_, bundle) | AnchoredBundles::Opret(_, bundle) => vec![bundle], - AnchoredBundles::Double { - tapret_bundle, - opret_bundle, - .. - } => vec![tapret_bundle, opret_bundle], - } - .into_iter() - } - - pub fn bundles_mut(&mut self) -> vec::IntoIter<&mut TransitionBundle> { - match self { - AnchoredBundles::Tapret(_, bundle) | AnchoredBundles::Opret(_, bundle) => vec![bundle], - AnchoredBundles::Double { - tapret_bundle, - opret_bundle, - .. - } => vec![tapret_bundle, opret_bundle], - } - .into_iter() - } - - /// Ensures that the transition is revealed inside the anchored bundle. - /// - /// # Returns - /// - /// `true` if the transition was previously concealed; `false` if it was - /// already revealed; error if the transition is unrelated to the bundle. - pub fn reveal_transition(&mut self, mut transition: Transition) -> Result { - for bundle in self.bundles_mut() { - match bundle.reveal_transition(transition) { - Ok(known) => return Ok(known), - Err(RevealError::UnrelatedTransition(_, t)) => transition = t, - } - } - Err(RevealError::UnrelatedTransition(transition.id(), transition)) - } -} - -impl AnchoredBundles { - pub fn to_anchor_set( - &self, - contract_id: ContractId, - bundle_id: BundleId, - ) -> Result { - let proto = mpc::ProtocolId::from_byte_array(contract_id.to_byte_array()); - let msg = mpc::Message::from_byte_array(bundle_id.to_byte_array()); - match self.clone() { - Self::Tapret(anchor, _) => anchor.to_merkle_block(proto, msg).map(AnchorSet::Tapret), - Self::Opret(anchor, _) => anchor.to_merkle_block(proto, msg).map(AnchorSet::Opret), - Self::Double { - tapret_anchor, - opret_anchor, - .. - } => Ok(AnchorSet::Double { - tapret: tapret_anchor.to_merkle_block(proto, msg)?, - opret: opret_anchor.to_merkle_block(proto, msg)?, - }), - } - } -} - -impl AnchoredBundles { - pub fn merge_reveal(self, other: Self) -> Result { - match (self, other) { - (AnchoredBundles::Tapret(anchor, bundle1), AnchoredBundles::Tapret(a, bundle2)) - if a == anchor => - { - Ok(AnchoredBundles::Tapret(anchor, bundle1.merge_reveal(bundle2)?)) - } - - (AnchoredBundles::Opret(anchor, bundle1), AnchoredBundles::Opret(a, bundle2)) - if a == anchor => - { - Ok(AnchoredBundles::Opret(anchor, bundle1.merge_reveal(bundle2)?)) - } - - ( - AnchoredBundles::Tapret(tapret_anchor, tapret_bundle), - AnchoredBundles::Opret(opret_anchor, opret_bundle), - ) - | ( - AnchoredBundles::Opret(opret_anchor, opret_bundle), - AnchoredBundles::Tapret(tapret_anchor, tapret_bundle), - ) => Ok(AnchoredBundles::Double { - tapret_anchor, - tapret_bundle, - opret_anchor, - opret_bundle, - }), - - ( - AnchoredBundles::Double { - tapret_anchor, - tapret_bundle, - opret_anchor, - opret_bundle, - }, - AnchoredBundles::Tapret(t, bundle), - ) - | ( - AnchoredBundles::Tapret(t, bundle), - AnchoredBundles::Double { - tapret_anchor, - tapret_bundle, - opret_anchor, - opret_bundle, - }, - ) if tapret_anchor == t => Ok(AnchoredBundles::Double { - tapret_anchor, - opret_anchor, - tapret_bundle: tapret_bundle.merge_reveal(bundle)?, - opret_bundle, - }), - - ( - AnchoredBundles::Double { - tapret_anchor, - tapret_bundle, - opret_anchor, - opret_bundle, - }, - AnchoredBundles::Opret(o, bundle), - ) - | ( - AnchoredBundles::Opret(o, bundle), - AnchoredBundles::Double { - tapret_anchor, - tapret_bundle, - opret_anchor, - opret_bundle, - }, - ) if opret_anchor == o => Ok(AnchoredBundles::Double { - tapret_anchor, - opret_anchor, - tapret_bundle: tapret_bundle.merge_reveal(bundle)?, - opret_bundle, - }), - - ( - AnchoredBundles::Double { - tapret_anchor, - tapret_bundle: tapret1, - opret_anchor, - opret_bundle: opret1, - }, - AnchoredBundles::Double { - tapret_anchor: t, - opret_anchor: o, - tapret_bundle: tapret2, - opret_bundle: opret2, - .. - }, - ) if tapret_anchor == t && opret_anchor == o => Ok(AnchoredBundles::Double { - tapret_anchor, - opret_anchor, - tapret_bundle: tapret1.merge_reveal(tapret2)?, - opret_bundle: opret1.merge_reveal(opret2)?, - }), - - (me, _) => Err(MergeRevealError::AnchorsNonEqual( - me.bundles() - .next() - .expect("at least one bundle") - .bundle_id(), - )), - } - } -} diff --git a/src/containers/consignment.rs b/src/containers/consignment.rs index bd6e0d65..cd91798f 100644 --- a/src/containers/consignment.rs +++ b/src/containers/consignment.rs @@ -43,7 +43,7 @@ use strict_encoding::{StrictDeserialize, StrictDumb, StrictSerialize}; use strict_types::TypeSystem; use super::{ - BundledWitness, ContainerVer, ContentId, ContentSigs, IndexedConsignment, Supplement, + ContainerVer, ContentId, ContentSigs, IndexedConsignment, Supplement, WitnessBundle, ASCII_ARMOR_CONSIGNMENT_TYPE, ASCII_ARMOR_CONTRACT, ASCII_ARMOR_IFACE, ASCII_ARMOR_SCHEMA, ASCII_ARMOR_TERMINAL, ASCII_ARMOR_VERSION, }; @@ -61,7 +61,7 @@ pub trait ConsignmentExt { fn schema(&self) -> &Schema; fn genesis(&self) -> &Genesis; fn extensions(&self) -> impl Iterator; - fn bundled_witnesses(&self) -> impl Iterator; + fn bundled_witnesses(&self) -> impl Iterator; } impl ConsignmentExt for &C { @@ -81,7 +81,7 @@ impl ConsignmentExt for &C { fn extensions(&self) -> impl Iterator { (*self).extensions() } #[inline] - fn bundled_witnesses(&self) -> impl Iterator { + fn bundled_witnesses(&self) -> impl Iterator { (*self).bundled_witnesses() } } @@ -196,7 +196,7 @@ pub struct Consignment { /// All bundled state transitions contained in the consignment, together /// with their witness data. - pub bundles: LargeOrdSet, + pub bundles: LargeOrdSet, /// Schema (plus root schema, if any) under which contract is issued. pub schema: Schema, @@ -241,7 +241,7 @@ impl CommitEncode for Consignment { )); e.commit_to_set(&LargeOrdSet::from_iter_checked( - self.bundles.iter().map(BundledWitness::disclose_hash), + self.bundles.iter().map(WitnessBundle::commit_id), )); e.commit_to_set(&LargeOrdSet::from_iter_checked( self.extensions.iter().map(Extension::disclose_hash), @@ -277,7 +277,7 @@ impl ConsignmentExt for Consignment { fn extensions(&self) -> impl Iterator { self.extensions.iter() } #[inline] - fn bundled_witnesses(&self) -> impl Iterator { self.bundles.iter() } + fn bundled_witnesses(&self) -> impl Iterator { self.bundles.iter() } } impl Consignment { @@ -293,18 +293,16 @@ impl Consignment { ) -> Result { // We need to clone since ordered set does not allow us to mutate members. let mut bundles = LargeOrdSet::with_capacity(self.bundles.len()); - for mut bundled_witness in self.bundles { + for mut witness_bundle in self.bundles { for (bundle_id, secret) in &self.terminals { if let Some(seal) = f(*secret)? { - for bundle in bundled_witness.anchored_bundles.bundles_mut() { - if bundle.bundle_id() == *bundle_id { - bundle.reveal_seal(seal); - break; - } + if witness_bundle.bundle.bundle_id() == *bundle_id { + witness_bundle.bundle.reveal_seal(seal); + break; } } } - bundles.push(bundled_witness).ok(); + bundles.push(witness_bundle).ok(); } self.bundles = bundles; Ok(self) diff --git a/src/containers/indexed.rs b/src/containers/indexed.rs index 59dc6f84..a8e332a5 100644 --- a/src/containers/indexed.rs +++ b/src/containers/indexed.rs @@ -36,7 +36,7 @@ use crate::containers::anchors::ToWitnessId; pub struct IndexedConsignment<'c, const TRANSFER: bool> { consignment: &'c Consignment, scripts: Scripts, - anchor_idx: BTreeMap, + anchor_idx: BTreeMap, bundle_idx: BTreeMap, op_witness_idx: BTreeMap, op_bundle_idx: BTreeMap, @@ -58,17 +58,17 @@ impl<'c, const TRANSFER: bool> IndexedConsignment<'c, TRANSFER> { let mut op_bundle_idx = BTreeMap::new(); let mut extension_idx = BTreeMap::new(); let mut witness_idx = BTreeMap::new(); - for bw in &consignment.bundles { - witness_idx.insert(bw.pub_witness.to_witness_id(), &bw.pub_witness); - for (anchor, bundle) in bw.anchored_bundles.pairs() { - let bundle_id = bundle.bundle_id(); - let witness_id = bw.pub_witness.to_witness_id(); - bundle_idx.insert(bundle_id, bundle); - anchor_idx.insert(bundle_id, (witness_id, anchor)); - for opid in bundle.known_transitions.keys() { - op_witness_idx.insert(*opid, witness_id); - op_bundle_idx.insert(*opid, bundle_id); - } + for witness_bundle in &consignment.bundles { + witness_idx + .insert(witness_bundle.pub_witness.to_witness_id(), &witness_bundle.pub_witness); + let bundle = &witness_bundle.bundle; + let bundle_id = bundle.bundle_id(); + let witness_id = witness_bundle.pub_witness.to_witness_id(); + bundle_idx.insert(bundle_id, bundle); + anchor_idx.insert(bundle_id, (witness_id, &witness_bundle.anchor)); + for opid in witness_bundle.bundle.known_transitions.keys() { + op_witness_idx.insert(*opid, witness_id); + op_bundle_idx.insert(*opid, bundle_id); } } for extension in &consignment.extensions { @@ -137,7 +137,7 @@ impl<'c, const TRANSFER: bool> ConsignmentApi for IndexedConsignment<'c, TRANSFE } fn anchor(&self, bundle_id: BundleId) -> Option<(XWitnessId, &EAnchor)> { - self.anchor_idx.get(&bundle_id).map(|(id, set)| (*id, set)) + self.anchor_idx.get(&bundle_id).map(|(id, set)| (*id, *set)) } fn op_witness_id(&self, opid: OpId) -> Option { diff --git a/src/containers/mod.rs b/src/containers/mod.rs index aff6c7d7..277138e2 100644 --- a/src/containers/mod.rs +++ b/src/containers/mod.rs @@ -38,9 +38,7 @@ mod file; mod kit; mod suppl; -pub use anchors::{ - AnchorSet, AnchoredBundles, BundledWitness, PubWitness, SealWitness, ToWitnessId, XPubWitness, -}; +pub use anchors::{AnchorSet, PubWitness, SealWitness, ToWitnessId, WitnessBundle, XPubWitness}; pub use consignment::{ Consignment, ConsignmentExt, ConsignmentId, ConsignmentParseError, Contract, Transfer, ValidConsignment, ValidContract, ValidTransfer, diff --git a/src/persistence/index.rs b/src/persistence/index.rs index 5d0dfe38..a047d7d0 100644 --- a/src/persistence/index.rs +++ b/src/persistence/index.rs @@ -31,7 +31,7 @@ use rgb::{ XWitnessId, }; -use crate::containers::{BundledWitness, ConsignmentExt, ToWitnessId}; +use crate::containers::{ConsignmentExt, ToWitnessId, WitnessBundle}; use crate::persistence::{MemError, StoreTransaction}; use crate::SecretSeal; @@ -169,15 +169,14 @@ impl Index

{ for extension in consignment.extensions() { self.index_extension(contract_id, extension)?; } - for BundledWitness { + for WitnessBundle { pub_witness, - anchored_bundles, + bundle, + anchor: _, } in consignment.bundled_witnesses() { let witness_id = pub_witness.to_witness_id(); - for bundle in anchored_bundles.bundles() { - self.index_bundle(contract_id, bundle, witness_id)?; - } + self.index_bundle(contract_id, bundle, witness_id)?; } Ok(()) diff --git a/src/persistence/stash.rs b/src/persistence/stash.rs index c751d7fc..0924fdd0 100644 --- a/src/persistence/stash.rs +++ b/src/persistence/stash.rs @@ -24,14 +24,16 @@ use std::error::Error; use std::fmt::Debug; use aluvm::library::{Lib, LibId}; -use amplify::confinement; use amplify::confinement::{Confined, MediumBlob, TinyOrdMap}; +use amplify::{confinement, ByteArray}; use bp::dbc::anchor::MergeError; use bp::dbc::tapret::TapretCommitment; +use bp::dbc::Anchor; use bp::seals::txout::CloseMethod; use commit_verify::mpc; +use commit_verify::mpc::MerkleBlock; use nonasync::persistence::{CloneNoPersistence, Persisting}; -use rgb::validation::Scripts; +use rgb::validation::{DbcProof, Scripts}; use rgb::{ AttachId, BundleId, ContractId, Extension, Genesis, GraphSeal, Identity, OpId, Operation, Schema, SchemaId, TransitionBundle, XChain, XWitnessId, @@ -41,8 +43,8 @@ use strict_types::typesys::UnknownType; use strict_types::TypeSystem; use crate::containers::{ - BundledWitness, Consignment, ConsignmentExt, ContentId, ContentRef, ContentSigs, Kit, - SealWitness, SigBlob, Supplement, TrustLevel, + AnchorSet, Consignment, ConsignmentExt, ContentId, ContentRef, ContentSigs, Kit, SealWitness, + SigBlob, Supplement, TrustLevel, WitnessBundle, }; use crate::interface::{ ContractBuilder, Iface, IfaceClass, IfaceId, IfaceImpl, IfaceRef, TransitionBuilder, @@ -546,26 +548,31 @@ impl Stash

{ fn consume_bundled_witness( &mut self, contract_id: ContractId, - bundled_witness: BundledWitness, + bundled_witness: WitnessBundle, ) -> Result<(), StashError

> { - let BundledWitness { + let WitnessBundle { pub_witness, - anchored_bundles, + bundle, + anchor, } = bundled_witness; // TODO: Save pub witness transaction and SPVs - for bundle in anchored_bundles.bundles().cloned() { - let bundle_id = bundle.bundle_id(); - self.consume_bundle(bundle)?; + let bundle_id = bundle.bundle_id(); + self.consume_bundle(bundle)?; - let anchors = anchored_bundles.to_anchor_set(contract_id, bundle_id)?; - let witness = SealWitness { - public: pub_witness.clone(), - anchors, - }; - self.consume_witness(witness)?; - } + let proto = mpc::ProtocolId::from_byte_array(contract_id.to_byte_array()); + let msg = mpc::Message::from_byte_array(bundle_id.to_byte_array()); + let merkle_block = MerkleBlock::with(&anchor.mpc_proof, proto, msg)?; + let anchors = match anchor.dbc_proof { + DbcProof::Tapret(tapret) => AnchorSet::Tapret(Anchor::new(merkle_block, tapret)), + DbcProof::Opret(opret) => AnchorSet::Opret(Anchor::new(merkle_block, opret)), + }; + let witness = SealWitness { + public: pub_witness.clone(), + anchors, + }; + self.consume_witness(witness)?; Ok(()) } diff --git a/src/persistence/state.rs b/src/persistence/state.rs index 866b5fea..621ec2eb 100644 --- a/src/persistence/state.rs +++ b/src/persistence/state.rs @@ -189,31 +189,29 @@ impl State

{ .zip(iter::repeat(false)) .collect::>(); let mut ordered_extensions = BTreeMap::new(); - for bundled_witness in consignment.bundled_witnesses() { - for bundle in bundled_witness.anchored_bundles.bundles() { - for transition in bundle.known_transitions.values() { - let witness_id = bundled_witness.pub_witness.to_witness_id(); - let witness_ord = resolver - .resolve_pub_witness_ord(witness_id) - .map_err(|e| StateError::Resolver(witness_id, e))?; - - state - .add_transition(transition, witness_id, witness_ord) - .map_err(StateError::WriteProvider)?; - for (id, used) in &mut extension_idx { - if *used { - continue; - } - for input in &transition.inputs { - if input.prev_out.op == *id { - *used = true; - if let Some((_, witness_ord2)) = ordered_extensions.get_mut(id) { - if *witness_ord2 < witness_ord { - *witness_ord2 = witness_ord; - } - } else { - ordered_extensions.insert(*id, (witness_id, witness_ord)); + for witness_bundle in consignment.bundled_witnesses() { + for transition in witness_bundle.bundle.known_transitions.values() { + let witness_id = witness_bundle.pub_witness.to_witness_id(); + let witness_ord = resolver + .resolve_pub_witness_ord(witness_id) + .map_err(|e| StateError::Resolver(witness_id, e))?; + + state + .add_transition(transition, witness_id, witness_ord) + .map_err(StateError::WriteProvider)?; + for (id, used) in &mut extension_idx { + if *used { + continue; + } + for input in &transition.inputs { + if input.prev_out.op == *id { + *used = true; + if let Some((_, witness_ord2)) = ordered_extensions.get_mut(id) { + if *witness_ord2 < witness_ord { + *witness_ord2 = witness_ord; } + } else { + ordered_extensions.insert(*id, (witness_id, witness_ord)); } } } diff --git a/src/persistence/stock.rs b/src/persistence/stock.rs index 4e48e5cb..3f2e1849 100644 --- a/src/persistence/stock.rs +++ b/src/persistence/stock.rs @@ -27,13 +27,13 @@ use std::fmt::Debug; use amplify::confinement::{Confined, U24}; use amplify::Wrapper; -use bp::dbc::Method; +use bp::dbc::{Anchor, Method}; use bp::seals::txout::CloseMethod; use bp::Vout; use chrono::Utc; use invoice::{Amount, Beneficiary, InvoiceState, NonFungible, RgbInvoice}; use nonasync::persistence::{CloneNoPersistence, PersistenceError, PersistenceProvider}; -use rgb::validation::{DbcProof, EAnchor, ResolveWitness, WitnessResolverError}; +use rgb::validation::{DbcProof, ResolveWitness, WitnessResolverError}; use rgb::{ validation, AssignmentType, BlindingFactor, BundleId, ContractId, DataState, GraphSeal, Identity, OpId, Operation, Opout, SchemaId, SecretSeal, Transition, TxoSeal, XChain, XOutpoint, @@ -49,17 +49,17 @@ use super::{ StateWriteProvider, StoreTransaction, }; use crate::containers::{ - AnchorSet, AnchoredBundles, Batch, BuilderSeal, BundledWitness, Consignment, ContainerVer, - ContentId, ContentRef, Contract, Fascia, Kit, SealWitness, SupplItem, SupplSub, Transfer, - TransitionDichotomy, TransitionInfo, TransitionInfoError, ValidConsignment, ValidContract, - ValidKit, ValidTransfer, VelocityHint, SUPPL_ANNOT_VELOCITY, + AnchorSet, Batch, BuilderSeal, Consignment, ContainerVer, ContentId, ContentRef, Contract, + Fascia, Kit, SealWitness, SupplItem, SupplSub, Transfer, TransitionDichotomy, TransitionInfo, + TransitionInfoError, ValidConsignment, ValidContract, ValidKit, ValidTransfer, VelocityHint, + WitnessBundle, SUPPL_ANNOT_VELOCITY, }; use crate::info::{ContractInfo, IfaceInfo, SchemaInfo}; use crate::interface::{ BuilderError, ContractBuilder, ContractIface, Iface, IfaceClass, IfaceId, IfaceRef, IfaceWrapper, TransitionBuilder, }; -use crate::{MergeRevealError, RevealError}; +use crate::{BundleExt, MergeRevealError, RevealError}; pub type ContractAssignments = HashMap>; @@ -745,7 +745,7 @@ impl Stock { opouts.extend(self.index.opouts_by_terminals(secret_seal.into_iter())?); // 1.3. Collect all state transitions assigning state to the provided outpoints - let mut bundled_witnesses = BTreeMap::::new(); + let mut witness_bundles = BTreeMap::::new(); let mut transitions = BTreeMap::::new(); let mut terminals = BTreeMap::>::new(); for opout in opouts { @@ -768,8 +768,8 @@ impl Stock { } } - if let Entry::Vacant(entry) = bundled_witnesses.entry(bundle_id) { - let bw = self.bundled_witness(bundle_id)?; + if let Entry::Vacant(entry) = witness_bundles.entry(bundle_id) { + let bw = self.witness_bundle(bundle_id)?; entry.insert(bw); } } @@ -787,10 +787,10 @@ impl Stock { ids.extend(transition.inputs().iter().map(|input| input.prev_out.op)); transitions.insert(id, transition.clone()); let bundle_id = self.index.bundle_id_for_op(transition.id())?; - bundled_witnesses + witness_bundles .entry(bundle_id) - .or_insert(self.bundled_witness(bundle_id)?.clone()) - .anchored_bundles + .or_insert(self.witness_bundle(bundle_id)?.clone()) + .bundle .reveal_transition(transition.clone())?; } @@ -835,15 +835,15 @@ impl Stock { } let ifaces = Confined::from_checked(ifaces); - let mut bundles = BTreeMap::::new(); - for bw in bundled_witnesses.into_values() { - let witness_id = bw.witness_id(); + let mut bundles = BTreeMap::::new(); + for witness_bundle in witness_bundles.into_values() { + let witness_id = witness_bundle.witness_id(); match bundles.get_mut(&witness_id) { Some(prev) => { - *prev = prev.clone().merge_reveal(bw)?; + *prev = prev.clone().merge_reveal(witness_bundle)?; } None => { - bundles.insert(witness_id, bw); + bundles.insert(witness_id, witness_bundle); } } } @@ -1340,28 +1340,28 @@ impl Stock { .ok_or(ConsignError::Concealed(bundle_id, opid).into()) } - fn bundled_witness(&self, bundle_id: BundleId) -> Result> { + fn witness_bundle(&self, bundle_id: BundleId) -> Result> { let (witness_ids, contract_id) = self.index.bundle_info(bundle_id)?; let bundle = self.stash.bundle(bundle_id)?.clone(); let witness_id = self.state.select_valid_witness(witness_ids)?; let witness = self.stash.witness(witness_id)?; - let anchor = witness.anchors.clone(); - let (tapret, opret) = match anchor { - AnchorSet::Tapret(tapret) => (Some(tapret), None), - AnchorSet::Opret(opret) => (None, Some(opret)), - AnchorSet::Double { tapret, opret } => (Some(tapret), Some(opret)), - }; - let Ok(tapret) = tapret.map(|a| a.to_merkle_proof(contract_id)).transpose() else { - return Err(StashInconsistency::WitnessMissesContract( - witness_id, - bundle_id, - contract_id, + let (merkle_block, dbc) = match (bundle.close_method, &witness.anchors) { + ( CloseMethod::TapretFirst, - ) - .into()); + AnchorSet::Tapret(tapret) | AnchorSet::Double { tapret, .. }, + ) => (&tapret.mpc_proof, DbcProof::Tapret(tapret.dbc_proof.clone())), + ( + CloseMethod::OpretFirst, + AnchorSet::Opret(opret) | AnchorSet::Double { opret, .. }, + ) => (&opret.mpc_proof, DbcProof::Opret(opret.dbc_proof)), + _ => { + return Err( + StashInconsistency::BundleMissedInAnchors(bundle_id, contract_id).into() + ); + } }; - let Ok(opret) = opret.map(|a| a.to_merkle_proof(contract_id)).transpose() else { + let Ok(mpc_proof) = merkle_block.to_merkle_proof(contract_id.into()) else { return Err(StashInconsistency::WitnessMissesContract( witness_id, bundle_id, @@ -1370,33 +1370,14 @@ impl Stock { ) .into()); }; - let anchored_bundles = match (opret, tapret) { - (Some(opret), Some(tapret)) => AnchoredBundles::Double { - tapret_anchor: tapret, - tapret_bundle: bundle.clone(), - opret_anchor: opret, - opret_bundle: bundle, - }, - (Some(opret), None) => AnchoredBundles::with( - EAnchor::new(opret.mpc_proof, DbcProof::Opret(opret.dbc_proof)), - bundle, - ), - (None, Some(tapret)) => AnchoredBundles::with( - EAnchor::new(tapret.mpc_proof, DbcProof::Tapret(tapret.dbc_proof)), - bundle, - ), - (None, None) => { - return Err( - StashInconsistency::BundleMissedInAnchors(bundle_id, contract_id).into() - ); - } - }; + let anchor = Anchor::new(mpc_proof, dbc); // TODO: Conceal all transitions except the one we need - Ok(BundledWitness { + Ok(WitnessBundle { pub_witness: witness.public.clone(), - anchored_bundles, + bundle, + anchor, }) } diff --git a/src/stl/stl.rs b/src/stl/stl.rs index f7a69de9..2aeb050b 100644 --- a/src/stl/stl.rs +++ b/src/stl/stl.rs @@ -41,7 +41,7 @@ use crate::LIB_NAME_RGB_STD; /// Strict types id for the library providing standard data types which may be /// used in RGB smart contracts. pub const LIB_ID_RGB_STORAGE: &str = - "stl:ZVab0Axk-3hHvPBw-PVgbKK9-OjbajRO-sbN53sE-De3$HdM#cabinet-emerald-brush"; + "stl:YBgLtVmT-FuzNBPe-1fxIqay-JW4Evd5-Za7fm9w-GLF6JAg#transit-xray-giraffe"; /// Strict types id for the library providing standard data types which may be /// used in RGB smart contracts. @@ -50,7 +50,7 @@ pub const LIB_ID_RGB_CONTRACT: &str = /// Strict types id for the library representing of RGB StdLib data types. pub const LIB_ID_RGB_STD: &str = - "stl:MRRNRLeI-muTBg22-pcaBEA2-MSllDDH-4RCDD6n-8ku826s#picnic-reverse-convert"; + "stl:H1HLPfyC-5YLlAk!-KWhcUo1-0vtex!9-ODxSmIA-zj1J$qc#western-craft-bogart"; fn _rgb_std_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB_STD), tiny_bset! { diff --git a/stl/RGBStd@0.11.0.sta b/stl/RGBStd@0.11.0.sta index b7f895c2..bec475b7 100644 --- a/stl/RGBStd@0.11.0.sta +++ b/stl/RGBStd@0.11.0.sta @@ -1,146 +1,153 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:MRRNRLeI-muTBg22-pcaBEA2-MSllDDH-4RCDD6n-8ku826s#picnic-reverse-convert +Id: stl:H1HLPfyC-5YLlAk!-KWhcUo1-0vtex!9-ODxSmIA-zj1J$qc#western-craft-bogart Name: RGBStd Dependencies: StrictTypes#century-comrade-chess, AluVM#congo-archive-folio, RGBCommit#tuna-safari-design, + RGBLogic#explain-marvin-bless, CommitVerify#miller-pancake-elastic, BPCore#totem-holiday-helena, Std#ralph-blue-lucky, Bitcoin#signal-color-cipher -Check-SHA256: 8573fb86e3882b8243b22936575e720c0a9e4c451e3de06ad373752732ffcdb0 +Check-SHA256: 04b8598c3e334bc5ad1ed6d7f4d5b7aaec4e86a6205329e4b40d3a089dbc918f -22w{tQ*>kpMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r3sZD*X=8L$d2nTOVsJHoA?4$swuZp1 +22w{tQ*>kqMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r3sZD*X=8L$d2nTOVsJHoA?4$swuZp1 Wc+9AOf`(TIbyKWjTy4WkGaM+1wm|eR!wBY)d@|xKsr716mTQmaB}ROZ@Dgs2ia_2=g^?i+KdTOM?yny -ZEb0EdIKHbX?@G`sCP;~6&DQwR5(-fxrUo0Th*%N~j&hfyEy&;~+KLvM0r$}AplgPGkh3_fq3Q7_j=2#kPT_9!;lWR>~GYywm#15DT%6aZ| -SrJerP1pIOD57`7Ol|-ogQ6Pjg~y>s-v>!^VNPLfWv4Jz0xkJm$nc4yMWR2J-cc#Q6SofWC)gp7L6!Sc -3I$AQVo7AP4Jk3r!|EoW{Zi$060oMN(jLzPuNboiNpoRSWoOdj7+WWC1?EKi+6QrwlvP$n -l8x-M691f9z+~t)>6ivgX<}1lX9hx0LvM0r3;+Rq2VDR_OBR)w8yCZ2EylR&t_^>1Sz?kFbz0>alMxYA -VQ_L~bWU$%Wl&*qbZ%vG54IneKN{_;j(f`H9IfkFzO$PGD6U0+e -W+%HuC5$^~^vuG3{`}-8x6fV={eh1!etXz_4^&}ra%FT-VRUFva&K>DF1HXRxo%|^+Itiop&gxXSvq){ -{YhrGf57_P)SQy*22EvjXm4aVKVmL%Q_{#Gkvz+H9iKg9-*)mSRaq_gMnjYqO>G4cRAF#(Wpq+$XJ~Xn -a$#;`XhtWfE>N`F8f<{_M@^MEhcVy#omh=bI-rl&{j_4Y)eb^zX>MdwWnpYocu;h5M^4XN(CAD)cag{3QuryWpq$-Z*OK=1Pb;^kcqrN>J=(17*>vH+sNfO>T@W!FHOn$!h0|r -L2hGcZ*om#a%*g5P;zf?W>jHta%FT-a&K>DXc_Cg)w39@m$R6qOEzWQ+NTC@=;0W(Wpq$- -Z*OL>#&NEOd)wn+n#11fGQ~$X901P7x>0daZB@{PThHqaLTqVnWK(5fY*ct@WU=KqITQ*wzVL4v&%PXB -rElTk^nG{;D0#op`qL00-33&5P;_z!LTPkkZ)t86009|og(=AP+C)tiPK}(5y`B$^i2_%$n#j0HLDJN5-IKgM_J7b(p -+0MPGk2Gl)y2(Rz1Xgc#bS10xxe^o?x}!PNUwajGr*TW+dUY6G&@nZ7)X6RBh6__;a%pgMLV0v$b1}QF -=!A)P#jpo4axu-4_As_7EzOC4+`8Vyy2R;!*$Y%*a87SzWk_LjXf@g$6*(YoyWQNR!##&F>hhbX+H~JN -$bujoP8PMf90*KrV{24tZDlxh1hGqe4n}Q9o)<@bBy=Qy_yc6@Jxi+hIw1E!bZZGyX=hVoa%pgMU#!_} -aHwX>fFqJ7jQqgpV60Q!3=n#-@oxpi@}5@PW%F -v%B~$o;&jeRCrHybeHwl212eXGm<4cs7@Wu#FOK{KGSirhjWHCPRxjcYXnnabaS0mldQV=&ET6jM)-pX -anm@-FK%_beB&TRo~t++rXB}ZX>@L7b91ADLi5Yl(a@n1+Ku60FILp}Zw|!7cE!MGSxid=WmW`Kcxhy) -e8zcXXXRJdMCHk1I^Yb;mDw5%F9Y9nz;zN&zQ>*gRCrcpa;b%ccT=8d`>?<6$C@F;S3|*6`1-v+nBdcq -J?FPKcnV2wbY*gGVQf%qwlfK-7{9iX4Q|L-q$GzUMp|h#f#zWg5iW~CYZ -WKwE66NffESNf -Jhg}MqX$BHbY)X?a>aWgn!oosZgNI|twmNZeC(lYZa*g7-2eQ3Yy;-pL;_TJ=xRXCTqXIv;)MTcr4cfx -K`S9uy$)6q!N22#m0-mN2v2o%aBpdDbo`>HD!!5a&4Q@0n2=*4!cKOosx|T?(Q^f3pcpQQSqE58Zfto_ -YYangZEb0ER%LQ&W_bnxIG#g>Clv)aMjKgwAH@`bu1x<7g|G$};xvA~n-$_S3Qc8lYiwmmVRLAO(LK3V -&vL%&i(~ao9rExlGMgPx_&tqtqVlwo1}@PHO=WUxY-Lb#Z*OLk_h5K%L=laq&yA1JoJ^{7>oKLkF4~ia -x8KK|47hp@Qe|^xa&~28LV0v$b1}=fEj#9D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RawDWpib6c4cHj -d30rSGVkgW4+YqPF=12xaaxrgbrDxyH3 -;v2Uql0Ev@(iYu*+LHGLwE58<4pL=vWpZ|9WI}m#Wpg+QQb$5VZ*6U9bVL9HXadZr-SrVPj}hbYXO53d8myhCQ`lg6^O$ -%||qOV+j>$8ES^HwOl>wiJj|%qbz^!%<&Wu0B;Hj -DvS(4Y;;Uvd1Z1jQ)P4|MRdNwxo;muVif;}u9xW_W$|0g2|;snWpq?wXLByHrT!PdFhnqz;9Q#@6CZd7@2Wj4Vyq57bK6Q|uUfIMEX^1}Vv -6tLB!)|10-o)0prc?(ZtV|8+JWo~0-b2%sT-%4v&H)ISe_*f>my4uKhF4_isHhdU7d+OQBHXT88b7^O8 -R&Qx!Q*>c;WkPIeZe&wsVQf@*P;_!Rdtiph_du_cl6_7Jvu!-2h2yT^5yv>ite$I%(jAWmQ)6glZDB$% -VTFju)T!QU9%?YlaQ5q6ZWn^V?b7gKrZ*6U9bZupB -bV_J?2aq_tRM}}HLZewL(Y-MCdb#7;AVr*qo5zRxYEK#t?kH-RP -fvS1oe0PQO`VOrdl$-fvv-}wmM{I9mVQf=$VRU6vV`ybH#U?!sMn!cn1rJOp86F!RcRbeRGsJ -1UmYZ%?U+#bY*UHX>V>*&}~*ityEj;Hyocxfnzce^Cdq=fPoq&^ymh3l$uK+L349yXKqquc4c8~Wn@8g -bYWv?LTqVnWK(5fY*ct@WLj@&vn9UYMO^sD;_GhXtp2ftG%R;OfdN~vO`zH70vS|!aAjmcb8~5DZgWCx -X>MdwWnpYocxhx>k8=qnO(R<<%JIK<1B78x*e6}1oxDzJ3ElvocGBq|L349yXKqquc4c8~Wn@HQbYVhl -X>MdwWnpYocxhx|>KFFSbgda38zdDXQo#`G_01v*0&52ohA -EX3$~{+&W0M0{2&GbCtpecGzFNi4 -r|Jm}LvL@6CZc}4uWo==5vNdf$cEfHQ12?LRftc&;5JY%0 -?GSH0jXJ{5?wvjwRC#b^WI=OtX=iS8LTqVnWK(5fY*ctqbaH_n=a&wUzgWZ$SVL%GX>LMnX>MdwWnpYocxhyWaSf9!PV~dK2uo>;u!nFdemP_$e?^hl+JkM;eY!XZL3DIs -V`xcag}C@DyY!@{4YR*LMYs=?Zg_*ktx|21^lzg9sBTBv4nk~cZe(e0XGURTbZ>Hp{^Dg=h-~N_zJ`Re -d1EINWrM}GXaQb}6c#qIM2EQ!L349yXKrm}Zgf<6aAl9X!sthuPUKDEU2%WC`V+X+(UG)mk--2W1{>ju -aWxcJLug@XZbEEnZe&wsVQf@*P;_#W5WIk~G+K)5%bR49t5yk`^qQ9iPjGK_bd$i8 -ToRU7hj7c;WkPIeZe&wsVQf@*X=IdA)7t~9 -tEf?*r}jS36zkMYeK9}${s8)2BzjZ?kPrw{V`yb-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b3PW#hbaG*1bV+2Uj4+W$OUgRJVvNU? -M2#%ns>Kwa1v8ba_B>T#2Nxy{Ms;pyX<}?;Q*>c;WvQZiSChz_$|Xx}eRkFNAr%^eLl(1e@}~9=0-ijX -fCfo!aCLNZsbs~EXcCXx(drQcb3B`Fx -$)^%va$Ar)C7cLJWMyu2X>@tWYl3?VT7AZm1SE3hA}5c~&&3*7XrN0!sxd$tJbohyL2PtPVR>b8G0Bgb -slx_K8vXre8<)H){QgX6j~{c$E$eY_=V_ZFuLwbNb7gc?VQ1BiUkD7Ff~JZGMgrhZ&rP2gYrktY!x$bp -v=qCl=HdlOZg6#U)$WoGNrC1dS{r3#^{o?N>fE3RH4oZgXjLX>V@Uyfd-Ec2fx7@|$_F!~L1|Gb|wN=sA3I -JoWVpSnQb8~5DZc=4-WnpY(WL9Bp -b!9?qX>MdwWnpYocu;h5+lpEmf)o&SDDwD>KtpQ8M_qJyiO1VIUJ=H=)@ii_5LiQKVQFqtWn*$>bW>$v -Y~6)s0B>Pr5ftu@@z<*O39}j`u&O7io3b$Is?RA$O$kloIF_owDud_0- -=Ov5&mq(eSq^TM>JW4?*h+3X!X@fjr@d0IimUQ-Q4pL=yWnpY(WI=RvVPk0QvgUTbnZZteO3IOg0+3WD --We)Tm9OC!w7#?l6>IJVg&1PPwC}G3`TWsXK7+=WmI`^W&AWn-CxfQ3;(PYqMdwWnpYocxhwkq04IdejB5_YJg;9E|1`d*r&;qSS3+uh`0YNLave-Im|1Bk8zGh-IHIi*o-3_)ygXkkNPaC1&|ZI#2l$xQ-a`EhCyJoZT~T}~sIjxz)> -1`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4LvR$+2!VQzFzVQpm_v{(W1V6JV*{3!yZ -{M3XW@z+pX9JtzktHWiJ@1L)babHELfN$u@7k>`Uy~S -X>DnAX?A5X{h;vIo29B#Zbv)THgnzJqzni;K&ISmvL -d)pN>Rl&wr9&I-v?L-&~MrmbiWK(5rNn}$N2!s^Lf^?|9I@Xg>Oi(W05|TJ%PM*ricn_PmXk-Xfd2nS; -VQpn(jMNXXYlf+hXQ9AJ%?72#_KJ5v@E-96x!ZDnLeX=Q9=b5mt)Nn~pTqZFQ|l>ioJ -pYH;+t0eX2w~A!Q+0eaZ{MVycPK^aqWo=1heaS*6)M5bHCYFUH@63IY`6K;Dlo$g{Z6f4)7N~Yk2UcNn -X<=@3fzvD`*Td*C*~4P}$n=kpoj->tyfRKrOAiJKV)22*KzX>Mnd(*pTEa(nZJgZT^?2ML$C)mClK -yTm8WaJ}8CMy}crPGN0jWJYOaY-Dp&Wo=1hmm!0y(Hu`f(Fijc5*b_M4dVsY!8b|ZDhq!3`K5r -ZB}7&X<=@3bC}8#qjhfwd&>tyAtR<)2LcK~xyL-@iqBUFK20Q^G*lRL(MHiY2Qv~?ZfS3BR$+2!VQzGDQ)O*QWc`7zgMJGKo2X9f$RZe%hHN@6KPlLd+s#TneAz-EYx3vY08WpqJqV`y)30;XBAP%ncq -!=bH)!l@Cw+&ABgf({>*%N~j&hfyEy&}imnMuA$i)CT)VRl_H$EZfI^CwqAYJB+ZKALhJOg5MR2m;D19&dx0-7pM3Z=O*v*GCA9fL-<|HrZsA`NnJlR3~_8 -cxJL|x?WKK>7x;m>=zTw_)c;WdYt27n9%urmoacppk`X2UT2wpUNE;^#pc9YB4Z1sCou) -bz*F3V*<)79&dx0-7pM3Z=O*v*GCA9fL-<|HrZsA`NnJlR3~AEBGG%U@MZ$v=XJ?|;InIPy66cFfOYp# -JM2r7_Du+KWpQ~GYywm#VTK~nd#>@L7b8`Y@#MKE+xj;HS -^AvC+-Eea3oo~4=i3iziU+2)E(%OuwwrKJIUBJXnP(l%Y$cDDuY1Bm#?@QxYCjWldxIc>zVQyn+Z*pa1 -LUnFrY-Mu+d+jl3|D);@V7C$4*bFjWhK+|UDg@^cdz>%jYWd}N5JPWnb7^O8ZDnqBW?^h|Wd;ogc4cyN +ZEb0EZYmQ7jMFx!r5s@rJ-O*H1;I5Y*Jq{lbOS_Kbz-c)2vSEvOmAmtV|oJ}-)Viz@~C%8KNS}Z0aQ3s +^SOqbBwN-D{wl@OCJaMwZEb0ER%LQ&W_hMrvQRIBF~gy)hQg^4yxce6i-HaxmCGKABZpBR?$8E8P(yEW +Wy&lbZ-bfLFbqC#o>4E?M+l67UG^w8*<_XZ#%uyqCj(P-Wc6$lVk7oBr%DNv+($;q`HHK!gIHa)*%m(- +e#9sm3I{@IbYpL6ZU_ZIY;{&m1^^NSr?vtRe2PRb^)}W8ZdqCQlr&gKJ5X<}{fp(f$H +b>aU=OZ$bvG|>z)+>9PT;Au-7)~D;-++hbyX<}1pbY+s|KgxOTbXgHlB~91)qbQqD?1jgn +N8blYb74+lZDpr0RRS&fT*&Z=qeY@Wmfle*z!SF)@h8|JkU^FEQwjx4X<|uavkfUR&BN*@p#4(ibP}+p +taQ)Oq;;uu>eaRuf?``QO_k(5tm>UaGoca9LuK7Ij+X8IutaRAF#(Wpqw&WMxoca&&HGau2p2m_Hir +tB!lh<{Yi-S-!KI0_27BH<@sVme~^s3=33YaB^jIP;zf?W)s9yQf4Q+L?w(nXY|a%e*XOAC%4aD5B-6U +FMfO2d=FG%aB^jIP+@dvP;zf?W-hl7CAn^87TS9h9ibhaZ&^Bcn*B*;w|~I;-PD|t>jq6_bZBp6I6q=8 +aZ}RBA(1@GcO9QSWZ!o3C{DXc_Cg)w39@m$R6qOEzWQ+NTC@=;{OM>iY* +&c?b?aZznm(1lyi>kUF|X>MdwWnpYocxhy@ZeT05|jA;vvYupWm6Q)O{ZZweWZ*HiKem1Z9kJM|+< +C6E3~$lVDiq#NV}y^f+rssvPcNp2zIK10Q-T=FR=Q=>S+XYD&bY*ifyRPVjiFd`Y2QhLn&64&owka*miGSR> +-o?7a>3`V^RAF#VZ)9aiVRL9T+8q@+Aa1+e+@!-jhcW8%o2S}z-#y5JARJB>wYeM!OmAarRB3HxICTWE +OMDJSZAYFLM|~u8B!Bn=Wb8dls`ok|_d#@P2~%ljQ)6;zaCBd+*=^-NPQ?`2v5jYd+6t@dEhY>7H!Y*U +dZb-BpG^u(WnpGhV{&P5bdWn_aCwA}8zxgKpy7|rEn>a@Jg9&ldILR+=b-aAzAVr?5I2ooM2Ulry +Ze??Gqk=;7%h%D+p%U7S;b1RT)c9`>#Kd;Rz-U=aO9W+B1XOrwWTLLzo&{8RR%LRjg@kugo@o29zwXDHA;ech!BqJAy+4@X(~&*rw>NkSNp5sya&BR4P;0g`38@&r +wvr8Q$XKK#ha*N>X+Ls92fzOv*E(~7PRR#MWnpGkWpcj!9{gsd8U18ZYC02#KAOx^Y=h@ +bX*KmV{&P5bWn9-Yh`)Fa%+!|DA9Vsm&hHC4WXN2M4aZ(WL^Hp>3BS~hw-BaLV0v$Q*?60dm);?_c?BI +Mu4qFRxf<)p=@qHCf(fs{C;c$=G;UARCwrWK+Rkw`Mu(V|7oQWGN(Z+AyvH&RuaL#N4?X)a%pCH1^_soLxv|6 +1vo|i^jdP;% +w2}rc(F;vwa%*g5P;zf?W|Q||cyL4!ji%3ykIJtwI*nu%&Q~z;Vl^%5w +S6(#;{6ajG64wDPk{-(rQe|^xa&~28LV0v$b2R>f7D?ZDzCQez5c=X9w<(f6`q$DH-G17V_XV{1(H;&` +Wpib6c4cHjd30rSI0;fmLPKwDZE18w00U?O%&6V>N}#h955#ht!=;R2Lj=uo+MI7C_W0!u+z&-~bY*UH +X>V>*V`yb|`fdzI +Y;R&=Y*t}xb!BrDB|MH$#iox7(epK^GJZz3uq*Cb2l>R6Lh9EroO>_{O=WapR$**)WfhrcWXrXyKnGOw +A#t$mH2bG7pQ)aE=^FQF!@KkQhzLn;aCLM|VQ?5o)zidWvABmX&uCxQ{9vUAsn@)h(<^=)@3p(i4FwHH +Wo~72X>(I!Xk~3-Bv(?{Wq|OU%4#DwR1!oWV0@!2f9}lj6c7M!3JEHV3_)ykOksItaxqh7bR|V}zQMU~ +Cv3(oCX8r!*SiR9zOp;)>$$b(q=dpw@(@pVZe?UsbYXO5Q)6glZDA=T4hF%Q&3qd{UvF)tP|M@Vc@bh1 +|A(%Z=^thBTg(YTb8}^MRAFaxF0!Tm7r-z?Fqq(6n;Tke)*kJ44PoBPfF{#q^A_Q|307}uWK(oubY(K0 +R#67|O%*Grnxkw0HI;&$`LH+T3zWkAaKFZV1ceDiVRT_rbYXO5G*S<)6P6lYy(#<=BR_>s@(?%#f7ArN +-=Rj?7Ns(14peesZgXjLX>V>+d2nSm!8D=zpn(&o-7tVWUa<1Q{n`|;)uYyv!)~4rGOBqCPh(?sa&l#E +V`XzWC-dJ*Ygad93@i9pCb+uV$agN<27ESr7(9FG*~&H@L349yXKq$+X=GD$VRU6eY-w&}Q)OXnRCrKy +ayffohRF9oualB}P71SaJfwx=uHX^JIK`}x&T2C;PAKlCCveQ{N4udSh#@3Dqj&&J9b8~5DZf#|5baO&% +X>MdwWnpYocu;h5M(yUq2ps*m=2xUDT;RqCgn#@WzFu~@adfH5^@&-|3szxlWo~16RC#b^NWB_v7yE`g +7JPmsUNvXifRDiWpZ<6ZbNTvZE19EWo~pzXnF^bIJ{KZXc;Wm98lWo=MdwWnpYocxhx>Z)vk7 +zTZV$_{ZYwZsV-}v4k`%cR+ywTd+-_+35lqRC#b^WI=OtX=iS8LTqVnWK(5fY*ct@WLl4N2_;P0H1c!=^sIJb7^O8Qe}2!VQgh&L}7GcLTqVnWK(5fY*ct@WMS$T_RVyy866uW +6(UoUJMwlSx^W#RES3wGAo{t~Y8XLtb7^O8ZDnqBb3$xsZe&wsVQf@*X=G$|9zv-Vp*%wog4O?q)g04A +aHEjnO6;Ie%sNwVNZt)acywiMb7^mGRC#b^ZA8ZOFKPukLlqCE=E5w*=z8TWl=ueJ45i$M_H~V*5K?7! +WnpY(WJYyvXK7+=WpE8;5VC@SZy&ckV>*V`yb+BFjcr)z~Z#|7V!q4uVJ{nYcaAjmcb8~5D +ZgWCxX>MdwWnpYocu;h5fgb0V4v@cHO73HjlbgFm42mCs2<+~e+;O=m63^mMAVG6;X=iRyWp-s@Y-MCb +VRT_aY-w&}Q)OXnRCrKya)JyEuWS7@0e2{bYWv?No0k%_$#~gq^1qCzduE|50q|r +gTt*-ZIkqGqXDRHN7@cTY-w&}X>MmmVPkY}a)xYW^+v~7{W03rq(;firJ6j(!OVQFqcY-w&}Q)OXnRCrKy +a+46efUz`Mi!Z}iQtl5;XwV(E`Zdd&WRj~^37YhpmjzF7Z*_E&z?57PmRE;x*JyQZ??N1%-?X%h&UrKU%$CX5lEZwTb6rTk%m8vvBgJ_74J{Jehz7Np5g;baSek)I|~ROXFB3|9;oFKZ_7pLug@XZcue%S7~%^Wpi_{jhE2@R4ADY@XOb3WHJm&VktwD1&R~J8Qi15 +W{8UrRB~Z%b7^#GZ*D?$Ze(m_w&;L{94K`ndk%K5+?9Jv$dw7jc}U5p5@2#$kUJ%u2uWmRZggpMdB|&m +dkb29#*qXha^)f?kI>J>8dqqbOFybHKpQ-MBMCulbWCA+WpXjekD95&21^?K{bw7Oyej@6CZq~drvB7pz2;cIXd9lO&nf5a*AnfQld~-bdb4MdwWnpYocu;h5+M7`mSQb`xkca!3_>4e9YQ#rfba;u!+d5tm#=h2RwFD4YLug@XZc}Ara%FT=WnpaHg=PS6VPp{$?vC--s`v@B8YHl) +C#jpVFzBk!DMw8SR$**qZewX>bKWD7Yo@G%*b#-tU^&3KX?w7l?~*Sh8@1jRRblZzybDKcZ(?C=Q*>c; +W#7-Kk@bh=O+>c=6Nvv2!%yAASLvLGVedrqOkAVG6;X=iRyWp-s@Y-MCtVQh6}LTqVnWK(5fY*ct@WC&76LQHRGX=4EZ +4!$0V0pzZFIpSn)xsYw`yZK|qY&x6i)e}5MB-6;q2t;CIP;zf?W&=}nWC#E!gwc#^4#qsMUl{*1zNe>I +^CwqAYJB+ZKALhJOg5MaL2PhnVMAeXb4b1;7b@t4MVjY>G@u4Q3HlB(d+LiLJm-R=h;`?dxDG*cV`*tn +a%paKVPb4$VTK~nd#>@6JWikDr@YkEAs#9)9JJvRH-Qc7Q2s%Kf+=VCy +OABEU3kOtrQ)O*QWJFFoaz*WZZ5##rf6bm&7qffY6*N`B##bI~HzDmr7z##dWo%?qWo=1hQx*t>6v={g +sJ=SZlTl1iF5eQ8IAl(q%E@>So406W2vm7+WlmvjWn_%h53p;7sgGx&z)8&prN#D&cR=tS@df05SQ3Z* +PZCvbZeeX@WJYOaY-Dp&Wo=1hYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj1yf~hNo0M=LMPN> +0NEy%g(UCHeUkYj{YR7-159lqXIqm$}teZO^;JC(UrZ-Ks{e+7M1*ZDnLeX=Q9=b5mt)No1EHgR0RS +PeIWLGZ_*YTjUMn3>33lep74@i%V@}#Ze4JZgp)|VRC6;+#Z*Ep$ +a%o|1baPW>ZAoPPfv$so3kRF1PV2}fOp_vjQ6FdFHId|V>$VQpmv0RRO80?I5NZ-bfLFbqC#o>4E?M+l67UG^w8*<_XZ#%uyqCnto_jB5_YJg;9E|1`d*r&;qS +S3+uh`0YNLave-Im;eX@$}AplgPGkh3_fq3Q7_j=2#kPT_9!;lWR>~GYywm#cxiZMvTM3tQ2*(p5s~Z{ +6V3QiK&W#-F~+s6raGiL0000000000{r~^~000003qfvfZ**aFX>V?G1pxpG0WnM89|TAhYfrNblQVQ` +LpZXKteHopy#|_NJkG`K5da7P06+i$00000009600000000000000000093000000000X?b8~5DZb@cg +V`T;e3U7CAWn@!yVRU5y-Vzs+-~y(u)KQ?3g=q&>T!Ej;9TxQjc0+10Fg2)p25@y^Y-wWx$}AplgPGkh +3_fq3Q7_j=2#kPT_9!;lWR>~GYywm#VTK~nd#>C +WCF@89&dx0-7pM3Z=O*v*GCA9fL-<|HrZsA`NnJlR3~AEBGG%U@MZ$v=XJ?|;InIPy66cFfOYp#JM2r7 +_Du+Fb!>ELaBO7)$}AplgPGkh3_fq3Q7_j=2#kPT_9!;lWR>~GYywm#VTK~nd#>V=;l-_zLn%tmAe68Jly{Qj?Kss0ny)C8x +zFm#1PkyMk2y}8`ZgXa3astXM9&dx0-7pM3Z=O*v*GCA9fL-<|HrZsA`NnJlR3~AEBGG%U@MZ$v=XJ?| +;InIPy66cFfOYp#JM2r7_DuKtpQ8M_qJyiO1VIUJ=H=)@ii_0000000000|Nj60000002WMq&WpinB0%XM12~D{` +Iz96ga3kGta_pUNxh{zZ*=%3u(4f-VjO?=JcE6dyPJT+tk%Iz|R3_dTDo~ZL;TN>NvV?G00{zQ#MKE+xj;HS^AvC+-Eea3oo~4=i3iziU+2)E(%Otur}OFoDdEE8rbT!M3y4gMJ*2_uUvGVL +lsE)B`jpK80000000030|Ns9000007Vs&n0Y-Mu*2?0Hl)<>d4I}(*_lNXA@iYQk^RnB@|WjyHfhANam +kKF(O0000000960|Nj60000JaV`ybV!Z000000RI300000001I<Z4!V +_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HLtfv$so3kRF1PV2}fOp_vjQ6FdFHId|lr&gK9B000000000400000000YNbaY{3Xl-R~baMa-0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u +(4f-VjD&FwlPpg3!?y@aX^XIja4CK{WF&t@k=WXUZP9(YH~bairNa{vkf;?xyT5z&Ua+M@}mOiDpYxh>^^GknUxTJ!XL#OUcE0frb5ENEw7 +&f?o%+)B!ZpG}K!%4G?I4vp$|ttu*CMF0Q*000000RI300000001rcNZgXj8Zf#|5baZlcWd;ogc4cyN X>V=;l-_zLn%tmAe68Jly{Qj?Kss0ny)C8xzFm#1PkyMk2y}8`ZgXa3astXM9&dx0-7pM3Z=O*v*GCA9 fL-<|HrZsA`NnJlR3~AEBGG%U@MZ$v=XJ?|;InIPy66cFfOYp#JM2r7_DuKtpQ8M_qJyiO1VIUJ=H=)@ii_00000 00000|Nj60000002WMq&WpinB0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-VjO?=JcE6dyPJT+t k%Iz|R3_dTDo~ZL;TN>NvV?G00{zQ#MKE+xj;HS^AvC+-Eea3oo~4=i3iziU+2)E -(%Otur}OFoDdEE8rbT!M3y4gMJ*2_uUvGVLlsE)B`jpK80000000030|Ns9000007Vs&n0Y-Mu*2?0Lx -!pKAp1!W`z8&dG}o0YntKTOs)s%d4I}(*_lNXA@iYQk^RnB@|WjyHfhANamkKF(O0000000960|Nj60000JaV`ybV!Z000000RI300000001I<bairNa{vkf;?xyT5z&Ua+M@}m OiDpYxh>^^GknUxTJ!XL#OUcE0frb5ENEw7&f?o%+)B!ZpG}K!%4G?I4vp$|ttu*CMF0Q*000000RI30 -0000001rcNZgXj8Zf#|5baZlcWd;ogc4cyNX>V=;l-_zLn%tmAe68Jly{Qj?Kss0ny)C8xzFm#1PkyMk -2y}8`ZgXa3astXM9&dx0-7pM3Z=O*v*GCA9fL-<|HrZsA`NnJlR3~AEBGG%U@MZ$v=XJ?|;InIPy66cF -fOYp#JM2r7_DuKtpQ8M_qJyiO1VIUJ=H=)@ii_0000000000|Nj60000002WMq&WpinB0%XM12~D{`Iz96ga3kGt -a_pUNxh{zZ*=%3u(4f-VjO?=JcE6dyPJT+tk%Iz|R3_dTDo~ZL;TN>NvV?G00{zQ -#MKE+xj;HS^AvC+-Eea3oo~4=i3iziU+2)E(%Otur}OFoDdEE8rbT!M3y4gMJ*2_uUvGVLlsE)B`jpK8 -0000000030|Ns9000007Vs&n0Y-Mu*2?0Lx!pKAp1!W`z8&dG}o0YntKTOs)s%V!Z000000RI300000001I<Z4!V_T!KNI`QJ| -h6;Zj^jB$MPK+?7Lu3>C`4HLtfv$so3kRF1PV2}fOp_vjQ6FdFHId|lr&gK9B -000000000400000000YNbaY{3Xl-R~baMa-0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-VjD&Fw -lPpg3!?y@aX^XIja4CK{WF&t@k=WXUZP9(YH~bairNa{vkf;?xyT5z&Ua+M@}mOiDpYxh>^^GknUxTJ!XL#OUcE0frb5ENEw7&f?o%+)B!Z -pG}K!%4G?I4vp$|ttu*CMF0Q*000000RI300000001QKKZggR3Ze?;-WpV=n0(LS22}5sgbY*UINn`{C -00whoXk~3-00jX8WW?18O}RiiJ@XWBBi(Rv?4579E{O-(Y+vWlpwilmlv2~%1FNg3QJ<&wKF}2F)J=Uc -Km7gx`duV?R0NO^0S9MgZe??6a{vVa0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-VjGqWBNjk^^ -qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G6Dr@W?^Gx00jX7JIcU;0|?p#+${p -KVqYC0|{wnVPj=UZE$P=1pxt8$PakD#zGc4+eY|aXXwx;YM0QXyiqR;Jsw2Z*{J&j1#@+9aBKht0Rd++ -hrkGM>lK-W|y2ahx3nF|Vuawki#7NH?S|Q-Q -!u2{b0tIPiVPjm(ZiUQ7;QU9z@vLsQU{;Z*FvDZgf*=XLAJs015(R#MKE+xj;HS^AvC+-Eea3 -oo~4=i3iziU+2)E(%Ou+=zxYCD0L!x4tB5Hm3vFbl?lapNXe%XU~*fKJ0+X}A;%YO&?-P3O4E?M+l67UG^w8*<_XZ -#%uyqCt-#n(R;4&W&+>mb;*F>vukd;=m`ygb@x#_>`RmOO$cpebYWy+bYTDq0!8YhU)%QMkO4aJ;_ZeC -e;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~asU7T000000RI3000000 -00(DmZ(?C=a{vkgMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r8?;yf@?frQ$owe+rTo-{AMw{v -gzX#P!9p!}0yp?_0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-Vj5fhEq57bK6Q|uUfIMEX^1}Vv -6tLB!)|10-o)0prc>n+a000000RI300000001IJrb7^O8ZDnqBa{vkgMe3tp+xFv-0Xp&G?S=|}9rRae -U`~uMrbA>C`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_0%XM12~D{`Iz96ga3kGta_pUN -xh{zZ*=%3u(4f-Vj5fhEq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a000000RI300000000(kq -WMyS-a{vhfMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P -!9p!}0yp?_0000000000{{R300000033g#@Wo~0>Wpe-t0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If -6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~asU7T000000RI300000000w1pa&K~T00{y` ->Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI&hQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Lk -0000000030000000000HWMyVyb!>D&b8~5DZf#|5bN~bb00eGtZe;)f009JZZ*64&1pxv@>Z4!V_T!KN -I`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pZODNcTE%yi#yB_`&o2yJC_VPs)+VE_pNMe3tp -+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_00000 -00000{{R30000002WM<=Vqt7^015&{>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV* -{3!yZ{M3XW@z+pGEG0000000000{{R30000003t@9}X=iS2Wo~qH015&{>Z4!V_T!KN -I`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pGEG0000000000 -{{R300000033g#@Wo~0>Wpe-t0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs7 -0;T-agdg$OP=xIp;K4#IcLF!~asU7T000000RI300000000w1pa&K~T00{y`>Z4!V_T!KNI`QJ|h6;Zj -^jB$MPK+?7Lu3>C`4HI&hQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Lk0000000030000000000B -M{I9mVQfieVPjM0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_ -Fs4If6Z`oP*=q!&6rQG)02XJT?*g=|B=zREie$*y(7k2+*P~cYjRuJC38-{*D7fZ(%hZo23R4S;p`Q9JBQllDyrZFOvPX>e?10?I5N -Z-bfLFbqC#o>4E?M+l67UG^w8*<_XZ#%uyqCt-#n(R;4&W&+>mb;*F>vukd;=m`ygb@x#_>`RmOO$AA2 -VPjC`}q*rQx*t>6v={gsJ=SZlTl1iF5eQ8IAl(q%E@>So406W2x)F;WpZhBa{ved -JIcU;0|?p#+${pKVqYC0000000000{{R300000033O>~Wpi|4ZEyepNC<6Z -bYWy+bYTDr0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp -;K4#IcLF!~asox_qhH(hioJpYH;+t0eX2w~A!Q -+0eaZ{MVycPK^Kn000000093000000000YTY;R&=Y*Tb$bY%bv0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_ -Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~askQ+=8&Hpw3LVJZG0TWlikxJMmHED -Qne=0G(X}F$%Fs^000000093000000000YNb8~5DZf#|5baMa-0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_ -Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~asf-J$cU-b<11?Ur~I=y495{S&B3%8 -Yyg?DnxLGM`ZE9k000000093000000000SgVQgh?V`*h`015&{>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7 -Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pC`}q*r8?;yf@?frQ$owe+rTo-{ -AMw{vgzX#P!9p!}0yp?_0XGgC8a;P^F9!TQys`YZF3(w8EA1?b(;%Z(R5QEQf&c&j000000RI3000000 -019PzbY*UHX>V?G015&{>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW -@z+p&VRUJ4ZU6)V00eGtZe;)f009JZZ*64&1pxv@>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7 -Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pn8fQnYaJ?> -kL6XG(3esa0W5QyJn#ohg24a)000000093000000000YTY;R&=Y*Tb$bY%bu0daC2M$y&U#EU!@hie?U -NS!6hQhW-W8INxxf{Fuzg#Z8m000000RI300000001IJrb7^O8ZDnqBa{vhenIb5$QI^$V6PNW$vdMt6 -d#0>Rmk*`=dQ)K)k7d+w0000000000{{R300000033g#@Wo~0>Wpe-t0ak~ln%Z2n%R^9PBgQXo1&n-R -?HR4hpUd;mfGub-hyVZp000000RI300000001I?-VQzD2bZKvHa{vheI6k{n`X+XC81LasyqR+($`>jw -nD57lV5q8m)(2RS0000000000{{R30000003T1e7Wo~n6Z*Fq{2?1%uWwlwnKfCTqC!TnpV`xO%(e*mX -P$JGS1-q69d*1*6000000093000000000JMa&m8Sa{vhe!)N7;Jv;(oC!o$&iP#xB8s<*^%!GF?$0)U9 -@BFJ?0000000000{{R300000031nq0{baMa+0b@PW -iLgsaRw~c9&Ny{YCK_TCaeS`x+X~XLW@}|UwEzGB000000RI300000000ne;aAk7>Me3tp+xFv-0Xp&G -?S=|}9rRaeU`~uMrbA>C`}q*r{eiB7ehUYis7~w1CQOqefKeZ3;Wd%uopqe!>_vj92XkX`X>fFN00{zO -a5aA+<>R2XhQO_4{AcS-HH^7AVzASV8M4NYxyCjU1gEwF5PXV6FZDLo1#Vec_~kix7WfVQ#Sd|CM9$^_ -0000000030{{R300000Ab7^O8VRUtJWpe-u0pipZP!Z9Fy4s@&s7y*hO1UlNfirx{z*_V4e8lMKApwRM -5G-hCV9w&(UffE`hM!G~aLQ!~gAR@AcC9KZUqt`_000000093000000000P0Z)9m^X=QQ)0|;Sab98cH -V{`xrZ+2yJa%p5`0R?7hZeeWy7*1hrWn@NaWo%?Yb8~5DZf#|5bX0k8Wd;KRX=DOq#MKE+xj;HS^AvC+ --Eea3oo~4=i3iziU+2)E(%OuN{^Dg=h-~N_zJ`Red1EINWrM}GXaQb}6c#qIM2EQqZeeX@0!8YhU)%QM -kO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~atLx|b7gXN -Wn=<+10COKearHwcS=7M7YzYaI8*bvhMOc?)(rkC#nUG5>JtwI*nu%&Q~z;Vl^%5wS6(#;{6ajG64wDP -k{-(!PGN0jWJYOaY-B}vbY*UHX>V>+d2nS00|IGe0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-V -jAV5lLa7y@JVOzJ)&GXo9MeQ_qmbcB?4VH0I#X{*-UM!8ZDj&Q>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7 -Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pxis%LHy=ZDj&Q>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV* -{3!yZ{M3XW@z+pC`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_ -2y$g}WpZ|9WCD5v9p7nv%krpqNV>+d2nS00|IGe0%XM12~D{`Iz96ga3kGta_pUNxh{zZ -*=%3u(4f-Vj5JaYt`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXasIyZDj&Q>Z4!V_T!KNI`QJ|h6;Zj -^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pZ4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1 -V6JV*{3!yZ{M3XW@z+ppG1a4t% -WdcR&qhH(he1kloHngE|MP03Qu=#Wn@WaVPjZ4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HJ_1fvw5 -rj-B|XP@r^w5ufb=C_Ju$l1`nW&GEpSWb-!P<3KgX>@L7b8`d&00eY+X=DHe0Rr`G6JjIwIj2eqliWu} -$@z+_xPw?-wb>Rw7=FYk8VaL=Li5Yl(a@n1+Ku60FILp}Zw|!7cE!MGSxid=WmW+Kba(&-0Rr`G6JjIw -Ij2eqliWu}$@z+_xPw?-wb>Rw7=FYk8VbdGA)3GUIc{=BfUQMVFMRBwY;Hd$-Q55DeryBg+(ZXcX=g%g -Z(;=j00;m8Kmh;%00000000mG0000000&cbaByr%WCZ~L2LJ#-AOHzdb#QQONpxjx1O)&GWMyVyb!>D1 -00037ba`-PPHzAO0RR935eRg7aAi(mZDjxj0RlzpqhH(hOi(W05|TJ%PM*ricn_PmXk-!zW@%+?WKLmiWdH>M0!8YhU)%QMkO4aJ;_ZeCe;xE! -X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~auW-7VRC6NdhVC3z)=0wst0Y0}#&o=rIt`?a&Fa))1(#TPD -!jC~PR_M88ajEx^RR910000000RI300000000>icaByr>bz%bw25EG2Wo%{u1Z`z>VF3nbY;R&=Yyt&u -cWz~50|$0tY-Mg^c?1e!b8~5DZf#|5bOi@zWo~72X>$e&baG*Cb7^#GZ*B((Wq5RDZgXjGZU_lwcw=R7 -bZKvH2?|qnaBys8ZDnqB1_TLXZ*FvDZgfdx0S1_@x7s+uExGllhUte$e$Op^sMk_Bzn7+|3$axzr3rLt -ZDn(GVQp{#07wU8a%Ew3Z*l@;#MKE+xj;HS^AvC+-Eea3oo~4=i3iziU+2)E(%Ou+=zxYCD0L!x4tB5H -m3vFbl?lapNXe%XU~*fKJ0+Y8VQy}3bYXO9Z*Fq{3ISO55nb$VTQ?X>xA?XXJF{2H^dT~zWT)b=0OBT1 -J2L^)|BtqCIH`QK6F1|v)Z${_U85pQj^zm^DU~vi8uS+c0000000030000000000FRB~Z%b7^#GZ*ECu -VPj4E?M+l67UG^w8*<_XZ#%uyqCt-#n(R;4&W&+>mb;*F>vukd;=m`ygb@x#_>`RmOO$cpebYWy+ -bYTDq0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#I -cLF!~asU7T000000RI300000000(DmZ(?C=a{vkgMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r -8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-V -j5fhEq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a000000RI300000000wDpaCLNZ015&{>Z4!V +0000001QKKZggR3Ze?;-WpV=n0(LS22}5sgbY*UINn`{C00whoXk~3-00jX8WW?18O}RiiJ@XWBBi(Rv +?4579E{O-(Y+vWlpwilmlv2~%1FNg3QJ<&wKF}2F)J=UcKm7gx`duV?R0NO^0S9MgZe??6a{vVa0%XM1 +2~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-VjGqWBNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G6Dr@ +W?^Gx00jX7JIcU;0|?p#+${pKVqYC0|{wnVPj=UZE$P=1pxt8$PakD#zGc4 ++eY|aXXwx;YM0QXyiqR;Jsw2Z*{J&j1#@+9aBKht0Rd++hrkGM>lK-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b0tIPiVPjm(ZiUQ7;QU9z@vL +sQU{;Z*FvDZgf*=XLAJs015(R#MKE+xj;HS^AvC+-Eea3oo~4=i3iziU+2)E(%Ou+=zxYCD0L!x4tB5H +m3vFbl?lapNXe%XU~*fKJ0+X}A;%YO&?-P3O4E?M+l67UG^w8*<_XZ#%uyqCt-#n(R;4&W&+>mb;*F>vukd;=m`yg +b@x#_>`RmOO$cpebYWy+bYTDq0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs7 +0;T-agdg$OP=xIp;K4#IcLF!~asU7T000000RI300000000(DmZ(?C=a{vkgMe3tp+xFv-0Xp&G?S=|} +9rRaeU`~uMrbA>C`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_0%XM12~D{`Iz96ga3kGt +a_pUNxh{zZ*=%3u(4f-Vj5fhEq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a000000RI3000000 +01IJrb7^O8ZDnqBa{vkgMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r8?;yf@?frQ$owe+rTo-{ +AMw{vgzX#P!9p!}0yp?_0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-Vj5fhEq57bK6Q|uUfIMEX +^1}Vv6tLB!)|10-o)0prc>n+a000000RI300000000(kqWMyS-a{vhfMe3tp+xFv-0Xp&G?S=|}9rRae +U`~uMrbA>C`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_0000000000{{R300000033g#@ +Wo~0>Wpe-t0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp +;K4#IcLF!~asU7T000000RI300000000w1pa&K~T00{y`>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C +`4HI&hQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Lk0000000030000000000HWMyVyb!>D&b8~5D +Zf#|5bN~bb00eGtZe;)f009JZZ*64&1pxv@>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1 +V6JV*{3!yZ{M3XW@z+pZODNcTE%yi#yB_`&o2yJC_VPs)+VE_pNMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r +8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_0000000000{{R30000002WM<=Vqt7^015&{>Z4!V _T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pGEG00000 00000{{R30000003t@9}X=iS2Wo~qH015&{>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1 @@ -303,10 +192,115 @@ V6JV*{3!yZ{M3XW@z+pGEG0000000000{{R300000033g#@Wo~0>Wpe-t0!8YhU)%QM kO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~asU7T00000 0RI300000000w1pa&K~T00{y`>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI&hQW&>`ZdvNB=ndT -z*X~v;Uq>`<)y^XImOPdju4Lk0000000030000000000HWMyVyb!>D&b8~5DZf#|5bN~bb00eGtZe;)f +z*X~v;Uq>`<)y^XImOPdju4Lk0000000030000000000BM{I9mVQfieVPjM0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*=q!&6rQG)02XJT?*g=|B=zRE +ie$*y(7k2+*P~cYjRuJC38 +-{*D7fZ(%hZo23R4S;p`Q9JBQllDyrZFOvPX>e?10?I5NZ-bfLFbqC#o>4E?M+l67UG^w8*<_XZ#%uyq +Ct-#n(R;4&W&+>mb;*F>vukd;=m`ygb@x#_>`RmOO$AA2VPjC`}q*rQx*t>6v={g +sJ=SZlTl1iF5eQ8IAl(q%E@>So406W2x)F;WpZhBa{vedJIcU;0|?p#+${p +KVqYC0000000000{{R300000033O>~Wpi|4ZEyepNC<6ZbYWy+bYTDr0!8YhU)%QMkO4aJ;_ZeCe;xE! +X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~asox_qhH(hioJpYH;+t0eX2w~A!Q+0eaZ{MVycPK^Kn000000093000000000YT +Y;R&=Y*Tb$bY%bv0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$O +P=xIp;K4#IcLF!~askQ+=8&Hpw3LVJZG0TWlikxJMmHEDQne=0G(X}F$%Fs^000000093000000000YN +b8~5DZf#|5baMa-0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$O +P=xIp;K4#IcLF!~asf-J$cU-b<11?Ur~I=y495{S&B3%8Yyg?DnxLGM`ZE9k000000093000000000Sg +VQgh?V`*h`015&{>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+p< +?Hl01LM?X!H~4Y^K5OyylhJC`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_0XGgC8a;P^F9!TQ +ys`YZF3(w8EA1?b(;%Z(R5QEQf&c&j000000RI3000000019PzbY*UHX>V?G015&{>Z4!V_T!KNI`QJ| +h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+p&VRUJ4ZU6)V00eGtZe;)f 009JZZ*64&1pxv@>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+p< -?Hl01LM?X!H~4Z4R$**qZew{#W?^Gx1_20iWpQ~G -Yywm#VTK~nd#>n8fQnYaJ?>kL6XG(3esa0W5QyJn#ohg24a)0000000930 +00000000YTY;R&=Y*Tb$bY%bu0daC2M$y&U#EU!@hie?UNS!6hQhW-W8INxxf{Fuzg#Z8m000000RI30 +0000001IJrb7^O8ZDnqBa{vhenIb5$QI^$V6PNW$vdMt6d#0>Rmk*`=dQ)K)k7d+w0000000000{{R30 +0000033g#@Wo~0>Wpe-t0ak~ln%Z2n%R^9PBgQXo1&n-R?HR4hpUd;mfGub-hyVZp000000RI3000000 +01I?-VQzD2bZKvHa{vheI6k{n`X+XC81LasyqR+($`>jwnD57lV5q8m)(2RS0000000000{{R3000000 +3T1e7Wo~n6Z*Fq{2?1%uWwlwnKfCTqC!TnpV`xO%(e*mXP$JGS1-q69d*1*6000000093000000000JM +a&m8Sa{vhe!)N7;Jv;(oC!o$&iP#xB8s<*^%!GF?$0)U9@BFJ?0000000000{{R300000031nq0{baMa+0b@PWiLgsaRw~c9&Ny{YCK_TCaeS`x+X~XLW@}|U +wEzGB000000RI300000000ne;aAk7>Me3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r{eiB7ehUYi +s7~w1CQOqefKeZ3;Wd%uopqe!>_vj92XkX`X>fFN00{zOa5aA+<>R2XhQO_4{AcS-HH^7AVzASV8M4NY +xyCjU1gEwF5PXV6FZDLo1#Vec_~kix7WfVQ#Sd|CM9$^_0000000030{{R300000Ab7^O8VRUtJWpe-u +0pipZP!Z9Fy4s@&s7y*hO1UlNfirx{z*_V4e8lMKApwRM5G-hCV9w&(UffE`hM!G~aLQ!~gAR@AcC9KZ +Uqt`_000000093000000000P0Z)9m^X=QQ)0|;Sab98cHV{`xrZ+2yJa%p5`0R?7hZeeWy7*1hrWn@Na +Wo%?Yb8~5DZf#|5bX0k8Wd;KRX=DOq#MKE+xj;HS^AvC+-Eea3oo~4=i3iziU+2)E(%OuN{^Dg=h-~N_ +zJ`Red1EINWrM}GXaQb}6c#qIM2EQqZeeX@0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ2 +0rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~atLx|b7gXNWn=<+10COKearHwcS=7M7YzYaI8*bvhMOc? +)(rkC#nUG5>JtwI*nu%&Q~z;Vl^%5wS6(#;{6ajG64wDPk{-(!PGN0jWJYOaY-B}vbY*UHX>V>+d2nS0 +0|IGe0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-VjAV5lLa7y@JVOzJ)&GXo9MeQ_qmbcB?4VH0 +I#X{*-UM!8ZDj&Q>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+p< +?Hl01LM?X!H~4Z0a%FR6a&~280(t`--)Viz@~C%8KNS}Z0aQ3s^SOqbBwN-D{wl@OChzJK4+YqPF=12x +aaxrgbrDxyH3xis%LHy=ZDj&Q>Z4!V +_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pC +`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!}0yp?_2y$g}WpZ|9WCD5v9p7nv%krpqNV>+d2nS00|IGe0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-Vj5JaYt`n9TUcD*&5hFi^PVx{q +1b@^7zTcrn*%qZTXasIyZDj&Q>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ +{M3XW@z+pZ4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+ppG1a4t%WdcR&qhH(he1kloHngE|MP03Qu=#Wn@WaVPjZ4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HJ_1fvw5rj-B|XP@r^w5ufb=C_Ju$l1`nW&GEpSWb-! +P<3KgX>@L7b8`d&00eY+X=DHe0Rr`G6JjIwIj2eqliWu}$@z+_xPw?-wb>Rw7=FYk8VaL=Li5Yl(a@n1 ++Ku60FILp}Zw|!7cE!MGSxid=WmW+Kba(&-0Rr`G6JjIwIj2eqliWu}$@z+_xPw?-wb>Rw7=FYk8VbdG +A)3GUIc{=BfUQMVFMRBwY;Hd$-Q55DeryBg+(ZXcX=g%gZ(;=j00;m8Kmh;%00000000mG0000000&cb +aByr%WCZ~L2LJ#-AOHzdb#QQONpxjx1O)&GWMyVyb!>D100037ba`-PPHzAO0RR935eRg7aAi(mZDjxj +0RlzpqhH(hOi(W05|TJ%PM*ricn_Pm +Xk-!zW@%+?WKLmiWdH>M0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-a +gdg$OP=xIp;K4#IcLF!~auW-7VRC6NdhVC3z)=0wst0Y0}#&o=rIt`?a&Fa))1(#TPD!jC~PR_M88ajEx^RR910000000RI3000000 +00>icaByr>bz%bw25EG2Wo%{u1Z`z>VF3nbY;R&=Yyt&ucWz~50|$0tY-Mg^c?1e!b8~5DZf#|5bOi@z +Wo~72X>$e&baG*Cb7^#GZ*B((Wq5RDZgXjGZU_lwcw=R7bZKvH2?|qnaBys8ZDnqB1_TLXZ*FvDZgfdx +0S1_@x7s+uExGllhUte$e$Op^sMk_Bzn7+|3$axzr3rLtZDn(GVQp{#07wU8a%Ew3Z*l@;#MKE+xj;HS +^AvC+-Eea3oo~4=i3iziU+2)E(%Ou+=zxYCD0L!x4tB5Hm3vFbl?lapNXe%XU~*fKJ0+Y8VQy}3bYXO9 +Z*Fq{3ISO55nb$VTQ?X>xA?XXJF{2H^dT~zWT)b=0OBT1J2L^)|BtqCIH`QK6F1|v)Z${_U85pQj^zm^ +DU~vi8uS+c0000000030000000000FRB~Z%b7^#GZ*ECuVPj4E?M+l67UG^w8*<_XZ#%uyqCt-#n +(R;4&W&+>mb;*F>vukd;=m`ygb@x#_>`RmOO$cpebYWy+bYTDq0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_ +Fs4If6Z`oP*&DQ20rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~asU7T000000RI300000000(DmZ(?C= +a{vkgMe3tp+xFv-0Xp&G?S=|}9rRaeU`~uMrbA>C`}q*r8?;yf@?frQ$owe+rTo-{AMw{vgzX#P!9p!} +0yp?_0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-Vj5fhEq57bK6Q|uUfIMEX^1}Vv6tLB!)|10- +o)0prc>n+a000000RI300000000wDpaCLNZ015&{>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~ +v{(W1V6JV*{3!yZ{M3XW@z+pGEG0000000000{{R30000003t@9}X=iS2Wo~qH015&{ +>Z4!V_T!KNI`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+pGEG +0000000000{{R300000033g#@Wo~0>Wpe-t0!8YhU)%QMkO4aJ;_ZeCe;xE!X<$x_Fs4If6Z`oP*&DQ2 +0rFt3ZOHs70;T-agdg$OP=xIp;K4#IcLF!~asU7T000000RI300000000w1pa&K~T00{y`>Z4!V_T!KN +I`QJ|h6;Zj^jB$MPK+?7Lu3>C`4HI&hQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Lk0000000030 +000000000HWMyVyb!>D&b8~5DZf#|5bN~bb00eGtZe;)f009JZZ*64&1pxv@>Z4!V_T!KNI`QJ|h6;Zj +^jB$MPK+?7Lu3>C`4HI~v{(W1V6JV*{3!yZ{M3XW@z+p~GYywm#VTK~nd#>Ze%hHN@6KPlLd+s#TneA +z-EYx -----END STRICT TYPE LIB----- diff --git a/stl/RGBStd@0.11.0.stl b/stl/RGBStd@0.11.0.stl index e21e8fd3..986636e0 100644 Binary files a/stl/RGBStd@0.11.0.stl and b/stl/RGBStd@0.11.0.stl differ diff --git a/stl/RGBStd@0.11.0.sty b/stl/RGBStd@0.11.0.sty index fd081873..1501e86a 100644 --- a/stl/RGBStd@0.11.0.sty +++ b/stl/RGBStd@0.11.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:MRRNRLeI-muTBg22-pcaBEA2-MSllDDH-4RCDD6n-8ku826s#picnic-reverse-convert + Id: stl:H1HLPfyC-5YLlAk!-KWhcUo1-0vtex!9-ODxSmIA-zj1J$qc#western-craft-bogart Name: RGBStd Version: 0.11.0 Description: RGB standard library @@ -106,6 +106,9 @@ import RGBCommit#tuna-safari-design use RevealedData#olivia-copper-stamp use AssignRevealedValueBlindSealTxid#photo-jump-silicon +import RGBLogic#explain-marvin-bless + use DbcProof#needle-change-forest + import CommitVerify#miller-pancake-elastic use MerkleHash#horse-popcorn-bundle use MerkleProof#price-aloha-grid @@ -122,9 +125,8 @@ import BPCore#totem-holiday-helena use TapretRightBranch#miracle-patriot-touch use BlindSealTxPtr#fortune-iron-salmon use OpretProof#good-village-flex - use AnchorMerkleProofTapretProof#meter-mobile-appear use SecretSeal#dollar-iris-wizard - use AnchorMerkleProofOpretProof#prime-salsa-magnet + use AnchorMerkleProofDbcProof#flash-justice-paradox use BlindSealTxid#media-judge-anita use TxPtr#italian-july-eddie @@ -161,14 +163,6 @@ import Bitcoin#signal-color-cipher use XOnlyPk#clever-swim-carpet -@mnemonic(moses-apropos-river) -data AnchoredBundles : tapret#1 (BPCore.AnchorMerkleProofTapretProof, RGBCommit.TransitionBundle) - | opret (BPCore.AnchorMerkleProofOpretProof, RGBCommit.TransitionBundle) - | double (tapretAnchor BPCore.AnchorMerkleProofTapretProof - , tapretBundle RGBCommit.TransitionBundle - , opretAnchor BPCore.AnchorMerkleProofOpretProof - , opretBundle RGBCommit.TransitionBundle) - @mnemonic(domino-waiter-orlando) data AnnotationName : Std.AlphaCaps, [Std.AlphaNumDash ^ ..0xfe] @@ -181,16 +175,13 @@ data AssignIface : ownedState OwnedIface , required Std.Bool , multiple Std.Bool -@mnemonic(explore-spiral-darwin) -data BundledWitness : pubWitness RGBCommit.XChainPubWitness, anchoredBundles AnchoredBundles - -@mnemonic(message-liberal-paul) +@mnemonic(tango-hotel-jamaica) data Consignmentfalse : version ContainerVer , transfer Std.Bool , terminals {RGBCommit.BundleId -> RGBCommit.XChainSecretSeal} , genesis RGBCommit.Genesis , extensions {RGBCommit.Extension ^ ..0xffffffff} - , bundles {BundledWitness ^ ..0xffffffff} + , bundles {WitnessBundle ^ ..0xffffffff} , schema RGBCommit.Schema , ifaces {Iface -> ^ ..0xff IfaceImpl} , supplements {Supplement ^ ..0xff} @@ -199,13 +190,13 @@ data Consignmentfalse : version ContainerVer , attachments {RGBCommit.AttachId -> [Byte ^ ..0xffffff]} , signatures {ContentId -> ^ ..0xff ContentSigs} -@mnemonic(cubic-night-image) +@mnemonic(postage-canary-oxygen) data Consignmenttrue : version ContainerVer , transfer Std.Bool , terminals {RGBCommit.BundleId -> RGBCommit.XChainSecretSeal} , genesis RGBCommit.Genesis , extensions {RGBCommit.Extension ^ ..0xffffffff} - , bundles {BundledWitness ^ ..0xffffffff} + , bundles {WitnessBundle ^ ..0xffffffff} , schema RGBCommit.Schema , ifaces {Iface -> ^ ..0xff IfaceImpl} , supplements {Supplement ^ ..0xff} @@ -401,4 +392,9 @@ data ValencyIface : required Std.Bool data VerNo : v0 | v1 +@mnemonic(special-almond-anatomy) +data WitnessBundle : pubWitness RGBCommit.XChainPubWitness + , anchor BPCore.AnchorMerkleProofDbcProof + , bundle RGBCommit.TransitionBundle + diff --git a/stl/RGBStorage@0.11.0.sta b/stl/RGBStorage@0.11.0.sta index b6378c9d..85b7610d 100644 --- a/stl/RGBStorage@0.11.0.sta +++ b/stl/RGBStorage@0.11.0.sta @@ -1,8 +1,8 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:ZVab0Axk-3hHvPBw-PVgbKK9-OjbajRO-sbN53sE-De3$HdM#cabinet-emerald-brush +Id: stl:YBgLtVmT-FuzNBPe-1fxIqay-JW4Evd5-Za7fm9w-GLF6JAg#transit-xray-giraffe Name: RGBStorage Dependencies: - RGBStd#picnic-reverse-convert, + RGBStd#western-craft-bogart, StrictTypes#century-comrade-chess, AluVM#congo-archive-folio, RGBCommit#tuna-safari-design, @@ -11,9 +11,9 @@ Dependencies: BPCore#totem-holiday-helena, Std#ralph-blue-lucky, Bitcoin#signal-color-cipher -Check-SHA256: eb80a555081e5cd6c487489afaa6035c7871cc544a4e7098144d9f2b9455724e +Check-SHA256: d9ad4313afd685354c6846af7c3cc13a907b553af88f8e584482c6541807b6dd -3Q|WxQ*>`~VP|CtF%(Tiw}_hL!Gmq7aiBy4V-l87!ykk~3_hpwOT62w22w{tQ*>lS>Z4!V_T!KNI`QJ| +3Q|WxQ*>`~VP|CtA5qIa{DS3zlS>Z4!V_T!KNI`QJ| h6;Zj^jB$MPK+?7Lu3>C`4HI)Q*?4^V{}w`aAk91a5aA+<>R2XhQO_4{AcS-HH^7AVzASV8M4NYxyCjH L2PwaO=QH?2~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-Vj0sXlLPKwDZE19FDia2b(>AB29AOeYx#=(k !8In=XQlLX14LMLVywRiQb$5eZ)a&^dIKHbX?@G`sCP;~6&DQwR5(-fxrUo0ThJmcWTI{*Lx000000RI300000000wetXJ~YD00{yy6ir08h??ZV -gKepCphN>>5|&WIAA~{-KBw|ayxXhvsMp|!ND`2%gc_Nxrh2qVwA%Us#V;Pkm;mDO$Szy}0000000030 -|Ns9000009W_507X<}?;a{vhfF%(Tiw}_hL!Gmq7aiBy4V-l87!ykk~3_hpwOT62w(^?v}n^1}ZASkna -+k;MoZJUj+#nJ>$bhcTl`&GYj0000000000|NsC0000001Y}`!VE_pNF%(Tiw}_hL!Gmq7aiBy4V-l87 -!ykk~3_hpwOT62wU_W_(!uc?s(BakzdJ7?EF9^9Gyf?ad??x_c(9*_N0000000000|NsC00000024Qq` -VPj|j2?8+`O+>edn&iQQZK-jfL<3_ImQceVghC8Hr}9g@+pB45%8{!~UIganLWV?BTpVMu5IA6dE0Lj! -YuMq;@!bFb0000000960|Nj60000h6Wo<`nZ(?C=Q*>c;Wd;HTYi@6MZU71bF%(Tiw}_hL!Gmq7aiBy4 -V-l87!ykk~3_hpwOT62w<6|AO{83(Yrk|^O`?W3M9CM%AX=A!!j~d9KS7#Oj0%XM12~D{`Iz96ga3kGt +hdJ+Qh@cxXMoPD7A2W5QW5d*c)3yG>JmcWTI{*Lx000000RI300000000wetXJ~YD00{ygQOiC2g5`qc +0#Axs7ZjsiFSYD`^x*MIVgSxPN&ctwsMp|!ND`2%gc_Nxrh2qVwA%Us#V;Pkm;mDO$Szy}0000000030 +|Ns9000009W_507X<}?;a{vhfA5qIa{DS3z$bhcTl`&GYj0000000000|NsC0000001Y}`!VE_pNA5qIa{DS3z6r)`)wd{WM;PFag0M0#0{-c;Wd;HTYi@6MZU71bA5qIa{DS3z00Rh3Wo=1rWMy~;1r2X-LUnFrY-LGqWMy~&3Ib%r)d@|xKsr716mTQmaB}ROZ@Dgs2ia_2 =g^?i+KiRR=6W7=VqesjRYGc!>wZFzp>JB4@xD;^wu&SY_r(Ha#MKE+xj;HS^AvC+-Eea3oo~4=i3izi @@ -184,34 +184,34 @@ J@XWBBi(Rv?4579E{O-(Y+vWlpwilmiECIT&Bl;lSX#$ms8AQN7m&qY^xB4~9n`Dx!RtcK)nwJ0o00000009300000000000 0000000960{{R30000P0Wo=V*VRL8(4G42%Xk~3-bYTDr0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u -(4f-VjFeK-+XJhss8OG%_CC-Q>(otsF+cqN0Qy}ddQ=3E5CSn2O+>edn&iQQZK-jfL<3_ImQceVghC8H -r}9g@+pE%dFLmd)8^C0+InTyb%?WTG%$DZ$m;bAR)ya#VGE@Kn000000093000000000JQW?^Gxa{vkg -F%(Tiw}_hL!Gmq7aiBy4V-l87!ykk~3_hpwOT62wJIcU;0|?p#+${pKVqYC -0x=X#M7M~VI>nnK4)) +(4f-VjFeK-+XJhss8OG%_CC-Q>(otsF+cqN0Qy}ddQ=3E5CR`j%RT&p<$~n`Pl{R>6r)`)wd{WM;PFag +0M0#0{-@G+FLmd)8^C0+InTyb%?WTG%$DZ$m;bAR)ya#VGE@Kn000000093000000000JQW?^Gxa{vkg +A5qIa{DS3zp#+${pKVqYC +0v}P!J^X^@g5?5Fidq*Gqg^kx?0)p%@k(L<&OJ%~r#Z(OK7J55&$qsubbafuzL1-^j%|=cN>I>nnK4)) Pyhe`000000RI300000000(DfZe??2a{vkgWW?18O}RiiJ@XWBBi(Rv?4579E{O-(Y+vWlpwilmp9m~T I>-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-VjO?=J -cE6dyPJT+tk%Iz|R3_dTDo~ZL;TN>Nvedn&iQQ -ZK-jfL<3_ImQceVghC8Hr}9g@+p7kct+(1Z!Y#S=r-tc=NPf>PeW=$`IKP*ssSB}HE2RJl0x=X#M7M~V -Nv6r)`)wd{WM;PFag0M0#0{-*|*t+(1Z!Y#S=r-tc=NPf>PeW=$`IKP*ssSB}HE2RJl0v}P!J^X^@ +g5?5Fidq*Gqg^kx?0)p%@k(L<&OJ%~r(-?SiLgsaRw~c9&Ny{YCK_TCaeS`x+X~XLW@}|UwEzGB00000 0RI300000000000000000RI300000000&}qZe(m_a{vkgWW?18O}RiiJ@XWBBi(Rv?4579E{O-(Y+vWl pwilm1ACLTJsO2B2U!6ncg?mz@CdC==Kxq?gSEg)z2E{|0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u (4f-VjIWKC(E(H_nGEpD*KTAo3`$}tLz4xH6U7V?G 015(R#MKE+xj;HS^AvC+-Eea3oo~4=i3iziU+2)E(%Oub$mV(;bz)!CmQ_M(k?Vd!kfCo{nDM?)_qK{8 68FUdWW?18O}RiiJ@XWBBi(Rv?4579E{O-(Y+vWlpwilmQ>XLl0V(0al>0fVsbCfs) I{K8&0000000000|NsC00000033q99Ze??GWpe-u0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-V -jEQSlCC$c=UszhlV5m?Ru@{iVU*wrVdeH+Q@FPbX@d7avO+>edn&iQQZK-jfL<3_ImQceVghC8Hr}9g@ -+pAtM_K53+2$;2e|4Ao^X6@^Cu3Qu&Ia3E~c^u(!$n*dJ0000000960|Nj60000YNbaY{3Xl-R~baMa- +jEQSlCC$c=UszhlV5m?Ru@{iVU*wrVdeH+Q@FPbX@d6)F%RT&p<$~n`Pl{R>6r)`)wd{WM;PFag0M0#0 +{-<6r_K53+2$;2e|4Ao^X6@^Cu3Qu&Ia3E~c^u(!$n*dJ0000000960|Nj60000YNbaY{3Xl-R~baMa- 0%XM12~D{`Iz96ga3kGta_pUNxh{zZ*=%3u(4f-VjD&FwlPpg3!?y@aX^XIja4CK{WF&t@k=WXUZP9(Y H~bW>$vY;yn!0%XM12~D{`Iz96g a3kGta_pUNxh{zZ*=%3u(4f-VjE}p*=tr7Pr6F_xjAC6(~TLj#*ewiHWCDedn&iQQZK-jfL<3_ImQceVghC8Hr}9g@+pC5c5G-hCV9w&(UffE` +0RR600000000eVsXLA4w0v}P!J^X^@g5?5Fidq*Gqg^kx?0)p%@k(L<&OJ%~r{dHVP!Z9Fy4s@&s7y*h +O1UlNfirx{z*_V4e8lMKAp##!%RT&p<$~n`Pl{R>6r)`)wd{WM;PFag0M0#0{-=f*5G-hCV9w&(UffE` hM!G~aLQ!~gAR@AcC9KZUqt`_000000096000000000P0Wo=V*VRU5%0tt6%bZ%vHb7gY?3Ib%r)d@|x Ksr716mTQmaB}ROZ@Dgs2ia_2=g^?i+Kh>7SS8KIkY89@$6%;X7qJ(R#b4x^L3+^xAn+qc8}R~eDia2b (>AB29AOeYx#=(k!8In=XQlLX14LMLVywUR3nQ8ri$WPp5w@a4b3LR7M69fMnD+{F6rHCsWOZ=>00000 diff --git a/stl/RGBStorage@0.11.0.stl b/stl/RGBStorage@0.11.0.stl index 4bb0d0e9..ccf4334f 100644 Binary files a/stl/RGBStorage@0.11.0.stl and b/stl/RGBStorage@0.11.0.stl differ diff --git a/stl/RGBStorage@0.11.0.sty b/stl/RGBStorage@0.11.0.sty index f0d72b14..c647d3e2 100644 --- a/stl/RGBStorage@0.11.0.sty +++ b/stl/RGBStorage@0.11.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:ZVab0Axk-3hHvPBw-PVgbKK9-OjbajRO-sbN53sE-De3$HdM#cabinet-emerald-brush + Id: stl:YBgLtVmT-FuzNBPe-1fxIqay-JW4Evd5-Za7fm9w-GLF6JAg#transit-xray-giraffe Name: RGBStorage Version: 0.11.0 Description: RGB storage library @@ -11,7 +11,7 @@ @context typelib RGBStorage -import RGBStd#picnic-reverse-convert +import RGBStd#western-craft-bogart use PubWitness#paper-visa-storm use ContentRef#polo-ramirez-parker use SigBlob#insect-cello-avalon diff --git a/stl/Transfer.vesper b/stl/Transfer.vesper index 519082e2..737079e6 100644 --- a/stl/Transfer.vesper +++ b/stl/Transfer.vesper @@ -472,1079 +472,264 @@ Consignmenttrue rec validator bytes len=1 aka=ReservedBytes1 witness bytes len=2 aka=ReservedBytes2 bundles set len=0..MAX32 - BundledWitness rec - anchoredBundles union AnchoredBundles - tapret tuple tag=0 - AnchorMerkleProofTapretProof rec - mpcProof rec MerkleProof - pos is U32 - cofactor is U16 - path list len=0..32 - element bytes len=32 aka=MerkleHash - dbcProof rec TapretProof - pathProof rec TapretPathProof - some union TapretNodePartner option wrapped tag=1 - rightBranch rec TapretRightBranch wrapped tag=2 - nonce is U8 - method enum Method opretFirst=0 tapretFirst=1 - TransitionBundle rec - closeMethod enum Method opretFirst=0 tapretFirst=1 - inputMap map len=1..MAX16 aka=InputMap - key is U32 aka=Vout - value bytes len=32 aka=OpId - knownTransitions map len=1..MAX16 - key bytes len=32 aka=OpId - value rec Transition - ffv is U16 aka=Ffv - contractId bytes len=32 aka=ContractId - nonce is U64 - transitionType is U16 aka=TransitionType - metadata map len=0..MAX8 aka=Metadata - key is U16 aka=MetaType - value bytes len=0..MAX16 aka=MetaValue - globals map len=0..MAX8 aka=GlobalState - key is U16 aka=GlobalStateType - value list len=1..MAX16 aka=GlobalValues - element bytes len=0..MAX16 aka=DataState - inputs set len=0..MAX16 aka=Inputs - Input rec - prevOut rec Opout - op bytes len=32 aka=OpId - ty is U16 aka=AssignmentType - no is U16 - reserved bytes len=2 aka=ReservedBytes2 - assignments map len=0..MAX8 aka=AssignmentsBlindSealTxPtr - key is U16 aka=AssignmentType - value union TypedAssignsBlindSealTxPtr - declarative list len=0..MAX16 wrapped tag=0 - AssignVoidStateBlindSealTxPtr union - confidential rec tag=0 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state is Unit aka=VoidState - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state is Unit aka=VoidState - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state is Unit aka=VoidState - lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state is Unit aka=VoidState - lock bytes len=2 aka=ReservedBytes2 - fungible list len=0..MAX16 wrapped tag=1 - AssignRevealedValueBlindSealTxPtr union - confidential rec tag=0 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec ConcealedFungible - commitment bytes len=33 aka=PedersenCommitment - rangeProof bytes len=33 aka=PedersenCommitment - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state rec ConcealedFungible - commitment bytes len=33 aka=PedersenCommitment - rangeProof bytes len=33 aka=PedersenCommitment - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec RevealedFungible - value union FungibleState - bits64 is U64 wrapped tag=0 - blinding bytes len=32 aka=BlindingFactor - tag bytes len=32 aka=AssetTag - lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state rec RevealedFungible - value union FungibleState - bits64 is U64 wrapped tag=0 - blinding bytes len=32 aka=BlindingFactor - tag bytes len=32 aka=AssetTag - lock bytes len=2 aka=ReservedBytes2 - structured list len=0..MAX16 wrapped tag=2 - AssignRevealedDataBlindSealTxPtr union - confidential rec tag=0 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state bytes len=32 aka=ConcealedData - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state bytes len=32 aka=ConcealedData - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec RevealedData - value bytes len=0..MAX16 aka=DataState - salt is U128 - lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state rec RevealedData - value bytes len=0..MAX16 aka=DataState - salt is U128 - lock bytes len=2 aka=ReservedBytes2 - attachment list len=0..MAX16 wrapped tag=3 - AssignRevealedAttachBlindSealTxPtr union - confidential rec tag=0 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state bytes len=32 aka=ConcealedAttach - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state bytes len=32 aka=ConcealedAttach - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec RevealedAttach - file rec AttachState - id bytes len=32 aka=AttachId - mediaType enum MediaType any=255 - salt is U64 - lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state rec RevealedAttach - file rec AttachState - id bytes len=32 aka=AttachId - mediaType enum MediaType any=255 - salt is U64 - lock bytes len=2 aka=ReservedBytes2 - valencies set len=0..MAX8 aka=Valencies - element is U16 aka=ValencyType - validator bytes len=1 aka=ReservedBytes1 - witness bytes len=2 aka=ReservedBytes2 - opret tuple tag=1 - AnchorMerkleProofOpretProof rec - mpcProof rec MerkleProof - pos is U32 - cofactor is U16 - path list len=0..32 - element bytes len=32 aka=MerkleHash - dbcProof is Unit aka=OpretProof - method enum Method opretFirst=0 tapretFirst=1 - TransitionBundle rec - closeMethod enum Method opretFirst=0 tapretFirst=1 - inputMap map len=1..MAX16 aka=InputMap - key is U32 aka=Vout - value bytes len=32 aka=OpId - knownTransitions map len=1..MAX16 - key bytes len=32 aka=OpId - value rec Transition - ffv is U16 aka=Ffv - contractId bytes len=32 aka=ContractId - nonce is U64 - transitionType is U16 aka=TransitionType - metadata map len=0..MAX8 aka=Metadata - key is U16 aka=MetaType - value bytes len=0..MAX16 aka=MetaValue - globals map len=0..MAX8 aka=GlobalState - key is U16 aka=GlobalStateType - value list len=1..MAX16 aka=GlobalValues - element bytes len=0..MAX16 aka=DataState - inputs set len=0..MAX16 aka=Inputs - Input rec - prevOut rec Opout - op bytes len=32 aka=OpId - ty is U16 aka=AssignmentType - no is U16 - reserved bytes len=2 aka=ReservedBytes2 - assignments map len=0..MAX8 aka=AssignmentsBlindSealTxPtr - key is U16 aka=AssignmentType - value union TypedAssignsBlindSealTxPtr - declarative list len=0..MAX16 wrapped tag=0 - AssignVoidStateBlindSealTxPtr union - confidential rec tag=0 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state is Unit aka=VoidState - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state is Unit aka=VoidState - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state is Unit aka=VoidState - lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state is Unit aka=VoidState - lock bytes len=2 aka=ReservedBytes2 - fungible list len=0..MAX16 wrapped tag=1 - AssignRevealedValueBlindSealTxPtr union - confidential rec tag=0 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec ConcealedFungible - commitment bytes len=33 aka=PedersenCommitment - rangeProof bytes len=33 aka=PedersenCommitment - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state rec ConcealedFungible - commitment bytes len=33 aka=PedersenCommitment - rangeProof bytes len=33 aka=PedersenCommitment - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec RevealedFungible - value union FungibleState - bits64 is U64 wrapped tag=0 - blinding bytes len=32 aka=BlindingFactor - tag bytes len=32 aka=AssetTag - lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state rec RevealedFungible - value union FungibleState - bits64 is U64 wrapped tag=0 - blinding bytes len=32 aka=BlindingFactor - tag bytes len=32 aka=AssetTag - lock bytes len=2 aka=ReservedBytes2 - structured list len=0..MAX16 wrapped tag=2 - AssignRevealedDataBlindSealTxPtr union - confidential rec tag=0 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state bytes len=32 aka=ConcealedData - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state bytes len=32 aka=ConcealedData - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec RevealedData - value bytes len=0..MAX16 aka=DataState - salt is U128 - lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state rec RevealedData - value bytes len=0..MAX16 aka=DataState - salt is U128 - lock bytes len=2 aka=ReservedBytes2 - attachment list len=0..MAX16 wrapped tag=3 - AssignRevealedAttachBlindSealTxPtr union - confidential rec tag=0 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state bytes len=32 aka=ConcealedAttach - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state bytes len=32 aka=ConcealedAttach - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec RevealedAttach - file rec AttachState - id bytes len=32 aka=AttachId - mediaType enum MediaType any=255 - salt is U64 - lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state rec RevealedAttach - file rec AttachState - id bytes len=32 aka=AttachId - mediaType enum MediaType any=255 - salt is U64 - lock bytes len=2 aka=ReservedBytes2 - valencies set len=0..MAX8 aka=Valencies - element is U16 aka=ValencyType - validator bytes len=1 aka=ReservedBytes1 - witness bytes len=2 aka=ReservedBytes2 - double rec tag=2 - tapretAnchor rec AnchorMerkleProofTapretProof - mpcProof rec MerkleProof - pos is U32 - cofactor is U16 - path list len=0..32 - element bytes len=32 aka=MerkleHash - dbcProof rec TapretProof - pathProof rec TapretPathProof - some union TapretNodePartner option wrapped tag=1 - rightBranch rec TapretRightBranch wrapped tag=2 - nonce is U8 - method enum Method opretFirst=0 tapretFirst=1 - tapretBundle rec TransitionBundle - closeMethod enum Method opretFirst=0 tapretFirst=1 - inputMap map len=1..MAX16 aka=InputMap - key is U32 aka=Vout - value bytes len=32 aka=OpId - knownTransitions map len=1..MAX16 - key bytes len=32 aka=OpId - value rec Transition - ffv is U16 aka=Ffv - contractId bytes len=32 aka=ContractId - nonce is U64 - transitionType is U16 aka=TransitionType - metadata map len=0..MAX8 aka=Metadata - key is U16 aka=MetaType - value bytes len=0..MAX16 aka=MetaValue - globals map len=0..MAX8 aka=GlobalState - key is U16 aka=GlobalStateType - value list len=1..MAX16 aka=GlobalValues - element bytes len=0..MAX16 aka=DataState - inputs set len=0..MAX16 aka=Inputs - Input rec - prevOut rec Opout - op bytes len=32 aka=OpId - ty is U16 aka=AssignmentType - no is U16 - reserved bytes len=2 aka=ReservedBytes2 - assignments map len=0..MAX8 aka=AssignmentsBlindSealTxPtr - key is U16 aka=AssignmentType - value union TypedAssignsBlindSealTxPtr - declarative list len=0..MAX16 wrapped tag=0 - AssignVoidStateBlindSealTxPtr union - confidential rec tag=0 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state is Unit aka=VoidState - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state is Unit aka=VoidState - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state is Unit aka=VoidState - lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state is Unit aka=VoidState - lock bytes len=2 aka=ReservedBytes2 - fungible list len=0..MAX16 wrapped tag=1 - AssignRevealedValueBlindSealTxPtr union - confidential rec tag=0 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec ConcealedFungible - commitment bytes len=33 aka=PedersenCommitment - rangeProof bytes len=33 aka=PedersenCommitment - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state rec ConcealedFungible - commitment bytes len=33 aka=PedersenCommitment - rangeProof bytes len=33 aka=PedersenCommitment - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec RevealedFungible - value union FungibleState - bits64 is U64 wrapped tag=0 - blinding bytes len=32 aka=BlindingFactor - tag bytes len=32 aka=AssetTag - lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state rec RevealedFungible - value union FungibleState - bits64 is U64 wrapped tag=0 - blinding bytes len=32 aka=BlindingFactor - tag bytes len=32 aka=AssetTag - lock bytes len=2 aka=ReservedBytes2 - structured list len=0..MAX16 wrapped tag=2 - AssignRevealedDataBlindSealTxPtr union - confidential rec tag=0 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state bytes len=32 aka=ConcealedData - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state bytes len=32 aka=ConcealedData - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec RevealedData - value bytes len=0..MAX16 aka=DataState - salt is U128 - lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state rec RevealedData - value bytes len=0..MAX16 aka=DataState - salt is U128 - lock bytes len=2 aka=ReservedBytes2 - attachment list len=0..MAX16 wrapped tag=3 - AssignRevealedAttachBlindSealTxPtr union - confidential rec tag=0 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state bytes len=32 aka=ConcealedAttach - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state bytes len=32 aka=ConcealedAttach - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec RevealedAttach - file rec AttachState - id bytes len=32 aka=AttachId - mediaType enum MediaType any=255 - salt is U64 - lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state rec RevealedAttach - file rec AttachState - id bytes len=32 aka=AttachId - mediaType enum MediaType any=255 - salt is U64 - lock bytes len=2 aka=ReservedBytes2 - valencies set len=0..MAX8 aka=Valencies - element is U16 aka=ValencyType - validator bytes len=1 aka=ReservedBytes1 - witness bytes len=2 aka=ReservedBytes2 - opretAnchor rec AnchorMerkleProofOpretProof - mpcProof rec MerkleProof - pos is U32 - cofactor is U16 - path list len=0..32 - element bytes len=32 aka=MerkleHash - dbcProof is Unit aka=OpretProof - method enum Method opretFirst=0 tapretFirst=1 - opretBundle rec TransitionBundle - closeMethod enum Method opretFirst=0 tapretFirst=1 - inputMap map len=1..MAX16 aka=InputMap - key is U32 aka=Vout - value bytes len=32 aka=OpId - knownTransitions map len=1..MAX16 - key bytes len=32 aka=OpId - value rec Transition - ffv is U16 aka=Ffv - contractId bytes len=32 aka=ContractId - nonce is U64 - transitionType is U16 aka=TransitionType - metadata map len=0..MAX8 aka=Metadata - key is U16 aka=MetaType - value bytes len=0..MAX16 aka=MetaValue - globals map len=0..MAX8 aka=GlobalState - key is U16 aka=GlobalStateType - value list len=1..MAX16 aka=GlobalValues - element bytes len=0..MAX16 aka=DataState - inputs set len=0..MAX16 aka=Inputs - Input rec - prevOut rec Opout - op bytes len=32 aka=OpId - ty is U16 aka=AssignmentType - no is U16 - reserved bytes len=2 aka=ReservedBytes2 - assignments map len=0..MAX8 aka=AssignmentsBlindSealTxPtr - key is U16 aka=AssignmentType - value union TypedAssignsBlindSealTxPtr - declarative list len=0..MAX16 wrapped tag=0 - AssignVoidStateBlindSealTxPtr union - confidential rec tag=0 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state is Unit aka=VoidState - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state is Unit aka=VoidState - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state is Unit aka=VoidState - lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state is Unit aka=VoidState - lock bytes len=2 aka=ReservedBytes2 - fungible list len=0..MAX16 wrapped tag=1 - AssignRevealedValueBlindSealTxPtr union - confidential rec tag=0 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec ConcealedFungible - commitment bytes len=33 aka=PedersenCommitment - rangeProof bytes len=33 aka=PedersenCommitment - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state rec ConcealedFungible - commitment bytes len=33 aka=PedersenCommitment - rangeProof bytes len=33 aka=PedersenCommitment - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec RevealedFungible - value union FungibleState - bits64 is U64 wrapped tag=0 - blinding bytes len=32 aka=BlindingFactor - tag bytes len=32 aka=AssetTag - lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state rec RevealedFungible - value union FungibleState - bits64 is U64 wrapped tag=0 - blinding bytes len=32 aka=BlindingFactor - tag bytes len=32 aka=AssetTag - lock bytes len=2 aka=ReservedBytes2 - structured list len=0..MAX16 wrapped tag=2 - AssignRevealedDataBlindSealTxPtr union - confidential rec tag=0 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state bytes len=32 aka=ConcealedData - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state bytes len=32 aka=ConcealedData - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec RevealedData - value bytes len=0..MAX16 aka=DataState - salt is U128 - lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state rec RevealedData - value bytes len=0..MAX16 aka=DataState - salt is U128 - lock bytes len=2 aka=ReservedBytes2 - attachment list len=0..MAX16 wrapped tag=3 - AssignRevealedAttachBlindSealTxPtr union - confidential rec tag=0 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state bytes len=32 aka=ConcealedAttach - lock bytes len=2 aka=ReservedBytes2 - confidentialState rec tag=1 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state bytes len=32 aka=ConcealedAttach - lock bytes len=2 aka=ReservedBytes2 - confidentialSeal rec tag=2 - seal union XChainSecretSeal - bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 - liquid bytes len=32 wrapped aka=SecretSeal tag=1 - state rec RevealedAttach - file rec AttachState - id bytes len=32 aka=AttachId - mediaType enum MediaType any=255 - salt is U64 - lock bytes len=2 aka=ReservedBytes2 - revealed rec tag=3 - seal union XChainBlindSealTxPtr - bitcoin rec BlindSealTxPtr wrapped tag=0 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - liquid rec BlindSealTxPtr wrapped tag=1 - method enum Method opretFirst=0 tapretFirst=1 - txid union TxPtr - witnessTx is Unit tag=0 - txid bytes len=32 wrapped aka=Txid tag=1 - vout is U32 aka=Vout - blinding is U64 - state rec RevealedAttach - file rec AttachState - id bytes len=32 aka=AttachId - mediaType enum MediaType any=255 - salt is U64 - lock bytes len=2 aka=ReservedBytes2 - valencies set len=0..MAX8 aka=Valencies - element is U16 aka=ValencyType - validator bytes len=1 aka=ReservedBytes1 - witness bytes len=2 aka=ReservedBytes2 + WitnessBundle rec + bundle rec TransitionBundle + closeMethod enum Method opretFirst=0 tapretFirst=1 + inputMap map len=1..MAX16 aka=InputMap + key is U32 aka=Vout + value bytes len=32 aka=OpId + knownTransitions map len=1..MAX16 + key bytes len=32 aka=OpId + value rec Transition + ffv is U16 aka=Ffv + contractId bytes len=32 aka=ContractId + nonce is U64 + transitionType is U16 aka=TransitionType + metadata map len=0..MAX8 aka=Metadata + key is U16 aka=MetaType + value bytes len=0..MAX16 aka=MetaValue + globals map len=0..MAX8 aka=GlobalState + key is U16 aka=GlobalStateType + value list len=1..MAX16 aka=GlobalValues + element bytes len=0..MAX16 aka=DataState + inputs set len=0..MAX16 aka=Inputs + Input rec + prevOut rec Opout + op bytes len=32 aka=OpId + ty is U16 aka=AssignmentType + no is U16 + reserved bytes len=2 aka=ReservedBytes2 + assignments map len=0..MAX8 aka=AssignmentsBlindSealTxPtr + key is U16 aka=AssignmentType + value union TypedAssignsBlindSealTxPtr + declarative list len=0..MAX16 wrapped tag=0 + AssignVoidStateBlindSealTxPtr union + confidential rec tag=0 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state is Unit aka=VoidState + lock bytes len=2 aka=ReservedBytes2 + confidentialState rec tag=1 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state is Unit aka=VoidState + lock bytes len=2 aka=ReservedBytes2 + confidentialSeal rec tag=2 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state is Unit aka=VoidState + lock bytes len=2 aka=ReservedBytes2 + revealed rec tag=3 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state is Unit aka=VoidState + lock bytes len=2 aka=ReservedBytes2 + fungible list len=0..MAX16 wrapped tag=1 + AssignRevealedValueBlindSealTxPtr union + confidential rec tag=0 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state rec ConcealedFungible + commitment bytes len=33 aka=PedersenCommitment + rangeProof bytes len=33 aka=PedersenCommitment + lock bytes len=2 aka=ReservedBytes2 + confidentialState rec tag=1 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state rec ConcealedFungible + commitment bytes len=33 aka=PedersenCommitment + rangeProof bytes len=33 aka=PedersenCommitment + lock bytes len=2 aka=ReservedBytes2 + confidentialSeal rec tag=2 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state rec RevealedFungible + value union FungibleState + bits64 is U64 wrapped tag=0 + blinding bytes len=32 aka=BlindingFactor + tag bytes len=32 aka=AssetTag + lock bytes len=2 aka=ReservedBytes2 + revealed rec tag=3 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state rec RevealedFungible + value union FungibleState + bits64 is U64 wrapped tag=0 + blinding bytes len=32 aka=BlindingFactor + tag bytes len=32 aka=AssetTag + lock bytes len=2 aka=ReservedBytes2 + structured list len=0..MAX16 wrapped tag=2 + AssignRevealedDataBlindSealTxPtr union + confidential rec tag=0 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state bytes len=32 aka=ConcealedData + lock bytes len=2 aka=ReservedBytes2 + confidentialState rec tag=1 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state bytes len=32 aka=ConcealedData + lock bytes len=2 aka=ReservedBytes2 + confidentialSeal rec tag=2 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state rec RevealedData + value bytes len=0..MAX16 aka=DataState + salt is U128 + lock bytes len=2 aka=ReservedBytes2 + revealed rec tag=3 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state rec RevealedData + value bytes len=0..MAX16 aka=DataState + salt is U128 + lock bytes len=2 aka=ReservedBytes2 + attachment list len=0..MAX16 wrapped tag=3 + AssignRevealedAttachBlindSealTxPtr union + confidential rec tag=0 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state bytes len=32 aka=ConcealedAttach + lock bytes len=2 aka=ReservedBytes2 + confidentialState rec tag=1 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state bytes len=32 aka=ConcealedAttach + lock bytes len=2 aka=ReservedBytes2 + confidentialSeal rec tag=2 + seal union XChainSecretSeal + bitcoin bytes len=32 wrapped aka=SecretSeal tag=0 + liquid bytes len=32 wrapped aka=SecretSeal tag=1 + state rec RevealedAttach + file rec AttachState + id bytes len=32 aka=AttachId + mediaType enum MediaType any=255 + salt is U64 + lock bytes len=2 aka=ReservedBytes2 + revealed rec tag=3 + seal union XChainBlindSealTxPtr + bitcoin rec BlindSealTxPtr wrapped tag=0 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + liquid rec BlindSealTxPtr wrapped tag=1 + method enum Method opretFirst=0 tapretFirst=1 + txid union TxPtr + witnessTx is Unit tag=0 + txid bytes len=32 wrapped aka=Txid tag=1 + vout is U32 aka=Vout + blinding is U64 + state rec RevealedAttach + file rec AttachState + id bytes len=32 aka=AttachId + mediaType enum MediaType any=255 + salt is U64 + lock bytes len=2 aka=ReservedBytes2 + valencies set len=0..MAX8 aka=Valencies + element is U16 aka=ValencyType + validator bytes len=1 aka=ReservedBytes1 + witness bytes len=2 aka=ReservedBytes2 schema rec Schema ffv is U16 aka=Ffv flags bytes len=1 aka=ReservedBytes1