diff --git a/Cargo.lock b/Cargo.lock index f706fec4..174bdf12 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -134,9 +134,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" [[package]] name = "baid58" @@ -173,15 +173,15 @@ checksum = "73290177011694f38ec25e165d0387ab7ea749a4b81cd4c80dae5988229f7a57" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "blake3" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0231f06152bf547e9c2b5194f247cd97aacf6dcd8b15d8e5ec0663f64580da87" +checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" dependencies = [ "arrayref", "arrayvec", @@ -202,12 +202,12 @@ dependencies = [ [[package]] name = "bp-consensus" version = "0.11.0-beta.5" -source = "git+https://github.com/BP-WG/bp-core?branch=v0.11#95f0ad8222845a6ec30cdc8091f53ba0b23be817" +source = "git+https://github.com/BP-WG/bp-core?branch=v0.11#c014bad013c99e4eb828eabc37c1c5ccc30acf75" dependencies = [ "amplify", "chrono", "commit_verify", - "secp256k1", + "secp256k1 0.29.0", "serde", "strict_encoding", "strict_types", @@ -216,7 +216,7 @@ dependencies = [ [[package]] name = "bp-core" version = "0.11.0-beta.5" -source = "git+https://github.com/BP-WG/bp-core?branch=v0.11#95f0ad8222845a6ec30cdc8091f53ba0b23be817" +source = "git+https://github.com/BP-WG/bp-core?branch=v0.11#c014bad013c99e4eb828eabc37c1c5ccc30acf75" dependencies = [ "amplify", "bp-consensus", @@ -234,13 +234,13 @@ dependencies = [ [[package]] name = "bp-dbc" version = "0.11.0-beta.5" -source = "git+https://github.com/BP-WG/bp-core?branch=v0.11#95f0ad8222845a6ec30cdc8091f53ba0b23be817" +source = "git+https://github.com/BP-WG/bp-core?branch=v0.11#c014bad013c99e4eb828eabc37c1c5ccc30acf75" dependencies = [ "amplify", "base85", "bp-consensus", "commit_verify", - "secp256k1", + "secp256k1 0.29.0", "serde", "strict_encoding", ] @@ -248,7 +248,7 @@ dependencies = [ [[package]] name = "bp-seals" version = "0.11.0-beta.5" -source = "git+https://github.com/BP-WG/bp-core?branch=v0.11#95f0ad8222845a6ec30cdc8091f53ba0b23be817" +source = "git+https://github.com/BP-WG/bp-core?branch=v0.11#c014bad013c99e4eb828eabc37c1c5ccc30acf75" dependencies = [ "amplify", "baid58", @@ -263,21 +263,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b" - -[[package]] -name = "byteorder" -version = "1.5.0" +version = "3.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" [[package]] name = "cc" -version = "1.0.88" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02f341c093d19155a6e41631ce5971aac4e9a868262212153124c15fa22d1cdc" +checksum = "1fd97381a8cc6493395a5afc4c691c1084b3768db713b73aa215217aa245d153" [[package]] name = "cfg-if" @@ -287,9 +281,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.34" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" +checksum = "8a0d04d43504c61aa6c7531f1871dd0d418d91130162063b789da00fd7057a5e" dependencies = [ "android-tzdata", "iana-time-zone", @@ -404,9 +398,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "a06fddc2749e0528d2813f95e050e87e52c8cbbae56223b9babf73b3e53b0cc6" dependencies = [ "cfg-if", "js-sys", @@ -461,9 +455,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.3" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", "hashbrown", @@ -471,25 +465,19 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - [[package]] name = "libc" version = "0.2.153" @@ -498,15 +486,15 @@ checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "mime" @@ -516,13 +504,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mnemonic" -version = "1.0.1" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29fae0e4c0b155d3b019a7cbc27abe4a90e15c06814d27889ce9f5f44e2faf77" -dependencies = [ - "byteorder", - "lazy_static", -] +checksum = "f2b8f3a258db515d5e91a904ce4ae3f73e091149b90cadbdb93d210bee07f63b" [[package]] name = "num-traits" @@ -553,9 +537,9 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] @@ -650,7 +634,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d24b59d129cdadea20aea4fb2352fa053712e5d713eee47d700cd4b2bc002f10" dependencies = [ "rand", - "secp256k1-sys", + "secp256k1-sys 0.9.2", + "serde", +] + +[[package]] +name = "secp256k1" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0cc0f1cf93f4969faf3ea1c7d8a9faed25918d96affa959720823dfe86d4f3" +dependencies = [ + "rand", + "secp256k1-sys 0.10.0", "serde", ] @@ -663,6 +658,15 @@ dependencies = [ "cc", ] +[[package]] +name = "secp256k1-sys" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1433bd67156263443f14d603720b082dd3121779323fce20cba2aa07b874bc1b" +dependencies = [ + "cc", +] + [[package]] name = "secp256k1-zkp" version = "0.10.1" @@ -671,7 +675,7 @@ checksum = "c4e48ef9c98bfbcb98bd15693ffa19676cb3e29426b75eda8b73c05cdd7959f8" dependencies = [ "bitcoin-private", "rand", - "secp256k1", + "secp256k1 0.28.2", "secp256k1-zkp-sys", "serde", ] @@ -683,7 +687,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4ead52f43074bae2ddbd1e0e66e6b170135e76117f5ea9916f33d7bd0b36e29" dependencies = [ "cc", - "secp256k1-sys", + "secp256k1-sys 0.9.2", ] [[package]] @@ -703,14 +707,14 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.51", + "syn 2.0.58", ] [[package]] name = "serde_json" -version = "1.0.114" +version = "1.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" dependencies = [ "itoa", "ryu", @@ -738,9 +742,9 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.9.32" +version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd075d994154d4a774f95b51fb96bdc2832b0ea48425c92546073816cda1f2f" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ "indexmap", "itoa", @@ -837,9 +841,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.51" +version = "2.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ab617d94515e94ae53b8406c628598680aa0c9587474ecbe58188f7b345d66c" +checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" dependencies = [ "proc-macro2", "quote", @@ -848,29 +852,29 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.51", + "syn 2.0.58", ] [[package]] name = "toml" -version = "0.8.10" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a9aad4a3066010876e8dcf5a8a06e70a558751117a145c6ce2b82c2e2054290" +checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" dependencies = [ "serde", "serde_spanned", @@ -889,9 +893,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.6" +version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1b5fd4128cc8d3e0cb74d4ed9a9cc7c7284becd4df68f5f940e1ad123606f6" +checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4" dependencies = [ "indexmap", "serde", @@ -914,9 +918,9 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unsafe-libyaml" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" [[package]] name = "version_check" @@ -942,9 +946,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -952,24 +956,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.51", + "syn 2.0.58", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877b9c3f61ceea0e56331985743b13f3d25c406a7098d45180fb5f09bc19ed97" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ "cfg-if", "js-sys", @@ -979,9 +983,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -989,28 +993,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.51", + "syn 2.0.58", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "wasm-bindgen-test" -version = "0.3.41" +version = "0.3.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143ddeb4f833e2ed0d252e618986e18bfc7b0e52f2d28d77d05b2f045dd8eb61" +checksum = "d9bf62a58e0780af3e852044583deee40983e5886da43a271dd772379987667b" dependencies = [ "console_error_panic_hook", "js-sys", @@ -1022,20 +1026,20 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.41" +version = "0.3.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5211b7550606857312bba1d978a8ec75692eae187becc5e680444fffc5e6f89" +checksum = "b7f89739351a2e03cb94beb799d47fb2cac01759b40ec441f7de39b00cbf7ef0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.51", + "syn 2.0.58", ] [[package]] name = "web-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", @@ -1052,9 +1056,9 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.3" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d380ba1dc7187569a8a9e91ed34b8ccfc33123bbacb8c0aed2d1ad7f3ef2dc5f" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -1067,51 +1071,51 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.3" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68e5dcfb9413f53afd9c8f86e56a7b4d86d9a2fa26090ea2dc9e40fba56c6ec6" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" [[package]] name = "windows_aarch64_msvc" -version = "0.52.3" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dab469ebbc45798319e69eebf92308e541ce46760b49b18c6b3fe5e8965b30f" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" [[package]] name = "windows_i686_gnu" -version = "0.52.3" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a4e9b6a7cac734a8b4138a4e1044eac3404d8326b6c0f939276560687a033fb" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" [[package]] name = "windows_i686_msvc" -version = "0.52.3" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b0ec9c422ca95ff34a78755cfa6ad4a51371da2a5ace67500cf7ca5f232c58" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" [[package]] name = "windows_x86_64_gnu" -version = "0.52.3" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "704131571ba93e89d7cd43482277d6632589b18ecf4468f591fbae0a8b101614" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.3" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42079295511643151e98d61c38c0acc444e52dd42ab456f7ccfd5152e8ecf21c" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" [[package]] name = "windows_x86_64_msvc" -version = "0.52.3" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0770833d60a970638e989b3fa9fd2bb1aaadcf88963d1659fd7d9990196ed2d6" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" [[package]] name = "winnow" -version = "0.6.2" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a4191c47f15cc3ec71fcb4913cb83d58def65dd3787610213c649283b5ce178" +checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8" dependencies = [ "memchr", ] diff --git a/src/bin/rgbcore-stl.rs b/src/bin/rgbcore-stl.rs index 42cc0c62..b6d0f06f 100644 --- a/src/bin/rgbcore-stl.rs +++ b/src/bin/rgbcore-stl.rs @@ -135,7 +135,7 @@ Bundles vesper lexicon=types+commitments .unwrap(); let layout = TransitionBundle::commitment_layout(); writeln!(file, "{layout}").unwrap(); - let tt = sys.type_tree("RGB.AnchorSet").unwrap(); + let tt = sys.type_tree("RGB.DbcProof").unwrap(); writeln!(file, "{tt}").unwrap(); let tt = sys.type_tree("RGB.TransitionBundle").unwrap(); writeln!(file, "{tt}").unwrap(); diff --git a/src/contract/anchor.rs b/src/contract/anchor.rs index 31ce7cf4..48bdef3a 100644 --- a/src/contract/anchor.rs +++ b/src/contract/anchor.rs @@ -22,15 +22,50 @@ use std::cmp::Ordering; -use bp::dbc::opret::OpretProof; +use bp::dbc::opret::{OpretError, OpretProof}; use bp::dbc::tapret::TapretProof; -use bp::dbc::Anchor; -use commit_verify::mpc; -use strict_encoding::StrictDumb; +use bp::dbc::Method; +use bp::{dbc, Tx}; +use commit_verify::mpc::Commitment; +use commit_verify::{mpc, ConvolveVerifyError, EmbedVerifyError}; +use strict_encoding::{StrictDeserialize, StrictDumb, StrictSerialize}; -use crate::{BundleId, ContractId, WitnessOrd, XWitnessId, LIB_NAME_RGB}; +use crate::{WitnessOrd, XWitnessId, LIB_NAME_RGB}; -#[derive(Clone, Eq, PartialEq, Debug)] +#[derive(Copy, Clone, Eq, PartialEq, Debug, Display, Error)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", rename_all = "camelCase") +)] +#[display(doc_comments)] +pub enum DbcError { + /// transaction doesn't contain OP_RETURN output. + NoOpretOutput, + + /// first OP_RETURN output inside the transaction already contains some + /// data. + InvalidOpretScript, + + /// commitment doesn't match the message. + CommitmentMismatch, + + /// the proof is invalid and the commitment can't be verified since the + /// original container can't be restored from it. + UnrestorableProof, + + /// the proof does not match to the proof generated for the same message + /// during the verification. + ProofMismatch, + + /// the message is invalid since a valid commitment to it can't be created. + ImpossibleMessage, + + /// the proof is invalid and the commitment can't be verified. + InvalidProof, +} + +#[derive(Clone, Eq, PartialEq, Debug, From)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_RGB, tags = custom, dumb = Self::Tapret(strict_dumb!()))] #[cfg_attr( @@ -38,112 +73,47 @@ use crate::{BundleId, ContractId, WitnessOrd, XWitnessId, LIB_NAME_RGB}; derive(Serialize, Deserialize), serde(crate = "serde_crate", rename_all = "camelCase", untagged) )] -pub enum AnchorSet { +pub enum DbcProof { + #[from] #[strict_type(tag = 0x01)] - Tapret(Anchor), + Tapret(TapretProof), + + #[from] #[strict_type(tag = 0x02)] - Opret(Anchor), - #[strict_type(tag = 0x03)] - Dual { - tapret: Anchor, - opret: Anchor, - }, + Opret(OpretProof), } -impl AnchorSet

{ - pub fn from_split( - tapret: Option>, - opret: Option>, - ) -> Option { - Some(match (tapret, opret) { - (Some(tapret), Some(opret)) => Self::Dual { tapret, opret }, - (Some(tapret), None) => Self::Tapret(tapret), - (None, Some(opret)) => Self::Opret(opret), - (None, None) => return None, - }) - } +impl StrictSerialize for DbcProof {} +impl StrictDeserialize for DbcProof {} - #[allow(clippy::type_complexity)] - pub fn as_split(&self) -> (Option<&Anchor>, Option<&Anchor>) { - match self { - AnchorSet::Tapret(tapret) => (Some(tapret), None), - AnchorSet::Opret(opret) => (None, Some(opret)), - AnchorSet::Dual { tapret, opret } => (Some(tapret), Some(opret)), - } - } +impl dbc::Proof for DbcProof { + type Error = DbcError; + const METHOD: Method = Method::OpretFirst; - #[allow(clippy::type_complexity)] - pub fn into_split(self) -> (Option>, Option>) { + fn verify(&self, msg: &Commitment, tx: &Tx) -> Result<(), Self::Error> { match self { - AnchorSet::Tapret(tapret) => (Some(tapret), None), - AnchorSet::Opret(opret) => (None, Some(opret)), - AnchorSet::Dual { tapret, opret } => (Some(tapret), Some(opret)), + DbcProof::Tapret(tapret) => tapret.verify(msg, tx).map_err(|err| match err { + ConvolveVerifyError::CommitmentMismatch => DbcError::CommitmentMismatch, + ConvolveVerifyError::ImpossibleMessage => DbcError::ImpossibleMessage, + ConvolveVerifyError::InvalidProof => DbcError::InvalidProof, + }), + DbcProof::Opret(opret) => opret.verify(msg, tx).map_err(|err| match err { + EmbedVerifyError::CommitmentMismatch => DbcError::CommitmentMismatch, + EmbedVerifyError::InvalidMessage(OpretError::NoOpretOutput) => { + DbcError::NoOpretOutput + } + EmbedVerifyError::InvalidMessage(OpretError::InvalidOpretScript) => { + DbcError::InvalidOpretScript + } + EmbedVerifyError::InvalidProof => DbcError::UnrestorableProof, + EmbedVerifyError::ProofMismatch => DbcError::ProofMismatch, + }), } } - - pub fn mpc_proofs(&self) -> impl Iterator { - let (t, o) = self.as_split(); - t.map(|a| &a.mpc_proof) - .into_iter() - .chain(o.map(|a| &a.mpc_proof)) - } } -impl AnchorSet { - pub fn to_merkle_block( - &self, - contract_id: ContractId, - bundle_id: BundleId, - ) -> Result, mpc::InvalidProof> { - self.clone().into_merkle_block(contract_id, bundle_id) - } - - pub fn into_merkle_block( - self, - contract_id: ContractId, - bundle_id: BundleId, - ) -> Result, mpc::InvalidProof> { - let (tapret, opret) = self.into_split(); - let tapret = tapret - .map(|t| t.into_merkle_block(contract_id, bundle_id)) - .transpose()?; - let opret = opret - .map(|o| o.into_merkle_block(contract_id, bundle_id)) - .transpose()?; - Ok(AnchorSet::from_split(tapret, opret).expect("one must be non-None")) - } -} - -impl AnchorSet { - pub fn known_bundle_ids(&self) -> impl Iterator + '_ { - self.mpc_proofs().flat_map(|p| { - p.to_known_message_map() - .into_iter() - .map(|(p, m)| (m.into(), p.into())) - }) - } - - pub fn to_merkle_proof( - &self, - contract_id: ContractId, - ) -> Result, mpc::LeafNotKnown> { - self.clone().into_merkle_proof(contract_id) - } - - pub fn into_merkle_proof( - self, - contract_id: ContractId, - ) -> Result, mpc::LeafNotKnown> { - let (tapret, opret) = self.into_split(); - let tapret = tapret - .map(|t| t.into_merkle_proof(contract_id)) - .transpose()?; - let opret = opret - .map(|o| o.into_merkle_proof(contract_id)) - .transpose()?; - Ok(AnchorSet::from_split(tapret, opret).expect("one must be non-None")) - } -} +/// Anchor which DBC proof is either Tapret or Opret. +pub type EAnchor

= dbc::Anchor; /// Txid and height information ordered according to the RGB consensus rules. #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug, Display)] diff --git a/src/contract/bundle.rs b/src/contract/bundle.rs index bfb4582e..2e374c18 100644 --- a/src/contract/bundle.rs +++ b/src/contract/bundle.rs @@ -24,6 +24,7 @@ use std::collections::{btree_map, BTreeMap}; use amplify::confinement::{Confined, U16 as U16MAX}; use amplify::{Bytes32, Wrapper}; +use bp::seals::txout::CloseMethod; use bp::Vout; use commit_verify::{mpc, CommitEncode, CommitEngine, CommitId, CommitmentId, DigestExt, Sha256}; use strict_encoding::{StrictDumb, StrictEncode}; @@ -108,6 +109,7 @@ impl<'a> IntoIterator for &'a InputMap { serde(crate = "serde_crate", rename_all = "camelCase") )] pub struct TransitionBundle { + pub close_method: CloseMethod, pub input_map: InputMap, pub known_transitions: Confined, 1, U16MAX>, } @@ -115,12 +117,16 @@ pub struct TransitionBundle { impl CommitEncode for TransitionBundle { type CommitmentId = BundleId; - fn commit_encode(&self, e: &mut CommitEngine) { e.commit_to_serialized(&self.input_map); } + fn commit_encode(&self, e: &mut CommitEngine) { + e.commit_to_serialized(&self.close_method); + e.commit_to_serialized(&self.input_map); + } } impl StrictDumb for TransitionBundle { fn strict_dumb() -> Self { Self { + close_method: strict_dumb!(), input_map: strict_dumb!(), known_transitions: confined_bmap! { strict_dumb!() => strict_dumb!() }, } diff --git a/src/contract/mod.rs b/src/contract/mod.rs index 15ece172..00c20406 100644 --- a/src/contract/mod.rs +++ b/src/contract/mod.rs @@ -35,7 +35,7 @@ mod contract; mod xchain; mod commit; -pub use anchor::{AnchorSet, Layer1, WitnessAnchor}; +pub use anchor::{DbcError, DbcProof, EAnchor, Layer1, WitnessAnchor}; pub use assignments::{ Assign, AssignAttach, AssignData, AssignFungible, AssignRights, Assignments, AssignmentsRef, TypedAssigns, diff --git a/src/stl.rs b/src/stl.rs index faadc017..e3140076 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -29,13 +29,13 @@ use strict_types::typelib::LibBuilder; use strict_types::{CompileError, TypeLib}; use crate::{ - AnchorSet, ContractState, Extension, Genesis, OpCommitment, Schema, TransitionBundle, + ContractState, DbcProof, Extension, Genesis, OpCommitment, Schema, TransitionBundle, XWitnessId, LIB_NAME_RGB, }; /// Strict types id for the library providing data types for RGB consensus. pub const LIB_ID_RGB: &str = - "urn:ubideco:stl:6Yx8ib21pu6se8asaV7z9MQNUuemRZ8iQWhFZFBWcsDp#java-navy-xray"; + "urn:ubideco:stl:7oRjK3fd128oNpMWv1ajhBZq6EotU5Zn1sd3LNNADv4w#laptop-humor-film"; fn _rgb_core_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_RGB), tiny_bset! { @@ -48,7 +48,7 @@ fn _rgb_core_stl() -> Result { }) .transpile::() .transpile::() - .transpile::() + .transpile::() .transpile::() .transpile::() .transpile::() diff --git a/src/validation/consignment.rs b/src/validation/consignment.rs index 75a5aee0..8db330d8 100644 --- a/src/validation/consignment.rs +++ b/src/validation/consignment.rs @@ -25,7 +25,7 @@ //! single-use-seal data. use crate::{ - AnchorSet, BundleId, Genesis, OpId, OpRef, Operation, Schema, SecretSeal, TransitionBundle, + BundleId, EAnchor, Genesis, OpId, OpRef, Operation, Schema, SecretSeal, TransitionBundle, XChain, XWitnessId, }; @@ -56,8 +56,8 @@ impl<'consignment, C: ConsignmentApi> ConsignmentApi for CheckedConsignment<'con .filter(|b| b.bundle_id() == bundle_id) } - fn anchors(&self, bundle_id: BundleId) -> Option<(XWitnessId, &AnchorSet)> { - self.0.anchors(bundle_id) + fn anchor(&self, bundle_id: BundleId) -> Option<(XWitnessId, &EAnchor)> { + self.0.anchor(bundle_id) } fn op_witness_id(&self, opid: OpId) -> Option { self.0.op_witness_id(opid) } @@ -99,7 +99,7 @@ pub trait ConsignmentApi { fn bundle(&self, bundle_id: BundleId) -> Option<&TransitionBundle>; /// Returns a grip given a bundle id. - fn anchors(&self, bundle_id: BundleId) -> Option<(XWitnessId, &AnchorSet)>; + fn anchor(&self, bundle_id: BundleId) -> Option<(XWitnessId, &EAnchor)>; /// Returns witness id for a given operation. fn op_witness_id(&self, opid: OpId) -> Option; diff --git a/src/validation/status.rs b/src/validation/status.rs index ff398aaa..c4cf26cd 100644 --- a/src/validation/status.rs +++ b/src/validation/status.rs @@ -31,7 +31,7 @@ use crate::contract::Opout; use crate::schema::{self, SchemaId}; use crate::{ AssignmentType, BundleId, ContractId, Layer1, OccurrencesMismatch, OpFullType, OpId, - SecretSeal, StateType, Vin, XChain, XGraphSeal, XWitnessId, + SecretSeal, StateType, Vin, XChain, XGraphSeal, XOutputSeal, XWitnessId, }; #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Display)] @@ -306,15 +306,20 @@ pub enum Failure { SealNoWitnessTx(XWitnessId), /// witness layer 1 {anchor} doesn't match seal definition {seal}. SealWitnessLayer1Mismatch { seal: Layer1, anchor: Layer1 }, - /// seal {1:?} is defined on {0} which is not in the set of layers allowed + /// seal {1} is defined on {0} which is not in the set of layers allowed /// by the contract genesis. SealLayerMismatch(Layer1, XGraphSeal), + /// seal {1} has a different closing method from the bundle {0} requirement. + SealInvalidMethod(BundleId, XOutputSeal), /// transition bundle {0} doesn't close seal with the witness {1}. Details: /// {2} SealsInvalid(BundleId, XWitnessId, String), /// single-use seals for the operation {0} were not validated, which /// probably indicates unanchored state transition. SealsUnvalidated(OpId), + /// anchor provides different type of DBC proof than required by the bundle + /// {0}. + AnchorMethodMismatch(BundleId), /// transition bundle {0} is not properly anchored to the witness {1}. /// Details: {2} MpcInvalid(BundleId, XWitnessId, InvalidProof), @@ -385,9 +390,6 @@ pub enum Warning { TerminalSealAbsent(OpId, XChain), /// terminal witness transaction {0} is not yet mined. TerminalWitnessNotMined(Txid), - /// transition bundle {0} doesn't close all the seals defined for its - /// inputs. - UnclosedSeals(BundleId), /// Custom warning by external services on top of RGB Core. #[display(inner)] diff --git a/src/validation/validator.rs b/src/validation/validator.rs index 15cfd64c..52a27e31 100644 --- a/src/validation/validator.rs +++ b/src/validation/validator.rs @@ -33,9 +33,9 @@ use super::status::{Failure, Warning}; use super::{CheckedConsignment, ConsignmentApi, Status, Validity, VirtualMachine}; use crate::vm::AluRuntime; use crate::{ - AltLayer1, AnchorSet, BundleId, ContractId, Layer1, OpId, OpRef, OpType, Operation, Opout, - Schema, SchemaId, Script, TransitionBundle, TypedAssigns, XChain, XOutpoint, XOutputSeal, - XWitnessId, XWitnessTx, + AltLayer1, BundleId, ContractId, DbcProof, EAnchor, Layer1, OpId, OpRef, OpType, Operation, + Opout, Schema, SchemaId, Script, TransitionBundle, TypedAssigns, XChain, XOutpoint, + XOutputSeal, XWitnessId, XWitnessTx, }; #[derive(Clone, Debug, Display, Error, From)] @@ -325,7 +325,7 @@ impl<'consignment, 'resolver, C: ConsignmentApi, R: ResolveWitness> .add_failure(Failure::BundleAbsent(bundle_id)); continue; }; - let Some((witness_id, anchor_set)) = self.consignment.anchors(bundle_id) else { + let Some((witness_id, anchor)) = self.consignment.anchor(bundle_id) else { self.status .borrow_mut() .add_failure(Failure::AnchorAbsent(bundle_id)); @@ -336,9 +336,13 @@ impl<'consignment, 'resolver, C: ConsignmentApi, R: ResolveWitness> let (seals, input_map) = self.validate_seal_definitions(witness_id.layer1(), bundle); // [VALIDATION]: We validate that the seals were properly closed on BP-type layers - let Some(witness_tx) = - self.validate_seal_commitments(&seals, bundle_id, witness_id, anchor_set) - else { + let Some(witness_tx) = self.validate_seal_commitments( + &seals, + bundle_id, + witness_id, + bundle.close_method, + anchor, + ) else { continue; }; @@ -391,7 +395,8 @@ impl<'consignment, 'resolver, C: ConsignmentApi, R: ResolveWitness> seals: impl AsRef<[XOutputSeal]>, bundle_id: BundleId, witness_id: XWitnessId, - anchor_set: &AnchorSet, + close_method: CloseMethod, + anchor: &EAnchor, ) -> Option { // Check that the anchor is committed into a transaction spending all the // transition inputs. @@ -419,37 +424,42 @@ impl<'consignment, 'resolver, C: ConsignmentApi, R: ResolveWitness> None } Ok(pub_witness) => { - let (tapret, opret) = anchor_set.as_split(); - - let tapret_seals = seals - .as_ref() - .iter() - .filter(|seal| seal.method() == CloseMethod::TapretFirst); - if let Some(tapret) = tapret { - let witness = pub_witness - .clone() - .map(|tx| Witness::with(tx, tapret.dbc_proof.clone())); - self.validate_seal_closing(tapret_seals, witness, bundle_id, tapret) - } else if tapret_seals.count() > 0 { + let seals = seals.as_ref(); + for seal in seals.iter().filter(|seal| seal.method() != close_method) { self.status .borrow_mut() - .add_warning(Warning::UnclosedSeals(bundle_id)); + .add_failure(Failure::SealInvalidMethod(bundle_id, seal.clone())); } - - let opret_seals = seals - .as_ref() - .iter() - .filter(|seal| seal.method() == CloseMethod::OpretFirst); - if let Some(opret) = opret { - let witness = pub_witness - .clone() - .map(|tx| Witness::with(tx, opret.dbc_proof)); - self.validate_seal_closing(opret_seals, witness, bundle_id, opret) - } else if opret_seals.count() > 0 { - self.status - .borrow_mut() - .add_warning(Warning::UnclosedSeals(bundle_id)); + match (close_method, anchor.clone()) { + ( + CloseMethod::TapretFirst, + EAnchor { + mpc_proof, + dbc_proof: DbcProof::Tapret(tapret), + .. + }, + ) => { + let witness = pub_witness.clone().map(|tx| Witness::with(tx, tapret)); + self.validate_seal_closing(seals, bundle_id, witness, mpc_proof) + } + ( + CloseMethod::OpretFirst, + EAnchor { + mpc_proof, + dbc_proof: DbcProof::Opret(opret), + .. + }, + ) => { + let witness = pub_witness.clone().map(|tx| Witness::with(tx, opret)); + self.validate_seal_closing(seals, bundle_id, witness, mpc_proof) + } + (_, _) => { + self.status + .borrow_mut() + .add_failure(Failure::AnchorMethodMismatch(bundle_id)); + } } + Some(pub_witness) } } @@ -570,21 +580,22 @@ impl<'consignment, 'resolver, C: ConsignmentApi, R: ResolveWitness> /// multi-protocol commitment, by utilizing witness, consisting of /// transaction with deterministic bitcoin commitments (defined by /// generic type `Dbc`) and extra-transaction data, which are taken from - /// anchors DBC proof. + /// anchor's DBC proof. /// /// Additionally, checks that the provided message contains commitment to /// the bundle under the current contract. - fn validate_seal_closing<'seal, 'temp, Seal: 'seal, Dbc: dbc::Proof>( + fn validate_seal_closing<'seal, Seal: 'seal, Dbc: dbc::Proof>( &self, seals: impl IntoIterator, - witness: XChain>, bundle_id: BundleId, - anchor: &'temp Anchor, + witness: XChain>, + mpc_proof: mpc::MerkleProof, ) where XChain>: SealWitness, { let message = mpc::Message::from(bundle_id); let witness_id = witness.witness_id(); + let anchor = Anchor::new(mpc_proof, witness.as_reduced_unsafe().proof.clone()); // [VALIDATION]: Checking anchor MPC commitment match anchor.convolve(self.contract_id, message) { Err(err) => { diff --git a/stl/AnchoredBundle.vesper b/stl/AnchoredBundle.vesper index 47fe335d..6f5d2b7f 100644 --- a/stl/AnchoredBundle.vesper +++ b/stl/AnchoredBundle.vesper @@ -8,52 +8,19 @@ Bundles vesper lexicon=types+commitments BundleId commitment hasher=SHA256 tagged=urn:lnp-bp:rgb:bundle#2024-02-03 + Method serialized InputMap serialized -AnchorSet union - tapret rec AnchorMerkleProofTapretProof wrapped tag=0 - 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 - opret rec AnchorMerkleProofOpretProof wrapped tag=1 - 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 - dual rec tag=2 - tapret 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 - opret 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 +DbcProof union + tapret rec TapretProof wrapped tag=0 + pathProof rec TapretPathProof + some union TapretNodePartner option wrapped tag=1 + rightBranch rec TapretRightBranch wrapped tag=2 + nonce is U8 + opret is Unit wrapped aka=OpretProof tag=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 diff --git a/stl/RGB@0.1.0.sta b/stl/RGB@0.1.0.sta index c6d8dc57..1c5dec49 100644 --- a/stl/RGB@0.1.0.sta +++ b/stl/RGB@0.1.0.sta @@ -1,382 +1,381 @@ -----BEGIN STRICT TYPE LIB----- -Id: urn:ubideco:stl:6Yx8ib21pu6se8asaV7z9MQNUuemRZ8iQWhFZFBWcsDp#java-navy-xray +Id: urn:ubideco:stl:7oRjK3fd128oNpMWv1ajhBZq6EotU5Zn1sd3LNNADv4w#laptop-humor-film Name: RGB Dependency: 5teCJyjMWaxbQK8vdga2soWh2U7waERS3ev8KHShJcgv#trumpet-scratch-pelican +Dependency: 6skrch4mJzDzVaTYnCgCxFJLw23SSUxNhK7PKgPdSapR#roof-parent-reunion Dependency: 7EpM1uymEteG4g4xmF5ntKYX1wXXpbQj5iLiDreH4jWa#protein-donald-cool -Dependency: C5EbVby4rry8esHwoPrGUfhe7yqJgoyA1DBcyuBRf2rZ#granite-target-table Dependency: DVtm25LRKU4TjbyZmVxPhvCmctZ6vKkPKqfpU2QsDNUo#exodus-axiom-tommy Dependency: DzTvt9gGhPUKD8Dkkjk9PDBhkJ4gtWxXWQjxnmUYLNrs#voyage-kimono-disco Dependency: HX2UBak8vPsTokug1DGMDvTpzns3xUdwZ7QJdyt4qBA9#speed-atlanta-trilogy -Checksum-SHA256: a3022416091ac3a073678a3245cd0fb4b7d26084b73dca970dd29fa34bf1f9eb +Checksum-SHA256: b6f2cdbd7889d6ae8cfe540c0bae588afb8abeadd6a1327f279217b5d8ab883f -15!sq21u!F?8_As^WnPDotHzoVsdtr@aSRwVWi2G1l#x)zY9}za%p39RC#b^b6l` -Ak=DuM$QKdrry9#1TdpOKse5vu1&=u{+IqgZa|}aoZEb0ER%LQ&W_hHBKtgAY5q^ -Iluea$_-ef7Ea!j^WMN`8jc6PL*qz(o`P(yEWWx2BlpjxL^Nrpp0Zn_o=KaY%P`R +15!sq21u!F?8_As^WnPDotHzoVsdtr@aSRwVWi2G1l#x)zY9}za%p39RC#b^b5~0 +c1*&)vOW1GUXo1zLw-(3lbA18rP|lu5&-qPP3I;+@LvM0rT(C5e*2&|@7ZL8K8p| +GAt|gDDdvc%!k2x;ddcL`H3`1{iZE18?WpZg|dAYL(pjxL^Nrpp0Zn_o=KaY%P`R Gsm%`JsM3VH1hUUo2?YlHei-0Jn$(Q *>nYY!hN5_Bp3Y36tDMM#=e#tGI($UA5U3KNx<*C>ja}LTPkkZ)t7@1wm|eR!sr` ZSSEb;k|42*wg~2q@3^Lq|9zft}OB~jx>)hO72TW;VQ)zT%r!Z9lE%{u?@QI^ -EqCb}2Q7OO^w+`_q*ddTXmHSf)1x#sTNn{2>P(yEWWeorUdtm>UP(yEWWeWfSdtm>UaGoca9LuK7Ij+X8IutaRAF#(Wpqw&WMxoca&&HGas$;gkn2QsifIWLvZbUw81 NwsGjgonnp^pYSe+vyeGo->aBOK~X>?O%VQf@*X=D$!ADBNH?W>M^%H|xc>sh|Dn *!v8^Ea7rh?dzC2n-8UVQ_L~bWn0{Z)Ow3Q&MIpyF?|7J7@IF!hZhz8Wft0d6dj=*oo`t>c$)o5X19O9`rXu =lIsRdWprq7WH>)!E^$-R$RUwD%Xb~0J!Ic@@+ehVE%-)5lom~G1rbzXaB^jIQfX &sbV71rZewUhC#Wt^wA&hNfbvI8l{tqo-}{|djZ8YAkJtUQVz<=}LTqVnWK(5fY* -ctqbaF>d&s@;xOg?z(`#e5a?6_IYcQ>%7&o7^|1Fn59cLW!>7R25;!;BbW>$vY-r| -YMuA$i)CT)VRl_{OM>iY*&c?b?aZznm(1lyi>kUF|X>MdwWnpYocx -hy@D@qdC-Hdlhx3 -aZBNPbr@aHF*SPB$t~%I3sYlqX>fExd30rSF}tqlgo$^>um>@6G0l?pFt#Zz&53{ -9y57aQ#OZ(83shlnPH$voNMUnmU#!_}aHwX>fF-fOl4taR%LShqNggpk^aqssIi!kV?X)a%pCH1pqjnLxv|61vo|x*OcO&#*^E;5@PQ20HKbE5LJk_Il(3r -%HmYiwmua&K>DllNeFa6}P}rq7L!(40)FbL%msz%JU8hqvFyoea2o4pL=vWpZ|9W -I}m#WpgphxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%MQe|^xa&~28LV0v$ -b20-{bYubmVTK~nd#>2n%XllhT~=NoHP;c|e7Y7R4CG@t-;oPeVRC6Kv@4tY;$BCg=lGO40qbyjMBe4%@A^HhWa%pX8bZK^FL$l>=aJKZ8qPZ~8_ -Ay`{BOcnX`ZLs5bK^c@SX6|G5LRJwX<=@3Np5CuQ)O*QWMqug53p;7sgGx&z)8&p -rN#D&cR=tS@df05SQ3Z*PZCvbZeeX@WJYOaY-Dp&Wo=1hW;-_@!B}!Xe6S8Vlo}N -pMYa@hhf!VSE9+D#{B2>u5KdujWn@NaWo%?~Q)O*QWM@{87!w`0DVm?ygGiT~Xe_ -D09z~+5ZR24JwBW=~fC@%wWo%?qWo=1hYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy= -DB@qgYOj1yf~hNo0L?GD-ChyQx*HBy#d^X^+L=2^xaw6cpQ{P}V18$LIw~WMyu2f -zvD`*Td*C*~4P}$n=kpoj->tyfRKrOAiJKV)22*KzX>Mnd61wt&N$YpE|Lzj$ -zO2_NymN^cxSmH9vyTIpQY?QAMQ(L%R$+2!VQzGDq_7={(%B;l;Rh7DJo-_a=L-& -HFsOv&CqLR1V5+fZ3RHP;Wm9=`bY*R*6znLl?N#mWu2FfU=jES3v-wpP5N?~nE^- ->bepVa_MrmbiWKLmiWx>+Imuwmz?bHMW}Lgb_Mu+?FC3V>;VRC6oOFWC098Y;;Uvd1Z1jQ)P4o0RRaB$ZLXo3tD}~kpv`iBir!Z9lE%{u?@QI^EqCb}2Q7OO^w+ -`_q*ddTXmHSf)00;m8KmY&$000000RR600000000000000000RI300000001IVqb -aHu6Z)t9Ha{vke2LJ#-0{{ZKvj?DBr&dXZLqcx477IU*jA;4jPyNj;g+K~j;NRYg<7CU$nTqof -X61Pb;^kcqrN>J=(17*>vH+sNfO>T@W!FHOn$!h0|R1#fV2Wpn@q0Rp6kKtgAY5q -^Iluea$_-ef7Ea!j^WMN`8jc6PL*qz-82W=4TpwA2RsNL9l+JUB|1>UAlFIaf-Al -tiusjkyB^WOZR|00sgEbYXCEWpo0hhCo7RjS+r-Ag{OSQ{H4Lp>j;NRYg<7CU$nT -qofX61Pb;^kcqrN>J=(17*>vH+sNfO>T@W!FHOn$!h0|UZ*X#DbONM?KtgAY5q^I -luea$_-ef7Ea!j^WMN`8jc6PL*qz-82W=4TpwA2RsNL9l+JUB|1>UAlFIaf-Alti -usjkyRxb8}^MRAFZY0RRU806-uBB0+O=X=iRyWp-s@Y-MCYbaY{3XhLjhZe&wsVQ -f@*P;_zx1ONKtpQ8M_qJyi -O1VIUJ=H=)@ii_1#@&^bY%hjG)3KC&kYOztQDksx&yAAH -Y;R+00$i{(k=DuM$QKdrry9#1TdpOKse5vu1&=u{+IqgZbIZ6bJLYKfb7gWS-+`& -{Sr=ykNJ#YFTr_BQwWqKF0Ra(XZ*FF3WMyu2X<=+rbYXO500sjDb7f&{0gt=F=tr -7Pc;WdH^P1aoC!YypA{4XEgn0epQk*PX+nL>x -Om%pK>soMo}bYXO50sJ&Y-CxfQ3;(PYqYcu5$>lN%N|>_ ->4e9YQ#rfba;u!+d5tm#=h2RwFCuobYXO50ccY+APn47#!YtOwl1n>FWNfUk-rA3 -DGt2Q_Id+K%mi$2V`~Cjur!g@$>Ycu5$>lN%N|>*O1aoC!YypA{4X< -ncGy!)gsJ>Egn0epQk*PX+nL>xOm%pK>soMo}bYXO50ccY+APn47#!YtOwl1n>FW -NfUk-rA3DGt2Q_Id+K%mi$2V`~Cjur!g@$>Ycu5$>lN%N|>MdwWnpYocu;h51OxyKV{dL|X=G(?bZKF100sjDb7f&{0o#gN8iEuMbtv- -qj6g$b#7A9pc!|f`I$jaRzSe2A1O;<+VRU5ya1CV;vVwtcAGbZ_5@VACR|ut2VXX -q-)V^B9&!_4M1Z;0(YXV%bG?CWHc;WdH^P1 -aoC!YypqE!sthuPUKDEU2%WC`V+X+(UG)mk--2W1{>juaWw^VbYXO50dNgv5VC@S -Zy&ckYcu5$>lN%N|>_>4e9YQ#rfba;u!+d5tm#=h2RwF -CuobYXO50sm-Yz<5%CY59k^g5#W{6D&GDo53%OaP0&iRqYcu5$>lN%N|>*O1aoC!YypqE!sthuPUKDEU2%WC`V+X+(UG)mk--2 -W1{>juaWw^VbYXO50sm-Yz<5%CY59k^g5#W{6D&GDo53%OaP0&iRqYcu5$>lN%N|>MdwWnpYocxhw=1ONKtpQ8M_qJyiO1VIUJ=H=)@ii_ -1#@&^bY%f>4P_9rf`M-zw>{+&W0M0{2&GbCtpecGzFNi4r|Jm=Y;R+00$i{(k=Du -M$QKdrry9#1TdpOKse5vu1&=u{+IqgZbIZ6bJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_ -BQwWqKF0Ra(XZ*FF3WMyu2X<=+rbYXO500sjDb7f&{0fGz-uWS7@0e2{fIfIMdwWnpYocu;h51OxyKV{dL|X=G(?bZKF100sjDb7f&{0o -#gN8iEuMbtv-qj6g$b#7A9pc!|f`I$jaRzSe2A1O;<+VRU5yN@#iqkT|?l*=bx{^ -0c**fmF&H)l(b`S3$sb4!MK-1Z;0(YXV%bG?CWHc;WdH^P1aoC!YypqE!sthuPUKDEU2%WC`V+X+(UG)mk--2W1{>juaWw^VbYX -O50ZM3k2aq_tRM}}Ycu5$ +ctqbaF>d&s@;xOg?z(`#e5a?6_IYcQ>oUbhHyi-Y#=22)QEgSwgbZe&wsVQf@*X=JhGI5`vwIKJ?28qdBQV5M* +2;q-lY2q<~K(fZR6A>9R3cu;h52SRCdV{d702mm4DK10Q-T=FR=Q=>S+XYD&bY*ifyRPVjiFd`Y2QhLn&64&owka*miGSR>-o?7a>3`V^RAF#VZ)9aiV +RL9-tl4elKTgFI*|CjhfZ7VH>n$b={WmS6zNkSNp5sya&BR4P;0g`38@&rwvr8Q$XKK#ha*N>X+Ls92fzOv*E( +~7PRR#MWnpGkWpezYrz*aY{>_4@v6zr!BEn8~s;V{eB++vPW1tu=h*<|%Pi|~^P- +_fBZ*6U9bXH|@X=Zr@063mQh9?yTI7S;;e;>sZfv!yd427@;7veO2zMB=|GYU;*a +%*g5NMUnmZLh7x^`{^P$fKg#%8c8X#<$(NgM!uni2C|Kr}onZ3R84)X=8LqVRLAc +_h5K%L=laq&yA1JoJ^{7>oKLkF4~iax8KK|47hp@Qe|^xa&~28LV0v$b1}=fEj#9 +D^K)f#Cf|Xn@L3mU0Z2&n-dr?jcD1Ll0RawDWpib6c4cHjd30rSG6Pd|WC8$Th9c +2>uJC38-{*D7fZ(%hZo23R4S;p`Q9JBQllDynLT_(ua*n2om)>+B_9|IvuuF#~1i +wYr-#C?=ekSLqB#`8-4nb^iXkkuuZA@=uVRL8;Q*?4^V{}w`aAk8302{a_f~YKKs +RVJ$cq_YIR$d@A*Ad=)x)vi0X9JtzktHW +iJ@1L)babHELfN$u@7k>`Uy~SX>DnAX?A5pv*m4Yw)B>wxiHZ7F<>4e9@?+^Gt^g +e<33_oRD_8TR$+2!VQzFuZf0*&Wo=1hWQ^1guxo~?k7uF4NzDeO#rBGKK=2;%1>} +BM5{Lay5>;+)VQpn(MrmbiWOGwxZAoNiJ2xM}SaLsnunswt8WkEvwiIxOQC;OL>r +^THZDGL>PGN0jWJYOaY-Dp&Wo=1hXI79H6CJlHnxEK%NSB*vEUCdBMWU%~<6#T5; +KWaW3Px#VY-CeqZAoNn1fvw5rj-B|XP@r^w5ufb=C_Ju$l1`nW&GEpSWb-vQ)O*Q +WPNrrN%arAsa2~aa`JC!kHz2#8iMH*6x*Uu)+c1g=mkk+Wo~qV(<~&{!{{>E!(#o +&^pB98KZhv1GEPn8Orhb4n;8ZMQ)zl>ZfBAby7Gca>vy*Q?h@&~tk)^LbBPzYo<| +k4j{}!dEPo6|Zgp)|VRC6?pA9RqgJsQF)~2<)1*a`BfGWZkxd_avHyWRvZaNX=Q9=P +GN0j!P3H)ZNVYHBOq;+#Z*Ep$a%o|1baPW>ZAoNP00}{CbWCA+WpXhC0S0Voadl +~A0SrNGbWCA+WpXi7Wpo7r00{xeYl3?VT7AZm1SE3hA}5c~&&3*7XrN0!sxd$tJb +ohp00000000300000000009L2PwXV{&P5bOr(hY-wV1015)Rvj?DBr&dXZLqcx47 +7IU*jA;4jPyNj;g+K~N3L015y +H002M(00OzQ2cTM~R!N3KLTaU=OZ$ +bvG|>z)+>9PT;Au-7)~D;-++hF!000000096000000000Ov3=AX`3Ri0000000000{{R3000000B0+O= +X=iRyWp-s@Y-MCYbaY{3XhLjhZe&wsVQf@*P;_zx1ONKtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^bY%hjG)3KC&kY +OztQDksx&yAAHY;R+00$i{(k=DuM$QKdrry9#1TdpOKse +5vu1&=u{+IqgZbIZ6bJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0Ra(XZ*FF3W +Myu2X<=+rbYXO500sjDb7f&{0gt=F=tr7Pc;WdH^P1aoC!Yy +pA{4XEgn0epQk*PX+nL>xOm%pK>soMo}bYXO50sJ&Y-CxfQ3;(PYq +Ycu5$>lN%N|>_>4e9YQ#rfba;u!+d5tm#=h2RwFCuobYX +O50ccY+APn47#!YtOwl1n>FWNfUk-rA3DGt2Q_Id+K%mi$2V`~Cjur!g@$>Ycu5$ >lN%N|>_>4e9YQ#rfba;u! -+d5tm#=h2RwFCuobYXO50c}La^e<`!Iztr?rsl#d#OQkEER^^L)C{HEhxT=ipag7 -hV`~Cjur!g@$>Ycu5$>lN%N|>*O1aoC!YypqE!sthuPUKDEU2%WC`V -+X+(UG)mk--2W1{>juaWw^VbYXO50c}La^e<`!Iztr?rsl#d#OQkEER^^L)C{HEh -xT=ipag7hV`~Cjur!g@$>Ycu5$>lN%N|>*O1aoC!YypA{4XEgn0epQk*PX+nL>xOm%pK> +soMo}bYXO50ccY+APn47#!YtOwl1n>FWNfUk-rA3DGt2Q_Id+K%mi$2V`~Cjur!g +@$>Ycu5$>lN%N|>MdwWnpYocu;h51OxyKV{dL|X= +G(?bZKF100sjDb7f&{0o#gN8iEuMbtv-qj6g$b#7A9pc!|f`I$jaRzSe2A1O;<+V +RU5ya1CV;vVwtcAGbZ_5@VACR|ut2VXXq-)V^B9&!_4M1Z;0(YXV%bG?CWHc;WdH^P1aoC!YypqE!sthuPUKDEU2%WC`V+X+(UG +)mk--2W1{>juaWw^VbYXO50dNgv5VC@SZy&ckYcu5$>lN%N|>_>4e9YQ#rfba;u!+d5tm#=h2RwFCuobYXO50sm-Yz<5%CY59k^g5#W{6D&G +Do53%OaP0&iRqYcu5$>lN%N|>*O1aoC!Yy +pqE!sthuPUKDEU2%WC`V+X+(UG)mk--2W1{>juaWw^VbYXO50sm-Yz<5%CY59k^g +5#W{6D&GDo53%OaP0&iRqYcu5$>lN%N|>MdwWnpYocxhw=1ONKtpQ8M_qJyiO1VIUJ=H=)@ii_1#@&^bY%f>4P_9rf`M-zw>{+&W0M0{2& +GbCtpecGzFNi4r|Jm=Y;R+00$i{(k=DuM$QKdrry9#1TdpOKse5vu1&=u{+IqgZb +IZ6bJLYKfb7gWS-+`&{Sr=ykNJ#YFTr_BQwWqKF0Ra(XZ*FF3WMyu2X<=+rbYXO5 +00sjDb7f&{0fGz-uWS7@0e2{fIfIc;WdH^P1aoC!YypA{4XEgn0epQk*PX+nL>xOm%pK>soMo}bYXO50ZM3k2aq_tRM}}Ycu5$>lN%N|>_>4e9YQ#rfba;u!+d5tm#=h2RwFCuobYXO50c}La^ -e<`!Iztr?rsl#d#OQkEER^^L)C{HEhxT=ipag7hV`~Cjur!g@$>Ycu5$>lN%N|>< -C6B3la-ao|IWF3IzPWSDxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%B2y$h -1WnpY(WB>*O1aoC!YypA{4XEgn0epQk*PX+nL>xOm%pK>soMo}bYX -O50c}La^e<`!Iztr?rsl#d#OQkEER^^L)C{HEhxT=ipag7hV`~Cjur!g@$>Ycu5$ ->lN%N|>_>4e9YQ#rfba;u!+d5tm#=h2RwFCuobYXO50WPwo{ujV -7L@=1(T$>wOY}Ov_b`4?P%YY`+Wb+o`y98`+V`~Cjur!g@$>Ycu5$>lN%N|>_>4e9YQ#rfb -a;u!+d5tm#=h2RwFCuobYXO50WPwo{ujV7L@=1(T$>wOY}Ov_b`4?P%YY`+Wb+o` -y98`+V`~Cjur!g@$>Ycu5$>lN%N|>WZob97;JWdSa-rT!PdFhnqz;9Q#WZob -97;JWdSa-rT!PdFhnqz;9Q#@L7b8`d&00v=Vb7g -LH000012XJy_b7gLH00jX7iECIT&Bl;lSX#$ms8AQN7m&qY~ob0000000000 -{{R30000007(sJ$X=iS2Wo~qHLTqVnWK(5fY*ct@WCZ~L3IT`y;$>KfZ0H=mhJ>? -uVE2Xtj~bZ%vI0>K2#MqVsrZe&e(V->r|?y|b -&t*2isXxNhAA_oAsh+&2z(R;4&W&+>mb;*F>vukd;=m`ygb@x#_>`RmOO$uRbbWC -A+WpZ;d0$i{(k=DuM$QKdrry9#1TdpOKse5vu1&=u{+IqgZb8WA!#r3Bk2FRnL+R -BXEn8vr=x`Tq%|A_kfK&ST81_o(!b9H5M0$i{(k=DuM$QKdrry9#1TdpOKse5vu1 -&=u{+IqgZb8WA!#r3Bk2FRnL+RBXEn8vr=x`Tq%|A_kfK&ST81`a}OX>Md`Zf8be -V{~tF1pxpD002NB01rcNZewL(Y-MCYbaY{3XaxZP2LJ#-AOHD0Z6?XZWsH8I~II?C0;dW+k -!*yDqgzlqQwf$39g<|8V^HnZgg^CV{}Mqb98TVc?Jgvb7N>_ZDC1d0hChH+XJhss -8OG%_CC-Q>(otsF+cqN0Qy}ddQ=3E5DH^&Zgg^CV{}Pm0iOsgNjk^^qPoT1+zTRn -Ag`3vXv9d*8d@RXy~6c6G6rXCZ(?C=015%s?vf5kh_h+&YE#h%O8d1V_{UOl9{V; -uR#^q%ogpUiFf^bO?_SB2<_!D=ECE1e~SVCXk);5Qh; -gshq!{{oTC#gIzF4hFN<*P1RquLWiVd=0000000030|Ns9000000000000003000 -00000006a%pF1baMa+0U1O@LD!K=VPp{Exud~W3{+09UeV9nC23Q@)VWoWB>(^b0 -00000RR90{{R30010MwZf9v?Y-Mu*2?4fRk{2;&?las2cOc^_;dM$B=NQ;>bLvEM -wWED&%FO@(0000000960|Nj60000DJVRT^t2?0%81F#Cv;e^Yje@tcp1Z_fjx!ub -+IoX}NZJFuK&m8~&0000000960|Nj60000JIbaY{3XaETT!I`xLq+^w`@NrX}btA -9p`Iz{V8wtlsJ_0{(EY{l10000000000|NsC0000003PW#hbaG*1bV+0d0RRU806 --uB4MT5kbaG*1bW?O;bY%tt26JO*Wo=;rED`Lg2^vxlWNub0>suPp6?S0BG&zE#F -W-_@pdDZQ2WV+?bZ>Hb0jys4*qO&E_XL};KJs**U#z0;ePP0;u&7bCWsY-=b_qmb -bYW9;VRU5$0RRX906+i$000000096000000000R^cywiMb7^mG1_}daW_AJEn^6; -37FKqUhx?i3R+Mr!fY&(;2BFL(m@EZk_srD_V{dMBa$#e1Nn`<^2rNlD$O59e#og -QsB77jPl+h5j^*S;QWq5RDZgXjGZd7@2WdUS$9zv-Vp*%wog4O?q)g -04AaHEjnO6;Ie%sNwVNZtr-WprU=VRT^u;b~{_$H8YPU!!A-5yM58(94FP(7*JmC -%?~bN>dRB2WM<=Vqt7^0owP`H}~XwW|nkt{7-&IWbpPi(wX$0pXUqF<#0Z84+~*) -b7^O8ZDnqBa{(&yMM2gb*yIgxLg7xQ_Wp*<{#EXTnHMp{o_cMFjX(%;Wn^V#ZDnK -u-_NO$^@rt6M7IGITmUKjm1~>v&8b0-V>p(oz$%0233g#@Wo~0>Wpe@Dg=PS6VPp -{$?vC--s`v@B8YHl)C#jpVFzBk!DMw8QcWHEPWpi@^T(C5e*2&|@7ZL8K8p|GAt| -gDDdvc%!k2x;ddcL`HllNeFa6}P}rq7L!(40)FbL%msz%JU8hqvFyoea2o26JO_X ->fD`T(C5e*2&|@7ZL8K8p|GAt|gDDdvc%!k2x;ddcL`HllNeFa6}P}rq7L!(40)F -bL%msz%JU8hqvFyoea2o4@G!%Wo~n6Z*Eg#Xk~3-1_cOhWprU=VRT^vNU3b>%M}y -z;kwbCmqWQ?a(0yP=wbe0q{)>8+xQm0YXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=D -B@qgYOj2WM<=Vqt7^015%s?vf5kh_h+&YE#h%O8d1V_{UOl9{V;uR#^q%GEG0000000000{{R30000002XbX(W -o2!100{v`?dHP>9R0ZFSEMRj;Km4qfBYZ5UUs>0bg9bqiCNA7000000003000000 -0000BVRLh7XKrm}Zgg`13IT`y;$>KfZ0H=mhJ>?uVa{vheM(yUq2ps*m=2xUDT;RqCgn#@WzFu~@adfH5^@&-|0000000000{{ -R30000004Mli#Wo~n6Z*Ek1aAgGn00065MrL*e0RR934MuftXK7+=Wm9xvbY%nq2 -nJ$lbaOT|00jX600<05b#7;AVr*qpd2nR|0S$F-b7^O8Wn?xqLTPje2S;UYWpinB -1`GpcW_AJEn^6;37FKqUhx?i3R+Mr!fY&(;2BFL(m@EZk_srD@b7N>_ZDC1d0hCh -H+XJhss8OG%_CC-Q>(otsF+cqN0Qy}ddQ=3E5CvvzVP|s!T(C5e*2&|@7ZL8K8p| -GAt|gDDdvc%!k2x;ddcL`HllNeFa6}P}rq7L!(40)FbL%msz%JU8hqvFyoea2o33 -O>~Wpi|4ZEyepNC$Lfb98QHbOONy%tl@;WNu_lcw-g2$nLVb<*lb*ENIx0;35YAw -}@eeBGG%U@MZ$v=XJ?|;InIPy66cFfOYp#JM2r7_Du?5Y;;Uvd1Z2QF##l3QrKmH -@SMtOBR5nML?B>%qbz^!%<&Wu0B;HjDvStiWprU=VRT^u;b~{_$H8YPU!!A-5yM5 -8(94FP(7*JmC%?~bN>dRB2WM<=Vqt7^0owP`H}~XwW|nkt{7-&IWbpPi(wX$0pXU -qF<#0Z84+~*)b7^O8ZDnqBa{(&yMM2gb*yIgxLg7xQ_Wp*<{#EXTnHMp{o_cMFjX -()@VQgh?V`*h`0o{dW0B>Pr5ftu@@z<*O39}j`u&O7io3b$Is?RA$O$KRmb9H5M0 -ix1^1KGjKL;n+-tOZHsZ4l|5$r%8I8frlHV#NU|*#>iCa%pgM0$i{(k=DuM$QKdr +L3mU0Z2&n-dr?jcD1Ll0RbUFb8~5DZc=4-WnpY(WL9Bpb!9?qX>MdwWnpYocu;h5 +1OxyKV{dL|X=G(?bZKF100sjDb7f&{0o#gN8iEuMbtv-qj6g$b#7A9pc!|f`I$ja +RzSe2A1O;<+VRU5yN@#iqkT|?l*=bx{^0c**fmF&H)l(b`S3$sb4!MK-1Z;0(YXV +%bG?CWHc;WdH^P1aoC!YypqE!sthuPUKDEU +2%WC`V+X+(UG)mk--2W1{>juaWw^VbYXO50ZM3k2aq_tRM}}Ycu5$>lN%N|>_>4e9YQ#rfba;u!+d5tm#=h2RwFCuobYXO50c}La^e<`!Iz +tr?rsl#d#OQkEER^^L)C{HEhxT=ipag7hV`~Cjur!g@$>Ycu5$>lN%N|>*O1aoC!YypqE!sthuPUKDEU2%WC`V+X+(UG)mk--2W1{>juaWw^VbYXO50c}L +a^e<`!Iztr?rsl#d#OQkEER^^L)C{HEhxT=ipag7hV`~Cjur!g@$>Ycu5$>lN%N| +>c;WdH^P1aoC!YypA{4XEgn0epQk*PX+nL>xOm%pK>so +Mo}bYXO50ZM3k2aq_tRM}}Ycu5$>lN%N|>_>4e9YQ#r +fba;u!+d5tm#=h2RwFCuobYXO50c}La^e<`!Iztr?rsl#d#OQkEER^^L)C{HEhxT +=ipag7hV`~Cjur!g@$>Ycu5$>lN%N|>*O1aoC!YypA{4XEgn0epQk*PX+nL>xOm%pK>soMo}bYXO50c}La^e<`!Iztr?rsl#d#OQkEER^^L +)C{HEhxT=ipag7hV`~Cjur!g@$>Ycu5$>lN%N|>_>4e9YQ#rfba +;u!+d5tm#=h2RwFCuobYXO50WPwo{ujV7L@=1(T$>wOY}Ov_b`4?P%YY`+Wb+o`y +98`+V`~Cjur!g@$>Ycu5$>lN%N|>_>4e9YQ#rfba;u!+d5tm#=h2RwFCuobYXO50WPwo{uj +V7L@=1(T$>wOY}Ov_b`4?P%YY`+Wb+o`y98`+V`~Cjur!g@$>Ycu5$>lN%N|>WZob97;JWdSa-rT!PdFhnqz;9Q#WZob97;JWdSa-rT!PdFhnqz;9Q#@L7b8`d&00v=Vb7gLH000012XJy_b7gLH00jX7iECIT&Bl;l +SX#$ms8AQN7m&qY~ob0000000000{{R30000007(sJ$X=iS2Wo~qHLTqVnWK +(5fY*ct@WCZ~L3IT`y;$>KfZ0H=mhJ>?uVE2X +tj~bZ%vI0>K2#MqVsrZe&e(V->r|?y|b&t*2isXxNhAA_oAsh+&2z(R;4&W&+>mb +;*F>vukd;=m`ygb@x#_>`RmOO$uRbbWCA+WpZ;d0$i{(k=DuM$QKdrry9#1TdpOK +se5vu1&=u{+IqgZb8WA!#r3Bk2FRnL+RBXEn8vr=x`Tq%|A_kfK&ST81_o(!b9H5 +M0$i{(k=DuM$QKdrry9#1TdpOKse5vu1&=u{+IqgZb8WA!#r3Bk2FRnL+RBXEn8v +r=x`Tq%|A_kfK&ST81_@zvb7gc?VP|s!T(C5e*2&|@7ZL8K8p|GAt|gDDdvc%!k2 +x;ddcL`HZLh7x^`{^P$fKg#%8c8X#<$(NgM!uni2C|Kr}onZ4nk~cZe(e0XGURTb +Z>G60RRU806-uB4?}NmV`X7%Wn@8gbYWv?1pxpD002NB01ZQLZewL(Y-MCbVRT^y +0RRU806-uB5kqfoV`X7%Wn@NmZf9v?Y-I)l3S)0=ZE19EWo~oHb1_uapV`ybbaG*1bV+0Zp9m~TI>-W|y2ahx3nF|Vu +awki#7NH?S|Q-Q!u2{b24`$O^z3q +kU`2%>V!Z000000RR90{{R3000d-VbYTDq0Zm&2unN%Ogv+IWOlAQDZ9;ju-OD&R +*`2#>nd!~X9RL6T000000RR90{{R3000v=nbYWv?00{xXnY9F@W0kV-aZ{ajBd_Z +DnD~<$3CBu40zYmn*4oVg0000000030|Ns900000ALvL<$a$#e1Nn`~900#g7Kp+ +4OLvL<$a$#e1Q*>c;Wd;HUb7N>_ZD9c{5$vi78d48rZdNSoTN=?7c3{agIfA4w-; +!3K9bfzhXlZkFZ*qA7tX}unna3&j1e>rv@^qhHtfKCHVZx@cs8P0Mj&qH62}EIZV +N-NrbY%qr00;m8KmY&$000000RR600000000=~4V^DH$Z)OAn0S0toaB^jI00jX8 +S4$8Ds(2Ag*l*uxfz_(F7RT;$eF5!I&Ynll`At^}54IneKN{_;j(f`H9IfkFzO$P +GPS0G>=uAF%>iaxCSnRl2&38AmXJiCw9urENI6IdKMR;^&ZgXjGZUzbiW@ +dH)+M7`mSQb`xkca!3baG*1bV+0Zp9m~TI +>-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b4P|(AWo~n6Z*Ek1aAg5xbsj>g6`?#s +5rWnKhSeO?L~x^!;Y#eFP|P}0Z%EzGsGgqasH#GZO>h>bu9a% +E&?Wo>0-0pHK5k@bh=O+>c=6Kf -Z0H=mhJ>?uVa{vheM(yUq2ps*m=2xUDT;R -qCgn#@WzFu~@adfH5^@&-|0000000000{{R30000002}f*iVqt7ga%2Vq4R>jDZe -??GL2hGcZ*l+x0ssVVZ*FA(00035b8l^B00jX7SQ3>DAd9q3vF!EgI>niq&gF@?X -wk09NOmoW?4BAt18HP<0006DM{I9mVQf=$VRU5$0RRdC)$WoGNrc;Wm98lWo=;w0tItrZAoMTNU3b>%M}yz;kw -bCmqWQ?a(0yP=wbe0q{)>8+xQm0YXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qg -YOj2yJ0_Npxjxa{vGW4@YcoVqt7kbYXO5RC#b^1pxp60t`oNZ(?C=R$**)Wpf1q0 -0;s9Xk);5Qh;gshq!{{oTC#gIzF4hFN<*P1RquLWiVd>0000000030{{R3000005 -Np5g;bOr(kaB^jKPjz$wlMuXsu{2tXFT+?;?hj39&>gq>HOrf1lB-q;n)I5N2y$g -}WpZ|9WCC2UG?CWH%$n#j0HLDJN5-IKgM_J7b(p+0MPGk2Gl)y2(Rz0hP$+d -LDIRU(}XWLTZugenOC;Z(5k~zEJnJiX;;E#Q^{S000000RR600000000v2JaCLNZ -1pxpF0o9FP2n?Horiuqf0^m>2O`jNRziT$b7#=ya6uYYC;s5{u000000RR600000 -000v2Ob9H5M1pxpE002M$0000000030{{R3000009O=VlVPs)+VFdvI2mk;;0000000000|Nj60000003r}NXb#iiLZewM01_A?ZX>I@j0t -0PfcmMzb3{P-FZ*6U9bZupBbOs6oW@dH)+M7`mSQb`xkca!3Ycu5$>lN%N|>M?JbaMh+ur -!g@$>Ycu5$>lN%N|>Clv)aMjKgwAH@`bu1x<7g|G$};xvA~n-$_S2y$g)Wo2z;WCC2UG?CW -H+NwrBxfixd_%u|$Wt0&Z^r00JIQb#!obbU|}-X=iS2Wo~p*Wp-s@Y-MCYbaY{3X -a)oYZ*XsQbODnPynwMZT8l5kSW@l}O=!>^xB4~9n`Dx!RtcK)nwJD~WnpXq(PtOE -LlW@z354$cZcQEw0|O`dPRP3jk}Sl@F(;O)1#@&^bY%f(Q#2q9+*8I)cH*`!s%9_ -RI@yuG2CFF!ywLV~14_&XcWHEPWpi@@1#{rZP|m9K(8HSpU8Cxu(AzX*g3wtWgq9 -@B6{cBc98Yz0aCLM+b8~5DZf#|5bW&w@WnpY(WJF^xB4~9n`Dx!RtcK)nwJD~WnpXq(PtOELlW@z354$cZcQEw0|O`dP -RP3jk}Sl@F(;O)1#@&^bY%hmXk);5Qh;gshq!{{oTC#gIzF4hFN<*P1RquLWiVd{ -cWHEPWpi@@1#{rZP|m9K(8HSpU8Cxu(AzX*g3wtWgq9@B6{cBc9Zz+1aCLM+b8~5 -DZf#|5bW&w@WnpY(WL9Bpb!7$w1#fU~b#wuf5WIk~G+K)5%bR -49t5yk`^qQ9hb7f&{0nuj{y+ac4_6daU{%%bk3j+fu`A*2Y1(Gbp$uTFEss(d&VR -U5yZA8ZOFKPukLlqCE=E5w*=z8TWl=ueJ45i$M_H~V*2X|?7Ze??G0R?m5$xzO!^ -w7hb16`x)q0rkjWP;FH9)y-8%N3?sW*JX)bZ~WaL349yXKrm}Zgf^}X=GD$VRU5% -1O;z!Z*_D5lMuXsu{2tXFT+?;?hj39&>gq>HOrf1lB-q;n)I5N1aoC!Yyr_{7rjF -g@b(FW?*48~9t#5lC;3juy9JUg#K|!ymZ}AFbYXO50WPwo{ujV7L@=1(T$>wOY}O -v_b`4?P%YY`+Wb+o`y9ak^bZ%vHa{&c&;K@+Vs`Svqn*&{=>Y>ovG-QI%SssLzB+ -C`1S!NPYWn^V?b7gKrZ*6U9bZupBbOiwb2LJ#-Api(cWn^V#ZDnKy0RRdCM(yUq2 -ps*m=2xUDT;RqCgn#@WzFu~@adfH5^@&-|0hP$+dLDIRU(}XWLTZugenOC;Z(5k~ -zEJnJiX;;E#Q*>R000000RI300000001i@Rc4c8~Wn@8gbYWv?1_J_VWC4V64U;T -R^uxCZOKFR+hj1x=Ib -ox?`Aroor<$W|05z3@o%yggKU%$CX5lEZwTb6rTk%m8Md` -Zf607xcDo(^rWT@v%fz@xDS+Wc!R^OQf-s;Z=(UIZb#Y!bYW)!$&Z?;!v;$l{rzV -fm%J+c{!D0(A9Khp>v3=AX`3Ri22*2bWo=;w3Ik?lb^+R(Q4?4eR(6nw`EY++|}0$i{(k=DuM$QKdrry9#1TdpOKse5vu1&=u{+I -qgZbCdUAcyL4!ji%3ykI}5vZY(~FzYeId -N`S$)9l7ap=09=fBme*a000000RI3000000019t+Ze?Utd2nTO015$z{^Dg=h-~N -_zJ`Red1EINWrM}GXaQb}6c#qIM2EQnILZ{@g(An}If6!%vcs8JbyKG3$_x(S=#` -1OiFX_G0000000000{{R300000040d5`Wo~16RC#b^a{vheM(yUq2ps*m=2xUDT; -RqCgn#@WzFu~@adfH5^@&-|0000000000{{R30000002WMq&WpinB0jom)3dE3VM -G*K@Uj`&9O$m&URampr+czw5j9K7JLkeYhbY*UHX>V?G015$Qbsj>g6`?#s5rWnK -hSeO?L~x^!;Y#eFP|P}0Z%Ez&X0(@tkHmR7VBa*7>vj^5vkt5f(LFa*EmC9=2$WE -90000000000{{R30000003v_Z}ZgXjLX>V?G015##QV*^ZmKt8YDf|&5KZQ>65I6 -*X)C9iYp+?yjr7~y%y~l5O%01=Zemts_^ihs!<5V6J4m)zlTf>a0FkQJXa(QqD}&I_X{w-LKi^UYb -7OL8aC8Bj$sIC?*mL}+GhP8%Hk1q8Y4d}kLL#7L8UbhinjD%4Q)6glZDC1d1pxpD -002NB00vWIa%pgM1OWjBVQh6)Z2$!U0iycqo^V{8k<8oOM(vMq<&O0fgFeVUTx7L -sTfM0r~ -W-2xhK9cV^W63=w?&L0!XQB?8 -_As^WnPDotHzoVsdtr@aSRwVWi2G1l#x)ziR}e6rQG)02XJT?*g=|B=zREie$*y( -7k2+*P~cYjROi{baY{3Xl-R~bN~eb0YWfgg^0-1s}v?c$Nk9{EX~mW5dRI6fB-~% -h??EZc?wi=VQzD2bZKvH1_}daW_AJEn^6;37FKqUhx?i3R+Mr!fY&(;2BFL(m@EZ -k_srD_V{dMBa$#e1Nn`<^2rNlD$O59e#ogQsB77jPl+h5j^*S;RbaG -*Cb7^#GZ*Ek1aAg5BQV*^ZmKt8YDf|&5KZQ>65I6*X)C9iYp+?yjr7~y;ZDn*}WM -On+0pV$9@yEeuC|{#vixI;`n9$3HpwPecswcnCZc0-T2M1?tZ(?C=a{=1-(Kq+xd -uEn&aQshxM`ZB!HPV^%o}cFn(dBSHa}Ne-Zg6#Ua{;NMdRLRko603iZGCpt_aPM; -fa{=9jW&m$tWDykZj`7#3_zANbB(SO{shhGe=&H{tM@< -KJX>@L7b8`Y*ur!g@$>Ycu5$>lN%N|>oKLkF4~iax8KK|47hp*b7OL8aC8D(ur!g@$>Ycu5$>lN%N|>oKLkF4~iax8KK|47hp_RB~Z%b7^#G -Z*D?$Ze(m_1_B6aZg6#UO<`~W6`5yb%eAXO2UPPRaj@((`=>9Tsh)f38uw_!yYu^ -q5NmF4cWzX2VQzD2bZKvHa{vkfmB{9L9(7`0)Rt93YLV-HLXe?vTA1;^Q1`ZqBog -<<0VdBch~;xis8M%?SkH)@vTN3;DRpFKJ%+y2f+J?=i2(or000000RR600000001 -#AiVQzD2bZKvHQ)6glZD9rl2yJC_VPs)+VFF00Z0ySw6Z7G^(Vdq=xngp5lioJpYH;+t0eX2w~A!Q+0eaZ{MVycPK^g=Y;R&=Y;yn# -0oCr34oQf!Y4K`P(FaQVwIle)QgI&pHa%8Z1>xis%Ku=2w -F+7z(Wqt=tdZk`V^s(Ana000000093000000000JQZg6#Ua{vkfhyLPaScq)s9KM -Exvw34D6J>+NwrBxfixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o) -0prc>n+a000000RI300000001IJrb7^O8ZDnqBa{vkfhyLPaScq)s9KMExvw34D6 -J>+NwrBxfixd_%u|$Wt0XD%jq57bK6Q|uUfIMEX^1}Vv6tLB!)|10-o)0prc>n+a -000000RI3000000010+sY-Mg^X=QT&2?0j!=EDda{kY~=q$*tC#t4Le{2#tvcDZq -Msmk?@6CZd7@2Wd#8M00ItFd2nSzZ*6 -U9bZupBbOZwc2WMq&WpinB00jX7Ur$crub(hRM5{P)m6_*u%`Fd;EgzaLZ?`%N_r -;!r0Sa_-VQzD2bZKvH00ja8p9m~TI>-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b0 -W?w%t`n9TUcD*&5hFi^PVx{q1b@^7zTcrn*%qZTXaWgkcywiMb7^mG00ja8p9m~T -I>-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b0c3R^La7y@JVOzJ)&GXo9MeQ_qmbc -B?4VH0I#X{*-WpVSaAjmcb8~5DZgWCxX>MdwWnpYocu;h51OxyJWMyM)VRB(~X?A -4*1pxpE0XZl0-%4v&H)ISe_*f>my4uKhF4_isHhdU7d+OQBHUIzs000000RR6000 -000009VQb#7;AVr*pq1pxpE0oujs9mwqd!6t9MpF6k$l8zT&IM0)BxIjDir5zArR -R910000000RR600000000IhgbaHiLbairNWB>&L00;qr9_N=1kiT6@?qiUXo4Z8} -iXVUo?CzP|ak(fG&*D)40000000030{{R30000303So3~VPj}*Wo~o;1pxpE0p68 -`B?zIHIzl+9&PlG`zw1fUvcIspB!t-xS(}q~od5s;000000RR600000002x$yaAj -mcb8~5DZgWCxX>MdwWnpYocxhw=1ON+UWn*k%a$$67c4Yts0RRXAlfaZ*5|&qoaM -x&cZSO)Ho!_*yjLvyQo1^f$X+6j;0000000000|Nj60000000SIPwZf9v?Y-Ioi0 -RRXA|I$b1hgAEd90w2pG9y@ZJ!C|rt0b}t8>GVedrqOk0000000000|Nj6000000 -0t$0Lb#i5700jX62mxA;a|tC)BU>oS@xONigke(HCtahRyiRHf-T%M}yz;kwbCmqWQ?a(0yP=wbe0q{)>8+xQm0q_7={(%B;l;Rh7DJo-_a=L-&HF -sOv&CqLR1V5+fZ307fjWo~0>Wpf1q00{v`?dHP>9R0ZFSEMRj;Km4qfBYZ5UUs>0 -bg9bqiCNA70000000030000000000BR$**qZew{=d2nR~0RR93307}uWK(oubY%q -r0000DS7~%^Wpi^uZewU~as~nlcWHEPWpi^+a%2I*9_-uz)4t;Cj{=)=I{UE@z&4 -lZ&jV-~loh4~2WiR)cWHEPWpi^$WC4k5SS8KIkY89@$6%;X7qJ(R#b4x^L3+^xAn -+qc8}SNPX>@L7b8}B}WCQ{L2XAgeXklq?00jX74!^kVIAU(3gSs^H6!}zj=~mfCH -51$?7#2KZw&97f0SIqqWI@j018)WbZ%vHb5L({1_B0XWoc(~ -Wpi|4ZEyepNEBE@Xklq?LTqVnWK(5fY*ctqbaDg&00&}ebYpL6ZU6-V0;GmOLT8N -;et#gZx9L;fWGSI?Otw`;Q^O{9cC@3U4n`-aE>N`F8f<{_M@^MEhcVy#omh=bI-r -l&{j_4Y)d2=oOFWB>&L0;GmOLT8N;et#gZx9L;fWGSI?Otw`;Q^O{9cC@3U4n -`-aE>N`F8f<{_M@^MEhcVy#omh=bI-rl&{j_4Y)e~4lXklq?LTqVnWK(5fY*ct@W -CQ{L2V!Y-V{d7000jX8q=rC3XN?hle;}{7=~LchDWP&qwpB$_!zOliw4oUbhHyi-Y#=22)QEgSwgoUbhHyi-Y#=22)QEgSwg?<6X>I@o0Rp6kKtgAY5q^Ilue -a$_-ef7Ea!j^WMN`8jc6PL*qz(hsG?42=b&6>T7_z0LJs9vI3^Q`9-kMwahgh8>B -Ygn|Y-w?IX=DHe0Rp6kKtgAY5q^Iluea$_-ef7Ea!j^WMN`8jc6PL*qz(hsG?42= -b&6>T7_z0LJs9vI3^Q`9-kMwahgh8>BYhB9Lug@XZc}Ara%FT=WnpXt0sseMX>?< -6X>I@o0Rp6kKtgAY5q^Iluea$_-ef7Ea!j^WMN`8jc6PL*qz-5q>%7&o7^|1Fn59 -cLW!>7R25;!;B%7&o7^|1Fn59cLW!>7R25;!;B#Kd;Rz-U=aO9W+B0S0Voadl~A00jX8^=uPjBlbC -`N(qzPM@Gr{imSMTSY5T*7C#t%#3&jHqk=;7%h%D+p%U7S;b1RT)c9`>#Kd;Rz-U -=aO9W+B +gdIoc2a%pgM0$i{(k=DuM$QKdrry9#1TdpOKse5vu1&=u{+IqgZbCdUAcyL4!ji% +3ykIV>*V`ybVZDn*}WMOn+0! +XQB?8_As^WnPDotHzoVsdtr@aSRwVWi2G1l#x)ziR}e6rQG)02XJT?*g=|B=zREi +e$*y(7k2+*P~cYjR$9JZ(?C=a{vkf)$WoGNrn+a000000RI300000 +000(kqWMyS-a{vheM(yUq2ps*m=2xUDT;RqCgn#@WzFu~@adfH5^@&-|00000000 +00{{R30000003t@9}X=iS2Wo~qH015$z{^Dg=h-~N_zJ`Red1EINWrM}GXaQb}6c +#qIM2EQnHo-KZ`k;Xmr`<4sJYKN!!u{G5u+^j1lf!PF4>GEG0000000000{{R300 +000033g#@Wo~0>Wpe-t0Y>fS!w4MxxaL=+DqP^k2!wz9AHH68xp8!<%Jqp^&Hw-a +000000RI300000001ZWWbY*UHX>V>+d2nR~0RR9314d?c1pxp60u4rWZf9v?Y-Lk +)VRU5#0SE?SX>@ZoGynww000OKMs;pyX<}?;RC#b^0|5Uo2? +YlHei-0Jn%?h9c2>uJC38-{*D7fZ(%hZo23R4S;p`Q9JBQllDytVQh3vVR>b8b1? +xVS5nwzfbg8kY9lvP5=0UVRLh3bW~wya{(zO4hF%Q&3 +qd{UvF)tP|M@Vc@bh1|A(%Z=^thBTg(V;WprU=VRT^u;b~{_$H8YPU!!A-5yM58( +94FP(7*JmC%?~bN>dRB2WM<=Vqt7^0owP`H}~XwW|nkt{7-&IWbpPi(wX$0pXUqF +<#0Z84+~*)b7^O8ZDnqBa{(&yMM2gb*yIgxLg7xQ_Wp*<{#EXTnHMp{o_cMFjX() +@VQgh?V`*h`0o{dW0B>Pr5ftu@@z<*O39}j`u&O7io3b$Is?RA$O$KRmb9H5M0ix +1^1KGjKL;n+-tOZHsZ4l|5$r%8I8frlHV#NU|*#>iCa%pgM0$i{(k=DuM$QKdrry +9#1TdpOKse5vu1&=u{+IqgZbCdUAcyL4!ji%3ykIKfZ0 +H=mhJ>?uVa{vheM(yUq2ps*m=2xUDT;RqC +gn#@WzFu~@adfH5^@&-|0000000000{{R30000002}f*iVqt7ga%2Vq4R>jDZe?? +GL2hGcZ*l+x0ssVVZ*FA(00035b8l^B00jX7SQ3>DAd9q3vF!EgI>niq&gF@?Xwk +09NOmoW?4BAt18HP<0006DM{I9mVQf=$VRU5$0RRdC)$WoGNrc;Wm98lWo=;w0tItrZAoMTNU3b>%M}yz;kwbC +mqWQ?a(0yP=wbe0q{)>8+xQm0YXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYO +j2yJ0_Npxjxa{vGW4@YcoVqt7kbYXO5RC#b^1pxp60t`oNZ(?C=R$**)Wpf1q00; +s9Xk);5Qh;gshq!{{oTC#gIzF4hFN<*P1RquLWiVd>0000000030{{R3000005Np +5g;bOr(kaB^jKPjz$wlMuXsu{2tXFT+?;?hj39&>gq>HOrf1lB-q;n)I5N2y$g}W +pZ|9WCC2UG?CWH%$n#j0HLDJN5-IKgM_J7b(p+0MPGk2Gl)y2(Rz0hP$+dLD +IRU(}XWLTZugenOC;Z(5k~zEJnJiX;;E#Q^{S000000RR600000000v2JaCLNZ1p +xpF0o9FP2n?Horiuqf0^m>2O`jNRziT$b7#=ya6uYYC;s5{u000000RR60000000 +0v2Ob9H5M1pxpE002M$0000000030{{R3000009O=Vl +VPs)+VFdvI2mk;;0000000000|Nj60000003r}NXb#iiLZewM01_A?ZX>I@j0t0P +fcmMzb3{P-FZ*6U9bZupBbOs6oW@dH)+M7`mSQb`xkca!3Ycu5$>lN%N|>M?JbaMh+ur!g +@$>Ycu5$>lN%N|>Clv)aMjKgwAH@`bu1x<7g|G$};xvA~n-$_S2y$g)Wo2z;WCC2UG?CWH< +H#2g?xz~d9$T&@kEwfdpaqXPF4}s&xpQr=t;O}HAO^^zqT0%g+nC0;-MWK<)&Ge4 +`aq}l(*_B4VQgh?V`*h`0$i{(k=DuM$QKdrry9#1TdpOKse5vu1&=u{+IqgZb8WA +!#r3Bk2FRnL+RBXEn8vr=x`Tq%|A_kfK&ST81_yU(bZ%vHa{^qjG?CWH+ +NwrBxfixd_%u|$Wt0&Z^r00JIQb#!obbU|}-X=iS2Wo~p*Wp-s@Y-MCYbaY{3Xa) +oYZ*XsQbODnPynwMZT8l5kSW@l}O=!>^xB4~9n`Dx!RtcK)nwJD~WnpXq(PtOELl +W@z354$cZcQEw0|O`dPRP3jk}Sl@F(;O)1#@&^bY%f(Q#2q9+*8I)cH*`!s%9_RI +@yuG2CFF!ywLV~14_&XcWHEPWpi@@1#{rZP|m9K(8HSpU8Cxu(AzX*g3wtWgq9@B +6{cBc98Yz0aCLM+b8~5DZf#|5bW&w@WnpY(WJF^xB4~9n`Dx!RtcK)nwJD~WnpXq(PtOELlW@z354$cZcQEw0|O`dPRP +3jk}Sl@F(;O)1#@&^bY%hmXk);5Qh;gshq!{{oTC#gIzF4hFN<*P1RquLWiVd{cW +HEPWpi@@1#{rZP|m9K(8HSpU8Cxu(AzX*g3wtWgq9@B6{cBc9Zz+1aCLM+b8~5DZ +f#|5bW&w@WnpY(WL9Bpb!7$w1#fU~b#wuf5WIk~G+K)5%bR49 +t5yk`^qQ9hb7f&{0nuj{y+ac4_6daU{%%bk3j+fu`A*2Y1(Gbp$uTFEss(d&VRU5 +yZA8ZOFKPukLlqCE=E5w*=z8TWl=ueJ45i$M_H~V*2X|?7Ze??G0R?m5$xzO!^w7 +hb16`x)q0rkjWP;FH9)y-8%N3?sW*JX)bZ~WaL349yXKrm}Zgf^}X=GD$VRU5%1O +;z!Z*_D5lMuXsu{2tXFT+?;?hj39&>gq>HOrf1lB-q;n)I5N1aoC!Yyr_{7rjFg@ +b(FW?*48~9t#5lC;3juy9JUg#K|!ymZ}AFbYXO50WPwo{ujV7L@=1(T$>wOY}Ov_ +b`4?P%YY`+Wb+o`y9ak^bZ%vHa{&c&;K@+Vs`Svqn*&{=>Y>ovG-QI%SssLzB+C` +1S!NPYWn^V?b7gKrZ*6U9bZupBbOiwb2LJ#-Api(cWn^V#ZDnKy0RRdCM(yUq2ps +*m=2xUDT;RqCgn#@WzFu~@adfH5^@&-|0hP$+dLDIRU(}XWLTZugenOC;Z(5k~zE +JnJiX;;E#Q*>R000000RI300000001i@Rc4c8~Wn@8gbYWv?1_J_VWC4V64U;TR^ +uxCZOKFR+hj1x=Ibox +?`Aroor<$W|05z3@o%yggKU%$CX5lEZwTb6rTk%m8Md`Zf +607xcDo(^rWT@v%fz@xDS+Wc!R^OQf-s;Z=(UIZb#Y!bYW)!$&Z?;!v;$l{rzVfm +%J+c{!D0(A9Khp>v3=AX`3Ri22*2bWo=;w3Ik?lb^+R(Q4?4eR(6nw`EY++|}0$i{(k=DuM$QKdrry9#1TdpOKse5vu1&=u{+Iqg +ZbCdUAcyL4!ji%3ykI}5vZY(~FzYeIdN` +S$)9l7ap=09=fBme*a000000RI3000000019t+Ze?Utd2nTO015$z{^Dg=h-~N_z +J`Red1EINWrM}GXaQb}6c#qIM2EQnILZ{@g(An}If6!%vcs8JbyKG3$_x(S=#`1O +iFX_G0000000000{{R300000040d5`Wo~16RC#b^a{vheM(yUq2ps*m=2xUDT;Rq +Cgn#@WzFu~@adfH5^@&-|0000000000{{R30000002WMq&WpinB0jom)3dE3VMG* +K@Uj`&9O$m&URampr+czw5j9K7JLkeYhbY*UHX>V?G015$Qbsj>g6`?#s5rWnKhS +eO?L~x^!;Y#eFP|P}0Z%Ez&X0(@tkHmR7VBa*7>vj^5vkt5f(LFa*EmC9=2$WE90 +000000000{{R30000003v_Z}ZgXjLX>V?G015##QV*^ZmKt8YDf|&5KZQ>65I6*X +)C9iYp+?yjr7~y%y~l5O%01=Zemts_^ihs!<5V6J4m)zlTf>a0FkQJXa(QqD}&I_X{w-LKi^UYb7O +L8aC8Bj$sIC?*mL}+GhP8%Hk1q8Y4d}kLL#7L8UbhinjD%4Q)6glZDC1d1pxpD00 +2NB00vWIa%pgM1OWjBVQh6)Z2$!U0iycqo^V{8k<8oOM(vMq<&O0fgFeVUTx7LsT +fM0r~W- +2xhK9cV^W63=w?&L0!XQB?8_A +s^WnPDotHzoVsdtr@aSRwVWi2G1l#x)ziR}e6rQG)02XJT?*g=|B=zREie$*y(7k +2+*P~cYjROi{baY{3Xl-R~bN~eb0YWfgg^0-1s}v?c$Nk9{EX~mW5dRI6fB-~%h? +?EZc?wi=VQzD2bZKvH1_}daW_AJEn^6;37FKqUhx?i3R+Mr!fY&(;2BFL(m@EZk_ +srD_V{dMBa$#e1Nn`<^2rNlD$O59e#ogQsB77jPl+h5j^*S;RbaG*C +b7^#GZ*Ek1aAg5BQV*^ZmKt8YDf|&5KZQ>65I6*X)C9iYp+?yjr7~y;ZDn*}WMOn ++0pV$9@yEeuC|{#vixI;`n9$3HpwPecswcnCZc0-T2M1?tZ(?C=a{=1-(Kq+xduE +n&aQshxM`ZB!HPV^%o}cFn(dBSHa}Ne-Zg6#Ua{;NMdRLRko603iZGCpt_aPM;f< +qRwaPp@14+5S%nScvnb8~5DZf#|5baMfq0zdO*dUpyI8%sl0vW;OZAXH%ada&2pt +lsI;%gD6}c42H~ZewX>a{=9jW&m$tWDykZj`7#3_zANbB(SO{shhGe=&H{tM@@L7b8`Y*ur!g@$>Ycu5$>lN%N|>oKLkF4~iax8KK|47hp*b7OL8aC8D(ur!g@$>Ycu5$>lN%N|>oKLkF4~iax8KK|47hp_RB~Z%b7^#GZ* +D?$Ze(m_1_KLYY;SXAO=WawZ)5^jOArOBco9q3Z{KKv)vC7^$L@1|0qs!Eo=4C5O +;-vow-6<{ZeNoKcy!1~?PoRaGZX>M?JbWLG!0Tr2NWXrXy +KnGOwA#t$mH2bG7pQ)aE=^FQF!@KkQh!AUTZ+C7~a$#@6CZgT(%0hP$+dLDI +RU(}XWLTZugenOC;Z(5k~zEJnJiX;;E#Q`SIFNo!HN~lqHg;>vsoU&`ys3~=1W<7 +?!)Pf^s=!pRU000000096000000000nFa$#@6CZc}4uWo=;w1qf|rbYWy+bY +TKWsch`a6%+H}y3w7NL%Cvdc9ihwVg6yH$(01#_!hrw1fvw5rj-B|XP@r^w5ufb= +C_Ju$l1`nW&GEpSWb-xXKZg`VQg~%3IWybk`76TvuW{aQ_%-X`?VwZ$5L?~`!+pR +Sq0(b70UrO!8D=zpn(&o-7tVWUa<1Q{n`|;)uYyv!)~4rGOBq100000000300000 +000006X>M?JbaMa-0f+wLWmt%8=p4R=gtK{LClh6Z#kObxUW*hKHnBv9xdAr8G@< +&SffJ|QFn~N>u=2wF+7z(Wqt=tdZk`V^s(Ana000000093000000000YNb8~5DZf +#|5baMa-0f+wLWmt%8=p4R=gtK{LClh6Z#kObxUW*hKHnBv9xdAr8G@<&SffJ|QF +n~N>u=2wF+7z(Wqt=tdZk`V^s(Ana000000093000000000SgVQgh?V`*h`00{v` +?dHP>9R0ZFSEMRj;Km4qfBYZ5UUs>0bg9bqiCNA70000000030000000000ERB~Z +%b7^#GZ*Ek1aAgGn0006GRC#b^LvL+uX>@I6Zgd0#00(DfZe??6a{vVa0b=`mwXw +eWii#yt;JPzT=07DL?mWV*atc60_ZMDv#sLa+a$#@6CZU6-W0iOsgNjk^^qP +oT1+zTRnAg`3vXv9d*8d@RXy~6c6G66JF53UoI8eY9A{1GERg--GiI0S#x1is&)M +%fmnGH3z`Wq5RDZgXjGZU6-W0iOsgNjk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6 +G67_D9zv-Vp*%wog4O?q)g04AaHEjnO6;Ie%sNwVNZuM$d2nT9L349yXKr&sY-w& +}Q)OXnRCrKyas&hb3uI+uY+-U?bZK^F00jX62mv`K^WREqS2tt~EBII@xVqZNcP` +ond^UU-JbUWd$~FK100000009600000000039W_507X<}?;00jX62m#u~=^e=I{= +p`1zMng|0+NmwUpUW`Z@54^_oW>WVpRYD0000000960000000006Cb98cbV{~&L00;qEk8=qnO(R<< +%JIK<1B78x*e6}1oxDzJ3ElvocGBqp0000000030{{R30000303So3~VPj}*Wo~o +;1pxpE0m(AD*LcpQ8@w}U$Ufy>Q8MyKC)}>Xt~#}1xwH`_Bme*a000000RR60000 +0000mTeaAk7@0RaYcbaH89bN~eb0!XQB?8_As^WnPDotHzoVsdtr@aSRwVWi2G1l +#x)zof7oiPG643gHJ7x;*+(o97D-WiY6OyHAPayt955WqH<>CXdb8I%>K1P5u#33q99Ze??GNn`>o?Kom?q=ULN^A!11b?H{wM>P}NCm0qyW47Umu>lBgW@bZZVQFpv000VCX +>@L7b8}E{a|QwiXk}??<6X>I@o0RmS`5Cy7u5lh%_-)Mo=s<#%$?sI(s?NH91N6-09R|-Z +as4h^n+Zt?u@<&aTIfpUd`<+;gOgf;C*Zs6&x77g#Y-w?IX=DHe0RmS`5Cy7u5lh +%_-)Mo=s<#%$?sI(s?NH91N6-09R|-Zas4h^n+Zt?u@<&aTIfpUd`<+;gOgf;C*Z +s6&x78C^Lug@XZbEEnZe&wsVQf@*X=DTf00&}ebYpL6ZU6-V0#{2A1*&)vOW1GUX +o1zLw-(3lbA18rP|lu5&-qPP3b4j;u7-Qt<6xS@-s>{OM>iY*&c?b?aZznm(1lyi +>j4IAX>oOFWB>&L0#{2A1*&)vOW1GUXo1zLw-(3lbA18rP|lu5&-qPP3b4j;u7-Q +t<6xS@-s>{OM>iY*&c?b?aZznm(1lyi>lRo;Xklq?MR;&*X=7=0Q)OXnRCsA*1Of +mDVrg_^Z)t7-1pxwAOArOBco9q3Z{KKv)vC7^$L@1|0qs!Eo=4C5O;-v7)ijXnM0 +JX32^g}aq&*n$Aq+EetlpYi`G;7YBO`qQ25f0@b!lV(1pxwAOArOBco9q3Z{KKv) +vC7^$L@1|0qs!Eo=4C5O;-v7)ijXnM0JX32^g}aq&*n$Aq+EetlpYi`G;7YBO`qf +SVL%GX>LL?_X=DTf00&}ebYpL6ZU6-V0`+VYVk7oBr +%DNv+($;q`HHK!gIHa)*%m(-e#9sm3ZsHT^UK%K(4i9Ajp1M~R@C@!4#dQE#lUD; +OiKi1RsjZVX>oOFWB>&L0`+VYVk7oBr%DNv+($;q`HHK!gIHa)*%m(-e#9sm3ZsH +T^UK%K(4i9Ajp1M~R@C@!4#dQE#lUD;OiKi1Rs -----END STRICT TYPE LIB----- diff --git a/stl/RGB@0.1.0.stl b/stl/RGB@0.1.0.stl index 460276ee..a6f3ffa7 100644 Binary files a/stl/RGB@0.1.0.stl and b/stl/RGB@0.1.0.stl differ diff --git a/stl/RGB@0.1.0.sty b/stl/RGB@0.1.0.sty index ea70b65d..d3de82eb 100644 --- a/stl/RGB@0.1.0.sty +++ b/stl/RGB@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: urn:ubideco:stl:6Yx8ib21pu6se8asaV7z9MQNUuemRZ8iQWhFZFBWcsDp#java-navy-xray + Id: urn:ubideco:stl:7oRjK3fd128oNpMWv1ajhBZq6EotU5Zn1sd3LNNADv4w#laptop-humor-film Name: RGB Version: 0.1.0 Description: Consensus layer for RGB smart contracts @@ -28,14 +28,7 @@ import StrictTypes#5teCJyjMWaxbQK8vdga2soWh2U7waERS3ev8KHShJcgv#trumpet-scratch- use Variant#textile-cowboy-dragon use UnionVariantsSemId#iceberg-road-crack -import CommitVerify#7EpM1uymEteG4g4xmF5ntKYX1wXXpbQj5iLiDreH4jWa#protein-donald-cool - use MerkleHash#culture-metro-modular - use StrictHash#cheese-final-locate - use MerkleProof#labor-hilton-magenta - use ReservedBytes1#joker-lemon-mental - use ReservedBytes2#pocket-habitat-soviet - -import BPCore#C5EbVby4rry8esHwoPrGUfhe7yqJgoyA1DBcyuBRf2rZ#granite-target-table +import BPCore#6skrch4mJzDzVaTYnCgCxFJLw23SSUxNhK7PKgPdSapR#roof-parent-reunion use TapretNodePartner#iceberg-poker-active use ExplicitSealTxid#antenna-darwin-emotion use TapretProof#forum-paint-tunnel @@ -44,12 +37,16 @@ import BPCore#C5EbVby4rry8esHwoPrGUfhe7yqJgoyA1DBcyuBRf2rZ#granite-target-table use TapretRightBranch#basket-prelude-bridge use BlindSealTxPtr#austria-icon-waiter use OpretProof#segment-ambient-totem - use AnchorMerkleProofTapretProof#everest-laura-modem use SecretSeal#santana-domingo-needle - use AnchorMerkleProofOpretProof#cable-final-podium use BlindSealTxid#kimono-golf-price use TxPtr#strange-source-father +import CommitVerify#7EpM1uymEteG4g4xmF5ntKYX1wXXpbQj5iLiDreH4jWa#protein-donald-cool + use MerkleHash#culture-metro-modular + use StrictHash#cheese-final-locate + use ReservedBytes1#joker-lemon-mental + use ReservedBytes2#pocket-habitat-soviet + import AluVM#DVtm25LRKU4TjbyZmVxPhvCmctZ6vKkPKqfpU2QsDNUo#exodus-axiom-tommy use LibSite#mission-papa-mercy use LibId#rebel-factor-rodeo @@ -79,14 +76,12 @@ data AltLayer1Set : {AltLayer1 ^ ..0xff} @mnemonic(soviet-arsenal-complex) data AluScript : libs {AluVM.LibId -> ^ ..0xff [Byte]}, entryPoints {[Byte ^ 3] -> AluVM.LibSite#mission-papa-mercy} -@mnemonic(status-motel-economy) -data AnchorSet : tapret#1 BPCore.AnchorMerkleProofTapretProof#everest-laura-modem - | opret BPCore.AnchorMerkleProofOpretProof#cable-final-podium - | dual (tapret BPCore.AnchorMerkleProofTapretProof#everest-laura-modem, opret BPCore.AnchorMerkleProofOpretProof#cable-final-podium) - @mnemonic(buzzer-pattern-craft) data AssetTag : [Byte ^ 32] +@mnemonic(silicon-brush-horizon) +data AssetTags : {AssignmentType -> ^ ..0xff AssetTag} + @mnemonic(robin-blitz-andrea) data AssignRevealedAttachBlindSealTxPtr : confidential (seal XChainSecretSeal , state ConcealedAttach @@ -215,13 +210,14 @@ data AssignmentsBlindSealTxid : {AssignmentType -> ^ ..0xff TypedAssignsBlindSea @mnemonic(delta-member-agenda) data AttachId : [Byte ^ 32] -@mnemonic(magenta-forward-capitan) +@mnemonic(nominal-decade-fiona) data BaseCommitment : flags CommitVerify.ReservedBytes1#joker-lemon-mental , schemaId SchemaId , timestamp I64 , testnet Std.Bool#laser-madam-maxwell , altLayers1 CommitVerify.StrictHash#cheese-final-locate , issuer CommitVerify.StrictHash#cheese-final-locate + , assetTags CommitVerify.StrictHash#cheese-final-locate @mnemonic(agenda-ivory-blast) data BlindingFactor : [Byte ^ 32] @@ -253,6 +249,10 @@ data ContractState : schema Schema, history ContractHistory @mnemonic(diana-archive-liquid) data DataState : [Byte] +@mnemonic(fidel-swim-chicago) +data DbcProof : tapret#1 BPCore.TapretProof#forum-paint-tunnel + | opret BPCore.OpretProof#segment-ambient-totem + @mnemonic(balance-sector-virus) data Extension : ffv Ffv , contractId ContractId @@ -285,13 +285,14 @@ data FungibleState : bits64#8 U64 data FungibleType : unsigned64Bit#8 -@mnemonic(yoyo-bravo-orion) +@mnemonic(ceramic-sound-maestro) data Genesis : ffv Ffv , schemaId SchemaId , flags CommitVerify.ReservedBytes1#joker-lemon-mental , timestamp I64 , testnet Std.Bool#laser-madam-maxwell , altLayers1 AltLayer1Set + , assetTags AssetTags , metadata Metadata , globals GlobalState , assignments AssignmentsBlindSealTxid @@ -441,8 +442,10 @@ data Transition : ffv Ffv , witness CommitVerify.ReservedBytes1#joker-lemon-mental , script CommitVerify.ReservedBytes1#joker-lemon-mental -@mnemonic(museum-result-logic) -data TransitionBundle : inputMap InputMap, knownTransitions {OpId -> ^ 1.. Transition} +@mnemonic(nancy-current-menu) +data TransitionBundle : closeMethod BPCore.Method#trilogy-tahiti-valid + , inputMap InputMap + , knownTransitions {OpId -> ^ 1.. Transition} @mnemonic(fiction-caramel-fractal) data TransitionSchema : metadata StrictTypes.SemId#cargo-plasma-catalog diff --git a/stl/Transition.vesper b/stl/Transition.vesper index 43499b91..4916f54b 100644 --- a/stl/Transition.vesper +++ b/stl/Transition.vesper @@ -20,6 +20,7 @@ OpCommitment rec testnet enum Bool false=0 true=1 altLayers1 bytes len=32 aka=StrictHash issuer bytes len=32 aka=StrictHash + assetTags bytes len=32 aka=StrictHash transition tuple tag=1 _ bytes len=32 aka=ContractId _ is U16 aka=TransitionType