From 3af0aef26f90f48acd91d8fb3e9608beb165a6e3 Mon Sep 17 00:00:00 2001 From: Mattie Conover Date: Mon, 3 Jul 2023 13:46:14 -0700 Subject: [PATCH 001/142] Stubs --- rust/Cargo.lock | 1238 +++++++++++------ rust/Cargo.toml | 2 + rust/chains/hyperlane-cosmos/.gitignore | 1 + rust/chains/hyperlane-cosmos/Cargo.toml | 26 + rust/chains/hyperlane-cosmos/build.rs | 8 + .../hyperlane-cosmos/src/interchain_gas.rs | 44 + rust/chains/hyperlane-cosmos/src/lib.rs | 21 + rust/chains/hyperlane-cosmos/src/mailbox.rs | 121 ++ .../hyperlane-cosmos/src/multisig_ism.rs | 35 + rust/chains/hyperlane-cosmos/src/provider.rs | 33 + .../hyperlane-cosmos/src/routing_ism.rs | 32 + .../hyperlane-cosmos/src/trait_builder.rs | 46 + .../src/validator_announce.rs | 50 + 13 files changed, 1225 insertions(+), 432 deletions(-) create mode 100644 rust/chains/hyperlane-cosmos/.gitignore create mode 100644 rust/chains/hyperlane-cosmos/Cargo.toml create mode 100644 rust/chains/hyperlane-cosmos/build.rs create mode 100644 rust/chains/hyperlane-cosmos/src/interchain_gas.rs create mode 100644 rust/chains/hyperlane-cosmos/src/lib.rs create mode 100644 rust/chains/hyperlane-cosmos/src/mailbox.rs create mode 100644 rust/chains/hyperlane-cosmos/src/multisig_ism.rs create mode 100644 rust/chains/hyperlane-cosmos/src/provider.rs create mode 100644 rust/chains/hyperlane-cosmos/src/routing_ism.rs create mode 100644 rust/chains/hyperlane-cosmos/src/trait_builder.rs create mode 100644 rust/chains/hyperlane-cosmos/src/validator_announce.rs diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 0754638d8b..89b969ef8a 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -104,9 +104,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" dependencies = [ "getrandom 0.2.10", "once_cell", @@ -115,21 +115,22 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" dependencies = [ "cfg-if", "getrandom 0.2.10", "once_cell", "version_check", + "zerocopy", ] [[package]] name = "aho-corasick" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea5d730647d4fadd988536d06fecce94b7b4f2a7efdae548f1cf4b63205518ab" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] @@ -279,7 +280,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", "synstructure", @@ -291,7 +292,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -304,9 +305,9 @@ checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" [[package]] name = "async-compression" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb42b2197bf15ccb092b62c74515dbd8b86d0effd934795f6687c93b6e679a2c" +checksum = "f658e2baef915ba0f26f1f7c42bfb8e12f532a01f449a090ded75ae7a07e9ba2" dependencies = [ "brotli", "flate2", @@ -342,20 +343,20 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] name = "async-trait" -version = "0.1.73" +version = "0.1.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -405,7 +406,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7862e21c893d65a1650125d157eaeec691439379a1cee17ee49031b79236ada4" dependencies = [ "proc-macro-error", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -417,7 +418,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fee3da8ef1276b0bee5dd1c7258010d8fffd31801447323115a25560e1327b89" dependencies = [ "proc-macro-error", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -457,6 +458,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + [[package]] name = "base58" version = "0.1.0" @@ -487,9 +494,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.4" +version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" [[package]] name = "base64ct" @@ -542,12 +549,12 @@ dependencies = [ "lazycell", "peeking_take_while", "prettyplease", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "regex", "rustc-hash", "shlex", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -558,9 +565,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" dependencies = [ "serde", ] @@ -700,7 +707,7 @@ dependencies = [ "borsh-derive-internal 0.9.3", "borsh-schema-derive-internal 0.9.3", "proc-macro-crate 0.1.5", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "syn 1.0.109", ] @@ -713,7 +720,7 @@ dependencies = [ "borsh-derive-internal 0.10.3", "borsh-schema-derive-internal 0.10.3", "proc-macro-crate 0.1.5", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "syn 1.0.109", ] @@ -723,7 +730,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -734,7 +741,7 @@ version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -745,7 +752,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -756,16 +763,16 @@ version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] [[package]] name = "brotli" -version = "3.3.4" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" +checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -774,9 +781,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.3.4" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" +checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -842,7 +849,7 @@ version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -862,16 +869,16 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" @@ -924,9 +931,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cfa25e60aea747ec7e1124f238816749faa93759c6ff5b31f1ccdda137f4479" +checksum = "12024c4645c97566567129c204f65d5815a8c9aecf30fcbe682b2fe034996d36" dependencies = [ "serde", ] @@ -1057,9 +1064,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.6" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d04704f56c2cde07f43e8e2c154b43f216dc5c92fc98ada720177362f953b956" +checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b" dependencies = [ "clap_builder", "clap_derive", @@ -1067,26 +1074,26 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.6" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e231faeaca65ebd1ea3c737966bf858971cd38c3849107aa3ea7de90a804e45" +checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663" dependencies = [ "anstream", "anstyle", - "clap_lex 0.5.1", + "clap_lex 0.6.0", "strsim 0.10.0", ] [[package]] name = "clap_derive" -version = "4.4.2" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873" +checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" dependencies = [ "heck 0.4.1", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -1100,9 +1107,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.5.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" [[package]] name = "cobs" @@ -1122,7 +1129,7 @@ dependencies = [ "digest 0.10.7", "getrandom 0.2.10", "hmac 0.12.1", - "k256", + "k256 0.11.6", "lazy_static", "serde", "sha2 0.10.8", @@ -1342,6 +1349,36 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +[[package]] +name = "cosmos-sdk-proto" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73c9d2043a9e617b0d602fbc0a0ecd621568edbf3a9774890a6d562389bd8e1c" +dependencies = [ + "prost", + "prost-types", + "tendermint-proto", +] + +[[package]] +name = "cosmrs" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af13955d6f356272e6def9ff5e2450a7650df536d8934f47052a20c76513d2f6" +dependencies = [ + "cosmos-sdk-proto", + "ecdsa 0.16.8", + "eyre", + "getrandom 0.2.10", + "k256 0.13.1", + "rand_core 0.6.4", + "serde", + "serde_json", + "subtle-encoding", + "tendermint", + "thiserror", +] + [[package]] name = "counter" version = "0.5.7" @@ -1353,9 +1390,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" dependencies = [ "libc", ] @@ -1371,9 +1408,9 @@ dependencies = [ [[package]] name = "crc-catalog" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cace84e55f07e7301bae1c519df89cdad8cc3cd868413d3fdbdeca9ff3db484" +checksum = "4939f9ed1444bd8c896d37f3090012fa6e7834fe84ef8c9daa166109515732f9" [[package]] name = "crc32fast" @@ -1473,6 +1510,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "crypto-bigint" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740fe28e594155f10cfc383984cbefd529d7396050557148f79cb0f621204124" +dependencies = [ + "generic-array 0.14.7", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -1554,6 +1603,19 @@ dependencies = [ "zeroize", ] +[[package]] +name = "curve25519-dalek-ng" +version = "4.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.6.4", + "subtle-ng", + "zeroize", +] + [[package]] name = "cynic" version = "2.2.8" @@ -1578,7 +1640,7 @@ dependencies = [ "darling 0.13.4", "graphql-parser", "once_cell", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "strsim 0.10.0", "syn 1.0.109", @@ -1622,7 +1684,7 @@ checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "strsim 0.10.0", "syn 1.0.109", @@ -1636,7 +1698,7 @@ checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "strsim 0.10.0", "syn 1.0.109", @@ -1727,10 +1789,11 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" +checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" dependencies = [ + "powerfmt", "serde", ] @@ -1746,7 +1809,7 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -1757,7 +1820,7 @@ version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3418329ca0ad70234b9735dc4ceed10af4df60eff9c8e7b06cb5e520d92c3535" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -1778,7 +1841,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c11bdc11a0c47bc7d37d582b5285da6849c96681023680b906673c5707af7b0f" dependencies = [ "darling 0.14.4", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -1800,7 +1863,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ "convert_case 0.4.0", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "rustc_version", "syn 1.0.109", @@ -1890,9 +1953,9 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -1956,10 +2019,24 @@ checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" dependencies = [ "der 0.6.1", "elliptic-curve 0.12.3", - "rfc6979", + "rfc6979 0.3.1", "signature 1.6.4", ] +[[package]] +name = "ecdsa" +version = "0.16.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" +dependencies = [ + "der 0.7.8", + "digest 0.10.7", + "elliptic-curve 0.13.6", + "rfc6979 0.4.0", + "signature 2.1.0", + "spki 0.7.2", +] + [[package]] name = "ecdsa-signature" version = "0.1.0" @@ -1979,13 +2056,36 @@ dependencies = [ "signature 1.6.4", ] +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8 0.10.2", + "signature 2.1.0", +] + +[[package]] +name = "ed25519-consensus" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c8465edc8ee7436ffea81d21a019b16676ee3db267aa8d5a8d729581ecf998b" +dependencies = [ + "curve25519-dalek-ng", + "hex 0.4.3", + "rand_core 0.6.4", + "sha2 0.9.9", + "zeroize", +] + [[package]] name = "ed25519-dalek" version = "1.0.1" source = "git+https://github.com/Eclipse-Laboratories-Inc/ed25519-dalek?branch=main#7529d65506147b6cb24ca6d8f4fc062cac33b395" dependencies = [ "curve25519-dalek", - "ed25519", + "ed25519 1.5.3", "rand 0.7.3", "serde", "sha2 0.9.9", @@ -2011,7 +2111,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f0042ff8246a363dbe77d2ceedb073339e85a804b9a47636c6e016a9a32c05f" dependencies = [ "enum-ordinalize", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -2031,7 +2131,7 @@ version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25b477563c2bfed38a3b7a60964c49e058b2510ad3f12ba3483fd8f62c2306d6" dependencies = [ - "base16ct", + "base16ct 0.1.1", "crypto-bigint 0.3.2", "der 0.5.1", "generic-array 0.14.7", @@ -2046,16 +2146,35 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" dependencies = [ - "base16ct", + "base16ct 0.1.1", "crypto-bigint 0.4.9", "der 0.6.1", "digest 0.10.7", - "ff", + "ff 0.12.1", "generic-array 0.14.7", - "group", + "group 0.12.1", "pkcs8 0.9.0", "rand_core 0.6.4", - "sec1", + "sec1 0.3.0", + "subtle", + "zeroize", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d97ca172ae9dc9f9b779a6e3a65d308f2af74e5b8c921299075bdb4a0370e914" +dependencies = [ + "base16ct 0.2.0", + "crypto-bigint 0.5.3", + "digest 0.10.7", + "ff 0.13.0", + "generic-array 0.14.7", + "group 0.13.0", + "pkcs8 0.10.2", + "rand_core 0.6.4", + "sec1 0.7.3", "subtle", "zeroize", ] @@ -2096,22 +2215,22 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8958699f9359f0b04e691a13850d48b7de329138023876d07cbd024c2c820598" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] [[package]] name = "enum-ordinalize" -version = "3.1.13" +version = "3.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4f76552f53cefc9a7f64987c3701b99d982f7690606fd67de1d09712fbf52f1" +checksum = "1bf1fa3f06bbff1ea5b1a9c7b14aa992a39657db60a2759457328d7e058f49ee" dependencies = [ "num-bigint 0.4.4", "num-traits", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -2121,9 +2240,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f33313078bb8d4d05a2733a94ac4c2d8a0df9a2b84424ebf4f33bfc224a890e" dependencies = [ "once_cell", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -2160,25 +2279,14 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.3" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd" +checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" dependencies = [ - "errno-dragonfly", "libc", "windows-sys 0.48.0", ] -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] - [[package]] name = "etcetera" version = "0.8.0" @@ -2337,7 +2445,7 @@ dependencies = [ "eyre", "getrandom 0.2.10", "hex 0.4.3", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "regex", "reqwest", @@ -2357,7 +2465,7 @@ dependencies = [ "ethers-contract-abigen", "ethers-core", "hex 0.4.3", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "serde_json", "syn 1.0.109", @@ -2377,10 +2485,10 @@ dependencies = [ "ethabi", "generic-array 0.14.7", "hex 0.4.3", - "k256", + "k256 0.11.6", "once_cell", "open-fastrlp", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "rand 0.8.5", "rlp", "rlp-derive", @@ -2571,6 +2679,16 @@ dependencies = [ "subtle", ] +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "filetime" version = "0.2.22" @@ -2614,14 +2732,24 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ "crc32fast", "miniz_oxide", ] +[[package]] +name = "flex-error" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c606d892c9de11507fa0dcffc116434f94e105d0bbdc4e405b61519464c49d7b" +dependencies = [ + "eyre", + "paste", +] + [[package]] name = "float-cmp" version = "0.9.0" @@ -2887,7 +3015,7 @@ dependencies = [ "fuel-abi-types", "itertools 0.10.5", "lazy_static", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "regex", "serde_json", @@ -2920,7 +3048,7 @@ dependencies = [ "fuels-code-gen", "itertools 0.10.5", "lazy_static", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "rand 0.8.5", "regex", @@ -2945,7 +3073,7 @@ dependencies = [ "futures", "hex 0.4.3", "itertools 0.10.5", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "rand 0.8.5", "regex", "serde", @@ -3029,7 +3157,7 @@ dependencies = [ "hex 0.4.3", "itertools 0.10.5", "lazy_static", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "regex", "serde", "serde_json", @@ -3046,9 +3174,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" dependencies = [ "futures-channel", "futures-core", @@ -3061,9 +3189,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", "futures-sink", @@ -3071,15 +3199,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" dependencies = [ "futures-core", "futures-task", @@ -3099,9 +3227,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" [[package]] name = "futures-locks" @@ -3115,26 +3243,26 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" [[package]] name = "futures-timer" @@ -3144,9 +3272,9 @@ checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ "futures-channel", "futures-core", @@ -3187,6 +3315,7 @@ dependencies = [ "serde", "typenum", "version_check", + "zeroize", ] [[package]] @@ -3264,7 +3393,18 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" dependencies = [ - "ff", + "ff 0.12.1", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff 0.13.0", "rand_core 0.6.4", "subtle", ] @@ -3284,7 +3424,7 @@ dependencies = [ "indexmap 1.9.3", "slab", "tokio", - "tokio-util 0.7.9", + "tokio-util 0.7.10", "tracing", ] @@ -3303,7 +3443,7 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" dependencies = [ - "ahash 0.7.6", + "ahash 0.7.7", ] [[package]] @@ -3312,7 +3452,7 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash 0.7.6", + "ahash 0.7.7", ] [[package]] @@ -3321,16 +3461,16 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.6", ] [[package]] name = "hashbrown" -version = "0.14.1" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12" +checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.6", "allocator-api2", ] @@ -3349,7 +3489,7 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" dependencies = [ - "hashbrown 0.14.1", + "hashbrown 0.14.2", ] [[package]] @@ -3358,7 +3498,7 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" dependencies = [ - "base64 0.21.4", + "base64 0.21.5", "bytes", "headers-core", "http", @@ -3560,7 +3700,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.9", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -3587,14 +3727,14 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http", "hyper", - "rustls 0.21.7", + "rustls 0.21.8", "tokio", "tokio-rustls 0.24.1", ] @@ -3691,7 +3831,7 @@ dependencies = [ "hex 0.4.3", "itertools 0.11.0", "num 0.4.1", - "num-derive 0.4.0", + "num-derive 0.4.1", "num-traits", "primitive-types", "serde", @@ -3705,6 +3845,21 @@ dependencies = [ "uint", ] +[[package]] +name = "hyperlane-cosmos" +version = "0.1.0" +dependencies = [ + "async-trait", + "cosmrs", + "hyperlane-core", + "serde", + "thiserror", + "tokio", + "tracing", + "tracing-futures", + "url", +] + [[package]] name = "hyperlane-ethereum" version = "0.1.0" @@ -3755,7 +3910,7 @@ dependencies = [ "account-utils", "anyhow", "async-trait", - "base64 0.21.4", + "base64 0.21.5", "borsh 0.9.3", "derive-new", "hyperlane-core", @@ -3788,7 +3943,7 @@ dependencies = [ "bincode", "borsh 0.9.3", "bs58 0.5.0", - "clap 4.4.6", + "clap 4.4.7", "hex 0.4.3", "hyperlane-core", "hyperlane-sealevel-connection-client", @@ -3853,7 +4008,7 @@ dependencies = [ "borsh 0.9.3", "getrandom 0.2.10", "hyperlane-core", - "num-derive 0.4.0", + "num-derive 0.4.1", "num-traits", "serde", "serializable-account-meta", @@ -3892,7 +4047,7 @@ version = "0.1.0" dependencies = [ "access-control", "account-utils", - "base64 0.21.4", + "base64 0.21.5", "blake3", "borsh 0.9.3", "getrandom 0.2.10", @@ -3901,7 +4056,7 @@ dependencies = [ "hyperlane-sealevel-message-recipient-interface", "itertools 0.11.0", "log", - "num-derive 0.4.0", + "num-derive 0.4.1", "num-traits", "proc-macro-crate 1.2.1", "serializable-account-meta", @@ -3916,7 +4071,7 @@ version = "0.1.0" dependencies = [ "access-control", "account-utils", - "base64 0.21.4", + "base64 0.21.5", "borsh 0.9.3", "hyperlane-core", "hyperlane-sealevel-interchain-security-module-interface", @@ -3927,7 +4082,7 @@ dependencies = [ "hyperlane-test-utils", "itertools 0.11.0", "log", - "num-derive 0.4.0", + "num-derive 0.4.1", "num-traits", "serializable-account-meta", "solana-program", @@ -3963,7 +4118,7 @@ dependencies = [ "hyperlane-sealevel-multisig-ism-message-id", "hyperlane-test-utils", "multisig-ism", - "num-derive 0.4.0", + "num-derive 0.4.1", "num-traits", "serializable-account-meta", "solana-program", @@ -4018,7 +4173,7 @@ dependencies = [ "hyperlane-sealevel-test-ism", "hyperlane-sealevel-token-lib", "hyperlane-test-utils", - "num-derive 0.4.0", + "num-derive 0.4.1", "num-traits", "serializable-account-meta", "solana-program", @@ -4045,7 +4200,7 @@ dependencies = [ "hyperlane-sealevel-test-ism", "hyperlane-sealevel-token-lib", "hyperlane-test-utils", - "num-derive 0.4.0", + "num-derive 0.4.1", "num-traits", "serializable-account-meta", "solana-program", @@ -4070,7 +4225,7 @@ dependencies = [ "hyperlane-sealevel-igp", "hyperlane-sealevel-mailbox", "hyperlane-sealevel-message-recipient-interface", - "num-derive 0.4.0", + "num-derive 0.4.1", "num-traits", "serializable-account-meta", "solana-program", @@ -4095,7 +4250,7 @@ dependencies = [ "hyperlane-sealevel-test-ism", "hyperlane-sealevel-token-lib", "hyperlane-test-utils", - "num-derive 0.4.0", + "num-derive 0.4.1", "num-traits", "serializable-account-meta", "solana-program", @@ -4164,16 +4319,16 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.57" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows", + "windows-core", ] [[package]] @@ -4295,7 +4450,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -4324,12 +4479,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad227c3af19d4914570ad36d30409928b75967c298feb9ea1969db3a610bb14e" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown 0.14.1", + "hashbrown 0.14.2", ] [[package]] @@ -4350,9 +4505,9 @@ version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce243b1bfa62ffc028f1cc3b6034ec63d649f3031bc8a4fbbb004e1ac17d1f68" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -4378,9 +4533,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-terminal" @@ -4419,18 +4574,18 @@ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "jobserver" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" dependencies = [ "wasm-bindgen", ] @@ -4468,12 +4623,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" dependencies = [ "cfg-if", - "ecdsa", + "ecdsa 0.14.8", "elliptic-curve 0.12.3", "sha2 0.10.8", "sha3 0.10.8", ] +[[package]] +name = "k256" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +dependencies = [ + "cfg-if", + "ecdsa 0.16.8", + "elliptic-curve 0.13.6", + "once_cell", + "sha2 0.10.8", + "signature 2.1.0", +] + [[package]] name = "keccak" version = "0.1.4" @@ -4500,9 +4669,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.148" +version = "0.2.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b" +checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" [[package]] name = "libloading" @@ -4516,9 +4685,9 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "librocksdb-sys" @@ -4614,15 +4783,15 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.4.7" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a9bad9f94746442c783ca431b22403b519cd7fbeed0533fdd6328b2f2212128" +checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" [[package]] name = "lock_api" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -4723,9 +4892,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.6.3" +version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] name = "memmap2" @@ -4812,9 +4981,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" dependencies = [ "libc", "wasi 0.11.0+wasi-snapshot-preview1", @@ -4843,7 +5012,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb" dependencies = [ "cfg-if", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -4864,7 +5033,7 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -4936,7 +5105,7 @@ version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.4.1", "cfg-if", "libc", ] @@ -5061,20 +5230,20 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] [[package]] name = "num-derive" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e6a0fd4f737c707bd9086cc16c925f294943eb62eb71499e9fd4cf71f8b9f4e" +checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -5125,9 +5294,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", "libm", @@ -5168,7 +5337,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" dependencies = [ "proc-macro-crate 1.2.1", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -5180,9 +5349,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" dependencies = [ "proc-macro-crate 1.2.1", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -5247,18 +5416,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" dependencies = [ "bytes", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] [[package]] name = "openssl" -version = "0.10.57" +version = "0.10.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bac25ee399abb46215765b1cb35bc0212377e58a061560d8b29b024fd0430e7c" +checksum = "a9dfc0783362704e97ef3bd24261995a699468440099ef95d869b4d9732f829a" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.4.1", "cfg-if", "foreign-types", "libc", @@ -5273,9 +5442,9 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -5286,9 +5455,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.93" +version = "0.9.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db4d56a4c0478783083cfafcc42493dd4a981d41669da64b4572a2a089b51b1d" +checksum = "2f55da20b29f956fb01f0add8683eb26ee13ebe3ebd935e49898717c6b4b2830" dependencies = [ "cc", "libc", @@ -5317,9 +5486,9 @@ dependencies = [ [[package]] name = "ordered-float" -version = "3.9.1" +version = "3.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a54938017eacd63036332b4ae5c8a49fc8c0c1d6d629893057e4f13609edd06" +checksum = "f1e1c390732d15f1d48471625cd92d154e66db2c56645e29a9cd26f4699f72dc" dependencies = [ "num-traits", ] @@ -5336,9 +5505,9 @@ dependencies = [ [[package]] name = "os_str_bytes" -version = "6.5.1" +version = "6.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" [[package]] name = "ouroboros" @@ -5369,7 +5538,7 @@ checksum = "5f7d21ccd03305a674437ee1248f3ab5d4b1db095cf1caf49f1713ddf61956b7" dependencies = [ "Inflector", "proc-macro-error", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -5382,9 +5551,9 @@ checksum = "ec4c6225c69b4ca778c0aea097321a64c421cf4577b331c61b229267edabb6f8" dependencies = [ "heck 0.4.1", "proc-macro-error", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -5420,7 +5589,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "312270ee71e1cd70289dacf597cab7b207aa107d2f28191c2ae45b2ece18a260" dependencies = [ "proc-macro-crate 1.2.1", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -5443,7 +5612,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.8", + "parking_lot_core 0.9.9", ] [[package]] @@ -5462,13 +5631,13 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", + "redox_syscall 0.4.1", "smallvec", "windows-targets 0.48.5", ] @@ -5582,9 +5751,9 @@ dependencies = [ [[package]] name = "pest" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c022f1e7b65d6a24c0dbbd5fb344c66881bc01f3e5ae74a1c8100f2f985d98a4" +checksum = "ae9cee2a55a544be8b89dc6848072af97a20f2422603c10865be2a42b580fff5" dependencies = [ "memchr", "thiserror", @@ -5593,9 +5762,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35513f630d46400a977c4cb58f78e1bfbe01434316e60c37d27b9ad6139c66d8" +checksum = "81d78524685f5ef2a3b3bd1cafbc9fcabb036253d9b1463e726a91cd16e2dfc2" dependencies = [ "pest", "pest_generator", @@ -5603,22 +5772,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc9fc1b9e7057baba189b5c626e2d6f40681ae5b6eb064dc7c7834101ec8123a" +checksum = "68bd1206e71118b5356dae5ddc61c8b11e28b09ef6a31acbd15ea48a28e0c227" dependencies = [ "pest", "pest_meta", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] name = "pest_meta" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df74e9e7ec4053ceb980e7c0c8bd3594e977fde1af91daba9c928e8e8c6708d" +checksum = "7c747191d4ad9e4a4ab9c8798f1e82a39affe7ef9648390b7e5548d18e099de6" dependencies = [ "once_cell", "pest", @@ -5650,9 +5819,9 @@ version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -5754,6 +5923,12 @@ dependencies = [ "serde", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -5806,8 +5981,8 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" dependencies = [ - "proc-macro2 1.0.67", - "syn 2.0.37", + "proc-macro2 1.0.69", + "syn 2.0.38", ] [[package]] @@ -5850,7 +6025,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", "version_check", @@ -5862,7 +6037,7 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "version_check", ] @@ -5878,9 +6053,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.67" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" +checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" dependencies = [ "unicode-ident", ] @@ -5900,6 +6075,38 @@ dependencies = [ "thiserror", ] +[[package]] +name = "prost" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +dependencies = [ + "anyhow", + "itertools 0.10.5", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "prost-types" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" +dependencies = [ + "prost", +] + [[package]] name = "protobuf" version = "2.28.0" @@ -5927,7 +6134,7 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -5967,7 +6174,7 @@ dependencies = [ "thiserror", "tokio", "tracing", - "webpki 0.22.1", + "webpki 0.22.4", ] [[package]] @@ -5979,7 +6186,7 @@ dependencies = [ "bytes", "fxhash", "rand 0.8.5", - "ring", + "ring 0.16.20", "rustls 0.20.9", "rustls-native-certs 0.6.3", "rustls-pemfile 0.2.1", @@ -5987,7 +6194,7 @@ dependencies = [ "thiserror", "tinyvec", "tracing", - "webpki 0.22.1", + "webpki 0.22.4", ] [[package]] @@ -5999,7 +6206,7 @@ dependencies = [ "futures-util", "libc", "quinn-proto", - "socket2 0.4.9", + "socket2 0.4.10", "tokio", "tracing", ] @@ -6019,7 +6226,7 @@ version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", ] [[package]] @@ -6141,7 +6348,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6413f3de1edee53342e6138e75b56d32e7bc6e332b3bd62d497b1929d4cfbcdd" dependencies = [ "pem", - "ring", + "ring 0.16.20", "time", "yasna", ] @@ -6164,6 +6371,15 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "redox_users" version = "0.4.3" @@ -6177,14 +6393,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.9.5" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.3.8", - "regex-syntax 0.7.5", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", ] [[package]] @@ -6198,13 +6414,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.8" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.5", + "regex-syntax 0.8.2", ] [[package]] @@ -6215,9 +6431,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.5" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "relayer" @@ -6238,7 +6454,7 @@ dependencies = [ "hyperlane-ethereum", "hyperlane-test", "itertools 0.11.0", - "num-derive 0.4.0", + "num-derive 0.4.1", "num-traits", "prometheus", "regex", @@ -6264,12 +6480,12 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.20" +version = "0.11.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1" +checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" dependencies = [ "async-compression", - "base64 0.21.4", + "base64 0.21.5", "bytes", "cookie", "cookie_store", @@ -6280,7 +6496,7 @@ dependencies = [ "http", "http-body", "hyper", - "hyper-rustls 0.24.1", + "hyper-rustls 0.24.2", "hyper-tls", "ipnet", "js-sys", @@ -6290,15 +6506,16 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.7", + "rustls 0.21.8", "rustls-pemfile 1.0.3", "serde", "serde_json", "serde_urlencoded", + "system-configuration", "tokio", "tokio-native-tls", "tokio-rustls 0.24.1", - "tokio-util 0.7.9", + "tokio-util 0.7.10", "tower-service", "url", "wasm-bindgen", @@ -6319,6 +6536,16 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac 0.12.1", + "subtle", +] + [[package]] name = "ring" version = "0.16.20" @@ -6329,11 +6556,25 @@ dependencies = [ "libc", "once_cell", "spin 0.5.2", - "untrusted", + "untrusted 0.7.1", "web-sys", "winapi", ] +[[package]] +name = "ring" +version = "0.17.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" +dependencies = [ + "cc", + "getrandom 0.2.10", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.48.0", +] + [[package]] name = "ripemd" version = "0.1.3" @@ -6357,7 +6598,7 @@ dependencies = [ "rkyv_derive", "seahash", "tinyvec", - "uuid 1.4.1", + "uuid 1.5.0", ] [[package]] @@ -6366,7 +6607,7 @@ version = "0.7.42" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2e06b915b5c230a17d7a736d1e2e63ee753c256a8614ef3f5147b13a4f5541d" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -6386,7 +6627,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -6426,16 +6667,14 @@ dependencies = [ [[package]] name = "rsa" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ab43bb47d23c1a631b4b680199a45255dce26fa9ab2fa902581f624ff13e6a8" +checksum = "86ef35bf3e7fe15a53c4ab08a998e42271eab13eb0db224126bc7bc4c4bad96d" dependencies = [ - "byteorder", "const-oid 0.9.5", "digest 0.10.7", "num-bigint-dig", "num-integer", - "num-iter", "num-traits", "pkcs1", "pkcs8 0.10.2", @@ -6637,11 +6876,11 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.14" +version = "0.38.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "747c788e9ce8e92b12cd485c49ddf90723550b654b32508f979b71a7b1ecda4f" +checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.4.1", "errno", "libc", "linux-raw-sys", @@ -6656,7 +6895,7 @@ checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" dependencies = [ "base64 0.13.1", "log", - "ring", + "ring 0.16.20", "sct 0.6.1", "webpki 0.21.4", ] @@ -6668,21 +6907,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99" dependencies = [ "log", - "ring", - "sct 0.7.0", - "webpki 0.22.1", + "ring 0.16.20", + "sct 0.7.1", + "webpki 0.22.4", ] [[package]] name = "rustls" -version = "0.21.7" +version = "0.21.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" +checksum = "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c" dependencies = [ "log", - "ring", + "ring 0.17.5", "rustls-webpki", - "sct 0.7.0", + "sct 0.7.1", ] [[package]] @@ -6724,17 +6963,17 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" dependencies = [ - "base64 0.21.4", + "base64 0.21.5", ] [[package]] name = "rustls-webpki" -version = "0.101.6" +version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c7d5dece342910d9ba34d259310cae3e0154b873b35408b787b59bce53d34fe" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring", - "untrusted", + "ring 0.17.5", + "untrusted 0.9.0", ] [[package]] @@ -6778,9 +7017,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0a159d0c45c12b20c5a844feb1fe4bea86e28f17b92a5f0c42193634d3782" +checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" dependencies = [ "cfg-if", "derive_more", @@ -6790,12 +7029,12 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "912e55f6d20e0e80d63733872b40e1227c0bce1e1ab81ba67d696339bfd7fd29" +checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" dependencies = [ "proc-macro-crate 1.2.1", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -6865,9 +7104,9 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -6902,18 +7141,18 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" dependencies = [ - "ring", - "untrusted", + "ring 0.16.20", + "untrusted 0.7.1", ] [[package]] name = "sct" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring", - "untrusted", + "ring 0.17.5", + "untrusted 0.9.0", ] [[package]] @@ -6924,16 +7163,16 @@ checksum = "3bd3534a9978d0aa7edd2808dc1f8f31c4d0ecd31ddf71d997b3c98e9f3c9114" dependencies = [ "heck 0.4.1", "proc-macro-error", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] name = "sea-orm" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da5b2d70c255bc5cbe1d49f69c3c8eadae0fbbaeb18ee978edbf2f75775cb94d" +checksum = "14d17105eb8049488d2528580ecc3f0912ab177d600f10e8e292d6994870ba6a" dependencies = [ "async-stream", "async-trait", @@ -6954,17 +7193,17 @@ dependencies = [ "time", "tracing", "url", - "uuid 1.4.1", + "uuid 1.5.0", ] [[package]] name = "sea-orm-cli" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bef60732e6016c5643350c87f43a697e8c074e41e4e2a9d961c056cb1310915" +checksum = "d66b46c28caf05824ecd1e68865de762959aa3640e1c21a415a00090e67b1658" dependencies = [ "chrono", - "clap 4.4.6", + "clap 4.4.7", "dotenvy", "glob", "regex", @@ -6976,26 +7215,26 @@ dependencies = [ [[package]] name = "sea-orm-macros" -version = "0.12.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c8d455fad40194fb9774fdc4810c0f2700ff0dc0e93bd5ce9d641cc3f5dd75" +checksum = "a836864040c92d0615497eeccf97e1aee312857bf2ab36d74a74ce1c5c2cefc3" dependencies = [ "heck 0.4.1", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "sea-bae", - "syn 2.0.37", + "syn 2.0.38", "unicode-ident", ] [[package]] name = "sea-orm-migration" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e53b6ddaf6dbb84e5dfc3fb78634ed0a4d6d64e7479500ab2585db239747031" +checksum = "a340d727bafe3d817b55f920498cc469e8664e8b654017d2ec93a31aed40b70f" dependencies = [ "async-trait", - "clap 4.4.6", + "clap 4.4.7", "dotenvy", "futures", "sea-orm", @@ -7020,7 +7259,7 @@ dependencies = [ "sea-query-derive", "serde_json", "time", - "uuid 1.4.1", + "uuid 1.5.0", ] [[package]] @@ -7036,19 +7275,19 @@ dependencies = [ "serde_json", "sqlx", "time", - "uuid 1.4.1", + "uuid 1.5.0", ] [[package]] name = "sea-query-derive" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd78f2e0ee8e537e9195d1049b752e0433e2cac125426bccb7b5c3e508096117" +checksum = "25a82fcb49253abcb45cdcb2adf92956060ec0928635eb21b4f7a6d8f25ab0bc" dependencies = [ "heck 0.4.1", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 1.0.109", + "syn 2.0.38", "thiserror", ] @@ -7070,7 +7309,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6f686050f76bffc4f635cda8aea6df5548666b830b52387e8bc7de11056d11e" dependencies = [ "heck 0.4.1", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -7087,7 +7326,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" dependencies = [ - "base16ct", + "base16ct 0.1.1", "der 0.6.1", "generic-array 0.14.7", "pkcs8 0.9.0", @@ -7095,6 +7334,20 @@ dependencies = [ "zeroize", ] +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct 0.2.0", + "der 0.7.8", + "generic-array 0.14.7", + "pkcs8 0.10.2", + "subtle", + "zeroize", +] + [[package]] name = "secp256k1" version = "0.24.3" @@ -7148,9 +7401,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad977052201c6de01a8ef2aa3378c4bd23217a056337d1d6da40468d267a4fb0" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" dependencies = [ "serde", ] @@ -7163,9 +7416,9 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.188" +version = "1.0.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" +checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" dependencies = [ "serde_derive", ] @@ -7191,26 +7444,37 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.188" +version = "1.0.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" +checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] name = "serde_json" -version = "1.0.107" +version = "1.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" dependencies = [ "itoa", "ryu", "serde", ] +[[package]] +name = "serde_repr" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.38", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -7241,7 +7505,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" dependencies = [ "darling 0.13.4", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -7348,9 +7612,9 @@ dependencies = [ [[package]] name = "sharded-slab" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1b21f559e07218024e7e9f90f96f601825397de0e25420135f7f952453fed0b" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ "lazy_static", ] @@ -7429,9 +7693,9 @@ checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" [[package]] name = "socket2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", "winapi", @@ -7439,9 +7703,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", "windows-sys 0.48.0", @@ -7703,7 +7967,7 @@ name = "solana-frozen-abi" version = "1.14.13" source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" dependencies = [ - "ahash 0.7.6", + "ahash 0.7.7", "blake3", "block-buffer 0.9.0", "bs58 0.4.0", @@ -7736,7 +8000,7 @@ name = "solana-frozen-abi-macro" version = "1.14.13" source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "rustc_version", "syn 1.0.109", @@ -7787,7 +8051,7 @@ dependencies = [ "rand 0.7.3", "serde", "serde_derive", - "socket2 0.4.9", + "socket2 0.4.10", "solana-logger", "solana-sdk", "solana-version", @@ -7800,7 +8064,7 @@ name = "solana-perf" version = "1.14.13" source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" dependencies = [ - "ahash 0.7.6", + "ahash 0.7.7", "bincode", "bv", "caps", @@ -8062,7 +8326,7 @@ version = "1.14.13" source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" dependencies = [ "bs58 0.4.0", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "rustversion", "syn 1.0.109", @@ -8417,7 +8681,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d6753e460c998bbd4cd8c6f0ed9a64346fcca0723d6e75e52fdc351c5d2169d" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.6", "atoi", "bigdecimal", "byteorder", @@ -8435,7 +8699,7 @@ dependencies = [ "futures-util", "hashlink", "hex 0.4.3", - "indexmap 2.0.1", + "indexmap 2.1.0", "log", "memchr", "native-tls", @@ -8454,7 +8718,7 @@ dependencies = [ "tokio-stream", "tracing", "url", - "uuid 1.4.1", + "uuid 1.5.0", ] [[package]] @@ -8463,7 +8727,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a793bb3ba331ec8359c1853bd39eed32cdd7baaf22c35ccf5c92a7e8d1189ec" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "sqlx-core", "sqlx-macros-core", @@ -8481,7 +8745,7 @@ dependencies = [ "heck 0.4.1", "hex 0.4.3", "once_cell", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "serde", "serde_json", @@ -8503,9 +8767,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "864b869fdf56263f4c95c45483191ea0af340f9f3e3e7b4d57a61c7c87a970db" dependencies = [ "atoi", - "base64 0.21.4", + "base64 0.21.5", "bigdecimal", - "bitflags 2.4.0", + "bitflags 2.4.1", "byteorder", "bytes", "chrono", @@ -8539,7 +8803,7 @@ dependencies = [ "thiserror", "time", "tracing", - "uuid 1.4.1", + "uuid 1.5.0", "whoami", ] @@ -8550,9 +8814,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb7ae0e6a97fb3ba33b23ac2671a5ce6e3cabe003f451abd5a56e7951d975624" dependencies = [ "atoi", - "base64 0.21.4", + "base64 0.21.5", "bigdecimal", - "bitflags 2.4.0", + "bitflags 2.4.1", "byteorder", "chrono", "crc", @@ -8584,7 +8848,7 @@ dependencies = [ "thiserror", "time", "tracing", - "uuid 1.4.1", + "uuid 1.5.0", "whoami", ] @@ -8610,7 +8874,7 @@ dependencies = [ "time", "tracing", "url", - "uuid 1.4.1", + "uuid 1.5.0", ] [[package]] @@ -8669,7 +8933,7 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" dependencies = [ - "strum_macros 0.25.2", + "strum_macros 0.25.3", ] [[package]] @@ -8679,7 +8943,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d06aaeeee809dbc59eb4556183dd927df67db1540de5be8d3ec0b6636358a5ec" dependencies = [ "heck 0.3.3", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] @@ -8691,7 +8955,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ "heck 0.4.1", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "rustversion", "syn 1.0.109", @@ -8699,15 +8963,15 @@ dependencies = [ [[package]] name = "strum_macros" -version = "0.25.2" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8d03b598d3d0fff69bf533ee3ef19b8eeb342729596df84bcc7e1f96ec4059" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" dependencies = [ "heck 0.4.1", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "rustversion", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -8716,6 +8980,21 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +[[package]] +name = "subtle-encoding" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dcb1ed7b8330c5eed5441052651dd7a12c75e2ed88f2ec024ae1fa3a5e59945" +dependencies = [ + "zeroize", +] + +[[package]] +name = "subtle-ng" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" + [[package]] name = "symlink" version = "0.1.0" @@ -8739,18 +9018,18 @@ version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "unicode-ident", ] [[package]] name = "syn" -version = "2.0.37" +version = "2.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" +checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "unicode-ident", ] @@ -8761,12 +9040,33 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", "unicode-xid 0.2.4", ] +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tai64" version = "4.0.0" @@ -8823,24 +9123,73 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee42b4e559f17bce0385ebf511a7beb67d5cc33c12c96b7f4e9789919d9c10f" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", "syn 1.0.109", ] [[package]] name = "tempfile" -version = "3.8.0" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" +checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" dependencies = [ "cfg-if", "fastrand", - "redox_syscall 0.3.5", + "redox_syscall 0.4.1", "rustix", "windows-sys 0.48.0", ] +[[package]] +name = "tendermint" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f0a7d05cf78524782337f8edd55cbc578d159a16ad4affe2135c92f7dbac7f0" +dependencies = [ + "bytes", + "digest 0.10.7", + "ed25519 2.2.3", + "ed25519-consensus", + "flex-error", + "futures", + "k256 0.13.1", + "num-traits", + "once_cell", + "prost", + "prost-types", + "ripemd", + "serde", + "serde_bytes", + "serde_json", + "serde_repr", + "sha2 0.10.8", + "signature 2.1.0", + "subtle", + "subtle-encoding", + "tendermint-proto", + "time", + "zeroize", +] + +[[package]] +name = "tendermint-proto" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0cec054567d16d85e8c3f6a3139963d1a66d9d3051ed545d31562550e9bcc3d" +dependencies = [ + "bytes", + "flex-error", + "num-derive 0.3.3", + "num-traits", + "prost", + "prost-types", + "serde", + "serde_bytes", + "subtle-encoding", + "time", +] + [[package]] name = "termcolor" version = "1.3.0" @@ -8873,22 +9222,22 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" -version = "1.0.49" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.49" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -8903,12 +9252,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "426f806f4089c493dcac0d24c29c01e2c38baf8e30f1b716ee37e83d200b18fe" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" dependencies = [ "deranged", "itoa", + "powerfmt", "serde", "time-core", "time-macros", @@ -8974,9 +9324,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.32.0" +version = "1.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" +checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" dependencies = [ "backtrace", "bytes", @@ -8986,7 +9336,7 @@ dependencies = [ "parking_lot 0.12.1", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.4", + "socket2 0.5.5", "tokio-macros", "windows-sys 0.48.0", ] @@ -9007,9 +9357,9 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -9041,7 +9391,7 @@ checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" dependencies = [ "rustls 0.20.9", "tokio", - "webpki 0.22.1", + "webpki 0.22.4", ] [[package]] @@ -9050,7 +9400,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.7", + "rustls 0.21.8", "tokio", ] @@ -9106,7 +9456,7 @@ dependencies = [ "tokio", "tokio-rustls 0.23.4", "tungstenite 0.17.3", - "webpki 0.22.1", + "webpki 0.22.4", "webpki-roots 0.22.6", ] @@ -9139,9 +9489,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d68074620f57a0b21594d9735eb2e98ab38b17f80d3fcb189fca266771ca60d" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" dependencies = [ "bytes", "futures-core", @@ -9168,11 +9518,10 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if", "log", "pin-project-lite", "tracing-attributes", @@ -9181,20 +9530,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", "valuable", @@ -9286,7 +9635,7 @@ dependencies = [ "thiserror", "url", "utf-8", - "webpki 0.22.1", + "webpki 0.22.4", "webpki-roots 0.22.6", ] @@ -9418,13 +9767,19 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "ureq" -version = "2.7.1" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b11c96ac7ee530603dcdf68ed1557050f374ce55a5a07193ebf8cbc9f8927e9" +checksum = "f5ccd538d4a604753ebc2f17cd9946e89b77bf87f6a8e2309667c6f2e87855e3" dependencies = [ - "base64 0.21.4", + "base64 0.21.5", "log", "once_cell", "url", @@ -9475,9 +9830,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" +checksum = "88ad59a7560b41a70d191093a945f0b87bc1deeda46fb237479708a1d6b6cdfc" dependencies = [ "serde", ] @@ -9581,7 +9936,7 @@ dependencies = [ "tokio", "tokio-stream", "tokio-tungstenite 0.20.1", - "tokio-util 0.7.9", + "tokio-util 0.7.10", "tower-service", "tracing", ] @@ -9600,9 +9955,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -9610,24 +9965,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" dependencies = [ "bumpalo", "log", "once_cell", - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 2.0.37", + "syn 2.0.38", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.37" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02" dependencies = [ "cfg-if", "js-sys", @@ -9637,9 +9992,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" dependencies = [ "quote 1.0.33", "wasm-bindgen-macro-support", @@ -9647,22 +10002,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 2.0.37", + "syn 2.0.38", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" [[package]] name = "wasm-timer" @@ -9681,9 +10036,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" dependencies = [ "js-sys", "wasm-bindgen", @@ -9695,18 +10050,18 @@ version = "0.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" dependencies = [ - "ring", - "untrusted", + "ring 0.16.20", + "untrusted 0.7.1", ] [[package]] name = "webpki" -version = "0.22.1" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0e74f82d49d545ad128049b7e88f6576df2da6b02e9ce565c6f533be576957e" +checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" dependencies = [ - "ring", - "untrusted", + "ring 0.17.5", + "untrusted 0.9.0", ] [[package]] @@ -9724,7 +10079,7 @@ version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" dependencies = [ - "webpki 0.22.1", + "webpki 0.22.4", ] [[package]] @@ -9783,10 +10138,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows" -version = "0.48.0" +name = "windows-core" +version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" dependencies = [ "windows-targets 0.48.5", ] @@ -10012,6 +10367,26 @@ dependencies = [ "time", ] +[[package]] +name = "zerocopy" +version = "0.7.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e50cbb27c30666a6108abd6bc7577556265b44f243e2be89a8bc4e07a528c107" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a25f293fe55f0a48e7010d65552bb63704f6ceb55a1a385da10d41d8f78e4a3d" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 2.0.38", +] + [[package]] name = "zeroize" version = "1.6.0" @@ -10027,9 +10402,9 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ - "proc-macro2 1.0.67", + "proc-macro2 1.0.69", "quote 1.0.33", - "syn 2.0.37", + "syn 2.0.38", ] [[package]] @@ -10053,11 +10428,10 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.8+zstd.1.5.5" +version = "2.0.9+zstd.1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" +checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" dependencies = [ "cc", - "libc", "pkg-config", ] diff --git a/rust/Cargo.toml b/rust/Cargo.toml index b1400bbf87..7cad58e854 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -3,6 +3,7 @@ members = [ "agents/relayer", "agents/scraper", "agents/validator", + "chains/hyperlane-cosmos", "chains/hyperlane-ethereum", "chains/hyperlane-fuel", "chains/hyperlane-sealevel", @@ -66,6 +67,7 @@ convert_case = "0.6" crunchy = "0.2" ctrlc = "3.2" curve25519-dalek = { version = "~3.2", features = ["serde"] } +cosmrs = { version = "0.14", default-features = false } derive-new = "0.5" derive_builder = "0.12" derive_more = "0.99" diff --git a/rust/chains/hyperlane-cosmos/.gitignore b/rust/chains/hyperlane-cosmos/.gitignore new file mode 100644 index 0000000000..7040d337ab --- /dev/null +++ b/rust/chains/hyperlane-cosmos/.gitignore @@ -0,0 +1 @@ +src/contracts \ No newline at end of file diff --git a/rust/chains/hyperlane-cosmos/Cargo.toml b/rust/chains/hyperlane-cosmos/Cargo.toml new file mode 100644 index 0000000000..122b5f6b59 --- /dev/null +++ b/rust/chains/hyperlane-cosmos/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "hyperlane-cosmos" +documentation.workspace = true +edition.workspace = true +homepage.workspace = true +license-file.workspace = true +publish.workspace = true +version.workspace = true + +[dependencies] +async-trait.workspace = true +cosmrs = { workspace = true, features = [] } +serde.workspace = true +tokio.workspace = true +tracing-futures.workspace = true +tracing.workspace = true +url.workspace = true +thiserror.worskace = true + +hyperlane-core = { path = "../../hyperlane-core" } + +# These should only be used if it _must_ be used to interop with the inner library, +# all errors exported from a chain crate should be using thiserror or handrolled to +# make error handling easier. +# eyre = "never" +# anyhow = never diff --git a/rust/chains/hyperlane-cosmos/build.rs b/rust/chains/hyperlane-cosmos/build.rs new file mode 100644 index 0000000000..6472e5dc9f --- /dev/null +++ b/rust/chains/hyperlane-cosmos/build.rs @@ -0,0 +1,8 @@ +use std::fs; + +fn main() { + // TODO: build the cosmos contracts/bindings + fs::create_dir_all("src/contracts").expect("failed to create contracts dir"); + fs::write("src/contracts/mod.rs", "// TODO: this should be generated") + .expect("failed to write contracts/mod.rs"); +} diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs new file mode 100644 index 0000000000..b85312366e --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -0,0 +1,44 @@ +use async_trait::async_trait; +use hyperlane_core::{ + ChainResult, HyperlaneChain, HyperlaneContract, Indexer, InterchainGasPaymaster, +}; +use hyperlane_core::{HyperlaneDomain, HyperlaneProvider, InterchainGasPayment, LogMeta, H256}; + +#[derive(Debug)] +pub struct CosmosInterchainGasPaymaster {} + +impl HyperlaneContract for CosmosInterchainGasPaymaster { + fn address(&self) -> H256 { + todo!() + } +} + +impl HyperlaneChain for CosmosInterchainGasPaymaster { + fn domain(&self) -> &HyperlaneDomain { + todo!() + } + + fn provider(&self) -> Box { + todo!() + } +} + +impl InterchainGasPaymaster for CosmosInterchainGasPaymaster {} + +#[derive(Debug)] +pub struct CosmosInterchainGasPaymasterIndexer {} + +#[async_trait] +impl Indexer for CosmosInterchainGasPaymasterIndexer { + async fn fetch_logs( + &self, + from_block: u32, + to_block: u32, + ) -> ChainResult> { + todo!() + } + + async fn get_finalized_block_number(&self) -> ChainResult { + todo!() + } +} diff --git a/rust/chains/hyperlane-cosmos/src/lib.rs b/rust/chains/hyperlane-cosmos/src/lib.rs new file mode 100644 index 0000000000..5c06552eff --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/lib.rs @@ -0,0 +1,21 @@ +#![forbid(unsafe_code)] +#![warn(missing_docs)] +// TODO: Remove once we start filling things in +#![allow(unused_variables)] + +pub use self::{ + interchain_gas::*, mailbox::*, multisig_ism::*, provider::*, routing_ism::*, trait_builder::*, + validator_announce::*, +}; + +mod contracts; +mod interchain_gas; +mod mailbox; +mod multisig_ism; +mod provider; +mod routing_ism; +mod trait_builder; +mod validator_announce; + +/// Safe default imports of commonly used traits/types. +pub mod prelude {} diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs new file mode 100644 index 0000000000..345c84a077 --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -0,0 +1,121 @@ +use std::fmt::{Debug, Formatter}; +use std::num::NonZeroU64; + +use async_trait::async_trait; +use tracing::instrument; + +use hyperlane_core::{ + accumulator::incremental::IncrementalMerkle, utils::fmt_bytes, ChainResult, Checkpoint, + HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneMessage, HyperlaneProvider, + Indexer, LogMeta, Mailbox, TxCostEstimate, TxOutcome, H256, U256, +}; + +pub struct CosmosMailbox {} + +impl HyperlaneContract for CosmosMailbox { + fn address(&self) -> H256 { + todo!() + } +} + +impl HyperlaneChain for CosmosMailbox { + fn domain(&self) -> &HyperlaneDomain { + todo!() + } + + fn provider(&self) -> Box { + todo!() + } +} + +impl Debug for CosmosMailbox { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self as &dyn HyperlaneContract) + } +} + +#[async_trait] +impl Mailbox for CosmosMailbox { + #[instrument(level = "debug", err, ret, skip(self))] + async fn count(&self, lag: Option) -> ChainResult { + todo!() + } + + #[instrument(level = "debug", err, ret, skip(self))] + async fn tree(&self, lag: Option) -> ChainResult { + todo!() + } + + #[instrument(level = "debug", err, ret, skip(self))] + async fn delivered(&self, id: H256) -> ChainResult { + todo!() + } + + #[instrument(level = "debug", err, ret, skip(self))] + async fn latest_checkpoint(&self, lag: Option) -> ChainResult { + todo!() + } + + #[instrument(err, ret, skip(self))] + async fn default_ism(&self) -> ChainResult { + todo!() + } + + #[instrument(err, ret, skip(self))] + async fn recipient_ism(&self, recipient: H256) -> ChainResult { + todo!() + } + + #[instrument(err, ret, skip(self))] + async fn process( + &self, + message: &HyperlaneMessage, + metadata: &[u8], + tx_gas_limit: Option, + ) -> ChainResult { + todo!() + } + + #[instrument(err, ret, skip(self), fields(msg=%message, metadata=%fmt_bytes(metadata)))] + async fn process_estimate_costs( + &self, + message: &HyperlaneMessage, + metadata: &[u8], + ) -> ChainResult { + todo!() + } + + fn process_calldata(&self, message: &HyperlaneMessage, metadata: &[u8]) -> Vec { + todo!() + } +} + +/// Struct that retrieves event data for a Cosmos Mailbox contract +#[derive(Debug)] +pub struct CosmosMailboxIndexer {} + +#[async_trait] +impl Indexer for CosmosMailboxIndexer { + async fn fetch_logs( + &self, + from: u32, + to: u32, + ) -> ChainResult> { + todo!() + } + + async fn get_finalized_block_number(&self) -> ChainResult { + todo!() + } +} + +#[async_trait] +impl Indexer for CosmosMailboxIndexer { + async fn fetch_logs(&self, from: u32, to: u32) -> ChainResult> { + todo!() + } + + async fn get_finalized_block_number(&self) -> ChainResult { + todo!() + } +} diff --git a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs new file mode 100644 index 0000000000..e138984dfb --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs @@ -0,0 +1,35 @@ +use async_trait::async_trait; +use hyperlane_core::{ + ChainResult, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneMessage, + HyperlaneProvider, MultisigIsm, H256, +}; + +#[derive(Debug)] +pub struct CosmosMultisigIsm {} + +impl HyperlaneContract for CosmosMultisigIsm { + fn address(&self) -> H256 { + todo!() + } +} + +impl HyperlaneChain for CosmosMultisigIsm { + fn domain(&self) -> &HyperlaneDomain { + todo!() + } + + fn provider(&self) -> Box { + todo!() + } +} + +#[async_trait] +impl MultisigIsm for CosmosMultisigIsm { + /// Returns the validator and threshold needed to verify message + async fn validators_and_threshold( + &self, + message: &HyperlaneMessage, + ) -> ChainResult<(Vec, u8)> { + todo!() + } +} diff --git a/rust/chains/hyperlane-cosmos/src/provider.rs b/rust/chains/hyperlane-cosmos/src/provider.rs new file mode 100644 index 0000000000..8bd712a1e0 --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/provider.rs @@ -0,0 +1,33 @@ +use async_trait::async_trait; + +use hyperlane_core::{ + BlockInfo, ChainResult, HyperlaneChain, HyperlaneDomain, HyperlaneProvider, TxnInfo, H256, +}; + +#[derive(Debug)] +pub struct CosmosProvider {} + +impl HyperlaneChain for CosmosProvider { + fn domain(&self) -> &HyperlaneDomain { + todo!() + } + + fn provider(&self) -> Box { + todo!() + } +} + +#[async_trait] +impl HyperlaneProvider for CosmosProvider { + async fn get_block_by_hash(&self, hash: &H256) -> ChainResult { + todo!() + } + + async fn get_txn_by_hash(&self, hash: &H256) -> ChainResult { + todo!() + } + + async fn is_contract(&self, address: &H256) -> ChainResult { + todo!() + } +} diff --git a/rust/chains/hyperlane-cosmos/src/routing_ism.rs b/rust/chains/hyperlane-cosmos/src/routing_ism.rs new file mode 100644 index 0000000000..1fe24ab78d --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/routing_ism.rs @@ -0,0 +1,32 @@ +use async_trait::async_trait; + +use hyperlane_core::{ + ChainResult, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneMessage, + HyperlaneProvider, RoutingIsm, H256, +}; + +#[derive(Debug)] +pub struct CosmosRoutingIsm {} + +impl HyperlaneContract for CosmosRoutingIsm { + fn address(&self) -> H256 { + todo!() + } +} + +impl HyperlaneChain for CosmosRoutingIsm { + fn domain(&self) -> &HyperlaneDomain { + todo!() + } + + fn provider(&self) -> Box { + todo!() + } +} + +#[async_trait] +impl RoutingIsm for CosmosRoutingIsm { + async fn route(&self, message: &HyperlaneMessage) -> ChainResult { + todo!() + } +} diff --git a/rust/chains/hyperlane-cosmos/src/trait_builder.rs b/rust/chains/hyperlane-cosmos/src/trait_builder.rs new file mode 100644 index 0000000000..f59b0a30cc --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/trait_builder.rs @@ -0,0 +1,46 @@ +use hyperlane_core::config::{ConfigErrResultExt, ConfigPath, ConfigResult, FromRawConf}; +use url::Url; + +#[derive(Debug, Clone)] +pub struct ConnectionConf { + // TODO: more settings? + url: Url, +} + +#[derive(Debug, serde::Deserialize)] +pub struct RawConnectionConf { + // TODO: more settings? + url: Option, +} + +/// An error type when parsing a connection configuration. +#[derive(thiserror::Error, Debug)] +pub enum ConnectionConfError { + /// Missing `url` for connection configuration + #[error("Missing `url` for connection configuration")] + MissingConnectionUrl, + /// Invalid `url` for connection configuration + #[error("Invalid `url` for connection configuration: `{0}` ({1})")] + InvalidConnectionUrl(String, url::ParseError), +} + +impl FromRawConf<'_, RawConnectionConf> for ConnectionConf { + fn from_config_filtered( + raw: RawConnectionConf, + cwp: &ConfigPath, + _filter: (), + ) -> ConfigResult { + use ConnectionConfError::*; + match raw { + RawConnectionConf { url: Some(url) } => Ok(Self { + url: url + .parse() + .map_err(|e| InvalidConnectionUrl(url, e)) + .into_config_result(|| cwp.join("url"))?, + }), + RawConnectionConf { url: None } => { + Err(MissingConnectionUrl).into_config_result(|| cwp.join("url")) + } + } + } +} diff --git a/rust/chains/hyperlane-cosmos/src/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/validator_announce.rs new file mode 100644 index 0000000000..8da0dbba4b --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/validator_announce.rs @@ -0,0 +1,50 @@ +use async_trait::async_trait; + +use hyperlane_core::{ + Announcement, ChainResult, HyperlaneChain, HyperlaneContract, HyperlaneDomain, + HyperlaneProvider, SignedType, TxOutcome, ValidatorAnnounce, H256, U256, +}; + +#[derive(Debug)] +pub struct CosmosValidatorAnnounce {} + +impl HyperlaneContract for CosmosValidatorAnnounce { + fn address(&self) -> H256 { + todo!() + } +} + +impl HyperlaneChain for CosmosValidatorAnnounce { + fn domain(&self) -> &HyperlaneDomain { + todo!() + } + + fn provider(&self) -> Box { + todo!() + } +} + +#[async_trait] +impl ValidatorAnnounce for CosmosValidatorAnnounce { + async fn get_announced_storage_locations( + &self, + validators: &[H256], + ) -> ChainResult>> { + todo!() + } + + async fn announce( + &self, + announcement: SignedType, + tx_gas_limit: Option, + ) -> ChainResult { + todo!() + } + + async fn announce_tokens_needed( + &self, + announcement: SignedType, + ) -> ChainResult { + todo!() + } +} From 56282fcb3f45a09926547a310496642025bad31f Mon Sep 17 00:00:00 2001 From: Mattie Conover Date: Mon, 3 Jul 2023 13:46:24 -0700 Subject: [PATCH 002/142] Updates for consistency --- rust/chains/hyperlane-ethereum/Cargo.toml | 8 ++++++- rust/chains/hyperlane-fuel/Cargo.toml | 6 +++++ rust/chains/hyperlane-fuel/src/lib.rs | 11 +++++----- .../hyperlane-fuel/src/validator_announce.rs | 22 ++++++++++++++++++- 4 files changed, 39 insertions(+), 8 deletions(-) diff --git a/rust/chains/hyperlane-ethereum/Cargo.toml b/rust/chains/hyperlane-ethereum/Cargo.toml index d13a54e84d..a7de33d53a 100644 --- a/rust/chains/hyperlane-ethereum/Cargo.toml +++ b/rust/chains/hyperlane-ethereum/Cargo.toml @@ -20,6 +20,7 @@ ethers.workspace = true futures-util.workspace = true hex.workspace = true num.workspace = true +num-traits.workspace = true reqwest.workspace = true serde.workspace = true serde_json.workspace = true @@ -31,7 +32,12 @@ url.workspace = true hyperlane-core = { path = "../../hyperlane-core" } ethers-prometheus = { path = "../../ethers-prometheus", features = ["serde"] } -num-traits.workspace = true + +# These should only be used if it _must_ be used to interop with the inner library, +# all errors exported from a chain crate should be using thiserror or handrolled to +# make error handling easier. +# eyre = "never" +# anyhow = never [build-dependencies] abigen = { path = "../../utils/abigen", features = ["ethers"] } diff --git a/rust/chains/hyperlane-fuel/Cargo.toml b/rust/chains/hyperlane-fuel/Cargo.toml index 7dabcdd514..d9b85aab2d 100644 --- a/rust/chains/hyperlane-fuel/Cargo.toml +++ b/rust/chains/hyperlane-fuel/Cargo.toml @@ -21,5 +21,11 @@ url.workspace = true hyperlane-core = { path = "../../hyperlane-core" } +# These should only be used if it _must_ be used to interop with the inner library, +# all errors exported from a chain crate should be using thiserror or handrolled to +# make error handling easier. +# eyre = "never" +# anyhow = never + [build-dependencies] abigen = { path = "../../utils/abigen", features = ["fuels"] } diff --git a/rust/chains/hyperlane-fuel/src/lib.rs b/rust/chains/hyperlane-fuel/src/lib.rs index 5ce9f0782a..949387870a 100644 --- a/rust/chains/hyperlane-fuel/src/lib.rs +++ b/rust/chains/hyperlane-fuel/src/lib.rs @@ -5,12 +5,10 @@ // TODO: Remove once we start filling things in #![allow(unused_variables)] -pub use interchain_gas::*; -pub use mailbox::*; -pub use multisig_ism::*; -pub use provider::*; -pub use routing_ism::*; -pub use trait_builder::*; +pub use self::{ + interchain_gas::*, mailbox::*, multisig_ism::*, provider::*, routing_ism::*, trait_builder::*, + validator_announce::*, +}; mod contracts; mod conversions; @@ -20,6 +18,7 @@ mod multisig_ism; mod provider; mod routing_ism; mod trait_builder; +mod validator_announce; /// Safe default imports of commonly used traits/types. pub mod prelude { diff --git a/rust/chains/hyperlane-fuel/src/validator_announce.rs b/rust/chains/hyperlane-fuel/src/validator_announce.rs index ea31a09e94..42c0229e23 100644 --- a/rust/chains/hyperlane-fuel/src/validator_announce.rs +++ b/rust/chains/hyperlane-fuel/src/validator_announce.rs @@ -1,7 +1,8 @@ use async_trait::async_trait; use hyperlane_core::{ - ChainResult, HyperlaneChain, HyperlaneContract, HyperlaneDomain, ValidatorAnnounce, H256, + Announcement, ChainResult, HyperlaneChain, HyperlaneContract, HyperlaneDomain, + HyperlaneProvider, SignedType, TxOutcome, ValidatorAnnounce, H256, U256, }; /// A reference to a ValidatorAnnounce contract on some Fuel chain @@ -18,6 +19,10 @@ impl HyperlaneChain for FuelValidatorAnnounce { fn domain(&self) -> &HyperlaneDomain { todo!() } + + fn provider(&self) -> Box { + todo!() + } } #[async_trait] @@ -28,4 +33,19 @@ impl ValidatorAnnounce for FuelValidatorAnnounce { ) -> ChainResult>> { todo!() } + + async fn announce( + &self, + announcement: SignedType, + tx_gas_limit: Option, + ) -> ChainResult { + todo!() + } + + async fn announce_tokens_needed( + &self, + announcement: SignedType, + ) -> ChainResult { + todo!() + } } From c3e32fb99eccae7c86148337505b9afe92bd0458 Mon Sep 17 00:00:00 2001 From: Mattie Conover Date: Mon, 3 Jul 2023 13:51:39 -0700 Subject: [PATCH 003/142] Lints --- rust/chains/hyperlane-cosmos/Cargo.toml | 2 +- rust/chains/hyperlane-cosmos/src/interchain_gas.rs | 2 ++ rust/chains/hyperlane-cosmos/src/lib.rs | 3 +++ rust/chains/hyperlane-cosmos/src/mailbox.rs | 1 + rust/chains/hyperlane-cosmos/src/multisig_ism.rs | 1 + rust/chains/hyperlane-cosmos/src/provider.rs | 1 + rust/chains/hyperlane-cosmos/src/routing_ism.rs | 1 + rust/chains/hyperlane-cosmos/src/trait_builder.rs | 3 +++ rust/chains/hyperlane-cosmos/src/validator_announce.rs | 1 + 9 files changed, 14 insertions(+), 1 deletion(-) diff --git a/rust/chains/hyperlane-cosmos/Cargo.toml b/rust/chains/hyperlane-cosmos/Cargo.toml index 122b5f6b59..ed670848e1 100644 --- a/rust/chains/hyperlane-cosmos/Cargo.toml +++ b/rust/chains/hyperlane-cosmos/Cargo.toml @@ -11,11 +11,11 @@ version.workspace = true async-trait.workspace = true cosmrs = { workspace = true, features = [] } serde.workspace = true +thiserror.workspace = true tokio.workspace = true tracing-futures.workspace = true tracing.workspace = true url.workspace = true -thiserror.worskace = true hyperlane-core = { path = "../../hyperlane-core" } diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index b85312366e..efefbf4155 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -4,6 +4,7 @@ use hyperlane_core::{ }; use hyperlane_core::{HyperlaneDomain, HyperlaneProvider, InterchainGasPayment, LogMeta, H256}; +/// A reference to a InterchainGasPaymaster contract on some Cosmos chain #[derive(Debug)] pub struct CosmosInterchainGasPaymaster {} @@ -25,6 +26,7 @@ impl HyperlaneChain for CosmosInterchainGasPaymaster { impl InterchainGasPaymaster for CosmosInterchainGasPaymaster {} +/// A reference to a InterchainGasPaymasterIndexer contract on some Cosmos chain #[derive(Debug)] pub struct CosmosInterchainGasPaymasterIndexer {} diff --git a/rust/chains/hyperlane-cosmos/src/lib.rs b/rust/chains/hyperlane-cosmos/src/lib.rs index 5c06552eff..640c2a0831 100644 --- a/rust/chains/hyperlane-cosmos/src/lib.rs +++ b/rust/chains/hyperlane-cosmos/src/lib.rs @@ -1,5 +1,8 @@ +//! Implementation of hyperlane for cosmos. + #![forbid(unsafe_code)] #![warn(missing_docs)] + // TODO: Remove once we start filling things in #![allow(unused_variables)] diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 345c84a077..58aa3d387a 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -10,6 +10,7 @@ use hyperlane_core::{ Indexer, LogMeta, Mailbox, TxCostEstimate, TxOutcome, H256, U256, }; +/// A reference to a Mailbox contract on some Cosmos chain pub struct CosmosMailbox {} impl HyperlaneContract for CosmosMailbox { diff --git a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs index e138984dfb..57fd81a510 100644 --- a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs @@ -4,6 +4,7 @@ use hyperlane_core::{ HyperlaneProvider, MultisigIsm, H256, }; +/// A reference to a MultisigIsm contract on some Cosmos chain #[derive(Debug)] pub struct CosmosMultisigIsm {} diff --git a/rust/chains/hyperlane-cosmos/src/provider.rs b/rust/chains/hyperlane-cosmos/src/provider.rs index 8bd712a1e0..14f13a4e44 100644 --- a/rust/chains/hyperlane-cosmos/src/provider.rs +++ b/rust/chains/hyperlane-cosmos/src/provider.rs @@ -4,6 +4,7 @@ use hyperlane_core::{ BlockInfo, ChainResult, HyperlaneChain, HyperlaneDomain, HyperlaneProvider, TxnInfo, H256, }; +/// A wrapper around a cosmos provider to get generic blockchain information. #[derive(Debug)] pub struct CosmosProvider {} diff --git a/rust/chains/hyperlane-cosmos/src/routing_ism.rs b/rust/chains/hyperlane-cosmos/src/routing_ism.rs index 1fe24ab78d..a61eee9361 100644 --- a/rust/chains/hyperlane-cosmos/src/routing_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/routing_ism.rs @@ -5,6 +5,7 @@ use hyperlane_core::{ HyperlaneProvider, RoutingIsm, H256, }; +/// A reference to a RoutingIsm contract on some Cosmos chain #[derive(Debug)] pub struct CosmosRoutingIsm {} diff --git a/rust/chains/hyperlane-cosmos/src/trait_builder.rs b/rust/chains/hyperlane-cosmos/src/trait_builder.rs index f59b0a30cc..70bf2c073d 100644 --- a/rust/chains/hyperlane-cosmos/src/trait_builder.rs +++ b/rust/chains/hyperlane-cosmos/src/trait_builder.rs @@ -1,12 +1,15 @@ use hyperlane_core::config::{ConfigErrResultExt, ConfigPath, ConfigResult, FromRawConf}; use url::Url; +/// Cosmos connection configuration #[derive(Debug, Clone)] pub struct ConnectionConf { // TODO: more settings? + #[allow(dead_code)] url: Url, } +/// Raw Cosmos connection configuration used for better deserialization errors. #[derive(Debug, serde::Deserialize)] pub struct RawConnectionConf { // TODO: more settings? diff --git a/rust/chains/hyperlane-cosmos/src/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/validator_announce.rs index 8da0dbba4b..09ec283ff8 100644 --- a/rust/chains/hyperlane-cosmos/src/validator_announce.rs +++ b/rust/chains/hyperlane-cosmos/src/validator_announce.rs @@ -5,6 +5,7 @@ use hyperlane_core::{ HyperlaneProvider, SignedType, TxOutcome, ValidatorAnnounce, H256, U256, }; +/// A reference to a ValidatorAnnounce contract on some Cosmos chain #[derive(Debug)] pub struct CosmosValidatorAnnounce {} From 6f347e646897de84e0b655bb13dcb323ade8b397 Mon Sep 17 00:00:00 2001 From: Mattie Conover Date: Tue, 4 Jul 2023 08:23:15 -0700 Subject: [PATCH 004/142] Fix lint --- rust/chains/hyperlane-cosmos/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/rust/chains/hyperlane-cosmos/src/lib.rs b/rust/chains/hyperlane-cosmos/src/lib.rs index 640c2a0831..9d15ba548b 100644 --- a/rust/chains/hyperlane-cosmos/src/lib.rs +++ b/rust/chains/hyperlane-cosmos/src/lib.rs @@ -2,7 +2,6 @@ #![forbid(unsafe_code)] #![warn(missing_docs)] - // TODO: Remove once we start filling things in #![allow(unused_variables)] From acb784d465ddda6507cdb3542d7bf44265d15c8d Mon Sep 17 00:00:00 2001 From: hashableric Date: Tue, 25 Jul 2023 15:47:24 +0900 Subject: [PATCH 005/142] feat: implement stubs --- rust/Cargo.lock | 235 ++++++++++++++++ rust/Cargo.toml | 13 +- rust/chains/hyperlane-cosmos/Cargo.toml | 37 ++- .../hyperlane-cosmos/src/interchain_gas.rs | 79 +++++- rust/chains/hyperlane-cosmos/src/lib.rs | 6 +- rust/chains/hyperlane-cosmos/src/mailbox.rs | 238 ++++++++++++++-- .../hyperlane-cosmos/src/multisig_ism.rs | 75 ++++- .../hyperlane-cosmos/src/payloads/general.rs | 4 + .../src/payloads/ism_routes.rs | 16 ++ .../hyperlane-cosmos/src/payloads/mailbox.rs | 64 +++++ .../hyperlane-cosmos/src/payloads/mod.rs | 5 + .../src/payloads/multisig_ism.rs | 17 ++ .../src/payloads/validator_announce.rs | 42 +++ rust/chains/hyperlane-cosmos/src/provider.rs | 63 ++++- .../hyperlane-cosmos/src/providers/grpc.rs | 258 ++++++++++++++++++ .../hyperlane-cosmos/src/providers/mod.rs | 4 + .../hyperlane-cosmos/src/providers/rpc.rs | 131 +++++++++ .../hyperlane-cosmos/src/routing_ism.rs | 66 ++++- .../src/validator_announce.rs | 89 +++++- rust/chains/hyperlane-cosmos/src/verify.rs | 73 +++++ rust/hyperlane-core/Cargo.toml | 17 +- .../src/accumulator/incremental.rs | 6 +- rust/hyperlane-core/src/error.rs | 39 +++ 23 files changed, 1499 insertions(+), 78 deletions(-) create mode 100644 rust/chains/hyperlane-cosmos/src/payloads/general.rs create mode 100644 rust/chains/hyperlane-cosmos/src/payloads/ism_routes.rs create mode 100644 rust/chains/hyperlane-cosmos/src/payloads/mailbox.rs create mode 100644 rust/chains/hyperlane-cosmos/src/payloads/mod.rs create mode 100644 rust/chains/hyperlane-cosmos/src/payloads/multisig_ism.rs create mode 100644 rust/chains/hyperlane-cosmos/src/payloads/validator_announce.rs create mode 100644 rust/chains/hyperlane-cosmos/src/providers/grpc.rs create mode 100644 rust/chains/hyperlane-cosmos/src/providers/mod.rs create mode 100644 rust/chains/hyperlane-cosmos/src/providers/rpc.rs create mode 100644 rust/chains/hyperlane-cosmos/src/verify.rs diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 89b969ef8a..2546745f85 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -429,6 +429,51 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "axum" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +dependencies = [ + "async-trait", + "axum-core", + "bitflags 1.3.2", + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + [[package]] name = "backtrace" version = "0.3.69" @@ -1358,6 +1403,7 @@ dependencies = [ "prost", "prost-types", "tendermint-proto", + "tonic", ] [[package]] @@ -1376,7 +1422,9 @@ dependencies = [ "serde_json", "subtle-encoding", "tendermint", + "tendermint-rpc", "thiserror", + "tokio", ] [[package]] @@ -3707,6 +3755,25 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-proxy" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca815a891b24fdfb243fa3239c86154392b0953ee584aa1a2a1f66d20cbe75cc" +dependencies = [ + "bytes", + "futures", + "headers", + "http", + "hyper", + "hyper-rustls 0.22.1", + "rustls-native-certs 0.5.0", + "tokio", + "tokio-rustls 0.22.0", + "tower-service", + "webpki 0.21.4", +] + [[package]] name = "hyper-rustls" version = "0.22.1" @@ -3820,6 +3887,7 @@ dependencies = [ "bytes", "config", "convert_case 0.6.0", + "cosmrs", "derive-new", "derive_more", "ethers-contract", @@ -3829,6 +3897,7 @@ dependencies = [ "fixed-hash 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "getrandom 0.2.10", "hex 0.4.3", + "hyperlane-base", "itertools 0.11.0", "num 0.4.1", "num-derive 0.4.1", @@ -3839,9 +3908,11 @@ dependencies = [ "sha3 0.10.8", "solana-sdk", "strum 0.25.0", + "tendermint-rpc", "thiserror", "tiny-keccak", "tokio", + "tonic", "uint", ] @@ -3850,11 +3921,20 @@ name = "hyperlane-cosmos" version = "0.1.0" dependencies = [ "async-trait", + "bech32 0.9.1", "cosmrs", + "hex 0.4.3", + "hyper", + "hyper-tls", "hyperlane-core", + "ripemd", "serde", + "serde_json", + "sha2 0.10.8", + "sha256", "thiserror", "tokio", + "tonic", "tracing", "tracing-futures", "url", @@ -4869,6 +4949,12 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + [[package]] name = "md-5" version = "0.9.1" @@ -5716,6 +5802,33 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" +[[package]] +name = "peg" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07c0b841ea54f523f7aa556956fbd293bcbe06f2e67d2eb732b7278aaf1d166a" +dependencies = [ + "peg-macros", + "peg-runtime", +] + +[[package]] +name = "peg-macros" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5aa52829b8decbef693af90202711348ab001456803ba2a98eb4ec8fb70844c" +dependencies = [ + "peg-runtime", + "proc-macro2 1.0.69", + "quote 1.0.33", +] + +[[package]] +name = "peg-runtime" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c719dcf55f09a3a7e764c6649ab594c18a177e3599c467983cdf644bfc0a4088" + [[package]] name = "pem" version = "1.1.1" @@ -7588,6 +7701,19 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "sha256" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7895c8ae88588ccead14ff438b939b0c569cd619116f14b4d13fdff7b8333386" +dependencies = [ + "async-trait", + "bytes", + "hex 0.4.3", + "sha2 0.10.8", + "tokio", +] + [[package]] name = "sha3" version = "0.9.1" @@ -9034,6 +9160,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "synstructure" version = "0.12.6" @@ -9172,6 +9304,20 @@ dependencies = [ "zeroize", ] +[[package]] +name = "tendermint-config" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71a72dbbea6dde12045d261f2c70c0de039125675e8a026c8d5ad34522756372" +dependencies = [ + "flex-error", + "serde", + "serde_json", + "tendermint", + "toml", + "url", +] + [[package]] name = "tendermint-proto" version = "0.32.2" @@ -9190,6 +9336,41 @@ dependencies = [ "time", ] +[[package]] +name = "tendermint-rpc" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d119d83a130537fc4a98c3c9eb6899ebe857fea4860400a61675bfb5f0b35129" +dependencies = [ + "async-trait", + "bytes", + "flex-error", + "futures", + "getrandom 0.2.10", + "http", + "hyper", + "hyper-proxy", + "hyper-rustls 0.22.1", + "peg", + "pin-project", + "semver", + "serde", + "serde_bytes", + "serde_json", + "subtle", + "subtle-encoding", + "tendermint", + "tendermint-config", + "tendermint-proto", + "thiserror", + "time", + "tokio", + "tracing", + "url", + "uuid 0.8.2", + "walkdir", +] + [[package]] name = "termcolor" version = "1.3.0" @@ -9510,6 +9691,60 @@ dependencies = [ "serde", ] +[[package]] +name = "tonic" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a" +dependencies = [ + "async-trait", + "axum", + "base64 0.21.4", + "bytes", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost", + "tokio", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap", + "pin-project", + "pin-project-lite", + "rand 0.8.5", + "slab", + "tokio", + "tokio-util 0.7.9", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + [[package]] name = "tower-service" version = "0.3.2" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 7cad58e854..81e03f01c5 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -67,7 +67,7 @@ convert_case = "0.6" crunchy = "0.2" ctrlc = "3.2" curve25519-dalek = { version = "~3.2", features = ["serde"] } -cosmrs = { version = "0.14", default-features = false } +cosmrs = { version = "0.14", default-features = false, features = ["cosmwasm", "rpc", "tokio", "grpc"] } derive-new = "0.5" derive_builder = "0.12" derive_more = "0.99" @@ -109,7 +109,6 @@ serde = { version = "1.0", features = ["derive"] } serde_bytes = "0.11" serde_derive = "1.0" serde_json = "1.0" -sha2 = "0.10" sha3 = "0.10" solana-account-decoder = "=1.14.13" solana-banks-client = "=1.14.13" @@ -135,8 +134,8 @@ tempfile = "3.3" thiserror = "1.0" time = "0.3" tiny-keccak = "2.0.2" -tokio = { version = "1", features = ["parking_lot"] } tokio-test = "0.4" +tokio = { version = "1.29.1", features = ["full"] } tracing = { version = "0.1", features = ["release_max_level_debug"] } tracing-error = "0.2" tracing-futures = "0.2" @@ -147,6 +146,14 @@ url = "2.3" walkdir = "2" warp = "0.3" which = "4.3" +sha256 = "1.1.4" +bech32 = "0.9.1" +tonic = "0.9.2" +sha2 = { version = "0.10.6", default-features = false } +ripemd = "0.1.3" +hyper = "0.14" +hyper-tls = "0.5.0" +tendermint-rpc = { version = "0.32.0", features = ["http-client", "tokio"]} [workspace.dependencies.ethers] git = "https://github.com/hyperlane-xyz/ethers-rs" diff --git a/rust/chains/hyperlane-cosmos/Cargo.toml b/rust/chains/hyperlane-cosmos/Cargo.toml index ed670848e1..8b515778b6 100644 --- a/rust/chains/hyperlane-cosmos/Cargo.toml +++ b/rust/chains/hyperlane-cosmos/Cargo.toml @@ -1,21 +1,30 @@ [package] name = "hyperlane-cosmos" -documentation.workspace = true -edition.workspace = true -homepage.workspace = true -license-file.workspace = true -publish.workspace = true -version.workspace = true +documentation = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +license-file = { workspace = true } +publish = { workspace = true } +version = { workspace = true } [dependencies] -async-trait.workspace = true -cosmrs = { workspace = true, features = [] } -serde.workspace = true -thiserror.workspace = true -tokio.workspace = true -tracing-futures.workspace = true -tracing.workspace = true -url.workspace = true +async-trait = { workspace = true } +cosmrs = { workspace = true, features = ["cosmwasm", "tokio", "grpc", "rpc"] } +serde = { workspace = true } +thiserror = { workspace = true } +tokio = { workspace = true } +tracing-futures = { workspace = true } +tracing = { workspace = true } +url = { workspace = true } +bech32 = { workspace = true } +serde_json = { workspace = true } +tonic = { workspace = true } +sha2 = { workspace = true } +ripemd = { workspace = true } +hyper = { workspace = true } +hyper-tls = { workspace = true } +sha256 = { workspace = true } +hex = { workspace = true } hyperlane-core = { path = "../../hyperlane-core" } diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index efefbf4155..0256598799 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -1,22 +1,29 @@ use async_trait::async_trait; +use cosmrs::tendermint::abci::EventAttribute; use hyperlane_core::{ - ChainResult, HyperlaneChain, HyperlaneContract, Indexer, InterchainGasPaymaster, + ChainResult, HyperlaneChain, HyperlaneContract, Indexer, InterchainGasPaymaster, U256, }; use hyperlane_core::{HyperlaneDomain, HyperlaneProvider, InterchainGasPayment, LogMeta, H256}; +use crate::rpc::{CosmosWasmIndexer, WasmIndexer}; +use crate::verify::bech32_decode; + /// A reference to a InterchainGasPaymaster contract on some Cosmos chain #[derive(Debug)] -pub struct CosmosInterchainGasPaymaster {} +pub struct CosmosInterchainGasPaymaster { + domain: HyperlaneDomain, + address: String, +} impl HyperlaneContract for CosmosInterchainGasPaymaster { fn address(&self) -> H256 { - todo!() + bech32_decode(self.address.clone()) } } impl HyperlaneChain for CosmosInterchainGasPaymaster { fn domain(&self) -> &HyperlaneDomain { - todo!() + &self.domain } fn provider(&self) -> Box { @@ -26,9 +33,59 @@ impl HyperlaneChain for CosmosInterchainGasPaymaster { impl InterchainGasPaymaster for CosmosInterchainGasPaymaster {} +impl CosmosInterchainGasPaymaster { + /// create new Cosmos InterchainGasPaymaster agent + pub fn new(domain: HyperlaneDomain, address: String) -> Self { + Self { domain, address } + } +} + /// A reference to a InterchainGasPaymasterIndexer contract on some Cosmos chain #[derive(Debug)] -pub struct CosmosInterchainGasPaymasterIndexer {} +pub struct CosmosInterchainGasPaymasterIndexer { + indexer: Box, +} + +impl CosmosInterchainGasPaymasterIndexer { + /// create new Cosmos InterchainGasPaymasterIndexer agent + pub fn new(address: String, rpc_endpoint: String) -> Self { + let indexer = CosmosWasmIndexer::new( + address, + String::from("wasm-pay-for-gas"), + rpc_endpoint.parse().unwrap(), + ); + + Self { + indexer: Box::new(indexer), + } + } + + fn get_parser(&self) -> fn(attrs: Vec) -> InterchainGasPayment { + |attrs: Vec| -> InterchainGasPayment { + let mut res = InterchainGasPayment { + message_id: H256::zero(), + payment: U256::zero(), + gas_amount: U256::zero(), + }; + + for attr in attrs { + let key = attr.key.as_str(); + let value = attr.value.as_str(); + + match key { + "message_id" => { + res.message_id = H256::from_slice(hex::decode(value).unwrap().as_slice()) + } + "payment" => res.payment = value.parse().unwrap(), + "gas_amount" => res.gas_amount = value.parse().unwrap(), + _ => {} + } + } + + res + } + } +} #[async_trait] impl Indexer for CosmosInterchainGasPaymasterIndexer { @@ -37,10 +94,18 @@ impl Indexer for CosmosInterchainGasPaymasterIndexer { from_block: u32, to_block: u32, ) -> ChainResult> { - todo!() + let mut result: Vec<(InterchainGasPayment, LogMeta)> = vec![]; + let parser = self.get_parser(); + + for block_number in from_block..to_block { + let logs = self.indexer.get_event_log(block_number, parser).await?; + result.extend(logs); + } + + Ok(result) } async fn get_finalized_block_number(&self) -> ChainResult { - todo!() + self.indexer.latest_block_height().await } } diff --git a/rust/chains/hyperlane-cosmos/src/lib.rs b/rust/chains/hyperlane-cosmos/src/lib.rs index 9d15ba548b..2ce6708843 100644 --- a/rust/chains/hyperlane-cosmos/src/lib.rs +++ b/rust/chains/hyperlane-cosmos/src/lib.rs @@ -6,7 +6,7 @@ #![allow(unused_variables)] pub use self::{ - interchain_gas::*, mailbox::*, multisig_ism::*, provider::*, routing_ism::*, trait_builder::*, + interchain_gas::*, mailbox::*, multisig_ism::*, providers::*, routing_ism::*, trait_builder::*, validator_announce::*, }; @@ -14,10 +14,12 @@ mod contracts; mod interchain_gas; mod mailbox; mod multisig_ism; -mod provider; +mod payloads; +mod providers; mod routing_ism; mod trait_builder; mod validator_announce; +mod verify; /// Safe default imports of commonly used traits/types. pub mod prelude {} diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 58aa3d387a..0d4df265c8 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -1,27 +1,81 @@ use std::fmt::{Debug, Formatter}; use std::num::NonZeroU64; +use crate::grpc::{WasmGrpcProvider, WasmProvider}; +use crate::payloads::mailbox::{ProcessMessageRequest, ProcessMessageRequestInner}; +use crate::payloads::{general, mailbox}; +use crate::rpc::{CosmosWasmIndexer, WasmIndexer}; +use crate::verify; use async_trait::async_trait; -use tracing::instrument; +use cosmrs::crypto::secp256k1::SigningKey; + +use cosmrs::proto::cosmos::base::abci::v1beta1::TxResponse; +use cosmrs::proto::cosmos::tx::v1beta1::SimulateResponse; +use cosmrs::tendermint::abci::EventAttribute; +use hyperlane_core::RawHyperlaneMessage; use hyperlane_core::{ accumulator::incremental::IncrementalMerkle, utils::fmt_bytes, ChainResult, Checkpoint, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneMessage, HyperlaneProvider, Indexer, LogMeta, Mailbox, TxCostEstimate, TxOutcome, H256, U256, }; +use tracing::instrument; /// A reference to a Mailbox contract on some Cosmos chain -pub struct CosmosMailbox {} +pub struct CosmosMailbox { + domain: HyperlaneDomain, + address: String, + prefix: String, + provider: Box, +} + +impl CosmosMailbox { + /// Create a reference to a mailbox at a specific Ethereum address on some + /// chain + pub fn new( + domain: HyperlaneDomain, + address: String, + prefix: String, + private_key: Vec, + grpc_endpoint: String, + chain_id: String, + ) -> Self { + let signer_address = verify::pub_to_addr( + SigningKey::from_slice(&private_key) + .unwrap() + .public_key() + .to_bytes(), + &prefix, + ) + .unwrap(); + + let provider = WasmGrpcProvider::new( + address.clone(), + private_key, + signer_address, + prefix.clone(), + grpc_endpoint, + chain_id, + ); + + Self { + domain, + address, + prefix, + provider: Box::new(provider), + } + } +} impl HyperlaneContract for CosmosMailbox { fn address(&self) -> H256 { - todo!() + verify::bech32_decode(self.address.clone()) } } impl HyperlaneChain for CosmosMailbox { fn domain(&self) -> &HyperlaneDomain { - todo!() + &self.domain } fn provider(&self) -> Box { @@ -38,18 +92,49 @@ impl Debug for CosmosMailbox { #[async_trait] impl Mailbox for CosmosMailbox { #[instrument(level = "debug", err, ret, skip(self))] - async fn count(&self, lag: Option) -> ChainResult { - todo!() + async fn tree(&self, lag: Option) -> ChainResult { + let payload = mailbox::MerkleTreeRequest { + merkle_tree: general::EmptyStruct {}, + }; + + let data = self.provider.wasm_query(payload, lag).await?; + let response: mailbox::MerkleTreeResponse = serde_json::from_slice(&data)?; + + let branch = response + .branch + .iter() + .map(|b| H256::from_slice(&hex::decode(b).unwrap())) + .collect::>(); + + Ok(IncrementalMerkle { + branch: branch.try_into().unwrap(), + count: response.count as usize, + }) } #[instrument(level = "debug", err, ret, skip(self))] - async fn tree(&self, lag: Option) -> ChainResult { - todo!() + async fn count(&self, lag: Option) -> ChainResult { + let payload = mailbox::CountRequest { + count: general::EmptyStruct {}, + }; + + let data = self.provider.wasm_query(payload, lag).await?; + let response: mailbox::CountResponse = serde_json::from_slice(&data)?; + + Ok(response.count) } #[instrument(level = "debug", err, ret, skip(self))] async fn delivered(&self, id: H256) -> ChainResult { - todo!() + let id = hex::encode(id); + let payload = mailbox::DeliveredRequest { + message_delivered: mailbox::DeliveredRequestInner { id }, + }; + + let data = self.provider.wasm_query(payload, None).await?; + let response: mailbox::DeliveredResponse = serde_json::from_slice(&data)?; + + Ok(response.delivered) } #[instrument(level = "debug", err, ret, skip(self))] @@ -59,12 +144,32 @@ impl Mailbox for CosmosMailbox { #[instrument(err, ret, skip(self))] async fn default_ism(&self) -> ChainResult { - todo!() + let payload = mailbox::DefaultIsmRequest { + default_ism: general::EmptyStruct {}, + }; + + let data = self.provider.wasm_query(payload, None).await?; + let response: mailbox::DefaultIsmResponse = serde_json::from_slice(&data)?; + + // convert Hex to H256 + let ism = H256::from_slice(&hex::decode(response.default_ism)?); + Ok(ism) } #[instrument(err, ret, skip(self))] async fn recipient_ism(&self, recipient: H256) -> ChainResult { - todo!() + let address = verify::digest_to_addr(recipient, &self.prefix)?; + + let payload = mailbox::DefaultIsmRequest { + default_ism: general::EmptyStruct {}, + }; + + let data = self.provider.wasm_query_to(address, payload, None).await?; + let response: mailbox::DefaultIsmResponse = serde_json::from_slice(&data)?; + + // convert Hex to H256 + let ism = H256::from_slice(&hex::decode(response.default_ism)?); + Ok(ism) } #[instrument(err, ret, skip(self))] @@ -74,7 +179,23 @@ impl Mailbox for CosmosMailbox { metadata: &[u8], tx_gas_limit: Option, ) -> ChainResult { - todo!() + let process_message = ProcessMessageRequest { + process_message: ProcessMessageRequestInner { + message: hex::encode(RawHyperlaneMessage::from(message)), + metadata: hex::encode(metadata), + }, + }; + + let response: TxResponse = self + .provider + .wasm_send(process_message, tx_gas_limit) + .await?; + Ok(TxOutcome { + txid: H256::from_slice(hex::decode(response.txhash).unwrap().as_slice()), + executed: response.code == 0, + gas_used: U256::from(response.gas_used), + gas_price: U256::from(response.gas_wanted), + }) } #[instrument(err, ret, skip(self), fields(msg=%message, metadata=%fmt_bytes(metadata)))] @@ -83,17 +204,77 @@ impl Mailbox for CosmosMailbox { message: &HyperlaneMessage, metadata: &[u8], ) -> ChainResult { - todo!() + let process_message = ProcessMessageRequest { + process_message: ProcessMessageRequestInner { + message: hex::encode(RawHyperlaneMessage::from(message)), + metadata: hex::encode(metadata), + }, + }; + + let response: SimulateResponse = self.provider.wasm_simulate(process_message).await?; + let result = TxCostEstimate { + gas_limit: U256::from(response.gas_info.unwrap().gas_used), + gas_price: U256::from(2500), + l2_gas_limit: None, + }; + + Ok(result) } fn process_calldata(&self, message: &HyperlaneMessage, metadata: &[u8]) -> Vec { - todo!() + todo!() // not required } } /// Struct that retrieves event data for a Cosmos Mailbox contract #[derive(Debug)] -pub struct CosmosMailboxIndexer {} +pub struct CosmosMailboxIndexer { + indexer: Box, +} + +impl CosmosMailboxIndexer { + /// Create a reference to a mailbox at a specific Ethereum address on some + /// chain + pub fn new(address: String, rpc_endpoint: String) -> Self { + let indexer = CosmosWasmIndexer::new( + address, + "mailbox_dispatch".to_string(), + rpc_endpoint.parse().unwrap(), + ); + + Self { + indexer: Box::new(indexer), + } + } + + fn get_parser(&self) -> fn(attrs: Vec) -> HyperlaneMessage { + |attrs: Vec| -> HyperlaneMessage { + let mut res = HyperlaneMessage::default(); + + for attr in attrs { + let key = attr.key.as_str(); + let value = attr.value.as_str(); + + match key { + "version" => res.version = value.parse().unwrap(), + "nonce" => res.nonce = value.parse().unwrap(), + "origin" => res.origin = value.parse().unwrap(), + "sender" => { + res.sender = H256::from_slice(hex::decode(value).unwrap().as_slice()) + } + "destination" => res.destination = value.parse().unwrap(), + "recipient" => { + res.recipient = H256::from_slice(hex::decode(value).unwrap().as_slice()) + } + "body" => res.body = hex::decode(value).unwrap(), + _ => {} + } + } + + res + } + } +} #[async_trait] impl Indexer for CosmosMailboxIndexer { @@ -102,21 +283,40 @@ impl Indexer for CosmosMailboxIndexer { from: u32, to: u32, ) -> ChainResult> { - todo!() + let mut result: Vec<(HyperlaneMessage, LogMeta)> = vec![]; + let parser = self.get_parser(); + + for block_number in from..to { + let logs = self.indexer.get_event_log(block_number, parser).await?; + result.extend(logs); + } + + Ok(result) } async fn get_finalized_block_number(&self) -> ChainResult { - todo!() + self.indexer.latest_block_height().await } } #[async_trait] impl Indexer for CosmosMailboxIndexer { async fn fetch_logs(&self, from: u32, to: u32) -> ChainResult> { - todo!() + let mut result: Vec<(HyperlaneMessage, LogMeta)> = vec![]; + let parser: fn(Vec) -> HyperlaneMessage = self.get_parser(); + + for block_number in from..to { + let logs = self.indexer.get_event_log(block_number, parser).await?; + result.extend(logs); + } + + Ok(result + .into_iter() + .map(|(msg, meta)| (msg.id(), meta)) + .collect()) } async fn get_finalized_block_number(&self) -> ChainResult { - todo!() + self.indexer.latest_block_height().await } } diff --git a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs index 57fd81a510..631359a16c 100644 --- a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs @@ -1,22 +1,72 @@ +use crate::{ + grpc::{WasmGrpcProvider, WasmProvider}, + verify, +}; use async_trait::async_trait; +use cosmrs::crypto::secp256k1::SigningKey; use hyperlane_core::{ ChainResult, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneMessage, - HyperlaneProvider, MultisigIsm, H256, + HyperlaneProvider, MultisigIsm, RawHyperlaneMessage, H256, +}; + +use crate::{ + payloads::multisig_ism::{self, VerifyInfoRequest, VerifyInfoRequestInner}, + verify::bech32_decode, }; /// A reference to a MultisigIsm contract on some Cosmos chain #[derive(Debug)] -pub struct CosmosMultisigIsm {} +pub struct CosmosMultisigIsm { + domain: HyperlaneDomain, + address: String, + provider: Box, +} + +impl CosmosMultisigIsm { + /// create a new instance of CosmosMultisigIsm + pub fn new( + domain: HyperlaneDomain, + address: String, + prefix: String, + private_key: Vec, + grpc_endpoint: String, + chain_id: String, + ) -> Self { + let signer_address = verify::pub_to_addr( + SigningKey::from_slice(&private_key) + .unwrap() + .public_key() + .to_bytes(), + &prefix, + ) + .unwrap(); + + let provider = WasmGrpcProvider::new( + address.clone(), + private_key, + signer_address, + prefix, + grpc_endpoint, + chain_id, + ); + + Self { + domain, + address, + provider: Box::new(provider), + } + } +} impl HyperlaneContract for CosmosMultisigIsm { fn address(&self) -> H256 { - todo!() + bech32_decode(self.address.clone()) } } impl HyperlaneChain for CosmosMultisigIsm { fn domain(&self) -> &HyperlaneDomain { - todo!() + &self.domain } fn provider(&self) -> Box { @@ -31,6 +81,21 @@ impl MultisigIsm for CosmosMultisigIsm { &self, message: &HyperlaneMessage, ) -> ChainResult<(Vec, u8)> { - todo!() + let payload = VerifyInfoRequest { + verify_info: VerifyInfoRequestInner { + message: hex::encode(RawHyperlaneMessage::from(message)), + }, + }; + + let data = self.provider.wasm_query(payload, None).await?; + let response: multisig_ism::VerifyInfoResponse = serde_json::from_slice(&data)?; + + let validators: Vec = response + .validators + .iter() + .map(|v| bech32_decode(v.clone())) + .collect(); + + Ok((validators, response.threshold)) } } diff --git a/rust/chains/hyperlane-cosmos/src/payloads/general.rs b/rust/chains/hyperlane-cosmos/src/payloads/general.rs new file mode 100644 index 0000000000..b519ee83c7 --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/payloads/general.rs @@ -0,0 +1,4 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Debug)] +pub struct EmptyStruct {} diff --git a/rust/chains/hyperlane-cosmos/src/payloads/ism_routes.rs b/rust/chains/hyperlane-cosmos/src/payloads/ism_routes.rs new file mode 100644 index 0000000000..c659cc5660 --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/payloads/ism_routes.rs @@ -0,0 +1,16 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Debug)] +pub struct IsmRouteRequest { + pub route: IsmRouteRequestInner, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct IsmRouteRequestInner { + pub message: String, // hexbinary +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct IsmRouteRespnose { + pub ism: String, +} diff --git a/rust/chains/hyperlane-cosmos/src/payloads/mailbox.rs b/rust/chains/hyperlane-cosmos/src/payloads/mailbox.rs new file mode 100644 index 0000000000..298e1aa03c --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/payloads/mailbox.rs @@ -0,0 +1,64 @@ +use serde::{Deserialize, Serialize}; + +use super::general::EmptyStruct; + +const TREE_DEPTH: usize = 32; +// Requests + +#[derive(Serialize, Deserialize, Debug)] +pub struct CountRequest { + pub count: EmptyStruct, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct DefaultIsmRequest { + pub default_ism: EmptyStruct, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct DeliveredRequest { + pub message_delivered: DeliveredRequestInner, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct DeliveredRequestInner { + pub id: String, // hexbinary +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct MerkleTreeRequest { + pub merkle_tree: EmptyStruct, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct ProcessMessageRequest { + pub process_message: ProcessMessageRequestInner, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct ProcessMessageRequestInner { + pub metadata: String, + pub message: String, +} +// Responses + +#[derive(Serialize, Deserialize, Debug)] +pub struct CountResponse { + pub count: u32, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct DefaultIsmResponse { + pub default_ism: String, // hexbineary +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct DeliveredResponse { + pub delivered: bool, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct MerkleTreeResponse { + pub branch: [String; TREE_DEPTH], + pub count: u32, +} diff --git a/rust/chains/hyperlane-cosmos/src/payloads/mod.rs b/rust/chains/hyperlane-cosmos/src/payloads/mod.rs new file mode 100644 index 0000000000..209169158d --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/payloads/mod.rs @@ -0,0 +1,5 @@ +pub mod general; +pub mod ism_routes; +pub mod mailbox; +pub mod multisig_ism; +pub mod validator_announce; diff --git a/rust/chains/hyperlane-cosmos/src/payloads/multisig_ism.rs b/rust/chains/hyperlane-cosmos/src/payloads/multisig_ism.rs new file mode 100644 index 0000000000..204e726dc7 --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/payloads/multisig_ism.rs @@ -0,0 +1,17 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Debug)] +pub struct VerifyInfoRequest { + pub verify_info: VerifyInfoRequestInner, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct VerifyInfoRequestInner { + pub message: String, // hexbinary +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct VerifyInfoResponse { + pub threshold: u8, + pub validators: Vec, +} diff --git a/rust/chains/hyperlane-cosmos/src/payloads/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/payloads/validator_announce.rs new file mode 100644 index 0000000000..a5754fe879 --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/payloads/validator_announce.rs @@ -0,0 +1,42 @@ +use serde::{Deserialize, Serialize}; + +use super::general::EmptyStruct; + +#[derive(Serialize, Deserialize, Debug)] +pub struct GetAnnouncedValidatorsRequest { + pub get_announced_validators: EmptyStruct, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct GetAnnounceStorageLocationsRequest { + pub get_announce_storage_locations: GetAnnounceStorageLocationsRequestInner, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct GetAnnounceStorageLocationsRequestInner { + pub validators: Vec, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct AnnouncementRequest { + pub announcement: AnnouncementRequestInner, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct AnnouncementRequestInner { + pub validator: String, + pub storage_location: String, + pub signature: String, +} + +// ========= resp ============ + +#[derive(Serialize, Deserialize, Debug)] +pub struct GetAnnouncedValidatorsResponse { + pub validators: Vec, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct GetAnnounceStorageLocationsResponse { + pub storage_locations: Vec<(String, Vec)>, +} diff --git a/rust/chains/hyperlane-cosmos/src/provider.rs b/rust/chains/hyperlane-cosmos/src/provider.rs index 14f13a4e44..37879418bd 100644 --- a/rust/chains/hyperlane-cosmos/src/provider.rs +++ b/rust/chains/hyperlane-cosmos/src/provider.rs @@ -1,33 +1,78 @@ +use std::{fmt, sync::Arc}; + use async_trait::async_trait; +use cosmrs::tendermint::{hash::Algorithm, Hash}; use hyperlane_core::{ - BlockInfo, ChainResult, HyperlaneChain, HyperlaneDomain, HyperlaneProvider, TxnInfo, H256, + BlockInfo, ChainCommunicationError, ChainResult, HyperlaneChain, HyperlaneDomain, + HyperlaneProvider, TxnInfo, H256, }; +use tendermint_rpc::{client::CompatMode, Client as CosmosClient}; /// A wrapper around a cosmos provider to get generic blockchain information. -#[derive(Debug)] -pub struct CosmosProvider {} +#[derive(Debug, Clone)] +pub struct CosmosProvider +where + C: CosmosClient + Send + Sync + fmt::Debug + 'static, +{ + compat_mode: CompatMode, + domain: HyperlaneDomain, + provider: Arc, +} -impl HyperlaneChain for CosmosProvider { +impl HyperlaneChain for CosmosProvider +where + C: CosmosClient + Send + Sync + fmt::Debug + 'static, +{ fn domain(&self) -> &HyperlaneDomain { - todo!() + &self.domain } fn provider(&self) -> Box { - todo!() + Box::new(CosmosProvider { + compat_mode: self.compat_mode, + domain: self.domain.clone(), + provider: self.provider.clone(), + }) } } #[async_trait] -impl HyperlaneProvider for CosmosProvider { +impl HyperlaneProvider for CosmosProvider +where + C: CosmosClient + Send + fmt::Debug + Sync + 'static, +{ async fn get_block_by_hash(&self, hash: &H256) -> ChainResult { - todo!() + // hash formats sha256 digest in bytes format (32bytes) + + // get block info from cosmos chain + let tm_hash: Hash = Hash::from_bytes(Algorithm::Sha256, hash.as_bytes()).unwrap(); + let block_info = self.provider.block_by_hash(tm_hash).await?; + + match block_info.block { + Some(block) => { + let block_hash = block.header.hash(); + let block_number = block.header.height.value(); + let block_timestamp = block.header.time; + + Ok(BlockInfo { + hash: *hash, + timestamp: block_timestamp.unix_timestamp().try_into().unwrap(), + number: block_number, + }) + } + None => Err(ChainCommunicationError::BlockNotFound(*hash)), + } } async fn get_txn_by_hash(&self, hash: &H256) -> ChainResult { + // hash formats sha256 digest in bytes format (32bytes) + + let tm_hash: Hash = Hash::from_bytes(Algorithm::Sha256, hash.as_bytes()).unwrap(); + let txn_info = self.provider.tx(tm_hash, true).await?; + todo!() } - async fn is_contract(&self, address: &H256) -> ChainResult { todo!() } diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs new file mode 100644 index 0000000000..b992c18cc9 --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -0,0 +1,258 @@ +use async_trait::async_trait; +use cosmrs::crypto::secp256k1::SigningKey; +use cosmrs::proto::cosmos::auth::v1beta1::BaseAccount; +use cosmrs::proto::cosmos::auth::v1beta1::{ + query_client::QueryClient as QueryAccountClient, QueryAccountRequest, +}; +use cosmrs::proto::cosmos::base::abci::v1beta1::TxResponse; +use cosmrs::proto::cosmos::base::tendermint::v1beta1::{ + service_client::ServiceClient, GetLatestBlockRequest, +}; +use cosmrs::proto::cosmos::tx::v1beta1::service_client::ServiceClient as TxServiceClient; +use cosmrs::proto::cosmos::tx::v1beta1::{ + BroadcastMode, BroadcastTxRequest, SimulateRequest, SimulateResponse, +}; +use cosmrs::proto::cosmwasm::wasm::v1::{ + query_client::QueryClient as WasmQueryClient, MsgExecuteContract, + QuerySmartContractStateRequest, +}; +use cosmrs::proto::traits::Message; + +use cosmrs::tx::{self, Fee, MessageExt, SignDoc, SignerInfo}; +use cosmrs::Coin; +use hyperlane_core::{ChainResult, U256}; +use serde::Serialize; +use std::num::NonZeroU64; +use std::str::FromStr; + +#[async_trait] +/// Cosmwasm GRPC Provider +pub trait WasmProvider: Send + Sync { + /// get latest block height + async fn latest_block_height(&self) -> ChainResult; + /// query to already define contract address + async fn wasm_query( + &self, + payload: T, + maybe_lag: Option, + ) -> ChainResult>; + /// query to specific contract address + async fn wasm_query_to( + &self, + to: String, + payload: T, + maybe_lag: Option, + ) -> ChainResult>; + /// query account info + async fn account_query(&self, address: String) -> ChainResult; + /// generate raw tx + async fn generate_raw_tx( + &self, + payload: T, + gas_limit: Option, + ) -> ChainResult>; + /// send tx + async fn wasm_send( + &self, + payload: T, + gas_limit: Option, + ) -> ChainResult; + /// simulate tx + async fn wasm_simulate( + &self, + payload: T, + ) -> ChainResult; +} + +#[derive(Debug)] +/// Cosmwasm GRPC Provider +pub struct WasmGrpcProvider { + address: String, + private_key: Vec, + signer_address: String, + prefix: String, + grpc_endpoint: String, // grpc_endpoint + chain_id: String, +} + +impl WasmGrpcProvider { + /// create new Cosmwasm GRPC Provider + pub fn new( + address: String, + private_key: Vec, + signer_address: String, + prefix: String, + grpc_endpoint: String, + chain_id: String, + ) -> Self { + Self { + address, + private_key, + signer_address, + prefix, + grpc_endpoint, + chain_id, + } + } +} + +#[async_trait] +impl WasmProvider for WasmGrpcProvider { + async fn latest_block_height(&self) -> ChainResult { + let mut client = ServiceClient::connect(self.grpc_endpoint.clone()).await?; + + let request = tonic::Request::new(GetLatestBlockRequest {}); + + let response = client.get_latest_block(request).await.unwrap().into_inner(); + let height = response.block.unwrap().header.unwrap().height; + + Ok(height as u64) + } + + async fn wasm_query(&self, payload: T, maybe_lag: Option) -> ChainResult> + where + T: Serialize + Send + Sync, + { + let mut client = WasmQueryClient::connect(self.grpc_endpoint.clone()).await?; + + let mut request = tonic::Request::new(QuerySmartContractStateRequest { + address: self.address.clone(), + query_data: serde_json::to_string(&payload)?.as_bytes().to_vec(), + }); + + if let Some(lag) = maybe_lag { + let height = self.latest_block_height().await?; + let height = height.saturating_sub(lag.get()); + + request + .metadata_mut() + .insert("x-cosmos-block-height", height.into()); + } + + let response = client + .smart_contract_state(request) + .await + .unwrap() + .into_inner(); + + // TODO: handle query to specific block number + Ok(response.data) + } + + async fn wasm_query_to( + &self, + to: String, + payload: T, + maybe_lag: Option, + ) -> ChainResult> + where + T: Serialize + Send + Sync, + { + let mut client = WasmQueryClient::connect(self.grpc_endpoint.clone()).await?; + + let mut request = tonic::Request::new(QuerySmartContractStateRequest { + address: to, + query_data: serde_json::to_string(&payload)?.as_bytes().to_vec(), + }); + + if let Some(lag) = maybe_lag { + let height = self.latest_block_height().await?; + let height = height.saturating_sub(lag.get()); + + request + .metadata_mut() + .insert("x-cosmos-block-height", height.into()); + } + + let response = client + .smart_contract_state(request) + .await + .unwrap() + .into_inner(); + + // TODO: handle query to specific block number + Ok(response.data) + } + + async fn account_query(&self, account: String) -> ChainResult { + let mut client = QueryAccountClient::connect(self.grpc_endpoint.clone()).await?; + + let request = tonic::Request::new(QueryAccountRequest { address: account }); + let response = client.account(request).await.unwrap().into_inner(); + + let account = BaseAccount::decode(response.account.unwrap().value.as_slice())?; + Ok(account) + } + + async fn generate_raw_tx(&self, payload: T, gas_limit: Option) -> ChainResult> + where + T: Serialize + Send + Sync, + { + let account_info = self.account_query(self.signer_address.clone()).await?; + + let msg = MsgExecuteContract { + sender: self.address.clone(), + contract: self.address.clone(), + msg: serde_json::to_string(&payload)?.as_bytes().to_vec(), + funds: vec![], + }; + + let private_key = SigningKey::from_slice(&self.private_key).unwrap(); + let public_key = private_key.public_key(); + + let tx_body = tx::Body::new(vec![msg.to_any().unwrap()], "", 900u16); + let signer_info = SignerInfo::single_direct(Some(public_key), account_info.sequence); + + let gas_limit: u64 = gas_limit + .unwrap_or(U256::from_str("100000").unwrap()) + .as_u64(); + + let auth_info = signer_info.auth_info(Fee::from_amount_and_gas( + Coin { + denom: format!("u{}", self.prefix).parse().unwrap(), + amount: 10000u128, + }, + gas_limit, + )); + + // signing + let sign_doc = SignDoc::new( + &tx_body, + &auth_info, + &self.chain_id.parse().unwrap(), + account_info.account_number, + ) + .unwrap(); + let tx_signed = sign_doc.sign(&private_key).unwrap(); + + Ok(tx_signed.to_bytes().unwrap()) + } + + async fn wasm_send(&self, payload: T, gas_limit: Option) -> ChainResult + where + T: Serialize + Send + Sync, + { + let mut client = TxServiceClient::connect(self.grpc_endpoint.clone()).await?; + let tx_bytes = self.generate_raw_tx(payload, gas_limit).await?; + let request = tonic::Request::new(BroadcastTxRequest { + tx_bytes, + mode: BroadcastMode::Block as i32, + }); + + let response = client.broadcast_tx(request).await.unwrap().into_inner(); + Ok(response.tx_response.unwrap()) + } + + async fn wasm_simulate(&self, payload: T) -> ChainResult + where + T: Serialize + Send + Sync, + { + let mut client = TxServiceClient::connect(self.grpc_endpoint.clone()).await?; + let tx_bytes = self.generate_raw_tx(payload, None).await?; + + let request = tonic::Request::new(SimulateRequest { tx: None, tx_bytes }); + let response = client.simulate(request).await.unwrap().into_inner(); + + Ok(response) + } +} diff --git a/rust/chains/hyperlane-cosmos/src/providers/mod.rs b/rust/chains/hyperlane-cosmos/src/providers/mod.rs new file mode 100644 index 0000000000..b9416e7393 --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/providers/mod.rs @@ -0,0 +1,4 @@ +/// cosmos grpc provider +pub mod grpc; +/// cosmos rpc provider +pub mod rpc; diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs new file mode 100644 index 0000000000..20fe5d6c23 --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -0,0 +1,131 @@ +use async_trait::async_trait; +use cosmrs::rpc::client::{Client, CompatMode, HttpClient, HttpClientUrl}; +use cosmrs::tendermint::abci::EventAttribute; +use cosmrs::tendermint::hash::Algorithm; +use cosmrs::tendermint::Hash; +use hyperlane_core::{ChainResult, LogMeta, H256, U256}; +use sha256::digest; + +use crate::verify::bech32_decode; + +#[async_trait] +/// Trait for wasm indexer. Use rpc provider +pub trait WasmIndexer: Send + Sync { + /// get rpc client + fn get_client(&self) -> ChainResult; + /// get latest block height + async fn latest_block_height(&self) -> ChainResult; + /// get event log + async fn get_event_log( + &self, + block_number: u32, + parser: fn(Vec) -> T, + ) -> ChainResult> + where + T: Send + Sync; +} + +#[derive(Debug)] +/// Cosmwasm RPC Provider +pub struct CosmosWasmIndexer { + address: String, + rpc_endpoint: HttpClientUrl, // rpc_endpoint + target_type: String, +} + +impl CosmosWasmIndexer { + const WASM_TYPE: &str = "wasm"; + + /// create new Cosmwasm RPC Provider + pub fn new(address: String, target_type: String, rpc_endpoint: HttpClientUrl) -> Self { + Self { + address, + target_type, + rpc_endpoint, + } + } +} + +#[async_trait] +impl WasmIndexer for CosmosWasmIndexer { + fn get_client(&self) -> ChainResult { + Ok(HttpClient::builder(self.rpc_endpoint.clone()) + .compat_mode(CompatMode::V0_34) + .build()?) + } + + async fn latest_block_height(&self) -> ChainResult { + let client = self.get_client()?; + + let result = client.latest_block().await?; + Ok(result.block.header.height.value() as u32) + } + + async fn get_event_log( + &self, + block_number: u32, + parser: fn(Vec) -> T, + ) -> ChainResult> + where + T: Send + Sync, + { + let client = self.get_client()?; + + let block = client.block(block_number).await?; + let block_result = client.block_results(block_number).await?; + + let tx_hash: Vec = block + .block + .data + .into_iter() + .map(|tx| { + H256::from_slice( + Hash::from_bytes( + Algorithm::Sha256, + hex::decode(digest(tx.as_slice())).unwrap().as_slice(), + ) + .unwrap() + .as_bytes(), + ) + }) + .collect(); + + let mut result: Vec<(T, LogMeta)> = vec![]; + let tx_results = block_result.txs_results.unwrap(); + + for (idx, tx) in tx_results.iter().enumerate() { + let tx_hash = tx_hash[idx]; + let mut available = false; + + let mut parse_result: Vec<(T, LogMeta)> = vec![]; + + for (log_idx, event) in tx.events.clone().iter().enumerate() { + if event.kind.as_str().starts_with(Self::WASM_TYPE) + && event.attributes[0].value == self.address + { + available = true; + } else if event.kind.as_str() != self.target_type.as_str() { + continue; + } + + let msg = parser(event.attributes.clone()); + let meta = LogMeta { + address: bech32_decode(self.address.clone()), + block_number: block_number as u64, + block_hash: H256::from_slice(block.block_id.hash.as_bytes()), + transaction_hash: H256::from_slice(tx_hash.clone().as_bytes()), + transaction_index: idx as u64, + log_index: U256::from(log_idx), + }; + + parse_result.push((msg, meta)); + } + + if available { + result.extend(parse_result); + } + } + + Ok(result) + } +} diff --git a/rust/chains/hyperlane-cosmos/src/routing_ism.rs b/rust/chains/hyperlane-cosmos/src/routing_ism.rs index a61eee9361..17075243b2 100644 --- a/rust/chains/hyperlane-cosmos/src/routing_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/routing_ism.rs @@ -1,23 +1,70 @@ use async_trait::async_trait; +use cosmrs::crypto::secp256k1::SigningKey; use hyperlane_core::{ ChainResult, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneMessage, - HyperlaneProvider, RoutingIsm, H256, + HyperlaneProvider, RawHyperlaneMessage, RoutingIsm, H256, +}; + +use crate::{ + grpc::{WasmGrpcProvider, WasmProvider}, + payloads::ism_routes::{IsmRouteRequest, IsmRouteRequestInner, IsmRouteRespnose}, + verify::{self, bech32_decode}, }; /// A reference to a RoutingIsm contract on some Cosmos chain #[derive(Debug)] -pub struct CosmosRoutingIsm {} +pub struct CosmosRoutingIsm { + domain: HyperlaneDomain, + address: String, + provider: Box, +} + +impl CosmosRoutingIsm { + /// create a new instance of CosmosRoutingIsm + pub fn new( + domain: HyperlaneDomain, + address: String, + prefix: String, + private_key: Vec, + grpc_endpoint: String, + chain_id: String, + ) -> Self { + let signer_address = verify::pub_to_addr( + SigningKey::from_slice(&private_key) + .unwrap() + .public_key() + .to_bytes(), + &prefix, + ) + .unwrap(); + + let provider = WasmGrpcProvider::new( + address.clone(), + private_key, + signer_address, + prefix, + grpc_endpoint, + chain_id, + ); + + Self { + domain, + address, + provider: Box::new(provider), + } + } +} impl HyperlaneContract for CosmosRoutingIsm { fn address(&self) -> H256 { - todo!() + bech32_decode(self.address.clone()) } } impl HyperlaneChain for CosmosRoutingIsm { fn domain(&self) -> &HyperlaneDomain { - todo!() + &self.domain } fn provider(&self) -> Box { @@ -28,6 +75,15 @@ impl HyperlaneChain for CosmosRoutingIsm { #[async_trait] impl RoutingIsm for CosmosRoutingIsm { async fn route(&self, message: &HyperlaneMessage) -> ChainResult { - todo!() + let payload = IsmRouteRequest { + route: IsmRouteRequestInner { + message: hex::encode(RawHyperlaneMessage::from(message)), + }, + }; + + let data = self.provider.wasm_query(payload, None).await?; + let response: IsmRouteRespnose = serde_json::from_slice(&data)?; + + Ok(bech32_decode(response.ism)) } } diff --git a/rust/chains/hyperlane-cosmos/src/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/validator_announce.rs index 09ec283ff8..9cd7964aa9 100644 --- a/rust/chains/hyperlane-cosmos/src/validator_announce.rs +++ b/rust/chains/hyperlane-cosmos/src/validator_announce.rs @@ -1,23 +1,66 @@ use async_trait::async_trait; +use cosmrs::{crypto::secp256k1::SigningKey, proto::cosmos::base::abci::v1beta1::TxResponse}; use hyperlane_core::{ Announcement, ChainResult, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneProvider, SignedType, TxOutcome, ValidatorAnnounce, H256, U256, }; +use crate::{ + grpc::{WasmGrpcProvider, WasmProvider}, + payloads::validator_announce::{ + self, AnnouncementRequest, AnnouncementRequestInner, GetAnnounceStorageLocationsRequest, + GetAnnounceStorageLocationsRequestInner, + }, + verify::{bech32_decode, pub_to_addr}, +}; + /// A reference to a ValidatorAnnounce contract on some Cosmos chain #[derive(Debug)] -pub struct CosmosValidatorAnnounce {} +pub struct CosmosValidatorAnnounce { + domain: HyperlaneDomain, + address: String, + provider: Box, +} + +impl CosmosValidatorAnnounce { + /// create a new instance of CosmosValidatorAnnounce + pub fn new( + domain: HyperlaneDomain, + address: String, + private_key: Vec, + prefix: String, + grpc_endpoint: String, + chain_id: String, + ) -> Self { + let priv_key = SigningKey::from_slice(&private_key).unwrap(); + let signer_address = pub_to_addr(priv_key.public_key().to_bytes(), &prefix).unwrap(); + let provider = WasmGrpcProvider::new( + address.clone(), + private_key, + signer_address, + prefix, + grpc_endpoint, + chain_id, + ); + + Self { + domain, + address, + provider: Box::new(provider), + } + } +} impl HyperlaneContract for CosmosValidatorAnnounce { fn address(&self) -> H256 { - todo!() + bech32_decode(self.address.clone()) } } impl HyperlaneChain for CosmosValidatorAnnounce { fn domain(&self) -> &HyperlaneDomain { - todo!() + &self.domain } fn provider(&self) -> Box { @@ -31,7 +74,24 @@ impl ValidatorAnnounce for CosmosValidatorAnnounce { &self, validators: &[H256], ) -> ChainResult>> { - todo!() + let payload = GetAnnounceStorageLocationsRequest { + get_announce_storage_locations: GetAnnounceStorageLocationsRequestInner { + validators: validators + .iter() + .map(|v| hex::encode(v.as_bytes())) + .collect::>(), + }, + }; + + let data: Vec = self.provider.wasm_query(payload, None).await?; + let response: validator_announce::GetAnnounceStorageLocationsResponse = + serde_json::from_slice(&data)?; + + Ok(response + .storage_locations + .into_iter() + .map(|v| v.1) + .collect()) } async fn announce( @@ -39,13 +99,30 @@ impl ValidatorAnnounce for CosmosValidatorAnnounce { announcement: SignedType, tx_gas_limit: Option, ) -> ChainResult { - todo!() + let announce_request = AnnouncementRequest { + announcement: AnnouncementRequestInner { + validator: announcement.value.validator.to_string(), + storage_location: announcement.value.storage_location, + signature: hex::encode(announcement.signature.to_vec()), + }, + }; + + let response: TxResponse = self + .provider + .wasm_send(announce_request, tx_gas_limit) + .await?; + Ok(TxOutcome { + txid: H256::from_slice(hex::decode(response.txhash).unwrap().as_slice()), + executed: response.code == 0, + gas_used: U256::from(response.gas_used), + gas_price: U256::from(response.gas_wanted), + }) } async fn announce_tokens_needed( &self, announcement: SignedType, ) -> ChainResult { - todo!() + todo!() // not implemented yet } } diff --git a/rust/chains/hyperlane-cosmos/src/verify.rs b/rust/chains/hyperlane-cosmos/src/verify.rs new file mode 100644 index 0000000000..037c6bd3d3 --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/verify.rs @@ -0,0 +1,73 @@ +use std::cmp; + +use bech32::{FromBase32, ToBase32}; +use hyperlane_core::{ChainCommunicationError, ChainResult, H256}; +use ripemd::Ripemd160; +use sha2::{Digest, Sha256}; + +pub fn bech32_decode(addr: String) -> H256 { + let (_hrp, data, _variant) = bech32::decode(addr.as_str()).unwrap(); + + let value = Vec::::from_base32(&data).unwrap(); + let mut result: [u8; 32] = [0; 32]; + + let start_point = cmp::max(0, 32 - value.len()); + result[start_point..32].copy_from_slice(value.as_slice()); + + H256::from(result) +} + +pub fn digest_to_addr(digest: H256, prefix: &str) -> ChainResult { + let addr = bech32::encode( + prefix, + digest.as_bytes().to_base32(), + bech32::Variant::Bech32, + ) + .map_err(|_| ChainCommunicationError::InvalidRequest { + msg: "invalid address".to_string(), + })?; + + Ok(addr) +} + +pub fn sha256_digest(bz: impl AsRef<[u8]>) -> ChainResult<[u8; 32]> { + let mut hasher = Sha256::new(); + + hasher.update(bz); + + hasher + .finalize() + .as_slice() + .try_into() + .map_err(|_| ChainCommunicationError::ParseError { + msg: "sha256 digest".to_string(), + }) +} + +pub fn ripemd160_digest(bz: impl AsRef<[u8]>) -> ChainResult<[u8; 20]> { + let mut hasher = Ripemd160::new(); + + hasher.update(bz); + + hasher + .finalize() + .as_slice() + .try_into() + .map_err(|_| ChainCommunicationError::ParseError { + msg: "ripemd160".to_string(), + }) +} + +pub fn pub_to_addr(pub_key: Vec, prefix: &str) -> ChainResult { + let sha_hash = sha256_digest(pub_key)?; + let rip_hash = ripemd160_digest(sha_hash)?; + + let addr = + bech32::encode(prefix, rip_hash.to_base32(), bech32::Variant::Bech32).map_err(|_| { + ChainCommunicationError::ParseError { + msg: "bech32".to_string(), + } + })?; + + Ok(addr) +} diff --git a/rust/hyperlane-core/Cargo.toml b/rust/hyperlane-core/Cargo.toml index 6489974004..38d59018f7 100644 --- a/rust/hyperlane-core/Cargo.toml +++ b/rust/hyperlane-core/Cargo.toml @@ -2,12 +2,12 @@ cargo-features = ["workspace-inheritance"] [package] name = "hyperlane-core" -documentation.workspace = true -edition.workspace = true -homepage.workspace = true -license-file.workspace = true -publish.workspace = true -version.workspace = true +documentation = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +license-file = { workspace = true } +publish = { workspace = true } +version = { workspace = true } [dependencies] async-trait.workspace = true @@ -39,8 +39,13 @@ strum = { workspace = true, optional = true, features = ["derive"] } thiserror.workspace = true tiny-keccak = { workspace = true, features = ["keccak"]} uint.workspace = true +tonic = { workspace = true } +cosmrs = { workspace = true } +tendermint-rpc = { workspace = true } [dev-dependencies] +config = { workspace = true } +hyperlane-base = { path = "../hyperlane-base" } tokio = { workspace = true, features = ["rt", "time"] } [features] diff --git a/rust/hyperlane-core/src/accumulator/incremental.rs b/rust/hyperlane-core/src/accumulator/incremental.rs index f967b452d4..0c265202e8 100644 --- a/rust/hyperlane-core/src/accumulator/incremental.rs +++ b/rust/hyperlane-core/src/accumulator/incremental.rs @@ -10,8 +10,10 @@ use crate::accumulator::{ #[derive(BorshDeserialize, BorshSerialize, Debug, Clone, Copy, new, PartialEq, Eq)] /// An incremental merkle tree, modeled on the eth2 deposit contract pub struct IncrementalMerkle { - branch: [H256; TREE_DEPTH], - count: usize, + /// The branch of the tree + pub branch: [H256; TREE_DEPTH], + /// The number of leaves in the tree + pub count: usize, } impl Default for IncrementalMerkle { diff --git a/rust/hyperlane-core/src/error.rs b/rust/hyperlane-core/src/error.rs index 3be9490610..278b5947c4 100644 --- a/rust/hyperlane-core/src/error.rs +++ b/rust/hyperlane-core/src/error.rs @@ -4,6 +4,12 @@ use std::fmt::{Debug, Display, Formatter}; use std::ops::Deref; use crate::config::StrOrIntParseError; +use cosmrs::proto::prost; +use cosmrs::Error as CosmrsError; +use ethers_contract::ContractError; +use ethers_core::types::SignatureError; +use ethers_providers::{Middleware, ProviderError}; + use crate::HyperlaneProviderError; use crate::H256; @@ -78,6 +84,39 @@ pub enum ChainCommunicationError { /// Failed to parse strings or integers #[error("Data parsing error {0:?}")] StrOrIntParseError(#[from] StrOrIntParseError), + /// Tendermint RPC Error + #[error(transparent)] + TendermintError(#[from] tendermint_rpc::error::Error), + /// BlockNotFoundError + #[error("Block not found: {0:?}")] + BlockNotFound(H256), + /// Cosmrs library error + #[error("{0}")] + Cosmrs(#[from] CosmrsError), + /// Tonic error + #[error("{0}")] + Tonic(#[from] tonic::transport::Error), + /// protobuf error + #[error("{0}")] + Protobuf(#[from] prost::DecodeError), + /// Serde JSON error + #[error("{0}")] + JsonParseError(#[from] serde_json::Error), + /// Hex parse error + #[error("{0}")] + HexParseError(#[from] hex::FromHexError), + /// Invalid Request + #[error("Invalid Request: {msg:?}")] + InvalidRequest { + /// Error message + msg: String, + }, + /// Parse Error + #[error("ParseError: {msg:?}")] + ParseError { + /// Error message + msg: String, + }, } impl ChainCommunicationError { From 0e4340dc075e41cbaa58c5952215e318325dcf10 Mon Sep 17 00:00:00 2001 From: hashableric Date: Thu, 10 Aug 2023 17:05:31 +0900 Subject: [PATCH 006/142] feat: fix cargo error --- rust/Cargo.lock | 7 +++++++ rust/Cargo.toml | 2 +- rust/hyperlane-core/Cargo.toml | 18 +++++++++--------- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 2546745f85..98af4db0fe 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -3899,6 +3899,7 @@ dependencies = [ "hex 0.4.3", "hyperlane-base", "itertools 0.11.0", + "lazy_static", "num 0.4.1", "num-derive 0.4.1", "num-traits", @@ -9058,9 +9059,12 @@ name = "strum" version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +<<<<<<< HEAD dependencies = [ "strum_macros 0.25.3", ] +======= +>>>>>>> 59dbe23de (feat: fix cargo error) [[package]] name = "strum_macros" @@ -9088,6 +9092,7 @@ dependencies = [ ] [[package]] +<<<<<<< HEAD name = "strum_macros" version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -9101,6 +9106,8 @@ dependencies = [ ] [[package]] +======= +>>>>>>> 59dbe23de (feat: fix cargo error) name = "subtle" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 81e03f01c5..5c41a197b3 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -81,7 +81,6 @@ futures = "0.3" futures-util = "0.3" generic-array = { version = "1.0", features = ["serde", "more_lengths"] } getrandom = { version = "0.2", features = ["js"] } # Required for WASM support https://docs.rs/getrandom/latest/getrandom/#webassembly-support -hex = "0.4" itertools = "0.11.0" jsonrpc-core = "18.0" log = "0.4" @@ -153,6 +152,7 @@ sha2 = { version = "0.10.6", default-features = false } ripemd = "0.1.3" hyper = "0.14" hyper-tls = "0.5.0" +hex = "0.4.3" tendermint-rpc = { version = "0.32.0", features = ["http-client", "tokio"]} [workspace.dependencies.ethers] diff --git a/rust/hyperlane-core/Cargo.toml b/rust/hyperlane-core/Cargo.toml index 38d59018f7..7ccc817f25 100644 --- a/rust/hyperlane-core/Cargo.toml +++ b/rust/hyperlane-core/Cargo.toml @@ -30,21 +30,21 @@ itertools.workspace = true num = { workspace = true, features = ["serde"] } num-derive.workspace = true num-traits.workspace = true +serde = { workspace = true } +serde_json = { workspace = true } +sha3 = { workspace = true } +strum = { workspace = true, optional = true } +thiserror = { workspace = true } +tonic = { workspace = true } +cosmrs = { workspace = true } +tendermint-rpc = { workspace = true } +lazy_static = "*" primitive-types = { workspace = true, optional = true } -serde.workspace = true -serde_json.workspace = true -sha3.workspace = true solana-sdk = { workspace = true, optional = true } -strum = { workspace = true, optional = true, features = ["derive"] } -thiserror.workspace = true tiny-keccak = { workspace = true, features = ["keccak"]} uint.workspace = true -tonic = { workspace = true } -cosmrs = { workspace = true } -tendermint-rpc = { workspace = true } [dev-dependencies] -config = { workspace = true } hyperlane-base = { path = "../hyperlane-base" } tokio = { workspace = true, features = ["rt", "time"] } From 8a681e254adedd12080556facce618857b308e91 Mon Sep 17 00:00:00 2001 From: hashableric Date: Fri, 11 Aug 2023 15:37:58 +0900 Subject: [PATCH 007/142] feat: add default trait implements --- rust/chains/hyperlane-cosmos/src/lib.rs | 1 + .../hyperlane-cosmos/src/providers/grpc.rs | 37 ++++------ rust/chains/hyperlane-cosmos/src/signers.rs | 17 +++++ .../hyperlane-cosmos/src/trait_builder.rs | 73 +++++++++++++++---- rust/config/cosmos_config.json | 29 ++++++++ rust/hyperlane-base/src/settings/signers.rs | 12 +++ 6 files changed, 130 insertions(+), 39 deletions(-) create mode 100644 rust/chains/hyperlane-cosmos/src/signers.rs create mode 100644 rust/config/cosmos_config.json diff --git a/rust/chains/hyperlane-cosmos/src/lib.rs b/rust/chains/hyperlane-cosmos/src/lib.rs index 2ce6708843..ac09bef4df 100644 --- a/rust/chains/hyperlane-cosmos/src/lib.rs +++ b/rust/chains/hyperlane-cosmos/src/lib.rs @@ -17,6 +17,7 @@ mod multisig_ism; mod payloads; mod providers; mod routing_ism; +mod signers; mod trait_builder; mod validator_announce; mod verify; diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index b992c18cc9..38d2d862e1 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -20,11 +20,13 @@ use cosmrs::proto::traits::Message; use cosmrs::tx::{self, Fee, MessageExt, SignDoc, SignerInfo}; use cosmrs::Coin; -use hyperlane_core::{ChainResult, U256}; +use hyperlane_core::{ChainResult, ContractLocator, U256}; use serde::Serialize; use std::num::NonZeroU64; use std::str::FromStr; +use crate::{ConnectionConf, Signer}; + #[async_trait] /// Cosmwasm GRPC Provider pub trait WasmProvider: Send + Sync { @@ -66,32 +68,19 @@ pub trait WasmProvider: Send + Sync { #[derive(Debug)] /// Cosmwasm GRPC Provider -pub struct WasmGrpcProvider { - address: String, - private_key: Vec, - signer_address: String, - prefix: String, - grpc_endpoint: String, // grpc_endpoint - chain_id: String, +pub struct WasmGrpcProvider<'a> { + conf: &'a ConnectionConf, + locator: &'a ContractLocator, + signer: &'a Signer, } impl WasmGrpcProvider { /// create new Cosmwasm GRPC Provider - pub fn new( - address: String, - private_key: Vec, - signer_address: String, - prefix: String, - grpc_endpoint: String, - chain_id: String, - ) -> Self { + pub fn new(conf: &ConnectionConf, locator: &ContractLocator, signer: &Signer) -> Self { Self { - address, - private_key, - signer_address, - prefix, - grpc_endpoint, - chain_id, + conf, + locator, + signer, } } } @@ -99,7 +88,7 @@ impl WasmGrpcProvider { #[async_trait] impl WasmProvider for WasmGrpcProvider { async fn latest_block_height(&self) -> ChainResult { - let mut client = ServiceClient::connect(self.grpc_endpoint.clone()).await?; + let mut client = ServiceClient::connect(self.conf.get_grpc_url()?).await?; let request = tonic::Request::new(GetLatestBlockRequest {}); @@ -113,7 +102,7 @@ impl WasmProvider for WasmGrpcProvider { where T: Serialize + Send + Sync, { - let mut client = WasmQueryClient::connect(self.grpc_endpoint.clone()).await?; + let mut client = WasmQueryClient::connect(self.conf.get_grpc_url()?).await?; let mut request = tonic::Request::new(QuerySmartContractStateRequest { address: self.address.clone(), diff --git a/rust/chains/hyperlane-cosmos/src/signers.rs b/rust/chains/hyperlane-cosmos/src/signers.rs new file mode 100644 index 0000000000..620f398642 --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/signers.rs @@ -0,0 +1,17 @@ +#[derive(Clone, Debug)] +pub struct Signer { + pub prefix: String, + pub(crate) private_key: Vec, +} + +impl Signer { + pub fn address(&self) -> String { + verify::pub_to_addr( + SigningKey::from_slice(self.private_key) + .unwrap() + .public_key() + .to_bytes(), + self.prefix.clone(), + ) + } +} diff --git a/rust/chains/hyperlane-cosmos/src/trait_builder.rs b/rust/chains/hyperlane-cosmos/src/trait_builder.rs index 70bf2c073d..ac973199d7 100644 --- a/rust/chains/hyperlane-cosmos/src/trait_builder.rs +++ b/rust/chains/hyperlane-cosmos/src/trait_builder.rs @@ -1,19 +1,28 @@ +use cosmrs::proto::cosmwasm::wasm::v1::query_client::QueryClient as WasmQueryClient; +use hyper::body::HttpBody; use hyperlane_core::config::{ConfigErrResultExt, ConfigPath, ConfigResult, FromRawConf}; use url::Url; /// Cosmos connection configuration #[derive(Debug, Clone)] -pub struct ConnectionConf { - // TODO: more settings? - #[allow(dead_code)] - url: Url, +pub enum ConnectionConf { + /// Cosmos RPC URL + RpcUrl { url: String, chain_id: String }, + /// Cosmos GRPC URL + GrpcUrl { url: String, chain_id: String }, } /// Raw Cosmos connection configuration used for better deserialization errors. #[derive(Debug, serde::Deserialize)] +#[serde(rename_all = "camelCase")] pub struct RawConnectionConf { - // TODO: more settings? + /// The type of connection to use + #[serde(rename = "type")] + connection_type: Option, + /// A single url to connect to url: Option, + /// The chain ID + chain_id: Option, } /// An error type when parsing a connection configuration. @@ -22,9 +31,17 @@ pub enum ConnectionConfError { /// Missing `url` for connection configuration #[error("Missing `url` for connection configuration")] MissingConnectionUrl, + /// Missing `chainId` for connection configuration + #[error("Missing `chainId` for connection configuration")] + MissingChainId, /// Invalid `url` for connection configuration #[error("Invalid `url` for connection configuration: `{0}` ({1})")] InvalidConnectionUrl(String, url::ParseError), + /// Invalid `url` type + InvalidConnectionType, + /// Unsupported `url` type + #[error("Unsupported connection type: '{0}'")] + UnsupportedConnectionType(String), } impl FromRawConf<'_, RawConnectionConf> for ConnectionConf { @@ -34,16 +51,42 @@ impl FromRawConf<'_, RawConnectionConf> for ConnectionConf { _filter: (), ) -> ConfigResult { use ConnectionConfError::*; - match raw { - RawConnectionConf { url: Some(url) } => Ok(Self { - url: url - .parse() - .map_err(|e| InvalidConnectionUrl(url, e)) - .into_config_result(|| cwp.join("url"))?, - }), - RawConnectionConf { url: None } => { - Err(MissingConnectionUrl).into_config_result(|| cwp.join("url")) - } + + let connectiont_type = raw.connection_type.as_deref().unwrap_or("grpc"); + let chain_id = raw.chain_id.ok_or(MissingChainId)?; + let url = raw.url.ok_or(MissingConnectionUrl)?; + + match connectiont_type { + "grpc" => Ok(ConnectionConf::GrpcUrl { url, chain_id }), + "rpc" => Ok(ConnectionConf::RpcUrl { url, chain_id }), + t => Err(UnsupportedConnectionType(t.to_string())), + } + } +} + +impl ConnectionConf { + /// Get the GRPC url + pub fn get_grpc_url(&self) -> Result { + if let ConnectionConf::GrpcUrl { url, .. } = self { + Ok(url.clone()) + } else { + Err(Error::InvalidConnectionType) + } + } + + /// Get the RPC url + pub fn get_rpc_url(&self) -> Result { + if let ConnectionConf::RpcUrl { url, .. } = self { + Ok(url.clone()) + } else { + Err(Error::InvalidConnectionType) + } + } + + pub fn get_chain_id(&self) -> String { + match self { + ConnectionConf::GrpcUrl { chain_id, .. } => chain_id.clone(), + ConnectionConf::RpcUrl { chain_id, .. } => chain_id.clone(), } } } diff --git a/rust/config/cosmos_config.json b/rust/config/cosmos_config.json new file mode 100644 index 0000000000..d1e87b036d --- /dev/null +++ b/rust/config/cosmos_config.json @@ -0,0 +1,29 @@ +{ + "chains": { + "mitosisgoerli": { + "name": "mitosisgoerli", + "domain": 26657, + "addresses": { + "mailbox": "0xF10238ba7f58B15F5FAAF32f370D55c65beeF2BE", + "interchainGasPaymaster": "0x30CEF6c8E8FbBA11D8a9Ba552eb0870AAa5747cc", + "validatorAnnounce": "0x6C4344110BA24eD5F2F98BFA3A6Fc045b1a702eC" + }, + "protocol": "ethereum", + "finalityBlocks": 1, + "index": { + "from": 3244 + } + }, + "osmosistestnet": { + "name": "osmosistestnet", + "domain": 21295, + "addresses": { + "mailbox": "0xaf9fb9e551459c6ac05cbec1913a8bc2c69617c3e91f4a53dbd8dc356aba7f19", + "interchainGasPaymaster": "0x8d234e850592f572d3fe582309c5729197e05ad30e33b2cfcbe7334583296a5b", + "validatorAnnounce": "0xd26f8b98e05d32c083868aa344f1eb882ba758d77a3fa66486aab63f2e253b41" + }, + "protocol": "cosmos", + "finalityBlocks": 1 + } + } +} \ No newline at end of file diff --git a/rust/hyperlane-base/src/settings/signers.rs b/rust/hyperlane-base/src/settings/signers.rs index df7f69ae90..340fccc299 100644 --- a/rust/hyperlane-base/src/settings/signers.rs +++ b/rust/hyperlane-base/src/settings/signers.rs @@ -10,6 +10,9 @@ use rusoto_core::{HttpClient, HttpConfig, Region}; use rusoto_kms::KmsClient; use tracing::instrument; +use ed25519_dalek::{SecretKey, Signer}; +use hyperlane_sealevel::Keypair; + use super::aws_credentials::AwsChainCredentialsProvider; /// Signer types @@ -28,7 +31,13 @@ pub enum SignerConf { /// The AWS region region: Region, }, +<<<<<<< HEAD /// Assume the local node will sign on RPC calls automatically +======= + /// Cosmos Specific key + CosmosKey { key: H256, prefix: String }, + /// Assume node will sign on RPC calls +>>>>>>> ee35aaef6 (feat: add default trait implements) #[default] Node, } @@ -73,6 +82,7 @@ impl BuildableWithSignerConf for hyperlane_ethereum::Signers { let signer = AwsSigner::new(client, id, 0).await?; hyperlane_ethereum::Signers::Aws(signer) } + SignerConf::CosmosKey { .. } => bail!("Cosmos signer"), // TODO: should be implement SignerConf::Node => bail!("Node signer"), }) } @@ -88,6 +98,7 @@ impl BuildableWithSignerConf for fuels::prelude::WalletUnlocked { fuels::prelude::WalletUnlocked::new_from_private_key(key, None) } SignerConf::Aws { .. } => bail!("Aws signer is not supported by fuel"), + SignerConf::CosmosKey { .. } => bail!("Cosmos signer is not supported by fuel"), SignerConf::Node => bail!("Node signer is not supported by fuel"), }) } @@ -104,6 +115,7 @@ impl BuildableWithSignerConf for Keypair { .context("Unable to create Keypair")? } SignerConf::Aws { .. } => bail!("Aws signer is not supported by fuel"), + SignerConf::CosmosKey { .. } => bail!("Cosmos signer is not supported by fuel"), SignerConf::Node => bail!("Node signer is not supported by fuel"), }) } From 8d674007292691b0c312ddb256f20f844ef01f92 Mon Sep 17 00:00:00 2001 From: hashableric Date: Fri, 11 Aug 2023 16:49:31 +0900 Subject: [PATCH 008/142] fix: change trait_builder into compatible --- rust/Cargo.lock | 17 ++++++++ rust/chains/hyperlane-cosmos/src/mailbox.rs | 35 +++------------ rust/chains/hyperlane-cosmos/src/signers.rs | 9 +++- .../hyperlane-cosmos/src/trait_builder.rs | 28 +++++++----- rust/hyperlane-base/Cargo.toml | 1 + rust/hyperlane-base/src/settings/chains.rs | 43 +++++++++++++++++++ rust/hyperlane-base/src/settings/signers.rs | 4 -- rust/hyperlane-core/Cargo.toml | 2 +- rust/hyperlane-core/src/chain.rs | 5 ++- rust/hyperlane-core/src/error.rs | 6 +-- 10 files changed, 100 insertions(+), 50 deletions(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 98af4db0fe..5d4e7953b8 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -3850,6 +3850,7 @@ dependencies = [ "fuels", "futures-util", "hyperlane-core", + "hyperlane-cosmos", "hyperlane-ethereum", "hyperlane-fuel", "hyperlane-sealevel", @@ -9060,11 +9061,17 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" <<<<<<< HEAD +<<<<<<< HEAD dependencies = [ "strum_macros 0.25.3", ] ======= >>>>>>> 59dbe23de (feat: fix cargo error) +======= +dependencies = [ + "strum_macros 0.25.2", +] +>>>>>>> 5fd30e2e6 (fix: change trait_builder into compatible) [[package]] name = "strum_macros" @@ -9093,10 +9100,17 @@ dependencies = [ [[package]] <<<<<<< HEAD +<<<<<<< HEAD name = "strum_macros" version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +======= +name = "strum_macros" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8d03b598d3d0fff69bf533ee3ef19b8eeb342729596df84bcc7e1f96ec4059" +>>>>>>> 5fd30e2e6 (fix: change trait_builder into compatible) dependencies = [ "heck 0.4.1", "proc-macro2 1.0.69", @@ -9106,8 +9120,11 @@ dependencies = [ ] [[package]] +<<<<<<< HEAD ======= >>>>>>> 59dbe23de (feat: fix cargo error) +======= +>>>>>>> 5fd30e2e6 (fix: change trait_builder into compatible) name = "subtle" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 0d4df265c8..4641d004c7 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -5,7 +5,7 @@ use crate::grpc::{WasmGrpcProvider, WasmProvider}; use crate::payloads::mailbox::{ProcessMessageRequest, ProcessMessageRequestInner}; use crate::payloads::{general, mailbox}; use crate::rpc::{CosmosWasmIndexer, WasmIndexer}; -use crate::verify; +use crate::{verify, ConnectionConf, Signer}; use async_trait::async_trait; use cosmrs::crypto::secp256k1::SigningKey; @@ -13,50 +13,27 @@ use cosmrs::proto::cosmos::base::abci::v1beta1::TxResponse; use cosmrs::proto::cosmos::tx::v1beta1::SimulateResponse; use cosmrs::tendermint::abci::EventAttribute; -use hyperlane_core::RawHyperlaneMessage; use hyperlane_core::{ accumulator::incremental::IncrementalMerkle, utils::fmt_bytes, ChainResult, Checkpoint, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneMessage, HyperlaneProvider, Indexer, LogMeta, Mailbox, TxCostEstimate, TxOutcome, H256, U256, }; +use hyperlane_core::{ContractLocator, RawHyperlaneMessage}; use tracing::instrument; /// A reference to a Mailbox contract on some Cosmos chain -pub struct CosmosMailbox { +pub struct CosmosMailbox<'a> { domain: HyperlaneDomain, address: String, prefix: String, - provider: Box, + provider: Box>, } impl CosmosMailbox { /// Create a reference to a mailbox at a specific Ethereum address on some /// chain - pub fn new( - domain: HyperlaneDomain, - address: String, - prefix: String, - private_key: Vec, - grpc_endpoint: String, - chain_id: String, - ) -> Self { - let signer_address = verify::pub_to_addr( - SigningKey::from_slice(&private_key) - .unwrap() - .public_key() - .to_bytes(), - &prefix, - ) - .unwrap(); - - let provider = WasmGrpcProvider::new( - address.clone(), - private_key, - signer_address, - prefix.clone(), - grpc_endpoint, - chain_id, - ); + pub fn new(conf: &ConnectionConf, locator: &ContractLocator, signer: Signer) -> Self { + let provider = WasmGrpcProvider::new(conf, locator, signer); Self { domain, diff --git a/rust/chains/hyperlane-cosmos/src/signers.rs b/rust/chains/hyperlane-cosmos/src/signers.rs index 620f398642..7bcd5e77e1 100644 --- a/rust/chains/hyperlane-cosmos/src/signers.rs +++ b/rust/chains/hyperlane-cosmos/src/signers.rs @@ -1,3 +1,7 @@ +use cosmrs::crypto::secp256k1::SigningKey; + +use crate::verify; + #[derive(Clone, Debug)] pub struct Signer { pub prefix: String, @@ -7,11 +11,12 @@ pub struct Signer { impl Signer { pub fn address(&self) -> String { verify::pub_to_addr( - SigningKey::from_slice(self.private_key) + SigningKey::from_slice(self.private_key.as_slice()) .unwrap() .public_key() .to_bytes(), - self.prefix.clone(), + self.prefix.as_str(), ) + .unwrap() } } diff --git a/rust/chains/hyperlane-cosmos/src/trait_builder.rs b/rust/chains/hyperlane-cosmos/src/trait_builder.rs index ac973199d7..6112a1cbad 100644 --- a/rust/chains/hyperlane-cosmos/src/trait_builder.rs +++ b/rust/chains/hyperlane-cosmos/src/trait_builder.rs @@ -1,7 +1,4 @@ -use cosmrs::proto::cosmwasm::wasm::v1::query_client::QueryClient as WasmQueryClient; -use hyper::body::HttpBody; use hyperlane_core::config::{ConfigErrResultExt, ConfigPath, ConfigResult, FromRawConf}; -use url::Url; /// Cosmos connection configuration #[derive(Debug, Clone)] @@ -38,6 +35,7 @@ pub enum ConnectionConfError { #[error("Invalid `url` for connection configuration: `{0}` ({1})")] InvalidConnectionUrl(String, url::ParseError), /// Invalid `url` type + #[error("Invalid connection type")] InvalidConnectionType, /// Unsupported `url` type #[error("Unsupported connection type: '{0}'")] @@ -52,34 +50,44 @@ impl FromRawConf<'_, RawConnectionConf> for ConnectionConf { ) -> ConfigResult { use ConnectionConfError::*; + // parse the connection relate informations let connectiont_type = raw.connection_type.as_deref().unwrap_or("grpc"); - let chain_id = raw.chain_id.ok_or(MissingChainId)?; - let url = raw.url.ok_or(MissingConnectionUrl)?; + let chain_id = raw + .chain_id + .ok_or(MissingChainId) + .into_config_result(|| cwp.join("chainId"))?; + let url = raw + .url + .ok_or(MissingConnectionUrl) + .into_config_result(|| cwp.join("url"))?; match connectiont_type { "grpc" => Ok(ConnectionConf::GrpcUrl { url, chain_id }), "rpc" => Ok(ConnectionConf::RpcUrl { url, chain_id }), - t => Err(UnsupportedConnectionType(t.to_string())), + t => Err(ConnectionConfError::UnsupportedConnectionType( + t.to_string(), + )) + .into_config_result(|| cwp.join("type")), } } } impl ConnectionConf { /// Get the GRPC url - pub fn get_grpc_url(&self) -> Result { + pub fn get_grpc_url(&self) -> Result { if let ConnectionConf::GrpcUrl { url, .. } = self { Ok(url.clone()) } else { - Err(Error::InvalidConnectionType) + Err(ConnectionConfError::InvalidConnectionType) } } /// Get the RPC url - pub fn get_rpc_url(&self) -> Result { + pub fn get_rpc_url(&self) -> Result { if let ConnectionConf::RpcUrl { url, .. } = self { Ok(url.clone()) } else { - Err(Error::InvalidConnectionType) + Err(ConnectionConfError::InvalidConnectionType) } } diff --git a/rust/hyperlane-base/Cargo.toml b/rust/hyperlane-base/Cargo.toml index 3d28ab0e05..f2ba3ad52e 100644 --- a/rust/hyperlane-base/Cargo.toml +++ b/rust/hyperlane-base/Cargo.toml @@ -45,6 +45,7 @@ hyperlane-core = { path = "../hyperlane-core", features = ["agent", "float"] } hyperlane-ethereum = { path = "../chains/hyperlane-ethereum" } hyperlane-fuel = { path = "../chains/hyperlane-fuel" } hyperlane-sealevel = { path = "../chains/hyperlane-sealevel" } +hyperlane-cosmos = { path = "../chains/hyperlane-cosmos"} hyperlane-test = { path = "../hyperlane-test" } # dependency version is determined by etheres diff --git a/rust/hyperlane-base/src/settings/chains.rs b/rust/hyperlane-base/src/settings/chains.rs index 4596d2867c..7eff6bfb53 100644 --- a/rust/hyperlane-base/src/settings/chains.rs +++ b/rust/hyperlane-base/src/settings/chains.rs @@ -12,6 +12,7 @@ use hyperlane_core::{ MerkleTreeHook, MerkleTreeInsertion, MultisigIsm, RoutingIsm, SequenceIndexer, ValidatorAnnounce, H256, }; +use hyperlane_cosmos as h_cosmos; use hyperlane_ethereum::{ self as h_eth, BuildableWithProvider, EthereumInterchainGasPaymasterAbi, EthereumMailboxAbi, EthereumValidatorAnnounceAbi, @@ -55,6 +56,39 @@ pub enum ChainConnectionConf { Fuel(h_fuel::ConnectionConf), /// Sealevel configuration. Sealevel(h_sealevel::ConnectionConf), + /// Cosmos configuration. + Cosmos(h_cosmos::ConnectionConf), +} + +/// Specify the chain name (enum variant) under the `chain` key +#[derive(Debug, Deserialize)] +#[serde(tag = "protocol", content = "connection", rename_all = "camelCase")] +enum RawChainConnectionConf { + Ethereum(h_eth::RawConnectionConf), + Fuel(h_fuel::RawConnectionConf), + Sealevel(h_sealevel::RawConnectionConf), + Cosmos(h_cosmos::RawConnectionConf), + #[serde(other)] + Unknown, +} + +impl FromRawConf<'_, RawChainConnectionConf> for ChainConnectionConf { + fn from_config_filtered( + raw: RawChainConnectionConf, + cwp: &ConfigPath, + _filter: (), + ) -> ConfigResult { + use RawChainConnectionConf::*; + match raw { + Ethereum(r) => Ok(Self::Ethereum(r.parse_config(&cwp.join("connection"))?)), + Fuel(r) => Ok(Self::Fuel(r.parse_config(&cwp.join("connection"))?)), + Sealevel(r) => Ok(Self::Sealevel(r.parse_config(&cwp.join("connection"))?)), + Cosmos(r) => Ok(Self::Cosmos(r.parse_config(&cwp.join("connection")))), + Unknown => { + Err(eyre!("Unknown chain protocol")).into_config_result(|| cwp.join("protocol")) + } + } + } } impl ChainConnectionConf { @@ -64,6 +98,7 @@ impl ChainConnectionConf { Self::Ethereum(_) => HyperlaneDomainProtocol::Ethereum, Self::Fuel(_) => HyperlaneDomainProtocol::Fuel, Self::Sealevel(_) => HyperlaneDomainProtocol::Sealevel, + Self::Cosmos(_) => HyperlaneDomainProtocol::Cosmos, } } } @@ -138,6 +173,10 @@ impl ChainConf { .map(|m| Box::new(m) as Box) .map_err(Into::into) } + ChainConnectionConf::Cosmos(conf) => { + let signer = self.cosmos_signer().await.context(ctx)?; + h_cosmos::CosmosMailbox::new(conf, &locator, signer) + } } .context(ctx) } @@ -509,6 +548,10 @@ impl ChainConf { self.signer().await } + async fn cosmos_signer(&self) -> Result> { + self.signer().await + } + /// Get a clone of the ethereum metrics conf with correctly configured /// contract information. fn metrics_conf( diff --git a/rust/hyperlane-base/src/settings/signers.rs b/rust/hyperlane-base/src/settings/signers.rs index 340fccc299..c25b2f7a76 100644 --- a/rust/hyperlane-base/src/settings/signers.rs +++ b/rust/hyperlane-base/src/settings/signers.rs @@ -31,13 +31,9 @@ pub enum SignerConf { /// The AWS region region: Region, }, -<<<<<<< HEAD - /// Assume the local node will sign on RPC calls automatically -======= /// Cosmos Specific key CosmosKey { key: H256, prefix: String }, /// Assume node will sign on RPC calls ->>>>>>> ee35aaef6 (feat: add default trait implements) #[default] Node, } diff --git a/rust/hyperlane-core/Cargo.toml b/rust/hyperlane-core/Cargo.toml index 7ccc817f25..dc758c62a0 100644 --- a/rust/hyperlane-core/Cargo.toml +++ b/rust/hyperlane-core/Cargo.toml @@ -33,7 +33,7 @@ num-traits.workspace = true serde = { workspace = true } serde_json = { workspace = true } sha3 = { workspace = true } -strum = { workspace = true, optional = true } +strum = { workspace = true, optional = true, features = ["derive"] } thiserror = { workspace = true } tonic = { workspace = true } cosmrs = { workspace = true } diff --git a/rust/hyperlane-core/src/chain.rs b/rust/hyperlane-core/src/chain.rs index c727bfb746..d63a78379e 100644 --- a/rust/hyperlane-core/src/chain.rs +++ b/rust/hyperlane-core/src/chain.rs @@ -162,6 +162,8 @@ pub enum HyperlaneDomainProtocol { Fuel, /// A Sealevel-based chain type which uses hyperlane-sealevel. Sealevel, + /// A Cosmos-based chain type which uses hyperlane-cosmos. + Cosmos, } impl HyperlaneDomainProtocol { @@ -171,6 +173,7 @@ impl HyperlaneDomainProtocol { Ethereum => format!("{:?}", H160::from(addr)), Fuel => format!("{:?}", addr), Sealevel => format!("{:?}", addr), + Cosmos => format!("{:?}", addr), } } } @@ -367,7 +370,7 @@ impl HyperlaneDomain { use HyperlaneDomainProtocol::*; let protocol = self.domain_protocol(); many_to_one!(match protocol { - IndexMode::Block: [Ethereum], + IndexMode::Block: [Ethereum, Cosmos], // TODO: Is cosmos index-mode is correct? IndexMode::Sequence : [Sealevel, Fuel], }) } diff --git a/rust/hyperlane-core/src/error.rs b/rust/hyperlane-core/src/error.rs index 278b5947c4..805d59083c 100644 --- a/rust/hyperlane-core/src/error.rs +++ b/rust/hyperlane-core/src/error.rs @@ -6,9 +6,9 @@ use std::ops::Deref; use crate::config::StrOrIntParseError; use cosmrs::proto::prost; use cosmrs::Error as CosmrsError; -use ethers_contract::ContractError; -use ethers_core::types::SignatureError; -use ethers_providers::{Middleware, ProviderError}; +// use ethers_contract::ContractError; +// use ethers_core::types::SignatureError; +// use ethers_providers::{Middleware, ProviderError}; use crate::HyperlaneProviderError; use crate::H256; From b6c7a4159ecaf7e8edf03cd8e8e0ba67bc9323d9 Mon Sep 17 00:00:00 2001 From: hashableric Date: Sat, 12 Aug 2023 13:18:32 +0900 Subject: [PATCH 009/142] feat: apply changes into provider/grpc --- .../hyperlane-cosmos/src/providers/grpc.rs | 52 ++++++++++++------- rust/hyperlane-core/src/error.rs | 6 +++ 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index 38d2d862e1..0fa72a8a2f 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -20,12 +20,13 @@ use cosmrs::proto::traits::Message; use cosmrs::tx::{self, Fee, MessageExt, SignDoc, SignerInfo}; use cosmrs::Coin; -use hyperlane_core::{ChainResult, ContractLocator, U256}; +use hyperlane_core::{ChainCommunicationError, ChainResult, ContractLocator, U256}; use serde::Serialize; use std::num::NonZeroU64; use std::str::FromStr; -use crate::{ConnectionConf, Signer}; +use crate::verify; +use crate::{signers::Signer, ConnectionConf}; #[async_trait] /// Cosmwasm GRPC Provider @@ -70,11 +71,11 @@ pub trait WasmProvider: Send + Sync { /// Cosmwasm GRPC Provider pub struct WasmGrpcProvider<'a> { conf: &'a ConnectionConf, - locator: &'a ContractLocator, + locator: &'a ContractLocator<'a>, signer: &'a Signer, } -impl WasmGrpcProvider { +impl WasmGrpcProvider<'_> { /// create new Cosmwasm GRPC Provider pub fn new(conf: &ConnectionConf, locator: &ContractLocator, signer: &Signer) -> Self { Self { @@ -83,13 +84,24 @@ impl WasmGrpcProvider { signer, } } + + pub fn get_conn_url(&self) -> ChainResult { + self.conf + .get_grpc_url() + .map_err(|_| ChainCommunicationError::NotMatchConnectionType { + msg: "grpc".to_string(), + }) + } + + pub fn get_contract_addr(&self) -> ChainResult { + verify::digest_to_addr(self.locator.address, self.signer.prefix.as_str()) + } } #[async_trait] -impl WasmProvider for WasmGrpcProvider { +impl WasmProvider for WasmGrpcProvider<'_> { async fn latest_block_height(&self) -> ChainResult { - let mut client = ServiceClient::connect(self.conf.get_grpc_url()?).await?; - + let mut client = ServiceClient::connect(self.get_conn_url()?).await?; let request = tonic::Request::new(GetLatestBlockRequest {}); let response = client.get_latest_block(request).await.unwrap().into_inner(); @@ -102,10 +114,10 @@ impl WasmProvider for WasmGrpcProvider { where T: Serialize + Send + Sync, { - let mut client = WasmQueryClient::connect(self.conf.get_grpc_url()?).await?; + let mut client = WasmQueryClient::connect(self.get_conn_url()?).await?; let mut request = tonic::Request::new(QuerySmartContractStateRequest { - address: self.address.clone(), + address: self.signer.address(), query_data: serde_json::to_string(&payload)?.as_bytes().to_vec(), }); @@ -137,8 +149,7 @@ impl WasmProvider for WasmGrpcProvider { where T: Serialize + Send + Sync, { - let mut client = WasmQueryClient::connect(self.grpc_endpoint.clone()).await?; - + let mut client = WasmQueryClient::connect(self.get_conn_url()?).await?; let mut request = tonic::Request::new(QuerySmartContractStateRequest { address: to, query_data: serde_json::to_string(&payload)?.as_bytes().to_vec(), @@ -164,7 +175,7 @@ impl WasmProvider for WasmGrpcProvider { } async fn account_query(&self, account: String) -> ChainResult { - let mut client = QueryAccountClient::connect(self.grpc_endpoint.clone()).await?; + let mut client = QueryAccountClient::connect(self.get_conn_url()?).await?; let request = tonic::Request::new(QueryAccountRequest { address: account }); let response = client.account(request).await.unwrap().into_inner(); @@ -177,16 +188,17 @@ impl WasmProvider for WasmGrpcProvider { where T: Serialize + Send + Sync, { - let account_info = self.account_query(self.signer_address.clone()).await?; + let account_info = self.account_query(self.signer.address()).await?; + let contract_addr = self.get_contract_addr()?; let msg = MsgExecuteContract { - sender: self.address.clone(), - contract: self.address.clone(), + sender: contract_addr.clone(), + contract: contract_addr.clone(), msg: serde_json::to_string(&payload)?.as_bytes().to_vec(), funds: vec![], }; - let private_key = SigningKey::from_slice(&self.private_key).unwrap(); + let private_key = SigningKey::from_slice(&self.signer.private_key).unwrap(); let public_key = private_key.public_key(); let tx_body = tx::Body::new(vec![msg.to_any().unwrap()], "", 900u16); @@ -198,7 +210,7 @@ impl WasmProvider for WasmGrpcProvider { let auth_info = signer_info.auth_info(Fee::from_amount_and_gas( Coin { - denom: format!("u{}", self.prefix).parse().unwrap(), + denom: format!("u{}", self.signer.prefix.clone()).parse().unwrap(), amount: 10000u128, }, gas_limit, @@ -208,7 +220,7 @@ impl WasmProvider for WasmGrpcProvider { let sign_doc = SignDoc::new( &tx_body, &auth_info, - &self.chain_id.parse().unwrap(), + &self.conf.get_chain_id().parse().unwrap(), account_info.account_number, ) .unwrap(); @@ -221,7 +233,7 @@ impl WasmProvider for WasmGrpcProvider { where T: Serialize + Send + Sync, { - let mut client = TxServiceClient::connect(self.grpc_endpoint.clone()).await?; + let mut client = TxServiceClient::connect(self.get_conn_url()?).await?; let tx_bytes = self.generate_raw_tx(payload, gas_limit).await?; let request = tonic::Request::new(BroadcastTxRequest { tx_bytes, @@ -236,7 +248,7 @@ impl WasmProvider for WasmGrpcProvider { where T: Serialize + Send + Sync, { - let mut client = TxServiceClient::connect(self.grpc_endpoint.clone()).await?; + let mut client = TxServiceClient::connect(self.get_conn_url()?).await?; let tx_bytes = self.generate_raw_tx(payload, None).await?; let request = tonic::Request::new(SimulateRequest { tx: None, tx_bytes }); diff --git a/rust/hyperlane-core/src/error.rs b/rust/hyperlane-core/src/error.rs index 805d59083c..a7388091ba 100644 --- a/rust/hyperlane-core/src/error.rs +++ b/rust/hyperlane-core/src/error.rs @@ -117,6 +117,12 @@ pub enum ChainCommunicationError { /// Error message msg: String, }, + /// Not match connection type + #[error("Not match connection type: require {msg:?}")] + NotMatchConnectionType { + /// Error message + msg: String, + }, } impl ChainCommunicationError { From 8534defb14c58bac25d06f7315bf1f710dbd958d Mon Sep 17 00:00:00 2001 From: hashableric Date: Sat, 12 Aug 2023 16:42:44 +0900 Subject: [PATCH 010/142] feat: apply changes into interchain_gas_paymaster --- .../hyperlane-cosmos/src/interchain_gas.rs | 42 ++++++---- rust/chains/hyperlane-cosmos/src/mailbox.rs | 78 ++++++++++--------- .../hyperlane-cosmos/src/multisig_ism.rs | 9 ++- .../hyperlane-cosmos/src/providers/grpc.rs | 4 +- .../hyperlane-cosmos/src/providers/rpc.rs | 68 ++++++++++++---- 5 files changed, 129 insertions(+), 72 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index 0256598799..76db7c7420 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -1,12 +1,17 @@ +use std::ops::RangeInclusive; + use async_trait::async_trait; use cosmrs::tendermint::abci::EventAttribute; use hyperlane_core::{ - ChainResult, HyperlaneChain, HyperlaneContract, Indexer, InterchainGasPaymaster, U256, + ChainResult, ContractLocator, HyperlaneChain, HyperlaneContract, Indexer, + InterchainGasPaymaster, U256, }; use hyperlane_core::{HyperlaneDomain, HyperlaneProvider, InterchainGasPayment, LogMeta, H256}; use crate::rpc::{CosmosWasmIndexer, WasmIndexer}; +use crate::signers::Signer; use crate::verify::bech32_decode; +use crate::ConnectionConf; /// A reference to a InterchainGasPaymaster contract on some Cosmos chain #[derive(Debug)] @@ -42,20 +47,30 @@ impl CosmosInterchainGasPaymaster { /// A reference to a InterchainGasPaymasterIndexer contract on some Cosmos chain #[derive(Debug)] -pub struct CosmosInterchainGasPaymasterIndexer { - indexer: Box, +pub struct CosmosInterchainGasPaymasterIndexer<'a> { + conf: &'a ConnectionConf, + locator: &'a ContractLocator<'a>, + signer: &'a Signer, + event_type: String, + indexer: Box>, } -impl CosmosInterchainGasPaymasterIndexer { +impl CosmosInterchainGasPaymasterIndexer<'_> { /// create new Cosmos InterchainGasPaymasterIndexer agent - pub fn new(address: String, rpc_endpoint: String) -> Self { - let indexer = CosmosWasmIndexer::new( - address, - String::from("wasm-pay-for-gas"), - rpc_endpoint.parse().unwrap(), - ); + pub fn new( + conf: &ConnectionConf, + locator: &ContractLocator, + signer: &Signer, + event_type: String, + ) -> Self { + let indexer: CosmosWasmIndexer<'_> = + CosmosWasmIndexer::new(conf, locator, signer, event_type); Self { + conf, + locator, + signer, + event_type, indexer: Box::new(indexer), } } @@ -88,16 +103,15 @@ impl CosmosInterchainGasPaymasterIndexer { } #[async_trait] -impl Indexer for CosmosInterchainGasPaymasterIndexer { +impl Indexer for CosmosInterchainGasPaymasterIndexer<'_> { async fn fetch_logs( &self, - from_block: u32, - to_block: u32, + range: RangeInclusive, ) -> ChainResult> { let mut result: Vec<(InterchainGasPayment, LogMeta)> = vec![]; let parser = self.get_parser(); - for block_number in from_block..to_block { + for block_number in range { let logs = self.indexer.get_event_log(block_number, parser).await?; result.extend(logs); } diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 4641d004c7..7e3d58dc6b 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -1,13 +1,13 @@ use std::fmt::{Debug, Formatter}; use std::num::NonZeroU64; +use std::ops::RangeInclusive; use crate::grpc::{WasmGrpcProvider, WasmProvider}; use crate::payloads::mailbox::{ProcessMessageRequest, ProcessMessageRequestInner}; use crate::payloads::{general, mailbox}; use crate::rpc::{CosmosWasmIndexer, WasmIndexer}; -use crate::{verify, ConnectionConf, Signer}; +use crate::{signers::Signer, verify, ConnectionConf}; use async_trait::async_trait; -use cosmrs::crypto::secp256k1::SigningKey; use cosmrs::proto::cosmos::base::abci::v1beta1::TxResponse; use cosmrs::proto::cosmos::tx::v1beta1::SimulateResponse; @@ -18,41 +18,41 @@ use hyperlane_core::{ HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneMessage, HyperlaneProvider, Indexer, LogMeta, Mailbox, TxCostEstimate, TxOutcome, H256, U256, }; -use hyperlane_core::{ContractLocator, RawHyperlaneMessage}; +use hyperlane_core::{ContractLocator, RawHyperlaneMessage, H512}; use tracing::instrument; /// A reference to a Mailbox contract on some Cosmos chain pub struct CosmosMailbox<'a> { - domain: HyperlaneDomain, - address: String, - prefix: String, + conf: &'a ConnectionConf, + locator: &'a ContractLocator<'a>, + signer: &'a Signer, provider: Box>, } -impl CosmosMailbox { +impl CosmosMailbox<'_> { /// Create a reference to a mailbox at a specific Ethereum address on some /// chain - pub fn new(conf: &ConnectionConf, locator: &ContractLocator, signer: Signer) -> Self { + pub fn new(conf: &ConnectionConf, locator: &ContractLocator, signer: &Signer) -> Self { let provider = WasmGrpcProvider::new(conf, locator, signer); Self { - domain, - address, - prefix, + conf, + locator, + signer, provider: Box::new(provider), } } } -impl HyperlaneContract for CosmosMailbox { +impl HyperlaneContract for CosmosMailbox<'_> { fn address(&self) -> H256 { - verify::bech32_decode(self.address.clone()) + self.locator.address } } -impl HyperlaneChain for CosmosMailbox { +impl HyperlaneChain for CosmosMailbox<'_> { fn domain(&self) -> &HyperlaneDomain { - &self.domain + &self.locator.domain } fn provider(&self) -> Box { @@ -60,14 +60,14 @@ impl HyperlaneChain for CosmosMailbox { } } -impl Debug for CosmosMailbox { +impl Debug for CosmosMailbox<'_> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { write!(f, "{:?}", self as &dyn HyperlaneContract) } } #[async_trait] -impl Mailbox for CosmosMailbox { +impl Mailbox for CosmosMailbox<'_> { #[instrument(level = "debug", err, ret, skip(self))] async fn tree(&self, lag: Option) -> ChainResult { let payload = mailbox::MerkleTreeRequest { @@ -135,7 +135,7 @@ impl Mailbox for CosmosMailbox { #[instrument(err, ret, skip(self))] async fn recipient_ism(&self, recipient: H256) -> ChainResult { - let address = verify::digest_to_addr(recipient, &self.prefix)?; + let address = verify::digest_to_addr(recipient, &self.signer.prefix)?; let payload = mailbox::DefaultIsmRequest { default_ism: general::EmptyStruct {}, @@ -168,7 +168,7 @@ impl Mailbox for CosmosMailbox { .wasm_send(process_message, tx_gas_limit) .await?; Ok(TxOutcome { - txid: H256::from_slice(hex::decode(response.txhash).unwrap().as_slice()), + transaction_id: H512::from_slice(hex::decode(response.txhash).unwrap().as_slice()), executed: response.code == 0, gas_used: U256::from(response.gas_used), gas_price: U256::from(response.gas_wanted), @@ -205,21 +205,30 @@ impl Mailbox for CosmosMailbox { /// Struct that retrieves event data for a Cosmos Mailbox contract #[derive(Debug)] -pub struct CosmosMailboxIndexer { - indexer: Box, +pub struct CosmosMailboxIndexer<'a> { + conf: &'a ConnectionConf, + locator: &'a ContractLocator<'a>, + signer: &'a Signer, + event_type: String, + indexer: Box>, } -impl CosmosMailboxIndexer { +impl CosmosMailboxIndexer<'_> { /// Create a reference to a mailbox at a specific Ethereum address on some /// chain - pub fn new(address: String, rpc_endpoint: String) -> Self { - let indexer = CosmosWasmIndexer::new( - address, - "mailbox_dispatch".to_string(), - rpc_endpoint.parse().unwrap(), - ); + pub fn new( + conf: &ConnectionConf, + locator: &ContractLocator, + signer: &Signer, + event_type: String, + ) -> Self { + let indexer = CosmosWasmIndexer::new(conf, locator, signer, event_type); Self { + conf, + locator, + signer, + event_type, indexer: Box::new(indexer), } } @@ -254,16 +263,15 @@ impl CosmosMailboxIndexer { } #[async_trait] -impl Indexer for CosmosMailboxIndexer { +impl Indexer for CosmosMailboxIndexer<'_> { async fn fetch_logs( &self, - from: u32, - to: u32, + range: RangeInclusive, ) -> ChainResult> { let mut result: Vec<(HyperlaneMessage, LogMeta)> = vec![]; let parser = self.get_parser(); - for block_number in from..to { + for block_number in range { let logs = self.indexer.get_event_log(block_number, parser).await?; result.extend(logs); } @@ -277,12 +285,12 @@ impl Indexer for CosmosMailboxIndexer { } #[async_trait] -impl Indexer for CosmosMailboxIndexer { - async fn fetch_logs(&self, from: u32, to: u32) -> ChainResult> { +impl Indexer for CosmosMailboxIndexer<'_> { + async fn fetch_logs(&self, range: RangeInclusive) -> ChainResult> { let mut result: Vec<(HyperlaneMessage, LogMeta)> = vec![]; let parser: fn(Vec) -> HyperlaneMessage = self.get_parser(); - for block_number in from..to { + for block_number in range { let logs = self.indexer.get_event_log(block_number, parser).await?; result.extend(logs); } diff --git a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs index 631359a16c..577b7fb50c 100644 --- a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs @@ -16,10 +16,11 @@ use crate::{ /// A reference to a MultisigIsm contract on some Cosmos chain #[derive(Debug)] -pub struct CosmosMultisigIsm { - domain: HyperlaneDomain, - address: String, - provider: Box, +pub struct CosmosMultisigIsm<'a> { + conf: &'a ConnectionConf, + locator: &'a ContractLocator<'a>, + signer: &'a Signer, + provider: Box>, } impl CosmosMultisigIsm { diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index 0fa72a8a2f..17fc1e8afc 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -85,7 +85,7 @@ impl WasmGrpcProvider<'_> { } } - pub fn get_conn_url(&self) -> ChainResult { + fn get_conn_url(&self) -> ChainResult { self.conf .get_grpc_url() .map_err(|_| ChainCommunicationError::NotMatchConnectionType { @@ -93,7 +93,7 @@ impl WasmGrpcProvider<'_> { }) } - pub fn get_contract_addr(&self) -> ChainResult { + fn get_contract_addr(&self) -> ChainResult { verify::digest_to_addr(self.locator.address, self.signer.prefix.as_str()) } } diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index 20fe5d6c23..ab71d1d8fd 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -3,10 +3,14 @@ use cosmrs::rpc::client::{Client, CompatMode, HttpClient, HttpClientUrl}; use cosmrs::tendermint::abci::EventAttribute; use cosmrs::tendermint::hash::Algorithm; use cosmrs::tendermint::Hash; -use hyperlane_core::{ChainResult, LogMeta, H256, U256}; +use hyperlane_core::{ + ChainCommunicationError, ChainResult, ContractLocator, LogMeta, H256, H512, U256, +}; use sha256::digest; -use crate::verify::bech32_decode; +use crate::signers::Signer; +use crate::verify::{self, bech32_decode}; +use crate::ConnectionConf; #[async_trait] /// Trait for wasm indexer. Use rpc provider @@ -25,31 +29,60 @@ pub trait WasmIndexer: Send + Sync { T: Send + Sync; } +// #[derive(Debug)] +// /// Cosmwasm RPC Provider +// pub struct CosmosWasmIndexer { +// address: String, +// rpc_endpoint: HttpClientUrl, // rpc_endpoint +// target_type: String, +// } + #[derive(Debug)] /// Cosmwasm RPC Provider -pub struct CosmosWasmIndexer { - address: String, - rpc_endpoint: HttpClientUrl, // rpc_endpoint - target_type: String, +pub struct CosmosWasmIndexer<'a> { + conf: &'a ConnectionConf, + locator: &'a ContractLocator<'a>, + signer: &'a Signer, + event_type: String, } -impl CosmosWasmIndexer { +impl CosmosWasmIndexer<'_> { const WASM_TYPE: &str = "wasm"; /// create new Cosmwasm RPC Provider - pub fn new(address: String, target_type: String, rpc_endpoint: HttpClientUrl) -> Self { + pub fn new( + conf: &ConnectionConf, + locator: &ContractLocator, + signer: &Signer, + event_type: String, + ) -> Self { Self { - address, - target_type, - rpc_endpoint, + conf, + locator, + signer, + event_type, } } + + /// get rpc client url + fn get_conn_url(&self) -> ChainResult { + self.conf + .get_rpc_url() + .map_err(|_| ChainCommunicationError::NotMatchConnectionType { + msg: "rpc".to_string(), + }) + } + + /// get contract address + pub fn get_contract_addr(&self) -> ChainResult { + verify::digest_to_addr(self.locator.address, self.signer.prefix.as_str()) + } } #[async_trait] -impl WasmIndexer for CosmosWasmIndexer { +impl WasmIndexer for CosmosWasmIndexer<'_> { fn get_client(&self) -> ChainResult { - Ok(HttpClient::builder(self.rpc_endpoint.clone()) + Ok(HttpClient::builder(self.get_conn_url()?.parse()?) .compat_mode(CompatMode::V0_34) .build()?) } @@ -92,6 +125,7 @@ impl WasmIndexer for CosmosWasmIndexer { let mut result: Vec<(T, LogMeta)> = vec![]; let tx_results = block_result.txs_results.unwrap(); + let addr = self.get_contract_addr()?; for (idx, tx) in tx_results.iter().enumerate() { let tx_hash = tx_hash[idx]; @@ -101,19 +135,19 @@ impl WasmIndexer for CosmosWasmIndexer { for (log_idx, event) in tx.events.clone().iter().enumerate() { if event.kind.as_str().starts_with(Self::WASM_TYPE) - && event.attributes[0].value == self.address + && event.attributes[0].value == addr { available = true; - } else if event.kind.as_str() != self.target_type.as_str() { + } else if event.kind.as_str() != self.event_type { continue; } let msg = parser(event.attributes.clone()); let meta = LogMeta { - address: bech32_decode(self.address.clone()), + address: bech32_decode(addr.clone()), block_number: block_number as u64, block_hash: H256::from_slice(block.block_id.hash.as_bytes()), - transaction_hash: H256::from_slice(tx_hash.clone().as_bytes()), + transaction_id: H512::from_slice(tx_hash.clone().as_bytes()), transaction_index: idx as u64, log_index: U256::from(log_idx), }; From 5222983d2ccbd58bee95f9d3446547ffd2a65872 Mon Sep 17 00:00:00 2001 From: hashableric Date: Sat, 12 Aug 2023 16:47:51 +0900 Subject: [PATCH 011/142] feat: apply changes into routing isms --- .../hyperlane-cosmos/src/routing_ism.rs | 59 +++++++------------ 1 file changed, 20 insertions(+), 39 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/routing_ism.rs b/rust/chains/hyperlane-cosmos/src/routing_ism.rs index 17075243b2..7136ecfeb7 100644 --- a/rust/chains/hyperlane-cosmos/src/routing_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/routing_ism.rs @@ -2,69 +2,50 @@ use async_trait::async_trait; use cosmrs::crypto::secp256k1::SigningKey; use hyperlane_core::{ - ChainResult, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneMessage, - HyperlaneProvider, RawHyperlaneMessage, RoutingIsm, H256, + ChainResult, ContractLocator, HyperlaneChain, HyperlaneContract, HyperlaneDomain, + HyperlaneMessage, HyperlaneProvider, RawHyperlaneMessage, RoutingIsm, H256, }; use crate::{ grpc::{WasmGrpcProvider, WasmProvider}, payloads::ism_routes::{IsmRouteRequest, IsmRouteRequestInner, IsmRouteRespnose}, + signers::Signer, verify::{self, bech32_decode}, + ConnectionConf, }; /// A reference to a RoutingIsm contract on some Cosmos chain #[derive(Debug)] -pub struct CosmosRoutingIsm { - domain: HyperlaneDomain, - address: String, - provider: Box, +pub struct CosmosRoutingIsm<'a> { + conf: &'a ConnectionConf, + locator: &'a ContractLocator<'a>, + signer: &'a Signer, + provider: Box>, } -impl CosmosRoutingIsm { +impl CosmosRoutingIsm<'_> { /// create a new instance of CosmosRoutingIsm - pub fn new( - domain: HyperlaneDomain, - address: String, - prefix: String, - private_key: Vec, - grpc_endpoint: String, - chain_id: String, - ) -> Self { - let signer_address = verify::pub_to_addr( - SigningKey::from_slice(&private_key) - .unwrap() - .public_key() - .to_bytes(), - &prefix, - ) - .unwrap(); - - let provider = WasmGrpcProvider::new( - address.clone(), - private_key, - signer_address, - prefix, - grpc_endpoint, - chain_id, - ); + pub fn new(conf: &ConnectionConf, locator: &ContractLocator, signer: &Signer) -> Self { + let provider = WasmGrpcProvider::new(conf, locator, signer); Self { - domain, - address, + conf, + locator, + signer, provider: Box::new(provider), } } } -impl HyperlaneContract for CosmosRoutingIsm { +impl HyperlaneContract for CosmosRoutingIsm<'_> { fn address(&self) -> H256 { - bech32_decode(self.address.clone()) + self.locator.address } } -impl HyperlaneChain for CosmosRoutingIsm { +impl HyperlaneChain for CosmosRoutingIsm<'_> { fn domain(&self) -> &HyperlaneDomain { - &self.domain + &self.locator.domain } fn provider(&self) -> Box { @@ -73,7 +54,7 @@ impl HyperlaneChain for CosmosRoutingIsm { } #[async_trait] -impl RoutingIsm for CosmosRoutingIsm { +impl RoutingIsm for CosmosRoutingIsm<'_> { async fn route(&self, message: &HyperlaneMessage) -> ChainResult { let payload = IsmRouteRequest { route: IsmRouteRequestInner { From 9ce2c5f444a9119468c22d81052fbd57ed469a82 Mon Sep 17 00:00:00 2001 From: hashableric Date: Sat, 12 Aug 2023 16:50:16 +0900 Subject: [PATCH 012/142] feat: apply changes into multisig isms --- .../hyperlane-cosmos/src/multisig_ism.rs | 52 ++++++------------- .../hyperlane-cosmos/src/routing_ism.rs | 3 +- 2 files changed, 16 insertions(+), 39 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs index 577b7fb50c..ddae44c7bd 100644 --- a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs @@ -1,12 +1,12 @@ use crate::{ grpc::{WasmGrpcProvider, WasmProvider}, - verify, + signers::Signer, + ConnectionConf, }; use async_trait::async_trait; -use cosmrs::crypto::secp256k1::SigningKey; use hyperlane_core::{ - ChainResult, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneMessage, - HyperlaneProvider, MultisigIsm, RawHyperlaneMessage, H256, + ChainResult, ContractLocator, HyperlaneChain, HyperlaneContract, HyperlaneDomain, + HyperlaneMessage, HyperlaneProvider, MultisigIsm, RawHyperlaneMessage, H256, }; use crate::{ @@ -23,51 +23,29 @@ pub struct CosmosMultisigIsm<'a> { provider: Box>, } -impl CosmosMultisigIsm { +impl CosmosMultisigIsm<'_> { /// create a new instance of CosmosMultisigIsm - pub fn new( - domain: HyperlaneDomain, - address: String, - prefix: String, - private_key: Vec, - grpc_endpoint: String, - chain_id: String, - ) -> Self { - let signer_address = verify::pub_to_addr( - SigningKey::from_slice(&private_key) - .unwrap() - .public_key() - .to_bytes(), - &prefix, - ) - .unwrap(); - - let provider = WasmGrpcProvider::new( - address.clone(), - private_key, - signer_address, - prefix, - grpc_endpoint, - chain_id, - ); + pub fn new(conf: &ConnectionConf, locator: &ContractLocator, signer: &Signer) -> Self { + let provider = WasmGrpcProvider::new(conf, locator, signer); Self { - domain, - address, + conf, + locator, + signer, provider: Box::new(provider), } } } -impl HyperlaneContract for CosmosMultisigIsm { +impl HyperlaneContract for CosmosMultisigIsm<'_> { fn address(&self) -> H256 { - bech32_decode(self.address.clone()) + self.locator.address } } -impl HyperlaneChain for CosmosMultisigIsm { +impl HyperlaneChain for CosmosMultisigIsm<'_> { fn domain(&self) -> &HyperlaneDomain { - &self.domain + &self.locator.domain } fn provider(&self) -> Box { @@ -76,7 +54,7 @@ impl HyperlaneChain for CosmosMultisigIsm { } #[async_trait] -impl MultisigIsm for CosmosMultisigIsm { +impl MultisigIsm for CosmosMultisigIsm<'_> { /// Returns the validator and threshold needed to verify message async fn validators_and_threshold( &self, diff --git a/rust/chains/hyperlane-cosmos/src/routing_ism.rs b/rust/chains/hyperlane-cosmos/src/routing_ism.rs index 7136ecfeb7..350e5b29da 100644 --- a/rust/chains/hyperlane-cosmos/src/routing_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/routing_ism.rs @@ -1,6 +1,5 @@ use async_trait::async_trait; -use cosmrs::crypto::secp256k1::SigningKey; use hyperlane_core::{ ChainResult, ContractLocator, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneMessage, HyperlaneProvider, RawHyperlaneMessage, RoutingIsm, H256, @@ -10,7 +9,7 @@ use crate::{ grpc::{WasmGrpcProvider, WasmProvider}, payloads::ism_routes::{IsmRouteRequest, IsmRouteRequestInner, IsmRouteRespnose}, signers::Signer, - verify::{self, bech32_decode}, + verify::bech32_decode, ConnectionConf, }; From 7d63daadbdcd3b19bee7e3ebf86790857c78d667 Mon Sep 17 00:00:00 2001 From: hashableric Date: Sat, 12 Aug 2023 16:55:30 +0900 Subject: [PATCH 013/142] feat: apply changes into va --- .../hyperlane-cosmos/src/providers/rpc.rs | 2 +- .../src/validator_announce.rs | 62 +++++++------------ 2 files changed, 24 insertions(+), 40 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index ab71d1d8fd..cb45a761f4 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -1,5 +1,5 @@ use async_trait::async_trait; -use cosmrs::rpc::client::{Client, CompatMode, HttpClient, HttpClientUrl}; +use cosmrs::rpc::client::{Client, CompatMode, HttpClient}; use cosmrs::tendermint::abci::EventAttribute; use cosmrs::tendermint::hash::Algorithm; use cosmrs::tendermint::Hash; diff --git a/rust/chains/hyperlane-cosmos/src/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/validator_announce.rs index 9cd7964aa9..b0f0649a45 100644 --- a/rust/chains/hyperlane-cosmos/src/validator_announce.rs +++ b/rust/chains/hyperlane-cosmos/src/validator_announce.rs @@ -1,9 +1,9 @@ use async_trait::async_trait; -use cosmrs::{crypto::secp256k1::SigningKey, proto::cosmos::base::abci::v1beta1::TxResponse}; +use cosmrs::proto::cosmos::base::abci::v1beta1::TxResponse; use hyperlane_core::{ - Announcement, ChainResult, HyperlaneChain, HyperlaneContract, HyperlaneDomain, - HyperlaneProvider, SignedType, TxOutcome, ValidatorAnnounce, H256, U256, + Announcement, ChainResult, ContractLocator, HyperlaneChain, HyperlaneContract, HyperlaneDomain, + HyperlaneProvider, SignedType, TxOutcome, ValidatorAnnounce, H256, H512, U256, }; use crate::{ @@ -12,55 +12,42 @@ use crate::{ self, AnnouncementRequest, AnnouncementRequestInner, GetAnnounceStorageLocationsRequest, GetAnnounceStorageLocationsRequestInner, }, - verify::{bech32_decode, pub_to_addr}, + signers::Signer, + ConnectionConf, }; /// A reference to a ValidatorAnnounce contract on some Cosmos chain #[derive(Debug)] -pub struct CosmosValidatorAnnounce { - domain: HyperlaneDomain, - address: String, - provider: Box, +pub struct CosmosValidatorAnnounce<'a> { + conf: &'a ConnectionConf, + locator: &'a ContractLocator<'a>, + signer: &'a Signer, + provider: Box>, } -impl CosmosValidatorAnnounce { +impl CosmosValidatorAnnounce<'_> { /// create a new instance of CosmosValidatorAnnounce - pub fn new( - domain: HyperlaneDomain, - address: String, - private_key: Vec, - prefix: String, - grpc_endpoint: String, - chain_id: String, - ) -> Self { - let priv_key = SigningKey::from_slice(&private_key).unwrap(); - let signer_address = pub_to_addr(priv_key.public_key().to_bytes(), &prefix).unwrap(); - let provider = WasmGrpcProvider::new( - address.clone(), - private_key, - signer_address, - prefix, - grpc_endpoint, - chain_id, - ); + pub fn new(conf: &ConnectionConf, locator: &ContractLocator, signer: &Signer) -> Self { + let provider = WasmGrpcProvider::new(conf, locator, signer); Self { - domain, - address, + conf, + locator, + signer, provider: Box::new(provider), } } } -impl HyperlaneContract for CosmosValidatorAnnounce { +impl HyperlaneContract for CosmosValidatorAnnounce<'_> { fn address(&self) -> H256 { - bech32_decode(self.address.clone()) + self.locator.address } } -impl HyperlaneChain for CosmosValidatorAnnounce { +impl HyperlaneChain for CosmosValidatorAnnounce<'_> { fn domain(&self) -> &HyperlaneDomain { - &self.domain + self.locator.domain } fn provider(&self) -> Box { @@ -69,7 +56,7 @@ impl HyperlaneChain for CosmosValidatorAnnounce { } #[async_trait] -impl ValidatorAnnounce for CosmosValidatorAnnounce { +impl ValidatorAnnounce for CosmosValidatorAnnounce<'_> { async fn get_announced_storage_locations( &self, validators: &[H256], @@ -112,17 +99,14 @@ impl ValidatorAnnounce for CosmosValidatorAnnounce { .wasm_send(announce_request, tx_gas_limit) .await?; Ok(TxOutcome { - txid: H256::from_slice(hex::decode(response.txhash).unwrap().as_slice()), + transaction_id: H512::from_slice(hex::decode(response.txhash).unwrap().as_slice()), executed: response.code == 0, gas_used: U256::from(response.gas_used), gas_price: U256::from(response.gas_wanted), }) } - async fn announce_tokens_needed( - &self, - announcement: SignedType, - ) -> ChainResult { + async fn announce_tokens_needed(&self, announcement: SignedType) -> Option { todo!() // not implemented yet } } From 5f7e35c564dace0c838759e57fc93348b2bf2a84 Mon Sep 17 00:00:00 2001 From: hashableric Date: Sat, 12 Aug 2023 17:12:35 +0900 Subject: [PATCH 014/142] feat: apply timestamps --- .../hyperlane-cosmos/src/interchain_gas.rs | 10 +++++----- rust/chains/hyperlane-cosmos/src/mailbox.rs | 17 +++++++++-------- .../chains/hyperlane-cosmos/src/multisig_ism.rs | 4 ++-- .../hyperlane-cosmos/src/providers/grpc.rs | 4 ++-- .../hyperlane-cosmos/src/providers/rpc.rs | 8 ++++---- rust/chains/hyperlane-cosmos/src/routing_ism.rs | 4 ++-- .../hyperlane-cosmos/src/validator_announce.rs | 4 ++-- 7 files changed, 26 insertions(+), 25 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index 76db7c7420..7908cbfa1f 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -55,16 +55,16 @@ pub struct CosmosInterchainGasPaymasterIndexer<'a> { indexer: Box>, } -impl CosmosInterchainGasPaymasterIndexer<'_> { +impl<'a> CosmosInterchainGasPaymasterIndexer<'a> { /// create new Cosmos InterchainGasPaymasterIndexer agent pub fn new( - conf: &ConnectionConf, - locator: &ContractLocator, - signer: &Signer, + conf: &'a ConnectionConf, + locator: &'a ContractLocator, + signer: &'a Signer, event_type: String, ) -> Self { let indexer: CosmosWasmIndexer<'_> = - CosmosWasmIndexer::new(conf, locator, signer, event_type); + CosmosWasmIndexer::new(conf, locator, signer, event_type.clone()); Self { conf, diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 7e3d58dc6b..1bb4ff4360 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -29,10 +29,10 @@ pub struct CosmosMailbox<'a> { provider: Box>, } -impl CosmosMailbox<'_> { +impl<'a> CosmosMailbox<'a> { /// Create a reference to a mailbox at a specific Ethereum address on some /// chain - pub fn new(conf: &ConnectionConf, locator: &ContractLocator, signer: &Signer) -> Self { + pub fn new(conf: &'a ConnectionConf, locator: &'a ContractLocator, signer: &'a Signer) -> Self { let provider = WasmGrpcProvider::new(conf, locator, signer); Self { @@ -62,7 +62,7 @@ impl HyperlaneChain for CosmosMailbox<'_> { impl Debug for CosmosMailbox<'_> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!(f, "{:?}", self as &dyn HyperlaneContract) + Debug::fmt(&(self as &dyn HyperlaneContract), f) } } @@ -213,16 +213,17 @@ pub struct CosmosMailboxIndexer<'a> { indexer: Box>, } -impl CosmosMailboxIndexer<'_> { +impl<'a> CosmosMailboxIndexer<'a> { /// Create a reference to a mailbox at a specific Ethereum address on some /// chain pub fn new( - conf: &ConnectionConf, - locator: &ContractLocator, - signer: &Signer, + conf: &'a ConnectionConf, + locator: &'a ContractLocator, + signer: &'a Signer, event_type: String, ) -> Self { - let indexer = CosmosWasmIndexer::new(conf, locator, signer, event_type); + let indexer: CosmosWasmIndexer<'_> = + CosmosWasmIndexer::new(conf, locator, signer, event_type.clone()); Self { conf, diff --git a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs index ddae44c7bd..4133ae4610 100644 --- a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs @@ -23,9 +23,9 @@ pub struct CosmosMultisigIsm<'a> { provider: Box>, } -impl CosmosMultisigIsm<'_> { +impl<'a> CosmosMultisigIsm<'a> { /// create a new instance of CosmosMultisigIsm - pub fn new(conf: &ConnectionConf, locator: &ContractLocator, signer: &Signer) -> Self { + pub fn new(conf: &'a ConnectionConf, locator: &'a ContractLocator, signer: &'a Signer) -> Self { let provider = WasmGrpcProvider::new(conf, locator, signer); Self { diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index 17fc1e8afc..6c311908f2 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -75,9 +75,9 @@ pub struct WasmGrpcProvider<'a> { signer: &'a Signer, } -impl WasmGrpcProvider<'_> { +impl<'a> WasmGrpcProvider<'a> { /// create new Cosmwasm GRPC Provider - pub fn new(conf: &ConnectionConf, locator: &ContractLocator, signer: &Signer) -> Self { + pub fn new(conf: &'a ConnectionConf, locator: &'a ContractLocator, signer: &'a Signer) -> Self { Self { conf, locator, diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index cb45a761f4..e22230eacd 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -46,14 +46,14 @@ pub struct CosmosWasmIndexer<'a> { event_type: String, } -impl CosmosWasmIndexer<'_> { +impl<'a> CosmosWasmIndexer<'a> { const WASM_TYPE: &str = "wasm"; /// create new Cosmwasm RPC Provider pub fn new( - conf: &ConnectionConf, - locator: &ContractLocator, - signer: &Signer, + conf: &'a ConnectionConf, + locator: &'a ContractLocator, + signer: &'a Signer, event_type: String, ) -> Self { Self { diff --git a/rust/chains/hyperlane-cosmos/src/routing_ism.rs b/rust/chains/hyperlane-cosmos/src/routing_ism.rs index 350e5b29da..6c9c384905 100644 --- a/rust/chains/hyperlane-cosmos/src/routing_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/routing_ism.rs @@ -22,9 +22,9 @@ pub struct CosmosRoutingIsm<'a> { provider: Box>, } -impl CosmosRoutingIsm<'_> { +impl<'a> CosmosRoutingIsm<'a> { /// create a new instance of CosmosRoutingIsm - pub fn new(conf: &ConnectionConf, locator: &ContractLocator, signer: &Signer) -> Self { + pub fn new(conf: &'a ConnectionConf, locator: &'a ContractLocator, signer: &'a Signer) -> Self { let provider = WasmGrpcProvider::new(conf, locator, signer); Self { diff --git a/rust/chains/hyperlane-cosmos/src/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/validator_announce.rs index b0f0649a45..49e04125cf 100644 --- a/rust/chains/hyperlane-cosmos/src/validator_announce.rs +++ b/rust/chains/hyperlane-cosmos/src/validator_announce.rs @@ -25,9 +25,9 @@ pub struct CosmosValidatorAnnounce<'a> { provider: Box>, } -impl CosmosValidatorAnnounce<'_> { +impl<'a> CosmosValidatorAnnounce<'a> { /// create a new instance of CosmosValidatorAnnounce - pub fn new(conf: &ConnectionConf, locator: &ContractLocator, signer: &Signer) -> Self { + pub fn new(conf: &'a ConnectionConf, locator: &'a ContractLocator, signer: &'a Signer) -> Self { let provider = WasmGrpcProvider::new(conf, locator, signer); Self { From 7ca43371895345f5f91cf4dc9fab95d8732b80d0 Mon Sep 17 00:00:00 2001 From: hashableric Date: Sat, 12 Aug 2023 17:15:29 +0900 Subject: [PATCH 015/142] feat: apply changes --- .../hyperlane-cosmos/src/interchain_gas.rs | 8 -------- rust/chains/hyperlane-cosmos/src/mailbox.rs | 17 +++++------------ .../chains/hyperlane-cosmos/src/multisig_ism.rs | 10 +++++----- rust/chains/hyperlane-cosmos/src/routing_ism.rs | 10 +++++----- .../hyperlane-cosmos/src/trait_builder.rs | 15 +++++++++++++-- .../hyperlane-cosmos/src/validator_announce.rs | 8 ++++---- 6 files changed, 32 insertions(+), 36 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index 7908cbfa1f..5ac7d456d9 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -48,10 +48,6 @@ impl CosmosInterchainGasPaymaster { /// A reference to a InterchainGasPaymasterIndexer contract on some Cosmos chain #[derive(Debug)] pub struct CosmosInterchainGasPaymasterIndexer<'a> { - conf: &'a ConnectionConf, - locator: &'a ContractLocator<'a>, - signer: &'a Signer, - event_type: String, indexer: Box>, } @@ -67,10 +63,6 @@ impl<'a> CosmosInterchainGasPaymasterIndexer<'a> { CosmosWasmIndexer::new(conf, locator, signer, event_type.clone()); Self { - conf, - locator, - signer, - event_type, indexer: Box::new(indexer), } } diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 1bb4ff4360..9df46351f8 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -23,7 +23,7 @@ use tracing::instrument; /// A reference to a Mailbox contract on some Cosmos chain pub struct CosmosMailbox<'a> { - conf: &'a ConnectionConf, + _conf: &'a ConnectionConf, locator: &'a ContractLocator<'a>, signer: &'a Signer, provider: Box>, @@ -36,7 +36,7 @@ impl<'a> CosmosMailbox<'a> { let provider = WasmGrpcProvider::new(conf, locator, signer); Self { - conf, + _conf: conf, locator, signer, provider: Box::new(provider), @@ -52,7 +52,7 @@ impl HyperlaneContract for CosmosMailbox<'_> { impl HyperlaneChain for CosmosMailbox<'_> { fn domain(&self) -> &HyperlaneDomain { - &self.locator.domain + self.locator.domain } fn provider(&self) -> Box { @@ -62,7 +62,8 @@ impl HyperlaneChain for CosmosMailbox<'_> { impl Debug for CosmosMailbox<'_> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - Debug::fmt(&(self as &dyn HyperlaneContract), f) + // Debug::fmt(&(self as &dyn HyperlaneContract), f) + todo!() } } @@ -206,10 +207,6 @@ impl Mailbox for CosmosMailbox<'_> { /// Struct that retrieves event data for a Cosmos Mailbox contract #[derive(Debug)] pub struct CosmosMailboxIndexer<'a> { - conf: &'a ConnectionConf, - locator: &'a ContractLocator<'a>, - signer: &'a Signer, - event_type: String, indexer: Box>, } @@ -226,10 +223,6 @@ impl<'a> CosmosMailboxIndexer<'a> { CosmosWasmIndexer::new(conf, locator, signer, event_type.clone()); Self { - conf, - locator, - signer, - event_type, indexer: Box::new(indexer), } } diff --git a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs index 4133ae4610..a4c156f4fe 100644 --- a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs @@ -17,9 +17,9 @@ use crate::{ /// A reference to a MultisigIsm contract on some Cosmos chain #[derive(Debug)] pub struct CosmosMultisigIsm<'a> { - conf: &'a ConnectionConf, + _conf: &'a ConnectionConf, locator: &'a ContractLocator<'a>, - signer: &'a Signer, + _signer: &'a Signer, provider: Box>, } @@ -29,9 +29,9 @@ impl<'a> CosmosMultisigIsm<'a> { let provider = WasmGrpcProvider::new(conf, locator, signer); Self { - conf, + _conf: conf, locator, - signer, + _signer: signer, provider: Box::new(provider), } } @@ -45,7 +45,7 @@ impl HyperlaneContract for CosmosMultisigIsm<'_> { impl HyperlaneChain for CosmosMultisigIsm<'_> { fn domain(&self) -> &HyperlaneDomain { - &self.locator.domain + self.locator.domain } fn provider(&self) -> Box { diff --git a/rust/chains/hyperlane-cosmos/src/routing_ism.rs b/rust/chains/hyperlane-cosmos/src/routing_ism.rs index 6c9c384905..de29b31e39 100644 --- a/rust/chains/hyperlane-cosmos/src/routing_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/routing_ism.rs @@ -16,9 +16,9 @@ use crate::{ /// A reference to a RoutingIsm contract on some Cosmos chain #[derive(Debug)] pub struct CosmosRoutingIsm<'a> { - conf: &'a ConnectionConf, + _conf: &'a ConnectionConf, locator: &'a ContractLocator<'a>, - signer: &'a Signer, + _signer: &'a Signer, provider: Box>, } @@ -28,9 +28,9 @@ impl<'a> CosmosRoutingIsm<'a> { let provider = WasmGrpcProvider::new(conf, locator, signer); Self { - conf, + _conf: conf, locator, - signer, + _signer: signer, provider: Box::new(provider), } } @@ -44,7 +44,7 @@ impl HyperlaneContract for CosmosRoutingIsm<'_> { impl HyperlaneChain for CosmosRoutingIsm<'_> { fn domain(&self) -> &HyperlaneDomain { - &self.locator.domain + self.locator.domain } fn provider(&self) -> Box { diff --git a/rust/chains/hyperlane-cosmos/src/trait_builder.rs b/rust/chains/hyperlane-cosmos/src/trait_builder.rs index 6112a1cbad..a95becc539 100644 --- a/rust/chains/hyperlane-cosmos/src/trait_builder.rs +++ b/rust/chains/hyperlane-cosmos/src/trait_builder.rs @@ -4,9 +4,19 @@ use hyperlane_core::config::{ConfigErrResultExt, ConfigPath, ConfigResult, FromR #[derive(Debug, Clone)] pub enum ConnectionConf { /// Cosmos RPC URL - RpcUrl { url: String, chain_id: String }, + RpcUrl { + /// The RPC URL + url: String, + /// The chain ID + chain_id: String, + }, /// Cosmos GRPC URL - GrpcUrl { url: String, chain_id: String }, + GrpcUrl { + /// The GRPC URL + url: String, + /// The chain ID + chain_id: String, + }, } /// Raw Cosmos connection configuration used for better deserialization errors. @@ -91,6 +101,7 @@ impl ConnectionConf { } } + /// Get the chain ID pub fn get_chain_id(&self) -> String { match self { ConnectionConf::GrpcUrl { chain_id, .. } => chain_id.clone(), diff --git a/rust/chains/hyperlane-cosmos/src/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/validator_announce.rs index 49e04125cf..d7ec6e2577 100644 --- a/rust/chains/hyperlane-cosmos/src/validator_announce.rs +++ b/rust/chains/hyperlane-cosmos/src/validator_announce.rs @@ -19,9 +19,9 @@ use crate::{ /// A reference to a ValidatorAnnounce contract on some Cosmos chain #[derive(Debug)] pub struct CosmosValidatorAnnounce<'a> { - conf: &'a ConnectionConf, + _conf: &'a ConnectionConf, locator: &'a ContractLocator<'a>, - signer: &'a Signer, + _signer: &'a Signer, provider: Box>, } @@ -31,9 +31,9 @@ impl<'a> CosmosValidatorAnnounce<'a> { let provider = WasmGrpcProvider::new(conf, locator, signer); Self { - conf, + _conf: conf, locator, - signer, + _signer: signer, provider: Box::new(provider), } } From 6a14c650d1d4353d50c8df084278b7bc4769910a Mon Sep 17 00:00:00 2001 From: hashableric Date: Sat, 12 Aug 2023 17:32:34 +0900 Subject: [PATCH 016/142] feat: change cosmos conf --- rust/chains/hyperlane-cosmos/src/mailbox.rs | 7 +- .../hyperlane-cosmos/src/providers/grpc.rs | 8 +- .../hyperlane-cosmos/src/providers/rpc.rs | 22 +---- .../hyperlane-cosmos/src/trait_builder.rs | 99 +++++++++---------- rust/hyperlane-base/src/settings/chains.rs | 6 +- 5 files changed, 56 insertions(+), 86 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 9df46351f8..cd06680833 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -213,12 +213,7 @@ pub struct CosmosMailboxIndexer<'a> { impl<'a> CosmosMailboxIndexer<'a> { /// Create a reference to a mailbox at a specific Ethereum address on some /// chain - pub fn new( - conf: &'a ConnectionConf, - locator: &'a ContractLocator, - signer: &'a Signer, - event_type: String, - ) -> Self { + pub fn new(conf: &'a ConnectionConf, locator: &'a ContractLocator, event_type: String) -> Self { let indexer: CosmosWasmIndexer<'_> = CosmosWasmIndexer::new(conf, locator, signer, event_type.clone()); diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index 6c311908f2..254a070916 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -20,7 +20,7 @@ use cosmrs::proto::traits::Message; use cosmrs::tx::{self, Fee, MessageExt, SignDoc, SignerInfo}; use cosmrs::Coin; -use hyperlane_core::{ChainCommunicationError, ChainResult, ContractLocator, U256}; +use hyperlane_core::{ChainResult, ContractLocator, U256}; use serde::Serialize; use std::num::NonZeroU64; use std::str::FromStr; @@ -86,11 +86,7 @@ impl<'a> WasmGrpcProvider<'a> { } fn get_conn_url(&self) -> ChainResult { - self.conf - .get_grpc_url() - .map_err(|_| ChainCommunicationError::NotMatchConnectionType { - msg: "grpc".to_string(), - }) + Ok(self.conf.get_grpc_url()) } fn get_contract_addr(&self) -> ChainResult { diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index e22230eacd..7ea2e58659 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -3,12 +3,9 @@ use cosmrs::rpc::client::{Client, CompatMode, HttpClient}; use cosmrs::tendermint::abci::EventAttribute; use cosmrs::tendermint::hash::Algorithm; use cosmrs::tendermint::Hash; -use hyperlane_core::{ - ChainCommunicationError, ChainResult, ContractLocator, LogMeta, H256, H512, U256, -}; +use hyperlane_core::{ChainResult, ContractLocator, LogMeta, H256, H512, U256}; use sha256::digest; -use crate::signers::Signer; use crate::verify::{self, bech32_decode}; use crate::ConnectionConf; @@ -42,7 +39,6 @@ pub trait WasmIndexer: Send + Sync { pub struct CosmosWasmIndexer<'a> { conf: &'a ConnectionConf, locator: &'a ContractLocator<'a>, - signer: &'a Signer, event_type: String, } @@ -50,32 +46,22 @@ impl<'a> CosmosWasmIndexer<'a> { const WASM_TYPE: &str = "wasm"; /// create new Cosmwasm RPC Provider - pub fn new( - conf: &'a ConnectionConf, - locator: &'a ContractLocator, - signer: &'a Signer, - event_type: String, - ) -> Self { + pub fn new(conf: &'a ConnectionConf, locator: &'a ContractLocator, event_type: String) -> Self { Self { conf, locator, - signer, event_type, } } /// get rpc client url fn get_conn_url(&self) -> ChainResult { - self.conf - .get_rpc_url() - .map_err(|_| ChainCommunicationError::NotMatchConnectionType { - msg: "rpc".to_string(), - }) + Ok(self.conf.get_rpc_url()) } /// get contract address pub fn get_contract_addr(&self) -> ChainResult { - verify::digest_to_addr(self.locator.address, self.signer.prefix.as_str()) + verify::digest_to_addr(self.locator.address, self.conf.get_prefix().as_str()) } } diff --git a/rust/chains/hyperlane-cosmos/src/trait_builder.rs b/rust/chains/hyperlane-cosmos/src/trait_builder.rs index a95becc539..d76f0aad5c 100644 --- a/rust/chains/hyperlane-cosmos/src/trait_builder.rs +++ b/rust/chains/hyperlane-cosmos/src/trait_builder.rs @@ -2,34 +2,29 @@ use hyperlane_core::config::{ConfigErrResultExt, ConfigPath, ConfigResult, FromR /// Cosmos connection configuration #[derive(Debug, Clone)] -pub enum ConnectionConf { - /// Cosmos RPC URL - RpcUrl { - /// The RPC URL - url: String, - /// The chain ID - chain_id: String, - }, - /// Cosmos GRPC URL - GrpcUrl { - /// The GRPC URL - url: String, - /// The chain ID - chain_id: String, - }, +pub struct ConnectionConf { + /// The GRPC url to connect to + grpc_url: String, + /// The RPC url to connect to + rpc_url: String, + /// The chain ID + chain_id: String, + /// The prefix for the account address + prefix: String, } /// Raw Cosmos connection configuration used for better deserialization errors. #[derive(Debug, serde::Deserialize)] #[serde(rename_all = "camelCase")] pub struct RawConnectionConf { - /// The type of connection to use - #[serde(rename = "type")] - connection_type: Option, - /// A single url to connect to - url: Option, + /// A single url to connect to rpc + rpc_url: Option, + /// A single url to connect to grpc + grpc_url: Option, /// The chain ID chain_id: Option, + /// chain prefix + prefix: Option, } /// An error type when parsing a connection configuration. @@ -41,15 +36,12 @@ pub enum ConnectionConfError { /// Missing `chainId` for connection configuration #[error("Missing `chainId` for connection configuration")] MissingChainId, + /// Missing `prefix` for connection configuration + #[error("Missing `prefix` for connection configuration")] + MissingPrefix, /// Invalid `url` for connection configuration #[error("Invalid `url` for connection configuration: `{0}` ({1})")] InvalidConnectionUrl(String, url::ParseError), - /// Invalid `url` type - #[error("Invalid connection type")] - InvalidConnectionType, - /// Unsupported `url` type - #[error("Unsupported connection type: '{0}'")] - UnsupportedConnectionType(String), } impl FromRawConf<'_, RawConnectionConf> for ConnectionConf { @@ -61,51 +53,50 @@ impl FromRawConf<'_, RawConnectionConf> for ConnectionConf { use ConnectionConfError::*; // parse the connection relate informations - let connectiont_type = raw.connection_type.as_deref().unwrap_or("grpc"); let chain_id = raw .chain_id .ok_or(MissingChainId) .into_config_result(|| cwp.join("chainId"))?; - let url = raw - .url + let rpc_url = raw + .rpc_url + .ok_or(MissingConnectionUrl) + .into_config_result(|| cwp.join("rpc_url"))?; + let grpc_url = raw + .grpc_url .ok_or(MissingConnectionUrl) - .into_config_result(|| cwp.join("url"))?; + .into_config_result(|| cwp.join("grpc_url"))?; + let prefix = raw + .prefix + .ok_or(MissingPrefix) + .into_config_result(|| cwp.join("prefix"))?; - match connectiont_type { - "grpc" => Ok(ConnectionConf::GrpcUrl { url, chain_id }), - "rpc" => Ok(ConnectionConf::RpcUrl { url, chain_id }), - t => Err(ConnectionConfError::UnsupportedConnectionType( - t.to_string(), - )) - .into_config_result(|| cwp.join("type")), - } + Ok(ConnectionConf { + grpc_url, + rpc_url, + chain_id, + prefix, + }) } } impl ConnectionConf { /// Get the GRPC url - pub fn get_grpc_url(&self) -> Result { - if let ConnectionConf::GrpcUrl { url, .. } = self { - Ok(url.clone()) - } else { - Err(ConnectionConfError::InvalidConnectionType) - } + pub fn get_grpc_url(&self) -> String { + self.grpc_url } /// Get the RPC url - pub fn get_rpc_url(&self) -> Result { - if let ConnectionConf::RpcUrl { url, .. } = self { - Ok(url.clone()) - } else { - Err(ConnectionConfError::InvalidConnectionType) - } + pub fn get_rpc_url(&self) -> String { + self.rpc_url } /// Get the chain ID pub fn get_chain_id(&self) -> String { - match self { - ConnectionConf::GrpcUrl { chain_id, .. } => chain_id.clone(), - ConnectionConf::RpcUrl { chain_id, .. } => chain_id.clone(), - } + self.chain_id + } + + /// Get the prefix + pub fn get_prefix(&self) -> String { + self.prefix } } diff --git a/rust/hyperlane-base/src/settings/chains.rs b/rust/hyperlane-base/src/settings/chains.rs index 7eff6bfb53..490f87faea 100644 --- a/rust/hyperlane-base/src/settings/chains.rs +++ b/rust/hyperlane-base/src/settings/chains.rs @@ -147,6 +147,7 @@ impl ChainConf { } ChainConnectionConf::Fuel(_) => todo!(), ChainConnectionConf::Sealevel(_) => todo!(), + ChainConnectionConf::Cosmos(_) => todo!(), } .context(ctx) } @@ -232,12 +233,14 @@ impl ChainConf { ) .await } - ChainConnectionConf::Fuel(_) => todo!(), ChainConnectionConf::Sealevel(conf) => { let indexer = Box::new(h_sealevel::SealevelMailboxIndexer::new(conf, locator)?); Ok(indexer as Box>) } + ChainConnectionConf::Cosmos(conf) => { + let indexer = Box::new(h_cosmos::CosmosMailboxIndexer::new(conf, locator)?); + } } .context(ctx) } @@ -262,7 +265,6 @@ impl ChainConf { ) .await } - ChainConnectionConf::Fuel(_) => todo!(), ChainConnectionConf::Sealevel(conf) => { let indexer = Box::new(h_sealevel::SealevelMailboxIndexer::new(conf, locator)?); From 327ba38f77c3d0f0af9628959765fdeaa3fd6676 Mon Sep 17 00:00:00 2001 From: hashableric Date: Sat, 12 Aug 2023 17:44:35 +0900 Subject: [PATCH 017/142] feat: implment igp defaults --- .../hyperlane-cosmos/src/interchain_gas.rs | 45 ++++++++++--------- rust/chains/hyperlane-cosmos/src/mailbox.rs | 2 +- .../hyperlane-cosmos/src/trait_builder.rs | 8 ++-- rust/hyperlane-base/src/settings/chains.rs | 21 ++++++++- 4 files changed, 48 insertions(+), 28 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index 5ac7d456d9..d1e0ce9d7b 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -1,5 +1,3 @@ -use std::ops::RangeInclusive; - use async_trait::async_trait; use cosmrs::tendermint::abci::EventAttribute; use hyperlane_core::{ @@ -7,28 +5,31 @@ use hyperlane_core::{ InterchainGasPaymaster, U256, }; use hyperlane_core::{HyperlaneDomain, HyperlaneProvider, InterchainGasPayment, LogMeta, H256}; +use std::ops::RangeInclusive; +use crate::grpc::{WasmGrpcProvider, WasmProvider}; use crate::rpc::{CosmosWasmIndexer, WasmIndexer}; use crate::signers::Signer; -use crate::verify::bech32_decode; use crate::ConnectionConf; /// A reference to a InterchainGasPaymaster contract on some Cosmos chain #[derive(Debug)] -pub struct CosmosInterchainGasPaymaster { - domain: HyperlaneDomain, - address: String, +pub struct CosmosInterchainGasPaymaster<'a> { + _conf: &'a ConnectionConf, + locator: &'a ContractLocator<'a>, + _signer: &'a Signer, + _provider: Box>, } -impl HyperlaneContract for CosmosInterchainGasPaymaster { +impl HyperlaneContract for CosmosInterchainGasPaymaster<'_> { fn address(&self) -> H256 { - bech32_decode(self.address.clone()) + self.locator.address } } -impl HyperlaneChain for CosmosInterchainGasPaymaster { +impl HyperlaneChain for CosmosInterchainGasPaymaster<'_> { fn domain(&self) -> &HyperlaneDomain { - &self.domain + self.locator.domain } fn provider(&self) -> Box { @@ -36,12 +37,19 @@ impl HyperlaneChain for CosmosInterchainGasPaymaster { } } -impl InterchainGasPaymaster for CosmosInterchainGasPaymaster {} +impl InterchainGasPaymaster for CosmosInterchainGasPaymaster<'_> {} -impl CosmosInterchainGasPaymaster { +impl<'a> CosmosInterchainGasPaymaster<'a> { /// create new Cosmos InterchainGasPaymaster agent - pub fn new(domain: HyperlaneDomain, address: String) -> Self { - Self { domain, address } + pub fn new(conf: &'a ConnectionConf, locator: &'a ContractLocator, signer: &'a Signer) -> Self { + let provider = WasmGrpcProvider::new(conf, locator, signer); + + Self { + _conf: conf, + locator, + _signer: signer, + _provider: Box::new(provider), + } } } @@ -53,14 +61,9 @@ pub struct CosmosInterchainGasPaymasterIndexer<'a> { impl<'a> CosmosInterchainGasPaymasterIndexer<'a> { /// create new Cosmos InterchainGasPaymasterIndexer agent - pub fn new( - conf: &'a ConnectionConf, - locator: &'a ContractLocator, - signer: &'a Signer, - event_type: String, - ) -> Self { + pub fn new(conf: &'a ConnectionConf, locator: &'a ContractLocator, event_type: String) -> Self { let indexer: CosmosWasmIndexer<'_> = - CosmosWasmIndexer::new(conf, locator, signer, event_type.clone()); + CosmosWasmIndexer::new(conf, locator, event_type.clone()); Self { indexer: Box::new(indexer), diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index cd06680833..645d5e7a08 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -215,7 +215,7 @@ impl<'a> CosmosMailboxIndexer<'a> { /// chain pub fn new(conf: &'a ConnectionConf, locator: &'a ContractLocator, event_type: String) -> Self { let indexer: CosmosWasmIndexer<'_> = - CosmosWasmIndexer::new(conf, locator, signer, event_type.clone()); + CosmosWasmIndexer::new(conf, locator, event_type.clone()); Self { indexer: Box::new(indexer), diff --git a/rust/chains/hyperlane-cosmos/src/trait_builder.rs b/rust/chains/hyperlane-cosmos/src/trait_builder.rs index d76f0aad5c..133c8c450c 100644 --- a/rust/chains/hyperlane-cosmos/src/trait_builder.rs +++ b/rust/chains/hyperlane-cosmos/src/trait_builder.rs @@ -82,21 +82,21 @@ impl FromRawConf<'_, RawConnectionConf> for ConnectionConf { impl ConnectionConf { /// Get the GRPC url pub fn get_grpc_url(&self) -> String { - self.grpc_url + self.grpc_url.clone() } /// Get the RPC url pub fn get_rpc_url(&self) -> String { - self.rpc_url + self.rpc_url.clone() } /// Get the chain ID pub fn get_chain_id(&self) -> String { - self.chain_id + self.chain_id.clone() } /// Get the prefix pub fn get_prefix(&self) -> String { - self.prefix + self.prefix.clone() } } diff --git a/rust/hyperlane-base/src/settings/chains.rs b/rust/hyperlane-base/src/settings/chains.rs index 490f87faea..e0fc6d503f 100644 --- a/rust/hyperlane-base/src/settings/chains.rs +++ b/rust/hyperlane-base/src/settings/chains.rs @@ -239,7 +239,12 @@ impl ChainConf { Ok(indexer as Box>) } ChainConnectionConf::Cosmos(conf) => { - let indexer = Box::new(h_cosmos::CosmosMailboxIndexer::new(conf, locator)?); + let indexer = Box::new(h_cosmos::CosmosMailboxIndexer::new( + conf, + &locator, + "mailbox_dispatch".to_string(), // TODO: is this correct for? + )?); + Ok(indexer as Box) } } .context(ctx) @@ -270,6 +275,14 @@ impl ChainConf { let indexer = Box::new(h_sealevel::SealevelMailboxIndexer::new(conf, locator)?); Ok(indexer as Box>) } + ChainConnectionConf::Cosmos(conf) => { + let indexer = Box::new(h_cosmos::CosmosMailboxIndexer::new( + conf, + &locator, + "mailbox_process".to_string(), // TODO: is this correct for? + )?); + Ok(indexer as Box) + } } .context(ctx) } @@ -293,7 +306,6 @@ impl ChainConf { ) .await } - ChainConnectionConf::Fuel(_) => todo!(), ChainConnectionConf::Sealevel(conf) => { let paymaster = Box::new( @@ -301,6 +313,11 @@ impl ChainConf { ); Ok(paymaster as Box) } + ChainConnectionConf::Cosmos(conf) => { + let paymaster = + Box::new(h_cosmos::CosmosInterchainGasPaymaster::new(conf, &locator)); + Ok(paymaster as Box) + } } .context(ctx) } From 5d8ca62fe42a89cc93a8e2512a8924c55bdf43af Mon Sep 17 00:00:00 2001 From: hashableric Date: Sat, 12 Aug 2023 17:54:08 +0900 Subject: [PATCH 018/142] feat: implmenet relayer --- .../hyperlane-cosmos/src/interchain_gas.rs | 2 +- rust/chains/hyperlane-cosmos/src/mailbox.rs | 2 +- rust/hyperlane-base/src/settings/chains.rs | 55 ++++++++++++++++--- 3 files changed, 48 insertions(+), 11 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index d1e0ce9d7b..e8c34ae309 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -7,7 +7,7 @@ use hyperlane_core::{ use hyperlane_core::{HyperlaneDomain, HyperlaneProvider, InterchainGasPayment, LogMeta, H256}; use std::ops::RangeInclusive; -use crate::grpc::{WasmGrpcProvider, WasmProvider}; +use crate::grpc::WasmGrpcProvider; use crate::rpc::{CosmosWasmIndexer, WasmIndexer}; use crate::signers::Signer; use crate::ConnectionConf; diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 645d5e7a08..6b3b5ccb0f 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -33,7 +33,7 @@ impl<'a> CosmosMailbox<'a> { /// Create a reference to a mailbox at a specific Ethereum address on some /// chain pub fn new(conf: &'a ConnectionConf, locator: &'a ContractLocator, signer: &'a Signer) -> Self { - let provider = WasmGrpcProvider::new(conf, locator, signer); + let provider: WasmGrpcProvider<'_> = WasmGrpcProvider::new(conf, locator, signer); Self { _conf: conf, diff --git a/rust/hyperlane-base/src/settings/chains.rs b/rust/hyperlane-base/src/settings/chains.rs index e0fc6d503f..09921e0234 100644 --- a/rust/hyperlane-base/src/settings/chains.rs +++ b/rust/hyperlane-base/src/settings/chains.rs @@ -1,6 +1,8 @@ +use ethers::{prelude::Selector, types::Chain}; +use eyre::{eyre, Context, Result}; +use serde::Deserialize; use std::collections::HashMap; -use ethers::prelude::Selector; use ethers_prometheus::middleware::{ ChainInfo, ContractInfo, PrometheusMiddlewareConf, WalletInfo, }; @@ -314,8 +316,10 @@ impl ChainConf { Ok(paymaster as Box) } ChainConnectionConf::Cosmos(conf) => { - let paymaster = - Box::new(h_cosmos::CosmosInterchainGasPaymaster::new(conf, &locator)); + let signer = self.cosmos_signer().await.context(ctx)?; + let paymaster = Box::new(h_cosmos::CosmosInterchainGasPaymaster::new( + conf, &locator, signer, + )); Ok(paymaster as Box) } } @@ -343,7 +347,6 @@ impl ChainConf { ) .await } - ChainConnectionConf::Fuel(_) => todo!(), ChainConnectionConf::Sealevel(conf) => { let indexer = Box::new( @@ -351,6 +354,14 @@ impl ChainConf { ); Ok(indexer as Box>) } + ChainConnectionConf::Cosmos(conf) => { + let indexer = Box::new(h_cosmos::CosmosInterchainGasPaymasterIndexer::new( + conf, + &locator, + "pay-for-gas".to_string(), + )); + Ok(indexer as Box>) + } } .context(ctx) } @@ -399,12 +410,19 @@ impl ChainConf { self.build_ethereum(conf, &locator, metrics, h_eth::ValidatorAnnounceBuilder {}) .await } - ChainConnectionConf::Fuel(_) => todo!(), ChainConnectionConf::Sealevel(conf) => { let va = Box::new(h_sealevel::SealevelValidatorAnnounce::new(conf, locator)); Ok(va as Box) } + ChainConnectionConf::Cosmos(conf) => { + let signer = self.cosmos_signer().await.context(ctx)?; + let va = Box::new(h_cosmos::CosmosValidatorAnnounce::new( + conf, &locator, signer, + )); + + Ok(va as Box) + } } .context("Building ValidatorAnnounce") } @@ -429,7 +447,6 @@ impl ChainConf { ) .await } - ChainConnectionConf::Fuel(_) => todo!(), ChainConnectionConf::Sealevel(conf) => { let keypair = self.sealevel_signer().await.context(ctx)?; @@ -438,6 +455,13 @@ impl ChainConf { )); Ok(ism as Box) } + ChainConnectionConf::Cosmos(conf) => { + let signer = self.cosmos_signer().await.context(ctx)?; + let ism = Box::new(h_cosmos::CosmosInterchainSecurityModule::new( + conf, &locator, signer, + )); + Ok(ism as Box) + } } .context(ctx) } @@ -463,6 +487,11 @@ impl ChainConf { let ism = Box::new(h_sealevel::SealevelMultisigIsm::new(conf, locator, keypair)); Ok(ism as Box) } + ChainConnectionConf::Cosmos(conf) => { + let signer = self.cosmos_signer().await.context(ctx)?; + let ism = Box::new(h_cosmos::CosmosMultisigIsm::new(conf, &locator, signer)); + Ok(ism as Box) + } } .context(ctx) } @@ -484,11 +513,15 @@ impl ChainConf { self.build_ethereum(conf, &locator, metrics, h_eth::RoutingIsmBuilder {}) .await } - ChainConnectionConf::Fuel(_) => todo!(), ChainConnectionConf::Sealevel(_) => { Err(eyre!("Sealevel does not support routing ISM yet")).context(ctx) } + ChainConnectionConf::Cosmos(conf) => { + let signer = self.cosmos_signer().await.context(ctx)?; + let ism = Box::new(h_cosmos::CosmosRoutingIsm::new(conf, &locator, signer)); + Ok(ism as Box) + } } .context(ctx) } @@ -510,11 +543,13 @@ impl ChainConf { self.build_ethereum(conf, &locator, metrics, h_eth::AggregationIsmBuilder {}) .await } - ChainConnectionConf::Fuel(_) => todo!(), ChainConnectionConf::Sealevel(_) => { Err(eyre!("Sealevel does not support aggregation ISM yet")).context(ctx) } + ChainConnectionConf::Cosmos(_) => { + Err(eyre!("Cosmos does not support aggregation ISM yet")).context(ctx) + } } .context(ctx) } @@ -536,11 +571,13 @@ impl ChainConf { self.build_ethereum(conf, &locator, metrics, h_eth::CcipReadIsmBuilder {}) .await } - ChainConnectionConf::Fuel(_) => todo!(), ChainConnectionConf::Sealevel(_) => { Err(eyre!("Sealevel does not support CCIP read ISM yet")).context(ctx) } + ChainConnectionConf::Cosmos(_) => { + Err(eyre!("Cosmos does not support CCIP read ISM yet")).context(ctx) + } } .context(ctx) } From 4f0475fb5a89cb8e51216348bb0373b4a4b7e522 Mon Sep 17 00:00:00 2001 From: hashableric Date: Sun, 13 Aug 2023 01:06:46 +0900 Subject: [PATCH 019/142] feat: make buildable --- .../hyperlane-cosmos/src/interchain_gas.rs | 86 ++++++++++++----- rust/chains/hyperlane-cosmos/src/lib.rs | 10 +- rust/chains/hyperlane-cosmos/src/mailbox.rs | 94 ++++++++++++++----- .../hyperlane-cosmos/src/multisig_ism.rs | 30 +++--- .../hyperlane-cosmos/src/providers/grpc.rs | 22 +++-- .../hyperlane-cosmos/src/providers/rpc.rs | 20 ++-- .../hyperlane-cosmos/src/routing_ism.rs | 30 +++--- rust/chains/hyperlane-cosmos/src/signers.rs | 11 +++ .../src/validator_announce.rs | 30 +++--- rust/chains/hyperlane-cosmos/src/verify.rs | 5 + .../hyperlane-fuel/src/validator_announce.rs | 5 +- rust/hyperlane-base/src/settings/chains.rs | 62 +++++++----- rust/hyperlane-base/src/settings/signers.rs | 23 ++++- 13 files changed, 286 insertions(+), 142 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index e8c34ae309..b954edf1f7 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -2,10 +2,11 @@ use async_trait::async_trait; use cosmrs::tendermint::abci::EventAttribute; use hyperlane_core::{ ChainResult, ContractLocator, HyperlaneChain, HyperlaneContract, Indexer, - InterchainGasPaymaster, U256, + InterchainGasPaymaster, SequenceIndexer, U256, }; use hyperlane_core::{HyperlaneDomain, HyperlaneProvider, InterchainGasPayment, LogMeta, H256}; use std::ops::RangeInclusive; +use tracing::info; use crate::grpc::WasmGrpcProvider; use crate::rpc::{CosmosWasmIndexer, WasmIndexer}; @@ -14,22 +15,23 @@ use crate::ConnectionConf; /// A reference to a InterchainGasPaymaster contract on some Cosmos chain #[derive(Debug)] -pub struct CosmosInterchainGasPaymaster<'a> { - _conf: &'a ConnectionConf, - locator: &'a ContractLocator<'a>, - _signer: &'a Signer, - _provider: Box>, +pub struct CosmosInterchainGasPaymaster { + _conf: ConnectionConf, + domain: HyperlaneDomain, + address: H256, + _signer: Signer, + _provider: Box, } -impl HyperlaneContract for CosmosInterchainGasPaymaster<'_> { +impl HyperlaneContract for CosmosInterchainGasPaymaster { fn address(&self) -> H256 { - self.locator.address + self.address } } -impl HyperlaneChain for CosmosInterchainGasPaymaster<'_> { +impl HyperlaneChain for CosmosInterchainGasPaymaster { fn domain(&self) -> &HyperlaneDomain { - self.locator.domain + &self.domain } fn provider(&self) -> Box { @@ -37,16 +39,17 @@ impl HyperlaneChain for CosmosInterchainGasPaymaster<'_> { } } -impl InterchainGasPaymaster for CosmosInterchainGasPaymaster<'_> {} +impl InterchainGasPaymaster for CosmosInterchainGasPaymaster {} -impl<'a> CosmosInterchainGasPaymaster<'a> { +impl CosmosInterchainGasPaymaster { /// create new Cosmos InterchainGasPaymaster agent - pub fn new(conf: &'a ConnectionConf, locator: &'a ContractLocator, signer: &'a Signer) -> Self { - let provider = WasmGrpcProvider::new(conf, locator, signer); + pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); Self { _conf: conf, - locator, + domain: locator.domain.clone(), + address: locator.address, _signer: signer, _provider: Box::new(provider), } @@ -55,15 +58,14 @@ impl<'a> CosmosInterchainGasPaymaster<'a> { /// A reference to a InterchainGasPaymasterIndexer contract on some Cosmos chain #[derive(Debug)] -pub struct CosmosInterchainGasPaymasterIndexer<'a> { - indexer: Box>, +pub struct CosmosInterchainGasPaymasterIndexer { + indexer: Box, } -impl<'a> CosmosInterchainGasPaymasterIndexer<'a> { +impl CosmosInterchainGasPaymasterIndexer { /// create new Cosmos InterchainGasPaymasterIndexer agent - pub fn new(conf: &'a ConnectionConf, locator: &'a ContractLocator, event_type: String) -> Self { - let indexer: CosmosWasmIndexer<'_> = - CosmosWasmIndexer::new(conf, locator, event_type.clone()); + pub fn new(conf: ConnectionConf, locator: ContractLocator, event_type: String) -> Self { + let indexer: CosmosWasmIndexer = CosmosWasmIndexer::new(conf, locator, event_type.clone()); Self { indexer: Box::new(indexer), @@ -98,7 +100,7 @@ impl<'a> CosmosInterchainGasPaymasterIndexer<'a> { } #[async_trait] -impl Indexer for CosmosInterchainGasPaymasterIndexer<'_> { +impl Indexer for CosmosInterchainGasPaymasterIndexer { async fn fetch_logs( &self, range: RangeInclusive, @@ -118,3 +120,43 @@ impl Indexer for CosmosInterchainGasPaymasterIndexer<'_> { self.indexer.latest_block_height().await } } + +#[async_trait] +impl Indexer for CosmosInterchainGasPaymasterIndexer { + async fn fetch_logs(&self, range: RangeInclusive) -> ChainResult> { + let mut result: Vec<(InterchainGasPayment, LogMeta)> = vec![]; + let parser = self.get_parser(); + + for block_number in range { + let logs = self.indexer.get_event_log(block_number, parser).await?; + result.extend(logs); + } + + Ok(result + .into_iter() + .map(|(msg, meta)| (msg.message_id, meta)) + .collect()) + } + + async fn get_finalized_block_number(&self) -> ChainResult { + self.indexer.latest_block_height().await + } +} + +#[async_trait] +impl SequenceIndexer for CosmosInterchainGasPaymasterIndexer { + async fn sequence_at_tip(&self) -> ChainResult<(u32, u32)> { + // TODO: implement when sealevel scraper support is implemented + info!("Message delivery indexing not implemented"); + Ok((1, 1)) + } +} + +#[async_trait] +impl SequenceIndexer for CosmosInterchainGasPaymasterIndexer { + async fn sequence_at_tip(&self) -> ChainResult<(u32, u32)> { + // TODO: implement when sealevel scraper support is implemented + info!("Message delivery indexing not implemented"); + Ok((1, 1)) + } +} diff --git a/rust/chains/hyperlane-cosmos/src/lib.rs b/rust/chains/hyperlane-cosmos/src/lib.rs index ac09bef4df..f6cce1ebef 100644 --- a/rust/chains/hyperlane-cosmos/src/lib.rs +++ b/rust/chains/hyperlane-cosmos/src/lib.rs @@ -5,11 +5,6 @@ // TODO: Remove once we start filling things in #![allow(unused_variables)] -pub use self::{ - interchain_gas::*, mailbox::*, multisig_ism::*, providers::*, routing_ism::*, trait_builder::*, - validator_announce::*, -}; - mod contracts; mod interchain_gas; mod mailbox; @@ -22,5 +17,10 @@ mod trait_builder; mod validator_announce; mod verify; +pub use self::{ + interchain_gas::*, mailbox::*, multisig_ism::*, providers::*, routing_ism::*, signers::*, + trait_builder::*, trait_builder::*, validator_announce::*, validator_announce::*, verify::*, +}; + /// Safe default imports of commonly used traits/types. pub mod prelude {} diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 6b3b5ccb0f..6201987402 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -18,41 +18,44 @@ use hyperlane_core::{ HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneMessage, HyperlaneProvider, Indexer, LogMeta, Mailbox, TxCostEstimate, TxOutcome, H256, U256, }; -use hyperlane_core::{ContractLocator, RawHyperlaneMessage, H512}; -use tracing::instrument; +use hyperlane_core::{ContractLocator, MessageIndexer, RawHyperlaneMessage, SequenceIndexer, H512}; +use tracing::{info, instrument}; /// A reference to a Mailbox contract on some Cosmos chain -pub struct CosmosMailbox<'a> { - _conf: &'a ConnectionConf, - locator: &'a ContractLocator<'a>, - signer: &'a Signer, - provider: Box>, +pub struct CosmosMailbox { + _conf: ConnectionConf, + domain: HyperlaneDomain, + address: H256, + signer: Signer, + provider: Box, } -impl<'a> CosmosMailbox<'a> { +impl CosmosMailbox { /// Create a reference to a mailbox at a specific Ethereum address on some /// chain - pub fn new(conf: &'a ConnectionConf, locator: &'a ContractLocator, signer: &'a Signer) -> Self { - let provider: WasmGrpcProvider<'_> = WasmGrpcProvider::new(conf, locator, signer); + pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { + let provider: WasmGrpcProvider = + WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); Self { _conf: conf, - locator, + domain: locator.domain.clone(), + address: locator.address, signer, provider: Box::new(provider), } } } -impl HyperlaneContract for CosmosMailbox<'_> { +impl HyperlaneContract for CosmosMailbox { fn address(&self) -> H256 { - self.locator.address + self.address } } -impl HyperlaneChain for CosmosMailbox<'_> { +impl HyperlaneChain for CosmosMailbox { fn domain(&self) -> &HyperlaneDomain { - self.locator.domain + &self.domain } fn provider(&self) -> Box { @@ -60,15 +63,15 @@ impl HyperlaneChain for CosmosMailbox<'_> { } } -impl Debug for CosmosMailbox<'_> { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { +impl Debug for CosmosMailbox { + fn fmt(&self, f: &mut Formatter) -> std::fmt::Result { // Debug::fmt(&(self as &dyn HyperlaneContract), f) todo!() } } #[async_trait] -impl Mailbox for CosmosMailbox<'_> { +impl Mailbox for CosmosMailbox { #[instrument(level = "debug", err, ret, skip(self))] async fn tree(&self, lag: Option) -> ChainResult { let payload = mailbox::MerkleTreeRequest { @@ -206,19 +209,27 @@ impl Mailbox for CosmosMailbox<'_> { /// Struct that retrieves event data for a Cosmos Mailbox contract #[derive(Debug)] -pub struct CosmosMailboxIndexer<'a> { - indexer: Box>, +pub struct CosmosMailboxIndexer { + indexer: Box, + provider: Box, } -impl<'a> CosmosMailboxIndexer<'a> { +impl CosmosMailboxIndexer { /// Create a reference to a mailbox at a specific Ethereum address on some /// chain - pub fn new(conf: &'a ConnectionConf, locator: &'a ContractLocator, event_type: String) -> Self { - let indexer: CosmosWasmIndexer<'_> = - CosmosWasmIndexer::new(conf, locator, event_type.clone()); + pub fn new( + conf: ConnectionConf, + locator: ContractLocator, + signer: Signer, + event_type: String, + ) -> Self { + let indexer: CosmosWasmIndexer = + CosmosWasmIndexer::new(conf.clone(), locator.clone(), event_type.clone()); + let provider: WasmGrpcProvider = WasmGrpcProvider::new(conf, locator, signer); Self { indexer: Box::new(indexer), + provider: Box::new(provider), } } @@ -249,10 +260,32 @@ impl<'a> CosmosMailboxIndexer<'a> { res } } + + #[instrument(level = "debug", err, ret, skip(self))] + async fn count(&self, lag: Option) -> ChainResult { + let payload = mailbox::CountRequest { + count: general::EmptyStruct {}, + }; + + let data = self.provider.wasm_query(payload, lag).await?; + let response: mailbox::CountResponse = serde_json::from_slice(&data)?; + + Ok(response.count) + } +} + +#[async_trait] +impl MessageIndexer for CosmosMailboxIndexer { + #[instrument(err, skip(self))] + async fn fetch_count_at_tip(&self) -> ChainResult<(u32, u32)> { + let tip = Indexer::::get_finalized_block_number(self as _).await?; + let count = self.count(None).await?; + Ok((count, tip)) + } } #[async_trait] -impl Indexer for CosmosMailboxIndexer<'_> { +impl Indexer for CosmosMailboxIndexer { async fn fetch_logs( &self, range: RangeInclusive, @@ -274,7 +307,7 @@ impl Indexer for CosmosMailboxIndexer<'_> { } #[async_trait] -impl Indexer for CosmosMailboxIndexer<'_> { +impl Indexer for CosmosMailboxIndexer { async fn fetch_logs(&self, range: RangeInclusive) -> ChainResult> { let mut result: Vec<(HyperlaneMessage, LogMeta)> = vec![]; let parser: fn(Vec) -> HyperlaneMessage = self.get_parser(); @@ -294,3 +327,12 @@ impl Indexer for CosmosMailboxIndexer<'_> { self.indexer.latest_block_height().await } } + +#[async_trait] +impl SequenceIndexer for CosmosMailboxIndexer { + async fn sequence_at_tip(&self) -> ChainResult<(u32, u32)> { + // TODO: implement when sealevel scraper support is implemented + info!("Message delivery indexing not implemented"); + Ok((1, 1)) + } +} diff --git a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs index a4c156f4fe..d3c110563f 100644 --- a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs @@ -16,36 +16,38 @@ use crate::{ /// A reference to a MultisigIsm contract on some Cosmos chain #[derive(Debug)] -pub struct CosmosMultisigIsm<'a> { - _conf: &'a ConnectionConf, - locator: &'a ContractLocator<'a>, - _signer: &'a Signer, - provider: Box>, +pub struct CosmosMultisigIsm { + _conf: ConnectionConf, + domain: HyperlaneDomain, + address: H256, + _signer: Signer, + provider: Box, } -impl<'a> CosmosMultisigIsm<'a> { +impl CosmosMultisigIsm { /// create a new instance of CosmosMultisigIsm - pub fn new(conf: &'a ConnectionConf, locator: &'a ContractLocator, signer: &'a Signer) -> Self { - let provider = WasmGrpcProvider::new(conf, locator, signer); + pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); Self { _conf: conf, - locator, + domain: locator.domain.clone(), + address: locator.address, _signer: signer, provider: Box::new(provider), } } } -impl HyperlaneContract for CosmosMultisigIsm<'_> { +impl HyperlaneContract for CosmosMultisigIsm { fn address(&self) -> H256 { - self.locator.address + self.address } } -impl HyperlaneChain for CosmosMultisigIsm<'_> { +impl HyperlaneChain for CosmosMultisigIsm { fn domain(&self) -> &HyperlaneDomain { - self.locator.domain + &self.domain } fn provider(&self) -> Box { @@ -54,7 +56,7 @@ impl HyperlaneChain for CosmosMultisigIsm<'_> { } #[async_trait] -impl MultisigIsm for CosmosMultisigIsm<'_> { +impl MultisigIsm for CosmosMultisigIsm { /// Returns the validator and threshold needed to verify message async fn validators_and_threshold( &self, diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index 254a070916..940c94760f 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -20,7 +20,7 @@ use cosmrs::proto::traits::Message; use cosmrs::tx::{self, Fee, MessageExt, SignDoc, SignerInfo}; use cosmrs::Coin; -use hyperlane_core::{ChainResult, ContractLocator, U256}; +use hyperlane_core::{ChainResult, ContractLocator, HyperlaneDomain, H256, U256}; use serde::Serialize; use std::num::NonZeroU64; use std::str::FromStr; @@ -69,18 +69,20 @@ pub trait WasmProvider: Send + Sync { #[derive(Debug)] /// Cosmwasm GRPC Provider -pub struct WasmGrpcProvider<'a> { - conf: &'a ConnectionConf, - locator: &'a ContractLocator<'a>, - signer: &'a Signer, +pub struct WasmGrpcProvider { + conf: ConnectionConf, + domain: HyperlaneDomain, + address: H256, + signer: Signer, } -impl<'a> WasmGrpcProvider<'a> { +impl WasmGrpcProvider { /// create new Cosmwasm GRPC Provider - pub fn new(conf: &'a ConnectionConf, locator: &'a ContractLocator, signer: &'a Signer) -> Self { + pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { Self { conf, - locator, + domain: locator.domain.clone(), + address: locator.address, signer, } } @@ -90,12 +92,12 @@ impl<'a> WasmGrpcProvider<'a> { } fn get_contract_addr(&self) -> ChainResult { - verify::digest_to_addr(self.locator.address, self.signer.prefix.as_str()) + verify::digest_to_addr(self.address, self.signer.prefix.as_str()) } } #[async_trait] -impl WasmProvider for WasmGrpcProvider<'_> { +impl WasmProvider for WasmGrpcProvider { async fn latest_block_height(&self) -> ChainResult { let mut client = ServiceClient::connect(self.get_conn_url()?).await?; let request = tonic::Request::new(GetLatestBlockRequest {}); diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index 7ea2e58659..b034203db8 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -3,7 +3,7 @@ use cosmrs::rpc::client::{Client, CompatMode, HttpClient}; use cosmrs::tendermint::abci::EventAttribute; use cosmrs::tendermint::hash::Algorithm; use cosmrs::tendermint::Hash; -use hyperlane_core::{ChainResult, ContractLocator, LogMeta, H256, H512, U256}; +use hyperlane_core::{ChainResult, ContractLocator, HyperlaneDomain, LogMeta, H256, H512, U256}; use sha256::digest; use crate::verify::{self, bech32_decode}; @@ -36,20 +36,22 @@ pub trait WasmIndexer: Send + Sync { #[derive(Debug)] /// Cosmwasm RPC Provider -pub struct CosmosWasmIndexer<'a> { - conf: &'a ConnectionConf, - locator: &'a ContractLocator<'a>, +pub struct CosmosWasmIndexer { + conf: ConnectionConf, + domain: HyperlaneDomain, + address: H256, event_type: String, } -impl<'a> CosmosWasmIndexer<'a> { +impl CosmosWasmIndexer { const WASM_TYPE: &str = "wasm"; /// create new Cosmwasm RPC Provider - pub fn new(conf: &'a ConnectionConf, locator: &'a ContractLocator, event_type: String) -> Self { + pub fn new(conf: ConnectionConf, locator: ContractLocator, event_type: String) -> Self { Self { conf, - locator, + domain: locator.domain.clone(), + address: locator.address, event_type, } } @@ -61,12 +63,12 @@ impl<'a> CosmosWasmIndexer<'a> { /// get contract address pub fn get_contract_addr(&self) -> ChainResult { - verify::digest_to_addr(self.locator.address, self.conf.get_prefix().as_str()) + verify::digest_to_addr(self.address, self.conf.get_prefix().as_str()) } } #[async_trait] -impl WasmIndexer for CosmosWasmIndexer<'_> { +impl WasmIndexer for CosmosWasmIndexer { fn get_client(&self) -> ChainResult { Ok(HttpClient::builder(self.get_conn_url()?.parse()?) .compat_mode(CompatMode::V0_34) diff --git a/rust/chains/hyperlane-cosmos/src/routing_ism.rs b/rust/chains/hyperlane-cosmos/src/routing_ism.rs index de29b31e39..c313070094 100644 --- a/rust/chains/hyperlane-cosmos/src/routing_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/routing_ism.rs @@ -15,36 +15,38 @@ use crate::{ /// A reference to a RoutingIsm contract on some Cosmos chain #[derive(Debug)] -pub struct CosmosRoutingIsm<'a> { - _conf: &'a ConnectionConf, - locator: &'a ContractLocator<'a>, - _signer: &'a Signer, - provider: Box>, +pub struct CosmosRoutingIsm { + _conf: ConnectionConf, + domain: HyperlaneDomain, + address: H256, + _signer: Signer, + provider: Box, } -impl<'a> CosmosRoutingIsm<'a> { +impl CosmosRoutingIsm { /// create a new instance of CosmosRoutingIsm - pub fn new(conf: &'a ConnectionConf, locator: &'a ContractLocator, signer: &'a Signer) -> Self { - let provider = WasmGrpcProvider::new(conf, locator, signer); + pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); Self { _conf: conf, - locator, + domain: locator.domain.clone(), + address: locator.address, _signer: signer, provider: Box::new(provider), } } } -impl HyperlaneContract for CosmosRoutingIsm<'_> { +impl HyperlaneContract for CosmosRoutingIsm { fn address(&self) -> H256 { - self.locator.address + self.address } } -impl HyperlaneChain for CosmosRoutingIsm<'_> { +impl HyperlaneChain for CosmosRoutingIsm { fn domain(&self) -> &HyperlaneDomain { - self.locator.domain + &self.domain } fn provider(&self) -> Box { @@ -53,7 +55,7 @@ impl HyperlaneChain for CosmosRoutingIsm<'_> { } #[async_trait] -impl RoutingIsm for CosmosRoutingIsm<'_> { +impl RoutingIsm for CosmosRoutingIsm { async fn route(&self, message: &HyperlaneMessage) -> ChainResult { let payload = IsmRouteRequest { route: IsmRouteRequestInner { diff --git a/rust/chains/hyperlane-cosmos/src/signers.rs b/rust/chains/hyperlane-cosmos/src/signers.rs index 7bcd5e77e1..f990db0f3f 100644 --- a/rust/chains/hyperlane-cosmos/src/signers.rs +++ b/rust/chains/hyperlane-cosmos/src/signers.rs @@ -3,12 +3,23 @@ use cosmrs::crypto::secp256k1::SigningKey; use crate::verify; #[derive(Clone, Debug)] +/// Signer for cosmos chain pub struct Signer { + /// prefix for signer address pub prefix: String, pub(crate) private_key: Vec, } impl Signer { + /// create new signer + pub fn new(private_key: Vec, prefix: String) -> Self { + Self { + private_key, + prefix, + } + } + + /// get bech32 address pub fn address(&self) -> String { verify::pub_to_addr( SigningKey::from_slice(self.private_key.as_slice()) diff --git a/rust/chains/hyperlane-cosmos/src/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/validator_announce.rs index d7ec6e2577..f2118334d3 100644 --- a/rust/chains/hyperlane-cosmos/src/validator_announce.rs +++ b/rust/chains/hyperlane-cosmos/src/validator_announce.rs @@ -18,36 +18,38 @@ use crate::{ /// A reference to a ValidatorAnnounce contract on some Cosmos chain #[derive(Debug)] -pub struct CosmosValidatorAnnounce<'a> { - _conf: &'a ConnectionConf, - locator: &'a ContractLocator<'a>, - _signer: &'a Signer, - provider: Box>, +pub struct CosmosValidatorAnnounce { + _conf: ConnectionConf, + domain: HyperlaneDomain, + address: H256, + _signer: Signer, + provider: Box, } -impl<'a> CosmosValidatorAnnounce<'a> { +impl CosmosValidatorAnnounce { /// create a new instance of CosmosValidatorAnnounce - pub fn new(conf: &'a ConnectionConf, locator: &'a ContractLocator, signer: &'a Signer) -> Self { - let provider = WasmGrpcProvider::new(conf, locator, signer); + pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); Self { _conf: conf, - locator, + domain: locator.domain.clone(), + address: locator.address, _signer: signer, provider: Box::new(provider), } } } -impl HyperlaneContract for CosmosValidatorAnnounce<'_> { +impl HyperlaneContract for CosmosValidatorAnnounce { fn address(&self) -> H256 { - self.locator.address + self.address } } -impl HyperlaneChain for CosmosValidatorAnnounce<'_> { +impl HyperlaneChain for CosmosValidatorAnnounce { fn domain(&self) -> &HyperlaneDomain { - self.locator.domain + &self.domain } fn provider(&self) -> Box { @@ -56,7 +58,7 @@ impl HyperlaneChain for CosmosValidatorAnnounce<'_> { } #[async_trait] -impl ValidatorAnnounce for CosmosValidatorAnnounce<'_> { +impl ValidatorAnnounce for CosmosValidatorAnnounce { async fn get_announced_storage_locations( &self, validators: &[H256], diff --git a/rust/chains/hyperlane-cosmos/src/verify.rs b/rust/chains/hyperlane-cosmos/src/verify.rs index 037c6bd3d3..eaa3332946 100644 --- a/rust/chains/hyperlane-cosmos/src/verify.rs +++ b/rust/chains/hyperlane-cosmos/src/verify.rs @@ -5,6 +5,7 @@ use hyperlane_core::{ChainCommunicationError, ChainResult, H256}; use ripemd::Ripemd160; use sha2::{Digest, Sha256}; +/// decode bech32 address to H256 pub fn bech32_decode(addr: String) -> H256 { let (_hrp, data, _variant) = bech32::decode(addr.as_str()).unwrap(); @@ -17,6 +18,7 @@ pub fn bech32_decode(addr: String) -> H256 { H256::from(result) } +/// encode H256 to bech32 address pub fn digest_to_addr(digest: H256, prefix: &str) -> ChainResult { let addr = bech32::encode( prefix, @@ -30,6 +32,7 @@ pub fn digest_to_addr(digest: H256, prefix: &str) -> ChainResult { Ok(addr) } +/// encode H256 to bech32 address pub fn sha256_digest(bz: impl AsRef<[u8]>) -> ChainResult<[u8; 32]> { let mut hasher = Sha256::new(); @@ -44,6 +47,7 @@ pub fn sha256_digest(bz: impl AsRef<[u8]>) -> ChainResult<[u8; 32]> { }) } +/// encode H256 to bech32 address pub fn ripemd160_digest(bz: impl AsRef<[u8]>) -> ChainResult<[u8; 20]> { let mut hasher = Ripemd160::new(); @@ -58,6 +62,7 @@ pub fn ripemd160_digest(bz: impl AsRef<[u8]>) -> ChainResult<[u8; 20]> { }) } +/// encode H256 to bech32 address pub fn pub_to_addr(pub_key: Vec, prefix: &str) -> ChainResult { let sha_hash = sha256_digest(pub_key)?; let rip_hash = ripemd160_digest(sha_hash)?; diff --git a/rust/chains/hyperlane-fuel/src/validator_announce.rs b/rust/chains/hyperlane-fuel/src/validator_announce.rs index 42c0229e23..66c39b1c64 100644 --- a/rust/chains/hyperlane-fuel/src/validator_announce.rs +++ b/rust/chains/hyperlane-fuel/src/validator_announce.rs @@ -42,10 +42,7 @@ impl ValidatorAnnounce for FuelValidatorAnnounce { todo!() } - async fn announce_tokens_needed( - &self, - announcement: SignedType, - ) -> ChainResult { + async fn announce_tokens_needed(&self, announcement: SignedType) -> Option { todo!() } } diff --git a/rust/hyperlane-base/src/settings/chains.rs b/rust/hyperlane-base/src/settings/chains.rs index 09921e0234..1772e40f31 100644 --- a/rust/hyperlane-base/src/settings/chains.rs +++ b/rust/hyperlane-base/src/settings/chains.rs @@ -1,4 +1,7 @@ use ethers::{prelude::Selector, types::Chain}; +use std::collections::HashMap; + +use ethers::prelude::Selector; use eyre::{eyre, Context, Result}; use serde::Deserialize; use std::collections::HashMap; @@ -85,7 +88,7 @@ impl FromRawConf<'_, RawChainConnectionConf> for ChainConnectionConf { Ethereum(r) => Ok(Self::Ethereum(r.parse_config(&cwp.join("connection"))?)), Fuel(r) => Ok(Self::Fuel(r.parse_config(&cwp.join("connection"))?)), Sealevel(r) => Ok(Self::Sealevel(r.parse_config(&cwp.join("connection"))?)), - Cosmos(r) => Ok(Self::Cosmos(r.parse_config(&cwp.join("connection")))), + Cosmos(r) => Ok(Self::Cosmos(r.parse_config(&cwp.join("connection"))?)), Unknown => { Err(eyre!("Unknown chain protocol")).into_config_result(|| cwp.join("protocol")) } @@ -178,7 +181,11 @@ impl ChainConf { } ChainConnectionConf::Cosmos(conf) => { let signer = self.cosmos_signer().await.context(ctx)?; - h_cosmos::CosmosMailbox::new(conf, &locator, signer) + Ok(Box::new(h_cosmos::CosmosMailbox::new( + conf.clone(), + locator.clone(), + signer.clone().unwrap(), + )) as Box) } } .context(ctx) @@ -241,11 +248,13 @@ impl ChainConf { Ok(indexer as Box>) } ChainConnectionConf::Cosmos(conf) => { + let signer = self.cosmos_signer().await.context(ctx)?.unwrap(); let indexer = Box::new(h_cosmos::CosmosMailboxIndexer::new( - conf, - &locator, + conf.clone(), + locator, + signer.clone(), "mailbox_dispatch".to_string(), // TODO: is this correct for? - )?); + )); Ok(indexer as Box) } } @@ -278,12 +287,14 @@ impl ChainConf { Ok(indexer as Box>) } ChainConnectionConf::Cosmos(conf) => { + let signer = self.cosmos_signer().await.context(ctx)?.unwrap(); let indexer = Box::new(h_cosmos::CosmosMailboxIndexer::new( - conf, - &locator, + conf.clone(), + locator, + signer, "mailbox_process".to_string(), // TODO: is this correct for? - )?); - Ok(indexer as Box) + )); + Ok(indexer as Box>) } } .context(ctx) @@ -318,7 +329,9 @@ impl ChainConf { ChainConnectionConf::Cosmos(conf) => { let signer = self.cosmos_signer().await.context(ctx)?; let paymaster = Box::new(h_cosmos::CosmosInterchainGasPaymaster::new( - conf, &locator, signer, + conf.clone(), + locator.clone(), + signer.unwrap().clone(), )); Ok(paymaster as Box) } @@ -356,8 +369,8 @@ impl ChainConf { } ChainConnectionConf::Cosmos(conf) => { let indexer = Box::new(h_cosmos::CosmosInterchainGasPaymasterIndexer::new( - conf, - &locator, + conf.clone(), + locator, "pay-for-gas".to_string(), )); Ok(indexer as Box>) @@ -404,6 +417,7 @@ impl ChainConf { &self, metrics: &CoreMetrics, ) -> Result> { + let ctx = "Building validator announce"; let locator = self.locator(self.addresses.validator_announce); match &self.connection { ChainConnectionConf::Ethereum(conf) => { @@ -418,7 +432,9 @@ impl ChainConf { ChainConnectionConf::Cosmos(conf) => { let signer = self.cosmos_signer().await.context(ctx)?; let va = Box::new(h_cosmos::CosmosValidatorAnnounce::new( - conf, &locator, signer, + conf.clone(), + locator.clone(), + signer.unwrap().clone(), )); Ok(va as Box) @@ -455,13 +471,7 @@ impl ChainConf { )); Ok(ism as Box) } - ChainConnectionConf::Cosmos(conf) => { - let signer = self.cosmos_signer().await.context(ctx)?; - let ism = Box::new(h_cosmos::CosmosInterchainSecurityModule::new( - conf, &locator, signer, - )); - Ok(ism as Box) - } + ChainConnectionConf::Cosmos(_conf) => todo!(), } .context(ctx) } @@ -489,7 +499,11 @@ impl ChainConf { } ChainConnectionConf::Cosmos(conf) => { let signer = self.cosmos_signer().await.context(ctx)?; - let ism = Box::new(h_cosmos::CosmosMultisigIsm::new(conf, &locator, signer)); + let ism = Box::new(h_cosmos::CosmosMultisigIsm::new( + conf.clone(), + locator.clone(), + signer.unwrap().clone(), + )); Ok(ism as Box) } } @@ -519,7 +533,11 @@ impl ChainConf { } ChainConnectionConf::Cosmos(conf) => { let signer = self.cosmos_signer().await.context(ctx)?; - let ism = Box::new(h_cosmos::CosmosRoutingIsm::new(conf, &locator, signer)); + let ism = Box::new(h_cosmos::CosmosRoutingIsm::new( + conf.clone(), + locator.clone(), + signer.unwrap().clone(), + )); Ok(ism as Box) } } diff --git a/rust/hyperlane-base/src/settings/signers.rs b/rust/hyperlane-base/src/settings/signers.rs index c25b2f7a76..e77e869ee3 100644 --- a/rust/hyperlane-base/src/settings/signers.rs +++ b/rust/hyperlane-base/src/settings/signers.rs @@ -10,7 +10,7 @@ use rusoto_core::{HttpClient, HttpConfig, Region}; use rusoto_kms::KmsClient; use tracing::instrument; -use ed25519_dalek::{SecretKey, Signer}; +use ed25519_dalek::SecretKey; use hyperlane_sealevel::Keypair; use super::aws_credentials::AwsChainCredentialsProvider; @@ -32,7 +32,12 @@ pub enum SignerConf { region: Region, }, /// Cosmos Specific key - CosmosKey { key: H256, prefix: String }, + CosmosKey { + /// Private key value + key: H256, + /// Prefix for cosmos address + prefix: String, + }, /// Assume node will sign on RPC calls #[default] Node, @@ -116,3 +121,17 @@ impl BuildableWithSignerConf for Keypair { }) } } + +#[async_trait] +impl BuildableWithSignerConf for hyperlane_cosmos::Signer { + async fn build(conf: &SignerConf) -> Result { + Ok(match conf { + SignerConf::HexKey { .. } => bail!("HexKey signer is not supported by cosmos"), + SignerConf::Aws { .. } => bail!("Aws signer is not supported by cosmos"), + SignerConf::CosmosKey { key, prefix } => { + hyperlane_cosmos::Signer::new(key.as_bytes().to_vec(), prefix.clone()) + } + SignerConf::Node => bail!("Node signer is not supported by cosmos"), + }) + } +} From b905b94bfbbc3a2c6d81557c1c3db40c7b08779a Mon Sep 17 00:00:00 2001 From: hashableric Date: Thu, 17 Aug 2023 19:42:30 +0900 Subject: [PATCH 020/142] feat: run relayer --- .../hyperlane-cosmos/src/providers/grpc.rs | 2 +- .../hyperlane-cosmos/src/providers/rpc.rs | 64 ++-- .../hyperlane-cosmos/src/trait_builder.rs | 1 - rust/hyperlane-base/src/settings/signers.rs | 62 ++++ rust/hyperlane-core/src/traits/cursor.rs | 11 +- rust/hyperlane_db/000186.log | Bin 0 -> 535596 bytes rust/hyperlane_db/000190.sst | Bin 0 -> 2005267 bytes rust/hyperlane_db/CURRENT | 1 + rust/hyperlane_db/IDENTITY | 1 + rust/hyperlane_db/LOCK | 0 rust/hyperlane_db/LOG | 304 ++++++++++++++++++ rust/hyperlane_db/LOG.old.1692109095866656 | 278 ++++++++++++++++ rust/hyperlane_db/LOG.old.1692109129283399 | 283 ++++++++++++++++ rust/hyperlane_db/LOG.old.1692109142543801 | 284 ++++++++++++++++ rust/hyperlane_db/LOG.old.1692109595356629 | 291 +++++++++++++++++ rust/hyperlane_db/LOG.old.1692110322000479 | 287 +++++++++++++++++ rust/hyperlane_db/LOG.old.1692110678116635 | 284 ++++++++++++++++ rust/hyperlane_db/LOG.old.1692159212672457 | 287 +++++++++++++++++ rust/hyperlane_db/LOG.old.1692159337379204 | 303 +++++++++++++++++ rust/hyperlane_db/LOG.old.1692159630683428 | 288 +++++++++++++++++ rust/hyperlane_db/LOG.old.1692160697660985 | 288 +++++++++++++++++ rust/hyperlane_db/LOG.old.1692160774841732 | 286 ++++++++++++++++ rust/hyperlane_db/LOG.old.1692167576188502 | 304 ++++++++++++++++++ rust/hyperlane_db/LOG.old.1692167598179047 | 286 ++++++++++++++++ rust/hyperlane_db/LOG.old.1692168714159548 | 286 ++++++++++++++++ rust/hyperlane_db/LOG.old.1692175657441236 | 286 ++++++++++++++++ rust/hyperlane_db/LOG.old.1692176419380884 | 304 ++++++++++++++++++ rust/hyperlane_db/LOG.old.1692189150768832 | 284 ++++++++++++++++ rust/hyperlane_db/LOG.old.1692189358189015 | 285 ++++++++++++++++ rust/hyperlane_db/LOG.old.1692192433499495 | 292 +++++++++++++++++ rust/hyperlane_db/LOG.old.1692193518543053 | 286 ++++++++++++++++ rust/hyperlane_db/LOG.old.1692194047418516 | 286 ++++++++++++++++ rust/hyperlane_db/LOG.old.1692194265436485 | 304 ++++++++++++++++++ rust/hyperlane_db/LOG.old.1692194380428441 | 286 ++++++++++++++++ rust/hyperlane_db/LOG.old.1692198883938429 | 286 ++++++++++++++++ rust/hyperlane_db/LOG.old.1692199165312346 | 286 ++++++++++++++++ rust/hyperlane_db/LOG.old.1692200969793725 | 304 ++++++++++++++++++ rust/hyperlane_db/LOG.old.1692201117982925 | 286 ++++++++++++++++ rust/hyperlane_db/LOG.old.1692201158741632 | 286 ++++++++++++++++ rust/hyperlane_db/LOG.old.1692201400366330 | 286 ++++++++++++++++ rust/hyperlane_db/LOG.old.1692201634076738 | 304 ++++++++++++++++++ rust/hyperlane_db/LOG.old.1692252384108942 | 286 ++++++++++++++++ rust/hyperlane_db/LOG.old.1692253121310466 | 283 ++++++++++++++++ rust/hyperlane_db/LOG.old.1692253194212630 | 290 +++++++++++++++++ rust/hyperlane_db/LOG.old.1692253295513730 | 286 ++++++++++++++++ rust/hyperlane_db/MANIFEST-000187 | Bin 0 -> 1230 bytes rust/hyperlane_db/OPTIONS-000184 | 198 ++++++++++++ rust/hyperlane_db/OPTIONS-000189 | 198 ++++++++++++ rust/validator_db_osmosistestnet/000004.log | 0 rust/validator_db_osmosistestnet/CURRENT | 1 + rust/validator_db_osmosistestnet/IDENTITY | 1 + rust/validator_db_osmosistestnet/LOCK | 0 rust/validator_db_osmosistestnet/LOG | 278 ++++++++++++++++ .../MANIFEST-000005 | Bin 0 -> 66 bytes .../OPTIONS-000007 | 198 ++++++++++++ 55 files changed, 11117 insertions(+), 34 deletions(-) create mode 100644 rust/hyperlane_db/000186.log create mode 100644 rust/hyperlane_db/000190.sst create mode 100644 rust/hyperlane_db/CURRENT create mode 100644 rust/hyperlane_db/IDENTITY create mode 100644 rust/hyperlane_db/LOCK create mode 100644 rust/hyperlane_db/LOG create mode 100644 rust/hyperlane_db/LOG.old.1692109095866656 create mode 100644 rust/hyperlane_db/LOG.old.1692109129283399 create mode 100644 rust/hyperlane_db/LOG.old.1692109142543801 create mode 100644 rust/hyperlane_db/LOG.old.1692109595356629 create mode 100644 rust/hyperlane_db/LOG.old.1692110322000479 create mode 100644 rust/hyperlane_db/LOG.old.1692110678116635 create mode 100644 rust/hyperlane_db/LOG.old.1692159212672457 create mode 100644 rust/hyperlane_db/LOG.old.1692159337379204 create mode 100644 rust/hyperlane_db/LOG.old.1692159630683428 create mode 100644 rust/hyperlane_db/LOG.old.1692160697660985 create mode 100644 rust/hyperlane_db/LOG.old.1692160774841732 create mode 100644 rust/hyperlane_db/LOG.old.1692167576188502 create mode 100644 rust/hyperlane_db/LOG.old.1692167598179047 create mode 100644 rust/hyperlane_db/LOG.old.1692168714159548 create mode 100644 rust/hyperlane_db/LOG.old.1692175657441236 create mode 100644 rust/hyperlane_db/LOG.old.1692176419380884 create mode 100644 rust/hyperlane_db/LOG.old.1692189150768832 create mode 100644 rust/hyperlane_db/LOG.old.1692189358189015 create mode 100644 rust/hyperlane_db/LOG.old.1692192433499495 create mode 100644 rust/hyperlane_db/LOG.old.1692193518543053 create mode 100644 rust/hyperlane_db/LOG.old.1692194047418516 create mode 100644 rust/hyperlane_db/LOG.old.1692194265436485 create mode 100644 rust/hyperlane_db/LOG.old.1692194380428441 create mode 100644 rust/hyperlane_db/LOG.old.1692198883938429 create mode 100644 rust/hyperlane_db/LOG.old.1692199165312346 create mode 100644 rust/hyperlane_db/LOG.old.1692200969793725 create mode 100644 rust/hyperlane_db/LOG.old.1692201117982925 create mode 100644 rust/hyperlane_db/LOG.old.1692201158741632 create mode 100644 rust/hyperlane_db/LOG.old.1692201400366330 create mode 100644 rust/hyperlane_db/LOG.old.1692201634076738 create mode 100644 rust/hyperlane_db/LOG.old.1692252384108942 create mode 100644 rust/hyperlane_db/LOG.old.1692253121310466 create mode 100644 rust/hyperlane_db/LOG.old.1692253194212630 create mode 100644 rust/hyperlane_db/LOG.old.1692253295513730 create mode 100644 rust/hyperlane_db/MANIFEST-000187 create mode 100644 rust/hyperlane_db/OPTIONS-000184 create mode 100644 rust/hyperlane_db/OPTIONS-000189 create mode 100644 rust/validator_db_osmosistestnet/000004.log create mode 100644 rust/validator_db_osmosistestnet/CURRENT create mode 100644 rust/validator_db_osmosistestnet/IDENTITY create mode 100644 rust/validator_db_osmosistestnet/LOCK create mode 100644 rust/validator_db_osmosistestnet/LOG create mode 100644 rust/validator_db_osmosistestnet/MANIFEST-000005 create mode 100644 rust/validator_db_osmosistestnet/OPTIONS-000007 diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index 940c94760f..23226a6eec 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -115,7 +115,7 @@ impl WasmProvider for WasmGrpcProvider { let mut client = WasmQueryClient::connect(self.get_conn_url()?).await?; let mut request = tonic::Request::new(QuerySmartContractStateRequest { - address: self.signer.address(), + address: self.get_contract_addr()?, query_data: serde_json::to_string(&payload)?.as_bytes().to_vec(), }); diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index b034203db8..c8e6672f6c 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -112,39 +112,41 @@ impl WasmIndexer for CosmosWasmIndexer { .collect(); let mut result: Vec<(T, LogMeta)> = vec![]; - let tx_results = block_result.txs_results.unwrap(); - let addr = self.get_contract_addr()?; - - for (idx, tx) in tx_results.iter().enumerate() { - let tx_hash = tx_hash[idx]; - let mut available = false; - - let mut parse_result: Vec<(T, LogMeta)> = vec![]; - - for (log_idx, event) in tx.events.clone().iter().enumerate() { - if event.kind.as_str().starts_with(Self::WASM_TYPE) - && event.attributes[0].value == addr - { - available = true; - } else if event.kind.as_str() != self.event_type { - continue; + let tx_results = block_result.txs_results; + if let Some(tx_results) = tx_results { + let addr = self.get_contract_addr()?; + + for (idx, tx) in tx_results.iter().enumerate() { + let tx_hash = tx_hash[idx]; + let mut available = false; + + let mut parse_result: Vec<(T, LogMeta)> = vec![]; + + for (log_idx, event) in tx.events.clone().iter().enumerate() { + if event.kind.as_str().starts_with(Self::WASM_TYPE) + && event.attributes[0].value == addr + { + available = true; + } else if event.kind.as_str() != self.event_type { + continue; + } + + let msg = parser(event.attributes.clone()); + let meta = LogMeta { + address: bech32_decode(addr.clone()), + block_number: block_number as u64, + block_hash: H256::from_slice(block.block_id.hash.as_bytes()), + transaction_id: H512::from_slice(tx_hash.clone().as_bytes()), + transaction_index: idx as u64, + log_index: U256::from(log_idx), + }; + + parse_result.push((msg, meta)); } - let msg = parser(event.attributes.clone()); - let meta = LogMeta { - address: bech32_decode(addr.clone()), - block_number: block_number as u64, - block_hash: H256::from_slice(block.block_id.hash.as_bytes()), - transaction_id: H512::from_slice(tx_hash.clone().as_bytes()), - transaction_index: idx as u64, - log_index: U256::from(log_idx), - }; - - parse_result.push((msg, meta)); - } - - if available { - result.extend(parse_result); + if available { + result.extend(parse_result); + } } } diff --git a/rust/chains/hyperlane-cosmos/src/trait_builder.rs b/rust/chains/hyperlane-cosmos/src/trait_builder.rs index 133c8c450c..e0dc374993 100644 --- a/rust/chains/hyperlane-cosmos/src/trait_builder.rs +++ b/rust/chains/hyperlane-cosmos/src/trait_builder.rs @@ -15,7 +15,6 @@ pub struct ConnectionConf { /// Raw Cosmos connection configuration used for better deserialization errors. #[derive(Debug, serde::Deserialize)] -#[serde(rename_all = "camelCase")] pub struct RawConnectionConf { /// A single url to connect to rpc rpc_url: Option, diff --git a/rust/hyperlane-base/src/settings/signers.rs b/rust/hyperlane-base/src/settings/signers.rs index e77e869ee3..030a0ee96b 100644 --- a/rust/hyperlane-base/src/settings/signers.rs +++ b/rust/hyperlane-base/src/settings/signers.rs @@ -43,6 +43,68 @@ pub enum SignerConf { Node, } +/// Raw signer types +#[derive(Debug, Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct RawSignerConf { + #[serde(rename = "type")] + signer_type: Option, + key: Option, + id: Option, + region: Option, + prefix: Option, +} + +impl FromRawConf<'_, RawSignerConf> for SignerConf { + fn from_config_filtered( + raw: RawSignerConf, + cwp: &ConfigPath, + _filter: (), + ) -> ConfigResult { + let key_path = || cwp + "key"; + let region_path = || cwp + "region"; + match raw.signer_type.as_deref() { + Some("hexKey") => Ok(Self::HexKey { + key: raw + .key + .ok_or_else(|| eyre!("Missing `key` for HexKey signer")) + .into_config_result(key_path)? + .parse() + .into_config_result(key_path)?, + }), + Some("aws") => Ok(Self::Aws { + id: raw + .id + .ok_or_else(|| eyre!("Missing `id` for Aws signer")) + .into_config_result(|| cwp + "id")?, + region: raw + .region + .ok_or_else(|| eyre!("Missing `region` for Aws signer")) + .into_config_result(region_path)? + .parse() + .into_config_result(region_path)?, + }), + Some("cosmosKey") => Ok(Self::CosmosKey { + key: raw + .key + .ok_or_else(|| eyre!("Missing `key` for CosmosKey signer")) + .into_config_result(key_path)? + .parse() + .into_config_result(key_path)?, + prefix: raw + .prefix + .ok_or_else(|| eyre!("Missing `prefix` for CosmosKey signer")) + .into_config_result(key_path)?, + }), + Some(t) => Err(eyre!("Unknown signer type `{t}`")).into_config_result(|| cwp + "type"), + None if raw.key.is_some() => Ok(Self::HexKey { + key: raw.key.unwrap().parse().into_config_result(key_path)?, + }), + None => Ok(Self::Node), + } + } +} + impl SignerConf { /// Try to convert the ethereum signer to a local wallet #[instrument(err)] diff --git a/rust/hyperlane-core/src/traits/cursor.rs b/rust/hyperlane-core/src/traits/cursor.rs index 68d2c8b7d4..4deb063fde 100644 --- a/rust/hyperlane-core/src/traits/cursor.rs +++ b/rust/hyperlane-core/src/traits/cursor.rs @@ -1,4 +1,4 @@ -use std::{ops::RangeInclusive, time::Duration}; +use std::{fmt, ops::RangeInclusive, time::Duration}; use async_trait::async_trait; use auto_impl::auto_impl; @@ -27,3 +27,12 @@ pub enum CursorAction { /// Direct the contract_sync task to sleep for a duration Sleep(Duration), } + +impl fmt::Debug for CursorAction { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + CursorAction::Query(range) => write!(f, "Query({:?})", range), + CursorAction::Sleep(duration) => write!(f, "Sleep({:?})", duration), + } + } +} diff --git a/rust/hyperlane_db/000186.log b/rust/hyperlane_db/000186.log new file mode 100644 index 0000000000000000000000000000000000000000..979c4402688368aecda288e64edb7401e5646f22 GIT binary patch literal 535596 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

2*qnP1v7746S23CgG^aC;gD*_HeV+9OMy!>;G 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%0A4Huk60&5Ec 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�U2ql&w`jT>rF>4}UJ%p`2T41+ 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 E2m8yWSO5S3 literal 0 HcmV?d00001 diff --git a/rust/hyperlane_db/000190.sst b/rust/hyperlane_db/000190.sst new file mode 100644 index 0000000000000000000000000000000000000000..4079f5c1180d83d1b18fab1d9cc7360d0f9abb93 GIT binary patch literal 2005267 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

px19t1z>!*T0_$q(|rY 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%0AGssJ@ZW=oDs9D#-SUFE-FhqMg!j-U;*DjR1 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ℑerFa8A~mu!%A*{f$X)pj1{u{zkYPnx%S{-4iQpt}L0}%Se+&QR531F5F5G^g zQ)TpsR}`xh-8b<`Ss63#=@2&vY!wHjBw#7dmyu34}2W{6f>g zpM4aww_T7m6RtxDJGQbg*0P|V4epL`7bV{`zDR8FitMtE(nhwdG;8_VMr3pv^CbW3 z90oP%*?J{E-qsgxd+d4-+g!J9@hkb1RlN>1?oPZ(qh7`fIOj`awyUY0e+-3P#MoZR zee#R_Bo}Xp%;o#?p8qMvpVaB5y^r27X)(NddeMB`dfLZ_ZAI0Iae}rcKypMilP)WD z&AfiSs<1T>JP~5}dOAj;rbQIC{0O^!VJbOgHoDpecEQRG!{4*%QXCF)vR8H@B@if9 z{NsWtTV~CIJH8V{LvMIONKaK5?;}aR&}s`Taoh(>o5|58xd72I;5df$ubdSxE_nyD z$>6l+v4pn3$*enZ)99wPlzPFPe`bVIJa zM)AvJ&}7u(Wxh`&-N$C|aVYN`sW1-(+vGXe&HC@&DJN1k5`Y-Xt>`&cctA)p03iWa zIoZpg!{nzFB_1;`?H>zX{}$r-5OQ1BCc3hb_^7kwBWaSq(6%RdVK5_ED3>0-49mTu z$Y1S`o1?sWt)*`tvEbSy49$brtCRk-fyFiZV4D#H!59*!2CdsOlvX*g5Lu z7bBk=)9%}$Fpy#)C|il)+<+%>V0iK?pTj?|ZwjJ0y&gb{6YT5kB90NsGysM!sF<)^ zD_yot=jDiUuK>qa&MFT}>R(ASlccPhNjy#LG!l8Uvj9%P=e5W;ujf(^l_X@Pm;Zj} zzB53&YPEP6gg@aa+#+MD;r16%o5Q>x0igc736=fm=El60xkKY_EUT(mg({!ozwYxp zWA>&B|L$?j_K(Vd&M)y^;4`6WB0zKT4kL`VslYw0gcVpxmFtp-5lLO;rH1BlJ1nm$ z0>!({3{V62RNf)$1JK&h>dY`ro6$%#a>h0j*?)A@eiMGx_cLmd`%44fC$MP+;{*6 z#r`^H7ZcxPNgobY%Qe*OYFeKQm}d?MIas)E#_2PyuY0{B9)vI*aTviFn@hR4hYx#{$kcY%M||U3LA-J#IO9*azj3kr zBxOIOdaNn}(+~UuAi^@gptu52%X7tz{J2jhs{F}~E{}#MGOlxIUodwPab>dzOCzEK zTsi=Re_oHPxj0g^UW$g)G)j%<7G)vlOuN3$TVgSJGaoy&LotR3nQ)&ZSjfydFQr-k za|=aFeKR5WSV`mkK9zb{Sscp1^<$jJDqv0vf^2zyGnM_`TER>ueo?+#`4gl5v%9wr z%d*FPumWz}HHG=EEy0KWl&U?l4rF+D^h|Xsks?CUbDG!ExcjlQ{(_QVLK_D z0r96W7}u?1)Kt<+Qa$y<<`2OnZcy6q{8d3*A&Pa7jUIcFn7}RTpl`KpvjRiLMod0I z`BVBV`3P_IlI78kNAo!yCy*q=G>-6c^@pChqor^819nxR^N&6z$(7cT{va8e%|SgY z?)tU>_+aCYG}U9y#IOW;`PCT{iD->1v|E%RgZ3b54|}g3_=znA>i?Yh=9Zf zIEh)J!JN}ZWu9j~%W;@_fG@uNojHDl%LT72O9j0O_r37S9M2eQ-1h3;N+>D-EA^{YD>kbgkl<)UF~`cxBV zVsUbfI_MYEGr&X+!V4%F=voPu4XAF)Eof@2ew{TfH2lLkW-}u*5jD}mA4H)5iX*1c zkAlfouxa!_K#0*aOpEzYBHcdVj{l)A{x@apip!z6H^9tw)2EdUK|yK+Q@~&-S30kSxK`v`W(>L9XnifX((1Oyvy*Rf6Ua08dalFA zuqF~_II_K6{B6L1?vr_eSu2{}Ml11-ius%g*4i0hH z@z(2XrU#v9(kVI|1wnhi!d){VkKrK&*yF-9gBiiZ3T{q9_XuBW9y*{b-IPg}r0f<% zVvta*bA&$WG{4ISPwA16&EX|H@Zll6=L?@FHv8iZi1D?^o5sadsm(jfp5|{jPI&$t zO927`FlY*P7tz-Py}W(g2!{ULzg722E;x&R>!{HPCpTaeweh z9fKUlo$i8as>ZG6lna9>0kBsQHNkjDP&W*j{adqD=)lrD;6khZ|7w$-k*qxYoxjKB znAw>|z=$Ry#3lY?HA$(Dueq47f|rHY6*5Eo1c-4{Ah-UjO-)0eIM_H%H9g0E)50lz zzd46M^d|;0$Aj6QsYwRd6fns4xPhB5egDZAvAcPpN2qflz$17&Yw+cr!d@7|JAK2O}5I6SGsnvTrlfHaV z)l%@xsE5TGx70 z41L3H{2+Nv^m~K_Y(v{s&!QtsW+Iqf{oA{z^Aw8ZbP(<9Rs^UI9^Xz{DI|4!6}qfS z%qu{-V9p2g?r`^m7%m0w2h=)^hVpWJXp&!d8Xig*Gs+(zy@2pa_SIqg!Hyz@IcAmi;V8e668eo)R<_b*ZwQg{UqKlbUwb=# zpp{yvvN;`BeC$|F@0N|cZn*t(gjnhG)UMVf5~4gA(VQ5$*`p3onRkj~j=6Vq-PU3# zdl9R#kvbEK<0^{4Hh!YL!TgPley`}OR>F${HZkm>CT63ftcA#!8HJZz%@-~k>|%vQ zEGv8tiPu+c9-u0Tbxay9|LT_OW|M2w57=T3B>7rGW_&?dv;bH$Oza6+O*8RWYeVGG_L`07^!cc?5TpMIxl`#{ViP62D{Oom#!smd# zJ=XS9zsW+cL|8x(j4RL%LJuFxur{N7wh6#2B&80vdV#Mqqc-{RE@kqeB{SV3^5sv> zf%}A$HLp0K(Vyy84ft7eW)mOK(;amil_WWMxKWDn zRfjoPKNP<09U1UvV8HO7G?}hM+KWq$y?vKR2D$R{OnKcLs!r%oq*u@b@jRQL9z>c9 z?^v+3aF;k}lB){Py%Am5s%;V4rT;Cz*pPH|yk6sxbQ3hew)T-RVK0Mw?^VP#uKvlH z`)~JnRn1z6vO>*eRh%tAzR0!ve6`!ntq_gR<*e@a|4b%Jgf0-7Jl4a~-AD}EdPn_z;?9v$ zuM2vLZ*8!@w7oe52Je{nMUGFunCzFO^_4HgyL)&zdpj`#bL+afb@~C% zyUVNtTpOidu26ZC(WqX#DF{xG&YeOtykn7D(R15EBBVjn=b&apc+?t{5GGXUU3x{L z^HV0K#QUXGH#-U?^>X#Kl>=}IiA!xr!u^XtVz7j)xCGU_M{4;~NlRAf$%x<5lP=#! z*Sgc8MA!A+GlZcJRi%J8oR@jbfsbJT^rlI%p^uj1ii~EMH+iI39x};T{=}5}u(0Bg z>l=JR&tDN>aPezln3C?rHax>&pe`)dGp&J^b4p_Vw!>DsaU^Tc8P(b8I1;g{fcrZhXq>x2o??saDBHSa(}sc&zE#1vF_fVoy-VoY3Yeo$a9 zC{djW{<<$k00Y_K4Zp+?(vU&si1lE;VbE5>PEf0+X4q9PG3s=cr308-32|)8>9#>2BP5&CcDy_+U%!N z*EILSmU*GYj{A1kb!2x4p|Ue_RMA;{_@H+BA7y~DS7Rf0-eF>T@sCJm57j%f%l+&o zj~v`P{8kZPD-IGYgbXgUI!dWfqS9%;Fo*P&?fv-nPBOum1x&f>YwFZA`7d~hKEXZM zzxa(UbDW=OL}hCEx6qgzJPzL*_*SWoqKgWRB)?7Yd~FZ;|4wHCrbc@?_j^>iriX;8 zA7UzG=Paw5CX;oV56H6>2I7ma3<01LkymS&!zd%*x=ml{VbTl6VFv({+fJ=H!`rnFf`C)Uh~zMU-8eiCV3?B zp!e}i?{0tE}K+aL` zO6zvL*Y^hPIYl=*1@Zl;S~alA1CD;~Og)MUIe#_OiqcWP(&AV9?qMgLUyo|rp4LOw zdLGG(BM0O%H5BLpBUX2lpa%(WxN=r@Pj*dUb$QpRJU%ycwvkiMyc?7{hkkx%l`u9un7_i_^o~FZ*NaGN|T+o zgvO1spYP%n`$@DLvbc9SXJsMPYb>N(D z+cen|hj2*9i>6(sa)hdK;_Mhz`MJZxbrj$vubNI!v!N2fq>xc(W6Up?Ro{7n&m1iF zGEa9UMPR`r{+4v$LBD&G(9zR@7<4jYS43`)hXQ+b3eM@eju2u-RJzCZ_(db4^~^a@ znPxg+xwq4klg$%z5ukug#YD)xEdNgThV_kD%>XO2sDxN!-yaZXR;Fb?xdx!w4u8Wh zi)A?|#}*nJ-hG*$ym`Z8O}AM_W~t<=dQ<1}Mwk&e6gcEz4&;)7wFUKhQf_dG9#ODb z%-FV|ZN)!U_M+K*dk-v%?c2XE0W2Nv;a+8zL^jv7h!8%*;w_%N{G3x?6#BUOkmw|hA(rm_M2iE{!2zh!giPY#2sXD&uQOs{4}xpZhcyf zm^Kb>p(w*1NapLyF9iE>(#RIiON`Dtm+kj5QDfM~cSbs&@O+}TlFXUg_j|!2i*>2$ z3Ao4LqQ7gs>uGQFagMk8{m-AjcRmVcM-~R{i!_sn8Q2)cX9Lfz4=)*uDwRyo+`LX!TuJ`Z6x>uWCb%%cO^T9Q_>HE%wG&&^pyhW|J5P=SG zuPw1aRn`H*)t^CR$xhFi|H3&;njw(rKEXX_rf$r4FTwpS9FsTV;OgcdCWJ$JV}xSl z{}Ha%&9~dj`3LUnds=?^U~QrH(2kXM8RNx%mC#!D%^I!$L%7;Q7P(Cz&k#5>Db$a_o45w^;mr?emefHS1PMzE@kfT?{D>${b_W%v zir68@BNjEh8}cu1R48=D(Mzdsv4>Lq0%Zy!%L|2of*h945aA^iyIPc}ChzYApZ*$u z$~+ZR%}!QoAAO2kN5$z5A!s433yvt6J=j55Y708-nd)cf3pQIYMeIldpqd7TwW?oro(SpUm zU-T<+%n|3a%jh!KJh=66PsZL}tYc0X_gzTjeUyeGWB$%tN;4eO7H^2Xwl5Vc32?m^ zJ)J>V$pYq&Ig~}xb5wC?*QXl^zPV=Uvq@1U;W#1j%e3#fWI_Q)7hF=@Rr|z< zdOFR=Mw0#Jz4arY+cJ%(+|`&V+N|Z*9=OejuATtP+E{h7YL13d7M}0K)d3?Pox8=H zaz{v?B=lb%CxL?aA0=ck#06Ksg(gc;n$2@@1o>QdF~5SEE3oT8b9cf#JiN3*f_Exx zZd?yRU{E$@E6Uv|)n|VtUC(`>Zgcdtb3&j}(Q-J`ZOTtJnCJ*$7YKw#d#QNe%hO>= zz{Dz%4=m!%Dq@eh^=OvfXWGKzk;M`)J~&m()37@kqt@~~JM9|fgW!$Z!H$8y(>Cbz zeEY0!qy}l4!T>9{`>}p~H59rY=-EXmEQ(h@5yTNs2ulQ%SX^8yBSqAIrqC^|fuim^Lg;=OcKk|R9 zYRbKQ_1)K%ROaRj5E|e>1Ftd=&V)@;&0mNg`n~107% zKn8^gNZVSM2w3zC1%VFR{h(7tZisZ|DHa)5;>sg1XfwmAQMpR71lqkT;5zAG9sl6)>?g;uUS&iPKko4}V^_>so+o;?>Kcd$M z(2YpjuOLWji0l*5y$3O*`_=n>C|(@h^L?87J5teWs9bjlX6)rVg6aw$G2GP!LkgbA zik{GsIvyO&$~z7gol(iFDFyzVq`W9T#PuQ&-WKntWZ~f8{}C^TwX#P!O&q$Gs{49t z9`#jBh?}i4)vatjIjDFPO+4Q?B|)Zt(e$0_QyDfOt}rVbY}lZv_p!cDY2sECsrD@@ zL7j}yC=5X6pU}HLL4VNV>-jrS3-sw5 z5;`ltW+t#s5X4~g#6J^U8Tutr|Aq9Cf<9U^Ts&Bn#m~bLp2itJdp+Oc3W*%n5O*m0 zd@1ejCA0|7eGr@MVdd{-28f$OTU2mQ9VP7hJ6}Q_%uVwfBFIQlRQiV|iMyt>T!``) zemUUv8n_&Opzb2LFX~g3rp+bI&Vw438<-l1QCnna{+>EwdyL7h6b*c>XKfs;ps)L>S}yQQUIVy&*3w zPUJxJfLGWXe~1#0G+5yR>`VL}rkU}pS6{eaO5@ZX^m%UG@!ElO-p8V5qKdF0O}e-gbX#(7!h`MCPcg4rQ}S`hSff( z++=+Nz-ai_Ic2MUeFtFxAtq(9Qtoi8hsempq)mZFTWJf$tz#i~-`jcQZmYpy7MLz> z#r@7>zG^-Qrt1k=iLQg^ghdal`AWTCe32H#41#-GEDx<#)xX$4?*4rEqY69G#-9g* zCrb7WOw+(*L2O-G4$btlxDQor@7{?0aq0@8Hd@U`R{Xx#Xw6zH2xle0*xNwN0KB2U zo6Qb+7-`zGNfkK}DutYa^sj?c(1{y+jIRoRi?gUrk3o1xCe&aisI%OuMr)-fgU_$m zR{Y}WOS+j>b_&Y^o%tB8?}!vQ5s0e0SD?9{qBZTcm1ojvH?$VnB|a9t%zrHA*rokC{FT=Gre2?$a-)`}0mDdf_QvSUAv7>3TGcQg;GF9>UybkA&O9~i} zbBi2JCxyONXI zVx3RX*E;v1^VMh~;q%WbJ~?|>jNNHRD4cDM${3a5 zhQWMxX_?^csCmh4fy`T|z(vE^&Hcln-^Cj}`fiX$^RD;xqDzFy*6ld1lxLG_{c5cl z1U?awL9JkTi@>qHAGukcU5A6j&tJ6TnikydPU5StpN=;dyz7>_c!swJVGx5r5arj# zrz31nrWe9@m5|&Am*>=3GB*p-36Ayn8&6)WKPv^l0G714?jNsF5|d>mvgn+5NSH(n z*QVXXDJoAie0%E(ODh(mG!~-W1_%`gQYX7z61?>eh0&C~Iy-5P9vB^(O=(MJscR7P z+&TlNhG1=m{Xv0cm9_MPbp^B%^OjH=Z~eyA^IMa$WOW$-(5wN-yP5 z{dHOefdDqbMn2?vK9mtxk_`Rn`f1sStKEtuGR3`u!M))6ZxGbeExIoilwc|ZzHrri z7Y)|pg+!SkY@CTUsaIUM?KgFgjLeOPfvcRE--;jSmDgUoCan@O@)kmL^DkTiYy|1$50U+#qBI>6_|&Bu>GCOrd77mkQM{8SwH$FST>-?Z%UJX%>;-1rLQHm7$8rbUN}Ij3Q)T zH3A(U=K7^3k4$qNJF;eOo@m)m+(3BAdy)1mI+M$tZ+^K~Y4Rg$vbxRFjJQRFnh5C8 zVNl-(B#zDvBYa{be5iI3Ywk0lH{)w&*O+#-%^XFlclB?Ckc?c4_Vle{b$E{8`h@?I)oAdM#r!YDS*o@8#BYH) z6AgjiMhg83Qo*|+JbNBh3u=0d4o|nAn_m`Z{|slr2pfOWDx1Dm5mg1ByEk=-$HGY^ z9ZU2jl!_TfX|07OwD`SzKw3qK1ixm;h?E8dHCvhVg46U@i`ogK@kQ?Za&t;wQ8-jd z$k~!B31XxAK{0U&qrm8of5Rxx208Y+8F#QOb+A0>(2(OE-uL^e5~zLhU6%esPTMLX zh$0XTRrv1rxQgaCZB~}X$CiB*?FzZUVa>U|Q#PA^BOhHzoRy@+J-7T!Nk z6_2Wx_IcB4ezY{&;7I^Y7*oay-7VLb=`tMa_)H3l;HlvD1`F_T$PEN0sRoj@`Olqn z&&tbq9LuV2RMdvI7kMRQR=7cFo)Y}Ke#~RaR~&SCwY}FKdU}=gt;gMia{ctQ;q}%9ttp_+#qJ#AVHR%WFRJK@&S`Nffe=^}v9(ey?p< zB4TYyPn!?$~#!gnu}C-6gLy zu$#s`s(*!cs?w>LHWLW8!>5IQVrKQAM;qCFAS@x9b#ha#Trh2T(QdP4egLs0drS#z z9iG{5=(FMY*V5cYnWVNKuA6fjY-SWC!3^Ho{@v}co)`nd5@MG*LNgKg%uV5FH`{N@ zeK_4}HzwTfD4g4s%MOewd#L;#bY)VQ0uKnEZ$Qv6%<)G1WhbN1qbKnfSMXMm2;wQvEabOvitZrolX0Bz|G{8&6y_o*_!?Z zB?9;MTC%94Ksb##4V6`OdNd{RFo=w#OZ3szag>|HqBcxt9%ZJc#!q#GFSo%Q!;=QO z;MwAj4SA?$4&#$-{?44(FPt%@zJ{)v_zlairOv=AI3A2u9wMA{_We&?KDoS7Ap z{~d&nKT3Zft%T)K8wH_B!UrzKM14w+#7xkBX zURN6Ua*@mb!o(t^xYDS)?C@wd+KWOZ5^kTYP$<8SHs=*TzORSrqXICodni%ho~rJ- zOY7<3XP&^&y{99TO;mA+s@#dnHZb#CS|%RkMX#h`hDu+@m749^x26% z7!*3PfWeLb8YJT=Q$pv^s`!`Y0^U!;O4Sk%h<@eiJ zTP|@d&mQC7`e^vMY^5TPotB|Su!x2rJYL2?=qYJg<&yG8eA<2#`2byFk7r*tHqK{b zvtQ^6_l4j1Ntp|{*z}oids1qZyLInL|57N@5g?c>MX;6lHKQ{zLS$a=|_X*2` z)(Sk$qkV4@Wg0<;WK~75#wcJw@S1xfWyV3*i0&+bQ^f4U#g+J1Cyh?Py+KDOtVLBd zSDBbv&-b&ky_nx!d!$Mgg#zLDr=XJtDCH!`(j-u}B)uJ#ruId&I9~pO5agyzeSt@B zdv6zufi>v<$d!NVS0Tidz^F-Y0Iytn~}{eS|_y9t4QHlEElFus)1Bjd{nzH`$oMK~PoUawl{o^{c8TObZjA%X*pi z?8vO$6hQtR0Sa#mk|%l8uUMkh%KIu~-X0b42ANB^nGCa4?il7)_Avqg^AI)o5bFA| zIK%&rQWQhsq&7o^UY7}`5ZT=fazbs_es7%m?Mp`mI+Re3;oSV9el(}Dcv{W3oadIl z)a>VSHv~0rYPywT0cQ?cZLro@`m;Rr#P5;@Y&cK%iTB%{yzp$8pE)pCRd@0aVaLbZ zxGc(mAfg9JrjNSjqWPrLq;hQml_nqc7`?$7{%!fD@y>OYO7I)qP^{dbUazuo72;i< zO9{246nJVjR(q6jyVldy)`rclTrYvSW_V#0R?!(9I^@PPwwb#Z$7kvLap5TJHEtk2 z{vvMxpNbziQ21ghFi8{*bmx<=o^D)WJPvW^yT7eSuk(#%72~a^i~Bp8Svcafe>|Eh(DcW;rgY2_1!JO zDa|OB?5g0hKLX5;gUH%!URA*(1j{D>IBtXgv^4Z?ZN*qxS6|;ySIlvwR`2w_!j{HI z$Ain$UP5-QW%A?P?h;boGRy84Q{6MH$|z@}XB@(;bw}z!|8SUyNFo4i0^T+^2DHI| zWjJzHqpdU6Zi~t@fS!wER8pfP^8@?+$0amLTA)b;GF;&Bi!EvF{Fj{LLc+)~ID=D^ z3ig_6QTFaUpuc|Q@zt6Du(!af+I4XEnwmNLJ>HiU&yBLwA|@>iq-0(#`~Ci0u2D@t z#CQwq>>0c;op|`&^hjw!lF2{ebp0s~?z^}yBk^x2@kzzBTsWb5V5;e&<;H~p!#uv< zkD7Z;OJC`M9UZ`bpM5loLST&TG@d1ffQvU5kv9PFeJ#x@&&nC%wIQ@yrd@gS zSqptr#Li<(Gnv@oMcYA(zhdGBi}dhvp{YQSfDxnQPQA=8$I=h%PIxawm#1~sl)>)I zBM)R4$99hem*F~c$8w~r2!Tx_{&a5@AN7+0^vKgRXs*^-5SS8y!{i1Bu=50#dH5(g zwReH-A;$ELF>U%sKAVqT?J~_T5iE_M=V62#Uc4x8z`+0>Fauq^ru3Bl>&s=2wVPO; zwNzfL8wD>Qv-8ISi4N$qIba72T)~=v)?&rQ7K^NrqJ0uU!w|tzSgayP>o&H!)ms8I0hkf}m;ucHp1# ziu%TD!kZR^=>oTh_Z7reKrp(H+ki0@XwMWPtf(ig-gmEM zHLJxDsJ*_QmQgZ*E!OOM@Zbc@AO0U9K*$i3!H{cMenX!~UC)l)Q{+magVna~_A=$- zqeIz_EBEgLmx>5@5J4EK2L95GLk|r}-xkz|SoU3>dJYk`q1fD%iiddYpM53xoR}}K z7XSjeC^qy|-I{{fy_2pJYE=seKOQ1FaKZjeHrw&$RcI#2OcAt2I2;5x>3`rLW9pvI z?>``wRxEv{UDo|&nP;`^&bN$amhPq2yB+!pQR~53XXZx8Fwz->e;U!%~=hC}@+jH=}M@SUl6@Lqi!Dg%eA;Mc0@>xojt4gq+X?QYji(Z$w zhGV^x(JH3ml4 zT^c9BJj8giCyPrje)?FnS|%Z5iCW00_1XG|^1&x$8@^a9-BeZx{J@*8N{L1hI|16J zu*PI2tFqddk~N7^Xvxldn$?ol_}8(%?AJ_g3)S?I^LhBv>jCaJM$US@riBpNd@EgN z2b!?IE^Z=@rP;6N7N?LO%xtrj+nR3u2P`GL$r!fOvx<1d(|>(3<9kKFZE*{muUcGc zRlzDgQC+frYXDLzg}=WNi}4j;KJa=9xWecIRA}Bb`h2q}z1okX${*Laaf^f#xTpmO zMn8*hV?9|{+Xt7&6Ewj9iwj!HA)=GUO=Kio-x>1zs^MUD6kf)>!??x^uF$&FhkBrh z3POYB$o6CJt>2u7QPHs@2OsCEJ*Q0`3OSRCj7rnrZG2SwXZE8kT89Vaq*MSrLKL-RPhY8ldJmB&HDJY#YtXN}U#_@RSu>Ph%LGpn?KdlQCx;%VUpM*Bz< zBL})1wyRO{v)DPwN7%|)A`ClI;uIg|VWRKwns>WTG~d3cTmVDEmT2*ztI*7L6u^BYYibN&E6OxGFVXb@x-jJl=y_}7+1E8XY+V8 zGgDn;JLDMZ0th0Mgz{s|!+W~Uq+-^w4LFhx2hSeY%DLsHHRt#VtPyHt zssbaSwSuMwqV5|k89?#j99@sRF-aHfw&mnRv{P?F(%R5HGnv&+ zK1i4dw-0#O^aGTVpC8(xCr8$_mL8O2?kUej6a@b?CQuiK%YwslLksjx8e z@3<95P_m4Vq31&0&hIjRZME+Tnu3HKP;FtK6p_r3O)Frs=Jv`ecp;jwJN-(QqT8#% zNj4_@x-{P*_mL3XtYq*=7dW~IFkewAEOO5;n~)62RbO2Rq<$opIdLNM1cG(~o9RSU z?#C*`4;aqUmg=Lg$!e&KW`$3=Bss;rhw_#&&7NKp6a)pAWwh2=jVlEI1g(G7AT}}s(#sP_e3>UCIXpO`Y}1k7m8oa}}_ z5vE~y0BR6$2EeTFhFtCYNGxN1lEobxh^CDkB6+WADAuYQXV3^PrC0bXpGiWvK;#Lf zHEp$e33PL?oI5*W&AYXmCAXfq-NW*47FBy5R|}+}5bIN?E?QQvcFK~k-BF(JE5c9a zrZc8^cNgWM^x`Rw=Gc>H3c8Y6te$K$_^Z~JB)OTd+vc zUS2j{+hW;O{pqeJ9_j25=WH;6Z~yIB}^WgPp(sS?2qd zZ!0Ll3y@iFtxREvkg{ei2f5po(+k;<4(&UT7fVRNSj;hR&22`DpB1+^Z?GQB$YsCZ z3VNQ72tYlBqt1-}#%$L=pG|E%^<^<~Nh+yaIW#$|JV$n@&lYp5zAvo_&X+KDeu#%s|xUqTB^t5YWU8K~buv>+q3pV}$6xdcoOg%N5c( z`EX({@;%v1=;ax~dLY~p`_1Xm%ji#uzNDvwRwS!FUwWDyq9`kfRc@Cr0a67700>fr z2#|xE%(>wjui^a8sAXJ6_M5@zPhYl`oLJh#5v{^=QS*W;TjM$J~3}V+YyK;+p6OQLT3hA959M z1m`6yO3BaL0Ih)wDzwRC2#mu(enD`?VSVa_T75lNj!18&en^F*#5LaiI+oRp1BUT% z&4+eG{|b(P5pdy3FyV7O(bRY6Z~NrGP@B{_sY)R;7IvRs3WXvB1P3_Jjv@Q$YiI1h zRiVj+nuu729jK%1v52)Koe8Cv9904~ctAwb2s7Y|4%W5%-EXypUBvl(+$?-nMy>XD zt-q=1{&MzE)x2A5)pJQ{hNW;^ZP!sg#Fx`AeOel?J|(_Mee8j>WmRF{g~4rT=oxg$ zyOHxTeYJFr9IxVWvphe8jnj?_pLiK{u{nvw?-iU8jLX*tj8-cpT)FhxhC4TAA=4*R zXEyv0gcEEG*mX)#(D*Z1zc}w$OhGZIj1-(Mb3lq z(0>vQ9t^0Z^f?PAWz!_4gWePp(s6Jq z%xAs!&JAPrW6}yLp0nh}y+k1LF~vQ7QZJ2DtUzu?wZ_nuE;k;=1W^gr&1# zTW3;}Kg}hJ0<#gZn6MN|h$1I{5~Gu`l>Lq4kL}J`M{OLb$I^0r?=Ad9KIM~HZJ0u? zn?fr;Gh5l1w|3@G?~HwceCAUd&{B84_92P>7n+Q!YZy4uek}5SENFd*?dpEO*Tkk0 z8bO}8lg?oWN|%08D9e+mERJ9T@E27Md`8O~ z!SwqyVcY!tL0#ot&oUE@pY}-PcH#uDw8ONx(5^JL>t(=(h7s!-;Pn7(`6Gf(FrLJe ze|AuV%S5SE{Zmq~EdBQ+?oH`mF$zx0xVBe-B+uW3IanC{GXZ_Z3yomqEE(q7)9(tE z`nbEew8>`JU528y>mU?;Pf&so-WdWsgb)b`bW=y<%W^m7*QKw4Rl9}6sUIb~ZJX!n zz4UPTDtFv`E?oreTQT4w5Wj3IV9x;^Rmn#=lwsUyhTyuTX}NocNpIxKdyh5Ef}s#1 z4FrPiH;Wg}>wx~{w@j47|0`_EQ16w23wka41bjVhDbJ=1A41>LuCtEZW5XDyt37>601+lLCk)2v1M>*(tkl__KfQ6T~B+ z*kh0N;6i76crXmj%3u8WS4ksgqy28Kqu4d?0Y}n%gRn!EgT$2T2LMab2G{Ow=sAYrNs4|=(uWkicfM5_l&%WpkIiPFf^*}qNv-r!5#qOj^X zkv<}C1slDPk^uIfrCBJ+Q1$KBaVUR9*(!=jYk1x+O)C4t-_2PzlS%u1WI>l*pGYLX zD0n*h5Yk-gYRNVKt9v`e){Fj%@dj3`XVVFZxuvV-qsb?@XY}w&?8}3%jyo}0^3NI!mtQSC$*H^DBE$!SzK4DV?7(^Si zX!*3zmp4xK)5H>QLENwyeZfND30eK;h1#{aW7a6or%aVE;*EDEJZ%ml;r&|VXh3rh zqd`IBdB|(e8lhwg2cm=XogMp<2P&YE_7BA)2?ORJjnwnzGdn43+V@b;PSEe%F}C-q zn|C@4goIrq3h5^6-k?Ftr-A0hoKl-FzCUf+e>}9NXIDZ-ABUOOTt_6yK8|Hk^A5bY zf7o>YZk?80{pe$R+v4RB9V02xsm7z+_XN9Fk%t%A*F+UoUIVTK_urj>3wCW)XJvw@ zRkTpVq;X4uz+{;Dx8YfdBIFHrP102c3OC>^5JhFRuS6@C0KPf0&y@Z)lj0obNy8k z&QaP`hnTsO3>2vn@HAMaT-+&HmruuUE$uytOKA`ZjE=%xS zk+RAZ2x7(=6X~!=X*9q7K((e5o|9c?6gK7tu@eC) z(uY@kx=Bih7t*R$AVk^-y!_{*jV1jOx%ob4W$KY04EsFJAg0_>V;nuOY4Yo=A#Wby z!opERSW7GTvLLhc(tq?{NE%t^RLWS?1Lf2o=fsUZ)nyWSjzC!FzDGEo4OW=d^yDZq$7d!)nhl)Qz40eE|r}ICgoKziUGt8d) z&Ao~&?L3e<^zxrw3B_C5g4_l}&HqO|3D`enH<@0}_5Z9^Uocb4u5?Q;fApzv8QO*Lwsr|&5y&%vfvoD?K{@rd#2-zF3IWS`8x0+~V> z7m>FdcRudZsUe9n-xe~9(g1JZVqDzmQL&gwBbN=&m?oYsq;bkLMvnqf>K{Sxh8OE!ql%JU-aqnrn-NkCxf5q`J z4OBNMOBP?E+8Yic!#q!yn?wvBO@zOOuETh-{2sc;m&&>&->oZGAdlAMOa5xOtJ=yq zQF~TSq9LzP>DY*m&$iq04<)CYk!QZ1Wh}Y@E+t$8Lu3CZjfzNX6)n|RM6!5a&dc|l zn}fnOm;>G#KYQ9>7&rXx>O%@~^b&;Se+TiAxEt3h_4v9Z+VvQjqKSD8Qli+p{NRIHowk}DWNm~r zmJ@@s9D5I}_X61~LLu>O7V>S|v{h!I)rp`%_6V%kLOL=A;!L(OhQ`PkGd)oNDSU$r zJ4=f+kDA}QrKV+m>B>JQ4NK6pCho?K7lp`gdO1^_13BA6IM1RaD^&QL+2Z`A>E|?~ zy>fy+`&DFNDqWX|#3-YDSvv@C!~gC#8ZH)+RxxR0X*zRXyURQ{E-jUM)ZYK01PODD z|D9~F2J#9A+;1FZ!hcJ*c!Pg@_VtG;WwI=cxP!z4a!z0UMf;@h$^DXcM&p%$yMT}k zWN6)L@xATgDK#4uN_rHP#EiQh$)T!Iem#cSuE=d~7QlPmM9bfV4#=_xXSAxCKMQsc zOp!G%3|gcc9d(p_e$X#re(jv@(t88Tn>Z($%EKVh*%=rJl$M^vy2GsxsYJbDNXtoZ z(*-l-uQX^$+L`6+k;f-p@>&t;?_EmE_q9(e;+_-|f{ivXeIM7&H(!)%c1NWfzgx$+@u-y+xsHdW zC|#i{3kVB(NXkNjeX*Ad7!@vTEf)gR2aYHk2|vX>a9}1RlIX5v^AziNUqNK=r$vs5 z4+e7zfq6t{QVfIusiR3&C~hfzvRurDD&Ei}K!c_9+@+l^miMXg7cRmQm+IwjoDY zlP#5f*@^|)(YlETecRo}D%K?@Sm`>@ghZAe^x1cXRm+4JcW#xu0Dl?I#4u7TP*%pb z3U}LQc!EEwrHsP!Ds-PvxNOLZ#Dh*3BjFwjHvvQ7{?9!sRLk(k{=+R?{cUa>br!j?$YhzR>nDb zlfogF0_$6cT!Vuoi^#4(7K5b8#S#BK!yd$``qA8P>xG0U!=33<`L{DM$iojl+6>`$ z8VyYgZv(f0fN8--l?b{ahovvphRv2;7!(RZGf_CuMBJ&2p}{UUQ5(Mnz>`3Lr>+<1 zW5ON12l9SX)g|Zp*^M71F)U14wsw@9l$MbB%xVN>fS*RR;4aWdfH1=xp~Hspw_Hji zzwi444(VNwU$eX9;cVxIiSFZI$KD7fD2ghgmkdagbMq)qeu5t z^J?9Enm9FU3frc_7<0Kcv~-+F3}2A9docoyx&JAxZZ~556sUs}i1X%T7Ux$J{#470 znf#g=;~J(1M*@SsK%m(iCQ1w|iMv0nHgz6%#v0AMDc34bAF8Oc;K^e%mQP^2mE zmiJ4WsT%Ismz0~(iakVjGjZQ?@qJCoYfW6zx-I^K9x~DAI%e0#B&0~Y(-n* zCy6nhNJEJnRq@d5{a^IKmli<`Fp~X+T=BHhRZ0mrc zp$sqi)fFWop>3+;l(EGmR;<4t=V&<(PptIEF9r7!a9`zQEb? z`5k!2BQrw&af z+S-{5?Uod=5391qFS$wZpKNYE z9E-Lu0qnLxkULK}Oa)#~HIz5tF*Q8U(ho5CsFXZ#>vq0vD|5wbE>`dpZ(_sXq+HZG zmYsyYN({!jY|iDOvFt)T#+St$&T|sQEIekzf)|8YR7?$nE8t?oQWG59t)`s<5uQBO ztRRZJDS>n!E5*tfM1_}lWM}QD8IiDHUAJH~5V-y&A*BPAX8?ig|F;Z%F7ex`3MQ7S zHNuFeF`}tg`S&`B@Y$BKE#m^}e*2ujQV#fk;Qw%1BdqTEGvP=2p6G>nKe=1WL1wK~ z*hY-sgY#b>Tn56_ORv0>MCk()ew0W^@Gd%{X1bIq!mF2#t z)+Fh4|Ggb&zx(4G*>oxdj|<-Xf>O2&7#^n@8&(ES`{{$kKrX5Idxn=aG`NKB^Ur+H!M>AcO8zRVyU3;SMf{RR2uK%S0lsND{iC}^T zY8}IvuBG$1f_)L*Q1-YhP7yCu>jWKb)2sR=_!t~*7uDK#u;Q1LH>eiCUdAdPZVWF7 z2+R*^O(Mt-#xiyxXG$Gkwt7BH39&|xB%5m z@*ptGPRet9p^zi9{Lt^yy4`8)Cps0w967tp%Hh8CNo+?o@Nq;?x~_BB|Kscyr5VU1LQK#wpT{LYST9&DN_Oh;wEn}o zUD?Iq+0xFqH;rn)$KPslUIAj{_LHix-7N4)GvK4u6e8I%+@EOACyd>K>eMjIN%22n z#Cu9Po#^(Aa2NE_5oNnBT#6a+!4WhKP3OVT2^WcRJViy_F~oUJ82oO;KUl zMO%y%%H1|C)d@?uaKxK@N|;j_+sBJ;wyEykH3cTxMJ|Nu z!!b;xsPS7Ol#4pqW54D}qZx$`PJRCpj$LB})~UGzK|I8{gOT&-BfPJK5vxRLpDk3H z>s+8dTrFQ_IkF!Ze${^UNV^=IJ3NMia}RNY&z>i|{laGDRo7JZxJi22Q=u1FjC>UU^VVQS7&y40-(-w#j zaE;`QLwi|4kU3_^TA4CqnF*l42JXARhd0u+=d^?sEBpF<^{DI5yZ2G!7W+;?bX@2IqBm7 zdpoHv6kc?biXq52W(M58&-l7PSJ8V+9 zjcq1to`!O&5M$jbHw*gJMAoq8*y1O7U6RV13O#uT?*?B6bNPSm42YU^9H*yPQzXKpa?h7gK3?kn^8CzLlX}V=0lrw?aBzBk$=N7kK{zjnWjDj=ZKhDazg>j zZa?Gy?|rhd8kXq)QhMbczD$S|e@`JRm_D|b*R2}zv<3eyQcXnVrk!BtRO|jl>2;A% zVu6Gb7Q_Bf4v*yBHJI)17qUpJa;^_?AAn7*IV;+?2=E;iJ-F!s-4IN4{WYBgn+E%b zKX;{fpuep0q4Kk%4^Hmvql?)>HyR$EP%};YGlH;~^v%HkpUyW}2HT z@a44yP35XsrIl3cIB_`zuQ3bjbIdJ_U)O;whAjd{MSzkhTqNxU9uF|4pPH-fw6V?m ziOlklid3GJs{YVJi7Edhz=px_HU5+b>R$GgnFIYdlX?1k7p9OmzXM0fY<@9hRfEe2 zk4=bOE%^{n-1xEKXIHkbl)1#6)giSzAB8!peXvPT&k$(STiy5oA<`lgdFI^eXr2#2 z)n58D08B8cvRbx9`gB^*vfI{(;QG(b1q*g-v{yOYX?OQX6&BSRzhAlIqm(F7?xU zOkmV-4v0vBpsnzuCL|}twcmS@QjE)Ej;7X!VY2TWL!tyw`+!j+Xk{Q%0C|O2niu}~ zI2zY-#_OKJ^~FfTBUeE_{3f=Rst8j{A6N;BC~tLdLO@Xj<0srP=y&~@mVnuoV|cdw zTaN1IItPBzEji)qKP8$-p$@=Lz=OX=)D0%}FrkTOk8U4U`}TTHs<*d&-@w)Weq}o< zcV83y48)LcEt~}ca^AcLck7y-2F6j6VKi{DwF+>)6Z=$&#y{PMe23hlLl$ybo|%|J zBES{5Q2i|MZHsO%*F38s>RIXRY>sZ?Xisg!x5wukg|Xb3W!SCNKtLl zDU(0q%`WvkmDq~ed)CzJe(kAacw|(lIWd^*K%^OtQ)@z3+~-;({aKTn#`-=s)+OE< zp+1ffoqLwuat93fAjCPGN(qfww(iM!aukjNGTv)f(Y+A=YaQj-}^n!_g??; zpM4Hz@4eQVbB;OY7-G-(;%G}wd+L^X;AEi$iAQ-}FJ2Kx?fO@|dSzF=im)8^nf*o{ zG6fnX&a+H#3$V6O^2$ME7(43Y6n=k|OS~3R7%Qu;SY2UNE+4VJ2{N{Q%dkz9QyJGi2mxB`SEE$>UaTfPPlf{G5AOUlTZ*y4 zG|x|FS)j|cl#kM@^Y}{>{nR_j^q~3Pmp2nk`Ngd-uqirtdD!X1h z@#{5s2(qr#5H9C9#B`=i;oKywTXg%L&cO|97C!GO8q1_y3!}i^gbm35_@?wrYOa)i zgspT(^`_rvW&>yMDQ+(-A{^lnImLQv~ZPI(aTGAQ2 zNSUT4ze-N05`!0n-#(YCyRSIB2}UqP&W>@Rwb;)D%S!%0J(1#N^4m89FF1QIZ`qDN zTs^^>rPH@GPpmjY#sE~xqbxHl#u|7o+ z961fM4JsmK>0CuIlK(+(W3N_KCUdn{*0)rXr&suxlP~KJsoWi1J2#^5Je-Wg@Xp^A zs~rp6J~WK|1s{Lqyn3L{iiEjDILLZzP~Yd%k5?{{_UKkYcjI_N=h!-EH`hy!IO zG>+vXJlj-7+U;vA6;0ENmMeYoP)*skC5Rl4eMrdbBNtZ7i)ca6z||corzwaDL9_HpRO%8_3(RQ zwJIBE42nqENl)KOQO4jKd+4v^j4g*8dC7X(L0FD4$o#>oV9l%a?Z98T;z; zuRi#ka8E*SjZ?Xl;^@{t@FOjQ2R^MF;GGY*e5YgUGcb)~RN_WQ&0k{o* zylCTPxS=|+Q;yhB>})POdC2inCri+K+Rrr2uRcXsh96ar*vxKQO0Hz;A5kGlHb69n z-LtcT3_=Pb)J#ix84v#kt5jrY1hnw|ND|$n*qPz-{s_VUBX2{ZnA%TdoDCh8Ms*D#*Y{+Pu@A09?xd8DcQFlLNK}&DBV#`o3>7)4JAv$cw`RUMp57RZqId~ zoF+x08Tz5l44AQ>=EWc-v-!;I_=5-n&!$W~k$~_r6qd<%M9VpT9_9MLyamymQRnio zIAQiPF6P`PHmWY=;grW9M8ShvAzJ7lBE+?x>rc)iKB-*pC(qDrbS~L9VQ;C0L`3c^ zFd+1Vb6+E9&ygW7@7vw}sH5h8S7exKr`?`5%rsONiMr$={>oxY^c`Tv4G$9UHbjGa z=mrDc;Pz88G(Y(}Dwdx(ZJex%;a(bbsC)(>J3dSLjDV@MTL5 z{?wE3v+(K*K`si#r+=Z5>c8swL1vXjizoVcU>XS#l@TGc{`Ct_RJT|&(kH-w7kW${ zo4WBO5Ynq9t{%iHes2zNcPhy74+}y6jCT}ra8`_n+W||au8{OUyn=cjD`~F^FUj0r zyP~(tM_F<9=k2MbTUWn!t(^kGu~$Rn1t>iV1boLd(Hmbj>t1ptLd^klqF z={fx}2)wXhKnB{Q)#J~!X3{4&?_;Q#A#63geLFfhZg4Q4`)Lb*mjSFh*kyS4htVhw zO!vzKi4~mGzbb7j74~u?D?SO|C1c#8o&{?j*1YFe2dHHzU{w)KCt{=PGdWOcHokuq z^_VXkX(+9AZHvVB1igcXzZU@WiZ@K&oM_gnW*JKl44WS zbmq2ZuFU%%IM6M+_7v5`o;0)md>O^0jf==r1c%CQPaU7Kk8J*7UAtYY5q?mit)Q*Pt&!i1 z+4UUV+SLpYEbXu3)L(H!brznn{{}BCkQE)we4VRuBLn4BQ=X$qbz!^RFd&_Rve)em zqP2+g|B4qX_Y;5g9Bbm5bJ8b5`1CuGUQflRzPeicc7x>fB_q|Re zq#zaha+o?tY>7_NWMZDG7SE*3BY0;Yw-TVsH{r*+_QP#+i7;k$3-P2)Ka}Q^(Fo(7 za54je;4;>&ixn-Q+t&pOOgR4ErlAb9!`(I;5q&3#@Rc=)HH*|lbF_=gxfxYFS5q!} z-+=;!WaT^GuYC*{`w`=O2J>Gr!5GUUlD_4(jxM4r?Vm5%cVGFcE!lIjCfU1YNwrm~ zLh&0|0{@UB^~$dIrA zJ#uBAbd?|{+ts9fPaB($wo3ak+!C9Vp^X${MM8X6<&z*Xv>19{`Yo{a3GP-xc0kTR zeT$p`!6!AVf$?Mn)YaDN41vGp6KqTf`hh%_YLs_X!ww4uv;`x{6l(kA;d2QMA##DP5);3rArLMlF=AD_E*plBEGF5Lt zkq#?>;nTMu)Ez1snND}OuIo=um?;e)C0EEYiT;k%s$dd7C?mMxdmSD?WIBreFg+8^ z#h}cL{5tUW(|ww0nlLr3zMm^L2f1iVDIh$2M(g zDeq8eM$f=q^Hn{55Shl{{=twFgvaYLrd6wim2$419K*R6smr9Ju{&=S^a-u_Yv#lA zj7wwf0Dt7B*%e$-tXqBWHRvv#1!WA1Hs%K~+(Ba$Ja)LpV$Q!j7NY?C3ev|y^2fPs zD8${!0VFQ;&$J(6eaYA|CA=R|c|W1%{j-l%A*3$Q`W!g3a7&qaR+UCg=me=w#3$2N zB@cHs_*w*{>=O3fvq-l7M+U{)Mq+`HIz2)W{FF47zC8>*dtt++{MDDPo0VDIU-qE1 z58w);NDL8`8#L>*s}&CE)8?@e^)vBJ+ft8>q5oAXN=5QxN9a0Kn80v+@Nnh7vfBJC z#N04>ZkuYao1GV~9u{QdiN5l3e38atCiVI?fGDj&s@|*7PJO6JK|n{F)c;6tGjilv zhs>=lcP<-z@9}^9Sp7cQbp;ibyXmr~0hyh@>oU~4Hk|00-%^#%JT-Hn0WS=8T$m)E zM-|ZluKw^3!3x}_0bQ0}$5w6w7soQu`p+$(v;lTz&=6r6($CGNS2vJ;pDLkVCum7?638r!yN25EJ30riz)#w{d5C|@`Y5>?Q>M3Jf9^jVm3=wVWu(P&sTRop zjpRsA)>tx_5`3K+N{E_kY!!=;e3|>2zk{LQ?uXG~_VjYbFOR-6-u`fSX^2)83?`jG zne}h-PrvU?djB`0UWIRk`{o0Zwej@MyI%aPqoS?-ULD248s!qyZpQL%jqv}c%t}F4 zv2~K8rIn4=JYm3(c^2oor9t(L+@_GVp*`$3BPg?gTp5^0L$w8q7o0R1Qnn|ml7y53 z?{$CUkx9ltMtimn)^HUpCHL<(O*4ZH56^6CVFj6OF!aM?5U|u9ocBdkGdr-9J-*pB zruyMt%)1ctnj2@Tw=e?0`E=FtG6kwn;E$A+yud(v->n@(u8;d7F4IPaOHhyV>yziB z-j+K*#l`+++#o(es_$f=Hiz00BpW$MyuHuD>!d)TPxv817oX@j`_9*<>!l1JtQtZe z2UI3iZ=Z-C0{eUgRh1|=na&){6UG({Ly-yft^q~(Sp}AUgAz`Rf0m{K%M^3?A3y#6 zxMOU29m8Z0PrYO99iZ{^6^)LFO>uFaUdFBZ@ zDSo*gLg(IkhhN2q%`}ztqVHw4*(Yw`m?VX{Q-4G-b#fsiC@Kx`Y2x@ZJ*P@j@fP=c zLa)_4r3(^%O&CaaVQL>pZx`CI_oKzL(mkX^Ox8X|mUe8f+kJm^Z~I)~LADQgm#{1r z0d&bgxeLunKcaYj2`5K)wX)$Th{_BVZz-V~X-uVjbNpgs2eT+w3sg@D>mM**z|apU zNcyjwMTGl@9N9Z||DKT6Fs?BCThx*`lGPoek|K|niH078f!Gffn+KeCNk|NxrlHW{ zMD>)IoONl?k{aEVeuu!Y+u18(^I#9OiufpMYZZsd^sd z>AP3v36Q9T^`@+&wbB^5uunOBFSeLkNX*39b;DP1E(Mr=Z(-{olz@i;D_dSS0$-R8 z|K?}}LXp&*@Kf2fz;j!fwAi%q_Fz>u?|8rw)D@niii^#h^;9Zh zj=zC8C^6aKPN1`_nv)uM!jf*+JeNDGM8lMrr|B;40Vd6ls&{E@eMa0b0DqW1aK_zgT0|BKE*!MfIV?D;?PSl_>j@k8); zT82rT>X8u+S_TokLPvJ94KlCH@+1&$1GPP%9T$cR>3jO*+mMO4d!j(fK7}mCW(?2x z!D-e@JJJE4J49mo!1)l~v7$u{1y>K5Rczq(ClfWWY`MQzh7fC{+`;ukKGQ=A|mr(ci=41ZG^k(hcf%lz4mQBnXUOAWdG)dj&rEo8u8RoQmZ%xyv%}kx8V`w=XhQ<(o3UR zuK=O01Duez%Wp1hFT#FL)_-9iJ1YAlFd$Y(O*6#T*B?|%QS8K7hfQ2vv%4?D@+{>q8&O{+!bc=Al2 zSC%ET8gb!|{>Ud}dco@)(9{OO4-P9*T6EXwmhC(KvgaQQwjzuFK~op;1An=u(TxFf z^e_|=_aPhwfy+QqO`oe1slV@-T9MhaV>uWW^xm)tYQG;}8%SYj(S!rF&w+IdZY%#V z315GWMAL)oq-NJ<1QAVjXV6H0TlM(uv&ZKOfHw(miMc~ji#$ZvJG(uqd#jR1){Cue z+_>o<{tzEe^d4iOb-S+LmPgY2zRijf&I+*?z-2FZ=tpSC(kyMS-MV+DPmLw>CTe|i zH!Y7@w8V8w7rc{aGpm+8wPtcA>!LRVtNQb6viNy$^A?#{)maqcDKtTp*9t$1V}}Qi ze{C}mA-4jXMa4OD=Xv-$=^tmv^^o?zeIeKA$&c+RC>Mt?ux5Mh2bxqnCWW|!Y^i)NET2@B zjyRBo!}R)srhV#|Fpe;AZ}LL{Fd=TmomsO*eRfkzrIh5jz9AO{+my$iOKJtB&bD0FTF5ImXE2GI%D^=y2JUA0n6JLRrg&26F;^cvJ8CbQ4* z?arm%DKfdIgUgUH$bfrin_E_&0O|VLYDYf9np# z{5C%q4Sfp@ypuwbO0>*~?fA(M=I!gG>jJJw5&&5UCm5544GG<|$h3=oGB1(hDq8rhmK^0WA-Jcdpbb2prx;{UF(8v{F9=?0{wZ2m zE30!wjZ=_2igfJcAd1D$Kk*j&c6|NE!CV&zY6mz^fkB8C#wwzs6qeX+pAZtX!Ies9 zQie+QC+>fEuM{=BL1Y8xS~02-gPmH`Qu9MEdJ4Pe2iTNz>WT{dWv>`ihhLDW(E?2; zKByQbVUzAzqy1wZvT&tibe!FzA|Xo>$wHGY(g9KCvnoI@xvCtFaYK{PA^wYAmP7NyFO+yF&(-jY+Os()!yp;eD6aRX zu4>bCYaXxd^=;)t%dCG3U#y$*8(@Iz|Cv=-tlBYsgYuTrkVT2AWR2+abAINOJ5yas zAzx+nvdJA^{IB6lJ9)+xP3b1(%>w*e5g@mo?J+psDX`y)NBh*Y`yfh#=e+KfR1uSEm>9q9 zgbd4d5ecF)Op(NO-dBKAnFq56pSeOa-<+p)TO!>gjBq&Agc8fhty(DW+I`D>srax@6 zu$|VPTl5xH3vHR-61xHfuMUI~gc9+$#6QCYh%^)toa=?2Sb8I14BffdY$`aH=+0Fj zH9Lb__fp?7CYlI;o!#)qk%(&VnVKRx ztbXW}RGLfV^Jd+@&I0J#WD&%bO_!<#Z(~N0NQ3k)XL0I`JtAW95=A&~1iSxg6=vqicwW7?*n|y2(NW zUbK-}@4PDfuD zheunWd>y4k)io>W$8238ZxPnmhjldEpA^$cvu_nGI0cd*)jWU!wa}v>?OVUoZ-GvS z3B44T>LPE$h`q;YU+rF@lJdVOa*+pA3R)Z2PwWc@O@~_goEu@GwGIy-OEG^F14rf54=LOu6$E(C0dGubydeLLX@|&MoS`jQQ{^$&`OrS&QKTrc1 zB_KwN2=$6&fDs;E6{#99RHJGVlzV<2wOdeIe@wCQXEcCE=j|KK_my?K+k=RlgOJFO z;QV!(6a3`H^}%J~;h1rgb5Ezu0?+16_MmV~pu#r0*?960fnBdJ_ca0t zmv?|qYJtS}FIl4f?pyP~eqR9=Ny@k=Yn<40+5x;ma&aU%HR<`m{uC%#0-mztf|MOf zv-rz;n2o<@TfAjXgO=v#zG0HwCPEes+s)6!W8H(}2IW;uVya$?zuklOS^m{6gJKhV0(YNPzu}Ev{!yRX@GIGU zp;{{~v`!s=_~jo;E}HkS z?r%L2dA(T>JF#sWMe=jyaQdyj0bKR)3|@axkwxMWXhCKucM6c zVb?tJ(Z@_gL`y`(D^?xsr9laVoJ=KD+inGe@shMJKhKO~8r$%TCJwL{c@ov*bicTQ# zzi~o$zW>-vvmj@R;+_s&YQ;|6*59*1MA9K(MOz#x>KA{~5HFTtJ36seV#vx5i4iy*>M@>|1l@Lz-Ru?WB(- z4(he3YZQQ~afSuMLIc}9Z;>nwPv{UFbHuTjoS24JJS@D-tq>GMp)2JD9yB7DuhF}y zl=`78OrT8pmxUR2${Ope9ZRUM=KsmNnv!r)O*nMIAysctAyS0>E#S0^UUAYQcZOY5 z#t>}U++%Ydt@cPChsL!uzBTteEB)#ojsfMQfu90hFY#2qyjmzv-;FsEdDx;n`rWQR zHCtf($c7a4WHj7S9?A#eYdAG1gSU?X0simiOZ+82>N-s~jGo#5p5sW8n4WXA)xQOC z?Knwr*F1a%+CGLUhkwi%!($PTd{K;&-Gb|;%wWroOS;vh-{j%X;J(V8tw(g7TtVB% z!2Lr8)KV8KcUXsCRVX}ssYY)ezSBa8Npd$1yT=rEDw(~(GY=V>DC&x9&hQ8od35Z)$Mv7KXh#uRT@#zca z_#Z#Bm+5&10yvB#KP5OBf+-6bNG3e7Ijj$(B0yU(&$#odS1eDfDmQBqUZ^gjHMQoW zL}E1!Id_`-xO3b*5a7^lKK7fzN&DnB4hq%n6O@n>$WOZF5COg8U%}LaT!~w{mpG5i zE;jvitwp$Q&7d>3U+vuIl9&hxvP6*MjlQq1(&CsiNK+cyx8qhw0yEwZPen34*DidO zflvrea~QU9VkDYkc2|oP8}sxjb!FJSCEAioG$gI$tzx?SpIk-2bBO@t*Q8KfuhO&5 zU++E2ZyZc@n_6A?s+I`UouSEm*I0kLu$`@k2wYFks&Sw@<|jY-*C%HcR#hrO(?N=F zN6~&{cswt??d-1;vz=uQn}ml#fR~u#g#}XLzEfxfcYiOx>)X6#+&AK&+|I-G)|5<$ zEe7Lk0H*R&#vXwJ+(m>OsQPMa}ANi(;Wv@y)x{>gjgmz#;~g-kGF>a2f&X zT&}GIlqZqT>S%BJGgaI`F8b=*L8UAZEO6$M?Ea&>AKcPkhmyYm>Ws0m{J#lMWx^=b z@fT65$*aPfgktxpeA1gzqcrNt`ZD)V6IbgWT?Huk$^V~j$8w45T85t-0%UPYm(FO$ zu!H@O0#r0^QHMfCz}QeS;IjkB7T4BGEjgYKBUga1j%wl~!nwEJqo3SM>(bqZH{?T( z4(+=BKgtLlVKLr~+Fa*Uz438N*U;<~!RXIiIHXz=z_w1A0Cao*%|8}IBmH*IChFZ! z&GF5?R-OJge5-qAcJN1V18@v}eYbtla9x#}%n|ZvZ!l=e$D3Q6iT5f7rF;zWWXd)W zp|{d=`_Tk0gSAE;b9LXplM|eIgN8_BXExu{q$IUvxzC$Sq50ArF@EeH(dF8M`!$}d zYD%2S3(n4|SRK;JmF68)MK_UOF}cg}*&6)4(HcOZGGBwpqB&uH$xxL{MD(kPrFhPd7Va-Te93&GO@*a6 zdmC#}1_9D7b}*zY`-m^V8R{DZ$6T3U!(@qtg41^~3Qcn_Jo%nuEWUJ8|H$+^Hu2Cr z%A{+k;T{;XyqY?I9yCyzUXI+M(Bo&hv3I_z?$J$u2olS2z4SlSh|xjxe%<&s?CSmj zD;tPV6raYn7Ax-Kq0)UQrX!cSbk zLwt&7p^M6#jVdUscHNy;Tl61S*2sio+&{bT;;L7n?PBul2L9NVzYniNHzNayVNL{S zuftzcQ-lgn+GBJ?q)Iw|A}`tH&T?LykssUJ@5{8JNp1r28`$;GL6&CWo{z|${N8R^ zNV@a}&5fTt;!rpV!nPj&WYds|8wBcvl~DVP&sqvB_H9Kr3a4guTMqSEb(bfaSn)r^nKv;mQYN2s-5FAiKEOR`KnItZ^6*4X}1dzI2P*D3xGu?JWnV z8ZAtwsz6)<1K0CtVW9Y}(Tvzq>@Sy|b?f`YM(i6;a=Ge2Vj|zKXLO7VdvfPqJJUs9ohi6+WWOlf5D6kKb!zvBPZP@hi|_B+ z^V|AAG0^RmeI+jYJ_WzIcyP_CAo@l@{+EbOA`#G_f{Ur_m3(PZYLvCt);Ij{MHYfA zugYR_kjHr0{fdE(m!-zT^~LnknB2+07H81J6AdF|!>Fa^Z(gi>1;P zxR@ZM6Q@%)crPNC15AisJ+8TLhv)un0NiOicO@kt4?1teTW!wu%aS2T5&%IR z(=QWAH4}n6rNpbW5o_G{LX2UL5ntiFK+}f!$LwDGsus&jdYr4*3VOoO_(z--8Nl4y zyyqg)`e4YpeQITePou6-HYT>vs!G+_<2i!N@e=kG#`jmGsWZ0f#edVHDyO^OIz+TX zdw@RvO}E^wCCplV$s>`uH)!3}Gv@VT{r`>ep>U)CJ4|R6N52;(+QNuutdpJ>@4W9S zRp}!B^PKG{|2gZd9JYuIBCa8Dn*gSOU`z{_3jiz7&u|B*SRb{1DM4B%uckT6A{!d| zU3rtWrMoIxSAU~k#0iiw+y0u z(1nEHZ}Of3RAdDJijquQ@oMZ$)fRjsgl_1^Y2L-9E$V*g`C8__kJ5x5UGF^LRb~8e z7new^UDnf+PO0$DbCxs7Cc|Fof)d}9Bh2MwUx13i;Y|}5&IJ%Wo5*uzle&fiXWfAt zhJ-DYYB$T)1^G&TKSiAmbkn1Q=X&;MM=E}`(a+YXD)o8@RC)_y)$@hEJzsja<(E6OMGPlvvM zZ~7f>K*@#YJokp64;(y|G{Y&h1`6=B#vuK8I-izFD=GcGNk1{lGyy zEF@*ZnL-L1V>7uk{8*EU{bHnJNGQs2#D;od?_Z+UhB@+UOW{f*2M`rA*8kjsu{$9h7+mxzIcA z^mx|niBrNF&B$qC?r(Ej(Y6#3pG5tLJdfZ#XhXtKA{a~sMTw9xpa?+)hMhw5Y9{ft zkS~|N5tg;;@=H1lJkmlQE~g=+{X*u=-#_1PhIqTm_c zQx)|{1{Lf!Kl(a9GSk4N zC}w(jZu%EO9jbT4U2OA7F^QFPw%7F+o`ruqBXXFaJo|_Vkso!m!+kSxtRA`SEtpZZ zTlC=Dhy4q#;T~%KpJd$8@V%olT^?frK-=z1NAhm<2s+Qy7G>YF-S45htOILlAXP<( z+D647LdAfn$FJwuOt&j)L>YRBNlGA zX|S9w$vQCY1P$E~R>*xye=Svx6<*D;D-w%e?!12Krzn8p z2dQ}AcsGyEsNPbJ?N;`uFzoVQru-p+bvq7(s%e*h?AR_b;B&eLHsY+*aUP4mXWHql z_2Z=jT5vxh+{tMO!!Ud#hx&tXAJ!_tFmynIDZxWeQU?Z;DX#23QIyT3pPCq?oqi4M zvJXB@FvZ$`B&R`~L4=Eziy&!;KwNZ&KM>R7dsxkT+DADSHt~Pab$-fnK~7B|{G+^q z2tdKGxE4_8G5R2^gFbnR#iZ3><6zh{erbM0id$aL;rr3-=GxvI z5m@o2Udm{J9FH1;nzk+$EC=04QkuIZEnxs6o|gfQkleTpzA> zQ6XC$LJ?9~jZi91swT@Kt3=({k%#j2N&1O9TUd?5Rj%(1XOxFenFOSZ%QBHPD(T|h zs4Hro-mE~_fG~QHxZy=&l0LZ(QBbEKAVlO<{r!vO&SWzKXUgsZ#bfHkgDO<#ApxfT zlH9(@4AzCk}hrNH{*0mq4+C?f!D&g(q*t1&BWX zEPucUM!rVpII$n~Vbk1Jv72-?UGS!#(RQy9BtyZD#IfMK-go2DJ`vPhD5w0*aVI|& z>GkWZonlFGSU!9~PUa^PKZEb~$+*R;k$W#U?kjbr_0^vJ!J`i1_-()OE-U!CP8jmt z>o${|5F#l|Qt|5>$z{dCTq^X~s;Y!i&3Xswg{ThWD!Zvxzu8hc9Pqbc;)5%@?DB66 zysWz?E;FWF9ArqEnK2~{#FwnN>3r`=Vt{*Uxks0~OF`NJG;J|j*fFJuueID(FL%C3 zbWv$*8ih}~c;jWSpv?@CXWg5-EVII{o>W65fPD`r*KdYqm>Elb_YxkXXe4BQa zwE_#UtEB8tlW}5qtH~&fs2gtHgGck8$4K)lEsT^?EFH^P^M0U(4zmFBqlGy@R-#Hw z`AFQ9qSI%}|-rkP}=8ke%`lhUxU6&(&B^8$|Bq zuSM8|9l8u`2?si#4G!ComyA*ny9I%fb9iS8ci|07+@Xd>caxigSp{RG$VMl(;=VzX zp)O5EP5BYHM^Tt4BYy2ZN*iqu)~DdXaHDBP&Y&(8y2l@;pLD08rin1?AQF!K(^wVC zC8tit=&Zx+V)a+JmuX<~zO`Q?e86sjDpSjN9q?1 zaa?HZ1on8TY^;`3ZopqE`@PD z7!gc##0omQ@$#BRq5FB1O=zp~u5Pd>+^@l}W{#t8-T`=ZKopmH=8nApwsw41_OymX4r$fW`xB zFSL2C8BrDv!G{b1RfLo!V)vPx^Q9keeNq%I4s?bkgYXU)45;#kcep+lq3>Lipz{0Lgry3#&+?rc&u>`(!Z_FipjQuO#*X=CY9?) zAVh?!9us1NvL1TVk!f=;7Yn|z2ViNs^NKV%MUux!wq~XI@^&i6-`@BH#)hxB8JS3- z5?GL!mB%^zs5(B?fjzNFt=j5&3{+lH@0jkR6rVm5NvQ`dWCW_%Ga=huB!n}Gsy7<4LUQ{OT=cZe}PM-+K=*51OuY9;uFEypNCy1qs6lGiKbLW2zb}2m7 z+YgcO(F`tDW*(-k&Ag6$@Y3ZVCV=$@&7+4b4*%FGNOk0lcUdn*6ujYw?Yuq zOwakwNh~kL6s;G)-0e-^6$dS==KKp^x$(*tbnBVcqODgfhqMt{eUn1v4p90kGeQ6y zU2I^FIftoQy5qC5@3##unx_x=s6V9)1qk83d2s0V_>j;P2y=|Wkq1yuRRjs-t9T-# zR`NM$;^;@vM`Q|gv*u-nG9 zAe$*Io02uUM_9Szdgm}4M=i~Ab>#0rF{os^Qqe!E8ld&{*exQZ^B{;;{$$CIBN2Di zIe6F}tKb4|6)sLaIJqrqU#I?tGbCg?-SI~ZS>9awCaa>Lro1X{CdJ<**$D+|?9z{h z*1)LUS$cm4^|vRguRxyy;>Zz^kI(>xf!O^oao6#XlM5;W3}W$M5?y0cMQ0Mn(h~!d z`%-G|&$x@MUK4D!2$-CCFn$;7({+9;Jg5p8k}1^YYMLC zJO6BcLnoaecB9Aqm@lMwa@0=GZUPtM=vu!G8yT{4eglz5(J!0jH-bVWjpaTv50ZvN zsW01jfx>d;w?u#l!GV2X?xl(X`5E2R@N_JA#^4ERUaxUj&VBvhDDzrM6a@^ygP0>v z@S@@MIFvh@0i0WYb{>2$DXGeQYqqp4R$uCY`6PMqc6ACM}d`@MsZON$SzpXjte(4#C=$_X_Xa-BOz2R~%1Z7b{_vIZn8>k*fOr%$! zh{c)WL=#G@?-C!z(^LVw0wWUZ9VS_QN;u5Xt?`c$L~hSB-JW@?Uq?+!DU5mOHO7Xi zUMEJa2z36|)U$mchv0=958U|37-&+$!6VgTriHruD|F;ZQ-35?D{T#Zgu-QuQ2vD) zZ0uKH5VaX$73+S#N_kiVJ*mlQ)QyIE7M=_oyCVFKk_RBXo>jswynXDgZ%lTewiwm& zzMb&oBTBnJ2HGAHSuc?W-;wH5X!j1TK&XhubV5XSn~EJRb|HHscQvp+kIj?V`SI(G zt_X}5x!^*07}Srgp`j3=Zj7C$pJ|BoI;cbL2^ilV`8V9ZtnZ)K5PW*@2*XNA-+v*`LWQN`&wm6g&~*8$ zK$y&|a;wofzHYC=J}44JQmfyEVPXC<3unukI5%n z6Co|kWaIOEf35OOk;lPSD!y>&-J(Js=)SkVfP2S2bATOA%F;6|EJ z4e?z>)Y>=*iQzB zPO}78DI$~-v3o^{ID2g%)aFO_joNTG>u`@T?TqWGs+tCEgE_9#|p8 zN1YtB+|7pV;?Kp$w_^qMfu}NjtpeFyL>Q$5CD{BFIhu_wdiB9a;o&b0*qrZ_MBn~O z`|)w|Wy>oXaMF*%)*kM5NQA%qPW;07(Eg!A(QjOggB#j54Ns9pSev&Hs1Om$5D~$$ z`i`Xd9fFUpfK`U_KC7Sbh}wW9ijTH(c&m|B-t6Bwpx7(jNG`4ahbP5T(a-3iyY`4ryuP+P@bB4U-iFOmcN? zT!UpM(my?cVy$phN+1dD*MJNiysXv?z?~acW94!SVa6J8AQHtTMF^@iJvhH}Zl`X{ ziA@K*kKC#3@W@(|JcURZ_xboF8!nf4q7lKg8 z0trMX6;?h{OdL>aVF1%aH8KQBSbF|o?)Cc4V2I0zrK74(VqhPmGM-sijR6NHTRpq` zuMI>(9{5C-brL!4yS?)!SKKm=zPkY6Y zSdY333VQHS)vn*kA~GcQWeo-@;U6*uzt>cZ=dW+uA&<>fx;ByiDoQ!Kq3;de$utJp zGzKJDxV5wq@!sUmMjyAN(=1Xu|IL(*5&zS$lXOmH&F{~0Oj|oX(9QD7^ zDI)89;#zGeDaWThme$YHK@eq_`kYh@1rhvI7|S~S+jErIxfHKB4)bWl@V&#=&UYvK z*9Xmk=EN#SM%v#D&lEuB0LRY4u@K_0Ck}m-$s!X!G#;ItKlkByabO@TgmGy+HRJlu zz`idyf7C^~>4m!MT3e+_R~hc?Bq)a?)tv0QJ@hi|%@c5EFm=G1%7)JZDP*3h zeB-v^CG~-|N!9s#iHqsQGf*v07!AMSY5j8jf{jOo`r~)P0w~>9jae`Dk5$Qrtbc{F zYAJ!spc4+RjW6(M*Ozr@zB?srddSvulQlAS1>AZX?3!mWxeBN&@O&BENAq^pY`?~o z!c>dJ_-as2?PRr5Z$-a{x^>N=8x>jnzkncUqjpALi8U#a^>!`#@q%4g_w0N%7M0>b zUlmgIXZ`?dB!F|n%(Ulq(Az%j+E~0h#}RQtTEGH!*GVo&H>Kvf$>j#IrcMF)yr*d#Vv_E;j19%E5AoShoau*Jfm?A#Zb6<YqtrVEDnw8_qFN(Szt1c9yY?8Yzo}Ndv@}K&M-B#3OZTsi8<^A**a73f9oa`J zSZcr)k`~t4JUnMO+58a=eO<-JDPpuamfeNqACboh0IbmbfnDOrK3AABPvbUvTd?SY z6ve4sdEsTji+C(i5hjrac;v}PCb{MM^ ze~(;~cMZ5R^m zIfFA`ql$a>e#pNMqvrIt$B-$TZN)z~IE?rWQI{!LT%l0`BjUBk#>PzX#l{Ou-PCj3 zZ+wbB<>>DmcWoax!9PcgwtO zina3n{5=4XJnUz|S~pq!_*@;6kD5&6J8Bpv95dqB{nxqa@ zn!RR;%pvROi10Q?Zd3PP8@!Nxzw1%;i4fuf0c-%64VAMZ`7LAIJ^QMHr3!z8OeWIX zedF1+X56XtJL-41eqOBtAnO60yQ*=yD7fX$^H`{05$J8tDP4+$(y{7_~RiK1aK!W7HqGX=-_li)d zEc}=kh$mR6+RVPEJOAw9x~~ua8SSJSx+px?HZwFTvl1EvK5-Por(w z+g-m1{LZS?U4N8BPiTzE`kUK+wZh-?^9Z;Mmgh926z)!apO}~q<7uOaHt! z69S|daCI}}LCElDQJO_1r(X*K>9|Elg}BAZ(%~zn#;JPlP!HIvF*ZAde;Z@#G;N;W zB%01{5I+6=9f@w${GG%zTV?i!sD>Jc0BWe`BY^Mx){sC+Mf&y%H5=H4kmQjarQ5fD zv+(ad!d=3${J_oo8B>CzvDt!JA1b!Tiw-3(4E@62<{EsQKUtQNv`-yGe`oiT=1+$& zCrQ@YdR4OdzKi|to^3;*w9x#CBo^qAzjWLFvjf@P3qJIlz=3nlN%3={ z2~xK}k$mcURe88qkIp{nms|F$#kp8iJI$b54ST`gcUnqD- z;4eeFG^mHaUCswy32fSZYmenjV`A(pLh1Ym{z3?0&by|w;*X)m)bgMB$fXBB1`YGe z`Zue{C5zX@|Bb3e&0ZW);Ikm6EOnaB@~~m632wR@_6>xpK8^Twp=GKn*I@}BTi~4b ze+mE|_Ik>>zA_0RBnU9W#K zAtPz)vH*)22GLqd!|+*?T|f(f#xaabCyH{t42eh&`}2WlNvSq9%rTq}=49gU`wgYy zOrS~00%}&DCVUoGh`hO=S zA1R+-xA~sDYqxiFmvw9y59`v?3FbQd_s=k!#CGt?6Ss}J@yHqWwHYub3CAFPXlS+O zm|W!Fpt$@qaNYp%XFyKL!|Jdf7&reqotSBxc`@DZfjI4g#h)?tY=;RKyH&R<)CHe> zX#FW2+l2n!jW8_y&4AEM+^p7%q=Ro`1`nsaq|Cwq`vtF3;ocqoh@s5!<*z73o~OD2 z4cWJ-uRk6)DSTyuiQFE3OVXlFLgFt~r#zaf4S8OPE3>Oms2%%YT>n=_q<+ph`DnRh zapPNdFoblOiTpogI8WSYkT}zO4e}-gvnfvbIH73RABq?JGUR4%lnVsY!bZj6mhOPi z)ptUfWmk!jmg_j90Vv&h=L5ziWEevG81zkJgn{#zR!5Js) zet|6*dN5N(V9H7zF}Lg046v2R3KdBy4q#h_!Ki5H6Rgyyx`dK8`GctMs*5K7wEB3Y zvOIYgp`6Wp*$)c?D~l{CTwf^h>>ULBZ>_aWlP>5_IIqvniEZ`U4&l|S3D3O*p(Yn+wv$Z@AIZUw8hJthLt z2bONTBy~hd_Std}F6FiaYpg6)d9o3w&WlI9(cyB;Z>ouvN96hdt}>{)13!MS3b-v8 zD--=_M|aSp_`I|;=A(8@5792ucW@RE7Bph$FebPZ?NRa(8i!14rD_}67et>GnMvvDqfi_TU_QMF)T+qH zOCGc-qnmKw9-*5Vm8k86c)TfLKJzW_5ThVTxT=>xMKVA|ljL@TDq--Czh=|x4tp-S z8skJtAQR6@e~PfWd6 zdrL1{WEJI2jrP2MJf08!ezMVr-lN!m?5}G*i>l~sRDo=A)gqgbePWYTyAz5nRFd~% zWmyuN{8yCd`7hCh89Q3^r@*=9(rZGy7YVrg(5L&?;6P7~a4U@Lj}$k8@J0QZ#}eKZ z*vAp#yli6%d5zyt&Uuwr)!@Ja(%D0e-EWU^deG5R9ve|NCKk)k>HD2z2(ITZC2D z#oH>9SPgX}_7od7o)j%WMGN-gHr`q#B<|F2m$CnqIHh%RUAOF| z++N7luX2Sa%q+-7^|jq$>+<*;->h~o^4X(Dx_3E?%&^ z5}8KoY}xBD^XK8L$w)<-aKM(>e>D%OtGGfogt7vGY(QD@cUp^UF56me?=5^+p>X)k zj4jpto0-jz+j`8!ufEilH1Vm8pEG-8;mh(0Yn@o@8CEt`ev;h}Qh|P)te_i*Fw_bB zO7x1^MSv$WiMf2eJsOXmKVdvAy=6~i9&5;&pYHMu!y3AO!8qb|Yhb=+5^kH$#j+H^ z!mycIYq&Lml5~PnGeG| zeLuzeI+6m$11@jKPG#pY~*5FILi?5ddugikSxyf#m(hs&L>n!-X+?Z0z`G%qTG3Kg83yE zjbyh|D*T8|S*joHw|uBrSyZT|+YPO&Fb?b|x*>i>Is5A+OpPZbDm7kO_lE8}KQ-#g z6dhfts3_@LO414=h1Z-uF+ zS6a!$NHEocYZZgAi9tydeZo3txJ2d{d1D1|kKSqiD(|xNZ`Oo5wNMCggBl5GYhw+Y zcnuq>&`MNr@u)T>Z5%_zR+dfGo{|`iviyd#H+lOO=2Rf1)kZ!RaXuDQc`1@kUqj>^ z{WVdg4@bolE@HcA?$7jUChf8z2D|v6BDe%!sc`X%Fu;%fH_c3j51pVi9CiLIO zDCgXtdD}XO(I84Fe?i{*tf5Pze2N42l!|_HyPle?(#ZZPL$h@8*OIZC*rR_;aX6lD z&)vW4?QF%7s_5q_y2ke9YtoIN7l~LCrZ@6(%K*@JqQOLjRi3{~Z&I-Lov*|WZMLMSqvo?wEDD1z~EgR|xM%%Lw2J7YP^jte&^?~~A#SLYm# z+|PLXkG~yH(H&!K=8r#)KG9x39a_448rkvbUGnd|-nc^bK$wRy+&(!)E4SMxmHzn& zM33V@SovErw<Fj#OZBor6l;OC0)3{CVAccDMIm;84{!{-KZ`+~HBP(FT#9>an;YuUi;y z-ko|hD>E4HdVTs5hY->Ae-CB-?Ekf(y!MO6tcaBIkDdgO<^F8%o=y7&FE7KF zjQqpV0>+jMM>W`f`qs}rzhcrUQqkT;faSkPC@=G@(eiVHQFsMx_V+(?#xRhWR$_a7 zab8+xF*+tKU(WO6)w+{<0&{r3SI~um_A9_4Aqa=Gp6{$X$H-GNX#)fx-Z~aSLU@1j7qIOX;1Z0o^+Gbv8+ZrK!+TdzEL=D`Ve0W-pG!0bxtvNiL484+Kf^mid0-l^ ziO5bFZULbXO+;VZsANJgM_y#q#crhLjr@H!sWBvzYZzbx3(>WUN`d z6&Z~;^8$@ui@yF2`KOIO41$oO7Vv6AHIXOEOAX^l_3z9>bCmbU<) z;y;dm2ecjucF=*FN2PVmS1P&RW1kXn7|99YHxqVj}w?2WZ~1Dzsqv=X z>ppTFzou8ybGKVOAMpJA$a4J9uo?pz14_g9^8*v9uLCoq)4EZcNskl)T|E3z4r6Drf7{yx6JQ~L@ zl}Ljk4VH@*!|TMHu`G`~uzBy5cA;xtT`hv@Pb8#E!FlDNT$9Ca8aujjJpAF;%XGAW zS*$e1*l<5HDbeepd>i1{MXYD+{Z~r5R6%R*{6|L2@G|=%4B}UH_ z&18k@J`RcTYr0>)Um9r#szbzpAP@!pXBjYzdn(a-KgZkgAQ4yhTAfFrwaZCwGMZa9 z4T;0AhVMtJ9*@8rfFu^NB$i8goZB+xHXrHeM+TA_oO|J~Rk%VN!u9oI4UK0vPbsg) zI3TIu$itGdhFFVxVrQB1+lo>cst^HO5{7!LwBBAdJRJ|+5GE(Er~{#7LyRnf#OLqG zVslNf1>V+$oeM*rr3_mae!hlqOg5T${Wr0xVC#5P*pfB)njBz~__O%J&RQ(-E#1XA zk61wlJKy#Gw)~XE=D1$Mee=`NmW_89EAODa($FTfS7Z|j)09S|_UguWce#5}Uw&9_nNnm&Io}+O)L?%UNJb>jxT48#K~wc}JX`3g}%g02h+_HXC|LRlI@>Ayu2k?3-NoC-FN|w zp#wyodw9fqc+eG;fPJ)?E-&0`cvQMl{l+XzYsr%d)uFQJw+I7W`@nilJRBGwZ=EIg zrd;ng#1Jby&YNt$$~}jTOrd&s$g(8RN}ml}CKx#er(j1$l5*W8>!na<>024j^rAfo zb|mC;x?0j`hUf2_?hqc4V`ngF1FxF?N-CzUbQ=H72yyk1$B5?#5~VpoIxMh?N*G_8 zgh|h6Jdt-0DJzSf7Zf4j9|Yz9LaSrTcLmr5@v-t<)0W;>Yupd)I$eKh zeJ9ns46B@?F!3{p+3>rUnsXZGQL<)}kYwc3|CW0- z@Z{}UkQnC6kIAbu4L!+vI9-!#5Ih9c0t2_dsub$GcV!;Fw{LWJk>y@L%uw6=GhQPW zH_UQV9*c?E?ge6IU=dkq5lZjl?i|E)x_T?vt#i=7trC)>lwC@`a9ajLkOEipFQ*40 z)U7h~AoAQbbDuW0t=Qh!aLUMY^q1Gl#h6NkVyAwC72d}S@T~Dp^5|d^lpw%GE$Gmm zB(p{>w1tr@eZj?gd9S;!G8aPHf(u*UY84JaIwoZUAp~|RA5doGUxTPYfIS_5+yTbw>;j_5gw{(!@wqm6R@6}2O>sq)cPcLSu zPEh^jlR(G(5en3L!y=lHDBJDBFXYj=V^n{#Cz_b$ez9~7gk}XMRQgw?1NePVo*TKN ze&;l7RIB!Oy9HCYzPrK-tB;Q7#sfQvbNNB40Uwz0Ivci)rkk80RAk5$)IY`~u|Q`w z$rxSPB%c)U&%2_OK!kxcw7vyOqL15jpq|@w>`vZb=eWL<`3d6&$g9|e^QLa)2Rl5!BOA+h%f5u8gnkz#LR3M~BX795cX3viV&a<^ zpKCT#Q*zHGui&;y4ApXcp#*6=9Lc<5tw_5A8h;EfAbosxgvEzbo^blM`rLdSTZZ}l zi$8B5e078xYC-(Sh;2lUR@Y%`k!QGEj(^?axlLo|HxuZrEX?>mdoDs%^xNCTktj*R zctZ0_$6+6S_%lveB3d|7mMRU3AJ)HqaNAV6Hk%9MK3`dwxuu_BgDngI;a-NR#z@iD z6y!7mqv+BfRYt|!BH1>0Pbg}hB9oo?5sv=@|El-x@B}hKLKE_TlicCe+-3XBsp(n$ zYilY>dZ4QKH@N!?$Z`wN`UjTN;g$8#O4pPg$_TfSJvZ&XU<{m42!hgG$IvDnK)?$)RlWOehm?LEg?OnE z@9X!*>GE?bIE3hunK$%qY#Em5fl~z^Km)rZA;2fZe+3&l&}1G$yI9y1>_1dub7nho zib6#+6lKLhJHZ&#q}%q7lQkAow9X^s)6d01o|Ctbi@hGxa#WjgzlUSYRswe>;~&^Q zO^nMp!Yx>O1i4fHdA3<%=zF9mNxPl?rfbREnx7)L3vfBc0waD`$3j^Gnc0GkD;YLw z1(NB9-^pZ~mU~>+lUP#Vv@y57aedudqNbdrAqd-A{YV%G30!MIYIUIU zdl*NZ?!NSkbdT9g-pJiQvAaQc7cUJ2d z3%n~eajX$PX&7!zuvIk@&1$$xu}t7m@92~)opE9!jf|QmZG2=M^2VtSnMIu^ds4B? z(hF=I1}BUYV}%oXN55LTro()W`dGgsKxVyJ@qM2vi)9V)uGM(_j)T>>2)p4;eCvjtkVmLw)D3N-_`=6 znF%NyG&cF!<MTNj?5v*FjxV!B_w zuJG`Bz|)WOPCQe&$ncK{afOTtc&te903vx0OeY~-1`y!N!d}I2`Yztx*s!JOj_d

JcF+yLQwtwP!io89M_2%qd$HJmg@6O~DWZzW{yy@`jlK~SX6EI6aYb{Q- zI^$0PL*A8vo_Le`^x6ZQk4nyD1ns-Et?abHRU?LvfwB-xc7xGw0I#rjWD;M6wIfZ& z3i|X#5n+p$HNhLDYkCzcvUl5`eY|}i0Dr}^p(;5n$P<86s3R8sH&CHAo+(ULDp;j& z76d;#6TGy$Z+iCgH__woe$b%|bDKZl7r-2@UFP)K|rPN&9657H2XGv{CKZZtU5}Tk~FCjOLjeoD$^y6(tzSK2`BX3v#1(t zc#jJ?v?_1VY>3}S`m>hPcQ`2K(4Z%%5Uuie^)LA8o{!^ij5q$a5gd8RaO+R_n&ftD zf#`Erry-OzI;#NK_KGPK%PAMX!4EYI+*3X2QA9_3_r6;-w2I~!S!uTn98cA_kW^A5 zWQFfUT=mU3S`~u*4=lo_Z{G9W*g)!C(pQ}L&f)45cNffiJ%^)SrHb}GttzJVPoqwI zS!3Cl`SAGk#%oJC*=6C#2Mxv$o&-Yrz7rugxZngvU;uZ8ADT&VOLC0FUdGI9PYN{O z37T#A+fPGN**9~2@nsXvVH00o-PdmY5*IHfef*!upODpA7B?W6WDrc~WY472aSZ*$;C21ejUNPCkBVz8 z3Br`J^|wDK@49~lpIbzhTZHa-Cd8!v;c#>1aM+4`oV9C_>|JP|mtTihIX>v5R1ZFO zh#GnbJ$v4{*(ii25<~f+DJi(OUv_~YjX=`{Ntcp&^Cl9|C0zQu)v`5pW$E=`ku6Jf zZtTqYl}SDL{d8O)AL}@@CsFfe45{_;I}BJBRm%?{``{fjbC2oIAO1oaS`uIBu-^RN zGTrx+dRxx8+W|AZi-2SDH<9_Hr*BrKdn_B`rNI~L@UdVdcj3n)KC)Fjb|FT%mrlv2w>#d_vXWtpDi%@YlJd*AQzM!ahQwrN|wfcR!gc?R*$* z=x;{DRWNzsdCD5AC3lw&d_97_lkNnzbg*z8lTMm_piIoISZFehA-oo1>)n~=`>Ax} zXLr*F;lO)f`U^qaz$GDI#^7&zDDjxM492aYF`s_@#0HH!Oj!B{ z>_!T1abew$z^cc)A2z|q;o^SHl5z8>AZ-U}Gq$@m4A#0sI3pQb!Cg)M8Y2}MJ-Hh& zMV)tMDGPllJ@~{6E3eP>oIYf{^^$Bz|863MZGO`e!5b8 zx=UCWMBPIrYeRb3b_63WFc<8y)lU0v@48br!_|0vBpv6K1mi9qF?r<@+h@A%=eGzwK>G7m7u~mOK)~u^ZLeHcMUT%8<})-N5iS&`!lVW9!Wt8lu}e1~nj~MU3ac7Ky;7J#Sr> z#y<-0l_b0$cb~?>{@Sag(RwXmBCa~-u z^wA5nD-?m0j~Iyare1#aE@4l$x!-U+GK)%CLtlG={KAq&d=3AV-@G)i&)eX_SmA)+PM44Px)ti*VnqGPF4MR9;sx_4)Etd*Lf#9{ zJm|b6-$cCVY~_|bV2y8}hTeeA735}7{P8o>xIYxJkb||yJYD)R^gIfqCTdb1xf|yy z?Nbeby|c)ms0gpcm{D@|9_Y}Jve-V;s7a$?F{6KqHP_Zm{atJ6FWA(f#0ZYtk-BP} zI2sdj%{_M}SS_lT*lA39Z_t5Oklb}{jYMP(Lj^3fn9n81ZTFXy96R>4gNO)vVdDsR}ogjOVQ`s!98q)we6?lrV>+SQTOWa7tko zXDX1)@#|Tu5ZuRt$}!&Q^7PIm4+MFS7xupK_**1^#to9}!C&9ozjMKn_iuXr8|11} z5nxKZ$i(Mbr&re$93OFpRINK!!oFql7o`3eF6&l`iwAFq_g>iv<%fy z_(-MlMloDT0k%HC*t5S@Pd?;7@60bhEe!2`V92cTL^Pf?cVA@iEhSbmVd+et5KJ8L zpU#($D7=iQAZ(xAh>}V=mX>>-U%a9%s>WGAfdb(ax;gP?+Z0$e!DSE9Mlk&}f;|jd zw=EbHj3Vf}X!alRDsh1@iqlL9KJZ6_Wuz znNjiehxAzHco(|Hc-VS&mrid4ZBX=|i+roRKvV(9KbVX!uQ>wyaA!<3)+fZco|!vR zNxly)Yh7%x>+>@ReS`OpPZk%%niKXvI(lIk`?L3s4gJqkS^aZGk>-0%Cz#Sz%pjGA zC!Zz8W+Ieoq*YTNKhSe=jEiwU%;xL&lra-OCeUW+hPCYBMxqrmV5#w43M`hMIvdqh zBzmF@?zP>$y=3t?)=6H*zrwJ3LQ99juS2t&eR`j;y%suWYDE}be5&@w2c`+Fma@l+{XRn6ET1%ZdxR5zY))5s6G5_vp2YPk*`J)(I{hZZJ? z3}y2w_s=f`=6A2Ve2<+iXPDa9{3SDM25|Z{WDhsMm^PvbD&R|2cNSlhHeALm@JUMh zH^K0Ibqns}=|)2KC+QSr0P5>g{V~Szr0l?eHf&e5GC2|{oW~KT_?gFM&NQs`)UN6E z$jf0xmtFr+rUpmfUh{+3v850qb_6Tnt-2%ES9|NMD7*UgZcW!X#nUPhf`j6oc)O?v z*Eb|UIOV~B)v`6}eD5cqd;q%TeN=^I|Bxo?X`@11Lg^mO~2-xr;XZ z{ypm$503D%<8;OOoa_eb(+C=(aYNmM$zp&Ch~b2{t&U!MI<3isiY=--fr=O^hA|x@ z+Uzd1&?4h+>QUfc!CRj^r2uSzgAFM*G->Y3xSm&E+#kD9dd`!j*x#Jz>%)KgS_Q}G z31V9~0NfxPCO%d(H_KT>Zx59;E&M`rT32X3Tro=fl~_EWQepOf1ypoM*$2MxGUU_q zHP(*|?v6RQ9MZJ9tM@8i{4C-S)3dXg$?bj~X9OEch8J_W{cG(v$`5#W*cUDadXwHx z4!b=oM4w^#Es0}cB_Vq?BUf>O7v(jToTQy$I95<>C;m{Yp=H9Gg{NeZ>Rb4j6Z|~E zimLh!2epsRiwl$|7xV{@j@k=+TfYSviEZpyo-*KI(T3S1>@eyRcgyONu?@~F9$CSm1kQ+Z#E{ByKefqL7`wN%^AY|v1` zvmt@MmB{e17p9~jWWXB`L^H7b6du>*Jr@q%3wW)nC1q?Z(a#mPzJsYEb#1|E zD&}lD?{@>&D{p*)?2Ho-S1RBXnYHi-D$~A<-|{BLq+e7_dW`Xp+S{HyX=E`J9AH4Q zgz&Hdj}w>~dxK4w@4XUo)obKRx5U|wt0>zE?>+i)xTcfxIG{8t+|c{ zb&zeqMi$y>bnDc9;|yUv_;a>KT48u|&-vbv++AebjQFI@~bBMrs`f2s!qH67s zhX#*Ed8UN3%~!WYm5vIvV2*+Qs}+@?PvBI9K^8>|;s5D0VlE@qnH;gOLibb$XS|dT zr_jL(rmaS_rkyt!gzoDk9J)4ipB1BXi+(HdnZsRsdmrER?B2q6;7{IyC}G?gi29Q$ zI1B3@p9DtriK4!_cBX`PYk6~2Ci>*$M=jvghz4Ni)k+QN+5VHJfZ(xjYL?@7D0xWN z&x$lh(dV_7?BC-8tblQZP+w2)In_YVFL7bzEEHyMqm(sSZI7##Bf8@`4hnZ@udw2U z8APdZK;xR^6FD9||o2~7oxWrfRI=<4&~uZH`Uaj#iE%ISF1Y4+yIW;_`x6IB*+ zG-dS0zLGvblkz=l`by>$CFAvSzS0E|;8H4_b#2l*|0+*)dA(8 zwiPdNV4^I4y)7r^;H3J@%jRwFuD+vo>%YD(AZ2W!68-Qz%pkRR&D)aPUVk~k;85Y1NO7D~Mk5Zp)eCG9`1M1lF+j@NraMIDB% zzTin_b@0?a&|DGQNDRxC{yj$b@r~m(fJE?S;)KZUg|7-xubKFEz&zt_1!}X~ZRrG~ zgKfjrv?!y;|Ug=OLd}E6AZzp1j z_RDG9;_d#T9iR9Bykn8&@qo1-&-zj}4Hek74q-e#ykT)58S`c&OX2MvsZu&R$zYo9 z64~$vm7BrE*t#!oTnAcO!~hixibC*^kWgUK1_h1ry?@hUYJ{-$>h7R0XGHs*ySDt& zQhoh9QPp4Ee+1%tp#LTF#Z__if3=uUSk-CC63M z!qEk2Jp?(2`QHBA^PJwW#LsQhRQZ}cK9Rj;!}2*x`6fd&jrTN+oI|9C14w^S2)s$T zE6?+EYG|f@)u1XHN$v6EGJ6e%i`41GHfOmWi$jngtn}bl|D$pPhI~*0G17kJke(j9 zLAqG!dA0;3`i(@Mli<78-^dIpRwDz> z3^5e|=gh$Nr})e5PXd({fe*=}a;lE_??4$>SWp z&rRl+gP5Wan0bNOT!wipB-rEw3K8p@>*MY59)6O&)8}G!#74#4P`30&P?|^QeV9lbm4OEyf3QSLJmm+{jROOyx2W+(=6~Y9rSh`=of}lD(~nC{h+>I zc}#EXPWr`&>df|wM%k$B7Rf}ruD-2sps9n3x&!5wbxmkd^rV@a&t_)F+VI^IQp#7; z7Lnj%aQ3C9{&48_e#fbO8eONCCPO~+=G5K*bO*%9* zc=TI@Ug4;vy2f+v!|5dp#gI>Pe!f?K^hZHwYmE1sI=*bNZdSn?-Kc%I?&5BrYH3?Y ziUiwjz{lV!mJT!8j}3YphP50tO1E07LeyqO{kcqYs#%B`eJ->&!N(qIFcTU9-DRRgHcV4&d^RAeokfR zD-wp;s4YLtKgWPT`lqj%E;@7;CA<3}uY)_a>w^AXPv*EF(zDfepSBaB2`9@>5}?Bj z#BaG+#JO0|t=Skg)Tio6YLwn>1$5WGvJl5Ixg~z=(`6ntOuSJC5^NeP=nnV8xEKZb zGlG>8GQIhzc+8z?rx~WfU6wABpbnm{>klz;*y^l@#uBXru)%J2oyVuo%?G0(E>C9`v+0A1767NjlF_j3D5B+2IaT5jMr4 z@x{CMjy__)+^%$e>Tvmg6K1gL@)(9E$Kwk0W7EPAGxxQk@hsXc1~k6{iCc#AV3`^o ze5cJy72`+p-y^M}uE-x>GEJkFN~^yqQ%2ROb3cOY2A*3Y5n000f6BVFRcytAh0241 z`Ki0QA4}~VdlK~ysxO?*%cO-@Av|0gukgsgPGGi2F>Q3F1a>33rjt`hjlg-qW%Bq4vK4sV1&p;qKEi%C{M^g`S^9G;$dD<-56(A{)!v z->Ifh&btJu|4Y@!m!ZD!OC*o)&$5>k-@wf6ovjBwGQSP?_R$oQl7?8|s=iCXGt4Oo zge9+gs9JOFEh!Bt*gELk5t?+m+t$aenhc4(#>1^Ox1}L?PvFV^e}vuOmMNN6-B#_c z2{zgheYgFT7w1G-*D#`%jW)p!yN7`G{IXjDhaPx%g>`;3DE)L_^qs#?o1C%=f7^&P zIz?Z2;e0FTvGnLnV($!Cx`Bw~m*N2s%db{^=sXS%RJP}2NF(1T(eGburS<4+`{S+e zN94{DMk_e-Hvqynb+8&E)NW?lxarexQFz?RpL!(Og1v+m%?b2`5rm1@U!2*ffPtg% zWv(3#xuh41{BfwFCnS*iNYmZu3UB?aEE16UI>oDPoTNQp)FCLc@f=y|In-LiG>^Do z8kyXuq~E3-WfsPXt3hjTt`mIb0xCo|^FRgN7A zYrQ!xLJe;xjlD``7m%UPPw}HnpoXO+Jx(=uX8W;3wxtLdDeUSoCW>uCVr4)o3n%Tv zWU6SbmWGRQV)Fc8aZ`))JNGg@wxA1e z%l9emZ9++C;a~~vx%#W1W=i(DmMZbmqq_FH2l0>Jv|F7O^vV3 zi~fZ3V-jkQM?qlVvsFGvq-ZIJav&BWMuxSLa?W?EAg`Xx692Ae4b8jt!|T~`T4z?r zIll&u{$3vA`5PpnH?X&}VVy88;`=FHt45^w*PzG7ob@ed;%?%aBUn89dKEVz92$rm zz6$~!38Dk;CJo=2SBkLp-ShNHqtZs+^8Z1zN|oi;?uIQP{!8HkNcI6Hx8VCHN?K@< z_i|*u9?3}wmv%&-=m(Os#5Z1Z0{#oep1?g__pP`qG+lU4- zqUQ>3-QoquQxWuyWWkp%&A6V?c1I#rgIoAc$;B^wUdVpq0wH@D&{WLX(52R$u5L`3 zyBT^+joC^jv~*}Q%96gF+U4T-KXa0vgG}O|T~{#iyS`S#{;Nre1Tx)mYgV#Cj9hx2 z#RN0KP1vhuHQP%L99lU2b-2UJhfBG-6&Rl|Q7)Qhb9Zr_-QKZb&Tf&E2VDw`K>_1o z7*E=aq^!P;9QH0=wA!J9B9qkLtftP8Z-(thryj)_4PFYVHMr6o2y+hf+MJaRc`tu% z$KC@V>^?TeQy6*P`;NZDh$KZsXOjSY;|L~9H&3!Y;$5*>eUUo(R9cguz-&#+Ht@Rd zS*#1q$*iNjYc>2CqhhLQQ-Ve>?6FaI8Ll#i-&`Q;&+03&mg;}3vp?;ijXDy(f!L1=D;YZqEsT=X?)sBSlAE1rc#*Ak< z%6^k%?u7sgZ-mJo9bElW8Z9JNGxT7f@N9LqUS^wpBW;xvvIo#uJ zV9aDv`TaxYL}`S^_AH3>=kXkDTL`Se3csqbHfq9@|BcIEvtzKURI6ivcxkOkB?0jd z)x6OhHR7Q?*)MG#83RxuIC#NIH>CfE2fNefarrFEX`MHcg?S^43U9rU`JH0okXFu2o0$p1L!9Hr=7%{ZjX+)lr?E-3V5kZb@i08Dmx>c89INfc>m*Aa*o4W-6PfGg3EgjpW@?bZ zd>i783-6_EP@QJ^=7mPOTgX`(*07UxnC!B z7m19>2Z_7V5YGj~r=KT`%!QFkMVUo_|9}uU5Wy}428frUeelYBe5I4}V(<>l%k2(J z$$C_tIw*E1YT^Q0-{YSNyhfxj>ri;6`H4FuE398I@3UxHL2;%*IoY8$&ZE0n_OweJ zUyq~Y|HsG_xTc(ko?;G?+m78|^BFR%f*DJTQxvKbyeIuTJs6#FKO>;&>qr&VLYb$1 zr2DGkgQh2Q*@-B|e9afwK|_`Sr3%R4hQM1;P5jbJG27A}$i&kmXsV2FXTl#?pH&&xf}FWnPyUsk^dRD1+eLun)lGvC_w8NhAt9J#?F!c zSj}yvt~CsIa7^7eh1Gwn9T6D$kN(JX`3a+X>@msgF`?3~A{!PTzgsu+EOL?%%GvUL zJC<1`M44?7XkH9((jy%JRn}7+;-@%J`RVi?!k1$EotYh|@!owLq!9UqpV&9OTZuzt zPUafGbI!*i1B1hgrQ_Xv*PgGqQzZ;9PURd*A7Ap~c}NWYsnACzclXq3%@0JIb9=N)!0DBRVdi zGYtlM5TbL_^y{xg{2~na)8$FYa*=#5wyrr2`nsgO&A96oR?G!PUJ+6o^MH8tq~q#p zUk8O;(um@B4}#IUzY2@jwGUz+Kg^DV2}ZBBTm2pQ9p_-s|2J}p7VFjWd%G$6*G8T_ zYLHZV*h0uyB}%nE!9nS$Mud-rb;St6sb2^}E&+rOe~*bxxOh>@!w<&fFJnHmK8veQ zl5mcD`-CAsvx&i1=h^Q6kI>K6BYsK+f}BUvvVl6PPRagRl)*P)A)T|>!lVtU{T^%? z$baMyF!IRjqruuzaBC5F^MvF}SyZ;K7U5%FutF^{$jjAHC*jFEGIivXC@!0C-IO$AXkq-a#_7vG-uyykT>iy9}togXIS zxY(HLB>4fvR>TX8@YV-i`@feodoe9VSLNcEwlL^_g69=gB5fEN`$S!h`%Czn^pj)Q zAQF5c5y0r$Z6D$|s;{KJHNoq%`b?{>skxMS);UXC#aY}B%N+kxra(8FStcre^8C2} z#UHP3O31gR*9Du@zsGBErg-gvAjhif zctP)~QhH~FS3jX!a7vX~W>0%A>62=((vK51i9IcV_m|Rm;9lyFSiRheJ>P z{tPz#@6{^kAy!}79O*Td4Q&nO7Nb6M2`x@A#nmZ$6nYoG%?`jA9*QL%RPxk2XZt|E zldvB`7|ELpC3E1w>YAE-!GLyZIw@p(^_PJIjp8C>0#kdBLJ;$X=gl5!Tby}FT3h?q z8t0y0`2pBwJ+A=z}DF3B>hR*6N{{tUkEx}tU(Bcub8r+rWCvJoOb0} z;Z(HEM;|#ku21HwGDoh|HeU{JX2EJ7*@ju&@u;fA|R9kNJ4beD9d$sFg2u*-xvF$^nTw>rfr4ZvO4b z6A+sg;r5M^CsV)jn}S)X1N}mg2j%>t(NHbBOad;J1tV(xctJB4A!VNi)dG;RyX9fQ zI%;iasmJG=?6jgf1Mg)6FzS{Kg}ey(IJsXf&AR3=gN_;sCK=dL>+AI8s3@-JM|`X9?kw3 zzjXSNv_}xj7r`|XujF7`_7HV4A|h;|K?BT8)DLO%X%}>|3vrg48DD?sD;dkBdFN}F zS-r5A03re@HW^TE1XB2YQf2Kf9A?dG2IkC(P?e#az;L5CjSX>H;^+-mCnX#e8Zr22 z+NSt9;oE0=Y^YHEMdOFxa4vEek1TMo`%7@LV54A*c6R!J)em}y0Yl`(1FcbGx$~{1 zXZMX0mBbUaE?&i7Bbfa&r{OljhmQcH!)qZQ@EpL#=La-9%o&nv@O~<>9Q%$=3(WMjHBHeDJ8Y~ z%PQn%X2p%R3}PpuMMacKn-2&1=eJdo3cB<~+?0Hm1@`zMI#^#U3u2)^j`RbxTb_<- zOH^;0sk3%2VHNN^nk}!Wg*jEieJ@(k-o>k~ti%z^C}f*X5~*=U31K*5$$v#xM<#j6 z4ICqp6b~|B3ij{+R9$G1)}sF#)kSNo#X}3UBM;-gS3ya*+s(RX^1A7>cj$VD3}VZ8 zdr7W<4H2Oc!1mWs37o<6HEC|Dv8;OaGpkPv-BwSDoiD1t?l{I|b+YG5?UgK26%7wKE-v~tm(U%uKJ8nwQ7 z%e02juk7#4FwqRiFklU_uBw2|4vT(|^+9|B#upCuzI_D0=+Q5Z6cmc^AAZBWs?*@! z?J%4q#RY0A*Z~`3Kv7xXxy#zf<+@}-s=JGa>Gs$!+syD@-m=u9;S&fE|Ar^BoTtle zgAPren*<>!PV}Kc&q-Sc7JOv-Wa$O@H66s2jY<12aoY{1O#s)kLUm>}rYm1NP3R<~ z&0Kp+SaF9-wQH#NXz>T#;`D7$Qe?rkjq-TsYw<5b#?5&hB7_)KzEbmc)T#x^bqCX< zgsoDM>qEBart}LCI(3|727^^@@bX0V=c}fv9VQIqC6y3^ zFU4P}u)frj5kC9l%uFgy(p3u~sy;4(_uv%+?n#t=dL_+D(TcN!y_fUWtSwI(xld90 zMyAx0fL54f3|^S2D9sXX%kFRd>Z3~gERwK%Po&c}Rw4Pe)71XAmIH2mK(TCq#U;Oq z3LTApn;bDeq8ENcd*V8B{Ao?AemG6nIR*$Ua4#s6Ssta%z)#+ys!Kj|>4AHK`^GZE zxc5y6#!wEH-&b8d^D_94v$$5Cj^@3q>@8jD_ULep{6XsSAiL?uLa->4T*n5q33R|g zf`O6NXv;6^*8CKvGyyGjJGbiDFUl+fE+QlRRpZ-F9$Yd}U@xkRiweOm^5E*2S&u)# zj=*L`#ks#NbkZ$EK`ZMH?gEP#7J?Qpcs)dHTG@kRSlM?U7ZS5$Z8Q~KAuVXpx3pvT zqU#V?Ya!6Bv_Q31_sxRReBV6r%rz%0Z*vwItGu(Bd@X3(|3}$ZhE>@%?b6+n(g=cd zHxdF$h#(CT(xHG-3y=_`yBkD06-DXpZje%tkdhRT-q%_Se4l6UN{=Zq=am~y* zGv}P+Dhw6Yg=KhOj0Ms{XXiI`e|yTKdLo^qx8Bg{z4t2TF>U73Mo|E`3`SV(BcUnD zrwu0DqgayddqIx5S7sm3EgaOL8YujHd;VH33@VK{z0T)$BVDMf^ZCvPTI)NhVG0gE z#Ew4BvIkq?MF&8|>S2Y_#gVM4lwCIYQ^khJ$cMx>MtZ39e`-IMhdgC8>3>}UtokV` zRB|N<_f_ZG!mZ4tdY{w=9lImT{8*XiUtNFpe&zu?Q7&@k(Fv}4TTmu|2$-UUx}tR? z&b1!Vtn}A~DC|>Fml`hIwr?KFhPOKVe$kC_GJy9xzz0IKd9|r7fT}Vof_K#6Eb12+#Jra1Ety&>kvjS$qwwEoUswV6OjX*D!8LA%YeY#Cus4iUEn79&BQ z9)zpbe=;*3PU7iI{1+s_&I^k!OJ{`ChSd{xzW}BbyQdaAUvUp{y)zsaE~IFMuEW*U zY$lY02OXP&;WjAwuM6|{ceakT9_ z6{>25(*2H^x5=KqW1`P)xcu_Xtw9rh#_|n1JN)k^8-(wcZ|^Fy+skz02&rXfVJV^J zhX=Upr6iPJr)e9pn6A`gp#?sX?02!uEEOh^;oFqtQPbzXDx~4H`qXLY{V#O`BoVJq zpy;!?XZcmH+s?7QNF0u2Z*d|_lX((0-7gp-Ww@zVcn!6{=axsi84KiQ(tj+a_IFiX z)HFgod-j7A6&@T3;bEi!ZBY1;R<-(a8ve0G@-$o{X+~F&24~`vqjZGP%2-iWB#Bx2 zKYma>BQ9lI^;z7p3&zpRu;ryp&@0z=r>3(vH3d>b^FT)63O)k1b_AHC)VnV#`c7L~ zthou&bKk#$Q~*2-43HSLaFxy{{mI$2or#*f5V2pl6|>Ei&*-auH7X|P|kFf zAx;2_q3Y7tBCBREG#Oaf_(vNQDnwz4z{C18W#|t2*iCXJ0(PT$)}F?@qFUSWbw~L` zXC2p>s|{kv?|r3D4=4 zwE9Qr&JBM}QLmCroZ*zwCxKlHMgK@>9LU$C@%B}nIZm zlR7@M;G}+$=LU9vq=OqX{z%tG^@c|}B_fX|oOY3J8VoVH%$6W@ab4(YC3Ty*Q{ z=Se_aLioxHyghGxY>VHz%@&U*qA_TgaJi&N%08bF+`AfsE*mBZ;^0+g3(ponNwLG% z)EFt1WJ;UgE;%EpZXol?3276fpibqDUu3cLq<};X^WCd46p`!-D?{$tk_`Lg`f;wm z-z=Bs=L|FB$*EbZgJJTMdzesfc&cVedukk!-Ht07^TgTCGygZIj>m3cD6{o$b+TI@ zA`c7v_b&QMQnT+p{ubIHOjEh^#D^KPj895Sed&;wcqo(H7rY2~I{gX>x~dX*jc(L_ z_R#luA8@`jX8o8+L(Dp3J&QP%4`X{9OhC9)+ymJD@FE}WAL?K?38dgbmS_utJG+hc zgVx_?)PIbiY#!O&GlrI~VR z3ErV6TrY-lP*2RW)n3QHHVMf$@(sWC6(A4DMWu=eUzFv}Ey27goF@oPo+7ThSoHp>TmQ}ek8Tr zt#*REPdDg8r5}xc@t3C|q5t2a5%j>CHCfqNVNfM#TTXC_ROcB*&yUF!AL7)Z=UTJG zH-RM+{~Z5?GB7MAQsXS8KV&p;6K_0E0!bPbTTLYB+Q(V>DHT}0XhvG>$DHWVORtWDYD_^5T`CSusBA%W>r^F7Un5YCDYZ>7jczX>$t|{ zc0MFhu+6p+;1&`>FV5RP7p&DK3{ed1W7-*6fFrlivz*w6r0_wm9vs{nWa}D8@;VuhhPA zFbz&Ql&S7i@s;g6I_k)h#8CjH)MG@Rrg4=Mhpu?JH-gP!UxbPF4f1%_RJ zx=`L_EY6DC`KxSqU3AEB_wcN(>cLhUadqygSiG8VMSC3ckp(BKNi zQ9Y_kx_3xtKHxNR*tgAZk8}Tbra%qNUGA?>fdyW`V-v#>gSlm+!5>rXw^(+N(j0P; zft5Rt^KiLLc(YjFG7AV^kxCJrp`aPiO8*u+xrnJGp6VC4ch*E$3p*5Iu~hu-VUkEC z)eR|}L+&Kuo( zg&Iq{pt22{3pA??ANu)P^8vNmyY-BQ2`4xCEXs#ft%pcxp*=wgt5+ZNUoz6RbY9cx z%)d`1=w7>rPkH;EQH%$qE*{?<3fajsB)kEbZ-80^4kGRt#P0URkilUZ^W7UU(G&;t zv-utQi8j^C17<5js$V6M0TXH-MpN8-;fSL#gQDU>`603&A2l*jKIZM4?4@FKv5_%- zQ1Cs;g4P3}3hRFxT_2uexBfSct{(q%_O>jYkB0qAWO?>D`?so?^C`*LSIhW5jEc)F zX_PJ@EhyOrx}Pq1aX3+@iRV*K#+v@?*=`E}pV>MlzOTB?t9uU0UKbL1{6|D4^aD-!`SX(wB@X^!g2 zdi+zNx0J9KKFTx-b8-U?w80s-ozblg>lq(yZLtq4PJS<)ZBJ6CWVav@rh|?$c_1lx zK&FI^N4Pxo^{0>SDaOV+-13Q3M5&Xt~ z?3~2+?yMB55jRSj&C(E|P|aoCzsi=qJdvP7mc6`BWfRQk`i{C|qY}6^`ZpRLn0I1Z zOr0EA6ZJnKUHJDxD~a+75=Q&8@4{R4KWmOZk+-I!@f5ayD?v_~^fkak`a7fWfXYW^ zWe2~hK;{8wlwwL$NF!$g)mVo#o^s0@rl#NEHN&N@a3P@3do`+1x@ZQW7!RpiHJwBqseZEZW0hVv=f6Vhd{>-ThaPPrtuCeG^+IauK37YSIf(Pqlk z)K-7PJMkKWoNu_xl>rr@W~*{(@^;6vkjm@{*bDowrp|K=C!@e8B*gbRm88YHJA=gC zDafgcYJRgYmDt<$kxd`z5?+-sWS|{oXb0MCU!5b1M(ht(OoDSx6h4i#$WI(jXP#<@ zyu6IZh;ks(!0C)I<`MKvo43`jWE_O)ckxRgapc4;%T;L?x&n#Kp$VjyWW2)HrymMu zU#N7TyP9?jDWkEnEGk%w{JKez>5CUdZE7g)l}!AP({D?(G(K7Q6phI=u9w?%-(A8e zsaakqlAmSmMzg4A+dr;+;ke#IqL`SAxf7Ugu(Kr?bII?JlNIuuz8~ga-y{^d#^U$Kf330MAhtLy;^K2? zGb-l$6>c4|WH@PwGskch+?-xjIcek3emvw6cOjp#pvDf&2!lv}J4$1T*bzxxy?BMB z`3g#Z^+kP-@XPwbJ-33#^G4juwIFdLE<^;A?9F1eZ0S@?(58aU@;U{e@(!TYvq+I3 zkFy&wX_Gh-x2~IYwP;XwMaB`^-M)hX*V+%Eu5`aGuPxB^{cTlgt7-=4+$MV!$7pk| zz;fRghEo8#;O#U)B#;+@Wj3K*k`r%Q7b`pnUR!;$%qNv{6Jv5@H0e&Ui5bM%11(ZG z4vna^(qj84TdmUW%1@(>A-;}Nlh#7agBi)@8HTwx{^SD2cmLP!52-L?kN+mw>W%fp zinkhhgs9zbI^907|7xpilKZYX^>!O?x|20OOdXbwnUB}wzM#^3k0WMg|19bM=DYuUGjJ)!0y=?53yRr-JRyz9Ag>Pf^mn3o z%Uo>L`Oai(pkB{GVH0x@f!PZY1`Lwi4s zq!dqw`56Zh@cqL8CLyhu+7p#qsx5Yn zzD@ISnP^zP38aq4ag$2130S>yf};U*5e^8h)_?4pb7-7-OjAsnnhP^X7c4lJ-cr<< z*B`ls`iT8rwI4{P2yLKYs1J3zXjjCC0nJ4=YZl*;jlh71fUS~fzZrq9s%B98SHJ|2;vnsFX4HkuwoE6^Y%7Jr9S3GnGWvh_TKi`XD~m#?0* z>%-aI!@y{&&7?e%C$#((54r|_&k$YD!+OCdd--rRKO$l@K3}1ObnoVyP^#Z{EbG<2 z+hmwb=CE( zywCtELq;Nd8}pP({hkOT<7caHUbN5XEn-*fp{wt>(bu>kPj1w_ybD?EaUKGPVd|GlBD?r=svullaJ9l67{6OWA}0BScOpvtJ5HPjgb>|i z+m!12oa7{Ao09H16jE1#)Sr6(xaHfu!XgpBuQ#wxAKIN2zId}@?C#Gqu^l)EI=k%% zUEo=kxgmj@=JnAK;S{sNID2|Q%$ssPZ)fl2b}(>!v1`lUqZc6FBE=#l#ezimPFDTQ z-yNC!_M4obC-D_&08WFkIY>6L*;C6K`~? zx`i;2>1HAF$Li^WhZDo~2YFvJX>}MD)#{em&ol2qVwLfl-T2OU)yZ7l+P>9GWmH zJ9Hz}moc#%+{aHy#9Fr-?nV6w&zuYEklmbZ?QkQnBuS(R`CEHglIr_YI5wGOYNIvLk(Aj0fqWXTQaoW`xP~QgetK zUv|-0P^Re9B_@$%x@zCzpcTp3)&6>DnEK0XpCIIy0AcF!|L=;bzHW#e!lIfh+D!L5 z1!DPP!4(tHeuD91RmS|(*+RmfurT#MG26e=M-gW(m`mjGbA$$cl-6~QX#N@Si(98u zS~6a@av#oYhZm<+V2!Q6x@3nxGTa;=2shr59rNCl;(tNH^HKH9rcXecBellDObn>f z!@cbF`c=q@gmC>1OFSc@(K13|8gmA|?i@x2ir8Xi#knEM=UY62@N5TO_vlBJnGIK< zX5*_xI=^3=T07EX%kk!!?DS)n$d^jx<8q?b?l z?SPwst^VL;YIfQ7a-+r@a!w8Cx<3|l(<@Qoe9uXy4nsk<0u;^vIo1fgxPUK@`|2Oh zID!E3tO#V4`$PG9Zgf?LFPm#RI6wH#0U&y1~f>5pMCfOkJ=5x$ZdtMUDLfuW9ssq zZn{jbiz{KkDoJLU@wF=jjV^TvY9|#!+g;CMpIaCy`$@>Zy8NcF(&L}|GdfUkX#B^O zLNrV3I|{OPs`PWE?edZRsTY}a=?5SF`JVOp$#TKL0kD2m*yj3vofxB?bfJ7b={r%9 zWg;^it?iqrC#NBNd=DR>w5)f5kYs??ZQx|wq$_CWc6bYoZDKH|iuUsY_Q(DDS6MCo znZrM~7Ab(@1&pgp~-bl%2p!(9C5aM za*X+TiPgdW7uTz_0iGHx$#WyQ~lqimnk6yJ!A@ ziI}gI)oi&wF@dYgekudPX@TR&6 zkn#tw;j1lUC2t))O)>vB0n$-f>4)d*S*hjyj`#bh#P@xUugz;inJ>uPb?ZdbIWSl7 zP@$8mt);Rr!2fK`#$DFSg$!OBKL{1hWAQ+3e&o+EFxge|5aQ_+^!vFDnQ=a~3{Bb1 z>*HL547t#vW3I?em^eT!*d!n!*nH5Kj!<*9u#sI`Ec?k0w5U%aP@sY<1DLzfT)Cvv z$kEPp7{syOw`^IGQ*EUd!U%0i>SGN@0;I!6#2Vq!%lPv%m* zP3>1d|B@>S^&!yt+u0h%BpSwqkVRX*x_63XKN~@G{}VmV>%*Jakr;> z_jv5MBR}L}{&|8c-{$h&%q}j!^fI3>ih0f?xtaIvaYRAdfjid`;?QSezX2mF#NfngM`QRvjNIM z7P-|c3#pGc#|(B~_ysOewf(;7brRvEsZxBzD2M0^o(&#~p!Gd)x4F4V&h-J^{FP^n zpM`D^BX|D}V;T~UUj8mW5ig%Yv7RWko~Bua+InB|6s z{K)HtJIxD0#xXQMag;ZI3=!D@aJMCh)-MR1v|6oI|JXTI@Y)2mHD4jyHvLOluBw0a_@82|YKzRe83(BsAn7rH8v6jx4{JRh3WB3q2(2D8jE zOkQkO+xKAOE!?Jvou za=T5Vs;Mzi7jrf0seF{!1@%Qi8p(>}u`{{SOV; zWy7Yp1T;L+1V^{%K0pB3z8xM*6&@HRlrPkHTv}g}s*BAY=zjV2kizmPd)#W{jidl{ zQ0$+@6krmMypCIDI?p#MHsyFZZBQ3+68A@HZa5tRT|JL4-#5YOg*91KPd8S_9g&{# zu+!5=$x0zVR=RW_Pbbo`vz^!87rkCv0=8mlc5P-dy0XXT=p=a=8_eHS@IDLp23bVt zT&Li3=N<37XvBt6CkC|wQDY6mXGGg}t5NEiR9KZ)a;X^&&q=z~#-6H`>4Ckzu%?q0 zS7gT)lCm!oiHl>Ivpte*9Oted( z?TlW1LN8%hS)oi8?KKtKvodyF$20apIZHgWWz9E?P`V~!7YdIa%Bz=31iQxSY?Xj!c-apL{ znlu0HPzH}_CwP%@*8Q%uP|%-M!NDTXKCRDI`Q?$Y+}mjO7IY~8S>yS4Z7-60GdC-o z?#^e~P*n=1Sd1W>lS;|H)xJ*KXOF1uuyGaC`>pGyBS}3m!hG`zitI(-0Tz% zeLnJa#cZz@(-stvaQ(Q?ANNF*HG5i*(!-W|=+vc#5`NKV2F~Pogc<9jY~u;C{I!n- zi#H2+eVQN7{WjUt9yfwt)Wk=tzg2l$7&Ejk7`o&U`&*eHzClXwG3je3Tov5PYYPPv zNX-lMN6!^V-DWGLD0i`mva!7C?r&;VS(aG=>0${1uYiE67NW7~g7_;WJaJ z5RF2Ygw9UGx88fnl#Jq{DJQ?MlEMEaw1HywKQ)zSCe$0N+f5A09WU0Sp1*ELEE3oV z6=)ks#N@r!o&y~B?|d?o4u3|T zzWUWpJp8jA)x&*$j-|UO*Y^NwaJz_W$8;St!Xh`rjJ`$8$an_mk;~UC*W{72_Yk$N z0nZ3y?;lifGovNNPRUC|HkAFusm5AIQ7;i;Hi0}p@5x>XWS!VolpwuOv3zezBfw|R3 zHOIF&)22D|uvdsiBwZ3!T#qSBx>*D(pJ;OFJ_GZ9*SRc=OymV;#j8^5;3E9=vru+M78bXT}pfCh}f2k0hP;9b>rgzvKRL=8;2R?}&Ro~;`irzXGU zLF$&LdEGuIxe7iZtk?;bIDym#ioSGyWV|v%?T`wza%j?le3-C1G5jI;1V6ysX8zZ5 zJ>aNa^$TGuSD^hunEgXvk}j*L!Xla2u;gXcdxOSwX--SZxD4Zn%KWqSU=JENM^XB*mayK z@`Xx`Sw!L}J9tcXqpVw#QQD)DXxtD?vGEIt(NJ@-JG-d>LpWmGQV4hYZ7#Kh4 zLq$MH3B`RiV=+ZwL9O!?udY@M$CBsng$Vtjz%oel7iA> zKNNUVa}(25KH`Ou1jn*oV||&G^3y9H11KH`xR8W8tU{7!&$~;M`45?5R6ZW0v~t&4 zEsDnOn&ytT(Er2Mvv4d1h0eSt%p>35{!(M?Ya5-Bw>`TlkiX(u6E`zB?($@KCzJhtnI1c%u0xu|QRITTfX zSyOMGkr5OMA)!P}>#6IRZqUz_JF$=yD-d#Q#7F@V>Hmr%?>HpiRqd;n z@u{lNol!CjbpEDy^y~nPt^GgLzFvJ^)-Vkvz6ZmJbg|tl1&>POjXW|pd~Y2Nnw)(C zrGu-O_qQ+G-%S{_)O&c7&KrxFyW#CGGpB}mNVHwDJ*8N3BUEAqKu63m$UqMj;sU?p zVDK?lOhMraQjP0mv3l7L(R+&3lSe`m;CJD*SVBPkff0rNBOLKl@uoeQN?ohm&1{CP zbF)mEKjrc;qZIocD%koXsO;kUxbx*;+Q87riVoK zlr@63rFK7Hw`9WLH(YJvSE+wGn-uDm|)$>yQy3#rDlinDGfD!WVl`*pJ}<9lEn7P&Jn+ZR3O9?2|`e%e%}`C zS#;Tu#}dHI-J`f$yiZGrC;DUjMTXaNCGf;=x9^2^5yMxe0zvJ+D^qDdk@BR8zBil1 z(&5Z3(JWI&BECz)wzeLna`LpBa%D`*A z6Fp>4&9~jauwhhQ=4S4^9vtm~(6J|(-iH?|i)p7h_lR!ZiTy%2$O+cenQc z#`Eq<)i+bisDC4b&iYF-C3yb%cfC18+$V5q1AGoen&QucXe1ODOf2+Y&mCP;n1aUb zzJ3TSD9P|9ygBs=P#aF*vN?647-1Y-N()~VCFNc7NTcsg(B2|4s1Xo%^X4^*CFzAr zoIaR0ddSEl>Nii}uhG2g>|B1QB#Q6dkg231wpm`gARKlne*5iMG2Z!dJYHLmu_*Ni zt`!G5H_2|5>%<=Vxtc$C|FBhsJc`gy_Q%>+0R^Jzi^K3ERz&zBuGjT;m>X53H+Ge5 z{h?$5uW(GdB?b7C56Ei@Ar@Zf81r2O^4qJDE-j!V$TeAUXf;Y-wUY6HTW{;xnxq!1Kc=qcbc=~c!wlt7FCXf;5> z1@E*!`%u(9SNyAK0-k?*$WYrufj=rHUIkLqYT$A>zsAA_0m0q^2^keJB@Fk~a3Bh& zL9p>qy^!s#3G|J{SpsF5H&lckAJN*j^-s9=!x11L+yQdKe$G}M9|6K(%C?sA3ic8A>zkR9U!8wN)a&`w5 zK9ueThc?uxG+^JZk_2U*K!!bwGo`YNY=+ppC>Zo<-ZXGOiZqJ;Fu{4s;*v zPrN)~?iI0|%=apC{m;S=sB;eh86h+Z&OAjzp2>Bz^>OM}seD)L>9#mOkBM7{Xsbdk z+>rSjUR!~aY+?Tq;XwdMqZiB(Js&Ffw<>FGdEnRb@ROHwxz7$@v**2i9fAOe;_wQ` z))|g=m3fqI2BCQQ*Ot0R|3=m3Whs_$X4nU-1YdeYD7_C0jq7XrLGD=11>Vk(kS9( zX8?;_kDCL8Zi4_t^&?pM916Gk_2mAqU*CGX>gCXSpW@aZ0#uXX_+bwiCy~;lo9el4r7!I8O!Gpm^T@<*e6e@u z-(H~(-aL}|1-CjXD*9)1Vx6{$i5g|B(d&tHe7`Kj-`2E{eOz*OGJJ7$(BUm}=%>4V zyy5gZH)GxUr(HE zMYitrf@?3}OYN)9-jZ}nAoPjSp#0!5apZW3M#hF(_yY}sqlH|n1SH5LVC#HF9*#6W zV)5dAC_8y(O-gk$Hgg_FhK@%VCB#z5ajXWL6Pa#ZWK4Pid!|U<89n9 z%V*M2lSuE)OKv=51e#n|E{Ep@fHY7q&5iD4yV5CMs)lYkndR`ybJ&K$#isN&nh&*3 z#?Mq5KN(G-3pkm=?hS5AHDmP9Wu8MbZ8Q;yY5}t^`O?t`m%*87Z5MMy+y=N1@E)pD zV6BV+8Ff3wz(J$O`stQ=GWFReFXv3+9G?18;S2)`##SI|X&@xzY3pP6R@q=<6_0zt z3>33_T6WEt*6H==QKm2XKTjK+LIC(qZ5OJ$-0_me1o$9RvN5m}D+(qmTGqf>^RDVGZ^T}__Da<5;V z)%a7d`v&g!bCjD)wfklHF3NSCHW74^FknBD$Gav6!J+6V@)C2Y7AJ=?Ik6hq&WBwI zQ=So%2fRq7Oc%>ah*I=GfOZ@KS`r*ZJ<>SI);t(o{d{j&D==y%n&y;d?bm|B8YY`M zFNZWZ$garNu1;hzadyk-2zSp~bY*oMcr7|P%%4e)woobE_a7NK)y+O>hG}5XjcR#q zQ1(O$bTu33pT_ae2zAG4jGbWynLRq8@jC=_B3tg*r0&>|TbF5GI03HFvu!$yb2rb= zUa-os^nN1ga~UciK+LfNGwHB8A8ZE0O9W=aOle#C4Y3DLyzGwON6U{S(}U$O_j~bf zpG1%Kuc#9s;%dSn8LV;jud3k0=H$wMBN8~umSB?{^2M?DeH{M%+zPDfMZ+Qz!8Aqv z>N*_a!{_jgApaAUf@{KBzWa+`pQIofqZ^l1$7adBy@>vmJ^jd{fYUuRc;gD@%dZQ2 z5GmZLTZ?iTezC|e$cSkppG^(*9xP7O%=ZuMJFpqc1H*%_je;pBfn@KmOp(m+XcH2T zlg0U=6l#gdrh4pVN?xXlVO{a1k0OIR>tC57;Hw`Fd$M|3sg3uvHw7+Pe8^R`y0!DW zFxf4Wiay7uSq%UwSibP6|G>B9WoHu&b6NP&af2WoCM9(`13kVr8(;CCQZRXaRsI5! zLLk7|+dn-RX5!6XM71>5!;9Gn+VS(Zqu6`dIFp3yyTyCu+cEU);DmUndxt!t5j1ni zvx)BrBth5Rz$9wvCqnbs^0YRl;2g-T|HpKKlb3g6>4pG0b~C8JbjTUW zEcjmhoI^&T=)2CQpxS8AyNSp{SruR)z$i1dnrAz3DrG{;6iaocN8Yka5!oOB^j~;5 zg!uy~T{y}I=`AU@vxb%Yz|IZIVafFc9YjAI{styd zbiGP84FVpR5+C4U@q_XE%-1gozSr>$Tht&=H5;YsRM3duyxsHd5BYC;MDSbC767Eh zx|~l;oj}BmGPRPx&NH}=1&1?Cr**_Zh6cmc8w37ZgS2Vl*mvl=l*-n0Y)jV0-X&40 zKP&khjF`l73^@la@v9D72C~;56ll+C@b$OjdJe=N&xIVDij#V`9nB!3VK0zus4CZ7 zCC2x`fE7Fuh(drS0xH!=@GVZ`O`{mAAK#gCqef!-zO*#Yy20~(idjYg>nY(%-fpgVYWvgg4m5gYvVI50V9A-=%9{4Vcr;Fc5IS6l~>fN!tGyKJyYaG z+mBaK(=(iJpW6@DIjH|8wD26L-bw6=F7r3n@7?ZAEl5_;<@w}9f1C8`o|2=8H%-ou0l zIOALDp|ZTi#z$w1|JWQg*+eoV6j-y@err9|itY~l6v}DW&{U-udEGJguU!5lFsRfW zRwhG!Tcha%WcJ3Qq>Z;Ewr^!df_vIxbx zP@n;%mB5mD0E!y1A%=7BERJJJ&!2M0K6TDm7I)-+gE%!jx;Q71Y%nYT@16%C*$;P$K;9Kl55-k?5gc}{! z#H>|W7d48|WrBL9YgCRtQj!|ln}u*p@tSTY?m^qW3&_tGpr6pW<}sfk-*fj-mWWNK zFFl`*Sf1#zHDu+|l}l#5zLbW^S^$Y*2`nNBEXb=INxM(9ibJQRp;|>@`FZ|d0}^iM z^G}}LC)=S@!UqQrwie5~^h+n^mJ5d3&w~_qaTGW1nOMuH1A@x*r}k2DbVOHg&{r5q z7zCexMYvGx#&FR0`u`>ijz!#C9gN&FLeofEP&}$aT*XO95xsjCC1U93Bt5 zKSj6<$LxkbIXuZDdaf$zW85iMsAYzM?tYN1(&utW{S?IpF;J*8yK=It4=0{q^ZvU z$?EzrLx)?Syn(`^pLb-8?tE<1YsQpPQ?hR2!NzF~Aumm{Ca`1CRJcBUz-CLyd!L8L z3L?MoUdtvk$XOLfBQr%qR9mRjk{9XMHx>hXyau9jd!4p0*t^s(Sf8m{vI*SE)g~vD8CnX@-PjO`r|? zs@2x`E%Jtl#z$t-@Fw!AQXiE&0lV8%iVOmKXclLLYN&8K>}+%(_z?KfXs4CtpwU47 zg;Jub-GflYOpV{dR&?TE2OGhTYJ`|13Dl1wL{VIT8-O0@-r#Ahy^H*Y>6xYw)v0>{ zr&6v=o_Up#Qw?uK=E=1IkrSr!?lgsjnTNEr)AFHvQY{6zCi`!pl!*Xi2E$J_{o}O3oZWg*di$uFHRq0^cT{LSg z^59+mxJ&wHw$j|EVE@&1M+N$jUTVnDDXek6{3xZoSVt$>b=*l5rFx~CrP!A1Ir8nz zoaYrTbuxgd0k1F11VI%lL4^5>vjp|41xIEJw0+FO9P$k-j9i?E%Qm097Oj|*)T7!4 zHFDvTLD*OCDz$idKRaHF>*S-_4VST}adX9i&R>{oT|Obs&T5j3!pmPW-*GQ|mB*tU z%%>cj*JwP)o@u>fvRyrUwT+mTH37((C-7N6`422Fa}2Bk`H=!}5pLRb2Qgc!KC*-{91`n4h@`sl0^@j_*`BiB?P1-eBfmcmI%@Fh z0UUA8BSRDvN9W8;i3VwY&G>eR#d6tyJl~jELd%oxnhAS^&JN%=e2{_*9SW3G1IFs3 z^TWyfb>AEZ_} z;U(%L=CyMI$#0;V4Tm&Ze8s&aWUkWAN1Oxrl=#o{L|2N&`u}KBy{A*ZeJBJjgCS8% z6P3qno!M3@dKPVGc)8>PtQG3c?XR!B~Drq36)MJF`)0uK3evP;BOPBhe>HMn0hmFrHZqU zPn(}Z9O^Jr1b;AqasWJc1|ug<%x~BeKPA~E5|BNbRg=$(U*Rm*M{Y@4yp+wZ2#&d~ z_JFtKQR)4OUV1<2=uH-(9<%X|OUS@SUev%-@~%O7{kRAJxYEmENxOkDA62ZRns;)heN{`eqAW#9mJ5-wqG|0xi%P3oj?*&ci%2_?#bx_N+Uc-{?H}QzM zAJojngenU1vp5XWI1GsI7jZ7R-q%ZLf~V(LNZDyQ_;Lb!mm9F%gSW87-;i|>wlA-jdus_bAGbJMR32-+a2(1+9!YW zhU1d5Q1US)O<1C6=KmPGpl*3~>hvy6#y1b$KVzrggxRMPaaLpx>R8T25T7-My$19W zSf+(301!Wvt?_q(>2%Shk#xV@@l?2xYg5p6lCUx7Bm=fj#CZ?L%@|cMiq8H|q6gGy z4zesYJ^OlgW{%$ZsAe>^gr|FpM5o+X;3PC(R(}Qs!SHg%-!9pquY!=Qr_OWL%^C~a zvbR~Xr)Vj@w1Yi?4 z(@1`c>Pp$Y|I9O3&*Cr`e9EkK5dOqnW;~$ek~sVC*eTsD(L3lAVP0O8#kecHo)3vU zE@*O}o-`5&8Zi|&QGvq?-)eB1k+#6XYR0U{5bD4;^qIvSQ`(P}I*tY`#9rzpZXr(mZIJ_p3xsnJEnj+^ zg$~l(wj%s_v zbVsKhaV{P=x-Ix_UK$(Wp@4=9RB{P~rin+ltMe(_6sUL-UPj+#ccQu*8;k;_djXX zn**F>lAzf11RUdBPwSZORtEkckw80h3`M-%EF4m3S_SjeQ3t4|W6Qk5f81y32Quis zNJsGzhG z;CpnSb$38Y4lpuueY1Yj;m%<)g?xOJ@CJWv&U$M2Wp<6b)r!_NkOM)i`Z>QUstKt) zP`@1bCf!_viR#@(nvtg8C-c~~+Vd7DX~0tG`q;GX^TA>~;#-uLLpJM%nTN&}ha6>k zEIRly2%0G1|H8m`1Ep%!pc$Jw)7~GlqZ==X!fy3`xEmt35HO|pY9m?c`u~DDL!Xk$ zJ&tO;uN8?ZMzKGftK2dR<|b1!12qhX^lAA*{^95+3ld&D^lT=R=bFaVa9lJ*;!QW9 z@OZmOuDLj-pArEGPX${k=*uaP>5q0!(>}_jTE5Zd22;@)OawLQ9ED|Tg9~iZm2cmH zV+E(ZjQ~s@0Z{2umnq%+7mXH;jHCEZP7&AS27DVe zyf3mcc}6BfQ{^Y}-~rD4VD{A%(&+K?71u}AsH*SjU#`RYB51m!Z8!eI&dy=#QcLQgdfb_^&>5LE?ahkQGV&Aojs8C zR6+?>f}sD#|8Q}y4_Ey&&mV5u-yY?GYseo-Jjq2o2L`e?4#5Xx#3g0Kg%Dh*>hknf zH2%D0Oe-w%kap%GEqoLOm7nO(lcjU*9B>^>1dD<3R&ey`*Qul45Kr3Dj&F7JuXhbR z%`)}X=l(FMid}tZuR;LiVdTQU{C6qzu+RSuxp0!>y-RtaA0q9G3)~+Hj{+y_MdM;n zCe0Fuys5(ms)k{K3M>|e%MW1!`5`E`@bBO-e`VX<7RMiy60=?*(M>AWq6=!CF6_EO z)9K?ARgAA-gTwG70&cq?T>Zy(#lE%5`C*osqkMYLtLJaBwI!I>EAKJeI>@N*V*RZO zN-l&usw$WkhRmac`@S_6;*Z<>bD7zD9}p~+Z%Ith>!W9q%(A{}f&$2YaS@%=?r{HV zzc5=`HX7`|eet0i*FK^eYf+daOLqTqM26xzxcyxmq=8VWFR|sFIpBUQs~W&6r_b=` zmW(=a-CKqyP3j)c0S^IYtJ>V%36du_^!}9fzWzMnnf&6pdBSQJ-jB}#pMpwkK_v@* z*%PNGxlKr83$^2uU(I9k-Xz&}k{pNc^^F4L)+6xY#3zV_qNwuPvmW~e@{TSRcWnzD zv>((pehzMRe>g1>em{aIOAZY0@hp`3eL}??sj_^>2Dh4Yu_(Ppvg33YLWk*XuMLmm zQW2zSU=GB&=;vO_>amYJ!TBxRPHp7E+N$}b64`xwrEj~!34cWmL6nNYWl44Psn)Pi zV&Q+HZ~nBl8Gor}V+r5Hj?GMSnda|s0erX_gqHYPUFDULY4aFqv%dS{hy_%!OA?LV z>yp*g;a(p8f92DG^(TvW2H&FK-B&ISltvNM_dr+I{y&s`WmuJK*Dalbbc!@0-O?dQ zi-^)Ct+eDKq@+8glx_i~1Qn2O>5xVN>6Wf@ueHFv-}9aCy3YImVe!PgXN)=Kn16m? zMY&Gc1dU)tGyTf}r7S)xy6|ox9Ly;6_^rWYHjt`AP?f17#rG)iNdL|PaFH+}sq`Nt zIpu$}=cDe4TFTqw8zxdkGALy*A0Yh@r9!3vGBzh)kfFyr>$lhEbPeZ$gbfj7Ro;aW z8o^e5h7Vi|3)O;8rZ_M_G76JG%Qg~^5HC){^a_4x@nvbm+~-I;(&@=y`klgwuicGm z;48wGk5pqZM05H^TQu!@{Xnxj(%e_=@3_Bd{1NXgOW#HT=uwlwY10UxZ4(M40cs|3 zSm-z8qRo+VSf6vX+@F1bw6S5cVz!`z_`_hp>DohEA~?0n>6|j8dG>|t<8miW_}LmQ znToy>)+otl@0NVZuAK!~@=*5PK(JNQBF?#b4mVA>wD&BZv7eThSf7|d@cn}de{Z3y zxHTx?cr$;qWAA14&-kJZGEasFH(G?|S}o9}DRx_<9j^u!p#by{kN0YJ{BuEEQ?07c z&IvLOuer$_7OL~z-Eu_>pDM_}M2m9hB@bPf|0hF!){`vZrN!dt$ zs{xSrn@|vW)`GN#U0Q2;_z>NCZU6V=-)*-$noLTnLLZWz20YC8YHH6t_1x>MxIbXT zoZPbTA_fZZ!}2mPI|BBPfz$-#%tcOyD{qv)>SQB%woPnNQ2buBC!=KicD$E;<8;4PH|otmULaq2H5>wW zuV6gnANNYGg~Nd1aGwKgTq8=(?EX!Z-o&ga|3(Mjk+sI4I~lmw6KojQ^;Z0Cvu)Cs zYEGT1obA*uF1!}OsXyfMt){;GQEl$>0giRE6PKhD7s6lt*r$o?VL)F=u~?Uifc|pL z4cXWq2S`tZZ?k;gmEtad54vVw3oZREpUUl3HvgOTjX#8cnFrga=ieze@WpwB`};!b ztc;3uymfWro%G!>>)TgR>8d*UpL`6FjeBJG?&mKA(@;O38tVHH*TCJvLE;;rM@He| zsJsd#7{Xh3H~^W01~ggXD;|;Ln$30->(O%eS;>Q1Lv%ywrbM}Z`K~Pj_Gt@kKL+SV z5qL~efg*aIiYkq+suJWX!}W>=M+Ma6v@EAc&c24UtHDWMNpEo>0tZfR2{CNVt8Jri z=n@)kVkyVwkck&y7#uq%nwitXmlJsnbzKE8Wagl%anVjliA?ihO|-U_TL?*5+Z(4w zT}@@-H;Uq?|5K&iNPgC!^I_=tQZdq|2JLHK*B856_`w`)+x3M872X5jkis^`TM$V4 zbLnydZFl=R(x=_z;vRg@_9O!^h;3tAlJ*{6`6NK`07t_rK6~jTnGk1slKIZ>ra0D8 ze~8TSoQvU)S`I_y__XVM)f;`qZ}(XjYk|nl-tk=vgW+ENVWA*e@^06*-*0;y;Bm_@ z4?-&PEXl2(Pzw`1Gaak8+-6+mGF$OJYViWkh2^y`1b*T5o+RF`k>X;^Wn(XW2AR1; zY+A$k{-A!T{V3z*?soup!Xi5W+d*mx0FQvkkJ63_3pP?`1qY@fKM#CY&5l*xre&By z{0imo^a2L~S8Jt5fr{^$2SG{Hz7dcZu}R|hE~<(uO+AXa_qJY51^reNn46X4&)$z? zeP|87!!S&)`@Ii4Vn>T2S?is{Dwi4sjH37JRo}mliT?4U^8B!MO_$F{gk;CMmN4zl zFSm^q)1DnN#tN9}45&n~h0fm$kE3z|@SMZ*}F=#7XPx3>J;bXAfZb8J?igj7K49@5lu`N))tZD!^9<%ZCNOjp*CKXz{`>|XthF1iaUR5(`? zzOw@qQh$d;zCrf-joqB}I}_X1OiEhhCX5J_*kfqe_>S|SJD69;o%;MRL>INd~Yq=hRl4TJ<8ec2bL z4hC=?QQ6Eh3wF|{>vm<f*zEvq%?<9fNmdl> z<@VLHrf(H6G(w({i`aMs0fo8UFA@cEgof*yPblR#Ze00`HK7NNDb48NuVCX z0LK!}YhZx3Zk;T$k^cVS+e~sTQGMY6d3; znEH}yiFkY)3CjBiW6OY;7))Ik_x*5f*nr{iVz}QInj5-Kg;}J2wj@sz=aZhvYGT9y z$MBalA9}5ai%p7dH}GF@49BSgP7H@VMSVBBL>pyLMtRGbw&x}Jj!={zIB{@XW?aX# ze=+``=-%HG%Am=FIWit(dA?|N+j(xJZBgGS&Z9@gE(bvYmzmLI28)yRXwt zwgzUeJUcY7!bAq4A7XhRFUzVTZp;^%WvZ9(BZ+3W6ZS0es5KXW}IlD)+2gel)KuUbY3J@^==D;MEsPQmb?|c)Y{!fr}=9 zDC8nOcw?(N^sT1_mAyFbvss)xHm;AdS{^}?eX+7PaQ;=Ycu0^dP|oxARaQ@7X5$#( zsmv?gMB%1gs%N2pKkFU_Z4O`U-2w3m+=Cyp>l!z+ZgC9B#GhHcM|LiS&YU}(Z$wIw zn%}0d8eYAxEB!mcOAW?NlTQk(dw9{eR+G!{2}o>tu@<_FwAE}V=C0n#K_$@Gxh`?<(MsFt(C20>>=vtia1Uj^ETfn-t#rXNNdwMQt#PT@W^Vw^-6 zVy4gxV}d}^BTq6N0qxch6&i2eo9W*iVwZCx2lCQdwzBQf7X;xl&DjkSFKdO(X@mse z0U2=`00LeIC|S*Dkm3qn=S%amu%aU&tK{Zca(RuZD0@BO>ANAU)$~%m#3xsY69TFi zTmh$S7xFN@gd36>CXo~s+KiVZMJD!i--qHcIg)P50uLho3K49y1r3(lLWzg$=#Z+? zDL==;+}Ns8Btk*qW&B=J{ck5tM$Q;$$lY~F@t|ov8qcC zD)7Axyfrac>Pb|kJb^ou)lW!SKXlaFj$0Ol>smCTxR4~u%7C(!qG zvVCZ(kgCE!J-2LFlDO|0;)i^9_g_iRn#PM&=>*xP;s-BRF`hgMKhH4!NY~rGwkxlc zu+jH#h;9RCd?ARAgghdh?goGI)+qx4cE9b3hy9K!l1O*b=2cj9IvG09TiUkg=k2jI z6P|ptu#ZN3to~{K%T~ss*(OPH<%uG!gE@im@sq8aV;*YC+oA6zp)t zVP>@}C1h2uy!6BOigY!(exna<;`(y%XV zm`@ift7wkz6C=z*ojY7kY=R!+%{LYPI3vG%LT+Eyrsa`{x0iIcda%6pzrQ50GyhwZ zF^`O>k6~y&S!nX4k7*}Blxoc~belmZNNGE{bEk(4krps3V4W z|5ND}YAMQZ!H(1x`bl|O_EMMAl$Ro>XWFX*cbmfBp*8QaeuTk-urdk>cD6z4=lQTH z>!4`4;B#%n!g0yE#pP-*vOjA;F@m?-m>4}rHX>sWWB;iI1@flEphVX zGoMfN4}P;gZm?m7a0l04Uh?G$;|%JqGPA2 zC7{1Lk5FDdlobKJd1ss=VeY&=YLCfswR73GBt~io?^1pFCo7+qC>T?j!SLs6W(0JH z3Y3B2mi)yrCrl~r2V&`}#FzXNbT=}qH!o6*1uLZr>+8h;=%9#(1+Ffp|%Ttx8Ue~GC7Cl6Q1{`$11vx%<3@_N3JH% z!i^VaB=Rg9$Sv{Ux(({!KA<_<^=v`m-FNb;-TlvKGe$?{gZM~hGTqvzH$ME9-5^on z^9S~M2bd@f%`BQGWn6W6RmuN}`o3UDb>JT8^QR(fEj$5tK}RFvNEzu-wKndlgRRSTCOwEN zbdtluWnJ_Rqom(UI4)I3U;S6G2i^e~Qi)MAfR~(8d&N)u^k?oO_ZBaYT{hn_+u5}8)3Fih!eWOih5i0fhN1-PWqpz3WM~zq3Si}d9k7zZ}?L)>wFf!&R^{nRW=Lhl^M`&50 z)D0sR0`~_S4^!fI^Bx_6+yK@l1GOxmSp&v5P?U#Or;3nsVlNXD zIlJ7@u!--^r(vG5aaQaVDdwZQ?{;&Em8igbfQ^$~(nz?Z&1_24%Ti64JL5H^6F<3! zDEjM_Dk9H1&6e8Lop^~OLRb1sBIyes%j!=&6`Y>lC#&?(7gL(%JAS-QeapU!KcFKG zWP|!}Rd!@ES#d9~-a=;fy39{&lhL{Dtys^-+hH}L6OE2#HcB`~);)`eyZa$S^lG)Pmi$)5u{Mbb zEq{=hP%$>gF-XQSAZ(d+x|@9w9|<1%`22iwQ>!LjQBB{FE2IRGKSfnE|5~4z5au4a zn$cHZ+TnCs3()I^&q`~ve@8^t5r0C8uD2UdJ9-JiG)PjR^$r{fV{ZRflaNQ_6<%?u zk!z|J!R^x6uT65gZ7U5Vk@B9XYs3uodC(>y>@0|9Ed9aP=ekHJb;3YVX(JKuw>M(E zRfZQ~wyH8d63s6F7i_ujJv0;6ohKvxc@)9^2Y>Ky3~S!~i(lg8CkwSYg3#sRkodgW zZY=y?fY=ing#vl{KwR%OQ$|t08~Y=MXS-MriYvWX60$T8F;XJS3C^yK2b=|Mk&xceB z7RW!wm7r9fw64m0GJ6OH5EC#+5-=dXF_hV!8gs#{nnDw1egu*PzRW+xXGA)}@78z8 zDBA$b!pA1T$AJ;l&QC}Qev3jg^%P;kh@U}c_{Sn7Kqfg`CO73#GGhTSJKzGI#QIKhK$jbs%20_IjLB)W?ov?bcG#sZyF|^@uQno5fqda}% z-F=XWS~hhU9T5~7H1Lc@yfONH@FChH z=bV*YGr@=&7OtQX3jqNW6Ck#*vXkPf?0o048s$4^ASYB6PBP`5`a>%|vGjL`)+@A4 zrKigq1hBFbym4qXgTn&yU1*FbQZQ7kpHxG?+j-K&*+cfrut0-4TkrSnj}t;kj$zy!oxGsjmuV#I=V=MfitJ$V59tBqW4KZkq0zV!RlgBlH`&jxf*s zx9tTj01=st;s3MM!@W!_~=j`px@yZR zJ8gaz(a+7>D+wFtU#Q$2kwHj?r3q@KfLRQ^t#P)338Ukl4>_o8UtZ8jes00ar(wH~ z*2@?gqvyB_ZFa+8%c=OjC*P%Me_9Xz3i^}Bev%~TO^ki33$kT`ND{gPWuL=3`!lB> zc$z|*e=HWi^RhhMRp5+kUnDt?402DRs4goehsTArV5`*AsMx3L;!WT6mUHRc^v6G~ zc{Fhv&L1)#KGOrg1#wrLQ{^ z`SD4LTbaAYvrYaJ#|9 z7kH1;qVD?%_3d|So4max9tvDkLFk?u?`oz@y1?g=Z=vpDG~Y$V=;y*UzD^+s9lr{B zmXCN?A=Tw}(acITiAxmVD$5|0rM+f3@_q(SA@tBX^&lj9EDsXCXBedBX}#Fj8SgB^ zO+}#c`mC04{+%jCm;(qtWy4%J#hn}x)DThb4TrLqT@9Do1k{T9M*BSlJb0Hm)>(Uq zi2aC&Cwr(+`}^I3813KtW2@0cL5DBkkCdB&N`Yg+#o~?Kxh(Ow#6w`21N0cupuYU1 zzME&kWytoyrlaSJ*^3b$n;xf<1o;PFLzwdr5&OU|iovjTv3ah-*DBj|$_;zAInjcX zzEmUhU-b_ds&Te`Jwm`QzJMKU#@CvKQ!ccVT=qOaeb5Udo{-;-V&nQPMlW+u3wd!F z_KWaD^sWNM_dZ$1z-YlG@|!`EY%h~foO(UklkX-y_j$85buEfmjsjsbSHQzlzwn@; z3(Z+`H$q-{fG{B*K*cKg)mw;euHj#}0{b50*Xlz`0km~$B7^$O*s=6I<^Ec~@QSQI zb;wktAa^43U$u;<2K`tJFro$ULI^ig=dECc#iW=Dd_nQVREiIeDEuCz{kW4tnTVQp zH~QLSK`tqh|0M$lld}<9`4@KTmwXnyPvS-fUQM2-nvaZ0)Jws#XyI^ecXAlz_T)YR z0uS8nh}$nPTFWMR>$%A<_3`kZQH%1qY5J2Lzn9Qz G1#OK=ljQrv=_v1^o*41!C$mz-Ay2x&cmJOHU>0Sgz0`|jd5pwI zsVG9daMGX}{abEv-(-Y!CQ2FlmFMy5{LGS)Mf+JYwh#$a5~gcl8tC*9BVGY5`vKcU zA)!9EcRKTp>z;EJwb~c3VjT!t6T9FsB%lFoa0mf&2%?TJn)8wU#>4Vqb0oZR(;Gyh zHk(li0hKZlBQnbjxxl~RTVAm+{$hhk+#}KdjiAPqRwt!^{<(IyQUo27n`<-mPPWzX zhtREiBo)rja1G&9cTjG@+MfTj+;Wk|5{h)vOR%5n-FGLTH^vFlny;I9$&f~AfiFhI z2g)r3L>%Z~;a@}!dUzlOG>sl_sp^|#Kb4Df=9RTphLRqw6HOFYlD@qokP1*EP|ZWv zV?x|IKGlinNuYRi(FR1?A_WgVdQnkDPnVk;tvxf#{qq_^12*Pg6vHugGyQdId~1}% zg?G>B5JLfNC(!V-nw+701jgZ(LC86|#$%=3(Qi4q z&%f>cx^%Z8y$&1(Fh&sw98u~iaqD{<+ZLy9L)@osa2MsY=eDkhC`#YZ+%eMfyS8-z zhh@oj!MMhbci4`cC=U&#}BBrS6bx>Mt zk6U~2umAtn`po^^fh^HiGs3!LJX~NHp=<%7f>A~SUvc0v~6nm;lz-} zNxW2y{zX+HkFgf&!#7LQQ#m7%F5KY%Mxum7LYhB+k#sLTziUQ|V%>)}6oxD$>AJ4` zDwJZ!pkb>=1-vIX^GX!tH_$eFuT$=>FU8l^G-BjUM8dkj`xzRxC+I2M&lC61v&?G2 z&%%TU2O>X9R)%>V$a4(GFyLC~+H-edaXjyNcwd}l_mVWNu${Vdr zD%4E8iG;|_36Gu18PXFj$=vAlPfa_Wvx0}XROE$Yq>uMmN~G0^W~8rUCvXu@CQ2G_ z^}Gp>?55{7F)N?2i0O2H|3SpdRJ>+w#exJJt=>Ws~^^1v41lf+}K68&@Yqf7mrx%#7d5iI7bTUEsLH zC!$|aK%}Gy{)M^+&}&%B3O0}etsefNS(xDC2;TlW6ZG@|@!jssX-INOI)!|XV(S|b z3P+Lon@|=ToO?2g3ZfarBDeKL*ywba;!g<*7Bb_!pMDOJOs=gH#RtTqmN!#~+u-Ag zPQ}fu+`l7#RG4?!c+#m8sTXnApzZNe&HKFSzI&Mf)5fm3K~QtUDc1q#X;^%Q*{g2S z1;bCTHvE1Gb#y0Vq0X+$s;}WCR9@_WWoZ9N60DITOZjg|g40FbJUcCpift61xeQj_ z`aYe$!XGWQUD3kha5c{TWPgPQ62YDmE{_2P)UHdO_X@`u*#r77IxEI=2fy&_4RLez zRM72{GekHtrgr7SOP>D)N&J*!Yl_eQ`kC6Yt<(U^T`}VDw9m^l44A% zssNl}&srt+#+Xax4|f4aUW@gER|}rToWq3Gk8ii4M5~2=Tp3 zBd$yfQf~NfuziC2HV4bu7-f3vt*)hH0gM8r0bRcAQz=0B08wyy=&rtPp0(De!T-p!*-4wGP6 z$2gSfeX}{Z95ZBA_|$9IWrv8EQ_Toh!o}@RDWcQ19CNMF99A#G9WX0=b-3>LK!=UM z>H0ftw3bTi>diJ_@E$A1(l|UBv+`ZG$M49fJ(j^7{K|cE=pYuXX>x+2EB`*iqqHp1 zzYV)(kyDj(!!X^W`S{OG`@JekZ;+M2^MOeeXg+W%@ZN}PW)fl5-q1x?w)87T{DA_Y zLF{}8?=2;P7VJNN5T;+*qDw@Tf1IN8N>5J%Wm)xY;YwE|Hr!*J$dwwkC1m!~oUU86L;6O-u z*AY0{>`8)~aK{#2ZT;jdRL~J0xV5@w`$kWltPB9T@WEm7=Ah_)zXQQOywXKKf&oi) zyYbJzETmMQ-}l`i3k`*N7F!GgFk*arb;)K+Jb9hRf5s=rD%}pn3&{D?M|*RYLMvOe?sStQYc!xsZ&1#V)bO5Jqn^DK-=_OhQFGz2Ta zO<$EE%Fr?dq(3UvWnNBC+rtIecJ=nQkXIvXMe}wI5Un1IEJ-6a+yU=x8)*Bt>O)i$ z^4?dYkavy_D?lj9cc-V#71N|T9H#miIoqm!v4IIV4aK>SV9Zc_ zxKn)lqt&pp*4>nbM(uxPlO|kMJ7=_wPL1|6;x$YD$rlnTLdbOlN!$V7x}Avx{y_zy zd6$izm##Y@ z@J$Z8s)P>g(LLK|awTPY74UiIDy2LGDU#nY%vafaOZtSa1#M1f%h>Tygbyg|;S|%# zXhyYr$xP)SE+OLUUyTI1^LM|i?e_R>Dm|sDo42yL6cu6kK>nx(Lu>1cEL1esa&rf@ za0lY^u$k~VTW8@h9=sOAj z4fkRu@po07SN3fe={s(cHSWiKo)x%wVeLl9d}+JY*{TlL0Su0t!1;s#?)%HVNO@7# zhPFs8kcb(xY6Hfl)S#{ zOTDa3uE4ePAIRP?%blE5m7@TV9vm-gZ=pCEa>R&{q{0X+3byITd7_aLQ!a4)!w3CvK9#)RQ&MoZ2sx82A<*E8-#v z$t2%{%>iW+eu|-c8Gyv@24lWzleyUtpIWyr<08AtE4eOimUwG-9NxoJ(i+|C`vt+} zkO6s=|EoQHO*oc}QonVYj&2=~8c#os0z{nPVc0Wh-YEs!NDN#1wTJ{cd1L?hjl=n! zr6+PvR~d|WI8lS^NGxSGFXU`^4lI9z8_tKzDo7r*XhWKH3QXt%8+(zXI&VshP|3VB zIQ6NxCDeL^h|>nw^#Li$F4zW{N(0PqkQ$Itrv{mFYa~EvK2mbi;XgDQY90w7=k~Jc{riloVt39DtzsVHia!TPOenU*en=P)ih(Z&qV649`S|%b4EGL7L&cJxJ{3-GDmBh1 zd*`qOtX2oDQwKsli_(;n)@|S^k`UC4VV#^zO?MF6{en4^Eb~E*9&~LVtmvVkkW(x` zae2~nKa}6>y^Uiw(aYr`M?ucxyg3%6u`!ReHfv+QnTE z*qkisiMxC*xRO`}ED%n)l+8fIL4?k(;b2|$5EvI@2fk1)l$&9cQ`#rQ|2}cNVPjrv zTP#lDXW&io*D{n(y)=&Nd5KA9p6FkO-sAg`Dkj8$c)NxOKvGkcgWfKz_@wD}; zl9{aUU~4=Xa2!{vz_3;q2RcOUz~hIF>F%kFI+(QXvv`ZiD%DtYZu_-Gq>Jfk>22`R zprE~z9XaBskC%zmsXpCvvf~f>P1{>)_dCm16H*3hh}@W#umBSm3Klw7@0xtnxJ#O% zGan)(ywxf9+(rHYQv{`J82+n28&P1tBaCzdQMHp7z}(7y6*h2|Q`nHg|k?xL^k%>J%3aBKROudQpFf zz*fSK^fJkTNIo;5{h9II`Jz@zeW7=W=P%3=*p3T{sBoswx{&Yiya<@Dbf6?W3=qin zZgg4@P&}wZs2L$PzT#rE{+o;OSnoplzp1`vV{t?Rp9Yj+`Oz+mo;(k-+5c@IjA1x~ z_qalR|LfE1t;1IfYyT%1{!RIzcqxkl-Vf1^&JQg=F>mNxYIs#>n%j@}(NUFSK!X=d z$^;fIpfoGM#z^Gf{%lB9qHT#Lzc-WDa!aYEgrU;yao#BJ`WRE{B;f4AVl%YL+rDaS zeO9jP%f~OMdlCQkc;`_)V(QKCRTe|C%O0*7`@+mlD(CcUTx&tK67aTEDrKSAxhsWJk+H=Rqd~j7R%9+fP zqVAk^8`hFjGbZT!s%<*pd-H8n-_G!<*9^QX`sY z+GfrlUoqBM%JGl;BKb&YU55@pPG2oR6Ya#k=nf2!>*N}Xh@rNiPt?ndmZ%ijhJ5P_ zxyJquX>u3xX&*Nrn|NoAMO7#d*JC-)p$iJ2uKQw#!=AraAKy#8(6?9j#^u=w6A^QLr;>DGv34Wf zx4&Al@KKjJ^iPhSkG_8m|}0Wz8mV#lC8U@T%m=#Y;94Uum_2jdTbIu_IuQ zP*1Qvm)LXVj^>c3#%NB#tNgjNA&=YNh8m4CS8nry=tuxt={QI7`#ILx+F_V-?a>$i z41+BSf7}Bfnm4(4)PHEA4$Hyx77R5cmErUr-wD&vbkxM%j3*7o|4u5GBRESZEAm*a zb_#I1t`ZvBM{2+jZlgNU_|+|l8AvMB-0;vf><$r}A48_``C%4Hke$}qbEhg8PG5$L zxN(O?oy*pn@rUN7QOxCYk?e=Fk0`dtS^p69f1+-i2xVgJq89E#WCGvbPvDO6^seaF z`flP7(yS}SDs^Zp=`qtBuYyJhB+=l&j~6%A;Ksv+fs> z39;&Ttnqviz5pNf1B2uT21H|&=Ag0WEVh_|)l;H$@m6chW!v4xLKok)ZH0BGC~zGN zyw$`|9aSWJs_{nMe3nGccG-3pXOD_HQIn-sE|#N+2V4d#z_l>6DCe0F?xyf#zN44s zc3szfv52UZvVGqt!^oPs>e_5U@oh+8Zc=oEv$(eMGx-bJdMXm)4YK&5Pxsccggqy9 z^MTpI{;yH(pmas2piXw(t58#8v|#>PNlujb3itGei4HF=mcNPF3Xw>F8fL#)XN|6!ynzEyT823wvEY_=<XMj$Z@_?}REb?7mZR$jR0-Kn$hy{)gC^wMrWOc!Bn_Lh+FxZ_#6eM(V#aOK=r$uwaY? zana@?lENb7o!10|pu9s#16NSS`eT;9{2N_*rv!(h;ryza6kq$n4Z#6N7$yRxT#aL+ zBBDH$j0Iy|bJ-0MF5c)oG`qSb;)rKI?QiqM3doVqJl!k1qvI=pe{H>m?-(Rj4xKJ% z9^nP=gx+<@L#7PK87tqsjW+1-Cio6~J1W#dDoCk1-@{+!4XZB$Fq)IHaw|_(VvIK} zL$NhxZO}g-i-U?&c{2`!APxiaWpFe3cu>I9C9`Otjq|RU>B-9zA${Db`LwYDMKNfq z0&8!#C<=Y@m#HD$Ki$y$PV_@VV%?x)$UT5q2Az(DCKr^jCkiN6SmEE%t#|FEssBy1 zn(H=A{I%>~V^j5M1VybQI^>1Z?;17%r{&gEd(OhO_^VRue`{q8=jpW|(jCcFein5h z%m{kPCQB=n%O{znJaEHfG#CQ#J|YB|i@z?JJV)*f$nYvM-&_vux0&44pPX`P+xa*! zfIifNTIw_Z`Z`qoZGA!A=g9eI&s;D6CUYCYE_#;{_dh$B!u1e6%vk z-jyw|&-1F71ndf6w--b!CKo!CFGU{rh;9CUTvV9%VsWNo27&98%@OB>7<{xv*gB=3 zs7w=d$_E(+R1NN9rj@CmC7157l&`gYYo9c$MhKY(%I;S^FLA_3;F523__iZ8SaS(? zsD%-~H*WE|=iQLO#OPY;zh_eZ5sc?wc`pgX&_YBAJIWN+@2M{NW|uJqVHQL*QO8Qv z0#587ou>LW8Kzdi!eC^KdwA;QIi$riU)s<5)YqnsHY6$t#{wbB6}(1^!ny-`Kxx2ui+($KMTfyq3zI&5WJ$Mpx-w4zq(8w>_Av@jZbz!Ic>Q2<- z-#PEIySqFB%CnpfF3nHf7&5ON9|)|LhxkLLn1yBV4*L(m-x1c7u%{w@Z$Ex~~K`1+dRqIW>>gVXN zjvDc&h%!U^7LosI*;uY1I+F)!v3~ulRj?n2id34TnN?F;tlh!@GRiSO2{c(o)ZCn^UL4z~bU`Zr&AjugSVz(x> zpDz`8h7h1=f1tfOAT3^1oNY&p@>U^LL2fw$;EJ%7jt=^EZpW{(c}6wAVUBpP(hBFT z5;@$pwUf)dQ<<)Te*L~dpn(`)y7$h+Qha&-r>S&)!QQow`4@rFPvbuF*7q8$Y~X#v ziTU0VPg;J4{0>NyPAhXn*W&P;yD_7MyID`qHLS4j%MArS;fQ9?Kp){tRdT1bs;?ym z{M-fUvN&u(Z@+UPHEnkE@w^3h2xAV158U=LnWNan)KWNV4M}Rm=tgAyy~Fybp`1_F z4F9Tyn63ZtT|6#(?hj`1*Q{|X@=RSv{`Th9dm4neex12j>Sg&B$tf8QjdT9eEuW+P zU+o^6Mn7U!MRgS=vJ6|t625*`Pb8;O>^6aWi--H$Hey0!*}?p@WWwGL+3j}Mdo&Q~ z!SZl$XE>ISY9ESn#=^Ls((>{xG=zOZ7vY|lGmvFIwJ!0vUWGs4GMHv(P4p>prb?vJ z{-wkR^PlN9!cHWpuGkQNYSaY@B`D4c$gNqeXpk0XZ7pOU>tNdculY9|rAOY&RB=e& z@l|`-c&1#S7Q&MLj-7uA@$p?C z(1N><rGaY8VdIB)M<06j`m<$u+ovlqdQL5V@W@Pz6bPz)O zVv=Vrt2%9nu$FtCUNQj;2U=c;17rf$zxo@Kl2e`w{5NV$KNr#HzjrQ z>Pt2F_E-RIj@pNd&qkJL9~P7TO%DXvpUyQsaP##qgtO`akx^W&M9q%)o;x?^)M}Hu zmp-|v9vNzt#?Kg$&ZD_4;q97QdC>pFOH>YoItrZ21)FpOE{S zvXvZ~qg++bup9+Atv?vT#|&j$^=ihxx9$*`=H_Cw_`2z&7P$vomCGF0@e5oPQ2*#L zp;z7^ViheZD;V_Av$&Y?>EL-y-x94xp4Yh|9E5viiC%Cn+Ap*}J&CBNOQrXvJgZ(! zKt9I>1{vLCrO!bAu3GsyWDI2Ou+R!T2jCHawR<-^kKY_9x_lb&Dm`v=_BY@m;Gdh? zQ5r{UNqjoSBUA|YVqmwx)pjL(E&hQ~X64Gp9yP)EB)S2H%VOdV%sw6mf}AGeH6wr! zU$?1X4-CQzK_7qGq;OM7HC8Djx%F2E?*LgL)}S>#GpH9f?7j$a15e*bQCyZ)CJ zRyX-*hiSi6M;#uQ^b{F12PS-HU!kl=7h_Y8hyb*`lVcR9kmxTP@x!dzR|eIb=@fw@ zb=WcQ-|H;3)v0OhnEfH=n#{ZoOD@O|mpH}r(Z!ikd-)FnRRYSt+Hq^?33}R4@X9wf zhqbl-MMQh8wXFZk+i@gJcYXBTH@k#U0*f4cdI{YzeKmLVg+$IK`Z|p z-IX7kg1(^vS?cOaY@S<;oLQVrndV5Lu%vNKNi{YiKC^+7%g-sZ61v!&ce zLDXgJ8o4*8WcJ`Um)EomvYyDNa_w_pJiHsngmK6>ZuwfKOkmPa7z@4u={^^!v||)> z-v$PPy`NtRCZs@K=De!Va-Xq8X^{*2MdH>#W*SjINgRKNT+0QKBX}NIvR%?|z*sRS zlkvHeHpTgYz#LzWF2^sr*q7xAWNwTs55Z-(Q44QFYQ+>CZQbU~`-T0^so8Bp?p+df z<@V$Veh!?F`FK1JE`udjb-eY4qctP5By$vwYH^vSI`N`BIqpQ;-_8<$V0eKH{~G8n zK!i$w)q752|9oj?{g%FK&HB$4YFy*1=R>`1^X;6P&MrAGuKfZ$^++%N^#E6%Nmwdj z)9v&jO9Q>k>m23*%L%HksmHfBh>ZYIf`s`7q@_?;OOe1-d|UR&`WMMUF)M|c2 zke5R!8j2x+_5i{S4L_5CLMF;5?a#yRZmY0`eJu6oY?Q&C%8ByYzfX)#WpibZUM7gp zIm6!_T^hrq$q7OX0|PF|F50;1FQOdvlT@?cwa*F1j_ASyq|-`|LqKP$Se>vLmOr7% z@n@Eu#<0_`tFIYm$!Umx3-w+}*BcChl;_{d^#}co#Nsr-#ix6u(OPTxfai%Nx-Wf@gglR$vYCqg`D;7IL8t8 zaMkwzeXfdQTen<)hN6Rmw=!jRC6LNVA;-iVeU8}^v{;4aLAT)gza8Zg{&hEIQB7rH^ ztNqP~pvq`wdxj&j->V%$5Gn}VEgajZLGXebQFkB;|7shO!bm;tt2aUqb~(FS1xV3e zCE_(JmnVMyt6c$uvqFJ%g5b|f)EAktb8l~3DY|{~mEF*rVRvZ@$&BYlE-`55y0%a_ zO+svua`U^TwV?xim=aoD@AwFJtKwNFXX3A1aslWxy5XXn?1^BWgG5~)u^m;*e%f7(Eipp%G!r#V|n zI25AW3i-x;!Ox$DVE+k8Yndyw6bn4rRka9bNJbG>ER6;BS=;$7s&@Fs&V-;dM*Uii zeHHownRnk2C~kluO6cK_x@-NRyGdbm7a@vojNWpFDnjp0sVJ`BGb~?o6mJcHfWRd_ zcV&tB4{YDO@IBJ#DZ&+8_ttf_Q#CA@#>YOU*~8h?fkJtVc0lP0%R?RQ;iQBcvyFSnM zSgUpkwt{+je zCh8Z%F5#y~%X}{bKk7vzeurG23b@GT0?J;XX(wx>oLuF3a2J=sA9Q=x&bLd!0f>e9 zo&D2Q*C;G3p932+p*cVHR*+Q za0dc7KmRxo0@P1SV!4zTm%WOJ_&FoGEO9JsMr@6lJA1{DfSs%HnTgk=b>KuVkuC4><|S^7T9eIlJQUCzC{=3=2Ma{SbJ zWjCOO7PIB9=rJ@xE+Hu_L2j{aRL+lMk-Z-H(3 znWN5k*G1(K^(o=|5v!qr_@bndPowFx9EEf$H;9v()9ulh%wV zC0o_M%uOBH^W6zsSkteKXGQ7O1C~am(ul66?33NNAvUfMMqosWC?SdvJ&{0bF6!1Z zWSPLKrTlu|v+bg|!IF_(_H;$9eB#^J_Av~4GHlSM)89Z9MIUMY-@teaw%cybgWRf3 zj?eU3Vleyau+6J8C1Z0sW{$V*g81HD!+8G-ZO^kfi^ziZm_+T>4wdv!XkfRS7>8r| z;{*-TVLY$J>oQV38@Ekb9P1wXbYUkB0w2`{g;nj;@QUYbxApqRXGGh0?}k z({Ue}GufSHBR5;S=$Re9vT2ADe~kry01ug0Q&4tDe_3t;-g<(nNAD;WFqFek!a45k z)9}RaT4YvP_s+gq8S8@5H{cz3=)d|;R%o#OgO1Qop(rQy$%PmP{tnEpP-5iDT6pHG&cLNzcd`uEs3FQf{_@;4SMIS67LyISJc*vr00eeA7^ zotP|3SKNI&#IAmoa0Fp_PxI2LJFtFeL`aoY%0aM;ccWjF^H4~`Zv6YApxpDJ!W%o&X z%QCLn$M6bEXc|g4Fx?%5oQHA*YVf*5l&OOTeXsCHkofS4hrJ+iPEmT?mK+#T& zS|d7Q=Tx5qvp274m>fx%p%U@Y%lOu z0b)-<5`H4%t`!3t*Ii_s!iZg6ddg5{;}u=$?Hc*%44|TvS8H0U?+9l z=c9JH6gne|2`T+$QPwH`8IOe9!W)sMM2qPrqY_ow$cnRVIg2qqtE zQ&&2ZyLU6kALvMU)IFC>&+bTgaWRBIH3Tsw#YnICb@m`_1iy+1Jq3OQ$l% z5^C!o$UoW>9uQKzP))8ck3`XI6A&_k4dnpD7+57fYy$2jd+^{#j=W_VF2_4N?1LBWgH)22ISIVtxy9IEBJ9OtQ(|dz6yBH)V6ODMEH+&+Kf;mYH2vgoKD}*(3Tr&pGt&^BuqM&i(r$9U_+m6Pb~44QU-gN#6y^qa^KK0H4`r`iOZR5oAslF4_=mBK=2;L zcxrr;9D?U}97XAcsi(JaQ#A~GN5W^8G-Yq}Oa){%V|+5OxHx+5)^rjkyDSr#tvbm* z_c*0-LVlOZ*#Ki|;AuDihv#L9lFG z>2#oVztBDqbs+Ul^hH*?c<%@)1t@|3=m67#?1u#)rX`Y9Zo{Ety%wZ9#zg*f-Q}O@ zb*_-UD+5xBzX>jw6!4$uRKuffRol6=zV%c;Lw0UZaHvDF1^Uj7q#(ztNdKiMEV3cA zYX1Xtt1Zej=yY-Nu;i32H@nw+HPijqA#>Bj6o%1*#JEHv@NeN1w_Ed*&_10vtM24e z!sI`ZsS-zXbM0chhI4lJ9f%x>$;U4A(-E-6SU&9*pY9%Z1jzJ0e`OJy$yNN^)w)l8 zUse%WjdOpAj2ePB_Qx5in>j0-jgl;y(ah(I$&${O+rvHy_4_iep9GB6m$qcUJA@~v zemchISWmAj+{Ww}XPZw)ri>sFOkfvjNQuCDMl7lak`sbogwJyUboE7(DeCiC{QA4? z(^uMw+-)?H_YxJ#xJ^`mF8s&a7)CU%`z;A~GS++dhL8^OFru{xYd14NtAqe_=w*fr)X~t-3Md)ZZolWzQLXaqB=dqVX#wT(fgoS9dVrV z*l|*f7fTaq+^s9kbi9BC_(j759{*K4F_LkYB9Z_N0XdF53;$k?bwj_g%{GrQM>94x`I+t0laI$msoUnz= ztZuSDAu)IVK5qe|SK$P)>&X>xvSDPN+szUa&CSJ}06bLUmgoLc{a=6GQ^C9t9fSXjzKZ z3aoGbg1NE9=64PA5y(!G1_e%^J{l1r<046_sG41l+Ze6XzvX<^%yyhWIMk3FF;VUm zP1xikO8%f;;==@LBqBe-DN19G?x7Lp)2}YB!QUg1owCh|8h29Jd7nno*O>Gtf4UsQ z0(_#0kDtd$TuHm{yPg}qX-XkMiAMoA$azPN<*HMug%p4Npib*O9qCbxZ7N)y^|`E# z)lQ{5!IsBamBM290zw2}L=C}?Lf`2tiAU^)OwNowmU&BkXH2v^m9Zx?C-M zyy1cI&Vt=IgQ>>p*CXq-@Ur9hzThqY>yPqnKIEMJJ;wJ+C>hTQcnNe zlYS+In^sE&Hq`)QDBQwEY*zeJ@t)k4lwrChj*r6~^VnamM4OsP80XOJ4zn#5;(J7a z1*+s;95X7`%O=Q=s!Po`J15T+d&bFw{sxkG8~J*lGYzL+@fH#E4?pxBZkDP8qTEjxkv*Z*jC>EmQpIw zU%M9S0NijdREK|1Tvdklm@>OBREnm$oRsnzGf&F$wK{d{b*5WU#xBuV5WIT`;b2zC zMYFImmV5mbsz@axLsrcX^s{tj`qPSWYKYz4oN|*V_hvwd0fv|2kn7^mDSafhZ%wj> z8O-xCeJA&H8O3@gHpOqqD)`genW?G)0S~;*yM`7lKdX#IHpdke+)&nZ+Yz6t?duc| zeG6XTbT2#1APT`;7DE1>QQKhNJoJ!W;$RTYB``?N)~DuWU~&)sbQ%$TgT(smGyKy0 zrCEV3&e+1y#GO~lw#TyIqq|q$k(5wtL1ClUB#YIjNPf+M|IbVoNE9IUUbOkGfA5)0 zs_`b9#f1#9sMhCdhG<1jeLIP0`|=w-3lGSm;MNyED{$4r#fG}GOFN)Hybo6^4)(@{ zy$Ai?@h~NPVF6(5V$xzinpSgYX7YK+izikRGWrn%-m38*&KxGBGuAe&J0>CY6ku=_ z&WxUBFc3S?6G;$=R`1Mr*giF@Z7sFMbd)9FFx|GS0)tpE^GJ|Mma+Ow^D|JhJ-+yP zHK44l-8yh-?pTjL?|*{xWK^Yf6{tuMJxjs@&tBPDXUC zJNGKn?4ft0XITybyarobVP!L8OT5Bse*$KYhfUcc&>9IRjn@`xjUkU-bG>y?a~&nzatY>&_we;WC? zfPxpvnfw=4d}eI1AtQPmdu?Xj$EvV82|i7HTfgPD5AKTt$I4Zq9ks2d-(%c+0b0zD zl$k9~^Sv-g-(UC#Bcs9cF;V=5=uG`&e5Or+_yoX@T%{hgyvX=W{}K0dcQnnAT@n5D zKdVeb(V#|Y&BD{Rk)e>nkun>8@nPBHQgrWGHidYUZ4u}5smm~Ewpp#vkVUzO)B56D z;>LratK9FpWf*(gWY!l}uT9j0A1?=9=367L;}&Sx?h3mV@DrPyd`u}p_N_(z_+Ucc zz@t_|6vBP;gch!>e|FFIc{k-LmGd7CNvs1!$@X3p@?vk!BjPwk_R1m zN(uPPr>i-L;R8nygKa^>Q|Enkhmi;bjQUFA1vTM7W62WkJ?+Xg=i!WyO2*=h8{h<6kxpJ(v)zWpN()cxaWF4ZDd^y)T>HcANn zZD5TO0{8kX?;IG*dF^u~E69H2%wuoJ@M#N2`)n1>oVeM_tNb_#Xz?!;7=H{ds!cFX z{tfV2uF%B!GMJaA%}T^wvTqsro{2^BnzJ~IKW0>7tT7l(0A=|9$4{_>rt~_c6FZt| zqMEDhc33qV^?*j$m2I+Xw{P0`47mY1@q%w>yG*KirCt_xwdHxnmqRx#AY*cG;lT7+UYplkMUD zp8pOO0QWzt=fv5JC6T~i6ssiuU`Wr5Ej=e>t=q6+IQq;)V&{@+0Z(o*U|L&q2hOZd zEAsF|k6BJ|+rF8}|5m+HkrR9>m;)MWnvwenEQkSfaOnO4j(b8?I;?Z88xbnZOl>(Q zG^)89d^B?GoUXCR*vTzfFyQ!?j0BK=z{dT+t>}R9jzAMX$1(MfRguymhcOk1$>5h; zXe^>M1#dxsgPYL7)p9`R<$;h8{-EX7)Z&t79NNaF@PeKM*ws<;uo73fwf&!bikC;4gqt)lV+-t6StZv z{mQ2s58#bg`@K*HsR( zvr`G8a<0e0rz~L3d7yoci3F^|0q`pt)cjh)ZHKPYNEx;|mLq)Pz`$_I2@IS^`f*p4 zxL|YX@IGFt<7P2V>z2h#*7o(>!YhoZ_qVs6IkJxi7==jicCKB1)Ix|`P0UW!PBF7K z+cw0q)ej>ZlL*88ifK&y98yVEz>)hL@QkAXo^d_d)61W`TQ~~sjMJ2-vsSugF>0ik zYKud{rS_<*9YF`z0A@MW=N8c`}k zTQlxuY9A?SJm8i|sU(*%5XUM?#QPi)w3^y|!oBtb6~di-MRN8TSu7iZbdi)M_~+hz z(RdHhv}owB{z*u%nCceZHGZ^`XO>kSLIPdkVUPQdc?r)Q zw^+T&*k+9L8kWFiL9kAD=s^#|?>bCU1YMy$!W!hVa25NU3WK6a+`rf-+U|Iqc@P~NB zhj>uN+@AX9Yo&fzT)aG~cRqypO?K-=eTpAFcwzCe;Z`+xx$p}9mKG$_p*-qrmzB=3 zK0MAmwK@nTJt?$i;^;TsO!poL1D+_ho>1B`g%z!mrRk z=%-2*+%L`^(7s(HuRr*U_jZ-ezrkNCJVos(<^$YEoM`MP!#|c^v#xzL$iYg@L{hi4 zD|py^iND~@1;kV&3`PB64Fz5G9}~S0-h9zFOop3LMjIfT)0fems|I;zSZ%i34r2}f z3gEC_m{36~!{GCzL(Jp`Lz4!=8+Yf1>nm}mxzWBMm-gHHfnL~Ohz%BtM7j5jOLk*& zuTr&OsqHIAK0rxru5qX?7j~{3@8K{4KN$@0`^c!hUkq5IwrlaNWnPAIesgtD4-o$9 z`oK@7ccVNAbV%M^giZvW18kUXcQjp4Qfb1$kL&TK0cUeNi9Nr>ptg=%vs#4>$?v`K1Lb&@DjAS#Ho9S<(a$Dw6 zG-N_cF|K@#mR$i=2wCAkLboK690q?DPAEPS>(E=1Vv}lMGN}+RJQFQ-KAuRdzWVZ! zO#cdg;v5L6Gx)G6D3RKcz@4V>b;PzP~gRvhAz=z+80)%k9Y*$?`{V90zt( z!YTwm-|k=A2X-!N(#@4pCSB+3dsr6L?%CJ7a=x@J+$ZWsqy=D-6JT=tLDev$`0K}( z98td?;+PxYFc@l~6uJgbm+RS|g6suXl{`Cm^j%n#-oGwC>Y$ay42SJocfjxWMLjG5 zM8%FVJm5D#n8IJ~#|vH0YOk*hv)o}%X03fo(bS2*FyV0nl`$dziTU?Dpr=BNp+@i` z1x_9llwx`Fl+aR*r?u8eN#PIwQVhH)tu2{910I9Njf^7)6Xpa8vj zc%Uw-xMvYV)z9G3E(OW^;lIo?RV-7Uu)*Wam;YJv1+_gu=>IWl15RV5GRI0lR_&9O z8-e7!QtLy6(=Rxm`YdVk*J_?x(`bWx4qw4l_3X59#^%}gEtS~9B@YHL|9d0+K8J{(wq#$1Ot9yE*l&=pT{wSDo0v=5Z!4$tEzN z6FZx+>z~|GU3H?6v_ntdE_~Y6-5#IK6!op1($w|@&%yqj+czg0jJF{L1(vzESkP=0 zr)h)jcfTn{_Pq*(coQdQ3;?ev=L21?P*yJ6MPg83TJ&CpUex`YwEfpT<;FAXX(_Df5&^5 z^op`LK)3x+)S514q^`|-KL2X*=cm9g(E&3C9FC)AiSQJpj>B#XFAuvr;<;Wtp_m*J=nUZ24gK}r3;0+d7NoHpMAYZdJE5v27+n)HX5 z0rYdo8Ke~aHi))iXk7Qr2TSO$5L~U>3_d zU2;E-wY>mB2rHgC_zL1b9$Z~tu9x+3s){uM`#L+RD7Bl06b7AmI#M)X^E z|9aB!`=j*m`Y(@V%!Tzd*HyIIYW&b|_VCGW(q~WK2}A=0|9|fBaOuAKy7WI#Z5Sgh|0sB#W5$e0pnEE4?i~9>z>opp4`H2+ zBHXysPPb1t=PR_2^VSFyyBkM^-x%Ci5!NYs&7ti9W=;_j2Tas(p#5lMai2r0BMD~z zbS3Vp*;06S=nGo4(Eg>7GPM9UTbLCM9Cx)!pKMEo+m|(sPZ%G;`wzjjxHG5?iR`s0VcQ7ieaJi7LvhxN)x{1Lbo;4yfTmt$v>uU1n?@Rs3< zn=-vQoZ8_`)>9{K_~VQCDdoQBUq8G$_GwZ44-urJ=?%f#fqWi`KV3&2t9@KH>e};J zA-4naPCB2`6PxSsDY45%V=xxvf!0~pkJO+f3);2O4E8zGVy>V`+@u!qMX7;-7u@XO*CeRTkCvP6;EQs`&KfNA2pC9zipCxp5PtpPzl@oNmU=^ZU$VaNS zM>=WBhbzM@YggXrx5bq{5B%u zmt0OL=y8`hw`kWdXB))nFgRtEWLfW%X!L`P`?dP@Y#htLTV^xj+$qMq&mYq&CmQ*$s)QSqKs7_1ReY}b2Qj@ZpP{m+VNeHdz@aW z?<-JtKU-q*aTotXr(0>Nq5|mA5Gg3IF0dmX2t~#~OvcIA0dqUV*l#4B&)PtAB$wn@ z)QWN0xL*@rDe!5kgME?-G-x9*A3e0VV|r=&g^L0mJZ^cGT~#SooulJc-ta1OwDu0E zuS>b{Iai_n38N)AHE@1$6=QYXP$|>789ct@PeN-P%soVY|>LN!MUKDtO&8 z*Klw??_{$7Jn2?y$g7jP)TrsZY2; z_aA9$6Tfw1Po!UmCvc3w-9|I!J?PQ|bFF8VaE62?#R)C`v)JvKmd z)SG7h+1?R)BgzLfkr1%wcj_m$MBNq}h9Sa4ahVY3Zx8&ngxnIS#ae(9a%Nqpq z$o8MsAPL{`gZsjbA3Or&Utt`jH13MmZSb(+Npwq;Yy}==!&-v~ha?1)1gYx=%7m_k zs=-5oTw-yewyc58too1DQIb395Z|_tnK1ra7v`mt4(@pjOsZUkT+yu7y^S<%TXyM0 zpI@jazWw>)s_MBd5|J(J(kdwy)N$Dl6BT2xtlnST7ASL0(YIN0jb-_* zF8}Y6-j&v;F>gIZ;6`+_D3-I(Q1#Q2_wGWX`3nMXBcypOvp#8Eu$@+*-YJ0I@HkYp_su!yumV4@o=c zdAoFsaYaLYtB8zvXSEe-pkS5&9 zX(V2P$@e7m$*4@GO?rdQ2R?%zoqUlu^^Xjq-Hhwf5P|aRk$(pM@@dA2Nt^Jg3evqM z$LK6B&eJ}T;8%3FkX$d5EAaYSy@BhJmn^+s?ZkLM=APwl>^%4YM?NKK-Htw;gh=79 zS9?wyjn7Lv#+KM1svH%v_Eh_(dq;9st2VmFL{_6UBdHmZ&Os!6E7u0ben{E(ulM|u zBGy7or8iLZ9!Pih1>lh&MIFj{e<~ogKS9BSO-xZ|Id!aM7AS=FofQ+$509!q%^Q3< zjhyV>oZn}xtQk1>g*&Ni&??4C2cgxdzrs{sUST_}z<{ewdU8Sh z8GV2ReS{Mtt?Y5devb#1>uV)??;MR_?3ZBF@hkDDoM59co}!W3UJGa;;AGH(x5WaU z()?+Q(LD*$)SwgKA3nb!`8?>^3+|2VZ_L#G_>?d4t;Ep3gFppe_Dl6GoKsk$pU>&N8Xpt0Kf>7zb*-sx{7C%DvG7(d`-^^P# z-pHj|GmJsRYFe)F6Bt!onbT-{vVjiy3gR_t%#a5Z=Yr(>BY1b3U6ubglUW-oc($K8 z1-I!+dP8&@>8cyk4>jbzqs{pLaPl21ZoT$@q_F!jT(c*18D|a8UVB#7?zxYS9q`yk zr{`y!$2ewG!crLEHu3Cytkh{p(4;jxrXJ+R(^}49w+2Mow3fXT;`P1v*lN=9VqtLL zkSRf0>CpEZv{N0+`s!<5pK*r+wl%0Duu1HECbIwBL?XDx9bDaz>!i{P%WNOW=7|0CbNF#oXifcsrA88LOA)iLti&g-?^;K$o>3*Yo8Iu7q6UNbSW6fyK= z>32~Ry7Lz3iR2kui#2s4nQ<(Y{#AqNH{ygUf%unQF;F~aUq6@X@0z8ICBG^`wMnV| z!H4lsW|8=9hCEb)kih`}Fod%?e5x13z7lmgIk9nL6v2wFxwF^XFXGRPaF!12Wv(?c z`+3K~R*fLw4^TJ)wx)VeLHoV4aGyV6LqMRCW;Z#hV2B9TRk5&AEXD^-zd#m;i;x?5 z$B!mtHhNLwKICH1L!;@Eer+!HWo<~h3&&+xOk6%T_I;OBR4WmmqO$|3TL40UbY5kO zB55taA+*K(yH6JU-|z`!D=>ix-pJP#Gv(?hkMdK$`j4Wc7t!Sf_SGUOys>j;!d$yc za$zL!%^aU(X<}LDlb4;uYr7m5#r%?II!0pNmBIN*V)!=@acQA>Mb)JuW5zG!#C9my z-;;&2!|{>##7vfxQPb8Km}I^v$9<6fG*Mt+>M&K6pLwloBuQ<=YjznIm;L~Uh%>K( zWl950p`l+5Y*;{GB(sl@3xu=@`M@nUika_*W%|lbGhj`)`hagQg#B%5cz0);siit- zCI}-d2}98fje&IJ9V4GVUB5-#PI^}&Y3mzaf?${1VlNX-fG6Lk3Tl`N6l0E#R31Nv z8jlfUzNZjJyQHP>eqPObPd=ONQ=@9Kk=TGfbyScmf4am*#uNPZCJG}l%{}a(7_X*j#0s2h? zbSORhomDK!W{KyVT7DX~Dn)KBjUGyLJCv+u;=Zf(S)~1lkz1~xNHw(BpC;B`uI`EQ z5-@Dpj-{^h#F|_G!dE!esRG{uKAC$rXZsTunwiKL8i($qYzDp{`v->*CHaZPrWsVR zPB!ou88#UiHdNbZkd$jJH&W4TJdVQoO01ZGV{3^+KkvegaCJ*o1@IhPY^Q&Jn|JH; zHPVu*_Z-cG_^9qp57iD;73SzfbmK~{10EOAlGTGEUje;vuow)2aUlaWV3CVQe-?>h zBS+nxBqdp!wyqo&>DQWP(Q=(|VlW(#DhPCF3Vo^~?{2kJO6urMf*QOMIYmhF!lSy> z-`pW-8=8JWWBO^Jz=%7C6nVzL)BXFAgYI^|2WVW41SQNJq>sy#)$&=;|+zF+k9hh3VuFYt(ejt@8kt<*jr@{8T} zI*xg==!7myC?Fj#$idYMIq>QFYLV>!g~kw_#XD)ynU$z5Djmget?BH)7Dh#eCSF13 zzaI4bSgK~&L1Hi{^JV97R2mN=@X*vZcDYR8AnX+TE%X+0(l<125TM_F#!92J94+9p zq})I8)=cJoZ6Nr=e_Z7;fvdcgI3A+AP!>Y@tW2YCgSTEP_Tab5wO+K5+CKFNRe@_$ zca(w%0XPN%5b!e4#{O$M`htQTH~ufS1#i~*3NJVps!3>eCw?M&DCU)N?Ie=?0HY-i z^%!0O8Z2MPSt->bR_1Q&OAR$f#K!CV(3kQpLCwjtR}{TzAywEzqv=@I9#A*_u!+M zthMy~G1%{eK*)HWFrp3EV+cTRV^AM?1^fAvm(md)KDRkW!Fr$d z7Pmy}9(9@S#E*SA-HGfdJiYRv3&+KV_-y3Ph;F^=6|{!=j;Pd%^B&6=xa|HvPzVf5q{M2`e|oWZt-H zQ|vZ0-~I`a*c?z4v-U}rdS1C&5xp?GV|s`qsxJ6^%)lD2Z97he4@3-v!^PIa>b7{~ zVS=Y)o{=Jtyl7fS*$$-o6k@jma0;2JuWymYfDSV*iX|@8*-(hsh)k{V^csy%!H;zE zkq9m7#{)dUo%r`usmFeUPZx$(6b5}PTQ!)iEK{T?$3;B6H>yg`LNTO03ZWnh}ISTmt*CURj27T!^gVSH^hjc=v+nc_VN6bPvpoJIqxoj)S% z(DC?kU0fmj=nwO3iK`Q>x)BV_-SPW&5l?GWww`@M+=MKOH4Y6ce+-~nBE8fYMxgU< z{KRrkQ0tVOs~kc}#kNgI&Ry7Q+A_nYjQH3AW)2Z8rewHKHTCy=0?H5HjWO2W$l@F+~1O@7dfdR2ZYN+?wlNaR8|EA?zy_oIP6V&5H2iOnOso-fq-F!%~C8f;DgbUdJxBCp+|`&D!Nmu zNLAtdHHy4RpSd&YdHC1^3Sgaq;7D3+Iw+H{jox;I{vt>$uz4tF8aAwY@13)_dYCB> zO&xd)PHlE%LXV7CzLrpi()rF(7|h?+Oiam&cxrR+2rG1y2y6jGDg-);E(7Q{%Oy-~ z^0+Y+N4lzp5_h_pmy4-=obN(DlFkkX%K?;%NVf}D3LuBZ9LGgyY7Zy8o|>+$f5v|Y zS-3~UTOEaYybm6GkKX$py76Sg^Fvu^hRU^A4^(u)^ee}vKSiREZlnKp)Kq_|e)-o9 znN@xre!ibh>zs-C`c2#?!(ZYn3-|9%zg^wn5bz2IM-@?eospW}VK{TJ7V<%v!Ae z4iBXeR43Xa`LCy!TjFX^q39i=O!8ho+tJOaecm$N3=fUWL@mJc8uRTt`7ZFrozx6f zG2*-d7s?aY z@3ja{Ua|Fl@>*E8f`?FXPR~AXrl>%_DtB@b6~+I7x8!nuK_3_$$C5G(7nqB#*cmOG znU{Z73acjD&lwg|h%$BE?ZssBP+tE63E$~oEot#&V{ z8{rV?t|e@{B6!~BqwWaJ$7`7R4G~0yOEITyKJio52J)lN{Hs~4(6zvchN~4k+&|(A zlNhWA@{oU}>$cS}YpKNJl~P+;ZBwrJnezw{p@XkBzWb&0F2Wu4NRY@rr^v0kli#K1 z8=tEG^`u}8aK#b*vFmIXv}puNW*B+dc6YY2^)F&gY7#UF(?%`QDv57eE-zv~7lZ#B z-X4#S@TPcxRX#@ujC=HLsyAI2)KKR~tDd(xZk%QfMuNxSqLM^|4DBLzLr9_Yice?e zRYHl78Hb=9#lwP1j@_MHSoTBkVs}AT0*<+ov%DFf3W8VESGjtwIH6TX5WceQwj##+ za%cH1bM<9h2RO3G$1^C|B>3FXTu81|59-#t|kCPE$ zbD0Foi=^EC`hw~!-Bk*g7A6YUiMKwQ9%w2yflbHIOAH|dSEc`;rIfB37VxZ&(5@F= zeB=BhcCF#nxDB*$)`7*1djK|%3`bIjJ~Q`!&H3tH?bJ4}n&l2QsVxi1EV!nh#&|T# zMKtrrD0dkH{Cco>_!HG7S#~KjW^Qsdq31U3XD1O8$rVBN^#obW*ROQkiq7qki0oly z4xVg7y5*G2Hqy)n$rffUCgH;?1pIvaakvM0ITI|eA>0z6G$6w!1~3hu3*CqGSV?d& z=q>mpY^lZ;=>)3SQW1Du2itYUG?(8@0zTtQ%IERxacbY1ON{3B>&KkBivh_{5wo%2=~EY zXc$`&b>p`(3ZpzGi1rLnN3VWo6~w1MYocazMQNG;%4J0lCxwntq1++QV&&3&iw#Vy zlr83xCSTE=;YCfD;Cu+sQ_adFzq}5BC=olkSy-Kqg5my5?X9p3Lx-gE_r_m8H(zu- z)K{)LGX!ngC1kKR`z6?v^;3dg!XW1HE>Y4;!C|6Rj3->S@{#Q5mc*%LulH_VG5FJ} zmEFuJq<=Mbm*&TZ+AJpg7uHEQ%mTMcPlt|2u|LR5fmZEiH+pY3^v+wFlwN^dGiHP7 zoVt5s%N=C_c98R%1l7rhWN%2jKn04RbZF7S!5(hwborOWk2c29eo$AD_&k|HvQK=Y z&yz?Kl%34TVA_50o&4zFBPVtbidnO&^A%$p@BNI>px@>{_aorOaDvd6W*k?1&4bMr zZ6DymQrUlaWqgbz)%!Qyub&T5ReSF;*z0`%S^6xD0*WTilY#*iZ}Q@sxr#F{vh#nW zGUq-AtXFFIwI?{t@5tD5L#+-XG#5=O6}X6g=Pkak`jg7MR~1Ypy7c;KmKXMiJ*FQV zcdmYyUKxFtO4Km^SWOm|%Kp~@;wKX!#^uz|q1sQ1zN zfiFlnh};ZnrYP_u^yECrHP1M9@h6gSi2Ak=P++jfjHh}Hbx;Ko{Cdb7WJkne-3*lf zSgboVSo;h=;(IU+eSi8*UkSTNj6J)Q4D3cD}4`z6gQ=gxrTEZtzo{-Jqj1VdEmFky<5J_~}pRG{Ji9bYB3u zqz7`7+yacmfF?1FT0BpD$2nMsjWKKy>u)ly-62DeQ4;gT1=giuQ43Te#6Wfem9 zJAp^?9pr?)*>`WC6FwSH8^c=7?5l6&Uo07^;;Y_z>2(l(`%fgtv|5vW_DE73s~IGYhCR2UhGtCOscH3CT;a_7ijs#e+T7g1_&q+B6cL>x{CkB6G?5Bhm_9wk2G<<9fgH`QPK>nKs% zWc^&x=}xQ(df6OalTb)k#oppa`cPNYkePhnO82j$M6;YpaO0y<)GCEB^Tzabd>pmK zs3X&Qi49cUZ_A^XmEX;B3GR zP^^|gTs<+`yjVpp98M)Xpd-x@y$4O$tZwQxVhqeWAEmRlje=w$`>DbkU!Y+LDNvE4eN->)%Wx`4TXY$d5V<&M5w-{kwv6pWP= zs3D$+WP1f|(fV_=BdXG`PthC73 zb1cOXhIhsLS5lbHiY-2rB*}Zop zh_2i0LGD;ZA6%=Y33IJ7e}JKq zQ{*Yyy%W9`AO1G>R^%l2>|ZA-j-4cCk}OoYfMCrL*@H(|JZe8}5lZJHm6)?A*jaIL zl0fwUdx?FEhN>wft@Z|s_BaEx&--Fqrv^~0c6IPLsSLL#{_!FIuWTX;Mfdo>$xu5l zg00!E9MpLmZN?Or!pZxp&V4pd)-mOw zT^*8QvzIz1cQL<*Ckjz>e=yWFXRyBnHubb)bkUT-T<;V0Iyf+}(=@z@g{FDP-r?Lp zIqNF{SnVS2$_s*JK(IjF#`%@&nwsIB^mg`dJ8lA*7x9?+r&aEbuhXZ56wReB&lN~E z?Qc)9hi4+BO{2WxHp_Ay4UCq_7=OvWES$DFb_#(x5h9X5V4{%Vt53Raxl0N@WGm4y z&U(Ctsm;wO$(UOfXQLv8vxVYY2eic(p*jNvMyh^H6A7nM!n4iV&K-5aTb7*G?+qh+ zD&r)+qY*TCTO8a$#J;Wf$8UruelL?ev3LL(aSs@v8V&Yx#=W(|G`G6pA$_?sdr0e@ z{lU!i>olA+qaZU9Csj?lzO**iIcjq|HUYj>@YfK&j#I6lKQP}7)%X-*5wkk^>&X6u zq)XjvoqK{=Gc{6=9ioPU2>M_Yb%wX#H6_0DIp)xuekpFzU1Y+?I=u~L{$nX44H+yw zf9eSM%8?)rQG5FoYg@mmc&d5?Zmta)&Z)0ms$T@5nVF zyXPBUMXE4~d(fXwnBrW%twD&}*-Gly+*eV_7E>skXH>0CvqXhTBxrc8Hu6wD>FN7| z=Yw$GXP5jfB-aR2@m-rCwfyxC-$h%f;}dE^!WblRpN6(QYtq3@2?(16ltzFf)_%4< z-!6q_?d5*MJ@p-->q>9$;f3q1VQ$zBBEUL5J!kuYm})MKE_Vfz9_u#6gR41NcUS8e z+nj$5I%i#cy8pnmymh&+O`6)NzZ{?1i{$kr@2=#D=47~qxy606f&7{Rm=@O05QlJz zLzTqLwNdW$XHloNYT+6we(w$T^qnXWKN(wfd>>W5by@KNHIm7#FU~uh&JeIzF*gz? zZs4~C)?{?5UpGm99b+dh%sbd0o6H{@YAav8_Bj>Pb>a=nNmBin>!%KQ1W&DJSnIy! z=`_?e0>*D_vk}Fz(arHTFRGd}S};B7s;v5MvBqVhe-MLCYH}5?4Cob=}n>`MNOJv5_>* zBNryUcW6Q$ZW1KWZ4M1KjzUr}akD z0Ty&Nk8Rl1c>N)WX|=dywYbptldAoyZn_lg-4+7)Oo?mm(}R9@v%Tf(H@`N8=k0=9 z3iPw!t9Q@M+nu+C-nd8a{F7@w^LZS9)BVa&`h@S0jkmMsj1X>4pzyx{QGcZFSff|b z|4oY89Z{ud@+-R0x3?&_^_p<1j>cl{>lfN}f)(Ak->H6TmnrI^aQ)8|1yX6{vKJEB zlflTX?e)P94#}Gm=}AH4;5h2O;=^M-FB zJqM`E{_=qLL+rx-@vt-VkXBHlp<5OE^AC)TQ2l0(vQGn*Up-HW#ugR;T>Crk0Z!_u z(TrTFy1U`q4w?XM+NjH2{@i_z!(QFR~!@5M(_Xg?>q=T=_|NHDS|{#sZ1G+OLjW$Wn^<#8puD-NJXn@65x@mC zp)7dvm|v{lqs@Au&3Oy_!A2C@M(B;80X6bw+uDrn5YD8)*)b-E-0TWG{fsToBhFQ9 za5F(XSVopxhVmI5WJK$i%xO5>+uWzJ2~@7p3Jh7(6w~NiW0rG(2_g_y@S@<%1TDjv zD(TkWwMfY;SMtcBo%r+yEPs@QydUkbRj66O7AYAfjk$sA=fJT8Zg3-fwDd0RflF6r%eeF~uO6lLIGfP^C%ohlW924e zsYA4wJqS@JNSUy!zGto8J5xM?KYWUghZAhb8{sWxs<7}l_xUrdpvE)~KCr|NKIi1} zFeZURH3!>`3#pcvt4|gFVYyz(-W#Th5n1DCmoO4rH95#3vR2CyiveIN2DK zDpwkuyfpPYUC2eHUqBo2VvhKpS$d3&_skH((AKb;NvLj#Pr7zG%NqiWic|~YVEFxp zg|;V^aqR&Kt!OK00`}pNiU;yL0;tPc3o?aT3!elnN$n6n4JZ4AlwH4-5xLNF7pYQY2ytj^_xs`gQ!O}l*z zCm-gTn5pNG6J8WsASG%*ej|ELeCc|Uu)l#%{C=u_@AWO~ z@NdBqg5tqzELcRUPMG(^W?r?CA{wW4>26CXAGx-?#;3@)t0`Q}Zq*MO6u|dH1I1PY zTDS9kV|3&G9m@N7ULT+Kw=@L2BOY>-33Zi6R`{j;1R!U^l{0D)h$~na2W!J!?w4w> zz-6#B-hV8+<}s}}ohHNZmWcm8smXp(QHLPJb2FYLStiI!7>mZXf?-h&5p(3>1|YoqX61 zMn5w6YLD+h`%#+wrn&^?AE+5M(nMni#=SFteoMTbJi%q}n+r2jg^$`USKhGVmyu%H zb1{we5psW3?T%qfg+@m5eHWdLSg;%@-RYL)SMD_!Zx#|&fRJo$4TvcY5(oY!P_G}e zOe7t<*uwZ87~=lPPuH8ve*c>l!uyc?b2LTo2}|rAKU-3|=CQt?QxDIue1i51_|sm` zI$h=`I9d5W3;||1-Kf+hKHG%$BL8|YVihl1Jrbd5^l-A z;vkUd(Z>fDju6C^x%RlxeH^Q|PCq=SFCp>28*XZ=>c z(?Hbowhx529?G^n!-dh7#K>yIP>z!Xg4=8p*E64K{{F}%GjX~wuhu$mKZ-MTvz)Vf z|8lqzgcm;j7TY&&PJB180)C`EB{o;-Ea>{mRpzTsNyh&zVitrKL|li90Rbx}7=^~o zWadL+Z#Fy6xYjsKv%PwdQ2#wmD@-yv?MMU+hGw7Mz{db`WmFK0Izf{N7CWSC(m53S zC=HlJ$n#R?I_vlcLPORxriIB-t*(FYVnxtz|JWMC#;9as=jP37tZ!i;k1>&S<6&7n z{TQj#@Gv9sV2HN&);YK(2sqz~;@7q!gtCuZY|I{-)LtU?+CZFCsCz{otz{|L5`?)( z)UZgX?D@Ut&y{$Z9xb8BLcds3dduwkGg3GT5TdV8n zcEurlZPSo{D)|3V_Lgy3ecKu+T}p>ENJ)3AAkrm`beDAVN-Ld8hX{x?3ew%(T@q3v zsdP!)`4a!V_c{06-`$`1GFWrHbIm#O8P9m%9@wTKO!6BpmUl(A$7n7!oqQHN5Tpdb z2XM}AkCFIWSn28B;jJevfLmTxg@h8=6)}Q!=#$Ei4*T%n^7?u1NJK7z81RUG+<59= zY-p=dW6vJ9_n-xiyP1qN*v|Yz#0cvGO=3zRKq6&?nPS(cvCfhV$`alwl15W3ODbAz zJUR|ZG>1R11%AQ5RZ4ddA&J^oDXnw94iBhLIei>?+h-u zAq7i$@NDHLACkX1`|0bXxMt!eKMl&b|E$7>4{Onp3K-mLX1~_ZTvjpniA{XZ5%0kt z`qL-RN{L@7tK}tV>3d9Fy|{ZIaEaPR`t75?HDTEf|F$$AV-$#B-ud}0i7AzwM&rOQ+Jeza{%VGU4CSfP z`vXeA&>bF7lEo%{AgbxDIxmX}dHmM*0-;6&HJ3#tF6HnXN8mQB%Y|jhg@8aZk7a;@ zhbQG{$Xjf=T~DJ-qh3jR+ab@GN1nWuclnQfb8Ze-wcIiO_bRwpTTW4Pmhhn^)k@#G z-)}jTzkv3qU2niC0VKh+F>T35QdHR$D?d2r=hrhyMdn{m-!*La%tiyTB;@rZ$OU5a z%C1N!_pgwMNq8T+twtEOUnfDDj(^YYO%9Lg-tLq4>NUSpauIO~yOpt2q*l)hi4`Zw zs)tk2wK%0lL}}JdN6q+#VCqOJ74|%&zwdb^3)@7ek5bD;&0So*-5K3WCpgSwBZZ`8iNvsLDtlZ$e|I=eKW%5DmXJ$d?oU&oO zbZ|vnpw*~0V5maw*aAhPjK2Rjz=|VQLwC%0;m|XT3P6%@ohg^F; zP__zrMybN-jWN~edWF#KXe-_O0ZqlJ{*|tze>tVU2|N75-2Q^PFO6I1=%oaXrKnep zcWSjlw^HcUbQops(AXDU3c;sR5V8PEB2}zcSKh6;& z1WMK(d~g{_c4I6RTP5)BILEc7KNm}%l);SFLGlihzfhwm20FP$d+pJGB`3I;c7qnj zW`U{vkBCs`Yk7@txMFkHZ)r4)l|C1p)bGxv=deUoLV!+k8UOA-Vr%(|TxZCm_Q=(@K$$T{Y>P@FsZQ3C#li1R zg}6Owbg?xhMED&`BN9LDDiLM#RLzFZr`ka`$Kh*cEZEKKh}x_NE|dlV5bsw%!F&Jc zvLDk^O8N8ePZX)5;DbgYghWCjPf}9*SI1^MY*?QKqgl{0qAb?-eyS9(5+>zn-~qYC zyAmKaTqM|nq;ZOQ99%(Sk$lRMahHpoHY>KI&I7mxZMoN?X@!AzH`Ehqoj^${yFU4e z$Wxf}dCFGBUW-qUNbo-}^wldqf!sSO$lUz`v}?pBFeoE!(E*uR`#cRf)dnlD>9#wRo`qWwqj7b4t;V zHO=6D@OiJ-?OrT>z3{i-8>Wssv8#}&^{yGi07~DIlUj7oy0rBISa%OPs<=OBnRaO6 zv+KfXY~RVi_>beqZv8gv#fa4ow&?aP&;D)Qk>A0X)+MS(2o;9(w1%cJGjwaZj2?V? zQJs?<_m=)ak{USk*hDxB$;k0@ppz za-!T(fMhN7Cea$fAWZ5omP_%A8t(GwP405>e64`V+3{6Kaiee@+4 zA_Ctm+xy%11H=npK=RMOuOsMW`%|-q&bA&*u51%fOC7A!G??2bF1vn+r~&IjQ})h# znmkRaC*3Q)$!bBf&orYE(RTi1zA?3!k`JrZ`q6DqB2y(^mIK8zG@gN z60)2T5?fDFx&U?4Yd$taEuhSxd~7$=N|>y3R!oF3a(V&z1mi(cw%*CsGvW%_7sOvx zd7US-VX-x^ZXl$WC@6rs3i~d2#hVqH$0zp6d@|OPF7d>jJme%7@mtHl>(5`NiR69} zLsj9mCv;N<0d2{|di7Q?O^uJ@f2Py78`x!73ghQR5{G9V!jTW*E+p~@-L{y3!3p3> zP^4d=_aULGI6ROmL1Z_h8u^@VwqI7x_dZA006vZH?t)(D1fen4KRsCxLl%es#*`gX zRC#6)hA~lo{$A$8=dFZ>m4wNy2K3@b#)?2%^UD67K(?zhK3Q*-l-jo0zDq*>Ue->mV*MD>!}7cewYC zsqSli(yjM&eID4{_S+c!EDbnJ)Ye_YW--)$Lnc99gQN;qPdHQ7=zsSWv-9MQ=vG}M z_zHA5d96~MXSeyhN$YvfkwL7Ek&W~UsKOhV(DlH3C`{;|CJ=#&jO_^*LU>76uHz#E zi3OYQ)n`gABk-qBiXIxsyThVC`6q)V`avt&8<)T0EBVEHz9oEjzh$2;?Ga~d!RlnG zJ$z8pys`ZtO#`C9NT6$E7I;kGh?<|)e4I#^h?>r%lt}ryTiE_y{d;g-t_|GH6@B66 ztj3GP`-nxg%zF-BUY=C$;A-95J8Y?_o%wOb`0ZE!k6{L?n|!f8=?ZMv@KGdf&s6_% zC`4JgA&9H=ip?mPYej;cyynG)@>=M~NjkI446T;SnQJ{$nUyUU;A!8gn4}U*(w5-+ z%k~eiMHLKmyq%@$Gp)oHFM(C0&nyYWkju#q)9h*bxi@|eM!V6&ia_gK;|#4PrY8;( zz1I*11FtR$iOg`#&#nwX7TrBY_}ST{AFyWED&UUS!r2bL^JQ{dloAW$E(`ldvAnbeCSH5|}T96rNx;>FDPVMxYO)tf(ak$;VtlQl}IOlYyf`O3-IsyU-ms;^I z{M#vxhal(h8ClL)S2wQ~<(qN$Y*1J ze8(fT5m4+w%7CJ?ukAvBpG|S^2TSpvA|iwIN1?;1E8M-^#=#QE>J)@<0*ANjhc3WF z0&zXH{yOp6v4oLY3OBIx&mw2*biBXVWMs~16Mg{3@!pnpZ@Z5}d<(>$?F=?gthTXz zSL#S$o2~KoeZ(|0IFbD{BM1we;2ZDI2=JAFk&~g$)MqlXk)9#P3BqM&Wm>Ylg+|!C z*zQ^Q7#Fn-P#585>U~1dx1USi+T7H$BpK0GBMR=HBev(3sy>R1Wz*5iJ_T}R(8(rs z^5qWNZxhbCNy?t9e`rFS&Gt+S`7%n*Vmgv3!k%|?}rZ6{NcK&gg1>*;s9=FMW+r@hCJ6mQ=w-giix&Ub*(_Q@|n9spQ)hn^OC_>emt=ssWQouBQr|FgEA4 zl2xNqODp@D>26?YA?;sCXz>3SM2Mp)%IT^E(bqLBhIuAum_>$Jk<701vBYd!pPI=6 zH)GC|dy)h}M9tzAAOO0dFK?R^epfTLQS`tU1u1}^F##y%R3GL zc9gVl-esk<#x*HyJt8c8EAoOh9n2M)?-p~&f|p;zD)C*1)@DLI^dzDr(eMuYc@G+VK`qulsP-fk_S64{u<3;V_W(bwl&=cKlc0}l zi%OhJ@Kag)9bTv+D!c53`WSZ>i~q;A)E3r_#nRwK`Uhws8)Q*7l=Rml>~Z7p%bXAQ zTeV;Y;G+w(G1blcm z6EbeR1>m3?$#jwk7;cYQM*E%+|NV2X))oNZ5{O%DkpyjZyPBCK~{rCLqFZ`;TdC)ggdo7b*;KHVMm2F>*ztAvguyw4> zF~vq+&{)e%duZ5qc;|frn`QmABf<)0ms8_nnYzl1HRzZU=lnC7+4p4~w)`d2@jD|2 z?l<6lmg0H~RDuJCY+ZLZ+L7lR#kr=GroZTpOVzXPAySb*41I?dfQ-M5L%`LAx;ZYC z6$^M{PEw~eC#%S|y6~$K7zS`V13#u}d|s?_F5T%G@Gft@a@C3lQu2Isx>ziZ3d?*F zb?{I}n3ct^to`ddkA_>16ypETG~rihA<^U4S=lb{Y2~))Sk%@j(X=3xSG7GUIyYwa zT?d=5YvNxG!~wUtGsH)x@D&X74)rDYtkzoEU4qaCD=1Xa^SzTr;L+e_`97CSlPNuu z-TRC`hE8Cx&9c^C$t`YcKx}&L1w*1`NqQuCb&5F@z6Rv2#D9<+ZKw?L$^9swVVr+u zhkdhV?9mu@iVdfx0ZJhiLZlNJ4p|pjZVF$6q0I-vZon37dB^g9U137eD9O7 zOD@Toi^q)YPKx>Lu@?^c&2(Q-Nq#|eJQ?)5+zhCA9t>uYp@0b$|IAg(_kSzv&k;Wr zXSFFjmYBmuoBy-7*)8r1|2=DGLL&=kkJB{`PLt&`G>;ix2e?Hn-r-t46~8$1LL(MQ zK7|N9T|~YYAUP!i9g5eA$LKY`QEHtPO)J3t_`B%4AE}Bt1IG~z`*dGK!yXS`42)Cs6FniPLs@yA!^7lolEK{H;4*c9|3`m^3aR1R0CoYWKHU@yJ)qt`~%% z;j*-@*V03=PdGZs!T**e3bNtXPQ!Iaoc9eo`}hbl)n1LdM(d&pkt}5RD<3myTrT}Hn0~~?t{cnO_j!I}H>87<2V+e)EdmBZ#oAnQw-_Bollpj?wh|gjU`d+FgClroA zlRHp|iZfRB7#>5A9#Wz=j@Hv`E@On*G%&i#zY)P~oex3pQtckA+C2!iqsYGW9@+5o z_5xp8=JrgDOnUCUT8a!l;iOZ~%uOC4P~sIu#Suk?;07LPk8t>i@HuDSrDdNJ%nL zC#o%y-3gDN7I7ZLwYL~B4mt3u&{isa)SL7^9=8-N8k)D~MUBg_iCK&7cQhpFuzm9^ z(v}O%k8fsgN*_0i+?cLYlB*$HuccR`h9x*&Wr&Q0-R^xkgf9jwFVmRnxAxfXz=B|U z=tB)v9k1&B&8L%IJXQD%V>=KRJBr`A^AF9k`WLhm?z9sCQPWf>ZFD&{zuEq)D?p-P zvR&k!63#bP68*D-^0je=Ji0*DpH>SZV$uKOT|G*Ca=Es!-+3m*OX$Ur z=9Y5_k_*=)Vhj(tw`87aIlZ>aS8(HudUjgJRQcF6TDS63^^7qeD68G(aAXj?bpiS1 zf0{6qTp2t7#88Hje`aoH>S+B+-`vni-`?=Gjj64(zL}k)zKyAqlcBk({wouGS5Ey? zhPN$wT8YSh-`Rtd>=vl4e!F8@TWxfn^0aw!f3KRjHetY=fWOzhCI68YW6c)MZ^xu+ zWQ|+9H+y^^fSvgP70i`cVb!Sg9-;14B4iO~# zyQZ;Hc;%a3L-!BTpfT&e!32SN=9%ot_%>V-H-A37l0`n<$i^0j+b<9QSW$xik6S_z z4=>h`Vc*C-2_v9=5GY?@qk#%9)EYg0OIhs{Z{6C>vLX-x>yB;z=eB+S7;&_K}sZ{bV|g$5~gxuW?RQ-o<6;FQH9O;5KSJ+8%F z859sl4Voe9{beDk)wYZ%syyhSt>cz^d01NOZY$Ti#XPNl=S?gNGlnm`&h;5@ndc01 z!dA~(ndJLYjPG$_8rzu5_zz1w_>8~i)A?qL{wBZv`prLksvA26)m!yYF!3Y2MWpSe z#42!=ZYJVPqCnlAE%``;LlLP!n1`%`o@Ed1Mn4t@bge{S%I-@e1wDBJ4)ir5c2}%y zjtriRmXPfw-q~4lfH7W$$-S?h362!B7^{S+*ZsO>2mxh~gPP|b^=+D>bbADxUW66n z3^MpvG&kt>LK+;{AIY79k1a>RF6OV74J~7Wq?s8RG%aDM2ss%ucp4xfA!nib!Y!@x zEGsTnxP-4ucd90hi;+won1Hjr>yammEP)!`91s6~SsmRKqKVL0;PLTo&PUvppQaX+ ze09s&3Y}(hiPrd5c>3fa^12$k5}NtfGzSma9D?knC1n+ytcMH$*#l-O0y}vINAIm? zI((74{w@>8=#?8!!v1LZ%fgzkRmxOvI$nPTY$)(31n?*jc$Q4RoK%0*OddeN&oo++ z9Pv>+L@a~oc?P^X2EO?}MoLcz3?BhF<$r=fbSknse7N2h^!5+3xBOVNI91Bkmz{(j znSJ>eduqkvXkeDrM98p<9&{1(Qp(E8DFtr-%I;&<@0vmdX0%6~hbE!r;NFI20HA(iopiGbRi14X^ z4k0(mL~rv3Xm$C$e2-xH9)!cNoodF)`!r>iG&^XyIUg4JPbJ!cLN(3Pw`}~${NS6( zfGL{S?N+9!;F?@ny| z|DOg*$l$b2BgA{mys80v-ivauHp{(Etbu{9$1rYtQJd_>K>f?mKuy#?)39{TN}?3b z?OaW05JD>`N>m~%>HSB>0{hb9KCc|Fk^{=S8$60Zm&JQiD%|7CiQO`9Ud%4uO8dx< z{Kl!O?>-p?T9mo>NRt+O)xzm=UEL6#N<;pJUmCp3UpND~W!nQU?E!8bQtU$w)i@BV9>5gV<#% zrI`_5%}Hld+r8hPUi?0~H8=l?>e4Z@I4s1?1T!;>%PomVrjQt{!Ju=9)g1 z9P!G)4=g2Qgu|KAzL5N!7-bzDtN<}7`KK+o5dM@(a^kE~Hkb{k?3dm-eHHw-LTWqec3e{h6P)7%fAQOzJNL{U#4L#jPf)ViHKT` z%U&DCT6O$PPVwdwlA=wYUY$A+zol0K88Ah7=gQXp2G2KP%Id=mIyy#rtUdyr#L5S_ z)J=3BeOSaUBN5^vL1&e7!(*1T)!h|j*NLg6OG6PpDo9`u-f>dcj1nBq#&(hnAq;WM z84m`G5jfswM#Q(3{`ren*=Guf8fQc%9;hzzWy0S623%X54MnUyZTUW7w~_z#kZK-B z;930Vkm`lHJ->jTwaT)yr&ac?eEsC3EedHVWsnbnR^=OPL4jv`rLr zwthp4zu^z)d@=)@o_uIWB;K}~vLOPqsjvCmH=M->=*{TdrKQ+oA3Cwv9V&iQ(`P>m zwh=n2@I3ws4(K)c0U*eNI_wy?H0^)NPn4<1X*A;M&R zu^s3_kRl|WLV;@LzbLT`s7b_0`M>Q=oQD|yjNJxQ`RX|sD(jF$Y`B&FM;HB1h}xbSBOvkdyxg)pngCE*EDT0lI)+duRi_7bT#2R)j)$iXJ-E;1_hDJ z8eO?7f!rHY%=8iQbnsM->z+~#9Okd)-6BT^`pxR^9C}v+X54)2chG!rbh#Kae_Fm^ zZMxu~OI&hE{vGu|OsT_(!n-LLSw1Bll+NxN90AiLm;++ef`gI9;k#1k_xh7q3QlpT zW5>!!O2JUwXC!TSm`0$@jS<1T5YNAsD^JqNy#*u_b2sBy)JM= zHOx526|2!!f5Fj$=uY4o{!KLM`Dw;4gpjK8JM%??yLj1H7JI$L>@^JI z`dY)@08jx_!M^~g@t@XWKvG7CH9su@!ZxpzoIGk-T+v|JRQ9ExH1-PIYdlKh?m(uSUBd zGVdL3UfFC=H^S3OrAChA8|E62uxtHkq>eKy7oJjQi#R##-lD9L|NTRXxLTw}xA!DG zz#HG#jW$x`&a-Ti;6@Kat3lQJC=@TF>eiC?kS%_V6^dNWJ432>J$M7un)>-ITDe3u z<0$JzV8&Z6`o$!F!ZYqoaY^MQqJ13R`-~=PkLZ177w>4Z@=d(gGkqZC3^$F{@U>_)S+*)x*1gOnF4t$kED#_!_>=HT} z%|@Xw;A-)vR+rSr?nM=sp_jww7Ufq7&*}s0s|H86GDoAI^xKwEXy=Sh+B6AL zf-E1lB~*W&qa1Q_dq46*@E<)d?lEcRKgfKjwP$%DQzmD2j#B;&WPonG0x&xWf{MQO z9Djf=$ruBP=|lO4*PWhPqw#NMV4rcS+|Atpg&wFn4}_Mwfi5^F`B~^pmACkS zB_`UJ<#3_oO^}k?Sukz8qmA9-S#Z)njV)wB?poy*L)>KzY=q5{6bmoByN|hE;<q~0hXu-NXcE7 zv#&wip!L5 z8jWLItXU+R$IX~AJNcApcsvRSb$-Ax^G}sQ5XNY48=Gq(Zd>-D(e!4+zM*}%yvAoe zNvv8CUz7LPG*}4e zE=+iiMuhvGwlF2xukz&HfMDJ&_2KX*ry08kjJcWi<01#gX6o4n70dYV|X=+GeEINAuAP~peR0iaKz((B6ylHTk=!i_oU%E zmVAzi^Bfi8>5z<^xNH=5sab`_QDHfQ!@-es32ToA>;HQBT^TEQ;5Bp1Tf`}6InNf3 z;yKo|Y0n7Yw9v+M2?z6(iGA?ix6!FdPQ29QXm-bZZ6gtit zdZvzFZ^7}iMX_7q(uwQCqf~PVpVdEI+Yl8<=bCtsi9dR0VU1uTL913u4>_kG*Rd3z zCwrBmafSU@ZFJs`YVqyuy5GrGv)17EJVqmUj0P!A#E-;5IO|{hc;#@ggY_yc>lg-W zSx5P^O@0_7P3Y|pddmmL4_xlff5%)|5UK53B_1yH#$G;&cugUw7LvS+jnH@d1b=1 zCo~=oVE6)@`^{y&t|mcqhyR3E_2!O90!tLV-JK_crrjc#q^Z^oO@D0{vm!#L4P2x_ zcy${Pp@V?vKLWEZ`LlQt^78^N-#JGz+2#9d>*6?WR(oA&NxN6d#WJwythZxMph>O% zhDY?YybiN$Mi7HY_AVTpOt_Qp>BO>G#~#)x@`C@f-aUZce;&e`Ot0$2!jg`$F4D17 zGndoj5IUzey~5xGAh_o*w{OMq@S`WBHf7sc(^XrpciO=(dI~1PdAgfC>5; zB~!J4dns#L$a`^)ftXanqd1cqFv-MeDVmQL3MfWFs}WScU%)3K45RxwgT#7ooAabq5Ae)iSG|qKU?M@M7eeks450^w>zZ}?H6jNTUtpM!NM6|G zKa0SqZa;pK4Q$bMBy0u(8DUsw`ZM7+$A@!RC@BxMWb{PlvU)a|Z8|GR+aPb z)?XcXdB;V$MNs@5yGn(Yu5(}+av&yWwQHL{N9tIuxVh5?5-!L3yAw7pW#QCx{@TgJ z9^&VN(ls=5bOJ0zCe57M{t%KOSvOfjqkEu1`EBm_=V=^u0D+N}B`Ve7t) z@jFC|_?@PqsCN&B%uW69Xw1pA&|%DBFHK+tOdvsO7BM0W(vPSF*^!{!4abR(51a^}eNlwC0|JCciqF zdz0V7J( z$f_r83DPvb)5|a7J3ih+<}3_u;2|Dtk&_7i4ahid+@9gLjIzY=Gg#Xs2@svl#fHzH z`T_%lu*J-|4?BdTFu^rKKp{Xtfs9f+3>+y3w&Wb@OszmgOhLnm@*-hY-kquJfg&G6Kr`~=n;b|`rr$* z#M-RPj~imX#l?6p)Yab) z8l!c^e&p@$cNfO>s$#`{AVcmZY?TPRO~ZLxUQf3_V2ed3kFFNlz4D{+ob^Jma0yah zDdKq1g80IRbF}SW09GgsvXOS{N8Q*c>5dOHXjQ2uroQJeNe@uW1LPpRp`>b`?!$l^ zdp3j$IUXSRp?sCNoO6=7pX}9c6}LD0tjS^iIeu2qAH{GTK!r?(m`CP(7LA_Uo%!tP z6Z7YXysto-N;l>Xl1)7lJ&}?IvEfc@dx4gY?HqN9Qx< zFcCNse6&K$F@gBwXRrSk1H0Hf#mav(X7Tbqf#EOFB%wbg^zq4oTa`bm-4XaS#r0)_ zexzmm3>3bzJU6=Wf1v%q)-e6D>2dN;v}h|&N{ik)3ncm)s-XEj=e=BYHonSNXb13Z z85F)qMu8K`<3`Rl&Uf*o<=+FtBRR&bAS2N7XumiqSqSsrtAa;6YhY{XlP_b?}e@4!EcCL zI6&V*yoRMbAL&}s8$s+C_V*cXCHK&EWOc{N18r`Gnkohj147|Y#8IWTicLwUUb$Ce zXZddhpAQg_x{RFA1l`pPfTSP{^~dq#cVdT%W|C$YEi{jaw$4s2D5Aq-ci_(Nfk9Sx z5Niu zzMU*)cRQ9?xVs*}{>ernKKU(|OnENBL1PT(>N;jOQL$XRUT-c?^!=rD4&bnqTfGDo zFu7cA%U=xCjK94;kjimebUmu+Sfte&Y0Uq0^g(N$^UjR}oFU-z&%NV~=_8vi5@tU7 ze9oC%$U#J>-Df=X>uaogL>}>Y1KM zHeVibfUaGv>#*8v`Z`zkPkGV^R|X3aL+id0_Wf{Q@np~Op^$X?GMk=>3ZK~%BT+E= z-OL1}EN*+ht)^o9st_t{1XUz^cWgZVyr_r0mzkNv`Zf?(8O&ydMU@7CoPPtF15I$# zYUMJYj_*HRD@z^d&9*bQgi#$?K|d|eZ-nC~I_H*#kH2^0Fhj(w`5&+*(-|d8=a8+t zpZsW&O-*?>I_1xH;DlaSBIq&tgkaO4%Q^Hn?5YK|Cn7Gw9dKt=(C;I9?Ysg+&n|5Z# zfqBF?qus-eW~w}^4$=~^s_R2JCDN7Mk5+L?KNTu0%qZBCN8BJN^Lp3hY{YU&c@yfz4ZeC*u~OFNkPZI z8LR;K7R#bc3P;dQ&KTX6TVqCd;&JVFu`SONWcXx!1Bff2Y_m`}4y02=xeYzy65C@p z_i?6ZmoEBRJe8xEB2hb?g{8fCDiFIJ_*mG)YE@6ycE70ONf+ed+{Y)g@g;BYrPdA^ zaW~kYaL60E8EpGSp>6EUa){m*%Ru(wuU~7T91eS0QwBtTQ?=yo?hf&wa)VJ(GfBQdZAs}zg2t=esa>8aX5$IjJSWO>u~(krE_$#;LOws zzc(o%QMv{)WKd)e6pDI<(7flFAC60MvXDV5Xe2`Cx)pUbY7#oi7&x}Sk zNjK;NKlcX7!%?ipRIA0~me9cVfNI{(mBsZ?pVJ}11Lqfe>VVH%lEPu|gm?`^Q zT-YtitN)3LvqG72zx#kd!D_B+aQR)1dpL4PVIU~47#u{vF8|sK-=aHVBNBT0^G*`f za_ZJ%JXugVC&HC(xJX7bI(C0!Owbi3l#V6z^|Y{1LTbrYM!JHe;|#J z!NZa}7fXu#qIFvMixc}Kp_uSF;^5tJ1Mgry_<*ILgjtu`mCd($RAF3gKhC-Ys|N=w z&m0o=yB$3FI%EK_J5bF9#j~4gu81eZYC`IB&9AIOTW{QFqoj^`u!Tsvk10uU@h(`8 z^SRId$$No5B=AD^1{~cX)y-dYe-xx^4%>XjST}QMYo}g;HB4yDMHjwNNj{MQ%?}?B z58!1RyxIF1Wvtym(?zlSXO3#w7`4_J^poAhiw{u%^27TEsnCY<@sYe%brO}R(ED8% z%}dH>4!kSd5bbbn8OtY_pf&b-T+oL_$KC|&7n62@ITWELk2^u5)sBi#ivX-o`%AML z@0-;>3Ys8u(fQ16HpUsuAkj?>e*Gjqy0Vd0H6S}4%lPPS&%n5#yqtLLESWs9rJw6N zq%%vl*4os=B^%Q}dLLox9@~}vyK#P-bL}jA(JM^VP$S|H!2LWzwUQBk^kQ_nG@5)E zPt^=EPYXg}otq@gH^Npj8|!Rd=|PjIQz^6@A(>tdqq+K2xcV3E^GlBSV=!Y!)$q_H zNAdhN(SFz_4!u{t0th9kJ~=|2&gfoa^-zQnlLi zUfI=Jm2o$BL`&1b!(fBuFu9FQuT#g~F4x+({cE}1XgU4J%jyrl@^Q*o#M*Ggfh^|Z zCYU9(EMl)=(N(V-=%63AU!@VbnO48nn0^e)Q`MjJy{Kn~N;U3==l1ma1uYrai<{yZ zpmB-@h^t`{jpL>0zT@IfJ(i#NSK+8@?XThN@Wx^0bvjeRqx*Ac)_d zCyblZFFoB!r*yasMPGxH({97v%=*E<)ATStfE3(^8*Bv|GW6H~>32rqr4Q+@lo^ke zv}mw@nmnV5jKXZpZKuoYyaFJ5*M67t?#0I-^*TfdwKMx8a;IZji*UkkY~k;7YwFRZ zn3&5!f(jYx%N*0N53bD)k3M;j{K=vvj@%9A=tCPvLC*+xO_roB11w9@^|r(GpF-P; zp#SkV%n#=a97X2KDJ8=sN|Ac%;wsr0_fGlGUC5aFfkOaf1uzwgxJIxxrp|`?_KtSO z02*crU}0SP*gBx{2!VA7mmfkGvTP#ZI4{~|gCW-l6y%8Vmfd1WzdXe9Mdu$+2!@ql zgGHO4t?G0^>Uu!hZt(3X?%Nj@Uo>Sywpx%Mi0AcZe?#YjAq2A|xgf;ip?Vv|qL>x0 z+x3nWRU>ANAQMRgR^J5eTwKPI1%Mm{J{Jm%3#<$gde09S2x-ob%7iQrx1&g1j%NWF z)>-^I7$)fbnkLWgqjETOp}&UF!GG-wUVtoT{+>-9=ouZFahMnHKZBUMBX-kNcjYEzrLSGTxu-}nl=+%BX(oq}%vk9aiMxpdw zSyI1J>GUk>T_b{d#vj6W&(6A<`z@j%v&T=PC&7G$iuowbrZX-N20RWKzmHn|;{7)z z?KOeW(uX`(q%+ z0~L!UW#yP*vwLNcp2GiOT+TR7CaEA z1mCaRcu)arXnEqpL`Y!;b<)eu(DDk@P$2U>-xC z*G8QFsJ)&au3JKy_=mWuENR{ncOlVVQS9`JXFaV0=v;?S5FcM-Jc#a^m_rFIxRWVz z!H4{R!65$c!v?%zS2!5R)MV?BN#}qxUe$uu>T+DV@QClkk4uk9x;Fcc3_;PFXy7()7u0 zNb7f>j`s5^Ek zkn{x26ZH*`DJmxd%oC^_ZU)t^!Y6_QOtsA%OKC|ggpeucM=q`yl&HBwhO?~TmyiQ7 zXL3Are%klc8spDC2p-Xk3~T1DQDqy8RH8rGJyF}@;DphEKI~zLsuZkj(}Bm|9k11* z?@0z(2&G2zBy(v${3X=gKB1ez&_l&&aJ`7P=vbMgp57}Zj2@*9@_7{V%c22pja6i) zPM`;@c^@i9M}t{AlAj?h%Z99+OwRl**hO<1lDuA-w8uZ#q?L`z1p_D03*8fTBt~@| z&!E*tFIQ!3&N}gNB=}_2pm5EU4m5@p=mjI zKL&iROILUYS5H`FqXjTHo4}tgMFZo~+W2*w{>eeXeVy^-ntE5}`d>idc-$x)Ek+M} z7b9s?6L-95*;r3Rlvyw516N%;$kdctuQ>J(7#Fa#vn8LWU5Om#=O~7L6g)>}nsk>6 ztKA}W2>#AITB)FeD@-F)%C+tNEEyh&;!s$=u4g4u^yI8kc95o)HJw7{$JBTwH<)AS z&v0A$bNJ?gVzykyvas@ub{~yBtPXpZgiy8Mu!EP=3-msiQ>d8d^svQo2tU<*xqU!sUU%|eqrn7lr#~mt|+q^4Y8+UIz)#E`# zP}(jKBZG>?aA>_zZZI;Acx80L{oyJpD$B8^sE3$2e|X~HCrm03(}Rj7V@0Yq7{oH_ z)bfW-e&ml=n21Np^;J%d+(IT$kG=q6PEfIrjjx)$?^|;ovW-HDu@hgUsA{h;_Yqgh z9&N>F@j@M%f)D}_{*L=gH0J}db0pzWh;}>>(}#);9`tOSb3JZ3YwIJ`_(q_I z^Xv)(?UI}7Tb6m+PP;M?6T3cgF0PR8q^U*=jPtt88ja?ojGSNLeFFu*XDCT3!2O^# zq7(xst{eX~^jge>qN+s;rPHDw2@@dFKt4Q(lH%eZ;%3GWAzP9#RE1s(YOuERnu;)i zDw+~H=j-T)>j`^P(WqP_VcLAUjU~+@wn0jBoT`YBN2g4p;Yw{|3FXJqzkeeYg5_ND zlZMU>gK5I&hQ1*lS<5{oZ;Rhe7bV`8t%hfRk(i8FlVqkV^7`T48Fs@Uf*Xkm-5vsp zFFI4pN3l~=0UZplu*g22kt^pY&!K-9ib;7veF(j|FQIaTr%iHJ6o_0PL)k*gsy=U8 zj+{z2$+*Cc%cwK!@)c~OBvg$0yWltWlzdrZinG2LxE&em200AMA51*&zput)oXrC< zWT+UevQ%Q^lm^d!$t+uV!)}Ff(a{p#s_W{@-};~0a`k|iJXGuv$34Uu_OdnsLjv@o zd@dS=A{8y8n&AkIWF@St)>&YQgODIBIIkK_xx;@(r4L=Q5-7e8h9l!dO5&T;mVh>~RB7CU|L&GN((&3_l-(Xc{ ze9lW3cn23xIIjM+11bFyqt3jt1v;0iaxQ7gY`R~+yxuHQl|^&Wfz$W!=JY-OAo7|? zs3o{V+>ewKp`tbgM&nAHF$|_!;)x`)S26VTNkCun2^kYZiFs@O^K}9L{NSjiwzs4g zV?WVH8=s7pu=ILDKkcC8Z^a@P(L_g|eXVEW>(bE5hGlpw#(*5DKHqQ*yiWl^EzR5>= zC8t(HPPUO;W&VJqbSeObGLXZ<;S2jAcl5h4a7w(o%wo9Rj+SR3jg3Iz; zl^27$I0>q%)3*Pv1U)}e^PvxTe_p6qUie<`AFTKWMcPW3`<$;3rLg)W#IV{n(`|Xe zkVP|J0Fi=@HL+I$Ezd(>;jJ~)FLM{PQrVX6VFK3w9-WnE8-mwThQ59KTX#3s9&yI_ zn)$g&h^vdtlY-iPv(=7F2ii_2PcL*XO%q^Tfu`$T?K;nmb;YG>$*Y4E*_bna?H=5% zWhPsdlb38|X$;Pq2J06X$Z&IcRzRXvx9!};cm=2C1dsU3j{82`j}KqLiY8L6fMpq> zKVaguo2@6Ifq1xOLstnkXEM#cZPU2RYI|Rph)?9x?Dud%Vq!3OA9|Q(Ii2-M^mZf7aJp89-l_T8N?T%9x4uD6W%JcjQ>kSaH53$MQN8H!yn@{kH17XjWg!=3kh zzqp4ndxd)BXZFQ(`Ci6PNytj_a@deO$9**{dn0Y&J->kN3QpG_g=25iR=+O=Po-DY z(=R+>M$jG=YmdJATX68u4Qz2dR1B9jL#RCAtvQKV{DSx+QFK(cwI0!LELiR7Q*>gZ zQ1wLt6{FNca6EIEbeG_{+Lb51k`CW$Xf!>#ony>KxYQ>Gey;bLmKHK+siV2q$*f^T9V z?n-l-y}vbzq@=OzcvWHHC%6wDRVsyJtT`t_KN$&BPDkR_zN6XYkX?|8$!Toh)~2-~42+;NsIm8($g*H6mlswcn_x z%>I7o$flvoi7?33(%_L3W&NqM{b%pKnDCAOCMqWk45t_zBwSyCf-;?}e30dg$({`P zOu||KgH&_g!Cj*1_wzkRgcI?%=E@I zb91Z}e@_*@oizF!fkf$QpP^Rnunjy*2)bk?N2}Eo@-T6<9j6mVM%$N54~o2G)*VX} zI7CUEzIQNO?c<8Zg(%gaa{q@B^GjkjpT{F9cky@j_oE2&UW4vmKSl z|G=fsQfVSYt>oyvu@4hJUgb1*o8k>(?KyS7E5{(rE9UQUuv#@)VlViap8)Iw8+13O zk|g!gnO;;mjj$vYjAAau8>DVFej%}Z#DSL{b_TUc4p6b>ccoONyp3ta>M3F_#}hJb z>q&M;n~b8olvPh9b0>jVEL3chiCAX?L3-6QC?+OrFhS)#ZIFwvwcPhVEBxeY{xU#J z04lci!F?Z%Z==F}=eVV}F6AnG-lIP}d?Lfml887yHUfy5-$iN&s8qHK96OYw5Yo?d zKEm(~>b@Chx?{11p`;C(FDIA5p;G~o8t{e^D!F;h5VFJK{4DAIAIjb`EURF9AEvvz zK|n&fyIYa&4(UdahYkfP>F#c%yQD!uBqgMgMgi%3_kK9%fBoK%=lgxl>{+vBt$W4H zR(R1xa5Ea?j7{7VH_vNbu+0vzA>F4?97EQFjvsDv$3G+=g5pina<`Ps?q<>*TOPId zp}r>*RL*z6M|xnZNYDJ#iN~X0nPaQLFDCRB5^#y(J~k zfA)iMKq9;um1FV%V28kH)HySo#+Ql{fi$JsNXvl(5f>gwqFZ$*UsW6A?p4<5wFcn=fP3eUN!Z3n-qY#9#p$;?6{*NrL})#HWB$2YbZfd zjSp(N$R}!hy&VkufT-`=Or5570#dUKuO=t*IOBpQND>kNm>D>ws7bOGi^XKsCcKNW zx$tFziX~&0_CRpYYHa*)jmjGUW(C5;Vo13Hh}jft2|+R~ObWe5Pn1xE9*gBk2A+qi$V z!8W&%l)8GKvivp-WdeB7M;5m8ts7MnDh$~ZVOCZQqUIRT&_?f1A$EM^QLowD4$0W{ z{hExK7empEX$6A`5M~c}PY;N_`$0nW>Q8%v>sQOprj?oLE{2`=VTM@*GD@i1L)n1V zF+Q0(NOTl~uFS-ilb>0D4|UC*HNplDVb8>7hUAd!58-Q2n>fK0`{)_;NK(AFK>u3t z#lXaXO*_nj!o(xmui@drudwkuXzJQpK{a;5PnX&-8To+Ivbv){&_mjjKts2+#PIAV z6TZMp0ZeXgAdm=*BxORyUD#MQP=^qa%oUhPG<|Z?h4gX=`OB|tfYgZrh&Mcx(QwCv$cSh7-v=9jgH#KJbPo^|Zq*(NBuPv^Qt$esS>W&x_PyG z@IDcMff*mjl;o`~?8~T`>C_G90qdts24?lddU?Wt9Y&rRe|a+|&|+U<;y9{KT7~z%Z?*w2PofS9%#? zwl7yHK02_TfX)F)a4`Pfw%SgS7hSY3mimjkrE%Zb?~QQZchmSMYv=6&PU94)bD*Pu z91hES_gZtd2bXd?D(Ecap_G>JMM&{&BeTt>0A` z>cuDr>?cDf-Y&aY7qV?skQ0f3xXVm!UK@kZD+M(5u`vqNz8^CKgF#Ck1&DC6AiH9^&RkVomV}z9u1b_*EuooX*vR@WX>m&|8UlmedNJ{N?DOIo^80?BM z-gmy+0nWu341}w6W?k&{t(2iakgxvDt8*mCC22B`!1WClaRZE#C?*dAaCrmu88<{^ z{1a*uo2zWIB$u!8{t6+|`Ih;30U6_tKaIY@%y-lm2(VBZBZnSeIhIhPePxgRuFug2 zFE?AlbR)w4HS>b@KP|RoRG^~s3K$XA8ls@PweYjtJ1{0!y4YwXZqli9DTt|jpNOh( z7{R!E5|G_9a2ZNSd4qk{^1T+l^3;)OloR&CYcfij%YLwRtZTj(HNa{=fH37is(e09 zDjWGzrnYbmyuSNqN!NlNYnhpWSDpx@=l~3wbyN>IU-FdA{y;L%Nt66A_p0EfQ&DY^2b^r{_i9?J$#@l(A@sfWf>NG^x>OW8s6A7u*-r!uVXCVbff{9Zi5N68s za&liH2zYXX43?1Exq3j=LkQXK72}tDCSLR%-f zn{`!%tslD-zNs^;1YrDxK&;>igvP+b5T1JrN9Hax`ak{Kf;qFD>E2iu%VS~OpC#hB z$oWbsVtNDBA4uQ^jDOfhSynn)A<28hRL#bioOJgf|KB@DT*doox4@A4gjJv&cuzX- zJ;Z>TKyaexpp`N;9&qr7%te4%JW5<)B=BV#Xa`8ZrNp4K$7KJ~uJEITN75TV(2An` zu%L*E5M_wFDDHyo2-*QB5EmOInC#D+EmG>U`=Es?igUAmZ#bbqYlX-^%QCqR@=r?; z7Qd_R`Q_f6_3QRt>>Hh*h}w=ak)lMlWhb#D9-Y4P01ON)JW`eQv9VPwO7(U8gCP-V z&)1ZaZ~D94kGz9F*iEScIq^wwu*`Y)<$oVCf}@P5IExqXN^G1~YhLkT-gv;!!ya5& z0p6z(gjJ_3!QjOB9-fxr4R(cvN`z7ySzM&$Hpe;J5?OOZ0&~WJu+|UdyhtZHWg%DJ zQ%F5q9D{1A(D0BG_Pm+y(U1@>02nlA8&S8~6)i&+ZpDoWUdg$#DN>NVISpJE&G4&M zd%p&H3@H8hMxewWYZ0CILNIwa#14|AMWVs)YgAt530b3$hzAQEf#9U$m5(Xq8k_;Y zRBrYycM5!Q|2C^50=G?)eV(=6UOoq4bRcYQj+`hRNmNrncMga6R-py=T?~Bg>WeSM z7%U8}zN`RD355MrRn;5iFMGw!nlt^wvb;B>`J`#*QjY6cCHkzav*!JWHkg!b#e>I8;9u6D`|KKu4Z6st>KEtH_o9nBM zKPL9k0+W|}6&6C$B{*1>M}lHe1*F#Zc3%h{-LR)s zykv9Oe`SU9myW!kmqO)2fT3l#0h(9@`{V6{xd}{ysnM!8Vd~NxHxaml)CtXZ> z$Qziq9TW-uo3u{1zVLu{M?=+oK|1w#b}XyC{w{K}9*ET|cU{0BA0k1X*N|vWV70BH zET7{Zue9tsb=$lD0#`sK!K+)2# z!2fiPy>Srt8RH}}7pB&&Aciub@(8jY3~DtuuvE)%FCL!gT5sW8hK!j%uQtw%L%!%P zUZaQC>IesjECVWs4G)1>N!OTBXFi8PoPyuPdElCVvvtm2+C>@JOxkaN4wis)!OU-j z^xz%(eHM~zH5Fe}p4w4BOij`eesh)U)}+Xv1|a~34@lP|K}9yKz1;aenp<24IdwGR z;w772VPN|)s{dR0QC&Arm~e0p600KGbgfuZqGJoyHeNi?Pfs}P}Ni^bz#!$Nhxl#4 zfsg_)Mi92}dbL)cmG-uz+D$DL=pk1A36Is7|7P+ z#FhN8frc4+Z_WEYCicRfFv_6UNz?mEgePVP{s7%X0gG!M4@r^wm>Xy7Zw#14T5NO` z0;dGS7yFlNajZ})g=O8!V9Wsv2Q6|U`Bcv(%oeClj^L%KE?Rc4af?N-tm@gVsVjCErQfKW;;cJ(3QvfX^nL~4 zwiyoLqK(IOcbE3czh@+-wwa$^pElQ5f~1- z`;;FK4GCtYPd0O4FcphcwBjDa3>xLRqyk4`^MV*bj<^br_ClupjFm-?Zlla?7*-~~ ztVS!E?04#IGmSQydd24)0EYMfOFCQp-=wnew4?5b?AMc^3v8I>Y^5`?|h)AoKvhYC)O2PDj|5@LW-x=6g1cb+iyOSHG&|c5lrf zU`MQgokj`3d_b7$W>g*L2+Gl`wS+#Ja)P%jv5j$me@J^)a}CzopjiMg84%`L(6VP< zuTYnlO7{j%TI!K8Z;$p{At6DnXZ@pslui@D0h0X#=gPM zJm-{?GnEUKkr#}cpmCTte8a1-cYS<=zEOl^U*?d43l&oH27e}>Rd8P{bu#z$@nfYcVPM@6!%i;k) z;!!~z#Mus!%|Li}NPA8m33_U1?L7VKf>>-G@`CU8?jNh=Ba-YDw?3gWA7U;2uKr?c zHvneyD=ef6!`*iej%?kC{9_0%pK(ZRkPEiTm$H=xvU7bhGSD8PgYk2--?Ii_P{CooY=56I4=-B5#r@1e_ycHo4FlL4Z;j8rVj`O&^U zFP6_bngZxug4)AAvDnX-S7W+1cFOsFA^V@5Et~5nY-hbEDJjo(3zC2n0i4UU?*7D-ZWei})3bQCG{w92l$h%_Jfkt< zBY|z*L95`Y9dbueD#DnZ1GNOoOxdSqKCzqWA`<3^nHD;iWt!3_#kKHXw(5kn$CBXd zfbju4cr5rzBx27qZ;|$ISrn5+qREBu`9#H)U*&(Mwkq81y#_P@57YpW*{x(vP6pU} zQy0?{MMAL;BKA9$y+s&d<0pl9gLOMF#Nc2O?>F_90vns-yYErirN+hulJWgp)x4Z# z!akHW-iHJ0g~rXY3Gk`C^p}#S&Y`$>2tU(z6O=8n^1SF{RQJ~THo-6q>V{Q?b_HKa zA5>tjGz(bA z4^!G>{4}BHPRwZ!j~YV`mXkgDQ)b{S{zZT|1;WT|z9bx;ke}(;PO>2jRt$d+IUlJv_92h*OclM2-#iy>hE)P@9!*bvqo8DsVPjk5QGXUI0zruw-P zsZuk2{^3?=6RIQt0;Wqa_V_8(wDV_jiH8ohCHLmrQvKj6HBQSB!v59~Nel2*bAX~l zGOgVTxXsl&d@FvVXt`B^ljL}coy33gx+QNpPj4!-_ZMm9q9rwKeeyjy zfXM{qQ27X}5#43=iz@6f%OtBaY}>uEFX4wtQToByFEQN)Du-0BNxDPI8qWT`BzGJ=bEp}5JVaNX6Qtz_2 zB5;&F0J*9KnAZOU4@4Q4W*| zxxV13279$U?nl@@k;H%MQWY7aUysAP5ysHv6iy7g;-q(~?TxQ%hv|Q^C#WcG@vGnU zy*4PCS}n3RHm0wvUw8Q2T^-Q$sHW!8o}yYKz`P{n1v@J+O=_?Q+q)kqOCn??;JD<` zVfH8kk^>l7{VO`=KH+8nr5K)YfKk4w+uEG)ZoHZIhD-chh*7H@uwZN**Vq=WxT(Mm z{Kyz+CBl7jWH@l?9V*Z2x6NbQ4m}eIZ?_y824S_np3tLdsY!{?LR*O#Kxq;MR?k@D zkitz?9^F#EkYjRh@<{VGpy`X^jQjXflmfI-Q%^oL;bvNJ>_O>xq2z%fuB0tmh(2~- zksXQj*;BRdiHw9^TO^ChFtn6DZCtzBZ4C= zDhg1j=kcHmWYcaJd9JSOiIGXim=X0$|HV%hue=l*@$_Q!&y%4~9Yri;55g#?lHO{N z&KorR{IP8a`^t!slH?mPPaXG_E=*%+U;*Jn^P!C7pnSu>$00#Fd6C4NGo+5^_(iTh zQ|VKLQ5_}^!ze1)S_&b)s-18}R`R%_J$X<7C7WbV1?nwyUOb4_!a{Y8Mk#Bk^Tw6( zlC*_=dqyU~-dY;376F(JR2SdEJH7Qom1`4=*)JOL{XEbJ|G-un+_WA_UY$XV%pv!F zRWjrSkfri~gBW|Y%friFyJmX1sG~4ZBb2Q4GPY*R@gV0ES$7%2HWZQ~Sh6 zY*8Xx|GL7QrIM6hX?9zXvM!p)SD?I(3k2PA5(?xk?PZ^`zQxPjUs7=s?L9bg?#yG7v>e7>ChWr#{w#&MV2@L=I%WY+!&F zsK#bENrZv}Q4!A9FTrQMwlac53~KI;h}bt0rK@7{co##{XZpe$3~DU7^o!zfa^Js1 zCU-{2t)Z>jF|#Y&yOv#o2Pv7*8Wu;{^FQ4iAd#N^Zvr|)Z>#NpC(@`<_ZW%xn3XNC zseGJ6jv=>9Zfg;qS|dvIj=fU_MmhkIUj8qUE-RIXCBWqpvZCw+*2fz{9#R4`T-4nC^7G?#(>mWl zh?VHqm3qU-A1SBW01Rp>CwKXZc#!FK7%fbqCqAJDgpcAANW}O@i!e@Xge-x{ENC@o z?sip%3*}{`yM#UKWYQQ`>icQpu}}Oy!P_UoamYXl8fZI%He93Ot0IrZ5tuKXzoJph zFsS_&{#xNf{^Le;00-{Tk8xXo)F?iY8WI!p%8HCtgSHm!8%N{zeEQ9Bw-DduQn=a< zRey>FaMz&06sMXki;qnULr+^YM^`c127{o`N99W!5@QqX*ypywsN7=E9=h>2RqnBs za_@phe*Z=#auN&gAW0c`H(k2>X*5FD8?YA7!7PvvsZS{_<#Pt9rmmi7-b_iG9E_d9 zLCGtmJxPbrX&{n@$pVEZiKzWrR4%Z>JA`Df>w8T4>yA&2!SURPsw~&$4Frk+OyRrxKtY?15*T{wcLI_eHEYsHg|lIt8Nl1G8X{`FGhU7ceU z#=ijnGApe=zF3-kmiK`Q;9`TpiC;~hHlKFm9p|cSI45_;>*5@Ikp7x|FmEq~w)%+J z1zJbM{{+hrGz|gdmuHu(WM~hl_+F)7pO0+Vys;?Uh{C|ZPDi{yOX0sq;GK*8T|0ora9A+O zb*h=Tn;peNQ2_mKk-lXp{wDw!ml}m7aR1 z=)=hd!P2v^bji|@NCGdPeN}M=@mr2oaQ<)VMU5sCzkXy89mBR{r2Vhqd*7D;fUQsI*u;Yb;b5m=hix ztxJIE&-Mg*Q1DS;hc+C#&!$!h#s=aYzddhf_w=kS0E+}+1BRGs$2MUm&E5v#kK>cA zoMzlwCG2+jObyc+&E05V98CV-Xl`Ivr%6%lt4qg^j0mA_UA3)lI?@@9N5xi}LTQ4K z7pUI+z>BVjr;#py=!t{m9m!l@-nCaJkqhfx-m#V|E}a# z7ZzU5N2OVKBL}J#P;LbM0?`&J>4s2tf3!nBg`gl15#bSX5oYPO8y$6TfNxI-*AyH@W}GF2;AW3{)315cjOcUsNDQPAm5rcY`EB zN7ci{;TLuNa<+Iv{#ERzXw}qF1^SvUni}VJo|YG2u31 zSO|x9{UVjEz@wDB2(WPACmNs?zt=?W?fY!)w=NR8Rz06JO^6$ea5-Aj6mQ~7ipY%u z1B(Iz4ave(u)|dSjQAvBlokwe)3Ig7t?cnERjPyBTfVpfrD7oQU@7)Z$-0~Hmb?N7 zU+Ho~nKZ7~3RU|m;JpZ@*KsL8gt(UwAogEJx8uH46pVH&;b!9-e#YtCA~sE+{qmR8 zZ>Dsj0?-9f(C0e|?U6dhr1x8+>Gt`Iy3|||ssAv7CF$Y6U=30K2vB^6M%1UfAL#F5 zfeZlu;UP)%;r1aV&gb@v81>aRzu^-{XHf#omo$0vtln!1{Scnzijgr#TUX}MBp%q(n*lD zz%DFk1$%+W{!gah#x>>qvWpe3u04XwV*Twzp~Vvs%y>dum~mbXHNC=E{r{hfLEO zqQ7=M^{)Zg@PAyc9|lZp7vZmZB^tRDlVv_$AyJ8gNxY+M8>i_?LG?f?LLj)~eM(Ow z*WgWXQqsF#yssZebb5T9icWOIb^Y4nfxKB-w1tcl1p$!)+z*sW^JL7?ZvTT2^%??S z55iMHr+0{JCrM$7vGLrn)0n_JnHUh9nVr~#XD^n$aR`v`8n(XrJj1;vR4&)WsOs!< z*bW0$JA?)y3NqSBh>ghVa~`|8N9Hy`ZWG+!ZIqydgCkF3X5F4xrhMi{wwgi*lz1SRu8)!cDnWqq{VEB-tLBs($BP7 zO{|b4oZbBbVB*l+G)SrUfreor2J9x*7PJ_ zKt6BxZKZcPIW7X-VPyi&d=a*r089^rscOJr>i+Z5(Fr1JW{TVk6jIvl9vy68S=bPY zEmcqg>^~f+>JTkd9iLaPb${=6koZg9orWMIFk@@jzMpBKAqm(Ka|Jz=I*8Ne4N9@n zB}jf0V*vOrnESlVA!N1Cz z>$<-=;(y)A!2>W^a5R0S29c_>hI3Iz-Z$y0GI;^^AP*1J*&v#6T)O_O(nElu21T9Jgv||#0n8p&P+J~U}qrA z7cFpOi2CpuQ$_tbL-bV|7D`i2z+Y6CLyC}mczGi5$^jSy)6c^+KX6pDTZD!xcJUg@ zA$&^VYg%x7| z7JcoUG~!|^{w9#LL3$gU#>I1ZjLSj|WOo14Bv|Jh5#+LJOU{7H9l2N}fnL_-7+dk# z#*5l;lF;3*9c0o{Pv&#nVuRe(9|to^dmdlmTg-=WvCH~5g9+N9{vpydm#AF)o^X&a ze2S94M?|P4hw9?-nXOxrqZlq1hWD$|PCEkigTa0SS3)b0DNL}x zL+3AK@vYWhpRY?x_pA620oqt|P|QC|o#IN{)EPVQ{=nnv@zNbuN;u~*!Ri~II14ye zx`9Ln8bZ#~O zj4g@^ZxN%?e=N`6rucdA@6YxuJ2wDJBIE%R98MD>Rmlq(*&!}LbodN@XSAu+5cK54 zW|>2Wj6z&ym>68J7=D^TUcOT{I-=GhKeFn6K3hKKnttBosu_oFCDJO+4s>n4exi7o zsJ?HMP?VqXzq6gCby*ESTC7Y(XaZrw_*rJ~cQ z5TLRI+_mu#(MB6m^KOmiL`seK6k;FGbB$BEA8`#oBXbG$;sz8|3tX^NdIwowLK4ME z>DQoMMuln0vx;|YEXFM4`bU;?F^a(bDp^pibP#{)sY?+S5TXiX1YlFWhGlB__x(&Q z8p$|jGQ4IORI3NjK^n$Iie$7jmb=aE^~I?LxD*lLoCwxQj33EJ=y5$?1l0;!2{fur zHIDx4vn#I~?KeN|D|D1!w=qw5(+`W%t~bPm3J4I|^Jcln^r?Z>^#C1HA#Uxrv5Qs4 zH}B{?zPe|9curWPvj7b0;;pp(4u&PLMI__<#vJ=vH+a2^$v#uld`6>U3e~|V2Vl@f zWqTq9`;|=A#tBSv^RM~&wez1h#c(Lt5h_vF&#Cn>F?p^-z&#^1)vjYZGj{zhl?d~F zddXQl;n&+HjhW%dt@4IEJwK?%*4hlfEEVTV$A7p`^q9 z@)R(qJ0M>Vm!j!~X~o9d8~>mj1J6l*2!xbCrIK|09X?F%c)&>`Oe%){a zBOj?_b+D?KfX54x*SleOnzZ;Mp3F8N-4B1oqAi}x!x%s2^a7DMKVFU11I9yA&!k}nJD}QOabmiw1 zP)(S?xubxWe(D+du-Uzq54lz7ltde)_cOMX1CY1I!|svVK{WwehCPzPy4SzeS{5e` zJ}27_P9`4NZH=rY^i| z>I3}(6(ewJ=fGKuvSV8K9=jZhYzA4f7pVpI?&O3$kFdiqXZay*rp3UDc|cgD*og0t zmr_``V^?N}z8QYSLB??C`CPXlep09vrz;@3??aHCHOo zxeZJ^GLOcMGAJ2M)P)p3r}y@%_Op~UpxLptIiT%j1G=5Zb8yf^*4A921$lsC zz%dyky;h1B8%rvDsre0!*zvG4O;glSSTi6HTma_r51Y?kkgC1cFocjoH}9Ei7~dlv zC2ZPu#|`Z*nGu&2jL?(K#=;g}x(ZJmsu!3dys68sN1*zIODn4L4GCG>IC=6q1rzwQ z1R?KJ;D$v|AkpaT*Yx%MabS|oksRvpFU`?a0s9?yJz0?In>t6xu;Kh+iNsI6!Dqv78<3A?ryt`lk+!c#D)L2^}76gF;<)cKj`#-fa# zcQ6{0O$ft>8RZ1VfB!ciLTIVK)U>yAd~S-pAeKb@UCZQ>&8`zQ-}yz;E_c`ow{xdcUkN|S^7;;zQKKUwh6 ziQF-g#%D<*taMA^TE%2^*DGQLk#L6)SOv60CS2_6J{N1hbl0nw^t*SWWDfkh?{`v4 z$8nHKRLf=v|?$Z=WB^V$XW&W(~Z1Aaa%qUS^7?@KcQ7&16% zo>x=EsFSD-3Pt6}OB!qC7iDRqC%C$bhGKDt)j0A+0p7x<$(C#m_)NRNP4>yZC z^w3u_&rOy8=77V}v}FTe&}#_IgJYI{fR95rvy&c7;nuc3|M~Do3CsOrh+J2f8OSkm zKLSyC>e@T>2sGHP8(s?9#2&ntkSTZm=@=Xy{l!GH@l^oC1-!N7Q1y9bw4upjgYJCX zIp5rrO^svhAHjl+*8XM5Y%gd5kU$Ht{xH<}W4a;jY8>T3U}BfP4DQ!*qHc+}Pk*40 zdmi8sff+qExWs3e9`?4GXMmpt){qEH3NTTxJRGYW+9paym;vvdFh8Z9emZ|xnn0ZM z@MoN@ib$L46pdRrR6?;sOQmd^Uw{YW@oebbbfCXuXLa23UhrM)@jqSs%T0@WYq~G9 z`ks>*liFc8r!}8}Q_cT$s{e@V1vRmFrv9$x9f?lm2z=gY81OaM*2<_{_=nFwTkuqu zKM~8JAkT}BxXbLTTYeO0Tx9-EO61v63Uk6Kc%@S5Zi~R%Ezn0<&di2wQg%{P1-a-3 zX7>FDF?eR+$x&XMuW zfi|_2B0xw~1emkZ8w3bfzTWCvYNNTQhZ3q#mRAYRD!HTrqIh0 zJHx@XoR|F__5mC`Dfo4qMlZI_FIi^ZeZL_2_CA7O?eoZj=E&5*nacg$PwWsHeOY zjUYb?m&lfTz()C@*BSZwynBqxJK+d`K@-i6QD277?t^Utcis6)7*2~eM|R@T>4#Cu zJ1`0}s=|K6VUQ;RiOl{m_uB!!SQCZiN*hP_YaaS8zU8!ysg`y z^~PT?ObG^hq@Oz5st2Amo82;x?8tc4YsFxHRzs`G+Ak}|o1A$3I>8I59pRJO_2UQ? z(Xv&J#Y`F4w~aASzshwt+7`Pf>f#f%|*=9QLFV;Z_z+To0C7>@p6h;WUWMt z;a$ps;T7-m8ZWH{Q~m%C1uf9msWb*D(RsVv2al>C19SI5h4-{1TEdgno=?dRFi(SuHHj~9g*j}t9rPIFfj}h}%(3C%LLmb?buAE=@ZWN&l z^Rpix-S`u2-Tp{o*TE-cCLP-mN?CwPANn-;dMnfOpE#&W%5B*{eJe5a2gxJEw{F){6H-Wq;K+pzuh7fx~91dCdBzhNaJI^{dhxAplnp&XrtsNDA<;94#{ z9f)nhCu=9X-v_EpG+<>QGf238xg+i%Gp|}6dj<{%|8&;?2iaAH9lw=_KU>*bAa&N- z5tE>9RjTC$f9`KsZ$JCjpy~?}@~($?Xhy2jS-d@2%^x9?IX92!7F7Gd5_-fXeRZv| zIR&ITxOY$>ct%Jzca2*+@}vd!NDG>)Y;SL>4di!rmXDI0xb32VtyTf!U_#}^p#Hsd zqgUkBumKio^M6B}n`y+4ZBv8n8{Jp(09X>ZSfb&|qJt0O;n{~wa`YTzUt+fgbNOgq z9g8T0-^omU2Vl?(+oV&gfx!rDnTElY3TAijrAY*vJGh%&=#qoOEf81R0T`Iqhj8ju zqbX1*wu41l+CM%vPF6|AiI|;nvcxwW4$7Lb<75?QrMJk-2p^58DUL@2YFTdm% z=uKCHr>dN$M`ZuZCN^!2O1+WmwP}QJNWcQJI;rwSj9n=~4A5EgpC$r>z`}+~YLvby zIl4-znyvG9WurWKC1KG`BjO5nnb3#5pfQI@L?g$`74^(EiozOcOI5w!-=eYx9J%V~ z##N^=X+ML7V+IQpPy??w#x@SPh&$9LH4|1w=asDI>qcmz4rb!fR-{jR4}bP)py9QDr^v1vMKHh3UERxe&S``S zB64a_kBvZFC_#jAh_WY^lK@3QQ$_=DH=*y>de^;^`GujhN-x;C2lWVP=+UXDo)^8r};zzWJG>WBjfd6>)=f%zo#R9B5_SXgOB{`nm`-d{4adM- z7uV^rF~NY@g?~EXdA_AVZ$entxa<$;mdu3FU|$;>>zt;v@~m5kARCr~N3sa~zLNW* z+rxMC{enu*t|O?7Fh$5VT$j&S-Yj$S+g5GpgEnIv#8v#IHqDRrd8J6_6OqicwM(`c zmSU&Q_1!6IQ=FC*Otn7;VGXtvQ`TvlBfOH>O;qW(FRkXjTvtmej}Oib#GBIs-HcBi z3nT9{rSu785-0Xk5s?RQSl?9ZSPIupVYI$AtC&Wb0APyXXbUHQ9+1D2PHRcN=47h> zRlS0seABo!VDZ(FViPIc0DwU==$llX8?HJ=Dfo-maYdIGaFV?I<)_bC#+?tvmkF9` z02nkay1##HQYdZw`o--^OI$X)k8h%CMv8D79&FKm%L5M?0HXsZJ*s>OJP&Qx@-MwI z)=D_a0tT-{1{nPh)pq&9>;*Kv^ zrnccg-4X`lze(x`PZLu8*M2eIvv8w)ec3iwB(ly4PS<8D<(mS5f8SLiz}Nv^2Dp%m ziwxQR*L1JjKy|%DQYr~}X(3x@ZLH$%Bmf+m#O2Udhi!i^!Bq6Hirx7Q~2MRz(QpbkJy8g>7_9IQZ< zW=rMyU6*;T{46=$O1=K#19+wh91^-UKr-T>02%3Y;v2KIc-huY>~bH+IFl-2-Oe@@ zG2Z{{bD@t~1Ypo+53yZ4`lU_%0yLuzO2u-crC-`JrsrZa`sB3vW~M#>H2|;BD!`-> z*tmCdbm_d0LjB!HI-6e+cd&x~(^Hc%PhAVFdYM1PJASy%oZ?$HL2$`Jx4PJl{IJ0s z3mR{c*RbXsZ-eXrndClETy|m z2=!DfetMb-J3UHv)b>W6oYo-oy@^V4lkY+T2fCQn=?kEMtwht~M|*>@l|?lCrHNev z{%o$i6A8+C+@Ma!$d-iO*V_Uekb|4dj`{Ly`X8F1&37o-i>CYE$ETPWAE`U;aE6OQ zK>P*FEazo5TWl z*kTOhhA5HkW6RzJTxy`^34?)7*Y3#<<=jB>klniwf1r;^^^)YZVmDEj%p1flg@4AN zU_?Qc>c-th@J6jLiRL3x{YU2>^@o_;w$1$AdTpdnU>aO4u;LsL)+3z&Q&#%chowm7 z&@HHN=NNNCYxXLrDbR*~ZR8y6_>}}<%QBFEmGyn)@l}&6N6)()#~u&^_4A68{&4n@ zi(G*95om0%KP$S>sba=~e{|!^@R$_)l1b6cL@ZUjWz*rHW23&nvwZWNM@*?{wI+CKxc=4-4PJ#r^ zfi!ra6cd>QWGc`KMfw1@7wsG6el)Lh&!ehDIFX{`#{%H+(vND$xm#Ey5gh9X6{& zC20JriVDHPI=S!2C!;$pI;sXO5MZ$Dw|Gpm{5s&Bz z{+6}#bj<+N4kJH|4S6TcT|z5yiCNX-Uu-7o^+3x+{}bzCcA##FCj>)qJJ~x zh+rF)IEGPcUY&_!92-;@Xr~tGjysEJ&ddZ=+aL~o&C!HJ`u~w2)2JE7L3WZEE^eADm+B!=!o-f2^4@Bp-hfZQy1<#s#{)^B#iYP zTy^GE7;X~3A^%TranjmStU&+<4NgQDm6ydTP+PQKe-7OKUSz^JcG^IU#7F2_B*??B zZVJGFdL(F8cLLs*6s6!3URq=f&= z)yu^>dXpl{1529yMv&9yqR~&VqMU+$Dsu%~FXmGPQK}&*_NOv#1%*zK6D2(w-;Z55 zqneF=l3q%}Ehnj7kjX)-5$bKUN4{#KWBzzF=doxJPBINucAnj zI+*RJJD>Y23-M$Pp#z;p?@^xOyKt8xZ31lNKj@{JV?^kBud%w+x#yzkMrB8M&P&lM z0OQ9AK7`{wpsLe(TFf(=-OJ-CWbjGT6ep57be zHj<7Usw}GXhBdRD4wYi5kkB--j=E>&ueF1dWz@nle@<57Gqmx~Q=)ERi*r!xY_9-LD4P^P=WF?2e)I^L3rvUmF z4r)v>s$^sRXTDsxNI}a zrC@eYf~VlbHA?Qsg@~RQ+V1uqKKJAi!G87N z&E7+uJV@TdeSm?M{}1}VW^dyfr_tY#>Aj9gp}o3%-M85&PG!f=cO%ON-q?bcbN?7% z|L!8xZdZvw%VSy=R^)IaYV9`t4*M?Yz^QYE1T@l68u3>`^7T@;+4t=7*W*SGN8}fy z_B1)l@o0S=$W3%Fj=&HGYFmy!Zqe5eV@A4IWxCe3Gi-jys<;=fJ3yO8Ss*t0h6k(x z>B%YKBka#av`!#-88eK?mHvZ^z!PpJ6O((yK^Xp>ai+HgI3={F`ajCSmwYm>xY~&P zO?k@EZRJncrfl`2TJyc`W$Z|~n1J+}LFqAcQiuJd{QoF>tGFtgwtbjxq`N`7K}tZB z?(Xgei3Kd_ZYhzH6eL9i5s_|0I;5n#Q@XzET0HlE@7s9ykKfFklgF9!5x%0D=b1rg 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 IhW$&IuJ+DLxnxWr51ZZU_d`R7~;ON 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⩔LBd7$weNSx2?Y}u;A?hR#lGlgd63nUdZ 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%0AbX+y%`pG=0=x)^4OaWseS< z{9h)8jKRL$!Ck=+p-#|qIJ2ORk8tqoV0q> z1F=qD1yW(FfLAh#RBF{)?EIe0VqV*XcFPMQ}{ z`gy#MLyMx(kFQRA9FKFc13MhZEEN&%#f9U zwz`3n<|&6JX`}XxP*!L7ShCF!ZFZpQPxw5$ez82!m<0VwGS*X#8rApjbed}gnya~` zMy#4!-G%LHpc9)csUXTo8^YT7raimfm%Mm?`4oT zKf=Q9{8-RC&)R~8f9gK_l}+#*UdNG8XF~UdQ@TCSG1NI?e~IrPd)~Y_J~d-%W7;k- z&2abzJw!caT7D zf-I!@!p@3a%a;PI^jDT*0w-nb(_GY;28 z^+h98E@LQN-d)bRJq)(>3hCA%1Ai+GfQ^+zo6HbL%dGmnE3DGd3Db3lx2&;~EaW`v;^? zF$0Ahpk$`9$7ZgJfo1lp{u6bDNzDM8vEqtf!k@-Q2lo+&ue8B@F$YjITf!_SZee*g z-&PCjyA@4MFNq5FVBeI92w+DWr7{EmX&}SkKbhYhwK==1MB+9@xVdctOedjzl3Tb+ z0tJ+x0zAh@0(=4UTLEnFt6d|`3yIT22W(E!SZQUA*YFnQC@SX6R~7MV3Q};uriFsA zVNR!^5~g1UwavHlE|^@?*eWRKe6OVTc;u8k$S6Rf0tuxHx4S;++s5F@362rMt15cr{gyL2x|)Z!jV=?9N|#z^1D}m zz~c`!z?UaKE>f?>huvhZT~P~9c^|!?4EQ^un<`>yh}Op<4RlKiHn$RaoiM2E+S#H@ z+ko-ubK7r0F-2_0OPKFcc<2|m^Z*PKgsnnGY$@-v46?aNSJ(Em-ueW7Z+F>GE%08v zBz;Dc3c#QS@F6nlhBEzT@@U!KAoo_oZf2;qpd2y{67E;~) zf>sK-n?D&e1(}|%fzKBo@O@{5z2K=QNV;6C{L^=SxVrc+Wgo~|^bYR=CT%ZJ)CbCY zy}L<{x#`hB=M-C?A@nS3f`|r$yb$mTG_n&j^Xd8lXn_B+6(4`x>EKVCH1qwYLzL6A zwAnC2u<-g^5f{%%OZF>`5G-W$jQi;-aDqKE#^;OC9D;E$U8bz9vb`CQ`4nS>-dhxd z7;2H@jK~AHDbSxT0|e1`!91ia)%>UA?4)`!WddkR`ZcW01r1*kTrYsX&4J4R%9X+F zDoE$H)Ztc*gG8Y#;WTDsd;7!>E4s zT*TvEV(QopoLBUd#d!+>O9YKN5@dvQs@l|jWRIhlvhUiz_^{scOC{a?Gn?}cw#3aC z0AmANdoDxVtBvUEH=U1P(6Cupx9xsm8-dsSTtXA`)>q#XfPr^`CplhvjxNWs(7NVG zVrnt|lIQA?XY$BWxZtMMJ|Uv^3Ic?V7FAlUk*C&`WTP}pz_DgVdWUkLimwa za$p6ca!>`)Z%-9B71m6|p!3WIH%dp~mJY9%dL-_TN?ymFuvZPnWRRNz32aJ08QrAYNL46xstO; zyc55xMyQ1Uc0q>PXJAW-$DepePFiJR;~Dd)m^w~et61JAh}Q9P_+C`)^bFE)JUL47 zfXk-s8AOL4rRZYBd^3vZn_5>CJPEscfI{uywtVy3GJGPP6JQ#&>~gRW6JO^|*4+ug zaHo1-1oL+@@%G~Q@23%pOHuWG(71~M*mH2U=7OK`c6@Ro;D61}>)uRX55*ybB79*> z`}^XG&my)JfI*Y#+z&BB-Zlta5f;`BTmLxN5|s;;YbhQXEg@1#>@`hL2U_xa?jJyt zoaxt@6e=+}bWmQwFRz!J%ph%63sN<}lDeJ&8E7+#A3frTOs$^jb2lky(kuxv zU)+2fj$X%ye8m}usRV}=f^GjsExOIQ-Tn67!!h9>KI##tF>^3FL}9M7N?05a5DpL) zn{kz0kt4PWfBna^gM|OlSDM%<6Bh~Arg+hM|0)LPQwxNpiJ{sp$d&Yr+xnQe**1*b z&*Ie$o4>g#+nzt2*e(QM?EuU(?-fdvboC30l(u#h1Q=wEcRTzIFa~36jL`&sg+bG8 zPhpCK!qjthbdt|R zJVYPV+~t2w!0@nE1ff55G@AvSIjz8LVu200?2p2Xu*-GM3o|^ApwKo9m|yG?5Zhv~ ziT>CAu8Rt|P1>IHh%-^4J9?0-vBw&35%yQyBRN!-mlFr#kB;+J7xy%i8W_C3vY^0G z3Yw9)abBCK7_6z8zd8`?z7v5{8x`G~nL~SLMFeH#ee{ipL-*oTeWLQ->Qj{;Qil^pnVHFFAX;Z@y! ztD=2%cXJd5d6n|&QfKcbOz0DjX&|9=8`vb2X~TEwk@9a~k}!_l`Fe}?WwQiXqbdD& z%)r0O8z%3`pl=9ua03PHm4Cd64MHuzSk_|&BK$v!x?u?htjKyia@Eb2+*X17QDA43 zAcjqY+QmqbMx|Tj>LXtDG_5}k#)J}WR64K78o+1qvJamvypM08uS-Ca>ac`8 zcW&)XP90veO8a~dkw{*7B86MYc176i;%+VKv$$<<{yvvo#kv$JX7(;6)KQ(9c*&Xs$!#lN4;HoE`o#|(YDEb@K)9(um(S?UW=o{MLBkPHvma{J#Fx8m2kN+X4*Q2_q$T@F(TV%k-kbi+ zHFB-^nKI1+gJ_L_4*FR=Yu#k5m%34MM&NHVxxDWWY*^48NM|r5o%0fir zX?>^cw7z6^7^3`s=RKd}_ZpS7H{Qr78M}I~4LD6{5UpTf0zZH+s&DiZ1HtH@1Bag{ znClus9@r@hQlqpSNm+GMJC3P=t5hB={M}he+ZNVjd_ipEh=MP@`~oG{Z-W!1=f;3~ z(#E#C6gY4;fYA*tqc;-iIm5)4cY13U7aWa&`lkHeTL1VJpV>Q$KMtgrZ-5(j^~upS zy5~GlsB!Pj*3h)%AZla8QKdIYE}$Q_xGP~Ra(fF3OFTH0@!v(P-ao{GMVw>ROfEmn zoSiaw^44LTCdtFBwF^NL=ArT7ZxWm94Vsuh1$_lL|M;kex2d?S2=;k%EDR}IRL3j8 z7ze=S)<^?yMG1(ID2Eiqe3|PaRI!#f`jAALJaNm85fQ>by9>&?TL1UGs6NM}R7N4G z^_eFA)xZ$ly|Oi)e;7xtj{GGBxWiBv&6X3tWjh(XljNWNjW@UxJ2ckEUYGvD{GEiX zt(AA&K)3c#v)U6ds}KJx{_*{PW;HHaU-bXotajeXqE_XlzmS&Y#(Ou`VUOjBQuKq( zvh;9>Y8+*gi5f7g_n~GrpgfNA`4;}RTpnTn*{v2Nc<8jm#_sSpeH+f$6J-yJ ziI{!2E|(4E`b=cqR4llxt>QdhqB?VquX1@jrOcDPI2h8Z?{eTHGf>&?DegiUmpo}K_sSDV3=2*ydb)kb|g+)3ll7coC`rB^g5X}ggRM2pRGJNt+ zs(aL1jS57izu#+?i>kKpI_biDq7|0N7o6fZx&bh#xm9cpc}v3^ppbtSBUn$dn3RTTDzc3c#RFt`7SuoM_3JZ~3gOUU{Bd zvh*d?9}iu#$1P++G)!Q?@Ya7>$u8oU->w}5BkkBWRjrqJTHUW+dmNb2t8!S`-W=5e zM||W-1$CYOp~)9>_C1rt%Aesv&?weowAsYOrQ5{kX}Tdd0C$4ze@|g%Yw#Nc?{u1mQv!A$VjTafsy!&yH@w<#d?PA5&WJV1G+)wve zKXq2n{?-L?6tcORCWGDN6|3Rt1lB+RjbmD#J6$?d0&Gh0H}>3?WZm% zxpKCKF`s1dF+_+G;>&%Z82}S7F%-2`tWX5NyurblV~tfPTn`kVbuFzD?Z&xrESfb~ zoacV|F;tTYFLnUH>Ok0=vx4_I{6d?rVS38A7N|>|WV>fqvCpdFMQt2#_dxslH3+kd zx#%!ISIXqvqCl6+z^4}J?K^jq#yjMAPkxn$FAl&M0GOw%xmM!vrY!^^DA2~?*_9|{ zf7D%u2UWNjQrkXz;pX#HmcdPhlq48)LE&{}>|X{0!`@?)_cN@;eG#8V)?B-ab%47Z z)Fs~v$ z1gNCOXkcxb7jVLJlzo~a?EN0dS@8GSgm1pQI{-rgSMQe_79LVZh}Yz;Nj++-^DEc> zQBxAZAZ}E=U>K5(B>?u{f1?%TPBlBIGP*GyDA4v5!X77PQ0)ko-S5G&Ax)FE$H~rplj*;(1kqZ@~pJ-WSQj(SA=Gxo4~xAKl?N6 zSF330VJCA=b0K;*{6%D>=R3abQZnzkh87_hO;^>Fm;D&l2x7o(^d2+7 zjSv;x`@>x>=5skrKe^}YCjw2v3oqy2#!du^{F_gd#9#r+AVNQjC1z7;+x=;uh!8h) zV1`vsl<3Cyt|rgf>SN9A$tDc+8&WUD|?x1IRKFUkB$IF^VdyW+0&%UyC+4!PpjiNEBU$S^a&ZUnFi zo1(Wx$7TlO`K!n1BuF{MU$YUfHMiH$WH)ttorC2PmjL;L<~O=YxMpOgi#t}tqb2jT z^;|W5!HL8Z#i9)QisemUUSO+-zODxnCYW2jxHtOrM37{^Dg8RY@;#`W~;W!vO z9Zjgl)3__8b>vwNyLL;xU(EL^YeS}d1_%vk!g%`pe(e^2GtB&Vj=1zJ*m`Z-(D?WM zM*WNK7aEADhJfwK1vVDY#Smyg@{^pN65CiyK_^fdmc3KhnU$^E@mas$&OUJDs6klp zTaNVKi)kiR9)W{90X^L<7;tM$c%FUaz6KHz+I&Et#!t?f#8%pW+)1!W6ug2V6Sp80W#7WusPI`Y6b zP^sV?@~225J{8j4bz_GSSDY_+zUOVOPk@^;E0I>*trt3<5zdc zQ|!PC7#f^w&7Y9}iXbBRBO^lW5TR(Oog7iG`Ax<5?2?X_1_CSq2K5K_ule3XWR+rf zUN3*YnR~!9yyYL0Ps!62u~gDx-=_dz2;dBcaDlQ&iL5u0)3%OCEe^5ehD5L36I84$ z-x<*!ZT``Ou?ClSIHQj`hzU*eb@aqFLBH^GI3JI9??y^L(u5DPQ}v(#yFd>WJb(l@ z^S%*1lInO4CCrBUNPYayDOkgP^6y3e(nuC6#x7Vzfal4py`yT``jfogYn|}xPdcMt zui~?!)6Lds-$yP(gmXzk_wmeUW3~H}?(N+P z5LL-|G7yf~ypvYQuo`TLm+zB~%8KnDQh*=0Ekl$I#}y?97CV2Q|7>ixqA}0^JJs49@fZ4MzFHIxgZTi}t_ciF1-mRk3o?%{wW4HcBF`fM8(Zdo zHa60W9rE{^;`~&5df^I`rWOv!T#wTPHc14Qb|((0Xn>6kwK>rQk7ClxFyM)dC9#@x zW;YV8==FL9CC5;o=cao${08I&Y6lVAsGss{(8fhsyOouo+PbN7p6@!E`3$ zf>pTuz(uAr=PZk;{XnGc)1c_ah?1zGJL2umJoWx<#9vnm29W7P{vE%l- zo9{#S@**@-5beCUULzzpNp7qigPB}!pVpW;y=1O&;(>~8^K&MV4K~D){sHhB0|+Q1Xin5gBJU&O6FLlCskWIdUV5F`KH6zQTc7qrI)A1T^6o zz&T_nvqVKq57|CrY`lexoRvOs7*Yr+wA*G#C4I~ingUHiFL2#*g8O3HlmZ*Mx-L1? zK1~`ShgBTC@!pkRRF0kBaAF4All|Wj&p8iHUc6>2+oiE!Wk%g99EhXRj4|pW*}bRz z$TvX%9C5Lyo272 z#>^)Wb*c$BsqWr_-Gwgz4Ad*0zvt%h@|G@W(BEvThs2PWa7W?cn(bW??l@vZcpT$o zKN()9)APOmYV!p3nXXh7j-ffv-&~&?=l@ja^R*U`0^~LfFulkF#^IZm9~)E7p-difNj~1vRL3an;d^%q z9*mLR2fs=1wc!bV&4hvDtG11oMb{rNY;@NbVqk;OcEM?o zZdKHB!(rkXlv6jVp4YgJ^X`#kLa>mn?MPbF4$+4UYV zQA{G6dI_DDP3we^r=o-PXQ4q8rru4v4&4+>OiQlRDr1BpT&y11w0RGfI6>Gsw-#P^)-1T#=@KvY6WkvifN^~(DOw{ z^;jX%#?PNda6oART~-j0R-G(zjWY2^&86E@-s5i~ZTK4}A^D4Re-Lo39BDymi2-qv zts2h{&L^!jzhpLg#h3)n$Y#AN_J5E5F`y#2P4vfJaL7 zt;jsppcm-}yq2fSYR3QogT~<$Di)}4|7qKrT}XO<2rFBK?fP&!Pg3UiKJeSc#!3(n zhy@P0+20G+;OAOt9^N4yA|%(uzw+fQ<$Pz@u33(bds@JR-8N9(tqIG&{oFHoWHx)) zuXypk)S4vQ_P)xRMc<20(+m|f91_6^*yOy3fld2O;rRS=&LvVmTBv)^`yY}Jl)wD*ZEEoY_$h)z|JNTnT}cNBM?#}6OE8cTzrI%w6S06E0-T&D<< z(OQ$AUHO*zQ|z^W?axa14kmS~&MW)?7-%_o2HnxE9Fy9qw!BX*m=nVo!FNlUKv?}a zuF0^~RoDug3S|%#j$xygnHNB=^>zV<9v2Z$y7g@|va1gsKid*%*7>*Nr(Xp{fZub3$DO$mMMNuPkf$jg)dvKIV#+i30QWLn+^-*}l zxS>Q5&l2I-3FDCZ?k~0RKdn+H?DI?2iWN zzl(CLVV4`hV4dovb`*9|KRirfs^Z3|;qE|$eCSz^soBq9ZaYEep!8KQ2 zlgmhTm+OoKST!qfN2}UH_7=HXD3W;bd~=FEd#@L~510H{F2rT4N z1%8=en*Vr&PO-CwBz-Oot)a+1^RM02A^)*2?e(D2wg8)JH~Ur=lp^r?OvIfgdc;?A z4EIYKb^_&z4HKPk%-Cn3*Z&x2%kPGjTYas&|9Vnr2`#5FEF8W))nzby#9*opJQ@RT zW3H#$cnA|qs*#`s=1e9Yp&!1mDFDWxR6|!*!do)V*dhEGaJIm*YooFM9A)iv!j`09 zsltJU2m;#7u@ z6VYXx_2JN0`_Tby$%6}baD3CtK< zT)tPrG0*H#e_i;g`SLqR7e#mmjST~2I8Ox8Oh-g`+zWi$Q$8_mo*GV+#z+BWom>BOniNwn$FVoyBu7WfJp4^hfabd0M;Tl=PosBHO=;3BZ zfhbI_dpS^g%~AHw`y{zfreubreLl*n9^aB->gni{0@^wPR@qaPJqURP?>3V}W5<~w z$NbYgol44>c=z(nKY?4Ke1LWa6qbXPh5q&Ozf{HlS5HqE_Wz^oEyJ=3x;9W!x@)`!XDVo$0-3QLUK>bE^q}TwAwP>OV0h z2WfL(lm5-YkJ6pSon@v2U{ES#f?30SdsVkeGBtzUkxHSJwg$mdo78isS=bHS*)f6*pC3>Sc zCZ!Y?5W+>*B186LiS>g=4+`j6l7O&prGrGR!UkX8;sjMq(9w@2mX&%fIzo`o=(ti$ zH@g5BF9@qR#M{uWCFh&vu0=LdN}54nMT){5Nd6mAg{UgreFDG;L0DB&+pnm~7tar0 zlq|K|yW-H#qhZ2rs0j(5aN!X+IRmh95LP2`K^oq~yOUN)$R&-w*!AUdt*i%)v43HF zLx*)b^nd1VBVzGIvQbx*+gY!z)TQK5+lQ@Ezw=!2(8?oz8VvBE7q}a6ye3HLJ1#XH zV_Cnu_Ti}?)rhn3;nnq{PpX7g8Eg+g%?S;swfFKN=$acPw`|kwSAt=8YnHe0!Cq~`&)(0kSWXp) z!HRz9-dj05N%~v+88csiWWZ-`7Nrxy+=Ob>;mnnfA3Z=k0l;{`(KcdDUSodJqEw=F zKbT$(Fo-RYn*6m&82yFG3Hfgbm~8=GVFyiAS2%iP-T=ze4*7YjW>Y(VDi6d`A2OA= zlHAh0wVj7Fa_RR;*JZH|Pqau#+s#`bCZs&)ZWMgNVA2!y;cig##|wADsHh zUW;?l3#ncF9{yQ2{PVV@DrvV*Rf3z7$LJgzDSLpEhl313t%L{%i}bgVKTu(#7XQjP z3^`@wSVu*XOBs6Znq~)lUni*I=};fVXyZk{2Ue?}m)4)Yohr66I`5T~WFIp8$Njzu zfPu9?5H>#>TPL;Or!U>+z7Zl*73KO-pv;xFHx=-IFh5cTs;OZq8M%Yb%ez<>cy4&v z&azToFC`;cT?Nv?VPq=YOC?mfcUMO zMb@Z>T`3Z*rI_;Gvy1ejsVTXwI!b=Z4Mbi1zrjx?QL*Bu7sl0d@Bo#q0)CsWLUAnh z-oX&6!2yf-6g3@7pu#UKWj#$kp}E+|(raK+Dk6aO;|l+9@TBL!+f_ePoGFBwxS!!k zA+Ic_1zwfjfC8<(&P~w3U4qm5i1KVoWPYozsh{P=XiEL3rK~OS@ho4y%5Qq;kzp9T=lY_Ml4DVR~69!inRcE>`)+)*MN+2dP zVkH}8(=HQb5n(w7sG)O5gnWh|ny9WDkqwDr2{XH19V)9$$^9YEb=&!)r6x8St3~u^t)O9m)^e_$ zlGGp=xbzxPAWdswoi#PxrsMiy;SR3mg&4#u(dtdFIIj35FMi^G1HMfk{I>Sd0PFgi z$VRom8cPm-xzD$+9~r+j@!St&Q0o|r5&Jn2@$Ts4t-L1-z5m!7^@YObw=L!O$I>eoRy1d{1N=9Y=Erp4a8BUf(q9%a6gqc|4QYr+1e(-% z`bi9!P-WTF_6_YScYO^3HVrj6tD%;OD%R5v2-;b^5M>n%p|h`+C#%mXl7_qe@;ha~ zToK6KbTOlCSc#KK@13)uc@mjqd~z=8NsfWVAJsO!x~^dc)Odb}8Mi~JC*+JO*m8!p z{(VHdpRvhn93X6#nTNyQFNUrCfk5q3SZLk4FY#SH?lXUHWV&zy_xf6ktebr6>-oFJ z+3lEZ^f(zf0@!#*RD{$on&}GRBH0Qa>Z8+zsD#Fjuq9vpSRE#fDf@rBTZXT|t+fE1 zA2HvczOTd4-hCpn+@K<6PQrsvC_29>2TthqkdK0?1?qlnf%R zfMjez0sbU*9v~CT!S!n6DB}*0^+B>0>Iyg|xqPAgyeOu35rEl%u)exEu6EK&VLimV zoME^!`puH+)vopmg#Oj0Yvlj~00yz@K2X5XMy(z6k%jk6i=1AX4mezhu*kIS`+UGU!I@Lrj!gWV_gIK7V3*!O~z+Q*m93^Gtn6mU9A$oiM{Js!~gxpSLtGq zwSgVbx4>q%w!>onnP(dZVX7J~3)ISTTx`ES&nJex%fAsy?%HKYulJSasMP(h2$o=Zd zC+YbpMXB^--fj?3Kg2Ng!x(5_<8Wdm;pg+VU9n|$VFqYZZ=Mq^blR?Bx1|StJ~$J$ zm7B#7-9vA>>SqwN3w~xTa-EUzpC}hsiUr9ew-xb&9JL*oW367cCP69SOSt5OdsvJZ zA4=befg5Tea&Q^(xLq)43~ID8@b8*wV%6V~3kgL1lWGd#KRv@}hH5`@6%qNv z0p265?B0sezXRbl?jQ$WfnOD(Jx>2u;;JXViLA&=-~Eax2m<*g6yTP!T`ShKpXvq z=eQE#TMkZmZx3f)Es5M*9+XHz0#%g z_sjBYtkHN@zRKKQaM`hpGORBamV+F|bZJunm@YWwxcgMyI=~TNm`)GBDLpno8QxrK zc&N5*b$n+oFq;9upcenc&)MF?8KsUZnr$uPe_!qHL`cqxuldzBadXYHk^})5)VZ2^ z{)I{ZVuPZ#wavma#Rl7p8~b@toDQD4@>^tyLXhM;08YBN`LlzZuBkcLwyonk#nqF? zRZ`jO$(2jJx&oA2(S0mlZ8`A%hLE$8NbxZrRrC*4l49aMmf8Z$h z01i+y7?GxZca8CesRFL%(o#PzrF>6BHtL^Wz5)xHZt%3XrJ;u6KBUt8+pR59 zYBH@>0ho2(0@ok~F|azjXv#EX{LZ~LEG~^Fo2@)XmD}u05+=mQ2AFWrLIfA3Cp{Ck z>5+!xTPXj`_s|)yHR95By$TvrXBG&uv*KKVB<6nt(h%i&^jMC8iyz~7XV!EDsJ+$s zQ~R%bwbT?-7k=%LCjbFyBbYn)CLKcnXy&Z=$qkd!Il))v&2YPpXfB!+T%W&&ss0A^ zHDaJbAB+=~Vm*9p&QkhZ+M9ca^Y!)m01NkvJ)u^4T1NhTiCSc^(?BFlVd(tH`SGo0 z>ae!_YVNiqn|Gwi-EgABQAN0N2wtTFc-8~xT>u;N!pIIM81W$e9jSBg@XNjAT2xY< zgIdiDKa!2#0pg$zQilzxM+a{VXM36O{PSAPsZ$LW>U9`S_vyS z54Z{jQ(_{J{?qO1FFsPZ$GrCB)sw^Rc{pN~iAwRH+X=1xFjYT7I8E$Yxy7b3I?ovX zO`c{WY%*-`dz==aXhK2?h#cgaxVU|jWnUrE|2VwDx5*vCRH(1|5j{@h4VMD%;u*Co z(0!H*M0sq|z+Zf~G;N@L`=CVeB$!$b2&TS9s#QvrwFY`kVZ&}*zdbI_O0U)_3!D@bhW|sV1xs!IIdpJ>Ps$Bk;*B0>o&{$!+ri?V( z@v@e&3wa5J74fjbY1~MOI9fbS9BXpPTQDyVb=JCuU)#j<-)84JxgW#RMtVpt-N?pE z*Ugt+#(Ge`1nEs+^u%Rk{uHk8i#=^CGY>&;)353g5-F9=u&$Iy*WX5;PvVOH-{$Ev zGJ#!!byJ0hk=5A#8rwZS_{DZJh`>98F1q*w*J{;%VBMf9z)E zPMsTnfkyHOM|L`f*FxeQ!l&k**gHTmeuIZx8w=GozUr@gjchyKvmW|1Ef~AJXa)V1 zl@q02T%{&3))c51@AF7^^~gmwX7fXR-yrn-z8s?-&50>VOc=&7#h};#U@qVveMEG| z$$nj{MM9s=&2`7%{@G)wBy_zw_EO}0=o0}q0PBTa^B#x{F-`u2iDYSbB5oNG-U;mR zy{LBt+z0*M;uL~H;ERmvL;!1&13ri!+2lnr+nVX+nd+pPE_*tH;y%hAh# zDqw^i8%#D7UOM_wwPPzq6+TJ*Yxa(pufuox*1J61=5FE%bHvjYs~xfv#Ha#TxK^5LmA*v(iEO3wJwH zCvD)F^K-Xk8-%rN{PzR;3r#+2+k*3;;&}(I!~%1(J@lC#R!XTq!&4e;qsWGAjC&+g zfk#2bc>W7&Q1L*0=a1ZDtV?RBLTqxOm!5*3ePwPK=d`x6xmj3(;7=pKLJUE0IG>`F zQFnjjT5l1C-%KrLp&NKOg(^V^FF6bn@a_}-0x)R8D>RlvC0%Ot%3A++pwwK2J{=Nh z)E*X;dP@L-^CSWC3UIgo>-qtPssBIEz8tS8X(#=kyMB1&YdrZ#8lE=C9C`J^h@W(# zk-a*uHOKy8W`{7GH6JvoIsa=?m$BdNA%C=(g>y3@&h~|0DZ^$_yLOCPvy`slc!~&i z{m6mc1N-vv?*nO;qfzX_aVS^)+{YUA8l`31p9vg3JN%&pm{X*%{ahU>^uQnM1hDeJ81xMdYMLbnr=v4Bv+b?JHx)YRWz$p#jt2^-9+x%pM``LT<>J0Ik6eyyFUJje%i88-MJmgxH7D%mo48(Z2lPFBrvbdSUV3 z8CqrlG5@FgJ^8o33o%oj7jiLphi&u76c(4nQJjv0>W6Qd*@C5^4f=k9pGe&k7g(1j zd)^l<>qpx4<21cAPgD5wzpt|gB^7@=odJ%-7my>tPFO^?O0cF$6g^!%@L_|K%ea@k z+y{+RrKMJgG797(0f9oQ43L9*=doG$UF*Ljr0mrPeAuh5<1N=3_ zGr+`wn$@0sJDzN46J`t4i)odb)-0T9`RyO#W1)qZ_RM`iHsZ z6^6?y*AZ)y#`wyD#R5t9XmRv(iK3GA2>N$Ge<^MESU@%wcOD~u*us^Hje9J((~Ozd z;I8|~u2=@DKE~fA1kl65!NDT{?fe1hIQ=z@V%IoZ_>Mg#mkd0<^59uFWjM86g%mfq zCW=@F&xHwq9l?coQZ1FZWsG5-u(18cFHD+l>^-t)5$R@!TPlHnHgW+&Lapb3-|v0( zd{#7R-zqBh=d9*eqsQ;vCTDsrRUXb*zLtU^p$V2Sf{hY-{0t7$!RFO{c9nS*n|SgE z@}yJAFy<`_JV6+87@R%YGUZ#{52Z{*3XSGhYTmom5zp$3+c856cm|nq=!U3G}4_)#hHgvKQTA3er;_GHxnYj znrv~=phcx)d$8Ip9u3bW0SKtnoTK`UgQ@+|-N%cYygnBRH-^gMtg*?Zt66b@&=%Nm zy08XThx+KD)G9Y*tS$53bXm*UsBS)deQc>6`P>rm?dleu6O<(rOy|_unyX#0)`bt3 z(p1UVpC?|6e&&GNS1I|B7_aFmvjhjv4S?SQou7b)!mfxOu8;=wk`iGT;mIBR{yUSD zzgo1zCLb?brLV6;nCrJr2e3ZEDFO~3a2)l^Vipv77jZ^gLk`+0)B~M3Szn(=U%tO7 zf1XT-2OLLK*cbeieTsNc%I-rQT)V?DpDaAW&1W0iq+E1TAVKKA3fj}8(00OuZWR~B za_!c%ymg*Yw2?A(iqBkab2{NUS(y?-m9xM)Z+_VF3rFPpCEV>6)_9M(#eR?WcITUS}HT~=l!(-{lfz5 zVmxye=A^G5sGyHCna7?DRFi0!MuB&+B`Z+HLn0SX<0yoC;b}}ul;@W}H;;vsC z8*?^_$$O8xd3N3i>N*zf25C?!XM(tOO9y7(V*%L^cboVZy`g8pB*qMbCB$RJ@;R=0 z+Eu{B$sla|<%vPbp`{ckOe9lJSi?hea>`o!zr{&d~W(bbX0)47@DeGkxlieaI)kpY~1OxeH_@0!^Dhhtmu0 z)dPhkgUs5N{Tk6);Mla}1M7YNOmhcGA;-izx+cYME%YjNlQZw zsSe&H=vUj{yXs%ZQ%Qc*J5_~f>{7}zlddJ~PfAuS z;-LJV1L|@2$;7U=7rD9eKb7v976fBL^Rt+91;>Yz4Wtjliu{-hmkF%CfE5HmfKVj$ zHM!nNb<4-=+NXcpTRG9lyTVcW^r@8ik&rw9ti<9XDg(3mtVYvZ)9|-XWXn_t90o{& zq$NadLaVQy1aT6%wHpJWiFoh>1>AG14atehF<-&Hps0n$(d5^E{ z=H3$~^i(mH?ciAL)z?qY`t-1(b;4t0^VtkVwRG^ruMx*3r!HsC`e-qNamJ@`3W!991^5Aa|zz;!4v zL`8ccwDv0Xc}RM6FTBrYm7zyVxDp-|lxpycz6C>6r7*iCe2jbn zPt44FXIoTORzgx{iBT*bo?=9Z$~cr-kudlh#kCk647w-Jc!}WKkli!uvUKRO1 zJIgBu{0b<4OkX6EgKqSEL+8SPmhBn4UTH*$b#DTr1J2Sbxk4>4X9bOUS~Q$n+F#`A z;RK3B3|x)ZFCeeurfYiFkJar!I6}Z`tq;J)gBCN|M@pE*wl@dWne42t8c6EoN7&>C z<1xp<>AS7*r`7?{E)iI?%M(@B>Rf1c7y)UI44*m4ZTF!k_JcAS;ryp&_Bd-b94NKd zB_uxdnWIeidq$!p!mJMId%0F^X6~}0Gss<=Y>@%?H)ycSJGxP5;}7m1?JQeqC7vPY zA3kas9xk^5q)z|lxZ?E=!6F12@W;mSArR=p#Yj#cLy%u4KYF%nSt%|p@>r$cwSLqU zQUv@+NhC;8HRE~TucFFbK5;8YaU0hA(q)<#r6SVC#Pm9PAwYJE=MkW==3?wA@XOxr zy`C9Bi2wbU?+fKmG&8>Usc14?{HEZ0iyTC$Kr3rkAeIfb+cN}W*}wkFubvd;GfVkD z8{S@}%2py(+QBJ`5-wy7L2oX2C`5)lh>fcs0)pGzkL&=$oBV%|9~ zqKM@Rmq{rW6s75LWPK7y8VWmLctZ=~>K&rzKNaF5BapXAZWW9?(44;#$V!m*(R}?H ze@ajoSOwI}XvALE9Wp?1q$6iXrBYDmOvrk*Mws`{WoPcQq;SC<;C{hlf#PjTcJqm7 zP3z0qwW#1F zc5_M4;K?;7I~D@&NzHo^yyKh=!NFn=BkPYze^Z!O^x~d56`FK*}k)Pxq%-u#lYT4|H|im;)~Q^-agGz^x7? zR~(00lk|KPt2a@W{yrZT7$LzNW#5>@A`vs8PW;9RjO^LMG(6-V)(VvyF6ts!+d&P}bY~A1%RM7aopi79YdE*tc~7KGWdpP-*MD^5EOX1U zf|o!6_TEx^d^lcglO-l}k%K&|pTVR}Pnjru_Y}MYpv1HX0+B-@lBJAS zhVwz*i_~+6ag1IC0YmD9&HQfJ8DRbKE7(Ql4gV;m$hAs;YW-(JC*PSlt0mwetv@rF zuUZg8t8ShP@E*2^_yF6+4bjfc+Z$`9scI;i?TVQ0k38Ggwq2UxJ}OTi#ZSLFW3{zT zzX0c(5N34~CUb36KbO8&?08MH{`U39{vBIQW|ORJBRbvq`;s1TK|A1rp1SF^DihnY z-z}cRCM%~72~*rD^}oP0l=Q*ryPGTn7X((bLa1VZmM+>M!?Xlu^(06H@ii0JT`&3P zpC$5?v?L|kE> z!Ls@@OAY+)pYv#f0%85Z4-EBX>V}F3^rSQ&mB6p#1dVR7Px*J1Vhpc%u>Uar9;q6B z)p@*>si?AVmdVXJ)@2K53;-n6vmg6#0rfpczcyxx%i;LniU0Zl+xY+_yUl zwA%>;$ycb3)3U>>r*j|hWujfc+Xq?!ulPCKxg;u?t1GwW`;1{0#?zxrqDk$jRXFin z_;{~j;C2LPg)ZtnLu$)GA)ar|$~K=qU-MT@GDkcZ&nbPH+lq# zAgS|yy^`2l&F@9^@0Ijx?TA_Y760XmtF!?7pauL7&T07;$Hl}UdW6R76X~vfeMMdk z3b+j0s05fuxO@N?k7o`E0y$~jVlC*nu-u)u-YJC@P?84KS;LBA!71lS`#q zY4T3RZ*d%f90R}Mu#J_3gUse|nsrA`2>^>`0Ra*%gEOZ;TcX&%XoUKGBac;O%v@E( zQ;Czc)^=anY66h4FwCNfxgT~kFwzN4>)x=r$nsvR>l*(h_WSkv;-1~KJmX0m+&5sc z-f_(>UGxYwVgsoJsvN7!+4y5`R za<7WvwNRJ8{Lb}Cg($U1_H+W97-0hxUgFI#Y9wYL5!=7VOqTO%bLI|Z&f+6_2S!sG zDk5=eQ1wCc3u#^a*e#2OPh!sweqUxF#oOV2nrsVWjWGH0-G~)^6%aB7Dx~7MNm1j~ z%W4YAKr0O41iktwtDsh`GMn000&WhKasbF30rH(vXD4N{NGco)a^B_nNkCkJT4l!w ziv!*XW!;1q3^rJUQPJvm6^XrMr4=M1%y}_?r`hcvna)Z))9vJ_LXxJoLDC+SUp3g8 zjIZ%l$3f4hB;F(Bb{&zG77f#Vgf!1b9T>|EJX(vNiW!OuO$TZGDi#((wO5h`>N^NkbpMEdn_=O+J_E*T zeB!eA!8h)Ob2F!&+?y6@RZ}IV&dDc*MUw=f$$Uu}>W+(Wt>93XEGpL$mmUtCwz9Vh z+WWUYqd^G~J9_;H&ZDG}@IrvKlMYjMKFDS#OR7)J4ha!|BQoteNYwZjUl8@SCZ~Sy z;On2j12(xP5g&}z?}KA}T7c#J^8mgE-Wzn3slJL%L&Xi~6Paljv*<)hwTEwS$pj6JWyu&R!bR{nHEk5tk1QnY!bA z4e4Pv2B@~-2n$~YP@G)GfQvvGcBqLP<498$3C4CGooyR!DC1gD=i}k>)b(me(^-4c zl>yDfGl&YI`Dnm@{Ud25$!;261V;}}|6h3}b0pGwi}+~#rxR$4hfq*5^c(%=r*FbG z8{_!w-k)K& zeOuQj^*-##+5T$Td>{-=%!3#+|IsHUGM1s7F=!gK0S+O&BuvKM8Fs5<;Z4}`xJuOzX$xjPwj6eJ2+bcuPEUC+}A#p<31gZBzYws@a)uV zo{WJ7yqh2(E+nN@h&wyTW6Yq?H{wAm`H8y2+;XCdy@NxzfMgLE?FJ1Wm(b@cmkQtf znKvTPq9*`4=~ZBf>RY7ArZaO=SHD#5WT39>KUQ=EY7d5p*mKYJR}+3xoBi{isde^F z4tHk5H%hV<e!h_O6;k49Qzor2)IQ7`_e1*=rN|X*ZF0I(j&a2dt^^vv zjAQXfwYK2k*^vJ$`QdsOQ)w+@N_t%3fM=RLixD>hT!{|2lGM%T6I950;j8zECw^3Nt( zh5tuaUzL&t@4PRftCW0%n%bB2lyT^QTgwA43+09U|N4PYP6fdI-+3WE`4p>SuQ}Q8 z6Phc5VpO!VIh9L+$LbUKE}U1cH`?@oExr9;Te@C$T*j--;)vpSfs$+EynadXqcGqm3uT3RAGfYiYSHNS(;$YQ$+K71kzfuDnhWZ- zMQpXD9*@gY%bZ#H6_JV1f5K5SGUjk8mu?ip6bQheW?t{Qev#0wU{cppLgMbNoGsU@ zQ5CWRpyE993rcl22LO8mPC8VPBJvb5qPWRbP$^=Gfnc=Uxdr|%LEml?f4Vm*G0D}@ZE}774CYf2fvG5|& zX8k2i0yw0!ged6Lb!zC+Oe8@oAL@hrd&B#{1E*S`F^TL?>`6H4&aRd0Z4=X_(y*7U{YaDN!6DpyI7zaTnAQ zr2u^d@C3>bIy9L8rhy^Y^XUC=Zb={n$#PR)MG18rFwV;y-lLJZ{zhIyBe$L%92K1bZ4sae*a9w$y||FY z)u75#@9~$<`{Vv-c1^!}#=OLwbo4!*HVg>%FoCOOw)%l75o7Rf;pIGSiV?mNLJ5Uf zAY%P(-FvL8pw}y4kOUgFVm+P#`hcr)(n<4$%QUbtUR>iqOrQMf*?f6CDtW5IC5zh1c17rdX4K@rE48*H4j z1=(XE&ANo99i2bDKjW>p$!f-`Xec&dhuSkSpzvZTsI~`2#RA;K(ImdTZ9~1K2z|@c znUzGde0#s&0Ny71b_<6qj+q3ZTj>6e^X7XlsRBuvOoJ^`3I~*jqAaKsgWg{caIHLEFs*0i7I}>Ou zc`WwTStW2|4H#Gl3pQX6>Pc|YntcOnX=@i3`?gn?{jHe4h$UZz=ZV^ufzcV4v0svN02F!6&#dl7K7A%Wf{$>KVZG8}#^ zr`-1piPnt&$PA1nP9Imq>f{}Z!A32^3Ol1J8W#25&HY;VZEjA>C*dS4TvavRLFJ6< zu_C}w%Ajy(+G=~R2cAz}#UfKcMif3{WFp+!V(!s=a68dwW&^x7XbjwC{#Og!jQ0mA zZs+D0iKK0wOS#++%-9$=?ZeCj9(vq7pwR|%*;bD~Z}re=Zc|nyz>)KaAADiunloK2 z-S&?g{|;F|2R4%l%#7I-vD_D=!w~1CKAsLhTwV$54Cqaq;oBmHqw*ZSfIi>F2`=_p z`yN{$c3QmZtoLK|3)?LB8DSBC&hff$&O*^3gmM54dZ)NNBA}#D*B>8>TICLFd`*5a z(vBnXt+BHG96h(=(JK4vLiDGz%`f`3A zk`S&4@_Y=LwdcxG8waUR|LJpwjKbH#6~R*1bFwCWFha$?0!OgoB*TYcmBT^){E`p6 zrs80B6oFwI=`OuMxUP;lXZ}*#H7+s%j;}cnAsoGNBdgjxPdo;M#PqVs*Gq&vjpq6} z#%GTdwqSy*&zEnx+@uqgXP7n7Op)O7U|AjJ0gv@-`#e>8>N)4#%XUr6a{>G{qW**5 z;bnIF4bW$5q4^cgD#Qg`rjKG{1xWg}K9lF{N6%8m_Ejx&L`jkj6)C`zD-E6wK0H&^ zG^DK95Z5EfHLv`FMrntT)PWy`x!lOsR-Xf~xu7`&VWI(4_~V4(275n<5{2cs%vLZm zEyj>O{jvjvge_RZ_X*8K;RiZn){j%Ip^r~RDG9V07gLQbUXm?~Ypy^4qV$Mo4!o~v z4r|}qz&fgPByX#=xeKB*>&`n7PDBDmU<*dVwx9;Zzupkrm`?$= z9{h4md(?Iu^52aJa8mB?`a0{AGGrVjS(%>M<8d%1X3Kv(xI4A$JJY6U1 zt{(#@Rka7Bd3dfp;mTGWJDF?Vo(jFbUW&&%R5Rb>B$AUz_SXOC0p5<-pj0B9{U01UUCRn0S|%l zLEQgCu{H+6(*G-4jO#45FrTway`DA-`kU!}oOHmpms~&aOpXSnsPEgJ2yYc^7 z#Rp93kpG&}Bbrq#B!O>EqDb%FM!%I^UheF0gd@m~v9i=wMQT3-OlfH2oIlIf%$g`$ zh*D8@ts8n=q)s0)&gn~hB*KqF0-U-)@6ipE-JF6?{luOX?lC0q4pOfi?qSp2tj*($ z>qYgB1uOd;fI*|u^B=yGJhA8{Tt*v|!>sJ)B&oER3rH1Z4ql}ZyG8=J*nZ$>YdJy1 zN+dGbiPBf_sV+C4M!gG+_4hgX~pI>x$~{#LpJzqkKc7kUlT*PyO=trd2PBQ<@;& zoT~+QlRmgs9NU`BnSlr{q|j@O_?ziX8_#;;gL&c}Q`Vc#t}|lLpos!;_(J*KRDC$AZNX%%h?wNb?Lzz-v4QxfS@>scfnF26)|KqGiK5>m^N_JUev5n4(RQ;RXVXV3Spt8U0DrVY91Lg{ffmVeRvutqZ!A z3};IOc?3O#=eG#q`CNb*oeDeM;!#hydL)CnnYP!I#-qB)${Q$k%ns|llvbsqCZ9Be zN)(!#cx!t*BZ&8bjakYq;RrXYkYYkjWKmlGU_(GGKKM!dK24g zw{Fa+;*uUR%DR}=B?oU!*(hSnfsd2`Veb&+c#?~m1j+ZsA&z1dRJR$l`=msZ6>El< zfjX!_V1Ne~38H(ur8ROIOkbIJ_@t=aY~(d7YRc`G5?!RAf-Y3M1z;@bLvDHuX_sr7 z9eZVEZw);uJDz1?>sPW4V64zf-|zGpgB=y1u?Pcyo=&@Njno3&xYS2Q$LTD8wPF-O zrxDYQ(W9M|FaYKNewi`P=%wp6;n<6)J&_}GMnXc*(7)3HTYr^6sjZOvNeI3mML4o$=W0fiC9$@ z(&}G}#tab2Y(~c{h{1J|N2kp!Yx>+BI?4Lo}a zYAt^RTBDy#X*TGN)0VNdZ=V{G|J^S?NJ%rYppx#X_b`JJXMmTuq5bQge3rM~LP$;g zzF|9kp3p#|4%8@LI}xoXk29R`d};t#HUPiI5?GWA!JBbX%URK<7>D=sR7Ix8 zoyR)+Hyhp96tWZ4JV1B#XWCi01Q4`$@RZApjt_6E4v9UM_X?ibha3=b`F^NUQYLq1V^@A;8z2XFUo*egL#mZWn6TOgtDvB+*z-Q=Ar@VtD+=;qP$xpwBucDhKx|1}|xbOq; zY7AU1_*Y*4y*U3Dn%K9d?N@>(f`Y&8@|S^lHpD`YVThXhGgyoA5`<}6N?5&b-I>gv z=lshb-Bg;8bc3q=?7Ml3Y=8foRIt&d_J8ys#9yC+i~LW<3t2`+lM2_RaC*t*0fyZ| z@fH`S&u6b}Cia1TWYDyim6;|A(`z-e`ea*sVvpf0%zdgmKT7Qzyv?Q1<}u(6v2xhe zYJ*tVb=j}>Lq7EoDTQwMCMGnJJzyXq%x8{lI8{=dSg588%W}jWWa(WL0EwCQCfnnA~90w zltO;U0{7<11@1=#RkkLdZsj1=d7A+m z*cA~n{W25o@WP6P=AfBI6{A%kslk`lPo}G4aC+Tj{fRHISWR#r&$A*td`9caB=0w) zZRHkKRD1Q;i9Ai@i)F#9pENo^5RC^L8L}bL5jq~j`F(L2RnwUv)aS;Zi+15P$>X7p zqcQ~?m=b;tV~1H4rzq{ok(pS0L=*b*ZbcK`ky}^=ovc#8H7|q}bnUzT`&h(YGLOoR z8RruVRHX8zaa59!CuiY;ObtIf8BwhYzlUIXq=tar(?m(}yDNXj;6Zm=i@SQ^j~lzs znA=}-Jx3nyXx<|L25cqz26|7Y_jHj#>{gBP>yM_IGpHteh6$v|teNl(dLdVi#e1Ma zR{%upa`|L0%s*S9nW3qpRsEe}%#lUA6~grigWtn2OLzoe|98MNPyp^g$d!+w!6+F3=$UPcV>%_NTNvkHPkIsPShlw$Na=eQTo-`=#oT zZbD-EZ?oXkU%|i2*-S)chGWiYXxA+dlu_qtyW-1w`3uD>(H>%t|H*O1u-LamLo0wvEfP9Y;5+4vc__ZS`Lh zTOOIrbZNHbFGWlUT&5V2B9HA?bn&gPK5!3K>JeYv&{&b+fy6)fQ}n#W#A3gkk%nKH zkw%gEI5M%n%^dAUB&HQY6jBKTUQ31}g`N-1RXS(Q%R@zIOsySf4-{ntnDK zn(aTwq1_}&DhMzwE|)BNq-?QY{?&pc9{VB`Dnk(GN@KJjyZ5^2WGN3Z_~18}C8?>* zlJ&F4?B8B)+?QYw2g+jcP(5ze=Ws~-M&#K#@zidUJiA2o2U4Gs`MGmqHU|r^`GEwd zPun$xw^oSvG0R^aKTf$_@ucd=N_%{*a-R!Zlg(~mED7)+1v2rcK0F5Lqhg0xSdzL| zy0@gd+xh=Ye32gHDz0Jyz@T<}ESpz7QJnpmFV77xEeWPL1;q88yYSyROAWN09SG=C z_<#$D`_?{CW5UotDG#Ci%Dn50;iDfobSIo$8}Mh(F!l<7fgv17_RW>6Z|p#cJURAr zWR)*ssca=!{qX&k1xZP7c!+3V3n&CSTPox&r9>Y`Bk2*XrXN{Lr@gvUZAb|32;T4` z1VB8%(=Q^1XT5}w>oQb2;`8!BG@TE zzN*!4lriZ67}!Iwqx)k&K7{$nQ?ARez6LLY4OOb|_|DdQQyQO?#&p*g5rew~nqc}# zB!S9V+UH;P+^P6VmYPXmGKiJO*s{oBp*=D?7wClu2KoS*^bKZB&#b>NP9pyq@s6uq zRPsC`TOlRFaDgis+Y%nklR)Vni}x9#V(CAM8wxPz=fxH4t6ugBy{=1pi0Y6zk{=j}52p5(LVMp)ZRhqXvMWYu zhimw`DOkjYm1gMbs$i!dQ~_Fw7G`!{WXHS7l5LSsG<$w6cm9T@Kl0bYLDL^0JIb-2M5R<~H8(Cd3C=H8h@1 zX=D1>8M%}5bmjcnZrNU^>Nvagr7OnIDg<^_&M({(JA*DJzS5aRwiQ$Ryz z#D}?cOHlR;n#_}by3`v0>^BHwvF~eAXV#&wG)&A4?K7{YeAXtXf>kZxBeivm%7F;L z(m|LMiS8_o`xm@Vk3Y=oeSEPUqC2Re>e;>r?w7;hGbb|% z=OmM|h+LDN^!xZG00yn2H-A-|6_7ZBvHAF9lpU^J&Wb)+UVP0{jumgZydEDckmmqL zv)m5$ygTW<*h%hL6<#7XS9}p7lzVWtYtBU%fwx}`z{Eh973-nH?^fQ>F|OtJ!}MI? zHCDLBql!3}^j+b`BlbmrE&wQst|1r8b)m${87R&Vdwfx&g)LV|juLK0Tj*#~3&ueI z1|;}YP~}Cs4`mNn(H#6e`GSpP&-Md3%FA8uLHlppKe$73O`rw~2@dK^B)}cWt`lR< z&bZ0Ji%>6q3ooMgGfT~NMy3vlK;4rEzKsI-HkYEBZ$r1-M(#@;#MPdwSdJtZRgYdM9ItD$L` zOQ8z){#=FH6iO7NySsC?n(mh~o3VpY*UyxoRv*3Xm7;?t6C3}g68X*xj9A0Dt2GSvqg&45EWxiCnG`LAXdip?S9 z_2^7`>hzhu?)Nz0!x+Fnf3lfC_43JuzF!}U9UAKnXUl?EXKToWdXoxaY63|j05b-~ zdn5XmdX(9@E;xswp?Ni=R{xtNU&refei89R#LEQ=00z*`!AoU^LwVvj2}kFGsdz5C zB)<1ZD0F@`xh$JNhWHH;E^xBoqhK2JF5qB2Iy{4N$@BlA>@B0RincaTx>E${PU%kR zMjC19?v$4nq`SLO8fhezPC-hfk&q7Q#=G~+Ip4T<++XMaGgi(u*X;Q`XI@8q#CGmS zs{+q}dY>6l-26SXh?LzE2Mr-RZM1$<=lzDQ6!U#hEQBrrJq1NZ-sP1I+BaYMRR@qd z-Jdw9U~%E6QYj@QwSGB+=TfoO+YtQ!?-vEce)o}r92E2+K;+sjb@03--PPb; zzuS2c%|(1Rf`pkgbWqHX==4_^T5DMu#3_7w#1i{8Bq@!~Xux9b{Z~1|zKeu>KknbH zG2T#sCveh0D=Nj91tKDMA;coUwR{N?vjRf?iRb3dL-js)whaCT%assA`S|g!|E;~1Fldmb~F#;`BD$wb~f^|6Ut50 zdgXWm0db=6+4}D)z zE(<-Etmm2?Qk#KcqX2;|?zbz!X=!0iG>1&%;F?*@C1p zr_0ZG`sekJUh10(xbP2VWv-mLNivnhhQJ1Rp^`M%2L_Cx{{JK|u5KM5|L?}?5MP?z zoeSC6F6^DI_pdGDm&NzzYt!FX)+ZpVKFlH-0Ft!Pe9+lMh8iNPP>TR#HE522gpe#n5M4mZ@iCv(js()Qo$#l3YnP{d@kI4iUir8S z?1Bk|h2AFh0-1`x`A8lO>Z5;l7erB|4#aI_`_zoRdzXL*z@R3C2;9OyQiT0imw=M6OxC5R2jx_OmhdWky}>Zq5c8@y97t8X8-VYX3I{( z5pgcXv`ATQ!vUA!-Gqpf$~6SnG~^EeO9Npwb*{PPB>re*?89}6CkGoRIR#4gwy4lv=VInT*;ngn3R;As6qL59Mm zL9*ov&$~>J_q$fO63Ws=$LTW|Q8ln?Isq672%Eap9bg*I@$7z{kt7%@&M6kqP_dQ) zXHoWcrWw%-8-PI#t;_tgxP)pZkmMUrxVKaVO~Wojos%i92@oP0GJLq+Wy?k zn_WhxU!0;QL3$=40$(C_V+#|^ejMCW6yFvg0kHpcEDVJi5z7#T?cOH{8;@T97trv6 ziV-70Vd`+WR-Y2L-43w0kN(GSRX`_xJ#&IQpKOYB@g|kyp z_uf=z>p+O)p#=a7 z04L@2$lqYO{KNKpljz+a^uSs z0d2`=20}uq1p^$fbzzs(lAO zq;--{`Cc*?4h{nY_hPj*1$N(luP>y)=-Q;0CR-7pyP+ECT>#&$|I?>-`x$9Ojh!F+ zSqsl6^!?l;T~iB+tXjuSll06}OMgHs0Gh#rmR@Da*WaI0sCAObI9jZ#1uy{V*wn`L zQ&`fDxoqQj#ZQ)A4RE{a6{}cjV#8$KH#_%U%Cp@F-nRxYc4GvvT>0G3Wz zBIu7=T?IMaqWpO79fAad7BZbo^etplj0;>>mmME4yPjp90W~PRU_FdH zTh>LBV;Iv~d*K*{WRFIa8+Rya8>>3Yu3I(SfhHzTehXs)=E$Jr*s?6A`j#L}6v8ag z@>|RNgkR(F9B@a!mVuKN15d?5uX1ooJ*TZ8%Dvj+Jd<_QOD@^l*lhlt_$^z;MhkGe zP(j+=XIgvSaADK7kR8Hlv}PwgbM_V`>a4z!fM_xNMKA!P21hHDUz{T%%`VoHTC;Fd zc{cK^shOu_#*KP(sXAP!6||ehg0N2mZxw6*{VV8;JokTOC3k#gJZ!u?<L@-`pIlxE}pw0vP-pFu>zjIE!3 zI;1#VoIpAlS1CMXTtTvA(nWDN-hHP+n)?75?fV3p%Q9m1GdV05>2gqj>jTF+3@~us zDa}C|8kLNEAdXdbvCN%hV`n6bSLEvb|f9^jCngM1_1DgRU$^?M~qof3zB#Z#0=vaYb>#@Xk$2CF?U3SBw z>U4nU%xo@fxu(y6}+m?X_qy5=dqAlVs2zl7p!~zPD!As1*p3eDgaX=sRqCqpB#bhY7n}if4<@FO4xc!u0c*M)wFLmg|pPD7H2&N&>jmYSiZUcTwM;&S@^16 zf*fzGrqqGW@XMp&&YP=o6*}Z-pd>p3IHPH6iLld#XL{IirS&_E$K%>X5!hFoca9H= z^@Gyg&A`HF@qwi~1@$SQFU7{&L+G zAU&X_C}?+ftV%D8U0U-AH1jais-ILWKXK6|+d~wSja*(+ zh`2cMOZLpF+F-7xVV>38R7HMIsbkgCr1)jObroZ8t~{dz-?zR%nHm#yF}mQK1MCHAFH2kb zHqyz#q!Am>g!tJB;Lv|0MQ=wc0dJ|xwfg}}cie4}1qz!Px*9gl>qc^d! zGW(+cnx1*g+8?Vl9)RQy)La5G62Z`q|3*>&pIv$i)8_Plm!`vN)LM}Xc*)b43bBKj z#cIetcT{?tAv7Yc{%)DEFH#4j>6-sa)6KK5mt9`(B}oVpyZrnNGlYs7D_2XW+loY~ z|BpH5Hy};xf;aqSp5~rIQXA3i-M(-K6HR)I0J@+HH#{xJto^pOwi`e$d?2ig;r%d{ z54^cj&Ns(cR4w*}7=bw{8h)qmF5lmAE=u{~ZJ|Mk$Ec;OkHK3BSWwzHp@Cm7t76wxEw>JA?5;Qh$$Rcnz!%Dy4I{2%f2TU=q_U*q0dTiZrg> zu+{|TBTbAjXC!={AU9a`Qh2K)sH}G>3%SfVFa^) zZ}s17#BhG@_2RyzVphZA*N^io&f|Qc8Q^LqxVrIOw>Y+6Zp(Y|}<+L6;rXJlP?ZPFM`8;9qlI?g;xjW;* zJoT5?6rc^`Ns&IdG;FMh@wYxf#2THb#;JK)fskgb zs>aZwCJsu#Pu|;CK#CqLGzTVNE7vYgbLA#ixRkYvAbXd8N#t(K_zphLl$RYn-VUIE z2XJjkD`Usk_F7Smf7}mYJP8#P>m5h#5$&Qs6%({KZ0!S+Lah-gZf9}6w5!qQK4N@7 znwwAUo$24XIiC(_2zGv!3&#SYm6t(=oN=RvyQ#?@EJ}U<`TbAghrge$O|3|Hg3@$! zF~@eIz~`t83P2@svF}EwBFBn&pZ8Bu3RFypr;@L})!yI#v~0jgR0doZEL6CxW*`wZ z5dBSy+h}c|T0;WIF%aw7>Y5nnfsf7m$-)HWj!=cA8MZOKlhPxHqomSrL4}&ch*{8@ zFnSNE^#dK6NeW7g5Q?Fy+9S>p{&%Kv<78s_G{|| zsyFt^T9%&%;F|4Y#I(&$sl;PI(xZQ3YTu>JJi=qCgt(oZ>*d|zr(F`sX8YR>bBQ79cKc8Qphp-F zO(W~+-MvjV`_PddHKlqS-^?oIt|}=Q_eIrMB79&zSS~Dh$W8a$YQRZYvEzZ6Z=mb| zzp|+k5_jApQ|aF#jzfxT@Y1~TA3=dM0#>Snd z6|{Vdbgsu=8*zyIJz;dg{x3SVqd3gT72O#pUgX2gHOe6Hx+HJAf;vW^CW7iT z=UfC6kF!(nx>>4^1VUpy*W2*2mxG7ETZ z=0HA*-+(}?@(xkYM^+o0muuvGzS_L5W4*`vIW?z^Xch& zGT}hHDqz}FU^tH-@?)+9(|vs(KKwdijaXEk`SQr{m00tXUCl&BHykKu3-ydmi{lJs z1WqCckX-Sm7uLL{VPdGG35BSwLiiEM#`Z|JywmdNb~?fKd9-dI7+|#>ENe@kqLbe(G?D_!X^Wa_?sG0jL*|ejbrO@Og;k)9z$7 z77RwFz$6XSlLa~n5kRUo>@`hWI&<2(1HVT2YWkdTRGuoyzGi5L6Wc!lV8Y;; zQNE=Y>h8ELPw}_;mzK4B;$M?xm~w(DR_saOC58h;3xfq68Tc9h4n4Y4Ykl$Cu68-k zo7wjj+{UVzfe*;Eq*?+Cov4EU$xEtWk;xkPNu7qNS`P{WdyOE5?eqZQdaXVjzdy_% zX^=pLXs|>z7~Em{{|@eODSEZ}zYEck%#n(hT@ySfi(?KZJYyj#c6=g2!L?3A@7^7r zbvGXZLNvvHg=q0f_qv@akC*zz2M-cL!+qhfON!4WDea>;3YP|2?f@Ygn#?Of^T~41 z$!!jSvg20E|{ou`jvZV&$p#RxsGGv`*YPA$`(()v3r^{O)mGwj1L64siUR6Th|4uHq?LJ#p$R!O;r`tHdG< zgLk1-B|e8mLL`uUH~x?rN2oH~BYRuwKlI{$N_bhhB?VeW68a%)tL`s2HMDJhDa+kf?&TdKGYO#h)I!`xRch6)h*U@s~>s29_Pt z_|IOY*>zkzCcFZJXlp=N>F>?(Kf_o8e8{eL!y7Ue_W}`lgNVO|_=P$=_kM){FsSpY zY$%&SK~s6-HHQnimKV{S^f<=zzsB;I8$ub|awxd~EDfqDgP#eco&yoR3QxE6cjt%~ z#Vd`Pgi&})9CiiNV41!XihUtKlp%SFX6>(hR%?HzI(bmZ6{3%$gP2-O|9WM|PCU}$ zvpyTk%#)3C2VCaZ``70eIXgV{pLvIe@)9&8xY`tBN#9Ay?JbPJo=iW*iJF7RIT-bR z1>yzx`BH*q(K4KD$)Y6eZ)O4QYbbHpx2pdsR!0OP7p0TC*}VBn1cM!tRYIh6x04cD zk3#4L*8hC1c;p}kioi+1LzXV(Pv+UV9Y|~6`m<)E9aN<85u2*q5HKe?m%%AL) zKBxFEC4NcngSQhKX?feq75Id-0FnE8u|DvO?bSm~0r5s&S3jb~2<)`bW9}+0mz8{^^K&dG(=QzDplEg z{tC_EW+k+6nHLD872<~VKuXd36)|E*rd+~}U3}Q4j$rBrQy192EE0c|e3a%|fuIYE zD*R~yf^*WwYyOrnf9qR;912XwhgkVV;n>FyBBtja_J)GKt>vd>Jl7^*ah+s?gh9@PAPrt28%FYCiEHF~+ji4EjjrBp()yC^a&U=L-r;&J1)0nTp|x48zd6aH-cfN!1ew3^V^%I!lCa>Crr`l~wd(zUk*`X4F z_#geNL>!p+Pcf~L`riv8nms}w0+6DJ*$t16L)0$nin@i8-C7@sn{-aQq~^#v^f8{ z4VC9b!JV6ufAOLc6bzxRBQ6UTv7CEa=F;|y(L0h}PlY!A^FZ|O?B%0WP%+5> zPefftYO3|?A;hS%myH|t;k8tW;)BkdGh^IMxy|J%DzMczAWU}(HB3>xGBG8YhZ&}JM2)&8YnYk6??+CPX}+EhG4_HZL%Ps#&xqb zmoUBMX>oj_z^RVujnDyn$5bm2x7~PL0Y^xdnoSVB(8TuUzFJ`Xn9XnKFI7mSY7fko{3^=#- z@>S*VZGU3eJ_gF!6-hGNTXqi7%>zO|*E|BG)A60#>@DdGgTVPvSFV(aNbZQMoHFNJ z(%KmTvm!UR1x1iZzS>62{5^^pOex0YKV&5EbS8NDgT;6DTP;o2>BOZnFe&H(fppuy zh^&YyKp$STb1xuKCC>BW%OnsFmdXC^6eL_g6eB!}(~6FZS7` ze8t^NVJr&Zvw-vmYR%E`9L301qpdu0IJ)s8Cab-E$e+3{ZE9YA{9R@FMtcC0hwB*} z1erp2m8gGOPeYgc1uR6yjWp`At4GRQoIHL1VW}4%I1>(hYmn@4H(|Se##6$qwOSjw z5(e5byub6`_9JiTwEyxip#279C!h}kf(Kty`_0rdaX)#`Eq8hUZe7d+mio>V@?F3Q zN0cA%-{eaEr*PhXCG7vpP(<^8Q}(}0*wHWG<5E=RzB#kwoxc3*mC@;4IC=KnSWf56 zhr$~5pAqUS6gX8_RMZ3*SYR7OrJCtx3mUD`1vblH---UA5Xc=Su8Cj5__JoTI0B^G zGC!$md`Afyo>mZU)FX|k7vZv9u<5LW`JD3tIHY(oUj?WC@AU{gM%3_?IpjH{8>6Ch zJqT(bZV@m{&^CX*Qf$5=Spm*(6+9J@_~$Z+{AIjcjE~*LRNOkVA|;dm42*lTvhir_ z+ChV&B?xi zW2>-RP^FwUHnW*^B007zas!P2Er8EXNx?hSV)GLuu%S-`8Pf9jUnZ3N9yh( zrMqyiGzVay6z-u!AVU`^GKD}hBhic!_CxOb6Ic}|8*3+kB#hW`5jKm+BjDd^Zw0 zA|&Fz&eeyCU)eZxlJVWrT7O^wik1QTu!kSYfh%7)X72tBg*VgVu^0ZO`_V^{XH46R zY8@$Wf$>^0;hBfBs_1mw?sl(NFi7Yp`zrk z%h}at^&N$gNg08Op{~jZsz&UWzJuu8sGf@JN1Xz{dPisX)pv%HCp}Y*NE!hcJveKU zxHwhI%ddYHBv|EeVPD7Xk>4Tg{xV9Q#jJs0Yw!YKIv^}r`kBEcVSlr4&q@q4s+e71 zuoYtj;%>A2Y?LR@>*v774vP-rvdJVv0_r&bo+go@<7Gbdw1?H!F_N%qL6F`k+d@7xq`_fL1mXN}2 zAvM+v7ie1EG|DKJ`aILlTdQZk7afqRCcB=;%;2(3QHwgCyr}rj4@B`wB1OlXe%ge*EKhBD;LFWyJ9(q0z zsyX}M32UZ@VpI=p2N!U1G2om-AAEVHoXNv3uqq0*_Swbjx;3BYnx)4K`ag~RxKk;pE@yUe|FAv``KvMG*;Aato)qwvUr3L=8S8u5dr-#>pFh2f^ zE0Vy2b<@D3_}Wx(!<%3ZGPcoFz(-m|^AuT;1?4T*dE*9ComxMMt*~v2ChdfBV8fJ1 z5Iik2TDe3tnPR&26OB?%YYxI0sjmtQ)Y~V`d+6n0=${0*;pc;L*Fu^`?4mt(zp@9+ zJvH?|7?Wz;Tw)Bb*Q3Kd17KDlr4S8$S1qsjY`;qS>Tvysd3xqeN*Te7v@aVnViwVy z7yxs8lAb3Ml#v^T&+uyVKi(>mY3xdW#ZG+-OZTU_dHLX*>mpDV0-Etcf+{q?Z=?3& z=v#Jju}Kgt|A%C8O3D+bvs8ns+mtvkBMhojkbc2-uS|*k62ECo7roLkoMzEI6tC>g zW#rIa9<%Zld}c=A`WOT71=VFki`VY$dRq0Z2kU~`BjgkQbU-#f+!}ok5$hrr|G^qr=!8}m^0)y)T7NV3}KF-HDH-e(z zLsp%GjKY&0Zk@nw$dpE5G;|}W2;Ti0K$?L@?8j)eV#5!8Aq)AHJ`v-pvyCV#t7 zw~w-2AGSC;sRBq(@rm@bIlmaig?XGj7#hI_g*0_pr&3nJ9kP0GZpDY460?Eai~>A9 z18w(rM3%qS~d5(x0Pp=pZ2Io z6t4Ho=*{3$UL-!y8ZE~4li#626*mvF%nOy->b-jH^&jJ=kJ7^8M^(8w&6MV;7R8g_ zxIq}`nf0)k^=CKq-$^Fc^yJCaQyoo{qji~LKkgf;6ht^w1I)kBTwHssvk)88Z0pYh zv7v4%?eLspw(tX-SI>gnmGBRXb}+xg*n(T|{`tZk28(e{&^0aSZ)y_^`=XE_AEG!9 zL(ydl;uoM9Hy2Q5D41O-D03-$KXJ1De%*(>%B>Blb@484cPy34#%~V@bp(?5JW>rN zVztASLj(^`pV3q9Y_SE>i`r$*t^{U?Z|rdb%OVHMITl4F?l1W5sN4)xV`p{yTRqt1 z!B&t5lYectb*ufx3jD>g;Iclw8?pF_Cx^DaO2MKRnBJ^zU1Lp)A4rytVX9}JNe)n4 z1PH4=ezw^Zs)JJe{fDiV0;lJf=E~4FieU|UI(i9d4t@X(YW%2YL7})ND41B1G581B zav*R=RK;egEDMndxs#f}bpl`x;AqXWi4GrPnFmjs5;uP=+A;Y2Jqx!lwh@Wp#Kx;X zya%=kWF!x9i(2@Pzxj(1pndpm)46cXyRJV|KirKWbMN~vThP_{5=wBM?;un9Wldj` zHubt07qUcN1k5LgoN+9fB{A?p33bTmkc#<(Gv+WpB)!5Hc)^5-Y{N> zJ(=}W>xv!->^>02gCy@em>-HG&z7<#ri45c=woo%brz{VcD%hI8u`+ zWYo~Lfyq{5z{`fz<^8fPP(chemH00hg=2kagdMepz+LvEg}HZ zdXfOT=VfV&{N&C}QG6hX@)5P|qJgK2i|qMd#7m5EJb4SS@3CQ?QE0p zCqGqfeObdWG%*c5J=}I3MBfbe$dOp3{~?8X;h-X!{ksBe2A+&r%7wuC4T|(8=?1;6 zDM z&+vQ3XFkk2#9!%9y9JqS2EwjIvBl8hW2VmadXtmUnFZx#) z6y_za*8kKT>Rm~d<}I%>1q&@4j;4KJ1zcgRQ>OZ+PSd-NQQIz`hNqc` zTgMIg^4J-9}YIf>3|))%dq0Vy^n9UKYYg_`j>{D2OhK#h?~HIlYCA^6&Gsd zLq|LAtG(drw3{$YC}MiO;qh6?1z00AIDTd9)UVqGr=rx)GV2w@#%S+VB1hAX$+VgI zW4}lkSSn=(9Br*XQmXh2uMIV#WmZ7gg+_R*lr5)_p4B~EG(9s+2>3}EpeE-XN`ori zzgtYWwV6)*n^6%8WrIAkj^liR(>{NTYF2;%Tz3S>X;_sxtWfF4a$NCh$IxV|?1Wh4 z;2W%ecod^|(&}6Ph4@b)5+dnl!xzIW-d%0%)h$v$he~9`O084r@ z2*e@Dv5Dnlb{YNP+;|?a`)unDozHC>&O=?lZDoxL78PJF)lWud)R24`I7u0PBUihr zrX61?;^?1}XV^!HifGdn|Awc*Lrwv=i&kK;R=&C?!(|@Hm^34@{gtlH(xLY~W3TeRmT*02`DFno536}}>c$8C`WtlwIqV0agf&{WB|ez#vUWwcNyu zX!?;2sqayvQJy^$g!CKr@;~g#0z`#;01W4072O&^m1znKr^_U{Y0RuAAtBr6-^aYA zwz%r!^bz-^-U=8PX2V|28a*U>`Ci<@x@YtK&(f>2(P_yRZz2Q(#=R1-54<9-2rM_m zN!IeKkA+00p1PIkWOd5&iytEoBbVNxBg_B|Yc$*NzUcXx z{CX9DL6a=%{>}e#%?v91p>r=6D1I{~Uk~@awsl_gf{oKFV(1;H(;!0zd%F9U$wg~p z=mm9HnM64+OT|>-xq|x-W#*`+YKczcW&JJc9Ubw!cL%UhTJSt>l?#nIsB(heGNrlgbLw?15v4A+*tg19 zlP^*641;!(d=T~+_Vp^{MC0Dyp`BP$$SWD$b>rUfk*1)t>GxPy2WVc>eBvnaSmGKA zmS|%0o%M+a&U|SvM(A!oy#x}8(C4pZDU}lej`AP36$4RZ!R;@IgjxCM3qN^#x=aij zcc-^RT|(;09wAkRrKtgR?Lg8nv_wcW;wArHK`Hjg z=8uGnH+DQqVK21_3{3}l`}rQ@$wN_q>NH&7n~>JPh4Pi z_&YiAjcst1*r~cb+y3Sxg!?xcHFNa*3(5eAd^_^e5*Dcm_ zp`+|%^^(?ese{zPuSmS3itNd=Vn(MY$P;D*#yp#j?Vj7D42b$_CKp?U8;A)sU2w6`$CG=`NPcj-75f*>@`Srb?)JNTb9WvBYGDD zEQ}9{f6?dQs1>K)0VfA#0BvQ{qo@KM zcn$k$hw#HMo&26-A;dy@*7!Bt`E=(R0g$aU<^TDJF~pdo3q}zF!1O@a+-g}W z0xS{+(JSJ+XKcDW<|a+8>s&du?^S2G-?DxHU{E!5BmVGO_w^0d560CO5(I<{6^#-f ztqQ(fQQTtCKS7~r0Sf$T}ZTbYf`BrK-)$}xX8`4V8ZXdFO@o0CaOV(ha4##?~t z?2uz~9W9SV;dU_`R|L9XN;)DM2of*TXzn>LB7>cR5dec4+;92ZurX@;-4+`iFPVAr zqljred=d;YVpy|@2WF^h02m=S+MQU$mqyDEl%MGPd@c3IJ$bL`Im9$qqNs1@*LL_o z71kQ5QbKkIU|3K5H375h*BF;nK)dsun-B# zAtNjKip#XD0{`o*c*kN=Iu!;9=lc2&rk681&~ylB&akY~{+Ffa8vfX6f3ZT_dh6(} zaD+Vr&YePr!!{O8fz%GpCr!#o!a45OZ!|lNw^BIMkP>|S>+96XmpAtZ^^gM54M+uRRD4C&}1|yixECesZv-+&VR8Gg_Zs1IX|BXZ-cfGGBOLA!Jys-$hWNH z*E)iR2@3DzoQ2D%>8ISAPcy?rRkP}P*F}E;*Cz=M7mDtCYCuEyz<2$bg2co{Ev`w3 ztQlqzwc4_APCX42W!{6Zu#FfwT6t3QFX}G}#*~5|9skVR|GBh9km|@xs67Uw<)B{L zsL?305^L3+(OMi;6cW$+^iFq{gmPoCxsFVUR8vq_<^o5Ho1Eil{W(kBvMmK~YzlMs zmdtLsf1I|r+2LD@W~>JQiv?k+d@rQNPYH!B?=(6Jya)@IP(;{XVYasR+{JdMy>$d& zOdu>hLceP6f0H6H1Y9bMK#5G8Ji=g}rgNX1uQ1Z+S)O|YmX@32l zNbE&fcP`0ZsLK2!9c;3YcbtbFVuJd$s{qv!1?COFZ%sWt#_Qkz%q%Mp=a+0_^S3S! zbT((PE#h|FXUk&CGyIIn!0g<Y~RkgYRUa1 zq0HnTLe|dAnoITILJv!G`qGp<=bza4 zp4EX`gJ%SMpnjGDN@rJ{I(4M=$l~>)!*}9_)sKJzzG4wDn(qMd&~?S$Q{!F#`G$rOzU z53Nl})sNG>GH0jtHK^c1^+H9C=`Gnx*|8mQdb6a5$FB~-AHzEKnGDBNwX#_lc>oxY zf(c4hf+BlZB^CL<<4PIJGmFjCk~Z_5Y-3B+2VZ^36B+@`PCuUnSM9TRuqa{!HV7I% zT`EYmU&%fRxpps1oD^F5$R0_n<8oaiK@3_4xB=s#nr+rq=ngl5Xus}F%uh;nsqxX( z=(E5kOe-!acn?Ea`)U>q6$>Q$wEn2ZUxvM=iRS3ff9ss3J%vN2KIT>_V%6{= zj^fmItKVe+Ipr)?%2joMuVZy@f@y8Y0`PY6d#NlW9(ueq|~ewAle4Ri$%1|BaJ zC&V#^*dY_I0Kqn&d7hpw;~jfl>orX472mYZLb6p*0LPI^`KlM0@w9M3k8$Al@cU?h1ktw*^H}w@xW)pl_@HA8Ck-|9aWjpcX5Ji zy7mA8V1i903j#i;j=1!ck#he=?>v<5iaA6a9@wiz>^JehsfZ&dz=UZ8H(cb$7_oMx zQGi+bk`hHSWK~bfW`M|dPw8L+8r3KY&9IUbKyy%M?pvLN&Pwp>&AJACRz zoJj*9Rg3*ss;<6vvXva1xAf`r>|M4VdX_4uulRwkNVV=a93(FtBo$~tUTY2hw@$96 zqmcodpF@kG6C5(zUj=v5DY1J?Ak0+wFY!@9ZrpWqQto~3=$fT3S4CiMuN#FS6n)H0 z>G&D%mnCuz;E=a|3RCEh+bBei(p=TTG-NkNJ&l~C{_=|HYPhhafQ;Dkv=2Pz*X(j;)R^usQ z5xu{Iyj0#mNlDS>q2S6&p0NDSTw=}WYK`x6g1@2aAD^NNC^i}2xxPH=@Z|{zo*?1y zH_PfgX^(nYF8)g74d0{=z=8b0gQkA_QJa%5$me)Ivp43@4>c9ra7}==USxW?TobwD z@V}3dy)($SKeI&PFa4E;!({w*<^WsHP5^HeSA>>897PxaQ~9s%oWvK-SG0ngO8up0 zI$NKtt87b4KYwvNpO!}%rw+G_Qqmg+q!?wPBcq(DKcZ^nyI;cYN_@0pv#!j|pZ~6# z@c-eqRSXIc+)u$ChD?Jt9txX@oO&N3r00$|qATXdyteV}sfp8?h3g{0YKm&$R*cN~ zU*?RzspO$x(fH{<5MVW2eTBRt`38khrSWnO>M_^=aVAKOYR_eKz6foEZ^a%c&vc+l zIyl;Xf!csx z;6|+3q~zr~j`~KZUpL$47?Wbol;n`%kz*8)W8@1JdIhrKYGLP!&T(v zbQxC`_(-5Wh@d5hRr3c^Y)Qwa`!k&rE$v23pDkyWGy6VwVYlyK#T_t85Ap%IW^x8y zWBppm-5Y&aL&1FKHd;s^49il;bC!G51b~4?07&d7ZiBW`q-x(SdQz-e{M@yVBQix2*47#y#U16!zSeqq^2C$sUR6&yoCjDK9v=@x^6u^+(z!kc|i< z{NyrChRI&qzDRoT)}ec5Bi)v5lqHgayB_Ibu9Nx>&elf-2y?W8g~0hcIpJVs+yrUh zS4{10eDB&~$&zk!geP1Ol_zGO0)`XEw+7{U#O42ovbPG$s%zUu=?3YNPH6#2=@bwU z5b5rgzEQdxN$KuJN?J-9>F!ioKswf(H_!X8?Qj1)Mvtq5t5Toxl050GYFe$j_{+hd zGJB@#de`63MNPT$*#G(#W1no;wRX@kzV1iTfpvj=wt1**7YpLNla2Q&NZjV+h9Lsa zgCIkjJ6!A?>e(iYjK|bK&+}7laq$MMFL@s5Le8txm?>P(fLhi;FL-F)ziyQz`wahx z^7p_cx$pk<`-V9|=kck3UwD9(F@Q{$mhYpkS)=9{`;W!-@CVq$dK)J6qTd5OE!5Q* zOJSfk2~EM~TrGy9Zh^~-hVN}@Gx}f*|5XYi$zifdj>x=zoCivn@Zib>N3AJt3JWwY z;GT~PW7Kb@hQbZB%8n9_Xe?UX_2vV9Lm_~n0?rXvch7jCS=_3Cm=NplZw!tb=w>? zwBGhv&;)b+bNZdsT|RI!0VmUEp4kdV8DFbX0(LQqYV_7L=x4H z>lS99!MDQdRbqmff{+i&tEP~2#7R6vt#4*#ymtp=8=GCPn65?YN@=VaPg+UliZTH9 z2vydzso9A$@N6-XuGE&P;0oaFL}e?uHf1i z_rfB3BBn+Z+7@ZCtnaNRVU5=*yL3bV7&JTb`+0&CW3r(9uaB<{jxEW&bi*uv8)aSd ze>ln>`pEzq0HMliZ)O_%_Tk)46=BAEOuebZ*}kDX#dL|~+9Ax<0QA=Y>;*vM4v@wV zJmY5zb$zLX|5YZ8_|Fa{nw}fv_OCokuiE_RRFcThF%C%E|FuTkc*nTgc#m~T?XX(0 zTR>__UJlRw-tP`gEMpn>U2_WX*bvA8VMSUBa#TMY)AzG#fe1~+w>kI^Gjd<`_T8)? zhySb}g7QK)CQzUj6>{QpHcY%-&mq+$L{XbLgd=lTeY!CiPxFe(93^ECEOFou>b7^i z=Rqy)HM7z)wz6;iqpLN=%pHsA1I!p!0xid@06j_nN$yF2Me_e$&S4^ZVc*b~IS>z- zxj(UwGBSFLNQdDr@je#Q0s$L*D=-igSO!#00Y$7!RyQtq?GG37aPPlcbG`W)_4<(W zT=t7(_I|YannXmU5kAT!(S0Y zj6bmn#QXIL@(9S&4F8j-i8uQ$^)Zxd5u%ekxGh-%5@|&HwWXsLN>t1r-#J7A%Y&9~ zVGA%wYCCq{587%WHDO|zqZ64#cqs_K(`@S4{G&h&I6i1r4fpNt$-=Xr-I#{dGvj;p zJe@X780Vb4E8lF){pd!kf7EJ{Ut*)Qpu8_{ns?k3Cu zuz2uei1WuFnzvR3n-QO9d?x`UW~@=5AZf&a;wE8vz5{46{;$7iOqsUaFbk4RfV7a+ z%}YwWn6yvBS`lbFAzN&?1@8fF9QVYHmHElL_nU;Q+};DN3>3Y6u3C_q5@0hBLJSHi zUUb%jd=ttKwG#<$-#M{S21~ECNjtZev^Tv>A!4b|_?Vn=Eoh1k@=d7G&g_%-_fRd^ z1UaH^=5?}&uoh-h)#zvY(g17N2h?2EqWhVz zU=%U|{%eOm^ORr90E`lZ#eH8-BmEum_^%Z6dhy}x{c9Lr3{96zOp4fr(W5XV045E> z5}P*?(2 zZu|zOWd)~grjC&aWq2XaaNr)buq0E1_C4#t%O!UEU;cLy$Yu=ygBk|9mYz2kevlk_ zM@m}KOJvy4Xe8FW9RhxC1#q-UyMy55J@tU^GJD-HQa@QM$(^bEOjUyD zOhShF*WUp!Xh!mKZ(EtisG-%gZvwu{nVv2TP90N+DD6ByQt<-*oG<`G1xH)0504eb zV$%Mz91)?5LqDoqK|Gy8Y6dCn^|P~gTm)baAnaiBBYBx)bZOwW-iWlro7K{)Y2o5DwwV@rhaG^=F+rXZ0z@s6(F%;|x5z5s&vn2hRdm7(U1*`AO z8TY(0ZRru&?JEEi24Unk$nh2^ByAo@E1W}hPEoJC9>2b6NA|rtmTsVn0NvI00DFN3 zdL&Yz;|;K8prj_4lzzaJyMNBj1a#1P0DFNDvkbdi86HPq?S}R*z91asWAa^79b|ZZ zAI{21U$KAy=LuNt0h~qvpWg7XMHN294Gi@`=Ec7#aU#Qt9IH<_N++GNIJ#HMCu;NjJ5=oT! zM(WkdE+*vJFn$(b>x5wjU+AdB^5@L$ix9^;k-dd*Nt{D=aZ;z+P8BPH_xp2}XaEch zsd8ET_OUwVh7xa+rU&))Qf5au0+Q*w+Q+xB54LiR4t9lrHv@#7YxZ0i$#CZG5p%T9 z(Qf6xZ0h@!S8y@CeDV)g?HkVHH92?}n~MvkY+@D#EV&k*#4cB*Nw_pGh62~ieT#O~ ze`5oAtU`c&0WcvY!E#)cGU0~^6r-RNSdk99=s1J@a zASsFDN^+B#yD^XM5CX{*Er@%zg}0b}aLVs=IPb`Egp24Gl<-Po`mKTP+J4X1BO<_1 zoB%Zwl9PQqiJDOu)|CtEGYjNAqKjib`-M-@w&fiFhZYOE9ANUFY7s8Qzz~KkYPX+e z(9?4y>8&&#Pg(5F!PZe#5y?HgL*?X+MTgJ?G8e0-J8FpTD=I6MzE9E~5+&BCV*GxD zESy`uf&ttGFKGKMWO&4+|8+ISE}52L#ytP(D*?)z1pd7bBad`j#S=i09Sni5fZf2+ z#WRT((Z5T;QMq>y0XJ)A)#KlX)1i4p-g4qI6pS?_ehE|$pa2jVB7|YkT-PYeY9K;nQ+!JVdoH*3r5}&=XloumakKSm+5b8yn?fkS@=0r*k^*PR=MfO-#DV z5R(v{keoZf{c3>c#~PY+AUhnq8ovJFL|!)0lK`@H5a!zpx1vLc{--J(Jm*00y|8z7 z*D`saN`4}Z=*Y&X3=6NVJQ>H8CAQ*2&OnxqZ32pS04byV-_fKik;Qu8tkWsSkO{6) zq?13`>Rogg$fL-FNx8!y!Xh9*bzs3FL;uH;X+ldqt7e#w?F_lqp)!F+7B*88Sj9U< zpP-K6Ca6s9`d^(713;#p{GW~5FpyF){r@aeC%s10{r0dlQNySoqMv%;qI$C)=UN3z z*VE65NOkJY56INH|C6c3k;WXDIEB;7Z#tj!;?XXwzs;=>ga$5N7|7#bcy!ub>r2 zRYJQR!jX4ecT;tyk2#umS@hb<7J$WoF!yvERLzH}}ge*iY zt;E`(84Bv|he-Vk%g4SoM>DZ>wKv;`t9Q(OHl7gut1c*7fI2D#fJuO(`IJ7ptjghf z-^XSAV6N`P;j%|re#7{AoJI{*g8O}oLny17I(C$-rjl}X)iP_wBY_M(+{5n$LOCLd6}X{E4Z=MmistzVRhY-)0t<)`PpY(m!PndQk{3MbN$) z`n(nf=nMuWjj4NDHVIw!sqrgk-k*g(j_aD8IKV7Kp%mh`NL8>w>rF!?z09POzsj12 zsji-;TM)8ZWw_|;Osr&-KmWLeBjI>JTEPt-Udy59@3)6ab)<&etT4IUt<8gpV#+ZV z)5z+9{S7OV04xuLwXOd6WHg2dSL_rjf*u(x^}JVWc;U@s1QnJhj5NF#Akd(INjs3v z2wdHOGT0Y^{*aZWQF$M^E7>-8adZ+~jCqFj`BYHw0c%7FWOYCXCwib6P5tHw9|;Z-#sn~<`TnG zC(jauri7W#PUn69P_#2SK7Rl630xaU#vr%c-wfo0_3)1^tJ0LeBq*og>R?*Jxw_P9rTeS-3xAbllKW#(I@Szqd-fyTKauoD^# z)&B(Quau$L9ez&CLfX@$=#|_aza6uhIbJQKmYdQ+LKlnA0fE}<=>^hYq6fD}O7yTf z)EL<43A~I8OtJdg#+1!e;%)jdSr?ccAque9Y*RtF_+?YYAXBaiJ}w8P+5MMsRhucu z*wv#;O~LKX?~?)Ycm^Kit3$KYrjLY|+$x-q1~m`(!@4?)1-S$TljdC*7=<66R69TP#Sd~~`dEw&jn zx#665bOj!VTYCfVeUXZlfC;TnO)kq(MI7h^X`;hWjE2cwSuMkjylvp#cwfhgfZifr z@F93?Zo@p7)QO4?7D~dE+RU=82Mcygs@W{w)`d}Jfvp00pIr zbEGp?aJKT1yS_74ic4Jk9zf;tQ?ap>6BOIin z2yYHQ2zpjj!F^V<frPl=#93qEGRZFNv+0NCLE zYZ)}GgcoeLSs1HPfv`qZUenj&EyXbWYpKoFiv3deIuWFK+Q153#tAUT`#Uz~mk%?4 zr>w#YEpwqeD!6=2{N%{=RUf712qqsyP2$5vVkm}kM0~P2lV8^UsxQV;xgFTedc1#G zou@Do@?THgX&Cph-K;-UadwMzl1#ojwLTEnBp~&;7hmCx@x3T&GQ$7bsW^{F2YFI; zk+tJdcT4*DBs{XOGUxq~y4BUW3QTu_R!LMtg51406^(C@nd%!3mmlR6-?5{ZuwEU% z%st3_hx8$$9npTe~aBCf}IbC=Wk|y~0%nr~o-Z z3Mjmxzn|dNBVWgp+9`@sx4AsQ(B$KfHC+~2z>7CJ;zM>%!x=H zoNJWl_Dc%s3=)r*XPR5-c|-0%D$oq#$e!tRQ6KoqTA4f?TKie01<_kR)9vl)#IGq7 zE`J9m`Q(By>Nz@|Ppu@RHgU1nt#HRiMHI@$MAXhSUnBjN>;6swFmLdb>96u*Hs?&v zs93S)F8jxd0#+BYl=neD|pDl$CX zaoD3Jj$1dt3mgQ_Dfp-O?Ln?wDl#|I+qFzi&MniGv(xRW+)lPTHhJ?XU`|{RrY|gi zq1zPx$7fZ`y1xPL-S;iw9kh2LIS=~Z0{?Yp0x&cvy9FYslPwGB4qOmkv-}auIy*M) zAfF(u`MjnS+zw}%nZ>8-3XnVBCvxXxH(Oyd9t3kO#NQR!Ck|9ir*~&jZ%(XeWA1{B zdsYP%9)^~3Y z;?VyRo7$y)01n0x{JQam9NDPSPOk_QU!vC?zW1uZ*MC%+C&V!lCB~o71H)PAfEhiL zWZ0W_)krtn)U;uca}=ybkHRTyiNzRESi6gK0)Ubqut4MhH!L^1 zJN~>a{J&=-CTBxNUk{l+E>busqxsK?XQYu$v3rcvbu3kOBQ1}c0&;Ze|K#X0p`omo z#rPUG#wS^taeGL7InPQ;OyDJuSX)u+-TncLA`U#^=0YqBT^dFIz?r6`w_?h8{jm(X z%XYPLEAn>ts(hosZlNaZw(Q{sxL#ztDe`Ign_nd@x?~FhHD7(crEku>6Bcd(U{G;; zv@oM4X>B15uKIbYkw5i)txusi>RB1h7>#Y7Tgm|ddjU>5hCQGKw0GJq(o7iyHmqw;$b(NXl_dZp z1xMRleSvkQPAN^*9qA#87j!cm;u-g25Y>NRoosA5Zv}vnfv_vHLh{?qR4Jw9Zb_k7 z3;GS>F3j85=fjhd2Rjinpd8KqBs8R8_VIuAIn3^9;|@6Et$wdZ^m`jwjMRYn-Ex_@ z6gS{Bg;97C8Ym`ZHCk(h*G*JM#AM4?7*5Z{6RZGRQE4kQ=Q$kP|vpO?$@U8G%`EHYuf9@^f$hHn;I z6RFT`Xqs=P0hkNP2uP(^Ey&!}O|dA?2~r$k{|vp}%xEGhpBBm5zvv zdlEC|qvsA>IucO;MocLVMuS#aPfXE1uBG0Bbizw;TBuGa4AZo5T+H$1?iq9 zcY;a1Al5M;^n%CwJcSTA8QK3t8c2#16K$B8&B$N%WD{DiM?TqaT5>vF9?|xlM3#*YcU=!Z3nf9QcZ~AeWwCt6(kGXP#?j51@Ofi% zV{Db%=I64k3)0WparOMiET|rQA6T$~@;{j1`Dr5B_?{*<3Qy0logn<2H`Gy~_*{L> z5@_9~)JwE~1}rcFglVIxdo#o)iE}eNZwfaWT;8L&6A`C1kCJ3u@WB5Jct*f98iT%+ zxULP8e5u_s58?aAp9wj8yWzT;^VSFS$bVdCL6P-2czDhvgw?D_XQ|0lg*a!K(SOjH zKBQCN{|lCjriHu+2gUBE@FoaTnO|g_-!Cy`+`L0!k|>qD`S(9c#a|;$`(F>Jft3rO zbyGgkL6rLB$%58Br2iOYEOhDD<@r>!xyy6lnh)AvQ37iN3it(W{A3wQxk4=)%z0Pu za-tjNDN6 zZETGcbt_s1ggj6}YWz{$GM4-^+!tjd^X+k8Brn% zL-1c21d17cUyyP!!_feI<^2<18MB5nKjstUseX6T^swXb;yn87B0ZL1rSNkyJ?A+i z_%TwzeN2jxn7P#6eb?ta+$dqAFx_jY zp=|5O(BkDJ0~k)C(P8c)!~KUMAj&!%Ox{@%rzk+LV^-RA4ms87OcRD}FyHxeNT482 zqN`0b{u8KPc7O!g%{ZdKbn{aT^lj00^+=2^OP!r7^O?M1Hf#b^U%j zVVY#r#(Gx0Mis>YHXY?UK!%`BqGP}AdcOD8m=^vXuk&Xk0zT&}W+J81ftplV0tiR~ zvccQHjipp`YKTA`#gZ@-kr&a@f1YvK0BcB#+aHleUkDmNhJb@}A*og5Q%Ch93ip zm8Sq%pd{dgbn6q0Oxj*M8m-)&BUWVDpEc|Ul{iiCO-8(@m79ctK53HRO|fYUn;siB zox~f%Rvr&Tn>-__(fBnog<@LbNV=fgr}gRI@v01W6~{8Y*# zRXPHueUd~se&?-0Zg#x#e2SWI%hL+ohz)VlG%<=04D_M6m^;K{Ll_VsDi^^z}modsWyeV zDM}s~0LOQIdG)2efDJenI6#P=f_82>{7;Dfe*qqr4~0kn_cX-RX&kIKT>OSup03$2 z*gwA%b5^K+{oS!D-a{{BgvS~M2+=@?5LBqUc;@z%wn~_)q>s9x>V9rlnXe^6gWmA) z+sMK?DYYt)%W8qQyWoSGNYwg+R`)w0UIR7Cjwn3E<{|Ou6+{W{FTpD?BFGYiZD5lk z(L8GpFzM9|U#`0AIfO5Rr>P!gFqRGs?Ti`*V9@y7n^RSyag-!3f%h@u!A1<&E+vsJ zZ&KZdjC_)H981&znBbG3nua$EL|rO3Z&M#0Bw`4yvkZMN(viTip^RYQV=`IR2AGBT z6SE+={8FnVZ{NcGsl7se6r0e*Mj1wDQ|7*N;(HhMFpD9!?X-W zvlIO0tF0}SkD-b+lz%i+I@HM9of#`C6PWExV@0i%@?6sxonmexUW|nXK7%UOIN*MM zHfG9{@4v*X_z>&5Y&gqrH{^WZ>Rih=Y+9m!`WFmwAp&4711GMvKQhf@ku8@PYdL;; zG01n&cTdrp|XpueTwNDlC*G|oztPcIbKUcT-L{rrbYKK2^wtKm*dUHt_%c- zJ~XCpgk6+RBbk3~slK{*Ypyuu#FvAM01i`5K*JzXU{>!IEeIuaKZe#~ zCpn74ynT8I|Ge--_PXPY7#H9~suOS%wwZLDUYBo#5Lfa>!rK5ISC6M7KFFdgw`q@V zU>S1RdeDAfDrWVI+xX>>W`z6u;Gu;c@FAFj2Y1M#oh!wDWOJY~Bf#*#5d~mCDk*5}N+;>X)U(#|3q7c-w}2H4 zi7Q~}7WJb(jF`_9I0+OU1&9I-!7B_HS6GXOJ*3V(&vep|hyeGW&0E$~-#?7py%ihn zAE9=oC1Mj>m9<>8cn8#J3`Bx3YV-5Yj41kvu&8#n2_{8%O33ow{BezG5J2vH&-MV! zANmx!&&2Us-!6!1G}NH_i#^F(kM{-wrjO8_d;+;) zAxc}{Dnfo317m~q!*TWOPq)B~;0gmL$0e>mNG>{oJPD~xcRN{aL#|HG{S?Z7jlPYY z=IAq4vaVnB|4RmwO<)dYCFVb6CF(9!E<38#8ILkb9R!=mQfGA&uzuy7WLfhVWna1d z3xit3B?=3%<@sGvFs-y8wpNb1E;W&3j>Yf)7m=zg7ly@)v=nN?bpYkRkFKz2yQ$=) zhr%4#7@Oi`=hA(xU!zD5XpbdR8Ov~ieNcg?;_58D}EenYp<~0LF?8K>heZMJ&#hFGW)<`@VDED=)Kti5g3yJzF)A zj>PFKi8Td*g7T*`lW(2nynqY-nE5u}HhO2b7yz>aVa4=x zY<5#$d_4mf5oYKngUU8|zsBG!^L@WlNpLVP0ASDr;0^|-dzuPpK2vz2 zLOXi#-|-30{rqaRuNLzr_)d+%>*25fu+`QlD)jTax-^;~of&tsRl{N} zU-4x#`5`%i7&Xsu_KO5WDe#v;El+*Mx;7))!>2)&wd9?x@#41!SY${K5QH@Z^uaNYeB$KfibH~o!q5n1CDH_6 z!yZJ;${)CCpT}+D@LS!B=;8I)WLN>Yk|{7Q%U)4$)PH8$r4F;hcGQ1gPcN~<5M(!> zt#R`GF?|R7M&gD3Ex-pvfa)EP zzX=85!OR!3Fc)EIZq-p1sNv;JQ#8_v77vt^#0Cn$sks5H6q^2Vc9bme%qn*3#lyqK zHmUvT+mKxCh}g9pzLvU0V+ss_lXd~x8bBU1;Q4Pj;k6%0Gu0bElijWFnqK?d)9N(L z^3E80Ra-)UjED^k7bLmAS5iWA;&02w&WUe3@P%2GztqcjZ}K)f(+5sc2%*A^KNWuF z?=1+2DIQQ-DiUK&LhU<~g}sgEgUeq1D?f?zb3+15f&vDXUe zy?W+qtta@?E`FV&Tn}##C`^6@qGVQ7I)y8P@nd~bDG6&oy+i26WEJTW5Df{k4~8pq zEO|2U%UX^Yb!@hvt!KaVrQQl3#?_9yFNQtPJE{F;r)5G1dQmXI(X}kAzQ3da}yGMh(5=Yq#2vI=Ktr$ z5owAk08F8B1hxw?Al8DzzI;51^kVaGigG|svyoZQeVs6bz0WL>>AyJyDWqAE0E`2iG%ma{owMp?$QKs5 zxP%+!i!ZN~x2n@)bB>dDkbjEAfM!w9`{C1IIngk znqm7!Fy}pt8aUe5Wk98wk9wtm+V#_5EYhUIDf)Ik+~oL8%@RCuBNb3d_{p)Ht7pV0 zbcj57TujDch$U&^7t8HOnG#X*3X>~?29*U^94K8vnig9Gd^%@ND7@u)YKq|-uMR$) z;q;Dv9u$~A4EF`YCNcg;2!@TX%oE!E1E|Gb-GBYVp8G*i9sQ8lis+efrCO6_B|r$! zpUgIskF75$)%%+ptM=#KK9AE-=s+?~zPmAfwK!(uw&)1n8Z$We<^#%~{PmRi)Hn=)LBpsIU+=QjH{I~a z8_@)Cp8b7}8fm9fZopCGv8xu6u#fj-Y5gbFjCD6)?(~h@kRn=gFM0SB)_jiO;twj$i@0NQG7q@Xvk^_7vHQMF z??DwI1n@rIoZMnL1s63DxCUIr(;BgSGw|1Lo=~p1s))c5+wudyb=b5RaAP>)Evvz8doR+E< z_PlzlYu$kykqX@?;K*_#kpXyuXzZ&n5SO~VHO(r11;4ZS5#=rM${`3nxfe~mV%T)h zKf=ojV9(S~d#WL+;=*Vl`&{?i^(OxZs#A$bx6KvDBXri_eRy`5$!l*E)xS?6IlmHgU1`ZdZ zRjH!n57&q79W#y4#BBOmjsP!sjYWRP>(l1$rXv6Y{iTp(s;orBr8??YSmf87xSs-R z)OvS$28*-E$r$Sn{6G;1T5IE5%(omjKR2^b1J3-7i_NRb+}APkeJu_5!xpwvzB&L5 z3`>C2Vx-}=>sh1q*Laa@sDc!UZ4IF9>V)>CB9!V z{aX*FKe~Za{>C9S>I%~LF8NqTc9xA}$KanGvS7X+c{WL)EBH|lfT@G9>zI4b-6;YR zDH@VY%|~9GV`5gT;)VJ2HAe+1RBmSgM)-8CQx;Saw+l_3S8?d|8kznf`r!e_TwbLW zWE@;pI6r}Fg#)e?kXW)%4^Cjl3({>h_yRqeZR+@DH^-Y7ZH$lITX6sv*H>jYE+ zfwo4>!nG^ECa^dr$u?Is}|;;(WD%xV5vLctc@-Qkv#Fnf_r=OuUT^4eZIbORx*@?L=@*7n9Lim z0&*mnCGKMW$kLZrKA;zjF}Mz$nO?`EaTv*RBkGbL;O{(ArLpC1Fqk>@X@{2u7;4RVoiIhz?CGnaqkR4o3% zC_0hvSZk7>vXu8Nb7mY=qs9Rj7rG3Km>mldP+N!ht9!VI6f2>eWJ^m@F|;5x*EaqJJOT(cpfxxJl1S->zI`cd zbr+gI7HP47p0AmH0P~kwm{aKQR=GJCKQKYSjSrd;9L$cUF$t$JJ+o4qP>-+!+%UdgSc29c+UJz;YoWfgG8a*2Za{4{VX#G6@x(T@Tt&iwUC z*)(1jK<#TiZ8g&7@WIu>bCI3kW%Z>aZI6^mC*VOr z-(3?e+M=7eZde}bHi7V zDGiP<{_lcyR#VBq5cVO92GC$V8g{Ui^bT9cdheY-JLi7b>+BX6K(J2vpUt`%U9F+1 z_Pbwikds?kLPBuJQ87hpjyp*z^IcN3feCPNJ>XWmTz(gPp|$w4IQ6Gx2qONEvM|Fk zTfzPH6y{4}WAYT>+@6E5xp)3c&VB;QqmyyQp>K&BkIeEY&CFn?3UD?)sh@xh91(;q zignL5b1j4hr%~Y8^I=ww$4=VX8F!q-|7wwtjTQu8{7+PG!tYt{avr-}UJq}K&zClm zsav!vJWP~Omw3$5I#+<|={+&CKk?=h7P>_Twk1dzHCN&_u?uBU_BtyL0cax z^oazVcrRBOL4`Dmk7K#$st5K9W5JR58AX&Ra(}`BQjX^^$jrb1A;?(-B2DoHTR!2* zH+q}yfL1-T;18F`1gasPD4q>xptL;yWIxMB^^zHUr7&-=EIT1O+iAP2EBu2^;F+HE zh-d~Ev0fTLZYQ5)CCu(bp?|Tks{P}v*4BQvLKo<5d z*VRY_(mV%k>b6{6FBcK{K!DZ zO&Z`%e4)TS-Q{vyOJjGhhUMFx7EemDs zK*zr;JYO=+^yT;6@x_)o&`9mIu3v^QDv%B>3yHrQR4*&r~}@stkNI0`wxxta=)O(KvE*1p6d zy;&*iffyxA6~Ve9Z#ZEP6);T$H4_?Y(0{hm2)--7Hg!zlHS%L2SDaN``|Vz1ygVC$ z4mzWlKzX~h`NDfW{E#Z9x6P{`lsk3ocvU*o7$kPAvd~#`DY}8f}pOaEsYUPojDiRFSQ{U^k#26GBj$eo?VHWaT=qjV2@s`L+shUY?Z z=Ad-?$b;d5s$c z$)H%V^>2@OMFYlg1P1c;pO6UWg&mTItlF_#qMs9!h!~Pmz~q}_f26K={?7e z`)FKwH-$eSdwF9k>_3W_dgI)<{Ts zOhvZfSzy{ZIghe8_x;2}@1ALRc%vD^eco-Q0+%NNEYFjQ49$+zlAYnFI`*hvx#Yz8 zM~|0(YF;!UO$!vT&5(m}nC;-bQjak|-c8P^U&8f>YaJ`}l_)EFeF@;8vWOce9*KjbA_HTkcsp_0qj0e|H zJoUzv;vi)A5AttRuKPjoQp5&Ww8e$ZCm&R>P`q3;vdfP}kHXc{(1F|=%zb5OjYVPb zKT7wtf04av#z5n5BKOM>YP=c3QhLDWFRS}KBV3h#1nvf!dTv)Yx~Sr2S)qQ8fheqG zw8MSm`gfb6$#B}((Ebf!4{+R2HU0BPK-8m&d-o}ye5SGH&`u{Fsn!8O!7gVjR_S^+ z8-PK@BhN4RCi>4O)(ccZ8pyUk`pUtW-55z*VU_VIytD8)2VhO$UVSHUD5S+yN%I9? z5NeR7yImR_bXa7lV?m|kQ1hD$$CAuZWV}UBWi~fs zaI4KXdjt96J}~_W+S;a3FEpHvzkyb7N6=EITFo)*xH5|AAAttbbP6JB>K;&t4il`0 z(`G;UR+F$u+@!?CD=gXP(x7x}?}+u_U*NYh`0xM~lc(6Ku~ejC2hoKhql_qStS)KZ%tk9DF$7nGr+45Fnc0*}k?g`*Ix$IGqw(T>hWN^eXEX*q+ zD1VhkSD9b^@jGqfVA$>e=f7-`YquhcIG9!IVhldKJK+?Oww3Qj#JPPeq!MX?zE@)M7Ja3H3sNft+6 z%FFs3CsTa;m81oKlt!w=aMeu7%FWV%ynmI*Z zKT1kcd;!IHpqwNa%;?+Ip7hB(y1OV1rdeyGe!Lt^L2TPuP`sB3XC2%5(H#UNFzYX z(h0(RBKG9_ND!9@BG?zX%T}esU?=kU2&_uXP}{gPrr!cEXgF)gbKc7fv9Eq_iU*OJ zuVYD7x;Phk2U#jQq-A*^c%U)6030o{WSBI@%4un!(GO=k$mUU2Adl#@^|YTj;(Z4v z%?|(uvJOZ|xhrp`PMW9=c7tDTgCj}yJ>T;0AG?ickw1I6eZK&@Ff*W3QJX=k{~#Rt zq&Y4Lil8UwqIp-rHGC38qW|kWuf*>Df>j+*si3hRYjFI!ISj1@DY%cs)cNDKI0AH( zi`u=~^6;t)Ru%ogw6*|;f%d4|I0+SAuWZRw6O7&$Phwv4R(xdGmg?-i2}?KT-2*ej z{Ga?)c`$VQGP5dheIpbzqFxCVCrY;wAsPt6*UyR=u61`J{(sXgN*y=zFSsGOi~82+ zZ=P6{FtZOZ+}I8G{@b$_=SrR6UxHft(e{&A3*PgY8qJp3J$F*E>9#q9?Dqej_w@FT zAJIPqn=-*euo>6QVm{KF%w}!F&joR8{kwEgqUUN?!TGQ_OF4obfFn>;z4j z`Ej{DLN>}4pd0ewb&$GmlkJa49Y*C=s@$m>FVFA5%m?W5IQbZW_D0Z^26@3| zuFW+_mni*FV*ADaN7-A3bro#kqoi~%cXx-BlypgViXxp#cej*) zG~B&^{Li`fx%YlK-`{6u&+IiT-dSsnp3Muo?y6-krHRGB5~YdAA$R~r1H$Mj6X9OX zyn0nPe}~g z=r(C~gttWcXl#g3&)Ev^UTk2UZ2!PN{KTep)|rXULe_5DmcEMZrqb<27rTna`E1gp z%Jr>El{}AFzA(rayYRbRT;lziBi*kbvyGCM>y8E{g~Tda*mR6hIk{VVDYOMWpEu;G zv%+Sr&|jLKVzY3@;Q-G-!$Eh0YtV0#V7Mp?J713<_#sGQn;5pjZv`LjkVpCl`;qdq zGk|-}k+8>k;1haJsSX2ASNroYWS(oZ!&v9Px{AHNAAf!3 z8LlRj-TbM_hUx^AC!q8PRQJxp-uJjf=dAs#O4f>FnM2|~a9K(IMKeAz*s#njA+Z4z zAr`bp?gRf0eAdZJjpmq*OUpW+W!X_yU-teq8?O`JVkv;xWj}o3(QDyg9muUyAtQ!) zJ<1k!8TpUcNzi=BNZJ|o-OYL-uoBK^?{y3%$&MV}vN4Tvq|L#9{i_@loQn7HU%PDl zsIT2I|G=-41-Ebt{hYVSX%<6M>PN(;yX$I_$}Rwg@k~k-!n=)T={S@Q33=Kf^h{~) zckJvC!!dulx@t#PwbjZ1w1DX|DS;H+C9h$nrrW__MX=Dukg6u&uZd_HK$}lFLYz%S z0q%=1@P#f|bc+L`xg`7w6b455(gJaMA06HkA7)M#-{DWtV*^*s!{9nzjuz%+7WwuU zetPrr6U^I0d0&B31?A2$A_}-uUIl!xISUx(xV$0^`d;@B6+M*h%ST(0t1tgvnNpF) zZGK4lgWWuT#s=lN^z2v{Qp#{{0yKdr_w)!wt9l!<`qRjG;vrLih)NHtjd3XOWD63Q z7{by|Fd_V;wpCFd()wj{YEx*UeYrg@$&-YH$D45 zsT$N#0PO=ZSS~X4s2({s(F#q;(cxVo$v4@VrHBNf3;0!cF0Z9`02c_tn#q}S79RUH z_7VE(9Zve3KD^kLX#Q3z=ZGd!X3N|001Uf-u#u zaO)-tH`K4Ln`<7puLW4@I&i|Fp{ud62aAkyz>}kl=%Il_n`Yvt#X1%Z^(`s5d)#xM z%zaAB`>E1^KFrxi0{}6jdT3R1h+`kO;^(?J+$~xtVmK_(eIpNFcO@@PY~1_}&w=C=l@i8+0aI+PHwUP|Sga@>Ua(bf`{{E!XR7bN z(#|K&B|1bPEsy*`=_IFRAOkw*zJ>DwtmlU^kD#g&*zH%t+CPbDiv-pw5a%RN^oss< z(ELdF083n23s_IjXBTDC1KSPn_T|RH&vvz#Z_Zlo8|1Uz>hRSbY8ERgq%0`xfCC@q z_#z++;muvb9=g2#Ua$yDShZ}BGUE0P!Z8w$Avy3=f)d`xXB!)j5HP6rkaNN%u?M#O5dNd#?!Mq^Ap63x{(K44|Ey5HWTZz{j)SVsN=^DxidjV_o%MuTB=ZNbdV(EGctf54?!X@t z1OAvxtA{mRT0)a!;DK*UjINdZ=-QR1cNX03%Tn3Hk7sNZw4adwPpSvlcG?(Vq-X!b zNE5AI6J`F-sUC%Ws<-K>uxqMRGmjkF`$u1fdL}1)MBhu1&|e&eMIr!47*M z)Uj)AR^|cC4-{BVlJPn;4sc(OkmX0+Yk1z&0|LMViuou-{7kHBXHr(Fvt*q9bxUP# z#eqA}pR!uSerddZ2w18)2>X@yksgt(4mtUOjIb>a8 zbj{xq{gLhxqhL(yfB~Kpl<#p%A5_?qFlcm86&2VS@3sS zT|m~KgZ#T`dBs`ut)tfg6NS#q4mynHds}x5k`JXM3ah&2V7pQtaMFkVz;36-RCpO4 zD-Ap~U(5Q}$e*EbM}mKnqm!_q1_7|)XSH7hMO}@5&>1y|>~>C8yTt@6r?^^qheDao zf*p}bS$GVnef?*(4@09Y>vNw6|6*((+7%YD-7+ug@{7Ydkj`eN-q(ZccO~c2PaIyU@LS?q=8)j+FVK-; z1Bb(kwr=>n>u8DlCsL^xHe4~7F!m|r&(%xkgnFeXX=BilNd#~%R3@;mQ2%jt;4Ma2 zVm3SlYV|+X{hIh z{>qkBbAQn}SabdB4`565pU*dU!OKWpW0-2+<@sjR@+xELb>&a8Grzi&NJ_0owx&5&6!C>CR~Snr*@)oT>1{Dm1{bD-@(oJO<$ZP1*c8*Rlh z@A%f-i)(sgOTL!Z)`U|jJ9bK3;A%dBIL)i8h|v18dPvsP}ahkVb!T#KTcIkC>_(h1z^SCXig|3YT8^~ zIl^Q~#S;kWa#3n0c zsrN70+JZjy09vIS)+40dIm~DP!&&G-UVCEwAzc6Oym13xz$XqKbT`_%Mqn%jP?3dk z`I%~Ex+V6nai6^*a8BR%I?cmIRS5{x{<=f=7i{JSp@qW7-Y$BmI3^4F!daXTHkY$0 z+S!R&=C9rlEXAyTCkJ2I>%C*9{7eFKY7-Bw@DE=?Rq#fWCt& z2N%$`|Bo4AJTPl&LdE?JS4T|C1M)pGF+06Xi5RiHw=V#L+#dX%o~C~FZ_QD2Zj&W- zc6IXrA;PzKQh&ls3p%1z5oC`bNmt8sv>nS?jk0>bkaxRT{2F63nx_w_X`BRMN2mLo zLDm;H+7KE0pA1B{9&=)l~?dyV}dmRAXp4bpK_M)!^IDo=f~ zA+uj7d?W4XW)B{WtLHObjEpH!#A0TH#_OT+^dxcj`N?DrmPBfOPU|1eYYgBmAr7GC z;`xvhoc^UhU}}&S2gbYHu;yg+^jNs`!e+k3-h%$0l~cZCdj%RoTYp zVJZY*Z;Zen!pP|9xi+HE=KT9xe#}Qy6yKGPTVg1=Ul%X073BE9*P^CC7?Xf-v+Ymi zt?>90M~y_kWG?>qJa;Ta_zmnEdJSw$089;pz4IQ}F_aXT$8n(!FjU{4%=EuUS6rc% z>zl?m7uf-06#@{(&AauZ*641b2gbv$^W+`k0r{l!3PJXAAXj+q0qI8oCI-SJ8SkOq zua7Lh5}a%s+i$ul#`7CorVGO+_`SfwmAi^ReR9gnaP*v;=b;Rky@T;?#Wd7~a zjUcX&ZuCq$AIR3f1xK^c)=`#|$D3^Tmwp9nj6;q;DRysazR0+qs~|;X3Pzy3Ak1c1 z`GUTBaUpZr;qK4o$S8K>Y@)a=_D49btWn%TKa=t`W?GL(8a* zjH(mtHBg{%!3D>#=gFlfYq?_B?QBJZj&@cST? zMqPA7gOBGgEhEpX>kDojN<_FnacmS5v4qj}N90402Wx=-{vZq1Ro&^8$6>bd@?j|B zWBS5z^~h*CL5QG7kZoMHymAR(Umz@4Q=yA&vKmACX8E|sl(7wsK>OSi&qZ9DQ=$0(gqEt}WO7m|6I*4Es#BJ=(HoyKwc9Xwz&zYi_?B|}! zk;_%zvpwZ(;P8;j4w^Hdlf`pw;`!bqZ5{$g1oQ)z>tE^Sn8k8uHw=z;YwrEfpN*T~ z6|mB?&Am|D>W)pp*&qwh9R1sLAfusq*iKrW-(m#c^DbX?8vJ!&-0gC^?)^8;;V*3x zFWt6|Q$>3e)bVj*)P3T~9+s0EVXZRM5Fj!@7E}rBn>XIs^YemBoO1utOU&_f1^$e+ zM_}k{6OekFaPmWiKkG=$tyzoIaKAUR3jBdKa26%)SmtNP%HP?(eUE%Y*P#G~^!fR< zA;KPYIyQ0>u9Q9lYeGtEmUo>&_G|^|; zem0RmB0e97J&1Y?i(kTqJ_38q2oTg*|1D57{eQaFh=wGp|2silLT{$73+*+Z*>v9P zyKma#Ps*P4*Vd5g&;7~3=VLp6z_l*;k83Sdj&8}iHydPnME6w(Is3#0gLdYmWD+-a zBQNp7H5_oQm%vp>^(k#oDtl?AM#AsT)Vp!1!RfhG%j{0<)k}2~cvepnP3s;4&NhlMpI$*YB*<0J zNA{Fl`puU+qLKbR_|&lP(|xLn!*!3nIpuBgZrFf+KX6cc;5y7GK9(wuyjfz>`1p$R zvaU+C3;o+~>kjVkVb^5W@ZkOO83=Rk2pT-&`5Tcl0LN&S7@Db~XVmDefe;eBHh%pP=K?uKB24D`$J)o_|HSeHQ*s8DBI^iI=BRHJrm#Lx@#s#kyrYoZ-`&O2JH)b$oaDDMLHbFJnh`tgGz)F8MqZG2kgr0OxL1jex3&vMgKn%KRi z7m;6#SuFT}AysZY7Xy~njk_7G!Tr5&;gO-I$30NcmCYQj>v5#Nyr2WV@fsYi&+q00 zgP7^;U&>&v5b93S+w`o;s%+)EOE}3!v=3VV>==X%uLYLRa0*+*4;Uwyh3@+C6v$O)P@CvlYsBLiB)(t^QEa!<5#YV{rN*yi%CV;oyb(0Dq#q{M_UDSLV?7)R*5I@av=^Er*lI zFgP9*I=0&c9lq@tP-J!i;UuIie>%5niJGqd+H;OTAptAe%BPz=hbAxdsg?}ag5!P< zm=h8F{#AT&(of7@Wn2`1qk4CYJNA@EOyi#yJHdEv_ofQ;fgpbMMs$p)l+7&+o%z!- zz*Nr=z(IMvc7t64VpwA!eHB7Zmtr$@d2v(d&yOv4FNm(ddZzc!sJd=$AkQa2$V9TC0U zGP$=21^RGP!Wj(%*YB3?=RXS1gy}i_x9KSqVqLEQw&^a$M$D42=!I zV5YK<8P|i-DG1_d-@N!?gE513g1+HgTU=7e5WBYnqZjC1vt*@?e-7L{@IdIKcWw8W zE5yq62Ij3oy{yzSvm)=O{DWWHUWWwmDoHYehXT?RQRs5VaC}6=8$q^jYT|1tLIW>C zQ2Lh!EWZOqGgYY)aN25MS{KnHLYdJ)f6DND{dMlpP$eNV9p6y8=(yyCTS@pufXM)T zFArIpl6!g8zuD_5oyhBl!>nbq(5#C)+V#pq2Nbi3>44}#JQ0PrgnP{&%G99!`1j$s zUiMsf1iBE5WDlfX2xES$1~1xF!O>I(QSszj4F85^;r& zWcMQ3F3Mk^g?TcRW%u_96f0pD`iFeEwgO;OfX0J_bs3*6`VFhFYOn(s|CP*$V@{Q& z*ydy^5q%e9LCiM;5{;lTo;6-pvNmoZT&HWiyjRZvO6pgYg!_LJiaG%;-xr8}mP5*a z*}=K9zvyv3(vwe|nqr&l#o+t$siCZ0mgBAWIYKW9G3S6k7m_MmC*<74?7a2UDm-jFb!Ty%{h>F90HEkmZ*9H01+aCmB z${zTEOjw}BNJoR>pkj+##Y=MB*BOB^P&cJaq&y0M-sp*$*UYo-bQ`jqODLH2nBh_$7Y#iAX6! zo50~%#%cNrAncHK$I~WpCtY?XJ-CXmwda`2jNjJB&Ic69zPEAwY2w%hyaET7(EwD! zyhpQ}UcL2*zJ}z3 z=M1P7KrcdbAgj45ZATX84q&{)v*u$c>%%3bzsMKe>W7;{mfhRQ{Xo z5zFgLO)og>om^9!`*p$h)z9o^g0ovQrsWA&JWx!)zR@uG8# z#ZXs%hJ|jVXW1oa%`J@ZNH#)B%pmmg&+Fk=Vrf1wL!y4pr9PVz?r}E=^k?nZR$)bZ zfF zBoux)Uv2UWbLpFp)p>gg^SU!3PM89_4q(XHf%4#O>UM($5^i0#a|9ZxlxVJ+Vp{>z zMN+QCaig5$CS_nOoae^!bnTyOI?Ad-Ubb1DyRe;=^2Lp!qFoTa4ADcp)^!4e{q?i3 z?^hi;juoMw$FEAvhH9XaMF~#>g`ExDlH*({_qVyDUq8@AMP*6w z1!&wP!hI(b3&l8xLrd%O&ANV#z-?QaQ{_jP+#FQ#o(@9L-RN} z1WkA=h$HD*6VXZT?a1so;!KPW91kj^2x*qWY*8H*Hz@fo0IC*umK#e7Q}Jg;cm9`|J6#=30>?UiHbs3?!$eh)4y6a7#gq>GI>GwAO|Z zXVXg`Zn^i_T8blrLWN*@GDHVBAw*2qgrwQI3sM$bn2AU1l@UmY_JjtgGqZ4rRe=3i zf#)_sat}MXJ$kTMldBfa@SX6cRKmA&3ey{;R>C5&^v6T6ZcG!89dg_5QSKTQ`SE#upH1ME~A~X5PHAj7Zd8c`WIb0Tqi{Ci!2T?74 zk;!-vu$upu3cw(4aux90-~oT?Q|U_yJ*XhUy10Di&hU<1*_!j`(OU0NY_p@lTt1PktN|!-rXfuUi95Drt6o5f& z#h=9o=r?}ZzKU)?L;A9jxS)|MK3|{&Co+^amb;t+?i-X4xE&`brs_E7*vbUc@&qHO zy~&jpCJbeB`O>P_=OqZ75v>9apcuY_`tG&jF|{Jm16(f0P&|c2d3S^M z*~aIj5RQ?sq=N@BHYg;{=Xb(590bkYQI=^60W}x)8P`Jdq1%;C*zggYG3!hpuiZd> z2O$NdixZVg1G)J&37HU(W8L72(9$SUb5UC|-C zjl=+opgGSZHz=jZzT>Rf$KgMvm`b#2T{dLo+?iwwDXbgN%?Dn@PP4CVKKyAf z+q|Bx1^Cjq;H}(TW|Q6^9BD|%%KKRKrfyZayf)tJuKX|I_5bY3oB@}IT@Bu4eoa?f zLw8isl>L_JU16Bo$1Yp!;Lg(qvLAk$e*}Z4@kQgXN)9ZJ zY;|_woF=bN<-3KbRh94!u@-~@dnN#3qQQP1{~zZW+wlx8`+rXIsJIXR+=3xhp(LwH z?edt~&Kv#yY~IBP^L*BN+t%IhAHYPv1$1-*G~mH}CG?JqdWt%&qhP;k;>4AKe0vG$h@Z`4eV>vBFKwsg=&F z>h?7b$;3+uE)R=%M~ld>)hS>lJ%rg}^Xm}CbYSqE7BqAxU^pZ=@TV;`6O-;;U0&wP z9YFzL4B)K%3_q&PJGVokTVOYORavtBbo-xQ1f_T*d%EnT;(Y~Rkcdb2+;3%7_YisH=Go}~I zgkJFvD*`ZxWmUEpVkmd|=13UWjAn99%YO4sK7eCBhUo?T?t?ZmE&zj^8}qfLw{!$S zVY7!SR;TDUzCN@53{2(r3ru4R`GwZtJrX2M+Gg{!H>=(%C3(}iQY7o-KjKeSO^q3mR&B8-w0E`0swzw`~qF8U<)J|`FX7i$yyrWG4o;}oBqee~QZqYsh&{g9Gaq*9_ zIE$~dM{e~w68YW#{aLGU50pWrg(LWGHH0mv2`V{=*Iua0{#hjQJAHWWG*dn`p_eBs zp++}r)cW`~s-tb7J~$pEK&i0mKR0f8?`g{%<>~1aKnem!``4rY1D)pIe+BCm z|Dt$=;a&tRG`}6vrQ_c)`z&e~jwf7#QcIV4}i6q~H(k=$R_$>16D7TR? z2Zh}BQqDmi=w|R#@QI)SdCHb$FYuu_d}2TR2ip@=1vsZ%3Uqo!6zPmJ8p?sQk=1pX zuszn){;MU6g6|_ka=PG^iW1<+K*;Dyt*^gXejq+1M1FW`;G&2)EetFf)Zd)xsigRu zbxJ=57!|T-_gVXUe@5wGnPTB(@=K#(OWxVV6!o4SZ+DW8F32!;y#b1(A>{DDJHm{P?*UZfG3sji4YvzL`B2 zKZk8_#^~bP+HpDZp7Vb*M-nr1q4uDg6mRf!jeSEf1WXKl1Absc72fhL9^NgA^io?d(zg zdUp|7*EVV2o~%y>F8_iB_O9z|tPw@71?#ZK2`T`C`1f@_&DP;AAt4`>dfQ5CxV}Ky zTsD*lCJ*KZxmRV`gFzX@G&d|bx7J+vv08D)?hMxoA{Sa{N3{mh{C{B_wzWqr& zU4g*H>q~9lUk|cQ%-+2<-l0C{jgk|Y@k>AiZ9u}U`=Yw4g)`Kb$1C27}@WWMtAoafwWyHTqnW&to9=3iWdMbX5q6SY#4k!q8f3NT~ zQ`_Z6xgO~ekJDE+p%n8WP^AoaVHkyxcPcK?qA zTRZ)?98IdA&1JxMe9nQ={^Crt@<>jNvt53-`anCF-R2{=fUnuS)e#v}{0{?wtpf7m zV!&gwXfH?sqgy{KtAJU)QtExGQsh9c8wzcrjqgO7iv0Y5gOP`vA#aHatojS1`1eTs zKw1Thy;qCdR5`p)Y78tSTZTs84iAvj$B+D<%_iMY0cSO9Igkvya0*gc&upbw9E7nQsgbu0b@yN>I7rZ>T3^@*z zG0ab-LZBKZVPg$O`b#@5BgwO-4=4&uaI_++Z&eKv79SK&iN0;5Tt89UF8h-2VgHj*j*|@b{XDh zF3}h6@o{+@`+c|{RgBpRDl}inI;Yrm05HU7ccvPqioy9M!}yP?&`;Up4nzK@mT!O|%|-(K&SNI52BLD7ATv-1!-Iugu0X3}FO)swJ(Y z87ku|l&ePqXCEsP$Apo{NVfKyDTch-N}NVakO1Dr3$!S*UmPR89<_aG+I>Bn`#t)- zhI$(UAL`!N$hT>^E2K1F$q>V*%4xTMp%m@*U66uBPGLreyQjzN6FwU@jSIq>;Sme~ zb9i3y-Z_FA--s=Z@BB}xierGZ)OcR7>0^-~Np;!uik(fo zqs~QeS{@Z088kv)3in%m$@wPm5A%Y5*dpAj(s`s6D=>G*f->gAi#KTBT8;JBC8>YZ z(z~@o^4K8`t9^yOHENe7?rW5krn`jNsWthh7hOX8E6v}{kI=Zpfe!@3FBi8WE}IAP zU5-paf%dIZI2{YgTMVh|Qw(7f$8e&MTH@zt2i?7UCTUP7^X_n~t6b)0Eq(=Ch>Z~Q zBbo9TYFV!n0Gb8D9eNWKoTUD;T*PfieG}F`gMI>GsFE+^YyP6!@?-&FZE;*E7fe9jBBjRoTr)WKFSos!=NF1$sSJ zAS{*yw^x)tf!0CzP%S+Da+zgtDr=7FGnxB+?$wDd==JD>u*9!D4xdY4e?mvPnvsqy ze&j@z|5|4bbMy(C9;)RLjDT}NSpMt>>Os~^4YcO9*VZKx9P%#b!N?*@*;`-6Xm$1E z0T|DJZb51#rr5rVDIFFp;RNWX!&Rd1^&cJ@X(JJTeo+rR)CpJ>>StHF@yc1X_v2VR zWoL$6+XR!4z=kN*`egLa&QNN)4pup^ZyyYVqi=#*Rd&FwZ95{7ytyC{n)SZvJY@_G zmVD@#yOtJy3u#~usd#94vmANN_qMO?0>8DA$9p~ig^HExj76)iVS`0^{sQ<)NSxkQ z_+I@2?sfi({b~JYv@RjV3ys-FVTQ~FWOOYKGD-jjM*S||Il80H_-o}|9f(jqCbh^p z3C+eue2vTLK;JfESFb&M&Y12|n0M5lt-tlv-G&|^B)TLCy1SLTHsyfZSD$LmRRsj) z9NfSGMD0HZ&{L@2gt-D3E#a^%d=GkHuE(iG-kY>@;RgY8f^nhCAc>{0jPNl`W{cap zrP-(jj-cka_gz7Ao2pbngW50U=U{$@5o2wCl{#YNBiSaDcY`!*3|IQgY<`LFXhm4C zVqh;c@Y=;?4oTe#dnRciqPj>Hr=Aa1opMJAAx+PU@VRciAwM+4%b>)$1sZRui-LAFcy z`~nwQ4qTwjjXfB_W2+EG)#JXo4ktp#L@|gf;(cwxCbVZ@T<2{cO`q5;_U1XzT z!;eF}<$1Ag{)#Y=cCm*r(Lk#HjerezF3k#qJ?>d0M{6VFJGjrN=arVHS-J@J((jW2 zp%Z)-x;qbZt*zHZF)w!yCQ@a$@y+CnP_N<8&5^@|l#8ju zdtgw_8!EFA{CvN2YCLhb@BFSLW+URb4o$T6aP>C43Rt-SxR2Nq;S0U;+`WO?Jv<(A z+N|L@eLU0H@;Xr2G-uo6V3~*qI4Qnf#QR^>w;Y7;IJP&PuE^!xy4|7*q_n>u7MXs$ zj|X6s&!MQnZw|3}RKLp}mU0eX=V;H}^BxRM*(w%}wARM^U#(E_&x)I>k%NY7PJ?{< zWY6J%`Ho?|5(RrfjiEA0@>|NT6*m})LU?t0zsPc`9s?XAz{MoR2s^xyR&m;2#W>hz zYlb5Gxd2%#kjug|i>I|9rk8&x`^9y`7)wDE!}Z(eH?P!j@8XA;g}?$8h>y&x8u98^ zf0ZIZ5MER>HFKYORrR5Lx!I5eIkH#q_8w?*yTR4+Bd((Vqt2;})wFosedI~FueB(x zGCdtyoN4kTAkqT{w%~P$ix6VKIyxB+W!IQ2Z17R{<6U>g;IEgXgfHj>$GtMJ7{EeH z5dq52U2-Z{gw5r?!Gg@>n*sQ;d)op(-s11GAG^e&nejY48`~P$DfpM+YkhYS<1)~( z{;Zr^VlS{6L(cf%6G>h1vY5e#Trja3DONm`>A5lvghJ#-4*$ia==W|(*hVfKuk%n- zetXN)jXVr~UMBc?>M$msS2Xp1X^(xducwJvfN4Gqt4Ro6>S2SrR?DR$Jf#{@eC9A1d?VxsbU{t#+x{qw=Q6n029xN#}4Fnxc&dp)Bl{3GXHmn zx+cK?mi;bLW8&uVC?w+Q{+niCovf$1~vx5UllPc67vVK z#ivpk-=M^ai0$}POtjx7e>9J5cy7?WddsN)SyCb&XrJo(#=eybLIlX7#wH|~{u5DuG z&~A?%Drh)L3~rr=-RE>wRpjzec||+j_3beVfI+;dy0KGl`G2G6n0n1(wZ}thn0oa8 zXe))KYcRWjrie%k`YbfI{k>e(GV{7a6Ow>kjidoBtsFSo@0vh+rq{__(o7)P03F|#r_zbsTpdiSASC0wYn>$q^X#_jEGMK z4+X?q**;0Gg36uP)3`;Zmdg}QC<{;(GRxN%d0a1F6!4)2$1?=y-J>>mnR7PGCJGzB z*0!QPs4C|fe)$3ynZtH%4iBRd91oJ+aq_M2_PzQGSXe7HL}J!=toufV-#LAABGD$C zWyhXA0n70JkA=DFAksVF`GHPYH2koYWCrB`1y5xW@%Ct?*FtrHA9`fzRBurQ8Ia)4J_>GH^ z>n+Vt@2+agRCnle?7+_yf3`1JuESL*IfUpu)(J1LEeH7CtN$QZs+KS*JJ8eOYvlTG zG(?K^QFDJKLYez_=Dp1cnHBW(OOor&UiCFR-x+NGB{1B;0yl{2gIB@d3g*KP&05X26#cQpmMMhxvv zc9zNcPW-;8oO2U;Q}g0$%H!kqUk1?Eta?^22g_nO_wWxAyCErIA;%GG?_*S~$5h+n zNx4ZX27rFyP)yH;NE!N(tggzQLNCg>d~igFUDIa%`k}A(v#edvpL!NfU{~0Ie$E=p zO1d_tOM;BloMZ^5)C1fKh0DI^<%Smaj;_S2e2suD ztrZU z*~5zj#;A9bG8)pc&AeH8+WcX-4~CjRxe1V2Cn@+rlF^!kfCzer;%+hF>-CS|| zl1TD3KH3Wb0;c&4;9dl1s8KL%O(+Uy-uw>*sy^(1ukyNW7*Tk=7y0;y$Wom&=%iyj z-?Nu_T%}4aOemBbbL0nLVjyhTs|>%DN}@Q} zX0oHg=ko^z3lr1+rzc~|YdXe=HvmNhu5~=BuHivXyWv=r7H(B9$fz~bVcy}81C#88 zb>NF6&v-LQrZqg^P8=@mum7jIO>Zb*%XqRcxPTm;L64C2++KAz)ngoLiaJa5wXRM}*6dBF!6|>mgUV zxGt+4&6K^s-moo&gT@6v|B%)=<@3Q`c$7iENe)`4;Fd?2-`yLBO@_==Xzr_(z+rg# zEag|B=y+jP=Gn$?pU`q?^*qD00c`;H5nN7)sPxDbqCzf;ZyW>O zw_)Om{8<*23U6MlRm!`4bQA$Rw~t^>SsiX{`p7vf@GPpJg81_8Qql?2DGL*-KRq{$ zIno+U5Slr=Fq{X$Cq#-Fc8fa=gu_10>=-r1jq<8`RWlDv%uJT32#^C&#WR0)XzD0m zV`Cl}w*9($xM5fcQ{@v@sPnRj7~&nX;=aT)69Ocz1>S{?Zu5atdX_G~Qy_p(dflmP z!>FfgNh!1Y5rKd8sFs|)0@{P4BjXhYXEQJVj)H9OfaX;Ca_K0K+*&csgHLp)cqgzQ z&d*nI5`n+A@ol2?I|zp;8n@R-$$sA!%M$WAh264fycU=OrBe5K=Smck0yQ;xr(s-? zYL8`-uaTQHDW?p$0}{LKn45}$XZ=**JyfgxYlOv>2S#{2>!{+S(fCd16%oJ7CvZ?0 z?lv|#0PoF+g7<%#6Xz@N@&2~b9|r30eEq~OT+e;??hgrP%yg(bo7%uhIi9=Fe6XRp zv_EKb-x9(%H{L6;|84bgos>U}gSxToJ>k_Qc#};B{(rM8l$e(u?uS;NYKd}*e1c)V zwb?K$!aiiBWg(0eA%lm;2Eh6F8pLVxYZ%26DCoPItHXx}Fh&YpdKKK|988;PpaIW` zK!da-s7_4QbY(V`w-gp7iyU#nlMs~t+)7w$TU!{L+^O*OBeB6j`8?~x0IHt|iH=lb z@Qbk7pUZ*+tK1?Q!VOJ57vz)L$$voJC?*4@b_q?!P;6CIs~<|I+8eaxR>p8js}Wn1 z@Q>E{O@$wsDD)f{MpVu>y6zjBaG==T@@*37!>r6J#sw8XTP-ND!|n@%4PipS(dxYH zEDnfJ{`H>*|DAf6Rft!XBvv7ZlG;ez3hBLYEPZ}levn>}L~+BCX-WUBYMzqnOGK8P zUsZPc^^u4eP;xO>Sig=7k)BhKeP1vg{p_tf|Kh~ z#HmH3@DD<3#?W?qKfiR?zZdpP-OUC>-U9q-$LljSF4q|PnhA^F-VJMJd*S-bOs->& za}=B)rOyN9L(eI#e|ai-HKhnBVf~0*ZFtbM&%5mV=kvFA9V&f6{M z5@sC$i3}A`y^IggENZG>T;2O;w$lBxhe>u|sZ7;25VAS=$x0kMG=IvP$y>`2IoBYegCy+%{ z{wCSk7cp{LUcauZl6fB_}UOQQuzz;XBTiO;V$b<$X{+PGo@HNr(0b zo;R}i*VoDKQ{bYviq~FjYbJGY&Hz-{K(%m85CEX1I(j_1v|5}@KzURL^cl+Xf zX6>=YeCNn~ZSV2o*NFW!3Z-aLGZf^`!^-*q>;&9satzFBvg1NG>(1} zH#Pm8rLD=D@;A`%>J7qDn5m?to6`rzl_JvZVz^UPsObu7h?;{a-q*__j8y|LXbf=H zwEJ&~&sgec1K)KMCPf-9*mrSXE+Ei+?NoI^OSk}!7yPOr-wlgKP7e2012#O=ey$r! zz~%6>lJoLwV4l3hG&K?ckCz9;RdYxx92k$3!Z@zKw;zCk26)Jpvgz3I4uO@*&0q8I{wU<<@pm^v zI6HISOn1jiu|T$S0K$F+e&MI>{S@AkbWuEPeX0;emEhe4N3zAGbStSG$^yWQLD+$2 z^F|iGc6rOU(ShgnE!_FYOEw9CS+oNuyD+u4eEU!)H15#Qz5$@&TN zpWP;f_e=4%DaOVf;};pO?WrP9xsE7h}}Zfx>`5q5hYd5FiB-B4Z!%H zR8K8}b>4=c|8=>K^?~4Vm%oQ0g90b9K&=M*9)3Z%@*v=ddHwYCKst!{&8Xm^`-}*N zbCUNA2jheMMkj$D(bA>4Ke??H_-8<$gy{J4m`ZrXB6x3lZX(FzgsFVYe<1NXD15MS zAD$Bu1^*0aP%9P}MS@J!n1IIv>@a&zF@*O)&tWro?9@z;ZK6U0C|(8Q0-g)*!jDW( z;VFO3#P>3i?ga_Umi&rY64Ex$iMCQtDLVle0SJ4ZaR@YrCSm)yy^db0i@W(H&5Ndk zX4qG|EbR^{67+ZC0OAJ?@~GvLnVz;_K#g^0M4kUs!Z#G6GZJ*e`MAsCf5Gs2%o>nC zp(pthm?zjkvqKnr5M{>8OQD0c;(U5?A?*=a(4R6sP0q}g zCXeR$p4}lFXi6aqG^OBzxC#8V#c5rht?d)ZPuh^T6u!|NzCh4Mz9vmYYoIU$T3m30 zXY8pxY;w(C9#*yHV9$|hX$#rf%YF;53-9A7N=M-bnuY#>u zXZbtL+GILI6<%a-A?BumW_74bv4N?oI$2-#tYS)BPOV0;q*J#6je4?im*)kH#}YLd znrHH4jXZq)5rG3|xRKAHig)y9d5fM1pOWFHbY^$X^?PP}C| z*r8mLcRl}L70ZuqKoHbLHmmTQ9|qAJ0TvpPF@PrVohX}QA!S*T_O?~Imd;1)gn!%~ z-BFQy#&gO8+WzMO7BYhL&vh%fnk;;+k$i!}1XF|5XF=0U!(xVAZKT_e0Z@EsyHB|$ zr%}#Hm{(~!^bQPX~nOL$j>MM8x*L@uwe5oRws= z-sn{d*ZU7<^PcF9=)!f6E6xLK8Vk;QO)j;4Y;uF!BgKw%ni9?AG)?5<<`rM@-NOyN z)Ey923Ck6X2-!lEZCngmIG8){Gd!L|rK!q(Un!62$)ci2-!uBh44hWuiBSKZ{!Yf| z(`0Hx^R@lr?49z1kLyPqE8A8VbE&P$5HO*OYZ2bzOdPw~9LN8#D?Y+(WwVItFlK?J zd%4#C)#|KW*2F#n3=$}wj}r3AltbU!_Tn^{Rbpr_#2;ke5ISHrN0#Hgs_4u{G1Hd- z8BHB*Nxe3K)VSke6H<13<>FCIJkK!EcnC()q$v!>8LGcV|uVW4p;7y9U@?_X2yDolUzexjEJ1+JVs+W?aq)5Qa#X zM_HDi|o4^;BHCP7!0KFvsVcoWYAd0ZgbN49M2V+Y#sKlSs;!nGeDKB*nLgdT40sPPc{P$rlFYcFSPpW ztOEO2D+D-+ANCP>NnjEG@W1Oc{sTUg1aZOtq9K}N=|0&xzL~>oAyWT5BzJS%Aksf6 zyBXF#4BZ`gn*|_2yd(vdWXb{-4*foH*}agXZpe6cM|CoLC}W#J?_mY{E!TJ8N>rJ`V?$Q)O8=8z^z)oNmZ)Xx7@V)KPat!hyX!&OnR&~XS0-_(+z z7Vy~xjGp0z9OT43msATNe}x)-h>s@Tqd?wK{5ypi|B@Jg%Kg@7l08y(-sQ2 zTt_>g)>{`f6)1i`G@Et54@?X4F_!_+H2u09ju8BTrrv*=v0ka2{|+=JN)Z_q%Nf7; z0`DU{aMJNQ_ufLdBa^Zv?#-_TWMACPmynt$KXM)YfCvSTDg%ZCsEv8m0Vc8QYrBn+ z*cUt!_U#mM$vt(hY=(OStJe7vx&KS@SkryRXqg^EOVVQeH^Tg{S|#@4O~v2$-Tip} zPBni()&`CL*eUXRu57xPF%Z+tqnSLMtbieGp!8XwON>Xb2~8CffI(f-dveStisv3X zQfKu1e*G3T5Kk*Y&szD&9HA6#%XiBF3~HM{moS>655pnOYU_(^f|!(_@J?M!NPl-d zJt3hm)5ZW`Q0nw|CG_Drb#nhmWnpZy_M8M8JMZm^3=x};OmF3p${YZrgK}s`H}86w zZ!J`|I#On5@_0do782dAshA$hA5larWJT`EBnbf$gY`sWQ0e_F(f-!qJJnsjD-?W` zZ-3W*m*2L2Xuv-tWfC`JU!6B?Abb*UMKw$umdYnsk(p zg7=9V_@@znGl?itE!vLi+tAy2k-W>AQGA^san=)REN&P#qAdATd4x7;-&6X-MPhS* z5izlQdAkeQ*m%b#d{JWt_NW1A2=J#t?_$=)V*5X~3n8XaSTqcmLeaFPFLx!&Dr(Gc$EI~? zZZ_@EI1gbJ%=xPT)AE06qf4vTv7vhi(r?C<-cj2;Ods%@dIavj5PTWX^H6}r2A&@1 zL2yyf`7pzRy^ZSEtjl(;96egMhCGM9&W);PhaS4isl5C|%hkm&J>lTyZN3^5|BJ53@Jb@rI*uB{nJ5sS$V21B>dz#AK4P&J9JxFOM* zowAlJy}Zm{>H01`&tQ$7Hb1*i0!5FwOS%k2_BcC%YbTJ|Q}{tfs29j&UV z$>kb`Oeg@0fm)$mT_FL+S%hCDp7-=PYQHQv5L$?7!M22-YYcnQCO@9?5Dkc)>XYb2 z*1pN^2z~V_JIVo`M>dPEV8Ad5k?YQsX+)(=Few~7JZJ{dS9lyd$n;Dc+8Zj|JUnIyz0Mcq>57ex5AG}> zi1V7Xa6G3rz_R#W0~aRiVgp6wuswf_-`rj%Y2w>wtH-Iz zrOqxg6wf$Wn|v{M-!yyxh6|p=1sZ$8uB%(t!B&Ra`bJ~ucAz!{mb~xvvu)qBVGmXC zD?|lxw{-l$YH_N6H?3~QqmWC{*RkJ|(C+?RMaVHDL9nGo;pY1a2YI-88LM)yolquA z+WShi5%%r&d`o3<9bz00^=dj2)FtRbU=DSAKpJ3Vlsk!Co^_8j$BbmK1t=$s&kJ8J zzfP4VQ7ue8qsT@D9s$rgEO3zXzQBoa*mXI}n&B_f%@nsVp84>~#vi`!;}lJO0<&73 z!6ot<@P@MZdKsPA^F`s;zF`{b_(pTa7zF>Yl%~yJ45V@JC7?pY7*h)7J1&`f`=`RC zT~6ZXPS1>jNF!miURBi^JCqbjF%tEJkVHV+~hXJzqRFG7qPNGbP+r&V~ zVfYUb(Z>=x6hp$iiG#)_AI-vm0pOVk=00nx6pBAEBzy5&Gq$?r^tpH$Piz~qmUh+9 zex6a8hq{cwl^H}p`o8m2c5-;QSlP{~(EE=??!LPUf!7MV(ZdP^?HwlIVVKgDu&=;X z*`|fnzj66&pTEI+9nL#R;?-Q>bIISe1563{P@L0U43CWaXJ7dY&S+|cw;5`9^xF+i z(IbWENN}}-Ww;Q)DP3n`F+0a+DErpE4xTf&Qn1T@UwfW1Jw3K zx?79BPvy^lS}<^cmF=lSSkSz}>E*rFGsD86-bW809U{5x2E}nIW%0mOU4j~<8@1p* zlXIJB`0&wjcg7_PXcx3zJx1N2UREUq6%5!B8-%w3u$upvs9aK)5q~68)kRLZ8{&O1 zo@PB@zwkot3@Kki=VZc#03lO3Px6*a&fd6gr1ekPNl?Gf+)8!3mz=8T2c@?Ga$@zY zDd4LpgK+?+c4@Au#eun`j#Huuj_Ze&8#j7kFzTja;vfAO#H$153$d)&cd@PeuJ5@eBd>6-3c&jTnus8pSKkP#h@VzYN1;B zX6?p;p(ooidq=z64<~D0H+I8|-=b8C+hY*q=Z?Xhg7yE|o{j#0+FY{tDm?vv&M|CQ zwOU+YL0V(2;G!r*9YH7Q32m2cR6pIExX4zmq6-CRGb1#|5OBUk}Y;nE(ZZ;L**sV`yuSOUTzC$1Tw&laO>1_CF89S;i4#*cWex> z)I&s8)K{mKPv;$*+N91KvzCEQoc~FfBQ5mZE$3LxzVh>FXJ%$`Hu72$wOzr|;*jI%N25qMk5 z9%2l>D??)d4EnjfjvNZF`^T-eC^*34D4Y~<8R;M<(o(93l%zvyGV2Mzpr+pUvfE8J ziiTmdHn4v;9@yk^k3~>Nv0B*sk z+dqJ0mqgMcpw~jyaC%{C+>2D_W3UeHbHAk;zE|%7hzTG4;OY1QexL8o+v!fGT2_zR z55gu3-Vu~_vGxCgfRQ+W8wF|uY_wc_v%IoIQY+v6{B6GH)&;{z*NAv4nJ1nT0gT1y zSAfI(rxK6P!p6Fwk$?mPq^t6CNd+mTR%LmftHKnKcI+H48Y}q!L%GSPt^KMtDa0DO zlV#!51%cSY+OroHk-;u_;?A0*$oasHA_)fxz-o;i3&Cjo#j$;g9%PiHTXgV>YUIVx z8iy4whdlTWPym%^#9y2Bts6|vLjfZW)0^77VOQb3TBZ4uHkGN#=<$yLEE7DEl*_u* zv)&v>AJ*U4cH&!7a-J!+Y2$v0PH{>KqK{x!j1ve;KO)$|`;J@U9848SD0I?%rr=9< z6#kHl`|TlB_N^TNqX%I{WTp!fMK5$!D{MSo)~4Z3dEjaMJy7vmIpaT;C<6TkLm;e_ zH_l_A%ib(ZYgYL%1H=57`NMLWAkDcNQ(o6~S{?wi0$~-H***0=TUAm#CLxSWn%RF^ zx%+a0pBtpxC<*rKf|~o?6A|ak3tTD1w!=Hyg>N=AN`0let>Gx}l|~zif zWc8@#kNC?TlIr_hYo64Gg@ZjkBEvOaLSGZSWvlpZJ8I?+t2uLghwU<%ypuH7p97fPvK znA~#WsC_t;@j8MkCc@GDNx45wBb?wh8~PvW>~fK$PD`F+m$UNEHgzmc1%P*)ZLk4l)+RH zl!1A4Jo+EFr{^WYsk!ep^eWJ}rU{XiMO5iBmHAB?=0p|T5n#2!74k6*sYGY!X*hM; zqb8W8!8Xj16r3RhiXC^crX#2?0)d*aTvSLdf+z##$HH`+z+((3#U;Gu=C687(D7YIsQn9X;h9i#7psQS(T~|izyS`kris_xV)zMvS7sU+# z_e6mDZY(;7V$%tyc{s&NvCEve9uWtTrZ&`g*qJd>zm|V_0a_@Y0pq!No+|`pBb3Cm zC6j5v>=fiZqlTC4leQ~GZ=$W=z6E-rgn_dLO;=;h$1puoCbZjJd8TF#jDMH(ysF#y zRk%Xw!CM2oVxcyhcw!Z^Pv3S}VSeTxU0Vpr>jsf$7V$ZFP3#8O`s}*`d*B8~ON#v! z!SZ9rG`rHZnV;#S&SG6^^d=*c$eIL`A@&UD36chvmhy4;JFd8kqObTVe|9?q#iFW( z>#d8R0RPUCw*w>QbF{?YtTiu)K3{ z7eAl-Cr$D=GiGk^I$zgOh!^X`sJ>;WDqNgxADJEoRdE^!o4M*h)yY==G#?`t{ijyf zTHKf6UT%w(cCY2@rBpBI>4!SAmRIfJJR*|6s&po?UmK@3P|-Vd?A1qqsPyXMDE0se z`7SuxA!SW=&(5_QX3~lp%YcA)4kg81yS6EHkihSA$8C_PMuD(XT>;yIGZ$VH%FfLq zsX_iC)t&@~U1BNP;|Mz9TLOTP_n|@l6bt+cHrp(x%Y8M+%x^8p>-+H!C2xFMl%ZJH z=coo?tk2+a+&)ltq zn1B^~@!ffq8@0WZ4J$F*$oKGmz4%TK&^!>R5sy!<;nPJq5zQmq;ZZ{~|NeY?VZjBX z%UHH1BK-S>6hIlkC4&R)!6X@?LXZS&T5OQ7~ z`TIrYP$RvZc_~*wsIM3JPzK6ka08qg%rpd>vzP#!df~sBhVp3`MqmGDPTeeN7X0XX zpFZ~SIPQ_#XD$WJcg7*F6C&66H5%&%$;1n6*U)unu7Ho-;^|{IlrxQ}aM|cUO)gOQ zV}Qb*e%xL&OI|q7w;fFO!@?RA9;i9ehbi6Xm3{-K?c?zX>l=FY56(B)SK8gI?GzYu zgzqQ8nN`5E4)A2vcfIBck-35Iky&y!w;HC=+fMaMTnZ&Mb4dohjUyl|shLWcj5zhL zGM8oM;H}O0>iByTlgWU_>H0#i$hY7%10|ys4fzwayYSoM`<5O$kUvN|8TCbFGIq~8 zXl~ZYLqV>j1CG{tzQIxTI{<%a+3D7?4i0scQU2NGS9QkL*nEi;|4INR55Qcy6{J^T z2H4C6q9&`&4_pvs5zRU&F6#Om$!)xFMB@hLOafuU zKX{{H^Fxld2daOi-VN7Xpd%B$8M4Ki}TzEbHhHVz-!@Xr> zO2ONfU~$D&!*121LJly+%nQ^V+i1PpnVhBWRhtMeUib5N=Wj2(*=Y{r)C@^qLZ##a zU~B&&HjrDpuUr%sF7#}yNk2ZjxJ$3h)9QTWXWIUW{qkRUAvJKtJO{pVK+UwE)X~bg z@*HKtmS-6H>-Ml2_d(j!girFD+y9c;NDu*PM)pa~pqZqQP-aQ-=v<^6_nDzf_(a-7 zAPBpmJdgWV$vNx^N(wKyV|q8idr7)*zmvi3%QLZ4%Uk%B%?P)Vu*|QA=q7KV?cSI` z9Ao+O*(GuGKEIatJfSi){64a}l$a!=!yGWURDD<`z;4(;7+YV?^8IAEvq&|mz}r(( zY+RGfhM7sP_N?!v_%cxl0IU^+u@iGwvN{}iQm=iU>RCOWO7@`2b6ktSZVW?|$9=2; zV9>A*jwrgsa6Rn@g-2uI#ohEOOHtv=hvEn%F5{|ghz4kj)B{K3{4no7cevoF8l~^m z(A_$DIbQb<+vQ!9ejaAWk4wOC4G=VJ1c+3+=-aN*kkom?REj;v-JjWla%a1STCqc^ zbS8-u3!q}L2LHHs@Aub`m*d<~7cqq9K7BnwfTIZXtpVNuR`?TH+abWL;Iq)h*6$kq z;WNz8PAI0GGLvWGS#!A?cBM(5$HXzd3-YtUIO-)^RQr}%}{UTl-25 zinw9{zUuI-i!?QL*pE<41H=6~n2whC7hlV_@a@@VH;gL9co-NMSU4~=1+=I-{Byb= zY0u_o8#~N$w*EMPoGI&E&N-bU|H!?w+K+nSIa3OGYd< z&7g1M_{)x1v5g~`;orXA7QwoKa7!SM9T?f@WciKrNT;oNu(UdjlPR{;A}p#Ujw8x5 z5q1t+>8FwDpVXDBxZ4NT$bS%?k{7O%e_C@hO>%;@g?$QPV@5ARFF(V;g6$$Pz`rn7 z{q0$;vyR`V!SD?cG8oJc_-`-qcAJ9#p!^JjWj+NI)-!hymms2No;8CIW)PaPcSaKh zvo#NAqw4H|%FB}KMPa86{)fLnTuN>6{ zB)ED;xTR5Lz;@rH{_&%UCqOv|Ix7E{i)AY=d@!F!>zLd)|I7BhjVs)$;d-F4U@VBzYS@kmjtRRi)wmQ&@mkwht}W4%T#DoyPAu@e`-BXc zSq{+?CmFKBqCKJr9MG`g*AleTrdy!U%nsJ&9!>)9=?~y%GHU_XXi!ERRH|5mGs<|% z*VTqt`x+(3FUpRr^G|>|V5lZVhRk*SHSNBUW^)>15`mF$QXir%{mA!lCY0OLi=Ru! z3LG&lU{!F2cXfs=I2k95M;i#R=eA0kP~-d4bGVTe&twLZoF=p{(}2}uxSy!bQvH{? zs~53fBEIfnJ(^jW{D_Z}gO7KcuixcniVhS6Ra*%t18ex>uBMj?r|Y*SD`FIcW;pH2 zL7PoZ1G4(zl-J}ycPc&ztjjt<^Hjh?^UT-CpqQv1Nm~uCkob2I7`|L_jo>N<~ZZwfg?i{DVeaCxD#>>x#(Ls@WVs(m#?Ixq zrC5w<-T5taILSq3RPx>+D$P7{5`h9Bh5)%tBqzmF#fY>|OvE_-J?ei{zF_Z2^qXa# zcsagCCk+$;RWPLfivMnO-S;GY4MsE{>ws^+^|~}P$!VLMWs9bcK2;3-CosW{UTcVw z_MXm(SNJ#V(QKyTTr$_)MX%iZjG#Ia;QA7WFJK5bUs| z{&dYyzOiMY9*f$*fpb~>Zie{pqrh3m5fYZJZ1`6!`3b0#O7kfYN$+ek5Dli827|-q zPCephcPZ1(E9_tTF$UWGT=-S!FceRsOw(CjZQX^tj*XB9H#qaGb8&V4jz`-H@lTp` zw}ikr3}D6Ofkgq-1}ry(mTf}MllUvV;Fd<@Uh?ZzUuW7^m##r#kBE<9CMKGo!4ljz zYxR9*J0Z41j;BgD(OCIrbPmOtEwKWdY{ohhZZY5(W?)8t;@hpfBIhG~r<8BqUDaZB zNP{vt(8Gx1zBrU>`Fq`qwIl*Es1JlqyS&;R=sIeM^TP4}ix*U&l9SYIWiB848n%$1 z(%!~I+5O2e_j=%D!Z~UP1EyU8bE+ zs@4p|V&*-|rVzpan+FP0m$+#7scX*(Zrqp1Ex_9COQo5b4#Jkq-u9ViDY2|ZRZ#jMOP z>c0fr{-yQa|8BHy)f|w^>x>v~eo;C(ntb;U;iy7+=ZvM+mprJaMosA&Fj~|6H`YUE z&DZs?&GAL zBSBe*Dsjsdc(Tml=;EMRRtto=kG`6u(8EFWN!3JK`5Kke`2)#xN<%a0Eg5ISi*hi1 zMF4~axWIZ7PaK}KofVQR-2ce()VIzIV86-`6%}O~3D5*!&__%t%|w!pr5$aP5|%S{ z9-1ms#Y$A{zh$1kr<|L`i69Mv22>{7N*u6-c55;^YJS}R{%qu=d+}d%VX^DM6WyW;`ADOuyC*9>l)w%LnxUDv0~eWA}+wijYg|fM>KX;jhthWbTg2Ltp!n z_Lj=@w{Y-sv;lEtbp@k7iWmd#t|q}4)eokmxipqha*q5YW(r3zH(<0Z=#__bXWDw^ zmXMck%^qHNwJBP@FLFOzd=W=*X2rZt>;f9wdqLQUIz`;F95-4czwHHHbAV<^Iagwu z*y7KR1cipu+KT`Tbdh^c!uKsjpNrOdmQ(em7^b>XZ@WG3wGun(U+CN)Sug-IHK4(_ z>r?ZZSp~;uH&Uh{60zq;d-R5!S?g6s>GT$>=Sq^Ga&!i#{dI+~%!wf}#_>don;sM|oK$&Uq~}Ka`c94c;u!!ibOdlisKW ziFER;GMm`Me*jN`rALRvgcngaE(fQ}Qm^`+(Kq(Ll+C*4a0>GoOEV$*YPA((t%UQ;6;% zpGN_(*WhT3f$_Zl?uiToMzqGL@9${F$vnPyN^20ghN3mL?dkw9XuLb;zJ7RPUXj38txc9Jr*J#9?>q^>s=?8OSrZw)r#=>Vaw^AW{hqDQt@W$Uw;`c| zPgKHq$p|`LNI{rL=Qr4P+NzYn%sf(&=-0b8B+_5*KTDZTE*DHWq=K&mG7u)tMsjjD zrRmFx&2>f^j)ExhNwc_qb0oO~d)(l~Pr%^w6pCQLV6IT_>h13y)x%d!TC=D4ox4T> z4YsA~6GC{yKPCVc35@1qhd@+xJefm!uvMc?NELDplgd%$YwI-ul+t&W7~o8P((TR} zOkZdmdgG0UCEXvw`rbuSjr76KA-c&~FtxGGApyEw^uGqgAFinT-3AJ+#$-y4RvVuX zS(f-ZQA2hPI#X=D-hcdy4TxX$llZx5uMpv-|E4BitMV>F$kfpo{{1T`G5_L2`Li&_ z%_WdMxWhp{!E6m>df3wIAh92e(F~9*S&Tty1qp4?Vg&|&h)M&rh8hVHGDZ3^HZa`h z)8i~%Y#%DWZ$>yCg5Kzk*UK&3sB3RvvzZ{nh&YLm=3*Y%`iq6qJ?N9&k1ga|q0=^P zBXs`SEB!SPp7G?}h-A1u7H%TFFiVhMcGvgbUzw6Eyvp-bJV0YkxOSfft|(PxNJ`1h zT@v31iOc8Y+InH+lsDC$iTOj44i&M_y|)O!^!P%6Nx5VfQ1y<)YRPhkhNRxcAd;u2 ze;f^}udreql1Z-Ft2*W?hJ!ReF3g|qs>`Om4k}!4YnT7>)!7Q)PS^)`1aA8+axEMFcL4^m6Z0ao3S6X4{bj2Rf z|K6P5H}cSRZ}o-rgEceS+nEB7_rUsrUK+z_r6?sx@-T_nJ2cS_5zY45bw8Aj5bGrH zFXM^}l7RI~f^$vzm>Dk?gaqmV#e@&T&2^r>(&J4&*d@dbuu>RxuP$HVe{Iko49!t zIk^I-egp1=`c>T^%CJ?H^K9D#VnRt)yuop+k(#Y-nk@{Gn>H(`I?+HJW4mf?)Nd*y zbK)Ck#ChHgX9|QSc$0y~bzL&N2y9tk;uqjw%z}MD>@izH-@Hqn`%$h{^4bIVgVn*0f}?T_ zE08z8z)#J__QBzCQ8T?=?VWh?V^IOo;@2w$E(CN2a7JF$s~mJMa;?VBs^2>;yz+?n zkf@{}Y_HRgwY0?S%3NF~s6aJdpHso5s$>s2HGLjuw73{xDo{PBUD}+9C@JM!|p3py_19eyB-&y#oGW zP=lgDb5g05pzD-4jKyUAQa1JBklUMmwAQB2fitt;w}84|e2eH1qx&`m(`yVzjQme zPLA2=2JYeic^5`?r`Cav@yE5UTPqF>=K-8J|B3oI0thtNKK%bI)CNLZ*Z+IQVcX{$ zKekuDkvAC30;ed2AA29!zwqtid-r^!rxe_N<_!>N=Km7t*hPfye_VN2o2cJ8AUmx- zBiV}-%LM3d%1dd?Jyx**fldL%Jkd6hWaoEc%ifRc{oc-)23&e}((r%UwabgK{^jMb zfL%aiGqR54?l9<9R}fhbl-r{6U+;&)CC1m%$v!%^vwu{>24GNkLH03ck{i)P$&A4G zjbZzox&2(7LM_GC+&1l%YurDO8AC~BtLc5saunuNlHjiso1s56xf?hrg-o%uO*Ke^ z1OtF!=84?*Ql&B%GA2c8chS@aZs8RX8yiD@P3Vc_J~O$hY^Mfb)8Gd&z?>8E(L-T7 z#ub_Cr;_Hn1KjdQHCp2a*Qg&5YG?D47>S1eTKKlVqe!|{Yr}m@_6{cQ`^wt zsKD7_Wni(h3Hyyq_6we=T=Z3pM79}F?8%}AR1RR6hxd+^fkzh&XE)aBuK2&`4Qv|g z#lqEBJOf8J?Eh2-hCsS&4i0xHLHZc~RgA@*a*<#X!c?9+Qlb$wG_Q6Z`ZtDecmmK# z@K9QOd^@?DK&fImtbejUY?!pxVO6YaM`>w&5lDI^CPM^Xb&BA4C;r=oST=v#)oTNi z_4h{`;lz$)f9w9L`SQbVqc#x;ZbD!J#6)}ua#h&vXYq41)pL_3O-?O_pNSrF=eo3F z9kZUZcq)<&2npCl*9{&Bmu^RhTY2>kKjb=l2gZR5wz7bzw*>x*boY7)dDiNlZW8#g z*`Gda64x=>4TuWw=bJ(U@3PkFU1@gF z=9DjKyfRi?!Bbayfs?DR2jwZ%b+VaFiQG+Fet{oT;soLC>T*AS;|T7=NQNl@7boT< z!)o;-SAr)BxgN56_)gTs3yw(Z%F^JSDSA9VSThFtc#}v?k`TXm2Cr03dLzB5seF6( zgIB-@Q_)F9YT_RPz)_$+B^T*@gKY{M!-InWc;w#CUx`O~*ZW?~N4IeHqwhDj$1OfZ z=gJzW&s*PGUR=DBiv1ADM0H(Z#5aXdq%rFK&hJkQglVgK2xhDOYc)`-*#I1rN_ap{>6_c zemYZ{C3^8v_j2Y3f_V9B9ASDL&VNAS)qh$684>%CGawHZum9HM&`Mmdk?}HBllGNG zMDO&4Uqc%J`qd*piJk5IF`bQxV@jD2gGxs<6>9IU9X7=KOi_2x;BgM#6%aeFCPYZ^ z8F>JHWBy0Da5R&U8ns$rOLWhjGAZfOqg7R%wE&@m)dCq_6rT<0*50pP+H~G+>4EW_ zgkkY!2X_1)-`f3Q+PubreL#cE68l_=I8QPrJQy>&`?3ETWEl@Gy1NrfHSrC?-sz_S z_D`T#MB3gc7hN<*MstD<-|;}2_KdjHXv(+%sS+YfYv9XKU@ScF{{O~E@dGzT_JyDp zEkZ?Hk-bJ;$z9dTOCu?#pc+;Q7%WuZeA5f7;c1p+0B1sb2W(i`g>0C3%5& z^!JleGvHqZN|1pj`W$kN+tieIDzLA*)nagDT_!C&#S!xymW7lgCsVL6xE6vy)bH|H z!75DZUENz+89ud>Lmos?-^MY5&Mzw-y>j-@plg>>PeY%b>jKqVh=AOCu{3sO-^)S8 zk+vhk`nH-ZwX;1gawJI8UnPW^aoFK^M5gHc?KxlMc~`k%3lkTL9>4cchlm2pA|V(8 zd0HEaxrM*W^w{e=_brlpX3U7p=H0106}u;dy}$a67Im3Xk+`> zw>rP8nldt~9$~JiT9CMc%EZZmunUVK)LRc3nSOKp8tymiP!{C5p@oV+LNA~uOA7F2K)_395lo5 zFjsZjizrs7?Oks3a}FenkdJW@)bfsZ)YpIgs0}RvMMwKo%=i2kN95gLphc^V~KY?h(HY4mTGoD&*?B&JU!Vy zdVzC+fZ}$)$M-pQs{!ZJn<%cNd`C@ehwWQK^8EdA!y4B%rz2o_K;{)_OX$EV8&gC6 z24^3Lb?<}f(HNN#snYQVS%x+@aVBgMw+&!Tuw1xsF4(j})3$JSN~NX_(J)A7urUp= zt5N2IbaJ^afv64?FHrz<2b4Ec*;w}e^jq1QKebP;jI2U;$lMMMZRQ(|*vh3PjK70H zv4Hsm9-zQWG;gaT5(h}`8BFfQ%kzie3(VF=sa^9PBF40E8c^+MJ3gHtYv+FWhJRE?3VO` z#kYn=;TZt407vs^Ca8juvfo%RJ!LP^lBNBExv40k4SOeNU5)wXvI>9^fiN$WOg35W zZn|w$Zuh#FkLaYKqUe&1IPV5BIj}r(8o>+$Q1*P6zqQ2Sn={Kyy}XhgCD~beiw0Ln zI`)vNI+Wy-j|tvP&^9HXL_AnkxftsO1<~#`5J#8JQ_Cd>q?N3V_!R!jnxd z(AyS^#)#VFvEkv>k2KrU zT3iL7TRk*8FhX40vN2>@a_F(-^YPo@jPif>E*!VHF}n;jy>x}ZV^I02TYZ+C1YGfH z-?NvZ&eMfeP9AoLg{K4(#@xpzkckfw< zJ87_FmwQ$l>P*2MLqmhAVZSN|<#ue#6WwNUQ8}X~T*{LD73II2Jd<(yj0zf3p`5)L z^E!L+58Eu-G34K^wd+gM@B0N+^kyRnO8z}q>0pObI0W!udRxwt|C+hIJ@!+2GpZ*L zlVfPzi14b0Q<#1(d+D1McrYRVN20;@EQbGo=(KfvZ1Dfy+puGRA17v`qa?Z2$Lrd2 zhQ+gt;TL-yzK5LFst2Xv*cw2hoBvCq2Sv|mQB)0r(j|N@PY$Vn%~i19baH5|H>l#w zR4x_)%7p{m#?Lo%gwx|pe_X!PU<~C2G=A1hnL^KeFRP))sY#_^37iTv0C$StM^QMY z%Ni5!QcKF*&+46u$wF!otZmt~wr*XlA^=kZM_ZmJ9{#y0pWa;gJ`>eOzswzi<_vpZ z-12-EetG=#EdUb)VQaq|7f03q(2qVSXlVi8zT!$H!oL~KnYt9*nB5ay0G0s4e)9`9 z^Wias=~5On#Q!sv*R`R$Rf{d}Ihfhis6cuNz@QZ-kIM~tb8gS6nqxhD%JjxJ$8+3T z#1NeV-E~@FYP(|r*jsS4Q{~3Cr2`f7pY+KPJKRmG!?}`+ZH?~Vmajwh-dZ_%Q`<34G(u~d@m${H}p1q zQy%TbC|rujQJW?kVKTBR(9|1hBfl1$@-tul8FeMZ*o?3wE{JRO6=Q^ux}&Xs=8`n; z8qlI9;OhPvIO5hcH2IM$O{)m2;QVjW+E?GQ`VU7p{coC2%+Po!2S`l-sgyHm7Z zrC^sK>7@R=?Z#R(Qi-H7UD;d6{?aI5k=6cBq?SlvY3B5TT-oS9Csrm(jY5<9xEk>Q z`gcqdVd{U{L6uPsPK{T*Dl|o~qRh{M*sW~qD0qyKa5lhse3y;WtbthR0e(PWj|?c4 z?j%4&U4MiG;f!?N(U)flO;K7EzTFx}`?Koe(tY(#56EE$BArj(KE|% zb(sU_!8Ou>YgAp9Z4P)B3G8(=AB@yu5QnglEAvVrRRn zW}A+Wr$Y67U>InzkEK=Y_)X^ufF;PXx_DAiad7QaoIJrCJ^efX~6m^A|$hyPwQYzQlGQ_(JsfOV1d9 zLG#zL!#~WH__tCoZ_^3RW_hr)fvaS@8Zt2r^Nj;w(72&8`?FV^^vduP`%&*k zZ;y3NS=ZW5UbMP9e!==7#8?TyKvNK;!RTLpz_VZss7TsI0cnH3|(Mw}&gS1ftyAAK+r_+hRWULyt+hvj;M;N9Q(VBE(`Q$zSQE>q8V`H`6O%Ja7_ z9^K4pW?vgFH~7ZiNggv9+a)pQN ziYdC;>$4?^V9mEm8b5e0;3H%^=}`C|WUqBi2{;0xq5)E>lc=ZyabAjyAl!woF=gK7 zZ#f#YS1A(KHAu{UvETdz_JH_Ask#s`j+Z~QEQVGl-?(!d)Y(+&Aaf%S{bte;r>3{U zS^$&*E&&fnmeqbIj6q|Uo?4_ z^{?i8GMG~w`s!Vywih5sOB81&q@TzJzGPmB=Z zniuh<1fU8>c)14SqWk(qa`FIbL`I$=yfEX`YRZL^n|vn8Ex%8g9Vsc0T?S3s`H&D; zKFbb&UHR0T`r{P%=|Izp6XfZzsX}cc!r=L-YX$$V%%f5hVRvt% zSl#=qSTF-E8i9jTd>jOP}v6{iiZ1^g;f z-7@Hut&EJF0>TB>Y>MZ0aUY5>3t?ew?cVSvCxYeK!oefSQIi9xoTUlyX(fPb zj;j#frGfPL#v~FBCW?WnOMKreB*S*orr#g)Y<)1)nL`|?P@o6eTssPf%^HHm=}AuJ zS~>6rvtE{^p$R3g_35HGt_ht3ZChYEz-9GeSe+RCOtznlVXYSOQ;w&>b|a;;XNwmy z(;ZXjIgA46qlI^D!OUmZ|N7-9NWz}|V z!*oigG*Z%?0@4kV(jC$r7f6GYbV*A{H%Ln(4bn&>odPOd|5_K%{g3f&zB_B{7-!Bk z&)L(8VUVxF{uof?%$^jvsW>s~CWpQqrd0H1>U58b&Hkpx%OZ_6JWL{_vJRkE>Jd2k zZ&^h9oH6{xd5MSjue%Nku8Y=Fm<(6HTN2!ttWM$qYlK=ru1^)Xh4wuCJ38@q)qOj} zw0%EP<@o(L)zXfPn`JEr*2w+DcY2ZE*6i>ZIk&-=+bzd+VNsTo9T1``3VHka%Hg=K z+W~xs9N;?usSwcY$mNCx^GS{n8=0DfBF(?l@e>ZT<#|J#I&om3CJo5u!1@Tw+T4l% z;D*u1uH*>6H!lrn*v#$8jGfM)UDx(uzXKd*uxS5}F#Z3O?;r~-IQ_r(I_xE#aFnj} z+#Y>=$w3~$t5c!>uYz3mL}?AglVWJm!EatOFi+!eNMRi+NRmt&!hHH$OJ8OiZ*YrYd^PwPdsRT zcQ^W^8@W=0b$GsF%{KD(UtrD}dprqMo2Dp6nP@QuP?)J62NgCQV%A~g#oiu*n%JMn z*NLCrGEbjS(4FRy7_wbMXoXG;TpHBI=$uT}j2=)^>Ga+HLkH6jme0$0?=JY4lt26t zVm`8w0w#t2i!Ljna!q47!vCCN-TZw84~T1C(g;6%W5NF(v-&`i2EdTPn{acpw<{@~ z3Tpd_XpGwzn1H5q*me@~gUTL)x1d=LI-^Sfn6JB>j*j`W=D@W}7GL=1qWum}pSRCb zd>@KE^Vmh;b`6IrFCL$4&+5+ytj!l>PkD!)aJ8HwMIvtpcIXV)5qw|mx#?z`TTp+u z2mY0#0{g~sKd9H1A<0KMJ*zZiz#3YGL$F7;BnO6 zc=zL1;`4-9tz|ae+cmr?sW^o&ydh>=ymmVrkkLX_pwnJ0nUhuZ%hmxRQGH%~yrdl@ z7R{6Str~Af6BZF=@R%9F{oV;>2UHRE{3PKfN>?u2C=xeK=WTA5EDET0SMCr11Cq&~ ze(*jR7R692zHx7)!xvGtrg3JOT?%1s2kskk& zD{lNdl^DO?4?6As#Y{Idoe&3biSNOwQI4DZWv(I{Zmf{AWp*@Z;8w=QKXe}oH94Zm zh^9cDmvbNvbNpi(N7m%stEnDI;o2WE;<8G5e9U>p?PDf0Zu($w&r1+S8AqehYx<3$ zF(>CE0cR~)8@A|++;J z?EE61v2>uy7*{$hgo(*OWX#3JpWNFkIFI*S(SY6wl4)g)BSpy&q5KZiGL1ks&wEa6 z8(|Q>OJw?)%Bthy>kCD^!b)AM7p4aehd%q@BL#hsU+X2;`xhcBmot2QcmASo=;nA8 zFGIo8w!n5N89Dqf0P_czFWb6l8@9PRn?h^zsgvUL{4cApr>;xRXdbp&MMXFm{gVm8 zdWEBnd8_t?y`cmHFprEZj2{?oR+o%+b`R$be*f~ z4b<83^_a6lQLz19(h5rXGyk*EK>BpLobkri<7I-xi&s}!6#cI^yLR9yada^@PK3r7 zlyLwX98j;<%DnmhPRHC}@_2#Y1C1grGHV_(i1YaT;cHfKo6IC&x=tdf0AsrCtkB40 zLY$H3eP|9Uoite9>jD##rl#xCHwB4pyFz2S!RQKy^YHvR7L%m)Q`8-|J<7yYifr?x zwJfEv;;Rs&m_1kyFhZLR{Exf{ybBO}1_G_MUWFRV;n5zp1#wW>V%-*#8EMNmaKmzd z!INA-e~bXX$dmbIN;Hz%&c=AA4NWb(>p6AbuQ~;luL_jvp~WfV!2#31y%~&n=0+`k z!F)=}t(i$$l_HY;A}Q!P`r5Y~rV2P6C=04S+k%s-Ro233>Y2XGD`WqNnew~6l6U8Z zkR>LFF$#cffoEMm%(+TZga|9Sk++KEa1$O@qx{y##!ie9scC*%{5e2VVaSlLw%0#3 zUaqV=-kRt2Fl9}wsrgzsYR}-qtcR)M1%fmc0R2CfA5QpiF!A!g%fV*8Co)_gh<#Y0k`}wQ$BLB}@ciiMcj{jjxohrR1q|B*)l<) zj`Ea){`(Or8jW)!aOPdU!0?QQ&iM>~h%xR61w|UF#s74)T&GD zP45w2Xfm{uOJ`(!|EP3%X8Ul%GT^cxal`&&qa5UoQ1yaGuA>r2s5v^*#V?!ci~r!F z6<#4QF@)JeH;h2Z3Z~Q*g7?pd2+1tTu5^6s8a-=e+DG&dcTn|9kNl(LMJlS+>l6Uy z3Bm+54muvwo4?syHY3p_eWvN8sgJsS(H)@2Mc;UpyaK?MK$t=?)r)4S!7oETLt$op z?^4dM`tu&`N0PT2=qiJ{X8~9f2s7I-`dq5QWYpaM?ig!*FSIiMlssSfbl=V*=x7~{ z8-rUg9Xt}N{+Qi#@;7hJe8t~oIan=V{Ol^9So71PS016oJs$ie)~~0_oaYe@KuTF zx60os>v|qQ1Rj?J@DsLp2?vkGE~n+b^yP*q#3sLBIOh<%qqa4$jYsG14=2ZRJ*%%0aOR{aR?uLkz+%$b zzxTTu7KUkvrh>PT*w5NFM7zJT_X@jR{cG|fo__@tla>PSA}`?&qFn#fp%jy}d7-%b zmT1K3b4hr9$OefY|7`1ppPr!aROj&te=2zP7iQ@vh{O38nS$Zt^jL+Ag=qVUwA)Z&&9?P*=laA_x;Xy3-T9!q4!_11~c$aX$f>qWH!3|S;{0uT+jpM$H zb3Ct4eR~!v%5nrp#O0NvB>#Q02q@$OI43|Hf2gTUz!TR z^{gOPwsRuj{Gi4|0TmhYAd|{mN`#D<46Ci1QP|eqXPL{tI9R^chiHQ;8aX)HD+*)3 zC8OIjYiIdTU4d|M%=mmcPm(?cJ(E7fIR<#}(*76pCjO4BD}?mV-l;+qKZ7(*tVp=qWzRJpif08-cgnttS+h^lUm-N8sEIEiDtLPh5u$LVZB}&n)?d1 z=2kmO}gIsIkbVhZp&719%ntv|JLvvrvz$L!Z3^*=fPY>qad*|8h zm6iO%W3ItZ&9h;N?#*g#^dYds8xUqKtB9SWL|a$#!#Tl-y)C`}IsdxCB^-e|ncR1U zWk3slYJ=xcH&*LYRFk$8i`X3H;g6@jBFcMs(3E%-sg}$AXaT^UfunhTv7(~6Euovv zNV*i{b988Yd&B?C)v_ARA=QP=WgdWefUx&e_^4Y%_ve(?y275%2snsUhNCt|bZ6QQ z&5VqX1p(L!2#ZNxBrBO=dRak70H-Oq?%;@~O3T(SZiE|{+t8Er41hWOXO!+wz<4JS zrovCADQxo*@{_eGvv(!yk6sK$h_?&d{>COCPbWXg)9KkJys*-$zfL|Pkh>9CW~-x! ziJ?N8Zzr$MZ%FQ;9$cuc_VbyrW~Qj@w&wTF;>GUNDut;doQ2mcL7(=n4t;Wvm3BQg_ z_g|0aWfJ9L4ipB^I=bM3MWUdtz>%@IsH4^CV`ZE&+>|4yo6g#Vw#sfl z0nP$cfBIpr=ele)5crz27^M&ha+ayvazq@xn-w@u z-Jc8YH4VFG@hCoV#KddrIo+P6QG)^g0)r${8qlB9ayb z(J!c_L3a%YIM%!>cB`Dg5sZOrf&~2!(mFWz$v|c$9ev`94yrc~hybkYiQogI5f~=5 ze1t57m=X2=cqFN|E}5-kVTbjOC(g<*0R&(2MDXj5KJSV22knLw&8>?I->H%Hr(S>Z z*L~0(b!ggDr3RnwP>=@p9JW;Njmj8D^~}>6<@@*NwPZ_9GH1It9xX5SM<&4k8)`HE z&1jy=c&EwkR{J$ko72F$Hn+v&Lk2ZqOxdCnx&~D*s2ugLuXFP?x^m5-ADRNDudLXK}Id+}1;#75qH#xDRT)rmZ@E#c63lyN|djMs~KC4B1 zkd!Jz-%o+=?W2zTv5W>u@4|E%yO(SdKOodFK9%$!fEj#k#b=>f2zcsZ5jiWMLJ6zL@SQ~0U3

uqf!%_a)?6pE2Nes{DPA!}EL$6dKq+0Rj>&3%eB#+7+^_ zG<_nzeXYIv!O~8QYdUNXP*HXau+jolz{BrA)R~xbB=E9(W`U=8xkf~m#j%>uj-$AP z=l%^Pco|@VzPtEe3p6i=_`?v+>^INW>tJ9u-5!X`OcQxa-<=Jj)V9K0gIB9g5;4}) zQpr7+O6q_;>`_(09__a}_l@`O3+MG>JZ?a4geGU$DEB%}Y@J%iwe`_he zfnj~AS56*ISOU3tcNPV-Hw5K@cWZ)fkpLCJmXh=8G*Bb z`lD4tQM|TG16ONO<7W>CFF*nDK!8N6{@!~#F15G58;2z3PehLq4zJX0{MkbISk0R8 z;1jS1I`H7)V}#~Qj7ODoInfTMLR=^*OX7qnQ*|(ihhQ$RqD#O%#DPbW4*RTHTh`;) zyyIwSWQtH?j3gARSQmXPN&nqYr?x1#heiV6xn^dpdN0zCBI>2xW6mXqGfK+BM zYRs(6qEA3;Bc5qF<_ahGi6A4)1o#83vv`~gjAgiz9V^4^sLxO-j z8;STPBl&2RMrU}I4{j&Gf@Ggq(55ZD`s*_6f2rJNDb7OAwPv|{@rzh7CgX?PX3c+zx_(~*G#K}-Y>=X+bXr9-m_h9+W0X)o`aip1$S}0*cV+X5hUKG zn4vU-hEVj{3u(!nTmdpu9dAEu*bD6902y*R8!mKdx-n%>^$gbO0n^&6dXsHd*$urs zB?;qoKbT$;2@=eo+f4H|87jmc!gkk!cwChh#FFey&u-l?E}d+4i9P_93r=|-xu8^_ zg}(N-;F_yxQTj230=Cua&5nhG8ivn7XEsPz0HXr=&mekNDk@BMzRy3Zs*@urxPAdX z%1~PC;hoY-GQMjVc`zXo|4H;Bu$dUP#%~>H=j6zjULhd*F}ZOSRWq6e3Hs1`JJtlA zi~oP`?jT9?B<)gLBf+vNGi;gej9|odjle4AL-amcHq}I230U6ae{EiAkuCH4ZoE>` zQ4V{K<7Ny|CEsQXk&Bfi36L3yCggy_LcQhm!lWsDfB%v_8$w9`l5{Z>MM+Z>Ydatk zZ^+Ii!XW@2_W`(fCX@MCt7fk-3$i}j-^Yl?s0$hIo!DqtXFgnL!*XT-$IXQT5uH1Y zvYAzpIa>)}Yag;K4yvP6>{dJ;xAEd@c{z-)0*s>|G%bh0l2|!g8gtR#f`DU(Z}AY% zOr#iMOdXY+Iu0DQIG_r-tMc$}d>|f3vPv%~`E#>dN!A`SP$!x2*q&08*%wBUf(F#v z1)GQe*Xs}rnEv@+#$gT>6T$zzy7ZtL3YruvmZIP8)kU)bUsGM#xNVt5X_-q3(>2!H z>wG}8mio^;tu4w5KWvPb?EUz9Ax**GB4iEqtMx7KS1`9kcXz6gH z2lN_`9#<6_sQ}Cpgt-ka_hXwOr0Lf?kEDr+ER07pX!Zn^epw%FGA)2NF!G&FUgP{zB+F$ zGaVr}@}L~>dp#)59~kjfzpo5gIpQp+*+oL36IV2 z+T^_F2Vz^R?YYUL?$PfeK*F2?C$55_VIsvKX_N6mWS#o5Dv*-tQ5b|#c~(`r*jV$U z5hP4#l*xdhuN1;)|EPRn)5ok=@TLnHj1^Il6r35bpM;vcz=}JdQNni&*Z)$vrkKgm zDez3hIn8QYDMeOm3x15yKUV51OB-lEmjS2!xd_pV<~mK3jFjMTu3L*`=CIm0Y{?nh zj)fU$95)81eGcLl;?N!w!VhNVw(4p%aD;91)if`vsHMCQj{^9HOJsp*wL#dP1^vR? zv*LkCJwasUOGW+ki6T-W{DbLF0jv?4B$5CO2sDO@Htr{?RKpT?J>KHNd{Y@`1n$xU zXYA-=`mSvCy@T-+oU1T41m0lb`i5~t%p_x!cSLfJb+sAPN~^xVe=JZSD065WtyiZK zHFonSby_=CauIlW2;jESe^JRYYj(iLGiI=AV#o_RPg8XM&9;7)^)J$LPm%*XMOzSu zX%KWzePPE%6VQ%gz{$t>^~382(Ny;r<2Mzj3jAuo@qh}TJ3&z~74eTS91Y^+wX%i& zXdBn%kEo#{zgMXG+15e<4>Kt^7!C4et;wsh8U5P{-!a0ScpjN0M5#pfnKu~7v~Eaeoni@_2;4qaELBZ zQto=jV1~RC_`b-BAnoWGC&XXXjQpwX)?0GzksPy-Kqcvo_GUJJV{&R|O5L%>{8$6B*-E4kjaXPu>kDhPP3=vdxnDKfF zTbJ_KW35RySP~?__)pLU?dvmJOjwS+*EE305qKS1^pb;rL;c~@?qf&Q+4=)m-V|sp z{8Z3m==(*vreN?xM7Q1avmj)$Q4x0>m~ro5pFr;s6Q7O*K%--Q(&&aNe0h?OBg*1o z6A&6n(Ea2KZA;#sa`QZNDs8@x)c{F=0o=@td2~1q5tHQ4T9naWIt_u}d41Sn1qQbq zLL0>zm*GrE9t1{~#oPT&lK z&Q00LG)O$)58^&z&?V0XRwUk@N+Wpl8@6sEE z_t}KCL#nob>^t(hbId6eBQ5^i8ldXhp?ioa2qf}F+VD)D1+)@ z-&4RVj*6ye&6rjQO(+i&9IqM<>hHxahjQcY>CnJ{838k3v+16oBuB30fr)4l#nY=? z^QohtW<{58o(|ra8hQMgvb@#wH_(2<1rh?oz=eKlEshZB1NGOGE}~dd8sAI%KmB8Y zLytOPf!U~BhF;)s+!}Jv{=>EfJ}mpVKI&sY%{&Ru%3 z5iV;tt^P-4YAY_~o6+b+`7b&>NHd?u%(LNMpn}CxM8GqaOAt*m+?h|iKF_7L<8*zM zR_F)!UGlXm>1UrariD2`8-gaGtD+{QG58!}H!i2&_am3P{B^)b^Ornwa-wa6aJhmR zIRW5kx`zl8*&)b7Pl4tS};$5Pfqe;mGci&Y5u(u#gKd1iJWQp?S$l**5 zZchv6enUgA7SRb>H3NrP<`tMKDh;qcuw))&*kGk3;mGhFJ^_IMvA`C_F>&vC=|h(% z{Kc_(J;}Mqx-d2Gk z7&{5IQbq>uncBjWplOlmlPyzmR)^o!X(3CtNFa0dUU{U^L%6>gaJ9tVl+hj+HggM zcT-&)yD8 z;eXXT{-00}rJc*~|L5{}kP#I8-}tTC0gn3^2bA%xv4eSt|SR`Bal+!Ktn3!VP$xV40ufD5@`i zhJ=y=GDK!f9d}+5sF!1Y4T_OOk=SaUw;fWI26-{mW$`SWhHwEMkPYf*0 z(wHxzUKs4Pxdf{VaR0yH$f%hSF~t}Sbk%CVMiybuD(#YL+ZFWm^|thDJ}C!1m0}udB}VZ)>WV9+peA!J%a7>>Bh!!0@--H=9E%brn-JjVb>f2YqoM2W2)JB-RzWYh7D4MemW|@b|vHbbM1S>ZU zV^spI&NAn)CIj$eXwSS8Odi_31UnJO zgu+9Ck;f7km}uO$4}@~A;Qd3xf*M7h!4osV^V*tTyUKr@aHSfs%Lx*OTQl9;`XGB` z3QTPMM4>@g^~yo}VQOUuI#H6u`~*M86nJg8$6XB_bVBE6fJfld6M=T%zn+66@jt*b zAB6h;4O;&Gc48M@Kc2amc#bMKw*n+kR&arXsM%>#w)Vd~;N11+ID!{{B1JnO@leFl z;bM-Ku|vaZk)CFbqZnmJ*``o!r6{I|;M3!9P7%bKG)^)*PTN!J&ID$*e42UGthp-f z;7V9lxcvQr-qc$1zKK2GY=0^F_K+mj=3>HkW;ImgS6Kh9ySQSrM4!W`|thqDlZAZGU&i*cQIN>FPpiZU1(pd zhs5DwiiOLnO{&w4aX5L|nN}|YCk?fL95+X*0`KK} zcD%)uCaAW8a-}=1-Ev=&g1{pzoZG;Dy_4^&4$nM=)7IXjqBf~ ztTw5k-pAi+_AEg83r28VY%)gHKr&W6a_%)=LR1SrO{#Ob)sMWO?m~$-!Ex}wP=LdR z%NbTDvLCH(o>H7_i9W>M$iG0^h(~H5ZRCiLxDU`MfUsp?EdH{(JGiVmnIWsz z-{(#GlrLgF4!%J6veI^D37i*Dy7LuDZ?&9&%OI1^YnyMazDtOG-IBKM%x~XhhlUk@ z1w9zhh!>@3GLw%F2h*}A^gWXch`48m(sKfx!*^trsNRH+ptTh0PE=7Wm793mNFrM3 z^~$MLyEZ{MS6mHfM=gq=PtKoa1WZYW0#UVkF#OQ&>74}IURTb8BQ)4rth^F^CuEp% z*O^BEloVJHeF|#RZ6FJ$AxPn4jQ&+ANX;TF^I5d>u|Mz7W}?H)q_q!7{*nfT$-AER ziN^;$zWu-%!$b@LnxWp{*HRVIlWUrC8!~MeT-Pa}%Ar?)IbByg;&-|q(<9d~fQhdv z&2N2yG*{Ek7yJ;51#*%1Y*Mi9w#dsBv0e=6dIcWUCjEhI!bj)hik~U&l!SMt&E9aX zz&Jhe5Z2>=$ymStb0xHo>N76>psPfR2R4kCUk-k++$ z{eVc;9?ar~&{iEzm>u8RBE%b73GMpX3sO>BN&Axe znL7k2^+EuVz68#_u=Gk}8+WQhl4{WD7ebEr>tNRW(Nvc>VyF4YJl#n(Ah!j$`QpUO z2BPxm?HezCyVeLwBYm7CnxmIn`W%Le36ipC02O(_LCOO!?cg1D$Kq; z)R&kE6RVt&iru7=EsXCL=frO-z*RDp1Du@qDG6a~ef%5m>-@p` z4@F{xaGTTCKYIyuAF;+=QswjwW?hP&KRlIOJowNM(0rQkklr0XV!a%`O{T;AhrH*4 zq%39FNCp`mh*H}J8Qaw+T>DgPm7P@|ldNsm2KIb8+>!RAW^rJYz{2ZPK+WNjf`vTx zO1{|7|5FsJehmNSqmNbMr9{|ui`&Gwdvhl}{yHG3GogXD^f82tDSerp)^8eu@QrZQ zwF6!hx-3F#cSu+6%I2)uPJs3*&z1qiJL00g4czKZvakz`aMG8+K}hhrx1_lN)sH0ysBXev&>u&?}zU9OM5 z%#{&j?`>a5;iq8<+3Fcy9uJ+K18*So>1D&2$P{dykql8Y4{)pz&zLDlRcqb3zJd7z z-(S}UGIBeRptzNBFXTRdap3Kc-(<|j?)7>d#yH6k>7Q({dyXSa48YJqn8MsaM8{?& z3U7wj17q-5ozC&HvX0|HO4ro3ie?*Vt^+krh=wn9Yx2*UxPj0l8N~CXITIm6d<;TI zl7Ee}u>!ZH01RrC(26Mk$K}N3%yy*}_RHnlExdcS_zxMw-Y;V99QFJc01Rr@GpaC7 zK78$uZ5UcOxYT3&;vN2wD_Xb;>R)|(5`t@202T~RY8mwmc23n(c-l9HGhD>IIqX4>w;Oqh*{1EDjEa!<&Bjy=T=3DtEjEA^Dy6% zG_Vb5NX!R>H2D%s;ptxBxJq(Ew-$=AFo!sQJ}h z@_d?+G$f5}n_!EBOmR^L>HQ15czBEv1Q_2Z{u-U_HrV#HdTMQ~V}m^KIkB^hi$%k9 zpMfCBmryM{P9QT3M&duo`7?6tT?9F@zggmVE6we;ud2b6Q26f^*L%N5V>4H0(7p7( zJ}sq?>YI7#F06B_tU42iKvMLZkUsdrcq1LL#Myyp8SuG)RvN7?T3JPua`$0(B{lG$ zxot1}m7Eusge+I>{`Mf*aut+{m%-Dip?DP0iyt*+e4$HaU9&9YJ3-x2Jz~vhZ}mKa z3mXt#V01y)*B#E=GUk)})LCb_+l{=V0o2}{S~c+{7enA&wV+PKK$|fR53-ae}xk>s8vF92?vH?S~xTpr(`2hol1#c zDGkgnXj*w_sL1QWzmn6s0%-=C_&#)HLFwoXk157yn)l`vv24ko#OW^~7vU&%C6afS z7{GQdz-h+>ud!t!9y6Ib6@ER-;fuTrqDwaV&2?HO4K!wtI09fEPp6_KlDOYr*1L+K zMfZVbu+4-iCF7Y~xltFrAFg(h81NiWKGDn~^P1&!HSyG{QR%J>VW4JI$=Ad;5QIsl zZo@Yb@1adBHJ?TlMD|l~AE5QuzGj`|+nGe~A=5dPk^4Ho=p}z6K7q=K02GCRw$VK# zfAsK3X5!P#HD?HtD>$boy=&(B3advDzE1wvjt?Xlu;U@Lu}uR=j;~Su zjcb$K#J-;7w{(Dm7f$ghA?F#xj78fR=1*)C+GK||D(U7BgiQ?=kDNyTdJ*B$GqR_C zs<_cXl7OS0^Kk?3-=4d#h#yXc#}e5K3qQ>DGaf@;AR*@|MH^on{o0#o(8;5a{LJ6o znUGYio$s?yTVOuT(X{GY&{qhxmQe=AHJxFwc~hP*jBLHwbJgvd=D3!B*Ri?C7~K*E zhC}j#`=!ed=&ygd|2-qnq-ll!oW7=CKdtMP%f*-sPUi&;Xb6XfQ_*K8hemxu<=5#z zl4zuF!G#^h5_}+m6sq98Nj)Y8S_~qDb4l&Q=Px6ri`x}%sEo$K9witoE z0`{_}7B1rs6}Jefa&_DDkIajSXFbSvF%myZY);VKXCXh|fgv1H|~11F%RaWAKqJ z2!!9bg}d!l`sRgH{rNqAdiZBYM@?k;>!9QeP&ftBhe6?g$q~LCDKpWOJ>*n9=4M;l z8}d?wc5#*fFS;Yo3k(nod-^@&_@oMM@_0|)mC>f-S|sa5-Hgec`7k^TYUR91h}!}7 z!F7oSDH@qSt56lx&uW!@wKe!ryondZbwqMEU@*7I-bno$xCVLm?HFiHKAlIM&ysdq{a&&|spCNiJ(!e1Nj__WpikvG~Cvdt?s66~@ z5BHAJ$a=>cP`QCLM95UF!^}Uk)_Iw?tQ_8}qqm|mHNVZyq|F}xz7t*jtp|X_5FxXN zHfBq2iYl^EV2oQ6a#VVhL+F&SCeghG#b%?~Y=H>{z(9ui7?D-HdWwHsh)%34jkcbv za$o@`YzWiI57;Au$WENS=OYup7fr-r0=44AJ*R^!P6V? z20hgO^Mb5-F9iyeaI8w+r+O)u3ziGSMPmg_a1gvT>An2*dmHpNRf3z{x)`T#!|0rs zCoS5!a8o>-=#dkkqBi$NQpX!U8pQ@wCe&x{yR%B+PD+N!20yXksT%fAR9krdylZKg zuFP*dWb~$RL5Jx8uiYL}yn+Uza%=8nJ9_YQz_^OClG2Z6pq=3!@B(dD` zXSz(XQejE^6>g_NygZ+k;oSK7%r*!`>>m9&q65xk`pG2ygH!H2(%GaEgJ9=nwRm-d z2Rd3GJ%$gf1{r=*wbQjBAk*s*@chpvz4t%q8YnXjg9zrg^!E@6|DS7lKz{HhVsTq? zQhBtZ$_DpGM7=7P6fthdQd8PCDE6dw0c_H$fK56c7LW_1e59}72n+=vYbHgb4bDHS zdacVfo5{|2(!RZ4++hN{AU@?=t2xftCNwcyNu;PnTg#*%R1SV=mK-nWzDgxIYoFvr z1UzsEYEOUS-ap9EHQGZV-<^z@6rF_iH_8v%)mBKF2*(1YUgzMiL;dtC8pntHP9j=g z4>$TyM2FE}k6s7o;(|S*Umjk&rojOAX9DaX!0noDe40C1X6_YSd2zBq>q0DP&#T77 z??S^p+mCp^x(tpu4dNi@5wKg^B_ADM6@6o^lH77aTj{qmIZa8X&6>`{;{%yDJc#r4 z9ZSt1&6Aons(96YPSG+(c}EIs75i6$MA^3s?>#7#gn_t^s6tiiOj7MsjFNMc_Q28k8zTw>q}WxuH;sqw`M)Mx+= z_E3>2lT6L*KKDFJJBUXkU0t|U{cbS2*=-C3JTQ<-@<*BhpE&{s1@jk1O@z}fA z`)|}evXicbbUydnmbd|XEGw!2EDD^oNUiFcAI7&^^Ik8{|4(=VnN7C$&P|^NYiDU7 zi8^RChiXN|sE;P4?->vHUoY2nyH{w=gns(i&4tn#nHBRYmBa~vK@*fpNzja%99!CT zYog5&|Bau8Pobt(9&R_5gmqrp*m?sn4RF%(v7Z}pkZ$!nlRAEt1b=>Z)7Y zKU62VZaZLj*E zeC`XvI)NJhWQ<819vKqp!n)fOh)B!2t%e#Zq!OvacTvLHw9&M0O_KZ#msG%V z5t(6DFSyA0JRJdF8wQ7GxM4*p`R8|+V-2u zN+$88+y2ct3{wwG>wbi3urqG#pBum7{&)V*iybdl2MMM;nG@};=WgR+oS$F@!Nom5 zh$DaKi_}I`V543#?$Rs>QXzF{9C(p??D4n<yjAb7$m9#f2QC?!nqbaaQLq zy+;QgUTQ>$3Qr&RL{zkfkc{iBOo+(^r?iUq=z}HM4!I-VPs3XkU>wcbZ$0^QLgBRe zTlpydf-aM-!KbR*x$yq%3(QC)1Hg20V7`_1FIa321u|c(=K9|z#9d)uGh|j>7u9nL zWxOS~iTgk?1qEWrqyFyU+X$k|l(34-Y|^tb#*dKX8+m=)2Ci;~cq?Em18|4N{1z-# zO)d1SKavsf#=pK`+Kw`i#-VnHWR4?>-?;-Ybzq0?<}Xt&X`)(V6=FK{;B&^DepOo% zU;aUom8Pl4lbPBcrj~{w-DCtT+gJ?`laA-6HjSb9`)N(V9p*8X2WA8UFS)q))_0oZ$lrE zZoXd_uTG;X__8Z=c(33u0J8>RZmnFJc8MyllBZ`5NxeSCwHkI52=QUIj(Gj9?8F5b z_6P`bFP~cDoQH{*C@v?sK#&rl*mCYa)<*-}m;2J6HNFQ4gF@M@2g3_0y@K}- zq66}?$2hi;*7#MNK*WhKxY=#`3K4x?i_y%*A*dK}=N4Z;dJMfRHk- zAymkb(3a1`Z%d~)pTDYpy!oMyl;RElx5#IRM47O{wi9&YC_PC%lL(z&uXl1EbE>uP zcqDIq4L_KmR2f^+6eFnlBKFd+F!ei|ez;`k>tf5lt0BTCP0v;vaj zfIosk#mPwUSZ%`*e>_Ys3!U+|@Q<0)Re5^cv%EhE*P0ks^y(;}iV}{ik!BD&7mjwx z^R>F~-eysGyn%?bc~hw-U%T)FXp~^Hgn=+?=)I(!xPP`_np)UJCm+F@MSA%FZ#$LE zuI2n4e-2oG{C`Ytk}cd7lE)UpaSi{>R?zPIBXiC8%Wl8;qnS;j-sD=KI~ve^6(YuR zb!GS7UvfKQQT!d-mr1KmB2SEo7i`a>Kh~kRZ~+4nJvo47zU-0mu~XVJ$s(Ek>JJbJ zo8kVefi90JNFCt7J)8->i!I=Y-JOW+j-Cm;inB&}_0l?Km)9iV>~-gD)t+3G=!|bH z(Bu@#<2-DpDX4~d@IBKp7SHtHXQxiEP>im#ZyH&@oR9a1BU%DMTVPrTj`Lw`#(t~liCw{pKV zv+`vDEQ25`4LOb_P`6P8!RS9bbr4(XCgFy#e$$I2+2k^-m+qfA-u2NS%0ND&hH9t_DKeCRKlEx8>f5oU1zV= zTB1kbB+cv1iyUn+8(}BhR&Y}sIiLq-Ye!`Bgy`WG*;|}kQ39FULnD^Ul8SX zl&_%vEJN`4%JWYsob_&zjIY8*&uE>{_VB!H3U;zR#kx|%?{J`DieREFq`xmKf1!PvzPv_#yH9s`^-}24xri)pu z-ARLCgDVB%Lywc3Vo-F4lGI}8vAPG+^qpTxGWSk%?j6dIR{O_{>)loV?Bt(jW5Bdf zfo#nZzt*DVbA?;o8;;zT@6!Ckq}hZ@F>?BJ@Z!%hrvVsLJpNlI8`CM?NFiYnr7!yh5j2PXQjUG$!VkKmo zyv$wi0KPZ)#P^6M8;}^*-N+5Ih4Nc<(|JwN-jMtq$J+YOotJD(mHI%EmXoi}FMet#SPmBGk= z>%sX#XQuHh{hJ-RbgCBuI4o3sc*`A~u%$J*4KYzn{&NJ6N&7nm@eiJ)%1S6#^N+Wh zpg2PWp10u)wRlEaypd(9jW41U*Wz;<7H`Mu;#ataLxK&tU=B7R2s2U^jb-f=uP!N; zYUnEaOm|&;xaT2HkzKC+g5D<{tWE=s95mCzSv1cY)}2y3A`)Yfv`U5q=Nk9O4E&T> zgZ!Z;1z^xX8LR2vbTiNBTuk43VTw}K}QZW4LXKsk+jyA?t^Emzt6_QY_%AT-kZX1 z2k$kf-cOsZ{s0WBoF!$9_Khr}_FCJ7^A9Pf#JC~wXgO}6REuAsf3qrv17LXIKC`KK z5q6Y9_ub~L-MzlQ(2qzXhv%Zl zm@w=DvE#oWZj&1TWAT8mMkUJ(s}Q+dI<7f7?W}`oWZXgwEpji@_mHoS6iJ@~L6XM> z=WK3XDY7ZvIWffS`zi1B{>G%VV8{X;L#4t3hzU? znAYc`Ky=3u(%2DXYPjIny8`k{ti-0nUbr)nA>@8Le4+9E$Y1pvrn8Z?zX3-M-~%1; z;u~DP$IvPu)345`$q#zg=iCWnOW*HFwUeW(h=^K&01IV6lLKdN?IAbggh3^s0n)SDpGrbKMULSu+bx zU?XNA?5}K|ld|o&o1Bxs&BN@GxLSlj*(W}w5)B}bGe<+GwH7Z)Ey#CmVYQW)iTUQUe(4 zXi^FvNOcNG+nX3LB@nCGm>ET^q~+t&Mu4fciC{JZ+IQmQO1@uttBMf$4THIzK@l|jQ^44qXu?~6>2|D@# zqB1lFMX23`R%j(pfhS?z*hJLqv^;?=x(ekE&5I&&^m&X z8&?00fw~|6?-z+`gxEuz!Fm@Pph`0qBE(|$`TPDO54V5xTw(#aTAE?JWfix4K3}fz zrt`)e%77W61~cm|(Qv14(Y80}PNP+5x=2!Qf=nOoQ;%9OE$RdB-vcw+fcNFtoW3tU z0VKa1r@=A&ErMu$)N7-A3Wf^pB zqm*&he&sqbR)5^>*jsl{e8#Yf1dy6F}Y^V znsde6v$J?bG7dWI{i+56(z%|(3}YO%3#NSGoB1*js0AaovatFmSS9~ik5~PvCcUZ; z0W}^LILzdhGf&Glxw^xmxSW^1U)@-)O->TZxV^uXqPmWb z@PkH{F3^@1s0sQUmm^toljzd#RK|&R$yeC<3V^maQ6M8NKlZs^ z4#FjHAfnJMunkGdM+2ZfG?zd29z12{2&qCC8S+8O%_@vc9q7uO zL4Q4EejZ{PMi;@vfv>@%Z>VjIcmz`+Xi@D7Gq!5p^vXanyak6M%`LYw2?AhW--1&- z&)2EMZh8DAa{T?z@vQ(1)lgi+ejD)*Bw?)=UZ(T__X^wO3f_8uUV25g`*w%cPy?|Q z^uR<}Dw2Ct1Q^sOs|G&T9W$P4pCE@RtnsN%%@00@?Oyxyqt-cg@#dHIHTxjm01h|wOi|)L> z+l8vyw9nei_X`={UB#K*;P5bNHH4Cw_6vi;cLCyrnO=LmqQ=mTmr!TN85|F#;(S+a zDDqL3;7D^2f1K`17&@Aki53@X*jx?kt+b!r>FuaEN}$ zH}31I_urGd4R@2UP#=%PIhH&mVcns*hyS1N#96Ivi~sww9)GM_dOMIyemAiBtzT=F zsQOeO`3`R7{7s`I-p-3*0)IPv^&gAc26aR5U5Hhl6GvCK`d5TPF}uHoX`3T%0ycXG z3Xm4Sq7DXE!}CS(E9zXttuAFDZ^Aty`F)$W`$QifCRCGJ?_pU%k2*Az=xYxZ)o04p z_LF;Q2jO~*`9{1gE7oOOJN}3%BM~KY00xHqx3k#AHlI zy!oQx$RuF|{F_1q_8G}q4>wG#%wbGkpUUIqIhUJ1LY!xMgyM6AS4=E&!xVKyC4#7u4nUuFU~5_M$$`z^#b&7B?5S4YhU3%u zt(=|k=*|^6%e&Y$?U`)vzIUD*;54=g)Gp>=_0hj^U zTIq%(Humq~ph8Q6>C9dGdk%qz%?|T^$gq}f6@CXd0E+`B+Qs!ChE-FX7!#}qQ-r$Bb^nJg5eUmh)=A^8d{G*W|NgmF za9R@LHp2R=GEQw1cuF_>>4!|T`z7G1L4aPdkeOc3w!nAU6ht4lga$&eiN+?#t!D2< z6S>$p{(Qd$f>58_*lTGuQnj~Y3B-&^DT=SJ$2cE31X76cme;i#;O^!C%bb4@%FsYI zMiUkxkc#RtV^`Gz@eI#CDvb#bHM4H|35iCWTab^2+A^2NIcZ8k!KLzww6bCix;BNl zQfBk?zUN+t-kN^Dd4O(t!9}@amJ)2p(|o~oCFEvV63LKS-TpW7+At~0G450}?*{;5 z0bvjM=K5nx*sFv7|-e~tb0 z{y{{Hvx_)C@{MkW5+AhZU>$1F0TZSF$wa|6>7a7_=J-<9#vQHoCPUoS;0&H#1WPyx zR%!}gHVC}#zyb{r^1w4+Ax@vO9}4eNJFh5^dCTgBL=&7==U=~)fnfqZ(&d4Hg-{_r zXrtWoYi8ZMQ%2gI8W_uUDu&H#_mSKACzjEY1LF$^86;Y%ayJrUhjV%Kt2+7DWT@lu zGOzE9B>N}eQ2#}j9#gYD$IQ;A13B>G8*AGBU z)WEBbWxwlki8;UmMN{I#RkD}AinC*$C_Cj{YLEZtF4=9MM^SL}Y{0k4R# z#s1u=8{Y}^sr?@-W>Ry%<{6ioGp#YL7VM{k8U=T$m62tv{>7H`MhtIFVnFE7p6(G{ zlX>{_bFo8#wroOus*-EdviB@4w%_~g*4pi-5E8&$g?nNJ5`OIGzA);2R}F{GsgLC@ z`O~QPz~;x=-DJUz^)&$)hC=mpff_zv=B>4CvbCC=yg76Hq^oUpnaU88aH}6}Nf;!o z3N*E=+t{Dcp#tfu0K*C{S$+=@MH(sr@z&Xc44-%3;x6hcG zz<_9PG&2N%nSyJWR{>i$m&V&5`rE0teYcf>Wl9Ck0*QNt)LRqw3mQBC^8sOnjugD+ z+o%LSv*}#QnocdxrFZMRwP;`M5U&r5H~KV5J!iRaR>{s>vHC%*^U!UpF# zJfo}@!@^F46?C3DU`W~M$!kMM%-QNa;k@U4%?UbkvcN7Ugd#qSnsxS!)3{AtY;=T} zV>My*b@2wv|J6IgMg>`ZC~q($#)gAmW`$5tX;kzBSjTyvrR7BKip6ND|l_5WrZpWdZrs`-2w zf9t*$xul@{#F1d+_aN+Dz#af|2P6-g7_v>2y9kpTG*UfmeFuyz6m$t2AZ&oa4x%lx4E$B zetN#dpEOx*e=qNVMI<2QY}AdD-Kb@%@j~8N0@~@5pJ|^fJ z_1=|E7&WK)H+v~*Bvn`p`sVq(YrgaXRh7Y1MD05u*C!bZ)S6SzGT=M#is0N%GpPOr zv~LwweHHAPWZ{tBL0a0;5updPCNt}MAb4MYc|@2SCKD5-&ekn+g7h{0jGNpWQ;GNx;|%A8`Ijo{pfFA|&bu z8CC}k0VTX^#~aJXTePps8~*hhrx7o*p993)@Y4xo2pw8rGOMOcQE7tBazJ#Fb6{S+ z)9!B?86WEpQ1ye-sZiG@`|T|!6k5S}n}X*>SF$ay|xw-biB#NC1>16E6RHdP}<*m31+{to~W| z_lPrP#tk*shj5)~nB$ufU}FJEH`d4*8@_N^ov8qLrjCqQDtF3?7N;3^!UCrrcv?V@ zfmKc|`&OuMe{a6LTWc=ALROq2`xX4*ecd1pK~q#*>dht)x!i{eHJTw)HnpWGYCW6T zZ{DfTjOau=Xs5JsEk8OKkQ4g8Bj-H1=lq7?l~_SuU+ZLF%{J7DYag(7GJD9E_{r@( z96nF*zj#*?&`79d1)Ob#2$GhpJ^wDncm5#SZ%ecD2=u=p*5uVqC0phve>VndB`5_@ zofy5Ghfgl=L&YL=DQnS{L?{Daxq~Ut@qu_kYKIw^gCi!S%Y2HLvhIGaG4F#%UZ_Ys zKNF609Pi8JhprXLR|Z3%Tyo@L=J+;CH2xM14=a!hA6|HoiH04V7Ht5}E4 zI~UCVo`Rn0zbX8Fh=?7$&WmGudW`)W4)*!mqU!usd+LjhM0Op(U{?K)!8{lD>8dQ!A2p(- z#^wA!WTS~gJ^(A?4CLF}Ti}-d(laHaxes#!qjRB7a&IkQxrye5?Xsp&)G5 zAFnAk7|U(KfJbF&IBr~&w9xmkw-t z+pjI9SzJZskmEEd3&I9lwKcx10t3tgVYel0VL9JT#@4#VoE>YEZ~ff8FqBZ_in1Fz zUTE+|0x;0833)tY-jUE6b!)UMO?XDd{5gp@(p9zkl{7ADy$|-6@+T1Cz}q=b0^xQd}(r;mXthY?G> zUg?;|mjNb3{Qs?UOn~sY)^$%vlcoDJL z`Bc*yi{iY_fPwt;h^07#r8kE=4M|?f2(uZ8z!0G(A{CbOqB2L+(vL=~-t#7t0fZdc zO?s|QUDjq*s{J(3h?V&d13gXeF^kd5P~}BFX(J>RPVU}Jd`52;LqUsi#DVqfBpoGb-wX z1^0S&%Z69r$v=5dlSmGS?N$x44ye-80T-Nml1XLe*YjUPZ`QWAG}Q5Li}gP~Q@Kl2 zTjfYhqILp#qXrNsMCsVh#{V^<{d3!%b{y|a^eN8d5yOJneis#Dg$M&kFQ$Mv)e$+x z1Ng#=(ca3JQ8^t!Y!O^kAE)(ld*vtfUvq&<)B=PV1SJs8h}$+KzwP~#Df4kEoo&O8 zQ?3Oq4Iz!jF&*@8xPUNw_Tm%zGHwhbAel3u!pdN5WEFK7VQsMYrZxK88Vdk}euU#D z`BR`@=S(k?KKGF+_>rk~?rnVnnpEW_{ISfXMGydkhM)Q)kw{fp3i>DeHxpuN?k?1Q z4tQZe^&yD;CVI|N@-;YDRAny5ViDLIRA)%C$VjzqxDRM z%P|_Kh$Tz7+~f5^;n^S1YiyuE|ZVQj2Vl>^8RVLmS^M)Pq_Qkg zT9P?Vj_2$kTND>%ZK{Y~;XJ-Y182$xl|JB;`aIg?hBZzmnvbG4J~wI2iqVF`LbPxN z{b#o4CfkGhAQ|{S!9=wgem*9seg!Z3P3=Eh<(=79UOS}G2EJ739<5~h3HaB!o^1X4 zP>aEwueHp_?gnXR7^>L8HQ!`DHd>etx;Na#n#O^uLkt+DOQ(ql{#~*a`POe*OJrtt~2u5jDw- z46qzpz{Y;lx1I<1eNt)CkWapLeDnCYzf!yTTIK~tfyh{m^T|GpG`KL6rZuwtJqEu* z{73yt%s+LN%5qS9VEStMc{1AN3TXn3;e)V~-Wv__@829uNa9i0ueK$rDyW{N-~?35 ziqUP>E`VNcFx0{2tad^?ieM2T|6%AK9DW$v%wB$4U<%!6b(=EZvD*ZCeud3haLcNtOB+}n-M-M(p)=f00oFR3_m5aODF zkwGJ#>3>`#xvu}Ty^Zm_Q26^qd=3F87Xr=D0FhMzX`wb@x*0;w#v ze~jd(4i65#c{JlD z7HK|6o2`QqER|jROchqu{ph~&CGv}TE4nQ|WRtJ66MTjTI*SU!0HFz&Ecrx0&q#md zPfhIm73+Ml!JN9=p+Na8l2@NbeIlB}k$~A{9F#dF!1>`~Qm$B2Ttk2QWmf*xOOe>k zr7c_(6*MH_6zld38_(eb1XvPqyKLx#k7h77`psV(|3VDbKujap;8m6Wuw*D!B+QT& z4eY8S2(upv#2uItgE5CyzI@?Jbe1EUBsJwOh@VjP>p2#BA25+!5a!q<@mY-5?Rfbu zysdLQmDsPd0tXfR7C{2brOkp%8~_#r!u*-3ju-zm#(nmIX%J8E(vq^inVQDlda1qq zmc~RGeDgs4GLh}ou#W2!Z(gfhk`OJXB~f~qrW`ER>3Vc;mjrJ&0I&q0HJ2Eb_b2$g z*QB`DKV8G}DmGuY3$8=IS2Gr2McY;==vl1|W+Bu;*}^u(&8l3+p?0=Tl3Fzg@0(^o`OENXFG zH>q%=X}mA8qZb^-eSJPzLqghU?=YQC&GqT9CNk(O1=2$ z_mN?@RW~zwS8H@U)SOLg?GCvX62?@9ukPZSq%-!j8i4phQ@X|i30(xQ24^6wAw5Lw zswj3-6zxnojzsK&iWAkgAZZ6i7Sj~s8s>s8; zhj#!w8muP`t<#yG|zs$nOb9i;GvrOWD1f~JUH~@{16*w@^ShS8XPMA>|eJNr-SXM=Suz9nepKE z0^ewW!9>-J3_WafBV8}Z1=XC~#dr+gW)5Fayq=KAC;qCJ0un)XPv*3NMSqb*i;|bZ zLs5le^{+Q>n&zRN$|jE5^*QO}*`i>R^x&?TQ!9<`3;M`~WBeWIJTbbN6#K2YT-Dif zJ9K+!Y7Qhuz&;flup}JjU9v(fz3*N9TN6hWvh7bOxZ><%#mRJ5x{WabN*1&%&U^bi z(ICDxxm~f7QLpNSFb4Xp`)Iop9@Q{GH}R5FV0EB`u)Us7$Do+@Ji73zU>*OEcZ}rn zekG>X@THT&YC9Zw4?t@d_{uhB`Mf_;>R70*wxto`D0`j0E5OWgdh=m(YgFk7#$YiRdID&z58Ia`; zz@YE<@Mn(%r8-k4+v%cz5!vcLI~wG~JNxX$$KNE?J6rVtFz^2u(zEd|O5Yvf3~0f^ zlA_`d>c1Vf!~4Rx#$R!MtJ}F7>joIo{F_= z7)}Q+)d~#Ywh;o`2FW6{Pu@o3QeSf{Ccvl6`8jdQBN8Z^Gu`Uh-b1uv1#X7|h|5*j zf816po&Nkv_p&l!a@NI0XDa&b+2vcZ4)J0_Ama4N$M78kBO~Bp2FM&MG3FS?$&;A# zg^gp>aQ{shib&rMJ_?wD)?5nk8k%S*n@O(%w`v}i?imtN;0jW31L6(EQIDs-I!ZoO z0O=mp9oXiR{mWu6f*II*45Q~n_&z4H#6?PA5HsTS9-ubF!J+krt?p`l9U^MbE*!fS z`SWL&oTxU%mCi>>!lB(-9`xjc7ZBvv!sFwyv#&GFS)b!}VMGsSi$~!X#ssDemY#iH zN-*%$7K9DQ%px0Ha+M^N^O9B5V~^{&o6**j{Vq_gsOa{M3kG1+AZ%UTUmVt+we>95 zB8@!Xj1ZFk<9!l3#<;pG-pyJEJ^+JS(1-Xm8&wzHN<7I|Z2HpbiN!g(b?L8%a7=zC z07d`7djopao-{SZxc_AeU%ozYMN;>1#bMvQP3aGGK4-amaa`L4+(8TQkW1uuft_qi zOH6#uzxzBse<~n-D-h@?uNin$;=sl68FW^FCp$N>t7jWlIn+q$Cv11v{KsV*9Ck+7 z+R2yHu}rKMz|Up~oP#isn{RdD86%oCUw#f{C&be*_PWy>y-iGUykPfVQN20?p8#I? zgHLqeKaQ8XrfA9AH0Fw?LHuVx?N_!&)kOCij!r*6o$4My=s2n02sMwwq6@ekAd~ibAMRwmPkpOJBU^8orB*OZ&2Q8feJde+bw!#c&Y8Vti>jkIP~vFO_qc`ObX$U-Lgu?>eS)NL>}) zFn}=w?x1lYeI9+)d>&MWfYmf`FU#|DrRg^va^hSwR#Vd?*YY6v=7GMA6vt#RBR>QS zx$scGAFB5#^P*Tg*0JVvNx_>je7C>`ZY^kDK#bkq^)zFi*GvVQdlN|4J(e@Qm3|bH z%qg&1-xiD$1Gy z4{~q5r6Q`%;tBST#{GKv3px9}2KgRL%Teap5CDVz+U!}QpmWRoWz$$er=QshrZ^=t z)v&6doWJ152uI~!3;>G;lpQpRV=j29A%~VFkG%Cqe%mNzGhWFDR9CZIfr;{?G}XOU z@JCmG>xHV?vDp!JLXUj9?+mJekn*Xr<7SD8xs>Z zdki-Wx;@4&K4bZJ`jzs)$4`!ZHFG1n0O0SO(8|C#?c=kL!;n>Mi^LHb`GOY5JnN1NwR%sBk$h1b{e25hF*~9%C%W=mGfSY!mrK!EC?$smpI=HqYNoEGdrn z{kTc@MQbNcGQt8_XUGz=9JXHFMI18Ev)b99a?HlNu_}xFT<$W;W#7)3p2-9-ctk)E zIT&c9k~Tq!iOF}LU5=~WEps5)4G+L3GGOs|d9{55Y!x(m{j8@j1wC-jIj7PNTRDv* z(asHyhvfQuU9;6+Yk|piU~PfJaI zv?cr$OFj<|`{%P3zd8{`tR1aaUhf;imduo4a+B(|QIqP=4V-{Z^1|l=6rH21*F1tu zupfmDrivwsN40+Y=PhCR1SeJh(1u&R=&g`{wt%J!c>3HB6I0;*-!-a;1l_f~pWiP8 zM)wRRW};HeRWzI=zVMBc(PE&1<~COUQ0l^9web`>Qv*59t@;4KVw^)N8)9*+93 zG&UZBHIny!X%7QZIXr5B z|73QiFgJS-T<|*%MbJ?Bp23I!3qlD>o_(EQaIVWN-J{a$CPpu=B1m%cpHW^pxt1qowojN4GedpjbtEIL)q?G`~ou?%c2Mb03v z5W^35fU%$UOf>RE0MiRf-eSD=*HwF!PS3!&ew!!DUhm6M-$&_F%Y(WVjuk0t+2s5I zT`%_CNXgxKS^r3YCx?47?9=pa2+kV`!!{Hbx^)t$D;&2m3kR0!X>cO=N7(c5!7CVA zRV&>eFXzt!cahTh{Q`#VY+(6!ix%1n+m9EmaMNyQ$e?UifdkA{`%}*>s3p3MB5(N~j zckaOJX#~VoexeVk>BdOgQS19dRB+^pzmnZnftC9WRe+BHZXH_W7b?a*ge%eJ7%sw*+NtkfRU*SE~LVFP1V}<8PBiJ=}sko&`*~5md8Qs=eyp=q{}U7sn8s%zD`DyZ6$qJ>Piw;Ml_P zKT}1a2baykUAUd-)jwwhLph*y@Ggev&wp$FU!%69V)9n{N>v2wDkN8v=QMmSG&g-P z0hm6}n#-}KU(qvqoakj8&riZ)%;@C&R0v2tDRmwk3#M4pEF}oQp99cWUP1t@chz=3 zV@KB4Ny#@B`Z|Q=+^a&5!9_+%chz{8|L?duiT(V4a-3 ztF%QyScF06Bka&7g-a~;^-dR18`4iXqb%ViFTE&oI-ZRpOPs&3kcX2k>$>uDYb~f` z>Wttx+2zEBgYYXvJWpHUZVu@Gd3KUZnD8cr_>^ekp4?j3i}38!95648!8I1RyFB$z zXG0#q`R%l3%GWSQCB&mn(j3@LNHUzm{uNj}sE${7quU!aa9#gWvY{i$@@ruVlRI;z z`~LFY@pGGiR?s}geVRfMPMO?7n zRw$G~4~nA{gG6)FS&svney3_c-p7(=uc!Rt2as2^3~?< zF7U+oRTn#FjcN84TFIv+r~vIaCd26F9Z{6QEF8T+g@3a$Y5gobYfMh5hIF^B-6{g; zjtxH<2*Ni(B{4zuTJUV?;9?lNNupKfl%$|{SFwp_~5_&$bTEhN^51`s>I`vDrr z-a;rd$x}<`8{bi=lGv=?RTeSwC!`}J$D-&g1$mRQpl}8vxCBwZlJXd7a=n$aix4uY+qt0PdMKwb4s+TJl5 zN7%5p+4i=TmKA;$7ZD%w(aF#{M{d@`_(Fg=zXq4M6-ODt9q-l!Qy|C69Q~8sooZ+& zo21A#I|mb%L^wO3cgUbD=;T-7g(6K2yPtNS*oxOaNuMrReD|8saws1;Tpzmu1c2WH zw7B>FQjJgj_~mFpN}0C0_Clr_Cbb2v{WgY(N8GPuwyfLj7lPUax^>0@G^6xN|$Fo2~4$95U1?;2~ z%%w9xIvrU#VI1ZJN=O@1gZSz-LY!$_?bsMYK6y(;iYsRr@LWBRM4=+Ur927out7h( z!W@g!^gUrpl_)j)OdCnn{d0hCvxG4Lmt@jTu-~j&=`;4)Su0+kkTfAo zdI)BLL~?Q7&dNv)H1n7d#7)^Hn8@7Z9s45DkA;{V&5s>iu(p1%rE(f?K!ww9;hfdiZM@-2njA9o-c`XADPHDZ27KuqKzu7u@93#G(RTC~xQWT)m)Sp& zb&_!#A11kI;#wP}&ahV1i1de+0Z#hclick!9;|RCS+f77_RYGL(ln*p&oaPO#WY-0 zmVW8+CYlTe^XYj1LRI8|JbR9p+*?Vt=|#>Ik9Xp?D@c`xe{g%UL=Dt>{(}a2FzFop z?Y50RC(ufCA@xhe8skPM@^yk3gxrB&`V^#)QGrTTz}2&e8s1MSw}r5CxZC1qP-IV# z8~ah$MOllofCr|&q0kbzdeolE5|OP=&={O0tve$FxxFH;24sCf9UO9I?y-F0Y+<1% z%1^01^s;1UKgPOdZ!pg-%#uFVu(p=nFm52O5s63CALD-lRG#Gjm0f58WEcK#6}*Af zL9hRwl3t`=5-gg%&>K=_nE6FaQ5e2!EGHrAGHXTvA8Co+q6V1LPuYclByVB+{o)*+ znwyK3V>unx&00t43^+?l7AZ}y`XmI@sbT~;MripdR?VEt0ZjLoyi7~6!t(#{e0F_> zT?kF~Nxlw*j=HyjB~v6papC-Dm5%q)Q*z9G_K->vICckw)29h`i}e z3<}tn57G7CO=BgHa^=-ifPDi=W{9Z#_s>J8+0q4N>HdFQMMC3EiHk!}a+6y9bMf?P z!H77hrj^AlSIWhv6yoI^ZHwfdDM^5wHeG1B3L0E+KAicXf~F`m3|kcyqg9JVSR>@8 z4N{|ELaW!vTmc$4U47th4G)X}1<-Vaa?u(eot99oGDTmb-Rez!k~b5+x?9k7i{l@$ z85m8%qXoK!vd4N-yl>PzLRxssVQU7|Sk~Hj{O1%+Zv^VibAiHh04eaKq-?*g3MASg za&pral93Kk)3t70|N3PVgl4V%j&3q=0~{SRVDAI)XF;le)4}KAKLaqLmjxG?T2&cK zLg-p7LvP9&KyUsNW9d{NV9%lqZ|4}L8x@y8|LrxqM9flZqiz7~7Fz3?JJ=pHD%S0* z5Z1bXYvf}R!jyE~AuD{T6Bpu$&=h2tWLV(z6y-G!5VGZKy27`oIM;SPN}okNfYi3a z1-EsQ5|Y^{lY&7>-3`p)C6MR@Guu^@i^GLJZ4m*21oH zR94_(p?NZ<m)(GtP2VLUFaS1H~=dLVO88E zW=yh-9zz@122>(Y3S>#PxGx!$W2u?xpM6VtY(I0>hs? z-Tu8)dc1f=nOom6X`*FFqYbph2DWu5DRZNB+4yHx>DwhX;tSf&5|YeTDYEULb<#E= zML7TlvYIacV5LYl1yo=rDQmJH_e!Eg>#DyL6qJ z(HLE)cI{d(GOmvKI+0RH<}lynspmfT0DSp!PZTanXtBDhcDU_kL27K?eLmb3aUbLU zM@O#G?*%{TB)h;}g__8yQ9ZBUYv1PC!3)xO*e`5Za%f3=X}DC8QeP56wll$91=%4N zY=NZ=tR0~Qap$>qJ6>5nZ94TBAd%w_au__}3WD{!@V0#^&5_O34=@L!nE4)uA$^>I8P_h>2}0bI@r?1iHl zZVAT#WrhO_5o@!O<0-e1`kbvXXY-e;<3*YPO>aJ{gR;~33K#f&I#}-L$+0K*E%h>H zqh9K}?(m|+-Z3R@AhS$UA|w9YbF@+welZM2u&S~e=bPdMuV)8@VUFxc&3*J8h>*>r+WO{s^S>z*K{44EZi-e4Bhx?$6u^_w%*xhHy$^t13?;(mQ)$Jo;|Z zF65`r-M^G$`wUU(GoDAW(CN2cHtMKRoVM619qNXv;aQ_J0hbw+jq-Ejur6NN`qwEu zQDXU(uuB;O2S?k=lxa`=Cn9%I9ndKs*lA3aK^HAO@aZHHbw^G)#!9;vIzIBK_Q7iU zX_-eZsXy{l%0_-Ta<7(*yWs-@ySFci?qkKn;lPW;^FGS<*EvgV%Rr}4j;8VBUUO=G z>??z+&9JQ%@Ab3Col%qXv~%xA^{K)1*wI&iXUV0u|ZHp^HGG*)3Jo|R{P81gD0R~)e;D2}n z`F|@iC%$=a?Q5L~aY!iOv5-RuCfM{*wil-ax`o~oOEqvO%vC-=DCF>Ej~(g{rtP9|ZvIFfUPrB}tWMhl zFeu}*!dmM-7y(PWJyL*HiFe}I`+5jj&2Gzw&s_(Axr1AODk8yB^&y9)eM@TJ z#3fdntwWZ}=ZGlkypmicpnejtd4oWk_v%uR(7I|L&QJCEx`G>IgrZ z;-c$d5gr+vZy34GJ^1otG_itlQRRgX#ar%Gtq;KX{J`x;VuCqjr0JZqMC8*ED<*QO zCZZINGg3JCpe5ZD&44ou!vxL(osj6Y_q#*_Dzk$3DyF@`CE?X-4tIS6+poV>V2J+& zb{`sSf`M7i%H?~AO(~8Sn8n%eNvC&N-{2~kwNAtM{W5BO5~H+ZhAq@cV}#8c!cJZQFetwx%Xi*Uz_LBrQuyUNOO`d?d`Xy9 zAj|6=JnCG`_Fm9&41Uf4^?oeN`(ZALp?X?~wCAKrTKtyHo&Di3!W~JT%@vYYD0>UY z9L3Z1swDA&Yw4GN(dh7kxtW$pvWIqx_h+(>&F&3KX21OsP!U7pc2yUB8HT^MYkx6A z%yz1bPG!r@L)GoR^V({Je^-eM{au|0+zPEk>vfaB5u2XQme7H6iPFvGitW}N2+Cmg6`9O3EH`v%axW<-h z&Wy{2h5b?~I}I2#7O(Ez2ILsG(c#}TB61j(dhVd2CMl%*#e?ducEVdE_p4`y_A`|{ zHYde!VgqDPJrH0YXutpG;}tNG5G>8{zn>V+jB)+_?>{kI_I~a|81K=M@ug0aFn`?` zC#UQ^JO6#rZ33k|W3~7UU_3+qqxRz)lTD_&aDDE$DF~6(gpHSV0l;3!KtC_8$S$2O zz(s!or<&k|VQoi5m!Xx#8ureZ-8ZclQz%S-w^Ae=NHj`T0M-ra1xb>r>gpuFLmA#5 zKr&KRQXb~?lK5y)ln#$Dn#5`blFU%+C9^vXS3)b#SL28mm2^EQfrZZi-S46q=Bk!D z{kI+%^2q>pS~h*g8P0CvFpsV9+}HWaFgi_kl2yqhP*8)WB$N{#>M)ChC&QujVKA_M3zPD^+Sp;7JLqhWTCYg^Tp#hNG6Ow(J|&s+8C4CG>KqqLb#t7-ju=!G%<05GWh z?xKnKRVOKHePLzJ!PC*2W^K=MEQM>qVxY(Iqd^8A3Bdo{;2UrSK8m?@*d^}K#FBdG z%@sclxTtqq!|LUao(R@YZ$MCaBHo~Vr&@&x32-f4%@#R*NEBRteTVh)!6x9@ znce6Y@Q7)HBSeppZSMQBbP=E_vO#e-7VV1Rx^- zea+zhnlr{ZL6oFUZCgt7P!DYy*tv%6=-~R*OpPAVbc7 z+2uiDcmQ#vo(7LFIxd5Eue)G}MKs%=g}5US$&Bdb|Fi2Fxa$GiBL#3Sl&~Hvr9r>8 z{NBG?A(A2=P%Gi%BQa9b9Ze7&kP5>{2L2fao1Rdyq*)PRy`ybjcMIYd#vcdQO~uP)Bf-*LPH{*i$` zeQAyKxSLyeXA+9fO3T0B@Mf%QWegGE8kcZP6>e#|hS_dBOw zM$JXzPuINh`@%F$CGz73y!ozYybhocyulIj;+nqRmw+&tOEKnNpDKHeE!HhP?Um5(^0fmv+(Wl*JjmufGiWtH)wd$GP;Q<` zz$ao%y&Fx+AGK7fbles*|0*0{gk^4A6v5@g1e?=x%dBUjqr|0U4nekR?!&b{!TTyR zb-p4)Z@AM!#0PE%JRpNE@UAW{A9~(TmL!M_t*%a8`=_*O$_#pKT{Sa=L-oOy`pSEcR`F480U zB;uOw00=&T9^@n-SeR|FA$#Sq9)%f1th@Q5 zy6U-eGrpq@IK)QaR(1JOwLuo?tnfn7PcY9)amB_*D_oTJOS}O_+ac+6I^f4V1}FTL zEj4mg5?1QNei+I5=1V8uCOz#3bhI_@bQXRo={Uf2uzMnql+3fNa8+-sb?gJG^?0aw zrHqaL9Hr$U%(p*K3l;$kT>O(D#1J){*LHX|NDd=>)nr!pr}T&~`)hvOo7u4-;AY_h z&Ah?@dyXZpd0%A9BPj*^q_H1aot-A&bIlNAd6&NQr7IfZ0C;Rxw<0@ zBe#!YTQ<@>3Y`ek9CcNdMEEBn?+I)%=p}MV;#MQ;Tt5m*^Xn%~$s#aK50NNiKUQ@m8cGxZt8;<$?GSrah0#7%Y zzU@=wb@hGBe{Y?=$-p2h>u zShI%2JN#;NN5>uSkM;aAB@&zedGw+3|8bxDnn5V*>~28&dahj z<%-!ry$h-g$YfB-`H)3#&_YoKhN3-JBE?)x^TK2mN`&oi)rLi1K&8Q2gSc58xyrHA zx=S?ea|LIcqazIuea$&We;#g3Vk0b?Hvk0!NZt1N{q~}rOPWIYSKDIO&5zxmB28gh z-X(r_J=1q&!7+lN#zBD{g6z1_;#@voEjsCs)>_}qbOBH*;h z=OK`Xz5Mt);yJE{e(uf)gZ86Rv9jTn-KUWWlq3Xb;HHZ>D@spI$hVKmj~RxN6v^Mc zAtXPsTOGXd?R->3;z{FBV0^)`$#GIvwhfTwu5HRV#JXQ-ifg4$m4>>8;vyZWrqP}3 zaX!Mjs5OQc{Lw2nlL%i#kbJRor&@~dZS2tbn;`FzqCb+v7X<-90hD5c%Gy;KDHcqX z`0kkMW)-!ZGu?YTC6hX#yjRWcKv>)m=PfG4oO9rnuVaTGkHQaHWzmg7vr!&93v0eq zwFgx(xau)LnZPXrf(JFKSIwvC?MJxP|G<~^+M#)ncLD$X(i5 zf8nT$80hQ@#MNdEdLYT)R zT8H(7e>lw574LKL`Bi1&wk$j4f|Vlx3Z#&fdm zov-6gH8X@6-Khh0ubZj4i5tZmb^3lKTF;vnC9&!{?{=ct1&IHts2*;|2p-{ z)Z`yB7+4GB>(2iki4g3lI@Z>^0Cu(ff9&cc-xU=Jxhr|Z<@}`UV0Tp+$+!wmKiu_y zU0dJi=|2G1C^9&Qka5C0(mgTB!#1>t_%i{pIz-Xd~+M5%NL5gog6qZ3R&ntF76ua`!hcVrG2w zoVUzql|nu-az8I=Lu3Sl?dZVKb&)Ec8>M%$)O^)Aa>V{oKcFLA*KWGe(&KfNybtpV zfH{D$-y}abieHf=JR;>wR!-Z#Ycaa2W8|oi5$BC@z?}f;9`PsH49I-*Z$IX{LS49LS!)znNN0{& zPdUe(8k6WLegt4XAnX)96yaj~G}GGLSivRir1uZM|6p2Aqqt4_<9FmSFpOFhuxFr@ z^o9BQDo^3NdeOIaw?XmJm*%^RUy~B%w&^}HoP+{}s6Bu$T%eJvYcOlmn^>WbAM#dY zVjO!u$`3I9ZPpUn$wrd;wz0ShMykGj(#fz+uL>j_iCN(>Z{ETpx$?X3=(P^8{8fn{ z$N!DzCJpKVPjHm*bq})G-}QeN_f3hYJT_)&iR>`yY4|P(4SE$P>2-itP%MZ;qxs1v z+CB$M#_}C*ca?o+Tne{b7VCEvzP3=gBexJ}`+NX#=$W>CA`0IH*29B%AQmOHEleZ0 z-@kI-d!T0E2D#b-vxfR%$d1qFeK0&+oLd&l5dEF=iE7Z>6pLRObBq<*VV%+dup6*7 zs(5`p0n)r!i@!_6s6ak!7HVlUYZWCqMv;wcSz9asgGM&-a{fYg(#PO!zQnT0e&qyP zigZJeFa}4TcZL$RV>AcA&cW6sB@CyH-5E{3U=4^-hBPC|Zf(peL|w%z(3|nS%nAWu zav)5hf&|eobxnF#2l1nLt~cQf^|T7fS6lbnrg9-e%mM%geb(t(9lNiG2b4Etaj(xi zsuFlLyJq`fMpA{$UnVkLIgEaFHUP!>6^OG*)Sp%~;c__EvHYu7u+t+U#Cy4@YLoOn zn7~%R8GOZ#0|E#w{s<2S?flTJ|$EGD|PwG}o9il`KF4zdzkC zPP)b$lZKc5lE(#z(tj79|ExiFm|i(L>6av4#g=>t4wCn2+5=nYqCI39^k#a!M|BWE zfsDnQjovxL|A(`;jLRz6!bj=u?vn0CKsu$nK^p1S7o@vGK)Sm-MM4k|5D-B^QjqRc z^6vd|&i}@@bH6{o*?Y~bS@X=Q`J3FyxPq|M+;TS zQ%nE`y`ARzB9f#9J7N>{O{z5beY<8Y|3IzsJE>cY^{0KsCmsL>goD9eU|X`@$DEn; zp%~9Ar!|XBv;~M|H&locjK#m`yxP+A{;y@rXFe>^F{Slub})I4LizG`wYl$faF(O; zu+w(>la(fTD+V1^Ud1uLk8qVrq6M@{(Z7nGi1KPiCK|_BV4-TGA{~{0UFI5l5T{jo20-(to6ZEbIzfbA+vClm6*u1kdQAqRm=up z_~68S{b9B75#nl^V(vThBfMWOlco8N?<2%~Ml0F*Z3Hg>WB<>64l;)8Nppo+$!0Qi zpTVDj`e)7>`(%_{u^rXp-El58&U z6Y;lOKtnVBrwiRTX$~A5Iy6VF zaa+V9RVR#kwWzn^g_-b1gvr9cr1@*VlYN330NJF_%ec*ARdJ>~z98W2*hWf$Y{O$~ za7p2%Glhgt0b)R3h`hRgH&Ch>yf^%|nKhmv8!gJ{i$s)27(?%+&xUyzR+^qaWqVZ^>XryN7Ft%l+%* zuqzsMky~`uU7TBB9%X`n!fJs+V88nI8WHI}Mj=_y@2IYyQOqorMUbqEvEafTJr5HN z6c!q6!Rtl#hw1E5Od&Hd^G&mri|8(x(m1>|7W+{qpe$(s{36tB5MZH4mbJnAtSesy z(Ro;GSt76EVG?tuu6r^Gd03tUFrKFkZb$U24)0~R1dHa!fm)|A?my3lQfy7yEIj$cNw*ttkj)MJVy~St>%TmVC+v%aFIm{`Fo|4 zc^68pJ!r~9T;o|on%>4gmTvD+rKbAlfWpp!!cw8Ps=MhZiT78Jk?s8GkS=FO3#TDf z{zKxi798|e9u!su#8GP$?9pRVF5*uG$?LtC8>!{n^kM&2E3hJ1&D>lBoE-l`pG@Bd zJu0)1{W}XdoDPoVVFJEAcE^51E;gwF9k}>d)754mU4IA_!UH+_HIFIvidd%qA7PkV zRwcT$rO9*~Bb2M-6f<$|UINWk^rD^5Qgq7Kl|mnS2p|a+upone9o0st?0{^ z1Bp@7k1m5c08APjEmh}cbWv*aWfHydr_>+S_%d}y!*au-ZufH`k8e@10T`4r*Iu2a5Df{wVq!$!F4OwmXrkNe?5FtWG*0#JW%lfAV7GbWY6;jT^BFI>tug7?(P zU38~6>&t%f!06c_L>sq|Jts~T0bpQ9RVcB(w)pXO{qDL=b;q%09essKA_I5(p14#P zjro?QBp4YuSTdf7^(N-c(e5=<&Ff^H)noGamr)T4_#ND=rRK$fsNs~E89*~nSnK~J zR=quHr1L+2;e)Ls6+>BjAt+u5kI+F3lR%W`6&lJ@^OQOLOm_c~~-G1YU z@u0yp`LI!)gn_Jd0qZH~=KTW-!`ge_{D9XHM;dso7Oo#C$|Q15*Z?1JS2-t6SIQFKF$)o&R03tyh@(_}by$jq7u4tXwI3wOSeAnhS(BA-ZRhi$SW#s(7_6tbMa1n-Yta@2_&U zO=Hi({e-5wfUz_|0SvLQ=RPQnwMfO12F}v5aK5K68v=T}uQ&6F056~74W%Ny4d=Aa~_L{yiTyOzVBN0c%$8Su+(IWOlJTU;b zJPeFrB$C%&uVMT24>n1~ik0+llZWYyVIt43Jon^|ElQk)q=1itp=+=1imTi{=EtJB zVI(+%c-nh$JSmkp9o?I2rK&ek<%hYpKg(KTKm|StP1auOnxABE z&9|xQBYXbOGFGgZTYl91hh!o#O*h3*5+b0U8L*IlT4sKqa9^GL@Inp5EV&lbo=!Qe z`7V*TwXdF@ShEC-mGD%R^#}e-nkn%@U!D^rswvSx0Cwr1wy-e7JuOh2vU0tf3?Ofv zPvi|L?npTM_2)C+RK}C)v{jhcnVIN?rB}RW12GrLeIR)Qdrcz~_>h$32G>MPCou;S z;IoZ+eM!6D-g<@Y_Ns#HABQc>7T7E-bj@< zcWh$?3@>5klh*ygU3vJ<`4+=Qa!uB~7V?#F#6Thy?(=Au6+)eL02VWlVI=jWb$B7> zZaN+LE2xv*mi9{yJu|9)gCF+3B=XE3E8aINf?DSYstG$EH}5pXyBprnsK4Z|d>N)p z6{UX>wCB?Ql}cQEbOyD~9mL7}v>rl1!-wJd$=Ro0j*BvAev6CVBj8VbK%h&}3e;JH zRzMCTfz~4`2qO{GoQH&dY&f|xYW(pv3;H$TG_4H+;OgSdM1iQaE*?~C+v28vHXJ|R zqZ6g!8?~5YdQsH5noZ@{0!E+Sf*IIa{63nSmC_FTCJ#Sm5P93D(YzN$X%LXGbU#iK`s4fdo#F)^oZwZlcxY8rwM9I;HpS|tjK~-zi0n)ReQ8eu)V!Clb z;dN}Z8~dc-_H-`1Z`O*BzCmM|EqTRGK>ICQULI74PEi~@FWfHaVcOEC#SEuhaRsj$ zx6=#fxy2|N&AEMGI?%u}3^x-j7PnZMErqOpnTm@Y$5t#6bjs{YQMG@`A|fhO?I?nk z@DK~lrI#2U2^A%kq{7Gs<+jw(o_=#T^;B2eeg`Zi3BUyp#*iCKG6;CAh3T)^qkMd% z{fv=`-VmeQ7-`U2^~={kj0wIR;5%NNKti{BCgQgnDX!;m39y|mbZH>dd?LP_x>KZ#3mbfrf^CLa%nNmjcJm$iXe!vpu}J8scy z;=g8Vl*PMVZn149j{+89sQ;)!W<|c+J!7gZgMndeMSTjzg%SR$s?0fql{YJl%vBY{ z&?>uHo}Q#xxlJpPV8y4Bz=WX#>R7>hukP2c1E*Goa;A$9#hv(H*)Pi|tv4?40lI^! zorbvrxDB8S5&e~NHAE*8VzJ4DPoz8bVA8+~Y9_RLAq`d zOplh$P@$?`c<&^k4A&oz-11(zFDRo0)XZm~W`3Z;t-MGtqC83q86f-RH<{4$lZ%#% zRt}YV_$Hc= zP>xn@*NRn;`6@KZ0xRt`An*L4Y~&JEl5ed4p+rKW+c)pCpllmf_F1cN|Zur4cKV4L_mclLvQIVKH-h+@A^h8E1@R@%d>Ouicg4?Wc< zi%0awXcOPt(}e62NBIs3>977-m%I^QK^ZGq-Od)XB)D)<;DRuv(i{}9XfPIZrdBm` z*0SW>#ioj7lm=J5(}=ku?E)4K{usou&wXRu_%702WhJ{AK|^-$+MBpZMXt9oRMeu! zUdjP}c@o5N#}m!2+`WXYr#7W3UPMN0B4kcXZ=>=-MYyqggIEE`91g;SXmkRCZaNUEjO#r%CTn|lJR<#_|2lbj-4FaB z)U{#GaaO)kIAh9Q;^f(CQ2pl0B)VQYK)}u*;g*XwVz`eGX9+E_o#%9-hbuFQxP~Xj6yztC ziK4_GPk__>Cv(~jza8kJW1E|(v;0%)1v%}wx1j*b#|9=1&hVxD4Kz^X=fKCkytXWo z{BPb(qE2*ae0f~Qd=4|lY#D?v^eA*wR?MGF0RyEVK1$Xb-K3)02u<8Hl1=sujaFHT z)4raARliCJvAM}mZ3Kb4ci{J9HABxlJ%-M>BlyZ4Q4?0PjzE-LENl9mR-S7xg&E2) zqe+vpxIz<$Sj-fN-n_HeQEv1qEPgfb&%YpG=_UbG_&xPD$)+68X-_UrXK0%l%zLw2 z($ig*euwMJt>*sj{bDefJ_oJOt(Z75_}L~(He`-ry&=c9wz=IyKwRz_HIudY)=>;p zJ!sR7x+4M==U=TYeEfQ(M%d>(H0MQcvhw2$!{4dW|6v2KQ$N9_Xf*0H3klqbFet%& zSltPy$eU#z?h)?45B2XR`3`v8Hidqdapb;} z@O`8O>FNnM-0;KC3!5`Zid74j;9cRhF2ycFggAGuH#b#L!j?RC;Qna_amz2R#;iiW zd{&-JP;vM8vp12&g?<}KqZqkt`D6X=8Sq&O5Vnp@RJlTHKgiL_(Wz(^j+8Vd=C#^b zkO{u}dxlaBoG-wcwl5$txU6<%72D|L6Dweld`YqLxSm=<#a|97^@uQ`A1|| zHJ5#I9{Mm}7<+Tnbvs06_A|)L{plyiRCcl109XN3>3}YH#}meEq?@jsKMnkx17|CW z-nk;^B4&N{ap+o9P00!cbnZXtgy;In0wg!47jw_7`iEhM5k4Ip%~B!4e&82mVUN{) z1auB`(cCQjPTjA>e%#mj`q2?a_mWX8!g1mPOWJVp@54R9A-Ku%z(0JL%D~MUYNums zahY?sT%Qx1xtSc9GNkT~P+lnt5>89&j;k4UwJGF ztuESr;lrG|cnef(il4wtVHr>i^gPAiyZ2_YeN}YKKlEYlSf7i3`yiSmV#P5?p%Mco zH=uxPi$PiVul@Bg?qQ9!*EN|yZNY7cM=r&8*gthC{eL8ZlwAbd|9WYN%bgRxyyyy_focq3e5OZ&f5V#3=X)3@GDRJ4EqY{%M^A&%jPoTC=Mrzu-IMSs^ zc?Y_DiqTB~J`9Z;(hedcscYi0{fR(+X2>InZl3Nb%PO0AfBT^1%4`ON(sK$wX% zi|?0-gUVbjV58h8%my;w*`+STSbuK}h+X0v2gc$CWtAh3$SGs1C@n}*|0TTm%}Ir& zvQdfFyF@(X^pXmf1b_kI4v-Nh7OQoAWwD|Dj`nqlb<`8>MuIfwYMh|oyWr(~6%_?4 z3<)9clf~Os*(^O7Ewiqxcz!EH`+7_W_3(}f?pajkL+7uCplU+Q>i<58p;c8<_@U&P zmj|Okigr)pCrY{2A;zpUxSJ+syG~VBpLp9Q;q;k z3jAoys?vnv>=@g;nF5yejUbP-6{nskm<+wh_8 z!#4qArJzF+%(Bzt`s`e8N|F*ojr-9XW&82jIQ1AsBIA0ira*@pDmYe}xn&{@M}dk9 z!|jK6@Tyc+=YAd!bvuQ3xZWd)l6U~@9r*hNI<0d#_H`>0Apw5!X^CPq9vr%7`V`yZ zEB}ZhD*pnXEJuVCv)S{^tdeI|lwAm`E!MR|=+(U-fhPlVE7DzoZYOj3R8QT_pr$ z;{V8t7`~BeRl&}C3^7Fq4*+70phEUnLNR&>In*Bujp0(fVBV}_aJsR+k3rh_7P&KM z0N$bVIb~rXXDoAX)AJAG4}Ap!(tqH@)xd=G`Kc07sN6>YFlf`DzZRq3+E*-B z^XbXe7469_-z9?NFyqGrB#=xQwk|sXm>28!;07fC4 zz};*-CG)LK1nP%h@iD?tpw9>vnh(w8kv48+8a&jm~cO|1x2s>3>&a{vdBH%S` za9*{PP(ot|QZS&V3siGQPnR&&=r;R?+E;?utkbQLjSmSHsjzXXpTspe#DIHm_7lO* zv#I!bXt__>hf?xYe%YGa*}Py|9&-6_&?-2!B#!wTJ`nD9yna-Wm6>bAx z_V?BxHQN4H`fs8oMRfuvtI)hh?WZ#$&UBKGUq-DI5{)0!-R>h4?cI5#-%jB%7_ z^--jcjsQtN2C>z~BH%gF1TIOB5D^y>eL|(j_m*%0CG(GKt|If#$V0TImq^R-ej9*1 z2JE%~`D~TeGO8Wh$M$)Xn>Cp+XOKZ|HMC<_>kUMH{U!f3wLyEeg=3NXV1`-Qx_U!5pt`wM>j>OOO}@81o;lmBLJ-D(9OEMFe8qedSqOZMp&lK`9a|p&FhFZhj&{!n`)#bf654C7(&DJw;J3Z z{9g#ItXz3zuhTx9YO$o>@3g?(Yr9(f=HlH0ehvAFV(r4F_}-u8pRSJeQLRTzIQ3f& zAz~P%ne=&IeY(*@90n*B;}gY#U*wFPCCjY(GT>!!m}n-<;Go+2+WoB}Zn3>9*$*mU z_6(On&AOO+S?KmB^qK2Qh(K!)F{Zp6)vej_c=7AGTqIdIFg1Y=e3O>+U7o2nVixY*$2(b2(7 zo^|$O)qn9;?5Xj=*Ep?4r&UNie4Dcp`JzuAfI+jR8KwK%ZIIt@J{pUg=puZ4ZI)ye zWdY|zI$!nY5Xo=_{57CK#uJO#<@u%D#J_7{PHvp6$sBnBsT?_Xx$S=k`S=m902Wad z%pN3patn&=)zP-fdO9z|Ln2Is>&}$fG6bSt@m8C3w#r>ZfzB6RDkO-g3S^N`D9~W{ z6`Z@HxJ0yy#ihJf1pluP3%DPT#@(RuVSutI{;ti3#C&*0b_#1pdl z&GtJ1Dk&IAW(Rdt*_k;5hRHIB#2Y4OsQA^`ndP0G7}2$@0apZX*6n zy_oQ1QH`11$*^9wrb9+ZcJ%HWXs~b~Dr;pIM58WS^A$eiqxjL`TSyuThyV5!^d79vG zb>qsNgXzHr4l)s_e3HN3?X(k6==XT4CSOKlPz0|6u$O@DK?88({sP}UI|FM7zO<^= z2ue4Oo*DXY)Dv?+ob*)p#5{oOThWu|?W}Sr#gR8AoWlHTa&kt(@B4uWXC8zsZ82$> z&^5mciUO@V*e4KWTdIwdxp3d|LNyj_x}8hqIjx8ir?;rlu;0J{M1h5UG8=p7WoOZwsV+({ifM=|k+>a6hQgU@$UpeC*D2iN9Prmw&YK6teBahfC z`|>p~*E*m+b7Q#!^>jK-b5%XgdR@E${i_4xpNh*Ma~DYS9KwxQFnUktn#nB-mvIs) zGGgdzouvVz5rvwu70`hhmENlr%Ye!Z9qctz=;@{C>QsU;SzJ0-DB7MO^}CO*A!MJM zDqid5^E<0!Cd>@pH}DWM9-aIcboJ5ygJmH7q`-kz-q$zf+9b1ps;EwTAVw zM#o}qs~&vaH5lK-zc7jUcZ%mSEXXVl=}NC)(Y1)wd(BQOihmv2Rm(ayapWbG*QuQM*BY72D(;tFEl#5s&(V#E*jKE7^O zn5XvxU@=f??FCTlJ%Cz+86GqL&G7gmp1AeD7bNbr8zfcnkDC#BoI4Y1;Hp@SieSd) zjhzXl{pJ^Fz+nfdHRgY*b=R%>wAQpFS6mPYQLC5sO|#0_Ap05?M{1Bj=M3c)K&@jz zVSBoDmn2JbNz2l7gqDY0^%AFHjMH^BIQu!tn1rP6iyvK zw5ZIXs}xoC_d^30lePV|04x%OjU4UzFjyLu<(vt!hS^eRf4JO6F6yAGRR5vPm1F-A zfI)91(`V_tJdH3c>}+s7PWTN@L9Yrdl#65YGNXNXc`v{a`%`7$Abu9A&F#F!Wn+B! zd7&isnq)@kqw`07<%m5W2x$6_z>lt45eGMuyxa>ciF6IH!T2pCIVbd*IrSaEbbEd5 z9dNIO7DPa{Er$fVAYG9*`vcugWq$~jFvp^%OCmnc%s$U*+XeHX<-yTTSh|!Qd}sGW zDh?-kR4W)}4vh{dUQU;8sY(sLg`Wdp&@0Ie0c{cAix#Q&6|y2GoS@S?c!C*Idd;D; zhN(c>d?Wz&pEuThv@v2&XOkzsygozo=v_KTYTWm~*E|nkwR7Nb6a|hKx~IK%cRSjx z8zL$!5!NbQP7IUnK|gO&Y-NkRA|%$I%o+`Dihw6uyN~*_HzY1_juigfnwTQ+(zbNt z@fWK@_a2?)8YAn+AyD7#o@^~?GID-*N71#@dp_GUqA}-%z4-Hif?JAepq0oA+<9=& z51`OIrhIHOF)GW0g{OC2Ut#gX%JdV97twc%{=pv5HGBYVEpShGVmSLk=6GuJS2nS{ zg!G4hq&t4U9zyCK(23mZzy5m>zhMR(GvrVETyh}h%AO{{RA0W=)T?#s@W(5A;~ch; zwt)~-<(g?|(Qz;Mb*bX47fH`FpQ8mPd!-cJm;qHcOuPcYbz(rd&0IYq_;qL!u!6p! zONq{#MH6L?o|Fk^i@yX!cOCWKolUc)5`IWvxhv@ChNx!J+L{i3Hce@!&JS{Wv!Pov zyVrfQ zX=(IBXl~w*o4urG#5yhN>y7zRSV1dmx-&5{_?l{YBn$>s00wG@tlatT>;{A>qBt#= zES1|t=QQRJE2nM7?vz3xuJRtB9MG_b4Jj3Ng9Dvz0iECiZ};wW^9wA;ld>Lumc^0v zLZxBg2cgLYZ>Bu8%gOS_V_)p0J3Mxk{-}hd)|LI#;#sj8N6c6Szz{)k12ujaTSupP zs7Ji_YP^lti}berZeltwq=xYsW`j5L zv8(%1u-F#8eZCKOoYxZ(5+Q3DZY#$nxz8orhm%MmSMGVr5TIhCo^7f^wv8T)YKj2= zKxhj(_Ri60UfhzH4L}G}T;%tV`*fz`)Dw!}j7q=q2OMao!5}=%U95sjOYWGrjK9O( z-NfBv@>PVoU1;@>0>X(cg<})}7(`p3T=1q_fMSQ9h0$D8kVzQ504zM1BnZoUJTPZ7iwCw}WO7 zRma9%xLL2n(L5oOAEKwu#5t#(x`x29Ir*6WU=<#Ccq$JzV)pto0%L@S*G+t4^ zw(p{#X2=k@OiHS+wHTEqi;G(Sk85Da@!1v6bUpx606+SP2 zo$Sl!&0AAdZEil6^%DS$0fhBb;K^6~{<7e7^nL|jA@GY#1ocaO-oh_L?ItC>9$@Yd z8wmTtOt89EFNlws^I{D7{N9+=I}gK#=p%COEhj7bu@3-)UKU1)QgW7ttqn0q4@erW z2zKlk8kydrIpi8_AKhn;ovHyN{cO2rxJk!VU@6^Pjia9YaTc**({mogXfD{$YsW_q zjD!YKre7WCO&)c=^lAnVgrgq^Y08EVoj!(1_K*_J(&V;Msi8boqiu?k*2@`EeGeZq z+=grAh-%VnX}-yQ#2HT=?PU2|mViZ?K{!=bF;$)Fw}eZg4n zu;VXv$=)!82)gLM@aLIZ!Cj)|>^*yVIh-yqW}?pM@h?r`(`WigNOI^xJz zU{(kSYe3y(-(zY)xHYUpn_}iYw)95}5!_DD2+e>OQuLv!%!Xy3mFW`-K zk-sXymcY)H&n+ryHby1>n(bN0T79?xb+ZG+i7%)x>Rq0aC}7;OEdu%L&qT~W9B#ec zK@95qHld{g@I-1Ph_raQxXSd@b=PxxC-e}MN`nQoBZX3ZBUXIEldxl6;P0T7b@HCg zdY4mh7-VHH_3_$ldBh_2m7AnU-}^J)a`K=U1F(GXlghdSnOkf^e_)=sFO$3;dEuEB ze{DFJ@y5Zm?uxn>%-M!UA2dbdI(&3%S1+cd{!%aOMUQtmEK=+B*~L4ni6Zvg0)M87 z4Dp%`+(yIHJZ}HY@k%?*VEg-+r#9n_BlXQA7rS_gA~4nhs7-G(jUvz02}!U;iQTnd zHCuOwC`R%+Bf}#l;kh~ngSCy&Sf>Ba>GGfFpQEveRf}(CmKtoZ3XM=qa%j;^Y;SbF ze*%0X*nj|DffeU;3^#$#h~_@1d$Fm6bsRshiqpJ^uQ8WmEaIYKM~7zqdPTiDmM(pU z_^)K|Yo`o_fJZ@PaW8pRc(MiI9M$pO_XFN^I7kc*GMe64a*n(rKkwEk=U(pv-He`m zJZAfjPst`c3s6$K3H(1Ki9qwXmRAnmI3&qOdq1W~NwApoTk=NAbNdlTN&_5Bz6Go& zA9e0EGA|+ZzY7x^r!bFn8MP6}B*tgDTN>|5C9P0ha2cR=55k_qL^3CoL3AJQnS>(=E#tMrg2e9{!G%v^u*`&ktlP9;Y!@2rsz(#C2@u3i zFQ606=b4l|%n(s`QWN{aUj+efAQ|UPpgEAoB$G2#tZxsZ4OV2?rMS zV`Uk#RT4W9q&^+AOUM2$WZ8ir z2B)UWvnV6w?r;IXpf2dYboM^Ga8Os%Wj3YdjB6 zFVbJpg@`F+9v-~(eWe^AQ@le}`gTpFnn&zVa+j{ASi0(8&N_BzQ_LJmj+boh;NbE<=BPEEbf%qB*H2?f2~pMFp9I@5`Dh2{oo~uh#LlRXZoG8S&N85cPiYhf zGlzJejuGX+x3U%UvUzYf%tv0+&%TRgM(7|&Mez^Ayzwe%c1%#J}2zF2NfOx{JEqeTARI7m(SIdQ7)%`#b=CS zeaSf=Xtm1usJsX3?KZr8vL(X=pCk&;?xiI_7b;RcY z8DIsTSnLM>;6&(th?-%}!f1>?ecSQrS#;6TNn+>aE{77>WdP{l3{6$4dv{G!an8zv z>|3N7Ts`-j4kL`0*1C#yu2-Qdwm1UXLE=BmIGf-2;-{ifvr2SZnCY4-yrF`=eTy6) zKmJ9$_lhr+8ULreuQkBgF#Pc|d#Czs1)d1${3spl0KQVE`Ze*wgW%UZPzl2TB?KFL zK-y@@392+Qv|G9(X)Kun&5>Ri`(+e6<2wX}a8-qV1syhEB`m;FIzO9#wXJbGcQ1+W z{k$>f&5qZ4bidyMH={DJt&3O$jtY&v4l1s}%8>pd@M#fvn@MW(Hqdm;w9@S|CPFm& z`a!4yXzc+bTnP?1>JveaztKhCF?^O*K7?Of$@((A`{erb0d+VoR|_;fgM-i(+>#TX*aY&X^@$Q%c3N`41ednP^kj(%EnZ8-F2wl}er9 z0x^TQ?T|1XmUKllcd`fWhmaA6ro)aPcrkgAxfd3`e=TPK#el})j!auSEGW6^*bpv4 z^cnFEE(Bh*Rx+2u z18hIRefqxL5Bs3%r%w2pbnbfo+2wNtWwH)HV4#x<1U*SM=J)1Oq`QkdUF{VWdY3Sl z7`Kx+~~I+FB9P+WG9lHlmuz{*)UHj2EnjZIR)eT6NS0*hBxy@O6uKfFTe0{kHK zQiEGKrP=(iBVo9DWFw4o_U;?^Ib6CPKmV4Wd9cg00|0}TV^a)Q$r$>GsX}ODUz)!~ z^Xt5=UVmTn@}DZo=+{F3W8igd&nH88M9D~%tmub{F>diJTJE=bI`vWKtMY7xMD>K7 z&vqN-0K?G*84gXXWZGJ4PKvXr9QRgNSy!$6d(=3=B>nGeU<4QsT(oBqbH0s_ zNdd|N7T+CyVHm1;;h&_#kF4AhWct>+AObL`(~I$QE!hbEq_$F28{)6TLDk=Jz9g}N zamBVA_x@kcKLD^Sa5NU|Epq%tnqI*#Wbhj-W)q&m+(m+T1w%)K>omr`K-avd$}!I0 zlX7Q26RXmytM0MI9hO$;X?qvzD>40RJFhh5aRC^ZjRFx1Jjf`jSG_8)G2BbMkP~QT z@Xz(tykvC1n?>hm{S2BAsNY*bpf)~Y@Ceh5AocgL_<)lEkK8!MT2+O68o}X=r#5IV zqn}Jok*?8NXiU~VN9=j_ufEmkVPT>%U`!UwpI zWQ7vapsqmus3yuYuYEWHH<8|3X@k*8UbQEX6>AU=}x4fK}x@-u8ihG==6>@ z%UnqBcE{KNGZWBudQdyv;h6Lou!9q<1OliM7T!K9HBz8S_9n-fwHVyt^4|c?qemDo zkJT@l@FQOozQ7;^CT_Snp8I_ep;4*cyFRpct-VgJ09pY2rz`C{ro{M7DGWxFdJzQ@ zNs-AfmHYv|{5xONpW*e8ORq-YEq9TMbjJ`!rlA|)JDMR1!J{dsb~ghubTc*zrT_ofMl1A1#a+X zo$ex~vmU8EcB(sLBf#{4!)3HAU9Ysgm&VI5V3tkXS1I8P0$DgCf~ncn(mNO_gx>&q?fqYR-O{H|tFQbV z&P31AA}4Gpf9u8VaY2iRE3I8gT<^z8R8|C7XvWmkvh7q=-mG^uyhc6}MZ;+VAHCJv znB@S-`7ByL3s^++6n|T&sP053xa71HMIH#a@i51E`3>LtmszT~d0v3OlpUZefI@9) zk*cbNGWRZuY5Z;5FJ<-V>LqTz(GafXHtjvO0o@kR7an%{MN1NuT5nf4Vuu`XcS^8p znH6=AzFIY1v6Ncaf;vzFF2zYyUNYaCb4BvPGFaxfXrC2Stl6aI2>dz%v5?7?K@JX0 z=DJ$3dhXmYT1XoO`|RFW`` zn|Z+Qk$5VjBh@}?AEDEez%!8TL|VPn9k1HSmK)Bf_TL*cbF>GxBG9Un7W>uSg05ba zFVVQ|fsw25MhvW`-T(KgV1MRI11(uMwKL9HSWi?QfFKrKx z?iW^h9y}wa&1R+VK$f!N_Ag4L;7x8j7zu#p{u;HFITxUy$99Diq&ojOBMmQeKbI)- zec3ZJZc8l{4!|q{Rs$^tJGPF9QR~B|+vy-iOT8xVze6z|P5!0EEc_K&RzReC7C2F; zo_fl^W?MS)#s9M(LWxPITqpi|lA+1I$*eZ|e#zbeok$b!>1i9c#4xrj-MG3<^{@^$ zVx|JM_X*Kok-XR#medCHYZnZO>@_V^)}f+S9ZHuqP*D*md-> zqQElI*xs9gWeyc{vggAjv)J7`r-i{-7Xa;t(Fgynmo0DCkSUSCw+`eW&Fm-QQ3E26ewI7h1=gh~}s7XOUUZ4k`M)XDwBQ^Gdi{eTLjJx_}A5prmnI zhgo4f_J>1fXs$WoIt=-Gz0R)W*L~c1-1g!dR0RMA6c>S1Fc2b)JR9u%Lcok}`=&or z-;1>-l8DUN#1yt2J7ONl#KS^>9MFFjmwUEd{$2WyYM{}d&yVQdNns0x2r;^(Q-O1|$=yRT*42p7L!)5}w+2Sw?_@!r zpWgt)k8<6`fdh{_(wxbSuKrwI$xS%v8z$C$%K2ew+xSovTY-#hNjA7qvm7TS8Y5gG`14=m3sNkT% z!C`Pgfh-en6QW**6g;Qin@O(gyU9|ymV@ohCjL+svFo^oGE7DaZDa-{bA8LJmkLe5 z8rj}FkgRorE9bM)ckb#tQV><@oI=7N0Va?8sT0L_Hg};r?)I*!uWvr8h6Prx(!S?d zCjYZezmxq#0_O<)a5kvIM<<=0Gu$6iHV)J=bFm4VD=&3a(VubeY6QG_&4c9#awi@T zckO^sB?hNehWC-eN@6(6`W1X{SWuHW*@v%K^UuS8*9d%< zHB=p0X!G7uH4h&2=L~{!5SDi-Y^-xfK66Ygz|xvFTGx%#%bz`n%0^~QiR#M&r-cK= zQ4n@~@OQnG>)=Bp$y7nI|5<^er=YxYE>bLrxMt7*$P4(+c&|3cFQc~MMKavZ>-3vO z3w0n7i&@h$?3D;(8`edDyx_AA(CVa9D_-?e52lqqg8mS0oSPTL^nD(DGI)t^0(-SM zx71$)hpf+&>%f6{Ng#Vo=Rz;|YmgM7l12Bnc}Ydp!wPAgw(x-DA}BL7t!2iFfFxedp)T4u{h?VR8xJd^zL%*L?UA4B z3Q(FxyzFI2qRHkl5fElTiNjtud^)t()k~zviSU&0FRXHx;c%i8H4<_J!Ae9hL;#8Iu)Ub;Vjuk{ZG@II z$P8DRjNx!7{!RB;RI~Z?uSjqw6+$^Q*d_1q|C>ksegY`!zQoV21UR(Le>rp#Vkb{|Sh6lw+?U4OP@KwN{S>E{-tlL|DSs$;fp1oqbY9ZJ0*OZ{Cg=V%?p-Gqu z7ZhPtf5YLwa7At^Xq($-SP-*Io%zCvB>oGO)(0G}%jlTB9O-eXyi@(_Wzk0Unn%?$%+!}T8Qwp4s=NMYo?0j@n6FMe>sET4e!?g9`t z+Kg)d@;6dQqwZlYWN-B7!fd4sNB^5}?5f8QCxxdl^n1XnbZt-tIY z9hiloiQOw?RY8lDJ|+NQn*hvfBKj;^n6B-GnM(oWPcYtGM2+5+}Z}0OU|b*w7b#30^p+I7)*(?y=BU3lYGtE>;TOl?~I~ z$l)A7T)i|KHNA&m{camJ#M!@OQ@o?e2H((@ z!hL70}iRD=L-?=bM&_bCBRbe?Hle?9NK*huXu?S#+cS1Ioz<}iB+ z-;G*;+xrzEUlKsg&XBQeBK_oIK2}D1#nK|(T=Hr!3SO!8{pRozzXU)vs&z?QIW{;wu>yJH@7JRCV2Pk?$hx3HrkoIYV z)nelnNKtukAdvf%Jr#2YVV1KkkwKa@_0HI%nJ;J59&QHuQd=se&&O21KoQ8-;6fSx z<@XKeA-|(i*f>A+v)$d+CI1vI8traSOaB7JDefMLh=NEX;__H}^|W2A5z~?PAoOf35AA+VQ?rP;YtB zChcx`jqY^xNx3r+GKTU%AR_Zf@RxV~YToVUWq8mJ9EPR!5VsEyeV~6BFMxZ?6{ZP19S(Tz%gmB|d zYz{wt5H-5eHon6L$;9NM#O?Qc6UO($@q@#Cbo^Q<(t1 z%7e(K&!X=h$@E_z@9^Wn2h@{1H5&S1%(~37Xi=uZ-amZ@ygIePHhTB^Y^Bw zUSG;YQ?Z$4hI35_A$7`7OK`kBaG@!dW~=>e^Aka6%ytX6%d=Syr2p$;IjwsUeC zX~4dhx)9r<`ZrB-Wsa1D{~xZ`HEnb?bC1EsLJ#~wTtlS4o$_m3t0I}y#VctVWi6wj z8p(#D7*CI_h?$a2P|YB&H*^uTtvnbsz+j(u8f{niYtq6kU=4)^PrM0H9e*X;1E`rA zaJXR=GGQGmaoj=t3sOeeC97DnI!s&oLn`OUA(1DgHGoMHhz=W#cl57qX@?fcbT}{u zuwumuV2=yuVdOoFU|zS&bn)QR#Dp)%dR_in+*UHK7;C~agp47{vZ1TTJLSlJdh@Gi zmmE;xq+kz=HDex`NBr3l+9<+LoAYJkzxZDAYw`rU1pMTuEl=aUS!ARWU+fjMn|#+=X5EBKZu2B@jiM%2{7%}yS@;NlQ`J}v&7 zhN&qj>zS01bo9Ai(bLI03*^tUxEuzFpgsSx;2^`!?Xd&?dyelPX_QI2bKS*WViB7% z6iW09ZXoI~g#qmXbC}J0l<79@Gtg5GRU5>6Q`|nFZJNYJoq1zSn?nk>r2Kq`KZGH29kiEEmDR5aZ877 zeEFNe40e&$HIrA2f0nX4L^aEQwJ|t?oem5^SlolzJASKH_tZXlMv_Pd&ku5&FGHS} z^br%GpPsvd85Tq?F4NQc;ZZE~kCR_pUcF7I!oXrzm6COkYg#Y-vfB}?NdfvM{HH)< z7qGr9fe7~We+xvk8+|(d_kBQ)vgx9x+o%V>GxB!nIvc zol(EB(=l_2NbP^Rp2!du@w{0h;-Ij<1XGy;_j{wv*SOH*eeS62Kj}`hiPAIFr~gzs ztj#MHslVNhr9J@nMiI!ps;TzWr_nrGSq+#i7MH>aNX*B6b9GpDN-n?TEa?Zpygnmf0>;CiZ@aBlh2M?pik0k^^4tn+49=Z@_Sf)cVva=GN+SM*>Bp zKN;behkU=;AOA6qXy(W@g4RDuUjkr=Yc;cXA)H$qG{gRurQ@C(_UrE%^pl4=6-HzH zOJw2Y?f?v746m5hg(n?8LciEu+Hv?H-c7o`?D>uO7Fi~qz@9`8tZaM&u5IIt807?8 z&*TqIZ%%6=LwuC132igM9Nx=Adh!@ju+{((H{C`(6b%Y_MU6|Jc^n{OKPKoxmGfc^ z%d!+26&QE^Ya-=*fRrtOhSwK;=n3y0GDYF2?9X)_bLw980Ld7vlyn43ilJQ#c zmjm;`rbadSq4LMk7^uI2rvgMCde#Bw%YQn6JR#ITeY|j^DtB#9FbJEsLh>+-EUjvp zyTm{;&Fk3$<%RNIJBxTNtTL3?MxAzgzA_CE5__`omW3+Iu->kv#D=pQ6hXXu5tLA_ ziA>=3zl(-U5n*@C8ahf;z@&_KY#;CPUIx_Ef2!e@Y85B6ryX+^Biz*8041edTrOE;y z$3(&bXLVELZO-rdcyn-Ysu%WsMYoY;LqwCdR(a~l;7v|XJ}A(=AP$~VQj($}+Y(;= ziTT^RBMq7eX_zB_6+OH8G~d$p2)K_BZnh82arRK9m$3Pa0v#vz8%u56qOh|qf}*R~ zR4e+IVc>Ww;CSgr*Nu5x^~N}>!UNK)dlO-z(L=M97;0AxCr@qWrvNe{L0ECopLn$w zl9h*_rm!T``AJQ#X7EC@&3~P}=H{)51XV5{2&=4iLg98;n0+XnFGKF~`{6AQdgg^* z{O*oxhH-Th_;>)AU4*wB^d+cMuRyI$%JVB_4pLE`YH(=v;#8b`NqO&==n24po1phW z#x@7}>@up?^i@`oPG8hMonCxZGF-*c#Dg7jybR)y0|Zd$KFHHflg5z!{9sb~6#hFC zb-aVkuE$AKG3VXCPW{yeja3HJ__KT zTvq!@0O^@1_&pF=rlWv;9BXJ%hW$I&r^?9c9AEw43`{jxi)gIygnFZGf!`OAi9C~f z&>h5?@bk-0e)OcFT+C?M10l-!cR_LkQzvI(I^cNh_xt?>&C4J9V_$qNJ>i|XT+XL{ z_Ke`-{^ytRhZI9{zYENO{T_T@&4GOx|3Z+lrg;hfo4e9b&xvbKhRh!4gKV0#?}Cv$ zh%0#rD;&Q}NBVEh>W}t=zUM47EnRaJ?_s)bbFrs*ZiSR8<3LFL4hkpCuy_y{Yu(GK zwEj1_(M$BoYP;1G-Wz(rc53d<~>=2z<*M# z{xF$t)dAC%6d?N;BQ91{cO~1-T*x}iLPvgATu>A_O`Ykd%k*u#mU4;MVle_IVWWA(I|k5vOf z$$ty7+6P5l@a1zt%c8o8*So7lENAns-r7|TJaOr$YHL9XfS!c9ffEOedcVch&Io;^ zkn?dS>xhQd*F)&r>eF9u-^lmnmXm{`r3B(ap^41rvrh;lTgZg@nIuG$Y#S5gZiNd) zyD$oK71IGa5ME%|!?&~QUhaZ71EYoE$w}N>Tm2B2{PSo69dByYTGa*WYvTK%cH|DlwaBEEXOL-}HSR`zV|9P*(F%?T z0|_Zq6nUjqWAFT&E!1`sZGNGz`Z=|SUWNg)t&~U%4Ui}1yTXDO@yB|tzeTt3aaBP7 zSw&aI*gK{x#vUwsnFbVvayxe>5O$aB4M` zcuGK}*hf7$_1UMSuwhY3nUB?Ws-=x@DnA3_=R}CfPz3w?##%t+k`a9uGeQnoimB7T ze8l7ItpIjogJ<1Y3oj909xi;HnEo^78d4bPv%6;!gaW0_G#aOCp6NB=NXKduCV#nz z06zwxVJj#(Mt7Pq07hV;{Oj>-Tqwz>RhQ}ouMERPFQ!uwfCg`nZRaH`)xnW=G=DT5 z^$ZW;`U-K0%}#HMgQ+VAYNbr+09g6G20F!jL9BB{oS>@6$SW2u-=PPiH#GQX-9cT} zb*ystOcBsP>i5Ak+HT=2R|nB?IGMSf2lbQ#P7;?!H&>SSrxF? z9#|y;zOVRyim(@@yyyP+McAkG4u0#`xhSx+;1@Ftv(x2Nn&$3FV%}oHqWrHMhw=d% zTmQc{c9dLc#~*6aodh0Ak7!(GZ6DPEmhAztzz35SnhSu~aR50?L|G*>xzOQlau?6} zp}B-OOQ0{uTfVnA8iL^aH$Z24P}X z7$(;v-wqp*zWinGY<``n#4dF6&kAMe=X^nA$uR&!Se_EJ=XjepJ5Tf;n(IASa?_N1 zd5Lkmgm0!~pr~+M@Bo16f}=^Me&%%;LP5pS_7L0;B7m+KHx6gjQzwo=C<-vL72Om3X3fV}*%Fa%u{%=XBiaj=1SKJ$H|SJDl2RUbaii3l4tutIGRri`ppy|hhK zj?oe@F1pJ8K&(Zcu=kdR_Xq5{f#>v2hK?g}fl64NdrQX{_w82{&OaW73z*(NJ{kz22*{UijKMkMPjyss@~b9(WzwbL z)h+c=Cxk8iD=~{L9Xh3?SI51BVDQZ%!IRf#eC=g@`pae3`JyXyShTHBe?B|vmF0@! zpDxx4#k7H7y!{HEmj%|iYYwyV;?B=`;JViH6jyjbU!^ETe#M}#xAc<|0HpFwp}-3- zZ?)ccO61b9`L-3w1%5+yezA7Lcl&F8FPjm1{uKOl`P@LpvRHfL=AkH||ES(z@!Kt( zhv@u2A2Fzx+N@NZ5{gcPSL_f;zPitJsD{(R7jpS=|6GUaaYfMHB#adO`0<8H^2LM+ z4*(klSu#MtagdiRQJ13<>3y{9NhV?>mHt_fi0?7h6z2>Jm>)r$Y(r7%yN;SdM#(({ zTt9|FgV;{^_#Qe;9}V#hoi;Uh0We!|v@tV*_n1FaM5|TFMHcB|M#!&_e;Ft4Evd%@ z;?+4l0bt?(wX?^nHb2EnTHNp(knk9A*;pyTXCr+x)xQ%5mrJM8gN~l+z4T3}JxevD zU`J+AUbi1B%s-^18|m&#+DbOxGvdCs3I_!R;m}OV!>?%5_mNjZ#rJ6+#!ST4?^4|~ z$2(d+@2!n%Ljw6H53cb~9_~*}<-YFTXq$wtA6uNzjn3zqcF#vz$2=VyUk8BZ0V;@F zVUSMtule8_78*Bv`umkyaGqy=szB{!k9xL9hO7KEs(YrZnDsq&&!H;s%^sfKLlXSI>|oM8p~g zjs?oh>vl;c_GLC1F3W$A`pz@`MQPO)Zv~>OKxPBA;h;&H?(~=%JptYj-!YuK(ink~ zDZv)&+7_t(4#@aJ4(?O$xXM&vbo;ivQdbQo*jRCY{3VZMm<%T0a3)xEPM09w*9!${ zrBrfjJjTD;@gvAZRwulH%O}FNSHCYAysMpLBW~~mYu&*nz%0e+6)ti$G$uE!ua16; zmbqDEI#8c1M~<5A{^qh|09fLV3V$RxX(5>!TUxrl5&uY+J^jzE6T>^^O{jb?ZjaT= zSzvK7UMtTHHn}V``1W6|p$c%p&9f zoACngEXKr3?9m%PBwjXDtibbs|1HwTGn{--M`^BWm;_xNsGQ*|g2EGuIce=(XmkjT zJSXzl7ALzHOW%joF6eQoc$Rwdi2-~O00l22X|_-=Mv^pZcpdE-KU;szO_q$Y&MpTF z*JYIOCfL-*2p|B~%KQ7-T}DHRea7?pS!rXzw&DCr>Sq-VZ+xA*aJzt;Z5|+*qa`S& z>V*?l7RT)c4uL%Czm?w1-Xb&4zBeS>7j6~@+?{d|HoZ)6IXTQeemb+-6P{2Z%in+3 zAJzQ%1*e^hpMXO!Feg~=1)I6Znq$4;p?_sK`VAgh$EeT3;=?ar{doQ>to5Ltatnha z3J27(^8!j*SjCzJpRijqFUz8ZyP3=}jir3{yag4nic4A`n6`iy0q!vrQo_-2{)cA& z?wS=7dn$?fOgf*S*6aVQBrO-{7y&<454gOWEOx^v&ZZL!J4eQvj&33p(q5Z`;vA-# zZTPqh7a6cTgx7SJ8QLIwYF)}K1{lo+4_rh6$vLFj znF4=sq$eADlW^0qTka#aaZ*K|W=FElw~>~KY@mP%Xmn3DH1*HZur*pMidzHz#0YWai&Bp%C_eq!xqFOl=?J$Hfez}ZPB+e?cfe# zL%IO+gd=8ZLF%)|&Xl5>RqvV6TRi+L2&;!OeNdCh>e-zh1T_T(S^*NvV-m^rV%4Pt z^<~_`WYU_XeD&+((*ET_t^wS!KVoqRyATn65VByduPOK9Gof1C)+n>tG;qEM#}W`j ze(K~4bL0a%E`feAT-d^##C0x(E=%0z_@m|7g4LcPA2|W4*S089e1k7oEzgSxUb_K? z^#)*A|G!>>*~vv?{NK0WJ2&Ge3b{1s#r%yxcU_#?e7I{ zq_!jXiZfYCWozKYTLl=!yAt4iU$7pEA8PH4OgYFB^4%m*-<1AtSRVRjc&Dq%uuS$qlb-g&yjsf6o2JE#%c7dD`=wZ*&}h#e=X+-PipZ-sg=_kBJL;zdSO_ ztT4gXK^NCHI{O{JOu(ocBJ!10H_z*UY~S%@{2lGO+E6Wp>jxAZT?MQ{OU-`xHQ4SG z5l+qV%&Uqd9v^*f#`)Fm?02$ygEUVTXCWc?$Lx->8c_F$fRpCEXW?e$ie%?MQz{vA z9g^wC*T)j-dWjC-ySkv&5_8A^JsB@52uos?U8-&FE_4%<; z1ZHsftYCr&Yz{b7B1ntCJ=q%n$#CIdscSH4HJ#N*jj`r5D(J;cKD5_JyAu0!7(7%E zQIT#XCevd3wndd)N2Px@s`Xl$ZCs>}jQ0T!! z;|Lr*g>))w)r`-F+WZuZDPWfJISA`jPEcj!d&>9bLHIQ8>!g`rX?m<0R&TE!9`T=i zi~9h~6NC+^q%sw^*r?S0-xgqyA;6&-M2AfaaW)I zpk2{8@0nR&jEGZFkc$-dv2MhTZzKFqN9W%j_#cta3-d_ILf()cDC%_yb_l(P z$p2h_aICI#!=_(q{u@InN%~{Zr{lViM3E+Wi1qzjuF*Ec} z;0B$U?c7%T7e6aC^Tj5*pEwGEBr}c4|=>`V!*x3 z15MSC9XeLs<(lX3+*w**;Svrm*ztbJ=-R-)^o@WVkJE!ql@U&Q_&2Ur@5gBcykC4D z&l#e07u6b#vor8+%QjSAA94}_6aWct(3@_c=HmMJS=(|mt97GjNL*OsoZ2H8FMNY9 zMfL9^8z4HMbT97FHy6KX1n7*EADH;K%_TKPps(&-!7QD3RPw_o&>}#Uq5<+GVdFWG zD%bC8ygfnKGZ#%r%}c@qVfg0*;{KV&P%A{U7sNf5#M7jhWrIyGZHzv$fq^JTH5;j@ z?V(w;Mi))*KwS%9ftvqy<5K#s#rq>W{Mf6(XxlbfTEHld5s z6?FmHX8{*vL3+1>UQkvAHF~6Opxv$}>M7@nyl`=y7~E6Q7JVh@vIWqAI9U##8w42V zcDG6Ml?6PThXhp#=K4hagb}W%y1i3A22uh~;o#oBBr4jftEPMZL-5kt?+?~ggyBGv zbk09mgtl{6^7{Xqv4 z%$UKb%pI_MykT|8mvObP@(-YNwk~2*{~R^_zhQp#`%c@5eV?GAUfV3dJt~v{YIDu> z?k4=mnBV3b67W)mFKhrs?u!2 zXw^&cqYa8#WdNuU8Lk*N`c67}Qyi;v`_%HI`^;Nut&A=gkrlUcj;Y3x95AiGw}S?M zzE}U4$~OupB8#R-PLYCZZo&Lz{Hph)n%NKg8_QTsewzP0Req^XxOLEuWX5QelJ!;9 zTOdmv4P7X@8qfEEdtQZ8DhVKRF5EyPe*Fi}7`kH*#tB4T@eF=V^c!$}pJh~|lF%E2mE+7mzz<^J%j65O*v z;Q9i$ISg8x6*{YfqyuV+^5=#|7eALS+0^qYl!Y2Gl7lWcOD`r+2LhVXV51Pz|L0A{ z)SV8l|9u_EWgK%~#VM+rEG!=#> zyHsPkUV^oPzYV)US3LdIa`dT2Y)}{Fq2_l(pbEPTB;$*1Thd6?7Agn#vM*6=fApnc zAbei0_ewWa?`u;p*nTG$gk^sB&z|3G@Y*3Zes3gf!lSZaIsAx03mQq)CRw753GN+y z5Lfc_p-A*)ccrs)a*e0TxCAPa;xrz4mf*RjR?pF0GZ>t41#uNJ`Gu!!>}wAuvi_Ay zOJdkxW9g#zZY{k&l5W?xmjo)mDID4(s@H$U=QO^d^hyWr$!CA7S)32^Hz1Uyeg@u?m_WP z`^VsIj~x%7azNC+ySuxtf|A5m>Vigsd8M(b8x`5p#}^k2XaQ2A4gf0s{t)(J zMO*Z>AY1v6ZsNsDo?sHHUEX(Zi&08XO%W|dIY3%}r<@Dc{t@ha7L^|I8`6mJ8VN<>`iGAAhrQ=e!%x2kz(8ZXej$ewDEveto*$$xV7p*R?<07_Fq zy?90PNQxHv>Y7n@p|+vQcpzAC+KqDCh55Vwt2`rbPE$ZHI^XAe9~8iq^6RB@AK3iW zuNs!=)!!4}Qu>u|LoW37FDV*Wvq51Cv}tgG`CKvhrMjse-}O+H1Qk~@e>Ut=#eU?F|(t&wnQcmRG&Q6z|Kp!zQP0p@`%)t z{E}XIo>bhIpB={`VzK5?D@VR9=noatKKmY^HOD9cumq4dN{&W}624k*iLC{`i(VCL z#$-`;vmLUgCPu6(Tf$cX7{W+aHkypn?zgw??}_=?wf@#g`9LZz%%i`1&MSx;H59xg zGYXDopEUUo#ZHkT4l1YnG3kQ)nV>Xl<5s=;DRx zTjHI+_XgrJ^6M?zUw)ym{&ZY!8;Q48i?{JWU-lDCTv3rx;uv6ZBZ>_YJQhpOO?scB znadYNxEB&3llbrQ&3l4Ojf}I z@>5Nov4k;W_T5J^@44Jx`R6Pn6%#)5FH3L&w{{yyXBLBIxzSMToIdN<<#Nq7JFJWJ zO8b0o)951N4(WI0uJ?@vva{ep$9q(GKiSRNEUc67c>EWBwAl|C3zlHMP!JLqMVr_Hk$amZp z+>SBrqY*I%Gk{>5dn0-P+F%yILm8XrBhhGH@n0~i&7?1ng<`ihO$7ACUfKp= z3KjwjR0d&Zx?$ZL+oayF>{RSg%i3&S-q7i_Rfv{VhTdtdk@VeiVa; z!+I|>YXF$Uy}r0cS>05zYT^VR}X@Ah-Y9WuMtpJlI%s zf?2J1gK(fPN~lpIT^)?lAnNy7N2u6(1Cp+SE-4p&erijIadDu$NM(Td{R}(#R`(W@ zk7f`Yjw?4U>?h_Eot7{0+uE7(*Z#>flW4@=`rUf0zT>}U!J}Ce6nws^ES3s7=Q5?R zRld`AhnKbwAFS;)CkI|>OV`NzAkzIWLC!qQc~&Zel(};IkLat^^cfQ8bo?~q6s;zf zf&-mxR0O~o;BGr2HVwZP{eX|E%2tan*faAj)bpWa<-CkZ;7=E z_JNH7o%abrQcM=pZpTBA>Oux_ch`E;iMX2xKal!P3yL4OJ=r572Gol^2!nly@Id!~ zKT6XLqYA<5XkdL-n9pWsg#W1>3V2qbN;W_tRCgYABhn+ zpAgjpZFF`I^U7~UQTP-Kf071JV!zWQV)(%w_zJnriGFz=6gn`i26UP~CX2i+SQk%1c$O>51si1{?CV;T>U%I_SG{d1K6JgFArouJps0Vb0hD z>K9hm1A0UwTG;e_I%^mD_Oo+`Z|yHcLS;*h!?2gFXv@Eb3_Gx?&|(1{%0afw{epO> zHf3~{r!Da8JknWiPh^cvzmafdWAz?0R?Ej70PTIioc?bIYp~?w|2(e7JWOzKls2tp z#Zc`GSGkz$HkXn7EVm)_wE!@u5!v1A)A^`4+3D%Q_{AWWVRxX9w54saXWV-d5$7j) zD=NUpeRi*GZ;<2Y3+D?f`m3$ahiV`Fwq^Pq?n-qwSZDOaxAXC!FQ9BO@0BfvF!bX? zCu;*ogO4I~-wo0YD6?CaCq-G{_D^_q9b6EH6*I^|Y$W++YHRsYme*0=bn0H@rMu3+ zo}NqRvyaJ}TK_0U#LN)xH@;t1rp-fK!{y?3{T7zQa(r>(Im`139Y=$Ia@8v^V3FkD zcr@yLwA&GFyNl4h76$`HakV#}k7ulMnFuSsH5fYsg?oH9z~dGg#B}y`agT#6(ls*9 zt6xfua`);qd^lJhRt|C(05u8;xYO8Y(k7s;c~7?AixG$%Vc*bM7}`q3_Mf4n#aegA zf*oTK6>*#r6}RFiRYBtHhW_>F-iM9GajnB-!nzY0+GlTZwE&neD4smBWoFJk%FrI6 zV;-|QBXp%Rx;Uc0gk%RvdviZIwam}y@qv0F_r%jLHUqKsW*_xpp^Be6 z+P;Ux5d-hE$lROg^1Kbb@EW6E@hYBu>{Gu-XGMR9jh5P-+?ZGi>VA9-9xRCSTS>&kQ8!6Pa+#&eLkARC*wj1Iq7#k<%%UUe9GvI z#IMj(Qn+B|FDc$~q=CKibpIP4ywNkKf7b3eBl&jln@H%FCO;Xbrl=_oF7nKO`I>ms zWS~VodcVt^799EUqQ5i|fyI|3h%)pY6gT6Ww zpX&UL7&svFKwpmvU9_g-so0Uy2Xp*CT_3-l56s(DZVd8S$8?mKz+kvdy-Mt48+dG62Wm88$2dZ?y;>smD83X%VBlyF5nggL#Spsoh$ zhClbf1$C`#@2}RBrt9pBSa&P;0n{SEa<#t~z8&tA;P~{uuZ2!)w1!!@A+Ej2AGKFG zcdBCt(qtlILE$q6Ie37Hf3_28`D!Yg@gwzfn?Ukj2^7$|(W_bTuf zmC$YBcO+o*))U-7FC9$Gji=oyaV!Me&om-;Wx50P z$g)U2bSJw%DYC|!*3xRa4%J~YT;d1p{QK9se<)t6!hm*6z~gW&X;z5W`(qWy;{uhnjI`f@R2=MDWo|W5QPP@903V^OAisT%(W@x}L@11x z2nq6jGuX{GG2JC5aY_^vxhM|QfKg3|9f*5JVSZYzRmO*{dO(ov@}gBO{io`B&861N z*!(N6Suk+8i3|_YEsuCT{#TI)B0}Os2z%Xny!{G|YbQ2-^7ElY-U&bq!m|uPUT(u{ zkINfv2`;eKWBPtnF7x&xz|{8FF?GitV-)}^03=Kk*+tXmHmuuvI=S#22Z5D1vAi?9 zBLr9Z5nq|k_7Qip9S+kMz=jdM7qFBeI;pR8$pRQ%-qDTDmu}i52hr6$&ZDYW)4mgz zf}nsQs*PK$Z`Hpq6B0*z(nx>f*?UwHvc{Rr^D2?YHJhFO9io&Dk)vrxN%2zFr#|$a z;x#}DAD1sRjH*(}(7So{f_8D05X?t>0{Jo^MPb*9n_b}{v$W{QJxs7f#Vr)BRPUxk zkJXa@6G*Ls)f&GD|7N~i&HLQVGh%h2Y1TWW!MJ&~KDb;QV)O7|{0A@=cw-Je?Urg2 zw36~H?PDHG0d>fe{N5Ms4d=Sik9={qovaA}7$W7jnjlR&r|aUye6)iOE0MPKT3B2Q zOB7lpU-A+qAJqk5h=}k$^>ROE!b!i&yQHOf){D|P@vBpco1ip*!ug|HRdN6p2M_=| zB&psB^b$wWHX_U0+uHv3r0>bAXFk9^06W{kZg3k^cf(Gvjvj>MoQh*eo&~|>qJqKng$QVC?MIIEdf93EAT6D1x-sTQonr|@f9M8ZlyrdT+APT zNg3EJwK+vbPJRaL+;a@LKo;=zkg&d^*+bQ#x4Z@z@&xD! zf~Y0B6IuO(?}76sex1^qp7im%yl*vGZc=L{w$^#>Y8YV;0kPA)zmF*6R6P=0J&?RiV={K7fJ$L zZ$@gy-kVSva~fBo$2N}VPI*g)Y-+4#%9XSNuwsxUW-%FI3;R!VBWcIxI8Hv~vNqWf zo6Bx1z-RHfBea8I;(7RhaTjPZWr0%i zCN@P8=J4b13 zdaj0Yl?7;8WmjJdjgMwmWR<3I)ITS&wkULjE!tKK;Nv_(g9&o-5N~Kht;@ z`(^ZS!S}5JCMoz8Kr6yYOl2qdj-zFKnt=HmiLv2zWVVgss&ux9gDE~6SR*0daDe*`%Bx{TI zTqDqcVP;@5IrzIkecvfBXxCtXxVoe*a&!Z$gEgWTLo~cwWP=^DUh1O7&ty`jl^ z6z*%*Cl9 zy(^)*ipIPWX#NaPfw1+4{bQ#L<*Vb;p4Z-5$f?GREWV!SBzNV_wb{=|>j9lpQgF1j ze<>J>bUq6OPy8PTpW-p_IDS^h_m_&ZoT6%zPWlSK5<%GEraBrm0ZFdL`IDHJMJ+$o zW0};5+rs({icC<{PnrN2q6X_M2SYx2fG?TYkwkxV#6$;ak-xfdXe2m(_V34!vzP#k z=H3F@@>c%!!FqD9YL7GLHzsnEikoNNlZ{6NfN-J6t85}ggj!5n7o1~apF zva*I-Tk$C&6IeLBv3yPVh#V5_6b2E}c682kw03hdx3xBdKpuwrSzL7CZ{ylS{H%4# z!zIpi@js|8hxEOf89^V0;=0iTjTBTK0so*vu?V5YXhKtj?9XuX4 zK_I0^g!EA8MhuOJi?E|e-BF2JFZEwtN3(W214U~Ghc^s_EZTf?iVrelOd1+&;4gyv z^HXIoWAxFz2xNgIHU4Z8W_J`iI`qnn*dKAx(Q*!I+1rBqLctE>=Uesd^{ z5UR46dXm=XWWjySe|k0b@6)^-6MrzKPcQ+iHdZt_Rct-xORu=%j}oIKTp8k(PCwQr z-ygK%U^2M??dauz88o%UeIYL{ASn6v6i;*@5bBR^0wYY8kGm%=ih_#auEo>zhoru6 z+Qb|xkNE`2L?isG*Z5VU_gcaxqTrj zl&YUiCwoQC*{n@Tf2!?0V$-~%pFuBe3;1ZE=Ve$ z)F-G>BtK87<^+6JKVy5ycoygctXnhCL7GS0u2R&Lv)1f%<)>iqSu5LV(9h*#k`uWc zYG4q}@LOMqv@cLP@tD!0RD38-@wmb+n$2?yT_N!T*E{NQpz)d>v(X?xqS=qrz+-6X z9unL`Bd+1kP4Y&s#l(`Yq~~xOo^%D#WQB)&qr_D^fh{ns4n9EO-ZAvyG291=pQGk( z*#1QQpWL+oDUMjcVZzq1&gSSvLXKhBQvhr!417k6Lcwp`uaQ+uUetZHKY_+p%TUNZ za@sTfW5eVxa10Oj{_z^GNGM$g`2tO|EGEKmY52P39lo8S^`k@GKq6py+ECpY-HKNc$4f!B678|$5lP}8Ifr1%A?vzdm9 z56HqG$%qmK*i^RXp%@35XZpsO$3VA-=2Hxf# z&ds#a_@NkZi~B*0C#+ft7i7tJ=E&%s#s|MrtDC;NfIxD~x#3V1a`^N1+jSlDe-Zxa zFGC-G&k&%0&rJ_eaVb9UKkt#ro(ukZwDTsm@%E?$1Nb{P6haNPl!KdmhCq}lG2po} zfwhWq=}vg-gvuQIy0m$zhaQ~$kw>2zoLz4*zS4A~=;VoaL$sQZMEFsha?yMSkqQmA zXc(MuzG3F`uMd;{su~u%V&kx}5`6h$g_-ItcR31*Jr=m?jNIWOPghv!?C-peR5vkk zxhEghArNRT_XR}d)_8n7QL&5jwfG;wO9y1J_|el(;HuFBjh%w(&yaM5{E(D~YME0ftB164$u;Y7YPG*DBm=;T3|FDz5^z46ujA#P;}xGLzu&nKk7<*Uaxm=98w`M zKB7Mm)5;0~M8mcRkWxrtAvY?lUNyVE_8pUB$I`TqP#dbvB%>96%ymHDJkJNa2soh9 zP}B{8y?I)W!jSUF8L)ajV?!Xoe-J24w!UeN?iX;F*uJrLb+9-4KL^UM3WI@W)++Y8 z;3KY2X(&FOg(l7_&vatx9Bf8Cx6S}Q5h9VO_k-sNAs+Pq>pTIT%%LWP?u-3TdhGr{ z0T?`2G{Ga*gzEM1p<|Vhv-DNY8-@=__2GQ&OGSCbTdnsB-+B?C;Q!-D`Og{fKWSY; z-{5fQJm&+wkDIukLUsi>t>~zt6PA9OqP@u!3BDt;nxc3Dg^)f+(Y^Wq+cc#7`T(W> z)3$+<1BaQ0yJl%5Mw(nK<8k+zFR5+Sbvh9twKNoxS)Sd*-3fsJR4y(PvChU(@L3-> zFQ8RNGIuA&sGgGT!M<#zd{IdVqNzpEE)cJUybyq*lpb-vf&7n(m{-6@d->D#O~|s# zZ-JS~rrEbJnjUvm$$u7{oQXc<)1f4!z~_c6feH*fLV(lkf6_gKzVAzrSLpMr&rOtV zDg@)?{yNs@vZNB%lxec6p7{sfF~-C+{#&4iT0ZKW1buAww$~bnCU?k zFF{h_4GlimI7l%bLVAZDKcmk`-rRh_osQUcl-wi`mAiHpQI#AyIT(@t#R}EyG*i4% z8F0H|gj~)38RIB1&&^#gBRh`rEeRjI->!UoNZ_VzyWh0WNVI?-l3HXC3Mk|y1vc>O zJrU+`lg^+1scmH;WjF11LmL+z%Nj*O^>gt)Z(<%{x|HrTWE!F)ukIaxkCNOgu}vee za-ovhWa({*Q`v-zsyfE#EV!T+FcG4J0^4qOyv+Ry>zrJ<#v}6g+u3%iw=eMkm%r`2 z@bl)OTB076%Cwi!{lk@3CX(6#sF>B=!=n$)UIM!|F9hr0H=%}S=)he(v*5K22~5?9 z-7lU*+^fKzjjp?mB?5LPU&H<801t+75Y7kYO+K_jsf>M9cI)DFOy8Aj-$Y**-7}OQ-!((qPSV_U$pxXr*@w5 z8_cYPu?XI2hYZ^xTqA|t$L@9xeO^VWPcPP}xczOUaC-~V@FcGKJ$NJ^${Z5Vtd;wiRr(cgu^P7h>pcHS7vPQ*OCQF32Ma7W@^@tnUK%jH_gZnW7r zH(FtmLL;<>#Drg<+!y%@}!KB|-8CSVDgyRuik@OS-8f+ep>s#?SO{EBywVPK(?{ zpsO|)gi?235K3_?mo%721v5hLL_~fS3FSW2=;on-tspYi{{D8(t)v(V%y&e7t;^sgd9i|DhpOuW~RNvY-1>(xJ=g}UH}NsvV7?- za${NN!q$~(Z6@0!I+|;Cv8oLp27@4_9*pr@20eMDFB%VVeLYuG#L#-%OMDkSsJqDL zIGuu>e4I|5^l;^L3-I&hbPe=y4R8(er4jIzVPO$kD+&4K^)-h7u>F%xiHVMWO@76n ztJKwQrze(R<{^xGIaUP5ah_vz;K8mRRe7J4k>jhPXpKH^3wq(i3bLd`z){MVsXx>l zYI~Mo-YiyHymKQu3Gccc|JhdF|9uAuw>8XMfH~oYEdWM`sr03YFjXk&m$AMvnktNW zCDblryrAOjaV+mh&yryA*^kuGeN@#jjB&mJ?4>pe6RI&Cg?+d4ZgS_#nYmsn$D0D! zdM1(G^Aj=~o~}B0YG8=AEIa#9)Ie6f5l0uEcR@X0Tk&<+BXj2Jk1AJ4Z(aT^S9ENy z3Os7B1XhI_DsNDP8ijdUn47hYdEOg(7n#x1T=LPHaWFzmcvzl%EQQt=07J8*9BBMH zTx(4hlMb5@o0toTMvA%x*Ss=#U}06AJ%;f;bp2x&$J?Ti>-^wSS$x87K|5QR*ex7S zjE?9HWzC5fH&_pbDGBQ>si7M*P8tHUBwn_$dfg0SGJiU(=ppsNLaO@py-28EvOPqV zX5emK1It#_=IuB!($g@r8phfVSQ3ujZY~(&>Zx-JmUqi;i&1zznN@%_!{AO%edk?y zEXQGVcsbHFZDaNAgbgRN8OX7U#1dn7pJ_Ed$OvfiyIstEx`TERIBq!@(j;Rt3@8N= z5`qK)nSuhp!W)-aaw-Wy3)n0_jcHZ$fI-)$OUUWtn$Ex02T18fY?Azz+vPfQ-S(k{ zi7Qy-e*i78{{}76F()i64Uan8U+ErGWoSGi+Cgd|`qWomt8(YsC*F5IN*&TmhnfE}fFHpfc31zq?}V>v-?<=e^jk zaxnaJH?)R2qef=;LRSMC>FGp}354MCbsG?v_2o$ZtI3ZRNO${?n4O7!F0dUD7#J#y* zYM8*$7OLNkSUVxc((g*_Pm$%cW^tR;{VaXC8~~$=7_&93JnH`*DVg7jfZeoOc*b5I ze6?$Bb%u_W#FZDri}jvlf(gBAOw<-uusS%?%y7oz1zce zB-H&j3v=-Co>K#dh>LhWe=ivJrRo!OI6Z89bF`$-+5|u(qj)3+%%hUCpt`!9F1)0 z(K1dYI^6pj4*}f75C*P0w7w!!d_?{>{qwGGBd0qlv_u>H;749Cltn26PQt7BOKeo8 zfTWAcn9`)d@;Q9xS+umHwWZKk|6Fb2R+w2GV|^a+PP!-%pZCB8p#UvK54=F4ZIf|b z@U6m2){~x9G%?1$kbC>k32E8)y$5d+p+-@!NJuuy28 z)$?+&Jby{N6G?Nbsis?7s$3AbnGR=paTy-uJN9#us-%9z>4tkz_lo#AS(5SVzO7F$ zZ$D>i$5?v(iO%$y2e>AfIG@c@7NU*3ID|F__^$w6qcjZB9H;s;6$iIRnC7^3%ey!j ziC*;Twi&tksv^HU;#E6+@^dQvlL236g2CC?zXWH4UxfEFXF!4w$eg7XV-|@EvOA(1 zR@6M)8R{l)L?p^?s)l>a(Z4=Tap*ze#Oyfmd2a5=Eqh8)eZ|61iiwB!qI*;2R$`FwyJD`6%ai7N@Iy}?3L3|4@UTSf4}#kXw}!544LT) z)B|6p4pUmM(S%t)ClO?ABMstzH7O&f@r_E%9)^~W9c`c+O&NQ*JlVDGSVt>-E+XZ2 z)c{1+lMbaxsj&G(e<+l2el1pI9I<}H1pN3qi-8fFt1qvyrx;K4gimy~_8dKAZwsyN zJBF&t-#2-)i}(hMKML*4X&ri(sG!`<%#5#J>9{Q56b>^xV(bU81!z12m~~sJPa0u* z-S5u!O_og~$D{qjhsxqUR~+BCD^3;8vrQ8i$&h%+P6gu$zH$^&+9fB*h-K%*WWw$1 zf}S2cx9tnFJed~h4npfcqKw{ZEX&%32t4aiW&ua(tAHG(>ystk+Mra%@7pnxVWP+8 zYVr+!Ly!lTqQo==#rnK4`L(cI#iSk;PV2_e;CJ^HEegI+707$A=hk!W_un6VX)??W z;AgaT|7khMg;E~715r~z;>RG6VPzT00?5%V%)G04X-J%d_w9`n;jwkXM>|X-DC3KL zq)Jr{j#a?Sau|0OYzIUTa$x0Q9RfItI*Jm6Rx!RT$xUGHJvpk$2ZDwJU!+DWJgxi` zvRqiG9LT1mKWiNLt$F7vV(!jYfw}+CM^QrZ=`ePbD)iay3=u9F)(3Be?|bIGXuCbl zoIY6fg+cfUFUN-A);3iK03?=|u^G^g9VxXPsgBP@8pfNJX)0%G;@bm)e(q*e2|XAA zj-MW#9#zpB9)UYJSvn4CtzwfCzLY`56Zq4NCTeGpcQyR46(c+)d8rX zh=&59h@lZs4%v(1gwfVJCmwS=4xLuACeEl&nMy!a}1hw=7vw@#6$x`0Gn+N}hJJh+s$Q3Yn! z#aKT8>ojaaq0_5rH_-`AUb2n9vvb(9OwCTERK9#2f63tDElX0j0-P*#P5Cl-&(wWPH@Mz7^DI3=b@ubYchAuWESJEtW+mXS1B8eqrHbMp z5)n#DK`yzd@GQWRQmAme?!wdJBh}u=UDT7?etZpjjM7L-2RzM;6)7vkBD^0KJh;wA+~&?|;V0-?^V7>ivba z_w7T(+*e$OnkW-()gp_Y0@sA&2d)XX5!c&ODk18BCzY*{(eJwYe4YmrHUNd^g=%34 zXUH8AG5`Ji&57x%q@IbRZs($Jx`nAhPz(an;QQde5X83rAB=Z)^xPBruSGA*;1v6z z6#wU2%-I+aen6Cf)c08pns^%)E@E+7!CY@YX5g-CJ>|!5&z3BJLUYbl~W1 zlTQQr6WP}cHecK>7U-0PAOTi}DTMZF{5)q|B5*^2>C&&%Fn#Y&L{qYFU?wjR`SKCI zhK5MnGt{+A83Z*1q0$6zYjCed-*%I6bZIvdnU9j5^M!NMRLw9a zL%_wf7=$ZP#1X!SN-rFV`%>7uk$wKc0_((BQGY1kodXiwF01aBgE3{u^&13_6HcZ{ zh;Rggz>qi#685ts$H7Mv6-+VF!6<}xdGzyk>kFTE*FTn@zucWhe~olxlGF}nmdDt6 zB9Ml{#7t?{VC0ki;#uUr_4tIIO`FG+W8_QHhvTl^5e+nUfAF zae_`)0!0EH_H6P{32zkDLU>=Fa7R`^hm2nt|A2W)yQ%Jq?pG~d@jP|#u}o(XpT$BJ zDy^clo_M*M__yp_is!8cmH5k5j{4PTM&Ai0yELM{75s2w(Z(=maaSfq~-o zuCmcMm2-8!)+;4eglA%2Nt~d(s{@{O&jY)KS-G@Rj4~`nWl8bV2;71dysBn(3StyG zjuQROOQ-S9d2beQGd|XuJM$#}M2#t1A;#wfwh%HV81j`G(T2Q$uYw;GCBqe00`K8b z6a;8&{<|IU`ztN@X1(uh!(D!r0nir=TCD z3Fbb_V8GNhg*mwrxSkwPR#Nd#4$N}~wX z`US@YUeH>HUaZFsKe9=DmliX^!T-67$$a}ouCW8)hs?g@Y$81THdUyuoTglHyzw>v z14SCv{xmy5$EI&cM_KB3>Nz*QHh2Mc)NUK>J_MDoVg$i2+5hCq&xw0m$_PbSltHKC z6Tx2`1_#KeKe^IO1>E)Jm}?spZ175)Ui-oZ_#}jecP#;n{achJBH53!ggowlqO3`- zrGRUgL8I@E)|_pBK00)4*XsHD?O`9Q$>h_+%==N+*${EPaK)b45{?29ra|sw&o*bH zz;|ug23CG3r8$r*^*VR`^pww?pYmLVNRV}v0{ie^f_13lWT}{J2VG;0dPeLo{u$jO z>++3wYrSEL-}%>zS?$1f+6p1dASnT`>c2$-I7mj9=C%HXetxlujLt7JISH`e*XY6L z2kG8r4p~&%121TZLA;>8VlxS~?#%eJ<;6M977LAWwLD{pREiJDH=e(@t=Sc;J{{A7 ztKq(Wp4ob6XaUJLf>~I$WM0+ue>+ZpEbyVpGPmr#74UN;8B2Z4gGrg&S zuH-DcVP-5Yguh9ck!+E&5A3x|5>kq+MDJC}0o(i+P?Dn7UjEoJ%jOlATl+yAbDC-# zzAVaSgj~oU4E}o;02ad2>|+TfaAt(+#I%tS>2O-xp>TUw`SG6YrKYd1jx$q0gTmD- zzm2;{a&|q;ALn9$>rq zAL!udrFijq3Ih$-`nxYIGkH1rt<`aq@D5VZ_2y%6p))G9S?z!1i@hdK0r~t zu=6%d21oJ0a$FED`|8CH8*Lu50xKIgR;QA0pNUnZCDU;RSi=blgWxzA@^XaslG0!` zI14z&qQ_nL&NPi1GBu8^vx%Cph^{$aaDYuTS&kVfk?LpdIT(zwGIj$65pPxy0kWd} z=Q*@!{rvrL`VO-P!5t@N1deI>jjB_$mU6y!igRU~z?e6JquCL|#ERh#-Pw{%^@u6{ z^5i!v(5zK+hjI8I?J~&Q_KE*ku?W)+##$P7j?xx|>vL4k972v{ZW0aIys2K^NXwdU z>R1Cgjr9Pq4NwV6Agd)M3%yHBMOyzIPU`)7@>D_ll+HJshJ^r==nu5FW|E1cN5Bnp z-P2)A5e3*1hxWw5eVPRq*N7^VXjWcx$WaM>oV;^j+1d1rXOcu>CwSU912~cLXmV0W z-Uv%c5&HN9U*yYT{b4#69k-FG-N9t>Q-`kK`PMm*CO*#DoWqumal3;}hj11|JF7ug zXT><3M3pnhN%-I8x_rix!_)Lh$Hd;kK7y?iLnZl~Z^tW!QZ*!BAe79Lqhql#sp#RZE6ctRr&j)F>hmJOvW#KiJubw~f?vCS8swcroBBk#G$j08qEi@$m z3I}^^v;p?mVi7IZjv}Z!VP_$YxdBfX4s!aa+M5e(6neWnh>v#eYVDJa|KGi28*toc_VxpuhDsr1R?d|UZGwKq5X=yZ@1q9*c;fVj1_7m9v zoS9WMav$8?g-<=(x^Pe_I}!Z-${G1hA8yqSfkQ6^)GxQLO<6x?I|n%*RVKwB!0hEe z0fcLzQYRvezWP%;FAjOjkEtz82x>Z~RU}lluLjlmonZKcUF!xZ2jqFwo80yUmi)T4 zk6El}Cr8eCYPuN9Dr%&P?gFCEv|s_9-{VVm_E`bOF&!w5f|Wu%waiff+R>QJYQ3od z{cFi%S6#Ia)42@DezEwu!?+GBc}wFuTiC)djz-v*Fn$A4GDHPXQ-|_~(JiAh*dKjb z6d+1ZwLalG9PIxsO6LZhkyFXs!ZC1V?KVIZmb0ZKSR)n++)LppL5+Veg;#OSGHd1- zf#iqa|Ef$>9BD0-_i2)v-8 zB7$xG+lHrHDOHHWGxd0`t2RFg-?{c0Nfe0Ks6ds!sg;PvE`(3aweD);rNM*FQ&x?%KCUeEq#a4GkwObX8hapLdN*C$=yy~S*(g0jvE7HAOu z8VpWBIs|BGY2dxhy3lp92St1@1^W1D%$p{jc~a^xuD%z)|53akpjS#uV_fPd*QT}l zy?zHOS1hJ)r7>OqdT$?mli%+65Fk^1d_XWDeD9Iu+Xn);my!sEP_SUcf5W}vIuKGR zL~ySX9mxF<+}kHM^1?n5$nSdIJshJNY*(foLU`v4jP4|3JYTuzojcn5*Rl+w%=4_TG@Mw`gywcLv3G6-M9wIV(s^ zt7?n!LLif&0t~cx9$Ww+{mrUJATZ76|MXA)&CDV3lgJ(vh8($oh$jp~qj~&mteePM zoRgLlPwH!rt#Ip~VHvi^&l+(@aU%R4u+GuH2}J&+nS`Wm!2C_^-cK8857V=+^5&?_ zkGL3iTey9b>pS^v?)OolU%|&!A&kS_KX?@ZnuNKf(34YTv@;Bg86m%WBp=hC&wnHQ z+|n{(RO?9r-ApxqATZmLetU5BUn!LI994=GjU+B>rv}XD-x?#%K6h^zUhm_s&wFW> z7CQ@8@qF{|><6GwihlL4>dXXnMC3F+e>yAI!!S77O%XQP@FQ!dcO~T}Sj5H}Sp?_? zz~>>96@W!5*nU}eTs-|y<<mVGR8|pkD{NGJ#Tb`2;_U5M*=25JQrKK@!)P~yWqm%->e6Z1?82p^|GjvEJ=2VR7dp~cuCPjt#iMbrxiOM#vUhs% z=bh?M2lN+kBv+n`XA{Or0Bs?JGMrcnZd`{g`WSKSt?{mXt}-9VUDhCS_wxHn-yY@QR^XO~gA5@C8Rw81@E%(L(~F~^T#<1Cp^bsv}b zE}3(Iv#<>W*Fwpf_;0e&flA6NH()xgx6SYG$Ypg;z970o+(A>JV6x>xn`LhcR>0*T zi8|nLhl!yE=@=q{g)y>7Kur6(D{Ya54$Pqfle<}XZpF<47tCsqSs;+7}1-K<~ z=;q)Nh%=5r96|+pY!XbED5-+kU@D(N$tkdVA0$cX8vB)~rJ7Fe6uNM18!iW!W8tKP zU(vWCX+EQURB5UWxDq@&0G4v2qy%+JLc9p=g~5z7GFDwV-_$o*LiIfSOLu6(hyJ(I z>PaKka?cKTHd5699^G~;Ckkrd0P|+8`q0?W8yjtoujmTAaU{lFU%%h|V4MI2GiSVe zL;`lpI~m-42(G+F97@ec8p4pzT`2P1NRb5#Pd*o|*(T4{GbpQ0-+gtJ15TEd>7+-O;?!JcqhGXa(Z zL*+p&Mb63@;uqlKA|*}B$OeNKw`A4TM<9Wy|s1#MTA>bU{*!7+7q%NaeU2 z8_X;YK*}kM?NVfLyR~KQ;hY`?j7o;UA*QD@_dxtkVFrvINJ_K@$O;fbg#X8V{ghKz zD%$l84&}cyzh!>BsPE#1(x+GTmm0Y{6k%pVjCUN?3dS3u8(yJ8h1G&LbZooHTcm%& zcZ+xrUkIK_H^BvLvvUX2JIDV}9fD4BX{7Fw$UUZj?7V!5Ky65h*~^AXxPd2c*@CqG zW~&-T?EB5)>+bh2CO_FcdB6^7-@ z=6#8QVFYq7ZkAB!a=-kZEXl^>Ht-znO&Mjv0zuWD`w|0A{!|LN^!T&3iECCtLhF>T znue+Ncvgs2oE5??T^BZ8N+`R=DTTW!nJSQ(@HXQBa9Ox>`<(MX@>fENI$8l8y8kNb(Md)T*sY(2O({*-TYz}qtNb%W$gJ?Ax`sKY?!Tt=zpC_v8dQ5J+a z8C~;aM5dyr0%qURWh>S^cxBoxYIKE@Lq_mDjbe3l-iMKUdNw4v5A}4F^=Op02CaG><95xXTpMw6kinfp}u%>j_EUP2zV%o9Ur~W@_ls}Oi zahJbv_ITq6-ucG+9`1uO;Ig}12RC5n2+VZ^$MU7rb$0@Nv(A56>G5Ur=1S@NT%dvv z-rjyz%y%U8wC!8N_KYu{%I7AB#GMuM?~NIRy46M8NSqyB=CsrV;m6Phyt%&;Mo2&+ z#HtG&i2)e0G0cSCGvj4h>W?6%qgJv}S2(}lYa2?{D)$VRS{`AGz&LDy1`d1^tQ0|5 zhq~XX5vi7&r+bf6^%vP3ogvf7Yj09?mV!*~p5xKccZ`b{hM6B>PKqFq=ik(o0BOY5 zj^95k*y!GddX*QedxUvYa3Hqav}f&S--oaE^$*xKA;&Vq)G748A`h?2#7HXAMVM zG->g1J{vXJ&ulcnqxjPxMqD1nAg=P__XP(H_~^O1gbTV|xRl}D0ZOr**q3JgRYlkt z^kZ1@7{(5vMdidu2!`+@A)zHsl|2n_>OOM|b=5u$^VWP^Dw?9y+8m&kOt0x4J&p9C zJOmrn;ExKu%J)@6&NZ*V_Q}=WUe@=1cJ91r>u(2^o+nv+lg?%V@6BQL&!bh+Nu?>8 z8U@li_a7%IFj}J0iSH(AOU+JjS&GEDF@i@=K1H@4Bp`~{K^>7$g+VAp?*>_D&9?S; z+%%ouTrk_oEty}++Yg-d>C#$V$zGrC;$oWxfWUeTlqnjL;Ltlpo)35x?KO&)K67j@ zU16$FEs#_G{YKygs|K6fF;(!QM(iMDTAU)1`-ujWY-ni=A zL{^PTJ)lrBS?hBeoPU?LP|ZQ7fuzlc4_!vgKQk)dKkJQiAN?(6slCZ$Evm|fv44wY zgDujD<%;2eT%yqX-z@tF>63V!TQ5@I>F|;{|M=%vCg-8a=a#SX(W6Mg#z6wym)eV% z&3^{67O+ltHy*^{}~8}4L;UwRXcwk^&2bneOEQ}C$$FXU>WNduBdLf+_Q=x8fF_ z>*a4pvtl{6EsWWde}gv6&A=UVD>||7l#s2$HZd%-#iA$5sqCb6NkNSe;@po!vQ!>O z8`(eDMw|smWDpbEH3-=lN7y)YkN%$go4>WFu;_?QPc0CluOx<(}|fH;ht;CINyfLW`#E$zRC;b zgc|HuPwWGB_9Uedg3D~{P9!z-Oaf{YK91g%hZ=R7a`LBkZq<&;a&0BR%z(tS0aj#- z{$k4V*)a1!{v>~BD)(!fu|bUlM4`49U29jm{6scCWX&fs5c|Dy|CnF?J(PAcW&kA? zrxUmM^oYq#>gVqw1g*a4Hc$w^)Jm?jz4X1D?`=LXEl*bDF#p?NUUt&`btn(KQ}S<2C$!GwtDwkyr7&#tjjK%;vvyT0nT5jT-z!6JH}k!~A< z@1Wa;uO0`Ak4o@UolZK>pL;1A` z_#`-+tNsmTNwQD<^IXY)Z&&={W4T5Leh##;rTf}g1SDveFoj);oYn8zW{!GdDsc~e zFZEh!P9CuVm+?uOltI8ExlAA|(qDNjpT8G16#SFaLzA*O?@7+qh|e@Frd}c{2X6qB z3;wXce2byFrj<<>VdtT5G%gPr6)#mzs1z z@Rwqd$&cIS&OG<(K4#C6WC(}}#Cve3B0E&ug|Cm zUyF7cU0GAEmzmBqPfel6*=o@T^qMw`s@>RbCpcNVg1_T_1N}T{>U~)!_;iH$ z6P(n^hV;;Zci6xN=EOGXnJwk!Z$r?(fla(}6nFBAPI z#{D_OBofRc!LF3v&A*j`)60M8EVwxC}nEr;wv;;*9Ft^|kWn)`wN7n1q-+c$MP(Prr`|@I4Pd23e_-I}+oH;o2H> zM4+bM^t}9-MfJ_PT|8#zlrQ(EYVWCsAWxZ%!nEPQUAu>Zz*UJN1H@3sa+ZiY zjRUK+pj)A=o#u(~k*v@063uZ31gMHAeNP~vz8vg>;W~`1MFau}Q40SLh*IWF@F|#x zmmOv{7mVc?0BtOZN{LG@b;|TP4au*;*wf^pVYuFIiQvmIws*W{rcw{NK2H{yOX*GL zF_F>IH##lAwv6$m-&uxemm%VZOAx_g3iEqFMbhkv@T41wk(Wd#9^;V7&jl~Z05={9 zVJLD*G`~@~G?D$g@y>7;afJ}fAP4m3FR<(| zj=uT@P=zUDi+#v>@z|ob2Fa>-s`0kXXT>vC4BB^KLSSy0;#kG z*}5t0-|G#1Kbyrro~m=^vD3ZaV{sYw;xPjpug)HMvzxzgN&onuk&i(n6N!=*Phcsl zO~qi1*g>7{_ogRbbZ=}QeW%d8^Mh$LOx7@B=CN0cc5MMY7#&kUIezj$iR$R0WM)C- z)Drg1^^p>5IU=R&J@@as#*|ZJ86}P9<%@GOkxO4ld{I9w(tYb~53fiT$-Qt^_J~oT z>D6Q#9q%Vu52#rq6LPBZ9{u|Ea4TnO+3R31ah&dJ=)y~}JmGYH^`|zyrw^z+_|o{R zX})%D{e!B^;QUy?0R7CbJ38OdaZk6t4W5WD(PL`et__GjB5T`a8h+!1;B6xAeEscL zF#@v1%${eQ?pC5*Atvn)A4r~xwcLw8)%Jps%JbK}>ZoHxAzkUSRk1icLsJz8wuBY+ zgZkxX@nKmGHH&i>5LnI%~;Bw(C#@ zt)Mu}ECrcAppoXIhR}v0RR57Vsn4?O zwu2gyU)!}8W48lseJm{ARUC{xQrDf!QzDJA^TpDmE!c?VfMX-XVv|LR0xt{s{Ua!` zF5ss5!47IZxBmB<4^iT+U*|?9#?Q{?-VdB>n{h5YcTVgFXDi=b2AJRS8KT=nYCb-o zMDVBPLkNE(5Cp0D{IS*lNl}C97$|%1)iey5fN>)=jlrvKius6^=lrYPX|+R~GMtNr z<}(KI6l=+C+4)hUJ(KO3%lWB~fR@MiG|=+=rKthnGZ&=E^k4B=fy0f4CmfO%DiLCA zziI9{-oD54voomGJkuxjyhY2UeSBt|gyJDiEFNxf* z&ju@Kr|HC!!yi6NWC%i=$0sBlg82X-vVw(-3B^?%u@HcEYJ^@}s4;yk+?to38$uVT z{L*>z#aR071vj%+g)PBu;BqbZAmCrI27rJBYG!+F;*sH|whtS=(4}}LCSOZV@pqFU zs{-x`p;!L&yVCLxpw#uWWk&<`N!#rl)FT5wsLwBr@SB`F4jDS1E;{`HfDLO)05%Bg zFOMMliC`FF3j~;p^|@kuxNf7LJ#*2Lqd=J|{RV4Iuo@76I)WY%1(qo`snl8+~t?5oEY03BunGL5GKrpbnHa)WGd-_x992CysOLPAK;B!bTN(yR; zSs2|O<$VG49Wxvi15skwOY6DjCxNu|KC)vp7<0}wzkO*bu)w$M+gW+s1((kTnboe{ zKhArd<*|O1ZzrjQpzzJ8OQkS_C@Ewl4H}CqMu_FiNeIe_Om0OO4WG;FVa$27;CaV7 z?U>no6j|P2rE2oiV@cGsb$W6(pp@pBirCoSO6kl^KruzQmX2@+lS|O+2HDPo&H@_e zr4|=rjNS6=E4|a7t>|%GIc>23YUy4{KtTbyj){-~cEHK3L5PfCNEe?*YCWU{2d0ni zO$Z>>Pg)i~06cy*>fq4Flbl+VNap`>m%3~{;E}Bh<_~)eqm=^V^Lz5eYSg7UqA5ukw*``x5$ZVXsNH_bxQ&) z!8)F%0C|^xC8dGn>(TB?FDXLj<=ZzeKhiWE>m;GJ-6D{`8{FF zz!-ahCIn+bjoy$F1x&cpTLcj(L#Y3Mo!((b>DRc~nk456ia#GwQB9K7J3;X4L;5ar#$v2T7*d7o1zt0o{WzzpQWXj4Rj4=~sf6eHRp5kNk<# zZUz5|(`)V}owxGz6idq|#{I1|$tv!}E+PGkNSwx%eQCQuly@0jI+>QU#`iRG+lSeT z>M#+EI~vG;&3IWzBIWva*w2@2hc3%Wid+j< zUOOXg3d(ZC6kEm4O+hj`85%b!imX*v)>9ojOU|9D!8tma#eaLxHiB`&U`PHIwZSzH zgO*kPt+tX0Gd_xZGx79=^U~}pjlf~S;0xskBW%CF8}d9hKpyb$6>yrqDoD;w5Too1 z6GmbQwio?34F=L)1khgL7aAi@A>ayl%~wWLn3Wz4Ihr2W6&MfrN}RrNxAJN*V~+8A z7ln T?Ai&|qXC4W@A*5w!O5bae4Qn0k`E3mZ1 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 z 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%0AO-ao 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�)Pt_2Sc3 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%0AmjW=NgowDl=~Y(20~ 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≈tG^?JODBnJZA#Pj`(NYaIx(fw+{9Rn47 zYV_;llWDkb9}|;!zk!bU8SvyG92N50*f0Qa*hWZ1X3q{=T)jV|o+;CSn{%^VvY}`2 zwBbS|!^1%)Yc5De)1n0I@833C0j|-S%zwAn3P6qouKn#mx*P;TFcxugh`tCzC{bem ztN{Kj_s8^F)4^@FpL+YI(eV*`Y6WFCX{MX*Vwqn1n}#c}Y#cPb_NgVkMz5OxF%$0r6166dx18esdcqiY{enSX!(L>rZ9S?KRS7iE<>bUQiV7OWOCw-($v z%r(jpNI1)hKwkrmwdIOEAOhUc|7gb*^j$GiYs1^&K1Z!qqIM*aXX-b5Ewjkl$k+X8 zYCmyY***E?sw>;Mx=Swd(BN9zNziI#>`zes9h8aP?q{(ee&*1-nn#h+z%5saynI-MBs@g86Ix=3TsBd0?)8}T!ah4tC1!_sM8ZJT| z*)~kz+A1%?Aa$$oJ?X`i0fqfYDyz@;vyp8ZtFs?G^g+8OsUqL*0A<7Z7q|@Dfl~z&4za=4X&iM4+45hc(v|Jdu8V zRA4;#`I*!B14MdJy~Iz{dA7hZx-C%Xi;W5e^_62QAYuX(mu{Pf;WzLopB$V&Tie$j zX^)BvR_*cVI**&xe_p~E99g4u=*a#K%Ax=Y@mR4eO#96A`Cu+T7TywpFY|M%sLNt~ z&rMEIFo2Cq_lw06nHO}aCi2V`6SL%pTj8D8#HdAVDi$Kn^ob=0wX&W;ATD4p zT#kh-=nA8}aM2TDbx*V2b$T(9Cba>Eiv2+6kCqd!H3;4I8Lz>d$$k>Sa0QIvXaSxt z?ZPTbb1mm-uYUfl5||?sLJxG{(6t{pt8YfvR&nR6tq>a<**QwltyFmlmX*?&bZ&x(nb+OG7Am!s?!kX3OUu6)Bo;-LHB} z(%&a|C!cQO108Dh?#+k2Ha71aT}%$iU60?1O}yY%$8UEq3PJ zo7P%J{5!|RI`T-Z-Q8vQwYzRpU+hYbO6Q)jf+1bnA&U=;?{7t$L3s2+(9|rE5l@J+ z_In-K!U~N)-})swjng)DBZv-)gx6q87*T>{z(}l7WT-(e!)f)`Yjsa3tm=p@0~Of` zc^uPSQBmfF?}n*m-TA@QwxiGwh3JLAGGj~9fWaRs4f>MV?o#=jb#MQ$tj*3`^z)TY zNz?2R&K7M_Ux3%b%oQ&KgJlLY-ok)q?AXCGaQmY#BF}e;DP3T97R~V@6+e?6TyBsq z(-BP+J|xPg!dO0Iy9WI1cEm#Fr`eTeWCEq!f<6?Dg_<7kr-y`gze6 z#%dkrcrl3|Th#Zj54DcIWn+z_9|ZpX`bTw(R@sPxdco978O4U|{lU>CN2m!y{54Tt z2J~I&BOM>q1TI!#Q%%fxjQ;^)Q(z+2qLXUTT`zqTvZ_CDDbWN8hJIRaG&KHUSAQ+p zt-S`a?LIJVI3daz2Zp!dK?GdgSA_H~QD`h#(bd8y{0=iV2j4SZkZLqhIeVDDJI)Xp zKl?>?=T3&~JknA_ZXRxlt(F53Ea8n5|3oc7bwavQMqe z=65rhM|xCzk=& z|A`}=N`f^PZAc6{9(~wX$}gjC(C5XI6@h!-#mA0Dr*=B;MHYQ}N*)y$5@8teEBIrB zJ71_8mKf2p^pSq3eN2#r5N7u_U-+YN7lMN#6F})8W+Oo{BZt*7d>Z1M3uF`#7jn6m+(uez)u|nqYpjG0x!4WiP2wPVUt1>7u-s#*F`9ez*d2DQ(O>91JDuh_G{veX}$Ax&WAoGjp8ptd2mM zVum3#sb)utYAJD#JUB!k$lT43*4DnZJE_d}FX%$!YjWti-I}M&?h#|hT z&5O`2DlrZ2vI>l!c`@xIS@YuJ;1hT-1Na<3h)A3zV7#6xfYCvzKLivoFE8)c%R?F& zs3?P%2VN3H(C%Cs%*P+MsasJXWTGjTAgn|_45nS@785P&T3qpYQoX99Jj36(f5a>*da-Pqh?eX z!iNd$Yl?P4_}FdmD|gplib&&W{h7VJkn_I1W?;{0looBjj|^e$pF31!%8+NgDG_KR z@5&X+SK4?%P|^raC<`PA^w+?MNbK<<6d;42ht&q%I2mf7i?eso;hSi1P>YV)IL3U> zXnXX#!&{RF`QxQ0)SoGUfsz;MAtVQ0L=g;fC2XZ4;H33WaxRB=sop)zb&0e8q1dP6 zMbRs0usiv@)!Kc)NEX;9EhQI(J`FAbtZEZOK*OfH02VUyR#Xp9S+zTyLR4HE9EjAo zI+V>wE>$7D?cjL7EEjU%XVO9cKgh75pSHR z8uccj)bbj17=M>q!Z*QF$5!H?U;xjNss3A)C-t_3o43D{%dKxopN%a^;dCIB{Fera z26(_;^Imu7?3GtFUG9aYOa-~tWd+OfS0C@3zhxCbqrlh%bF~{swGd!0yshH?OX2OG zs8ZT3K!1n;=!Q`cgP1tea&Xuj?7m>L0k^>qqr2ONJ8L!_bjbMpW(Rh;;z=pC#>NTD zHo&-nIpr^)KEjX+7Mg(dRxVzGj}-*aqlu`7C-~hStB+Cy53>`@fC`te~nf$%f&#dl5q3}VnpW;;Tsc!n3A1hA_oYpsG9CK)OBm^dhfYrP|% zTSoRe%7sp-+?D0i8*h1GaU+Bgm^7C}=*sv4>G4AD#c!s>iy^U3iO+$dx7eopv?2#2 zb5D{Ga`aF->eTFw0`mwMR0ofVQICnS&g6J`3o4w2=fRF)#={E;W6UWc>qtWrrhp=Y zKKOG=yxIv^!jZGP8Q|gjgh7&peCm?t-SzYy5sAmzix+w`qr57t4NA|#>D7?tYe0<| zP)s$i+N0Zz?Bkxqm;z@D$^F3BuzN>7}l_gZjBJhC#>9h@w%t08A zT^L#>_%g1nTK?B3d8?0%(J0#DTM<>576bKPg+^c)VUPbHx)oe0?N4LD#+Hw*M-5cP z%iMn!u+>A`PLT83M=3+W15Rnz}Y}c0)RpKVgL-nURH)Gvk+VU?~sgScw>B9mrzM&?Tvo< zwQPwcisw6gZ`q^X4RP|u$k=Pv0kdS<20dfUFzDI9v4Q-DCtkHbOxb+*P*N34CC^_H0a(zs*A9CFzOvg4=40%N>s%S2`Z;NvG~UmZO`R6?7%JS@Pk_h8XLd` z{BGW;uo$RS^&i)mTypDS2{1_{z89zN!lwTsz%Y4>u0&?S@3GElaA)q;kio4-94;= zr7BBT$?tD-b$6Twr7rDPP*uqa4kh@2%7#r9Mc4|MhOb?*D&>k-o)-GZwXyA*$g0Ss zaF!SkEOU4zt6$In#W$FV-7|=!eUOS!OhxndT8P3r&$I{LI{m$}_PI!KX}$@K9f(S( zk0$Kdbq8(cS&E>q+l%CIeype5dFZ7=jZ);&^WKbMu{n+}=nWpW!yP%X-!$Swj z0hvjZpYrbGs%7=M@i16Z~aXHR`{I$*=0 zJ$lhb$UqX;Lus+dWWhc?7RP_?`^lCfuoZMKfXqV|oBR$;nh1$qeFxLVfQjv~itmX2 zt@us=9u)BZ65m1PVIoL{UwnOAz}E+V8v(Z$A2}iO^e|M^U`Q~QOGL{0NA%m}#QNZq z!lQSBiMV+|ip&T{B1}7O2kk$5B}CAg(bnWVr!8pZANAZYJbsKLRJrPv&r2|YoAEi) zI96^9et?gR#77_Ay{xTqt%ge6l<}V8&KP4U4P%m%SZVWYx4esd4i;6?x=R{a3P+&}0nfK8VJMHFPCFVhvsC4Z&gOXHO9thlDHe z66HU2o#R?CQd|l%?aibkcR2lEtS3fDRcGmpl0Mo0qV2r{ss8)F@$)|C;FwYN7FlI) zB0JfuWA80wJ7&lxiBeKlb|E2@>=GqPS=nVoSrwxAz24OKzV7=zeXj4gfB#%v*SXGl zd5_oYIUdi)^YPq|UENDT?5dka*p>pvjUa;9mprU|K&UOOd@(cIX)*13XCTcf;YWcf zySsO&?BNYgIB|U{`?WJUiXOG?tQ{WoMnMWh6Q#(+IiasB(J62R8goG`gd#PAZ$-C` z(j-%CGqiVmfiC7dE7ipOY{_j3ph0172s9{mJJ7(CaGR>--?+jF-E`Z^P+M0l?>+x1 z{iAQdyPu1wup25vVE=f+V}x~sAdUd4IS9T=4B&jV--dv%``uf1z~?$45k1TI#-^mA z6wupbOG(4xgd%H8+LfDzpVB8}U+H97XdCHQf3K7zTiNHlJ41emWd-dZudsr^dP0(G zB)%1dxKp#*CHnI}FIyQ8(Id-mmDBC2F6Z7)Wj?~?e2qXl2^=iLN59i_y~9~NEME>g z&}Qu@Q#tL-Bn>0(f__BJ8IEIHogtavtByG!n3jAAQW5%;*!Y z%UWiVs1D(%2kB=RKir#9;|9fOr#-mf!YonX{*#54sKqSt+ug1j)vHOZ!wOu8RTar! zWzKzjTV=h^slThgr*OcvtVkF;`T4U4y4is#l79Yhvz}dF?sG(RZe1bb0+}}{*N5U# zQ|)#3AHO;p@(vx+f5Z}t)=g8eL+CHXVCsuWw@24#warI=%_j{?H)bMaheRHFOZ#zxIsf+9M-rP^xQP!OVP{qXVrcg`X8Abg@NrC-XYa2IBX0+}t7jToSI3ww z6+ccC)Dp1|$!&dptQ*p>Oan;Jj`I2tM>i* z1^wGRRnqjgek6rxo%={IDgJvN6@vZ1m(dfdgBdH1qJl?Yz5onby?&=PGZepmp|t&m zXRiLDX98jPLL>nri?T-vO`ygjh(QGHf&uV>p%AK)4~-iSks`XQ{N3BfG$+yP^~2aR ziT2-F?n%8(>%XA&MDqr~11zTx?9YD90iOXf(2Kl;o>oa8XFf`jc5nGhaN#Au(7N}% z$yBc>Du3s7X;;w>xLv13I2!!_V-Ag|AyT{P#A%b*Ttw5=RoTG1V8SQ#?N;#r$`ot2}q z-9Z1<)hjZBN{-Wl7DVW??h3U?Y!#|l6!dZJnEr4$nRt6QCGCC~rDI}v#iSAEbscNS zj`7K|B>$e37256;{1QOMV22;tIhZQ+tcbl*c`47ahkl|AdTLOfxps^4v(??alkybx zAKO^M5cZk6#InX1eSENv#?uf$y7G)CyjgOO<;J6T4=GG8nJTTP6hW-x9Zeao^*`Fe zj&yl}H|dfI7wPeaCCBlHCBKJz(u;8KOKD5`lZ3^Sytn96W%}9Sd!xvw<;kJc@~W?E z98tO?7c17j+J1jVei8s(*ry7m2-CknF4J1DW;#x*eRtm2ZY4D;$2R#`RjvekQ<`EXQr`1_rhsHvdZQBzU6E znQf)n#J*{0m=z*F0S_|*$}`sy%Zn(dMI2M~$vdju(J^IR1NRVdpY5A&h~Qi)dEZ1K zdFkI2+5)nsn=i1VAlE)cCVP$;KkZO$4L1-dDf5Tp;}Xp0@xS zgL<-Z?J*SueFMZgH&r+lV8Rc70lTge-X?z0HoQk)(X?IZ#3|_ei(gKWTf3TMKBvtF zwp2mMR)HfmRas<-b<#I;M-P>U||Gdxflh`fTa6# zZz;dO1U*?ph(WTVS#Rf^4WiiXZQ2?B6TZaY%i3MwsbH6Zq+jtva-4Hxl=r0u`LcS_ zF%N+(cZ}Yzn{1hen97Iu%MIPXeFxt+9su7rTt*i7Aoq!Net!xSlX0aox8X**|4a8a z-bIE;I>^^I?3i+eMD6@ybOq^g-&2a8u?|`f>&ut`cydsn_z1iG{cilfCAe^b;=h2% zk*feWkc_lY&R>@vMAJ7E2*-BF!3*}2Z|3iwu-@fjRkO*u^F?YU^7`qW%tYR7r8jDv z+fBfG83zFG^%pp})Q!p!f)?=dR`&^hfS+)8>~z<9QS0(mo)PN2e$E@mxcR5vq%`)b z(X|A>eF>&qxsAcY$Y9cs|6fQy`_ssb0@$loxIFsaakb@H-#tjndURzjw9j>0QBd=O8(sit@^2enAVu@vsEIif;ywbvCQtp$rvzcx zl*tSkILi|d~n!Z&3sMKaty416$C4k1MQ?2&v$9O1S?8t5{yy-lOT% z<{)%(3-JPc)h-EqHK&bWKXMv>e!~0GMUjsI`NZ0{HT8M#h4C1~ib-aNr?j*p5+O4m zv||IjGEhDnkG*6hc6V6*8N1Ipj=C-aPtUiAag*@pIFz;Mn%^g|MfE3PQ>BH5#j@~0 zP7>d6ANkeXa_EuP7P*rJuaPolcQnmMt5oV=Yx@RdS}(%`VH{Hq>=&XurwR1=fsU<0 z3~r$bSMPp`yM7}WF)VrcNRe}hRA-1`z^IM4BYS8~JCKU=5&=?iaPPm&V^AT)NA49N z0kF-Nv4$|Q(&!G6blI@j{>?VFoTCZv?giI9X8k5m6ABZ&J>i&5A8)6yY%d{xO{7>T*2IqyJLN=y^G#ykZS`}=}$utAm%5~ zRCQtdvjb0EXa1?y-s_=K6E?z7JNY?9`b3rXq=f@$2tt@pP?LyeAhD8= ze8#vkjxMPkSw7So_msUjP>_v|&wR~%K5#kV`E4N%bC8_^<+D!!62*dJHig0QV!R03 zE?#TJxSYytl;|}1aCp_qN+@5tU8V#%l%*>F0DTtjM@2v!M`<8u6Ow%=U-UBn(GQpz6vuU%b6 zTwOB+wWy>c6>mAd@>7;Z!9G_VybQy)NSIrFP^D0N3;*}sw@Bx=NXq`#O)G&)Z*l74 zycr{`cUkQE8KYG+8%S!0E#f&lCF!#gyX~Aov(6;iNgsZcZ;{1TfDNqGp8jr^xZC#| z^JCq2vRCsm-Pe6P)Y7RcGo^yX9(aT6cTfTk3>bVM%4T?nmcqb1Czr)2_AZ|z5B&m2 zQ?$3d=lX6maXZz*g7)X8;lSYG?}6r{fV1ZD*5Jp|Y6-n!L@1RrTjlwtIw~ae@9Mw^ zpuq;{@@c3~0O7-!NQMU$W7gQJvv6T@BBsVysXl5C_fwxkMcwmMzYxmu2yGRp@Cfl& zHWnxtfo;kHY2)dxxBb6#UJ&epvR)Gg=So8T%s!LU6!TL`V}vQj0g4O#XWIz(LRF zT8siN>|-Y=^;tU%NF59V0V8&QxWFZ(1^?krL+Y2Vhe?{VIZq-K7PC_| zjGGD_YKmj?Z&nwB>V~2C?l5$77(xiq+yP~JgiHDW6B0|V5LG41?0JUlKJ#SV_&$j~ z{h8`I`TLrZrmPx|L05e_Y~P7yDrOLeMhrtCFA35RTtGb>X?f<8PunKX>0ibdP8#bx*){=ol%|>!b*L=y?e*u;S2do(&?V$r*2up zWGXnL%)8a5iQzq4-8^hCCGGqELuqXOgD?07z97hjeF50PJOnX4l2xUj{*QjgK|K*;`6xjOXUma8*7xRpo`W$)T$Hd+lc)rJsk zpTBOlJg}U$O0HR6a%d!7AmDX!}bwm|SdLcJ=FH+8! z1ZJ@6mqxIM_K@eva+>>v!mxz?1z@#-5Y&VH8Z%sHiSd(o&FLW2HE4e~{vOWv-U$0T z$R*p>{6uf>6us;^UBH^-le)1{GqCW2?Akzl?q`>NofNQ=qY_wYcN+nsyk6=kp^swO zPSk$kYTau+C&QP#@0F9;+<&kn5jlGP7zqMmxS{qIp8%>8?l$W!~d?_KMrYJC~bZ5Y>}Qq&;lC%A=qS2K_;{|RpU zw&{c`lz7R@^GN*UWn++%`~!J8{za>Cp8?_C0eKmr2;0Ux9D9aG#rieQBcw=Zylv2g z50!r7;Qw#v%Y!Zv^r1>$5Ap8S%)hc;$?t>@HFg12uk4c@-~ z7+PU_%*RS`<%NtuOafb{`^=0SLKbu;`kjR23H&a}twKRdEs*7I6?$Q>}Qk72Q{$4n1PqOV}5~Kl|H#((Ef$GIZ4MH&V#YC~!r@7m)89G!w> zNVL_f{a6wVbQ%MY*I#&t-y0$yY!~TSyb=*rh`XY6?tT7iS2@n;{`1PBb9Vx=0Se&! z3#2EKsc-@mgGxKZdkIQJZQmD|G2D2)(YUKRG~aWVEA=hLmp?4$N-$39F`@&a>I9C! zj7Q-D0t1fr@?pZKhqZ;`u21&Hs!Sm@xy~gT>3=)3$;`*#57J1={m!%~GIa%#u*4&s zzcz`HQ;$DY59gXX%^$BB@N9lTAwY1IM4Ve%tW^Fq+Vte^bA&G7qIo&kR>h#UZBBQN zQQo=5dF2Ty(|yTi5V=uGXr3#{KdeB4PFg6a0r5kP`W#iF!(IJD-Fw+xO%b22%k%o&eFDSZ69ARd29vLzX&v~CGQ>`oQ z@DYyMi@=f4W~K7ROc$v>p5_;zi*h^Sf>MFf6yk`r6}Mc!Y6?cs&3~S^p5SQY**!hv zOb||e(40ikN`ey^OZ%dofgQ_dQ5_Vxd@f<-Cv|y%T%-`0-MJqBd39JFV;ZPq>|Q`B zUC>UJT)fJkuj8D#XKj@6ROja0PK~mB8F-FITShhFZ+zQ=hcHR0)?9FQyhc{DCf~Ab2e=ikXIHE_C9l=T6em20g ze$#|b$KxGCIXw3Sq8t(NY9(mEX^wmt!jvZ9I?D((h9m}bwg-%6)x!vnDulgwz_{@N ztY(q&d$rcE3PGX32?MbQI_Fs&SR+rjT4l>tf(xVE=dC$S;tX=iYyy%d{aT5zY$%Jt z^S|t|{xj|dNi%juX%#_R;Kdqi!7p|ag(mb8eM^BCrggH1dzK7L0yf#2etuNxbet5V zP;_|m{xLvgLEuh;SgH*))lSk6%Pqwx1>W79(S_|Iq{0PxB% zdlfJ{@zm}nDwtQYz!Z>(eoi_>9^)or;d+N&2x8eSc!#Jac zJfHDsmj$?X@0kM@-{)lgW3N5VwO>T#`^{pWmu5wE8q$shk*8nt?67Z_EUUIeXNtf= z{M!2!CPLlc{4Q_?@xjy}YQbraRikom&l>NY4SR|j2Kj?V?VX=BpQRcH_n<1c6WLB4 zToiU2Aqf`wi>VB)*UgThU^lgH)zqRHPWB5EnDSkvV?v$GN!DoAqXCPUF#uBuqqb4F z$I~J=K45t!zJC2$-F?^m=f- z<^x?s@X-^M<#d;=)t(^l9J;_FWO18Ncw;_I?TF>a zl5&XQ8QPWzJdeKyX8SwfZ;{#ZGr=)2jawzej=>SMrB{0$uktj4$P8q^|H2eED!7F{ z+oEXuMId^EgQCZWhGC^$EGoaqYgT<`)Nt|@tTX2L6F$SdFo>Cp#(RV%s&U0iEoG%R zY~11A%BZw168}aAJ{t=ugjIo(&$X9^X7bf&YYXuFDzgZ1B`;4$yvbTiemdI|)POvf z^{LXAfo9Jozf{HjN5yzJcu0m^@Gi(jOBSK<2f*97(qG;0OOjgBeh?&tXHP0V@Y5c7 zb49PL^kxESFwrcm#$hA~7J(d#0*7kRokG?DkAs`*N0NfaGfr-bRHenwUFl;3T$=}nr zOs|RVfw<-oL2@=f&gCbWdWKO2YV>E!FWL{*^hyzWrUEBxFE2t+4_wB*tq_dBB9J*3 zAy{JPqLS=4hI8-ZzFK)Nbn5WlC1^I5&!k{Dd#LGkm!>7lceD{UGYpXv4ND4Epq|_F znt%2Xia+zj_{&RU?UB?WfAcph6t8e2-ML4k2@v=A4S-kkIQm_pdQ#*V56dHeYIN93z!MErd{k?dOc!OuK0i|S~p&HD~LOfxt`=P#&=NLQ1@XL3GrRlxrS#Q{jQSwwlV{4m4 z8QwS^HKGvgi!;X0)kI#gDPSA|HA^^`DdLnsiPhZ%jFB+K4*dsxkZ(B5?rLej_epA`*I!?|W?n?GFTtLgmBinDP?`F@^2qKgSgC zIN1H6KKOj%K}-Qo@r}0Q6+JwPR&~|SObm+k7qv|4no77i-spy%o2;+^vl_>ouea^Z(SYvPI^9b*M5Wx9(FexlXd_Y3#+~fRIuC&oNGgEMXW! z3_^AbVF(KRa6tnu@Z&=-K!G0=evi~?%M&Q1Tso<&5^4njaIzF)k6xwU|G`|-aHPHxJ$jxtzQQp+k5LE}@#b}cu zQg?pK{R3zKUq(#418+T%cgnWtj>hz_q>Wx@CsSL}kmpA;Jg*MrAX-KeBLd*)$etbE zOWO!p;Oy}Qav+*H8H73!T*>@)KFfvq;(6VT=A*ImpQ;ViB>@)ot;|zC2<>JDT%If_ zMBrm=g5>-Xq$G4S@KHFu{qW@2lsyqy^9{k=vK7Itov;uQG-6=_JcYAf{{+p*2!R{@ zTLfU?R~F?Il>Bm@FSvI3)V=p2zR9T|0szX0G*v9Px)ena&vF~Na{F@iHchRbi#72n zAC`{NYZ?1y<7x3wjRAXvy#tJoM(gb=JVapmV5osXJVX$Q)9~g$IeMgFjelpW*?R$@ zX5Z*XmLS59O=yb>8mf1d7eiP^1;*u|E5Ud5ujf|st=^P5UY39L+j-UPwlrKI@-p-@ z(TwKuMcyoMqV%q&gXauH@N)OGWJ$zJ=81rndLO|f%Ai-b2BQ0Lx}A|*E{C}&wD zAQ=_37bE;~cu{a+dOrrj=dsQ1;%w7(>lsNiw=QTL+X<;?659wXbg40{B9W}8y{dC% z91KZzi=WR{w2MahRvW8`NW~sXZ=E*Q61`f?7t7 zP^o)*K07OHJ$D?fQcJ)pF7U`>yo57_yZGBxMPuNx;-Fhq-4hd*6nUywNA8N4N8I*Y zf!il;<6lIy9M0c6yuVM|j-r~rv6Ns86%nZ+gtGaNKE9?*jl-T8aN6piTid4uRO!^| z>JHaLKlwJ;&s3pbbX;#-*Oy{BrRdZ}mI#bH7Dk%%@j5Np9`t_!>`_*PKoX7+1#(y5 z-y5gUS<&FY=XnfFJ-Qi8faGsybpIKn?7sHyW2vF&ZNiHzRL4tYAO;DvT`62)69qMo zd}B}n?jZ)3ehDh_F&Er;#p)azyKB(5i0WSMxQLx*ik5d|%jE7Jl9RVWc(m1tiUK{_ z8zn8M8)D^J0m32m%GpX8M%mM#uB1<_O*i+$ESvZe!H1d$7D7Ij21H4k5;WPcoyFI+ zyf4F*0D)^R9^#2$tG8QyeP(7k{Fm55yH0g(VfB&sBA*_Dvcga-N%P^|vi+Q@t>IG!~FA=w&t31z5&r`AwqY5P+NaOQx%T zDVc(4Y+VCJ1I6!|uV$Fcr}Ouba!KoniX;S=Q+$z^o<+f8%nk~myH;|T2rquKZ|fR9 zMkgjM4X%!;4bI>)3Ajs!FIlBXk$&i|Zl^H4`V81QY%Z{MyLN(#OpUk9@LJ#opNUvxgTHU$ z0{?w+h(lc4qc)M;=fo8x`TCqt{o}Y>b3F=4g1qqG|JUs4(F@P3b#d=3=@M=QOR)u{ zj9<#xIhtqHU~@710@ZywID4|r1KAU3stYrEbNk00Q)m)B#vfhs!-MeHZ4FbNBi!=I zJwwTRTbS?g1Tb1Swm5>>Cm(qJi7n`nDUpMC>p@9V1otnjSxY|ayJE#NdHV20!EW~T zoaHuxo;{z7sTDNfAi(t?Y!mqRf6~D?Cfq#{J8z$MorY6)ERkJ4G;j;^f6n{)(Akv~ z(9B#vNiNb!;(4}7dKfw)hp>L-qV+PSsQDz=uFmY>N#L)Wz{EMYgApHd?mr-t+0o|8 zXAWrNT2FK-mq&AQO2e)7HYP|>^wBK$EOQm?wLSKJ=ji)h0bi01{PxoJ+Z$)a`d&@j zaJ0y3u)X@$TEs1pDX2wpBT9g;k`4rt*b#UcxMmLw=wEzy9kde5q|I^ucK0IpxPoYJ zupGUm{-n&E#^d^v+*G=3BVa#y2!s8EzboNiTNeK<`%dr~oVGJV4(f*Ga#`J=kii1o zr~W?MP;iQC5ODA=q1M9@jeCfNlg9|LKqwKeOn~yxcB7&w0WjT+7Ty<}3vw?s?dn?T5(HHI)gfUe7nO!zr#`?K4dEcfqD< z^T(AorSF4QSeo^t!CHYHCygJ*$=lkrS!_SN5CbusLYsjBQ4sbJdOz*}1`}UGtr2?& z4kwcd6qTF_+eJ{_@4tl-`!JW)8ZXO!qBFfW!)jXTFgYo2hdz4>2z4Yt1XQthHMK!$1&hf#gbO*kROAuKk>ZVQ& zNu!$N&DF^#h*fpSfcY2Ix)sXO`TmMKJWk3|5H>2O2-{9+7h3jfN}Y?O=DpoG!dU6g zVDdA0W508`_Y|CkFF!G&Y@8P2xz}(iEoD9W=F`3K>)h=?m3^M>UVIp^XZq2=p5fOB znM2{74<}L$3?HR^(iYXsxgxI_W0AziQg_{I`<99WCy5oM>3BtEufT?H;6DtX=F75Q zZcC-tiJ~^=jJSHKT(|4L%ko12_1*6{ob|)8CdYB4y}CM*!T6DR%b>S0=0aW@^4!%B zKhhkEE$%zuq}xY;la6&nNiq@O1ylCBetGimg-yhKJk(kIaoPUy2)XyC!_v`Ww(Cg> zM;FX}<-k?BzXDgKdzKJ^kex?@7y!(H%VzRqI>7W-`HRJY_Q5Jnf=3!qp%FHqr_i=*PMK#eG72*oGd6&BE<9tcQ0^Ql>Z-r8MFI_~*-&fb+q za4$wTz`fuli$L{){`ip=a2{c>MD)MM6%kz{1;36^#{4VF5@C-CJL-6;fcnGel@7)qHXD6qGcPZ@(LNwkTp3$OfWTRY%@@C0e?)tDF8&N{#^5`7cCc4`o+}=2S;JnlS6dPPE6;3|j#KRm+#_8AK z!XG_tFet12a)g@wy9l}3OUZHvbz!H}1{H=r@P1gqidQ%t1Ut(0@GV zB`8etc@5@QQeNkg*8bx4!7z*ErV4@BZx5W$`LD}tf+IwA8iT;*gX8vBtoZ;Mz?W+7 zlXZwW$y5TJd9d-$w}mG=V84h;75R>rd7wU^rZW@+HC&Uq2A6&?R{OFLN{CoR-`pO@x$^=OOyS3L6P?xUUYQ z!x6<8p|6%g+7!=yq;;6|^W96g2gvtZm9@)ZnH`_{p-CsQlZ2s{H97CfKj;qKEgFCu z=HT|_)sv^(YibgrmROT_DnAY_$MWp5U1vflb~|--mDg|%99=whP0sbI2BY)lQfLWL zQkA}oq~Xdhp-Pc!(u1Y(RBFH_qFG}^Z@`LSe|qfxoob*cJ3^x>sQ47Yy*at1N6dM= zwuz?LW6#0I3J^keUo{Zu--3D`B2ShQmd3TakGrU|P4(;2inE1;2m89K@NELK=|1d> zSPtWmUg((Ytb7dG^oN2Sa`!&U?!LCGng7?-X@LPdnw#cHI-HjVUq_SKKSc!G4>L;a z%1<;y1!IbiT(;@p?z-e|`uwUL;`SNS{#+LueixQ{gaHr=10rg8u_HKE3c@e9dSx~Y z2tP`ylt?%zMC%(%YYvl-+>tZ7vOav#iIiU5&*j)z$cG$=(@QIWOvIi*R^T6W<(uS9 zY7}<`Up6Tx-v%a6*!HvS+FaEr#EW1boVf;XjbRg1l)Tw zh#Dj0SaF;oUxD}JpIO3G+;*CWyqUIbbHWkTQ%f$}=L$mduNz)Zj4Tt%nG|$OJaJ{Q%BE%0T+|f279X}JY8}bP=#6T+QiEg*l zsThC$*j07$$^cJRuabxgRNw-u^bV5A(vpUy(7Nh; zo3*x>?IC7elpv3mn?+weG4nQ`KEXkImOPbBS{kuPGZuSEKfEw#3X zdMx6durm^H9=6NoK7c6w*8q?~Tpw?#K@`w7b%Qs%CcXqeRq%TzCilwFQ>-;CRZtP` z_4!|8zm4Pr>=`=;Q{%rG)Cj#b$kFF`!oJ%ujY=-OtBg=WJIk-29WfyMGju`8E~4-j zT?{6~|%mpDatPcyyNrT&pH+`OR&4@ufxM1~otpMEF! zswO3fO_(oA&}YmdJN_|ANuV8Xkh%UM?z9-dKRuM~2y6orlkMqzK5rqd?F1uubN5(x z3_iluSP)e%(A|H_R7a=%(s$|ek+s)XIsN;_V-ISv6=+)xOl9a#;@4Y@UncKG-Q|oi zzg5@6t7DWR(Bk!u&I8n9^)(fKAT0TtF}A~OwOl9sqeP#$y*@UaTFDK|IkJSBa{)S) z_V(*;RX1;pn9qgMJCHA~iMbTT%)kl?JCbH$x6XWhnh+AF?r=kc{JnDpk=emJ-q)Z- zw1SbfG*ATSSAgg38x=QS2M;BlLD1u%g97#w0|j&c9ti=DfB>IR?#o^((;|w2 zjUjcC{LO#^^>6qLyEe9_Mp}42?A41Zef!m%^uc=l)p`Db_Z+;!$7V&zz&63Sp%AI! znDSnDHoQCa`18-X51A+m+>R(;JXJ-ZdxaA9qAY-1I7;_tOql!(+9D8+$B+d1NbOI~ z#pj(rO{fO#7}S?i@xMwqv{bVXe>5U-zK`2Uer0WPJP^rora3`aq#DyV$Xe1yI4QiP zH*Sgoxq*``yg85ri)Go-O2ah z@rw2!wecw18y+YfiYU3-PIJHo6z+L4Ei=?>lp|*AB zd8v%9PfjJBt*^%qInFX|6Jyn{4@tQ7m@`|U&~AGQC?tNU5d~u>|JliQG9on^;oEp+{)Q6e>zA50mKw`9xB(jB_!h3A z*rFs2@XHkOdBR&Po~xy5Wqk9#?6~9!?(;LX&tn4T=wlllIqfNG*Ny^+tp;sv2}5k% zr28x>{q_MFii?vXwdS4geWOS|+YY4o?gh%?xE{x_aWKG*eik_R#8VOEQ)$zfBqa(y zQMj=e@yfy{imz~tDOZ%iAKX(N71*wc>vGE6MSPS$#_VE#<)Kn(Gp_rtpW67emVE5& z(&c>l2Vk&s6q%)F!o-VP?1s-bTuV&36#BGc)H(nN#r+FbQ8Rwuc!uEnslrEn`Zon9 z>NY`p6)9|w@l8kspMwLJ2F2xp+kP-Dej{Trt;;hzhFSAid~+k&Eg$+9M}y=}OsiAY zkbxbpU#f5(!VaP&KjUxoKI67u82I!jxR5JEw(+#n5x3H) z>t5Z(l-7Zw|0(`Hn2>;vmV$)-onj9p3o`9e)Phf)Vk>C6se?KUiAoG9n^cjM zY*@RFBunliY|VRp!`4TyTG?KJSYdFP=#t=)@q1C*U|VoIlXEN&a*$^^V4NMW^|7~ z{7Q&m8)NFHjH1NPpPIqvAkN0f-Rw~~f@t6Gpt}Su+NTwoo_WN1kc`BqI~)9q7d z(QKxlkdSIcqMswn7TVNWVGDR&@x0ImWbmCtB5WRJ^``0AlOO?rr4b1xBDC9doCjYc z89*1oxueHb7mkjj!>8ek_^xnC+2=HB-dIt%PwS!Rx4Ce;1n@a{(eww(uZUP8+{z32 z%T)7xCA#F4@sH{@jjSZoUsc7kJx=Vtg<_a_4k*-KoS>Hl+lH1DgiY_hk{=mDTT4;! zEnJk&bM9Le*Lnvw%_@gm#36yK4;g3ltR&8iRjXWfi7f0*o(=+9*SkLqSOil=9FaisrYwy_|NY!jmFc}IdmMhHK;Y*#NDWnkyVFV?MG7|mQgTb2w z+W1)L2f-kv`_&;m6{U|M&6O+jGv3MJjK29bvV{tv?DCF}bF^xw6&(mC;iG|8hit`_EJmuTp%xCDk%5y$YbI-PNRV{O+G`DBck28?E>#)dD+|t z>eamChNGP%Mg`YFIaU{rIDn5{CX^%~#_OZcxWf*OtL|+xnt7n%4vo_QW>7$*-`iwh z=+erEuU@B4M*mQR7@E-9A@I=xjZFA*3F2_|LnL9Bjz2EEnO3qR%)LoHZb*g_-r4lN zbuOrHcj*YP(67cGc@nhcUBC#%`lBRCATRI>BLQa99I>xP9I-_ccS#rs^$eVkzvxv_ z0>mDFsgu*o;7Hps!Z{K^iDf{3iojP8M19-F(63SQg$W4g2#8B7%!m=*tRpS8OhxiMT2?sO7Y{3I*ce}#|r8}vfuR^o&7J> zRlypb%5EfBA0(`y@s~^ytIQ-Xn0%3IbB$>=Nm07A$Rd9G$fb@SG3mXBpsVmeb&DhE zVCD$uWbh)!i(7#UaY`N?c=K8)@Pt^D6G?0wjv{~cS>W4O*qGW#?#tP=@Ea+HA7c;% z_=a;NIG4aLFXG!0WwM4crUvTNKu6py6elf-7e8~y54JWSe~vZ|0ejjK^~s2FUib2$ z%n5E>($N8n(Kkx5`;fQ~=#9gqBX22$zis6_n>NPhWtSAHg93DASFBXj#h0F^Yo`mI zMS1(X3CuH_a!+YMbKQZxy<;c9(pE2EbMXx-cS7SlNE0R_&Sk0PhA_oldsh|D#9XtI z@aXo?#cKA)_J`o^8ix2NY$dF4wU*Ey^-ic@6xWrgJ2nfdQq zm?&TWezNRFy5B%vfwmd&xclUU?{E~dFMss6{zJG~6>kF~ITHb-J(er^eE9nHRZi6; zWxXj}@tw@(@_lkb>3^tmU4p!?S*SN}od57yCsd`3JU~=@V zd%y$Fnl@Mb{nZAAmZ0jg%n1{;k4*ZxG~S0ylz~Upu2uOJzAq&?-weKL>kMDqepLX! zI1^tGT=6!TAPlH_)f25oqwnAj@l$+bOcOTGcFNFLAOXG`ysJ*2N5VhCFH%dhz1qmb@%E5HTuy>2n-xa<-74%&`h`u0%MbDrp9WO9yrjW@Dvq`Um?E^ZMOJJ zd9QCwIa7zspNJ1Jk9FXHmqUBbizc#Rq1TV21l-Va;LNzbg>M?<7yelMep!7xR@YRajM5}pmdp>v5Q8S#0M@TJjDTcuNUsQ>>58JB9>hVE zXAylZ#Pk_UhK$(bdTaMCtwQ&hm{uUVUo1b-UgY2>+V}*s6iNy3>SgT@^E!DrbiRW^ zk1S63bPv`!X3(8mBLkeJ9&pxRsus&zaOy-;h_vy^WdR5fV1h7Fi_6^}r!1(4(B{h> z-F`^bAPg>6^FdzhQ_c@I%E{1_Yn~7f>>qPyho^t2tbWR{bVR12EkC$fQHk zwy={iHi9zw4ybhV+Thm6>1Z^Sq%?dnW9cxK0UxNq$mjvpATI_csOt zgZN)Z7vfX-{mbY=khW5@_7R@^WDO+E_pL3!iy0vKC-5Fn1lg|PiD8fHkB3||(y%Po z$SxO(J(Am>UxrX*fM>Z-?hiCHWCR#9IQBH8aCH#hP{aN4GrIfq1l^MWGeqREkR4>} z_5uwVRm`1g9WJa~5$XBwva0fu8iS_p#Mn-$OrsmVLJY=et1K|n(9$Va1&M7eGL_0` zNco%viARtLkR24BfT6}$cyelfegc-<^>Ac&_C4>(ZmeYl6CtJPxIaG9QkcFza*a|& zndGUkcWc0#*UdlWmi&mWh)-BiqFuv45`|wq7)A#`%iVvI26=F{J|ea8ks$xq**YLW z>g_u%b-L8SnOY9qwpA_Hv-DHWDp0h z1YetrMlVcwwj3zR-8tbqGojC(-8B@fjcSZNlS~zt7K>a}+nc8YoJg!M*!O=;^5OCn zKEe+$0NSf8{WMLg0`W%!O0sWN#uV>m^TR{Iz?S36$%@i?aaVmJ@_W=E5soBT=QV$Dug!FzBG=>U#~ z1Md``xTSB(o0sn*k0vhs(-^fg^0J3>+kWhB!WJ%bi^+K7IA#t28e^ zFQy@va;<(f%Y9h+ASvJw2P%G-*X|Uo)p~Z1)%ax>&#bh^earP_kqw_Gr0f}Id$t8A z3+^ufE`)H>EynDJ#$JC+4p88nD8`6mvZHt>ACpK?i~&oQKKKw<#phMHY4SY! zbPlo8QooCiRbXJPTV`0nD$18-3hfb)J_U}YB$~v23KY4anK)v4@W1~zKH)P+7iH(G!JqP$`m-2i zvdh;cwdIj{Xs3EE$^;mt-$NSge8Y@B&eVQ&ddl1sgtggAQu^BHG3zR(e3MFD?;Bwn zJI4mt4f-Q+P?SL^JA}cTEbu+hJW7sRB(|>FUXgBUaqpyU(!0e+b?A`pu6reg(B0kp zpUoRtfVr?6+&zU9Jq4et)r)CmWA&4++F1;X-x*@HIdr?)GsIOAsoQ!eF>e(>SZDfK zffU+phmN&ty!&)0Td-;3{pU0tnp7|=XQ?6x(0d?g#1;1~;Qq)pDWlb#bmuIj7Ig2p z`Sz@Q_C#r=5O2nt7oOniT^r%6-$cra5#Yre_}XFW^JS#W@m=Ro%bzpkLf$ADlz(21Yc}tKewaV~aJV4tmEbg(^$3^?T5xs@yv<*m z*8r5n{IS9ppt21)IU3A}C|PSqQ%12rR;% zAs9cS&}@VbD^#q%?q%w<*BSbL?@(t>L~+0t_A(sR*MLP}A=)#B_3b=oV`*%+U6Oeo zHyJ{2W|NYI4bF+OxbUlN$APb!y@oFvCSn2<4Ikh@ybUaC9c0enM5flS?0h6t|FT*@ z_JDnOuZJzyQ`T0C1R5Z10Um&RAh4`|Y4-~HBXtey692o33_}>mDB%KuIvj=F@E2zh z*9P`U*Sf=5Oy-SmLCNaa)<;`+>`ssD!sjr6$}LC$u5PH0lAT2OVnLT8 zd0?kKnGv1FleT=_qa^_}^Sw7L3-q|Z@Tf9h?Op><7_q*)FWdmb7P3^UT5^*SY1i&i zTnof)4LW1lZI^n^hW8uF-V`4N>iBk1KjHCChClW(5E>5PrV;r1NY0#vt*I$#uVGGY z#mI-n|Btq>j*Dt-+nqHG-3`*+DJ>wOu8x#PO8`?|-NA`CvCHvQE?FYA%r z^~~pwZ0s)^2vP?f`_{XezY$eH(lHHkdXdcI$v<6sGOn#q6VkfBD#BeU0@`Sh8W=WO!!%rkK!6w3P?_yo8`_rU8oBP>ej9~w>OrT}K3VhS9< z|FF>{4GOv~Zz^GhIH^chdW|?m`#INl{x6UeM_KSRTdU#lF5736>5gg}w7-m0U&dLy zaJ&atY(k?xOogYHF~QfVX|M8ceeJn{VOBT2Ju0g?tn!{!N^_hcdSY~z0o*FfQ{Yxv zE@R7afD?ELP zDOd&q7e7gL?}&Or8oaA8w?9fFMTy+{c4}1?=o9-{9CR2T@~)D6n=zwd%VmI=CxN#o zO{&B%*(ZdrPfyU@nidz{FBP??{>o@W{&e!BaSzSskV-1Q=W|Np5EKk{pt$Ac#JImjs0^RP(^AQMA_gx9 zC%~l!P2gj|v&9iEy2Zq}3-MvTm|>k+^2Yn!$-Vs5btn1`>%a^2l)ze4@Sq47n?d7%qOojJWjbDHCP`; z))Ny8_cg%I-q!42&YsR;AsoTgU*j1r?|H2?PT}SIj2yU7i-rB&K5X!=Kat}wVp)sv zxV-h_)jK;*EbN~rmK1;R{B%R_)!@dn5AwMK+o_lFnSp&MB4#oS1{en5y#3hqF3L&| zIS}go!&kB0_NAN2>o_-JHD$`s<8zGCX;7)PD+Lkx(Fst<(FxEocj4N)8*Q0C^-PA> z>QS#=yEOg+2@ptE{*CgsZ)l4aL=@DoaKEW%q2BA&%@QD3|YiOtnC3L-!)g{w>N`pb(|DL9M*M4eIkBnr2A9Yx|iveY|q zwJ3gDEe5|Xt8}jt8Y1ql`p>!6mF0{UfSvHlQH>?)G!kn-n2Z_))&9X@X^WrjyUI&cU%q%_|m z;o^hqX#XvT5tYvOmXTOZpa zhyaJrSm*AdnOV#qW!tVF1A$LdqpBx1sZQi2_YOr7Azl>ig01f=0&jgw3Ertb4@>1q z$*)&G$rt<*pn#~cl}%s7EH2z9;%o%i1TK1}Im!zgCHx7C6`QKAX;jDlSPjeSeb-f# z+i~W*$`*z4E>n#Hpcg(|uO%SDnLk|vg>2V!g7?=?eb)Xw#x=f1_H0R=jMRqu>5w;~ zZ#C|H?M1d2BEMCHQXK^BxY8>i16kTOxuvp+P|`&NQ+Y{pUD39!1tvUfM$nRT)wg@p z_(sF$-?Nv+$y4ieghG_ZPeyaBG{GDl13lQSfR6*pM4=E)G67g8+T#ItZ+d#ZD8G8i zkK0KUeh=QoySJw|UMe1OwJc)>>$uv(>+B%zVhG}v@#5~Gg@j4d{#cv*e(;fB*je#Z zvQ7niy%+&WJxQ&FB;33K=s0M;TjHMr6+YZ8V_f>lV7eM=R4IH_^(<1S=3&o|>l59n zXHo9?TKkC0)#pGXGoj8eJ+m6dh}!~nxBHt-XVk4~zm`JYVEg?w{n(TRkqtl@tQ@f1 zI}}>*`Mn>FaUEEH|7F35c_~z1*wFBx38(ON)LanEMZzX zQ+P3zChg1GmLI4`YcP~hKHi}G{I*mUPgPKcF(^GjGg5@zKsuMGT96krQ;@j(INvMU znP2S0fT<;b7qP)gNq_9y2QKdIxBcvgzF&8iul@bp_+H`X-xLCM9_C;+nK;UfKRXL4 zXG(^%K;uIL0x%P$4`k69H=T07-JC^iC^Q)5)>`$DXcR_}uCX>RT>PMNJgt0RMH1yt z3?qgitzrT5stiwW)-pZ$rG3$NPpPp6fuK!g?sZ2Xgw(vJ_nhb1jVtGfOk>6|uI5!= zV485R7ADtw!l}7MZ+V74@ROT`<6>d2qCfjre#~<8%Y;yME>PsOGyp};eJz4sEwozV zv8D-5D}K)=&$GD!kjy6ojmzSl*rWBYK02d@VcTcgbuz>BncZ<7)0mn))#BhMQ>WXf zJorf0``}`b4+S_{=-|Gbj4SObESC8ll-n=Iea~^dmQ*#uH|MUcw+j1^-#h;<`s78i zpob^<*Y>2>xuh^HUv$4W>Mq=wTcthotMsm^)3MfZa?fX30G0BZ;s44Og|MJFMImiK zvM&X3N$KFwiuT+gm6eJ%duni@%g}}4+MAjXyxyl-rH;mnx>}aq`syFN1#;ZYz$Y{t zRF#5ElkiLa94aZzlKllExW*>?R`CM$>v+iPtVgh)kCVSgNQjGk30SqSy<`*E3&{TX$#yc99gVs;+D0Q@{pF6)zI)f zeq2UgMp0fvMnMrMzn@aqkd#(XR{(16uBY7GWn|<%dTSlh+72Tr;|sD$^}CWzgD&HS)J?HEpEwq>lO<<()fsYAiS{W=F)oxeN$ zECnt48e&#Knch@=gFxe=EvP1fmdK+c5wQH%;zEn~p5|*mk{`T@yydM%=XYV##$uT0 z)OBeB3Wn1#PuG$M1}y%;!vhnzP`>?0Ua_aDytvka3wcc;i&^B+`1-Px)KZsGRd&4! zV9*4^s~lZ?1&ge_6KpYx70YgG=HaM%f2UL@kd=o(TEEz*xcTcaEjO^EPVg*Lxjm$3 z#38@zz=6iozsm<;-YpV!PK?7iZ-1=kyg>3_wTn0Ll&)Ts|^X#0D)#f#ugW ze$QTc?!x|i$BF5C(0S{Lg{r5Au_E2!2ypdk%&+sRj$|+6u0$u0K2$Mq%UTkUpyC#C z#E8{hlOm3M2k2;y;^0sNsUm<2?-tcRZc_XCA}YR${_fi*drC?EyX*d%f0FMncN*h4 zz*GWLkbj#ZQCOgP@!x=E#O>(?y#Ea%ZU8OkFBnfEv;ag5X3^Zgb}7QBZrs)JGPh&o zGtylyhp~Hfzn_!{I!Xwn`9RF-DBt`0vk10X1oUI}FKnJU57fgNDDvFK2?!_}c|lx? zcMVdo;14XRkhRFYbXI{VS8&;oeZ$6E%hqF-oLQWvRHYZ?zoI&au*X&6Jft>(l&3EA z(n^4oCApziZRfhZzw^VuuW(fQe^TW<#0hZKIl&5`9{OK(PHO}j$5^1(;IhBC1uSG2 zzKsjSY3X|F6sNp=6u3Yxwb1%dW$u-E%FmLQ=i&I(a1!*Z8{^8-5lT<+ank%{oK~5sBuDJ4%g2&W)MmR6Ul;fsb8uIQL%8&^O7{_2UPpnz;mEm}Alq9; z@+-4d=H>3FuVkFz{&74f{0q(EXs>b_3%@&Bvlm4VI1gqF`ev9sNcS<9F&5D@Op zv8tW1|5+1%qlzleZR0{3#C#TIC8T;2+IJ?Lb4EXNZh8``@)fFilyu$KtUrheCGh0m zDlSl4+$7lvDW-O=d>)~DXV)Byh@W#`Z9vR;&r_WuS5nRXmJp&6jdEXs^Sh(UtXLja zV+%f&Lj<3gM@?zNt#KOH5APp7L!j2=3!M~9*vfBNk2c|bn*W|}(#q6+>E0jz!s=AeLIcCF^|Glk}%-xHhAW9AKk1dtqH{i~4xyMLwq(N6DXf;0$cQN2@t>pXv-CDUn zwyX8;t(EWuECl2waBY1Mm)zntjX}R_BLoNUw}Pk*d>A%5;vSQlI^(O9hSGJsfc9aU zKcE~K0p#c}RRx?U_V2bzRa|{Je*^t#c$)a?jH|ruw#Ik*6S$~8)Ky!yp8q67K zI3gctvz`NNjx@+Y4#QwBS&YAGRc^o1maA!sp=RjPpwu0wrdoX3S&Q+{-wCa0c!6Mn zkBcXa!sCu-zT>9IOUXu?1-v5Kih-W)viu26KZeFD2=NHIzrOp7WBX2#;<2s~5Is2B zg5G~iEE|fx5C->;$O|!6FYr&7J$`>xui+N)?S{gxVTRV-y08zKHkr>~3~R4?8<8uUOb~Q zZAI--{d3~R@ptOyPAUzk(awdOGhqSC7{RLHmOLmB4?i z0|nV`1c5&z+h$}!%_2Q`Df(4j58Vd~xz@o8tsv!!P@cYcpaPW(m7loMF&6NHFu6G< z-(5sp58u7)#J8@q4f2GQY(=*r>PH~kuwn&oGsm4G$OR$SjQ(Hq1FWI2f*C5}z8;aH zoP2U9tFsVQQMij=mPbj_BhVDe@v#O8TUlNa_pyg&$(> zNBMQB_8(O!JAu_iB7h+N|0p2F90d*=E^%LQs9=`RVIc^xgg|>r6eprWHu&AxqC^Qt z9Ej^P{r1ncd0gepd-_H;QC9l&&eUCxIx2=?vqTarcF#-)N0iHJRW``d5qWn66@8}Y z`L+t%qbukRd%GVym1pHM@*0`1?6wAy5x)t!V|^YxFCVx+7cJv@vt@l&i^)Ejma5Dl zUZw8ic$lgdf$=MPJ$a=?^+)KZ{iUg5czSy)e7WB0()OG#;JxOsaV@_jr)y*+|G z!u<8jNiZdOI)-erPlT+A6*_$Er5{v&zi{#o8?P-oErkTrM#**ueuN>xk#a96|Sa$aD#K=q7+=okl)ab=HYqA6#-h)#vQI+tPhw@{}g6rzOSF-0WXPvigMKB=_X}B=WWsK_DXcfVb zoW;ea5?S`MG^;rbtUOL6Dt-Hy{{6*YAbmcw1#$t)Wk_xjA16&Cu^Aq!U^X7HXFga% z@fa!bx~D2LAS%s7J1Lpkxs;Ar#AJO|txS4KeK4G4!bW1yQCTJ^nmfRaC86RbUO6Y41V*0!Bm9@1Ui zzW13_(&hLXcqX0&;F+Msg}(PloznQ+>BW$`v~((>Ksk!Jct_k1iEet&Uw=KJp@_Y8 zR*ZhLy0e{%UlnX_I2gkY{=wDFd-(6t7;+Gz$>3!GGmbF-yTFk@ULsc|glh=bwXNTE zFG7(EdP$p}S1}#YG2cZn+>8yL z-U`?pEBHu7C2&t}N(q8Y4$34qZ;sKf-hRybH0#QMR`}S7&vi4m&fXe4*kqepU;}}> zBFbuAH5Xyedqb3Z?9prn(>Lb8#IJ;xx6STpU?DOYV1Dc_@FEqb$)1Q(=+T>sjrBi` z=D+{f6XHB98wiqk!-J&3`Su79X9NH_jPy}@UXp)fiqK#2YD$s&b%9oEd-O)+<ySBvYwJ=L5^HL_Hu&TKTm+*ZhjuGYsK z++2YPTC}T97fxFSlF~%VxqNlt>P;j{=a}XjvY%laNH2AEbQngtFazEKZgvXXZ2=mT zaXDmox-x^Ub62P|1@G2Xd&xk}YKNB7qFgTpt+d0pxr*>Rf!D-9-cM6SEzxZP&`d{FPn`^+5&PR8Wra{s? zF2jFLfhof#j03IbxC2HUUP}>p+b$E+I2L;I8iNyWmHbcP<3G(Lt1~s~>e#;_b&N|v zfD|uv9m%Bj2<$WvJyLPL?BHvU-vgRKDpyCkGq6?rd*Z62%$z1xR#m5)fBHxBw zo>;pDEVl0nkULsZ;-S2`#QhNFxZ9JbiD59M&r{a340-^N8EaXl;|Il)j&Ap^Fb>C% z91FdZ)b+*oE)gdRQlKz_z}!neFVK9PIf#cqsxy5A`Z$MVJ#j9qwk&{R1}`%XYy$N^ zGne7dMVEZ~T?NB9g5QgsT3vVGk7#%ys^Y!y3{!6{&NO-t}$ads?{fJ>Y`NI%-l9vS+O z_jv_h(9`V`7v?T}$&MY{4zN{DH#1t5(@2NsT$r1{OMxexPKc8S1ont);FyD(`McH{ zHJ@2@mW9Gw|h|48nmu1e!AA3jdu z?Vg8kMf(}GX9t@{FvS`%e<%Rw7hwY+e$@J{eFkDv2I3Sta2A6JC z(a1l7AMYG|sSyfu!DN_vas1R>0e=@-hBCvjNh@Iy1e@eo{>xV?giFA#@Urz+Idq zyH;>BMD@dHD*Lq{o;KYChKaJ+Z=DMSPc`EuQxe)jz+JRlg)PI8pw20RBgFecnvV^7 z{qk?>H;sF;G4^uhyuuv!5ugrSMJ=D|Ijo|_5|AU1auP5Kf>6_-fepzaqO)vfoVOmf zw8db{v3P2pqrfC3i5@H94FDE8#3^FO@@8>0gpN+JCelCV=QroTE4cJ_Rz0 z7l{?hB6DXOtUTj@0Qtm`;f+}(k0#uO^ zc)*gzqEKjln?OgB1;#2H!`#kRw}`X9nc7;xmqk0wT)wQ+Y(>%}K&)4n_Cdz`@x5z* z1zK_N9Zc$h_Q90gB8abu^#$=?MW2)z)aMMig~b2A)qFDZhvUK=1rj7=UvNjzn`|Fr zpJVCnajkX?ZJBx^>IcGb7|-!40AK%5CG#llNVtUrt+nxL!Lzx>K7B3MGX2ft`9f%Y zlA0CZTnLDmDnm*L9J}IhN(+ghPc~wK#t4cha$@g(bT-|Zr?v?mnjUBj)`o~hz+^%f zLvZkM!wNZo9*T<^`8R50R+c2o^chqC?8&ypH*HbPKjRy-$;B;}CyXZy6CmxA5CoV) zD6?>ItYAY;ED3l+xXc@t;8Stzw&s%32-GTQp7^+|LZp>Qrm=Z9awQ$IH>26 z1$00}PXHUd^C3>48;3$5!8SwVJkQ{DoGmig{6N|n3*jD$Oi)8iaZJZVmTocG)t@v9tW;dPkao%S`B+O753m0lY&ceonzu-fKqkl6fACs^AKt9 z!CClz4X%~Y zk>5U$e5^Z<*jIy5XCl0~18`!sWMG38{231@;9Z2QAp|b#0D^4<6*K8Lgm{+--g-$5 z??Mu4rw0+M204O{0e-}ue(7FhEDApg24ROTqNL;CJIB>y+l}PRg;Ki$Fa8)gsVajY zhceY*k9Z%tU%FR4*o%qhsx;xrQnZp;GWg_~yZeMf%-ycCdNfR>2<7)xRg4I?Fe8X( z$uHvnI~({v)jaXl!PfYzK|qfgJh%$kKt3vgrM6r4;App87Crl5qyC0t@q;8*qgvjL zH2!kAXN4RrfA)~EeC|NM2n~~hkCcKV_5@E97aq#40kjx~>Jkl>_PV%Z#3qUt@MXSl zb`Tb9;n6{j%T}F28n6SjU;qwqMVXXFnG`c_A(Ky-QrqD-KI8k{na7ZQVD*-zZOE6K zBlhB=31Bo4!i_?ZOxl*j6xacfDiZ&K?EnsqUqD7mgWh%<~4zsGEMR+6}t7E!eipkB6&#nPF6bvF%W>v(v=tH7~rDssIHJ1 z>7|DcwpayJ8IK%K2DD9d7n!lYlSr^LIU)S0`g*krna@cOd3=lrb})L|9fM z<(A2C!V*%A(Plpv&kQ|nE4TDOY7RILYl{qte*9p$b%5N+Pc7H$dC2w~WjwWi$OAi| zV6+Nn3Db25ayJSdDPOmjIFuxcZB*eobD!sfGCt%b3uE z@|jn;9B&=iOA?zZM-whnL@UazUjzhqTfcwuYUGhX7Xnvp0iPNC+QbFP#loOVtz`r2 zLMx6kx)mJxf5=(D&HFdvrULorb2mIp?K5k8xx7PzY1Q~XI~0fAR1xVaeK>iM5o~{J za~Od;oYNhMo8=AH5>7v(eRnB$STN^VD06+9mx%DQml;1c(7M~Bdc2oB48hJbHHCdW z+*JVrW1OMGX$fq@+EzRNClj5QyNl;k#cVCiZzuST|F(Pl;DyIH3Ugiq<~>@%bCK+i z;?rU&3b^>Ru-{BaeJl8;$ox3|WZe2}-Jo^ClG7LPI`ABSS6mt~+Tlt8P72DW@|QA% z$z{rKdsf`3SLWYNQj4Y~-AlMB4hA2^fSazEAvjF_C4f_kOPMMT1+cJ%B ze!2Q*%HqX**t1mE@8aQb5J(S@>UwJZ0(JX9`kc=EckYWV7SpTQ4~y(x2*q?x;5B%6 zfqP`c47&+jWmeT?+?05sWo&bVH!erG?ZfdKa?8l{svnq7!ANQUQ|8wm zkvM`~WEKTl_Ku8D!T0?iq?9;AO}Z7C7*n`B(k7A1mx}*V20T?KdU)q&<6*}}`2+KZBQy!hjy796If6eR@{lLPtJj0ms-4lvkI!a)Z2RkaX-iruZs(lNQ0c z9&)gCStRi!!^euA-9R!W-{d&k(GsWE)vlPDFu3?fpo#KY+n#Q>TVNC3Af(ufvhfEz z`TZKCdJVebV~$IS$am+=QhaUhfuA3Kej`O==cFT`V=cs@z4}*c*cSfos zfGe(up%L3eiIy|Z9{7R& z9s_ID2E>@k=!N< z00+}z_n#d7|7C~zVdV}cMVjzaA&~|H3&W-MR~Y3XX!wv;t)&K+-yJe9nGpKgHw+VMcDK^cL_3d)Sji}Ek7KAWzsycczP zY}4H1P$t++$e?6&NKU&??BvC)B89twP~?f|h>!2*BNjh=uUT`2n6*)^ma6BDz!L=U zaMtvN8bC;3_Unyx5B?hIg}0}xD1x8QNu|B(zI_?V#oHjnd3yo2(4fBe0S=@^VI8(Z zt_iL(I~d6cYbOY&Y4?0wK6|b#%b5x7czM9kiQQPraNsJ{tB>PtGOXZfcwdK|Elvhm z6%uDxACwIMh9hY#vFfNp2H6~*4i43X*mx8Go?xQhp=iQstZ0J7x&|w;cI?HN@5`RF zN$+>89Qo-liez={YKgt$3)h1gEN-^}gJrW3>y@R-G#vhz+mD2Qlb}y-R1FsVEnl$1 zWW}RURQvQ|AE0&uTLF7ztfz$q6>xc4owWDSX2<0b=X~nKpHEG+htABR_|?hMi;L3# zwC7j9y7i(=MdcmJ4n$MnUeTdes)9wS@ z?nI&86)Fy&K=Nm&QG*9pNNezL2FYLzP1R^wE*i8QKZa1#xMKw^b6Sdfto!Zv@0Tvy zAQpcE1L)!dn#NXQ5cn~e(=2C#FMN#Ci#R3GdS>L6>B|_k`${Bdo}iT@`$<;Iz{Ms{ z;13=F-5n>0Hqxg5ev?*@{o+mA=&zpy7tP;ncfP&6*kZ%{?hF@41s%BDCmjwnS7O53 zY^|$UGW!)!%2x##nVx-lh^;FAf~HLGKCaJFd_(zZh$A9lIIZkz`Iy0RO|WOXOc&UN z+Wo&%+pyyaB_w_SLEhnu2&?CoT`Rw)dW;Q&I&(@DgD?$->K2h0gIg`ew%lXAcc(&A zpy9U!L(jCr2#?R4uTe?Om@I(X0398`qf-jTJ+xcb4;xA7kYG&7_iK*_G>(ZkP)HJW zla%a{9oLIy4>oE3e#|i1$_2Dpny`Zkfaw9GbOB@tMz2^=YL})AN)s*_Z3*&mZzTm_ zLkTmx@`E3AeP@=x*LSxvFsoPBFs^@lh8FKv7I{L5Fin6IpP?Muz`Zd|2AB;b{g}kF z5N@ulg?!Prc){1xJHH}1R>g|-RUZqcGLti&tn)0-AwG+|4pJHeG<>#%eC!|Z=e;#0 zvzW3Hx^?j8bVBw6n6Xwo?8B96I?PSUmavsMaxTOfazgJ+LjnnkupRbf zM(jXqI|)!kwX}fbbntQ3{ba{6;mij{aZF(@)pxm8+-@iDZl8u4pG7K18nzYD3AyM2 zH44`S@HDDy@S;s(w;3&3MLw(WaNj&@_RX=coyS~Pykn4}FzWJe+0irb9$EzV>8dvg zT7<)0g>6@2@wVUl&H9jlfzo4?$6J*j?S!Aey)$?f`n{A7Qs!hn)XEBJkO zbnqbuSc(llxMR2i7TF(|D$|+ih&pc@3D4+XPusZ(E9W$?ODAqh3eP{CzGn6iEMrLk zmO&6y$q->0SfV6-yzL)EXWC!L-ep}}XRmIOq&+PZ@^BzZSnfNx*f0U!3tcEBbrjB4 zGU6R!4J!aPb!|UgM3HtCEY-yqCX?S~9Y^KGz)BKJRf}bShM`>%G#HMSTkJ z+W-eQ*@EK;?6fFc0XKX$52ciFZScRn@_p#xi(mmviPkmxow=e>UFXGWyOPHGt+n|1 zv72`*ojeYCjREqoV?GMIpg#^EOP~h#x9s?T>f?vh9D%Mfp5fbBM^*%YgFQz!5Jekc z>vk#OOA2^}ORy1YQqd-dH5VZ~CsNrvhX`1@@#jnWAZAUJsmDJd7uc*97jOaB#GfeH zJ8Nm@fq;0#;qg_(lMW3PXfyGRk=m%&F!Iqn&# zjWYC8cD?;s#k$%_Wi4XaTm!aH=pJ|vSRvtZIIg-EFy_y*%${i8WBi;?&SlhT*0H>1 z6^P%)CgHMaY1=Tgrw)oF(n{Oti zw*3UFB;GI-7E-W{)PjXf(O{vK9R&UkW<{Yoal%Vw>3#@a>xaBLsI$@Tk1)P}dLI>+ z+QjB8xY%hB{;fM$sS5fn;2IIQpfT#5X#X|(pJ8u>ES^!w7OWCZ?PmTO`ND`HQSp8=>Ti_!>k`PJ9Qw@T-m9PIbkuzcpq9XJWVJ=6=;|Wzc{$B#1Uuc`PCZ1%*WpL zn5*M1ltm3q06M3@yFfK^~RY5`#Kdz!D0CmUPcG|S0H9(l)nTh ze7tAFM-Y^;{6CZQ4i%^YNe>jPm{_gkBV)&(D={Fb0m>c0Z2P{`m+d<6uW!=?zRzhE zL?~^y&+i&bw|{v@M(%a}D-uN-J60e8Q6C4nhD(VmD`dHdlv5ObKV#4*^^D~p77L+N4R`TK)9 z+B+X(7>u0Glp0)RlAvU7VQSCD0G5qD%0>xJy+)Dhqv%ifHnqGfvKpVW@n3J)F!D$2 zh)rWtFDB?RTPRWE+UZdY8*SLl2Rd2Rv%<4AyGi4(q~CJL8uZyDv^iM*qFBGLB9A(= z25vpjT3RMll80eb6ik$?11-Ih8VT9?9!nWH{o(W{B_D)e+21dfn*g*NIv$Y&C#@bf zYH)w)sIw00OPztX8$DEkoS!^Sv5_(ekCzn4yPG~AN!0vt=`9BzwcD~W4G|dhXg1w9 z^~C!37NrUs%Hb8vh8#l{iV#sDIR=vGEYV!qfN0U6z@;ITAeH8mZ?2%j9duvh zWyZ8!$i8!75{!8A9|I$v(Cgi&z9FLM@V+)aaIlGImGw-GxvlyPADB`A8pI)Kj3j>F zp?t`dORPpfmitOJ;?6=0O3&j&m?`+g9Y$$B3 zz$cgCDQoFArrDc2{51Qy}W%CY|q{4uE+84(!7DrFm_xeS*pmZ~RuFc$faK3?3UfhH{ z2$bK}IVo7kF{W+D?X);O5svq^mBzMs`Q5bG2(Yj-IoPc>A$4u}cIAn1W4H6q zm^XNbUN!4nZ&;cYHW8miAfgUCsF2Vs>PGqeE;$*O0;!<%BwYDZ3#IuY#0zXKg8uKY zpncnqV-T0ZVwU~*F!E=d66MdJP9oxA;YiNMRlV$k#8yeG{t(j_VS70PNfb;#*S?hZY2+0er&Qbyyz${&FUz+^cP zdExef(b4`^Mm~N+4I;l!AU_T+aQP~h1@_VkO~(z2zk{xN!0@)$yZ>@W*rjlJBj5#N zo(Qb)jBzmYqwevc$}Ww6)YF!d>u4LNpNL*Jm{kJK$W~)N1_2g}tA);cS$@lxQTjYN zirhKrmSV`@&KckNV)>NTzEay)Y7|I%4TRvpTx-iIb>BOx7o{kFEt);0kaBBtPjv%A z)6EbDIXS(h>z5bOT#_~#xvQ7yEY1Q?eLONU2UBF&KxBRm9Ll(skdFuIo~uPU5h0tu zUcdOrH$60%N&LOS%CJsz&=X>oM43#%htddnn4g9lA%XfpJoQ)+o`tczgX`+B6=o#c zZ{s9yN89q9{_2%iZysB*&7lnC;PC8T0jVzc=thbp8;|Gk3p`)4Sd(K2Kr4W86Hfk1 zq;hE&BkhxZ+Jp)HA{%Rb4G(n&9~?mo51v}77B*W+EH2}eLf@0TB#@r?>MAApcXR>? zt>%X(*)2Y|tZAGp-CL#G2s`*0YrI~8B({u9s9&*a zr~Wwb`63Ij4zK-cBCTp7%$>Qn0y7sM$}uFbR8ia}Tr%(cx#6ns1ZgH+6&!Q?39dBJ zfHN<{Y9b{;Vw^d;Yy_sfsb7Gs%69)sji-O#{jDiGBFWz;Hm_yLDWzR7JB9#tmH3y^ zzhF5BSjx^u5ZpLih!`kC{)7exOomWx)9T#2<$~6Xco1V7Uu-@p>rO`ROlXpmE>KtS zos*CTZMOP&2m(1PFiqqz%J`3}W#at^^by?{z%8L}W`}pmTts(Wx;(7ijWwiFmg!|%W{S_&fX8pE=UD~YtJQY+sb zTYFZ7r}^6y8e8-uElqnXZgW`%_p5;UpeQS4*wh>qXal0I4vsim`VoY#-7YK;c9H8e z98|oJ-(=P;RTq9%Tn#==hh^+C6U-(R{h#mAl{LAI=f%zOlGg4ho&D9zbaBhj>*~Gp zf1ZF!gz*SmiI4@l*K!|_z_}!nMVst~W-ULJiB}s zk?}dWbunkPoBIPWt6)E5KnP0UDh^cmWT}}S-zW4e-xmtcn&}YeLZf41kewovn8$jd z;8u9w1h>NSB7qz^?xqkQS6DAHo3o^^NHau;eBGjJmw$PfNB7Dk$r<8$@6SI^-mSIC z$BKr?LYA=zIZ!~w)lfzpi$yJr{}zC*-ch@D6&GreEoK`#*eTYh?(ewYYIKrp^ry-h z!ve0a{Ow9_^>^wr55p5nc(s2BPry0Fq89%=F+l?FmSiI5`3tY? zO{Qh@BPTBiJ8>AExWZzGK+6~#J>a6%5y!x|dcdp7oa!IM`ZBk4M7=MCat*tZNzR|U zEloDMSodNc;Oe?4&*02xY}Nh{RmWAg$D-=BkdhjC!}BT6m4|h_%4g%Z+brgusJkoi z6%79HeAKXG0V@Svfe(;(!pypIl(uf_Y#W}Q{TutbEz>Z#O9Tq1h7QAj1Tvfh+$y#k zz*zxmUT)!Tm?DYpqkAXz_M*H(hHbzm(V+Q3)D`f{^_C*vGHPKp{`|M+vl5q_T1^}J zIfTfoAZ9m|=}Qn#tQaCs8)Ed_%$xr(83#*Ud;gWDRr6gO;w=Am-wir@KL2iK(?@JQ zD6=v6hJnbf5g1BbdqHYE+RWMx5ATuLR(L#DzeS@p=U^vi_<(7U^{K5d_q!!6+hLPp z2p>0Gn3Sp!5~nGLc_4T;AKoWM_Zpv5bjr_=;uMno41}x+D|H`u(7e){_5<=ZDDO)6 z*5N8hfGtG`HwobCt%buFTr~;s`ViQY{}M|7ANJPP5(FQA|5A0t@z%q3;&a?zHZMNP zdwZ$SV*WP2yv&diQXfbS`kw_-gXR%N4NPuVuQDX$l0HD!WwzV9KgkCozRgIq7wXQF zNgGp^b5@F4BbOZ>m_Dcy4!8k3D}=NH1V}0fD3}vL=04Fy0f>FfU{dZxSFr(L)J_7c ziS3O&a}E*93D^9P(m)`}8A3;vJ(hLKt7@NIwa8fvNklw+V5^0%Jq<{>YLJ*(>^2er z)t?9lz(ksRp#B#d2hnl-4jI~sleRz@I%9iqLOh?}L@b6U(D)`;f8rGJTre1r-k27H zENkk9lU{-WN2gFeMyghLrpW|{Q7YIhxT+|PY0+lqI0+fwXT6SdZnV1`>{$Fwf_-(U ztfZx*WTctY*!`pmC(5`HY!*`zFmX@r3U1{D5aTCuwtHHZu4Y>tzqQ_f|3~%gxvNX! zXWHW?Npi(GdELOCv+sbH0Zj@fs9+Q!CjH02_iyh!G*?B=os*&|2xWbwbY%L!PQ=* z@Rr8aSfv_Ih?8k7PKN}~FGcbvC_Co!={mn;M#-hx^3goKeQm5&wXEM&w`Rbb=$Br9 ziZ~51!bc;E$awBJUD}+h{8v;f%H#&SB$r;yQWHYy8nn>fUnbKR70(`2uD|T+TbjL8 z;eYPXL-{v`&n)J@s*YlO_ zg=$8Y)Z)Q#!M(hOC^N6dhVn`yjPIwVRJH&IMU9-F>1C$`<$+9r^#r^! z>RS+Gj0>IBVc#div=@xHZ1@o+KH#*A<+Zy{-yzzySeO4M=Nl$YA}@>$goLK*XOaMr zz=8~}!NYV>D_E{PiwiU0@=Xj*r%vUTl6ez17Os`Q>W4H+hwD}juVE13fGpbVZHsoK zL|0M3Pa%t_ZvT~&Qrh9wjrA972Qrk|(bW>*T1yic=&zF7C&P)h3PoU@;03b3DD2v$ zQutFa31IoZlK`?8&r%{@=wj$zCvyq6eg30bP<4y$is*wq+5`G7<*(nsnT8pG#^1o7 zha>=8(^bGfy1KknGlYKzkW8Gh z>D*uKbyTO$6as{Z8v7a&PVpW}v&36C$!cF^DU-NguX>Hgvzi&$KtSq+=}f<^W&IQc z?`k}Yy!1@tsx?wH;*RgRJ;L8vZ`yx84HLyqRAE%jfpB-DfrooI#Q^8ih5P*A2GxTH zJ6(H2lB6!I{e-*ti_-MltkXH_D#VU0-x|xhV&JUb<0K3-0*nIdv~fCGEX;_?fo5m# zN0MStB4k>E`MeA*a)E?Vfo)-T)OSUcIQ{OzFr&v;05jq)V1w7s+*+of{i1@PMBfjluW8QF63F3#l(_N zp#Mndc-?pFjkh@}!d@C6lRb_yIISv=#O+JL>$oaAx-H;wE~7}UUMZb&=QAobh?t}q zX%LTR*wf`Xi#Sna+#OTt{mVfe<^LJ>rYb`o@BGcPA7oU9n!m;?H+X$b7k~yJ27nbC zT7tPU>p95x=4+;m_|Ts6DR1>%!IlB(yYy4kFEi*R;~UA|D@&61o+D`w%60}6O`YP! z#JAR)5aTyEvz<m zhKJs)L|ezZHHC#7o|_od(CFAmL$(@UExc=kAo`oYGnhK5X5hi1*#M#<{{=X_I74)p ztYXGo88m&z^U86$kMZ77&?$4bl)5(B?f%NA44LO-RznWi#tzc3>3}<}VY=}VH8Vw( z@?4`PlLCZ)I)|M0LLc%SYb4j;tIevNI*#n(*bGTCxNTh@IP9>2NjUcLIu{wN_ zC*P}1Rz<0iH?}sZF@40F{W7?S0TJmLB5;OqkC+L91smXsD6DM$pL!X@R6(%tFFH3h zRP@&%W&}0A|7c-!+U4eIyu0CBzw4EcVHg|Dwk`;_8#SR6Eue6bnvR~ z1UQ2e>LeuyLGG6!B>--&dbin~ah*YF;rAkqLC$RJnbWTs1ePD4m`|Ww zzJL}eSmgR2MC?rhqm48ld@E!dsZ7tyso8iKxHinN;4-%rOF0=L+o@)67(iYDT9mvk z;ZW+-sh3w29Eg1e(CGAB|1h~RKf!iYI%w8DRil?gZKW3j%}7~whWhU^zbBKL1vNm_ zDedB@=ieuL%6+~mvOIbivpN#M;ApGNiXW+(I9?hi9)&>Y!XltI$&@NcKnhg_I&PXF zcR`H`>3t#^=jRD;xNW@tDC>jKWQaJ>LIlF))5QNam#p}Vv{8R{de@IaQ;~M-4!0MN zmM$IIy4W~CNixV+arocnlA)-2M=SK0;HX?a4N^i;M(1b=Y@F!uh*HfJd^zJM`!#C8 zvo`zknTP`gZJB;l@6Xqb`eQ?1i3y{u5bfd)pA6;FO+Y0ORWaF+=}rMAJVD1e&cY4q9-8>DfuMA3P*X;Ak%m%&ru; zLH)VLoL+%O1-L8{eN42q&eTBlQ4n^ zkpVdJNMIVE15>yg&;OJCfN^QyHH!W<8QaW*PaaK8N~k`i0g;kK4b!i~hhD9ltqC z=O7aP#w`2?xN&YT{;MkJ6GKr#dXfLG0>4$<{DmBmzG9K-7iI<%J8u{M7&{e1_+6kk z#3=yA8tQ&xjWw>Qk@z=k`GdlRlI5mWA3vqEJsB&ZK~MH7P3)s6{}O}H7V8x~If(oe z71*s_ul_Rq*bc`dOn>aurALM<;L637a19_0x#v^8<#f$tW;Q zmcn>ITj&V#M(C9$QQ;fLcjV)n+f-f^mggZ0-uTxSf8n=l_;6`t4UEb_xxR-N350DW zRx$}!*$Utt_o3`dO2@uy_B|Aoer!ZUcXN`o>%-*7*YC;o9w3UES-jbH5oh9|q;fnZ zc6@|~-ZQ+v*fsCLJh{VJWYAkvpu_lYv&im4IiDVWeJ|Iod6Hy3Deu+G={rAW9{r%6 z-bU+6@qI~lgP1i?0sN|tkYOhRYQqjh2NSDjfgBAq&~56bChi6AB2L*@(ip!p<;xYt zUYNWWqRWM%%$wpjRc13Z2OEC9ln-_1nfQM8!kD!5g0e~v%GWCs9!BJS$qWBKW8w8M zpW!B{>C*w2s#dUH#s2O0Njzipa(dj3wqegNR&+x3WxQd!9kMIBd!X&z?KCK!>~A5X z&2B4a3HdITPS;VEmju+L**yPaa&oIW|5Z3i^f43rF_6Q#Zh|dU_!*xJq-A)j9K@I^ z{qwFd+z+>J=}l!YC!Pp-BjId2aOI5UtoHHrZeapYhIa~q%kXl&SNe6WN#%U>&>!{< zRLr_ZoF-KHh|tNwVy{}RyH@Ba-Sci`D&5vgOA1uVhDty=_>i7aA_2Ev(j7{)NHZbO z?Xw#N*0VFAOXA_dV)skdH?-`vq`Bbl3=1SH(ZB-90OSQN-KMZY^0k5c4;T7|^w(mq z5J7&*7i%a;?CBQCRjV2(7Xyr#nhei(f6&s8NLTfej3Q~RnsJPi-b*|!{Rol6-W%Ms zH2^x#v1*IRdwAM)tcohu_hg|(-smew$QrhhY> zjoK}4ofx~6t%*3LN=|5KgjVPx@|hzKFDHDbQ>v?XC*Ak$)X)1HV=iGk!DG(+bCqF- zCL@o&ktPOVo%aPy1roc`_|x!&-(7C*^#TEh+aH?VQQ2yM&oyJ_ZP6KygrpSDZJ+3K z6_=BY4|1r1G(A)li5LSZx!+&l9Ophbhk{zrM2=t`kjm5#X|Lv7w?%*AqE(bq&%(L|E|ZMnD3 zRr2wtPy%Xd7O;i$EZ3+mD#N`4qe|ujS$el*MpI6WCVqdgqV?X>>;MCCFpWREf%z@#D!X`sJ_u>@#fJ4bybKJL&pGpVVq z=JWEmXIFDdNnJmBTs)r;#3lJIgAI;tPr-Az5v6wrP{B12lMq=V0b_WD{zk&)veD>4 z&Z{*FmeDHbokg^-z3K*!g!1qO53L(c;1JAIg(Kze-65dDxpy84V9r^fJ#?<#w+C`6 z3xTZiFVFKb5{G7B+L1H4X(dFiB2~^w{{Iu(E&GA`jFe@pj0I4+6y{ z_D`A}1`oL`qAU2MjXF2$bzJIeCo>7tv}PW6M-1wL*W)PQS+Sa_-^t3w=w zJ{&mI6@^1x5$zr|sfe)$$qz%7n-|oT&(r12?=j@6KM+-A zS_Odzl}GA;o|?lVh&UzhM`ALE$6lmGA==~b=r3tkh|CE26w6jJVA0V{6EOMB8j#-% zi%8p<{k-e$%v@>D{t1XC}UR4R|NKPW|-88R&Vm+q}qHWQO{9qayB1k1f?nK@G+^i z*_f)V#m}L;utMT8K~0<2wU(iyGUasp!&vkpq%h$?r<-h71|2vFs2K?nlSTtOgj zhN3N-tB^m;T@bQb7M#wJsg+7h$9c$((>Y}8+ee5=8iln7kMT!76q6K4v+)q3LQT*T z*HHMWQ1*XEg}PXSMj-ZT(4lA12z%{R*y@E7aF|4|l00+#YU6o^P^+#$w0v-`*x7p!N+X9;=w8=sf?N=?^ z5i3%IYGa4slO0N2`>xw|`tMPI|AH*n*zCaOlZ@S0C&;ql}re0#$?tMU#6 zZO0B0?xO&%Mld3TuRsNVj!(vi$rv~*Amc-sEKUuU&%(EGj(qvX2^Obv2sh zyP$viBZ;o3HZBP4jZ;_xD}amW8R#MQhyE#nY_EW>l+W%X`#Oz zyHo#0KSOl1=6eAHB^fNVgB>0W6y(IVsK*RMXTIi7Wof^2!l zQ8}vR7QbjXWPa1g5EI)V1U?5V`Y)0Q5l8mM-u5qcC7RJ5&}XdclhbCkeR1zv{(@V- z|J?gjC0~^BAaK=ti%_u9Wh2VYC7nfHlqr-maqY&*kYkyb1>ZvJ&W~SaPXEAw!ksBZ z9uo?jI^ZJC;#W^F@CY_aY04EZ$@$P-yLZd?bwUlNs-Vuxf-08UrTWyLX0Z~`830*0 zI)j=XOyLy|T#=_1G>piju4MG^-`fMuMIU*iGzu~zXDQ09$5QQ)dKKKyB z8;cT|e+`165^-xjkx+XPp$mf^y$!eeDUTcszxa?+z;k#~3~OqrM2j*YfEh!0=@G#Q zeSA87n&t7qMz_?Oq+=g^M{2cAh^bZ?*Mx=4`C zGiBvhVR(EwO>0)yCSv?xennuukb`mNy!>pUs~zyZcFJG_V`=M|PfHp%j)hTkM--lg zt~kU141^MieW$=bUkRBs#PUntzC`2}9$OO4%+U&(JMl~lvZiJMHN;;TF@^yKUiZfZ zNjyR6BMgm<4^#j)#xo?|DH~2qy)T7C#O|3}A%*8XII7#{E1o zkw7D9Vutd{8ZVFMy(^6+rS0@LvK=)YPPY`3K}T;AlV4?>Uk;nnrjI`zxFRz@m*%vZ zn(*XK(nwv!@3BFPs9do!g}ZIk8nVK%{bzSAv4?&|9y8h;WaPV~gNDgI`#CP) zi_jrJ5sbtBJxlf(mV&MG=Q*e~jS}b8m`)39Hz$k?dS1U6pt37BTwf(|EUo%xWAs$} z;-Ga&=k!hLw^fj@LK6GzUN`jMN8%u%aqvLCWwZiEVUO$)gl1f`Y zV9F45g)I+hXM1+m{s4=Foijtop^GLA>bHk0J{Q!^D;lIxeW9Hq(AgCyq$^=tzZhXd zLna^hcKfrvliiTaWj%@h-Y}8)po@3Eu4*WdqR-_^ZbNq-y8BO-M-_;nc^Dz#A&Hv# zOidFy=Hu#IQkOf>ih04P??k-LlJ5jgJY4&_Tq_Yl9WqW%LaJ0RY7fUx2nkU90?rgJ zq(Y&L1bLq6iaL~z%Wcc+m-WD~f{SV` zDJXqOlPRPj@iN?MN`qSh^kNbo34Q7F>1`|59OuEd_9aL5-)CRS=HsuN4u$asH&s4D zQygT8v#xj{%MbuPB|sQu^1xPzesRJ+jL8@4c=yKg!267Nb22Yg{p$~IzTJ_%^A12y zrp=gqg1rqA$_*0DVX=i=T5WJn@-@}PcYo5#5{yZes`I4$srqm;L#f8fp zD^X7Z4E%nD2~5+t54A_;<~~>RcQI~exG|eE!aVt1gagCCk)2ImIW#bT7mfwfVHblp z*M#GBFN8imteSw;vHe6u>WY60fe16bCc(~-j;xu>-)mbBu!1sw*$!nj7B0P}=pNT-13t+bo`eTl8UNCu#arZsd6+eje-YcV`%wt< zNNeY5^mG(DUG4tXi%(^`o+T2(?|@Jkm?RB%-2Y)q{-w^0LPILpIOxtl?6+nF80P|v z%deqKptA@30J^{4X=f{IlAH#fyix616%UoO0^5zDS0TFu6262hA6_h4H@jNhmzC0j zgK~p6pz>nj@5*9q+oCN3%&R>HBe>U)S@vn;un?LLT*+h$xO$o%fe=xY4GW zDqjo1E6*6>GCJnV?opH$pY(^G>o8_+y791mMgrjFWGf83NJ9!lC`6GD1wr7>e8^3i zfkgxNM#_S5=fQ`Bxu-3gv@ybB>Mm|W9U9MKLAl3K7%M;6>PN2V4+o( zx2WAiSgh*3_7vfNjJ3ZbzMMF0N1ZAnTM}GIR~X(S`(YiR?Bgx5!3C7{Lw`DvN`(CYu)4=xo12|=PyQpsK%lf&WMj7RgPenNiT*=M)_&T7w7hE2tT`$ zVMcOBvA+2q-}~ zNP-f?pVflAf$j<3sY1#f&TVa_54n0d=Z@V_bW7Ddd-ijr&8_$834hHL z0%0N0okiqfBw@xA{+UAD=fZ)lj6948eL(>5?S19RzjSAh3t^|Wi@Ud$eG|Dlf>V+$ zm)`Y(-Hk2wmwJ;T^1$0ouTg-&^^VciLppoE?D}urSrp=@4_MYhCrS}=@Q2VA$S)5U zpttm#*EzuEB^vUUHuvH)Q#UGC#QRAOT8*(eUwfB9R$Cy(c#H&r7L7+3N)qEFkGSzS zSgbq>??zJ9CL0}JjJ&5OoL&={pzAWNOO2wDH~eUy<#5<{TndIEc`&<#SbS1H7!@+S zDnFt*2&{xxTBy%X)D+E=EV1uCVo&WC3Aca6o%Z`tQD`#im&A`aLKBa~k6$$essxS! zM2!38LIh8#A`H7wUpCj)IKOg;JFy#t)fa zMFC0*AbNxU$%(NnYK2LYN&haRm@X7h+p5xbiMPlS2=qQ1Z^{9RSUNTPjPqwyl+*aZ}A+jxbr zjWcFrk0_KnJ-vcV+t2|N#I#UOWjNpdw;c>{%GuZ3OWAx-ks;UPzAMsQI8Z!lyWRDN zQLAByVo+fskjB)R_%p2m0PP?h#pmF0v<4%k_(^IV3GIDfr zqd!@Yuw@TyR&gprDN`vR}97)J)Yh@QFyP}-IULBN#+49IG+wU zZHqq&jBo$n*mq))m%jwY5r<_C>=%K7x;Vf!5z63aU?2ZC79NYo!uJC6036AG(;5Gd zZT!EAjH{ktJZJx}3giF(7ACd&x^=UZpDs+t+qVMj~y4-1VU*@F?UEck8Hj|wN$$mpA9AW5?CoxP8vRoN4 z(m#h`_PKfD8VAl%q8UG1W3TVzS1w`w4_JM$(=BH|(@mdh5o)MJSdL0Gl1y=WfDg;W|O8Xq;erk3VznIE?ss~>B zzJmngKDv`(2MKB{|9u*Ax_{=Wq!UBNFQ{0)P;_R|slHQ%2Ii1LKM{OZ3?`ezzZ|5q z3b@q1gZz^&EN%=DK3!Oxw4igs+rl9-jgp3`d?8Nd3rCBxXvc74h>HKJ;wC}CqvvC8 z67z-rAf-DaS@^hlT^IGCHee((P7}*TTQCJnvUwE!9d^JZHHJXo0}uYQ25fjQ;AXG@ zUM8rT-*6);>#u&&cPq?F85~7s4PihF0guLe%32Dy%P;oIlB^h(ZDY8NPgZp)KoD@d(m(dqS7*(Sc4f z{yKCBF8|Fb$5d7wnWE|no-DF_6xplp8le7ejrmy8p=F=p&oJrQ%o)hn{n21hU-&!u zo)2hh_J(zGsZX)82+`GKkFXtN7!Hyy-XC-a5EsP1611nB%cnesl ztx^T5eNtyiDUhIq*&7CM3XGp1B?bKrK`IJ`{rQYn5nG_H9zbKh`I*@>+m^CI4JJqt zU)~-X=@l$@xN~Rb0mFK7NO?l{eh@Dqivu`Y_CtB4P7rw_lnohxe?ZtXk%6DW8ALtu zIuUd8FD@Cy9|?HDQg((RVP$cW^}20({ilzSX4LzVZ@Btl;g{5;)ly>O5XpW_;rj+Z zA@#*hhNRy0&EcA~dc`fAosRcYsh{ zra$w}t>7CzO3EnvOYo)vfhXJviVw1Jj*Ivi*jjz$0ZP5uj7s<6^%}Ktx5v#xnHDWS z7z#DtrBxhy4`T#Be?^Ay?!(v3Lk;-7ukLTQtSBywdZPkRt`x~>YK`i8^QA|i9P6BF zGFiBz)Vl!2ed-2o)Sy*U2pOvmddr-B^r1<|Tn>S_V*+2>**$TCGh_4m%Q9in_OXOF zbDS3p(II()1CRBc?OhZ%n`G?h3E&wVioQV+ynZ?4G@zq%CH<0 zi7?%SWGspBCO+s$j^M!0?-pyTZRZG56Xlc( zKQhc|hSv@szz0IunP=JpWZGQYpI&@^))L_#Ao}9i;m3>jK2azZY4W_z1dnX+2s|== zJnk$JUfKl-4t+*pz=*{82*Zh)OGO^EHcG~CoIbtT1%u$ZUGfOE)h@}7xgUV_hpxcH zM|{x_kVeKHJ>}J<&ncKwqp8()m$RQ#IpvD2s1W#^CTQk4r5<^V*ojxBE>Zm+yqed+ zeg?r$Xzed;&vnxOH1q+RJk$vhI*g`5X_%XzG_*uq0oxwDtA&J^H^Pfo&EX1~1V}U)!K20YUJz5hAjYc%?kETCb0jE9D1wcCaFTR3O9#=4C!8!O>?*8_ zt*!3Z)u22QIMyU$<-&4~Sh zb48_|P2w>S3>h7Vf4?;JOd2XCBkNpo{;87zq7HLN z_B8s|*GxvzRCfvP8(xltX{dX@0tF+GV*Lsf{scPW0tI|g8ZJ& zUQ&S7w{+fLeGX}Cen+ZE$pM=po_l7CAHMZn$5OUT#~%Nj+KCOI!@3yFv)iUkM0O zSY?Bw$f-e++My2f3#|s%o4FR9SmB^qmF?X&hv-Me_Hk#q2kocdH9{9yz~?Z(gpUfm z2@F->>EwBX{+DE-q~RfU9re%e}#f z13k4b?|w?GoXQL)qk1nB!qTexsGsT4;NCXsWVo-{0)dhg%KIL$T>9olrC+!@_#cHx z%zrvGE#VqoW$_&Wrh$zKGvy6Svy{#~$#Xf_r;sJZKzYHy%^lq2iL;bEmldLmEoZW% zCWF$HRbqdM*|b>ZE0LVAY)i0K*1q8xJpVY-39^&tT=65a^Q+dkMx(=XTZG(^LR zVsrALEbo_Z;JKT8+u7o3(ed2OOc!<54U`+_-hQz>0rK=imizJs^;t%~i6rUrU6i+; z=#ou3W}4bSD6qkL4c z#ncR5(JQ#re!g*GDb*y#-8uPIszbya=8rdNyo1d!|^?mf@c}VUR=-l{GkB+Zu=?lyUqUqPe^1De8u2JpYcso!iPQs z^-Uy#oaS;+iwhg9BXAg}9gaZmD~T(k2_64$kO`1LU4bW{HCcmRfnW2D{xkUbU!e)* zI*-{lFS8(8j2LLA)ixMR+Y`|kGNNCl_*~&F z(o^nTaOd9TMF7kW*cDAxi(Dxd?xmA1RRO|b-$`~5Q-hRwWT3iKLb9DhRjA!qA95u; zF=ynZ8f)PyJu8T75UK&Zh5BCwgqXb(^nG3mC2HQC0>WM(HKW6gJ(vacv@tL@YVhJq zL&d1!rRTKo_Ug3GzYR(l1uGEuCYW(aRDSCqpX(>Dr|7R~PA5ZHmhb4by}L{y5%y)$0S!lmI4CK%FBB_7NpN(nLFT}z5b2-7k<;G`!XY+TtDA^d_y+!R+wqjDckF-+8nF_zaptTpxp1_ z7^o_0j%dQonl!prct5G7?y20%hoh2=celNRu7;n_YkAj3a!@}>m4*vqvO^ef^g<~5 zKgsh0Ie3n*81Rhvy4QYtQ={wCBiREpr-_-yF0<0m(uQYJMUOrdip&wF*y8kk{8=d+ zrBi`1MjGyix41Fx_`EX+Z*PXROlT_|ZF)TCF2nPr>i8LxPq9y?^CEaE%=0T$;hLY1 zBplx2bEEL*_}(?H0+>cmM@9oZ{P5T_F4-vVz&0mm_NQi=?GVZf&D|#yx`Da0N`*K3 zpMn~oi19ZRH*awIT^{`1fK_CMRFeb#TI zuJeCf?QcIT_LAKlb9a0rGO7Ut2nN1zcvyw2c!MecUNjD#6;%36C)mgS`M7xPgT=+~ ztIwqilgi>YV@@v(;k*g$1+jLv z^9j^N??WWoI=<<>asYqF?ju+~!y`xq0sLa}xCvslai`S0B1vSg&re(5pyi&myJU6n zYC@~(2x+Gb>-}oj;o)LdTpjgOi|~xJ&d+*Yw#!+%{qfHPpb@@(hex*`>VZ{h;0Vdy z>_ES~@xU&IXrV218%eURFhiK1)t459p^O5nVh&HHhQkY>(*t58e2yDlltzl(K+TihabQU(0ME)-rLt zDV4k7SH@yN+aO;4j2x1J`3H`_(GNgkz=wX&Zv}ojpwziT{*#BfspR~9^6#?Oi~D^8 z&Rx1HLq;dqf3P21#5ok#(?J_d^d?eKT)9)@h=sjmI+cg-7d5 z!B^e0!0nZ;LxFoXG7FqNZFWvG%r^xPDH|+gb%fps?TT-sBu}j(hrw43zrjxeS`G2# z*8=BpV!D~oA~WiWlxO0z8*(ohZi}GK4*BlMRWT1v_7jtCPQQiZpP?-KU@_ey0*4~( zo4L@`t4R9K-USjDtq9}#eX_3_e<6iyMs5H1>`^dJQUkAE!aDYU>+3Mfb%O0os)R+l#` zl`rUl`=O@Ds0eVquba8CdU^NT#|u0oakWD9l|CuE$R|u9=OHE)lszmnZfXO`sNx3$ z1U|x^oW>&WQBcTJCP${Hv0fS|=9gAU5uttl3M286k_pq+u#&BTF*uMw$Iz2hL6sb@ zU=Y_T52#KoHR#1E@lNFK)&K(?_qf zs@7p9LqmHmj~=-`CE<`P|CavYG}$ZvfoahRh-nLDe-r#xc)|lM+)2PCaP@Mv{O}^# zBEv&7#^WJAO}%d;;>$QD8*cVa3eA9V1m2Ob)pV?hRkygp$S-q6``FeO!Uq0&x^);} z!D)e9k-co)8*PRrAQ`pZmFRQOtU6*me2fGZU#v^xwsm z=VChDa>S|w9Jo@PpMF~h?irA_oL~p}H_CLso7MiltSiMk|Dm=;_pYIK0Y${%;dl07 z7CIFo>RX7HO4iZa8T+IygMRRO{*d?nl32huN(Z<=2PJu5N5cEUTaf2yBUk$3#2T%jB>&zsocl%kG!_8=XdFlA&)3M)kme{N! zdfWxG<4iz@^GlTZHLyEM!;rw-oN8peigDJ8zg34Gu;1Kf&*@U4DrEcY)xN@BtN6SK zm>Vw}c<19aH#ij>P%!wD04_t^1 z?x2#Dr>Gw|i8kM*B2Vx?a*o?3C2J!NOl5R>4I3RZxF4V19i+E-kyr7-U<-X9o9#6f} z@&Ut*(8pJt)Qqs8+lNad>;iqw=tQKr-bHsuZ1y9?n%FZd@)=Zx&)W(hL((pK<*;5t zIUU5GqJsJfT+4~(>WKFu_ zr`+Z419cRrmm*Fqb^Q08Yt^MWfZ!o^N+5f7YKCuIJAp9yI>F5&UQaYysaY(+xjZb& z2y?8@y!1qTyO7K~bVbv@&7tv}T4bW_KM4)dXg(h|I`!uH_Z`(?xvISl#*Y`Jbc3hb zJRWM4rqTV>;z@XaRCdvN%Ja@}bD^Bpu-46=C0c3IX{9D)F8OXsg=B9} zT$=MxyQur*ZqYMx1Me7@tVCBzWG-)2{NPjRz%e4)%(LUtHHW9x(0MYqIvZN;4YEkn zb9PCz*C>}aUhxJgt(}N&Zg&2*rGF=rApA@A-cL5=LYWZsm2F9VhCGv^9V%sKNnNc< z!K!oI*bn2Iw)N`8%C)(O9>;nXv|H=RRMqD%`7GW#U#bwcN=SX}i3#00=Snz1f7D;- zx|$9{e)#B5C5a5_7wb9oKDJCx?s(Jsbm|V6F;aj2NEq9-$ak~)bW7g_(XH*S@#mvh zz22caf>I|=_5I>ltM8W}5UPM~1^^?_{H8$%*TMkVT0;XC8mbpYM`?v@|1T; ziX9zH9)wZdj&Sy-jxfs|zffnhKZFIse(+jx*0U1Z%AFT5FVr*vii70kI@LWPO&p&asyK` zkE1-FgC14u;7V1#sC93o1oywkA;Hm&yz_ePz@C6^c)p8qO)vS=>63x}C28+of4Ar&p`jgQRYQ3z z!|`nb8iAHrAn|b}23|KoF}-}_@wb$LK9UqEQhm+K(qVgZ0UoK3=SbAUOpX9K5EIH) z5{Vg7EWTPT#)DK7PnlN28;w`U)=&r{fv9HR7gB*3lPoah)4>B4{6=xR0j^2!6}bvm zL?z_?esb}jlAL_i1$D5tp*%TmszWlB#CS^`Qzqkjf$5To{T`H|A3e7UhDj5(7^Woz zPqKDAWF(BY-R>;O07k|M7F+-t9wf_PUNOGt8aS*qC{wTT;!XrnVqQ9tw5(ZfSdDpj zOr@Ip(m$HByMe@B8_?Ksvl~3#qp5I% z8zSz2_w)cc{eka9kAMJ}+fYuB>*N14?0Ee7fIPy)u258lU*F-2PtrZcd`I5BxN-&r zW~wNiaSR)zk5@BYVV(r9U^-3^0YN6p@c&vb9ULSN3kVI_NPt_8i1C4e0Wj7)4(vt3 z6)eSR&;fCHOaHd`h0UNB%_n})Bx}BAov-5MVmmAS%dyN&N(_3@A6_ z4S7l{F1N+K!qgIWX=aoj_Bip7VFh($@i}2b3|qg759pbPLmo#)aIwD$c|f?Z&r`=& zy88<^=)Cq|Baq@ITlfY`!--=l^C;012R`{|w8cHSXTzamxgYXaDFLVaw>)*~khpS! z{wHE&CXY_|y0#~0e#yFbNrXxUv{!(pO&jc2j1Ynm26p(O0HMTU9GIISxbGq6Y$Qi zt!I_x+RTNC@j3)hpGuV;VM*rd=*G>s_X zO12K=aL?yEBr#525uk4P&X|D-ur(v?tmTbw2>ouEmzf6zqz0+XPRD8Y7f!D~>3;n@ z=Yx_8${bf*_!BMygMfHyJraEoR(C)x)XT4lvsC4g|7F^Th9eDRNYQy}mT$k0G~Tm))li`x>Vj5cp?~ucw1Xd2su~J%H@@1Clu|7Oh!dUfGq!&tb`9Y1~rYWdlG6dne z0!n8ZToQYF^tn^g)l?d`r3OyrvpKnkvJ)dP>u4+&DI;y<5$^k=y^$gZLg$@yj)Yp` z?2yuDup$093N8*x2Ct>+$L7M_(NLuWA)d_qa|Kaz2q&72DeDaDtFmhPyR42Vt9O`w zgy9bY*x%AS*aK^T4|>yd?sx?@*%G=-&R}In8j0Fil-HmG; z1BTqZ2%OA4a-<45_M>0bxtEbCInY?sjZKNGHNFbsThJqLX7YZq?}1xgcW`Oui)W(o z5s!{r*6b{P_oxnO#gO+dOE80wPci{yj3?WHTg6`mC&Mp)2~Z@1?^%HYhBYSZ59MEM zXpo+nZV1OnDIO>3LsA^pv>FZrp351oQCTaiFv#A!cV8%-ry2l$(F)8-jn@#wd*6OZ&?Ro3WY00xL zt;tz3MS%sdhi5C?4c-ciz4v9!+vfgw|UpvJr zs+5Ux_kz<7DaTunR>m|Ktz&7a3T+~kDkk2Y#W0ZmL2jeN`cHBj8nR@;S)7XBjEt0`490ih-k$bfij}eDA+zeHG2f|B=)^JMNcr z4o>RCC#=6HdMC_lhRs~~8GOi_!-;V|gU&CNXHW5?TY(bmC!jur1Cs6@1Uker$7m*A z^M6sZd#ZGm^T7al^{MsuAtWNmSi+cVq)W%Z#?*g^v4#w{kqRdW@p7_3_GhH1N9^oy z?OOMdXce;h#A+A5%G3#o+avsY`tm-D5-R{MMp(cZa3Bo0DNk@_Q8om3o=tESZRGUJ zo0K@w|Zux>+1>qW=V~nFxR|3^&F|`yiM}MunSV zMEQUu&}1P$ggQ3S?2wG}a|)qlUVgdr6YRNqeAOMfKh(z=L40o>2?BCr;E0y8$Y`?2 zu*s6Tn-FwdUdJ+-G3Me?6&d$8U#JT~xe)uCz6GojLiTsWL;X?t)d0STC(BAomZH~0 zg_pakxnJ%0lkx!m7B6VVf%^i4V0N@1d2PF7F-hG0-yDrABAQMJVG z<8tZ0bWoK4O$P;Q_oeDpx2lB{@ty3nQo=(FF0D7d03QlA0}#n1N3rFVbIgrGh^iL& zBPvve`y-9t@+aP2{!cfZtqYE9>U!x2rq1mKK+N`EN|0K!>rEbf_0l-`6Sr+Z?6G!O zj9q8m&6yNUyvA^pf~_uHt6Og$x&kh5o@IEfXzC)T$@HoFc^1vJGphG~a~&iGz=`xN zCdx4%%c!}Vh%FP5X1{Sci;$+N%i*x>@J-kH-0Lvc!QwvLv9FE-S*pVdsB+>Pb#SI5 z*xOHi*YMe+V2-eFH{2x^bEhnCyL)R+OSP8}Ju9Ww6j4e;xvc?vw?_wA(m`==!7o1_ z66+GF<-y85b5SKn(DbvA()04@k_R7k&C9zQ=kZSIBdO8 zb&KmgHr=nd+1xLd>w*FLXv4VxlGJOlQuW}_n&GsK{uIthCxL~+N3oVbps>DTC5ImN z%w7-~sO{8}Q~Zg@Xub`}0nf~cQ;I<#ZZifZ4dl`V-Z0>slH3kW3ZNrTVXhu>ruF^4 zjXYn|a*+dc2V1+rQOir_=EQqs0g0VPf?+#a_k!>C7Gz^&;LQcP%92E%u~UtF=!^Jq z<6`B?`>6F;i}S4Px?r!EqgboKFO>Lz!pg;Jvb1CsKYttEZm$^nTygvfQTjelJ{&>y zB26;6pXmtv)d3>xOMmM&b)zofin?#(bEG;IG|L(i;Hzke3U!rFULOsF={4~%VJ^Zi znt=K!Ko9(m!$Ld>(DmD=E3g{sq^3NE71cSq_Rvrwr;| z9c5`c9e>3ZTnkD=(Xl^=YJ-g`EMBH?w{HYa)S~4QCN9>z^b2zRaN?P7QyW)}4pS+J zt(=5mH2wyIq970R$Gxgx$4DnW7i2)xJeMo}_B{^7(S0}q0fl0MBt z$SrHAkdEWyD;QD)cBfa`7^|Sm0zZFsXMtSY1k|@fo8Y2qr z#iJtPv4!!Y(J4JCb0#e2Zf!%9dp5BzY3b`hB=JjeZ9FL0=*`o?jt`o12_O!CpPEC(5w&7 zR&FN|LZqw*>%miO&fD zNMa3I>*msY>qoGtW_LvE!a{)64jrdXeF>y>5XE4pQt{2zW?575dH*=Jv(}*`-r!r7 z!uZBwHOI!-e$#ox98+LmNF%1a2l%kA|;gG;g?(jUY->KlHp=&Afd=U zSXO>G!+v;5@a$=ab7f1PMY)4#?h=a?sne%pOaAq*svET4dpyn7Fj;R#4iatuA; zg@xU!{s8Y84Dz7fz25c94Z{#>_bXd>4I?lvy0CGvo{u7ae3xu%aD@SDIk-D>rC+Y@ zCOp9qDg#A=7)~9=BxQ8p=-H*^9raOz-a9w5a76-%6as8&h0$RN(S@WZn|)_y(a96> z4b|eJatO^s4a~kd9pduxG)cy{-Ar0PhGlT@`alRDT_hN2au_G!76*Z&#l@QOMp5>~ zcjhitRY9}ZFCswq#HqNto|{_*d!_#lm@#YE1FI$1KmhO*^~cX9I5Qh;#8bZWF5bai zrpT_CUHKG7_hWGE?S@m9E=4CEkyCxJ0WrSa3|!)>#xHmes=<8r=4rOV-*1w0TsQbA z?$a4sB1K|i2km^*HBUPll<1}5t@mM?C8}FY7#(76STot*<&r!mf`>^Y?>n+gC z>IKu;bRPkkUzlXSFLL-xXTM??{XbK++TpKzaH^(0k=73l1;Pl1LN2a}zB6=Mv)` zrL5S9n2o@7^vA&)g7dNpV!RnSxQKZMUs1GWPWa%E@@lt}=Z@H+t7rPoK38RFh+>}X zLV}B&G65F>Fr^Sl&K6KDlm$Z#>PUjK9T^wpGiddt#}Df1*$gboziFFFx1_gjo=i&= zE9eda4FVn^ph3X!GxACkF(6!wCxriFQmAqkP(_JZyPX|b5P9Ii1H`Hlxk0j&b!{d? zqm%OnPr&t7{pGt_Or;I^G6;MB@^x$XR0QiNho=mh$kYqETZ0CKSSO++mkTQ4CkIJ| zSOR;p*i~3{u@e4gHEir1-Zej8VhtrWI)YFDw&D+rSQcmm2+AHk=JD`hT*N$E{C36X zfu(4^J@zza#DB_(rB(+)Dmm)rqOvX{uzHBYtmNQ>UlUG&^ud0o?xK-?#>&~b?+ljg zUye_+XB))D(BmLx@C`b|aT432hX5zVy5H!sxz6sOOK68-O>{D-5V}-p0F3GX;KS1G z%Q4`3sT$5S*|L)TD3LeDhU-eo4nIG!t3k~&2<~C*oZNrcW1yNKxcD!63^$)13D@Mx zQBsQId~&e8`s~)+b1Z8rf{K+KI4YS|7|HloN-Xu%V+9dX>aZxPQ=A86nUh)051?3i z5Hz?4_JiMIj6D?kTb4oMFftT{!tz?2wk4fCSZbl0-thR;dEZUO+Q*{yfcQQXAFuh) zjI@f6M7tv4layO)^)>LMAQSwH6uSrJkmW%#ouigC z9}?&=r|(-UX;*LzuzJW0no5R*{iCYF zur4hFf99hDsmX8Qc6o1{)DAv^JUFX=;lHw%&=HZ=04nNj3xY^?dt ztQz~nyDz@Lb8pRG0)YfW5#--;n8hD}+#_;wEMHsP%SzN~@7qM}&Q)Z2%{8a1($W^! zzlk-36an9BRt$#+e@b`Z)(AY+3tT_34^QY9GJ#K$-Zur0_(hpsY1$O>1)CCt{{Pj| zdLK$kdb0Es=}-8Mt0v2sgF=KcXK9|E(60RriZ}DV=RFu8_237|Na8YtU-e3f5`>WW z0=Llv$X@|J5Vh(?-mGcKf8p-tu_KatL(&A($0Vx5m5*ij#&hn zX%1Yj*oIX3R*pnwjk>Izh4F}iXiLBzMhS&|+8$IDBiJ{>-xuZcG2&TE++`(E(c|zr zLns6A7t8eV6cl4OLZlk<@P)em6*Tk9Uc>!!h{yx~UsoA{_<0U|c>|ay_%D&}SGH^q zBZ_Ivrh>Meh!>}Uzf3#UNIO6As-5j(b(PrZs#?LC`h?c-Yi*72$*eSVf80%fV742g z*C0liWP%g17en9>gAJo`PaKk6a|(TZy)OGf-WS8jAF@mVAZfEG3pUF*Q}mIZgfY$K zT0)4f?YOA$yANs|6Mhl$6E+y*Cq7D22v_L1#62XIs6tUB!}1uF)2uG5L-o^3)mNvB zF;7rmmGLoRz`!mC|HE$1e$G^U76o^$Pnhl;NWFPC+r--{DTi?P(inY>kbPEr(7DbN zZ4h)0pmZ*T7&%B259>xXfk-z3o;_Vd2TuX>avJvyEaocF>h-_2vfdiMdzkJ{kj{^v zQpEQ&sjdkqqhrTCL{Si88FL9?*o=myHAo(U8auu+td<QU^M7dY5(9&MB}jp9^l`#Loyb=8q?Ggnf(~nsdJ;of*dG>{uRCe3)onntX2W@u~w8L&RYI`ZgD1?z3r1eAqpN&-T`80iPTy+~ZpMVMmm z{gCQD{n(jvCm&6oYK&_2{Oa-p@}hTQ1hJpPJaAa02hqVsOV<2km+Dz`2!@z_`ksuR z>22YZrzO7pb>(}f??U=@@Lj#D;G}JI5y2?KvTVvZui=wDWS#nggXd0Y{`9U^d-vgF z5cYd-0GH+nWMPG{R6R{-ib8@^2$wtKt4nL4;A^eMqH2#Gqu?10Ch`A}w!S`cn`+t@ zNwqNhMOtohQwny622nS+_B* zQv1O9)_P!zEGxhR01+`nY0fKhVGtA`V#t315_6~TmHdE}kPZH=DJ z=_j>O-qRc6)NS*b{b373iC>z1y5hlRhC_^6aIyUmqmvi8)hL-WkXauxlsr6sq)bpt z6G#ny*bgxTyKZQ2M;d(jDz~{wGB=pBR(I#ze!`Rh(Z5a!Cl=@#*-~ngM^KSVdbee) z&;~JRjSo*ozSIA@Uox;f2+Q>R$;QL&M^i3MI}gD}I{fOG2{KcQlI)D!2vl<^KG70N5c<3fPz9L-pW<4)}5a zm;9ca_D^*vK)3|Pf}C5*XBFsmutK+#rV0g5!rmo=<9f=otkHa}+>77kcl}bs_by&E zI%+eoAGJirS__gr>oXwP+oMCO&|xuo-~404s_q+FF@0mPK3=-nCg#Fg1bhqPgb7{X zk#O^yJ7gad9nFhFEf3Yc3Gqzwymh?PucYF3!IhF(uxNVy@S@@MgD|4vg+JXjpbIt< zU-Y2sEU4VPN_~Fh_0x5tsNUtUzMrv231^{{d+#rRgK3-#_O zc=!;-79`7?b}!3}#k0!aOWX7I{f&bTVBt(+z`~hUL2#1`=nBCH!NFZ2K`*afPFxGqb+Ny7&>Rv(R_#WKb%DqBss^$dhGj_5SL<>F2{&ZS zNqoc{T7N3!V2jPB&0b!>ayLLb=eF{$tK5?EpkNI~*s6Xa0ONQS&f$lj1kUYC*b0-J z&I^ulW?DXfIr02bGD!=kg4k=*lJkTaR1dzN&5xCMK#a0x!;nIIPmn54^zB2>L-!BK zHt$e}j*|_^Ge@-gJVn^TOud*@->1>u0mc4<`t8ET&)zn#|Zd)Ha<9y{{$c^9mU&aDUrhw-hqz;*cC$~WS=}8M=220A$ItF>TN!T@!p8ACt|_B7;rkudQU1s33a^qTd7tfWz7mU#U%$}L z$dJUCJq;!>HKNR>;9CZLOXX0#Mwh|E54W&FiK+h&b8j9`<^H`7?|biUo-=1wM9P#o zc7|lynP)Q3^AL80ipUrdDH+Q=&r%{OLnULTj73SIltT1--_&`|=li-l=kt7@-yhFE zUgvo2Zu_3ry4G6Px~}|vXL$MaU&}WQbhXLJm9C8h?-kA<#yZ73@(r_n&0pU_I00q1n!9wEW3tB8d2kn z-~l42P&iJ5GeVkB2Oa}U#5O<{`hR#H?}rD@!1EZt(bsj{)ra(m@A<;pkRRbbdm#oM z5`!)dyU_2>!)jvjlX#@gL*^t#t1Z#?1}g8KXPk5DV*5w&am&Lg$rDP!eD4%BZ|uSX zgR#G00n!>HoXd7#0S>8?_&Z<5L$A}Lhpqi*Nbf5(F*PUE?J3y2(o%^f8NhYlqYho^ z*!4CthIv*0TVUXCg?VT*+vHbmn=D>~nm4Yc-2R%( zrjG&>4UaEMeO0}6JrVaB#5jj*aEt>Be8p1G6u9?D3(0V-UJo4;ARgs>`0dWLhwxFd z;AghqEQzQK1gc~leCG)^AZWQtgN$a0Suoi9Ry%wr+SijrtOP2S4O=nE_wW1IC#HG}(V zfq@U58i0`QH^6$GAu?Q%D*tWr`rjBXu?7Q3!9cuXVKz`L1*4Th>g%!Lx9InZ!EMs9 zmnu>;eItgMSxQpRf`!;ILod3UqY_<0$KrdXPrwZow_~u{@F}om^A95{!Ba5o=BTtw zw7k+y}wUEq`mYBn>A zd#J5lptXn1;$pX!mt5FMFH}8Vy+r!@nNucMqZ7M#0aaYAham{uwD^o~dHjYbRqRMf z47w%9QsUH|7st!xeB}0qqwB$4vwZdooFHM#ot0I=aJS^J`i%DshIWdw8Yk?Z7vDX8 z1tR?x8?o`_87Ca$&CKB#k0Hvz;5}~8GS!;K%KH~xYV-^E{_{$KptEoztkLjmf|i3J z91(CxB@@_QeED6a31fe?N2yu+U@T?H=>g?EPojkI;EA`^g`fCpNG=k2MH4*j6%bB` zD21yVKPijuVzTs1Z0%MH3tRH3;QQF_>*e-AP9B0 zOj_)js~TITo8y!$h3Pu#r|+Jc0Ar1SfUs+MWdE#v$hTHsPYfy8GTLs zFj4cv&iUQ^J0ObgMv*#(lEPxOw|7zW#Y2;=s84%AGG>T7=o0+a51J0vQSQjAoOgRS zHN@K^mQ8j@%fvg4|9~W^>OSfF_q)tK19%LKvcMDs(WY0CcsfJ9nWKu2|6@g4+atl# zb{*Pp7vIA+y#`uKr6|VZ=fZQIO;{)rDe(DJ7;Vn45w&-?c20+$=Yd%7W9=7#h=+b9 z8cXbT^Bw8#Od^mhI7^3>o9&Q8RY{!{PNjA@ZU3izA>S_6EVRg2Tg@DO5uiYV@`7%N z2a;*GL0~iiiUbtV^G?FQR0vAO|1p$sda?Wtl>**2qgxb$hks6}Wn~Cjc^4LHXo?Hb!R--x6|x9Sm9>p<9+18ku^b<%E|Q|DIxo;!(pCE=;`hWOe4puwMgNr6#}*d+ zW`fnMlSHF+)UC!}!Bc5<0M2rZ67#D}+*@iZ{h~5T({%)k#-z(QJTX36vhm<))yo{> z_VwQLi^Bmpt#Nx{5L`?6JTlzMGw11I7{vyq^=>#SoypkE;$?cEcUA#SPFC&j*1VVa zP`!(VqB<)}YGQ^yURx;m!HjvJ-&n@o6SLciU;taVmm%)j9$b%Et zH-SJy=R0QSX65LDJ3cE;&H~~)ydejXf^-aT$PF;}#&N!!v%}Ri6M0I$J}LEmQoIW7kB|N_Z9|l-H|0gXzGu(%w}{jhhaiXn z{Um1P9>c?kU<1OTp@O2aJ|f@h>l{XR4*zty$R_kt^`NAYyis5k8C(Dw41kNhmW1Bv zI|Td&7!Ka+9Gyr2BkOD-@r`#lD*=i#YkSt(11<$O&rW@}TF~<^k9A9DUAtJ)<{HG;%p;aR*TffPqd77e&Da) z9c>uCfpY;Oj6wZ_Mm4$nR{8N7Yc)>S#y!IzWyUZ|XT2o2Xd+8p3J;xR(E zN-y{&-5b6pTeCWBMf`<{X9Ltgy86A7xoY8}r?XtN_T4xv-*a+~;kpY?kUY1ix3`y_ zt-m9;lb^RIx3ek@oF3!qI+J1t14T!c3%;a^yIg$qdLu4{@-j8`8?i`nd>F(!hSi+w{urD+pYew1?sIiuLa6TkO%SE6O>u-=$bD5S%AShyJXg#BSc|Z2ETbyw1 z*RA{)4UxW9q6VVi0vK0;B$-RPQ|4{orVPvKxwu+EQI%be>#7s>+5o!L-xHeh#Iz+h z00G@`1+Y)c*HMI`&D5nMTUD_qo9ad~yLx*EyOK8(j9*Nysjuii^7#&qtMwWFa;p$1 zB2f`;n=om(SiW9!-PhsdYm7{oXlv%`$ItvP+bqoYy=?uYLTBFw-XXVV;2lD4;sA6a z?E4!R0Smc*r@5=c4Ib955O``HuW*A{RD_6 z+Y%7LpxlMsGknf3H71UUt^_>jR)3Tq+6~Jd&bMm7@qEb7y!VEHFO5A=;F&QNKucMZI?)ip|L6-p zC66GwV?N=u42}B(>d6-k;%osW#0guOgaYI3C|DOlmk)mHHc)cRXhfnv5GGkam6Y+~ zwSWo9j~}f62b`3s8kXxhuaR*ZznG@e*8YQXux#MvviuSkQH^E10UHIQD?+ zTZx@^sw_Qh1^ED)S2nTU-Ks6Fo{0H#i}GZ_O{^gYmP#%`)3cirH@u0b^I_Fg9l4}a zkX$_xq9mo{7=ebv`K`YP8RG-`uawEgw};uOb>_}#+)Osim6Xql$yOLcncF@TKT4%P zh?Y|%L+$mdCnxM7|4|aOe}yv01j}mpVM1$|<9?2rYLUl`>p-1TnH6Z1=_%`BfT%_z zl^n2YDDWCY6ZS4Nh@?hK>YO$X4%4>@ytZF3QtbX4l*K{K*E3^7bs)~^2qy(W<)9wn z*jB&d$~Nv=`E>Dit8OZdZi+!>c11tATk9su1Hzx=ViHJlX$u9&RYvG|2 zOO|wc7M?=EGJ8wCT|b$BnrC@)YF(vcufa)h5TkAoui@dhSsr-8km_Z!kR8DA3_ONt z5I-Q##p<3}B*2h;aQ&P9E=oYvZV;;TI754oMsEbR{ghwoDoA~QEKcbuP^kCJY%Bss#j`i znt47LQI(Q(yl7UklvT4a6E_*8hq_ejodO+F7LFAdWW;W^S8v^`h>Zz<6!zOeE*?@k zax+8a89j?frcFKd2^4jNBhEjB(NO!c();+3+=F2G$iy9Xko!ZzsN%54Bhv71KzJLO zp@;F2u6`{|l8;#zE)=pFGII;>>{S*H36^I@f_wt{Xtr$6x+`l?RdsXS9P{R1T?$?2 zgT&{F9J4}nUwn$a3KJ7tIRG)i63Jf#UWeV8&uv={E?!rEBIJ&nklOIT$fxwLMSyw& zpL{6KB6FpNOgo`)zhq7AV=7-!74Um_iu=oC1odm(^_SBK3kr|mG=c{IrU^nh5x@?5 z6ayfk+Kq(>ka%NWzipJQHHo$%JrttU!0G>DiSpU^ch96`Pl;fib%DzWvgfB77SZ#Q zEL0gn0RpNRENJOcD(-@-)m9MN)(__WBrB+}pTg~PcAFgDKgaFd+BU?hfYtp97A=e| ziGCwbBxA)Y%U}ba0P;zOw@|HUr=X_Bb}^47+WAsHq(YU|hOL#{ZPn6@&?s7a)ei z;!+WPM(ORbM(0(}n?!^dQoiCneBYwwbqq(5tGS;ydmQ+v)*$#AK-C9To;yGsY>@q~ zuFs?Vp}6UGgs0`-ta7}*Oz2G0%+wR6O6r3awp^;<|p>UFTwpEr( z_x(owd%;hXWzuQFY?A$;VfcwG;DhcOIE>|EfZ(OhV-W{5JF}yr&MDIB`V_0+`}-x! zj(Jy4QM^v;sDAljuK=4bgt-M5T^(@IRY#Olhu?2`{a$@yu)210gVoTyYMM^C4i&OHE9&k>|J2tCEceKg;~bhVl3pe z9ACB0_;Pz;meOI8BcA)#^9S_zu8Lvl&T)7XAQ$bl4KCOn=zFkr(?|ZN#Fyv}rgm6& z80u!tQh}GS8;}yTNOoif#TSXypFBO!bCq^@oyGXL3wxeOhu7uPp|K>P;6vG9IqM+j zmXMz+3M*{@8x}rK8`%^u;@vR(;lrhBdRpo8;yFX^tBv9}&XCMVm(_BtqE6bz$0$o=o@L`PIBwjU_*QO6GC-lsnjoYMew&`<_5vf?0x-ov0!`7799 zgGuSvyj}?y8*k2h0q(>T)8zT-8{}HIWq3YM9A&PV1rM2i5AGp)DFj6nLip4xTjW(% zD?y^~LEG>9EaHND#1-;6PW|~TlecMA%HYF#*TFs5zK;p^+|*4Xl0t2<>Sr(KI;P4H@b*BWpedYc%*$Yzw78klz1CI)@B6d0 z^St`Wo%ZBk_NLAlzj|stUV#y725)G{eIzqPS_xElq}HI>K?RBcrthEvu}e8kgGffs zImDwkZuhWI(|#b?yJ9RypMX=v< z3Ii$&UQfu^v3a3ABlRaAboK4`|}=BpsyF104ev zpM(#r>5*qRw$un%yLCeD%BfdGGER?zeq8?kCZz}l)Q(|r$KW3t4`dGe{B0BWA=Ldx2s^^RGbC+yY`SmsXlmkxnZFd^lZSLV+UilnBSb|Xc;(X zf4oM77(_Z4qA2e27AY@T?BxkPjzVFD#dZ~pzU(R(i5tKcpP^XD3;dKvi7UdE3$)nw zYc|!tmr~;)p>PaoXhqO$uC;l2n7iOf2K&tBT-p6;lDKEDwlWL=A=6x0gJ|0aW9x&z zCAa_OP{Jzpd~+Tb&i&}^Hw1SX#vDMY{x#IG^$9jO#6#xed@XAtE{^FPW!(mWG5b;M zPpMG9;+(H5k5{!p<~mt~^Ty~Rw)Eseh>_~!6zXU^SE+OMLIAHE$w;eXRNxso7Oy>EJJKgf?x`~RQ( zczkrvHNI5GAGsDRFB&g0t5bbh$+-Q%O`{^H3#)V70x~;{wQS%1t*ov7{K`S<@feRZ z`P!AJi1c+enxFgRKe$PUxyv7Fsa@vSM44PP6lcM13t(&o)b~2D^7bfxNMa%RIm$bf zBKFud(@vL!0d<9~s|D*QK+v=1`exni`~0ns>SCR8A-C7D=z=|QO%z&0ZPWUDX~3n` zdXJNYmIN^1!|uxcO7mkV@thy@`R5rT0_=IrBBzX|eyqj^NVD@8f(ziV0j`$504BEt zH2I|UaEB-e9u!&m;oEuzQVOp{v&g>|>9=5~T+Djd+FdypPcukz#G^c^$;rhZLYDpw zhrQ-;Or2?EEFE9eF1i1Zt13mI=%da2-vMH6$a>e0Bn-0OdPGNx`?$!5M>M};oxYc%QEX0uDqWz~gi2{)m!CM&7H&Ib~&Awz^)SIaf0PEAHG4E_V2mTZWT zGmyJP6F0~HcDp&BUvZs>Yp2T=%VFQ<8bSQ{F_~Xy$2F&?rmeV@fIuCx@K#yf3#m;Y z(CAR&PC>@AFzHX&6R;x@`l0ZG%+=4;>HF2RW_!!1(?vLKnTtedJy;qdy1$|DjcI=(kpZ#J1SM zB2FYd>YPjszdi$@!5669lR@9BgSN$oPlttCpr?BWiIn%gS_aV#HazrPgmd@*fApyF z5nHZ@50aRXk|f!FeXaL)8|^#}7k_|*2ZQIV#$awT|AF>iv7ccfi$)id&kO=2U%UOTM?cJecR_=9b|K7Cl zupuS2BAdHuJMh6523Us3t@fRAr6T58NU=r95&ooP!In~Uh1VsT&s9T|@~RgGFzW8g z3fowFE;zyesjS}-L`6!f;9B4}{8MS(bjf^OmpX9C)pzPp^hf^d;P;@#%|LpS!AvBL zr4#^%Hsr{h1b9&cPSCpB2+<_v+x%a)>tHMC%4A?T%Rw+}wk;oEhdtrwd3f^=Y zmydU<)GKqlOtN)w3?f}?w}~rv!9Wxxc>ZQ7Zk=^_ak=QB%1Jh7dEc8k!A#$2f_v9x z&r>cO=4$}z3wHiV47Dps@Ndt<*{Qd?E&;*~r;({zN-3WO?<{ z;Z6_Xn6`0~u`dagj8n0|hV-O9Y(t8OCSWA$hHULACVk-}dQElUYh%ASM_Kgq>nvh3 z_xJly3e9hb(3jD31|`kE0;lQ708SH`qje7ZH;xu%wx7O9qdV!W+U=+skF)j(x?;hA zqZQ^r@}C5)N_={c9yyc#*Mp81F>KY`xfkYNx!7gAn z$UB!i(c|a(nHZbUxo$an&3b<|#f$-~?K>RQPFZY&k z^!y#C*)G;ln^wz9FJ0vC8_0TtPP+irbbU>M0|@Xyllv4!a4w4N(_$TN;_ebVPbnkQ z@-qfbrI^I#J;v{jbG`hKqyaP=o#ufiw|*9}Tpkf(ze!Rx7>iNpn5i`1^j7IUYDD}! zu}!ViM7Vq@x-ebi*oj&9B=F@t8{scEPC-3Rf&a2^rsw3vKAB85N;1B#Jq|z>Xjtkf z)CK_aQHtF@!Y~H^%>V4Q?d}gu=J!7x{zzs~bqo_2v8&PXA6}LKvjamXuxtw3T%wp% z(TY3nTf382TQ6=66(v?4fW_fdL2=+r2)0qMK$Xs7>i!`9P{rx%L4stiQ{E)DLw9Q) z!(%W{3fRgU(B93U~*{ZFICT+V6v4wcKE8_!=6p&7n2JU;o-bDw@_ zfaT?*c+c9viC>A?t^2RU{HG!iHi`hS>%Xl6sZ>A#v^xVm!HlAU3eoMRnWv<+cfc7> z-kB6X^2-ZSmY>zsDa9v2(Sc@=n{Wr zRpE9)OwILLuDK_3qm5g8dQp;lb$yt+t4tgVBiAR=WV2y504(AFPwH<1Vx^e4w& z)${gO=k_yE)j71DIKt!Z`x!5Ow3@BliQf6!TZ)$?zyR zR7hmf{|~Xsq05y+d-%x(c2;*&TZ@wQ65%`Sj03t~{cibaCd@{|vC7gPj#WwjxItr- zL~v31$xq6X_@nens70dE;rTWpGTXAgG}B@Qu81bS91yMy?RR@6e_9TJBNoOr_nv{f z>y6wKH)`_(TbOT|my%qTQ@HPRIf>43tP}!Q(FLaV|KIFGZYQC|lhAmC7G!JpHCV6i zuO1|*+IR7zdAKg!f(+TfBTY*hf1^5@$$VMLxYb8xG0XR}3%-^DC(k2TLrGi%gnxy_ zZM^b5rMUc5_VA@Bu6DQC*`v6JMEINU7&Wf>3S}zJKeC88_JP9mV(NgZWZ|J*U28yx z@l5JFU~Ae|Rb0j{YOd+DJ+&oZah&>dRnWd;xAtH?dLY(ISf{Tzur&7RmJ$o8z!k#1 z;E)eO1YYJ!Cl?vqbL7zktD!b<+7f*a;#$rbuDNIrqel0&w;Jf{Ebql=CJy)nWo>K~ z5@Jbj?15Niv4&UR!Nha8GipstD3>+U=dy=lI=*j7i@Plr2a+s2y7?AM<%e4u|E$>- zqJz~nhF=Y9VmVE$AyUz$?)cG+P|d0pCKegktL7QY(lrCktWpMA9E!^lAa~1QV>(j+ zP?{|RIE*pav?_F!6@~|rw;Nx6Q&>aEX`uXQoke-#)XdAsLU!0?LPM7*CPtR+LaF8- zJ{PhlIuuU9m@RRc!qHac(gF<(u|41tPMewxOfFp@0kG(K(PL0=eQ~9LMKSaoofB8N z_x(CL495WYJDCb)7n0mI@umg3LG0GKn5*3qOtW~h>|bJ2ppPfToL@9f(#cyTl|QGpyhtCKs<(0{{kAUz+vE>gm~!T`P1mc0baeQ>)ejlV)*XmN_iTGPLjHxKDM0u zer*H1_a=3K4e-Z0hp`IgwICHbJKe*9^LK;3^Ut?pGtRgFI5e1f$l;DG9XoiL|3-Kz zgW7{gIdyOTz#8~{^$Y2@mnn6<{gpqB&bBx8q^4HRAs}mI2y}{3maoPL2YK?n$atF;= zW5vWZl~6nFbH?AfUNzC6>F$oHGWLJ0|K&az^Ju+bc(49saJ8NOM=unU=TVxgrg6r? zM0+1Rw#fdK>m4Wm%JqnI8ZhtPF@3dQEus`K2i zKxsu!VDBq^9p9KLwk||dsQdEU-63D^oU*-d^EUd5y)!kFVL3Ry{VwG`7R|(z9Y>Xa5c!a`Hmi91vITcxkz@dhw=RFlx@>ExoLkYi`S-( zoZT$P#aG1>;1xm-VmRj`BQH>X0X`sdJTe|ZUef>fvdkXP^;v!)cAf#kvYE{D`KP2k zb3KsI#DiJ5g8Ut4@=ne;<7$L$hzJZ0=%ga{o6Bgbe0IANm;I1|VcNhcokhe%-cW+bincNj#i zcwt4@r6PMrES^T-Idq$Z&yqBwi0rM`t-TVmRw~4JkHR9wkN3W?l{Y3u@mPW?)9Es( zGV$-2wDhd~S}fc%_TFK(U!Y=;VIRU>LE~lBe?BqY5($zWpFa4bp?oBVVpB*s9);*0 z2cBnjge9f_+B+^D%NS8&&6KYk%by!LzR<9erjj2{bUBueDfjicwR=pgn}--X?q#g;)&zdi`z??G{6N=s&sJ=I^|uF|x#1^v$#0s8CsAc9P>thTKX9 z24~e^l`e3n>mas67J*7Cl40MNr--!hMHj5Dy?#@JI`;GDm5I-qdS4YBupa(6QH-%7 zk(4tQR1dIIIT!*0r*eKG77&L1gE#%8_r~xOm^Upv=CeF<^o;d>^8EJ1PLk1kB%w4y z>3&uoHV5v|pP~ijf%P;f54JM^Y2b)gQx2Q6cU2aOC%SUmhqYZh1lM~u$u6AxfIG!j z82}1e-(aBdhzM1lv&aZJrS9y6OHWROd20C|3K#0>m87C!{vvekoG`I~$@d|`?V>l2 zcGMcQ*5I@Y06c87?xzU;n4G(5@k~eg=|aOpH!H2;*7;w5r6vp#XWwe6x@>CXz_Eey zfcnL+U}372F&eSo-Pa8I-CEzKsav^IYIwA|@Te&R+opQz_h-kKUzyNeNSu@35wZ2d zZKAX*(eTgRq6^;0`IqGY3Skupya|**y;i`El33|Wns>uC9$ZkoBZCE*@YI(W?<8GO zu^E2%(>V(jmjiO;N{Vy?)W#v`5G?k<2(wPXIu7W3k%%?c3EcUwVDQ=(6{g43nOk!YQm%9tddoVX{z@2ogeTsJu=S(8N((W!Ca zR~W2Lz%K-J2~=@*?BwvM_PJq?&u9O)%@5>mdjGgLXxzQdtLLa-i+ap)f8jwYm{(Xq zlriHNsUa*PONDWrVBvG@w%+XEC;PNE1H56v_RD74_CDg15=MH5)h2})Azvy8tJ{#Y zj>-*$b^t)}Z#_ctXPJ(dkXUuMgReyxiCnvSAxUXINkmlIB9ghV_r8{rl3y3on0whV zkpIE@za$Dh-jKP}Q=KOFX z|5Ka&pLBh=o8=am**{~Y3Jcz$gHPY@m>q8i!5S2ne+QqK!sIPBr#F>bEo%;gix!?0 zj9jUtg{}AKa6+SG&UcH28&S$qkS?N^gq#$FEFBWJGkrb=ONaby<3EbOt*Ux@kLmgw zHunrG>T;Ms_YXc2;xh0Q8r8ZxyGC%42tJtCJuyrHu`P1ZF@>dLt7!xD+{IHy-b(+XwiB_Sh*1s>)=1x2jm z^7bxMt?{Blo3I466Z-sw<)?ibGlzfNS`)IBspvl^C2$~K8{`m+E;to{z$gwB2N3En z^)k3E(Ijuy`Xej#^iz!`k?RK@oMk9+H9UIevWUj*PxY-E3gG#0xedofB-o7$CHmj6 zqbkrliF}7!fXI*X#)ST@H{qpc@1sXC)Z~B9`ack(Y5uPj;Dxg`n7O}Ar zw7KntMeOlyC43fMwQBpd%Z;=N3f{ueec(xQPX|wu=^si4>Hu=k!$|MEGm()K8uEiU zc4+ImA$5kYxHyIbt{E!&=34P3`4~AmtVyB*Q~JjrU-|yEW?-}dU4Dk$nt?iiEZE?k zT#@>Box6o=g(}SMPFB~(B5x_J?>+yNzG~=oX2V-xs%CQ&UbFj*DZfn|3~elKbH*Dx zD|A~*VG5dDBRv#puc4R{7Zp{O9SWD@;piC+&S|@toVu7C-^X$-#x!(TR#n$!Pl-uw zT79Y@g_IB&`(^*q=mpW@C#x12TYoLvqnV>NPwwT=1;2z2%%~oJrI(36xA_#-gtk8g zPaP#efRY-aL=+p*h}&5<(Bb|5l!>gGxAuc9q?+W2xp=pyRvlNw5~iAN8{S#XSjf0UJmmv9 zsQd0Ah}BZgrasxSrq>c*LGx?&i(P(`n!2@7E+^M`+gc=qk}abPEyN8MJTR%i?bN3yAhkEEy_jV<3m5wty&ec6KR z$BEEySb{Tq8$|(7N7p4P1{D{iK%LCHxr2V1#AD^{n zbAZk0)CWXzk`UtR6)a<636)Yj-LAXU@AG9y?tnH$$?2TBnwye3HPaORuYcXWg~uMuRSTimLl>lDHo(c1L8pgplO;S^ZLoeq(I?-=oHmIWl|)G%zvxW zQB+o7z5-XYwhn|CD`pwhhA*jNTsKG}jqAIsrsJQrpAucXtsSPr(hvudsOv09qQ-C0 znY6^3hsX)Z?4L{HsMKJ&d!pRs zCB0rgRsE)z!=`o704)?lB6-35kCsRkuVoofF__6+kH+us? zTU8f{)Qpm=g78SnDOG&Io)x!arGN4{|BSHj&b0YbOVjJMfR<)8_rG!@(WXen6Fkt) zR&e4$ntQ<ozwtc0?}pUr#334~ zpW{&mmx~8OJ16yJmldvJ9kjrw!H`SJi^^}5oG>3ViJIb#&3RA!Nc4ObZhslWw^bIG z%BC}QsR5<5MBt>Ynql66CzUQz8LR$KE(#0{&6abYYu#NPR(kNxEjdtBx2o*)XxuH$ zy{y%daZx4=x4~gN*1+GzQy08CaGixBbn}j7CXJGHDdnVk6D}6*g2Y2K^A7OiKIyo} zd6(^f=r>TgB_sB16Xp!oWB$ju;?CNt%;ZoApNS;!3>`3 zN4x=20h~dUIYjx3GWaKjYb-RL4P3q9i8Tr>M^glRdauDZnqF zJ};p4tcZG$4R;yf2`|HO#fLPkpm(m#0_|A8__d>=z*4gjGukSWpt0dz#+spE<~;$8c-$+!w(&?=0z4@K+B zCf^JnpblEq2?}C+Ib{~}qHX_rLi-2sKD#f&X$Y|@004vW9CpVDY}c*r-@+7x18)dY ze4}Fr*9J?Y90&{#NOHvG(V#BK)@2$od8q;q>1daiXJYIQ(LB6c{`#kYmUmU-Pg51c zsPVnj;jYVq`U;#_t3AM*&GMw9dtcgN4&BBCL(ZQl$T^YD~b9+v4Fw%fO!a(y*Z{%#CGBfynwi8v0cVr=W z>-Qi0LDb@FU6(+AZSQj`i-(q2(VR*8gU^U!`F|)!vqFsGAd!3m8`|5xm|z1T39KLa z0gp_U*Zf9eH93ir<0}vPo_A&+Nbb;hFi@&+6KjEi0TtLfsrtiM+jlA0;MldFmal zU+F0KXOQ5ZgFZ|z#bWu9?JM{zgvG(9<&qcQMQ=;iv3R6cyo3 z*kU~Jzn436ivZOW?T*$N5jhp4jv#g>-a`VaD>%fO-}v79>8UN=t>On+mKh=K2LChS z>EhCcd0G-R#fnQ{6i8~Hib}EpS)XKQZ3hY13VsDeUp&;A<@-=fz^ygvsJFZMKyd;l zjuO}`$}(Q0zg40PrivO^qgHSY{|M`Lj*m1=h9A`zYE5d+#8WP~p1QgYp@>U|DJ*V) z--`qAvm+u11G{*P)q%?am88{sYDs_cwB`)wFWGkQQ&jA2w+oWzR~_~S`>=qJpbG@F zX~Ccrsc(dWQ6J)3-SK}~tJ^L`18qs9juB7m(%&0KwmVndMz=&ui`q3laE&K`de~SC zBYHJPWh~;4wV}Js;C4eGdLEJgRV`3eNM*tg7o{IG`ba|Gjro$kyCpxA3f^^zw$$ z$BI>Bq|1dnP^e~@3i%L{Q$QmYQG&J@?$ry49tNgjro`Dv^S4gK{E!aG)zt z);;X?uQo**xQPGIrT{r@w@vYnyMAeE7KSInCK@Y#TIM}?gd=gbd${sh(^qp2E$(<% zQhB#c;V|>7!@IldhtT8QAroDMyq9cW6|mTZy<6+|&gybV5%Mpj_*4)lyGC8*dQ}My z8Yai#pn=5c+Ff8@@dTWQC$3l?(|p_Tr@Y+$r3?H%(CGnDf|#SYxTLbO(~%<*(h{=L z$`UfNGLBNmm6S!rWt3!OL`Ch6+dD`|NFU-B6F;)^13VNr7!H$J&)#!s+oPTp_{q&_ zTTTM&MC7kpL4Wha^E7MFBq3m(({Uvz{X7Vk5!`KwAWe4!1$IDeo~b?GGpPxS>t!Fl zRK;?hx!i`n+|=MjED%!^>Cd+7-)Nr)UoJ3u*_jj~k6u8GEyE0N=x7%<1)gs?Y;?D@ zeIkyxKzPa6%#Yss64T=lUWiNutfL#5f(wR68d~7;kY^TM^xYL}z6HfDmt2yQoMYm4!iV7ny`9lTJk%^D zu(wKw@0*kL$XB1l3<)@KEt$2s&MRgPo%tYs!xsf&Q3H0PaC-5|~1GA>X29 z6X9sXz9Nr{ZRdZ~PMXU4|7sHal}iks0&Tg@&CY8!Q@ORqwONCWZt@BHDh7+Q<_Bb2 z3L`*urh^03*&kYQpy~%J1W2I3l@fj`-kK^zaGwzOQXM;7GkCad+d_bbI67?ewo3we z#-2)G)uw@R=4p>CA<7lrk&Jn#m2Y@7P3l31sl-a3d>bB`IMvOCN(>o zaA!%4UK-mRopHyNrK{(`fSxVDYPi6aA-r9FxBs;j%NV+xN+=Ek`u?(!oV#ar3C} ztWSvmp7S6Fmk`;PPzct#`>#8a3TVJ8B0l#7m^oF3mHScq%X$n6$r*0|W zZ*Yai`gs-# zN7mf>1E$ZPsh+v1$`J}Q8!5$Uh_zMFxGDJ3s5<{Q_QFy)xJH7#q@?I}T6?>?jo`J? z(@;ntv}=#DTq~z{J@CyTU;kn)qryyHZFPw0{ZBVwnN*J-K#_>_pLFZQ#(-+HD@j4J zTT0+%yHM9`tB#?Ia^~5WYWCadt=-G#C{1kT(F2&ukQctu4e944)E;|M7A7?2qDgw? z@rfA+a6@RkwC!lZ;}%2O(pEp)=XvD^OFs8tsq}~-JnuW{hp%O*6J!G7E+vje8Xjqp z8zN$L0)QL?PQjgmgK7cS@hIW7==r=`2L4I?p(cIzqb`~Eow$1J1en60?3CBB`f(V! z^*;)a8U)1~jfN?D5c{ZUcQ2NOmzICyWg|Qa zjbTCqH-8L;RQ#ngmXWJw0fJvB`>KXv=?<6_um`3TER`HISc=HW;}*l$ipCsBh#0y; z1J_64t zRk@n%ft`tzMGBmeVlcKbcvhv6Ps67a6O^{3KZ?%2?^DkA5n=QPH3Gx#6w@|_@Z*rZ zM9M^SZ8O!rWHUhwi#*!+>QaOcfVAy+Yj=nV!!2PiOdWv$^tKelBZaTr#%$@d7?H=` z*I-N5mOV8P*u}Clbj)ZaP*AS4d@hj@Ej(~LiuvTN%bbtu<*IpPrRPLdrajpP6r`|t z*joc}M+XO}CP?LvTO$TkuRNe)B&*;X>-y-)i}tCxZt0_&S;a2`idfUAWZt0QuBzPt$fi<& z`hheR0Y~7=a*P>D82fZamEKFLoWW04VLDs9xJoDK_;s3o`3Z0YvvhET%!4~!Vt#=E zTgvi9(8v0Qoqsp;?Rs?b(7nE{rf!qhO-~w6WHE-7=xD!^566Et_wL=f$OCm29MYW|bQa0+S{{%w` zgBM^ZQG5|i!1<4vErcntmakksbH;Uh`rEUDYRYtNii9$Oj=K_o+=12E*_{f&%3;xn zv^~9x!Jfy0M_-p7%Bfusd-B0^>)I1eymh{+XHNZ4?}u@6A6;-1XSn@^OymH+N9z0w zb7EjLFZvS}2~nARK8|sIseH39M}>)NlkHSWdVyYvijTOK+&!)s=l9X*8`@Z(#MPo>f^$5=EliDW!r=t*NEN@B%=-_LzElekp(#z zNJh|APY@yr3NW2b8&M>f-Q}4%b|iq8>I}=|jli?Ct3@DO>AJ(=>JnCth(s4jOGoKG)1UcSw8bd*!RIl$Yr3ACu6c91k>i6F5}W zcXa~2Uboc~E*&&(OqpWoQJu{#f>Y+!olW=BvK zHvQwC0k}pW+n1sJ{kKL)uQ5LC@ubx5AD_HH@n29WwEtq@o0~eXK~sfHq(Lc1VmkaBfxR?BC=O z9zEJQ<0wC@i~onZ%k5fH_(n0MgOY*R#$Vv>IQLT2wibd*>lgX7{ZM7!V5;4D_V zt;{*)#Uu9907k<_1AjEh#i;pg1ROI;N2o^XRxiJe;4op{(-gZTLzRCE`Diq zo@{tcl2mXaBaxT%>wy=MM(Nibvuzp*qGbxE6o#;#hrk`vXCj5U1>ofxxrnf6h=%@+ z`vdDLfCNy8x#C>Mm@Np?8ls&p(W^XTHBBM1P~K}sZLXBMcY@EwyeyeQJkOFN2d2(? z&}=uM=$cR%1zLcHkVboxVmLR9qgV|P3$td|Psp?Fzb@;2O3n51MH+T%$w)VSmqLR= zNA|NVD}ev$sq96f-$?v_So_YXD7R(X?xx8(=M0i0XOt))p~*StoCTo;M1qpDA}A_B zBnpxxD1sn@Bta2GL{ShCL2?rCt*>#Pv&XybKKI@G#_)$S@Jnm0s##UDWR-XE+}cOPDa6%#zQUyt|(mbXt1s>(cF>y9-@Qs(7I6bwT{&eWmiOQV-(Aq)BJP9`GGr!kugBLZCqX|6qHLFqJ&$#Kj70#fgB;9{8Hp!SbxME44;9 z=F)IP`)IjAx3P-QdR6xI6jRtIaO{o6!6rJ=CAQWjh6#%(&|9PQH9L*Z0rIU2f z{HBsvV!8I_jfc#Wiu<<;MGzFbEEIy(s|!aW9FRB}oh~tYXoW5oS%kxYq8|E^fHXI! zLge;eZiV_K+^k;{q$*A#?GM4x1lK0hB}TPxTtvbfdtHBiuSb^; z-A_*LJwd4xxt(#pgL9~L)w@pv1oGNQyV|2;BKlmfrZsi*X|2KX-O5*2l0@Q$MltlGnl=B-6Wf^(lJ> zvY{cy8{+Jl+WyA++b3#+FWcGV&{ZuhRLVVa3u!;&8JV3lM~C#kcGgkYjGl}tEPg(4KN_k@KS5Fa6H%;iCA&gTx!@LJBV)F}nY^b;oPAs;Z z1nBwLyONi2s+RtYbiw3i`G9`%g)XuZSZjLo4?pR?_fNN>4`l%LeEgxL4IU4h^#Re@ zzGj#)ufNIt6RP^c-(QRFs!-3CE?BCNlLgF0h_b`L;~9T~(nUTvnD`(1u-J?WrkBJh zvE=>I8)Sd-8RyfzA1XGKD~en;WOha64YUe{hrA*6)mFe~vc*1GlR61>n0yuT9pY8p ze)vwy6In$X?LXm{^X2AmIkf|$j^J>6^3nQc3*GSjhM+K^iMe|+f{!f@=p%ghfMUQ| zq(P2S1k5}Hjw!Q(N5uwe33nh;N;xdlrL0V9D93}Pc~PO+OZn+rsz!QorxSe91grR4 z0<3#T-RbL55Y+&JdDwFQgi%nyjw3?-tSZ73f98U_;d&4Mr&zg;2}SOa{{;oL(pbXffb-jjGc-0lUn!Q9EkI|&oCK3kl3Tfolt_ztZ> z05tp0e+oA-4M~zaIUdfm##A4C{iq%G?A(58pkaego>8GxkImvr14y+TAl>~S{DZA7 zuC$CmVe4R~H38oYhGhRV9v21D2s|C#{|sWtxp>R|RGe}`JEU!}P)Bkeih>qsuJ z-1pf-wPkYYdc=%do8V~(Wq2@v4rc5U(%|RV0#-&-z$OqLp%B}H;_zj{$a4DTD!;?C zbj!DSht<*-0)OFihP`@uON@E*Qhb27wi@XvP;Ij%fjSUuae(Tw8a_xIvnLUE@{Nla z=M)c2-sDu$-W6>7xXDhYW+fdnXzwfwa^7ZYyl@n9^`zphtjyJBCyr0otT#ePJG5++ zz|SA|wZ@YZqd%*4_4YI*5T`s4K3@qR1Z8%Ifs7#SuhlrFsuulZ0WtMnlCO#>S*!sn zM1nmfB&OH2w{B7)D0UR^RZm0|FN$|6JDC(8^>SwN`X^docu})J{Lq{buQCM}EnO?5 z)n8_wI`vf}|9J&dTjoK>gH!a>w}T#6-tMg>07ux~0Bj#HdQ&C^*PjeGG6OCrZa#qf zc+shn5jR6bq&w9qJu&3_``O^ThPMhHzZ6NuMf!<=&GW|=ib4Wf`2Q50(W*cV$-luF zh!3iyeP!*Qz=E`wb~ZDVxxP#Wx_IxUo~aB>&XhvFghbDcN1>9F3|yuG`y9*hF0{g( zi)3%#;);AJ%o%+3eJ;acKSWxB> zr4C15b~G55zn>(#siGk(u&nrm1|0xCm?Jbz8A7xe^$ct*8Q@8bGX=SgQe~#X?bP>L zVn!n089nRyxzQJV;FGoP4(KJTu8XiK#Tuag#W3OaHT?T zGp^*!OT<~ai05bE;0pSl(8`tJK>c^19$4nwbeyqY`71p@rQC14$O|Ef|C>TsZoyJe z<-Bw?U3z`HG%C0+f5}$NW-!Q5ri=-PFj9HzH^29ulxA1)cVFmb(3MtN2Sp%vvRQCu5Bw0eiVs+QRPwmR zCkyxfJN#dc(v`@cB+MDtD}tYc0FL2!dLqn80G&b^gzO&h4uKzO>t$*7Xz0*HCvJJa*to%AZ=)G zNJ!h_UC`C9-Q}JvDG`BgO`3PRp`U|w~P=ag$ zdz5G-4yxnDh%4O!cV{k~3H@Bgs?4$@^)?vP~L6| zuJ8foo{j@C;npL0?facZu3X>H{qFK9+l$b(;ug;gTbcWrOtaPt08bk0gUMHw@_67` z+tZ?0Y!jTt7N|@f>}(ks2|P@5*?BjC`rtFkpXv+A-}n%NXVq_lgUA*Xr;pykX<(RG zMep(9u$93gH z2QEcp2@Gqbq!)jNf+B(1Y(&*LJ9oPu2_c!-5opGSbJ7_b17VtkWO zK?RAm06=>&WLi8@?#%Zk%Qtkr`y7&n7f1)2Tg7)AUNe=Pk!u@iR z^(FFb@18$D7i*XI`bJvlHCR0yCi4sdz)rFX0#>LX2{ExzY}<<+qi?ikd{o97GAvI2 zm}vZ5&&qo)8hWBw4p>wV)RG+A2@3}|#sSY91u}W+La6zl8U@Ri;MP^1SHiR>88l<_eM z(GTi^vt8)TdfK0|O|KqrR%9W0G~GdA zIPOI#N?YQ6s=W5XP`PLoQS5BL`(SVKM&gX@wNSNIbB)m@F*u_Z(!d9jFv3~76VBsa_H=XiN})A zHpT`_j@1~7Z_r$6EZ7}Xpp&%aQOsWlLOA-gRgR&q$IrfceRo@zl@fRh>+3kN;uoCjdkx8ZAGmt#vWVCI*Y z?3P}#K=C37KT!_zZdlJomj zzyg=F5vx4`?@G}zS+%*$k_6{ymIFJuyxr}&2)$*&FckMA$a8YU(K&D{ZK|D~%}mes zJ1uXGlWGffAVD!Vwx|wlZ&o-M3?#M!K0Jcrv`e}h?;K7=gx14OI?q+6#X*0Ox1X2& zh}Isc+`|YWq<|hIpi&A){v+j`7TO~uPNH)fhb|1a@?;46m=W;xFLL;?FyM-Ig+9!b1HNFX)uK5(a)D8~BYlQ1@Q4+C z!f&eM{k$*ivtkI+HBAWs#&zJE9ZtB&xGT;TTW&GI6x-2yqha?-60DLc({-F{ML9RY zL9to_3oG*)4=ahmYfy87AhNSql1dmKe*aZMuE_&MsfW_aqIn%oyA&7YaL;OGNi+aTD9lSO2Jwg787v<}JV3;) zc2_5{&L#WHntYex+^>T3?eaNK{~AWnXOlTACNtfG+`E~9XB~?>HRQs#SDuZybs~D| zM;w$rGwI6Sg(-Z(!&)}b#?asc@JhEsGeay~JK?UJCcido^4>ioC7gbAg6a9$(c6yD zV_IB)kFPL6@TZvMqPdUEeG{EHeYsJlAKiYeDbC5J2<8WN5Cs?SA1?qx4cx`i8jvV-Nc<{kN0^k zw=M-en+S%T2m*oSKLrB+sR|Aiv%nkVQS^O;IG6<+B9z_-abhcH;QMFjy$&9j8`P>M zSP#@Xj|IQ-kH!?TIIg$BWaQw^^avyj{^rQNF(2?OYvs+Co6sYb7aRTWr$TXQsM>- zirj;zdu4^p8=bOYL{4lM{dVC&_H$jMC&x&{9JD+C6B7CFwL_GiFMjz( zNdAr|!jXWi>`v{|dt7;NZj+M|oR^>&{ytz%{lio#0cj|G zUy1Bjrx4p_$@=zksr6D+2D)Q4p!F^pe}B>C+x>elhXFg&{w$QfKW1rQL!Za#dpw8v z?Pshm$~z+F1X?bz<@RgWUJZ|1ZM-jgv`oIrfpPlKY|k1&95k8vC?3Ox^Lm{mwR#Zh zgXW56)e9jU4X3nKI?iS0cOXx1)DQ3$b_~gb#A-=E9+B$p4PtytE`KJ2$N85s9mVb; zMhd#VEYrm7;P>4c8KIU!H( z#7dk~@aW{jCyJ4+uAyRv!^17_d4=g)lN^LbNT>g$(vi852`@2EsJ?$i{ELaA6rqT>n7;D((31ybN3svTMF+(z9{8L-T~~x=6X! z3LWy=ddYQIM-!7EFnM%wn z;Y)ta9RC_>K|w;RwGVR_#=~@i_2JW1zMdPd`xq#}XHtefPOC(*Y(a zogGhA{#pCe^Bq5X^RqETa{~cDG&dhbz{-n+foci1AX$6#B!n5F{=y6_BbQ%JK|G58 zGTWgtT3GAWZ8gc5(+*DW*2;v7nD*bVy5}v+(B_P%(tT(LZvzco@;wKk228)gpM(LR z>c{^>Kt_571Y{(TcB?)EVBwY1d`13CyEVp$DsKAON$DNmmdXHhmsPi$+J_h8p9W!P z!w70-xu^Jn{)$AXE{$ZGPh~ef5wWna_km^ z&N_YlDNFC2STgRHL!|@r-=zbng#eTeu-S8YX>_~I))%u!4aW3h{3c4n)9+9x zmmJ7Ob`NKDZwr@7x_}pPVFoX9JeaA7X#B&qbD?`I>kdnJbDQdYx$C7O9hmkeLgGp$ z3IZ7L!VhhfYpcFU>3z!$4Z8Z+L}>Ksn*8mknovRHR;^GZ)ZV0@4XBaW@x&Jd))OKx zh3+3{^sjYIEce}8UN)0Mo;)+R#&+WazHmsO&Il{zXGJNbSugaUQgBWwR3A0v+QR#! z4VTi!FLXcSMLZrOUt`(=DbAA4eTY@{0!8qbL$;rPiAap#u%3M&7B3_bzwls?_9=hz zlG0r3yjK~}jWEwRYJusuz_hFgqK;UE7mLy?A214$TsS*a%juK^0)5&RFi6(yQdk#7 zUweUDd!1i*n+INfF8SeX48P@*o~8FUC&5bioChm$#0i8T*01W3J^AuE;^bs^9np$l z;V)B50|VWuhgTo`Bv5IB<|A8i{?4YaVb7);c}MzfW!-%{l_kh=mK*1C{7>I?mbWY^ zI)($^=e#z`@IKuJS8<;NRuwz1KnD+d2I}_j4AczRT-&%WRr}tQFL+y@Vq_AM;gAgZ zwI@1KThu?K?>cWL4uxZ8JCOa_4MHT0!dCEq$kVgS&LLZsy zl(UF?r78!c=i&@1Fr%p**};JW-b#@GYkdoI-hSB{U5Uf#csEBXPb4*vugCW5oTQ3X z^|$v!1Yw|G8EjMYVX*p!*eDAyg`Y5#;@ktPfSt~3zT1@BJu2TLBI;3^7|sHP8`+~z z}O`s^$h1>#)d!!#gm1; zB^EoWJ3%k&S^JQdj!J#7qi$qOH%gZM*>mcq8WMS7N1EX$WaXaZ61vu%Fkm)aG|+a* zF`ynIq~sFORGaz6BtiSl^;_&sw??10$GBa&y-GP?>~_l&>=~34v}bmqE{>-(ZUlGU zjxi+q(q3inPQkx7^DVgk(#z)}jU_@a*T8B!-vO&_zJq}9)+TnmWfUH1BCj^=((BVA zn>1h~>?I#-A5*Z5x|+?tTPx2*^Yw=`xR9X`bRp1n8iIor)nisdtxVBfIh!iaxZ^bC z7Yptt`@w+Cm)4F+)$zW5$k`>x^2tKy5YwKEd-n0KAd8D5DWY7u`!C_cn{1clMNYw? zGAR6}ZZW+L1DOpW`pgGjukTfa-|R!Z@A#SCD^EkEBzQ&O&s`k<$l^A22ecES)GCmW zrXyS?nHX!h0E(bZa1-hH=@T}!6XuD}&X(E@`r4cr5`DmD6)>Zs!_G1-(f~(#&jW&q zem9BINhli$G)Rgn6X7NQ30K2JB;X*)Ktfz{Dny0~2L76-gg5<@6dV=H0oFxzEiL^* zRp%?ky+2!vP|v>wv2$Nzs-5z631$Jh*oH|^{m%|~W*PE7fvW`)wEeAv%xX3;Cua1k zWCLl(kSWiLfG#1c;D9>$wr8EjV09dGpw&smDU~LUG;vQF6gpwnI#g)Rl-Fib@)?H^ zZXEr-$LAKFr5Z6475H^i32>?uED-Lqq!@G&_ZPRq#MP_eJJb#NU(iLBpE+9YT`%ut z8i9C9+B@7YLJ!YmU16dqXBe&{be4GZ8(nxi{4=@$)serU3;2IS*O2rKq_p!=urYpk z8Yt~h!pq^oa{E`mJ6QsUk_Hb@81Lj~r#Hx`aA#^hnyO7aXQzk=pbHr5SfPnu0rG}&C;irqm-!yPZS~BfH2glhr9K9QLe_rA#g^mr3>K|EfNl~t3{^*HQ)1tiEm#o7 zZrn9`$ZWlU&o3(RomIaaP6);F!eAF+XP7`71K>8Wjd=jGOr4TF&b3>1-jj$ZD*UvL zH@~OC>-=>r4E8X?Fed;8Ny-V6wKk`GIW@afGx5VCx|q;+QcJ$rY`JDoWFJK>fKkPe1-L#FC7** zW$teNvc{8CB!GE1B}jlv0rEKlfxad?@czmzBQmpt=i%R5nOIvEnlpKLGlLVlU3hZ8 zP=d2$q!01N5eS6?1lE!nNOu$|dGBZ|QZh>9oBkxDQ_M!c>R;aYLaOerxUSy;R}`30PY=kUVUI7j z{vZHEi$Gx`E`j>e3vhTH!=?TfUt%3>b^Mz^_Kf21%q3u(Ee;0Ko4NgY>KsL$zt+BM zoSmEG`tanwwiLk?fa#Qx#+O0VX)cYZ6vaW;J_skk%kMMFrne*w&nfm&5tK9&_}~=! zD$4!G_frarj!4T^$T&43vF7B@i=rP=M*HJ(X-7q;f0bAlt88jSig4}wyXL)~u};RJ zgh*)aE#L|u6D*-b@CTWNkakUy?6?vGb)HG?w8L1-!PY8Uf#|j67pRrc0ozw1+_*?9 zf@8ELU-gGfCD`{sF-;8RDu-DF?Q`Mct2ifPm13;bQI z2VfgnR6x(B0q4{(M0&x_aXD=)(M#wAA9OJ%)^_8VfUyOCSEqu{mJ(~w(!5O8Z@tM` zZJyXjQ)en@7$I+lqwj8gk5d-Tc!t2j8m1sa44^T*1@&U(J{6qv?rB@@6O6@9{$l1BXAZCD$U?hR6BRONW;1+TEjYtfMLuUXQv&sK0s!`}gW z?eY=WYx5c0Qfgo?_MYd^7w^#1lGmHTde;_vVjJ!*6=)S!FVuP8+c^&@#_DB2XSV z5GiUt;MZaBzc>`=r+6=Vv37IZm!J|%sQ&0Ww$~blFFLQ7U-QH5Kz%{h?SanqBSrzk z-#Edw@?SXNPp%om!Nit-KUPg36z_Y82${G* z4oCY!&C15-fWCZwa~S66=MsK7Yv-9HsIDp_tzI9;ai||e;n9+p&uPk+7mRP8e42dI zf-s0N1n@_oKu%8Rs~TM{UtE7uSBhW?xfHV^iDGk)yrP`rXQ~m46vY6f-RVC&c|fT5 z15O@WxA?!DydpZA&A?jv*;ikHlK!rA49;8}kMhsmB)Ls} zc=8jxd-116Om&%Xt!pS`fTpDH<7_sdk^<_G*Zwz6bx>l(hRFVFCg7+qBP|kWcJDS6 zba+SY#Zk0kF*RvrukF^cy_g1M5W~=zZ?Y*Dr^|s845Yq{qGQEi` zZJ>_<>M|hJ(tM6H`vE)Y!I%4!2D~VD*~DpG=VJyF=>DdGZJNM?dVOG97cx)0OV$d0 z?({hHOl-QnNc0f<=mqK5zpgLc(mgw7;H!6$0bfCbJEV}srev%_m`baA*2HC`d*?uH zTCVyx_%+OrUfsmi74CE=w$bR znLP1Dxlht2v|js5^I>HitrIq^(c0ehpEwZxLHu1){G(KNi|%DJ^4}39v+1pvpg9$M ztC6?krl)Cl&FhyD*_m|=yH(Q9+pWlpm>f$|Jf$7<1UJ;JD-%2_cg@SMJDRSL7A&b4 zyhK^hhfwusc;y>w-4;1gB%a} zIUnC{Y?h^YOPRL!JyKg~LcQrup|~((>Ru=BJ@Ksk7bC$DOm`zf5AoS2F5m=NH(abN z6P)ztx*qc@ur94T)cg{T3hU;pZW9qljE0EP?>=KapzH;8g~B^EX`l=h3qH4)n5L$f zm;^0E!-eV(&Y8KDtdFmro$!^tQFsqk@%^)64^Hqh9-Uv%!ZaQN&M1o1+f~X%U{6&o zBe8ZLWdZ-=(mT=1N3irx)MJ(X{6%U0xtQs%pQT$=@6A|zUlHWINP{#81IR5WeoYol85hDUJBLWnaZ|g8Y zWyRZUVpHKv&a$MAJVyfg0ASgEtB!zy?QTmk>k<8q46G;NOLmju_(WnvT9 z1K`RmFs(uLZ~|Zso#_YwtKdA#10#CrEcH_a69bMvu7}#9TNhmIOvd-WzczjaZc-D*CtD<^$aYXV`9vnC+U!e`F6!1 zR9PK{IA|BJt9EIN>Gu+&Q`&b8MzrdhsMJH(<9QkIFH*c=4jiwr>j|30eQHt3nvQfD zQc8y%oyT!HkD}S;J1ch}_3)<~HLi8708uIfyjVU8EXnbRWU^im#%B`+YKu9>ih>;+|5N+V5}FBpgpg z`)hJ}k-ov_nRlfXS;s*-%O4%L6_y9<&Qpyt67CfShh4FM;?TUx!s?sN@v~&-dBQ{e zNZ=w&N+9eDVp9+7Gmo{E$rMS^HDwMl3z9m!OG7Z49EZ5B`(Zc<{5aXJpI&>7U$(OV zokHen>o~{B9yBUw7M`=Q5=GZ$5i7FQJc{I}uU7scRt4jt z+}rauJE@OP>-n)}zX`mln+kw-GSbJRuX_KQeW~wSx-yAXyXk(bS68ljY27Cwo%u9D zsd+(7H9__v;--H7o`^ z?xBP*kQFHu9MZu55Z9rcAa9d>qZ(= z0w`^Xjr0okf+`pZh&_tGi2goa-i)|t^Dgp=^z#jpq-&p3kGzjkeonN##0$c=D11_?? zkI@mYhJ6lbG3$&sDOOk1*rE5~rsQ|NCGM6#lF=5lETjQRK3I?d(+DDink_h*YVNgV z;TbB*Rf?5#*MJ$?=sn|%rx}4Nrx?T&Pv!mu7k3N-pReWz0!`018l)ogK>$CB)sQY= zC(u$E8Grc`PQK9mC zCg)Vve0VlSC8NH%C3Kr#Z;5BHcIzMkH+JsLhGw(j;?sshbYN`R8H{J+dQ1sd5wKin zR6xAGNtJuMSgG~J_A(X8#q8ERS^2Nvh0UPa*^wAtml%pHmpk&l*e}iJY~{u-k@T*q zl;scL&BnlrVk$XZVjxyJ>9DC)uSL@9jX!bl%X)!yN0-7l|0=FqIbPg+(f4Uk$#LQO z9Rb*XWfNnL=GD5jo0cPWwwnKjb=9hIBUI5OxHassCqGY{7bk#+7jt%1Wu!R$ouQ%Ws=pt`z2GJ*d+#dX3^Fc}dGE_Moa2fYKi z;ZTjNtt)%lH^JCC2q-`xKOi40`{;X=vAbN z?rOjG+PvbH=f|$6LZpRv52?4`yx1nf>kCCs8* z41(ol?U2cP`Mg|8TaSv33^?WO5d)1`F^Pxv!c#csQ|ze~Ol6b;Gm1OLFw(?Nf|Re) zE|$`o=ZUhPQP-O8fDRAPCvAJu$13cSbsAGkFhHWP4WCd7AwZ2;)h=8$G2unKpEnh( zzuseHV#_C94>-huQ}gcqEiP*Ii}EKWn+7W$mWT_JmVe~pMe(R#XD|Q{YN-Nh3n=P3 z^N%vyZ)sv5QoA6EM}LtxOz$d1btCDs95L6_o{CUCVgubjew~JwFV0KXoU`k3^fE|2{|ArvmBqMTs^(F1UtfG zM_#+|;e09O)EARTLSGF}@$q2RZKOWC(l*Sz0wJ@9hqcR3JOn_pD2)a`NB$+BZ;wgy zYL{pC#HNefbM)LbraR9$r}`0sH}Zy9(fV$rW$|rq`T1n30#QEdM_BT=Gqful`Ri-4hTp^F4FD6(&CI$J7frm!|F?^S|tuV2J3pY=N;>A zf9M7~*J=dpT=Q03kO#ubsV2OLskOxaRcoP8IC5&i#{R6%9v}Y3HD^+&Klh@F)@<<{ zBme7!kN%p)>+^SBx*17=Z2|gFoG(Mz<$pW4GgoZ?Fe3D!|Y#+Z!3Ka_I;`!la`)SRC3T{F(2fiCXrl`^CBZznoTV=^w^)Zd2p69Mjo_%GobTdSbBl9#9xsfH(qxDuK1ryXgF#z&M;pkTKr*&%gK3d6AOk};jU+lV<0WEsbg}V zKCFPRrl6<6_?@an^}=0Sa8^K6_j^_y7>(5i{&CF5m5_$PCc_IMzA*vr)~pgW>p_08OWvEOY)4*Vw9uTKGyVG#(i^`2k#5)f$$`}1znriu_>?0%F)!p zfbzMuTYI%g^>Y?V$p3Tm*HN<=rc%Bp3|I;^HG({XD_5zBN$9hUZHTBGy*5mEC`%P<49ag zhb%ai*t&NBCVPC5xM{A1buvu5S;*cn;j$83!2VqzxzB-8t_D|FA-IrDGdKXqN*ReD z?EORlx-`K%>9ViL;|+d}eytV`0ApJwsz#{n=w#3rZ3bwi@gJ8ANT)( za0TW%gY_kW7(WskxZtnlG~XC2k=JgnKql{LadLL)0*&w_W9Q^^Wl5r^9rs_iZ>-22 z?5MiDs>lT;Q420$^1w_qbNos>&?_=1T&>an7M;B2R_v4I^#1hi5c#Uv7JB5byu|*_ z%BSG{osQ+*fo}&x-LRz$F_Ob?rs^KGq;$K9erj&L_ueWYz3<+-T1%e z*GiO4y)^RK7HE`H1*~E#MQ9;z<2c<$^`jXauNU7)wA*CrPeHn0ljOPE#JCQyML9gV z@6=FuAAr3XaH*vQv4Fen3wq&QSMw4GzS~iC)(T8UZILNldh1(o9@r7z7r>5~bKoEW z9Po#kViz*|B!KsCkuuPiOi*5;;pJfOs;9d|mzczTN3KPWVn6%o2l`%N+rmsZV?5F~ z4eIUqOrk$?tUJE4h)08i7QVmumhmRYmoU(L8$fk-J9I6AEuil|?(UYUy&QIr$wQ|* zC*Jyfw_fZ?;%}zG3;f-m6-92sVJSx+VXPmI`ti^8@H9mj zMJg>*zWO;+KUux^+y=pKPOhoVBNsme(Fp9onK5of0&(yYgcwJ@@mDb<_@#LMI<~16 zHAY?XUPWA6c!@1tRR&2g+vY0-jy>dqW0(EcdPH6JFpeCE+Y*8%HeAX-Xgh%TpOOO( zNRU?y##xXm$&-3_NOZ<|GvF-cMf6aGBe%hd>fscUd>Mq*&T z=}GovJ_BY-1BqWVAesO>$VM4RFndqEeO6GIKE{jM1Lq7p6IjYs)EkK-6?(b|`U|oF zs+{fud~?p19^Sa>)brKn+5;6H&V)R{blRviGN>f)IuM&C_b#Ww=GVK7sL9R!q;|z> zIEs(?4p+SY=dp3{YJ^Du8#+2ErNB_wln$YvW2<3^6M(4ArNFch}@q1{>PX1Uz zu6SqSeb6p(IyeRSBNEfYEN4CUD$UY)gno{JCadfXoR}LAof935A@=K#0EE%*l0t9 z*2B?>XC)OULOjKLDo;m0DhkeWe?xTz_M`hFLxy)RS@0w9_SSsR`K^a@)}ydZ3TIpg zFO!EM`va1U$y3fDb``eT9~`I4ZK(rf%@61#S!89tu$>ofh2a_lJxVtZK)N)qgG16! zVB8kALX~tKI(6*2ms0uD8x@%mg!pUx?b>Y9$@R{h#?li8)HlA?06$^Q3v5uS2m*{O zzNNZcK>tG4;{1wv^2pEF$5Gu0)Q|hfpP@PR14wNIz&rQ^fOo)NKROnY_=kzb*v51H zXOTn~K;>p2V~|e|g=acl0kf@&+HDvI6tZ?Na!}}r(#Jj+nz%jUX#DQgXYnf6?}_R_ z2-oYb($pVReF<^?HrI;JiH=u?{k+eJf@NFNn^N4qE_H%XWspO41a&J3M~wbC$8q(6 zf@kAdTn13@MSY?_dDcKAM>W@!hE%63Q=^QyUm0LGuyz>8SS6#eXhZZt(COzWBju?! zeIt0qC@2Sse%Eic{iD)v`8wXCj#Z0H zJ>i4aOG?#T+9?X+-fvWR0MFLN3JQW^kRT6$(R#rK765U=?|qDfz*%9!esb;xg9=yS zu9ee;_9>L3$@YvyHs_m@!CrD-1Xsc?*ernaC!Q(@nG?n4!Rei0>vru{x^pw3A|vP4 z{Cf@Oqb4NX7ep}Gs51NADiK{gq{|w_Ql)|4VZha)AVP0yUdv;8j#o28dsr4+!M>4hDE`p!j6hVKFF!KrK1-_ssukJz3yxw2)a<#X;0ggm+Yj1u?AP;p%1 zE^Hs7wVxU?9kyBI|ICqVXw8sTz5%?by$s|s|KQ zR~95t{ncI}zzs{yarr@{PVpC7$hg`U-H8n?JPtb+JyGcS$VHy=J%fgU|GesG!MUC2E8 zof5l-YgDpE`t!z##d`Y7S{mXPl#@7CR43;Tnk%R$;PA&F5$nP8MwW9z-EYP1(BtF7$2ND{tE!+gn}F$d!G_rDE*XSkHqs9oW`sRpB>UI6 z%Kw-j6X}6r9o%`GCOGaRlfY1y8Mu{hYg@Bd%Fu#&8MV@3v~8+gC-!AP{sL*T5?DXy z{${%gePuA0A9j`xL_4g)x?3<1pV8AvN*m!FnIpm1tJl2`o2%}Mn& zs~@e|`Z+!hTwpYXQa0SP!+J5Ja(9?X2zmRdTn%auCcv}(#Y$9M2e}wPjsQJf*e1;$ z|0cvryu2F8em2w+hD6*9$HjF%9l~{6ZkYat%#OpV#n~(Nb<>+uiXV}lA0VUaiVHw(@Y)0%l@s}bI5}ag-sPDifss1% z0SC+c_6^&XijO_O=$gHSAkm*dEzs7&N>v7502Ma;otnOrUt@nPi@$V_KtIBD&GUGD z(*!YKA`Iu1ar$DlqtKRr6Wx`qV4r%CXFOdnceg{65uP{rAb>L`go+k4c3(qboIUs5 zLuK8w9!AT(n#s&nipSM*`LM;a_FRVDfO++zTguM*_HOOzg0i}TOpeSAuFFFlzyLL3a zN=`mRc8^~+Lvtqm#ft~0CEj&(PWz3SJ7@WUZ)DI2oe6ByMwQrc|AxroEH4|F7Aqc?`!S#^IoC4SXAu!cDc$TPn5g$~xEXl}u)C-N^}tzcUG? zbN+l=W%>xzQ)Q8sg-WtOmq|Z@sFEEC&}~ue$**H4^>eiCvM&zAUC(t#Y3JI8(nzH` zmuxbNbFj`LeWbu+>JQ_C7|4^8u^t!#Y{Uf|R`W?13>%vL51c7tn1~DXmAy!GJ`tmf zr@VV7hb~l!aE#R`=C0bINkjq|S^{z&Tx1tX&hlryiqxM}T7((1K#iY^L|Dssb@5<} zRt!4SaGvccCaRBJx@U9O<Y=WTf0?r6%< zkuNNM|1QW{ov`F_%!<-$9MlnI^9-??;m1qg=7?k2`fRg^>U}VFLoMXQJ;PN2A!ffc zL;qf(bgk0)_2WHHfywSl!0-%VFQ&qKjZa;kUg@SDJ8IPq8;wYtDVjyMXEnuf-(A(WgyS|e>yMt`Mrm?8;kOmDK`h}#hXVo%gcldz*q_)|#tNqZdHDBb$kT;m60BzP1V zb22?it`@QmkyX*3La6B|zaJjF4VNcJ+Q>p6`XmzK*I_INHUO;s43j|k^cRmI>9Jwc z5Er(tiwEP=mKmH!ml;A75=-Ced(rMMmFn+OYh9aVsz^5+1OtXJJ)J(cAyDw=p3eW; zb@89J7wH*bbfF1l#tbk*IA)x4%PQrG4fy*s<7Enimz9Vp!^Qhe`Mj5`Z(I{nkk!I3 z)b`PtgA<<`k56xHA|M0uq`Jdu5N;MF(V<~qA!5M(%rm!YDH7;h(3{oXD zRw+60WxBXfw{H1e3I&Z_-WDige|O#3yJp#y1+O3=?3?|q=h3Zu++T03*t+!MxEHV0 zLOctPB`|jxJ4FG*vw&t~VM|K9AX%U;^8edS5usjFd$Im2hP?6aFL zpSrdNMe^>h7})d=eFz}uye6R^*qkbQ{qxthvi99uVKdE!1<9=_^3jWjjDjrrcH2m= zCU6-AdIVOqim8=vP3`SJDSIR!Nx+eBe)rj>Kn15b)@;E$oz=*^`Sxevuv!=WPyI=p zpgHnJ?5$k-Z4p=+M4zP>8l{nPSu#M4j5M72 z!K5>#Sx+6M-ShW2TlaxzEz%+s+5(WiIW!~+3w8j*ESuo0XzLbPqqNjYG3JW7#bJ}4 z9B1hPxb?3}#))NdDHo8Y^}YmILpmS@h>)@|qvw2@uD&H52(aR6!AWE;!hm%8v#mL_eB;tW@@jK_~1 zAR!0j$3e13=aj)~MeBZjA_>0t2QM>ZwmYoOLWtteg(aHf@=lBfT7XMLedtBW#~|kj zs|VGE({e?pBxUyol*8o*y;>$7f`Yn3(TGGKfjK!&X*L4*7qL2lVQz}e*+Uw4Z=TX?&xArSvtvJY{GV@;YZFg5VLX?g%a@+M26V%cv?&{kaDCR z;oy^k*3#lNX`b==+b1tIeldK5*GN6zVqiDrZV&+uop~p8=>8xb$s%$Iq;i$L8yXU0 zme^8$*33<;T;V%n&t-=Fccmjmv>{nVWZw02lQ;lfz&PNz-oOtayjcKM1*QVW1?-Sx z?Z{;l!<%d8zwOXjvoETDVZUvZ7*C5uJJKs>(C#X`lRln<5^K7vQH@Ys9YikxH;IR| zBcIxWn?(IfI+7MN-oapxf;#M3iFYgHO;OSMlCsm?XAd>u4Bx@l=F6ag}lcJESBv>Ggk>iGzDYSKPPc|L2*0&fib36PP5-n$ci1c$8@ z!g&i>B>xKBov!XbnZ{PHuQkyt;Ym38bN4y#w{PCIlD6_$$v5?P@aqc~$5^7CY=92| z>h(Ylk5>Y4NW_czA z45iWlVVEWqYy$vt9BgAlAji|v{cmK}SJN9@wb_?C4B@^jr}S%)vLHp6_f5a}`t!M! zQDZGQ5N^j1W7w3|u=%`;k_+CsCfv%DdgV*(b$zEUV-zH}602N44Df!Vm|gb~d5Z z&ITMB|AOu0VzLy~i1_XZDVk5CZ%in*`Ez*ecbwB2?5cj1HAqS#*=j}Mgq;AnI6Q~) z1xdu0s17^y=w>qSPP`Zj2=Nu2&Ql6RpsLI@yR7jpr+j#%b(rzGW8xJzXFNu>CF6sZ zO^0H1aieH;O3xDD%N`Io1he`~P6e&zagaU@T%lXTgOY)^w08EyM zHqZfy*R1;bc=weHilNoS)WqeboisF6C1s?=RAuDFp67Yq#taRJOrbI+Awn5bGBhA6 zMH5LBib`ZClD=zgb^q_@d3X2oeDC`W$I)?g=eE~g>sr_K8_(Z)LTA8^Lfk-#Wx=S- zJ^6!vS6)YEU_FWLk{!Uqf?nJv27I6n zmCv3iVTAE3coN7M<%4njejESdWsRMqHxt>{k&M8D2#*qyx8O;MN~wahx?z*HUa&BG zF(9<4C7>GhL@aMPhzKVkDJjMC?~+oVfl&d*1NtQ?MUO~I9RwAAV7QRyIs5J4NZ2U% zV~X7DK6o{rq_(5<2_3m@ zH1=T6kgcfN_k$~C837f_H-^3fUu7wRgj^U*A_iYqLi1CarbKk3+)mhIww3Nq{Orl? zhI}3dAi~Z%+$T*ucj`mmti|e(5UTu9;V<-70!?NPJZMF(@zj>fS)a@9nd~#Ku|F7^py_?KI|E&t)&xY;vZQxJp{dRVJ?m`K#RvQt`yt?o;)IO=e(-yygNq;f3_`R7!QigCd5n-YeHn zveT1KxSc>y{8H zB)*IjGV5AP8lx%g2!Cn?E8M{tF@u@qwMr^bz0H7w8sY`&9((JvI8?Ol%6#~JEK+yJ zRr6lQG6%&8C<9Suw|NAt;?@I9;sd<;p=itMY!|uepT?pWM!R(4if%*^r{sR4Hg*!$ z<_BLNDb3q+o~iie?S;JQUB}NCK7NtO7hzm`;CU3YJn#oZ{MW5=qEjq&Fx#Fs#d9lB zw*l9_L9X^rf6i}W;i5V00xL*E4!pX@YyVlh_ueJ~mHa5h^4fW$$+JaAX7q&C=@Ihx z=c6L7$c7}F<}6gWajgT<^jIS5r<2N~mk#;%pOjB)YgCmIUy#!qe1BUo_+h`@;Bdg9 z+xtXLyD-ay!EARimeV;A#P-G?r_d?a#em(0_qK9l^1+656ki+@+fx++Mm-gM?# z8-r(=%qyGwL1GeDB0NM&a+}y^mkz(oz6&f4!suk;4gUT=QN~KD7&W9QjNh~CmU*~U z+gD2#eLo=R4GdZt?PP0Hl^cj(1WZp-<)}{yA5COh&|N8yV*_rE(NT%uR3N|(A(!xK(17b}z&dwRxbOanzr@8WG zgYyY>N)qarj{bg*G{P`Y-Yo)cRnKAY;IfS{$%YvSlJtu5C9zdFhIaO6m!ZvgbH|UO zZ{`m4+lU=ZU0w0*13{AQD{uv<+BpqiTuFHh;>sDV{$wTWvOje2F7_nLXWpFxCjNX?)P%JM!vhGUggAcn+YS+4G`k|n(fw-AehQ2 zO3YuY3Mnyv`qU#V?P9TX_FWMgCZlIxt?wVAj{+&0<5Ip1B3$(+6>DUm%<6VbC&yw( zSAJKbXK%7tV(Y!J&pU=`kI`6vd*>5<13Z}nHF&bhMgU}U7-!gLJkMizFyGC6Luo+k zMDgX+7`}_v^1D6F!{2uzp`tYS-5Oyu!AYdw;&5e3xfmy-{^ysMVjLPuy5A1QGi!GJ zbc6GsfM3NQL83}4G9t|=&;%p}zmbXrX?&=^+tjC}V}~5o;2r)2&WZgTy0xBWa!`#J zjT6&JE#O*wpCPdaDYi9L{@={kAV~YqjhtR0jumTKHY}wKaI7EztERh{)zYNssm1_y z=}|g$-Qql*XyM)$xu#6b(_No+wZi4Uc1p2Rr1kit7u!n{12`4fP!~A&$ z_SEL~&4``IL4EtWIs49Woqh*{GGpytWpLX*kHBpkC;)3l9x!FggiylmwMUwG6ZY^f zQ%xP2k5){sAjG+X=6coZq2fjv1cqc$IYlb6-5Lqy&XJ$$JciDRb{^v3H=E#cukz?g zd3O`2%&1`Od_hqH-^{Yzpb5%3Ko((>lS0b8QWr{qQ_o_3+Cn-2lM* zp8!Njy|?K01*j8~Pbrwp1?0_uU?GT#kS~1MJu>>jqjG0sb}FrxvQ(355TRdjdFYV3 zqvWv=u4Tv&w%CScnUJ9sN6AP|1!cR$nx3td9yP$$x>Rk&NJd~M+U=^S+NIG7*gd$-$r9I8I~qx3o_U3fPCg8q1jn=fZHXh zT|+rZ$?A^Mi+vM)>}~?=Cn~PZMRFM{fYYac2pBAjMp#yb5_<3R89*1>)H1LZ8y2Bq z=1s<-4&TIfJo%KIAQ8~d%d^X-@)SZRWz3A&AuQHI0tI4+XEfv7X+xsRN=Y>jCx#R` zTSlfibcO>$8D*h+=!Z|ZVFekCn+G^Xf2@XVs}}tqDQSRm2-t&Iich}r<7k{R28qK_ z+en*eCrITiQmy#^O+*8O>ISXIUv&`ErMzf02;9{FCmI?$Bs4T|l#HY$G>8DDf0xks zCYaayFA^HTze^zn_Z-wV_dX&H2)T#&c{}>MhlVaZj1yhe;!=`WXQitAtacL{wl?H$=$n*j**HFuRxjY zw(h#w5tWA#ra$?~>7#(YTHeEL41=>UQi%mNix`fP!W}TgrGWInNR!|HR-JbvXN`MT zfTmE&xBY8jthj^XH){^YwS&3}(_xHbKRADOq-p~YsNHPWT1Zw1SOKx?KU4^kG&i{p zq|^PsQX$9!3k@8@z@V!5RnLZOl=y2(Yx$3nQrC=J9P?0X*-4us1I6nqmKgmkkbnLm zcq5~LZNVdu0y0QFjWvD7xAu1Ytz_%5t5SKpv+~mphl`4CUZA}*dR_2bY)2ii8m@>Y zhs6*|7OAaFiYdnwbX<28ETMl>Vc_@Kd$th-Fr$=8LafW?EXM4KS%G7*w}s^{JbXEc zN$jgnBhyh302gt&g!Dte+ySZj7`VbK2fM3U2Mf-pK^mpEL+eb=M8B^6l;OW+TfdWU zBp<;)xe9I(aaTy}e_};Shh$eDXFXTpJ;)8Lyfq%#Wq*PIz+b?NAXTPe z;DlivQskgV5T&PIL7966VNw(qv}4Qhrg@&%XzBdT8$;CP>BqG z#l&__?|0KNt!l;HTEUx_RP*-yWV>?uvA8fY#IWtJ_R0_z{iS@8ovqCV)Q>2s7Z&g6 zs((1^S(7bRbLr8kUPgIvV;(lhjoD!oWnhn4qBO%&!=p~^o9h0?RyG$NsT0r#b@?5( z&fhEJ-ScsA&x2r?tr@bPLLaZDXncnve92X-?iv)}*eo$M{K?6ZJ+DYte=lD~>V2(y zje0H)$qJl6DQFv1t0;8ZP3+NvZ^NJhPsO39W5Y|mBikIIM4HvTjfB+@oRfiu`b9gH z()j#gzR+6&Nd*ZF+Tqxz#T$vi4B&q8H<0^%2e{oq_5&yrNF_hI?`R;o2N+dfO2T)u z=$Khe?z4**7ge5d3^6l*B`Xx^L`7w*PQ#BDTLFK7mjvJsAgyl7Mu8`#Rw!N%;nyB~ zVf@6yhhuYB6d0e&=V&zHcnPYF12Dw<2}DU;Pkskdc*}Oo-riK6uXtr+@13eF?#n~( z^|pT#LD$?#+U&y(SV8q5vN{SOmCF6n+WYrwJIl%M$GK@~?w7=AyGbg@yUR;DOYYZ{ z*U)yAQBaW6a+a!(1TExPa8{1&FJ_GF&g~qZRi!hn++x_5`lzz*r|Y4^sf*Pz;^pKR z+aA>j)LJVhYlqM?nntn>$L9jaj7RqCyv9_f*-<&a927Y5Nh-}asa>-}WfrEa0u@_l zWz{2pjxUe~^dFSE)b6?W_0=@(8R45hkf-EzT8G`^D=DQe1}(5am>n881Ek-K>qPx) zfFY}b#*+#!#PyMiAaM4-MY`kxRqX#N(&gbv2E%`DvyhVL`kyw-zeE=rdTjr7bO8dU zzxP&1Ds=HjBmn2}|ENIMc4q|$bb)<`U7QusFhgcoe16YGj=wFezDcUj(uiFu z%l{H^^yeaLo5ER&XH1v97Yo)H1ds3*nF!#_fgz|{nqGyQlGuJZ3(9c&+w4YCz4g zv~q4#Fb@rVZx-L%ke>HmvTMhMBQTQ~7IGE?R6iDJ7}+c|$?8dP7MLbL)UMnsxDPGn zb)Vwk3Xm^NlKg*!u!e@-@T$&%{rgOU{mI!e@^y%APRg2tc42`s!Yo@J4the zSli2Wop>>Dv2>{?F*$DMTrhnSt>OIV%y5~q{nl9t6eqQ}oZ zjB0TxWtWTUDE+dum!I(w45=VJs zuBsxdM~&#WvmXnM+r(v%huW9}1ivn+FfELm0TEDpTJsP8lG-s#trSOr17Gk(WzT7a z$Y6Z++1Tp^cc^kSQU&>fxS8C=Z7Z;3Y@i_yFn_@M05k5wO~y%^BTW&lplPkKAF)3W zT6PEWKcm&aS48uG%{VD;0+BZA#2&HBB$zU%L8KSeUxR8IDI3ki1$MKKCJYQMNi9QF zexx0^)eVJoL+7TECOap%k$AuajlrC@eRvQ00`{vWO7;Q@kGiTVc$PQ0!0}PmXv-Wo zXWO3Ief3A6Ej6SGg+(X)jD{iY{YWh+Vj7)v6t;pPQtFJzU^5$h^8r}P<7()54Jz>E z@oKOO_b5-*Mo}3kj3AJ2aaO4`{39e8fp$*D9-7TmIhv-#5u5FwD2i4;<2%_ zU!-MJysaJ+!>wI=ID&serPF5MKutqp@haupqC}Y10O6)^k5d)Hn$%zsFbv|1kCKYs zx2-PtZ3rv^1eYC+|M8fl1Mtq=Jmk=Rqb9`cftU?LH=CaL)j4U&hVOo4qsPO|xwjpF z>oT~=KV+A`8||upz7-_E^W4e`go=-&oa2x|SU@%ie5$ zkA9k3!!PYjsL0Qh`kdT{QN80J%rt5RVdfvb2VfT_Im`n}tN!8WsU7r=5{`T2&d$`b z=4#h+4g`BErns!ECOn=EK%_rBLlDojRHV*|6*@(@5gYeWl)%Sw#luVf7iTZ&IUHht zG)syT7}xl<7$;l1HP>4*baDYT#!tCFbG_!k>`TPX|JdUt=Rqu-699(ZL>Hx402z_W zvvl-z0pd2DNq6ATYl^{#bhgfy^0aDty*>M$f^-R{M9MPOv|y+Iyn)r4 zam09&d_0{u@PxK9Ai|?dlaHQ`3$_ue%yM-!#yo$B}`qN zukAJ6gKB(ub!URn!p@wRegTF6UO9M{F2qKI2dcwz> zrUH6BJ$Yu;i4sj84Q3U5cgj4U-{=W_EH%5@1lV7(o>!n#Z^>(VQD8!2;S+_&$)Js~ zRj2#y&H|}&ulYaLjN5CeaQ|c}fTYI2*ZLxCL?-7jil9>d-}3s1%aO*p0@sZAs5ALE zT?+6YSo~o%ja?u}A);?T+y$>->8f>kyjMZsI6JwCchd9YyE_JW3?muil(qL|UR;-e znQ&O>@H+r;wa}&bt-e5tvMF4juq>8(h|qWLBlMNgDDbSc98UE{C?-m{_Vf83oAC-SA4iQz?jr359L)%fj& z!Snu}5+Q}Eur(*frzK|+QhW)6SO%H!sxKx3@d!O`2f0JD;w~g+K7*5Ht*8TgPJB1- zprw*S?bT7mKx_k20BaXOyaYD8!VhqLG7aQN+rK} zQrv^s-1@tkx`s!&b!c7A=-ctpZ%{i~{3!!!x95t=)0+ZEuW!ZFg65W;YrZ|Pod}98 zq+q_OEX2lp%I`#TPh=$55UDt$>EKA9FKzm>HGJmVcLasg z_I8|MmjBOj20$EdCz_=0<*!6jXS6ZL9Sn^2{|sd5$DiVkDd|3xxUu*yZE^2|+0q-^ ziKda||5kY2=Ex9f!8fLrZM!;pPh@*v|x{CNNQcfQfbS>DDjdW=Y z>gUP(;yx&+JsO+K+s@ZJ@IWuQSdx9xQg4T1d^J5EwJ zeshsZJ>LE~fI+wP=MUd0@XNLc#lFeP_89G-Vc8k5l|PaAyz!m%REVt;Yp{!h+5PzI^T2LLm0)Rvu>Jb;(jHN|YB zi~EV_V%$eEkUv0ZkZ_j3P@~#*Ha+nr#OAMTI)KOFg~-K01j$-*|&j1;W_AK};!m%@i5oSZ&mZ<;gp{i(c?M^jOa?KX%D~^J-XC^q_RWyVXSt zum$X1Y}?&;2wzOsm9DXF^dR*{R zl@QyNHk&<7z^r*p1M^CH5T1^VWB|^T3WA+1$+z@^4RDD#i$MgRLb;XF*URjO^)QZ)E)F-?UCJEc6A? zXyOn1^ih;~3@s)UFah7%l<~shSecSK->#e5X0&4MbzP$$nxJ_CZ`7`Ex=cz~W+xW1 zNBHSXUZbFz$~rQFY3sX39-p6g@dy_$POv(0oLz1q3mL-k-EXKm-c)i){52ZmTmp8v zViK(pDVUEA_fJ~F^^US}cAJZw%7qy_PsZJ3c>1LJ4C^#?WZbjp7>TB>xWkaOh8`K1 zU9U-@0npF>OvfgMALlKUtZvwJ4Qk$2)NwuE_dUN##U=0!y+5L_<*NcZCkE1}Q<7vD z6g)vshKIscOjYs|fQJN|<~P!9vcY;_kyP8bY4~+^Ww7AtAT_6~j_>m@mx=h@W5$tf z(##m@Od5CLZHMce0xtGnB=*Yxl-Qd-J&~X0dJ=7bpd+o~5tsN+ z^M1f3zD`$ptM#yoog%lT<;)es>j4}SS$FJOd|&h=y}ZJWFr?bEBE@7t5)V8gDHJK6|ZXG>iZ?z(=TJBi-DN)Ag{xKFv+!@JjKz*$Y%n~GMNJFjQUuw}30K>Dv14@=k z{VshQnh@|lI0(kmAG5?fel=N~)&00(!GPOCVA{4#Tm_2X=JDIsN(1;OaLZYgg5BUC z&HViQNV$*Q*w8lPd1yS{#cA@fA(jf0@t;>csav1x+3&$v#;HC>ncN4eFtX1{v-1X< z$C@r$9nT$n0asIwxzN^S`BI1QG)!~FKc>}Sr1cv;po91jL`bq;myGbE)9!44kHZMR zLO5-;rQ@rZHPox=ZeF$*{CD0~yh;MUdiW`bIR0Fj0o>Z8%KDTWh=fQpnevMSWpPz* zE50g8SKFZ2{iXJ&g=n-Wjn&vstba}eZ`$ZPPZ+?IN#7;kguu+Ch%G<(YX zh(xsu=Yz(JO5bpnX~Q=Y?w2z1pR#rC3k*;K zpm}28b52gFNz4zyDbP-&^XIMT>-Tqt2e>xz-jtv371jD;-DzXSdA_Z26{!|^Q6ODa z8Mvkn73;I(+84|%t`k%pDGxJjM|p)$^yzRrT^M!lFC{CL-(w1Zla9RL@rB<{&H1?TBQGF370BZp;p_(_ zsJz^HJVFBfdECRi+(X>M{lQ&w6k&VYDf{*&Ynqf>I~4ZZ*S|Dex{Gp7e`8ZKaX%Z^ zX^gq2>S<_;0R~})XvN%-N2O=safiEj=IgD_O`h?~yLUO@r}Z!Ie(>`ec#qyo$fA<0 zTY)T3;Wm-`n}!S&r~ey>pbnBaZL`R4b2`xSAWaSlHVV2Qw4o!(oaUi>Q&>e`yxHA# zrp~NqWKi-Vw(>>iJNdtiE=O?eO z^f3Gw@alb=>w-Pv`{Pwn%JO*?Ka5>57^bU?ri?W;HEMo&>#X8K>Y8)QCTtI_f8Nv-Iv%4b#GM}0a%x+uliuls4bFSo58@J`!O9eh#EV*V5 zEOQ?Vxln?$Toa4{Gt7@LXUD`J<47wyC4tYG%QkXW;63ev9;h2lW_-=sj-Ueyz-!v7 zBs*WJqZT|_zW5MlrIQxm6c(-hoIKjiV;K84;TbCD`lSUk1D!Akf98qFmZ`1W=JETg zS&Wwm62X&_@KRMklkDabhu(Vz4|plX9hz2d51_utU(Ga&F{uOA zdjObIM8ZoY9fW>3EH!?=#_Wf)yx~C^4mUI(F${a>bLk!d>co|x&rt^0PmkWY_0}!g z5Q@J~4V6W!5&QYh`=#XMmi!cv8dJvM{#P~GDS)g)R zh~G5KIV8+c(>cr?4x`Pn@r9Iek~ryol5+bbWz3}H6mimU1dU&yXJC>dwCEhe7armV zF5?vz78I%|A>rce5#{3U?d%s7iSw2T^YjA?Kz-Hvh*8m$EtmUB9By^qS-5!{FTU<0>6;7 zJ%(P#}s* z;ixAkW8jJ7^&o>FmF#a1=%GIs&{xlJ zSo6~F&d9xB^X;uqqixMB6{n1gG*=6gJyNRhe+RBlnqUU#F_R#efpvf(Q)Y~Lcbm?T z=D6gc0Sk|#&wK=Qa+$cE5l@U95|aR<#skg}{9cL z1OUVD<3i97w}SA0;Hv>y2V!acJvK6#(%laYa_tiEzUWACVb{ol=uI7&&T7s(ErpTD zu$SR7ko`7!j8Zg1k%X1&njseou>8QM`gr8f57AqR@;p&{EwZnl2(QYMut728{v7i| zLQjVo#BM$Y5Tjo>0a7795;&rRXHW*cDvUDc^2&3E(E9{-Qin#lJL#Jc?l0i?Qc|jH zVGP!ReZzk^ifyZ;-WXeA#@mejc$fA}zC9oL`Efpd)=V|BrxW1|pEtE8j7KW+i^NNa zK_d;2EyC|ptF}%jyyowqEIEFyX>U!Hz-c99N$VqC?2T`pRLWWx<2+wHK27B~vjhAb z2{se{wQa4k3mBDOdh7ASs07S#cZQ!6 zn7{uislnin{qWu=LSc=i$Z=kMYy55t<@pk2Fbp#gok(Wsc-&;ol;ANc!$=AF&frXz zJe8h`(nN{gL;14v9Wa9^$eC?65fS%&7%<2{1eua5_hs(`J|<_{sqzb%X+rDqd%5R& zjPcbx?6Il^d={Ac^&t7;>-Odt0}5oVeI+d9R*SbTxV8?eWXR|E(;g^tP+g}eE9%k1 z3YlN+d|^B(AM)~T^|AAfpGZ+zLgGz`a$ngt#WfOF74K_Zut)76x89l_voD<;JDO=3 z7rLBtY_Axnqdk8B=ps62gRsg1Ok;oqB!YATf=pvv$^Fx-u*FqIPg^u0n&5X zl-%6q@l#RDYeE3HauXM%Z9~Ru_lF3AG7fR&tX5 z$FyIo4buZx?s5&FCKWGHl5A{I#wLJ=s^n`uaOdu!#Ho1^PCrXYj*jA?V=}bqmMh^- zD-15;+GH5~V{kkmasvS>3{*cA2kwXz1`m`Pn@->^>BOMPnk54aX{=7sQdE}NZB6dT z9xE#MWc`%G1q42OcHk~hSuDdP5k$G2Yn}tbSGrDe40Bl*-1h_))(}fFI}nZpWfMRGAxcB&e)r~Vjl%0LUK^z+LT=X#9xoiwCLeBP zAMfT19p#o*Nx>Mkfc}e-Sm;#&LB@p+>72vXpE_5gWXAf*AjKH8j?~GNZ$?Y!>>i?y zP~?qS@v+{#NmqphDHudA&IRfGyd|K7zo4ZR#%Q%Z&EZ?@Kv$1*z~Hf|-(S8O5vg;o zsCajUc_k~ZF5>}+8d7CJ{Dw%FTtCH&0t;w_O0_3{Ji#T6q<49%az4zFa; z=#_fR468iH=*uIA%^g)UjwbY#P+ZovCLg@#JBcdW2PrgvQ< zo?~DGVAO0EP{i@Qdk>#4DEPPI(}h!07s>+P=P*}~mwni)C2e?6m$sZ0mJz~2PDod^ zJdr{SI88_d9BDUDKPUC}~#{}eJmYlRzlv=g|n75duS5D__(+JqoBC&P^9Bcd% zZGB;hYgre6>K>&g?|t&8?9CkqDDuMk%g%TWnD+y+0Do8T+U#y!tG&ygTkz7Jsn9@K zic_LNE&B@uRhU!OQNr(^V}CfDPt-PYp;h?dTG7b6WAE`Z6Lp=R!7&@3+~`cXF1dNv zP0X~6K6n0}+nQu*{qqrDbKhsQ*j1QP9l%EQ?;!$7B;z4altz#$BuTPl!U@xxV(>n# zq>KFDAtWvVvuCZY>vC_*qt1)2TI_4vO-3yJNW*F80{+v`ri!u(tWHT@=^jEV^SR4%a zaD(0H)U&cCjAEV(O*X>;{Nm1)e9jgE3?Bre&~_{cOqSHh6;c*LrvJC+t}?}M?WTYA z;%VZyyy&Y-PmZpfu#WtfxhrYJOY@j8Bbfv;VRffKI_nuoBybXB_});vJ}uMxV)gB- zQ}a~%^^BjjaUN;_Zz7g z%;)E@dVB|l*0!U4=E13K!kVqikCgMl4(__4ws{VjTxuBebya!P9|7{>Re$El`!Y^A z;zY-g&{-{YuIQy@sa_n`0K_818icDB!9EQbKEWh9hOB*LZCN~fZLkH z;A zbjslm;;36`Cw>TE6c<|YOfVOEcRnZlOTaHZJeY!_%XZn0 zz4H9F+NoX4TTRhsXHydU)wT!XPWIw>Ij9G-8DJb|0KjdnkeUYDBj9Ep6Dj^L{3K4_DjnQ<^`!CBUaax@J1}AAAKcPn-yeF>@Zn$sQQ6}FSxEeuO!aIe@A=;5LW}9nwWo(O5=$mrU^Qy zuF)j!zAlaCyfMLGJELf-8}Q0vitnB@=1S9j3$Wsj-@uA*3pP4e4PRW!n8<&b#rcj00CSYE2mj)YTe^QZ;JfNPpO`o)XGRdnl}5HwPr?>?U^)4 zD_pQhwYCukGdmEJ8sV{wUy_ECh-~;(ryw797u5sc* zVuvX-K*iaij_oEmasB*k-InlBYc7=`K0EfUTKXH!QF(6-Rq(rBGsr##Gv)52r7OWU zJrkzC)hk?=!SVS*$E!(JT50EVd5_!&chJmSHtQZW0~awo1J-omGD_=mELowvH+!vL z#%>Pz1}}@vHu?@rN35r|Rq{l&yAFTT53p+Z&&WO{g@7lvT)zK8!Q<2IUo#nWu@1YC z6*wFk|ElN@qPvi0&*~Y60(hZ|JA9N>T6N`t5aXJM`!=dko@+gCjS$e7!{-Yp*$0> zepb*-Cg&Pug@hA3^)}a$PW@$!VjJn6Nq8fn=0T1XrKEb>sRMF+-U$(3W}DONqLx3E z?2t<{sH@$l0%1&wk&s#fqnAxZs4e6749hTmmWX)Lvbr*S(dOoW!X{|ESO1jXNTDoG1kUg*B}E>n%y@dzY&)9JN1258_XB>p5Rk*_}Qo#p&^N}Sl#v-kxRnX2 z3$ztZe=B`|`FULT5l-+GW}=AQ0iTJ3Le5Zz(JrK(Nr=^`umOQwVvHN4xp zUr54)xhhIMW!xzTF6O}pxgL&)uLa~MJ_ySEAE-}(RYZj30c!5QZK2Q}1jli^gQCp> zF~HU7B3`lYLWnM72ZbipRZL;UeTG#Qo9q|l(N!;RvT{9r5}KiEboQnI%peU?Fk3Ou zNFiMXB?4X$lF@&3-fY_EPeldGJk{`Qi+`e7lRZb~-TAAr^Yr>xXKbbH0q&xh2r5hWx-4kmfhSbV&-!4DLhQiCc5W zN_{|Ssgm*c32B=mO`JoOnRi%<+Ox6_=W(!?EX|Oo0iF<4cmGhrY=HIM_eZnD-caZ; zot#KH8`_LUdrRDEce}E5rLBcp6=6v5;|JT=U?0MY2tu-3BcKoT{UXk$BJyZ_@7!_!lpcBn5%bSNceerg} z)LhAsr+Ot$1Y<`MI*mZvMj?{u9ALq@U;wI?VxbpwHn|&^BvJ2=9T8)+rk3tYT1LkP zZMdr%!0+5fuFl;>I-XW8szI=kmE3bzhxo!p7p*G02hgR8}iMD32>>S%UVZJCNw{H{X91buM`3q^aApH~W}9-1W^3%p%vCkE}scB}LKFFxyFt z*H1)-$NAHV6^`K)V0nRVB-cN(>vY-R?a z>WUi!@ss8F(YenLQ$vS60(BG49v|dAMCaPqW-UZ1a9uF++dM*~?%)dm;efIOLsmlt z+H63_`A4a@jEezbi@YfFeq8Tq5dnqe(xgkV($YQHcJh6LfWgv3T^gb8BHbDTKlds6 zM7Q&uym7cyjgU&&oT@eENgNJru`1XyJ`dG=fA9*cHQR+18D*1jLAar zPDqts4Wu;6TLW>c752^@PVZ7rxq8wuo7IDN0y=0&m7ho=k7(4Qk+uLrA-|tC$~~0F zJB%kXFvQp0EqdQ?S~stAEL;Uko1KR?XiJM0jbn1x}vof1%`?xkFu{dkkc$k#+Q`)0G0B_N9T&;@6p2K*|)-<2tV zMUL@3o;_!)c!%JTu#TnrOe)9znwon%$n?NWpT33{8EM`51~kdC#p5pEO;26awiPq$ z`U+&6q>Gd5oZrBgm|0t;64R_j()!JwgY#ql5Wsl;7;r0G25U^By`KOU4}Y3m*?X32 z%Bgh-+AyNf+SDnyybgX2axiWz6~ejloQjYe*M=oy_`$51bd;TU^Qf#Z`pI~6SSQoB zy5bEnt9YOy>zN5uWKC8uip=CBQK3>=v8F|GJy&kRCeJ_KOb9=>UXiFyf1@I@QLB$X z&oE9RXb-R^E{_qL1WG63-$=9X0-IFKJCZEcE3Y2%HLTS}MMKi~N$LH4cj&WhN+OsP zF)+A_0kJ220Hvsa20rlsaJyww5t!WZ;@CVPw`@3LY2|2$!Snlb58cQeXJ)YH5rzRn zZ}1KQlv4<7Q&QLthK*SNnoY+(rVp`Xi(%JV47r;#LV~3=XjHq3!WM?&O4FUeRXkC^ zvtoFXx6We?&SSGAk)l>x^NqW>V&<5&4;+ziC7=3aG+aM^?Of}nrL&V|^<&3irdMD{ zQ41Wlg_9_)lY|?7*WX^B@Q!N2I~B;`F#Vo4E26)w=`s&_eM{SGq^+_GV;%U*aI;;7 zppaB*FkJD&V6^N<<<$8?OfR# zx!QJJm6T{N7$5mnS5>PUL@(b>3~CPNR9ABi?8Q2+g#VQ*Pf~`a+t{iXYf7I>y{&+$ zkE!&?Fs$VrGP^1@d7Jagc3ssW4!ji7PW^Y{MG_4i7yDkTbI|;?-Rv#4PC81c3>9Ze z7VQV2Voe<1FyI}S5pQlHfn1zqp830PN{W7pSjx?S^*(O0f6UuS$QX}<*Ii5E7kJZ> zle|-pr~ApUpDP2`#{!W7MKA>XCsqk!5b>vzy@zS``NE?8welZ&6VTn!D6`9vy5MC0 zYt;;l%1lNGhn?VLHs(&g{~!PznI1(h#UMV?YX{&8Ge8&{jLm@i!{%zri|;_J^%>RtxJTd=E!OO5d{Iez;Z~;E ztJ*CQ!>apM6_;Kd(fe>Odz@N23Gud;k5!+-CPOI1eh}A%ROwaM1ZmKI|C0K^XwBu3 zlOyz`RLzA`cX!G>M+?tB$J&sOZ};U8U+g^bl>I|z5ZIzkv#_8K5%vO{8+`kM1TemX zaL`bm%Y|#W{du05(~S-eA%uR*l)AYPTuPihji=X;f@ zG{*yunmgK5Gt<9V^nOzaf&~*)UiGh%W2@GerMQ)%Frmu2?%P=VvnD#9N0i*p~!!?5^yv)YeBCg6jAAFYHm2?Iu_<8nmxc?0WwV9TgdjO(?hr=;;DP zRtMpQwaBiO=JS3hpHn>45Og$#|0s%@$l6iOa63wFG658QT43#rjpjCmh^6SX`jbCb zZTH*8ic#KngCjgtF0-Jh0+AHZZy%`d8jNES$JqA&g}ws9SO1xyO$XU`zw{}85wtNW zU(SjYHw!WZ3vlRRX@%zQB2^XdDy~nOuSN9jli3pK6btS#t4^^U)K@9M*gJsS!GZ}@ zsRybZx_L$nhrMi4vt!0+9(e20ZWInB4`SQazef$Z2>3JsS7Da{_E*gTL|w*`hUL}j zfZ0;cfo#puxrHoO%hu!*w68wWNU{WnXJ1C%7m;5-2c@2aue!uQpAZ0z1^6~!$-U$* zXe1m+j;lua^*Mj>>q8okC}Z24<4QbiYD=;Vr#=gEH}WPnDK9X-s+G9j)Wdy{^|d8% z*=B5r%f1CGrje0!*;i>|OKaVK!qvaFPU!rC^#fgSki zxnzPUl=SoYh|F8R0AylG0dF6U#C9ejH6nyYBZ?$7wcA|Js* z>4zh>XB|>BLP1q7>qLx8=vK}CNWLgmk-qnI{;cIpKT3StsoL*tp`Z73g{~XH3UwI$ zm&p2(laq{tgd-69NickIjJc1q)Ovt_w4rHf(fp2kTYh(uR2L>i%1g5Z0k{~aAy>(! zBUx%i>Z2Lh18=S}^RsOjb12jDCx}QtFF8jMn|b7z(MKVgd&nhB=(fNm;viz+@#y#L z7vKA3{YoAZ3}$UdR#5(*_sumZ-yi=2Oc)Ye+3?- zv`vw^AF)WUN(%1uJMd_M6U%KV{X4&qeTktfc2~^am020n7(8&Ri6b}C+`*P&d&b;X z66~@+I!-2O&};|2yWiD~|KvPjH49MPAa>-4Vk%{r0h&42gWz=}32qIfUqoHj?8zC^ zY~xCK%B}uDi|)+rou@T#t1jGx$;8QEjQg8ykSORYIg?4ylCH5z*~gk5b>QmwS#GdS zPd&0xz+_@**e`H5(TQWa&|&FvT_L-Q9maD3Imf`w(h>l311UEPeB%j?*O>D4`vdaq zIuq|-;qvJxT0UGfF?$uX9B1Mxx)<4>?O=bB&W1oqf|PbRu^67>LOZMzawwZIj(k)h zcpi(sbzEB?@r5twfP^|5MCFwgMiWRLn%n0iLGYS+?ZNAY((Q=F4s| z4$iNUl-H%n*bD$D=YOQpi=_wI4t3jd?Q?tJ_&_61ggp6%gA!wtV8Yf{Q3X#|qy5vxxCkFl+) z5?_DI?CbHJqfg^^zsxx6HZS|mM8!Z7hT&gj4?x4!a;VS!TJom)@Jwa#%!k#+3l zH~aSKjEOa$z z9CLRVyd5X)U&b1q1TA$^kYcIESkoKDwTmy_J$p8Ka^Eek*6cz>ZLRav9o!BQ5liS- z;v3*Pma)JPfC>>q6w(bRK??}>%1z74CLx)Wx!0U;o)auC2CnED?VCOGeTqv>d(_kv zQH^v!^l3p83l0Z2L#kQ@w#FxP7r`?1@m&SZN$uco6Sy+ky470R`l16F(=K);=8>Pk znmR^+HN|VVeR=+tw_|>xBBx_9(cS9!JStSRl^nmGT<1WTrjm7?U0ruPBD`o~)0N3^ zt`mlgFTVk2k64bzIbn>TM`!FB_W$TEe)Qu~(0)eEuPhN8m;fiDO9AjmR}L2szr#D?=yWrix@7iy|FOJ%Ut?(dKVlY(vlM39yp34dy`R*Q%b7@RNmtaD z`HQbBx+Oie||*1Pg9(3%q{COf*R^0AAU6u-4tP4yb-y-NBN%md1?Od!}EQ9_{y^sjs49 z|J((xV2cPxn2?i|E0OD&Q4!vK?rs<u&L<6ws*%Yg^T*0KWM zU_k}fT<8w+LdIG&M)kRHOJkm$(?7Jq_IN}r$jYh)WAWHTiN_^|yhUA^uBAA)jR~Q%TXM1~U<5|V8p+PkF z*HkG;53a!;%x!P)U6D&o`q1aI)2z^xSN?O_a}o4;{hey2uMPoVgKsnld`-kqH4R9I z7A^7VVoS@L?)P?=f80M^Vq4BKycLqjV;St;XX5XM0_VW`G-6w1VP091+=CDn)PMLY zsQ~_z!ZhdkY29~ju{)Dw8>9yBvV7o{SqQ9?|1r(H>sFsT_-?~_@ZF^Gr*jyR_)}au zLV*L(iSPX1!Jo>;Qy`!2*4~L!ss4^Wg`C)^!Kq6ipPjnpRo4)kh6xJWVXVio+~hTB za!qY$_a5P1y$DV5E`X39fCoWlze^gbJLj^ykd8(j_TM@h*RVf>SsTsID`!Ue zZ$8LYQN5){`Gn@qo}!)azTCK?#0TyM>1fzTBC!Qg%(`Vo{$K5E_-j3ALm`h*G4F4VNz zlk(eo@<;-MJBlnUJt|3(Ao&G+T=t79gq4(ZUQ+|pUu!_sT2j(O13IH125}yw=6#SM%Ky3u z@@G+3qzE!S)%~jo5)w2CiXebw1B{(MwhjFRT!55d(CV@L>CE$t{7ZXh&nF&K;qi25P zs~&sO=2|CgtWt>aT?Ef+5D7+$ks?{+zeKA4iC#y1dz1<8?J{w72_vtTdh}I&52kok2Ekf?WBPu(&1>}?ZrVWgOsxu zwnx&Xm+#xqSED!Wj`mcGaB!Nwbh~oW4U4*$E~4SprLGRrC2!iTSV%UOnD`ismfFBE z?KFp$4_~p#JNVM!b@?fWOIs|X{}*j<0#0SWwvDfQS%zhvBV;DY&3P2Aecz?M_xt_-$FYySpU2kSTKE0C zui?DT^So*lE8A`Y$iEY1K)qL~?14vkDi!o5-252$vLS?X2dzscBnz0f#fAL{N$*z9 zh2)){;jTG({SY{Y2yBW6N=gxpS0Vs%r@0Q};pHBE!?C{C&v@UhxQbr-mTwR&R&-B0mZA8!J(aq9kHQpu?AGxb#G_*r6SR|7gg z2D3GQ^S3quUh)R6j<&y%{k}7~hNRZn_mTVPGu>}@mZ{b_R_|m#Ex8$O_5!Y>Yrq-U zw~qefRH3t7)sc3mI%WnMZ4GeHtxrvui}{T`5`8r{9R>#q&X-PKmmh>3ws{*gymPy0 z*J~pq!){_HvHQM{1AEU27YdME%maQ8^`qz3&1#wnpVr-2X3wlnEnX0KJSmLZSNnT` z$;^rAcoDH95-nsaWt#RDl@I1_Q{mXv)$T12( zU)6VGM$*jbj}M?GsmkIP#~mzxJ|aTK?M!JOu^M4yyMZz`1S35?5=iO`0bZcy7~o$= z+~tw%;~+Y#b0O7!P1)sVf1q%4eY%!-UlIx7F=tTHAS@{>Ng~1_sZ+!xV1(^pjP{G4 z6)l{*()#r)GvcFgE>re!lb0sN0rDy0BiD7i^=ZI2v>#2}LOgUJ^v>u>R2*^_qW)Oi zdEI#7W4*rsZT5Tl*aUNt3#IK%!Zt)G>{}3d^(4W@0f`1;P4Bb;PyNz2WOkKo&Y%9AhsnJry5DKq_VwRsdfy%q zr0M;8M8VT_pC4=Ss~H|{FRx*%Ii;d}#vZqIGblg%y7opQFy1R!#U89{l8?ynklvu2QwJAcKt^ZIU}bV=YwgAu)GZHEr|pd zteIKhjA+6M2em)I*dP{ELoE?~w>DD023w~MVag&PeR|C0o0F3l{JKW+&Gm)UWh+r` zB7e?(FpBYS0j+zRF!n4g_kh-N`VIBnwFMg(Xf1>Ka;p_fraV<%$x!iz%3G(MS>Iv^ zI%oe;j`6V8A|A~2VTv30C|%$m2;gZxfK=dYx}$8o+Ne)9Ktyy$-O zZdMwP#~tE?n6IL&Isut}m!5cr9=pRe`M!yM?wgFmulh!}E#-t}q$6%07Bvn>pQHC9 z_U`sCIQ>j$@Wtc9TnMR9^;M>2F+iG8i*gGEk5=z7;hs8U4**0Ewx+`WK9xnt z1R|5Si(Vu|0&Y(^aGPltQd5cmZZo|E41`kZcSdr#^yF@trYc-HNm8`H({Z^sLB5pW z`pfEz5VHcxnj6@wVc&k+4c>AXd(g~nt$OV2-8&??_Q7&VNNie`FH57JbitRf;SXUp z9K)8MC+2a&CPH!(Dwe~Rj3;v)+oR#bqyU2-%fDo1jpo{r>jzu+kCed0QnR@>mXB)Tm zRj+y4OFz_7`&`RbALvds+r7Vd_rX}0?XC+0xyqR8bV;an9QmQq+1trUj5^+@c*d&1 zNjY?8SRwR#v%)!}`E#0u`5y$e716CvUU@PtyZJM9f=v$ynky)i9=Q$3$Pgyy(qQ%h zoT6^P2agX~(bC)>{aJ%@xzT0ySLxAPuliSoD;!9L#UpMLbMI+i48!5*Nl1)avWO1@ zLk9v?m%F3H5%PdK!3j@NVT9~7qPKIc#{n4mHsxg_CeD*8tlxMKJ*kzAMLB!}2nQA) z?MMzHz)LwoKL9-e?BloqKC;Mcf$QnDn?!A)^G59#4;g!=AHF=AFw*_(@I7O#9^m6B zi^B2(Cc!?uXCC~UAOv{8?TCd=#7=TAGgK-J)0;3Ecz++c5+88=#hOw~(aFRV-6!P~ zg+O~_`VgGnT|uH&L9F&+l9=4bB_1EHK6|~9-~Hl|g>ob00UoydD13J%huu}|e!86E zDZWGFt)wzp>md9y72Vif%Sn66A=L(AK83QSgfY@l?}tCj%5R2ArUxgOA3Q{gpcffS_D^Az$#FjOe{ZlVD|MPJX3`_Mf0z**3DgO z$3Gw+Y<8ESvV(fXg_1*!eO@NBhHY=a#|}yFzyg;Pf7pxiZ&CkMJjZy0sXnn-7Oe*u zU#uv&5hL}3h&5$Ge{@;dIbDTbQ#_q&N6j(KpbV!s_Bk&U_^NsABwW8=08Hd0%x)59fF2cMmwqgS2HDx%bAxghYHVENGtG z8PW~iLcET~m0zo=bu~|Ro#7YIJwd;ES0y||m>&b`UbpJKq6xkTK2b2PfAWd3Ft~ZY zN@(;^M_Tkp6P6D-t~PF$>DRQ%bbJT-oIxHphK(oo?VtYSHg{3l1J!w~Pgb6bTXr?1 z-=idEJsyN)48R5d9z&E8gg>Ua!RvkUSbhd?&F5#gC^$~s9?!|`T$6o|9(6sz4qJn0 z?f`7gqAH8*G}pj-q$nG=LvJ5}D|wLaLBMu$#&xeQv0;}jB34a(1lGt0E5<0m z-v!Vm1Pv?@UoJkPzZ{->kK-7&N;H~3KKx}IECk11Bc)S%`!uD-In#vJrts`zOfAue zy+4OJ3ERuzJc$4%CEEj{!f$!_UjQ8$X4<=12g!H!`SOlEHBSq4lB#60Hl~QoCcA9I z*1@d=2hiap;`*`iUE!rB8RXsOzvfk_=EfZKx?)_ZE^NI=?0yXnEru9`QGj_k7rjX+ zF@}G_aDgH~KM};5sHK@M>Z4aYVt-_os;Jr?S4L zdNcp-NNj{K*@^7xC%>NGztO40(8c@a2B~^MGsHZCI{Oy%jl1Cxu)|GDtZk5`41I#i zA?;aNbH1e%6@+kSI$3z%Gx$zh#bsGE%9Rj4tN5_3e*i#xET4Y~{{WT`zQTL&08?`d z{<2neVMWo4wf>^~#DO^uNVNsX4}D^l$mas*LGCCHiq@YOCl1VAzvIe^I76%?5(tgv zhR?*7-DfYy9F%24nZ4h`xbEZ=YjBhLRsG6acUXD8IIj^@I6Vk8ts>EyxXsHYnE@?!as!ohD@#ThzG@4s*Lfj@Y+a|(H z5MjRtfA2Y`o&kkLyc#(BO6w?ddW?{zJ{G~V^iw5~uPU;4T0zID#EbRGb!7}Eyp$wp zo5-#ONdZNYfbZQ8h1eFZe}2T%_LE+_DZo@>RLaZHwl81q^~d8aviD?9AdDbS+i3XR|V+--zy9< z0GhEl%jr`^9#OO)&!OM0tEBqKH5O@YOvz#-x%RNJ4n}-3!S^8nUGee|QhXe08fYf~<(L>U-6x((LD% zr`@$PW_pW!0P3O*kz;`B3Li~Q4(N;U?WbCx#})PUR1A(wBln?;88`Df6pX~#8PiM} zh}UFB*|#fts%V8F<~o$&3>ai+NkG`7r^QxtdNrR1%PWX8Vp{yJrM-QO(|sJ1z-4>x zzmR_UJ6dHChwwoN^)v`9S#X62)riLue~Ghy@QT7ijynysYeu)mBSIfg^u9+yB=*I&*%JSwq>|C(kL|GM+T9cX0~yz5{Pks$hwnm-=m zIL57rmGM$ji6vofrO;Fr^QN7M&J)N~B)GFpOveQr;9a-mZtoL)U_k)bK#flj@b7p^ zD#41^1VI8=AI!@Xm{QIzXfRqh_&nkRSLvES#MM8cF{v(*0-3B$r>{3>BwPX4VDem~>ef*@JEP6AY~ zU_$VZO&GtW!e9@^{!-z;MQD3!VQ}X6R|^Lz!{jo2a$#Y1xJcM-K}3N6{CO3|>5aJH z4r!T)oazmlVWF$Y#kZvI{>3Vce@`#m3SIn5EDUZ4*pCtVkA)cjO)m^4D`sFN#;!*@ z#g~^q{C%ehfU+7iD>W#ArTjjMTK0g`)6Y1x8J?4E^#!fBj1L4d_pqpK+)9$oL75Tv z36boxj|%&uSFv9AeQ(O-&3l?#{q-6A&0_f0nJChLB`Ea55>e(>6ciK=Ao_EXuuX#E z2qTZcuIn9r<(Aqo=BS=v#Fk7RpMShw8WcgyP>?MVbw`$a)Ej0IfC<1-8%F$_Nx-=Q z4@!#%((;3V03AGs3Q1Urb->JjtajLZ(o1lV-E#9Is$POYQd|>HGCnCfeSz zVJMfYa<)jsIW2WE7>E!qfGdyRh~6hHGHP$yxx?Rtop6L)w%&6XkgU#h(UkqtX}*&) zPOR;&E}-klOiRdI!|fG#;MrG_sc?YXAPgwW(U?^V;NqbrLm{yW;kPwCCrcsMDa9rK|-|#BD5a2M2k4|&OTF*v|gnIoFlDOISXi?#9kF5m)^`5%> z2l;qL1&kZlp#IxSY8qq1+wtZj%v&64h`*7sg4srD=kj*PYi1HXelw(#$u zzmJ0eD?Hx)Dud5N0D*6789p-r3S~g^A~_TmY{U#^)Cdj+QtrNjcgT!gZ*A^viU z0uLW&a7P5EqbJUBmlRh+%sMCo6*(K^J_t3eD2D}c_y%-;5#{v#m#Pjk9Uc0~_p!hA zMx*1UmC|Qwo&^=Y?;ce=YM2MI&C@6>8^|#GJlTYO)EI$)%{gmv{z>u!#DOX>os0Hpi8pkfqRf8Lh@FQC$vp&xX>5Rw|*#nXp;97Hsqht^#YL zf#4h;F%ERK*}tCI+QfS5YC$%mL>HcaO!hr7U*`3YUntDpf^kzDT*p=yzRnhmXYJP= z;~LxARJxD5(Sybe<1f?G>U{`Uqg>T8# zYgZI94Z{FJe+d=*K2t!8 zg+CYUJFv%?3q&s>L-;yEFWU-QiKnHDEcDV+?|m+Dad3E^-+y^9{7J_QhFIL}$VokP z&+c}?06SdL*zHDDG>i_ zx2oFd^&3@S`SAmY~2Q2GT#zq(K zcZtt_Y85n<`%$^f?%{CFUlxHWCIWRJutkwY>o+uW3?CrA z89JvDBaBe`;3%6S4aMp_8>*ILj}x{cM(I|<@AD%_qKOPI%lhVefIiEFbm8C+ORoDr zvbWZTyl)X7IIUek)l$|S%9&=Pu?rvPPs?7g8^b3DYY^cnHCFhv8RReh zLZ-27664Lh3blUSx`~uU+9xGd){!dxqUu^!u7Yt}v!4dzxiw0Ci1_es9 zrxsK=6iCAYKP%5L@;|`T=CvIz3Ac-vi+>8lyV58J(%4PJX*`uqwL9h zT2Z@@aUsMLk+0}VN&ESO3Ik!u96-gj?trIv;?vG|kgv*j z%>GapRrVQ)8;J>(^FX6%8qymFXL(K7(GM0QfW!7%j8F|ZzmAS=+AThyi~Ty8(tfLn zSa{=ez}z}=_=Ra=p;9>T?saVh4+}r#>e7E=4ZyqwgBE*YA}Iz?Sd~*|@Sl`+t2)L* z&A$q{Sd4b(LXRJOpshc6^!q)f9P2Zax^#ke1@*~3O*btd1_=^`Tj%aHf@T^))Ha1* z#m1ZtIx+e^dW!^3#|AXW9O4(>Qpa8yI1m?7=;wFxMdyvpkn{A*{`Gp^$9pp04Vr2@ zetcM9N~~rxl?1#z4S&fUf_4j0A%)o6>M_y5g!9ioD!sfgl=CC7GV)WJa1Y!&(!UgV zcqak@E*Kb!y*EK3#27PO@H~4)LJyNI(ZA_4PG{LPAl5Hm3a8cu_^6c=+@B&0(2s7i zX0v9t$$URDksTl2Ll9&c!GE3WlZvVL$2R)ok>KstFa8Z{!j%R-R5Mw~FaDCe__lcQ zw{8C?mwXmACdT>fm^f9nda=tDsR<1*Z^Tj(Tt$kH5HI-%)GF!J?03j+oY!i4aP(aA z>xHecyKk@M5{A7)Z**Wky@0g=R^9ODfR(`eEPMf1$zyB}_(i3evQC!NTbzG-InQ&o zKYAjDYK196nt zpYZgnbY*;;xF#t4U7HVD|0h>e79PCqaYc8_Sj|!ljYD2aI3>%cMVE^th}MD55XKro zcI9#2r4-tuiXx7HrK12FQLP~Leq@?Ci|J8HC%2$`ayi`9`{!U5p>F{j{rR`8Pd9ai zhfyfk1i1&0(J-ng0PS6q;ycg0BF^yo9w&VhnM6#ywn*gp7%Qt}8@qR3wn5B6X`g^| z3XxU-8Yfp=!@tS!!fQ}|v?e=AoZ89PSi!0g>p~~V={Z}_IfH|G6y}#LB6%*#E~B)X z;Slh@u(u`t-`U&RHIkqKfgjWM&wbHBZAh@CRS3S10D)02yT!?#xvH@)yC~&>y)rpg zICqaSiqr!PJ7CtXKUh^Dk9cL=#}!d<=7jO%fx{jhj{{aFmK-Qx%iFeKY8vlXP8=DY z2(;~G!uI3JVn?Sl0u+WrqnxJnV%fq_9`wK|55HUT8x$6gTk=QYJ_KI3Wbo*pgQEc( zjN|r&W59LsnI(hz>;9gN!k$?&aGDdyezR3W)9A+MlZWKo4X!4yz6G<60SLib@fVO9 z#dcFSkqyt-wBbeNFAvvK={MPb?H)T-mUmQ~b-26q&WDbaLF#qK?c;lC-@xf#r2PWt zJuw!(=IO7rA4)xVyzLb2nfj0Cb*er}d!%Zt)>L6^2Z$BMANp6bdDQKteN7oS?eEvP zGaN4m9|d3I4&iIu5s)yzZxA+M?hANNErdjNun!c69Shi(jzFS`(fBvrq7Q=q10OVm zJ_s(b2kpVFKOg`Dq===}-BGI>hZG?QaDUU^PJo1}fS@>a~?0@OHkj{@L0c;P)lX7H=OH{J4?p0^^MKTu?prNVkHg2qE~H|OgHIwGq71-zHiDiW;DeMeR{lB?lBca_i9r*+R+9@?syRT=KXN? zKdb?ng*>J9Jms$NMfMKL&`3^@M6VFH?p8PgKP{B8kOaO~@n;p!VW!t?+cg`P`VzT9 zk|(M!1vnL*K9sYlH2(n9P3MAP|5eyX22@S>k|?ffiiJk*-sH$}-X`U238#u3Ez*2a z2An3PrWOUC(q%|=U_k3-*z~7b6-6Hzi8Ge7C<`cUo504@6> z0~;uU{>f2%-Ruyc9)I=Q`Ey@>dhrDPpkI0MJRnekznpR~%NGMk(NZW2F1RPD01VAP zYz76*`IJ(Eb@hhZ8PRsr^Q8ut^&cJ#^0t?!zn`zOI@~s&2n63I@b0y}<~&yAgvaF8 z2{&6~mZ-^GI$mP^S=!&A0dD*OE5cFYQnh{YY=H1RFtci@jB0c>F^~`XxQL9 zaw7qeW%KeY|GV^>vy$v+&OJE;D^6c)(bU1XRE+=d`jw zdntRNsIMDG%T5cwLNIS~&`OrXF*bQHcF_#zzm zIfxMdM9hKxC_M~kz!WBwNC}y#uB>0~^*2n{()72q#LjgN-dGe>^62$>YYK>{Sd{4& zfJb%k>WHQ2p!xl?7JLM=3y+5h)g+i69$>V})J8hJC<}57CKcT!bjjT)l>LRWI1fh= znCMduNKE)}BU~7XhsgMBOMlwQd8N;kk#3SE_ zR$|q1)D8fWq6Erj@ZmEi#Lkn3{5?XWJ!jb4(ouu6?qe17{pOA^JVmP{?IJCFZ=6(({GBcj(@? zPi)@kAaRS($P`}qYm2m zx!2d46=W=&E@e%B$kUxT2p~)gg*zA{Vk0F2iT#OHr3AinW{-+?W(q%@V$s~mRd+g0 zNtw_*8>baT!#N{D2k+H&p9X>}{Pi)Q8Q`st!R^7fO$6MY|5_ivApUpjmtUy%LvcaDCfb*IY&cHgG!o>XYDHudteAahmSTzpKP zEgOO|`Ubzs`{@>#D?zBhQxf2uz7#H`a>^*bL_p_VJPoS+Kl^E{uk9U=JLmA3A=Z!i_mMj#kxl&Ba^ieN4d8T~m4)j8aR@S2R! zv&NXDDt@g}w__1I`9r*{T&vN$g)x5w^ws8^yBHGGUg9@E#lMLDSy*yZ$f@dHC#n%U zn`w>_fCtPxzl~l1W-G@_?iV{sPcWVFOZG@fWi?;O)gX*^h$Pz4c*`2`3cuSQY34SyRH`CU$E;Yt3!YPLE)XG>60eSSbPlm; zb(cMkG6(=|xei{xEvX$M?2u{s$6NaPynYTo21hDWI&}3d_~F5l9paWN(*d@T*F>uK zv|pd{jT2bL{A6k}L^A#ip&o}}mQ&!mV6Y@nj9+p{6BwZTFy!*75He96pUog+;j+4^ zr>$cs+w?G7vR972ml=+Ot2jReSHa>Vnaa7NV(L2XiM9KO9J=t}%#xk!-IPxS?pJV9 zDo}dx{e?nXB&!VF#peyu*s$(FaWXG5>UQZ8{c()Rsz8yjiGRb}uTzPtBlVR_pq7AH zyv1-GvpW^V>y99rw+{-ORiG>xx@2Ickjv#1*|C`|Yvb&tg|$M`>{-0amfT-$ z9$A8N-_Rfaf_QhmgH{42zv5l@4obEC)7bB2uJ8bFLgjGgFSkrHm#A+?$sI)n*}a&A zA9@ey)GBN~8~*l!trlU#Nr`bq?k+)`OW0$j9rG(SZY?`T({*cA;;*GK!8dU;JbGkT z^w$P@s5U@ zJYCo0Xg6{^gM61Dy-uZB7p7&EGSqJ>cTN~EplkyH0}A_`_i%&Ku5avhbjg`=!|#Fx zcTz>=#!%SIks+mbp7IqWbD|XY&<{|}-`&b3Vqh2%qf7v>F$CeccN)yVdKXTC-?f*< z$c)&fRD*LbzstwOt!^Z*MjYqDn6P6aulK6$?O?KzmK#Ip#USB!8CPWC>z4^rBRRnZ zH@6vcxh5uZ7+KhI#$SDg5-vVL@);c~n8a2)2SgFd8lX&%!mu%Hkp@BuzVaKyv+V;f zUAVd@3bAujGI@-NBWClWAEv*c?={@|lJToU5e?k?i9Xb1{O8VDl*^8uA4&0-%6{enl~90v!&^Y~ zv@cvmag6Xk*i}LJKfx+6k+mcM95iXLbfYf1YRCOf@f%~6NNc`R->{iEW1uX+i&KH0 z?;)VziKA|(V0=kH>i*r60hJKIJ`n_9!w56=eq};~ditca7JS&}&t9Iq{ zl{qcp! z8UgMgsA<+!O(O73Q=8C7iPS#6;IY_R7qNW5tj`)k+%9PD`gBUGy!38PRqI|J)9d+j z9s^=qTpp9zf0|0eR|YL;%dIZh(#%Nn_>5ihl0kT!7*P*z3%HPdi@`qLeNTDhWHJ4@sGO{L7HWAO|}Be{4vjQj`!r z*R+%3L(C986OqNoB3~loZ^cAV5OU+e6T(^Gzh?Uk_^%lmK``&d9lt6>zz7albkXNC zlT6hw1}k*u-n`wo7pq&B92Hxa9@trb8e@lUb3_4tT?W&bXAXz zw=8dkxiWek+Z59srU5deZ5${hj7pGqkSO?b5}eK~iKUTi%AI22@Hq8&ql@A#Z4t|Z z+=@(#sb16a6t*A|r&NSgFv)FB;~2~Qv;ps zcd%ULzjSeXqp+?QS2=G|k8Ls;DLb*=6M5=!-MeM)H-mBjujI&~9YGHhT(jo1Zb^o| z%&zeYJvc!5?Q!iT_rc0-vbr4s;Ui-YzJihcDU?l`++#>j9JvPufMbof2JAcmpCgwC zY?fSp!Q0R7ix?tTCLSd0r1i{w&>Z|WIR&lz=)vd6k`9-s{xJUs=g8GmSnrA5{jkx% zx^RDrNh=Ps5n-K2J8F`i{bnv6X0nqg?LzqV!^f+KhH%>l^&n4*}4@6cMWCe^c z0hT}R;QW_CR+06$)?-8T1rI;I;pO{#>|{&n=jMNh$3+`ml`tn+MpNGl)yoPAeP3Bl`om?94yXPd8N)P$h zwxllHn(e7P3*H}xYXEMQxQU;Dclsv$ygbk6+><{#;o|q4#`es?2MKHzcWfM2xN_8* z0uMdE7Yj)`p-h$F=k+Jm9Xe2>ht%%^Q=!{{wO0U2Qc9ViHe^fp%bh`Go5^QsYEp9j zb-c2q2#b_tR30gAD6y_^+t@dHGWjt3tBwAnbH+N7Pi0=o8qhp9YDZi7!vqYfL^M>S zN*ti?<#p_d>-X&=AqD30ROl~j>MjQhv#)a{y4?I4Xs>n>e9v=t!6%eD05qm(7~xJV z-0E!Vv7MHCUqpRaoiO%+9Gzk;0kvSyBd_6(XmD+lSO70R+(h{K3OIZ?e^PrW;cd57 zj%T+OWop1S`Ux}Nqa2k-&POdlkE|8ajcFz~iY1h2B*6>*oW2U*#!C+lwl!h4%7skp zxY?HFr4Sp7g+o7Ho;u%ZDS76WHe}ij{Li0pUOSnw&W)H>Kf;f zjhIEnmE0p{{abLcKeVg=rj=#3lUny#Zm|k$GFmUMteGN-3x})hu<3z}1h;lACK>nI zRW~EJo5S0ofUfwTR+j&c2?Qi>28Iu?(A|s$QH}sQ_g-Naa|xhxkA-rDhVIK>yzBPj zAa-$3EB<-VF6Yl1NY-}7OBWYI_+PM1qf8$FnftyENci&pd*oIRYcN&Um-X*@5Q(p= zh+H*05||G{6{x)mpx!syCB1Ot+zZudo2?(xC2@UW+v}-rr=IjaCN;N>?qgv=bqw-* zs~sSRnur2fCH9e8uaJWnho`yG4)y{~8L`p~QjYUHP^(}A)?U2RYA-Mv4;GUln=l?U zdUhxR{6!$4A_!nsf_V>D@#hoAeMMWQClyAuU%5S8&;|cL%pal^&74!3-{TLVIXKI` zpA6On+`Pp6VdjPoS!CVh0xLFv>STapt{b_+7tCE@N&=L50J zC)Pem=ntk_QHqf?eAQ6b!?SsTC*NJ_xM6%;r}=~8hs)pFZhZfIth%$(Osj}I-YKBy_sm0>)8T0*vXfMS*@4at77mUbSn;Jlih3O+bUPtJIn6Ss>V&H1 z4Ifv^Nhby0NCBWC@ZbgBQp>L)-q(H;d;^nAGLiSEWSK0a&qui3OZ`lqHY%6cXp$+p z+3ZXetyy5TQk1oN=`s8b z&bEOZ1Sln2D7@Te9P4`Jtq$GQShGZxLdM!Wm=0 zI|!@;YY9thu`azgdVf7udD0^i9wWrKJC^^nk`w2cy@!$H0zl)N|Lvsg4Iy72q4Qtk z^dGD`Wd)XdmXtoBs2hKIQL}~ZF^R={L|iX1&U^x0AUb5uE0Cf*1OX5KG{5u)Hu*|Ea8r-v9X-)nE%CDcrNv024&j``MAe^c8Fblz_z zRw9W|OWoHdjA_Zwc^9hLYZeY@k1kc9CiE_0=^jB4*2TPaK`lT`kJ9k8%0U4>D5?~1% zy&#m3N8-(c=vZ(d${^X)E4kiKukXO{0}Il=`W}`jcPrY+*gMF6$xM9(c!1$z4<4mn z4z=a_(_={hB#F;-2m@eAHPHWPy2JgCF@zw@<0AIcm1=DiB1w7c z^?veb^)WM4Go7tzjOo1y^UfuKORQ{c0f=)7CncuI3=|ko6c?8XrtwyFoNx%2Vu^3M zi6G&}xS;3f2opuwI)XgqGSeHaUg|Nl6pH!$miim?T9mgNnAf$5Ng=Gyz6#`-L$1(1ww2Jy23W5AtqyzAVp94j1#QDW-x2dE;aKj)A?9KZ@atA#yL;WDb%Eb0 zDWf-EM|I%E4MNScSrPBiv?>0oIPO_p z@DIaRaWp%~cjqgt5?Qsk^eRi(hLxPTQOu~Zmel5T&ARV&CWy2!KyESq|3SqO3psnG z4P4Y5BssEOz(IMPT@|yNTzr1+Xp^<^%ArqD6nhniaXMUa>^JE87XbNjTL-E95yr=l z>50ev)U9(Xx0Ft`#gRFRm~tS0&gcDv4ugE}W1MD;tnH*2^$F_Yb7O%?xv|3V};b`IOv2G(YnO51#(^`FMFuWE*%a zdaH0Mf$6L;E@@PI-+3LnRjtIVeAHvvYSMu_1XR8u_1ePZ&4IvcxU07%VRw z_m`j0wcZ&v9Dz5qTbke!5*WgQtKf^);40Dg{QRnrJ-uT09W}q*ecd|TK}de)Y_R_} zf3oRmF?RSgDS>1J>j?LONI^D=hZ61EPdYo07;Qdvta#p)=NOVxz;lI~F+HVT;A21` z3^cet*|#Fx;}i_wC(!;2fCq8`th9m!YHbbym_M78%TVxLi&hj{es-EzW--z|us7%G z{i@{`{q1*U!a=+w z{GxSZ$L2B84G}rFWU}ox!vraSh*zAojlC=#^%89&GLd{odA99%S$0G$y8r&$`UhWy zTp(r>6xLBr8@W$u_J;wF^L0>~nS8q|MB{yn1{3dkjfYUO;VtP&X@m^I-SgCLD)~(> z+@^7NJwTJfrl|^PH+?n#aJSg{5;w_Lt(LBf$K_riu@XCl4*kD=6!v!0ud9wz+WS5E zB2E~P!(r@s(G9FQD@B$a5kX7EqFX4Wq9??Kyf4u?bA8z?%lU@*lHA`FjRm>Ox=ZdF zc=5=t((W{CGEODj9edvE>Fp*maa%5!5L;}d+G<7=cH?cM`cC{v^Vl#q@PiwLwIuOx z)yd0x(_#g470facdzbT<9@p^!bx*_z zQik)^D54sL5w@e?SHGS+rK+UmC#mJ=deY;<8Anf56?JbtcTWQa$xC|17<&f|$74P| z-bQvB1{a-_{nQm4RE^!wy8Ek~xM;8H>tkwc1iA_R3R?rQuql?39cOhvWofVHzQWGG z)G}fpKA-7JvSC?(Pq07YEM+(eygE(KfcW7Ukze(vUeEr(C)>U@pHhi)3H1rG4l&WQ zL{+7p$XNXt93wk|(t9m80{c1?nGpr(*Pk#@yR1e^{H;?v>{3drLF-OHP`bS0Cz?DG z;U7;t!8>mszgK_~<1au}MsV|$ws_967A?U*>w2Z+)p8&5(Cpq1)N<%?g4z3u<>f@+ zI_4H|1OgqO_-*(u1@awNB7@DCGm;?5)_*cdI*UA1sAYb~wWkl=zZU>bf>tOfG>n>wB^t@``gb_5z(v{Awa0;v zj%K+@wQjw7hhlExX#Rx^cIJ~`q`VRGUiBm-c?o4P0aq-*X7m)f-?ZZRn*Oz>0y^?K za)SJ*oW|t~r?5`G(PVu=@}FH$pa8RA0;Q0|@0}pAf0Z@)Z%T~j@s>5yMh2@qjqfYx z91~H6#^cnOU;ZV2?-j)-Qsv&&eFaYpE^E#b|GBIIQ0m^i1m8sQuerbeY+3OGri~B> zW2w>DxkB_B?{w9@sNF>3ro>4NWIx&7yu=1xi}EMx8%-c^68zHHG;TG#c5Ln-lYfX% z)T)3#&EfM>;dZqFTmG@$SHM|4gL1`DgYhCVAffydk%9h={YQ{Ic+Y<8qx4u1wcv*Q zLm;L9Bc_>nM$;#7q{mprX=TT_DTj^Efx{3z+ugzP)bt|+iJ~Et>rK#He}4nP8?BxY zBuS2YF!&h%ykJKyGJC~~>QhCF!nd}JOzR%PvaCK?OO&17ZV*Bu2nWEUQImvv!-M=| zEddJ;y+yueaj1MCG_lQ+OY#t5T|N(?H-P(`5~m##^GKGn}RD_K4! zT&+T6<~Ir{;?`8C);(=o-oJmY+#iv|#kPewmkvx^9_GCSyk1FNZn7PBi1#*Q#Y1_IgAaDCk?Nq!oEB*4$d-u~4Vm zu=-bT8~lZNU|lJ z`A5kuf5ljjJP{TwL6dwSGTr8A%yRk8_eo74Z&+?t>>L|gKFao_oC$K@89k8X>|+>$ zPf>z*3V#|mE2dHm0)t(SJ*Sr~PNXa=oO?}%zH@Ks?wDMQ4Bl4FE4allQ=1Jjxqu?I z1+l065SB+^O%2~OzV)2q4tBLLvf|r$^|DWQ7^E%G2}STg3{aZ|xDxmSOemDX25Sbm zVc2IUIQxc-7(#BaAX?VmRofu^)7076`+%zH9svs3;%f*X%!^?V`B_D^aDRDtQ~B~) z?q@;o))&t> z?q>ms31-VfFX1m(;3d|dC{*t5q}?Py;Fzx;b5L{lcV5O#+9O(kZ^ADRV5#x-gMgv| z46z2aKo@ghhDt2tK|9o-EyKz#+K^oE2WhSW^#JMEfWNgu=L@Hgq3rkCs!ds=ryDSz-r*V?i-&? z!=4^E@w*jciwqmNY#Bn z>a4c=i-y3s88Ymq1_kuwKy41M2#wC^LHF3=@d6l=bNEw3i}pi9`$$6nMMwJtftG~@ z;so;-s^!7E$*-SNpZ1C#dO5>Ei9N>c{Aq&YM2`te*zN-K^a@q8R~TCz>dYV@$?wy* z0T#n~1m2np(B}2?Y9BvWeUm@lM`S!6{kfped@%M<#I22Ar7k7msFM)LX^IbVBe*IE zFNBH1q95{Fa(Z=M@|EXtHCLt-VGuNOZlSY6dc_3|s(F(lz|FD%YaRDTXW#{u_-16_ z#l#+Yxj>a6+&DG$pMJbh_z?NbS>w+Wr$p=> zFC0|NjH>SX(CRT1VjY!00m}$9gJ43e7$jkZ!aGVlCKjMyS(fZbJ*=}CY?J(A@VFbt zi*0qQU94<}MEg$?)p}mQh&_v2kvERQP4z24`H!!o0mtx>or5g19z*@qy}KMDLgS}I zl?%j&{nZ@gx2ViG`(a4WJpp$N_lH%$Rch7N#c0Hs(0l_=+;l%7IB4=j7gyKTvgA|v zCoxxn89c z49qBlb3A2@LJ;5(WPBu>cUMvW*GDuKYE=*1Ew2;u&bmBTbI^a}fI*z~cm!REmqK;! zaF^67B$?oYY|W_7M~NI)I-pa?UB+s&j+}V zoa<@6NHpVhF;r_h{on#3Git}CdMC{L*X&R+SyVAV>Ktv?x*e1& zK(+(bDdkhU&JT}d4LLqo=R!^C~BG0IzV@v(CV`-(W`1l zncSz?0}l_0)Tn+A=HPmkyw3Ldb(koyMzp3hMq_@WEx5dgy4;`MvQgfsa`lGV*O{*P z6@jRpC+vlom%TNj<~OQV@>Wj5$ivWX>S#sl?caF&ruC@rwTE6Yi4XOzEDKEb>7CWP ze~x-qv^3DQxiYXGXRSLehk=$e2=8V1Z8zT_U$NtU&atzCy?%#ouzls_>@{)0#v_AW z9)iX10itdYy4PR9HGB(1Li#BD>6e7a)`~~ttc4|qW`=FX&rQ+Z@%Iwzdouyfn(gI8 zFp@$@sFC>oMEj8kK5?o4bk*~4gCQ}xOZCG<%`mD0DS15jy2HZ*zK(E=9fr?lCSl~i zA*7f53M+LUylMdvllfAnt-^S=3c0RH^5~h9%5=KRS60|GMtx{5>uh$if{3X#3(JZ$ zNF+``2m_BGbN~VG8F~6PHgD(PV97Jx%M&%VE^ZgMjT+vvcMbN8ZX~4y1Y{DzPpr!1G}J zGrvopeHqVt4lPYa;+YeEHGSy(XUE(y0$kIW`9%4mk|d@8dsY+1!1E}3Gtjw7ohQJ{ zb;i|VqvYZA&uCU-Q`(NjQcj;HXI$bEC^ANj{WR}mNo~F~bQ`<}SaZ1Y*-yF&960_1 zOFO)dmV12+_6+6{OcM7$fkGjW8e%Z-0<;f%?F>G%N?bbweuEyd=TiyFeL^%}r_KP~ zkzM`9rMF1sH-&8ciQr7^-_NMyakdP)LI@fR#I!Fb=q52NgdooB^)&X2cNJA}p9?|o zcVmOkh>|T7L5?H;{?Fc~<%!aJiW3x>4cgORQ|$OiGN~*?*?15XY~&y{_~syh<bdBim{`jKLUW0{%! zZ;p}4%wL$U-JMlmMj6Jk(Tv+ze4niR2r=iN?2YAuiS#yz|EOpj+zrsb*>xdc&Acm% z8r!LB9*!l}wn^%FWp>oN*{{N`(I}B^0;Qb*U_1PdzTPBwN4lT@%9wpPZW%C?vf=TX zL-^;%i-j35ww^l|Uwa>jJy!iP{$BzZuoVV$fBigkNnG2xwIGggi0~7XJ@v-yKhN`~UxbAIIL=dsJEy$6m+CXdHXb?7c^hJu=J4NFpMNtWpY< zR7NSXOGt!7C1ix~yWU6l{rUVpzfJqCiV8=R&O`gG`V{YA$0ITZwbQ@>4{ z5jL8iXMWXY=;m!NWi_)Wts~(=Vs}1rK1?3+1IliW9$Qwhloia4crbA0Ah@pnxMl(} zdY%UV2Pfy_M*Wdh;|w7MZ~020L5F}_?<3c7>thu$2kO>T@zmVN*Max)#DKqdych9O zsEYvNy?!%4^G}k?5G~f2z#hyflmgct3Mx8NXwIMNPD=MJ)AH5APqovpFQ49ZZu0S1 z02tDfM;oUjS=;ZnBEi=GE-RwyEVs4SSG*efe)l=6mv=UD?wr&Fdl5YDf9GrH@X^2K z|8a^Vm~-=ERT#aIIF2FG}K$M$YlxS7s7|1G5st5)t=h*NwQZKTSo0vp$^1Xr~qpnHhOwv`*&+U_4xCPFSc)?GS)CaDUS70fL*v~XSip?%|i zFH?}Fip3o-(g;pq0gS_e1=wMuT)4(X!%*TjD4OO1^-yxoQmE-&(HOquRssULq;i_0pa1?dEA+@g!4A zK1tws+JhL0X;irzD(Wk0-rDre7xCsMpF+Wtt_q)+0 zV$_IIE`mx2BFAXG2l4{U2Z-L1uFpXnpCIQ@4)5uLtutt@$Hg?3UWyP6I2krDDX0hn zVj19eA%0LtMb599Tft(M2qU3);30@gVRm+S~xJ>=hOi7?=7EKcTd@?Pe2T z(}yI{QJt1{WP*1tpD<6cFbni>Ki>wZ)PM?;y9R)H>3=4Z%R(XMhYW^=!v4wlaD;$6 z{f(*sxG8q{RNY#Aa}-dNML?7{hkuUPJ_aC44j9-dyi#-Hu4u$Y(LK{T9j^V>+0B%p zA?g`p5H!S@$4)UQQSc5t^#QR;(kq>glNU2rXb9K4a@nxN3kYdS-0}o zJ%*60GR%jDGfmuIFV{%{9kC&Rp|-KzkBOtu=RgraYrUu3m^~qxqIS)kp8@tR@!=)9azc*ejSgLynw#}E|{3V0ml!hLd?D`qPL-Hmz|sL z6s^wG{8o61){x$iuWb+=4JMz_<_y>%7&P7pGt^)qVnOXr82Y^c11sM=aXdL~PMfaw zsPjp(DUTmD=M(ol;yRmi2Q(10uOVzH-vK^TijKJRrwju+Ne0eRiBw@v3?K*9rG&k% z6>XW5j+fo}6m(;op zA^qt`W}Q--wQg~qZ?aj>$Un^;fo1j4MrObv8pp%sBq+SG_0s8$7G*MfN*X=cumU61 z?%E_wyF$Uobh;YvV}!`Kszh+gB|cIB@m) zM*&HLeNVqsuUH+LNJcPax`s%_CJN;TnmcCdc6KU#N3y>xQs}5NP5F&xZH`rbeRAYn zI30c2)eZ1#jd93D1|g$J97wr|SQ`rf(cBe^IUReiem&t}$5O51&}~Pz*8bek@TriE zY`*~H3SOSeGO(R;TPQyoYP`qUNU1w)dQ5Cu2bB-3-{)v&kkWneaJ>6-3-XGq#vby=1rQT-$Quxb&ecYT#4Cd?xnqG3e zlthcEl0kUC8gkYQURe62-=MRmdS`yh)C`}I1@&;PB=s#HzjCmGX(|%REWvpHIRSY& zi<}>UPr5d5lZj#<-ier?`J66C7q}@k^(+dx5rM6LHFT5yYUr*_Z16P^Yv?`+5@77h zXBWBEWUvvJ(Thc&XWG=FJ^1O{Tg}XkjTeuAnFAGZeK#a3`28R^7(m`>=n{MWJDv~} zA>H&L`(?xC*o2{n`mV#`9AYeAHfv1Zl1-XVdtU}%WTYalGl&3Shz;N%KPM(^u~Q+B z3<;mmiwmjFK6_7y-6=go+jO7j`u$HST^A3p+*;&?S;8nFXM&{W+CO^QC?{C!X}<}R zs$n!NuJ%(P&7Csxa7_8-5EcgYjB;Kvq4kDx|UZ&IC^NqScK$zIb{Xj+2|O zzVZ6Mzjx)d^f(ICNR4R#j>VD~js*nHB_aV3Q7p?&dI%{ZQwG~lh2(L?>goZzOxGs4 z-1DvJs*fUx4@J_(@VmZ)RkkH1)3;cc&WBf}bnblbKa`u8L5%-@D>sE5ST=m#5J-OI zN_b31OG#R()94lxN0JNSle}n#tk2p%rI_q&2#e0=4dU9-;zNq|_Z5i2R(n!RQ zO@dQvY(*;7M+SYeGa*B|=Z{11Sf4j;)wHUm9b%7;n$9TA<(@6m_&UUQ?Yu7&_|hq1 z#Q6on)y8D_5yeAObtf~@_DC-FUl90Sk8U}ANF&E~Wx;ghK+-}QI6_wUk)Rhrf-Vv# z13wUmc%BKxk2Ifhgq3czg=f$+dw30meTk5aBWv(!QrJDpa)MAqssby4+Usf9={S-s z8%*<7|IGe)sIO)*;$kfAy5gtd*v~KQdkenVoIEi9V-@BAIItw-JLN$34ZotAb$+n) zWcm_|RuLKVK%wO{>ziVo{Ry|JEYIxbb^#*PHcH^bSHGY%x+%k+!UuXR7fJSB&5Yg( zY<+L0m-aPRFGe|L5RP22t}clJPTRE-(O6m`!ISLMZ|n~~CKHgO7;MvXd2u|rB3i^= z!+fK+qT1o`EASA^Fu>>|t0Yo@2bLJ`(D5w*RWzuW39Ynf8#a)v*kpB~r8IC|8HS9a z(KeTn*R)DfZU7{U=#^Odv=h6#y$1N0B2oF2;$O}MIk!$}ey=$R*iJw; zNsEeTgta3D&Un~-?p{RY9M`5=K<}gPSPN;r=$W%eWBV44sy(D*gIU%nAVWkb3{0PC zQiIHcP2w$0Y{V zTGMk1{x@Rl{Q`e%rt(o~dr-UWhYe$bG<< z>8M6O1$t$&kca9`v@x1mikJK^S&wM*53^LvJ6fY0d0<6;FoX4^o8lzUgQcRz@7eF2 zRlnun=g~TzBd*FVXe+Glx}d94pJM*mRWSz^xd^K!k!@Xs1uo)j<#sQ9w{&malK*1y z^<|ih%6+k3shgnQ`Y)ul=b_xe7;2}q%Z+S_E+;1sdzf*n_YpFAIi!s*NRoJsZ>{n62T@EbwhoS<=e37EUf1SI~ssIX3Vv`&M z(P(DUi1!~S=m2d7EzC{gb(^!|S%?HJJr*gijMctPHTHy&)J3MDK2D7-r&m zn6~n$dDe}r=_~s*8s_9q^a52hosQq7F7PU78P6*aqXPds?^l}H{E}%hR3|es;{#{Wk|=)=2nY!EjY>$VvwKcZ%3-k(x_d33VxPJX zH3%(^3XJfKiJl7g$LtEA_;UEmoQC#C)4(8HZ;+&3`|1h^QCy^uwTV*c{Q)*ls1Rrm zGU5F^JwvE@M)f>8ybqa=s_8n7mxYp}Q^O55Q6Sjxj75SC{Ho&Tr+WgfK4|_?!iHk4 zT2Cv;hoBN8go~z$S5czyO61zyqG%w-S=1wmf(j8_#GRE+vh0g9Atj+4wcM2MNU%;D zQ3pQ<_2wLURb_xsC($u~^a-CRGwB3>&ilkG^zD8>QzV^$<-PU`K1=prXAlv_Q-+8q z@1Yc{rDeHs{7vEY+4@%uvYM+uJRw3&1|$N#y@d-*ZaMe!(yTwS#^{VTu6?_W{Qmz^ zoA+125+ezw3z~0P4Ho<;^uk?l_IgvN{_3o73q}B;Nu(fM9+%q%fr>G>d@Et#+vk zLF2Ar*--kLXauc6*e%2ix~~?=#IY*%_px{M;o7$D@!b^m4rHNG zAZ>9{8j6~EfrE3MW|_9PPK zXhXYQ01Ii$k%4Ln(%pd|FfM>79|6#0wGA1l1@E+>F}slHksHO7Sifg0D(neA-p@nz z+S#~@i(SX(-wfFwb$p|}JH_f**sjuM2^qPP1w~89&h|N)6g(Y$OSoJJu&?`Ln&V$5 zylxg6AIs_SsWrI(nplA`D}|3o1-$$+#U-71- zWWTS-BvK&XDSm;6f)rbJV=o7CsA5`SpyMbR#PV$BZu>|+uvpasKRLrQN37#}-&gKQ zZ`$ZnVr+6+u6cWa)9WKE_7$*L#y-Ge8Rx-LUTCKU!W7r7{^kx&t`3re?u|(`neUuV zM|>;k`20pN#&gBBfTn5b6(N; z@#!xgDEhuwk*z}EQH+zP%`yQ<1@c7f!f(R+8ekWQ(d%Mha$Me=gd=0Va=I$-x499g zfWu#BlDPr63v3Zl68z!HnYX}!5X48asPT=h@Ul4u;cSzB?4OlgJ>nR*&@Zx4?TUPk_Cdo3Tu6?q*yU@KfLCUAEKjLj=u90o` z0QT0Q6M2g3&~+1Zm_dgV@3kjZhix7m=FvLXdOuPB12*P}Jn9$L0`?bvCB1vTJ1}dYaSm^`&cnG7mW;sY0tRugr*vgf{#0ef{$0ZFzy(Z-)+7Wj}cA5F2kjv!S}&4Z81)l(5AN;dMve;_IAQp5NJ zaRp9UFLjp;%R=_E?Gev6JYflP$=-_o` zK*WT`??QsC^?n`EmF&~rrocy-vmk+&I67J!H{O89ynp0ibN8@r5BBR_#d~Acks|xh z;O*jIZt2VjV84(*7pOt|5c~}%?#borBv!3>I{zUHRHlsc^f|(x-{fPe6WVoQ&*|K2 zy_S35+T`wT+NoBU1b{{UP^|#r#!j_@7&z%K|E;qqs+OH~^28?n%pF#%$&8DRy$8n` zUgXDibqPq!>16G|&z<*yw{B@ny0sWs{P8fqt+0G56}iwzro;4(Cz@A)pw`o5wIl0q zN6I-cw@Mq2&@k+wkPzJh2{YAdMHili?We7nRR?du%OVTZOBP{Ch7_60zG8IDV_pE3 zu1Vn{49TrRmc&36;3mm;kc0e}J0CGUNEbshhVpphVHfS3bv~FK;GI`G7k7Q-7sPNl z$_b6kWOLot=Ne|@9s~@Idkm$Z(V$6vf+0h)GM!*sG~JI@!ufh}k)+Njo@5+1g_yHJn6k zB~;WLq-9m5q@_bnAVgMSsQOUB0M`HyM?pD36@P!n0DdjU09yy!09!#}!GK^NnBCIb z&dt$20Q|3ypSO>rUx2Hlzo1;GpdqC+6w0{I)IY$_)yolcPz}JLuS-LF3<7NZ0#2#f1~|f}X|v2dAq9*mM*Og-^kGp+LyV}Ls2ChX z9U}+L+lC4T`gwpwTmk}o{N;`uv9omwwsUl~^#~5axJm|iI^+FM`#X7JFwTA4MAd4+IxK|FQunG^???QoK1o))8@cL%EzOL=n zhIqQ{uNpsPq%P&>YF4_MkZ%R`Ui?63n(u)25X8!m67O9eA^Vlh{5SIrayLOk$N%6f{CI2(Kl5N+Dw8R$?7c9LwdF|t`AsviG@8g&ybSE%zeRY zY+nc4uz{#+XZDPtYc-6|-_=H&GzG1}-{U~Z!r{bL7$g-&D6Mle70y!OZca6<+?*Vh zu)J35<=dTWwen!wZ|kmx!Ys_uigxb=xiFX*CAeE+GcY^Z@B!Vd=X{RzUW1m7??$1g zZyuOG(jy(Wo~RS{QpmCWfn*T6A;A9pM(aZdSu$^P*}i}Odj zHNV;{Et8(i%XVt;n1?GVXB3frYGzMy$(I%z3LCGyac-nI4K%LqR^Hwe}!|re@L&ZF~N2bduhQ4 zL%pGGX_NBk0B?>LRX08F7NG)n2`dRB>Vkg=A;FNdrwK>2WmNCh<-&KPZprCSDc_Fr z-`e&+7;m8Qc09Ld9B5HFi-MPcBbLNtC19c$Op$yL9@Bc97efK}LTX`<5U1@eB2dV- z%xvBFv5hyl^Z9DHbu?p;&{E zhOmfcYKB+~P60Cg5QNaM1bp#4$06VuAkrO*LmS8s3==2-`BsD}jRxJ4W#d#uu^$Ny zz#s5A2sV=1oV`daGH7-(rzsjsClL!`GYZc0q#xdJY02SdNMXpOs`fv?`4D^?^fAo- zfsppUBJwk+iJ|7q98rOKS&B~c-8%TPp+-itZWLo~muEg%)3MXXup=P*%UpN-Gto01 zhSV6{O&lwC-5f))MRe@mZ+gpHgic740 zFG;?)M*GwTa;qrYd$&=XS_%XQG~^T)t>n`;H;TXAjYD(g3sz1v46P}conNm(C%3a) z0CB4p68#fL#)Dj%Far>$Gr)~jK0ByYeCDjq>i)fgtMOi7?a-fe84h@xTIO!QM)41Q zl!^=L^n&bOkI6@FdnR7c1n1e939Jp;m?JkDXpXdrPqDp; zo;vh(G{LdYyXlgs(MEO~Ae{6`;tCYsVpvSBFHdgM?_$6}+R8;_zECS|aNA80YynM6Ttb zyMu4W#o5nF`a+rNKKH;oa%2OGAgwIW0s$rA-x&HETZ{MMbA}&weSN$ysq)~9F#Gkw z&eD!8X%lMerAk4tj=_GAG?aG$F5f3#7_w8I{iJO(NmZ_kH?R|V+`6fJTG@1vQf%3( zen0rEwixm|gJ7x0q(u4j2zI{P+etC+=lH(hxVKBM&A4Z2>qAUDBFlZ%KajOPYS02( z!g%J7+2$XRYM%$|kM6Q}2V~B!+Ef(HZO*Q(2bJ#chr91=O8K@ z)bMb1b_w7&vGwP-xAn4j1OX%%_y@IWlQs9RFO*1<3!ZV{GkJ2OQOEC#o?fOxvGX^* z9FpWoMtkhVCjUn8?*W1q`Bj^V`X{^yWDY75J6e3^Jb+^il8F-T`awG9qXPn@JFUE^ zr5l=cYsb|UYCAGFtmD{(EbAe1k-)7)>;a(F+JOnD}f|`s$gc z+Eodv6`u`s=#_|b{dW^h1{5sc&-@Hx0MUm|(ISQl8S9r@K>2;4z<=C6Y@|pwmoIxJ zpoJzR(`!xf{=ht)U;gbg-BHIL9s%F5Q(cF)yudD=Zd-iSMWHEi)oRbvGA##QKGJb* z)yPisd&+b#Z{#6jc;*5K-eafvWF`X&C&U0KpuPX)bEEM4W-VrTtmEJZ)p{j1jY%N~ zik#C5VU4q8VaLHrx`-e#68EH&6OVfk29f1V-@8%c=xu4Um*-E_G5eaG5PzLwdRt(Q z-1Whs5npf~JP;LO?FJH%PP+)~W`PZfb$n6q=o^wUh$PkdE=wVx1Tpxrh>@h>n4OQi zm@{$@Tj(M2@r$sx?~@6yk1S$j>R(}&7z*grX8^?0uZ86fkwB7mugH;Uh89TMcmZ|x z(nah8pL+HZmKdkTCL77|11~zQ*f)7-3lyaxi)tEk zKQ855jm0|}qF!oL2z*^(yT|<&T)&AG_9wKZPd=`HEX4kf=-TPQy+8Y3WVodL>^#Ew z1%sml5&ll0Y+N5KNcL5?`0GLT4nbuzAz!8*Ka(>WcOLX!ble*DWpK=I1E@3eGrv%0 zx9l~==Bw_9yPn`U%*Hg(=6-(=1L(>@Y zddkz$-yfuKr&<{8dtLa(C>ANtYbN2Y+=7$*r{bPF`pd5cyvzw$UPXcwfTFaq0e|l_ zJbqUUBg_C0Yj)Fef#${~pHi;Iu!+t5x{AH}0~UGhlzWQ_&5gf1Rp8ArO}JUG^+;EA zEFA^HS?hMRCkI1&F7bERG8ZUXe4~dsuxNXR-=Y@@HDd(5NG$L9s|sSk^~z>;Z}R>r z*1po-JMQXz1{TZ1r{T?q(4k)YU{Nlhdkbd%n z;b>)|zB0+>d@My?j4s!)i{LC*-oNQd~S25?hbGboiA9M?YW%4YGU8|XKOOx%r% zC=3qX3Esg{n$3W`?NZaGL z3IKp6@plRUT`7l)4w4*F!dA7#SFjuLq`iKE0sam=mA_?nJ)O@T<+q8>e=;=tlO;-qc^?tZhOxZ{cR7f5R3VgPoNuE&#vww}1#t=i7KTh}YRtpjJM^C7uCBsjj< zL!{@-sbw3M9pXe7Hr{@C_-Z$Y;TQx(oAFKYHVM)$TiYvMF;|c^zB_>i``5Kx%`u+g z3Vlz<@CovsMf?lCpn|rhC-=34&QYiJN5C9M(T1kji;#XSh?f44Egz3XlJx$mR^KZu zyK77R#1(%mi9Qi5*`xFIh31CVAdlx}yy6SA;~X+<3lKX1NJI?ew*w^dO$bzP^Nm%m zedN$Uzw3ow<=Y$jyIwCHt9~AQwI45!Y9+XlH&&-R6vefD?!Llro zD~s6U?aU`@Ye=C!pc_qLgM;KgkOBWw9t0}R!OT`!MqJbhCq~|6R{4B*mZ)S?$^CdA zhi*~$-J9awz{%KVApzPF47OVIFo&YD>Jz7;g8{6vZ)~cM9XcUYv9ZP(0uDc=F zw$>8Jwp~I;FX8%0*oODUoxjHwk@dzo&CK^wn_-TbE2uazq;j=4p{L&AV}r;)+-aKJ zzepR0D%v8y%%5B3>vGrHPnB=-&Ea>pAX3sP02^ne61+yBMk7FpKTCV$3~q$v@NE0- zFU-@yR1EprBPCy)bGp)Bk2j*)5N5!;fEiFKRTc;E7lgc)*EqVqxX}OG+#rM9Xxi+dsl3iGIAdJo# zsOlax{<>&l>DfNn%5rSs&D$lX?y>$br`DCA^yZyDT(_QaLeU0oS`VHL1Qn=|M}g&U zsD&u`s4n<+)l~^xbxRPey8wg!<7O0*3nxE;B5$ZMVkZ1T?YGf}7pEL&#(K>bJz_wx*;p_P-fLJyW6 z?u}df^c3{xOpTCD-b(hQ6*ok)N@01;+iYljWwbGl{QBi6gJ#LMAgep}3*QDF6D0Uo ze83|#ezB7nzd%cWjdZPwYYj(aY#n<9h19p^hKMtg!$Z>ZbIudwu7f*O2%U3av7P<| zF(U#{GT(Rl6U1yAw-S%y3P32Q_H zh&T!WaWHx`#`@_Q zn>wAo<0paMg4$^FNl%zX0@TA-0auQ`6)ZOd6E*H)R#8t;6C8{e-?E0BO&DqII(~+p z|IBNPxO(SXPlo7sKW(dz1spnNZs59qJGsYky9|OlceD4(ZDCT{KGxgZMWc41!k8YT z->uHSdH6yUb!5D!mjL)g)SpH~#K5YQ()5`>VVon7er-GmNkEEt7 z8ymZGb)2i{^V7$Q9uHrmW>=kr6*!E?M(%*)=Y-(8k@5g!E3lst)+HJ&ra!`Odr)5a z`O#SJ?iIyltR3DrQ1I*LW!4+Zefwpy99XEpN-nQJm?$Mr>SRlTqz|new|Qyu{Q9uR zZFg6mm*+C#=9D;y*B;SR8hp_);zkKfuE!D>hAvkC-jM%v3W;*%Ok0HnUUA!h<;~&J zGk3QwxhG9>-tfzHBUFyI8Nf7wOAYfBbWyEz&YHirm_Ly8!6Z~it29o#ZEB%UN4v4$ zKp#+mfSf>%_gid~*aDy(CkBp!*@1NiwN=qs@K*M!;;(Vr{>&*CKA-iFnTL%fNPAC! z{?pApNe{#Xf&oZH39_|a#+)EGPDcGHG}cQF)00f^*|6sZLdmQc?}& zwC6^8zDLPLYG}(qnbv&>n+{tpu)SBfJ7ZYxlk&rK!rExLuEX6IfT!J?~lqTe^6I_HGD>yp?}G?kIEXxleB+ z9E>?chBF%2pQdTWGv)Ad^t-E`lD5gfr;|KN+Q8J25Qv4K$2>@_nCCm<{9qLrv^Cku zbiMroY(2boBNbmvHW~PLh;nC|WNx(}*QnXbR_Q!8j-+%1f0M5uQK1_73tYO#q#i!p#KAXRA z)w3a}zDM8zWejpWO<~-f;fvP$E3}45vhb%Q9=>U}+xuyoa6ChzAZA!ix&LZ2#}VYS zu@IzcC+Bp+I3T0X}5S@C$IUGuQd zP+Rrj6r30<>Sj2jwA@+JfxZ~tdzb}2G4+yae|X!jM9qzfC*Ty=_x}~_7!U`;_5gNO zTt;z4k27Zjkjy`u>0gZ5AHHAOGT;1&qYUw21lyZ!)B1W=}507ax+_TMn_(;fx8 z#Qt_b!}C&0+~dEMCP;)5|UE#r$aCq5WQa2lxAGE}u}1#so@ zya%fAx|sKWsLMN1!t)Bm3iE%*2YLl3y}Z+91=#DZa7{|rl=V4=^o#aE*Edf%e4^PS z1XCUbcEx@PYY7vN50EGX*cGDQ6y!68EPE>HFD7JDm3+O*toGpU-Phh@0^4<;M;hnm zrEeo6K^Bw1BqN|?+unSigsQp5Ln&s5Bjnv)O-3sfW*0a8)CtcB5>z(@`&RoZFx{X4 z1}ay!j4QwZ69ck=IUdI%?sJOKDW{~1POz|6K#|+?Ouhq=0fp&TCBn|$2K76%1NzrW z2*@K4Tt2bz23)>#>_xJ?^#>0keNI-eq};xAG=a3MPC>b;eSm6Rtt=I+V?J|i6^;>L7yz$qZgpJ{s? zJ`FCB7=kHlWC+9C|9tAewhkCs=&=_MxPAyy{C}qoqR=&O4bP+=2_t=TCDis> z*SnK%&q~X#E}Gn{sq#=38OdbooGj-sRtXxx|R&2+1Cabv3KKpT=ihp*xp+Hqh zvp}SU{dbr}gaWb-K)M>eD7kCI@m5GfBQW^ls1A&(WNw{9zcuC%F2@Q)=1did+;(wz z4z){x$i%uHgb3wrXnfeUQ=g|3+G<2o7d1<7N1h1@cUjZ_A!39*Zm{RhKnt>Cdck`( zK8}_G7K&Jy3^q$DyWa;|t~vjWCL3~rHZ2uKzVG8Tbkhg-uJBv$+S>>gv0VGLSpXtd zw&FJxT=14tP`UA8fqo+L^Y3iosyzdGbi8(l*REa5gl#tkMf#7>gSV^~2j22l2Z?zH z3B(P`I=KHi@o5D3D*q0RLn0f)KF{jrn;DHPq@3;B4@0}tFn&%M!)%AD&T9I8e0s%C zwHOpwomIC;aSNAK*eUj>;va;Ce>sE~WV_|$B7EcR#?l zaB3iCgElPVj)qOr1w&(f(dy*$MH}l#!3T%KzJiV0Q3Plpn86|D3yyInQ2=i+v3qri zEpoCXE!t79M@#eTxeUv77gLX^j-wU}2AQ>rENJ61{|j$`>40%2Sh7QxZToCe`x$7P z^;7ef%>(8DI1m``Jv%bY2sRK~MTP&?A~aI}QtX9XbqsCOsC;B=PXHB5On2D8`0dX} zZ47|Ot;;m_8Kj?1BBxHA@={Da>NUKe=xW3GLC$}=JLu%ew^Qu3hBozx zH0ptuZ59e{#q>7>9~eE7-|!R?%Myt36k=3iP+y@SV|K)(BCYTUbCN_P5n6fqY_{XJ z%Wc6aUS~mx#qcDF2Z|Uo9PJS7>HGM=c|{1VuZM+T;|TcrFh!WbHh-W_t@sSaI;Tr^ zRBx~5lKDj5b-e_w7aIpumdx6~0nk}TPLVP}KAM=Y)qxEpRBxkt?I#rY>PVN!v+lL_ z4om@BV>qEXxl+8Z?z^!d%UG4rlNECb@-ctk zX&NmEgOwiFwxos)mEqfx zM3uNU1Cnm%IMP_$)lHJ1d+w!Z2(&4UFowX^!DuqC+`Tlyz`{b+f6ZB<2fsI8 zss0SVv9My@$>^#h0IHt)m6*4+Wu7pYq=rx7%5>hpp*B>>SCBcbN>I$P`Ck9AB5e0 zYJ_AuO#B%I_E2A%O-%KVJ!|U~Z$#d}X(T>4woKl|O@|7Y!w>D4ftCIpUC|$E(193y zguGnVH74h!b)mI3$t$0t&3ZX~Ag!8pA%C{;xN<)dyGVc z^?x9i1j_23&o{5EZ+#Qy#ai@VJ{C*f^vOm(j9yYi^xX7^z#DrN{n5^1*p=U)l=h*I z5y_;jkCGq|B@#rAAkwdTttPwX%&N3{`>3UW#7%fnoUijqoYwK<-!82W5FkpH#sG@6 z)r5|2!b#Ibnl$a{Qg6$f9yxPJWJN~^UWUEgfQ3{-?__XI=wn3W2CQXZM)>c_Dwr~Z zA%RJ|9n8iV2aE6_uSNTN5AK>#ikbFhMHlhkDb$5sqY@fN&K-w26wsc>kg6&lTF#h^ zXp`UdDpIM5b#gHN!CS>UWl?sE`csQwT5<24p$eW$kzOSarj~M$aY2(~zw)ykPQ)ytc7&7qE5X2nGRfqneA0BX7YV3k+-vN`EIFhow}oKxXml(Y20%rZc&jJ?Sb3kg~fOY zNuB`zKUOV8x{xs-g6^6e6H>GULw{WX;j5!Sc+H@qq%`|&>i|_QX+}z|hVz^Fn5yRu zEV2Q;Df?9~l|}>l9z#x0vs?*9ozSAeSG(T4fPb-O9c$idG-R&wV8O|FU*|OCO)=dM z_v#-tilji0H{fu9%CASFL9})Az@d#VS}zC2C#DUPgCBA?Q5N1zuy z_$LuP1M<@isuaTsN0gZOnP~=5wJY2_yPT7HgC3ccfrh0!8)#T+UnT+BH9!~nAO&H- zjWq5FDqM4XU7t_*e1+t1R5jF26-kzTr}H#3vHOY>xz<2y!ukqmiqU&<48 zWX34wGos<($>|y()m}C-1Vn{M&=QMFZ}5Zx^W~!ELb?`g*LyBLk7l98a`S{`(Fbw9 zp4X=?+{N^WFrm=S9-#2G^^ns1A*CoM;>)$b)e@!<`nJQ2n~D1Jwyn<^qMSpekBv9o zu1|Hj8SV1le(-DwmztU9SHdp1Fz7wNx^qxqKto57O?yI^t+m@8^<>NueMuzCS zpekr^3((;a2v%NqvWjc88F(3m#ZV=RQ8x9b)ZQ{Xp!VzY>h#8X-$9$UG2rSSz z<4@cCPrSMR6+@KgkN}C!l$gZ6r$+*(9at>C(^8x^h%R%ok*fTp{?Wz|Ns^rP5R3(} zEbQ-TL?T`gQNRHuqC_#EaA9!hREMe9e)>cbKmMfnP?om-sR+&9WBjtxrasErc8XeP zn+|L?r2hy&dqDr%4KgIwzdq*Z`3OJ5x#>1!dE(I+gP*+l-bV)&aEnLuUcK&F`}l(I zQe(B1eF)GqL3|cf_Cfk#WRV+&KRE*c|n~zE=km-eI=zS=?vs*G3|!YK=Y7q zp3+a=0=e97m_rq95sDp#wz$#J+&EUj zx$$YrwM*ml19=;yqJ=!{k0oa-Ir{ApKgtbuzCHs=F7@AFeE;aOu zb^g2O)%c>|s1!5{?Lj~Cd!rQx9+D6APbM9DU@T&5W2YdwaC|k~hK!YG46XeH3zR}X z$5PZ?r(PdgV8xjaZBCzkEz^*V(3&DN+VO%~>}krR1EYa+-+ro(>h+amU*3u7AxeZo zSu+0po`;kL@%4B1mX``;$%B8#RRgeBMD3XT`88qgqWqCbs#8<+JKw|9?10Sq zcR=QVV3H0wICR|R%j5HdqWq`V&j zV4BL14H4M_T0-eqYL+VO*};)z5mxuB1FV9{C{7UuXJ#*z(6r+le3B|$8x9k7JXvUW zckD5gHk!m10%e|GJx)*({>V$p!1}O-_q>QR5)~Bcvfe*yfYez;DAOvdsJd2tC$zP8 zc`7fq?3H)f3mwrlFl8>EmjmcX8MK1}@Mp$x=s&fJ7IsB_g=Hk$OPMEL720!johhhz zAK=A5wds?2>!lsn5!F~-QP9EE69n4=cjm`ekH>Y7>3VfOCHv{Y8;Rwk#F=m_ zoR?rJB!Zwit*Ktx-KW1gHU-jS1qRjm25dfJu z4S@r+#>*qA~vA0n#QZ3y`cY0o_f$GI+>@HC^j0IUCNV(BQ zcm!e80bl({PDtfv{z~PArrUHTk)}cw*?)ilpXq3QU|2Y|Jomnrv#?w-=aZCTr{@K1 zZ?tA7X{2*5pxN4?Qbd@XcbW?K`ZL6;>f*IOEc06hk~wZ&zMrOp#6$!TVEkum(p)<- zD%xi22fDkyZ6m~WdDp@9X#F<_Y8@IDNkD1=||!}CW~GNQy@@3q=GS4Pcb=feE#(6M_l zw=;)?3hp*Y3J&gGUty*a;A(08kp0*eD0a(_tYl!{4^a3m7+-6Cqq!D8?7;;=ehtVT zN=3typ=hnpk;^nig$`=wC7W-DT$@gF}v6@t5Cht z2b&VoC>1Toecsm*Zz>W<9P5vmkfq(@ue73jWD2-wDEGGSa?rW;^9}g<3&OUR*unZ^ z21#(lRMh^~O=pOm598B3tplM^xd_EFn0VxexXIO24Ea?I3_|un#yeS~#g8oq(H9N3 zw|W|!lc)Dfzb5If=6|f=PfDMS_s_ELxn4HiWpl%!4pUF|@z?jF2>LM)9I*g;VLXSm zLHex>MRbxubRtI3F(Nh?qlI*M|F*%uk&bx`|3*5-z~O_KR%hJxaID^R#6(ftlI*gb z<{KJ02l^qBl~0!eDf=Zf?ikkOe<94LHxOp(WXwvY%rT9`{ zZxPkw+oPE3OO@~G+|CvIxSdM7ZkMY%mGe?QC^qXnkm5732U2{$&Co>75FeI*1LKsI zg)K+RrEBkeKrG+5(>lVOXC1S9%tmj1SPE|Bf1%9dhc9pj-LhwKw%1S)QNLn(Uq2HO}Nm8SX5k=~lTpUS)=V9wZYER&k^R zt6Yx;LgNY&q?dh)I5ra` z8fowwUk$R)j=b+;vg5A3H1o7+pTy``uSCyxk=dSH!XuO?ZW!dG{Wc(tfPN!p@(+P0 zH3ZPfAPzgv@O%uotf5))V5WTO`e&Z=xA14RI?#kL!S}mL z4`DixSfPiK6O6|VkIS})GOK#A@XdH~TVmsC)W#GjIYBu1?{fy+q49Oqw>IB}o}GHH zoJn?|K|wP=@JZx&Z|%UgQez6tp@?=tSd#T`gZkhfrd|(75Mn|ebi&0^m1mM1G83iB zgSJI>Y|J-Z_ct$GE=_pu`pOMV0$3CwF`*HwY=vh)vZ0L**08wDLkfM&V%Xn*O+Vf$z(kCj{;L?!-3>hk}#su z3nsmZHS-bOVcFuVnfvzF+NGs@<6=KQv>Bt#n)1Mc=Q4SxpIN*T47Q}+6xfpbAHi7w z1uc-$mfC$pftxar^LXb`S|8oANgcuBv#PdR1R7!sXMC(#*3Bx&X?}x%8dn8*_f>lW zD~kphXJ){??EDXtd7aPex9&IL!(V()JaPQksx%$NUN~ukZM)q@McNUtW~P;*bx+CW zgEd3<=YdS*nD=bEt}%;*buV*;*X-=#nn6Oa1eU=H&#}VGwlY_{66-G+|1U#`CCt*<18>f1mj$1R8mbTmA z#OuS>uCGIs8Q%x^EV0?-vmSc_e3$tacoWdT+*u0FvlO^QHT~Ri@mq@XlxZX;mVRdv zB~t7~>S1uC*nfemG;ma5&wbcuROr6z20WuGF!OOfQp9vj)A3ch9x3~w!IQ~WK7eM& zEc+=e=T1hnlLZ>-F>p-7kG{+MFXc`=nRFeRW3-^sPA{CJ{d^>T?hLdGa}Zpa$!;v@ z#E+n{>m$Ba%HLkf9*#}qYjOMVK_2TwKJQ7==86_Dy>5Hvr69k5<&2OI9MC6<7jwj5 zBvnRL-V=74ioc78|Y&zp{*|{P@@DZ1{XJ>gB zG8&V6?&;&HswSIcxxwRJ#pj+^2iqzhM4LU_d92m%{Udn&7i&=NRa~>4ST^T^J z9CxLpt0KrRpnCYtwdOp31+2P6tPb`AjN7v8|9tUS+aY)CJE?UK5`_!BD{&&{AzY^L zHH(7zJCxdKWqTy=)V9+4iXxPxAl!~%C4(OCph+0^_!P#70fus%yR=^GtrKPJv*#Jj z3*EGGrHZ^!;Nu|M!>|(ccA3GGx>WQ&CYZxTZiz2JNrA7?@Q(Pg?87S0uhEjb4teHy z0(;{i4@Mu2t58zhq<*Yq_`=O5eRuliZ-*|>$r^T9XKzoQU=KaOJqavTQQ8`D??3QM>{Lx@NzXnybv;)DbHo`r-2SIVBrx*d;l;Xw=;1vn zd52yncD0P>6pBR$93X%RsO2(j^ho(1jc4_PH)JTng?0 z#AuEn1Iu_EA=gD;pb3u3(tEudv4; z0cjBO)Br|No40ma&mz}dYcA9m(5~KK znsn?qje5OQRrM_QnEphzV?ZlACGya(A#u|;LYO7a)nzUp-t27}_aFxqllFt9Twlh) z`9j6G&jGVrLN2hGFWNp4d>l~*R{HFgwLhgaq^szegSsA`$-l0sqIJ2R&F$^2GtIq6 z5bBFYZfB)(cM{+^j_L7Fho8K|f5iUmlOfgEfk$sK*7CXM79w!>eR^1g5x3_6UjOfC zu%lD|NP|r*`-j;<5k~m0-Yh`FIZFjmg|!=M=pso%4&LJM+lMm+&YJg_u`Y9&Q$&3TL<^v0dGR4EX{ONE`QDq_F<`A%FJtxsvo3} z2};iKrngCe8?l-I9|s=5l_*duaWR#pHmX8xe_i^pzw5%-CQyq`;+Kl8E>3;1n8K?B z9=As+c-*=-h)5yMRkr#cPs;yB$StG^DUhfSTnL4zu*GW03xStk(zLEbg96%UPMWJ~ zZT=JCs$WKNu^+0Oc7uI}7H>sbzZ!|F0o0TX(s4j(8fL1GSNRHo!DPLXU(BTF`9`|% zQ6=WyoYS$Yt2~(@{p?1hD0_NlMJuF%8CXg%eBEtAIV&))!E2ik6GXD3A2+0miZA~; z6!_ryY;KjgDV%Krcj_*BCsbT&EUDqTh>Qy$Vza8&{Vs3pEa#p=g82^CUMhelx(8;S5Q)z@| z7Eu#S)Nfy8E!k&B+BXKyro@usVIXqidT|>A5N-)9%)>;F!-bBd-dq~qoBPEE>k`t;KKZV0+^YTpL|^Vbc6y{&ZI=~7^K=tTE(8tt;$Zdv zH6elIKY3j*vOoD!uW(HrNvA^wik>M`8`1G!P8K44OuAVFjz5nruxOx+7%0YYWyAmh z+`%iR;F)B5_W0S#bWbAp`~+jxyrH_?qM@ipQAd^TBBbZ>f)D_1V;)yLoW?vL&BN)- za{#754eB>pf6yxXUmEkAxHYleK>66?_{Bm5`+md&(g!!Fzy$%d2Ax*b*W_0WHblG) zWum26S{j12npM0`sBj+}vT8Itx-kJ2uRKd33A-L%%`gH}KhFP-05$wUaWk4x#Skvq zHlo`qrEpJ8dWlyj$WsD%?^w`45AQGTXePsYq>V)1-6gBx$w^uD^2>eT zRgQQqkp9gFdU&{Wj^Mk3eIxY-)vf{~#7o^f=tqLxKB$(GLUS8kN>DIZK>^4{p5!2Q zGLu)`;>+h8FTbn#Cc$MWr8wCiP|Q}f{$BgFqB-&$my$VLA6GU4lN-gIj=)1H;hH$| z5#M@HMuA;9j|XdmbDsx=tb=R>Y`MQ=Bj=GIg-Hh4$OCwXnebN+q96A~hhL1j{aWs? zZ0!F$;Tz13`nB?9R$&x6V$WMC0k6f4ppwUn#(xmTdjVIk%P&8#CltTd0Uzi7XWa zlzQKJeV>lzNZ1p%BzdClcP?KghIkprQ@Wmi6m)x>2${avcR(ws<{QmCB*nrd=t!vq zVB%G$3Y|no6*KSnGgQi(XJ6uNRUdo^N*ehpqy0gks0FMc(;={ikRwhjRYb?Ch|o07 znv{};j|^*48A#NFw9ng_$LGQuzzIryfDbMM!`Tn+=~8i4{CEauXlY!p^M?|Ki&nm? zrFus8EgJK1ofRBoCQ1-vb{}3U33^JmrSCXjay;{EE%N$k1+Qe{GU0_32Si84+@ig= z(r6~2h|kWJi_wxAg7#}#Qk)XW6ZfIsf4O4P&^~;BzD)`0>mx?PaRFpw`)!G@S&0x9 zA!`bRH?w&v?*abUZg8I%4k+YMPe$K8v9pHes%&QR)!#q!JX&s{6A2n&1mC8C>tY}w zc#N*PAYS4&$pf=xaS3m984zGSvKSI2i;`3DSg_L3a&VQKvA(mJj5u+@OzPgveS^kx z-#!lPqMc}3OyO`5P|&qjV?p5T>I21NCtQi4h4)2YHl1T~N5JW`jK{Ib;q2OKvvro_ zHnA7xPBESA;KB*RQZivju>!u^Jc^7kyV*x#+z9l1vg2*RG#!PdxR_&kfy6QoSA%Pn zBEc9~$)wb{*wfF#(O-ylpKMl$@zxCxz3u`pm29S=uFR=R2CP;JY_Gc5RWg0pWkJKH z6>9yY)sCk6;c3496YYzqX+*%5f;`K$k3pX0Ah0R=8$zDtObm5p$6R9Qj$PxCJsC3@&zmxhtf!Ny0$*1P5nmpb{FJx!&s{9vOO-#E{_6=ht zndU&vjZNxx1pdJnhcsC*LHOd3F{*xb485-3J@0oIMs#nye6?~(W|pJ;W@vL}2XU&} zH69Kh78++Et71Yjb+Fs%Q10Efg1{$-7IJZiv8iD_xS6NGlL6h@hP|)=@KcolRxmWR zBhT~NL;%n*f|vmwJ8WXGu@qu5(GE%|3@#v)J%#FR^`Fn&57q^d@6`}>%aGLE9M+CmAsd5 z_n8{l_O3&Rq8CU42BDX~QV$ZwmhCPaL*|n;S`I!2O1}!v^EF1WkTs;I9(| zyL1S>04#K<`v5>Mil(ju$`S8gYbQnMiugo@Q+!PN5%!r!BX*%%U!j8&5Y^V~T4Gd4 zh^js)!Q!kDQig?kqNl%({rE;Vdc1!zMVW>C`pxDbl|)}rdf!x?=#wt<)jO?J zB@SA4|K$XO--m$)9vT*GByiKH?~bDHG*J!b$&(%gB37W&8LWNiFi<)QEfP{EIn^yO zN~l%h_o2YpcXNRQ-|+LMv!vO_^UEu5ZcpxmaSrZglvl|I&x*f+v9>gvA0M(;^0}L9 z`0(eKNnK8p_NU^@G)$8B%tU-7)UbmLE>B}D1YZ?XJ9QNhDQh{Or$wC9bJ#oTz1kxbG&+=O=b9So*y87ky#_fYQ?G}n@B-!{a4=9meKw{` z+6J!ZQ212EICqkxVg8N#e4(-K*`%A}F37rzUwYRoj6bY_W$f?~EMvnDcpyb|Kt|j_ zIyEK?eY|X<$!t*gIseJ1f6%D{MxCZ-KM?qFeX&}LAc*Ro20>IGr;tL9hXALFLW&p; zofxzrDg1v>QAp|Hf!_uryw$K17GVe}a_9g8N($JFni$mAA_jC4nx5LNAfv1#**%W$ z6dTz_$xRtBhzHPA0v@Dh`@dCEB*2|7NbZ!KUddG`8z^plR5umG&y!_HVjj%e(s)#c z`-F`-%eRA0NE&s{QmQ-;TuVUT3b`!WkmP{{tB>m0Q(_W9SVm<*}LP)R^s0ss`-pg6vK2z7#Z^- z*<(k`&LhjG;A8mrXBLa-4o?I2@?9%5>04JYe9hNu9{z>vbBZOrZTU6W9%}OTX^po+=c%d?KEFVTB(nksDpL&F$b_2AV%JJ;h*3=If3EhK(}c`k45DS z@}@EM6bqk$!H(}?$$`6H8#Uq{fAl(%&rUWMY#N@?oEQs4ftGoLnS*8Cs8pn z8li(+F0WbZmnFF-#RU0&%&kYl6gPujDJUdAI`?x)vhxECKAc_{X*#Vmc1RKqq6NJK zK-@TM`|!+UcBn0>>}=GF+Nf`B8IiBoRm(0#KD2D3Iy*NIl>goQr9+wkoL(DgeG06{ zLmT3t!6yg(aJX8Q{<9y>h6q9$58&um97qvniAPO>O(dOYzbe~gzWh+zNc}|80s+GiXJ|`qEw9 z3Q{<7H5Kfz=iAyklmzwHed|^7^9Xc5<%-$~eD3*zz7&*iT6z~sI3^+FahQq$k`^CE z+?ZVEyJCG6S!+^gI>f3m+bFN=K??#USS^3#Q0z;XM@9EDMQ06@swF%H{CjS}Fk@co zHA~K@FutE3wfZ49*E4I-4d9~Wu~IsB81Bk?0?3aBeORyMAHPU&&bEb1Z)HW`rS{mn zJCmJRMvMY3G%{>pqdC8V2;y^Csu=PuS90y$m7o~Mj4C$wQ7tYT1Yq-rS;f)1B{w+U*$y!YF%gJrbh87FKngux8E!_6Q zVN&4`QDZdI<;AjT( z=uC^jG?$U77o{wJ+7BgP{KX^Y&D=ryNj{ovWf$V9c=&5H2H8b0A|j9)nNi!WH0?qO z<)zNsY(Ilbmi4GEb)?}Ba*g>*>j;Y8Xa0#a9frDrIFOe)(6`EL_d2de4d1Z$=O$+4 z(h8X}&!JxhaXF6z!xo4R()gvM%KYhCLeIr}{q;gd=Gk&6GAh@c=i=U1!D=#s22_KV zS5Cs3Dg;K8DMD>wmAtK7O;adYJ3IM$t562h>n_zJ==MnNw(lT;)>o@S{I~@sIe{b@ zNgUd*d1uZEL;pg`rAR?@t4E-V-&A5M$&yWw=+xA)OY?ppNj86wN(_f6b3r1|QK1#D zCNPX2COquNDk3!E;=$1ULYg@_2Ij$;Hsotm06MGB!%4-i5Ff5!+korm^b}9!6@-WF z;>V5bWf~vJyC5cp2iK;759OM*o~6Cl)H>4=uWBts+1)Vn(B@x#H))i>)3R~EpiNgf z$nVt{JPE_J@F+ijaLSdkyq;K<<%DFmgBe<$`6|pQ!vRc5%1=UKD+}BuCT2#FVxyM{ z>BL|51ahEY%`1%`#*TN*OY2Ty z5y-ZzH8hIwr4^F_8wqU&-N*O8v_ZLjPT#-7Xqje0lITvumx4lGo2au`zsBE!sUy`ym`}e** zc%j!1f65kF$FLUnJbIz|6g>x9> zw@$~I0x=gjsbO%2Sz;*ZhoSxyDY#Xc74PC|zv~aWK|YW^-h5t=+GVFwSlp+>u1b74 z;auVe+c8(tDGqQoAo2r42EfJsGO`$6d?50}_0|5c@ekk;!Y)hu4~uWmWcoQ+n~st_ zd*c@o`&mMPsXwcba>Wr6`5|HMaAF|IhZ<0DQjq^R;r%!DCQ3Ju1^j+hYP2BImm?PX z&?-9Du&t3-P@b^mbNj(1^`c=%(|kY0D%c6bVU9&hRR%?>IYgi}@|w+ za1~*XKW%vjXsI5+Q>^aB6|ht_)ePP@?u`EWNP^jaTR7w7VihKjwC8&<*lF(2h%;S5 z(9;Si46-29A9@)M=bbRXqaz??>XwJ~pzL&khLS`jkUYuE?H(66k8Xq!r@Ia7!OaHF zPIL}_3tj0M6H#(z{@Njy=YPJ>2)sGHyAXeDhJY+;{c*e6K(DU2M4c4CmOz0W75NKq ze%yQQJkmmTfyweNsl1c7M;7?5!2Sh@ZTL~86L5^t9l}`xija1s)9fiq7TFhK=FAiC zsM7JKQ7l#a#6N`$@R0gg^Cd8${0;6S2w3Ud6(pm%|5al!y^#02ov}(r<3sc4tw#e= z&gF^2XEy{Ov!^ETH}|(;0BJtTzfHC;9I(F>J44jd@ygOxENMU^iy)t?Fi?yPrU(uN z6ZQcyH1cq;w*kjFCvF<0={J(<#DP%8FRdXzHpwxiWiM1FHir)mkn#g-dKhGr(rwlq zs7qVUTZ%qK##80iUFf(n*#23ZHT-c)aqe{xK%|lSU%`+TpjVZPM&dlUMehSq`0I+{ zj5~HACp9cK*^*^-D>n2vzACsEG)u6%JdmJRRg^@Y*M=6uJk;Rq#!i2K1_r|wLJ{zP z)4o6=aIo!@`L@9Ak71q>nT$;dRF8Q_2k-oX)mQz-hh~hMc)NZdnw}`0g6XLq6$?Qa zc3@lh>7N3%11^s((T-4~_iS>DTz+pUZ|6n?j6RuX7^qJfAcY-t zJS6~PkLS4O!_kEKuQ>}E?}kj!kDYav;ZQA~y?BRH+jz!mm=mQZaPpy$5+TxRFEs{U zNJk9mWuBuZD%WHqIPe413nt0^_$h2e=>?VDS53Y~L^|zV`^mfmv&@hsDh!7~ft|qi zUT+mz%PemKmdW!hTI9#L#Fjx3tkEQ5Xm3tb%m)eMPThgYJ;d{EAi|LKtnMaA=1x4! zZ$SxPk+B?N_I)|RcCkntzI!c#_YqjQ_EAvu^+n(W!jc;pcF(SJgu*27W$7HRJaO0Y zv;2Kct~?>$FZ5m7`8>nH)3C?}!dp9n!!SKZwN0#;jB~YUq}B)fo4MJR!ib0tc2FG0Z}jjx+*jQ@njJ6XfI@G->{UPKLnwaXQh5>F7xS2@9FGZPaDbQm zJ%@GnF-G41(veft1eGVzm9;ADuiRPUw=mgrKOMpa&uy5b(J(g>8YsZzj***gp`?iL zT-*-O1j`@GUNv>?&-Wl!%tM%G80eU&hCJ$~opblXWK&DJ*ySzE`;a-S@Tw1udgI%q3EPlFTvkiZQu#2CI#e2wekx+yJuCicyQ6OkT zI3yj8VxIZgK7F#HQugZjQQ{pPuic6Zkqh?0QKF+?W2TJ3*3pA}a1QKgu@}O1rhz+( zS#oYk!N_DgRit^dOA#?>MBJV{S<=NJ*x=Psw$2VNr2FC^uf|^G5I~XXriC`FD8b3IbF0lr-%}W<;SDexPl!a zxHa%60omH{TE3Xf(3(d6+1Dp0liw%Ynu_mIUz&W@6-3uabCVf}Hep3zA6w%hTcPTN zmIrucxENO=h6zBT0>)=T4n_ym_X**}U1GT?eHaejb=J!s@E9AutWYfy4u=s3Ye3xV zt#bPmjlzqg7@K0p%do_3;mvv!C!fo}wU>f?2F3LcoLHMLM(?)2A1|ma{n1c;QX%H& zi6+U{x6Os7yJNydK119q9BiZ}nYmqUKSQ6FVy|@lB)%>ZsVk>M2z{Iw>)5l zNV;T<$NIrBuXQtUi}`KQ*&RjtIk6BDo=aoDfm#T{7eqF+jqp@xwo8B|bctRyz0Sr#Je9A2)kz8l0C)?Mb8tvf6E zJl_*U+|jKZ5#!k@k90^v64epD))HReTNpzOg{cTaYJ(UjUwEP}89Y5P?xz7?!-JTQ z3|-8L?m7KBmLWV-Yj53O?J=R2dVTpp*s;O#6e0+mNhLUBC9jAEFK&gUQAE=fB;x6w z9xAg8Vr%;0`?R@BsP@Vvlq7TjtW~oO^OrFVIqB0^Crp+hRB=Uy#!c+ZYw>%&9amB( zS!3UQ7jhv(8stFt{T(jlOM-Jm7|}MCEin4S7SQJ#q?h1g3kKwLi$4$Sh`tW`f$#h* zitPBck5X6s$D$m3^|(fc)PV0FmMwrZIDcac%Fi8`_53xis=XAo`M7w&^zO1LrF{3V z-l;*xF*0?$kH&Q3@_L_b56pUu!VV%0w)~Bo!VN_q`|4h^aL#~sGrfpf-^uHY52cyN zQ*%DqFM1>{-StojNH-TephG5q0($h25T!UbV@cmag)G)h4SFRj)FClHCDiuLb#ZYWO=SD$9&jgC zW7w1((A0ok!$nh5hG9JI+bpEKf_`w~^N+qLZeo2fOLG5POK3rR)UB5vSLVQPB3*XD zgTgHk0@uYQ5IUHm`6*ds8Eg$F<&#F%u6)nbK3&=@7Z1&@T}i2CAd;OIJ*`2zyml8# zCM{Hf3dl4H?{DrMqSO%$#QwKOd5~A07Z~Z9iEtBni&AQUf)im@MuZ_9G<1Ls zJ9Gesz>eUAMi2nvLXipD4$DUR*=rX+ZyvK`{iMFYnr9Fj4HR)ezz1S1HB6nzwyaJ_ z1+?N_cw);;vQ;5#jE>M1m!5ofdhZkf?;xFx=7Q6}+pWQ+!rNeUh!1I2gT1hIu;Jjr z9l$w242T)Nu{|JF7ZTH68tE0P_j|&7a$zp42Aq{DkeHDW5%DV+4m%|QWdc&p2=F6) zwv4C35t^L&ii)uuk7$7%{PyQ(Xl5Q51vBX&92O7(i?&C=ZVz4r@j zM4~OUj*m3*QnE)GPNQnP2`~{Szb2EBSPN`m^oY*V=P&x6cv66uE;TT4@vN-(r(VTL zn4X#y{>lO&)dC?VYNq$PDb;Oe-IT^|L|!gCse7P#CoAOR$< z9w#AX#D68W72`*twIU`>(2hkN0q^d3FG;g4$I>0Y`9IDW2Qx7BVCZZg0f`Xw5zAl5 zqp}-W+{#rPZ3^Ix13?Kke@&2az4~1J*;S|HRIWPlx8tpID||1OUL}qgQBZu9ZUG)2 z?)6IJaC2N-Dd16#IFZmCQi@fVvrW64W;&5%xfja5f~@lSa;UsrWSw3=QQ7;Sb9WYLh3nqYqk&|w4Upddg^T8 zIQDuXmQ!5dtY6XGy%$*j2=GQ*vuQi6@v?(@+7rZb%+*Q~SbccGBgH8>JjjfBvFJJi zSRW_Am4=UC>IBzlKh#HRy*nd)UW3wPm$$_A?H69yiAw3S-i}}3%sogG0i~Y5R9HiC z`%Od>Yt~Sx+Vnr?yL9wZ9pX_`)LsLziz9*veZVAu-3|VE`KL8s7-OK6j57{5)_5fv zD^xL)d@esVYRV@6hH`-iUpJ`s<=IE<^{_)mWO{Ag>& zdQ{{FVn%>0#HWd;HqTPCm4>pxSYg%_CL4bchb_CI@Pd^CfIx?f;06MCgOL}dFO$?{ zuQX!>dp{F76wk6}r-e|v?BP4-u(oCdV+Cy`P=Mj^AMWz(zG1JvS?}%-f3`svf`NJ- z7ny$6eu}^LBdv?~Ch(~`$tsjKSjeJ;qkH{f^r zIg`S-h@Wu!5Tr9gDFkMC5s-FJ=O4IFT!4Xc3#`IP#Kef83mK8!$jg)Ww_g})aY++a z8Yg&Gd^;|7xkm@oHqCmVRd^VA0igJy6?R-Ipo3L-`?mo%I7h#r#bccVSGMIY#*|3? z(CTLDXm5NT9ku)Ee6V_W04=B~IYtBU3MxUM)y|ZSr@ka(bOTksL_tHbq}iGWYu=sx zQuL@wz0Ru}9E@klf5Q-{)eaYgIB_4q?3HpgPTs+E=JnGm0y6YZ z?%oeZs8|BU;Th!lDgeI^Equ~T%p6AB{_C*)1&zXI>!M^i%w@6IN7ZjrqI>Ej$~%{R6gvb#6W3y=~gHtisEB=iH^X=i$+h zN@B)^b5{2r`uWA%h#}ExU@abk76A&vk+>@tSqR2lDJmVf88>gBy{C2r2m)A_FtWM5*v@v z!JwOvDjklo$@eOdZd#!di77uerXhpg^QTj1Ky?S2K?$VYmf(eg{Cau@z!YppJMb6< z$N%jdYrh5oHG4>!wY4Moa8W(FJV@dld-<4Yv|P^A?RDPhm`=qC;xoq;pCHjPP}9~! zgw!)QGO@tB`9P^c{p@UNJbPitT4a3Y zbQ8rp_o!LL&Vk-%?-lMO^|Hu<_VV*HkQZwhB10HI^xw)6^wj`rWgYRj4dEl*YU3VQ zlvYl0hr4BJlivG#&MG2tZ`p*L36Q2opoax60tPgFAOKsy(=O<&%dak22I1ql zqPujQhy4BS6@<6IY=SD2YU-(p_xCBz2r-sH!5xxt)P|@gtSf50BW92}-=e{|0N^-MV}(RwxXPJWmbw zyQw--iU8W}^PSKh-Ji#|oyVt(pCpkzCJlQ!@89zLG~-$>p%CAv1;+5xtzLD-*+vX4 zJ5mXrSA7&iY^;zvSzt37ok-Laq!l;8u<{J zI99RaS^|$1Fn4$@xn2%>9w*#`UFU!2`W|2oNU-Qu4S^0Uwck%te#=x>l#ZB!dE-pb z1vW3dl^pQ@2(Z*XTkgPZq_y{mfGJ6wQF8J-j5$i$(PY>*KMqS z>pdAx3xTfwOYA8WV?XIk)!mp%guA_B{M$ev?E|`BU|WLZW7*^PGRHQo70|hbx~SY| zcx|(G;cCnWrjG9n;oFJ+Cc0IdTpGZlk6sxl;Pu2B4;$VCS=B>E0k{IpKRBtRBZ$5MDHmO{W*h#D=6sGXfnkAhHXwIuN>va`%ARQ&g|XjIzS}$CJ>zl z%3y%+fQ*4~0S(9)sCGSeB%hfM-#fh{yovI2{TkaX{;rC*9lD;x{ThU~KoQVQl^+^+ zX$T-Cz^F9rPy&q$qe2e`*-Rbq?FNfBZ z8S(+ZHEsd?96OE;og~!GN-;G)a(OE~_}<#<$nP;0f&VEiJ@CUq6Py zi6{+T%ZfD*dd$qMg7gqql0h5-ynwE#>_6O7|Ft#mcOUjang5^2Auso#OD2?* z+O!nHXM?>juJe}Uj0eYSV0qYbR07Rx051#(2|O1c8Qt%GQ-0YI)n7tS-IlPTbUnv` z<8pL;fveBZG&>afTspuC!aaiL1s<;H2f<$u$s!}*mNM|AjuPM&pROIn07Zg$UrfMLioke#{1p}FJ_`P; z9rb7G4USr!{Pw)orV8mm0R>hElw1|=@)1~)58!LkVZ55BMk}{umEOa&Rtl5b92m|% z$=RQY$Zfr7x(Y$JPhhX=qVSa7p?-H%0^qiP0?+aUUb$o-jr-*%=X0$ok0-&ipW?A4 zt5_Odum8+OtMx@Q@ofpx-I^SdGAzVJrU`YKNSnZ!7 z^$^Ye0_mvWsXy{C@<`CnahdFdu zoA8`-W2<}3PF{U#VOSJV&!u#1q2j=F-eE4{3Iz#&W;32&@ypi?1MZ*Ph^e#(^Qda7 z6mQu?$ci~f_=3?E79{{P9XjSm82|RY1{8%&Ah)1%by02ZFqPxG>6U)DO0RQwcV!*t zD~`{~>GE!AnhY+Razzk55{@Pbt|mdk*^~^RhB;Mz$mrqW_4+-}{Hh5vjaa+m%IoOd z+ha7$(D8w*Wev-}{U)8bFY_eY8Ob~N~{eZ(-20%w+vVwl>zhcDoJq&%hnQU8vw)X@ddoQ0yrp9El1i zh4)1w#UijAAWNiU8-lK1-Fj8tZRN;uO7PIKRp1mb2n@i>n&a!gF%3Zu8s5&n9_Q>l zo&EeAT%GM+kbT9_7y6)keOH^!NkS~IY1vU)W%VNAcu{B9gSw0Kfje4CELLF@g~oK)$-b8OP-s4^`;ta{RRw%i zTR$2$*zrNNfRGEGVhReX{&p^7BWF#SaG57%{=uGQAmbeE1S3@ z`FR-E&Syai&~6;4U;VY*MhdBeb>FLpQXrgp6eydB3XajZjCJcy#Tph$N9Eg-P7iR0 z98=pjAy>Kd_^uU5I!!2{;~w-y0;mmDPH^d4p=#aDw~s?3dLCw7uRrpw_6bSN%d=z@ zETSnCo1AR5m@04~w`qX(fwI{b2rRWU?K1AoHi!H=_v@IE{N#p3!?F&&>t@l2+m}dX zNib9wsrNsAg?iyX+uwHYeW_p45ED9&nj_8pHr#yF|HqQDcu2#$CGcTusCWfvgGz3c zzy8jb#SuS*ho}HMd$PI;p5d8a!6SK8=3eeIX5ZwX3XaYs_%zTKhFTbZ5mUU?^_=sf z)soxNBPQSERqY4Vvtmvqa+vyVY{c5fo75{Jip6)jG)!x+V`sNI`y>cZR1J> zu+@{eIN&kDDQE*nS*tIrWX$u^Mb=no+6F( zmF!@KVQ`2&Jh1S@MIV}c$C$>TZrCQgmFrl0h-~531RD>ao z>>-{DqBZ|AtkO+5sS9X7u5i-?_|;tWW>b6O#AG-4i*P4HLs}8m4j!ms1#}rm{d4%R z%23b1vkzre!p^#6(Fxr>TJ(^N@Mr6eR*dZMy$XMux3Cl7IxcJAQR9X)D|k4IW$<(t zP*@RJ)NUihMEYm4k?yS+MfRO(e|D>La1hqfFMV9-GT~^a3jXRV<}xJurcxQqkOi;s zBq20?qA9r2Hc?xJiodXcuMfYp%%?VKQG>T&vG_r@#8xMmKA~5T5sJ-Rf5G%|xie`x zFgwsAdiM=K>8VGurwn5Bwuo# z749B&tct0|_*TDRTL-)0+H13na9W|q-y2=DtR{6yi7Cu>T8ea+Lo(+3Tb*u$Cu4gJ z+E!_JH6-|$B$1_(f&{h`57guI>A7zZ#-879RDS*}MzDy#w5k3b__RG0cpsH0f>48$ zJ6rb)qg1=z`(EC>UGOV&Lg>s`N3xmx_vyhhO66HlD)r2Q$%&Alg~N@~>M)-IhA9zL z9$cB9;MXXjU9$MHEKK&iqn4PzpXFIo-89J+=RCx30{Pa6>pYLnH7z0<(cHNCg0kxY zn2CtsH}3sTD#BYzFX0y8m|Q;~kSn)fp+=P+f{uBcekd0g{U;n189(D0(i@fNpR`3i zUI6|PJIq^1H;MfNl~4lwo_0|bK*GCQYk-|-HD#m_2*;vkg|GMomK!jF5 z{+7MT3WMAbml_VFY3L9MQ_@@#Kc=u!8X}fbr*z6-JM{m-DBlQk9oi$bTb|H_S|NX{U~kOr~Bn|4CP`G zPYtKOJFc6J*nt$yETb5&P#A$F588l>8`i2|{leMp4#_{vKY58(ws9$18ee;<$shXqTBJUC<`BrdB0T!@fN9l$lh zvhg-kdH~p9Y&66Wd_!R28%%|U7=W0AqAf10hofj~Ve;YFJMU@E2zP5!+v9uVBZCI7 z!1MnLybTD5j!u0YhfiL2wr{0g~WWg1HbdJl{w-sS~GLc7Q$Py=o6zaYAT0 zp>YAYfHc^BP}J>208kmN0!p?@;t)bcv;6q<W&nIIKcI1;gwyEhEc>RX*0G?;MwL_A z@WSYmq;~J;iVdP^QC|X8FDpV~1M?`b3WJXCt>(sEN9He!U)wm)T^Bwl zdtQE$St@wE6y?EK2ms;Pb&xpo_q)AY1G%;l2<;RY>z^*Av;vj+xN3(g(yQd>OIyZ|dRg zU{n0|ywMQCyc1U&)4{y3h>8x2Y~rNzsrG*x;Z1%s>y+#Ba_L7Wz+s}(m~r3`4Vo`- zg$Yr~hz8`x{_jMIm9MT+-e=|!TW%QLI48RDsNNYlT&MF<`F##_Dnbn+`yYtJJ`kaC zrEo&s*qTvR*_$R&^g+@V{(s1Hb?0!X9&OB}y}-QQfMq*%w_ETuoxm-NV>N#t483+zQr zCt9aLA;k3QJ}86$t6eU+kM)$ql2?mw6XTam+bee5x)3i^4ZR$N1Ghi$2EaeiIS*f6 zkIQ`v$;ZF_@22=629~$ZRVJO%uKe=em1GY}U(tQ<`!0iGIWuN**D4G1J4|@I0+%@m z6F7Ab00BZ_0x&BFZmIuPdL&Z?jZ?S=U7_f8|ICWfr3dX}V2DY%q!06l?vNadV6a-4 zbu7;m>Q=ZTh%GLuzmFL@E2NUS%`{$o;dEJhpi(#RN;SX-Ua5y{TF|i-g#y70m%Qws z6NZH!rEUk0`bds{^+od{Ms8y2nEhpRx1$}xMRaCO5sp#=^K10@pfd*Wt|(#9kcCTU z2FzOwMX2R>lkJT@hO=$G);BtL$=iS>CbWcvfy;`!DKI4qXbK&907%j|73La$=4`4k zD)KRLPCD;9&k;B!=54!}6eVQ}$7&wH{B@D6Yx9BfPcSWwyW(v*y9$2IZhuM35_C4$=uWQ>49z5QFc z0S?fp;Er16rAD|&Ef;5EqO9081od5_)p@RljWaz8B~Y4cXQb3{*m3_m&Bs}Nstq;L zYyQb8lsh3*O0qyTtQ?T38~Bs4x|dg~(b`1V!lOk|oY0{QCfAK;3L44}cL4-@+F(^i zNkBAt@J--DHnX_h&$jkCH*bp~dQY)j?wnFy1Q6Ez1`NDSsKNxY2V6=S@GdRP-{*%q zp}JIJ+j9z#m@#OvR>HT=biofHIo9cXr3BentIFK9;`~kuoFUM_ z0Q8L_ity8!1t!n7S{fb@=YJB;;UPhVLC5&n4((rP;SLV>uB~tml6^ zp`jZQ(8f>#*QoRXLh4KH!PXZprFv*ACWFdZSZ`xc!8@6e{Oo%{UzbjL$AQn9K&^pj zyiZ09A9a(+Gp3JYu5-Myniy7%QUbFdQDHJKBga%zAG)cG@6?5x>%2A1CfX*27&y5n zgqVm0y<2^|&f!|pcr4lGve~JQDMX1R&#z8-zbG|r)rE$Q$SWnlObZC4A`tqx8d5Z$ zmZ>5!SEQ+$=KI`q*>AZQRP?T%4JWwewl>o);0Hq)P;;FIx9NBV+@|R!9;~Kt6B08- zD|nKneJXDal7BT^?y$=$qgnMdMeniJ%%w+ikBr`dFG->aHCp|>J6iuSr|-8j{r@(@Y5oPC;>HBci&3*g0%s`b!|!b zb4s}3P5kpf7a*VA2VvFX!O3sLXV>@aCo!|ex2BJ|dmGxu`0;bLN%r&Cl??-X8F;B$da)4^mR6aJfaTSkA*F@_vZx@O03sf;GQ<>#rNCXeym)EV&JNDh zeEN_4{RTlP&sXiV^uLR(PWVfcdAFgx#`5lU9N|}FLRyU|F~Lo<;Zg<&n9cdyMBrWD zxkshLB4K*cfk)}Zr!!XY`>XE8^YouOPm7c4efDkx@A}*ZcxKbta6%Lu#+?h0jTnfs zSaFFM))V-Twor8w)9}gY>031^>FYF%@Z7$~eG^ZtN;I}zl;z8%{aOjLL2ri51oR$l z06#AlgwV%{)?eadnooZ)|8do*;)KslCH?0uY7tHK7H`kk#$24X-1OMM`glN4N~!|s zvPpu?YFqzgwe`Cd))^37dGLS0mA1b5dnGk(j~wH(er$d_{_$njwF^j-j70_6b6>XK z>-~W%7Jr8;;57RUSFp2^!Lt8Xz;Y7c66~mCT{_V3Qwv5VKW~N+)?jOQ?bl*FjJ>G0 z?BB@N1iIKt->!5us}S3sKtI$O5jgS%4i_bYBh5!Z_3qGM{Fga5WN^*t_sjHz-5alo z4NesouO%84o2HX700@2C@*71ksC3`7HKrdzNhyEW7 zY?p|6M4sGUcJhBRgGuqa>CGsAv-K-El+T?rhQb^0t;gnbxbOm~0WRYW_A$X{CH!7o z`zf4SUa^2^4jij8s(CMWQv2c9ru3-d8>AgHmiZ8*}I$v!6{I=k&I1sk5&8d!RJc|12a7mheK$wU^aqc(; z`F70;bC4q(<(^7S|1I>T_RvxHnj>D-NX!esM1X2Q1!iGB8&2E;3Yp3HmwVZchD_xs zr!slc>BdXK>INnBZ0L{%zE~@|^$Mi^mEt#g1UccH)a@o0%^Nq(XmvbBM11T1q?GWc zP@^x$)2$@q?pU6@0$b>$PPNvY7?NE_8^?ZCS*s;!zXcIgZy|v}AD)~FK29S3f=;N> z@|~zWeiibaMk09Ai{$E;zPqZtmMbk4S_C9nuc|E}Tto%-ISiKFhX>lF4PGKuT@)Fh4W8x?cuPD|<8Wo~-HLoP|f*O%bSt)pcm-Uq>-^ zy)uMc3xopUiwq1B4WlD^7fX@ zQF+5JTdc^r=X)99^rw*~ED)<0fF;1OYYG?tEgBGU2TsvsblSb1c0SYl688e zs&A~6N95j*T*wdiJOgB@F4w@l>Z_-j1(lV_6L!*2?fW^}@ny@>$HU~FpwRo24bvoQ z`ZJe4e;~QS(qo-MeBT}Gf$V?0M1S=JKci=YzE>B2qGsv*Iv`ZQv8;U+Io>xB++`>q zIl1!e=E z(E-+B`zAo7dYsjRv8q`^hW5(6J}wMiw%oSF3p2Uht7wdLZ9hO#ItZLd zN^}^6W1goXrG2DkgK@8|Z(aJauRE8!Q+(QPbz)vtyZ!A|Z@^>dKP3~xC$^sZX+=f4 zPHsO*xW0rQ`^oANH6H~@k7R}QVX)Onx|Z0F+)u1+VRS<5P4sp8$wI79s!B&ZmiXAR zi%sY#Yz78%ROK-vusbs?uBGYg63F7?qH#JAeC-n(`2t5YX;PHG6;&NmEhG;}+K}p^ zsuu19nzzis)bGcS!;mBPVv$&Z$}_N2fJy~+`?mvj+kpeN*k#;m`cvW%5eZ7_07Sqnsq{#} zl^{4SA2<9x^MObrfdKLcxoreKHCjY*blvQ&$*xb9xYKDMz(U&gDm5a0XkaILDXyHl zuG>{nbDF4*uh1_uu1It~pS<>|-wM@jUbk;EV4@dj42dVfJ@P{WPajtTtjR(|iczKC z(o8`h1Bi$TmOcFfv$|;G%!4 zXa6?QQNW2|pu!qdQq!EV)8P`8yE;Q3W&CvQ;>CL>s*}YFht4W%lQ@-jN*&a*9jc%h z1x}|!IY-K{*aW!t^mo7dk#66SbTdn?%AEIPZh{0NG;2+Pqw55F22t43wb@VT^rN;} z41lqBRJ#O7yQDNm$h?|P&V=^ULBa0qyA7_jZYfqh#?>(AxXtyEDJwQO9dPhTLVn5n zB1_+SSvg{Drl!~Y>Sw!oN+v*zm;X-NDR>%?Mo$&S9$LwKXxdP4J^GIKSZK>tW7bEl zKfGw;F7kdNfF#Kl{s1f-T0cLC>p08j=>7qRrb9kOe;N%gtusq@& z%$Lq;#{(Wwj2#Xzjbb_=K7n^Jdc#m)+#~bRn5$;8DRVk$Qn7fmJa*qeZC>Cr6j*-I zkO5Q_00BTl0_i{0`O)(`lzWzw*YC&)Upsk1{$G1V z?hS?-xg=*vbhcOCS}T3vny^}Imm1T(R(g}N`Z(qG=Jzogka`%UfkiGifIET5>afm} zhwWSq{gVFbO5=CArJsSiZ;wp=`qkKeF)5ueP1_p8b`Pu(DlQUHNemC-4^eRT^$2+J zzW{PEOFR%hep9Fa=;=-dd)|>*!D4cEjVg^>$S`_;U7-(;K0-o>!CbyAkay#gg7DnCCwv2n%1;FTKi1v?EXws;AD)*Px{;O? zL{z$S1QeuOy1Tojkrb3rL6K5Q5EM`_kWy4YQW_LNLP3#Kl<<4rLHBQ;^S$nUuKzh+ z+kNdl4A0E_)LQFa_qrE<34eOU^G}C*!o3ToS>Iu_LcF7@{cS=CfrvjoID3D=_&DA0NJ0EIQX)j5aI-i-7&fUy4IaSd8f_0Osqz z#zzrU7mF12wC9`)eA&ikPxDNM%Ffl=z z?N3#lX?E|YPD8`3;ZAywveV~Mnbv^iWBgUjMWH|(4xRh7HgCYZs4OTE?fAjPy{SI^ zdu|izqxt7VV!RZLDZtQ84#St51zpHkY=+H}v`YS$!7j=^k}=LA6wIXc0w7*OLtJry zzIvd!X-DxJ4+!#GIR@5u*pv*2kI4s7YHcMP>B1XtCVb6K5f?v+Sq7kkX3@unOZb=b(S>i%XRaUairDdBG8F)? zEB(>gq&iJLI~5Bs03TEn6Z^bKZzhA&_13S6dOw>!Dx47o8*)E^&_5gFT8XGX)1QhL zv@5A+#+TxD;R=~A)nlnO3XTP7XwPj7>hwjAqJ22BL)iP4KMc5xKiUr9IO2O-x&2!6B~_X;W{5gtoSzQa$V zlK5(&nBvrScI0VPW0SlO(V217o)4t%18I(Ny>;+BLHckhD#LZn^u=}TTh1hjYG7`D zX#gGe2`Re93+1{pPF!57zRV{Oevr>|Mf>$5Hy;e^`S(K<4q#&%)BgH$&ObR(viBL| z$_i*|PqK^B89OJ3vQ_|^V$OcV4`TD_mv(zriS$qzU9TeZNWY+fwu>S(USz6UmRxkMHWLj!wsJ3HQn5mdoUgHOk4g; z=Q0#?w0l}DYADZ1W73_Wl zj9Q(;5ko~i7)tR`xT+7dbpwEvAhOsN$Pws`*43%+J!ND#EVguo;^vb!-9?_yBbGF4hH$+Lr)0W#@P0fI%^%5q6fu!LIW2hmn3^g$AGv@oW^s2*J*mb%bADC2 zRd@DhLEvNQ%WZIITcjN_#x%KgLYc#N>^TyEdy-Q^5w1pR)gk zlF`D~=f@EN1w{X#y?7Uxwq@&PKVJ!sxj2Di+ZvqBYxUcxxP;8A=%TCMUO7{sKOD+k zspe1IMvz7TpffiL#@zt;^sl%Z;LVEwJCDl8K}wp67`f^lSeB3kYY7?2;Y&;*SHc~&gf-j-NXq!txVkS# zWnHr^e^)0TI(*u_`LI!H!i6EHH{bN(I9FdO6Hk8v*CLwrqb_2{8{$YfxkJvGCDgl` z8Oc^E>LQ*t{v`kPmJ<7B-l2oLbkQ zqFA_8CK1-)YWL`9;o0ymexp0rLc3Gc1xO&&+srgvhynf^F<=K>$!Ronm<>uot9-pE z>`TwPmNLj5sP_&N`!dg({OOw#tb1(P00;d*3~TQXJkN!vKM8&`{(5A_@?YNH(`3-;V-N95@R2Z&&1B!vHck z44{Z50Un6NMIuBxjg>r(cn|_vDZo1Uh2%s7z+Iu{xexU`d=SU%FYIQ3_oTqZNcpO= z?Zb4-_UMkbrp?OvK8VQ#<1T`Ii-&U5Zo`)`hyBx%wj>bc{acn~zY`NC^@y}C=)}Yd z6%reX9jZGCb_dV*rGS`{{Nel2xdjv6!z9l0ipAYEmlDoaR1*kddm&H)s#6N^^{;LC z6oy0rqQ+Gfro^v_?>e3%nq2*=I@iO(2+?{QGE++bAUq|oNQN=426rbBsEb}Uqo6UP z(BwQDOZ2&`Ir;+M)*WX0TCS@h7loPDfa%!B`)Le`Leyg^h_X!TUpM6)KgFv=>rf^u zXdTEJ6*IiEeDUc@S41|-La_jaFQA6f-@%vphK&8)^2WvLH-Fc$MGJKje?}^uA5ed= zQ%Kh#k9sA;hM5tz^XK;?U^tF{Yla|%%n1EhV?S2cNroK+oZv08$@(3uBPPjy$Ld-G ztvbAsB3h?Lc3kOMn6nDrp;!iIFV%nJ(N2{(M7STTTdl!&Frok*4zmXI5G2SN7r^W5 z_ezh)gfbm4s(gCJ^|D(iam_>?eh&S~cPEy#xNUI(ya_Mtq#?PN@assfC7l5ryduT! z5F?2Fey7~Q_HmzoAy=hG=sZ&7^Esm5jVZ{jiiaSY)g*r*mn}}o85lr&YZ$W?hhQ*5 zz#m!L95#1e=g6-;9r$~ zCP20|@v)L618X}|&t~)4#qDLstE@YpLW4i&m29JZ_GI!QrpYxUuU2B$yeEV;N=G00^#K3ZaTQFVE+RG}10Z}PSOlQ0s@M1v zVt&3-zT0}iug3dP?jfIt)FKZc5I9ib+$lxDkn{50EVrK=vKn#aZf{<5W{LlhJg{)4 zRd%l32pgch3FcM5Y=2&>1@S^M1WylJTtzo?GqdL42_?&gzNU5~qudfrZgf|oH{=D+ z?6D2wLI2QeSGYFZAbY5xkWSuuFjjc@R?erz8KVgDy5-|>J>}bUaQaMnIG8q9L3rn>fVLMO zZpld;SX$@dvVMXUbabMGbyv*U@TYetTGn5)Xxr;-42`NAyV%^_eH4*F4qu1` z;`EQ6eL+`T<^qDCPHD6$UqPJ~hI3Hw1jtdE9WJLCY|b;+jP_<=h=|n6 zOG}Ojg5Lx01E>ZSH$UyMtLkvWFEVJ%Nsf;EIk4}%qm3RyC>aGbAW?cbz;|;Ry6>nJ zvu27v3q|kS?BHANEhkIkZuu6=^gfD=c$&EaG3j7joUq1tnn*>jSRjmxRPV}U2o5(= zz3cvS?HS{VfDw`ETstqp5BOJ|tAOw?!I*l?t)&%S`S>vdsUOD_pSf$>)Cc?w%36!{ zCYMAX{t&wu0a!4U*ay&`t*FbNtSC~{{s%0L6=H-szNPVI&9c%Mfra3}ach4Y(fvMP zk)!B+%q-|6N@5%z(NuzX{%?Ujs*swvXFsy9fAg|#CxbcR>`%TMVPtB{TbkD_mxd#IuII>?L1ZnuI#E5S8(C2XU1Ra6gdRt6p`1>f$I}bEd7-mvhbGGyN zk8}y0ouG>ZX=QCC6*AqWb3_fLq(8=2={3#9cNbEIr5;{E$z(v935T>8FDl>r4X)fPBlZP;QzUGR56UoS*QZ?r=pJ&m~y_36yGe(CFdFd+%h^zw@ya z94?&aNzLtWEo=90JadENJ_oHLvl#9b4I zvna_~pJ7}au|{~Pu01b;zyCAtMF4Xo_rq)Pr|h}qup)OA1d)|ZxQ+G6LBxeC&4CCB}vS6Tn+c}BB{+RT&RQS>*&3`V5{h8a$4EW)` z?F>Obcg1j;l-kC19pdo6{gKB93V0pp<>2V#>gDLb$DvJ%0&05o=%3r@Wz+k*CbYLl zPQP)f-DR`68`;yx35%um2i7d!))pfM1i5R*zxj?y9`K@PM7F2wv6U zy*Uj?ffFb^S@vV6|4^C^Th#z?V3BCWe}&HY-wc1;JhR#R;r_{fqr~)y47P2ykDsU2 zJ`x`{5aCyZLuWHCoPmI2XJGr0?siom5XX>t$!m@fh23d0J!Rq};`D;w(c{GHHWrQ3 z@dE?fU4THS1B-MZ=Vd_k6q2(9Y&OShqsXO$ofpMlwpyBRUlN;;?6_n&xI>)ep!0(* z?kg}n*2A#P4#tH$a2XadD-J}1oF~6!+Ao;JYM_!_?9JU?=$DEW-mUkTSti!#6w!r? z!9C_+86ee zgSo7Jvrb1zeGiPYroilt$5% z$O3^;E`$N(hg-mOApthRxu7_2*j1&YKJL{C2?Fj=L6_&BZl7Gc&^^Cqez789dyN1r zs7@008e{~}n*HWGe{kj$$j7+eE9b{$p?w)>*)MvG^>uB&AAa<%yJy|!xQz-J$0-Qj z7;ESXSGak(veNjcqZ2I&!R%F2N+#y4udF&m^K4%FzK%U7ninYp&(<|~wtVrft)XF< zyE+@zf~6&KNhWx5ejm3lr(G~$KQNX6f9!s2BYzyktcu?y&ziK+nB=cubi``)!leX=v7#z(LJ98-?F z@+j;CFfxF`jDjM^h*>v)i4l27thp1q>(wn+&v4QsAzZ9VHrd+$vcp<1VkSGI-ox> z@%h)>#hIfa)K=haBc{AGDcyY(v``1j6{5o?;owv1cKLZC9iizG zF-==H4Z+#v2v-{>fu4dV5K{@}j3rQ_1FeMYNGsSeAqJ6A%~ea{gsh#@oK#(fpZN;g zdQ2F(8Jt9Y7v7*T0*esF^E!Mp!pdeaQ6Gt#art^U6kQyq+8t!)*f7TAx=Tes=-m+| zmxOnhTjS%?Zk|*Nc_2ao%gq0ga0Or}#4ZhT7|rlrs@xFK6{$U$mKozIucU+`a|=+B zBLbmRad0_ow!t6rUrB25#zQaqkpkb>7fLZ7#1BysRolC~JH8oEb(o+)HaCzHz3g>O zdWlMT-*}rhfU*85NnO3ZUv!Oh1^;Dn(xdST>4gFfT~vBj4jk-1u{do4q{Yw=lb4Ba zS8TTK2fj9L@XY>Gj7t|0o})Rt8r}(gc)n($zpJ_1^jP^`_Hf+AmxuBqjTpp7aJEYW zXS@DM(+$Rbuksri9l~!&%gzd-a_EWm&2IU5mV5E2?zfF7$~$oyU(K*@{HxuUOyMH&<8h5NGda~IWbu}E z=^R}eZcXB6iRJIY7`Z>d$c+T>;66b>&kTtNAS?z1RBY}P#Q0H7HH!8-JwlJQTIZVF zW0Pa%>3qAzxWNg5o5mm)Oi6_R+^X(=skQ|%lg7x=WW+_?NjxOLuKySM+aXRcTObly$>`Gqrrt zQ|CyxZtDKT674z0M|e%QiZyzidZ$3*z<}Xb;sA;ErGFo^_xXz|Xwc?bBPwe^B^`P& zw}HwlBKZ|BnLw(^(*YkPHlpAtA_!jq)HgWv!qKi9Ud3k!wCCy~c|R!{Cc6CQgk`ng zebwmqZsHqtbLmeHWN!AS9*+d9SC1p`N+KC~xVH#?6*=^$ZV#g+jDAOzl{YC^oPl>nv7IOH;_8gGen&5RLwx+aBCm>*gj;R!I$JAdfgiDB!1^k^9 zQDora{f~q{0ZzjI;0K;)xf#5w`~$qNbfjCaJ`g`Z;HVt0)Lppp>VVF9`VF#tyFC*B z^AFnDX{Qb1BqB@hB{5Z+=T2oZhfcUWf4bj36=vj43u*dt*+ql~d4D=ING7{16GJ+< zOW_?q9=f_klq--%gaP~_1_5B>9Q6wcB$9}KrA6?H{N5%IFaoRa7a4#XkO5vi^a>wN zK&h0F1lMkxK12V&~Rc&LH3(^iEzPr)5P zfn&4h0VQ}qg?*O#*KzLI=TBMTD=GNLj)iHcXT-@SNAa(!yKTt7tN0)}qg1O7F;!x8 zZ^2&nG)9Jy98tzQV>s&=fus*yZWu zAfz3nzL}L1#uAzSL5=5gQRf(A#TWe#_<8w(JiFfgPbh(m=n0G^FHCwsM7;q%@IR=$ zWoS?G^_zcDtkHjH^zngID``Q})oK^7_qo)|FNN6X;49EV>TmgAq?i`qmE9QjFXP(r zce?eqb&hKHHmI-=1t=%7irCkC&o7MxVl^i0e_fw|hKWfl z=`shPWIlwdZGkUGs#8w|m&ODbQEjs*nFbh^gs)2>;z`ufk*6*h#!(j!+Oe?nBz9BL zak@STO{h$nWw{M8iDDf2vB7voerPyi`;)k$-e$Ogcp#;-89r|zDJ9|Y%eAfPBQ11& zl8KMj+PM~UT{w=)D_}f}_xANsm5m>~ytJh5j zfcK%r1DhViyb0Xf5h-c}{o<<71}6yh*%U4%qwStm`&T4a^6E987TS3C@zzKS#=80) zxP-l^;gvu#YS^VeD0b%{8#OT5;CB8ya*WoTa-J=1xGWi)6J>PH-YRQNos%^H1U#kt zKKfs*1(fPGrNCHg$decZ=Z zl&~es$3ObBSkQZb=a^Xm#qK{+Dg|6nstB0_5h+L$A#v~-gaQD2C?sao_5)V;$Y+f0 z;|o_3#XoQ9gcV}0uwEC>=ZKFUyb<1g?RrGPdDc?ko_W4fdVo?bZ{@CX9eGHOdCu>^ z@{sqA;{!Zw7@_9e(Yz0H3rD8a(+JYD&{qUK9;>uVq{3nbBBQ7c1IYKeJ8CmDoo6CN z)&GUeFch``)MD zc9bTiYWKb}j)jS7htIumt5d1Srv0f#=Vn)RVR6>_bH~#M1Vi0|TNEEI()&oCFIv4? zbdS7O0y_L=DoW{&$LEfBxm}do?TOo788=uTN0c=g4<(W)zBqiAh5C7q#6T4n`=uO* zWcQ^6ZQ1j!1rM`lOelA{#w~bNU5wh*eFR>-6@KbTJ`x)J-fQ4KrwRRg`rebbXJ%^A zUm144+ve4TzCc~Aj7s4MVj8coJWFtbq|aMVC0l$FPf}%XDu}JqTFN{4l})Y<+ty8X zbFS!btZ1zO-wy^;MET-OiFGHgoMoJ_sNqWT@(7%clU}HXMpj>(W00x8Lpg7$_%U`i zmDulb>r5@unu5ON6# zsi=Uz%phS5pM0N>vaY(v-WygBDkXJ}KhpkIdywAB+aZO2OvL_6_8LTf3^)^j7pNoB zL4qRqQGyQw0sqHZ<&?_J_pdRC2>HcJEITJW+R4a%`I7G@``aC&)(AR`-W@C*`i~(h zbekHvlb{%}CX$~|EeB4-?@BIC@sPkr`l42%o?)+fFMJB9@2vaAYhil4si=gb=0s7< zPeqW^a&&>c{6RvQ(?p2kk^ST02I0jgyz1E1`?jmj8&#y1mBx=IT;VAb8`(L{u)?81 z32q-lauEAq2)smEF^Ieb060cf)xRKK4kFT9*t`}dhY1y$$Z}5Kq-w~s^;WpVK?7f5 zaFTFO5HH-|!pRT47uT!_40EQ{zde9HkX^YZgT-Pl^ev1WtHJ`ldxkl;;X zz$8~eQ-lxZ^fK>#$=}W$$f5rBP>Xxjf%cM5Q$(BWGRtk1LwC_Yrr7iukSPYzG0Tm3 zYK@wKZq**Cm zSmAWlWNm9kR^s=YtUzfGl+UiAEjAiHRt6Itc4=RI@qVt`Xk7UCn*gZ;|eE+=X*@4^t%-jAu};f3s<;SorFIXgM{| z&8w4Iw|*wwzr!0zXrP~QVh8MbkT0;f1bZWYZY~Qj?tRGNA3^St9M@V2*=n_*XK#)$ zy|Ar2Z2NnFHh#|QI0CK2e?D9;@l0f@LeZ0wFS^Pnc zfWe*s(wlBDQjvU_h=Dx|D<{~q_y?PcW18I+k(>0a9MNfE=M1HYIw`cVY`m-yhk13o z^{6S2HyYS8<9cAv{&?d4A64XWg_JNJ=2?R(Js7`U9lvm9%)Ey8(aSf?wktm~3ywH?YcA}DlH7Fqg-lO5X)|=H1rAOGDz1n)0zO{dPPQByr^ry0Bg0 z28~#`>t8Os*8O=WnO!rFT%$>@x$3OR>;xVENAYK*Ky(OW@mr(4`R&C6(uTE1=+jyl zA5=waA5B>OGNyh=e2u_qhguIGyw#i?xGUfchwHy+_My6)SZlrVlx?%wQpHyzTh~kV zyn2D*hLj73+)wac&vMvbS$Lk&)^YwT!>NQbMaBZG7hfI`pF_zgp*4M;H9dZFx70n4 zyOL7G#Uq-2r!eerFnkSnC6AM=?Ugl+Pqd`yj-5={RtP>EQQB~Etm&NeJ4R!O^E0Tl zw7UpMaQf>Yck!#y9}=vCA0G1{WDJk^CdJ@9p}=GddcZhtnb5^1O;mVXl={OV@3%Ex zpu9^@3w%@L^okE2qV5B@?LMuYuJ|OR&ruXgkaYO0)#|tHq5gj1)kN>i<+~58;Pi?O zjH1Jh|L_TkH$Xc&Bsr4(2J}OiTF00NHZ6J+W7{dHGLq(YhH1CqBB6N6CFilpXE|U` z+ht#gM3sg>AbUYbac2D4;>G+hvDfzafx7y3l78T23UZ2^z!njD^UAkN zu~hXw!xFd}F($8yUHZxC;jSpO4Fo)#Jb-|QJ`)}c0aGV}OA`qKR%61U2%=@_8l_qO z0jCzpM=%;sG?=SMofnH$+FJ#7?*%m~f#-PSpnL!TYgQBv4pknXzzWtGYE+=szGr$A%4q3P1{ucv3{ zC5M*RUzBRS6m%(Z6SxrFKX=+Ie5a+n*-A)DEk)l5#&DE;NWzCC%pXb&OqLr*JEr=S zS>3Y^3ZSk2WDz5C@68D_mM`+Gbr_rD*duuQC3wL8Uh^S=WsP1|Ir*KwdD%$tN3Gt0 zph4S9Zz>Z5>yJDRs)Hsc&j6CBqikk4s@j_*L}`kAFIICX!^d&VC-5U%#Gr@Kjl=FA zcEZ0v*NcX&z&^EQ0M~AQ13s8+eU-bse#Mq9iDGyOa2M+(!|u-< zp-crHqAO9O6KAdp2L-o^iAx?SGVE&G4vt;e3mJHhdckfiZ%Yqjvz$_cGfM?S$MpsnA__2Zi z5$m4^&z|mPMBkwv%k>)AxR&}utRz2=+|xLcq7Lk7y+yF6fv=<}i0B6z@d0hP&3yR2 zJd;&yDjh@M{@zh>PnWaPGcM$@<`qADog*K2sZPArfZGA+dV)##`b${O=XXOo!!Ji0 zXJBEu=>J}VKV&3Y*+s_?tQh!Bpoj7xrDv(ke8ph*))|&N90ojJC4V6v#{WS){=`YZ z3Cp=6krISLgdIgh#FdnsL`B6U#iS*b#H6I993@UEDhY{5DN0ER3E7>pcMubkt2e@eA@x;Z{Zk=_B-4hMO?qVq0ZoS0yIV7nWEFVbsGEdS%_zTe|C1(wue^|~S> z5$}bN$Kes5j)xp#xa;I11)F&sGVljG5AM%&p=t0qkv_A=P26SpnhoY|UG|}@MwddL z^U&v-dedlkD)a*leMyYNb68=U7OsE$GmU_s7Ra1bA8eyNnKWjq>|(p>qgUYik>o_T z-Pz33Nv(p1@ntM!G1^7&(M5s~umGh-s_z6_JGNd3F=GXDDnAwjLTb}f_F&8FBAG1^#KFAW|EZ9J01yrOrQ{%U0MK|~C5KM`PaXugsV*(iFxBpHr3<%Q@Zh)~)@pwi01UC>B!GjH#veSMdFnpCDI z`HAaRaCJJ9SUC!Hy;Yrv_e@RGsNOp%zlrzd@kOK7PmjQr=x(thh0uML-F&rW5j%J~#lUoGuR^d?2{%fa z4knB4(cxLq;gv6MS`0!Q+Hf-d<_@-#-)D~c+^3JP&TyAsw0+w?{keE-A#*aB$2^M^ zk}km5R>RqN4-9DHQoh=ye>OT@-ZNXO<^$TbsfiV9x;>yCKmP^8{#DfnD7Uz8!JjG( zfl&EZzxn^Y#<9tL=4h15xg_!7WLcJttHCN8-DGp9trfEc#@u=XhcP&XVPya`jxC<* zYrJG_^~LM1BI}Uo2_+# z@4nHIv@THRMUDzP(AAOPF&45*NrsUP{2ia1yWeNZqjMApa2A(n<^tA^A`wWv~ z+gP^zw`Wba2Djfz@r`Gb&7azAX;qB*-){naH!L@c4JDHKF>JTV|Q86m)Ys`trTS{Mr-Fswit!c2Z zWIwpbiVkKfwmJdaB$SqtHlh9=+!iX12+@-e-wfg4k~vDqlo}a%u#$XUBtnbk>>gW* z?T=2l^f6zRk!E7*4zFcANXwv8sD93<4QdY}tV)xH3nZ4e!~Wod4yRxK@JU_A3z?I9%k-BUU`5 z%oDmep=k3uC7EgP!(3b{rg)XO-NZIVio%_LhQ86825a>w9+!$iD&E3XBL0o0FVIU+ zrZ~jQ5z_i>Uh4k5DnZ7VRVw35$<7lK7u$t9fbVG`3gZCC=@?)w{Q$)f@tpmxbP)8m z)MG39&fhBZ{{FUwPHfA)E9zr>lN2u2X_jqg?}gGDwaAm?~SCn2wZQ07FYQmt&qi zS<61_kAH*O?v|F{{T~@~Zv8L2=KUR0y-9)JYheb420H2zV30q^`lLb9(c$Tf#{KW; z_48P=XUFVcNuE?B_i#C+X>_5Ckxv>NRC^9!R!sh|fjPNA3kjq$?)@$mL41j{SNH<1 zU|JmH4Xsj+4Fo5W;A$>tiLTL_3g#%@4$*!g=VvN7NoLG-dAEq;+xGKIL1zziIEga< zw6UhZFu`kS37h19Ex9n&;dxkg@R=Hm@D;xdEMEX8a{<2kOB%~c%hWQJ5s4u%BTf?V zWFrZ{!z5mKvXKlGenk1cp#pLh7a?83n!ZxI-3!ffCaXjwMGMEm(w-{O=CK^=eUR7Z z1zL^hVmw%}=l;yr_=oNT|H{hPZz)(v$kOX}TtOdL7B}l_;(__E?h=tDMK>20?h0qT zon#n{W4f9et3(2}sW`^c4J0P@A3`#65F!ERuv|KLu5Nr+5x)c5XN_O+hYMhb$mntx zA_rpSqx$(cPg&$;ALNHXwOTva2o^}1E&EP43T4C%-)DamZUHnkxLV873k34E^nj zRq=O^Whs=V>*ZILS?spj1lCyA3l4hK$Kz`BfSmw?|JNSNn7`z@k-9SfN3I)#*8-<^ z_w~A2Uv!2kz#q7;){WR;`O>cj%MsJyy8*rKFk5^>fP~LA$ncX;N1daxKSU{cFr6iM z1jFivqG2V|29H<>dND(h|3A5I9#bDHk`D|OrrK8<8|;Ic{T89y#Og`vF)!fco2ygT46=s6V)1_ECQ%xb!cg;VoW1;qOiDuhx(0oSAt$Fe*^Q zTpmHpUcoJ0|EcB?)qeD=e;JPYeh0cp#dHAmzr9J6UlLoiz(M|o_;5{UpIfHq#yh+ zf(u-=XAbTgpI?M%Bx4JV*psa5Uv_&dDQLM4{_JyGv?};&mk$t_4UwCXcw7fk^pXjA?&gP`{Z zQbr35GE#oUS1Y2GK}B$!+|d8M6`n|*9n;yu_l#%W51L=Q00yyH`1LrT#x58_jAAn!EyptQ4^utL{%Rbr>A4Gc=EuXeo;?gHfE%fKiaU*1ID&;t*hl;0#B)Fb#11 z=SOxJl-M4`Nvo=oolfTaaE(4=Xm>tX=OMoC9ZtVR82ZrX+=o6YDDXm-bnDz+wK?jH zynFAi#`|(^@-07}OQTHY?e}sHhIS0(lieI*E!*sJ zi#0Cg#HLhm=%2jPW<$013V@`Vj{ryths96@=a_Mgeem?$E`}orD+H5a(xAiK zj_-TbhsDy*3`!C|R8Fwbo2!_JYkkc9fC6>b`=~r4##|Q52>m(R=JLme1FHT*nGT2W zP7stw$??3Q;RoE| z@F9YGVe1>CtNVyTWZynjjw7yi#MIppF^jibUY02BQaL;Mw3pi;$o1_5@NTQ8V2xyY zFqn6_Zo`BjN;+3g$3AkB(|;CUa)hr-m1?$TS$>$)oUnjy@>qBa_ytE#@C(&?m;k+_ zLZ93B9A@XNd%Jn|?skxSUwBCJUW%^h)cVf>B>|Y-15J;Ng*vXB_;J8& ztGX-Z{&2)qUr)y?A6`<-+)t=Wy6yfQd>`jJ5Gmd`4YLE&ppjc@-dbBr0_Hk#R;JO{z#^bU`BO-98>_#?=hi`$D7u?oC-}eKF}F@oUc5k=As_|;j}3UvHBfaW zUWk*rjOIs=PVZ^P=P!A~jGasfW>_D^`GhuZ2{@xRbinsDJO}3QM$JAUA2#!1x^*(pNx+L3V+`kv_VIPOlNA^AEy-^DsQ2qW^DS>7 z_^8!YAV(qsl3e>)Ur;-oNzR+=AN|nKNrP9+!ramJaVzEQqor9&JFnvoXXe=CYf%PD zLPYw4xQrIurxPj8rLW%CzUu>D6xZ6t^h@9RDw6iy$W^%)$y`h#>zb8`iWmv=vxEl5 z8>1u_gU3A+he*Zo?U622VAgKTM?Net3hcl9Sr)A;Iy=N6)o#gsM`(7oLCRoK zfCxT%OYkr_iFD-o2cz7y#in6z=MzUJX*oYy7;=i#h*7)PDR(&vv!3r3K z4D_jjqX?u+8I00E!ksP{lkVKM7CB1by=A{v zu!ifRkiqqU7pKj(x%0z&Q!OckbH-!6Y!@8l@??yvZt{0281f7F;$fUL;0+G`V?Q)R z^4kDn)Su+uHb=gDrdXIG^<>nPm|d)iynL^`Rg%)zx^q#$S-@CKfyV*~#8O|pkk=wn zi#IR1NKrVL+-3kV-2BXgD_I8Qn*AE&{pzf(CYLJ9S8RREd$K>Rw z^oWq|`GU9V80=39-1PuSNk}zgCgjr>`R=SZ+Wi@+a7Tx%8uMuAO5e#bjMplB?BF9j=@PkfyDxsoiOKEOUIttq<`e?^1e5rP z-V*VTaNwy|1X$PpINT7OSTb5g-Z7&2hKAu=kk9@46ROJRtOQI5FuFE?Y+w`wNlf4) z0wKiVFqXOZH1(azu)xWl(rD0^-NA)DM{7#Yv9!@^*81(76}-o%7y&eJnLNM(%(oSR-4ry-1V<&;>zB zTFAU33?C(WSGh!eaP>a6F{tBkbSCMUepK4F^qB>hMK@3J7pnl1JrfCp=run$I;N~j z{OskYX^QzAt1tcYsF^3$8-GOw33oWj31mmHBK)2uWLEjCHYzC|$&)piC(Kiozcfg5u)hl9H$F>_nub zos?~*BqbeAiHSQ(NGORoDB4O3iQC%?*@`;Y@o}iy)|B)81>9rEY9l)M=xtW$oXc-l z%DpPA8e_W@>C^hA&!h{VGC>q#x{I;!!`}TvyJAV0ZVV2)!$RmI+Cjf<>Syy>n~ti* zP^#*;zqc!vU;3+1V{G;GQ1y&g*U$cv(dS<5=eQnGo9{=0k$`E8Yh(;cQL1t@XBVDQ=#V7{o$fSpIydabqZ%^8Lu@ft9h zkaH9HDG9t?8Kk{h)HP3A(8g=5dc};||M&x|F3{FV6k~ZDI|3Q$5#+1GeS^{<=AEVE zY(pvX@}#tP+mB1wPw_z{=0?n_dF{CtKX2~H$6$=F06YFi_mim>U;s$SAXqHTa|D&s ziGjtXNBQqlP)KopW$R^70k6Y$e_wA7@GDs^u{o|V`059A=nB4I4+;`>PRboUUFJUd zXhZjDXEXo?wKrh*22CWhLV_6CeN2Ea2bmeCB%gw^BehmB_(&l%klg`w#?vXZvR)N_!MZSdMxI1-1_G1c<8u za|_9JQ8R*(sjv52=e(sg7>%_aq??+ACexpPekGvQ+*niQiaK^1#Kjg7a9j)=DdHe_ zAfpGRuA5NS{gX_m_`H^_-Z*i^>{~or)hVkEt(38a+jz@HoN+P1u4`YYlLVfxG~KeQ zi|U7nPlBLazZm!j6*`~~i~FUU3qP(NAb&H#dt|;X>v;9KkW=5^1zC?a3Rr7i$_IG} zD@FLdKTv?>7U{IpvbIi7baG*X+r4_L=HPBaOBmr{zmpHIu1ZE(f|%FsJ=h4^oN+ zmt9@|e$?4&u*Y&xI+2s9EBN{R^;dp?)8^;}IBggOb9HC@id?W>aq9|HYqsih89!Tl zxC$AaPGsh{jBO5BR{IPe{<+o-d=rB$@VGM9kRfqjn&@u4_zQPW`d^;)RNN{5>X1DB zHD=NAyY}_`LWhvpTdGH3wIo+IFbkRm#l4lmegV}JBPCCB{pGOAV&`<=*Y_+2m$Fr# zA9u&Tk@(?(mb*OgHJ2VssUz0DSk5h8cdwn?SLh@)3y|JG*_gqUK2!@e zG59|!ZlA(fVF4DDrn{tG`(5>N#>I4MvqCqmYZ67?c;K>p1b%}fObC@uOLgQ9l&Up1 zrS$29Vo!nPTBB{{hGBU1W8Lew*;YP$e;9WNbc;HLajOS%MA{zceSQF}i-A=4g_iFz z@<4-zD!0)xKoHY`jqHgFScDAu3A)N4U3KlYSL!8_Um_+G=k+DtO(}@q+{`+z+dRl^y zz;UShuiDpY5tz{Ot20F!zUISsn|UVhCIS`(g8caJ-&oyLu~3o0^%p0?-<%eqLhXSb z13+dQM^-$^vKRg=o)MB84{32-3?#T{*cWzuYUe0EzL?R#*xQ2R6KCRj@8wZf(VSF0 z&y8XT;S08F)>vMD8@a}aN6XSVQUgwl9~xI2_0Xc`rt0&>C-Q<<2+zBaOvxPTQ$*EC zPQF0B?Yu`1%$NeoI;KoSpA0?+UIa2FcwR%K(Ie0kEsjQ^=u_45%Qs46OOiQ~-`sn` zq!;%5R@dS~Lb)}0PK;|B_A;L42d%hoH-rt#lCvKQ*2G^AeG>Yr6TBYs#i41)CYS5W ztMlLECA^*Q-kaiLi6|xt1l(rL*wwH7Q zf9>og9YpPfB%FlB#O#D@MVy?#W@-*u@3RXHwCu=!zGPqZ?DWLdt2ISx=XvZC(o#D< za>|3UL<%Rey(mZ|3IbX7mP|Tn$s1~7MjI+wIpc;`29$KTHZo#LS;*KG4U()uX6lUX z1(AR7MNEZt5q%Mn%V4$P7fzoa~eps{bgNkdxWVqHd4r<^Q{+C2X$Rvs9y4oSRs}@%JOcsHBQq)B&lUN<& zd+GNjUeeHOfcrw%1HLanq`e=g{{iHGn@mo$m{L>EeZXAXaZGJhAjUg|`nmT3mm{h1 z?g?;DbMwLdaU?d75q?||#3Ds7ug?};%9^6A+Wp7P$&a&}Ds#Vhy}l4irN8N@5A1>! zY#smT7XwvK#DqEQ79Zfr+4*!5Tezx#kywxJC%%&L-g)0G{u}Z3lX+)J%a7n=-A?g@^3x@pEO3i#6a2drZS$_)mVFz(-h77DrqU`IiKB3>`@7BJtMgSg{a_-`oxq zP;p^Z`zjL0&2XJ34^!6JWssew=IJK5B|P~=?fVq{fITW{j7*~|bH*^RHY@Div3X;3 z!Vh5NJwt$zH(Y)4Q~$JIDL41V&7-zOqfG-;Rw}^t)k13~ELq`Svm+oOe`@tum#e&r zczRsfEE_hc95{oDdI!vF0?0T@LTa@^;2=RD%bbK~v*lnb|M3{>xAWZgAM@T*xLh2L zyi!4(#jAS2=+ThR*Xt-&+ei*bGqj{#-1=I@!{IMyvOoIAqnAd!y*&moj$05H;2?BD%6e~8pzdK91)K(1J)$+J&8yGh}tS(6l;&sZ7X zy`|oKWzVtKU(4tMw^|VAg=RGoCCWa$K57;5Z|9^>O%+@UvNgzzaFgwg7MKDFOTULW zi?C|1n?$5^NiO_bdDwD9rs0Z@LfbXg^&|3zb*J>w`+-Hk*xkhjqxEUFeK}D=I~7559{m6Qdx!{|b*~ghpr-|2oEVaRx+sZsA~qXfI>ne{-YYE@vgQ z|Jurq>4yp+`m=UBs?Y%qotyxn+6&yEhUcpbrYy&Samm)x|HTMfys7bL;rxl?7}5_f z7I)g3>ws(TiU(YKP&<&gad0>Py}*SGdO32ohga3Qb+GwFs!J@B@5<)F4xO2|zf)-1 z{9r+;GHe}67ny{E)^9h6%5M)Bte-VF!@N!WhLm<_;8f6EHQ%U3*ISnyaFd(zbzPe|p+cXAWe`Q{9z9zT*p&Ii1Cy{Fh5lqR2l4bKspGpwj00@zz=`6@yKf4R8|h4G5J1w&^^zJ zqWYwO97>ZYd3)l`>tj{6#l;JE={M3Ns?xf_eFOX#RP?^&WNa?}zR<;A8k9CbgA%+U zn(n}-ls^4X>dO;Q;-{F)s9Ax;)ndAvaqK+@&4TW;q)Y)W1M9wwUpL-P;MMTGEN>Rt zI-e;8rh8>it~ZEY;5?dn;ChqNE4pYP>{+&y>50QFE8;`%wdOBp5 zdZzEmBgZ_(GcQPv%PZY)msj-M4FkG@r-@J=69077(}@Bd5`f74Pubp(g4r*!H;@p# zi=qYOX6q~6&jGnvhoW+@@qEAa;9P3#BMvh2fLk{hV!h}Mv)|{~s2CH0hNY)4PK~$_ z9)E8w@a8-}hb^D%1rkD@$t;J3eLm3#KyUAt2`XYFsXk!nXGCEDv3_)h;)QzQlg{XK zT6NaeVx4J&98XI2J%0olGP;Yo2WuE=Dw9jsIai7%msH+$q<33NtKP%d_%cL2L`7 zsT?36@Usxy3I@S2K6L?4Mi^P|UGGA;0k<&^@z7YJ+wPnrTj0B)-sNLW?KGPv6>@}w z;IFTdHI%(kUzP<~|_72xu$jQ0w*N0x9(a+vb5d;>M#lznb038$>i%M1r8@Cz7iI{0~DJ|*C8AW~X> zg!tNEtLn5RJ)Vs|{iOc$c@n;ONBIy{(`^NI?ar37c>p5Ogw=v20E+}Efr9f5gL0pW znCO1m7-3D7nmt&|oHtoZL3C!6n8nY^YnlK?PE6s-fV~1tOo8U12i41(I)qo#j`O+F z7@wzW*a^73-?E$$x;3Z!n9wJtAmr=`Cbfg_MSJfxOcLKDx1!R1uR)0s=3Hnx##K2L zb{=dp?U!JaE#Jmdz8wK(kSVu+Y*< z^w(F8s=3g)gwZ~SQEfh^YpML;aH(>C-d4`!xtG-aPEpt8wm(aA;wh1vn7^4KK-0%r z9t;|#;zb-1Cs=E0aPUOFh}%SK2alF;l#A?aibRk?nJBAi;K$vX|xg2Yk58pch9OubHP1=)~e57VazVV3loI44bqfr;dx(HahqldsW{Eh%%UHx+-C9D?@a5u4DV6%MA^hni@TZ%R&X|$zL#*l}Kxu(7_1OPM+n2{v)vkZIqjh%K~tXkaY$Zn@~WE&HFBi+)JEq&E+-s2lVrc$&!! z@I?ze+OPBmqPYiS$7fXF!&6O$$m7~RJP#I#r*D;r5VJ2Uq$R{O)1@gf%j+$LvTC!S zO|OsQz#J0;4zNrFBzbcDWfH>vw_nG~4g4d;YjdTdjK5bg?oYe}4<`Qo(6-Y_+kV{r zFOB`2P9BZvGJac2^$qR0kwIY9!()jS4tSFxsTU z415xbYnxDsLT__xQHmVYV6(`x!#JxEkSJKw-Y~it75Y;(r|=5nNYyQf+4+C)M*+9e zSbvmh$YXGSsEe6_#leltU|Ra&9^)75`NAe9pUXH7c!k3EbAbyL{1g-XzX+sABkBO0 zLn!nXYfl!u@8+mk&xdiy)s1C6y}1+W0s<-gsEt4cb_=Wx^%_gh6kZQT{el}IudHo4 zOl4{R1@Aj~$(5z(JyJ3g^lx}YJ9*Tx-f=zi8_c&nAQlg-tqeYt^bbJE93JSmXDr=p zbGH%tDZ0GgI~y^0e7|VaUjdwMOI`TJrJA|ur1-#>Yu!v@b)oc0x1E%-2I+U5tZXxb z*&1g`KqvrgFK7qrc#9VAm8WG-=HG~p_4^dCD?Y6rl61Spw&cv}F?vVd1nbfSP788Y z|5tw)68?*Z{!Nk(l!A}J@L1MEhWZXJa$o^IHV9DGVeXApG++k;n|8gpHqHAMe@-~d zO)!?Fd(L57=8gjNi0M>7e*}BPD~QtuPE*HHRG-{Ees+pnS2K1a%jQ1Mo0jPX^;0R| z+GFG;P^U-aa1Y3TQ&9V(`tCQH52KMhOe}G?c&NqGXV-amQ@wRx3-FxRLd(8PgL#!! z!kcR-?cK83mpM;y(O2$vG9Ob%mq-~`^&ft&navurn_=<>-9)<3GTh(=_+zkA z3L=|e4Nw~0`pEA;bocYlC%HbXOm0&kUp!N9xFvk_ME014!sr>f#{j%^P+s~??g&0d z${iUWg90|3J1)S;|6W={v5i92)BP4ovlB@}-_*Fj&uWo`yvpNzX~*I$2j`9`7uqA_ zI3_4w74titNKmZ3*D=;eD9*>o&|?h~<(V?R{aiXQXpi|z@+O;=$l6BZ)1D(^DwF#b zYczZ=xm??x_}tsiANIgoTYaRdq-BxZ(Gk#Ugf-kK?f&*tIj6rWcoi2Em4Ix<~fXb#<5 zh4QZEq&n>+xkmi3<@-&?(u185uSm>Hd%E+=8XP>(|f9uKzTilHhw1dy}+zLEt{HC5{kv%mY}2Txc4Z=PvRfQ1|qcoaLg4 z!s@!X(bbZ#4qH=iFyR6bcTpjJ@8$O&iGj}2Kv*Za)HPHQ*j$!Hkw;X6W4n*0+~fFi z6jyL~qwj6!W7mym>bk15k4(XD>M4=L0D+X!MVeBQ-=N)VAa->d=5Hfph;?@Fy}=hC zQM@v~uUm5W+eF5rJRca3#*x7pO*NRdwONc-Dkh|7r12ir4gYi?i~r|zW&4Z0`k8hl zk2HYX?hdH~WX+Y3JJ-=nR_5#c%DdaBCT;w_-F+imV>f(5Tsus@iv%?RYbiR*!&-`n zcr?I5erad^UyL{t`n#G3B+-HCEWAO>pjd!f=Pg_?pjGCyXQRHy4U zQWZ*?^QPM73|Je5Uq%FErHJ%(I1P^9 zeEkr9ohG;Ok06~gFpTXFI#v4Ofly+Z)<*jkhwGfA3nKH9Pp@O1NsE8Qa4U^5sd%9y zg5|BTR&LPZLF0 z!T!0!cT-*KO)Z}-MkzcFcug@aiX5?Ebn&`Y873MzsCYEm?? z_rR2IP=)xzeaceNk6t}aUg24pns^i6$KZcR^`1Nf*2NSy`*CC^)hUS$`XU@UOp|?@ zPVLJw7mpXnVERKP8Y9}S4bUz86t97My}!d_>i|?EjRzq=5@AH0Rh=?Ww`IQjLUmYN zi^})%oaxvU+EEjOxE}9aMKyTuKmjWK(S#F`vVaqh=2`sF)Y> z!^~677~qqTp(Ft5AXWV6*8+`ykmkhfD=!htqT*m*dq2%j)y_kHX{obm<@(iye9a%g z4B9IPUjL6*sAu|ee9lX;t?-0K`3Ym zQ3HY6oFz0sV!ol*+k%+t&~pz?>@Ae5c$k^Yq@73ig^Dg)_b`|ZGYI+BV(nf4<7*H| zF0q7G-#y*?(tzEuGO{^&_?e<L<(zT8V2pw}F4LIKrZZObn`7trCR;R3 znXOwgIexLd@H9c~{pl~xo3W=om8S&&#g-oWr3?mDfwC{N^|gH$UQE$wXIzmAtnci- zJsc%fU?(iOPvfq{h-fCbp7RKBv&dRyGygfIi@p?Si2at)MGhEUxE=^3)6`Hzt+5R! zR0!Tb&eTQXH8?+9CeF99vE(_D4sm=-(eL)_)SY)0ce$JFb}i-UceEV@9Rb`!6DT1j z3Iie)n8T=r)M&5n76n2TfqcH}w$UyAitmC4p6xcM`%s}1S)F*O1ce*@JcnMD&%j#K z;4`32DvUK1f${>y3A4jfkatkzz24ZHw=#NbuTWHhf~B!;pze|EdefQqxcj?LhlY;m z?lP*nbyCONQaHK<62Gn`R{(s*>0#hAexHM$MHb@$a{)Dlo5`lmdeF4GO6)g{9Xe(# z_!`2P;C1(snJq-r^}y3Sg*Q`5eaNvI&zbOVJ*^M0KcI`Vo6`8uoyf6_HJyM{CvRjGJrVCfL*=yr8#HnPHnV!1aqWfCehLAUH)SfJ&cZVGw z!4Jy5h~;Z&Qz5u<^keNcVTS{vTwD-J{dQH)iu^K4<^;-%&Ow+vR?Vb@BIu;VF5(3j zJ#u4I(ZQEbVn<$Il6n_lG5J}PQR(%i-QIgIaFB4sp&YE0VoIqpC3bCR;9xuKkkM7Q z9&~Jvv2*(ubo%2(o%)4$T?Y;`v2ayl;)e~hEzE9h)g9c`<@tK=4?C+J&ubk47JMfI zXZdgjx@0*(rW{oM^te_G3ET5`IY=OV%*Fc|6Eles$TqCY0F4cN``Cj6g+zkOi!xZa% zAS4LEo?eGT0;D1s3haO#kO8R_whh3e=wM>+OfkRiOaxGj79ms!#~ezC=#Jk7FTzF2 zJ;#PxQXe|qFxqW($MzAfigX-&4sd;3B}{HWHSUlzwx=qh6t@RDqpVn{Kv^J^@>_6~ zhKDGFor2Ejo378|p<#6s^CSIC!%C{PXWjamp92B-U(*#!D2h&4o^1H2L&n#-_T=a* z=1-P|2K#QCjdR{Fe_A8Bxd~_)_8zdbJ5r(vHj_2u8Mw@l!tT>66LC>iH&?x_*!x<& zLVkPMHk5+o!|2)jzyXy4S{MFCDE~C@f7}ls1h1Y#l12T=YbtLzsKz!)gitD(x)Xr< zHv%P)QIk=q-~Bj>-1h3xuxfWuz!*hcs6(T;+|5yd4+Zg788IvP@}h!OP!gdS0%!hk za8vIA-i;Ags)wi42hWc^_OSukJ|-?W_qoAi%n^v0M!a^dOWE9M{)LSqiURPmluP$~ zi0*qbH~9Fw)m?i2i-FNK1+P&QPvcORMdUbKLq4S)wRtC4pcVLCTpN5`%z9dr!_JLY z%Smv5$bf4|lIjElisB?NKEQes>f|=tf|hd4t?R75M8}_Tpk>l4UGqTshoTu!+jC@K zArp*0C}D)6#c2FMo0pT%c9WN#t^aA*W^T6(yM@c|PPY4KAwZYIWOCEuyw&A<3>g#k z8nTwt%AZfeJv(}l`1jb&QL=_nG6vK(#xgPrBB8P_wga8&@9*9{a$V-;Roq({k;mEx z6H=dB#V+P3PsG$GVD(FOLP-^qJ2yQZaBeLKjGtfdeQ6p+^G2eM9Dw@_9XF1yJ`Sb5 zK~5|`3{9U#7tyag!7$7-Ffr}<;b-V?C@)Ih+P(i<9$f2mTZ7LUlGqYnl@zhy$9V%T zj6QYrcB4zF$KRb-aP*o_rAWE&ew^)Od7pXmSJ{}k1%PvCwSYrr)K7A;m5k&ISBl$s znNS9YpzM9FDiq2ecY~bJZd$bJ`-0MbjVOKA>^L#O3d<@g1Ue_yI$BknJjq4Rh7{h0 zyohz|g&6joBNPR!nC`Ox{|E9}8xAKA8F#5R>2_lBdNj3#DX-7#^)JoNNpUnrv~cD->Fe@$G#}D(mToUy^3@zr>jOERQT8`n zCY9Om29v;|*hq6pU_-z&A=&gwyM#%sW{X?x4@3-W` zffqXlm#^jyb&`H6e9LKB8xo;{D?7&zzz3jz=#G1c(gD5TD2Yf)L=+t!!S#-Gmb=I; zX7s1zyIl9&o5te&a@EaqlPTXeYB>D8G4i5VTXC4LL@LoijR;%;4E@8A!anQOSNC#B zj?_5uC{{nEEZ{n#O#0?POp=-R0ub{+*?{yGAn8T1Qnu;QkmlcMUOvhj0Po(5** zw5#Mt&KxJ2#{hc<)3_vd?II4Y-@`qLZtfksdo$R1ec{B>D=lM88}X6;X{?VP++_jk z2fC6#{lK6W9^nmn1J{X!UGu4Id+}YnetGfu=Rt=Msox)`qg*o96O#45;-9=Wo5LNKj6-Rq4M zI)$I^;VsJ;hbq6Lwe)xVF*`WA%URgP{SJryXR_FT((nZ-0@uZk(c)z;`?3{!k_~jm z71AbV99C9v6amCg-3^jUqY!K4s{8|Y$&;0zu3}AcLM{o|Ljv_;EdhIO0ZM|oDGbD# zZ_i#Qv7>dGGEpGep2X3ML*{!AzYOJ>9-{>NWXPJ#9x$u1sn&;GD|VawTpXP`#X(X zJZk2JydRyvHKcxb0vDcOh@l0WSPLE>g`9N4iQ(LDNwva(;E8kGh2b@`pJl6`xu%C}?R?We3pjbK^P;du+xCDp zFkNk%>cblrz~f}gBO`o-rzCAohew7-&(Yf5#hc6C!;8z-!`&KA5qXaASlilq*?D_| zzZWJ-ik=a(1I^4h5gTiJdnpNf32|F%oH$O>26U&`i`Yoo+l$-UOW?piv$ght^lWj$ zI8i}iNkL(8JseI(TvP@pEhHf-Wx^A5G6kMk1an;Wc-Kk?mURcXpzHJ6xP}y-;1vpK z2`Z=unHTwggjhi=r?9rx_(y1+GBBA4wOy}7s`Z~057cGK=RcnEI?Ey>-^gjnkhKGVEbF0MS(0cuk#AlP&bBpf8SmbA z(%gFKRUwXUE7vt=5$q1D%b@l{{(J2NiZ!_EI{p+&41d!*+vIz~L@eUFlHUo9Lhr)O zG3tfk9Q+NTKorUW5C~C4MTbdM!Iw2wNVx=l0@Njh$0>sM{-_k`(phwb6(3 z;k=#$Bs?-j$m}4-RUi4!!gnqL`V^sY(LFa&>SGv3_x@V*W!^_Lb729|pvJ4?1OFOn z(E>y~aMAEizc2SkVNcvhDA}DjT^7ECBf{hI`&A^3Fk=(&uVsQ?!=fNuIXSW`SOu@@ zHAZmpK<%RyHVM+N`xq=5vXkH6S|q%!yAWHR^SvI!u@`K1qhhex3H%M@R=xWwc#rsm z;p&|_4)n&C9>m`w-DyZiY6^!nIV0}U+eXGi0S@+*K3n^g7T=noYr!4{ryq#7F~E5W zsuAp603>lNf^Zy6rVS!tCe`xr^09W+kw?XYkGT8~piuC%VrohNa%2yZ1B}CfAKqqh zkZeIs77fMGCMv=ws*IWfV3qOK7Qs&f*9|ponDk5KNw605cn~k2wsYx76XejUO3>rn zLW#e~ky@a|f5i~q@nD5H#A=`G#9H4)?>aS2AiMQOC?2JrbUXdi$|J||L-Q;57KWl~ zyu+j+M|&8QyOf1ecBc;P$9s+*a8*qUG4oUZ(vB1Vxlc~a&oG>MwOGNZCAUr;I6Eg1 z;OunxNWtbP#}btl<08bbT^H&bqI(~lL|$-r?MjyHZKV=Nw!3~yd1Byo8QcV~t2CdK zcQa7t|JH`{jJ;Ig^o=z?@KwzmVA)Wl8b*{de58o<$|Olp zNbTzme#`7~l7=OXT1;6|zcYue$y3QGU7h@zW(KwtT*q8P&<*;MvVI$qTmKdh)&w3MUbPE;UaItUr7V6~Fre*t0=Qi)Pfa&yL?&9q!$yv|n@ zY2!sA5M6F`Yv&)^DGpgT$XZW^rhoXAqA5x^hy9*VR;p` z?d;tFTC&|g?xj&h6M+Pl_v_Qk<=z*hK3&#jkEZ)zOU)qXHj|JNQK1sotun!z2lfd7 z%PpS%+1Z0m%YR=qUxW#vx7rHer?w+TI zB&lCv77t)n{)Y5HdHKb|dRa3CY(N`#M7%pXs#DXcymCKJUS6W{;E>3Oya$#b{##fY zju5<%BLtCefx6*ENkZ>;-MaYf>azrekM9dRaT)78>GoG{udv8g2i*o|%Qgd?6a#0# z2i;bsMRIQ-2e@Qet)phC9!I`1YZ1M{VxWC$q33aKp5x=iPh0+Od%<;d%z;^et1`bU zfrG0g=wH9`b@AJr!}^VA|9)zbqTH6eXOprgk5L=WTN_;fS0TuOyO}u;9XL-+Y+D!f z@Ot>>LR@xcspWs#IC@VP2KVxvmgWd`ViF;*N90UemqhXABYLh zcY2-vbMb@Z{jU~MiWk~E9S+L&;JZNXVvr5Qp8??uIJ^K7ME?VB{D$jK|C`II47GN9 z>XY&->%1?h4b9vkH;O&N_BqyR65NYbCdgWwVm|c zWsJ1q`LBea7}j}<#@SaI9MxFuYM9w4fC2fXBr@MiTLhfPXRgU&!|S!ATe~f@7Q_{^ zhf{~eWG)OTKerh3|M-Cej>zAEC)i9NZAu{ADzMmi8WYiZ#meUZB^&RFfB~Zn9T5nE zn14+OKj}e1eB+b15XM^jERzv41MR85q?~2ozD9Ok#PQl9S&m&D@K|;y;q=TGlkY(h zsM`@=typn6a9LfbD~XrZ!DN?XGJ435U+{W}@-2t&t6;q?9>F^kPM~Ii`9jK{M4kld zcCltv#>5#HHD})#R;>u0pcmC9GO$ypbon3m$eDZ$uA^taxkK^lWw{de?qlwav&Vk2 zu}CPiYB5~^r;CH~{0J#n%`YC!!>u zmL;_P2v(E8Av_=&<@PD*v^C|R{xeH+2E$`_@h&6;yfV$R=hl@UhB>9i`X6{?pOwRY z(58nV^>=$e2sgz}30J&A@7c;*doHbGiAyJk!y7E^3ku@&anHc+-7nWToA(i=J`br` z{|KMz-HIB_P%Y{hL&<`y#_%4y?h)Rf8@tKR;IH3>BI!ui_``X ziYJs36ez!j`%PU>iL7@|cDd^?b8dw$Qd{EN2$^cx;wGLbhWvB6uTIL@G z$bERW_UUswjEDML4XjAK@1S??D%|-zgXnUK0Iv~U>14hzs`0UpwoUNjXStkvz+iX z{KzTiCx(`V3Hr(3-_h)zC^0ezZSUJGa_8%?*QcQ&fsk`=U^`(J`TvF13e7P988I+) z?4}7|Qr-(ZZz1|ZyxSA$tUyn2#_7w-)>>(vUv1H>*9$x^U^#jeCvd9-uUPQ*`rOMP z3pnxag*&y706uW1*09*hoE(xv_zQ2)saZER@d+-1HYGF`3C6*z-k0-K!ErN# zwdlZ0H$Wqz4BH(G;^Ftblg1M*_G%S-V~b472@(AjQA1=D=$OTxVYr%2BS1Q{A&Kq^9zp~MEvJxf)f?y>wFmtq6I-Gh>( zIXA4H&Ib(~bM${Enn>6y-OMQ7bTMnAvWT&bb@6@9e~@P z5L5TS|wLs09}K3p)&4pT*HZh#glO?-%0lW zqvoS~hMq=>vvx32ZyCC|Ft{F_UUG|7{ng25sj{rzvY&TBj6z@pj{z(NrjM3*O^Vnp zr>!5T>yY=%>2lA&<&z@{to+P2`6Cy+;t!sG)^~TAQO7ppd=g^>+d|N4CTbQ=s*HAhjy6Qlq#GTJzftT}b zixLmGcq~x!vDKaK*iQ}OfiVlQn#rw-=115+ zs0ID(Q6@gPc7sa#DZ2 zX*Y0Gj2MB#As~$y#YbQXF+P0-k(>c%SF@RB?%XG5AeVSl36g8X{-T|9fTjv?x8sz- z(3ZSoRvw=o8|KO1Y1$Ke&u2t(%2L^UoHAA5={Ifn_=g-Xu-cRO7pToph&%KRGZ_rk zc+u!xzM5qh^m6a0<-?$F7d}b9c$rQ~GW1ndf12(R$3v{u8vY^5paLyXia`y#2T&4= zLU8j>y-z-8troVJ@@s#%9z@?$>ON^iCv@H>@1Z9MVzrb5C}#w)5dy^G6RTObJItM0 z%Rl6G*5DT3i3qp`@bk$t z#%5MeaD5nGlbSDnF>C_9t!)NQ^~@TIWQ|yNO0X$ui*Sz*Ot&!-cYL>^w$@*MNQ`EF z_R4amgF5)KCLK&ES)j6CAp@1JMX2l0^AHE?XH6Ox*;cqSL^F$p)$7^QHUz!BHhY`c$gWsP>u8vLgpn-ZZ!b$X^HTj3D78 zU?z20zi1@vN*z2%jNy4_+SjQRfj>-1C?-!v-@pfTHSX6>?B{d0jtMx8nUvec0CN8# z%-tE6#*`vq00RwMXWKOjQTK=^d`^c4*Vxh-PzlKYd{}ae;{N3`&Ys}V!-P3QI2!mp zasF4?eohXlCE;%e{4|9la$t=?d_P9};Mk{`@>^ocW#>*skE{pm>OOvXc84%$wfxI< z{+0&;L}lN7tKL zxYHTj=R=NkSQJwxIorghQ&il%9WWlBu*lz;OJA{M54%8f8JKpQ1eGddh-);a>cw#Z zr4O!!Kc{*+c2w)=H_KZA&8y#cc`jD6g=|Z>TOEhrK8WXFAwR^btv)SrU82}pc<>`? z%G1)EIqeaoXjvuCHr*x6I)NM8g0ReL_7O%O+auL!J6K|OF_S#6tX?C z4v8`bAyLM_$U4~DTm4Tk8Q{n?fGQy*21E<0V=6Y>GK>2Rk4IS^R9GO~$a)VyRbhHy z&9$eL$;#1(csw~7?SxEo$$veS6i17w)dyY(#lA zqOOmE7Sku};E{v3J4~;dzG+1*0E&nTTH-dEkg4V}*TzT_-Xv|ahL#bhvaDOOD-A(y zD#FnqIVN<=A3~{$!A9P96muaQGJ;S@+%#B~jRo2u0ZV&H5kvcf(hEYZHKKwQAscWD zikJ(HC~zTM6FL}65=;%Xg=2TdihxD4XhgGb{xF{sblMw)>wq=#;}y4OoDHI+Tk@jC z)Ur>IgA(468{h5ei708J%@9drp$?<)qQd;& zQ;6?*Swd4XfqQ~3q8##SD`ReRsTVk;jV##lE7qE@N%*r?`CielD52+` zOi@p0-;V~(jvT#n!UW&JJ~i#0YNpTp0Cp?dYOu*fqI5y|+a3#1*&&F?(j1xi_QJAM zJ6-A6h20&_`W_#uKRE!E0p+lH<`{THhE;8(5Na>WkYfKK&~$d@wZE<(3CF z80|;P+%dhdqG(miuBLH>v!6KlYX6kdJK9 z(w(698pF3W6wB3y$AI~>N5ke1u^d;GbdKIkx$qiV%r2g!&i4k~1GlW4lP|#?Qci zz`dSw*H()P*Q@WYJz||qOx_g#*(+V4vi`gO@}jdp+S{cC5bUGZ5-V|J z!EA9BGZkMam%m^ExoFFNIR-Tz0#`DIC$#?>&4%P70Yssdl3)A?%hKA@b%MxRwlFYY ze=<|)g;)RE14o}%emVj!a;5<|Y?&umWK27Vct*H#{wH^nPm|{$zUoVO`lf=0G^T!c znn=Xsm**HHKsunI{D2H>djNCDAd{xSeYlwgn+7y*o?PVGs0|Id*0msFMmu4S)og7m z;(1eenImY7Dn^Jr^E?FWxsNG(?&aw+q%2xx$0Co_(!uk44+cdD36f(q zByNrV-*h^YitL>jOH%4ieW-auu6X}^aa$~^l8BA zEqkI*R!|WA#b4g6dl@ipd#qo}G=FmDOG2FGarGZn5vGw%ol< zE9VPG;6;ITK3qd#-}#>+v}ovX;J?#Upg9JND7BBXPLu{SkUuU2W0RY+AEeR(DJ|_( zhn^rTJwuKG!EdI?$Z5vfV|MwP`sU%rCy!ZIM~eYI>rw#Yv-5k0RI$ zko=&eAehK_a7B~L`UVuZJDFf>aEUN|v5kLkFlDE5<+s-pbw0hO1k6F?Ao=#GD7^1B`U$zy0 zrCj}_6tM8-;;@AWic?5cOAtt0per4*IeIT+gxObp6dMXXW0?hNWZxI7Y# zo4|Bg!7A0iHC_?ysFM>zk-~bU?DEmZI}h*C$#^4 zenP%WSrK%^&_KVS8yXtGPeEbqVV>aM=?RG{VErNGCp2sp5Xxp4{PUgMga)*SBU&~R z7VyRYH@OK)fRN^-gYr$~w8NCjFmeC-9P4JVvvR zMyw08UmW5EIUNlIXD4uwll{t5Eub-EDUJKfwGK{H>wx8`26qG;r|krfkFlDe21&gO%pUk z+Qipfr-EObE1d=TI;}@|$L()+c^^M&sj*_<=4#_N_;koXin^$lirD6GlxoUSk|E9I z3e|PY+XzqTg9@Dq*j|YosFoox4T#5R(jFwoNkBR{aHl{?;6W@3g~a*UFh!wrTPvQ)d`TXy`vD20H6{t0fV!p7Rwr}u5d9(`Z$kZtO@)yohfA$yPUjC(` z_wSa9=9mHSaJpZu3|K(CkcR(BF#*==3$aK3a`|}^%45`NTc(k${^&IJ)4SU%FU7ld zNS@1pC2Hd1h^1V!UlmKKa_X&Xrip1iP6zjv z>jV+M`}Ae2ol2oD%ol^BNMOr<6F#q{dTOV7Z5;ZdtEM-_YmGZf5>?OStTMBy=7w8# z9tQ^6Di#>m9N(Q8FI)4BJ`%TPgATK{dj{$x8`QI+6Ez0%jc0uZJHJvC!+4Y(u%n3b zt4hUu0-#=pgho-YrUDEEvF0Q5r<%`S@~hiqLU0=Yxzoq%G6sSIy)w`;(at{R#>3*6 z25}e6w=hb_u+l<}iqVz1_hjf&h!>d8M6?l*AQ~d&E8Mv5b&lfT&7T&mRQEJ#Hz960 z!`6e=?`?FGT)u%eABPjL`YNIZ0w{nYMGT9?K#wQApN-kB}W?8Q1ee6VUPtqGTV9%Qb*7fQR>zCC$crT0W7UXvHyw8 z!!Zwwj>TN1KWDbv>t?0oM?F~spOnqj$lai_V~+uq9WBIkS|%TZoJ*(tDVGk8LT``g z*`_wDBV^M4pvDeD&ny((PREZbiaQoWrNMVG|B^tvpM()Vn6F58^)yq}v(WGjlFP?f z8m!eKrn_+zb&Qju(+fkz;y^Q10&8~|B+xo0q&scxX2?QB>UNX5M7KV=r}3|ZUCFH; zeRvla=&dw&*QHVAhd^TUrOlF)>0fho7_%Q#gEy^iQsJ`ttWCt;qQKTT?tOH+31 zh5}-cDg_~os9+&hmpbx8uiPTQy88K@)oa2W`e226Lti$nY*;-)yP~4Tz8U>=9btx) zz+$j=)GW*Szc4DGFQDO-TrQ1~PuJ6vNqK|4vJ z@I1H!E>^XZg;-zRSIRNscExVqw;A3Ac~?nmHsA&AfAXJ$Sgv7h3}Li^0V*0o2bMq= zGmeW^-EUH&%r#cIX(e4w>T~L=K}HS z`C|(JrvbpoPD>juhSUnx*606RM>f2Frg=~2X7!2l9RYEJa4U<%IqJZn17pb@HEg40 zcI0Jjo+($y*Sx9S?Cad`sx^?j-?UWX_yRPDyl_V`I<{aj0lL9Q4MPAk7@Zmtf|O{buBt9S$e1 ztZXj|W=V)iODc;=NlV#Ds3<85*0NV)WA#sN>~@~(C~LS957EzqRK>|3UyRaHT+?9av?*CXxN`7<$olh` zGs^rKC>cIT<1=a6uf#`5r2E(|+2&gR%I`;SM^VbJ>x7qXY(*>lTw}K=$zF$80#L?H z$uYS*L*u|r)+Q3nXO;AyjBO>>>17NPqq-%!oIb{(E0|;-EcnbQ-j~k> zmukiZqp;n!GkO%PdKBtEybkcNbfr=kJB!c7CBM%)+iDHeYlI*aryd1d|Mkc!_)*%Z z@pV;&^F_?^qiYG7gtzO0BQ>?6jrlnvpl+q>p?nY0aHqurK?PrA;V3?_?OG&=@OJpf zGsWu@MR4XD_pjWfA%2aBtAL7GyM@nYE}=8Xi+Rt}Uy+Pq`QMSu z@AS3cNCuJBLc<1{YHo@g&OA561$w3&&NWW@4pU3kk}!kZ_n$~Dx?0(D-FuU3*-ZS? zoxW6yU!S4CKWD|K5jT2MPl&%osQ}(2lTqxF08BQ z>tD%jcep_zpwv{f;a>Yxw(X!^DHx}60&6J^0tC1q_NT4Hkpf`sc*sKwWS{~{W6tlO3E_eJ)3tQITll8*hpY@Ew*4L)c zJuK1SD*AqKru(O%l|(<;!$hA-OBXirp#!804y(0a?p7WdUghg5oJS?B!_7ucTJWv> zfu_67fC_IOKl>5dWkhp%u;z1Ort`rf0rUGtqRl!TgO9Gqdjr#8dI5w@oB0^)d_u7J zgoBq~aOSQ&gRs$y&s?G+Dv$5zH5L9n)V30e%(J-Zk;Sk~olbJ`fvNmRZSSqmwyt(Y ztmSQ0yraPGOJSWq!pXyHTwUPj#G)i&v5*AFUmA#}F z@qqFI_k`SCxP=V42mF?Kq2HqxG7kh}DGp_5%9CdZ(*5R_8Svpp0Fy zQ~Z|9Td#!K-@DMX1GblLA~;_BFAl^lZ@g~UQ=24$r4QinAVQ8BX>0r7F5Mr2mNnlFz9bE& z=TB|1Y|+!Y^@(Pu0P&Af1+E(+JbxL&okaJ3mDxbWkv;Edi+iL`Bj7aU@5EPFe$EX6 zcTG5i(tO*)-xt(r90Lf9f$XP`i9CNEIcP`oU7Qk~N%Ku}+jKbX26AKsujXrsvDNZy z1{t-xe!S~+3E+M&jQ1uReyqZBGYQXi_90i!785#2d0$1HHV)`)>V6=v4&u4@e5}{t z23xJx8BFhNYvawILoX6vZSKp;)PPw0uogx@TScc7jVj6WCQpTyea0|_q>B`sjI5FHGsHwAG}>}7<)#;7+% z#xbP}1zjKfCR_5}Gl$Y@Y?d9gO9Px5lyUY4TmhvHB|!7@L&ySkKNrd7x|+WIDB&qx zp&&>zIQ{gKSdo9nz00--P_(@FU~BVmNA1*Ss*qH!m3H&xr3kfF;rDS#`yBRPGs{j? zsF0l_K5iFUCdZmF0+Uh%?qh{3Z?u40yAg9HB>R0rIiZVgY53a1s1LfmAb3HF$;7`CS4|4d6%JG%rLiy!IM~?j>yl6yeY|~dlFj)&W}O${ z@`i>UAcP^7`|x*3kTb|2c!>NkS%zH1L(G{wmXEsj7+f4s6Gwu)HJTMRT;C4XIDm zlz1L@w06sl80!y*E9OKYX%&>g^(Cl?2oaga9VvfKuUsb7{iq4gvY2HJr(F)^O3kC& z_nj+Yr3|E++S!0gCF6?B9|lO^UX`OEALcKc73Nbe8Af;{;RhiJ}|Z>Lu~R%;ga0? zsx?%Hn^qWQy%;H(BRZqs>3$s4!gp|P&cD4qqP6`86M3gE=-;B;N&uA;d44fJgjSlR z&|~TYFUQqIRloUtBrG5WVqj}>bI^Ekk_Dhx>^u?$SubLfw`g|ZA=G^-FQzxW4=3g{ zVZmGeJt4be$u*K|D9U)3miNrfFXP^-e~B~HWSSX1T$ci|$YWjOlR3c_bmV4%$J~Xv zc4@Cp&lNB$1_#jF?<@7FtE9)s`+!wUjv4Q|WngQeo%mzCjO3{-r;Mq4sSE^yutL%~ zQ{#7KF#e@0ayel`wZTq2CNGn9xIma`DORxi;vvEIp&c7e>UzN!R&Gg^w>xy+u!L{lEZ8kNC5;df!z zpBk2~c^>o14d^;4&L^bZ`pt2F-iT};u(RMXf3+7K5GSf!x}lsRk`x$H{?_RA8L#MO zQ+WZU6?ese!RD(PqLq(3)6Mj$C@8TE}DqrA5i z^+8b*e{$@!e&F(FxDmpV0QR>TLia%!3biL1VD=M2F1s|3X-^y+dQ#h>PhTTi2_>^S*L#}jTU``^78rJP9C|?)|q9uMH2g>w6 z0(A{~xR#r$ekR}L6$n%)9b5gyM^xTQBJ_#H@u#RxWbz24$)&NF2f}j*( zNUqg$a*v)ts=oaYlbZX4`vT1($G&TZ{B>%{LPa?6uzK4(J9tbY$Oe&2KDdhIZu>Ju z)JN~uRaCP$aW`-FJCt)Cf^&;W2H6N5inn&HRSF}Isbf6ObsaT2 z`p8i8o77CPawA6|${Z*)>^l;Rfkqpc2{z|O&DVMbN^{zWS^IS~&&E7pYb9YB z2bRgoUv_6a@=jYh0`^k66GZ$2d;vxPmRmt7g8%#r{NgXTEw}=Xxz{VZV}w!3kXDnW zkU4YHw6h*d*Yzl^!Xp=+Fqu*6z=A89_4HpXsozQ=X$(^ zWdTH`8#=@rWXX};4K*$lcQ6ae_6OeXqSl{`3lyx0suYcqN>TtP(&8%|rP*U;f+-P; zOnl-X3UR|zQ4wzj_wh=pdzCZ_M`nH1=5H^cZZlioy&@MYu4Twt`xcbR?I+*?cce^ppH-rqwwP0F;hklNDa^jLD z)K~`f79Sik36r3Q7{RSLK7r8^UZ|)TP>S!|Gx5;q%SMutns)FPq^c z?F{#my17kB)UyF$NB%k)D0G!@_pT>oEjVm^V0m0PkQMbK!SwwE+gvg29X5%xmMkCy zC2R{a{jNq2-KB@J6r9V;qr#>+FRz!5zMqLWw7KsZ8zKvjUc>~%mW^0cqlpyoMxf{1 z3g(W13KzqFS>Xa+j2voh#>rE0K+I5*suJ*h?3B1Hz^(jG0-irL^k$oY2OfsI z(F7E@eojJOK~aaiEO^N>6(P_$PxTAWC=wY`e1ycU9xl}vJN>Dwaq4UYd2?D$Ud7sE zlFf{B43)u<8(H-#xH8PG)-HwPn{94260HnQwRZZek>bRExbEulmhzi*3XlBd7B_D- z_g*DBe3@~YaE!J6Xi-ij_-3cS+92ak-uvH(lDo8j5%xV(D?rWe$w!EppMo~$2I<+s zYyN903^;)`oipjHof5Xb*+m`CkMhaeuAN;r-|??x5|gzSe+M%(M~?&RYxRzCZ1(@9=$Vt z6+E=j)=nl1CnRu;f|QTIkJy!O_7vjzp;l2X=es8>^6U{+Zs|NR#WX?(bwE!P5q`u1 zV2vbfF~4)!-Jd)9gCj<&9v-6(za?98$=(=MKcgLxFP$G-q{KxEu5fA{cG)9fAorIx z-+fMux7f{5&Om5<=<=dv#ajOFU z>wHux^uzqjK3)q2iVm2;wY#zu$?)h>!Z7^pH55F$6lvyy_<7=7ik)D0ifiQMRx_34 z!=DYDc*tJ#CI}ReK45z@Im-bq;yS-`5xB)0kPd!Bwb*2sJhN%Sc2-vVmHf=OcF~=D zr?J8EL6q?N5pS9`MsOYd5O|^1Q1&xuI3XJ$IoQWTSkAKGX!L(?Tai(%_~j6P+4S?r zEg$V3p`r)iw|*iy7*&>yCDN`ep?C@&JM`UbSSC&OvV;%~!a6Pz+tQwJkmcbPR)3su9>`>(L}nJ$t2MOX{E(N$RHh0bNh zVwuE5ZvTRBuzEzi7K1_ghvUSm6LXO# zDNC-OQiz768?esb!EYez_4bkd)fMw^nMN%BAaoU0zL=U}HYD{AR!enozulRTG`FdyBOqC3 zFgE@e%auJK^!V-#?Z}{5tU(&smz$?avQHDC@^D*N~Ub05db z7D8l|l`XPYh#Y(GP4+I?J2DGN!(PdjB&qCGLZZk_R#`=n(eHg9&+~l7_vrb2e(Rs7 zI?r*t@Av(FU*mPXuGb|qM~HlytHZ==@DP?hL|~?r7OMNBllAfTZf+|LtL!FnKVk1h}b3lNp`f~R3po>Q>M3GN5_|r%2OQvFM z!M@BEL5+9kdwObse`t6BC}$tcElPweJ1Rvre`MdL6-*}nz8Z}r%L&WZz9uy8^{gW{ zP?{G$;E&-0&X1JmN1yh(ziP-Ar#EolHM}Ks_u+(*xDS^Ih$6Owg4~=JAwRmSMyDHR zc+Ripi89Do#%1{abwcv!32%Gcqf_>3S>=mFpW!2U5R zF7G}NI?&;OhPM1G6N-hA43E$9o5k`;yNKuup5Kj^2F}UUmF0U-qwcESQ9Zwq$k>Xq^^?gs zoPx*q0P#1S-u^bf0{SLy&_B7j(Ngho*7I@`=M1Iww9RX}_6G*1dEmN=1u@8?C8)5o z+Cb_XDy!Qz9XA)9buO#g2j7S`A5iH48CgHhy_mu#$Wu@!2&|P4(ZGHkj_4`6e!oZ0T+bR05ghr}c z?Qyr733{Q^bL*!yU(}pYwx@t~87x%bd-=OUNj@(ZQ;mFZ1R36W%1}n_sVDJ`lWju#>C{CP_MWXMPY2g;21iLFx(jhZJyBoy#u=!B59wd*n0Y(LyLl?= zTw6m*RPfgyb}5>iTDX^`sGQ@!9FYJItv(F9B5X0UOd*aIHW*07tq|y#l-GZpQ}*88 zd7-Hx(XmB*^s?Hrm6`}`h*VOhsLRSbaQa=y;V>C1+6Z&Y?4kbyZW)OBQ=sxHa1JVn zIz-QY`mwp@CM`aaA1lH_D-o*B>+$u=O9O~47Xf5VG&o^dle3V-0urn0gCG#3st=>D zIdwnvWkpTRDjs6<=p~7lUK9QcXLNdGQu|alz&hEVgu?=3+=>q<|HmmiIJp{0YMZ}g zD;=h@-6VWza4!@2M={~f%Bq2$4-hwf0$ZtK7}vke&)5hj%r%y!zpeza9W(%-VrpJ?#?P!IomQ9}Zhno&R&+t<$g#a~1v zH}3B6jU-*Iz1G&Z0@mCe38qLSRUm&e8!RZ^mii^x(X(Iq0%i-RJ=?TgSO}b_XWtHL+11pM> zc}?g)R2le9Wm{%u>gh4YdTDLwEwg9USk+(^3u-u8{LL<75`p?>gv4t?tsfB`Z8`ir zUX9lnt7tqP$StK`q(w+fB7sm_DTGk*oM^R6PDrCXvGSBv&MzyQ{$7$0{}JHNh1l_c zr$9kD2kcbF4IK#4+y^F!u^pj38o__Ea^g({FImWEJ9YjL6KY1_o)K~e$ACC8xm_9} z@;fyt_(X^XiCzbeML5G{uT*e#jJ#WNMZtHD|DJp>N*kq!t^!whROlcT0p?&)5j z1)swXcGSaKvYLeO(;y=b@2jr1m5ffu3QyPE73EzMPP1o}5H$}00zEI2fzI+sZVjgqxv4l;xr~Sl~kgEYA@IlW9J1B8L1vx4 zsAa9PyDFQLTlF0;=(nM^M@doXg^|bG>43GhZ-gxzTvmrsPi$3nkX>vLNNk_17I>y( z6VAXvWmi~8&=!8hKcP2Ah3Y`3*C86!vZ@ zNhhzE(;7;=;2piSUnbVSC*vP#scz&TJFcxYQUTn7U3cSU2JX&$g@SxgUGS)XLu$-bYqHa9IXJJh z9yY{{08?zW3|f+nu+kgw++lgiziIa->)yWk{lcY310faL&3;i9LX;v?AJ*00Mp|9Lf(`G zE!3Z_!Ip9Q2-`hioqhudfD6%3yq%tA;k}=6e(cpz`t!G1GsvUoSE4_mBs}HVd0`iA zdkx-uaOw{H4Yt%BT!qitnM?J@Gk=Ti)cZ%~)_&aamzTbOm6RYowD0@anYZ97PAtID zBXETP4t+?lAe|LS_B{CV^?~@b*H5eF8ZVh8KP-RzVz5%@&Iv80eQ*u!)8LU-HlR}* z{%Y34vu;B#tEGdFmp#4y8d_r*O%ZY9n?1_@OQUJL9(>s>5Ptp*P=W$94DegAm3}DT z`Dz-$MCiL5pFL^)+ylzcKeK0yL?38p-^g?vLKWuNoOnNcBB{eNB0k%z_QOO2Pe2!3 zt+JGYQwtF=oX%{%=Z=3xGW*(hd-Q$+ZOAEtCHpkR|V9WmDlz@N>4-@wAb8>l#j=O2BBw8FC2I{J%JiLf%x z3o7z15u|)jJ7J=#s>=H}df?kO&%rh;Edszyoa>pn(=9$zMCIMVJ3e>tSbI!*ueK;G z>~hA-Z1qWk@9K{IVGe~hAQddb(YY>TO8jvvJZ-U zl_-=`G<=gBctP4lEeim|NYXpsIrStkw0T5=gl?H3-1+t>A={{p*iHBV!n&5|4X9|i zhB;7_^#0wFaXsZ&eSKd=nJoMT79qhtJN&393v|}BoN-LyEubkpm2Q@SEJMjKlL-{|IzTo42Wy+ynB4Uq;*DdbsFRGrx zmjz-CF{6rA+aKY#Uc>B`0?9Gnkjl8ozz@AlQb!zf&i+u=ers22txe8 zS2aW6)3}C;Uh{tzG)6S-W$${It>?4r#wu=VbMVDCeH|Y=`3?Op6*z$}qu0T8!I)M( zY$>dYJt;mBTocPKn^7WFVV96kU%9fQ&i#T-F|vSjz;O;* z;vaHg{(n=3Z#Dsu%|WY&!EwOiraEZ#AeA5ls%-s`nsuo6m9^$IgO1pO-aB4Sn#Fv_ zh#n;iQxA|Ebn{Ii5UKl92#P5L9`3~73xSq`Hrd04K*^2^V1z(HRZfbzXY~>Ay$Jn3 zvu=qW>Wg_;yDnyiHH5fl;-r!s-n17Ozgk}!b*>4I&mvP&@6P7#ji@>B+hW@0BLH|LM9wY}s$b*H`p@-$m6Fv}$)11X{1jb^-ZP7nFFUE7NY4F5X zRYdVOD-wMuNDkRlpvGr(gK!0KAz}?Qp!tAKJ#2{+0ysHbeiGo>vEjFW78`Wux_S(T zhBMQ}PYw)R!ntHjn(dVAV}463|6b>m#ElGyL=m30j?UdbP+%!XExz=Q?!F`4Bw>Ff z>Zt8@1NVA!{7&Oi93A#&hUG4jA4kn&L@(B-#T7+HgP?;h9p`5`rmjH)*(BL;~r2)Csl zf>#lMfJCPdDu#WmF(qne4eR?k-P`Je);}ye2)%%&(Cse*@Nb7WawV!p8Slo9)n>D1 zka5;QACWkNlZxsU24ws-ls3XHziRKlQ@>ZU^gK~ynMEPaAELX1a@LVCMrx3uh~cR? ze+(Rr7KXF@ePNV^Fp4&xTtvwsb1GceAOAL!*pI3$KKj}7k-3>RQpDM#6(2n&-NZ>e zr^%n?NJpV`Z2(IU`*;jt6xN_7UD*E!`;ecag@cjM58LSAmolYBA#xnD+xPjO1(0kf zda41dW~UEZH8bog_?T)7CBykwSwUjcUAQ%c#mhN&^7jWihVLF#n~1DqQ(dY7!G&Qa z{OS*jbooZHw`J5K(Jx856Q;(9d%;61ahR0|*|Aqepb7r@z%P$kKm(EL^)#imNaq_I)3#_?C|6}L@9E2G6fFR`1#>4~447S!ptUc9O)lXD03>RHR z6_GDSVDc;2F$iYNupH?$@OL4Am~HCtymQTH9C1`hFr2F&NrX07YYUl4KY}}B% z@CB=@S1X7|6hMsp7GvQr7j+PWBN+s7JSp>78R8eN9fOUj(UnO263bp&} zsdqj%52<`E6F&8pDGPmBg`XJLsa*ZY9$+)--fY7AEzn5#6GVH7GNZ&nAN9{_s?X9; zBnB1;IO0@DZJ z$hM=Y@|h7f=LyC{GmZ)= z(g>>~;SQ)!18|=7bZ-V>RBFIk!j=*roTb#S%G4s?-ETUDZyCHSB^CP;YI@m2%d%vg zf@quh8_?4QT5qNY=lgd(61TM%F5FGA{i@&gG$J==h!w9j(>Uv;Deuo%ieslv!gztz zH*l4rpKyU_TBTgBfb1tb;bVKP`8bi9OIx~PM{hoaW=k$g5>2WBq}7>>(!+2EUWlamDwW9VIXiof2SI6vFe)V+cWuc<72_cFKsQkG~jb^>i!_d zTXXu)Zu&h}D!rckOuCphDN@z`dUzydxCd2dbs|qVo5Ur)dISP!+CUYYIR4+fJ}^}O zGT(~amq&a&c_9wBG^6-RdYS5p(^of;8L(uG(;zT4qQMBb4nB+e7Gu|aI_doRhkLO- z0u~$io~OI-&c{YW_lvvx$LoMU*2Jj(U=I%glHh=S)UkFsST_Ro(v#OIO^1E&-oKle z%jAAMqR$|IDt)bjseX&=5s(N+=qdmpK>#T)fPKo|Gk6)uF#_B20zqy>+MkA^s8)Co ziVInU!tFKbM>QCjvx*NXy zdFhs$$Vk4In($Vm+Y1ePLPo3amycE>E`y=kP7mR8^P4IS02Pi`Jje?e%|4!eKA`6D z{%lXu`yIc+v)(|u)g^nRnd&&&%m?%@ZE4$ ze#sLQa1MsKGD(PiT^ws&bah#Ju1UiQN9FPLW*^HWoeSlObbMV9ct3TKVaqtog}gHt zFGn=xlZ$_>i6!wip?yjXXhR)(>MBV}Iu9jC}A=9YAII`4Z#7l{jbe9ZpzqF07 zy=ah8hS1i_#6(371jgrn?v52+NaQ3|YbO*+Ks*CzIhg`W-!Rw)m{EB`Pw=!5xhUEr zKU@XW2WOV1b>55MS6LWLgRy%k+)ZyLSXK>!a(&z(#G2gk+v~RU93-!|*c+}LZFAmk z4=1|$Zs25;ld^i?k9wlCH}uU;Pb?^&ZF;FFvpI%8aGcdlyqfcUR(da3yFEW8oCI7I zg2D4d=w$1IUbk#qOQ&2n51~&x&pMXlmO2EIb2J3_pDvu3F{ectipbC+_xq9Z{pjwL zdu#EUZ=IVm<9Q^WZ(dmIJ{u3+)%i11Yi0uqKf(_7dj6r>gbb8LxeYirrEHtKR z1w*9nLcd}Y!HQW+f)zV78U>2ShY0*&)5*Xl@N+QsHRe4svrs&qwlh`^QX4R6X=EZp# z*)x|>_$toCdQoaP;+cVhl+_Y-I<5i*e*_S2lz#;fSZk2Lg1`a9f6TTafjb_s0U)?^ zAg`dp9J4SDdZ6JzixYE>X~Fa(A&CO$J`lM~ow>Tthq?+Zr9Mv3y`MbsEi=njrP;0n z&ej#@pv!i=W4)wtZkPQ}Ni(7}Zvv6pLr?|4GWPw}w@Mv8KW->u^MaO~V#w&IXm`Q8}_~)93`RGoE{MEvEO1G@nn6 zcDjMcOih|aD;$T|w7~`*6J!Bs4qK1~ZZNnuwS)2;9eb&q&Vy6M0e-&hKIF!i5eu}( zC7*jp!v5NNA5N-4kqTQ-1g;R4I;+`4cC<6iV_1n>v10VRRd(Gb+J+5}qSDxF5AMD+ zt$=R?RLd|uoLKN-aFs}^U(=`WpR=JIPp#t2<@KFRT50cLPq(Rig9dytlwBY!qk0$^L3aiatFXj%Lcr092XvQ;f2?sm>w%JprR_Cu4#`Gs;~TgWrvH45`_Vi5G ztX=t`-dc;gQSOS+O*}Zl!!X8_`29;$K5mpZE`&uAxYE*n?6@sO>v}cn^r^e?zgDMp z=X*hb=kgd{4bTKihYJGCF8Y3akx_|dj@vV0S1He4P&a>4JGAb2-pnegX`gwkUnN)dHQgAUC}jszTyzxRxnsUKrPE*z-kaULE0-twM1rLU{fF)A zJhqk%jx|iPz4d!?T1>SH1{|E`;WyF(?71kK(A@|h-1*S(Y|cexo$s3BInzM~g2du% zgg?fWTB4qFaiyLM3V8;iiwf?!Ruf(b9AK|roRcxf$I_fLpx!1DvvYt z=PPzY>!&P)0v3*Eu6Sq^9*>zSQPur2Nod{&mH`7!z{vaoI1%dnS>IjD=aGC?*=4ue zS`Al41mFL~0vxQK7_^n~vx;eY%ezn>yw=wanz8{45RFaJ0+$XHb8amR6_NvDK_yh7 zk~bSfm+zkQxIzlQVG!Lm;rl zF@IBQdXC_;#n@rY5C+%`mqRmj6pu~h=#>0EK5hAYJpFa7`MdA0$MIRycE^pMe2s^( zVGCQCQH0qdPUDHno08AVvvdhix=kXA9vMXljJyNbenD@S#5QHV)r{1n#iQTiHhp{B z2Tv14CnS|i)%oI<@L5%GFfzSLxKp$+0X_$oZ%y?e+(PW+GtZV1oZwgyG_`PY+w5~r z9JXh(tQTsLx^?Vhn%OXjxz=63IjD||iy_`ROjlIkFF{t~DMu@>yZ;KWt^D|{6QVOj zSxz5{^{PiA{Uj}0K{?y7b;v2^U-+NfbwT3-C4o5X; zc4E-)40&#d>a#Ak9uL1}77^AR{Ejq;XK_^0F+3CwGtrE|!vt)p*vC@gbL+ljJm+*TDGJ>i!-9o^48jHX| z#$kT@cYUd3q3bTZS!sQkNE{J=|q&hHcmbT%CghRJrnAoNw*no)7&P}6@X(WIxCvi*3YlmhGo*HrF*mcb)g$FoJam*eNUma$V88RKX@wTW zDXw~j#VmAbJtpAE@VLH^i+yDq{blnznu0`V(WX^AYveGxfvb*+v}WDj$- zyUc3K#g+SB$wW4=>7rbAepk8^;F{Q61r4720XRW!cE<>^YiD+q3dRg=SA0eHp6B2phz1Hn5EZIG_2d8|sEz?B0+L6W(zD>vkpV0TP%LS{Cx|XO zBJeLE0?bG}c;assAb`pp5I`rsdYk-30QKUH9jxLjT2K`5;aI;%KQ>0&>L&R?epYw4 zBH+>%6NUil91BK9e;2{Q6hWT-soJnS8gG)rh(*``lkbh`_|B(B1RD&eURa0rw@955 zJhixOP|abZjb?qk4(<~4G@5e5QO4o(Vt{Wt(DnbVZ;JUW$DheomXbv@$uJ#A^Ybci z>-9A5GSvmD*d#@DvIAXz!-+pqT@3h-4V(qJdlK7@B_AC`60)6iJb=K&cQ0m(f~%`pH@OHyMf<<6NTX0jcYs9W z;a=AF@S;a>W;3^BhpB*6te?a}fpv!YHUm7f8bn0@=pJ>ujaPZnI|k6wrx6w6%c*4Z zmero$b@fYJ!ci~pXeR?}f5W5QK1I$rH-JHS1+Z{%jJ?8oBc%cr4|^G=CYlstN+Z@eU(qTD5f{ zw%Yc_+`4$P*6gorzee%&mOq3e>Vym&>f7eNtVWq;DNemQ+uthp%>TLX(c(OZ`=&Rg z4wSDoJ!O6zM%nodal4Mzzy5xX^u`fb-x2`vI+c59ozmeNjAS5Sz(DP7Cktd?H!t@p64#HF+9e2M8$GQnkmQn9; zbf-ne;cGjMZ$#WXmRw&bFa&8iz~w+#N1S$>R;p7)WCUoYu3`W#~z^)MDv16(v#bQb*x+yvv*d=G{Uc zd>!4Yqt?aP?1g+)PTVcpcjXAlHPf^3=c0S}9bW(1y8o(+YEyZP)Ykv`stE4STL&$r z!2WF9H}Up;JaIci&h3Z0h#%4Yjn8;N_-i^%lz~NN8+??+2v_TeLY@TQe;v$o<^Izj ztJA*aor8M{%KyFl@6!(=R%cZXlRlN&gzda59`B`v3AGTzzU_Cdhl@D^{_Os9IuCnf z%(Q?WF=b=wGiO7KRgNMrzPr9|MpQBn!?q6u6|kY(81zf19*JF+S?YgRmKkA%2@S(=PEGpvnsBaF*40t5w#j{;a_Sn* zIW572Goi{){?$=b?kUx{EK7u>=#-h@kg+;o%8yP(*c)Rr$W*DcF z5E#aZeE^|85?zLnebv9hDr)yN2T@mekAOqTlSo@1V4jp*WXDClcRMbd6OZc&ZW>+u zbnM*|j@9nKCeF)-Z-u1gQAULD`W=?G)72aTw}TgVrD@c@6R&sF=|wp@G55{lv6CB# z2XH&>ALwp4fj`YdlC-Wz55Db=o{%os{rvOZ58rg*J;imhm&qA5_QJSF8efH1C=JNCD#v|HkYg$-q7@cV0o1*gqFY^1gzSeaKIY5HT~G!mvc^4OGV55RSVv(>xodA06erI zgH*~{>Va=3?|(S;4t0lM*)6AoFAJWMhIPE+wR$~{8X%X18M z=^T59WO0VU+aW)`lRzm85fFw55G0Uzf{*sSv^39rUmzq>hhSU(B{j>D4MCNF6hufE zf|LBb24F^cxG|siARQ+}F&oHe!BMQP#bU!F-m6Vq+v()}PcjomDm|0Qp9V?M88*oF zji3@?0VOjInPbQmN*sGif2*L7OFwUvwFE!!;t9U18WWMR6-I<87KoJxG${8;#7!x0Fy~|t&@A;*x^+_c*^+ByAO*J^1Sz%988dp}-n*`QRJR40bk*QdWttb@#eIqd8v2N0_bxpDxWS8yp?63kCFIVX6p$e$ z5=^-gs#Ipccv76`hmCeT_z_)o@FV+|p&+*;CqI9>fYak@j`LPX_u6vXmA3bL=atz> zucCva?0LX<9fQDku_FkNaIhi>d>Ihftto;`K(0G=|MCONZ;f6{GvYr(A}MXOQf^x7 z->xHHLN-xe(`bYtV#lcc48-jWga91lAUKKtpb)ky8Mf78Md{~mGVfIoL3$-goSCC4Nf z@;t3D8WuS=lm$hkss(%dYwM!FUh`5u3tx`V5&y+y;sz5L&rX>{&Y`xXr1KT@e+^hX zc06zP1wp53gizMeRA)Y~sicEeW!BSVR+m>rD`*-)M8vvE8j28sue!X39$JZq*+5lS zUmmS$qQoq(%dDxar=-Cw557P`tEi+0enttGxI{}+S65X5tpv+1=Bc;%HI}9llaPPx z&e}RNRAdq{(soO&mY-`$CjG+==~$H0zD)mNA^AlX#zsBF|NYtm80ZU8Cn*yi?FZ-w zyKc%5yD@KX;Jox;Yj}FvWjA(z=fW3C+;53_7~kCiq%skd$+*nBLnxa6ky4}X{b*dO z?o{D~e(9Pgd-A6I)M18B)%r8H%Vm4(KgYVlu)R4(Sl~Cp(G2j3cx zSzIV%c-NiJ!*P`I5k7BbuFY3F2BK@)H5^au7d`N>@LMFh2e#-D z7>;I&I*l7|LL}a>X&22$zVm+OX&)Pi2H%AnGkrSooRwtL!d5!lL`vMC?js5qXduD+ zB_AbO&BmHjw}7{I?*hwC)i5LEtdm!16{$B4(VauNaDyCt|2hPk_4{+Ar!9G2DMD}P zw2t)JRqjWeAF>jqeHORcL3uAe2*7U6M!>R8%p*}qXtWc_;++Gr9jgMnI}zt?%>Br! z>G!_vK-)X7$R#=P*erM8NMZf?ddN}a>s1H>^1mqiL769q&p5=0j$l*7AfzY6s)!-Y z2NDJXg* z>Y_Oi4K`Rs!UYqUiHI$6Rk7$GW*q zrL9n!{oth@GMPRMg|(&w?D;bL%8yG5bEjFw3&_keb4?kASx@>!zuiel<~i!P_YOAB zL*Tk_qyY*Q03yIvV*uA#CDJ0ER?T%Gv^&GBSJ`?iz21)gqRCT5!X6bmT2~RUrx0ww zyGZciU={H?U>7_7+OT@BE}Us|Bc`7N-B6$vqnkK7^E09O!!NuX62LAt-@6fn$n(Ji zogj%&yY*nigY^7LE?yk+ejUDCrnXylv|~RcJ9NIF{C?270KO8WyIw`CaZS3vGq=3ee*^6sSN>|oBEtp??)vLbi;;*eR$?@X`YC`f!hYP4B^_uwWn;K{2^zwM>%nDA4N{YQ7%+fha zr=|fkfso+TBM|9-q5>!OVl+yzDG$zzD0YbriQJ_d7Cj$ubWiyMCn@_8>3$0qA{PU8 z<11)zBLJn>qX8HD4N4EH+y}~o*tWx;735b)3Daj1LBy%wJ*t<)zN)W2{WT=G5vI%T zeu3R?rzimbKzY!K3@o=0{FF(x z4{#rpQL~Ky;m|e)D8v?RftQOmp`k@6iWjv@;1b=^sF>c(?-Kk4K8Ha}+)phNx-Wn? z(zUqTBtGVp7z>pQR$LU38Bp9V#|xa~I-iEKCh4_5YR-?+KMQv7emT(6wOOe>|0L)5 zEYXY9nT%z_{$qmAJI}FoH=q0Rafx;W&H!C5!v?YpJKxKTJ4n|N`GvSx)9IVIZ?Ooa z)z8GwWu?F+bl^^Ij5dNj^cy>SRnIBD^Y{*f!4Fz8Qi%U-?T?*{ z&W`Pu#OWY7d=I%;iZM}HGW*~e?rckn#;i{ zySRz=u_F%LAgw_G3^4X&8GMedYZ^mHi{SXMdU~2DLKpE_Df|r2>btRRsJ!fKlYtT= z&*`#SaMF#Az$S(h$C?uz*|_-nC9~<{Pf|~aw1>x1WBQEh_#|PmzCS?&(0dV8Ny)x+ zp5EmB1?m>F_X7{LzRz4~jH)oM3(!-re#s1Mjm|u5YdCQTek127F5(|k7`34e?Up=u z5s3cmclC#kjQfs{%G2wijeApV&x*jU8B4;qh9Rr*1_&^FL`jNBR#mEO+3(G;tY)?y z=qk`c@yFZI^gJvg{>j8y7U$N|?~|{vTB9?M3*jM0Rflv*@2R_{a%jzGf?Kn`3g4Ot zgu-*bJ&y#w?-is&^EQh^dh=C~a!m}sX1&OkQl(6^_qu6y@RE18E(~fI5yMMgd;S%# z!x?4|Q-eLU7eyuhxoISQ;*H};h48I)t?EedFK$xlut(780kjuToM;ee)0eCd zzMK`lB=BNtTz**doomG+%-RCE1`1~Z$lid(O~F}!rvawC@KZRZP1bF8@zvYVcLSzm^KepSNuBJwU0!QLGXP zxE_b#b15$&=XiyCoi2k+EO5`o!X}TEPJMw=SM%e$U4NHJIi9o|rao68Iti5dpv)8k z-EsVR(gPyjq+VU_&|TFBK}B!!@5wyI1?5~uNJZZ{CP-kVq=9leqvhL&&n7)i+9AyZ z2suVsV5~9yod?x@akXNP;aXC5c8R*>B|l#~a;a=DutdNg0H}isijo`3YrP-_-?C5? zyl@C8zzz}di4cg?>cO9eutB0M2$k#knKM7?FV1nS|ET;r8T-U1T)es09sF-=xC=P~ zsP0-Jh+%@@C0U5n`iO59YZZG2F>|Oq9Oxx^-NG@R39ddHu_9B&fj)UmP3$3F3~!)qQ|n zuY-C%ahoexw%`V9gw!)#MhBK@29mxw-EjA&Y{(g$)jBf#8L-jnZ&dpJnPV;RN$5ITyb+1U^G&U;H_Rjb za^d~d>vSGB1nE>(dDkjl=?>v`_eZV`^mc(6%UV&Oi(f|?De(lmAe^=|U?-b+@-`95 zrikC>0g5@(Ol(>0)t|O0RKFfjVv{4pWpfIje zhB|1^1K>8cSXIz3tQ_yV@BQy=+M-WIPH!_VEJ>F4yAG*ARVM6){ z4J!yv?iQE?wRHKF+4|Rx&pH@+5GajYj$}3|_5l zjNcm-={2WJbxCoXTmrOVA$^=RRogc+J5S{hYeL_8xJPaCr(e87x}sXl)XT@a8ZRm? zU4O%oc|~G$XbNn0{zqOE%8&K;dTScrxE)XABVaxLFu;_vS)|eLWmcUP{+y&Bi0f?L%XmOK z%TQh~9svBoFOMJ&T2P?3(^79(CEl|z>%6PpSDK4=V$SjmGH#ae&ak(b7-JH`L?M=F zUkPGSLi1E|FcasCj}#y_o~MnCKOdn}z9u39o<>9oz--FV{4?1Je8mOa%esYqwGMZ8 z-JIySrHgDB&CeB>!M%yDaMz|r77_3nKmyYPp@(gt4HBCBa3sg{h{Zw*4E1TZ)Cr%` zXOp?0D&ODED0lzt0GU)KzTs^v+Q2gui(n>7G|GAgmbm-{RB~V%3ou96oWIJ6ZzTRU zXt@!ArsE+MA1a(?6s3(3d=n><@WMst**rah@yX%f zhA{%VS#=azw_s3ynE2lWbQhdI%U-?_^uF_=OF{tKs=nUY4dIqlDe5=F)E!TPEzH0P zhe3I}yRcWrl+X_w@BoAIhxBOr)Y5l5Zn)L7>4bG|4!l_j6`N+o)>J{FXaLISWD0U% zs4|cjWTrj>{*6FlL?QobsK7RT97{umvHmR0q{jqXn2VW#1^eE+w|&}gK->w8)4w!S z&>l2w0uzRHS~(+AAGm|5OCtZ;u4y*r8u0(ET@$PF37;GSd%xxZ;1Y&;&=+91#4ive z6Rgc~{nf7tKw@x&bv&O?>-{LZzq^|kmX2yCv?ALv-rG6@ZQi#qSWphI& z3=eyJ1d_i4ff#Hs=U-9Sm79EPcxn8$cIP~8Es8{jaM{he_7* zus{BNxaA*MOeO9>bc?lH!z-d8zd779I#S1Vl%WxobvjOYCRy4Th2Dd+HEhuq{5iG+ z8ep;Uv8h|ieG}QNne9^T`89X?C7{)fek0vn#q!w?o=-r(x$#Ym{(q2WPE9PL^C7+4 z)$2lKsCb2FSp@qU3D1~2LW(L6In#Wx9J=7dfiXmoO>o1f@_D`x}T zR{|=9Q}(Vct(xK4;P+iK`ny;no23%{9{fiL%TmlMwKPu~#mMKJ8 zPS}BYI-LkEmOcP{5!B!Iu?~dwwSeU>g zU-ZX;e>s%G@Vm|f0X#_qn=#ccM#DLub3!SXXy&X$!0`m}C+#0Po#9OWUAbfP?>e8I zE^)TJdtoeRu~QMhPX1(lY0NeG4Tf3|;2NB4;FP}xJj}rWENq-wc(_E5Z$kGu?=NZ8 z--!6XB&O#drz*>MBe$&h_R3t*ON|-u{&cRv>C;_QknwPUwM(L$_SB6F0F)i#p+d0n?T~KC}#zkNQ6N!%-+Z3A=v2qg26%Bi}vCs9zD!U z<6`;@sckfpN55KLP_@p@%^bgmrss;2Mxd-Lz`dH$y|;y8EXVN`f@|B9w65VE?|7qw zKomRykFAJX3u5~>Jqaz_D{g!3ll zT<^#+l?c&rQvVfyo92^5&63CQo zRbij}8=`r|w}VXiw>Fygvj}e4Rr{JtVxsNW;;!^=3zP4Ata1j@aE)6QKAAgs0&Tb( z`jBMyHxyio;8;L9VYuW%BERi_>%=oAzI!Ypw?h)eMyXf)v=Gj=HS0Y922n$qg#ONs z{LO40ZH-+DD{0gAg`cmC+B{6YR=c&~9n9wWYpSg-OD4s=JL<)9+hMOCdeWAX2|8cX zM0GYpLyG0edd~%bB{A*-mIUsX0sZ=55Dzv`1U4jW1zipCpUXoC`GtkQ%@_qZFiFx!%Ur2q&hH~<=c1H`ZabxR%Rk%Gc zpy+-0!4C_mK!5mu(WZI`Wt9$MU}}vzJ+S8Wf{xMzY#nA$H#iW<7SM&VT`QCJzHu^p zG+eu3d#5%6=iaT@x{vm-hcXDrUv~xuW-CVW z`9+}d(Z(_kdfIDLCm@#5^7DRtKpbij>>r(S%=Ao*h&8sBdf<_T?zh~weJQxbi_86U zU}63N=jREtJiSUQkiIU6cXKigH$i7akjc0xJ&w!CuCLAojn9P?Ql^1tt!HO#&$5 zF(8EkzXmimZ^@!EwSd()>tlL_B2|1PwP%2aIIDswOfjz~tFu5IdTw58^Q{G<(?RLx z07VI%^xr#t!8<{^V#Rk@U&Y`0L6G^x-0BHAkIvLULpAZ3AnpvZyw@cJNVQyqLo5WI z=YLwmSx{k3XU;6BUInKkZ6c=r>V}hwo=@ydbsN}pgbY0!x7h{@Qc!sK+8o| zFYMFoodrUn9X5|8#R1}Liy!K3Znn6bk(iR!XNw2B+SnC9APBE(B)I5TY_x+C`$CBw zbC0d+P)JH-(9st<;B#!@KVLIEIE?_UCU-!i4I#lrAVvA%Q1-u#{^NE6=qDZgWhK@b zyZqh-i0{SD^Kd0U?8}^ye`B`v1`@BEz zjE}2EnD~T`VaU1e<;n=qO`C(Vi3GvE&K7=Y;*l_8bgyJRP2{up#o-Z6x@pJ7gN;Wg zSQ4X?gr1P=48Ep>`v}Y=z>(I%76Tz95|7+HJP5M)@v(Na2hWTEwg>^a3r2B2;{>T` z<-beLEoyME%snudRtorNI%)J~^#~zECy6p+ICMxYrmGrecVolw{z|B9JPK5=1yr3+W{WV& z2NeR?%wqF};3DqQttOx4x#XXmw5pOR*^?^w+8)WM zJ$BRmT<;=jqc4b)(Y=R;4RB5bE{)9(U`m^Tx?ghwBc-T#hfa*0`^20{dN~5=`FhqU z$?osJUo0iHodYUlLXPP}RTg=+>Mjz8|~J?}&FM}1H#M$f_mn$-}dT0Df8RRPm3;-$t|)9#DAa zaFTd|lAJN0|JCpApTwnDLLV0;eSg96zo>ija4OgLZG1h;TIR7RWXc#Bmzm6&YMJMG zo+&d4p%OyUMCN49Ofn>elt#(WKtw8Ygp9rSv((<7@BTj8pZAa7dmO)xeQXVD-RoJ; zbKlo+UgvdQjuiYKyP|$REP2EiMOS(}1qaCFdeJpFNockP;;9LZo6ddESRL=OAdr5b z;Wl$i2ld!Mupox(O5tgzPX%mXXE^)>RPtZl$ur2^$znC(Mv3C6=r^l0!2z%>ezp`pChrQMnDLzY0b(iK|S%q`x*MA*_%wT% zS!Mbi$~FKhra*9|nl!ZL+y?|PhH=4LG=TQ=&6NQoRO>7NItXT?kBR_r%)`7aZg=_XBxUCD3b4>0(cI2 zZmcjH5qPR8Vq72;sh93&n|SE&>ATOz#JF>T-#g*xi9?;StoD1pf49hqK_!b&9`s$r6n^St5lKR&zMGWc+@?r{*cF-n;&b5dK`91j4^N*Z zh4iX%hseS2C?ShP6-9bDuSOBc(Zc^2rVN^y0H`n`Yygt>@3ziecfWW!)IRULyl%HK zYMV&6y%I`!o2m6{+AZLGAxO>qnsys`817iqsthSq!rq#YpK4;sJzyViZp!lrM<7CM zwV`6cfB$3HEl{xm!)_l#{1c$6a~Lg^kH&w94;ZyQL&hx{bC&V&4Zln*@7PR5_|DUA z^&ylhLlJdGkXi3=XCIf~xA(knrRAvG$p9mYl8y{ik&vg|27_z)U(;?;sP6wU@0Me; z*85gi@2N6pMF}``Pf&(9P&L0b?o8gsuD^ttXBPj!(!X|vcp^M zQyY!tw?r&*9?b{(KKg3)W6zVCHTNJ;k@JST{3{ggb|`TJ#0>8HM@*uyr&GXZ_zWz} zUYza=%m^?~Mw!N~-yZ8*w3zSzkaH-a_N_h`jf$dz%jj+au$M;~Tn!_i+sQkU7%9XE zHZ9zp%mO~@qpv&3?bxCsmz$Jip?ODr-&xP!`^o%jDXd6F{Mws!n2qnIw%u?LM-IOJ z=W3D7{DwJqcMlLnlyDu@zS&5tur)W$a^(rXM@QyMHgbo+8wB8b_h&>TpD zCefWS;Y>@E7UxBvUd+Im7UCIar*e^Hi_4r%@$^mCA?O6S0!w zK(NKD$UUKTnTqSZHhgkKAp%Nl)t!lus{lqcmms4HH+mTDQpvQsGJHiq&no@uN>}@3 zkxQqU-@KISh!V4i+jtlTLOC}p;AT+Dx}#V^A;R4mg+k(ezy~mIG~9@9IkE8uTfws_ zohEepFsbiUCUxh<`!e;Td`A@KMtgw6v3m`k6RdB}zvrd;K1$zV(uu=Dncpqm9E>q~ zugdU6!8&v>b`vTGFExGyC+Dc_cf@cM8JF56Y&Jn$cA1Lu&E1pa0VjfuC?0(tIAAvO z+@;$Ujv|A=Hbky-1S4w`O9qDuq~=RT7wNsBlt_>$o4k7P=bBAF+3F$dF1F!JI_`0B z6^>=#2pcXEDv`pAJ9LIdfa2>SB=?Cld{S`8Q0E|~lGUxn*7V5vs$)#`(Ys}6r+l;< z3L96VtbmxV=PVG@MJA|F{H5OcZ-Y{R7ziG5Qto#+SpUCedV6KvP8!>>}CEe9Dyf z$fUSfLJV_BNVEl>j(n5J=2ggDp9osN=mAj)I_yGmgVVmOiU#L7iAa6q%9@eklXBYv zZPCor8WM-UPf2#soU5@TT`2qBnF8V@cRx6RL7YblN;BJIKQf=S?gmXG7`l_J$3r1^ z-Ly4!Iu_tLeuUdK&G0@UK0_yPwac!{SU=|@6+v3okqS)(vAzcJ1c831g&?lunS@RS zemD2Gw$2ek55`ffBd$U?<(X!cjvrk6m@*m5KzzK%ZS3lerBJON&roBVs-di8R$4CJc)MpJ@0FZm?o|pM z;lu`6b!4UzQGlilol1BE`eEhB$q~nAgLKp8)3L0C#`h=GoMbKar;i%lua6`aek5^t zc7NVG12Dcd0%ZX8;2u$#0uyW^KfL*JK$ZK`nnu}h`t3oE z1OdfEUw*)Cou&`r3@DwHI-L~HZGElzc1pOG?%k?<;l{8_2h$w(L7&0R{4LZ0_fw>L z-wJ(s$97_LiN>R1;2EEIh&oTMqVx<=+q9_8I4nhiko-WD~;tE=GELaRCAX=MC4>;LIX3RUP7g;|;mE4RSqVOlU z;{6yD3a~c^HM~9C+ygnx90E9;9F92wyXN8y_PBr7-m>yz&DHLz+`GqzBxUwEs1ynO zxLks{7njob<0u5_0f%Cr445f96os)QutS+YgajD;g<+IXrmlAc_6d(xnXVR0(P(uw z_sZ5;n;exjFDW}{8ocf4T#R7&0Vw6bej5qq1;RGXd_g1FJG;*c^wFp8b(~1(io3+F z6Zd4|RfSFzzlY#<<-*PpUg%ei0x44lJF87~ZC)k8tD=eMI%#&K&;w6;i?41u-{{U| zrhGphumz`lQt&E&9D?^sk8<{UjUf~^)JesCD_bn z0Hroz(4O3I<130TU-Gp(R<}se3=n*FxGQCI>hZEwar&2{m6P zoim&G{80Ney+Q%X^L`KR3<+{|0cH?Q{C^?x2qwh;mUgA(TZGn%p51*QB)===((EHU z@*@qK-loIY!f=(F0(V5PJ@Tw)Fy0>&-7to43G542FJKoiaJ{3V6{Wj{5_TncSU!3` z`g2iW{5(j4Soi}*KU3xemH-tDR;WtSmxqFv4(k;L$D&g-W&_yl*~2S!n7zaeJ(6=m zyHH`D?wz>wf@8(@x}UWIJH|9gk$vYL6ILHQqPB1o3cu>fr7x&e+ck?-s5Nq%%?P$% zSOU)tJQmvIeUI;9_78*`u?q^^_~Z~9sKW4lUdMZ1(v08>W2FyK)>c>gPu;2F12LX4 z7YrqokjeG$pmfGoLKb?^VSI);+NRks-d00ePL3(sqiS$0^k{2KzC%sKNqcbGoQMhG zTA?72MT5lD81Y0xf+Q>kxC6q}eUYZ!cKr9#HfCONDh4uty$8;W!)aU@(N+z#zXngH z9?XOaeayDNEUODM!nq2vI z(eP7DCDE-kwaZBv_Y)SVu-S{MAWSpohG!lSNOBTFs~1|g9({tAJw-S65mR`iHfaeH z2IBmhNwES{5_HMeOD=zrNBwv=BP|y#5q#}iz^fBFFFxCLeh>f3)DiJr-!+XDGb2oFYlRYH z2ily*oim@7){fR*+?Ar|``pruQuvxD-@N0Qr_SdU_~sTlRx6YDGo!_8BIUcE9WjOr zO)LRmbwYK%)1&oE0~aVv)c>FfTl?RN4peHuPHl@MY3v1>LB-T*3cThj9|-zhW=5O2 zUov9SoY|*(vjs*RN=0JcP^Psij;lO6mm4C)=K_$UV|H!N`7NQCIWT(?cY z6%N|;^x0+eG5JSMXL!zz7RG!$#TWPCyRtJHBLrbp0pwr>4+-8eKp;R4Nbvyyv35D7 z@|bwxZ87!CdFJqX_I(Y`=|P&V>03>!M2F{U%t6nj#WL)sc3`wtQ=I@Ry-4{imI)vo zx&w?)X1F%$xIWG1M{*iu-y1$}O0^H%(&E3waW6owKKuDi@_p?p0|sML-8M1Y2D97#i#p_x(%~)+ki8_iKaIsre#C<;atCuIv@ZTk7f1 z(8ok{F$(pSR*!=pw#cW>>Da8kmR~e|;h>~zbAPDX_)MLD;J3JTI>XS|B)|xb#dztZ zHlY&mL@441M~LuAb_cp64sgCVD`{jsB++&WlUWUzv{_12Dw&bXR^>=G(K< z0fShDkuV#jc0c|V=)KKAQ5^H4U9TH^V(z?(sS^+udwcZDmsyfiE)iKV%PLj#aG#I4 zwjvv3y_3KJp@M`osp%I=$g%C<8TB;?S|kPHgB*d!IdmM31$w)1gm?tHbKs8$yU6dL za{!AT{3Ue2@muI%Kafa)U_YA#otEk#S{NUG6LI&B)#+{u`&H^sc8ui*;+Q5WoXD~q zB8oAVClnc>tzsgFVtiC!^#N;|CU(6n>ZRBRfp^(N3djgUNPcUn0qYw3g5~}(^UNbF zUwinb=sm4p<^+G}et{mM%s8LfYcmXr7%q8_ak9jwLl`*L3qWq-P9F-r$e3usd0czu z62Q zHw|x(g1a&lYIM~x(6YVJ%b+RmI<2_y$5--^>6Nt7!G^pyOBN$<2xEvahNpnvGL?j+ zE)XNe!D5o3MrkgM;n!@x@Qan{^5jvtM2k8ODT-aU6F=|cv4Z;whp&!#k7H{fxg5++ zawRv|Cv7rTbcE7{V+~{6?|i_$ljI%NcD_)QSaCoqmKeyrxtf82I)peAv`iw!neYL| z+$C$5S%~eA!-Qaz9PGY+$~I}Q zj?D2@zx-E{qA1px`&=a|minp5lSk$CDUN)tP;kaL&nU{EcaE6d0e1&+d?IFEI@?ah zfVC*o{ACT%*u->(K?7nmti6rriwP<2hJS~H(7@B7V9`?$HH1Y#3M`;bfI{FyQ|nP4 zBXA~Y2?F!f(x5hhMBSE_^fe;<74c>t?zlMReA6&your#<3 z&$nbCH$Gq z9$2viWi%>RP8{~SS_sq#VOe7TDEOlO!HvM($ATF)$fRide<4MKyO=;AMSFroVykCe zL(v#6j{u@XOfEzT`)%l?)FGBJq`va0XREE}@@lFTYHyeaRyO75^fnkUMEF3o`KMr{6?AuA?pk-y-|Z7$srn82dDJpp7mfV--^T7gKx6{KUw2mUkrg0?om|(U zyfJ~hjPW}lchBD0p31DKl9F}Z^oWve$@fP|;H7SQgsTIxTf*S#kUYL*Na%EeBz@vB z5@K2T5~0rur$WioM8~B0(2KHMAvs>+aP3a#5{M>{0Z%X_2B|0r68c%{wwdqpPt0-A zuW5qZ^;6ci&UBfuf2EO0*w7>83jxbod4grZc$bPbROm`FXO&6uft#Ugj$RXe#g#G) zr#SbkR2Fh(FPn;Akp!>yuz|nJA98HaF1fDA_;@_L=>YBJH@Nzq3e*W}>~YI?yx$(Q z#|b8fTY*&!;lVUu*7z5q(4QH7{MRg6-O*Jyt<)C1J|ynjbF}kR`%G1>Qr1Ih3GiZP z7sBlWfj-a@K??NA*5Ll9Y2t;Cq+_{HoR2=WvgCQcd_Lk)r*2`zw28o#D(;EaXxJ4+ z!8-GRFbDd(kdPFz$SAPmNQsJ*Nur2IQV$4|Qg&-ly~;Qgd?mPB&5g|NNpGC6D+Z(g z9NaRXz#;{@+mHzLK=_`Hw;p1-%-{Dtz{g4Y19wIvl5R& zvO=WiyZwng_1P2VD`4ufYpLSM4*h$5XvF?K*7N!(r1m}Fh=5@s4UxPI3^g!sgy@AP zxIbfT#Azbna6#@uhbJF1t)A?fmYDL14E2rDhE$+EYpxDAd<#hAp1gxTksnWDnoBx= z-TeLC5Fy1b4F0~3Ykv=#iA0y%i}T>&FPuY|h*9AZ6#fEcDr-uXsWVzB>f1=gWAoFK zcAvlnfas4Bj$(PL!i{!IteTm~Ha`!J(#R+IalLs_@y-m6pGv7q>DFBIk35h?I;X=? zMI;txka!_8NIWPtR!O6#1&IbMoblE^G&grC(%sK}I-A@0qBdE1Aq$GQA3GEeFzWGmCEUlJ2$J-!ARNg93(?;Z`_GDx3g0 zYikwV5%KDwD<%IrX)->4=vK>_S93Z0smJ{^a($bmAf{D}g8+PHN=wfXhuT%F=WDm= z-2L!FMo8;`58u=0e2b_T_Rm5)i-YTmI)UV%Ej(lJMlhkh#r`&t%$5_zk+0?3i?nOU zXkvF!Dv$;9di$HPq^qPjLrh@i73yB^ zEw0TYv$%)`E9>rt_dXf1)Fv`-M0+zD7kX@jqjF7xa#Lu?>!E|h%n?mSdU563h59#X z>{zqWhrv-aKl7*LMOFk^@o^LneDNNJPP0MJ+kzKIiWu8!puG4RZ&e0Xu+kKl176r9b=a z+u%#@8ZP^);taZ(Yu`g>QOki~nBh9OdXrvo_1l6CvtE8xjbCnj&Zkkj>Z$Umj=t~X zQ$>KdLiF3s8>4%}jpDQJTzSy{*17gXGG|C>-ExTc$(sT+A&s^KA>spSK==Z99{4J47Bfmonf1 zVU(?o=u^vmMx$&T$FblP8l^YW&Ql$DoCXAY4ro3I;_65%``oiSRl%!FRQ@{19fDc` zqOErvycebr=~Me#Q-SWydVn8M=wtqjc$0*o< z!EXSFE0P#1e~2Im0#K{Jf&H1=v<_29Jpbt%iP%7zYL#b2_kZ@AuAtY8lSsab-{ii8 z-EdjUeL=k)Qn*C_IivuE{Oyne$-4iQySFHP?PbbSJ%e?9&9>#vX(z~2wHTb6{!Y_M zTvT$?b~~hSd<=UX0v8cDZKNn4;O^alf^RJ+M|u_LLu11h!xM^=}j&ghPlVrAKT1{Zd=sfRUfdECIu<|3({4WYJItu_XOnz+4(&)qtLjX zHto4TYd4)H*vCXQjL9pw@2%{_>u3MGWEg3!>c{UYxcuk<#N>?exDO)Ieu*H6XTAckg|Fxz= zN0MWw&X@`ZwWsH{nGy#N}^7IRO%e?iUy^g8R7$ML0^(2@gRB z{=L0G3sz{LCComP+70{pTxadWnTu-RtB@?kR(u*ZK9!a@73-ingRwMI?dp!A+KozH zQ9s#N1gpb)8N;dx3?y<>M2NXRzb$-ESaW^br*euk=BMxQPx~Lk1Z8#hvcO%AzLtT%}0V6=q-B?-W@lKPI(lmkwV}OV4 zqdBZ>ipa7gTT7wiEhlXgNG**#@$_?JgVJMzAFoK3Zjs!P)W#iMBPZfo2X_agQy7~t zuoSWoO&^*dM1w~VqOoUX*M(5W^w1EbAZ7?w;(*0^I_mXLF0(yoSD5eB$%;9M%gVao zT%{eQrDR;BaMG?~uF?*!t~h5`85u_hX>l1baapmg7}OegBM$1=0@?-;>Qx)+fTV+~ zxR|K4g9KQKl{{u!@`2-YjJ_U+lw{AApz`^cbC<+s@;>sio}%7&mD*K-_!F$uWjCg1 zhB17Ol`AJk%nIUP1Cj!G~{J z!Y3&(&OSg6*Ltj6dzFs&GJm^3*dujmRmyo05fh+^?#Xl?_<*MYVVAeMr}tR4d=r`> zv#M4i3ObRY=Ie~+DSK*iIFH!Di+MRHwU7CIT&E5|X6EK4^ zzziD7k;++txEKW=A)ts z4sL=k$NZzfKBM~mL*MhOrN_`=_6kQ$?uy^(Zx+GV_mI#XaH!P$#s{_l4Cw1W13$L` zeSua|`$6_PZo$B4++B|zp26e_-rqX%rrh8f@M}Gf4}18Miu;`^&WHR%TUd&TSeV$r z9hI^O&(vP*j0=m^a7xpndgoeBVzIpqS?l1v+6D&QFhG%Dmw}Pe2Z7mQBv$kAck*^I zWkn@`e~1zI{=_h14?-C1;LC_AqeC(&tYl%hZI4*Ey!nwgxFb zCTg%9@@#Te$NtR^{hCXc`)ec|FhWPEJO+iN=Q(aYjJH{x|^ z8zbv!jH}I#{S)xWi5*H}Jbv*0N`iEg)a!Aa7kWAJ$6Z}sruI}53n-kM>uEbrzQi-7 z57Lbz81p~&Gw(P76^vimH90f#pi|R5wmypPTXesES$SE6urdtP{YO>S+&FUmMw?>C z;E0Ij)eYZ+dS5T&ye?!FW^bh&&#rEP&!fo_ zIFE)6giZv)dPq*8V(EL)(-$` zAVtoE87ik0`fZ-m92*s%i8)c1{Iq~Q=}9)TX4EH!nvOJ{F}T0Xngq^7s?jRd`25;} z3Xbw##W#J?uRW$_jI)-nXKmx_+r1nrprs;~he36$U-yiz(zP7n)U=OgB;Y0#9$ zQCe7m>u5jhtPn*A0P`Fvh#+9*mzp)DQ}GA{=^Z))&~DT{mkx%SkNPGze!*G+Q{;aKEhmB7w)0~2B&Cb2y$373n~ z^~U^ffIPAT6}g8LwMQNOsZVfQYTn@(hqjtZSTHC%-p>flc5Nia{XF?OeYx(V7RkAZ zJYCjl_tu7%87`_>t63G+T#SW@;%)TSB$2};KJSQ2nS{qzou6Mbx?YzFJ=o{hlSY*T zU|;&}Q7SHzp?N%8Do;8;?7PUcSBYhIpYHQ;t`)WMUAMC}LX~Jaz2Rh$9ezYU+q#3k zC`9Ow$Ll^*;4NKsb%lOABI&BmkJO>h`BD zQUD^>KGQUP=qKBKinb{#T3f%1i9tG6o@}o|d^s7HS<41M1x&TUcD}*1-PsXG8QLV? z|6@RH<}p#~^P435LoaZoZOo2$=guex$);vI4}i`NXO(VT9Hl8aunOQO%Er?V3*^3@ z#w{f)PG4@Xth|uwX6AA}kMd#*lZ;`gDYRPG3ntq{Vmu!!Qb2|k(m=vFwtr(hky znCAodYb%q;AyZ4ym7K+jylQ{i{$V?Q>q0N-mBTn5BCsUYAZ$`ze_CWXWOR+1xuYG` zB?Zx-wrU)Rl-;Bb%FOZp>^=+|E%OBMa7-D{Qkg_r2ps1U5^zbwUmcIso<3HXF?_0* zn7D+aAiBE&rCI0c$4xqAxEl*ZgUwd92=rz`_8bqK8=(##U^GaR3cKz9HTHF8M1wBG zj(+WarukM%XRUqkE`^WhRKB{Z3_VcNCbmBM%WeDI{mX5;68Y)sB(5{r2AIDy%Qn_1 z^Zp2;1L!7PhsQ^UD%nc3Tpj&kTx)yMq48nK>NQbT6A+sXMm@Q|vT5Id_D02hnlaz- z9%Y17z>WFnM7?`r;InyOn5R;i=M8_Y!dvIeZ52*dpDj#NpcaJZ^fa<=N2=I{7C(%DcRa(iSMxjw=)vDI_^8T=z?8r`3T4?SA;^L#Km?%(D@#h#3_y^ z&Z!Goo!1!J>cnZz`pYR?y=IRGrqtjVd_+SbsU>8PpKKl8nIt0|3>wroSgE*3MjsVZ znBHpbHYuo|epJZsaUwJE4J3OQW8efpzQQFasuCj0YraCH#&g+ZPO{(0?~afB!WU-B zRQtLyt%B}5uMPro!LfroX4!D1zXq_%kShJ#!+DW{pvy&p+`BsJpKFXRb$+eZz2wik z$J*_O`K$eC`M1p|Y6>_A0vKLe+EswTCqWdq4)$1iwm!<-JTer>J6Ilvr+QC(tweb) z+QX2M6U<scPB;gxz{?;8@kZ{2`gQjQ>05_i(H;Eq3+MP-D1qT6 z`%K3-(@D<}LlbKzM{1r@w{t5z`Br^&<6>)jOcdlX_Haeo@Ennx3>Gm3F-Z*FFJLf9 zrhHfFypU0(p2yLWz}DtqZH|R~2OJe6CL41BRo5vm30IFb{1pv=`J_nE0N9}--%$1J zm0liCwG8&A*)2Gv5J9Vm=wm!k{+terQ+sho0yggNi>qoUGD6w@ zCrhNC5}!ZPlXnUq>mX2imiJN-gOi`{OS0FW+jXDpW^8kM2n+dJ|8WBOwt5m`eOURi zOIKHEEmtq+q|z06_sd$$t}8p#hk+0M^9b_SV9O#^h;#m5D`tsQjEDXIN-^ux>OU2; z3~$W$iC`V&Utr;-=(-%xWPOjZAXnTZUaleqeW4a|3)JDWRwnb}bAyZw zw`v|9y!(tA6V&3Pvx3(g;gGjTy~Q&GL}^?VK)#OLH3nKhkgz+Qa?e`xsb3~Omqg;O&f1lxqTG-atbaq&Nsz}$Cuq*TpN-opqg~+J+>NVDd`(-Yu`YR2-aZ{Fpt?t=Ns6+{ zg^lt~7VlrQVMthL7-MwJJjg3st`9i+#^2^$zW+~c81L&ET+!=GCP~kNJR_E|BF!|n zc-t9HR2;c%#eBm0D~LVuM}Wyg4(uh71A8&asN3WL^&IJMCzB7ky}T$Raa{g$SfO2{ z_)X1E3^EKJzAeKr83vx;VZRgU8q_p*kbglk5l9WAtXhEGMk@5MO@jeO4pAI9YJ$cx zT7!TjqLjg(fele$fz1R`KPZBk*r62^Eb~8w_0Z#Rk0)vYd@K|OdLPj^fVHck&ua=} zL%5E&Z{FDq(_3v76S-D#>UWzbI_hT_gwl|JuT{zg4X$0E1EI@vg_RFQ$x8VgAk|T* zSbKDyCqUJ3H;E#hiNYu$T|y@;Y#G7#w!H_j4EjG;;eXK2s|u1HLTxa(@w=q^)$}(` z-eOnE54DpT-3+*k{SYZ{V|V>pxhNYvhtE<|(H?8Ko8*u5it1s|Hym0RT}Wkg(vzBL zT1m0$fn|SsbOGhwuq9!ykER!`85D+4Iu6>nizLItSbfA+VBy;TWXp$5Vk3DmQWHR# z^M4cMsgp?o8jZw|XJ7?Dk-r9-6uUHPDuv+CgmK|17BqAs&{@wj+hQcGU zDPENahNQRJP{-O(*>Gd;RsxAe0tp6#0l$e&Ac6aNwO5j( zI^++<=GL#!^$MLrPkkW&$S?}b$Cff-2NHpo`i~O8oS=!93d&Z7 zXi;DE;F49Pc-wtp< zvpeADHV(LxSt2A9NP!q(Le=N=`YP94qD0Lc>3XXm6>57Ov4>cuBmV;{GD`ful;dI8 z<>zs##y&r6+PhGi?tRUee{cIl(0j}|P^SQmmG5`VE(nT>u$~AKxbxcr8(rLD`Mi+f zdvEpLAjQzM*V2cEaLLw4~;=`T>Vxf(uF@tHaP9_6uD z1?}0AM?5!}M{)gv$+FiN*+Uym6lzeW0NL2)$4^ifD{{_GI?GQMmXp;Ue~FfP82<~% zslL%7+_}F7ELa#*|DF?nP-^zviMKN!HTTiOtaw4F&Xbi+zex(AFJT zb@q*aP4L5*)NE*^^~x$PvHrN6*c$E@49RU1+Mzq3^i~wNZgQ;1q&P$F_`G;qU_kEq zpw~g~9x8k5myJvGzlFtLi9lfqnXcl62H7~FYvSLx^qjOv@y#shD$EPa`8LK|meUjh@08VfClZkTw)jtiAoV z2XFay^K(MKOygCQ96JUd%c;Y7K^faO95g$(p+0QTd-G~0r0WTeAqALpg1=m0#DNo@ zzREc;=RU$Fm=c$;$4!V4UY}()s4pb$H%3IA6G4Ecib`vl`s> zI3kckHtjil=o@vf)=SeA`VHnqEt;8iiMRF8m8!8M;`^_!D@bGPY7}2UhP_xhY2?OO z13cK7_Y)p3e*e7EC(v`5|Gj%mc&7>~_fvqKR19~#R!`!4kYSj@)p zy)UH&&w7W{-5(`~CEBrdRM;D|S|fCh!uJNLaTNT0H@GW*qk=wYJVM`S+ut}LMu2Ve z;4wV{i|5^*UM}sKX>BK;4w-k9DH=|WH_PkR3J<2S7OtqOGr^6cdYYhd6h&;PMhbXn zgd7zKkT94DHyT2BUml;W_TxKu_PxLC>StT37efK;joMf(=>wB53qYr+?i5Jqr6kaZ z)pQusU{TFKcy6leneDCFr%%iqEk)|=p0Vn_Ypc3v9K>)RWQOyw7hh50u!6;eEl>~lYI^s&ya3hSirmwERxUr7NA8Cn4RPp*m>F?l6}+og@% zhe)O=^&G}PX_H12eI|l3QRq}6%{fN7>|2Vc+0+KaBd8#Ur=+==^*O2}y zE0cnn*n_vEU@M`j_vn*@v^6*JJ%#KZz}E#PMCuzy$T`=6{+RciXYJ~YnUD7r8F`w$ za6Ig$I=Z@7!3N{KSJ4JCbVJLHqY-O${F4B8NrEKZ_nG}H_tl8c^NaDjO#?AnZpd`K zGVl~)Xk<&IhJ_8ySK!^QOMG7!&nCFX7}Y=Nr0MtlL2Wz_L*8wFD_aSO9!2Q7*e?;D z1kIf1?q98@x`5U@`Y5Z-??H`|rPl3{&;|#Nak6*_5c5s90OkNu(Oe; zn94b5SI)by5|N$ODjOJI(VnCe69;z>cJy}Oar|=hXI{nAT-r-Hne>4v*c3b6F*M&s z5cVZFdWRWGib7XX3$?Y4cLhh14p1KLB%|8bznz@-%c3~IGTU`7h#UlPc^F3W6>m|U zS05)w4c|zTRN0!25}4SSzuTHnm@swF)x@&o$$cx|%F*t2Yr4jU0kc@umydh+rm1}6 zmmbnjB#p&dw@qxumQ<}a?|D~(ZD<|Jzr1H_JuCS+^T8N~V>A{WfQ=mo2$2>F1-s8} zigfe6yMAa$hWV1rlF@2{vt;{;Y_`)Q(}`_1doiwpU@|Ona>245gP6K7UK@(`I}lk2%`_v(5E~l$cPLE_PGwRK z!bV-=GR;S3T%vuLrF?6BG3R&?dthw!VTJ5h+RpZ=9I`Mm!sZ?jU*7?l{UwZyL|W!i z*e)jOU%i^Lhod#s;nrJH;*v}XerZ+SZ`sZd11P_?bEJYnmq##`VSh?ocPu6v5#hH2 zNxSFf6@B|#nTgS9%ddI9uzdo>L~y8oce8-AT-tiU;zy^$!sXY`*B6r7i`VI&cT)Jf z@7jE2@XGBG{1u%#6>pQ()KiSx7v&o|i) zvy-ymOBBi=vpz6{qcm>f{xGi%Uoe^>r?K*13ggkDAb~B0a!ov_vOu0e$9n|)) zMk+2lcE#f{*^?I|Vs)Pj1l2Bkv~bx{eboYWaUbsIZ&0Q(*td-+&~Sz#W6s~JavdB4 zKO31{wtIA%*BRNui@szry-GA`sl2KbL>(7CDpCkHsWhn%PE+3(W%bDou5IFiCu=K7A> zRcny>A&9zN~Pr5eavpg+%laGy_-{;`J#leG#z z0W<=HfWO90gE3hkTJC-u_RvuN%=_8)-LJM9wL^MNCJo>J5*pWkxzd7ChWf(uQT}U_ z18o+GoV;C^mpl{C)E}KY_Yp9;ZRueqw~mWfPnr;`{+$cPY(G(wk8a2;P%8?f@x7cF zQC5lOhlYs`x6m|4r|={>&xNle>xYAj1$T)aip_=9;-V=+6N$xVzL5o8(dkegseVb6 zLGE!S{pQ$Q%bX+mzQh;ptX&wl6~!);;S#zO3+r8^0h845DI^KP%vLK<)C1cd} z2Ld60LA!7MMpp#NG2*z-W{vJp=k+=DnWtnfk1H*D?~!`0K@2!jz+nezC=}Sy^!S>ak0o&J98j^A$Lo5i3 zNrPKbTJp%vm9czL{F^IpxV}$s!~Tq%z)J$rYHju#_rBf$x5T3Zz9rsh6>ofG#RKD& z*xhgXBH7<1r8`ebeKu6E;0I8omgnUGJvDH;z^|C!5r*j50I6ZPHu=ALgy+gMh^RxU z-nNkt!clGsi<(B+>SuX#7`%;SDI?|9y|}e>47#N)6Z#!jL6hMnEux zhb%omUt;(i)={rv?F}fUs(xS|c_Fs+(cWpUo|6pA39{1F=~YD#bRM(_+uwv+gq5u} zr)zPdb>){HWZcxw2=QLei-*}wkTV@XB#~4!ej^G=M0KZHWDP9Ve!P6K;^I_R`ahNEVDA}!^Ar~|b8@0K&?@J@Mz1<$SL36Fh-ACOaz6Wo7&reY|-T}vU z2OI+zuI*z`=uH%E)SeUi!T9Co95qe1f;fh*j%RcW-HUy}@S*3d`hMU{JsyCj zP&suhBDEB_|1tU^XvOZ}Y6(`yXCUm1!_@R3^*w0Jm`=PlnRImttf2n~cnL%nAU#8h zEC|B#U-o5*+-aUMzNC|d(}-wvoSJZVd9yAZb>ZEHV?!|*CkKS(&8*?Qwi8PC=i-4@ zm{YCjYVaV>#_R4>_X``(MChh*t#A}ZzikT~#zJRK&xAa$h|508crh45ES*Ka>hMke z0!ohf=W%`AtGb|e-~l%|%!;7ZMM772k8Z3Cnq;y2<&c)urS{ouD1IF?F?@G>a^|2^ zSOOg0pyA-81_Jt|$by$i_TfI83=RgIo8E3Rr*6%MNK=t3J6$i4>eCDspu2jKiNhQ$ z;}!vjYdb0O3A;dA2>4BO5ilIE93MOAE1M^7Kg6vO_U!?&BWw6=ZsCNuq#R5URoLr@ z?zK-+bwMzEgE5a+OhXx_LU1BY5b8k+9>f@c2`23cZadEWu$WWB+L`7?XJlN_)Hh3& zaE5-tbrFXc5nvP?5@8eEg;wdplc8MrcLo3Gz5nLjSTHL5xppFz6(M*i-j*W)ZfOx> zJ7B%U*DSnev~Mk{&9rGFyl+<3cUAJP08Sg@{qavG>TfQM!Li zBACKJ7?8yvl;kqax6%;7N1_y4HgNOi0eE61@XMq$`$Yc|bLZfAESLbuq@-?AGvwj( zxYS1{{bCYs9MqCJ^*!;R=0!K|JV*6!P|33?T?fOj3KJNcP(@(~najNKZ(L@eP6s#p z6Bwd6UoyOn(U-Gl>%EgowLA~=ZatduOwiv8;29?9Zz?mBh#>&H2s1VRA2FGOk74|` znar{u)cCRvKGkG_2n?f-ew9gnL)>nt_w8^OMMgM z#jc{11m@4o?-9>TCfQFBi#bCL4DYsFQ+u@P!!yLyp)IJ|^W3KFW7iNtDz3R8jpttT+J5v@tF};C24o ze-o-}i*dWRAfIB!J3e?b^t9Wfk+uu>E>yoLq*G1$*t`bLzYgcl>Do3^0#W=pBGfKG z{_&M?b&~vh!%Z(c-0g*e9b8VM%~jNnS&~XtfQd*LJ8iJE;djFHAfPOO2oh}%sqfso zCdO!VT>J8&@3b<7idCnN)pzQx`%#eu*XNaRfL1`adU$v;%mxLLhDe2CvT&H><1!jV z*RY~@M__+(?Bw7LY;(Jg#>TA&Qg8jzy>6R6CNQ9uV6z$gSE9Q^Td?~Ji&tzf7)cA8 z66t6sQr7Q>Uw-RmtDx{8ZSNK42{t4heog64t4DypJ585J2BQBlXk zPRs7mlJuKn4)&G$C6?>X+vvRMU_2<;VjP}-?zkhsYJ@*;h=WPRbq06nI{OPfw*Q~Qm zO9X77V%4wV9XWexm12jyV-~blimDGTF5DCcuhvh7*A9We8xRSxK&-5ss3bfjCf)w* z)^R5p^>WM5z{eBeS?nH*VJ|%N(mC*_z>U|{fNy+V7KJwF%cVF`Rxa0P&xyP!BMq2Q zatv5J2X6v}RMMFf*0GBgLHyq-d#VShgzv#RL8v`Iy$U~DCSWvsHm`s~3|}Xjz<1$n zUos7_@c7f@yVX8)UA^s*X}-(8#JK@?hj;?~J^a3?{}3|+fBw%I_9%NM3Ser(X$;zu zZBqT!I9$x%XSB2iG8}4s!|ae9MZPQGy$aFM(a~$30G~pegFRjG?xmegM0NKiw=rpd zo@ARvl@rIUNtvZzQ%a31rdz@G(K1_c05a4gD)k@%v1R3%1iaDH`%vk@BPlT=fqXCe zJ@h%^Osn^%We`iuyC|q&Jp15C2eCtp5NwWsHmpZChqCe_BQ}W7_ibJ?rq1%i;r=^d z4dg#8Dk)_sFhCGeEF%l8TD7`%t#w$^>;=7XaNe_)_IU2;v@GVA5j;=Cc*fXRyD=6K zirs&ZlRLSSI0llQ96}|0KzLgmgP7hW@(UU?WJqpM(rWeH75aL) zH)T(v;~iA)-?D2)oyQL;(Xf&pGrKjW7sT^prI~1M$x`2IDqD_;pO;BEm=t5B4&p&W z6sUYl1(PC%-qj``VtPtP{@GL0{)Lq8qGbHxqkb>SNAgqFty?RJXp{aq|X_)UkgUvX^6pXPh zRa{0H3ZhE|fja*e_I;`~JyIdHiKdOR<8^*tE>1P&_q&G{fAHoD6nkoO5TkbpSR)j% z?iETf9*2?|Xod!nh3n0o*76>TmXVe*w^KW`;c8;8#k~0@g7ZAb4G*@xO;3Oo^GF2m zvo=#CFSGPEjuvcXPfeuW9c5lb4W25>SyuQ93U%Px?&DpVHnu7L`caK&_G{nL45`Ic zVfoPY3lEMq(A-_q_f~Cv7k;8txFa7Oj zE;ZiAH;EY}qG#2zAB@FB6BLuReo0n=4+K5zzX~2oVkqleL^xvpyZvD;g|_E2%h@N6 z*PW~Ab|q$|S=G$G*LvLhdRO2pVBz3`hi4P``3K3eUsUN|9CQe@Fa8Ufd5=mB#q zc2S+&qq-NUHWs4~mlf?xzwHggd5u=WhfFp`A}scHm^#&b5Ibw%P!XF`#Aubt_2YvG z-4FmI^s@e>Sw;t1xc{VC1~Qp%82|Lc6LBdcZziuil4BqAmA6;^DlIU5`i>OB2iM2+vbBf@NRgzZnTFZ{VvMcBuaIzsb9lOBEN%DBPHO$%U4yHidH zeFrEig8hgh==Mrn`6BxCkoH^CyS!KYuW5U*$#En@jKF*RN2@W_;ifE?w`%jKp_$!t zqz$CBKJ+w_5=*I+%LO+E_{u;|X$Es921Gji7+J;ZWl}f!$57@%Au^^!JXR1ceuzIcgKiu zR}S~a2+>4NIqQf-TK;m?%G<7*_KX$teqv!dLfxMMOIRmmdz~<4R15|>2BB({A>hnu zF-f%an@4_4MVldFD&9NB{9f3`Qe<~P&a2V%f*G^N+LldMTr*CGdEdhT=}bG2TB4Cf z4#D3el>-@~pMx(#qZ;`Gas{7As0K<6pb=|<|CBfcno4jja9@{qMQBfT6~m7UEcX}g zj?PQ9><=@Dbe!P|7hG%kXfZBxR3IYoJw%BaW#%-Xc^k9&$sHf@N?_&swRdk8mna^9 zS|AE_KPH?dj*T^_Y9uUWKhu}kXIIX?C5w5hbd>T&>$CJC_#z1Z5hLo+ms1+B4o9VP_Z#*=|6Az!+y%a-}&7?yGAuv%4!bZ>r@i zlkmMXHoL0I_0(#Oh3ONh;p(c=lbK?PrDBK?Yxh0CWOFvX{(2}-($zM8-zv?8kSJZ^ z+Iy}s5>_AVb=>K-KLgY2Oal*&`AJv>35W#a-;#*Lb;`Y}?{M-7QKc;FsU{kuCB0iW zzLPH0PaY+*br9CYVBF!_4RT9W1PLPi2)9%rp^sqGb%RdsVz8SO48iuqIT9m@Zbv>K zj{Hy2ZFK_nsIVqnTw6#)5_C@IwyYXwyRzS>=8bQ&m)d=-j?`@0z}Ta^;xFv62JJ6F z7OJ#g$vWl4B3;^5=^naClG7p{8c71gF1s=+%DxNJTLXfGRUJ%_P@_aFZ5e=}I)`Vo zi}&ZhHe~zqydjsH`jT531+SE7`TEP%Uh?M}DgYq#+OLjt!k7YHeZ?X{z6q&v2wMP1 zC+*@V#jWy+AIBQaAv&89mY2SFUvklHrt&tw>fC?d?M&cyyNsX%M1J~JRwI8OCA2r;5OU!$5M-qyw>k-+%X2U`idw|XiJ!; zHhpDJ9YZH5dRWzfqKBzEB*jaGC~7389@P(-($jodO5YPFpCGZ3&_p*WaPwPQO8h|T zacOqlV=%SHaG=P(cZ zpPJv_9EI?+6jOeZJR|w}iOca3``*58p}uQnF-TkUUAh@YyaB{vt^@mP0>rVC=r_#6 z2L5^{&2LY$(gV4*g<2`cjlU)8?Vp$2ilh-E0mBu_vsbHz3m`fp09ISy+*$J*<^U4r zmLZH>{aqC>^1^VpJZWb=nvkBN+N1&=x^N ziNsnYfWF7yleGznhAq+Dooyo}5@vp9=0rKv3z>Gwx2ER}`D}x}f1C{VXV4cf`PTeu zZadjce~us3)nXn6&GhDhbSxmb_>VqbBfoBMvV0xthBXS_dwT?K#W|x3Yl_hQ zEEs=S1J8OhcK|*bo^bUCG6CFHdU8_JL8;U73EStfrJmq-W~&{OpH#p0-pinC>OY}# z7_`M1C<1qk%sv-EmLp<_2#lv_X8syCp?Bo23u!~1+$|ZOi*@q)5;UDBEteoMVG%UO z9!~RT*HGBC&`Y~lRiIi;m!^q1Co-XnyYV&@`{V4RF6Pj?R0X&t0boSO9u5hBLD;UE zBk6wu4YbVUX#A6?#)%HHGgeR8Wo6N93cX$W4$8f$*T^jw1c3Q=+}d8Ju#gB?j{-{8 z6gm-C=$1}KrH13in5d?;_S$gb8e@t0;>`6tIM#X$4(R`(?akw$;!k{k{L( z_b1o3>~o!KeaGW_9J^ddOD?SQ)r)<}ZWg~H^ri=A)ub=J6uCRhcNR)=_MMO|7w+j> z^Mb{D6~k$}8jS(>=uQ*JqRfTg8Gg9*g{g^WK?*|hYeCr;pu)5xz*~P1eTZvGo%AG0 z$R25lJC@KX;W$Y}hd#@CT_h#ir3}^b1%&@ZIv-$?p9!EcJ=lNz#Xj6~Y>XJmt&4YQ zUnrQC$H{p0N~HOrJp)YF88ojO7lweXu$SI1oZu~eLB^HjWo|^Cb@qnWC8~2S2@{{g z3QbmkxjT;PR)I&AytM|~<3J0xM+4tvFii3;KyTs$0U{CDweF=O^DJyabheTlpJr~+ zKh&Zh+V^9Yy}*zCOFjZCA~!Xc&g$zCZ}vp~Emg1MEyjzN_CFbz1EWDkwzhn>2{hQ} z(uCyzLe2YU1aOujf?{Ig*79<;c9s$%f>yTjVm3BtOKTxf1v>#t5m|W~F$p=em{_1P z3^>eSM0F6Gk0aoWWs_u+_4c;)VNtd9v9z)Dv1H?6^9k^PA2)HgagW@-dgU^sxofcZo)hFexDcAz@wtFt9RVRp5dpX_nTxx<`(;VkqGb@9ua^s0 z#lgqN!&{P{-^$X?*~`|^+Sd-}9}wVe@8#;}Eau~kb9eFZ@o>Od`?&kKqP>OeeT2nu z0k}XHTp-R$*xTF7(btyG(ZkN0&&|%q+sEAth+p!#IJ!Br@le%c9bLgc`8~jw4*_4) z-x4S>_*@3O(QE|>1bmr6+tm`>7M+pkS1zGio99`|BufT}p zE#2V)G~hQC99?8lFymcGc&{X!$TTEG>lH*83I+XdyC26;T>BEm#QN$sU&uM9_(LmB z8QCOHfSk^IahG2ZSjhDnMvOpDi16>gLJuB+Y2~qQl{v$w=ic<>OuOvpYMD+od4(M_ zz4823!G$}CtQ@z;Q7&rWRN_ZW$C3VPe)*r&UnshWfv?Gn;$g1dRU+}h7>>nm8S9YBWq&O#@5kIpZNobe; z6-nUl{{JQ!!yHU929oV1M9RwOvufOjV0D~>>0^z%$Ep=>OqpRRumZON*RFzC2%6~9 zzOnnSe4EsTyUK{jY<80DM^@$I=&SVplHo~X*L~~+&u=2szCb?UZ%H|59{}@%PdgxN z4=}*(S@d0>FIK0g$R)hx(suQTfrR(JxpOjubYtRPc;;JQ?t-Z*m4#PlFSa~kIQ@m{ zoG4S=^c%>X8$uWty{f-j4EQ4A{REq7`p#jVH)aX5C(JqKhfYzDs!k@XTh^VMM;T7g zf31UJ9S4Yc@K1J)KZ^kujeRA5)yF^eoIEe{#?rE_$SyaKof3Or)Z8k+79A`m{Sf8E z3N9M{nlA{XKz9AF%l40j8a}0e<#R$u_PX5h@nx&>+pHgfr{+Xk`VCp8T2SYRZ^Q~? z#;4m3mGDrl~BLSa)$t9;bT{jKy8rkepf7c9+x)@Qx!M#l16^8A7 zFw$#{@wJG4`kwb|S;*q+whzw0m;4Q*joy_^jIHs7p05Rr#9Mmq=d_ZRk)VrH#4;1_b(Iq}&^^u400GF_Mq)_D>H8h|6 zBC*>gftW#)42$_bB97xpvC5D013q2K2Fbs}ZD<4=uhRv(O|&1N^N7#${=WjSNL*!* z=rWMwzP^G>S*U90FgqEZv-^(4-Z255g9yb!Nu;9+lti) zgTE-xl3|UE&Bx3%VN0Q`nmM9ILel0a2NNJOW^(lqNt~5nJ>!7>{NQQ?pGtsZ>oASot%mu~S&aV){IskxJ4t(EYAb(HE! z$iV{G&@KXR2oCay8&URLG;6g%W($eM6{JW#`ILETlAB@V4c!HoUy5&ne8lYC??r&@ zZx9lfvdtIUxy$7qlXiAy6H}zNQOL@rnX)}V>_aV5uyYuEPc;Z=a|l~ zTWmF?QQFDN_kE-)+g+seu$zFOV*Eb%u$B7n)k{e5BAW#LgVodL`y1ieOXHR~2v#PN zLb0IOj22zHlz?@jTtSn`}rAUVYG>4wcT#veY02Z7VS zCoGwl9NIq^j{Fddiz*#ZsV`&ekD#u4} zx>U#9$8w!MioZS8=sEWxk}UPWBjQ6sN1u`MAa^=TJN6?F9X)XR{|2T3fr~&5V-bTd z68lqOC__HGE0^F&mGAYFi>}reNx0UV2M^Y{b?7Z5KJX}X1hpDS%6?xw@ zNVD+Cj))jSR@L^jdjaI6_A3L(a-XXUZi0H`Y6@iyKTKRLo_b90nQo~gLDSCxwSKgK zVyB*6WWN)K(ha=W!%_Rmg2yRhm(wokMOvHPSW;$X^x03EAnYN#lNC;m&j5za@Zb>% z!crLhLQzYsrky%h!qy}OJ_bq+P{`g=vqjP~d`-?WAuxHNJkQ<4Z2IWQZTVaGhwL^y zqG#ZA!YH-xphf&YAI;R%4c2ZG@RbpBb26_y*+E5?^gA-7)?Ydd zr5g{u@m>UQr2b!3P-a6H=W8`TmYeoa$H*yzK1eZ#sK-bDp^k_pVPkIl~e$pK7=CExA_Ol|{) zd#nA-d2M*8B#Si5?6MWL2UdfnGppHqjM3VO3oSAWu9u@RWMqpAlu%%7Ot`Rwp2BmN z=Z+7Y;2t-{p4-B_}SLE}Ara^ym68L|^zte7{J_P8YdP(!irZrX!){c2n5HNIeH9Zq13;d)(2B7#EzNQT!t3J!v_W+rna z?_NT>%||5f4ntGJDAoOo)CA;B4hlFCxgn^8W10my*me{kS=K{MNxzInwSn)}gL02HWLd{7x#eo#Pk1p`w5mtYw|Az>aC z@IT=0Frm4VoJU&%z_e${A>Xx^zC6bW%K!;F&%Gy;jYej`{2 zP$;adye(_e*gPgf!Ah7B=i&+dW4Sq6v$ZFiJ-53(bENO1)TA+7@B>gN_W_6*4+@30 zM-Ny%8op!yk3cA4y(@8?*=tx=PckpH{1U`8# z@p{5{dyePDlO}ilvLPP4o*DXrx}f%CD_JU>P7!5!2NML-A_6@bG&?EY7>+VM^kmsK)lVlr<4ZMVKaOP1j?KXe7d}o80Wh(&Z*=@YG!M@BvL0hLVD+> zZ>S9w@i#A0=Cw0eB3d+N4{%y@o6Wn_0ZYL zZ-?H8Dw#urH4Z4yLOHPEEKv$(2=FwVg>+C@2Z6S{A9oSbW|L) z$WN|f+zyU!v^UAKGI_T&l#VR$@r6cF$*FbXRS_lC{J|?_a zm|EgmrDFM<@s+|@(Iezd8m0;!+@Bs<+m1Oc3=2wEI1Ato#& zKu*XYC?tRuK}(?FaGV5MSWFacEhZu)ASQwq6ca{U3E2t>h>D@@#KeSb&qZ;ez0X*X%_7&F0 z@Wh!HHfRd=)H&aw?oh3}K?-#XBMn#cmmxhj3j}5aw(t&d;T`V9*tpYf^A#Q)R?i>& z<9FhcMH_S&p>DqPv^?yh3_SlA8VOx#zsCde>*&5 znEWdP5_ww+^}I_O=~FeB=9iHIlUJ}Wm|Vi{$swD-b(kJIA|&OFrt z1j@Db&QE5sbM-H%oZs7FFNp&y1Te!)7K(Gg!+5A<2fHQW^w# z>rbrcE>^v$pI9P5GiSZ?(n37<{#^b>=cAeGy`7JPAjmVn)kFY6d1IYshZwRDU zvx58>PFbd#(WPtR+#w!!u`YmLJu6dudNm~7x-@(gl1?*APsYJ>f1_~-n6>>`Ui`YJ zFDyzY)A;JsNFM3y!`@tPQmBHdj{rvGP?QxK3d;Ttje{4>7ly*Z6%H-+D+ZMfeo$Fz z>lbz7Dyq|`lKStRzJ4-t>e3O3m1^CE&R0Vu86&HT8Bg9Y^>toTBVslk%pU-@(fB#A zjR!Z8Jr068;v;c7pozRUdmtwRW)A@I4vYnT7@9`7>jio>0MoJ0-h@X6?Ee>%HzhnO zV0V!V;A@QeNyAWxCO;MsyLm;z$!yNd1O)!?INtE;e^HPDdM8lfW`TvaB17S@%T2IA z@Mn=AM>W8>2hQ@*5_RP_LON8$-P3p(g)y@w*b4m@*;U-M>+kt{jceqLC(T z)|33=9@=_M+yBCk4!#(jQOCl!hz3esW?ZLVNgmfHToI|eCc`cwCeJ#5U8Ozn7%J}?`)jCBXjHfh zim1TV_uOc>X;CXNv2fO?trX?o@M3}Y5uFb>efJSGUq!B|LxF?#DGPhSbI9sr%H8ED zAHw)?7W9P?0ix2c{F?1QH+z1E(@CJ5*+Jdh0B=j77!3#F3Sgd4ueQK(6@KH zw*|9dyOZI6@_KEa%U!B;PaPj;FGlmGg^%{JyX4)iBsb3f?!V4EOR@&1RRHn|d-7aR zVG`oJ!Pk)8b1}T9Z+9^(=UN~#WuC`gcNdpBd-m2b3G_#`>kA!{Uu{gCP)M=}n#+ezCHL$F5?v$gE&#-(HGE;+1=QO0%JLfnqxV#4eg7Yazw&5cvW&!xkp)eIwbkh^DB4pIx~BX{``&rS z`HJGB&m?C{duS7R$UlPqp%fZwndObq@*O~K1GF@+nOi>vRTN0TYLGes6Jpa1#V`Se`a8`Kd2 zPp}FWn$y4=XJEi!0lpvud^!KF>`mm&)I!&WyXhB_h@3(r+S z0f7Fcityv4;b*#PVx`;Y(xg{B%7v6DIqM=WzFIOhQR@JX$`x`{YNt_TP=A7N6+VEE zO7=g4;{z*}s3t;r+9{3$RUGtb!eLSEyVR|hhg5{$TL$Gg>5Fe=aJQZ1Zif20j!qEI zg@{#J&5tpK<0diGl=-IN(&ZDqzQE!fq7woB`aP|(nB5g@_rL8;(C2l$CpnNf_bq2fjoo$uL3bHWp$q7Nc+dS zl@bB_ji}eYd@6!0u}_Fsyncyxe4i{n6OjS$Y54Qh{`sr-WG3`#-uLP*o%>bmpW!uH$qZ zwR*Ec*9-6+Fd0aE1z)}o967)z1o9#hk%^S2%MdM{7vk#wJyU9GPG1;}_6)I^Q)wj#?0F##%Uf zt)t1J-5t(+$fPCiNI45cIfyz<31)wkvx9T%{ZEL*dTr;hlhqM98 zfCgg#-;F|AMq%Ypue_EzlM?$M43ozp#!{ymu@y0l1l3854!VXBK1`I2Y%;}Jn1TwMKwt2 zfRg|j>(uivmV|-TZd=z~S}%#RJ?afO-+ib3)njWt|0_DS{lJEbe=+%J+~X1Hn=1FUy2n zN5m?in93>z1P2THhzt6-ugsni`a&BX88WnASuUx+ESnD(|FKI^U-hktSREY(7~Ji2 zA^#8DHr;~*aFx3HxNqY>jIOG3c&8ayv|V5f|Li9{TX@!_+Fx1iu9$CgEpT=YEdLxv z%*$@;q1wm=rrD;hGagS)YR(a+wiem2#lD`rYt)<)lfH8;1^d ze2gJ7Lu`}mQKRNdl1ud|h&T=?c{VNuAC-J}0Kje&w6)%Dq?f)xxufj3_85(QWu*SEg9(QxLP+K0kEJzm#KSgO_jI*MhZK9d{F z^vNe1yenq}cvou0NKk15FKTaEyu1s)1UsKG0(hg}8tg)QM7qC4*ug&-;gyJ~E|~yM zt_}~7@24H40WVsdD_?c}Q4eV7%FY`|r!A19qR4T? zBv)-&xz>(ys}WwV>a18N=6cJr(`b`kBxV}D1KX0$L|O2Ghbp!q#4*6sm8=|6OjjOO zr?AT9tS+^C8^^lat8v`k-A+Fa1JADowPx`LNr_0jL6RpmaMw(t!>Ndn9*d(vXy(BC zR)}y017?xO^N!<6*JMOP8o^$fUWdHoK`FOHDL7|%>XBi<++$tRDUVhg#7TJ)x zuK!9Xm4XzszxOck zua263=%u+|KK=0&$DWWj=m%0*65%-SwbsaR$+%pqFm=3L#9R0Ml}A@XT=Q#60ay9P z7&6A^DEmfCDtti)6{Uj{F>Z9M_VEzmArAYR8F|E7rM0kagugsQjsB?U#I;fI;?2#$ z89^r_@MaB~$-xF<2?T=dR>9QHR-@x5=brR1EzYi`)P2d)j+MEdwGQcN+K)qLht;Bw z;kGBky-k0ARw^a!gt_x{9+)HqUZ!z^kiSI1`pLu-ZrI(+8T_PXY#89wx>E-N1%)%o zA4zJzgf3ody2BU&Gm%9IEsz};YQec6rWw5S_}Ew7a`l>%-M5C5@>MtA)MuV<6v0>gL@!5 z`VCrfaWr?e_4WpER`XT4N4L3^I_XU~&eG*)jW1v#-@Z5Tm9IQ?ZEZ7jK{Lk0^IpQXP3Q&w88F$R%mp2#yzM?5|y%6oHWuCczEoH z@0I%Ze3xlutYbAmbnsnDBfEFNfY7ng6FkY)???H|gY&_|Itzn` zRr7~~;s7XPef{4kgrcsUmeBaE5K62k!d7)2Jb*(ey!bFDWoB}y=ghLXrDj?XtJP>+ zV&;~?r69eGDz5WNXns=r(-KSC)_~Y+qPIP1ZE(6RIH?=f;;_Gb*q?NlqCK2r%5oP)0&_{Hui-eS%9%M z)E$$R(O~voi?*pq#P@d-J3;vz_sy9>%FT3(>eTBR49U!&6*Zh^PydWfvq!G*1;J42 zeoznl_#uE?ZzaIXY)7>Yv4AD$~5(vwGrUnGyWS@yS{{rLQyDF{_Ll zC@jRuc%YXB18zCzoT{p>gwHX>ZIw@cScp2k%bZFN$Jd(R6Wt@iu=p=T7*JLXXW5^r zg(3JTKn$iARQmXONck&aBq70LwIlTTv1(Acqj{?>Kx;#j9Po52D?o# zp(a=h1MpIzO)wf13X-t^rO#a8ROJznwn4~Y1KzaxqIx!D0~03cYu(${=tsHEz+=D` zWMBj`U{{Ec|3%5dZxVSq60QS>;gzzmYW@kDDNnn>Rz%DE<=*#o4!~Cdu?1*)2sI-@ zQ3OET0+3WjqJ+YrEkiLyS~VdUUddZ3nX@=u1nL%iUxZvy@@74 znL;|a*jph_c+@38Z18w-(65vJpX_L^8}Fm?Ox&PDdeD$KtuWYFps896f}UU2%Im7E zZn5{6Px2KP>P~+Z@+}8r;;=B#ghIh(pjH&@zYK}Tiq@X-xe&uBWL@JvHTS_6qcUW@ ze_}$zpsDZtSH{ZXuxu~~-UOXCO8MvfbAx=xVJ(v|NfZLq(m*B6u(tBtqdt#`2}#FO z#bLkP=A;Yc2eK@-x5Y)G3iDS1o?jScCyMb$m@tUuI&Cu^J@m{lcBSM+mHf@CO#^%8 z9O_Eo6X&_G`a5KXlr~#?yFHRCn<(9S7M$$+&Pc@bEPkm>KVCdnjhZMQ<(F1KY3X7j zfF>Fe9f2PoO%P#;3r2KYQ4->rsvy0pd~s_-<(dq}kZ5iqP=#~qFh!;IyAY%uY-8Jc(OI2#;cE${&H(iiYDZOh^e5`Qnp=cAg zn7W?`U9nJv@@qSR=GlADBpBE>*nc$%&^EGr+n*kC3cL1E#11YsD7!?PQt|H#o%%Y-MUt%v)VSfZ$(AZ$DUsSR>6d~}HWgj*RE zC$a>bt(6jtI@J^=y%lR&2a=y0sj{NG7cabq2kJ)acN&HIOEbdW3QdfP5lLhXWBr_58{3DhvQD9287S+o@YvH z^#K}wRNW1t)jRi3>I`vi&RDiPKwwR*J9sEPe`tILxOKc9ZC}!l{(X&2o=fRZ<(=Bq zd&@a1@wo}ayCm;*uF|$YAG_WIRq`~apvn*qfAkEhcpOwPk%U+Dx!Wx&eStcwCmJgw z6pxEb3XX2US7;9Pbe_zXl$!L<#8HZXt7jvccM7w-W7}*| z@xUMoXpDN9{hIMU#CA`jGYE*z*x}&1Kk!~$i3;Yk z3_N`6+|^BrpV7Z^kV!Sig6KHZN!?k7y*GSpdGg?Nttew8k1QkM7w_490LYbDWz`GNORJV+ex2RA3}HRsi>Xf!3DEe8t7i*{1g>DgH@nN(7rE9T|%~pqD<=)-pJFU&-qkYdk zXIJ6W$#U^360jI>2@sg)Ld0AhKaPwFcjg6(wS6;Qd)SlWIiE}nL#leKorE+3Wv7Jc zhikh(8bDgpveg{p^zrI z%6vFGZXa)d><=F9@cphY9r!%^n%c>(J0h4heT5@V=R@j4v+LA5?D9{}*3D}0vQ=5v z{r2pNfA85r_PFoa@imM8o@0}V3Dh53e`5?bSPFe^L{Jct1Iowt_ZiP(q5zEnVU+d~Mjvjn>(y)aqT6|GrP%PiR6|Vt0Hi|f^}cMZ6r)r``U3yM(OmU*LH($SCT>Sj_h%%c9%;0XCfP0S-HH)bRO49}^!b5Fa z$fbQ{9RF~-UN9-@zH9Q=IW<|7%hY3F{=9PTF)KYV@>ylh3A{;x-+zqkb#roLGI<;HWX&(EMC;5A`EP6r=?yAQyq*z| zuY+b}c3%R*VSlM-zHYY1Q42TOWp54oDI~c{>$-|vs`E50^eoG}2|jBF)$;#VZet4rlt+UVu#jRejBs<$`P}AhET;XTQ<_+)RK-TK(NpcPBk@6dE&46qes2=N znpjIUUKkgDI`L0$1GUoCB9cKZavhvfo5Pj4xYos7(565iq0{@|H15pkRTj1&Gu#|&_|$>4HymY zx{y-CvBzfU@EJ=mL9LIQ)_Fl}7}=Pk=g);Yczh1cSaxh<|JXOoO+~ z+v+*S((vfem6|dH1o}A~TP~fdA#Kj882xH^r5n6+YbS7Ois?|ej`6C1v8|HI!zO_z z{4lmIKkT?(6Ln2^>n3;3Tyz-&A645My_wvL(jjB8BnouO-}o>LE6x*)5sqZOW;PH#bC{ChrOppu|4$ zLyAmTA1JV^KuETLd4H!0M6mXkt$=tAmG12Px0~ONeVCj-dQxd+hP~0=Bki+aW<11b zYXOnR?)t+)95^RMv$%Ns=ZWWIA#jd+{gDn0C6d-j*{Z$6OW)``A*wh7s7+|H@_44i zpXiiB+m9EYzjPbaFG(m%z+lv|hFoAPD_a>ps*;B?p`xwoV?KRuf89z=@rxLAfv%(G zZqG^3wS}Jx`!QDDVGuEE{)LtiII4X)x-S=SONOFNI_n*iVHvtHpJWV^2}l;d=Y`uk z45-MDlqSi5o9N8>`zAV&;_dF}minx$obkxeK0ClJ-O%sF)#L%YL(F+h0ppfks%}9Y z1~I?rqys~m%e5a?82l;c_fkeg4B-Vau5C^a(lFjXFUB`^!l9i(RWUn>gYVu_iju@2 zV-!zpDL5q%%-(Dm3M}?u_B5tn{a~!ErFMQ|c1e%J#NUl1ra~TnPc7->+izd0^a5i< zpX7;OFXl!OeH9p|A&mS?x+ajplR-K1L2v?v+y~FU7D=J0=axB6 znm@(x+u9w5pyPWWL1QL@@tvWj<#!Bf*6J(o2bA?j79fKe&BgJSBGk|3J278`7FW;< z+Pp#s@N*DE?#ZJ`$AfPJW6?SatPV_OkM7dd;3nzmQ+8v=KZwLKj&VdFO0hr`VI5+`rHc)RO9{vsYmdsz} z0p}-l1UW3#B|m};Q^;p`JCROC%1>AsPN$ACKaSBy9GHmgJ=;OOSMG~--yW--R@CKu zURlFfbMAt?3RDe&^6-B#n0CVt^9?(5AHRV$iz+_)K1RtcG{a@+f_lNui839u&xZn2 zKy8!^4TGFgAHpu1wop-L_v(Lm;b6yqCQuQh2v=%3v1nI3eKj^Z^E$oXvjsEw2Oal@8Kjr%%A?^igW%n4bqUSO9EtA2xz7zWEcxYM(HB>I`do zcKX(r9L_ci_gtrQv_%OguH~&FnBG#4r9sK2h87en{f%lJaQMu%!MVrdxLNLftiB`` zs!2kbepo~U*Ufr7JizEdm#p*;l-@01W3c!DE||Il;|RVZH|DcvIQsh^*DnTk^0%LO zXjigvtZQ}YI(I|a({vEM!H(|k4|wqVFSnkFaIz4z(Vg*&`$VC;fcpU8c=WZ@X6N!$ ztbmoXul*B(0nsCTh+C@7uz93_Xi=|e?M`Z#M7wv$6!UgL>!t8Jor!|EC-f)^2pxd| zG`|8Fz=PD#0ObT;_CxT3TR_|n=nvBf?0~`B>-7uepfq6kw9x*I{}8dSg=Sat&0Ewx zyX5Luq9`k+Wj{LRt0C`VuaT0!eyq+Yt()a%z4SEaw6<{at#?UrSvfw=kFj~eL^V;F zBZg^kA5&e>XuSdlM@yn6cfQ~EI8xD1_~)91!kFvFx=qcNUgU;U1*?T>Akad?-ex_@ zrw!AKMS=PeA7~Wdi?uaV0564%3v0CD%LVq4fZz-tcIY-$1z z?A)9n^f&1>*s_BJq(JqsqUTE!wxj?FX7u$FrH^LLZ?B&E=d9Zry43r_>T9qTa_V4fkE4)WW0+95XZryDDXZSlitc~CHuaBHFOfCdf_0}Ig-;~k=Q6a~YRk1(SY!9OkX3BS7x zr)}KRzT6hy-u2~+a6rTYuKZFNQ{Gl2wSY7g%J~=O0#b{PK=L{Acfbtr=o7zCl<@Xv zTGm$A5E_CLgZejW?#e**d)Vlo35B!fBALz54Bfv?DEzcps$3u7(?|9v8`A9rZ;WLo zsL*zO;g)^LS&eYrUHt9b^|t?V?gv%D{$BGqq>2Bt?c-<85YaT<1@g5f;zGClRM&G%A zuzw{j6tGD}|Jo_1v!k}({ACHo;sS4+liBNB0NU20U%rp_VgMu~w{ph?j(xYzc;-OWCEonYN`nU`xh9(1Nho(zW1g=qYG zkNEKhY9p&cZDbRCR|5hCK$TZK_W-dUs4)6~Oe1lTa`+~ZzG2iy2AZLF$)uIP3Tu=h z-Sk9w60n@OYf6)$t+vvbZ=W$##S!A(usNSQv}9Q{bc;3}cfNtheQI0mzYcL~Avq=rO0DZIXbWN3Ab>w<)XZE2a{drMf6!jCrp8prkfZ8PBET?YVo4}aaT7ml}X2!Xf` zE*t(!5O^B)#s zbsVu#uiX9sws^lHRRNC@MdbIo=HK-e|1~&TG)Lp!WTbNMmRJ@sLjh_?r$icsa$>>^ z95kv5+Tsp>=P>YL9sU!C!3ZD5;i9R7jkdhe?!0jfPUjj0#6KM>FlkTRnLEQ%*m~|5 z4}fiHuoemNBk@HQ_oe~RU4_G%dM!;RDt=l6gy8Eq2i8~ z9dzYDq9JXg0mDbE1+H9bMdg=?P-BskpXhUwoqN>-@5Rp#Pt@L)?Otu#x*>2F)yJAF3EYOA z>w@a3qg&B@_D@lL65GIWr_Td}_nrl*UnaL6g+&{?G@XR;U!bTzqIxN)zjAx%;vl~| zn7yIm~M<{2K;lGU;tRJBujY=ILPYAF!oxT%qHL%1ZZTMk{A?T(yyx2@l@psVRy!Kbn za8P#%3L5^mlThTqV!#qlp8zk4UN4XG7Gr&Q=D z)C#jRouxD)T;5SI5FdSmN@1@kdBuIg+`2IEDE?_&aoE~?I{odJ{&w_K@5z{8nCaHY`n@9$ft)t&%W zA@Bz_>jwljasOFhBLuqW_>d|8>WD@z1~V)Ase?i9j6HNsXcmIuki4u8i>$VGpdt)h zK3kMk5cr5j^Hr4VQ(&H%CFkn2fHGRo~WsjrP zCRSNYeF<%Mv+A#_LqCt6Gb6~bA|xSyZuUgu<8X}kSK%;XC>_alP^1+ zg#iQ_nA3p=&ZDj%WKi4^&(2ccV2(mKy1CF=FY+t~;Lv7yuMLPC6w9BDRKp0Ah#`y` zHXy%E)I6iOuK&Ak>Wp_3>}kD`0H_IuFt573cVM_^>?fD|zG}X$_qp;#uIeFTRFK(`wy?zf0qI-D zVB${(rEZVWM{2$QP3GhG9tnmcjBX|>%ruC3{>szj37!5vts^uA^AkGG<|Z$ZFx*ci z9gebn4ecS`;Rw(XIbb+K$$hp%LyuO(te2+5ZFY8PL;G15BcwAEI!gdbqC&bT>|ycx zV?lyA$C;^R%CTk_VRKikdG9T7dB9YJEG^FZu;fm3(k-NpQS+qa$DsJvMxM)h%tO}6 zTia#Rw6$O;0y_wXB7pAjECD)^6mMhd0cg#*l(ok@6a5e}*!g_2){ZacC(DuTdyIA; zKb!CuPuKzpa+Fp&)HOInE(t~^@C`N-hd{~%82Q6EPeGN2jt-Kw;9=%%LnXt=^NYT< zG97OjWTPp}JzKOvugJ;>L|Kv~fPeX3tx?9lpy7qXzd3r-jqiu<>GLfApL2WbK3Ll{ zHLTUm6*(s_F`ee{lEGNxJg@r=-ozE#ieaGIyjNm(`X`49&x0K5e~gYMmjw*R_}EbQ zxC4HVIH{cg_u)8l)^>s3!h(Pd+!w&F^67A0l;aFE%pP7Q{NzG3i|B3do$&`rad}cn zE378x_;@3#+sdv7H3E#Zr4qnMA28mxCs(s5h0ntOm9a;%+NMrlEvGvhkYC`NcnbTC zgI9Nkg~SNQ^6N=wmI>sgbfF&6-jo~UFYvv@z2G#KvE3~t5SOCQMQw0{NZzb@j5`m_ zmaAn&a9ULAlsFWePJ+XJV0|5`Zys1)mr=VpN_Kpx1sl|^deh7FUlU3+D z711US1l7x;iY9MmD!yxc9CPXZZPi@s;$QAm;A)sffr0vk5EwxS?&ew_RhFxep#@Pn z8!Ew@@d)Ef#`{@fjh3#N$2$sZpuEXrFZ+U7?rDbL%jAK)-#jYg`^PS2_l$>y!?zA6 zbfn+77qoN@x4=y%si``4{(S~WoV4Pgmk=i-zSa0q?mfi`CAx%C8A`XfyVJjYHn#2l zw^43ZU9rm3n@gc46@pjBF!aCOGSs4EgcDrJ1$a@asPLQ0-psV!LmZhUl7^FKlqD+z zrD0$T07w@A)qkN(1f#V&Zyl#;H`la=ecuzX@$b4iod*S_D?AlCw1{TZsh={6GRza#iSw@l99H_ zxF#nVlAs~9Ct{ou-Sb3DJ0iut+=^FGOg-Mrlt4@^ga)PG{yX2LgIKWfCA>;y#GrW6 za%VcEf_*OHPL}hL^@$`h+8Wi(*O)U;U1P=RAH0M_tz1(eBaat!bp&x>@#Mv*I706j z<2_2FLtf4!(p2MLI!(Z9=mgs#gxHf25Yj>@S$*{zBdV>~2)~Ef8OmsN$ir9KTw2#~w6?CsHWnlm9IvsEtn$)_Yl&VD?9eKcF6@b%Alu4RtW^Kl6fONos) zL`v6-D4qsD&{v;68@_Sq*^oP`@uD!r*!S|{wYjxB30LJV2Z|L`D*-A?{Voto7RM9g z`jWr3MY>J~6>Ahcm4vYiJGneHG9&UxU0W}tt;~lC2v$4$ar1$yHxR4R``$xrOZ9pN z&&O@(OnM~Ga(Ahg+{r!m!Z?gN{cV~XSjPG-SSH)-5ar%*6k3oBH!wJ#@lJfDZC&`A z^RrW2V*^vS;8*QOV!a2dRM!V50qq@Z_f|Ztz!0!m&W(Ly_*U%sDQ&uq^J(W2$DH+! zEU~>`?F1{Rt3p1{ghXC} zg9AzhDshm2W1|)YNa!W^24{cMUzV4U1G{&eCu-LsEI)^j8nS|w2(C9b=p0#Rpt;x$ zq!p*>98OcD^@I3Qxz#{bj|RQq8G@UuZaU|7Uw6hp5u+v=GX~Q#gG(CVS2+?>l3};+6o>XzdLGnHwuz`Z^h@<-O9TDE&|1LG=cq)&|`JFhgg6*h_MS z$bS3e7k6lz+wr04HYf}FXt-j`2-8B37)cihTcbYRkx<@^e1@`{5kr|70C!%&+fHvEjq*{^jAQykwUzE;07VwUvaO;%Un>$m0}QdcvG5b}oG*IB#x$ zip_osJPCd``lqdZfa7zej$SkF74DvQAzdnbaQS+Srec~&Qfq>MH_g!}1S4aR2emhV zR%eMgYJL*4A}2MTn2_u$C1HfTW&+vVy)+CTWihzzjBrRboEn4z>~-n0FTI+>=eJBH z=+$lJD+05wiS<29{?bmrfGL~Ub8fp3$#)X`&m=xxI1x>-_URpB^FiGhI$rbdp>^+0 ztnYpuTYj;rggzd^b;rMOm;64^AJ=1r&TtZ35~{D`8AAZYJ}y>~Z^|-8-U05#>i$AW zG8+xtkI&jBn?Al8GC?F`rM6 zQuZ|bnhGb;d~h!h4wiAe0hW;@LgH=lfG;AnvF(o&q_2C?nIWdO=;#?wzx>1YrV`Dg zxsbPHD|f&Ora6%5f#*@J0TliLBu4Ql(GQ)ul|3~nBilWb`Amb)`1w<)yH$~AH5A0Z z`=`c$D`{Q@S#rG1vuNb+=2`RU#;dWN?rPih>KQbNyxmLnrT{j3^zK~N9}KL^AaEX(eH z1ogDfUS_HDzUA_~gLhIQ9v+fC^h7qt)!I0&Wxy}~oX|38lo7$qfsS6js(UxJZ zKjF#nkK?@bYva3y|4GyaU6=al-ae{bs4?QQH{gx02!#>)(@8`82XdAY{%8Q**e8BO zLvaR#J$rXea-;ylo?WzHyZNKVrtA&hSVyVNtmEv8THQ(eOrwVQir%lSApm=3uLn^# ze1xC+h*SCIBK9L!@WhlV!k=IcFK{B%Y{2;j`Arg00qhVc zt*S}#FoxN3SP{TE|`0~4$O`L4|fA>RWLP$wQt`QytJ zR*8e*<`vY>K9iL?)Bk_GeR()lUD)^8$2q192V0rvc^*O(MMy|yGG>;sG^r37$~=WK zJ7$WKS%wTDAsM3-3S|gU5~pu%dfxB7-tY9h@Av)jUDxwG*Lse%*WP>WwbniT?%z$T zeW*3%ULbja0$-EaM0q}Gwlqq*9ZZg82ACYe4#d5q_1t3RjGFL+%G=k4zC_;h51h+z zlIbLq0iSk{MKUMc&jH`o6LWO!472)YmJmfz)~R!)T3*=u4oR%{Y5T*}k+aMo9sy&? zkbro%=00PhTDcQT+dkj()~65Vla1EE{A+&H#v*h@RHej;E76KJUFg zM6CYYXi+HgICN>$Pi?#AN!6ZsHwB>ke@#*^`?d#`CpLZmi1&viMIZLRcD5pa`K{Xd zR#pX12;2Gv&Y;194=%T>@|Ql??1AOI=#kA!Oa(_I@c&wWB6k!J3BcQD{&391ZEmes|7+zwWwwC{6~>4Zylc}w3o}JohsH;jA?70(8&iau zzRggli~ZRJbnio|Zu!1zl++QH3Me3IceM#(en$rIW*bi$u6yaWEsDLdMa}>-PUH-T z{dazBex*2&;a*>HNu+rjG46P*HxSsP=ei%9S1 ztj#f{`!2=w7>V56K3VElFqoU65{pQ0;Hp-jxoOtS*RSzBZSHNbsKocv0?-CKryf|a z$MhIM2j$O*AoeEFjkxa~ZDLJG#Z>C!0zj5n0-WstbWco8&bmCvFKpe`A1QbVAQ zAzCw{juBIufikstD(38ls#X|^TcY2ulG}SQ<8f%$$7oueZzoA_A2|XJ1G{&?Z(&Fa z^2o7dbk~4FMNDjfkyh0!-?5Xh^D{}B!CPCYp$>4hhg3gnvhMM1x*#Q}`xA&5Q&!~b5ktQMXo8l*`whO; zPI=DLtSkObkw4ak-&x8~kr2fNbIXDcvxndcedfD4bXGZ3Q&ZQ~Snq09%~pQW-J=x> zUDjjuS+XMRr#`R)s<4m9G6Z!EUy~6{I1;Wve@S9LNyVnFJB6t zTNuoY8B&+h@FxmiiUv_hgDq6mDH|G8-^tSx=e*$D^ zp#U4Fft{kyv3d0N=dQ}7d>f21E31E4YseGy{Mtk4j5OwS2a+;>1yXuKN|aVZcnvsl zJ(c~0@yu#?5>pyR7iDscizDEu*C%QWDcwZt z5;KIDr-1r^7(z_o;GpJVf69pN(Gxm(UilB2^?$c4}yNGqGTLBCq zLq0&efbflJhDRdlLXV))$-^+S21xnDP^i-Fx^ zgkUhK5EvGLibD5R-kZ~8X#u=&tI1{anjdBdPI(MNUdZxsyE}UNc#sZQxv<+6hBTU{ z8Oedm^-mfZSFeQ{#&M_t5ARwZ8m6xeku4SjJv* z?=x?%n+@i^;K>}l_?5I$Q~pwYh9OY)%z6JPdrsN=?i{>k)E0BjS$DzxrAiE$U15g4s)Qlr$pyBL+3pRlXaqTmh@sxdW_T(^d>H3L$&M z3L|37o$E#dO;U@xm+MH^Q~Qqn9%WZ6t+bK(&ZMkp#dMH$r03Zehdo2tU>wn=cu3@d zT}aHn1p8jvu7hX7J>X~hTegDRGtWvOvadCi>!<7Zly6BMN<9Sh6cbBib%QcRfcUVA zbk}Fl|Bq7fONTtTjhIrgB~w8Cl;id+ZL_IzVZ&VeR$og6ZCbCBNe)fu_(jP>drE~a zNc;R(p8=G&r&JJEDLp*Afi#JRR9NnexPHo6)}S;WWz-oo>9G|^sgY=1fA&vv=SIq@+3AdIY52FTNP z$=95Z$vEVYX&jqlA6hI8jxxhhFbcv;=cX8>zw~&BQsV^fO7{tRzGi&5%Z|0Jn!)N6 zmy>`FA`hZ=ZwRvI0Mjfntq&08``@CBj@~~a%X#RTKdrBV>FndTT@fF~th{&_NR!Ir z!6+X45o7;fQ`v&=@#qW>UN;$C>@wcw93Ay+hbo+zv(J{!4GzB(UjT#Hcq4-V-pjxE zKXyYN8E%!K-}u^#)-$~5o3Ci3+mxR=En7B3gq8+aB7}SryL{b8`{ZZZ zYB_cI6s14*f1~EPU@5H&%5(o0wJ2}pK*Psv#^84sT~N+)*FX7)aVxRbOTFehl3Z!L zGlQr__R5GnDj+EnCh^U8D{?w~;ZaxV8-jQ0yEyUl2qOr(kFJpX!Tb589fr!zxw`w``1gt(Va(wRc-y7IKuf{{25AQ zhaTME2ToYjnJEexX);qYbV(S-x5D<-h)=bdjQ9TMZN&^vPBzqSuYJ?E#uisTShXKO zd`$WV2zN5D1rT%_F*OS;y{Z{LiL!V<2i55KnWTdG0o<%lE(d2&4ynH9OPi;rU=-K( zy@PEx9}`(QMCi9E{IzSzFV(d5Hu(ib8k!CWTUpuLNZeHHWHDT4;B67exGAnKK~0J= zy$hn9CAT5JXsGG1c-HLdN3ts;W77mXRRtd3u-ovD`;ij{X!)L%`t>O zJ)|UL{a>y`19fET5#y621A{|^T0`T{gbFe3Lh-#cf_cG+{kwd)uZcX?ST&|k2jNK5XJSIPbD z`OBNsVu)*aK;<5a08`Syl)Ai>+Uae>H$V7Yu4g4Zay3ilmekg+f>iW}P?}aK8u~@@ z;PBh)A1g!il7~XAu3^0ke)Fkw_1H9I6gP-)F6gk=Va&YUPEHyH{5{ z6P~H%*8jS?{59IJ3dxe>>80G&6l#G5vs;x{vjKXUk7x>>NMXnS#F6)lB6>qYHi z!IE`@k8d5Tg${*+wr`R-Zct;6zrpWfvdAqAD3f{K%-0Lm7P zL)oY2V%pTdcaBP^5|}ngvqB4>E?q9a{`PX)xtz9vu@JfGCb5Ycdp(x`>xv;xAtM zU17(ISz=Fqbg?b@hL3$x?7hgJqGJPA zB$H;$xAO+Cf=xQ}#dRl^^z)lXZ6GGFBeVaod4O5tFOkSTce3*#yJ6q_t))5v26xIL z35s04v(0?gy1(TmYEUROARLz~ApQzpS&_U?Zh8_eJJJI8rZ1;1#~)BPcz%&HpydwP zsq}0lJ=L}nyt$G!2~o2SBwjxxQM3(lzU6!G>P=n-QgX-O;`W)%{$`7Bn(tXJu|4DE z1R~Rm3ORX+d6tmhi7{$O#6bUZWIRz)4d6|A0U`w1C@O?hL)8T&z!LE((KE7x!z~Uu z%2k^SO!yNY{MI-j6vxwlmHRwt#0j|9HCq41ZJL)=g@Bpy5XN2iugG{10^4PZ0zQ)e zX$?N;7;u`fJxqyH^?2i}qsN8cef2b#)RF|%3@jnTSi}-?+f6&Wh|(vf z&}#Lv0gKKnL+%8{zNmOZoOGMba0CSI;A&2v35Rh>ARq>mz(=9ln5>Gn-o75^45 zIv@B%x0t6iirHdhWC5%M-773CzhnoBUwl0QAHURUu)=e&adpq%21j)AV#4PkU?^Tp zSy~g}p&GS);=jWXVeTw5tY1etJBJq1xCM{XIA0u4_~dL}DLARG|QKhbRRKNJgzo!XPW! zlv*XIT#3!|B-JCf_f_wZIZt@5zD7Oqr10teCmtiN`iD*X#hUi6li5#!T#X=Qfc|qw z2q);1oHL&Y@Hi?GC0QxHl9L9hse^8htDD?fDj)Q+-Tloi3KR}c=&OtZWMytt@|m|= zsM=p<;XTW&j7wm}nIB-|*ilPkp)N7z?6-1kC0`n{oevBvr61f+bIrim_1r}+@Q)pr z<2h&Na}Jk1E^%G5y9kPZn|WUq7pFi2-QgRQ*-CnaZ+l4B_(nR9rhI!#djJ`g71_j{)gl8C2Y`zA)QHoE_d zV~*1FF^E|mWAqx-6*Dx)D!nBqiYpAa0WWS;)){78{G{hTZRgD=mhm5MDrzaG37u~* zxpgtnj;H(yg64LrCxB?D|6XXL=^rn|6|>mQN-mJoSN>nogum(%CG4J^`xK*@-#1U6 z5>G-KMD~)etZ``Jn#s(37@}P4*2SYjw2ObKi|5LXpb7PZJcbN@F02$X9SgWY=ge8= z{j`dXgxz!u@Eu-cCCgS1kn!C1{}gZjTgB9;*zv#3Hlnrxib)aG)sOtH4qyy01#O?~ zP3hn2Mx{UX!j2AHZ#6V88Ba^sFo`km4j3hQ1`DM7OR6`Lr{fK3Z2g=RZ zd;CliSEDLwxOJyj{lq5{k+m^dt-^bh83Sv;nPfxpM}65f)rlBfV3dhgdJ|c{i?JyN zx&8dZGR7lU+!p0Z^rf{k6<-X^A+86f2`~x>Hi8UpVn7ct#{32I2a0j=PZl#V_c__i zU1=R7_Qy5dKBu_t*R<~@LOo-16O2&?INKIxSr5W!rD)1L@VqiXyF2_K7tY|k3?A#a_T)uf|isvsiRlp(kM~r}CONgbl z$I!t34zy*Cp>#J4#l}2R8b)2T;!N3-sABVE>ksb+LjG_#;My}h!^aI-07e_QQyBM| zgMFbcs{83zQSa7Q?-<^0zl1o8<=4Xy6F6J+_#i!BNbd-68KAP+sap3C@IS)N6|$X> zyCilwVlY9H(^m0{YfytV+f8r1T3I`PRfyRbW3{Pr7H#+%Q#MB8`;$a{>eMXLR%7V- z+Wx`CyupMcy5`MPHH)IY52>N3}2Dcx-aC~-XJ&)UB z&22}!QrCH#yy_8{Wos{lj*o_Ted7yn{5&bB=hYbd1nxV~kcy^NrCsZ!_+2>ju5mCq zXaYJWV+6jpivzL&R?}6P$c18j8~pqiMSXb=JaTqDgv1|rY5j>gzJW*qV9H&;w7LBsB(RE zu(C;#>DdX+4|)OJKV;3|>j5-+jop(A$`TkWNyJTFfG&ebeL2JKyqOa|uRUF-$(LQs zT_cF!H*{?_=EFum^?uxO1Q%!E0$#z;ha4b+^ocS*u=tPzO^2IHrE?svGwfWzpZp?6 zS?o!9mDMS+zsV3jTr(St6 z7J=VoAQa!Ovk9y%g>NeHlz!X%>v3$$>OIe?w+mC_9(7nPoOdC2GnOJZ(xXjp((`d8zUPm;1LTUnGzH$kTH7B9{jxSc~|p@6UC?7JW+ZwjrhHP%k+ z3@RB#RnM2p%@vJ)j$dU?Py?;&I*7eO>c@ugQ*&P6bP7Q>Pe2=36ajotz-bEZm&mU{ zDBbwn`_n&aTxSJWf0VDizf*rPNRbW@Pe*{ip50|jK{#=)J3vC<()fQ=f`|oDpFN#tbYp)xoc9&-4%S$w8^(-Dw-W>D}U@~YSqB=$OC|!7y&b$c>@OfH%k6LXor6{ z==C>-HiXQj7n7;ezt}XoIKJ-@-WN|ZQV!j1WuTP(xfi23>jREAuvr5QjP{Q$@&s?m z%%8iZ)k^wNt@pG*a8!!5s0;^BI#V=Yg!IRFnjt3>vA7{}GJ%|bkh=Hx=;0`I_SLlz z7JgRuHtaQy7oJV7iq;=S{05_=0)MuO-akJJ0-xvZgTSXgjd?x)HT~H0T3m$}qUZ%h z%QX79QA&O&-}`gfY88pbrZRHsN4^w$4xRkAASdN3dk~Z>c9xNm`VOW~+U6)~<)o~G zoui`jL0KsWIVVMX8AS&LXYjARgMy>1y_CGO^udGnQg$-V&S0n6PwiCRF*wZr-T)tZ zsV#p%UtBKZd3mbVvmUiZOfj1>gmK6QguI4V_xM`=Ye74gxge#oa(uTyh zuJ5~WRB z`Z0du)7!f5psPjlpYIY4x%C$ppnhCC%IIXORvzW@MZsk0>h?v}w_NnYn~FoHz;3nd zKt%iB_#h-ea@pSw$rpSPzg|*&ytMdhnJ=vbss2I>1a*En^w z5>oUv2G_sKg={MQ#J{chWE;5I1YY}W8qjr0c(J~I7gEXY&Dcj0&eT#$SG!HnOH1D; zK<6o;kZUusl>n54IfGQ2MB*ArpS4;y!aZ}BH@_RRTulgHBS^m5Q9FI{btz|$V#5aL z>NNC6*-G|4YMrt#bzmsw;7fNpoI~jqCDp)^=SJiG#aYT)_mO#@1YPlf<^fn1KdvpJ z4@t&Lxibi8*piUf$sXNmRG$BGTrpdA>j7?OhX%JpU=|WfXyVG9zn|xm0RD9*DLE(kJ}ukA zlG|pKC-+BBSbMNO#glf=^`(PhT#CWQ)Fq}e0Qdz_uOu+zz=4O67T2yJ_pM`67jO8| znYKES9PZk7dEn&v=Xo~%d8m$*=8Zm@K=wk+>1LHe;<+#?HRQxaJO>!K(Zz>UahkKI zyK}SOsautnEz_f^<(Jn~essi}vzJeT(2FI34x>hg0m{J3_h>z3vMqMgX^r4fr?k8$ z2X4BtE{|>|s-3H`xr{LQm<4^5sh}XVVRPDa$1;Ca=kUB`V+XjVfM z5Yr#rP)?g~Zr5W2Cz1>GRN=sG%t0bn(ZNQi=E zKqil8A9e3`xJ0UuvA?)@HqB?%=hOA?3SV4^cxUqFqwvKfWa^!esVC+Y2EUh#pb;nn zGuT8!Ureq(dYpX9K9LdMynQr%5;e4g=q5Q@d?BgXer zymsve27-=Lnf%T+4fcM8oc=^+=%}cS+wl@O;ski!(>D=BP74W8&Ae#Peg?||gqiQFnjn?fwdewE#2PjceRz2^MW6?Bq9Y2l~fX8&D z1CMF=4N?M(+QeYn07NOYb+p}w`yGxvo!dg&M)h6(iv=;y=Q-1yH5T3Iw-V>knA3^K zAOLM}ikv89fx>?`u2Az&T;a|yIZix6)>n=BFM)*}*+;d;{a-eUdcqV+Q{96nm*Yx8 zd3wDR`5mkIUD5w!5}vt=i27aI|3b~^dnc+Rq&H%?NHpKS-OAV&~ zsclBB4iwHmrkUCSgaQS{r9y`S_W%D++e}%Dta^dAyLarQd(QE$+1QcXkBuj=Gz+?i z8L9Va`5?BL0|~Irh#UXAxfLra#Ip+bq8M}nOPEgP=)A3SKZF?xj?<5h?a(yK%yqJg zHM`4N@?QI+!gpB%g;P8+b`cuF$B0#tvxwT{L)-bDp}zpjpwal+`Xs@R6hrnv8v zNPnHcbswIV;3^r@mHfce+~W4+ym?fgFH1uco$)}>l`8Gt3C%K9xlhNhWUk0ub)b|A3T`V zmqHlo?N0eZ&_SD6{qoknyMfG&D=A@5Lvi-l2sjc*7k-x`*!Shfa{<5I)b%4PD5E&C zRm0I|43vRTl>lAAOaidLB^24d((}x97kh@K^_WDjZ#3onI_#Q1ewN05jrSQ+>%grB ziEt1F3q&CX)&De9u!sBKE9kt3`$tQTC(&?Zdmt&WSDqQaPg$h$bcn^eCa<)-ijO_; z%Ec)d=5yh&phmd>z<`Y{!Z~Y(#=Bz?Lj<}?9y&obf9!`QNin{MZtc_N>B4U6k~|=xPO}2d>MwrpCuBs=sLN5liAvc#ef?tLl-Eek(_g=Sc6HF* zxNw?1^t}hKrsgzKj@n@md^*&zHFh#&Wn?KgGiV8zm0xx7oOWIf4LzZhp_KAmf#$@A z`=lj7}rCz;p}AjM-gg#13lUiK>EX$mgD_40xd*h!3$iz#ANtk|)MyPZ&L3 zd>;_*Q%4DMd)?~5l~}dMnB&(Gi#{C&WGN|v_ay_7NUpx-Mx!E_47RRjn_ z{h|6vA-6FGB)Y@YzE83H3wJIzr+@n@@NGae(Pxvro38)F;G07YH^;kZNL$a(dTQJr*Z~^`*v@3!cL9XL&Xn#;HIBkQN zt-UjP>#LI}rsB()$1eoAXxo)qZp+rLMFybGY)`TpqJ|K9NT zy_v$zyl<)g9qvhMZ;!QHm{eoTzx`D|$_n|?MPMS41+z=_Mr_4^54e>;UDTa-O!

@^|!nFNUQURWx7UMiz{F0T@OJc%_L|D4_61v_AsL<^9EMOD*z}ld3o0 zu4f;<|9yMH1r<%NslcxymKX+hg+7uJh9cG5fOe_A0CgO(qlF>>StL~Z?dFc(SNU2Y zl$;v2So6N_I!57)hON%+_gVN)VMh@OW}XBl+3+hG|7+KV6P@#XaWUkcYkSrGtc1m_ zFy@C5r_YQR#_84-Fd98%|B14;bAd375Xj*{%rHi7#OF-R%MLPm7?#7gqqamopcl^? z-}oM4eJvk)eO300Xm{VRKs`kUm=TkegrB=8$la=f#3V5Y4se??@83Rtr4gF=-SOJa zE4aUbZW>oB#Jy3}t;ntt|66!^xN{ z6+O``K9RqUG1MG<1qLw+K?b=Bs;-x~llUs3cr%7mW7RkGoliK^wDJiuFK%t_fMfFR z3VM4V7W6-N66lhoJVDU9UY5T{SjYdT6;dU1D{5g zZ41IYYL*FxK_Hx}u2h1`uanH5>MBYw9)8YhqA)mr^xjFO-!iP73Nx=kSCfd{I|66c z8n7XV1$BTxiG|cy3&S^p$2?couDqqt{3cQRFd^$1MBg?v}T-%z`d=BU< zSBAVts%IKLH@Ya6kDHw=WUoUR*agb)W58PGz$(Q7=5u=vEC89Xllu{L-^I!&zGQz> zepKvx?zT*7nKZM2?zktZud!1}PLRjdY)$3sk zq}GdtlUu1n=UREVcUGqSO4H%HYUIY(_^vjJ9y#%h@Ld|9Ck%rBhNOdPv3Asu77;LA zjt$UUQLGZ|pd8r$iKRP^xZsI`>GmS#fqOA;REq>P5&|U>@J~qAcNF9 zx)*PoD$ifs>301RiM_C|X;kx40#}d&RUX&5an&y%bOZuLXmjo{U;Bozm&;!(QiXjp zVq;B@U!uw=pFHGyPMq?3(jk`BTkP!^&rbldLL7VJNKO=c!x)U51;ltMA*L@tX+H$* zGArzoQvN&i<_{;O`G3PnY2-eZ7+i~~_Ea)D(X--t-;cUQ9*0TY7@ zlILjHK@NhLa{Gt|F?V5HR~|2mQAL!#IZ{s($X%+FWE^oyd!nnlzBRecdv*92ScZ-W zUBzELkBWb*$0UN$O~c-Mfah$b)t~lI?6PXCRm!(e_dd)U!0ikPVGU32DF)6!!Ps-c>k_Ldr^1I? zIZiBh&eaJd25?>V_VI8;>d6IOEK?5rk~=7>X7eo1cHG7^SUskxF{0>OYFlaEJSEt` z9#{xtE~#Ssm!LPWd$E!r`cEv>tOW%_{(eCRcoO%!&DlgoNt-irRcq0xv6CFB>3e&+ zLE+wE%cl^vI+87RmVEcL1=V~J=-yvsQ|P-_>tBq}Z;hyR=&$^6TsZaeM|YQ+g9}e_ ze!->UYv9nfq(`FBAUz(*<|3vO(E*QT#JaAnor1j(;}h=JCpgmGXU$#9CHy4gwC~d?TaWx>cP)9m$zrnuN|yxxykghU2&Yw z!4OKK0~Cd4I6rYT^H6WtI4EaX98ol_n!$isj(qRL)W#X^S2~uMG#g}tH#|J@vN6|O zhv4DVnU@p>(H*4%^@Hq?7$yxG07M}nfP*6@=A{AWL6rSOtzYeWRtm1JF+xT&+wl7L zS^6hAWv4$(oIcMHtqfzFlE5Ss(4gb0pi~ks@kq0l>dW_VQ{T4vD?w(h8u-a1lhc#iOs-Ul(0+7P__I8cEB&a_D z(yB0?Q%tePu)~v=m%nanOd1U4C8uMVoxy8UO0c4I@0J;H$w(~5HvAmEFprI!j(l1v zjYtNTr>x$Y-O`GR^s&Y{t|lFCZl*SX-+?4R{UaH;_9Vj{G3?a&CwgiKMxLXJ%7>g225lw-bx%WA-V{~B7 zJ5>$asiO&WH&%-d=N<2|rk+pc@ln@j?htTwJFk%mR+Ga;WHpsw`fs9|fp~aRsQe|Ei&<`bJTsNPwrfG?qn)238LW($R9vEYnZr%_sz06fh2jaZ){|!fe|v|Na|EVb{rG%o@PvdM8gnj?u;+{v z)*$(*SvY=_-X!(HO|qXXCf2u&M4En3O$^4goNTfMz^-%G!0h6uDRx~0eE)>u9o$KT zD-rMf|H1S3TjH8!gLdl6Mb03`6V~u_(czz(9jAD4*&-RucV8C(I>S9=UMHdh{2iHx z$maiRosIE4)}p0s!0vY@{V*wk>=g1Ld5c8cdH6zQ!wfIWFz=P-DgtY zQ}{a)S)_gVyU#9ia1TgrmNd~n)MO8Ic6!H#lpW9^fW<}Jhq7C125fd>fFo%+KO?h< z&*2dPS5RU{f4hB}{OD|Wb7#kU`jqL{_#}7ovFjlJ?G#cQ>`x*ev2-%9(JiUEpB*tw z$ti@N$eDd9UEJ^{Txe{`Tf3m066`U%2=?vi#ytfIffy3=WPm{&PS+pF97tn})`oGq z+v@jY9$5S=o0Fm2OnJgqvYTgcn(`S;88LKlk#`?AsFZUS?TWZx@Qlp-L7g)l(4Zx<`LyH?QIHQL%-VnaEDQrH2|9!cFESx>rlD^}}P&KF>yK0?2^A0TBwMS;k9lADos zkBVzq%Q;M^9y2K#wP&mSmc7$2%^hOZ|CD-zA7WO+xZYMtg@{wO9wyc0O7CrAXo#1_ z(A{A7_Jv&a?rm}ImQdaFv#nne=phZE6G`s0?KIZUnx+QY(F<@YoxOe#WsPK&@0p#? zdv0>a<3@innX0?8%$mL$QGoW_$}H_z&owt{;gER<3AhNbKhv)Oj!cbf;0 z&_9$QpiYb0D@xxK=Z3-cKAJw8c24+j1eapD8*dcW60UM$c+LRao`)*H?HQV5 zlr#}8)_+LxUQ+@``)=7nB?jO@K&Yc$OZ=LnL3HS}DW9GcI=xZvutLrV$HSeV{N{?0 zN~7Qm%fpg) zpyJD$_dSBN)<3+TK#(d0z{S(ZQJ}CCR1}bD8VPX2k5dp;z`)jgU{jW9Zo(|B$dLP* z=OaG(yWZfNCkY$_u(7l6B>zeFE%Gy!NcrgHU2f4wOl|C*9tH9z`yJzdYEc%dX!l6l zziZ4yH|ljvP9t1cMz+Yo#EkK=rtp0{xy1Y}a)JI(ph)x1j?1#+HGjT|7GfGsr8wp?~YV)D%JWitGoxRgkGD~r3Ic!GQ_c1qFKVkU4|WLEBM9L5&Kk^0~|B@B%h5~ z=JaA|lP3jyBX|Za$6u?4qLipeb&oylA^Fx3biVR3o9ZzK@8{&U>zDro^8Mo?CZsg|+%veD)tS-~Y<9HI}?G^N?ZD!sG?-6TiSdHdp&M z6#=>ed=JFHXuD~Bey=^mB`v#-hRe=89$0^%k=7ZUwU^fSCqoqMkNFG}=I^pKkKS^P z$BYQ;C(b0azNAi5Gj~jRs3XLy2wXx|s)+uHfYCtS&PC$F577sfCYh4n**^KXlFfC2 z5J5eU*0pSBSjc~WXr+ZaIg|~oCH)?-mWUgblIXvY;(YDBL@qBB-d&?TeD{QF(|P68 z31c#HF^7ZR*7BD=BAlO2Z@{o1lv*GOj*r!yjN7J9vA(>Qqy#xG{@{0wVtOPQ6<1W> zNUbF*296Jmr490J0MP-6v=BR(>9+g~zIh7DJ-;79GJRzRQ?SEHka#0_+w=mL_0>7M zwfB{J$W4m?@X%a!zd~tgx#)fV%60|kP$kyb#&{IDpaIZT=09N*q}ba7yj9XupV|x? zGPV>Syu3&I@(}vLC)Gdyc3|+xfz%w=)+COrsPAd*(xoq6AFR(m;Ux@C{Zq@})VCsr zm_R@k5}+OfF`&dBlOKzuPZ2{%fWHHOM;rtMxY4i3VEPAW&OEa*1H1cNs*SvlYjq~B zcb>}aBBQkpdxapP&muKIOi!VK3b#wpOe~0@73!ypQowj$^z^=X?&2j-2f)kelC6gw zMCodK&dbrs*U8b=#qOf*dAn<#PF|O6?LE95+#$L%Lfn-tU~8Zd%K#e5{RC7U^dpqO zAJ^i4zQWnt$JW#7;zc_bC);z5wpV0qAyh6kN-$XzMZR1_jTcA3=ohb8@YJamKt${Q z5bVtqN8zw;-Ey}N66UeY>p%-Ii&Ef;j~v`_MT^M=qAf6X+7q!f|VV zm`CFaFfh-}JKxbykZ!y`TY^cFkZ$}c<8dVINH>AoxtSz*Kj7G#1qI3RTM$mD^=mB& zUJZhUb2FclglE>GV3E!TgCx<&g`%rXA4ocpmN-qsGRZK~l92uQizFUtNgms}gNXty zoD^kbG6oOsDfKQV7gGW5j+5~ldxXIYp>eWBIZYV+88Y}_bXN~1KQjUa%ag5*VVaR4 z6xge0F)xrI4l#tTWAMJDu;Q_zAnbZ(00veH%!$EPBNrS_dz*%BK`u~c%_+tXAuW}h zt!iu-4iuc&(NU!5%JB!$wOcF9C^|GqEEo?C|`x=vT zw@G7>KWonax=UIJS~#tfg?LhYC>lQL`MsQUJJSpeYbX79N;&}UkJD-D1?9YcK~%ca zOQX?W+nS4??cAdC-tZ9uD4x$@ZywcQ$zq@>*xVhL({(LSDw+uD*dB zZ$*J~$Q$Y+#|L3>P87FB$njjHu(NRE4EanZKL&OY&R-#K%A7^Pu5t4_egQ=hm;@%z($`NY9#f~5W2n6EJfpyq(csS8XY^6vy(!@f zMx_%JA2Tx`oKL{rc?$eFD%{2R`V9*FbyD1=fZ1D=co!`0@@Q@xCEk((zN$Z$L79s5 z_KglJrNlFn!`J#dYANTDZ+GKX#dFG+nLHTSZ{=0+5GDQ!IWB;)Z;BF6LjvDC74ntx z8JHe8(CNiCWdbsvL2gsw`$mzczm?yZvJd}~5*OU{A#Wd^h6)bpOR3m5n>mGs!;al* z-ZzFU@7w9`U+zms`ro-5IKB_RPK68aPM+I`|4ojIn5|ylhhN6xqU>G;QQ^Vp(O162 zP?aFF6f1f^ooXZVJcNsTo>)u;UK^KiV7i(L&x?T*Ewb9FLcr)$ce{!PxZ&h+m?>Ej z(>h6&pV>vilwxkXxIk5v8HIxHB^Laonn3P;KQ-(&HJ*_YPMuu3OI?zAos=p)9Z!v) zpoTLXrpl=Ykwuj`P}fL}k0yh&86tbA?;txX=lH!bYJ3A34&T)Ki5h>O1kPQaS)=}r zY?OSr$v~Qi$gC7n#l_H6f;YhZ>`tR;%nU)pMT_?%i)rvHSX_z1Ks611lL1$H_h%ao zUY3mN!K>NDGxTD&m~*Jsavqzy*C zK*P6{Roddr2N+yq=5N|=jo}!$&aVdSYK>(cuZ?xR>1@AJF0FakxJI$a*@w1wF1mG^3Laze!2;D!*k2 znS_C+*Hd&aGlkLcpg`_dx-w*5hXO~o>E0nvFq~H#L64us!K1wEDfD^Brx}ya$frj> z%^TV$74&#H4&1oVfe?obb1<;5Tq)W)vCKM!_tMzf6n! zF8ur(jHl*>e{kk}4P?ZFeX%K9AH(=C6Rgpn!aR#8*#Df6fuhTRajv~V2L^Wg!Sq?V_YREh zwHXBi%MZNVYah5V&~cz^w@t%*niT@#eU@uea-fab^I%k;1ciT)Nh9m`BOdY%bgA=P=iDM=tVUm(? zl6rN8%wT-RbXa;TxQY1%;R}lH3r=?K^$;_mgyeDwEFYM)!2D|O5f0U^2eI_+-B#&s z=RKC;y|yxUPC3ieUi)a;?dL4-cH21B&!6A25ME-dUc%~>_1{>Y?G2-e4~$@K-s`TF z+@8%kxz}BXxv++nKt*zy3O;pyy_Xf41iEybKJV~HRzfxDa5Ze`S@?^!W^WV|yP0^l z{=F;BYHEtu2oEWF9#X<*n%A4yhIac<6En%1Z`RD9|1Vu<%5q3M>@{WCU?@k_h>FexZ zvM*CJd3{`o;CQ{CU_!%ULWA?^%;9)X_>7|a3|~4`TFcR}*Z<1oLLUb~0g_X|UAxo# ziG!d-&Z9&Q-$+T==2+jGZ2!E-L{7rTeLNrc;cn)Q7IPB5lU)9eyCsEh;UwsjZRq1d zE`*M95;iG$HYwq-(*7mRZbBF&9fk`R%?RNl)Kc@*QsW}w=~OO43k6RL1uh!h{+Nqk zL2}sw7n>8(#YH%eHaU-rFMc)2MQF$IwBz8r6a^bxJ%k}hdI*<%_E%4&O_8 zf#+`9o2AsjggWlsE8z@_(SGg`LMGX2CR0`&U&So<5W$&rz?ljkxwF>=msdZU$U_LA z;t8OF3xzXEct&;yXDW8wY~ktJPw<3UJYl$W+qq+uhwzh<=O-nutl-u%4?z-JC5e0F z_bP;!U_`@XL<2t&$w}jF-<$cWfNNhK^AfB`E?dDhljU8!6$C!C0UuniH9N`MPgp?F zEx=FB{OdP(!B^lhp@EyOrbY2R-Tecu<@sAYAK^A6cN^DsAg7LxAVb9?Lxt;@U+(84 zT*dKR#o@XPDrWfzCooATa6M4;4j(}pTO|$mvb{;|L$hu~fpTI!J!$1d*bcQeUKOh`}qz~c7hU!BE2+HI<%H;5b_N_F5W`YJL zUITt7r1ku<06}d(kJ^6Rd#9u>0YVMwa1Czi*6T?D!UQeP1T8#stYkyrHDMT%9)>@4 z1w{$A5CkbW1SxRy&+&qd;3%R?!+oi`Qzy9h4DezF`%J$ep_t@yF}$4pa8_`9@5NUm zqILucJ=m%q_*>4aM4_L1AM`tCUx^UGo{qDZKb#MJ!#@7sbU`*!x>- zi4H}tWQqnBS!8p(_#Mq_DEI*L%N+5L-B!_Xx%hMBt(eYcw}`iE#-o^+1wIdmuhObr z1I@y?_fz7JHSK`KW}LJl{z&sAiisuhMUccgwOTg>v+}paN`!)oVAi+2SrRkIBe4xu zJ(BpL$pgXc0gqcG){);h;F4DolOQ7j_bB>Ag1O&UmP>v|9+2l|d5h$fW;hzhoAgSu9r!iv!ur~6)>=<*_{W{ z{m7$<@w|O1{aTX@g2fV^yp)dAYyn2(skV30S;#9$sLp+rt^g0hBvG3ATlz7T+6fXS zNnM4ZNSPF5>LdqO(qzh!n@AnZdmz(|+~mdDQ<*B{C+X}5y)vChOD1aboy;uKk`iz1v!Ol`gxC^ph)YE0qn@G=N}vtFEWANyu*sG}FDZ zIp8-Y1 z-poI!Jw^&2zA#vQ@E0<-N5lr79~?(6P$sV!IrvypAA*%L=VuQ-(X2zmDx%rn4sIg- zR4!%&%e82O5A<<5R<2947Rz+hf~P!7t`aOm+_59`<#O7<>v?Q$utly< z$kL)jX(0+((k_Jm_ig4kzvurv|K~r?^BL!P&%3|xdCxibo^vyjovxUDmn1dTeE)cM z8R?aEw>oAQvu7!-h4Vu{&(5cf$0=(q?3h?}U`{LRpv)}VlOI3lBbls=mGd&^G?O{V zDkl`qc}Mz%jXqp8=QR72$1GWK?b)0MBcF|>q#et?IUO+$X!0RL$jdhBC_^ls`ofdT+()-p;vQB$~;~L!e+b%jN~aeGBx82kFGr_<)ZN^y z_=Zk7JB&x0zl?mKLwaNf}IaS9E_@={W`UK-hH<@qR4uVZkltRh=4oRn*Q?M0#9K2}|Yv6=h6S}&c{z@{(d zsoq=C1GXpQy7h|4bhXoL3DU1XTH0<)Zn!=drp(xN)FtY_BnzzI(2eu@oGY%J)}1ZU zKZ8899JC+Y*H5C2xAMOi2DIvTjijdNzR~a#isc>xg@ZFLu?IhYvz2^AHrK^u-e^qc<)Tl7ZLhX>|o+3@%qzqB6B5mJn0T5Hn$;ig9iwFRHQ^y;l7LwF0r0%^@ zAuHElgj1>(?@kACjZSDLA&sxEl)$|7}FI zF}G5SaXyg$)VL0la=duy(Jo`0LdWU`sZYh{uoRw0-XFB^@pl`4K+kj>U-R2@KA{PF_^W2^|6-3Fs}A(Xu_WcH=g+Q?B&+9_H?lTq6n}N} z<I=Y+`z5dbl%Or)x%#26NNhK}z$9^P5wC+B-f>d&YVb`S1mHlB#TWI~GA_-S7qDZqs@7CSA;4M`AkdNUSE+tPSZV37n^Y z2wP98>Abf!YdtB$`B`NZDMPHE*G0+@A5IFhASuP|VOb=J%aYIcEJztH@ok-?j1Tui zH;^)1*IdoqKw`S4q}(I3MxqkgNg5)t4hY?d7<@_2+YFM0+lboAjifL)=aLSRMPd3O zOGNlyI__wO<%^#v!vnu+i8FUqTAm$4F4J9BpKrAcXLo2YE+_8xSeCM3V;R>GM*^+( zu=DwhYhltMs}AaflepW| zHCtUF=M?w0m`O6pCe(O1C7V6PqNwHFtYu-GOcftbCi5R z)ivuUl{droO_Ocn8%+~8~V{8wRi~MaH15#}ZNaeOwUC*-}APw6tyK&cc zC)O-_$CAnhTh8QrX2+fOH%Nf%G(Wq*0oykufnQRH8i^q%)$-wQaSU+BHn)xq{$D9!AXrXR7-CB^Um=FJ&1jUIu+eK&DxF6_a$G?i2*d%;5-V|`i zk&EIn$9<2)J2sH|#Q*#;!!ebdz!H>F3LQg97Do&3IbJ|~<^=ueiDLu_x*pNt_=3br zwDR+F8epA%r%(DHa`Iz+DEef_u6QTTZzyvrAU)IR1DSTGqt6vOg|Lo1I%)N_Dktvo z6eg*>y4k6c92{rXp6PVrzTo5a)-HeNJaQR)_GDI=GdE%?o$Q;R=*%tojY)Cp$abzH z(Nl+%mpF6z6PVP@zWdJpq-p2&541X8V)svA(pJY^e(%g#Ok&a}2ksW1CHDd8C7DrT z&h`%`!?YwxoWN$_Bl%Z3;%asY#bo9d-4v&hBC}L`YsFlewpNyPRhxJ~!}y3goxQNS zSIljn!ermd+vW0xEl_68+ov9O$zoMinDe)vCAoYdeRg5$^Bk8X)<>1e(F`kgAys=kb`lpF0X%Ysqb2UU6BOYZrTyN9UI`x?Up{&rjde=6W4L%oUaDkFLe+ zVpZnKu9#rSQ!-Emb^+0nx2)+15C^rnarS)rrb%VL8;2|Wn|&3*(nvOt$CM_# zijv+S>&>mr7m}o$cnW>{m*gBNw{0SGd+*+x(p)xIP3w-Y&&>zYK=uxgzN=sHLdyLy zl_}GS>zCG(+uO49pLe?lk_lLTd}owB!z@)?VBAiRV_0UHsS8UFm^UZf&s_52Ql>F)bwAzm3Sg5d`t9R@Ixnt#I^Aw{>7^Ifz}IT`4SDbN zeweZ8Fy`Hyz5d=UmmXp<9#SU8iY`$=uPAo#CCzIu2tx*S8dTpCj=) zzeHAfbF2o_mHp(YcQ0$FOm_!7>h|Wgs?t59E(iH=Ipdk0%7##%*JLs3)wz4Zhtt+z zdhy+^&k=HF>oe^r@~I(*Nbl_`pDL2+dqKi8AMW!krhn9zE}sl?xb@4j@#_`jgN+X( zg2FZ(B)#_GV06MJ?!t6@`SU(w6E_K8{;1q7+{BfQraz_k-P^>SRi+2@s-AA*-fGaF zC%1NO;_!ID=Lh8hzNE%qeD8(&MqvDyuYbHs@coRHQTX-7n@rytqc&Oz2|2$MO z!y;gm%TzkC$Tv<+v&5=r2yY6WBpG}b5dUVuW8mZQ5+Ly(2Yt1{3iiPzcmZSa2Hql&K|GYhXPBaihCndnKnsi-frfw-V&OLQ!z8@=W)A+4 z4vnBOlA?6L2@XRsbiz-g@Hf?9Dn0k&`e@}Ld0e!ye_1)P9N_ySXZL?1&ieM z3e><`7_uDm1ZIN?h+rEWhI4Qo8leaHD^Nb@gE>eb5Mm%3?!Ytn1fxyRAFvQCK@R&M z5%S#@{3J}6ph=5cmfd=RS{z{Y&`d|(c2!dER4|kyj27puoF(eWvGHzpd>+^VFoM*2iOAPkOIX}58a^QhQ0cg5v?^!b)(09S{ZSa1$QGdl<15$1yAb3-Ewoh=*LL zgf`%9!`cGVVHpU(7ee6-T!UKZ0JZH{(_tR00%!1pXh?^f@C5pS-huML2sVHx?12Qh z1oxl~cz!4!ro%E2fG>o?Stx`$=!9YZSaU%KR)ZM);Rs~HEog=hFfstgJQ#sQ8Rg{X zU;UH%RRxd#xypt1+Jj$BYTFC&B%roJU@sAA557R4t?>20>Vp?I>^)OMJD(LTaqaP^rL8BosLc@RwTD z)yBDb2xI~Uepp20Es~&oV_${HM=TdDbpOvD{!mpJo=goO})b(i`t4*kmgdJK)_16d)%d zo8=0jEeS>}vGl*;A}MLM@P8-ra&*L3wg0B|l8bBy(+_4jn1M)UFkNr_u+hKDL;?kR zMH`I~3-PvvSm8U@L8K#`<)AZd#!ScQ(`L<@F?*W*teFneL~~}%{%ht;o#_Id=_7}K z`+pZH3rP^dPMLw5r-LWuZVJ(3Xogi>}}H9j3t(Nkj?^F-A;Isf`+f z!4zpb3|9T0bnp86POECD@i4}N$tZPA9^NAv9Ak+{>ZEX{h7ISr%iIJCZEul`j1Q$Y zhWGbuArnC?*G4zVNCKXwiZUrWBVI{!EYDjY@xru{YYRmZ)JY_Da2JY%JT*<8n@Hv) z(suU{$pliNoEoh>6f;BWC6Rb2WNIUn@P)bdU^50Msr-#9f2cA#SSA+9(@K^2n!LZK zr0qXp6n_K{899ljp&-%Ve4*4v@Z2RrydX2!4$?o=u+d5~v6EOTkdV16(*FBv`2wEW zn4$m7bkQb^umh^1P3G=D^-&+GL@KKA)y5>3h{$farL`JgMJDhW%$ziM&*@V 2005267 bytes +2023/08/17-15:21:35.633032 6161788928 (Original Log Time 2023/08/17-15:21:35.632945) [db/compaction/compaction_job.cc:885] [default] compacted to: files[0 1 0 0 0 0 0] max score 0.01, MB/sec: 19.7 rd, 19.9 wr, level 1, files in(4, 1) out(1 +0 blob) MB in(0.2, 1.7 +0.0 blob) out(1.9 +0.0 blob), read-write-amplify(19.4) write-amplify(9.8) OK, records in: 42034, records dropped: 4 output_compression: Snappy +2023/08/17-15:21:35.633034 6161788928 (Original Log Time 2023/08/17-15:21:35.632964) EVENT_LOG_v1 {"time_micros": 1692253295632950, "job": 3, "event": "compaction_finished", "compaction_time_micros": 100891, "compaction_time_cpu_micros": 100032, "output_level": 1, "num_output_files": 1, "total_output_size": 2005267, "num_input_records": 42034, "num_output_records": 42030, "num_subcompactions": 1, "output_compression": "Snappy", "num_single_delete_mismatches": 0, "num_single_delete_fallthrough": 0, "lsm_state": [0, 1, 0, 0, 0, 0, 0]} +2023/08/17-15:21:35.633118 6161788928 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000185.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/17-15:21:35.633123 6161788928 EVENT_LOG_v1 {"time_micros": 1692253295633121, "job": 3, "event": "table_file_deletion", "file_number": 185} +2023/08/17-15:21:35.633176 6161788928 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000180.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/17-15:21:35.633180 6161788928 EVENT_LOG_v1 {"time_micros": 1692253295633179, "job": 3, "event": "table_file_deletion", "file_number": 180} +2023/08/17-15:21:35.633228 6161788928 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000175.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/17-15:21:35.633232 6161788928 EVENT_LOG_v1 {"time_micros": 1692253295633231, "job": 3, "event": "table_file_deletion", "file_number": 175} +2023/08/17-15:21:35.633298 6161788928 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000166.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/17-15:21:35.633301 6161788928 EVENT_LOG_v1 {"time_micros": 1692253295633300, "job": 3, "event": "table_file_deletion", "file_number": 166} +2023/08/17-15:21:35.633385 6161788928 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000163.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/17-15:21:35.633389 6161788928 EVENT_LOG_v1 {"time_micros": 1692253295633388, "job": 3, "event": "table_file_deletion", "file_number": 163} diff --git a/rust/hyperlane_db/LOG.old.1692109095866656 b/rust/hyperlane_db/LOG.old.1692109095866656 new file mode 100644 index 0000000000..e55706e1a6 --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692109095866656 @@ -0,0 +1,278 @@ +2023/08/15-23:09:01.441654 8651103744 RocksDB version: 8.1.1 +2023/08/15-23:09:01.442120 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/15-23:09:01.442124 8651103744 DB SUMMARY +2023/08/15-23:09:01.442125 8651103744 DB Session ID: 5Z3AZ32JWZF523KTVDTX +2023/08/15-23:09:01.442179 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 0, files: +2023/08/15-23:09:01.442182 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: +2023/08/15-23:09:01.442183 8651103744 Options.error_if_exists: 0 +2023/08/15-23:09:01.442184 8651103744 Options.create_if_missing: 1 +2023/08/15-23:09:01.442184 8651103744 Options.paranoid_checks: 1 +2023/08/15-23:09:01.442185 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/15-23:09:01.442186 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/15-23:09:01.442186 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/15-23:09:01.442187 8651103744 Options.env: 0x107247828 +2023/08/15-23:09:01.442188 8651103744 Options.fs: PosixFileSystem +2023/08/15-23:09:01.442188 8651103744 Options.info_log: 0x130104098 +2023/08/15-23:09:01.442189 8651103744 Options.max_file_opening_threads: 16 +2023/08/15-23:09:01.442189 8651103744 Options.statistics: 0x0 +2023/08/15-23:09:01.442190 8651103744 Options.use_fsync: 0 +2023/08/15-23:09:01.442190 8651103744 Options.max_log_file_size: 0 +2023/08/15-23:09:01.442191 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/15-23:09:01.442192 8651103744 Options.log_file_time_to_roll: 0 +2023/08/15-23:09:01.442192 8651103744 Options.keep_log_file_num: 1000 +2023/08/15-23:09:01.442193 8651103744 Options.recycle_log_file_num: 0 +2023/08/15-23:09:01.442193 8651103744 Options.allow_fallocate: 1 +2023/08/15-23:09:01.442194 8651103744 Options.allow_mmap_reads: 0 +2023/08/15-23:09:01.442194 8651103744 Options.allow_mmap_writes: 0 +2023/08/15-23:09:01.442195 8651103744 Options.use_direct_reads: 0 +2023/08/15-23:09:01.442195 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/15-23:09:01.442196 8651103744 Options.create_missing_column_families: 0 +2023/08/15-23:09:01.442196 8651103744 Options.db_log_dir: +2023/08/15-23:09:01.442197 8651103744 Options.wal_dir: +2023/08/15-23:09:01.442198 8651103744 Options.table_cache_numshardbits: 6 +2023/08/15-23:09:01.442198 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/15-23:09:01.442199 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/15-23:09:01.442199 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/15-23:09:01.442200 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/15-23:09:01.442200 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/15-23:09:01.442201 8651103744 Options.advise_random_on_open: 1 +2023/08/15-23:09:01.442201 8651103744 Options.db_write_buffer_size: 0 +2023/08/15-23:09:01.442202 8651103744 Options.write_buffer_manager: 0x600003e5c000 +2023/08/15-23:09:01.442203 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/15-23:09:01.442203 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/15-23:09:01.442204 8651103744 Options.use_adaptive_mutex: 0 +2023/08/15-23:09:01.442204 8651103744 Options.rate_limiter: 0x0 +2023/08/15-23:09:01.442205 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/15-23:09:01.442206 8651103744 Options.wal_recovery_mode: 2 +2023/08/15-23:09:01.442206 8651103744 Options.enable_thread_tracking: 0 +2023/08/15-23:09:01.442207 8651103744 Options.enable_pipelined_write: 0 +2023/08/15-23:09:01.442207 8651103744 Options.unordered_write: 0 +2023/08/15-23:09:01.442208 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/15-23:09:01.442208 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/15-23:09:01.442209 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/15-23:09:01.442209 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/15-23:09:01.442210 8651103744 Options.row_cache: None +2023/08/15-23:09:01.442210 8651103744 Options.wal_filter: None +2023/08/15-23:09:01.442214 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/15-23:09:01.442215 8651103744 Options.allow_ingest_behind: 0 +2023/08/15-23:09:01.442215 8651103744 Options.two_write_queues: 0 +2023/08/15-23:09:01.442216 8651103744 Options.manual_wal_flush: 0 +2023/08/15-23:09:01.442216 8651103744 Options.wal_compression: 0 +2023/08/15-23:09:01.442217 8651103744 Options.atomic_flush: 0 +2023/08/15-23:09:01.442217 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/15-23:09:01.442218 8651103744 Options.persist_stats_to_disk: 0 +2023/08/15-23:09:01.442219 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/15-23:09:01.442219 8651103744 Options.log_readahead_size: 0 +2023/08/15-23:09:01.442220 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/15-23:09:01.442220 8651103744 Options.best_efforts_recovery: 0 +2023/08/15-23:09:01.442221 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/15-23:09:01.442221 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/15-23:09:01.442222 8651103744 Options.allow_data_in_errors: 0 +2023/08/15-23:09:01.442223 8651103744 Options.db_host_id: __hostname__ +2023/08/15-23:09:01.442223 8651103744 Options.enforce_single_del_contracts: true +2023/08/15-23:09:01.442224 8651103744 Options.max_background_jobs: 2 +2023/08/15-23:09:01.442224 8651103744 Options.max_background_compactions: -1 +2023/08/15-23:09:01.442225 8651103744 Options.max_subcompactions: 1 +2023/08/15-23:09:01.442225 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/15-23:09:01.442226 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/15-23:09:01.442226 8651103744 Options.delayed_write_rate : 16777216 +2023/08/15-23:09:01.442227 8651103744 Options.max_total_wal_size: 0 +2023/08/15-23:09:01.442228 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/15-23:09:01.442228 8651103744 Options.stats_dump_period_sec: 600 +2023/08/15-23:09:01.442229 8651103744 Options.stats_persist_period_sec: 600 +2023/08/15-23:09:01.442229 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/15-23:09:01.442230 8651103744 Options.max_open_files: -1 +2023/08/15-23:09:01.442230 8651103744 Options.bytes_per_sync: 0 +2023/08/15-23:09:01.442231 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/15-23:09:01.442231 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/15-23:09:01.442232 8651103744 Options.compaction_readahead_size: 0 +2023/08/15-23:09:01.442233 8651103744 Options.max_background_flushes: -1 +2023/08/15-23:09:01.442233 8651103744 Compression algorithms supported: +2023/08/15-23:09:01.442248 8651103744 kZSTD supported: 1 +2023/08/15-23:09:01.442249 8651103744 kZlibCompression supported: 1 +2023/08/15-23:09:01.442249 8651103744 kXpressCompression supported: 0 +2023/08/15-23:09:01.442250 8651103744 kSnappyCompression supported: 1 +2023/08/15-23:09:01.442250 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/15-23:09:01.442251 8651103744 kLZ4HCCompression supported: 1 +2023/08/15-23:09:01.442251 8651103744 kLZ4Compression supported: 1 +2023/08/15-23:09:01.442252 8651103744 kBZip2Compression supported: 1 +2023/08/15-23:09:01.442258 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/15-23:09:01.442259 8651103744 DMutex implementation: pthread_mutex_t +2023/08/15-23:09:01.442515 8651103744 [db/db_impl/db_impl_open.cc:315] Creating manifest 1 +2023/08/15-23:09:01.442789 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000001 +2023/08/15-23:09:01.442861 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/15-23:09:01.442863 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/15-23:09:01.442863 8651103744 Options.merge_operator: None +2023/08/15-23:09:01.442864 8651103744 Options.compaction_filter: None +2023/08/15-23:09:01.442865 8651103744 Options.compaction_filter_factory: None +2023/08/15-23:09:01.442865 8651103744 Options.sst_partitioner_factory: None +2023/08/15-23:09:01.442866 8651103744 Options.memtable_factory: SkipListFactory +2023/08/15-23:09:01.442866 8651103744 Options.table_factory: BlockBasedTable +2023/08/15-23:09:01.442877 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600000558640) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000030500d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/15-23:09:01.442878 8651103744 Options.write_buffer_size: 67108864 +2023/08/15-23:09:01.442878 8651103744 Options.max_write_buffer_number: 2 +2023/08/15-23:09:01.442879 8651103744 Options.compression: Snappy +2023/08/15-23:09:01.442880 8651103744 Options.bottommost_compression: Disabled +2023/08/15-23:09:01.442880 8651103744 Options.prefix_extractor: nullptr +2023/08/15-23:09:01.442881 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/15-23:09:01.442882 8651103744 Options.num_levels: 7 +2023/08/15-23:09:01.442882 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/15-23:09:01.442883 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/15-23:09:01.442883 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/15-23:09:01.442884 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/15-23:09:01.442885 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/15-23:09:01.442885 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/15-23:09:01.442886 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/15-23:09:01.442886 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/15-23:09:01.442887 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/15-23:09:01.442888 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/15-23:09:01.442888 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/15-23:09:01.442889 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/15-23:09:01.442889 8651103744 Options.compression_opts.window_bits: -14 +2023/08/15-23:09:01.442890 8651103744 Options.compression_opts.level: 32767 +2023/08/15-23:09:01.442891 8651103744 Options.compression_opts.strategy: 0 +2023/08/15-23:09:01.442891 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/15-23:09:01.442892 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/15-23:09:01.442892 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/15-23:09:01.442893 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/15-23:09:01.442893 8651103744 Options.compression_opts.enabled: false +2023/08/15-23:09:01.442894 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/15-23:09:01.442895 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/15-23:09:01.442895 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/15-23:09:01.442896 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/15-23:09:01.442896 8651103744 Options.target_file_size_base: 67108864 +2023/08/15-23:09:01.442897 8651103744 Options.target_file_size_multiplier: 1 +2023/08/15-23:09:01.442897 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/15-23:09:01.442898 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/15-23:09:01.442899 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/15-23:09:01.442899 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/15-23:09:01.442900 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/15-23:09:01.442901 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/15-23:09:01.442901 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/15-23:09:01.442902 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/15-23:09:01.442902 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/15-23:09:01.442903 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/15-23:09:01.442903 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/15-23:09:01.442904 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/15-23:09:01.442904 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/15-23:09:01.442905 8651103744 Options.arena_block_size: 1048576 +2023/08/15-23:09:01.442906 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/15-23:09:01.442910 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/15-23:09:01.442910 8651103744 Options.disable_auto_compactions: 0 +2023/08/15-23:09:01.442911 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/15-23:09:01.442912 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/15-23:09:01.442912 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/15-23:09:01.442913 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/15-23:09:01.442913 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/15-23:09:01.442914 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/15-23:09:01.442915 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/15-23:09:01.442915 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/15-23:09:01.442917 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/15-23:09:01.442918 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/15-23:09:01.442919 8651103744 Options.table_properties_collectors: +2023/08/15-23:09:01.442920 8651103744 Options.inplace_update_support: 0 +2023/08/15-23:09:01.442920 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/15-23:09:01.442921 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/15-23:09:01.442922 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/15-23:09:01.442922 8651103744 Options.memtable_huge_page_size: 0 +2023/08/15-23:09:01.442923 8651103744 Options.bloom_locality: 0 +2023/08/15-23:09:01.442923 8651103744 Options.max_successive_merges: 0 +2023/08/15-23:09:01.442924 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/15-23:09:01.442924 8651103744 Options.paranoid_file_checks: 0 +2023/08/15-23:09:01.442925 8651103744 Options.force_consistency_checks: 1 +2023/08/15-23:09:01.442926 8651103744 Options.report_bg_io_stats: 0 +2023/08/15-23:09:01.442926 8651103744 Options.ttl: 2592000 +2023/08/15-23:09:01.442927 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/15-23:09:01.442927 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/15-23:09:01.442928 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/15-23:09:01.442928 8651103744 Options.enable_blob_files: false +2023/08/15-23:09:01.442929 8651103744 Options.min_blob_size: 0 +2023/08/15-23:09:01.442929 8651103744 Options.blob_file_size: 268435456 +2023/08/15-23:09:01.442930 8651103744 Options.blob_compression_type: NoCompression +2023/08/15-23:09:01.442931 8651103744 Options.enable_blob_garbage_collection: false +2023/08/15-23:09:01.442931 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/15-23:09:01.442932 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/15-23:09:01.442932 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/15-23:09:01.442933 8651103744 Options.blob_file_starting_level: 0 +2023/08/15-23:09:01.442934 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/15-23:09:01.443287 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000001 succeeded,manifest_file_number is 1, next_file_number is 3, last_sequence is 0, log_number is 0,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 0 +2023/08/15-23:09:01.443289 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 0 +2023/08/15-23:09:01.443347 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/15-23:09:01.443463 8651103744 [db/version_set.cc:5180] Creating manifest 5 +2023/08/15-23:09:01.444454 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x1301041f0 +2023/08/15-23:09:01.444473 8651103744 DB pointer 0x130808200 +2023/08/15-23:09:01.444557 6090125312 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/15-23:09:01.444559 6090125312 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + Sum 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000030500d8#73693 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 8e-06 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** +2023/08/15-23:09:01.444836 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work +2023/08/15-23:09:01.444913 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692109129283399 b/rust/hyperlane_db/LOG.old.1692109129283399 new file mode 100644 index 0000000000..9157183844 --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692109129283399 @@ -0,0 +1,283 @@ +2023/08/15-23:18:15.867712 8651103744 RocksDB version: 8.1.1 +2023/08/15-23:18:15.868868 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/15-23:18:15.868873 8651103744 DB SUMMARY +2023/08/15-23:18:15.868875 8651103744 DB Session ID: OIJ4PXN88HMU1EU8ASEF +2023/08/15-23:18:15.869038 8651103744 CURRENT file: CURRENT +2023/08/15-23:18:15.869041 8651103744 IDENTITY file: IDENTITY +2023/08/15-23:18:15.869067 8651103744 MANIFEST file: MANIFEST-000005 size: 66 Bytes +2023/08/15-23:18:15.869073 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 0, files: +2023/08/15-23:18:15.869107 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000004.log size: 0 ; +2023/08/15-23:18:15.869109 8651103744 Options.error_if_exists: 0 +2023/08/15-23:18:15.869112 8651103744 Options.create_if_missing: 1 +2023/08/15-23:18:15.869113 8651103744 Options.paranoid_checks: 1 +2023/08/15-23:18:15.869115 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/15-23:18:15.869117 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/15-23:18:15.869118 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/15-23:18:15.869120 8651103744 Options.env: 0x106edf828 +2023/08/15-23:18:15.869122 8651103744 Options.fs: PosixFileSystem +2023/08/15-23:18:15.869124 8651103744 Options.info_log: 0x117704818 +2023/08/15-23:18:15.869126 8651103744 Options.max_file_opening_threads: 16 +2023/08/15-23:18:15.869127 8651103744 Options.statistics: 0x0 +2023/08/15-23:18:15.869129 8651103744 Options.use_fsync: 0 +2023/08/15-23:18:15.869131 8651103744 Options.max_log_file_size: 0 +2023/08/15-23:18:15.869133 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/15-23:18:15.869135 8651103744 Options.log_file_time_to_roll: 0 +2023/08/15-23:18:15.869136 8651103744 Options.keep_log_file_num: 1000 +2023/08/15-23:18:15.869138 8651103744 Options.recycle_log_file_num: 0 +2023/08/15-23:18:15.869140 8651103744 Options.allow_fallocate: 1 +2023/08/15-23:18:15.869141 8651103744 Options.allow_mmap_reads: 0 +2023/08/15-23:18:15.869143 8651103744 Options.allow_mmap_writes: 0 +2023/08/15-23:18:15.869144 8651103744 Options.use_direct_reads: 0 +2023/08/15-23:18:15.869146 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/15-23:18:15.869148 8651103744 Options.create_missing_column_families: 0 +2023/08/15-23:18:15.869149 8651103744 Options.db_log_dir: +2023/08/15-23:18:15.869151 8651103744 Options.wal_dir: +2023/08/15-23:18:15.869153 8651103744 Options.table_cache_numshardbits: 6 +2023/08/15-23:18:15.869154 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/15-23:18:15.869156 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/15-23:18:15.869158 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/15-23:18:15.869159 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/15-23:18:15.869161 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/15-23:18:15.869163 8651103744 Options.advise_random_on_open: 1 +2023/08/15-23:18:15.869164 8651103744 Options.db_write_buffer_size: 0 +2023/08/15-23:18:15.869166 8651103744 Options.write_buffer_manager: 0x600002c9c000 +2023/08/15-23:18:15.869168 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/15-23:18:15.869169 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/15-23:18:15.869171 8651103744 Options.use_adaptive_mutex: 0 +2023/08/15-23:18:15.869173 8651103744 Options.rate_limiter: 0x0 +2023/08/15-23:18:15.869178 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/15-23:18:15.869180 8651103744 Options.wal_recovery_mode: 2 +2023/08/15-23:18:15.869182 8651103744 Options.enable_thread_tracking: 0 +2023/08/15-23:18:15.869183 8651103744 Options.enable_pipelined_write: 0 +2023/08/15-23:18:15.869185 8651103744 Options.unordered_write: 0 +2023/08/15-23:18:15.869187 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/15-23:18:15.869188 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/15-23:18:15.869190 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/15-23:18:15.869192 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/15-23:18:15.869193 8651103744 Options.row_cache: None +2023/08/15-23:18:15.869195 8651103744 Options.wal_filter: None +2023/08/15-23:18:15.869197 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/15-23:18:15.869198 8651103744 Options.allow_ingest_behind: 0 +2023/08/15-23:18:15.869200 8651103744 Options.two_write_queues: 0 +2023/08/15-23:18:15.869202 8651103744 Options.manual_wal_flush: 0 +2023/08/15-23:18:15.869203 8651103744 Options.wal_compression: 0 +2023/08/15-23:18:15.869205 8651103744 Options.atomic_flush: 0 +2023/08/15-23:18:15.869207 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/15-23:18:15.869208 8651103744 Options.persist_stats_to_disk: 0 +2023/08/15-23:18:15.869210 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/15-23:18:15.869212 8651103744 Options.log_readahead_size: 0 +2023/08/15-23:18:15.869214 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/15-23:18:15.869216 8651103744 Options.best_efforts_recovery: 0 +2023/08/15-23:18:15.869217 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/15-23:18:15.869219 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/15-23:18:15.869221 8651103744 Options.allow_data_in_errors: 0 +2023/08/15-23:18:15.869223 8651103744 Options.db_host_id: __hostname__ +2023/08/15-23:18:15.869224 8651103744 Options.enforce_single_del_contracts: true +2023/08/15-23:18:15.869226 8651103744 Options.max_background_jobs: 2 +2023/08/15-23:18:15.869228 8651103744 Options.max_background_compactions: -1 +2023/08/15-23:18:15.869230 8651103744 Options.max_subcompactions: 1 +2023/08/15-23:18:15.869231 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/15-23:18:15.869233 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/15-23:18:15.869235 8651103744 Options.delayed_write_rate : 16777216 +2023/08/15-23:18:15.869236 8651103744 Options.max_total_wal_size: 0 +2023/08/15-23:18:15.869238 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/15-23:18:15.869241 8651103744 Options.stats_dump_period_sec: 600 +2023/08/15-23:18:15.869243 8651103744 Options.stats_persist_period_sec: 600 +2023/08/15-23:18:15.869244 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/15-23:18:15.869246 8651103744 Options.max_open_files: -1 +2023/08/15-23:18:15.869248 8651103744 Options.bytes_per_sync: 0 +2023/08/15-23:18:15.869250 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/15-23:18:15.869251 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/15-23:18:15.869253 8651103744 Options.compaction_readahead_size: 0 +2023/08/15-23:18:15.869254 8651103744 Options.max_background_flushes: -1 +2023/08/15-23:18:15.869256 8651103744 Compression algorithms supported: +2023/08/15-23:18:15.869290 8651103744 kZSTD supported: 1 +2023/08/15-23:18:15.869292 8651103744 kZlibCompression supported: 1 +2023/08/15-23:18:15.869294 8651103744 kXpressCompression supported: 0 +2023/08/15-23:18:15.869296 8651103744 kSnappyCompression supported: 1 +2023/08/15-23:18:15.869297 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/15-23:18:15.869299 8651103744 kLZ4HCCompression supported: 1 +2023/08/15-23:18:15.869301 8651103744 kLZ4Compression supported: 1 +2023/08/15-23:18:15.869302 8651103744 kBZip2Compression supported: 1 +2023/08/15-23:18:15.869316 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/15-23:18:15.869318 8651103744 DMutex implementation: pthread_mutex_t +2023/08/15-23:18:15.869847 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000005 +2023/08/15-23:18:15.869965 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/15-23:18:15.869967 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/15-23:18:15.869968 8651103744 Options.merge_operator: None +2023/08/15-23:18:15.869968 8651103744 Options.compaction_filter: None +2023/08/15-23:18:15.869969 8651103744 Options.compaction_filter_factory: None +2023/08/15-23:18:15.869970 8651103744 Options.sst_partitioner_factory: None +2023/08/15-23:18:15.869970 8651103744 Options.memtable_factory: SkipListFactory +2023/08/15-23:18:15.869971 8651103744 Options.table_factory: BlockBasedTable +2023/08/15-23:18:15.870002 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600001798040) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000022900d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/15-23:18:15.870004 8651103744 Options.write_buffer_size: 67108864 +2023/08/15-23:18:15.870005 8651103744 Options.max_write_buffer_number: 2 +2023/08/15-23:18:15.870006 8651103744 Options.compression: Snappy +2023/08/15-23:18:15.870007 8651103744 Options.bottommost_compression: Disabled +2023/08/15-23:18:15.870007 8651103744 Options.prefix_extractor: nullptr +2023/08/15-23:18:15.870008 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/15-23:18:15.870009 8651103744 Options.num_levels: 7 +2023/08/15-23:18:15.870009 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/15-23:18:15.870010 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/15-23:18:15.870011 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/15-23:18:15.870011 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/15-23:18:15.870012 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/15-23:18:15.870013 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/15-23:18:15.870013 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/15-23:18:15.870014 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/15-23:18:15.870014 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/15-23:18:15.870017 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/15-23:18:15.870018 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/15-23:18:15.870019 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/15-23:18:15.870019 8651103744 Options.compression_opts.window_bits: -14 +2023/08/15-23:18:15.870020 8651103744 Options.compression_opts.level: 32767 +2023/08/15-23:18:15.870021 8651103744 Options.compression_opts.strategy: 0 +2023/08/15-23:18:15.870021 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/15-23:18:15.870022 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/15-23:18:15.870023 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/15-23:18:15.870023 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/15-23:18:15.870024 8651103744 Options.compression_opts.enabled: false +2023/08/15-23:18:15.870025 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/15-23:18:15.870025 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/15-23:18:15.870026 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/15-23:18:15.870026 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/15-23:18:15.870027 8651103744 Options.target_file_size_base: 67108864 +2023/08/15-23:18:15.870028 8651103744 Options.target_file_size_multiplier: 1 +2023/08/15-23:18:15.870028 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/15-23:18:15.870029 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/15-23:18:15.870030 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/15-23:18:15.870031 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/15-23:18:15.870031 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/15-23:18:15.870032 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/15-23:18:15.870033 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/15-23:18:15.870033 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/15-23:18:15.870034 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/15-23:18:15.870035 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/15-23:18:15.870035 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/15-23:18:15.870036 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/15-23:18:15.870037 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/15-23:18:15.870037 8651103744 Options.arena_block_size: 1048576 +2023/08/15-23:18:15.870038 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/15-23:18:15.870039 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/15-23:18:15.870039 8651103744 Options.disable_auto_compactions: 0 +2023/08/15-23:18:15.870040 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/15-23:18:15.870043 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/15-23:18:15.870043 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/15-23:18:15.870044 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/15-23:18:15.870045 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/15-23:18:15.870046 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/15-23:18:15.870046 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/15-23:18:15.870052 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/15-23:18:15.870052 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/15-23:18:15.870053 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/15-23:18:15.870054 8651103744 Options.table_properties_collectors: +2023/08/15-23:18:15.870055 8651103744 Options.inplace_update_support: 0 +2023/08/15-23:18:15.870056 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/15-23:18:15.870056 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/15-23:18:15.870057 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/15-23:18:15.870058 8651103744 Options.memtable_huge_page_size: 0 +2023/08/15-23:18:15.870058 8651103744 Options.bloom_locality: 0 +2023/08/15-23:18:15.870059 8651103744 Options.max_successive_merges: 0 +2023/08/15-23:18:15.870059 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/15-23:18:15.870060 8651103744 Options.paranoid_file_checks: 0 +2023/08/15-23:18:15.870061 8651103744 Options.force_consistency_checks: 1 +2023/08/15-23:18:15.870061 8651103744 Options.report_bg_io_stats: 0 +2023/08/15-23:18:15.870062 8651103744 Options.ttl: 2592000 +2023/08/15-23:18:15.870063 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/15-23:18:15.870065 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/15-23:18:15.870066 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/15-23:18:15.870067 8651103744 Options.enable_blob_files: false +2023/08/15-23:18:15.870067 8651103744 Options.min_blob_size: 0 +2023/08/15-23:18:15.870068 8651103744 Options.blob_file_size: 268435456 +2023/08/15-23:18:15.870069 8651103744 Options.blob_compression_type: NoCompression +2023/08/15-23:18:15.870069 8651103744 Options.enable_blob_garbage_collection: false +2023/08/15-23:18:15.870070 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/15-23:18:15.870071 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/15-23:18:15.870071 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/15-23:18:15.870072 8651103744 Options.blob_file_starting_level: 0 +2023/08/15-23:18:15.870073 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/15-23:18:15.870646 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000005 succeeded,manifest_file_number is 5, next_file_number is 7, last_sequence is 0, log_number is 0,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 0 +2023/08/15-23:18:15.870648 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 0 +2023/08/15-23:18:15.870733 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/15-23:18:15.870830 8651103744 EVENT_LOG_v1 {"time_micros": 1692109095870826, "job": 1, "event": "recovery_started", "wal_files": [4]} +2023/08/15-23:18:15.870832 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #4 mode 2 +2023/08/15-23:18:15.870878 8651103744 EVENT_LOG_v1 {"time_micros": 1692109095870877, "job": 1, "event": "recovery_finished"} +2023/08/15-23:18:15.870941 8651103744 [db/version_set.cc:5180] Creating manifest 9 +2023/08/15-23:18:15.872126 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x107d04080 +2023/08/15-23:18:15.872146 8651103744 DB pointer 0x12000b400 +2023/08/15-23:18:15.872266 6093664256 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/15-23:18:15.872283 6093664256 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + Sum 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000022900d8#74297 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 9e-06 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** +2023/08/15-23:18:15.875262 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work +2023/08/15-23:18:15.875539 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692109142543801 b/rust/hyperlane_db/LOG.old.1692109142543801 new file mode 100644 index 0000000000..9e05946e93 --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692109142543801 @@ -0,0 +1,284 @@ +2023/08/15-23:18:49.283853 8651103744 RocksDB version: 8.1.1 +2023/08/15-23:18:49.284548 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/15-23:18:49.284551 8651103744 DB SUMMARY +2023/08/15-23:18:49.284553 8651103744 DB Session ID: B7VD9B7G4GRD4YGNBNF7 +2023/08/15-23:18:49.284655 8651103744 CURRENT file: CURRENT +2023/08/15-23:18:49.284656 8651103744 IDENTITY file: IDENTITY +2023/08/15-23:18:49.284672 8651103744 MANIFEST file: MANIFEST-000009 size: 81 Bytes +2023/08/15-23:18:49.284674 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 0, files: +2023/08/15-23:18:49.284700 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000004.log size: 0 ; 000008.log size: 0 ; +2023/08/15-23:18:49.284702 8651103744 Options.error_if_exists: 0 +2023/08/15-23:18:49.284703 8651103744 Options.create_if_missing: 1 +2023/08/15-23:18:49.284704 8651103744 Options.paranoid_checks: 1 +2023/08/15-23:18:49.284705 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/15-23:18:49.284706 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/15-23:18:49.284707 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/15-23:18:49.284708 8651103744 Options.env: 0x102aaf828 +2023/08/15-23:18:49.284709 8651103744 Options.fs: PosixFileSystem +2023/08/15-23:18:49.284710 8651103744 Options.info_log: 0x153f05fb8 +2023/08/15-23:18:49.284711 8651103744 Options.max_file_opening_threads: 16 +2023/08/15-23:18:49.284712 8651103744 Options.statistics: 0x0 +2023/08/15-23:18:49.284713 8651103744 Options.use_fsync: 0 +2023/08/15-23:18:49.284714 8651103744 Options.max_log_file_size: 0 +2023/08/15-23:18:49.284715 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/15-23:18:49.284717 8651103744 Options.log_file_time_to_roll: 0 +2023/08/15-23:18:49.284718 8651103744 Options.keep_log_file_num: 1000 +2023/08/15-23:18:49.284719 8651103744 Options.recycle_log_file_num: 0 +2023/08/15-23:18:49.284720 8651103744 Options.allow_fallocate: 1 +2023/08/15-23:18:49.284721 8651103744 Options.allow_mmap_reads: 0 +2023/08/15-23:18:49.284722 8651103744 Options.allow_mmap_writes: 0 +2023/08/15-23:18:49.284723 8651103744 Options.use_direct_reads: 0 +2023/08/15-23:18:49.284724 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/15-23:18:49.284725 8651103744 Options.create_missing_column_families: 0 +2023/08/15-23:18:49.284726 8651103744 Options.db_log_dir: +2023/08/15-23:18:49.284727 8651103744 Options.wal_dir: +2023/08/15-23:18:49.284728 8651103744 Options.table_cache_numshardbits: 6 +2023/08/15-23:18:49.284729 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/15-23:18:49.284730 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/15-23:18:49.284731 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/15-23:18:49.284732 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/15-23:18:49.284733 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/15-23:18:49.284734 8651103744 Options.advise_random_on_open: 1 +2023/08/15-23:18:49.284735 8651103744 Options.db_write_buffer_size: 0 +2023/08/15-23:18:49.284736 8651103744 Options.write_buffer_manager: 0x6000022bc820 +2023/08/15-23:18:49.284737 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/15-23:18:49.284738 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/15-23:18:49.284739 8651103744 Options.use_adaptive_mutex: 0 +2023/08/15-23:18:49.284740 8651103744 Options.rate_limiter: 0x0 +2023/08/15-23:18:49.284741 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/15-23:18:49.284742 8651103744 Options.wal_recovery_mode: 2 +2023/08/15-23:18:49.284743 8651103744 Options.enable_thread_tracking: 0 +2023/08/15-23:18:49.284744 8651103744 Options.enable_pipelined_write: 0 +2023/08/15-23:18:49.284745 8651103744 Options.unordered_write: 0 +2023/08/15-23:18:49.284746 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/15-23:18:49.284747 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/15-23:18:49.284748 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/15-23:18:49.284749 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/15-23:18:49.284750 8651103744 Options.row_cache: None +2023/08/15-23:18:49.284751 8651103744 Options.wal_filter: None +2023/08/15-23:18:49.284752 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/15-23:18:49.284753 8651103744 Options.allow_ingest_behind: 0 +2023/08/15-23:18:49.284754 8651103744 Options.two_write_queues: 0 +2023/08/15-23:18:49.284755 8651103744 Options.manual_wal_flush: 0 +2023/08/15-23:18:49.284756 8651103744 Options.wal_compression: 0 +2023/08/15-23:18:49.284757 8651103744 Options.atomic_flush: 0 +2023/08/15-23:18:49.284758 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/15-23:18:49.284759 8651103744 Options.persist_stats_to_disk: 0 +2023/08/15-23:18:49.284760 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/15-23:18:49.284761 8651103744 Options.log_readahead_size: 0 +2023/08/15-23:18:49.284762 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/15-23:18:49.284763 8651103744 Options.best_efforts_recovery: 0 +2023/08/15-23:18:49.284764 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/15-23:18:49.284765 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/15-23:18:49.284766 8651103744 Options.allow_data_in_errors: 0 +2023/08/15-23:18:49.284767 8651103744 Options.db_host_id: __hostname__ +2023/08/15-23:18:49.284768 8651103744 Options.enforce_single_del_contracts: true +2023/08/15-23:18:49.284769 8651103744 Options.max_background_jobs: 2 +2023/08/15-23:18:49.284770 8651103744 Options.max_background_compactions: -1 +2023/08/15-23:18:49.284771 8651103744 Options.max_subcompactions: 1 +2023/08/15-23:18:49.284772 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/15-23:18:49.284773 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/15-23:18:49.284774 8651103744 Options.delayed_write_rate : 16777216 +2023/08/15-23:18:49.284775 8651103744 Options.max_total_wal_size: 0 +2023/08/15-23:18:49.284776 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/15-23:18:49.284777 8651103744 Options.stats_dump_period_sec: 600 +2023/08/15-23:18:49.284778 8651103744 Options.stats_persist_period_sec: 600 +2023/08/15-23:18:49.284779 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/15-23:18:49.284780 8651103744 Options.max_open_files: -1 +2023/08/15-23:18:49.284781 8651103744 Options.bytes_per_sync: 0 +2023/08/15-23:18:49.284782 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/15-23:18:49.284783 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/15-23:18:49.284784 8651103744 Options.compaction_readahead_size: 0 +2023/08/15-23:18:49.284785 8651103744 Options.max_background_flushes: -1 +2023/08/15-23:18:49.284786 8651103744 Compression algorithms supported: +2023/08/15-23:18:49.284811 8651103744 kZSTD supported: 1 +2023/08/15-23:18:49.284812 8651103744 kZlibCompression supported: 1 +2023/08/15-23:18:49.284813 8651103744 kXpressCompression supported: 0 +2023/08/15-23:18:49.284814 8651103744 kSnappyCompression supported: 1 +2023/08/15-23:18:49.284815 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/15-23:18:49.284816 8651103744 kLZ4HCCompression supported: 1 +2023/08/15-23:18:49.284817 8651103744 kLZ4Compression supported: 1 +2023/08/15-23:18:49.284818 8651103744 kBZip2Compression supported: 1 +2023/08/15-23:18:49.284831 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/15-23:18:49.284832 8651103744 DMutex implementation: pthread_mutex_t +2023/08/15-23:18:49.285033 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000009 +2023/08/15-23:18:49.285149 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/15-23:18:49.285151 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/15-23:18:49.285152 8651103744 Options.merge_operator: None +2023/08/15-23:18:49.285153 8651103744 Options.compaction_filter: None +2023/08/15-23:18:49.285154 8651103744 Options.compaction_filter_factory: None +2023/08/15-23:18:49.285155 8651103744 Options.sst_partitioner_factory: None +2023/08/15-23:18:49.285156 8651103744 Options.memtable_factory: SkipListFactory +2023/08/15-23:18:49.285157 8651103744 Options.table_factory: BlockBasedTable +2023/08/15-23:18:49.285208 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x6000019bee60) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x600002cbc0d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/15-23:18:49.285216 8651103744 Options.write_buffer_size: 67108864 +2023/08/15-23:18:49.285217 8651103744 Options.max_write_buffer_number: 2 +2023/08/15-23:18:49.285218 8651103744 Options.compression: Snappy +2023/08/15-23:18:49.285219 8651103744 Options.bottommost_compression: Disabled +2023/08/15-23:18:49.285220 8651103744 Options.prefix_extractor: nullptr +2023/08/15-23:18:49.285221 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/15-23:18:49.285222 8651103744 Options.num_levels: 7 +2023/08/15-23:18:49.285223 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/15-23:18:49.285224 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/15-23:18:49.285225 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/15-23:18:49.285226 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/15-23:18:49.285227 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/15-23:18:49.285228 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/15-23:18:49.285229 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/15-23:18:49.285230 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/15-23:18:49.285231 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/15-23:18:49.285234 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/15-23:18:49.285235 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/15-23:18:49.285236 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/15-23:18:49.285237 8651103744 Options.compression_opts.window_bits: -14 +2023/08/15-23:18:49.285238 8651103744 Options.compression_opts.level: 32767 +2023/08/15-23:18:49.285239 8651103744 Options.compression_opts.strategy: 0 +2023/08/15-23:18:49.285240 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/15-23:18:49.285241 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/15-23:18:49.285242 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/15-23:18:49.285243 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/15-23:18:49.285244 8651103744 Options.compression_opts.enabled: false +2023/08/15-23:18:49.285245 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/15-23:18:49.285246 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/15-23:18:49.285247 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/15-23:18:49.285248 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/15-23:18:49.285249 8651103744 Options.target_file_size_base: 67108864 +2023/08/15-23:18:49.285250 8651103744 Options.target_file_size_multiplier: 1 +2023/08/15-23:18:49.285251 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/15-23:18:49.285252 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/15-23:18:49.285253 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/15-23:18:49.285254 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/15-23:18:49.285256 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/15-23:18:49.285257 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/15-23:18:49.285258 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/15-23:18:49.285259 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/15-23:18:49.285260 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/15-23:18:49.285261 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/15-23:18:49.285262 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/15-23:18:49.285263 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/15-23:18:49.285264 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/15-23:18:49.285265 8651103744 Options.arena_block_size: 1048576 +2023/08/15-23:18:49.285266 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/15-23:18:49.285267 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/15-23:18:49.285268 8651103744 Options.disable_auto_compactions: 0 +2023/08/15-23:18:49.285272 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/15-23:18:49.285273 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/15-23:18:49.285274 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/15-23:18:49.285275 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/15-23:18:49.285276 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/15-23:18:49.285277 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/15-23:18:49.285278 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/15-23:18:49.285281 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/15-23:18:49.285282 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/15-23:18:49.285283 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/15-23:18:49.285285 8651103744 Options.table_properties_collectors: +2023/08/15-23:18:49.285286 8651103744 Options.inplace_update_support: 0 +2023/08/15-23:18:49.285287 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/15-23:18:49.285288 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/15-23:18:49.285289 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/15-23:18:49.285290 8651103744 Options.memtable_huge_page_size: 0 +2023/08/15-23:18:49.285291 8651103744 Options.bloom_locality: 0 +2023/08/15-23:18:49.285292 8651103744 Options.max_successive_merges: 0 +2023/08/15-23:18:49.285293 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/15-23:18:49.285294 8651103744 Options.paranoid_file_checks: 0 +2023/08/15-23:18:49.285295 8651103744 Options.force_consistency_checks: 1 +2023/08/15-23:18:49.285296 8651103744 Options.report_bg_io_stats: 0 +2023/08/15-23:18:49.285297 8651103744 Options.ttl: 2592000 +2023/08/15-23:18:49.285298 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/15-23:18:49.285302 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/15-23:18:49.285303 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/15-23:18:49.285304 8651103744 Options.enable_blob_files: false +2023/08/15-23:18:49.285305 8651103744 Options.min_blob_size: 0 +2023/08/15-23:18:49.285306 8651103744 Options.blob_file_size: 268435456 +2023/08/15-23:18:49.285307 8651103744 Options.blob_compression_type: NoCompression +2023/08/15-23:18:49.285308 8651103744 Options.enable_blob_garbage_collection: false +2023/08/15-23:18:49.285309 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/15-23:18:49.285310 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/15-23:18:49.285311 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/15-23:18:49.285312 8651103744 Options.blob_file_starting_level: 0 +2023/08/15-23:18:49.285313 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/15-23:18:49.285798 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000009 succeeded,manifest_file_number is 9, next_file_number is 11, last_sequence is 0, log_number is 5,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 0 +2023/08/15-23:18:49.285802 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 5 +2023/08/15-23:18:49.285865 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/15-23:18:49.286000 8651103744 EVENT_LOG_v1 {"time_micros": 1692109129285995, "job": 1, "event": "recovery_started", "wal_files": [4, 8]} +2023/08/15-23:18:49.286003 8651103744 [db/db_impl/db_impl_open.cc:1018] Skipping log #4 since it is older than min log to keep #5 +2023/08/15-23:18:49.286004 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #8 mode 2 +2023/08/15-23:18:49.286064 8651103744 EVENT_LOG_v1 {"time_micros": 1692109129286062, "job": 1, "event": "recovery_finished"} +2023/08/15-23:18:49.286139 8651103744 [db/version_set.cc:5180] Creating manifest 13 +2023/08/15-23:18:49.287463 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x153f06110 +2023/08/15-23:18:49.287482 8651103744 DB pointer 0x15480c800 +2023/08/15-23:18:49.287636 6165164032 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/15-23:18:49.287677 6165164032 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + Sum 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x600002cbc0d8#74352 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 1.7e-05 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** +2023/08/15-23:18:52.075564 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work +2023/08/15-23:18:52.076208 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692109595356629 b/rust/hyperlane_db/LOG.old.1692109595356629 new file mode 100644 index 0000000000..1ab16611b1 --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692109595356629 @@ -0,0 +1,291 @@ +2023/08/15-23:19:02.544177 8651103744 RocksDB version: 8.1.1 +2023/08/15-23:19:02.544755 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/15-23:19:02.544757 8651103744 DB SUMMARY +2023/08/15-23:19:02.544759 8651103744 DB Session ID: IW86BX2GE3YHQWXXJ3BJ +2023/08/15-23:19:02.544871 8651103744 CURRENT file: CURRENT +2023/08/15-23:19:02.544873 8651103744 IDENTITY file: IDENTITY +2023/08/15-23:19:02.544883 8651103744 MANIFEST file: MANIFEST-000013 size: 81 Bytes +2023/08/15-23:19:02.544885 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 0, files: +2023/08/15-23:19:02.544901 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000004.log size: 0 ; 000008.log size: 0 ; 000012.log size: 65 ; +2023/08/15-23:19:02.544902 8651103744 Options.error_if_exists: 0 +2023/08/15-23:19:02.544903 8651103744 Options.create_if_missing: 1 +2023/08/15-23:19:02.544904 8651103744 Options.paranoid_checks: 1 +2023/08/15-23:19:02.544905 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/15-23:19:02.544906 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/15-23:19:02.544906 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/15-23:19:02.544907 8651103744 Options.env: 0x1026d7828 +2023/08/15-23:19:02.544908 8651103744 Options.fs: PosixFileSystem +2023/08/15-23:19:02.544909 8651103744 Options.info_log: 0x144705fb8 +2023/08/15-23:19:02.544910 8651103744 Options.max_file_opening_threads: 16 +2023/08/15-23:19:02.544910 8651103744 Options.statistics: 0x0 +2023/08/15-23:19:02.544911 8651103744 Options.use_fsync: 0 +2023/08/15-23:19:02.544912 8651103744 Options.max_log_file_size: 0 +2023/08/15-23:19:02.544913 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/15-23:19:02.544913 8651103744 Options.log_file_time_to_roll: 0 +2023/08/15-23:19:02.544914 8651103744 Options.keep_log_file_num: 1000 +2023/08/15-23:19:02.544915 8651103744 Options.recycle_log_file_num: 0 +2023/08/15-23:19:02.544915 8651103744 Options.allow_fallocate: 1 +2023/08/15-23:19:02.544916 8651103744 Options.allow_mmap_reads: 0 +2023/08/15-23:19:02.544917 8651103744 Options.allow_mmap_writes: 0 +2023/08/15-23:19:02.544918 8651103744 Options.use_direct_reads: 0 +2023/08/15-23:19:02.544918 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/15-23:19:02.544919 8651103744 Options.create_missing_column_families: 0 +2023/08/15-23:19:02.544920 8651103744 Options.db_log_dir: +2023/08/15-23:19:02.544920 8651103744 Options.wal_dir: +2023/08/15-23:19:02.544921 8651103744 Options.table_cache_numshardbits: 6 +2023/08/15-23:19:02.544922 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/15-23:19:02.544922 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/15-23:19:02.544923 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/15-23:19:02.544924 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/15-23:19:02.544925 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/15-23:19:02.544925 8651103744 Options.advise_random_on_open: 1 +2023/08/15-23:19:02.544926 8651103744 Options.db_write_buffer_size: 0 +2023/08/15-23:19:02.544927 8651103744 Options.write_buffer_manager: 0x600003094820 +2023/08/15-23:19:02.544927 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/15-23:19:02.544928 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/15-23:19:02.544929 8651103744 Options.use_adaptive_mutex: 0 +2023/08/15-23:19:02.544929 8651103744 Options.rate_limiter: 0x0 +2023/08/15-23:19:02.544930 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/15-23:19:02.544931 8651103744 Options.wal_recovery_mode: 2 +2023/08/15-23:19:02.544932 8651103744 Options.enable_thread_tracking: 0 +2023/08/15-23:19:02.544932 8651103744 Options.enable_pipelined_write: 0 +2023/08/15-23:19:02.544933 8651103744 Options.unordered_write: 0 +2023/08/15-23:19:02.544934 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/15-23:19:02.544934 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/15-23:19:02.544935 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/15-23:19:02.544936 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/15-23:19:02.544936 8651103744 Options.row_cache: None +2023/08/15-23:19:02.544937 8651103744 Options.wal_filter: None +2023/08/15-23:19:02.544938 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/15-23:19:02.544938 8651103744 Options.allow_ingest_behind: 0 +2023/08/15-23:19:02.544939 8651103744 Options.two_write_queues: 0 +2023/08/15-23:19:02.544940 8651103744 Options.manual_wal_flush: 0 +2023/08/15-23:19:02.544940 8651103744 Options.wal_compression: 0 +2023/08/15-23:19:02.544941 8651103744 Options.atomic_flush: 0 +2023/08/15-23:19:02.544942 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/15-23:19:02.544942 8651103744 Options.persist_stats_to_disk: 0 +2023/08/15-23:19:02.544943 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/15-23:19:02.544944 8651103744 Options.log_readahead_size: 0 +2023/08/15-23:19:02.544944 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/15-23:19:02.544945 8651103744 Options.best_efforts_recovery: 0 +2023/08/15-23:19:02.544946 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/15-23:19:02.544947 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/15-23:19:02.544947 8651103744 Options.allow_data_in_errors: 0 +2023/08/15-23:19:02.544948 8651103744 Options.db_host_id: __hostname__ +2023/08/15-23:19:02.544949 8651103744 Options.enforce_single_del_contracts: true +2023/08/15-23:19:02.544949 8651103744 Options.max_background_jobs: 2 +2023/08/15-23:19:02.544950 8651103744 Options.max_background_compactions: -1 +2023/08/15-23:19:02.544951 8651103744 Options.max_subcompactions: 1 +2023/08/15-23:19:02.544952 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/15-23:19:02.544952 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/15-23:19:02.544953 8651103744 Options.delayed_write_rate : 16777216 +2023/08/15-23:19:02.544954 8651103744 Options.max_total_wal_size: 0 +2023/08/15-23:19:02.544954 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/15-23:19:02.544955 8651103744 Options.stats_dump_period_sec: 600 +2023/08/15-23:19:02.544956 8651103744 Options.stats_persist_period_sec: 600 +2023/08/15-23:19:02.544957 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/15-23:19:02.544957 8651103744 Options.max_open_files: -1 +2023/08/15-23:19:02.544958 8651103744 Options.bytes_per_sync: 0 +2023/08/15-23:19:02.544959 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/15-23:19:02.544959 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/15-23:19:02.544960 8651103744 Options.compaction_readahead_size: 0 +2023/08/15-23:19:02.544961 8651103744 Options.max_background_flushes: -1 +2023/08/15-23:19:02.544961 8651103744 Compression algorithms supported: +2023/08/15-23:19:02.544979 8651103744 kZSTD supported: 1 +2023/08/15-23:19:02.544980 8651103744 kZlibCompression supported: 1 +2023/08/15-23:19:02.544981 8651103744 kXpressCompression supported: 0 +2023/08/15-23:19:02.544981 8651103744 kSnappyCompression supported: 1 +2023/08/15-23:19:02.544982 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/15-23:19:02.544983 8651103744 kLZ4HCCompression supported: 1 +2023/08/15-23:19:02.544983 8651103744 kLZ4Compression supported: 1 +2023/08/15-23:19:02.544984 8651103744 kBZip2Compression supported: 1 +2023/08/15-23:19:02.544992 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/15-23:19:02.544993 8651103744 DMutex implementation: pthread_mutex_t +2023/08/15-23:19:02.545156 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000013 +2023/08/15-23:19:02.545260 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/15-23:19:02.545262 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/15-23:19:02.545263 8651103744 Options.merge_operator: None +2023/08/15-23:19:02.545264 8651103744 Options.compaction_filter: None +2023/08/15-23:19:02.545264 8651103744 Options.compaction_filter_factory: None +2023/08/15-23:19:02.545265 8651103744 Options.sst_partitioner_factory: None +2023/08/15-23:19:02.545266 8651103744 Options.memtable_factory: SkipListFactory +2023/08/15-23:19:02.545266 8651103744 Options.table_factory: BlockBasedTable +2023/08/15-23:19:02.545294 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600000b97260) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x600003e940d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/15-23:19:02.545297 8651103744 Options.write_buffer_size: 67108864 +2023/08/15-23:19:02.545298 8651103744 Options.max_write_buffer_number: 2 +2023/08/15-23:19:02.545299 8651103744 Options.compression: Snappy +2023/08/15-23:19:02.545299 8651103744 Options.bottommost_compression: Disabled +2023/08/15-23:19:02.545300 8651103744 Options.prefix_extractor: nullptr +2023/08/15-23:19:02.545301 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/15-23:19:02.545302 8651103744 Options.num_levels: 7 +2023/08/15-23:19:02.545302 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/15-23:19:02.545303 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/15-23:19:02.545304 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/15-23:19:02.545304 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/15-23:19:02.545305 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/15-23:19:02.545306 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/15-23:19:02.545307 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/15-23:19:02.545307 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/15-23:19:02.545308 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/15-23:19:02.545309 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/15-23:19:02.545310 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/15-23:19:02.545310 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/15-23:19:02.545311 8651103744 Options.compression_opts.window_bits: -14 +2023/08/15-23:19:02.545312 8651103744 Options.compression_opts.level: 32767 +2023/08/15-23:19:02.545313 8651103744 Options.compression_opts.strategy: 0 +2023/08/15-23:19:02.545313 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/15-23:19:02.545314 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/15-23:19:02.545315 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/15-23:19:02.545315 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/15-23:19:02.545316 8651103744 Options.compression_opts.enabled: false +2023/08/15-23:19:02.545317 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/15-23:19:02.545318 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/15-23:19:02.545318 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/15-23:19:02.545319 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/15-23:19:02.545320 8651103744 Options.target_file_size_base: 67108864 +2023/08/15-23:19:02.545320 8651103744 Options.target_file_size_multiplier: 1 +2023/08/15-23:19:02.545321 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/15-23:19:02.545322 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/15-23:19:02.545322 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/15-23:19:02.545323 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/15-23:19:02.545324 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/15-23:19:02.545325 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/15-23:19:02.545326 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/15-23:19:02.545326 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/15-23:19:02.545327 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/15-23:19:02.545328 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/15-23:19:02.545329 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/15-23:19:02.545329 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/15-23:19:02.545330 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/15-23:19:02.545331 8651103744 Options.arena_block_size: 1048576 +2023/08/15-23:19:02.545331 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/15-23:19:02.545332 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/15-23:19:02.545333 8651103744 Options.disable_auto_compactions: 0 +2023/08/15-23:19:02.545334 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/15-23:19:02.545334 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/15-23:19:02.545335 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/15-23:19:02.545336 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/15-23:19:02.545336 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/15-23:19:02.545342 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/15-23:19:02.545343 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/15-23:19:02.545345 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/15-23:19:02.545346 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/15-23:19:02.545347 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/15-23:19:02.545348 8651103744 Options.table_properties_collectors: +2023/08/15-23:19:02.545349 8651103744 Options.inplace_update_support: 0 +2023/08/15-23:19:02.545350 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/15-23:19:02.545351 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/15-23:19:02.545351 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/15-23:19:02.545352 8651103744 Options.memtable_huge_page_size: 0 +2023/08/15-23:19:02.545353 8651103744 Options.bloom_locality: 0 +2023/08/15-23:19:02.545354 8651103744 Options.max_successive_merges: 0 +2023/08/15-23:19:02.545354 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/15-23:19:02.545355 8651103744 Options.paranoid_file_checks: 0 +2023/08/15-23:19:02.545359 8651103744 Options.force_consistency_checks: 1 +2023/08/15-23:19:02.545360 8651103744 Options.report_bg_io_stats: 0 +2023/08/15-23:19:02.545360 8651103744 Options.ttl: 2592000 +2023/08/15-23:19:02.545361 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/15-23:19:02.545362 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/15-23:19:02.545362 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/15-23:19:02.545363 8651103744 Options.enable_blob_files: false +2023/08/15-23:19:02.545364 8651103744 Options.min_blob_size: 0 +2023/08/15-23:19:02.545364 8651103744 Options.blob_file_size: 268435456 +2023/08/15-23:19:02.545365 8651103744 Options.blob_compression_type: NoCompression +2023/08/15-23:19:02.545366 8651103744 Options.enable_blob_garbage_collection: false +2023/08/15-23:19:02.545367 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/15-23:19:02.545367 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/15-23:19:02.545368 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/15-23:19:02.545369 8651103744 Options.blob_file_starting_level: 0 +2023/08/15-23:19:02.545370 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/15-23:19:02.545882 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000013 succeeded,manifest_file_number is 13, next_file_number is 15, last_sequence is 0, log_number is 9,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 0 +2023/08/15-23:19:02.545887 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 9 +2023/08/15-23:19:02.545938 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/15-23:19:02.546055 8651103744 EVENT_LOG_v1 {"time_micros": 1692109142546050, "job": 1, "event": "recovery_started", "wal_files": [4, 8, 12]} +2023/08/15-23:19:02.546057 8651103744 [db/db_impl/db_impl_open.cc:1018] Skipping log #4 since it is older than min log to keep #9 +2023/08/15-23:19:02.546058 8651103744 [db/db_impl/db_impl_open.cc:1018] Skipping log #8 since it is older than min log to keep #9 +2023/08/15-23:19:02.546059 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #12 mode 2 +2023/08/15-23:19:02.546589 8651103744 EVENT_LOG_v1 {"time_micros": 1692109142546573, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 16, "file_size": 1067, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 1, "largest_seqno": 1, "table_properties": {"data_size": 67, "index_size": 56, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 47, "raw_average_key_size": 47, "raw_value_size": 4, "raw_average_value_size": 4, "num_data_blocks": 1, "num_entries": 1, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692109142, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "IW86BX2GE3YHQWXXJ3BJ", "orig_file_number": 16, "seqno_to_time_mapping": "N/A"}} +2023/08/15-23:19:02.546660 8651103744 EVENT_LOG_v1 {"time_micros": 1692109142546659, "job": 1, "event": "recovery_finished"} +2023/08/15-23:19:02.546703 8651103744 [db/version_set.cc:5180] Creating manifest 18 +2023/08/15-23:19:02.547923 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000012.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/15-23:19:02.547952 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000008.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/15-23:19:02.547973 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000004.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/15-23:19:02.547994 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x144706110 +2023/08/15-23:19:02.548018 8651103744 DB pointer 0x14500c200 +2023/08/15-23:19:02.548146 6169194496 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/15-23:19:02.548149 6169194496 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 1/0 1.04 KB 0.2 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 1.9 0.00 0.00 1 0.001 0 0 0.0 0.0 + Sum 1/0 1.04 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 1.9 0.00 0.00 1 0.001 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 1.9 0.00 0.00 1 0.001 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.9 0.00 0.00 1 0.001 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 0.35 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 0.35 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x600003e940d8#74368 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 8e-06 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** +2023/08/15-23:19:06.429507 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work +2023/08/15-23:19:06.430657 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692110322000479 b/rust/hyperlane_db/LOG.old.1692110322000479 new file mode 100644 index 0000000000..015602e4e3 --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692110322000479 @@ -0,0 +1,287 @@ +2023/08/15-23:26:35.356979 8651103744 RocksDB version: 8.1.1 +2023/08/15-23:26:35.357507 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/15-23:26:35.357508 8651103744 DB SUMMARY +2023/08/15-23:26:35.357509 8651103744 DB Session ID: BAHCL5GHS228YFHWI1MQ +2023/08/15-23:26:35.357567 8651103744 CURRENT file: CURRENT +2023/08/15-23:26:35.357568 8651103744 IDENTITY file: IDENTITY +2023/08/15-23:26:35.357577 8651103744 MANIFEST file: MANIFEST-000018 size: 242 Bytes +2023/08/15-23:26:35.357578 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 1, files: 000016.sst +2023/08/15-23:26:35.357579 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000017.log size: 10883 ; +2023/08/15-23:26:35.357581 8651103744 Options.error_if_exists: 0 +2023/08/15-23:26:35.357581 8651103744 Options.create_if_missing: 1 +2023/08/15-23:26:35.357582 8651103744 Options.paranoid_checks: 1 +2023/08/15-23:26:35.357583 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/15-23:26:35.357583 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/15-23:26:35.357584 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/15-23:26:35.357584 8651103744 Options.env: 0x102a23828 +2023/08/15-23:26:35.357585 8651103744 Options.fs: PosixFileSystem +2023/08/15-23:26:35.357586 8651103744 Options.info_log: 0x136605fb8 +2023/08/15-23:26:35.357587 8651103744 Options.max_file_opening_threads: 16 +2023/08/15-23:26:35.357587 8651103744 Options.statistics: 0x0 +2023/08/15-23:26:35.357588 8651103744 Options.use_fsync: 0 +2023/08/15-23:26:35.357589 8651103744 Options.max_log_file_size: 0 +2023/08/15-23:26:35.357589 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/15-23:26:35.357590 8651103744 Options.log_file_time_to_roll: 0 +2023/08/15-23:26:35.357590 8651103744 Options.keep_log_file_num: 1000 +2023/08/15-23:26:35.357591 8651103744 Options.recycle_log_file_num: 0 +2023/08/15-23:26:35.357591 8651103744 Options.allow_fallocate: 1 +2023/08/15-23:26:35.357592 8651103744 Options.allow_mmap_reads: 0 +2023/08/15-23:26:35.357592 8651103744 Options.allow_mmap_writes: 0 +2023/08/15-23:26:35.357593 8651103744 Options.use_direct_reads: 0 +2023/08/15-23:26:35.357594 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/15-23:26:35.357594 8651103744 Options.create_missing_column_families: 0 +2023/08/15-23:26:35.357595 8651103744 Options.db_log_dir: +2023/08/15-23:26:35.357595 8651103744 Options.wal_dir: +2023/08/15-23:26:35.357596 8651103744 Options.table_cache_numshardbits: 6 +2023/08/15-23:26:35.357596 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/15-23:26:35.357597 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/15-23:26:35.357597 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/15-23:26:35.357598 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/15-23:26:35.357599 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/15-23:26:35.357599 8651103744 Options.advise_random_on_open: 1 +2023/08/15-23:26:35.357600 8651103744 Options.db_write_buffer_size: 0 +2023/08/15-23:26:35.357600 8651103744 Options.write_buffer_manager: 0x600002f04820 +2023/08/15-23:26:35.357601 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/15-23:26:35.357601 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/15-23:26:35.357602 8651103744 Options.use_adaptive_mutex: 0 +2023/08/15-23:26:35.357603 8651103744 Options.rate_limiter: 0x0 +2023/08/15-23:26:35.357603 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/15-23:26:35.357604 8651103744 Options.wal_recovery_mode: 2 +2023/08/15-23:26:35.357605 8651103744 Options.enable_thread_tracking: 0 +2023/08/15-23:26:35.357605 8651103744 Options.enable_pipelined_write: 0 +2023/08/15-23:26:35.357606 8651103744 Options.unordered_write: 0 +2023/08/15-23:26:35.357606 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/15-23:26:35.357607 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/15-23:26:35.357607 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/15-23:26:35.357608 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/15-23:26:35.357608 8651103744 Options.row_cache: None +2023/08/15-23:26:35.357609 8651103744 Options.wal_filter: None +2023/08/15-23:26:35.357622 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/15-23:26:35.357623 8651103744 Options.allow_ingest_behind: 0 +2023/08/15-23:26:35.357640 8651103744 Options.two_write_queues: 0 +2023/08/15-23:26:35.357645 8651103744 Options.manual_wal_flush: 0 +2023/08/15-23:26:35.357645 8651103744 Options.wal_compression: 0 +2023/08/15-23:26:35.357646 8651103744 Options.atomic_flush: 0 +2023/08/15-23:26:35.357647 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/15-23:26:35.357647 8651103744 Options.persist_stats_to_disk: 0 +2023/08/15-23:26:35.357648 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/15-23:26:35.357648 8651103744 Options.log_readahead_size: 0 +2023/08/15-23:26:35.357649 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/15-23:26:35.357650 8651103744 Options.best_efforts_recovery: 0 +2023/08/15-23:26:35.357650 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/15-23:26:35.357651 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/15-23:26:35.357652 8651103744 Options.allow_data_in_errors: 0 +2023/08/15-23:26:35.357652 8651103744 Options.db_host_id: __hostname__ +2023/08/15-23:26:35.357653 8651103744 Options.enforce_single_del_contracts: true +2023/08/15-23:26:35.357654 8651103744 Options.max_background_jobs: 2 +2023/08/15-23:26:35.357654 8651103744 Options.max_background_compactions: -1 +2023/08/15-23:26:35.357655 8651103744 Options.max_subcompactions: 1 +2023/08/15-23:26:35.357655 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/15-23:26:35.357656 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/15-23:26:35.357656 8651103744 Options.delayed_write_rate : 16777216 +2023/08/15-23:26:35.357657 8651103744 Options.max_total_wal_size: 0 +2023/08/15-23:26:35.357658 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/15-23:26:35.357658 8651103744 Options.stats_dump_period_sec: 600 +2023/08/15-23:26:35.357659 8651103744 Options.stats_persist_period_sec: 600 +2023/08/15-23:26:35.357659 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/15-23:26:35.357660 8651103744 Options.max_open_files: -1 +2023/08/15-23:26:35.357660 8651103744 Options.bytes_per_sync: 0 +2023/08/15-23:26:35.357661 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/15-23:26:35.357661 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/15-23:26:35.357662 8651103744 Options.compaction_readahead_size: 0 +2023/08/15-23:26:35.357663 8651103744 Options.max_background_flushes: -1 +2023/08/15-23:26:35.357663 8651103744 Compression algorithms supported: +2023/08/15-23:26:35.357680 8651103744 kZSTD supported: 1 +2023/08/15-23:26:35.357681 8651103744 kZlibCompression supported: 1 +2023/08/15-23:26:35.357682 8651103744 kXpressCompression supported: 0 +2023/08/15-23:26:35.357682 8651103744 kSnappyCompression supported: 1 +2023/08/15-23:26:35.357683 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/15-23:26:35.357683 8651103744 kLZ4HCCompression supported: 1 +2023/08/15-23:26:35.357684 8651103744 kLZ4Compression supported: 1 +2023/08/15-23:26:35.357684 8651103744 kBZip2Compression supported: 1 +2023/08/15-23:26:35.357694 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/15-23:26:35.357694 8651103744 DMutex implementation: pthread_mutex_t +2023/08/15-23:26:35.358060 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000018 +2023/08/15-23:26:35.358154 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/15-23:26:35.358155 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/15-23:26:35.358156 8651103744 Options.merge_operator: None +2023/08/15-23:26:35.358156 8651103744 Options.compaction_filter: None +2023/08/15-23:26:35.358157 8651103744 Options.compaction_filter_factory: None +2023/08/15-23:26:35.358158 8651103744 Options.sst_partitioner_factory: None +2023/08/15-23:26:35.358158 8651103744 Options.memtable_factory: SkipListFactory +2023/08/15-23:26:35.358161 8651103744 Options.table_factory: BlockBasedTable +2023/08/15-23:26:35.358172 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x60000141fd20) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000021000d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/15-23:26:35.358180 8651103744 Options.write_buffer_size: 67108864 +2023/08/15-23:26:35.358180 8651103744 Options.max_write_buffer_number: 2 +2023/08/15-23:26:35.358181 8651103744 Options.compression: Snappy +2023/08/15-23:26:35.358182 8651103744 Options.bottommost_compression: Disabled +2023/08/15-23:26:35.358182 8651103744 Options.prefix_extractor: nullptr +2023/08/15-23:26:35.358183 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/15-23:26:35.358183 8651103744 Options.num_levels: 7 +2023/08/15-23:26:35.358184 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/15-23:26:35.358185 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/15-23:26:35.358185 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/15-23:26:35.358186 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/15-23:26:35.358186 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/15-23:26:35.358187 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/15-23:26:35.358187 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/15-23:26:35.358188 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/15-23:26:35.358189 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/15-23:26:35.358189 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/15-23:26:35.358190 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/15-23:26:35.358190 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/15-23:26:35.358191 8651103744 Options.compression_opts.window_bits: -14 +2023/08/15-23:26:35.358191 8651103744 Options.compression_opts.level: 32767 +2023/08/15-23:26:35.358192 8651103744 Options.compression_opts.strategy: 0 +2023/08/15-23:26:35.358192 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/15-23:26:35.358193 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/15-23:26:35.358194 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/15-23:26:35.358194 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/15-23:26:35.358195 8651103744 Options.compression_opts.enabled: false +2023/08/15-23:26:35.358195 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/15-23:26:35.358196 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/15-23:26:35.358196 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/15-23:26:35.358197 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/15-23:26:35.358197 8651103744 Options.target_file_size_base: 67108864 +2023/08/15-23:26:35.358198 8651103744 Options.target_file_size_multiplier: 1 +2023/08/15-23:26:35.358199 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/15-23:26:35.358199 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/15-23:26:35.358200 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/15-23:26:35.358200 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/15-23:26:35.358201 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/15-23:26:35.358202 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/15-23:26:35.358202 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/15-23:26:35.358203 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/15-23:26:35.358203 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/15-23:26:35.358204 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/15-23:26:35.358204 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/15-23:26:35.358205 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/15-23:26:35.358206 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/15-23:26:35.358206 8651103744 Options.arena_block_size: 1048576 +2023/08/15-23:26:35.358207 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/15-23:26:35.358207 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/15-23:26:35.358208 8651103744 Options.disable_auto_compactions: 0 +2023/08/15-23:26:35.358209 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/15-23:26:35.358209 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/15-23:26:35.358210 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/15-23:26:35.358210 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/15-23:26:35.358211 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/15-23:26:35.358212 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/15-23:26:35.358212 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/15-23:26:35.358214 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/15-23:26:35.358215 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/15-23:26:35.358215 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/15-23:26:35.358216 8651103744 Options.table_properties_collectors: +2023/08/15-23:26:35.358217 8651103744 Options.inplace_update_support: 0 +2023/08/15-23:26:35.358217 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/15-23:26:35.358218 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/15-23:26:35.358219 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/15-23:26:35.358219 8651103744 Options.memtable_huge_page_size: 0 +2023/08/15-23:26:35.358220 8651103744 Options.bloom_locality: 0 +2023/08/15-23:26:35.358220 8651103744 Options.max_successive_merges: 0 +2023/08/15-23:26:35.358221 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/15-23:26:35.358221 8651103744 Options.paranoid_file_checks: 0 +2023/08/15-23:26:35.358222 8651103744 Options.force_consistency_checks: 1 +2023/08/15-23:26:35.358222 8651103744 Options.report_bg_io_stats: 0 +2023/08/15-23:26:35.358223 8651103744 Options.ttl: 2592000 +2023/08/15-23:26:35.358223 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/15-23:26:35.358224 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/15-23:26:35.358225 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/15-23:26:35.358225 8651103744 Options.enable_blob_files: false +2023/08/15-23:26:35.358226 8651103744 Options.min_blob_size: 0 +2023/08/15-23:26:35.358226 8651103744 Options.blob_file_size: 268435456 +2023/08/15-23:26:35.358227 8651103744 Options.blob_compression_type: NoCompression +2023/08/15-23:26:35.358227 8651103744 Options.enable_blob_garbage_collection: false +2023/08/15-23:26:35.358228 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/15-23:26:35.358229 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/15-23:26:35.358229 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/15-23:26:35.358230 8651103744 Options.blob_file_starting_level: 0 +2023/08/15-23:26:35.358230 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/15-23:26:35.358976 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000018 succeeded,manifest_file_number is 18, next_file_number is 20, last_sequence is 1, log_number is 13,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 13 +2023/08/15-23:26:35.358979 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 13 +2023/08/15-23:26:35.359178 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/15-23:26:35.359250 8651103744 EVENT_LOG_v1 {"time_micros": 1692109595359246, "job": 1, "event": "recovery_started", "wal_files": [17]} +2023/08/15-23:26:35.359252 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #17 mode 2 +2023/08/15-23:26:35.359728 8651103744 EVENT_LOG_v1 {"time_micros": 1692109595359715, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 21, "file_size": 3901, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 4, "largest_seqno": 59, "table_properties": {"data_size": 2850, "index_size": 123, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 2495, "raw_average_key_size": 45, "raw_value_size": 7408, "raw_average_value_size": 134, "num_data_blocks": 3, "num_entries": 55, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692109595, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "BAHCL5GHS228YFHWI1MQ", "orig_file_number": 21, "seqno_to_time_mapping": "N/A"}} +2023/08/15-23:26:35.359785 8651103744 EVENT_LOG_v1 {"time_micros": 1692109595359784, "job": 1, "event": "recovery_finished"} +2023/08/15-23:26:35.359823 8651103744 [db/version_set.cc:5180] Creating manifest 23 +2023/08/15-23:26:35.360828 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000017.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/15-23:26:35.360848 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x136606110 +2023/08/15-23:26:35.360871 8651103744 DB pointer 0x13680c200 +2023/08/15-23:26:35.360984 6165753856 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/15-23:26:35.360986 6165753856 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 2/0 4.85 KB 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 11.9 0.00 0.00 1 0.000 0 0 0.0 0.0 + Sum 2/0 4.85 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 11.9 0.00 0.00 1 0.000 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 11.9 0.00 0.00 1 0.000 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.9 0.00 0.00 1 0.000 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 1.32 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 1.32 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000021000d8#74486 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 7e-06 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** +2023/08/15-23:26:47.356358 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work +2023/08/15-23:26:47.356886 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692110678116635 b/rust/hyperlane_db/LOG.old.1692110678116635 new file mode 100644 index 0000000000..f9c9b81a71 --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692110678116635 @@ -0,0 +1,284 @@ +2023/08/15-23:38:42.001287 8651103744 RocksDB version: 8.1.1 +2023/08/15-23:38:42.001872 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/15-23:38:42.001874 8651103744 DB SUMMARY +2023/08/15-23:38:42.001875 8651103744 DB Session ID: 3QO0U9RL58C1F7TEMW2X +2023/08/15-23:38:42.001970 8651103744 CURRENT file: CURRENT +2023/08/15-23:38:42.001971 8651103744 IDENTITY file: IDENTITY +2023/08/15-23:38:42.001982 8651103744 MANIFEST file: MANIFEST-000023 size: 412 Bytes +2023/08/15-23:38:42.001984 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 2, files: 000016.sst 000021.sst +2023/08/15-23:38:42.001985 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000022.log size: 0 ; +2023/08/15-23:38:42.001986 8651103744 Options.error_if_exists: 0 +2023/08/15-23:38:42.001987 8651103744 Options.create_if_missing: 1 +2023/08/15-23:38:42.001988 8651103744 Options.paranoid_checks: 1 +2023/08/15-23:38:42.001989 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/15-23:38:42.001989 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/15-23:38:42.001990 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/15-23:38:42.001991 8651103744 Options.env: 0x103233828 +2023/08/15-23:38:42.001992 8651103744 Options.fs: PosixFileSystem +2023/08/15-23:38:42.001992 8651103744 Options.info_log: 0x13a705fb8 +2023/08/15-23:38:42.001993 8651103744 Options.max_file_opening_threads: 16 +2023/08/15-23:38:42.001994 8651103744 Options.statistics: 0x0 +2023/08/15-23:38:42.001994 8651103744 Options.use_fsync: 0 +2023/08/15-23:38:42.001995 8651103744 Options.max_log_file_size: 0 +2023/08/15-23:38:42.001996 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/15-23:38:42.001996 8651103744 Options.log_file_time_to_roll: 0 +2023/08/15-23:38:42.001997 8651103744 Options.keep_log_file_num: 1000 +2023/08/15-23:38:42.001998 8651103744 Options.recycle_log_file_num: 0 +2023/08/15-23:38:42.001998 8651103744 Options.allow_fallocate: 1 +2023/08/15-23:38:42.001999 8651103744 Options.allow_mmap_reads: 0 +2023/08/15-23:38:42.002000 8651103744 Options.allow_mmap_writes: 0 +2023/08/15-23:38:42.002000 8651103744 Options.use_direct_reads: 0 +2023/08/15-23:38:42.002001 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/15-23:38:42.002001 8651103744 Options.create_missing_column_families: 0 +2023/08/15-23:38:42.002002 8651103744 Options.db_log_dir: +2023/08/15-23:38:42.002003 8651103744 Options.wal_dir: +2023/08/15-23:38:42.002003 8651103744 Options.table_cache_numshardbits: 6 +2023/08/15-23:38:42.002004 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/15-23:38:42.002005 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/15-23:38:42.002005 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/15-23:38:42.002006 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/15-23:38:42.002007 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/15-23:38:42.002007 8651103744 Options.advise_random_on_open: 1 +2023/08/15-23:38:42.002008 8651103744 Options.db_write_buffer_size: 0 +2023/08/15-23:38:42.002008 8651103744 Options.write_buffer_manager: 0x600000910820 +2023/08/15-23:38:42.002009 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/15-23:38:42.002010 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/15-23:38:42.002010 8651103744 Options.use_adaptive_mutex: 0 +2023/08/15-23:38:42.002011 8651103744 Options.rate_limiter: 0x0 +2023/08/15-23:38:42.002012 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/15-23:38:42.002013 8651103744 Options.wal_recovery_mode: 2 +2023/08/15-23:38:42.002013 8651103744 Options.enable_thread_tracking: 0 +2023/08/15-23:38:42.002014 8651103744 Options.enable_pipelined_write: 0 +2023/08/15-23:38:42.002014 8651103744 Options.unordered_write: 0 +2023/08/15-23:38:42.002015 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/15-23:38:42.002016 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/15-23:38:42.002016 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/15-23:38:42.002017 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/15-23:38:42.002018 8651103744 Options.row_cache: None +2023/08/15-23:38:42.002018 8651103744 Options.wal_filter: None +2023/08/15-23:38:42.002019 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/15-23:38:42.002020 8651103744 Options.allow_ingest_behind: 0 +2023/08/15-23:38:42.002020 8651103744 Options.two_write_queues: 0 +2023/08/15-23:38:42.002021 8651103744 Options.manual_wal_flush: 0 +2023/08/15-23:38:42.002021 8651103744 Options.wal_compression: 0 +2023/08/15-23:38:42.002022 8651103744 Options.atomic_flush: 0 +2023/08/15-23:38:42.002023 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/15-23:38:42.002023 8651103744 Options.persist_stats_to_disk: 0 +2023/08/15-23:38:42.002024 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/15-23:38:42.002025 8651103744 Options.log_readahead_size: 0 +2023/08/15-23:38:42.002025 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/15-23:38:42.002026 8651103744 Options.best_efforts_recovery: 0 +2023/08/15-23:38:42.002027 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/15-23:38:42.002028 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/15-23:38:42.002028 8651103744 Options.allow_data_in_errors: 0 +2023/08/15-23:38:42.002029 8651103744 Options.db_host_id: __hostname__ +2023/08/15-23:38:42.002030 8651103744 Options.enforce_single_del_contracts: true +2023/08/15-23:38:42.002030 8651103744 Options.max_background_jobs: 2 +2023/08/15-23:38:42.002031 8651103744 Options.max_background_compactions: -1 +2023/08/15-23:38:42.002032 8651103744 Options.max_subcompactions: 1 +2023/08/15-23:38:42.002032 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/15-23:38:42.002033 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/15-23:38:42.002034 8651103744 Options.delayed_write_rate : 16777216 +2023/08/15-23:38:42.002034 8651103744 Options.max_total_wal_size: 0 +2023/08/15-23:38:42.002035 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/15-23:38:42.002036 8651103744 Options.stats_dump_period_sec: 600 +2023/08/15-23:38:42.002036 8651103744 Options.stats_persist_period_sec: 600 +2023/08/15-23:38:42.002037 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/15-23:38:42.002038 8651103744 Options.max_open_files: -1 +2023/08/15-23:38:42.002038 8651103744 Options.bytes_per_sync: 0 +2023/08/15-23:38:42.002039 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/15-23:38:42.002039 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/15-23:38:42.002040 8651103744 Options.compaction_readahead_size: 0 +2023/08/15-23:38:42.002041 8651103744 Options.max_background_flushes: -1 +2023/08/15-23:38:42.002041 8651103744 Compression algorithms supported: +2023/08/15-23:38:42.002056 8651103744 kZSTD supported: 1 +2023/08/15-23:38:42.002057 8651103744 kZlibCompression supported: 1 +2023/08/15-23:38:42.002058 8651103744 kXpressCompression supported: 0 +2023/08/15-23:38:42.002058 8651103744 kSnappyCompression supported: 1 +2023/08/15-23:38:42.002059 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/15-23:38:42.002060 8651103744 kLZ4HCCompression supported: 1 +2023/08/15-23:38:42.002060 8651103744 kLZ4Compression supported: 1 +2023/08/15-23:38:42.002061 8651103744 kBZip2Compression supported: 1 +2023/08/15-23:38:42.002068 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/15-23:38:42.002069 8651103744 DMutex implementation: pthread_mutex_t +2023/08/15-23:38:42.002364 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000023 +2023/08/15-23:38:42.002450 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/15-23:38:42.002452 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/15-23:38:42.002453 8651103744 Options.merge_operator: None +2023/08/15-23:38:42.002454 8651103744 Options.compaction_filter: None +2023/08/15-23:38:42.002454 8651103744 Options.compaction_filter_factory: None +2023/08/15-23:38:42.002455 8651103744 Options.sst_partitioner_factory: None +2023/08/15-23:38:42.002456 8651103744 Options.memtable_factory: SkipListFactory +2023/08/15-23:38:42.002456 8651103744 Options.table_factory: BlockBasedTable +2023/08/15-23:38:42.002483 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x60000321c640) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000007100d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/15-23:38:42.002486 8651103744 Options.write_buffer_size: 67108864 +2023/08/15-23:38:42.002486 8651103744 Options.max_write_buffer_number: 2 +2023/08/15-23:38:42.002487 8651103744 Options.compression: Snappy +2023/08/15-23:38:42.002488 8651103744 Options.bottommost_compression: Disabled +2023/08/15-23:38:42.002488 8651103744 Options.prefix_extractor: nullptr +2023/08/15-23:38:42.002489 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/15-23:38:42.002490 8651103744 Options.num_levels: 7 +2023/08/15-23:38:42.002490 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/15-23:38:42.002491 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/15-23:38:42.002492 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/15-23:38:42.002492 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/15-23:38:42.002493 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/15-23:38:42.002494 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/15-23:38:42.002494 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/15-23:38:42.002495 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/15-23:38:42.002496 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/15-23:38:42.002496 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/15-23:38:42.002497 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/15-23:38:42.002497 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/15-23:38:42.002498 8651103744 Options.compression_opts.window_bits: -14 +2023/08/15-23:38:42.002499 8651103744 Options.compression_opts.level: 32767 +2023/08/15-23:38:42.002499 8651103744 Options.compression_opts.strategy: 0 +2023/08/15-23:38:42.002500 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/15-23:38:42.002500 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/15-23:38:42.002501 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/15-23:38:42.002502 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/15-23:38:42.002502 8651103744 Options.compression_opts.enabled: false +2023/08/15-23:38:42.002503 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/15-23:38:42.002504 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/15-23:38:42.002504 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/15-23:38:42.002505 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/15-23:38:42.002505 8651103744 Options.target_file_size_base: 67108864 +2023/08/15-23:38:42.002506 8651103744 Options.target_file_size_multiplier: 1 +2023/08/15-23:38:42.002507 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/15-23:38:42.002507 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/15-23:38:42.002508 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/15-23:38:42.002509 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/15-23:38:42.002509 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/15-23:38:42.002510 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/15-23:38:42.002510 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/15-23:38:42.002511 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/15-23:38:42.002512 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/15-23:38:42.002512 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/15-23:38:42.002513 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/15-23:38:42.002513 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/15-23:38:42.002514 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/15-23:38:42.002515 8651103744 Options.arena_block_size: 1048576 +2023/08/15-23:38:42.002515 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/15-23:38:42.002516 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/15-23:38:42.002517 8651103744 Options.disable_auto_compactions: 0 +2023/08/15-23:38:42.002517 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/15-23:38:42.002518 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/15-23:38:42.002519 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/15-23:38:42.002520 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/15-23:38:42.002520 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/15-23:38:42.002521 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/15-23:38:42.002522 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/15-23:38:42.002524 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/15-23:38:42.002525 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/15-23:38:42.002525 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/15-23:38:42.002527 8651103744 Options.table_properties_collectors: +2023/08/15-23:38:42.002527 8651103744 Options.inplace_update_support: 0 +2023/08/15-23:38:42.002528 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/15-23:38:42.002528 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/15-23:38:42.002529 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/15-23:38:42.002530 8651103744 Options.memtable_huge_page_size: 0 +2023/08/15-23:38:42.002530 8651103744 Options.bloom_locality: 0 +2023/08/15-23:38:42.002531 8651103744 Options.max_successive_merges: 0 +2023/08/15-23:38:42.002531 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/15-23:38:42.002532 8651103744 Options.paranoid_file_checks: 0 +2023/08/15-23:38:42.002533 8651103744 Options.force_consistency_checks: 1 +2023/08/15-23:38:42.002533 8651103744 Options.report_bg_io_stats: 0 +2023/08/15-23:38:42.002534 8651103744 Options.ttl: 2592000 +2023/08/15-23:38:42.002534 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/15-23:38:42.002535 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/15-23:38:42.002536 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/15-23:38:42.002536 8651103744 Options.enable_blob_files: false +2023/08/15-23:38:42.002537 8651103744 Options.min_blob_size: 0 +2023/08/15-23:38:42.002537 8651103744 Options.blob_file_size: 268435456 +2023/08/15-23:38:42.002538 8651103744 Options.blob_compression_type: NoCompression +2023/08/15-23:38:42.002539 8651103744 Options.enable_blob_garbage_collection: false +2023/08/15-23:38:42.002539 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/15-23:38:42.002540 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/15-23:38:42.002540 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/15-23:38:42.002541 8651103744 Options.blob_file_starting_level: 0 +2023/08/15-23:38:42.002542 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/15-23:38:42.003238 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000023 succeeded,manifest_file_number is 23, next_file_number is 25, last_sequence is 59, log_number is 18,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 18 +2023/08/15-23:38:42.003241 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 18 +2023/08/15-23:38:42.003414 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/15-23:38:42.003498 8651103744 EVENT_LOG_v1 {"time_micros": 1692110322003495, "job": 1, "event": "recovery_started", "wal_files": [22]} +2023/08/15-23:38:42.003500 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #22 mode 2 +2023/08/15-23:38:42.003545 8651103744 EVENT_LOG_v1 {"time_micros": 1692110322003544, "job": 1, "event": "recovery_finished"} +2023/08/15-23:38:42.003598 8651103744 [db/version_set.cc:5180] Creating manifest 27 +2023/08/15-23:38:42.004958 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x13b904200 +2023/08/15-23:38:42.004985 8651103744 DB pointer 0x13b013600 +2023/08/15-23:38:42.005098 6157299712 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/15-23:38:42.005101 6157299712 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 2/0 4.85 KB 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 2/0 4.85 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000007100d8#74604 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 8e-06 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** +2023/08/15-23:38:46.760256 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work +2023/08/15-23:38:46.761272 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692159212672457 b/rust/hyperlane_db/LOG.old.1692159212672457 new file mode 100644 index 0000000000..d1aaf359b3 --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692159212672457 @@ -0,0 +1,287 @@ +2023/08/15-23:44:38.117099 8651103744 RocksDB version: 8.1.1 +2023/08/15-23:44:38.117711 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/15-23:44:38.117713 8651103744 DB SUMMARY +2023/08/15-23:44:38.117715 8651103744 DB Session ID: GNTJRFOH8YXJUE7WIIPJ +2023/08/15-23:44:38.117789 8651103744 CURRENT file: CURRENT +2023/08/15-23:44:38.117791 8651103744 IDENTITY file: IDENTITY +2023/08/15-23:44:38.117804 8651103744 MANIFEST file: MANIFEST-000027 size: 397 Bytes +2023/08/15-23:44:38.117807 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 2, files: 000016.sst 000021.sst +2023/08/15-23:44:38.117808 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000022.log size: 0 ; 000026.log size: 5148 ; +2023/08/15-23:44:38.117810 8651103744 Options.error_if_exists: 0 +2023/08/15-23:44:38.117811 8651103744 Options.create_if_missing: 1 +2023/08/15-23:44:38.117812 8651103744 Options.paranoid_checks: 1 +2023/08/15-23:44:38.117813 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/15-23:44:38.117814 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/15-23:44:38.117815 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/15-23:44:38.117816 8651103744 Options.env: 0x106fff828 +2023/08/15-23:44:38.117817 8651103744 Options.fs: PosixFileSystem +2023/08/15-23:44:38.117819 8651103744 Options.info_log: 0x14360aa28 +2023/08/15-23:44:38.117820 8651103744 Options.max_file_opening_threads: 16 +2023/08/15-23:44:38.117821 8651103744 Options.statistics: 0x0 +2023/08/15-23:44:38.117822 8651103744 Options.use_fsync: 0 +2023/08/15-23:44:38.117823 8651103744 Options.max_log_file_size: 0 +2023/08/15-23:44:38.117824 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/15-23:44:38.117825 8651103744 Options.log_file_time_to_roll: 0 +2023/08/15-23:44:38.117826 8651103744 Options.keep_log_file_num: 1000 +2023/08/15-23:44:38.117827 8651103744 Options.recycle_log_file_num: 0 +2023/08/15-23:44:38.117828 8651103744 Options.allow_fallocate: 1 +2023/08/15-23:44:38.117829 8651103744 Options.allow_mmap_reads: 0 +2023/08/15-23:44:38.117829 8651103744 Options.allow_mmap_writes: 0 +2023/08/15-23:44:38.117830 8651103744 Options.use_direct_reads: 0 +2023/08/15-23:44:38.117831 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/15-23:44:38.117832 8651103744 Options.create_missing_column_families: 0 +2023/08/15-23:44:38.117833 8651103744 Options.db_log_dir: +2023/08/15-23:44:38.117834 8651103744 Options.wal_dir: +2023/08/15-23:44:38.117835 8651103744 Options.table_cache_numshardbits: 6 +2023/08/15-23:44:38.117836 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/15-23:44:38.117837 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/15-23:44:38.117838 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/15-23:44:38.117839 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/15-23:44:38.117840 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/15-23:44:38.117841 8651103744 Options.advise_random_on_open: 1 +2023/08/15-23:44:38.117842 8651103744 Options.db_write_buffer_size: 0 +2023/08/15-23:44:38.117843 8651103744 Options.write_buffer_manager: 0x6000035f9380 +2023/08/15-23:44:38.117844 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/15-23:44:38.117845 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/15-23:44:38.117846 8651103744 Options.use_adaptive_mutex: 0 +2023/08/15-23:44:38.117847 8651103744 Options.rate_limiter: 0x0 +2023/08/15-23:44:38.117848 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/15-23:44:38.117849 8651103744 Options.wal_recovery_mode: 2 +2023/08/15-23:44:38.117850 8651103744 Options.enable_thread_tracking: 0 +2023/08/15-23:44:38.117851 8651103744 Options.enable_pipelined_write: 0 +2023/08/15-23:44:38.117852 8651103744 Options.unordered_write: 0 +2023/08/15-23:44:38.117852 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/15-23:44:38.117853 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/15-23:44:38.117854 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/15-23:44:38.117855 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/15-23:44:38.117856 8651103744 Options.row_cache: None +2023/08/15-23:44:38.117857 8651103744 Options.wal_filter: None +2023/08/15-23:44:38.117858 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/15-23:44:38.117859 8651103744 Options.allow_ingest_behind: 0 +2023/08/15-23:44:38.117860 8651103744 Options.two_write_queues: 0 +2023/08/15-23:44:38.117861 8651103744 Options.manual_wal_flush: 0 +2023/08/15-23:44:38.117862 8651103744 Options.wal_compression: 0 +2023/08/15-23:44:38.117863 8651103744 Options.atomic_flush: 0 +2023/08/15-23:44:38.117864 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/15-23:44:38.117865 8651103744 Options.persist_stats_to_disk: 0 +2023/08/15-23:44:38.117866 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/15-23:44:38.117867 8651103744 Options.log_readahead_size: 0 +2023/08/15-23:44:38.117868 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/15-23:44:38.117869 8651103744 Options.best_efforts_recovery: 0 +2023/08/15-23:44:38.117870 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/15-23:44:38.117871 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/15-23:44:38.117872 8651103744 Options.allow_data_in_errors: 0 +2023/08/15-23:44:38.117873 8651103744 Options.db_host_id: __hostname__ +2023/08/15-23:44:38.117874 8651103744 Options.enforce_single_del_contracts: true +2023/08/15-23:44:38.117875 8651103744 Options.max_background_jobs: 2 +2023/08/15-23:44:38.117876 8651103744 Options.max_background_compactions: -1 +2023/08/15-23:44:38.117877 8651103744 Options.max_subcompactions: 1 +2023/08/15-23:44:38.117878 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/15-23:44:38.117879 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/15-23:44:38.117880 8651103744 Options.delayed_write_rate : 16777216 +2023/08/15-23:44:38.117881 8651103744 Options.max_total_wal_size: 0 +2023/08/15-23:44:38.117882 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/15-23:44:38.117883 8651103744 Options.stats_dump_period_sec: 600 +2023/08/15-23:44:38.117884 8651103744 Options.stats_persist_period_sec: 600 +2023/08/15-23:44:38.117886 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/15-23:44:38.117887 8651103744 Options.max_open_files: -1 +2023/08/15-23:44:38.117888 8651103744 Options.bytes_per_sync: 0 +2023/08/15-23:44:38.117888 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/15-23:44:38.117889 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/15-23:44:38.117890 8651103744 Options.compaction_readahead_size: 0 +2023/08/15-23:44:38.117891 8651103744 Options.max_background_flushes: -1 +2023/08/15-23:44:38.117892 8651103744 Compression algorithms supported: +2023/08/15-23:44:38.117912 8651103744 kZSTD supported: 1 +2023/08/15-23:44:38.117913 8651103744 kZlibCompression supported: 1 +2023/08/15-23:44:38.117914 8651103744 kXpressCompression supported: 0 +2023/08/15-23:44:38.117915 8651103744 kSnappyCompression supported: 1 +2023/08/15-23:44:38.117916 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/15-23:44:38.117917 8651103744 kLZ4HCCompression supported: 1 +2023/08/15-23:44:38.117918 8651103744 kLZ4Compression supported: 1 +2023/08/15-23:44:38.117919 8651103744 kBZip2Compression supported: 1 +2023/08/15-23:44:38.117926 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/15-23:44:38.117927 8651103744 DMutex implementation: pthread_mutex_t +2023/08/15-23:44:38.118085 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000027 +2023/08/15-23:44:38.118188 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/15-23:44:38.118189 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/15-23:44:38.118191 8651103744 Options.merge_operator: None +2023/08/15-23:44:38.118192 8651103744 Options.compaction_filter: None +2023/08/15-23:44:38.118193 8651103744 Options.compaction_filter_factory: None +2023/08/15-23:44:38.118194 8651103744 Options.sst_partitioner_factory: None +2023/08/15-23:44:38.118195 8651103744 Options.memtable_factory: SkipListFactory +2023/08/15-23:44:38.118196 8651103744 Options.table_factory: BlockBasedTable +2023/08/15-23:44:38.118212 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600000ef4640) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x600003bf86d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/15-23:44:38.118214 8651103744 Options.write_buffer_size: 67108864 +2023/08/15-23:44:38.118215 8651103744 Options.max_write_buffer_number: 2 +2023/08/15-23:44:38.118216 8651103744 Options.compression: Snappy +2023/08/15-23:44:38.118217 8651103744 Options.bottommost_compression: Disabled +2023/08/15-23:44:38.118218 8651103744 Options.prefix_extractor: nullptr +2023/08/15-23:44:38.118219 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/15-23:44:38.118220 8651103744 Options.num_levels: 7 +2023/08/15-23:44:38.118221 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/15-23:44:38.118222 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/15-23:44:38.118223 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/15-23:44:38.118224 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/15-23:44:38.118225 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/15-23:44:38.118226 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/15-23:44:38.118227 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/15-23:44:38.118228 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/15-23:44:38.118229 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/15-23:44:38.118230 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/15-23:44:38.118231 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/15-23:44:38.118232 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/15-23:44:38.118233 8651103744 Options.compression_opts.window_bits: -14 +2023/08/15-23:44:38.118234 8651103744 Options.compression_opts.level: 32767 +2023/08/15-23:44:38.118235 8651103744 Options.compression_opts.strategy: 0 +2023/08/15-23:44:38.118236 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/15-23:44:38.118237 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/15-23:44:38.118238 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/15-23:44:38.118239 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/15-23:44:38.118239 8651103744 Options.compression_opts.enabled: false +2023/08/15-23:44:38.118240 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/15-23:44:38.118241 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/15-23:44:38.118242 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/15-23:44:38.118243 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/15-23:44:38.118244 8651103744 Options.target_file_size_base: 67108864 +2023/08/15-23:44:38.118245 8651103744 Options.target_file_size_multiplier: 1 +2023/08/15-23:44:38.118246 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/15-23:44:38.118247 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/15-23:44:38.118248 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/15-23:44:38.118249 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/15-23:44:38.118251 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/15-23:44:38.118252 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/15-23:44:38.118253 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/15-23:44:38.118254 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/15-23:44:38.118255 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/15-23:44:38.118256 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/15-23:44:38.118257 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/15-23:44:38.118258 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/15-23:44:38.118259 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/15-23:44:38.118260 8651103744 Options.arena_block_size: 1048576 +2023/08/15-23:44:38.118261 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/15-23:44:38.118262 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/15-23:44:38.118263 8651103744 Options.disable_auto_compactions: 0 +2023/08/15-23:44:38.118264 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/15-23:44:38.118265 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/15-23:44:38.118266 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/15-23:44:38.118267 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/15-23:44:38.118268 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/15-23:44:38.118269 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/15-23:44:38.118270 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/15-23:44:38.118273 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/15-23:44:38.118274 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/15-23:44:38.118275 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/15-23:44:38.118277 8651103744 Options.table_properties_collectors: +2023/08/15-23:44:38.118278 8651103744 Options.inplace_update_support: 0 +2023/08/15-23:44:38.118279 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/15-23:44:38.118280 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/15-23:44:38.118281 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/15-23:44:38.118282 8651103744 Options.memtable_huge_page_size: 0 +2023/08/15-23:44:38.118283 8651103744 Options.bloom_locality: 0 +2023/08/15-23:44:38.118284 8651103744 Options.max_successive_merges: 0 +2023/08/15-23:44:38.118285 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/15-23:44:38.118286 8651103744 Options.paranoid_file_checks: 0 +2023/08/15-23:44:38.118287 8651103744 Options.force_consistency_checks: 1 +2023/08/15-23:44:38.118288 8651103744 Options.report_bg_io_stats: 0 +2023/08/15-23:44:38.118288 8651103744 Options.ttl: 2592000 +2023/08/15-23:44:38.118290 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/15-23:44:38.118291 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/15-23:44:38.118291 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/15-23:44:38.118292 8651103744 Options.enable_blob_files: false +2023/08/15-23:44:38.118293 8651103744 Options.min_blob_size: 0 +2023/08/15-23:44:38.118294 8651103744 Options.blob_file_size: 268435456 +2023/08/15-23:44:38.118295 8651103744 Options.blob_compression_type: NoCompression +2023/08/15-23:44:38.118297 8651103744 Options.enable_blob_garbage_collection: false +2023/08/15-23:44:38.118298 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/15-23:44:38.118299 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/15-23:44:38.118300 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/15-23:44:38.118301 8651103744 Options.blob_file_starting_level: 0 +2023/08/15-23:44:38.118302 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/15-23:44:38.119183 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000027 succeeded,manifest_file_number is 27, next_file_number is 29, last_sequence is 59, log_number is 23,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 18 +2023/08/15-23:44:38.119187 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 23 +2023/08/15-23:44:38.119243 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/15-23:44:38.119352 8651103744 EVENT_LOG_v1 {"time_micros": 1692110678119347, "job": 1, "event": "recovery_started", "wal_files": [22, 26]} +2023/08/15-23:44:38.119354 8651103744 [db/db_impl/db_impl_open.cc:1018] Skipping log #22 since it is older than min log to keep #23 +2023/08/15-23:44:38.119356 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #26 mode 2 +2023/08/15-23:44:38.120316 8651103744 EVENT_LOG_v1 {"time_micros": 1692110678120265, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 30, "file_size": 2588, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 63, "largest_seqno": 105, "table_properties": {"data_size": 1575, "index_size": 65, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 1815, "raw_average_key_size": 45, "raw_value_size": 2375, "raw_average_value_size": 59, "num_data_blocks": 1, "num_entries": 40, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692110678, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "GNTJRFOH8YXJUE7WIIPJ", "orig_file_number": 30, "seqno_to_time_mapping": "N/A"}} +2023/08/15-23:44:38.120416 8651103744 EVENT_LOG_v1 {"time_micros": 1692110678120414, "job": 1, "event": "recovery_finished"} +2023/08/15-23:44:38.120505 8651103744 [db/version_set.cc:5180] Creating manifest 32 +2023/08/15-23:44:38.122352 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000026.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/15-23:44:38.122388 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000022.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/15-23:44:38.122420 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x14360ab80 +2023/08/15-23:44:38.122466 8651103744 DB pointer 0x14382aa00 +2023/08/15-23:44:38.122631 6092500992 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/15-23:44:38.122635 6092500992 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 3/0 7.38 KB 0.8 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 2.7 0.00 0.00 1 0.001 0 0 0.0 0.0 + Sum 3/0 7.38 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 2.7 0.00 0.00 1 0.001 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 2.7 0.00 0.00 1 0.001 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.7 0.00 0.00 1 0.001 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 0.56 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 0.56 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x600003bf86d8#74764 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 1e-05 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692159337379204 b/rust/hyperlane_db/LOG.old.1692159337379204 new file mode 100644 index 0000000000..2e681c31e7 --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692159337379204 @@ -0,0 +1,303 @@ +2023/08/16-13:13:32.672905 8651103744 RocksDB version: 8.1.1 +2023/08/16-13:13:32.673682 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/16-13:13:32.673684 8651103744 DB SUMMARY +2023/08/16-13:13:32.673685 8651103744 DB Session ID: LQZM45ZTWAYSR16YVIL9 +2023/08/16-13:13:32.673779 8651103744 CURRENT file: CURRENT +2023/08/16-13:13:32.673781 8651103744 IDENTITY file: IDENTITY +2023/08/16-13:13:32.673799 8651103744 MANIFEST file: MANIFEST-000032 size: 566 Bytes +2023/08/16-13:13:32.673801 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 3, files: 000016.sst 000021.sst 000030.sst +2023/08/16-13:13:32.673802 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000031.log size: 264411 ; +2023/08/16-13:13:32.673804 8651103744 Options.error_if_exists: 0 +2023/08/16-13:13:32.673806 8651103744 Options.create_if_missing: 1 +2023/08/16-13:13:32.673807 8651103744 Options.paranoid_checks: 1 +2023/08/16-13:13:32.673808 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/16-13:13:32.673809 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/16-13:13:32.673810 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/16-13:13:32.673811 8651103744 Options.env: 0x103007828 +2023/08/16-13:13:32.673812 8651103744 Options.fs: PosixFileSystem +2023/08/16-13:13:32.673813 8651103744 Options.info_log: 0x15be0aa28 +2023/08/16-13:13:32.673814 8651103744 Options.max_file_opening_threads: 16 +2023/08/16-13:13:32.673815 8651103744 Options.statistics: 0x0 +2023/08/16-13:13:32.673816 8651103744 Options.use_fsync: 0 +2023/08/16-13:13:32.673817 8651103744 Options.max_log_file_size: 0 +2023/08/16-13:13:32.673818 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/16-13:13:32.673819 8651103744 Options.log_file_time_to_roll: 0 +2023/08/16-13:13:32.673820 8651103744 Options.keep_log_file_num: 1000 +2023/08/16-13:13:32.673831 8651103744 Options.recycle_log_file_num: 0 +2023/08/16-13:13:32.673832 8651103744 Options.allow_fallocate: 1 +2023/08/16-13:13:32.673833 8651103744 Options.allow_mmap_reads: 0 +2023/08/16-13:13:32.673834 8651103744 Options.allow_mmap_writes: 0 +2023/08/16-13:13:32.673835 8651103744 Options.use_direct_reads: 0 +2023/08/16-13:13:32.673836 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/16-13:13:32.673837 8651103744 Options.create_missing_column_families: 0 +2023/08/16-13:13:32.673838 8651103744 Options.db_log_dir: +2023/08/16-13:13:32.673839 8651103744 Options.wal_dir: +2023/08/16-13:13:32.673840 8651103744 Options.table_cache_numshardbits: 6 +2023/08/16-13:13:32.673841 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/16-13:13:32.673842 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/16-13:13:32.673843 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/16-13:13:32.673844 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/16-13:13:32.673845 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/16-13:13:32.673846 8651103744 Options.advise_random_on_open: 1 +2023/08/16-13:13:32.673846 8651103744 Options.db_write_buffer_size: 0 +2023/08/16-13:13:32.673847 8651103744 Options.write_buffer_manager: 0x600003da5380 +2023/08/16-13:13:32.673848 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/16-13:13:32.673849 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/16-13:13:32.673850 8651103744 Options.use_adaptive_mutex: 0 +2023/08/16-13:13:32.673851 8651103744 Options.rate_limiter: 0x0 +2023/08/16-13:13:32.673853 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/16-13:13:32.673854 8651103744 Options.wal_recovery_mode: 2 +2023/08/16-13:13:32.673854 8651103744 Options.enable_thread_tracking: 0 +2023/08/16-13:13:32.673855 8651103744 Options.enable_pipelined_write: 0 +2023/08/16-13:13:32.673856 8651103744 Options.unordered_write: 0 +2023/08/16-13:13:32.673857 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/16-13:13:32.673858 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/16-13:13:32.673859 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/16-13:13:32.673860 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/16-13:13:32.673861 8651103744 Options.row_cache: None +2023/08/16-13:13:32.673862 8651103744 Options.wal_filter: None +2023/08/16-13:13:32.673863 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/16-13:13:32.673864 8651103744 Options.allow_ingest_behind: 0 +2023/08/16-13:13:32.673865 8651103744 Options.two_write_queues: 0 +2023/08/16-13:13:32.673866 8651103744 Options.manual_wal_flush: 0 +2023/08/16-13:13:32.673867 8651103744 Options.wal_compression: 0 +2023/08/16-13:13:32.673868 8651103744 Options.atomic_flush: 0 +2023/08/16-13:13:32.673869 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/16-13:13:32.673870 8651103744 Options.persist_stats_to_disk: 0 +2023/08/16-13:13:32.673871 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/16-13:13:32.673872 8651103744 Options.log_readahead_size: 0 +2023/08/16-13:13:32.673873 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/16-13:13:32.673874 8651103744 Options.best_efforts_recovery: 0 +2023/08/16-13:13:32.673875 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/16-13:13:32.673876 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/16-13:13:32.673877 8651103744 Options.allow_data_in_errors: 0 +2023/08/16-13:13:32.673878 8651103744 Options.db_host_id: __hostname__ +2023/08/16-13:13:32.673879 8651103744 Options.enforce_single_del_contracts: true +2023/08/16-13:13:32.673880 8651103744 Options.max_background_jobs: 2 +2023/08/16-13:13:32.673881 8651103744 Options.max_background_compactions: -1 +2023/08/16-13:13:32.673882 8651103744 Options.max_subcompactions: 1 +2023/08/16-13:13:32.673883 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/16-13:13:32.673884 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/16-13:13:32.673885 8651103744 Options.delayed_write_rate : 16777216 +2023/08/16-13:13:32.673886 8651103744 Options.max_total_wal_size: 0 +2023/08/16-13:13:32.673887 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/16-13:13:32.673888 8651103744 Options.stats_dump_period_sec: 600 +2023/08/16-13:13:32.673889 8651103744 Options.stats_persist_period_sec: 600 +2023/08/16-13:13:32.673890 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/16-13:13:32.673891 8651103744 Options.max_open_files: -1 +2023/08/16-13:13:32.673892 8651103744 Options.bytes_per_sync: 0 +2023/08/16-13:13:32.673893 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/16-13:13:32.673894 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/16-13:13:32.673895 8651103744 Options.compaction_readahead_size: 0 +2023/08/16-13:13:32.673896 8651103744 Options.max_background_flushes: -1 +2023/08/16-13:13:32.673896 8651103744 Compression algorithms supported: +2023/08/16-13:13:32.673917 8651103744 kZSTD supported: 1 +2023/08/16-13:13:32.673918 8651103744 kZlibCompression supported: 1 +2023/08/16-13:13:32.673919 8651103744 kXpressCompression supported: 0 +2023/08/16-13:13:32.673920 8651103744 kSnappyCompression supported: 1 +2023/08/16-13:13:32.673921 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/16-13:13:32.673922 8651103744 kLZ4HCCompression supported: 1 +2023/08/16-13:13:32.673923 8651103744 kLZ4Compression supported: 1 +2023/08/16-13:13:32.673924 8651103744 kBZip2Compression supported: 1 +2023/08/16-13:13:32.673932 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/16-13:13:32.673933 8651103744 DMutex implementation: pthread_mutex_t +2023/08/16-13:13:32.674260 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000032 +2023/08/16-13:13:32.674347 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/16-13:13:32.674348 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/16-13:13:32.674349 8651103744 Options.merge_operator: None +2023/08/16-13:13:32.674350 8651103744 Options.compaction_filter: None +2023/08/16-13:13:32.674350 8651103744 Options.compaction_filter_factory: None +2023/08/16-13:13:32.674351 8651103744 Options.sst_partitioner_factory: None +2023/08/16-13:13:32.674351 8651103744 Options.memtable_factory: SkipListFactory +2023/08/16-13:13:32.674352 8651103744 Options.table_factory: BlockBasedTable +2023/08/16-13:13:32.674377 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x6000006a8640) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000033a46d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/16-13:13:32.674379 8651103744 Options.write_buffer_size: 67108864 +2023/08/16-13:13:32.674380 8651103744 Options.max_write_buffer_number: 2 +2023/08/16-13:13:32.674381 8651103744 Options.compression: Snappy +2023/08/16-13:13:32.674381 8651103744 Options.bottommost_compression: Disabled +2023/08/16-13:13:32.674382 8651103744 Options.prefix_extractor: nullptr +2023/08/16-13:13:32.674383 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/16-13:13:32.674383 8651103744 Options.num_levels: 7 +2023/08/16-13:13:32.674384 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/16-13:13:32.674384 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/16-13:13:32.674385 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/16-13:13:32.674386 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/16-13:13:32.674386 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/16-13:13:32.674387 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/16-13:13:32.674387 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/16-13:13:32.674388 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/16-13:13:32.674389 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/16-13:13:32.674389 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/16-13:13:32.674390 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-13:13:32.674390 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/16-13:13:32.674391 8651103744 Options.compression_opts.window_bits: -14 +2023/08/16-13:13:32.674392 8651103744 Options.compression_opts.level: 32767 +2023/08/16-13:13:32.674392 8651103744 Options.compression_opts.strategy: 0 +2023/08/16-13:13:32.674393 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/16-13:13:32.674393 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/16-13:13:32.674394 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/16-13:13:32.674395 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/16-13:13:32.674395 8651103744 Options.compression_opts.enabled: false +2023/08/16-13:13:32.674396 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-13:13:32.674396 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/16-13:13:32.674397 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/16-13:13:32.674397 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/16-13:13:32.674398 8651103744 Options.target_file_size_base: 67108864 +2023/08/16-13:13:32.674399 8651103744 Options.target_file_size_multiplier: 1 +2023/08/16-13:13:32.674399 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/16-13:13:32.674400 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/16-13:13:32.674400 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/16-13:13:32.674401 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/16-13:13:32.674402 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/16-13:13:32.674402 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/16-13:13:32.674403 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/16-13:13:32.674404 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/16-13:13:32.674404 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/16-13:13:32.674405 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/16-13:13:32.674405 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/16-13:13:32.674406 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/16-13:13:32.674407 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/16-13:13:32.674407 8651103744 Options.arena_block_size: 1048576 +2023/08/16-13:13:32.674408 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/16-13:13:32.674408 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/16-13:13:32.674409 8651103744 Options.disable_auto_compactions: 0 +2023/08/16-13:13:32.674410 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/16-13:13:32.674410 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/16-13:13:32.674411 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/16-13:13:32.674411 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/16-13:13:32.674412 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/16-13:13:32.674413 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/16-13:13:32.674413 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/16-13:13:32.674416 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/16-13:13:32.674416 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/16-13:13:32.674417 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/16-13:13:32.674418 8651103744 Options.table_properties_collectors: +2023/08/16-13:13:32.674419 8651103744 Options.inplace_update_support: 0 +2023/08/16-13:13:32.674419 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/16-13:13:32.674420 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/16-13:13:32.674420 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/16-13:13:32.674421 8651103744 Options.memtable_huge_page_size: 0 +2023/08/16-13:13:32.674422 8651103744 Options.bloom_locality: 0 +2023/08/16-13:13:32.674422 8651103744 Options.max_successive_merges: 0 +2023/08/16-13:13:32.674423 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/16-13:13:32.674423 8651103744 Options.paranoid_file_checks: 0 +2023/08/16-13:13:32.674424 8651103744 Options.force_consistency_checks: 1 +2023/08/16-13:13:32.674424 8651103744 Options.report_bg_io_stats: 0 +2023/08/16-13:13:32.674425 8651103744 Options.ttl: 2592000 +2023/08/16-13:13:32.674426 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/16-13:13:32.674426 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/16-13:13:32.674427 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/16-13:13:32.674427 8651103744 Options.enable_blob_files: false +2023/08/16-13:13:32.674428 8651103744 Options.min_blob_size: 0 +2023/08/16-13:13:32.674428 8651103744 Options.blob_file_size: 268435456 +2023/08/16-13:13:32.674429 8651103744 Options.blob_compression_type: NoCompression +2023/08/16-13:13:32.674430 8651103744 Options.enable_blob_garbage_collection: false +2023/08/16-13:13:32.674430 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/16-13:13:32.674431 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/16-13:13:32.674432 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/16-13:13:32.674432 8651103744 Options.blob_file_starting_level: 0 +2023/08/16-13:13:32.674433 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/16-13:13:32.675214 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000032 succeeded,manifest_file_number is 32, next_file_number is 34, last_sequence is 105, log_number is 27,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 27 +2023/08/16-13:13:32.675217 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 27 +2023/08/16-13:13:32.675400 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/16-13:13:32.675474 8651103744 EVENT_LOG_v1 {"time_micros": 1692159212675471, "job": 1, "event": "recovery_started", "wal_files": [31]} +2023/08/16-13:13:32.675476 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #31 mode 2 +2023/08/16-13:13:32.677885 8651103744 EVENT_LOG_v1 {"time_micros": 1692159212677870, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 35, "file_size": 96358, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 109, "largest_seqno": 2010, "table_properties": {"data_size": 94632, "index_size": 1776, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 116687, "raw_average_key_size": 67, "raw_value_size": 111669, "raw_average_value_size": 64, "num_data_blocks": 44, "num_entries": 1726, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692159212, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "LQZM45ZTWAYSR16YVIL9", "orig_file_number": 35, "seqno_to_time_mapping": "N/A"}} +2023/08/16-13:13:32.677943 8651103744 EVENT_LOG_v1 {"time_micros": 1692159212677942, "job": 1, "event": "recovery_finished"} +2023/08/16-13:13:32.677989 8651103744 [db/version_set.cc:5180] Creating manifest 37 +2023/08/16-13:13:32.679585 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000031.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-13:13:32.679617 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x15be0ab80 +2023/08/16-13:13:32.679655 8651103744 DB pointer 0x15c02b800 +2023/08/16-13:13:32.679667 6158430208 [db/compaction/compaction_job.cc:1988] [default] [JOB 3] Compacting 4@0 files to L1, score 1.00 +2023/08/16-13:13:32.679670 6158430208 [db/compaction/compaction_job.cc:1992] [default]: Compaction start summary: Base version 2 Base level 0, inputs: [35(94KB) 30(2588B) 21(3901B) 16(1067B)] +2023/08/16-13:13:32.679676 6158430208 EVENT_LOG_v1 {"time_micros": 1692159212679672, "job": 3, "event": "compaction_started", "compaction_reason": "LevelL0FilesNum", "files_L0": [35, 30, 21, 16], "score": 1, "input_data_size": 103914, "oldest_snapshot_seqno": -1} +2023/08/16-13:13:32.679795 6159577088 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/16-13:13:32.679965 6159577088 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 4/4 101.48 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 85.3 0.00 0.00 1 0.001 0 0 0.0 0.0 + Sum 4/4 101.48 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 85.3 0.00 0.00 1 0.001 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 85.3 0.00 0.00 1 0.001 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.3 0.00 0.00 1 0.001 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 16.90 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 16.90 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000033a46d8#85416 capacity: 8.00 MB usage: 11.95 KB table_size: 256 occupancy: 12233 collections: 1 last_copies: 0 last_secs: 8e-06 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(5,11.52 KB,0.140643%) + +** File Read Latency Histogram By Level [default] ** +2023/08/16-13:13:32.680785 6158430208 [db/compaction/compaction_job.cc:1592] [default] [JOB 3] Generated table #40: 1819 keys, 99281 bytes, temperature: kUnknown +2023/08/16-13:13:32.680801 6158430208 EVENT_LOG_v1 {"time_micros": 1692159212680788, "cf_name": "default", "job": 3, "event": "table_file_creation", "file_number": 40, "file_size": 99281, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 0, "largest_seqno": 0, "table_properties": {"data_size": 97497, "index_size": 1885, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 120903, "raw_average_key_size": 66, "raw_value_size": 121444, "raw_average_value_size": 66, "num_data_blocks": 47, "num_entries": 1819, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692109142, "oldest_key_time": 0, "file_creation_time": 1692159212, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "LQZM45ZTWAYSR16YVIL9", "orig_file_number": 40, "seqno_to_time_mapping": "N/A"}} +2023/08/16-13:13:32.680946 6158430208 (Original Log Time 2023/08/16-13:13:32.680871) [db/compaction/compaction_job.cc:1663] [default] [JOB 3] Compacted 4@0 files to L1 => 99281 bytes +2023/08/16-13:13:32.680947 6158430208 (Original Log Time 2023/08/16-13:13:32.680925) [db/compaction/compaction_job.cc:885] [default] compacted to: files[0 1 0 0 0 0 0] max score 0.00, MB/sec: 91.3 rd, 87.2 wr, level 1, files in(4, 0) out(1 +0 blob) MB in(0.1, 0.0 +0.0 blob) out(0.1 +0.0 blob), read-write-amplify(2.0) write-amplify(1.0) OK, records in: 1822, records dropped: 3 output_compression: Snappy +2023/08/16-13:13:32.680949 6158430208 (Original Log Time 2023/08/16-13:13:32.680935) EVENT_LOG_v1 {"time_micros": 1692159212680928, "job": 3, "event": "compaction_finished", "compaction_time_micros": 1138, "compaction_time_cpu_micros": 1093, "output_level": 1, "num_output_files": 1, "total_output_size": 99281, "num_input_records": 1822, "num_output_records": 1819, "num_subcompactions": 1, "output_compression": "Snappy", "num_single_delete_mismatches": 0, "num_single_delete_fallthrough": 0, "lsm_state": [0, 1, 0, 0, 0, 0, 0]} +2023/08/16-13:13:32.681020 6158430208 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000035.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-13:13:32.681024 6158430208 EVENT_LOG_v1 {"time_micros": 1692159212681022, "job": 3, "event": "table_file_deletion", "file_number": 35} +2023/08/16-13:13:32.681072 6158430208 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000030.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-13:13:32.681075 6158430208 EVENT_LOG_v1 {"time_micros": 1692159212681074, "job": 3, "event": "table_file_deletion", "file_number": 30} +2023/08/16-13:13:32.681702 6158430208 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000021.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-13:13:32.681705 6158430208 EVENT_LOG_v1 {"time_micros": 1692159212681704, "job": 3, "event": "table_file_deletion", "file_number": 21} +2023/08/16-13:13:32.681990 6158430208 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000016.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-13:13:32.681996 6158430208 EVENT_LOG_v1 {"time_micros": 1692159212681994, "job": 3, "event": "table_file_deletion", "file_number": 16} +2023/08/16-13:14:13.965381 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work +2023/08/16-13:14:13.966254 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692159630683428 b/rust/hyperlane_db/LOG.old.1692159630683428 new file mode 100644 index 0000000000..b5cfd4df51 --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692159630683428 @@ -0,0 +1,288 @@ +2023/08/16-13:15:37.379701 8651103744 RocksDB version: 8.1.1 +2023/08/16-13:15:37.380407 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/16-13:15:37.380410 8651103744 DB SUMMARY +2023/08/16-13:15:37.380412 8651103744 DB Session ID: D697NVFHKDYVI4HOY9MN +2023/08/16-13:15:37.380491 8651103744 CURRENT file: CURRENT +2023/08/16-13:15:37.380493 8651103744 IDENTITY file: IDENTITY +2023/08/16-13:15:37.380510 8651103744 MANIFEST file: MANIFEST-000037 size: 969 Bytes +2023/08/16-13:15:37.380512 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 1, files: 000040.sst +2023/08/16-13:15:37.380514 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000036.log size: 861744 ; +2023/08/16-13:15:37.380516 8651103744 Options.error_if_exists: 0 +2023/08/16-13:15:37.380517 8651103744 Options.create_if_missing: 1 +2023/08/16-13:15:37.380519 8651103744 Options.paranoid_checks: 1 +2023/08/16-13:15:37.380520 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/16-13:15:37.380521 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/16-13:15:37.380522 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/16-13:15:37.380523 8651103744 Options.env: 0x104b5b828 +2023/08/16-13:15:37.380525 8651103744 Options.fs: PosixFileSystem +2023/08/16-13:15:37.380526 8651103744 Options.info_log: 0x136e0aa78 +2023/08/16-13:15:37.380527 8651103744 Options.max_file_opening_threads: 16 +2023/08/16-13:15:37.380528 8651103744 Options.statistics: 0x0 +2023/08/16-13:15:37.380529 8651103744 Options.use_fsync: 0 +2023/08/16-13:15:37.380531 8651103744 Options.max_log_file_size: 0 +2023/08/16-13:15:37.380532 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/16-13:15:37.380533 8651103744 Options.log_file_time_to_roll: 0 +2023/08/16-13:15:37.380534 8651103744 Options.keep_log_file_num: 1000 +2023/08/16-13:15:37.380535 8651103744 Options.recycle_log_file_num: 0 +2023/08/16-13:15:37.380536 8651103744 Options.allow_fallocate: 1 +2023/08/16-13:15:37.380537 8651103744 Options.allow_mmap_reads: 0 +2023/08/16-13:15:37.380539 8651103744 Options.allow_mmap_writes: 0 +2023/08/16-13:15:37.380540 8651103744 Options.use_direct_reads: 0 +2023/08/16-13:15:37.380541 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/16-13:15:37.380542 8651103744 Options.create_missing_column_families: 0 +2023/08/16-13:15:37.380543 8651103744 Options.db_log_dir: +2023/08/16-13:15:37.380544 8651103744 Options.wal_dir: +2023/08/16-13:15:37.380545 8651103744 Options.table_cache_numshardbits: 6 +2023/08/16-13:15:37.380546 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/16-13:15:37.380547 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/16-13:15:37.380548 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/16-13:15:37.380550 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/16-13:15:37.380551 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/16-13:15:37.380552 8651103744 Options.advise_random_on_open: 1 +2023/08/16-13:15:37.380553 8651103744 Options.db_write_buffer_size: 0 +2023/08/16-13:15:37.380554 8651103744 Options.write_buffer_manager: 0x600002f05380 +2023/08/16-13:15:37.380555 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/16-13:15:37.380556 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/16-13:15:37.380557 8651103744 Options.use_adaptive_mutex: 0 +2023/08/16-13:15:37.380559 8651103744 Options.rate_limiter: 0x0 +2023/08/16-13:15:37.380560 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/16-13:15:37.380561 8651103744 Options.wal_recovery_mode: 2 +2023/08/16-13:15:37.380562 8651103744 Options.enable_thread_tracking: 0 +2023/08/16-13:15:37.380563 8651103744 Options.enable_pipelined_write: 0 +2023/08/16-13:15:37.380564 8651103744 Options.unordered_write: 0 +2023/08/16-13:15:37.380565 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/16-13:15:37.380566 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/16-13:15:37.380567 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/16-13:15:37.380569 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/16-13:15:37.380570 8651103744 Options.row_cache: None +2023/08/16-13:15:37.380571 8651103744 Options.wal_filter: None +2023/08/16-13:15:37.380572 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/16-13:15:37.380573 8651103744 Options.allow_ingest_behind: 0 +2023/08/16-13:15:37.380574 8651103744 Options.two_write_queues: 0 +2023/08/16-13:15:37.380575 8651103744 Options.manual_wal_flush: 0 +2023/08/16-13:15:37.380576 8651103744 Options.wal_compression: 0 +2023/08/16-13:15:37.380578 8651103744 Options.atomic_flush: 0 +2023/08/16-13:15:37.380579 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/16-13:15:37.380580 8651103744 Options.persist_stats_to_disk: 0 +2023/08/16-13:15:37.380581 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/16-13:15:37.380582 8651103744 Options.log_readahead_size: 0 +2023/08/16-13:15:37.380584 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/16-13:15:37.380585 8651103744 Options.best_efforts_recovery: 0 +2023/08/16-13:15:37.380586 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/16-13:15:37.380587 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/16-13:15:37.380588 8651103744 Options.allow_data_in_errors: 0 +2023/08/16-13:15:37.380590 8651103744 Options.db_host_id: __hostname__ +2023/08/16-13:15:37.380591 8651103744 Options.enforce_single_del_contracts: true +2023/08/16-13:15:37.380592 8651103744 Options.max_background_jobs: 2 +2023/08/16-13:15:37.380593 8651103744 Options.max_background_compactions: -1 +2023/08/16-13:15:37.380594 8651103744 Options.max_subcompactions: 1 +2023/08/16-13:15:37.380595 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/16-13:15:37.380596 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/16-13:15:37.380597 8651103744 Options.delayed_write_rate : 16777216 +2023/08/16-13:15:37.380599 8651103744 Options.max_total_wal_size: 0 +2023/08/16-13:15:37.380600 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/16-13:15:37.380601 8651103744 Options.stats_dump_period_sec: 600 +2023/08/16-13:15:37.380602 8651103744 Options.stats_persist_period_sec: 600 +2023/08/16-13:15:37.380604 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/16-13:15:37.380605 8651103744 Options.max_open_files: -1 +2023/08/16-13:15:37.380606 8651103744 Options.bytes_per_sync: 0 +2023/08/16-13:15:37.380607 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/16-13:15:37.380608 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/16-13:15:37.380609 8651103744 Options.compaction_readahead_size: 0 +2023/08/16-13:15:37.380610 8651103744 Options.max_background_flushes: -1 +2023/08/16-13:15:37.380611 8651103744 Compression algorithms supported: +2023/08/16-13:15:37.380634 8651103744 kZSTD supported: 1 +2023/08/16-13:15:37.380635 8651103744 kZlibCompression supported: 1 +2023/08/16-13:15:37.380636 8651103744 kXpressCompression supported: 0 +2023/08/16-13:15:37.380637 8651103744 kSnappyCompression supported: 1 +2023/08/16-13:15:37.380639 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/16-13:15:37.380640 8651103744 kLZ4HCCompression supported: 1 +2023/08/16-13:15:37.380641 8651103744 kLZ4Compression supported: 1 +2023/08/16-13:15:37.380642 8651103744 kBZip2Compression supported: 1 +2023/08/16-13:15:37.380651 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/16-13:15:37.380652 8651103744 DMutex implementation: pthread_mutex_t +2023/08/16-13:15:37.380824 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000037 +2023/08/16-13:15:37.380940 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/16-13:15:37.380942 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/16-13:15:37.380943 8651103744 Options.merge_operator: None +2023/08/16-13:15:37.380944 8651103744 Options.compaction_filter: None +2023/08/16-13:15:37.380946 8651103744 Options.compaction_filter_factory: None +2023/08/16-13:15:37.380947 8651103744 Options.sst_partitioner_factory: None +2023/08/16-13:15:37.380948 8651103744 Options.memtable_factory: SkipListFactory +2023/08/16-13:15:37.380949 8651103744 Options.table_factory: BlockBasedTable +2023/08/16-13:15:37.380968 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600001408640) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000021046d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/16-13:15:37.380970 8651103744 Options.write_buffer_size: 67108864 +2023/08/16-13:15:37.380971 8651103744 Options.max_write_buffer_number: 2 +2023/08/16-13:15:37.380972 8651103744 Options.compression: Snappy +2023/08/16-13:15:37.380973 8651103744 Options.bottommost_compression: Disabled +2023/08/16-13:15:37.380974 8651103744 Options.prefix_extractor: nullptr +2023/08/16-13:15:37.380976 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/16-13:15:37.380977 8651103744 Options.num_levels: 7 +2023/08/16-13:15:37.380978 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/16-13:15:37.380979 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/16-13:15:37.380980 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/16-13:15:37.380981 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/16-13:15:37.380983 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/16-13:15:37.380984 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/16-13:15:37.380985 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/16-13:15:37.380986 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/16-13:15:37.380988 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/16-13:15:37.380989 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/16-13:15:37.380990 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-13:15:37.380991 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/16-13:15:37.380992 8651103744 Options.compression_opts.window_bits: -14 +2023/08/16-13:15:37.380993 8651103744 Options.compression_opts.level: 32767 +2023/08/16-13:15:37.380995 8651103744 Options.compression_opts.strategy: 0 +2023/08/16-13:15:37.380996 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/16-13:15:37.380997 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/16-13:15:37.380998 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/16-13:15:37.380999 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/16-13:15:37.381000 8651103744 Options.compression_opts.enabled: false +2023/08/16-13:15:37.381001 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-13:15:37.381003 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/16-13:15:37.381004 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/16-13:15:37.381005 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/16-13:15:37.381006 8651103744 Options.target_file_size_base: 67108864 +2023/08/16-13:15:37.381007 8651103744 Options.target_file_size_multiplier: 1 +2023/08/16-13:15:37.381008 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/16-13:15:37.381010 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/16-13:15:37.381011 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/16-13:15:37.381012 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/16-13:15:37.381014 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/16-13:15:37.381015 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/16-13:15:37.381016 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/16-13:15:37.381017 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/16-13:15:37.381018 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/16-13:15:37.381019 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/16-13:15:37.381020 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/16-13:15:37.381021 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/16-13:15:37.381023 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/16-13:15:37.381024 8651103744 Options.arena_block_size: 1048576 +2023/08/16-13:15:37.381025 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/16-13:15:37.381026 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/16-13:15:37.381027 8651103744 Options.disable_auto_compactions: 0 +2023/08/16-13:15:37.381029 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/16-13:15:37.381030 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/16-13:15:37.381031 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/16-13:15:37.381032 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/16-13:15:37.381034 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/16-13:15:37.381035 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/16-13:15:37.381036 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/16-13:15:37.381039 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/16-13:15:37.381041 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/16-13:15:37.381042 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/16-13:15:37.381044 8651103744 Options.table_properties_collectors: +2023/08/16-13:15:37.381045 8651103744 Options.inplace_update_support: 0 +2023/08/16-13:15:37.381046 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/16-13:15:37.381047 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/16-13:15:37.381049 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/16-13:15:37.381050 8651103744 Options.memtable_huge_page_size: 0 +2023/08/16-13:15:37.381051 8651103744 Options.bloom_locality: 0 +2023/08/16-13:15:37.381052 8651103744 Options.max_successive_merges: 0 +2023/08/16-13:15:37.381053 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/16-13:15:37.381054 8651103744 Options.paranoid_file_checks: 0 +2023/08/16-13:15:37.381055 8651103744 Options.force_consistency_checks: 1 +2023/08/16-13:15:37.381057 8651103744 Options.report_bg_io_stats: 0 +2023/08/16-13:15:37.381058 8651103744 Options.ttl: 2592000 +2023/08/16-13:15:37.381059 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/16-13:15:37.381060 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/16-13:15:37.381061 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/16-13:15:37.381062 8651103744 Options.enable_blob_files: false +2023/08/16-13:15:37.381063 8651103744 Options.min_blob_size: 0 +2023/08/16-13:15:37.381065 8651103744 Options.blob_file_size: 268435456 +2023/08/16-13:15:37.381066 8651103744 Options.blob_compression_type: NoCompression +2023/08/16-13:15:37.381067 8651103744 Options.enable_blob_garbage_collection: false +2023/08/16-13:15:37.381068 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/16-13:15:37.381069 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/16-13:15:37.381071 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/16-13:15:37.381072 8651103744 Options.blob_file_starting_level: 0 +2023/08/16-13:15:37.381073 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/16-13:15:37.381995 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000037 succeeded,manifest_file_number is 37, next_file_number is 42, last_sequence is 2010, log_number is 32,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 32 +2023/08/16-13:15:37.381999 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 32 +2023/08/16-13:15:37.382063 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/16-13:15:37.382174 8651103744 EVENT_LOG_v1 {"time_micros": 1692159337382169, "job": 1, "event": "recovery_started", "wal_files": [36]} +2023/08/16-13:15:37.382177 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #36 mode 2 +2023/08/16-13:15:37.392141 8651103744 EVENT_LOG_v1 {"time_micros": 1692159337392114, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 43, "file_size": 282983, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 2012, "largest_seqno": 8188, "table_properties": {"data_size": 280036, "index_size": 7108, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 536446, "raw_average_key_size": 88, "raw_value_size": 232151, "raw_average_value_size": 38, "num_data_blocks": 128, "num_entries": 6058, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692159337, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "D697NVFHKDYVI4HOY9MN", "orig_file_number": 43, "seqno_to_time_mapping": "N/A"}} +2023/08/16-13:15:37.392204 8651103744 EVENT_LOG_v1 {"time_micros": 1692159337392203, "job": 1, "event": "recovery_finished"} +2023/08/16-13:15:37.392255 8651103744 [db/version_set.cc:5180] Creating manifest 45 +2023/08/16-13:15:37.393529 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000036.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-13:15:37.393553 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x136e0abd0 +2023/08/16-13:15:37.393581 8651103744 DB pointer 0x137027e00 +2023/08/16-13:15:37.393709 6130921472 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/16-13:15:37.393711 6130921472 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 1/0 276.35 KB 0.2 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 72.7 0.00 0.00 1 0.004 0 0 0.0 0.0 + L1 1/0 96.95 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 2/0 373.30 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 72.7 0.00 0.00 1 0.004 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 72.7 0.00 0.00 1 0.004 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.7 0.00 0.00 1 0.004 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 21.14 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 21.14 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000021046d8#85520 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 6e-06 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** +2023/08/16-13:16:17.953053 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work +2023/08/16-13:16:17.953355 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692160697660985 b/rust/hyperlane_db/LOG.old.1692160697660985 new file mode 100644 index 0000000000..6d16dab926 --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692160697660985 @@ -0,0 +1,288 @@ +2023/08/16-13:20:30.683766 8651103744 RocksDB version: 8.1.1 +2023/08/16-13:20:30.684368 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/16-13:20:30.684370 8651103744 DB SUMMARY +2023/08/16-13:20:30.684371 8651103744 DB Session ID: PA1CFVFNVWGPQ34A1TE2 +2023/08/16-13:20:30.684408 8651103744 CURRENT file: CURRENT +2023/08/16-13:20:30.684409 8651103744 IDENTITY file: IDENTITY +2023/08/16-13:20:30.684419 8651103744 MANIFEST file: MANIFEST-000045 size: 492 Bytes +2023/08/16-13:20:30.684420 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 2, files: 000040.sst 000043.sst +2023/08/16-13:20:30.684421 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000044.log size: 1014346 ; +2023/08/16-13:20:30.684422 8651103744 Options.error_if_exists: 0 +2023/08/16-13:20:30.684423 8651103744 Options.create_if_missing: 1 +2023/08/16-13:20:30.684424 8651103744 Options.paranoid_checks: 1 +2023/08/16-13:20:30.684424 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/16-13:20:30.684425 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/16-13:20:30.684426 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/16-13:20:30.684426 8651103744 Options.env: 0x104dc3828 +2023/08/16-13:20:30.684427 8651103744 Options.fs: PosixFileSystem +2023/08/16-13:20:30.684428 8651103744 Options.info_log: 0x138805f78 +2023/08/16-13:20:30.684429 8651103744 Options.max_file_opening_threads: 16 +2023/08/16-13:20:30.684429 8651103744 Options.statistics: 0x0 +2023/08/16-13:20:30.684430 8651103744 Options.use_fsync: 0 +2023/08/16-13:20:30.684431 8651103744 Options.max_log_file_size: 0 +2023/08/16-13:20:30.684431 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/16-13:20:30.684432 8651103744 Options.log_file_time_to_roll: 0 +2023/08/16-13:20:30.684432 8651103744 Options.keep_log_file_num: 1000 +2023/08/16-13:20:30.684433 8651103744 Options.recycle_log_file_num: 0 +2023/08/16-13:20:30.684434 8651103744 Options.allow_fallocate: 1 +2023/08/16-13:20:30.684434 8651103744 Options.allow_mmap_reads: 0 +2023/08/16-13:20:30.684435 8651103744 Options.allow_mmap_writes: 0 +2023/08/16-13:20:30.684436 8651103744 Options.use_direct_reads: 0 +2023/08/16-13:20:30.684436 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/16-13:20:30.684437 8651103744 Options.create_missing_column_families: 0 +2023/08/16-13:20:30.684438 8651103744 Options.db_log_dir: +2023/08/16-13:20:30.684438 8651103744 Options.wal_dir: +2023/08/16-13:20:30.684439 8651103744 Options.table_cache_numshardbits: 6 +2023/08/16-13:20:30.684439 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/16-13:20:30.684440 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/16-13:20:30.684441 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/16-13:20:30.684441 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/16-13:20:30.684442 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/16-13:20:30.684443 8651103744 Options.advise_random_on_open: 1 +2023/08/16-13:20:30.684443 8651103744 Options.db_write_buffer_size: 0 +2023/08/16-13:20:30.684444 8651103744 Options.write_buffer_manager: 0x600003404820 +2023/08/16-13:20:30.684445 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/16-13:20:30.684445 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/16-13:20:30.684446 8651103744 Options.use_adaptive_mutex: 0 +2023/08/16-13:20:30.684446 8651103744 Options.rate_limiter: 0x0 +2023/08/16-13:20:30.684447 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/16-13:20:30.684448 8651103744 Options.wal_recovery_mode: 2 +2023/08/16-13:20:30.684449 8651103744 Options.enable_thread_tracking: 0 +2023/08/16-13:20:30.684449 8651103744 Options.enable_pipelined_write: 0 +2023/08/16-13:20:30.684450 8651103744 Options.unordered_write: 0 +2023/08/16-13:20:30.684450 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/16-13:20:30.684451 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/16-13:20:30.684452 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/16-13:20:30.684452 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/16-13:20:30.684453 8651103744 Options.row_cache: None +2023/08/16-13:20:30.684454 8651103744 Options.wal_filter: None +2023/08/16-13:20:30.684454 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/16-13:20:30.684455 8651103744 Options.allow_ingest_behind: 0 +2023/08/16-13:20:30.684456 8651103744 Options.two_write_queues: 0 +2023/08/16-13:20:30.684456 8651103744 Options.manual_wal_flush: 0 +2023/08/16-13:20:30.684457 8651103744 Options.wal_compression: 0 +2023/08/16-13:20:30.684457 8651103744 Options.atomic_flush: 0 +2023/08/16-13:20:30.684458 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/16-13:20:30.684459 8651103744 Options.persist_stats_to_disk: 0 +2023/08/16-13:20:30.684459 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/16-13:20:30.684460 8651103744 Options.log_readahead_size: 0 +2023/08/16-13:20:30.684461 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/16-13:20:30.684461 8651103744 Options.best_efforts_recovery: 0 +2023/08/16-13:20:30.684462 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/16-13:20:30.684463 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/16-13:20:30.684463 8651103744 Options.allow_data_in_errors: 0 +2023/08/16-13:20:30.684464 8651103744 Options.db_host_id: __hostname__ +2023/08/16-13:20:30.684465 8651103744 Options.enforce_single_del_contracts: true +2023/08/16-13:20:30.684465 8651103744 Options.max_background_jobs: 2 +2023/08/16-13:20:30.684466 8651103744 Options.max_background_compactions: -1 +2023/08/16-13:20:30.684467 8651103744 Options.max_subcompactions: 1 +2023/08/16-13:20:30.684467 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/16-13:20:30.684468 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/16-13:20:30.684469 8651103744 Options.delayed_write_rate : 16777216 +2023/08/16-13:20:30.684469 8651103744 Options.max_total_wal_size: 0 +2023/08/16-13:20:30.684470 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/16-13:20:30.684471 8651103744 Options.stats_dump_period_sec: 600 +2023/08/16-13:20:30.684471 8651103744 Options.stats_persist_period_sec: 600 +2023/08/16-13:20:30.684472 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/16-13:20:30.684473 8651103744 Options.max_open_files: -1 +2023/08/16-13:20:30.684473 8651103744 Options.bytes_per_sync: 0 +2023/08/16-13:20:30.684474 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/16-13:20:30.684474 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/16-13:20:30.684475 8651103744 Options.compaction_readahead_size: 0 +2023/08/16-13:20:30.684476 8651103744 Options.max_background_flushes: -1 +2023/08/16-13:20:30.684476 8651103744 Compression algorithms supported: +2023/08/16-13:20:30.684490 8651103744 kZSTD supported: 1 +2023/08/16-13:20:30.684491 8651103744 kZlibCompression supported: 1 +2023/08/16-13:20:30.684491 8651103744 kXpressCompression supported: 0 +2023/08/16-13:20:30.684492 8651103744 kSnappyCompression supported: 1 +2023/08/16-13:20:30.684493 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/16-13:20:30.684493 8651103744 kLZ4HCCompression supported: 1 +2023/08/16-13:20:30.684494 8651103744 kLZ4Compression supported: 1 +2023/08/16-13:20:30.684495 8651103744 kBZip2Compression supported: 1 +2023/08/16-13:20:30.684500 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/16-13:20:30.684501 8651103744 DMutex implementation: pthread_mutex_t +2023/08/16-13:20:30.684763 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000045 +2023/08/16-13:20:30.684839 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/16-13:20:30.684840 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/16-13:20:30.684841 8651103744 Options.merge_operator: None +2023/08/16-13:20:30.684841 8651103744 Options.compaction_filter: None +2023/08/16-13:20:30.684842 8651103744 Options.compaction_filter_factory: None +2023/08/16-13:20:30.684843 8651103744 Options.sst_partitioner_factory: None +2023/08/16-13:20:30.684843 8651103744 Options.memtable_factory: SkipListFactory +2023/08/16-13:20:30.684844 8651103744 Options.table_factory: BlockBasedTable +2023/08/16-13:20:30.684855 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600000f04640) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x600003a040d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/16-13:20:30.684856 8651103744 Options.write_buffer_size: 67108864 +2023/08/16-13:20:30.684857 8651103744 Options.max_write_buffer_number: 2 +2023/08/16-13:20:30.684857 8651103744 Options.compression: Snappy +2023/08/16-13:20:30.684858 8651103744 Options.bottommost_compression: Disabled +2023/08/16-13:20:30.684859 8651103744 Options.prefix_extractor: nullptr +2023/08/16-13:20:30.684859 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/16-13:20:30.684860 8651103744 Options.num_levels: 7 +2023/08/16-13:20:30.684861 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/16-13:20:30.684861 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/16-13:20:30.684862 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/16-13:20:30.684863 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/16-13:20:30.684863 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/16-13:20:30.684864 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/16-13:20:30.684865 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/16-13:20:30.684865 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/16-13:20:30.684866 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/16-13:20:30.684867 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/16-13:20:30.684867 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-13:20:30.684868 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/16-13:20:30.684869 8651103744 Options.compression_opts.window_bits: -14 +2023/08/16-13:20:30.684869 8651103744 Options.compression_opts.level: 32767 +2023/08/16-13:20:30.684870 8651103744 Options.compression_opts.strategy: 0 +2023/08/16-13:20:30.684870 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/16-13:20:30.684871 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/16-13:20:30.684872 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/16-13:20:30.684872 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/16-13:20:30.684873 8651103744 Options.compression_opts.enabled: false +2023/08/16-13:20:30.684874 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-13:20:30.684874 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/16-13:20:30.684875 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/16-13:20:30.684876 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/16-13:20:30.684876 8651103744 Options.target_file_size_base: 67108864 +2023/08/16-13:20:30.684877 8651103744 Options.target_file_size_multiplier: 1 +2023/08/16-13:20:30.684877 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/16-13:20:30.684878 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/16-13:20:30.684879 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/16-13:20:30.684880 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/16-13:20:30.684880 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/16-13:20:30.684881 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/16-13:20:30.684882 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/16-13:20:30.684882 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/16-13:20:30.684883 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/16-13:20:30.684884 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/16-13:20:30.684884 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/16-13:20:30.684885 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/16-13:20:30.684885 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/16-13:20:30.684886 8651103744 Options.arena_block_size: 1048576 +2023/08/16-13:20:30.684887 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/16-13:20:30.684887 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/16-13:20:30.684888 8651103744 Options.disable_auto_compactions: 0 +2023/08/16-13:20:30.684889 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/16-13:20:30.684890 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/16-13:20:30.684891 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/16-13:20:30.684891 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/16-13:20:30.684892 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/16-13:20:30.684892 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/16-13:20:30.684893 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/16-13:20:30.684895 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/16-13:20:30.684896 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/16-13:20:30.684897 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/16-13:20:30.684898 8651103744 Options.table_properties_collectors: +2023/08/16-13:20:30.684898 8651103744 Options.inplace_update_support: 0 +2023/08/16-13:20:30.684899 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/16-13:20:30.684900 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/16-13:20:30.684900 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/16-13:20:30.684901 8651103744 Options.memtable_huge_page_size: 0 +2023/08/16-13:20:30.684902 8651103744 Options.bloom_locality: 0 +2023/08/16-13:20:30.684902 8651103744 Options.max_successive_merges: 0 +2023/08/16-13:20:30.684903 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/16-13:20:30.684904 8651103744 Options.paranoid_file_checks: 0 +2023/08/16-13:20:30.684904 8651103744 Options.force_consistency_checks: 1 +2023/08/16-13:20:30.684905 8651103744 Options.report_bg_io_stats: 0 +2023/08/16-13:20:30.684905 8651103744 Options.ttl: 2592000 +2023/08/16-13:20:30.684906 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/16-13:20:30.684907 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/16-13:20:30.684907 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/16-13:20:30.684908 8651103744 Options.enable_blob_files: false +2023/08/16-13:20:30.684909 8651103744 Options.min_blob_size: 0 +2023/08/16-13:20:30.684909 8651103744 Options.blob_file_size: 268435456 +2023/08/16-13:20:30.684910 8651103744 Options.blob_compression_type: NoCompression +2023/08/16-13:20:30.684911 8651103744 Options.enable_blob_garbage_collection: false +2023/08/16-13:20:30.684911 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/16-13:20:30.684912 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/16-13:20:30.684913 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/16-13:20:30.684913 8651103744 Options.blob_file_starting_level: 0 +2023/08/16-13:20:30.684914 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/16-13:20:30.685608 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000045 succeeded,manifest_file_number is 45, next_file_number is 47, last_sequence is 8188, log_number is 37,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 37 +2023/08/16-13:20:30.685612 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 37 +2023/08/16-13:20:30.685779 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/16-13:20:30.685877 8651103744 EVENT_LOG_v1 {"time_micros": 1692159630685873, "job": 1, "event": "recovery_started", "wal_files": [44]} +2023/08/16-13:20:30.685879 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #44 mode 2 +2023/08/16-13:20:30.693511 8651103744 EVENT_LOG_v1 {"time_micros": 1692159630693494, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 48, "file_size": 343303, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 8190, "largest_seqno": 15570, "table_properties": {"data_size": 340031, "index_size": 8138, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 616714, "raw_average_key_size": 84, "raw_value_size": 287602, "raw_average_value_size": 39, "num_data_blocks": 152, "num_entries": 7267, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692159630, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "PA1CFVFNVWGPQ34A1TE2", "orig_file_number": 48, "seqno_to_time_mapping": "N/A"}} +2023/08/16-13:20:30.693569 8651103744 EVENT_LOG_v1 {"time_micros": 1692159630693568, "job": 1, "event": "recovery_finished"} +2023/08/16-13:20:30.693622 8651103744 [db/version_set.cc:5180] Creating manifest 50 +2023/08/16-13:20:30.694917 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000044.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-13:20:30.694943 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x1388060d0 +2023/08/16-13:20:30.694979 8651103744 DB pointer 0x139013000 +2023/08/16-13:20:30.695121 6128398336 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/16-13:20:30.695124 6128398336 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 2/0 611.61 KB 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 122.9 0.00 0.00 1 0.003 0 0 0.0 0.0 + L1 1/0 96.95 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 3/0 708.56 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 122.9 0.00 0.00 1 0.003 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 122.9 0.00 0.00 1 0.003 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 122.9 0.00 0.00 1 0.003 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 31.88 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 31.88 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x600003a040d8#85797 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 9e-06 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** +2023/08/16-13:22:46.654328 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work +2023/08/16-13:22:46.656079 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692160774841732 b/rust/hyperlane_db/LOG.old.1692160774841732 new file mode 100644 index 0000000000..4df5a75de3 --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692160774841732 @@ -0,0 +1,286 @@ +2023/08/16-13:38:17.661821 8651103744 RocksDB version: 8.1.1 +2023/08/16-13:38:17.662326 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/16-13:38:17.662328 8651103744 DB SUMMARY +2023/08/16-13:38:17.662329 8651103744 DB Session ID: EC7WX8I3OQ2Y35H4I3NP +2023/08/16-13:38:17.662370 8651103744 CURRENT file: CURRENT +2023/08/16-13:38:17.662371 8651103744 IDENTITY file: IDENTITY +2023/08/16-13:38:17.662381 8651103744 MANIFEST file: MANIFEST-000050 size: 679 Bytes +2023/08/16-13:38:17.662382 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 3, files: 000040.sst 000043.sst 000048.sst +2023/08/16-13:38:17.662383 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000049.log size: 883570 ; +2023/08/16-13:38:17.662384 8651103744 Options.error_if_exists: 0 +2023/08/16-13:38:17.662385 8651103744 Options.create_if_missing: 1 +2023/08/16-13:38:17.662386 8651103744 Options.paranoid_checks: 1 +2023/08/16-13:38:17.662386 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/16-13:38:17.662387 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/16-13:38:17.662388 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/16-13:38:17.662388 8651103744 Options.env: 0x1069e7848 +2023/08/16-13:38:17.662389 8651103744 Options.fs: PosixFileSystem +2023/08/16-13:38:17.662390 8651103744 Options.info_log: 0x137e05fb8 +2023/08/16-13:38:17.662391 8651103744 Options.max_file_opening_threads: 16 +2023/08/16-13:38:17.662392 8651103744 Options.statistics: 0x0 +2023/08/16-13:38:17.662392 8651103744 Options.use_fsync: 0 +2023/08/16-13:38:17.662393 8651103744 Options.max_log_file_size: 0 +2023/08/16-13:38:17.662394 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/16-13:38:17.662394 8651103744 Options.log_file_time_to_roll: 0 +2023/08/16-13:38:17.662395 8651103744 Options.keep_log_file_num: 1000 +2023/08/16-13:38:17.662395 8651103744 Options.recycle_log_file_num: 0 +2023/08/16-13:38:17.662396 8651103744 Options.allow_fallocate: 1 +2023/08/16-13:38:17.662397 8651103744 Options.allow_mmap_reads: 0 +2023/08/16-13:38:17.662397 8651103744 Options.allow_mmap_writes: 0 +2023/08/16-13:38:17.662398 8651103744 Options.use_direct_reads: 0 +2023/08/16-13:38:17.662399 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/16-13:38:17.662399 8651103744 Options.create_missing_column_families: 0 +2023/08/16-13:38:17.662400 8651103744 Options.db_log_dir: +2023/08/16-13:38:17.662400 8651103744 Options.wal_dir: +2023/08/16-13:38:17.662401 8651103744 Options.table_cache_numshardbits: 6 +2023/08/16-13:38:17.662402 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/16-13:38:17.662402 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/16-13:38:17.662403 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/16-13:38:17.662404 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/16-13:38:17.662404 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/16-13:38:17.662405 8651103744 Options.advise_random_on_open: 1 +2023/08/16-13:38:17.662406 8651103744 Options.db_write_buffer_size: 0 +2023/08/16-13:38:17.662406 8651103744 Options.write_buffer_manager: 0x6000026cc820 +2023/08/16-13:38:17.662407 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/16-13:38:17.662408 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/16-13:38:17.662408 8651103744 Options.use_adaptive_mutex: 0 +2023/08/16-13:38:17.662409 8651103744 Options.rate_limiter: 0x0 +2023/08/16-13:38:17.662410 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/16-13:38:17.662410 8651103744 Options.wal_recovery_mode: 2 +2023/08/16-13:38:17.662411 8651103744 Options.enable_thread_tracking: 0 +2023/08/16-13:38:17.662412 8651103744 Options.enable_pipelined_write: 0 +2023/08/16-13:38:17.662412 8651103744 Options.unordered_write: 0 +2023/08/16-13:38:17.662413 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/16-13:38:17.662413 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/16-13:38:17.662414 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/16-13:38:17.662415 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/16-13:38:17.662415 8651103744 Options.row_cache: None +2023/08/16-13:38:17.662416 8651103744 Options.wal_filter: None +2023/08/16-13:38:17.662417 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/16-13:38:17.662417 8651103744 Options.allow_ingest_behind: 0 +2023/08/16-13:38:17.662418 8651103744 Options.two_write_queues: 0 +2023/08/16-13:38:17.662419 8651103744 Options.manual_wal_flush: 0 +2023/08/16-13:38:17.662419 8651103744 Options.wal_compression: 0 +2023/08/16-13:38:17.662420 8651103744 Options.atomic_flush: 0 +2023/08/16-13:38:17.662420 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/16-13:38:17.662421 8651103744 Options.persist_stats_to_disk: 0 +2023/08/16-13:38:17.662422 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/16-13:38:17.662422 8651103744 Options.log_readahead_size: 0 +2023/08/16-13:38:17.662423 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/16-13:38:17.662424 8651103744 Options.best_efforts_recovery: 0 +2023/08/16-13:38:17.662424 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/16-13:38:17.662425 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/16-13:38:17.662426 8651103744 Options.allow_data_in_errors: 0 +2023/08/16-13:38:17.662426 8651103744 Options.db_host_id: __hostname__ +2023/08/16-13:38:17.662427 8651103744 Options.enforce_single_del_contracts: true +2023/08/16-13:38:17.662428 8651103744 Options.max_background_jobs: 2 +2023/08/16-13:38:17.662428 8651103744 Options.max_background_compactions: -1 +2023/08/16-13:38:17.662429 8651103744 Options.max_subcompactions: 1 +2023/08/16-13:38:17.662430 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/16-13:38:17.662430 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/16-13:38:17.662431 8651103744 Options.delayed_write_rate : 16777216 +2023/08/16-13:38:17.662432 8651103744 Options.max_total_wal_size: 0 +2023/08/16-13:38:17.662432 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/16-13:38:17.662433 8651103744 Options.stats_dump_period_sec: 600 +2023/08/16-13:38:17.662434 8651103744 Options.stats_persist_period_sec: 600 +2023/08/16-13:38:17.662434 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/16-13:38:17.662435 8651103744 Options.max_open_files: -1 +2023/08/16-13:38:17.662436 8651103744 Options.bytes_per_sync: 0 +2023/08/16-13:38:17.662436 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/16-13:38:17.662437 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/16-13:38:17.662437 8651103744 Options.compaction_readahead_size: 0 +2023/08/16-13:38:17.662438 8651103744 Options.max_background_flushes: -1 +2023/08/16-13:38:17.662439 8651103744 Compression algorithms supported: +2023/08/16-13:38:17.662456 8651103744 kZSTD supported: 1 +2023/08/16-13:38:17.662456 8651103744 kZlibCompression supported: 1 +2023/08/16-13:38:17.662457 8651103744 kXpressCompression supported: 0 +2023/08/16-13:38:17.662458 8651103744 kSnappyCompression supported: 1 +2023/08/16-13:38:17.662458 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/16-13:38:17.662459 8651103744 kLZ4HCCompression supported: 1 +2023/08/16-13:38:17.662460 8651103744 kLZ4Compression supported: 1 +2023/08/16-13:38:17.662460 8651103744 kBZip2Compression supported: 1 +2023/08/16-13:38:17.662467 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/16-13:38:17.662468 8651103744 DMutex implementation: pthread_mutex_t +2023/08/16-13:38:17.662727 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000050 +2023/08/16-13:38:17.662808 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/16-13:38:17.662810 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/16-13:38:17.662810 8651103744 Options.merge_operator: None +2023/08/16-13:38:17.662811 8651103744 Options.compaction_filter: None +2023/08/16-13:38:17.662812 8651103744 Options.compaction_filter_factory: None +2023/08/16-13:38:17.662812 8651103744 Options.sst_partitioner_factory: None +2023/08/16-13:38:17.662813 8651103744 Options.memtable_factory: SkipListFactory +2023/08/16-13:38:17.662814 8651103744 Options.table_factory: BlockBasedTable +2023/08/16-13:38:17.662825 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600001dc2300) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000028cc0d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/16-13:38:17.662826 8651103744 Options.write_buffer_size: 67108864 +2023/08/16-13:38:17.662827 8651103744 Options.max_write_buffer_number: 2 +2023/08/16-13:38:17.662828 8651103744 Options.compression: Snappy +2023/08/16-13:38:17.662829 8651103744 Options.bottommost_compression: Disabled +2023/08/16-13:38:17.662829 8651103744 Options.prefix_extractor: nullptr +2023/08/16-13:38:17.662830 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/16-13:38:17.662831 8651103744 Options.num_levels: 7 +2023/08/16-13:38:17.662831 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/16-13:38:17.662832 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/16-13:38:17.662833 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/16-13:38:17.662833 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/16-13:38:17.662834 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/16-13:38:17.662835 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/16-13:38:17.662836 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/16-13:38:17.662836 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/16-13:38:17.662837 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/16-13:38:17.662838 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/16-13:38:17.662838 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-13:38:17.662839 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/16-13:38:17.662839 8651103744 Options.compression_opts.window_bits: -14 +2023/08/16-13:38:17.662840 8651103744 Options.compression_opts.level: 32767 +2023/08/16-13:38:17.662841 8651103744 Options.compression_opts.strategy: 0 +2023/08/16-13:38:17.662841 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/16-13:38:17.662842 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/16-13:38:17.662843 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/16-13:38:17.662843 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/16-13:38:17.662844 8651103744 Options.compression_opts.enabled: false +2023/08/16-13:38:17.662845 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-13:38:17.662845 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/16-13:38:17.662846 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/16-13:38:17.662847 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/16-13:38:17.662847 8651103744 Options.target_file_size_base: 67108864 +2023/08/16-13:38:17.662848 8651103744 Options.target_file_size_multiplier: 1 +2023/08/16-13:38:17.662848 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/16-13:38:17.662849 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/16-13:38:17.662850 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/16-13:38:17.662851 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/16-13:38:17.662851 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/16-13:38:17.662852 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/16-13:38:17.662853 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/16-13:38:17.662853 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/16-13:38:17.662854 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/16-13:38:17.662855 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/16-13:38:17.662855 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/16-13:38:17.662856 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/16-13:38:17.662856 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/16-13:38:17.662857 8651103744 Options.arena_block_size: 1048576 +2023/08/16-13:38:17.662858 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/16-13:38:17.662858 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/16-13:38:17.662859 8651103744 Options.disable_auto_compactions: 0 +2023/08/16-13:38:17.662860 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/16-13:38:17.662861 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/16-13:38:17.662861 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/16-13:38:17.662862 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/16-13:38:17.662862 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/16-13:38:17.662863 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/16-13:38:17.662864 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/16-13:38:17.662866 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/16-13:38:17.662867 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/16-13:38:17.662867 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/16-13:38:17.662868 8651103744 Options.table_properties_collectors: +2023/08/16-13:38:17.662869 8651103744 Options.inplace_update_support: 0 +2023/08/16-13:38:17.662870 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/16-13:38:17.662870 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/16-13:38:17.662871 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/16-13:38:17.662872 8651103744 Options.memtable_huge_page_size: 0 +2023/08/16-13:38:17.662872 8651103744 Options.bloom_locality: 0 +2023/08/16-13:38:17.662873 8651103744 Options.max_successive_merges: 0 +2023/08/16-13:38:17.662874 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/16-13:38:17.662874 8651103744 Options.paranoid_file_checks: 0 +2023/08/16-13:38:17.662875 8651103744 Options.force_consistency_checks: 1 +2023/08/16-13:38:17.662875 8651103744 Options.report_bg_io_stats: 0 +2023/08/16-13:38:17.662876 8651103744 Options.ttl: 2592000 +2023/08/16-13:38:17.662877 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/16-13:38:17.662877 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/16-13:38:17.662878 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/16-13:38:17.662879 8651103744 Options.enable_blob_files: false +2023/08/16-13:38:17.662879 8651103744 Options.min_blob_size: 0 +2023/08/16-13:38:17.662880 8651103744 Options.blob_file_size: 268435456 +2023/08/16-13:38:17.662881 8651103744 Options.blob_compression_type: NoCompression +2023/08/16-13:38:17.662881 8651103744 Options.enable_blob_garbage_collection: false +2023/08/16-13:38:17.662882 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/16-13:38:17.662884 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/16-13:38:17.662885 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/16-13:38:17.662887 8651103744 Options.blob_file_starting_level: 0 +2023/08/16-13:38:17.662888 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/16-13:38:17.663744 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000050 succeeded,manifest_file_number is 50, next_file_number is 52, last_sequence is 15570, log_number is 45,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 45 +2023/08/16-13:38:17.663747 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 45 +2023/08/16-13:38:17.663902 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/16-13:38:17.664002 8651103744 EVENT_LOG_v1 {"time_micros": 1692160697663996, "job": 1, "event": "recovery_started", "wal_files": [49]} +2023/08/16-13:38:17.664004 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #49 mode 2 +2023/08/16-13:38:17.674399 8651103744 EVENT_LOG_v1 {"time_micros": 1692160697674381, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 53, "file_size": 303816, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 15572, "largest_seqno": 22198, "table_properties": {"data_size": 300802, "index_size": 6696, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 499764, "raw_average_key_size": 79, "raw_value_size": 273170, "raw_average_value_size": 43, "num_data_blocks": 134, "num_entries": 6297, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692160697, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "EC7WX8I3OQ2Y35H4I3NP", "orig_file_number": 53, "seqno_to_time_mapping": "N/A"}} +2023/08/16-13:38:17.674452 8651103744 EVENT_LOG_v1 {"time_micros": 1692160697674451, "job": 1, "event": "recovery_finished"} +2023/08/16-13:38:17.674509 8651103744 [db/version_set.cc:5180] Creating manifest 55 +2023/08/16-13:38:17.676273 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000049.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-13:38:17.676310 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x137e06110 +2023/08/16-13:38:17.676370 8651103744 DB pointer 0x14000c800 +2023/08/16-13:38:17.676591 6098890752 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/16-13:38:17.676595 6098890752 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 3/0 908.30 KB 0.8 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 71.5 0.00 0.00 1 0.004 0 0 0.0 0.0 + L1 1/0 96.95 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 4/0 1005.26 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 71.5 0.00 0.00 1 0.004 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 71.5 0.00 0.00 1 0.004 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.5 0.00 0.00 1 0.004 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 21.05 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 21.05 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000028cc0d8#86268 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 1.3e-05 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692167576188502 b/rust/hyperlane_db/LOG.old.1692167576188502 new file mode 100644 index 0000000000..145d3bc61c --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692167576188502 @@ -0,0 +1,304 @@ +2023/08/16-13:39:34.842204 8651103744 RocksDB version: 8.1.1 +2023/08/16-13:39:34.842822 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/16-13:39:34.842825 8651103744 DB SUMMARY +2023/08/16-13:39:34.842826 8651103744 DB Session ID: FP2AZWSQ1JJHZXJB6S98 +2023/08/16-13:39:34.842881 8651103744 CURRENT file: CURRENT +2023/08/16-13:39:34.842883 8651103744 IDENTITY file: IDENTITY +2023/08/16-13:39:34.842896 8651103744 MANIFEST file: MANIFEST-000055 size: 869 Bytes +2023/08/16-13:39:34.842897 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 4, files: 000040.sst 000043.sst 000048.sst 000053.sst +2023/08/16-13:39:34.842899 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000054.log size: 5198 ; +2023/08/16-13:39:34.842900 8651103744 Options.error_if_exists: 0 +2023/08/16-13:39:34.842901 8651103744 Options.create_if_missing: 1 +2023/08/16-13:39:34.842902 8651103744 Options.paranoid_checks: 1 +2023/08/16-13:39:34.842903 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/16-13:39:34.842904 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/16-13:39:34.842905 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/16-13:39:34.842906 8651103744 Options.env: 0x105237848 +2023/08/16-13:39:34.842907 8651103744 Options.fs: PosixFileSystem +2023/08/16-13:39:34.842908 8651103744 Options.info_log: 0x139e0aa28 +2023/08/16-13:39:34.842909 8651103744 Options.max_file_opening_threads: 16 +2023/08/16-13:39:34.842910 8651103744 Options.statistics: 0x0 +2023/08/16-13:39:34.842911 8651103744 Options.use_fsync: 0 +2023/08/16-13:39:34.842912 8651103744 Options.max_log_file_size: 0 +2023/08/16-13:39:34.842913 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/16-13:39:34.842913 8651103744 Options.log_file_time_to_roll: 0 +2023/08/16-13:39:34.842914 8651103744 Options.keep_log_file_num: 1000 +2023/08/16-13:39:34.842915 8651103744 Options.recycle_log_file_num: 0 +2023/08/16-13:39:34.842916 8651103744 Options.allow_fallocate: 1 +2023/08/16-13:39:34.842917 8651103744 Options.allow_mmap_reads: 0 +2023/08/16-13:39:34.842918 8651103744 Options.allow_mmap_writes: 0 +2023/08/16-13:39:34.842918 8651103744 Options.use_direct_reads: 0 +2023/08/16-13:39:34.842919 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/16-13:39:34.842920 8651103744 Options.create_missing_column_families: 0 +2023/08/16-13:39:34.842921 8651103744 Options.db_log_dir: +2023/08/16-13:39:34.842922 8651103744 Options.wal_dir: +2023/08/16-13:39:34.842923 8651103744 Options.table_cache_numshardbits: 6 +2023/08/16-13:39:34.842924 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/16-13:39:34.842924 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/16-13:39:34.842925 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/16-13:39:34.842926 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/16-13:39:34.842927 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/16-13:39:34.842928 8651103744 Options.advise_random_on_open: 1 +2023/08/16-13:39:34.842929 8651103744 Options.db_write_buffer_size: 0 +2023/08/16-13:39:34.842930 8651103744 Options.write_buffer_manager: 0x600000fd1380 +2023/08/16-13:39:34.842931 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/16-13:39:34.842931 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/16-13:39:34.842932 8651103744 Options.use_adaptive_mutex: 0 +2023/08/16-13:39:34.842933 8651103744 Options.rate_limiter: 0x0 +2023/08/16-13:39:34.842934 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/16-13:39:34.842935 8651103744 Options.wal_recovery_mode: 2 +2023/08/16-13:39:34.842936 8651103744 Options.enable_thread_tracking: 0 +2023/08/16-13:39:34.842937 8651103744 Options.enable_pipelined_write: 0 +2023/08/16-13:39:34.842938 8651103744 Options.unordered_write: 0 +2023/08/16-13:39:34.842938 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/16-13:39:34.842939 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/16-13:39:34.842940 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/16-13:39:34.842941 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/16-13:39:34.842942 8651103744 Options.row_cache: None +2023/08/16-13:39:34.842943 8651103744 Options.wal_filter: None +2023/08/16-13:39:34.842944 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/16-13:39:34.842944 8651103744 Options.allow_ingest_behind: 0 +2023/08/16-13:39:34.842945 8651103744 Options.two_write_queues: 0 +2023/08/16-13:39:34.842946 8651103744 Options.manual_wal_flush: 0 +2023/08/16-13:39:34.842947 8651103744 Options.wal_compression: 0 +2023/08/16-13:39:34.842948 8651103744 Options.atomic_flush: 0 +2023/08/16-13:39:34.842949 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/16-13:39:34.842950 8651103744 Options.persist_stats_to_disk: 0 +2023/08/16-13:39:34.842951 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/16-13:39:34.842951 8651103744 Options.log_readahead_size: 0 +2023/08/16-13:39:34.842952 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/16-13:39:34.842953 8651103744 Options.best_efforts_recovery: 0 +2023/08/16-13:39:34.842954 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/16-13:39:34.842955 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/16-13:39:34.842956 8651103744 Options.allow_data_in_errors: 0 +2023/08/16-13:39:34.842957 8651103744 Options.db_host_id: __hostname__ +2023/08/16-13:39:34.842958 8651103744 Options.enforce_single_del_contracts: true +2023/08/16-13:39:34.842958 8651103744 Options.max_background_jobs: 2 +2023/08/16-13:39:34.842959 8651103744 Options.max_background_compactions: -1 +2023/08/16-13:39:34.842960 8651103744 Options.max_subcompactions: 1 +2023/08/16-13:39:34.842961 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/16-13:39:34.842962 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/16-13:39:34.842963 8651103744 Options.delayed_write_rate : 16777216 +2023/08/16-13:39:34.842964 8651103744 Options.max_total_wal_size: 0 +2023/08/16-13:39:34.842964 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/16-13:39:34.842965 8651103744 Options.stats_dump_period_sec: 600 +2023/08/16-13:39:34.842966 8651103744 Options.stats_persist_period_sec: 600 +2023/08/16-13:39:34.842967 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/16-13:39:34.842968 8651103744 Options.max_open_files: -1 +2023/08/16-13:39:34.842969 8651103744 Options.bytes_per_sync: 0 +2023/08/16-13:39:34.842970 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/16-13:39:34.842971 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/16-13:39:34.842972 8651103744 Options.compaction_readahead_size: 0 +2023/08/16-13:39:34.842972 8651103744 Options.max_background_flushes: -1 +2023/08/16-13:39:34.842973 8651103744 Compression algorithms supported: +2023/08/16-13:39:34.842991 8651103744 kZSTD supported: 1 +2023/08/16-13:39:34.842992 8651103744 kZlibCompression supported: 1 +2023/08/16-13:39:34.842993 8651103744 kXpressCompression supported: 0 +2023/08/16-13:39:34.842994 8651103744 kSnappyCompression supported: 1 +2023/08/16-13:39:34.842995 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/16-13:39:34.842996 8651103744 kLZ4HCCompression supported: 1 +2023/08/16-13:39:34.842997 8651103744 kLZ4Compression supported: 1 +2023/08/16-13:39:34.842998 8651103744 kBZip2Compression supported: 1 +2023/08/16-13:39:34.843007 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/16-13:39:34.843008 8651103744 DMutex implementation: pthread_mutex_t +2023/08/16-13:39:34.843150 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000055 +2023/08/16-13:39:34.843244 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/16-13:39:34.843245 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/16-13:39:34.843246 8651103744 Options.merge_operator: None +2023/08/16-13:39:34.843247 8651103744 Options.compaction_filter: None +2023/08/16-13:39:34.843248 8651103744 Options.compaction_filter_factory: None +2023/08/16-13:39:34.843249 8651103744 Options.sst_partitioner_factory: None +2023/08/16-13:39:34.843250 8651103744 Options.memtable_factory: SkipListFactory +2023/08/16-13:39:34.843251 8651103744 Options.table_factory: BlockBasedTable +2023/08/16-13:39:34.843265 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x6000034dc640) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000001d06d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/16-13:39:34.843267 8651103744 Options.write_buffer_size: 67108864 +2023/08/16-13:39:34.843268 8651103744 Options.max_write_buffer_number: 2 +2023/08/16-13:39:34.843269 8651103744 Options.compression: Snappy +2023/08/16-13:39:34.843270 8651103744 Options.bottommost_compression: Disabled +2023/08/16-13:39:34.843271 8651103744 Options.prefix_extractor: nullptr +2023/08/16-13:39:34.843271 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/16-13:39:34.843272 8651103744 Options.num_levels: 7 +2023/08/16-13:39:34.843273 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/16-13:39:34.843274 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/16-13:39:34.843275 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/16-13:39:34.843276 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/16-13:39:34.843277 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/16-13:39:34.843278 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/16-13:39:34.843279 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/16-13:39:34.843280 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/16-13:39:34.843280 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/16-13:39:34.843281 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/16-13:39:34.843282 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-13:39:34.843283 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/16-13:39:34.843284 8651103744 Options.compression_opts.window_bits: -14 +2023/08/16-13:39:34.843285 8651103744 Options.compression_opts.level: 32767 +2023/08/16-13:39:34.843286 8651103744 Options.compression_opts.strategy: 0 +2023/08/16-13:39:34.843287 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/16-13:39:34.843287 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/16-13:39:34.843288 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/16-13:39:34.843289 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/16-13:39:34.843290 8651103744 Options.compression_opts.enabled: false +2023/08/16-13:39:34.843291 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-13:39:34.843292 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/16-13:39:34.843293 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/16-13:39:34.843294 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/16-13:39:34.843294 8651103744 Options.target_file_size_base: 67108864 +2023/08/16-13:39:34.843295 8651103744 Options.target_file_size_multiplier: 1 +2023/08/16-13:39:34.843296 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/16-13:39:34.843297 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/16-13:39:34.843298 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/16-13:39:34.843299 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/16-13:39:34.843300 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/16-13:39:34.843301 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/16-13:39:34.843302 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/16-13:39:34.843303 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/16-13:39:34.843304 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/16-13:39:34.843305 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/16-13:39:34.843305 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/16-13:39:34.843306 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/16-13:39:34.843307 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/16-13:39:34.843308 8651103744 Options.arena_block_size: 1048576 +2023/08/16-13:39:34.843309 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/16-13:39:34.843310 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/16-13:39:34.843311 8651103744 Options.disable_auto_compactions: 0 +2023/08/16-13:39:34.843312 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/16-13:39:34.843313 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/16-13:39:34.843314 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/16-13:39:34.843315 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/16-13:39:34.843315 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/16-13:39:34.843316 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/16-13:39:34.843317 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/16-13:39:34.843320 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/16-13:39:34.843321 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/16-13:39:34.843322 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/16-13:39:34.843323 8651103744 Options.table_properties_collectors: +2023/08/16-13:39:34.843324 8651103744 Options.inplace_update_support: 0 +2023/08/16-13:39:34.843325 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/16-13:39:34.843326 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/16-13:39:34.843327 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/16-13:39:34.843327 8651103744 Options.memtable_huge_page_size: 0 +2023/08/16-13:39:34.843328 8651103744 Options.bloom_locality: 0 +2023/08/16-13:39:34.843329 8651103744 Options.max_successive_merges: 0 +2023/08/16-13:39:34.843330 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/16-13:39:34.843331 8651103744 Options.paranoid_file_checks: 0 +2023/08/16-13:39:34.843332 8651103744 Options.force_consistency_checks: 1 +2023/08/16-13:39:34.843333 8651103744 Options.report_bg_io_stats: 0 +2023/08/16-13:39:34.843333 8651103744 Options.ttl: 2592000 +2023/08/16-13:39:34.843334 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/16-13:39:34.843335 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/16-13:39:34.843336 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/16-13:39:34.843337 8651103744 Options.enable_blob_files: false +2023/08/16-13:39:34.843338 8651103744 Options.min_blob_size: 0 +2023/08/16-13:39:34.843339 8651103744 Options.blob_file_size: 268435456 +2023/08/16-13:39:34.843340 8651103744 Options.blob_compression_type: NoCompression +2023/08/16-13:39:34.843340 8651103744 Options.enable_blob_garbage_collection: false +2023/08/16-13:39:34.843341 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/16-13:39:34.843342 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/16-13:39:34.843343 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/16-13:39:34.843344 8651103744 Options.blob_file_starting_level: 0 +2023/08/16-13:39:34.843345 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/16-13:39:34.844386 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000055 succeeded,manifest_file_number is 55, next_file_number is 57, last_sequence is 22198, log_number is 50,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 50 +2023/08/16-13:39:34.844390 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 50 +2023/08/16-13:39:34.844443 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/16-13:39:34.844557 8651103744 EVENT_LOG_v1 {"time_micros": 1692160774844552, "job": 1, "event": "recovery_started", "wal_files": [54]} +2023/08/16-13:39:34.844559 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #54 mode 2 +2023/08/16-13:39:34.845036 8651103744 EVENT_LOG_v1 {"time_micros": 1692160774845022, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 58, "file_size": 2561, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 22199, "largest_seqno": 22228, "table_properties": {"data_size": 1522, "index_size": 91, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 1360, "raw_average_key_size": 45, "raw_value_size": 3414, "raw_average_value_size": 113, "num_data_blocks": 2, "num_entries": 30, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692160774, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "FP2AZWSQ1JJHZXJB6S98", "orig_file_number": 58, "seqno_to_time_mapping": "N/A"}} +2023/08/16-13:39:34.845082 8651103744 EVENT_LOG_v1 {"time_micros": 1692160774845081, "job": 1, "event": "recovery_finished"} +2023/08/16-13:39:34.845124 8651103744 [db/version_set.cc:5180] Creating manifest 60 +2023/08/16-13:39:34.846264 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000054.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-13:39:34.846294 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x139e0ab80 +2023/08/16-13:39:34.846328 8651103744 DB pointer 0x13a021400 +2023/08/16-13:39:34.846376 6122582016 [db/compaction/compaction_job.cc:1988] [default] [JOB 3] Compacting 4@0 + 1@1 files to L1, score 1.00 +2023/08/16-13:39:34.846380 6122582016 [db/compaction/compaction_job.cc:1992] [default]: Compaction start summary: Base version 2 Base level 0, inputs: [58(2561B) 53(296KB) 48(335KB) 43(276KB)], [40(96KB)] +2023/08/16-13:39:34.846387 6122582016 EVENT_LOG_v1 {"time_micros": 1692160774846382, "job": 3, "event": "compaction_started", "compaction_reason": "LevelL0FilesNum", "files_L0": [58, 53, 48, 43], "files_L1": [40], "score": 1, "input_data_size": 1031944, "oldest_snapshot_seqno": -1} +2023/08/16-13:39:34.846482 6123728896 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/16-13:39:34.846504 6123728896 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 4/4 910.80 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 5.8 0.00 0.00 1 0.000 0 0 0.0 0.0 + L1 1/1 96.95 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 5/5 1007.76 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 5.8 0.00 0.00 1 0.000 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 5.8 0.00 0.00 1 0.000 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.8 0.00 0.00 1 0.000 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 0.76 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 0.76 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000001d06d8#86352 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 7e-06 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(2,4.02 KB,0.0490427%) + +** File Read Latency Histogram By Level [default] ** +2023/08/16-13:39:34.857837 6122582016 [db/compaction/compaction_job.cc:1592] [default] [JOB 3] Generated table #63: 21468 keys, 996541 bytes, temperature: kUnknown +2023/08/16-13:39:34.857866 6122582016 EVENT_LOG_v1 {"time_micros": 1692160774857846, "cf_name": "default", "job": 3, "event": "table_file_creation", "file_number": 63, "file_size": 996541, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 0, "largest_seqno": 0, "table_properties": {"data_size": 988913, "index_size": 23770, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 1775046, "raw_average_key_size": 82, "raw_value_size": 917769, "raw_average_value_size": 42, "num_data_blocks": 459, "num_entries": 21468, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692109142, "oldest_key_time": 0, "file_creation_time": 1692160774, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "FP2AZWSQ1JJHZXJB6S98", "orig_file_number": 63, "seqno_to_time_mapping": "N/A"}} +2023/08/16-13:39:34.858091 6122582016 (Original Log Time 2023/08/16-13:39:34.857980) [db/compaction/compaction_job.cc:1663] [default] [JOB 3] Compacted 4@0 + 1@1 files to L1 => 996541 bytes +2023/08/16-13:39:34.858092 6122582016 (Original Log Time 2023/08/16-13:39:34.858064) [db/compaction/compaction_job.cc:885] [default] compacted to: files[0 1 0 0 0 0 0] max score 0.00, MB/sec: 89.6 rd, 86.5 wr, level 1, files in(4, 1) out(1 +0 blob) MB in(0.9, 0.1 +0.0 blob) out(1.0 +0.0 blob), read-write-amplify(2.2) write-amplify(1.1) OK, records in: 21471, records dropped: 3 output_compression: Snappy +2023/08/16-13:39:34.858094 6122582016 (Original Log Time 2023/08/16-13:39:34.858077) EVENT_LOG_v1 {"time_micros": 1692160774858068, "job": 3, "event": "compaction_finished", "compaction_time_micros": 11515, "compaction_time_cpu_micros": 11302, "output_level": 1, "num_output_files": 1, "total_output_size": 996541, "num_input_records": 21471, "num_output_records": 21468, "num_subcompactions": 1, "output_compression": "Snappy", "num_single_delete_mismatches": 0, "num_single_delete_fallthrough": 0, "lsm_state": [0, 1, 0, 0, 0, 0, 0]} +2023/08/16-13:39:34.858163 6122582016 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000058.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-13:39:34.858167 6122582016 EVENT_LOG_v1 {"time_micros": 1692160774858165, "job": 3, "event": "table_file_deletion", "file_number": 58} +2023/08/16-13:39:34.858215 6122582016 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000053.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-13:39:34.858218 6122582016 EVENT_LOG_v1 {"time_micros": 1692160774858217, "job": 3, "event": "table_file_deletion", "file_number": 53} +2023/08/16-13:39:34.858268 6122582016 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000048.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-13:39:34.858271 6122582016 EVENT_LOG_v1 {"time_micros": 1692160774858270, "job": 3, "event": "table_file_deletion", "file_number": 48} +2023/08/16-13:39:34.858334 6122582016 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000043.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-13:39:34.858337 6122582016 EVENT_LOG_v1 {"time_micros": 1692160774858336, "job": 3, "event": "table_file_deletion", "file_number": 43} +2023/08/16-13:39:34.858393 6122582016 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000040.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-13:39:34.858395 6122582016 EVENT_LOG_v1 {"time_micros": 1692160774858394, "job": 3, "event": "table_file_deletion", "file_number": 40} diff --git a/rust/hyperlane_db/LOG.old.1692167598179047 b/rust/hyperlane_db/LOG.old.1692167598179047 new file mode 100644 index 0000000000..a8420430db --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692167598179047 @@ -0,0 +1,286 @@ +2023/08/16-15:32:56.189487 8651103744 RocksDB version: 8.1.1 +2023/08/16-15:32:56.190192 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/16-15:32:56.190193 8651103744 DB SUMMARY +2023/08/16-15:32:56.190194 8651103744 DB Session ID: IQCSHTAF38O84JGOUP5W +2023/08/16-15:32:56.190231 8651103744 CURRENT file: CURRENT +2023/08/16-15:32:56.190232 8651103744 IDENTITY file: IDENTITY +2023/08/16-15:32:56.190241 8651103744 MANIFEST file: MANIFEST-000060 size: 1256 Bytes +2023/08/16-15:32:56.190242 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 1, files: 000063.sst +2023/08/16-15:32:56.190243 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000059.log size: 7342 ; +2023/08/16-15:32:56.190244 8651103744 Options.error_if_exists: 0 +2023/08/16-15:32:56.190245 8651103744 Options.create_if_missing: 1 +2023/08/16-15:32:56.190246 8651103744 Options.paranoid_checks: 1 +2023/08/16-15:32:56.190246 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/16-15:32:56.190247 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/16-15:32:56.190248 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/16-15:32:56.190248 8651103744 Options.env: 0x1066a3858 +2023/08/16-15:32:56.190249 8651103744 Options.fs: PosixFileSystem +2023/08/16-15:32:56.190250 8651103744 Options.info_log: 0x12e709528 +2023/08/16-15:32:56.190250 8651103744 Options.max_file_opening_threads: 16 +2023/08/16-15:32:56.190251 8651103744 Options.statistics: 0x0 +2023/08/16-15:32:56.190252 8651103744 Options.use_fsync: 0 +2023/08/16-15:32:56.190252 8651103744 Options.max_log_file_size: 0 +2023/08/16-15:32:56.190253 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/16-15:32:56.190253 8651103744 Options.log_file_time_to_roll: 0 +2023/08/16-15:32:56.190254 8651103744 Options.keep_log_file_num: 1000 +2023/08/16-15:32:56.190255 8651103744 Options.recycle_log_file_num: 0 +2023/08/16-15:32:56.190255 8651103744 Options.allow_fallocate: 1 +2023/08/16-15:32:56.190256 8651103744 Options.allow_mmap_reads: 0 +2023/08/16-15:32:56.190256 8651103744 Options.allow_mmap_writes: 0 +2023/08/16-15:32:56.190257 8651103744 Options.use_direct_reads: 0 +2023/08/16-15:32:56.190257 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/16-15:32:56.190258 8651103744 Options.create_missing_column_families: 0 +2023/08/16-15:32:56.190259 8651103744 Options.db_log_dir: +2023/08/16-15:32:56.190259 8651103744 Options.wal_dir: +2023/08/16-15:32:56.190260 8651103744 Options.table_cache_numshardbits: 6 +2023/08/16-15:32:56.190260 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/16-15:32:56.190261 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/16-15:32:56.190262 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/16-15:32:56.190262 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/16-15:32:56.190263 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/16-15:32:56.190263 8651103744 Options.advise_random_on_open: 1 +2023/08/16-15:32:56.190264 8651103744 Options.db_write_buffer_size: 0 +2023/08/16-15:32:56.190264 8651103744 Options.write_buffer_manager: 0x600001894820 +2023/08/16-15:32:56.190265 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/16-15:32:56.190266 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/16-15:32:56.190266 8651103744 Options.use_adaptive_mutex: 0 +2023/08/16-15:32:56.190267 8651103744 Options.rate_limiter: 0x0 +2023/08/16-15:32:56.190268 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/16-15:32:56.190268 8651103744 Options.wal_recovery_mode: 2 +2023/08/16-15:32:56.190269 8651103744 Options.enable_thread_tracking: 0 +2023/08/16-15:32:56.190270 8651103744 Options.enable_pipelined_write: 0 +2023/08/16-15:32:56.190270 8651103744 Options.unordered_write: 0 +2023/08/16-15:32:56.190271 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/16-15:32:56.190271 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/16-15:32:56.190272 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/16-15:32:56.190272 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/16-15:32:56.190273 8651103744 Options.row_cache: None +2023/08/16-15:32:56.190274 8651103744 Options.wal_filter: None +2023/08/16-15:32:56.190274 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/16-15:32:56.190275 8651103744 Options.allow_ingest_behind: 0 +2023/08/16-15:32:56.190275 8651103744 Options.two_write_queues: 0 +2023/08/16-15:32:56.190276 8651103744 Options.manual_wal_flush: 0 +2023/08/16-15:32:56.190277 8651103744 Options.wal_compression: 0 +2023/08/16-15:32:56.190277 8651103744 Options.atomic_flush: 0 +2023/08/16-15:32:56.190278 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/16-15:32:56.190278 8651103744 Options.persist_stats_to_disk: 0 +2023/08/16-15:32:56.190279 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/16-15:32:56.190280 8651103744 Options.log_readahead_size: 0 +2023/08/16-15:32:56.190280 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/16-15:32:56.190281 8651103744 Options.best_efforts_recovery: 0 +2023/08/16-15:32:56.190282 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/16-15:32:56.190282 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/16-15:32:56.190283 8651103744 Options.allow_data_in_errors: 0 +2023/08/16-15:32:56.190283 8651103744 Options.db_host_id: __hostname__ +2023/08/16-15:32:56.190284 8651103744 Options.enforce_single_del_contracts: true +2023/08/16-15:32:56.190285 8651103744 Options.max_background_jobs: 2 +2023/08/16-15:32:56.190285 8651103744 Options.max_background_compactions: -1 +2023/08/16-15:32:56.190286 8651103744 Options.max_subcompactions: 1 +2023/08/16-15:32:56.190286 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/16-15:32:56.190287 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/16-15:32:56.190288 8651103744 Options.delayed_write_rate : 16777216 +2023/08/16-15:32:56.190288 8651103744 Options.max_total_wal_size: 0 +2023/08/16-15:32:56.190289 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/16-15:32:56.190289 8651103744 Options.stats_dump_period_sec: 600 +2023/08/16-15:32:56.190290 8651103744 Options.stats_persist_period_sec: 600 +2023/08/16-15:32:56.190291 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/16-15:32:56.190291 8651103744 Options.max_open_files: -1 +2023/08/16-15:32:56.190292 8651103744 Options.bytes_per_sync: 0 +2023/08/16-15:32:56.190292 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/16-15:32:56.190293 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/16-15:32:56.190294 8651103744 Options.compaction_readahead_size: 0 +2023/08/16-15:32:56.190294 8651103744 Options.max_background_flushes: -1 +2023/08/16-15:32:56.190295 8651103744 Compression algorithms supported: +2023/08/16-15:32:56.190308 8651103744 kZSTD supported: 1 +2023/08/16-15:32:56.190308 8651103744 kZlibCompression supported: 1 +2023/08/16-15:32:56.190309 8651103744 kXpressCompression supported: 0 +2023/08/16-15:32:56.190310 8651103744 kSnappyCompression supported: 1 +2023/08/16-15:32:56.190310 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/16-15:32:56.190311 8651103744 kLZ4HCCompression supported: 1 +2023/08/16-15:32:56.190311 8651103744 kLZ4Compression supported: 1 +2023/08/16-15:32:56.190312 8651103744 kBZip2Compression supported: 1 +2023/08/16-15:32:56.190319 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/16-15:32:56.190320 8651103744 DMutex implementation: pthread_mutex_t +2023/08/16-15:32:56.190580 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000060 +2023/08/16-15:32:56.190632 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/16-15:32:56.190634 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/16-15:32:56.190635 8651103744 Options.merge_operator: None +2023/08/16-15:32:56.190635 8651103744 Options.compaction_filter: None +2023/08/16-15:32:56.190636 8651103744 Options.compaction_filter_factory: None +2023/08/16-15:32:56.190636 8651103744 Options.sst_partitioner_factory: None +2023/08/16-15:32:56.190637 8651103744 Options.memtable_factory: SkipListFactory +2023/08/16-15:32:56.190638 8651103744 Options.table_factory: BlockBasedTable +2023/08/16-15:32:56.190650 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x60000239bbe0) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000016940d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/16-15:32:56.190651 8651103744 Options.write_buffer_size: 67108864 +2023/08/16-15:32:56.190652 8651103744 Options.max_write_buffer_number: 2 +2023/08/16-15:32:56.190653 8651103744 Options.compression: Snappy +2023/08/16-15:32:56.190653 8651103744 Options.bottommost_compression: Disabled +2023/08/16-15:32:56.190654 8651103744 Options.prefix_extractor: nullptr +2023/08/16-15:32:56.190655 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/16-15:32:56.190655 8651103744 Options.num_levels: 7 +2023/08/16-15:32:56.190656 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/16-15:32:56.190656 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/16-15:32:56.190657 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/16-15:32:56.190658 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/16-15:32:56.190658 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/16-15:32:56.190659 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/16-15:32:56.190660 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/16-15:32:56.190660 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/16-15:32:56.190661 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/16-15:32:56.190661 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/16-15:32:56.190662 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-15:32:56.190663 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/16-15:32:56.190663 8651103744 Options.compression_opts.window_bits: -14 +2023/08/16-15:32:56.190664 8651103744 Options.compression_opts.level: 32767 +2023/08/16-15:32:56.190664 8651103744 Options.compression_opts.strategy: 0 +2023/08/16-15:32:56.190665 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/16-15:32:56.190666 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/16-15:32:56.190666 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/16-15:32:56.190667 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/16-15:32:56.190667 8651103744 Options.compression_opts.enabled: false +2023/08/16-15:32:56.190668 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-15:32:56.190669 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/16-15:32:56.190669 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/16-15:32:56.190670 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/16-15:32:56.190670 8651103744 Options.target_file_size_base: 67108864 +2023/08/16-15:32:56.190671 8651103744 Options.target_file_size_multiplier: 1 +2023/08/16-15:32:56.190671 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/16-15:32:56.190672 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/16-15:32:56.190673 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/16-15:32:56.190673 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/16-15:32:56.190674 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/16-15:32:56.190675 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/16-15:32:56.190675 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/16-15:32:56.190676 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/16-15:32:56.190677 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/16-15:32:56.190677 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/16-15:32:56.190678 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/16-15:32:56.190678 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/16-15:32:56.190679 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/16-15:32:56.190680 8651103744 Options.arena_block_size: 1048576 +2023/08/16-15:32:56.190680 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/16-15:32:56.190681 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/16-15:32:56.190681 8651103744 Options.disable_auto_compactions: 0 +2023/08/16-15:32:56.190682 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/16-15:32:56.190683 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/16-15:32:56.190683 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/16-15:32:56.190684 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/16-15:32:56.190685 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/16-15:32:56.190685 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/16-15:32:56.190686 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/16-15:32:56.190688 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/16-15:32:56.190689 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/16-15:32:56.190689 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/16-15:32:56.190690 8651103744 Options.table_properties_collectors: +2023/08/16-15:32:56.190691 8651103744 Options.inplace_update_support: 0 +2023/08/16-15:32:56.190692 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/16-15:32:56.190692 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/16-15:32:56.190693 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/16-15:32:56.190693 8651103744 Options.memtable_huge_page_size: 0 +2023/08/16-15:32:56.190694 8651103744 Options.bloom_locality: 0 +2023/08/16-15:32:56.190695 8651103744 Options.max_successive_merges: 0 +2023/08/16-15:32:56.190695 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/16-15:32:56.190696 8651103744 Options.paranoid_file_checks: 0 +2023/08/16-15:32:56.190696 8651103744 Options.force_consistency_checks: 1 +2023/08/16-15:32:56.190697 8651103744 Options.report_bg_io_stats: 0 +2023/08/16-15:32:56.190698 8651103744 Options.ttl: 2592000 +2023/08/16-15:32:56.190698 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/16-15:32:56.190699 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/16-15:32:56.190699 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/16-15:32:56.190700 8651103744 Options.enable_blob_files: false +2023/08/16-15:32:56.190700 8651103744 Options.min_blob_size: 0 +2023/08/16-15:32:56.190701 8651103744 Options.blob_file_size: 268435456 +2023/08/16-15:32:56.190702 8651103744 Options.blob_compression_type: NoCompression +2023/08/16-15:32:56.190702 8651103744 Options.enable_blob_garbage_collection: false +2023/08/16-15:32:56.190703 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/16-15:32:56.190703 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/16-15:32:56.190704 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/16-15:32:56.190705 8651103744 Options.blob_file_starting_level: 0 +2023/08/16-15:32:56.190705 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/16-15:32:56.191511 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000060 succeeded,manifest_file_number is 60, next_file_number is 65, last_sequence is 22228, log_number is 55,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 55 +2023/08/16-15:32:56.191516 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 55 +2023/08/16-15:32:56.191737 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/16-15:32:56.191845 8651103744 EVENT_LOG_v1 {"time_micros": 1692167576191842, "job": 1, "event": "recovery_started", "wal_files": [59]} +2023/08/16-15:32:56.191847 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #59 mode 2 +2023/08/16-15:32:56.192334 8651103744 EVENT_LOG_v1 {"time_micros": 1692167576192318, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 66, "file_size": 3671, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 22229, "largest_seqno": 22300, "table_properties": {"data_size": 2632, "index_size": 91, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 3264, "raw_average_key_size": 45, "raw_value_size": 3068, "raw_average_value_size": 42, "num_data_blocks": 2, "num_entries": 72, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692167576, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "IQCSHTAF38O84JGOUP5W", "orig_file_number": 66, "seqno_to_time_mapping": "N/A"}} +2023/08/16-15:32:56.192394 8651103744 EVENT_LOG_v1 {"time_micros": 1692167576192392, "job": 1, "event": "recovery_finished"} +2023/08/16-15:32:56.192441 8651103744 [db/version_set.cc:5180] Creating manifest 68 +2023/08/16-15:32:56.193581 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000059.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-15:32:56.193592 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x12e709680 +2023/08/16-15:32:56.193624 8651103744 DB pointer 0x12f013a00 +2023/08/16-15:32:56.193825 6102315008 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/16-15:32:56.193827 6102315008 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 1/0 3.58 KB 0.2 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 11.7 0.00 0.00 1 0.000 0 0 0.0 0.0 + L1 1/0 973.18 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 2/0 976.77 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 11.7 0.00 0.00 1 0.000 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 11.7 0.00 0.00 1 0.000 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.7 0.00 0.00 1 0.000 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 1.10 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 1.10 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000016940d8#89908 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 7e-06 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692168714159548 b/rust/hyperlane_db/LOG.old.1692168714159548 new file mode 100644 index 0000000000..27628c4470 --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692168714159548 @@ -0,0 +1,286 @@ +2023/08/16-15:33:18.179489 8651103744 RocksDB version: 8.1.1 +2023/08/16-15:33:18.180102 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/16-15:33:18.180105 8651103744 DB SUMMARY +2023/08/16-15:33:18.180106 8651103744 DB Session ID: M874ML6HF1GIQZ6CP7AH +2023/08/16-15:33:18.180195 8651103744 CURRENT file: CURRENT +2023/08/16-15:33:18.180197 8651103744 IDENTITY file: IDENTITY +2023/08/16-15:33:18.180212 8651103744 MANIFEST file: MANIFEST-000068 size: 475 Bytes +2023/08/16-15:33:18.180214 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 2, files: 000063.sst 000066.sst +2023/08/16-15:33:18.180216 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000067.log size: 13792 ; +2023/08/16-15:33:18.180218 8651103744 Options.error_if_exists: 0 +2023/08/16-15:33:18.180219 8651103744 Options.create_if_missing: 1 +2023/08/16-15:33:18.180220 8651103744 Options.paranoid_checks: 1 +2023/08/16-15:33:18.180221 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/16-15:33:18.180222 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/16-15:33:18.180223 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/16-15:33:18.180224 8651103744 Options.env: 0x106647858 +2023/08/16-15:33:18.180225 8651103744 Options.fs: PosixFileSystem +2023/08/16-15:33:18.180226 8651103744 Options.info_log: 0x131e0a708 +2023/08/16-15:33:18.180227 8651103744 Options.max_file_opening_threads: 16 +2023/08/16-15:33:18.180228 8651103744 Options.statistics: 0x0 +2023/08/16-15:33:18.180229 8651103744 Options.use_fsync: 0 +2023/08/16-15:33:18.180230 8651103744 Options.max_log_file_size: 0 +2023/08/16-15:33:18.180231 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/16-15:33:18.180233 8651103744 Options.log_file_time_to_roll: 0 +2023/08/16-15:33:18.180233 8651103744 Options.keep_log_file_num: 1000 +2023/08/16-15:33:18.180234 8651103744 Options.recycle_log_file_num: 0 +2023/08/16-15:33:18.180235 8651103744 Options.allow_fallocate: 1 +2023/08/16-15:33:18.180236 8651103744 Options.allow_mmap_reads: 0 +2023/08/16-15:33:18.180237 8651103744 Options.allow_mmap_writes: 0 +2023/08/16-15:33:18.180238 8651103744 Options.use_direct_reads: 0 +2023/08/16-15:33:18.180239 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/16-15:33:18.180240 8651103744 Options.create_missing_column_families: 0 +2023/08/16-15:33:18.180241 8651103744 Options.db_log_dir: +2023/08/16-15:33:18.180242 8651103744 Options.wal_dir: +2023/08/16-15:33:18.180243 8651103744 Options.table_cache_numshardbits: 6 +2023/08/16-15:33:18.180244 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/16-15:33:18.180245 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/16-15:33:18.180246 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/16-15:33:18.180247 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/16-15:33:18.180248 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/16-15:33:18.180249 8651103744 Options.advise_random_on_open: 1 +2023/08/16-15:33:18.180250 8651103744 Options.db_write_buffer_size: 0 +2023/08/16-15:33:18.180251 8651103744 Options.write_buffer_manager: 0x6000036d5380 +2023/08/16-15:33:18.180252 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/16-15:33:18.180253 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/16-15:33:18.180254 8651103744 Options.use_adaptive_mutex: 0 +2023/08/16-15:33:18.180255 8651103744 Options.rate_limiter: 0x0 +2023/08/16-15:33:18.180256 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/16-15:33:18.180257 8651103744 Options.wal_recovery_mode: 2 +2023/08/16-15:33:18.180258 8651103744 Options.enable_thread_tracking: 0 +2023/08/16-15:33:18.180259 8651103744 Options.enable_pipelined_write: 0 +2023/08/16-15:33:18.180260 8651103744 Options.unordered_write: 0 +2023/08/16-15:33:18.180261 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/16-15:33:18.180262 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/16-15:33:18.180262 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/16-15:33:18.180263 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/16-15:33:18.180264 8651103744 Options.row_cache: None +2023/08/16-15:33:18.180265 8651103744 Options.wal_filter: None +2023/08/16-15:33:18.180266 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/16-15:33:18.180267 8651103744 Options.allow_ingest_behind: 0 +2023/08/16-15:33:18.180268 8651103744 Options.two_write_queues: 0 +2023/08/16-15:33:18.180269 8651103744 Options.manual_wal_flush: 0 +2023/08/16-15:33:18.180270 8651103744 Options.wal_compression: 0 +2023/08/16-15:33:18.180271 8651103744 Options.atomic_flush: 0 +2023/08/16-15:33:18.180272 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/16-15:33:18.180273 8651103744 Options.persist_stats_to_disk: 0 +2023/08/16-15:33:18.180274 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/16-15:33:18.180275 8651103744 Options.log_readahead_size: 0 +2023/08/16-15:33:18.180276 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/16-15:33:18.180277 8651103744 Options.best_efforts_recovery: 0 +2023/08/16-15:33:18.180278 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/16-15:33:18.180279 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/16-15:33:18.180280 8651103744 Options.allow_data_in_errors: 0 +2023/08/16-15:33:18.180281 8651103744 Options.db_host_id: __hostname__ +2023/08/16-15:33:18.180282 8651103744 Options.enforce_single_del_contracts: true +2023/08/16-15:33:18.180283 8651103744 Options.max_background_jobs: 2 +2023/08/16-15:33:18.180284 8651103744 Options.max_background_compactions: -1 +2023/08/16-15:33:18.180285 8651103744 Options.max_subcompactions: 1 +2023/08/16-15:33:18.180286 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/16-15:33:18.180287 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/16-15:33:18.180288 8651103744 Options.delayed_write_rate : 16777216 +2023/08/16-15:33:18.180289 8651103744 Options.max_total_wal_size: 0 +2023/08/16-15:33:18.180290 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/16-15:33:18.180291 8651103744 Options.stats_dump_period_sec: 600 +2023/08/16-15:33:18.180292 8651103744 Options.stats_persist_period_sec: 600 +2023/08/16-15:33:18.180293 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/16-15:33:18.180294 8651103744 Options.max_open_files: -1 +2023/08/16-15:33:18.180295 8651103744 Options.bytes_per_sync: 0 +2023/08/16-15:33:18.180296 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/16-15:33:18.180297 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/16-15:33:18.180298 8651103744 Options.compaction_readahead_size: 0 +2023/08/16-15:33:18.180299 8651103744 Options.max_background_flushes: -1 +2023/08/16-15:33:18.180300 8651103744 Compression algorithms supported: +2023/08/16-15:33:18.180319 8651103744 kZSTD supported: 1 +2023/08/16-15:33:18.180321 8651103744 kZlibCompression supported: 1 +2023/08/16-15:33:18.180322 8651103744 kXpressCompression supported: 0 +2023/08/16-15:33:18.180323 8651103744 kSnappyCompression supported: 1 +2023/08/16-15:33:18.180324 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/16-15:33:18.180325 8651103744 kLZ4HCCompression supported: 1 +2023/08/16-15:33:18.180326 8651103744 kLZ4Compression supported: 1 +2023/08/16-15:33:18.180327 8651103744 kBZip2Compression supported: 1 +2023/08/16-15:33:18.180335 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/16-15:33:18.180336 8651103744 DMutex implementation: pthread_mutex_t +2023/08/16-15:33:18.180512 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000068 +2023/08/16-15:33:18.180579 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/16-15:33:18.180580 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/16-15:33:18.180582 8651103744 Options.merge_operator: None +2023/08/16-15:33:18.180583 8651103744 Options.compaction_filter: None +2023/08/16-15:33:18.180583 8651103744 Options.compaction_filter_factory: None +2023/08/16-15:33:18.180585 8651103744 Options.sst_partitioner_factory: None +2023/08/16-15:33:18.180586 8651103744 Options.memtable_factory: SkipListFactory +2023/08/16-15:33:18.180587 8651103744 Options.table_factory: BlockBasedTable +2023/08/16-15:33:18.180620 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600000dd8640) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000038d46d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/16-15:33:18.180624 8651103744 Options.write_buffer_size: 67108864 +2023/08/16-15:33:18.180625 8651103744 Options.max_write_buffer_number: 2 +2023/08/16-15:33:18.180626 8651103744 Options.compression: Snappy +2023/08/16-15:33:18.180627 8651103744 Options.bottommost_compression: Disabled +2023/08/16-15:33:18.180628 8651103744 Options.prefix_extractor: nullptr +2023/08/16-15:33:18.180629 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/16-15:33:18.180630 8651103744 Options.num_levels: 7 +2023/08/16-15:33:18.180631 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/16-15:33:18.180632 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/16-15:33:18.180633 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/16-15:33:18.180634 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/16-15:33:18.180635 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/16-15:33:18.180636 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/16-15:33:18.180637 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/16-15:33:18.180638 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/16-15:33:18.180639 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/16-15:33:18.180640 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/16-15:33:18.180641 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-15:33:18.180642 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/16-15:33:18.180643 8651103744 Options.compression_opts.window_bits: -14 +2023/08/16-15:33:18.180644 8651103744 Options.compression_opts.level: 32767 +2023/08/16-15:33:18.180645 8651103744 Options.compression_opts.strategy: 0 +2023/08/16-15:33:18.180646 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/16-15:33:18.180647 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/16-15:33:18.180648 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/16-15:33:18.180649 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/16-15:33:18.180650 8651103744 Options.compression_opts.enabled: false +2023/08/16-15:33:18.180651 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-15:33:18.180652 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/16-15:33:18.180653 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/16-15:33:18.180654 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/16-15:33:18.180655 8651103744 Options.target_file_size_base: 67108864 +2023/08/16-15:33:18.180656 8651103744 Options.target_file_size_multiplier: 1 +2023/08/16-15:33:18.180657 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/16-15:33:18.180658 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/16-15:33:18.180659 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/16-15:33:18.180660 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/16-15:33:18.180661 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/16-15:33:18.180662 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/16-15:33:18.180663 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/16-15:33:18.180664 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/16-15:33:18.180665 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/16-15:33:18.180666 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/16-15:33:18.180667 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/16-15:33:18.180668 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/16-15:33:18.180669 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/16-15:33:18.180670 8651103744 Options.arena_block_size: 1048576 +2023/08/16-15:33:18.180671 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/16-15:33:18.180672 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/16-15:33:18.180673 8651103744 Options.disable_auto_compactions: 0 +2023/08/16-15:33:18.180674 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/16-15:33:18.180675 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/16-15:33:18.180676 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/16-15:33:18.180677 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/16-15:33:18.180678 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/16-15:33:18.180679 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/16-15:33:18.180680 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/16-15:33:18.180683 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/16-15:33:18.180684 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/16-15:33:18.180685 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/16-15:33:18.180687 8651103744 Options.table_properties_collectors: +2023/08/16-15:33:18.180688 8651103744 Options.inplace_update_support: 0 +2023/08/16-15:33:18.180689 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/16-15:33:18.180690 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/16-15:33:18.180691 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/16-15:33:18.180692 8651103744 Options.memtable_huge_page_size: 0 +2023/08/16-15:33:18.180693 8651103744 Options.bloom_locality: 0 +2023/08/16-15:33:18.180694 8651103744 Options.max_successive_merges: 0 +2023/08/16-15:33:18.180695 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/16-15:33:18.180696 8651103744 Options.paranoid_file_checks: 0 +2023/08/16-15:33:18.180697 8651103744 Options.force_consistency_checks: 1 +2023/08/16-15:33:18.180698 8651103744 Options.report_bg_io_stats: 0 +2023/08/16-15:33:18.180699 8651103744 Options.ttl: 2592000 +2023/08/16-15:33:18.180700 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/16-15:33:18.180701 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/16-15:33:18.180702 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/16-15:33:18.180703 8651103744 Options.enable_blob_files: false +2023/08/16-15:33:18.180704 8651103744 Options.min_blob_size: 0 +2023/08/16-15:33:18.180705 8651103744 Options.blob_file_size: 268435456 +2023/08/16-15:33:18.180706 8651103744 Options.blob_compression_type: NoCompression +2023/08/16-15:33:18.180707 8651103744 Options.enable_blob_garbage_collection: false +2023/08/16-15:33:18.180708 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/16-15:33:18.180709 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/16-15:33:18.180710 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/16-15:33:18.180711 8651103744 Options.blob_file_starting_level: 0 +2023/08/16-15:33:18.180712 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/16-15:33:18.181424 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000068 succeeded,manifest_file_number is 68, next_file_number is 70, last_sequence is 22300, log_number is 60,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 60 +2023/08/16-15:33:18.181427 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 60 +2023/08/16-15:33:18.181481 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/16-15:33:18.181614 8651103744 EVENT_LOG_v1 {"time_micros": 1692167598181609, "job": 1, "event": "recovery_started", "wal_files": [67]} +2023/08/16-15:33:18.181616 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #67 mode 2 +2023/08/16-15:33:18.182197 8651103744 EVENT_LOG_v1 {"time_micros": 1692167598182182, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 71, "file_size": 6369, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 22301, "largest_seqno": 22432, "table_properties": {"data_size": 5317, "index_size": 123, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 5984, "raw_average_key_size": 45, "raw_value_size": 5956, "raw_average_value_size": 45, "num_data_blocks": 3, "num_entries": 132, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692167598, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "M874ML6HF1GIQZ6CP7AH", "orig_file_number": 71, "seqno_to_time_mapping": "N/A"}} +2023/08/16-15:33:18.182244 8651103744 EVENT_LOG_v1 {"time_micros": 1692167598182243, "job": 1, "event": "recovery_finished"} +2023/08/16-15:33:18.182285 8651103744 [db/version_set.cc:5180] Creating manifest 73 +2023/08/16-15:33:18.183350 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000067.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-15:33:18.183360 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x131e0ac70 +2023/08/16-15:33:18.183409 8651103744 DB pointer 0x132021400 +2023/08/16-15:33:18.183603 6102691840 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/16-15:33:18.183607 6102691840 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 2/0 9.80 KB 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 13.4 0.00 0.00 1 0.000 0 0 0.0 0.0 + L1 1/0 973.18 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 3/0 982.99 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 13.4 0.00 0.00 1 0.000 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 13.4 0.00 0.00 1 0.000 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.4 0.00 0.00 1 0.000 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 2.02 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 2.02 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000038d46d8#90767 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 1e-05 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692175657441236 b/rust/hyperlane_db/LOG.old.1692175657441236 new file mode 100644 index 0000000000..dd63f5406a --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692175657441236 @@ -0,0 +1,286 @@ +2023/08/16-15:51:54.160112 8651103744 RocksDB version: 8.1.1 +2023/08/16-15:51:54.160689 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/16-15:51:54.160691 8651103744 DB SUMMARY +2023/08/16-15:51:54.160693 8651103744 DB Session ID: RN9LFTYUUXHICJSMNSJK +2023/08/16-15:51:54.160763 8651103744 CURRENT file: CURRENT +2023/08/16-15:51:54.160764 8651103744 IDENTITY file: IDENTITY +2023/08/16-15:51:54.160778 8651103744 MANIFEST file: MANIFEST-000073 size: 641 Bytes +2023/08/16-15:51:54.160780 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 3, files: 000063.sst 000066.sst 000071.sst +2023/08/16-15:51:54.160781 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000072.log size: 16434 ; +2023/08/16-15:51:54.160783 8651103744 Options.error_if_exists: 0 +2023/08/16-15:51:54.160784 8651103744 Options.create_if_missing: 1 +2023/08/16-15:51:54.160785 8651103744 Options.paranoid_checks: 1 +2023/08/16-15:51:54.160786 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/16-15:51:54.160787 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/16-15:51:54.160788 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/16-15:51:54.160789 8651103744 Options.env: 0x1046a3858 +2023/08/16-15:51:54.160790 8651103744 Options.fs: PosixFileSystem +2023/08/16-15:51:54.160791 8651103744 Options.info_log: 0x1480060f8 +2023/08/16-15:51:54.160792 8651103744 Options.max_file_opening_threads: 16 +2023/08/16-15:51:54.160793 8651103744 Options.statistics: 0x0 +2023/08/16-15:51:54.160793 8651103744 Options.use_fsync: 0 +2023/08/16-15:51:54.160794 8651103744 Options.max_log_file_size: 0 +2023/08/16-15:51:54.160795 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/16-15:51:54.160796 8651103744 Options.log_file_time_to_roll: 0 +2023/08/16-15:51:54.160797 8651103744 Options.keep_log_file_num: 1000 +2023/08/16-15:51:54.160798 8651103744 Options.recycle_log_file_num: 0 +2023/08/16-15:51:54.160799 8651103744 Options.allow_fallocate: 1 +2023/08/16-15:51:54.160799 8651103744 Options.allow_mmap_reads: 0 +2023/08/16-15:51:54.160800 8651103744 Options.allow_mmap_writes: 0 +2023/08/16-15:51:54.160801 8651103744 Options.use_direct_reads: 0 +2023/08/16-15:51:54.160802 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/16-15:51:54.160803 8651103744 Options.create_missing_column_families: 0 +2023/08/16-15:51:54.160804 8651103744 Options.db_log_dir: +2023/08/16-15:51:54.160804 8651103744 Options.wal_dir: +2023/08/16-15:51:54.160805 8651103744 Options.table_cache_numshardbits: 6 +2023/08/16-15:51:54.160806 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/16-15:51:54.160807 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/16-15:51:54.160808 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/16-15:51:54.160809 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/16-15:51:54.160810 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/16-15:51:54.160810 8651103744 Options.advise_random_on_open: 1 +2023/08/16-15:51:54.160811 8651103744 Options.db_write_buffer_size: 0 +2023/08/16-15:51:54.160812 8651103744 Options.write_buffer_manager: 0x6000001fc820 +2023/08/16-15:51:54.160813 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/16-15:51:54.160814 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/16-15:51:54.160815 8651103744 Options.use_adaptive_mutex: 0 +2023/08/16-15:51:54.160815 8651103744 Options.rate_limiter: 0x0 +2023/08/16-15:51:54.160816 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/16-15:51:54.160817 8651103744 Options.wal_recovery_mode: 2 +2023/08/16-15:51:54.160818 8651103744 Options.enable_thread_tracking: 0 +2023/08/16-15:51:54.160819 8651103744 Options.enable_pipelined_write: 0 +2023/08/16-15:51:54.160820 8651103744 Options.unordered_write: 0 +2023/08/16-15:51:54.160821 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/16-15:51:54.160821 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/16-15:51:54.160822 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/16-15:51:54.160823 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/16-15:51:54.160824 8651103744 Options.row_cache: None +2023/08/16-15:51:54.160825 8651103744 Options.wal_filter: None +2023/08/16-15:51:54.160826 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/16-15:51:54.160827 8651103744 Options.allow_ingest_behind: 0 +2023/08/16-15:51:54.160827 8651103744 Options.two_write_queues: 0 +2023/08/16-15:51:54.160828 8651103744 Options.manual_wal_flush: 0 +2023/08/16-15:51:54.160829 8651103744 Options.wal_compression: 0 +2023/08/16-15:51:54.160830 8651103744 Options.atomic_flush: 0 +2023/08/16-15:51:54.160831 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/16-15:51:54.160832 8651103744 Options.persist_stats_to_disk: 0 +2023/08/16-15:51:54.160833 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/16-15:51:54.160833 8651103744 Options.log_readahead_size: 0 +2023/08/16-15:51:54.160834 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/16-15:51:54.160835 8651103744 Options.best_efforts_recovery: 0 +2023/08/16-15:51:54.160836 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/16-15:51:54.160837 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/16-15:51:54.160838 8651103744 Options.allow_data_in_errors: 0 +2023/08/16-15:51:54.160839 8651103744 Options.db_host_id: __hostname__ +2023/08/16-15:51:54.160840 8651103744 Options.enforce_single_del_contracts: true +2023/08/16-15:51:54.160841 8651103744 Options.max_background_jobs: 2 +2023/08/16-15:51:54.160841 8651103744 Options.max_background_compactions: -1 +2023/08/16-15:51:54.160842 8651103744 Options.max_subcompactions: 1 +2023/08/16-15:51:54.160843 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/16-15:51:54.160844 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/16-15:51:54.160845 8651103744 Options.delayed_write_rate : 16777216 +2023/08/16-15:51:54.160846 8651103744 Options.max_total_wal_size: 0 +2023/08/16-15:51:54.160847 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/16-15:51:54.160848 8651103744 Options.stats_dump_period_sec: 600 +2023/08/16-15:51:54.160848 8651103744 Options.stats_persist_period_sec: 600 +2023/08/16-15:51:54.160849 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/16-15:51:54.160850 8651103744 Options.max_open_files: -1 +2023/08/16-15:51:54.160851 8651103744 Options.bytes_per_sync: 0 +2023/08/16-15:51:54.160852 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/16-15:51:54.160853 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/16-15:51:54.160854 8651103744 Options.compaction_readahead_size: 0 +2023/08/16-15:51:54.160854 8651103744 Options.max_background_flushes: -1 +2023/08/16-15:51:54.160855 8651103744 Compression algorithms supported: +2023/08/16-15:51:54.160875 8651103744 kZSTD supported: 1 +2023/08/16-15:51:54.160876 8651103744 kZlibCompression supported: 1 +2023/08/16-15:51:54.160877 8651103744 kXpressCompression supported: 0 +2023/08/16-15:51:54.160878 8651103744 kSnappyCompression supported: 1 +2023/08/16-15:51:54.160879 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/16-15:51:54.160880 8651103744 kLZ4HCCompression supported: 1 +2023/08/16-15:51:54.160881 8651103744 kLZ4Compression supported: 1 +2023/08/16-15:51:54.160881 8651103744 kBZip2Compression supported: 1 +2023/08/16-15:51:54.160889 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/16-15:51:54.160890 8651103744 DMutex implementation: pthread_mutex_t +2023/08/16-15:51:54.161201 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000073 +2023/08/16-15:51:54.161261 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/16-15:51:54.161263 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/16-15:51:54.161263 8651103744 Options.merge_operator: None +2023/08/16-15:51:54.161264 8651103744 Options.compaction_filter: None +2023/08/16-15:51:54.161265 8651103744 Options.compaction_filter_factory: None +2023/08/16-15:51:54.161265 8651103744 Options.sst_partitioner_factory: None +2023/08/16-15:51:54.161266 8651103744 Options.memtable_factory: SkipListFactory +2023/08/16-15:51:54.161267 8651103744 Options.table_factory: BlockBasedTable +2023/08/16-15:51:54.161281 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600003af4080) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x600000ff00d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/16-15:51:54.161283 8651103744 Options.write_buffer_size: 67108864 +2023/08/16-15:51:54.161284 8651103744 Options.max_write_buffer_number: 2 +2023/08/16-15:51:54.161285 8651103744 Options.compression: Snappy +2023/08/16-15:51:54.161285 8651103744 Options.bottommost_compression: Disabled +2023/08/16-15:51:54.161286 8651103744 Options.prefix_extractor: nullptr +2023/08/16-15:51:54.161286 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/16-15:51:54.161287 8651103744 Options.num_levels: 7 +2023/08/16-15:51:54.161288 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/16-15:51:54.161288 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/16-15:51:54.161289 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/16-15:51:54.161289 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/16-15:51:54.161290 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/16-15:51:54.161291 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/16-15:51:54.161291 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/16-15:51:54.161292 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/16-15:51:54.161292 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/16-15:51:54.161293 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/16-15:51:54.161294 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-15:51:54.161294 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/16-15:51:54.161295 8651103744 Options.compression_opts.window_bits: -14 +2023/08/16-15:51:54.161295 8651103744 Options.compression_opts.level: 32767 +2023/08/16-15:51:54.161296 8651103744 Options.compression_opts.strategy: 0 +2023/08/16-15:51:54.161297 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/16-15:51:54.161297 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/16-15:51:54.161298 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/16-15:51:54.161298 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/16-15:51:54.161299 8651103744 Options.compression_opts.enabled: false +2023/08/16-15:51:54.161300 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-15:51:54.161300 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/16-15:51:54.161301 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/16-15:51:54.161301 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/16-15:51:54.161302 8651103744 Options.target_file_size_base: 67108864 +2023/08/16-15:51:54.161303 8651103744 Options.target_file_size_multiplier: 1 +2023/08/16-15:51:54.161303 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/16-15:51:54.161304 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/16-15:51:54.161304 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/16-15:51:54.161305 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/16-15:51:54.161306 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/16-15:51:54.161306 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/16-15:51:54.161307 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/16-15:51:54.161308 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/16-15:51:54.161308 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/16-15:51:54.161309 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/16-15:51:54.161309 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/16-15:51:54.161310 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/16-15:51:54.161311 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/16-15:51:54.161311 8651103744 Options.arena_block_size: 1048576 +2023/08/16-15:51:54.161312 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/16-15:51:54.161312 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/16-15:51:54.161313 8651103744 Options.disable_auto_compactions: 0 +2023/08/16-15:51:54.161314 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/16-15:51:54.161314 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/16-15:51:54.161315 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/16-15:51:54.161316 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/16-15:51:54.161316 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/16-15:51:54.161317 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/16-15:51:54.161317 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/16-15:51:54.161322 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/16-15:51:54.161322 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/16-15:51:54.161323 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/16-15:51:54.161324 8651103744 Options.table_properties_collectors: +2023/08/16-15:51:54.161325 8651103744 Options.inplace_update_support: 0 +2023/08/16-15:51:54.161325 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/16-15:51:54.161326 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/16-15:51:54.161326 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/16-15:51:54.161327 8651103744 Options.memtable_huge_page_size: 0 +2023/08/16-15:51:54.161328 8651103744 Options.bloom_locality: 0 +2023/08/16-15:51:54.161328 8651103744 Options.max_successive_merges: 0 +2023/08/16-15:51:54.161329 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/16-15:51:54.161329 8651103744 Options.paranoid_file_checks: 0 +2023/08/16-15:51:54.161330 8651103744 Options.force_consistency_checks: 1 +2023/08/16-15:51:54.161330 8651103744 Options.report_bg_io_stats: 0 +2023/08/16-15:51:54.161331 8651103744 Options.ttl: 2592000 +2023/08/16-15:51:54.161332 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/16-15:51:54.161332 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/16-15:51:54.161333 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/16-15:51:54.161333 8651103744 Options.enable_blob_files: false +2023/08/16-15:51:54.161334 8651103744 Options.min_blob_size: 0 +2023/08/16-15:51:54.161334 8651103744 Options.blob_file_size: 268435456 +2023/08/16-15:51:54.161335 8651103744 Options.blob_compression_type: NoCompression +2023/08/16-15:51:54.161336 8651103744 Options.enable_blob_garbage_collection: false +2023/08/16-15:51:54.161336 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/16-15:51:54.161337 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/16-15:51:54.161338 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/16-15:51:54.161338 8651103744 Options.blob_file_starting_level: 0 +2023/08/16-15:51:54.161339 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/16-15:51:54.161990 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000073 succeeded,manifest_file_number is 73, next_file_number is 75, last_sequence is 22432, log_number is 68,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 68 +2023/08/16-15:51:54.161993 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 68 +2023/08/16-15:51:54.162147 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/16-15:51:54.162244 8651103744 EVENT_LOG_v1 {"time_micros": 1692168714162238, "job": 1, "event": "recovery_started", "wal_files": [72]} +2023/08/16-15:51:54.162246 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #72 mode 2 +2023/08/16-15:51:54.162739 8651103744 EVENT_LOG_v1 {"time_micros": 1692168714162725, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 76, "file_size": 7203, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 22433, "largest_seqno": 22576, "table_properties": {"data_size": 6127, "index_size": 144, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 6528, "raw_average_key_size": 45, "raw_value_size": 7883, "raw_average_value_size": 54, "num_data_blocks": 3, "num_entries": 144, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692168714, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "RN9LFTYUUXHICJSMNSJK", "orig_file_number": 76, "seqno_to_time_mapping": "N/A"}} +2023/08/16-15:51:54.162789 8651103744 EVENT_LOG_v1 {"time_micros": 1692168714162788, "job": 1, "event": "recovery_finished"} +2023/08/16-15:51:54.162830 8651103744 [db/version_set.cc:5180] Creating manifest 78 +2023/08/16-15:51:54.164025 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000072.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-15:51:54.164037 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x136e04080 +2023/08/16-15:51:54.164080 8651103744 DB pointer 0x14880ba00 +2023/08/16-15:51:54.164268 6135869440 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/16-15:51:54.164368 6135869440 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 3/0 16.84 KB 0.8 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 22.8 0.00 0.00 1 0.000 0 0 0.0 0.0 + L1 1/0 973.18 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 4/0 990.02 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 22.8 0.00 0.00 1 0.000 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 22.8 0.00 0.00 1 0.000 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.8 0.00 0.00 1 0.000 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 2.30 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 2.30 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x600000ff00d8#90981 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 9e-06 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692176419380884 b/rust/hyperlane_db/LOG.old.1692176419380884 new file mode 100644 index 0000000000..9891c8be44 --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692176419380884 @@ -0,0 +1,304 @@ +2023/08/16-17:47:37.441977 8651103744 RocksDB version: 8.1.1 +2023/08/16-17:47:37.442496 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/16-17:47:37.442500 8651103744 DB SUMMARY +2023/08/16-17:47:37.442501 8651103744 DB Session ID: RT4ZNPS4LCILAPZ128XT +2023/08/16-17:47:37.442611 8651103744 CURRENT file: CURRENT +2023/08/16-17:47:37.442613 8651103744 IDENTITY file: IDENTITY +2023/08/16-17:47:37.442626 8651103744 MANIFEST file: MANIFEST-000078 size: 807 Bytes +2023/08/16-17:47:37.442640 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 4, files: 000063.sst 000066.sst 000071.sst 000076.sst +2023/08/16-17:47:37.442641 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000077.log size: 14944 ; +2023/08/16-17:47:37.442643 8651103744 Options.error_if_exists: 0 +2023/08/16-17:47:37.442644 8651103744 Options.create_if_missing: 1 +2023/08/16-17:47:37.442645 8651103744 Options.paranoid_checks: 1 +2023/08/16-17:47:37.442646 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/16-17:47:37.442647 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/16-17:47:37.442648 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/16-17:47:37.442648 8651103744 Options.env: 0x105d61720 +2023/08/16-17:47:37.442650 8651103744 Options.fs: PosixFileSystem +2023/08/16-17:47:37.442651 8651103744 Options.info_log: 0x15bf05f88 +2023/08/16-17:47:37.442651 8651103744 Options.max_file_opening_threads: 16 +2023/08/16-17:47:37.442652 8651103744 Options.statistics: 0x0 +2023/08/16-17:47:37.442653 8651103744 Options.use_fsync: 0 +2023/08/16-17:47:37.442654 8651103744 Options.max_log_file_size: 0 +2023/08/16-17:47:37.442655 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/16-17:47:37.442656 8651103744 Options.log_file_time_to_roll: 0 +2023/08/16-17:47:37.442657 8651103744 Options.keep_log_file_num: 1000 +2023/08/16-17:47:37.442657 8651103744 Options.recycle_log_file_num: 0 +2023/08/16-17:47:37.442658 8651103744 Options.allow_fallocate: 1 +2023/08/16-17:47:37.442659 8651103744 Options.allow_mmap_reads: 0 +2023/08/16-17:47:37.442660 8651103744 Options.allow_mmap_writes: 0 +2023/08/16-17:47:37.442661 8651103744 Options.use_direct_reads: 0 +2023/08/16-17:47:37.442662 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/16-17:47:37.442663 8651103744 Options.create_missing_column_families: 0 +2023/08/16-17:47:37.442663 8651103744 Options.db_log_dir: +2023/08/16-17:47:37.442664 8651103744 Options.wal_dir: +2023/08/16-17:47:37.442665 8651103744 Options.table_cache_numshardbits: 6 +2023/08/16-17:47:37.442666 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/16-17:47:37.442667 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/16-17:47:37.442668 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/16-17:47:37.442669 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/16-17:47:37.442670 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/16-17:47:37.442670 8651103744 Options.advise_random_on_open: 1 +2023/08/16-17:47:37.442671 8651103744 Options.db_write_buffer_size: 0 +2023/08/16-17:47:37.442672 8651103744 Options.write_buffer_manager: 0x600000930820 +2023/08/16-17:47:37.442673 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/16-17:47:37.442674 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/16-17:47:37.442675 8651103744 Options.use_adaptive_mutex: 0 +2023/08/16-17:47:37.442676 8651103744 Options.rate_limiter: 0x0 +2023/08/16-17:47:37.442677 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/16-17:47:37.442678 8651103744 Options.wal_recovery_mode: 2 +2023/08/16-17:47:37.442679 8651103744 Options.enable_thread_tracking: 0 +2023/08/16-17:47:37.442680 8651103744 Options.enable_pipelined_write: 0 +2023/08/16-17:47:37.442680 8651103744 Options.unordered_write: 0 +2023/08/16-17:47:37.442681 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/16-17:47:37.442682 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/16-17:47:37.442683 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/16-17:47:37.442684 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/16-17:47:37.442685 8651103744 Options.row_cache: None +2023/08/16-17:47:37.442686 8651103744 Options.wal_filter: None +2023/08/16-17:47:37.442686 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/16-17:47:37.442687 8651103744 Options.allow_ingest_behind: 0 +2023/08/16-17:47:37.442688 8651103744 Options.two_write_queues: 0 +2023/08/16-17:47:37.442689 8651103744 Options.manual_wal_flush: 0 +2023/08/16-17:47:37.442690 8651103744 Options.wal_compression: 0 +2023/08/16-17:47:37.442691 8651103744 Options.atomic_flush: 0 +2023/08/16-17:47:37.442691 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/16-17:47:37.442692 8651103744 Options.persist_stats_to_disk: 0 +2023/08/16-17:47:37.442693 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/16-17:47:37.442694 8651103744 Options.log_readahead_size: 0 +2023/08/16-17:47:37.442695 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/16-17:47:37.442710 8651103744 Options.best_efforts_recovery: 0 +2023/08/16-17:47:37.442711 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/16-17:47:37.442711 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/16-17:47:37.442712 8651103744 Options.allow_data_in_errors: 0 +2023/08/16-17:47:37.442713 8651103744 Options.db_host_id: __hostname__ +2023/08/16-17:47:37.442714 8651103744 Options.enforce_single_del_contracts: true +2023/08/16-17:47:37.442715 8651103744 Options.max_background_jobs: 2 +2023/08/16-17:47:37.442716 8651103744 Options.max_background_compactions: -1 +2023/08/16-17:47:37.442717 8651103744 Options.max_subcompactions: 1 +2023/08/16-17:47:37.442717 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/16-17:47:37.442718 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/16-17:47:37.442719 8651103744 Options.delayed_write_rate : 16777216 +2023/08/16-17:47:37.442720 8651103744 Options.max_total_wal_size: 0 +2023/08/16-17:47:37.442721 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/16-17:47:37.442722 8651103744 Options.stats_dump_period_sec: 600 +2023/08/16-17:47:37.442722 8651103744 Options.stats_persist_period_sec: 600 +2023/08/16-17:47:37.442723 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/16-17:47:37.442724 8651103744 Options.max_open_files: -1 +2023/08/16-17:47:37.442725 8651103744 Options.bytes_per_sync: 0 +2023/08/16-17:47:37.442726 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/16-17:47:37.442727 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/16-17:47:37.442728 8651103744 Options.compaction_readahead_size: 0 +2023/08/16-17:47:37.442728 8651103744 Options.max_background_flushes: -1 +2023/08/16-17:47:37.442729 8651103744 Compression algorithms supported: +2023/08/16-17:47:37.442743 8651103744 kZSTD supported: 1 +2023/08/16-17:47:37.442744 8651103744 kZlibCompression supported: 1 +2023/08/16-17:47:37.442745 8651103744 kXpressCompression supported: 0 +2023/08/16-17:47:37.442746 8651103744 kSnappyCompression supported: 1 +2023/08/16-17:47:37.442747 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/16-17:47:37.442748 8651103744 kLZ4HCCompression supported: 1 +2023/08/16-17:47:37.442749 8651103744 kLZ4Compression supported: 1 +2023/08/16-17:47:37.442750 8651103744 kBZip2Compression supported: 1 +2023/08/16-17:47:37.442759 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/16-17:47:37.442760 8651103744 DMutex implementation: pthread_mutex_t +2023/08/16-17:47:37.443753 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000078 +2023/08/16-17:47:37.444031 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/16-17:47:37.444034 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/16-17:47:37.444035 8651103744 Options.merge_operator: None +2023/08/16-17:47:37.444036 8651103744 Options.compaction_filter: None +2023/08/16-17:47:37.444037 8651103744 Options.compaction_filter_factory: None +2023/08/16-17:47:37.444041 8651103744 Options.sst_partitioner_factory: None +2023/08/16-17:47:37.444042 8651103744 Options.memtable_factory: SkipListFactory +2023/08/16-17:47:37.444043 8651103744 Options.table_factory: BlockBasedTable +2023/08/16-17:47:37.444084 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600003233f60) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000007300d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/16-17:47:37.444087 8651103744 Options.write_buffer_size: 67108864 +2023/08/16-17:47:37.444088 8651103744 Options.max_write_buffer_number: 2 +2023/08/16-17:47:37.444089 8651103744 Options.compression: Snappy +2023/08/16-17:47:37.444090 8651103744 Options.bottommost_compression: Disabled +2023/08/16-17:47:37.444091 8651103744 Options.prefix_extractor: nullptr +2023/08/16-17:47:37.444092 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/16-17:47:37.444093 8651103744 Options.num_levels: 7 +2023/08/16-17:47:37.444094 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/16-17:47:37.444094 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/16-17:47:37.444095 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/16-17:47:37.444096 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/16-17:47:37.444097 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/16-17:47:37.444098 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/16-17:47:37.444099 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/16-17:47:37.444100 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/16-17:47:37.444100 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/16-17:47:37.444101 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/16-17:47:37.444102 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-17:47:37.444103 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/16-17:47:37.444104 8651103744 Options.compression_opts.window_bits: -14 +2023/08/16-17:47:37.444105 8651103744 Options.compression_opts.level: 32767 +2023/08/16-17:47:37.444106 8651103744 Options.compression_opts.strategy: 0 +2023/08/16-17:47:37.444106 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/16-17:47:37.444107 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/16-17:47:37.444109 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/16-17:47:37.444109 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/16-17:47:37.444110 8651103744 Options.compression_opts.enabled: false +2023/08/16-17:47:37.444111 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-17:47:37.444112 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/16-17:47:37.444113 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/16-17:47:37.444114 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/16-17:47:37.444114 8651103744 Options.target_file_size_base: 67108864 +2023/08/16-17:47:37.444115 8651103744 Options.target_file_size_multiplier: 1 +2023/08/16-17:47:37.444116 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/16-17:47:37.444117 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/16-17:47:37.444118 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/16-17:47:37.444119 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/16-17:47:37.444120 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/16-17:47:37.444121 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/16-17:47:37.444121 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/16-17:47:37.444122 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/16-17:47:37.444123 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/16-17:47:37.444124 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/16-17:47:37.444125 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/16-17:47:37.444126 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/16-17:47:37.444126 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/16-17:47:37.444127 8651103744 Options.arena_block_size: 1048576 +2023/08/16-17:47:37.444128 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/16-17:47:37.444129 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/16-17:47:37.444130 8651103744 Options.disable_auto_compactions: 0 +2023/08/16-17:47:37.444132 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/16-17:47:37.444134 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/16-17:47:37.444135 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/16-17:47:37.444135 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/16-17:47:37.444136 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/16-17:47:37.444137 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/16-17:47:37.444138 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/16-17:47:37.444141 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/16-17:47:37.444142 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/16-17:47:37.444143 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/16-17:47:37.444145 8651103744 Options.table_properties_collectors: +2023/08/16-17:47:37.444146 8651103744 Options.inplace_update_support: 0 +2023/08/16-17:47:37.444146 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/16-17:47:37.444147 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/16-17:47:37.444148 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/16-17:47:37.444149 8651103744 Options.memtable_huge_page_size: 0 +2023/08/16-17:47:37.444150 8651103744 Options.bloom_locality: 0 +2023/08/16-17:47:37.444151 8651103744 Options.max_successive_merges: 0 +2023/08/16-17:47:37.444151 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/16-17:47:37.444152 8651103744 Options.paranoid_file_checks: 0 +2023/08/16-17:47:37.444153 8651103744 Options.force_consistency_checks: 1 +2023/08/16-17:47:37.444154 8651103744 Options.report_bg_io_stats: 0 +2023/08/16-17:47:37.444155 8651103744 Options.ttl: 2592000 +2023/08/16-17:47:37.444156 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/16-17:47:37.444156 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/16-17:47:37.444157 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/16-17:47:37.444158 8651103744 Options.enable_blob_files: false +2023/08/16-17:47:37.444159 8651103744 Options.min_blob_size: 0 +2023/08/16-17:47:37.444160 8651103744 Options.blob_file_size: 268435456 +2023/08/16-17:47:37.444161 8651103744 Options.blob_compression_type: NoCompression +2023/08/16-17:47:37.444162 8651103744 Options.enable_blob_garbage_collection: false +2023/08/16-17:47:37.444162 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/16-17:47:37.444163 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/16-17:47:37.444164 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/16-17:47:37.444165 8651103744 Options.blob_file_starting_level: 0 +2023/08/16-17:47:37.444166 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/16-17:47:37.445546 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000078 succeeded,manifest_file_number is 78, next_file_number is 80, last_sequence is 22576, log_number is 73,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 73 +2023/08/16-17:47:37.445549 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 73 +2023/08/16-17:47:37.445764 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/16-17:47:37.445990 8651103744 EVENT_LOG_v1 {"time_micros": 1692175657445977, "job": 1, "event": "recovery_started", "wal_files": [77]} +2023/08/16-17:47:37.445994 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #77 mode 2 +2023/08/16-17:47:37.447366 8651103744 EVENT_LOG_v1 {"time_micros": 1692175657447346, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 81, "file_size": 5633, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 22577, "largest_seqno": 22666, "table_properties": {"data_size": 4558, "index_size": 144, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 4080, "raw_average_key_size": 45, "raw_value_size": 9590, "raw_average_value_size": 106, "num_data_blocks": 3, "num_entries": 90, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692175657, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "RT4ZNPS4LCILAPZ128XT", "orig_file_number": 81, "seqno_to_time_mapping": "N/A"}} +2023/08/16-17:47:37.447448 8651103744 EVENT_LOG_v1 {"time_micros": 1692175657447446, "job": 1, "event": "recovery_finished"} +2023/08/16-17:47:37.447545 8651103744 [db/version_set.cc:5180] Creating manifest 83 +2023/08/16-17:47:37.450424 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000077.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-17:47:37.450458 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x15bf060e0 +2023/08/16-17:47:37.450536 8651103744 DB pointer 0x15c816200 +2023/08/16-17:47:37.450555 6157185024 [db/compaction/compaction_job.cc:1988] [default] [JOB 3] Compacting 4@0 + 1@1 files to L1, score 1.00 +2023/08/16-17:47:37.450559 6157185024 [db/compaction/compaction_job.cc:1992] [default]: Compaction start summary: Base version 2 Base level 0, inputs: [81(5633B) 76(7203B) 71(6369B) 66(3671B)], [63(973KB)] +2023/08/16-17:47:37.450583 6157185024 EVENT_LOG_v1 {"time_micros": 1692175657450562, "job": 3, "event": "compaction_started", "compaction_reason": "LevelL0FilesNum", "files_L0": [81, 76, 71, 66], "files_L1": [63], "score": 1, "input_data_size": 1019417, "oldest_snapshot_seqno": -1} +2023/08/16-17:47:37.450764 6158331904 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/16-17:47:37.450769 6158331904 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 4/4 22.34 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 6.8 0.00 0.00 1 0.001 0 0 0.0 0.0 + L1 1/1 973.18 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 5/5 995.52 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 6.8 0.00 0.00 1 0.001 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 6.8 0.00 0.00 1 0.001 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.8 0.00 0.00 1 0.001 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 0.79 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 0.79 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000007300d8#97820 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 4.8e-05 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** +2023/08/16-17:47:37.504365 6157185024 [db/compaction/compaction_job.cc:1592] [default] [JOB 3] Generated table #86: 21906 keys, 1017533 bytes, temperature: kUnknown +2023/08/16-17:47:37.504399 6157185024 EVENT_LOG_v1 {"time_micros": 1692175657504376, "cf_name": "default", "job": 3, "event": "table_file_creation", "file_number": 86, "file_size": 1017533, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 0, "largest_seqno": 0, "table_properties": {"data_size": 1009793, "index_size": 24044, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 1794902, "raw_average_key_size": 81, "raw_value_size": 944266, "raw_average_value_size": 43, "num_data_blocks": 468, "num_entries": 21906, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692109142, "oldest_key_time": 0, "file_creation_time": 1692175657, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "RT4ZNPS4LCILAPZ128XT", "orig_file_number": 86, "seqno_to_time_mapping": "N/A"}} +2023/08/16-17:47:37.504928 6157185024 (Original Log Time 2023/08/16-17:47:37.504659) [db/compaction/compaction_job.cc:1663] [default] [JOB 3] Compacted 4@0 + 1@1 files to L1 => 1017533 bytes +2023/08/16-17:47:37.504931 6157185024 (Original Log Time 2023/08/16-17:47:37.504844) [db/compaction/compaction_job.cc:885] [default] compacted to: files[0 1 0 0 0 0 0] max score 0.00, MB/sec: 18.9 rd, 18.9 wr, level 1, files in(4, 1) out(1 +0 blob) MB in(0.0, 1.0 +0.0 blob) out(1.0 +0.0 blob), read-write-amplify(89.0) write-amplify(44.5) OK, records in: 21906, records dropped: 0 output_compression: Snappy +2023/08/16-17:47:37.504933 6157185024 (Original Log Time 2023/08/16-17:47:37.504865) EVENT_LOG_v1 {"time_micros": 1692175657504851, "job": 3, "event": "compaction_finished", "compaction_time_micros": 53868, "compaction_time_cpu_micros": 53233, "output_level": 1, "num_output_files": 1, "total_output_size": 1017533, "num_input_records": 21906, "num_output_records": 21906, "num_subcompactions": 1, "output_compression": "Snappy", "num_single_delete_mismatches": 0, "num_single_delete_fallthrough": 0, "lsm_state": [0, 1, 0, 0, 0, 0, 0]} +2023/08/16-17:47:37.505012 6157185024 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000081.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-17:47:37.505017 6157185024 EVENT_LOG_v1 {"time_micros": 1692175657505015, "job": 3, "event": "table_file_deletion", "file_number": 81} +2023/08/16-17:47:37.505068 6157185024 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000076.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-17:47:37.505073 6157185024 EVENT_LOG_v1 {"time_micros": 1692175657505071, "job": 3, "event": "table_file_deletion", "file_number": 76} +2023/08/16-17:47:37.505120 6157185024 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000071.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-17:47:37.505124 6157185024 EVENT_LOG_v1 {"time_micros": 1692175657505123, "job": 3, "event": "table_file_deletion", "file_number": 71} +2023/08/16-17:47:37.505174 6157185024 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000066.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-17:47:37.505177 6157185024 EVENT_LOG_v1 {"time_micros": 1692175657505176, "job": 3, "event": "table_file_deletion", "file_number": 66} +2023/08/16-17:47:37.505248 6157185024 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000063.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-17:47:37.505252 6157185024 EVENT_LOG_v1 {"time_micros": 1692175657505251, "job": 3, "event": "table_file_deletion", "file_number": 63} diff --git a/rust/hyperlane_db/LOG.old.1692189150768832 b/rust/hyperlane_db/LOG.old.1692189150768832 new file mode 100644 index 0000000000..a1adea4967 --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692189150768832 @@ -0,0 +1,284 @@ +2023/08/16-18:00:19.381682 8651103744 RocksDB version: 8.1.1 +2023/08/16-18:00:19.382152 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/16-18:00:19.382155 8651103744 DB SUMMARY +2023/08/16-18:00:19.382156 8651103744 DB Session ID: DW6X2USDH4HLBH29LCX1 +2023/08/16-18:00:19.382226 8651103744 CURRENT file: CURRENT +2023/08/16-18:00:19.382227 8651103744 IDENTITY file: IDENTITY +2023/08/16-18:00:19.382236 8651103744 MANIFEST file: MANIFEST-000083 size: 1192 Bytes +2023/08/16-18:00:19.382250 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 1, files: 000086.sst +2023/08/16-18:00:19.382251 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000082.log size: 0 ; +2023/08/16-18:00:19.382253 8651103744 Options.error_if_exists: 0 +2023/08/16-18:00:19.382254 8651103744 Options.create_if_missing: 1 +2023/08/16-18:00:19.382255 8651103744 Options.paranoid_checks: 1 +2023/08/16-18:00:19.382256 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/16-18:00:19.382257 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/16-18:00:19.382258 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/16-18:00:19.382259 8651103744 Options.env: 0x1091d9720 +2023/08/16-18:00:19.382260 8651103744 Options.fs: PosixFileSystem +2023/08/16-18:00:19.382261 8651103744 Options.info_log: 0x15060a6e8 +2023/08/16-18:00:19.382262 8651103744 Options.max_file_opening_threads: 16 +2023/08/16-18:00:19.382263 8651103744 Options.statistics: 0x0 +2023/08/16-18:00:19.382264 8651103744 Options.use_fsync: 0 +2023/08/16-18:00:19.382265 8651103744 Options.max_log_file_size: 0 +2023/08/16-18:00:19.382265 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/16-18:00:19.382266 8651103744 Options.log_file_time_to_roll: 0 +2023/08/16-18:00:19.382267 8651103744 Options.keep_log_file_num: 1000 +2023/08/16-18:00:19.382268 8651103744 Options.recycle_log_file_num: 0 +2023/08/16-18:00:19.382269 8651103744 Options.allow_fallocate: 1 +2023/08/16-18:00:19.382270 8651103744 Options.allow_mmap_reads: 0 +2023/08/16-18:00:19.382271 8651103744 Options.allow_mmap_writes: 0 +2023/08/16-18:00:19.382272 8651103744 Options.use_direct_reads: 0 +2023/08/16-18:00:19.382272 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/16-18:00:19.382273 8651103744 Options.create_missing_column_families: 0 +2023/08/16-18:00:19.382274 8651103744 Options.db_log_dir: +2023/08/16-18:00:19.382275 8651103744 Options.wal_dir: +2023/08/16-18:00:19.382276 8651103744 Options.table_cache_numshardbits: 6 +2023/08/16-18:00:19.382277 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/16-18:00:19.382278 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/16-18:00:19.382278 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/16-18:00:19.382279 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/16-18:00:19.382280 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/16-18:00:19.382281 8651103744 Options.advise_random_on_open: 1 +2023/08/16-18:00:19.382282 8651103744 Options.db_write_buffer_size: 0 +2023/08/16-18:00:19.382283 8651103744 Options.write_buffer_manager: 0x600002c99380 +2023/08/16-18:00:19.382284 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/16-18:00:19.382285 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/16-18:00:19.382286 8651103744 Options.use_adaptive_mutex: 0 +2023/08/16-18:00:19.382286 8651103744 Options.rate_limiter: 0x0 +2023/08/16-18:00:19.382288 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/16-18:00:19.382289 8651103744 Options.wal_recovery_mode: 2 +2023/08/16-18:00:19.382289 8651103744 Options.enable_thread_tracking: 0 +2023/08/16-18:00:19.382290 8651103744 Options.enable_pipelined_write: 0 +2023/08/16-18:00:19.382291 8651103744 Options.unordered_write: 0 +2023/08/16-18:00:19.382292 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/16-18:00:19.382293 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/16-18:00:19.382294 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/16-18:00:19.382295 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/16-18:00:19.382296 8651103744 Options.row_cache: None +2023/08/16-18:00:19.382296 8651103744 Options.wal_filter: None +2023/08/16-18:00:19.382297 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/16-18:00:19.382298 8651103744 Options.allow_ingest_behind: 0 +2023/08/16-18:00:19.382299 8651103744 Options.two_write_queues: 0 +2023/08/16-18:00:19.382300 8651103744 Options.manual_wal_flush: 0 +2023/08/16-18:00:19.382301 8651103744 Options.wal_compression: 0 +2023/08/16-18:00:19.382302 8651103744 Options.atomic_flush: 0 +2023/08/16-18:00:19.382302 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/16-18:00:19.382303 8651103744 Options.persist_stats_to_disk: 0 +2023/08/16-18:00:19.382304 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/16-18:00:19.382305 8651103744 Options.log_readahead_size: 0 +2023/08/16-18:00:19.382306 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/16-18:00:19.382321 8651103744 Options.best_efforts_recovery: 0 +2023/08/16-18:00:19.382321 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/16-18:00:19.382322 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/16-18:00:19.382323 8651103744 Options.allow_data_in_errors: 0 +2023/08/16-18:00:19.382324 8651103744 Options.db_host_id: __hostname__ +2023/08/16-18:00:19.382325 8651103744 Options.enforce_single_del_contracts: true +2023/08/16-18:00:19.382326 8651103744 Options.max_background_jobs: 2 +2023/08/16-18:00:19.382327 8651103744 Options.max_background_compactions: -1 +2023/08/16-18:00:19.382328 8651103744 Options.max_subcompactions: 1 +2023/08/16-18:00:19.382329 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/16-18:00:19.382330 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/16-18:00:19.382330 8651103744 Options.delayed_write_rate : 16777216 +2023/08/16-18:00:19.382331 8651103744 Options.max_total_wal_size: 0 +2023/08/16-18:00:19.382332 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/16-18:00:19.382333 8651103744 Options.stats_dump_period_sec: 600 +2023/08/16-18:00:19.382334 8651103744 Options.stats_persist_period_sec: 600 +2023/08/16-18:00:19.382335 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/16-18:00:19.382336 8651103744 Options.max_open_files: -1 +2023/08/16-18:00:19.382337 8651103744 Options.bytes_per_sync: 0 +2023/08/16-18:00:19.382338 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/16-18:00:19.382338 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/16-18:00:19.382339 8651103744 Options.compaction_readahead_size: 0 +2023/08/16-18:00:19.382340 8651103744 Options.max_background_flushes: -1 +2023/08/16-18:00:19.382341 8651103744 Compression algorithms supported: +2023/08/16-18:00:19.382357 8651103744 kZSTD supported: 1 +2023/08/16-18:00:19.382358 8651103744 kZlibCompression supported: 1 +2023/08/16-18:00:19.382359 8651103744 kXpressCompression supported: 0 +2023/08/16-18:00:19.382360 8651103744 kSnappyCompression supported: 1 +2023/08/16-18:00:19.382361 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/16-18:00:19.382362 8651103744 kLZ4HCCompression supported: 1 +2023/08/16-18:00:19.382363 8651103744 kLZ4Compression supported: 1 +2023/08/16-18:00:19.382364 8651103744 kBZip2Compression supported: 1 +2023/08/16-18:00:19.382371 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/16-18:00:19.382372 8651103744 DMutex implementation: pthread_mutex_t +2023/08/16-18:00:19.382531 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000083 +2023/08/16-18:00:19.382775 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/16-18:00:19.382777 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/16-18:00:19.382778 8651103744 Options.merge_operator: None +2023/08/16-18:00:19.382779 8651103744 Options.compaction_filter: None +2023/08/16-18:00:19.382780 8651103744 Options.compaction_filter_factory: None +2023/08/16-18:00:19.382781 8651103744 Options.sst_partitioner_factory: None +2023/08/16-18:00:19.382782 8651103744 Options.memtable_factory: SkipListFactory +2023/08/16-18:00:19.382782 8651103744 Options.table_factory: BlockBasedTable +2023/08/16-18:00:19.382795 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600001794640) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000022986d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/16-18:00:19.382797 8651103744 Options.write_buffer_size: 67108864 +2023/08/16-18:00:19.382798 8651103744 Options.max_write_buffer_number: 2 +2023/08/16-18:00:19.382799 8651103744 Options.compression: Snappy +2023/08/16-18:00:19.382800 8651103744 Options.bottommost_compression: Disabled +2023/08/16-18:00:19.382800 8651103744 Options.prefix_extractor: nullptr +2023/08/16-18:00:19.382801 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/16-18:00:19.382802 8651103744 Options.num_levels: 7 +2023/08/16-18:00:19.382803 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/16-18:00:19.382804 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/16-18:00:19.382805 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/16-18:00:19.382806 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/16-18:00:19.382807 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/16-18:00:19.382808 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/16-18:00:19.382809 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/16-18:00:19.382810 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/16-18:00:19.382810 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/16-18:00:19.382811 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/16-18:00:19.382812 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-18:00:19.382813 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/16-18:00:19.382814 8651103744 Options.compression_opts.window_bits: -14 +2023/08/16-18:00:19.382815 8651103744 Options.compression_opts.level: 32767 +2023/08/16-18:00:19.382816 8651103744 Options.compression_opts.strategy: 0 +2023/08/16-18:00:19.382817 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/16-18:00:19.382817 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/16-18:00:19.382818 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/16-18:00:19.382819 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/16-18:00:19.382820 8651103744 Options.compression_opts.enabled: false +2023/08/16-18:00:19.382821 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-18:00:19.382822 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/16-18:00:19.382823 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/16-18:00:19.382824 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/16-18:00:19.382825 8651103744 Options.target_file_size_base: 67108864 +2023/08/16-18:00:19.382825 8651103744 Options.target_file_size_multiplier: 1 +2023/08/16-18:00:19.382826 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/16-18:00:19.382827 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/16-18:00:19.382828 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/16-18:00:19.382829 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/16-18:00:19.382830 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/16-18:00:19.382831 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/16-18:00:19.382832 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/16-18:00:19.382833 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/16-18:00:19.382834 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/16-18:00:19.382834 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/16-18:00:19.382835 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/16-18:00:19.382836 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/16-18:00:19.382837 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/16-18:00:19.382838 8651103744 Options.arena_block_size: 1048576 +2023/08/16-18:00:19.382839 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/16-18:00:19.382840 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/16-18:00:19.382841 8651103744 Options.disable_auto_compactions: 0 +2023/08/16-18:00:19.382843 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/16-18:00:19.382844 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/16-18:00:19.382845 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/16-18:00:19.382846 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/16-18:00:19.382846 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/16-18:00:19.382847 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/16-18:00:19.382848 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/16-18:00:19.382851 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/16-18:00:19.382852 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/16-18:00:19.382853 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/16-18:00:19.382855 8651103744 Options.table_properties_collectors: +2023/08/16-18:00:19.382856 8651103744 Options.inplace_update_support: 0 +2023/08/16-18:00:19.382857 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/16-18:00:19.382858 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/16-18:00:19.382859 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/16-18:00:19.382859 8651103744 Options.memtable_huge_page_size: 0 +2023/08/16-18:00:19.382860 8651103744 Options.bloom_locality: 0 +2023/08/16-18:00:19.382861 8651103744 Options.max_successive_merges: 0 +2023/08/16-18:00:19.382862 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/16-18:00:19.382863 8651103744 Options.paranoid_file_checks: 0 +2023/08/16-18:00:19.382864 8651103744 Options.force_consistency_checks: 1 +2023/08/16-18:00:19.382865 8651103744 Options.report_bg_io_stats: 0 +2023/08/16-18:00:19.382865 8651103744 Options.ttl: 2592000 +2023/08/16-18:00:19.382866 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/16-18:00:19.382867 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/16-18:00:19.382868 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/16-18:00:19.382869 8651103744 Options.enable_blob_files: false +2023/08/16-18:00:19.382870 8651103744 Options.min_blob_size: 0 +2023/08/16-18:00:19.382871 8651103744 Options.blob_file_size: 268435456 +2023/08/16-18:00:19.382872 8651103744 Options.blob_compression_type: NoCompression +2023/08/16-18:00:19.382873 8651103744 Options.enable_blob_garbage_collection: false +2023/08/16-18:00:19.382873 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/16-18:00:19.382874 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/16-18:00:19.382875 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/16-18:00:19.382876 8651103744 Options.blob_file_starting_level: 0 +2023/08/16-18:00:19.382877 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/16-18:00:19.384033 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000083 succeeded,manifest_file_number is 83, next_file_number is 88, last_sequence is 22666, log_number is 78,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 78 +2023/08/16-18:00:19.384036 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 78 +2023/08/16-18:00:19.384072 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/16-18:00:19.384211 8651103744 EVENT_LOG_v1 {"time_micros": 1692176419384202, "job": 1, "event": "recovery_started", "wal_files": [82]} +2023/08/16-18:00:19.384214 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #82 mode 2 +2023/08/16-18:00:19.384266 8651103744 EVENT_LOG_v1 {"time_micros": 1692176419384265, "job": 1, "event": "recovery_finished"} +2023/08/16-18:00:19.384381 8651103744 [db/version_set.cc:5180] Creating manifest 90 +2023/08/16-18:00:19.387880 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x15060a840 +2023/08/16-18:00:19.387934 8651103744 DB pointer 0x150821400 +2023/08/16-18:00:19.388102 6103314432 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/16-18:00:19.388106 6103314432 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L1 1/0 993.68 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 1/0 993.68 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000022986d8#98180 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 4.2e-05 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** +2023/08/16-18:02:58.235441 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work +2023/08/16-18:02:58.236480 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692189358189015 b/rust/hyperlane_db/LOG.old.1692189358189015 new file mode 100644 index 0000000000..d6fd94e702 --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692189358189015 @@ -0,0 +1,285 @@ +2023/08/16-21:32:30.769301 8651103744 RocksDB version: 8.1.1 +2023/08/16-21:32:30.769807 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/16-21:32:30.769809 8651103744 DB SUMMARY +2023/08/16-21:32:30.769809 8651103744 DB Session ID: P16A00QX34WKBSB8TTTE +2023/08/16-21:32:30.769863 8651103744 CURRENT file: CURRENT +2023/08/16-21:32:30.769864 8651103744 IDENTITY file: IDENTITY +2023/08/16-21:32:30.769882 8651103744 MANIFEST file: MANIFEST-000090 size: 292 Bytes +2023/08/16-21:32:30.769884 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 1, files: 000086.sst +2023/08/16-21:32:30.769885 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000082.log size: 0 ; 000089.log size: 0 ; +2023/08/16-21:32:30.769886 8651103744 Options.error_if_exists: 0 +2023/08/16-21:32:30.769887 8651103744 Options.create_if_missing: 1 +2023/08/16-21:32:30.769888 8651103744 Options.paranoid_checks: 1 +2023/08/16-21:32:30.769888 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/16-21:32:30.769889 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/16-21:32:30.769889 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/16-21:32:30.769890 8651103744 Options.env: 0x103167858 +2023/08/16-21:32:30.769891 8651103744 Options.fs: PosixFileSystem +2023/08/16-21:32:30.769892 8651103744 Options.info_log: 0x15260aa28 +2023/08/16-21:32:30.769892 8651103744 Options.max_file_opening_threads: 16 +2023/08/16-21:32:30.769893 8651103744 Options.statistics: 0x0 +2023/08/16-21:32:30.769893 8651103744 Options.use_fsync: 0 +2023/08/16-21:32:30.769894 8651103744 Options.max_log_file_size: 0 +2023/08/16-21:32:30.769895 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/16-21:32:30.769895 8651103744 Options.log_file_time_to_roll: 0 +2023/08/16-21:32:30.769896 8651103744 Options.keep_log_file_num: 1000 +2023/08/16-21:32:30.769896 8651103744 Options.recycle_log_file_num: 0 +2023/08/16-21:32:30.769897 8651103744 Options.allow_fallocate: 1 +2023/08/16-21:32:30.769898 8651103744 Options.allow_mmap_reads: 0 +2023/08/16-21:32:30.769898 8651103744 Options.allow_mmap_writes: 0 +2023/08/16-21:32:30.769899 8651103744 Options.use_direct_reads: 0 +2023/08/16-21:32:30.769899 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/16-21:32:30.769900 8651103744 Options.create_missing_column_families: 0 +2023/08/16-21:32:30.769901 8651103744 Options.db_log_dir: +2023/08/16-21:32:30.769901 8651103744 Options.wal_dir: +2023/08/16-21:32:30.769902 8651103744 Options.table_cache_numshardbits: 6 +2023/08/16-21:32:30.769902 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/16-21:32:30.769903 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/16-21:32:30.769903 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/16-21:32:30.769904 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/16-21:32:30.769905 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/16-21:32:30.769905 8651103744 Options.advise_random_on_open: 1 +2023/08/16-21:32:30.769906 8651103744 Options.db_write_buffer_size: 0 +2023/08/16-21:32:30.769907 8651103744 Options.write_buffer_manager: 0x600002ec5380 +2023/08/16-21:32:30.769907 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/16-21:32:30.769908 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/16-21:32:30.769908 8651103744 Options.use_adaptive_mutex: 0 +2023/08/16-21:32:30.769909 8651103744 Options.rate_limiter: 0x0 +2023/08/16-21:32:30.769910 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/16-21:32:30.769910 8651103744 Options.wal_recovery_mode: 2 +2023/08/16-21:32:30.769911 8651103744 Options.enable_thread_tracking: 0 +2023/08/16-21:32:30.769911 8651103744 Options.enable_pipelined_write: 0 +2023/08/16-21:32:30.769912 8651103744 Options.unordered_write: 0 +2023/08/16-21:32:30.769913 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/16-21:32:30.769913 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/16-21:32:30.769914 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/16-21:32:30.769914 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/16-21:32:30.769915 8651103744 Options.row_cache: None +2023/08/16-21:32:30.769916 8651103744 Options.wal_filter: None +2023/08/16-21:32:30.769916 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/16-21:32:30.769917 8651103744 Options.allow_ingest_behind: 0 +2023/08/16-21:32:30.769917 8651103744 Options.two_write_queues: 0 +2023/08/16-21:32:30.769918 8651103744 Options.manual_wal_flush: 0 +2023/08/16-21:32:30.769919 8651103744 Options.wal_compression: 0 +2023/08/16-21:32:30.769919 8651103744 Options.atomic_flush: 0 +2023/08/16-21:32:30.769920 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/16-21:32:30.769920 8651103744 Options.persist_stats_to_disk: 0 +2023/08/16-21:32:30.769921 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/16-21:32:30.769922 8651103744 Options.log_readahead_size: 0 +2023/08/16-21:32:30.769922 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/16-21:32:30.769923 8651103744 Options.best_efforts_recovery: 0 +2023/08/16-21:32:30.769924 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/16-21:32:30.769924 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/16-21:32:30.769925 8651103744 Options.allow_data_in_errors: 0 +2023/08/16-21:32:30.769925 8651103744 Options.db_host_id: __hostname__ +2023/08/16-21:32:30.769926 8651103744 Options.enforce_single_del_contracts: true +2023/08/16-21:32:30.769927 8651103744 Options.max_background_jobs: 2 +2023/08/16-21:32:30.769927 8651103744 Options.max_background_compactions: -1 +2023/08/16-21:32:30.769928 8651103744 Options.max_subcompactions: 1 +2023/08/16-21:32:30.769928 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/16-21:32:30.769929 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/16-21:32:30.769930 8651103744 Options.delayed_write_rate : 16777216 +2023/08/16-21:32:30.769930 8651103744 Options.max_total_wal_size: 0 +2023/08/16-21:32:30.769931 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/16-21:32:30.769932 8651103744 Options.stats_dump_period_sec: 600 +2023/08/16-21:32:30.769932 8651103744 Options.stats_persist_period_sec: 600 +2023/08/16-21:32:30.769933 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/16-21:32:30.769933 8651103744 Options.max_open_files: -1 +2023/08/16-21:32:30.769934 8651103744 Options.bytes_per_sync: 0 +2023/08/16-21:32:30.769935 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/16-21:32:30.769935 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/16-21:32:30.769936 8651103744 Options.compaction_readahead_size: 0 +2023/08/16-21:32:30.769936 8651103744 Options.max_background_flushes: -1 +2023/08/16-21:32:30.769937 8651103744 Compression algorithms supported: +2023/08/16-21:32:30.769950 8651103744 kZSTD supported: 1 +2023/08/16-21:32:30.769951 8651103744 kZlibCompression supported: 1 +2023/08/16-21:32:30.769952 8651103744 kXpressCompression supported: 0 +2023/08/16-21:32:30.769952 8651103744 kSnappyCompression supported: 1 +2023/08/16-21:32:30.769953 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/16-21:32:30.769954 8651103744 kLZ4HCCompression supported: 1 +2023/08/16-21:32:30.769954 8651103744 kLZ4Compression supported: 1 +2023/08/16-21:32:30.769955 8651103744 kBZip2Compression supported: 1 +2023/08/16-21:32:30.769960 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/16-21:32:30.769961 8651103744 DMutex implementation: pthread_mutex_t +2023/08/16-21:32:30.770233 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000090 +2023/08/16-21:32:30.770279 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/16-21:32:30.770280 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/16-21:32:30.770281 8651103744 Options.merge_operator: None +2023/08/16-21:32:30.770282 8651103744 Options.compaction_filter: None +2023/08/16-21:32:30.770282 8651103744 Options.compaction_filter_factory: None +2023/08/16-21:32:30.770283 8651103744 Options.sst_partitioner_factory: None +2023/08/16-21:32:30.770284 8651103744 Options.memtable_factory: SkipListFactory +2023/08/16-21:32:30.770284 8651103744 Options.table_factory: BlockBasedTable +2023/08/16-21:32:30.770294 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x6000015c8640) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000020c46d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/16-21:32:30.770296 8651103744 Options.write_buffer_size: 67108864 +2023/08/16-21:32:30.770296 8651103744 Options.max_write_buffer_number: 2 +2023/08/16-21:32:30.770297 8651103744 Options.compression: Snappy +2023/08/16-21:32:30.770298 8651103744 Options.bottommost_compression: Disabled +2023/08/16-21:32:30.770298 8651103744 Options.prefix_extractor: nullptr +2023/08/16-21:32:30.770299 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/16-21:32:30.770299 8651103744 Options.num_levels: 7 +2023/08/16-21:32:30.770300 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/16-21:32:30.770301 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/16-21:32:30.770301 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/16-21:32:30.770302 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/16-21:32:30.770302 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/16-21:32:30.770303 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/16-21:32:30.770304 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/16-21:32:30.770304 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/16-21:32:30.770305 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/16-21:32:30.770306 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/16-21:32:30.770306 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-21:32:30.770307 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/16-21:32:30.770307 8651103744 Options.compression_opts.window_bits: -14 +2023/08/16-21:32:30.770308 8651103744 Options.compression_opts.level: 32767 +2023/08/16-21:32:30.770309 8651103744 Options.compression_opts.strategy: 0 +2023/08/16-21:32:30.770309 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/16-21:32:30.770310 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/16-21:32:30.770310 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/16-21:32:30.770311 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/16-21:32:30.770312 8651103744 Options.compression_opts.enabled: false +2023/08/16-21:32:30.770312 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-21:32:30.770313 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/16-21:32:30.770313 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/16-21:32:30.770314 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/16-21:32:30.770315 8651103744 Options.target_file_size_base: 67108864 +2023/08/16-21:32:30.770315 8651103744 Options.target_file_size_multiplier: 1 +2023/08/16-21:32:30.770316 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/16-21:32:30.770316 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/16-21:32:30.770317 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/16-21:32:30.770318 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/16-21:32:30.770318 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/16-21:32:30.770319 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/16-21:32:30.770320 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/16-21:32:30.770320 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/16-21:32:30.770321 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/16-21:32:30.770321 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/16-21:32:30.770322 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/16-21:32:30.770323 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/16-21:32:30.770323 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/16-21:32:30.770324 8651103744 Options.arena_block_size: 1048576 +2023/08/16-21:32:30.770324 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/16-21:32:30.770325 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/16-21:32:30.770326 8651103744 Options.disable_auto_compactions: 0 +2023/08/16-21:32:30.770326 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/16-21:32:30.770327 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/16-21:32:30.770328 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/16-21:32:30.770328 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/16-21:32:30.770329 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/16-21:32:30.770330 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/16-21:32:30.770330 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/16-21:32:30.770332 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/16-21:32:30.770333 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/16-21:32:30.770333 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/16-21:32:30.770335 8651103744 Options.table_properties_collectors: +2023/08/16-21:32:30.770335 8651103744 Options.inplace_update_support: 0 +2023/08/16-21:32:30.770336 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/16-21:32:30.770336 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/16-21:32:30.770337 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/16-21:32:30.770338 8651103744 Options.memtable_huge_page_size: 0 +2023/08/16-21:32:30.770338 8651103744 Options.bloom_locality: 0 +2023/08/16-21:32:30.770339 8651103744 Options.max_successive_merges: 0 +2023/08/16-21:32:30.770339 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/16-21:32:30.770340 8651103744 Options.paranoid_file_checks: 0 +2023/08/16-21:32:30.770340 8651103744 Options.force_consistency_checks: 1 +2023/08/16-21:32:30.770341 8651103744 Options.report_bg_io_stats: 0 +2023/08/16-21:32:30.770342 8651103744 Options.ttl: 2592000 +2023/08/16-21:32:30.770342 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/16-21:32:30.770343 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/16-21:32:30.770343 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/16-21:32:30.770344 8651103744 Options.enable_blob_files: false +2023/08/16-21:32:30.770345 8651103744 Options.min_blob_size: 0 +2023/08/16-21:32:30.770345 8651103744 Options.blob_file_size: 268435456 +2023/08/16-21:32:30.770346 8651103744 Options.blob_compression_type: NoCompression +2023/08/16-21:32:30.770346 8651103744 Options.enable_blob_garbage_collection: false +2023/08/16-21:32:30.770347 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/16-21:32:30.770348 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/16-21:32:30.770348 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/16-21:32:30.770349 8651103744 Options.blob_file_starting_level: 0 +2023/08/16-21:32:30.770350 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/16-21:32:30.771237 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000090 succeeded,manifest_file_number is 90, next_file_number is 92, last_sequence is 22666, log_number is 83,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 78 +2023/08/16-21:32:30.771240 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 83 +2023/08/16-21:32:30.771275 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/16-21:32:30.771358 8651103744 EVENT_LOG_v1 {"time_micros": 1692189150771355, "job": 1, "event": "recovery_started", "wal_files": [82, 89]} +2023/08/16-21:32:30.771360 8651103744 [db/db_impl/db_impl_open.cc:1018] Skipping log #82 since it is older than min log to keep #83 +2023/08/16-21:32:30.771361 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #89 mode 2 +2023/08/16-21:32:30.771392 8651103744 EVENT_LOG_v1 {"time_micros": 1692189150771391, "job": 1, "event": "recovery_finished"} +2023/08/16-21:32:30.771430 8651103744 [db/version_set.cc:5180] Creating manifest 94 +2023/08/16-21:32:30.772651 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x152704080 +2023/08/16-21:32:30.772681 8651103744 DB pointer 0x15282a000 +2023/08/16-21:32:30.772805 6158135296 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/16-21:32:30.772807 6158135296 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L1 1/0 993.68 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 1/0 993.68 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000020c46d8#99935 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 6e-06 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** +2023/08/16-21:33:36.775832 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work +2023/08/16-21:33:36.777367 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692192433499495 b/rust/hyperlane_db/LOG.old.1692192433499495 new file mode 100644 index 0000000000..046f57c44d --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692192433499495 @@ -0,0 +1,292 @@ +2023/08/16-21:35:58.189706 8651103744 RocksDB version: 8.1.1 +2023/08/16-21:35:58.190559 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/16-21:35:58.190562 8651103744 DB SUMMARY +2023/08/16-21:35:58.190564 8651103744 DB Session ID: 6Q5D50G7PHP9U84VQOA7 +2023/08/16-21:35:58.190724 8651103744 CURRENT file: CURRENT +2023/08/16-21:35:58.190727 8651103744 IDENTITY file: IDENTITY +2023/08/16-21:35:58.190751 8651103744 MANIFEST file: MANIFEST-000094 size: 292 Bytes +2023/08/16-21:35:58.190754 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 1, files: 000086.sst +2023/08/16-21:35:58.190780 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000082.log size: 0 ; 000089.log size: 0 ; 000093.log size: 46229 ; +2023/08/16-21:35:58.190785 8651103744 Options.error_if_exists: 0 +2023/08/16-21:35:58.190787 8651103744 Options.create_if_missing: 1 +2023/08/16-21:35:58.190789 8651103744 Options.paranoid_checks: 1 +2023/08/16-21:35:58.190790 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/16-21:35:58.190791 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/16-21:35:58.190793 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/16-21:35:58.190794 8651103744 Options.env: 0x1029d3828 +2023/08/16-21:35:58.190796 8651103744 Options.fs: PosixFileSystem +2023/08/16-21:35:58.190797 8651103744 Options.info_log: 0x13e805fb8 +2023/08/16-21:35:58.190799 8651103744 Options.max_file_opening_threads: 16 +2023/08/16-21:35:58.190800 8651103744 Options.statistics: 0x0 +2023/08/16-21:35:58.190817 8651103744 Options.use_fsync: 0 +2023/08/16-21:35:58.190819 8651103744 Options.max_log_file_size: 0 +2023/08/16-21:35:58.190820 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/16-21:35:58.190821 8651103744 Options.log_file_time_to_roll: 0 +2023/08/16-21:35:58.190823 8651103744 Options.keep_log_file_num: 1000 +2023/08/16-21:35:58.190824 8651103744 Options.recycle_log_file_num: 0 +2023/08/16-21:35:58.190825 8651103744 Options.allow_fallocate: 1 +2023/08/16-21:35:58.190827 8651103744 Options.allow_mmap_reads: 0 +2023/08/16-21:35:58.190828 8651103744 Options.allow_mmap_writes: 0 +2023/08/16-21:35:58.190829 8651103744 Options.use_direct_reads: 0 +2023/08/16-21:35:58.190831 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/16-21:35:58.190832 8651103744 Options.create_missing_column_families: 0 +2023/08/16-21:35:58.190833 8651103744 Options.db_log_dir: +2023/08/16-21:35:58.190835 8651103744 Options.wal_dir: +2023/08/16-21:35:58.190836 8651103744 Options.table_cache_numshardbits: 6 +2023/08/16-21:35:58.190837 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/16-21:35:58.190839 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/16-21:35:58.190840 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/16-21:35:58.190842 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/16-21:35:58.190843 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/16-21:35:58.190844 8651103744 Options.advise_random_on_open: 1 +2023/08/16-21:35:58.190846 8651103744 Options.db_write_buffer_size: 0 +2023/08/16-21:35:58.190847 8651103744 Options.write_buffer_manager: 0x600001798820 +2023/08/16-21:35:58.190848 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/16-21:35:58.190850 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/16-21:35:58.190851 8651103744 Options.use_adaptive_mutex: 0 +2023/08/16-21:35:58.190852 8651103744 Options.rate_limiter: 0x0 +2023/08/16-21:35:58.190854 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/16-21:35:58.190855 8651103744 Options.wal_recovery_mode: 2 +2023/08/16-21:35:58.190856 8651103744 Options.enable_thread_tracking: 0 +2023/08/16-21:35:58.190858 8651103744 Options.enable_pipelined_write: 0 +2023/08/16-21:35:58.190859 8651103744 Options.unordered_write: 0 +2023/08/16-21:35:58.190860 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/16-21:35:58.190862 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/16-21:35:58.190863 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/16-21:35:58.190864 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/16-21:35:58.190866 8651103744 Options.row_cache: None +2023/08/16-21:35:58.190867 8651103744 Options.wal_filter: None +2023/08/16-21:35:58.190868 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/16-21:35:58.190870 8651103744 Options.allow_ingest_behind: 0 +2023/08/16-21:35:58.190871 8651103744 Options.two_write_queues: 0 +2023/08/16-21:35:58.190872 8651103744 Options.manual_wal_flush: 0 +2023/08/16-21:35:58.190874 8651103744 Options.wal_compression: 0 +2023/08/16-21:35:58.190875 8651103744 Options.atomic_flush: 0 +2023/08/16-21:35:58.190876 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/16-21:35:58.190878 8651103744 Options.persist_stats_to_disk: 0 +2023/08/16-21:35:58.190879 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/16-21:35:58.190880 8651103744 Options.log_readahead_size: 0 +2023/08/16-21:35:58.190882 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/16-21:35:58.190883 8651103744 Options.best_efforts_recovery: 0 +2023/08/16-21:35:58.190885 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/16-21:35:58.190886 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/16-21:35:58.190887 8651103744 Options.allow_data_in_errors: 0 +2023/08/16-21:35:58.190889 8651103744 Options.db_host_id: __hostname__ +2023/08/16-21:35:58.190890 8651103744 Options.enforce_single_del_contracts: true +2023/08/16-21:35:58.190891 8651103744 Options.max_background_jobs: 2 +2023/08/16-21:35:58.190893 8651103744 Options.max_background_compactions: -1 +2023/08/16-21:35:58.190894 8651103744 Options.max_subcompactions: 1 +2023/08/16-21:35:58.190895 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/16-21:35:58.190897 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/16-21:35:58.190898 8651103744 Options.delayed_write_rate : 16777216 +2023/08/16-21:35:58.190899 8651103744 Options.max_total_wal_size: 0 +2023/08/16-21:35:58.190901 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/16-21:35:58.190902 8651103744 Options.stats_dump_period_sec: 600 +2023/08/16-21:35:58.190904 8651103744 Options.stats_persist_period_sec: 600 +2023/08/16-21:35:58.190905 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/16-21:35:58.190906 8651103744 Options.max_open_files: -1 +2023/08/16-21:35:58.190908 8651103744 Options.bytes_per_sync: 0 +2023/08/16-21:35:58.190909 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/16-21:35:58.190910 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/16-21:35:58.190911 8651103744 Options.compaction_readahead_size: 0 +2023/08/16-21:35:58.190913 8651103744 Options.max_background_flushes: -1 +2023/08/16-21:35:58.190914 8651103744 Compression algorithms supported: +2023/08/16-21:35:58.190939 8651103744 kZSTD supported: 1 +2023/08/16-21:35:58.190941 8651103744 kZlibCompression supported: 1 +2023/08/16-21:35:58.190942 8651103744 kXpressCompression supported: 0 +2023/08/16-21:35:58.190944 8651103744 kSnappyCompression supported: 1 +2023/08/16-21:35:58.190945 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/16-21:35:58.190946 8651103744 kLZ4HCCompression supported: 1 +2023/08/16-21:35:58.190948 8651103744 kLZ4Compression supported: 1 +2023/08/16-21:35:58.190949 8651103744 kBZip2Compression supported: 1 +2023/08/16-21:35:58.190960 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/16-21:35:58.190961 8651103744 DMutex implementation: pthread_mutex_t +2023/08/16-21:35:58.191176 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000094 +2023/08/16-21:35:58.191312 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/16-21:35:58.191314 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/16-21:35:58.191316 8651103744 Options.merge_operator: None +2023/08/16-21:35:58.191317 8651103744 Options.compaction_filter: None +2023/08/16-21:35:58.191319 8651103744 Options.compaction_filter_factory: None +2023/08/16-21:35:58.191320 8651103744 Options.sst_partitioner_factory: None +2023/08/16-21:35:58.191321 8651103744 Options.memtable_factory: SkipListFactory +2023/08/16-21:35:58.191323 8651103744 Options.table_factory: BlockBasedTable +2023/08/16-21:35:58.191371 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600002c9c640) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000019980d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/16-21:35:58.191376 8651103744 Options.write_buffer_size: 67108864 +2023/08/16-21:35:58.191377 8651103744 Options.max_write_buffer_number: 2 +2023/08/16-21:35:58.191379 8651103744 Options.compression: Snappy +2023/08/16-21:35:58.191380 8651103744 Options.bottommost_compression: Disabled +2023/08/16-21:35:58.191382 8651103744 Options.prefix_extractor: nullptr +2023/08/16-21:35:58.191383 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/16-21:35:58.191384 8651103744 Options.num_levels: 7 +2023/08/16-21:35:58.191386 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/16-21:35:58.191387 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/16-21:35:58.191389 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/16-21:35:58.191390 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/16-21:35:58.191391 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/16-21:35:58.191393 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/16-21:35:58.191394 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/16-21:35:58.191396 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/16-21:35:58.191397 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/16-21:35:58.191398 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/16-21:35:58.191400 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-21:35:58.191401 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/16-21:35:58.191402 8651103744 Options.compression_opts.window_bits: -14 +2023/08/16-21:35:58.191404 8651103744 Options.compression_opts.level: 32767 +2023/08/16-21:35:58.191405 8651103744 Options.compression_opts.strategy: 0 +2023/08/16-21:35:58.191406 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/16-21:35:58.191408 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/16-21:35:58.191409 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/16-21:35:58.191410 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/16-21:35:58.191412 8651103744 Options.compression_opts.enabled: false +2023/08/16-21:35:58.191413 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-21:35:58.191414 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/16-21:35:58.191416 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/16-21:35:58.191417 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/16-21:35:58.191418 8651103744 Options.target_file_size_base: 67108864 +2023/08/16-21:35:58.191420 8651103744 Options.target_file_size_multiplier: 1 +2023/08/16-21:35:58.191421 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/16-21:35:58.191422 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/16-21:35:58.191424 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/16-21:35:58.191425 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/16-21:35:58.191427 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/16-21:35:58.191428 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/16-21:35:58.191429 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/16-21:35:58.191431 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/16-21:35:58.191432 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/16-21:35:58.191434 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/16-21:35:58.191435 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/16-21:35:58.191436 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/16-21:35:58.191438 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/16-21:35:58.191439 8651103744 Options.arena_block_size: 1048576 +2023/08/16-21:35:58.191440 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/16-21:35:58.191442 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/16-21:35:58.191443 8651103744 Options.disable_auto_compactions: 0 +2023/08/16-21:35:58.191445 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/16-21:35:58.191446 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/16-21:35:58.191447 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/16-21:35:58.191449 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/16-21:35:58.191450 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/16-21:35:58.191451 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/16-21:35:58.191455 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/16-21:35:58.191457 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/16-21:35:58.191458 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/16-21:35:58.191460 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/16-21:35:58.191462 8651103744 Options.table_properties_collectors: +2023/08/16-21:35:58.191463 8651103744 Options.inplace_update_support: 0 +2023/08/16-21:35:58.191464 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/16-21:35:58.191466 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/16-21:35:58.191467 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/16-21:35:58.191468 8651103744 Options.memtable_huge_page_size: 0 +2023/08/16-21:35:58.191470 8651103744 Options.bloom_locality: 0 +2023/08/16-21:35:58.191471 8651103744 Options.max_successive_merges: 0 +2023/08/16-21:35:58.191472 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/16-21:35:58.191474 8651103744 Options.paranoid_file_checks: 0 +2023/08/16-21:35:58.191475 8651103744 Options.force_consistency_checks: 1 +2023/08/16-21:35:58.191476 8651103744 Options.report_bg_io_stats: 0 +2023/08/16-21:35:58.191477 8651103744 Options.ttl: 2592000 +2023/08/16-21:35:58.191479 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/16-21:35:58.191480 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/16-21:35:58.191481 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/16-21:35:58.191483 8651103744 Options.enable_blob_files: false +2023/08/16-21:35:58.191484 8651103744 Options.min_blob_size: 0 +2023/08/16-21:35:58.191485 8651103744 Options.blob_file_size: 268435456 +2023/08/16-21:35:58.191487 8651103744 Options.blob_compression_type: NoCompression +2023/08/16-21:35:58.191488 8651103744 Options.enable_blob_garbage_collection: false +2023/08/16-21:35:58.191489 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/16-21:35:58.191491 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/16-21:35:58.191493 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/16-21:35:58.191494 8651103744 Options.blob_file_starting_level: 0 +2023/08/16-21:35:58.191495 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/16-21:35:58.192461 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000094 succeeded,manifest_file_number is 94, next_file_number is 96, last_sequence is 22666, log_number is 90,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 78 +2023/08/16-21:35:58.192464 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 90 +2023/08/16-21:35:58.192504 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/16-21:35:58.192584 8651103744 EVENT_LOG_v1 {"time_micros": 1692189358192579, "job": 1, "event": "recovery_started", "wal_files": [82, 89, 93]} +2023/08/16-21:35:58.192585 8651103744 [db/db_impl/db_impl_open.cc:1018] Skipping log #82 since it is older than min log to keep #90 +2023/08/16-21:35:58.192586 8651103744 [db/db_impl/db_impl_open.cc:1018] Skipping log #89 since it is older than min log to keep #90 +2023/08/16-21:35:58.192587 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #93 mode 2 +2023/08/16-21:35:58.193313 8651103744 EVENT_LOG_v1 {"time_micros": 1692189358193297, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 97, "file_size": 20584, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 22667, "largest_seqno": 23080, "table_properties": {"data_size": 19455, "index_size": 256, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 19241, "raw_average_key_size": 46, "raw_value_size": 21103, "raw_average_value_size": 51, "num_data_blocks": 8, "num_entries": 413, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692189358, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "6Q5D50G7PHP9U84VQOA7", "orig_file_number": 97, "seqno_to_time_mapping": "N/A"}} +2023/08/16-21:35:58.193374 8651103744 EVENT_LOG_v1 {"time_micros": 1692189358193373, "job": 1, "event": "recovery_finished"} +2023/08/16-21:35:58.193424 8651103744 [db/version_set.cc:5180] Creating manifest 99 +2023/08/16-21:35:58.194750 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000093.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-21:35:58.194779 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000089.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-21:35:58.194808 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000082.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-21:35:58.194831 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x13e806110 +2023/08/16-21:35:58.194865 8651103744 DB pointer 0x13f00c200 +2023/08/16-21:35:58.195001 6165786624 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/16-21:35:58.195003 6165786624 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 1/0 20.10 KB 0.2 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 39.2 0.00 0.00 1 0.001 0 0 0.0 0.0 + L1 1/0 993.68 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 2/0 1013.79 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 39.2 0.00 0.00 1 0.001 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 39.2 0.00 0.00 1 0.001 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 39.2 0.00 0.00 1 0.001 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 5.33 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 5.33 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000019980d8#206 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 8e-06 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** +2023/08/16-21:37:07.328153 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work +2023/08/16-21:37:07.330754 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692193518543053 b/rust/hyperlane_db/LOG.old.1692193518543053 new file mode 100644 index 0000000000..e1b4039b9b --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692193518543053 @@ -0,0 +1,286 @@ +2023/08/16-22:27:13.500014 8651103744 RocksDB version: 8.1.1 +2023/08/16-22:27:13.500584 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/16-22:27:13.500586 8651103744 DB SUMMARY +2023/08/16-22:27:13.500587 8651103744 DB Session ID: ED6695YEJ5UB321WDFGK +2023/08/16-22:27:13.500641 8651103744 CURRENT file: CURRENT +2023/08/16-22:27:13.500643 8651103744 IDENTITY file: IDENTITY +2023/08/16-22:27:13.500653 8651103744 MANIFEST file: MANIFEST-000099 size: 498 Bytes +2023/08/16-22:27:13.500655 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 2, files: 000086.sst 000097.sst +2023/08/16-22:27:13.500670 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000098.log size: 37729 ; +2023/08/16-22:27:13.500672 8651103744 Options.error_if_exists: 0 +2023/08/16-22:27:13.500673 8651103744 Options.create_if_missing: 1 +2023/08/16-22:27:13.500674 8651103744 Options.paranoid_checks: 1 +2023/08/16-22:27:13.500674 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/16-22:27:13.500675 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/16-22:27:13.500676 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/16-22:27:13.500676 8651103744 Options.env: 0x104fb3828 +2023/08/16-22:27:13.500677 8651103744 Options.fs: PosixFileSystem +2023/08/16-22:27:13.500678 8651103744 Options.info_log: 0x15aa04098 +2023/08/16-22:27:13.500679 8651103744 Options.max_file_opening_threads: 16 +2023/08/16-22:27:13.500680 8651103744 Options.statistics: 0x0 +2023/08/16-22:27:13.500680 8651103744 Options.use_fsync: 0 +2023/08/16-22:27:13.500681 8651103744 Options.max_log_file_size: 0 +2023/08/16-22:27:13.500682 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/16-22:27:13.500683 8651103744 Options.log_file_time_to_roll: 0 +2023/08/16-22:27:13.500683 8651103744 Options.keep_log_file_num: 1000 +2023/08/16-22:27:13.500684 8651103744 Options.recycle_log_file_num: 0 +2023/08/16-22:27:13.500685 8651103744 Options.allow_fallocate: 1 +2023/08/16-22:27:13.500685 8651103744 Options.allow_mmap_reads: 0 +2023/08/16-22:27:13.500686 8651103744 Options.allow_mmap_writes: 0 +2023/08/16-22:27:13.500687 8651103744 Options.use_direct_reads: 0 +2023/08/16-22:27:13.500687 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/16-22:27:13.500688 8651103744 Options.create_missing_column_families: 0 +2023/08/16-22:27:13.500689 8651103744 Options.db_log_dir: +2023/08/16-22:27:13.500690 8651103744 Options.wal_dir: +2023/08/16-22:27:13.500690 8651103744 Options.table_cache_numshardbits: 6 +2023/08/16-22:27:13.500691 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/16-22:27:13.500692 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/16-22:27:13.500692 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/16-22:27:13.500693 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/16-22:27:13.500694 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/16-22:27:13.500695 8651103744 Options.advise_random_on_open: 1 +2023/08/16-22:27:13.500695 8651103744 Options.db_write_buffer_size: 0 +2023/08/16-22:27:13.500696 8651103744 Options.write_buffer_manager: 0x600000b74000 +2023/08/16-22:27:13.500697 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/16-22:27:13.500698 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/16-22:27:13.500698 8651103744 Options.use_adaptive_mutex: 0 +2023/08/16-22:27:13.500699 8651103744 Options.rate_limiter: 0x0 +2023/08/16-22:27:13.500700 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/16-22:27:13.500701 8651103744 Options.wal_recovery_mode: 2 +2023/08/16-22:27:13.500701 8651103744 Options.enable_thread_tracking: 0 +2023/08/16-22:27:13.500702 8651103744 Options.enable_pipelined_write: 0 +2023/08/16-22:27:13.500703 8651103744 Options.unordered_write: 0 +2023/08/16-22:27:13.500703 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/16-22:27:13.500704 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/16-22:27:13.500705 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/16-22:27:13.500705 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/16-22:27:13.500706 8651103744 Options.row_cache: None +2023/08/16-22:27:13.500707 8651103744 Options.wal_filter: None +2023/08/16-22:27:13.500708 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/16-22:27:13.500708 8651103744 Options.allow_ingest_behind: 0 +2023/08/16-22:27:13.500709 8651103744 Options.two_write_queues: 0 +2023/08/16-22:27:13.500710 8651103744 Options.manual_wal_flush: 0 +2023/08/16-22:27:13.500710 8651103744 Options.wal_compression: 0 +2023/08/16-22:27:13.500711 8651103744 Options.atomic_flush: 0 +2023/08/16-22:27:13.500712 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/16-22:27:13.500712 8651103744 Options.persist_stats_to_disk: 0 +2023/08/16-22:27:13.500713 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/16-22:27:13.500714 8651103744 Options.log_readahead_size: 0 +2023/08/16-22:27:13.500715 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/16-22:27:13.500715 8651103744 Options.best_efforts_recovery: 0 +2023/08/16-22:27:13.500716 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/16-22:27:13.500717 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/16-22:27:13.500718 8651103744 Options.allow_data_in_errors: 0 +2023/08/16-22:27:13.500718 8651103744 Options.db_host_id: __hostname__ +2023/08/16-22:27:13.500719 8651103744 Options.enforce_single_del_contracts: true +2023/08/16-22:27:13.500720 8651103744 Options.max_background_jobs: 2 +2023/08/16-22:27:13.500720 8651103744 Options.max_background_compactions: -1 +2023/08/16-22:27:13.500721 8651103744 Options.max_subcompactions: 1 +2023/08/16-22:27:13.500722 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/16-22:27:13.500722 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/16-22:27:13.500723 8651103744 Options.delayed_write_rate : 16777216 +2023/08/16-22:27:13.500724 8651103744 Options.max_total_wal_size: 0 +2023/08/16-22:27:13.500725 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/16-22:27:13.500725 8651103744 Options.stats_dump_period_sec: 600 +2023/08/16-22:27:13.500726 8651103744 Options.stats_persist_period_sec: 600 +2023/08/16-22:27:13.500727 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/16-22:27:13.500728 8651103744 Options.max_open_files: -1 +2023/08/16-22:27:13.500728 8651103744 Options.bytes_per_sync: 0 +2023/08/16-22:27:13.500729 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/16-22:27:13.500730 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/16-22:27:13.500730 8651103744 Options.compaction_readahead_size: 0 +2023/08/16-22:27:13.500731 8651103744 Options.max_background_flushes: -1 +2023/08/16-22:27:13.500732 8651103744 Compression algorithms supported: +2023/08/16-22:27:13.500747 8651103744 kZSTD supported: 1 +2023/08/16-22:27:13.500748 8651103744 kZlibCompression supported: 1 +2023/08/16-22:27:13.500749 8651103744 kXpressCompression supported: 0 +2023/08/16-22:27:13.500749 8651103744 kSnappyCompression supported: 1 +2023/08/16-22:27:13.500750 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/16-22:27:13.500751 8651103744 kLZ4HCCompression supported: 1 +2023/08/16-22:27:13.500751 8651103744 kLZ4Compression supported: 1 +2023/08/16-22:27:13.500752 8651103744 kBZip2Compression supported: 1 +2023/08/16-22:27:13.500760 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/16-22:27:13.500761 8651103744 DMutex implementation: pthread_mutex_t +2023/08/16-22:27:13.500885 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000099 +2023/08/16-22:27:13.501107 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/16-22:27:13.501113 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/16-22:27:13.501114 8651103744 Options.merge_operator: None +2023/08/16-22:27:13.501115 8651103744 Options.compaction_filter: None +2023/08/16-22:27:13.501116 8651103744 Options.compaction_filter_factory: None +2023/08/16-22:27:13.501117 8651103744 Options.sst_partitioner_factory: None +2023/08/16-22:27:13.501118 8651103744 Options.memtable_factory: SkipListFactory +2023/08/16-22:27:13.501118 8651103744 Options.table_factory: BlockBasedTable +2023/08/16-22:27:13.501153 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x60000307a340) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000005780d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/16-22:27:13.501156 8651103744 Options.write_buffer_size: 67108864 +2023/08/16-22:27:13.501157 8651103744 Options.max_write_buffer_number: 2 +2023/08/16-22:27:13.501158 8651103744 Options.compression: Snappy +2023/08/16-22:27:13.501159 8651103744 Options.bottommost_compression: Disabled +2023/08/16-22:27:13.501160 8651103744 Options.prefix_extractor: nullptr +2023/08/16-22:27:13.501160 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/16-22:27:13.501161 8651103744 Options.num_levels: 7 +2023/08/16-22:27:13.501162 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/16-22:27:13.501163 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/16-22:27:13.501163 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/16-22:27:13.501164 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/16-22:27:13.501165 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/16-22:27:13.501166 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/16-22:27:13.501217 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/16-22:27:13.501220 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/16-22:27:13.501221 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/16-22:27:13.501222 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/16-22:27:13.501223 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-22:27:13.501224 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/16-22:27:13.501224 8651103744 Options.compression_opts.window_bits: -14 +2023/08/16-22:27:13.501225 8651103744 Options.compression_opts.level: 32767 +2023/08/16-22:27:13.501226 8651103744 Options.compression_opts.strategy: 0 +2023/08/16-22:27:13.501227 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/16-22:27:13.501227 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/16-22:27:13.501228 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/16-22:27:13.501229 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/16-22:27:13.501230 8651103744 Options.compression_opts.enabled: false +2023/08/16-22:27:13.501230 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-22:27:13.501231 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/16-22:27:13.501232 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/16-22:27:13.501232 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/16-22:27:13.501233 8651103744 Options.target_file_size_base: 67108864 +2023/08/16-22:27:13.501234 8651103744 Options.target_file_size_multiplier: 1 +2023/08/16-22:27:13.501235 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/16-22:27:13.501235 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/16-22:27:13.501236 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/16-22:27:13.501238 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/16-22:27:13.501239 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/16-22:27:13.501240 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/16-22:27:13.501240 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/16-22:27:13.501241 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/16-22:27:13.501242 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/16-22:27:13.501242 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/16-22:27:13.501243 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/16-22:27:13.501244 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/16-22:27:13.501244 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/16-22:27:13.501245 8651103744 Options.arena_block_size: 1048576 +2023/08/16-22:27:13.501246 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/16-22:27:13.501247 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/16-22:27:13.501247 8651103744 Options.disable_auto_compactions: 0 +2023/08/16-22:27:13.501248 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/16-22:27:13.501249 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/16-22:27:13.501250 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/16-22:27:13.501251 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/16-22:27:13.501251 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/16-22:27:13.501252 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/16-22:27:13.501253 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/16-22:27:13.501258 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/16-22:27:13.501259 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/16-22:27:13.501260 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/16-22:27:13.501261 8651103744 Options.table_properties_collectors: +2023/08/16-22:27:13.501262 8651103744 Options.inplace_update_support: 0 +2023/08/16-22:27:13.501263 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/16-22:27:13.501263 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/16-22:27:13.501264 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/16-22:27:13.501265 8651103744 Options.memtable_huge_page_size: 0 +2023/08/16-22:27:13.501266 8651103744 Options.bloom_locality: 0 +2023/08/16-22:27:13.501266 8651103744 Options.max_successive_merges: 0 +2023/08/16-22:27:13.501267 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/16-22:27:13.501268 8651103744 Options.paranoid_file_checks: 0 +2023/08/16-22:27:13.501269 8651103744 Options.force_consistency_checks: 1 +2023/08/16-22:27:13.501269 8651103744 Options.report_bg_io_stats: 0 +2023/08/16-22:27:13.501270 8651103744 Options.ttl: 2592000 +2023/08/16-22:27:13.501271 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/16-22:27:13.501271 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/16-22:27:13.501272 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/16-22:27:13.501273 8651103744 Options.enable_blob_files: false +2023/08/16-22:27:13.501273 8651103744 Options.min_blob_size: 0 +2023/08/16-22:27:13.501274 8651103744 Options.blob_file_size: 268435456 +2023/08/16-22:27:13.501275 8651103744 Options.blob_compression_type: NoCompression +2023/08/16-22:27:13.501276 8651103744 Options.enable_blob_garbage_collection: false +2023/08/16-22:27:13.501276 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/16-22:27:13.501277 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/16-22:27:13.501278 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/16-22:27:13.501279 8651103744 Options.blob_file_starting_level: 0 +2023/08/16-22:27:13.501279 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/16-22:27:13.502304 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000099 succeeded,manifest_file_number is 99, next_file_number is 101, last_sequence is 23080, log_number is 94,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 94 +2023/08/16-22:27:13.502309 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 94 +2023/08/16-22:27:13.502378 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/16-22:27:13.502574 8651103744 EVENT_LOG_v1 {"time_micros": 1692192433502570, "job": 1, "event": "recovery_started", "wal_files": [98]} +2023/08/16-22:27:13.502577 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #98 mode 2 +2023/08/16-22:27:13.506097 8651103744 EVENT_LOG_v1 {"time_micros": 1692192433506051, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 102, "file_size": 16085, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 23081, "largest_seqno": 23413, "table_properties": {"data_size": 14939, "index_size": 255, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 15062, "raw_average_key_size": 45, "raw_value_size": 17926, "raw_average_value_size": 53, "num_data_blocks": 7, "num_entries": 332, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692192433, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "ED6695YEJ5UB321WDFGK", "orig_file_number": 102, "seqno_to_time_mapping": "N/A"}} +2023/08/16-22:27:13.506998 8651103744 EVENT_LOG_v1 {"time_micros": 1692192433506887, "job": 1, "event": "recovery_finished"} +2023/08/16-22:27:13.507106 8651103744 [db/version_set.cc:5180] Creating manifest 104 +2023/08/16-22:27:13.508806 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000098.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-22:27:13.508837 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x15a904600 +2023/08/16-22:27:13.508885 8651103744 DB pointer 0x15c00b000 +2023/08/16-22:27:13.509072 6126071808 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/16-22:27:13.509075 6126071808 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 2/0 35.81 KB 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 8.3 0.00 0.00 1 0.002 0 0 0.0 0.0 + L1 1/0 993.68 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 3/0 1.01 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 8.3 0.00 0.00 1 0.002 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 8.3 0.00 0.00 1 0.002 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.3 0.00 0.00 1 0.002 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 1.92 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 1.92 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000005780d8#1093 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 1.2e-05 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692194047418516 b/rust/hyperlane_db/LOG.old.1692194047418516 new file mode 100644 index 0000000000..82593b49c8 --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692194047418516 @@ -0,0 +1,286 @@ +2023/08/16-22:45:18.544185 8651103744 RocksDB version: 8.1.1 +2023/08/16-22:45:18.544874 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/16-22:45:18.544876 8651103744 DB SUMMARY +2023/08/16-22:45:18.544878 8651103744 DB Session ID: 99EJLH68EJGAQEYVRSD6 +2023/08/16-22:45:18.544944 8651103744 CURRENT file: CURRENT +2023/08/16-22:45:18.544946 8651103744 IDENTITY file: IDENTITY +2023/08/16-22:45:18.544965 8651103744 MANIFEST file: MANIFEST-000104 size: 656 Bytes +2023/08/16-22:45:18.544967 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 3, files: 000086.sst 000097.sst 000102.sst +2023/08/16-22:45:18.544988 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000103.log size: 13465 ; +2023/08/16-22:45:18.544990 8651103744 Options.error_if_exists: 0 +2023/08/16-22:45:18.544992 8651103744 Options.create_if_missing: 1 +2023/08/16-22:45:18.544993 8651103744 Options.paranoid_checks: 1 +2023/08/16-22:45:18.544994 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/16-22:45:18.544995 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/16-22:45:18.544996 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/16-22:45:18.544997 8651103744 Options.env: 0x106287828 +2023/08/16-22:45:18.544998 8651103744 Options.fs: PosixFileSystem +2023/08/16-22:45:18.544999 8651103744 Options.info_log: 0x155e0a708 +2023/08/16-22:45:18.545001 8651103744 Options.max_file_opening_threads: 16 +2023/08/16-22:45:18.545002 8651103744 Options.statistics: 0x0 +2023/08/16-22:45:18.545003 8651103744 Options.use_fsync: 0 +2023/08/16-22:45:18.545004 8651103744 Options.max_log_file_size: 0 +2023/08/16-22:45:18.545005 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/16-22:45:18.545006 8651103744 Options.log_file_time_to_roll: 0 +2023/08/16-22:45:18.545007 8651103744 Options.keep_log_file_num: 1000 +2023/08/16-22:45:18.545008 8651103744 Options.recycle_log_file_num: 0 +2023/08/16-22:45:18.545009 8651103744 Options.allow_fallocate: 1 +2023/08/16-22:45:18.545010 8651103744 Options.allow_mmap_reads: 0 +2023/08/16-22:45:18.545011 8651103744 Options.allow_mmap_writes: 0 +2023/08/16-22:45:18.545012 8651103744 Options.use_direct_reads: 0 +2023/08/16-22:45:18.545013 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/16-22:45:18.545014 8651103744 Options.create_missing_column_families: 0 +2023/08/16-22:45:18.545015 8651103744 Options.db_log_dir: +2023/08/16-22:45:18.545016 8651103744 Options.wal_dir: +2023/08/16-22:45:18.545017 8651103744 Options.table_cache_numshardbits: 6 +2023/08/16-22:45:18.545018 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/16-22:45:18.545019 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/16-22:45:18.545020 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/16-22:45:18.545022 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/16-22:45:18.545023 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/16-22:45:18.545024 8651103744 Options.advise_random_on_open: 1 +2023/08/16-22:45:18.545025 8651103744 Options.db_write_buffer_size: 0 +2023/08/16-22:45:18.545026 8651103744 Options.write_buffer_manager: 0x600003ebd380 +2023/08/16-22:45:18.545027 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/16-22:45:18.545028 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/16-22:45:18.545029 8651103744 Options.use_adaptive_mutex: 0 +2023/08/16-22:45:18.545030 8651103744 Options.rate_limiter: 0x0 +2023/08/16-22:45:18.545031 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/16-22:45:18.545032 8651103744 Options.wal_recovery_mode: 2 +2023/08/16-22:45:18.545033 8651103744 Options.enable_thread_tracking: 0 +2023/08/16-22:45:18.545034 8651103744 Options.enable_pipelined_write: 0 +2023/08/16-22:45:18.545035 8651103744 Options.unordered_write: 0 +2023/08/16-22:45:18.545036 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/16-22:45:18.545037 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/16-22:45:18.545038 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/16-22:45:18.545040 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/16-22:45:18.545040 8651103744 Options.row_cache: None +2023/08/16-22:45:18.545042 8651103744 Options.wal_filter: None +2023/08/16-22:45:18.545043 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/16-22:45:18.545044 8651103744 Options.allow_ingest_behind: 0 +2023/08/16-22:45:18.545045 8651103744 Options.two_write_queues: 0 +2023/08/16-22:45:18.545046 8651103744 Options.manual_wal_flush: 0 +2023/08/16-22:45:18.545047 8651103744 Options.wal_compression: 0 +2023/08/16-22:45:18.545048 8651103744 Options.atomic_flush: 0 +2023/08/16-22:45:18.545049 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/16-22:45:18.545050 8651103744 Options.persist_stats_to_disk: 0 +2023/08/16-22:45:18.545051 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/16-22:45:18.545052 8651103744 Options.log_readahead_size: 0 +2023/08/16-22:45:18.545053 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/16-22:45:18.545054 8651103744 Options.best_efforts_recovery: 0 +2023/08/16-22:45:18.545055 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/16-22:45:18.545056 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/16-22:45:18.545057 8651103744 Options.allow_data_in_errors: 0 +2023/08/16-22:45:18.545058 8651103744 Options.db_host_id: __hostname__ +2023/08/16-22:45:18.545059 8651103744 Options.enforce_single_del_contracts: true +2023/08/16-22:45:18.545060 8651103744 Options.max_background_jobs: 2 +2023/08/16-22:45:18.545061 8651103744 Options.max_background_compactions: -1 +2023/08/16-22:45:18.545063 8651103744 Options.max_subcompactions: 1 +2023/08/16-22:45:18.545064 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/16-22:45:18.545065 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/16-22:45:18.545066 8651103744 Options.delayed_write_rate : 16777216 +2023/08/16-22:45:18.545067 8651103744 Options.max_total_wal_size: 0 +2023/08/16-22:45:18.545068 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/16-22:45:18.545069 8651103744 Options.stats_dump_period_sec: 600 +2023/08/16-22:45:18.545070 8651103744 Options.stats_persist_period_sec: 600 +2023/08/16-22:45:18.545071 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/16-22:45:18.545072 8651103744 Options.max_open_files: -1 +2023/08/16-22:45:18.545073 8651103744 Options.bytes_per_sync: 0 +2023/08/16-22:45:18.545074 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/16-22:45:18.545075 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/16-22:45:18.545076 8651103744 Options.compaction_readahead_size: 0 +2023/08/16-22:45:18.545077 8651103744 Options.max_background_flushes: -1 +2023/08/16-22:45:18.545078 8651103744 Compression algorithms supported: +2023/08/16-22:45:18.545097 8651103744 kZSTD supported: 1 +2023/08/16-22:45:18.545098 8651103744 kZlibCompression supported: 1 +2023/08/16-22:45:18.545099 8651103744 kXpressCompression supported: 0 +2023/08/16-22:45:18.545100 8651103744 kSnappyCompression supported: 1 +2023/08/16-22:45:18.545101 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/16-22:45:18.545103 8651103744 kLZ4HCCompression supported: 1 +2023/08/16-22:45:18.545104 8651103744 kLZ4Compression supported: 1 +2023/08/16-22:45:18.545105 8651103744 kBZip2Compression supported: 1 +2023/08/16-22:45:18.545112 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/16-22:45:18.545113 8651103744 DMutex implementation: pthread_mutex_t +2023/08/16-22:45:18.545279 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000104 +2023/08/16-22:45:18.545387 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/16-22:45:18.545389 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/16-22:45:18.545390 8651103744 Options.merge_operator: None +2023/08/16-22:45:18.545391 8651103744 Options.compaction_filter: None +2023/08/16-22:45:18.545392 8651103744 Options.compaction_filter_factory: None +2023/08/16-22:45:18.545393 8651103744 Options.sst_partitioner_factory: None +2023/08/16-22:45:18.545395 8651103744 Options.memtable_factory: SkipListFactory +2023/08/16-22:45:18.545396 8651103744 Options.table_factory: BlockBasedTable +2023/08/16-22:45:18.545413 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x6000005b0640) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000030bc6d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/16-22:45:18.545414 8651103744 Options.write_buffer_size: 67108864 +2023/08/16-22:45:18.545415 8651103744 Options.max_write_buffer_number: 2 +2023/08/16-22:45:18.545417 8651103744 Options.compression: Snappy +2023/08/16-22:45:18.545418 8651103744 Options.bottommost_compression: Disabled +2023/08/16-22:45:18.545419 8651103744 Options.prefix_extractor: nullptr +2023/08/16-22:45:18.545420 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/16-22:45:18.545421 8651103744 Options.num_levels: 7 +2023/08/16-22:45:18.545422 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/16-22:45:18.545423 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/16-22:45:18.545424 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/16-22:45:18.545425 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/16-22:45:18.545426 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/16-22:45:18.545428 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/16-22:45:18.545429 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/16-22:45:18.545430 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/16-22:45:18.545431 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/16-22:45:18.545432 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/16-22:45:18.545433 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-22:45:18.545434 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/16-22:45:18.545435 8651103744 Options.compression_opts.window_bits: -14 +2023/08/16-22:45:18.545436 8651103744 Options.compression_opts.level: 32767 +2023/08/16-22:45:18.545437 8651103744 Options.compression_opts.strategy: 0 +2023/08/16-22:45:18.545438 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/16-22:45:18.545439 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/16-22:45:18.545440 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/16-22:45:18.545441 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/16-22:45:18.545442 8651103744 Options.compression_opts.enabled: false +2023/08/16-22:45:18.545443 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-22:45:18.545444 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/16-22:45:18.545445 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/16-22:45:18.545446 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/16-22:45:18.545447 8651103744 Options.target_file_size_base: 67108864 +2023/08/16-22:45:18.545448 8651103744 Options.target_file_size_multiplier: 1 +2023/08/16-22:45:18.545449 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/16-22:45:18.545450 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/16-22:45:18.545451 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/16-22:45:18.545453 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/16-22:45:18.545454 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/16-22:45:18.545455 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/16-22:45:18.545456 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/16-22:45:18.545457 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/16-22:45:18.545458 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/16-22:45:18.545459 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/16-22:45:18.545460 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/16-22:45:18.545461 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/16-22:45:18.545462 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/16-22:45:18.545463 8651103744 Options.arena_block_size: 1048576 +2023/08/16-22:45:18.545464 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/16-22:45:18.545465 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/16-22:45:18.545466 8651103744 Options.disable_auto_compactions: 0 +2023/08/16-22:45:18.545467 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/16-22:45:18.545469 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/16-22:45:18.545470 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/16-22:45:18.545471 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/16-22:45:18.545472 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/16-22:45:18.545473 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/16-22:45:18.545474 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/16-22:45:18.545477 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/16-22:45:18.545478 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/16-22:45:18.545479 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/16-22:45:18.545483 8651103744 Options.table_properties_collectors: +2023/08/16-22:45:18.545484 8651103744 Options.inplace_update_support: 0 +2023/08/16-22:45:18.545485 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/16-22:45:18.545486 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/16-22:45:18.545487 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/16-22:45:18.545488 8651103744 Options.memtable_huge_page_size: 0 +2023/08/16-22:45:18.545489 8651103744 Options.bloom_locality: 0 +2023/08/16-22:45:18.545490 8651103744 Options.max_successive_merges: 0 +2023/08/16-22:45:18.545491 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/16-22:45:18.545492 8651103744 Options.paranoid_file_checks: 0 +2023/08/16-22:45:18.545493 8651103744 Options.force_consistency_checks: 1 +2023/08/16-22:45:18.545494 8651103744 Options.report_bg_io_stats: 0 +2023/08/16-22:45:18.545495 8651103744 Options.ttl: 2592000 +2023/08/16-22:45:18.545496 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/16-22:45:18.545497 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/16-22:45:18.545498 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/16-22:45:18.545499 8651103744 Options.enable_blob_files: false +2023/08/16-22:45:18.545500 8651103744 Options.min_blob_size: 0 +2023/08/16-22:45:18.545501 8651103744 Options.blob_file_size: 268435456 +2023/08/16-22:45:18.545503 8651103744 Options.blob_compression_type: NoCompression +2023/08/16-22:45:18.545504 8651103744 Options.enable_blob_garbage_collection: false +2023/08/16-22:45:18.545505 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/16-22:45:18.545506 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/16-22:45:18.545507 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/16-22:45:18.545508 8651103744 Options.blob_file_starting_level: 0 +2023/08/16-22:45:18.545509 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/16-22:45:18.546516 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000104 succeeded,manifest_file_number is 104, next_file_number is 106, last_sequence is 23413, log_number is 99,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 99 +2023/08/16-22:45:18.546523 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 99 +2023/08/16-22:45:18.546580 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/16-22:45:18.546736 8651103744 EVENT_LOG_v1 {"time_micros": 1692193518546731, "job": 1, "event": "recovery_started", "wal_files": [103]} +2023/08/16-22:45:18.546739 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #103 mode 2 +2023/08/16-22:45:18.547413 8651103744 EVENT_LOG_v1 {"time_micros": 1692193518547367, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 107, "file_size": 6230, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 23414, "largest_seqno": 23527, "table_properties": {"data_size": 5187, "index_size": 117, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 5168, "raw_average_key_size": 45, "raw_value_size": 6695, "raw_average_value_size": 58, "num_data_blocks": 3, "num_entries": 114, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692193518, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "99EJLH68EJGAQEYVRSD6", "orig_file_number": 107, "seqno_to_time_mapping": "N/A"}} +2023/08/16-22:45:18.547510 8651103744 EVENT_LOG_v1 {"time_micros": 1692193518547508, "job": 1, "event": "recovery_finished"} +2023/08/16-22:45:18.547602 8651103744 [db/version_set.cc:5180] Creating manifest 109 +2023/08/16-22:45:18.549989 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000103.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-22:45:18.550028 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x155e0ac70 +2023/08/16-22:45:18.550084 8651103744 DB pointer 0x156027e00 +2023/08/16-22:45:18.550255 6106329088 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/16-22:45:18.550259 6106329088 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 3/0 41.89 KB 0.8 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 10.7 0.00 0.00 1 0.001 0 0 0.0 0.0 + L1 1/0 993.68 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 4/0 1.01 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 10.7 0.00 0.00 1 0.001 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 10.7 0.00 0.00 1 0.001 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.7 0.00 0.00 1 0.001 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 1.23 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 1.23 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000030bc6d8#1574 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 1e-05 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692194265436485 b/rust/hyperlane_db/LOG.old.1692194265436485 new file mode 100644 index 0000000000..0cfbbdfa5f --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692194265436485 @@ -0,0 +1,304 @@ +2023/08/16-22:54:07.419109 8651103744 RocksDB version: 8.1.1 +2023/08/16-22:54:07.419887 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/16-22:54:07.419891 8651103744 DB SUMMARY +2023/08/16-22:54:07.419892 8651103744 DB Session ID: WLJHG37BR34EQN3KUMHA +2023/08/16-22:54:07.420045 8651103744 CURRENT file: CURRENT +2023/08/16-22:54:07.420048 8651103744 IDENTITY file: IDENTITY +2023/08/16-22:54:07.420069 8651103744 MANIFEST file: MANIFEST-000109 size: 822 Bytes +2023/08/16-22:54:07.420072 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 4, files: 000086.sst 000097.sst 000102.sst 000107.sst +2023/08/16-22:54:07.420074 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000108.log size: 18679 ; +2023/08/16-22:54:07.420077 8651103744 Options.error_if_exists: 0 +2023/08/16-22:54:07.420079 8651103744 Options.create_if_missing: 1 +2023/08/16-22:54:07.420080 8651103744 Options.paranoid_checks: 1 +2023/08/16-22:54:07.420082 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/16-22:54:07.420083 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/16-22:54:07.420084 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/16-22:54:07.420086 8651103744 Options.env: 0x102b5b848 +2023/08/16-22:54:07.420087 8651103744 Options.fs: PosixFileSystem +2023/08/16-22:54:07.420089 8651103744 Options.info_log: 0x122f095b8 +2023/08/16-22:54:07.420090 8651103744 Options.max_file_opening_threads: 16 +2023/08/16-22:54:07.420091 8651103744 Options.statistics: 0x0 +2023/08/16-22:54:07.420093 8651103744 Options.use_fsync: 0 +2023/08/16-22:54:07.420094 8651103744 Options.max_log_file_size: 0 +2023/08/16-22:54:07.420096 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/16-22:54:07.420097 8651103744 Options.log_file_time_to_roll: 0 +2023/08/16-22:54:07.420098 8651103744 Options.keep_log_file_num: 1000 +2023/08/16-22:54:07.420100 8651103744 Options.recycle_log_file_num: 0 +2023/08/16-22:54:07.420101 8651103744 Options.allow_fallocate: 1 +2023/08/16-22:54:07.420102 8651103744 Options.allow_mmap_reads: 0 +2023/08/16-22:54:07.420103 8651103744 Options.allow_mmap_writes: 0 +2023/08/16-22:54:07.420105 8651103744 Options.use_direct_reads: 0 +2023/08/16-22:54:07.420106 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/16-22:54:07.420107 8651103744 Options.create_missing_column_families: 0 +2023/08/16-22:54:07.420108 8651103744 Options.db_log_dir: +2023/08/16-22:54:07.420110 8651103744 Options.wal_dir: +2023/08/16-22:54:07.420111 8651103744 Options.table_cache_numshardbits: 6 +2023/08/16-22:54:07.420112 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/16-22:54:07.420113 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/16-22:54:07.420115 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/16-22:54:07.420116 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/16-22:54:07.420117 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/16-22:54:07.420119 8651103744 Options.advise_random_on_open: 1 +2023/08/16-22:54:07.420120 8651103744 Options.db_write_buffer_size: 0 +2023/08/16-22:54:07.420121 8651103744 Options.write_buffer_manager: 0x600002b88820 +2023/08/16-22:54:07.420123 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/16-22:54:07.420124 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/16-22:54:07.420125 8651103744 Options.use_adaptive_mutex: 0 +2023/08/16-22:54:07.420127 8651103744 Options.rate_limiter: 0x0 +2023/08/16-22:54:07.420128 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/16-22:54:07.420129 8651103744 Options.wal_recovery_mode: 2 +2023/08/16-22:54:07.420131 8651103744 Options.enable_thread_tracking: 0 +2023/08/16-22:54:07.420132 8651103744 Options.enable_pipelined_write: 0 +2023/08/16-22:54:07.420133 8651103744 Options.unordered_write: 0 +2023/08/16-22:54:07.420135 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/16-22:54:07.420136 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/16-22:54:07.420137 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/16-22:54:07.420138 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/16-22:54:07.420140 8651103744 Options.row_cache: None +2023/08/16-22:54:07.420141 8651103744 Options.wal_filter: None +2023/08/16-22:54:07.420142 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/16-22:54:07.420144 8651103744 Options.allow_ingest_behind: 0 +2023/08/16-22:54:07.420145 8651103744 Options.two_write_queues: 0 +2023/08/16-22:54:07.420146 8651103744 Options.manual_wal_flush: 0 +2023/08/16-22:54:07.420148 8651103744 Options.wal_compression: 0 +2023/08/16-22:54:07.420149 8651103744 Options.atomic_flush: 0 +2023/08/16-22:54:07.420150 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/16-22:54:07.420152 8651103744 Options.persist_stats_to_disk: 0 +2023/08/16-22:54:07.420153 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/16-22:54:07.420154 8651103744 Options.log_readahead_size: 0 +2023/08/16-22:54:07.420156 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/16-22:54:07.420157 8651103744 Options.best_efforts_recovery: 0 +2023/08/16-22:54:07.420159 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/16-22:54:07.420160 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/16-22:54:07.420162 8651103744 Options.allow_data_in_errors: 0 +2023/08/16-22:54:07.420163 8651103744 Options.db_host_id: __hostname__ +2023/08/16-22:54:07.420164 8651103744 Options.enforce_single_del_contracts: true +2023/08/16-22:54:07.420166 8651103744 Options.max_background_jobs: 2 +2023/08/16-22:54:07.420167 8651103744 Options.max_background_compactions: -1 +2023/08/16-22:54:07.420168 8651103744 Options.max_subcompactions: 1 +2023/08/16-22:54:07.420170 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/16-22:54:07.420171 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/16-22:54:07.420172 8651103744 Options.delayed_write_rate : 16777216 +2023/08/16-22:54:07.420174 8651103744 Options.max_total_wal_size: 0 +2023/08/16-22:54:07.420175 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/16-22:54:07.420176 8651103744 Options.stats_dump_period_sec: 600 +2023/08/16-22:54:07.420178 8651103744 Options.stats_persist_period_sec: 600 +2023/08/16-22:54:07.420179 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/16-22:54:07.420181 8651103744 Options.max_open_files: -1 +2023/08/16-22:54:07.420182 8651103744 Options.bytes_per_sync: 0 +2023/08/16-22:54:07.420183 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/16-22:54:07.420184 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/16-22:54:07.420186 8651103744 Options.compaction_readahead_size: 0 +2023/08/16-22:54:07.420187 8651103744 Options.max_background_flushes: -1 +2023/08/16-22:54:07.420188 8651103744 Compression algorithms supported: +2023/08/16-22:54:07.420213 8651103744 kZSTD supported: 1 +2023/08/16-22:54:07.420215 8651103744 kZlibCompression supported: 1 +2023/08/16-22:54:07.420217 8651103744 kXpressCompression supported: 0 +2023/08/16-22:54:07.420218 8651103744 kSnappyCompression supported: 1 +2023/08/16-22:54:07.420219 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/16-22:54:07.420221 8651103744 kLZ4HCCompression supported: 1 +2023/08/16-22:54:07.420222 8651103744 kLZ4Compression supported: 1 +2023/08/16-22:54:07.420223 8651103744 kBZip2Compression supported: 1 +2023/08/16-22:54:07.420238 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/16-22:54:07.420239 8651103744 DMutex implementation: pthread_mutex_t +2023/08/16-22:54:07.420431 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000109 +2023/08/16-22:54:07.420567 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/16-22:54:07.420570 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/16-22:54:07.420572 8651103744 Options.merge_operator: None +2023/08/16-22:54:07.420573 8651103744 Options.compaction_filter: None +2023/08/16-22:54:07.420574 8651103744 Options.compaction_filter_factory: None +2023/08/16-22:54:07.420576 8651103744 Options.sst_partitioner_factory: None +2023/08/16-22:54:07.420577 8651103744 Options.memtable_factory: SkipListFactory +2023/08/16-22:54:07.420579 8651103744 Options.table_factory: BlockBasedTable +2023/08/16-22:54:07.420623 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x6000010841c0) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000025880d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/16-22:54:07.420628 8651103744 Options.write_buffer_size: 67108864 +2023/08/16-22:54:07.420630 8651103744 Options.max_write_buffer_number: 2 +2023/08/16-22:54:07.420631 8651103744 Options.compression: Snappy +2023/08/16-22:54:07.420632 8651103744 Options.bottommost_compression: Disabled +2023/08/16-22:54:07.420634 8651103744 Options.prefix_extractor: nullptr +2023/08/16-22:54:07.420635 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/16-22:54:07.420637 8651103744 Options.num_levels: 7 +2023/08/16-22:54:07.420638 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/16-22:54:07.420639 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/16-22:54:07.420641 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/16-22:54:07.420642 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/16-22:54:07.420643 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/16-22:54:07.420645 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/16-22:54:07.420646 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/16-22:54:07.420647 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/16-22:54:07.420649 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/16-22:54:07.420650 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/16-22:54:07.420651 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-22:54:07.420653 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/16-22:54:07.420654 8651103744 Options.compression_opts.window_bits: -14 +2023/08/16-22:54:07.420655 8651103744 Options.compression_opts.level: 32767 +2023/08/16-22:54:07.420657 8651103744 Options.compression_opts.strategy: 0 +2023/08/16-22:54:07.420658 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/16-22:54:07.420659 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/16-22:54:07.420660 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/16-22:54:07.420662 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/16-22:54:07.420663 8651103744 Options.compression_opts.enabled: false +2023/08/16-22:54:07.420664 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-22:54:07.420666 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/16-22:54:07.420667 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/16-22:54:07.420668 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/16-22:54:07.420669 8651103744 Options.target_file_size_base: 67108864 +2023/08/16-22:54:07.420671 8651103744 Options.target_file_size_multiplier: 1 +2023/08/16-22:54:07.420672 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/16-22:54:07.420673 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/16-22:54:07.420675 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/16-22:54:07.420676 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/16-22:54:07.420678 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/16-22:54:07.420679 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/16-22:54:07.420680 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/16-22:54:07.420682 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/16-22:54:07.420683 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/16-22:54:07.420684 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/16-22:54:07.420685 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/16-22:54:07.420687 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/16-22:54:07.420688 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/16-22:54:07.420689 8651103744 Options.arena_block_size: 1048576 +2023/08/16-22:54:07.420691 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/16-22:54:07.420692 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/16-22:54:07.420694 8651103744 Options.disable_auto_compactions: 0 +2023/08/16-22:54:07.420695 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/16-22:54:07.420697 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/16-22:54:07.420698 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/16-22:54:07.420699 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/16-22:54:07.420701 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/16-22:54:07.420702 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/16-22:54:07.420704 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/16-22:54:07.420707 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/16-22:54:07.420709 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/16-22:54:07.420710 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/16-22:54:07.420712 8651103744 Options.table_properties_collectors: +2023/08/16-22:54:07.420714 8651103744 Options.inplace_update_support: 0 +2023/08/16-22:54:07.420715 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/16-22:54:07.420716 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/16-22:54:07.420718 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/16-22:54:07.420719 8651103744 Options.memtable_huge_page_size: 0 +2023/08/16-22:54:07.420721 8651103744 Options.bloom_locality: 0 +2023/08/16-22:54:07.420722 8651103744 Options.max_successive_merges: 0 +2023/08/16-22:54:07.420723 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/16-22:54:07.420725 8651103744 Options.paranoid_file_checks: 0 +2023/08/16-22:54:07.420726 8651103744 Options.force_consistency_checks: 1 +2023/08/16-22:54:07.420727 8651103744 Options.report_bg_io_stats: 0 +2023/08/16-22:54:07.420728 8651103744 Options.ttl: 2592000 +2023/08/16-22:54:07.420730 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/16-22:54:07.420731 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/16-22:54:07.420732 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/16-22:54:07.420734 8651103744 Options.enable_blob_files: false +2023/08/16-22:54:07.420735 8651103744 Options.min_blob_size: 0 +2023/08/16-22:54:07.420736 8651103744 Options.blob_file_size: 268435456 +2023/08/16-22:54:07.420738 8651103744 Options.blob_compression_type: NoCompression +2023/08/16-22:54:07.420739 8651103744 Options.enable_blob_garbage_collection: false +2023/08/16-22:54:07.420740 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/16-22:54:07.420742 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/16-22:54:07.420744 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/16-22:54:07.420745 8651103744 Options.blob_file_starting_level: 0 +2023/08/16-22:54:07.420746 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/16-22:54:07.421745 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000109 succeeded,manifest_file_number is 109, next_file_number is 111, last_sequence is 23527, log_number is 104,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 104 +2023/08/16-22:54:07.421748 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 104 +2023/08/16-22:54:07.421788 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/16-22:54:07.421900 8651103744 EVENT_LOG_v1 {"time_micros": 1692194047421896, "job": 1, "event": "recovery_started", "wal_files": [108]} +2023/08/16-22:54:07.421902 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #108 mode 2 +2023/08/16-22:54:07.422354 8651103744 EVENT_LOG_v1 {"time_micros": 1692194047422339, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 112, "file_size": 8638, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 23528, "largest_seqno": 23689, "table_properties": {"data_size": 7548, "index_size": 170, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 7344, "raw_average_key_size": 45, "raw_value_size": 9051, "raw_average_value_size": 55, "num_data_blocks": 4, "num_entries": 162, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692194047, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "WLJHG37BR34EQN3KUMHA", "orig_file_number": 112, "seqno_to_time_mapping": "N/A"}} +2023/08/16-22:54:07.422410 8651103744 EVENT_LOG_v1 {"time_micros": 1692194047422409, "job": 1, "event": "recovery_finished"} +2023/08/16-22:54:07.422454 8651103744 [db/version_set.cc:5180] Creating manifest 114 +2023/08/16-22:54:07.424065 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000108.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-22:54:07.424080 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x122f09710 +2023/08/16-22:54:07.424123 8651103744 DB pointer 0x12381c400 +2023/08/16-22:54:07.424166 6163066880 [db/compaction/compaction_job.cc:1988] [default] [JOB 3] Compacting 4@0 + 1@1 files to L1, score 1.00 +2023/08/16-22:54:07.424170 6163066880 [db/compaction/compaction_job.cc:1992] [default]: Compaction start summary: Base version 2 Base level 0, inputs: [112(8638B) 107(6230B) 102(15KB) 97(20KB)], [86(993KB)] +2023/08/16-22:54:07.424177 6163066880 EVENT_LOG_v1 {"time_micros": 1692194047424171, "job": 3, "event": "compaction_started", "compaction_reason": "LevelL0FilesNum", "files_L0": [112, 107, 102, 97], "files_L1": [86], "score": 1, "input_data_size": 1069070, "oldest_snapshot_seqno": -1} +2023/08/16-22:54:07.424335 6164213760 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/16-22:54:07.424390 6164213760 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 4/4 50.33 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 23.4 0.00 0.00 1 0.000 0 0 0.0 0.0 + L1 1/1 993.68 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 5/5 1.02 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 23.4 0.00 0.00 1 0.000 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 23.4 0.00 0.00 1 0.000 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.4 0.00 0.00 1 0.000 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 2.20 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 2.20 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000025880d8#1784 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 8e-06 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** +2023/08/16-22:54:07.438316 6163066880 [db/compaction/compaction_job.cc:1592] [default] [JOB 3] Generated table #117: 22925 keys, 1067676 bytes, temperature: kUnknown +2023/08/16-22:54:07.438349 6163066880 EVENT_LOG_v1 {"time_micros": 1692194047438324, "cf_name": "default", "job": 3, "event": "table_file_creation", "file_number": 117, "file_size": 1067676, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 0, "largest_seqno": 0, "table_properties": {"data_size": 1059623, "index_size": 24739, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 1841623, "raw_average_key_size": 80, "raw_value_size": 999033, "raw_average_value_size": 43, "num_data_blocks": 488, "num_entries": 22925, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692109142, "oldest_key_time": 0, "file_creation_time": 1692194047, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "WLJHG37BR34EQN3KUMHA", "orig_file_number": 117, "seqno_to_time_mapping": "N/A"}} +2023/08/16-22:54:07.438649 6163066880 (Original Log Time 2023/08/16-22:54:07.438505) [db/compaction/compaction_job.cc:1663] [default] [JOB 3] Compacted 4@0 + 1@1 files to L1 => 1067676 bytes +2023/08/16-22:54:07.438652 6163066880 (Original Log Time 2023/08/16-22:54:07.438588) [db/compaction/compaction_job.cc:885] [default] compacted to: files[0 1 0 0 0 0 0] max score 0.00, MB/sec: 75.1 rd, 75.0 wr, level 1, files in(4, 1) out(1 +0 blob) MB in(0.0, 1.0 +0.0 blob) out(1.0 +0.0 blob), read-write-amplify(41.5) write-amplify(20.7) OK, records in: 22927, records dropped: 2 output_compression: Snappy +2023/08/16-22:54:07.438655 6163066880 (Original Log Time 2023/08/16-22:54:07.438608) EVENT_LOG_v1 {"time_micros": 1692194047438595, "job": 3, "event": "compaction_finished", "compaction_time_micros": 14233, "compaction_time_cpu_micros": 13680, "output_level": 1, "num_output_files": 1, "total_output_size": 1067676, "num_input_records": 22927, "num_output_records": 22925, "num_subcompactions": 1, "output_compression": "Snappy", "num_single_delete_mismatches": 0, "num_single_delete_fallthrough": 0, "lsm_state": [0, 1, 0, 0, 0, 0, 0]} +2023/08/16-22:54:07.438753 6163066880 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000112.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-22:54:07.438759 6163066880 EVENT_LOG_v1 {"time_micros": 1692194047438757, "job": 3, "event": "table_file_deletion", "file_number": 112} +2023/08/16-22:54:07.438832 6163066880 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000107.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-22:54:07.438836 6163066880 EVENT_LOG_v1 {"time_micros": 1692194047438834, "job": 3, "event": "table_file_deletion", "file_number": 107} +2023/08/16-22:54:07.438961 6163066880 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000102.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-22:54:07.438965 6163066880 EVENT_LOG_v1 {"time_micros": 1692194047438964, "job": 3, "event": "table_file_deletion", "file_number": 102} +2023/08/16-22:54:07.439254 6163066880 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000097.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-22:54:07.439259 6163066880 EVENT_LOG_v1 {"time_micros": 1692194047439257, "job": 3, "event": "table_file_deletion", "file_number": 97} +2023/08/16-22:54:07.440295 6163066880 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000086.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-22:54:07.440303 6163066880 EVENT_LOG_v1 {"time_micros": 1692194047440300, "job": 3, "event": "table_file_deletion", "file_number": 86} diff --git a/rust/hyperlane_db/LOG.old.1692194380428441 b/rust/hyperlane_db/LOG.old.1692194380428441 new file mode 100644 index 0000000000..94c7a8cd0e --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692194380428441 @@ -0,0 +1,286 @@ +2023/08/16-22:57:45.437004 8651103744 RocksDB version: 8.1.1 +2023/08/16-22:57:45.437663 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/16-22:57:45.437665 8651103744 DB SUMMARY +2023/08/16-22:57:45.437667 8651103744 DB Session ID: FQR4YOEUEZR81FMTEBEC +2023/08/16-22:57:45.437757 8651103744 CURRENT file: CURRENT +2023/08/16-22:57:45.437759 8651103744 IDENTITY file: IDENTITY +2023/08/16-22:57:45.437776 8651103744 MANIFEST file: MANIFEST-000114 size: 1207 Bytes +2023/08/16-22:57:45.437778 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 1, files: 000117.sst +2023/08/16-22:57:45.437780 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000113.log size: 163033 ; +2023/08/16-22:57:45.437782 8651103744 Options.error_if_exists: 0 +2023/08/16-22:57:45.437784 8651103744 Options.create_if_missing: 1 +2023/08/16-22:57:45.437785 8651103744 Options.paranoid_checks: 1 +2023/08/16-22:57:45.437786 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/16-22:57:45.437787 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/16-22:57:45.437788 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/16-22:57:45.437789 8651103744 Options.env: 0x104c53848 +2023/08/16-22:57:45.437791 8651103744 Options.fs: PosixFileSystem +2023/08/16-22:57:45.437792 8651103744 Options.info_log: 0x11cf05f78 +2023/08/16-22:57:45.437793 8651103744 Options.max_file_opening_threads: 16 +2023/08/16-22:57:45.437794 8651103744 Options.statistics: 0x0 +2023/08/16-22:57:45.437795 8651103744 Options.use_fsync: 0 +2023/08/16-22:57:45.437796 8651103744 Options.max_log_file_size: 0 +2023/08/16-22:57:45.437798 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/16-22:57:45.437799 8651103744 Options.log_file_time_to_roll: 0 +2023/08/16-22:57:45.437800 8651103744 Options.keep_log_file_num: 1000 +2023/08/16-22:57:45.437801 8651103744 Options.recycle_log_file_num: 0 +2023/08/16-22:57:45.437802 8651103744 Options.allow_fallocate: 1 +2023/08/16-22:57:45.437803 8651103744 Options.allow_mmap_reads: 0 +2023/08/16-22:57:45.437804 8651103744 Options.allow_mmap_writes: 0 +2023/08/16-22:57:45.437805 8651103744 Options.use_direct_reads: 0 +2023/08/16-22:57:45.437806 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/16-22:57:45.437807 8651103744 Options.create_missing_column_families: 0 +2023/08/16-22:57:45.437808 8651103744 Options.db_log_dir: +2023/08/16-22:57:45.437809 8651103744 Options.wal_dir: +2023/08/16-22:57:45.437810 8651103744 Options.table_cache_numshardbits: 6 +2023/08/16-22:57:45.437811 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/16-22:57:45.437813 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/16-22:57:45.437814 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/16-22:57:45.437815 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/16-22:57:45.437816 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/16-22:57:45.437817 8651103744 Options.advise_random_on_open: 1 +2023/08/16-22:57:45.437818 8651103744 Options.db_write_buffer_size: 0 +2023/08/16-22:57:45.437819 8651103744 Options.write_buffer_manager: 0x600003080820 +2023/08/16-22:57:45.437820 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/16-22:57:45.437821 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/16-22:57:45.437822 8651103744 Options.use_adaptive_mutex: 0 +2023/08/16-22:57:45.437824 8651103744 Options.rate_limiter: 0x0 +2023/08/16-22:57:45.437825 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/16-22:57:45.437826 8651103744 Options.wal_recovery_mode: 2 +2023/08/16-22:57:45.437827 8651103744 Options.enable_thread_tracking: 0 +2023/08/16-22:57:45.437828 8651103744 Options.enable_pipelined_write: 0 +2023/08/16-22:57:45.437829 8651103744 Options.unordered_write: 0 +2023/08/16-22:57:45.437830 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/16-22:57:45.437831 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/16-22:57:45.437832 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/16-22:57:45.437833 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/16-22:57:45.437834 8651103744 Options.row_cache: None +2023/08/16-22:57:45.437836 8651103744 Options.wal_filter: None +2023/08/16-22:57:45.437837 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/16-22:57:45.437838 8651103744 Options.allow_ingest_behind: 0 +2023/08/16-22:57:45.437839 8651103744 Options.two_write_queues: 0 +2023/08/16-22:57:45.437840 8651103744 Options.manual_wal_flush: 0 +2023/08/16-22:57:45.437841 8651103744 Options.wal_compression: 0 +2023/08/16-22:57:45.437842 8651103744 Options.atomic_flush: 0 +2023/08/16-22:57:45.437843 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/16-22:57:45.437844 8651103744 Options.persist_stats_to_disk: 0 +2023/08/16-22:57:45.437846 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/16-22:57:45.437847 8651103744 Options.log_readahead_size: 0 +2023/08/16-22:57:45.437848 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/16-22:57:45.437849 8651103744 Options.best_efforts_recovery: 0 +2023/08/16-22:57:45.437850 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/16-22:57:45.437851 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/16-22:57:45.437852 8651103744 Options.allow_data_in_errors: 0 +2023/08/16-22:57:45.437853 8651103744 Options.db_host_id: __hostname__ +2023/08/16-22:57:45.437855 8651103744 Options.enforce_single_del_contracts: true +2023/08/16-22:57:45.437856 8651103744 Options.max_background_jobs: 2 +2023/08/16-22:57:45.437857 8651103744 Options.max_background_compactions: -1 +2023/08/16-22:57:45.437858 8651103744 Options.max_subcompactions: 1 +2023/08/16-22:57:45.437859 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/16-22:57:45.437860 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/16-22:57:45.437861 8651103744 Options.delayed_write_rate : 16777216 +2023/08/16-22:57:45.437862 8651103744 Options.max_total_wal_size: 0 +2023/08/16-22:57:45.437864 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/16-22:57:45.437865 8651103744 Options.stats_dump_period_sec: 600 +2023/08/16-22:57:45.437866 8651103744 Options.stats_persist_period_sec: 600 +2023/08/16-22:57:45.437867 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/16-22:57:45.437868 8651103744 Options.max_open_files: -1 +2023/08/16-22:57:45.437869 8651103744 Options.bytes_per_sync: 0 +2023/08/16-22:57:45.437871 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/16-22:57:45.437872 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/16-22:57:45.437873 8651103744 Options.compaction_readahead_size: 0 +2023/08/16-22:57:45.437874 8651103744 Options.max_background_flushes: -1 +2023/08/16-22:57:45.437875 8651103744 Compression algorithms supported: +2023/08/16-22:57:45.437896 8651103744 kZSTD supported: 1 +2023/08/16-22:57:45.437897 8651103744 kZlibCompression supported: 1 +2023/08/16-22:57:45.437898 8651103744 kXpressCompression supported: 0 +2023/08/16-22:57:45.437899 8651103744 kSnappyCompression supported: 1 +2023/08/16-22:57:45.437900 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/16-22:57:45.437902 8651103744 kLZ4HCCompression supported: 1 +2023/08/16-22:57:45.437903 8651103744 kLZ4Compression supported: 1 +2023/08/16-22:57:45.437904 8651103744 kBZip2Compression supported: 1 +2023/08/16-22:57:45.437915 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/16-22:57:45.437916 8651103744 DMutex implementation: pthread_mutex_t +2023/08/16-22:57:45.438230 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000114 +2023/08/16-22:57:45.438324 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/16-22:57:45.438325 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/16-22:57:45.438326 8651103744 Options.merge_operator: None +2023/08/16-22:57:45.438327 8651103744 Options.compaction_filter: None +2023/08/16-22:57:45.438327 8651103744 Options.compaction_filter_factory: None +2023/08/16-22:57:45.438328 8651103744 Options.sst_partitioner_factory: None +2023/08/16-22:57:45.438328 8651103744 Options.memtable_factory: SkipListFactory +2023/08/16-22:57:45.438329 8651103744 Options.table_factory: BlockBasedTable +2023/08/16-22:57:45.438353 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600000b94640) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x600003e800d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/16-22:57:45.438357 8651103744 Options.write_buffer_size: 67108864 +2023/08/16-22:57:45.438358 8651103744 Options.max_write_buffer_number: 2 +2023/08/16-22:57:45.438358 8651103744 Options.compression: Snappy +2023/08/16-22:57:45.438359 8651103744 Options.bottommost_compression: Disabled +2023/08/16-22:57:45.438359 8651103744 Options.prefix_extractor: nullptr +2023/08/16-22:57:45.438360 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/16-22:57:45.438361 8651103744 Options.num_levels: 7 +2023/08/16-22:57:45.438361 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/16-22:57:45.438362 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/16-22:57:45.438362 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/16-22:57:45.438363 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/16-22:57:45.438364 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/16-22:57:45.438364 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/16-22:57:45.438365 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/16-22:57:45.438365 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/16-22:57:45.438366 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/16-22:57:45.438367 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/16-22:57:45.438367 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-22:57:45.438368 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/16-22:57:45.438368 8651103744 Options.compression_opts.window_bits: -14 +2023/08/16-22:57:45.438369 8651103744 Options.compression_opts.level: 32767 +2023/08/16-22:57:45.438370 8651103744 Options.compression_opts.strategy: 0 +2023/08/16-22:57:45.438370 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/16-22:57:45.438371 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/16-22:57:45.438371 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/16-22:57:45.438372 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/16-22:57:45.438372 8651103744 Options.compression_opts.enabled: false +2023/08/16-22:57:45.438373 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-22:57:45.438374 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/16-22:57:45.438374 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/16-22:57:45.438375 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/16-22:57:45.438375 8651103744 Options.target_file_size_base: 67108864 +2023/08/16-22:57:45.438376 8651103744 Options.target_file_size_multiplier: 1 +2023/08/16-22:57:45.438376 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/16-22:57:45.438377 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/16-22:57:45.438377 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/16-22:57:45.438378 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/16-22:57:45.438379 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/16-22:57:45.438379 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/16-22:57:45.438380 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/16-22:57:45.438381 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/16-22:57:45.438381 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/16-22:57:45.438382 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/16-22:57:45.438382 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/16-22:57:45.438383 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/16-22:57:45.438383 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/16-22:57:45.438384 8651103744 Options.arena_block_size: 1048576 +2023/08/16-22:57:45.438384 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/16-22:57:45.438385 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/16-22:57:45.438386 8651103744 Options.disable_auto_compactions: 0 +2023/08/16-22:57:45.438386 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/16-22:57:45.438387 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/16-22:57:45.438388 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/16-22:57:45.438388 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/16-22:57:45.438389 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/16-22:57:45.438389 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/16-22:57:45.438390 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/16-22:57:45.438393 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/16-22:57:45.438394 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/16-22:57:45.438395 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/16-22:57:45.438397 8651103744 Options.table_properties_collectors: +2023/08/16-22:57:45.438398 8651103744 Options.inplace_update_support: 0 +2023/08/16-22:57:45.438399 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/16-22:57:45.438401 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/16-22:57:45.438402 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/16-22:57:45.438403 8651103744 Options.memtable_huge_page_size: 0 +2023/08/16-22:57:45.438404 8651103744 Options.bloom_locality: 0 +2023/08/16-22:57:45.438405 8651103744 Options.max_successive_merges: 0 +2023/08/16-22:57:45.438406 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/16-22:57:45.438407 8651103744 Options.paranoid_file_checks: 0 +2023/08/16-22:57:45.438408 8651103744 Options.force_consistency_checks: 1 +2023/08/16-22:57:45.438409 8651103744 Options.report_bg_io_stats: 0 +2023/08/16-22:57:45.438410 8651103744 Options.ttl: 2592000 +2023/08/16-22:57:45.438411 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/16-22:57:45.438412 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/16-22:57:45.438413 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/16-22:57:45.438414 8651103744 Options.enable_blob_files: false +2023/08/16-22:57:45.438416 8651103744 Options.min_blob_size: 0 +2023/08/16-22:57:45.438417 8651103744 Options.blob_file_size: 268435456 +2023/08/16-22:57:45.438418 8651103744 Options.blob_compression_type: NoCompression +2023/08/16-22:57:45.438419 8651103744 Options.enable_blob_garbage_collection: false +2023/08/16-22:57:45.438420 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/16-22:57:45.438421 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/16-22:57:45.438423 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/16-22:57:45.438424 8651103744 Options.blob_file_starting_level: 0 +2023/08/16-22:57:45.438425 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/16-22:57:45.439233 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000114 succeeded,manifest_file_number is 114, next_file_number is 119, last_sequence is 23689, log_number is 109,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 109 +2023/08/16-22:57:45.439235 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 109 +2023/08/16-22:57:45.439402 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/16-22:57:45.439487 8651103744 EVENT_LOG_v1 {"time_micros": 1692194265439480, "job": 1, "event": "recovery_started", "wal_files": [113]} +2023/08/16-22:57:45.439488 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #113 mode 2 +2023/08/16-22:57:45.441170 8651103744 EVENT_LOG_v1 {"time_micros": 1692194265441157, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 120, "file_size": 65433, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 23690, "largest_seqno": 25176, "table_properties": {"data_size": 63987, "index_size": 911, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 67422, "raw_average_key_size": 45, "raw_value_size": 74723, "raw_average_value_size": 50, "num_data_blocks": 28, "num_entries": 1487, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692194265, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "FQR4YOEUEZR81FMTEBEC", "orig_file_number": 120, "seqno_to_time_mapping": "N/A"}} +2023/08/16-22:57:45.441210 8651103744 EVENT_LOG_v1 {"time_micros": 1692194265441209, "job": 1, "event": "recovery_finished"} +2023/08/16-22:57:45.441250 8651103744 [db/version_set.cc:5180] Creating manifest 122 +2023/08/16-22:57:45.442471 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000113.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-22:57:45.442486 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x11cf060d0 +2023/08/16-22:57:45.442541 8651103744 DB pointer 0x11d808200 +2023/08/16-22:57:45.442711 6129643520 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/16-22:57:45.442715 6129643520 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 1/0 63.90 KB 0.2 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 94.8 0.00 0.00 1 0.001 0 0 0.0 0.0 + L1 1/0 1.02 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 2/0 1.08 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 94.8 0.00 0.00 1 0.001 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 94.8 0.00 0.00 1 0.001 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 94.8 0.00 0.00 1 0.001 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 14.28 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 14.28 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x600003e800d8#1898 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 1.1e-05 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692198883938429 b/rust/hyperlane_db/LOG.old.1692198883938429 new file mode 100644 index 0000000000..8fc000fe3a --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692198883938429 @@ -0,0 +1,286 @@ +2023/08/16-22:59:40.429146 8651103744 RocksDB version: 8.1.1 +2023/08/16-22:59:40.430033 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/16-22:59:40.430037 8651103744 DB SUMMARY +2023/08/16-22:59:40.430039 8651103744 DB Session ID: XCLFO9HHL5QRMVTCSXGW +2023/08/16-22:59:40.430213 8651103744 CURRENT file: CURRENT +2023/08/16-22:59:40.430215 8651103744 IDENTITY file: IDENTITY +2023/08/16-22:59:40.430237 8651103744 MANIFEST file: MANIFEST-000122 size: 468 Bytes +2023/08/16-22:59:40.430239 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 2, files: 000117.sst 000120.sst +2023/08/16-22:59:40.430241 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000121.log size: 32124 ; +2023/08/16-22:59:40.430244 8651103744 Options.error_if_exists: 0 +2023/08/16-22:59:40.430246 8651103744 Options.create_if_missing: 1 +2023/08/16-22:59:40.430247 8651103744 Options.paranoid_checks: 1 +2023/08/16-22:59:40.430249 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/16-22:59:40.430250 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/16-22:59:40.430251 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/16-22:59:40.430253 8651103744 Options.env: 0x1029df868 +2023/08/16-22:59:40.430254 8651103744 Options.fs: PosixFileSystem +2023/08/16-22:59:40.430256 8651103744 Options.info_log: 0x14c104098 +2023/08/16-22:59:40.430257 8651103744 Options.max_file_opening_threads: 16 +2023/08/16-22:59:40.430258 8651103744 Options.statistics: 0x0 +2023/08/16-22:59:40.430260 8651103744 Options.use_fsync: 0 +2023/08/16-22:59:40.430261 8651103744 Options.max_log_file_size: 0 +2023/08/16-22:59:40.430263 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/16-22:59:40.430264 8651103744 Options.log_file_time_to_roll: 0 +2023/08/16-22:59:40.430265 8651103744 Options.keep_log_file_num: 1000 +2023/08/16-22:59:40.430267 8651103744 Options.recycle_log_file_num: 0 +2023/08/16-22:59:40.430268 8651103744 Options.allow_fallocate: 1 +2023/08/16-22:59:40.430269 8651103744 Options.allow_mmap_reads: 0 +2023/08/16-22:59:40.430270 8651103744 Options.allow_mmap_writes: 0 +2023/08/16-22:59:40.430272 8651103744 Options.use_direct_reads: 0 +2023/08/16-22:59:40.430273 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/16-22:59:40.430274 8651103744 Options.create_missing_column_families: 0 +2023/08/16-22:59:40.430275 8651103744 Options.db_log_dir: +2023/08/16-22:59:40.430277 8651103744 Options.wal_dir: +2023/08/16-22:59:40.430278 8651103744 Options.table_cache_numshardbits: 6 +2023/08/16-22:59:40.430279 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/16-22:59:40.430281 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/16-22:59:40.430282 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/16-22:59:40.430283 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/16-22:59:40.430285 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/16-22:59:40.430286 8651103744 Options.advise_random_on_open: 1 +2023/08/16-22:59:40.430287 8651103744 Options.db_write_buffer_size: 0 +2023/08/16-22:59:40.430289 8651103744 Options.write_buffer_manager: 0x600003f78000 +2023/08/16-22:59:40.430290 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/16-22:59:40.430291 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/16-22:59:40.430293 8651103744 Options.use_adaptive_mutex: 0 +2023/08/16-22:59:40.430294 8651103744 Options.rate_limiter: 0x0 +2023/08/16-22:59:40.430295 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/16-22:59:40.430297 8651103744 Options.wal_recovery_mode: 2 +2023/08/16-22:59:40.430298 8651103744 Options.enable_thread_tracking: 0 +2023/08/16-22:59:40.430299 8651103744 Options.enable_pipelined_write: 0 +2023/08/16-22:59:40.430301 8651103744 Options.unordered_write: 0 +2023/08/16-22:59:40.430302 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/16-22:59:40.430303 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/16-22:59:40.430304 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/16-22:59:40.430306 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/16-22:59:40.430307 8651103744 Options.row_cache: None +2023/08/16-22:59:40.430308 8651103744 Options.wal_filter: None +2023/08/16-22:59:40.430310 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/16-22:59:40.430311 8651103744 Options.allow_ingest_behind: 0 +2023/08/16-22:59:40.430312 8651103744 Options.two_write_queues: 0 +2023/08/16-22:59:40.430314 8651103744 Options.manual_wal_flush: 0 +2023/08/16-22:59:40.430315 8651103744 Options.wal_compression: 0 +2023/08/16-22:59:40.430316 8651103744 Options.atomic_flush: 0 +2023/08/16-22:59:40.430317 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/16-22:59:40.430319 8651103744 Options.persist_stats_to_disk: 0 +2023/08/16-22:59:40.430320 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/16-22:59:40.430321 8651103744 Options.log_readahead_size: 0 +2023/08/16-22:59:40.430323 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/16-22:59:40.430324 8651103744 Options.best_efforts_recovery: 0 +2023/08/16-22:59:40.430326 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/16-22:59:40.430327 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/16-22:59:40.430328 8651103744 Options.allow_data_in_errors: 0 +2023/08/16-22:59:40.430330 8651103744 Options.db_host_id: __hostname__ +2023/08/16-22:59:40.430331 8651103744 Options.enforce_single_del_contracts: true +2023/08/16-22:59:40.430332 8651103744 Options.max_background_jobs: 2 +2023/08/16-22:59:40.430333 8651103744 Options.max_background_compactions: -1 +2023/08/16-22:59:40.430335 8651103744 Options.max_subcompactions: 1 +2023/08/16-22:59:40.430336 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/16-22:59:40.430337 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/16-22:59:40.430339 8651103744 Options.delayed_write_rate : 16777216 +2023/08/16-22:59:40.430340 8651103744 Options.max_total_wal_size: 0 +2023/08/16-22:59:40.430341 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/16-22:59:40.430343 8651103744 Options.stats_dump_period_sec: 600 +2023/08/16-22:59:40.430344 8651103744 Options.stats_persist_period_sec: 600 +2023/08/16-22:59:40.430346 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/16-22:59:40.430347 8651103744 Options.max_open_files: -1 +2023/08/16-22:59:40.430348 8651103744 Options.bytes_per_sync: 0 +2023/08/16-22:59:40.430350 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/16-22:59:40.430351 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/16-22:59:40.430352 8651103744 Options.compaction_readahead_size: 0 +2023/08/16-22:59:40.430353 8651103744 Options.max_background_flushes: -1 +2023/08/16-22:59:40.430355 8651103744 Compression algorithms supported: +2023/08/16-22:59:40.430380 8651103744 kZSTD supported: 1 +2023/08/16-22:59:40.430382 8651103744 kZlibCompression supported: 1 +2023/08/16-22:59:40.430383 8651103744 kXpressCompression supported: 0 +2023/08/16-22:59:40.430384 8651103744 kSnappyCompression supported: 1 +2023/08/16-22:59:40.430386 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/16-22:59:40.430387 8651103744 kLZ4HCCompression supported: 1 +2023/08/16-22:59:40.430389 8651103744 kLZ4Compression supported: 1 +2023/08/16-22:59:40.430390 8651103744 kBZip2Compression supported: 1 +2023/08/16-22:59:40.430402 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/16-22:59:40.430404 8651103744 DMutex implementation: pthread_mutex_t +2023/08/16-22:59:40.430792 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000122 +2023/08/16-22:59:40.430894 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/16-22:59:40.430896 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/16-22:59:40.430897 8651103744 Options.merge_operator: None +2023/08/16-22:59:40.430897 8651103744 Options.compaction_filter: None +2023/08/16-22:59:40.430898 8651103744 Options.compaction_filter_factory: None +2023/08/16-22:59:40.430899 8651103744 Options.sst_partitioner_factory: None +2023/08/16-22:59:40.430899 8651103744 Options.memtable_factory: SkipListFactory +2023/08/16-22:59:40.430900 8651103744 Options.table_factory: BlockBasedTable +2023/08/16-22:59:40.430929 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x60000047d140) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000031740d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/16-22:59:40.430931 8651103744 Options.write_buffer_size: 67108864 +2023/08/16-22:59:40.430932 8651103744 Options.max_write_buffer_number: 2 +2023/08/16-22:59:40.430933 8651103744 Options.compression: Snappy +2023/08/16-22:59:40.430934 8651103744 Options.bottommost_compression: Disabled +2023/08/16-22:59:40.430934 8651103744 Options.prefix_extractor: nullptr +2023/08/16-22:59:40.430935 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/16-22:59:40.430936 8651103744 Options.num_levels: 7 +2023/08/16-22:59:40.430936 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/16-22:59:40.430937 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/16-22:59:40.430938 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/16-22:59:40.430938 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/16-22:59:40.430939 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/16-22:59:40.430940 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/16-22:59:40.430940 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/16-22:59:40.430941 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/16-22:59:40.430942 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/16-22:59:40.430942 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/16-22:59:40.430943 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-22:59:40.430944 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/16-22:59:40.430944 8651103744 Options.compression_opts.window_bits: -14 +2023/08/16-22:59:40.430945 8651103744 Options.compression_opts.level: 32767 +2023/08/16-22:59:40.430945 8651103744 Options.compression_opts.strategy: 0 +2023/08/16-22:59:40.430946 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/16-22:59:40.430947 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/16-22:59:40.430947 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/16-22:59:40.430948 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/16-22:59:40.430949 8651103744 Options.compression_opts.enabled: false +2023/08/16-22:59:40.430949 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/16-22:59:40.430950 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/16-22:59:40.430951 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/16-22:59:40.430951 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/16-22:59:40.430952 8651103744 Options.target_file_size_base: 67108864 +2023/08/16-22:59:40.430952 8651103744 Options.target_file_size_multiplier: 1 +2023/08/16-22:59:40.430953 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/16-22:59:40.430954 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/16-22:59:40.430954 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/16-22:59:40.430955 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/16-22:59:40.430956 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/16-22:59:40.430957 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/16-22:59:40.430957 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/16-22:59:40.430958 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/16-22:59:40.430959 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/16-22:59:40.430959 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/16-22:59:40.430960 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/16-22:59:40.430960 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/16-22:59:40.430961 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/16-22:59:40.430962 8651103744 Options.arena_block_size: 1048576 +2023/08/16-22:59:40.430962 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/16-22:59:40.430963 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/16-22:59:40.430964 8651103744 Options.disable_auto_compactions: 0 +2023/08/16-22:59:40.430965 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/16-22:59:40.430966 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/16-22:59:40.430966 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/16-22:59:40.430967 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/16-22:59:40.430968 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/16-22:59:40.430968 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/16-22:59:40.430969 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/16-22:59:40.430971 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/16-22:59:40.430972 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/16-22:59:40.430972 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/16-22:59:40.430973 8651103744 Options.table_properties_collectors: +2023/08/16-22:59:40.430974 8651103744 Options.inplace_update_support: 0 +2023/08/16-22:59:40.430975 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/16-22:59:40.430975 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/16-22:59:40.430976 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/16-22:59:40.430977 8651103744 Options.memtable_huge_page_size: 0 +2023/08/16-22:59:40.430978 8651103744 Options.bloom_locality: 0 +2023/08/16-22:59:40.430978 8651103744 Options.max_successive_merges: 0 +2023/08/16-22:59:40.430979 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/16-22:59:40.430979 8651103744 Options.paranoid_file_checks: 0 +2023/08/16-22:59:40.430980 8651103744 Options.force_consistency_checks: 1 +2023/08/16-22:59:40.430981 8651103744 Options.report_bg_io_stats: 0 +2023/08/16-22:59:40.430981 8651103744 Options.ttl: 2592000 +2023/08/16-22:59:40.430982 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/16-22:59:40.430983 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/16-22:59:40.430983 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/16-22:59:40.430984 8651103744 Options.enable_blob_files: false +2023/08/16-22:59:40.430985 8651103744 Options.min_blob_size: 0 +2023/08/16-22:59:40.430985 8651103744 Options.blob_file_size: 268435456 +2023/08/16-22:59:40.430986 8651103744 Options.blob_compression_type: NoCompression +2023/08/16-22:59:40.430987 8651103744 Options.enable_blob_garbage_collection: false +2023/08/16-22:59:40.430987 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/16-22:59:40.430988 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/16-22:59:40.430989 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/16-22:59:40.430989 8651103744 Options.blob_file_starting_level: 0 +2023/08/16-22:59:40.430990 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/16-22:59:40.432185 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000122 succeeded,manifest_file_number is 122, next_file_number is 124, last_sequence is 25176, log_number is 114,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 114 +2023/08/16-22:59:40.432189 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 114 +2023/08/16-22:59:40.432349 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/16-22:59:40.432472 8651103744 EVENT_LOG_v1 {"time_micros": 1692194380432468, "job": 1, "event": "recovery_started", "wal_files": [121]} +2023/08/16-22:59:40.432474 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #121 mode 2 +2023/08/16-22:59:40.433214 8651103744 EVENT_LOG_v1 {"time_micros": 1692194380433189, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 125, "file_size": 13828, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 25177, "largest_seqno": 25494, "table_properties": {"data_size": 12730, "index_size": 208, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 14416, "raw_average_key_size": 45, "raw_value_size": 13252, "raw_average_value_size": 41, "num_data_blocks": 6, "num_entries": 318, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692194380, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "XCLFO9HHL5QRMVTCSXGW", "orig_file_number": 125, "seqno_to_time_mapping": "N/A"}} +2023/08/16-22:59:40.433298 8651103744 EVENT_LOG_v1 {"time_micros": 1692194380433296, "job": 1, "event": "recovery_finished"} +2023/08/16-22:59:40.433373 8651103744 [db/version_set.cc:5180] Creating manifest 127 +2023/08/16-22:59:40.434888 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000121.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/16-22:59:40.434900 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x14c1041f0 +2023/08/16-22:59:40.434940 8651103744 DB pointer 0x14d008200 +2023/08/16-22:59:40.435053 6165770240 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/16-22:59:40.435056 6165770240 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 2/0 77.40 KB 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 31.0 0.00 0.00 1 0.000 0 0 0.0 0.0 + L1 1/0 1.02 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 3/0 1.09 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 31.0 0.00 0.00 1 0.000 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 31.0 0.00 0.00 1 0.000 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 0.00 0.00 1 0.000 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 3.18 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 3.18 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000031740d8#1959 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 8e-06 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692199165312346 b/rust/hyperlane_db/LOG.old.1692199165312346 new file mode 100644 index 0000000000..3064197bdb --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692199165312346 @@ -0,0 +1,286 @@ +2023/08/17-00:14:43.939313 8651103744 RocksDB version: 8.1.1 +2023/08/17-00:14:43.940147 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/17-00:14:43.940150 8651103744 DB SUMMARY +2023/08/17-00:14:43.940151 8651103744 DB Session ID: JF2ZRSGI1CZFSMPB1N1R +2023/08/17-00:14:43.940254 8651103744 CURRENT file: CURRENT +2023/08/17-00:14:43.940256 8651103744 IDENTITY file: IDENTITY +2023/08/17-00:14:43.940271 8651103744 MANIFEST file: MANIFEST-000127 size: 635 Bytes +2023/08/17-00:14:43.940284 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 3, files: 000117.sst 000120.sst 000125.sst +2023/08/17-00:14:43.940286 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000126.log size: 116015 ; +2023/08/17-00:14:43.940288 8651103744 Options.error_if_exists: 0 +2023/08/17-00:14:43.940289 8651103744 Options.create_if_missing: 1 +2023/08/17-00:14:43.940290 8651103744 Options.paranoid_checks: 1 +2023/08/17-00:14:43.940291 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/17-00:14:43.940292 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/17-00:14:43.940293 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/17-00:14:43.940294 8651103744 Options.env: 0x1096d16e0 +2023/08/17-00:14:43.940295 8651103744 Options.fs: PosixFileSystem +2023/08/17-00:14:43.940297 8651103744 Options.info_log: 0x123704098 +2023/08/17-00:14:43.940297 8651103744 Options.max_file_opening_threads: 16 +2023/08/17-00:14:43.940298 8651103744 Options.statistics: 0x0 +2023/08/17-00:14:43.940299 8651103744 Options.use_fsync: 0 +2023/08/17-00:14:43.940300 8651103744 Options.max_log_file_size: 0 +2023/08/17-00:14:43.940301 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/17-00:14:43.940302 8651103744 Options.log_file_time_to_roll: 0 +2023/08/17-00:14:43.940303 8651103744 Options.keep_log_file_num: 1000 +2023/08/17-00:14:43.940304 8651103744 Options.recycle_log_file_num: 0 +2023/08/17-00:14:43.940305 8651103744 Options.allow_fallocate: 1 +2023/08/17-00:14:43.940306 8651103744 Options.allow_mmap_reads: 0 +2023/08/17-00:14:43.940307 8651103744 Options.allow_mmap_writes: 0 +2023/08/17-00:14:43.940308 8651103744 Options.use_direct_reads: 0 +2023/08/17-00:14:43.940309 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/17-00:14:43.940310 8651103744 Options.create_missing_column_families: 0 +2023/08/17-00:14:43.940311 8651103744 Options.db_log_dir: +2023/08/17-00:14:43.940312 8651103744 Options.wal_dir: +2023/08/17-00:14:43.940313 8651103744 Options.table_cache_numshardbits: 6 +2023/08/17-00:14:43.940314 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/17-00:14:43.940315 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/17-00:14:43.940316 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/17-00:14:43.940317 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/17-00:14:43.940318 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/17-00:14:43.940318 8651103744 Options.advise_random_on_open: 1 +2023/08/17-00:14:43.940319 8651103744 Options.db_write_buffer_size: 0 +2023/08/17-00:14:43.940320 8651103744 Options.write_buffer_manager: 0x600002404000 +2023/08/17-00:14:43.940321 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/17-00:14:43.940322 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/17-00:14:43.940323 8651103744 Options.use_adaptive_mutex: 0 +2023/08/17-00:14:43.940324 8651103744 Options.rate_limiter: 0x0 +2023/08/17-00:14:43.940326 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/17-00:14:43.940326 8651103744 Options.wal_recovery_mode: 2 +2023/08/17-00:14:43.940327 8651103744 Options.enable_thread_tracking: 0 +2023/08/17-00:14:43.940328 8651103744 Options.enable_pipelined_write: 0 +2023/08/17-00:14:43.940329 8651103744 Options.unordered_write: 0 +2023/08/17-00:14:43.940330 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/17-00:14:43.940331 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/17-00:14:43.940332 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/17-00:14:43.940333 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/17-00:14:43.940334 8651103744 Options.row_cache: None +2023/08/17-00:14:43.940335 8651103744 Options.wal_filter: None +2023/08/17-00:14:43.940336 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/17-00:14:43.940337 8651103744 Options.allow_ingest_behind: 0 +2023/08/17-00:14:43.940338 8651103744 Options.two_write_queues: 0 +2023/08/17-00:14:43.940338 8651103744 Options.manual_wal_flush: 0 +2023/08/17-00:14:43.940339 8651103744 Options.wal_compression: 0 +2023/08/17-00:14:43.940340 8651103744 Options.atomic_flush: 0 +2023/08/17-00:14:43.940341 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/17-00:14:43.940342 8651103744 Options.persist_stats_to_disk: 0 +2023/08/17-00:14:43.940343 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/17-00:14:43.940344 8651103744 Options.log_readahead_size: 0 +2023/08/17-00:14:43.940345 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/17-00:14:43.940346 8651103744 Options.best_efforts_recovery: 0 +2023/08/17-00:14:43.940347 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/17-00:14:43.940348 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/17-00:14:43.940349 8651103744 Options.allow_data_in_errors: 0 +2023/08/17-00:14:43.940350 8651103744 Options.db_host_id: __hostname__ +2023/08/17-00:14:43.940351 8651103744 Options.enforce_single_del_contracts: true +2023/08/17-00:14:43.940352 8651103744 Options.max_background_jobs: 2 +2023/08/17-00:14:43.940352 8651103744 Options.max_background_compactions: -1 +2023/08/17-00:14:43.940353 8651103744 Options.max_subcompactions: 1 +2023/08/17-00:14:43.940354 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/17-00:14:43.940355 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/17-00:14:43.940356 8651103744 Options.delayed_write_rate : 16777216 +2023/08/17-00:14:43.940357 8651103744 Options.max_total_wal_size: 0 +2023/08/17-00:14:43.940358 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/17-00:14:43.940359 8651103744 Options.stats_dump_period_sec: 600 +2023/08/17-00:14:43.940360 8651103744 Options.stats_persist_period_sec: 600 +2023/08/17-00:14:43.940361 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/17-00:14:43.940362 8651103744 Options.max_open_files: -1 +2023/08/17-00:14:43.940363 8651103744 Options.bytes_per_sync: 0 +2023/08/17-00:14:43.940364 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/17-00:14:43.940365 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/17-00:14:43.940366 8651103744 Options.compaction_readahead_size: 0 +2023/08/17-00:14:43.940366 8651103744 Options.max_background_flushes: -1 +2023/08/17-00:14:43.940367 8651103744 Compression algorithms supported: +2023/08/17-00:14:43.940381 8651103744 kZSTD supported: 1 +2023/08/17-00:14:43.940382 8651103744 kZlibCompression supported: 1 +2023/08/17-00:14:43.940383 8651103744 kXpressCompression supported: 0 +2023/08/17-00:14:43.940384 8651103744 kSnappyCompression supported: 1 +2023/08/17-00:14:43.940385 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/17-00:14:43.940387 8651103744 kLZ4HCCompression supported: 1 +2023/08/17-00:14:43.940388 8651103744 kLZ4Compression supported: 1 +2023/08/17-00:14:43.940389 8651103744 kBZip2Compression supported: 1 +2023/08/17-00:14:43.940394 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/17-00:14:43.940396 8651103744 DMutex implementation: pthread_mutex_t +2023/08/17-00:14:43.940673 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000127 +2023/08/17-00:14:43.940911 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/17-00:14:43.940914 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/17-00:14:43.940915 8651103744 Options.merge_operator: None +2023/08/17-00:14:43.940916 8651103744 Options.compaction_filter: None +2023/08/17-00:14:43.940917 8651103744 Options.compaction_filter_factory: None +2023/08/17-00:14:43.940918 8651103744 Options.sst_partitioner_factory: None +2023/08/17-00:14:43.940919 8651103744 Options.memtable_factory: SkipListFactory +2023/08/17-00:14:43.940920 8651103744 Options.table_factory: BlockBasedTable +2023/08/17-00:14:43.940932 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600001f0c640) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x600002a006d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/17-00:14:43.940934 8651103744 Options.write_buffer_size: 67108864 +2023/08/17-00:14:43.940935 8651103744 Options.max_write_buffer_number: 2 +2023/08/17-00:14:43.940936 8651103744 Options.compression: Snappy +2023/08/17-00:14:43.940937 8651103744 Options.bottommost_compression: Disabled +2023/08/17-00:14:43.940938 8651103744 Options.prefix_extractor: nullptr +2023/08/17-00:14:43.940939 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/17-00:14:43.940940 8651103744 Options.num_levels: 7 +2023/08/17-00:14:43.940941 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/17-00:14:43.940942 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/17-00:14:43.940943 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/17-00:14:43.940944 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/17-00:14:43.940945 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/17-00:14:43.940946 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/17-00:14:43.940947 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/17-00:14:43.940948 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/17-00:14:43.940949 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/17-00:14:43.940950 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/17-00:14:43.940951 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/17-00:14:43.940952 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/17-00:14:43.940952 8651103744 Options.compression_opts.window_bits: -14 +2023/08/17-00:14:43.940953 8651103744 Options.compression_opts.level: 32767 +2023/08/17-00:14:43.940954 8651103744 Options.compression_opts.strategy: 0 +2023/08/17-00:14:43.940955 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/17-00:14:43.940956 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/17-00:14:43.940957 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/17-00:14:43.940958 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/17-00:14:43.940959 8651103744 Options.compression_opts.enabled: false +2023/08/17-00:14:43.940960 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/17-00:14:43.940961 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/17-00:14:43.940962 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/17-00:14:43.940963 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/17-00:14:43.940964 8651103744 Options.target_file_size_base: 67108864 +2023/08/17-00:14:43.940965 8651103744 Options.target_file_size_multiplier: 1 +2023/08/17-00:14:43.940966 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/17-00:14:43.940967 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/17-00:14:43.940968 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/17-00:14:43.940969 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/17-00:14:43.940970 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/17-00:14:43.940971 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/17-00:14:43.940972 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/17-00:14:43.940973 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/17-00:14:43.940974 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/17-00:14:43.940975 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/17-00:14:43.940976 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/17-00:14:43.940977 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/17-00:14:43.940977 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/17-00:14:43.940978 8651103744 Options.arena_block_size: 1048576 +2023/08/17-00:14:43.940979 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/17-00:14:43.940980 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/17-00:14:43.940981 8651103744 Options.disable_auto_compactions: 0 +2023/08/17-00:14:43.940983 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/17-00:14:43.940985 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/17-00:14:43.940986 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/17-00:14:43.940987 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/17-00:14:43.940988 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/17-00:14:43.940989 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/17-00:14:43.940990 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/17-00:14:43.940993 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/17-00:14:43.940994 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/17-00:14:43.940995 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/17-00:14:43.940996 8651103744 Options.table_properties_collectors: +2023/08/17-00:14:43.940997 8651103744 Options.inplace_update_support: 0 +2023/08/17-00:14:43.940998 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/17-00:14:43.940999 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/17-00:14:43.941000 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/17-00:14:43.941001 8651103744 Options.memtable_huge_page_size: 0 +2023/08/17-00:14:43.941002 8651103744 Options.bloom_locality: 0 +2023/08/17-00:14:43.941003 8651103744 Options.max_successive_merges: 0 +2023/08/17-00:14:43.941004 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/17-00:14:43.941005 8651103744 Options.paranoid_file_checks: 0 +2023/08/17-00:14:43.941006 8651103744 Options.force_consistency_checks: 1 +2023/08/17-00:14:43.941007 8651103744 Options.report_bg_io_stats: 0 +2023/08/17-00:14:43.941008 8651103744 Options.ttl: 2592000 +2023/08/17-00:14:43.941009 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/17-00:14:43.941010 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/17-00:14:43.941010 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/17-00:14:43.941011 8651103744 Options.enable_blob_files: false +2023/08/17-00:14:43.941012 8651103744 Options.min_blob_size: 0 +2023/08/17-00:14:43.941013 8651103744 Options.blob_file_size: 268435456 +2023/08/17-00:14:43.941014 8651103744 Options.blob_compression_type: NoCompression +2023/08/17-00:14:43.941015 8651103744 Options.enable_blob_garbage_collection: false +2023/08/17-00:14:43.941016 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/17-00:14:43.941017 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/17-00:14:43.941018 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/17-00:14:43.941019 8651103744 Options.blob_file_starting_level: 0 +2023/08/17-00:14:43.941020 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/17-00:14:43.942281 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000127 succeeded,manifest_file_number is 127, next_file_number is 129, last_sequence is 25494, log_number is 122,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 122 +2023/08/17-00:14:43.942283 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 122 +2023/08/17-00:14:43.942469 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/17-00:14:43.942677 8651103744 EVENT_LOG_v1 {"time_micros": 1692198883942672, "job": 1, "event": "recovery_started", "wal_files": [126]} +2023/08/17-00:14:43.942680 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #126 mode 2 +2023/08/17-00:14:43.949274 8651103744 EVENT_LOG_v1 {"time_micros": 1692198883949253, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 130, "file_size": 45749, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 25495, "largest_seqno": 26433, "table_properties": {"data_size": 44425, "index_size": 618, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 42568, "raw_average_key_size": 45, "raw_value_size": 60245, "raw_average_value_size": 64, "num_data_blocks": 20, "num_entries": 939, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692198883, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "JF2ZRSGI1CZFSMPB1N1R", "orig_file_number": 130, "seqno_to_time_mapping": "N/A"}} +2023/08/17-00:14:43.949349 8651103744 EVENT_LOG_v1 {"time_micros": 1692198883949347, "job": 1, "event": "recovery_finished"} +2023/08/17-00:14:43.949600 8651103744 [db/version_set.cc:5180] Creating manifest 132 +2023/08/17-00:14:43.952221 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000126.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/17-00:14:43.952292 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x1237041f0 +2023/08/17-00:14:43.952386 8651103744 DB pointer 0x124008200 +2023/08/17-00:14:43.952622 6097367040 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/17-00:14:43.952626 6097367040 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 3/0 122.08 KB 0.8 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 19.3 0.00 0.00 1 0.002 0 0 0.0 0.0 + L1 1/0 1.02 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 4/0 1.14 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 19.3 0.00 0.00 1 0.002 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 19.3 0.00 0.00 1 0.002 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.3 0.00 0.00 1 0.002 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 3.71 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 3.71 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x600002a006d8#4064 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 4.9e-05 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692200969793725 b/rust/hyperlane_db/LOG.old.1692200969793725 new file mode 100644 index 0000000000..5d7c6425a5 --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692200969793725 @@ -0,0 +1,304 @@ +2023/08/17-00:19:25.313127 8651103744 RocksDB version: 8.1.1 +2023/08/17-00:19:25.313631 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/17-00:19:25.313633 8651103744 DB SUMMARY +2023/08/17-00:19:25.313634 8651103744 DB Session ID: CFDNMA7WAFC4O6JK4M8I +2023/08/17-00:19:25.313725 8651103744 CURRENT file: CURRENT +2023/08/17-00:19:25.313727 8651103744 IDENTITY file: IDENTITY +2023/08/17-00:19:25.313742 8651103744 MANIFEST file: MANIFEST-000132 size: 805 Bytes +2023/08/17-00:19:25.313756 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 4, files: 000117.sst 000120.sst 000125.sst 000130.sst +2023/08/17-00:19:25.313758 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000131.log size: 330818 ; +2023/08/17-00:19:25.313760 8651103744 Options.error_if_exists: 0 +2023/08/17-00:19:25.313761 8651103744 Options.create_if_missing: 1 +2023/08/17-00:19:25.313762 8651103744 Options.paranoid_checks: 1 +2023/08/17-00:19:25.313763 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/17-00:19:25.313764 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/17-00:19:25.313765 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/17-00:19:25.313766 8651103744 Options.env: 0x1056bd6e0 +2023/08/17-00:19:25.313768 8651103744 Options.fs: PosixFileSystem +2023/08/17-00:19:25.313769 8651103744 Options.info_log: 0x14160aa98 +2023/08/17-00:19:25.313770 8651103744 Options.max_file_opening_threads: 16 +2023/08/17-00:19:25.313771 8651103744 Options.statistics: 0x0 +2023/08/17-00:19:25.313772 8651103744 Options.use_fsync: 0 +2023/08/17-00:19:25.313773 8651103744 Options.max_log_file_size: 0 +2023/08/17-00:19:25.313774 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/17-00:19:25.313775 8651103744 Options.log_file_time_to_roll: 0 +2023/08/17-00:19:25.313776 8651103744 Options.keep_log_file_num: 1000 +2023/08/17-00:19:25.313777 8651103744 Options.recycle_log_file_num: 0 +2023/08/17-00:19:25.313778 8651103744 Options.allow_fallocate: 1 +2023/08/17-00:19:25.313779 8651103744 Options.allow_mmap_reads: 0 +2023/08/17-00:19:25.313780 8651103744 Options.allow_mmap_writes: 0 +2023/08/17-00:19:25.313781 8651103744 Options.use_direct_reads: 0 +2023/08/17-00:19:25.313782 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/17-00:19:25.313783 8651103744 Options.create_missing_column_families: 0 +2023/08/17-00:19:25.313784 8651103744 Options.db_log_dir: +2023/08/17-00:19:25.313785 8651103744 Options.wal_dir: +2023/08/17-00:19:25.313786 8651103744 Options.table_cache_numshardbits: 6 +2023/08/17-00:19:25.313787 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/17-00:19:25.313788 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/17-00:19:25.313789 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/17-00:19:25.313791 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/17-00:19:25.313792 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/17-00:19:25.313793 8651103744 Options.advise_random_on_open: 1 +2023/08/17-00:19:25.313794 8651103744 Options.db_write_buffer_size: 0 +2023/08/17-00:19:25.313795 8651103744 Options.write_buffer_manager: 0x600001e59380 +2023/08/17-00:19:25.313796 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/17-00:19:25.313797 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/17-00:19:25.313798 8651103744 Options.use_adaptive_mutex: 0 +2023/08/17-00:19:25.313799 8651103744 Options.rate_limiter: 0x0 +2023/08/17-00:19:25.313800 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/17-00:19:25.313801 8651103744 Options.wal_recovery_mode: 2 +2023/08/17-00:19:25.313802 8651103744 Options.enable_thread_tracking: 0 +2023/08/17-00:19:25.313803 8651103744 Options.enable_pipelined_write: 0 +2023/08/17-00:19:25.313804 8651103744 Options.unordered_write: 0 +2023/08/17-00:19:25.313805 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/17-00:19:25.313806 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/17-00:19:25.313807 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/17-00:19:25.313808 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/17-00:19:25.313809 8651103744 Options.row_cache: None +2023/08/17-00:19:25.313810 8651103744 Options.wal_filter: None +2023/08/17-00:19:25.313811 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/17-00:19:25.313812 8651103744 Options.allow_ingest_behind: 0 +2023/08/17-00:19:25.313813 8651103744 Options.two_write_queues: 0 +2023/08/17-00:19:25.313814 8651103744 Options.manual_wal_flush: 0 +2023/08/17-00:19:25.313815 8651103744 Options.wal_compression: 0 +2023/08/17-00:19:25.313816 8651103744 Options.atomic_flush: 0 +2023/08/17-00:19:25.313817 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/17-00:19:25.313818 8651103744 Options.persist_stats_to_disk: 0 +2023/08/17-00:19:25.313819 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/17-00:19:25.313820 8651103744 Options.log_readahead_size: 0 +2023/08/17-00:19:25.313821 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/17-00:19:25.313822 8651103744 Options.best_efforts_recovery: 0 +2023/08/17-00:19:25.313823 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/17-00:19:25.313824 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/17-00:19:25.313825 8651103744 Options.allow_data_in_errors: 0 +2023/08/17-00:19:25.313826 8651103744 Options.db_host_id: __hostname__ +2023/08/17-00:19:25.313827 8651103744 Options.enforce_single_del_contracts: true +2023/08/17-00:19:25.313828 8651103744 Options.max_background_jobs: 2 +2023/08/17-00:19:25.313829 8651103744 Options.max_background_compactions: -1 +2023/08/17-00:19:25.313830 8651103744 Options.max_subcompactions: 1 +2023/08/17-00:19:25.313831 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/17-00:19:25.313832 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/17-00:19:25.313833 8651103744 Options.delayed_write_rate : 16777216 +2023/08/17-00:19:25.313834 8651103744 Options.max_total_wal_size: 0 +2023/08/17-00:19:25.313835 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/17-00:19:25.313837 8651103744 Options.stats_dump_period_sec: 600 +2023/08/17-00:19:25.313838 8651103744 Options.stats_persist_period_sec: 600 +2023/08/17-00:19:25.313839 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/17-00:19:25.313840 8651103744 Options.max_open_files: -1 +2023/08/17-00:19:25.313841 8651103744 Options.bytes_per_sync: 0 +2023/08/17-00:19:25.313842 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/17-00:19:25.313843 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/17-00:19:25.313843 8651103744 Options.compaction_readahead_size: 0 +2023/08/17-00:19:25.313845 8651103744 Options.max_background_flushes: -1 +2023/08/17-00:19:25.313846 8651103744 Compression algorithms supported: +2023/08/17-00:19:25.313862 8651103744 kZSTD supported: 1 +2023/08/17-00:19:25.313864 8651103744 kZlibCompression supported: 1 +2023/08/17-00:19:25.313865 8651103744 kXpressCompression supported: 0 +2023/08/17-00:19:25.313866 8651103744 kSnappyCompression supported: 1 +2023/08/17-00:19:25.313867 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/17-00:19:25.313868 8651103744 kLZ4HCCompression supported: 1 +2023/08/17-00:19:25.313869 8651103744 kLZ4Compression supported: 1 +2023/08/17-00:19:25.313870 8651103744 kBZip2Compression supported: 1 +2023/08/17-00:19:25.313876 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/17-00:19:25.313877 8651103744 DMutex implementation: pthread_mutex_t +2023/08/17-00:19:25.313993 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000132 +2023/08/17-00:19:25.314217 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/17-00:19:25.314219 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/17-00:19:25.314220 8651103744 Options.merge_operator: None +2023/08/17-00:19:25.314221 8651103744 Options.compaction_filter: None +2023/08/17-00:19:25.314222 8651103744 Options.compaction_filter_factory: None +2023/08/17-00:19:25.314223 8651103744 Options.sst_partitioner_factory: None +2023/08/17-00:19:25.314224 8651103744 Options.memtable_factory: SkipListFactory +2023/08/17-00:19:25.314225 8651103744 Options.table_factory: BlockBasedTable +2023/08/17-00:19:25.314236 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600002554640) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000010586d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/17-00:19:25.314237 8651103744 Options.write_buffer_size: 67108864 +2023/08/17-00:19:25.314238 8651103744 Options.max_write_buffer_number: 2 +2023/08/17-00:19:25.314239 8651103744 Options.compression: Snappy +2023/08/17-00:19:25.314240 8651103744 Options.bottommost_compression: Disabled +2023/08/17-00:19:25.314241 8651103744 Options.prefix_extractor: nullptr +2023/08/17-00:19:25.314242 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/17-00:19:25.314243 8651103744 Options.num_levels: 7 +2023/08/17-00:19:25.314244 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/17-00:19:25.314245 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/17-00:19:25.314246 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/17-00:19:25.314247 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/17-00:19:25.314248 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/17-00:19:25.314249 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/17-00:19:25.314250 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/17-00:19:25.314251 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/17-00:19:25.314252 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/17-00:19:25.314253 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/17-00:19:25.314254 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/17-00:19:25.314255 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/17-00:19:25.314256 8651103744 Options.compression_opts.window_bits: -14 +2023/08/17-00:19:25.314257 8651103744 Options.compression_opts.level: 32767 +2023/08/17-00:19:25.314258 8651103744 Options.compression_opts.strategy: 0 +2023/08/17-00:19:25.314259 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/17-00:19:25.314260 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/17-00:19:25.314261 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/17-00:19:25.314262 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/17-00:19:25.314263 8651103744 Options.compression_opts.enabled: false +2023/08/17-00:19:25.314264 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/17-00:19:25.314265 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/17-00:19:25.314266 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/17-00:19:25.314266 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/17-00:19:25.314267 8651103744 Options.target_file_size_base: 67108864 +2023/08/17-00:19:25.314268 8651103744 Options.target_file_size_multiplier: 1 +2023/08/17-00:19:25.314269 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/17-00:19:25.314270 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/17-00:19:25.314271 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/17-00:19:25.314272 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/17-00:19:25.314273 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/17-00:19:25.314274 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/17-00:19:25.314275 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/17-00:19:25.314276 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/17-00:19:25.314277 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/17-00:19:25.314278 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/17-00:19:25.314279 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/17-00:19:25.314279 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/17-00:19:25.314280 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/17-00:19:25.314281 8651103744 Options.arena_block_size: 1048576 +2023/08/17-00:19:25.314282 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/17-00:19:25.314283 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/17-00:19:25.314284 8651103744 Options.disable_auto_compactions: 0 +2023/08/17-00:19:25.314288 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/17-00:19:25.314290 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/17-00:19:25.314291 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/17-00:19:25.314292 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/17-00:19:25.314293 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/17-00:19:25.314293 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/17-00:19:25.314294 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/17-00:19:25.314297 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/17-00:19:25.314298 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/17-00:19:25.314299 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/17-00:19:25.314301 8651103744 Options.table_properties_collectors: +2023/08/17-00:19:25.314302 8651103744 Options.inplace_update_support: 0 +2023/08/17-00:19:25.314303 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/17-00:19:25.314304 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/17-00:19:25.314305 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/17-00:19:25.314306 8651103744 Options.memtable_huge_page_size: 0 +2023/08/17-00:19:25.314306 8651103744 Options.bloom_locality: 0 +2023/08/17-00:19:25.314307 8651103744 Options.max_successive_merges: 0 +2023/08/17-00:19:25.314308 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/17-00:19:25.314309 8651103744 Options.paranoid_file_checks: 0 +2023/08/17-00:19:25.314310 8651103744 Options.force_consistency_checks: 1 +2023/08/17-00:19:25.314311 8651103744 Options.report_bg_io_stats: 0 +2023/08/17-00:19:25.314312 8651103744 Options.ttl: 2592000 +2023/08/17-00:19:25.314313 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/17-00:19:25.314314 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/17-00:19:25.314315 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/17-00:19:25.314316 8651103744 Options.enable_blob_files: false +2023/08/17-00:19:25.314317 8651103744 Options.min_blob_size: 0 +2023/08/17-00:19:25.314318 8651103744 Options.blob_file_size: 268435456 +2023/08/17-00:19:25.314319 8651103744 Options.blob_compression_type: NoCompression +2023/08/17-00:19:25.314320 8651103744 Options.enable_blob_garbage_collection: false +2023/08/17-00:19:25.314321 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/17-00:19:25.314322 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/17-00:19:25.314323 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/17-00:19:25.314324 8651103744 Options.blob_file_starting_level: 0 +2023/08/17-00:19:25.314325 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/17-00:19:25.315632 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000132 succeeded,manifest_file_number is 132, next_file_number is 134, last_sequence is 26433, log_number is 127,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 127 +2023/08/17-00:19:25.315637 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 127 +2023/08/17-00:19:25.315686 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/17-00:19:25.315897 8651103744 EVENT_LOG_v1 {"time_micros": 1692199165315889, "job": 1, "event": "recovery_started", "wal_files": [131]} +2023/08/17-00:19:25.315900 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #131 mode 2 +2023/08/17-00:19:25.333434 8651103744 EVENT_LOG_v1 {"time_micros": 1692199165333408, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 135, "file_size": 137511, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 26434, "largest_seqno": 29201, "table_properties": {"data_size": 135651, "index_size": 1852, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 125494, "raw_average_key_size": 45, "raw_value_size": 166334, "raw_average_value_size": 60, "num_data_blocks": 59, "num_entries": 2768, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692199165, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "CFDNMA7WAFC4O6JK4M8I", "orig_file_number": 135, "seqno_to_time_mapping": "N/A"}} +2023/08/17-00:19:25.333521 8651103744 EVENT_LOG_v1 {"time_micros": 1692199165333519, "job": 1, "event": "recovery_finished"} +2023/08/17-00:19:25.333657 8651103744 [db/version_set.cc:5180] Creating manifest 137 +2023/08/17-00:19:25.336361 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000131.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/17-00:19:25.336432 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x14160abf0 +2023/08/17-00:19:25.336532 8651103744 DB pointer 0x141821400 +2023/08/17-00:19:25.336572 6163410944 [db/compaction/compaction_job.cc:1988] [default] [JOB 3] Compacting 4@0 + 1@1 files to L1, score 1.00 +2023/08/17-00:19:25.336578 6163410944 [db/compaction/compaction_job.cc:1992] [default]: Compaction start summary: Base version 2 Base level 0, inputs: [135(134KB) 130(44KB) 125(13KB) 120(63KB)], [117(1042KB)] +2023/08/17-00:19:25.336589 6163410944 EVENT_LOG_v1 {"time_micros": 1692199165336581, "job": 3, "event": "compaction_started", "compaction_reason": "LevelL0FilesNum", "files_L0": [135, 130, 125, 120], "files_L1": [117], "score": 1, "input_data_size": 1330197, "oldest_snapshot_seqno": -1} +2023/08/17-00:19:25.336778 6164557824 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/17-00:19:25.336808 6164557824 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 4/4 256.37 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 24.1 0.01 0.00 1 0.005 0 0 0.0 0.0 + L1 1/1 1.02 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 5/5 1.27 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 24.1 0.01 0.00 1 0.005 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 24.1 0.01 0.00 1 0.005 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.1 0.01 0.00 1 0.005 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 5.80 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 5.80 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000010586d8#4189 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 4.6e-05 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** +2023/08/17-00:19:25.405602 6163410944 [db/compaction/compaction_job.cc:1592] [default] [JOB 3] Generated table #140: 28433 keys, 1326253 bytes, temperature: kUnknown +2023/08/17-00:19:25.405636 6163410944 EVENT_LOG_v1 {"time_micros": 1692199165405613, "cf_name": "default", "job": 3, "event": "table_file_creation", "file_number": 140, "file_size": 1326253, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 0, "largest_seqno": 0, "table_properties": {"data_size": 1316717, "index_size": 28205, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 2091319, "raw_average_key_size": 73, "raw_value_size": 1313571, "raw_average_value_size": 46, "num_data_blocks": 598, "num_entries": 28433, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692109142, "oldest_key_time": 0, "file_creation_time": 1692199165, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "CFDNMA7WAFC4O6JK4M8I", "orig_file_number": 140, "seqno_to_time_mapping": "N/A"}} +2023/08/17-00:19:25.406178 6163410944 (Original Log Time 2023/08/17-00:19:25.405912) [db/compaction/compaction_job.cc:1663] [default] [JOB 3] Compacted 4@0 + 1@1 files to L1 => 1326253 bytes +2023/08/17-00:19:25.406180 6163410944 (Original Log Time 2023/08/17-00:19:25.406090) [db/compaction/compaction_job.cc:885] [default] compacted to: files[0 1 0 0 0 0 0] max score 0.00, MB/sec: 19.2 rd, 19.2 wr, level 1, files in(4, 1) out(1 +0 blob) MB in(0.3, 1.0 +0.0 blob) out(1.3 +0.0 blob), read-write-amplify(10.1) write-amplify(5.1) OK, records in: 28437, records dropped: 4 output_compression: Snappy +2023/08/17-00:19:25.406182 6163410944 (Original Log Time 2023/08/17-00:19:25.406112) EVENT_LOG_v1 {"time_micros": 1692199165406095, "job": 3, "event": "compaction_finished", "compaction_time_micros": 69121, "compaction_time_cpu_micros": 68483, "output_level": 1, "num_output_files": 1, "total_output_size": 1326253, "num_input_records": 28437, "num_output_records": 28433, "num_subcompactions": 1, "output_compression": "Snappy", "num_single_delete_mismatches": 0, "num_single_delete_fallthrough": 0, "lsm_state": [0, 1, 0, 0, 0, 0, 0]} +2023/08/17-00:19:25.406260 6163410944 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000135.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/17-00:19:25.406265 6163410944 EVENT_LOG_v1 {"time_micros": 1692199165406263, "job": 3, "event": "table_file_deletion", "file_number": 135} +2023/08/17-00:19:25.406342 6163410944 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000130.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/17-00:19:25.406346 6163410944 EVENT_LOG_v1 {"time_micros": 1692199165406344, "job": 3, "event": "table_file_deletion", "file_number": 130} +2023/08/17-00:19:25.406402 6163410944 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000125.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/17-00:19:25.406405 6163410944 EVENT_LOG_v1 {"time_micros": 1692199165406404, "job": 3, "event": "table_file_deletion", "file_number": 125} +2023/08/17-00:19:25.406457 6163410944 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000120.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/17-00:19:25.406461 6163410944 EVENT_LOG_v1 {"time_micros": 1692199165406459, "job": 3, "event": "table_file_deletion", "file_number": 120} +2023/08/17-00:19:25.406799 6163410944 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000117.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/17-00:19:25.406804 6163410944 EVENT_LOG_v1 {"time_micros": 1692199165406802, "job": 3, "event": "table_file_deletion", "file_number": 117} diff --git a/rust/hyperlane_db/LOG.old.1692201117982925 b/rust/hyperlane_db/LOG.old.1692201117982925 new file mode 100644 index 0000000000..0a9860cd3e --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692201117982925 @@ -0,0 +1,286 @@ +2023/08/17-00:49:29.794435 8651103744 RocksDB version: 8.1.1 +2023/08/17-00:49:29.795076 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/17-00:49:29.795078 8651103744 DB SUMMARY +2023/08/17-00:49:29.795079 8651103744 DB Session ID: QXDCSM6RIPILTP5RTDPR +2023/08/17-00:49:29.795155 8651103744 CURRENT file: CURRENT +2023/08/17-00:49:29.795157 8651103744 IDENTITY file: IDENTITY +2023/08/17-00:49:29.795180 8651103744 MANIFEST file: MANIFEST-000137 size: 1190 Bytes +2023/08/17-00:49:29.795194 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 1, files: 000140.sst +2023/08/17-00:49:29.795196 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000136.log size: 329532 ; +2023/08/17-00:49:29.795198 8651103744 Options.error_if_exists: 0 +2023/08/17-00:49:29.795199 8651103744 Options.create_if_missing: 1 +2023/08/17-00:49:29.795200 8651103744 Options.paranoid_checks: 1 +2023/08/17-00:49:29.795201 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/17-00:49:29.795202 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/17-00:49:29.795203 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/17-00:49:29.795204 8651103744 Options.env: 0x105dc16e0 +2023/08/17-00:49:29.795205 8651103744 Options.fs: PosixFileSystem +2023/08/17-00:49:29.795206 8651103744 Options.info_log: 0x15360aa98 +2023/08/17-00:49:29.795207 8651103744 Options.max_file_opening_threads: 16 +2023/08/17-00:49:29.795208 8651103744 Options.statistics: 0x0 +2023/08/17-00:49:29.795209 8651103744 Options.use_fsync: 0 +2023/08/17-00:49:29.795210 8651103744 Options.max_log_file_size: 0 +2023/08/17-00:49:29.795211 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/17-00:49:29.795212 8651103744 Options.log_file_time_to_roll: 0 +2023/08/17-00:49:29.795213 8651103744 Options.keep_log_file_num: 1000 +2023/08/17-00:49:29.795214 8651103744 Options.recycle_log_file_num: 0 +2023/08/17-00:49:29.795215 8651103744 Options.allow_fallocate: 1 +2023/08/17-00:49:29.795216 8651103744 Options.allow_mmap_reads: 0 +2023/08/17-00:49:29.795217 8651103744 Options.allow_mmap_writes: 0 +2023/08/17-00:49:29.795218 8651103744 Options.use_direct_reads: 0 +2023/08/17-00:49:29.795218 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/17-00:49:29.795219 8651103744 Options.create_missing_column_families: 0 +2023/08/17-00:49:29.795220 8651103744 Options.db_log_dir: +2023/08/17-00:49:29.795221 8651103744 Options.wal_dir: +2023/08/17-00:49:29.795222 8651103744 Options.table_cache_numshardbits: 6 +2023/08/17-00:49:29.795223 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/17-00:49:29.795224 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/17-00:49:29.795225 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/17-00:49:29.795226 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/17-00:49:29.795227 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/17-00:49:29.795228 8651103744 Options.advise_random_on_open: 1 +2023/08/17-00:49:29.795229 8651103744 Options.db_write_buffer_size: 0 +2023/08/17-00:49:29.795230 8651103744 Options.write_buffer_manager: 0x600000659380 +2023/08/17-00:49:29.795231 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/17-00:49:29.795232 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/17-00:49:29.795233 8651103744 Options.use_adaptive_mutex: 0 +2023/08/17-00:49:29.795234 8651103744 Options.rate_limiter: 0x0 +2023/08/17-00:49:29.795235 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/17-00:49:29.795236 8651103744 Options.wal_recovery_mode: 2 +2023/08/17-00:49:29.795237 8651103744 Options.enable_thread_tracking: 0 +2023/08/17-00:49:29.795238 8651103744 Options.enable_pipelined_write: 0 +2023/08/17-00:49:29.795239 8651103744 Options.unordered_write: 0 +2023/08/17-00:49:29.795240 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/17-00:49:29.795241 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/17-00:49:29.795241 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/17-00:49:29.795242 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/17-00:49:29.795243 8651103744 Options.row_cache: None +2023/08/17-00:49:29.795244 8651103744 Options.wal_filter: None +2023/08/17-00:49:29.795245 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/17-00:49:29.795246 8651103744 Options.allow_ingest_behind: 0 +2023/08/17-00:49:29.795247 8651103744 Options.two_write_queues: 0 +2023/08/17-00:49:29.795248 8651103744 Options.manual_wal_flush: 0 +2023/08/17-00:49:29.795249 8651103744 Options.wal_compression: 0 +2023/08/17-00:49:29.795250 8651103744 Options.atomic_flush: 0 +2023/08/17-00:49:29.795251 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/17-00:49:29.795252 8651103744 Options.persist_stats_to_disk: 0 +2023/08/17-00:49:29.795253 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/17-00:49:29.795254 8651103744 Options.log_readahead_size: 0 +2023/08/17-00:49:29.795255 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/17-00:49:29.795267 8651103744 Options.best_efforts_recovery: 0 +2023/08/17-00:49:29.795268 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/17-00:49:29.795269 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/17-00:49:29.795270 8651103744 Options.allow_data_in_errors: 0 +2023/08/17-00:49:29.795271 8651103744 Options.db_host_id: __hostname__ +2023/08/17-00:49:29.795272 8651103744 Options.enforce_single_del_contracts: true +2023/08/17-00:49:29.795273 8651103744 Options.max_background_jobs: 2 +2023/08/17-00:49:29.795274 8651103744 Options.max_background_compactions: -1 +2023/08/17-00:49:29.795275 8651103744 Options.max_subcompactions: 1 +2023/08/17-00:49:29.795275 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/17-00:49:29.795276 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/17-00:49:29.795277 8651103744 Options.delayed_write_rate : 16777216 +2023/08/17-00:49:29.795278 8651103744 Options.max_total_wal_size: 0 +2023/08/17-00:49:29.795279 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/17-00:49:29.795280 8651103744 Options.stats_dump_period_sec: 600 +2023/08/17-00:49:29.795281 8651103744 Options.stats_persist_period_sec: 600 +2023/08/17-00:49:29.795282 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/17-00:49:29.795283 8651103744 Options.max_open_files: -1 +2023/08/17-00:49:29.795284 8651103744 Options.bytes_per_sync: 0 +2023/08/17-00:49:29.795285 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/17-00:49:29.795286 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/17-00:49:29.795287 8651103744 Options.compaction_readahead_size: 0 +2023/08/17-00:49:29.795288 8651103744 Options.max_background_flushes: -1 +2023/08/17-00:49:29.795289 8651103744 Compression algorithms supported: +2023/08/17-00:49:29.795305 8651103744 kZSTD supported: 1 +2023/08/17-00:49:29.795306 8651103744 kZlibCompression supported: 1 +2023/08/17-00:49:29.795307 8651103744 kXpressCompression supported: 0 +2023/08/17-00:49:29.795308 8651103744 kSnappyCompression supported: 1 +2023/08/17-00:49:29.795309 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/17-00:49:29.795310 8651103744 kLZ4HCCompression supported: 1 +2023/08/17-00:49:29.795311 8651103744 kLZ4Compression supported: 1 +2023/08/17-00:49:29.795312 8651103744 kBZip2Compression supported: 1 +2023/08/17-00:49:29.795318 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/17-00:49:29.795319 8651103744 DMutex implementation: pthread_mutex_t +2023/08/17-00:49:29.795588 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000137 +2023/08/17-00:49:29.795853 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/17-00:49:29.795855 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/17-00:49:29.795856 8651103744 Options.merge_operator: None +2023/08/17-00:49:29.795857 8651103744 Options.compaction_filter: None +2023/08/17-00:49:29.795858 8651103744 Options.compaction_filter_factory: None +2023/08/17-00:49:29.795859 8651103744 Options.sst_partitioner_factory: None +2023/08/17-00:49:29.795860 8651103744 Options.memtable_factory: SkipListFactory +2023/08/17-00:49:29.795861 8651103744 Options.table_factory: BlockBasedTable +2023/08/17-00:49:29.795885 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600003d54640) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000008586d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/17-00:49:29.795886 8651103744 Options.write_buffer_size: 67108864 +2023/08/17-00:49:29.795887 8651103744 Options.max_write_buffer_number: 2 +2023/08/17-00:49:29.795888 8651103744 Options.compression: Snappy +2023/08/17-00:49:29.795889 8651103744 Options.bottommost_compression: Disabled +2023/08/17-00:49:29.795891 8651103744 Options.prefix_extractor: nullptr +2023/08/17-00:49:29.795891 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/17-00:49:29.795893 8651103744 Options.num_levels: 7 +2023/08/17-00:49:29.795894 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/17-00:49:29.795894 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/17-00:49:29.795895 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/17-00:49:29.795896 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/17-00:49:29.795897 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/17-00:49:29.795898 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/17-00:49:29.795899 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/17-00:49:29.795900 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/17-00:49:29.795901 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/17-00:49:29.795902 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/17-00:49:29.795903 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/17-00:49:29.795904 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/17-00:49:29.795905 8651103744 Options.compression_opts.window_bits: -14 +2023/08/17-00:49:29.795906 8651103744 Options.compression_opts.level: 32767 +2023/08/17-00:49:29.795907 8651103744 Options.compression_opts.strategy: 0 +2023/08/17-00:49:29.795908 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/17-00:49:29.795909 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/17-00:49:29.795910 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/17-00:49:29.795911 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/17-00:49:29.795911 8651103744 Options.compression_opts.enabled: false +2023/08/17-00:49:29.795912 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/17-00:49:29.795913 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/17-00:49:29.795914 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/17-00:49:29.795915 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/17-00:49:29.795916 8651103744 Options.target_file_size_base: 67108864 +2023/08/17-00:49:29.795917 8651103744 Options.target_file_size_multiplier: 1 +2023/08/17-00:49:29.795918 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/17-00:49:29.795919 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/17-00:49:29.795920 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/17-00:49:29.795921 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/17-00:49:29.795922 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/17-00:49:29.795923 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/17-00:49:29.795924 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/17-00:49:29.795925 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/17-00:49:29.795926 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/17-00:49:29.795927 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/17-00:49:29.795928 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/17-00:49:29.795929 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/17-00:49:29.795930 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/17-00:49:29.795931 8651103744 Options.arena_block_size: 1048576 +2023/08/17-00:49:29.795932 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/17-00:49:29.795933 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/17-00:49:29.795933 8651103744 Options.disable_auto_compactions: 0 +2023/08/17-00:49:29.795935 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/17-00:49:29.795937 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/17-00:49:29.795938 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/17-00:49:29.795939 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/17-00:49:29.795940 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/17-00:49:29.795941 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/17-00:49:29.795942 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/17-00:49:29.795944 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/17-00:49:29.795945 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/17-00:49:29.795946 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/17-00:49:29.795948 8651103744 Options.table_properties_collectors: +2023/08/17-00:49:29.795949 8651103744 Options.inplace_update_support: 0 +2023/08/17-00:49:29.795950 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/17-00:49:29.795951 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/17-00:49:29.795952 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/17-00:49:29.795953 8651103744 Options.memtable_huge_page_size: 0 +2023/08/17-00:49:29.795954 8651103744 Options.bloom_locality: 0 +2023/08/17-00:49:29.795955 8651103744 Options.max_successive_merges: 0 +2023/08/17-00:49:29.795956 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/17-00:49:29.795957 8651103744 Options.paranoid_file_checks: 0 +2023/08/17-00:49:29.795957 8651103744 Options.force_consistency_checks: 1 +2023/08/17-00:49:29.795958 8651103744 Options.report_bg_io_stats: 0 +2023/08/17-00:49:29.795959 8651103744 Options.ttl: 2592000 +2023/08/17-00:49:29.795960 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/17-00:49:29.795961 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/17-00:49:29.795962 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/17-00:49:29.795963 8651103744 Options.enable_blob_files: false +2023/08/17-00:49:29.795964 8651103744 Options.min_blob_size: 0 +2023/08/17-00:49:29.795965 8651103744 Options.blob_file_size: 268435456 +2023/08/17-00:49:29.795966 8651103744 Options.blob_compression_type: NoCompression +2023/08/17-00:49:29.795967 8651103744 Options.enable_blob_garbage_collection: false +2023/08/17-00:49:29.795968 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/17-00:49:29.795969 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/17-00:49:29.795970 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/17-00:49:29.795971 8651103744 Options.blob_file_starting_level: 0 +2023/08/17-00:49:29.795972 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/17-00:49:29.797391 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000137 succeeded,manifest_file_number is 137, next_file_number is 142, last_sequence is 29201, log_number is 132,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 132 +2023/08/17-00:49:29.797395 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 132 +2023/08/17-00:49:29.797707 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/17-00:49:29.797878 8651103744 EVENT_LOG_v1 {"time_micros": 1692200969797873, "job": 1, "event": "recovery_started", "wal_files": [136]} +2023/08/17-00:49:29.797881 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #136 mode 2 +2023/08/17-00:49:29.815407 8651103744 EVENT_LOG_v1 {"time_micros": 1692200969815385, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 143, "file_size": 132712, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 29202, "largest_seqno": 32020, "table_properties": {"data_size": 130873, "index_size": 1794, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 127806, "raw_average_key_size": 45, "raw_value_size": 161937, "raw_average_value_size": 57, "num_data_blocks": 57, "num_entries": 2819, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692200969, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "QXDCSM6RIPILTP5RTDPR", "orig_file_number": 143, "seqno_to_time_mapping": "N/A"}} +2023/08/17-00:49:29.815475 8651103744 EVENT_LOG_v1 {"time_micros": 1692200969815473, "job": 1, "event": "recovery_finished"} +2023/08/17-00:49:29.815572 8651103744 [db/version_set.cc:5180] Creating manifest 145 +2023/08/17-00:49:29.818052 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000136.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/17-00:49:29.818090 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x15360abf0 +2023/08/17-00:49:29.818155 8651103744 DB pointer 0x153821400 +2023/08/17-00:49:29.818400 6157185024 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/17-00:49:29.818403 6157185024 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 1/0 129.60 KB 0.2 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 24.3 0.01 0.00 1 0.005 0 0 0.0 0.0 + L1 1/0 1.26 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 2/0 1.39 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 24.3 0.01 0.00 1 0.005 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 24.3 0.01 0.00 1 0.005 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.3 0.01 0.00 1 0.005 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 5.60 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 5.60 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000008586d8#5132 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 4e-05 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692201158741632 b/rust/hyperlane_db/LOG.old.1692201158741632 new file mode 100644 index 0000000000..1cc42a8bc4 --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692201158741632 @@ -0,0 +1,286 @@ +2023/08/17-00:51:57.983701 8651103744 RocksDB version: 8.1.1 +2023/08/17-00:51:57.984339 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/17-00:51:57.984342 8651103744 DB SUMMARY +2023/08/17-00:51:57.984343 8651103744 DB Session ID: PL3A51KRGINLDYL9EQQB +2023/08/17-00:51:57.984424 8651103744 CURRENT file: CURRENT +2023/08/17-00:51:57.984426 8651103744 IDENTITY file: IDENTITY +2023/08/17-00:51:57.984440 8651103744 MANIFEST file: MANIFEST-000145 size: 478 Bytes +2023/08/17-00:51:57.984455 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 2, files: 000140.sst 000143.sst +2023/08/17-00:51:57.984456 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000144.log size: 351937 ; +2023/08/17-00:51:57.984459 8651103744 Options.error_if_exists: 0 +2023/08/17-00:51:57.984460 8651103744 Options.create_if_missing: 1 +2023/08/17-00:51:57.984461 8651103744 Options.paranoid_checks: 1 +2023/08/17-00:51:57.984462 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/17-00:51:57.984463 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/17-00:51:57.984464 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/17-00:51:57.984465 8651103744 Options.env: 0x1054596e0 +2023/08/17-00:51:57.984466 8651103744 Options.fs: PosixFileSystem +2023/08/17-00:51:57.984467 8651103744 Options.info_log: 0x14160a778 +2023/08/17-00:51:57.984468 8651103744 Options.max_file_opening_threads: 16 +2023/08/17-00:51:57.984469 8651103744 Options.statistics: 0x0 +2023/08/17-00:51:57.984470 8651103744 Options.use_fsync: 0 +2023/08/17-00:51:57.984471 8651103744 Options.max_log_file_size: 0 +2023/08/17-00:51:57.984472 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/17-00:51:57.984473 8651103744 Options.log_file_time_to_roll: 0 +2023/08/17-00:51:57.984474 8651103744 Options.keep_log_file_num: 1000 +2023/08/17-00:51:57.984475 8651103744 Options.recycle_log_file_num: 0 +2023/08/17-00:51:57.984476 8651103744 Options.allow_fallocate: 1 +2023/08/17-00:51:57.984477 8651103744 Options.allow_mmap_reads: 0 +2023/08/17-00:51:57.984478 8651103744 Options.allow_mmap_writes: 0 +2023/08/17-00:51:57.984479 8651103744 Options.use_direct_reads: 0 +2023/08/17-00:51:57.984480 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/17-00:51:57.984481 8651103744 Options.create_missing_column_families: 0 +2023/08/17-00:51:57.984482 8651103744 Options.db_log_dir: +2023/08/17-00:51:57.984483 8651103744 Options.wal_dir: +2023/08/17-00:51:57.984484 8651103744 Options.table_cache_numshardbits: 6 +2023/08/17-00:51:57.984485 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/17-00:51:57.984486 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/17-00:51:57.984487 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/17-00:51:57.984488 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/17-00:51:57.984489 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/17-00:51:57.984490 8651103744 Options.advise_random_on_open: 1 +2023/08/17-00:51:57.984491 8651103744 Options.db_write_buffer_size: 0 +2023/08/17-00:51:57.984492 8651103744 Options.write_buffer_manager: 0x600000921380 +2023/08/17-00:51:57.984493 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/17-00:51:57.984494 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/17-00:51:57.984495 8651103744 Options.use_adaptive_mutex: 0 +2023/08/17-00:51:57.984496 8651103744 Options.rate_limiter: 0x0 +2023/08/17-00:51:57.984498 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/17-00:51:57.984499 8651103744 Options.wal_recovery_mode: 2 +2023/08/17-00:51:57.984500 8651103744 Options.enable_thread_tracking: 0 +2023/08/17-00:51:57.984501 8651103744 Options.enable_pipelined_write: 0 +2023/08/17-00:51:57.984502 8651103744 Options.unordered_write: 0 +2023/08/17-00:51:57.984503 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/17-00:51:57.984504 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/17-00:51:57.984505 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/17-00:51:57.984506 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/17-00:51:57.984507 8651103744 Options.row_cache: None +2023/08/17-00:51:57.984508 8651103744 Options.wal_filter: None +2023/08/17-00:51:57.984509 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/17-00:51:57.984510 8651103744 Options.allow_ingest_behind: 0 +2023/08/17-00:51:57.984511 8651103744 Options.two_write_queues: 0 +2023/08/17-00:51:57.984512 8651103744 Options.manual_wal_flush: 0 +2023/08/17-00:51:57.984513 8651103744 Options.wal_compression: 0 +2023/08/17-00:51:57.984514 8651103744 Options.atomic_flush: 0 +2023/08/17-00:51:57.984515 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/17-00:51:57.984516 8651103744 Options.persist_stats_to_disk: 0 +2023/08/17-00:51:57.984517 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/17-00:51:57.984518 8651103744 Options.log_readahead_size: 0 +2023/08/17-00:51:57.984519 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/17-00:51:57.984531 8651103744 Options.best_efforts_recovery: 0 +2023/08/17-00:51:57.984532 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/17-00:51:57.984533 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/17-00:51:57.984534 8651103744 Options.allow_data_in_errors: 0 +2023/08/17-00:51:57.984536 8651103744 Options.db_host_id: __hostname__ +2023/08/17-00:51:57.984537 8651103744 Options.enforce_single_del_contracts: true +2023/08/17-00:51:57.984538 8651103744 Options.max_background_jobs: 2 +2023/08/17-00:51:57.984539 8651103744 Options.max_background_compactions: -1 +2023/08/17-00:51:57.984540 8651103744 Options.max_subcompactions: 1 +2023/08/17-00:51:57.984541 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/17-00:51:57.984542 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/17-00:51:57.984542 8651103744 Options.delayed_write_rate : 16777216 +2023/08/17-00:51:57.984543 8651103744 Options.max_total_wal_size: 0 +2023/08/17-00:51:57.984544 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/17-00:51:57.984545 8651103744 Options.stats_dump_period_sec: 600 +2023/08/17-00:51:57.984546 8651103744 Options.stats_persist_period_sec: 600 +2023/08/17-00:51:57.984547 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/17-00:51:57.984549 8651103744 Options.max_open_files: -1 +2023/08/17-00:51:57.984550 8651103744 Options.bytes_per_sync: 0 +2023/08/17-00:51:57.984551 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/17-00:51:57.984552 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/17-00:51:57.984553 8651103744 Options.compaction_readahead_size: 0 +2023/08/17-00:51:57.984554 8651103744 Options.max_background_flushes: -1 +2023/08/17-00:51:57.984554 8651103744 Compression algorithms supported: +2023/08/17-00:51:57.984569 8651103744 kZSTD supported: 1 +2023/08/17-00:51:57.984570 8651103744 kZlibCompression supported: 1 +2023/08/17-00:51:57.984571 8651103744 kXpressCompression supported: 0 +2023/08/17-00:51:57.984572 8651103744 kSnappyCompression supported: 1 +2023/08/17-00:51:57.984573 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/17-00:51:57.984574 8651103744 kLZ4HCCompression supported: 1 +2023/08/17-00:51:57.984575 8651103744 kLZ4Compression supported: 1 +2023/08/17-00:51:57.984576 8651103744 kBZip2Compression supported: 1 +2023/08/17-00:51:57.984582 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/17-00:51:57.984583 8651103744 DMutex implementation: pthread_mutex_t +2023/08/17-00:51:57.984864 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000145 +2023/08/17-00:51:57.985139 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/17-00:51:57.985142 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/17-00:51:57.985143 8651103744 Options.merge_operator: None +2023/08/17-00:51:57.985144 8651103744 Options.compaction_filter: None +2023/08/17-00:51:57.985145 8651103744 Options.compaction_filter_factory: None +2023/08/17-00:51:57.985146 8651103744 Options.sst_partitioner_factory: None +2023/08/17-00:51:57.985147 8651103744 Options.memtable_factory: SkipListFactory +2023/08/17-00:51:57.985148 8651103744 Options.table_factory: BlockBasedTable +2023/08/17-00:51:57.985172 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x60000322c640) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000007206d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/17-00:51:57.985174 8651103744 Options.write_buffer_size: 67108864 +2023/08/17-00:51:57.985175 8651103744 Options.max_write_buffer_number: 2 +2023/08/17-00:51:57.985176 8651103744 Options.compression: Snappy +2023/08/17-00:51:57.985177 8651103744 Options.bottommost_compression: Disabled +2023/08/17-00:51:57.985178 8651103744 Options.prefix_extractor: nullptr +2023/08/17-00:51:57.985179 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/17-00:51:57.985180 8651103744 Options.num_levels: 7 +2023/08/17-00:51:57.985181 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/17-00:51:57.985182 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/17-00:51:57.985183 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/17-00:51:57.985184 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/17-00:51:57.985185 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/17-00:51:57.985186 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/17-00:51:57.985187 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/17-00:51:57.985188 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/17-00:51:57.985189 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/17-00:51:57.985190 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/17-00:51:57.985191 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/17-00:51:57.985192 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/17-00:51:57.985193 8651103744 Options.compression_opts.window_bits: -14 +2023/08/17-00:51:57.985194 8651103744 Options.compression_opts.level: 32767 +2023/08/17-00:51:57.985195 8651103744 Options.compression_opts.strategy: 0 +2023/08/17-00:51:57.985196 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/17-00:51:57.985197 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/17-00:51:57.985198 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/17-00:51:57.985199 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/17-00:51:57.985200 8651103744 Options.compression_opts.enabled: false +2023/08/17-00:51:57.985201 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/17-00:51:57.985202 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/17-00:51:57.985203 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/17-00:51:57.985204 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/17-00:51:57.985205 8651103744 Options.target_file_size_base: 67108864 +2023/08/17-00:51:57.985206 8651103744 Options.target_file_size_multiplier: 1 +2023/08/17-00:51:57.985207 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/17-00:51:57.985208 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/17-00:51:57.985209 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/17-00:51:57.985210 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/17-00:51:57.985211 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/17-00:51:57.985212 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/17-00:51:57.985213 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/17-00:51:57.985214 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/17-00:51:57.985215 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/17-00:51:57.985216 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/17-00:51:57.985217 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/17-00:51:57.985218 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/17-00:51:57.985219 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/17-00:51:57.985220 8651103744 Options.arena_block_size: 1048576 +2023/08/17-00:51:57.985221 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/17-00:51:57.985222 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/17-00:51:57.985223 8651103744 Options.disable_auto_compactions: 0 +2023/08/17-00:51:57.985225 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/17-00:51:57.985227 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/17-00:51:57.985228 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/17-00:51:57.985229 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/17-00:51:57.985229 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/17-00:51:57.985230 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/17-00:51:57.985231 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/17-00:51:57.985234 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/17-00:51:57.985235 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/17-00:51:57.985236 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/17-00:51:57.985238 8651103744 Options.table_properties_collectors: +2023/08/17-00:51:57.985239 8651103744 Options.inplace_update_support: 0 +2023/08/17-00:51:57.985240 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/17-00:51:57.985241 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/17-00:51:57.985242 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/17-00:51:57.985243 8651103744 Options.memtable_huge_page_size: 0 +2023/08/17-00:51:57.985244 8651103744 Options.bloom_locality: 0 +2023/08/17-00:51:57.985245 8651103744 Options.max_successive_merges: 0 +2023/08/17-00:51:57.985246 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/17-00:51:57.985247 8651103744 Options.paranoid_file_checks: 0 +2023/08/17-00:51:57.985248 8651103744 Options.force_consistency_checks: 1 +2023/08/17-00:51:57.985249 8651103744 Options.report_bg_io_stats: 0 +2023/08/17-00:51:57.985250 8651103744 Options.ttl: 2592000 +2023/08/17-00:51:57.985251 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/17-00:51:57.985252 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/17-00:51:57.985253 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/17-00:51:57.985254 8651103744 Options.enable_blob_files: false +2023/08/17-00:51:57.985255 8651103744 Options.min_blob_size: 0 +2023/08/17-00:51:57.985256 8651103744 Options.blob_file_size: 268435456 +2023/08/17-00:51:57.985257 8651103744 Options.blob_compression_type: NoCompression +2023/08/17-00:51:57.985258 8651103744 Options.enable_blob_garbage_collection: false +2023/08/17-00:51:57.985259 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/17-00:51:57.985260 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/17-00:51:57.985261 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/17-00:51:57.985262 8651103744 Options.blob_file_starting_level: 0 +2023/08/17-00:51:57.985263 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/17-00:51:57.986620 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000145 succeeded,manifest_file_number is 145, next_file_number is 147, last_sequence is 32020, log_number is 137,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 137 +2023/08/17-00:51:57.986624 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 137 +2023/08/17-00:51:57.986815 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/17-00:51:57.987015 8651103744 EVENT_LOG_v1 {"time_micros": 1692201117987010, "job": 1, "event": "recovery_started", "wal_files": [144]} +2023/08/17-00:51:57.987018 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #144 mode 2 +2023/08/17-00:51:58.005550 8651103744 EVENT_LOG_v1 {"time_micros": 1692201118005526, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 148, "file_size": 148129, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 32021, "largest_seqno": 34906, "table_properties": {"data_size": 146223, "index_size": 1939, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 130832, "raw_average_key_size": 45, "raw_value_size": 180074, "raw_average_value_size": 62, "num_data_blocks": 62, "num_entries": 2886, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692201117, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "PL3A51KRGINLDYL9EQQB", "orig_file_number": 148, "seqno_to_time_mapping": "N/A"}} +2023/08/17-00:51:58.005637 8651103744 EVENT_LOG_v1 {"time_micros": 1692201118005635, "job": 1, "event": "recovery_finished"} +2023/08/17-00:51:58.005761 8651103744 [db/version_set.cc:5180] Creating manifest 150 +2023/08/17-00:51:58.008432 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000144.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/17-00:51:58.008473 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x14160a8d0 +2023/08/17-00:51:58.008550 8651103744 DB pointer 0x141821600 +2023/08/17-00:51:58.008816 6167048192 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/17-00:51:58.008819 6167048192 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 2/0 274.26 KB 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 25.0 0.01 0.00 1 0.006 0 0 0.0 0.0 + L1 1/0 1.26 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 3/0 1.53 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 25.0 0.01 0.00 1 0.006 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 25.0 0.01 0.00 1 0.006 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 0.01 0.00 1 0.006 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 5.96 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 5.96 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000007206d8#5448 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 4.1e-05 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692201400366330 b/rust/hyperlane_db/LOG.old.1692201400366330 new file mode 100644 index 0000000000..bbccb5deb6 --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692201400366330 @@ -0,0 +1,286 @@ +2023/08/17-00:52:38.742515 8651103744 RocksDB version: 8.1.1 +2023/08/17-00:52:38.743089 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/17-00:52:38.743092 8651103744 DB SUMMARY +2023/08/17-00:52:38.743093 8651103744 DB Session ID: OX1MKEDLSPP1V3PREWEM +2023/08/17-00:52:38.743235 8651103744 CURRENT file: CURRENT +2023/08/17-00:52:38.743237 8651103744 IDENTITY file: IDENTITY +2023/08/17-00:52:38.743253 8651103744 MANIFEST file: MANIFEST-000150 size: 646 Bytes +2023/08/17-00:52:38.743273 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 3, files: 000140.sst 000143.sst 000148.sst +2023/08/17-00:52:38.743274 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000149.log size: 156259 ; +2023/08/17-00:52:38.743276 8651103744 Options.error_if_exists: 0 +2023/08/17-00:52:38.743278 8651103744 Options.create_if_missing: 1 +2023/08/17-00:52:38.743279 8651103744 Options.paranoid_checks: 1 +2023/08/17-00:52:38.743280 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/17-00:52:38.743281 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/17-00:52:38.743282 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/17-00:52:38.743283 8651103744 Options.env: 0x1051a56e0 +2023/08/17-00:52:38.743284 8651103744 Options.fs: PosixFileSystem +2023/08/17-00:52:38.743285 8651103744 Options.info_log: 0x149f04098 +2023/08/17-00:52:38.743286 8651103744 Options.max_file_opening_threads: 16 +2023/08/17-00:52:38.743287 8651103744 Options.statistics: 0x0 +2023/08/17-00:52:38.743288 8651103744 Options.use_fsync: 0 +2023/08/17-00:52:38.743289 8651103744 Options.max_log_file_size: 0 +2023/08/17-00:52:38.743290 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/17-00:52:38.743291 8651103744 Options.log_file_time_to_roll: 0 +2023/08/17-00:52:38.743292 8651103744 Options.keep_log_file_num: 1000 +2023/08/17-00:52:38.743293 8651103744 Options.recycle_log_file_num: 0 +2023/08/17-00:52:38.743295 8651103744 Options.allow_fallocate: 1 +2023/08/17-00:52:38.743296 8651103744 Options.allow_mmap_reads: 0 +2023/08/17-00:52:38.743297 8651103744 Options.allow_mmap_writes: 0 +2023/08/17-00:52:38.743298 8651103744 Options.use_direct_reads: 0 +2023/08/17-00:52:38.743299 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/17-00:52:38.743300 8651103744 Options.create_missing_column_families: 0 +2023/08/17-00:52:38.743301 8651103744 Options.db_log_dir: +2023/08/17-00:52:38.743302 8651103744 Options.wal_dir: +2023/08/17-00:52:38.743303 8651103744 Options.table_cache_numshardbits: 6 +2023/08/17-00:52:38.743303 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/17-00:52:38.743304 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/17-00:52:38.743305 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/17-00:52:38.743306 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/17-00:52:38.743308 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/17-00:52:38.743309 8651103744 Options.advise_random_on_open: 1 +2023/08/17-00:52:38.743310 8651103744 Options.db_write_buffer_size: 0 +2023/08/17-00:52:38.743311 8651103744 Options.write_buffer_manager: 0x6000029fc000 +2023/08/17-00:52:38.743312 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/17-00:52:38.743313 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/17-00:52:38.743314 8651103744 Options.use_adaptive_mutex: 0 +2023/08/17-00:52:38.743315 8651103744 Options.rate_limiter: 0x0 +2023/08/17-00:52:38.743316 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/17-00:52:38.743317 8651103744 Options.wal_recovery_mode: 2 +2023/08/17-00:52:38.743318 8651103744 Options.enable_thread_tracking: 0 +2023/08/17-00:52:38.743319 8651103744 Options.enable_pipelined_write: 0 +2023/08/17-00:52:38.743320 8651103744 Options.unordered_write: 0 +2023/08/17-00:52:38.743321 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/17-00:52:38.743322 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/17-00:52:38.743323 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/17-00:52:38.743324 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/17-00:52:38.743325 8651103744 Options.row_cache: None +2023/08/17-00:52:38.743326 8651103744 Options.wal_filter: None +2023/08/17-00:52:38.743327 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/17-00:52:38.743328 8651103744 Options.allow_ingest_behind: 0 +2023/08/17-00:52:38.743329 8651103744 Options.two_write_queues: 0 +2023/08/17-00:52:38.743330 8651103744 Options.manual_wal_flush: 0 +2023/08/17-00:52:38.743331 8651103744 Options.wal_compression: 0 +2023/08/17-00:52:38.743332 8651103744 Options.atomic_flush: 0 +2023/08/17-00:52:38.743333 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/17-00:52:38.743334 8651103744 Options.persist_stats_to_disk: 0 +2023/08/17-00:52:38.743335 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/17-00:52:38.743336 8651103744 Options.log_readahead_size: 0 +2023/08/17-00:52:38.743337 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/17-00:52:38.743350 8651103744 Options.best_efforts_recovery: 0 +2023/08/17-00:52:38.743351 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/17-00:52:38.743352 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/17-00:52:38.743353 8651103744 Options.allow_data_in_errors: 0 +2023/08/17-00:52:38.743354 8651103744 Options.db_host_id: __hostname__ +2023/08/17-00:52:38.743355 8651103744 Options.enforce_single_del_contracts: true +2023/08/17-00:52:38.743356 8651103744 Options.max_background_jobs: 2 +2023/08/17-00:52:38.743357 8651103744 Options.max_background_compactions: -1 +2023/08/17-00:52:38.743358 8651103744 Options.max_subcompactions: 1 +2023/08/17-00:52:38.743359 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/17-00:52:38.743360 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/17-00:52:38.743361 8651103744 Options.delayed_write_rate : 16777216 +2023/08/17-00:52:38.743362 8651103744 Options.max_total_wal_size: 0 +2023/08/17-00:52:38.743363 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/17-00:52:38.743364 8651103744 Options.stats_dump_period_sec: 600 +2023/08/17-00:52:38.743365 8651103744 Options.stats_persist_period_sec: 600 +2023/08/17-00:52:38.743366 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/17-00:52:38.743367 8651103744 Options.max_open_files: -1 +2023/08/17-00:52:38.743368 8651103744 Options.bytes_per_sync: 0 +2023/08/17-00:52:38.743369 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/17-00:52:38.743370 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/17-00:52:38.743371 8651103744 Options.compaction_readahead_size: 0 +2023/08/17-00:52:38.743372 8651103744 Options.max_background_flushes: -1 +2023/08/17-00:52:38.743373 8651103744 Compression algorithms supported: +2023/08/17-00:52:38.743387 8651103744 kZSTD supported: 1 +2023/08/17-00:52:38.743388 8651103744 kZlibCompression supported: 1 +2023/08/17-00:52:38.743389 8651103744 kXpressCompression supported: 0 +2023/08/17-00:52:38.743391 8651103744 kSnappyCompression supported: 1 +2023/08/17-00:52:38.743393 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/17-00:52:38.743394 8651103744 kLZ4HCCompression supported: 1 +2023/08/17-00:52:38.743395 8651103744 kLZ4Compression supported: 1 +2023/08/17-00:52:38.743396 8651103744 kBZip2Compression supported: 1 +2023/08/17-00:52:38.743404 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/17-00:52:38.743405 8651103744 DMutex implementation: pthread_mutex_t +2023/08/17-00:52:38.743559 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000150 +2023/08/17-00:52:38.743854 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/17-00:52:38.743860 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/17-00:52:38.743861 8651103744 Options.merge_operator: None +2023/08/17-00:52:38.743862 8651103744 Options.compaction_filter: None +2023/08/17-00:52:38.743863 8651103744 Options.compaction_filter_factory: None +2023/08/17-00:52:38.743864 8651103744 Options.sst_partitioner_factory: None +2023/08/17-00:52:38.743865 8651103744 Options.memtable_factory: SkipListFactory +2023/08/17-00:52:38.743866 8651103744 Options.table_factory: BlockBasedTable +2023/08/17-00:52:38.743905 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x6000012f4640) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000027f86d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/17-00:52:38.743908 8651103744 Options.write_buffer_size: 67108864 +2023/08/17-00:52:38.743909 8651103744 Options.max_write_buffer_number: 2 +2023/08/17-00:52:38.743913 8651103744 Options.compression: Snappy +2023/08/17-00:52:38.743914 8651103744 Options.bottommost_compression: Disabled +2023/08/17-00:52:38.743915 8651103744 Options.prefix_extractor: nullptr +2023/08/17-00:52:38.743916 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/17-00:52:38.743918 8651103744 Options.num_levels: 7 +2023/08/17-00:52:38.743919 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/17-00:52:38.743919 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/17-00:52:38.743920 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/17-00:52:38.743921 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/17-00:52:38.743922 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/17-00:52:38.743923 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/17-00:52:38.743924 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/17-00:52:38.743925 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/17-00:52:38.743926 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/17-00:52:38.743927 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/17-00:52:38.743928 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/17-00:52:38.743929 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/17-00:52:38.743930 8651103744 Options.compression_opts.window_bits: -14 +2023/08/17-00:52:38.743931 8651103744 Options.compression_opts.level: 32767 +2023/08/17-00:52:38.743932 8651103744 Options.compression_opts.strategy: 0 +2023/08/17-00:52:38.743933 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/17-00:52:38.743934 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/17-00:52:38.743935 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/17-00:52:38.743936 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/17-00:52:38.743937 8651103744 Options.compression_opts.enabled: false +2023/08/17-00:52:38.743938 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/17-00:52:38.743939 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/17-00:52:38.743940 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/17-00:52:38.743941 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/17-00:52:38.743942 8651103744 Options.target_file_size_base: 67108864 +2023/08/17-00:52:38.743943 8651103744 Options.target_file_size_multiplier: 1 +2023/08/17-00:52:38.743944 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/17-00:52:38.743945 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/17-00:52:38.743946 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/17-00:52:38.743947 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/17-00:52:38.743948 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/17-00:52:38.743949 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/17-00:52:38.743950 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/17-00:52:38.743951 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/17-00:52:38.743952 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/17-00:52:38.743953 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/17-00:52:38.743954 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/17-00:52:38.743954 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/17-00:52:38.743955 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/17-00:52:38.743956 8651103744 Options.arena_block_size: 1048576 +2023/08/17-00:52:38.743957 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/17-00:52:38.743958 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/17-00:52:38.743959 8651103744 Options.disable_auto_compactions: 0 +2023/08/17-00:52:38.743961 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/17-00:52:38.743963 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/17-00:52:38.743964 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/17-00:52:38.743964 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/17-00:52:38.743965 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/17-00:52:38.743966 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/17-00:52:38.743967 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/17-00:52:38.743970 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/17-00:52:38.743971 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/17-00:52:38.743972 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/17-00:52:38.743974 8651103744 Options.table_properties_collectors: +2023/08/17-00:52:38.743975 8651103744 Options.inplace_update_support: 0 +2023/08/17-00:52:38.743976 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/17-00:52:38.743977 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/17-00:52:38.743978 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/17-00:52:38.743979 8651103744 Options.memtable_huge_page_size: 0 +2023/08/17-00:52:38.743980 8651103744 Options.bloom_locality: 0 +2023/08/17-00:52:38.743981 8651103744 Options.max_successive_merges: 0 +2023/08/17-00:52:38.743982 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/17-00:52:38.743983 8651103744 Options.paranoid_file_checks: 0 +2023/08/17-00:52:38.743984 8651103744 Options.force_consistency_checks: 1 +2023/08/17-00:52:38.743984 8651103744 Options.report_bg_io_stats: 0 +2023/08/17-00:52:38.743985 8651103744 Options.ttl: 2592000 +2023/08/17-00:52:38.743986 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/17-00:52:38.743987 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/17-00:52:38.743988 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/17-00:52:38.743989 8651103744 Options.enable_blob_files: false +2023/08/17-00:52:38.743990 8651103744 Options.min_blob_size: 0 +2023/08/17-00:52:38.743991 8651103744 Options.blob_file_size: 268435456 +2023/08/17-00:52:38.743992 8651103744 Options.blob_compression_type: NoCompression +2023/08/17-00:52:38.743993 8651103744 Options.enable_blob_garbage_collection: false +2023/08/17-00:52:38.743994 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/17-00:52:38.743995 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/17-00:52:38.743996 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/17-00:52:38.743997 8651103744 Options.blob_file_starting_level: 0 +2023/08/17-00:52:38.743998 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/17-00:52:38.745133 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000150 succeeded,manifest_file_number is 150, next_file_number is 152, last_sequence is 34906, log_number is 145,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 145 +2023/08/17-00:52:38.745137 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 145 +2023/08/17-00:52:38.745183 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/17-00:52:38.745395 8651103744 EVENT_LOG_v1 {"time_micros": 1692201158745389, "job": 1, "event": "recovery_started", "wal_files": [149]} +2023/08/17-00:52:38.745398 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #149 mode 2 +2023/08/17-00:52:38.755016 8651103744 EVENT_LOG_v1 {"time_micros": 1692201158754989, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 153, "file_size": 67504, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 34907, "largest_seqno": 36349, "table_properties": {"data_size": 66084, "index_size": 854, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 65416, "raw_average_key_size": 45, "raw_value_size": 70461, "raw_average_value_size": 48, "num_data_blocks": 27, "num_entries": 1443, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692201158, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "OX1MKEDLSPP1V3PREWEM", "orig_file_number": 153, "seqno_to_time_mapping": "N/A"}} +2023/08/17-00:52:38.755110 8651103744 EVENT_LOG_v1 {"time_micros": 1692201158755108, "job": 1, "event": "recovery_finished"} +2023/08/17-00:52:38.755250 8651103744 [db/version_set.cc:5180] Creating manifest 155 +2023/08/17-00:52:38.758054 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000149.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/17-00:52:38.758100 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x149e0ab10 +2023/08/17-00:52:38.758187 8651103744 DB pointer 0x14a808200 +2023/08/17-00:52:38.758452 6169882624 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/17-00:52:38.758455 6169882624 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 3/0 340.18 KB 0.8 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 18.5 0.00 0.00 1 0.003 0 0 0.0 0.0 + L1 1/0 1.26 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 4/0 1.60 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 18.5 0.00 0.00 1 0.003 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 18.5 0.00 0.00 1 0.003 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.5 0.00 0.00 1 0.003 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 4.39 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 4.39 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000027f86d8#5712 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 4e-05 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692201634076738 b/rust/hyperlane_db/LOG.old.1692201634076738 new file mode 100644 index 0000000000..8ae874c558 --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692201634076738 @@ -0,0 +1,304 @@ +2023/08/17-00:56:40.367123 8651103744 RocksDB version: 8.1.1 +2023/08/17-00:56:40.367748 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/17-00:56:40.367750 8651103744 DB SUMMARY +2023/08/17-00:56:40.367751 8651103744 DB Session ID: I619BZ3044XM4L1BC529 +2023/08/17-00:56:40.367849 8651103744 CURRENT file: CURRENT +2023/08/17-00:56:40.367851 8651103744 IDENTITY file: IDENTITY +2023/08/17-00:56:40.367865 8651103744 MANIFEST file: MANIFEST-000155 size: 814 Bytes +2023/08/17-00:56:40.367882 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 4, files: 000140.sst 000143.sst 000148.sst 000153.sst +2023/08/17-00:56:40.367884 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000154.log size: 248116 ; +2023/08/17-00:56:40.367886 8651103744 Options.error_if_exists: 0 +2023/08/17-00:56:40.367887 8651103744 Options.create_if_missing: 1 +2023/08/17-00:56:40.367888 8651103744 Options.paranoid_checks: 1 +2023/08/17-00:56:40.367889 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/17-00:56:40.367890 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/17-00:56:40.367891 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/17-00:56:40.367892 8651103744 Options.env: 0x10541d6e0 +2023/08/17-00:56:40.367893 8651103744 Options.fs: PosixFileSystem +2023/08/17-00:56:40.367894 8651103744 Options.info_log: 0x15c004098 +2023/08/17-00:56:40.367895 8651103744 Options.max_file_opening_threads: 16 +2023/08/17-00:56:40.367896 8651103744 Options.statistics: 0x0 +2023/08/17-00:56:40.367897 8651103744 Options.use_fsync: 0 +2023/08/17-00:56:40.367898 8651103744 Options.max_log_file_size: 0 +2023/08/17-00:56:40.367899 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/17-00:56:40.367900 8651103744 Options.log_file_time_to_roll: 0 +2023/08/17-00:56:40.367901 8651103744 Options.keep_log_file_num: 1000 +2023/08/17-00:56:40.367902 8651103744 Options.recycle_log_file_num: 0 +2023/08/17-00:56:40.367903 8651103744 Options.allow_fallocate: 1 +2023/08/17-00:56:40.367904 8651103744 Options.allow_mmap_reads: 0 +2023/08/17-00:56:40.367905 8651103744 Options.allow_mmap_writes: 0 +2023/08/17-00:56:40.367906 8651103744 Options.use_direct_reads: 0 +2023/08/17-00:56:40.367907 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/17-00:56:40.367908 8651103744 Options.create_missing_column_families: 0 +2023/08/17-00:56:40.367909 8651103744 Options.db_log_dir: +2023/08/17-00:56:40.367910 8651103744 Options.wal_dir: +2023/08/17-00:56:40.367911 8651103744 Options.table_cache_numshardbits: 6 +2023/08/17-00:56:40.367911 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/17-00:56:40.367912 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/17-00:56:40.367913 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/17-00:56:40.367914 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/17-00:56:40.367915 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/17-00:56:40.367916 8651103744 Options.advise_random_on_open: 1 +2023/08/17-00:56:40.367917 8651103744 Options.db_write_buffer_size: 0 +2023/08/17-00:56:40.367918 8651103744 Options.write_buffer_manager: 0x600003a6c000 +2023/08/17-00:56:40.367919 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/17-00:56:40.367920 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/17-00:56:40.367921 8651103744 Options.use_adaptive_mutex: 0 +2023/08/17-00:56:40.367922 8651103744 Options.rate_limiter: 0x0 +2023/08/17-00:56:40.367923 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/17-00:56:40.367924 8651103744 Options.wal_recovery_mode: 2 +2023/08/17-00:56:40.367925 8651103744 Options.enable_thread_tracking: 0 +2023/08/17-00:56:40.367926 8651103744 Options.enable_pipelined_write: 0 +2023/08/17-00:56:40.367927 8651103744 Options.unordered_write: 0 +2023/08/17-00:56:40.367928 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/17-00:56:40.367929 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/17-00:56:40.367929 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/17-00:56:40.367930 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/17-00:56:40.367931 8651103744 Options.row_cache: None +2023/08/17-00:56:40.367932 8651103744 Options.wal_filter: None +2023/08/17-00:56:40.367933 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/17-00:56:40.367934 8651103744 Options.allow_ingest_behind: 0 +2023/08/17-00:56:40.367935 8651103744 Options.two_write_queues: 0 +2023/08/17-00:56:40.367936 8651103744 Options.manual_wal_flush: 0 +2023/08/17-00:56:40.367937 8651103744 Options.wal_compression: 0 +2023/08/17-00:56:40.367938 8651103744 Options.atomic_flush: 0 +2023/08/17-00:56:40.367939 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/17-00:56:40.367940 8651103744 Options.persist_stats_to_disk: 0 +2023/08/17-00:56:40.367941 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/17-00:56:40.367942 8651103744 Options.log_readahead_size: 0 +2023/08/17-00:56:40.367943 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/17-00:56:40.367944 8651103744 Options.best_efforts_recovery: 0 +2023/08/17-00:56:40.367945 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/17-00:56:40.367946 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/17-00:56:40.367947 8651103744 Options.allow_data_in_errors: 0 +2023/08/17-00:56:40.367948 8651103744 Options.db_host_id: __hostname__ +2023/08/17-00:56:40.367949 8651103744 Options.enforce_single_del_contracts: true +2023/08/17-00:56:40.367950 8651103744 Options.max_background_jobs: 2 +2023/08/17-00:56:40.367951 8651103744 Options.max_background_compactions: -1 +2023/08/17-00:56:40.367952 8651103744 Options.max_subcompactions: 1 +2023/08/17-00:56:40.367953 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/17-00:56:40.367953 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/17-00:56:40.367954 8651103744 Options.delayed_write_rate : 16777216 +2023/08/17-00:56:40.367955 8651103744 Options.max_total_wal_size: 0 +2023/08/17-00:56:40.367956 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/17-00:56:40.367957 8651103744 Options.stats_dump_period_sec: 600 +2023/08/17-00:56:40.367958 8651103744 Options.stats_persist_period_sec: 600 +2023/08/17-00:56:40.367959 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/17-00:56:40.367960 8651103744 Options.max_open_files: -1 +2023/08/17-00:56:40.367961 8651103744 Options.bytes_per_sync: 0 +2023/08/17-00:56:40.367962 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/17-00:56:40.367963 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/17-00:56:40.367964 8651103744 Options.compaction_readahead_size: 0 +2023/08/17-00:56:40.367965 8651103744 Options.max_background_flushes: -1 +2023/08/17-00:56:40.367966 8651103744 Compression algorithms supported: +2023/08/17-00:56:40.367979 8651103744 kZSTD supported: 1 +2023/08/17-00:56:40.367980 8651103744 kZlibCompression supported: 1 +2023/08/17-00:56:40.367981 8651103744 kXpressCompression supported: 0 +2023/08/17-00:56:40.367982 8651103744 kSnappyCompression supported: 1 +2023/08/17-00:56:40.367984 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/17-00:56:40.367985 8651103744 kLZ4HCCompression supported: 1 +2023/08/17-00:56:40.367986 8651103744 kLZ4Compression supported: 1 +2023/08/17-00:56:40.367987 8651103744 kBZip2Compression supported: 1 +2023/08/17-00:56:40.367992 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/17-00:56:40.367993 8651103744 DMutex implementation: pthread_mutex_t +2023/08/17-00:56:40.368249 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000155 +2023/08/17-00:56:40.368470 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/17-00:56:40.368473 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/17-00:56:40.368474 8651103744 Options.merge_operator: None +2023/08/17-00:56:40.368475 8651103744 Options.compaction_filter: None +2023/08/17-00:56:40.368476 8651103744 Options.compaction_filter_factory: None +2023/08/17-00:56:40.368477 8651103744 Options.sst_partitioner_factory: None +2023/08/17-00:56:40.368478 8651103744 Options.memtable_factory: SkipListFactory +2023/08/17-00:56:40.368479 8651103744 Options.table_factory: BlockBasedTable +2023/08/17-00:56:40.368491 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x60000016c220) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000034600d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/17-00:56:40.368492 8651103744 Options.write_buffer_size: 67108864 +2023/08/17-00:56:40.368493 8651103744 Options.max_write_buffer_number: 2 +2023/08/17-00:56:40.368495 8651103744 Options.compression: Snappy +2023/08/17-00:56:40.368496 8651103744 Options.bottommost_compression: Disabled +2023/08/17-00:56:40.368497 8651103744 Options.prefix_extractor: nullptr +2023/08/17-00:56:40.368498 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/17-00:56:40.368499 8651103744 Options.num_levels: 7 +2023/08/17-00:56:40.368500 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/17-00:56:40.368500 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/17-00:56:40.368501 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/17-00:56:40.368502 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/17-00:56:40.368503 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/17-00:56:40.368504 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/17-00:56:40.368505 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/17-00:56:40.368506 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/17-00:56:40.368507 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/17-00:56:40.368508 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/17-00:56:40.368509 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/17-00:56:40.368510 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/17-00:56:40.368511 8651103744 Options.compression_opts.window_bits: -14 +2023/08/17-00:56:40.368512 8651103744 Options.compression_opts.level: 32767 +2023/08/17-00:56:40.368513 8651103744 Options.compression_opts.strategy: 0 +2023/08/17-00:56:40.368514 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/17-00:56:40.368515 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/17-00:56:40.368516 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/17-00:56:40.368517 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/17-00:56:40.368518 8651103744 Options.compression_opts.enabled: false +2023/08/17-00:56:40.368519 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/17-00:56:40.368520 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/17-00:56:40.368521 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/17-00:56:40.368522 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/17-00:56:40.368523 8651103744 Options.target_file_size_base: 67108864 +2023/08/17-00:56:40.368524 8651103744 Options.target_file_size_multiplier: 1 +2023/08/17-00:56:40.368524 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/17-00:56:40.368525 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/17-00:56:40.368526 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/17-00:56:40.368527 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/17-00:56:40.368528 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/17-00:56:40.368530 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/17-00:56:40.368530 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/17-00:56:40.368531 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/17-00:56:40.368532 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/17-00:56:40.368533 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/17-00:56:40.368534 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/17-00:56:40.368535 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/17-00:56:40.368536 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/17-00:56:40.368537 8651103744 Options.arena_block_size: 1048576 +2023/08/17-00:56:40.368538 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/17-00:56:40.368539 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/17-00:56:40.368540 8651103744 Options.disable_auto_compactions: 0 +2023/08/17-00:56:40.368542 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/17-00:56:40.368543 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/17-00:56:40.368544 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/17-00:56:40.368545 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/17-00:56:40.368546 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/17-00:56:40.368547 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/17-00:56:40.368548 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/17-00:56:40.368551 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/17-00:56:40.368552 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/17-00:56:40.368553 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/17-00:56:40.368555 8651103744 Options.table_properties_collectors: +2023/08/17-00:56:40.368556 8651103744 Options.inplace_update_support: 0 +2023/08/17-00:56:40.368557 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/17-00:56:40.368558 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/17-00:56:40.368559 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/17-00:56:40.368560 8651103744 Options.memtable_huge_page_size: 0 +2023/08/17-00:56:40.368561 8651103744 Options.bloom_locality: 0 +2023/08/17-00:56:40.368562 8651103744 Options.max_successive_merges: 0 +2023/08/17-00:56:40.368563 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/17-00:56:40.368563 8651103744 Options.paranoid_file_checks: 0 +2023/08/17-00:56:40.368564 8651103744 Options.force_consistency_checks: 1 +2023/08/17-00:56:40.368565 8651103744 Options.report_bg_io_stats: 0 +2023/08/17-00:56:40.368566 8651103744 Options.ttl: 2592000 +2023/08/17-00:56:40.368567 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/17-00:56:40.368568 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/17-00:56:40.368569 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/17-00:56:40.368570 8651103744 Options.enable_blob_files: false +2023/08/17-00:56:40.368571 8651103744 Options.min_blob_size: 0 +2023/08/17-00:56:40.368572 8651103744 Options.blob_file_size: 268435456 +2023/08/17-00:56:40.368573 8651103744 Options.blob_compression_type: NoCompression +2023/08/17-00:56:40.368574 8651103744 Options.enable_blob_garbage_collection: false +2023/08/17-00:56:40.368575 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/17-00:56:40.368576 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/17-00:56:40.368577 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/17-00:56:40.368578 8651103744 Options.blob_file_starting_level: 0 +2023/08/17-00:56:40.368579 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/17-00:56:40.369876 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000155 succeeded,manifest_file_number is 155, next_file_number is 157, last_sequence is 36349, log_number is 150,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 150 +2023/08/17-00:56:40.369879 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 150 +2023/08/17-00:56:40.370078 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/17-00:56:40.370272 8651103744 EVENT_LOG_v1 {"time_micros": 1692201400370267, "job": 1, "event": "recovery_started", "wal_files": [154]} +2023/08/17-00:56:40.370275 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #154 mode 2 +2023/08/17-00:56:40.384439 8651103744 EVENT_LOG_v1 {"time_micros": 1692201400384417, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 158, "file_size": 104184, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 36350, "largest_seqno": 38541, "table_properties": {"data_size": 102538, "index_size": 1395, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 99382, "raw_average_key_size": 45, "raw_value_size": 117889, "raw_average_value_size": 53, "num_data_blocks": 43, "num_entries": 2192, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692201400, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "I619BZ3044XM4L1BC529", "orig_file_number": 158, "seqno_to_time_mapping": "N/A"}} +2023/08/17-00:56:40.384513 8651103744 EVENT_LOG_v1 {"time_micros": 1692201400384511, "job": 1, "event": "recovery_finished"} +2023/08/17-00:56:40.384639 8651103744 [db/version_set.cc:5180] Creating manifest 160 +2023/08/17-00:56:40.387235 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000154.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/17-00:56:40.387304 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x15c0041f0 +2023/08/17-00:56:40.387408 8651103744 DB pointer 0x15b808800 +2023/08/17-00:56:40.387430 6166163456 [db/compaction/compaction_job.cc:1988] [default] [JOB 3] Compacting 4@0 + 1@1 files to L1, score 1.00 +2023/08/17-00:56:40.387438 6166163456 [db/compaction/compaction_job.cc:1992] [default]: Compaction start summary: Base version 2 Base level 0, inputs: [158(101KB) 153(65KB) 148(144KB) 143(129KB)], [140(1295KB)] +2023/08/17-00:56:40.387448 6166163456 EVENT_LOG_v1 {"time_micros": 1692201400387440, "job": 3, "event": "compaction_started", "compaction_reason": "LevelL0FilesNum", "files_L0": [158, 153, 148, 143], "files_L1": [140], "score": 1, "input_data_size": 1778782, "oldest_snapshot_seqno": -1} +2023/08/17-00:56:40.387629 6167310336 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/17-00:56:40.387676 6167310336 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 4/4 441.92 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 23.4 0.00 0.00 1 0.004 0 0 0.0 0.0 + L1 1/1 1.26 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 5/5 1.70 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 23.4 0.00 0.00 1 0.004 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 23.4 0.00 0.00 1 0.004 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.4 0.00 0.00 1 0.004 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 5.18 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 5.18 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000034600d8#5832 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 4.4e-05 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** +2023/08/17-00:56:40.477749 6166163456 [db/compaction/compaction_job.cc:1592] [default] [JOB 3] Generated table #163: 37769 keys, 1777971 bytes, temperature: kUnknown +2023/08/17-00:56:40.477786 6166163456 EVENT_LOG_v1 {"time_micros": 1692201400477763, "cf_name": "default", "job": 3, "event": "table_file_creation", "file_number": 163, "file_size": 1777971, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 0, "largest_seqno": 0, "table_properties": {"data_size": 1765921, "index_size": 34071, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 2514551, "raw_average_key_size": 66, "raw_value_size": 1843916, "raw_average_value_size": 48, "num_data_blocks": 784, "num_entries": 37769, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692109142, "oldest_key_time": 0, "file_creation_time": 1692201400, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "I619BZ3044XM4L1BC529", "orig_file_number": 163, "seqno_to_time_mapping": "N/A"}} +2023/08/17-00:56:40.478377 6166163456 (Original Log Time 2023/08/17-00:56:40.478095) [db/compaction/compaction_job.cc:1663] [default] [JOB 3] Compacted 4@0 + 1@1 files to L1 => 1777971 bytes +2023/08/17-00:56:40.478379 6166163456 (Original Log Time 2023/08/17-00:56:40.478287) [db/compaction/compaction_job.cc:885] [default] compacted to: files[0 1 0 0 0 0 0] max score 0.01, MB/sec: 19.7 rd, 19.7 wr, level 1, files in(4, 1) out(1 +0 blob) MB in(0.4, 1.3 +0.0 blob) out(1.7 +0.0 blob), read-write-amplify(7.9) write-amplify(3.9) OK, records in: 37773, records dropped: 4 output_compression: Snappy +2023/08/17-00:56:40.478381 6166163456 (Original Log Time 2023/08/17-00:56:40.478308) EVENT_LOG_v1 {"time_micros": 1692201400478292, "job": 3, "event": "compaction_finished", "compaction_time_micros": 90417, "compaction_time_cpu_micros": 89454, "output_level": 1, "num_output_files": 1, "total_output_size": 1777971, "num_input_records": 37773, "num_output_records": 37769, "num_subcompactions": 1, "output_compression": "Snappy", "num_single_delete_mismatches": 0, "num_single_delete_fallthrough": 0, "lsm_state": [0, 1, 0, 0, 0, 0, 0]} +2023/08/17-00:56:40.478475 6166163456 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000158.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/17-00:56:40.478481 6166163456 EVENT_LOG_v1 {"time_micros": 1692201400478479, "job": 3, "event": "table_file_deletion", "file_number": 158} +2023/08/17-00:56:40.478543 6166163456 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000153.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/17-00:56:40.478547 6166163456 EVENT_LOG_v1 {"time_micros": 1692201400478545, "job": 3, "event": "table_file_deletion", "file_number": 153} +2023/08/17-00:56:40.478600 6166163456 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000148.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/17-00:56:40.478604 6166163456 EVENT_LOG_v1 {"time_micros": 1692201400478603, "job": 3, "event": "table_file_deletion", "file_number": 148} +2023/08/17-00:56:40.478660 6166163456 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000143.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/17-00:56:40.478663 6166163456 EVENT_LOG_v1 {"time_micros": 1692201400478662, "job": 3, "event": "table_file_deletion", "file_number": 143} +2023/08/17-00:56:40.478732 6166163456 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000140.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/17-00:56:40.478735 6166163456 EVENT_LOG_v1 {"time_micros": 1692201400478734, "job": 3, "event": "table_file_deletion", "file_number": 140} diff --git a/rust/hyperlane_db/LOG.old.1692252384108942 b/rust/hyperlane_db/LOG.old.1692252384108942 new file mode 100644 index 0000000000..a084653d25 --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692252384108942 @@ -0,0 +1,286 @@ +2023/08/17-01:00:34.077422 8651103744 RocksDB version: 8.1.1 +2023/08/17-01:00:34.077861 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/17-01:00:34.077863 8651103744 DB SUMMARY +2023/08/17-01:00:34.077864 8651103744 DB Session ID: 0F8HEMW6ECBNV1ELQ4RP +2023/08/17-01:00:34.077949 8651103744 CURRENT file: CURRENT +2023/08/17-01:00:34.077951 8651103744 IDENTITY file: IDENTITY +2023/08/17-01:00:34.077965 8651103744 MANIFEST file: MANIFEST-000160 size: 1200 Bytes +2023/08/17-01:00:34.077978 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 1, files: 000163.sst +2023/08/17-01:00:34.077979 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000159.log size: 103252 ; +2023/08/17-01:00:34.077981 8651103744 Options.error_if_exists: 0 +2023/08/17-01:00:34.077982 8651103744 Options.create_if_missing: 1 +2023/08/17-01:00:34.077983 8651103744 Options.paranoid_checks: 1 +2023/08/17-01:00:34.077984 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/17-01:00:34.077985 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/17-01:00:34.077986 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/17-01:00:34.077987 8651103744 Options.env: 0x104ef96e0 +2023/08/17-01:00:34.077988 8651103744 Options.fs: PosixFileSystem +2023/08/17-01:00:34.077989 8651103744 Options.info_log: 0x13660a738 +2023/08/17-01:00:34.077990 8651103744 Options.max_file_opening_threads: 16 +2023/08/17-01:00:34.077990 8651103744 Options.statistics: 0x0 +2023/08/17-01:00:34.077991 8651103744 Options.use_fsync: 0 +2023/08/17-01:00:34.077992 8651103744 Options.max_log_file_size: 0 +2023/08/17-01:00:34.077993 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/17-01:00:34.077994 8651103744 Options.log_file_time_to_roll: 0 +2023/08/17-01:00:34.077995 8651103744 Options.keep_log_file_num: 1000 +2023/08/17-01:00:34.077996 8651103744 Options.recycle_log_file_num: 0 +2023/08/17-01:00:34.077997 8651103744 Options.allow_fallocate: 1 +2023/08/17-01:00:34.077998 8651103744 Options.allow_mmap_reads: 0 +2023/08/17-01:00:34.077999 8651103744 Options.allow_mmap_writes: 0 +2023/08/17-01:00:34.077999 8651103744 Options.use_direct_reads: 0 +2023/08/17-01:00:34.078000 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/17-01:00:34.078001 8651103744 Options.create_missing_column_families: 0 +2023/08/17-01:00:34.078002 8651103744 Options.db_log_dir: +2023/08/17-01:00:34.078003 8651103744 Options.wal_dir: +2023/08/17-01:00:34.078004 8651103744 Options.table_cache_numshardbits: 6 +2023/08/17-01:00:34.078004 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/17-01:00:34.078005 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/17-01:00:34.078006 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/17-01:00:34.078007 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/17-01:00:34.078008 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/17-01:00:34.078009 8651103744 Options.advise_random_on_open: 1 +2023/08/17-01:00:34.078010 8651103744 Options.db_write_buffer_size: 0 +2023/08/17-01:00:34.078011 8651103744 Options.write_buffer_manager: 0x6000039e9380 +2023/08/17-01:00:34.078011 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/17-01:00:34.078012 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/17-01:00:34.078013 8651103744 Options.use_adaptive_mutex: 0 +2023/08/17-01:00:34.078014 8651103744 Options.rate_limiter: 0x0 +2023/08/17-01:00:34.078015 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/17-01:00:34.078016 8651103744 Options.wal_recovery_mode: 2 +2023/08/17-01:00:34.078017 8651103744 Options.enable_thread_tracking: 0 +2023/08/17-01:00:34.078018 8651103744 Options.enable_pipelined_write: 0 +2023/08/17-01:00:34.078018 8651103744 Options.unordered_write: 0 +2023/08/17-01:00:34.078019 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/17-01:00:34.078020 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/17-01:00:34.078021 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/17-01:00:34.078022 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/17-01:00:34.078023 8651103744 Options.row_cache: None +2023/08/17-01:00:34.078024 8651103744 Options.wal_filter: None +2023/08/17-01:00:34.078025 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/17-01:00:34.078026 8651103744 Options.allow_ingest_behind: 0 +2023/08/17-01:00:34.078026 8651103744 Options.two_write_queues: 0 +2023/08/17-01:00:34.078027 8651103744 Options.manual_wal_flush: 0 +2023/08/17-01:00:34.078028 8651103744 Options.wal_compression: 0 +2023/08/17-01:00:34.078029 8651103744 Options.atomic_flush: 0 +2023/08/17-01:00:34.078030 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/17-01:00:34.078031 8651103744 Options.persist_stats_to_disk: 0 +2023/08/17-01:00:34.078032 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/17-01:00:34.078032 8651103744 Options.log_readahead_size: 0 +2023/08/17-01:00:34.078033 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/17-01:00:34.078034 8651103744 Options.best_efforts_recovery: 0 +2023/08/17-01:00:34.078035 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/17-01:00:34.078036 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/17-01:00:34.078037 8651103744 Options.allow_data_in_errors: 0 +2023/08/17-01:00:34.078038 8651103744 Options.db_host_id: __hostname__ +2023/08/17-01:00:34.078039 8651103744 Options.enforce_single_del_contracts: true +2023/08/17-01:00:34.078040 8651103744 Options.max_background_jobs: 2 +2023/08/17-01:00:34.078041 8651103744 Options.max_background_compactions: -1 +2023/08/17-01:00:34.078041 8651103744 Options.max_subcompactions: 1 +2023/08/17-01:00:34.078042 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/17-01:00:34.078043 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/17-01:00:34.078044 8651103744 Options.delayed_write_rate : 16777216 +2023/08/17-01:00:34.078045 8651103744 Options.max_total_wal_size: 0 +2023/08/17-01:00:34.078046 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/17-01:00:34.078047 8651103744 Options.stats_dump_period_sec: 600 +2023/08/17-01:00:34.078048 8651103744 Options.stats_persist_period_sec: 600 +2023/08/17-01:00:34.078049 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/17-01:00:34.078049 8651103744 Options.max_open_files: -1 +2023/08/17-01:00:34.078050 8651103744 Options.bytes_per_sync: 0 +2023/08/17-01:00:34.078051 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/17-01:00:34.078052 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/17-01:00:34.078053 8651103744 Options.compaction_readahead_size: 0 +2023/08/17-01:00:34.078054 8651103744 Options.max_background_flushes: -1 +2023/08/17-01:00:34.078055 8651103744 Compression algorithms supported: +2023/08/17-01:00:34.078067 8651103744 kZSTD supported: 1 +2023/08/17-01:00:34.078068 8651103744 kZlibCompression supported: 1 +2023/08/17-01:00:34.078069 8651103744 kXpressCompression supported: 0 +2023/08/17-01:00:34.078070 8651103744 kSnappyCompression supported: 1 +2023/08/17-01:00:34.078071 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/17-01:00:34.078072 8651103744 kLZ4HCCompression supported: 1 +2023/08/17-01:00:34.078073 8651103744 kLZ4Compression supported: 1 +2023/08/17-01:00:34.078074 8651103744 kBZip2Compression supported: 1 +2023/08/17-01:00:34.078079 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/17-01:00:34.078080 8651103744 DMutex implementation: pthread_mutex_t +2023/08/17-01:00:34.078182 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000160 +2023/08/17-01:00:34.078394 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/17-01:00:34.078396 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/17-01:00:34.078396 8651103744 Options.merge_operator: None +2023/08/17-01:00:34.078397 8651103744 Options.compaction_filter: None +2023/08/17-01:00:34.078398 8651103744 Options.compaction_filter_factory: None +2023/08/17-01:00:34.078399 8651103744 Options.sst_partitioner_factory: None +2023/08/17-01:00:34.078400 8651103744 Options.memtable_factory: SkipListFactory +2023/08/17-01:00:34.078401 8651103744 Options.table_factory: BlockBasedTable +2023/08/17-01:00:34.078413 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x6000002e4640) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000037e86d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/17-01:00:34.078414 8651103744 Options.write_buffer_size: 67108864 +2023/08/17-01:00:34.078415 8651103744 Options.max_write_buffer_number: 2 +2023/08/17-01:00:34.078416 8651103744 Options.compression: Snappy +2023/08/17-01:00:34.078417 8651103744 Options.bottommost_compression: Disabled +2023/08/17-01:00:34.078418 8651103744 Options.prefix_extractor: nullptr +2023/08/17-01:00:34.078419 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/17-01:00:34.078420 8651103744 Options.num_levels: 7 +2023/08/17-01:00:34.078421 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/17-01:00:34.078422 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/17-01:00:34.078423 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/17-01:00:34.078423 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/17-01:00:34.078424 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/17-01:00:34.078425 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/17-01:00:34.078426 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/17-01:00:34.078427 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/17-01:00:34.078428 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/17-01:00:34.078429 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/17-01:00:34.078430 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/17-01:00:34.078431 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/17-01:00:34.078431 8651103744 Options.compression_opts.window_bits: -14 +2023/08/17-01:00:34.078432 8651103744 Options.compression_opts.level: 32767 +2023/08/17-01:00:34.078433 8651103744 Options.compression_opts.strategy: 0 +2023/08/17-01:00:34.078434 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/17-01:00:34.078435 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/17-01:00:34.078436 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/17-01:00:34.078437 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/17-01:00:34.078437 8651103744 Options.compression_opts.enabled: false +2023/08/17-01:00:34.078438 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/17-01:00:34.078439 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/17-01:00:34.078440 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/17-01:00:34.078441 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/17-01:00:34.078442 8651103744 Options.target_file_size_base: 67108864 +2023/08/17-01:00:34.078443 8651103744 Options.target_file_size_multiplier: 1 +2023/08/17-01:00:34.078444 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/17-01:00:34.078444 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/17-01:00:34.078445 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/17-01:00:34.078446 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/17-01:00:34.078447 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/17-01:00:34.078448 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/17-01:00:34.078449 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/17-01:00:34.078450 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/17-01:00:34.078451 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/17-01:00:34.078452 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/17-01:00:34.078452 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/17-01:00:34.078453 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/17-01:00:34.078454 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/17-01:00:34.078455 8651103744 Options.arena_block_size: 1048576 +2023/08/17-01:00:34.078456 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/17-01:00:34.078457 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/17-01:00:34.078458 8651103744 Options.disable_auto_compactions: 0 +2023/08/17-01:00:34.078459 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/17-01:00:34.078461 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/17-01:00:34.078461 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/17-01:00:34.078462 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/17-01:00:34.078463 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/17-01:00:34.078464 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/17-01:00:34.078465 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/17-01:00:34.078468 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/17-01:00:34.078468 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/17-01:00:34.078469 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/17-01:00:34.078471 8651103744 Options.table_properties_collectors: +2023/08/17-01:00:34.078472 8651103744 Options.inplace_update_support: 0 +2023/08/17-01:00:34.078473 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/17-01:00:34.078473 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/17-01:00:34.078474 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/17-01:00:34.078475 8651103744 Options.memtable_huge_page_size: 0 +2023/08/17-01:00:34.078476 8651103744 Options.bloom_locality: 0 +2023/08/17-01:00:34.078477 8651103744 Options.max_successive_merges: 0 +2023/08/17-01:00:34.078478 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/17-01:00:34.078478 8651103744 Options.paranoid_file_checks: 0 +2023/08/17-01:00:34.078479 8651103744 Options.force_consistency_checks: 1 +2023/08/17-01:00:34.078480 8651103744 Options.report_bg_io_stats: 0 +2023/08/17-01:00:34.078481 8651103744 Options.ttl: 2592000 +2023/08/17-01:00:34.078482 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/17-01:00:34.078483 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/17-01:00:34.078483 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/17-01:00:34.078484 8651103744 Options.enable_blob_files: false +2023/08/17-01:00:34.078485 8651103744 Options.min_blob_size: 0 +2023/08/17-01:00:34.078486 8651103744 Options.blob_file_size: 268435456 +2023/08/17-01:00:34.078487 8651103744 Options.blob_compression_type: NoCompression +2023/08/17-01:00:34.078488 8651103744 Options.enable_blob_garbage_collection: false +2023/08/17-01:00:34.078488 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/17-01:00:34.078489 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/17-01:00:34.078490 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/17-01:00:34.078491 8651103744 Options.blob_file_starting_level: 0 +2023/08/17-01:00:34.078492 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/17-01:00:34.079624 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000160 succeeded,manifest_file_number is 160, next_file_number is 165, last_sequence is 38541, log_number is 155,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 155 +2023/08/17-01:00:34.079628 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 155 +2023/08/17-01:00:34.079672 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/17-01:00:34.079857 8651103744 EVENT_LOG_v1 {"time_micros": 1692201634079849, "job": 1, "event": "recovery_started", "wal_files": [159]} +2023/08/17-01:00:34.079860 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #159 mode 2 +2023/08/17-01:00:34.085829 8651103744 EVENT_LOG_v1 {"time_micros": 1692201634085809, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 166, "file_size": 41482, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 38542, "largest_seqno": 39444, "table_properties": {"data_size": 40187, "index_size": 599, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 40936, "raw_average_key_size": 45, "raw_value_size": 49614, "raw_average_value_size": 54, "num_data_blocks": 18, "num_entries": 903, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692201634, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "0F8HEMW6ECBNV1ELQ4RP", "orig_file_number": 166, "seqno_to_time_mapping": "N/A"}} +2023/08/17-01:00:34.085912 8651103744 EVENT_LOG_v1 {"time_micros": 1692201634085910, "job": 1, "event": "recovery_finished"} +2023/08/17-01:00:34.086024 8651103744 [db/version_set.cc:5180] Creating manifest 168 +2023/08/17-01:00:34.088749 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000159.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/17-01:00:34.088808 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x13660a890 +2023/08/17-01:00:34.088890 8651103744 DB pointer 0x136821400 +2023/08/17-01:00:34.089110 6172700672 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/17-01:00:34.089113 6172700672 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 1/0 40.51 KB 0.2 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 16.2 0.00 0.00 1 0.002 0 0 0.0 0.0 + L1 1/0 1.70 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 2/0 1.74 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 16.2 0.00 0.00 1 0.002 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 16.2 0.00 0.00 1 0.002 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.2 0.00 0.00 1 0.002 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 3.68 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 3.68 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000037e86d8#5940 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 5e-05 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692253121310466 b/rust/hyperlane_db/LOG.old.1692253121310466 new file mode 100644 index 0000000000..53a353fb56 --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692253121310466 @@ -0,0 +1,283 @@ +2023/08/17-15:06:24.110139 8651103744 RocksDB version: 8.1.1 +2023/08/17-15:06:24.110636 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/17-15:06:24.110638 8651103744 DB SUMMARY +2023/08/17-15:06:24.110639 8651103744 DB Session ID: 450JOAXFTJ4HW03QQBVF +2023/08/17-15:06:24.110738 8651103744 CURRENT file: CURRENT +2023/08/17-15:06:24.110739 8651103744 IDENTITY file: IDENTITY +2023/08/17-15:06:24.110754 8651103744 MANIFEST file: MANIFEST-000168 size: 486 Bytes +2023/08/17-15:06:24.110768 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 2, files: 000163.sst 000166.sst +2023/08/17-15:06:24.110769 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000167.log size: 0 ; +2023/08/17-15:06:24.110772 8651103744 Options.error_if_exists: 0 +2023/08/17-15:06:24.110773 8651103744 Options.create_if_missing: 1 +2023/08/17-15:06:24.110774 8651103744 Options.paranoid_checks: 1 +2023/08/17-15:06:24.110775 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/17-15:06:24.110776 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/17-15:06:24.110777 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/17-15:06:24.110778 8651103744 Options.env: 0x107ba96e0 +2023/08/17-15:06:24.110779 8651103744 Options.fs: PosixFileSystem +2023/08/17-15:06:24.110780 8651103744 Options.info_log: 0x12cf04098 +2023/08/17-15:06:24.110781 8651103744 Options.max_file_opening_threads: 16 +2023/08/17-15:06:24.110782 8651103744 Options.statistics: 0x0 +2023/08/17-15:06:24.110783 8651103744 Options.use_fsync: 0 +2023/08/17-15:06:24.110784 8651103744 Options.max_log_file_size: 0 +2023/08/17-15:06:24.110785 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/17-15:06:24.110786 8651103744 Options.log_file_time_to_roll: 0 +2023/08/17-15:06:24.110787 8651103744 Options.keep_log_file_num: 1000 +2023/08/17-15:06:24.110788 8651103744 Options.recycle_log_file_num: 0 +2023/08/17-15:06:24.110789 8651103744 Options.allow_fallocate: 1 +2023/08/17-15:06:24.110790 8651103744 Options.allow_mmap_reads: 0 +2023/08/17-15:06:24.110790 8651103744 Options.allow_mmap_writes: 0 +2023/08/17-15:06:24.110791 8651103744 Options.use_direct_reads: 0 +2023/08/17-15:06:24.110792 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/17-15:06:24.110793 8651103744 Options.create_missing_column_families: 0 +2023/08/17-15:06:24.110794 8651103744 Options.db_log_dir: +2023/08/17-15:06:24.110795 8651103744 Options.wal_dir: +2023/08/17-15:06:24.110796 8651103744 Options.table_cache_numshardbits: 6 +2023/08/17-15:06:24.110797 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/17-15:06:24.110798 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/17-15:06:24.110799 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/17-15:06:24.110800 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/17-15:06:24.110801 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/17-15:06:24.110801 8651103744 Options.advise_random_on_open: 1 +2023/08/17-15:06:24.110802 8651103744 Options.db_write_buffer_size: 0 +2023/08/17-15:06:24.110803 8651103744 Options.write_buffer_manager: 0x6000027b0000 +2023/08/17-15:06:24.110804 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/17-15:06:24.110805 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/17-15:06:24.110806 8651103744 Options.use_adaptive_mutex: 0 +2023/08/17-15:06:24.110807 8651103744 Options.rate_limiter: 0x0 +2023/08/17-15:06:24.110808 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/17-15:06:24.110809 8651103744 Options.wal_recovery_mode: 2 +2023/08/17-15:06:24.110810 8651103744 Options.enable_thread_tracking: 0 +2023/08/17-15:06:24.110811 8651103744 Options.enable_pipelined_write: 0 +2023/08/17-15:06:24.110812 8651103744 Options.unordered_write: 0 +2023/08/17-15:06:24.110813 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/17-15:06:24.110814 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/17-15:06:24.110814 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/17-15:06:24.110815 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/17-15:06:24.110816 8651103744 Options.row_cache: None +2023/08/17-15:06:24.110817 8651103744 Options.wal_filter: None +2023/08/17-15:06:24.110818 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/17-15:06:24.110819 8651103744 Options.allow_ingest_behind: 0 +2023/08/17-15:06:24.110820 8651103744 Options.two_write_queues: 0 +2023/08/17-15:06:24.110821 8651103744 Options.manual_wal_flush: 0 +2023/08/17-15:06:24.110822 8651103744 Options.wal_compression: 0 +2023/08/17-15:06:24.110823 8651103744 Options.atomic_flush: 0 +2023/08/17-15:06:24.110824 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/17-15:06:24.110825 8651103744 Options.persist_stats_to_disk: 0 +2023/08/17-15:06:24.110826 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/17-15:06:24.110827 8651103744 Options.log_readahead_size: 0 +2023/08/17-15:06:24.110828 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/17-15:06:24.110829 8651103744 Options.best_efforts_recovery: 0 +2023/08/17-15:06:24.110830 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/17-15:06:24.110831 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/17-15:06:24.110832 8651103744 Options.allow_data_in_errors: 0 +2023/08/17-15:06:24.110833 8651103744 Options.db_host_id: __hostname__ +2023/08/17-15:06:24.110834 8651103744 Options.enforce_single_del_contracts: true +2023/08/17-15:06:24.110835 8651103744 Options.max_background_jobs: 2 +2023/08/17-15:06:24.110836 8651103744 Options.max_background_compactions: -1 +2023/08/17-15:06:24.110837 8651103744 Options.max_subcompactions: 1 +2023/08/17-15:06:24.110838 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/17-15:06:24.110838 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/17-15:06:24.110839 8651103744 Options.delayed_write_rate : 16777216 +2023/08/17-15:06:24.110840 8651103744 Options.max_total_wal_size: 0 +2023/08/17-15:06:24.110841 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/17-15:06:24.110842 8651103744 Options.stats_dump_period_sec: 600 +2023/08/17-15:06:24.110843 8651103744 Options.stats_persist_period_sec: 600 +2023/08/17-15:06:24.110844 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/17-15:06:24.110845 8651103744 Options.max_open_files: -1 +2023/08/17-15:06:24.110846 8651103744 Options.bytes_per_sync: 0 +2023/08/17-15:06:24.110847 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/17-15:06:24.110848 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/17-15:06:24.110849 8651103744 Options.compaction_readahead_size: 0 +2023/08/17-15:06:24.110850 8651103744 Options.max_background_flushes: -1 +2023/08/17-15:06:24.110850 8651103744 Compression algorithms supported: +2023/08/17-15:06:24.110864 8651103744 kZSTD supported: 1 +2023/08/17-15:06:24.110865 8651103744 kZlibCompression supported: 1 +2023/08/17-15:06:24.110866 8651103744 kXpressCompression supported: 0 +2023/08/17-15:06:24.110867 8651103744 kSnappyCompression supported: 1 +2023/08/17-15:06:24.110868 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/17-15:06:24.110870 8651103744 kLZ4HCCompression supported: 1 +2023/08/17-15:06:24.110871 8651103744 kLZ4Compression supported: 1 +2023/08/17-15:06:24.110872 8651103744 kBZip2Compression supported: 1 +2023/08/17-15:06:24.110877 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/17-15:06:24.110878 8651103744 DMutex implementation: pthread_mutex_t +2023/08/17-15:06:24.111151 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000168 +2023/08/17-15:06:24.111434 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/17-15:06:24.111436 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/17-15:06:24.111438 8651103744 Options.merge_operator: None +2023/08/17-15:06:24.111439 8651103744 Options.compaction_filter: None +2023/08/17-15:06:24.111440 8651103744 Options.compaction_filter_factory: None +2023/08/17-15:06:24.111441 8651103744 Options.sst_partitioner_factory: None +2023/08/17-15:06:24.111442 8651103744 Options.memtable_factory: SkipListFactory +2023/08/17-15:06:24.111443 8651103744 Options.table_factory: BlockBasedTable +2023/08/17-15:06:24.111471 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600001cb8640) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000029b46d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/17-15:06:24.111473 8651103744 Options.write_buffer_size: 67108864 +2023/08/17-15:06:24.111475 8651103744 Options.max_write_buffer_number: 2 +2023/08/17-15:06:24.111476 8651103744 Options.compression: Snappy +2023/08/17-15:06:24.111477 8651103744 Options.bottommost_compression: Disabled +2023/08/17-15:06:24.111478 8651103744 Options.prefix_extractor: nullptr +2023/08/17-15:06:24.111479 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/17-15:06:24.111480 8651103744 Options.num_levels: 7 +2023/08/17-15:06:24.111481 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/17-15:06:24.111482 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/17-15:06:24.111483 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/17-15:06:24.111484 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/17-15:06:24.111485 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/17-15:06:24.111486 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/17-15:06:24.111487 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/17-15:06:24.111487 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/17-15:06:24.111488 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/17-15:06:24.111489 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/17-15:06:24.111490 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/17-15:06:24.111491 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/17-15:06:24.111492 8651103744 Options.compression_opts.window_bits: -14 +2023/08/17-15:06:24.111493 8651103744 Options.compression_opts.level: 32767 +2023/08/17-15:06:24.111494 8651103744 Options.compression_opts.strategy: 0 +2023/08/17-15:06:24.111495 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/17-15:06:24.111496 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/17-15:06:24.111497 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/17-15:06:24.111498 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/17-15:06:24.111498 8651103744 Options.compression_opts.enabled: false +2023/08/17-15:06:24.111499 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/17-15:06:24.111500 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/17-15:06:24.111501 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/17-15:06:24.111502 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/17-15:06:24.111503 8651103744 Options.target_file_size_base: 67108864 +2023/08/17-15:06:24.111504 8651103744 Options.target_file_size_multiplier: 1 +2023/08/17-15:06:24.111505 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/17-15:06:24.111506 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/17-15:06:24.111507 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/17-15:06:24.111508 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/17-15:06:24.111509 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/17-15:06:24.111510 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/17-15:06:24.111511 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/17-15:06:24.111512 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/17-15:06:24.111512 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/17-15:06:24.111513 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/17-15:06:24.111514 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/17-15:06:24.111515 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/17-15:06:24.111516 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/17-15:06:24.111517 8651103744 Options.arena_block_size: 1048576 +2023/08/17-15:06:24.111518 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/17-15:06:24.111519 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/17-15:06:24.111520 8651103744 Options.disable_auto_compactions: 0 +2023/08/17-15:06:24.111522 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/17-15:06:24.111523 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/17-15:06:24.111524 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/17-15:06:24.111525 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/17-15:06:24.111526 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/17-15:06:24.111527 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/17-15:06:24.111528 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/17-15:06:24.111531 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/17-15:06:24.111532 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/17-15:06:24.111533 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/17-15:06:24.111535 8651103744 Options.table_properties_collectors: +2023/08/17-15:06:24.111536 8651103744 Options.inplace_update_support: 0 +2023/08/17-15:06:24.111537 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/17-15:06:24.111538 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/17-15:06:24.111539 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/17-15:06:24.111540 8651103744 Options.memtable_huge_page_size: 0 +2023/08/17-15:06:24.111541 8651103744 Options.bloom_locality: 0 +2023/08/17-15:06:24.111542 8651103744 Options.max_successive_merges: 0 +2023/08/17-15:06:24.111543 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/17-15:06:24.111544 8651103744 Options.paranoid_file_checks: 0 +2023/08/17-15:06:24.111545 8651103744 Options.force_consistency_checks: 1 +2023/08/17-15:06:24.111545 8651103744 Options.report_bg_io_stats: 0 +2023/08/17-15:06:24.111546 8651103744 Options.ttl: 2592000 +2023/08/17-15:06:24.111547 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/17-15:06:24.111548 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/17-15:06:24.111549 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/17-15:06:24.111550 8651103744 Options.enable_blob_files: false +2023/08/17-15:06:24.111551 8651103744 Options.min_blob_size: 0 +2023/08/17-15:06:24.111552 8651103744 Options.blob_file_size: 268435456 +2023/08/17-15:06:24.111553 8651103744 Options.blob_compression_type: NoCompression +2023/08/17-15:06:24.111554 8651103744 Options.enable_blob_garbage_collection: false +2023/08/17-15:06:24.111555 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/17-15:06:24.111556 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/17-15:06:24.111557 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/17-15:06:24.111558 8651103744 Options.blob_file_starting_level: 0 +2023/08/17-15:06:24.111559 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/17-15:06:24.112835 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000168 succeeded,manifest_file_number is 168, next_file_number is 170, last_sequence is 39444, log_number is 160,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 160 +2023/08/17-15:06:24.112839 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 160 +2023/08/17-15:06:24.113037 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/17-15:06:24.113229 8651103744 EVENT_LOG_v1 {"time_micros": 1692252384113224, "job": 1, "event": "recovery_started", "wal_files": [167]} +2023/08/17-15:06:24.113232 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #167 mode 2 +2023/08/17-15:06:24.113288 8651103744 EVENT_LOG_v1 {"time_micros": 1692252384113286, "job": 1, "event": "recovery_finished"} +2023/08/17-15:06:24.113409 8651103744 [db/version_set.cc:5180] Creating manifest 172 +2023/08/17-15:06:24.116060 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x12ce0aa30 +2023/08/17-15:06:24.116146 8651103744 DB pointer 0x12d808200 +2023/08/17-15:06:24.116347 6125842432 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/17-15:06:24.116350 6125842432 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 1/0 40.51 KB 0.2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + L1 1/0 1.70 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 2/0 1.74 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000029b46d8#10995 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 4.4e-05 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692253194212630 b/rust/hyperlane_db/LOG.old.1692253194212630 new file mode 100644 index 0000000000..e189c5c161 --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692253194212630 @@ -0,0 +1,290 @@ +2023/08/17-15:18:41.311881 8651103744 RocksDB version: 8.1.1 +2023/08/17-15:18:41.312342 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/17-15:18:41.312344 8651103744 DB SUMMARY +2023/08/17-15:18:41.312346 8651103744 DB Session ID: RFCBSQ5TK18711I4RR3B +2023/08/17-15:18:41.312458 8651103744 CURRENT file: CURRENT +2023/08/17-15:18:41.312460 8651103744 IDENTITY file: IDENTITY +2023/08/17-15:18:41.312475 8651103744 MANIFEST file: MANIFEST-000172 size: 467 Bytes +2023/08/17-15:18:41.312492 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 2, files: 000163.sst 000166.sst +2023/08/17-15:18:41.312494 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000167.log size: 0 ; 000171.log size: 238037 ; +2023/08/17-15:18:41.312496 8651103744 Options.error_if_exists: 0 +2023/08/17-15:18:41.312497 8651103744 Options.create_if_missing: 1 +2023/08/17-15:18:41.312498 8651103744 Options.paranoid_checks: 1 +2023/08/17-15:18:41.312499 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/17-15:18:41.312500 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/17-15:18:41.312501 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/17-15:18:41.312502 8651103744 Options.env: 0x1051096e0 +2023/08/17-15:18:41.312503 8651103744 Options.fs: PosixFileSystem +2023/08/17-15:18:41.312504 8651103744 Options.info_log: 0x13c804098 +2023/08/17-15:18:41.312505 8651103744 Options.max_file_opening_threads: 16 +2023/08/17-15:18:41.312506 8651103744 Options.statistics: 0x0 +2023/08/17-15:18:41.312507 8651103744 Options.use_fsync: 0 +2023/08/17-15:18:41.312508 8651103744 Options.max_log_file_size: 0 +2023/08/17-15:18:41.312509 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/17-15:18:41.312509 8651103744 Options.log_file_time_to_roll: 0 +2023/08/17-15:18:41.312510 8651103744 Options.keep_log_file_num: 1000 +2023/08/17-15:18:41.312511 8651103744 Options.recycle_log_file_num: 0 +2023/08/17-15:18:41.312512 8651103744 Options.allow_fallocate: 1 +2023/08/17-15:18:41.312513 8651103744 Options.allow_mmap_reads: 0 +2023/08/17-15:18:41.312514 8651103744 Options.allow_mmap_writes: 0 +2023/08/17-15:18:41.312515 8651103744 Options.use_direct_reads: 0 +2023/08/17-15:18:41.312516 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/17-15:18:41.312517 8651103744 Options.create_missing_column_families: 0 +2023/08/17-15:18:41.312518 8651103744 Options.db_log_dir: +2023/08/17-15:18:41.312519 8651103744 Options.wal_dir: +2023/08/17-15:18:41.312520 8651103744 Options.table_cache_numshardbits: 6 +2023/08/17-15:18:41.312520 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/17-15:18:41.312521 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/17-15:18:41.312522 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/17-15:18:41.312523 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/17-15:18:41.312524 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/17-15:18:41.312525 8651103744 Options.advise_random_on_open: 1 +2023/08/17-15:18:41.312526 8651103744 Options.db_write_buffer_size: 0 +2023/08/17-15:18:41.312527 8651103744 Options.write_buffer_manager: 0x6000009cc000 +2023/08/17-15:18:41.312528 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/17-15:18:41.312529 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/17-15:18:41.312530 8651103744 Options.use_adaptive_mutex: 0 +2023/08/17-15:18:41.312531 8651103744 Options.rate_limiter: 0x0 +2023/08/17-15:18:41.312532 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/17-15:18:41.312533 8651103744 Options.wal_recovery_mode: 2 +2023/08/17-15:18:41.312534 8651103744 Options.enable_thread_tracking: 0 +2023/08/17-15:18:41.312535 8651103744 Options.enable_pipelined_write: 0 +2023/08/17-15:18:41.312536 8651103744 Options.unordered_write: 0 +2023/08/17-15:18:41.312537 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/17-15:18:41.312538 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/17-15:18:41.312539 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/17-15:18:41.312540 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/17-15:18:41.312541 8651103744 Options.row_cache: None +2023/08/17-15:18:41.312541 8651103744 Options.wal_filter: None +2023/08/17-15:18:41.312542 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/17-15:18:41.312544 8651103744 Options.allow_ingest_behind: 0 +2023/08/17-15:18:41.312544 8651103744 Options.two_write_queues: 0 +2023/08/17-15:18:41.312545 8651103744 Options.manual_wal_flush: 0 +2023/08/17-15:18:41.312546 8651103744 Options.wal_compression: 0 +2023/08/17-15:18:41.312547 8651103744 Options.atomic_flush: 0 +2023/08/17-15:18:41.312548 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/17-15:18:41.312549 8651103744 Options.persist_stats_to_disk: 0 +2023/08/17-15:18:41.312550 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/17-15:18:41.312551 8651103744 Options.log_readahead_size: 0 +2023/08/17-15:18:41.312552 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/17-15:18:41.312564 8651103744 Options.best_efforts_recovery: 0 +2023/08/17-15:18:41.312565 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/17-15:18:41.312566 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/17-15:18:41.312567 8651103744 Options.allow_data_in_errors: 0 +2023/08/17-15:18:41.312568 8651103744 Options.db_host_id: __hostname__ +2023/08/17-15:18:41.312569 8651103744 Options.enforce_single_del_contracts: true +2023/08/17-15:18:41.312570 8651103744 Options.max_background_jobs: 2 +2023/08/17-15:18:41.312571 8651103744 Options.max_background_compactions: -1 +2023/08/17-15:18:41.312572 8651103744 Options.max_subcompactions: 1 +2023/08/17-15:18:41.312573 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/17-15:18:41.312574 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/17-15:18:41.312575 8651103744 Options.delayed_write_rate : 16777216 +2023/08/17-15:18:41.312576 8651103744 Options.max_total_wal_size: 0 +2023/08/17-15:18:41.312577 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/17-15:18:41.312578 8651103744 Options.stats_dump_period_sec: 600 +2023/08/17-15:18:41.312579 8651103744 Options.stats_persist_period_sec: 600 +2023/08/17-15:18:41.312580 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/17-15:18:41.312581 8651103744 Options.max_open_files: -1 +2023/08/17-15:18:41.312582 8651103744 Options.bytes_per_sync: 0 +2023/08/17-15:18:41.312583 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/17-15:18:41.312584 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/17-15:18:41.312584 8651103744 Options.compaction_readahead_size: 0 +2023/08/17-15:18:41.312585 8651103744 Options.max_background_flushes: -1 +2023/08/17-15:18:41.312586 8651103744 Compression algorithms supported: +2023/08/17-15:18:41.312600 8651103744 kZSTD supported: 1 +2023/08/17-15:18:41.312601 8651103744 kZlibCompression supported: 1 +2023/08/17-15:18:41.312602 8651103744 kXpressCompression supported: 0 +2023/08/17-15:18:41.312603 8651103744 kSnappyCompression supported: 1 +2023/08/17-15:18:41.312604 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/17-15:18:41.312606 8651103744 kLZ4HCCompression supported: 1 +2023/08/17-15:18:41.312607 8651103744 kLZ4Compression supported: 1 +2023/08/17-15:18:41.312608 8651103744 kBZip2Compression supported: 1 +2023/08/17-15:18:41.312614 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/17-15:18:41.312615 8651103744 DMutex implementation: pthread_mutex_t +2023/08/17-15:18:41.312878 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000172 +2023/08/17-15:18:41.313123 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/17-15:18:41.313125 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/17-15:18:41.313126 8651103744 Options.merge_operator: None +2023/08/17-15:18:41.313127 8651103744 Options.compaction_filter: None +2023/08/17-15:18:41.313128 8651103744 Options.compaction_filter_factory: None +2023/08/17-15:18:41.313129 8651103744 Options.sst_partitioner_factory: None +2023/08/17-15:18:41.313131 8651103744 Options.memtable_factory: SkipListFactory +2023/08/17-15:18:41.313132 8651103744 Options.table_factory: BlockBasedTable +2023/08/17-15:18:41.313144 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x6000032cc640) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000007c00d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/17-15:18:41.313147 8651103744 Options.write_buffer_size: 67108864 +2023/08/17-15:18:41.313148 8651103744 Options.max_write_buffer_number: 2 +2023/08/17-15:18:41.313149 8651103744 Options.compression: Snappy +2023/08/17-15:18:41.313150 8651103744 Options.bottommost_compression: Disabled +2023/08/17-15:18:41.313151 8651103744 Options.prefix_extractor: nullptr +2023/08/17-15:18:41.313152 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/17-15:18:41.313153 8651103744 Options.num_levels: 7 +2023/08/17-15:18:41.313154 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/17-15:18:41.313155 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/17-15:18:41.313156 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/17-15:18:41.313157 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/17-15:18:41.313158 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/17-15:18:41.313159 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/17-15:18:41.313160 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/17-15:18:41.313161 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/17-15:18:41.313162 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/17-15:18:41.313163 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/17-15:18:41.313164 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/17-15:18:41.313165 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/17-15:18:41.313166 8651103744 Options.compression_opts.window_bits: -14 +2023/08/17-15:18:41.313167 8651103744 Options.compression_opts.level: 32767 +2023/08/17-15:18:41.313168 8651103744 Options.compression_opts.strategy: 0 +2023/08/17-15:18:41.313168 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/17-15:18:41.313169 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/17-15:18:41.313170 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/17-15:18:41.313171 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/17-15:18:41.313172 8651103744 Options.compression_opts.enabled: false +2023/08/17-15:18:41.313173 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/17-15:18:41.313174 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/17-15:18:41.313175 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/17-15:18:41.313176 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/17-15:18:41.313177 8651103744 Options.target_file_size_base: 67108864 +2023/08/17-15:18:41.313178 8651103744 Options.target_file_size_multiplier: 1 +2023/08/17-15:18:41.313179 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/17-15:18:41.313180 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/17-15:18:41.313181 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/17-15:18:41.313182 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/17-15:18:41.313183 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/17-15:18:41.313184 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/17-15:18:41.313185 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/17-15:18:41.313186 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/17-15:18:41.313187 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/17-15:18:41.313188 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/17-15:18:41.313189 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/17-15:18:41.313190 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/17-15:18:41.313190 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/17-15:18:41.313191 8651103744 Options.arena_block_size: 1048576 +2023/08/17-15:18:41.313192 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/17-15:18:41.313193 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/17-15:18:41.313194 8651103744 Options.disable_auto_compactions: 0 +2023/08/17-15:18:41.313196 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/17-15:18:41.313197 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/17-15:18:41.313198 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/17-15:18:41.313199 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/17-15:18:41.313200 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/17-15:18:41.313201 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/17-15:18:41.313202 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/17-15:18:41.313205 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/17-15:18:41.313206 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/17-15:18:41.313207 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/17-15:18:41.313209 8651103744 Options.table_properties_collectors: +2023/08/17-15:18:41.313210 8651103744 Options.inplace_update_support: 0 +2023/08/17-15:18:41.313210 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/17-15:18:41.313211 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/17-15:18:41.313212 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/17-15:18:41.313213 8651103744 Options.memtable_huge_page_size: 0 +2023/08/17-15:18:41.313214 8651103744 Options.bloom_locality: 0 +2023/08/17-15:18:41.313215 8651103744 Options.max_successive_merges: 0 +2023/08/17-15:18:41.313216 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/17-15:18:41.313217 8651103744 Options.paranoid_file_checks: 0 +2023/08/17-15:18:41.313218 8651103744 Options.force_consistency_checks: 1 +2023/08/17-15:18:41.313219 8651103744 Options.report_bg_io_stats: 0 +2023/08/17-15:18:41.313220 8651103744 Options.ttl: 2592000 +2023/08/17-15:18:41.313221 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/17-15:18:41.313222 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/17-15:18:41.313222 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/17-15:18:41.313223 8651103744 Options.enable_blob_files: false +2023/08/17-15:18:41.313224 8651103744 Options.min_blob_size: 0 +2023/08/17-15:18:41.313225 8651103744 Options.blob_file_size: 268435456 +2023/08/17-15:18:41.313226 8651103744 Options.blob_compression_type: NoCompression +2023/08/17-15:18:41.313227 8651103744 Options.enable_blob_garbage_collection: false +2023/08/17-15:18:41.313228 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/17-15:18:41.313229 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/17-15:18:41.313230 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/17-15:18:41.313231 8651103744 Options.blob_file_starting_level: 0 +2023/08/17-15:18:41.313232 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/17-15:18:41.314589 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000172 succeeded,manifest_file_number is 172, next_file_number is 174, last_sequence is 39444, log_number is 168,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 160 +2023/08/17-15:18:41.314593 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 168 +2023/08/17-15:18:41.314782 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/17-15:18:41.314973 8651103744 EVENT_LOG_v1 {"time_micros": 1692253121314967, "job": 1, "event": "recovery_started", "wal_files": [167, 171]} +2023/08/17-15:18:41.314975 8651103744 [db/db_impl/db_impl_open.cc:1018] Skipping log #167 since it is older than min log to keep #168 +2023/08/17-15:18:41.314977 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #171 mode 2 +2023/08/17-15:18:41.328018 8651103744 EVENT_LOG_v1 {"time_micros": 1692253121327994, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 175, "file_size": 68671, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 40372, "largest_seqno": 41924, "table_properties": {"data_size": 67219, "index_size": 940, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 70840, "raw_average_key_size": 45, "raw_value_size": 77588, "raw_average_value_size": 50, "num_data_blocks": 29, "num_entries": 1551, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692253121, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "RFCBSQ5TK18711I4RR3B", "orig_file_number": 175, "seqno_to_time_mapping": "N/A"}} +2023/08/17-15:18:41.328106 8651103744 EVENT_LOG_v1 {"time_micros": 1692253121328104, "job": 1, "event": "recovery_finished"} +2023/08/17-15:18:41.328240 8651103744 [db/version_set.cc:5180] Creating manifest 177 +2023/08/17-15:18:41.331619 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000171.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/17-15:18:41.331648 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000167.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/17-15:18:41.331692 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x13c8041f0 +2023/08/17-15:18:41.331778 8651103744 DB pointer 0x13c014600 +2023/08/17-15:18:41.331990 6171258880 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/17-15:18:41.332032 6171258880 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 2/0 107.57 KB 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 19.7 0.00 0.00 1 0.003 0 0 0.0 0.0 + L1 1/0 1.70 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 3/0 1.80 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 19.7 0.00 0.00 1 0.003 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 19.7 0.00 0.00 1 0.003 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.7 0.00 0.00 1 0.003 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 3.47 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 3.47 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000007c00d8#11237 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 4.4e-05 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** +2023/08/17-15:18:53.400483 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work +2023/08/17-15:18:53.401309 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692253295513730 b/rust/hyperlane_db/LOG.old.1692253295513730 new file mode 100644 index 0000000000..2f267fa5c3 --- /dev/null +++ b/rust/hyperlane_db/LOG.old.1692253295513730 @@ -0,0 +1,286 @@ +2023/08/17-15:19:54.213450 8651103744 RocksDB version: 8.1.1 +2023/08/17-15:19:54.214265 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/17-15:19:54.214267 8651103744 DB SUMMARY +2023/08/17-15:19:54.214268 8651103744 DB Session ID: CAF4FDHZKXE1R4IZB8ZG +2023/08/17-15:19:54.214377 8651103744 CURRENT file: CURRENT +2023/08/17-15:19:54.214379 8651103744 IDENTITY file: IDENTITY +2023/08/17-15:19:54.214394 8651103744 MANIFEST file: MANIFEST-000177 size: 676 Bytes +2023/08/17-15:19:54.214408 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 3, files: 000163.sst 000166.sst 000175.sst +2023/08/17-15:19:54.214410 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000176.log size: 47978 ; +2023/08/17-15:19:54.214412 8651103744 Options.error_if_exists: 0 +2023/08/17-15:19:54.214413 8651103744 Options.create_if_missing: 1 +2023/08/17-15:19:54.214414 8651103744 Options.paranoid_checks: 1 +2023/08/17-15:19:54.214415 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/17-15:19:54.214416 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/17-15:19:54.214417 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/17-15:19:54.214418 8651103744 Options.env: 0x109d296e0 +2023/08/17-15:19:54.214419 8651103744 Options.fs: PosixFileSystem +2023/08/17-15:19:54.214420 8651103744 Options.info_log: 0x150704098 +2023/08/17-15:19:54.214421 8651103744 Options.max_file_opening_threads: 16 +2023/08/17-15:19:54.214422 8651103744 Options.statistics: 0x0 +2023/08/17-15:19:54.214423 8651103744 Options.use_fsync: 0 +2023/08/17-15:19:54.214424 8651103744 Options.max_log_file_size: 0 +2023/08/17-15:19:54.214425 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/17-15:19:54.214426 8651103744 Options.log_file_time_to_roll: 0 +2023/08/17-15:19:54.214427 8651103744 Options.keep_log_file_num: 1000 +2023/08/17-15:19:54.214428 8651103744 Options.recycle_log_file_num: 0 +2023/08/17-15:19:54.214429 8651103744 Options.allow_fallocate: 1 +2023/08/17-15:19:54.214430 8651103744 Options.allow_mmap_reads: 0 +2023/08/17-15:19:54.214431 8651103744 Options.allow_mmap_writes: 0 +2023/08/17-15:19:54.214432 8651103744 Options.use_direct_reads: 0 +2023/08/17-15:19:54.214433 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/17-15:19:54.214434 8651103744 Options.create_missing_column_families: 0 +2023/08/17-15:19:54.214435 8651103744 Options.db_log_dir: +2023/08/17-15:19:54.214436 8651103744 Options.wal_dir: +2023/08/17-15:19:54.214437 8651103744 Options.table_cache_numshardbits: 6 +2023/08/17-15:19:54.214438 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/17-15:19:54.214439 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/17-15:19:54.214440 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/17-15:19:54.214441 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/17-15:19:54.214442 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/17-15:19:54.214443 8651103744 Options.advise_random_on_open: 1 +2023/08/17-15:19:54.214444 8651103744 Options.db_write_buffer_size: 0 +2023/08/17-15:19:54.214445 8651103744 Options.write_buffer_manager: 0x600001c6c000 +2023/08/17-15:19:54.214446 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/17-15:19:54.214446 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/17-15:19:54.214447 8651103744 Options.use_adaptive_mutex: 0 +2023/08/17-15:19:54.214448 8651103744 Options.rate_limiter: 0x0 +2023/08/17-15:19:54.214450 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/17-15:19:54.214451 8651103744 Options.wal_recovery_mode: 2 +2023/08/17-15:19:54.214452 8651103744 Options.enable_thread_tracking: 0 +2023/08/17-15:19:54.214453 8651103744 Options.enable_pipelined_write: 0 +2023/08/17-15:19:54.214453 8651103744 Options.unordered_write: 0 +2023/08/17-15:19:54.214454 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/17-15:19:54.214455 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/17-15:19:54.214456 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/17-15:19:54.214457 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/17-15:19:54.214458 8651103744 Options.row_cache: None +2023/08/17-15:19:54.214459 8651103744 Options.wal_filter: None +2023/08/17-15:19:54.214460 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/17-15:19:54.214461 8651103744 Options.allow_ingest_behind: 0 +2023/08/17-15:19:54.214462 8651103744 Options.two_write_queues: 0 +2023/08/17-15:19:54.214463 8651103744 Options.manual_wal_flush: 0 +2023/08/17-15:19:54.214464 8651103744 Options.wal_compression: 0 +2023/08/17-15:19:54.214465 8651103744 Options.atomic_flush: 0 +2023/08/17-15:19:54.214466 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/17-15:19:54.214466 8651103744 Options.persist_stats_to_disk: 0 +2023/08/17-15:19:54.214467 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/17-15:19:54.214468 8651103744 Options.log_readahead_size: 0 +2023/08/17-15:19:54.214469 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/17-15:19:54.214481 8651103744 Options.best_efforts_recovery: 0 +2023/08/17-15:19:54.214482 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/17-15:19:54.214483 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/17-15:19:54.214484 8651103744 Options.allow_data_in_errors: 0 +2023/08/17-15:19:54.214485 8651103744 Options.db_host_id: __hostname__ +2023/08/17-15:19:54.214486 8651103744 Options.enforce_single_del_contracts: true +2023/08/17-15:19:54.214487 8651103744 Options.max_background_jobs: 2 +2023/08/17-15:19:54.214488 8651103744 Options.max_background_compactions: -1 +2023/08/17-15:19:54.214489 8651103744 Options.max_subcompactions: 1 +2023/08/17-15:19:54.214490 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/17-15:19:54.214491 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/17-15:19:54.214492 8651103744 Options.delayed_write_rate : 16777216 +2023/08/17-15:19:54.214492 8651103744 Options.max_total_wal_size: 0 +2023/08/17-15:19:54.214493 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/17-15:19:54.214494 8651103744 Options.stats_dump_period_sec: 600 +2023/08/17-15:19:54.214495 8651103744 Options.stats_persist_period_sec: 600 +2023/08/17-15:19:54.214496 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/17-15:19:54.214497 8651103744 Options.max_open_files: -1 +2023/08/17-15:19:54.214498 8651103744 Options.bytes_per_sync: 0 +2023/08/17-15:19:54.214499 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/17-15:19:54.214500 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/17-15:19:54.214501 8651103744 Options.compaction_readahead_size: 0 +2023/08/17-15:19:54.214502 8651103744 Options.max_background_flushes: -1 +2023/08/17-15:19:54.214503 8651103744 Compression algorithms supported: +2023/08/17-15:19:54.214517 8651103744 kZSTD supported: 1 +2023/08/17-15:19:54.214518 8651103744 kZlibCompression supported: 1 +2023/08/17-15:19:54.214519 8651103744 kXpressCompression supported: 0 +2023/08/17-15:19:54.214520 8651103744 kSnappyCompression supported: 1 +2023/08/17-15:19:54.214521 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/17-15:19:54.214522 8651103744 kLZ4HCCompression supported: 1 +2023/08/17-15:19:54.214523 8651103744 kLZ4Compression supported: 1 +2023/08/17-15:19:54.214524 8651103744 kBZip2Compression supported: 1 +2023/08/17-15:19:54.214532 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/17-15:19:54.214533 8651103744 DMutex implementation: pthread_mutex_t +2023/08/17-15:19:54.214832 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000177 +2023/08/17-15:19:54.215086 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/17-15:19:54.215088 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/17-15:19:54.215089 8651103744 Options.merge_operator: None +2023/08/17-15:19:54.215090 8651103744 Options.compaction_filter: None +2023/08/17-15:19:54.215092 8651103744 Options.compaction_filter_factory: None +2023/08/17-15:19:54.215093 8651103744 Options.sst_partitioner_factory: None +2023/08/17-15:19:54.215094 8651103744 Options.memtable_factory: SkipListFactory +2023/08/17-15:19:54.215095 8651103744 Options.table_factory: BlockBasedTable +2023/08/17-15:19:54.215107 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600002764640) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x6000012686d8 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/17-15:19:54.215108 8651103744 Options.write_buffer_size: 67108864 +2023/08/17-15:19:54.215109 8651103744 Options.max_write_buffer_number: 2 +2023/08/17-15:19:54.215110 8651103744 Options.compression: Snappy +2023/08/17-15:19:54.215111 8651103744 Options.bottommost_compression: Disabled +2023/08/17-15:19:54.215113 8651103744 Options.prefix_extractor: nullptr +2023/08/17-15:19:54.215114 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/17-15:19:54.215114 8651103744 Options.num_levels: 7 +2023/08/17-15:19:54.215115 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/17-15:19:54.215116 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/17-15:19:54.215117 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/17-15:19:54.215118 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/17-15:19:54.215119 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/17-15:19:54.215120 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/17-15:19:54.215121 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/17-15:19:54.215122 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/17-15:19:54.215123 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/17-15:19:54.215124 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/17-15:19:54.215125 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/17-15:19:54.215126 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/17-15:19:54.215127 8651103744 Options.compression_opts.window_bits: -14 +2023/08/17-15:19:54.215128 8651103744 Options.compression_opts.level: 32767 +2023/08/17-15:19:54.215129 8651103744 Options.compression_opts.strategy: 0 +2023/08/17-15:19:54.215130 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/17-15:19:54.215131 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/17-15:19:54.215131 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/17-15:19:54.215133 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/17-15:19:54.215133 8651103744 Options.compression_opts.enabled: false +2023/08/17-15:19:54.215134 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/17-15:19:54.215135 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/17-15:19:54.215136 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/17-15:19:54.215137 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/17-15:19:54.215138 8651103744 Options.target_file_size_base: 67108864 +2023/08/17-15:19:54.215139 8651103744 Options.target_file_size_multiplier: 1 +2023/08/17-15:19:54.215140 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/17-15:19:54.215141 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/17-15:19:54.215142 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/17-15:19:54.215143 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/17-15:19:54.215144 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/17-15:19:54.215145 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/17-15:19:54.215146 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/17-15:19:54.215147 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/17-15:19:54.215148 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/17-15:19:54.215149 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/17-15:19:54.215150 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/17-15:19:54.215150 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/17-15:19:54.215151 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/17-15:19:54.215152 8651103744 Options.arena_block_size: 1048576 +2023/08/17-15:19:54.215153 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/17-15:19:54.215154 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/17-15:19:54.215155 8651103744 Options.disable_auto_compactions: 0 +2023/08/17-15:19:54.215157 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/17-15:19:54.215160 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/17-15:19:54.215161 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/17-15:19:54.215162 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/17-15:19:54.215163 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/17-15:19:54.215164 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/17-15:19:54.215164 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/17-15:19:54.215167 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/17-15:19:54.215169 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/17-15:19:54.215169 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/17-15:19:54.215171 8651103744 Options.table_properties_collectors: +2023/08/17-15:19:54.215172 8651103744 Options.inplace_update_support: 0 +2023/08/17-15:19:54.215173 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/17-15:19:54.215174 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/17-15:19:54.215175 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/17-15:19:54.215176 8651103744 Options.memtable_huge_page_size: 0 +2023/08/17-15:19:54.215177 8651103744 Options.bloom_locality: 0 +2023/08/17-15:19:54.215178 8651103744 Options.max_successive_merges: 0 +2023/08/17-15:19:54.215179 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/17-15:19:54.215180 8651103744 Options.paranoid_file_checks: 0 +2023/08/17-15:19:54.215180 8651103744 Options.force_consistency_checks: 1 +2023/08/17-15:19:54.215181 8651103744 Options.report_bg_io_stats: 0 +2023/08/17-15:19:54.215182 8651103744 Options.ttl: 2592000 +2023/08/17-15:19:54.215183 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/17-15:19:54.215184 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/17-15:19:54.215185 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/17-15:19:54.215186 8651103744 Options.enable_blob_files: false +2023/08/17-15:19:54.215187 8651103744 Options.min_blob_size: 0 +2023/08/17-15:19:54.215188 8651103744 Options.blob_file_size: 268435456 +2023/08/17-15:19:54.215189 8651103744 Options.blob_compression_type: NoCompression +2023/08/17-15:19:54.215190 8651103744 Options.enable_blob_garbage_collection: false +2023/08/17-15:19:54.215191 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/17-15:19:54.215192 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/17-15:19:54.215193 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/17-15:19:54.215194 8651103744 Options.blob_file_starting_level: 0 +2023/08/17-15:19:54.215195 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/17-15:19:54.216454 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000177 succeeded,manifest_file_number is 177, next_file_number is 179, last_sequence is 41924, log_number is 172,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 172 +2023/08/17-15:19:54.216457 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 172 +2023/08/17-15:19:54.216688 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 +2023/08/17-15:19:54.216885 8651103744 EVENT_LOG_v1 {"time_micros": 1692253194216880, "job": 1, "event": "recovery_started", "wal_files": [176]} +2023/08/17-15:19:54.216888 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #176 mode 2 +2023/08/17-15:19:54.219945 8651103744 EVENT_LOG_v1 {"time_micros": 1692253194219924, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 180, "file_size": 19416, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 41925, "largest_seqno": 42293, "table_properties": {"data_size": 18274, "index_size": 282, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 16728, "raw_average_key_size": 45, "raw_value_size": 26048, "raw_average_value_size": 70, "num_data_blocks": 9, "num_entries": 369, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692253194, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "CAF4FDHZKXE1R4IZB8ZG", "orig_file_number": 180, "seqno_to_time_mapping": "N/A"}} +2023/08/17-15:19:54.220013 8651103744 EVENT_LOG_v1 {"time_micros": 1692253194220011, "job": 1, "event": "recovery_finished"} +2023/08/17-15:19:54.220254 8651103744 [db/version_set.cc:5180] Creating manifest 182 +2023/08/17-15:19:54.222836 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000176.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 +2023/08/17-15:19:54.222878 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x1507041f0 +2023/08/17-15:19:54.222964 8651103744 DB pointer 0x151008a00 +2023/08/17-15:19:54.223163 6091436032 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/17-15:19:54.223167 6091436032 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + L0 3/0 126.53 KB 0.8 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 14.3 0.00 0.00 1 0.001 0 0 0.0 0.0 + L1 1/0 1.70 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Sum 4/0 1.82 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 14.3 0.00 0.00 1 0.001 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 14.3 0.00 0.00 1 0.001 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.3 0.00 0.00 1 0.001 0 0 0.0 0.0 + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 2.29 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 2.29 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000012686d8#11332 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 4.1e-05 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/MANIFEST-000187 b/rust/hyperlane_db/MANIFEST-000187 new file mode 100644 index 0000000000000000000000000000000000000000..b0dc33e29162345b9614acadb86d581aa3355be7 GIT binary patch literal 1230 zcmb<%{UON8z}Vryw2?9F=Z+sT42+CYIjLo-IVnkcPL(C8<(b8)&iT0oiA9Me`9%e{ z0{kB^F#;8HZDeHGdWtEXVGHAp>5S&-`Kd)Ynen-)#l?x~squ_g*UEp{kZQE{oUZ4N z3mcp?`x#qVR{gqb-RCD{a#_8b@#zu<5J1=W|GSF8`4@LCUbYdRwJ_t*RJn47Z?lgW zu0D0iWY<#nJWa+Lh`yu8nShqFvUdIWwv3I9k%5}s{5*_%=0g0DU!0p?oLO9wT3nKs zS`wd=2x7%&=B1=oq^86pTauKMpPbG3Z6R3SmfcK8jsyL1@H@;O%t-#=5qK{9&RNuY zM#?<%pMRGtEdK&@{W8X`BTVSw##Hr1*=(lrCjJY?)9>^B$$Nf(@;1-HLah%6lWtt! z^RJO{!8C|F(cId1fa0`P8ODdx!TS2v zGELb6bmyX{pP}K+gyPPn)88)Jzt(8h6UNiLx?%hgjOmPv88;uwAug1`RzQg}#Z^=O zoq8h{wdbSmTh8c>_RM9ij8HjqQbQSTFe~e|N$-FzXWj7_=mB0vMikdCY>wf6)78hm zOhM*4LzeSK#@@qP@|+BeoD9sn!Kpm+dFQ`142(?Mph7pU0u%mD##t9x^q~PtFv91r z0y~CeFML=D*0=2x6VOst*7xuP&x+!O)2G&@T@C8nXa8{WyotGQ|1tIoCZ6U2dtnbF z*EU8Lpl*YYtG3?;3+)H<*??(@4VW9)fO(h==p8m-oTW4FW1PIHYS6_S*x%^!2J^H9 G%+mnRE5`u< literal 0 HcmV?d00001 diff --git a/rust/hyperlane_db/OPTIONS-000184 b/rust/hyperlane_db/OPTIONS-000184 new file mode 100644 index 0000000000..ec56ef4f4d --- /dev/null +++ b/rust/hyperlane_db/OPTIONS-000184 @@ -0,0 +1,198 @@ +# This is a RocksDB option file. +# +# For detailed file format spec, please refer to the example file +# in examples/rocksdb_option_file_example.ini +# + +[Version] + rocksdb_version=8.1.1 + options_file_version=1.1 + +[DBOptions] + max_background_flushes=-1 + compaction_readahead_size=0 + strict_bytes_per_sync=false + wal_bytes_per_sync=0 + max_open_files=-1 + stats_history_buffer_size=1048576 + max_total_wal_size=0 + stats_persist_period_sec=600 + stats_dump_period_sec=600 + avoid_flush_during_shutdown=false + max_subcompactions=1 + bytes_per_sync=0 + delayed_write_rate=16777216 + max_background_compactions=-1 + max_background_jobs=2 + delete_obsolete_files_period_micros=21600000000 + writable_file_max_buffer_size=1048576 + file_checksum_gen_factory=nullptr + allow_data_in_errors=false + max_bgerror_resume_count=2147483647 + best_efforts_recovery=false + write_dbid_to_manifest=false + atomic_flush=false + wal_compression=kNoCompression + manual_wal_flush=false + two_write_queues=false + avoid_flush_during_recovery=false + dump_malloc_stats=false + info_log_level=INFO_LEVEL + write_thread_slow_yield_usec=3 + allow_ingest_behind=false + fail_if_options_file_error=false + persist_stats_to_disk=false + WAL_ttl_seconds=0 + bgerror_resume_retry_interval=1000000 + allow_concurrent_memtable_write=true + paranoid_checks=true + WAL_size_limit_MB=0 + lowest_used_cache_tier=kNonVolatileBlockTier + keep_log_file_num=1000 + table_cache_numshardbits=6 + max_file_opening_threads=16 + use_fsync=false + unordered_write=false + random_access_max_buffer_size=1048576 + log_readahead_size=0 + enable_pipelined_write=false + wal_recovery_mode=kPointInTimeRecovery + db_write_buffer_size=0 + allow_2pc=false + skip_checking_sst_file_sizes_on_db_open=false + skip_stats_update_on_db_open=false + recycle_log_file_num=0 + db_host_id=__hostname__ + access_hint_on_compaction_start=NORMAL + verify_sst_unique_id_in_manifest=true + track_and_verify_wals_in_manifest=false + error_if_exists=false + manifest_preallocation_size=4194304 + is_fd_close_on_exec=true + enable_write_thread_adaptive_yield=true + enable_thread_tracking=false + avoid_unnecessary_blocking_io=false + allow_fallocate=true + max_log_file_size=0 + advise_random_on_open=true + create_missing_column_families=false + max_write_batch_group_size_bytes=1048576 + use_adaptive_mutex=false + wal_filter=nullptr + create_if_missing=true + enforce_single_del_contracts=true + allow_mmap_writes=false + log_file_time_to_roll=0 + use_direct_io_for_flush_and_compaction=false + flush_verify_memtable_count=true + max_manifest_file_size=1073741824 + write_thread_max_yield_usec=100 + use_direct_reads=false + allow_mmap_reads=false + + +[CFOptions "default"] + memtable_protection_bytes_per_key=0 + bottommost_compression=kDisableCompressionOption + sample_for_compression=0 + blob_garbage_collection_age_cutoff=0.250000 + blob_compression_type=kNoCompression + prepopulate_blob_cache=kDisable + blob_compaction_readahead_size=0 + level0_stop_writes_trigger=36 + min_blob_size=0 + last_level_temperature=kUnknown + compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;} + target_file_size_base=67108864 + ignore_max_compaction_bytes_for_input=true + memtable_whole_key_filtering=false + blob_file_starting_level=0 + soft_pending_compaction_bytes_limit=68719476736 + max_write_buffer_number=2 + ttl=2592000 + compaction_options_fifo={allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;} + check_flush_compaction_key_order=true + memtable_huge_page_size=0 + max_successive_merges=0 + inplace_update_num_locks=10000 + enable_blob_garbage_collection=false + arena_block_size=1048576 + bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;parallel_threads=1;zstd_max_train_bytes=0;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;} + target_file_size_multiplier=1 + max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1 + blob_garbage_collection_force_threshold=1.000000 + enable_blob_files=false + level0_slowdown_writes_trigger=20 + compression=kSnappyCompression + level0_file_num_compaction_trigger=4 + prefix_extractor=nullptr + max_bytes_for_level_multiplier=10.000000 + write_buffer_size=67108864 + disable_auto_compactions=false + max_compaction_bytes=1677721600 + compression_opts={use_zstd_dict_trainer=true;enabled=false;parallel_threads=1;zstd_max_train_bytes=0;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;} + hard_pending_compaction_bytes_limit=274877906944 + blob_file_size=268435456 + periodic_compaction_seconds=0 + paranoid_file_checks=false + experimental_mempurge_threshold=0.000000 + memtable_prefix_bloom_size_ratio=0.000000 + max_bytes_for_level_base=268435456 + max_sequential_skip_in_iterations=8 + report_bg_io_stats=false + sst_partitioner_factory=nullptr + compaction_pri=kMinOverlappingRatio + compaction_style=kCompactionStyleLevel + compaction_filter_factory=nullptr + compaction_filter=nullptr + memtable_factory=SkipListFactory + comparator=leveldb.BytewiseComparator + bloom_locality=0 + min_write_buffer_number_to_merge=1 + table_factory=BlockBasedTable + max_write_buffer_size_to_maintain=0 + max_write_buffer_number_to_maintain=0 + preserve_internal_time_seconds=0 + force_consistency_checks=true + optimize_filters_for_hits=false + merge_operator=nullptr + num_levels=7 + level_compaction_dynamic_file_size=true + memtable_insert_with_hint_prefix_extractor=nullptr + level_compaction_dynamic_level_bytes=false + preclude_last_level_data_seconds=0 + inplace_update_support=false + +[TableOptions/BlockBasedTable "default"] + num_file_reads_for_auto_readahead=2 + metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;} + read_amp_bytes_per_bit=0 + verify_compression=false + format_version=5 + optimize_filters_for_memory=false + partition_filters=false + detect_filter_construct_corruption=false + initial_auto_readahead_size=8192 + max_auto_readahead_size=262144 + enable_index_compression=true + checksum=kXXH3 + index_block_restart_interval=1 + pin_top_level_index_and_filter=true + block_align=false + block_size=4096 + index_type=kBinarySearch + filter_policy=nullptr + metadata_block_size=4096 + no_block_cache=false + index_shortening=kShortenSeparators + whole_key_filtering=true + block_size_deviation=10 + data_block_index_type=kDataBlockBinarySearch + data_block_hash_table_util_ratio=0.750000 + cache_index_and_filter_blocks=false + prepopulate_block_cache=kDisable + block_restart_interval=16 + pin_l0_filter_and_index_blocks_in_cache=false + cache_index_and_filter_blocks_with_high_priority=true + flush_block_policy_factory=FlushBlockBySizePolicyFactory + diff --git a/rust/hyperlane_db/OPTIONS-000189 b/rust/hyperlane_db/OPTIONS-000189 new file mode 100644 index 0000000000..ec56ef4f4d --- /dev/null +++ b/rust/hyperlane_db/OPTIONS-000189 @@ -0,0 +1,198 @@ +# This is a RocksDB option file. +# +# For detailed file format spec, please refer to the example file +# in examples/rocksdb_option_file_example.ini +# + +[Version] + rocksdb_version=8.1.1 + options_file_version=1.1 + +[DBOptions] + max_background_flushes=-1 + compaction_readahead_size=0 + strict_bytes_per_sync=false + wal_bytes_per_sync=0 + max_open_files=-1 + stats_history_buffer_size=1048576 + max_total_wal_size=0 + stats_persist_period_sec=600 + stats_dump_period_sec=600 + avoid_flush_during_shutdown=false + max_subcompactions=1 + bytes_per_sync=0 + delayed_write_rate=16777216 + max_background_compactions=-1 + max_background_jobs=2 + delete_obsolete_files_period_micros=21600000000 + writable_file_max_buffer_size=1048576 + file_checksum_gen_factory=nullptr + allow_data_in_errors=false + max_bgerror_resume_count=2147483647 + best_efforts_recovery=false + write_dbid_to_manifest=false + atomic_flush=false + wal_compression=kNoCompression + manual_wal_flush=false + two_write_queues=false + avoid_flush_during_recovery=false + dump_malloc_stats=false + info_log_level=INFO_LEVEL + write_thread_slow_yield_usec=3 + allow_ingest_behind=false + fail_if_options_file_error=false + persist_stats_to_disk=false + WAL_ttl_seconds=0 + bgerror_resume_retry_interval=1000000 + allow_concurrent_memtable_write=true + paranoid_checks=true + WAL_size_limit_MB=0 + lowest_used_cache_tier=kNonVolatileBlockTier + keep_log_file_num=1000 + table_cache_numshardbits=6 + max_file_opening_threads=16 + use_fsync=false + unordered_write=false + random_access_max_buffer_size=1048576 + log_readahead_size=0 + enable_pipelined_write=false + wal_recovery_mode=kPointInTimeRecovery + db_write_buffer_size=0 + allow_2pc=false + skip_checking_sst_file_sizes_on_db_open=false + skip_stats_update_on_db_open=false + recycle_log_file_num=0 + db_host_id=__hostname__ + access_hint_on_compaction_start=NORMAL + verify_sst_unique_id_in_manifest=true + track_and_verify_wals_in_manifest=false + error_if_exists=false + manifest_preallocation_size=4194304 + is_fd_close_on_exec=true + enable_write_thread_adaptive_yield=true + enable_thread_tracking=false + avoid_unnecessary_blocking_io=false + allow_fallocate=true + max_log_file_size=0 + advise_random_on_open=true + create_missing_column_families=false + max_write_batch_group_size_bytes=1048576 + use_adaptive_mutex=false + wal_filter=nullptr + create_if_missing=true + enforce_single_del_contracts=true + allow_mmap_writes=false + log_file_time_to_roll=0 + use_direct_io_for_flush_and_compaction=false + flush_verify_memtable_count=true + max_manifest_file_size=1073741824 + write_thread_max_yield_usec=100 + use_direct_reads=false + allow_mmap_reads=false + + +[CFOptions "default"] + memtable_protection_bytes_per_key=0 + bottommost_compression=kDisableCompressionOption + sample_for_compression=0 + blob_garbage_collection_age_cutoff=0.250000 + blob_compression_type=kNoCompression + prepopulate_blob_cache=kDisable + blob_compaction_readahead_size=0 + level0_stop_writes_trigger=36 + min_blob_size=0 + last_level_temperature=kUnknown + compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;} + target_file_size_base=67108864 + ignore_max_compaction_bytes_for_input=true + memtable_whole_key_filtering=false + blob_file_starting_level=0 + soft_pending_compaction_bytes_limit=68719476736 + max_write_buffer_number=2 + ttl=2592000 + compaction_options_fifo={allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;} + check_flush_compaction_key_order=true + memtable_huge_page_size=0 + max_successive_merges=0 + inplace_update_num_locks=10000 + enable_blob_garbage_collection=false + arena_block_size=1048576 + bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;parallel_threads=1;zstd_max_train_bytes=0;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;} + target_file_size_multiplier=1 + max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1 + blob_garbage_collection_force_threshold=1.000000 + enable_blob_files=false + level0_slowdown_writes_trigger=20 + compression=kSnappyCompression + level0_file_num_compaction_trigger=4 + prefix_extractor=nullptr + max_bytes_for_level_multiplier=10.000000 + write_buffer_size=67108864 + disable_auto_compactions=false + max_compaction_bytes=1677721600 + compression_opts={use_zstd_dict_trainer=true;enabled=false;parallel_threads=1;zstd_max_train_bytes=0;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;} + hard_pending_compaction_bytes_limit=274877906944 + blob_file_size=268435456 + periodic_compaction_seconds=0 + paranoid_file_checks=false + experimental_mempurge_threshold=0.000000 + memtable_prefix_bloom_size_ratio=0.000000 + max_bytes_for_level_base=268435456 + max_sequential_skip_in_iterations=8 + report_bg_io_stats=false + sst_partitioner_factory=nullptr + compaction_pri=kMinOverlappingRatio + compaction_style=kCompactionStyleLevel + compaction_filter_factory=nullptr + compaction_filter=nullptr + memtable_factory=SkipListFactory + comparator=leveldb.BytewiseComparator + bloom_locality=0 + min_write_buffer_number_to_merge=1 + table_factory=BlockBasedTable + max_write_buffer_size_to_maintain=0 + max_write_buffer_number_to_maintain=0 + preserve_internal_time_seconds=0 + force_consistency_checks=true + optimize_filters_for_hits=false + merge_operator=nullptr + num_levels=7 + level_compaction_dynamic_file_size=true + memtable_insert_with_hint_prefix_extractor=nullptr + level_compaction_dynamic_level_bytes=false + preclude_last_level_data_seconds=0 + inplace_update_support=false + +[TableOptions/BlockBasedTable "default"] + num_file_reads_for_auto_readahead=2 + metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;} + read_amp_bytes_per_bit=0 + verify_compression=false + format_version=5 + optimize_filters_for_memory=false + partition_filters=false + detect_filter_construct_corruption=false + initial_auto_readahead_size=8192 + max_auto_readahead_size=262144 + enable_index_compression=true + checksum=kXXH3 + index_block_restart_interval=1 + pin_top_level_index_and_filter=true + block_align=false + block_size=4096 + index_type=kBinarySearch + filter_policy=nullptr + metadata_block_size=4096 + no_block_cache=false + index_shortening=kShortenSeparators + whole_key_filtering=true + block_size_deviation=10 + data_block_index_type=kDataBlockBinarySearch + data_block_hash_table_util_ratio=0.750000 + cache_index_and_filter_blocks=false + prepopulate_block_cache=kDisable + block_restart_interval=16 + pin_l0_filter_and_index_blocks_in_cache=false + cache_index_and_filter_blocks_with_high_priority=true + flush_block_policy_factory=FlushBlockBySizePolicyFactory + diff --git a/rust/validator_db_osmosistestnet/000004.log b/rust/validator_db_osmosistestnet/000004.log new file mode 100644 index 0000000000..e69de29bb2 diff --git a/rust/validator_db_osmosistestnet/CURRENT b/rust/validator_db_osmosistestnet/CURRENT new file mode 100644 index 0000000000..aa5bb8ea50 --- /dev/null +++ b/rust/validator_db_osmosistestnet/CURRENT @@ -0,0 +1 @@ +MANIFEST-000005 diff --git a/rust/validator_db_osmosistestnet/IDENTITY b/rust/validator_db_osmosistestnet/IDENTITY new file mode 100644 index 0000000000..0936aa25a9 --- /dev/null +++ b/rust/validator_db_osmosistestnet/IDENTITY @@ -0,0 +1 @@ +6196d70c-89e1-4c77-be52-0ab2bfd49109 \ No newline at end of file diff --git a/rust/validator_db_osmosistestnet/LOCK b/rust/validator_db_osmosistestnet/LOCK new file mode 100644 index 0000000000..e69de29bb2 diff --git a/rust/validator_db_osmosistestnet/LOG b/rust/validator_db_osmosistestnet/LOG new file mode 100644 index 0000000000..7c4c2a8ae7 --- /dev/null +++ b/rust/validator_db_osmosistestnet/LOG @@ -0,0 +1,278 @@ +2023/08/17-19:33:39.653897 8651103744 RocksDB version: 8.1.1 +2023/08/17-19:33:39.654443 8651103744 Compile date 2023-04-06 16:38:52 +2023/08/17-19:33:39.654445 8651103744 DB SUMMARY +2023/08/17-19:33:39.654447 8651103744 DB Session ID: HLDQR9P5Y3DV67CR9Z2I +2023/08/17-19:33:39.654511 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/validator_db_osmosistestnet dir, Total Num: 0, files: +2023/08/17-19:33:39.654513 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/validator_db_osmosistestnet: +2023/08/17-19:33:39.654515 8651103744 Options.error_if_exists: 0 +2023/08/17-19:33:39.654516 8651103744 Options.create_if_missing: 1 +2023/08/17-19:33:39.654517 8651103744 Options.paranoid_checks: 1 +2023/08/17-19:33:39.654518 8651103744 Options.flush_verify_memtable_count: 1 +2023/08/17-19:33:39.654519 8651103744 Options.track_and_verify_wals_in_manifest: 0 +2023/08/17-19:33:39.654520 8651103744 Options.verify_sst_unique_id_in_manifest: 1 +2023/08/17-19:33:39.654521 8651103744 Options.env: 0x106e2c848 +2023/08/17-19:33:39.654522 8651103744 Options.fs: PosixFileSystem +2023/08/17-19:33:39.654523 8651103744 Options.info_log: 0x129705f78 +2023/08/17-19:33:39.654524 8651103744 Options.max_file_opening_threads: 16 +2023/08/17-19:33:39.654525 8651103744 Options.statistics: 0x0 +2023/08/17-19:33:39.654526 8651103744 Options.use_fsync: 0 +2023/08/17-19:33:39.654527 8651103744 Options.max_log_file_size: 0 +2023/08/17-19:33:39.654528 8651103744 Options.max_manifest_file_size: 1073741824 +2023/08/17-19:33:39.654529 8651103744 Options.log_file_time_to_roll: 0 +2023/08/17-19:33:39.654530 8651103744 Options.keep_log_file_num: 1000 +2023/08/17-19:33:39.654531 8651103744 Options.recycle_log_file_num: 0 +2023/08/17-19:33:39.654532 8651103744 Options.allow_fallocate: 1 +2023/08/17-19:33:39.654533 8651103744 Options.allow_mmap_reads: 0 +2023/08/17-19:33:39.654534 8651103744 Options.allow_mmap_writes: 0 +2023/08/17-19:33:39.654535 8651103744 Options.use_direct_reads: 0 +2023/08/17-19:33:39.654536 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 +2023/08/17-19:33:39.654537 8651103744 Options.create_missing_column_families: 0 +2023/08/17-19:33:39.654538 8651103744 Options.db_log_dir: +2023/08/17-19:33:39.654539 8651103744 Options.wal_dir: +2023/08/17-19:33:39.654540 8651103744 Options.table_cache_numshardbits: 6 +2023/08/17-19:33:39.654540 8651103744 Options.WAL_ttl_seconds: 0 +2023/08/17-19:33:39.654541 8651103744 Options.WAL_size_limit_MB: 0 +2023/08/17-19:33:39.654542 8651103744 Options.max_write_batch_group_size_bytes: 1048576 +2023/08/17-19:33:39.654543 8651103744 Options.manifest_preallocation_size: 4194304 +2023/08/17-19:33:39.654544 8651103744 Options.is_fd_close_on_exec: 1 +2023/08/17-19:33:39.654545 8651103744 Options.advise_random_on_open: 1 +2023/08/17-19:33:39.654546 8651103744 Options.db_write_buffer_size: 0 +2023/08/17-19:33:39.654547 8651103744 Options.write_buffer_manager: 0x60000003c8f0 +2023/08/17-19:33:39.654548 8651103744 Options.access_hint_on_compaction_start: 1 +2023/08/17-19:33:39.654549 8651103744 Options.random_access_max_buffer_size: 1048576 +2023/08/17-19:33:39.654550 8651103744 Options.use_adaptive_mutex: 0 +2023/08/17-19:33:39.654551 8651103744 Options.rate_limiter: 0x0 +2023/08/17-19:33:39.654553 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 +2023/08/17-19:33:39.654554 8651103744 Options.wal_recovery_mode: 2 +2023/08/17-19:33:39.654555 8651103744 Options.enable_thread_tracking: 0 +2023/08/17-19:33:39.654556 8651103744 Options.enable_pipelined_write: 0 +2023/08/17-19:33:39.654556 8651103744 Options.unordered_write: 0 +2023/08/17-19:33:39.654557 8651103744 Options.allow_concurrent_memtable_write: 1 +2023/08/17-19:33:39.654558 8651103744 Options.enable_write_thread_adaptive_yield: 1 +2023/08/17-19:33:39.654559 8651103744 Options.write_thread_max_yield_usec: 100 +2023/08/17-19:33:39.654560 8651103744 Options.write_thread_slow_yield_usec: 3 +2023/08/17-19:33:39.654561 8651103744 Options.row_cache: None +2023/08/17-19:33:39.654562 8651103744 Options.wal_filter: None +2023/08/17-19:33:39.654563 8651103744 Options.avoid_flush_during_recovery: 0 +2023/08/17-19:33:39.654564 8651103744 Options.allow_ingest_behind: 0 +2023/08/17-19:33:39.654565 8651103744 Options.two_write_queues: 0 +2023/08/17-19:33:39.654566 8651103744 Options.manual_wal_flush: 0 +2023/08/17-19:33:39.654567 8651103744 Options.wal_compression: 0 +2023/08/17-19:33:39.654568 8651103744 Options.atomic_flush: 0 +2023/08/17-19:33:39.654569 8651103744 Options.avoid_unnecessary_blocking_io: 0 +2023/08/17-19:33:39.654570 8651103744 Options.persist_stats_to_disk: 0 +2023/08/17-19:33:39.654571 8651103744 Options.write_dbid_to_manifest: 0 +2023/08/17-19:33:39.654572 8651103744 Options.log_readahead_size: 0 +2023/08/17-19:33:39.654573 8651103744 Options.file_checksum_gen_factory: Unknown +2023/08/17-19:33:39.654589 8651103744 Options.best_efforts_recovery: 0 +2023/08/17-19:33:39.654590 8651103744 Options.max_bgerror_resume_count: 2147483647 +2023/08/17-19:33:39.654591 8651103744 Options.bgerror_resume_retry_interval: 1000000 +2023/08/17-19:33:39.654592 8651103744 Options.allow_data_in_errors: 0 +2023/08/17-19:33:39.654592 8651103744 Options.db_host_id: __hostname__ +2023/08/17-19:33:39.654593 8651103744 Options.enforce_single_del_contracts: true +2023/08/17-19:33:39.654594 8651103744 Options.max_background_jobs: 2 +2023/08/17-19:33:39.654595 8651103744 Options.max_background_compactions: -1 +2023/08/17-19:33:39.654596 8651103744 Options.max_subcompactions: 1 +2023/08/17-19:33:39.654597 8651103744 Options.avoid_flush_during_shutdown: 0 +2023/08/17-19:33:39.654598 8651103744 Options.writable_file_max_buffer_size: 1048576 +2023/08/17-19:33:39.654599 8651103744 Options.delayed_write_rate : 16777216 +2023/08/17-19:33:39.654600 8651103744 Options.max_total_wal_size: 0 +2023/08/17-19:33:39.654601 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 +2023/08/17-19:33:39.654602 8651103744 Options.stats_dump_period_sec: 600 +2023/08/17-19:33:39.654603 8651103744 Options.stats_persist_period_sec: 600 +2023/08/17-19:33:39.654604 8651103744 Options.stats_history_buffer_size: 1048576 +2023/08/17-19:33:39.654605 8651103744 Options.max_open_files: -1 +2023/08/17-19:33:39.654606 8651103744 Options.bytes_per_sync: 0 +2023/08/17-19:33:39.654607 8651103744 Options.wal_bytes_per_sync: 0 +2023/08/17-19:33:39.654608 8651103744 Options.strict_bytes_per_sync: 0 +2023/08/17-19:33:39.654609 8651103744 Options.compaction_readahead_size: 0 +2023/08/17-19:33:39.654610 8651103744 Options.max_background_flushes: -1 +2023/08/17-19:33:39.654611 8651103744 Compression algorithms supported: +2023/08/17-19:33:39.654625 8651103744 kZSTD supported: 1 +2023/08/17-19:33:39.654626 8651103744 kZlibCompression supported: 1 +2023/08/17-19:33:39.654627 8651103744 kXpressCompression supported: 0 +2023/08/17-19:33:39.654628 8651103744 kSnappyCompression supported: 1 +2023/08/17-19:33:39.654629 8651103744 kZSTDNotFinalCompression supported: 1 +2023/08/17-19:33:39.654631 8651103744 kLZ4HCCompression supported: 1 +2023/08/17-19:33:39.654632 8651103744 kLZ4Compression supported: 1 +2023/08/17-19:33:39.654633 8651103744 kBZip2Compression supported: 1 +2023/08/17-19:33:39.654639 8651103744 Fast CRC32 supported: Supported on Arm64 +2023/08/17-19:33:39.654640 8651103744 DMutex implementation: pthread_mutex_t +2023/08/17-19:33:39.654976 8651103744 [db/db_impl/db_impl_open.cc:315] Creating manifest 1 +2023/08/17-19:33:39.655454 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/validator_db_osmosistestnet/MANIFEST-000001 +2023/08/17-19:33:39.655689 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: +2023/08/17-19:33:39.655691 8651103744 Options.comparator: leveldb.BytewiseComparator +2023/08/17-19:33:39.655693 8651103744 Options.merge_operator: None +2023/08/17-19:33:39.655694 8651103744 Options.compaction_filter: None +2023/08/17-19:33:39.655695 8651103744 Options.compaction_filter_factory: None +2023/08/17-19:33:39.655696 8651103744 Options.sst_partitioner_factory: None +2023/08/17-19:33:39.655697 8651103744 Options.memtable_factory: SkipListFactory +2023/08/17-19:33:39.655698 8651103744 Options.table_factory: BlockBasedTable +2023/08/17-19:33:39.655722 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600003b28640) + cache_index_and_filter_blocks: 0 + cache_index_and_filter_blocks_with_high_priority: 1 + pin_l0_filter_and_index_blocks_in_cache: 0 + pin_top_level_index_and_filter: 1 + index_type: 0 + data_block_index_type: 0 + index_shortening: 1 + data_block_hash_table_util_ratio: 0.750000 + checksum: 4 + no_block_cache: 0 + block_cache: 0x600000e3c198 + block_cache_name: LRUCache + block_cache_options: + capacity : 8388608 + num_shard_bits : 4 + strict_capacity_limit : 0 + memory_allocator : None + high_pri_pool_ratio: 0.000 + low_pri_pool_ratio: 0.000 + persistent_cache: 0x0 + block_size: 4096 + block_size_deviation: 10 + block_restart_interval: 16 + index_block_restart_interval: 1 + metadata_block_size: 4096 + partition_filters: 0 + use_delta_encoding: 1 + filter_policy: nullptr + whole_key_filtering: 1 + verify_compression: 0 + read_amp_bytes_per_bit: 0 + format_version: 5 + enable_index_compression: 1 + block_align: 0 + max_auto_readahead_size: 262144 + prepopulate_block_cache: 0 + initial_auto_readahead_size: 8192 + num_file_reads_for_auto_readahead: 2 +2023/08/17-19:33:39.655725 8651103744 Options.write_buffer_size: 67108864 +2023/08/17-19:33:39.655726 8651103744 Options.max_write_buffer_number: 2 +2023/08/17-19:33:39.655727 8651103744 Options.compression: Snappy +2023/08/17-19:33:39.655729 8651103744 Options.bottommost_compression: Disabled +2023/08/17-19:33:39.655730 8651103744 Options.prefix_extractor: nullptr +2023/08/17-19:33:39.655731 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr +2023/08/17-19:33:39.655732 8651103744 Options.num_levels: 7 +2023/08/17-19:33:39.655733 8651103744 Options.min_write_buffer_number_to_merge: 1 +2023/08/17-19:33:39.655734 8651103744 Options.max_write_buffer_number_to_maintain: 0 +2023/08/17-19:33:39.655735 8651103744 Options.max_write_buffer_size_to_maintain: 0 +2023/08/17-19:33:39.655736 8651103744 Options.bottommost_compression_opts.window_bits: -14 +2023/08/17-19:33:39.655737 8651103744 Options.bottommost_compression_opts.level: 32767 +2023/08/17-19:33:39.655738 8651103744 Options.bottommost_compression_opts.strategy: 0 +2023/08/17-19:33:39.655739 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 +2023/08/17-19:33:39.655740 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 +2023/08/17-19:33:39.655741 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 +2023/08/17-19:33:39.655742 8651103744 Options.bottommost_compression_opts.enabled: false +2023/08/17-19:33:39.655743 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 +2023/08/17-19:33:39.655744 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true +2023/08/17-19:33:39.655745 8651103744 Options.compression_opts.window_bits: -14 +2023/08/17-19:33:39.655746 8651103744 Options.compression_opts.level: 32767 +2023/08/17-19:33:39.655747 8651103744 Options.compression_opts.strategy: 0 +2023/08/17-19:33:39.655748 8651103744 Options.compression_opts.max_dict_bytes: 0 +2023/08/17-19:33:39.655749 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 +2023/08/17-19:33:39.655750 8651103744 Options.compression_opts.use_zstd_dict_trainer: true +2023/08/17-19:33:39.655751 8651103744 Options.compression_opts.parallel_threads: 1 +2023/08/17-19:33:39.655752 8651103744 Options.compression_opts.enabled: false +2023/08/17-19:33:39.655753 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 +2023/08/17-19:33:39.655754 8651103744 Options.level0_file_num_compaction_trigger: 4 +2023/08/17-19:33:39.655755 8651103744 Options.level0_slowdown_writes_trigger: 20 +2023/08/17-19:33:39.655756 8651103744 Options.level0_stop_writes_trigger: 36 +2023/08/17-19:33:39.655757 8651103744 Options.target_file_size_base: 67108864 +2023/08/17-19:33:39.655758 8651103744 Options.target_file_size_multiplier: 1 +2023/08/17-19:33:39.655759 8651103744 Options.max_bytes_for_level_base: 268435456 +2023/08/17-19:33:39.655760 8651103744 Options.level_compaction_dynamic_level_bytes: 0 +2023/08/17-19:33:39.655761 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 +2023/08/17-19:33:39.655762 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 +2023/08/17-19:33:39.655763 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 +2023/08/17-19:33:39.655764 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 +2023/08/17-19:33:39.655765 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 +2023/08/17-19:33:39.655766 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 +2023/08/17-19:33:39.655767 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 +2023/08/17-19:33:39.655768 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 +2023/08/17-19:33:39.655769 8651103744 Options.max_sequential_skip_in_iterations: 8 +2023/08/17-19:33:39.655770 8651103744 Options.max_compaction_bytes: 1677721600 +2023/08/17-19:33:39.655771 8651103744 Options.ignore_max_compaction_bytes_for_input: true +2023/08/17-19:33:39.655772 8651103744 Options.arena_block_size: 1048576 +2023/08/17-19:33:39.655773 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 +2023/08/17-19:33:39.655774 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 +2023/08/17-19:33:39.655775 8651103744 Options.disable_auto_compactions: 0 +2023/08/17-19:33:39.655777 8651103744 Options.compaction_style: kCompactionStyleLevel +2023/08/17-19:33:39.655779 8651103744 Options.compaction_pri: kMinOverlappingRatio +2023/08/17-19:33:39.655780 8651103744 Options.compaction_options_universal.size_ratio: 1 +2023/08/17-19:33:39.655781 8651103744 Options.compaction_options_universal.min_merge_width: 2 +2023/08/17-19:33:39.655782 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 +2023/08/17-19:33:39.655783 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 +2023/08/17-19:33:39.655784 8651103744 Options.compaction_options_universal.compression_size_percent: -1 +2023/08/17-19:33:39.655785 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize +2023/08/17-19:33:39.655788 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 +2023/08/17-19:33:39.655789 8651103744 Options.compaction_options_fifo.allow_compaction: 0 +2023/08/17-19:33:39.655791 8651103744 Options.table_properties_collectors: +2023/08/17-19:33:39.655792 8651103744 Options.inplace_update_support: 0 +2023/08/17-19:33:39.655793 8651103744 Options.inplace_update_num_locks: 10000 +2023/08/17-19:33:39.655794 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 +2023/08/17-19:33:39.655795 8651103744 Options.memtable_whole_key_filtering: 0 +2023/08/17-19:33:39.655796 8651103744 Options.memtable_huge_page_size: 0 +2023/08/17-19:33:39.655797 8651103744 Options.bloom_locality: 0 +2023/08/17-19:33:39.655798 8651103744 Options.max_successive_merges: 0 +2023/08/17-19:33:39.655799 8651103744 Options.optimize_filters_for_hits: 0 +2023/08/17-19:33:39.655800 8651103744 Options.paranoid_file_checks: 0 +2023/08/17-19:33:39.655801 8651103744 Options.force_consistency_checks: 1 +2023/08/17-19:33:39.655802 8651103744 Options.report_bg_io_stats: 0 +2023/08/17-19:33:39.655803 8651103744 Options.ttl: 2592000 +2023/08/17-19:33:39.655804 8651103744 Options.periodic_compaction_seconds: 0 +2023/08/17-19:33:39.655805 8651103744 Options.preclude_last_level_data_seconds: 0 +2023/08/17-19:33:39.655806 8651103744 Options.preserve_internal_time_seconds: 0 +2023/08/17-19:33:39.655807 8651103744 Options.enable_blob_files: false +2023/08/17-19:33:39.655808 8651103744 Options.min_blob_size: 0 +2023/08/17-19:33:39.655809 8651103744 Options.blob_file_size: 268435456 +2023/08/17-19:33:39.655810 8651103744 Options.blob_compression_type: NoCompression +2023/08/17-19:33:39.655811 8651103744 Options.enable_blob_garbage_collection: false +2023/08/17-19:33:39.655812 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 +2023/08/17-19:33:39.655813 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 +2023/08/17-19:33:39.655814 8651103744 Options.blob_compaction_readahead_size: 0 +2023/08/17-19:33:39.655815 8651103744 Options.blob_file_starting_level: 0 +2023/08/17-19:33:39.655816 8651103744 Options.experimental_mempurge_threshold: 0.000000 +2023/08/17-19:33:39.656468 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/validator_db_osmosistestnet/MANIFEST-000001 succeeded,manifest_file_number is 1, next_file_number is 3, last_sequence is 0, log_number is 0,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 0 +2023/08/17-19:33:39.656471 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 0 +2023/08/17-19:33:39.656515 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 6196d70c-89e1-4c77-be52-0ab2bfd49109 +2023/08/17-19:33:39.656745 8651103744 [db/version_set.cc:5180] Creating manifest 5 +2023/08/17-19:33:39.659254 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x12a904080 +2023/08/17-19:33:39.659297 8651103744 DB pointer 0x12a015000 +2023/08/17-19:33:39.659498 6131855360 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- +2023/08/17-19:33:39.659501 6131855360 [db/db_impl/db_impl.cc:1086] +** DB Stats ** +Uptime(secs): 0.0 total, 0.0 interval +Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s +Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent +Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s +Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s +Interval stall: 00:00:0.000 H:M:S, 0.0 percent +Write Stall (count): write-buffer-manager-limit-stops: 0, +** Compaction Stats [default] ** +Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + Sum 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 + +** Compaction Stats [default] ** +Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 + +Uptime(secs): 0.0 total, 0.0 interval +Flush(GB): cumulative 0.000, interval 0.000 +AddFile(GB): cumulative 0.000, interval 0.000 +AddFile(Total Files): cumulative 0, interval 0 +AddFile(L0 Files): cumulative 0, interval 0 +AddFile(Keys): cumulative 0, interval 0 +Cumulative compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Interval compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds +Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x600000e3c198#16938 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 5.2e-05 secs_since: 0 +Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) + +** File Read Latency Histogram By Level [default] ** +2023/08/17-19:33:39.659767 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work +2023/08/17-19:33:39.659928 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/validator_db_osmosistestnet/MANIFEST-000005 b/rust/validator_db_osmosistestnet/MANIFEST-000005 new file mode 100644 index 0000000000000000000000000000000000000000..f1d1169ebb5084f6ab379df690c29da290eba713 GIT binary patch literal 66 zcmZS8)^KKEU<~`Yer`cxQDRAc(HCZ(C>91r VCI%LUKRRkZ*%%l(8JO8v7yzD{5)c3Y literal 0 HcmV?d00001 diff --git a/rust/validator_db_osmosistestnet/OPTIONS-000007 b/rust/validator_db_osmosistestnet/OPTIONS-000007 new file mode 100644 index 0000000000..ec56ef4f4d --- /dev/null +++ b/rust/validator_db_osmosistestnet/OPTIONS-000007 @@ -0,0 +1,198 @@ +# This is a RocksDB option file. +# +# For detailed file format spec, please refer to the example file +# in examples/rocksdb_option_file_example.ini +# + +[Version] + rocksdb_version=8.1.1 + options_file_version=1.1 + +[DBOptions] + max_background_flushes=-1 + compaction_readahead_size=0 + strict_bytes_per_sync=false + wal_bytes_per_sync=0 + max_open_files=-1 + stats_history_buffer_size=1048576 + max_total_wal_size=0 + stats_persist_period_sec=600 + stats_dump_period_sec=600 + avoid_flush_during_shutdown=false + max_subcompactions=1 + bytes_per_sync=0 + delayed_write_rate=16777216 + max_background_compactions=-1 + max_background_jobs=2 + delete_obsolete_files_period_micros=21600000000 + writable_file_max_buffer_size=1048576 + file_checksum_gen_factory=nullptr + allow_data_in_errors=false + max_bgerror_resume_count=2147483647 + best_efforts_recovery=false + write_dbid_to_manifest=false + atomic_flush=false + wal_compression=kNoCompression + manual_wal_flush=false + two_write_queues=false + avoid_flush_during_recovery=false + dump_malloc_stats=false + info_log_level=INFO_LEVEL + write_thread_slow_yield_usec=3 + allow_ingest_behind=false + fail_if_options_file_error=false + persist_stats_to_disk=false + WAL_ttl_seconds=0 + bgerror_resume_retry_interval=1000000 + allow_concurrent_memtable_write=true + paranoid_checks=true + WAL_size_limit_MB=0 + lowest_used_cache_tier=kNonVolatileBlockTier + keep_log_file_num=1000 + table_cache_numshardbits=6 + max_file_opening_threads=16 + use_fsync=false + unordered_write=false + random_access_max_buffer_size=1048576 + log_readahead_size=0 + enable_pipelined_write=false + wal_recovery_mode=kPointInTimeRecovery + db_write_buffer_size=0 + allow_2pc=false + skip_checking_sst_file_sizes_on_db_open=false + skip_stats_update_on_db_open=false + recycle_log_file_num=0 + db_host_id=__hostname__ + access_hint_on_compaction_start=NORMAL + verify_sst_unique_id_in_manifest=true + track_and_verify_wals_in_manifest=false + error_if_exists=false + manifest_preallocation_size=4194304 + is_fd_close_on_exec=true + enable_write_thread_adaptive_yield=true + enable_thread_tracking=false + avoid_unnecessary_blocking_io=false + allow_fallocate=true + max_log_file_size=0 + advise_random_on_open=true + create_missing_column_families=false + max_write_batch_group_size_bytes=1048576 + use_adaptive_mutex=false + wal_filter=nullptr + create_if_missing=true + enforce_single_del_contracts=true + allow_mmap_writes=false + log_file_time_to_roll=0 + use_direct_io_for_flush_and_compaction=false + flush_verify_memtable_count=true + max_manifest_file_size=1073741824 + write_thread_max_yield_usec=100 + use_direct_reads=false + allow_mmap_reads=false + + +[CFOptions "default"] + memtable_protection_bytes_per_key=0 + bottommost_compression=kDisableCompressionOption + sample_for_compression=0 + blob_garbage_collection_age_cutoff=0.250000 + blob_compression_type=kNoCompression + prepopulate_blob_cache=kDisable + blob_compaction_readahead_size=0 + level0_stop_writes_trigger=36 + min_blob_size=0 + last_level_temperature=kUnknown + compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;} + target_file_size_base=67108864 + ignore_max_compaction_bytes_for_input=true + memtable_whole_key_filtering=false + blob_file_starting_level=0 + soft_pending_compaction_bytes_limit=68719476736 + max_write_buffer_number=2 + ttl=2592000 + compaction_options_fifo={allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;} + check_flush_compaction_key_order=true + memtable_huge_page_size=0 + max_successive_merges=0 + inplace_update_num_locks=10000 + enable_blob_garbage_collection=false + arena_block_size=1048576 + bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;parallel_threads=1;zstd_max_train_bytes=0;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;} + target_file_size_multiplier=1 + max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1 + blob_garbage_collection_force_threshold=1.000000 + enable_blob_files=false + level0_slowdown_writes_trigger=20 + compression=kSnappyCompression + level0_file_num_compaction_trigger=4 + prefix_extractor=nullptr + max_bytes_for_level_multiplier=10.000000 + write_buffer_size=67108864 + disable_auto_compactions=false + max_compaction_bytes=1677721600 + compression_opts={use_zstd_dict_trainer=true;enabled=false;parallel_threads=1;zstd_max_train_bytes=0;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;} + hard_pending_compaction_bytes_limit=274877906944 + blob_file_size=268435456 + periodic_compaction_seconds=0 + paranoid_file_checks=false + experimental_mempurge_threshold=0.000000 + memtable_prefix_bloom_size_ratio=0.000000 + max_bytes_for_level_base=268435456 + max_sequential_skip_in_iterations=8 + report_bg_io_stats=false + sst_partitioner_factory=nullptr + compaction_pri=kMinOverlappingRatio + compaction_style=kCompactionStyleLevel + compaction_filter_factory=nullptr + compaction_filter=nullptr + memtable_factory=SkipListFactory + comparator=leveldb.BytewiseComparator + bloom_locality=0 + min_write_buffer_number_to_merge=1 + table_factory=BlockBasedTable + max_write_buffer_size_to_maintain=0 + max_write_buffer_number_to_maintain=0 + preserve_internal_time_seconds=0 + force_consistency_checks=true + optimize_filters_for_hits=false + merge_operator=nullptr + num_levels=7 + level_compaction_dynamic_file_size=true + memtable_insert_with_hint_prefix_extractor=nullptr + level_compaction_dynamic_level_bytes=false + preclude_last_level_data_seconds=0 + inplace_update_support=false + +[TableOptions/BlockBasedTable "default"] + num_file_reads_for_auto_readahead=2 + metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;} + read_amp_bytes_per_bit=0 + verify_compression=false + format_version=5 + optimize_filters_for_memory=false + partition_filters=false + detect_filter_construct_corruption=false + initial_auto_readahead_size=8192 + max_auto_readahead_size=262144 + enable_index_compression=true + checksum=kXXH3 + index_block_restart_interval=1 + pin_top_level_index_and_filter=true + block_align=false + block_size=4096 + index_type=kBinarySearch + filter_policy=nullptr + metadata_block_size=4096 + no_block_cache=false + index_shortening=kShortenSeparators + whole_key_filtering=true + block_size_deviation=10 + data_block_index_type=kDataBlockBinarySearch + data_block_hash_table_util_ratio=0.750000 + cache_index_and_filter_blocks=false + prepopulate_block_cache=kDisable + block_restart_interval=16 + pin_l0_filter_and_index_blocks_in_cache=false + cache_index_and_filter_blocks_with_high_priority=true + flush_block_policy_factory=FlushBlockBySizePolicyFactory + From 2311f9388dc5bce06fcfddff640753d5d658bf80 Mon Sep 17 00:00:00 2001 From: hashableric Date: Thu, 17 Aug 2023 19:45:49 +0900 Subject: [PATCH 021/142] feat: removed --- rust/hyperlane_db/000186.log | Bin 535596 -> 0 bytes rust/hyperlane_db/000190.sst | Bin 2005267 -> 0 bytes rust/hyperlane_db/CURRENT | 1 - rust/hyperlane_db/IDENTITY | 1 - rust/hyperlane_db/LOCK | 0 rust/hyperlane_db/LOG | 304 ------------------ rust/hyperlane_db/LOG.old.1692109095866656 | 278 ---------------- rust/hyperlane_db/LOG.old.1692109129283399 | 283 ---------------- rust/hyperlane_db/LOG.old.1692109142543801 | 284 ---------------- rust/hyperlane_db/LOG.old.1692109595356629 | 291 ----------------- rust/hyperlane_db/LOG.old.1692110322000479 | 287 ----------------- rust/hyperlane_db/LOG.old.1692110678116635 | 284 ---------------- rust/hyperlane_db/LOG.old.1692159212672457 | 287 ----------------- rust/hyperlane_db/LOG.old.1692159337379204 | 303 ----------------- rust/hyperlane_db/LOG.old.1692159630683428 | 288 ----------------- rust/hyperlane_db/LOG.old.1692160697660985 | 288 ----------------- rust/hyperlane_db/LOG.old.1692160774841732 | 286 ---------------- rust/hyperlane_db/LOG.old.1692167576188502 | 304 ------------------ rust/hyperlane_db/LOG.old.1692167598179047 | 286 ---------------- rust/hyperlane_db/LOG.old.1692168714159548 | 286 ---------------- rust/hyperlane_db/LOG.old.1692175657441236 | 286 ---------------- rust/hyperlane_db/LOG.old.1692176419380884 | 304 ------------------ rust/hyperlane_db/LOG.old.1692189150768832 | 284 ---------------- rust/hyperlane_db/LOG.old.1692189358189015 | 285 ---------------- rust/hyperlane_db/LOG.old.1692192433499495 | 292 ----------------- rust/hyperlane_db/LOG.old.1692193518543053 | 286 ---------------- rust/hyperlane_db/LOG.old.1692194047418516 | 286 ---------------- rust/hyperlane_db/LOG.old.1692194265436485 | 304 ------------------ rust/hyperlane_db/LOG.old.1692194380428441 | 286 ---------------- rust/hyperlane_db/LOG.old.1692198883938429 | 286 ---------------- rust/hyperlane_db/LOG.old.1692199165312346 | 286 ---------------- rust/hyperlane_db/LOG.old.1692200969793725 | 304 ------------------ rust/hyperlane_db/LOG.old.1692201117982925 | 286 ---------------- rust/hyperlane_db/LOG.old.1692201158741632 | 286 ---------------- rust/hyperlane_db/LOG.old.1692201400366330 | 286 ---------------- rust/hyperlane_db/LOG.old.1692201634076738 | 304 ------------------ rust/hyperlane_db/LOG.old.1692252384108942 | 286 ---------------- rust/hyperlane_db/LOG.old.1692253121310466 | 283 ---------------- rust/hyperlane_db/LOG.old.1692253194212630 | 290 ----------------- rust/hyperlane_db/LOG.old.1692253295513730 | 286 ---------------- rust/hyperlane_db/MANIFEST-000187 | Bin 1230 -> 0 bytes rust/hyperlane_db/OPTIONS-000184 | 198 ------------ rust/hyperlane_db/OPTIONS-000189 | 198 ------------ rust/validator_db_osmosistestnet/000004.log | 0 rust/validator_db_osmosistestnet/CURRENT | 1 - rust/validator_db_osmosistestnet/IDENTITY | 1 - rust/validator_db_osmosistestnet/LOCK | 0 rust/validator_db_osmosistestnet/LOG | 278 ---------------- .../MANIFEST-000005 | Bin 66 -> 0 bytes .../OPTIONS-000007 | 198 ------------ 50 files changed, 11011 deletions(-) delete mode 100644 rust/hyperlane_db/000186.log delete mode 100644 rust/hyperlane_db/000190.sst delete mode 100644 rust/hyperlane_db/CURRENT delete mode 100644 rust/hyperlane_db/IDENTITY delete mode 100644 rust/hyperlane_db/LOCK delete mode 100644 rust/hyperlane_db/LOG delete mode 100644 rust/hyperlane_db/LOG.old.1692109095866656 delete mode 100644 rust/hyperlane_db/LOG.old.1692109129283399 delete mode 100644 rust/hyperlane_db/LOG.old.1692109142543801 delete mode 100644 rust/hyperlane_db/LOG.old.1692109595356629 delete mode 100644 rust/hyperlane_db/LOG.old.1692110322000479 delete mode 100644 rust/hyperlane_db/LOG.old.1692110678116635 delete mode 100644 rust/hyperlane_db/LOG.old.1692159212672457 delete mode 100644 rust/hyperlane_db/LOG.old.1692159337379204 delete mode 100644 rust/hyperlane_db/LOG.old.1692159630683428 delete mode 100644 rust/hyperlane_db/LOG.old.1692160697660985 delete mode 100644 rust/hyperlane_db/LOG.old.1692160774841732 delete mode 100644 rust/hyperlane_db/LOG.old.1692167576188502 delete mode 100644 rust/hyperlane_db/LOG.old.1692167598179047 delete mode 100644 rust/hyperlane_db/LOG.old.1692168714159548 delete mode 100644 rust/hyperlane_db/LOG.old.1692175657441236 delete mode 100644 rust/hyperlane_db/LOG.old.1692176419380884 delete mode 100644 rust/hyperlane_db/LOG.old.1692189150768832 delete mode 100644 rust/hyperlane_db/LOG.old.1692189358189015 delete mode 100644 rust/hyperlane_db/LOG.old.1692192433499495 delete mode 100644 rust/hyperlane_db/LOG.old.1692193518543053 delete mode 100644 rust/hyperlane_db/LOG.old.1692194047418516 delete mode 100644 rust/hyperlane_db/LOG.old.1692194265436485 delete mode 100644 rust/hyperlane_db/LOG.old.1692194380428441 delete mode 100644 rust/hyperlane_db/LOG.old.1692198883938429 delete mode 100644 rust/hyperlane_db/LOG.old.1692199165312346 delete mode 100644 rust/hyperlane_db/LOG.old.1692200969793725 delete mode 100644 rust/hyperlane_db/LOG.old.1692201117982925 delete mode 100644 rust/hyperlane_db/LOG.old.1692201158741632 delete mode 100644 rust/hyperlane_db/LOG.old.1692201400366330 delete mode 100644 rust/hyperlane_db/LOG.old.1692201634076738 delete mode 100644 rust/hyperlane_db/LOG.old.1692252384108942 delete mode 100644 rust/hyperlane_db/LOG.old.1692253121310466 delete mode 100644 rust/hyperlane_db/LOG.old.1692253194212630 delete mode 100644 rust/hyperlane_db/LOG.old.1692253295513730 delete mode 100644 rust/hyperlane_db/MANIFEST-000187 delete mode 100644 rust/hyperlane_db/OPTIONS-000184 delete mode 100644 rust/hyperlane_db/OPTIONS-000189 delete mode 100644 rust/validator_db_osmosistestnet/000004.log delete mode 100644 rust/validator_db_osmosistestnet/CURRENT delete mode 100644 rust/validator_db_osmosistestnet/IDENTITY delete mode 100644 rust/validator_db_osmosistestnet/LOCK delete mode 100644 rust/validator_db_osmosistestnet/LOG delete mode 100644 rust/validator_db_osmosistestnet/MANIFEST-000005 delete mode 100644 rust/validator_db_osmosistestnet/OPTIONS-000007 diff --git a/rust/hyperlane_db/000186.log b/rust/hyperlane_db/000186.log deleted file mode 100644 index 979c4402688368aecda288e64edb7401e5646f22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 535596 zcmeF430w_bAIER2Hbq)QF+x#NktK;+iWFr@(Mk(Ki;}GQk`@lHq>FMM!1XGL8>&Rh${Ypd2O=Ym;F;AMn=;poamu?_N!Jo579j4w^EnJQ33ms!1;2pvu1oThVpk_v2>F*jpHG#rHIqAb8vH6 zvc`6~y`8nqDrei3)=ut@HukQ}FW_TZ-eRQMe9H4Mfb|F#!o%V%t$JL~w|BF~jvCbi zq9bn0O-#7W%{4)B=-kreUhYO8nXr<9A_-VLyoYwjFfv&nZGu7*+~~ z@)z>1=`Da&3u{q;mBNDMAZ=A>2Vm8~LU>riOcz+)8EQGjSNrPfNaeemJor~UP@ntl z+WfMHzBy-a3Nc|Z1W0tl^!G5V-7=F_PjsAg=KWE_tJ2jA9IY=cU)0gE`mVoI3Sd2h zeG$Vtf}#99auXg7U_FPmD8M?xg4I6p=#?}8>jf-?hm~6qcDzwlV{@6ZoMcK`U8+E1 zSYhk=*h#mPDjc;S`(-s(24bf~Rz(LI~gfVB0lX%Db>9k4EMEA#}g zUc$bJVWnaye=%xX0+t4`0{dvwNt z^lNJ7>jKu@HPEWH5udqW|2QVBG*YlQCT@XY`5E1n=B5YTpMAhL$mrvU;j$n7ojPDW z6MTCCz-okj5yMKuQ2t)Nj%JKmuV5_-u+mttLJ~C$H2|#Fun-;=mrVFBf5o}FwI{+~ zt?M^Jtg!H-&o>8e;obvoh$)2_USPsHN(vU~)WIqavjec+z`lrK9mP=o*2f*10${y` zwJ5+k%7XRCqIGUHfYk&G;bCo>Y4~7w>J|G#t0Q)mi|T4GUMWp8Soda5uU;k}CXI?% z!-SPi4i?$eL2TT{`2f~C*cUOZbPVNBvr^I!z9%&5iO09G?BgomXu z*=yCQjF1mQ_CyDoyUEHbJrrnu<;Y#Twlrbx>Z&`QOjsG@V3AE7WX%#609Y-sFJf33 z7|New_)9+k>jSJs0agYJ*5wPqmB|3sM_33COD)@fcdNen`NkQpR?c5*?F=8+>n<6! z*`avEJaYwmkp?ELW29h_P94OX`egxFpI~3au#RCUf1_e~!vU;TSc?LzW1X<(bGMeg zcL%UO!$NpiPm>l%zH_si@Nt)Q>rkhLndLQsSsDSsi{~$JEsneDZN`LkoD?h?+0-GR zjN2B#`U3kRhIJf6`D^nCRRgfT!dety9cRHh_{>Z241m=J3*ljDta;U6G`wFFcdpMd z0acDL^_(3KWx3z1Nc=pgDRcGu_e@wP$iX6;I;iF^y98i;gMAUhI)S15=~caJ2C&*; zEefzsuwd1$9eijbfJI}ZN#H|xApK^8&WVx){b?zBy2_%}bwvkz%R2YdP%FG%%z5Hn z{_TBCSSP{S=%kc%>M&uK$72AC1NKD>>m-KqXTCk{6M)4DYf*r8vJ;l^#5kW(_W&#| zSP0*;CTtPeQ;=_aGs|I_e6y!e&WKU1%Y3FzJbC5DbHDo^s&6x4ogxK`bm}lAvv?zb z#SQx+hII-<`I{sq?*?G;z*-bwonpb-uJ%Sz48Y=rh48T6*BE$jugEI-Fr?)3u9MoY z(+^%d-tr-uPzb&xJQG#J3@1^Xg~bs9tYds0@y$g}uhEefzs zcfwkre&>|HR{)D27Q(}Np!1^iP~ysyd&;+PDOBa!n)I1>H$pu>m+#e_WyM?8rZZt> zl7mGyb*MaVk_TW3z`lrKWnw6QQ(x^B1F!^PEefzQS+F*}DBL3gUjk2`{+0Ic4yFJf3(7|NgM zv59K|EMZuS0<0_+tn*o1Z{Gk|BCrr1*1;W*i_H0NJehQ~a@3&a*EuGKEhh+&<qYm#HB1Chg#Yu(rp6`%#VB;|+tZZ_y$fgdvpN5

2*qnP1v7746S23CgG^aC;gD*_HeV+9OMy!>;G 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%0A4Huk60&5Ec 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�U2ql&w`jT>rF>4}UJ%p`2T41+ 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 E2m8yWSO5S3 diff --git a/rust/hyperlane_db/000190.sst b/rust/hyperlane_db/000190.sst deleted file mode 100644 index 4079f5c1180d83d1b18fab1d9cc7360d0f9abb93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2005267 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

px19t1z>!*T0_$q(|rY z;}Em~(OaO&_SxP;W^e9nYT8%cPi=AZ1JBK~6MMEOo@0Ak{(82UyAnjU_(iTuoqhoCAm^A0fv&bPJ zl=|=j7ou-FaEj@)lw#wP^rgpBaWtkdx@z#U#i5~_%?Rf$FB2WX1+aes(sCl=xR#}S z?TZog#WJjn*+l8Mie5<|;j*xg@!X+C{qH%cnNt?oUrG04B|;S(NEL0~N$wQu%UN@< z3k27A9qLE|j}@X^G3T;YHK>t1s9Ts|X;2H(gvr3p^r>utmv>AD7H{F<-E#uY=7QRV zEr=$RVDu*%E4|qkq32O>6t!3^Bb=ACeUq!fUv=ebS`KwJ^0)7DDkD#QjBAArso_%$ zVTL@P_)Ro5`{4tI0?Dwz8+4@+Kx@nSo#-Q*Zltvz`WbQr)K*CB9OnsqY=f*{UjJm= z0%B@4SS|jS9;WkC_`w(9&!4H5g+0mO_eMt0lEik+#FxcQfxm0W0-Kq@QZ71cii>R2bTZlds5hbNM>p3$@#kPc(nDw9aW(Wx%sGM zRT{%Xq`}x#2~7Wk%*fKMQJgtl6TJ$OmC1mS%}FkfmQ`i}EpPc-{ETiqe*z?!(CH+4 zTcRIZesb8%Bvxl*PuCxcmf(r+oRHaD31o)JR^72WzzG#Y&xl}mQS^K;YFtPyZCI9$ zsNM+zw?qtRPiER(6U@_sW`y9g2kbp#o@$c8;XR14vDY?wXkQ)w5krzm?}cwwZ~BIQ zuMU{04<1KxaHYYkN>38KD(zzyTVTdrURcKTU{vxxyw>@`b8yK))8Q^k&{#6X74Ugq?hO2wryyZm*Tex)JNy=%u-0+MWE``r`Mwxv~r_ z{&9*)c!~*nJ~wEv&G6}GAJe9avpnJPvQ(_IIEp~Mc=TZ|THV{b1M3bCQlf&DzsAS0 zG4>B{sCAv#i-|31VV6n2_nq%OPS|~|f5ohSjZvYc;|=^LV^oAnk2VpKn=}elm0@iPd?8HF_i$#ZA_O zpc^CyvSouHg-}uVyM~lc^3K=X=Ho!6d*r1)J@C z0y>ljJRy+;2%;dNgDB=X<%-k{RTO_(8gx`FPfW_Y?F<0Q#qlHo>p2S189T}vXOcr_ ztsa*DQgSoJMmXl4YXUpMU*3pkfJw3Fq5Q=f|1w%0osnek%aw zf^OFlFypMO(k6H`*3a1p!j*rDFRc84nY4iHy=2iYXJ-H)XNRpjVjG7?z_`sfA zBXpD%dycn*_$=Q`lT9JWukl%^zFLT?U}i*-;(r4%D#X(n? zo+|Xxbh>(ky{f8nyHC0^uwVMofb1Ibtj$&gj5c2qvihf1b2+Lz*-dTgeKl9IGM`9J zLBtc%hrV(P9@6Ov{m16v?FmkuB{haEV>?yYWLk!s%bCZ#1c*RIAq1YE1l@No33cK& zkDe6i-7ZBzxl~*ZLHm8V-uPI0jJ=~iD7EG`E(Khz6ES?xR;$;|PV{d}Jtu4<-yd8P zG<^D@S(mS+99D@Miui>`*7Z5mWX)-)6TsmTF8|=lf!m1vR>kA;*)QSrM+D$9Amp2f z;jrfD07qTW$>LWHL>in=eh<2@7|eQQ2_9UG#036{^*CR_$v+0XYl5#>R!NxeTMn_~ z26$0m46G-Y(m&<9&U0lYL)v3ccPK~?*);>eiNFtgMWOJ9Nk~tvoXg9jWKAv@ov>4V zW>P{IF3pyg z#9U7C=$*$Jggsp;Mfr-?^K(^R@!ntO_tVF;mnuvuMY|OR@$3U|6W0DUM|^DxZN>@a zXt**z{`zElF8|i@@|7F$X_wZ%%F;)Sqx;pqu=2dWE)nZ)$n5Vjsp&&Ac?82jxsAtL zN0EqFQ6JGZQAw09&_x0hInYgRz*!xHOLNQBIm3IRXT`W=m-5Es08K_}e6(ut1L<+M zQDsPUvIgI;+uw8>c!}WcAEXgCe&Q16SK)pF-OQBjZOi@)uP`%S=r1=xx3sLj8*Tt)jwz?>1{2j`7{Gf@4BHGq*Lm!vg^ zw^Ix#GebKL`f)Hp(6oy1RZ89q_Lte-eRz*v(uYw!9IE<(pN`wVwsm#9_)!^*JS3qI zCIO_7;9of3dv2WztO&4?h8*$$f**2;1 zj|bPvrT`5JDjfK)rHoI__3Zu=av%|B8TC6VbdvhM3d_@s)j2tju)Y=X_JLP!sc6mo zu=cmX>9(By@8T1plL~BVE;vGXfoKc%yfzh!>^}67e1YGY5fN!dS9$&yHFovy$M%C_ z+}2WWyKqkE99!mTVZ2`9W8*mQ$5=RZ&fm6{{-QsCjZ9a4!%yl>hPns(Gu5iiUL<*@ z*=25X5x+%eO>x_K1YqnFI&uINO#=SGpy)VC+iO|*Jz2<0;Ws?Oc`8PvjiRwbC3k0xO8fWeuOx@Ejhe6z#cQx1=xGe9VrT>co#--{Mu#eRM4X)Cx>13mRXss()9 zf{S>nvg>4K=0m(kLFbxXTBUjo_NV7#7rqKf^f33KZqzi* zq3kq?2pk_T^(qA30^%XJta%{M0`Asb#yz8ny&L5_g_NPb;Lnx!Pi_J%-)5+u2UdPn&!ykL6wBF#RU8uibEIx}-g@B&`Lk=vS z7NWfPKAc#*4s=G5iRU1vp8-4jyKU0!`!JhKwScniL?F&2V><9Md+qZtrLGv zUz&ai%^!M8V}&xzQ&)j=RNWR5Upm1s4!~599f>b{By4c)f_C1|pL3FlQ=ns#ZG0a} zZhBtR9r?|3^o~Xj-Y6EWIG2P_{9 zN{%)#NsB^nRh68$*hD&>N3?mF@)oH-15}^SIgWZKQw}~5rJNbFO3&MZx$uuECOzXG zmDAO~LK`xr`{rKY7^R~BSH%tRRute7VB~-;ji7Q%Gvn@$L~$8~d6bTxpWEyK}`1GfL-SSSfJ8E+`N7%YE%kD*cMulXCt9Zj}&f+FQjtpi*SezX|;uDMw z{@7BR?744c{;K()Z$ytI&fT4t7^K#pf^<}B-55qNv5O9Gg$~->$zZGe*tY!pn~7S^ zOKZooKAm?otJI%NGPhYnohfqeV?v9hbbq92!!-I1tVpu2d z6B!LTN~-*1J=5{=z@aE$ff8@*gP`fku?NPe0I?0S-2?GOQ~qfCPHnzCDgms+#)Li= z(!!6loRa%YV_(-RO91Z=%{BFb;Wa=rsst5;<=lXov+l@+RX-ycfSvj*%Uq2(5IjH47DoE4|wpls$`(i1I`mcQK-cs8~&75>us5b`r92w6(vEd*aCBF717M6 zeTL8^8zNZiyP1D&jTC0pv?cj?)5-rAEE=pL{BR#i+ff6`(!u53X^B7tUp4^I+F|ix zb7n@4E+T>ZBdr{qf>BSiDIXCd1&Kw;7`Wtx^!Os-i_6swk;-;EyW)nc6V!`lE(=sO zs28iGN!*dF<_HEa5Wwuee{HuP$dRr1Pa+g?Ec}nWnkQ0*ZA2Vs#1v9N2q{8HXR%gjpYP1X z4B&|&vs9Ip30&QyF54N*{!=v;mS6exR{JGJ3v{JIM_=1*ZGz2QKg)E8c= zU13k9>gObk9$_>6^m&mbu1q>j;AVk6J^V+}3)nx>gqOU6YKjEUFJ2&{du)J-2OrddKrvY$ z_I_h&^cW2c2(wJJd?c~hF88|VEWNcKl-wU1+fm_~srvG;14 zhMfoghv?aUy@DUpJo57;Mv&DWz;<~b(3UY-d=;rvcc`G>r|Om}tF}jr%bZhP^BB}4 z*_sq6z`a8hZ-ILUZ^K?exW#UZK)=wwOv z2)sc+A{%hOBru!HjnB-!CV%4`>L`y(tzvAt!d}{vOA&O{E6nHIzP5qEu>m^*5}c=P zG{xH=oLD(4g~`#&Bd&Ru!iG(}Y4QVq_ym|Sk;g-N5L9enNEPTo{As-6J8x`WmMMw| zmuz{EntgphIPmt1msG2-&`t1CayBc%&W@h)$Mqsn#^&d4qY?C}oW8NoA8d{Nr`jv78tK ze@SWZZVrg31Y-e7jh0{BB*ibI_qp0nF>JR`25)TrI^-^%5kF*I0$v{kqA;I?C<=0# zM2g8$GLUM0B(hQ{N}zCCsG%9T+|sZz9^;ht#gunYAQALh^|khegq2`VYTaKPR=WajN@ zW9^R3cu1g(Ahy8JlJ*yGt?{5ILKi+ClBX|kU$0*k0uaBz@ZTTy`n|(%2SEJ#|87~4 zgpFrpOTWvI;!qqYe^_|4jXVldY-Ja7G2P0MAOE8Q62JbpmQ}QCSK0-cYB_mro$XxG zyYW*&_tIAk#qfCd{c*FX&!88MZ>RqIcWe<^N> zWc2nLop;3nwuL~=4f3CU))0RA7ej6?Zlg77o0ZU`r~yYEqgQIyLUXui-OPOQ5)Zh! zFRUQ&RN`!z;n>qL;UPZW0NRBe=hmMbKR55w zwn=)!VpjiKN)|W;pT59YxM_0uA9ig%Z}Oe4z$%G4?+_goSh4Wa73uB*TMwk{`?I0E zX=kTBOVEUGG&BZHW6Q9v7jH2)P(@4oG~bm)*OKkdD*)ZGuC*?f?T%ql*2~;l@e}c8 zTYc0S*)QJaL+d^-Xx+Skit>LMR_jH1e$U9TrXOWOiyE)s+&0fDWM-Jadvxd{p7S(I zC^V;oC<)B$7{dr<@}%Rp8hp6w)$sE9Wo*b*U0BH5rmn zMJ8N|wlB}|p*w!-Rx-6FP!N>e@E8^bbr%}m`QcnqE)+w<1T(}FSbjW2Z+ogcUv}Ic zdO#+)hKG=mk$#;E$C3*N!g!=~!rR_K#*XuKwcvd^6}unV)zdcThO?+($j^%(3!R0;%d>zwkD;OLrFlB++W(b~Zzdr>Y=2c|wO!B@3TIU0)nQ&I=6QTAbYb|dKFm-6w z8o)PE{>2;;-b2?=Jke!dku{L;lTjY$o$%jZ313@CLLzt>?tuy3Z$JSlAtYdp*Tx;v z@P&%`X^MOu8GK>fQ?!(NA0QIKEM1`d0JFLwtPr`^O>cZxlk}OI_RBg#GGyzI5i@I? z5k3j#!%gMu@N*aKilGvUp@K9rH16^IzFcfZ&>xHeXe9?Yv(s#Z784tZ6C_%h;oxQJHG1$=J&aIy!faSnQja7yNIxHfreah2z zzh(C12v7ndm^?qR-dEHSt{hT7Mgh#K@xkRxq_5?OLLay@2AYic#!r@mRaV1~ zu4Boe4Fkmv34E}CGx*!w1oBM8GfC>tJU%!RUot8_n{jyLOuXQb(TO>T{sk3y#`vF1 zrW>SCp%u#)OZa~(7EgyEA934c>_RIQ>Ej&+vIxnX#37@H7+kUN%5F)Y!SCl6;(sm4 z2H%Q+0FvPUcSs}kHhz$k^`rn^SogCO;wYizJ)3F^{qo|s?Fm_PY@Xu(*O2z|hUbm? zT+)#VK}Zvi6YY283gIBiTx+KA)JONR)yyDUl>mSP(;Ae%@O^CW#Vhsx_gu|1r!>zj z*3wO}B>M|LBtGCwX%_?1MQ8x{1OtwHm`S(2liba(sCtB!#<;j?^055}>Z^S#LflWs z12M!#OmdJnU@`fj;}L*cEVnw=L^Q{byLkUdQn#ccwbj4=yc~t?$+QgPRicH(U*LHo zxvs_|GMywCzE^BY5>@l5`G(dj7|$Y#%R{MM!@>P>h}2&b<72q|UF2+*#YYTT8gRnp zBHzjn`*haTEQFFDd0XCv2Ot;jOyV#kl zPVLC+M;9&Z|7~hz&<2qV#E}qfAyW0Ss!2I{m$8yh?>^hTJx1XJlxF?X^AZ;hl zUap{fs$HxCxF;kTc3m|QbEYQJ zgFM17(Z*DHgA5PW@)aeybVN6$l|E^2=R^T73({s18O1N#XT$OG7T$ig$@mNOd4^d< zQg~{)0Z-w(LwViZ+XoJzxOhZi9ErO~NACNTiGA}U)n0Pp@X0qqWRkI8@*+RnzI~8} z->cm!JJ^Shf93p=MWoUcm^9_YH>!v^*qq5jUQB`}>{@do&X1O#4x7p6@GK4&&Q0sQ zQfS(L6OCq_z{Wnn2*kw|i1fuzmuSy}*!gMoq*Sq1qAltUiFu8>Y?`tGx&GAqm_Kt)lQyU zvQ`MpRw{ncrtxhRZ*>ry-9Y9x%q_UR0@>?`%^GtIQwaGE4(l08?NdH4_rkto-sgK57MWJ<=|B`t5f8vZQ})wp!n9A?sQ)C*<14}ZME#e9)UE)3&BNqpN z4$PCIk(X9`UplPeELS~O3lq{7gih%GEJ-jb(ixw{{lVasEqa4%Z zuamuPefY7apRI=!I@{w`!rUP3Z^W!_`2wmI*jrU=AP;?GSOBE4CkTqf1Wk^7w-$8m z{X_{H@oDi=^mL_mF+?P@?gRfoi89g^08;IyB5$UGWYunt1Z3__gpftSBG~Pt z!ytVO57+wj+G4K^xH1d^6PB`dI2!F66k|Zs0t^cN;Q^XcO;r6SG!(&nrQUL^lOnDUEbe(9kf*CQ3}BS-p(gN zw>qB3yvuxlwW!;h+Z3Mn^7n zRdWrC$}d_p5Q1cZvl#f3*LFqZe|Tn6IXCIrCXeh1i_;1PaH#X?!|Bk3cp5ZMQx-R04v#CR&ePUYtTTDz zzkKo#AE@o15f(Cg3^rjpTG5BL9Uj`X83K>+hb3JA+Q083Pd3-d@wKCA**gwdq!K)c zLD{gR*zudpM^ckEgUz-**$gH5AMHp#eP)V~7GE=rQh-FDYk67Ei0yJxK7C zj%k9}Pty)4g@x9d;NSH8SsnyDeF5K(WV8*HkH~yiep%;*ThPY1Y7P52E#`W4oUqo}MPvT_n!dSCYkZB}z(yXjS9FXt7J7Gev{8(}e(Ai3E; zV?4h1V86cpie)j$ULkVvSTf!$q)@zAMP8{|g3yQ}vjMzyx(Xqp3gkyGs7H}bkXqqI zqWpg-`|dz0|Mz{z-dlu_k&vC8k!-SMD|<)gF|%crJ+ex&S7b-_o>^rJNhF)h-|L)1 z?>?X3_cz}CeL9}=Jg?`z?)$p0`?`fw;u79CUV_=IX!+FCVbE5{ux(52@vyH>4 zJk_@nR)cu`^T=zyMyt&lF0DNtb{)lvVmJB3E@Y(qIN`vZtL4Qh#-hm%fsfwM$fDgB zacKOuzls;X-`24{h5u&6CE$Z2-o7dpt(um_npnnCB~gFl)oL&$a=2?VcXoq-lO~fQ zIJod8*k~kIV7M52u5gyNVp#9<`sgcc0@{w9wX7BD+Ft2oeShYQCnY^H$=ZC5-&%_6 z`wC&Vc1=aeu-;MJafm(}+-n#A=iI_f#Aak3hPsLR>s`y~F@AbX|7=1DXDE!i2$RJ2 zYguI%C)qPZ5oPoofFF=vz{=Ex1iaz>a1XjC{e75(3c<=rjTHPpSBi#m-)DE-#JX`E z53zxGrSQwoI@U(&-<$-66ms`762mBHTb6G0lLy~rYUIHMnHFsIi_2an{ZNO0kc9L- ztfm8$MuG;fbU}t_{K-;YVcUU2dMFP3cli#$kLoelz4gRJ$@)ep*GN2iY}1ToeP&dg zSZ3%mBq?@V&;!#$$S+{z;2#{@2<>iK z&z6`0klngqu;AN-eGv|(=-Q4={2@kmZbmwK5k?O&kf^V#+a;BBZ)gV7AW=LO=LYwxSK8b4_A8zm}cVwYfrnMd{@hx+igjr2$z&O z-fkcK*~h&geR;Q6hIon3cmVMZVX(K zKx2$PfOMBEqe4lOid5{&&Ks3gvA_*zVCgdrw{vOj;c$@mAz%ZR_bnqsIbOZE6ZREb z+UxUacim4ET#Xn-=%DKKU948MJRi|J;Nu8Hhm~c#65oqQ8{XBk!;?^@@og%o=G zE!KSt#V)$uf5i+|!okOZfeR+A$vXxd{9#Bc&l&P4e&@pgXIpx8m~jUE!4Y%Zj1Cwc ze>CPH&Ek%r>cNXEO$>Wb(=H+7adqTb?l@SEU)!bI?k^>f3|T7lN3Yxt!I~!=OeJJYBfWRawtjG9RB&fuVH0QImoBv5I!Q-v| zpN_jfS&ts6zn>8l<1+_gln)(NdC~Z@W>o9<(2z7wPM;!GHL?(@2DL1fQ(&jjtU0Li zb%PlfxP~IImqk=YEq$|b>TRaf+lTLjY06})-3aK1r2_{&5?nzl3OB|G6?nMB|DKL! z`}H7aROm*pZZD7cwQ0yLl;5+3>o%I;V{phwxDwpiBP95k;82f5fb)*5Q)ZhqOCpq* z$><$D8Vxm~s(Cq3YG5|j@lcd7h+Hu@^2JGimUYaNG~ajOX9}UE55RXJV_reVguYIH zmr6eM@FXIIM7L7)<@{=IG}%e>uB=H&HLJPUFZi_97TVh_XfeJ-li9AvVZzk&Tzaj< zFDnhZ!-t8@vOy_%S$sWNh`(CueVf}m=46I8xlg2gm-K9>x_Lv?&fkP2CC>CJ`sH4> za83+p1vWd)c-fTWEq>C>`_ubovHeS48+NLin+=+7K9Nly zjih$nWbm(B43X<%Qy0?0XHR2@f&hz7P6XLIwz_Gh&(Dc_<vogRQts%II|(uR6&W z3P*;EXpcOh=n>9biZ?tY#J3LA^Mfm{qyn#{` zmbKCn{Kn}NR7(u%YHlxL(tbf4F2|fBORis+An>3i^4>3C6U&4Ovsb1i{!HP%0P*LN zXXcL^?==_gd^pIm=fkqipdb;{P*rldA^1Z)N^%N}O7*;a~5e`CTTR$9JSD@-It7gfZ)~Tj{6A&(4ap zanG5Rk}(60Ir}oqoPN!_oQ$lLRFD}XDeYg!yWso&3vi%pEQ%+#F*Qk~w| zdQM}CJAR4ed&VY?Hcx*s>DI@fUFS8rsJ8wha$tnqAFm7kEoJv&zB`g7-?SzNp$45Y zTyHRb3K!kHhr~LmWEconup` zSJ9JzCkUP<{M7xk9ajP0$ul&viSRRBsq4!_j0pZV^zDR6tovKVnY}B+VB5I|6)20Z*mEySnFZ!m$%#`#EkAcZQhN7ZGXAg-R%_eG=?g4$BsHdC{!K&3P!k} zgzE>M*Ea@ztT#+TF@f|!Zo?B<+7s&G8Xh?p+-B*03+H1;bapyaDb(AO z+`Y7DOm=+F$8!vXZ9|o8B26VCG!~PH^)Gu;#K`smI#&^GqT6C-2nJm$>2YW># z>L$(Ex+kJP1}DOzD+F?aGsTYU9eRHaTPSK%SVW#ZYq!4FqMtJvRa*iKmwwyM7l#JV%pYXap=rN-v?^w*CBLFkJ#b1*Q2u!JZRsU;x5d7%O=W3s-q%_B^6cWRXYDY#c#d| z#DvyJSk^ATe&tF&L@r%>M)$Ekm>cJbbj$eBHxpgX#<1k3q|cy=d50SI4qD7jeB~Q2 z1WDOh$Au`P$f8=Yx{uHQSM9@l|vR4`ti=YUp5Qlpj@na32v6TT*grB6X^zJFB-5pIOJqI?@2y|LQ?t(H1z9800*4!99UETQSG=&HU(wL_ zd2dPy4mJf=?gg`+a@Vwr{?02QUiD~pWI%SlOj-d6z8S?s;c81o7xTi$xX99c!}rzB z^iTRp^DjIVm7hNi0nS<#1!fg?T$+cjFBE)uzioJiQEO#&mDYc4Js#SYM5uKloU3?= zR!2xKXV+ed&|$E>Ll?o^5SzqTNqr&N+BY_MHLbXCD4~V^4fa_UG7Kr{FtI7)1&OMp zJYSJmXPX;svSUK;H>r6WU}`V+sVuRQ^)rcxzHst5)xNq;+v73#pWFV36CvtcvvQ_`? z=Jqk@brOvNxM~AMRp{kHMaHgQul|iS6CI@|^)^|Rc-;e6q<$vLCY_|S1^#7bQkvA- z`1@Dfp_k;~U)Du1y!s=hqH>m`Owm`3R>oeHh|lT88fG4MowFBZms7GbS@$CPKWN(7 za1?&9G0>kFBy~Kx+Rk>0iqYB;wbuI`nbh`;_?p`lLYSGd^Lb zo9(fE5b9~BHaVQTMcM%aox3ObxK6*gtNvrW5V*2Rur!prbmpYqVhY{O+xMs~+asBM z9U{1!_qd%!n11f^^n#M>ZrdV-hekD49+SPVjhiVHs8V(!B{)RKvOu=8U)>s0)UtdSR6UM4=})VB(F zLyt%UZYjE=aa>lhxiuiz7i-yC(lk z2uIG8cf@+@I@%*C5>vYU;0@Y|vy<^9iF7@uX+-V+3L*NwF^^(B4^7f@oAzxcRFjNL z3-B~jrgVO|sAKP=?%(v3E}iGL5g=6HqT)B=Z7*W%SJ3aND(J7ZeUuMe_%W>QS_M*IWR?cZEPiU!4b+c+|T0vEwWfl1+s;oU1H zJovw=QwZNc-*G_d$^DfKYT}Rsp*b9sllFfd{O{_&OL2_%C2qC(EZNpa9ok=W>PoLMdKDUXsziHFOwl;f2T(nD&wVdG8P9#Y%1{s(I&`ALl8Brk>>q*dv;~2D!H!Qg zKb-MJTjxrvR33bmp*y`74X_*T%Y>R8Zz&Ox6#BKUTg4)qHfS|J3~ed;EoSYS)pSN% zF#?vclb>oSErfA8D!w7BKWF=bvZ^|3`E+TT+k5*xnR?CT1%l~GfM!?AHNWl&h~)Tb zl#WTZnMM-(vD#1@%wOHhw$D*;tp^$M#USV9)>kSr2kV~Wywopoe)sIEAC6DiRWhKp zE#If;b#D^Qr32z_B4ij$($sn-%lgNMdgy5A9rEK<048kV{ zQ?_2eK{(A+XnY)LClgPdGPEqsc_Z?0PI)ENJ~MDJKM@buer==WZ$oeW!bBF*DU>JT z7|EBEPIn?N;2&ScqFSBkj1rGeg?V$qi+uhH$)usH<(5t!A2mMMM3*`0D5LG6g^jYg zRmX9t!_1ZLU|+d|4HYqoq!iq$?}A8~E|%r~h*q$oymR{89Z6#IF=Yb^FZdk1aW7Ao z4V7?=TdU-1NqBqv?3(F26IJDWi>gpw41$8x`>-R57}Z2Wxg6EB08K0y`S+)+8hNd1 z3UKQGTSjr+yz?_vjrO_NRs8|x7bLNtqXh;dPH7%>*iDYF(`=sqUu6_-U7tF(NI9r5Ygz5wD^{B&s!!S4{85EQ0CA8bxEU3R1VCqUCbdsFQ!Uo zKcpx(uwYo(-KAC#i&W$P=EeNT{>7J--$g&wY99dR;Gzk@ivlCt7H*t;p=~kVQQFmv zIy>dc+nx`I6Lrj1mh0^A7{;!;3NtS>uZ4aSJF`YvSpV6x+9CCb&mOhIeDi6RI12W7 zLxjXDd|)et7+m=Yk?QCxPHy~_m=0lmRUX{Lk`b@TCwVAPJS`^C15Dm7v^S+_u+G^A zi!6HIqE5p~`kNQd!-9?PY+IgmNtBYC+b6XpZ-rex31VaMY;+D@DjW-DFq6rP*)551jO4n5|WI?bP^)qOWDFGBYEGN&7KCzNIa3^*;IST8_{ zNJp}dEUJFlzRIhv-XZ?^s#l5_@-Wl9;e2R{LGV2yu#%f{BYhL%3gr~cl5_h7sR>p7 zx>p-n!OXE7*x$C`E5?X-HK2ISd{ze2*9BB-c4|X9xkr_y+kqq}cS~bD4Onv_qJ*mhSOe;cR2ZZ}o6@#Z%ffheX$K=2g6;_oonR!do;S9fzWRU@(K zaOnmp-lnFn3Qa^!z9lT@XCdH0!@r~oz>il^?FTk=_*SfK1&3RiD)i1ziMv0Emqs@j zh}@=7CjJZBH9o4-(?ssXrI|*){^A~zu)N=uuF0QbEsJtrvpX8BTiEDF%kPKkER1hF z-52ex^SffXZT*3k&iW_cPxUhH6ftrlu}Gj`J@Q6|(Sh`a$oM-&114mf|unxb8%V9-cZ;J#5|Vn%8v5Q4L}L zh{#ib{iUZh5xa`1&i;=H>C)xhMSBtc9OO}Xn(;`Uw=+t=MZqP)anKu=*vKTw48mo* z)bZ0P?9jvWN1U+R*DsTMZxmX{FISYIVygeCbbW6vg^Lp*j~^zc-@q_LI+!5(;i_@1 zYcr{Guw%K|6hHzP1_hJY|4j!XeW4`yH}w^LknhLmZ;)vy`y^&YMjAuJdhL;sy(T}M zB*pYYJss-)A9P@hPOejy(^qcf!?;Ijbd0V#v7Bcen;6dJ^UPB2T-V`rAYut9LInZR zZ%^mV6kM4^pmp_1U$4X z^sY^8AZ?9kmUuX?E@^ZC==#cPOHyaFy4I-fE7ur#D2IU$*N8imyFtzq7of zNg7k|b|P3+CRX5`3k%a@J{|lyv2JcA*bmK(1zw9x$w+U~t&_i}PHDMQJGpoH#}`d^ z(K~FWHy7r9d4VeYh)A@;0YlnE(qlDe^FD`9QP>$J$m^E!K zR|3Os(QYd#**g~%8me8@bjTq-Ne|g8YrgW31T~4IFoialGV%hd!6-JMN)CKuOG;_z z@SflVpval+qSk08G6uf&?(&$t#eUzm>k=gpSvmuxdQS8^YL8p)&qooQQeojgqOM=% z=WmBHsD?~#IP-ukeGG0Bz<`2RCcRpxPq* zgA&Fw$w-HDwvlWl(mk(lZQbf>E5GOIk(i=XpYzg4%xJ8%EFFZ z8_5e_FKGdAuegNg>RroqS<+_HO>Q?|<(Rxq*(_SzZ)Rz%eO>x99f&3Ha4#ry-A;an z>IvQgpCFN>Yn!)LHnzbREGE2y54)*-qkqtR6(c+h4SIKPE{15Xur=v-c=0EV%H=W9 zUFsF|bdt1>%MSya-d+4A*nv_W;347Z9%O#}<}^h$E#VQX9O+2Als4&DG4}B?CV~Tfu}V}F$kYB_C2D{A=rli5EZgx0N_W}p{C$RY zH$NFsvZTf_oQfGGaRem{M>H=Yrzq@|2VeJ@E&NJHvE3s(^uJ$Q7Z23xQwUz65CSj? zFTa8y*D~hT@S+CMd3C##pT)7f9KOyVZEV=CK_pK*M+@3{c^k!8#Kl-H<=x2s>c7>O zH|dc)vGp_p$SUTHdJS{XU5KknnhM4YK@-hh71}h=p%7KA$t_crTr5jj(tBIqJ=A?n z@$QldnY>mi-zC(6m#GU)!ljk^pf^tU01~GqMu?d{xPE#z*IXHe=a$Z10!}{yase$4 zqB*Sg|D+l2b#MK4CrxIg=(TklUccFt-t2|>KA#V2y9Svb!AXT%dCkQxAFEP*V4`vU zT|;iLy>u7DPB!wF^VIY}^4SN}AjDhxwNIUd4#(JO3hC9gw+ZWHdE)*<5rZ?t$=si| z7$#D|lfp%@#&uaO#MF~vB%V@7wr;Rm&TFBwtH3E_?woB7VZx+5OHn|O2#443*=B{6 z)EzCSQHu`0)r#HPXEu>wYDe{XUM>(Y0m$8F>Zb;N*GvSFF|9_i0S7{an6>&-Q7IDL zYWg?!fDFeY^N$8Fb^`Try6R#b@*9qpr-bNnxC)*|y!J42i}^oSR3L+7B+)Utb&i63 zxS{r7p58#(XhKXCnXfn&LeXhMkkwg4W_l5LumoY%4qy!bR6Ddxv+7lyVnf=p@4nqI zq7R6gL5r-}^6;3erp&r424+~<|JJ$z&WVo8;ep~c_Klt{u04;6_b+Q4gdlAvy~B9e zHLO4My)Vv#FT#3A%FkbK29p0#m{h_2^lGWyn@4^|_tsvcOUl3bwIKcm7B=8#TTy0q z$@WF@Vm6;?;(qj%9V@10vMN7}zsf#OGg6YS58#O@**;x6p%yY7+FbPYf64jg z(ta5hz8`$$u;wSk)-K(%CPLx=RCl_44=X~V-e_&Z@OII2oc~KlT3gF#l)+FeP_p|; z66ctY7naQzA+@t!jgd8?y81y}!1eqoOm*;#n9^G0^k`I*UQ|9lyt>rYu-Ib7XxM*Z z2VHyZ1^x(PGyn?~W>jcY>1~j@lImCzk)Tr@i~KfN^x4g(A8w>&Z}U@mQ2-f-$eoR! z&A8^y<_SI^@>ip%J)jI62qU{A&*FJr8etlr5COwec(u#I_TSa6-SdOMkHJ>DR9)$3 z8%*yS(pkCO@wIqeszcBl5=VQ%^G7@(`;;8evq$P!-RZu%lX}`TkGhuTakMnu&YRe` zBVP^Ph`&ofaNA#eu2T7lYtv`Cmb;3AzG=M^UB^q1xiZE?-Wh*+-#Bd9*bi^9NXYYhbSvFe#h&3p!Ro1qWf~9`Xuz5~=u2gm z0Es2u`13+CKUy=kynR(3o0lC+hs)&YWm5&3mjDL#+=1+CtjXW3Ilrr$$uNVHJHBm~ zB2*&5vzmFjB?Ft*=q6Ys09X87E{cJXLq%6j&859{Rmhd1l!Ycure*rO8P-;|ReIK< zb6#h7%x#E5SVUbqr156oxqY!M35+)hqA5gG>vF$iy2aDpxhfn~DhECV6FIv~S&;m+ z$57yky1t*IFn`yI{m50Fx<##BE+srS6MB{l;md`k;xoHhN%FTKYqzYET+_?X)nE8j z2TZy4WG;)8$#&Q(LAX;9sI+>OAoN2*v3lxwJu}Y`-=5Xp=~YRefk(Q4Xw~6HjqLpZhQ1a2e50$T&JB^=cj}bqOO}@B6|0os@ka@h^ez&H0q8I#H zeJDE`SY9ymLEWug`prvY?QLfm&jvRFMd)7j(OnML;_&hli&iQ1nQ76SHvA|C|cS9{<@?{)66Yg53%BuG9 zJ4Y7WWbiZ?=)GVM0gqSs7C9<6P^xoKg#DPa&#Y=Gv4K65EW*gVft9knTt~1{G4TMGF5Wm19L@&EjAPUOR$F z8HMLuOl(3?{PnTS{sGsEJ{;yh67M~%YbE4Q!9UWPWNQkp0=xixewdqO|0a9femEn> z!WC^uSy$e73y0Pc3Ljk0-7MG7pm^I*L=97f3Z~9vs-_g56+8&K75zf%lk6+uyYqpQ zBHc_2U&r*;K+*%Zys^N?L_M?)*vEqkxzPyT`>kf@^q~x|){>-qv!4tpocSb^G0LUA zii7j=dqo|xUc`3IbVu{DY(HzrjErt{oX-^rHrpRg#|hDE0<~ivti<{cTc!}Ato(oD z8OU@mKWbIU89&qSJEpw&V6MOy{k`!9Rh8Y+JY6)wo0u0R)&(H_@3u^up9-lR?OOvq zsx8-_H#FY2!|{47t@?(YIi2CC+60X0v0bPe{wOXUDK_bmWDvMy&o<5{#mqdPzxw)R zBh$D0JVx*96VUU4XW)N9n0x5N&-@=|&MrA*BDPOn&m?I)b-^(dap%p~XJ8?zxU78O zrxqshgC2d@XIgojtWs0E9-Ngzcn!@W02MtL;~`0)4#l=OxV!M4z0c#dyZzV)7%nfp zAE`bPxTChj8geX%w33PWEvUeA@J~@g)Ox{^`5kL)bl~>dR7Sbm2Rxxa>rM14$0X$A z+jchXF4v9)`@P^n8y+EHs=5#)L{t9R`t11JlOe^$gh3)#v{ga7nSA$tYN|rG%^w!e?WW&9i9V43~VRa_lM>bI6AI?Lr_3M(9r~Furx6kz$)Ar3w?ck{us5jyK&dXzYvE&-RP2rmu+jLuu<(fF=DG7R7BHg~COJ^o9 zi*b1Vn)#bSY;sEHvBs45)9j>)OtCuY?%AeRPa;2VlIby`zf$;|lRhWlanWqOIc>j< zRPUJnjC?O3AJ5JSukXdz8#*9`XG9HSgf`p9TJGzMH7+kQNty@{8kST+&& zbh(5A*y1B%>K9^rLLOdW#iP6N*O3fq{UTmId6mRFtTLt7vdmnA0}chk1mq5Ez653h z0?-O3X`gbqp2X7V47RUii;f~0EFAV)=bY0CTbe+&(g@KMi7XHzGr*qA{l4j4ZpP-W zhtC{;;*q0tO1e(Dj$>bPCbz+Z@9qk&R{=Fl!DV4pg0D}nn1GYDHu*mL=U;rRKIr^` z$m{tx9}*DwrMyQ(yyXnlt2xtGOf?}N_{lsKnyzCCmN`dz4Lqoxm;Y)_45|S*5xHi@ z-d0vIKi?c(<|`28b{u4dt4xxcs~`EWdu6X-6_GlxR|}edtrnFtajo7OjpEuCmwfW0 zTq04b^J>x|6FoLKxEDDU5nw^X!EZioAdEv6`b3!XwvGCsMAcXupYY?RgbF-?XStCFnK6xR)g3Zph1UMg}YMi-~#POE^bt?q$}hE}~c$euSjGY^mGoP|ad& zM=F^rJ9<+3tzb*#JuI>8MDOl|a#|URING z0Sv%MEfoXGTZpXu2+ait*bD$ zMjX}T<5CVS`~I^Jgl2j_#%kjQ#jE>A5V!Q6LfB|Q$@dl}8G(>N%ho=RZ(3dJpRbB* zVidj}4mkjajtMo42`aTplt4*4g;$M^BuCsguV;ewelNsbwofByJhS2hu+~DHO$B_y z?_GCVQkT#&Snjs?zq(52a0W%?Q{5a>?NGJ`wao?RcS9=&+X6+bOYY>&$Xq?aez&wr z-aPSl(l^9Hg>#0rOdxZD!;o2d#4Oa~#q9*?FE>4QKdEdytmdZ{6xBehHjxY^n+FdZ zk<1z4pghM#fw~4dYUKaQa{Iu*-0>qun(2pz;?=asg~edG=AN+yMsStzv*u+oMDm*c zu6~YR*wDa^%1#yfq(n*5jka$w%AYxlM8U`4XCq(e`IO9P9jOF2dOjE?f(l5-QECg2Y9wPFv@MNzaj3NQotl!n+%+#;gm4OP z!Um=grYV;=22F0lx^2~aYC%V$JJfsaS_H1oEvUu4>bg&wIINqDYusE2;UEasmq3sa z9j8q!f=AV&MfbUH-1_ysUa9zD z>)9iP&tF+Ib&Ba!HpESVi5|kk7pAR-(IZ1qnm;tH4gDp2l`RXfjSo1wc2(W%BP2#B z*1l#1UG5!(eR9QT(o~()D8*k&`FA^yA!)is)0sXiE&~b8wY|f)GJg@=KLq#%xTUWv z8%OmKA#XSfZ(C4*&zl`L*ju_6p6LhNv;SeofcF9{Y1a_gl_C|67Ne5Y@WT+RP#X1_ zTBcmn-+Zcww>TtvIdD0G1YPTCY4;AzB(Y7VjxJ9tA6aFssx>XnxLxy`JXBm3Xa+Y_ zP^?v;JLW&=W7@W&S#NZb)5_QpdFeOVh)&zMa@dKmzd!H33^548jTx2kjvTGXt1C2z zRvriCD>Zhs-|0vh)nxh&`}|%&KwAc8?hA5M?5^7jtQ}(<*PlS!I};QR$TpjXt6rg1 zi&X^=%s&ESbsZPg7vhwFUgJNfgy3$wEV-qyR71}bQDd7NVcj#-{fXmL_8k^_!VD29 z*k~NWD@GZ~w+=ppT7hxj?5moDb6(na#{txn1?UaKxZtUzES7Hb+nwZRq7ZITm@u80 z!q!k%?`}5H#p9srICg=C>5G=*yjeXug8Tu%B^z+CY!ZVR~b2 z#hKA>TVmx|2d+D3Esxa_yMw@w@82QZrns;(vVRQ?Dzn-mXTTO!O?t9f!`f|F?z?r= zPiT=SnK8v)h(bRMzz6OYs-et^bVOW=YIS6Nrei4ga%(0en(5~oQ1zT7 zx4B>m!W@eA9MqM6Lm-0o6U)_r-46^}&275JW90O>^=dsk`;Q{d*#YvyJ7B;<3yfI+ zn!ro?&hX8i<%7D>w&xmnL#DhKGK!<)Dg%%5q?{M$)j^zt=UzUu63u$aQ;oHEqDZR? z){Vb$hkZk@lFu)2AZm--XGZ+`h?y=muKA{}nbiRL>qeVO=id_hT&4vkj+X``F_3{4 z0BmuAJ)DHNHxf2uH@UaR6`aiHDg4o5jQcXXMziF0=6HoURzPL=cT*Zjo-)(igj~N? z9%5Q&9PAc`cYLpaXcl|sec|ylqG=@p=1Pd1_4V%tOHJYF5D%p5zF5TV$vu3oK7I!t z%9RA?V>xfA!EfQjSmlIf-+9`+U2X83cjZVoR#1JVz_%_{&!g>g6IWg?2hh>mAd(yq z4svVyMSr=yl70NiUzQbzz*{ihAdOROls~;NQkdV32GARbG|KAIOAS`^gQdaDc`yA? za||GyWZ54-n)e<$JBdFnnmG8a$_dHls=$^evp{fx6`OM@-a3WIjX5uX_0@gs-;up9 zG#iNb**Ky8y4P|MceP=lGGCuX^SLhZ(`<5stQ*9&DJtU&FI})AZy_5!DY`_WAvPyv zIo;-H6(rN0rsoaBH)C{eU|BI4m;a1U^wS1%enh$ZARiP(zNeV5=df%>2?-`Vh&(=M z;QCUscBJ;i@q3QlyN_jz6Pww~p%92H@SY0DLPo7ga^oeqXjlC)U?O_Leed7YQp{_Q zYkzH-4z98m$nizceBf}vPc@z{ zSQYjUdEjdU?|k1x5-&pcbn?dYw0PeCein6TiQdIqZ!(FXI{0CYQ8%!-N1Q7#VvD&6 z402FJc_6V=hwoA9)1z1<&E>VlRGze7Z}L`r^cT$FeK{rXBp0YGxvYLVhHjFFoWR201XW{d;rQc_)os3FikS`rvJ->p&fP3PsvTEe#jFK0;Vbl zq~6_E*94OYpz=YiOQ0FX%+B2P8U5@V9D7THcfCeJEkOKtPne#NPpok|OkxHPfAsN( zcQC0HB1==bC6Mkn8|X?h&MC;s{2~eAP#8)yxO{0qNMnvhC)<~mVd^02yRs=gSC!0u zs!^@{4(g3>sduyI$$uc@3OrbIG{;vBXqdQX2=#bQ*K};Nbq{gq*8OhD{_&AxUC=YJj#B#jcq%8n-Oas`oy+-^p2e$@1v{E2hzQ^m+U=waYYqP)`l&Hl$zF$ z_xfLR;qxB}O|6-Ib2vCm;i`;c`s)Tu3pCyQBI(f?ge{fne5HPjT(uXYSa3QqoX%A- ztpcn#zsw#H8w=$O7#{>Zeb$h4FU_meI-=IFoNmRqTS38fzeO1`#k1E$R4d@K&2x*iEb=^fP3j4HK~X=&G1>@- zMeyv+VgTZ6hz@(Zm0$jRP-%}WV`Ynm-&~*&NmFPN{m3FtyXG46@`UX=aLT^`qsvnd zHRm=;3z=XLTXrcQWxMH!nPN%xY3*CLR>4>w z6^ID|M+=TE4thr;*3g@8yG~u&>`GhRN`l>>2Ulo+qZ+wm*!s6!-UD#7+|m`Wx}^%9 zDoV1wdL~u6#HLn1o8hlC_!e}#a#+3q41^Q#k>9+oVL|e}^2PH6t{+ET7gY^x;o*%p zj!EN6dPv6tLLq{cKE?veU!YMa4_4`C_Qr2CC0n)Q>nuoo%*lba_y&8siv{r}>VfzQ z|I*l-*)N6TAXfYZ;|vPXF=>%&R~F_bSHs7iUHceAs{o!n4H}H(OToK!n{Sj#7SBnK zL;3zS``zp-;kD%1pD;=>UL-pTN5Rt#0}RB^^m-qtXx5%kd))=U1HtnyA;*F`w)nf_ z+s`L^u}!qpm_wattjSot^FyEY@-Yqf&y_@AM38FKUIH`1N&(T#=K*j9c7)t4E6!xD zmJaxSHkttEpZ#$HP?m&pC-hvwjtDsyewMeos3kZXIS-Tndno!#oI>z3-b+co(nrnEw zsi!N5cmbMtpq>vg@bA77_-gi|@%vl{#>DM)G}0h7e{N|h+w0(rz~7VRny@3KrbV%< zdz@WpibzeZoj+d|J;doPICy%3&g=|+92|*xu#v%ULVERu+61Tq|AYFIs&k|s{ujem zH`}C?`9d=!Sn?=Yf0c9*mXBRCSZU|ua3rm$!>XamxP+^Jl;kkX`7>-a-V+p~B8m3Z zAxYq!E)`dA%lW<5YOD7LSJsP$>YLyH_plYLjrC6=J)x<|l_ZbpZ+31QC#->0FYX)@ zR=m!?KoQBDp>5C&OQbI?mta#`C-|ugdq`8Sp0aQ~e}*Z?Pek9y&B8m9b9nQNO8v+S zczj(HBk(u<0A;ddr=Nbnu2~H zjKKyqOa#P-KXd6#lo-mA;T8ED60%c0zgF2XoEvvnxLd9R(JY)hBq4bwd|z;Ik}8O& zqA^6oYTJl_*T>d;K({+Xd7aZ7WWn(I48Bwlq1~g(M-e43r=wBzPYg|4;Vpl_w4%Zg z{R!gkw~W7s1m?^P5V9Tcx>94G_{y8}PZKXmzGAg0!EG6i@IU=5uhmZf$*Mua9>hU7 zGGB}+gADh2cmPg6uPhOj3=boVYT&P!yslgio{SI&hsEKwg!s$w0zS!{V~Mu4Aa?`P zC4~Ow6q@6Gp3xm4i|77V+!{)l>m~m}4VE9Sl?6IRR99tiDu4A`SaqiRGwHoMJAHqi zm@#?)Yq-M!i%YhnPO`A1>pA|%nNHWzH1xMaom?Zon7h69kdldEwzMj6t=4S~r}}jC zTD})w*}dwDUb*=}<5OkR<5;5~tWO7Tw?nu&H=d)0J%>tC;}+WttSj)9x=%+v*-TAx zZF&Vnzil}cJXO);R+sI{Jb1lnD-auku{YA9{(z~vq9lOaTc2}ic+$n(+N)rE{|A_Q z%Z0#dD;CLPiBO{*7FKEr#sLkHv3oD|vWU)iT{=s7?dnk`j4ozZe1F5|-ef4lI(UY$ zC5e9B-@L2DP4!~0Kq8FTG3N~9SnHQ|0HCTa7Tn#xx9CpMa6I=#D?Eij^5kkucfqUN zALO69#0;xbz`k9g%Y8L4nKRIC!%kOP2F3>RKEWq-oD@r;iWAjS&_+M6w{M&( z@qp`P8v@u^o6LMr%V^x?6w`ChI9Qh=3-i;PD>w*t69ZVv-ooGq*3E)GKwj4ymqH5K z*j)K;$u7b*lXY-s$7y&(Nby^#>F_b=@*%XuaN`k}q5nTGpnjD7_YRpBN~@U-8P6w^ zX!B(6r7K6U*7Ar_>2OGQU_-fbs9|z0mNh}R>xJUjQN&td#-~9v?j{|xyB+y8g^U?% zB{*=+wKw=-1NfyW)dOgO_B=LH6wU6~kt=AgZ`U3PeXag2(sve&#sMa(tWijsOzLP@ zpEp?)8?4&jx#p@{l9A37FWh@%6}oTBmy2+heu5mSOL*NW`2C00w|kFy(`h5F5#t0* z?YE}+APZNDUz}!NW%#*r7NSDcFC*X|C9obkFX)q{yfqXHtkiIb)o`Ezm}**YFiDTo7pM>1 z;-YNK6@zHq1~QW&mFU%v1i>n1#C&=Xi}{<-j@hu=%x5(I)(<=3$5z#)E_0b5^;GA0GTEr^921xA=W9-a78Y=>1haw9D}UXy zq1o6f8nU?U%L2*5iA>1}rYs3CNVC(ZErjJ$%$Qf0F`;n}Xk^r_)mhH?mqMFPxk??j z3+F2mpRpC0;Dz0}{S;gvd=w(Jb&;=_`~XWnClT_Y_51^n*)|Ya^*(!J?xYfff3e*% zeYJW2p0B*2G?hK%i5sJgKT-)UJ3D?hdXHehOdMDof%vYhL#p)*lw57nsvdMX2LJda z?Xj*f*;HD^`_h8CGUK3%BeJHYuyXq;u*jaB(J;lO~hQzUZ80P60(^v2%;1+-dLYTq0|4!Y% z=_yGd{_fGZm(Rx^!p(!Y&d;AV81cB$cA${;Ubfeq!9bwz9e90Hbt6i^r1J{K#C}9f zwSq`!HU7BRqG$W-arYj_qe3GHk$jMMp5jz5eYKvHKraT;eNjg1pHej95cVq{Q$`DC@2ms?{_%+WSs`VS2OS7|^#y{|&lw6Ql&;KAB@r53PfTf822pEGa5-QPh zNd>{5DXg~|i3(k1VCG3ZbxNQ8DvvFt-M@u|j9E0I8DHbNW32QRQ}D8c0${jd^k~8x z(}t&{;7xh1CysBR5hG#K8IN(QDT>v${UZQzFsygk`8H+YwvNMm>s6M{jW7{Z_8F0r z$!)#BGL%mZ5`G?aU_cTk3unEeiq(Z~&WgsFx+&}97w)7+DCX(;a_b1k*0VwP##^$n zBU_jz-JA8wLB14e?1!&QFT3W3v$6FGzL^~!@p0QT3==%29CZD&7leikgWofAP1uVR z@|nf|)>|HHiLdRnzVD6(_QK8XX+qRkFOY~+@I7`~$fPd@by3&W{)6ds{=08oQdCzN z^Ys0lC95EKHe}PV{i#4cu2iB{;aBn@hS&n71QYN4^|(@JFK(!D2uIw*1xu-I@S9;i z=Pt@$W`nF{u5&)cCCx!q)lK#3xsrvJoPTs!ACEzmQ@ew3Lsxxp_wi@!Clomggo=9Z z9AkuyI$Z?;q@-_rCK~I8*)9remj@#sB|cpdTzZru5!sHbkWLYPG`<(|d)t?KM(oFa!D<5GgVuWB4#G>m3}e*m4^Jw%&+Z#q z`84Cid~4A-VNG3sfJdmSsMGi4f2vh3Oj)!2Vq`RZA}y)bD<5m&DDv6e2*lw{M|D5) z<}ee1)WA|>ct(zpb%6Ku?eDkv%4G~vwVFjYLWAxo98sS64)))tTXLQ3V*C9L3=@@3l zp^#SeG&aRNwRHPTcB6tg_foZ5#dtBso>q*PW=b~!KcwO07c)q2# zG8$MuY0kiU#Bf1itL9H{`qD>Xjz38ZWdbUmeV`fTPWM+MC&+rsyPAR)Rew*SVAg0=g_`NF_5YZ-LWCp75TkPvI?_w($M zM1Q6&!8?ZE!Y>f%qKNq4r4hY)Sv~4_ofX74dU?2Tb@lE!5Z*Pl;XVEdjlfNNV*%Px ze?7>5=sbW+=Vbc>6*G)AYF(OfD~;Y!MDtmB*}w7yq8Qx7=w^Y}5(lFHgNFm zGKzQSW^$Uuv)EZ29g@IL`EzRv0#%BsUMx%3c#0VOz-fcSrUGpJA50=KbxJq35mnW7 zcwXEn4S8AQ2KjI%Lt=u_Ng@Ry8;}N11kMQj4)mr{qB(6YD%rwsHzX1wVa1)MjABlu z-mLwYK+Ofd7G9p?HG|6l9YBPC!_i|&mQ4Hvq8d$Q=P$y-+-c7GA*vFk{#A9EwyG^) zEaL&2!Elc+0sIOBdkb6fU) zrH)za$d}ckafyd8l{-QX4jV9EL58xE<}OJQ@Oe|Do9OQ+*`* zEe+h9|H%*sRt31lk?U+M@(q7!T$mG7rxfNKQewmKC)h4MlHyO2A=5vKf?FkVt1igk zR!(MJUlhu8e-Oa+?f9U z>Am`4t|RB|IK0E}yWrRYJ2DuMv5CF*c^|IO^aEoWL6l5cnBuaYbA94_e?k+_7zokPr5+KUe7r}6 zJ{X)I^Iqq#|G=<(&%5e$z_t4LFt3uAC}VqzN2nd_hTm{Sv37;(l=<50XUZ+@WH>+K zQF>}bULf_3?AV?*kGOS1ixPy{3-5cxDs`|n7QRXy1`bA=F zWx!i5rjPaYDOt23c*|cK>Tox6>*FcA1DE?;b2S^*u%baGePQJ1c$PL-X?i;{D%xx@ ziTCZAAJhAF(t7tAs9Irtx1tq<9Wn6-o3o4KnZ5dycu}{q0IZa zO;`1<_zUqbt8z1ghOnzd`LFjX9^zLgngMbn31c-0S|||Fidv;HAjUzP!KuLal>bb$ z7JK&;-yM(LqF$sP1cw@!b71iyLGU*~i9@_iwoLyn)@8$z~_EyL2e}G;Hs-7Gqh>7CMmdzfwVTdpEuq zadh=w+!l~{!-}e@b6tY_<(6MFZ9f%87o@e}G{=k)4-Xj$s_fuQJ}xACc61DH6n)Jk zmP^zvW^Tj6k3ZnMXOKMQ?O^co_~An&{BIahlE8NzQ3Y`<7?@Q^FFM8fSi?nS4AOBOGUk z6{m2ysmY+?tlTaNBb%jeBlM=L?2R8J!8a;MdN|jtw%F>(dXF|Qjnw~CS4%HF8~@D& zFx&o({jOCvQ|gvH#H=(egrsih{EhUVKgB>5t1;%pq}`=)hl@)X@cT9nbC-CT_bRWiV=JP})3p6dMs;5l{h73SfUr++Ino%e>O@ z)7A$oQ?K-$qlAxlud7Fhn>n5we`tX1yNBm=>gKTNEkGK`k=!TvbT0QpU&SDLirSm< zxAgb_McG@%MHzlupbVYTASFmhr+{>e($XO<(j_57DXCp>Gr_aR z)zk^LuBfQwgvJ}-vSC5h>?oWl?zMJcaF2PAog9|{6Wg+_nN=L;ck0uDS-CAx9D`Lq z5|En`(8nH(!3jZ6zwG{Ws?aJw(YHmt6V$60+93Qi>5Dn&UkxEziQrbar&OY9)|RLo zJxarUd9U5@?JtE!pONoUH@ad(dN2mS1;bZ`_}Cla#SF346_FfI{9+MR?bX}OGPElh zOI^gchwKcV<|UzA0P$OZH?TN-Im(qgFdpmV?dFB5x6w7o2G%s&-U{-3|27Wt5)1Xp z(#8S;^^4N``D4L#iPW(;K)piEw)u71A4oiAcJy+UCq)0f|POe5IjWK-3$3Malgl_ zVMx$F9n#Bb&8Mk}{+nD!xUJZ`Fp;`58qCWh>Nv0~{q^Fr0c1NY1KRRDv#VFk3mH0+(S}7AJiT)W#%|fRd$FfRUhIDk_)|1z z`1btZhaz~zmaxf|u%V+GG-XA0x5fm2kP+Dmlp?7*Kqz0~ld^qxkvhuZhH-;%WL(rM z@q?(6zu3CZr{nXxJ0#91ym7f*jXrmyBEifC=ov1XP5Y=YMb;*5=Gl{huI!=e?8T_X zdd0MsWH$VE0@3duo}~To0t4{pZRlwL%1)6+7AN%WMJQBGT}Y0W9hvuJ2IDSF-yHM~ zjzY!+;hSw>2{I>gmo^lcGp)>m;Pg#_(bwy08q1G1U+29+|1Ey;s?7`}$nEHz?NHPU z+%?ClMaIpsnt#V>YBj1S zHXIrdlvh(ST7r)wOjtl%^`nI$8?1}%vi^*e>NE6s12S=vE^f1x)H1%uYEMxolbdm zH~X{$@P>hDvDmeT&nnig^E-V&Ed=b6}{bn)p zSx6{s0skKI9kfBunEP^8czCC%V-0T*t{d>84#5L}Kq)6#now)F%2wtsMlNN^n!=|_ zK4rkZw;pjsE!mWk4Qw9}poG|a1aab=al01ZrI3$@y$ z`I&}6Q};;k0`D4OQmoEnN(s|lC({sHPNap-AaF+DtfAdKBSJ;FdkvUEvn1pVg_%+5 z+wC~SZE}%u1J4M)mRU@>4_~h4BMp_psvrB`5sHW4*eYbLuAN;UA~m|?)&nG9mr_E4#QGOnZPTE zNCqGRF#H7iEB6i6>d?0I%xH}?jCA70GBvV~y4$E@y|tuH0bH1M;Hu#u=CC{_`Dt?O&(81*B_N!1^v;d_k?h$%WK1_C|p<({CtVf3iITVx)%uVlo#htm|I>Ckxtt|VCz9wDCCvw`zdTR@^Ys;?$HMMQ_v6hisjyhk} zfIo?VVhv1KTJ-*$@p+J`=OYX$gS5w#krXqrnLksL4p0Iu-PC*{bE|0D>79LQ z3DZyU1yyus&@8-Nb9=Pq!>kNPU+5&9f{(!&w0i$mQJUh(=U$@aCwC9unH}n}RsR&1 zc^Qao6sU_y01yhXesRNO2Q{(*68_87O@zJ<*L+i6U#mJHbq7u3?drtjl@7KJ1-eE@ zzKQyS8oT(o4gcrTa=i$e=PLhO!E7Jtr%YZkvH*ABZN4q0HM}Q}d5S$(2bx!urhoeA zOQO+Ym@RNF?@PXnP6Xde2$$}2VHgNMxS`6j-qiPf`!;Xo3R5 zsRjRbKg1-UzL1rcShf9eR_*P#Pbq=$nHwd3n;~NWKQf|5Ff6OkJ!og=fAUyk! z6w@}t=-p7hN$GE(Od*9i1O7M1B~JfqKmL<$7MJjM8{a>eL%A5Fnl#^5H&Xp`L>9es z>M(|eGn8Hx7+<2&<@rN!hamj_T^lkn)i%G7iov6ld7VfqY)qs=WtJ$#TtE1h*|rhh zG<n9vc>#^cb6!lV;C~o<@3cy(+6-D=H_#IPz*G z6}SajNp@L zP(a^qqgQUB207}>hmHBl`}mwc?LJ*G5#YedDX**7K~ShLr-nbGP#K6H5llahQxYBJ zc(NyZq)&YHNdP`dcRt00mt4|eTW0(1;=~-o|#5O&#v_rt?F*xzhC$*u)MduE_ zKdpOud?K=i2Pim*43&W37sPU%>PZhRbLyquteJ*l;>TE% ziH=n?Rf9!7#eZrqzV(9;0dE9ugNtw#mD}WLa+;s=J#-JbAi%KaV-0Eb&FUni^|5i< ztwV&Ir*n;#PbXI9=3aCV?#6c_ld z{KY&P3?(_&L(|F6gHE-PE(liZ6Kbt+D49RKYRwoqf z3P)rV>zT;VPIp|b)u?z6s!6glCJf%x^GY8no_5Mq{%( ziji7Rl9BAT>yqB#w!StPrZwH`Bq)?Lpt#CNA#N~y2M@Z3v~RN#6Wfa|;KF{ajL@a2 z%67ZEhp~)V7yE;uX@r0T+-?9mWUcSgxlAP2{FYX;(xdlCn>GzGm0Z5OGtT>3tDf1d7f*t-hX>*1_=nnurA|v&L39jn zgHJMR%?`UJ2*+Hd$)m0h7R-lN3S(zh$-&idZX45sisyoX%t-9w&Nr-_xgW<9e;kP* zrf-XFnz!@>qhxTV@u+oX5&Qi6w`VBwa&HKNdG+Ft=sc}y8QOV12B~PHky;OyIbkuOX+n}gJjC^qud}CN?8gbvgNstv>MC-ZN zGC)M(*7eQQcfI0#zDgAcrRW}wQL&&JgVnzOZqz0;sDI=?ANTmtpV$|#d-#9SCrs|i zoK)Dy*E~+8qfP`IDq>cQ9Ib>6BS*dU-0l6sq%@P9hRdVaXR5z(xQYq!_Qda9F4FcZ zgsXb8t|z>ve?U*QRbAWdiK(=H9|x<`FFj_MI{l5+wIQJDL5y)wOSjNS;Lyhglnjr2 z&6+{k&+0eH)OK%*U>*=Xc>xA?+Q3T;vjgO&73SmLj-9QbhS03qt8X&RZZ8S;w7TExY?&q?>_;d|la$^+&W;e9TGI!>b zarj7{yMQkq0;8mGtJ=T&KM2>AlE3{27J%GR>{UX0)UK*sU(BS=y8E6Y-K&u*AQI;4 zt$VlBLEi-jr2jVp5LV2aW|;*Iz6q1FAh~b($TE?|oY>m8?y8q=-iu)m2tGI<^|7Q|A=5cA4H-VgsQbiGU0|f_AZ7DbSBB| zW>KMh$`I{((O;_NQ2!#H_8yTz@cAIZ~7yZdoqJ#*q?L`a* z<+@kWeec=hZo_+z^~RK{No^4HCtyMVe1R*r%-FR598I#zo=|-fli@}Y_ra`Wjt$TJ zwbT94!*by8cGZRgYeB&BIxB{o&bTfM+$)hymcw{Cj_uQ0Tr?JRbyhp!L^biCjJWiE zFVqrC8jb=Zhqd^N|AS#)%w*Hf4(3K%lPX zIOCN?yj#%SXrsF-`@gDtT-xd*bu*tM^`Bh4!`%IZrf%;B25`>v;CW$$RRH#5$1@i8 zNi(kb(7LBPITuZVmP`^8E5~nx`N|=9L%?|<>k~RO##uPNHN05c>V?NBqan7%-ja^K z*LKlcuiYmO)b0ENhF8N5X<%~O4;xNg`O{z#&)<&B3dZAY72*H*;JTRoX9otUNq^*% zsw_M3^ReKKsES&F;x4SDCJX}nYXF7DWn0Lhu?9xoIZ+W`(Xt zR`J(IJ1_MqQ7B*yE$)ApiaL%B8}<5>}N4*uW1(eBP-OagA{5_l^sN zx5Ctwufr@q>hohP#UJAIymZ6@6DeS90gmK}B2L`d!e6aFenU1DmECh^{%A&V6mN1K zw|eeNESr6)u7DPeDALqqR|2kjO-QF_FL5j#V)R*Xi z$J95YKDa|Y%X7ZZf1ZApw&Db?6--$izl6^`RYYdEE{dY?cTl!f_iVUJ-jvsI$Mx!O zs^T0t^x@QiKrF#s0IPWK&clL3m8Wvmfy!cPIFz3mz0*y8Gue~0`m>{D_d|yBXrm+u z#0nfWEL&*5@dl?N7D??5)z#9-p5L1uX+LU0sKeS7--%Eo%i@5oz3|fPJGU7CRp?G_oXO5eLqy zrtbp!{#UO$bgDPktaDOX(WHr&x~<-hmky=JA6q5#U9%^0%nTtQt6_HPfXti08*x#d z3Zc2SCWz_kH8dclufijwnS~yqYcDj28wLax->}HOVL^9U#$0?8TlOgk7PbRt$}38m z?W0m-Zs&Qd1V)}EKtM7Hug8zP(Jx-R72eCBayfhAs*Br?RW&;QO{CVPFOH3x-sOr- z0h>KfNzDn%4>#i@OeY|^8te4rjxP^-8={E?>iMGD78k$;R-wXJL>{aso?lnm-aM^& zs^nU;6k<-Xna5%0CD-ZeH(`$XV4u|PTo_ph0LCXk-o3mM{Z$|HME)ldbRHZOl^h{% zNAzb*^R-{!7IP1)57U14bu@_Cr(Pf(+rBE35DUx^WfExO{_R!cX4p!PaxJ$xltwp07ct zTKr;pQ&4_C$sRT__21`xeWf`$aAKh1QZ&@eJhITuD~^KH{k_EVLoe>a8v zGw{o@X&2wd?}M#-tI&zB4cE&Rr?K&N>%2*tdo6+K!5u`W2vI!z?G*9Zx_wicet-Qv zw|_3xYn$h-t8^N#!%uk1AF|*5!eIyO8Q}ccZQ~fv?zgt2i8yz!9Zcu%sL+~MGH!kC z=qkAXGX6D8eSl~v!R-J+E+|Y}&5W{Kr#QVdZdG9tnw&P1YB+;3MkluG;zc+_bVYH9 zCtjiQvzIy^Nm?62A&P$1wEtp(=v2S`VynXd~GZ5TEc zBciR3${+YRHxNsZu7A=t5P5OL!(p6(@t^$Jxz*<`5T-y_aLR*l=0SCl4lPV))gRFYb3KuFUKuYX8^5=Q`V?1{ z@*U{{Lnmm}!9_3dy;h+F$WXmI><0LK?`4kdL-w^5yoaCky>2)7IEu$x^C^s1A{_i6 zfLh?l8_L(-A;45i_E&$`JJM}>a!?c7ZZ}%%J|4(MmpS(Os@-&q1hx596V$kI&tC`q zt6~Pnu@*{tvpasV3Ul2xfZl!h9k~7)8EN$7>G>XTb90hJH zpznD+C#YTLsrn-ZK!yusebxMYM9|e`4>EtkEwq9gq4jmmb#c6FiIV4;O7poJKtzie zV`%wcY@Ls13vScW_mps+`SYFZ2#QK)+)u6A5}88>%YT>navI9yPX9t?qmla z@x>W^)qQlZYeM)6-iY->tf&8m;^@WtbUTr$Vp>~8`Nkvh=n@ryu!snj(~WDx0U3W` zurKCw88&-yR~fZUgEKmBg#&GK`rU*y)PBhO!_=b#n6L|;Z{R_}Yy`~C`)^zxylaQc z`r6b!H2Q`bZWbjW+pFVmrcZMZ{qLIP%cn$uxQs}b5nT@t9O$p~)!&a-KP;WSoTszN z<pvOv<=GF@zkQKyw!tt# zKl;6YU4BZpqMS+_iSortiNzq&%}dz&zj{uGhJKw7P`~u&Fmly?8-6}2%H@T@Y`BO* zDrfunXxbk1oRA=Rn4lo}Z^H8<7Fq|4532li%Q1EY)I2GIZPA9mKSt}?FE;6zXSssj zI&AF+q7nnbbA&4bFVe08Uk_zy(+(3krB6-Bc31;Z<8s)7Qf02E#|_E3EAa)y4J1Za zOB>6ByPJOK$y2zNrEhdT{6+bekAIqAFE4)C^f`6R6l_IbA%wLMiaWcKiCO+GuB=F& z+f9snSucxe*kFF0;2E7MhtvRAsRPJEkioIMNtnZkTNn_VZ2X3F@9b-~&DLF)$8^kp zme7oGPGIdo1c^jA1G04(SHhPToi%0{b4TLMQsYOPd^duySuh6U0jDaej^!bHSBPyTaqG`?VBxgWETB!iu({Q|LA zXuicwyFVHxzK*5INCU>}AG6Cy5DzTgbbOiQd=uusR_4lNt@4vM)Mx=ZH}@&=_@c&58I0;6fEBSL7_gYnkeYRPg8gKSe|1}^ zP~?!#Abqsee1lR}VoDcC@=089GQWv?x-Ic8Vz-cbIOfAc*B3&VqbR;)a& zcT0p$g^`pH!aIodi+K+_EM@aJNv^fm|Ev%*#NLcKOnZK3=TTx)#Jzjh?vfTEAea!o zQo0fqT6?02fg;pIl=W%c_Vps&;Zw3c&tc4;Z{04m?vzge+72OSZAf6^PmjT}OHKr5kN3~=5+uT&`x2l+IB$S+gJ%mJF!`FZ z72Fv`%9UB&8lHmo9Vq{H?O%8=tC4LK{F>Y6YgYbgF9YWoT|9a~;TblXU-D$-K{&h|7N|Ng| zHY(nbEe!<0RB?`&WR9578+bj{nu>+V<#lZo>g|ts&=_j`{PpoTZby8P_FKyZYe6Jn z1Rs=7k(-*Z`B?qWnS5XPa|+u9+D`9D7hXd`>Tv_@fxx;DgiD`JD8^Bj$qVILb05|k zKC(_Z-;0meW%z9c5sD))i2m?~&u1;iE(_m{52n*xKcXA{#A5^ui!`zGh(b&O?bbNGR zWBcDmfXRdzZ~Q0q7oVSS%l-1j)#^Vl?%*ukvMxQyvTB*H!Tz32u3WsQA9+=O{ZpgB zs;Iy9*Nd(WkNQrFu?tKx=oaG-DYDjT(pQ298@=vA7VFlw|HlHWu>1MAS=ZC?8fFzC zJTHnpCv;jDEWZ7`xlZJ%$c?>ziDYotzTA`sxdo=3VN9eRlXPvucm-4NgN9orsiF>y zGRk{3>^YW43QPF-_rWG`c-3QmAGTWqnttCR^Ct5O*&og3y&j*D8Aj8!ISL0-wzZJ1 zL6iZ4Dqo!!>W~EIRs4!Y=~NAz21HB(o}XPYkcPp(Ql{6!84VDLsy_%-}3=WU>gf!-Vko-t@=gIPV1=xF_*6AP!UI!_%|9}zRF z=^7s`mH6LMpi5qe9K>B1xwZ9cz3c-cB5d{biP_(-)pW5MWPZ^=H^tN{LDbuCXkPqejlDr=>8J-H^b<^{d8pYk5TSF<2yI~;%x(NGzKajzEoLfD`~o>FA>;GtvTV{M zEsadG&woTs&wyRB+3@S5>R$H6ZH0~zJ^gij_o#QQf;y-Jw^)Bo(cjnQ)X5jZTX>aS zz~%MQSWpH5GO3u0C>i3>uGpKH3gx)jj8Qx|riW>X7_=$@Qdh4LTgM$wj0q1lVZ}nJ z1vBxag6kjd2KSYDRQ>!xY@B_$8kgN|s{GMf=F_%cI>fnnQfJR|V&8-%mb`U7V86bs z1E>gu$U-QKYz7BCkDK7}35M?D&fn+A4Ie!G)YWF*?EHe>-v!THPq0--5l;qKa6vE+ zr%?Y&^~Jhzr`O`SV)@5Dm1^cNvfss|{%&`Zp%?mRx07&s5T=WCfz7uup+aS2KHO`N z>iT@b-{R0uSl#&!Q>8mhjB+pQys0u<6t-|{1e0t8(@pJ}3=hYzn+J4o>~qTjMD%rW3Mwk&64;*3!!#8ln3C&v>lxB0aRpaXj$ti90JE_~;S zN*XLDIh)PDERkn#a0hu0^>7hdqIJ2Z-=h<$I=lGQ>a1J_$5&A!UAmOSU;Ik9s7P(TBvGM=_2#| zZsvENl?58yIW{(rY;f_20^*o2(DZlW>O2QxBfP-0-rHe^!*1;6}Kzn35RNIIgH40C0gghNYugX!OwKIJNfFZEo+|82VxY`0rTAU_&cx zBsc)W&bhAH;5tT6X3cj@Ib5`#1PS!q8A;W6M9=ONfstVA%U1(Fdj)1rp8`z@_8m7;LM0YSjF7t7H=#(&b9dSVUjuC@>j_S&)5TF=8H-s zn$MX7^kv|${;%4W3z2DeMSr&ReSa@_M0UJ|vWJeIvXbp|y0FNRzFAhACrt!4MEH+* z5FlV5Lov1s(5)UX(dDY z#k4#7C4^5f$7sbNvbej#suM5$7NHq}I6$;Lh8^~KYYX2AL?tae{(b1)OX)uM*{^-` zj}%3s=a-^Kum}o654T@Mb;-U|41T61exvM)!`H^J!*|xEq<`FV&EzEhD4f4OhYUs- zCPWPzrM~kty<@xS8E&6VZ%j6^dGS8iyTBzgUk?ea+r0{R@T?aA_I~oA}0r2ApuS2(Y#<}s5Nc(SF4y;55W1|#nPw{_*6ovVAw|GS1UiHa<%m&19el(V& zI9l{}Lg^y~>f(F!gv_@#T&cfKqzJqyQ~1=I^w;m-*cLYBmi8IlhabayUo+h)HhM*a zqpE_$^NpTRAa692k^A^JW#a`=&nwT06L?*P^^$#1WA!+Mrsj5v$=+13p4(g?b7#Hs z*N!=9DS0s4edSp}-=-2zw9|P*^@C&lTmJk3Rqbhg-JIm8f~Wcv6Hf?%iWQ-QV1A4? za!by@UzfZCX>p;CN;5r~IVfy7I3t*-=9E_p+~CVp6t+POmWoniB4#64KA5mqKeI`0 z5MD|tOZlPrso)s;=DMS%pS$&z`bY}MfC0~XUI4jS0Ohlg8pzqR3-$5X!Y1G-h`x!7 zT>(xzy~><%4XQMaUg$K%DAB<$O_0QhVop&&IL&yFu=A8ze#-SQRQt5*1PlT##IK zc*A>!Q0NWF$G_YxpSWF%hZPaBk^|x8`nN9)&W5q&oVzUw-vie zfCeeUTI~s6HwgSRaAPES+$^@HqT2KY(Fq$RmAu!P3z95e+)GU@=6!}5cAjbo^jFKQ z%-RY!T6#az;qt8AV4mJ!*s^I^xRBnZA77#H4bL;I2#TC!9Rf+kVs?IP*PWfxJP7QX8|OZ8btC23#Io z5A*Wjc?}tRwLb-lOD7+i_^20A24#*JcGL9`S4l%UR6uTggJ+Q8`oz=3%&VHTC;6c( zwlf4OPrhySGni9EnPER5OvHxpN*r@z0Hpd1km~P7U{Al!>HmZoVq#!za(r2GPWsk)D5}9jl*w*~Mn)iZh1{sX} zBdS?IVib&j7w`{Uk1M;4H$vU{^cM+1Z>;e9lQKnN1#`dJ{C{g3TqIE3{jFx}f?|#o zA2zMtb1`;0owHD#_;c5c!_TIRMdKmcWBirNvkasuL(uwAMTYawjiFzUW_KI(wWGM_ z9Gty~R^#Pd`d7Jvy}&yShd(&W2qRX$JU{aw{AfhnfugHK{y@O2_Q=be^qWpCFSnI| z@pLGFKX{Yt$H&(rA4nrsB!=$^QrTM>>-35#?xP+V_73=fyK?ENjHuxb?-$v8{p08VO+uE_nd4J@T8&4H>8Djo_Pag9 zomv;*O74f>XW}7+soPk-{Fl1zMLosMJnvw83@3d{i5w$G(Gb zM&J^}VWIRNj~;*<0+@IDTtsRKa^DLdb~Z}kOQU0K-d*xSH#>>Ta+hKStNRcSxex-y z@^-<9ADMp~Un;gPOe8F%`Y^sU)tHs^4cN8QNVR_zhvgY9kGDt+A zqC)p$LWR+X0xX*)k+ZKNV;+k#=HSZ6s`1d^J&X+V2&$W%<|Z|f0BNiddZ!VTzdiZu z2kx=97X0;>yNZqmg~6_~+RdVe79_)O?$vgH@)@3+7@I?4lu)4pO@f|w{mGiv4->5z z&E9!}w%!jwj^G(Rs!6LV z?2t{ldi0`Hr6BJ)EW+1B$@klv-U+(2f*Jun{H}0ci#~bG z^N+cJeDU)UnHjFI)7sBYpGyN;ThV^4%7E{M{}`?F(wUIp>`ne65%-NxWyzr>C3fUo zk1(cAR(t9_fW{qRe_|NS+GqLr{7d$;RHg1Z8YtuP;E@-*d}B_L`rqouI3F0+ zgW~7!DfD1yL(8^&!nVrc8I>>L*Fr>o65+n|;xop6$xK<&M8%?43Aq431obJ6_ z8S0bL1Q>rh+l+%q!#FhqIwP~pg<17q`jZYK@D1Vut3VL>nQxZg*{}g5@$Q_dOJ&jM z9A0nD9?SBd)NkZy@k^+n?V^8azIYSjR|${efesfooGj$04(C{cN(!{d#JO?~YY)^{ zXEhV7v#Y?CUt6H{P?(3ta(0+Bs`9^1O7YMkF~Je(Wlv@vG{O{C`(f@Qw3Ndufp~`j z?;n?v`Z6WF3FF4#(LN`O2ZhMbci(rAHqO=APPPomvcPkZ!6K8vf+nF99%iF9jJ>2| zk5x&&{rb)t?n@-b$g-&RI?W+5H*m-6P;Ba;RpQS=?CxwS39`7FMRen@lm$qZJR(F6 zD-;!n)?-`;xKIFr!B)+$(y=DW#%KOz_xXrOj(8;FBH46O(F&h0G{;vwnY!xB0$#8w z@Q`YL=EpHh;)5Sr&s+XrHb2SC!VmtrCq7$qjY938qw}fBUR*kG&XY}u_K;pPaL7$1 z+=p#1sH2%Motpv>$L8xv7|Th}k@ay0ZVJ)JL@quJ${q6L#Ysq^8-{f~ap-f&LN%BU zR}n785JW$B{HC3j8}wW>^wZNSGX?fvozQO$ro3Cs(8&E|;|Sea&7^N@ml*bcb+-tW zHI z9ec(u*=`cs^)}jWvZZ+q6HJjzNo@6x%&1$W&ps^a@_IVo{&D-0 z@NCGr=|ie-3170O%$T+Xcu1r=s_s0%gm-vQr(y%ZFOp00E=+|Ko7=tj?lIqPL3S52 zeig3rU%2XW_?qLt=jPBb`9eBrUT;>LE=aZKB_{EY<66@VZM>;{4Jn!v3N z<`Zf}9#`HeIGG>vpofPx$$BC)bc%@Tty7m8*15DB>fafBa8z9a%U!RNqSPBNdV08_ z^EoM9kG^U0Dr%7P5Fhe-h%kOr=8-^_to?dJIm1=-9zt^S&g`PKf4_I^ zP3&r7{$0+8f@|-cC$o&Ier?p<&!hT2*Ac1Jm7X)`OzT)dlIBkwT66Nctn4OXnCfDx z-7%q~_uIZ}24r9;u0MLwq7fI)<&U7ikQ)u&Rd{u)2?>31^Q^#bsAHQoIm?@+F_t8~e{br$GCTD1p!(g60;i1iFTfD1pM8U$CNW5Q})-Gvg7E}Lp<-gC+RTaw0go*bXZH9w$X??CVDfWCW&l^ok58l+s# z<1mXWa+(+pp(7AN|2QIhsuE^0eswFekf9AWWyTcx83{_33c?z(wSLgU^sacrVn+@? z_1x&f8BkYE!L^eWUxWl?EUVvQ#TgOj>~L?3&1C!D$KyL-R(x~Y6ctP!5F#rOLO%u% z4%xhM<1QwsJmcI6QdPF6D>*pPWMn;%!l+XKhARj>XzpZ8W!AJWNXFWyp>bmi?b~A7 z(Q(ZSJ!x8%BNLbW3;wwv%tX#3yM2AdEPLBFyl=l2hvlnLe>z^V&4o={(PunyxnJ)f z!ugj;h%ZK{8j4$w@v!IYqz$&#ktUasyNIKK+YJ&a)D1pM7blzxr1PJcTt6|P(?9Cp zCn%_^issx5KTW%*e90u6j?hJ(J7SkuH-hnu6`p*B3F)jCcjVU$$ zMVkmggdtk;cTn!>&=k6W%_@nJo3b877Cepgdszz1s>pP|0t6>xNgpBL8DUfqUEDn$mv60UZW0rFUn`G22Pt= zi52$0ZUsOf`!H2hAB3q7zTB((ZDO>9I0uH0^mEPKz=H9kzN&|d3J|1NPU7;^%>gC=VM-;CQA=!K)3?eydHfbMtw{ePruvbsSPP#l*VIg>N`KQBYS9#h)p#N;Y>Jyv;Q`VHS@vD<3EA3JB+-WqojaYQpfB=`5In@dTo_IDYFgbF(Ta z>dgAp0RuRqOL+b!w&JZ`0s84SNu@qB)7|i6rG4Gh_739dVB^uhT)FqSIPP65H>NfAoDSt~z4|t>vv0)5%s-Y2l61dfh4)WBLI;;M0@@#gQ>Hb7v5Ns!$DV<;f}lDT4mNS)!drE2?6 zy5vI=l*Dq6NK=SkGsV!=lvp7gYoFuCwzWR$`(R_myz7Ho&%$wJ6(A{8`Ssi4%aQ%* z?^o;>s8oZ>(X4Jc(pEXX++s?(S%Bwtl$8>=>#-za=aD`4L<*(`+!sWL?Pm=U?GJaw z)W@ga)?y*5wbmma7uoVpsPBZ1R@(n+e+Ls4Ls-8-liMh~4Q(p%H-guhh;@y!D&>Ta zj|A?}PW*Dm`@whwvQDt*9z=(1|1Y^S%*TFtOU>^&w^k`c1pO1GtB@SS!YE{Jl!icf zn-SwH`DxWrayYwrpIC7y((CAEP(7zU|7t+mRaP)x@5kS|`YE9DDyd=Z()b$la0x?% zoQHW>o2y7zHB;QwK~&GE)2G)9Bm+Dc%RJC`%q-9|e<|(0gxA$k&P$Qw7lLX2-Y(;X zQz_M@%#Mf_Vs)gg&Za;KRjS=;l~~Qa{cXp7e4QpHLGBmeckFgSSFVsAW@5aWYvPn4AWf4zV z<3HGat`F=WFV!I+QwTt~dUiEF++ySw;IW!~`YappeSvfs+v9~d?GIKR?HuH3N z?C54<>EvSK@YvPW%<8d;jfKfmJ`*A0YC~h0v|&LLcKgnPtpbVm{twBe{zZnHJ!4-B z&7Z>|3V=KK7Yhq?I$^Q>uTuo+=nL6-PuA9xT0;qQ1;-jeJPcyL;L6vE_fn|2tWpq8 z5i6CmP!G6f64R0N9~C_EFroFJj!<}Ig!H(Bg-esgAsesRu<*B-WcMXdDG2!_WX)6SU9&jS1=|<65fvi*TT$=dhSfVa zOx!YlqYd#p_LhEsJaos(nK03u<9+gb+g0;yX=fwe48#*c*n9urtRe4`ISAi=7H@6I zs1#KxfU%FEtdDdTclpuu?Y~oJdk~ldB6ApqhPy;f1V7Rijb%(44N8i?YqRo^b*@SNs$^nIeZhxwOL1j2(zaJ`zF z=f~;SIFv~>_wsTI^d0`(Y<%C4;wI(#`_?rk-)itz;Z%|Cbb|}DRLr%V?hy*wb3SRq z)`Pg~GLKtsJeGMT`ko&iu-q&QD6TIHFO|5Q4jgzGk-M@c$C15j{$sHhL4zXMrtJ+* zA*Te?2IuX^XUo*XpPdpOVl$2D$v*K&>&3C8!x%pm`Z|J*KqLo!-TTM9R}6lfRU4Zh(sOok|{##FHop!tAlVrvlp5S0~NvkN0}BWlP< zFuJzpEQ&0$ekHOSnv;kMi4KhHxHxG`XLRra909W~;JnA1;&iWXqZH{~ydA9H@lZzT z%X+bPUF{5|VKUy`UkOxFi2O-@2i6<~-hYY178>f}){SwQ%*ASqC}ImCb+hhn%QWcMNKF zXU~X-F{A<}_Od0OF2hs{J$26HTE81q(2xgNWUh zz&H~8?e{JEj!$`6Q%{@A_Uy^1D4nf>PR#IQS2WJPqAayif|qI=t#BJ!DZh_mBvxuj zZ+CH5x144;l{?lDiEzG}O?vkCMFa&rH->e+61Zp<_0c^KgA#@VN<-8_^)h9}-K1aO zieNruD;xq75R>rNpkCLMoVH}>&2xd&SA{;PkCM8n6@J7fN7Ab|560|LJ)^zwAT?W;^U`*LjG3VaO0gpIvj;-5Nq8D=$?Km z%XcuE1*hwrXGaG5wMx^cT`-<%Qoee0W{6ke*|wO|5`PaR{Vm%^97Ip(pvoeCR?Mfr z6Q4OcV_hbhF9YJP7LVk@;!%KWiJE+sYt*5*oo|u9`?!1|ppPDvflj6_N!eJbzdy^v z`fX~wr|c~00I+|+#1bkD;jel7(C82=v+UU^hH4Cb0q+wtG_UJ8i%aK26~oS2f{F0P-Jn?{_Vd#h3nk7+7xbeYPi4IY3=z$!Ykl;;4bUSK|Eve_p(>zJ zPFlT7$cl5>=M<%B&bK`*ui&&V}IfSMC1_D|CM8Y5pg* zk+8yWFt~;(TJ0?BNZ$CGeqa1MQ=q~H0dU;tJU8b&xcGbW7KeatIFqT(( zdrp8wN=b?kKV`i$c3hR}Rdj+va4h}N|DpfW;~?NrBNg@iwk^tIEzx%0yvAoWE6G=H z5o+kAGVu#gSabmF{-sDjv@vixlL#!p?y)%1a2bN`ic&BZZ*NE){o%iJzsJ|i5D+;n z=>Ztycp8>qRvP9o0Kov7L0ABEBgW@kThO~pxcT)%Gjumbsg+$py_HC?K|RFyhCn=o zPz;o#1rVkJXn<{K=1jX`bc+ICVBx^+KlXP@glcH2^?i84n#(nA16dFv1R_M*AZH95 z;u(=q_6saY4i7SUOm1eP!#g=e=A!z!tp)1x91R?NctIv(hC~YY-F@{?*pUD8Ol_ZB zzVxW)MYD{q;*fk~aDE7FCkJZK-^d0O=x>DTd|hpAV^p8h9^4ERl@eaUMxwDlkbNTQ zIHoCW|3CXvIY&pF6;m={4s2ULv!B?mv8zVU*xxg|V~*Pvl@=rf4jFuJNeS1tw5E?6 zeI5>?V$7RTkz9NAUY$N#%F&FFRkT??82rKKGR%kIl$I1&=?S}oZT=$pssb;nPQS@c zMkC`$62<5{KQiF@jDa=%WaX*Rzg_)~XnB@}iOxhZ?k|E&3}*!`ceSUE%F&b*p}ylrKL4V# z3@voCGMvkF;i0voiUsZ1?H0peyWhpvygQ95-qA@@79 z@B?Udj|EO!Yd|dpv+jicG;vk!qZAqQ*C*Q{@6FW+_wk)dN%tGhY7E7QKFI_3Js7Pp z7`l~9Q$ABf*Rp5RKxkOl_L1j#2g8j9F@Nm-27nmm3 z7;E=$xBhH%Z7seD0U?sY7Rp6Qu+Bi!|J?-Lb#X3UVw}{vq5t|uWzR9c;&RVivw+00 zFI@Tf|4{bU0adomw=mtEBHc)fQqmog(hW*T3P@~~ltxOrK|*P1q@)BCkOpZG>68`( z{I0z>_&(41o%5aZ{=b3EeP7qitTk)a@G!dh?YyZd6&{^Ml3(6)Z@EQ{b~xoEWyv>D zdh7*6)1&ZY${T9kqL!zqf%!C+%!!xiNmCWhdx!hIf`Rrz36g7{fR+GuKkg`EkKjjV z@k^MT31$bhy~46l3D8Uyq2d4DcJ~u?5qO<2s3gFK%RZXD|NEx6h5=1^>nY(rn@~3? zai?fHAN5K}Hn7f9+|kA+(#D3|i@6z=6K$kG!RC-dW^E%b#u2EL*|jwMD0>RwI}6A4 zy_8GOmmw}Ge0u61I_=`gX~lS-FOg?$hP?UZYT}Q|ht~z&BUEUc^`1u8oas+rq3t|F z$Hkb&4Eqvf|2J>^a5&F62JC$%vjBjC+Df=tE$q|s1!5}KsN*?`yr7thN}#J;X?#c2 z*mEMLo_DE+!>xt`dHkB_JLz5-y-kS?Yi#X~g8fU+u`Tmq)7xb)JX}HLg{<+sO%94tF z(+b28&_scQ`~xoj3(BAYbue;Q%>7p2?Nq@E!>d0;`mZ7c4o<}Y3fV$1Of9vpL%W0G6(ixn4=7}-*99=l z`W*@ewj-Cgj^TxGzU9iX*xQhA+)KZR(}RD9=8d~L91flAa}N0tpR}9DlzjRuo9-T(EQ7G^ z6;_&mH!35mEbRK;{?VooKXvNN2#p(jKcwhSiRZAz;H+?01)aacU9Rx)bsoM29Ypd0 z6a9cK5J9~+g=wms;yd`wanW%gU(Cnm@snG`n}=h&hS zyPcpA`Tj?U&yqq83G2{$EZA?dI|8Ztjs)T@2?+J$V%D*H6)qua55B*Dc0;7cGC*Q| zg-nV06Q{OANcHs%mVn(O8p0YR<%t<45yrQk@kI$6^50ub!h?|2m{9X@1i8T2y3v(^ z$SI1C9dvEImk8}Wk2c{&-4vRaEH~QH_H!I426cK1o?}fn>sYbgV zv5lOlg2?=%T@XBt;1Y*hzP5+mAELq!IXN}OA6a$R<=MX@3>D^-n%bVABiFpLkwqb3 z{hOnCHAKfx*@O(6F+OjhI5xy**9 zQTHUQPxf3;K1vAPtbQKeo0Q)(VSPRBF6!%0{XX)TJ}y1X=qUpO*EH7Qwj;`t$Iu&1 zmxWQU>jVnOXEB?c2hsPm6tzrMqNXp1yh^uPKiqwFkzi$Q5uA>4eBE#qzw08tG^Iv1 zT6)BBUj5xFqc6I^+5DyX%|t_-8lFh-TB}jQsv**%2T#YU=BV;G{MUAdX9!XT$e9s$ zw#=$4t9->DK+Ra-6(Q)nLt&%--Pz-<=Q)8@$<=6%!?V?)&$%h5(7(KqNh4<1n0CDW znxJwtJd2KS|F*N$vcMl>72((S_297db{K2N45Q1!P;wslny^e`cJ_|0*Mi0@q6< z&?}$e$xP_IQeN7IO?|PfxIK)~iR|@z?xio+&W?LXL$5uhqW|qF6%k95Jv9+LZ&$rk zdykpebC~oN3qgFZ6YoX7YC=32)Kdz^V#mE0+~vDX`YsZ^M$)kC&VvsIv?cR{z#PLU zjSop0>)KNamS3fV2RcVS z&6Grrx2QL*zwh_7ml9t~M-{7f0z<=savE%14?Vn$q6V9#!A!eGhcy-O82Wc_>UhAT z;lGg!ioB^CGh)h>@pp2^IIEH&m7--MlVQ~O*)3^DsVk90a)rO(G5>!qy{c*rzEGsh zzrnOt`zZ92qNwQaSF6~!qBy6vi7-l*YmKv3a~Un?uqe;B{^l`K6X1^y(Sg*3J-ch!7TXPLW3ib(t# zhjVvwAhXvr@4wi|PPFiat)L0cHXq@E#~oFf7{k?7DS4xtN(#YaD2qApY8^gBISOM( zx|V65e4dK2px{EL6efzFxzMX}CUei{f22h^s^XgY56|k)cBpZMPB$;jSM)o@7X_1F zMAqco{z*LdrH%&smw4jmlDqu1AEam)vqCJLxYH>}jGf4W`LXj8tU&V! z<_-hQ3c$2S@-ebCHPo>OXq5LZjpM` z6`1p;=nXOaA>H&M!ukj{Vcb3KU8kU5+zVlxJ%5nX@me1L0o6FXU`EUai9Vbd2|}mw z{#Ig9-28h}f!vQBDl#Y#|491AxvnibT_1%Ai|a@Mqs@L>{6g8E}Mup^n(jmS{hni#7|*M z5UC{RL&#p=G93Y@S5g}PufR+g*)Tm()s^J<&Rmyc)(w)9r#V=t7wsROyAaXFIvQMo zJD6#^*kQ=L)f}_ z;6j_aywl=iU(zVh%M+X=ej37LregTyvR}se+h_Uyq|ob9;)=_Ak001SZ8(KSGxX=d ziNhuiAaAMP+TA~EQ zSKZzq#QM)A{j5{t#Y|sEL#HlXsi_)|BfyswU-q%(_R*OY`Q8?2KJ!?^N-*$8=1*6x z4*cTDh6LV4Aql%m?h;N!Ad6Q^8pM1FqPL?uCm@;JL!R#;pEupzoziu*$w&8Z8 z^AN7MH#_E$+0l6e4L z8(@Nx&T+NN%&IN5T7x&sN5Ak`=sK(MCjg$(7- z)v?{aO`~U&5D6DyfF(ts`V&J)4$eC`ldRm73Y*Dtxa1<0Tho2x;oOs4u+zW8rvfIM z#}F{bAV`(p8wvxS7MF~rt|&(FQU)mm7_7$MLwNUAj*YIh=jx65jKPXDF=STOFZHvR z6naB})VP6LY=yjXUw=DfOAUThUTwVD4}ckT)vp`M8s~#D|a(VfXVVeD{V?ck3T<^X3{JgM9eV;1XFriS4nv zPcz=0`!XL|^UmaZ?Q(ap!R)LHNSXdUSX}+a$nw8&Wfx-zpyy#Yn4fz$7lahlvE#j& zHlg?S{7$NFNV(Od19apHw6l<}qaqeG5d4!^WUJJPv3a%?{5<&Fwl0Wq_LFj9q#6z? z8^xLc8D+xQe~86vW(ax!_%W-MZHYF!Jv!#|dME|`H+C_&lQgMQ&BN3JCck~~bRj+qUh0+g+nQkuhUrB%D< zI?xm7>w%7yBOxpOIQAEfuTuy)K9c~r;V|Mv4SK1dnGe>WgF-ojTk{2B>}Lt`9(2yjKd>#>jDPOrh}UcVPB9gZhQc@2X2b&(f`1%pjfWH=qTl<=zICzgYiFx zD__}a5tP?r69sbAk%5&V#P9u2lQ$0*wEdk-SZnEqe3Q-T21MT*sQ1>~6=&Dy29KC} z6cUOsykId{CD0zcrzC)c!hHUddGCvw^KZXirv^jM3xKPEO?-qtH?eP_G63551bVJ&uz~9wY_Q94RfV~ z_x_RQi`xQ@`R7ho`4&AZJ>(MISB?*`k;M!&-6;=gWHl?VOaId3?YKGKGu17;gLZ#A zM$P{C@_IM#5VD9-hhayQwd*?#x5ueKMy6y4d>j_o3fGRn5=iA7TsIs4{9GO0+h z6Y9V1ajI;m2*T|?@%7V47S|C`32+-d#Htbklz*zc*Z3&ZX1Jcsn8!7cp zgKV;!lkgSg{vxJ_Vu)b+6&j1h2`;ujc$7qpFVy4_3-4q$FJvone9jeoPj4@vsCD*= z&>r3uhAZKSG8`!>mZ9cZ{=D=hYd1l-{BBSGp;9CZUCJ&RwhHBfPr&%Q%lX! zY{ZCz_KTIGcQRZ89Jy_5inEy_H@k2qg^vMZQFK9O2&7*a|dyzBTb(4XU zn!)dRJ(bn5Gc$vql_NNC&Ddnk*bpK8jYbAZ{n36Qx|lDb zoMcOMg9{3U^H=@`Eg_k=H>?j!k=iQaNY7A4r!G}-Adp9bc@#BI&DswKT`%hLX(K(y ze%0u79EUmD>wS7)eqFDCYAnKOSl5(61?%;6Roq!J=7~r%p;o&+?!a$9jJpr>pi6pS z%AP1}9&NS#=vEt5;<`XI%QV;h`ZrzOYRIN3X{unZ1_8tNJBZ z-dfC1PNTw>g@Zz&XdyU{1yIEWls){bxEL^ffcf9-b`<|$^Wce)u(ni_*Hj)uw%=NY z@%md)aSzSYo&M(utU}ko3wB-qC-7?hidJB{xSCQ%hkP#5mmqb&s7Q)N?PtCZj1Bs8CS!v5~hILVg7mZ&&RdcHl6?!#*nx`gXutdLtUla$ znXN~jQ4zJo7UMOh)GLYLC&RSQ{@fK7hl|Hg{$O;8F@H;MiEdQ!Q?uMrV52kP7#|!F z`*T)(U*{CG2CrthMi77q1sZZB5JQfcxo=QCu@(9v85C}Ji|CN3DvV7`9@jKA%`ti! z3{>1DAJemhj&mVkB)tS)Qz-j0ZeNTV1)bB%Ht~9InOGQce{fdU`(F6ISk@Nh@4^xQ z*iZ#bNj|Bm58N#QDv}Zb>;W*UwslcygS@?#bT{4hAE6pAgSC@_x9uhp#jHU(IcN1@ z|A4Yb5J_45Gm)W0k|c0zVD>tUM!etIMwrPmX7DEG#Pq8rWytO8mTBC06W^+ z?NeL=Jy9whbOYeGd?gk%q-XMdiXD!M;hLeuZXo*OOG3q1vtRSY`46%1!00F-7Q8}2 zhR9&)4>X;;niH8sWS6va=~Jv=6W}zKHtzFRWTiL>xu<|nZ3l*w{!g>*<|E!Y-dg9Z zye>B!57pCE{8Z$=rXVayL@)gepo%|(o;ZT_3u+O#@F+XjIv6w?pcUCeh6ko49%_d@ zDD|A41u-dFtF0pBRzE_5jv0`IvAJQ&d|(<5{iy9pi$f=Ba&y!$R(0df^l|`e;lXB4 zq~(l$x?&1~EZofY(jD2t9pd&(L2LK4a&mXZRyqEn}4m;5Af zv%!dKjwVe$1l-XI6SrkmVi1%^1OHZWDX#MH1z zJA9p0&DLZQg&%P}m*p%;7*D9Wl*WWUz3LzmFhiy8|Jw(_Q}?Ox&Y87y9pQ}7$x8-mT;Xc;RFdtmRAIcnA@u3x=c5dUGw5p@Xq3oTd9n} zd76-F6t-X#I-*1+faKu)WW>9mz=sY=IDzRT=<|L5*n}zg)~Ea_yjP3ni%)#_xSejK zM#R@nPWtrp)PI4!iYpHM2*pPXW=+v;H8wTkxVx&5HSqf5>M!Fn;}}z1Ll6GnW{+~F zdq_vl_|S6N(I6EqKee7l*WZP3^xxY0mU&4Nbt7=y5u=qaY(vBKgCE?(419%#iwdE< z%unHrGxsuh@+f8|6>9IK@CMm>3r$beem`y6iNPR?!EhUi=!;#GJT&LuH1VYF6&T%!GA(ZyuoV2I*|}?|j>9Ml(Y?GB zLlhH(OyVi{bWOj>#yqk_FsKnqE|n9qDXOX)9L8oLHB|>x1SrL?fY)DZ!r1Q6+5d)7 zl=!~VDY>(mlXfpmP{O$?<3cYk-8~bPAR<83Fx1Cj`WkrY^Zyz?!oC_neuVPZ(P`;p zGre*?N8>RqUG8$>i`o@3E^1kttmEHr5Eu7v8^Bzsq*%TWT=9bdv;8L(TzDEGZPz#R zS}z!R+kO?sSpB8)$;tx5m|+xAjiL@_IswBDWx*1xm~||IEefkvfw(_dV(# z^%nwj?>A8bU)v1TRM&~E8iBtIgOKu2BO7SOd%fB|&@!8hAeex2nMNU$G3!xhvw!j- zZ+?w(HWC?(YHY#o&&f*0wRk-Z z<+BR2WqR?Lm(_WJD75)mXzpvnu@};ec3VODQA^k+1laOs|F+@C-illN5?jC1hJ88` zV$Y^};=T9!V*$C|ChoW2dCg+bjt@+XT!VOs-|P{_d*geqb9-Zo?iZE-rceP7OC4rA z7a&jaW9N_;o>--W}P>9rFExr@(9co7n>_=idjdLu!Rvg5|!Gq%M70k{;eO zU;gH}ABy*O*H=uMW*!jBeB7O%)GNoht(|gvCUTB!-%r&OkxLCu+`yaV%f7>&EH+x! zt*I43!Kd^0zh$+{Fn&D<2*)0i__0+6C2nBbA6E3v)k0n8(y@%5O_$?lt-P6KDX4kr z|0L4mglk$e7(DC$40S-C_UaguWoQq1@!1EhFyqYNRsH_Kw6A}jv$N@}@86Lsy^iYO z82vmnNbu^WR+98=aCUEfw>DBOkdEZ_4&fQD&+Es#^`N|fwR#VN11+)N4luo_4Sw=` z#84^<4ezj9t0F+By>e)!S022+e=wv*XprMpV{>OcNrr3*vGx=Tne1u|ZDG}CNX-}V zm}??>b>J$6q85fiE{aKf%muw{G%da@u{dlJ?K&T+8<+tZU^@y`&#*6es^T#CCxu3G znvDFryXqZ6xkLiRo?^njNQE>$%0>w?BqDfO?+X3_(%cPQX^VsyzoB!uZ@A#Dq;KWp zQ>763d$<9iZ}PvN2DmqZRxFnU1XEe&)eO24z7!9n2o=E;dmiW1oC!tkl6KC^lsLc~ zl!NeDeHat|&tZLh#wSXjFP~LB{g@)mb3Dw!74qQx;9=(Or@M6@1&&!^NeTFQN@Eg% zDP*Fbj%pHVpIxL9?&A2~sJrXy~} z9Yf>g;79x$RFZ7TDqk^ zTSa0l!_TJQ1O(y|HrWz3glFuh;+fu?Kk-eWPu3uNRuLrXt9uf0J~XyT(QLnf>o&Yc zcGr+Tjf+E1y?>1}mUdx6wVNW^hgLBgaY}HWEJW@H_!#T}+zVvGWy_AV>X7?IIgnK7 zg!M8bp`CL2xqifQX1OHE^~c1~YNo@6znK~gx)FH3b$a^AO_##hyXS5vdMYm0mOqG% zgmxf(L6z{4*M{&La%MRH4R0tVkDaDC@?KwvffbUUr__k@kh#O#;ai)zjM5%yp@`IV z`ug7*5`r{rmRJx=fD_Dsep`y<-T8PKe^g5fx7-QR9d5FZYb&t5S-*t77qVO1B0#;H zY+<4c1uy9lmd#b!q<~}#vCa+shhyW%h?ti%e@2$ti`vW)acyrPT-j(s`>arw?>|XT z$uG{*r@MZtt+m2sD*i;gJFvT?S`BePR>Z~0giadT6q|vXlY#rFi(MW4(;xZy;h%_* zI}FX%RBIwC9afFTd=z%j5=xG%Dvo=dd!}u&@ zkhY(VqDDSs_y}XXpuD>3DrtlA3JBL=wBvYWBc@+5lcKY$HvM=mF_zFXD`izlr6UCk zqoaX7L|lD1eF1!J3~%NOm3F=Qb(B9F7Vvs}{dckLYa?&StCQWI%Zjt804>0aVVm+M z{m)nfr7h0~khntZgwT((5v}#w56*UzYc6=Kz^Wa1-{*1bC3RJG>C}fWOU3Sf#9*M5`YI+S`w^IF ziUDiEt<)hd%SSU8at0QC#2Yr_d7)DDvs<4!QXx_YN!%}WBf!Sh>pim2uGT*pk*B|~ z>V`IW%=^CRVN=tur5@wA`}?;zrV!lb%@Tay1}`w_hJTBAz|p-VF0w8K(4Rvep>IIb zqxA(p{sGJRE-p42BFTBz9!$H=R(b$Bo}6q!C)mA^RJ|bnh5MaHXYaUs(gIHztL>gr z(wfm1y5e@-OOV`8f|LU74ZQk=Pke*w*Bfj*h5mt;mMP9Mu?-`h z3&u_4$BGt{UHpW7xvQE0R-ySYp+Ftv13DLEq=ImsI@%)5O*SoH?BBRk{C>?~wHWoS zWZ3;jz}gVnUVy}H)yC$&BVI@=@{PP{b(BbzZpUtEvHMD6ti;f-HU>O1xMtzOF{n17 zOCNI^X12`GtgxRd%9`u1Pgrc~l+MlQoo9kApttDW3;rXcF=HuY}MvOAfwQr7ScebC(xs3= zjHHfWrI_#M$*y!`NxT!70b(=EhjBc?^ar-GNi)&ojZI2kg~w^QJ-M8AXyU(aVPkUJ zdx5wI69vw)C29R+sXdCZr!G-@DJKcq@VQt!QKEy#1M80-X;m!Qq<%YO4IuGMee7MZ*7KVo=7q&! z-sK;5+fg>~co2{h(F^S!VIiEE?m%U)phT8N8n#c%5~Lm667@c0lf4zkTHLZFnAAa? zrm;l-zIO#s7O*spDG1d#g~3*`V9Gx4x7=M%WSi|&l*v{=94ox3G5t!#c}Z8>@xH}0 zBB35kyyS-au!VbbHdyf6%X>fcy1W>M!l|8=hoc5}>9=UH_*tG{z@Hc8Gd`2x{$Da% z7qT&`$FyTJ{O)ewf~MUKdBWQe5PxZt!ROs*#2tvS!aK*{V^xtR- z>R~wY_>x^MW^d+CicA~EpSS|);Ra*r1$RedJCXRxC6ENU&)~VjDQHO!C1J8}ew zpV=}gyB!h}FsZI@R#5sl@5E%O7gs|l%-(81(o@f(0y#8Jm>=vuMh!Ldit-9KIhC~y2tqB%~+2`y^n|*CSZ6*59*MoC3Ycey2o>zkt%00nf z?S4k5qy%(c@FZv&4ZaW9^zgT5v5zcA`D*#bvWNl4&Za2qRzX>X=fsT{ft>A@(`}EX zKoW$S51b*OoQH5=z=lN`YTa^Jte(CZAd`kxq9omih*H8I zJ8Z*6TN>8oOSHmOkCdXnEiZ9MFKe|oW>>~j-m*|vDQT_vp3g7OmmYI!=Wz_S#DMw| z&WN00hTleqNMq7lHV`-5%!pc~91I(X7f7kFLq){$?blmyLm<=s$B~nD9!4$b%80lZ zO;IUoplE`ZfnXu>Hc8l;p-s-J8Cc1}kNSNP&pwAQoXeD>QkimPcPH+0P6@A(GK9~~ z3^nY~V1v2?zV{u5yRK_BD0e3Bf}K?VJEyUbmZw(}*M3UX%CpThnDM1ob1+cTM+EAmR*^wgx4K|`6i-e}_kSJ}!~Z*$RlD0@D7kws*k5at}x z8@qs0nlmCCH8=M|AZricFF_EW{2 z6VnDC2p6W-H!D#;t^Z$gS7$^}W~yZR#i=fdA7}acM4>VT4{73P2?MKki0D&CSbGeP z;NX!OcxDWBU1njHp+A4FoWV;h`MPoOmkNgjgGlrdmKdkipg(Aj!LjPB6B=zlu7Kzh z)Zl{Wczz1`V_D*ziNDJ;s8My6HoV|B_4`MnB1wITQ)xX>(WM8Xk6*CfJHhwzl$+Av zv!GgfeD$E9IL?$3*!@7`%ZmQusiC@MXYS9yJKE0JG=5&!2* z8b~i&%^H~WW!3mryutVn@cY|}(CbDjiXImllA)qm5q4esegAwz8unq=IZx`F8|Hxo zb`TE5#;p?XH^g77Q&3P3?}2&`elHoIODEh;4PCx9XkLbWssD2}LsD%Qj`yYZU1q+? zmR(>n+rpKX3^cj@exPm~{=}c29yR-D$s19%hqm{d>`Aq>uTXOCq#7x>?y%eq;3R!_ zFj!1{Ii1ajze8e-FY9vrEZ+-<;)Ao3mK)YrMh;sGdfHSlwK96l1k=XLBA{qTVp>jS z&NCk;t1LE3d#+k?rrE~#$c4`HIGhZES`$`!Ahv)j87_ec!CASaaBqpt_rk*%Ln&Cf zIVS5G`|Y`+J`s*Jkz%#rU&x_r0~JB2cQ${f3X=2?QFhD$9A=$->!X-T%TC??uKR6?%nWCi6uMYReNx> z;BXscXr7H;%8+@2RI{fwta{Y7;ScO=_Y%YlUG}~_W)3m|s?RfGDC^=U%db-L-BBa{ zkBN0c3W8td*ylgKV!6i?*eVv~t0Ipx5eYZ`Raf95Lj(yDsOY(CtWf1n`NPt4I)XDr zcmEK1x-|`^AU{YWfS*FS%I!fcL;pET25g1|&CkMmX<<07n`alTrUl=vBY<7m&Ua+n z?+}GEXByQia-Pcd`!j7p+s!-jw{+%Lo$&WmFYYwx0r>?m8Nxxf!ht9%PnpNr66jzs zc4&3oGHfZrTbM}Z78;D?$|*uTX}b=3pc}7z9xl`qS&zwFy{>^fORLAHlxY!jHdrsf zwlvz&$N~Oy_!?s)BbMAicApQzCIJKJ3)<3yu6={dV{JoBEkf)!vriETJ9oO#zH~#( z1J`!NNBrwl%Lmo?<`eq1&yw3al}At8*CL{u7`FZc?7b|t7`IWvdHn}}(yU^mXute@ zH^QRKM(hW^41+*+zszD$Ik*-WkX6_i8`8FI1&w-s_}+~5e8`C>n&WZ( zzW{9b^2S5-uX;G|-`tgQ!d?qTRAM*?z{W2+3t_vB>srHboqR$!s_kBLI+7x2-IOsK z%Q@e>R9$1LEwoF?+}4qGc<#FQ$&;> zpDdeuy~|LGuLkSKf?M*wyskGFmDS7j5(m3t}oaV#>2VTVJ@@ z#n{vt8=1+1yyk^9;3O#+i&`9m||3KT_2f+k{0e@A=`q)Q)gwJjED1v zz@XDN?9D}i`uN9&m68Y|_jfWizjks#0Q*1nYRjrI7MjI+I0@$h&qYTNZlmpdL4S}O zQXk^R&v+F48cOiPM#27NSXfx^vGi1xY`*j~ER0Tjn3S&ss6pZ%o%%X1J zGL@k^jyZ6VZ~4DutM`3PQDk!aTe6XPRcpe;X>WKFE0Gk{mt+5ga7+O6U_kdk6-8dP zn=2{y40j?UXSgln@cps^C5k^CF|f37cU1R{JqKnPcK=!#3C`|BzrwpTRMQxx)_(P{ zhOBY>)w@rdmFiq(@s)(|^(C%OIm$maM$R6+61Lf;@?F9unsG8q5XjQyOrcm__l+rdB$oPxSf5lonjxPJmv`Yv~`STttSFWhzLoE z2(r+wSP^Vm`b`*72IDQpJ9!a7#%L5$t^zZ$htsK<(6a|;#etVD37};FFaCFcdMy~& zIYHU|+-mbz)hRcVlf3Y65=>mTn}Rk+7@G?Z!2tEYq$?owZn*j}I>%m8cK0yFG1`A# zHG72Y_&{f|s=D@`j$t-X@?UZPa!9V@<{pHN8qYjP*>eME4iUs<-Lho{35c5W3{abu zF6|Kr?VGXx9?CZ8>Dk8&M zZLia;g&#R{C)Mb&WBh=Ox#n1P0LO};7<`HXVF(S8-966m5@fQW^|BjTsYS9`+W(#( zeQ)zuwyDwJ-}nFWcNvVdeJ3To4%#3AJyG6MaGH1@`0S#=i}T@o?A{Fs zK~4bg`sepbq_^HtfS?U)JU|e}c_w7g}?I2fj^MN>)s!hi2xrJF~7-%u0BA3PU$ zp7OVGZ&4Bu*cdvHn|bl1&~O&DwKPELv(pQFvN!r0>4>*^-~?4bBMr;>of%-U^n&pu zIH*EqJe`F}LPM5Os>UGyx7>A}0<}|w!WL%lL8Be!MsfKMEp6VcuKN;3nK50Q^(>)h z3kLv2U!hhgivA~Rjbz}hUAOrn+{_lhK4&*_M^q)}ZXqeP#>X6w;dz`(*ah7w#Uv}m zgd}SZv1LClBMM8LPTA5HPa3#e#;_F_`dm&b$EatR30wmBglP;@n6AIF*+|8CC;fIqPAu=O5lIB345$h;+9+zkn|-^OG9rC0IRBR~ zkfdHf-lAwR{=D{gBSd}(DFH_+cD+cN0gvs87i3aHmZZzNog_Y!3jdpr(j4eHuOO+eKr|MZJ7{KJJsjxj@Sgm=y-;Wc1X?Iw zEaOiQn-d>;gRc(TCxn;@kMDmrjZ~5K0`{{lir!8z4-PihleSuL>gCy( zt9hBA@p}Dxs*la1=;U@>D#%$gCs=L-H`TUJa5GK0zvz6AUEy@idSp|zddW!pOR{0P z#A`sd^;}v zgt>=gYxvz*qlb1EF(v~EE`bslbTR_T4H~z8v2ez0i1xk?Od0u5Fk$}PxNy^=kUZD1 zq$2i+UmZNV?3eg?NP_lzbuLtp8yx6K)-ZyEHa(wrY{jq95tMwAy8`tJV87%eD z@RC%pbIL;zA=Vuk;upj6MlXjcB_d9t;7G`RBzXlgF_kZ*TOl~brQNIzQXP!y4&~bX zT3)%HTRLq%i6t-)pEwziuj-3jePLdW!;=j(KtPIO>kf%>x~(l9J@ncAp2*Xid?BT^ zK^+)4t8ERIyxiHYv!c{?up#Til`5Qsoux;SP^tI&v_~%F1E=ouCY$6 zAX)O*k5VlOhhiI>n`1RP-pYO)BfQ=VYWlQxs`2pO^`MskKvT*u)Whh4Zv==mm+gF__AH+7*n zB@JlU;5h3&KVO-k`4fa6q#k>QT7nn()a2zi3#&vwHsxN{JSPAjgL-B{$|Kpud0!f0 z5ib!j)XmJE$Mf5mRlQ^>`;sY^lko_uc!xK*m4y&75kc|Qgbk@OVlk%eEdQePqWKoX z))78a8_i7p<%aydSK2GZmr%zS~fp5tX5(?$Wl%5Mtb4Z4|Vp*L_@rwT8fA2 zflc6_C$xk5ynMc~D@R2r(aktU@UkVkrQijNfE4j2k?liNy$XueKmQmw>^~mZs}slc z)kt(jrDQ6sO$>d4gI6!a#NvY>N2JOGUbH2!Erbk9{#=yfX>@~hBs+&;gdFD5awORE zQa2PDYoFDPc)*|fHydRsJPeHmp3TUuFL$47xq5SQo> z7qS}0U9v9QeSxzjPaGHaT8J*eQGH}*mzHk5=o4K8Fc3K#!n_h){LNJhJzL@bjb>1O z^YNpYd#7Aawm&yXU!2Vb%A?+43n=ZEoM5;A$RGUj8bAF9cR*7PjFN$h_Y{!R`wEyX zCG+spnV!{cqvLOy_Dms2VrBI-pf=)@1IZySCp^-_c4l2|8OG2?>z$@bxw#a@IezOy ziQH004cfs5!iytz-_bVtL_}O&SWW-0VPYa9bCKR>J&L0a&(Vn)Rkz3}4&=h-0#?5$ z#SQZC=!0Qmumbt2=MGb9fXeMZN)6uKtsT5A?Vqow&m|9R@2J+k%+8-Jy3JI`Pnna0 z_W)o~l3auI4M7$dDT$JV{#Q6Gu(L(rOonFO^fIYiBkf5!u7+>LT=YoKkJm{9D}K80 zq7T+97O}E0Y+7y#{V@27@6t>$Lg2%CMhw+*#yKlV8hS21fA;?oDc{E{mct2~(O%N@ z2z*7Xm+$BmKRePJlASyAhJXa~7gW^@ACrzi33M!Adk?#c zkL@f)u)6M(>Q+Z#?BKRdu54{83RX*u+P=fg%X5T+8u(QN?0po-)ebMVf*ijlebg(p zwMDOYsZcQX;L8s58qhh~fZ%j`fO8oQU-qNp7)zWfrS|fP^UYLII>=7$VCQx*P0B!V z-|!<6J+L7ers4N`f){$5nX+IG>3RKq&XmW5W*zAr)+#ZirCqZ+=ld-HT*I32Zq5gZ zNm8RYne~%HgwF)<+^7x*x9c;=IolbrdjeO53$9$i;3lR2(i(aMR-4~gX*v9z74vNH z8QsG1ev-)R5mJ$SMqcz7hvI9Y4oJ9Ae5K%{N!U8~V)ipK>5u0)pWW-a3?rU)I$-~% z4Z!|*zVR8f0$}(mP`R3-&@cgU$TPMt!lQ<@ojiCXe$tD&k8irDlY`|dWr1l1V>C!G zaix$SbA5qdVde?bv}c_`mF->eCPst1)k|m$iq1gw@)NjD1XV*qg6@yGj8k^J^PG&B zBh-B7&odww;{rkAM@u08%EbVWArZ=Xt$OJf z_p}3{9n=VW;aWtb8E9#+W6}*2a=60t-3gCs*8&SkJJG&$x}7!qrJX6F_4Dob-{&3`>sfY<`uwYR zIcp-+EG+Q z%SSi3X$EVQ=25UuyL&qpI;X#*b!T8v~BM5n0RPkd#K*-|1p6 zBrvlPiR-0EqAAfijnv|7{mo?75OU?|r+;7mr-NP`mGB z42yk`{`|dk-0q$d&If4y3e_6GjO?z=pkyXIe*|P9oh}^^M%HF^aQHd#l+w@c#-m0q zQ!Pg#@QPSzwVEPdX&^#V~+T6A~s?I7{Xyq(2Xx~p_{1)=_@ zsiB(G4U4mrUvySW!`#S7$GVtfzkN?UAIYh`jO9wC#equTVf`AUzs)O)iBZwm!>!Fv z+b^v8QrwwSHA;V#@)uMosBigEgz*1uUfF!-ZH+Q&mMHZ?1)j8H3yN8HX zj1W76kAGt<++PrIdyiji?Up{w{oNWtyh@}ojE!-+)yASTNb`fc@=;p|s2Z=F6kz%V zsFT9qovF6yQCN(3fNo#yqmRa!2oE+L4RvL`K-ITPbRf{|G1@oVYF0EB5R#wRVC5RMjvvma2hy`FwqPul#+vf zzA565$0fvoo+aj!Vbw|d&==1;2L?-gyi{e%UtIOjK`4YR8EIv=!b)srPdZ18x8u4 zpJl3XE3<35)Wdfz0eA5ZrneZ&pky;55u|(JaEGRE%|&r^lR?<|1;(>BiQu60+bN_m zSJM0>l<+eI$hTkbXI8p8tty<%^Q-bvUu`l_X(`urXtn>;J~w=Yd>#D(4KU>pnC8zg zYIYhikMQX>>Pq??b0v9_|6GZ+u-_R2>vcB~i~s@RD106n^21&$;X_a2*+%WbEQ1dB zillEeISb(=)u#-~is^M@@HBIflyV?jEx2yXn3dliFD63Bg~W&@@uj-!@z`=gx247G z0^7jH_Ml_K`~8MDqK6NK*}{di(Ks!v(cIDu`+izb8}YbTcwYb<0?!W@B5B3a6y~r}Uqed;HhWs(1ZGwqrCjSFunAM`aAl2{o$eGOeufl0n&W)(9eY@}-?P@<_Wh-YvK0@{ zgC85h<6D#NQ(gQ1de_go5gCG;Y15S4w-V>jYQN*-X3FyX$t{WkssSH+XV(ojI@kX* z`$)v-GTdj9%GHAyWd9Zin_RlwgqbSSl-7d~A#*Ff5?oOzs|Q=jN9y>wBWLoV_s1{j zh9qd?!cW34Q78pCl5X*?f5CBnaLt8++e1c($AKH3NR8aGrZQH;V4YVi%);rw&{EiK zJma{v0P_ARO4uocQ(%AkN1NFZ}7-+i>knqJ_GFm0?r+>(W@rI=6U-=@dp68O=p%W8Q<40b3L2AhLgY=C*o< zS-8H`WAlkBbo*VHS)b#;F+rswZhkyC8RFN&#eb~{Q#$&FhW-ogPsvFZx7*<0W|O9q zLEqRo8i&Ruzo}Nf2Nx%MK~DZRJXiwy-*SH-3Wp||){RQO@adX)cuVb%;9%6#^LC5D zk8j>N9iv1NIlv8*V96NHn}Mqvo~4XFg0)^y;qJtNouX`jc~M=$<{H-Wm0AlofPL)R z(gMbt!Q2M1LEMBgBZb|MkTUK~R;1Qmvi$CN&GdvqCQijFef-C(r}&@2wp4g<0`BS= z$~vi`w7OGYtX1sdJeM%c&s-D?4*6%vA+;CY=zpaKAUFUbX9U4*;u5cGxFz(`doE}{ zazAhRqxdsAo=yA#Z%Lo-{SW{7#cnynZwOIHc{unZ%(nFru%w9B{R|(N`d)BP;u1-e z7!X{84zP3Kiq}Tk?Li5QvEw<&Y#}j4erBc9G~R)eQ4o$?`-?le6Znjh6rk7Q)}X+W zGsX>`e*nO``&<3LkNLeZ_Fh0dBZ`q8e$HNZRl2F>5b*y|_SOMWw_DdRLwAETf`~}B zAf^vxzBl?_j|wd|1iwV@49xZ zwf5SqjLD+q|7x*Rk-R!e@2Z>&h_Z$J)I{Nz<%8@{m~%he}x(7;C2;w@FBHiout<{r;5 zrP{fJK2Ddo^(yrq-cj&-aA6m#4bu7Lm^Ex~G0ejl(Y(US=hhpJ$l65Lwb~e7u8s|s z#4KMMSM=x)XkgU2jl89+Gfn7~Y4weO48D(d90e?>aA~hmS6}IMphtm*`vxqb^IbDr z@To-g8HgL*q_CH+Fg~w=`>}R7d$2OgguAVX=e@qoi+8g~dW4b6088!V+hu&8A5##b z1_1xV%7f|GC03GV74BcH$Z6!UCY4@H1XCv! zBs{_@Vy|)18u-T`1YeH~|7L5LX&!^tGFM}{O*I5GP`D`8xX``pKO2KyHVPHZCoH#=Gn8{ASeRCnguGDThuSFO zxBvWWdg6)U4YtgJ(5{F)`f6i-O@xR0c}0arLL=eXK~{br3$Lllgn7bLoEe$zF((G> zdtvqA{qc)CBX=bvOEncmZV`-8Auq)17hL#sYf}<`7@}|u%xTF8!Cp%A+kLmHCSma* zlU=3(A<1oGQ+(NnR%?= z6POAUI2VVAi9@fMvX1{^DUlrQ(sXL*75~teby~@qD05Ls8#Cq9I|0H~2pFPrp%{&A zX^Fo9;W}1U`JD2mlpig%++Ouii*dJL`MY}u=zIS%wJtqAmCM2l$I_1a0QPj>s+U2KFFbP2&`~dNF_b)3B7R)hj zVZ5j0_de?H;N@tbCI2)tff}g!C>eG~;O-W}##vy=o7npgeN4Iy#Qe3B!iGftfDw!ca7}VJRu*O(INs=Q%&3T-J`F{-w^0=rOd_DgTby2HuE{k6evdom%1{OA+eSD4y-qv>&|@6q!mYB(^+z|Gn4Iz|qd&XUEv~lXZ`nI;@$b=QTvP1K zITjGx#6hvffyRZaMN*smN^E#}U?eueV=}bvX2B1AL9Keu7QZmy2rf|`EUUGG(X6nm z(JVq4zVQD>6R4Q0ljG8*YJccoBRKMI56`t%{~2>zdey6x<|>ziyeC&}72-GkpKVp% z((gmHQl3WrR}a1pDsGD-_aM8)lPY$}wI;qDEm8Sj+N%8gLz$sCN>mS14%f$#gcS_$ zzA6ej2|!#^x@V540%4XJ2u$j#5rek(uZ)B=t_W}4Fvb`FBwPw^fxRUHuT7{(VF28`|DlLelxmCi2FA=C?0=zRlG{# znlO8N*f80wF)e|Sm=Krf67Q`8&kLn*p0!)1wocv?=S^?tS&I>0buKt#e(%c~jtNVU zn(HmjSSsD`^8kvGjvwX*iPi74cG{MD&|O5fWS(Q(9CdC)B+B_ugvo3(-Gk&g#PJU=8_r;DdoZb_*}!l~L`3L;3lRuN8-pWF|nw zxB&NLRJy^iaw|pV#m~5~pUOqNx{6ze=v*JfLw@`rNvO8>3Wx+sw{F~} zyXl`#AJ)W#ym^<9Vk&3&167fzLa{}8peOSvNLcXUCU#Y!QRLg&l79lvD+ljC)||+E zp7_WnLq8^o?wsn50r*W}RyQu(b%g3h#pSm1=Pq+cLRvNi;Zc)XKRvrwxJ5gfKh@A( z2@K32m_T6gcY7pnhp5W?>hGE)?BAtUqE;*Mh^V}44^XaIu=`M}`ftKd4#JjCveNJN zcPG6Vx8ss(*|{-fidXGJ0||TGU_`@x!#)*Qq`!mLFc0Q}7f~n`SqFSP#-rQ#UBb@x zS&6?j&K=`O`ck*4Lm>SS2%@=C6Am6ZME?FVxl&0q(7a=iGJ5SAK6B%<=%*rLi1^6T8x$!NF`5v1 z{IRq8E7*yl6ws#LU>7b3yN>t@Mm?D)Ya+!O#DrY!PE4Vyt&#g0q(a7xe$gsm?U2r< zK6-~f6zVhR>do?fL$Y5YP=_$bV9ow!Sd=1#Ou!LW+gg+hAT;5aKp<^GigB86i9Z#4 zbBH z{g7y;OaoSEiDyK9^gC+p*j$32{vX0z$m>QR4~dYr_tkM=1XcRU@3$!p*Gfm3&r(K( zHvJl8ALNE@E(dk%hGbKSh>S;m_fI-kbAwz|!if0|QCz>f;=`9BNCd_ej`Q}^?!sr|JC zT7u6s>#8^*iESt<%FI$NxG>lXM@aO>b;vYmL}0$@ATM%4kp6v%Ry3+|=YPXuDK*P^ z(|kJh`?Sw-58krbS27Q&Ceh>Sq19&}N?uXrI87Q9s~DKMSgkjLn+hig=DJplRatQw zMOwL4OTXWn$`WE&-j)lOrKQGRT*QzD1s7rjtQqFJ0rcsc(_O6e!!f@6IAZw(GhR-9 z=K2;G+TBf(;mozx7CK&+vI0O;fh@Jxq@Q5z&|2DEo$R{dGF(d%S6ddqAE#Gt{Ul~^ zqYie#>A9r?Wnr=rm@WeFRcF4#P)5S2=Al>oI^m}Mc(FHTxYkP9Y7fMd4O1Z?z8(|9 zh;tVMY8XBw7+CcSfN7 zPm;ZmEci_$`wZFI+#Xpz0zU)XKNoEjHMrs896jSTwq!v7X?fK>Rq^UQ+x{Ev7!w0j zU>FhM#f0UT+1QQo*)bN)`MEGLnzp#f468k zTY};?Yz_s=kBxg{p2n82eN&M*p0eZj$*5PD^B)XWi5i8s{VyZHB^1I6#P~*qz>dKs z{EHo{H|}(VX;T`KP~BU9k{ZSH@yQq~-JO8w_SKzV{r7@_1vlu)V6oVw;+_^`-$L=O zYqLNVk?sW&e(eD(b8^SfoRNi#+~8$DWQ%*Z7^Bk=v&^;l(WG8-L)r&A^p<$DI5}a; zxr&@zu(ufgOV|r~p`p}}73@q#uiX%m%i)aYlk9AtrcHiz+LrPMj3*!**`I5CDKUM$ zd5+p-ZH3*c14J`E0fkFOl3Bu7Phn{z$u!p;9q zYi)Cknxq+-KH}c^iTc09ei>o%WsmzJyzBJy{X%Hz+Lx}9M6=LWg4aY41z5l!aixcy zJlV+>61tIoAzNNAt|F&Zhb_gpCX$-A0JvNTBb6vfm>)JYh)W_byJ0sbCwEdyDfwtM zy{n(JfT0G{d`HlR=L^&2cZ1!l2)BJ>(NCT1ybf4Sd3`_PS~<7BJ|JoeEIBE_rpgrl zmnP2T{qG6e#VVpy_F&zOAUZUm+2%rXKaruxei@E7c@}0r?8|Bw%nL@DqCpGFBq$^$ zUnM%F96#tgB#Ll#pD8Rts z6(UU7D&A-Z?jrwl5D}=^0ga_xiLOiK@%DzhiAiTBjmpRI+}vlR--X)r?HlVPY$CA9 zq5<-khfSP^?b5d^=3e2wdVI*}(QURb73=beJFBcHGq_}P&6uQe*PVwm~~$%t5%0AGssJ@ZW=oDs9D#-SUFE-FhqMg!j-U;*DjR1 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ℑ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%0D=b1rg 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 IhW$&IuJ+DLxnxWr51ZZU_d`R7~;ON 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⩔LBd7$weNSx2?Y}u;A?hR#lGlgd63nUdZ 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%0AbX+y%`pG=0=x)^4OaWseS< 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 T?Ai&|qXC4W@A*5w!O5bae4Qn0k`E3mZ1 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 z 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%0AO-ao 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�)Pt_2Sc3 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%0AmjW=NgowDl=~Y(20~ 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≈tG^?JODBnJZA#Pj`(NYaIx(fw+{9Rn47 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 2005267 bytes -2023/08/17-15:21:35.633032 6161788928 (Original Log Time 2023/08/17-15:21:35.632945) [db/compaction/compaction_job.cc:885] [default] compacted to: files[0 1 0 0 0 0 0] max score 0.01, MB/sec: 19.7 rd, 19.9 wr, level 1, files in(4, 1) out(1 +0 blob) MB in(0.2, 1.7 +0.0 blob) out(1.9 +0.0 blob), read-write-amplify(19.4) write-amplify(9.8) OK, records in: 42034, records dropped: 4 output_compression: Snappy -2023/08/17-15:21:35.633034 6161788928 (Original Log Time 2023/08/17-15:21:35.632964) EVENT_LOG_v1 {"time_micros": 1692253295632950, "job": 3, "event": "compaction_finished", "compaction_time_micros": 100891, "compaction_time_cpu_micros": 100032, "output_level": 1, "num_output_files": 1, "total_output_size": 2005267, "num_input_records": 42034, "num_output_records": 42030, "num_subcompactions": 1, "output_compression": "Snappy", "num_single_delete_mismatches": 0, "num_single_delete_fallthrough": 0, "lsm_state": [0, 1, 0, 0, 0, 0, 0]} -2023/08/17-15:21:35.633118 6161788928 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000185.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/17-15:21:35.633123 6161788928 EVENT_LOG_v1 {"time_micros": 1692253295633121, "job": 3, "event": "table_file_deletion", "file_number": 185} -2023/08/17-15:21:35.633176 6161788928 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000180.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/17-15:21:35.633180 6161788928 EVENT_LOG_v1 {"time_micros": 1692253295633179, "job": 3, "event": "table_file_deletion", "file_number": 180} -2023/08/17-15:21:35.633228 6161788928 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000175.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/17-15:21:35.633232 6161788928 EVENT_LOG_v1 {"time_micros": 1692253295633231, "job": 3, "event": "table_file_deletion", "file_number": 175} -2023/08/17-15:21:35.633298 6161788928 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000166.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/17-15:21:35.633301 6161788928 EVENT_LOG_v1 {"time_micros": 1692253295633300, "job": 3, "event": "table_file_deletion", "file_number": 166} -2023/08/17-15:21:35.633385 6161788928 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000163.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/17-15:21:35.633389 6161788928 EVENT_LOG_v1 {"time_micros": 1692253295633388, "job": 3, "event": "table_file_deletion", "file_number": 163} diff --git a/rust/hyperlane_db/LOG.old.1692109095866656 b/rust/hyperlane_db/LOG.old.1692109095866656 deleted file mode 100644 index e55706e1a6..0000000000 --- a/rust/hyperlane_db/LOG.old.1692109095866656 +++ /dev/null @@ -1,278 +0,0 @@ -2023/08/15-23:09:01.441654 8651103744 RocksDB version: 8.1.1 -2023/08/15-23:09:01.442120 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/15-23:09:01.442124 8651103744 DB SUMMARY -2023/08/15-23:09:01.442125 8651103744 DB Session ID: 5Z3AZ32JWZF523KTVDTX -2023/08/15-23:09:01.442179 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 0, files: -2023/08/15-23:09:01.442182 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: -2023/08/15-23:09:01.442183 8651103744 Options.error_if_exists: 0 -2023/08/15-23:09:01.442184 8651103744 Options.create_if_missing: 1 -2023/08/15-23:09:01.442184 8651103744 Options.paranoid_checks: 1 -2023/08/15-23:09:01.442185 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/15-23:09:01.442186 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/15-23:09:01.442186 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/15-23:09:01.442187 8651103744 Options.env: 0x107247828 -2023/08/15-23:09:01.442188 8651103744 Options.fs: PosixFileSystem -2023/08/15-23:09:01.442188 8651103744 Options.info_log: 0x130104098 -2023/08/15-23:09:01.442189 8651103744 Options.max_file_opening_threads: 16 -2023/08/15-23:09:01.442189 8651103744 Options.statistics: 0x0 -2023/08/15-23:09:01.442190 8651103744 Options.use_fsync: 0 -2023/08/15-23:09:01.442190 8651103744 Options.max_log_file_size: 0 -2023/08/15-23:09:01.442191 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/15-23:09:01.442192 8651103744 Options.log_file_time_to_roll: 0 -2023/08/15-23:09:01.442192 8651103744 Options.keep_log_file_num: 1000 -2023/08/15-23:09:01.442193 8651103744 Options.recycle_log_file_num: 0 -2023/08/15-23:09:01.442193 8651103744 Options.allow_fallocate: 1 -2023/08/15-23:09:01.442194 8651103744 Options.allow_mmap_reads: 0 -2023/08/15-23:09:01.442194 8651103744 Options.allow_mmap_writes: 0 -2023/08/15-23:09:01.442195 8651103744 Options.use_direct_reads: 0 -2023/08/15-23:09:01.442195 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/15-23:09:01.442196 8651103744 Options.create_missing_column_families: 0 -2023/08/15-23:09:01.442196 8651103744 Options.db_log_dir: -2023/08/15-23:09:01.442197 8651103744 Options.wal_dir: -2023/08/15-23:09:01.442198 8651103744 Options.table_cache_numshardbits: 6 -2023/08/15-23:09:01.442198 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/15-23:09:01.442199 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/15-23:09:01.442199 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/15-23:09:01.442200 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/15-23:09:01.442200 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/15-23:09:01.442201 8651103744 Options.advise_random_on_open: 1 -2023/08/15-23:09:01.442201 8651103744 Options.db_write_buffer_size: 0 -2023/08/15-23:09:01.442202 8651103744 Options.write_buffer_manager: 0x600003e5c000 -2023/08/15-23:09:01.442203 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/15-23:09:01.442203 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/15-23:09:01.442204 8651103744 Options.use_adaptive_mutex: 0 -2023/08/15-23:09:01.442204 8651103744 Options.rate_limiter: 0x0 -2023/08/15-23:09:01.442205 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/15-23:09:01.442206 8651103744 Options.wal_recovery_mode: 2 -2023/08/15-23:09:01.442206 8651103744 Options.enable_thread_tracking: 0 -2023/08/15-23:09:01.442207 8651103744 Options.enable_pipelined_write: 0 -2023/08/15-23:09:01.442207 8651103744 Options.unordered_write: 0 -2023/08/15-23:09:01.442208 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/15-23:09:01.442208 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/15-23:09:01.442209 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/15-23:09:01.442209 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/15-23:09:01.442210 8651103744 Options.row_cache: None -2023/08/15-23:09:01.442210 8651103744 Options.wal_filter: None -2023/08/15-23:09:01.442214 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/15-23:09:01.442215 8651103744 Options.allow_ingest_behind: 0 -2023/08/15-23:09:01.442215 8651103744 Options.two_write_queues: 0 -2023/08/15-23:09:01.442216 8651103744 Options.manual_wal_flush: 0 -2023/08/15-23:09:01.442216 8651103744 Options.wal_compression: 0 -2023/08/15-23:09:01.442217 8651103744 Options.atomic_flush: 0 -2023/08/15-23:09:01.442217 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/15-23:09:01.442218 8651103744 Options.persist_stats_to_disk: 0 -2023/08/15-23:09:01.442219 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/15-23:09:01.442219 8651103744 Options.log_readahead_size: 0 -2023/08/15-23:09:01.442220 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/15-23:09:01.442220 8651103744 Options.best_efforts_recovery: 0 -2023/08/15-23:09:01.442221 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/15-23:09:01.442221 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/15-23:09:01.442222 8651103744 Options.allow_data_in_errors: 0 -2023/08/15-23:09:01.442223 8651103744 Options.db_host_id: __hostname__ -2023/08/15-23:09:01.442223 8651103744 Options.enforce_single_del_contracts: true -2023/08/15-23:09:01.442224 8651103744 Options.max_background_jobs: 2 -2023/08/15-23:09:01.442224 8651103744 Options.max_background_compactions: -1 -2023/08/15-23:09:01.442225 8651103744 Options.max_subcompactions: 1 -2023/08/15-23:09:01.442225 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/15-23:09:01.442226 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/15-23:09:01.442226 8651103744 Options.delayed_write_rate : 16777216 -2023/08/15-23:09:01.442227 8651103744 Options.max_total_wal_size: 0 -2023/08/15-23:09:01.442228 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/15-23:09:01.442228 8651103744 Options.stats_dump_period_sec: 600 -2023/08/15-23:09:01.442229 8651103744 Options.stats_persist_period_sec: 600 -2023/08/15-23:09:01.442229 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/15-23:09:01.442230 8651103744 Options.max_open_files: -1 -2023/08/15-23:09:01.442230 8651103744 Options.bytes_per_sync: 0 -2023/08/15-23:09:01.442231 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/15-23:09:01.442231 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/15-23:09:01.442232 8651103744 Options.compaction_readahead_size: 0 -2023/08/15-23:09:01.442233 8651103744 Options.max_background_flushes: -1 -2023/08/15-23:09:01.442233 8651103744 Compression algorithms supported: -2023/08/15-23:09:01.442248 8651103744 kZSTD supported: 1 -2023/08/15-23:09:01.442249 8651103744 kZlibCompression supported: 1 -2023/08/15-23:09:01.442249 8651103744 kXpressCompression supported: 0 -2023/08/15-23:09:01.442250 8651103744 kSnappyCompression supported: 1 -2023/08/15-23:09:01.442250 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/15-23:09:01.442251 8651103744 kLZ4HCCompression supported: 1 -2023/08/15-23:09:01.442251 8651103744 kLZ4Compression supported: 1 -2023/08/15-23:09:01.442252 8651103744 kBZip2Compression supported: 1 -2023/08/15-23:09:01.442258 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/15-23:09:01.442259 8651103744 DMutex implementation: pthread_mutex_t -2023/08/15-23:09:01.442515 8651103744 [db/db_impl/db_impl_open.cc:315] Creating manifest 1 -2023/08/15-23:09:01.442789 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000001 -2023/08/15-23:09:01.442861 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/15-23:09:01.442863 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/15-23:09:01.442863 8651103744 Options.merge_operator: None -2023/08/15-23:09:01.442864 8651103744 Options.compaction_filter: None -2023/08/15-23:09:01.442865 8651103744 Options.compaction_filter_factory: None -2023/08/15-23:09:01.442865 8651103744 Options.sst_partitioner_factory: None -2023/08/15-23:09:01.442866 8651103744 Options.memtable_factory: SkipListFactory -2023/08/15-23:09:01.442866 8651103744 Options.table_factory: BlockBasedTable -2023/08/15-23:09:01.442877 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600000558640) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000030500d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/15-23:09:01.442878 8651103744 Options.write_buffer_size: 67108864 -2023/08/15-23:09:01.442878 8651103744 Options.max_write_buffer_number: 2 -2023/08/15-23:09:01.442879 8651103744 Options.compression: Snappy -2023/08/15-23:09:01.442880 8651103744 Options.bottommost_compression: Disabled -2023/08/15-23:09:01.442880 8651103744 Options.prefix_extractor: nullptr -2023/08/15-23:09:01.442881 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/15-23:09:01.442882 8651103744 Options.num_levels: 7 -2023/08/15-23:09:01.442882 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/15-23:09:01.442883 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/15-23:09:01.442883 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/15-23:09:01.442884 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/15-23:09:01.442885 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/15-23:09:01.442885 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/15-23:09:01.442886 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/15-23:09:01.442886 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/15-23:09:01.442887 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/15-23:09:01.442888 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/15-23:09:01.442888 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/15-23:09:01.442889 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/15-23:09:01.442889 8651103744 Options.compression_opts.window_bits: -14 -2023/08/15-23:09:01.442890 8651103744 Options.compression_opts.level: 32767 -2023/08/15-23:09:01.442891 8651103744 Options.compression_opts.strategy: 0 -2023/08/15-23:09:01.442891 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/15-23:09:01.442892 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/15-23:09:01.442892 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/15-23:09:01.442893 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/15-23:09:01.442893 8651103744 Options.compression_opts.enabled: false -2023/08/15-23:09:01.442894 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/15-23:09:01.442895 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/15-23:09:01.442895 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/15-23:09:01.442896 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/15-23:09:01.442896 8651103744 Options.target_file_size_base: 67108864 -2023/08/15-23:09:01.442897 8651103744 Options.target_file_size_multiplier: 1 -2023/08/15-23:09:01.442897 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/15-23:09:01.442898 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/15-23:09:01.442899 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/15-23:09:01.442899 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/15-23:09:01.442900 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/15-23:09:01.442901 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/15-23:09:01.442901 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/15-23:09:01.442902 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/15-23:09:01.442902 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/15-23:09:01.442903 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/15-23:09:01.442903 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/15-23:09:01.442904 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/15-23:09:01.442904 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/15-23:09:01.442905 8651103744 Options.arena_block_size: 1048576 -2023/08/15-23:09:01.442906 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/15-23:09:01.442910 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/15-23:09:01.442910 8651103744 Options.disable_auto_compactions: 0 -2023/08/15-23:09:01.442911 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/15-23:09:01.442912 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/15-23:09:01.442912 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/15-23:09:01.442913 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/15-23:09:01.442913 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/15-23:09:01.442914 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/15-23:09:01.442915 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/15-23:09:01.442915 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/15-23:09:01.442917 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/15-23:09:01.442918 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/15-23:09:01.442919 8651103744 Options.table_properties_collectors: -2023/08/15-23:09:01.442920 8651103744 Options.inplace_update_support: 0 -2023/08/15-23:09:01.442920 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/15-23:09:01.442921 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/15-23:09:01.442922 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/15-23:09:01.442922 8651103744 Options.memtable_huge_page_size: 0 -2023/08/15-23:09:01.442923 8651103744 Options.bloom_locality: 0 -2023/08/15-23:09:01.442923 8651103744 Options.max_successive_merges: 0 -2023/08/15-23:09:01.442924 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/15-23:09:01.442924 8651103744 Options.paranoid_file_checks: 0 -2023/08/15-23:09:01.442925 8651103744 Options.force_consistency_checks: 1 -2023/08/15-23:09:01.442926 8651103744 Options.report_bg_io_stats: 0 -2023/08/15-23:09:01.442926 8651103744 Options.ttl: 2592000 -2023/08/15-23:09:01.442927 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/15-23:09:01.442927 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/15-23:09:01.442928 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/15-23:09:01.442928 8651103744 Options.enable_blob_files: false -2023/08/15-23:09:01.442929 8651103744 Options.min_blob_size: 0 -2023/08/15-23:09:01.442929 8651103744 Options.blob_file_size: 268435456 -2023/08/15-23:09:01.442930 8651103744 Options.blob_compression_type: NoCompression -2023/08/15-23:09:01.442931 8651103744 Options.enable_blob_garbage_collection: false -2023/08/15-23:09:01.442931 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/15-23:09:01.442932 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/15-23:09:01.442932 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/15-23:09:01.442933 8651103744 Options.blob_file_starting_level: 0 -2023/08/15-23:09:01.442934 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/15-23:09:01.443287 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000001 succeeded,manifest_file_number is 1, next_file_number is 3, last_sequence is 0, log_number is 0,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 0 -2023/08/15-23:09:01.443289 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 0 -2023/08/15-23:09:01.443347 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/15-23:09:01.443463 8651103744 [db/version_set.cc:5180] Creating manifest 5 -2023/08/15-23:09:01.444454 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x1301041f0 -2023/08/15-23:09:01.444473 8651103744 DB pointer 0x130808200 -2023/08/15-23:09:01.444557 6090125312 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/15-23:09:01.444559 6090125312 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - Sum 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000030500d8#73693 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 8e-06 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** -2023/08/15-23:09:01.444836 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work -2023/08/15-23:09:01.444913 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692109129283399 b/rust/hyperlane_db/LOG.old.1692109129283399 deleted file mode 100644 index 9157183844..0000000000 --- a/rust/hyperlane_db/LOG.old.1692109129283399 +++ /dev/null @@ -1,283 +0,0 @@ -2023/08/15-23:18:15.867712 8651103744 RocksDB version: 8.1.1 -2023/08/15-23:18:15.868868 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/15-23:18:15.868873 8651103744 DB SUMMARY -2023/08/15-23:18:15.868875 8651103744 DB Session ID: OIJ4PXN88HMU1EU8ASEF -2023/08/15-23:18:15.869038 8651103744 CURRENT file: CURRENT -2023/08/15-23:18:15.869041 8651103744 IDENTITY file: IDENTITY -2023/08/15-23:18:15.869067 8651103744 MANIFEST file: MANIFEST-000005 size: 66 Bytes -2023/08/15-23:18:15.869073 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 0, files: -2023/08/15-23:18:15.869107 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000004.log size: 0 ; -2023/08/15-23:18:15.869109 8651103744 Options.error_if_exists: 0 -2023/08/15-23:18:15.869112 8651103744 Options.create_if_missing: 1 -2023/08/15-23:18:15.869113 8651103744 Options.paranoid_checks: 1 -2023/08/15-23:18:15.869115 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/15-23:18:15.869117 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/15-23:18:15.869118 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/15-23:18:15.869120 8651103744 Options.env: 0x106edf828 -2023/08/15-23:18:15.869122 8651103744 Options.fs: PosixFileSystem -2023/08/15-23:18:15.869124 8651103744 Options.info_log: 0x117704818 -2023/08/15-23:18:15.869126 8651103744 Options.max_file_opening_threads: 16 -2023/08/15-23:18:15.869127 8651103744 Options.statistics: 0x0 -2023/08/15-23:18:15.869129 8651103744 Options.use_fsync: 0 -2023/08/15-23:18:15.869131 8651103744 Options.max_log_file_size: 0 -2023/08/15-23:18:15.869133 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/15-23:18:15.869135 8651103744 Options.log_file_time_to_roll: 0 -2023/08/15-23:18:15.869136 8651103744 Options.keep_log_file_num: 1000 -2023/08/15-23:18:15.869138 8651103744 Options.recycle_log_file_num: 0 -2023/08/15-23:18:15.869140 8651103744 Options.allow_fallocate: 1 -2023/08/15-23:18:15.869141 8651103744 Options.allow_mmap_reads: 0 -2023/08/15-23:18:15.869143 8651103744 Options.allow_mmap_writes: 0 -2023/08/15-23:18:15.869144 8651103744 Options.use_direct_reads: 0 -2023/08/15-23:18:15.869146 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/15-23:18:15.869148 8651103744 Options.create_missing_column_families: 0 -2023/08/15-23:18:15.869149 8651103744 Options.db_log_dir: -2023/08/15-23:18:15.869151 8651103744 Options.wal_dir: -2023/08/15-23:18:15.869153 8651103744 Options.table_cache_numshardbits: 6 -2023/08/15-23:18:15.869154 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/15-23:18:15.869156 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/15-23:18:15.869158 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/15-23:18:15.869159 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/15-23:18:15.869161 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/15-23:18:15.869163 8651103744 Options.advise_random_on_open: 1 -2023/08/15-23:18:15.869164 8651103744 Options.db_write_buffer_size: 0 -2023/08/15-23:18:15.869166 8651103744 Options.write_buffer_manager: 0x600002c9c000 -2023/08/15-23:18:15.869168 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/15-23:18:15.869169 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/15-23:18:15.869171 8651103744 Options.use_adaptive_mutex: 0 -2023/08/15-23:18:15.869173 8651103744 Options.rate_limiter: 0x0 -2023/08/15-23:18:15.869178 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/15-23:18:15.869180 8651103744 Options.wal_recovery_mode: 2 -2023/08/15-23:18:15.869182 8651103744 Options.enable_thread_tracking: 0 -2023/08/15-23:18:15.869183 8651103744 Options.enable_pipelined_write: 0 -2023/08/15-23:18:15.869185 8651103744 Options.unordered_write: 0 -2023/08/15-23:18:15.869187 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/15-23:18:15.869188 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/15-23:18:15.869190 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/15-23:18:15.869192 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/15-23:18:15.869193 8651103744 Options.row_cache: None -2023/08/15-23:18:15.869195 8651103744 Options.wal_filter: None -2023/08/15-23:18:15.869197 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/15-23:18:15.869198 8651103744 Options.allow_ingest_behind: 0 -2023/08/15-23:18:15.869200 8651103744 Options.two_write_queues: 0 -2023/08/15-23:18:15.869202 8651103744 Options.manual_wal_flush: 0 -2023/08/15-23:18:15.869203 8651103744 Options.wal_compression: 0 -2023/08/15-23:18:15.869205 8651103744 Options.atomic_flush: 0 -2023/08/15-23:18:15.869207 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/15-23:18:15.869208 8651103744 Options.persist_stats_to_disk: 0 -2023/08/15-23:18:15.869210 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/15-23:18:15.869212 8651103744 Options.log_readahead_size: 0 -2023/08/15-23:18:15.869214 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/15-23:18:15.869216 8651103744 Options.best_efforts_recovery: 0 -2023/08/15-23:18:15.869217 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/15-23:18:15.869219 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/15-23:18:15.869221 8651103744 Options.allow_data_in_errors: 0 -2023/08/15-23:18:15.869223 8651103744 Options.db_host_id: __hostname__ -2023/08/15-23:18:15.869224 8651103744 Options.enforce_single_del_contracts: true -2023/08/15-23:18:15.869226 8651103744 Options.max_background_jobs: 2 -2023/08/15-23:18:15.869228 8651103744 Options.max_background_compactions: -1 -2023/08/15-23:18:15.869230 8651103744 Options.max_subcompactions: 1 -2023/08/15-23:18:15.869231 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/15-23:18:15.869233 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/15-23:18:15.869235 8651103744 Options.delayed_write_rate : 16777216 -2023/08/15-23:18:15.869236 8651103744 Options.max_total_wal_size: 0 -2023/08/15-23:18:15.869238 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/15-23:18:15.869241 8651103744 Options.stats_dump_period_sec: 600 -2023/08/15-23:18:15.869243 8651103744 Options.stats_persist_period_sec: 600 -2023/08/15-23:18:15.869244 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/15-23:18:15.869246 8651103744 Options.max_open_files: -1 -2023/08/15-23:18:15.869248 8651103744 Options.bytes_per_sync: 0 -2023/08/15-23:18:15.869250 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/15-23:18:15.869251 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/15-23:18:15.869253 8651103744 Options.compaction_readahead_size: 0 -2023/08/15-23:18:15.869254 8651103744 Options.max_background_flushes: -1 -2023/08/15-23:18:15.869256 8651103744 Compression algorithms supported: -2023/08/15-23:18:15.869290 8651103744 kZSTD supported: 1 -2023/08/15-23:18:15.869292 8651103744 kZlibCompression supported: 1 -2023/08/15-23:18:15.869294 8651103744 kXpressCompression supported: 0 -2023/08/15-23:18:15.869296 8651103744 kSnappyCompression supported: 1 -2023/08/15-23:18:15.869297 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/15-23:18:15.869299 8651103744 kLZ4HCCompression supported: 1 -2023/08/15-23:18:15.869301 8651103744 kLZ4Compression supported: 1 -2023/08/15-23:18:15.869302 8651103744 kBZip2Compression supported: 1 -2023/08/15-23:18:15.869316 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/15-23:18:15.869318 8651103744 DMutex implementation: pthread_mutex_t -2023/08/15-23:18:15.869847 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000005 -2023/08/15-23:18:15.869965 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/15-23:18:15.869967 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/15-23:18:15.869968 8651103744 Options.merge_operator: None -2023/08/15-23:18:15.869968 8651103744 Options.compaction_filter: None -2023/08/15-23:18:15.869969 8651103744 Options.compaction_filter_factory: None -2023/08/15-23:18:15.869970 8651103744 Options.sst_partitioner_factory: None -2023/08/15-23:18:15.869970 8651103744 Options.memtable_factory: SkipListFactory -2023/08/15-23:18:15.869971 8651103744 Options.table_factory: BlockBasedTable -2023/08/15-23:18:15.870002 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600001798040) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000022900d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/15-23:18:15.870004 8651103744 Options.write_buffer_size: 67108864 -2023/08/15-23:18:15.870005 8651103744 Options.max_write_buffer_number: 2 -2023/08/15-23:18:15.870006 8651103744 Options.compression: Snappy -2023/08/15-23:18:15.870007 8651103744 Options.bottommost_compression: Disabled -2023/08/15-23:18:15.870007 8651103744 Options.prefix_extractor: nullptr -2023/08/15-23:18:15.870008 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/15-23:18:15.870009 8651103744 Options.num_levels: 7 -2023/08/15-23:18:15.870009 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/15-23:18:15.870010 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/15-23:18:15.870011 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/15-23:18:15.870011 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/15-23:18:15.870012 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/15-23:18:15.870013 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/15-23:18:15.870013 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/15-23:18:15.870014 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/15-23:18:15.870014 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/15-23:18:15.870017 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/15-23:18:15.870018 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/15-23:18:15.870019 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/15-23:18:15.870019 8651103744 Options.compression_opts.window_bits: -14 -2023/08/15-23:18:15.870020 8651103744 Options.compression_opts.level: 32767 -2023/08/15-23:18:15.870021 8651103744 Options.compression_opts.strategy: 0 -2023/08/15-23:18:15.870021 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/15-23:18:15.870022 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/15-23:18:15.870023 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/15-23:18:15.870023 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/15-23:18:15.870024 8651103744 Options.compression_opts.enabled: false -2023/08/15-23:18:15.870025 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/15-23:18:15.870025 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/15-23:18:15.870026 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/15-23:18:15.870026 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/15-23:18:15.870027 8651103744 Options.target_file_size_base: 67108864 -2023/08/15-23:18:15.870028 8651103744 Options.target_file_size_multiplier: 1 -2023/08/15-23:18:15.870028 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/15-23:18:15.870029 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/15-23:18:15.870030 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/15-23:18:15.870031 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/15-23:18:15.870031 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/15-23:18:15.870032 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/15-23:18:15.870033 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/15-23:18:15.870033 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/15-23:18:15.870034 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/15-23:18:15.870035 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/15-23:18:15.870035 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/15-23:18:15.870036 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/15-23:18:15.870037 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/15-23:18:15.870037 8651103744 Options.arena_block_size: 1048576 -2023/08/15-23:18:15.870038 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/15-23:18:15.870039 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/15-23:18:15.870039 8651103744 Options.disable_auto_compactions: 0 -2023/08/15-23:18:15.870040 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/15-23:18:15.870043 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/15-23:18:15.870043 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/15-23:18:15.870044 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/15-23:18:15.870045 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/15-23:18:15.870046 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/15-23:18:15.870046 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/15-23:18:15.870052 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/15-23:18:15.870052 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/15-23:18:15.870053 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/15-23:18:15.870054 8651103744 Options.table_properties_collectors: -2023/08/15-23:18:15.870055 8651103744 Options.inplace_update_support: 0 -2023/08/15-23:18:15.870056 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/15-23:18:15.870056 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/15-23:18:15.870057 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/15-23:18:15.870058 8651103744 Options.memtable_huge_page_size: 0 -2023/08/15-23:18:15.870058 8651103744 Options.bloom_locality: 0 -2023/08/15-23:18:15.870059 8651103744 Options.max_successive_merges: 0 -2023/08/15-23:18:15.870059 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/15-23:18:15.870060 8651103744 Options.paranoid_file_checks: 0 -2023/08/15-23:18:15.870061 8651103744 Options.force_consistency_checks: 1 -2023/08/15-23:18:15.870061 8651103744 Options.report_bg_io_stats: 0 -2023/08/15-23:18:15.870062 8651103744 Options.ttl: 2592000 -2023/08/15-23:18:15.870063 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/15-23:18:15.870065 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/15-23:18:15.870066 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/15-23:18:15.870067 8651103744 Options.enable_blob_files: false -2023/08/15-23:18:15.870067 8651103744 Options.min_blob_size: 0 -2023/08/15-23:18:15.870068 8651103744 Options.blob_file_size: 268435456 -2023/08/15-23:18:15.870069 8651103744 Options.blob_compression_type: NoCompression -2023/08/15-23:18:15.870069 8651103744 Options.enable_blob_garbage_collection: false -2023/08/15-23:18:15.870070 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/15-23:18:15.870071 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/15-23:18:15.870071 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/15-23:18:15.870072 8651103744 Options.blob_file_starting_level: 0 -2023/08/15-23:18:15.870073 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/15-23:18:15.870646 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000005 succeeded,manifest_file_number is 5, next_file_number is 7, last_sequence is 0, log_number is 0,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 0 -2023/08/15-23:18:15.870648 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 0 -2023/08/15-23:18:15.870733 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/15-23:18:15.870830 8651103744 EVENT_LOG_v1 {"time_micros": 1692109095870826, "job": 1, "event": "recovery_started", "wal_files": [4]} -2023/08/15-23:18:15.870832 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #4 mode 2 -2023/08/15-23:18:15.870878 8651103744 EVENT_LOG_v1 {"time_micros": 1692109095870877, "job": 1, "event": "recovery_finished"} -2023/08/15-23:18:15.870941 8651103744 [db/version_set.cc:5180] Creating manifest 9 -2023/08/15-23:18:15.872126 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x107d04080 -2023/08/15-23:18:15.872146 8651103744 DB pointer 0x12000b400 -2023/08/15-23:18:15.872266 6093664256 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/15-23:18:15.872283 6093664256 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - Sum 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000022900d8#74297 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 9e-06 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** -2023/08/15-23:18:15.875262 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work -2023/08/15-23:18:15.875539 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692109142543801 b/rust/hyperlane_db/LOG.old.1692109142543801 deleted file mode 100644 index 9e05946e93..0000000000 --- a/rust/hyperlane_db/LOG.old.1692109142543801 +++ /dev/null @@ -1,284 +0,0 @@ -2023/08/15-23:18:49.283853 8651103744 RocksDB version: 8.1.1 -2023/08/15-23:18:49.284548 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/15-23:18:49.284551 8651103744 DB SUMMARY -2023/08/15-23:18:49.284553 8651103744 DB Session ID: B7VD9B7G4GRD4YGNBNF7 -2023/08/15-23:18:49.284655 8651103744 CURRENT file: CURRENT -2023/08/15-23:18:49.284656 8651103744 IDENTITY file: IDENTITY -2023/08/15-23:18:49.284672 8651103744 MANIFEST file: MANIFEST-000009 size: 81 Bytes -2023/08/15-23:18:49.284674 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 0, files: -2023/08/15-23:18:49.284700 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000004.log size: 0 ; 000008.log size: 0 ; -2023/08/15-23:18:49.284702 8651103744 Options.error_if_exists: 0 -2023/08/15-23:18:49.284703 8651103744 Options.create_if_missing: 1 -2023/08/15-23:18:49.284704 8651103744 Options.paranoid_checks: 1 -2023/08/15-23:18:49.284705 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/15-23:18:49.284706 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/15-23:18:49.284707 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/15-23:18:49.284708 8651103744 Options.env: 0x102aaf828 -2023/08/15-23:18:49.284709 8651103744 Options.fs: PosixFileSystem -2023/08/15-23:18:49.284710 8651103744 Options.info_log: 0x153f05fb8 -2023/08/15-23:18:49.284711 8651103744 Options.max_file_opening_threads: 16 -2023/08/15-23:18:49.284712 8651103744 Options.statistics: 0x0 -2023/08/15-23:18:49.284713 8651103744 Options.use_fsync: 0 -2023/08/15-23:18:49.284714 8651103744 Options.max_log_file_size: 0 -2023/08/15-23:18:49.284715 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/15-23:18:49.284717 8651103744 Options.log_file_time_to_roll: 0 -2023/08/15-23:18:49.284718 8651103744 Options.keep_log_file_num: 1000 -2023/08/15-23:18:49.284719 8651103744 Options.recycle_log_file_num: 0 -2023/08/15-23:18:49.284720 8651103744 Options.allow_fallocate: 1 -2023/08/15-23:18:49.284721 8651103744 Options.allow_mmap_reads: 0 -2023/08/15-23:18:49.284722 8651103744 Options.allow_mmap_writes: 0 -2023/08/15-23:18:49.284723 8651103744 Options.use_direct_reads: 0 -2023/08/15-23:18:49.284724 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/15-23:18:49.284725 8651103744 Options.create_missing_column_families: 0 -2023/08/15-23:18:49.284726 8651103744 Options.db_log_dir: -2023/08/15-23:18:49.284727 8651103744 Options.wal_dir: -2023/08/15-23:18:49.284728 8651103744 Options.table_cache_numshardbits: 6 -2023/08/15-23:18:49.284729 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/15-23:18:49.284730 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/15-23:18:49.284731 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/15-23:18:49.284732 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/15-23:18:49.284733 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/15-23:18:49.284734 8651103744 Options.advise_random_on_open: 1 -2023/08/15-23:18:49.284735 8651103744 Options.db_write_buffer_size: 0 -2023/08/15-23:18:49.284736 8651103744 Options.write_buffer_manager: 0x6000022bc820 -2023/08/15-23:18:49.284737 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/15-23:18:49.284738 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/15-23:18:49.284739 8651103744 Options.use_adaptive_mutex: 0 -2023/08/15-23:18:49.284740 8651103744 Options.rate_limiter: 0x0 -2023/08/15-23:18:49.284741 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/15-23:18:49.284742 8651103744 Options.wal_recovery_mode: 2 -2023/08/15-23:18:49.284743 8651103744 Options.enable_thread_tracking: 0 -2023/08/15-23:18:49.284744 8651103744 Options.enable_pipelined_write: 0 -2023/08/15-23:18:49.284745 8651103744 Options.unordered_write: 0 -2023/08/15-23:18:49.284746 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/15-23:18:49.284747 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/15-23:18:49.284748 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/15-23:18:49.284749 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/15-23:18:49.284750 8651103744 Options.row_cache: None -2023/08/15-23:18:49.284751 8651103744 Options.wal_filter: None -2023/08/15-23:18:49.284752 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/15-23:18:49.284753 8651103744 Options.allow_ingest_behind: 0 -2023/08/15-23:18:49.284754 8651103744 Options.two_write_queues: 0 -2023/08/15-23:18:49.284755 8651103744 Options.manual_wal_flush: 0 -2023/08/15-23:18:49.284756 8651103744 Options.wal_compression: 0 -2023/08/15-23:18:49.284757 8651103744 Options.atomic_flush: 0 -2023/08/15-23:18:49.284758 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/15-23:18:49.284759 8651103744 Options.persist_stats_to_disk: 0 -2023/08/15-23:18:49.284760 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/15-23:18:49.284761 8651103744 Options.log_readahead_size: 0 -2023/08/15-23:18:49.284762 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/15-23:18:49.284763 8651103744 Options.best_efforts_recovery: 0 -2023/08/15-23:18:49.284764 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/15-23:18:49.284765 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/15-23:18:49.284766 8651103744 Options.allow_data_in_errors: 0 -2023/08/15-23:18:49.284767 8651103744 Options.db_host_id: __hostname__ -2023/08/15-23:18:49.284768 8651103744 Options.enforce_single_del_contracts: true -2023/08/15-23:18:49.284769 8651103744 Options.max_background_jobs: 2 -2023/08/15-23:18:49.284770 8651103744 Options.max_background_compactions: -1 -2023/08/15-23:18:49.284771 8651103744 Options.max_subcompactions: 1 -2023/08/15-23:18:49.284772 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/15-23:18:49.284773 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/15-23:18:49.284774 8651103744 Options.delayed_write_rate : 16777216 -2023/08/15-23:18:49.284775 8651103744 Options.max_total_wal_size: 0 -2023/08/15-23:18:49.284776 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/15-23:18:49.284777 8651103744 Options.stats_dump_period_sec: 600 -2023/08/15-23:18:49.284778 8651103744 Options.stats_persist_period_sec: 600 -2023/08/15-23:18:49.284779 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/15-23:18:49.284780 8651103744 Options.max_open_files: -1 -2023/08/15-23:18:49.284781 8651103744 Options.bytes_per_sync: 0 -2023/08/15-23:18:49.284782 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/15-23:18:49.284783 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/15-23:18:49.284784 8651103744 Options.compaction_readahead_size: 0 -2023/08/15-23:18:49.284785 8651103744 Options.max_background_flushes: -1 -2023/08/15-23:18:49.284786 8651103744 Compression algorithms supported: -2023/08/15-23:18:49.284811 8651103744 kZSTD supported: 1 -2023/08/15-23:18:49.284812 8651103744 kZlibCompression supported: 1 -2023/08/15-23:18:49.284813 8651103744 kXpressCompression supported: 0 -2023/08/15-23:18:49.284814 8651103744 kSnappyCompression supported: 1 -2023/08/15-23:18:49.284815 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/15-23:18:49.284816 8651103744 kLZ4HCCompression supported: 1 -2023/08/15-23:18:49.284817 8651103744 kLZ4Compression supported: 1 -2023/08/15-23:18:49.284818 8651103744 kBZip2Compression supported: 1 -2023/08/15-23:18:49.284831 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/15-23:18:49.284832 8651103744 DMutex implementation: pthread_mutex_t -2023/08/15-23:18:49.285033 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000009 -2023/08/15-23:18:49.285149 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/15-23:18:49.285151 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/15-23:18:49.285152 8651103744 Options.merge_operator: None -2023/08/15-23:18:49.285153 8651103744 Options.compaction_filter: None -2023/08/15-23:18:49.285154 8651103744 Options.compaction_filter_factory: None -2023/08/15-23:18:49.285155 8651103744 Options.sst_partitioner_factory: None -2023/08/15-23:18:49.285156 8651103744 Options.memtable_factory: SkipListFactory -2023/08/15-23:18:49.285157 8651103744 Options.table_factory: BlockBasedTable -2023/08/15-23:18:49.285208 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x6000019bee60) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x600002cbc0d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/15-23:18:49.285216 8651103744 Options.write_buffer_size: 67108864 -2023/08/15-23:18:49.285217 8651103744 Options.max_write_buffer_number: 2 -2023/08/15-23:18:49.285218 8651103744 Options.compression: Snappy -2023/08/15-23:18:49.285219 8651103744 Options.bottommost_compression: Disabled -2023/08/15-23:18:49.285220 8651103744 Options.prefix_extractor: nullptr -2023/08/15-23:18:49.285221 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/15-23:18:49.285222 8651103744 Options.num_levels: 7 -2023/08/15-23:18:49.285223 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/15-23:18:49.285224 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/15-23:18:49.285225 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/15-23:18:49.285226 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/15-23:18:49.285227 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/15-23:18:49.285228 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/15-23:18:49.285229 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/15-23:18:49.285230 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/15-23:18:49.285231 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/15-23:18:49.285234 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/15-23:18:49.285235 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/15-23:18:49.285236 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/15-23:18:49.285237 8651103744 Options.compression_opts.window_bits: -14 -2023/08/15-23:18:49.285238 8651103744 Options.compression_opts.level: 32767 -2023/08/15-23:18:49.285239 8651103744 Options.compression_opts.strategy: 0 -2023/08/15-23:18:49.285240 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/15-23:18:49.285241 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/15-23:18:49.285242 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/15-23:18:49.285243 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/15-23:18:49.285244 8651103744 Options.compression_opts.enabled: false -2023/08/15-23:18:49.285245 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/15-23:18:49.285246 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/15-23:18:49.285247 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/15-23:18:49.285248 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/15-23:18:49.285249 8651103744 Options.target_file_size_base: 67108864 -2023/08/15-23:18:49.285250 8651103744 Options.target_file_size_multiplier: 1 -2023/08/15-23:18:49.285251 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/15-23:18:49.285252 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/15-23:18:49.285253 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/15-23:18:49.285254 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/15-23:18:49.285256 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/15-23:18:49.285257 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/15-23:18:49.285258 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/15-23:18:49.285259 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/15-23:18:49.285260 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/15-23:18:49.285261 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/15-23:18:49.285262 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/15-23:18:49.285263 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/15-23:18:49.285264 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/15-23:18:49.285265 8651103744 Options.arena_block_size: 1048576 -2023/08/15-23:18:49.285266 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/15-23:18:49.285267 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/15-23:18:49.285268 8651103744 Options.disable_auto_compactions: 0 -2023/08/15-23:18:49.285272 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/15-23:18:49.285273 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/15-23:18:49.285274 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/15-23:18:49.285275 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/15-23:18:49.285276 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/15-23:18:49.285277 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/15-23:18:49.285278 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/15-23:18:49.285281 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/15-23:18:49.285282 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/15-23:18:49.285283 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/15-23:18:49.285285 8651103744 Options.table_properties_collectors: -2023/08/15-23:18:49.285286 8651103744 Options.inplace_update_support: 0 -2023/08/15-23:18:49.285287 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/15-23:18:49.285288 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/15-23:18:49.285289 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/15-23:18:49.285290 8651103744 Options.memtable_huge_page_size: 0 -2023/08/15-23:18:49.285291 8651103744 Options.bloom_locality: 0 -2023/08/15-23:18:49.285292 8651103744 Options.max_successive_merges: 0 -2023/08/15-23:18:49.285293 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/15-23:18:49.285294 8651103744 Options.paranoid_file_checks: 0 -2023/08/15-23:18:49.285295 8651103744 Options.force_consistency_checks: 1 -2023/08/15-23:18:49.285296 8651103744 Options.report_bg_io_stats: 0 -2023/08/15-23:18:49.285297 8651103744 Options.ttl: 2592000 -2023/08/15-23:18:49.285298 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/15-23:18:49.285302 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/15-23:18:49.285303 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/15-23:18:49.285304 8651103744 Options.enable_blob_files: false -2023/08/15-23:18:49.285305 8651103744 Options.min_blob_size: 0 -2023/08/15-23:18:49.285306 8651103744 Options.blob_file_size: 268435456 -2023/08/15-23:18:49.285307 8651103744 Options.blob_compression_type: NoCompression -2023/08/15-23:18:49.285308 8651103744 Options.enable_blob_garbage_collection: false -2023/08/15-23:18:49.285309 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/15-23:18:49.285310 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/15-23:18:49.285311 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/15-23:18:49.285312 8651103744 Options.blob_file_starting_level: 0 -2023/08/15-23:18:49.285313 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/15-23:18:49.285798 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000009 succeeded,manifest_file_number is 9, next_file_number is 11, last_sequence is 0, log_number is 5,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 0 -2023/08/15-23:18:49.285802 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 5 -2023/08/15-23:18:49.285865 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/15-23:18:49.286000 8651103744 EVENT_LOG_v1 {"time_micros": 1692109129285995, "job": 1, "event": "recovery_started", "wal_files": [4, 8]} -2023/08/15-23:18:49.286003 8651103744 [db/db_impl/db_impl_open.cc:1018] Skipping log #4 since it is older than min log to keep #5 -2023/08/15-23:18:49.286004 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #8 mode 2 -2023/08/15-23:18:49.286064 8651103744 EVENT_LOG_v1 {"time_micros": 1692109129286062, "job": 1, "event": "recovery_finished"} -2023/08/15-23:18:49.286139 8651103744 [db/version_set.cc:5180] Creating manifest 13 -2023/08/15-23:18:49.287463 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x153f06110 -2023/08/15-23:18:49.287482 8651103744 DB pointer 0x15480c800 -2023/08/15-23:18:49.287636 6165164032 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/15-23:18:49.287677 6165164032 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - Sum 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x600002cbc0d8#74352 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 1.7e-05 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** -2023/08/15-23:18:52.075564 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work -2023/08/15-23:18:52.076208 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692109595356629 b/rust/hyperlane_db/LOG.old.1692109595356629 deleted file mode 100644 index 1ab16611b1..0000000000 --- a/rust/hyperlane_db/LOG.old.1692109595356629 +++ /dev/null @@ -1,291 +0,0 @@ -2023/08/15-23:19:02.544177 8651103744 RocksDB version: 8.1.1 -2023/08/15-23:19:02.544755 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/15-23:19:02.544757 8651103744 DB SUMMARY -2023/08/15-23:19:02.544759 8651103744 DB Session ID: IW86BX2GE3YHQWXXJ3BJ -2023/08/15-23:19:02.544871 8651103744 CURRENT file: CURRENT -2023/08/15-23:19:02.544873 8651103744 IDENTITY file: IDENTITY -2023/08/15-23:19:02.544883 8651103744 MANIFEST file: MANIFEST-000013 size: 81 Bytes -2023/08/15-23:19:02.544885 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 0, files: -2023/08/15-23:19:02.544901 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000004.log size: 0 ; 000008.log size: 0 ; 000012.log size: 65 ; -2023/08/15-23:19:02.544902 8651103744 Options.error_if_exists: 0 -2023/08/15-23:19:02.544903 8651103744 Options.create_if_missing: 1 -2023/08/15-23:19:02.544904 8651103744 Options.paranoid_checks: 1 -2023/08/15-23:19:02.544905 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/15-23:19:02.544906 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/15-23:19:02.544906 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/15-23:19:02.544907 8651103744 Options.env: 0x1026d7828 -2023/08/15-23:19:02.544908 8651103744 Options.fs: PosixFileSystem -2023/08/15-23:19:02.544909 8651103744 Options.info_log: 0x144705fb8 -2023/08/15-23:19:02.544910 8651103744 Options.max_file_opening_threads: 16 -2023/08/15-23:19:02.544910 8651103744 Options.statistics: 0x0 -2023/08/15-23:19:02.544911 8651103744 Options.use_fsync: 0 -2023/08/15-23:19:02.544912 8651103744 Options.max_log_file_size: 0 -2023/08/15-23:19:02.544913 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/15-23:19:02.544913 8651103744 Options.log_file_time_to_roll: 0 -2023/08/15-23:19:02.544914 8651103744 Options.keep_log_file_num: 1000 -2023/08/15-23:19:02.544915 8651103744 Options.recycle_log_file_num: 0 -2023/08/15-23:19:02.544915 8651103744 Options.allow_fallocate: 1 -2023/08/15-23:19:02.544916 8651103744 Options.allow_mmap_reads: 0 -2023/08/15-23:19:02.544917 8651103744 Options.allow_mmap_writes: 0 -2023/08/15-23:19:02.544918 8651103744 Options.use_direct_reads: 0 -2023/08/15-23:19:02.544918 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/15-23:19:02.544919 8651103744 Options.create_missing_column_families: 0 -2023/08/15-23:19:02.544920 8651103744 Options.db_log_dir: -2023/08/15-23:19:02.544920 8651103744 Options.wal_dir: -2023/08/15-23:19:02.544921 8651103744 Options.table_cache_numshardbits: 6 -2023/08/15-23:19:02.544922 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/15-23:19:02.544922 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/15-23:19:02.544923 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/15-23:19:02.544924 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/15-23:19:02.544925 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/15-23:19:02.544925 8651103744 Options.advise_random_on_open: 1 -2023/08/15-23:19:02.544926 8651103744 Options.db_write_buffer_size: 0 -2023/08/15-23:19:02.544927 8651103744 Options.write_buffer_manager: 0x600003094820 -2023/08/15-23:19:02.544927 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/15-23:19:02.544928 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/15-23:19:02.544929 8651103744 Options.use_adaptive_mutex: 0 -2023/08/15-23:19:02.544929 8651103744 Options.rate_limiter: 0x0 -2023/08/15-23:19:02.544930 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/15-23:19:02.544931 8651103744 Options.wal_recovery_mode: 2 -2023/08/15-23:19:02.544932 8651103744 Options.enable_thread_tracking: 0 -2023/08/15-23:19:02.544932 8651103744 Options.enable_pipelined_write: 0 -2023/08/15-23:19:02.544933 8651103744 Options.unordered_write: 0 -2023/08/15-23:19:02.544934 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/15-23:19:02.544934 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/15-23:19:02.544935 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/15-23:19:02.544936 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/15-23:19:02.544936 8651103744 Options.row_cache: None -2023/08/15-23:19:02.544937 8651103744 Options.wal_filter: None -2023/08/15-23:19:02.544938 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/15-23:19:02.544938 8651103744 Options.allow_ingest_behind: 0 -2023/08/15-23:19:02.544939 8651103744 Options.two_write_queues: 0 -2023/08/15-23:19:02.544940 8651103744 Options.manual_wal_flush: 0 -2023/08/15-23:19:02.544940 8651103744 Options.wal_compression: 0 -2023/08/15-23:19:02.544941 8651103744 Options.atomic_flush: 0 -2023/08/15-23:19:02.544942 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/15-23:19:02.544942 8651103744 Options.persist_stats_to_disk: 0 -2023/08/15-23:19:02.544943 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/15-23:19:02.544944 8651103744 Options.log_readahead_size: 0 -2023/08/15-23:19:02.544944 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/15-23:19:02.544945 8651103744 Options.best_efforts_recovery: 0 -2023/08/15-23:19:02.544946 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/15-23:19:02.544947 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/15-23:19:02.544947 8651103744 Options.allow_data_in_errors: 0 -2023/08/15-23:19:02.544948 8651103744 Options.db_host_id: __hostname__ -2023/08/15-23:19:02.544949 8651103744 Options.enforce_single_del_contracts: true -2023/08/15-23:19:02.544949 8651103744 Options.max_background_jobs: 2 -2023/08/15-23:19:02.544950 8651103744 Options.max_background_compactions: -1 -2023/08/15-23:19:02.544951 8651103744 Options.max_subcompactions: 1 -2023/08/15-23:19:02.544952 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/15-23:19:02.544952 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/15-23:19:02.544953 8651103744 Options.delayed_write_rate : 16777216 -2023/08/15-23:19:02.544954 8651103744 Options.max_total_wal_size: 0 -2023/08/15-23:19:02.544954 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/15-23:19:02.544955 8651103744 Options.stats_dump_period_sec: 600 -2023/08/15-23:19:02.544956 8651103744 Options.stats_persist_period_sec: 600 -2023/08/15-23:19:02.544957 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/15-23:19:02.544957 8651103744 Options.max_open_files: -1 -2023/08/15-23:19:02.544958 8651103744 Options.bytes_per_sync: 0 -2023/08/15-23:19:02.544959 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/15-23:19:02.544959 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/15-23:19:02.544960 8651103744 Options.compaction_readahead_size: 0 -2023/08/15-23:19:02.544961 8651103744 Options.max_background_flushes: -1 -2023/08/15-23:19:02.544961 8651103744 Compression algorithms supported: -2023/08/15-23:19:02.544979 8651103744 kZSTD supported: 1 -2023/08/15-23:19:02.544980 8651103744 kZlibCompression supported: 1 -2023/08/15-23:19:02.544981 8651103744 kXpressCompression supported: 0 -2023/08/15-23:19:02.544981 8651103744 kSnappyCompression supported: 1 -2023/08/15-23:19:02.544982 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/15-23:19:02.544983 8651103744 kLZ4HCCompression supported: 1 -2023/08/15-23:19:02.544983 8651103744 kLZ4Compression supported: 1 -2023/08/15-23:19:02.544984 8651103744 kBZip2Compression supported: 1 -2023/08/15-23:19:02.544992 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/15-23:19:02.544993 8651103744 DMutex implementation: pthread_mutex_t -2023/08/15-23:19:02.545156 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000013 -2023/08/15-23:19:02.545260 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/15-23:19:02.545262 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/15-23:19:02.545263 8651103744 Options.merge_operator: None -2023/08/15-23:19:02.545264 8651103744 Options.compaction_filter: None -2023/08/15-23:19:02.545264 8651103744 Options.compaction_filter_factory: None -2023/08/15-23:19:02.545265 8651103744 Options.sst_partitioner_factory: None -2023/08/15-23:19:02.545266 8651103744 Options.memtable_factory: SkipListFactory -2023/08/15-23:19:02.545266 8651103744 Options.table_factory: BlockBasedTable -2023/08/15-23:19:02.545294 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600000b97260) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x600003e940d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/15-23:19:02.545297 8651103744 Options.write_buffer_size: 67108864 -2023/08/15-23:19:02.545298 8651103744 Options.max_write_buffer_number: 2 -2023/08/15-23:19:02.545299 8651103744 Options.compression: Snappy -2023/08/15-23:19:02.545299 8651103744 Options.bottommost_compression: Disabled -2023/08/15-23:19:02.545300 8651103744 Options.prefix_extractor: nullptr -2023/08/15-23:19:02.545301 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/15-23:19:02.545302 8651103744 Options.num_levels: 7 -2023/08/15-23:19:02.545302 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/15-23:19:02.545303 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/15-23:19:02.545304 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/15-23:19:02.545304 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/15-23:19:02.545305 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/15-23:19:02.545306 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/15-23:19:02.545307 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/15-23:19:02.545307 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/15-23:19:02.545308 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/15-23:19:02.545309 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/15-23:19:02.545310 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/15-23:19:02.545310 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/15-23:19:02.545311 8651103744 Options.compression_opts.window_bits: -14 -2023/08/15-23:19:02.545312 8651103744 Options.compression_opts.level: 32767 -2023/08/15-23:19:02.545313 8651103744 Options.compression_opts.strategy: 0 -2023/08/15-23:19:02.545313 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/15-23:19:02.545314 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/15-23:19:02.545315 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/15-23:19:02.545315 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/15-23:19:02.545316 8651103744 Options.compression_opts.enabled: false -2023/08/15-23:19:02.545317 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/15-23:19:02.545318 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/15-23:19:02.545318 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/15-23:19:02.545319 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/15-23:19:02.545320 8651103744 Options.target_file_size_base: 67108864 -2023/08/15-23:19:02.545320 8651103744 Options.target_file_size_multiplier: 1 -2023/08/15-23:19:02.545321 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/15-23:19:02.545322 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/15-23:19:02.545322 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/15-23:19:02.545323 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/15-23:19:02.545324 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/15-23:19:02.545325 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/15-23:19:02.545326 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/15-23:19:02.545326 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/15-23:19:02.545327 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/15-23:19:02.545328 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/15-23:19:02.545329 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/15-23:19:02.545329 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/15-23:19:02.545330 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/15-23:19:02.545331 8651103744 Options.arena_block_size: 1048576 -2023/08/15-23:19:02.545331 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/15-23:19:02.545332 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/15-23:19:02.545333 8651103744 Options.disable_auto_compactions: 0 -2023/08/15-23:19:02.545334 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/15-23:19:02.545334 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/15-23:19:02.545335 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/15-23:19:02.545336 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/15-23:19:02.545336 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/15-23:19:02.545342 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/15-23:19:02.545343 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/15-23:19:02.545345 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/15-23:19:02.545346 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/15-23:19:02.545347 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/15-23:19:02.545348 8651103744 Options.table_properties_collectors: -2023/08/15-23:19:02.545349 8651103744 Options.inplace_update_support: 0 -2023/08/15-23:19:02.545350 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/15-23:19:02.545351 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/15-23:19:02.545351 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/15-23:19:02.545352 8651103744 Options.memtable_huge_page_size: 0 -2023/08/15-23:19:02.545353 8651103744 Options.bloom_locality: 0 -2023/08/15-23:19:02.545354 8651103744 Options.max_successive_merges: 0 -2023/08/15-23:19:02.545354 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/15-23:19:02.545355 8651103744 Options.paranoid_file_checks: 0 -2023/08/15-23:19:02.545359 8651103744 Options.force_consistency_checks: 1 -2023/08/15-23:19:02.545360 8651103744 Options.report_bg_io_stats: 0 -2023/08/15-23:19:02.545360 8651103744 Options.ttl: 2592000 -2023/08/15-23:19:02.545361 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/15-23:19:02.545362 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/15-23:19:02.545362 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/15-23:19:02.545363 8651103744 Options.enable_blob_files: false -2023/08/15-23:19:02.545364 8651103744 Options.min_blob_size: 0 -2023/08/15-23:19:02.545364 8651103744 Options.blob_file_size: 268435456 -2023/08/15-23:19:02.545365 8651103744 Options.blob_compression_type: NoCompression -2023/08/15-23:19:02.545366 8651103744 Options.enable_blob_garbage_collection: false -2023/08/15-23:19:02.545367 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/15-23:19:02.545367 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/15-23:19:02.545368 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/15-23:19:02.545369 8651103744 Options.blob_file_starting_level: 0 -2023/08/15-23:19:02.545370 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/15-23:19:02.545882 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000013 succeeded,manifest_file_number is 13, next_file_number is 15, last_sequence is 0, log_number is 9,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 0 -2023/08/15-23:19:02.545887 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 9 -2023/08/15-23:19:02.545938 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/15-23:19:02.546055 8651103744 EVENT_LOG_v1 {"time_micros": 1692109142546050, "job": 1, "event": "recovery_started", "wal_files": [4, 8, 12]} -2023/08/15-23:19:02.546057 8651103744 [db/db_impl/db_impl_open.cc:1018] Skipping log #4 since it is older than min log to keep #9 -2023/08/15-23:19:02.546058 8651103744 [db/db_impl/db_impl_open.cc:1018] Skipping log #8 since it is older than min log to keep #9 -2023/08/15-23:19:02.546059 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #12 mode 2 -2023/08/15-23:19:02.546589 8651103744 EVENT_LOG_v1 {"time_micros": 1692109142546573, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 16, "file_size": 1067, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 1, "largest_seqno": 1, "table_properties": {"data_size": 67, "index_size": 56, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 47, "raw_average_key_size": 47, "raw_value_size": 4, "raw_average_value_size": 4, "num_data_blocks": 1, "num_entries": 1, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692109142, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "IW86BX2GE3YHQWXXJ3BJ", "orig_file_number": 16, "seqno_to_time_mapping": "N/A"}} -2023/08/15-23:19:02.546660 8651103744 EVENT_LOG_v1 {"time_micros": 1692109142546659, "job": 1, "event": "recovery_finished"} -2023/08/15-23:19:02.546703 8651103744 [db/version_set.cc:5180] Creating manifest 18 -2023/08/15-23:19:02.547923 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000012.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/15-23:19:02.547952 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000008.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/15-23:19:02.547973 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000004.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/15-23:19:02.547994 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x144706110 -2023/08/15-23:19:02.548018 8651103744 DB pointer 0x14500c200 -2023/08/15-23:19:02.548146 6169194496 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/15-23:19:02.548149 6169194496 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 1/0 1.04 KB 0.2 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 1.9 0.00 0.00 1 0.001 0 0 0.0 0.0 - Sum 1/0 1.04 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 1.9 0.00 0.00 1 0.001 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 1.9 0.00 0.00 1 0.001 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.9 0.00 0.00 1 0.001 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 0.35 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 0.35 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x600003e940d8#74368 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 8e-06 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** -2023/08/15-23:19:06.429507 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work -2023/08/15-23:19:06.430657 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692110322000479 b/rust/hyperlane_db/LOG.old.1692110322000479 deleted file mode 100644 index 015602e4e3..0000000000 --- a/rust/hyperlane_db/LOG.old.1692110322000479 +++ /dev/null @@ -1,287 +0,0 @@ -2023/08/15-23:26:35.356979 8651103744 RocksDB version: 8.1.1 -2023/08/15-23:26:35.357507 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/15-23:26:35.357508 8651103744 DB SUMMARY -2023/08/15-23:26:35.357509 8651103744 DB Session ID: BAHCL5GHS228YFHWI1MQ -2023/08/15-23:26:35.357567 8651103744 CURRENT file: CURRENT -2023/08/15-23:26:35.357568 8651103744 IDENTITY file: IDENTITY -2023/08/15-23:26:35.357577 8651103744 MANIFEST file: MANIFEST-000018 size: 242 Bytes -2023/08/15-23:26:35.357578 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 1, files: 000016.sst -2023/08/15-23:26:35.357579 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000017.log size: 10883 ; -2023/08/15-23:26:35.357581 8651103744 Options.error_if_exists: 0 -2023/08/15-23:26:35.357581 8651103744 Options.create_if_missing: 1 -2023/08/15-23:26:35.357582 8651103744 Options.paranoid_checks: 1 -2023/08/15-23:26:35.357583 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/15-23:26:35.357583 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/15-23:26:35.357584 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/15-23:26:35.357584 8651103744 Options.env: 0x102a23828 -2023/08/15-23:26:35.357585 8651103744 Options.fs: PosixFileSystem -2023/08/15-23:26:35.357586 8651103744 Options.info_log: 0x136605fb8 -2023/08/15-23:26:35.357587 8651103744 Options.max_file_opening_threads: 16 -2023/08/15-23:26:35.357587 8651103744 Options.statistics: 0x0 -2023/08/15-23:26:35.357588 8651103744 Options.use_fsync: 0 -2023/08/15-23:26:35.357589 8651103744 Options.max_log_file_size: 0 -2023/08/15-23:26:35.357589 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/15-23:26:35.357590 8651103744 Options.log_file_time_to_roll: 0 -2023/08/15-23:26:35.357590 8651103744 Options.keep_log_file_num: 1000 -2023/08/15-23:26:35.357591 8651103744 Options.recycle_log_file_num: 0 -2023/08/15-23:26:35.357591 8651103744 Options.allow_fallocate: 1 -2023/08/15-23:26:35.357592 8651103744 Options.allow_mmap_reads: 0 -2023/08/15-23:26:35.357592 8651103744 Options.allow_mmap_writes: 0 -2023/08/15-23:26:35.357593 8651103744 Options.use_direct_reads: 0 -2023/08/15-23:26:35.357594 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/15-23:26:35.357594 8651103744 Options.create_missing_column_families: 0 -2023/08/15-23:26:35.357595 8651103744 Options.db_log_dir: -2023/08/15-23:26:35.357595 8651103744 Options.wal_dir: -2023/08/15-23:26:35.357596 8651103744 Options.table_cache_numshardbits: 6 -2023/08/15-23:26:35.357596 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/15-23:26:35.357597 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/15-23:26:35.357597 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/15-23:26:35.357598 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/15-23:26:35.357599 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/15-23:26:35.357599 8651103744 Options.advise_random_on_open: 1 -2023/08/15-23:26:35.357600 8651103744 Options.db_write_buffer_size: 0 -2023/08/15-23:26:35.357600 8651103744 Options.write_buffer_manager: 0x600002f04820 -2023/08/15-23:26:35.357601 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/15-23:26:35.357601 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/15-23:26:35.357602 8651103744 Options.use_adaptive_mutex: 0 -2023/08/15-23:26:35.357603 8651103744 Options.rate_limiter: 0x0 -2023/08/15-23:26:35.357603 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/15-23:26:35.357604 8651103744 Options.wal_recovery_mode: 2 -2023/08/15-23:26:35.357605 8651103744 Options.enable_thread_tracking: 0 -2023/08/15-23:26:35.357605 8651103744 Options.enable_pipelined_write: 0 -2023/08/15-23:26:35.357606 8651103744 Options.unordered_write: 0 -2023/08/15-23:26:35.357606 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/15-23:26:35.357607 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/15-23:26:35.357607 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/15-23:26:35.357608 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/15-23:26:35.357608 8651103744 Options.row_cache: None -2023/08/15-23:26:35.357609 8651103744 Options.wal_filter: None -2023/08/15-23:26:35.357622 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/15-23:26:35.357623 8651103744 Options.allow_ingest_behind: 0 -2023/08/15-23:26:35.357640 8651103744 Options.two_write_queues: 0 -2023/08/15-23:26:35.357645 8651103744 Options.manual_wal_flush: 0 -2023/08/15-23:26:35.357645 8651103744 Options.wal_compression: 0 -2023/08/15-23:26:35.357646 8651103744 Options.atomic_flush: 0 -2023/08/15-23:26:35.357647 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/15-23:26:35.357647 8651103744 Options.persist_stats_to_disk: 0 -2023/08/15-23:26:35.357648 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/15-23:26:35.357648 8651103744 Options.log_readahead_size: 0 -2023/08/15-23:26:35.357649 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/15-23:26:35.357650 8651103744 Options.best_efforts_recovery: 0 -2023/08/15-23:26:35.357650 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/15-23:26:35.357651 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/15-23:26:35.357652 8651103744 Options.allow_data_in_errors: 0 -2023/08/15-23:26:35.357652 8651103744 Options.db_host_id: __hostname__ -2023/08/15-23:26:35.357653 8651103744 Options.enforce_single_del_contracts: true -2023/08/15-23:26:35.357654 8651103744 Options.max_background_jobs: 2 -2023/08/15-23:26:35.357654 8651103744 Options.max_background_compactions: -1 -2023/08/15-23:26:35.357655 8651103744 Options.max_subcompactions: 1 -2023/08/15-23:26:35.357655 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/15-23:26:35.357656 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/15-23:26:35.357656 8651103744 Options.delayed_write_rate : 16777216 -2023/08/15-23:26:35.357657 8651103744 Options.max_total_wal_size: 0 -2023/08/15-23:26:35.357658 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/15-23:26:35.357658 8651103744 Options.stats_dump_period_sec: 600 -2023/08/15-23:26:35.357659 8651103744 Options.stats_persist_period_sec: 600 -2023/08/15-23:26:35.357659 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/15-23:26:35.357660 8651103744 Options.max_open_files: -1 -2023/08/15-23:26:35.357660 8651103744 Options.bytes_per_sync: 0 -2023/08/15-23:26:35.357661 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/15-23:26:35.357661 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/15-23:26:35.357662 8651103744 Options.compaction_readahead_size: 0 -2023/08/15-23:26:35.357663 8651103744 Options.max_background_flushes: -1 -2023/08/15-23:26:35.357663 8651103744 Compression algorithms supported: -2023/08/15-23:26:35.357680 8651103744 kZSTD supported: 1 -2023/08/15-23:26:35.357681 8651103744 kZlibCompression supported: 1 -2023/08/15-23:26:35.357682 8651103744 kXpressCompression supported: 0 -2023/08/15-23:26:35.357682 8651103744 kSnappyCompression supported: 1 -2023/08/15-23:26:35.357683 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/15-23:26:35.357683 8651103744 kLZ4HCCompression supported: 1 -2023/08/15-23:26:35.357684 8651103744 kLZ4Compression supported: 1 -2023/08/15-23:26:35.357684 8651103744 kBZip2Compression supported: 1 -2023/08/15-23:26:35.357694 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/15-23:26:35.357694 8651103744 DMutex implementation: pthread_mutex_t -2023/08/15-23:26:35.358060 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000018 -2023/08/15-23:26:35.358154 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/15-23:26:35.358155 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/15-23:26:35.358156 8651103744 Options.merge_operator: None -2023/08/15-23:26:35.358156 8651103744 Options.compaction_filter: None -2023/08/15-23:26:35.358157 8651103744 Options.compaction_filter_factory: None -2023/08/15-23:26:35.358158 8651103744 Options.sst_partitioner_factory: None -2023/08/15-23:26:35.358158 8651103744 Options.memtable_factory: SkipListFactory -2023/08/15-23:26:35.358161 8651103744 Options.table_factory: BlockBasedTable -2023/08/15-23:26:35.358172 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x60000141fd20) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000021000d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/15-23:26:35.358180 8651103744 Options.write_buffer_size: 67108864 -2023/08/15-23:26:35.358180 8651103744 Options.max_write_buffer_number: 2 -2023/08/15-23:26:35.358181 8651103744 Options.compression: Snappy -2023/08/15-23:26:35.358182 8651103744 Options.bottommost_compression: Disabled -2023/08/15-23:26:35.358182 8651103744 Options.prefix_extractor: nullptr -2023/08/15-23:26:35.358183 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/15-23:26:35.358183 8651103744 Options.num_levels: 7 -2023/08/15-23:26:35.358184 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/15-23:26:35.358185 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/15-23:26:35.358185 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/15-23:26:35.358186 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/15-23:26:35.358186 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/15-23:26:35.358187 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/15-23:26:35.358187 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/15-23:26:35.358188 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/15-23:26:35.358189 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/15-23:26:35.358189 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/15-23:26:35.358190 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/15-23:26:35.358190 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/15-23:26:35.358191 8651103744 Options.compression_opts.window_bits: -14 -2023/08/15-23:26:35.358191 8651103744 Options.compression_opts.level: 32767 -2023/08/15-23:26:35.358192 8651103744 Options.compression_opts.strategy: 0 -2023/08/15-23:26:35.358192 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/15-23:26:35.358193 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/15-23:26:35.358194 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/15-23:26:35.358194 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/15-23:26:35.358195 8651103744 Options.compression_opts.enabled: false -2023/08/15-23:26:35.358195 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/15-23:26:35.358196 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/15-23:26:35.358196 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/15-23:26:35.358197 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/15-23:26:35.358197 8651103744 Options.target_file_size_base: 67108864 -2023/08/15-23:26:35.358198 8651103744 Options.target_file_size_multiplier: 1 -2023/08/15-23:26:35.358199 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/15-23:26:35.358199 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/15-23:26:35.358200 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/15-23:26:35.358200 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/15-23:26:35.358201 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/15-23:26:35.358202 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/15-23:26:35.358202 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/15-23:26:35.358203 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/15-23:26:35.358203 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/15-23:26:35.358204 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/15-23:26:35.358204 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/15-23:26:35.358205 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/15-23:26:35.358206 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/15-23:26:35.358206 8651103744 Options.arena_block_size: 1048576 -2023/08/15-23:26:35.358207 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/15-23:26:35.358207 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/15-23:26:35.358208 8651103744 Options.disable_auto_compactions: 0 -2023/08/15-23:26:35.358209 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/15-23:26:35.358209 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/15-23:26:35.358210 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/15-23:26:35.358210 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/15-23:26:35.358211 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/15-23:26:35.358212 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/15-23:26:35.358212 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/15-23:26:35.358214 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/15-23:26:35.358215 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/15-23:26:35.358215 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/15-23:26:35.358216 8651103744 Options.table_properties_collectors: -2023/08/15-23:26:35.358217 8651103744 Options.inplace_update_support: 0 -2023/08/15-23:26:35.358217 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/15-23:26:35.358218 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/15-23:26:35.358219 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/15-23:26:35.358219 8651103744 Options.memtable_huge_page_size: 0 -2023/08/15-23:26:35.358220 8651103744 Options.bloom_locality: 0 -2023/08/15-23:26:35.358220 8651103744 Options.max_successive_merges: 0 -2023/08/15-23:26:35.358221 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/15-23:26:35.358221 8651103744 Options.paranoid_file_checks: 0 -2023/08/15-23:26:35.358222 8651103744 Options.force_consistency_checks: 1 -2023/08/15-23:26:35.358222 8651103744 Options.report_bg_io_stats: 0 -2023/08/15-23:26:35.358223 8651103744 Options.ttl: 2592000 -2023/08/15-23:26:35.358223 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/15-23:26:35.358224 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/15-23:26:35.358225 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/15-23:26:35.358225 8651103744 Options.enable_blob_files: false -2023/08/15-23:26:35.358226 8651103744 Options.min_blob_size: 0 -2023/08/15-23:26:35.358226 8651103744 Options.blob_file_size: 268435456 -2023/08/15-23:26:35.358227 8651103744 Options.blob_compression_type: NoCompression -2023/08/15-23:26:35.358227 8651103744 Options.enable_blob_garbage_collection: false -2023/08/15-23:26:35.358228 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/15-23:26:35.358229 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/15-23:26:35.358229 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/15-23:26:35.358230 8651103744 Options.blob_file_starting_level: 0 -2023/08/15-23:26:35.358230 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/15-23:26:35.358976 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000018 succeeded,manifest_file_number is 18, next_file_number is 20, last_sequence is 1, log_number is 13,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 13 -2023/08/15-23:26:35.358979 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 13 -2023/08/15-23:26:35.359178 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/15-23:26:35.359250 8651103744 EVENT_LOG_v1 {"time_micros": 1692109595359246, "job": 1, "event": "recovery_started", "wal_files": [17]} -2023/08/15-23:26:35.359252 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #17 mode 2 -2023/08/15-23:26:35.359728 8651103744 EVENT_LOG_v1 {"time_micros": 1692109595359715, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 21, "file_size": 3901, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 4, "largest_seqno": 59, "table_properties": {"data_size": 2850, "index_size": 123, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 2495, "raw_average_key_size": 45, "raw_value_size": 7408, "raw_average_value_size": 134, "num_data_blocks": 3, "num_entries": 55, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692109595, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "BAHCL5GHS228YFHWI1MQ", "orig_file_number": 21, "seqno_to_time_mapping": "N/A"}} -2023/08/15-23:26:35.359785 8651103744 EVENT_LOG_v1 {"time_micros": 1692109595359784, "job": 1, "event": "recovery_finished"} -2023/08/15-23:26:35.359823 8651103744 [db/version_set.cc:5180] Creating manifest 23 -2023/08/15-23:26:35.360828 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000017.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/15-23:26:35.360848 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x136606110 -2023/08/15-23:26:35.360871 8651103744 DB pointer 0x13680c200 -2023/08/15-23:26:35.360984 6165753856 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/15-23:26:35.360986 6165753856 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 2/0 4.85 KB 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 11.9 0.00 0.00 1 0.000 0 0 0.0 0.0 - Sum 2/0 4.85 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 11.9 0.00 0.00 1 0.000 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 11.9 0.00 0.00 1 0.000 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.9 0.00 0.00 1 0.000 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 1.32 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 1.32 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000021000d8#74486 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 7e-06 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** -2023/08/15-23:26:47.356358 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work -2023/08/15-23:26:47.356886 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692110678116635 b/rust/hyperlane_db/LOG.old.1692110678116635 deleted file mode 100644 index f9c9b81a71..0000000000 --- a/rust/hyperlane_db/LOG.old.1692110678116635 +++ /dev/null @@ -1,284 +0,0 @@ -2023/08/15-23:38:42.001287 8651103744 RocksDB version: 8.1.1 -2023/08/15-23:38:42.001872 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/15-23:38:42.001874 8651103744 DB SUMMARY -2023/08/15-23:38:42.001875 8651103744 DB Session ID: 3QO0U9RL58C1F7TEMW2X -2023/08/15-23:38:42.001970 8651103744 CURRENT file: CURRENT -2023/08/15-23:38:42.001971 8651103744 IDENTITY file: IDENTITY -2023/08/15-23:38:42.001982 8651103744 MANIFEST file: MANIFEST-000023 size: 412 Bytes -2023/08/15-23:38:42.001984 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 2, files: 000016.sst 000021.sst -2023/08/15-23:38:42.001985 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000022.log size: 0 ; -2023/08/15-23:38:42.001986 8651103744 Options.error_if_exists: 0 -2023/08/15-23:38:42.001987 8651103744 Options.create_if_missing: 1 -2023/08/15-23:38:42.001988 8651103744 Options.paranoid_checks: 1 -2023/08/15-23:38:42.001989 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/15-23:38:42.001989 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/15-23:38:42.001990 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/15-23:38:42.001991 8651103744 Options.env: 0x103233828 -2023/08/15-23:38:42.001992 8651103744 Options.fs: PosixFileSystem -2023/08/15-23:38:42.001992 8651103744 Options.info_log: 0x13a705fb8 -2023/08/15-23:38:42.001993 8651103744 Options.max_file_opening_threads: 16 -2023/08/15-23:38:42.001994 8651103744 Options.statistics: 0x0 -2023/08/15-23:38:42.001994 8651103744 Options.use_fsync: 0 -2023/08/15-23:38:42.001995 8651103744 Options.max_log_file_size: 0 -2023/08/15-23:38:42.001996 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/15-23:38:42.001996 8651103744 Options.log_file_time_to_roll: 0 -2023/08/15-23:38:42.001997 8651103744 Options.keep_log_file_num: 1000 -2023/08/15-23:38:42.001998 8651103744 Options.recycle_log_file_num: 0 -2023/08/15-23:38:42.001998 8651103744 Options.allow_fallocate: 1 -2023/08/15-23:38:42.001999 8651103744 Options.allow_mmap_reads: 0 -2023/08/15-23:38:42.002000 8651103744 Options.allow_mmap_writes: 0 -2023/08/15-23:38:42.002000 8651103744 Options.use_direct_reads: 0 -2023/08/15-23:38:42.002001 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/15-23:38:42.002001 8651103744 Options.create_missing_column_families: 0 -2023/08/15-23:38:42.002002 8651103744 Options.db_log_dir: -2023/08/15-23:38:42.002003 8651103744 Options.wal_dir: -2023/08/15-23:38:42.002003 8651103744 Options.table_cache_numshardbits: 6 -2023/08/15-23:38:42.002004 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/15-23:38:42.002005 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/15-23:38:42.002005 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/15-23:38:42.002006 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/15-23:38:42.002007 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/15-23:38:42.002007 8651103744 Options.advise_random_on_open: 1 -2023/08/15-23:38:42.002008 8651103744 Options.db_write_buffer_size: 0 -2023/08/15-23:38:42.002008 8651103744 Options.write_buffer_manager: 0x600000910820 -2023/08/15-23:38:42.002009 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/15-23:38:42.002010 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/15-23:38:42.002010 8651103744 Options.use_adaptive_mutex: 0 -2023/08/15-23:38:42.002011 8651103744 Options.rate_limiter: 0x0 -2023/08/15-23:38:42.002012 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/15-23:38:42.002013 8651103744 Options.wal_recovery_mode: 2 -2023/08/15-23:38:42.002013 8651103744 Options.enable_thread_tracking: 0 -2023/08/15-23:38:42.002014 8651103744 Options.enable_pipelined_write: 0 -2023/08/15-23:38:42.002014 8651103744 Options.unordered_write: 0 -2023/08/15-23:38:42.002015 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/15-23:38:42.002016 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/15-23:38:42.002016 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/15-23:38:42.002017 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/15-23:38:42.002018 8651103744 Options.row_cache: None -2023/08/15-23:38:42.002018 8651103744 Options.wal_filter: None -2023/08/15-23:38:42.002019 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/15-23:38:42.002020 8651103744 Options.allow_ingest_behind: 0 -2023/08/15-23:38:42.002020 8651103744 Options.two_write_queues: 0 -2023/08/15-23:38:42.002021 8651103744 Options.manual_wal_flush: 0 -2023/08/15-23:38:42.002021 8651103744 Options.wal_compression: 0 -2023/08/15-23:38:42.002022 8651103744 Options.atomic_flush: 0 -2023/08/15-23:38:42.002023 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/15-23:38:42.002023 8651103744 Options.persist_stats_to_disk: 0 -2023/08/15-23:38:42.002024 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/15-23:38:42.002025 8651103744 Options.log_readahead_size: 0 -2023/08/15-23:38:42.002025 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/15-23:38:42.002026 8651103744 Options.best_efforts_recovery: 0 -2023/08/15-23:38:42.002027 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/15-23:38:42.002028 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/15-23:38:42.002028 8651103744 Options.allow_data_in_errors: 0 -2023/08/15-23:38:42.002029 8651103744 Options.db_host_id: __hostname__ -2023/08/15-23:38:42.002030 8651103744 Options.enforce_single_del_contracts: true -2023/08/15-23:38:42.002030 8651103744 Options.max_background_jobs: 2 -2023/08/15-23:38:42.002031 8651103744 Options.max_background_compactions: -1 -2023/08/15-23:38:42.002032 8651103744 Options.max_subcompactions: 1 -2023/08/15-23:38:42.002032 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/15-23:38:42.002033 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/15-23:38:42.002034 8651103744 Options.delayed_write_rate : 16777216 -2023/08/15-23:38:42.002034 8651103744 Options.max_total_wal_size: 0 -2023/08/15-23:38:42.002035 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/15-23:38:42.002036 8651103744 Options.stats_dump_period_sec: 600 -2023/08/15-23:38:42.002036 8651103744 Options.stats_persist_period_sec: 600 -2023/08/15-23:38:42.002037 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/15-23:38:42.002038 8651103744 Options.max_open_files: -1 -2023/08/15-23:38:42.002038 8651103744 Options.bytes_per_sync: 0 -2023/08/15-23:38:42.002039 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/15-23:38:42.002039 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/15-23:38:42.002040 8651103744 Options.compaction_readahead_size: 0 -2023/08/15-23:38:42.002041 8651103744 Options.max_background_flushes: -1 -2023/08/15-23:38:42.002041 8651103744 Compression algorithms supported: -2023/08/15-23:38:42.002056 8651103744 kZSTD supported: 1 -2023/08/15-23:38:42.002057 8651103744 kZlibCompression supported: 1 -2023/08/15-23:38:42.002058 8651103744 kXpressCompression supported: 0 -2023/08/15-23:38:42.002058 8651103744 kSnappyCompression supported: 1 -2023/08/15-23:38:42.002059 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/15-23:38:42.002060 8651103744 kLZ4HCCompression supported: 1 -2023/08/15-23:38:42.002060 8651103744 kLZ4Compression supported: 1 -2023/08/15-23:38:42.002061 8651103744 kBZip2Compression supported: 1 -2023/08/15-23:38:42.002068 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/15-23:38:42.002069 8651103744 DMutex implementation: pthread_mutex_t -2023/08/15-23:38:42.002364 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000023 -2023/08/15-23:38:42.002450 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/15-23:38:42.002452 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/15-23:38:42.002453 8651103744 Options.merge_operator: None -2023/08/15-23:38:42.002454 8651103744 Options.compaction_filter: None -2023/08/15-23:38:42.002454 8651103744 Options.compaction_filter_factory: None -2023/08/15-23:38:42.002455 8651103744 Options.sst_partitioner_factory: None -2023/08/15-23:38:42.002456 8651103744 Options.memtable_factory: SkipListFactory -2023/08/15-23:38:42.002456 8651103744 Options.table_factory: BlockBasedTable -2023/08/15-23:38:42.002483 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x60000321c640) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000007100d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/15-23:38:42.002486 8651103744 Options.write_buffer_size: 67108864 -2023/08/15-23:38:42.002486 8651103744 Options.max_write_buffer_number: 2 -2023/08/15-23:38:42.002487 8651103744 Options.compression: Snappy -2023/08/15-23:38:42.002488 8651103744 Options.bottommost_compression: Disabled -2023/08/15-23:38:42.002488 8651103744 Options.prefix_extractor: nullptr -2023/08/15-23:38:42.002489 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/15-23:38:42.002490 8651103744 Options.num_levels: 7 -2023/08/15-23:38:42.002490 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/15-23:38:42.002491 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/15-23:38:42.002492 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/15-23:38:42.002492 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/15-23:38:42.002493 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/15-23:38:42.002494 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/15-23:38:42.002494 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/15-23:38:42.002495 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/15-23:38:42.002496 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/15-23:38:42.002496 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/15-23:38:42.002497 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/15-23:38:42.002497 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/15-23:38:42.002498 8651103744 Options.compression_opts.window_bits: -14 -2023/08/15-23:38:42.002499 8651103744 Options.compression_opts.level: 32767 -2023/08/15-23:38:42.002499 8651103744 Options.compression_opts.strategy: 0 -2023/08/15-23:38:42.002500 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/15-23:38:42.002500 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/15-23:38:42.002501 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/15-23:38:42.002502 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/15-23:38:42.002502 8651103744 Options.compression_opts.enabled: false -2023/08/15-23:38:42.002503 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/15-23:38:42.002504 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/15-23:38:42.002504 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/15-23:38:42.002505 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/15-23:38:42.002505 8651103744 Options.target_file_size_base: 67108864 -2023/08/15-23:38:42.002506 8651103744 Options.target_file_size_multiplier: 1 -2023/08/15-23:38:42.002507 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/15-23:38:42.002507 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/15-23:38:42.002508 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/15-23:38:42.002509 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/15-23:38:42.002509 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/15-23:38:42.002510 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/15-23:38:42.002510 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/15-23:38:42.002511 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/15-23:38:42.002512 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/15-23:38:42.002512 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/15-23:38:42.002513 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/15-23:38:42.002513 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/15-23:38:42.002514 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/15-23:38:42.002515 8651103744 Options.arena_block_size: 1048576 -2023/08/15-23:38:42.002515 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/15-23:38:42.002516 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/15-23:38:42.002517 8651103744 Options.disable_auto_compactions: 0 -2023/08/15-23:38:42.002517 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/15-23:38:42.002518 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/15-23:38:42.002519 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/15-23:38:42.002520 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/15-23:38:42.002520 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/15-23:38:42.002521 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/15-23:38:42.002522 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/15-23:38:42.002524 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/15-23:38:42.002525 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/15-23:38:42.002525 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/15-23:38:42.002527 8651103744 Options.table_properties_collectors: -2023/08/15-23:38:42.002527 8651103744 Options.inplace_update_support: 0 -2023/08/15-23:38:42.002528 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/15-23:38:42.002528 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/15-23:38:42.002529 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/15-23:38:42.002530 8651103744 Options.memtable_huge_page_size: 0 -2023/08/15-23:38:42.002530 8651103744 Options.bloom_locality: 0 -2023/08/15-23:38:42.002531 8651103744 Options.max_successive_merges: 0 -2023/08/15-23:38:42.002531 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/15-23:38:42.002532 8651103744 Options.paranoid_file_checks: 0 -2023/08/15-23:38:42.002533 8651103744 Options.force_consistency_checks: 1 -2023/08/15-23:38:42.002533 8651103744 Options.report_bg_io_stats: 0 -2023/08/15-23:38:42.002534 8651103744 Options.ttl: 2592000 -2023/08/15-23:38:42.002534 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/15-23:38:42.002535 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/15-23:38:42.002536 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/15-23:38:42.002536 8651103744 Options.enable_blob_files: false -2023/08/15-23:38:42.002537 8651103744 Options.min_blob_size: 0 -2023/08/15-23:38:42.002537 8651103744 Options.blob_file_size: 268435456 -2023/08/15-23:38:42.002538 8651103744 Options.blob_compression_type: NoCompression -2023/08/15-23:38:42.002539 8651103744 Options.enable_blob_garbage_collection: false -2023/08/15-23:38:42.002539 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/15-23:38:42.002540 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/15-23:38:42.002540 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/15-23:38:42.002541 8651103744 Options.blob_file_starting_level: 0 -2023/08/15-23:38:42.002542 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/15-23:38:42.003238 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000023 succeeded,manifest_file_number is 23, next_file_number is 25, last_sequence is 59, log_number is 18,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 18 -2023/08/15-23:38:42.003241 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 18 -2023/08/15-23:38:42.003414 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/15-23:38:42.003498 8651103744 EVENT_LOG_v1 {"time_micros": 1692110322003495, "job": 1, "event": "recovery_started", "wal_files": [22]} -2023/08/15-23:38:42.003500 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #22 mode 2 -2023/08/15-23:38:42.003545 8651103744 EVENT_LOG_v1 {"time_micros": 1692110322003544, "job": 1, "event": "recovery_finished"} -2023/08/15-23:38:42.003598 8651103744 [db/version_set.cc:5180] Creating manifest 27 -2023/08/15-23:38:42.004958 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x13b904200 -2023/08/15-23:38:42.004985 8651103744 DB pointer 0x13b013600 -2023/08/15-23:38:42.005098 6157299712 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/15-23:38:42.005101 6157299712 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 2/0 4.85 KB 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 2/0 4.85 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000007100d8#74604 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 8e-06 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** -2023/08/15-23:38:46.760256 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work -2023/08/15-23:38:46.761272 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692159212672457 b/rust/hyperlane_db/LOG.old.1692159212672457 deleted file mode 100644 index d1aaf359b3..0000000000 --- a/rust/hyperlane_db/LOG.old.1692159212672457 +++ /dev/null @@ -1,287 +0,0 @@ -2023/08/15-23:44:38.117099 8651103744 RocksDB version: 8.1.1 -2023/08/15-23:44:38.117711 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/15-23:44:38.117713 8651103744 DB SUMMARY -2023/08/15-23:44:38.117715 8651103744 DB Session ID: GNTJRFOH8YXJUE7WIIPJ -2023/08/15-23:44:38.117789 8651103744 CURRENT file: CURRENT -2023/08/15-23:44:38.117791 8651103744 IDENTITY file: IDENTITY -2023/08/15-23:44:38.117804 8651103744 MANIFEST file: MANIFEST-000027 size: 397 Bytes -2023/08/15-23:44:38.117807 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 2, files: 000016.sst 000021.sst -2023/08/15-23:44:38.117808 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000022.log size: 0 ; 000026.log size: 5148 ; -2023/08/15-23:44:38.117810 8651103744 Options.error_if_exists: 0 -2023/08/15-23:44:38.117811 8651103744 Options.create_if_missing: 1 -2023/08/15-23:44:38.117812 8651103744 Options.paranoid_checks: 1 -2023/08/15-23:44:38.117813 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/15-23:44:38.117814 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/15-23:44:38.117815 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/15-23:44:38.117816 8651103744 Options.env: 0x106fff828 -2023/08/15-23:44:38.117817 8651103744 Options.fs: PosixFileSystem -2023/08/15-23:44:38.117819 8651103744 Options.info_log: 0x14360aa28 -2023/08/15-23:44:38.117820 8651103744 Options.max_file_opening_threads: 16 -2023/08/15-23:44:38.117821 8651103744 Options.statistics: 0x0 -2023/08/15-23:44:38.117822 8651103744 Options.use_fsync: 0 -2023/08/15-23:44:38.117823 8651103744 Options.max_log_file_size: 0 -2023/08/15-23:44:38.117824 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/15-23:44:38.117825 8651103744 Options.log_file_time_to_roll: 0 -2023/08/15-23:44:38.117826 8651103744 Options.keep_log_file_num: 1000 -2023/08/15-23:44:38.117827 8651103744 Options.recycle_log_file_num: 0 -2023/08/15-23:44:38.117828 8651103744 Options.allow_fallocate: 1 -2023/08/15-23:44:38.117829 8651103744 Options.allow_mmap_reads: 0 -2023/08/15-23:44:38.117829 8651103744 Options.allow_mmap_writes: 0 -2023/08/15-23:44:38.117830 8651103744 Options.use_direct_reads: 0 -2023/08/15-23:44:38.117831 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/15-23:44:38.117832 8651103744 Options.create_missing_column_families: 0 -2023/08/15-23:44:38.117833 8651103744 Options.db_log_dir: -2023/08/15-23:44:38.117834 8651103744 Options.wal_dir: -2023/08/15-23:44:38.117835 8651103744 Options.table_cache_numshardbits: 6 -2023/08/15-23:44:38.117836 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/15-23:44:38.117837 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/15-23:44:38.117838 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/15-23:44:38.117839 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/15-23:44:38.117840 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/15-23:44:38.117841 8651103744 Options.advise_random_on_open: 1 -2023/08/15-23:44:38.117842 8651103744 Options.db_write_buffer_size: 0 -2023/08/15-23:44:38.117843 8651103744 Options.write_buffer_manager: 0x6000035f9380 -2023/08/15-23:44:38.117844 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/15-23:44:38.117845 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/15-23:44:38.117846 8651103744 Options.use_adaptive_mutex: 0 -2023/08/15-23:44:38.117847 8651103744 Options.rate_limiter: 0x0 -2023/08/15-23:44:38.117848 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/15-23:44:38.117849 8651103744 Options.wal_recovery_mode: 2 -2023/08/15-23:44:38.117850 8651103744 Options.enable_thread_tracking: 0 -2023/08/15-23:44:38.117851 8651103744 Options.enable_pipelined_write: 0 -2023/08/15-23:44:38.117852 8651103744 Options.unordered_write: 0 -2023/08/15-23:44:38.117852 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/15-23:44:38.117853 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/15-23:44:38.117854 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/15-23:44:38.117855 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/15-23:44:38.117856 8651103744 Options.row_cache: None -2023/08/15-23:44:38.117857 8651103744 Options.wal_filter: None -2023/08/15-23:44:38.117858 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/15-23:44:38.117859 8651103744 Options.allow_ingest_behind: 0 -2023/08/15-23:44:38.117860 8651103744 Options.two_write_queues: 0 -2023/08/15-23:44:38.117861 8651103744 Options.manual_wal_flush: 0 -2023/08/15-23:44:38.117862 8651103744 Options.wal_compression: 0 -2023/08/15-23:44:38.117863 8651103744 Options.atomic_flush: 0 -2023/08/15-23:44:38.117864 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/15-23:44:38.117865 8651103744 Options.persist_stats_to_disk: 0 -2023/08/15-23:44:38.117866 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/15-23:44:38.117867 8651103744 Options.log_readahead_size: 0 -2023/08/15-23:44:38.117868 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/15-23:44:38.117869 8651103744 Options.best_efforts_recovery: 0 -2023/08/15-23:44:38.117870 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/15-23:44:38.117871 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/15-23:44:38.117872 8651103744 Options.allow_data_in_errors: 0 -2023/08/15-23:44:38.117873 8651103744 Options.db_host_id: __hostname__ -2023/08/15-23:44:38.117874 8651103744 Options.enforce_single_del_contracts: true -2023/08/15-23:44:38.117875 8651103744 Options.max_background_jobs: 2 -2023/08/15-23:44:38.117876 8651103744 Options.max_background_compactions: -1 -2023/08/15-23:44:38.117877 8651103744 Options.max_subcompactions: 1 -2023/08/15-23:44:38.117878 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/15-23:44:38.117879 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/15-23:44:38.117880 8651103744 Options.delayed_write_rate : 16777216 -2023/08/15-23:44:38.117881 8651103744 Options.max_total_wal_size: 0 -2023/08/15-23:44:38.117882 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/15-23:44:38.117883 8651103744 Options.stats_dump_period_sec: 600 -2023/08/15-23:44:38.117884 8651103744 Options.stats_persist_period_sec: 600 -2023/08/15-23:44:38.117886 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/15-23:44:38.117887 8651103744 Options.max_open_files: -1 -2023/08/15-23:44:38.117888 8651103744 Options.bytes_per_sync: 0 -2023/08/15-23:44:38.117888 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/15-23:44:38.117889 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/15-23:44:38.117890 8651103744 Options.compaction_readahead_size: 0 -2023/08/15-23:44:38.117891 8651103744 Options.max_background_flushes: -1 -2023/08/15-23:44:38.117892 8651103744 Compression algorithms supported: -2023/08/15-23:44:38.117912 8651103744 kZSTD supported: 1 -2023/08/15-23:44:38.117913 8651103744 kZlibCompression supported: 1 -2023/08/15-23:44:38.117914 8651103744 kXpressCompression supported: 0 -2023/08/15-23:44:38.117915 8651103744 kSnappyCompression supported: 1 -2023/08/15-23:44:38.117916 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/15-23:44:38.117917 8651103744 kLZ4HCCompression supported: 1 -2023/08/15-23:44:38.117918 8651103744 kLZ4Compression supported: 1 -2023/08/15-23:44:38.117919 8651103744 kBZip2Compression supported: 1 -2023/08/15-23:44:38.117926 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/15-23:44:38.117927 8651103744 DMutex implementation: pthread_mutex_t -2023/08/15-23:44:38.118085 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000027 -2023/08/15-23:44:38.118188 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/15-23:44:38.118189 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/15-23:44:38.118191 8651103744 Options.merge_operator: None -2023/08/15-23:44:38.118192 8651103744 Options.compaction_filter: None -2023/08/15-23:44:38.118193 8651103744 Options.compaction_filter_factory: None -2023/08/15-23:44:38.118194 8651103744 Options.sst_partitioner_factory: None -2023/08/15-23:44:38.118195 8651103744 Options.memtable_factory: SkipListFactory -2023/08/15-23:44:38.118196 8651103744 Options.table_factory: BlockBasedTable -2023/08/15-23:44:38.118212 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600000ef4640) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x600003bf86d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/15-23:44:38.118214 8651103744 Options.write_buffer_size: 67108864 -2023/08/15-23:44:38.118215 8651103744 Options.max_write_buffer_number: 2 -2023/08/15-23:44:38.118216 8651103744 Options.compression: Snappy -2023/08/15-23:44:38.118217 8651103744 Options.bottommost_compression: Disabled -2023/08/15-23:44:38.118218 8651103744 Options.prefix_extractor: nullptr -2023/08/15-23:44:38.118219 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/15-23:44:38.118220 8651103744 Options.num_levels: 7 -2023/08/15-23:44:38.118221 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/15-23:44:38.118222 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/15-23:44:38.118223 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/15-23:44:38.118224 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/15-23:44:38.118225 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/15-23:44:38.118226 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/15-23:44:38.118227 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/15-23:44:38.118228 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/15-23:44:38.118229 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/15-23:44:38.118230 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/15-23:44:38.118231 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/15-23:44:38.118232 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/15-23:44:38.118233 8651103744 Options.compression_opts.window_bits: -14 -2023/08/15-23:44:38.118234 8651103744 Options.compression_opts.level: 32767 -2023/08/15-23:44:38.118235 8651103744 Options.compression_opts.strategy: 0 -2023/08/15-23:44:38.118236 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/15-23:44:38.118237 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/15-23:44:38.118238 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/15-23:44:38.118239 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/15-23:44:38.118239 8651103744 Options.compression_opts.enabled: false -2023/08/15-23:44:38.118240 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/15-23:44:38.118241 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/15-23:44:38.118242 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/15-23:44:38.118243 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/15-23:44:38.118244 8651103744 Options.target_file_size_base: 67108864 -2023/08/15-23:44:38.118245 8651103744 Options.target_file_size_multiplier: 1 -2023/08/15-23:44:38.118246 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/15-23:44:38.118247 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/15-23:44:38.118248 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/15-23:44:38.118249 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/15-23:44:38.118251 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/15-23:44:38.118252 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/15-23:44:38.118253 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/15-23:44:38.118254 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/15-23:44:38.118255 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/15-23:44:38.118256 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/15-23:44:38.118257 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/15-23:44:38.118258 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/15-23:44:38.118259 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/15-23:44:38.118260 8651103744 Options.arena_block_size: 1048576 -2023/08/15-23:44:38.118261 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/15-23:44:38.118262 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/15-23:44:38.118263 8651103744 Options.disable_auto_compactions: 0 -2023/08/15-23:44:38.118264 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/15-23:44:38.118265 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/15-23:44:38.118266 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/15-23:44:38.118267 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/15-23:44:38.118268 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/15-23:44:38.118269 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/15-23:44:38.118270 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/15-23:44:38.118273 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/15-23:44:38.118274 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/15-23:44:38.118275 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/15-23:44:38.118277 8651103744 Options.table_properties_collectors: -2023/08/15-23:44:38.118278 8651103744 Options.inplace_update_support: 0 -2023/08/15-23:44:38.118279 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/15-23:44:38.118280 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/15-23:44:38.118281 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/15-23:44:38.118282 8651103744 Options.memtable_huge_page_size: 0 -2023/08/15-23:44:38.118283 8651103744 Options.bloom_locality: 0 -2023/08/15-23:44:38.118284 8651103744 Options.max_successive_merges: 0 -2023/08/15-23:44:38.118285 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/15-23:44:38.118286 8651103744 Options.paranoid_file_checks: 0 -2023/08/15-23:44:38.118287 8651103744 Options.force_consistency_checks: 1 -2023/08/15-23:44:38.118288 8651103744 Options.report_bg_io_stats: 0 -2023/08/15-23:44:38.118288 8651103744 Options.ttl: 2592000 -2023/08/15-23:44:38.118290 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/15-23:44:38.118291 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/15-23:44:38.118291 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/15-23:44:38.118292 8651103744 Options.enable_blob_files: false -2023/08/15-23:44:38.118293 8651103744 Options.min_blob_size: 0 -2023/08/15-23:44:38.118294 8651103744 Options.blob_file_size: 268435456 -2023/08/15-23:44:38.118295 8651103744 Options.blob_compression_type: NoCompression -2023/08/15-23:44:38.118297 8651103744 Options.enable_blob_garbage_collection: false -2023/08/15-23:44:38.118298 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/15-23:44:38.118299 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/15-23:44:38.118300 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/15-23:44:38.118301 8651103744 Options.blob_file_starting_level: 0 -2023/08/15-23:44:38.118302 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/15-23:44:38.119183 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000027 succeeded,manifest_file_number is 27, next_file_number is 29, last_sequence is 59, log_number is 23,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 18 -2023/08/15-23:44:38.119187 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 23 -2023/08/15-23:44:38.119243 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/15-23:44:38.119352 8651103744 EVENT_LOG_v1 {"time_micros": 1692110678119347, "job": 1, "event": "recovery_started", "wal_files": [22, 26]} -2023/08/15-23:44:38.119354 8651103744 [db/db_impl/db_impl_open.cc:1018] Skipping log #22 since it is older than min log to keep #23 -2023/08/15-23:44:38.119356 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #26 mode 2 -2023/08/15-23:44:38.120316 8651103744 EVENT_LOG_v1 {"time_micros": 1692110678120265, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 30, "file_size": 2588, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 63, "largest_seqno": 105, "table_properties": {"data_size": 1575, "index_size": 65, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 1815, "raw_average_key_size": 45, "raw_value_size": 2375, "raw_average_value_size": 59, "num_data_blocks": 1, "num_entries": 40, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692110678, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "GNTJRFOH8YXJUE7WIIPJ", "orig_file_number": 30, "seqno_to_time_mapping": "N/A"}} -2023/08/15-23:44:38.120416 8651103744 EVENT_LOG_v1 {"time_micros": 1692110678120414, "job": 1, "event": "recovery_finished"} -2023/08/15-23:44:38.120505 8651103744 [db/version_set.cc:5180] Creating manifest 32 -2023/08/15-23:44:38.122352 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000026.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/15-23:44:38.122388 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000022.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/15-23:44:38.122420 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x14360ab80 -2023/08/15-23:44:38.122466 8651103744 DB pointer 0x14382aa00 -2023/08/15-23:44:38.122631 6092500992 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/15-23:44:38.122635 6092500992 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 3/0 7.38 KB 0.8 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 2.7 0.00 0.00 1 0.001 0 0 0.0 0.0 - Sum 3/0 7.38 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 2.7 0.00 0.00 1 0.001 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 2.7 0.00 0.00 1 0.001 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.7 0.00 0.00 1 0.001 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 0.56 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 0.56 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x600003bf86d8#74764 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 1e-05 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692159337379204 b/rust/hyperlane_db/LOG.old.1692159337379204 deleted file mode 100644 index 2e681c31e7..0000000000 --- a/rust/hyperlane_db/LOG.old.1692159337379204 +++ /dev/null @@ -1,303 +0,0 @@ -2023/08/16-13:13:32.672905 8651103744 RocksDB version: 8.1.1 -2023/08/16-13:13:32.673682 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/16-13:13:32.673684 8651103744 DB SUMMARY -2023/08/16-13:13:32.673685 8651103744 DB Session ID: LQZM45ZTWAYSR16YVIL9 -2023/08/16-13:13:32.673779 8651103744 CURRENT file: CURRENT -2023/08/16-13:13:32.673781 8651103744 IDENTITY file: IDENTITY -2023/08/16-13:13:32.673799 8651103744 MANIFEST file: MANIFEST-000032 size: 566 Bytes -2023/08/16-13:13:32.673801 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 3, files: 000016.sst 000021.sst 000030.sst -2023/08/16-13:13:32.673802 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000031.log size: 264411 ; -2023/08/16-13:13:32.673804 8651103744 Options.error_if_exists: 0 -2023/08/16-13:13:32.673806 8651103744 Options.create_if_missing: 1 -2023/08/16-13:13:32.673807 8651103744 Options.paranoid_checks: 1 -2023/08/16-13:13:32.673808 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/16-13:13:32.673809 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/16-13:13:32.673810 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/16-13:13:32.673811 8651103744 Options.env: 0x103007828 -2023/08/16-13:13:32.673812 8651103744 Options.fs: PosixFileSystem -2023/08/16-13:13:32.673813 8651103744 Options.info_log: 0x15be0aa28 -2023/08/16-13:13:32.673814 8651103744 Options.max_file_opening_threads: 16 -2023/08/16-13:13:32.673815 8651103744 Options.statistics: 0x0 -2023/08/16-13:13:32.673816 8651103744 Options.use_fsync: 0 -2023/08/16-13:13:32.673817 8651103744 Options.max_log_file_size: 0 -2023/08/16-13:13:32.673818 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/16-13:13:32.673819 8651103744 Options.log_file_time_to_roll: 0 -2023/08/16-13:13:32.673820 8651103744 Options.keep_log_file_num: 1000 -2023/08/16-13:13:32.673831 8651103744 Options.recycle_log_file_num: 0 -2023/08/16-13:13:32.673832 8651103744 Options.allow_fallocate: 1 -2023/08/16-13:13:32.673833 8651103744 Options.allow_mmap_reads: 0 -2023/08/16-13:13:32.673834 8651103744 Options.allow_mmap_writes: 0 -2023/08/16-13:13:32.673835 8651103744 Options.use_direct_reads: 0 -2023/08/16-13:13:32.673836 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/16-13:13:32.673837 8651103744 Options.create_missing_column_families: 0 -2023/08/16-13:13:32.673838 8651103744 Options.db_log_dir: -2023/08/16-13:13:32.673839 8651103744 Options.wal_dir: -2023/08/16-13:13:32.673840 8651103744 Options.table_cache_numshardbits: 6 -2023/08/16-13:13:32.673841 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/16-13:13:32.673842 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/16-13:13:32.673843 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/16-13:13:32.673844 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/16-13:13:32.673845 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/16-13:13:32.673846 8651103744 Options.advise_random_on_open: 1 -2023/08/16-13:13:32.673846 8651103744 Options.db_write_buffer_size: 0 -2023/08/16-13:13:32.673847 8651103744 Options.write_buffer_manager: 0x600003da5380 -2023/08/16-13:13:32.673848 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/16-13:13:32.673849 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/16-13:13:32.673850 8651103744 Options.use_adaptive_mutex: 0 -2023/08/16-13:13:32.673851 8651103744 Options.rate_limiter: 0x0 -2023/08/16-13:13:32.673853 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/16-13:13:32.673854 8651103744 Options.wal_recovery_mode: 2 -2023/08/16-13:13:32.673854 8651103744 Options.enable_thread_tracking: 0 -2023/08/16-13:13:32.673855 8651103744 Options.enable_pipelined_write: 0 -2023/08/16-13:13:32.673856 8651103744 Options.unordered_write: 0 -2023/08/16-13:13:32.673857 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/16-13:13:32.673858 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/16-13:13:32.673859 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/16-13:13:32.673860 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/16-13:13:32.673861 8651103744 Options.row_cache: None -2023/08/16-13:13:32.673862 8651103744 Options.wal_filter: None -2023/08/16-13:13:32.673863 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/16-13:13:32.673864 8651103744 Options.allow_ingest_behind: 0 -2023/08/16-13:13:32.673865 8651103744 Options.two_write_queues: 0 -2023/08/16-13:13:32.673866 8651103744 Options.manual_wal_flush: 0 -2023/08/16-13:13:32.673867 8651103744 Options.wal_compression: 0 -2023/08/16-13:13:32.673868 8651103744 Options.atomic_flush: 0 -2023/08/16-13:13:32.673869 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/16-13:13:32.673870 8651103744 Options.persist_stats_to_disk: 0 -2023/08/16-13:13:32.673871 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/16-13:13:32.673872 8651103744 Options.log_readahead_size: 0 -2023/08/16-13:13:32.673873 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/16-13:13:32.673874 8651103744 Options.best_efforts_recovery: 0 -2023/08/16-13:13:32.673875 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/16-13:13:32.673876 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/16-13:13:32.673877 8651103744 Options.allow_data_in_errors: 0 -2023/08/16-13:13:32.673878 8651103744 Options.db_host_id: __hostname__ -2023/08/16-13:13:32.673879 8651103744 Options.enforce_single_del_contracts: true -2023/08/16-13:13:32.673880 8651103744 Options.max_background_jobs: 2 -2023/08/16-13:13:32.673881 8651103744 Options.max_background_compactions: -1 -2023/08/16-13:13:32.673882 8651103744 Options.max_subcompactions: 1 -2023/08/16-13:13:32.673883 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/16-13:13:32.673884 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/16-13:13:32.673885 8651103744 Options.delayed_write_rate : 16777216 -2023/08/16-13:13:32.673886 8651103744 Options.max_total_wal_size: 0 -2023/08/16-13:13:32.673887 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/16-13:13:32.673888 8651103744 Options.stats_dump_period_sec: 600 -2023/08/16-13:13:32.673889 8651103744 Options.stats_persist_period_sec: 600 -2023/08/16-13:13:32.673890 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/16-13:13:32.673891 8651103744 Options.max_open_files: -1 -2023/08/16-13:13:32.673892 8651103744 Options.bytes_per_sync: 0 -2023/08/16-13:13:32.673893 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/16-13:13:32.673894 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/16-13:13:32.673895 8651103744 Options.compaction_readahead_size: 0 -2023/08/16-13:13:32.673896 8651103744 Options.max_background_flushes: -1 -2023/08/16-13:13:32.673896 8651103744 Compression algorithms supported: -2023/08/16-13:13:32.673917 8651103744 kZSTD supported: 1 -2023/08/16-13:13:32.673918 8651103744 kZlibCompression supported: 1 -2023/08/16-13:13:32.673919 8651103744 kXpressCompression supported: 0 -2023/08/16-13:13:32.673920 8651103744 kSnappyCompression supported: 1 -2023/08/16-13:13:32.673921 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/16-13:13:32.673922 8651103744 kLZ4HCCompression supported: 1 -2023/08/16-13:13:32.673923 8651103744 kLZ4Compression supported: 1 -2023/08/16-13:13:32.673924 8651103744 kBZip2Compression supported: 1 -2023/08/16-13:13:32.673932 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/16-13:13:32.673933 8651103744 DMutex implementation: pthread_mutex_t -2023/08/16-13:13:32.674260 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000032 -2023/08/16-13:13:32.674347 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/16-13:13:32.674348 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/16-13:13:32.674349 8651103744 Options.merge_operator: None -2023/08/16-13:13:32.674350 8651103744 Options.compaction_filter: None -2023/08/16-13:13:32.674350 8651103744 Options.compaction_filter_factory: None -2023/08/16-13:13:32.674351 8651103744 Options.sst_partitioner_factory: None -2023/08/16-13:13:32.674351 8651103744 Options.memtable_factory: SkipListFactory -2023/08/16-13:13:32.674352 8651103744 Options.table_factory: BlockBasedTable -2023/08/16-13:13:32.674377 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x6000006a8640) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000033a46d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/16-13:13:32.674379 8651103744 Options.write_buffer_size: 67108864 -2023/08/16-13:13:32.674380 8651103744 Options.max_write_buffer_number: 2 -2023/08/16-13:13:32.674381 8651103744 Options.compression: Snappy -2023/08/16-13:13:32.674381 8651103744 Options.bottommost_compression: Disabled -2023/08/16-13:13:32.674382 8651103744 Options.prefix_extractor: nullptr -2023/08/16-13:13:32.674383 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/16-13:13:32.674383 8651103744 Options.num_levels: 7 -2023/08/16-13:13:32.674384 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/16-13:13:32.674384 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/16-13:13:32.674385 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/16-13:13:32.674386 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/16-13:13:32.674386 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/16-13:13:32.674387 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/16-13:13:32.674387 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/16-13:13:32.674388 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/16-13:13:32.674389 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/16-13:13:32.674389 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/16-13:13:32.674390 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-13:13:32.674390 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/16-13:13:32.674391 8651103744 Options.compression_opts.window_bits: -14 -2023/08/16-13:13:32.674392 8651103744 Options.compression_opts.level: 32767 -2023/08/16-13:13:32.674392 8651103744 Options.compression_opts.strategy: 0 -2023/08/16-13:13:32.674393 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/16-13:13:32.674393 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/16-13:13:32.674394 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/16-13:13:32.674395 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/16-13:13:32.674395 8651103744 Options.compression_opts.enabled: false -2023/08/16-13:13:32.674396 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-13:13:32.674396 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/16-13:13:32.674397 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/16-13:13:32.674397 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/16-13:13:32.674398 8651103744 Options.target_file_size_base: 67108864 -2023/08/16-13:13:32.674399 8651103744 Options.target_file_size_multiplier: 1 -2023/08/16-13:13:32.674399 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/16-13:13:32.674400 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/16-13:13:32.674400 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/16-13:13:32.674401 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/16-13:13:32.674402 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/16-13:13:32.674402 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/16-13:13:32.674403 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/16-13:13:32.674404 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/16-13:13:32.674404 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/16-13:13:32.674405 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/16-13:13:32.674405 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/16-13:13:32.674406 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/16-13:13:32.674407 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/16-13:13:32.674407 8651103744 Options.arena_block_size: 1048576 -2023/08/16-13:13:32.674408 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/16-13:13:32.674408 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/16-13:13:32.674409 8651103744 Options.disable_auto_compactions: 0 -2023/08/16-13:13:32.674410 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/16-13:13:32.674410 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/16-13:13:32.674411 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/16-13:13:32.674411 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/16-13:13:32.674412 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/16-13:13:32.674413 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/16-13:13:32.674413 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/16-13:13:32.674416 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/16-13:13:32.674416 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/16-13:13:32.674417 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/16-13:13:32.674418 8651103744 Options.table_properties_collectors: -2023/08/16-13:13:32.674419 8651103744 Options.inplace_update_support: 0 -2023/08/16-13:13:32.674419 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/16-13:13:32.674420 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/16-13:13:32.674420 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/16-13:13:32.674421 8651103744 Options.memtable_huge_page_size: 0 -2023/08/16-13:13:32.674422 8651103744 Options.bloom_locality: 0 -2023/08/16-13:13:32.674422 8651103744 Options.max_successive_merges: 0 -2023/08/16-13:13:32.674423 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/16-13:13:32.674423 8651103744 Options.paranoid_file_checks: 0 -2023/08/16-13:13:32.674424 8651103744 Options.force_consistency_checks: 1 -2023/08/16-13:13:32.674424 8651103744 Options.report_bg_io_stats: 0 -2023/08/16-13:13:32.674425 8651103744 Options.ttl: 2592000 -2023/08/16-13:13:32.674426 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/16-13:13:32.674426 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/16-13:13:32.674427 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/16-13:13:32.674427 8651103744 Options.enable_blob_files: false -2023/08/16-13:13:32.674428 8651103744 Options.min_blob_size: 0 -2023/08/16-13:13:32.674428 8651103744 Options.blob_file_size: 268435456 -2023/08/16-13:13:32.674429 8651103744 Options.blob_compression_type: NoCompression -2023/08/16-13:13:32.674430 8651103744 Options.enable_blob_garbage_collection: false -2023/08/16-13:13:32.674430 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/16-13:13:32.674431 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/16-13:13:32.674432 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/16-13:13:32.674432 8651103744 Options.blob_file_starting_level: 0 -2023/08/16-13:13:32.674433 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/16-13:13:32.675214 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000032 succeeded,manifest_file_number is 32, next_file_number is 34, last_sequence is 105, log_number is 27,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 27 -2023/08/16-13:13:32.675217 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 27 -2023/08/16-13:13:32.675400 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/16-13:13:32.675474 8651103744 EVENT_LOG_v1 {"time_micros": 1692159212675471, "job": 1, "event": "recovery_started", "wal_files": [31]} -2023/08/16-13:13:32.675476 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #31 mode 2 -2023/08/16-13:13:32.677885 8651103744 EVENT_LOG_v1 {"time_micros": 1692159212677870, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 35, "file_size": 96358, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 109, "largest_seqno": 2010, "table_properties": {"data_size": 94632, "index_size": 1776, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 116687, "raw_average_key_size": 67, "raw_value_size": 111669, "raw_average_value_size": 64, "num_data_blocks": 44, "num_entries": 1726, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692159212, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "LQZM45ZTWAYSR16YVIL9", "orig_file_number": 35, "seqno_to_time_mapping": "N/A"}} -2023/08/16-13:13:32.677943 8651103744 EVENT_LOG_v1 {"time_micros": 1692159212677942, "job": 1, "event": "recovery_finished"} -2023/08/16-13:13:32.677989 8651103744 [db/version_set.cc:5180] Creating manifest 37 -2023/08/16-13:13:32.679585 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000031.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-13:13:32.679617 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x15be0ab80 -2023/08/16-13:13:32.679655 8651103744 DB pointer 0x15c02b800 -2023/08/16-13:13:32.679667 6158430208 [db/compaction/compaction_job.cc:1988] [default] [JOB 3] Compacting 4@0 files to L1, score 1.00 -2023/08/16-13:13:32.679670 6158430208 [db/compaction/compaction_job.cc:1992] [default]: Compaction start summary: Base version 2 Base level 0, inputs: [35(94KB) 30(2588B) 21(3901B) 16(1067B)] -2023/08/16-13:13:32.679676 6158430208 EVENT_LOG_v1 {"time_micros": 1692159212679672, "job": 3, "event": "compaction_started", "compaction_reason": "LevelL0FilesNum", "files_L0": [35, 30, 21, 16], "score": 1, "input_data_size": 103914, "oldest_snapshot_seqno": -1} -2023/08/16-13:13:32.679795 6159577088 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/16-13:13:32.679965 6159577088 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 4/4 101.48 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 85.3 0.00 0.00 1 0.001 0 0 0.0 0.0 - Sum 4/4 101.48 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 85.3 0.00 0.00 1 0.001 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 85.3 0.00 0.00 1 0.001 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 85.3 0.00 0.00 1 0.001 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 16.90 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 16.90 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000033a46d8#85416 capacity: 8.00 MB usage: 11.95 KB table_size: 256 occupancy: 12233 collections: 1 last_copies: 0 last_secs: 8e-06 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(5,11.52 KB,0.140643%) - -** File Read Latency Histogram By Level [default] ** -2023/08/16-13:13:32.680785 6158430208 [db/compaction/compaction_job.cc:1592] [default] [JOB 3] Generated table #40: 1819 keys, 99281 bytes, temperature: kUnknown -2023/08/16-13:13:32.680801 6158430208 EVENT_LOG_v1 {"time_micros": 1692159212680788, "cf_name": "default", "job": 3, "event": "table_file_creation", "file_number": 40, "file_size": 99281, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 0, "largest_seqno": 0, "table_properties": {"data_size": 97497, "index_size": 1885, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 120903, "raw_average_key_size": 66, "raw_value_size": 121444, "raw_average_value_size": 66, "num_data_blocks": 47, "num_entries": 1819, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692109142, "oldest_key_time": 0, "file_creation_time": 1692159212, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "LQZM45ZTWAYSR16YVIL9", "orig_file_number": 40, "seqno_to_time_mapping": "N/A"}} -2023/08/16-13:13:32.680946 6158430208 (Original Log Time 2023/08/16-13:13:32.680871) [db/compaction/compaction_job.cc:1663] [default] [JOB 3] Compacted 4@0 files to L1 => 99281 bytes -2023/08/16-13:13:32.680947 6158430208 (Original Log Time 2023/08/16-13:13:32.680925) [db/compaction/compaction_job.cc:885] [default] compacted to: files[0 1 0 0 0 0 0] max score 0.00, MB/sec: 91.3 rd, 87.2 wr, level 1, files in(4, 0) out(1 +0 blob) MB in(0.1, 0.0 +0.0 blob) out(0.1 +0.0 blob), read-write-amplify(2.0) write-amplify(1.0) OK, records in: 1822, records dropped: 3 output_compression: Snappy -2023/08/16-13:13:32.680949 6158430208 (Original Log Time 2023/08/16-13:13:32.680935) EVENT_LOG_v1 {"time_micros": 1692159212680928, "job": 3, "event": "compaction_finished", "compaction_time_micros": 1138, "compaction_time_cpu_micros": 1093, "output_level": 1, "num_output_files": 1, "total_output_size": 99281, "num_input_records": 1822, "num_output_records": 1819, "num_subcompactions": 1, "output_compression": "Snappy", "num_single_delete_mismatches": 0, "num_single_delete_fallthrough": 0, "lsm_state": [0, 1, 0, 0, 0, 0, 0]} -2023/08/16-13:13:32.681020 6158430208 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000035.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-13:13:32.681024 6158430208 EVENT_LOG_v1 {"time_micros": 1692159212681022, "job": 3, "event": "table_file_deletion", "file_number": 35} -2023/08/16-13:13:32.681072 6158430208 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000030.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-13:13:32.681075 6158430208 EVENT_LOG_v1 {"time_micros": 1692159212681074, "job": 3, "event": "table_file_deletion", "file_number": 30} -2023/08/16-13:13:32.681702 6158430208 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000021.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-13:13:32.681705 6158430208 EVENT_LOG_v1 {"time_micros": 1692159212681704, "job": 3, "event": "table_file_deletion", "file_number": 21} -2023/08/16-13:13:32.681990 6158430208 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000016.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-13:13:32.681996 6158430208 EVENT_LOG_v1 {"time_micros": 1692159212681994, "job": 3, "event": "table_file_deletion", "file_number": 16} -2023/08/16-13:14:13.965381 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work -2023/08/16-13:14:13.966254 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692159630683428 b/rust/hyperlane_db/LOG.old.1692159630683428 deleted file mode 100644 index b5cfd4df51..0000000000 --- a/rust/hyperlane_db/LOG.old.1692159630683428 +++ /dev/null @@ -1,288 +0,0 @@ -2023/08/16-13:15:37.379701 8651103744 RocksDB version: 8.1.1 -2023/08/16-13:15:37.380407 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/16-13:15:37.380410 8651103744 DB SUMMARY -2023/08/16-13:15:37.380412 8651103744 DB Session ID: D697NVFHKDYVI4HOY9MN -2023/08/16-13:15:37.380491 8651103744 CURRENT file: CURRENT -2023/08/16-13:15:37.380493 8651103744 IDENTITY file: IDENTITY -2023/08/16-13:15:37.380510 8651103744 MANIFEST file: MANIFEST-000037 size: 969 Bytes -2023/08/16-13:15:37.380512 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 1, files: 000040.sst -2023/08/16-13:15:37.380514 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000036.log size: 861744 ; -2023/08/16-13:15:37.380516 8651103744 Options.error_if_exists: 0 -2023/08/16-13:15:37.380517 8651103744 Options.create_if_missing: 1 -2023/08/16-13:15:37.380519 8651103744 Options.paranoid_checks: 1 -2023/08/16-13:15:37.380520 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/16-13:15:37.380521 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/16-13:15:37.380522 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/16-13:15:37.380523 8651103744 Options.env: 0x104b5b828 -2023/08/16-13:15:37.380525 8651103744 Options.fs: PosixFileSystem -2023/08/16-13:15:37.380526 8651103744 Options.info_log: 0x136e0aa78 -2023/08/16-13:15:37.380527 8651103744 Options.max_file_opening_threads: 16 -2023/08/16-13:15:37.380528 8651103744 Options.statistics: 0x0 -2023/08/16-13:15:37.380529 8651103744 Options.use_fsync: 0 -2023/08/16-13:15:37.380531 8651103744 Options.max_log_file_size: 0 -2023/08/16-13:15:37.380532 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/16-13:15:37.380533 8651103744 Options.log_file_time_to_roll: 0 -2023/08/16-13:15:37.380534 8651103744 Options.keep_log_file_num: 1000 -2023/08/16-13:15:37.380535 8651103744 Options.recycle_log_file_num: 0 -2023/08/16-13:15:37.380536 8651103744 Options.allow_fallocate: 1 -2023/08/16-13:15:37.380537 8651103744 Options.allow_mmap_reads: 0 -2023/08/16-13:15:37.380539 8651103744 Options.allow_mmap_writes: 0 -2023/08/16-13:15:37.380540 8651103744 Options.use_direct_reads: 0 -2023/08/16-13:15:37.380541 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/16-13:15:37.380542 8651103744 Options.create_missing_column_families: 0 -2023/08/16-13:15:37.380543 8651103744 Options.db_log_dir: -2023/08/16-13:15:37.380544 8651103744 Options.wal_dir: -2023/08/16-13:15:37.380545 8651103744 Options.table_cache_numshardbits: 6 -2023/08/16-13:15:37.380546 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/16-13:15:37.380547 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/16-13:15:37.380548 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/16-13:15:37.380550 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/16-13:15:37.380551 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/16-13:15:37.380552 8651103744 Options.advise_random_on_open: 1 -2023/08/16-13:15:37.380553 8651103744 Options.db_write_buffer_size: 0 -2023/08/16-13:15:37.380554 8651103744 Options.write_buffer_manager: 0x600002f05380 -2023/08/16-13:15:37.380555 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/16-13:15:37.380556 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/16-13:15:37.380557 8651103744 Options.use_adaptive_mutex: 0 -2023/08/16-13:15:37.380559 8651103744 Options.rate_limiter: 0x0 -2023/08/16-13:15:37.380560 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/16-13:15:37.380561 8651103744 Options.wal_recovery_mode: 2 -2023/08/16-13:15:37.380562 8651103744 Options.enable_thread_tracking: 0 -2023/08/16-13:15:37.380563 8651103744 Options.enable_pipelined_write: 0 -2023/08/16-13:15:37.380564 8651103744 Options.unordered_write: 0 -2023/08/16-13:15:37.380565 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/16-13:15:37.380566 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/16-13:15:37.380567 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/16-13:15:37.380569 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/16-13:15:37.380570 8651103744 Options.row_cache: None -2023/08/16-13:15:37.380571 8651103744 Options.wal_filter: None -2023/08/16-13:15:37.380572 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/16-13:15:37.380573 8651103744 Options.allow_ingest_behind: 0 -2023/08/16-13:15:37.380574 8651103744 Options.two_write_queues: 0 -2023/08/16-13:15:37.380575 8651103744 Options.manual_wal_flush: 0 -2023/08/16-13:15:37.380576 8651103744 Options.wal_compression: 0 -2023/08/16-13:15:37.380578 8651103744 Options.atomic_flush: 0 -2023/08/16-13:15:37.380579 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/16-13:15:37.380580 8651103744 Options.persist_stats_to_disk: 0 -2023/08/16-13:15:37.380581 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/16-13:15:37.380582 8651103744 Options.log_readahead_size: 0 -2023/08/16-13:15:37.380584 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/16-13:15:37.380585 8651103744 Options.best_efforts_recovery: 0 -2023/08/16-13:15:37.380586 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/16-13:15:37.380587 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/16-13:15:37.380588 8651103744 Options.allow_data_in_errors: 0 -2023/08/16-13:15:37.380590 8651103744 Options.db_host_id: __hostname__ -2023/08/16-13:15:37.380591 8651103744 Options.enforce_single_del_contracts: true -2023/08/16-13:15:37.380592 8651103744 Options.max_background_jobs: 2 -2023/08/16-13:15:37.380593 8651103744 Options.max_background_compactions: -1 -2023/08/16-13:15:37.380594 8651103744 Options.max_subcompactions: 1 -2023/08/16-13:15:37.380595 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/16-13:15:37.380596 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/16-13:15:37.380597 8651103744 Options.delayed_write_rate : 16777216 -2023/08/16-13:15:37.380599 8651103744 Options.max_total_wal_size: 0 -2023/08/16-13:15:37.380600 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/16-13:15:37.380601 8651103744 Options.stats_dump_period_sec: 600 -2023/08/16-13:15:37.380602 8651103744 Options.stats_persist_period_sec: 600 -2023/08/16-13:15:37.380604 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/16-13:15:37.380605 8651103744 Options.max_open_files: -1 -2023/08/16-13:15:37.380606 8651103744 Options.bytes_per_sync: 0 -2023/08/16-13:15:37.380607 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/16-13:15:37.380608 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/16-13:15:37.380609 8651103744 Options.compaction_readahead_size: 0 -2023/08/16-13:15:37.380610 8651103744 Options.max_background_flushes: -1 -2023/08/16-13:15:37.380611 8651103744 Compression algorithms supported: -2023/08/16-13:15:37.380634 8651103744 kZSTD supported: 1 -2023/08/16-13:15:37.380635 8651103744 kZlibCompression supported: 1 -2023/08/16-13:15:37.380636 8651103744 kXpressCompression supported: 0 -2023/08/16-13:15:37.380637 8651103744 kSnappyCompression supported: 1 -2023/08/16-13:15:37.380639 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/16-13:15:37.380640 8651103744 kLZ4HCCompression supported: 1 -2023/08/16-13:15:37.380641 8651103744 kLZ4Compression supported: 1 -2023/08/16-13:15:37.380642 8651103744 kBZip2Compression supported: 1 -2023/08/16-13:15:37.380651 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/16-13:15:37.380652 8651103744 DMutex implementation: pthread_mutex_t -2023/08/16-13:15:37.380824 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000037 -2023/08/16-13:15:37.380940 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/16-13:15:37.380942 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/16-13:15:37.380943 8651103744 Options.merge_operator: None -2023/08/16-13:15:37.380944 8651103744 Options.compaction_filter: None -2023/08/16-13:15:37.380946 8651103744 Options.compaction_filter_factory: None -2023/08/16-13:15:37.380947 8651103744 Options.sst_partitioner_factory: None -2023/08/16-13:15:37.380948 8651103744 Options.memtable_factory: SkipListFactory -2023/08/16-13:15:37.380949 8651103744 Options.table_factory: BlockBasedTable -2023/08/16-13:15:37.380968 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600001408640) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000021046d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/16-13:15:37.380970 8651103744 Options.write_buffer_size: 67108864 -2023/08/16-13:15:37.380971 8651103744 Options.max_write_buffer_number: 2 -2023/08/16-13:15:37.380972 8651103744 Options.compression: Snappy -2023/08/16-13:15:37.380973 8651103744 Options.bottommost_compression: Disabled -2023/08/16-13:15:37.380974 8651103744 Options.prefix_extractor: nullptr -2023/08/16-13:15:37.380976 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/16-13:15:37.380977 8651103744 Options.num_levels: 7 -2023/08/16-13:15:37.380978 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/16-13:15:37.380979 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/16-13:15:37.380980 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/16-13:15:37.380981 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/16-13:15:37.380983 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/16-13:15:37.380984 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/16-13:15:37.380985 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/16-13:15:37.380986 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/16-13:15:37.380988 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/16-13:15:37.380989 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/16-13:15:37.380990 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-13:15:37.380991 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/16-13:15:37.380992 8651103744 Options.compression_opts.window_bits: -14 -2023/08/16-13:15:37.380993 8651103744 Options.compression_opts.level: 32767 -2023/08/16-13:15:37.380995 8651103744 Options.compression_opts.strategy: 0 -2023/08/16-13:15:37.380996 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/16-13:15:37.380997 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/16-13:15:37.380998 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/16-13:15:37.380999 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/16-13:15:37.381000 8651103744 Options.compression_opts.enabled: false -2023/08/16-13:15:37.381001 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-13:15:37.381003 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/16-13:15:37.381004 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/16-13:15:37.381005 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/16-13:15:37.381006 8651103744 Options.target_file_size_base: 67108864 -2023/08/16-13:15:37.381007 8651103744 Options.target_file_size_multiplier: 1 -2023/08/16-13:15:37.381008 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/16-13:15:37.381010 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/16-13:15:37.381011 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/16-13:15:37.381012 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/16-13:15:37.381014 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/16-13:15:37.381015 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/16-13:15:37.381016 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/16-13:15:37.381017 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/16-13:15:37.381018 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/16-13:15:37.381019 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/16-13:15:37.381020 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/16-13:15:37.381021 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/16-13:15:37.381023 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/16-13:15:37.381024 8651103744 Options.arena_block_size: 1048576 -2023/08/16-13:15:37.381025 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/16-13:15:37.381026 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/16-13:15:37.381027 8651103744 Options.disable_auto_compactions: 0 -2023/08/16-13:15:37.381029 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/16-13:15:37.381030 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/16-13:15:37.381031 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/16-13:15:37.381032 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/16-13:15:37.381034 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/16-13:15:37.381035 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/16-13:15:37.381036 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/16-13:15:37.381039 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/16-13:15:37.381041 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/16-13:15:37.381042 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/16-13:15:37.381044 8651103744 Options.table_properties_collectors: -2023/08/16-13:15:37.381045 8651103744 Options.inplace_update_support: 0 -2023/08/16-13:15:37.381046 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/16-13:15:37.381047 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/16-13:15:37.381049 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/16-13:15:37.381050 8651103744 Options.memtable_huge_page_size: 0 -2023/08/16-13:15:37.381051 8651103744 Options.bloom_locality: 0 -2023/08/16-13:15:37.381052 8651103744 Options.max_successive_merges: 0 -2023/08/16-13:15:37.381053 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/16-13:15:37.381054 8651103744 Options.paranoid_file_checks: 0 -2023/08/16-13:15:37.381055 8651103744 Options.force_consistency_checks: 1 -2023/08/16-13:15:37.381057 8651103744 Options.report_bg_io_stats: 0 -2023/08/16-13:15:37.381058 8651103744 Options.ttl: 2592000 -2023/08/16-13:15:37.381059 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/16-13:15:37.381060 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/16-13:15:37.381061 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/16-13:15:37.381062 8651103744 Options.enable_blob_files: false -2023/08/16-13:15:37.381063 8651103744 Options.min_blob_size: 0 -2023/08/16-13:15:37.381065 8651103744 Options.blob_file_size: 268435456 -2023/08/16-13:15:37.381066 8651103744 Options.blob_compression_type: NoCompression -2023/08/16-13:15:37.381067 8651103744 Options.enable_blob_garbage_collection: false -2023/08/16-13:15:37.381068 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/16-13:15:37.381069 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/16-13:15:37.381071 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/16-13:15:37.381072 8651103744 Options.blob_file_starting_level: 0 -2023/08/16-13:15:37.381073 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/16-13:15:37.381995 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000037 succeeded,manifest_file_number is 37, next_file_number is 42, last_sequence is 2010, log_number is 32,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 32 -2023/08/16-13:15:37.381999 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 32 -2023/08/16-13:15:37.382063 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/16-13:15:37.382174 8651103744 EVENT_LOG_v1 {"time_micros": 1692159337382169, "job": 1, "event": "recovery_started", "wal_files": [36]} -2023/08/16-13:15:37.382177 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #36 mode 2 -2023/08/16-13:15:37.392141 8651103744 EVENT_LOG_v1 {"time_micros": 1692159337392114, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 43, "file_size": 282983, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 2012, "largest_seqno": 8188, "table_properties": {"data_size": 280036, "index_size": 7108, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 536446, "raw_average_key_size": 88, "raw_value_size": 232151, "raw_average_value_size": 38, "num_data_blocks": 128, "num_entries": 6058, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692159337, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "D697NVFHKDYVI4HOY9MN", "orig_file_number": 43, "seqno_to_time_mapping": "N/A"}} -2023/08/16-13:15:37.392204 8651103744 EVENT_LOG_v1 {"time_micros": 1692159337392203, "job": 1, "event": "recovery_finished"} -2023/08/16-13:15:37.392255 8651103744 [db/version_set.cc:5180] Creating manifest 45 -2023/08/16-13:15:37.393529 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000036.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-13:15:37.393553 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x136e0abd0 -2023/08/16-13:15:37.393581 8651103744 DB pointer 0x137027e00 -2023/08/16-13:15:37.393709 6130921472 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/16-13:15:37.393711 6130921472 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 1/0 276.35 KB 0.2 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 72.7 0.00 0.00 1 0.004 0 0 0.0 0.0 - L1 1/0 96.95 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 2/0 373.30 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 72.7 0.00 0.00 1 0.004 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 72.7 0.00 0.00 1 0.004 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 72.7 0.00 0.00 1 0.004 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 21.14 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 21.14 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000021046d8#85520 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 6e-06 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** -2023/08/16-13:16:17.953053 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work -2023/08/16-13:16:17.953355 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692160697660985 b/rust/hyperlane_db/LOG.old.1692160697660985 deleted file mode 100644 index 6d16dab926..0000000000 --- a/rust/hyperlane_db/LOG.old.1692160697660985 +++ /dev/null @@ -1,288 +0,0 @@ -2023/08/16-13:20:30.683766 8651103744 RocksDB version: 8.1.1 -2023/08/16-13:20:30.684368 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/16-13:20:30.684370 8651103744 DB SUMMARY -2023/08/16-13:20:30.684371 8651103744 DB Session ID: PA1CFVFNVWGPQ34A1TE2 -2023/08/16-13:20:30.684408 8651103744 CURRENT file: CURRENT -2023/08/16-13:20:30.684409 8651103744 IDENTITY file: IDENTITY -2023/08/16-13:20:30.684419 8651103744 MANIFEST file: MANIFEST-000045 size: 492 Bytes -2023/08/16-13:20:30.684420 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 2, files: 000040.sst 000043.sst -2023/08/16-13:20:30.684421 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000044.log size: 1014346 ; -2023/08/16-13:20:30.684422 8651103744 Options.error_if_exists: 0 -2023/08/16-13:20:30.684423 8651103744 Options.create_if_missing: 1 -2023/08/16-13:20:30.684424 8651103744 Options.paranoid_checks: 1 -2023/08/16-13:20:30.684424 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/16-13:20:30.684425 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/16-13:20:30.684426 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/16-13:20:30.684426 8651103744 Options.env: 0x104dc3828 -2023/08/16-13:20:30.684427 8651103744 Options.fs: PosixFileSystem -2023/08/16-13:20:30.684428 8651103744 Options.info_log: 0x138805f78 -2023/08/16-13:20:30.684429 8651103744 Options.max_file_opening_threads: 16 -2023/08/16-13:20:30.684429 8651103744 Options.statistics: 0x0 -2023/08/16-13:20:30.684430 8651103744 Options.use_fsync: 0 -2023/08/16-13:20:30.684431 8651103744 Options.max_log_file_size: 0 -2023/08/16-13:20:30.684431 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/16-13:20:30.684432 8651103744 Options.log_file_time_to_roll: 0 -2023/08/16-13:20:30.684432 8651103744 Options.keep_log_file_num: 1000 -2023/08/16-13:20:30.684433 8651103744 Options.recycle_log_file_num: 0 -2023/08/16-13:20:30.684434 8651103744 Options.allow_fallocate: 1 -2023/08/16-13:20:30.684434 8651103744 Options.allow_mmap_reads: 0 -2023/08/16-13:20:30.684435 8651103744 Options.allow_mmap_writes: 0 -2023/08/16-13:20:30.684436 8651103744 Options.use_direct_reads: 0 -2023/08/16-13:20:30.684436 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/16-13:20:30.684437 8651103744 Options.create_missing_column_families: 0 -2023/08/16-13:20:30.684438 8651103744 Options.db_log_dir: -2023/08/16-13:20:30.684438 8651103744 Options.wal_dir: -2023/08/16-13:20:30.684439 8651103744 Options.table_cache_numshardbits: 6 -2023/08/16-13:20:30.684439 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/16-13:20:30.684440 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/16-13:20:30.684441 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/16-13:20:30.684441 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/16-13:20:30.684442 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/16-13:20:30.684443 8651103744 Options.advise_random_on_open: 1 -2023/08/16-13:20:30.684443 8651103744 Options.db_write_buffer_size: 0 -2023/08/16-13:20:30.684444 8651103744 Options.write_buffer_manager: 0x600003404820 -2023/08/16-13:20:30.684445 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/16-13:20:30.684445 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/16-13:20:30.684446 8651103744 Options.use_adaptive_mutex: 0 -2023/08/16-13:20:30.684446 8651103744 Options.rate_limiter: 0x0 -2023/08/16-13:20:30.684447 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/16-13:20:30.684448 8651103744 Options.wal_recovery_mode: 2 -2023/08/16-13:20:30.684449 8651103744 Options.enable_thread_tracking: 0 -2023/08/16-13:20:30.684449 8651103744 Options.enable_pipelined_write: 0 -2023/08/16-13:20:30.684450 8651103744 Options.unordered_write: 0 -2023/08/16-13:20:30.684450 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/16-13:20:30.684451 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/16-13:20:30.684452 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/16-13:20:30.684452 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/16-13:20:30.684453 8651103744 Options.row_cache: None -2023/08/16-13:20:30.684454 8651103744 Options.wal_filter: None -2023/08/16-13:20:30.684454 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/16-13:20:30.684455 8651103744 Options.allow_ingest_behind: 0 -2023/08/16-13:20:30.684456 8651103744 Options.two_write_queues: 0 -2023/08/16-13:20:30.684456 8651103744 Options.manual_wal_flush: 0 -2023/08/16-13:20:30.684457 8651103744 Options.wal_compression: 0 -2023/08/16-13:20:30.684457 8651103744 Options.atomic_flush: 0 -2023/08/16-13:20:30.684458 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/16-13:20:30.684459 8651103744 Options.persist_stats_to_disk: 0 -2023/08/16-13:20:30.684459 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/16-13:20:30.684460 8651103744 Options.log_readahead_size: 0 -2023/08/16-13:20:30.684461 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/16-13:20:30.684461 8651103744 Options.best_efforts_recovery: 0 -2023/08/16-13:20:30.684462 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/16-13:20:30.684463 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/16-13:20:30.684463 8651103744 Options.allow_data_in_errors: 0 -2023/08/16-13:20:30.684464 8651103744 Options.db_host_id: __hostname__ -2023/08/16-13:20:30.684465 8651103744 Options.enforce_single_del_contracts: true -2023/08/16-13:20:30.684465 8651103744 Options.max_background_jobs: 2 -2023/08/16-13:20:30.684466 8651103744 Options.max_background_compactions: -1 -2023/08/16-13:20:30.684467 8651103744 Options.max_subcompactions: 1 -2023/08/16-13:20:30.684467 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/16-13:20:30.684468 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/16-13:20:30.684469 8651103744 Options.delayed_write_rate : 16777216 -2023/08/16-13:20:30.684469 8651103744 Options.max_total_wal_size: 0 -2023/08/16-13:20:30.684470 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/16-13:20:30.684471 8651103744 Options.stats_dump_period_sec: 600 -2023/08/16-13:20:30.684471 8651103744 Options.stats_persist_period_sec: 600 -2023/08/16-13:20:30.684472 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/16-13:20:30.684473 8651103744 Options.max_open_files: -1 -2023/08/16-13:20:30.684473 8651103744 Options.bytes_per_sync: 0 -2023/08/16-13:20:30.684474 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/16-13:20:30.684474 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/16-13:20:30.684475 8651103744 Options.compaction_readahead_size: 0 -2023/08/16-13:20:30.684476 8651103744 Options.max_background_flushes: -1 -2023/08/16-13:20:30.684476 8651103744 Compression algorithms supported: -2023/08/16-13:20:30.684490 8651103744 kZSTD supported: 1 -2023/08/16-13:20:30.684491 8651103744 kZlibCompression supported: 1 -2023/08/16-13:20:30.684491 8651103744 kXpressCompression supported: 0 -2023/08/16-13:20:30.684492 8651103744 kSnappyCompression supported: 1 -2023/08/16-13:20:30.684493 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/16-13:20:30.684493 8651103744 kLZ4HCCompression supported: 1 -2023/08/16-13:20:30.684494 8651103744 kLZ4Compression supported: 1 -2023/08/16-13:20:30.684495 8651103744 kBZip2Compression supported: 1 -2023/08/16-13:20:30.684500 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/16-13:20:30.684501 8651103744 DMutex implementation: pthread_mutex_t -2023/08/16-13:20:30.684763 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000045 -2023/08/16-13:20:30.684839 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/16-13:20:30.684840 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/16-13:20:30.684841 8651103744 Options.merge_operator: None -2023/08/16-13:20:30.684841 8651103744 Options.compaction_filter: None -2023/08/16-13:20:30.684842 8651103744 Options.compaction_filter_factory: None -2023/08/16-13:20:30.684843 8651103744 Options.sst_partitioner_factory: None -2023/08/16-13:20:30.684843 8651103744 Options.memtable_factory: SkipListFactory -2023/08/16-13:20:30.684844 8651103744 Options.table_factory: BlockBasedTable -2023/08/16-13:20:30.684855 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600000f04640) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x600003a040d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/16-13:20:30.684856 8651103744 Options.write_buffer_size: 67108864 -2023/08/16-13:20:30.684857 8651103744 Options.max_write_buffer_number: 2 -2023/08/16-13:20:30.684857 8651103744 Options.compression: Snappy -2023/08/16-13:20:30.684858 8651103744 Options.bottommost_compression: Disabled -2023/08/16-13:20:30.684859 8651103744 Options.prefix_extractor: nullptr -2023/08/16-13:20:30.684859 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/16-13:20:30.684860 8651103744 Options.num_levels: 7 -2023/08/16-13:20:30.684861 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/16-13:20:30.684861 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/16-13:20:30.684862 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/16-13:20:30.684863 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/16-13:20:30.684863 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/16-13:20:30.684864 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/16-13:20:30.684865 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/16-13:20:30.684865 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/16-13:20:30.684866 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/16-13:20:30.684867 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/16-13:20:30.684867 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-13:20:30.684868 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/16-13:20:30.684869 8651103744 Options.compression_opts.window_bits: -14 -2023/08/16-13:20:30.684869 8651103744 Options.compression_opts.level: 32767 -2023/08/16-13:20:30.684870 8651103744 Options.compression_opts.strategy: 0 -2023/08/16-13:20:30.684870 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/16-13:20:30.684871 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/16-13:20:30.684872 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/16-13:20:30.684872 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/16-13:20:30.684873 8651103744 Options.compression_opts.enabled: false -2023/08/16-13:20:30.684874 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-13:20:30.684874 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/16-13:20:30.684875 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/16-13:20:30.684876 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/16-13:20:30.684876 8651103744 Options.target_file_size_base: 67108864 -2023/08/16-13:20:30.684877 8651103744 Options.target_file_size_multiplier: 1 -2023/08/16-13:20:30.684877 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/16-13:20:30.684878 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/16-13:20:30.684879 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/16-13:20:30.684880 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/16-13:20:30.684880 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/16-13:20:30.684881 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/16-13:20:30.684882 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/16-13:20:30.684882 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/16-13:20:30.684883 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/16-13:20:30.684884 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/16-13:20:30.684884 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/16-13:20:30.684885 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/16-13:20:30.684885 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/16-13:20:30.684886 8651103744 Options.arena_block_size: 1048576 -2023/08/16-13:20:30.684887 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/16-13:20:30.684887 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/16-13:20:30.684888 8651103744 Options.disable_auto_compactions: 0 -2023/08/16-13:20:30.684889 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/16-13:20:30.684890 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/16-13:20:30.684891 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/16-13:20:30.684891 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/16-13:20:30.684892 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/16-13:20:30.684892 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/16-13:20:30.684893 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/16-13:20:30.684895 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/16-13:20:30.684896 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/16-13:20:30.684897 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/16-13:20:30.684898 8651103744 Options.table_properties_collectors: -2023/08/16-13:20:30.684898 8651103744 Options.inplace_update_support: 0 -2023/08/16-13:20:30.684899 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/16-13:20:30.684900 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/16-13:20:30.684900 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/16-13:20:30.684901 8651103744 Options.memtable_huge_page_size: 0 -2023/08/16-13:20:30.684902 8651103744 Options.bloom_locality: 0 -2023/08/16-13:20:30.684902 8651103744 Options.max_successive_merges: 0 -2023/08/16-13:20:30.684903 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/16-13:20:30.684904 8651103744 Options.paranoid_file_checks: 0 -2023/08/16-13:20:30.684904 8651103744 Options.force_consistency_checks: 1 -2023/08/16-13:20:30.684905 8651103744 Options.report_bg_io_stats: 0 -2023/08/16-13:20:30.684905 8651103744 Options.ttl: 2592000 -2023/08/16-13:20:30.684906 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/16-13:20:30.684907 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/16-13:20:30.684907 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/16-13:20:30.684908 8651103744 Options.enable_blob_files: false -2023/08/16-13:20:30.684909 8651103744 Options.min_blob_size: 0 -2023/08/16-13:20:30.684909 8651103744 Options.blob_file_size: 268435456 -2023/08/16-13:20:30.684910 8651103744 Options.blob_compression_type: NoCompression -2023/08/16-13:20:30.684911 8651103744 Options.enable_blob_garbage_collection: false -2023/08/16-13:20:30.684911 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/16-13:20:30.684912 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/16-13:20:30.684913 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/16-13:20:30.684913 8651103744 Options.blob_file_starting_level: 0 -2023/08/16-13:20:30.684914 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/16-13:20:30.685608 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000045 succeeded,manifest_file_number is 45, next_file_number is 47, last_sequence is 8188, log_number is 37,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 37 -2023/08/16-13:20:30.685612 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 37 -2023/08/16-13:20:30.685779 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/16-13:20:30.685877 8651103744 EVENT_LOG_v1 {"time_micros": 1692159630685873, "job": 1, "event": "recovery_started", "wal_files": [44]} -2023/08/16-13:20:30.685879 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #44 mode 2 -2023/08/16-13:20:30.693511 8651103744 EVENT_LOG_v1 {"time_micros": 1692159630693494, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 48, "file_size": 343303, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 8190, "largest_seqno": 15570, "table_properties": {"data_size": 340031, "index_size": 8138, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 616714, "raw_average_key_size": 84, "raw_value_size": 287602, "raw_average_value_size": 39, "num_data_blocks": 152, "num_entries": 7267, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692159630, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "PA1CFVFNVWGPQ34A1TE2", "orig_file_number": 48, "seqno_to_time_mapping": "N/A"}} -2023/08/16-13:20:30.693569 8651103744 EVENT_LOG_v1 {"time_micros": 1692159630693568, "job": 1, "event": "recovery_finished"} -2023/08/16-13:20:30.693622 8651103744 [db/version_set.cc:5180] Creating manifest 50 -2023/08/16-13:20:30.694917 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000044.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-13:20:30.694943 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x1388060d0 -2023/08/16-13:20:30.694979 8651103744 DB pointer 0x139013000 -2023/08/16-13:20:30.695121 6128398336 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/16-13:20:30.695124 6128398336 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 2/0 611.61 KB 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 122.9 0.00 0.00 1 0.003 0 0 0.0 0.0 - L1 1/0 96.95 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 3/0 708.56 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 122.9 0.00 0.00 1 0.003 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 122.9 0.00 0.00 1 0.003 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 122.9 0.00 0.00 1 0.003 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 31.88 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 31.88 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x600003a040d8#85797 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 9e-06 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** -2023/08/16-13:22:46.654328 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work -2023/08/16-13:22:46.656079 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692160774841732 b/rust/hyperlane_db/LOG.old.1692160774841732 deleted file mode 100644 index 4df5a75de3..0000000000 --- a/rust/hyperlane_db/LOG.old.1692160774841732 +++ /dev/null @@ -1,286 +0,0 @@ -2023/08/16-13:38:17.661821 8651103744 RocksDB version: 8.1.1 -2023/08/16-13:38:17.662326 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/16-13:38:17.662328 8651103744 DB SUMMARY -2023/08/16-13:38:17.662329 8651103744 DB Session ID: EC7WX8I3OQ2Y35H4I3NP -2023/08/16-13:38:17.662370 8651103744 CURRENT file: CURRENT -2023/08/16-13:38:17.662371 8651103744 IDENTITY file: IDENTITY -2023/08/16-13:38:17.662381 8651103744 MANIFEST file: MANIFEST-000050 size: 679 Bytes -2023/08/16-13:38:17.662382 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 3, files: 000040.sst 000043.sst 000048.sst -2023/08/16-13:38:17.662383 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000049.log size: 883570 ; -2023/08/16-13:38:17.662384 8651103744 Options.error_if_exists: 0 -2023/08/16-13:38:17.662385 8651103744 Options.create_if_missing: 1 -2023/08/16-13:38:17.662386 8651103744 Options.paranoid_checks: 1 -2023/08/16-13:38:17.662386 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/16-13:38:17.662387 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/16-13:38:17.662388 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/16-13:38:17.662388 8651103744 Options.env: 0x1069e7848 -2023/08/16-13:38:17.662389 8651103744 Options.fs: PosixFileSystem -2023/08/16-13:38:17.662390 8651103744 Options.info_log: 0x137e05fb8 -2023/08/16-13:38:17.662391 8651103744 Options.max_file_opening_threads: 16 -2023/08/16-13:38:17.662392 8651103744 Options.statistics: 0x0 -2023/08/16-13:38:17.662392 8651103744 Options.use_fsync: 0 -2023/08/16-13:38:17.662393 8651103744 Options.max_log_file_size: 0 -2023/08/16-13:38:17.662394 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/16-13:38:17.662394 8651103744 Options.log_file_time_to_roll: 0 -2023/08/16-13:38:17.662395 8651103744 Options.keep_log_file_num: 1000 -2023/08/16-13:38:17.662395 8651103744 Options.recycle_log_file_num: 0 -2023/08/16-13:38:17.662396 8651103744 Options.allow_fallocate: 1 -2023/08/16-13:38:17.662397 8651103744 Options.allow_mmap_reads: 0 -2023/08/16-13:38:17.662397 8651103744 Options.allow_mmap_writes: 0 -2023/08/16-13:38:17.662398 8651103744 Options.use_direct_reads: 0 -2023/08/16-13:38:17.662399 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/16-13:38:17.662399 8651103744 Options.create_missing_column_families: 0 -2023/08/16-13:38:17.662400 8651103744 Options.db_log_dir: -2023/08/16-13:38:17.662400 8651103744 Options.wal_dir: -2023/08/16-13:38:17.662401 8651103744 Options.table_cache_numshardbits: 6 -2023/08/16-13:38:17.662402 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/16-13:38:17.662402 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/16-13:38:17.662403 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/16-13:38:17.662404 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/16-13:38:17.662404 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/16-13:38:17.662405 8651103744 Options.advise_random_on_open: 1 -2023/08/16-13:38:17.662406 8651103744 Options.db_write_buffer_size: 0 -2023/08/16-13:38:17.662406 8651103744 Options.write_buffer_manager: 0x6000026cc820 -2023/08/16-13:38:17.662407 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/16-13:38:17.662408 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/16-13:38:17.662408 8651103744 Options.use_adaptive_mutex: 0 -2023/08/16-13:38:17.662409 8651103744 Options.rate_limiter: 0x0 -2023/08/16-13:38:17.662410 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/16-13:38:17.662410 8651103744 Options.wal_recovery_mode: 2 -2023/08/16-13:38:17.662411 8651103744 Options.enable_thread_tracking: 0 -2023/08/16-13:38:17.662412 8651103744 Options.enable_pipelined_write: 0 -2023/08/16-13:38:17.662412 8651103744 Options.unordered_write: 0 -2023/08/16-13:38:17.662413 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/16-13:38:17.662413 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/16-13:38:17.662414 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/16-13:38:17.662415 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/16-13:38:17.662415 8651103744 Options.row_cache: None -2023/08/16-13:38:17.662416 8651103744 Options.wal_filter: None -2023/08/16-13:38:17.662417 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/16-13:38:17.662417 8651103744 Options.allow_ingest_behind: 0 -2023/08/16-13:38:17.662418 8651103744 Options.two_write_queues: 0 -2023/08/16-13:38:17.662419 8651103744 Options.manual_wal_flush: 0 -2023/08/16-13:38:17.662419 8651103744 Options.wal_compression: 0 -2023/08/16-13:38:17.662420 8651103744 Options.atomic_flush: 0 -2023/08/16-13:38:17.662420 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/16-13:38:17.662421 8651103744 Options.persist_stats_to_disk: 0 -2023/08/16-13:38:17.662422 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/16-13:38:17.662422 8651103744 Options.log_readahead_size: 0 -2023/08/16-13:38:17.662423 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/16-13:38:17.662424 8651103744 Options.best_efforts_recovery: 0 -2023/08/16-13:38:17.662424 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/16-13:38:17.662425 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/16-13:38:17.662426 8651103744 Options.allow_data_in_errors: 0 -2023/08/16-13:38:17.662426 8651103744 Options.db_host_id: __hostname__ -2023/08/16-13:38:17.662427 8651103744 Options.enforce_single_del_contracts: true -2023/08/16-13:38:17.662428 8651103744 Options.max_background_jobs: 2 -2023/08/16-13:38:17.662428 8651103744 Options.max_background_compactions: -1 -2023/08/16-13:38:17.662429 8651103744 Options.max_subcompactions: 1 -2023/08/16-13:38:17.662430 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/16-13:38:17.662430 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/16-13:38:17.662431 8651103744 Options.delayed_write_rate : 16777216 -2023/08/16-13:38:17.662432 8651103744 Options.max_total_wal_size: 0 -2023/08/16-13:38:17.662432 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/16-13:38:17.662433 8651103744 Options.stats_dump_period_sec: 600 -2023/08/16-13:38:17.662434 8651103744 Options.stats_persist_period_sec: 600 -2023/08/16-13:38:17.662434 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/16-13:38:17.662435 8651103744 Options.max_open_files: -1 -2023/08/16-13:38:17.662436 8651103744 Options.bytes_per_sync: 0 -2023/08/16-13:38:17.662436 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/16-13:38:17.662437 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/16-13:38:17.662437 8651103744 Options.compaction_readahead_size: 0 -2023/08/16-13:38:17.662438 8651103744 Options.max_background_flushes: -1 -2023/08/16-13:38:17.662439 8651103744 Compression algorithms supported: -2023/08/16-13:38:17.662456 8651103744 kZSTD supported: 1 -2023/08/16-13:38:17.662456 8651103744 kZlibCompression supported: 1 -2023/08/16-13:38:17.662457 8651103744 kXpressCompression supported: 0 -2023/08/16-13:38:17.662458 8651103744 kSnappyCompression supported: 1 -2023/08/16-13:38:17.662458 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/16-13:38:17.662459 8651103744 kLZ4HCCompression supported: 1 -2023/08/16-13:38:17.662460 8651103744 kLZ4Compression supported: 1 -2023/08/16-13:38:17.662460 8651103744 kBZip2Compression supported: 1 -2023/08/16-13:38:17.662467 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/16-13:38:17.662468 8651103744 DMutex implementation: pthread_mutex_t -2023/08/16-13:38:17.662727 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000050 -2023/08/16-13:38:17.662808 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/16-13:38:17.662810 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/16-13:38:17.662810 8651103744 Options.merge_operator: None -2023/08/16-13:38:17.662811 8651103744 Options.compaction_filter: None -2023/08/16-13:38:17.662812 8651103744 Options.compaction_filter_factory: None -2023/08/16-13:38:17.662812 8651103744 Options.sst_partitioner_factory: None -2023/08/16-13:38:17.662813 8651103744 Options.memtable_factory: SkipListFactory -2023/08/16-13:38:17.662814 8651103744 Options.table_factory: BlockBasedTable -2023/08/16-13:38:17.662825 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600001dc2300) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000028cc0d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/16-13:38:17.662826 8651103744 Options.write_buffer_size: 67108864 -2023/08/16-13:38:17.662827 8651103744 Options.max_write_buffer_number: 2 -2023/08/16-13:38:17.662828 8651103744 Options.compression: Snappy -2023/08/16-13:38:17.662829 8651103744 Options.bottommost_compression: Disabled -2023/08/16-13:38:17.662829 8651103744 Options.prefix_extractor: nullptr -2023/08/16-13:38:17.662830 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/16-13:38:17.662831 8651103744 Options.num_levels: 7 -2023/08/16-13:38:17.662831 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/16-13:38:17.662832 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/16-13:38:17.662833 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/16-13:38:17.662833 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/16-13:38:17.662834 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/16-13:38:17.662835 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/16-13:38:17.662836 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/16-13:38:17.662836 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/16-13:38:17.662837 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/16-13:38:17.662838 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/16-13:38:17.662838 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-13:38:17.662839 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/16-13:38:17.662839 8651103744 Options.compression_opts.window_bits: -14 -2023/08/16-13:38:17.662840 8651103744 Options.compression_opts.level: 32767 -2023/08/16-13:38:17.662841 8651103744 Options.compression_opts.strategy: 0 -2023/08/16-13:38:17.662841 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/16-13:38:17.662842 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/16-13:38:17.662843 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/16-13:38:17.662843 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/16-13:38:17.662844 8651103744 Options.compression_opts.enabled: false -2023/08/16-13:38:17.662845 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-13:38:17.662845 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/16-13:38:17.662846 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/16-13:38:17.662847 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/16-13:38:17.662847 8651103744 Options.target_file_size_base: 67108864 -2023/08/16-13:38:17.662848 8651103744 Options.target_file_size_multiplier: 1 -2023/08/16-13:38:17.662848 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/16-13:38:17.662849 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/16-13:38:17.662850 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/16-13:38:17.662851 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/16-13:38:17.662851 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/16-13:38:17.662852 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/16-13:38:17.662853 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/16-13:38:17.662853 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/16-13:38:17.662854 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/16-13:38:17.662855 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/16-13:38:17.662855 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/16-13:38:17.662856 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/16-13:38:17.662856 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/16-13:38:17.662857 8651103744 Options.arena_block_size: 1048576 -2023/08/16-13:38:17.662858 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/16-13:38:17.662858 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/16-13:38:17.662859 8651103744 Options.disable_auto_compactions: 0 -2023/08/16-13:38:17.662860 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/16-13:38:17.662861 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/16-13:38:17.662861 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/16-13:38:17.662862 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/16-13:38:17.662862 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/16-13:38:17.662863 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/16-13:38:17.662864 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/16-13:38:17.662866 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/16-13:38:17.662867 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/16-13:38:17.662867 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/16-13:38:17.662868 8651103744 Options.table_properties_collectors: -2023/08/16-13:38:17.662869 8651103744 Options.inplace_update_support: 0 -2023/08/16-13:38:17.662870 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/16-13:38:17.662870 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/16-13:38:17.662871 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/16-13:38:17.662872 8651103744 Options.memtable_huge_page_size: 0 -2023/08/16-13:38:17.662872 8651103744 Options.bloom_locality: 0 -2023/08/16-13:38:17.662873 8651103744 Options.max_successive_merges: 0 -2023/08/16-13:38:17.662874 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/16-13:38:17.662874 8651103744 Options.paranoid_file_checks: 0 -2023/08/16-13:38:17.662875 8651103744 Options.force_consistency_checks: 1 -2023/08/16-13:38:17.662875 8651103744 Options.report_bg_io_stats: 0 -2023/08/16-13:38:17.662876 8651103744 Options.ttl: 2592000 -2023/08/16-13:38:17.662877 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/16-13:38:17.662877 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/16-13:38:17.662878 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/16-13:38:17.662879 8651103744 Options.enable_blob_files: false -2023/08/16-13:38:17.662879 8651103744 Options.min_blob_size: 0 -2023/08/16-13:38:17.662880 8651103744 Options.blob_file_size: 268435456 -2023/08/16-13:38:17.662881 8651103744 Options.blob_compression_type: NoCompression -2023/08/16-13:38:17.662881 8651103744 Options.enable_blob_garbage_collection: false -2023/08/16-13:38:17.662882 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/16-13:38:17.662884 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/16-13:38:17.662885 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/16-13:38:17.662887 8651103744 Options.blob_file_starting_level: 0 -2023/08/16-13:38:17.662888 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/16-13:38:17.663744 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000050 succeeded,manifest_file_number is 50, next_file_number is 52, last_sequence is 15570, log_number is 45,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 45 -2023/08/16-13:38:17.663747 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 45 -2023/08/16-13:38:17.663902 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/16-13:38:17.664002 8651103744 EVENT_LOG_v1 {"time_micros": 1692160697663996, "job": 1, "event": "recovery_started", "wal_files": [49]} -2023/08/16-13:38:17.664004 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #49 mode 2 -2023/08/16-13:38:17.674399 8651103744 EVENT_LOG_v1 {"time_micros": 1692160697674381, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 53, "file_size": 303816, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 15572, "largest_seqno": 22198, "table_properties": {"data_size": 300802, "index_size": 6696, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 499764, "raw_average_key_size": 79, "raw_value_size": 273170, "raw_average_value_size": 43, "num_data_blocks": 134, "num_entries": 6297, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692160697, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "EC7WX8I3OQ2Y35H4I3NP", "orig_file_number": 53, "seqno_to_time_mapping": "N/A"}} -2023/08/16-13:38:17.674452 8651103744 EVENT_LOG_v1 {"time_micros": 1692160697674451, "job": 1, "event": "recovery_finished"} -2023/08/16-13:38:17.674509 8651103744 [db/version_set.cc:5180] Creating manifest 55 -2023/08/16-13:38:17.676273 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000049.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-13:38:17.676310 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x137e06110 -2023/08/16-13:38:17.676370 8651103744 DB pointer 0x14000c800 -2023/08/16-13:38:17.676591 6098890752 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/16-13:38:17.676595 6098890752 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 3/0 908.30 KB 0.8 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 71.5 0.00 0.00 1 0.004 0 0 0.0 0.0 - L1 1/0 96.95 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 4/0 1005.26 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 71.5 0.00 0.00 1 0.004 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 71.5 0.00 0.00 1 0.004 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 71.5 0.00 0.00 1 0.004 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 21.05 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 21.05 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000028cc0d8#86268 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 1.3e-05 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692167576188502 b/rust/hyperlane_db/LOG.old.1692167576188502 deleted file mode 100644 index 145d3bc61c..0000000000 --- a/rust/hyperlane_db/LOG.old.1692167576188502 +++ /dev/null @@ -1,304 +0,0 @@ -2023/08/16-13:39:34.842204 8651103744 RocksDB version: 8.1.1 -2023/08/16-13:39:34.842822 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/16-13:39:34.842825 8651103744 DB SUMMARY -2023/08/16-13:39:34.842826 8651103744 DB Session ID: FP2AZWSQ1JJHZXJB6S98 -2023/08/16-13:39:34.842881 8651103744 CURRENT file: CURRENT -2023/08/16-13:39:34.842883 8651103744 IDENTITY file: IDENTITY -2023/08/16-13:39:34.842896 8651103744 MANIFEST file: MANIFEST-000055 size: 869 Bytes -2023/08/16-13:39:34.842897 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 4, files: 000040.sst 000043.sst 000048.sst 000053.sst -2023/08/16-13:39:34.842899 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000054.log size: 5198 ; -2023/08/16-13:39:34.842900 8651103744 Options.error_if_exists: 0 -2023/08/16-13:39:34.842901 8651103744 Options.create_if_missing: 1 -2023/08/16-13:39:34.842902 8651103744 Options.paranoid_checks: 1 -2023/08/16-13:39:34.842903 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/16-13:39:34.842904 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/16-13:39:34.842905 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/16-13:39:34.842906 8651103744 Options.env: 0x105237848 -2023/08/16-13:39:34.842907 8651103744 Options.fs: PosixFileSystem -2023/08/16-13:39:34.842908 8651103744 Options.info_log: 0x139e0aa28 -2023/08/16-13:39:34.842909 8651103744 Options.max_file_opening_threads: 16 -2023/08/16-13:39:34.842910 8651103744 Options.statistics: 0x0 -2023/08/16-13:39:34.842911 8651103744 Options.use_fsync: 0 -2023/08/16-13:39:34.842912 8651103744 Options.max_log_file_size: 0 -2023/08/16-13:39:34.842913 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/16-13:39:34.842913 8651103744 Options.log_file_time_to_roll: 0 -2023/08/16-13:39:34.842914 8651103744 Options.keep_log_file_num: 1000 -2023/08/16-13:39:34.842915 8651103744 Options.recycle_log_file_num: 0 -2023/08/16-13:39:34.842916 8651103744 Options.allow_fallocate: 1 -2023/08/16-13:39:34.842917 8651103744 Options.allow_mmap_reads: 0 -2023/08/16-13:39:34.842918 8651103744 Options.allow_mmap_writes: 0 -2023/08/16-13:39:34.842918 8651103744 Options.use_direct_reads: 0 -2023/08/16-13:39:34.842919 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/16-13:39:34.842920 8651103744 Options.create_missing_column_families: 0 -2023/08/16-13:39:34.842921 8651103744 Options.db_log_dir: -2023/08/16-13:39:34.842922 8651103744 Options.wal_dir: -2023/08/16-13:39:34.842923 8651103744 Options.table_cache_numshardbits: 6 -2023/08/16-13:39:34.842924 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/16-13:39:34.842924 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/16-13:39:34.842925 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/16-13:39:34.842926 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/16-13:39:34.842927 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/16-13:39:34.842928 8651103744 Options.advise_random_on_open: 1 -2023/08/16-13:39:34.842929 8651103744 Options.db_write_buffer_size: 0 -2023/08/16-13:39:34.842930 8651103744 Options.write_buffer_manager: 0x600000fd1380 -2023/08/16-13:39:34.842931 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/16-13:39:34.842931 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/16-13:39:34.842932 8651103744 Options.use_adaptive_mutex: 0 -2023/08/16-13:39:34.842933 8651103744 Options.rate_limiter: 0x0 -2023/08/16-13:39:34.842934 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/16-13:39:34.842935 8651103744 Options.wal_recovery_mode: 2 -2023/08/16-13:39:34.842936 8651103744 Options.enable_thread_tracking: 0 -2023/08/16-13:39:34.842937 8651103744 Options.enable_pipelined_write: 0 -2023/08/16-13:39:34.842938 8651103744 Options.unordered_write: 0 -2023/08/16-13:39:34.842938 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/16-13:39:34.842939 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/16-13:39:34.842940 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/16-13:39:34.842941 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/16-13:39:34.842942 8651103744 Options.row_cache: None -2023/08/16-13:39:34.842943 8651103744 Options.wal_filter: None -2023/08/16-13:39:34.842944 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/16-13:39:34.842944 8651103744 Options.allow_ingest_behind: 0 -2023/08/16-13:39:34.842945 8651103744 Options.two_write_queues: 0 -2023/08/16-13:39:34.842946 8651103744 Options.manual_wal_flush: 0 -2023/08/16-13:39:34.842947 8651103744 Options.wal_compression: 0 -2023/08/16-13:39:34.842948 8651103744 Options.atomic_flush: 0 -2023/08/16-13:39:34.842949 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/16-13:39:34.842950 8651103744 Options.persist_stats_to_disk: 0 -2023/08/16-13:39:34.842951 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/16-13:39:34.842951 8651103744 Options.log_readahead_size: 0 -2023/08/16-13:39:34.842952 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/16-13:39:34.842953 8651103744 Options.best_efforts_recovery: 0 -2023/08/16-13:39:34.842954 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/16-13:39:34.842955 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/16-13:39:34.842956 8651103744 Options.allow_data_in_errors: 0 -2023/08/16-13:39:34.842957 8651103744 Options.db_host_id: __hostname__ -2023/08/16-13:39:34.842958 8651103744 Options.enforce_single_del_contracts: true -2023/08/16-13:39:34.842958 8651103744 Options.max_background_jobs: 2 -2023/08/16-13:39:34.842959 8651103744 Options.max_background_compactions: -1 -2023/08/16-13:39:34.842960 8651103744 Options.max_subcompactions: 1 -2023/08/16-13:39:34.842961 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/16-13:39:34.842962 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/16-13:39:34.842963 8651103744 Options.delayed_write_rate : 16777216 -2023/08/16-13:39:34.842964 8651103744 Options.max_total_wal_size: 0 -2023/08/16-13:39:34.842964 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/16-13:39:34.842965 8651103744 Options.stats_dump_period_sec: 600 -2023/08/16-13:39:34.842966 8651103744 Options.stats_persist_period_sec: 600 -2023/08/16-13:39:34.842967 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/16-13:39:34.842968 8651103744 Options.max_open_files: -1 -2023/08/16-13:39:34.842969 8651103744 Options.bytes_per_sync: 0 -2023/08/16-13:39:34.842970 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/16-13:39:34.842971 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/16-13:39:34.842972 8651103744 Options.compaction_readahead_size: 0 -2023/08/16-13:39:34.842972 8651103744 Options.max_background_flushes: -1 -2023/08/16-13:39:34.842973 8651103744 Compression algorithms supported: -2023/08/16-13:39:34.842991 8651103744 kZSTD supported: 1 -2023/08/16-13:39:34.842992 8651103744 kZlibCompression supported: 1 -2023/08/16-13:39:34.842993 8651103744 kXpressCompression supported: 0 -2023/08/16-13:39:34.842994 8651103744 kSnappyCompression supported: 1 -2023/08/16-13:39:34.842995 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/16-13:39:34.842996 8651103744 kLZ4HCCompression supported: 1 -2023/08/16-13:39:34.842997 8651103744 kLZ4Compression supported: 1 -2023/08/16-13:39:34.842998 8651103744 kBZip2Compression supported: 1 -2023/08/16-13:39:34.843007 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/16-13:39:34.843008 8651103744 DMutex implementation: pthread_mutex_t -2023/08/16-13:39:34.843150 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000055 -2023/08/16-13:39:34.843244 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/16-13:39:34.843245 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/16-13:39:34.843246 8651103744 Options.merge_operator: None -2023/08/16-13:39:34.843247 8651103744 Options.compaction_filter: None -2023/08/16-13:39:34.843248 8651103744 Options.compaction_filter_factory: None -2023/08/16-13:39:34.843249 8651103744 Options.sst_partitioner_factory: None -2023/08/16-13:39:34.843250 8651103744 Options.memtable_factory: SkipListFactory -2023/08/16-13:39:34.843251 8651103744 Options.table_factory: BlockBasedTable -2023/08/16-13:39:34.843265 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x6000034dc640) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000001d06d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/16-13:39:34.843267 8651103744 Options.write_buffer_size: 67108864 -2023/08/16-13:39:34.843268 8651103744 Options.max_write_buffer_number: 2 -2023/08/16-13:39:34.843269 8651103744 Options.compression: Snappy -2023/08/16-13:39:34.843270 8651103744 Options.bottommost_compression: Disabled -2023/08/16-13:39:34.843271 8651103744 Options.prefix_extractor: nullptr -2023/08/16-13:39:34.843271 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/16-13:39:34.843272 8651103744 Options.num_levels: 7 -2023/08/16-13:39:34.843273 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/16-13:39:34.843274 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/16-13:39:34.843275 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/16-13:39:34.843276 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/16-13:39:34.843277 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/16-13:39:34.843278 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/16-13:39:34.843279 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/16-13:39:34.843280 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/16-13:39:34.843280 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/16-13:39:34.843281 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/16-13:39:34.843282 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-13:39:34.843283 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/16-13:39:34.843284 8651103744 Options.compression_opts.window_bits: -14 -2023/08/16-13:39:34.843285 8651103744 Options.compression_opts.level: 32767 -2023/08/16-13:39:34.843286 8651103744 Options.compression_opts.strategy: 0 -2023/08/16-13:39:34.843287 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/16-13:39:34.843287 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/16-13:39:34.843288 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/16-13:39:34.843289 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/16-13:39:34.843290 8651103744 Options.compression_opts.enabled: false -2023/08/16-13:39:34.843291 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-13:39:34.843292 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/16-13:39:34.843293 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/16-13:39:34.843294 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/16-13:39:34.843294 8651103744 Options.target_file_size_base: 67108864 -2023/08/16-13:39:34.843295 8651103744 Options.target_file_size_multiplier: 1 -2023/08/16-13:39:34.843296 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/16-13:39:34.843297 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/16-13:39:34.843298 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/16-13:39:34.843299 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/16-13:39:34.843300 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/16-13:39:34.843301 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/16-13:39:34.843302 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/16-13:39:34.843303 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/16-13:39:34.843304 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/16-13:39:34.843305 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/16-13:39:34.843305 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/16-13:39:34.843306 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/16-13:39:34.843307 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/16-13:39:34.843308 8651103744 Options.arena_block_size: 1048576 -2023/08/16-13:39:34.843309 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/16-13:39:34.843310 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/16-13:39:34.843311 8651103744 Options.disable_auto_compactions: 0 -2023/08/16-13:39:34.843312 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/16-13:39:34.843313 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/16-13:39:34.843314 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/16-13:39:34.843315 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/16-13:39:34.843315 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/16-13:39:34.843316 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/16-13:39:34.843317 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/16-13:39:34.843320 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/16-13:39:34.843321 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/16-13:39:34.843322 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/16-13:39:34.843323 8651103744 Options.table_properties_collectors: -2023/08/16-13:39:34.843324 8651103744 Options.inplace_update_support: 0 -2023/08/16-13:39:34.843325 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/16-13:39:34.843326 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/16-13:39:34.843327 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/16-13:39:34.843327 8651103744 Options.memtable_huge_page_size: 0 -2023/08/16-13:39:34.843328 8651103744 Options.bloom_locality: 0 -2023/08/16-13:39:34.843329 8651103744 Options.max_successive_merges: 0 -2023/08/16-13:39:34.843330 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/16-13:39:34.843331 8651103744 Options.paranoid_file_checks: 0 -2023/08/16-13:39:34.843332 8651103744 Options.force_consistency_checks: 1 -2023/08/16-13:39:34.843333 8651103744 Options.report_bg_io_stats: 0 -2023/08/16-13:39:34.843333 8651103744 Options.ttl: 2592000 -2023/08/16-13:39:34.843334 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/16-13:39:34.843335 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/16-13:39:34.843336 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/16-13:39:34.843337 8651103744 Options.enable_blob_files: false -2023/08/16-13:39:34.843338 8651103744 Options.min_blob_size: 0 -2023/08/16-13:39:34.843339 8651103744 Options.blob_file_size: 268435456 -2023/08/16-13:39:34.843340 8651103744 Options.blob_compression_type: NoCompression -2023/08/16-13:39:34.843340 8651103744 Options.enable_blob_garbage_collection: false -2023/08/16-13:39:34.843341 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/16-13:39:34.843342 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/16-13:39:34.843343 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/16-13:39:34.843344 8651103744 Options.blob_file_starting_level: 0 -2023/08/16-13:39:34.843345 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/16-13:39:34.844386 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000055 succeeded,manifest_file_number is 55, next_file_number is 57, last_sequence is 22198, log_number is 50,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 50 -2023/08/16-13:39:34.844390 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 50 -2023/08/16-13:39:34.844443 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/16-13:39:34.844557 8651103744 EVENT_LOG_v1 {"time_micros": 1692160774844552, "job": 1, "event": "recovery_started", "wal_files": [54]} -2023/08/16-13:39:34.844559 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #54 mode 2 -2023/08/16-13:39:34.845036 8651103744 EVENT_LOG_v1 {"time_micros": 1692160774845022, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 58, "file_size": 2561, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 22199, "largest_seqno": 22228, "table_properties": {"data_size": 1522, "index_size": 91, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 1360, "raw_average_key_size": 45, "raw_value_size": 3414, "raw_average_value_size": 113, "num_data_blocks": 2, "num_entries": 30, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692160774, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "FP2AZWSQ1JJHZXJB6S98", "orig_file_number": 58, "seqno_to_time_mapping": "N/A"}} -2023/08/16-13:39:34.845082 8651103744 EVENT_LOG_v1 {"time_micros": 1692160774845081, "job": 1, "event": "recovery_finished"} -2023/08/16-13:39:34.845124 8651103744 [db/version_set.cc:5180] Creating manifest 60 -2023/08/16-13:39:34.846264 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000054.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-13:39:34.846294 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x139e0ab80 -2023/08/16-13:39:34.846328 8651103744 DB pointer 0x13a021400 -2023/08/16-13:39:34.846376 6122582016 [db/compaction/compaction_job.cc:1988] [default] [JOB 3] Compacting 4@0 + 1@1 files to L1, score 1.00 -2023/08/16-13:39:34.846380 6122582016 [db/compaction/compaction_job.cc:1992] [default]: Compaction start summary: Base version 2 Base level 0, inputs: [58(2561B) 53(296KB) 48(335KB) 43(276KB)], [40(96KB)] -2023/08/16-13:39:34.846387 6122582016 EVENT_LOG_v1 {"time_micros": 1692160774846382, "job": 3, "event": "compaction_started", "compaction_reason": "LevelL0FilesNum", "files_L0": [58, 53, 48, 43], "files_L1": [40], "score": 1, "input_data_size": 1031944, "oldest_snapshot_seqno": -1} -2023/08/16-13:39:34.846482 6123728896 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/16-13:39:34.846504 6123728896 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 4/4 910.80 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 5.8 0.00 0.00 1 0.000 0 0 0.0 0.0 - L1 1/1 96.95 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 5/5 1007.76 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 5.8 0.00 0.00 1 0.000 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 5.8 0.00 0.00 1 0.000 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.8 0.00 0.00 1 0.000 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 0.76 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 0.76 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000001d06d8#86352 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 7e-06 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(2,4.02 KB,0.0490427%) - -** File Read Latency Histogram By Level [default] ** -2023/08/16-13:39:34.857837 6122582016 [db/compaction/compaction_job.cc:1592] [default] [JOB 3] Generated table #63: 21468 keys, 996541 bytes, temperature: kUnknown -2023/08/16-13:39:34.857866 6122582016 EVENT_LOG_v1 {"time_micros": 1692160774857846, "cf_name": "default", "job": 3, "event": "table_file_creation", "file_number": 63, "file_size": 996541, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 0, "largest_seqno": 0, "table_properties": {"data_size": 988913, "index_size": 23770, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 1775046, "raw_average_key_size": 82, "raw_value_size": 917769, "raw_average_value_size": 42, "num_data_blocks": 459, "num_entries": 21468, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692109142, "oldest_key_time": 0, "file_creation_time": 1692160774, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "FP2AZWSQ1JJHZXJB6S98", "orig_file_number": 63, "seqno_to_time_mapping": "N/A"}} -2023/08/16-13:39:34.858091 6122582016 (Original Log Time 2023/08/16-13:39:34.857980) [db/compaction/compaction_job.cc:1663] [default] [JOB 3] Compacted 4@0 + 1@1 files to L1 => 996541 bytes -2023/08/16-13:39:34.858092 6122582016 (Original Log Time 2023/08/16-13:39:34.858064) [db/compaction/compaction_job.cc:885] [default] compacted to: files[0 1 0 0 0 0 0] max score 0.00, MB/sec: 89.6 rd, 86.5 wr, level 1, files in(4, 1) out(1 +0 blob) MB in(0.9, 0.1 +0.0 blob) out(1.0 +0.0 blob), read-write-amplify(2.2) write-amplify(1.1) OK, records in: 21471, records dropped: 3 output_compression: Snappy -2023/08/16-13:39:34.858094 6122582016 (Original Log Time 2023/08/16-13:39:34.858077) EVENT_LOG_v1 {"time_micros": 1692160774858068, "job": 3, "event": "compaction_finished", "compaction_time_micros": 11515, "compaction_time_cpu_micros": 11302, "output_level": 1, "num_output_files": 1, "total_output_size": 996541, "num_input_records": 21471, "num_output_records": 21468, "num_subcompactions": 1, "output_compression": "Snappy", "num_single_delete_mismatches": 0, "num_single_delete_fallthrough": 0, "lsm_state": [0, 1, 0, 0, 0, 0, 0]} -2023/08/16-13:39:34.858163 6122582016 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000058.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-13:39:34.858167 6122582016 EVENT_LOG_v1 {"time_micros": 1692160774858165, "job": 3, "event": "table_file_deletion", "file_number": 58} -2023/08/16-13:39:34.858215 6122582016 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000053.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-13:39:34.858218 6122582016 EVENT_LOG_v1 {"time_micros": 1692160774858217, "job": 3, "event": "table_file_deletion", "file_number": 53} -2023/08/16-13:39:34.858268 6122582016 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000048.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-13:39:34.858271 6122582016 EVENT_LOG_v1 {"time_micros": 1692160774858270, "job": 3, "event": "table_file_deletion", "file_number": 48} -2023/08/16-13:39:34.858334 6122582016 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000043.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-13:39:34.858337 6122582016 EVENT_LOG_v1 {"time_micros": 1692160774858336, "job": 3, "event": "table_file_deletion", "file_number": 43} -2023/08/16-13:39:34.858393 6122582016 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000040.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-13:39:34.858395 6122582016 EVENT_LOG_v1 {"time_micros": 1692160774858394, "job": 3, "event": "table_file_deletion", "file_number": 40} diff --git a/rust/hyperlane_db/LOG.old.1692167598179047 b/rust/hyperlane_db/LOG.old.1692167598179047 deleted file mode 100644 index a8420430db..0000000000 --- a/rust/hyperlane_db/LOG.old.1692167598179047 +++ /dev/null @@ -1,286 +0,0 @@ -2023/08/16-15:32:56.189487 8651103744 RocksDB version: 8.1.1 -2023/08/16-15:32:56.190192 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/16-15:32:56.190193 8651103744 DB SUMMARY -2023/08/16-15:32:56.190194 8651103744 DB Session ID: IQCSHTAF38O84JGOUP5W -2023/08/16-15:32:56.190231 8651103744 CURRENT file: CURRENT -2023/08/16-15:32:56.190232 8651103744 IDENTITY file: IDENTITY -2023/08/16-15:32:56.190241 8651103744 MANIFEST file: MANIFEST-000060 size: 1256 Bytes -2023/08/16-15:32:56.190242 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 1, files: 000063.sst -2023/08/16-15:32:56.190243 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000059.log size: 7342 ; -2023/08/16-15:32:56.190244 8651103744 Options.error_if_exists: 0 -2023/08/16-15:32:56.190245 8651103744 Options.create_if_missing: 1 -2023/08/16-15:32:56.190246 8651103744 Options.paranoid_checks: 1 -2023/08/16-15:32:56.190246 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/16-15:32:56.190247 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/16-15:32:56.190248 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/16-15:32:56.190248 8651103744 Options.env: 0x1066a3858 -2023/08/16-15:32:56.190249 8651103744 Options.fs: PosixFileSystem -2023/08/16-15:32:56.190250 8651103744 Options.info_log: 0x12e709528 -2023/08/16-15:32:56.190250 8651103744 Options.max_file_opening_threads: 16 -2023/08/16-15:32:56.190251 8651103744 Options.statistics: 0x0 -2023/08/16-15:32:56.190252 8651103744 Options.use_fsync: 0 -2023/08/16-15:32:56.190252 8651103744 Options.max_log_file_size: 0 -2023/08/16-15:32:56.190253 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/16-15:32:56.190253 8651103744 Options.log_file_time_to_roll: 0 -2023/08/16-15:32:56.190254 8651103744 Options.keep_log_file_num: 1000 -2023/08/16-15:32:56.190255 8651103744 Options.recycle_log_file_num: 0 -2023/08/16-15:32:56.190255 8651103744 Options.allow_fallocate: 1 -2023/08/16-15:32:56.190256 8651103744 Options.allow_mmap_reads: 0 -2023/08/16-15:32:56.190256 8651103744 Options.allow_mmap_writes: 0 -2023/08/16-15:32:56.190257 8651103744 Options.use_direct_reads: 0 -2023/08/16-15:32:56.190257 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/16-15:32:56.190258 8651103744 Options.create_missing_column_families: 0 -2023/08/16-15:32:56.190259 8651103744 Options.db_log_dir: -2023/08/16-15:32:56.190259 8651103744 Options.wal_dir: -2023/08/16-15:32:56.190260 8651103744 Options.table_cache_numshardbits: 6 -2023/08/16-15:32:56.190260 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/16-15:32:56.190261 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/16-15:32:56.190262 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/16-15:32:56.190262 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/16-15:32:56.190263 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/16-15:32:56.190263 8651103744 Options.advise_random_on_open: 1 -2023/08/16-15:32:56.190264 8651103744 Options.db_write_buffer_size: 0 -2023/08/16-15:32:56.190264 8651103744 Options.write_buffer_manager: 0x600001894820 -2023/08/16-15:32:56.190265 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/16-15:32:56.190266 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/16-15:32:56.190266 8651103744 Options.use_adaptive_mutex: 0 -2023/08/16-15:32:56.190267 8651103744 Options.rate_limiter: 0x0 -2023/08/16-15:32:56.190268 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/16-15:32:56.190268 8651103744 Options.wal_recovery_mode: 2 -2023/08/16-15:32:56.190269 8651103744 Options.enable_thread_tracking: 0 -2023/08/16-15:32:56.190270 8651103744 Options.enable_pipelined_write: 0 -2023/08/16-15:32:56.190270 8651103744 Options.unordered_write: 0 -2023/08/16-15:32:56.190271 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/16-15:32:56.190271 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/16-15:32:56.190272 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/16-15:32:56.190272 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/16-15:32:56.190273 8651103744 Options.row_cache: None -2023/08/16-15:32:56.190274 8651103744 Options.wal_filter: None -2023/08/16-15:32:56.190274 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/16-15:32:56.190275 8651103744 Options.allow_ingest_behind: 0 -2023/08/16-15:32:56.190275 8651103744 Options.two_write_queues: 0 -2023/08/16-15:32:56.190276 8651103744 Options.manual_wal_flush: 0 -2023/08/16-15:32:56.190277 8651103744 Options.wal_compression: 0 -2023/08/16-15:32:56.190277 8651103744 Options.atomic_flush: 0 -2023/08/16-15:32:56.190278 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/16-15:32:56.190278 8651103744 Options.persist_stats_to_disk: 0 -2023/08/16-15:32:56.190279 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/16-15:32:56.190280 8651103744 Options.log_readahead_size: 0 -2023/08/16-15:32:56.190280 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/16-15:32:56.190281 8651103744 Options.best_efforts_recovery: 0 -2023/08/16-15:32:56.190282 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/16-15:32:56.190282 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/16-15:32:56.190283 8651103744 Options.allow_data_in_errors: 0 -2023/08/16-15:32:56.190283 8651103744 Options.db_host_id: __hostname__ -2023/08/16-15:32:56.190284 8651103744 Options.enforce_single_del_contracts: true -2023/08/16-15:32:56.190285 8651103744 Options.max_background_jobs: 2 -2023/08/16-15:32:56.190285 8651103744 Options.max_background_compactions: -1 -2023/08/16-15:32:56.190286 8651103744 Options.max_subcompactions: 1 -2023/08/16-15:32:56.190286 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/16-15:32:56.190287 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/16-15:32:56.190288 8651103744 Options.delayed_write_rate : 16777216 -2023/08/16-15:32:56.190288 8651103744 Options.max_total_wal_size: 0 -2023/08/16-15:32:56.190289 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/16-15:32:56.190289 8651103744 Options.stats_dump_period_sec: 600 -2023/08/16-15:32:56.190290 8651103744 Options.stats_persist_period_sec: 600 -2023/08/16-15:32:56.190291 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/16-15:32:56.190291 8651103744 Options.max_open_files: -1 -2023/08/16-15:32:56.190292 8651103744 Options.bytes_per_sync: 0 -2023/08/16-15:32:56.190292 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/16-15:32:56.190293 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/16-15:32:56.190294 8651103744 Options.compaction_readahead_size: 0 -2023/08/16-15:32:56.190294 8651103744 Options.max_background_flushes: -1 -2023/08/16-15:32:56.190295 8651103744 Compression algorithms supported: -2023/08/16-15:32:56.190308 8651103744 kZSTD supported: 1 -2023/08/16-15:32:56.190308 8651103744 kZlibCompression supported: 1 -2023/08/16-15:32:56.190309 8651103744 kXpressCompression supported: 0 -2023/08/16-15:32:56.190310 8651103744 kSnappyCompression supported: 1 -2023/08/16-15:32:56.190310 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/16-15:32:56.190311 8651103744 kLZ4HCCompression supported: 1 -2023/08/16-15:32:56.190311 8651103744 kLZ4Compression supported: 1 -2023/08/16-15:32:56.190312 8651103744 kBZip2Compression supported: 1 -2023/08/16-15:32:56.190319 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/16-15:32:56.190320 8651103744 DMutex implementation: pthread_mutex_t -2023/08/16-15:32:56.190580 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000060 -2023/08/16-15:32:56.190632 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/16-15:32:56.190634 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/16-15:32:56.190635 8651103744 Options.merge_operator: None -2023/08/16-15:32:56.190635 8651103744 Options.compaction_filter: None -2023/08/16-15:32:56.190636 8651103744 Options.compaction_filter_factory: None -2023/08/16-15:32:56.190636 8651103744 Options.sst_partitioner_factory: None -2023/08/16-15:32:56.190637 8651103744 Options.memtable_factory: SkipListFactory -2023/08/16-15:32:56.190638 8651103744 Options.table_factory: BlockBasedTable -2023/08/16-15:32:56.190650 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x60000239bbe0) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000016940d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/16-15:32:56.190651 8651103744 Options.write_buffer_size: 67108864 -2023/08/16-15:32:56.190652 8651103744 Options.max_write_buffer_number: 2 -2023/08/16-15:32:56.190653 8651103744 Options.compression: Snappy -2023/08/16-15:32:56.190653 8651103744 Options.bottommost_compression: Disabled -2023/08/16-15:32:56.190654 8651103744 Options.prefix_extractor: nullptr -2023/08/16-15:32:56.190655 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/16-15:32:56.190655 8651103744 Options.num_levels: 7 -2023/08/16-15:32:56.190656 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/16-15:32:56.190656 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/16-15:32:56.190657 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/16-15:32:56.190658 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/16-15:32:56.190658 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/16-15:32:56.190659 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/16-15:32:56.190660 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/16-15:32:56.190660 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/16-15:32:56.190661 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/16-15:32:56.190661 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/16-15:32:56.190662 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-15:32:56.190663 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/16-15:32:56.190663 8651103744 Options.compression_opts.window_bits: -14 -2023/08/16-15:32:56.190664 8651103744 Options.compression_opts.level: 32767 -2023/08/16-15:32:56.190664 8651103744 Options.compression_opts.strategy: 0 -2023/08/16-15:32:56.190665 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/16-15:32:56.190666 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/16-15:32:56.190666 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/16-15:32:56.190667 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/16-15:32:56.190667 8651103744 Options.compression_opts.enabled: false -2023/08/16-15:32:56.190668 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-15:32:56.190669 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/16-15:32:56.190669 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/16-15:32:56.190670 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/16-15:32:56.190670 8651103744 Options.target_file_size_base: 67108864 -2023/08/16-15:32:56.190671 8651103744 Options.target_file_size_multiplier: 1 -2023/08/16-15:32:56.190671 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/16-15:32:56.190672 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/16-15:32:56.190673 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/16-15:32:56.190673 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/16-15:32:56.190674 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/16-15:32:56.190675 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/16-15:32:56.190675 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/16-15:32:56.190676 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/16-15:32:56.190677 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/16-15:32:56.190677 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/16-15:32:56.190678 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/16-15:32:56.190678 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/16-15:32:56.190679 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/16-15:32:56.190680 8651103744 Options.arena_block_size: 1048576 -2023/08/16-15:32:56.190680 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/16-15:32:56.190681 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/16-15:32:56.190681 8651103744 Options.disable_auto_compactions: 0 -2023/08/16-15:32:56.190682 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/16-15:32:56.190683 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/16-15:32:56.190683 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/16-15:32:56.190684 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/16-15:32:56.190685 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/16-15:32:56.190685 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/16-15:32:56.190686 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/16-15:32:56.190688 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/16-15:32:56.190689 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/16-15:32:56.190689 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/16-15:32:56.190690 8651103744 Options.table_properties_collectors: -2023/08/16-15:32:56.190691 8651103744 Options.inplace_update_support: 0 -2023/08/16-15:32:56.190692 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/16-15:32:56.190692 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/16-15:32:56.190693 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/16-15:32:56.190693 8651103744 Options.memtable_huge_page_size: 0 -2023/08/16-15:32:56.190694 8651103744 Options.bloom_locality: 0 -2023/08/16-15:32:56.190695 8651103744 Options.max_successive_merges: 0 -2023/08/16-15:32:56.190695 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/16-15:32:56.190696 8651103744 Options.paranoid_file_checks: 0 -2023/08/16-15:32:56.190696 8651103744 Options.force_consistency_checks: 1 -2023/08/16-15:32:56.190697 8651103744 Options.report_bg_io_stats: 0 -2023/08/16-15:32:56.190698 8651103744 Options.ttl: 2592000 -2023/08/16-15:32:56.190698 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/16-15:32:56.190699 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/16-15:32:56.190699 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/16-15:32:56.190700 8651103744 Options.enable_blob_files: false -2023/08/16-15:32:56.190700 8651103744 Options.min_blob_size: 0 -2023/08/16-15:32:56.190701 8651103744 Options.blob_file_size: 268435456 -2023/08/16-15:32:56.190702 8651103744 Options.blob_compression_type: NoCompression -2023/08/16-15:32:56.190702 8651103744 Options.enable_blob_garbage_collection: false -2023/08/16-15:32:56.190703 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/16-15:32:56.190703 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/16-15:32:56.190704 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/16-15:32:56.190705 8651103744 Options.blob_file_starting_level: 0 -2023/08/16-15:32:56.190705 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/16-15:32:56.191511 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000060 succeeded,manifest_file_number is 60, next_file_number is 65, last_sequence is 22228, log_number is 55,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 55 -2023/08/16-15:32:56.191516 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 55 -2023/08/16-15:32:56.191737 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/16-15:32:56.191845 8651103744 EVENT_LOG_v1 {"time_micros": 1692167576191842, "job": 1, "event": "recovery_started", "wal_files": [59]} -2023/08/16-15:32:56.191847 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #59 mode 2 -2023/08/16-15:32:56.192334 8651103744 EVENT_LOG_v1 {"time_micros": 1692167576192318, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 66, "file_size": 3671, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 22229, "largest_seqno": 22300, "table_properties": {"data_size": 2632, "index_size": 91, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 3264, "raw_average_key_size": 45, "raw_value_size": 3068, "raw_average_value_size": 42, "num_data_blocks": 2, "num_entries": 72, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692167576, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "IQCSHTAF38O84JGOUP5W", "orig_file_number": 66, "seqno_to_time_mapping": "N/A"}} -2023/08/16-15:32:56.192394 8651103744 EVENT_LOG_v1 {"time_micros": 1692167576192392, "job": 1, "event": "recovery_finished"} -2023/08/16-15:32:56.192441 8651103744 [db/version_set.cc:5180] Creating manifest 68 -2023/08/16-15:32:56.193581 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000059.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-15:32:56.193592 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x12e709680 -2023/08/16-15:32:56.193624 8651103744 DB pointer 0x12f013a00 -2023/08/16-15:32:56.193825 6102315008 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/16-15:32:56.193827 6102315008 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 1/0 3.58 KB 0.2 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 11.7 0.00 0.00 1 0.000 0 0 0.0 0.0 - L1 1/0 973.18 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 2/0 976.77 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 11.7 0.00 0.00 1 0.000 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 11.7 0.00 0.00 1 0.000 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 11.7 0.00 0.00 1 0.000 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 1.10 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 1.10 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000016940d8#89908 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 7e-06 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692168714159548 b/rust/hyperlane_db/LOG.old.1692168714159548 deleted file mode 100644 index 27628c4470..0000000000 --- a/rust/hyperlane_db/LOG.old.1692168714159548 +++ /dev/null @@ -1,286 +0,0 @@ -2023/08/16-15:33:18.179489 8651103744 RocksDB version: 8.1.1 -2023/08/16-15:33:18.180102 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/16-15:33:18.180105 8651103744 DB SUMMARY -2023/08/16-15:33:18.180106 8651103744 DB Session ID: M874ML6HF1GIQZ6CP7AH -2023/08/16-15:33:18.180195 8651103744 CURRENT file: CURRENT -2023/08/16-15:33:18.180197 8651103744 IDENTITY file: IDENTITY -2023/08/16-15:33:18.180212 8651103744 MANIFEST file: MANIFEST-000068 size: 475 Bytes -2023/08/16-15:33:18.180214 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 2, files: 000063.sst 000066.sst -2023/08/16-15:33:18.180216 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000067.log size: 13792 ; -2023/08/16-15:33:18.180218 8651103744 Options.error_if_exists: 0 -2023/08/16-15:33:18.180219 8651103744 Options.create_if_missing: 1 -2023/08/16-15:33:18.180220 8651103744 Options.paranoid_checks: 1 -2023/08/16-15:33:18.180221 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/16-15:33:18.180222 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/16-15:33:18.180223 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/16-15:33:18.180224 8651103744 Options.env: 0x106647858 -2023/08/16-15:33:18.180225 8651103744 Options.fs: PosixFileSystem -2023/08/16-15:33:18.180226 8651103744 Options.info_log: 0x131e0a708 -2023/08/16-15:33:18.180227 8651103744 Options.max_file_opening_threads: 16 -2023/08/16-15:33:18.180228 8651103744 Options.statistics: 0x0 -2023/08/16-15:33:18.180229 8651103744 Options.use_fsync: 0 -2023/08/16-15:33:18.180230 8651103744 Options.max_log_file_size: 0 -2023/08/16-15:33:18.180231 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/16-15:33:18.180233 8651103744 Options.log_file_time_to_roll: 0 -2023/08/16-15:33:18.180233 8651103744 Options.keep_log_file_num: 1000 -2023/08/16-15:33:18.180234 8651103744 Options.recycle_log_file_num: 0 -2023/08/16-15:33:18.180235 8651103744 Options.allow_fallocate: 1 -2023/08/16-15:33:18.180236 8651103744 Options.allow_mmap_reads: 0 -2023/08/16-15:33:18.180237 8651103744 Options.allow_mmap_writes: 0 -2023/08/16-15:33:18.180238 8651103744 Options.use_direct_reads: 0 -2023/08/16-15:33:18.180239 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/16-15:33:18.180240 8651103744 Options.create_missing_column_families: 0 -2023/08/16-15:33:18.180241 8651103744 Options.db_log_dir: -2023/08/16-15:33:18.180242 8651103744 Options.wal_dir: -2023/08/16-15:33:18.180243 8651103744 Options.table_cache_numshardbits: 6 -2023/08/16-15:33:18.180244 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/16-15:33:18.180245 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/16-15:33:18.180246 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/16-15:33:18.180247 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/16-15:33:18.180248 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/16-15:33:18.180249 8651103744 Options.advise_random_on_open: 1 -2023/08/16-15:33:18.180250 8651103744 Options.db_write_buffer_size: 0 -2023/08/16-15:33:18.180251 8651103744 Options.write_buffer_manager: 0x6000036d5380 -2023/08/16-15:33:18.180252 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/16-15:33:18.180253 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/16-15:33:18.180254 8651103744 Options.use_adaptive_mutex: 0 -2023/08/16-15:33:18.180255 8651103744 Options.rate_limiter: 0x0 -2023/08/16-15:33:18.180256 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/16-15:33:18.180257 8651103744 Options.wal_recovery_mode: 2 -2023/08/16-15:33:18.180258 8651103744 Options.enable_thread_tracking: 0 -2023/08/16-15:33:18.180259 8651103744 Options.enable_pipelined_write: 0 -2023/08/16-15:33:18.180260 8651103744 Options.unordered_write: 0 -2023/08/16-15:33:18.180261 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/16-15:33:18.180262 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/16-15:33:18.180262 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/16-15:33:18.180263 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/16-15:33:18.180264 8651103744 Options.row_cache: None -2023/08/16-15:33:18.180265 8651103744 Options.wal_filter: None -2023/08/16-15:33:18.180266 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/16-15:33:18.180267 8651103744 Options.allow_ingest_behind: 0 -2023/08/16-15:33:18.180268 8651103744 Options.two_write_queues: 0 -2023/08/16-15:33:18.180269 8651103744 Options.manual_wal_flush: 0 -2023/08/16-15:33:18.180270 8651103744 Options.wal_compression: 0 -2023/08/16-15:33:18.180271 8651103744 Options.atomic_flush: 0 -2023/08/16-15:33:18.180272 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/16-15:33:18.180273 8651103744 Options.persist_stats_to_disk: 0 -2023/08/16-15:33:18.180274 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/16-15:33:18.180275 8651103744 Options.log_readahead_size: 0 -2023/08/16-15:33:18.180276 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/16-15:33:18.180277 8651103744 Options.best_efforts_recovery: 0 -2023/08/16-15:33:18.180278 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/16-15:33:18.180279 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/16-15:33:18.180280 8651103744 Options.allow_data_in_errors: 0 -2023/08/16-15:33:18.180281 8651103744 Options.db_host_id: __hostname__ -2023/08/16-15:33:18.180282 8651103744 Options.enforce_single_del_contracts: true -2023/08/16-15:33:18.180283 8651103744 Options.max_background_jobs: 2 -2023/08/16-15:33:18.180284 8651103744 Options.max_background_compactions: -1 -2023/08/16-15:33:18.180285 8651103744 Options.max_subcompactions: 1 -2023/08/16-15:33:18.180286 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/16-15:33:18.180287 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/16-15:33:18.180288 8651103744 Options.delayed_write_rate : 16777216 -2023/08/16-15:33:18.180289 8651103744 Options.max_total_wal_size: 0 -2023/08/16-15:33:18.180290 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/16-15:33:18.180291 8651103744 Options.stats_dump_period_sec: 600 -2023/08/16-15:33:18.180292 8651103744 Options.stats_persist_period_sec: 600 -2023/08/16-15:33:18.180293 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/16-15:33:18.180294 8651103744 Options.max_open_files: -1 -2023/08/16-15:33:18.180295 8651103744 Options.bytes_per_sync: 0 -2023/08/16-15:33:18.180296 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/16-15:33:18.180297 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/16-15:33:18.180298 8651103744 Options.compaction_readahead_size: 0 -2023/08/16-15:33:18.180299 8651103744 Options.max_background_flushes: -1 -2023/08/16-15:33:18.180300 8651103744 Compression algorithms supported: -2023/08/16-15:33:18.180319 8651103744 kZSTD supported: 1 -2023/08/16-15:33:18.180321 8651103744 kZlibCompression supported: 1 -2023/08/16-15:33:18.180322 8651103744 kXpressCompression supported: 0 -2023/08/16-15:33:18.180323 8651103744 kSnappyCompression supported: 1 -2023/08/16-15:33:18.180324 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/16-15:33:18.180325 8651103744 kLZ4HCCompression supported: 1 -2023/08/16-15:33:18.180326 8651103744 kLZ4Compression supported: 1 -2023/08/16-15:33:18.180327 8651103744 kBZip2Compression supported: 1 -2023/08/16-15:33:18.180335 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/16-15:33:18.180336 8651103744 DMutex implementation: pthread_mutex_t -2023/08/16-15:33:18.180512 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000068 -2023/08/16-15:33:18.180579 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/16-15:33:18.180580 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/16-15:33:18.180582 8651103744 Options.merge_operator: None -2023/08/16-15:33:18.180583 8651103744 Options.compaction_filter: None -2023/08/16-15:33:18.180583 8651103744 Options.compaction_filter_factory: None -2023/08/16-15:33:18.180585 8651103744 Options.sst_partitioner_factory: None -2023/08/16-15:33:18.180586 8651103744 Options.memtable_factory: SkipListFactory -2023/08/16-15:33:18.180587 8651103744 Options.table_factory: BlockBasedTable -2023/08/16-15:33:18.180620 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600000dd8640) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000038d46d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/16-15:33:18.180624 8651103744 Options.write_buffer_size: 67108864 -2023/08/16-15:33:18.180625 8651103744 Options.max_write_buffer_number: 2 -2023/08/16-15:33:18.180626 8651103744 Options.compression: Snappy -2023/08/16-15:33:18.180627 8651103744 Options.bottommost_compression: Disabled -2023/08/16-15:33:18.180628 8651103744 Options.prefix_extractor: nullptr -2023/08/16-15:33:18.180629 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/16-15:33:18.180630 8651103744 Options.num_levels: 7 -2023/08/16-15:33:18.180631 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/16-15:33:18.180632 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/16-15:33:18.180633 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/16-15:33:18.180634 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/16-15:33:18.180635 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/16-15:33:18.180636 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/16-15:33:18.180637 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/16-15:33:18.180638 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/16-15:33:18.180639 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/16-15:33:18.180640 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/16-15:33:18.180641 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-15:33:18.180642 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/16-15:33:18.180643 8651103744 Options.compression_opts.window_bits: -14 -2023/08/16-15:33:18.180644 8651103744 Options.compression_opts.level: 32767 -2023/08/16-15:33:18.180645 8651103744 Options.compression_opts.strategy: 0 -2023/08/16-15:33:18.180646 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/16-15:33:18.180647 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/16-15:33:18.180648 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/16-15:33:18.180649 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/16-15:33:18.180650 8651103744 Options.compression_opts.enabled: false -2023/08/16-15:33:18.180651 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-15:33:18.180652 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/16-15:33:18.180653 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/16-15:33:18.180654 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/16-15:33:18.180655 8651103744 Options.target_file_size_base: 67108864 -2023/08/16-15:33:18.180656 8651103744 Options.target_file_size_multiplier: 1 -2023/08/16-15:33:18.180657 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/16-15:33:18.180658 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/16-15:33:18.180659 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/16-15:33:18.180660 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/16-15:33:18.180661 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/16-15:33:18.180662 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/16-15:33:18.180663 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/16-15:33:18.180664 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/16-15:33:18.180665 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/16-15:33:18.180666 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/16-15:33:18.180667 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/16-15:33:18.180668 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/16-15:33:18.180669 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/16-15:33:18.180670 8651103744 Options.arena_block_size: 1048576 -2023/08/16-15:33:18.180671 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/16-15:33:18.180672 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/16-15:33:18.180673 8651103744 Options.disable_auto_compactions: 0 -2023/08/16-15:33:18.180674 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/16-15:33:18.180675 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/16-15:33:18.180676 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/16-15:33:18.180677 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/16-15:33:18.180678 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/16-15:33:18.180679 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/16-15:33:18.180680 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/16-15:33:18.180683 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/16-15:33:18.180684 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/16-15:33:18.180685 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/16-15:33:18.180687 8651103744 Options.table_properties_collectors: -2023/08/16-15:33:18.180688 8651103744 Options.inplace_update_support: 0 -2023/08/16-15:33:18.180689 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/16-15:33:18.180690 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/16-15:33:18.180691 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/16-15:33:18.180692 8651103744 Options.memtable_huge_page_size: 0 -2023/08/16-15:33:18.180693 8651103744 Options.bloom_locality: 0 -2023/08/16-15:33:18.180694 8651103744 Options.max_successive_merges: 0 -2023/08/16-15:33:18.180695 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/16-15:33:18.180696 8651103744 Options.paranoid_file_checks: 0 -2023/08/16-15:33:18.180697 8651103744 Options.force_consistency_checks: 1 -2023/08/16-15:33:18.180698 8651103744 Options.report_bg_io_stats: 0 -2023/08/16-15:33:18.180699 8651103744 Options.ttl: 2592000 -2023/08/16-15:33:18.180700 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/16-15:33:18.180701 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/16-15:33:18.180702 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/16-15:33:18.180703 8651103744 Options.enable_blob_files: false -2023/08/16-15:33:18.180704 8651103744 Options.min_blob_size: 0 -2023/08/16-15:33:18.180705 8651103744 Options.blob_file_size: 268435456 -2023/08/16-15:33:18.180706 8651103744 Options.blob_compression_type: NoCompression -2023/08/16-15:33:18.180707 8651103744 Options.enable_blob_garbage_collection: false -2023/08/16-15:33:18.180708 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/16-15:33:18.180709 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/16-15:33:18.180710 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/16-15:33:18.180711 8651103744 Options.blob_file_starting_level: 0 -2023/08/16-15:33:18.180712 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/16-15:33:18.181424 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000068 succeeded,manifest_file_number is 68, next_file_number is 70, last_sequence is 22300, log_number is 60,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 60 -2023/08/16-15:33:18.181427 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 60 -2023/08/16-15:33:18.181481 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/16-15:33:18.181614 8651103744 EVENT_LOG_v1 {"time_micros": 1692167598181609, "job": 1, "event": "recovery_started", "wal_files": [67]} -2023/08/16-15:33:18.181616 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #67 mode 2 -2023/08/16-15:33:18.182197 8651103744 EVENT_LOG_v1 {"time_micros": 1692167598182182, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 71, "file_size": 6369, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 22301, "largest_seqno": 22432, "table_properties": {"data_size": 5317, "index_size": 123, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 5984, "raw_average_key_size": 45, "raw_value_size": 5956, "raw_average_value_size": 45, "num_data_blocks": 3, "num_entries": 132, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692167598, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "M874ML6HF1GIQZ6CP7AH", "orig_file_number": 71, "seqno_to_time_mapping": "N/A"}} -2023/08/16-15:33:18.182244 8651103744 EVENT_LOG_v1 {"time_micros": 1692167598182243, "job": 1, "event": "recovery_finished"} -2023/08/16-15:33:18.182285 8651103744 [db/version_set.cc:5180] Creating manifest 73 -2023/08/16-15:33:18.183350 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000067.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-15:33:18.183360 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x131e0ac70 -2023/08/16-15:33:18.183409 8651103744 DB pointer 0x132021400 -2023/08/16-15:33:18.183603 6102691840 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/16-15:33:18.183607 6102691840 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 2/0 9.80 KB 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 13.4 0.00 0.00 1 0.000 0 0 0.0 0.0 - L1 1/0 973.18 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 3/0 982.99 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 13.4 0.00 0.00 1 0.000 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 13.4 0.00 0.00 1 0.000 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 13.4 0.00 0.00 1 0.000 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 2.02 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 2.02 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000038d46d8#90767 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 1e-05 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692175657441236 b/rust/hyperlane_db/LOG.old.1692175657441236 deleted file mode 100644 index dd63f5406a..0000000000 --- a/rust/hyperlane_db/LOG.old.1692175657441236 +++ /dev/null @@ -1,286 +0,0 @@ -2023/08/16-15:51:54.160112 8651103744 RocksDB version: 8.1.1 -2023/08/16-15:51:54.160689 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/16-15:51:54.160691 8651103744 DB SUMMARY -2023/08/16-15:51:54.160693 8651103744 DB Session ID: RN9LFTYUUXHICJSMNSJK -2023/08/16-15:51:54.160763 8651103744 CURRENT file: CURRENT -2023/08/16-15:51:54.160764 8651103744 IDENTITY file: IDENTITY -2023/08/16-15:51:54.160778 8651103744 MANIFEST file: MANIFEST-000073 size: 641 Bytes -2023/08/16-15:51:54.160780 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 3, files: 000063.sst 000066.sst 000071.sst -2023/08/16-15:51:54.160781 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000072.log size: 16434 ; -2023/08/16-15:51:54.160783 8651103744 Options.error_if_exists: 0 -2023/08/16-15:51:54.160784 8651103744 Options.create_if_missing: 1 -2023/08/16-15:51:54.160785 8651103744 Options.paranoid_checks: 1 -2023/08/16-15:51:54.160786 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/16-15:51:54.160787 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/16-15:51:54.160788 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/16-15:51:54.160789 8651103744 Options.env: 0x1046a3858 -2023/08/16-15:51:54.160790 8651103744 Options.fs: PosixFileSystem -2023/08/16-15:51:54.160791 8651103744 Options.info_log: 0x1480060f8 -2023/08/16-15:51:54.160792 8651103744 Options.max_file_opening_threads: 16 -2023/08/16-15:51:54.160793 8651103744 Options.statistics: 0x0 -2023/08/16-15:51:54.160793 8651103744 Options.use_fsync: 0 -2023/08/16-15:51:54.160794 8651103744 Options.max_log_file_size: 0 -2023/08/16-15:51:54.160795 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/16-15:51:54.160796 8651103744 Options.log_file_time_to_roll: 0 -2023/08/16-15:51:54.160797 8651103744 Options.keep_log_file_num: 1000 -2023/08/16-15:51:54.160798 8651103744 Options.recycle_log_file_num: 0 -2023/08/16-15:51:54.160799 8651103744 Options.allow_fallocate: 1 -2023/08/16-15:51:54.160799 8651103744 Options.allow_mmap_reads: 0 -2023/08/16-15:51:54.160800 8651103744 Options.allow_mmap_writes: 0 -2023/08/16-15:51:54.160801 8651103744 Options.use_direct_reads: 0 -2023/08/16-15:51:54.160802 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/16-15:51:54.160803 8651103744 Options.create_missing_column_families: 0 -2023/08/16-15:51:54.160804 8651103744 Options.db_log_dir: -2023/08/16-15:51:54.160804 8651103744 Options.wal_dir: -2023/08/16-15:51:54.160805 8651103744 Options.table_cache_numshardbits: 6 -2023/08/16-15:51:54.160806 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/16-15:51:54.160807 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/16-15:51:54.160808 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/16-15:51:54.160809 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/16-15:51:54.160810 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/16-15:51:54.160810 8651103744 Options.advise_random_on_open: 1 -2023/08/16-15:51:54.160811 8651103744 Options.db_write_buffer_size: 0 -2023/08/16-15:51:54.160812 8651103744 Options.write_buffer_manager: 0x6000001fc820 -2023/08/16-15:51:54.160813 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/16-15:51:54.160814 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/16-15:51:54.160815 8651103744 Options.use_adaptive_mutex: 0 -2023/08/16-15:51:54.160815 8651103744 Options.rate_limiter: 0x0 -2023/08/16-15:51:54.160816 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/16-15:51:54.160817 8651103744 Options.wal_recovery_mode: 2 -2023/08/16-15:51:54.160818 8651103744 Options.enable_thread_tracking: 0 -2023/08/16-15:51:54.160819 8651103744 Options.enable_pipelined_write: 0 -2023/08/16-15:51:54.160820 8651103744 Options.unordered_write: 0 -2023/08/16-15:51:54.160821 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/16-15:51:54.160821 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/16-15:51:54.160822 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/16-15:51:54.160823 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/16-15:51:54.160824 8651103744 Options.row_cache: None -2023/08/16-15:51:54.160825 8651103744 Options.wal_filter: None -2023/08/16-15:51:54.160826 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/16-15:51:54.160827 8651103744 Options.allow_ingest_behind: 0 -2023/08/16-15:51:54.160827 8651103744 Options.two_write_queues: 0 -2023/08/16-15:51:54.160828 8651103744 Options.manual_wal_flush: 0 -2023/08/16-15:51:54.160829 8651103744 Options.wal_compression: 0 -2023/08/16-15:51:54.160830 8651103744 Options.atomic_flush: 0 -2023/08/16-15:51:54.160831 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/16-15:51:54.160832 8651103744 Options.persist_stats_to_disk: 0 -2023/08/16-15:51:54.160833 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/16-15:51:54.160833 8651103744 Options.log_readahead_size: 0 -2023/08/16-15:51:54.160834 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/16-15:51:54.160835 8651103744 Options.best_efforts_recovery: 0 -2023/08/16-15:51:54.160836 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/16-15:51:54.160837 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/16-15:51:54.160838 8651103744 Options.allow_data_in_errors: 0 -2023/08/16-15:51:54.160839 8651103744 Options.db_host_id: __hostname__ -2023/08/16-15:51:54.160840 8651103744 Options.enforce_single_del_contracts: true -2023/08/16-15:51:54.160841 8651103744 Options.max_background_jobs: 2 -2023/08/16-15:51:54.160841 8651103744 Options.max_background_compactions: -1 -2023/08/16-15:51:54.160842 8651103744 Options.max_subcompactions: 1 -2023/08/16-15:51:54.160843 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/16-15:51:54.160844 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/16-15:51:54.160845 8651103744 Options.delayed_write_rate : 16777216 -2023/08/16-15:51:54.160846 8651103744 Options.max_total_wal_size: 0 -2023/08/16-15:51:54.160847 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/16-15:51:54.160848 8651103744 Options.stats_dump_period_sec: 600 -2023/08/16-15:51:54.160848 8651103744 Options.stats_persist_period_sec: 600 -2023/08/16-15:51:54.160849 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/16-15:51:54.160850 8651103744 Options.max_open_files: -1 -2023/08/16-15:51:54.160851 8651103744 Options.bytes_per_sync: 0 -2023/08/16-15:51:54.160852 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/16-15:51:54.160853 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/16-15:51:54.160854 8651103744 Options.compaction_readahead_size: 0 -2023/08/16-15:51:54.160854 8651103744 Options.max_background_flushes: -1 -2023/08/16-15:51:54.160855 8651103744 Compression algorithms supported: -2023/08/16-15:51:54.160875 8651103744 kZSTD supported: 1 -2023/08/16-15:51:54.160876 8651103744 kZlibCompression supported: 1 -2023/08/16-15:51:54.160877 8651103744 kXpressCompression supported: 0 -2023/08/16-15:51:54.160878 8651103744 kSnappyCompression supported: 1 -2023/08/16-15:51:54.160879 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/16-15:51:54.160880 8651103744 kLZ4HCCompression supported: 1 -2023/08/16-15:51:54.160881 8651103744 kLZ4Compression supported: 1 -2023/08/16-15:51:54.160881 8651103744 kBZip2Compression supported: 1 -2023/08/16-15:51:54.160889 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/16-15:51:54.160890 8651103744 DMutex implementation: pthread_mutex_t -2023/08/16-15:51:54.161201 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000073 -2023/08/16-15:51:54.161261 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/16-15:51:54.161263 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/16-15:51:54.161263 8651103744 Options.merge_operator: None -2023/08/16-15:51:54.161264 8651103744 Options.compaction_filter: None -2023/08/16-15:51:54.161265 8651103744 Options.compaction_filter_factory: None -2023/08/16-15:51:54.161265 8651103744 Options.sst_partitioner_factory: None -2023/08/16-15:51:54.161266 8651103744 Options.memtable_factory: SkipListFactory -2023/08/16-15:51:54.161267 8651103744 Options.table_factory: BlockBasedTable -2023/08/16-15:51:54.161281 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600003af4080) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x600000ff00d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/16-15:51:54.161283 8651103744 Options.write_buffer_size: 67108864 -2023/08/16-15:51:54.161284 8651103744 Options.max_write_buffer_number: 2 -2023/08/16-15:51:54.161285 8651103744 Options.compression: Snappy -2023/08/16-15:51:54.161285 8651103744 Options.bottommost_compression: Disabled -2023/08/16-15:51:54.161286 8651103744 Options.prefix_extractor: nullptr -2023/08/16-15:51:54.161286 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/16-15:51:54.161287 8651103744 Options.num_levels: 7 -2023/08/16-15:51:54.161288 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/16-15:51:54.161288 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/16-15:51:54.161289 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/16-15:51:54.161289 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/16-15:51:54.161290 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/16-15:51:54.161291 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/16-15:51:54.161291 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/16-15:51:54.161292 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/16-15:51:54.161292 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/16-15:51:54.161293 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/16-15:51:54.161294 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-15:51:54.161294 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/16-15:51:54.161295 8651103744 Options.compression_opts.window_bits: -14 -2023/08/16-15:51:54.161295 8651103744 Options.compression_opts.level: 32767 -2023/08/16-15:51:54.161296 8651103744 Options.compression_opts.strategy: 0 -2023/08/16-15:51:54.161297 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/16-15:51:54.161297 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/16-15:51:54.161298 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/16-15:51:54.161298 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/16-15:51:54.161299 8651103744 Options.compression_opts.enabled: false -2023/08/16-15:51:54.161300 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-15:51:54.161300 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/16-15:51:54.161301 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/16-15:51:54.161301 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/16-15:51:54.161302 8651103744 Options.target_file_size_base: 67108864 -2023/08/16-15:51:54.161303 8651103744 Options.target_file_size_multiplier: 1 -2023/08/16-15:51:54.161303 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/16-15:51:54.161304 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/16-15:51:54.161304 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/16-15:51:54.161305 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/16-15:51:54.161306 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/16-15:51:54.161306 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/16-15:51:54.161307 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/16-15:51:54.161308 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/16-15:51:54.161308 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/16-15:51:54.161309 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/16-15:51:54.161309 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/16-15:51:54.161310 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/16-15:51:54.161311 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/16-15:51:54.161311 8651103744 Options.arena_block_size: 1048576 -2023/08/16-15:51:54.161312 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/16-15:51:54.161312 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/16-15:51:54.161313 8651103744 Options.disable_auto_compactions: 0 -2023/08/16-15:51:54.161314 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/16-15:51:54.161314 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/16-15:51:54.161315 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/16-15:51:54.161316 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/16-15:51:54.161316 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/16-15:51:54.161317 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/16-15:51:54.161317 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/16-15:51:54.161322 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/16-15:51:54.161322 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/16-15:51:54.161323 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/16-15:51:54.161324 8651103744 Options.table_properties_collectors: -2023/08/16-15:51:54.161325 8651103744 Options.inplace_update_support: 0 -2023/08/16-15:51:54.161325 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/16-15:51:54.161326 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/16-15:51:54.161326 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/16-15:51:54.161327 8651103744 Options.memtable_huge_page_size: 0 -2023/08/16-15:51:54.161328 8651103744 Options.bloom_locality: 0 -2023/08/16-15:51:54.161328 8651103744 Options.max_successive_merges: 0 -2023/08/16-15:51:54.161329 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/16-15:51:54.161329 8651103744 Options.paranoid_file_checks: 0 -2023/08/16-15:51:54.161330 8651103744 Options.force_consistency_checks: 1 -2023/08/16-15:51:54.161330 8651103744 Options.report_bg_io_stats: 0 -2023/08/16-15:51:54.161331 8651103744 Options.ttl: 2592000 -2023/08/16-15:51:54.161332 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/16-15:51:54.161332 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/16-15:51:54.161333 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/16-15:51:54.161333 8651103744 Options.enable_blob_files: false -2023/08/16-15:51:54.161334 8651103744 Options.min_blob_size: 0 -2023/08/16-15:51:54.161334 8651103744 Options.blob_file_size: 268435456 -2023/08/16-15:51:54.161335 8651103744 Options.blob_compression_type: NoCompression -2023/08/16-15:51:54.161336 8651103744 Options.enable_blob_garbage_collection: false -2023/08/16-15:51:54.161336 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/16-15:51:54.161337 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/16-15:51:54.161338 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/16-15:51:54.161338 8651103744 Options.blob_file_starting_level: 0 -2023/08/16-15:51:54.161339 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/16-15:51:54.161990 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000073 succeeded,manifest_file_number is 73, next_file_number is 75, last_sequence is 22432, log_number is 68,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 68 -2023/08/16-15:51:54.161993 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 68 -2023/08/16-15:51:54.162147 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/16-15:51:54.162244 8651103744 EVENT_LOG_v1 {"time_micros": 1692168714162238, "job": 1, "event": "recovery_started", "wal_files": [72]} -2023/08/16-15:51:54.162246 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #72 mode 2 -2023/08/16-15:51:54.162739 8651103744 EVENT_LOG_v1 {"time_micros": 1692168714162725, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 76, "file_size": 7203, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 22433, "largest_seqno": 22576, "table_properties": {"data_size": 6127, "index_size": 144, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 6528, "raw_average_key_size": 45, "raw_value_size": 7883, "raw_average_value_size": 54, "num_data_blocks": 3, "num_entries": 144, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692168714, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "RN9LFTYUUXHICJSMNSJK", "orig_file_number": 76, "seqno_to_time_mapping": "N/A"}} -2023/08/16-15:51:54.162789 8651103744 EVENT_LOG_v1 {"time_micros": 1692168714162788, "job": 1, "event": "recovery_finished"} -2023/08/16-15:51:54.162830 8651103744 [db/version_set.cc:5180] Creating manifest 78 -2023/08/16-15:51:54.164025 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000072.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-15:51:54.164037 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x136e04080 -2023/08/16-15:51:54.164080 8651103744 DB pointer 0x14880ba00 -2023/08/16-15:51:54.164268 6135869440 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/16-15:51:54.164368 6135869440 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 3/0 16.84 KB 0.8 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 22.8 0.00 0.00 1 0.000 0 0 0.0 0.0 - L1 1/0 973.18 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 4/0 990.02 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 22.8 0.00 0.00 1 0.000 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 22.8 0.00 0.00 1 0.000 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 22.8 0.00 0.00 1 0.000 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 2.30 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 2.30 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x600000ff00d8#90981 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 9e-06 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692176419380884 b/rust/hyperlane_db/LOG.old.1692176419380884 deleted file mode 100644 index 9891c8be44..0000000000 --- a/rust/hyperlane_db/LOG.old.1692176419380884 +++ /dev/null @@ -1,304 +0,0 @@ -2023/08/16-17:47:37.441977 8651103744 RocksDB version: 8.1.1 -2023/08/16-17:47:37.442496 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/16-17:47:37.442500 8651103744 DB SUMMARY -2023/08/16-17:47:37.442501 8651103744 DB Session ID: RT4ZNPS4LCILAPZ128XT -2023/08/16-17:47:37.442611 8651103744 CURRENT file: CURRENT -2023/08/16-17:47:37.442613 8651103744 IDENTITY file: IDENTITY -2023/08/16-17:47:37.442626 8651103744 MANIFEST file: MANIFEST-000078 size: 807 Bytes -2023/08/16-17:47:37.442640 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 4, files: 000063.sst 000066.sst 000071.sst 000076.sst -2023/08/16-17:47:37.442641 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000077.log size: 14944 ; -2023/08/16-17:47:37.442643 8651103744 Options.error_if_exists: 0 -2023/08/16-17:47:37.442644 8651103744 Options.create_if_missing: 1 -2023/08/16-17:47:37.442645 8651103744 Options.paranoid_checks: 1 -2023/08/16-17:47:37.442646 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/16-17:47:37.442647 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/16-17:47:37.442648 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/16-17:47:37.442648 8651103744 Options.env: 0x105d61720 -2023/08/16-17:47:37.442650 8651103744 Options.fs: PosixFileSystem -2023/08/16-17:47:37.442651 8651103744 Options.info_log: 0x15bf05f88 -2023/08/16-17:47:37.442651 8651103744 Options.max_file_opening_threads: 16 -2023/08/16-17:47:37.442652 8651103744 Options.statistics: 0x0 -2023/08/16-17:47:37.442653 8651103744 Options.use_fsync: 0 -2023/08/16-17:47:37.442654 8651103744 Options.max_log_file_size: 0 -2023/08/16-17:47:37.442655 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/16-17:47:37.442656 8651103744 Options.log_file_time_to_roll: 0 -2023/08/16-17:47:37.442657 8651103744 Options.keep_log_file_num: 1000 -2023/08/16-17:47:37.442657 8651103744 Options.recycle_log_file_num: 0 -2023/08/16-17:47:37.442658 8651103744 Options.allow_fallocate: 1 -2023/08/16-17:47:37.442659 8651103744 Options.allow_mmap_reads: 0 -2023/08/16-17:47:37.442660 8651103744 Options.allow_mmap_writes: 0 -2023/08/16-17:47:37.442661 8651103744 Options.use_direct_reads: 0 -2023/08/16-17:47:37.442662 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/16-17:47:37.442663 8651103744 Options.create_missing_column_families: 0 -2023/08/16-17:47:37.442663 8651103744 Options.db_log_dir: -2023/08/16-17:47:37.442664 8651103744 Options.wal_dir: -2023/08/16-17:47:37.442665 8651103744 Options.table_cache_numshardbits: 6 -2023/08/16-17:47:37.442666 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/16-17:47:37.442667 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/16-17:47:37.442668 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/16-17:47:37.442669 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/16-17:47:37.442670 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/16-17:47:37.442670 8651103744 Options.advise_random_on_open: 1 -2023/08/16-17:47:37.442671 8651103744 Options.db_write_buffer_size: 0 -2023/08/16-17:47:37.442672 8651103744 Options.write_buffer_manager: 0x600000930820 -2023/08/16-17:47:37.442673 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/16-17:47:37.442674 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/16-17:47:37.442675 8651103744 Options.use_adaptive_mutex: 0 -2023/08/16-17:47:37.442676 8651103744 Options.rate_limiter: 0x0 -2023/08/16-17:47:37.442677 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/16-17:47:37.442678 8651103744 Options.wal_recovery_mode: 2 -2023/08/16-17:47:37.442679 8651103744 Options.enable_thread_tracking: 0 -2023/08/16-17:47:37.442680 8651103744 Options.enable_pipelined_write: 0 -2023/08/16-17:47:37.442680 8651103744 Options.unordered_write: 0 -2023/08/16-17:47:37.442681 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/16-17:47:37.442682 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/16-17:47:37.442683 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/16-17:47:37.442684 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/16-17:47:37.442685 8651103744 Options.row_cache: None -2023/08/16-17:47:37.442686 8651103744 Options.wal_filter: None -2023/08/16-17:47:37.442686 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/16-17:47:37.442687 8651103744 Options.allow_ingest_behind: 0 -2023/08/16-17:47:37.442688 8651103744 Options.two_write_queues: 0 -2023/08/16-17:47:37.442689 8651103744 Options.manual_wal_flush: 0 -2023/08/16-17:47:37.442690 8651103744 Options.wal_compression: 0 -2023/08/16-17:47:37.442691 8651103744 Options.atomic_flush: 0 -2023/08/16-17:47:37.442691 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/16-17:47:37.442692 8651103744 Options.persist_stats_to_disk: 0 -2023/08/16-17:47:37.442693 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/16-17:47:37.442694 8651103744 Options.log_readahead_size: 0 -2023/08/16-17:47:37.442695 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/16-17:47:37.442710 8651103744 Options.best_efforts_recovery: 0 -2023/08/16-17:47:37.442711 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/16-17:47:37.442711 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/16-17:47:37.442712 8651103744 Options.allow_data_in_errors: 0 -2023/08/16-17:47:37.442713 8651103744 Options.db_host_id: __hostname__ -2023/08/16-17:47:37.442714 8651103744 Options.enforce_single_del_contracts: true -2023/08/16-17:47:37.442715 8651103744 Options.max_background_jobs: 2 -2023/08/16-17:47:37.442716 8651103744 Options.max_background_compactions: -1 -2023/08/16-17:47:37.442717 8651103744 Options.max_subcompactions: 1 -2023/08/16-17:47:37.442717 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/16-17:47:37.442718 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/16-17:47:37.442719 8651103744 Options.delayed_write_rate : 16777216 -2023/08/16-17:47:37.442720 8651103744 Options.max_total_wal_size: 0 -2023/08/16-17:47:37.442721 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/16-17:47:37.442722 8651103744 Options.stats_dump_period_sec: 600 -2023/08/16-17:47:37.442722 8651103744 Options.stats_persist_period_sec: 600 -2023/08/16-17:47:37.442723 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/16-17:47:37.442724 8651103744 Options.max_open_files: -1 -2023/08/16-17:47:37.442725 8651103744 Options.bytes_per_sync: 0 -2023/08/16-17:47:37.442726 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/16-17:47:37.442727 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/16-17:47:37.442728 8651103744 Options.compaction_readahead_size: 0 -2023/08/16-17:47:37.442728 8651103744 Options.max_background_flushes: -1 -2023/08/16-17:47:37.442729 8651103744 Compression algorithms supported: -2023/08/16-17:47:37.442743 8651103744 kZSTD supported: 1 -2023/08/16-17:47:37.442744 8651103744 kZlibCompression supported: 1 -2023/08/16-17:47:37.442745 8651103744 kXpressCompression supported: 0 -2023/08/16-17:47:37.442746 8651103744 kSnappyCompression supported: 1 -2023/08/16-17:47:37.442747 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/16-17:47:37.442748 8651103744 kLZ4HCCompression supported: 1 -2023/08/16-17:47:37.442749 8651103744 kLZ4Compression supported: 1 -2023/08/16-17:47:37.442750 8651103744 kBZip2Compression supported: 1 -2023/08/16-17:47:37.442759 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/16-17:47:37.442760 8651103744 DMutex implementation: pthread_mutex_t -2023/08/16-17:47:37.443753 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000078 -2023/08/16-17:47:37.444031 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/16-17:47:37.444034 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/16-17:47:37.444035 8651103744 Options.merge_operator: None -2023/08/16-17:47:37.444036 8651103744 Options.compaction_filter: None -2023/08/16-17:47:37.444037 8651103744 Options.compaction_filter_factory: None -2023/08/16-17:47:37.444041 8651103744 Options.sst_partitioner_factory: None -2023/08/16-17:47:37.444042 8651103744 Options.memtable_factory: SkipListFactory -2023/08/16-17:47:37.444043 8651103744 Options.table_factory: BlockBasedTable -2023/08/16-17:47:37.444084 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600003233f60) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000007300d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/16-17:47:37.444087 8651103744 Options.write_buffer_size: 67108864 -2023/08/16-17:47:37.444088 8651103744 Options.max_write_buffer_number: 2 -2023/08/16-17:47:37.444089 8651103744 Options.compression: Snappy -2023/08/16-17:47:37.444090 8651103744 Options.bottommost_compression: Disabled -2023/08/16-17:47:37.444091 8651103744 Options.prefix_extractor: nullptr -2023/08/16-17:47:37.444092 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/16-17:47:37.444093 8651103744 Options.num_levels: 7 -2023/08/16-17:47:37.444094 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/16-17:47:37.444094 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/16-17:47:37.444095 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/16-17:47:37.444096 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/16-17:47:37.444097 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/16-17:47:37.444098 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/16-17:47:37.444099 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/16-17:47:37.444100 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/16-17:47:37.444100 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/16-17:47:37.444101 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/16-17:47:37.444102 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-17:47:37.444103 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/16-17:47:37.444104 8651103744 Options.compression_opts.window_bits: -14 -2023/08/16-17:47:37.444105 8651103744 Options.compression_opts.level: 32767 -2023/08/16-17:47:37.444106 8651103744 Options.compression_opts.strategy: 0 -2023/08/16-17:47:37.444106 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/16-17:47:37.444107 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/16-17:47:37.444109 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/16-17:47:37.444109 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/16-17:47:37.444110 8651103744 Options.compression_opts.enabled: false -2023/08/16-17:47:37.444111 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-17:47:37.444112 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/16-17:47:37.444113 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/16-17:47:37.444114 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/16-17:47:37.444114 8651103744 Options.target_file_size_base: 67108864 -2023/08/16-17:47:37.444115 8651103744 Options.target_file_size_multiplier: 1 -2023/08/16-17:47:37.444116 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/16-17:47:37.444117 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/16-17:47:37.444118 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/16-17:47:37.444119 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/16-17:47:37.444120 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/16-17:47:37.444121 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/16-17:47:37.444121 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/16-17:47:37.444122 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/16-17:47:37.444123 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/16-17:47:37.444124 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/16-17:47:37.444125 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/16-17:47:37.444126 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/16-17:47:37.444126 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/16-17:47:37.444127 8651103744 Options.arena_block_size: 1048576 -2023/08/16-17:47:37.444128 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/16-17:47:37.444129 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/16-17:47:37.444130 8651103744 Options.disable_auto_compactions: 0 -2023/08/16-17:47:37.444132 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/16-17:47:37.444134 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/16-17:47:37.444135 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/16-17:47:37.444135 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/16-17:47:37.444136 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/16-17:47:37.444137 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/16-17:47:37.444138 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/16-17:47:37.444141 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/16-17:47:37.444142 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/16-17:47:37.444143 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/16-17:47:37.444145 8651103744 Options.table_properties_collectors: -2023/08/16-17:47:37.444146 8651103744 Options.inplace_update_support: 0 -2023/08/16-17:47:37.444146 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/16-17:47:37.444147 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/16-17:47:37.444148 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/16-17:47:37.444149 8651103744 Options.memtable_huge_page_size: 0 -2023/08/16-17:47:37.444150 8651103744 Options.bloom_locality: 0 -2023/08/16-17:47:37.444151 8651103744 Options.max_successive_merges: 0 -2023/08/16-17:47:37.444151 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/16-17:47:37.444152 8651103744 Options.paranoid_file_checks: 0 -2023/08/16-17:47:37.444153 8651103744 Options.force_consistency_checks: 1 -2023/08/16-17:47:37.444154 8651103744 Options.report_bg_io_stats: 0 -2023/08/16-17:47:37.444155 8651103744 Options.ttl: 2592000 -2023/08/16-17:47:37.444156 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/16-17:47:37.444156 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/16-17:47:37.444157 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/16-17:47:37.444158 8651103744 Options.enable_blob_files: false -2023/08/16-17:47:37.444159 8651103744 Options.min_blob_size: 0 -2023/08/16-17:47:37.444160 8651103744 Options.blob_file_size: 268435456 -2023/08/16-17:47:37.444161 8651103744 Options.blob_compression_type: NoCompression -2023/08/16-17:47:37.444162 8651103744 Options.enable_blob_garbage_collection: false -2023/08/16-17:47:37.444162 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/16-17:47:37.444163 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/16-17:47:37.444164 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/16-17:47:37.444165 8651103744 Options.blob_file_starting_level: 0 -2023/08/16-17:47:37.444166 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/16-17:47:37.445546 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000078 succeeded,manifest_file_number is 78, next_file_number is 80, last_sequence is 22576, log_number is 73,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 73 -2023/08/16-17:47:37.445549 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 73 -2023/08/16-17:47:37.445764 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/16-17:47:37.445990 8651103744 EVENT_LOG_v1 {"time_micros": 1692175657445977, "job": 1, "event": "recovery_started", "wal_files": [77]} -2023/08/16-17:47:37.445994 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #77 mode 2 -2023/08/16-17:47:37.447366 8651103744 EVENT_LOG_v1 {"time_micros": 1692175657447346, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 81, "file_size": 5633, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 22577, "largest_seqno": 22666, "table_properties": {"data_size": 4558, "index_size": 144, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 4080, "raw_average_key_size": 45, "raw_value_size": 9590, "raw_average_value_size": 106, "num_data_blocks": 3, "num_entries": 90, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692175657, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "RT4ZNPS4LCILAPZ128XT", "orig_file_number": 81, "seqno_to_time_mapping": "N/A"}} -2023/08/16-17:47:37.447448 8651103744 EVENT_LOG_v1 {"time_micros": 1692175657447446, "job": 1, "event": "recovery_finished"} -2023/08/16-17:47:37.447545 8651103744 [db/version_set.cc:5180] Creating manifest 83 -2023/08/16-17:47:37.450424 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000077.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-17:47:37.450458 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x15bf060e0 -2023/08/16-17:47:37.450536 8651103744 DB pointer 0x15c816200 -2023/08/16-17:47:37.450555 6157185024 [db/compaction/compaction_job.cc:1988] [default] [JOB 3] Compacting 4@0 + 1@1 files to L1, score 1.00 -2023/08/16-17:47:37.450559 6157185024 [db/compaction/compaction_job.cc:1992] [default]: Compaction start summary: Base version 2 Base level 0, inputs: [81(5633B) 76(7203B) 71(6369B) 66(3671B)], [63(973KB)] -2023/08/16-17:47:37.450583 6157185024 EVENT_LOG_v1 {"time_micros": 1692175657450562, "job": 3, "event": "compaction_started", "compaction_reason": "LevelL0FilesNum", "files_L0": [81, 76, 71, 66], "files_L1": [63], "score": 1, "input_data_size": 1019417, "oldest_snapshot_seqno": -1} -2023/08/16-17:47:37.450764 6158331904 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/16-17:47:37.450769 6158331904 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 4/4 22.34 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 6.8 0.00 0.00 1 0.001 0 0 0.0 0.0 - L1 1/1 973.18 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 5/5 995.52 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 6.8 0.00 0.00 1 0.001 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 6.8 0.00 0.00 1 0.001 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.8 0.00 0.00 1 0.001 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 0.79 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 0.79 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000007300d8#97820 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 4.8e-05 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** -2023/08/16-17:47:37.504365 6157185024 [db/compaction/compaction_job.cc:1592] [default] [JOB 3] Generated table #86: 21906 keys, 1017533 bytes, temperature: kUnknown -2023/08/16-17:47:37.504399 6157185024 EVENT_LOG_v1 {"time_micros": 1692175657504376, "cf_name": "default", "job": 3, "event": "table_file_creation", "file_number": 86, "file_size": 1017533, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 0, "largest_seqno": 0, "table_properties": {"data_size": 1009793, "index_size": 24044, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 1794902, "raw_average_key_size": 81, "raw_value_size": 944266, "raw_average_value_size": 43, "num_data_blocks": 468, "num_entries": 21906, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692109142, "oldest_key_time": 0, "file_creation_time": 1692175657, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "RT4ZNPS4LCILAPZ128XT", "orig_file_number": 86, "seqno_to_time_mapping": "N/A"}} -2023/08/16-17:47:37.504928 6157185024 (Original Log Time 2023/08/16-17:47:37.504659) [db/compaction/compaction_job.cc:1663] [default] [JOB 3] Compacted 4@0 + 1@1 files to L1 => 1017533 bytes -2023/08/16-17:47:37.504931 6157185024 (Original Log Time 2023/08/16-17:47:37.504844) [db/compaction/compaction_job.cc:885] [default] compacted to: files[0 1 0 0 0 0 0] max score 0.00, MB/sec: 18.9 rd, 18.9 wr, level 1, files in(4, 1) out(1 +0 blob) MB in(0.0, 1.0 +0.0 blob) out(1.0 +0.0 blob), read-write-amplify(89.0) write-amplify(44.5) OK, records in: 21906, records dropped: 0 output_compression: Snappy -2023/08/16-17:47:37.504933 6157185024 (Original Log Time 2023/08/16-17:47:37.504865) EVENT_LOG_v1 {"time_micros": 1692175657504851, "job": 3, "event": "compaction_finished", "compaction_time_micros": 53868, "compaction_time_cpu_micros": 53233, "output_level": 1, "num_output_files": 1, "total_output_size": 1017533, "num_input_records": 21906, "num_output_records": 21906, "num_subcompactions": 1, "output_compression": "Snappy", "num_single_delete_mismatches": 0, "num_single_delete_fallthrough": 0, "lsm_state": [0, 1, 0, 0, 0, 0, 0]} -2023/08/16-17:47:37.505012 6157185024 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000081.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-17:47:37.505017 6157185024 EVENT_LOG_v1 {"time_micros": 1692175657505015, "job": 3, "event": "table_file_deletion", "file_number": 81} -2023/08/16-17:47:37.505068 6157185024 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000076.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-17:47:37.505073 6157185024 EVENT_LOG_v1 {"time_micros": 1692175657505071, "job": 3, "event": "table_file_deletion", "file_number": 76} -2023/08/16-17:47:37.505120 6157185024 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000071.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-17:47:37.505124 6157185024 EVENT_LOG_v1 {"time_micros": 1692175657505123, "job": 3, "event": "table_file_deletion", "file_number": 71} -2023/08/16-17:47:37.505174 6157185024 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000066.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-17:47:37.505177 6157185024 EVENT_LOG_v1 {"time_micros": 1692175657505176, "job": 3, "event": "table_file_deletion", "file_number": 66} -2023/08/16-17:47:37.505248 6157185024 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000063.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-17:47:37.505252 6157185024 EVENT_LOG_v1 {"time_micros": 1692175657505251, "job": 3, "event": "table_file_deletion", "file_number": 63} diff --git a/rust/hyperlane_db/LOG.old.1692189150768832 b/rust/hyperlane_db/LOG.old.1692189150768832 deleted file mode 100644 index a1adea4967..0000000000 --- a/rust/hyperlane_db/LOG.old.1692189150768832 +++ /dev/null @@ -1,284 +0,0 @@ -2023/08/16-18:00:19.381682 8651103744 RocksDB version: 8.1.1 -2023/08/16-18:00:19.382152 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/16-18:00:19.382155 8651103744 DB SUMMARY -2023/08/16-18:00:19.382156 8651103744 DB Session ID: DW6X2USDH4HLBH29LCX1 -2023/08/16-18:00:19.382226 8651103744 CURRENT file: CURRENT -2023/08/16-18:00:19.382227 8651103744 IDENTITY file: IDENTITY -2023/08/16-18:00:19.382236 8651103744 MANIFEST file: MANIFEST-000083 size: 1192 Bytes -2023/08/16-18:00:19.382250 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 1, files: 000086.sst -2023/08/16-18:00:19.382251 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000082.log size: 0 ; -2023/08/16-18:00:19.382253 8651103744 Options.error_if_exists: 0 -2023/08/16-18:00:19.382254 8651103744 Options.create_if_missing: 1 -2023/08/16-18:00:19.382255 8651103744 Options.paranoid_checks: 1 -2023/08/16-18:00:19.382256 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/16-18:00:19.382257 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/16-18:00:19.382258 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/16-18:00:19.382259 8651103744 Options.env: 0x1091d9720 -2023/08/16-18:00:19.382260 8651103744 Options.fs: PosixFileSystem -2023/08/16-18:00:19.382261 8651103744 Options.info_log: 0x15060a6e8 -2023/08/16-18:00:19.382262 8651103744 Options.max_file_opening_threads: 16 -2023/08/16-18:00:19.382263 8651103744 Options.statistics: 0x0 -2023/08/16-18:00:19.382264 8651103744 Options.use_fsync: 0 -2023/08/16-18:00:19.382265 8651103744 Options.max_log_file_size: 0 -2023/08/16-18:00:19.382265 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/16-18:00:19.382266 8651103744 Options.log_file_time_to_roll: 0 -2023/08/16-18:00:19.382267 8651103744 Options.keep_log_file_num: 1000 -2023/08/16-18:00:19.382268 8651103744 Options.recycle_log_file_num: 0 -2023/08/16-18:00:19.382269 8651103744 Options.allow_fallocate: 1 -2023/08/16-18:00:19.382270 8651103744 Options.allow_mmap_reads: 0 -2023/08/16-18:00:19.382271 8651103744 Options.allow_mmap_writes: 0 -2023/08/16-18:00:19.382272 8651103744 Options.use_direct_reads: 0 -2023/08/16-18:00:19.382272 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/16-18:00:19.382273 8651103744 Options.create_missing_column_families: 0 -2023/08/16-18:00:19.382274 8651103744 Options.db_log_dir: -2023/08/16-18:00:19.382275 8651103744 Options.wal_dir: -2023/08/16-18:00:19.382276 8651103744 Options.table_cache_numshardbits: 6 -2023/08/16-18:00:19.382277 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/16-18:00:19.382278 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/16-18:00:19.382278 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/16-18:00:19.382279 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/16-18:00:19.382280 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/16-18:00:19.382281 8651103744 Options.advise_random_on_open: 1 -2023/08/16-18:00:19.382282 8651103744 Options.db_write_buffer_size: 0 -2023/08/16-18:00:19.382283 8651103744 Options.write_buffer_manager: 0x600002c99380 -2023/08/16-18:00:19.382284 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/16-18:00:19.382285 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/16-18:00:19.382286 8651103744 Options.use_adaptive_mutex: 0 -2023/08/16-18:00:19.382286 8651103744 Options.rate_limiter: 0x0 -2023/08/16-18:00:19.382288 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/16-18:00:19.382289 8651103744 Options.wal_recovery_mode: 2 -2023/08/16-18:00:19.382289 8651103744 Options.enable_thread_tracking: 0 -2023/08/16-18:00:19.382290 8651103744 Options.enable_pipelined_write: 0 -2023/08/16-18:00:19.382291 8651103744 Options.unordered_write: 0 -2023/08/16-18:00:19.382292 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/16-18:00:19.382293 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/16-18:00:19.382294 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/16-18:00:19.382295 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/16-18:00:19.382296 8651103744 Options.row_cache: None -2023/08/16-18:00:19.382296 8651103744 Options.wal_filter: None -2023/08/16-18:00:19.382297 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/16-18:00:19.382298 8651103744 Options.allow_ingest_behind: 0 -2023/08/16-18:00:19.382299 8651103744 Options.two_write_queues: 0 -2023/08/16-18:00:19.382300 8651103744 Options.manual_wal_flush: 0 -2023/08/16-18:00:19.382301 8651103744 Options.wal_compression: 0 -2023/08/16-18:00:19.382302 8651103744 Options.atomic_flush: 0 -2023/08/16-18:00:19.382302 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/16-18:00:19.382303 8651103744 Options.persist_stats_to_disk: 0 -2023/08/16-18:00:19.382304 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/16-18:00:19.382305 8651103744 Options.log_readahead_size: 0 -2023/08/16-18:00:19.382306 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/16-18:00:19.382321 8651103744 Options.best_efforts_recovery: 0 -2023/08/16-18:00:19.382321 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/16-18:00:19.382322 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/16-18:00:19.382323 8651103744 Options.allow_data_in_errors: 0 -2023/08/16-18:00:19.382324 8651103744 Options.db_host_id: __hostname__ -2023/08/16-18:00:19.382325 8651103744 Options.enforce_single_del_contracts: true -2023/08/16-18:00:19.382326 8651103744 Options.max_background_jobs: 2 -2023/08/16-18:00:19.382327 8651103744 Options.max_background_compactions: -1 -2023/08/16-18:00:19.382328 8651103744 Options.max_subcompactions: 1 -2023/08/16-18:00:19.382329 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/16-18:00:19.382330 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/16-18:00:19.382330 8651103744 Options.delayed_write_rate : 16777216 -2023/08/16-18:00:19.382331 8651103744 Options.max_total_wal_size: 0 -2023/08/16-18:00:19.382332 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/16-18:00:19.382333 8651103744 Options.stats_dump_period_sec: 600 -2023/08/16-18:00:19.382334 8651103744 Options.stats_persist_period_sec: 600 -2023/08/16-18:00:19.382335 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/16-18:00:19.382336 8651103744 Options.max_open_files: -1 -2023/08/16-18:00:19.382337 8651103744 Options.bytes_per_sync: 0 -2023/08/16-18:00:19.382338 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/16-18:00:19.382338 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/16-18:00:19.382339 8651103744 Options.compaction_readahead_size: 0 -2023/08/16-18:00:19.382340 8651103744 Options.max_background_flushes: -1 -2023/08/16-18:00:19.382341 8651103744 Compression algorithms supported: -2023/08/16-18:00:19.382357 8651103744 kZSTD supported: 1 -2023/08/16-18:00:19.382358 8651103744 kZlibCompression supported: 1 -2023/08/16-18:00:19.382359 8651103744 kXpressCompression supported: 0 -2023/08/16-18:00:19.382360 8651103744 kSnappyCompression supported: 1 -2023/08/16-18:00:19.382361 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/16-18:00:19.382362 8651103744 kLZ4HCCompression supported: 1 -2023/08/16-18:00:19.382363 8651103744 kLZ4Compression supported: 1 -2023/08/16-18:00:19.382364 8651103744 kBZip2Compression supported: 1 -2023/08/16-18:00:19.382371 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/16-18:00:19.382372 8651103744 DMutex implementation: pthread_mutex_t -2023/08/16-18:00:19.382531 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000083 -2023/08/16-18:00:19.382775 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/16-18:00:19.382777 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/16-18:00:19.382778 8651103744 Options.merge_operator: None -2023/08/16-18:00:19.382779 8651103744 Options.compaction_filter: None -2023/08/16-18:00:19.382780 8651103744 Options.compaction_filter_factory: None -2023/08/16-18:00:19.382781 8651103744 Options.sst_partitioner_factory: None -2023/08/16-18:00:19.382782 8651103744 Options.memtable_factory: SkipListFactory -2023/08/16-18:00:19.382782 8651103744 Options.table_factory: BlockBasedTable -2023/08/16-18:00:19.382795 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600001794640) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000022986d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/16-18:00:19.382797 8651103744 Options.write_buffer_size: 67108864 -2023/08/16-18:00:19.382798 8651103744 Options.max_write_buffer_number: 2 -2023/08/16-18:00:19.382799 8651103744 Options.compression: Snappy -2023/08/16-18:00:19.382800 8651103744 Options.bottommost_compression: Disabled -2023/08/16-18:00:19.382800 8651103744 Options.prefix_extractor: nullptr -2023/08/16-18:00:19.382801 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/16-18:00:19.382802 8651103744 Options.num_levels: 7 -2023/08/16-18:00:19.382803 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/16-18:00:19.382804 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/16-18:00:19.382805 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/16-18:00:19.382806 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/16-18:00:19.382807 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/16-18:00:19.382808 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/16-18:00:19.382809 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/16-18:00:19.382810 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/16-18:00:19.382810 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/16-18:00:19.382811 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/16-18:00:19.382812 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-18:00:19.382813 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/16-18:00:19.382814 8651103744 Options.compression_opts.window_bits: -14 -2023/08/16-18:00:19.382815 8651103744 Options.compression_opts.level: 32767 -2023/08/16-18:00:19.382816 8651103744 Options.compression_opts.strategy: 0 -2023/08/16-18:00:19.382817 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/16-18:00:19.382817 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/16-18:00:19.382818 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/16-18:00:19.382819 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/16-18:00:19.382820 8651103744 Options.compression_opts.enabled: false -2023/08/16-18:00:19.382821 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-18:00:19.382822 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/16-18:00:19.382823 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/16-18:00:19.382824 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/16-18:00:19.382825 8651103744 Options.target_file_size_base: 67108864 -2023/08/16-18:00:19.382825 8651103744 Options.target_file_size_multiplier: 1 -2023/08/16-18:00:19.382826 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/16-18:00:19.382827 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/16-18:00:19.382828 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/16-18:00:19.382829 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/16-18:00:19.382830 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/16-18:00:19.382831 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/16-18:00:19.382832 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/16-18:00:19.382833 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/16-18:00:19.382834 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/16-18:00:19.382834 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/16-18:00:19.382835 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/16-18:00:19.382836 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/16-18:00:19.382837 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/16-18:00:19.382838 8651103744 Options.arena_block_size: 1048576 -2023/08/16-18:00:19.382839 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/16-18:00:19.382840 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/16-18:00:19.382841 8651103744 Options.disable_auto_compactions: 0 -2023/08/16-18:00:19.382843 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/16-18:00:19.382844 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/16-18:00:19.382845 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/16-18:00:19.382846 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/16-18:00:19.382846 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/16-18:00:19.382847 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/16-18:00:19.382848 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/16-18:00:19.382851 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/16-18:00:19.382852 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/16-18:00:19.382853 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/16-18:00:19.382855 8651103744 Options.table_properties_collectors: -2023/08/16-18:00:19.382856 8651103744 Options.inplace_update_support: 0 -2023/08/16-18:00:19.382857 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/16-18:00:19.382858 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/16-18:00:19.382859 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/16-18:00:19.382859 8651103744 Options.memtable_huge_page_size: 0 -2023/08/16-18:00:19.382860 8651103744 Options.bloom_locality: 0 -2023/08/16-18:00:19.382861 8651103744 Options.max_successive_merges: 0 -2023/08/16-18:00:19.382862 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/16-18:00:19.382863 8651103744 Options.paranoid_file_checks: 0 -2023/08/16-18:00:19.382864 8651103744 Options.force_consistency_checks: 1 -2023/08/16-18:00:19.382865 8651103744 Options.report_bg_io_stats: 0 -2023/08/16-18:00:19.382865 8651103744 Options.ttl: 2592000 -2023/08/16-18:00:19.382866 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/16-18:00:19.382867 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/16-18:00:19.382868 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/16-18:00:19.382869 8651103744 Options.enable_blob_files: false -2023/08/16-18:00:19.382870 8651103744 Options.min_blob_size: 0 -2023/08/16-18:00:19.382871 8651103744 Options.blob_file_size: 268435456 -2023/08/16-18:00:19.382872 8651103744 Options.blob_compression_type: NoCompression -2023/08/16-18:00:19.382873 8651103744 Options.enable_blob_garbage_collection: false -2023/08/16-18:00:19.382873 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/16-18:00:19.382874 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/16-18:00:19.382875 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/16-18:00:19.382876 8651103744 Options.blob_file_starting_level: 0 -2023/08/16-18:00:19.382877 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/16-18:00:19.384033 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000083 succeeded,manifest_file_number is 83, next_file_number is 88, last_sequence is 22666, log_number is 78,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 78 -2023/08/16-18:00:19.384036 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 78 -2023/08/16-18:00:19.384072 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/16-18:00:19.384211 8651103744 EVENT_LOG_v1 {"time_micros": 1692176419384202, "job": 1, "event": "recovery_started", "wal_files": [82]} -2023/08/16-18:00:19.384214 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #82 mode 2 -2023/08/16-18:00:19.384266 8651103744 EVENT_LOG_v1 {"time_micros": 1692176419384265, "job": 1, "event": "recovery_finished"} -2023/08/16-18:00:19.384381 8651103744 [db/version_set.cc:5180] Creating manifest 90 -2023/08/16-18:00:19.387880 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x15060a840 -2023/08/16-18:00:19.387934 8651103744 DB pointer 0x150821400 -2023/08/16-18:00:19.388102 6103314432 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/16-18:00:19.388106 6103314432 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L1 1/0 993.68 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 1/0 993.68 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000022986d8#98180 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 4.2e-05 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** -2023/08/16-18:02:58.235441 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work -2023/08/16-18:02:58.236480 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692189358189015 b/rust/hyperlane_db/LOG.old.1692189358189015 deleted file mode 100644 index d6fd94e702..0000000000 --- a/rust/hyperlane_db/LOG.old.1692189358189015 +++ /dev/null @@ -1,285 +0,0 @@ -2023/08/16-21:32:30.769301 8651103744 RocksDB version: 8.1.1 -2023/08/16-21:32:30.769807 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/16-21:32:30.769809 8651103744 DB SUMMARY -2023/08/16-21:32:30.769809 8651103744 DB Session ID: P16A00QX34WKBSB8TTTE -2023/08/16-21:32:30.769863 8651103744 CURRENT file: CURRENT -2023/08/16-21:32:30.769864 8651103744 IDENTITY file: IDENTITY -2023/08/16-21:32:30.769882 8651103744 MANIFEST file: MANIFEST-000090 size: 292 Bytes -2023/08/16-21:32:30.769884 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 1, files: 000086.sst -2023/08/16-21:32:30.769885 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000082.log size: 0 ; 000089.log size: 0 ; -2023/08/16-21:32:30.769886 8651103744 Options.error_if_exists: 0 -2023/08/16-21:32:30.769887 8651103744 Options.create_if_missing: 1 -2023/08/16-21:32:30.769888 8651103744 Options.paranoid_checks: 1 -2023/08/16-21:32:30.769888 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/16-21:32:30.769889 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/16-21:32:30.769889 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/16-21:32:30.769890 8651103744 Options.env: 0x103167858 -2023/08/16-21:32:30.769891 8651103744 Options.fs: PosixFileSystem -2023/08/16-21:32:30.769892 8651103744 Options.info_log: 0x15260aa28 -2023/08/16-21:32:30.769892 8651103744 Options.max_file_opening_threads: 16 -2023/08/16-21:32:30.769893 8651103744 Options.statistics: 0x0 -2023/08/16-21:32:30.769893 8651103744 Options.use_fsync: 0 -2023/08/16-21:32:30.769894 8651103744 Options.max_log_file_size: 0 -2023/08/16-21:32:30.769895 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/16-21:32:30.769895 8651103744 Options.log_file_time_to_roll: 0 -2023/08/16-21:32:30.769896 8651103744 Options.keep_log_file_num: 1000 -2023/08/16-21:32:30.769896 8651103744 Options.recycle_log_file_num: 0 -2023/08/16-21:32:30.769897 8651103744 Options.allow_fallocate: 1 -2023/08/16-21:32:30.769898 8651103744 Options.allow_mmap_reads: 0 -2023/08/16-21:32:30.769898 8651103744 Options.allow_mmap_writes: 0 -2023/08/16-21:32:30.769899 8651103744 Options.use_direct_reads: 0 -2023/08/16-21:32:30.769899 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/16-21:32:30.769900 8651103744 Options.create_missing_column_families: 0 -2023/08/16-21:32:30.769901 8651103744 Options.db_log_dir: -2023/08/16-21:32:30.769901 8651103744 Options.wal_dir: -2023/08/16-21:32:30.769902 8651103744 Options.table_cache_numshardbits: 6 -2023/08/16-21:32:30.769902 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/16-21:32:30.769903 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/16-21:32:30.769903 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/16-21:32:30.769904 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/16-21:32:30.769905 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/16-21:32:30.769905 8651103744 Options.advise_random_on_open: 1 -2023/08/16-21:32:30.769906 8651103744 Options.db_write_buffer_size: 0 -2023/08/16-21:32:30.769907 8651103744 Options.write_buffer_manager: 0x600002ec5380 -2023/08/16-21:32:30.769907 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/16-21:32:30.769908 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/16-21:32:30.769908 8651103744 Options.use_adaptive_mutex: 0 -2023/08/16-21:32:30.769909 8651103744 Options.rate_limiter: 0x0 -2023/08/16-21:32:30.769910 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/16-21:32:30.769910 8651103744 Options.wal_recovery_mode: 2 -2023/08/16-21:32:30.769911 8651103744 Options.enable_thread_tracking: 0 -2023/08/16-21:32:30.769911 8651103744 Options.enable_pipelined_write: 0 -2023/08/16-21:32:30.769912 8651103744 Options.unordered_write: 0 -2023/08/16-21:32:30.769913 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/16-21:32:30.769913 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/16-21:32:30.769914 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/16-21:32:30.769914 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/16-21:32:30.769915 8651103744 Options.row_cache: None -2023/08/16-21:32:30.769916 8651103744 Options.wal_filter: None -2023/08/16-21:32:30.769916 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/16-21:32:30.769917 8651103744 Options.allow_ingest_behind: 0 -2023/08/16-21:32:30.769917 8651103744 Options.two_write_queues: 0 -2023/08/16-21:32:30.769918 8651103744 Options.manual_wal_flush: 0 -2023/08/16-21:32:30.769919 8651103744 Options.wal_compression: 0 -2023/08/16-21:32:30.769919 8651103744 Options.atomic_flush: 0 -2023/08/16-21:32:30.769920 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/16-21:32:30.769920 8651103744 Options.persist_stats_to_disk: 0 -2023/08/16-21:32:30.769921 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/16-21:32:30.769922 8651103744 Options.log_readahead_size: 0 -2023/08/16-21:32:30.769922 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/16-21:32:30.769923 8651103744 Options.best_efforts_recovery: 0 -2023/08/16-21:32:30.769924 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/16-21:32:30.769924 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/16-21:32:30.769925 8651103744 Options.allow_data_in_errors: 0 -2023/08/16-21:32:30.769925 8651103744 Options.db_host_id: __hostname__ -2023/08/16-21:32:30.769926 8651103744 Options.enforce_single_del_contracts: true -2023/08/16-21:32:30.769927 8651103744 Options.max_background_jobs: 2 -2023/08/16-21:32:30.769927 8651103744 Options.max_background_compactions: -1 -2023/08/16-21:32:30.769928 8651103744 Options.max_subcompactions: 1 -2023/08/16-21:32:30.769928 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/16-21:32:30.769929 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/16-21:32:30.769930 8651103744 Options.delayed_write_rate : 16777216 -2023/08/16-21:32:30.769930 8651103744 Options.max_total_wal_size: 0 -2023/08/16-21:32:30.769931 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/16-21:32:30.769932 8651103744 Options.stats_dump_period_sec: 600 -2023/08/16-21:32:30.769932 8651103744 Options.stats_persist_period_sec: 600 -2023/08/16-21:32:30.769933 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/16-21:32:30.769933 8651103744 Options.max_open_files: -1 -2023/08/16-21:32:30.769934 8651103744 Options.bytes_per_sync: 0 -2023/08/16-21:32:30.769935 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/16-21:32:30.769935 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/16-21:32:30.769936 8651103744 Options.compaction_readahead_size: 0 -2023/08/16-21:32:30.769936 8651103744 Options.max_background_flushes: -1 -2023/08/16-21:32:30.769937 8651103744 Compression algorithms supported: -2023/08/16-21:32:30.769950 8651103744 kZSTD supported: 1 -2023/08/16-21:32:30.769951 8651103744 kZlibCompression supported: 1 -2023/08/16-21:32:30.769952 8651103744 kXpressCompression supported: 0 -2023/08/16-21:32:30.769952 8651103744 kSnappyCompression supported: 1 -2023/08/16-21:32:30.769953 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/16-21:32:30.769954 8651103744 kLZ4HCCompression supported: 1 -2023/08/16-21:32:30.769954 8651103744 kLZ4Compression supported: 1 -2023/08/16-21:32:30.769955 8651103744 kBZip2Compression supported: 1 -2023/08/16-21:32:30.769960 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/16-21:32:30.769961 8651103744 DMutex implementation: pthread_mutex_t -2023/08/16-21:32:30.770233 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000090 -2023/08/16-21:32:30.770279 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/16-21:32:30.770280 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/16-21:32:30.770281 8651103744 Options.merge_operator: None -2023/08/16-21:32:30.770282 8651103744 Options.compaction_filter: None -2023/08/16-21:32:30.770282 8651103744 Options.compaction_filter_factory: None -2023/08/16-21:32:30.770283 8651103744 Options.sst_partitioner_factory: None -2023/08/16-21:32:30.770284 8651103744 Options.memtable_factory: SkipListFactory -2023/08/16-21:32:30.770284 8651103744 Options.table_factory: BlockBasedTable -2023/08/16-21:32:30.770294 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x6000015c8640) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000020c46d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/16-21:32:30.770296 8651103744 Options.write_buffer_size: 67108864 -2023/08/16-21:32:30.770296 8651103744 Options.max_write_buffer_number: 2 -2023/08/16-21:32:30.770297 8651103744 Options.compression: Snappy -2023/08/16-21:32:30.770298 8651103744 Options.bottommost_compression: Disabled -2023/08/16-21:32:30.770298 8651103744 Options.prefix_extractor: nullptr -2023/08/16-21:32:30.770299 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/16-21:32:30.770299 8651103744 Options.num_levels: 7 -2023/08/16-21:32:30.770300 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/16-21:32:30.770301 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/16-21:32:30.770301 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/16-21:32:30.770302 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/16-21:32:30.770302 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/16-21:32:30.770303 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/16-21:32:30.770304 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/16-21:32:30.770304 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/16-21:32:30.770305 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/16-21:32:30.770306 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/16-21:32:30.770306 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-21:32:30.770307 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/16-21:32:30.770307 8651103744 Options.compression_opts.window_bits: -14 -2023/08/16-21:32:30.770308 8651103744 Options.compression_opts.level: 32767 -2023/08/16-21:32:30.770309 8651103744 Options.compression_opts.strategy: 0 -2023/08/16-21:32:30.770309 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/16-21:32:30.770310 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/16-21:32:30.770310 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/16-21:32:30.770311 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/16-21:32:30.770312 8651103744 Options.compression_opts.enabled: false -2023/08/16-21:32:30.770312 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-21:32:30.770313 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/16-21:32:30.770313 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/16-21:32:30.770314 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/16-21:32:30.770315 8651103744 Options.target_file_size_base: 67108864 -2023/08/16-21:32:30.770315 8651103744 Options.target_file_size_multiplier: 1 -2023/08/16-21:32:30.770316 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/16-21:32:30.770316 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/16-21:32:30.770317 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/16-21:32:30.770318 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/16-21:32:30.770318 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/16-21:32:30.770319 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/16-21:32:30.770320 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/16-21:32:30.770320 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/16-21:32:30.770321 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/16-21:32:30.770321 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/16-21:32:30.770322 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/16-21:32:30.770323 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/16-21:32:30.770323 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/16-21:32:30.770324 8651103744 Options.arena_block_size: 1048576 -2023/08/16-21:32:30.770324 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/16-21:32:30.770325 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/16-21:32:30.770326 8651103744 Options.disable_auto_compactions: 0 -2023/08/16-21:32:30.770326 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/16-21:32:30.770327 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/16-21:32:30.770328 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/16-21:32:30.770328 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/16-21:32:30.770329 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/16-21:32:30.770330 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/16-21:32:30.770330 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/16-21:32:30.770332 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/16-21:32:30.770333 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/16-21:32:30.770333 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/16-21:32:30.770335 8651103744 Options.table_properties_collectors: -2023/08/16-21:32:30.770335 8651103744 Options.inplace_update_support: 0 -2023/08/16-21:32:30.770336 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/16-21:32:30.770336 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/16-21:32:30.770337 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/16-21:32:30.770338 8651103744 Options.memtable_huge_page_size: 0 -2023/08/16-21:32:30.770338 8651103744 Options.bloom_locality: 0 -2023/08/16-21:32:30.770339 8651103744 Options.max_successive_merges: 0 -2023/08/16-21:32:30.770339 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/16-21:32:30.770340 8651103744 Options.paranoid_file_checks: 0 -2023/08/16-21:32:30.770340 8651103744 Options.force_consistency_checks: 1 -2023/08/16-21:32:30.770341 8651103744 Options.report_bg_io_stats: 0 -2023/08/16-21:32:30.770342 8651103744 Options.ttl: 2592000 -2023/08/16-21:32:30.770342 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/16-21:32:30.770343 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/16-21:32:30.770343 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/16-21:32:30.770344 8651103744 Options.enable_blob_files: false -2023/08/16-21:32:30.770345 8651103744 Options.min_blob_size: 0 -2023/08/16-21:32:30.770345 8651103744 Options.blob_file_size: 268435456 -2023/08/16-21:32:30.770346 8651103744 Options.blob_compression_type: NoCompression -2023/08/16-21:32:30.770346 8651103744 Options.enable_blob_garbage_collection: false -2023/08/16-21:32:30.770347 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/16-21:32:30.770348 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/16-21:32:30.770348 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/16-21:32:30.770349 8651103744 Options.blob_file_starting_level: 0 -2023/08/16-21:32:30.770350 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/16-21:32:30.771237 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000090 succeeded,manifest_file_number is 90, next_file_number is 92, last_sequence is 22666, log_number is 83,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 78 -2023/08/16-21:32:30.771240 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 83 -2023/08/16-21:32:30.771275 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/16-21:32:30.771358 8651103744 EVENT_LOG_v1 {"time_micros": 1692189150771355, "job": 1, "event": "recovery_started", "wal_files": [82, 89]} -2023/08/16-21:32:30.771360 8651103744 [db/db_impl/db_impl_open.cc:1018] Skipping log #82 since it is older than min log to keep #83 -2023/08/16-21:32:30.771361 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #89 mode 2 -2023/08/16-21:32:30.771392 8651103744 EVENT_LOG_v1 {"time_micros": 1692189150771391, "job": 1, "event": "recovery_finished"} -2023/08/16-21:32:30.771430 8651103744 [db/version_set.cc:5180] Creating manifest 94 -2023/08/16-21:32:30.772651 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x152704080 -2023/08/16-21:32:30.772681 8651103744 DB pointer 0x15282a000 -2023/08/16-21:32:30.772805 6158135296 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/16-21:32:30.772807 6158135296 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L1 1/0 993.68 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 1/0 993.68 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000020c46d8#99935 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 6e-06 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** -2023/08/16-21:33:36.775832 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work -2023/08/16-21:33:36.777367 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692192433499495 b/rust/hyperlane_db/LOG.old.1692192433499495 deleted file mode 100644 index 046f57c44d..0000000000 --- a/rust/hyperlane_db/LOG.old.1692192433499495 +++ /dev/null @@ -1,292 +0,0 @@ -2023/08/16-21:35:58.189706 8651103744 RocksDB version: 8.1.1 -2023/08/16-21:35:58.190559 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/16-21:35:58.190562 8651103744 DB SUMMARY -2023/08/16-21:35:58.190564 8651103744 DB Session ID: 6Q5D50G7PHP9U84VQOA7 -2023/08/16-21:35:58.190724 8651103744 CURRENT file: CURRENT -2023/08/16-21:35:58.190727 8651103744 IDENTITY file: IDENTITY -2023/08/16-21:35:58.190751 8651103744 MANIFEST file: MANIFEST-000094 size: 292 Bytes -2023/08/16-21:35:58.190754 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 1, files: 000086.sst -2023/08/16-21:35:58.190780 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000082.log size: 0 ; 000089.log size: 0 ; 000093.log size: 46229 ; -2023/08/16-21:35:58.190785 8651103744 Options.error_if_exists: 0 -2023/08/16-21:35:58.190787 8651103744 Options.create_if_missing: 1 -2023/08/16-21:35:58.190789 8651103744 Options.paranoid_checks: 1 -2023/08/16-21:35:58.190790 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/16-21:35:58.190791 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/16-21:35:58.190793 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/16-21:35:58.190794 8651103744 Options.env: 0x1029d3828 -2023/08/16-21:35:58.190796 8651103744 Options.fs: PosixFileSystem -2023/08/16-21:35:58.190797 8651103744 Options.info_log: 0x13e805fb8 -2023/08/16-21:35:58.190799 8651103744 Options.max_file_opening_threads: 16 -2023/08/16-21:35:58.190800 8651103744 Options.statistics: 0x0 -2023/08/16-21:35:58.190817 8651103744 Options.use_fsync: 0 -2023/08/16-21:35:58.190819 8651103744 Options.max_log_file_size: 0 -2023/08/16-21:35:58.190820 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/16-21:35:58.190821 8651103744 Options.log_file_time_to_roll: 0 -2023/08/16-21:35:58.190823 8651103744 Options.keep_log_file_num: 1000 -2023/08/16-21:35:58.190824 8651103744 Options.recycle_log_file_num: 0 -2023/08/16-21:35:58.190825 8651103744 Options.allow_fallocate: 1 -2023/08/16-21:35:58.190827 8651103744 Options.allow_mmap_reads: 0 -2023/08/16-21:35:58.190828 8651103744 Options.allow_mmap_writes: 0 -2023/08/16-21:35:58.190829 8651103744 Options.use_direct_reads: 0 -2023/08/16-21:35:58.190831 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/16-21:35:58.190832 8651103744 Options.create_missing_column_families: 0 -2023/08/16-21:35:58.190833 8651103744 Options.db_log_dir: -2023/08/16-21:35:58.190835 8651103744 Options.wal_dir: -2023/08/16-21:35:58.190836 8651103744 Options.table_cache_numshardbits: 6 -2023/08/16-21:35:58.190837 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/16-21:35:58.190839 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/16-21:35:58.190840 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/16-21:35:58.190842 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/16-21:35:58.190843 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/16-21:35:58.190844 8651103744 Options.advise_random_on_open: 1 -2023/08/16-21:35:58.190846 8651103744 Options.db_write_buffer_size: 0 -2023/08/16-21:35:58.190847 8651103744 Options.write_buffer_manager: 0x600001798820 -2023/08/16-21:35:58.190848 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/16-21:35:58.190850 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/16-21:35:58.190851 8651103744 Options.use_adaptive_mutex: 0 -2023/08/16-21:35:58.190852 8651103744 Options.rate_limiter: 0x0 -2023/08/16-21:35:58.190854 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/16-21:35:58.190855 8651103744 Options.wal_recovery_mode: 2 -2023/08/16-21:35:58.190856 8651103744 Options.enable_thread_tracking: 0 -2023/08/16-21:35:58.190858 8651103744 Options.enable_pipelined_write: 0 -2023/08/16-21:35:58.190859 8651103744 Options.unordered_write: 0 -2023/08/16-21:35:58.190860 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/16-21:35:58.190862 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/16-21:35:58.190863 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/16-21:35:58.190864 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/16-21:35:58.190866 8651103744 Options.row_cache: None -2023/08/16-21:35:58.190867 8651103744 Options.wal_filter: None -2023/08/16-21:35:58.190868 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/16-21:35:58.190870 8651103744 Options.allow_ingest_behind: 0 -2023/08/16-21:35:58.190871 8651103744 Options.two_write_queues: 0 -2023/08/16-21:35:58.190872 8651103744 Options.manual_wal_flush: 0 -2023/08/16-21:35:58.190874 8651103744 Options.wal_compression: 0 -2023/08/16-21:35:58.190875 8651103744 Options.atomic_flush: 0 -2023/08/16-21:35:58.190876 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/16-21:35:58.190878 8651103744 Options.persist_stats_to_disk: 0 -2023/08/16-21:35:58.190879 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/16-21:35:58.190880 8651103744 Options.log_readahead_size: 0 -2023/08/16-21:35:58.190882 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/16-21:35:58.190883 8651103744 Options.best_efforts_recovery: 0 -2023/08/16-21:35:58.190885 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/16-21:35:58.190886 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/16-21:35:58.190887 8651103744 Options.allow_data_in_errors: 0 -2023/08/16-21:35:58.190889 8651103744 Options.db_host_id: __hostname__ -2023/08/16-21:35:58.190890 8651103744 Options.enforce_single_del_contracts: true -2023/08/16-21:35:58.190891 8651103744 Options.max_background_jobs: 2 -2023/08/16-21:35:58.190893 8651103744 Options.max_background_compactions: -1 -2023/08/16-21:35:58.190894 8651103744 Options.max_subcompactions: 1 -2023/08/16-21:35:58.190895 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/16-21:35:58.190897 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/16-21:35:58.190898 8651103744 Options.delayed_write_rate : 16777216 -2023/08/16-21:35:58.190899 8651103744 Options.max_total_wal_size: 0 -2023/08/16-21:35:58.190901 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/16-21:35:58.190902 8651103744 Options.stats_dump_period_sec: 600 -2023/08/16-21:35:58.190904 8651103744 Options.stats_persist_period_sec: 600 -2023/08/16-21:35:58.190905 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/16-21:35:58.190906 8651103744 Options.max_open_files: -1 -2023/08/16-21:35:58.190908 8651103744 Options.bytes_per_sync: 0 -2023/08/16-21:35:58.190909 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/16-21:35:58.190910 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/16-21:35:58.190911 8651103744 Options.compaction_readahead_size: 0 -2023/08/16-21:35:58.190913 8651103744 Options.max_background_flushes: -1 -2023/08/16-21:35:58.190914 8651103744 Compression algorithms supported: -2023/08/16-21:35:58.190939 8651103744 kZSTD supported: 1 -2023/08/16-21:35:58.190941 8651103744 kZlibCompression supported: 1 -2023/08/16-21:35:58.190942 8651103744 kXpressCompression supported: 0 -2023/08/16-21:35:58.190944 8651103744 kSnappyCompression supported: 1 -2023/08/16-21:35:58.190945 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/16-21:35:58.190946 8651103744 kLZ4HCCompression supported: 1 -2023/08/16-21:35:58.190948 8651103744 kLZ4Compression supported: 1 -2023/08/16-21:35:58.190949 8651103744 kBZip2Compression supported: 1 -2023/08/16-21:35:58.190960 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/16-21:35:58.190961 8651103744 DMutex implementation: pthread_mutex_t -2023/08/16-21:35:58.191176 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000094 -2023/08/16-21:35:58.191312 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/16-21:35:58.191314 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/16-21:35:58.191316 8651103744 Options.merge_operator: None -2023/08/16-21:35:58.191317 8651103744 Options.compaction_filter: None -2023/08/16-21:35:58.191319 8651103744 Options.compaction_filter_factory: None -2023/08/16-21:35:58.191320 8651103744 Options.sst_partitioner_factory: None -2023/08/16-21:35:58.191321 8651103744 Options.memtable_factory: SkipListFactory -2023/08/16-21:35:58.191323 8651103744 Options.table_factory: BlockBasedTable -2023/08/16-21:35:58.191371 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600002c9c640) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000019980d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/16-21:35:58.191376 8651103744 Options.write_buffer_size: 67108864 -2023/08/16-21:35:58.191377 8651103744 Options.max_write_buffer_number: 2 -2023/08/16-21:35:58.191379 8651103744 Options.compression: Snappy -2023/08/16-21:35:58.191380 8651103744 Options.bottommost_compression: Disabled -2023/08/16-21:35:58.191382 8651103744 Options.prefix_extractor: nullptr -2023/08/16-21:35:58.191383 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/16-21:35:58.191384 8651103744 Options.num_levels: 7 -2023/08/16-21:35:58.191386 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/16-21:35:58.191387 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/16-21:35:58.191389 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/16-21:35:58.191390 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/16-21:35:58.191391 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/16-21:35:58.191393 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/16-21:35:58.191394 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/16-21:35:58.191396 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/16-21:35:58.191397 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/16-21:35:58.191398 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/16-21:35:58.191400 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-21:35:58.191401 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/16-21:35:58.191402 8651103744 Options.compression_opts.window_bits: -14 -2023/08/16-21:35:58.191404 8651103744 Options.compression_opts.level: 32767 -2023/08/16-21:35:58.191405 8651103744 Options.compression_opts.strategy: 0 -2023/08/16-21:35:58.191406 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/16-21:35:58.191408 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/16-21:35:58.191409 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/16-21:35:58.191410 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/16-21:35:58.191412 8651103744 Options.compression_opts.enabled: false -2023/08/16-21:35:58.191413 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-21:35:58.191414 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/16-21:35:58.191416 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/16-21:35:58.191417 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/16-21:35:58.191418 8651103744 Options.target_file_size_base: 67108864 -2023/08/16-21:35:58.191420 8651103744 Options.target_file_size_multiplier: 1 -2023/08/16-21:35:58.191421 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/16-21:35:58.191422 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/16-21:35:58.191424 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/16-21:35:58.191425 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/16-21:35:58.191427 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/16-21:35:58.191428 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/16-21:35:58.191429 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/16-21:35:58.191431 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/16-21:35:58.191432 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/16-21:35:58.191434 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/16-21:35:58.191435 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/16-21:35:58.191436 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/16-21:35:58.191438 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/16-21:35:58.191439 8651103744 Options.arena_block_size: 1048576 -2023/08/16-21:35:58.191440 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/16-21:35:58.191442 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/16-21:35:58.191443 8651103744 Options.disable_auto_compactions: 0 -2023/08/16-21:35:58.191445 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/16-21:35:58.191446 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/16-21:35:58.191447 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/16-21:35:58.191449 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/16-21:35:58.191450 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/16-21:35:58.191451 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/16-21:35:58.191455 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/16-21:35:58.191457 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/16-21:35:58.191458 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/16-21:35:58.191460 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/16-21:35:58.191462 8651103744 Options.table_properties_collectors: -2023/08/16-21:35:58.191463 8651103744 Options.inplace_update_support: 0 -2023/08/16-21:35:58.191464 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/16-21:35:58.191466 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/16-21:35:58.191467 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/16-21:35:58.191468 8651103744 Options.memtable_huge_page_size: 0 -2023/08/16-21:35:58.191470 8651103744 Options.bloom_locality: 0 -2023/08/16-21:35:58.191471 8651103744 Options.max_successive_merges: 0 -2023/08/16-21:35:58.191472 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/16-21:35:58.191474 8651103744 Options.paranoid_file_checks: 0 -2023/08/16-21:35:58.191475 8651103744 Options.force_consistency_checks: 1 -2023/08/16-21:35:58.191476 8651103744 Options.report_bg_io_stats: 0 -2023/08/16-21:35:58.191477 8651103744 Options.ttl: 2592000 -2023/08/16-21:35:58.191479 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/16-21:35:58.191480 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/16-21:35:58.191481 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/16-21:35:58.191483 8651103744 Options.enable_blob_files: false -2023/08/16-21:35:58.191484 8651103744 Options.min_blob_size: 0 -2023/08/16-21:35:58.191485 8651103744 Options.blob_file_size: 268435456 -2023/08/16-21:35:58.191487 8651103744 Options.blob_compression_type: NoCompression -2023/08/16-21:35:58.191488 8651103744 Options.enable_blob_garbage_collection: false -2023/08/16-21:35:58.191489 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/16-21:35:58.191491 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/16-21:35:58.191493 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/16-21:35:58.191494 8651103744 Options.blob_file_starting_level: 0 -2023/08/16-21:35:58.191495 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/16-21:35:58.192461 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000094 succeeded,manifest_file_number is 94, next_file_number is 96, last_sequence is 22666, log_number is 90,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 78 -2023/08/16-21:35:58.192464 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 90 -2023/08/16-21:35:58.192504 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/16-21:35:58.192584 8651103744 EVENT_LOG_v1 {"time_micros": 1692189358192579, "job": 1, "event": "recovery_started", "wal_files": [82, 89, 93]} -2023/08/16-21:35:58.192585 8651103744 [db/db_impl/db_impl_open.cc:1018] Skipping log #82 since it is older than min log to keep #90 -2023/08/16-21:35:58.192586 8651103744 [db/db_impl/db_impl_open.cc:1018] Skipping log #89 since it is older than min log to keep #90 -2023/08/16-21:35:58.192587 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #93 mode 2 -2023/08/16-21:35:58.193313 8651103744 EVENT_LOG_v1 {"time_micros": 1692189358193297, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 97, "file_size": 20584, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 22667, "largest_seqno": 23080, "table_properties": {"data_size": 19455, "index_size": 256, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 19241, "raw_average_key_size": 46, "raw_value_size": 21103, "raw_average_value_size": 51, "num_data_blocks": 8, "num_entries": 413, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692189358, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "6Q5D50G7PHP9U84VQOA7", "orig_file_number": 97, "seqno_to_time_mapping": "N/A"}} -2023/08/16-21:35:58.193374 8651103744 EVENT_LOG_v1 {"time_micros": 1692189358193373, "job": 1, "event": "recovery_finished"} -2023/08/16-21:35:58.193424 8651103744 [db/version_set.cc:5180] Creating manifest 99 -2023/08/16-21:35:58.194750 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000093.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-21:35:58.194779 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000089.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-21:35:58.194808 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000082.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-21:35:58.194831 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x13e806110 -2023/08/16-21:35:58.194865 8651103744 DB pointer 0x13f00c200 -2023/08/16-21:35:58.195001 6165786624 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/16-21:35:58.195003 6165786624 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 1/0 20.10 KB 0.2 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 39.2 0.00 0.00 1 0.001 0 0 0.0 0.0 - L1 1/0 993.68 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 2/0 1013.79 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 39.2 0.00 0.00 1 0.001 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 39.2 0.00 0.00 1 0.001 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 39.2 0.00 0.00 1 0.001 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 5.33 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 5.33 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000019980d8#206 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 8e-06 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** -2023/08/16-21:37:07.328153 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work -2023/08/16-21:37:07.330754 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692193518543053 b/rust/hyperlane_db/LOG.old.1692193518543053 deleted file mode 100644 index e1b4039b9b..0000000000 --- a/rust/hyperlane_db/LOG.old.1692193518543053 +++ /dev/null @@ -1,286 +0,0 @@ -2023/08/16-22:27:13.500014 8651103744 RocksDB version: 8.1.1 -2023/08/16-22:27:13.500584 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/16-22:27:13.500586 8651103744 DB SUMMARY -2023/08/16-22:27:13.500587 8651103744 DB Session ID: ED6695YEJ5UB321WDFGK -2023/08/16-22:27:13.500641 8651103744 CURRENT file: CURRENT -2023/08/16-22:27:13.500643 8651103744 IDENTITY file: IDENTITY -2023/08/16-22:27:13.500653 8651103744 MANIFEST file: MANIFEST-000099 size: 498 Bytes -2023/08/16-22:27:13.500655 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 2, files: 000086.sst 000097.sst -2023/08/16-22:27:13.500670 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000098.log size: 37729 ; -2023/08/16-22:27:13.500672 8651103744 Options.error_if_exists: 0 -2023/08/16-22:27:13.500673 8651103744 Options.create_if_missing: 1 -2023/08/16-22:27:13.500674 8651103744 Options.paranoid_checks: 1 -2023/08/16-22:27:13.500674 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/16-22:27:13.500675 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/16-22:27:13.500676 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/16-22:27:13.500676 8651103744 Options.env: 0x104fb3828 -2023/08/16-22:27:13.500677 8651103744 Options.fs: PosixFileSystem -2023/08/16-22:27:13.500678 8651103744 Options.info_log: 0x15aa04098 -2023/08/16-22:27:13.500679 8651103744 Options.max_file_opening_threads: 16 -2023/08/16-22:27:13.500680 8651103744 Options.statistics: 0x0 -2023/08/16-22:27:13.500680 8651103744 Options.use_fsync: 0 -2023/08/16-22:27:13.500681 8651103744 Options.max_log_file_size: 0 -2023/08/16-22:27:13.500682 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/16-22:27:13.500683 8651103744 Options.log_file_time_to_roll: 0 -2023/08/16-22:27:13.500683 8651103744 Options.keep_log_file_num: 1000 -2023/08/16-22:27:13.500684 8651103744 Options.recycle_log_file_num: 0 -2023/08/16-22:27:13.500685 8651103744 Options.allow_fallocate: 1 -2023/08/16-22:27:13.500685 8651103744 Options.allow_mmap_reads: 0 -2023/08/16-22:27:13.500686 8651103744 Options.allow_mmap_writes: 0 -2023/08/16-22:27:13.500687 8651103744 Options.use_direct_reads: 0 -2023/08/16-22:27:13.500687 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/16-22:27:13.500688 8651103744 Options.create_missing_column_families: 0 -2023/08/16-22:27:13.500689 8651103744 Options.db_log_dir: -2023/08/16-22:27:13.500690 8651103744 Options.wal_dir: -2023/08/16-22:27:13.500690 8651103744 Options.table_cache_numshardbits: 6 -2023/08/16-22:27:13.500691 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/16-22:27:13.500692 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/16-22:27:13.500692 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/16-22:27:13.500693 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/16-22:27:13.500694 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/16-22:27:13.500695 8651103744 Options.advise_random_on_open: 1 -2023/08/16-22:27:13.500695 8651103744 Options.db_write_buffer_size: 0 -2023/08/16-22:27:13.500696 8651103744 Options.write_buffer_manager: 0x600000b74000 -2023/08/16-22:27:13.500697 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/16-22:27:13.500698 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/16-22:27:13.500698 8651103744 Options.use_adaptive_mutex: 0 -2023/08/16-22:27:13.500699 8651103744 Options.rate_limiter: 0x0 -2023/08/16-22:27:13.500700 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/16-22:27:13.500701 8651103744 Options.wal_recovery_mode: 2 -2023/08/16-22:27:13.500701 8651103744 Options.enable_thread_tracking: 0 -2023/08/16-22:27:13.500702 8651103744 Options.enable_pipelined_write: 0 -2023/08/16-22:27:13.500703 8651103744 Options.unordered_write: 0 -2023/08/16-22:27:13.500703 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/16-22:27:13.500704 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/16-22:27:13.500705 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/16-22:27:13.500705 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/16-22:27:13.500706 8651103744 Options.row_cache: None -2023/08/16-22:27:13.500707 8651103744 Options.wal_filter: None -2023/08/16-22:27:13.500708 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/16-22:27:13.500708 8651103744 Options.allow_ingest_behind: 0 -2023/08/16-22:27:13.500709 8651103744 Options.two_write_queues: 0 -2023/08/16-22:27:13.500710 8651103744 Options.manual_wal_flush: 0 -2023/08/16-22:27:13.500710 8651103744 Options.wal_compression: 0 -2023/08/16-22:27:13.500711 8651103744 Options.atomic_flush: 0 -2023/08/16-22:27:13.500712 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/16-22:27:13.500712 8651103744 Options.persist_stats_to_disk: 0 -2023/08/16-22:27:13.500713 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/16-22:27:13.500714 8651103744 Options.log_readahead_size: 0 -2023/08/16-22:27:13.500715 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/16-22:27:13.500715 8651103744 Options.best_efforts_recovery: 0 -2023/08/16-22:27:13.500716 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/16-22:27:13.500717 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/16-22:27:13.500718 8651103744 Options.allow_data_in_errors: 0 -2023/08/16-22:27:13.500718 8651103744 Options.db_host_id: __hostname__ -2023/08/16-22:27:13.500719 8651103744 Options.enforce_single_del_contracts: true -2023/08/16-22:27:13.500720 8651103744 Options.max_background_jobs: 2 -2023/08/16-22:27:13.500720 8651103744 Options.max_background_compactions: -1 -2023/08/16-22:27:13.500721 8651103744 Options.max_subcompactions: 1 -2023/08/16-22:27:13.500722 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/16-22:27:13.500722 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/16-22:27:13.500723 8651103744 Options.delayed_write_rate : 16777216 -2023/08/16-22:27:13.500724 8651103744 Options.max_total_wal_size: 0 -2023/08/16-22:27:13.500725 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/16-22:27:13.500725 8651103744 Options.stats_dump_period_sec: 600 -2023/08/16-22:27:13.500726 8651103744 Options.stats_persist_period_sec: 600 -2023/08/16-22:27:13.500727 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/16-22:27:13.500728 8651103744 Options.max_open_files: -1 -2023/08/16-22:27:13.500728 8651103744 Options.bytes_per_sync: 0 -2023/08/16-22:27:13.500729 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/16-22:27:13.500730 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/16-22:27:13.500730 8651103744 Options.compaction_readahead_size: 0 -2023/08/16-22:27:13.500731 8651103744 Options.max_background_flushes: -1 -2023/08/16-22:27:13.500732 8651103744 Compression algorithms supported: -2023/08/16-22:27:13.500747 8651103744 kZSTD supported: 1 -2023/08/16-22:27:13.500748 8651103744 kZlibCompression supported: 1 -2023/08/16-22:27:13.500749 8651103744 kXpressCompression supported: 0 -2023/08/16-22:27:13.500749 8651103744 kSnappyCompression supported: 1 -2023/08/16-22:27:13.500750 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/16-22:27:13.500751 8651103744 kLZ4HCCompression supported: 1 -2023/08/16-22:27:13.500751 8651103744 kLZ4Compression supported: 1 -2023/08/16-22:27:13.500752 8651103744 kBZip2Compression supported: 1 -2023/08/16-22:27:13.500760 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/16-22:27:13.500761 8651103744 DMutex implementation: pthread_mutex_t -2023/08/16-22:27:13.500885 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000099 -2023/08/16-22:27:13.501107 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/16-22:27:13.501113 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/16-22:27:13.501114 8651103744 Options.merge_operator: None -2023/08/16-22:27:13.501115 8651103744 Options.compaction_filter: None -2023/08/16-22:27:13.501116 8651103744 Options.compaction_filter_factory: None -2023/08/16-22:27:13.501117 8651103744 Options.sst_partitioner_factory: None -2023/08/16-22:27:13.501118 8651103744 Options.memtable_factory: SkipListFactory -2023/08/16-22:27:13.501118 8651103744 Options.table_factory: BlockBasedTable -2023/08/16-22:27:13.501153 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x60000307a340) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000005780d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/16-22:27:13.501156 8651103744 Options.write_buffer_size: 67108864 -2023/08/16-22:27:13.501157 8651103744 Options.max_write_buffer_number: 2 -2023/08/16-22:27:13.501158 8651103744 Options.compression: Snappy -2023/08/16-22:27:13.501159 8651103744 Options.bottommost_compression: Disabled -2023/08/16-22:27:13.501160 8651103744 Options.prefix_extractor: nullptr -2023/08/16-22:27:13.501160 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/16-22:27:13.501161 8651103744 Options.num_levels: 7 -2023/08/16-22:27:13.501162 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/16-22:27:13.501163 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/16-22:27:13.501163 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/16-22:27:13.501164 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/16-22:27:13.501165 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/16-22:27:13.501166 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/16-22:27:13.501217 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/16-22:27:13.501220 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/16-22:27:13.501221 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/16-22:27:13.501222 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/16-22:27:13.501223 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-22:27:13.501224 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/16-22:27:13.501224 8651103744 Options.compression_opts.window_bits: -14 -2023/08/16-22:27:13.501225 8651103744 Options.compression_opts.level: 32767 -2023/08/16-22:27:13.501226 8651103744 Options.compression_opts.strategy: 0 -2023/08/16-22:27:13.501227 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/16-22:27:13.501227 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/16-22:27:13.501228 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/16-22:27:13.501229 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/16-22:27:13.501230 8651103744 Options.compression_opts.enabled: false -2023/08/16-22:27:13.501230 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-22:27:13.501231 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/16-22:27:13.501232 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/16-22:27:13.501232 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/16-22:27:13.501233 8651103744 Options.target_file_size_base: 67108864 -2023/08/16-22:27:13.501234 8651103744 Options.target_file_size_multiplier: 1 -2023/08/16-22:27:13.501235 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/16-22:27:13.501235 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/16-22:27:13.501236 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/16-22:27:13.501238 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/16-22:27:13.501239 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/16-22:27:13.501240 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/16-22:27:13.501240 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/16-22:27:13.501241 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/16-22:27:13.501242 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/16-22:27:13.501242 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/16-22:27:13.501243 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/16-22:27:13.501244 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/16-22:27:13.501244 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/16-22:27:13.501245 8651103744 Options.arena_block_size: 1048576 -2023/08/16-22:27:13.501246 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/16-22:27:13.501247 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/16-22:27:13.501247 8651103744 Options.disable_auto_compactions: 0 -2023/08/16-22:27:13.501248 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/16-22:27:13.501249 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/16-22:27:13.501250 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/16-22:27:13.501251 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/16-22:27:13.501251 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/16-22:27:13.501252 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/16-22:27:13.501253 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/16-22:27:13.501258 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/16-22:27:13.501259 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/16-22:27:13.501260 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/16-22:27:13.501261 8651103744 Options.table_properties_collectors: -2023/08/16-22:27:13.501262 8651103744 Options.inplace_update_support: 0 -2023/08/16-22:27:13.501263 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/16-22:27:13.501263 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/16-22:27:13.501264 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/16-22:27:13.501265 8651103744 Options.memtable_huge_page_size: 0 -2023/08/16-22:27:13.501266 8651103744 Options.bloom_locality: 0 -2023/08/16-22:27:13.501266 8651103744 Options.max_successive_merges: 0 -2023/08/16-22:27:13.501267 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/16-22:27:13.501268 8651103744 Options.paranoid_file_checks: 0 -2023/08/16-22:27:13.501269 8651103744 Options.force_consistency_checks: 1 -2023/08/16-22:27:13.501269 8651103744 Options.report_bg_io_stats: 0 -2023/08/16-22:27:13.501270 8651103744 Options.ttl: 2592000 -2023/08/16-22:27:13.501271 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/16-22:27:13.501271 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/16-22:27:13.501272 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/16-22:27:13.501273 8651103744 Options.enable_blob_files: false -2023/08/16-22:27:13.501273 8651103744 Options.min_blob_size: 0 -2023/08/16-22:27:13.501274 8651103744 Options.blob_file_size: 268435456 -2023/08/16-22:27:13.501275 8651103744 Options.blob_compression_type: NoCompression -2023/08/16-22:27:13.501276 8651103744 Options.enable_blob_garbage_collection: false -2023/08/16-22:27:13.501276 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/16-22:27:13.501277 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/16-22:27:13.501278 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/16-22:27:13.501279 8651103744 Options.blob_file_starting_level: 0 -2023/08/16-22:27:13.501279 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/16-22:27:13.502304 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000099 succeeded,manifest_file_number is 99, next_file_number is 101, last_sequence is 23080, log_number is 94,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 94 -2023/08/16-22:27:13.502309 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 94 -2023/08/16-22:27:13.502378 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/16-22:27:13.502574 8651103744 EVENT_LOG_v1 {"time_micros": 1692192433502570, "job": 1, "event": "recovery_started", "wal_files": [98]} -2023/08/16-22:27:13.502577 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #98 mode 2 -2023/08/16-22:27:13.506097 8651103744 EVENT_LOG_v1 {"time_micros": 1692192433506051, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 102, "file_size": 16085, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 23081, "largest_seqno": 23413, "table_properties": {"data_size": 14939, "index_size": 255, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 15062, "raw_average_key_size": 45, "raw_value_size": 17926, "raw_average_value_size": 53, "num_data_blocks": 7, "num_entries": 332, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692192433, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "ED6695YEJ5UB321WDFGK", "orig_file_number": 102, "seqno_to_time_mapping": "N/A"}} -2023/08/16-22:27:13.506998 8651103744 EVENT_LOG_v1 {"time_micros": 1692192433506887, "job": 1, "event": "recovery_finished"} -2023/08/16-22:27:13.507106 8651103744 [db/version_set.cc:5180] Creating manifest 104 -2023/08/16-22:27:13.508806 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000098.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-22:27:13.508837 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x15a904600 -2023/08/16-22:27:13.508885 8651103744 DB pointer 0x15c00b000 -2023/08/16-22:27:13.509072 6126071808 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/16-22:27:13.509075 6126071808 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 2/0 35.81 KB 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 8.3 0.00 0.00 1 0.002 0 0 0.0 0.0 - L1 1/0 993.68 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 3/0 1.01 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 8.3 0.00 0.00 1 0.002 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 8.3 0.00 0.00 1 0.002 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 8.3 0.00 0.00 1 0.002 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 1.92 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 1.92 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000005780d8#1093 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 1.2e-05 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692194047418516 b/rust/hyperlane_db/LOG.old.1692194047418516 deleted file mode 100644 index 82593b49c8..0000000000 --- a/rust/hyperlane_db/LOG.old.1692194047418516 +++ /dev/null @@ -1,286 +0,0 @@ -2023/08/16-22:45:18.544185 8651103744 RocksDB version: 8.1.1 -2023/08/16-22:45:18.544874 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/16-22:45:18.544876 8651103744 DB SUMMARY -2023/08/16-22:45:18.544878 8651103744 DB Session ID: 99EJLH68EJGAQEYVRSD6 -2023/08/16-22:45:18.544944 8651103744 CURRENT file: CURRENT -2023/08/16-22:45:18.544946 8651103744 IDENTITY file: IDENTITY -2023/08/16-22:45:18.544965 8651103744 MANIFEST file: MANIFEST-000104 size: 656 Bytes -2023/08/16-22:45:18.544967 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 3, files: 000086.sst 000097.sst 000102.sst -2023/08/16-22:45:18.544988 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000103.log size: 13465 ; -2023/08/16-22:45:18.544990 8651103744 Options.error_if_exists: 0 -2023/08/16-22:45:18.544992 8651103744 Options.create_if_missing: 1 -2023/08/16-22:45:18.544993 8651103744 Options.paranoid_checks: 1 -2023/08/16-22:45:18.544994 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/16-22:45:18.544995 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/16-22:45:18.544996 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/16-22:45:18.544997 8651103744 Options.env: 0x106287828 -2023/08/16-22:45:18.544998 8651103744 Options.fs: PosixFileSystem -2023/08/16-22:45:18.544999 8651103744 Options.info_log: 0x155e0a708 -2023/08/16-22:45:18.545001 8651103744 Options.max_file_opening_threads: 16 -2023/08/16-22:45:18.545002 8651103744 Options.statistics: 0x0 -2023/08/16-22:45:18.545003 8651103744 Options.use_fsync: 0 -2023/08/16-22:45:18.545004 8651103744 Options.max_log_file_size: 0 -2023/08/16-22:45:18.545005 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/16-22:45:18.545006 8651103744 Options.log_file_time_to_roll: 0 -2023/08/16-22:45:18.545007 8651103744 Options.keep_log_file_num: 1000 -2023/08/16-22:45:18.545008 8651103744 Options.recycle_log_file_num: 0 -2023/08/16-22:45:18.545009 8651103744 Options.allow_fallocate: 1 -2023/08/16-22:45:18.545010 8651103744 Options.allow_mmap_reads: 0 -2023/08/16-22:45:18.545011 8651103744 Options.allow_mmap_writes: 0 -2023/08/16-22:45:18.545012 8651103744 Options.use_direct_reads: 0 -2023/08/16-22:45:18.545013 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/16-22:45:18.545014 8651103744 Options.create_missing_column_families: 0 -2023/08/16-22:45:18.545015 8651103744 Options.db_log_dir: -2023/08/16-22:45:18.545016 8651103744 Options.wal_dir: -2023/08/16-22:45:18.545017 8651103744 Options.table_cache_numshardbits: 6 -2023/08/16-22:45:18.545018 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/16-22:45:18.545019 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/16-22:45:18.545020 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/16-22:45:18.545022 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/16-22:45:18.545023 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/16-22:45:18.545024 8651103744 Options.advise_random_on_open: 1 -2023/08/16-22:45:18.545025 8651103744 Options.db_write_buffer_size: 0 -2023/08/16-22:45:18.545026 8651103744 Options.write_buffer_manager: 0x600003ebd380 -2023/08/16-22:45:18.545027 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/16-22:45:18.545028 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/16-22:45:18.545029 8651103744 Options.use_adaptive_mutex: 0 -2023/08/16-22:45:18.545030 8651103744 Options.rate_limiter: 0x0 -2023/08/16-22:45:18.545031 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/16-22:45:18.545032 8651103744 Options.wal_recovery_mode: 2 -2023/08/16-22:45:18.545033 8651103744 Options.enable_thread_tracking: 0 -2023/08/16-22:45:18.545034 8651103744 Options.enable_pipelined_write: 0 -2023/08/16-22:45:18.545035 8651103744 Options.unordered_write: 0 -2023/08/16-22:45:18.545036 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/16-22:45:18.545037 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/16-22:45:18.545038 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/16-22:45:18.545040 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/16-22:45:18.545040 8651103744 Options.row_cache: None -2023/08/16-22:45:18.545042 8651103744 Options.wal_filter: None -2023/08/16-22:45:18.545043 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/16-22:45:18.545044 8651103744 Options.allow_ingest_behind: 0 -2023/08/16-22:45:18.545045 8651103744 Options.two_write_queues: 0 -2023/08/16-22:45:18.545046 8651103744 Options.manual_wal_flush: 0 -2023/08/16-22:45:18.545047 8651103744 Options.wal_compression: 0 -2023/08/16-22:45:18.545048 8651103744 Options.atomic_flush: 0 -2023/08/16-22:45:18.545049 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/16-22:45:18.545050 8651103744 Options.persist_stats_to_disk: 0 -2023/08/16-22:45:18.545051 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/16-22:45:18.545052 8651103744 Options.log_readahead_size: 0 -2023/08/16-22:45:18.545053 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/16-22:45:18.545054 8651103744 Options.best_efforts_recovery: 0 -2023/08/16-22:45:18.545055 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/16-22:45:18.545056 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/16-22:45:18.545057 8651103744 Options.allow_data_in_errors: 0 -2023/08/16-22:45:18.545058 8651103744 Options.db_host_id: __hostname__ -2023/08/16-22:45:18.545059 8651103744 Options.enforce_single_del_contracts: true -2023/08/16-22:45:18.545060 8651103744 Options.max_background_jobs: 2 -2023/08/16-22:45:18.545061 8651103744 Options.max_background_compactions: -1 -2023/08/16-22:45:18.545063 8651103744 Options.max_subcompactions: 1 -2023/08/16-22:45:18.545064 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/16-22:45:18.545065 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/16-22:45:18.545066 8651103744 Options.delayed_write_rate : 16777216 -2023/08/16-22:45:18.545067 8651103744 Options.max_total_wal_size: 0 -2023/08/16-22:45:18.545068 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/16-22:45:18.545069 8651103744 Options.stats_dump_period_sec: 600 -2023/08/16-22:45:18.545070 8651103744 Options.stats_persist_period_sec: 600 -2023/08/16-22:45:18.545071 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/16-22:45:18.545072 8651103744 Options.max_open_files: -1 -2023/08/16-22:45:18.545073 8651103744 Options.bytes_per_sync: 0 -2023/08/16-22:45:18.545074 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/16-22:45:18.545075 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/16-22:45:18.545076 8651103744 Options.compaction_readahead_size: 0 -2023/08/16-22:45:18.545077 8651103744 Options.max_background_flushes: -1 -2023/08/16-22:45:18.545078 8651103744 Compression algorithms supported: -2023/08/16-22:45:18.545097 8651103744 kZSTD supported: 1 -2023/08/16-22:45:18.545098 8651103744 kZlibCompression supported: 1 -2023/08/16-22:45:18.545099 8651103744 kXpressCompression supported: 0 -2023/08/16-22:45:18.545100 8651103744 kSnappyCompression supported: 1 -2023/08/16-22:45:18.545101 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/16-22:45:18.545103 8651103744 kLZ4HCCompression supported: 1 -2023/08/16-22:45:18.545104 8651103744 kLZ4Compression supported: 1 -2023/08/16-22:45:18.545105 8651103744 kBZip2Compression supported: 1 -2023/08/16-22:45:18.545112 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/16-22:45:18.545113 8651103744 DMutex implementation: pthread_mutex_t -2023/08/16-22:45:18.545279 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000104 -2023/08/16-22:45:18.545387 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/16-22:45:18.545389 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/16-22:45:18.545390 8651103744 Options.merge_operator: None -2023/08/16-22:45:18.545391 8651103744 Options.compaction_filter: None -2023/08/16-22:45:18.545392 8651103744 Options.compaction_filter_factory: None -2023/08/16-22:45:18.545393 8651103744 Options.sst_partitioner_factory: None -2023/08/16-22:45:18.545395 8651103744 Options.memtable_factory: SkipListFactory -2023/08/16-22:45:18.545396 8651103744 Options.table_factory: BlockBasedTable -2023/08/16-22:45:18.545413 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x6000005b0640) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000030bc6d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/16-22:45:18.545414 8651103744 Options.write_buffer_size: 67108864 -2023/08/16-22:45:18.545415 8651103744 Options.max_write_buffer_number: 2 -2023/08/16-22:45:18.545417 8651103744 Options.compression: Snappy -2023/08/16-22:45:18.545418 8651103744 Options.bottommost_compression: Disabled -2023/08/16-22:45:18.545419 8651103744 Options.prefix_extractor: nullptr -2023/08/16-22:45:18.545420 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/16-22:45:18.545421 8651103744 Options.num_levels: 7 -2023/08/16-22:45:18.545422 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/16-22:45:18.545423 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/16-22:45:18.545424 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/16-22:45:18.545425 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/16-22:45:18.545426 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/16-22:45:18.545428 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/16-22:45:18.545429 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/16-22:45:18.545430 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/16-22:45:18.545431 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/16-22:45:18.545432 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/16-22:45:18.545433 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-22:45:18.545434 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/16-22:45:18.545435 8651103744 Options.compression_opts.window_bits: -14 -2023/08/16-22:45:18.545436 8651103744 Options.compression_opts.level: 32767 -2023/08/16-22:45:18.545437 8651103744 Options.compression_opts.strategy: 0 -2023/08/16-22:45:18.545438 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/16-22:45:18.545439 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/16-22:45:18.545440 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/16-22:45:18.545441 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/16-22:45:18.545442 8651103744 Options.compression_opts.enabled: false -2023/08/16-22:45:18.545443 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-22:45:18.545444 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/16-22:45:18.545445 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/16-22:45:18.545446 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/16-22:45:18.545447 8651103744 Options.target_file_size_base: 67108864 -2023/08/16-22:45:18.545448 8651103744 Options.target_file_size_multiplier: 1 -2023/08/16-22:45:18.545449 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/16-22:45:18.545450 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/16-22:45:18.545451 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/16-22:45:18.545453 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/16-22:45:18.545454 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/16-22:45:18.545455 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/16-22:45:18.545456 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/16-22:45:18.545457 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/16-22:45:18.545458 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/16-22:45:18.545459 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/16-22:45:18.545460 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/16-22:45:18.545461 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/16-22:45:18.545462 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/16-22:45:18.545463 8651103744 Options.arena_block_size: 1048576 -2023/08/16-22:45:18.545464 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/16-22:45:18.545465 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/16-22:45:18.545466 8651103744 Options.disable_auto_compactions: 0 -2023/08/16-22:45:18.545467 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/16-22:45:18.545469 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/16-22:45:18.545470 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/16-22:45:18.545471 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/16-22:45:18.545472 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/16-22:45:18.545473 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/16-22:45:18.545474 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/16-22:45:18.545477 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/16-22:45:18.545478 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/16-22:45:18.545479 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/16-22:45:18.545483 8651103744 Options.table_properties_collectors: -2023/08/16-22:45:18.545484 8651103744 Options.inplace_update_support: 0 -2023/08/16-22:45:18.545485 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/16-22:45:18.545486 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/16-22:45:18.545487 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/16-22:45:18.545488 8651103744 Options.memtable_huge_page_size: 0 -2023/08/16-22:45:18.545489 8651103744 Options.bloom_locality: 0 -2023/08/16-22:45:18.545490 8651103744 Options.max_successive_merges: 0 -2023/08/16-22:45:18.545491 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/16-22:45:18.545492 8651103744 Options.paranoid_file_checks: 0 -2023/08/16-22:45:18.545493 8651103744 Options.force_consistency_checks: 1 -2023/08/16-22:45:18.545494 8651103744 Options.report_bg_io_stats: 0 -2023/08/16-22:45:18.545495 8651103744 Options.ttl: 2592000 -2023/08/16-22:45:18.545496 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/16-22:45:18.545497 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/16-22:45:18.545498 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/16-22:45:18.545499 8651103744 Options.enable_blob_files: false -2023/08/16-22:45:18.545500 8651103744 Options.min_blob_size: 0 -2023/08/16-22:45:18.545501 8651103744 Options.blob_file_size: 268435456 -2023/08/16-22:45:18.545503 8651103744 Options.blob_compression_type: NoCompression -2023/08/16-22:45:18.545504 8651103744 Options.enable_blob_garbage_collection: false -2023/08/16-22:45:18.545505 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/16-22:45:18.545506 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/16-22:45:18.545507 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/16-22:45:18.545508 8651103744 Options.blob_file_starting_level: 0 -2023/08/16-22:45:18.545509 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/16-22:45:18.546516 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000104 succeeded,manifest_file_number is 104, next_file_number is 106, last_sequence is 23413, log_number is 99,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 99 -2023/08/16-22:45:18.546523 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 99 -2023/08/16-22:45:18.546580 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/16-22:45:18.546736 8651103744 EVENT_LOG_v1 {"time_micros": 1692193518546731, "job": 1, "event": "recovery_started", "wal_files": [103]} -2023/08/16-22:45:18.546739 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #103 mode 2 -2023/08/16-22:45:18.547413 8651103744 EVENT_LOG_v1 {"time_micros": 1692193518547367, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 107, "file_size": 6230, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 23414, "largest_seqno": 23527, "table_properties": {"data_size": 5187, "index_size": 117, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 5168, "raw_average_key_size": 45, "raw_value_size": 6695, "raw_average_value_size": 58, "num_data_blocks": 3, "num_entries": 114, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692193518, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "99EJLH68EJGAQEYVRSD6", "orig_file_number": 107, "seqno_to_time_mapping": "N/A"}} -2023/08/16-22:45:18.547510 8651103744 EVENT_LOG_v1 {"time_micros": 1692193518547508, "job": 1, "event": "recovery_finished"} -2023/08/16-22:45:18.547602 8651103744 [db/version_set.cc:5180] Creating manifest 109 -2023/08/16-22:45:18.549989 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000103.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-22:45:18.550028 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x155e0ac70 -2023/08/16-22:45:18.550084 8651103744 DB pointer 0x156027e00 -2023/08/16-22:45:18.550255 6106329088 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/16-22:45:18.550259 6106329088 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 3/0 41.89 KB 0.8 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 10.7 0.00 0.00 1 0.001 0 0 0.0 0.0 - L1 1/0 993.68 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 4/0 1.01 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 10.7 0.00 0.00 1 0.001 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 10.7 0.00 0.00 1 0.001 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 10.7 0.00 0.00 1 0.001 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 1.23 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 1.23 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000030bc6d8#1574 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 1e-05 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692194265436485 b/rust/hyperlane_db/LOG.old.1692194265436485 deleted file mode 100644 index 0cfbbdfa5f..0000000000 --- a/rust/hyperlane_db/LOG.old.1692194265436485 +++ /dev/null @@ -1,304 +0,0 @@ -2023/08/16-22:54:07.419109 8651103744 RocksDB version: 8.1.1 -2023/08/16-22:54:07.419887 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/16-22:54:07.419891 8651103744 DB SUMMARY -2023/08/16-22:54:07.419892 8651103744 DB Session ID: WLJHG37BR34EQN3KUMHA -2023/08/16-22:54:07.420045 8651103744 CURRENT file: CURRENT -2023/08/16-22:54:07.420048 8651103744 IDENTITY file: IDENTITY -2023/08/16-22:54:07.420069 8651103744 MANIFEST file: MANIFEST-000109 size: 822 Bytes -2023/08/16-22:54:07.420072 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 4, files: 000086.sst 000097.sst 000102.sst 000107.sst -2023/08/16-22:54:07.420074 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000108.log size: 18679 ; -2023/08/16-22:54:07.420077 8651103744 Options.error_if_exists: 0 -2023/08/16-22:54:07.420079 8651103744 Options.create_if_missing: 1 -2023/08/16-22:54:07.420080 8651103744 Options.paranoid_checks: 1 -2023/08/16-22:54:07.420082 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/16-22:54:07.420083 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/16-22:54:07.420084 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/16-22:54:07.420086 8651103744 Options.env: 0x102b5b848 -2023/08/16-22:54:07.420087 8651103744 Options.fs: PosixFileSystem -2023/08/16-22:54:07.420089 8651103744 Options.info_log: 0x122f095b8 -2023/08/16-22:54:07.420090 8651103744 Options.max_file_opening_threads: 16 -2023/08/16-22:54:07.420091 8651103744 Options.statistics: 0x0 -2023/08/16-22:54:07.420093 8651103744 Options.use_fsync: 0 -2023/08/16-22:54:07.420094 8651103744 Options.max_log_file_size: 0 -2023/08/16-22:54:07.420096 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/16-22:54:07.420097 8651103744 Options.log_file_time_to_roll: 0 -2023/08/16-22:54:07.420098 8651103744 Options.keep_log_file_num: 1000 -2023/08/16-22:54:07.420100 8651103744 Options.recycle_log_file_num: 0 -2023/08/16-22:54:07.420101 8651103744 Options.allow_fallocate: 1 -2023/08/16-22:54:07.420102 8651103744 Options.allow_mmap_reads: 0 -2023/08/16-22:54:07.420103 8651103744 Options.allow_mmap_writes: 0 -2023/08/16-22:54:07.420105 8651103744 Options.use_direct_reads: 0 -2023/08/16-22:54:07.420106 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/16-22:54:07.420107 8651103744 Options.create_missing_column_families: 0 -2023/08/16-22:54:07.420108 8651103744 Options.db_log_dir: -2023/08/16-22:54:07.420110 8651103744 Options.wal_dir: -2023/08/16-22:54:07.420111 8651103744 Options.table_cache_numshardbits: 6 -2023/08/16-22:54:07.420112 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/16-22:54:07.420113 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/16-22:54:07.420115 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/16-22:54:07.420116 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/16-22:54:07.420117 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/16-22:54:07.420119 8651103744 Options.advise_random_on_open: 1 -2023/08/16-22:54:07.420120 8651103744 Options.db_write_buffer_size: 0 -2023/08/16-22:54:07.420121 8651103744 Options.write_buffer_manager: 0x600002b88820 -2023/08/16-22:54:07.420123 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/16-22:54:07.420124 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/16-22:54:07.420125 8651103744 Options.use_adaptive_mutex: 0 -2023/08/16-22:54:07.420127 8651103744 Options.rate_limiter: 0x0 -2023/08/16-22:54:07.420128 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/16-22:54:07.420129 8651103744 Options.wal_recovery_mode: 2 -2023/08/16-22:54:07.420131 8651103744 Options.enable_thread_tracking: 0 -2023/08/16-22:54:07.420132 8651103744 Options.enable_pipelined_write: 0 -2023/08/16-22:54:07.420133 8651103744 Options.unordered_write: 0 -2023/08/16-22:54:07.420135 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/16-22:54:07.420136 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/16-22:54:07.420137 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/16-22:54:07.420138 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/16-22:54:07.420140 8651103744 Options.row_cache: None -2023/08/16-22:54:07.420141 8651103744 Options.wal_filter: None -2023/08/16-22:54:07.420142 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/16-22:54:07.420144 8651103744 Options.allow_ingest_behind: 0 -2023/08/16-22:54:07.420145 8651103744 Options.two_write_queues: 0 -2023/08/16-22:54:07.420146 8651103744 Options.manual_wal_flush: 0 -2023/08/16-22:54:07.420148 8651103744 Options.wal_compression: 0 -2023/08/16-22:54:07.420149 8651103744 Options.atomic_flush: 0 -2023/08/16-22:54:07.420150 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/16-22:54:07.420152 8651103744 Options.persist_stats_to_disk: 0 -2023/08/16-22:54:07.420153 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/16-22:54:07.420154 8651103744 Options.log_readahead_size: 0 -2023/08/16-22:54:07.420156 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/16-22:54:07.420157 8651103744 Options.best_efforts_recovery: 0 -2023/08/16-22:54:07.420159 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/16-22:54:07.420160 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/16-22:54:07.420162 8651103744 Options.allow_data_in_errors: 0 -2023/08/16-22:54:07.420163 8651103744 Options.db_host_id: __hostname__ -2023/08/16-22:54:07.420164 8651103744 Options.enforce_single_del_contracts: true -2023/08/16-22:54:07.420166 8651103744 Options.max_background_jobs: 2 -2023/08/16-22:54:07.420167 8651103744 Options.max_background_compactions: -1 -2023/08/16-22:54:07.420168 8651103744 Options.max_subcompactions: 1 -2023/08/16-22:54:07.420170 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/16-22:54:07.420171 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/16-22:54:07.420172 8651103744 Options.delayed_write_rate : 16777216 -2023/08/16-22:54:07.420174 8651103744 Options.max_total_wal_size: 0 -2023/08/16-22:54:07.420175 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/16-22:54:07.420176 8651103744 Options.stats_dump_period_sec: 600 -2023/08/16-22:54:07.420178 8651103744 Options.stats_persist_period_sec: 600 -2023/08/16-22:54:07.420179 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/16-22:54:07.420181 8651103744 Options.max_open_files: -1 -2023/08/16-22:54:07.420182 8651103744 Options.bytes_per_sync: 0 -2023/08/16-22:54:07.420183 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/16-22:54:07.420184 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/16-22:54:07.420186 8651103744 Options.compaction_readahead_size: 0 -2023/08/16-22:54:07.420187 8651103744 Options.max_background_flushes: -1 -2023/08/16-22:54:07.420188 8651103744 Compression algorithms supported: -2023/08/16-22:54:07.420213 8651103744 kZSTD supported: 1 -2023/08/16-22:54:07.420215 8651103744 kZlibCompression supported: 1 -2023/08/16-22:54:07.420217 8651103744 kXpressCompression supported: 0 -2023/08/16-22:54:07.420218 8651103744 kSnappyCompression supported: 1 -2023/08/16-22:54:07.420219 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/16-22:54:07.420221 8651103744 kLZ4HCCompression supported: 1 -2023/08/16-22:54:07.420222 8651103744 kLZ4Compression supported: 1 -2023/08/16-22:54:07.420223 8651103744 kBZip2Compression supported: 1 -2023/08/16-22:54:07.420238 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/16-22:54:07.420239 8651103744 DMutex implementation: pthread_mutex_t -2023/08/16-22:54:07.420431 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000109 -2023/08/16-22:54:07.420567 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/16-22:54:07.420570 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/16-22:54:07.420572 8651103744 Options.merge_operator: None -2023/08/16-22:54:07.420573 8651103744 Options.compaction_filter: None -2023/08/16-22:54:07.420574 8651103744 Options.compaction_filter_factory: None -2023/08/16-22:54:07.420576 8651103744 Options.sst_partitioner_factory: None -2023/08/16-22:54:07.420577 8651103744 Options.memtable_factory: SkipListFactory -2023/08/16-22:54:07.420579 8651103744 Options.table_factory: BlockBasedTable -2023/08/16-22:54:07.420623 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x6000010841c0) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000025880d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/16-22:54:07.420628 8651103744 Options.write_buffer_size: 67108864 -2023/08/16-22:54:07.420630 8651103744 Options.max_write_buffer_number: 2 -2023/08/16-22:54:07.420631 8651103744 Options.compression: Snappy -2023/08/16-22:54:07.420632 8651103744 Options.bottommost_compression: Disabled -2023/08/16-22:54:07.420634 8651103744 Options.prefix_extractor: nullptr -2023/08/16-22:54:07.420635 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/16-22:54:07.420637 8651103744 Options.num_levels: 7 -2023/08/16-22:54:07.420638 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/16-22:54:07.420639 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/16-22:54:07.420641 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/16-22:54:07.420642 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/16-22:54:07.420643 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/16-22:54:07.420645 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/16-22:54:07.420646 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/16-22:54:07.420647 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/16-22:54:07.420649 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/16-22:54:07.420650 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/16-22:54:07.420651 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-22:54:07.420653 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/16-22:54:07.420654 8651103744 Options.compression_opts.window_bits: -14 -2023/08/16-22:54:07.420655 8651103744 Options.compression_opts.level: 32767 -2023/08/16-22:54:07.420657 8651103744 Options.compression_opts.strategy: 0 -2023/08/16-22:54:07.420658 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/16-22:54:07.420659 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/16-22:54:07.420660 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/16-22:54:07.420662 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/16-22:54:07.420663 8651103744 Options.compression_opts.enabled: false -2023/08/16-22:54:07.420664 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-22:54:07.420666 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/16-22:54:07.420667 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/16-22:54:07.420668 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/16-22:54:07.420669 8651103744 Options.target_file_size_base: 67108864 -2023/08/16-22:54:07.420671 8651103744 Options.target_file_size_multiplier: 1 -2023/08/16-22:54:07.420672 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/16-22:54:07.420673 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/16-22:54:07.420675 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/16-22:54:07.420676 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/16-22:54:07.420678 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/16-22:54:07.420679 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/16-22:54:07.420680 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/16-22:54:07.420682 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/16-22:54:07.420683 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/16-22:54:07.420684 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/16-22:54:07.420685 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/16-22:54:07.420687 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/16-22:54:07.420688 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/16-22:54:07.420689 8651103744 Options.arena_block_size: 1048576 -2023/08/16-22:54:07.420691 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/16-22:54:07.420692 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/16-22:54:07.420694 8651103744 Options.disable_auto_compactions: 0 -2023/08/16-22:54:07.420695 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/16-22:54:07.420697 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/16-22:54:07.420698 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/16-22:54:07.420699 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/16-22:54:07.420701 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/16-22:54:07.420702 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/16-22:54:07.420704 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/16-22:54:07.420707 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/16-22:54:07.420709 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/16-22:54:07.420710 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/16-22:54:07.420712 8651103744 Options.table_properties_collectors: -2023/08/16-22:54:07.420714 8651103744 Options.inplace_update_support: 0 -2023/08/16-22:54:07.420715 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/16-22:54:07.420716 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/16-22:54:07.420718 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/16-22:54:07.420719 8651103744 Options.memtable_huge_page_size: 0 -2023/08/16-22:54:07.420721 8651103744 Options.bloom_locality: 0 -2023/08/16-22:54:07.420722 8651103744 Options.max_successive_merges: 0 -2023/08/16-22:54:07.420723 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/16-22:54:07.420725 8651103744 Options.paranoid_file_checks: 0 -2023/08/16-22:54:07.420726 8651103744 Options.force_consistency_checks: 1 -2023/08/16-22:54:07.420727 8651103744 Options.report_bg_io_stats: 0 -2023/08/16-22:54:07.420728 8651103744 Options.ttl: 2592000 -2023/08/16-22:54:07.420730 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/16-22:54:07.420731 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/16-22:54:07.420732 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/16-22:54:07.420734 8651103744 Options.enable_blob_files: false -2023/08/16-22:54:07.420735 8651103744 Options.min_blob_size: 0 -2023/08/16-22:54:07.420736 8651103744 Options.blob_file_size: 268435456 -2023/08/16-22:54:07.420738 8651103744 Options.blob_compression_type: NoCompression -2023/08/16-22:54:07.420739 8651103744 Options.enable_blob_garbage_collection: false -2023/08/16-22:54:07.420740 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/16-22:54:07.420742 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/16-22:54:07.420744 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/16-22:54:07.420745 8651103744 Options.blob_file_starting_level: 0 -2023/08/16-22:54:07.420746 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/16-22:54:07.421745 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000109 succeeded,manifest_file_number is 109, next_file_number is 111, last_sequence is 23527, log_number is 104,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 104 -2023/08/16-22:54:07.421748 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 104 -2023/08/16-22:54:07.421788 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/16-22:54:07.421900 8651103744 EVENT_LOG_v1 {"time_micros": 1692194047421896, "job": 1, "event": "recovery_started", "wal_files": [108]} -2023/08/16-22:54:07.421902 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #108 mode 2 -2023/08/16-22:54:07.422354 8651103744 EVENT_LOG_v1 {"time_micros": 1692194047422339, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 112, "file_size": 8638, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 23528, "largest_seqno": 23689, "table_properties": {"data_size": 7548, "index_size": 170, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 7344, "raw_average_key_size": 45, "raw_value_size": 9051, "raw_average_value_size": 55, "num_data_blocks": 4, "num_entries": 162, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692194047, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "WLJHG37BR34EQN3KUMHA", "orig_file_number": 112, "seqno_to_time_mapping": "N/A"}} -2023/08/16-22:54:07.422410 8651103744 EVENT_LOG_v1 {"time_micros": 1692194047422409, "job": 1, "event": "recovery_finished"} -2023/08/16-22:54:07.422454 8651103744 [db/version_set.cc:5180] Creating manifest 114 -2023/08/16-22:54:07.424065 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000108.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-22:54:07.424080 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x122f09710 -2023/08/16-22:54:07.424123 8651103744 DB pointer 0x12381c400 -2023/08/16-22:54:07.424166 6163066880 [db/compaction/compaction_job.cc:1988] [default] [JOB 3] Compacting 4@0 + 1@1 files to L1, score 1.00 -2023/08/16-22:54:07.424170 6163066880 [db/compaction/compaction_job.cc:1992] [default]: Compaction start summary: Base version 2 Base level 0, inputs: [112(8638B) 107(6230B) 102(15KB) 97(20KB)], [86(993KB)] -2023/08/16-22:54:07.424177 6163066880 EVENT_LOG_v1 {"time_micros": 1692194047424171, "job": 3, "event": "compaction_started", "compaction_reason": "LevelL0FilesNum", "files_L0": [112, 107, 102, 97], "files_L1": [86], "score": 1, "input_data_size": 1069070, "oldest_snapshot_seqno": -1} -2023/08/16-22:54:07.424335 6164213760 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/16-22:54:07.424390 6164213760 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 4/4 50.33 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 23.4 0.00 0.00 1 0.000 0 0 0.0 0.0 - L1 1/1 993.68 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 5/5 1.02 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 23.4 0.00 0.00 1 0.000 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 23.4 0.00 0.00 1 0.000 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.4 0.00 0.00 1 0.000 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 2.20 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 2.20 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000025880d8#1784 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 8e-06 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** -2023/08/16-22:54:07.438316 6163066880 [db/compaction/compaction_job.cc:1592] [default] [JOB 3] Generated table #117: 22925 keys, 1067676 bytes, temperature: kUnknown -2023/08/16-22:54:07.438349 6163066880 EVENT_LOG_v1 {"time_micros": 1692194047438324, "cf_name": "default", "job": 3, "event": "table_file_creation", "file_number": 117, "file_size": 1067676, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 0, "largest_seqno": 0, "table_properties": {"data_size": 1059623, "index_size": 24739, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 1841623, "raw_average_key_size": 80, "raw_value_size": 999033, "raw_average_value_size": 43, "num_data_blocks": 488, "num_entries": 22925, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692109142, "oldest_key_time": 0, "file_creation_time": 1692194047, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "WLJHG37BR34EQN3KUMHA", "orig_file_number": 117, "seqno_to_time_mapping": "N/A"}} -2023/08/16-22:54:07.438649 6163066880 (Original Log Time 2023/08/16-22:54:07.438505) [db/compaction/compaction_job.cc:1663] [default] [JOB 3] Compacted 4@0 + 1@1 files to L1 => 1067676 bytes -2023/08/16-22:54:07.438652 6163066880 (Original Log Time 2023/08/16-22:54:07.438588) [db/compaction/compaction_job.cc:885] [default] compacted to: files[0 1 0 0 0 0 0] max score 0.00, MB/sec: 75.1 rd, 75.0 wr, level 1, files in(4, 1) out(1 +0 blob) MB in(0.0, 1.0 +0.0 blob) out(1.0 +0.0 blob), read-write-amplify(41.5) write-amplify(20.7) OK, records in: 22927, records dropped: 2 output_compression: Snappy -2023/08/16-22:54:07.438655 6163066880 (Original Log Time 2023/08/16-22:54:07.438608) EVENT_LOG_v1 {"time_micros": 1692194047438595, "job": 3, "event": "compaction_finished", "compaction_time_micros": 14233, "compaction_time_cpu_micros": 13680, "output_level": 1, "num_output_files": 1, "total_output_size": 1067676, "num_input_records": 22927, "num_output_records": 22925, "num_subcompactions": 1, "output_compression": "Snappy", "num_single_delete_mismatches": 0, "num_single_delete_fallthrough": 0, "lsm_state": [0, 1, 0, 0, 0, 0, 0]} -2023/08/16-22:54:07.438753 6163066880 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000112.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-22:54:07.438759 6163066880 EVENT_LOG_v1 {"time_micros": 1692194047438757, "job": 3, "event": "table_file_deletion", "file_number": 112} -2023/08/16-22:54:07.438832 6163066880 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000107.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-22:54:07.438836 6163066880 EVENT_LOG_v1 {"time_micros": 1692194047438834, "job": 3, "event": "table_file_deletion", "file_number": 107} -2023/08/16-22:54:07.438961 6163066880 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000102.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-22:54:07.438965 6163066880 EVENT_LOG_v1 {"time_micros": 1692194047438964, "job": 3, "event": "table_file_deletion", "file_number": 102} -2023/08/16-22:54:07.439254 6163066880 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000097.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-22:54:07.439259 6163066880 EVENT_LOG_v1 {"time_micros": 1692194047439257, "job": 3, "event": "table_file_deletion", "file_number": 97} -2023/08/16-22:54:07.440295 6163066880 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000086.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-22:54:07.440303 6163066880 EVENT_LOG_v1 {"time_micros": 1692194047440300, "job": 3, "event": "table_file_deletion", "file_number": 86} diff --git a/rust/hyperlane_db/LOG.old.1692194380428441 b/rust/hyperlane_db/LOG.old.1692194380428441 deleted file mode 100644 index 94c7a8cd0e..0000000000 --- a/rust/hyperlane_db/LOG.old.1692194380428441 +++ /dev/null @@ -1,286 +0,0 @@ -2023/08/16-22:57:45.437004 8651103744 RocksDB version: 8.1.1 -2023/08/16-22:57:45.437663 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/16-22:57:45.437665 8651103744 DB SUMMARY -2023/08/16-22:57:45.437667 8651103744 DB Session ID: FQR4YOEUEZR81FMTEBEC -2023/08/16-22:57:45.437757 8651103744 CURRENT file: CURRENT -2023/08/16-22:57:45.437759 8651103744 IDENTITY file: IDENTITY -2023/08/16-22:57:45.437776 8651103744 MANIFEST file: MANIFEST-000114 size: 1207 Bytes -2023/08/16-22:57:45.437778 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 1, files: 000117.sst -2023/08/16-22:57:45.437780 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000113.log size: 163033 ; -2023/08/16-22:57:45.437782 8651103744 Options.error_if_exists: 0 -2023/08/16-22:57:45.437784 8651103744 Options.create_if_missing: 1 -2023/08/16-22:57:45.437785 8651103744 Options.paranoid_checks: 1 -2023/08/16-22:57:45.437786 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/16-22:57:45.437787 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/16-22:57:45.437788 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/16-22:57:45.437789 8651103744 Options.env: 0x104c53848 -2023/08/16-22:57:45.437791 8651103744 Options.fs: PosixFileSystem -2023/08/16-22:57:45.437792 8651103744 Options.info_log: 0x11cf05f78 -2023/08/16-22:57:45.437793 8651103744 Options.max_file_opening_threads: 16 -2023/08/16-22:57:45.437794 8651103744 Options.statistics: 0x0 -2023/08/16-22:57:45.437795 8651103744 Options.use_fsync: 0 -2023/08/16-22:57:45.437796 8651103744 Options.max_log_file_size: 0 -2023/08/16-22:57:45.437798 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/16-22:57:45.437799 8651103744 Options.log_file_time_to_roll: 0 -2023/08/16-22:57:45.437800 8651103744 Options.keep_log_file_num: 1000 -2023/08/16-22:57:45.437801 8651103744 Options.recycle_log_file_num: 0 -2023/08/16-22:57:45.437802 8651103744 Options.allow_fallocate: 1 -2023/08/16-22:57:45.437803 8651103744 Options.allow_mmap_reads: 0 -2023/08/16-22:57:45.437804 8651103744 Options.allow_mmap_writes: 0 -2023/08/16-22:57:45.437805 8651103744 Options.use_direct_reads: 0 -2023/08/16-22:57:45.437806 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/16-22:57:45.437807 8651103744 Options.create_missing_column_families: 0 -2023/08/16-22:57:45.437808 8651103744 Options.db_log_dir: -2023/08/16-22:57:45.437809 8651103744 Options.wal_dir: -2023/08/16-22:57:45.437810 8651103744 Options.table_cache_numshardbits: 6 -2023/08/16-22:57:45.437811 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/16-22:57:45.437813 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/16-22:57:45.437814 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/16-22:57:45.437815 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/16-22:57:45.437816 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/16-22:57:45.437817 8651103744 Options.advise_random_on_open: 1 -2023/08/16-22:57:45.437818 8651103744 Options.db_write_buffer_size: 0 -2023/08/16-22:57:45.437819 8651103744 Options.write_buffer_manager: 0x600003080820 -2023/08/16-22:57:45.437820 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/16-22:57:45.437821 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/16-22:57:45.437822 8651103744 Options.use_adaptive_mutex: 0 -2023/08/16-22:57:45.437824 8651103744 Options.rate_limiter: 0x0 -2023/08/16-22:57:45.437825 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/16-22:57:45.437826 8651103744 Options.wal_recovery_mode: 2 -2023/08/16-22:57:45.437827 8651103744 Options.enable_thread_tracking: 0 -2023/08/16-22:57:45.437828 8651103744 Options.enable_pipelined_write: 0 -2023/08/16-22:57:45.437829 8651103744 Options.unordered_write: 0 -2023/08/16-22:57:45.437830 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/16-22:57:45.437831 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/16-22:57:45.437832 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/16-22:57:45.437833 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/16-22:57:45.437834 8651103744 Options.row_cache: None -2023/08/16-22:57:45.437836 8651103744 Options.wal_filter: None -2023/08/16-22:57:45.437837 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/16-22:57:45.437838 8651103744 Options.allow_ingest_behind: 0 -2023/08/16-22:57:45.437839 8651103744 Options.two_write_queues: 0 -2023/08/16-22:57:45.437840 8651103744 Options.manual_wal_flush: 0 -2023/08/16-22:57:45.437841 8651103744 Options.wal_compression: 0 -2023/08/16-22:57:45.437842 8651103744 Options.atomic_flush: 0 -2023/08/16-22:57:45.437843 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/16-22:57:45.437844 8651103744 Options.persist_stats_to_disk: 0 -2023/08/16-22:57:45.437846 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/16-22:57:45.437847 8651103744 Options.log_readahead_size: 0 -2023/08/16-22:57:45.437848 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/16-22:57:45.437849 8651103744 Options.best_efforts_recovery: 0 -2023/08/16-22:57:45.437850 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/16-22:57:45.437851 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/16-22:57:45.437852 8651103744 Options.allow_data_in_errors: 0 -2023/08/16-22:57:45.437853 8651103744 Options.db_host_id: __hostname__ -2023/08/16-22:57:45.437855 8651103744 Options.enforce_single_del_contracts: true -2023/08/16-22:57:45.437856 8651103744 Options.max_background_jobs: 2 -2023/08/16-22:57:45.437857 8651103744 Options.max_background_compactions: -1 -2023/08/16-22:57:45.437858 8651103744 Options.max_subcompactions: 1 -2023/08/16-22:57:45.437859 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/16-22:57:45.437860 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/16-22:57:45.437861 8651103744 Options.delayed_write_rate : 16777216 -2023/08/16-22:57:45.437862 8651103744 Options.max_total_wal_size: 0 -2023/08/16-22:57:45.437864 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/16-22:57:45.437865 8651103744 Options.stats_dump_period_sec: 600 -2023/08/16-22:57:45.437866 8651103744 Options.stats_persist_period_sec: 600 -2023/08/16-22:57:45.437867 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/16-22:57:45.437868 8651103744 Options.max_open_files: -1 -2023/08/16-22:57:45.437869 8651103744 Options.bytes_per_sync: 0 -2023/08/16-22:57:45.437871 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/16-22:57:45.437872 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/16-22:57:45.437873 8651103744 Options.compaction_readahead_size: 0 -2023/08/16-22:57:45.437874 8651103744 Options.max_background_flushes: -1 -2023/08/16-22:57:45.437875 8651103744 Compression algorithms supported: -2023/08/16-22:57:45.437896 8651103744 kZSTD supported: 1 -2023/08/16-22:57:45.437897 8651103744 kZlibCompression supported: 1 -2023/08/16-22:57:45.437898 8651103744 kXpressCompression supported: 0 -2023/08/16-22:57:45.437899 8651103744 kSnappyCompression supported: 1 -2023/08/16-22:57:45.437900 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/16-22:57:45.437902 8651103744 kLZ4HCCompression supported: 1 -2023/08/16-22:57:45.437903 8651103744 kLZ4Compression supported: 1 -2023/08/16-22:57:45.437904 8651103744 kBZip2Compression supported: 1 -2023/08/16-22:57:45.437915 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/16-22:57:45.437916 8651103744 DMutex implementation: pthread_mutex_t -2023/08/16-22:57:45.438230 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000114 -2023/08/16-22:57:45.438324 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/16-22:57:45.438325 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/16-22:57:45.438326 8651103744 Options.merge_operator: None -2023/08/16-22:57:45.438327 8651103744 Options.compaction_filter: None -2023/08/16-22:57:45.438327 8651103744 Options.compaction_filter_factory: None -2023/08/16-22:57:45.438328 8651103744 Options.sst_partitioner_factory: None -2023/08/16-22:57:45.438328 8651103744 Options.memtable_factory: SkipListFactory -2023/08/16-22:57:45.438329 8651103744 Options.table_factory: BlockBasedTable -2023/08/16-22:57:45.438353 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600000b94640) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x600003e800d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/16-22:57:45.438357 8651103744 Options.write_buffer_size: 67108864 -2023/08/16-22:57:45.438358 8651103744 Options.max_write_buffer_number: 2 -2023/08/16-22:57:45.438358 8651103744 Options.compression: Snappy -2023/08/16-22:57:45.438359 8651103744 Options.bottommost_compression: Disabled -2023/08/16-22:57:45.438359 8651103744 Options.prefix_extractor: nullptr -2023/08/16-22:57:45.438360 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/16-22:57:45.438361 8651103744 Options.num_levels: 7 -2023/08/16-22:57:45.438361 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/16-22:57:45.438362 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/16-22:57:45.438362 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/16-22:57:45.438363 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/16-22:57:45.438364 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/16-22:57:45.438364 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/16-22:57:45.438365 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/16-22:57:45.438365 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/16-22:57:45.438366 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/16-22:57:45.438367 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/16-22:57:45.438367 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-22:57:45.438368 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/16-22:57:45.438368 8651103744 Options.compression_opts.window_bits: -14 -2023/08/16-22:57:45.438369 8651103744 Options.compression_opts.level: 32767 -2023/08/16-22:57:45.438370 8651103744 Options.compression_opts.strategy: 0 -2023/08/16-22:57:45.438370 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/16-22:57:45.438371 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/16-22:57:45.438371 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/16-22:57:45.438372 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/16-22:57:45.438372 8651103744 Options.compression_opts.enabled: false -2023/08/16-22:57:45.438373 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-22:57:45.438374 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/16-22:57:45.438374 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/16-22:57:45.438375 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/16-22:57:45.438375 8651103744 Options.target_file_size_base: 67108864 -2023/08/16-22:57:45.438376 8651103744 Options.target_file_size_multiplier: 1 -2023/08/16-22:57:45.438376 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/16-22:57:45.438377 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/16-22:57:45.438377 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/16-22:57:45.438378 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/16-22:57:45.438379 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/16-22:57:45.438379 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/16-22:57:45.438380 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/16-22:57:45.438381 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/16-22:57:45.438381 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/16-22:57:45.438382 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/16-22:57:45.438382 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/16-22:57:45.438383 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/16-22:57:45.438383 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/16-22:57:45.438384 8651103744 Options.arena_block_size: 1048576 -2023/08/16-22:57:45.438384 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/16-22:57:45.438385 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/16-22:57:45.438386 8651103744 Options.disable_auto_compactions: 0 -2023/08/16-22:57:45.438386 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/16-22:57:45.438387 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/16-22:57:45.438388 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/16-22:57:45.438388 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/16-22:57:45.438389 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/16-22:57:45.438389 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/16-22:57:45.438390 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/16-22:57:45.438393 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/16-22:57:45.438394 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/16-22:57:45.438395 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/16-22:57:45.438397 8651103744 Options.table_properties_collectors: -2023/08/16-22:57:45.438398 8651103744 Options.inplace_update_support: 0 -2023/08/16-22:57:45.438399 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/16-22:57:45.438401 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/16-22:57:45.438402 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/16-22:57:45.438403 8651103744 Options.memtable_huge_page_size: 0 -2023/08/16-22:57:45.438404 8651103744 Options.bloom_locality: 0 -2023/08/16-22:57:45.438405 8651103744 Options.max_successive_merges: 0 -2023/08/16-22:57:45.438406 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/16-22:57:45.438407 8651103744 Options.paranoid_file_checks: 0 -2023/08/16-22:57:45.438408 8651103744 Options.force_consistency_checks: 1 -2023/08/16-22:57:45.438409 8651103744 Options.report_bg_io_stats: 0 -2023/08/16-22:57:45.438410 8651103744 Options.ttl: 2592000 -2023/08/16-22:57:45.438411 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/16-22:57:45.438412 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/16-22:57:45.438413 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/16-22:57:45.438414 8651103744 Options.enable_blob_files: false -2023/08/16-22:57:45.438416 8651103744 Options.min_blob_size: 0 -2023/08/16-22:57:45.438417 8651103744 Options.blob_file_size: 268435456 -2023/08/16-22:57:45.438418 8651103744 Options.blob_compression_type: NoCompression -2023/08/16-22:57:45.438419 8651103744 Options.enable_blob_garbage_collection: false -2023/08/16-22:57:45.438420 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/16-22:57:45.438421 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/16-22:57:45.438423 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/16-22:57:45.438424 8651103744 Options.blob_file_starting_level: 0 -2023/08/16-22:57:45.438425 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/16-22:57:45.439233 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000114 succeeded,manifest_file_number is 114, next_file_number is 119, last_sequence is 23689, log_number is 109,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 109 -2023/08/16-22:57:45.439235 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 109 -2023/08/16-22:57:45.439402 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/16-22:57:45.439487 8651103744 EVENT_LOG_v1 {"time_micros": 1692194265439480, "job": 1, "event": "recovery_started", "wal_files": [113]} -2023/08/16-22:57:45.439488 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #113 mode 2 -2023/08/16-22:57:45.441170 8651103744 EVENT_LOG_v1 {"time_micros": 1692194265441157, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 120, "file_size": 65433, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 23690, "largest_seqno": 25176, "table_properties": {"data_size": 63987, "index_size": 911, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 67422, "raw_average_key_size": 45, "raw_value_size": 74723, "raw_average_value_size": 50, "num_data_blocks": 28, "num_entries": 1487, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692194265, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "FQR4YOEUEZR81FMTEBEC", "orig_file_number": 120, "seqno_to_time_mapping": "N/A"}} -2023/08/16-22:57:45.441210 8651103744 EVENT_LOG_v1 {"time_micros": 1692194265441209, "job": 1, "event": "recovery_finished"} -2023/08/16-22:57:45.441250 8651103744 [db/version_set.cc:5180] Creating manifest 122 -2023/08/16-22:57:45.442471 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000113.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-22:57:45.442486 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x11cf060d0 -2023/08/16-22:57:45.442541 8651103744 DB pointer 0x11d808200 -2023/08/16-22:57:45.442711 6129643520 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/16-22:57:45.442715 6129643520 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 1/0 63.90 KB 0.2 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 94.8 0.00 0.00 1 0.001 0 0 0.0 0.0 - L1 1/0 1.02 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 2/0 1.08 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 94.8 0.00 0.00 1 0.001 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 94.8 0.00 0.00 1 0.001 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 94.8 0.00 0.00 1 0.001 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 14.28 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 14.28 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x600003e800d8#1898 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 1.1e-05 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692198883938429 b/rust/hyperlane_db/LOG.old.1692198883938429 deleted file mode 100644 index 8fc000fe3a..0000000000 --- a/rust/hyperlane_db/LOG.old.1692198883938429 +++ /dev/null @@ -1,286 +0,0 @@ -2023/08/16-22:59:40.429146 8651103744 RocksDB version: 8.1.1 -2023/08/16-22:59:40.430033 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/16-22:59:40.430037 8651103744 DB SUMMARY -2023/08/16-22:59:40.430039 8651103744 DB Session ID: XCLFO9HHL5QRMVTCSXGW -2023/08/16-22:59:40.430213 8651103744 CURRENT file: CURRENT -2023/08/16-22:59:40.430215 8651103744 IDENTITY file: IDENTITY -2023/08/16-22:59:40.430237 8651103744 MANIFEST file: MANIFEST-000122 size: 468 Bytes -2023/08/16-22:59:40.430239 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 2, files: 000117.sst 000120.sst -2023/08/16-22:59:40.430241 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000121.log size: 32124 ; -2023/08/16-22:59:40.430244 8651103744 Options.error_if_exists: 0 -2023/08/16-22:59:40.430246 8651103744 Options.create_if_missing: 1 -2023/08/16-22:59:40.430247 8651103744 Options.paranoid_checks: 1 -2023/08/16-22:59:40.430249 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/16-22:59:40.430250 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/16-22:59:40.430251 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/16-22:59:40.430253 8651103744 Options.env: 0x1029df868 -2023/08/16-22:59:40.430254 8651103744 Options.fs: PosixFileSystem -2023/08/16-22:59:40.430256 8651103744 Options.info_log: 0x14c104098 -2023/08/16-22:59:40.430257 8651103744 Options.max_file_opening_threads: 16 -2023/08/16-22:59:40.430258 8651103744 Options.statistics: 0x0 -2023/08/16-22:59:40.430260 8651103744 Options.use_fsync: 0 -2023/08/16-22:59:40.430261 8651103744 Options.max_log_file_size: 0 -2023/08/16-22:59:40.430263 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/16-22:59:40.430264 8651103744 Options.log_file_time_to_roll: 0 -2023/08/16-22:59:40.430265 8651103744 Options.keep_log_file_num: 1000 -2023/08/16-22:59:40.430267 8651103744 Options.recycle_log_file_num: 0 -2023/08/16-22:59:40.430268 8651103744 Options.allow_fallocate: 1 -2023/08/16-22:59:40.430269 8651103744 Options.allow_mmap_reads: 0 -2023/08/16-22:59:40.430270 8651103744 Options.allow_mmap_writes: 0 -2023/08/16-22:59:40.430272 8651103744 Options.use_direct_reads: 0 -2023/08/16-22:59:40.430273 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/16-22:59:40.430274 8651103744 Options.create_missing_column_families: 0 -2023/08/16-22:59:40.430275 8651103744 Options.db_log_dir: -2023/08/16-22:59:40.430277 8651103744 Options.wal_dir: -2023/08/16-22:59:40.430278 8651103744 Options.table_cache_numshardbits: 6 -2023/08/16-22:59:40.430279 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/16-22:59:40.430281 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/16-22:59:40.430282 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/16-22:59:40.430283 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/16-22:59:40.430285 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/16-22:59:40.430286 8651103744 Options.advise_random_on_open: 1 -2023/08/16-22:59:40.430287 8651103744 Options.db_write_buffer_size: 0 -2023/08/16-22:59:40.430289 8651103744 Options.write_buffer_manager: 0x600003f78000 -2023/08/16-22:59:40.430290 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/16-22:59:40.430291 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/16-22:59:40.430293 8651103744 Options.use_adaptive_mutex: 0 -2023/08/16-22:59:40.430294 8651103744 Options.rate_limiter: 0x0 -2023/08/16-22:59:40.430295 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/16-22:59:40.430297 8651103744 Options.wal_recovery_mode: 2 -2023/08/16-22:59:40.430298 8651103744 Options.enable_thread_tracking: 0 -2023/08/16-22:59:40.430299 8651103744 Options.enable_pipelined_write: 0 -2023/08/16-22:59:40.430301 8651103744 Options.unordered_write: 0 -2023/08/16-22:59:40.430302 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/16-22:59:40.430303 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/16-22:59:40.430304 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/16-22:59:40.430306 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/16-22:59:40.430307 8651103744 Options.row_cache: None -2023/08/16-22:59:40.430308 8651103744 Options.wal_filter: None -2023/08/16-22:59:40.430310 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/16-22:59:40.430311 8651103744 Options.allow_ingest_behind: 0 -2023/08/16-22:59:40.430312 8651103744 Options.two_write_queues: 0 -2023/08/16-22:59:40.430314 8651103744 Options.manual_wal_flush: 0 -2023/08/16-22:59:40.430315 8651103744 Options.wal_compression: 0 -2023/08/16-22:59:40.430316 8651103744 Options.atomic_flush: 0 -2023/08/16-22:59:40.430317 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/16-22:59:40.430319 8651103744 Options.persist_stats_to_disk: 0 -2023/08/16-22:59:40.430320 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/16-22:59:40.430321 8651103744 Options.log_readahead_size: 0 -2023/08/16-22:59:40.430323 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/16-22:59:40.430324 8651103744 Options.best_efforts_recovery: 0 -2023/08/16-22:59:40.430326 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/16-22:59:40.430327 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/16-22:59:40.430328 8651103744 Options.allow_data_in_errors: 0 -2023/08/16-22:59:40.430330 8651103744 Options.db_host_id: __hostname__ -2023/08/16-22:59:40.430331 8651103744 Options.enforce_single_del_contracts: true -2023/08/16-22:59:40.430332 8651103744 Options.max_background_jobs: 2 -2023/08/16-22:59:40.430333 8651103744 Options.max_background_compactions: -1 -2023/08/16-22:59:40.430335 8651103744 Options.max_subcompactions: 1 -2023/08/16-22:59:40.430336 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/16-22:59:40.430337 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/16-22:59:40.430339 8651103744 Options.delayed_write_rate : 16777216 -2023/08/16-22:59:40.430340 8651103744 Options.max_total_wal_size: 0 -2023/08/16-22:59:40.430341 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/16-22:59:40.430343 8651103744 Options.stats_dump_period_sec: 600 -2023/08/16-22:59:40.430344 8651103744 Options.stats_persist_period_sec: 600 -2023/08/16-22:59:40.430346 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/16-22:59:40.430347 8651103744 Options.max_open_files: -1 -2023/08/16-22:59:40.430348 8651103744 Options.bytes_per_sync: 0 -2023/08/16-22:59:40.430350 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/16-22:59:40.430351 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/16-22:59:40.430352 8651103744 Options.compaction_readahead_size: 0 -2023/08/16-22:59:40.430353 8651103744 Options.max_background_flushes: -1 -2023/08/16-22:59:40.430355 8651103744 Compression algorithms supported: -2023/08/16-22:59:40.430380 8651103744 kZSTD supported: 1 -2023/08/16-22:59:40.430382 8651103744 kZlibCompression supported: 1 -2023/08/16-22:59:40.430383 8651103744 kXpressCompression supported: 0 -2023/08/16-22:59:40.430384 8651103744 kSnappyCompression supported: 1 -2023/08/16-22:59:40.430386 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/16-22:59:40.430387 8651103744 kLZ4HCCompression supported: 1 -2023/08/16-22:59:40.430389 8651103744 kLZ4Compression supported: 1 -2023/08/16-22:59:40.430390 8651103744 kBZip2Compression supported: 1 -2023/08/16-22:59:40.430402 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/16-22:59:40.430404 8651103744 DMutex implementation: pthread_mutex_t -2023/08/16-22:59:40.430792 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000122 -2023/08/16-22:59:40.430894 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/16-22:59:40.430896 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/16-22:59:40.430897 8651103744 Options.merge_operator: None -2023/08/16-22:59:40.430897 8651103744 Options.compaction_filter: None -2023/08/16-22:59:40.430898 8651103744 Options.compaction_filter_factory: None -2023/08/16-22:59:40.430899 8651103744 Options.sst_partitioner_factory: None -2023/08/16-22:59:40.430899 8651103744 Options.memtable_factory: SkipListFactory -2023/08/16-22:59:40.430900 8651103744 Options.table_factory: BlockBasedTable -2023/08/16-22:59:40.430929 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x60000047d140) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000031740d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/16-22:59:40.430931 8651103744 Options.write_buffer_size: 67108864 -2023/08/16-22:59:40.430932 8651103744 Options.max_write_buffer_number: 2 -2023/08/16-22:59:40.430933 8651103744 Options.compression: Snappy -2023/08/16-22:59:40.430934 8651103744 Options.bottommost_compression: Disabled -2023/08/16-22:59:40.430934 8651103744 Options.prefix_extractor: nullptr -2023/08/16-22:59:40.430935 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/16-22:59:40.430936 8651103744 Options.num_levels: 7 -2023/08/16-22:59:40.430936 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/16-22:59:40.430937 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/16-22:59:40.430938 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/16-22:59:40.430938 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/16-22:59:40.430939 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/16-22:59:40.430940 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/16-22:59:40.430940 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/16-22:59:40.430941 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/16-22:59:40.430942 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/16-22:59:40.430942 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/16-22:59:40.430943 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-22:59:40.430944 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/16-22:59:40.430944 8651103744 Options.compression_opts.window_bits: -14 -2023/08/16-22:59:40.430945 8651103744 Options.compression_opts.level: 32767 -2023/08/16-22:59:40.430945 8651103744 Options.compression_opts.strategy: 0 -2023/08/16-22:59:40.430946 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/16-22:59:40.430947 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/16-22:59:40.430947 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/16-22:59:40.430948 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/16-22:59:40.430949 8651103744 Options.compression_opts.enabled: false -2023/08/16-22:59:40.430949 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/16-22:59:40.430950 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/16-22:59:40.430951 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/16-22:59:40.430951 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/16-22:59:40.430952 8651103744 Options.target_file_size_base: 67108864 -2023/08/16-22:59:40.430952 8651103744 Options.target_file_size_multiplier: 1 -2023/08/16-22:59:40.430953 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/16-22:59:40.430954 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/16-22:59:40.430954 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/16-22:59:40.430955 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/16-22:59:40.430956 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/16-22:59:40.430957 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/16-22:59:40.430957 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/16-22:59:40.430958 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/16-22:59:40.430959 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/16-22:59:40.430959 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/16-22:59:40.430960 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/16-22:59:40.430960 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/16-22:59:40.430961 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/16-22:59:40.430962 8651103744 Options.arena_block_size: 1048576 -2023/08/16-22:59:40.430962 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/16-22:59:40.430963 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/16-22:59:40.430964 8651103744 Options.disable_auto_compactions: 0 -2023/08/16-22:59:40.430965 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/16-22:59:40.430966 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/16-22:59:40.430966 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/16-22:59:40.430967 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/16-22:59:40.430968 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/16-22:59:40.430968 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/16-22:59:40.430969 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/16-22:59:40.430971 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/16-22:59:40.430972 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/16-22:59:40.430972 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/16-22:59:40.430973 8651103744 Options.table_properties_collectors: -2023/08/16-22:59:40.430974 8651103744 Options.inplace_update_support: 0 -2023/08/16-22:59:40.430975 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/16-22:59:40.430975 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/16-22:59:40.430976 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/16-22:59:40.430977 8651103744 Options.memtable_huge_page_size: 0 -2023/08/16-22:59:40.430978 8651103744 Options.bloom_locality: 0 -2023/08/16-22:59:40.430978 8651103744 Options.max_successive_merges: 0 -2023/08/16-22:59:40.430979 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/16-22:59:40.430979 8651103744 Options.paranoid_file_checks: 0 -2023/08/16-22:59:40.430980 8651103744 Options.force_consistency_checks: 1 -2023/08/16-22:59:40.430981 8651103744 Options.report_bg_io_stats: 0 -2023/08/16-22:59:40.430981 8651103744 Options.ttl: 2592000 -2023/08/16-22:59:40.430982 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/16-22:59:40.430983 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/16-22:59:40.430983 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/16-22:59:40.430984 8651103744 Options.enable_blob_files: false -2023/08/16-22:59:40.430985 8651103744 Options.min_blob_size: 0 -2023/08/16-22:59:40.430985 8651103744 Options.blob_file_size: 268435456 -2023/08/16-22:59:40.430986 8651103744 Options.blob_compression_type: NoCompression -2023/08/16-22:59:40.430987 8651103744 Options.enable_blob_garbage_collection: false -2023/08/16-22:59:40.430987 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/16-22:59:40.430988 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/16-22:59:40.430989 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/16-22:59:40.430989 8651103744 Options.blob_file_starting_level: 0 -2023/08/16-22:59:40.430990 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/16-22:59:40.432185 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000122 succeeded,manifest_file_number is 122, next_file_number is 124, last_sequence is 25176, log_number is 114,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 114 -2023/08/16-22:59:40.432189 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 114 -2023/08/16-22:59:40.432349 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/16-22:59:40.432472 8651103744 EVENT_LOG_v1 {"time_micros": 1692194380432468, "job": 1, "event": "recovery_started", "wal_files": [121]} -2023/08/16-22:59:40.432474 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #121 mode 2 -2023/08/16-22:59:40.433214 8651103744 EVENT_LOG_v1 {"time_micros": 1692194380433189, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 125, "file_size": 13828, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 25177, "largest_seqno": 25494, "table_properties": {"data_size": 12730, "index_size": 208, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 14416, "raw_average_key_size": 45, "raw_value_size": 13252, "raw_average_value_size": 41, "num_data_blocks": 6, "num_entries": 318, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692194380, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "XCLFO9HHL5QRMVTCSXGW", "orig_file_number": 125, "seqno_to_time_mapping": "N/A"}} -2023/08/16-22:59:40.433298 8651103744 EVENT_LOG_v1 {"time_micros": 1692194380433296, "job": 1, "event": "recovery_finished"} -2023/08/16-22:59:40.433373 8651103744 [db/version_set.cc:5180] Creating manifest 127 -2023/08/16-22:59:40.434888 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000121.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/16-22:59:40.434900 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x14c1041f0 -2023/08/16-22:59:40.434940 8651103744 DB pointer 0x14d008200 -2023/08/16-22:59:40.435053 6165770240 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/16-22:59:40.435056 6165770240 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 2/0 77.40 KB 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 31.0 0.00 0.00 1 0.000 0 0 0.0 0.0 - L1 1/0 1.02 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 3/0 1.09 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 31.0 0.00 0.00 1 0.000 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 31.0 0.00 0.00 1 0.000 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 31.0 0.00 0.00 1 0.000 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 3.18 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 3.18 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000031740d8#1959 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 8e-06 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692199165312346 b/rust/hyperlane_db/LOG.old.1692199165312346 deleted file mode 100644 index 3064197bdb..0000000000 --- a/rust/hyperlane_db/LOG.old.1692199165312346 +++ /dev/null @@ -1,286 +0,0 @@ -2023/08/17-00:14:43.939313 8651103744 RocksDB version: 8.1.1 -2023/08/17-00:14:43.940147 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/17-00:14:43.940150 8651103744 DB SUMMARY -2023/08/17-00:14:43.940151 8651103744 DB Session ID: JF2ZRSGI1CZFSMPB1N1R -2023/08/17-00:14:43.940254 8651103744 CURRENT file: CURRENT -2023/08/17-00:14:43.940256 8651103744 IDENTITY file: IDENTITY -2023/08/17-00:14:43.940271 8651103744 MANIFEST file: MANIFEST-000127 size: 635 Bytes -2023/08/17-00:14:43.940284 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 3, files: 000117.sst 000120.sst 000125.sst -2023/08/17-00:14:43.940286 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000126.log size: 116015 ; -2023/08/17-00:14:43.940288 8651103744 Options.error_if_exists: 0 -2023/08/17-00:14:43.940289 8651103744 Options.create_if_missing: 1 -2023/08/17-00:14:43.940290 8651103744 Options.paranoid_checks: 1 -2023/08/17-00:14:43.940291 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/17-00:14:43.940292 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/17-00:14:43.940293 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/17-00:14:43.940294 8651103744 Options.env: 0x1096d16e0 -2023/08/17-00:14:43.940295 8651103744 Options.fs: PosixFileSystem -2023/08/17-00:14:43.940297 8651103744 Options.info_log: 0x123704098 -2023/08/17-00:14:43.940297 8651103744 Options.max_file_opening_threads: 16 -2023/08/17-00:14:43.940298 8651103744 Options.statistics: 0x0 -2023/08/17-00:14:43.940299 8651103744 Options.use_fsync: 0 -2023/08/17-00:14:43.940300 8651103744 Options.max_log_file_size: 0 -2023/08/17-00:14:43.940301 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/17-00:14:43.940302 8651103744 Options.log_file_time_to_roll: 0 -2023/08/17-00:14:43.940303 8651103744 Options.keep_log_file_num: 1000 -2023/08/17-00:14:43.940304 8651103744 Options.recycle_log_file_num: 0 -2023/08/17-00:14:43.940305 8651103744 Options.allow_fallocate: 1 -2023/08/17-00:14:43.940306 8651103744 Options.allow_mmap_reads: 0 -2023/08/17-00:14:43.940307 8651103744 Options.allow_mmap_writes: 0 -2023/08/17-00:14:43.940308 8651103744 Options.use_direct_reads: 0 -2023/08/17-00:14:43.940309 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/17-00:14:43.940310 8651103744 Options.create_missing_column_families: 0 -2023/08/17-00:14:43.940311 8651103744 Options.db_log_dir: -2023/08/17-00:14:43.940312 8651103744 Options.wal_dir: -2023/08/17-00:14:43.940313 8651103744 Options.table_cache_numshardbits: 6 -2023/08/17-00:14:43.940314 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/17-00:14:43.940315 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/17-00:14:43.940316 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/17-00:14:43.940317 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/17-00:14:43.940318 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/17-00:14:43.940318 8651103744 Options.advise_random_on_open: 1 -2023/08/17-00:14:43.940319 8651103744 Options.db_write_buffer_size: 0 -2023/08/17-00:14:43.940320 8651103744 Options.write_buffer_manager: 0x600002404000 -2023/08/17-00:14:43.940321 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/17-00:14:43.940322 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/17-00:14:43.940323 8651103744 Options.use_adaptive_mutex: 0 -2023/08/17-00:14:43.940324 8651103744 Options.rate_limiter: 0x0 -2023/08/17-00:14:43.940326 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/17-00:14:43.940326 8651103744 Options.wal_recovery_mode: 2 -2023/08/17-00:14:43.940327 8651103744 Options.enable_thread_tracking: 0 -2023/08/17-00:14:43.940328 8651103744 Options.enable_pipelined_write: 0 -2023/08/17-00:14:43.940329 8651103744 Options.unordered_write: 0 -2023/08/17-00:14:43.940330 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/17-00:14:43.940331 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/17-00:14:43.940332 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/17-00:14:43.940333 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/17-00:14:43.940334 8651103744 Options.row_cache: None -2023/08/17-00:14:43.940335 8651103744 Options.wal_filter: None -2023/08/17-00:14:43.940336 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/17-00:14:43.940337 8651103744 Options.allow_ingest_behind: 0 -2023/08/17-00:14:43.940338 8651103744 Options.two_write_queues: 0 -2023/08/17-00:14:43.940338 8651103744 Options.manual_wal_flush: 0 -2023/08/17-00:14:43.940339 8651103744 Options.wal_compression: 0 -2023/08/17-00:14:43.940340 8651103744 Options.atomic_flush: 0 -2023/08/17-00:14:43.940341 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/17-00:14:43.940342 8651103744 Options.persist_stats_to_disk: 0 -2023/08/17-00:14:43.940343 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/17-00:14:43.940344 8651103744 Options.log_readahead_size: 0 -2023/08/17-00:14:43.940345 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/17-00:14:43.940346 8651103744 Options.best_efforts_recovery: 0 -2023/08/17-00:14:43.940347 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/17-00:14:43.940348 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/17-00:14:43.940349 8651103744 Options.allow_data_in_errors: 0 -2023/08/17-00:14:43.940350 8651103744 Options.db_host_id: __hostname__ -2023/08/17-00:14:43.940351 8651103744 Options.enforce_single_del_contracts: true -2023/08/17-00:14:43.940352 8651103744 Options.max_background_jobs: 2 -2023/08/17-00:14:43.940352 8651103744 Options.max_background_compactions: -1 -2023/08/17-00:14:43.940353 8651103744 Options.max_subcompactions: 1 -2023/08/17-00:14:43.940354 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/17-00:14:43.940355 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/17-00:14:43.940356 8651103744 Options.delayed_write_rate : 16777216 -2023/08/17-00:14:43.940357 8651103744 Options.max_total_wal_size: 0 -2023/08/17-00:14:43.940358 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/17-00:14:43.940359 8651103744 Options.stats_dump_period_sec: 600 -2023/08/17-00:14:43.940360 8651103744 Options.stats_persist_period_sec: 600 -2023/08/17-00:14:43.940361 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/17-00:14:43.940362 8651103744 Options.max_open_files: -1 -2023/08/17-00:14:43.940363 8651103744 Options.bytes_per_sync: 0 -2023/08/17-00:14:43.940364 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/17-00:14:43.940365 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/17-00:14:43.940366 8651103744 Options.compaction_readahead_size: 0 -2023/08/17-00:14:43.940366 8651103744 Options.max_background_flushes: -1 -2023/08/17-00:14:43.940367 8651103744 Compression algorithms supported: -2023/08/17-00:14:43.940381 8651103744 kZSTD supported: 1 -2023/08/17-00:14:43.940382 8651103744 kZlibCompression supported: 1 -2023/08/17-00:14:43.940383 8651103744 kXpressCompression supported: 0 -2023/08/17-00:14:43.940384 8651103744 kSnappyCompression supported: 1 -2023/08/17-00:14:43.940385 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/17-00:14:43.940387 8651103744 kLZ4HCCompression supported: 1 -2023/08/17-00:14:43.940388 8651103744 kLZ4Compression supported: 1 -2023/08/17-00:14:43.940389 8651103744 kBZip2Compression supported: 1 -2023/08/17-00:14:43.940394 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/17-00:14:43.940396 8651103744 DMutex implementation: pthread_mutex_t -2023/08/17-00:14:43.940673 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000127 -2023/08/17-00:14:43.940911 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/17-00:14:43.940914 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/17-00:14:43.940915 8651103744 Options.merge_operator: None -2023/08/17-00:14:43.940916 8651103744 Options.compaction_filter: None -2023/08/17-00:14:43.940917 8651103744 Options.compaction_filter_factory: None -2023/08/17-00:14:43.940918 8651103744 Options.sst_partitioner_factory: None -2023/08/17-00:14:43.940919 8651103744 Options.memtable_factory: SkipListFactory -2023/08/17-00:14:43.940920 8651103744 Options.table_factory: BlockBasedTable -2023/08/17-00:14:43.940932 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600001f0c640) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x600002a006d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/17-00:14:43.940934 8651103744 Options.write_buffer_size: 67108864 -2023/08/17-00:14:43.940935 8651103744 Options.max_write_buffer_number: 2 -2023/08/17-00:14:43.940936 8651103744 Options.compression: Snappy -2023/08/17-00:14:43.940937 8651103744 Options.bottommost_compression: Disabled -2023/08/17-00:14:43.940938 8651103744 Options.prefix_extractor: nullptr -2023/08/17-00:14:43.940939 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/17-00:14:43.940940 8651103744 Options.num_levels: 7 -2023/08/17-00:14:43.940941 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/17-00:14:43.940942 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/17-00:14:43.940943 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/17-00:14:43.940944 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/17-00:14:43.940945 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/17-00:14:43.940946 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/17-00:14:43.940947 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/17-00:14:43.940948 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/17-00:14:43.940949 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/17-00:14:43.940950 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/17-00:14:43.940951 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/17-00:14:43.940952 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/17-00:14:43.940952 8651103744 Options.compression_opts.window_bits: -14 -2023/08/17-00:14:43.940953 8651103744 Options.compression_opts.level: 32767 -2023/08/17-00:14:43.940954 8651103744 Options.compression_opts.strategy: 0 -2023/08/17-00:14:43.940955 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/17-00:14:43.940956 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/17-00:14:43.940957 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/17-00:14:43.940958 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/17-00:14:43.940959 8651103744 Options.compression_opts.enabled: false -2023/08/17-00:14:43.940960 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/17-00:14:43.940961 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/17-00:14:43.940962 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/17-00:14:43.940963 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/17-00:14:43.940964 8651103744 Options.target_file_size_base: 67108864 -2023/08/17-00:14:43.940965 8651103744 Options.target_file_size_multiplier: 1 -2023/08/17-00:14:43.940966 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/17-00:14:43.940967 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/17-00:14:43.940968 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/17-00:14:43.940969 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/17-00:14:43.940970 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/17-00:14:43.940971 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/17-00:14:43.940972 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/17-00:14:43.940973 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/17-00:14:43.940974 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/17-00:14:43.940975 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/17-00:14:43.940976 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/17-00:14:43.940977 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/17-00:14:43.940977 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/17-00:14:43.940978 8651103744 Options.arena_block_size: 1048576 -2023/08/17-00:14:43.940979 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/17-00:14:43.940980 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/17-00:14:43.940981 8651103744 Options.disable_auto_compactions: 0 -2023/08/17-00:14:43.940983 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/17-00:14:43.940985 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/17-00:14:43.940986 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/17-00:14:43.940987 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/17-00:14:43.940988 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/17-00:14:43.940989 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/17-00:14:43.940990 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/17-00:14:43.940993 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/17-00:14:43.940994 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/17-00:14:43.940995 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/17-00:14:43.940996 8651103744 Options.table_properties_collectors: -2023/08/17-00:14:43.940997 8651103744 Options.inplace_update_support: 0 -2023/08/17-00:14:43.940998 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/17-00:14:43.940999 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/17-00:14:43.941000 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/17-00:14:43.941001 8651103744 Options.memtable_huge_page_size: 0 -2023/08/17-00:14:43.941002 8651103744 Options.bloom_locality: 0 -2023/08/17-00:14:43.941003 8651103744 Options.max_successive_merges: 0 -2023/08/17-00:14:43.941004 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/17-00:14:43.941005 8651103744 Options.paranoid_file_checks: 0 -2023/08/17-00:14:43.941006 8651103744 Options.force_consistency_checks: 1 -2023/08/17-00:14:43.941007 8651103744 Options.report_bg_io_stats: 0 -2023/08/17-00:14:43.941008 8651103744 Options.ttl: 2592000 -2023/08/17-00:14:43.941009 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/17-00:14:43.941010 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/17-00:14:43.941010 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/17-00:14:43.941011 8651103744 Options.enable_blob_files: false -2023/08/17-00:14:43.941012 8651103744 Options.min_blob_size: 0 -2023/08/17-00:14:43.941013 8651103744 Options.blob_file_size: 268435456 -2023/08/17-00:14:43.941014 8651103744 Options.blob_compression_type: NoCompression -2023/08/17-00:14:43.941015 8651103744 Options.enable_blob_garbage_collection: false -2023/08/17-00:14:43.941016 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/17-00:14:43.941017 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/17-00:14:43.941018 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/17-00:14:43.941019 8651103744 Options.blob_file_starting_level: 0 -2023/08/17-00:14:43.941020 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/17-00:14:43.942281 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000127 succeeded,manifest_file_number is 127, next_file_number is 129, last_sequence is 25494, log_number is 122,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 122 -2023/08/17-00:14:43.942283 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 122 -2023/08/17-00:14:43.942469 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/17-00:14:43.942677 8651103744 EVENT_LOG_v1 {"time_micros": 1692198883942672, "job": 1, "event": "recovery_started", "wal_files": [126]} -2023/08/17-00:14:43.942680 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #126 mode 2 -2023/08/17-00:14:43.949274 8651103744 EVENT_LOG_v1 {"time_micros": 1692198883949253, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 130, "file_size": 45749, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 25495, "largest_seqno": 26433, "table_properties": {"data_size": 44425, "index_size": 618, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 42568, "raw_average_key_size": 45, "raw_value_size": 60245, "raw_average_value_size": 64, "num_data_blocks": 20, "num_entries": 939, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692198883, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "JF2ZRSGI1CZFSMPB1N1R", "orig_file_number": 130, "seqno_to_time_mapping": "N/A"}} -2023/08/17-00:14:43.949349 8651103744 EVENT_LOG_v1 {"time_micros": 1692198883949347, "job": 1, "event": "recovery_finished"} -2023/08/17-00:14:43.949600 8651103744 [db/version_set.cc:5180] Creating manifest 132 -2023/08/17-00:14:43.952221 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000126.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/17-00:14:43.952292 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x1237041f0 -2023/08/17-00:14:43.952386 8651103744 DB pointer 0x124008200 -2023/08/17-00:14:43.952622 6097367040 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/17-00:14:43.952626 6097367040 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 3/0 122.08 KB 0.8 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 19.3 0.00 0.00 1 0.002 0 0 0.0 0.0 - L1 1/0 1.02 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 4/0 1.14 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 19.3 0.00 0.00 1 0.002 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 19.3 0.00 0.00 1 0.002 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.3 0.00 0.00 1 0.002 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 3.71 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 3.71 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x600002a006d8#4064 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 4.9e-05 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692200969793725 b/rust/hyperlane_db/LOG.old.1692200969793725 deleted file mode 100644 index 5d7c6425a5..0000000000 --- a/rust/hyperlane_db/LOG.old.1692200969793725 +++ /dev/null @@ -1,304 +0,0 @@ -2023/08/17-00:19:25.313127 8651103744 RocksDB version: 8.1.1 -2023/08/17-00:19:25.313631 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/17-00:19:25.313633 8651103744 DB SUMMARY -2023/08/17-00:19:25.313634 8651103744 DB Session ID: CFDNMA7WAFC4O6JK4M8I -2023/08/17-00:19:25.313725 8651103744 CURRENT file: CURRENT -2023/08/17-00:19:25.313727 8651103744 IDENTITY file: IDENTITY -2023/08/17-00:19:25.313742 8651103744 MANIFEST file: MANIFEST-000132 size: 805 Bytes -2023/08/17-00:19:25.313756 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 4, files: 000117.sst 000120.sst 000125.sst 000130.sst -2023/08/17-00:19:25.313758 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000131.log size: 330818 ; -2023/08/17-00:19:25.313760 8651103744 Options.error_if_exists: 0 -2023/08/17-00:19:25.313761 8651103744 Options.create_if_missing: 1 -2023/08/17-00:19:25.313762 8651103744 Options.paranoid_checks: 1 -2023/08/17-00:19:25.313763 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/17-00:19:25.313764 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/17-00:19:25.313765 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/17-00:19:25.313766 8651103744 Options.env: 0x1056bd6e0 -2023/08/17-00:19:25.313768 8651103744 Options.fs: PosixFileSystem -2023/08/17-00:19:25.313769 8651103744 Options.info_log: 0x14160aa98 -2023/08/17-00:19:25.313770 8651103744 Options.max_file_opening_threads: 16 -2023/08/17-00:19:25.313771 8651103744 Options.statistics: 0x0 -2023/08/17-00:19:25.313772 8651103744 Options.use_fsync: 0 -2023/08/17-00:19:25.313773 8651103744 Options.max_log_file_size: 0 -2023/08/17-00:19:25.313774 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/17-00:19:25.313775 8651103744 Options.log_file_time_to_roll: 0 -2023/08/17-00:19:25.313776 8651103744 Options.keep_log_file_num: 1000 -2023/08/17-00:19:25.313777 8651103744 Options.recycle_log_file_num: 0 -2023/08/17-00:19:25.313778 8651103744 Options.allow_fallocate: 1 -2023/08/17-00:19:25.313779 8651103744 Options.allow_mmap_reads: 0 -2023/08/17-00:19:25.313780 8651103744 Options.allow_mmap_writes: 0 -2023/08/17-00:19:25.313781 8651103744 Options.use_direct_reads: 0 -2023/08/17-00:19:25.313782 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/17-00:19:25.313783 8651103744 Options.create_missing_column_families: 0 -2023/08/17-00:19:25.313784 8651103744 Options.db_log_dir: -2023/08/17-00:19:25.313785 8651103744 Options.wal_dir: -2023/08/17-00:19:25.313786 8651103744 Options.table_cache_numshardbits: 6 -2023/08/17-00:19:25.313787 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/17-00:19:25.313788 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/17-00:19:25.313789 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/17-00:19:25.313791 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/17-00:19:25.313792 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/17-00:19:25.313793 8651103744 Options.advise_random_on_open: 1 -2023/08/17-00:19:25.313794 8651103744 Options.db_write_buffer_size: 0 -2023/08/17-00:19:25.313795 8651103744 Options.write_buffer_manager: 0x600001e59380 -2023/08/17-00:19:25.313796 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/17-00:19:25.313797 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/17-00:19:25.313798 8651103744 Options.use_adaptive_mutex: 0 -2023/08/17-00:19:25.313799 8651103744 Options.rate_limiter: 0x0 -2023/08/17-00:19:25.313800 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/17-00:19:25.313801 8651103744 Options.wal_recovery_mode: 2 -2023/08/17-00:19:25.313802 8651103744 Options.enable_thread_tracking: 0 -2023/08/17-00:19:25.313803 8651103744 Options.enable_pipelined_write: 0 -2023/08/17-00:19:25.313804 8651103744 Options.unordered_write: 0 -2023/08/17-00:19:25.313805 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/17-00:19:25.313806 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/17-00:19:25.313807 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/17-00:19:25.313808 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/17-00:19:25.313809 8651103744 Options.row_cache: None -2023/08/17-00:19:25.313810 8651103744 Options.wal_filter: None -2023/08/17-00:19:25.313811 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/17-00:19:25.313812 8651103744 Options.allow_ingest_behind: 0 -2023/08/17-00:19:25.313813 8651103744 Options.two_write_queues: 0 -2023/08/17-00:19:25.313814 8651103744 Options.manual_wal_flush: 0 -2023/08/17-00:19:25.313815 8651103744 Options.wal_compression: 0 -2023/08/17-00:19:25.313816 8651103744 Options.atomic_flush: 0 -2023/08/17-00:19:25.313817 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/17-00:19:25.313818 8651103744 Options.persist_stats_to_disk: 0 -2023/08/17-00:19:25.313819 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/17-00:19:25.313820 8651103744 Options.log_readahead_size: 0 -2023/08/17-00:19:25.313821 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/17-00:19:25.313822 8651103744 Options.best_efforts_recovery: 0 -2023/08/17-00:19:25.313823 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/17-00:19:25.313824 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/17-00:19:25.313825 8651103744 Options.allow_data_in_errors: 0 -2023/08/17-00:19:25.313826 8651103744 Options.db_host_id: __hostname__ -2023/08/17-00:19:25.313827 8651103744 Options.enforce_single_del_contracts: true -2023/08/17-00:19:25.313828 8651103744 Options.max_background_jobs: 2 -2023/08/17-00:19:25.313829 8651103744 Options.max_background_compactions: -1 -2023/08/17-00:19:25.313830 8651103744 Options.max_subcompactions: 1 -2023/08/17-00:19:25.313831 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/17-00:19:25.313832 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/17-00:19:25.313833 8651103744 Options.delayed_write_rate : 16777216 -2023/08/17-00:19:25.313834 8651103744 Options.max_total_wal_size: 0 -2023/08/17-00:19:25.313835 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/17-00:19:25.313837 8651103744 Options.stats_dump_period_sec: 600 -2023/08/17-00:19:25.313838 8651103744 Options.stats_persist_period_sec: 600 -2023/08/17-00:19:25.313839 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/17-00:19:25.313840 8651103744 Options.max_open_files: -1 -2023/08/17-00:19:25.313841 8651103744 Options.bytes_per_sync: 0 -2023/08/17-00:19:25.313842 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/17-00:19:25.313843 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/17-00:19:25.313843 8651103744 Options.compaction_readahead_size: 0 -2023/08/17-00:19:25.313845 8651103744 Options.max_background_flushes: -1 -2023/08/17-00:19:25.313846 8651103744 Compression algorithms supported: -2023/08/17-00:19:25.313862 8651103744 kZSTD supported: 1 -2023/08/17-00:19:25.313864 8651103744 kZlibCompression supported: 1 -2023/08/17-00:19:25.313865 8651103744 kXpressCompression supported: 0 -2023/08/17-00:19:25.313866 8651103744 kSnappyCompression supported: 1 -2023/08/17-00:19:25.313867 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/17-00:19:25.313868 8651103744 kLZ4HCCompression supported: 1 -2023/08/17-00:19:25.313869 8651103744 kLZ4Compression supported: 1 -2023/08/17-00:19:25.313870 8651103744 kBZip2Compression supported: 1 -2023/08/17-00:19:25.313876 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/17-00:19:25.313877 8651103744 DMutex implementation: pthread_mutex_t -2023/08/17-00:19:25.313993 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000132 -2023/08/17-00:19:25.314217 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/17-00:19:25.314219 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/17-00:19:25.314220 8651103744 Options.merge_operator: None -2023/08/17-00:19:25.314221 8651103744 Options.compaction_filter: None -2023/08/17-00:19:25.314222 8651103744 Options.compaction_filter_factory: None -2023/08/17-00:19:25.314223 8651103744 Options.sst_partitioner_factory: None -2023/08/17-00:19:25.314224 8651103744 Options.memtable_factory: SkipListFactory -2023/08/17-00:19:25.314225 8651103744 Options.table_factory: BlockBasedTable -2023/08/17-00:19:25.314236 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600002554640) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000010586d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/17-00:19:25.314237 8651103744 Options.write_buffer_size: 67108864 -2023/08/17-00:19:25.314238 8651103744 Options.max_write_buffer_number: 2 -2023/08/17-00:19:25.314239 8651103744 Options.compression: Snappy -2023/08/17-00:19:25.314240 8651103744 Options.bottommost_compression: Disabled -2023/08/17-00:19:25.314241 8651103744 Options.prefix_extractor: nullptr -2023/08/17-00:19:25.314242 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/17-00:19:25.314243 8651103744 Options.num_levels: 7 -2023/08/17-00:19:25.314244 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/17-00:19:25.314245 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/17-00:19:25.314246 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/17-00:19:25.314247 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/17-00:19:25.314248 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/17-00:19:25.314249 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/17-00:19:25.314250 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/17-00:19:25.314251 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/17-00:19:25.314252 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/17-00:19:25.314253 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/17-00:19:25.314254 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/17-00:19:25.314255 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/17-00:19:25.314256 8651103744 Options.compression_opts.window_bits: -14 -2023/08/17-00:19:25.314257 8651103744 Options.compression_opts.level: 32767 -2023/08/17-00:19:25.314258 8651103744 Options.compression_opts.strategy: 0 -2023/08/17-00:19:25.314259 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/17-00:19:25.314260 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/17-00:19:25.314261 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/17-00:19:25.314262 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/17-00:19:25.314263 8651103744 Options.compression_opts.enabled: false -2023/08/17-00:19:25.314264 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/17-00:19:25.314265 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/17-00:19:25.314266 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/17-00:19:25.314266 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/17-00:19:25.314267 8651103744 Options.target_file_size_base: 67108864 -2023/08/17-00:19:25.314268 8651103744 Options.target_file_size_multiplier: 1 -2023/08/17-00:19:25.314269 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/17-00:19:25.314270 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/17-00:19:25.314271 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/17-00:19:25.314272 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/17-00:19:25.314273 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/17-00:19:25.314274 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/17-00:19:25.314275 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/17-00:19:25.314276 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/17-00:19:25.314277 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/17-00:19:25.314278 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/17-00:19:25.314279 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/17-00:19:25.314279 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/17-00:19:25.314280 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/17-00:19:25.314281 8651103744 Options.arena_block_size: 1048576 -2023/08/17-00:19:25.314282 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/17-00:19:25.314283 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/17-00:19:25.314284 8651103744 Options.disable_auto_compactions: 0 -2023/08/17-00:19:25.314288 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/17-00:19:25.314290 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/17-00:19:25.314291 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/17-00:19:25.314292 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/17-00:19:25.314293 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/17-00:19:25.314293 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/17-00:19:25.314294 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/17-00:19:25.314297 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/17-00:19:25.314298 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/17-00:19:25.314299 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/17-00:19:25.314301 8651103744 Options.table_properties_collectors: -2023/08/17-00:19:25.314302 8651103744 Options.inplace_update_support: 0 -2023/08/17-00:19:25.314303 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/17-00:19:25.314304 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/17-00:19:25.314305 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/17-00:19:25.314306 8651103744 Options.memtable_huge_page_size: 0 -2023/08/17-00:19:25.314306 8651103744 Options.bloom_locality: 0 -2023/08/17-00:19:25.314307 8651103744 Options.max_successive_merges: 0 -2023/08/17-00:19:25.314308 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/17-00:19:25.314309 8651103744 Options.paranoid_file_checks: 0 -2023/08/17-00:19:25.314310 8651103744 Options.force_consistency_checks: 1 -2023/08/17-00:19:25.314311 8651103744 Options.report_bg_io_stats: 0 -2023/08/17-00:19:25.314312 8651103744 Options.ttl: 2592000 -2023/08/17-00:19:25.314313 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/17-00:19:25.314314 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/17-00:19:25.314315 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/17-00:19:25.314316 8651103744 Options.enable_blob_files: false -2023/08/17-00:19:25.314317 8651103744 Options.min_blob_size: 0 -2023/08/17-00:19:25.314318 8651103744 Options.blob_file_size: 268435456 -2023/08/17-00:19:25.314319 8651103744 Options.blob_compression_type: NoCompression -2023/08/17-00:19:25.314320 8651103744 Options.enable_blob_garbage_collection: false -2023/08/17-00:19:25.314321 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/17-00:19:25.314322 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/17-00:19:25.314323 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/17-00:19:25.314324 8651103744 Options.blob_file_starting_level: 0 -2023/08/17-00:19:25.314325 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/17-00:19:25.315632 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000132 succeeded,manifest_file_number is 132, next_file_number is 134, last_sequence is 26433, log_number is 127,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 127 -2023/08/17-00:19:25.315637 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 127 -2023/08/17-00:19:25.315686 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/17-00:19:25.315897 8651103744 EVENT_LOG_v1 {"time_micros": 1692199165315889, "job": 1, "event": "recovery_started", "wal_files": [131]} -2023/08/17-00:19:25.315900 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #131 mode 2 -2023/08/17-00:19:25.333434 8651103744 EVENT_LOG_v1 {"time_micros": 1692199165333408, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 135, "file_size": 137511, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 26434, "largest_seqno": 29201, "table_properties": {"data_size": 135651, "index_size": 1852, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 125494, "raw_average_key_size": 45, "raw_value_size": 166334, "raw_average_value_size": 60, "num_data_blocks": 59, "num_entries": 2768, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692199165, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "CFDNMA7WAFC4O6JK4M8I", "orig_file_number": 135, "seqno_to_time_mapping": "N/A"}} -2023/08/17-00:19:25.333521 8651103744 EVENT_LOG_v1 {"time_micros": 1692199165333519, "job": 1, "event": "recovery_finished"} -2023/08/17-00:19:25.333657 8651103744 [db/version_set.cc:5180] Creating manifest 137 -2023/08/17-00:19:25.336361 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000131.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/17-00:19:25.336432 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x14160abf0 -2023/08/17-00:19:25.336532 8651103744 DB pointer 0x141821400 -2023/08/17-00:19:25.336572 6163410944 [db/compaction/compaction_job.cc:1988] [default] [JOB 3] Compacting 4@0 + 1@1 files to L1, score 1.00 -2023/08/17-00:19:25.336578 6163410944 [db/compaction/compaction_job.cc:1992] [default]: Compaction start summary: Base version 2 Base level 0, inputs: [135(134KB) 130(44KB) 125(13KB) 120(63KB)], [117(1042KB)] -2023/08/17-00:19:25.336589 6163410944 EVENT_LOG_v1 {"time_micros": 1692199165336581, "job": 3, "event": "compaction_started", "compaction_reason": "LevelL0FilesNum", "files_L0": [135, 130, 125, 120], "files_L1": [117], "score": 1, "input_data_size": 1330197, "oldest_snapshot_seqno": -1} -2023/08/17-00:19:25.336778 6164557824 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/17-00:19:25.336808 6164557824 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 4/4 256.37 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 24.1 0.01 0.00 1 0.005 0 0 0.0 0.0 - L1 1/1 1.02 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 5/5 1.27 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 24.1 0.01 0.00 1 0.005 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 24.1 0.01 0.00 1 0.005 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.1 0.01 0.00 1 0.005 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 5.80 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 5.80 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000010586d8#4189 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 4.6e-05 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** -2023/08/17-00:19:25.405602 6163410944 [db/compaction/compaction_job.cc:1592] [default] [JOB 3] Generated table #140: 28433 keys, 1326253 bytes, temperature: kUnknown -2023/08/17-00:19:25.405636 6163410944 EVENT_LOG_v1 {"time_micros": 1692199165405613, "cf_name": "default", "job": 3, "event": "table_file_creation", "file_number": 140, "file_size": 1326253, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 0, "largest_seqno": 0, "table_properties": {"data_size": 1316717, "index_size": 28205, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 2091319, "raw_average_key_size": 73, "raw_value_size": 1313571, "raw_average_value_size": 46, "num_data_blocks": 598, "num_entries": 28433, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692109142, "oldest_key_time": 0, "file_creation_time": 1692199165, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "CFDNMA7WAFC4O6JK4M8I", "orig_file_number": 140, "seqno_to_time_mapping": "N/A"}} -2023/08/17-00:19:25.406178 6163410944 (Original Log Time 2023/08/17-00:19:25.405912) [db/compaction/compaction_job.cc:1663] [default] [JOB 3] Compacted 4@0 + 1@1 files to L1 => 1326253 bytes -2023/08/17-00:19:25.406180 6163410944 (Original Log Time 2023/08/17-00:19:25.406090) [db/compaction/compaction_job.cc:885] [default] compacted to: files[0 1 0 0 0 0 0] max score 0.00, MB/sec: 19.2 rd, 19.2 wr, level 1, files in(4, 1) out(1 +0 blob) MB in(0.3, 1.0 +0.0 blob) out(1.3 +0.0 blob), read-write-amplify(10.1) write-amplify(5.1) OK, records in: 28437, records dropped: 4 output_compression: Snappy -2023/08/17-00:19:25.406182 6163410944 (Original Log Time 2023/08/17-00:19:25.406112) EVENT_LOG_v1 {"time_micros": 1692199165406095, "job": 3, "event": "compaction_finished", "compaction_time_micros": 69121, "compaction_time_cpu_micros": 68483, "output_level": 1, "num_output_files": 1, "total_output_size": 1326253, "num_input_records": 28437, "num_output_records": 28433, "num_subcompactions": 1, "output_compression": "Snappy", "num_single_delete_mismatches": 0, "num_single_delete_fallthrough": 0, "lsm_state": [0, 1, 0, 0, 0, 0, 0]} -2023/08/17-00:19:25.406260 6163410944 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000135.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/17-00:19:25.406265 6163410944 EVENT_LOG_v1 {"time_micros": 1692199165406263, "job": 3, "event": "table_file_deletion", "file_number": 135} -2023/08/17-00:19:25.406342 6163410944 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000130.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/17-00:19:25.406346 6163410944 EVENT_LOG_v1 {"time_micros": 1692199165406344, "job": 3, "event": "table_file_deletion", "file_number": 130} -2023/08/17-00:19:25.406402 6163410944 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000125.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/17-00:19:25.406405 6163410944 EVENT_LOG_v1 {"time_micros": 1692199165406404, "job": 3, "event": "table_file_deletion", "file_number": 125} -2023/08/17-00:19:25.406457 6163410944 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000120.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/17-00:19:25.406461 6163410944 EVENT_LOG_v1 {"time_micros": 1692199165406459, "job": 3, "event": "table_file_deletion", "file_number": 120} -2023/08/17-00:19:25.406799 6163410944 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000117.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/17-00:19:25.406804 6163410944 EVENT_LOG_v1 {"time_micros": 1692199165406802, "job": 3, "event": "table_file_deletion", "file_number": 117} diff --git a/rust/hyperlane_db/LOG.old.1692201117982925 b/rust/hyperlane_db/LOG.old.1692201117982925 deleted file mode 100644 index 0a9860cd3e..0000000000 --- a/rust/hyperlane_db/LOG.old.1692201117982925 +++ /dev/null @@ -1,286 +0,0 @@ -2023/08/17-00:49:29.794435 8651103744 RocksDB version: 8.1.1 -2023/08/17-00:49:29.795076 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/17-00:49:29.795078 8651103744 DB SUMMARY -2023/08/17-00:49:29.795079 8651103744 DB Session ID: QXDCSM6RIPILTP5RTDPR -2023/08/17-00:49:29.795155 8651103744 CURRENT file: CURRENT -2023/08/17-00:49:29.795157 8651103744 IDENTITY file: IDENTITY -2023/08/17-00:49:29.795180 8651103744 MANIFEST file: MANIFEST-000137 size: 1190 Bytes -2023/08/17-00:49:29.795194 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 1, files: 000140.sst -2023/08/17-00:49:29.795196 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000136.log size: 329532 ; -2023/08/17-00:49:29.795198 8651103744 Options.error_if_exists: 0 -2023/08/17-00:49:29.795199 8651103744 Options.create_if_missing: 1 -2023/08/17-00:49:29.795200 8651103744 Options.paranoid_checks: 1 -2023/08/17-00:49:29.795201 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/17-00:49:29.795202 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/17-00:49:29.795203 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/17-00:49:29.795204 8651103744 Options.env: 0x105dc16e0 -2023/08/17-00:49:29.795205 8651103744 Options.fs: PosixFileSystem -2023/08/17-00:49:29.795206 8651103744 Options.info_log: 0x15360aa98 -2023/08/17-00:49:29.795207 8651103744 Options.max_file_opening_threads: 16 -2023/08/17-00:49:29.795208 8651103744 Options.statistics: 0x0 -2023/08/17-00:49:29.795209 8651103744 Options.use_fsync: 0 -2023/08/17-00:49:29.795210 8651103744 Options.max_log_file_size: 0 -2023/08/17-00:49:29.795211 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/17-00:49:29.795212 8651103744 Options.log_file_time_to_roll: 0 -2023/08/17-00:49:29.795213 8651103744 Options.keep_log_file_num: 1000 -2023/08/17-00:49:29.795214 8651103744 Options.recycle_log_file_num: 0 -2023/08/17-00:49:29.795215 8651103744 Options.allow_fallocate: 1 -2023/08/17-00:49:29.795216 8651103744 Options.allow_mmap_reads: 0 -2023/08/17-00:49:29.795217 8651103744 Options.allow_mmap_writes: 0 -2023/08/17-00:49:29.795218 8651103744 Options.use_direct_reads: 0 -2023/08/17-00:49:29.795218 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/17-00:49:29.795219 8651103744 Options.create_missing_column_families: 0 -2023/08/17-00:49:29.795220 8651103744 Options.db_log_dir: -2023/08/17-00:49:29.795221 8651103744 Options.wal_dir: -2023/08/17-00:49:29.795222 8651103744 Options.table_cache_numshardbits: 6 -2023/08/17-00:49:29.795223 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/17-00:49:29.795224 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/17-00:49:29.795225 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/17-00:49:29.795226 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/17-00:49:29.795227 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/17-00:49:29.795228 8651103744 Options.advise_random_on_open: 1 -2023/08/17-00:49:29.795229 8651103744 Options.db_write_buffer_size: 0 -2023/08/17-00:49:29.795230 8651103744 Options.write_buffer_manager: 0x600000659380 -2023/08/17-00:49:29.795231 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/17-00:49:29.795232 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/17-00:49:29.795233 8651103744 Options.use_adaptive_mutex: 0 -2023/08/17-00:49:29.795234 8651103744 Options.rate_limiter: 0x0 -2023/08/17-00:49:29.795235 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/17-00:49:29.795236 8651103744 Options.wal_recovery_mode: 2 -2023/08/17-00:49:29.795237 8651103744 Options.enable_thread_tracking: 0 -2023/08/17-00:49:29.795238 8651103744 Options.enable_pipelined_write: 0 -2023/08/17-00:49:29.795239 8651103744 Options.unordered_write: 0 -2023/08/17-00:49:29.795240 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/17-00:49:29.795241 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/17-00:49:29.795241 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/17-00:49:29.795242 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/17-00:49:29.795243 8651103744 Options.row_cache: None -2023/08/17-00:49:29.795244 8651103744 Options.wal_filter: None -2023/08/17-00:49:29.795245 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/17-00:49:29.795246 8651103744 Options.allow_ingest_behind: 0 -2023/08/17-00:49:29.795247 8651103744 Options.two_write_queues: 0 -2023/08/17-00:49:29.795248 8651103744 Options.manual_wal_flush: 0 -2023/08/17-00:49:29.795249 8651103744 Options.wal_compression: 0 -2023/08/17-00:49:29.795250 8651103744 Options.atomic_flush: 0 -2023/08/17-00:49:29.795251 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/17-00:49:29.795252 8651103744 Options.persist_stats_to_disk: 0 -2023/08/17-00:49:29.795253 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/17-00:49:29.795254 8651103744 Options.log_readahead_size: 0 -2023/08/17-00:49:29.795255 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/17-00:49:29.795267 8651103744 Options.best_efforts_recovery: 0 -2023/08/17-00:49:29.795268 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/17-00:49:29.795269 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/17-00:49:29.795270 8651103744 Options.allow_data_in_errors: 0 -2023/08/17-00:49:29.795271 8651103744 Options.db_host_id: __hostname__ -2023/08/17-00:49:29.795272 8651103744 Options.enforce_single_del_contracts: true -2023/08/17-00:49:29.795273 8651103744 Options.max_background_jobs: 2 -2023/08/17-00:49:29.795274 8651103744 Options.max_background_compactions: -1 -2023/08/17-00:49:29.795275 8651103744 Options.max_subcompactions: 1 -2023/08/17-00:49:29.795275 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/17-00:49:29.795276 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/17-00:49:29.795277 8651103744 Options.delayed_write_rate : 16777216 -2023/08/17-00:49:29.795278 8651103744 Options.max_total_wal_size: 0 -2023/08/17-00:49:29.795279 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/17-00:49:29.795280 8651103744 Options.stats_dump_period_sec: 600 -2023/08/17-00:49:29.795281 8651103744 Options.stats_persist_period_sec: 600 -2023/08/17-00:49:29.795282 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/17-00:49:29.795283 8651103744 Options.max_open_files: -1 -2023/08/17-00:49:29.795284 8651103744 Options.bytes_per_sync: 0 -2023/08/17-00:49:29.795285 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/17-00:49:29.795286 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/17-00:49:29.795287 8651103744 Options.compaction_readahead_size: 0 -2023/08/17-00:49:29.795288 8651103744 Options.max_background_flushes: -1 -2023/08/17-00:49:29.795289 8651103744 Compression algorithms supported: -2023/08/17-00:49:29.795305 8651103744 kZSTD supported: 1 -2023/08/17-00:49:29.795306 8651103744 kZlibCompression supported: 1 -2023/08/17-00:49:29.795307 8651103744 kXpressCompression supported: 0 -2023/08/17-00:49:29.795308 8651103744 kSnappyCompression supported: 1 -2023/08/17-00:49:29.795309 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/17-00:49:29.795310 8651103744 kLZ4HCCompression supported: 1 -2023/08/17-00:49:29.795311 8651103744 kLZ4Compression supported: 1 -2023/08/17-00:49:29.795312 8651103744 kBZip2Compression supported: 1 -2023/08/17-00:49:29.795318 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/17-00:49:29.795319 8651103744 DMutex implementation: pthread_mutex_t -2023/08/17-00:49:29.795588 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000137 -2023/08/17-00:49:29.795853 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/17-00:49:29.795855 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/17-00:49:29.795856 8651103744 Options.merge_operator: None -2023/08/17-00:49:29.795857 8651103744 Options.compaction_filter: None -2023/08/17-00:49:29.795858 8651103744 Options.compaction_filter_factory: None -2023/08/17-00:49:29.795859 8651103744 Options.sst_partitioner_factory: None -2023/08/17-00:49:29.795860 8651103744 Options.memtable_factory: SkipListFactory -2023/08/17-00:49:29.795861 8651103744 Options.table_factory: BlockBasedTable -2023/08/17-00:49:29.795885 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600003d54640) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000008586d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/17-00:49:29.795886 8651103744 Options.write_buffer_size: 67108864 -2023/08/17-00:49:29.795887 8651103744 Options.max_write_buffer_number: 2 -2023/08/17-00:49:29.795888 8651103744 Options.compression: Snappy -2023/08/17-00:49:29.795889 8651103744 Options.bottommost_compression: Disabled -2023/08/17-00:49:29.795891 8651103744 Options.prefix_extractor: nullptr -2023/08/17-00:49:29.795891 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/17-00:49:29.795893 8651103744 Options.num_levels: 7 -2023/08/17-00:49:29.795894 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/17-00:49:29.795894 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/17-00:49:29.795895 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/17-00:49:29.795896 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/17-00:49:29.795897 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/17-00:49:29.795898 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/17-00:49:29.795899 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/17-00:49:29.795900 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/17-00:49:29.795901 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/17-00:49:29.795902 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/17-00:49:29.795903 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/17-00:49:29.795904 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/17-00:49:29.795905 8651103744 Options.compression_opts.window_bits: -14 -2023/08/17-00:49:29.795906 8651103744 Options.compression_opts.level: 32767 -2023/08/17-00:49:29.795907 8651103744 Options.compression_opts.strategy: 0 -2023/08/17-00:49:29.795908 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/17-00:49:29.795909 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/17-00:49:29.795910 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/17-00:49:29.795911 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/17-00:49:29.795911 8651103744 Options.compression_opts.enabled: false -2023/08/17-00:49:29.795912 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/17-00:49:29.795913 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/17-00:49:29.795914 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/17-00:49:29.795915 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/17-00:49:29.795916 8651103744 Options.target_file_size_base: 67108864 -2023/08/17-00:49:29.795917 8651103744 Options.target_file_size_multiplier: 1 -2023/08/17-00:49:29.795918 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/17-00:49:29.795919 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/17-00:49:29.795920 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/17-00:49:29.795921 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/17-00:49:29.795922 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/17-00:49:29.795923 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/17-00:49:29.795924 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/17-00:49:29.795925 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/17-00:49:29.795926 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/17-00:49:29.795927 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/17-00:49:29.795928 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/17-00:49:29.795929 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/17-00:49:29.795930 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/17-00:49:29.795931 8651103744 Options.arena_block_size: 1048576 -2023/08/17-00:49:29.795932 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/17-00:49:29.795933 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/17-00:49:29.795933 8651103744 Options.disable_auto_compactions: 0 -2023/08/17-00:49:29.795935 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/17-00:49:29.795937 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/17-00:49:29.795938 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/17-00:49:29.795939 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/17-00:49:29.795940 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/17-00:49:29.795941 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/17-00:49:29.795942 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/17-00:49:29.795944 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/17-00:49:29.795945 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/17-00:49:29.795946 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/17-00:49:29.795948 8651103744 Options.table_properties_collectors: -2023/08/17-00:49:29.795949 8651103744 Options.inplace_update_support: 0 -2023/08/17-00:49:29.795950 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/17-00:49:29.795951 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/17-00:49:29.795952 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/17-00:49:29.795953 8651103744 Options.memtable_huge_page_size: 0 -2023/08/17-00:49:29.795954 8651103744 Options.bloom_locality: 0 -2023/08/17-00:49:29.795955 8651103744 Options.max_successive_merges: 0 -2023/08/17-00:49:29.795956 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/17-00:49:29.795957 8651103744 Options.paranoid_file_checks: 0 -2023/08/17-00:49:29.795957 8651103744 Options.force_consistency_checks: 1 -2023/08/17-00:49:29.795958 8651103744 Options.report_bg_io_stats: 0 -2023/08/17-00:49:29.795959 8651103744 Options.ttl: 2592000 -2023/08/17-00:49:29.795960 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/17-00:49:29.795961 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/17-00:49:29.795962 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/17-00:49:29.795963 8651103744 Options.enable_blob_files: false -2023/08/17-00:49:29.795964 8651103744 Options.min_blob_size: 0 -2023/08/17-00:49:29.795965 8651103744 Options.blob_file_size: 268435456 -2023/08/17-00:49:29.795966 8651103744 Options.blob_compression_type: NoCompression -2023/08/17-00:49:29.795967 8651103744 Options.enable_blob_garbage_collection: false -2023/08/17-00:49:29.795968 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/17-00:49:29.795969 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/17-00:49:29.795970 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/17-00:49:29.795971 8651103744 Options.blob_file_starting_level: 0 -2023/08/17-00:49:29.795972 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/17-00:49:29.797391 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000137 succeeded,manifest_file_number is 137, next_file_number is 142, last_sequence is 29201, log_number is 132,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 132 -2023/08/17-00:49:29.797395 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 132 -2023/08/17-00:49:29.797707 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/17-00:49:29.797878 8651103744 EVENT_LOG_v1 {"time_micros": 1692200969797873, "job": 1, "event": "recovery_started", "wal_files": [136]} -2023/08/17-00:49:29.797881 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #136 mode 2 -2023/08/17-00:49:29.815407 8651103744 EVENT_LOG_v1 {"time_micros": 1692200969815385, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 143, "file_size": 132712, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 29202, "largest_seqno": 32020, "table_properties": {"data_size": 130873, "index_size": 1794, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 127806, "raw_average_key_size": 45, "raw_value_size": 161937, "raw_average_value_size": 57, "num_data_blocks": 57, "num_entries": 2819, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692200969, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "QXDCSM6RIPILTP5RTDPR", "orig_file_number": 143, "seqno_to_time_mapping": "N/A"}} -2023/08/17-00:49:29.815475 8651103744 EVENT_LOG_v1 {"time_micros": 1692200969815473, "job": 1, "event": "recovery_finished"} -2023/08/17-00:49:29.815572 8651103744 [db/version_set.cc:5180] Creating manifest 145 -2023/08/17-00:49:29.818052 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000136.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/17-00:49:29.818090 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x15360abf0 -2023/08/17-00:49:29.818155 8651103744 DB pointer 0x153821400 -2023/08/17-00:49:29.818400 6157185024 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/17-00:49:29.818403 6157185024 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 1/0 129.60 KB 0.2 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 24.3 0.01 0.00 1 0.005 0 0 0.0 0.0 - L1 1/0 1.26 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 2/0 1.39 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 24.3 0.01 0.00 1 0.005 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 24.3 0.01 0.00 1 0.005 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 24.3 0.01 0.00 1 0.005 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 5.60 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 5.60 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000008586d8#5132 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 4e-05 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692201158741632 b/rust/hyperlane_db/LOG.old.1692201158741632 deleted file mode 100644 index 1cc42a8bc4..0000000000 --- a/rust/hyperlane_db/LOG.old.1692201158741632 +++ /dev/null @@ -1,286 +0,0 @@ -2023/08/17-00:51:57.983701 8651103744 RocksDB version: 8.1.1 -2023/08/17-00:51:57.984339 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/17-00:51:57.984342 8651103744 DB SUMMARY -2023/08/17-00:51:57.984343 8651103744 DB Session ID: PL3A51KRGINLDYL9EQQB -2023/08/17-00:51:57.984424 8651103744 CURRENT file: CURRENT -2023/08/17-00:51:57.984426 8651103744 IDENTITY file: IDENTITY -2023/08/17-00:51:57.984440 8651103744 MANIFEST file: MANIFEST-000145 size: 478 Bytes -2023/08/17-00:51:57.984455 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 2, files: 000140.sst 000143.sst -2023/08/17-00:51:57.984456 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000144.log size: 351937 ; -2023/08/17-00:51:57.984459 8651103744 Options.error_if_exists: 0 -2023/08/17-00:51:57.984460 8651103744 Options.create_if_missing: 1 -2023/08/17-00:51:57.984461 8651103744 Options.paranoid_checks: 1 -2023/08/17-00:51:57.984462 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/17-00:51:57.984463 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/17-00:51:57.984464 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/17-00:51:57.984465 8651103744 Options.env: 0x1054596e0 -2023/08/17-00:51:57.984466 8651103744 Options.fs: PosixFileSystem -2023/08/17-00:51:57.984467 8651103744 Options.info_log: 0x14160a778 -2023/08/17-00:51:57.984468 8651103744 Options.max_file_opening_threads: 16 -2023/08/17-00:51:57.984469 8651103744 Options.statistics: 0x0 -2023/08/17-00:51:57.984470 8651103744 Options.use_fsync: 0 -2023/08/17-00:51:57.984471 8651103744 Options.max_log_file_size: 0 -2023/08/17-00:51:57.984472 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/17-00:51:57.984473 8651103744 Options.log_file_time_to_roll: 0 -2023/08/17-00:51:57.984474 8651103744 Options.keep_log_file_num: 1000 -2023/08/17-00:51:57.984475 8651103744 Options.recycle_log_file_num: 0 -2023/08/17-00:51:57.984476 8651103744 Options.allow_fallocate: 1 -2023/08/17-00:51:57.984477 8651103744 Options.allow_mmap_reads: 0 -2023/08/17-00:51:57.984478 8651103744 Options.allow_mmap_writes: 0 -2023/08/17-00:51:57.984479 8651103744 Options.use_direct_reads: 0 -2023/08/17-00:51:57.984480 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/17-00:51:57.984481 8651103744 Options.create_missing_column_families: 0 -2023/08/17-00:51:57.984482 8651103744 Options.db_log_dir: -2023/08/17-00:51:57.984483 8651103744 Options.wal_dir: -2023/08/17-00:51:57.984484 8651103744 Options.table_cache_numshardbits: 6 -2023/08/17-00:51:57.984485 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/17-00:51:57.984486 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/17-00:51:57.984487 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/17-00:51:57.984488 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/17-00:51:57.984489 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/17-00:51:57.984490 8651103744 Options.advise_random_on_open: 1 -2023/08/17-00:51:57.984491 8651103744 Options.db_write_buffer_size: 0 -2023/08/17-00:51:57.984492 8651103744 Options.write_buffer_manager: 0x600000921380 -2023/08/17-00:51:57.984493 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/17-00:51:57.984494 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/17-00:51:57.984495 8651103744 Options.use_adaptive_mutex: 0 -2023/08/17-00:51:57.984496 8651103744 Options.rate_limiter: 0x0 -2023/08/17-00:51:57.984498 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/17-00:51:57.984499 8651103744 Options.wal_recovery_mode: 2 -2023/08/17-00:51:57.984500 8651103744 Options.enable_thread_tracking: 0 -2023/08/17-00:51:57.984501 8651103744 Options.enable_pipelined_write: 0 -2023/08/17-00:51:57.984502 8651103744 Options.unordered_write: 0 -2023/08/17-00:51:57.984503 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/17-00:51:57.984504 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/17-00:51:57.984505 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/17-00:51:57.984506 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/17-00:51:57.984507 8651103744 Options.row_cache: None -2023/08/17-00:51:57.984508 8651103744 Options.wal_filter: None -2023/08/17-00:51:57.984509 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/17-00:51:57.984510 8651103744 Options.allow_ingest_behind: 0 -2023/08/17-00:51:57.984511 8651103744 Options.two_write_queues: 0 -2023/08/17-00:51:57.984512 8651103744 Options.manual_wal_flush: 0 -2023/08/17-00:51:57.984513 8651103744 Options.wal_compression: 0 -2023/08/17-00:51:57.984514 8651103744 Options.atomic_flush: 0 -2023/08/17-00:51:57.984515 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/17-00:51:57.984516 8651103744 Options.persist_stats_to_disk: 0 -2023/08/17-00:51:57.984517 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/17-00:51:57.984518 8651103744 Options.log_readahead_size: 0 -2023/08/17-00:51:57.984519 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/17-00:51:57.984531 8651103744 Options.best_efforts_recovery: 0 -2023/08/17-00:51:57.984532 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/17-00:51:57.984533 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/17-00:51:57.984534 8651103744 Options.allow_data_in_errors: 0 -2023/08/17-00:51:57.984536 8651103744 Options.db_host_id: __hostname__ -2023/08/17-00:51:57.984537 8651103744 Options.enforce_single_del_contracts: true -2023/08/17-00:51:57.984538 8651103744 Options.max_background_jobs: 2 -2023/08/17-00:51:57.984539 8651103744 Options.max_background_compactions: -1 -2023/08/17-00:51:57.984540 8651103744 Options.max_subcompactions: 1 -2023/08/17-00:51:57.984541 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/17-00:51:57.984542 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/17-00:51:57.984542 8651103744 Options.delayed_write_rate : 16777216 -2023/08/17-00:51:57.984543 8651103744 Options.max_total_wal_size: 0 -2023/08/17-00:51:57.984544 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/17-00:51:57.984545 8651103744 Options.stats_dump_period_sec: 600 -2023/08/17-00:51:57.984546 8651103744 Options.stats_persist_period_sec: 600 -2023/08/17-00:51:57.984547 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/17-00:51:57.984549 8651103744 Options.max_open_files: -1 -2023/08/17-00:51:57.984550 8651103744 Options.bytes_per_sync: 0 -2023/08/17-00:51:57.984551 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/17-00:51:57.984552 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/17-00:51:57.984553 8651103744 Options.compaction_readahead_size: 0 -2023/08/17-00:51:57.984554 8651103744 Options.max_background_flushes: -1 -2023/08/17-00:51:57.984554 8651103744 Compression algorithms supported: -2023/08/17-00:51:57.984569 8651103744 kZSTD supported: 1 -2023/08/17-00:51:57.984570 8651103744 kZlibCompression supported: 1 -2023/08/17-00:51:57.984571 8651103744 kXpressCompression supported: 0 -2023/08/17-00:51:57.984572 8651103744 kSnappyCompression supported: 1 -2023/08/17-00:51:57.984573 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/17-00:51:57.984574 8651103744 kLZ4HCCompression supported: 1 -2023/08/17-00:51:57.984575 8651103744 kLZ4Compression supported: 1 -2023/08/17-00:51:57.984576 8651103744 kBZip2Compression supported: 1 -2023/08/17-00:51:57.984582 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/17-00:51:57.984583 8651103744 DMutex implementation: pthread_mutex_t -2023/08/17-00:51:57.984864 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000145 -2023/08/17-00:51:57.985139 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/17-00:51:57.985142 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/17-00:51:57.985143 8651103744 Options.merge_operator: None -2023/08/17-00:51:57.985144 8651103744 Options.compaction_filter: None -2023/08/17-00:51:57.985145 8651103744 Options.compaction_filter_factory: None -2023/08/17-00:51:57.985146 8651103744 Options.sst_partitioner_factory: None -2023/08/17-00:51:57.985147 8651103744 Options.memtable_factory: SkipListFactory -2023/08/17-00:51:57.985148 8651103744 Options.table_factory: BlockBasedTable -2023/08/17-00:51:57.985172 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x60000322c640) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000007206d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/17-00:51:57.985174 8651103744 Options.write_buffer_size: 67108864 -2023/08/17-00:51:57.985175 8651103744 Options.max_write_buffer_number: 2 -2023/08/17-00:51:57.985176 8651103744 Options.compression: Snappy -2023/08/17-00:51:57.985177 8651103744 Options.bottommost_compression: Disabled -2023/08/17-00:51:57.985178 8651103744 Options.prefix_extractor: nullptr -2023/08/17-00:51:57.985179 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/17-00:51:57.985180 8651103744 Options.num_levels: 7 -2023/08/17-00:51:57.985181 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/17-00:51:57.985182 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/17-00:51:57.985183 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/17-00:51:57.985184 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/17-00:51:57.985185 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/17-00:51:57.985186 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/17-00:51:57.985187 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/17-00:51:57.985188 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/17-00:51:57.985189 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/17-00:51:57.985190 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/17-00:51:57.985191 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/17-00:51:57.985192 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/17-00:51:57.985193 8651103744 Options.compression_opts.window_bits: -14 -2023/08/17-00:51:57.985194 8651103744 Options.compression_opts.level: 32767 -2023/08/17-00:51:57.985195 8651103744 Options.compression_opts.strategy: 0 -2023/08/17-00:51:57.985196 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/17-00:51:57.985197 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/17-00:51:57.985198 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/17-00:51:57.985199 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/17-00:51:57.985200 8651103744 Options.compression_opts.enabled: false -2023/08/17-00:51:57.985201 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/17-00:51:57.985202 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/17-00:51:57.985203 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/17-00:51:57.985204 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/17-00:51:57.985205 8651103744 Options.target_file_size_base: 67108864 -2023/08/17-00:51:57.985206 8651103744 Options.target_file_size_multiplier: 1 -2023/08/17-00:51:57.985207 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/17-00:51:57.985208 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/17-00:51:57.985209 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/17-00:51:57.985210 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/17-00:51:57.985211 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/17-00:51:57.985212 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/17-00:51:57.985213 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/17-00:51:57.985214 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/17-00:51:57.985215 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/17-00:51:57.985216 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/17-00:51:57.985217 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/17-00:51:57.985218 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/17-00:51:57.985219 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/17-00:51:57.985220 8651103744 Options.arena_block_size: 1048576 -2023/08/17-00:51:57.985221 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/17-00:51:57.985222 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/17-00:51:57.985223 8651103744 Options.disable_auto_compactions: 0 -2023/08/17-00:51:57.985225 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/17-00:51:57.985227 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/17-00:51:57.985228 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/17-00:51:57.985229 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/17-00:51:57.985229 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/17-00:51:57.985230 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/17-00:51:57.985231 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/17-00:51:57.985234 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/17-00:51:57.985235 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/17-00:51:57.985236 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/17-00:51:57.985238 8651103744 Options.table_properties_collectors: -2023/08/17-00:51:57.985239 8651103744 Options.inplace_update_support: 0 -2023/08/17-00:51:57.985240 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/17-00:51:57.985241 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/17-00:51:57.985242 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/17-00:51:57.985243 8651103744 Options.memtable_huge_page_size: 0 -2023/08/17-00:51:57.985244 8651103744 Options.bloom_locality: 0 -2023/08/17-00:51:57.985245 8651103744 Options.max_successive_merges: 0 -2023/08/17-00:51:57.985246 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/17-00:51:57.985247 8651103744 Options.paranoid_file_checks: 0 -2023/08/17-00:51:57.985248 8651103744 Options.force_consistency_checks: 1 -2023/08/17-00:51:57.985249 8651103744 Options.report_bg_io_stats: 0 -2023/08/17-00:51:57.985250 8651103744 Options.ttl: 2592000 -2023/08/17-00:51:57.985251 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/17-00:51:57.985252 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/17-00:51:57.985253 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/17-00:51:57.985254 8651103744 Options.enable_blob_files: false -2023/08/17-00:51:57.985255 8651103744 Options.min_blob_size: 0 -2023/08/17-00:51:57.985256 8651103744 Options.blob_file_size: 268435456 -2023/08/17-00:51:57.985257 8651103744 Options.blob_compression_type: NoCompression -2023/08/17-00:51:57.985258 8651103744 Options.enable_blob_garbage_collection: false -2023/08/17-00:51:57.985259 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/17-00:51:57.985260 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/17-00:51:57.985261 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/17-00:51:57.985262 8651103744 Options.blob_file_starting_level: 0 -2023/08/17-00:51:57.985263 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/17-00:51:57.986620 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000145 succeeded,manifest_file_number is 145, next_file_number is 147, last_sequence is 32020, log_number is 137,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 137 -2023/08/17-00:51:57.986624 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 137 -2023/08/17-00:51:57.986815 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/17-00:51:57.987015 8651103744 EVENT_LOG_v1 {"time_micros": 1692201117987010, "job": 1, "event": "recovery_started", "wal_files": [144]} -2023/08/17-00:51:57.987018 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #144 mode 2 -2023/08/17-00:51:58.005550 8651103744 EVENT_LOG_v1 {"time_micros": 1692201118005526, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 148, "file_size": 148129, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 32021, "largest_seqno": 34906, "table_properties": {"data_size": 146223, "index_size": 1939, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 130832, "raw_average_key_size": 45, "raw_value_size": 180074, "raw_average_value_size": 62, "num_data_blocks": 62, "num_entries": 2886, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692201117, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "PL3A51KRGINLDYL9EQQB", "orig_file_number": 148, "seqno_to_time_mapping": "N/A"}} -2023/08/17-00:51:58.005637 8651103744 EVENT_LOG_v1 {"time_micros": 1692201118005635, "job": 1, "event": "recovery_finished"} -2023/08/17-00:51:58.005761 8651103744 [db/version_set.cc:5180] Creating manifest 150 -2023/08/17-00:51:58.008432 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000144.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/17-00:51:58.008473 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x14160a8d0 -2023/08/17-00:51:58.008550 8651103744 DB pointer 0x141821600 -2023/08/17-00:51:58.008816 6167048192 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/17-00:51:58.008819 6167048192 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 2/0 274.26 KB 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 25.0 0.01 0.00 1 0.006 0 0 0.0 0.0 - L1 1/0 1.26 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 3/0 1.53 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 25.0 0.01 0.00 1 0.006 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 25.0 0.01 0.00 1 0.006 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 25.0 0.01 0.00 1 0.006 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 5.96 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 5.96 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000007206d8#5448 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 4.1e-05 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692201400366330 b/rust/hyperlane_db/LOG.old.1692201400366330 deleted file mode 100644 index bbccb5deb6..0000000000 --- a/rust/hyperlane_db/LOG.old.1692201400366330 +++ /dev/null @@ -1,286 +0,0 @@ -2023/08/17-00:52:38.742515 8651103744 RocksDB version: 8.1.1 -2023/08/17-00:52:38.743089 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/17-00:52:38.743092 8651103744 DB SUMMARY -2023/08/17-00:52:38.743093 8651103744 DB Session ID: OX1MKEDLSPP1V3PREWEM -2023/08/17-00:52:38.743235 8651103744 CURRENT file: CURRENT -2023/08/17-00:52:38.743237 8651103744 IDENTITY file: IDENTITY -2023/08/17-00:52:38.743253 8651103744 MANIFEST file: MANIFEST-000150 size: 646 Bytes -2023/08/17-00:52:38.743273 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 3, files: 000140.sst 000143.sst 000148.sst -2023/08/17-00:52:38.743274 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000149.log size: 156259 ; -2023/08/17-00:52:38.743276 8651103744 Options.error_if_exists: 0 -2023/08/17-00:52:38.743278 8651103744 Options.create_if_missing: 1 -2023/08/17-00:52:38.743279 8651103744 Options.paranoid_checks: 1 -2023/08/17-00:52:38.743280 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/17-00:52:38.743281 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/17-00:52:38.743282 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/17-00:52:38.743283 8651103744 Options.env: 0x1051a56e0 -2023/08/17-00:52:38.743284 8651103744 Options.fs: PosixFileSystem -2023/08/17-00:52:38.743285 8651103744 Options.info_log: 0x149f04098 -2023/08/17-00:52:38.743286 8651103744 Options.max_file_opening_threads: 16 -2023/08/17-00:52:38.743287 8651103744 Options.statistics: 0x0 -2023/08/17-00:52:38.743288 8651103744 Options.use_fsync: 0 -2023/08/17-00:52:38.743289 8651103744 Options.max_log_file_size: 0 -2023/08/17-00:52:38.743290 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/17-00:52:38.743291 8651103744 Options.log_file_time_to_roll: 0 -2023/08/17-00:52:38.743292 8651103744 Options.keep_log_file_num: 1000 -2023/08/17-00:52:38.743293 8651103744 Options.recycle_log_file_num: 0 -2023/08/17-00:52:38.743295 8651103744 Options.allow_fallocate: 1 -2023/08/17-00:52:38.743296 8651103744 Options.allow_mmap_reads: 0 -2023/08/17-00:52:38.743297 8651103744 Options.allow_mmap_writes: 0 -2023/08/17-00:52:38.743298 8651103744 Options.use_direct_reads: 0 -2023/08/17-00:52:38.743299 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/17-00:52:38.743300 8651103744 Options.create_missing_column_families: 0 -2023/08/17-00:52:38.743301 8651103744 Options.db_log_dir: -2023/08/17-00:52:38.743302 8651103744 Options.wal_dir: -2023/08/17-00:52:38.743303 8651103744 Options.table_cache_numshardbits: 6 -2023/08/17-00:52:38.743303 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/17-00:52:38.743304 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/17-00:52:38.743305 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/17-00:52:38.743306 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/17-00:52:38.743308 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/17-00:52:38.743309 8651103744 Options.advise_random_on_open: 1 -2023/08/17-00:52:38.743310 8651103744 Options.db_write_buffer_size: 0 -2023/08/17-00:52:38.743311 8651103744 Options.write_buffer_manager: 0x6000029fc000 -2023/08/17-00:52:38.743312 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/17-00:52:38.743313 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/17-00:52:38.743314 8651103744 Options.use_adaptive_mutex: 0 -2023/08/17-00:52:38.743315 8651103744 Options.rate_limiter: 0x0 -2023/08/17-00:52:38.743316 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/17-00:52:38.743317 8651103744 Options.wal_recovery_mode: 2 -2023/08/17-00:52:38.743318 8651103744 Options.enable_thread_tracking: 0 -2023/08/17-00:52:38.743319 8651103744 Options.enable_pipelined_write: 0 -2023/08/17-00:52:38.743320 8651103744 Options.unordered_write: 0 -2023/08/17-00:52:38.743321 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/17-00:52:38.743322 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/17-00:52:38.743323 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/17-00:52:38.743324 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/17-00:52:38.743325 8651103744 Options.row_cache: None -2023/08/17-00:52:38.743326 8651103744 Options.wal_filter: None -2023/08/17-00:52:38.743327 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/17-00:52:38.743328 8651103744 Options.allow_ingest_behind: 0 -2023/08/17-00:52:38.743329 8651103744 Options.two_write_queues: 0 -2023/08/17-00:52:38.743330 8651103744 Options.manual_wal_flush: 0 -2023/08/17-00:52:38.743331 8651103744 Options.wal_compression: 0 -2023/08/17-00:52:38.743332 8651103744 Options.atomic_flush: 0 -2023/08/17-00:52:38.743333 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/17-00:52:38.743334 8651103744 Options.persist_stats_to_disk: 0 -2023/08/17-00:52:38.743335 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/17-00:52:38.743336 8651103744 Options.log_readahead_size: 0 -2023/08/17-00:52:38.743337 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/17-00:52:38.743350 8651103744 Options.best_efforts_recovery: 0 -2023/08/17-00:52:38.743351 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/17-00:52:38.743352 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/17-00:52:38.743353 8651103744 Options.allow_data_in_errors: 0 -2023/08/17-00:52:38.743354 8651103744 Options.db_host_id: __hostname__ -2023/08/17-00:52:38.743355 8651103744 Options.enforce_single_del_contracts: true -2023/08/17-00:52:38.743356 8651103744 Options.max_background_jobs: 2 -2023/08/17-00:52:38.743357 8651103744 Options.max_background_compactions: -1 -2023/08/17-00:52:38.743358 8651103744 Options.max_subcompactions: 1 -2023/08/17-00:52:38.743359 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/17-00:52:38.743360 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/17-00:52:38.743361 8651103744 Options.delayed_write_rate : 16777216 -2023/08/17-00:52:38.743362 8651103744 Options.max_total_wal_size: 0 -2023/08/17-00:52:38.743363 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/17-00:52:38.743364 8651103744 Options.stats_dump_period_sec: 600 -2023/08/17-00:52:38.743365 8651103744 Options.stats_persist_period_sec: 600 -2023/08/17-00:52:38.743366 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/17-00:52:38.743367 8651103744 Options.max_open_files: -1 -2023/08/17-00:52:38.743368 8651103744 Options.bytes_per_sync: 0 -2023/08/17-00:52:38.743369 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/17-00:52:38.743370 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/17-00:52:38.743371 8651103744 Options.compaction_readahead_size: 0 -2023/08/17-00:52:38.743372 8651103744 Options.max_background_flushes: -1 -2023/08/17-00:52:38.743373 8651103744 Compression algorithms supported: -2023/08/17-00:52:38.743387 8651103744 kZSTD supported: 1 -2023/08/17-00:52:38.743388 8651103744 kZlibCompression supported: 1 -2023/08/17-00:52:38.743389 8651103744 kXpressCompression supported: 0 -2023/08/17-00:52:38.743391 8651103744 kSnappyCompression supported: 1 -2023/08/17-00:52:38.743393 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/17-00:52:38.743394 8651103744 kLZ4HCCompression supported: 1 -2023/08/17-00:52:38.743395 8651103744 kLZ4Compression supported: 1 -2023/08/17-00:52:38.743396 8651103744 kBZip2Compression supported: 1 -2023/08/17-00:52:38.743404 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/17-00:52:38.743405 8651103744 DMutex implementation: pthread_mutex_t -2023/08/17-00:52:38.743559 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000150 -2023/08/17-00:52:38.743854 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/17-00:52:38.743860 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/17-00:52:38.743861 8651103744 Options.merge_operator: None -2023/08/17-00:52:38.743862 8651103744 Options.compaction_filter: None -2023/08/17-00:52:38.743863 8651103744 Options.compaction_filter_factory: None -2023/08/17-00:52:38.743864 8651103744 Options.sst_partitioner_factory: None -2023/08/17-00:52:38.743865 8651103744 Options.memtable_factory: SkipListFactory -2023/08/17-00:52:38.743866 8651103744 Options.table_factory: BlockBasedTable -2023/08/17-00:52:38.743905 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x6000012f4640) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000027f86d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/17-00:52:38.743908 8651103744 Options.write_buffer_size: 67108864 -2023/08/17-00:52:38.743909 8651103744 Options.max_write_buffer_number: 2 -2023/08/17-00:52:38.743913 8651103744 Options.compression: Snappy -2023/08/17-00:52:38.743914 8651103744 Options.bottommost_compression: Disabled -2023/08/17-00:52:38.743915 8651103744 Options.prefix_extractor: nullptr -2023/08/17-00:52:38.743916 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/17-00:52:38.743918 8651103744 Options.num_levels: 7 -2023/08/17-00:52:38.743919 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/17-00:52:38.743919 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/17-00:52:38.743920 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/17-00:52:38.743921 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/17-00:52:38.743922 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/17-00:52:38.743923 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/17-00:52:38.743924 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/17-00:52:38.743925 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/17-00:52:38.743926 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/17-00:52:38.743927 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/17-00:52:38.743928 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/17-00:52:38.743929 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/17-00:52:38.743930 8651103744 Options.compression_opts.window_bits: -14 -2023/08/17-00:52:38.743931 8651103744 Options.compression_opts.level: 32767 -2023/08/17-00:52:38.743932 8651103744 Options.compression_opts.strategy: 0 -2023/08/17-00:52:38.743933 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/17-00:52:38.743934 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/17-00:52:38.743935 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/17-00:52:38.743936 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/17-00:52:38.743937 8651103744 Options.compression_opts.enabled: false -2023/08/17-00:52:38.743938 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/17-00:52:38.743939 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/17-00:52:38.743940 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/17-00:52:38.743941 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/17-00:52:38.743942 8651103744 Options.target_file_size_base: 67108864 -2023/08/17-00:52:38.743943 8651103744 Options.target_file_size_multiplier: 1 -2023/08/17-00:52:38.743944 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/17-00:52:38.743945 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/17-00:52:38.743946 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/17-00:52:38.743947 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/17-00:52:38.743948 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/17-00:52:38.743949 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/17-00:52:38.743950 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/17-00:52:38.743951 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/17-00:52:38.743952 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/17-00:52:38.743953 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/17-00:52:38.743954 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/17-00:52:38.743954 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/17-00:52:38.743955 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/17-00:52:38.743956 8651103744 Options.arena_block_size: 1048576 -2023/08/17-00:52:38.743957 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/17-00:52:38.743958 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/17-00:52:38.743959 8651103744 Options.disable_auto_compactions: 0 -2023/08/17-00:52:38.743961 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/17-00:52:38.743963 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/17-00:52:38.743964 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/17-00:52:38.743964 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/17-00:52:38.743965 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/17-00:52:38.743966 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/17-00:52:38.743967 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/17-00:52:38.743970 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/17-00:52:38.743971 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/17-00:52:38.743972 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/17-00:52:38.743974 8651103744 Options.table_properties_collectors: -2023/08/17-00:52:38.743975 8651103744 Options.inplace_update_support: 0 -2023/08/17-00:52:38.743976 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/17-00:52:38.743977 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/17-00:52:38.743978 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/17-00:52:38.743979 8651103744 Options.memtable_huge_page_size: 0 -2023/08/17-00:52:38.743980 8651103744 Options.bloom_locality: 0 -2023/08/17-00:52:38.743981 8651103744 Options.max_successive_merges: 0 -2023/08/17-00:52:38.743982 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/17-00:52:38.743983 8651103744 Options.paranoid_file_checks: 0 -2023/08/17-00:52:38.743984 8651103744 Options.force_consistency_checks: 1 -2023/08/17-00:52:38.743984 8651103744 Options.report_bg_io_stats: 0 -2023/08/17-00:52:38.743985 8651103744 Options.ttl: 2592000 -2023/08/17-00:52:38.743986 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/17-00:52:38.743987 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/17-00:52:38.743988 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/17-00:52:38.743989 8651103744 Options.enable_blob_files: false -2023/08/17-00:52:38.743990 8651103744 Options.min_blob_size: 0 -2023/08/17-00:52:38.743991 8651103744 Options.blob_file_size: 268435456 -2023/08/17-00:52:38.743992 8651103744 Options.blob_compression_type: NoCompression -2023/08/17-00:52:38.743993 8651103744 Options.enable_blob_garbage_collection: false -2023/08/17-00:52:38.743994 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/17-00:52:38.743995 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/17-00:52:38.743996 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/17-00:52:38.743997 8651103744 Options.blob_file_starting_level: 0 -2023/08/17-00:52:38.743998 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/17-00:52:38.745133 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000150 succeeded,manifest_file_number is 150, next_file_number is 152, last_sequence is 34906, log_number is 145,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 145 -2023/08/17-00:52:38.745137 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 145 -2023/08/17-00:52:38.745183 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/17-00:52:38.745395 8651103744 EVENT_LOG_v1 {"time_micros": 1692201158745389, "job": 1, "event": "recovery_started", "wal_files": [149]} -2023/08/17-00:52:38.745398 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #149 mode 2 -2023/08/17-00:52:38.755016 8651103744 EVENT_LOG_v1 {"time_micros": 1692201158754989, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 153, "file_size": 67504, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 34907, "largest_seqno": 36349, "table_properties": {"data_size": 66084, "index_size": 854, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 65416, "raw_average_key_size": 45, "raw_value_size": 70461, "raw_average_value_size": 48, "num_data_blocks": 27, "num_entries": 1443, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692201158, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "OX1MKEDLSPP1V3PREWEM", "orig_file_number": 153, "seqno_to_time_mapping": "N/A"}} -2023/08/17-00:52:38.755110 8651103744 EVENT_LOG_v1 {"time_micros": 1692201158755108, "job": 1, "event": "recovery_finished"} -2023/08/17-00:52:38.755250 8651103744 [db/version_set.cc:5180] Creating manifest 155 -2023/08/17-00:52:38.758054 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000149.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/17-00:52:38.758100 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x149e0ab10 -2023/08/17-00:52:38.758187 8651103744 DB pointer 0x14a808200 -2023/08/17-00:52:38.758452 6169882624 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/17-00:52:38.758455 6169882624 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 3/0 340.18 KB 0.8 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 18.5 0.00 0.00 1 0.003 0 0 0.0 0.0 - L1 1/0 1.26 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 4/0 1.60 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 18.5 0.00 0.00 1 0.003 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 18.5 0.00 0.00 1 0.003 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 18.5 0.00 0.00 1 0.003 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 4.39 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 4.39 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000027f86d8#5712 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 4e-05 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692201634076738 b/rust/hyperlane_db/LOG.old.1692201634076738 deleted file mode 100644 index 8ae874c558..0000000000 --- a/rust/hyperlane_db/LOG.old.1692201634076738 +++ /dev/null @@ -1,304 +0,0 @@ -2023/08/17-00:56:40.367123 8651103744 RocksDB version: 8.1.1 -2023/08/17-00:56:40.367748 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/17-00:56:40.367750 8651103744 DB SUMMARY -2023/08/17-00:56:40.367751 8651103744 DB Session ID: I619BZ3044XM4L1BC529 -2023/08/17-00:56:40.367849 8651103744 CURRENT file: CURRENT -2023/08/17-00:56:40.367851 8651103744 IDENTITY file: IDENTITY -2023/08/17-00:56:40.367865 8651103744 MANIFEST file: MANIFEST-000155 size: 814 Bytes -2023/08/17-00:56:40.367882 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 4, files: 000140.sst 000143.sst 000148.sst 000153.sst -2023/08/17-00:56:40.367884 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000154.log size: 248116 ; -2023/08/17-00:56:40.367886 8651103744 Options.error_if_exists: 0 -2023/08/17-00:56:40.367887 8651103744 Options.create_if_missing: 1 -2023/08/17-00:56:40.367888 8651103744 Options.paranoid_checks: 1 -2023/08/17-00:56:40.367889 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/17-00:56:40.367890 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/17-00:56:40.367891 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/17-00:56:40.367892 8651103744 Options.env: 0x10541d6e0 -2023/08/17-00:56:40.367893 8651103744 Options.fs: PosixFileSystem -2023/08/17-00:56:40.367894 8651103744 Options.info_log: 0x15c004098 -2023/08/17-00:56:40.367895 8651103744 Options.max_file_opening_threads: 16 -2023/08/17-00:56:40.367896 8651103744 Options.statistics: 0x0 -2023/08/17-00:56:40.367897 8651103744 Options.use_fsync: 0 -2023/08/17-00:56:40.367898 8651103744 Options.max_log_file_size: 0 -2023/08/17-00:56:40.367899 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/17-00:56:40.367900 8651103744 Options.log_file_time_to_roll: 0 -2023/08/17-00:56:40.367901 8651103744 Options.keep_log_file_num: 1000 -2023/08/17-00:56:40.367902 8651103744 Options.recycle_log_file_num: 0 -2023/08/17-00:56:40.367903 8651103744 Options.allow_fallocate: 1 -2023/08/17-00:56:40.367904 8651103744 Options.allow_mmap_reads: 0 -2023/08/17-00:56:40.367905 8651103744 Options.allow_mmap_writes: 0 -2023/08/17-00:56:40.367906 8651103744 Options.use_direct_reads: 0 -2023/08/17-00:56:40.367907 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/17-00:56:40.367908 8651103744 Options.create_missing_column_families: 0 -2023/08/17-00:56:40.367909 8651103744 Options.db_log_dir: -2023/08/17-00:56:40.367910 8651103744 Options.wal_dir: -2023/08/17-00:56:40.367911 8651103744 Options.table_cache_numshardbits: 6 -2023/08/17-00:56:40.367911 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/17-00:56:40.367912 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/17-00:56:40.367913 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/17-00:56:40.367914 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/17-00:56:40.367915 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/17-00:56:40.367916 8651103744 Options.advise_random_on_open: 1 -2023/08/17-00:56:40.367917 8651103744 Options.db_write_buffer_size: 0 -2023/08/17-00:56:40.367918 8651103744 Options.write_buffer_manager: 0x600003a6c000 -2023/08/17-00:56:40.367919 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/17-00:56:40.367920 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/17-00:56:40.367921 8651103744 Options.use_adaptive_mutex: 0 -2023/08/17-00:56:40.367922 8651103744 Options.rate_limiter: 0x0 -2023/08/17-00:56:40.367923 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/17-00:56:40.367924 8651103744 Options.wal_recovery_mode: 2 -2023/08/17-00:56:40.367925 8651103744 Options.enable_thread_tracking: 0 -2023/08/17-00:56:40.367926 8651103744 Options.enable_pipelined_write: 0 -2023/08/17-00:56:40.367927 8651103744 Options.unordered_write: 0 -2023/08/17-00:56:40.367928 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/17-00:56:40.367929 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/17-00:56:40.367929 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/17-00:56:40.367930 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/17-00:56:40.367931 8651103744 Options.row_cache: None -2023/08/17-00:56:40.367932 8651103744 Options.wal_filter: None -2023/08/17-00:56:40.367933 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/17-00:56:40.367934 8651103744 Options.allow_ingest_behind: 0 -2023/08/17-00:56:40.367935 8651103744 Options.two_write_queues: 0 -2023/08/17-00:56:40.367936 8651103744 Options.manual_wal_flush: 0 -2023/08/17-00:56:40.367937 8651103744 Options.wal_compression: 0 -2023/08/17-00:56:40.367938 8651103744 Options.atomic_flush: 0 -2023/08/17-00:56:40.367939 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/17-00:56:40.367940 8651103744 Options.persist_stats_to_disk: 0 -2023/08/17-00:56:40.367941 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/17-00:56:40.367942 8651103744 Options.log_readahead_size: 0 -2023/08/17-00:56:40.367943 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/17-00:56:40.367944 8651103744 Options.best_efforts_recovery: 0 -2023/08/17-00:56:40.367945 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/17-00:56:40.367946 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/17-00:56:40.367947 8651103744 Options.allow_data_in_errors: 0 -2023/08/17-00:56:40.367948 8651103744 Options.db_host_id: __hostname__ -2023/08/17-00:56:40.367949 8651103744 Options.enforce_single_del_contracts: true -2023/08/17-00:56:40.367950 8651103744 Options.max_background_jobs: 2 -2023/08/17-00:56:40.367951 8651103744 Options.max_background_compactions: -1 -2023/08/17-00:56:40.367952 8651103744 Options.max_subcompactions: 1 -2023/08/17-00:56:40.367953 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/17-00:56:40.367953 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/17-00:56:40.367954 8651103744 Options.delayed_write_rate : 16777216 -2023/08/17-00:56:40.367955 8651103744 Options.max_total_wal_size: 0 -2023/08/17-00:56:40.367956 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/17-00:56:40.367957 8651103744 Options.stats_dump_period_sec: 600 -2023/08/17-00:56:40.367958 8651103744 Options.stats_persist_period_sec: 600 -2023/08/17-00:56:40.367959 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/17-00:56:40.367960 8651103744 Options.max_open_files: -1 -2023/08/17-00:56:40.367961 8651103744 Options.bytes_per_sync: 0 -2023/08/17-00:56:40.367962 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/17-00:56:40.367963 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/17-00:56:40.367964 8651103744 Options.compaction_readahead_size: 0 -2023/08/17-00:56:40.367965 8651103744 Options.max_background_flushes: -1 -2023/08/17-00:56:40.367966 8651103744 Compression algorithms supported: -2023/08/17-00:56:40.367979 8651103744 kZSTD supported: 1 -2023/08/17-00:56:40.367980 8651103744 kZlibCompression supported: 1 -2023/08/17-00:56:40.367981 8651103744 kXpressCompression supported: 0 -2023/08/17-00:56:40.367982 8651103744 kSnappyCompression supported: 1 -2023/08/17-00:56:40.367984 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/17-00:56:40.367985 8651103744 kLZ4HCCompression supported: 1 -2023/08/17-00:56:40.367986 8651103744 kLZ4Compression supported: 1 -2023/08/17-00:56:40.367987 8651103744 kBZip2Compression supported: 1 -2023/08/17-00:56:40.367992 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/17-00:56:40.367993 8651103744 DMutex implementation: pthread_mutex_t -2023/08/17-00:56:40.368249 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000155 -2023/08/17-00:56:40.368470 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/17-00:56:40.368473 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/17-00:56:40.368474 8651103744 Options.merge_operator: None -2023/08/17-00:56:40.368475 8651103744 Options.compaction_filter: None -2023/08/17-00:56:40.368476 8651103744 Options.compaction_filter_factory: None -2023/08/17-00:56:40.368477 8651103744 Options.sst_partitioner_factory: None -2023/08/17-00:56:40.368478 8651103744 Options.memtable_factory: SkipListFactory -2023/08/17-00:56:40.368479 8651103744 Options.table_factory: BlockBasedTable -2023/08/17-00:56:40.368491 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x60000016c220) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000034600d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/17-00:56:40.368492 8651103744 Options.write_buffer_size: 67108864 -2023/08/17-00:56:40.368493 8651103744 Options.max_write_buffer_number: 2 -2023/08/17-00:56:40.368495 8651103744 Options.compression: Snappy -2023/08/17-00:56:40.368496 8651103744 Options.bottommost_compression: Disabled -2023/08/17-00:56:40.368497 8651103744 Options.prefix_extractor: nullptr -2023/08/17-00:56:40.368498 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/17-00:56:40.368499 8651103744 Options.num_levels: 7 -2023/08/17-00:56:40.368500 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/17-00:56:40.368500 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/17-00:56:40.368501 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/17-00:56:40.368502 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/17-00:56:40.368503 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/17-00:56:40.368504 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/17-00:56:40.368505 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/17-00:56:40.368506 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/17-00:56:40.368507 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/17-00:56:40.368508 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/17-00:56:40.368509 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/17-00:56:40.368510 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/17-00:56:40.368511 8651103744 Options.compression_opts.window_bits: -14 -2023/08/17-00:56:40.368512 8651103744 Options.compression_opts.level: 32767 -2023/08/17-00:56:40.368513 8651103744 Options.compression_opts.strategy: 0 -2023/08/17-00:56:40.368514 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/17-00:56:40.368515 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/17-00:56:40.368516 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/17-00:56:40.368517 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/17-00:56:40.368518 8651103744 Options.compression_opts.enabled: false -2023/08/17-00:56:40.368519 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/17-00:56:40.368520 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/17-00:56:40.368521 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/17-00:56:40.368522 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/17-00:56:40.368523 8651103744 Options.target_file_size_base: 67108864 -2023/08/17-00:56:40.368524 8651103744 Options.target_file_size_multiplier: 1 -2023/08/17-00:56:40.368524 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/17-00:56:40.368525 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/17-00:56:40.368526 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/17-00:56:40.368527 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/17-00:56:40.368528 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/17-00:56:40.368530 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/17-00:56:40.368530 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/17-00:56:40.368531 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/17-00:56:40.368532 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/17-00:56:40.368533 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/17-00:56:40.368534 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/17-00:56:40.368535 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/17-00:56:40.368536 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/17-00:56:40.368537 8651103744 Options.arena_block_size: 1048576 -2023/08/17-00:56:40.368538 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/17-00:56:40.368539 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/17-00:56:40.368540 8651103744 Options.disable_auto_compactions: 0 -2023/08/17-00:56:40.368542 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/17-00:56:40.368543 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/17-00:56:40.368544 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/17-00:56:40.368545 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/17-00:56:40.368546 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/17-00:56:40.368547 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/17-00:56:40.368548 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/17-00:56:40.368551 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/17-00:56:40.368552 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/17-00:56:40.368553 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/17-00:56:40.368555 8651103744 Options.table_properties_collectors: -2023/08/17-00:56:40.368556 8651103744 Options.inplace_update_support: 0 -2023/08/17-00:56:40.368557 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/17-00:56:40.368558 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/17-00:56:40.368559 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/17-00:56:40.368560 8651103744 Options.memtable_huge_page_size: 0 -2023/08/17-00:56:40.368561 8651103744 Options.bloom_locality: 0 -2023/08/17-00:56:40.368562 8651103744 Options.max_successive_merges: 0 -2023/08/17-00:56:40.368563 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/17-00:56:40.368563 8651103744 Options.paranoid_file_checks: 0 -2023/08/17-00:56:40.368564 8651103744 Options.force_consistency_checks: 1 -2023/08/17-00:56:40.368565 8651103744 Options.report_bg_io_stats: 0 -2023/08/17-00:56:40.368566 8651103744 Options.ttl: 2592000 -2023/08/17-00:56:40.368567 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/17-00:56:40.368568 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/17-00:56:40.368569 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/17-00:56:40.368570 8651103744 Options.enable_blob_files: false -2023/08/17-00:56:40.368571 8651103744 Options.min_blob_size: 0 -2023/08/17-00:56:40.368572 8651103744 Options.blob_file_size: 268435456 -2023/08/17-00:56:40.368573 8651103744 Options.blob_compression_type: NoCompression -2023/08/17-00:56:40.368574 8651103744 Options.enable_blob_garbage_collection: false -2023/08/17-00:56:40.368575 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/17-00:56:40.368576 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/17-00:56:40.368577 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/17-00:56:40.368578 8651103744 Options.blob_file_starting_level: 0 -2023/08/17-00:56:40.368579 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/17-00:56:40.369876 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000155 succeeded,manifest_file_number is 155, next_file_number is 157, last_sequence is 36349, log_number is 150,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 150 -2023/08/17-00:56:40.369879 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 150 -2023/08/17-00:56:40.370078 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/17-00:56:40.370272 8651103744 EVENT_LOG_v1 {"time_micros": 1692201400370267, "job": 1, "event": "recovery_started", "wal_files": [154]} -2023/08/17-00:56:40.370275 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #154 mode 2 -2023/08/17-00:56:40.384439 8651103744 EVENT_LOG_v1 {"time_micros": 1692201400384417, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 158, "file_size": 104184, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 36350, "largest_seqno": 38541, "table_properties": {"data_size": 102538, "index_size": 1395, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 99382, "raw_average_key_size": 45, "raw_value_size": 117889, "raw_average_value_size": 53, "num_data_blocks": 43, "num_entries": 2192, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692201400, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "I619BZ3044XM4L1BC529", "orig_file_number": 158, "seqno_to_time_mapping": "N/A"}} -2023/08/17-00:56:40.384513 8651103744 EVENT_LOG_v1 {"time_micros": 1692201400384511, "job": 1, "event": "recovery_finished"} -2023/08/17-00:56:40.384639 8651103744 [db/version_set.cc:5180] Creating manifest 160 -2023/08/17-00:56:40.387235 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000154.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/17-00:56:40.387304 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x15c0041f0 -2023/08/17-00:56:40.387408 8651103744 DB pointer 0x15b808800 -2023/08/17-00:56:40.387430 6166163456 [db/compaction/compaction_job.cc:1988] [default] [JOB 3] Compacting 4@0 + 1@1 files to L1, score 1.00 -2023/08/17-00:56:40.387438 6166163456 [db/compaction/compaction_job.cc:1992] [default]: Compaction start summary: Base version 2 Base level 0, inputs: [158(101KB) 153(65KB) 148(144KB) 143(129KB)], [140(1295KB)] -2023/08/17-00:56:40.387448 6166163456 EVENT_LOG_v1 {"time_micros": 1692201400387440, "job": 3, "event": "compaction_started", "compaction_reason": "LevelL0FilesNum", "files_L0": [158, 153, 148, 143], "files_L1": [140], "score": 1, "input_data_size": 1778782, "oldest_snapshot_seqno": -1} -2023/08/17-00:56:40.387629 6167310336 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/17-00:56:40.387676 6167310336 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 4/4 441.92 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 23.4 0.00 0.00 1 0.004 0 0 0.0 0.0 - L1 1/1 1.26 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 5/5 1.70 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 23.4 0.00 0.00 1 0.004 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 23.4 0.00 0.00 1 0.004 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.4 0.00 0.00 1 0.004 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 5.18 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 5.18 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000034600d8#5832 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 4.4e-05 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** -2023/08/17-00:56:40.477749 6166163456 [db/compaction/compaction_job.cc:1592] [default] [JOB 3] Generated table #163: 37769 keys, 1777971 bytes, temperature: kUnknown -2023/08/17-00:56:40.477786 6166163456 EVENT_LOG_v1 {"time_micros": 1692201400477763, "cf_name": "default", "job": 3, "event": "table_file_creation", "file_number": 163, "file_size": 1777971, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 0, "largest_seqno": 0, "table_properties": {"data_size": 1765921, "index_size": 34071, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 2514551, "raw_average_key_size": 66, "raw_value_size": 1843916, "raw_average_value_size": 48, "num_data_blocks": 784, "num_entries": 37769, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692109142, "oldest_key_time": 0, "file_creation_time": 1692201400, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "I619BZ3044XM4L1BC529", "orig_file_number": 163, "seqno_to_time_mapping": "N/A"}} -2023/08/17-00:56:40.478377 6166163456 (Original Log Time 2023/08/17-00:56:40.478095) [db/compaction/compaction_job.cc:1663] [default] [JOB 3] Compacted 4@0 + 1@1 files to L1 => 1777971 bytes -2023/08/17-00:56:40.478379 6166163456 (Original Log Time 2023/08/17-00:56:40.478287) [db/compaction/compaction_job.cc:885] [default] compacted to: files[0 1 0 0 0 0 0] max score 0.01, MB/sec: 19.7 rd, 19.7 wr, level 1, files in(4, 1) out(1 +0 blob) MB in(0.4, 1.3 +0.0 blob) out(1.7 +0.0 blob), read-write-amplify(7.9) write-amplify(3.9) OK, records in: 37773, records dropped: 4 output_compression: Snappy -2023/08/17-00:56:40.478381 6166163456 (Original Log Time 2023/08/17-00:56:40.478308) EVENT_LOG_v1 {"time_micros": 1692201400478292, "job": 3, "event": "compaction_finished", "compaction_time_micros": 90417, "compaction_time_cpu_micros": 89454, "output_level": 1, "num_output_files": 1, "total_output_size": 1777971, "num_input_records": 37773, "num_output_records": 37769, "num_subcompactions": 1, "output_compression": "Snappy", "num_single_delete_mismatches": 0, "num_single_delete_fallthrough": 0, "lsm_state": [0, 1, 0, 0, 0, 0, 0]} -2023/08/17-00:56:40.478475 6166163456 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000158.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/17-00:56:40.478481 6166163456 EVENT_LOG_v1 {"time_micros": 1692201400478479, "job": 3, "event": "table_file_deletion", "file_number": 158} -2023/08/17-00:56:40.478543 6166163456 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000153.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/17-00:56:40.478547 6166163456 EVENT_LOG_v1 {"time_micros": 1692201400478545, "job": 3, "event": "table_file_deletion", "file_number": 153} -2023/08/17-00:56:40.478600 6166163456 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000148.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/17-00:56:40.478604 6166163456 EVENT_LOG_v1 {"time_micros": 1692201400478603, "job": 3, "event": "table_file_deletion", "file_number": 148} -2023/08/17-00:56:40.478660 6166163456 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000143.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/17-00:56:40.478663 6166163456 EVENT_LOG_v1 {"time_micros": 1692201400478662, "job": 3, "event": "table_file_deletion", "file_number": 143} -2023/08/17-00:56:40.478732 6166163456 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000140.sst immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/17-00:56:40.478735 6166163456 EVENT_LOG_v1 {"time_micros": 1692201400478734, "job": 3, "event": "table_file_deletion", "file_number": 140} diff --git a/rust/hyperlane_db/LOG.old.1692252384108942 b/rust/hyperlane_db/LOG.old.1692252384108942 deleted file mode 100644 index a084653d25..0000000000 --- a/rust/hyperlane_db/LOG.old.1692252384108942 +++ /dev/null @@ -1,286 +0,0 @@ -2023/08/17-01:00:34.077422 8651103744 RocksDB version: 8.1.1 -2023/08/17-01:00:34.077861 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/17-01:00:34.077863 8651103744 DB SUMMARY -2023/08/17-01:00:34.077864 8651103744 DB Session ID: 0F8HEMW6ECBNV1ELQ4RP -2023/08/17-01:00:34.077949 8651103744 CURRENT file: CURRENT -2023/08/17-01:00:34.077951 8651103744 IDENTITY file: IDENTITY -2023/08/17-01:00:34.077965 8651103744 MANIFEST file: MANIFEST-000160 size: 1200 Bytes -2023/08/17-01:00:34.077978 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 1, files: 000163.sst -2023/08/17-01:00:34.077979 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000159.log size: 103252 ; -2023/08/17-01:00:34.077981 8651103744 Options.error_if_exists: 0 -2023/08/17-01:00:34.077982 8651103744 Options.create_if_missing: 1 -2023/08/17-01:00:34.077983 8651103744 Options.paranoid_checks: 1 -2023/08/17-01:00:34.077984 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/17-01:00:34.077985 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/17-01:00:34.077986 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/17-01:00:34.077987 8651103744 Options.env: 0x104ef96e0 -2023/08/17-01:00:34.077988 8651103744 Options.fs: PosixFileSystem -2023/08/17-01:00:34.077989 8651103744 Options.info_log: 0x13660a738 -2023/08/17-01:00:34.077990 8651103744 Options.max_file_opening_threads: 16 -2023/08/17-01:00:34.077990 8651103744 Options.statistics: 0x0 -2023/08/17-01:00:34.077991 8651103744 Options.use_fsync: 0 -2023/08/17-01:00:34.077992 8651103744 Options.max_log_file_size: 0 -2023/08/17-01:00:34.077993 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/17-01:00:34.077994 8651103744 Options.log_file_time_to_roll: 0 -2023/08/17-01:00:34.077995 8651103744 Options.keep_log_file_num: 1000 -2023/08/17-01:00:34.077996 8651103744 Options.recycle_log_file_num: 0 -2023/08/17-01:00:34.077997 8651103744 Options.allow_fallocate: 1 -2023/08/17-01:00:34.077998 8651103744 Options.allow_mmap_reads: 0 -2023/08/17-01:00:34.077999 8651103744 Options.allow_mmap_writes: 0 -2023/08/17-01:00:34.077999 8651103744 Options.use_direct_reads: 0 -2023/08/17-01:00:34.078000 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/17-01:00:34.078001 8651103744 Options.create_missing_column_families: 0 -2023/08/17-01:00:34.078002 8651103744 Options.db_log_dir: -2023/08/17-01:00:34.078003 8651103744 Options.wal_dir: -2023/08/17-01:00:34.078004 8651103744 Options.table_cache_numshardbits: 6 -2023/08/17-01:00:34.078004 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/17-01:00:34.078005 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/17-01:00:34.078006 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/17-01:00:34.078007 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/17-01:00:34.078008 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/17-01:00:34.078009 8651103744 Options.advise_random_on_open: 1 -2023/08/17-01:00:34.078010 8651103744 Options.db_write_buffer_size: 0 -2023/08/17-01:00:34.078011 8651103744 Options.write_buffer_manager: 0x6000039e9380 -2023/08/17-01:00:34.078011 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/17-01:00:34.078012 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/17-01:00:34.078013 8651103744 Options.use_adaptive_mutex: 0 -2023/08/17-01:00:34.078014 8651103744 Options.rate_limiter: 0x0 -2023/08/17-01:00:34.078015 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/17-01:00:34.078016 8651103744 Options.wal_recovery_mode: 2 -2023/08/17-01:00:34.078017 8651103744 Options.enable_thread_tracking: 0 -2023/08/17-01:00:34.078018 8651103744 Options.enable_pipelined_write: 0 -2023/08/17-01:00:34.078018 8651103744 Options.unordered_write: 0 -2023/08/17-01:00:34.078019 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/17-01:00:34.078020 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/17-01:00:34.078021 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/17-01:00:34.078022 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/17-01:00:34.078023 8651103744 Options.row_cache: None -2023/08/17-01:00:34.078024 8651103744 Options.wal_filter: None -2023/08/17-01:00:34.078025 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/17-01:00:34.078026 8651103744 Options.allow_ingest_behind: 0 -2023/08/17-01:00:34.078026 8651103744 Options.two_write_queues: 0 -2023/08/17-01:00:34.078027 8651103744 Options.manual_wal_flush: 0 -2023/08/17-01:00:34.078028 8651103744 Options.wal_compression: 0 -2023/08/17-01:00:34.078029 8651103744 Options.atomic_flush: 0 -2023/08/17-01:00:34.078030 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/17-01:00:34.078031 8651103744 Options.persist_stats_to_disk: 0 -2023/08/17-01:00:34.078032 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/17-01:00:34.078032 8651103744 Options.log_readahead_size: 0 -2023/08/17-01:00:34.078033 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/17-01:00:34.078034 8651103744 Options.best_efforts_recovery: 0 -2023/08/17-01:00:34.078035 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/17-01:00:34.078036 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/17-01:00:34.078037 8651103744 Options.allow_data_in_errors: 0 -2023/08/17-01:00:34.078038 8651103744 Options.db_host_id: __hostname__ -2023/08/17-01:00:34.078039 8651103744 Options.enforce_single_del_contracts: true -2023/08/17-01:00:34.078040 8651103744 Options.max_background_jobs: 2 -2023/08/17-01:00:34.078041 8651103744 Options.max_background_compactions: -1 -2023/08/17-01:00:34.078041 8651103744 Options.max_subcompactions: 1 -2023/08/17-01:00:34.078042 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/17-01:00:34.078043 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/17-01:00:34.078044 8651103744 Options.delayed_write_rate : 16777216 -2023/08/17-01:00:34.078045 8651103744 Options.max_total_wal_size: 0 -2023/08/17-01:00:34.078046 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/17-01:00:34.078047 8651103744 Options.stats_dump_period_sec: 600 -2023/08/17-01:00:34.078048 8651103744 Options.stats_persist_period_sec: 600 -2023/08/17-01:00:34.078049 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/17-01:00:34.078049 8651103744 Options.max_open_files: -1 -2023/08/17-01:00:34.078050 8651103744 Options.bytes_per_sync: 0 -2023/08/17-01:00:34.078051 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/17-01:00:34.078052 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/17-01:00:34.078053 8651103744 Options.compaction_readahead_size: 0 -2023/08/17-01:00:34.078054 8651103744 Options.max_background_flushes: -1 -2023/08/17-01:00:34.078055 8651103744 Compression algorithms supported: -2023/08/17-01:00:34.078067 8651103744 kZSTD supported: 1 -2023/08/17-01:00:34.078068 8651103744 kZlibCompression supported: 1 -2023/08/17-01:00:34.078069 8651103744 kXpressCompression supported: 0 -2023/08/17-01:00:34.078070 8651103744 kSnappyCompression supported: 1 -2023/08/17-01:00:34.078071 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/17-01:00:34.078072 8651103744 kLZ4HCCompression supported: 1 -2023/08/17-01:00:34.078073 8651103744 kLZ4Compression supported: 1 -2023/08/17-01:00:34.078074 8651103744 kBZip2Compression supported: 1 -2023/08/17-01:00:34.078079 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/17-01:00:34.078080 8651103744 DMutex implementation: pthread_mutex_t -2023/08/17-01:00:34.078182 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000160 -2023/08/17-01:00:34.078394 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/17-01:00:34.078396 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/17-01:00:34.078396 8651103744 Options.merge_operator: None -2023/08/17-01:00:34.078397 8651103744 Options.compaction_filter: None -2023/08/17-01:00:34.078398 8651103744 Options.compaction_filter_factory: None -2023/08/17-01:00:34.078399 8651103744 Options.sst_partitioner_factory: None -2023/08/17-01:00:34.078400 8651103744 Options.memtable_factory: SkipListFactory -2023/08/17-01:00:34.078401 8651103744 Options.table_factory: BlockBasedTable -2023/08/17-01:00:34.078413 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x6000002e4640) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000037e86d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/17-01:00:34.078414 8651103744 Options.write_buffer_size: 67108864 -2023/08/17-01:00:34.078415 8651103744 Options.max_write_buffer_number: 2 -2023/08/17-01:00:34.078416 8651103744 Options.compression: Snappy -2023/08/17-01:00:34.078417 8651103744 Options.bottommost_compression: Disabled -2023/08/17-01:00:34.078418 8651103744 Options.prefix_extractor: nullptr -2023/08/17-01:00:34.078419 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/17-01:00:34.078420 8651103744 Options.num_levels: 7 -2023/08/17-01:00:34.078421 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/17-01:00:34.078422 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/17-01:00:34.078423 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/17-01:00:34.078423 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/17-01:00:34.078424 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/17-01:00:34.078425 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/17-01:00:34.078426 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/17-01:00:34.078427 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/17-01:00:34.078428 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/17-01:00:34.078429 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/17-01:00:34.078430 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/17-01:00:34.078431 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/17-01:00:34.078431 8651103744 Options.compression_opts.window_bits: -14 -2023/08/17-01:00:34.078432 8651103744 Options.compression_opts.level: 32767 -2023/08/17-01:00:34.078433 8651103744 Options.compression_opts.strategy: 0 -2023/08/17-01:00:34.078434 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/17-01:00:34.078435 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/17-01:00:34.078436 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/17-01:00:34.078437 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/17-01:00:34.078437 8651103744 Options.compression_opts.enabled: false -2023/08/17-01:00:34.078438 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/17-01:00:34.078439 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/17-01:00:34.078440 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/17-01:00:34.078441 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/17-01:00:34.078442 8651103744 Options.target_file_size_base: 67108864 -2023/08/17-01:00:34.078443 8651103744 Options.target_file_size_multiplier: 1 -2023/08/17-01:00:34.078444 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/17-01:00:34.078444 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/17-01:00:34.078445 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/17-01:00:34.078446 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/17-01:00:34.078447 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/17-01:00:34.078448 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/17-01:00:34.078449 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/17-01:00:34.078450 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/17-01:00:34.078451 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/17-01:00:34.078452 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/17-01:00:34.078452 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/17-01:00:34.078453 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/17-01:00:34.078454 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/17-01:00:34.078455 8651103744 Options.arena_block_size: 1048576 -2023/08/17-01:00:34.078456 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/17-01:00:34.078457 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/17-01:00:34.078458 8651103744 Options.disable_auto_compactions: 0 -2023/08/17-01:00:34.078459 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/17-01:00:34.078461 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/17-01:00:34.078461 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/17-01:00:34.078462 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/17-01:00:34.078463 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/17-01:00:34.078464 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/17-01:00:34.078465 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/17-01:00:34.078468 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/17-01:00:34.078468 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/17-01:00:34.078469 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/17-01:00:34.078471 8651103744 Options.table_properties_collectors: -2023/08/17-01:00:34.078472 8651103744 Options.inplace_update_support: 0 -2023/08/17-01:00:34.078473 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/17-01:00:34.078473 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/17-01:00:34.078474 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/17-01:00:34.078475 8651103744 Options.memtable_huge_page_size: 0 -2023/08/17-01:00:34.078476 8651103744 Options.bloom_locality: 0 -2023/08/17-01:00:34.078477 8651103744 Options.max_successive_merges: 0 -2023/08/17-01:00:34.078478 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/17-01:00:34.078478 8651103744 Options.paranoid_file_checks: 0 -2023/08/17-01:00:34.078479 8651103744 Options.force_consistency_checks: 1 -2023/08/17-01:00:34.078480 8651103744 Options.report_bg_io_stats: 0 -2023/08/17-01:00:34.078481 8651103744 Options.ttl: 2592000 -2023/08/17-01:00:34.078482 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/17-01:00:34.078483 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/17-01:00:34.078483 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/17-01:00:34.078484 8651103744 Options.enable_blob_files: false -2023/08/17-01:00:34.078485 8651103744 Options.min_blob_size: 0 -2023/08/17-01:00:34.078486 8651103744 Options.blob_file_size: 268435456 -2023/08/17-01:00:34.078487 8651103744 Options.blob_compression_type: NoCompression -2023/08/17-01:00:34.078488 8651103744 Options.enable_blob_garbage_collection: false -2023/08/17-01:00:34.078488 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/17-01:00:34.078489 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/17-01:00:34.078490 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/17-01:00:34.078491 8651103744 Options.blob_file_starting_level: 0 -2023/08/17-01:00:34.078492 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/17-01:00:34.079624 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000160 succeeded,manifest_file_number is 160, next_file_number is 165, last_sequence is 38541, log_number is 155,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 155 -2023/08/17-01:00:34.079628 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 155 -2023/08/17-01:00:34.079672 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/17-01:00:34.079857 8651103744 EVENT_LOG_v1 {"time_micros": 1692201634079849, "job": 1, "event": "recovery_started", "wal_files": [159]} -2023/08/17-01:00:34.079860 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #159 mode 2 -2023/08/17-01:00:34.085829 8651103744 EVENT_LOG_v1 {"time_micros": 1692201634085809, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 166, "file_size": 41482, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 38542, "largest_seqno": 39444, "table_properties": {"data_size": 40187, "index_size": 599, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 40936, "raw_average_key_size": 45, "raw_value_size": 49614, "raw_average_value_size": 54, "num_data_blocks": 18, "num_entries": 903, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692201634, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "0F8HEMW6ECBNV1ELQ4RP", "orig_file_number": 166, "seqno_to_time_mapping": "N/A"}} -2023/08/17-01:00:34.085912 8651103744 EVENT_LOG_v1 {"time_micros": 1692201634085910, "job": 1, "event": "recovery_finished"} -2023/08/17-01:00:34.086024 8651103744 [db/version_set.cc:5180] Creating manifest 168 -2023/08/17-01:00:34.088749 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000159.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/17-01:00:34.088808 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x13660a890 -2023/08/17-01:00:34.088890 8651103744 DB pointer 0x136821400 -2023/08/17-01:00:34.089110 6172700672 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/17-01:00:34.089113 6172700672 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 1/0 40.51 KB 0.2 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 16.2 0.00 0.00 1 0.002 0 0 0.0 0.0 - L1 1/0 1.70 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 2/0 1.74 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 16.2 0.00 0.00 1 0.002 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 16.2 0.00 0.00 1 0.002 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 16.2 0.00 0.00 1 0.002 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 3.68 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 3.68 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000037e86d8#5940 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 5e-05 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692253121310466 b/rust/hyperlane_db/LOG.old.1692253121310466 deleted file mode 100644 index 53a353fb56..0000000000 --- a/rust/hyperlane_db/LOG.old.1692253121310466 +++ /dev/null @@ -1,283 +0,0 @@ -2023/08/17-15:06:24.110139 8651103744 RocksDB version: 8.1.1 -2023/08/17-15:06:24.110636 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/17-15:06:24.110638 8651103744 DB SUMMARY -2023/08/17-15:06:24.110639 8651103744 DB Session ID: 450JOAXFTJ4HW03QQBVF -2023/08/17-15:06:24.110738 8651103744 CURRENT file: CURRENT -2023/08/17-15:06:24.110739 8651103744 IDENTITY file: IDENTITY -2023/08/17-15:06:24.110754 8651103744 MANIFEST file: MANIFEST-000168 size: 486 Bytes -2023/08/17-15:06:24.110768 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 2, files: 000163.sst 000166.sst -2023/08/17-15:06:24.110769 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000167.log size: 0 ; -2023/08/17-15:06:24.110772 8651103744 Options.error_if_exists: 0 -2023/08/17-15:06:24.110773 8651103744 Options.create_if_missing: 1 -2023/08/17-15:06:24.110774 8651103744 Options.paranoid_checks: 1 -2023/08/17-15:06:24.110775 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/17-15:06:24.110776 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/17-15:06:24.110777 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/17-15:06:24.110778 8651103744 Options.env: 0x107ba96e0 -2023/08/17-15:06:24.110779 8651103744 Options.fs: PosixFileSystem -2023/08/17-15:06:24.110780 8651103744 Options.info_log: 0x12cf04098 -2023/08/17-15:06:24.110781 8651103744 Options.max_file_opening_threads: 16 -2023/08/17-15:06:24.110782 8651103744 Options.statistics: 0x0 -2023/08/17-15:06:24.110783 8651103744 Options.use_fsync: 0 -2023/08/17-15:06:24.110784 8651103744 Options.max_log_file_size: 0 -2023/08/17-15:06:24.110785 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/17-15:06:24.110786 8651103744 Options.log_file_time_to_roll: 0 -2023/08/17-15:06:24.110787 8651103744 Options.keep_log_file_num: 1000 -2023/08/17-15:06:24.110788 8651103744 Options.recycle_log_file_num: 0 -2023/08/17-15:06:24.110789 8651103744 Options.allow_fallocate: 1 -2023/08/17-15:06:24.110790 8651103744 Options.allow_mmap_reads: 0 -2023/08/17-15:06:24.110790 8651103744 Options.allow_mmap_writes: 0 -2023/08/17-15:06:24.110791 8651103744 Options.use_direct_reads: 0 -2023/08/17-15:06:24.110792 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/17-15:06:24.110793 8651103744 Options.create_missing_column_families: 0 -2023/08/17-15:06:24.110794 8651103744 Options.db_log_dir: -2023/08/17-15:06:24.110795 8651103744 Options.wal_dir: -2023/08/17-15:06:24.110796 8651103744 Options.table_cache_numshardbits: 6 -2023/08/17-15:06:24.110797 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/17-15:06:24.110798 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/17-15:06:24.110799 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/17-15:06:24.110800 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/17-15:06:24.110801 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/17-15:06:24.110801 8651103744 Options.advise_random_on_open: 1 -2023/08/17-15:06:24.110802 8651103744 Options.db_write_buffer_size: 0 -2023/08/17-15:06:24.110803 8651103744 Options.write_buffer_manager: 0x6000027b0000 -2023/08/17-15:06:24.110804 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/17-15:06:24.110805 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/17-15:06:24.110806 8651103744 Options.use_adaptive_mutex: 0 -2023/08/17-15:06:24.110807 8651103744 Options.rate_limiter: 0x0 -2023/08/17-15:06:24.110808 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/17-15:06:24.110809 8651103744 Options.wal_recovery_mode: 2 -2023/08/17-15:06:24.110810 8651103744 Options.enable_thread_tracking: 0 -2023/08/17-15:06:24.110811 8651103744 Options.enable_pipelined_write: 0 -2023/08/17-15:06:24.110812 8651103744 Options.unordered_write: 0 -2023/08/17-15:06:24.110813 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/17-15:06:24.110814 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/17-15:06:24.110814 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/17-15:06:24.110815 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/17-15:06:24.110816 8651103744 Options.row_cache: None -2023/08/17-15:06:24.110817 8651103744 Options.wal_filter: None -2023/08/17-15:06:24.110818 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/17-15:06:24.110819 8651103744 Options.allow_ingest_behind: 0 -2023/08/17-15:06:24.110820 8651103744 Options.two_write_queues: 0 -2023/08/17-15:06:24.110821 8651103744 Options.manual_wal_flush: 0 -2023/08/17-15:06:24.110822 8651103744 Options.wal_compression: 0 -2023/08/17-15:06:24.110823 8651103744 Options.atomic_flush: 0 -2023/08/17-15:06:24.110824 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/17-15:06:24.110825 8651103744 Options.persist_stats_to_disk: 0 -2023/08/17-15:06:24.110826 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/17-15:06:24.110827 8651103744 Options.log_readahead_size: 0 -2023/08/17-15:06:24.110828 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/17-15:06:24.110829 8651103744 Options.best_efforts_recovery: 0 -2023/08/17-15:06:24.110830 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/17-15:06:24.110831 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/17-15:06:24.110832 8651103744 Options.allow_data_in_errors: 0 -2023/08/17-15:06:24.110833 8651103744 Options.db_host_id: __hostname__ -2023/08/17-15:06:24.110834 8651103744 Options.enforce_single_del_contracts: true -2023/08/17-15:06:24.110835 8651103744 Options.max_background_jobs: 2 -2023/08/17-15:06:24.110836 8651103744 Options.max_background_compactions: -1 -2023/08/17-15:06:24.110837 8651103744 Options.max_subcompactions: 1 -2023/08/17-15:06:24.110838 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/17-15:06:24.110838 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/17-15:06:24.110839 8651103744 Options.delayed_write_rate : 16777216 -2023/08/17-15:06:24.110840 8651103744 Options.max_total_wal_size: 0 -2023/08/17-15:06:24.110841 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/17-15:06:24.110842 8651103744 Options.stats_dump_period_sec: 600 -2023/08/17-15:06:24.110843 8651103744 Options.stats_persist_period_sec: 600 -2023/08/17-15:06:24.110844 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/17-15:06:24.110845 8651103744 Options.max_open_files: -1 -2023/08/17-15:06:24.110846 8651103744 Options.bytes_per_sync: 0 -2023/08/17-15:06:24.110847 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/17-15:06:24.110848 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/17-15:06:24.110849 8651103744 Options.compaction_readahead_size: 0 -2023/08/17-15:06:24.110850 8651103744 Options.max_background_flushes: -1 -2023/08/17-15:06:24.110850 8651103744 Compression algorithms supported: -2023/08/17-15:06:24.110864 8651103744 kZSTD supported: 1 -2023/08/17-15:06:24.110865 8651103744 kZlibCompression supported: 1 -2023/08/17-15:06:24.110866 8651103744 kXpressCompression supported: 0 -2023/08/17-15:06:24.110867 8651103744 kSnappyCompression supported: 1 -2023/08/17-15:06:24.110868 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/17-15:06:24.110870 8651103744 kLZ4HCCompression supported: 1 -2023/08/17-15:06:24.110871 8651103744 kLZ4Compression supported: 1 -2023/08/17-15:06:24.110872 8651103744 kBZip2Compression supported: 1 -2023/08/17-15:06:24.110877 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/17-15:06:24.110878 8651103744 DMutex implementation: pthread_mutex_t -2023/08/17-15:06:24.111151 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000168 -2023/08/17-15:06:24.111434 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/17-15:06:24.111436 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/17-15:06:24.111438 8651103744 Options.merge_operator: None -2023/08/17-15:06:24.111439 8651103744 Options.compaction_filter: None -2023/08/17-15:06:24.111440 8651103744 Options.compaction_filter_factory: None -2023/08/17-15:06:24.111441 8651103744 Options.sst_partitioner_factory: None -2023/08/17-15:06:24.111442 8651103744 Options.memtable_factory: SkipListFactory -2023/08/17-15:06:24.111443 8651103744 Options.table_factory: BlockBasedTable -2023/08/17-15:06:24.111471 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600001cb8640) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000029b46d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/17-15:06:24.111473 8651103744 Options.write_buffer_size: 67108864 -2023/08/17-15:06:24.111475 8651103744 Options.max_write_buffer_number: 2 -2023/08/17-15:06:24.111476 8651103744 Options.compression: Snappy -2023/08/17-15:06:24.111477 8651103744 Options.bottommost_compression: Disabled -2023/08/17-15:06:24.111478 8651103744 Options.prefix_extractor: nullptr -2023/08/17-15:06:24.111479 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/17-15:06:24.111480 8651103744 Options.num_levels: 7 -2023/08/17-15:06:24.111481 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/17-15:06:24.111482 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/17-15:06:24.111483 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/17-15:06:24.111484 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/17-15:06:24.111485 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/17-15:06:24.111486 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/17-15:06:24.111487 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/17-15:06:24.111487 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/17-15:06:24.111488 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/17-15:06:24.111489 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/17-15:06:24.111490 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/17-15:06:24.111491 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/17-15:06:24.111492 8651103744 Options.compression_opts.window_bits: -14 -2023/08/17-15:06:24.111493 8651103744 Options.compression_opts.level: 32767 -2023/08/17-15:06:24.111494 8651103744 Options.compression_opts.strategy: 0 -2023/08/17-15:06:24.111495 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/17-15:06:24.111496 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/17-15:06:24.111497 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/17-15:06:24.111498 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/17-15:06:24.111498 8651103744 Options.compression_opts.enabled: false -2023/08/17-15:06:24.111499 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/17-15:06:24.111500 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/17-15:06:24.111501 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/17-15:06:24.111502 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/17-15:06:24.111503 8651103744 Options.target_file_size_base: 67108864 -2023/08/17-15:06:24.111504 8651103744 Options.target_file_size_multiplier: 1 -2023/08/17-15:06:24.111505 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/17-15:06:24.111506 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/17-15:06:24.111507 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/17-15:06:24.111508 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/17-15:06:24.111509 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/17-15:06:24.111510 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/17-15:06:24.111511 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/17-15:06:24.111512 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/17-15:06:24.111512 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/17-15:06:24.111513 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/17-15:06:24.111514 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/17-15:06:24.111515 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/17-15:06:24.111516 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/17-15:06:24.111517 8651103744 Options.arena_block_size: 1048576 -2023/08/17-15:06:24.111518 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/17-15:06:24.111519 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/17-15:06:24.111520 8651103744 Options.disable_auto_compactions: 0 -2023/08/17-15:06:24.111522 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/17-15:06:24.111523 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/17-15:06:24.111524 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/17-15:06:24.111525 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/17-15:06:24.111526 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/17-15:06:24.111527 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/17-15:06:24.111528 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/17-15:06:24.111531 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/17-15:06:24.111532 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/17-15:06:24.111533 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/17-15:06:24.111535 8651103744 Options.table_properties_collectors: -2023/08/17-15:06:24.111536 8651103744 Options.inplace_update_support: 0 -2023/08/17-15:06:24.111537 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/17-15:06:24.111538 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/17-15:06:24.111539 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/17-15:06:24.111540 8651103744 Options.memtable_huge_page_size: 0 -2023/08/17-15:06:24.111541 8651103744 Options.bloom_locality: 0 -2023/08/17-15:06:24.111542 8651103744 Options.max_successive_merges: 0 -2023/08/17-15:06:24.111543 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/17-15:06:24.111544 8651103744 Options.paranoid_file_checks: 0 -2023/08/17-15:06:24.111545 8651103744 Options.force_consistency_checks: 1 -2023/08/17-15:06:24.111545 8651103744 Options.report_bg_io_stats: 0 -2023/08/17-15:06:24.111546 8651103744 Options.ttl: 2592000 -2023/08/17-15:06:24.111547 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/17-15:06:24.111548 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/17-15:06:24.111549 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/17-15:06:24.111550 8651103744 Options.enable_blob_files: false -2023/08/17-15:06:24.111551 8651103744 Options.min_blob_size: 0 -2023/08/17-15:06:24.111552 8651103744 Options.blob_file_size: 268435456 -2023/08/17-15:06:24.111553 8651103744 Options.blob_compression_type: NoCompression -2023/08/17-15:06:24.111554 8651103744 Options.enable_blob_garbage_collection: false -2023/08/17-15:06:24.111555 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/17-15:06:24.111556 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/17-15:06:24.111557 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/17-15:06:24.111558 8651103744 Options.blob_file_starting_level: 0 -2023/08/17-15:06:24.111559 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/17-15:06:24.112835 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000168 succeeded,manifest_file_number is 168, next_file_number is 170, last_sequence is 39444, log_number is 160,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 160 -2023/08/17-15:06:24.112839 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 160 -2023/08/17-15:06:24.113037 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/17-15:06:24.113229 8651103744 EVENT_LOG_v1 {"time_micros": 1692252384113224, "job": 1, "event": "recovery_started", "wal_files": [167]} -2023/08/17-15:06:24.113232 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #167 mode 2 -2023/08/17-15:06:24.113288 8651103744 EVENT_LOG_v1 {"time_micros": 1692252384113286, "job": 1, "event": "recovery_finished"} -2023/08/17-15:06:24.113409 8651103744 [db/version_set.cc:5180] Creating manifest 172 -2023/08/17-15:06:24.116060 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x12ce0aa30 -2023/08/17-15:06:24.116146 8651103744 DB pointer 0x12d808200 -2023/08/17-15:06:24.116347 6125842432 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/17-15:06:24.116350 6125842432 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 1/0 40.51 KB 0.2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - L1 1/0 1.70 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 2/0 1.74 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000029b46d8#10995 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 4.4e-05 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/LOG.old.1692253194212630 b/rust/hyperlane_db/LOG.old.1692253194212630 deleted file mode 100644 index e189c5c161..0000000000 --- a/rust/hyperlane_db/LOG.old.1692253194212630 +++ /dev/null @@ -1,290 +0,0 @@ -2023/08/17-15:18:41.311881 8651103744 RocksDB version: 8.1.1 -2023/08/17-15:18:41.312342 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/17-15:18:41.312344 8651103744 DB SUMMARY -2023/08/17-15:18:41.312346 8651103744 DB Session ID: RFCBSQ5TK18711I4RR3B -2023/08/17-15:18:41.312458 8651103744 CURRENT file: CURRENT -2023/08/17-15:18:41.312460 8651103744 IDENTITY file: IDENTITY -2023/08/17-15:18:41.312475 8651103744 MANIFEST file: MANIFEST-000172 size: 467 Bytes -2023/08/17-15:18:41.312492 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 2, files: 000163.sst 000166.sst -2023/08/17-15:18:41.312494 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000167.log size: 0 ; 000171.log size: 238037 ; -2023/08/17-15:18:41.312496 8651103744 Options.error_if_exists: 0 -2023/08/17-15:18:41.312497 8651103744 Options.create_if_missing: 1 -2023/08/17-15:18:41.312498 8651103744 Options.paranoid_checks: 1 -2023/08/17-15:18:41.312499 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/17-15:18:41.312500 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/17-15:18:41.312501 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/17-15:18:41.312502 8651103744 Options.env: 0x1051096e0 -2023/08/17-15:18:41.312503 8651103744 Options.fs: PosixFileSystem -2023/08/17-15:18:41.312504 8651103744 Options.info_log: 0x13c804098 -2023/08/17-15:18:41.312505 8651103744 Options.max_file_opening_threads: 16 -2023/08/17-15:18:41.312506 8651103744 Options.statistics: 0x0 -2023/08/17-15:18:41.312507 8651103744 Options.use_fsync: 0 -2023/08/17-15:18:41.312508 8651103744 Options.max_log_file_size: 0 -2023/08/17-15:18:41.312509 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/17-15:18:41.312509 8651103744 Options.log_file_time_to_roll: 0 -2023/08/17-15:18:41.312510 8651103744 Options.keep_log_file_num: 1000 -2023/08/17-15:18:41.312511 8651103744 Options.recycle_log_file_num: 0 -2023/08/17-15:18:41.312512 8651103744 Options.allow_fallocate: 1 -2023/08/17-15:18:41.312513 8651103744 Options.allow_mmap_reads: 0 -2023/08/17-15:18:41.312514 8651103744 Options.allow_mmap_writes: 0 -2023/08/17-15:18:41.312515 8651103744 Options.use_direct_reads: 0 -2023/08/17-15:18:41.312516 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/17-15:18:41.312517 8651103744 Options.create_missing_column_families: 0 -2023/08/17-15:18:41.312518 8651103744 Options.db_log_dir: -2023/08/17-15:18:41.312519 8651103744 Options.wal_dir: -2023/08/17-15:18:41.312520 8651103744 Options.table_cache_numshardbits: 6 -2023/08/17-15:18:41.312520 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/17-15:18:41.312521 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/17-15:18:41.312522 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/17-15:18:41.312523 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/17-15:18:41.312524 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/17-15:18:41.312525 8651103744 Options.advise_random_on_open: 1 -2023/08/17-15:18:41.312526 8651103744 Options.db_write_buffer_size: 0 -2023/08/17-15:18:41.312527 8651103744 Options.write_buffer_manager: 0x6000009cc000 -2023/08/17-15:18:41.312528 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/17-15:18:41.312529 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/17-15:18:41.312530 8651103744 Options.use_adaptive_mutex: 0 -2023/08/17-15:18:41.312531 8651103744 Options.rate_limiter: 0x0 -2023/08/17-15:18:41.312532 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/17-15:18:41.312533 8651103744 Options.wal_recovery_mode: 2 -2023/08/17-15:18:41.312534 8651103744 Options.enable_thread_tracking: 0 -2023/08/17-15:18:41.312535 8651103744 Options.enable_pipelined_write: 0 -2023/08/17-15:18:41.312536 8651103744 Options.unordered_write: 0 -2023/08/17-15:18:41.312537 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/17-15:18:41.312538 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/17-15:18:41.312539 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/17-15:18:41.312540 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/17-15:18:41.312541 8651103744 Options.row_cache: None -2023/08/17-15:18:41.312541 8651103744 Options.wal_filter: None -2023/08/17-15:18:41.312542 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/17-15:18:41.312544 8651103744 Options.allow_ingest_behind: 0 -2023/08/17-15:18:41.312544 8651103744 Options.two_write_queues: 0 -2023/08/17-15:18:41.312545 8651103744 Options.manual_wal_flush: 0 -2023/08/17-15:18:41.312546 8651103744 Options.wal_compression: 0 -2023/08/17-15:18:41.312547 8651103744 Options.atomic_flush: 0 -2023/08/17-15:18:41.312548 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/17-15:18:41.312549 8651103744 Options.persist_stats_to_disk: 0 -2023/08/17-15:18:41.312550 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/17-15:18:41.312551 8651103744 Options.log_readahead_size: 0 -2023/08/17-15:18:41.312552 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/17-15:18:41.312564 8651103744 Options.best_efforts_recovery: 0 -2023/08/17-15:18:41.312565 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/17-15:18:41.312566 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/17-15:18:41.312567 8651103744 Options.allow_data_in_errors: 0 -2023/08/17-15:18:41.312568 8651103744 Options.db_host_id: __hostname__ -2023/08/17-15:18:41.312569 8651103744 Options.enforce_single_del_contracts: true -2023/08/17-15:18:41.312570 8651103744 Options.max_background_jobs: 2 -2023/08/17-15:18:41.312571 8651103744 Options.max_background_compactions: -1 -2023/08/17-15:18:41.312572 8651103744 Options.max_subcompactions: 1 -2023/08/17-15:18:41.312573 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/17-15:18:41.312574 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/17-15:18:41.312575 8651103744 Options.delayed_write_rate : 16777216 -2023/08/17-15:18:41.312576 8651103744 Options.max_total_wal_size: 0 -2023/08/17-15:18:41.312577 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/17-15:18:41.312578 8651103744 Options.stats_dump_period_sec: 600 -2023/08/17-15:18:41.312579 8651103744 Options.stats_persist_period_sec: 600 -2023/08/17-15:18:41.312580 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/17-15:18:41.312581 8651103744 Options.max_open_files: -1 -2023/08/17-15:18:41.312582 8651103744 Options.bytes_per_sync: 0 -2023/08/17-15:18:41.312583 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/17-15:18:41.312584 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/17-15:18:41.312584 8651103744 Options.compaction_readahead_size: 0 -2023/08/17-15:18:41.312585 8651103744 Options.max_background_flushes: -1 -2023/08/17-15:18:41.312586 8651103744 Compression algorithms supported: -2023/08/17-15:18:41.312600 8651103744 kZSTD supported: 1 -2023/08/17-15:18:41.312601 8651103744 kZlibCompression supported: 1 -2023/08/17-15:18:41.312602 8651103744 kXpressCompression supported: 0 -2023/08/17-15:18:41.312603 8651103744 kSnappyCompression supported: 1 -2023/08/17-15:18:41.312604 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/17-15:18:41.312606 8651103744 kLZ4HCCompression supported: 1 -2023/08/17-15:18:41.312607 8651103744 kLZ4Compression supported: 1 -2023/08/17-15:18:41.312608 8651103744 kBZip2Compression supported: 1 -2023/08/17-15:18:41.312614 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/17-15:18:41.312615 8651103744 DMutex implementation: pthread_mutex_t -2023/08/17-15:18:41.312878 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000172 -2023/08/17-15:18:41.313123 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/17-15:18:41.313125 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/17-15:18:41.313126 8651103744 Options.merge_operator: None -2023/08/17-15:18:41.313127 8651103744 Options.compaction_filter: None -2023/08/17-15:18:41.313128 8651103744 Options.compaction_filter_factory: None -2023/08/17-15:18:41.313129 8651103744 Options.sst_partitioner_factory: None -2023/08/17-15:18:41.313131 8651103744 Options.memtable_factory: SkipListFactory -2023/08/17-15:18:41.313132 8651103744 Options.table_factory: BlockBasedTable -2023/08/17-15:18:41.313144 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x6000032cc640) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000007c00d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/17-15:18:41.313147 8651103744 Options.write_buffer_size: 67108864 -2023/08/17-15:18:41.313148 8651103744 Options.max_write_buffer_number: 2 -2023/08/17-15:18:41.313149 8651103744 Options.compression: Snappy -2023/08/17-15:18:41.313150 8651103744 Options.bottommost_compression: Disabled -2023/08/17-15:18:41.313151 8651103744 Options.prefix_extractor: nullptr -2023/08/17-15:18:41.313152 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/17-15:18:41.313153 8651103744 Options.num_levels: 7 -2023/08/17-15:18:41.313154 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/17-15:18:41.313155 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/17-15:18:41.313156 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/17-15:18:41.313157 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/17-15:18:41.313158 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/17-15:18:41.313159 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/17-15:18:41.313160 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/17-15:18:41.313161 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/17-15:18:41.313162 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/17-15:18:41.313163 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/17-15:18:41.313164 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/17-15:18:41.313165 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/17-15:18:41.313166 8651103744 Options.compression_opts.window_bits: -14 -2023/08/17-15:18:41.313167 8651103744 Options.compression_opts.level: 32767 -2023/08/17-15:18:41.313168 8651103744 Options.compression_opts.strategy: 0 -2023/08/17-15:18:41.313168 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/17-15:18:41.313169 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/17-15:18:41.313170 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/17-15:18:41.313171 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/17-15:18:41.313172 8651103744 Options.compression_opts.enabled: false -2023/08/17-15:18:41.313173 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/17-15:18:41.313174 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/17-15:18:41.313175 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/17-15:18:41.313176 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/17-15:18:41.313177 8651103744 Options.target_file_size_base: 67108864 -2023/08/17-15:18:41.313178 8651103744 Options.target_file_size_multiplier: 1 -2023/08/17-15:18:41.313179 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/17-15:18:41.313180 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/17-15:18:41.313181 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/17-15:18:41.313182 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/17-15:18:41.313183 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/17-15:18:41.313184 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/17-15:18:41.313185 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/17-15:18:41.313186 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/17-15:18:41.313187 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/17-15:18:41.313188 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/17-15:18:41.313189 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/17-15:18:41.313190 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/17-15:18:41.313190 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/17-15:18:41.313191 8651103744 Options.arena_block_size: 1048576 -2023/08/17-15:18:41.313192 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/17-15:18:41.313193 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/17-15:18:41.313194 8651103744 Options.disable_auto_compactions: 0 -2023/08/17-15:18:41.313196 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/17-15:18:41.313197 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/17-15:18:41.313198 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/17-15:18:41.313199 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/17-15:18:41.313200 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/17-15:18:41.313201 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/17-15:18:41.313202 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/17-15:18:41.313205 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/17-15:18:41.313206 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/17-15:18:41.313207 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/17-15:18:41.313209 8651103744 Options.table_properties_collectors: -2023/08/17-15:18:41.313210 8651103744 Options.inplace_update_support: 0 -2023/08/17-15:18:41.313210 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/17-15:18:41.313211 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/17-15:18:41.313212 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/17-15:18:41.313213 8651103744 Options.memtable_huge_page_size: 0 -2023/08/17-15:18:41.313214 8651103744 Options.bloom_locality: 0 -2023/08/17-15:18:41.313215 8651103744 Options.max_successive_merges: 0 -2023/08/17-15:18:41.313216 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/17-15:18:41.313217 8651103744 Options.paranoid_file_checks: 0 -2023/08/17-15:18:41.313218 8651103744 Options.force_consistency_checks: 1 -2023/08/17-15:18:41.313219 8651103744 Options.report_bg_io_stats: 0 -2023/08/17-15:18:41.313220 8651103744 Options.ttl: 2592000 -2023/08/17-15:18:41.313221 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/17-15:18:41.313222 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/17-15:18:41.313222 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/17-15:18:41.313223 8651103744 Options.enable_blob_files: false -2023/08/17-15:18:41.313224 8651103744 Options.min_blob_size: 0 -2023/08/17-15:18:41.313225 8651103744 Options.blob_file_size: 268435456 -2023/08/17-15:18:41.313226 8651103744 Options.blob_compression_type: NoCompression -2023/08/17-15:18:41.313227 8651103744 Options.enable_blob_garbage_collection: false -2023/08/17-15:18:41.313228 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/17-15:18:41.313229 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/17-15:18:41.313230 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/17-15:18:41.313231 8651103744 Options.blob_file_starting_level: 0 -2023/08/17-15:18:41.313232 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/17-15:18:41.314589 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000172 succeeded,manifest_file_number is 172, next_file_number is 174, last_sequence is 39444, log_number is 168,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 160 -2023/08/17-15:18:41.314593 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 168 -2023/08/17-15:18:41.314782 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/17-15:18:41.314973 8651103744 EVENT_LOG_v1 {"time_micros": 1692253121314967, "job": 1, "event": "recovery_started", "wal_files": [167, 171]} -2023/08/17-15:18:41.314975 8651103744 [db/db_impl/db_impl_open.cc:1018] Skipping log #167 since it is older than min log to keep #168 -2023/08/17-15:18:41.314977 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #171 mode 2 -2023/08/17-15:18:41.328018 8651103744 EVENT_LOG_v1 {"time_micros": 1692253121327994, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 175, "file_size": 68671, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 40372, "largest_seqno": 41924, "table_properties": {"data_size": 67219, "index_size": 940, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 70840, "raw_average_key_size": 45, "raw_value_size": 77588, "raw_average_value_size": 50, "num_data_blocks": 29, "num_entries": 1551, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692253121, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "RFCBSQ5TK18711I4RR3B", "orig_file_number": 175, "seqno_to_time_mapping": "N/A"}} -2023/08/17-15:18:41.328106 8651103744 EVENT_LOG_v1 {"time_micros": 1692253121328104, "job": 1, "event": "recovery_finished"} -2023/08/17-15:18:41.328240 8651103744 [db/version_set.cc:5180] Creating manifest 177 -2023/08/17-15:18:41.331619 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000171.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/17-15:18:41.331648 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000167.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/17-15:18:41.331692 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x13c8041f0 -2023/08/17-15:18:41.331778 8651103744 DB pointer 0x13c014600 -2023/08/17-15:18:41.331990 6171258880 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/17-15:18:41.332032 6171258880 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 2/0 107.57 KB 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 19.7 0.00 0.00 1 0.003 0 0 0.0 0.0 - L1 1/0 1.70 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 3/0 1.80 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 19.7 0.00 0.00 1 0.003 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 19.7 0.00 0.00 1 0.003 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 19.7 0.00 0.00 1 0.003 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 3.47 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 3.47 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000007c00d8#11237 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 4.4e-05 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** -2023/08/17-15:18:53.400483 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work -2023/08/17-15:18:53.401309 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/hyperlane_db/LOG.old.1692253295513730 b/rust/hyperlane_db/LOG.old.1692253295513730 deleted file mode 100644 index 2f267fa5c3..0000000000 --- a/rust/hyperlane_db/LOG.old.1692253295513730 +++ /dev/null @@ -1,286 +0,0 @@ -2023/08/17-15:19:54.213450 8651103744 RocksDB version: 8.1.1 -2023/08/17-15:19:54.214265 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/17-15:19:54.214267 8651103744 DB SUMMARY -2023/08/17-15:19:54.214268 8651103744 DB Session ID: CAF4FDHZKXE1R4IZB8ZG -2023/08/17-15:19:54.214377 8651103744 CURRENT file: CURRENT -2023/08/17-15:19:54.214379 8651103744 IDENTITY file: IDENTITY -2023/08/17-15:19:54.214394 8651103744 MANIFEST file: MANIFEST-000177 size: 676 Bytes -2023/08/17-15:19:54.214408 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db dir, Total Num: 3, files: 000163.sst 000166.sst 000175.sst -2023/08/17-15:19:54.214410 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db: 000176.log size: 47978 ; -2023/08/17-15:19:54.214412 8651103744 Options.error_if_exists: 0 -2023/08/17-15:19:54.214413 8651103744 Options.create_if_missing: 1 -2023/08/17-15:19:54.214414 8651103744 Options.paranoid_checks: 1 -2023/08/17-15:19:54.214415 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/17-15:19:54.214416 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/17-15:19:54.214417 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/17-15:19:54.214418 8651103744 Options.env: 0x109d296e0 -2023/08/17-15:19:54.214419 8651103744 Options.fs: PosixFileSystem -2023/08/17-15:19:54.214420 8651103744 Options.info_log: 0x150704098 -2023/08/17-15:19:54.214421 8651103744 Options.max_file_opening_threads: 16 -2023/08/17-15:19:54.214422 8651103744 Options.statistics: 0x0 -2023/08/17-15:19:54.214423 8651103744 Options.use_fsync: 0 -2023/08/17-15:19:54.214424 8651103744 Options.max_log_file_size: 0 -2023/08/17-15:19:54.214425 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/17-15:19:54.214426 8651103744 Options.log_file_time_to_roll: 0 -2023/08/17-15:19:54.214427 8651103744 Options.keep_log_file_num: 1000 -2023/08/17-15:19:54.214428 8651103744 Options.recycle_log_file_num: 0 -2023/08/17-15:19:54.214429 8651103744 Options.allow_fallocate: 1 -2023/08/17-15:19:54.214430 8651103744 Options.allow_mmap_reads: 0 -2023/08/17-15:19:54.214431 8651103744 Options.allow_mmap_writes: 0 -2023/08/17-15:19:54.214432 8651103744 Options.use_direct_reads: 0 -2023/08/17-15:19:54.214433 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/17-15:19:54.214434 8651103744 Options.create_missing_column_families: 0 -2023/08/17-15:19:54.214435 8651103744 Options.db_log_dir: -2023/08/17-15:19:54.214436 8651103744 Options.wal_dir: -2023/08/17-15:19:54.214437 8651103744 Options.table_cache_numshardbits: 6 -2023/08/17-15:19:54.214438 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/17-15:19:54.214439 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/17-15:19:54.214440 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/17-15:19:54.214441 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/17-15:19:54.214442 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/17-15:19:54.214443 8651103744 Options.advise_random_on_open: 1 -2023/08/17-15:19:54.214444 8651103744 Options.db_write_buffer_size: 0 -2023/08/17-15:19:54.214445 8651103744 Options.write_buffer_manager: 0x600001c6c000 -2023/08/17-15:19:54.214446 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/17-15:19:54.214446 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/17-15:19:54.214447 8651103744 Options.use_adaptive_mutex: 0 -2023/08/17-15:19:54.214448 8651103744 Options.rate_limiter: 0x0 -2023/08/17-15:19:54.214450 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/17-15:19:54.214451 8651103744 Options.wal_recovery_mode: 2 -2023/08/17-15:19:54.214452 8651103744 Options.enable_thread_tracking: 0 -2023/08/17-15:19:54.214453 8651103744 Options.enable_pipelined_write: 0 -2023/08/17-15:19:54.214453 8651103744 Options.unordered_write: 0 -2023/08/17-15:19:54.214454 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/17-15:19:54.214455 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/17-15:19:54.214456 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/17-15:19:54.214457 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/17-15:19:54.214458 8651103744 Options.row_cache: None -2023/08/17-15:19:54.214459 8651103744 Options.wal_filter: None -2023/08/17-15:19:54.214460 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/17-15:19:54.214461 8651103744 Options.allow_ingest_behind: 0 -2023/08/17-15:19:54.214462 8651103744 Options.two_write_queues: 0 -2023/08/17-15:19:54.214463 8651103744 Options.manual_wal_flush: 0 -2023/08/17-15:19:54.214464 8651103744 Options.wal_compression: 0 -2023/08/17-15:19:54.214465 8651103744 Options.atomic_flush: 0 -2023/08/17-15:19:54.214466 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/17-15:19:54.214466 8651103744 Options.persist_stats_to_disk: 0 -2023/08/17-15:19:54.214467 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/17-15:19:54.214468 8651103744 Options.log_readahead_size: 0 -2023/08/17-15:19:54.214469 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/17-15:19:54.214481 8651103744 Options.best_efforts_recovery: 0 -2023/08/17-15:19:54.214482 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/17-15:19:54.214483 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/17-15:19:54.214484 8651103744 Options.allow_data_in_errors: 0 -2023/08/17-15:19:54.214485 8651103744 Options.db_host_id: __hostname__ -2023/08/17-15:19:54.214486 8651103744 Options.enforce_single_del_contracts: true -2023/08/17-15:19:54.214487 8651103744 Options.max_background_jobs: 2 -2023/08/17-15:19:54.214488 8651103744 Options.max_background_compactions: -1 -2023/08/17-15:19:54.214489 8651103744 Options.max_subcompactions: 1 -2023/08/17-15:19:54.214490 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/17-15:19:54.214491 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/17-15:19:54.214492 8651103744 Options.delayed_write_rate : 16777216 -2023/08/17-15:19:54.214492 8651103744 Options.max_total_wal_size: 0 -2023/08/17-15:19:54.214493 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/17-15:19:54.214494 8651103744 Options.stats_dump_period_sec: 600 -2023/08/17-15:19:54.214495 8651103744 Options.stats_persist_period_sec: 600 -2023/08/17-15:19:54.214496 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/17-15:19:54.214497 8651103744 Options.max_open_files: -1 -2023/08/17-15:19:54.214498 8651103744 Options.bytes_per_sync: 0 -2023/08/17-15:19:54.214499 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/17-15:19:54.214500 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/17-15:19:54.214501 8651103744 Options.compaction_readahead_size: 0 -2023/08/17-15:19:54.214502 8651103744 Options.max_background_flushes: -1 -2023/08/17-15:19:54.214503 8651103744 Compression algorithms supported: -2023/08/17-15:19:54.214517 8651103744 kZSTD supported: 1 -2023/08/17-15:19:54.214518 8651103744 kZlibCompression supported: 1 -2023/08/17-15:19:54.214519 8651103744 kXpressCompression supported: 0 -2023/08/17-15:19:54.214520 8651103744 kSnappyCompression supported: 1 -2023/08/17-15:19:54.214521 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/17-15:19:54.214522 8651103744 kLZ4HCCompression supported: 1 -2023/08/17-15:19:54.214523 8651103744 kLZ4Compression supported: 1 -2023/08/17-15:19:54.214524 8651103744 kBZip2Compression supported: 1 -2023/08/17-15:19:54.214532 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/17-15:19:54.214533 8651103744 DMutex implementation: pthread_mutex_t -2023/08/17-15:19:54.214832 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000177 -2023/08/17-15:19:54.215086 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/17-15:19:54.215088 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/17-15:19:54.215089 8651103744 Options.merge_operator: None -2023/08/17-15:19:54.215090 8651103744 Options.compaction_filter: None -2023/08/17-15:19:54.215092 8651103744 Options.compaction_filter_factory: None -2023/08/17-15:19:54.215093 8651103744 Options.sst_partitioner_factory: None -2023/08/17-15:19:54.215094 8651103744 Options.memtable_factory: SkipListFactory -2023/08/17-15:19:54.215095 8651103744 Options.table_factory: BlockBasedTable -2023/08/17-15:19:54.215107 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600002764640) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x6000012686d8 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/17-15:19:54.215108 8651103744 Options.write_buffer_size: 67108864 -2023/08/17-15:19:54.215109 8651103744 Options.max_write_buffer_number: 2 -2023/08/17-15:19:54.215110 8651103744 Options.compression: Snappy -2023/08/17-15:19:54.215111 8651103744 Options.bottommost_compression: Disabled -2023/08/17-15:19:54.215113 8651103744 Options.prefix_extractor: nullptr -2023/08/17-15:19:54.215114 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/17-15:19:54.215114 8651103744 Options.num_levels: 7 -2023/08/17-15:19:54.215115 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/17-15:19:54.215116 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/17-15:19:54.215117 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/17-15:19:54.215118 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/17-15:19:54.215119 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/17-15:19:54.215120 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/17-15:19:54.215121 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/17-15:19:54.215122 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/17-15:19:54.215123 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/17-15:19:54.215124 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/17-15:19:54.215125 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/17-15:19:54.215126 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/17-15:19:54.215127 8651103744 Options.compression_opts.window_bits: -14 -2023/08/17-15:19:54.215128 8651103744 Options.compression_opts.level: 32767 -2023/08/17-15:19:54.215129 8651103744 Options.compression_opts.strategy: 0 -2023/08/17-15:19:54.215130 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/17-15:19:54.215131 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/17-15:19:54.215131 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/17-15:19:54.215133 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/17-15:19:54.215133 8651103744 Options.compression_opts.enabled: false -2023/08/17-15:19:54.215134 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/17-15:19:54.215135 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/17-15:19:54.215136 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/17-15:19:54.215137 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/17-15:19:54.215138 8651103744 Options.target_file_size_base: 67108864 -2023/08/17-15:19:54.215139 8651103744 Options.target_file_size_multiplier: 1 -2023/08/17-15:19:54.215140 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/17-15:19:54.215141 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/17-15:19:54.215142 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/17-15:19:54.215143 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/17-15:19:54.215144 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/17-15:19:54.215145 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/17-15:19:54.215146 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/17-15:19:54.215147 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/17-15:19:54.215148 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/17-15:19:54.215149 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/17-15:19:54.215150 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/17-15:19:54.215150 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/17-15:19:54.215151 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/17-15:19:54.215152 8651103744 Options.arena_block_size: 1048576 -2023/08/17-15:19:54.215153 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/17-15:19:54.215154 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/17-15:19:54.215155 8651103744 Options.disable_auto_compactions: 0 -2023/08/17-15:19:54.215157 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/17-15:19:54.215160 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/17-15:19:54.215161 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/17-15:19:54.215162 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/17-15:19:54.215163 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/17-15:19:54.215164 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/17-15:19:54.215164 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/17-15:19:54.215167 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/17-15:19:54.215169 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/17-15:19:54.215169 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/17-15:19:54.215171 8651103744 Options.table_properties_collectors: -2023/08/17-15:19:54.215172 8651103744 Options.inplace_update_support: 0 -2023/08/17-15:19:54.215173 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/17-15:19:54.215174 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/17-15:19:54.215175 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/17-15:19:54.215176 8651103744 Options.memtable_huge_page_size: 0 -2023/08/17-15:19:54.215177 8651103744 Options.bloom_locality: 0 -2023/08/17-15:19:54.215178 8651103744 Options.max_successive_merges: 0 -2023/08/17-15:19:54.215179 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/17-15:19:54.215180 8651103744 Options.paranoid_file_checks: 0 -2023/08/17-15:19:54.215180 8651103744 Options.force_consistency_checks: 1 -2023/08/17-15:19:54.215181 8651103744 Options.report_bg_io_stats: 0 -2023/08/17-15:19:54.215182 8651103744 Options.ttl: 2592000 -2023/08/17-15:19:54.215183 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/17-15:19:54.215184 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/17-15:19:54.215185 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/17-15:19:54.215186 8651103744 Options.enable_blob_files: false -2023/08/17-15:19:54.215187 8651103744 Options.min_blob_size: 0 -2023/08/17-15:19:54.215188 8651103744 Options.blob_file_size: 268435456 -2023/08/17-15:19:54.215189 8651103744 Options.blob_compression_type: NoCompression -2023/08/17-15:19:54.215190 8651103744 Options.enable_blob_garbage_collection: false -2023/08/17-15:19:54.215191 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/17-15:19:54.215192 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/17-15:19:54.215193 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/17-15:19:54.215194 8651103744 Options.blob_file_starting_level: 0 -2023/08/17-15:19:54.215195 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/17-15:19:54.216454 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/MANIFEST-000177 succeeded,manifest_file_number is 177, next_file_number is 179, last_sequence is 41924, log_number is 172,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 172 -2023/08/17-15:19:54.216457 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 172 -2023/08/17-15:19:54.216688 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 7ce9d4c9-23f1-4425-b43c-e64503391a91 -2023/08/17-15:19:54.216885 8651103744 EVENT_LOG_v1 {"time_micros": 1692253194216880, "job": 1, "event": "recovery_started", "wal_files": [176]} -2023/08/17-15:19:54.216888 8651103744 [db/db_impl/db_impl_open.cc:1031] Recovering log #176 mode 2 -2023/08/17-15:19:54.219945 8651103744 EVENT_LOG_v1 {"time_micros": 1692253194219924, "cf_name": "default", "job": 1, "event": "table_file_creation", "file_number": 180, "file_size": 19416, "file_checksum": "", "file_checksum_func_name": "Unknown", "smallest_seqno": 41925, "largest_seqno": 42293, "table_properties": {"data_size": 18274, "index_size": 282, "index_partitions": 0, "top_level_index_size": 0, "index_key_is_user_key": 1, "index_value_is_delta_encoded": 1, "filter_size": 0, "raw_key_size": 16728, "raw_average_key_size": 45, "raw_value_size": 26048, "raw_average_value_size": 70, "num_data_blocks": 9, "num_entries": 369, "num_filter_entries": 0, "num_deletions": 0, "num_merge_operands": 0, "num_range_deletions": 0, "format_version": 0, "fixed_key_len": 0, "filter_policy": "", "column_family_name": "default", "column_family_id": 0, "comparator": "leveldb.BytewiseComparator", "merge_operator": "nullptr", "prefix_extractor_name": "nullptr", "property_collectors": "[]", "compression": "Snappy", "compression_options": "window_bits=-14; level=32767; strategy=0; max_dict_bytes=0; zstd_max_train_bytes=0; enabled=0; max_dict_buffer_bytes=0; use_zstd_dict_trainer=1; ", "creation_time": 1692253194, "oldest_key_time": 0, "file_creation_time": 0, "slow_compression_estimated_data_size": 0, "fast_compression_estimated_data_size": 0, "db_id": "7ce9d4c9-23f1-4425-b43c-e64503391a91", "db_session_id": "CAF4FDHZKXE1R4IZB8ZG", "orig_file_number": 180, "seqno_to_time_mapping": "N/A"}} -2023/08/17-15:19:54.220013 8651103744 EVENT_LOG_v1 {"time_micros": 1692253194220011, "job": 1, "event": "recovery_finished"} -2023/08/17-15:19:54.220254 8651103744 [db/version_set.cc:5180] Creating manifest 182 -2023/08/17-15:19:54.222836 8651103744 [file/delete_scheduler.cc:77] Deleted file /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/hyperlane_db/000176.log immediately, rate_bytes_per_sec 0, total_trash_size 0 max_trash_db_ratio 0.250000 -2023/08/17-15:19:54.222878 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x1507041f0 -2023/08/17-15:19:54.222964 8651103744 DB pointer 0x151008a00 -2023/08/17-15:19:54.223163 6091436032 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/17-15:19:54.223167 6091436032 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - L0 3/0 126.53 KB 0.8 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 14.3 0.00 0.00 1 0.001 0 0 0.0 0.0 - L1 1/0 1.70 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Sum 4/0 1.82 MB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 14.3 0.00 0.00 1 0.001 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 14.3 0.00 0.00 1 0.001 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -User 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 14.3 0.00 0.00 1 0.001 0 0 0.0 0.0 - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 2.29 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 2.29 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x6000012686d8#11332 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 4.1e-05 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** diff --git a/rust/hyperlane_db/MANIFEST-000187 b/rust/hyperlane_db/MANIFEST-000187 deleted file mode 100644 index b0dc33e29162345b9614acadb86d581aa3355be7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1230 zcmb<%{UON8z}Vryw2?9F=Z+sT42+CYIjLo-IVnkcPL(C8<(b8)&iT0oiA9Me`9%e{ z0{kB^F#;8HZDeHGdWtEXVGHAp>5S&-`Kd)Ynen-)#l?x~squ_g*UEp{kZQE{oUZ4N z3mcp?`x#qVR{gqb-RCD{a#_8b@#zu<5J1=W|GSF8`4@LCUbYdRwJ_t*RJn47Z?lgW zu0D0iWY<#nJWa+Lh`yu8nShqFvUdIWwv3I9k%5}s{5*_%=0g0DU!0p?oLO9wT3nKs zS`wd=2x7%&=B1=oq^86pTauKMpPbG3Z6R3SmfcK8jsyL1@H@;O%t-#=5qK{9&RNuY zM#?<%pMRGtEdK&@{W8X`BTVSw##Hr1*=(lrCjJY?)9>^B$$Nf(@;1-HLah%6lWtt! z^RJO{!8C|F(cId1fa0`P8ODdx!TS2v zGELb6bmyX{pP}K+gyPPn)88)Jzt(8h6UNiLx?%hgjOmPv88;uwAug1`RzQg}#Z^=O zoq8h{wdbSmTh8c>_RM9ij8HjqQbQSTFe~e|N$-FzXWj7_=mB0vMikdCY>wf6)78hm zOhM*4LzeSK#@@qP@|+BeoD9sn!Kpm+dFQ`142(?Mph7pU0u%mD##t9x^q~PtFv91r z0y~CeFML=D*0=2x6VOst*7xuP&x+!O)2G&@T@C8nXa8{WyotGQ|1tIoCZ6U2dtnbF z*EU8Lpl*YYtG3?;3+)H<*??(@4VW9)fO(h==p8m-oTW4FW1PIHYS6_S*x%^!2J^H9 G%+mnRE5`u< diff --git a/rust/hyperlane_db/OPTIONS-000184 b/rust/hyperlane_db/OPTIONS-000184 deleted file mode 100644 index ec56ef4f4d..0000000000 --- a/rust/hyperlane_db/OPTIONS-000184 +++ /dev/null @@ -1,198 +0,0 @@ -# This is a RocksDB option file. -# -# For detailed file format spec, please refer to the example file -# in examples/rocksdb_option_file_example.ini -# - -[Version] - rocksdb_version=8.1.1 - options_file_version=1.1 - -[DBOptions] - max_background_flushes=-1 - compaction_readahead_size=0 - strict_bytes_per_sync=false - wal_bytes_per_sync=0 - max_open_files=-1 - stats_history_buffer_size=1048576 - max_total_wal_size=0 - stats_persist_period_sec=600 - stats_dump_period_sec=600 - avoid_flush_during_shutdown=false - max_subcompactions=1 - bytes_per_sync=0 - delayed_write_rate=16777216 - max_background_compactions=-1 - max_background_jobs=2 - delete_obsolete_files_period_micros=21600000000 - writable_file_max_buffer_size=1048576 - file_checksum_gen_factory=nullptr - allow_data_in_errors=false - max_bgerror_resume_count=2147483647 - best_efforts_recovery=false - write_dbid_to_manifest=false - atomic_flush=false - wal_compression=kNoCompression - manual_wal_flush=false - two_write_queues=false - avoid_flush_during_recovery=false - dump_malloc_stats=false - info_log_level=INFO_LEVEL - write_thread_slow_yield_usec=3 - allow_ingest_behind=false - fail_if_options_file_error=false - persist_stats_to_disk=false - WAL_ttl_seconds=0 - bgerror_resume_retry_interval=1000000 - allow_concurrent_memtable_write=true - paranoid_checks=true - WAL_size_limit_MB=0 - lowest_used_cache_tier=kNonVolatileBlockTier - keep_log_file_num=1000 - table_cache_numshardbits=6 - max_file_opening_threads=16 - use_fsync=false - unordered_write=false - random_access_max_buffer_size=1048576 - log_readahead_size=0 - enable_pipelined_write=false - wal_recovery_mode=kPointInTimeRecovery - db_write_buffer_size=0 - allow_2pc=false - skip_checking_sst_file_sizes_on_db_open=false - skip_stats_update_on_db_open=false - recycle_log_file_num=0 - db_host_id=__hostname__ - access_hint_on_compaction_start=NORMAL - verify_sst_unique_id_in_manifest=true - track_and_verify_wals_in_manifest=false - error_if_exists=false - manifest_preallocation_size=4194304 - is_fd_close_on_exec=true - enable_write_thread_adaptive_yield=true - enable_thread_tracking=false - avoid_unnecessary_blocking_io=false - allow_fallocate=true - max_log_file_size=0 - advise_random_on_open=true - create_missing_column_families=false - max_write_batch_group_size_bytes=1048576 - use_adaptive_mutex=false - wal_filter=nullptr - create_if_missing=true - enforce_single_del_contracts=true - allow_mmap_writes=false - log_file_time_to_roll=0 - use_direct_io_for_flush_and_compaction=false - flush_verify_memtable_count=true - max_manifest_file_size=1073741824 - write_thread_max_yield_usec=100 - use_direct_reads=false - allow_mmap_reads=false - - -[CFOptions "default"] - memtable_protection_bytes_per_key=0 - bottommost_compression=kDisableCompressionOption - sample_for_compression=0 - blob_garbage_collection_age_cutoff=0.250000 - blob_compression_type=kNoCompression - prepopulate_blob_cache=kDisable - blob_compaction_readahead_size=0 - level0_stop_writes_trigger=36 - min_blob_size=0 - last_level_temperature=kUnknown - compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;} - target_file_size_base=67108864 - ignore_max_compaction_bytes_for_input=true - memtable_whole_key_filtering=false - blob_file_starting_level=0 - soft_pending_compaction_bytes_limit=68719476736 - max_write_buffer_number=2 - ttl=2592000 - compaction_options_fifo={allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;} - check_flush_compaction_key_order=true - memtable_huge_page_size=0 - max_successive_merges=0 - inplace_update_num_locks=10000 - enable_blob_garbage_collection=false - arena_block_size=1048576 - bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;parallel_threads=1;zstd_max_train_bytes=0;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;} - target_file_size_multiplier=1 - max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1 - blob_garbage_collection_force_threshold=1.000000 - enable_blob_files=false - level0_slowdown_writes_trigger=20 - compression=kSnappyCompression - level0_file_num_compaction_trigger=4 - prefix_extractor=nullptr - max_bytes_for_level_multiplier=10.000000 - write_buffer_size=67108864 - disable_auto_compactions=false - max_compaction_bytes=1677721600 - compression_opts={use_zstd_dict_trainer=true;enabled=false;parallel_threads=1;zstd_max_train_bytes=0;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;} - hard_pending_compaction_bytes_limit=274877906944 - blob_file_size=268435456 - periodic_compaction_seconds=0 - paranoid_file_checks=false - experimental_mempurge_threshold=0.000000 - memtable_prefix_bloom_size_ratio=0.000000 - max_bytes_for_level_base=268435456 - max_sequential_skip_in_iterations=8 - report_bg_io_stats=false - sst_partitioner_factory=nullptr - compaction_pri=kMinOverlappingRatio - compaction_style=kCompactionStyleLevel - compaction_filter_factory=nullptr - compaction_filter=nullptr - memtable_factory=SkipListFactory - comparator=leveldb.BytewiseComparator - bloom_locality=0 - min_write_buffer_number_to_merge=1 - table_factory=BlockBasedTable - max_write_buffer_size_to_maintain=0 - max_write_buffer_number_to_maintain=0 - preserve_internal_time_seconds=0 - force_consistency_checks=true - optimize_filters_for_hits=false - merge_operator=nullptr - num_levels=7 - level_compaction_dynamic_file_size=true - memtable_insert_with_hint_prefix_extractor=nullptr - level_compaction_dynamic_level_bytes=false - preclude_last_level_data_seconds=0 - inplace_update_support=false - -[TableOptions/BlockBasedTable "default"] - num_file_reads_for_auto_readahead=2 - metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;} - read_amp_bytes_per_bit=0 - verify_compression=false - format_version=5 - optimize_filters_for_memory=false - partition_filters=false - detect_filter_construct_corruption=false - initial_auto_readahead_size=8192 - max_auto_readahead_size=262144 - enable_index_compression=true - checksum=kXXH3 - index_block_restart_interval=1 - pin_top_level_index_and_filter=true - block_align=false - block_size=4096 - index_type=kBinarySearch - filter_policy=nullptr - metadata_block_size=4096 - no_block_cache=false - index_shortening=kShortenSeparators - whole_key_filtering=true - block_size_deviation=10 - data_block_index_type=kDataBlockBinarySearch - data_block_hash_table_util_ratio=0.750000 - cache_index_and_filter_blocks=false - prepopulate_block_cache=kDisable - block_restart_interval=16 - pin_l0_filter_and_index_blocks_in_cache=false - cache_index_and_filter_blocks_with_high_priority=true - flush_block_policy_factory=FlushBlockBySizePolicyFactory - diff --git a/rust/hyperlane_db/OPTIONS-000189 b/rust/hyperlane_db/OPTIONS-000189 deleted file mode 100644 index ec56ef4f4d..0000000000 --- a/rust/hyperlane_db/OPTIONS-000189 +++ /dev/null @@ -1,198 +0,0 @@ -# This is a RocksDB option file. -# -# For detailed file format spec, please refer to the example file -# in examples/rocksdb_option_file_example.ini -# - -[Version] - rocksdb_version=8.1.1 - options_file_version=1.1 - -[DBOptions] - max_background_flushes=-1 - compaction_readahead_size=0 - strict_bytes_per_sync=false - wal_bytes_per_sync=0 - max_open_files=-1 - stats_history_buffer_size=1048576 - max_total_wal_size=0 - stats_persist_period_sec=600 - stats_dump_period_sec=600 - avoid_flush_during_shutdown=false - max_subcompactions=1 - bytes_per_sync=0 - delayed_write_rate=16777216 - max_background_compactions=-1 - max_background_jobs=2 - delete_obsolete_files_period_micros=21600000000 - writable_file_max_buffer_size=1048576 - file_checksum_gen_factory=nullptr - allow_data_in_errors=false - max_bgerror_resume_count=2147483647 - best_efforts_recovery=false - write_dbid_to_manifest=false - atomic_flush=false - wal_compression=kNoCompression - manual_wal_flush=false - two_write_queues=false - avoid_flush_during_recovery=false - dump_malloc_stats=false - info_log_level=INFO_LEVEL - write_thread_slow_yield_usec=3 - allow_ingest_behind=false - fail_if_options_file_error=false - persist_stats_to_disk=false - WAL_ttl_seconds=0 - bgerror_resume_retry_interval=1000000 - allow_concurrent_memtable_write=true - paranoid_checks=true - WAL_size_limit_MB=0 - lowest_used_cache_tier=kNonVolatileBlockTier - keep_log_file_num=1000 - table_cache_numshardbits=6 - max_file_opening_threads=16 - use_fsync=false - unordered_write=false - random_access_max_buffer_size=1048576 - log_readahead_size=0 - enable_pipelined_write=false - wal_recovery_mode=kPointInTimeRecovery - db_write_buffer_size=0 - allow_2pc=false - skip_checking_sst_file_sizes_on_db_open=false - skip_stats_update_on_db_open=false - recycle_log_file_num=0 - db_host_id=__hostname__ - access_hint_on_compaction_start=NORMAL - verify_sst_unique_id_in_manifest=true - track_and_verify_wals_in_manifest=false - error_if_exists=false - manifest_preallocation_size=4194304 - is_fd_close_on_exec=true - enable_write_thread_adaptive_yield=true - enable_thread_tracking=false - avoid_unnecessary_blocking_io=false - allow_fallocate=true - max_log_file_size=0 - advise_random_on_open=true - create_missing_column_families=false - max_write_batch_group_size_bytes=1048576 - use_adaptive_mutex=false - wal_filter=nullptr - create_if_missing=true - enforce_single_del_contracts=true - allow_mmap_writes=false - log_file_time_to_roll=0 - use_direct_io_for_flush_and_compaction=false - flush_verify_memtable_count=true - max_manifest_file_size=1073741824 - write_thread_max_yield_usec=100 - use_direct_reads=false - allow_mmap_reads=false - - -[CFOptions "default"] - memtable_protection_bytes_per_key=0 - bottommost_compression=kDisableCompressionOption - sample_for_compression=0 - blob_garbage_collection_age_cutoff=0.250000 - blob_compression_type=kNoCompression - prepopulate_blob_cache=kDisable - blob_compaction_readahead_size=0 - level0_stop_writes_trigger=36 - min_blob_size=0 - last_level_temperature=kUnknown - compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;} - target_file_size_base=67108864 - ignore_max_compaction_bytes_for_input=true - memtable_whole_key_filtering=false - blob_file_starting_level=0 - soft_pending_compaction_bytes_limit=68719476736 - max_write_buffer_number=2 - ttl=2592000 - compaction_options_fifo={allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;} - check_flush_compaction_key_order=true - memtable_huge_page_size=0 - max_successive_merges=0 - inplace_update_num_locks=10000 - enable_blob_garbage_collection=false - arena_block_size=1048576 - bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;parallel_threads=1;zstd_max_train_bytes=0;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;} - target_file_size_multiplier=1 - max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1 - blob_garbage_collection_force_threshold=1.000000 - enable_blob_files=false - level0_slowdown_writes_trigger=20 - compression=kSnappyCompression - level0_file_num_compaction_trigger=4 - prefix_extractor=nullptr - max_bytes_for_level_multiplier=10.000000 - write_buffer_size=67108864 - disable_auto_compactions=false - max_compaction_bytes=1677721600 - compression_opts={use_zstd_dict_trainer=true;enabled=false;parallel_threads=1;zstd_max_train_bytes=0;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;} - hard_pending_compaction_bytes_limit=274877906944 - blob_file_size=268435456 - periodic_compaction_seconds=0 - paranoid_file_checks=false - experimental_mempurge_threshold=0.000000 - memtable_prefix_bloom_size_ratio=0.000000 - max_bytes_for_level_base=268435456 - max_sequential_skip_in_iterations=8 - report_bg_io_stats=false - sst_partitioner_factory=nullptr - compaction_pri=kMinOverlappingRatio - compaction_style=kCompactionStyleLevel - compaction_filter_factory=nullptr - compaction_filter=nullptr - memtable_factory=SkipListFactory - comparator=leveldb.BytewiseComparator - bloom_locality=0 - min_write_buffer_number_to_merge=1 - table_factory=BlockBasedTable - max_write_buffer_size_to_maintain=0 - max_write_buffer_number_to_maintain=0 - preserve_internal_time_seconds=0 - force_consistency_checks=true - optimize_filters_for_hits=false - merge_operator=nullptr - num_levels=7 - level_compaction_dynamic_file_size=true - memtable_insert_with_hint_prefix_extractor=nullptr - level_compaction_dynamic_level_bytes=false - preclude_last_level_data_seconds=0 - inplace_update_support=false - -[TableOptions/BlockBasedTable "default"] - num_file_reads_for_auto_readahead=2 - metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;} - read_amp_bytes_per_bit=0 - verify_compression=false - format_version=5 - optimize_filters_for_memory=false - partition_filters=false - detect_filter_construct_corruption=false - initial_auto_readahead_size=8192 - max_auto_readahead_size=262144 - enable_index_compression=true - checksum=kXXH3 - index_block_restart_interval=1 - pin_top_level_index_and_filter=true - block_align=false - block_size=4096 - index_type=kBinarySearch - filter_policy=nullptr - metadata_block_size=4096 - no_block_cache=false - index_shortening=kShortenSeparators - whole_key_filtering=true - block_size_deviation=10 - data_block_index_type=kDataBlockBinarySearch - data_block_hash_table_util_ratio=0.750000 - cache_index_and_filter_blocks=false - prepopulate_block_cache=kDisable - block_restart_interval=16 - pin_l0_filter_and_index_blocks_in_cache=false - cache_index_and_filter_blocks_with_high_priority=true - flush_block_policy_factory=FlushBlockBySizePolicyFactory - diff --git a/rust/validator_db_osmosistestnet/000004.log b/rust/validator_db_osmosistestnet/000004.log deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/rust/validator_db_osmosistestnet/CURRENT b/rust/validator_db_osmosistestnet/CURRENT deleted file mode 100644 index aa5bb8ea50..0000000000 --- a/rust/validator_db_osmosistestnet/CURRENT +++ /dev/null @@ -1 +0,0 @@ -MANIFEST-000005 diff --git a/rust/validator_db_osmosistestnet/IDENTITY b/rust/validator_db_osmosistestnet/IDENTITY deleted file mode 100644 index 0936aa25a9..0000000000 --- a/rust/validator_db_osmosistestnet/IDENTITY +++ /dev/null @@ -1 +0,0 @@ -6196d70c-89e1-4c77-be52-0ab2bfd49109 \ No newline at end of file diff --git a/rust/validator_db_osmosistestnet/LOCK b/rust/validator_db_osmosistestnet/LOCK deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/rust/validator_db_osmosistestnet/LOG b/rust/validator_db_osmosistestnet/LOG deleted file mode 100644 index 7c4c2a8ae7..0000000000 --- a/rust/validator_db_osmosistestnet/LOG +++ /dev/null @@ -1,278 +0,0 @@ -2023/08/17-19:33:39.653897 8651103744 RocksDB version: 8.1.1 -2023/08/17-19:33:39.654443 8651103744 Compile date 2023-04-06 16:38:52 -2023/08/17-19:33:39.654445 8651103744 DB SUMMARY -2023/08/17-19:33:39.654447 8651103744 DB Session ID: HLDQR9P5Y3DV67CR9Z2I -2023/08/17-19:33:39.654511 8651103744 SST files in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/validator_db_osmosistestnet dir, Total Num: 0, files: -2023/08/17-19:33:39.654513 8651103744 Write Ahead Log file in /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/validator_db_osmosistestnet: -2023/08/17-19:33:39.654515 8651103744 Options.error_if_exists: 0 -2023/08/17-19:33:39.654516 8651103744 Options.create_if_missing: 1 -2023/08/17-19:33:39.654517 8651103744 Options.paranoid_checks: 1 -2023/08/17-19:33:39.654518 8651103744 Options.flush_verify_memtable_count: 1 -2023/08/17-19:33:39.654519 8651103744 Options.track_and_verify_wals_in_manifest: 0 -2023/08/17-19:33:39.654520 8651103744 Options.verify_sst_unique_id_in_manifest: 1 -2023/08/17-19:33:39.654521 8651103744 Options.env: 0x106e2c848 -2023/08/17-19:33:39.654522 8651103744 Options.fs: PosixFileSystem -2023/08/17-19:33:39.654523 8651103744 Options.info_log: 0x129705f78 -2023/08/17-19:33:39.654524 8651103744 Options.max_file_opening_threads: 16 -2023/08/17-19:33:39.654525 8651103744 Options.statistics: 0x0 -2023/08/17-19:33:39.654526 8651103744 Options.use_fsync: 0 -2023/08/17-19:33:39.654527 8651103744 Options.max_log_file_size: 0 -2023/08/17-19:33:39.654528 8651103744 Options.max_manifest_file_size: 1073741824 -2023/08/17-19:33:39.654529 8651103744 Options.log_file_time_to_roll: 0 -2023/08/17-19:33:39.654530 8651103744 Options.keep_log_file_num: 1000 -2023/08/17-19:33:39.654531 8651103744 Options.recycle_log_file_num: 0 -2023/08/17-19:33:39.654532 8651103744 Options.allow_fallocate: 1 -2023/08/17-19:33:39.654533 8651103744 Options.allow_mmap_reads: 0 -2023/08/17-19:33:39.654534 8651103744 Options.allow_mmap_writes: 0 -2023/08/17-19:33:39.654535 8651103744 Options.use_direct_reads: 0 -2023/08/17-19:33:39.654536 8651103744 Options.use_direct_io_for_flush_and_compaction: 0 -2023/08/17-19:33:39.654537 8651103744 Options.create_missing_column_families: 0 -2023/08/17-19:33:39.654538 8651103744 Options.db_log_dir: -2023/08/17-19:33:39.654539 8651103744 Options.wal_dir: -2023/08/17-19:33:39.654540 8651103744 Options.table_cache_numshardbits: 6 -2023/08/17-19:33:39.654540 8651103744 Options.WAL_ttl_seconds: 0 -2023/08/17-19:33:39.654541 8651103744 Options.WAL_size_limit_MB: 0 -2023/08/17-19:33:39.654542 8651103744 Options.max_write_batch_group_size_bytes: 1048576 -2023/08/17-19:33:39.654543 8651103744 Options.manifest_preallocation_size: 4194304 -2023/08/17-19:33:39.654544 8651103744 Options.is_fd_close_on_exec: 1 -2023/08/17-19:33:39.654545 8651103744 Options.advise_random_on_open: 1 -2023/08/17-19:33:39.654546 8651103744 Options.db_write_buffer_size: 0 -2023/08/17-19:33:39.654547 8651103744 Options.write_buffer_manager: 0x60000003c8f0 -2023/08/17-19:33:39.654548 8651103744 Options.access_hint_on_compaction_start: 1 -2023/08/17-19:33:39.654549 8651103744 Options.random_access_max_buffer_size: 1048576 -2023/08/17-19:33:39.654550 8651103744 Options.use_adaptive_mutex: 0 -2023/08/17-19:33:39.654551 8651103744 Options.rate_limiter: 0x0 -2023/08/17-19:33:39.654553 8651103744 Options.sst_file_manager.rate_bytes_per_sec: 0 -2023/08/17-19:33:39.654554 8651103744 Options.wal_recovery_mode: 2 -2023/08/17-19:33:39.654555 8651103744 Options.enable_thread_tracking: 0 -2023/08/17-19:33:39.654556 8651103744 Options.enable_pipelined_write: 0 -2023/08/17-19:33:39.654556 8651103744 Options.unordered_write: 0 -2023/08/17-19:33:39.654557 8651103744 Options.allow_concurrent_memtable_write: 1 -2023/08/17-19:33:39.654558 8651103744 Options.enable_write_thread_adaptive_yield: 1 -2023/08/17-19:33:39.654559 8651103744 Options.write_thread_max_yield_usec: 100 -2023/08/17-19:33:39.654560 8651103744 Options.write_thread_slow_yield_usec: 3 -2023/08/17-19:33:39.654561 8651103744 Options.row_cache: None -2023/08/17-19:33:39.654562 8651103744 Options.wal_filter: None -2023/08/17-19:33:39.654563 8651103744 Options.avoid_flush_during_recovery: 0 -2023/08/17-19:33:39.654564 8651103744 Options.allow_ingest_behind: 0 -2023/08/17-19:33:39.654565 8651103744 Options.two_write_queues: 0 -2023/08/17-19:33:39.654566 8651103744 Options.manual_wal_flush: 0 -2023/08/17-19:33:39.654567 8651103744 Options.wal_compression: 0 -2023/08/17-19:33:39.654568 8651103744 Options.atomic_flush: 0 -2023/08/17-19:33:39.654569 8651103744 Options.avoid_unnecessary_blocking_io: 0 -2023/08/17-19:33:39.654570 8651103744 Options.persist_stats_to_disk: 0 -2023/08/17-19:33:39.654571 8651103744 Options.write_dbid_to_manifest: 0 -2023/08/17-19:33:39.654572 8651103744 Options.log_readahead_size: 0 -2023/08/17-19:33:39.654573 8651103744 Options.file_checksum_gen_factory: Unknown -2023/08/17-19:33:39.654589 8651103744 Options.best_efforts_recovery: 0 -2023/08/17-19:33:39.654590 8651103744 Options.max_bgerror_resume_count: 2147483647 -2023/08/17-19:33:39.654591 8651103744 Options.bgerror_resume_retry_interval: 1000000 -2023/08/17-19:33:39.654592 8651103744 Options.allow_data_in_errors: 0 -2023/08/17-19:33:39.654592 8651103744 Options.db_host_id: __hostname__ -2023/08/17-19:33:39.654593 8651103744 Options.enforce_single_del_contracts: true -2023/08/17-19:33:39.654594 8651103744 Options.max_background_jobs: 2 -2023/08/17-19:33:39.654595 8651103744 Options.max_background_compactions: -1 -2023/08/17-19:33:39.654596 8651103744 Options.max_subcompactions: 1 -2023/08/17-19:33:39.654597 8651103744 Options.avoid_flush_during_shutdown: 0 -2023/08/17-19:33:39.654598 8651103744 Options.writable_file_max_buffer_size: 1048576 -2023/08/17-19:33:39.654599 8651103744 Options.delayed_write_rate : 16777216 -2023/08/17-19:33:39.654600 8651103744 Options.max_total_wal_size: 0 -2023/08/17-19:33:39.654601 8651103744 Options.delete_obsolete_files_period_micros: 21600000000 -2023/08/17-19:33:39.654602 8651103744 Options.stats_dump_period_sec: 600 -2023/08/17-19:33:39.654603 8651103744 Options.stats_persist_period_sec: 600 -2023/08/17-19:33:39.654604 8651103744 Options.stats_history_buffer_size: 1048576 -2023/08/17-19:33:39.654605 8651103744 Options.max_open_files: -1 -2023/08/17-19:33:39.654606 8651103744 Options.bytes_per_sync: 0 -2023/08/17-19:33:39.654607 8651103744 Options.wal_bytes_per_sync: 0 -2023/08/17-19:33:39.654608 8651103744 Options.strict_bytes_per_sync: 0 -2023/08/17-19:33:39.654609 8651103744 Options.compaction_readahead_size: 0 -2023/08/17-19:33:39.654610 8651103744 Options.max_background_flushes: -1 -2023/08/17-19:33:39.654611 8651103744 Compression algorithms supported: -2023/08/17-19:33:39.654625 8651103744 kZSTD supported: 1 -2023/08/17-19:33:39.654626 8651103744 kZlibCompression supported: 1 -2023/08/17-19:33:39.654627 8651103744 kXpressCompression supported: 0 -2023/08/17-19:33:39.654628 8651103744 kSnappyCompression supported: 1 -2023/08/17-19:33:39.654629 8651103744 kZSTDNotFinalCompression supported: 1 -2023/08/17-19:33:39.654631 8651103744 kLZ4HCCompression supported: 1 -2023/08/17-19:33:39.654632 8651103744 kLZ4Compression supported: 1 -2023/08/17-19:33:39.654633 8651103744 kBZip2Compression supported: 1 -2023/08/17-19:33:39.654639 8651103744 Fast CRC32 supported: Supported on Arm64 -2023/08/17-19:33:39.654640 8651103744 DMutex implementation: pthread_mutex_t -2023/08/17-19:33:39.654976 8651103744 [db/db_impl/db_impl_open.cc:315] Creating manifest 1 -2023/08/17-19:33:39.655454 8651103744 [db/version_set.cc:5662] Recovering from manifest file: /Users/eric/many-things/mitosis/hyperlane-monorepo/rust/validator_db_osmosistestnet/MANIFEST-000001 -2023/08/17-19:33:39.655689 8651103744 [db/column_family.cc:621] --------------- Options for column family [default]: -2023/08/17-19:33:39.655691 8651103744 Options.comparator: leveldb.BytewiseComparator -2023/08/17-19:33:39.655693 8651103744 Options.merge_operator: None -2023/08/17-19:33:39.655694 8651103744 Options.compaction_filter: None -2023/08/17-19:33:39.655695 8651103744 Options.compaction_filter_factory: None -2023/08/17-19:33:39.655696 8651103744 Options.sst_partitioner_factory: None -2023/08/17-19:33:39.655697 8651103744 Options.memtable_factory: SkipListFactory -2023/08/17-19:33:39.655698 8651103744 Options.table_factory: BlockBasedTable -2023/08/17-19:33:39.655722 8651103744 table_factory options: flush_block_policy_factory: FlushBlockBySizePolicyFactory (0x600003b28640) - cache_index_and_filter_blocks: 0 - cache_index_and_filter_blocks_with_high_priority: 1 - pin_l0_filter_and_index_blocks_in_cache: 0 - pin_top_level_index_and_filter: 1 - index_type: 0 - data_block_index_type: 0 - index_shortening: 1 - data_block_hash_table_util_ratio: 0.750000 - checksum: 4 - no_block_cache: 0 - block_cache: 0x600000e3c198 - block_cache_name: LRUCache - block_cache_options: - capacity : 8388608 - num_shard_bits : 4 - strict_capacity_limit : 0 - memory_allocator : None - high_pri_pool_ratio: 0.000 - low_pri_pool_ratio: 0.000 - persistent_cache: 0x0 - block_size: 4096 - block_size_deviation: 10 - block_restart_interval: 16 - index_block_restart_interval: 1 - metadata_block_size: 4096 - partition_filters: 0 - use_delta_encoding: 1 - filter_policy: nullptr - whole_key_filtering: 1 - verify_compression: 0 - read_amp_bytes_per_bit: 0 - format_version: 5 - enable_index_compression: 1 - block_align: 0 - max_auto_readahead_size: 262144 - prepopulate_block_cache: 0 - initial_auto_readahead_size: 8192 - num_file_reads_for_auto_readahead: 2 -2023/08/17-19:33:39.655725 8651103744 Options.write_buffer_size: 67108864 -2023/08/17-19:33:39.655726 8651103744 Options.max_write_buffer_number: 2 -2023/08/17-19:33:39.655727 8651103744 Options.compression: Snappy -2023/08/17-19:33:39.655729 8651103744 Options.bottommost_compression: Disabled -2023/08/17-19:33:39.655730 8651103744 Options.prefix_extractor: nullptr -2023/08/17-19:33:39.655731 8651103744 Options.memtable_insert_with_hint_prefix_extractor: nullptr -2023/08/17-19:33:39.655732 8651103744 Options.num_levels: 7 -2023/08/17-19:33:39.655733 8651103744 Options.min_write_buffer_number_to_merge: 1 -2023/08/17-19:33:39.655734 8651103744 Options.max_write_buffer_number_to_maintain: 0 -2023/08/17-19:33:39.655735 8651103744 Options.max_write_buffer_size_to_maintain: 0 -2023/08/17-19:33:39.655736 8651103744 Options.bottommost_compression_opts.window_bits: -14 -2023/08/17-19:33:39.655737 8651103744 Options.bottommost_compression_opts.level: 32767 -2023/08/17-19:33:39.655738 8651103744 Options.bottommost_compression_opts.strategy: 0 -2023/08/17-19:33:39.655739 8651103744 Options.bottommost_compression_opts.max_dict_bytes: 0 -2023/08/17-19:33:39.655740 8651103744 Options.bottommost_compression_opts.zstd_max_train_bytes: 0 -2023/08/17-19:33:39.655741 8651103744 Options.bottommost_compression_opts.parallel_threads: 1 -2023/08/17-19:33:39.655742 8651103744 Options.bottommost_compression_opts.enabled: false -2023/08/17-19:33:39.655743 8651103744 Options.bottommost_compression_opts.max_dict_buffer_bytes: 0 -2023/08/17-19:33:39.655744 8651103744 Options.bottommost_compression_opts.use_zstd_dict_trainer: true -2023/08/17-19:33:39.655745 8651103744 Options.compression_opts.window_bits: -14 -2023/08/17-19:33:39.655746 8651103744 Options.compression_opts.level: 32767 -2023/08/17-19:33:39.655747 8651103744 Options.compression_opts.strategy: 0 -2023/08/17-19:33:39.655748 8651103744 Options.compression_opts.max_dict_bytes: 0 -2023/08/17-19:33:39.655749 8651103744 Options.compression_opts.zstd_max_train_bytes: 0 -2023/08/17-19:33:39.655750 8651103744 Options.compression_opts.use_zstd_dict_trainer: true -2023/08/17-19:33:39.655751 8651103744 Options.compression_opts.parallel_threads: 1 -2023/08/17-19:33:39.655752 8651103744 Options.compression_opts.enabled: false -2023/08/17-19:33:39.655753 8651103744 Options.compression_opts.max_dict_buffer_bytes: 0 -2023/08/17-19:33:39.655754 8651103744 Options.level0_file_num_compaction_trigger: 4 -2023/08/17-19:33:39.655755 8651103744 Options.level0_slowdown_writes_trigger: 20 -2023/08/17-19:33:39.655756 8651103744 Options.level0_stop_writes_trigger: 36 -2023/08/17-19:33:39.655757 8651103744 Options.target_file_size_base: 67108864 -2023/08/17-19:33:39.655758 8651103744 Options.target_file_size_multiplier: 1 -2023/08/17-19:33:39.655759 8651103744 Options.max_bytes_for_level_base: 268435456 -2023/08/17-19:33:39.655760 8651103744 Options.level_compaction_dynamic_level_bytes: 0 -2023/08/17-19:33:39.655761 8651103744 Options.max_bytes_for_level_multiplier: 10.000000 -2023/08/17-19:33:39.655762 8651103744 Options.max_bytes_for_level_multiplier_addtl[0]: 1 -2023/08/17-19:33:39.655763 8651103744 Options.max_bytes_for_level_multiplier_addtl[1]: 1 -2023/08/17-19:33:39.655764 8651103744 Options.max_bytes_for_level_multiplier_addtl[2]: 1 -2023/08/17-19:33:39.655765 8651103744 Options.max_bytes_for_level_multiplier_addtl[3]: 1 -2023/08/17-19:33:39.655766 8651103744 Options.max_bytes_for_level_multiplier_addtl[4]: 1 -2023/08/17-19:33:39.655767 8651103744 Options.max_bytes_for_level_multiplier_addtl[5]: 1 -2023/08/17-19:33:39.655768 8651103744 Options.max_bytes_for_level_multiplier_addtl[6]: 1 -2023/08/17-19:33:39.655769 8651103744 Options.max_sequential_skip_in_iterations: 8 -2023/08/17-19:33:39.655770 8651103744 Options.max_compaction_bytes: 1677721600 -2023/08/17-19:33:39.655771 8651103744 Options.ignore_max_compaction_bytes_for_input: true -2023/08/17-19:33:39.655772 8651103744 Options.arena_block_size: 1048576 -2023/08/17-19:33:39.655773 8651103744 Options.soft_pending_compaction_bytes_limit: 68719476736 -2023/08/17-19:33:39.655774 8651103744 Options.hard_pending_compaction_bytes_limit: 274877906944 -2023/08/17-19:33:39.655775 8651103744 Options.disable_auto_compactions: 0 -2023/08/17-19:33:39.655777 8651103744 Options.compaction_style: kCompactionStyleLevel -2023/08/17-19:33:39.655779 8651103744 Options.compaction_pri: kMinOverlappingRatio -2023/08/17-19:33:39.655780 8651103744 Options.compaction_options_universal.size_ratio: 1 -2023/08/17-19:33:39.655781 8651103744 Options.compaction_options_universal.min_merge_width: 2 -2023/08/17-19:33:39.655782 8651103744 Options.compaction_options_universal.max_merge_width: 4294967295 -2023/08/17-19:33:39.655783 8651103744 Options.compaction_options_universal.max_size_amplification_percent: 200 -2023/08/17-19:33:39.655784 8651103744 Options.compaction_options_universal.compression_size_percent: -1 -2023/08/17-19:33:39.655785 8651103744 Options.compaction_options_universal.stop_style: kCompactionStopStyleTotalSize -2023/08/17-19:33:39.655788 8651103744 Options.compaction_options_fifo.max_table_files_size: 1073741824 -2023/08/17-19:33:39.655789 8651103744 Options.compaction_options_fifo.allow_compaction: 0 -2023/08/17-19:33:39.655791 8651103744 Options.table_properties_collectors: -2023/08/17-19:33:39.655792 8651103744 Options.inplace_update_support: 0 -2023/08/17-19:33:39.655793 8651103744 Options.inplace_update_num_locks: 10000 -2023/08/17-19:33:39.655794 8651103744 Options.memtable_prefix_bloom_size_ratio: 0.000000 -2023/08/17-19:33:39.655795 8651103744 Options.memtable_whole_key_filtering: 0 -2023/08/17-19:33:39.655796 8651103744 Options.memtable_huge_page_size: 0 -2023/08/17-19:33:39.655797 8651103744 Options.bloom_locality: 0 -2023/08/17-19:33:39.655798 8651103744 Options.max_successive_merges: 0 -2023/08/17-19:33:39.655799 8651103744 Options.optimize_filters_for_hits: 0 -2023/08/17-19:33:39.655800 8651103744 Options.paranoid_file_checks: 0 -2023/08/17-19:33:39.655801 8651103744 Options.force_consistency_checks: 1 -2023/08/17-19:33:39.655802 8651103744 Options.report_bg_io_stats: 0 -2023/08/17-19:33:39.655803 8651103744 Options.ttl: 2592000 -2023/08/17-19:33:39.655804 8651103744 Options.periodic_compaction_seconds: 0 -2023/08/17-19:33:39.655805 8651103744 Options.preclude_last_level_data_seconds: 0 -2023/08/17-19:33:39.655806 8651103744 Options.preserve_internal_time_seconds: 0 -2023/08/17-19:33:39.655807 8651103744 Options.enable_blob_files: false -2023/08/17-19:33:39.655808 8651103744 Options.min_blob_size: 0 -2023/08/17-19:33:39.655809 8651103744 Options.blob_file_size: 268435456 -2023/08/17-19:33:39.655810 8651103744 Options.blob_compression_type: NoCompression -2023/08/17-19:33:39.655811 8651103744 Options.enable_blob_garbage_collection: false -2023/08/17-19:33:39.655812 8651103744 Options.blob_garbage_collection_age_cutoff: 0.250000 -2023/08/17-19:33:39.655813 8651103744 Options.blob_garbage_collection_force_threshold: 1.000000 -2023/08/17-19:33:39.655814 8651103744 Options.blob_compaction_readahead_size: 0 -2023/08/17-19:33:39.655815 8651103744 Options.blob_file_starting_level: 0 -2023/08/17-19:33:39.655816 8651103744 Options.experimental_mempurge_threshold: 0.000000 -2023/08/17-19:33:39.656468 8651103744 [db/version_set.cc:5713] Recovered from manifest file:/Users/eric/many-things/mitosis/hyperlane-monorepo/rust/validator_db_osmosistestnet/MANIFEST-000001 succeeded,manifest_file_number is 1, next_file_number is 3, last_sequence is 0, log_number is 0,prev_log_number is 0,max_column_family is 0,min_log_number_to_keep is 0 -2023/08/17-19:33:39.656471 8651103744 [db/version_set.cc:5722] Column family [default] (ID 0), log number is 0 -2023/08/17-19:33:39.656515 8651103744 [db/db_impl/db_impl_open.cc:537] DB ID: 6196d70c-89e1-4c77-be52-0ab2bfd49109 -2023/08/17-19:33:39.656745 8651103744 [db/version_set.cc:5180] Creating manifest 5 -2023/08/17-19:33:39.659254 8651103744 [db/db_impl/db_impl_open.cc:1977] SstFileManager instance 0x12a904080 -2023/08/17-19:33:39.659297 8651103744 DB pointer 0x12a015000 -2023/08/17-19:33:39.659498 6131855360 [db/db_impl/db_impl.cc:1085] ------- DUMPING STATS ------- -2023/08/17-19:33:39.659501 6131855360 [db/db_impl/db_impl.cc:1086] -** DB Stats ** -Uptime(secs): 0.0 total, 0.0 interval -Cumulative writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 GB, 0.00 MB/s -Cumulative WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Cumulative stall: 00:00:0.000 H:M:S, 0.0 percent -Interval writes: 0 writes, 0 keys, 0 commit groups, 0.0 writes per commit group, ingest: 0.00 MB, 0.00 MB/s -Interval WAL: 0 writes, 0 syncs, 0.00 writes per sync, written: 0.00 GB, 0.00 MB/s -Interval stall: 00:00:0.000 H:M:S, 0.0 percent -Write Stall (count): write-buffer-manager-limit-stops: 0, -** Compaction Stats [default] ** -Level Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - Sum 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - Int 0/0 0.00 KB 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 0 0.000 0 0 0.0 0.0 - -** Compaction Stats [default] ** -Priority Files Size Score Read(GB) Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) CompMergeCPU(sec) Comp(cnt) Avg(sec) KeyIn KeyDrop Rblob(GB) Wblob(GB) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - -Blob file count: 0, total size: 0.0 GB, garbage size: 0.0 GB, space amp: 0.0 - -Uptime(secs): 0.0 total, 0.0 interval -Flush(GB): cumulative 0.000, interval 0.000 -AddFile(GB): cumulative 0.000, interval 0.000 -AddFile(Total Files): cumulative 0, interval 0 -AddFile(L0 Files): cumulative 0, interval 0 -AddFile(Keys): cumulative 0, interval 0 -Cumulative compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Interval compaction: 0.00 GB write, 0.00 MB/s write, 0.00 GB read, 0.00 MB/s read, 0.0 seconds -Write Stall (count): cf-l0-file-count-limit-delays-with-ongoing-compaction: 0, cf-l0-file-count-limit-stops-with-ongoing-compaction: 0, l0-file-count-limit-delays: 0, l0-file-count-limit-stops: 0, memtable-limit-delays: 0, memtable-limit-stops: 0, pending-compaction-bytes-delays: 0, pending-compaction-bytes-stops: 0, total-delays: 0, total-stops: 0, Block cache LRUCache@0x600000e3c198#16938 capacity: 8.00 MB usage: 0.08 KB table_size: 256 occupancy: 87 collections: 1 last_copies: 0 last_secs: 5.2e-05 secs_since: 0 -Block cache entry stats(count,size,portion): Misc(1,0.00 KB,0%) - -** File Read Latency Histogram By Level [default] ** -2023/08/17-19:33:39.659767 8651103744 [db/db_impl/db_impl.cc:490] Shutdown: canceling all background work -2023/08/17-19:33:39.659928 8651103744 [db/db_impl/db_impl.cc:692] Shutdown complete diff --git a/rust/validator_db_osmosistestnet/MANIFEST-000005 b/rust/validator_db_osmosistestnet/MANIFEST-000005 deleted file mode 100644 index f1d1169ebb5084f6ab379df690c29da290eba713..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66 zcmZS8)^KKEU<~`Yer`cxQDRAc(HCZ(C>91r VCI%LUKRRkZ*%%l(8JO8v7yzD{5)c3Y diff --git a/rust/validator_db_osmosistestnet/OPTIONS-000007 b/rust/validator_db_osmosistestnet/OPTIONS-000007 deleted file mode 100644 index ec56ef4f4d..0000000000 --- a/rust/validator_db_osmosistestnet/OPTIONS-000007 +++ /dev/null @@ -1,198 +0,0 @@ -# This is a RocksDB option file. -# -# For detailed file format spec, please refer to the example file -# in examples/rocksdb_option_file_example.ini -# - -[Version] - rocksdb_version=8.1.1 - options_file_version=1.1 - -[DBOptions] - max_background_flushes=-1 - compaction_readahead_size=0 - strict_bytes_per_sync=false - wal_bytes_per_sync=0 - max_open_files=-1 - stats_history_buffer_size=1048576 - max_total_wal_size=0 - stats_persist_period_sec=600 - stats_dump_period_sec=600 - avoid_flush_during_shutdown=false - max_subcompactions=1 - bytes_per_sync=0 - delayed_write_rate=16777216 - max_background_compactions=-1 - max_background_jobs=2 - delete_obsolete_files_period_micros=21600000000 - writable_file_max_buffer_size=1048576 - file_checksum_gen_factory=nullptr - allow_data_in_errors=false - max_bgerror_resume_count=2147483647 - best_efforts_recovery=false - write_dbid_to_manifest=false - atomic_flush=false - wal_compression=kNoCompression - manual_wal_flush=false - two_write_queues=false - avoid_flush_during_recovery=false - dump_malloc_stats=false - info_log_level=INFO_LEVEL - write_thread_slow_yield_usec=3 - allow_ingest_behind=false - fail_if_options_file_error=false - persist_stats_to_disk=false - WAL_ttl_seconds=0 - bgerror_resume_retry_interval=1000000 - allow_concurrent_memtable_write=true - paranoid_checks=true - WAL_size_limit_MB=0 - lowest_used_cache_tier=kNonVolatileBlockTier - keep_log_file_num=1000 - table_cache_numshardbits=6 - max_file_opening_threads=16 - use_fsync=false - unordered_write=false - random_access_max_buffer_size=1048576 - log_readahead_size=0 - enable_pipelined_write=false - wal_recovery_mode=kPointInTimeRecovery - db_write_buffer_size=0 - allow_2pc=false - skip_checking_sst_file_sizes_on_db_open=false - skip_stats_update_on_db_open=false - recycle_log_file_num=0 - db_host_id=__hostname__ - access_hint_on_compaction_start=NORMAL - verify_sst_unique_id_in_manifest=true - track_and_verify_wals_in_manifest=false - error_if_exists=false - manifest_preallocation_size=4194304 - is_fd_close_on_exec=true - enable_write_thread_adaptive_yield=true - enable_thread_tracking=false - avoid_unnecessary_blocking_io=false - allow_fallocate=true - max_log_file_size=0 - advise_random_on_open=true - create_missing_column_families=false - max_write_batch_group_size_bytes=1048576 - use_adaptive_mutex=false - wal_filter=nullptr - create_if_missing=true - enforce_single_del_contracts=true - allow_mmap_writes=false - log_file_time_to_roll=0 - use_direct_io_for_flush_and_compaction=false - flush_verify_memtable_count=true - max_manifest_file_size=1073741824 - write_thread_max_yield_usec=100 - use_direct_reads=false - allow_mmap_reads=false - - -[CFOptions "default"] - memtable_protection_bytes_per_key=0 - bottommost_compression=kDisableCompressionOption - sample_for_compression=0 - blob_garbage_collection_age_cutoff=0.250000 - blob_compression_type=kNoCompression - prepopulate_blob_cache=kDisable - blob_compaction_readahead_size=0 - level0_stop_writes_trigger=36 - min_blob_size=0 - last_level_temperature=kUnknown - compaction_options_universal={allow_trivial_move=false;stop_style=kCompactionStopStyleTotalSize;min_merge_width=2;compression_size_percent=-1;max_size_amplification_percent=200;incremental=false;max_merge_width=4294967295;size_ratio=1;} - target_file_size_base=67108864 - ignore_max_compaction_bytes_for_input=true - memtable_whole_key_filtering=false - blob_file_starting_level=0 - soft_pending_compaction_bytes_limit=68719476736 - max_write_buffer_number=2 - ttl=2592000 - compaction_options_fifo={allow_compaction=false;age_for_warm=0;max_table_files_size=1073741824;} - check_flush_compaction_key_order=true - memtable_huge_page_size=0 - max_successive_merges=0 - inplace_update_num_locks=10000 - enable_blob_garbage_collection=false - arena_block_size=1048576 - bottommost_compression_opts={use_zstd_dict_trainer=true;enabled=false;parallel_threads=1;zstd_max_train_bytes=0;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;} - target_file_size_multiplier=1 - max_bytes_for_level_multiplier_additional=1:1:1:1:1:1:1 - blob_garbage_collection_force_threshold=1.000000 - enable_blob_files=false - level0_slowdown_writes_trigger=20 - compression=kSnappyCompression - level0_file_num_compaction_trigger=4 - prefix_extractor=nullptr - max_bytes_for_level_multiplier=10.000000 - write_buffer_size=67108864 - disable_auto_compactions=false - max_compaction_bytes=1677721600 - compression_opts={use_zstd_dict_trainer=true;enabled=false;parallel_threads=1;zstd_max_train_bytes=0;max_dict_bytes=0;strategy=0;max_dict_buffer_bytes=0;level=32767;window_bits=-14;} - hard_pending_compaction_bytes_limit=274877906944 - blob_file_size=268435456 - periodic_compaction_seconds=0 - paranoid_file_checks=false - experimental_mempurge_threshold=0.000000 - memtable_prefix_bloom_size_ratio=0.000000 - max_bytes_for_level_base=268435456 - max_sequential_skip_in_iterations=8 - report_bg_io_stats=false - sst_partitioner_factory=nullptr - compaction_pri=kMinOverlappingRatio - compaction_style=kCompactionStyleLevel - compaction_filter_factory=nullptr - compaction_filter=nullptr - memtable_factory=SkipListFactory - comparator=leveldb.BytewiseComparator - bloom_locality=0 - min_write_buffer_number_to_merge=1 - table_factory=BlockBasedTable - max_write_buffer_size_to_maintain=0 - max_write_buffer_number_to_maintain=0 - preserve_internal_time_seconds=0 - force_consistency_checks=true - optimize_filters_for_hits=false - merge_operator=nullptr - num_levels=7 - level_compaction_dynamic_file_size=true - memtable_insert_with_hint_prefix_extractor=nullptr - level_compaction_dynamic_level_bytes=false - preclude_last_level_data_seconds=0 - inplace_update_support=false - -[TableOptions/BlockBasedTable "default"] - num_file_reads_for_auto_readahead=2 - metadata_cache_options={unpartitioned_pinning=kFallback;partition_pinning=kFallback;top_level_index_pinning=kFallback;} - read_amp_bytes_per_bit=0 - verify_compression=false - format_version=5 - optimize_filters_for_memory=false - partition_filters=false - detect_filter_construct_corruption=false - initial_auto_readahead_size=8192 - max_auto_readahead_size=262144 - enable_index_compression=true - checksum=kXXH3 - index_block_restart_interval=1 - pin_top_level_index_and_filter=true - block_align=false - block_size=4096 - index_type=kBinarySearch - filter_policy=nullptr - metadata_block_size=4096 - no_block_cache=false - index_shortening=kShortenSeparators - whole_key_filtering=true - block_size_deviation=10 - data_block_index_type=kDataBlockBinarySearch - data_block_hash_table_util_ratio=0.750000 - cache_index_and_filter_blocks=false - prepopulate_block_cache=kDisable - block_restart_interval=16 - pin_l0_filter_and_index_blocks_in_cache=false - cache_index_and_filter_blocks_with_high_priority=true - flush_block_policy_factory=FlushBlockBySizePolicyFactory - From a854efcdd033208a524e5cf1341121f27fcfe667 Mon Sep 17 00:00:00 2001 From: hashableric Date: Fri, 18 Aug 2023 17:12:24 +0900 Subject: [PATCH 022/142] feat: add validator runnable --- rust/config/cosmos_config.json | 8 ++++---- rust/hyperlane-base/src/settings/signers.rs | 9 ++++++++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/rust/config/cosmos_config.json b/rust/config/cosmos_config.json index d1e87b036d..eeb7709a21 100644 --- a/rust/config/cosmos_config.json +++ b/rust/config/cosmos_config.json @@ -17,10 +17,10 @@ "osmosistestnet": { "name": "osmosistestnet", "domain": 21295, - "addresses": { - "mailbox": "0xaf9fb9e551459c6ac05cbec1913a8bc2c69617c3e91f4a53dbd8dc356aba7f19", - "interchainGasPaymaster": "0x8d234e850592f572d3fe582309c5729197e05ad30e33b2cfcbe7334583296a5b", - "validatorAnnounce": "0xd26f8b98e05d32c083868aa344f1eb882ba758d77a3fa66486aab63f2e253b41" + "addresses": { + "mailbox": "0xbbef451fd60c0bdcdf2b410e20ca788e2366a06837b6fb22e071bca11b3e7194", + "interchainGasPaymaster": "0x3e42b0dc5f37381544fe4c5dfcba7a38443adb3d98b59d7a655cc6b7643e6dc1", + "validatorAnnounce": "0x883ee377c9a17a7434906338b81ba510408a34c98e7843a86b219d430f33e80a" }, "protocol": "cosmos", "finalityBlocks": 1 diff --git a/rust/hyperlane-base/src/settings/signers.rs b/rust/hyperlane-base/src/settings/signers.rs index 030a0ee96b..c4bef96aec 100644 --- a/rust/hyperlane-base/src/settings/signers.rs +++ b/rust/hyperlane-base/src/settings/signers.rs @@ -145,7 +145,14 @@ impl BuildableWithSignerConf for hyperlane_ethereum::Signers { let signer = AwsSigner::new(client, id, 0).await?; hyperlane_ethereum::Signers::Aws(signer) } - SignerConf::CosmosKey { .. } => bail!("Cosmos signer"), // TODO: should be implement + SignerConf::CosmosKey { key, .. } => { + hyperlane_ethereum::Signers::Local(LocalWallet::from( + ethers::core::k256::ecdsa::SigningKey::from( + ethers::core::k256::SecretKey::from_be_bytes(key.as_bytes()) + .context("Invalid ethereum signer key")?, + ), + )) + } SignerConf::Node => bail!("Node signer"), }) } From 449aea9875fc1b3570c0b2fdbc1c42feed767cdb Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Wed, 16 Aug 2023 07:19:08 +0000 Subject: [PATCH 023/142] wip --- rust/utils/run-locally/src/cosmos.rs | 35 ++++++++++++++++++++++++++++ rust/utils/run-locally/src/main.rs | 1 + 2 files changed, 36 insertions(+) create mode 100644 rust/utils/run-locally/src/cosmos.rs diff --git a/rust/utils/run-locally/src/cosmos.rs b/rust/utils/run-locally/src/cosmos.rs new file mode 100644 index 0000000000..c5120a2069 --- /dev/null +++ b/rust/utils/run-locally/src/cosmos.rs @@ -0,0 +1,35 @@ +use crate::logging::log; + +const OSMOSIS_CLI_GIT: &str = "https://github.com/osmosis-labs/osmosis"; +const OSMOSIS_CLI_VERSION: &str = "16.1.1"; + +const CW_HYPERLANE_GIT: &str = "https://github.com/many-things/cw-hyperlane"; +const CW_HYPERLANE_VERSION: &str = "0.0.1"; + +fn install_cli() { + let target = { + let os = if cfg!(target_os = "linux") { + "linux" + } else if cfg!(target_os = "macos") { + "darwin" + } else { + panic!("Current os is not supported by Osmosis") + }; + + let arch = if cfg!(target_arch = "aarch64") { + "arm64" + } else { + "amd64" + }; + + format!("{}-{}", os, arch) + }; + + let uri = format!("{OSMOSIS_CLI_GIT}/releases/download/v{OSMOSIS_CLI_VERSION}/osmosisd-{OSMOSIS_CLI_VERSION}-{target}.tar.gz"); + log!("Downloading Osmosis CLI from {}", uri); +} + +fn install_codes() { + let uri = format!("{CW_HYPERLANE_GIT}/releases/download/{CW_HYPERLANE_VERSION}/cw-hyperlane-v{CW_HYPERLANE_VERSION}.tar.gz"); + log!("Downloading cw-hyperlane from {}", uri); +} diff --git a/rust/utils/run-locally/src/main.rs b/rust/utils/run-locally/src/main.rs index 37afd5bc16..a4afe4007f 100644 --- a/rust/utils/run-locally/src/main.rs +++ b/rust/utils/run-locally/src/main.rs @@ -35,6 +35,7 @@ use crate::{ }; mod config; +mod cosmos; mod ethereum; mod invariants; mod logging; From 420c16c4d51c2b73e30f40afd6c52f92c79f9f34 Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Thu, 17 Aug 2023 10:38:56 +0000 Subject: [PATCH 024/142] feat: osmosis localnet with cw-hyperlane contract code --- rust/Cargo.lock | 44 +++- rust/Cargo.toml | 28 ++- rust/utils/run-locally/Cargo.toml | 3 + rust/utils/run-locally/src/cosmos.rs | 35 --- rust/utils/run-locally/src/cosmos/cli.rs | 262 +++++++++++++++++++++ rust/utils/run-locally/src/cosmos/mod.rs | 209 ++++++++++++++++ rust/utils/run-locally/src/cosmos/parse.rs | 30 +++ rust/utils/run-locally/src/cosmos/rpc.rs | 42 ++++ rust/utils/run-locally/src/cosmos/utils.rs | 48 ++++ 9 files changed, 662 insertions(+), 39 deletions(-) delete mode 100644 rust/utils/run-locally/src/cosmos.rs create mode 100644 rust/utils/run-locally/src/cosmos/cli.rs create mode 100644 rust/utils/run-locally/src/cosmos/mod.rs create mode 100644 rust/utils/run-locally/src/cosmos/parse.rs create mode 100644 rust/utils/run-locally/src/cosmos/rpc.rs create mode 100644 rust/utils/run-locally/src/cosmos/utils.rs diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 5d4e7953b8..d1982cd9b1 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -4561,12 +4561,21 @@ dependencies = [ [[package]] name = "indexmap" +<<<<<<< HEAD version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", "hashbrown 0.14.2", +======= +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" +dependencies = [ + "equivalent", + "hashbrown 0.14.1", +>>>>>>> 4bdeccde8 (feat: osmosis localnet with cw-hyperlane contract code) ] [[package]] @@ -6811,7 +6820,10 @@ dependencies = [ "maplit", "nix 0.27.1", "regex", + "serde", + "serde_json", "tempfile", + "toml_edit", "ureq", "which", ] @@ -8913,6 +8925,10 @@ dependencies = [ "hex 0.4.3", "hkdf", "hmac 0.12.1", +<<<<<<< HEAD +======= + "indexmap 1.9.3", +>>>>>>> 4bdeccde8 (feat: osmosis localnet with cw-hyperlane contract code) "itoa", "log", "md-5 0.10.6", @@ -9715,6 +9731,23 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.0.2", + "toml_datetime", + "winnow", +] + [[package]] name = "tonic" version = "0.9.2" @@ -9751,7 +9784,7 @@ checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" dependencies = [ "futures-core", "futures-util", - "indexmap", + "indexmap 1.9.3", "pin-project", "pin-project-lite", "rand 0.8.5", @@ -10537,6 +10570,15 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "winnow" +version = "0.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3b801d0e0a6726477cc207f60162da452f3a95adb368399bef20a946e06f65c" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.50.0" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 5c41a197b3..7f83e98339 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -63,11 +63,16 @@ bytes = "1" clap = "4" color-eyre = "0.6" config = "0.13.3" +cosmrs = { version = "0.14", default-features = false, features = [ + "cosmwasm", + "rpc", + "tokio", + "grpc", +] } convert_case = "0.6" crunchy = "0.2" ctrlc = "3.2" curve25519-dalek = { version = "~3.2", features = ["serde"] } -cosmrs = { version = "0.14", default-features = false, features = ["cosmwasm", "rpc", "tokio", "grpc"] } derive-new = "0.5" derive_builder = "0.12" derive_more = "0.99" @@ -101,8 +106,22 @@ regex = "1.5" reqwest = "0.11" rlp = "=0.5.2" rocksdb = "0.21.0" +<<<<<<< HEAD sea-orm = { version = "0.12.3", features = ["sqlx-postgres", "runtime-tokio-native-tls", "with-bigdecimal", "with-time", "macros"] } sea-orm-migration = { version = "0.12.3", features = ["sqlx-postgres", "runtime-tokio-native-tls"] } +======= +sea-orm = { version = "0.11.1", features = [ + "sqlx-postgres", + "runtime-tokio-native-tls", + "with-bigdecimal", + "with-time", + "macros", +] } +sea-orm-migration = { version = "0.11.1", features = [ + "sqlx-postgres", + "runtime-tokio-native-tls", +] } +>>>>>>> 4bdeccde8 (feat: osmosis localnet with cw-hyperlane contract code) semver = "1.0" serde = { version = "1.0", features = ["derive"] } serde_bytes = "0.11" @@ -121,7 +140,9 @@ solana-program-test = "=1.14.13" solana-sdk = "=1.14.13" solana-transaction-status = "=1.14.13" solana-zk-token-sdk = "=1.14.13" -spl-associated-token-account = { version = "=1.1.2", features = ["no-entrypoint"] } +spl-associated-token-account = { version = "=1.1.2", features = [ + "no-entrypoint", +] } spl-noop = { version = "=0.1.3", features = ["no-entrypoint"] } spl-token = { version = "=3.5.0", features = ["no-entrypoint"] } spl-token-2022 = { version = "=0.5.0", features = ["no-entrypoint"] } @@ -133,8 +154,9 @@ tempfile = "3.3" thiserror = "1.0" time = "0.3" tiny-keccak = "2.0.2" +toml_edit = "0.19.14" +tokio = { version = "1", features = ["parking_lot"] } tokio-test = "0.4" -tokio = { version = "1.29.1", features = ["full"] } tracing = { version = "0.1", features = ["release_max_level_debug"] } tracing-error = "0.2" tracing-futures = "0.2" diff --git a/rust/utils/run-locally/Cargo.toml b/rust/utils/run-locally/Cargo.toml index 335c58cedc..0b74705b3d 100644 --- a/rust/utils/run-locally/Cargo.toml +++ b/rust/utils/run-locally/Cargo.toml @@ -10,6 +10,9 @@ publish.workspace = true version.workspace = true [dependencies] +toml_edit.workspace = true +serde.workspace = true +serde_json.workspace = true ctrlc.workspace = true eyre.workspace = true maplit.workspace = true diff --git a/rust/utils/run-locally/src/cosmos.rs b/rust/utils/run-locally/src/cosmos.rs deleted file mode 100644 index c5120a2069..0000000000 --- a/rust/utils/run-locally/src/cosmos.rs +++ /dev/null @@ -1,35 +0,0 @@ -use crate::logging::log; - -const OSMOSIS_CLI_GIT: &str = "https://github.com/osmosis-labs/osmosis"; -const OSMOSIS_CLI_VERSION: &str = "16.1.1"; - -const CW_HYPERLANE_GIT: &str = "https://github.com/many-things/cw-hyperlane"; -const CW_HYPERLANE_VERSION: &str = "0.0.1"; - -fn install_cli() { - let target = { - let os = if cfg!(target_os = "linux") { - "linux" - } else if cfg!(target_os = "macos") { - "darwin" - } else { - panic!("Current os is not supported by Osmosis") - }; - - let arch = if cfg!(target_arch = "aarch64") { - "arm64" - } else { - "amd64" - }; - - format!("{}-{}", os, arch) - }; - - let uri = format!("{OSMOSIS_CLI_GIT}/releases/download/v{OSMOSIS_CLI_VERSION}/osmosisd-{OSMOSIS_CLI_VERSION}-{target}.tar.gz"); - log!("Downloading Osmosis CLI from {}", uri); -} - -fn install_codes() { - let uri = format!("{CW_HYPERLANE_GIT}/releases/download/{CW_HYPERLANE_VERSION}/cw-hyperlane-v{CW_HYPERLANE_VERSION}.tar.gz"); - log!("Downloading cw-hyperlane from {}", uri); -} diff --git a/rust/utils/run-locally/src/cosmos/cli.rs b/rust/utils/run-locally/src/cosmos/cli.rs new file mode 100644 index 0000000000..632cc696b8 --- /dev/null +++ b/rust/utils/run-locally/src/cosmos/cli.rs @@ -0,0 +1,262 @@ +use std::{collections::BTreeMap, io::Write, path::PathBuf, process::Stdio}; + +use macro_rules_attribute::apply; + +use crate::{ + program::Program, + utils::{as_task, concat_path, AgentHandles, TaskHandle}, +}; + +use super::{ + modify_toml, parse::TxResponse, sed, wait_for_node, KEY_ACCOUNTS1, KEY_ACCOUNTS2, + KEY_ACCOUNTS3, KEY_VALIDATOR, +}; + +const GENESIS_FUND: u128 = 1000000000000; + +pub struct OsmosisEndpoint { + pub addr: String, + pub rpc_addr: String, + pub grpc_addr: String, +} + +impl OsmosisEndpoint { + fn wait_for_node(&self) { + wait_for_node(&self.rpc_addr) + } + + fn add_rpc(&self, program: Program) -> Program { + program.arg("node", &self.rpc_addr) + } +} + +pub struct OsmosisCLI { + pub bin: PathBuf, + pub home: String, +} + +impl OsmosisCLI { + pub fn new(bin: PathBuf, home: &str) -> Self { + Self { + bin, + home: home.to_string(), + } + } + + fn cli(&self) -> Program { + Program::new(self.bin.clone()).arg("home", &self.home) + } + + fn add_gas(&self, program: Program) -> Program { + program + .arg("gas", "auto") + .arg("gas-prices", "0.025uosmo") + .arg("gas-adjustment", "1.5") + .flag("yes") + } + + pub fn init(&self, moniker: &str, chain_id: &str) { + self.cli() + .cmd("init") + .cmd(moniker) + .arg("chain-id", chain_id) + .run() + .join(); + + let genesis_path = concat_path(&self.home, "config/genesis.json"); + sed("stake", "uosmo", genesis_path.to_str().unwrap()); + + // modify node config + let node_config_path = concat_path(&self.home, "config/config.toml"); + modify_toml( + node_config_path, + Box::new(|v| { + v["p2p"]["pex"] = toml_edit::value(false); + v["consensus"]["timeout_commit"] = toml_edit::value("1s"); + }), + ); + + // modify app config + let app_config_path = concat_path(&self.home, "config/app.toml"); + modify_toml( + app_config_path, + Box::new(|v| { + v["minimum-gas-prices"] = toml_edit::value("0.025uosmo"); + v["api"]["enable"] = toml_edit::value(false); + v["grpc-web"]["enable"] = toml_edit::value(false); + }), + ); + + // modify client config + let client_chain_id = chain_id.to_string(); + let client_config_path = concat_path(&self.home, "config/client.toml"); + modify_toml( + client_config_path, + Box::new(move |v| { + v["keyring-backend"] = toml_edit::value("test"); + v["output"] = toml_edit::value("json"); + v["chain-id"] = toml_edit::value(client_chain_id.clone()); + v["broadcast-mode"] = toml_edit::value("block"); + }), + ); + + self.add_default_keys(); + self.add_genesis_accs(); + + self.cli() + .cmd("gentx") + .cmd("validator") + .cmd(format!("{}uosmo", GENESIS_FUND)) + .arg("chain-id", chain_id) + .run() + .join(); + + self.cli().cmd("collect-gentxs").run().join(); + } + + #[apply(as_task)] + pub fn run( + self, + addr_base: String, + port_base: u32, + codes: BTreeMap, + ) -> (AgentHandles, OsmosisEndpoint, BTreeMap) { + if !addr_base.starts_with("tcp://") { + panic!("invalid addr_base: {}", addr_base); + } + + let mut next_port = port_base; + let mut get_next_addr = || { + let port = next_port; + next_port += 1; + format!("{addr_base}:{port}") + }; + + let addr = get_next_addr(); + let p2p_addr = get_next_addr(); + let rpc_addr = get_next_addr(); + let grpc_addr = get_next_addr().replace("tcp://", ""); + let pprof_addr = get_next_addr().replace("tcp://", ""); + + let endpoint = OsmosisEndpoint { + addr, + rpc_addr, + grpc_addr, + }; + + let node = self + .cli() + .cmd("start") + .arg("address", &endpoint.addr) // default is tcp://0.0.0.0:26658 + // addrs + .arg("p2p.laddr", p2p_addr) // default is tcp://0.0.0.0:26655 + .arg("rpc.laddr", &endpoint.rpc_addr) // default is tcp://0.0.0.0:26657 + .arg("grpc.address", &endpoint.grpc_addr) // default is 0.0.0.0:9090 + .arg("rpc.pprof_laddr", pprof_addr) // default is localhost:6060 + .spawn("COSMOS"); + + endpoint.wait_for_node(); + + let stored_codes = self.deploy_contracts(&endpoint, "validator", codes); + + (node, endpoint, stored_codes) + } + + fn deploy_contracts( + &self, + endpoint: &OsmosisEndpoint, + sender: &str, + codes: BTreeMap, + ) -> BTreeMap { + let mut ret = BTreeMap::::new(); + + for (name, code) in codes { + let wasm_store_cmd = self + .cli() + .cmd("tx") + .cmd("wasm") + .cmd("store") + .cmd(code.to_str().unwrap()) + .arg("from", sender); + + let wasm_store_cmd = self.add_gas(wasm_store_cmd); + let wasm_store_cmd = endpoint.add_rpc(wasm_store_cmd).run_with_output().join(); + + println!("{:?}", wasm_store_cmd.first().unwrap()); + + let wasm_store_tx_resp: TxResponse = + serde_json::from_str(wasm_store_cmd.first().unwrap()).unwrap(); + + let store_code_log = wasm_store_tx_resp.logs.first().unwrap(); + let store_code_evt = store_code_log + .events + .iter() + .find(|v| v.typ == "store_code") + .unwrap(); + + let code_id = &store_code_evt.attributes.last().unwrap().value; + let code_id = code_id.parse::().unwrap(); + + ret.insert(name, code_id); + } + + ret + } + + fn add_genesis_accs(&self) { + for name in [("validator"), ("account1"), ("account2"), ("account3")] { + self.cli() + .cmd("add-genesis-account") + .cmd(self.get_addr(name)) + .cmd(format!("{}uosmo", GENESIS_FUND * 2)) + .run() + .join(); + } + } + + fn add_default_keys(&self) { + for (name, mnemonic) in [ + ("validator", KEY_VALIDATOR), + ("account1", KEY_ACCOUNTS1), + ("account2", KEY_ACCOUNTS2), + ("account3", KEY_ACCOUNTS3), + ] { + self.add_key(name, mnemonic); + } + } + + pub fn add_key(&self, name: &str, mnemonic: &str) { + let mut child = self + .cli() + .cmd("keys") + .cmd("add") + .cmd(name) + .flag("recover") + .create_command() + .stdin(Stdio::piped()) + .spawn() + .expect("failed to spawn process"); + + child + .stdin + .as_mut() + .unwrap() + .write_all(format!("{mnemonic}\n").as_bytes()) + .unwrap(); + + child.wait().unwrap(); + } + + pub fn get_addr(&self, name: &str) -> String { + let out = self + .cli() + .cmd("keys") + .cmd("show") + .raw_arg("-a") + .cmd(name) + .run_with_output() + .join(); + println!("{:?}", out); + out.first().unwrap().clone() + } +} diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs new file mode 100644 index 0000000000..4fc93c9331 --- /dev/null +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -0,0 +1,209 @@ +use std::collections::BTreeMap; +use std::fs; +use std::path::PathBuf; + +use macro_rules_attribute::apply; +use tempfile::tempdir; + +mod cli; +mod parse; +mod rpc; +mod utils; + +use rpc::*; +use utils::*; + +use crate::logging::log; +use crate::utils::{as_task, concat_path, AgentHandles, TaskHandle}; +use cli::{OsmosisCLI, OsmosisEndpoint}; + +const OSMOSIS_CLI_GIT: &str = "https://github.com/osmosis-labs/osmosis"; +const OSMOSIS_CLI_VERSION: &str = "16.1.1"; + +const KEY_VALIDATOR: &str = "legend auto stand worry powder idle recall there wet ancient universe badge ability blame hidden body steak april boost thrive room piece city type"; +const KEY_ACCOUNTS1: &str = "stomach employ hidden risk fork parent dream noodle inside banner stable private grain nothing absent brave metal math hybrid amused move affair move muffin"; +const KEY_ACCOUNTS2: &str = "say merry worry steak hedgehog sing spike fold empower pluck feel grass omit finish biology traffic dog sea ozone hint region service one gown"; +const KEY_ACCOUNTS3: &str = "maple often cargo polar eager jaguar eight inflict once nest nice swamp weasel address swift physical valid culture cheese trumpet find dinosaur curve tray"; + +const CW_HYPERLANE_GIT: &str = "https://github.com/many-things/cw-hyperlane"; +const CW_HYPERLANE_VERSION: &str = "0.0.1"; + +pub fn install_cli(dir: Option) -> PathBuf { + let target = { + let os = if cfg!(target_os = "linux") { + "linux" + } else if cfg!(target_os = "macos") { + "darwin" + } else { + panic!("Current os is not supported by Osmosis") + }; + + let arch = if cfg!(target_arch = "aarch64") { + "arm64" + } else { + "amd64" + }; + + format!("{}-{}", os, arch) + }; + + let dir_path = match dir { + Some(path) => path, + None => tempdir().unwrap().into_path(), + }; + let dir_path = dir_path.to_str().unwrap(); + + let release_name = format!("osmosisd-{OSMOSIS_CLI_VERSION}-{target}"); + let release_comp = format!("{release_name}.tar.gz"); + + log!("Downloading Osmosis CLI v{}", OSMOSIS_CLI_VERSION); + let uri = format!("{OSMOSIS_CLI_GIT}/releases/download/v{OSMOSIS_CLI_VERSION}/{release_comp}"); + download(&release_comp, &uri, dir_path); + + log!("Uncompressing Osmosis release"); + unzip(&release_comp, dir_path); + + concat_path(dir_path, "osmosisd") +} + +pub fn install_codes(dir: Option) -> BTreeMap { + let dir_path = match dir { + Some(path) => path, + None => tempdir().unwrap().into_path(), + }; + let dir_path = dir_path.to_str().unwrap(); + + let release_name = format!("cw-hyperlane-v{CW_HYPERLANE_VERSION}"); + let release_comp = format!("{release_name}.tar.gz"); + + log!("Downloading cw-hyperlane v{}", CW_HYPERLANE_VERSION); + let uri = format!("{CW_HYPERLANE_GIT}/releases/download/{CW_HYPERLANE_VERSION}/{release_comp}"); + download(&release_comp, &uri, dir_path); + + log!("Uncompressing cw-hyperlane release"); + unzip(&release_comp, dir_path); + + // make contract_name => path map + fs::read_dir(dir_path) + .unwrap() + .map(|v| { + let entry = v.unwrap(); + (entry.file_name().into_string().unwrap(), entry.path()) + }) + .filter(|(filename, _)| filename.ends_with(".wasm")) + .map(|v| (v.0.replace(".wasm", ""), v.1)) + .collect() +} + +#[allow(dead_code)] +pub fn install_cosmos( + cli_dir: Option, + codes_dir: Option, +) -> (PathBuf, BTreeMap) { + let osmosisd = install_cli(cli_dir); + let codes = install_codes(codes_dir); + + (osmosisd, codes) +} + +#[derive(Clone)] +struct CosmosInitConfig { + pub cli_path: PathBuf, + pub home_path: Option, + + pub codes: BTreeMap, + + pub node_addr_base: String, + pub node_port_base: u32, + + pub moniker: String, + pub chain_id: String, +} + +#[allow(dead_code)] +#[apply(as_task)] +fn launch_cosmos_validator( + config: CosmosInitConfig, +) -> ( + AgentHandles, + OsmosisEndpoint, + BTreeMap, + PathBuf, +) { + let home_path = match config.home_path { + Some(v) => v, + None => tempdir().unwrap().into_path(), + }; + + let cli = OsmosisCLI::new(config.cli_path, home_path.to_str().unwrap()); + + cli.init(&config.moniker, &config.chain_id); + + let (node, endpoint, stored_codes) = cli + .run(config.node_addr_base, config.node_port_base, config.codes) + .join(); + + (node, endpoint, stored_codes, home_path) +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_run() { + let test_dir = tempdir().unwrap().into_path(); + let _ = fs::remove_dir_all(&test_dir); + + let test_cli_dir = concat_path(&test_dir, "cli"); + let test_codes_dir = concat_path(&test_dir, "codes"); + let test_node1_home = concat_path(&test_dir, "node1"); + let test_node2_home = concat_path(&test_dir, "node2"); + + for path in [ + &test_dir, + &test_cli_dir, + &test_codes_dir, + &test_node1_home, + &test_node2_home, + ] { + fs::create_dir_all(path).unwrap(); + } + + let (osmosisd, codes) = install_cosmos(Some(test_cli_dir), Some(test_codes_dir)); + + let addr_base = "tcp://0.0.0.0"; + let default_config = CosmosInitConfig { + cli_path: osmosisd.clone(), + home_path: None, + + codes, + + node_addr_base: addr_base.to_string(), + node_port_base: 26657, + + moniker: "localnet".to_string(), + chain_id: "local-node".to_string(), + }; + + let launch_node1_res = launch_cosmos_validator(CosmosInitConfig { + home_path: Some(test_node1_home), + node_port_base: 26600, + chain_id: "local-node-1".to_string(), + ..default_config.clone() + }); + + let launch_node2_res = launch_cosmos_validator(CosmosInitConfig { + home_path: Some(test_node2_home), + node_port_base: 26610, + chain_id: "local-node-2".to_string(), + ..default_config.clone() + }); + + let (_, _, node1_codes, ..) = launch_node1_res.join(); + let (_, _, node2_codes, ..) = launch_node2_res.join(); + + println!("node1 codes: {:?}", node1_codes); + println!("node2 codes: {:?}", node2_codes); + } +} diff --git a/rust/utils/run-locally/src/cosmos/parse.rs b/rust/utils/run-locally/src/cosmos/parse.rs new file mode 100644 index 0000000000..66fd6bd570 --- /dev/null +++ b/rust/utils/run-locally/src/cosmos/parse.rs @@ -0,0 +1,30 @@ +#[derive(serde::Serialize, serde::Deserialize)] +pub(crate) struct TxEventAttr { + pub key: String, + pub value: String, +} + +#[derive(serde::Serialize, serde::Deserialize)] +pub(crate) struct TxEvent { + #[serde(rename = "type")] + pub typ: String, + pub attributes: Vec, +} + +#[derive(serde::Serialize, serde::Deserialize)] +pub(crate) struct TxLog { + pub msg_index: u32, + pub log: String, + pub events: Vec, +} + +#[derive(serde::Serialize, serde::Deserialize)] +pub(crate) struct TxResponse { + pub height: String, + pub txhash: String, + pub codespace: String, + pub code: u32, + pub data: String, + pub raw_log: String, + pub logs: Vec, +} diff --git a/rust/utils/run-locally/src/cosmos/rpc.rs b/rust/utils/run-locally/src/cosmos/rpc.rs new file mode 100644 index 0000000000..50fa5e852a --- /dev/null +++ b/rust/utils/run-locally/src/cosmos/rpc.rs @@ -0,0 +1,42 @@ +use std::{thread::sleep, time::Duration}; + +use ureq::get; + +const MAX_REQUEST_COUNT: i32 = 30; + +#[derive(serde::Serialize, serde::Deserialize)] +struct JsonRpcResp { + pub jsonrpc: String, + pub id: i32, + pub result: serde_json::Value, +} + +pub fn wait_for_node(rpc_addr: &str) { + let mut count = 0; + loop { + if count > MAX_REQUEST_COUNT { + panic!("failed to start node"); + } + + let req_url = format!("{}/status", rpc_addr.replace("tcp", "http")); + if let Ok(resp) = get(&req_url).call() { + if resp.status() == 200 { + let rpc_resp: JsonRpcResp = + serde_json::from_str(&resp.into_string().unwrap()).unwrap(); + + let rpc_resp = rpc_resp.result.as_object().unwrap(); + let rpc_resp = rpc_resp["sync_info"].as_object().unwrap(); + + let latest_block_height = rpc_resp["latest_block_height"].as_str().unwrap(); + let latest_block_height = latest_block_height.parse::().unwrap(); + + if latest_block_height > 0 { + break; + } + } + } + + sleep(Duration::from_secs(1)); + count += 1; + } +} diff --git a/rust/utils/run-locally/src/cosmos/utils.rs b/rust/utils/run-locally/src/cosmos/utils.rs new file mode 100644 index 0000000000..e2e4687d97 --- /dev/null +++ b/rust/utils/run-locally/src/cosmos/utils.rs @@ -0,0 +1,48 @@ +use std::{fs, path::PathBuf}; + +use toml_edit::Document; + +use crate::program::Program; +use crate::utils::TaskHandle; + +pub(crate) fn sed(from: &str, to: &str, file: &str) { + Program::new("sed") + .raw_arg("-i") + .cmd("") + .cmd(format!("s/{from}/{to}/g")) + .cmd(file) + .run() + .join(); +} + +pub(crate) fn unzip(output: &str, dir: &str) { + Program::new("tar") + .flag("extract") + .arg("file", output) + .working_dir(dir) + .run() + .join(); +} + +pub(crate) fn download(output: &str, uri: &str, dir: &str) { + Program::new("curl") + .arg("output", output) + .flag("location") + .cmd(uri) + .flag("silent") + .working_dir(dir) + .run() + .join(); +} + +pub(crate) fn modify_toml(file: impl Into, modifier: Box) { + let path = file.into(); + let mut config = fs::read_to_string(&path) + .unwrap() + .parse::() + .unwrap(); + + modifier(&mut config); + + fs::write(path, config.to_string()).unwrap(); +} From 9719c345b8200a2141ab1f5df95b3de44ad4b3b7 Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Thu, 17 Aug 2023 11:19:09 +0000 Subject: [PATCH 025/142] feat: wasm helpers --- rust/utils/run-locally/src/cosmos/cli.rs | 134 +++++++++++++++--- rust/utils/run-locally/src/cosmos/mod.rs | 84 ++++++----- .../src/cosmos/{parse.rs => types.rs} | 14 +- 3 files changed, 167 insertions(+), 65 deletions(-) rename rust/utils/run-locally/src/cosmos/{parse.rs => types.rs} (73%) diff --git a/rust/utils/run-locally/src/cosmos/cli.rs b/rust/utils/run-locally/src/cosmos/cli.rs index 632cc696b8..f612f2845b 100644 --- a/rust/utils/run-locally/src/cosmos/cli.rs +++ b/rust/utils/run-locally/src/cosmos/cli.rs @@ -1,15 +1,13 @@ use std::{collections::BTreeMap, io::Write, path::PathBuf, process::Stdio}; -use macro_rules_attribute::apply; - use crate::{ program::Program, - utils::{as_task, concat_path, AgentHandles, TaskHandle}, + utils::{concat_path, AgentHandles, TaskHandle}, }; use super::{ - modify_toml, parse::TxResponse, sed, wait_for_node, KEY_ACCOUNTS1, KEY_ACCOUNTS2, - KEY_ACCOUNTS3, KEY_VALIDATOR, + modify_toml, sed, wait_for_node, KEY_ACCOUNTS1, KEY_ACCOUNTS2, KEY_ACCOUNTS3, KEY_VALIDATOR, + {Coin, TxResponse}, }; const GENESIS_FUND: u128 = 1000000000000; @@ -114,13 +112,7 @@ impl OsmosisCLI { self.cli().cmd("collect-gentxs").run().join(); } - #[apply(as_task)] - pub fn run( - self, - addr_base: String, - port_base: u32, - codes: BTreeMap, - ) -> (AgentHandles, OsmosisEndpoint, BTreeMap) { + pub fn start(&self, addr_base: String, port_base: u32) -> (AgentHandles, OsmosisEndpoint) { if !addr_base.starts_with("tcp://") { panic!("invalid addr_base: {}", addr_base); } @@ -157,12 +149,10 @@ impl OsmosisCLI { endpoint.wait_for_node(); - let stored_codes = self.deploy_contracts(&endpoint, "validator", codes); - - (node, endpoint, stored_codes) + (node, endpoint) } - fn deploy_contracts( + pub fn store_codes( &self, endpoint: &OsmosisEndpoint, sender: &str, @@ -171,7 +161,7 @@ impl OsmosisCLI { let mut ret = BTreeMap::::new(); for (name, code) in codes { - let wasm_store_cmd = self + let cmd = self .cli() .cmd("tx") .cmd("wasm") @@ -179,13 +169,11 @@ impl OsmosisCLI { .cmd(code.to_str().unwrap()) .arg("from", sender); - let wasm_store_cmd = self.add_gas(wasm_store_cmd); - let wasm_store_cmd = endpoint.add_rpc(wasm_store_cmd).run_with_output().join(); - - println!("{:?}", wasm_store_cmd.first().unwrap()); + let cmd = self.add_gas(cmd); + let cmd = endpoint.add_rpc(cmd); let wasm_store_tx_resp: TxResponse = - serde_json::from_str(wasm_store_cmd.first().unwrap()).unwrap(); + serde_json::from_str(cmd.run_with_output().join().first().unwrap()).unwrap(); let store_code_log = wasm_store_tx_resp.logs.first().unwrap(); let store_code_evt = store_code_log @@ -203,6 +191,108 @@ impl OsmosisCLI { ret } + pub fn wasm_init( + &self, + endpoint: &OsmosisEndpoint, + sender: &str, + admin: Option<&str>, + code_id: u64, + init_msg: T, + label: &str, + ) -> String { + let mut cmd = self + .cli() + .cmd("tx") + .cmd("wasm") + .cmd("instantiate") + .cmd(code_id.to_string()) + .cmd(serde_json::to_string(&init_msg).unwrap()) + .arg("from", sender) + .arg("label", label); + + cmd = self.add_gas(cmd); + cmd = endpoint.add_rpc(cmd); + + if let Some(admin) = admin { + cmd = cmd.arg("admin", admin); + } else { + cmd = cmd.flag("no-admin"); + } + + let wasm_init_resp: TxResponse = + serde_json::from_str(cmd.run_with_output().join().first().unwrap()).unwrap(); + + let init_log = wasm_init_resp.logs.first().unwrap(); + let init_evt = init_log.events.iter().find(|v| v.typ == "reply").unwrap(); + + let contract_addr = &init_evt + .attributes + .iter() + .find(|v| v.key == "_contract_address") + .unwrap() + .value; + + contract_addr.to_string() + } + + pub fn wasm_execute( + &self, + endpoint: &OsmosisEndpoint, + sender: &str, + contract: &str, + execute_msg: T, + funds: Vec, + ) -> TxResponse { + let mut cmd = self + .cli() + .cmd("tx") + .cmd("wasm") + .cmd("execute") + .cmd(contract) + .cmd(serde_json::to_string(&execute_msg).unwrap()) + .arg("from", sender); + + cmd = self.add_gas(cmd); + cmd = endpoint.add_rpc(cmd); + + if funds.len() > 0 { + cmd = cmd.arg( + "amount", + funds + .into_iter() + .map(|v| format!("{}{}", v.amount, v.denom)) + .collect::>() + .join(","), + ); + } + + let output = serde_json::from_str(cmd.run_with_output().join().first().unwrap()); + + output.unwrap() + } + + pub fn wasm_query( + &self, + endpoint: &OsmosisEndpoint, + contract: &str, + query_msg: T, + ) -> U { + let mut cmd = self + .cli() + .cmd("query") + .cmd("wasm") + .cmd("contract-state") + .cmd("smart") + .cmd(contract) + .cmd(serde_json::to_string(&query_msg).unwrap()); + + cmd = endpoint.add_rpc(cmd); + + let output = serde_json::from_str(cmd.run_with_output().join().first().unwrap()); + + output.unwrap() + } + fn add_genesis_accs(&self) { for name in [("validator"), ("account1"), ("account2"), ("account3")] { self.cli() diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index 4fc93c9331..ed02fd9a2d 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -6,11 +6,12 @@ use macro_rules_attribute::apply; use tempfile::tempdir; mod cli; -mod parse; mod rpc; +mod types; mod utils; use rpc::*; +use types::*; use utils::*; use crate::logging::log; @@ -28,25 +29,27 @@ const KEY_ACCOUNTS3: &str = "maple often cargo polar eager jaguar eight inflict const CW_HYPERLANE_GIT: &str = "https://github.com/many-things/cw-hyperlane"; const CW_HYPERLANE_VERSION: &str = "0.0.1"; -pub fn install_cli(dir: Option) -> PathBuf { - let target = { - let os = if cfg!(target_os = "linux") { - "linux" - } else if cfg!(target_os = "macos") { - "darwin" - } else { - panic!("Current os is not supported by Osmosis") - }; - - let arch = if cfg!(target_arch = "aarch64") { - "arm64" - } else { - "amd64" - }; +fn make_target() -> String { + let os = if cfg!(target_os = "linux") { + "linux" + } else if cfg!(target_os = "macos") { + "darwin" + } else { + panic!("Current os is not supported by Osmosis") + }; - format!("{}-{}", os, arch) + let arch = if cfg!(target_arch = "aarch64") { + "arm64" + } else { + "amd64" }; + format!("{}-{}", os, arch) +} + +pub fn install_cli(dir: Option) -> PathBuf { + let target = make_target(); + let dir_path = match dir { Some(path) => path, None => tempdir().unwrap().into_path(), @@ -107,7 +110,7 @@ pub fn install_cosmos( } #[derive(Clone)] -struct CosmosInitConfig { +struct CosmosConfig { pub cli_path: PathBuf, pub home_path: Option, @@ -120,16 +123,16 @@ struct CosmosInitConfig { pub chain_id: String, } +struct CosmosResp { + pub node: AgentHandles, + pub endpoint: OsmosisEndpoint, + pub codes: BTreeMap, + pub home_path: PathBuf, +} + #[allow(dead_code)] #[apply(as_task)] -fn launch_cosmos_validator( - config: CosmosInitConfig, -) -> ( - AgentHandles, - OsmosisEndpoint, - BTreeMap, - PathBuf, -) { +fn launch_cosmos_validator(config: CosmosConfig) -> CosmosResp { let home_path = match config.home_path { Some(v) => v, None => tempdir().unwrap().into_path(), @@ -138,12 +141,15 @@ fn launch_cosmos_validator( let cli = OsmosisCLI::new(config.cli_path, home_path.to_str().unwrap()); cli.init(&config.moniker, &config.chain_id); - - let (node, endpoint, stored_codes) = cli - .run(config.node_addr_base, config.node_port_base, config.codes) - .join(); - - (node, endpoint, stored_codes, home_path) + let (node, endpoint) = cli.start(config.node_addr_base, config.node_port_base); + let codes = cli.store_codes(&endpoint, "validator", config.codes); + + CosmosResp { + node, + endpoint, + codes, + home_path, + } } #[cfg(test)] @@ -173,7 +179,7 @@ mod test { let (osmosisd, codes) = install_cosmos(Some(test_cli_dir), Some(test_codes_dir)); let addr_base = "tcp://0.0.0.0"; - let default_config = CosmosInitConfig { + let default_config = CosmosConfig { cli_path: osmosisd.clone(), home_path: None, @@ -186,24 +192,24 @@ mod test { chain_id: "local-node".to_string(), }; - let launch_node1_res = launch_cosmos_validator(CosmosInitConfig { + let launch_node1_res = launch_cosmos_validator(CosmosConfig { home_path: Some(test_node1_home), node_port_base: 26600, chain_id: "local-node-1".to_string(), ..default_config.clone() }); - let launch_node2_res = launch_cosmos_validator(CosmosInitConfig { + let launch_node2_res = launch_cosmos_validator(CosmosConfig { home_path: Some(test_node2_home), node_port_base: 26610, chain_id: "local-node-2".to_string(), ..default_config.clone() }); - let (_, _, node1_codes, ..) = launch_node1_res.join(); - let (_, _, node2_codes, ..) = launch_node2_res.join(); + let node1_run_res = launch_node1_res.join(); + let node2_run_res = launch_node2_res.join(); - println!("node1 codes: {:?}", node1_codes); - println!("node2 codes: {:?}", node2_codes); + println!("node1 codes: {:?}", node1_run_res.codes); + println!("node2 codes: {:?}", node2_run_res.codes); } } diff --git a/rust/utils/run-locally/src/cosmos/parse.rs b/rust/utils/run-locally/src/cosmos/types.rs similarity index 73% rename from rust/utils/run-locally/src/cosmos/parse.rs rename to rust/utils/run-locally/src/cosmos/types.rs index 66fd6bd570..eddb7fb65f 100644 --- a/rust/utils/run-locally/src/cosmos/parse.rs +++ b/rust/utils/run-locally/src/cosmos/types.rs @@ -1,25 +1,25 @@ #[derive(serde::Serialize, serde::Deserialize)] -pub(crate) struct TxEventAttr { +pub struct TxEventAttr { pub key: String, pub value: String, } #[derive(serde::Serialize, serde::Deserialize)] -pub(crate) struct TxEvent { +pub struct TxEvent { #[serde(rename = "type")] pub typ: String, pub attributes: Vec, } #[derive(serde::Serialize, serde::Deserialize)] -pub(crate) struct TxLog { +pub struct TxLog { pub msg_index: u32, pub log: String, pub events: Vec, } #[derive(serde::Serialize, serde::Deserialize)] -pub(crate) struct TxResponse { +pub struct TxResponse { pub height: String, pub txhash: String, pub codespace: String, @@ -28,3 +28,9 @@ pub(crate) struct TxResponse { pub raw_log: String, pub logs: Vec, } + +#[derive(serde::Serialize, serde::Deserialize)] +pub struct Coin { + pub denom: String, + pub amount: String, +} From 7a5838c40563cfb48c993414fca508d7c60463e5 Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Thu, 17 Aug 2023 11:26:11 +0000 Subject: [PATCH 026/142] feat: add hpl-interface --- rust/Cargo.lock | 226 ++++++++++++++++++++++++++++++ rust/Cargo.toml | 1 + rust/utils/run-locally/Cargo.toml | 1 + 3 files changed, 228 insertions(+) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index d1982cd9b1..d37612b3a7 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -717,6 +717,12 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" +[[package]] +name = "bnum" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" + [[package]] name = "borrown" version = "0.1.0" @@ -1427,6 +1433,82 @@ dependencies = [ "tokio", ] +[[package]] +name = "cosmwasm-crypto" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6fb22494cf7d23d0c348740e06e5c742070b2991fd41db77bba0bcfbae1a723" +dependencies = [ + "digest 0.10.7", + "ed25519-zebra", + "k256 0.13.1", + "rand_core 0.6.4", + "thiserror", +] + +[[package]] +name = "cosmwasm-derive" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e199424486ea97d6b211db6387fd72e26b4a439d40cc23140b2d8305728055b" +dependencies = [ + "syn 1.0.109", +] + +[[package]] +name = "cosmwasm-schema" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fef683a9c1c4eabd6d31515719d0d2cc66952c4c87f7eb192bfc90384517dc34" +dependencies = [ + "cosmwasm-schema-derive", + "schemars", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cosmwasm-schema-derive" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9567025acbb4c0c008178393eb53b3ac3c2e492c25949d3bf415b9cbe80772d8" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "cosmwasm-std" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d89d680fb60439b7c5947b15f9c84b961b88d1f8a3b20c4bd178a3f87db8bae" +dependencies = [ + "base64 0.21.4", + "bnum", + "cosmwasm-crypto", + "cosmwasm-derive", + "derivative", + "forward_ref", + "hex 0.4.3", + "schemars", + "serde", + "serde-json-wasm", + "sha2 0.10.8", + "thiserror", +] + +[[package]] +name = "cosmwasm-storage" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54a1c574d30feffe4b8121e61e839c231a5ce21901221d2fb4d5c945968a4f00" +dependencies = [ + "cosmwasm-std", + "serde", +] + [[package]] name = "counter" version = "0.5.7" @@ -1664,6 +1746,59 @@ dependencies = [ "zeroize", ] +[[package]] +name = "cw-storage-plus" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f0e92a069d62067f3472c62e30adedb4cab1754725c0f2a682b3128d2bf3c79" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", +] + +[[package]] +name = "cw-utils" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9f351a4e4d81ef7c890e44d903f8c0bdcdc00f094fd3a181eaf70c0eec7a3a" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw2", + "schemars", + "semver", + "serde", + "thiserror", +] + +[[package]] +name = "cw2" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9431d14f64f49e41c6ef5561ed11a5391c417d0cb16455dea8cdcb9037a8d197" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw20" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "786e9da5e937f473cecd2463e81384c1af65d0f6398bbd851be7655487c55492" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-utils", + "schemars", + "serde", +] + [[package]] name = "cynic" version = "2.2.8" @@ -2053,6 +2188,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" +[[package]] +name = "dyn-clone" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d2f3407d9a573d666de4b5bdf10569d73ca9478087346697dcbae6244bfbcd" + [[package]] name = "eager" version = "0.1.0" @@ -2152,6 +2293,21 @@ dependencies = [ "sha2 0.10.8", ] +[[package]] +name = "ed25519-zebra" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" +dependencies = [ + "curve25519-dalek", + "hashbrown 0.12.3", + "hex 0.4.3", + "rand_core 0.6.4", + "serde", + "sha2 0.9.9", + "zeroize", +] + [[package]] name = "educe" version = "0.4.23" @@ -2848,6 +3004,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "forward_ref" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" + [[package]] name = "fragile" version = "2.0.0" @@ -3691,6 +3853,25 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "hpl-interface" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0602bdd62a179a66f7ed16e3e3a76b7c72cccf87437dcd0d8bc79f978fd13c2d" +dependencies = [ + "bech32 0.9.1", + "cosmwasm-schema", + "cosmwasm-std", + "cosmwasm-storage", + "cw-storage-plus", + "cw2", + "cw20", + "schemars", + "serde", + "sha3 0.10.8", + "thiserror", +] + [[package]] name = "http" version = "0.2.9" @@ -6815,6 +6996,7 @@ version = "0.1.0" dependencies = [ "ctrlc", "eyre", + "hpl-interface", "hyperlane-core", "macro_rules_attribute", "maplit", @@ -7175,6 +7357,30 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "schemars" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f7b0ce13155372a76ee2e1c5ffba1fe61ede73fbea5630d61eee6fac4929c0c" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e85e2a16b12bdb763244c69ab79363d71db2b4b918a2def53f80b02e0574b13c" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "serde_derive_internals", + "syn 1.0.109", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -7560,6 +7766,15 @@ dependencies = [ "serde_json", ] +[[package]] +name = "serde-json-wasm" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16a62a1fad1e1828b24acac8f2b468971dade7b8c3c2e672bcadefefb1f8c137" +dependencies = [ + "serde", +] + [[package]] name = "serde_bytes" version = "0.11.12" @@ -7580,6 +7795,17 @@ dependencies = [ "syn 2.0.38", ] +[[package]] +name = "serde_derive_internals" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" +dependencies = [ + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + [[package]] name = "serde_json" version = "1.0.108" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 7f83e98339..369b125807 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -176,6 +176,7 @@ hyper = "0.14" hyper-tls = "0.5.0" hex = "0.4.3" tendermint-rpc = { version = "0.32.0", features = ["http-client", "tokio"]} +hpl-interface = "0.0.1" [workspace.dependencies.ethers] git = "https://github.com/hyperlane-xyz/ethers-rs" diff --git a/rust/utils/run-locally/Cargo.toml b/rust/utils/run-locally/Cargo.toml index 0b74705b3d..d42e202bab 100644 --- a/rust/utils/run-locally/Cargo.toml +++ b/rust/utils/run-locally/Cargo.toml @@ -23,3 +23,4 @@ which.workspace = true macro_rules_attribute.workspace = true regex.workspace = true hyperlane-core = { path = "../../hyperlane-core" } +hpl-interface.workspace = true From 13c06143ed316bdbdae1387796100fe7d5f112dc Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Fri, 18 Aug 2023 05:04:53 +0000 Subject: [PATCH 027/142] feat: link wip --- rust/Cargo.lock | 2 + rust/Cargo.toml | 1 + rust/utils/run-locally/Cargo.toml | 2 + rust/utils/run-locally/src/cosmos/cli.rs | 63 +++++-- rust/utils/run-locally/src/cosmos/crypto.rs | 6 + rust/utils/run-locally/src/cosmos/deploy.rs | 138 ++++++++++++++ rust/utils/run-locally/src/cosmos/link.rs | 45 +++++ rust/utils/run-locally/src/cosmos/mod.rs | 188 +++++++++++++------- rust/utils/run-locally/src/cosmos/types.rs | 21 +++ 9 files changed, 391 insertions(+), 75 deletions(-) create mode 100644 rust/utils/run-locally/src/cosmos/crypto.rs create mode 100644 rust/utils/run-locally/src/cosmos/deploy.rs create mode 100644 rust/utils/run-locally/src/cosmos/link.rs diff --git a/rust/Cargo.lock b/rust/Cargo.lock index d37612b3a7..9843a93ada 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -6996,8 +6996,10 @@ version = "0.1.0" dependencies = [ "ctrlc", "eyre", + "hex 0.4.3", "hpl-interface", "hyperlane-core", + "k256 0.13.1", "macro_rules_attribute", "maplit", "nix 0.27.1", diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 369b125807..91583e77a7 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -88,6 +88,7 @@ generic-array = { version = "1.0", features = ["serde", "more_lengths"] } getrandom = { version = "0.2", features = ["js"] } # Required for WASM support https://docs.rs/getrandom/latest/getrandom/#webassembly-support itertools = "0.11.0" jsonrpc-core = "18.0" +k256 = { version = "0.13.1", features = ["std", "ecdsa"] } log = "0.4" macro_rules_attribute = "0.2" maplit = "1.0" diff --git a/rust/utils/run-locally/Cargo.toml b/rust/utils/run-locally/Cargo.toml index d42e202bab..9d9e77830f 100644 --- a/rust/utils/run-locally/Cargo.toml +++ b/rust/utils/run-locally/Cargo.toml @@ -11,8 +11,10 @@ version.workspace = true [dependencies] toml_edit.workspace = true +k256.workspace = true serde.workspace = true serde_json.workspace = true +hex.workspace = true ctrlc.workspace = true eyre.workspace = true maplit.workspace = true diff --git a/rust/utils/run-locally/src/cosmos/cli.rs b/rust/utils/run-locally/src/cosmos/cli.rs index f612f2845b..b3607db044 100644 --- a/rust/utils/run-locally/src/cosmos/cli.rs +++ b/rust/utils/run-locally/src/cosmos/cli.rs @@ -1,4 +1,11 @@ -use std::{collections::BTreeMap, io::Write, path::PathBuf, process::Stdio}; +use std::{ + collections::BTreeMap, + io::{BufRead, BufReader, Write}, + path::PathBuf, + process::Stdio, +}; + +use k256::ecdsa::SigningKey; use crate::{ program::Program, @@ -6,12 +13,12 @@ use crate::{ }; use super::{ - modify_toml, sed, wait_for_node, KEY_ACCOUNTS1, KEY_ACCOUNTS2, KEY_ACCOUNTS3, KEY_VALIDATOR, - {Coin, TxResponse}, + crypto::KeyPair, default_keys, modify_toml, sed, wait_for_node, Codes, Coin, TxResponse, }; const GENESIS_FUND: u128 = 1000000000000; +#[derive(Clone)] pub struct OsmosisEndpoint { pub addr: String, pub rpc_addr: String, @@ -145,6 +152,7 @@ impl OsmosisCLI { .arg("rpc.laddr", &endpoint.rpc_addr) // default is tcp://0.0.0.0:26657 .arg("grpc.address", &endpoint.grpc_addr) // default is 0.0.0.0:9090 .arg("rpc.pprof_laddr", pprof_addr) // default is localhost:6060 + .arg("log_level", "panic") .spawn("COSMOS"); endpoint.wait_for_node(); @@ -157,7 +165,7 @@ impl OsmosisCLI { endpoint: &OsmosisEndpoint, sender: &str, codes: BTreeMap, - ) -> BTreeMap { + ) -> Codes { let mut ret = BTreeMap::::new(); for (name, code) in codes { @@ -188,7 +196,7 @@ impl OsmosisCLI { ret.insert(name, code_id); } - ret + serde_json::from_str(&serde_json::to_string(&ret).unwrap()).unwrap() } pub fn wasm_init( @@ -223,7 +231,11 @@ impl OsmosisCLI { serde_json::from_str(cmd.run_with_output().join().first().unwrap()).unwrap(); let init_log = wasm_init_resp.logs.first().unwrap(); - let init_evt = init_log.events.iter().find(|v| v.typ == "reply").unwrap(); + let init_evt = init_log + .events + .iter() + .find(|v| v.typ == "instantiate") + .unwrap(); let contract_addr = &init_evt .attributes @@ -255,7 +267,7 @@ impl OsmosisCLI { cmd = self.add_gas(cmd); cmd = endpoint.add_rpc(cmd); - if funds.len() > 0 { + if !funds.is_empty() { cmd = cmd.arg( "amount", funds @@ -294,7 +306,7 @@ impl OsmosisCLI { } fn add_genesis_accs(&self) { - for name in [("validator"), ("account1"), ("account2"), ("account3")] { + for name in default_keys().into_iter().map(|(name, _)| name) { self.cli() .cmd("add-genesis-account") .cmd(self.get_addr(name)) @@ -305,12 +317,7 @@ impl OsmosisCLI { } fn add_default_keys(&self) { - for (name, mnemonic) in [ - ("validator", KEY_VALIDATOR), - ("account1", KEY_ACCOUNTS1), - ("account2", KEY_ACCOUNTS2), - ("account3", KEY_ACCOUNTS3), - ] { + for (name, mnemonic) in default_keys() { self.add_key(name, mnemonic); } } @@ -346,7 +353,33 @@ impl OsmosisCLI { .cmd(name) .run_with_output() .join(); - println!("{:?}", out); out.first().unwrap().clone() } + + pub fn get_keypair(&self, name: &str) -> KeyPair { + let cmd = self + .cli() + .cmd("keys") + .cmd("export") + .cmd(name) + .flag("unarmored-hex") + .flag("unsafe"); + + let mut proc = cmd + .create_command() + .stderr(Stdio::piped()) + .stdout(Stdio::piped()) + .spawn() + .unwrap(); + + proc.stdin.as_mut().unwrap().write_all(b"y\n").unwrap(); + let proc_output = proc.wait_with_output().unwrap(); + + let proc_output_str = String::from_utf8_lossy(&proc_output.stderr).to_string(); + + let priv_key = SigningKey::from_slice(&hex::decode(proc_output_str).unwrap()).unwrap(); + let pub_key = *priv_key.verifying_key(); + + KeyPair { priv_key, pub_key } + } } diff --git a/rust/utils/run-locally/src/cosmos/crypto.rs b/rust/utils/run-locally/src/cosmos/crypto.rs new file mode 100644 index 0000000000..c34fe5e1ed --- /dev/null +++ b/rust/utils/run-locally/src/cosmos/crypto.rs @@ -0,0 +1,6 @@ +use k256::ecdsa::{SigningKey, VerifyingKey}; + +pub struct KeyPair { + pub priv_key: SigningKey, + pub pub_key: VerifyingKey, +} diff --git a/rust/utils/run-locally/src/cosmos/deploy.rs b/rust/utils/run-locally/src/cosmos/deploy.rs new file mode 100644 index 0000000000..2dce109a0e --- /dev/null +++ b/rust/utils/run-locally/src/cosmos/deploy.rs @@ -0,0 +1,138 @@ +use hpl_interface::{hub, igp_core, igp_gas_oracle, ism, va}; +use macro_rules_attribute::apply; + +use crate::utils::as_task; + +use super::{ + cli::{OsmosisCLI, OsmosisEndpoint}, + types::{Codes, Deployments}, +}; + +fn deploy_hub_mailbox( + cli: &OsmosisCLI, + endpoint: &OsmosisEndpoint, + (deployer, deployer_addr): (&str, &str), // (name, addr) + hub_code_id: u64, + mailbox_code_id: u64, + default_ism: &str, + origin_domain: u32, +) -> (String, String) { + // deploy hub + let hub = cli.wasm_init( + endpoint, + deployer, + Some(deployer_addr), + hub_code_id, + hub::InstantiateMsg { + origin_domain, + mailbox_code: mailbox_code_id, + }, + "hpl_hub", + ); + + let init_resp = cli.wasm_execute( + endpoint, + deployer, + &hub, + hub::ExecuteMsg::Instantiate { + owner: deployer_addr.to_string(), + default_ism: default_ism.to_string(), + }, + vec![], + ); + + let init_log = init_resp.logs.first().unwrap(); + let init_evt = init_log + .events + .iter() + .find(|v| v.typ == "wasm-mailbox_instantiated") + .unwrap(); + + let mailbox_addr = &init_evt + .attributes + .iter() + .find(|v| v.key == "_contract_address") + .unwrap() + .value; + + (hub, mailbox_addr.clone()) +} + +#[apply(as_task)] +pub fn deploy_cw_hyperlane( + cli: OsmosisCLI, + endpoint: OsmosisEndpoint, + deployer: String, + codes: Codes, + domain: u32, +) -> Deployments { + let deployer_addr = &cli.get_addr(&deployer); + + // deploy igp set + let igp = cli.wasm_init( + &endpoint, + &deployer, + Some(deployer_addr), + codes.hpl_igp_core, + igp_core::InstantiateMsg { + owner: deployer_addr.clone(), + gas_token: "uosmo".to_string(), + beneficiary: deployer_addr.clone(), + }, + "hpl_igp_core", + ); + + let igp_oracle = cli.wasm_init( + &endpoint, + &deployer, + Some(deployer_addr), + codes.hpl_igp_gas_oracle, + igp_gas_oracle::InstantiateMsg {}, + "hpl_igp_gas_oracle", + ); + + // deploy ism - routing ism with empty routes + let default_ism = cli.wasm_init( + &endpoint, + &deployer, + Some(deployer_addr), + codes.hpl_ism_routing, + ism::routing::InstantiateMsg { + owner: deployer_addr.clone(), + isms: vec![], + }, + "hpl_routing_ism", + ); + + let (hub, mailbox) = deploy_hub_mailbox( + &cli, + &endpoint, + (&deployer, deployer_addr), + codes.hpl_hub, + codes.hpl_mailbox, + &default_ism, + domain, + ); + + // deploy va + let va = cli.wasm_init( + &endpoint, + &deployer, + Some(deployer_addr), + codes.hpl_validator_announce, + va::InstantiateMsg { + addr_prefix: "osmo".to_string(), + mailbox: mailbox.to_string(), + local_domain: domain, + }, + "hpl_validator_announce", + ); + + Deployments { + igp, + igp_oracle, + hub, + mailbox, + va, + } +} diff --git a/rust/utils/run-locally/src/cosmos/link.rs b/rust/utils/run-locally/src/cosmos/link.rs new file mode 100644 index 0000000000..9215c7b57b --- /dev/null +++ b/rust/utils/run-locally/src/cosmos/link.rs @@ -0,0 +1,45 @@ +use std::path::PathBuf; + +use hpl_interface::ism; + +use super::{CosmosNetwork, OsmosisCLI}; + +pub fn link_network( + bin: &PathBuf, + linker: &str, + validator: &str, + src: &CosmosNetwork, + dst: &CosmosNetwork, +) { + let src_cli = src.launch_resp.cli(bin); + let dst_cli = dst.launch_resp.cli(bin); + + let src_linker_addr = src_cli.get_addr(linker); + let dst_linker_addr = dst_cli.get_addr(linker); + + let keypair = src_cli.get_keypair(validator); + + let src_to_dst_ism = src_cli.wasm_init( + &src.launch_resp.endpoint, + linker, + Some(&src_linker_addr), + src.launch_resp.codes.hpl_ism_multisig, + ism::multisig::InstantiateMsg { + owner: src_linker_addr.to_string(), + addr_prefix: "osmo".to_string(), + }, + &format!("[{} => {}]hpl-ism-multisig", src.domain, dst.domain), + ); + + let dst_to_src_ism = dst_cli.wasm_init( + &dst.launch_resp.endpoint, + linker, + Some(&dst_linker_addr), + dst.launch_resp.codes.hpl_ism_multisig, + ism::multisig::InstantiateMsg { + owner: dst_linker_addr.to_string(), + addr_prefix: "osmo".to_string(), + }, + &format!("[{} => {}]hpl-ism-multisig", dst.domain, src.domain), + ); +} diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index ed02fd9a2d..fb725214d1 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -1,15 +1,19 @@ use std::collections::BTreeMap; use std::fs; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; use macro_rules_attribute::apply; use tempfile::tempdir; mod cli; +mod crypto; +mod deploy; +mod link; mod rpc; mod types; mod utils; +use crypto::*; use rpc::*; use types::*; use utils::*; @@ -18,13 +22,29 @@ use crate::logging::log; use crate::utils::{as_task, concat_path, AgentHandles, TaskHandle}; use cli::{OsmosisCLI, OsmosisEndpoint}; +use self::deploy::deploy_cw_hyperlane; + const OSMOSIS_CLI_GIT: &str = "https://github.com/osmosis-labs/osmosis"; const OSMOSIS_CLI_VERSION: &str = "16.1.1"; -const KEY_VALIDATOR: &str = "legend auto stand worry powder idle recall there wet ancient universe badge ability blame hidden body steak april boost thrive room piece city type"; -const KEY_ACCOUNTS1: &str = "stomach employ hidden risk fork parent dream noodle inside banner stable private grain nothing absent brave metal math hybrid amused move affair move muffin"; -const KEY_ACCOUNTS2: &str = "say merry worry steak hedgehog sing spike fold empower pluck feel grass omit finish biology traffic dog sea ozone hint region service one gown"; -const KEY_ACCOUNTS3: &str = "maple often cargo polar eager jaguar eight inflict once nest nice swamp weasel address swift physical valid culture cheese trumpet find dinosaur curve tray"; +const KEY_HPL_VALIDATOR: (&str,&str) = ("hpl-validator", "guard evolve region sentence danger sort despair eye deputy brave trim actor left recipe debate document upgrade sustain bus cage afford half demand pigeon"); +const KEY_HPL_RELAYER: (&str,&str) = ("hpl-relayer", "moral item damp melt gloom vendor notice head assume balance doctor retire fashion trim find biology saddle undo switch fault cattle toast drip empty"); + +const KEY_VALIDATOR: (&str,&str) = ("validator", "legend auto stand worry powder idle recall there wet ancient universe badge ability blame hidden body steak april boost thrive room piece city type"); +const KEY_ACCOUNTS1: (&str,&str) = ("account1", "stomach employ hidden risk fork parent dream noodle inside banner stable private grain nothing absent brave metal math hybrid amused move affair move muffin"); +const KEY_ACCOUNTS2: (&str,&str) = ("account2", "say merry worry steak hedgehog sing spike fold empower pluck feel grass omit finish biology traffic dog sea ozone hint region service one gown"); +const KEY_ACCOUNTS3: (&str,&str) = ("account3", "maple often cargo polar eager jaguar eight inflict once nest nice swamp weasel address swift physical valid culture cheese trumpet find dinosaur curve tray"); + +fn default_keys<'a>() -> [(&'a str, &'a str); 6] { + [ + KEY_HPL_VALIDATOR, + KEY_HPL_RELAYER, + KEY_VALIDATOR, + KEY_ACCOUNTS1, + KEY_ACCOUNTS2, + KEY_ACCOUNTS3, + ] +} const CW_HYPERLANE_GIT: &str = "https://github.com/many-things/cw-hyperlane"; const CW_HYPERLANE_VERSION: &str = "0.0.1"; @@ -110,7 +130,7 @@ pub fn install_cosmos( } #[derive(Clone)] -struct CosmosConfig { +pub struct CosmosConfig { pub cli_path: PathBuf, pub home_path: Option, @@ -123,14 +143,35 @@ struct CosmosConfig { pub chain_id: String, } -struct CosmosResp { +pub struct CosmosResp { pub node: AgentHandles, pub endpoint: OsmosisEndpoint, - pub codes: BTreeMap, + pub codes: Codes, pub home_path: PathBuf, } -#[allow(dead_code)] +impl CosmosResp { + pub fn cli(&self, bin: &Path) -> OsmosisCLI { + OsmosisCLI::new(bin.to_path_buf(), self.home_path.to_str().unwrap()) + } +} + +pub struct CosmosNetwork { + pub launch_resp: CosmosResp, + pub deployments: Deployments, + pub domain: u32, +} + +impl From<(CosmosResp, Deployments, u32)> for CosmosNetwork { + fn from(v: (CosmosResp, Deployments, u32)) -> Self { + Self { + launch_resp: v.0, + deployments: v.1, + domain: v.2, + } + } +} + #[apply(as_task)] fn launch_cosmos_validator(config: CosmosConfig) -> CosmosResp { let home_path = match config.home_path { @@ -141,6 +182,7 @@ fn launch_cosmos_validator(config: CosmosConfig) -> CosmosResp { let cli = OsmosisCLI::new(config.cli_path, home_path.to_str().unwrap()); cli.init(&config.moniker, &config.chain_id); + let (node, endpoint) = cli.start(config.node_addr_base, config.node_port_base); let codes = cli.store_codes(&endpoint, "validator", config.codes); @@ -152,64 +194,90 @@ fn launch_cosmos_validator(config: CosmosConfig) -> CosmosResp { } } -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn test_run() { - let test_dir = tempdir().unwrap().into_path(); - let _ = fs::remove_dir_all(&test_dir); - - let test_cli_dir = concat_path(&test_dir, "cli"); - let test_codes_dir = concat_path(&test_dir, "codes"); - let test_node1_home = concat_path(&test_dir, "node1"); - let test_node2_home = concat_path(&test_dir, "node2"); - - for path in [ - &test_dir, - &test_cli_dir, - &test_codes_dir, - &test_node1_home, - &test_node2_home, - ] { - fs::create_dir_all(path).unwrap(); - } - - let (osmosisd, codes) = install_cosmos(Some(test_cli_dir), Some(test_codes_dir)); +#[allow(dead_code)] +fn run_locally() { + let (osmosisd, codes) = install_cosmos(None, None); - let addr_base = "tcp://0.0.0.0"; - let default_config = CosmosConfig { - cli_path: osmosisd.clone(), - home_path: None, + let addr_base = "tcp://0.0.0.0"; + let default_config = CosmosConfig { + cli_path: osmosisd.clone(), + home_path: None, - codes, + codes, - node_addr_base: addr_base.to_string(), - node_port_base: 26657, + node_addr_base: addr_base.to_string(), + node_port_base: 26657, - moniker: "localnet".to_string(), - chain_id: "local-node".to_string(), - }; + moniker: "localnet".to_string(), + chain_id: "local-node".to_string(), + }; - let launch_node1_res = launch_cosmos_validator(CosmosConfig { - home_path: Some(test_node1_home), - node_port_base: 26600, - chain_id: "local-node-1".to_string(), - ..default_config.clone() - }); + let port_start = 26600u32; + let domain_start = 26657u32; + let node_count = 1; + + let nodes = (0..node_count) + .map(|i| { + ( + launch_cosmos_validator(CosmosConfig { + node_port_base: port_start + (i * 10), + chain_id: format!("local-node-{}", i), + ..default_config.clone() + }), + domain_start + i, + ) + }) + .collect::>(); + + let deployer = "validator"; + + let nodes = nodes + .into_iter() + .map(|v| (v.0.join(), v.1)) + .map(|(launch_resp, domain)| { + let deployments = deploy_cw_hyperlane( + launch_resp.cli(&osmosisd), + launch_resp.endpoint.clone(), + deployer.to_string(), + launch_resp.codes.clone(), + domain, + ); + + (launch_resp, deployments, domain) + }) + .collect::>(); + + // nodes with base deployments + let nodes = nodes + .into_iter() + .map(|v| (v.0, v.1.join(), v.2)) + .map(|v| v.into()) + .collect::>(); + + for (i, node) in nodes.iter().enumerate() { + let targets = &nodes[(i + 1)..]; + + println!( + "{} -> {:?}", + node.domain, + targets.iter().map(|v| v.domain).collect::>() + ); + } - let launch_node2_res = launch_cosmos_validator(CosmosConfig { - home_path: Some(test_node2_home), - node_port_base: 26610, - chain_id: "local-node-2".to_string(), - ..default_config.clone() - }); + // for debug + println!( + "{}", + serde_json::to_string(&nodes.into_iter().map(|v| v.deployments).collect::>()) + .unwrap() + ); +} - let node1_run_res = launch_node1_res.join(); - let node2_run_res = launch_node2_res.join(); +#[cfg(test)] +mod test { + use super::*; - println!("node1 codes: {:?}", node1_run_res.codes); - println!("node2 codes: {:?}", node2_run_res.codes); + #[test] + fn test_run() { + run_locally() } } diff --git a/rust/utils/run-locally/src/cosmos/types.rs b/rust/utils/run-locally/src/cosmos/types.rs index eddb7fb65f..acd154b2a3 100644 --- a/rust/utils/run-locally/src/cosmos/types.rs +++ b/rust/utils/run-locally/src/cosmos/types.rs @@ -34,3 +34,24 @@ pub struct Coin { pub denom: String, pub amount: String, } + +#[derive(serde::Serialize, serde::Deserialize, Clone)] +pub struct Codes { + pub hpl_hub: u64, + pub hpl_igp_core: u64, + pub hpl_igp_gas_oracle: u64, + pub hpl_ism_multisig: u64, + pub hpl_ism_routing: u64, + pub hpl_mailbox: u64, + pub hpl_multicall: u64, + pub hpl_validator_announce: u64, +} + +#[derive(serde::Serialize, serde::Deserialize)] +pub struct Deployments { + pub igp: String, + pub igp_oracle: String, + pub hub: String, + pub mailbox: String, + pub va: String, +} From 912c2776004940d91315036d1acc4203430d54a6 Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Fri, 18 Aug 2023 06:02:15 +0000 Subject: [PATCH 028/142] feat: link --- rust/Cargo.lock | 2 + rust/utils/run-locally/Cargo.toml | 2 + rust/utils/run-locally/src/cosmos/cli.rs | 7 +- rust/utils/run-locally/src/cosmos/crypto.rs | 37 +++++++++ rust/utils/run-locally/src/cosmos/deploy.rs | 19 ++++- rust/utils/run-locally/src/cosmos/link.rs | 87 ++++++++++++++------- rust/utils/run-locally/src/cosmos/mod.rs | 34 ++++++-- rust/utils/run-locally/src/cosmos/types.rs | 4 +- 8 files changed, 149 insertions(+), 43 deletions(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 9843a93ada..a97d88fba2 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -7004,8 +7004,10 @@ dependencies = [ "maplit", "nix 0.27.1", "regex", + "ripemd", "serde", "serde_json", + "sha2 0.10.8", "tempfile", "toml_edit", "ureq", diff --git a/rust/utils/run-locally/Cargo.toml b/rust/utils/run-locally/Cargo.toml index 9d9e77830f..d5b45c2b7a 100644 --- a/rust/utils/run-locally/Cargo.toml +++ b/rust/utils/run-locally/Cargo.toml @@ -12,6 +12,8 @@ version.workspace = true [dependencies] toml_edit.workspace = true k256.workspace = true +ripemd.workspace = true +sha2.workspace = true serde.workspace = true serde_json.workspace = true hex.workspace = true diff --git a/rust/utils/run-locally/src/cosmos/cli.rs b/rust/utils/run-locally/src/cosmos/cli.rs index b3607db044..cf46d71cfd 100644 --- a/rust/utils/run-locally/src/cosmos/cli.rs +++ b/rust/utils/run-locally/src/cosmos/cli.rs @@ -8,6 +8,7 @@ use std::{ use k256::ecdsa::SigningKey; use crate::{ + logging::log, program::Program, utils::{concat_path, AgentHandles, TaskHandle}, }; @@ -368,16 +369,16 @@ impl OsmosisCLI { let mut proc = cmd .create_command() .stderr(Stdio::piped()) - .stdout(Stdio::piped()) + .stdin(Stdio::piped()) .spawn() .unwrap(); proc.stdin.as_mut().unwrap().write_all(b"y\n").unwrap(); let proc_output = proc.wait_with_output().unwrap(); - let proc_output_str = String::from_utf8_lossy(&proc_output.stderr).to_string(); - let priv_key = SigningKey::from_slice(&hex::decode(proc_output_str).unwrap()).unwrap(); + let priv_key = + SigningKey::from_slice(&hex::decode(proc_output_str.trim()).unwrap()).unwrap(); let pub_key = *priv_key.verifying_key(); KeyPair { priv_key, pub_key } diff --git a/rust/utils/run-locally/src/cosmos/crypto.rs b/rust/utils/run-locally/src/cosmos/crypto.rs index c34fe5e1ed..b583ee3b89 100644 --- a/rust/utils/run-locally/src/cosmos/crypto.rs +++ b/rust/utils/run-locally/src/cosmos/crypto.rs @@ -1,6 +1,43 @@ use k256::ecdsa::{SigningKey, VerifyingKey}; +use ripemd::Ripemd160; +use sha2::{Digest, Sha256}; + +pub fn sha256_digest(bz: impl AsRef<[u8]>) -> [u8; 32] { + let mut hasher = Sha256::new(); + + hasher.update(bz); + + hasher.finalize().as_slice().try_into().unwrap() +} + +pub fn ripemd160_digest(bz: impl AsRef<[u8]>) -> [u8; 20] { + let mut hasher = Ripemd160::new(); + + hasher.update(bz); + + hasher.finalize().as_slice().try_into().unwrap() +} + +pub fn pub_to_addr(pub_key: &[u8], prefix: &str) -> String { + let sha_hash = sha256_digest(pub_key); + let rip_hash = ripemd160_digest(sha_hash); + + let addr = hpl_interface::types::bech32_encode(prefix, &rip_hash).unwrap(); + + addr.to_string() +} pub struct KeyPair { pub priv_key: SigningKey, pub pub_key: VerifyingKey, } + +impl KeyPair { + pub fn pub_key_to_binary(&self) -> Vec { + self.pub_key.to_encoded_point(true).as_bytes().to_vec() + } + + pub fn addr(&self, hrp: &str) -> String { + pub_to_addr(&self.pub_key_to_binary(), hrp) + } +} diff --git a/rust/utils/run-locally/src/cosmos/deploy.rs b/rust/utils/run-locally/src/cosmos/deploy.rs index 2dce109a0e..f0e6637930 100644 --- a/rust/utils/run-locally/src/cosmos/deploy.rs +++ b/rust/utils/run-locally/src/cosmos/deploy.rs @@ -92,7 +92,7 @@ pub fn deploy_cw_hyperlane( ); // deploy ism - routing ism with empty routes - let default_ism = cli.wasm_init( + let ism_routing = cli.wasm_init( &endpoint, &deployer, Some(deployer_addr), @@ -104,13 +104,26 @@ pub fn deploy_cw_hyperlane( "hpl_routing_ism", ); + // deploy ism - multisig ism with no enrolled validators + let ism_multisig = cli.wasm_init( + &endpoint, + &deployer, + Some(deployer_addr), + codes.hpl_ism_multisig, + ism::multisig::InstantiateMsg { + owner: deployer_addr.clone(), + addr_prefix: "osmo".to_string(), + }, + "hpl_multisig_ism", + ); + let (hub, mailbox) = deploy_hub_mailbox( &cli, &endpoint, (&deployer, deployer_addr), codes.hpl_hub, codes.hpl_mailbox, - &default_ism, + &ism_routing, domain, ); @@ -131,6 +144,8 @@ pub fn deploy_cw_hyperlane( Deployments { igp, igp_oracle, + ism_routing, + ism_multisig, hub, mailbox, va, diff --git a/rust/utils/run-locally/src/cosmos/link.rs b/rust/utils/run-locally/src/cosmos/link.rs index 9215c7b57b..3e51d789c0 100644 --- a/rust/utils/run-locally/src/cosmos/link.rs +++ b/rust/utils/run-locally/src/cosmos/link.rs @@ -1,45 +1,74 @@ -use std::path::PathBuf; +use std::path::Path; use hpl_interface::ism; -use super::{CosmosNetwork, OsmosisCLI}; +use super::{cli::OsmosisCLI, crypto::KeyPair, CosmosNetwork}; -pub fn link_network( - bin: &PathBuf, +fn link_network( + cli: &OsmosisCLI, + network: &CosmosNetwork, + hrp: &str, linker: &str, - validator: &str, - src: &CosmosNetwork, - dst: &CosmosNetwork, + validator: &KeyPair, + target_domain: u32, ) { - let src_cli = src.launch_resp.cli(bin); - let dst_cli = dst.launch_resp.cli(bin); - - let src_linker_addr = src_cli.get_addr(linker); - let dst_linker_addr = dst_cli.get_addr(linker); + let validator_addr = validator.addr(hrp); + let validator_pubkey = validator.pub_key_to_binary(); - let keypair = src_cli.get_keypair(validator); + // link src chain + cli.wasm_execute( + &network.launch_resp.endpoint, + linker, + &network.deployments.ism_multisig, + ism::multisig::ExecuteMsg::EnrollValidator { + set: ism::multisig::ValidatorSet { + domain: target_domain, + validator: validator_addr.clone(), + validator_pubkey: validator_pubkey.clone().into(), + }, + }, + vec![], + ); - let src_to_dst_ism = src_cli.wasm_init( - &src.launch_resp.endpoint, + cli.wasm_execute( + &network.launch_resp.endpoint, linker, - Some(&src_linker_addr), - src.launch_resp.codes.hpl_ism_multisig, - ism::multisig::InstantiateMsg { - owner: src_linker_addr.to_string(), - addr_prefix: "osmo".to_string(), + &network.deployments.ism_multisig, + ism::multisig::ExecuteMsg::SetThreshold { + set: ism::multisig::ThresholdSet { + domain: target_domain, + threshold: 1, + }, }, - &format!("[{} => {}]hpl-ism-multisig", src.domain, dst.domain), + vec![], ); - let dst_to_src_ism = dst_cli.wasm_init( - &dst.launch_resp.endpoint, + cli.wasm_execute( + &network.launch_resp.endpoint, linker, - Some(&dst_linker_addr), - dst.launch_resp.codes.hpl_ism_multisig, - ism::multisig::InstantiateMsg { - owner: dst_linker_addr.to_string(), - addr_prefix: "osmo".to_string(), + &network.deployments.ism_routing, + ism::routing::ExecuteMsg::Set { + ism: ism::routing::ISMSet { + domain: target_domain, + address: network.deployments.ism_multisig.clone(), + }, }, - &format!("[{} => {}]hpl-ism-multisig", dst.domain, src.domain), + vec![], ); } + +pub fn link_networks( + bin: &Path, + linker: &str, + validator: &str, + src: &CosmosNetwork, + dst: &CosmosNetwork, +) { + let src_cli = src.launch_resp.cli(bin); + let dst_cli = dst.launch_resp.cli(bin); + + let keypair = src_cli.get_keypair(validator); + + link_network(&src_cli, src, "osmo", linker, &keypair, dst.domain); + link_network(&dst_cli, dst, "osmo", linker, &keypair, src.domain); +} diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index fb725214d1..d4175bf9ab 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -18,6 +18,7 @@ use rpc::*; use types::*; use utils::*; +use crate::cosmos::link::link_networks; use crate::logging::log; use crate::utils::{as_task, concat_path, AgentHandles, TaskHandle}; use cli::{OsmosisCLI, OsmosisEndpoint}; @@ -214,7 +215,7 @@ fn run_locally() { let port_start = 26600u32; let domain_start = 26657u32; - let node_count = 1; + let node_count = 2; let nodes = (0..node_count) .map(|i| { @@ -230,6 +231,8 @@ fn run_locally() { .collect::>(); let deployer = "validator"; + let linker = "validator"; + let validator = "hpl-validator"; let nodes = nodes .into_iter() @@ -257,19 +260,34 @@ fn run_locally() { for (i, node) in nodes.iter().enumerate() { let targets = &nodes[(i + 1)..]; - println!( - "{} -> {:?}", - node.domain, - targets.iter().map(|v| v.domain).collect::>() - ); + if !targets.is_empty() { + println!( + "{} -> {:?}", + node.domain, + targets.iter().map(|v| v.domain).collect::>() + ); + } + + for target in targets { + link_networks(&osmosisd, linker, validator, node, target); + } } // for debug println!( "{}", - serde_json::to_string(&nodes.into_iter().map(|v| v.deployments).collect::>()) - .unwrap() + serde_json::to_string( + &nodes + .iter() + .map(|v| (v.domain, v.deployments.clone())) + .collect::>() + ) + .unwrap() ); + + for mut node in nodes { + let _ = node.launch_resp.node.1.kill(); + } } #[cfg(test)] diff --git a/rust/utils/run-locally/src/cosmos/types.rs b/rust/utils/run-locally/src/cosmos/types.rs index acd154b2a3..89ff75c2b9 100644 --- a/rust/utils/run-locally/src/cosmos/types.rs +++ b/rust/utils/run-locally/src/cosmos/types.rs @@ -47,10 +47,12 @@ pub struct Codes { pub hpl_validator_announce: u64, } -#[derive(serde::Serialize, serde::Deserialize)] +#[derive(serde::Serialize, serde::Deserialize, Clone)] pub struct Deployments { pub igp: String, pub igp_oracle: String, + pub ism_routing: String, + pub ism_multisig: String, pub hub: String, pub mailbox: String, pub va: String, From 7660aec9d31a2c0d0408d92d6120aa0cfd8762ea Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Fri, 18 Aug 2023 06:17:49 +0000 Subject: [PATCH 029/142] chore: cleanup --- rust/utils/run-locally/src/cosmos/cli.rs | 9 ++------- rust/utils/run-locally/src/cosmos/mod.rs | 1 - 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/rust/utils/run-locally/src/cosmos/cli.rs b/rust/utils/run-locally/src/cosmos/cli.rs index cf46d71cfd..23f583d75a 100644 --- a/rust/utils/run-locally/src/cosmos/cli.rs +++ b/rust/utils/run-locally/src/cosmos/cli.rs @@ -1,14 +1,8 @@ -use std::{ - collections::BTreeMap, - io::{BufRead, BufReader, Write}, - path::PathBuf, - process::Stdio, -}; +use std::{collections::BTreeMap, io::Write, path::PathBuf, process::Stdio}; use k256::ecdsa::SigningKey; use crate::{ - logging::log, program::Program, utils::{concat_path, AgentHandles, TaskHandle}, }; @@ -284,6 +278,7 @@ impl OsmosisCLI { output.unwrap() } + #[allow(dead_code)] pub fn wasm_query( &self, endpoint: &OsmosisEndpoint, diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index d4175bf9ab..c3880b02ba 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -13,7 +13,6 @@ mod rpc; mod types; mod utils; -use crypto::*; use rpc::*; use types::*; use utils::*; From 1e70862660369650093dd51bde314456d883bc65 Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Fri, 18 Aug 2023 08:03:02 +0000 Subject: [PATCH 030/142] feat: bump cw-hpl v0.0.2 & kill child while dropping --- rust/utils/run-locally/src/cosmos/mod.rs | 17 ++++++++++++----- rust/utils/run-locally/src/cosmos/types.rs | 2 ++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index c3880b02ba..4c78f89ee9 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -19,7 +19,7 @@ use utils::*; use crate::cosmos::link::link_networks; use crate::logging::log; -use crate::utils::{as_task, concat_path, AgentHandles, TaskHandle}; +use crate::utils::{as_task, concat_path, stop_child, AgentHandles, TaskHandle}; use cli::{OsmosisCLI, OsmosisEndpoint}; use self::deploy::deploy_cw_hyperlane; @@ -47,7 +47,7 @@ fn default_keys<'a>() -> [(&'a str, &'a str); 6] { } const CW_HYPERLANE_GIT: &str = "https://github.com/many-things/cw-hyperlane"; -const CW_HYPERLANE_VERSION: &str = "0.0.1"; +const CW_HYPERLANE_VERSION: &str = "0.0.2"; fn make_target() -> String { let os = if cfg!(target_os = "linux") { @@ -100,7 +100,8 @@ pub fn install_codes(dir: Option) -> BTreeMap { let release_comp = format!("{release_name}.tar.gz"); log!("Downloading cw-hyperlane v{}", CW_HYPERLANE_VERSION); - let uri = format!("{CW_HYPERLANE_GIT}/releases/download/{CW_HYPERLANE_VERSION}/{release_comp}"); + let uri = + format!("{CW_HYPERLANE_GIT}/releases/download/v{CW_HYPERLANE_VERSION}/{release_comp}"); download(&release_comp, &uri, dir_path); log!("Uncompressing cw-hyperlane release"); @@ -162,6 +163,12 @@ pub struct CosmosNetwork { pub domain: u32, } +impl Drop for CosmosNetwork { + fn drop(&mut self) { + stop_child(&mut self.launch_resp.node.1); + } +} + impl From<(CosmosResp, Deployments, u32)> for CosmosNetwork { fn from(v: (CosmosResp, Deployments, u32)) -> Self { Self { @@ -173,7 +180,7 @@ impl From<(CosmosResp, Deployments, u32)> for CosmosNetwork { } #[apply(as_task)] -fn launch_cosmos_validator(config: CosmosConfig) -> CosmosResp { +fn launch_cosmos_node(config: CosmosConfig) -> CosmosResp { let home_path = match config.home_path { Some(v) => v, None => tempdir().unwrap().into_path(), @@ -219,7 +226,7 @@ fn run_locally() { let nodes = (0..node_count) .map(|i| { ( - launch_cosmos_validator(CosmosConfig { + launch_cosmos_node(CosmosConfig { node_port_base: port_start + (i * 10), chain_id: format!("local-node-{}", i), ..default_config.clone() diff --git a/rust/utils/run-locally/src/cosmos/types.rs b/rust/utils/run-locally/src/cosmos/types.rs index 89ff75c2b9..2e611301ff 100644 --- a/rust/utils/run-locally/src/cosmos/types.rs +++ b/rust/utils/run-locally/src/cosmos/types.rs @@ -42,6 +42,8 @@ pub struct Codes { pub hpl_igp_gas_oracle: u64, pub hpl_ism_multisig: u64, pub hpl_ism_routing: u64, + pub hpl_token_cw20: u64, + pub hpl_token_native: u64, pub hpl_mailbox: u64, pub hpl_multicall: u64, pub hpl_validator_announce: u64, From eb3a51a4fa232c9400b45ecfbb3b656aede6d4f7 Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Fri, 18 Aug 2023 10:45:29 +0000 Subject: [PATCH 031/142] wip: validator / relayer --- rust/config/cosmos_config.json | 81 ++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 27 deletions(-) diff --git a/rust/config/cosmos_config.json b/rust/config/cosmos_config.json index eeb7709a21..965bd03264 100644 --- a/rust/config/cosmos_config.json +++ b/rust/config/cosmos_config.json @@ -1,29 +1,56 @@ { - "chains": { - "mitosisgoerli": { - "name": "mitosisgoerli", - "domain": 26657, - "addresses": { - "mailbox": "0xF10238ba7f58B15F5FAAF32f370D55c65beeF2BE", - "interchainGasPaymaster": "0x30CEF6c8E8FbBA11D8a9Ba552eb0870AAa5747cc", - "validatorAnnounce": "0x6C4344110BA24eD5F2F98BFA3A6Fc045b1a702eC" - }, - "protocol": "ethereum", - "finalityBlocks": 1, - "index": { - "from": 3244 - } - }, - "osmosistestnet": { - "name": "osmosistestnet", - "domain": 21295, - "addresses": { - "mailbox": "0xbbef451fd60c0bdcdf2b410e20ca788e2366a06837b6fb22e071bca11b3e7194", - "interchainGasPaymaster": "0x3e42b0dc5f37381544fe4c5dfcba7a38443adb3d98b59d7a655cc6b7643e6dc1", - "validatorAnnounce": "0x883ee377c9a17a7434906338b81ba510408a34c98e7843a86b219d430f33e80a" - }, - "protocol": "cosmos", - "finalityBlocks": 1 - } + "chains": { + "cosmostest1": { + "name": "cosmostest1", + "domain": 2660, + "addresses": { + "mailbox": "0xc6f76a4bd3b31f4307f11d019c0ad01f29c9140ca03b9e50fcc0e08b20d5bce1", + "interchainGasPaymaster": "0xfccb93acc5b25b40d5cc723e6a9a32284ed9a55646f48bf2970e237bf15c3be5", + "validatorAnnounce": "0xc387032a0e3bbb29327c824d40c9bf446e0f9aa99937c23e5b18c3938373915f" + }, + "protocol": "cosmos", + "finalityBlocks": 1, + "connection": { + "rpc_url": "https://rpc.osmotest5.osmosis.zone", + "grpc_url": "https://osmosis-testnet-grpc.polkachu.com:12590", + "chain_id": "osmo-test-5", + "prefix": "osmo" + }, + "signer": { + "type": "cosmosKey", + "key": "984e39bb0d8974432114adcfcbe99d5984e8ac052fa3bb6059f5a77a88ef9912", + "prefix": "osmo" + }, + "index": { + "from": 2208944, + "chunk": 10 + } + }, + "cosmostest2": { + "name": "cosmostest2", + "domain": 21295, + "addresses": { + "mailbox": "0xc6f76a4bd3b31f4307f11d019c0ad01f29c9140ca03b9e50fcc0e08b20d5bce1", + "interchainGasPaymaster": "0xfccb93acc5b25b40d5cc723e6a9a32284ed9a55646f48bf2970e237bf15c3be5", + "validatorAnnounce": "0xc387032a0e3bbb29327c824d40c9bf446e0f9aa99937c23e5b18c3938373915f" + }, + "protocol": "cosmos", + "finalityBlocks": 1, + "connection": { + "rpc_url": "https://rpc.osmotest5.osmosis.zone", + "grpc_url": "https://osmosis-testnet-grpc.polkachu.com:12590", + "chain_id": "osmo-test-5", + "prefix": "osmo" + }, + "signer": { + "type": "cosmosKey", + "key": "984e39bb0d8974432114adcfcbe99d5984e8ac052fa3bb6059f5a77a88ef9912", + "prefix": "osmo" + }, + "index": { + "from": 2208944, + "chunk": 10 + } } -} \ No newline at end of file + } +} From 47177bf129a022688bd9dc6bf1c7de38ca739fba Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Fri, 18 Aug 2023 23:59:05 +0000 Subject: [PATCH 032/142] feat: spawn validator / relayer --- rust/utils/run-locally/src/cosmos/mod.rs | 123 +++++++++++++++++++-- rust/utils/run-locally/src/cosmos/types.rs | 93 ++++++++++++++++ 2 files changed, 207 insertions(+), 9 deletions(-) diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index 4c78f89ee9..d250d95431 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -1,7 +1,10 @@ use std::collections::BTreeMap; use std::fs; use std::path::{Path, PathBuf}; +use std::thread::sleep; +use std::time::Duration; +use hpl_interface::types::bech32_decode; use macro_rules_attribute::apply; use tempfile::tempdir; @@ -19,6 +22,7 @@ use utils::*; use crate::cosmos::link::link_networks; use crate::logging::log; +use crate::program::Program; use crate::utils::{as_task, concat_path, stop_child, AgentHandles, TaskHandle}; use cli::{OsmosisCLI, OsmosisEndpoint}; @@ -160,6 +164,7 @@ impl CosmosResp { pub struct CosmosNetwork { pub launch_resp: CosmosResp, pub deployments: Deployments, + pub chain_id: String, pub domain: u32, } @@ -169,12 +174,13 @@ impl Drop for CosmosNetwork { } } -impl From<(CosmosResp, Deployments, u32)> for CosmosNetwork { - fn from(v: (CosmosResp, Deployments, u32)) -> Self { +impl From<(CosmosResp, Deployments, String, u32)> for CosmosNetwork { + fn from(v: (CosmosResp, Deployments, String, u32)) -> Self { Self { launch_resp: v.0, deployments: v.1, - domain: v.2, + chain_id: v.2, + domain: v.3, } } } @@ -201,6 +207,59 @@ fn launch_cosmos_node(config: CosmosConfig) -> CosmosResp { } } +#[apply(as_task)] +fn launch_cosmos_validator( + agent_config: AgentConfig, + agent_config_path: PathBuf, + remotes: Vec, +) -> AgentHandles { + let validator_base = tempdir().unwrap(); + let validator_base_db = concat_path(&validator_base, "db"); + + let checkpoint_path = concat_path(&validator_base, "checkpoint"); + let signature_path = concat_path(&validator_base, "signature"); + + let validator = Program::new("cargo") + .cmd("run") + .arg("bin", "validator") + .env("CONFIG_FILES", agent_config_path.to_str().unwrap()) + .env( + "MY_VALIDATOR_SIGNATURE_DIRECTORY", + signature_path.to_str().unwrap(), + ) + .env("RUST_BACKTRACE", "1") + .hyp_env("CHECKPOINTSYNCER_PATH", checkpoint_path.to_str().unwrap()) + .hyp_env("CHECKPOINTSYNCER_TYPE", "localStorage") + .hyp_env("ORIGINCHAINNAME", agent_config.name) + .hyp_env("RELAYCHAINS", remotes.join(",")) + .hyp_env("REORGPERIOD", "1") + .hyp_env("VALIDATOR_KEY", agent_config.signer.key) + .hyp_env("VALIDATOR_TYPE", agent_config.signer.typ) + .hyp_env("DB", validator_base_db.to_str().unwrap()) + .hyp_env("VALIDATOR_PREFIX", "osmo1") + .spawn("VAL"); + + validator +} + +#[apply(as_task)] +fn launch_cosmos_relayer(agent_config_path: PathBuf, relay_chains: Vec) -> AgentHandles { + let relayer_base = tempdir().unwrap(); + let relayer_base_db = concat_path(&relayer_base, "db"); + + let relayer = Program::new("cargo") + .cmd("run") + .arg("--bin", "relayer") + .env("CONFIG_FILES", agent_config_path.to_str().unwrap()) + .env("RUST_BACKTRACE", "1") + .hyp_env("RELAYCHAINS", relay_chains.join(",")) + .hyp_env("REORGPERIOD", "1") + .hyp_env("DB", relayer_base_db.to_str().unwrap()) + .spawn("RLY"); + + relayer +} + #[allow(dead_code)] fn run_locally() { let (osmosisd, codes) = install_cosmos(None, None); @@ -231,6 +290,7 @@ fn run_locally() { chain_id: format!("local-node-{}", i), ..default_config.clone() }), + format!("local-node-{}", i), domain_start + i, ) }) @@ -239,11 +299,12 @@ fn run_locally() { let deployer = "validator"; let linker = "validator"; let validator = "hpl-validator"; + let relayer = "hpl-relayer"; let nodes = nodes .into_iter() - .map(|v| (v.0.join(), v.1)) - .map(|(launch_resp, domain)| { + .map(|v| (v.0.join(), v.1, v.2)) + .map(|(launch_resp, chain_id, domain)| { let deployments = deploy_cw_hyperlane( launch_resp.cli(&osmosisd), launch_resp.endpoint.clone(), @@ -252,14 +313,14 @@ fn run_locally() { domain, ); - (launch_resp, deployments, domain) + (launch_resp, deployments, chain_id, domain) }) .collect::>(); // nodes with base deployments let nodes = nodes .into_iter() - .map(|v| (v.0, v.1.join(), v.2)) + .map(|v| (v.0, v.1.join(), v.2, v.3)) .map(|v| v.into()) .collect::>(); @@ -291,9 +352,53 @@ fn run_locally() { .unwrap() ); - for mut node in nodes { - let _ = node.launch_resp.node.1.kill(); + let config_dir = tempdir().unwrap(); + + // export agent config + let agent_config_out = AgentConfigOut { + chains: nodes + .iter() + .map(|v| { + ( + v.chain_id.to_string(), + AgentConfig::new(osmosisd.clone(), validator, v), + ) + }) + .collect::>(), + }; + + let agent_config_path = concat_path(&config_dir, "config.json"); + fs::write( + &agent_config_path, + serde_json::to_string_pretty(&agent_config_out).unwrap(), + ) + .unwrap(); + + let hpl_val = agent_config_out + .chains + .clone() + .into_iter() + .map(|(chain_id, agent_config)| { + let mut others = agent_config_out.chains.clone(); + others.remove(&chain_id); + let remotes = others.into_iter().map(|v| v.0).collect::>(); + + launch_cosmos_validator(agent_config, agent_config_path.clone(), remotes) + }) + .collect::>(); + let hpl_val = hpl_val.into_iter().map(|v| v.join()).collect::>(); + let mut hpl_rly = launch_cosmos_relayer( + agent_config_path, + agent_config_out.chains.into_keys().collect::>(), + ) + .join(); + + sleep(Duration::from_secs(30)); + + for mut node in hpl_val { + node.1.kill().unwrap(); } + hpl_rly.1.kill().unwrap(); } #[cfg(test)] diff --git a/rust/utils/run-locally/src/cosmos/types.rs b/rust/utils/run-locally/src/cosmos/types.rs index 2e611301ff..a0c05c39cf 100644 --- a/rust/utils/run-locally/src/cosmos/types.rs +++ b/rust/utils/run-locally/src/cosmos/types.rs @@ -1,3 +1,9 @@ +use std::{collections::BTreeMap, path::PathBuf}; + +use hpl_interface::types::bech32_decode; + +use super::{cli::OsmosisCLI, CosmosNetwork}; + #[derive(serde::Serialize, serde::Deserialize)] pub struct TxEventAttr { pub key: String, @@ -59,3 +65,90 @@ pub struct Deployments { pub mailbox: String, pub va: String, } + +#[derive(serde::Serialize, serde::Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +pub struct AgentConfigAddrs { + pub mailbox: String, + pub interchain_gas_paymaster: String, + pub validator_announce: String, +} + +#[derive(serde::Serialize, serde::Deserialize, Clone)] +pub struct AgentConfigConn { + pub rpc_url: String, + pub grpc_url: String, + pub chain_id: String, + pub prefix: String, +} + +#[derive(serde::Serialize, serde::Deserialize, Clone)] +pub struct AgentConfigSigner { + #[serde(rename = "type")] + pub typ: String, + pub key: String, + pub prefix: String, +} + +#[derive(serde::Serialize, serde::Deserialize, Clone)] +pub struct AgentConfigIndex { + pub from: u32, + pub chunk: u32, +} + +#[derive(serde::Serialize, serde::Deserialize, Clone)] +pub struct AgentConfig { + pub name: String, + pub domain: u32, + pub addresses: AgentConfigAddrs, + pub protocol: String, + pub finality_blocks: u32, + pub connection: AgentConfigConn, + pub signer: AgentConfigSigner, + pub index: AgentConfigIndex, +} + +#[derive(serde::Serialize, serde::Deserialize, Clone)] +pub struct AgentConfigOut { + pub chains: BTreeMap, +} + +fn to_hex_addr(addr: &str) -> String { + format!("0x{}", hex::encode(bech32_decode(addr).unwrap())) +} + +impl AgentConfig { + pub fn new(bin: PathBuf, validator: &str, network: &CosmosNetwork) -> Self { + let cli = OsmosisCLI::new(bin, network.launch_resp.home_path.to_str().unwrap()); + let validator = cli.get_keypair(validator); + + AgentConfig { + name: format!("cosmos-test-{}", network.domain), + domain: network.domain, + addresses: AgentConfigAddrs { + mailbox: to_hex_addr(&network.deployments.mailbox), + interchain_gas_paymaster: to_hex_addr(&network.deployments.igp), + validator_announce: to_hex_addr(&network.deployments.va), + }, + protocol: "cosmos".to_string(), + finality_blocks: 1, + connection: AgentConfigConn { + rpc_url: network + .launch_resp + .endpoint + .rpc_addr + .to_string() + .replace("tcp", "http"), + grpc_url: format!("http://{}", network.launch_resp.endpoint.grpc_addr), + chain_id: network.chain_id.to_string(), + prefix: "osmo".to_string(), + }, + signer: AgentConfigSigner { + typ: "cosmosKey".to_string(), + key: hex::encode(validator.priv_key.to_bytes()), + prefix: "osmo".to_string(), + }, + index: AgentConfigIndex { from: 0, chunk: 10 }, + } + } +} From f73a09d31d07786d60ab3a311d27312a80e7449e Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Sun, 20 Aug 2023 02:00:02 +0000 Subject: [PATCH 033/142] fix: change binary to agent_config --- rust/utils/run-locally/src/cosmos/mod.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index d250d95431..e280f186ca 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -24,6 +24,7 @@ use crate::cosmos::link::link_networks; use crate::logging::log; use crate::program::Program; use crate::utils::{as_task, concat_path, stop_child, AgentHandles, TaskHandle}; +use crate::AGENT_BIN_PATH; use cli::{OsmosisCLI, OsmosisEndpoint}; use self::deploy::deploy_cw_hyperlane; @@ -219,9 +220,8 @@ fn launch_cosmos_validator( let checkpoint_path = concat_path(&validator_base, "checkpoint"); let signature_path = concat_path(&validator_base, "signature"); - let validator = Program::new("cargo") - .cmd("run") - .arg("bin", "validator") + let validator = Program::default() + .bin(concat_path(format!("../../{AGENT_BIN_PATH}"), "validator")) .env("CONFIG_FILES", agent_config_path.to_str().unwrap()) .env( "MY_VALIDATOR_SIGNATURE_DIRECTORY", @@ -247,9 +247,8 @@ fn launch_cosmos_relayer(agent_config_path: PathBuf, relay_chains: Vec) let relayer_base = tempdir().unwrap(); let relayer_base_db = concat_path(&relayer_base, "db"); - let relayer = Program::new("cargo") - .cmd("run") - .arg("--bin", "relayer") + let relayer = Program::default() + .bin(concat_path(format!("../../{AGENT_BIN_PATH}"), "relayer")) .env("CONFIG_FILES", agent_config_path.to_str().unwrap()) .env("RUST_BACKTRACE", "1") .hyp_env("RELAYCHAINS", relay_chains.join(",")) From df8382297015234434b3731ac3299642e3021de7 Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Sun, 20 Aug 2023 02:16:08 +0000 Subject: [PATCH 034/142] fix: chain_id --- rust/utils/run-locally/src/cosmos/link.rs | 15 ++++++++++++++- rust/utils/run-locally/src/cosmos/mod.rs | 8 +++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/rust/utils/run-locally/src/cosmos/link.rs b/rust/utils/run-locally/src/cosmos/link.rs index 3e51d789c0..b42ca77fdb 100644 --- a/rust/utils/run-locally/src/cosmos/link.rs +++ b/rust/utils/run-locally/src/cosmos/link.rs @@ -1,6 +1,6 @@ use std::path::Path; -use hpl_interface::ism; +use hpl_interface::{ism, va}; use super::{cli::OsmosisCLI, crypto::KeyPair, CosmosNetwork}; @@ -55,6 +55,19 @@ fn link_network( }, vec![], ); + + // TODO + // cli.wasm_execute( + // &network.launch_resp.endpoint, + // linker, + // &network.deployments.va, + // va::ExecuteMsg::Announce { + // validator: (), + // storage_location: (), + // signature: (), + // }, + // vec![], + // ); } pub fn link_networks( diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index e280f186ca..488412e57a 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -4,7 +4,6 @@ use std::path::{Path, PathBuf}; use std::thread::sleep; use std::time::Duration; -use hpl_interface::types::bech32_decode; use macro_rules_attribute::apply; use tempfile::tempdir; @@ -216,6 +215,7 @@ fn launch_cosmos_validator( ) -> AgentHandles { let validator_base = tempdir().unwrap(); let validator_base_db = concat_path(&validator_base, "db"); + fs::create_dir_all(&validator_base_db).unwrap(); let checkpoint_path = concat_path(&validator_base, "checkpoint"); let signature_path = concat_path(&validator_base, "signature"); @@ -233,9 +233,10 @@ fn launch_cosmos_validator( .hyp_env("ORIGINCHAINNAME", agent_config.name) .hyp_env("RELAYCHAINS", remotes.join(",")) .hyp_env("REORGPERIOD", "1") + .hyp_env("DB", validator_base_db.to_str().unwrap()) + .hyp_env("METRICS", agent_config.domain.to_string()) .hyp_env("VALIDATOR_KEY", agent_config.signer.key) .hyp_env("VALIDATOR_TYPE", agent_config.signer.typ) - .hyp_env("DB", validator_base_db.to_str().unwrap()) .hyp_env("VALIDATOR_PREFIX", "osmo1") .spawn("VAL"); @@ -246,6 +247,7 @@ fn launch_cosmos_validator( fn launch_cosmos_relayer(agent_config_path: PathBuf, relay_chains: Vec) -> AgentHandles { let relayer_base = tempdir().unwrap(); let relayer_base_db = concat_path(&relayer_base, "db"); + fs::create_dir_all(&relayer_base_db).unwrap(); let relayer = Program::default() .bin(concat_path(format!("../../{AGENT_BIN_PATH}"), "relayer")) @@ -359,7 +361,7 @@ fn run_locally() { .iter() .map(|v| { ( - v.chain_id.to_string(), + format!("cosmos-test-{}", v.domain), AgentConfig::new(osmosisd.clone(), validator, v), ) }) From 9d0921447a9a51dab3ee5c466ba79bee3b60759a Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Mon, 21 Aug 2023 14:11:28 +0000 Subject: [PATCH 035/142] fix: va --- .../chains/hyperlane-cosmos/src/validator_announce.rs | 11 +++++++++-- rust/utils/run-locally/src/cosmos/mod.rs | 10 +++++----- rust/utils/run-locally/src/cosmos/types.rs | 2 +- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/validator_announce.rs index f2118334d3..52191cb0f8 100644 --- a/rust/chains/hyperlane-cosmos/src/validator_announce.rs +++ b/rust/chains/hyperlane-cosmos/src/validator_announce.rs @@ -100,8 +100,10 @@ impl ValidatorAnnounce for CosmosValidatorAnnounce { .provider .wasm_send(announce_request, tx_gas_limit) .await?; + Ok(TxOutcome { - transaction_id: H512::from_slice(hex::decode(response.txhash).unwrap().as_slice()), + transaction_id: H256::from_slice(hex::decode(response.txhash).unwrap().as_slice()) + .into(), executed: response.code == 0, gas_used: U256::from(response.gas_used), gas_price: U256::from(response.gas_wanted), @@ -109,6 +111,11 @@ impl ValidatorAnnounce for CosmosValidatorAnnounce { } async fn announce_tokens_needed(&self, announcement: SignedType) -> Option { - todo!() // not implemented yet + let out = self + .announce(announcement, None) + .await + .expect("failed to announce"); + + None } } diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index 488412e57a..29aab2fcf9 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -213,6 +213,7 @@ fn launch_cosmos_validator( agent_config_path: PathBuf, remotes: Vec, ) -> AgentHandles { + let validator_bin = concat_path(format!("../../{AGENT_BIN_PATH}"), "validator"); let validator_base = tempdir().unwrap(); let validator_base_db = concat_path(&validator_base, "db"); fs::create_dir_all(&validator_base_db).unwrap(); @@ -221,7 +222,7 @@ fn launch_cosmos_validator( let signature_path = concat_path(&validator_base, "signature"); let validator = Program::default() - .bin(concat_path(format!("../../{AGENT_BIN_PATH}"), "validator")) + .bin(validator_bin) .env("CONFIG_FILES", agent_config_path.to_str().unwrap()) .env( "MY_VALIDATOR_SIGNATURE_DIRECTORY", @@ -245,17 +246,16 @@ fn launch_cosmos_validator( #[apply(as_task)] fn launch_cosmos_relayer(agent_config_path: PathBuf, relay_chains: Vec) -> AgentHandles { + let relayer_bin = concat_path(format!("../../{AGENT_BIN_PATH}"), "relayer"); let relayer_base = tempdir().unwrap(); - let relayer_base_db = concat_path(&relayer_base, "db"); - fs::create_dir_all(&relayer_base_db).unwrap(); let relayer = Program::default() - .bin(concat_path(format!("../../{AGENT_BIN_PATH}"), "relayer")) + .bin(relayer_bin) .env("CONFIG_FILES", agent_config_path.to_str().unwrap()) .env("RUST_BACKTRACE", "1") .hyp_env("RELAYCHAINS", relay_chains.join(",")) .hyp_env("REORGPERIOD", "1") - .hyp_env("DB", relayer_base_db.to_str().unwrap()) + .hyp_env("DB", relayer_base.as_ref().to_str().unwrap()) .spawn("RLY"); relayer diff --git a/rust/utils/run-locally/src/cosmos/types.rs b/rust/utils/run-locally/src/cosmos/types.rs index a0c05c39cf..de50997268 100644 --- a/rust/utils/run-locally/src/cosmos/types.rs +++ b/rust/utils/run-locally/src/cosmos/types.rs @@ -148,7 +148,7 @@ impl AgentConfig { key: hex::encode(validator.priv_key.to_bytes()), prefix: "osmo".to_string(), }, - index: AgentConfigIndex { from: 0, chunk: 10 }, + index: AgentConfigIndex { from: 1, chunk: 10 }, } } } From ad9bd4271b234e79c535e516662aaf7a61586e5f Mon Sep 17 00:00:00 2001 From: hashableric Date: Tue, 22 Aug 2023 14:14:30 +0900 Subject: [PATCH 036/142] feat: h256 to h512 --- rust/chains/hyperlane-cosmos/src/lib.rs | 4 ++-- rust/chains/hyperlane-cosmos/src/libs/binary.rs | 12 ++++++++++++ rust/chains/hyperlane-cosmos/src/libs/mod.rs | 2 ++ .../chains/hyperlane-cosmos/src/{ => libs}/verify.rs | 0 rust/chains/hyperlane-cosmos/src/providers/rpc.rs | 3 ++- 5 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 rust/chains/hyperlane-cosmos/src/libs/binary.rs create mode 100644 rust/chains/hyperlane-cosmos/src/libs/mod.rs rename rust/chains/hyperlane-cosmos/src/{ => libs}/verify.rs (100%) diff --git a/rust/chains/hyperlane-cosmos/src/lib.rs b/rust/chains/hyperlane-cosmos/src/lib.rs index f6cce1ebef..1669f7dc15 100644 --- a/rust/chains/hyperlane-cosmos/src/lib.rs +++ b/rust/chains/hyperlane-cosmos/src/lib.rs @@ -15,11 +15,11 @@ mod routing_ism; mod signers; mod trait_builder; mod validator_announce; -mod verify; +mod libs; pub use self::{ interchain_gas::*, mailbox::*, multisig_ism::*, providers::*, routing_ism::*, signers::*, - trait_builder::*, trait_builder::*, validator_announce::*, validator_announce::*, verify::*, + trait_builder::*, trait_builder::*, validator_announce::*, validator_announce::*, libs::*, }; /// Safe default imports of commonly used traits/types. diff --git a/rust/chains/hyperlane-cosmos/src/libs/binary.rs b/rust/chains/hyperlane-cosmos/src/libs/binary.rs new file mode 100644 index 0000000000..3c617ae429 --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/libs/binary.rs @@ -0,0 +1,12 @@ +use std::cmp; +use hyperlane_core::{H256, H512}; + + +pub fn h256_to_h512(v: H256) -> H512 { + let mut result: [u8; 64] = [0; 64]; + let vec = v.0.as_slice(); + let start_point = cmp::max(0, 32 - vec.len()); + result[start_point..32].copy_from_slice(vec); + + H512::from_slice(&result) +} \ No newline at end of file diff --git a/rust/chains/hyperlane-cosmos/src/libs/mod.rs b/rust/chains/hyperlane-cosmos/src/libs/mod.rs new file mode 100644 index 0000000000..4b721e3fda --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/libs/mod.rs @@ -0,0 +1,2 @@ +pub mod verify; +pub mod binary; \ No newline at end of file diff --git a/rust/chains/hyperlane-cosmos/src/verify.rs b/rust/chains/hyperlane-cosmos/src/libs/verify.rs similarity index 100% rename from rust/chains/hyperlane-cosmos/src/verify.rs rename to rust/chains/hyperlane-cosmos/src/libs/verify.rs diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index c8e6672f6c..24f356754a 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -5,6 +5,7 @@ use cosmrs::tendermint::hash::Algorithm; use cosmrs::tendermint::Hash; use hyperlane_core::{ChainResult, ContractLocator, HyperlaneDomain, LogMeta, H256, H512, U256}; use sha256::digest; +use crate::binary::h256_to_h512; use crate::verify::{self, bech32_decode}; use crate::ConnectionConf; @@ -136,7 +137,7 @@ impl WasmIndexer for CosmosWasmIndexer { address: bech32_decode(addr.clone()), block_number: block_number as u64, block_hash: H256::from_slice(block.block_id.hash.as_bytes()), - transaction_id: H512::from_slice(tx_hash.clone().as_bytes()), + transaction_id: h256_to_h512(tx_hash.clone()), transaction_index: idx as u64, log_index: U256::from(log_idx), }; From d85a7a83d1daecd5f017c46221f0ac8f06dcac32 Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Tue, 22 Aug 2023 14:09:39 +0000 Subject: [PATCH 037/142] feat: query balance --- rust/utils/run-locally/src/cosmos/cli.rs | 20 ++++++++++++++++++-- rust/utils/run-locally/src/cosmos/link.rs | 2 +- rust/utils/run-locally/src/cosmos/mod.rs | 2 +- rust/utils/run-locally/src/cosmos/types.rs | 5 +++++ 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/rust/utils/run-locally/src/cosmos/cli.rs b/rust/utils/run-locally/src/cosmos/cli.rs index 23f583d75a..d311d967e3 100644 --- a/rust/utils/run-locally/src/cosmos/cli.rs +++ b/rust/utils/run-locally/src/cosmos/cli.rs @@ -8,7 +8,8 @@ use crate::{ }; use super::{ - crypto::KeyPair, default_keys, modify_toml, sed, wait_for_node, Codes, Coin, TxResponse, + crypto::KeyPair, default_keys, modify_toml, sed, types::BalanceResponse, wait_for_node, Codes, + Coin, TxResponse, }; const GENESIS_FUND: u128 = 1000000000000; @@ -35,6 +36,7 @@ pub struct OsmosisCLI { pub home: String, } +#[allow(dead_code)] impl OsmosisCLI { pub fn new(bin: PathBuf, home: &str) -> Self { Self { @@ -278,7 +280,6 @@ impl OsmosisCLI { output.unwrap() } - #[allow(dead_code)] pub fn wasm_query( &self, endpoint: &OsmosisEndpoint, @@ -301,6 +302,21 @@ impl OsmosisCLI { output.unwrap() } + pub fn query_balance(&self, endpoint: &OsmosisEndpoint, addr: &str) -> BalanceResponse { + let cmd = endpoint + .add_rpc(self.cli()) + .cmd("query") + .cmd("bank") + .cmd("balances") + .cmd(addr) + .run_with_output() + .join(); + + let output = serde_json::from_str(cmd.first().unwrap()).unwrap(); + + output + } + fn add_genesis_accs(&self) { for name in default_keys().into_iter().map(|(name, _)| name) { self.cli() diff --git a/rust/utils/run-locally/src/cosmos/link.rs b/rust/utils/run-locally/src/cosmos/link.rs index b42ca77fdb..69ae15d935 100644 --- a/rust/utils/run-locally/src/cosmos/link.rs +++ b/rust/utils/run-locally/src/cosmos/link.rs @@ -1,6 +1,6 @@ use std::path::Path; -use hpl_interface::{ism, va}; +use hpl_interface::ism; use super::{cli::OsmosisCLI, crypto::KeyPair, CosmosNetwork}; diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index 29aab2fcf9..8d7230a8f5 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -300,7 +300,7 @@ fn run_locally() { let deployer = "validator"; let linker = "validator"; let validator = "hpl-validator"; - let relayer = "hpl-relayer"; + let _relayer = "hpl-relayer"; let nodes = nodes .into_iter() diff --git a/rust/utils/run-locally/src/cosmos/types.rs b/rust/utils/run-locally/src/cosmos/types.rs index de50997268..9b31a73612 100644 --- a/rust/utils/run-locally/src/cosmos/types.rs +++ b/rust/utils/run-locally/src/cosmos/types.rs @@ -66,6 +66,11 @@ pub struct Deployments { pub va: String, } +#[derive(serde::Serialize, serde::Deserialize)] +pub struct BalanceResponse { + pub balances: Vec, +} + #[derive(serde::Serialize, serde::Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct AgentConfigAddrs { From a36bf3cffbb9edb8c82e7036585e0d481af92f06 Mon Sep 17 00:00:00 2001 From: hashableric Date: Tue, 22 Aug 2023 23:23:57 +0900 Subject: [PATCH 038/142] feat: change signer infos --- rust/chains/hyperlane-cosmos/src/providers/grpc.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index 23226a6eec..1c0a3ed85d 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -19,7 +19,7 @@ use cosmrs::proto::cosmwasm::wasm::v1::{ use cosmrs::proto::traits::Message; use cosmrs::tx::{self, Fee, MessageExt, SignDoc, SignerInfo}; -use cosmrs::Coin; +use cosmrs::{Amount, Coin}; use hyperlane_core::{ChainResult, ContractLocator, HyperlaneDomain, H256, U256}; use serde::Serialize; use std::num::NonZeroU64; @@ -207,10 +207,10 @@ impl WasmProvider for WasmGrpcProvider { .as_u64(); let auth_info = signer_info.auth_info(Fee::from_amount_and_gas( - Coin { - denom: format!("u{}", self.signer.prefix.clone()).parse().unwrap(), - amount: 10000u128, - }, + Coin::new( + Amount::from(10000u128), + format!("u{}", self.signer.prefix.clone()).as_str(), + ).unwrap(), gas_limit, )); From 3de591b3cf4eb0e2c2dc06de6883c5caf7321a2d Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Wed, 23 Aug 2023 09:44:37 +0000 Subject: [PATCH 039/142] wip --- rust/Cargo.lock | 1 + rust/chains/hyperlane-cosmos/Cargo.toml | 1 + .../src/payloads/validator_announce.rs | 2 +- .../hyperlane-cosmos/src/providers/grpc.rs | 107 ++++++++++++++---- .../src/validator_announce.rs | 17 ++- rust/hyperlane-core/src/traits/signing.rs | 8 ++ 6 files changed, 105 insertions(+), 31 deletions(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index a97d88fba2..d5bdf942cc 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -4104,6 +4104,7 @@ name = "hyperlane-cosmos" version = "0.1.0" dependencies = [ "async-trait", + "base64 0.21.4", "bech32 0.9.1", "cosmrs", "hex 0.4.3", diff --git a/rust/chains/hyperlane-cosmos/Cargo.toml b/rust/chains/hyperlane-cosmos/Cargo.toml index 8b515778b6..fcdb4c37d9 100644 --- a/rust/chains/hyperlane-cosmos/Cargo.toml +++ b/rust/chains/hyperlane-cosmos/Cargo.toml @@ -17,6 +17,7 @@ tracing-futures = { workspace = true } tracing = { workspace = true } url = { workspace = true } bech32 = { workspace = true } +base64 = { workspace = true } serde_json = { workspace = true } tonic = { workspace = true } sha2 = { workspace = true } diff --git a/rust/chains/hyperlane-cosmos/src/payloads/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/payloads/validator_announce.rs index a5754fe879..64624a2f38 100644 --- a/rust/chains/hyperlane-cosmos/src/payloads/validator_announce.rs +++ b/rust/chains/hyperlane-cosmos/src/payloads/validator_announce.rs @@ -19,7 +19,7 @@ pub struct GetAnnounceStorageLocationsRequestInner { #[derive(Serialize, Deserialize, Debug)] pub struct AnnouncementRequest { - pub announcement: AnnouncementRequestInner, + pub announce: AnnouncementRequestInner, } #[derive(Serialize, Deserialize, Debug)] diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index 1c0a3ed85d..267c080424 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -28,17 +28,22 @@ use std::str::FromStr; use crate::verify; use crate::{signers::Signer, ConnectionConf}; +const DEFAULT_GAS_PRICE: f32 = 0.05; +const DEFAULT_GAS_ADJUSTMENT: f32 = 1.25; + #[async_trait] /// Cosmwasm GRPC Provider pub trait WasmProvider: Send + Sync { /// get latest block height async fn latest_block_height(&self) -> ChainResult; + /// query to already define contract address async fn wasm_query( &self, payload: T, maybe_lag: Option, ) -> ChainResult>; + /// query to specific contract address async fn wasm_query_to( &self, @@ -46,20 +51,31 @@ pub trait WasmProvider: Send + Sync { payload: T, maybe_lag: Option, ) -> ChainResult>; + /// query account info async fn account_query(&self, address: String) -> ChainResult; + + /// simulate raw tx + async fn simulate_raw_tx + Sync + Send>( + &self, + msgs: I, + gas_limit: Option, + ) -> ChainResult; + /// generate raw tx - async fn generate_raw_tx( + async fn generate_raw_tx + Sync + Send>( &self, - payload: T, + msgs: I, gas_limit: Option, ) -> ChainResult>; + /// send tx async fn wasm_send( &self, payload: T, gas_limit: Option, ) -> ChainResult; + /// simulate tx async fn wasm_simulate( &self, @@ -182,24 +198,39 @@ impl WasmProvider for WasmGrpcProvider { Ok(account) } - async fn generate_raw_tx(&self, payload: T, gas_limit: Option) -> ChainResult> + async fn simulate_raw_tx( + &self, + msgs: I, + gas_limit: Option, + ) -> ChainResult where - T: Serialize + Send + Sync, + I: IntoIterator + Send + Sync, { - let account_info = self.account_query(self.signer.address()).await?; - let contract_addr = self.get_contract_addr()?; + let mut client = TxServiceClient::connect(self.get_conn_url()?).await?; - let msg = MsgExecuteContract { - sender: contract_addr.clone(), - contract: contract_addr.clone(), - msg: serde_json::to_string(&payload)?.as_bytes().to_vec(), - funds: vec![], - }; + let tx_bytes = self.generate_raw_tx(msgs, gas_limit).await?; + let sim_req = tonic::Request::new(SimulateRequest { tx: None, tx_bytes }); + let mut sim_res = client.simulate(sim_req).await.unwrap().into_inner(); + + // apply gas adjustment + sim_res.gas_info.as_mut().map(|v| { + v.gas_used = (v.gas_used as f32 * DEFAULT_GAS_ADJUSTMENT) as u64; + v + }); + + Ok(sim_res) + } + + async fn generate_raw_tx(&self, msgs: I, gas_limit: Option) -> ChainResult> + where + I: IntoIterator + Send + Sync, + { + let account_info = self.account_query(self.signer.address()).await?; let private_key = SigningKey::from_slice(&self.signer.private_key).unwrap(); let public_key = private_key.public_key(); - let tx_body = tx::Body::new(vec![msg.to_any().unwrap()], "", 900u16); + let tx_body = tx::Body::new(msgs, "", 900u16); let signer_info = SignerInfo::single_direct(Some(public_key), account_info.sequence); let gas_limit: u64 = gas_limit @@ -208,9 +239,10 @@ impl WasmProvider for WasmGrpcProvider { let auth_info = signer_info.auth_info(Fee::from_amount_and_gas( Coin::new( - Amount::from(10000u128), + Amount::from((gas_limit as f32 * DEFAULT_GAS_PRICE) as u64), format!("u{}", self.signer.prefix.clone()).as_str(), - ).unwrap(), + ) + .unwrap(), gas_limit, )); @@ -222,6 +254,7 @@ impl WasmProvider for WasmGrpcProvider { account_info.account_number, ) .unwrap(); + let tx_signed = sign_doc.sign(&private_key).unwrap(); Ok(tx_signed.to_bytes().unwrap()) @@ -232,25 +265,49 @@ impl WasmProvider for WasmGrpcProvider { T: Serialize + Send + Sync, { let mut client = TxServiceClient::connect(self.get_conn_url()?).await?; - let tx_bytes = self.generate_raw_tx(payload, gas_limit).await?; - let request = tonic::Request::new(BroadcastTxRequest { - tx_bytes, + + let msgs = vec![MsgExecuteContract { + sender: self.signer.address(), + contract: self.get_contract_addr()?, + msg: serde_json::to_string(&payload)?.as_bytes().to_vec(), + funds: vec![], + } + .to_any() + .unwrap()]; + + let tx_req = BroadcastTxRequest { + tx_bytes: self.generate_raw_tx(msgs, gas_limit).await?, mode: BroadcastMode::Block as i32, - }); + }; + + let tx_res = client + .broadcast_tx(tx_req) + .await + .unwrap() + .into_inner() + .tx_response + .unwrap(); + if tx_res.code != 0 { + println!("TX_ERROR: {}", tx_res.raw_log); + } - let response = client.broadcast_tx(request).await.unwrap().into_inner(); - Ok(response.tx_response.unwrap()) + Ok(tx_res) } async fn wasm_simulate(&self, payload: T) -> ChainResult where T: Serialize + Send + Sync, { - let mut client = TxServiceClient::connect(self.get_conn_url()?).await?; - let tx_bytes = self.generate_raw_tx(payload, None).await?; + let msg = MsgExecuteContract { + sender: self.signer.address(), + contract: self.get_contract_addr()?, + msg: serde_json::to_string(&payload)?.as_bytes().to_vec(), + funds: vec![], + }; - let request = tonic::Request::new(SimulateRequest { tx: None, tx_bytes }); - let response = client.simulate(request).await.unwrap().into_inner(); + let response = self + .simulate_raw_tx(vec![msg.to_any().unwrap()], None) + .await?; Ok(response) } diff --git a/rust/chains/hyperlane-cosmos/src/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/validator_announce.rs index 52191cb0f8..02f72f11a8 100644 --- a/rust/chains/hyperlane-cosmos/src/validator_announce.rs +++ b/rust/chains/hyperlane-cosmos/src/validator_announce.rs @@ -1,5 +1,6 @@ use async_trait::async_trait; +use base64::Engine; use cosmrs::proto::cosmos::base::abci::v1beta1::TxResponse; use hyperlane_core::{ Announcement, ChainResult, ContractLocator, HyperlaneChain, HyperlaneContract, HyperlaneDomain, @@ -22,7 +23,7 @@ pub struct CosmosValidatorAnnounce { _conf: ConnectionConf, domain: HyperlaneDomain, address: H256, - _signer: Signer, + signer: Signer, provider: Box, } @@ -35,7 +36,7 @@ impl CosmosValidatorAnnounce { _conf: conf, domain: locator.domain.clone(), address: locator.address, - _signer: signer, + signer: signer, provider: Box::new(provider), } } @@ -89,12 +90,18 @@ impl ValidatorAnnounce for CosmosValidatorAnnounce { tx_gas_limit: Option, ) -> ChainResult { let announce_request = AnnouncementRequest { - announcement: AnnouncementRequestInner { - validator: announcement.value.validator.to_string(), + announce: AnnouncementRequestInner { + validator: hex::encode(announcement.value.validator), storage_location: announcement.value.storage_location, - signature: hex::encode(announcement.signature.to_vec()), + signature: base64::engine::general_purpose::STANDARD + .encode(announcement.signature.to_vec()), }, }; + println!("sender: {}", self.signer.address()); + println!( + "payload: {}", + serde_json::to_string(&announce_request).unwrap() + ); let response: TxResponse = self .provider diff --git a/rust/hyperlane-core/src/traits/signing.rs b/rust/hyperlane-core/src/traits/signing.rs index 5257279192..b4ea6f06df 100644 --- a/rust/hyperlane-core/src/traits/signing.rs +++ b/rust/hyperlane-core/src/traits/signing.rs @@ -53,6 +53,14 @@ impl HyperlaneSignerExt for S { ) -> Result, HyperlaneSignerError> { let signing_hash = value.signing_hash(); let signature = self.sign_hash(&signing_hash).await?; + + println!("{}", self.eth_address()); + println!( + "hash: {}, sign: {}", + hex::encode(&signing_hash), + hex::encode(&signature.to_vec()) + ); + Ok(SignedType { value, signature }) } From 91efcca47863453f71ee9c5ad75c3190f85226fc Mon Sep 17 00:00:00 2001 From: hashableric Date: Wed, 23 Aug 2023 21:39:33 +0900 Subject: [PATCH 040/142] fix: rip hash addr --- rust/Cargo.lock | 1 + rust/agents/validator/Cargo.toml | 1 + rust/agents/validator/src/validator.rs | 16 ++++++++++++++-- rust/chains/hyperlane-cosmos/src/libs/verify.rs | 16 +++++++++++++++- rust/hyperlane-core/src/traits/signing.rs | 8 -------- 5 files changed, 31 insertions(+), 11 deletions(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index d5bdf942cc..2075d6b2c0 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -10372,6 +10372,7 @@ dependencies = [ "futures-util", "hyperlane-base", "hyperlane-core", + "hyperlane-cosmos", "hyperlane-ethereum", "hyperlane-test", "prometheus", diff --git a/rust/agents/validator/Cargo.toml b/rust/agents/validator/Cargo.toml index 4607a1a9b3..6d4c586782 100644 --- a/rust/agents/validator/Cargo.toml +++ b/rust/agents/validator/Cargo.toml @@ -27,6 +27,7 @@ tracing.workspace = true hyperlane-core = { path = "../../hyperlane-core", features = ["agent"] } hyperlane-base = { path = "../../hyperlane-base" } hyperlane-ethereum = { path = "../../chains/hyperlane-ethereum" } +hyperlane-cosmos = { path = "../../chains/hyperlane-cosmos" } [dev-dependencies] tokio-test.workspace = true diff --git a/rust/agents/validator/src/validator.rs b/rust/agents/validator/src/validator.rs index d516e051c0..7880333300 100644 --- a/rust/agents/validator/src/validator.rs +++ b/rust/agents/validator/src/validator.rs @@ -4,11 +4,16 @@ use async_trait::async_trait; use derive_more::AsRef; use eyre::Result; use futures_util::future::ready; +use hyperlane_cosmos::verify::priv_to_binary_addr; +use tokio::{task::JoinHandle, time::sleep}; +use tracing::{error, info, info_span, instrument::Instrumented, warn, Instrument}; + use hyperlane_base::{ db::{HyperlaneRocksDB, DB}, run_all, BaseAgent, CheckpointSyncer, ContractSyncMetrics, CoreMetrics, HyperlaneAgentCore, - WatermarkContractSync, + MessageContractSync, SignerConf, WatermarkContractSync, }; + use hyperlane_core::{ Announcement, ChainResult, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneSigner, HyperlaneSignerExt, Mailbox, MerkleTreeHook, MerkleTreeInsertion, TxOutcome, ValidatorAnnounce, @@ -40,6 +45,7 @@ pub struct Validator { reorg_period: u64, interval: Duration, checkpoint_syncer: Arc, + raw_signer: SignerConf, } #[async_trait] @@ -98,6 +104,7 @@ impl BaseAgent for Validator { reorg_period: settings.reorg_period, interval: settings.interval, checkpoint_syncer, + raw_signer: settings.validator.clone(), }) } @@ -221,9 +228,14 @@ impl Validator { } async fn announce(&self) -> Result<()> { + let address = match self.raw_signer { + SignerConf::CosmosKey { key, .. } => priv_to_binary_addr(key.0.as_slice().to_vec())?, + _ => self.signer.eth_address(), + }; + // Sign and post the validator announcement let announcement = Announcement { - validator: self.signer.eth_address(), + validator: address, mailbox_address: self.mailbox.address(), mailbox_domain: self.mailbox.domain().id(), storage_location: self.checkpoint_syncer.announcement_location(), diff --git a/rust/chains/hyperlane-cosmos/src/libs/verify.rs b/rust/chains/hyperlane-cosmos/src/libs/verify.rs index eaa3332946..8dcbb30d5c 100644 --- a/rust/chains/hyperlane-cosmos/src/libs/verify.rs +++ b/rust/chains/hyperlane-cosmos/src/libs/verify.rs @@ -1,7 +1,8 @@ use std::cmp; use bech32::{FromBase32, ToBase32}; -use hyperlane_core::{ChainCommunicationError, ChainResult, H256}; +use cosmrs::crypto::secp256k1::SigningKey; +use hyperlane_core::{ChainCommunicationError, ChainResult, H160, H256}; use ripemd::Ripemd160; use sha2::{Digest, Sha256}; @@ -76,3 +77,16 @@ pub fn pub_to_addr(pub_key: Vec, prefix: &str) -> ChainResult { Ok(addr) } + +/// encode H256 to bech32 address +pub fn priv_to_binary_addr(priv_key: Vec) -> ChainResult { + let sha_hash = sha256_digest( + SigningKey::from_slice(priv_key.as_slice()) + .unwrap() + .public_key() + .to_bytes(), + )?; + let rip_hash = ripemd160_digest(sha_hash)?; + + Ok(H160::from_slice(rip_hash.as_slice())) +} diff --git a/rust/hyperlane-core/src/traits/signing.rs b/rust/hyperlane-core/src/traits/signing.rs index b4ea6f06df..f54e9309f4 100644 --- a/rust/hyperlane-core/src/traits/signing.rs +++ b/rust/hyperlane-core/src/traits/signing.rs @@ -54,13 +54,6 @@ impl HyperlaneSignerExt for S { let signing_hash = value.signing_hash(); let signature = self.sign_hash(&signing_hash).await?; - println!("{}", self.eth_address()); - println!( - "hash: {}, sign: {}", - hex::encode(&signing_hash), - hex::encode(&signature.to_vec()) - ); - Ok(SignedType { value, signature }) } @@ -161,7 +154,6 @@ mod hashes { let mut eth_message = format!("{PREFIX}{}", message.len()).into_bytes(); eth_message.extend_from_slice(message); - keccak256(ð_message).into() } From ce234dd79fdb297f9b99f02ce72e13f69da0a8f4 Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Thu, 24 Aug 2023 09:06:18 +0000 Subject: [PATCH 041/142] test sign --- rust/Cargo.lock | 1 + rust/agents/validator/Cargo.toml | 1 + rust/agents/validator/src/validator.rs | 69 +++++++++++++++++++++++++- 3 files changed, 70 insertions(+), 1 deletion(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 2075d6b2c0..29f0298e44 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -10375,6 +10375,7 @@ dependencies = [ "hyperlane-cosmos", "hyperlane-ethereum", "hyperlane-test", + "k256 0.13.1", "prometheus", "serde", "serde_json", diff --git a/rust/agents/validator/Cargo.toml b/rust/agents/validator/Cargo.toml index 6d4c586782..f562938db2 100644 --- a/rust/agents/validator/Cargo.toml +++ b/rust/agents/validator/Cargo.toml @@ -32,6 +32,7 @@ hyperlane-cosmos = { path = "../../chains/hyperlane-cosmos" } [dev-dependencies] tokio-test.workspace = true hyperlane-test = { path = "../../hyperlane-test" } +k256.workspace = true [features] default = ["color-eyre", "oneline-errors"] diff --git a/rust/agents/validator/src/validator.rs b/rust/agents/validator/src/validator.rs index 7880333300..0a930c83f2 100644 --- a/rust/agents/validator/src/validator.rs +++ b/rust/agents/validator/src/validator.rs @@ -301,4 +301,71 @@ impl Validator { } #[cfg(test)] -mod test {} +mod test { + use std::str::FromStr; + + use ethers::{ + signers::Wallet, + utils::{self}, + }; + use hyperlane_core::{Announcement, HyperlaneSigner, Signable, H256}; + use hyperlane_ethereum::Signers; + use k256::ecdsa::SigningKey; + + #[tokio::test] + async fn sign_manual() -> eyre::Result<()> { + let test_key = "45bde72a537e11d1cef58836d9278268fd393c0400852ce045fc0c2de7bbe90d"; + + let cases = [( + "0xf9e25a6be80f6d48727e42381fc3c3b7834c0cb4", + "0xcb4530690c80917c7e412498e7258fff4569857b2aae8e020091cf2d75730656", + 26657, + "file:///var/folders/3v/g38z040x54x8l6b160vv66b40000gn/T/.tmpY4ofw1/checkpoint", + )]; + + let to_announcement = |c: (&str, &str, u32, &str)| -> eyre::Result { + let validator = hyperlane_core::H160::from_str(c.0)?; + let mailbox_address = hyperlane_core::H256::from_str(c.1)?; + let mailbox_domain = c.2; + let storage_location = c.3.to_string(); + + Ok(Announcement { + validator, + mailbox_address, + mailbox_domain, + storage_location, + }) + }; + + for c in cases { + let announcement = to_announcement(c)?; + let hash = announcement.signing_hash(); + + // eth sign + let eth_signer = Signers::Local(Wallet::from_str(test_key)?); + let eth_sign = eth_signer.sign_hash(&hash).await?; + let eth_sign_raw = eth_sign.to_vec(); + + // raw sign + let cosmos_sign_raw = { + let signing_key = + SigningKey::from_bytes(H256::from_str(test_key)?.as_bytes().into())?; + + let message = hash.as_ref(); + let message_hash = utils::hash_message(message); // ERC-191 + + let (sign, recov) = + signing_key.sign_prehash_recoverable(message_hash.as_bytes())?; + + let mut sign_raw = sign.to_vec(); + sign_raw.push(recov.to_byte() + 27); // ERC-155 + + sign_raw + }; + + assert_eq!(eth_sign_raw, cosmos_sign_raw); + } + + Ok(()) + } +} From 1c446b8edf1512e346ad977406b4be3ffa474e0c Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Thu, 24 Aug 2023 12:07:56 +0000 Subject: [PATCH 042/142] wip2 --- .../hyperlane-cosmos/src/validator_announce.rs | 12 +++++++----- rust/utils/run-locally/src/cosmos/mod.rs | 4 ++-- rust/utils/run-locally/src/cosmos/types.rs | 4 ++++ 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/validator_announce.rs index 02f72f11a8..a7b1d88457 100644 --- a/rust/chains/hyperlane-cosmos/src/validator_announce.rs +++ b/rust/chains/hyperlane-cosmos/src/validator_announce.rs @@ -4,7 +4,7 @@ use base64::Engine; use cosmrs::proto::cosmos::base::abci::v1beta1::TxResponse; use hyperlane_core::{ Announcement, ChainResult, ContractLocator, HyperlaneChain, HyperlaneContract, HyperlaneDomain, - HyperlaneProvider, SignedType, TxOutcome, ValidatorAnnounce, H256, H512, U256, + HyperlaneProvider, SignedType, TxOutcome, ValidatorAnnounce, H160, H256, H512, U256, }; use crate::{ @@ -64,12 +64,14 @@ impl ValidatorAnnounce for CosmosValidatorAnnounce { &self, validators: &[H256], ) -> ChainResult>> { + let vss = validators + .iter() + .map(|v| hex::encode(H160::from_slice(&v.as_bytes()[12..]))) + .collect::>(); + let payload = GetAnnounceStorageLocationsRequest { get_announce_storage_locations: GetAnnounceStorageLocationsRequestInner { - validators: validators - .iter() - .map(|v| hex::encode(v.as_bytes())) - .collect::>(), + validators: vss, }, }; diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index 8d7230a8f5..0d7b84b948 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -51,7 +51,7 @@ fn default_keys<'a>() -> [(&'a str, &'a str); 6] { } const CW_HYPERLANE_GIT: &str = "https://github.com/many-things/cw-hyperlane"; -const CW_HYPERLANE_VERSION: &str = "0.0.2"; +const CW_HYPERLANE_VERSION: &str = "0.0.3"; fn make_target() -> String { let os = if cfg!(target_os = "linux") { @@ -112,7 +112,7 @@ pub fn install_codes(dir: Option) -> BTreeMap { unzip(&release_comp, dir_path); // make contract_name => path map - fs::read_dir(dir_path) + fs::read_dir(concat_path(dir_path, "artifacts")) .unwrap() .map(|v| { let entry = v.unwrap(); diff --git a/rust/utils/run-locally/src/cosmos/types.rs b/rust/utils/run-locally/src/cosmos/types.rs index 9b31a73612..9b1a5e3597 100644 --- a/rust/utils/run-locally/src/cosmos/types.rs +++ b/rust/utils/run-locally/src/cosmos/types.rs @@ -127,6 +127,10 @@ impl AgentConfig { let cli = OsmosisCLI::new(bin, network.launch_resp.home_path.to_str().unwrap()); let validator = cli.get_keypair(validator); + println!("val_priv : {}", hex::encode(validator.priv_key.to_bytes())); + println!("val_pub : {}", hex::encode(validator.pub_key_to_binary())); + println!("val_addr : {}", validator.addr("osmo")); + AgentConfig { name: format!("cosmos-test-{}", network.domain), domain: network.domain, From 8b7ca904b7a96090ec3e1c18f3043ed76bb19616 Mon Sep 17 00:00:00 2001 From: hashableric Date: Thu, 24 Aug 2023 21:46:31 +0900 Subject: [PATCH 043/142] feat: fix hpl conn --- rust/agents/validator/src/validator.rs | 2 +- rust/chains/hyperlane-cosmos/src/mailbox.rs | 9 ++++-- .../hyperlane-cosmos/src/providers/grpc.rs | 28 +++++++++++-------- .../src/validator_announce.rs | 10 +------ 4 files changed, 26 insertions(+), 23 deletions(-) diff --git a/rust/agents/validator/src/validator.rs b/rust/agents/validator/src/validator.rs index 0a930c83f2..e1532ff9e8 100644 --- a/rust/agents/validator/src/validator.rs +++ b/rust/agents/validator/src/validator.rs @@ -249,7 +249,7 @@ impl Validator { // the main validator submit loop. This is to avoid a situation in // which the validator is signing checkpoints but has not announced // their locations, which makes them functionally unusable. - let validators: [H256; 1] = [self.signer.eth_address().into()]; + let validators: [H256; 1] = [address.into()]; loop { info!("Checking for validator announcement"); if let Some(locations) = self diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 6201987402..832fc732c2 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -99,9 +99,14 @@ impl Mailbox for CosmosMailbox { count: general::EmptyStruct {}, }; - let data = self.provider.wasm_query(payload, lag).await?; - let response: mailbox::CountResponse = serde_json::from_slice(&data)?; + let data = self.provider.wasm_query(payload, lag).await; + + if let Err(e) = data { + println!("error: {:?}", e); + return Ok(0); + } + let response: mailbox::CountResponse = serde_json::from_slice(&data?)?; Ok(response.count) } diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index 267c080424..f9d431d740 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -20,7 +20,9 @@ use cosmrs::proto::traits::Message; use cosmrs::tx::{self, Fee, MessageExt, SignDoc, SignerInfo}; use cosmrs::{Amount, Coin}; -use hyperlane_core::{ChainResult, ContractLocator, HyperlaneDomain, H256, U256}; +use hyperlane_core::{ + ChainCommunicationError, ChainResult, ContractLocator, HyperlaneDomain, H256, U256, +}; use serde::Serialize; use std::num::NonZeroU64; use std::str::FromStr; @@ -144,11 +146,13 @@ impl WasmProvider for WasmGrpcProvider { .insert("x-cosmos-block-height", height.into()); } - let response = client - .smart_contract_state(request) - .await - .unwrap() - .into_inner(); + let result = client.smart_contract_state(request).await; + + if let Err(e) = result { + return Err(ChainCommunicationError::InvalidRequest { msg: e.to_string() }); + } + + let response = result.unwrap().into_inner(); // TODO: handle query to specific block number Ok(response.data) @@ -178,11 +182,13 @@ impl WasmProvider for WasmGrpcProvider { .insert("x-cosmos-block-height", height.into()); } - let response = client - .smart_contract_state(request) - .await - .unwrap() - .into_inner(); + let result = client.smart_contract_state(request).await; + + if let Err(e) = result { + return Err(ChainCommunicationError::InvalidRequest { msg: e.to_string() }); + } + + let response = result.unwrap().into_inner(); // TODO: handle query to specific block number Ok(response.data) diff --git a/rust/chains/hyperlane-cosmos/src/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/validator_announce.rs index a7b1d88457..0de0fd985a 100644 --- a/rust/chains/hyperlane-cosmos/src/validator_announce.rs +++ b/rust/chains/hyperlane-cosmos/src/validator_announce.rs @@ -64,10 +64,7 @@ impl ValidatorAnnounce for CosmosValidatorAnnounce { &self, validators: &[H256], ) -> ChainResult>> { - let vss = validators - .iter() - .map(|v| hex::encode(H160::from_slice(&v.as_bytes()[12..]))) - .collect::>(); + let vss = validators.iter().map(hex::encode).collect::>(); let payload = GetAnnounceStorageLocationsRequest { get_announce_storage_locations: GetAnnounceStorageLocationsRequestInner { @@ -99,11 +96,6 @@ impl ValidatorAnnounce for CosmosValidatorAnnounce { .encode(announcement.signature.to_vec()), }, }; - println!("sender: {}", self.signer.address()); - println!( - "payload: {}", - serde_json::to_string(&announce_request).unwrap() - ); let response: TxResponse = self .provider From 4fd4bce5bbe061cb185dedb3055f2d3c534bb000 Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Fri, 25 Aug 2023 19:30:10 +0000 Subject: [PATCH 044/142] e2e --- rust/chains/hyperlane-cosmos/src/mailbox.rs | 27 ++++++- .../hyperlane-cosmos/src/payloads/mailbox.rs | 12 +++ rust/utils/run-locally/src/cosmos/cli.rs | 9 ++- rust/utils/run-locally/src/cosmos/deploy.rs | 11 +++ rust/utils/run-locally/src/cosmos/mod.rs | 73 ++++++++++++++++--- rust/utils/run-locally/src/cosmos/types.rs | 12 ++- 6 files changed, 123 insertions(+), 21 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 832fc732c2..59b260261c 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -1,6 +1,7 @@ use std::fmt::{Debug, Formatter}; use std::num::NonZeroU64; use std::ops::RangeInclusive; +use std::str::FromStr; use crate::grpc::{WasmGrpcProvider, WasmProvider}; use crate::payloads::mailbox::{ProcessMessageRequest, ProcessMessageRequestInner}; @@ -84,8 +85,16 @@ impl Mailbox for CosmosMailbox { let branch = response .branch .iter() - .map(|b| H256::from_slice(&hex::decode(b).unwrap())) - .collect::>(); + .map(|b| { + if b.is_empty() { + "0000000000000000000000000000000000000000000000000000000000000000" + } else { + b + } + }) + .map(H256::from_str) + .collect::, _>>() + .expect("fail to parse tree branch"); Ok(IncrementalMerkle { branch: branch.try_into().unwrap(), @@ -125,7 +134,19 @@ impl Mailbox for CosmosMailbox { #[instrument(level = "debug", err, ret, skip(self))] async fn latest_checkpoint(&self, lag: Option) -> ChainResult { - todo!() + let payload = mailbox::CheckPointRequest { + check_point: general::EmptyStruct {}, + }; + + let data = self.provider.wasm_query(payload, None).await?; + let response: mailbox::CheckPointResponse = serde_json::from_slice(&data)?; + + Ok(Checkpoint { + mailbox_address: self.address, + mailbox_domain: self.domain.id(), + root: response.root.parse().unwrap(), + index: response.count, + }) } #[instrument(err, ret, skip(self))] diff --git a/rust/chains/hyperlane-cosmos/src/payloads/mailbox.rs b/rust/chains/hyperlane-cosmos/src/payloads/mailbox.rs index 298e1aa03c..1e724b8533 100644 --- a/rust/chains/hyperlane-cosmos/src/payloads/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/payloads/mailbox.rs @@ -40,6 +40,12 @@ pub struct ProcessMessageRequestInner { pub metadata: String, pub message: String, } + +#[derive(Serialize, Deserialize, Debug)] +pub struct CheckPointRequest { + pub check_point: EmptyStruct, +} + // Responses #[derive(Serialize, Deserialize, Debug)] @@ -62,3 +68,9 @@ pub struct MerkleTreeResponse { pub branch: [String; TREE_DEPTH], pub count: u32, } + +#[derive(Serialize, Deserialize, Debug)] +pub struct CheckPointResponse { + pub root: String, + pub count: u32, +} diff --git a/rust/utils/run-locally/src/cosmos/cli.rs b/rust/utils/run-locally/src/cosmos/cli.rs index d311d967e3..b529be51ca 100644 --- a/rust/utils/run-locally/src/cosmos/cli.rs +++ b/rust/utils/run-locally/src/cosmos/cli.rs @@ -3,6 +3,7 @@ use std::{collections::BTreeMap, io::Write, path::PathBuf, process::Stdio}; use k256::ecdsa::SigningKey; use crate::{ + cosmos::types::CliWasmQueryResponse, program::Program, utils::{concat_path, AgentHandles, TaskHandle}, }; @@ -74,7 +75,7 @@ impl OsmosisCLI { node_config_path, Box::new(|v| { v["p2p"]["pex"] = toml_edit::value(false); - v["consensus"]["timeout_commit"] = toml_edit::value("1s"); + v["consensus"]["timeout_commit"] = toml_edit::value("0.1s"); }), ); @@ -297,9 +298,11 @@ impl OsmosisCLI { cmd = endpoint.add_rpc(cmd); - let output = serde_json::from_str(cmd.run_with_output().join().first().unwrap()); + let output = cmd.run_with_output().join(); + let output = output.first().unwrap(); + let output: CliWasmQueryResponse = serde_json::from_str(output).unwrap(); - output.unwrap() + output.data } pub fn query_balance(&self, endpoint: &OsmosisEndpoint, addr: &str) -> BalanceResponse { diff --git a/rust/utils/run-locally/src/cosmos/deploy.rs b/rust/utils/run-locally/src/cosmos/deploy.rs index f0e6637930..1fe9598959 100644 --- a/rust/utils/run-locally/src/cosmos/deploy.rs +++ b/rust/utils/run-locally/src/cosmos/deploy.rs @@ -127,6 +127,16 @@ pub fn deploy_cw_hyperlane( domain, ); + // deploy mock receiver + let mock_receiver = cli.wasm_init( + &endpoint, + &deployer, + Some(deployer_addr), + codes.hpl_test_mock_msg_receiver, + igp_gas_oracle::InstantiateMsg {}, + "hpl_test_mock_msg_receiver", + ); + // deploy va let va = cli.wasm_init( &endpoint, @@ -148,6 +158,7 @@ pub fn deploy_cw_hyperlane( ism_multisig, hub, mailbox, + mock_receiver, va, } } diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index 0d7b84b948..da31ad0b74 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -4,6 +4,8 @@ use std::path::{Path, PathBuf}; use std::thread::sleep; use std::time::Duration; +use hpl_interface::mailbox; +use hpl_interface::types::bech32_decode; use macro_rules_attribute::apply; use tempfile::tempdir; @@ -51,7 +53,7 @@ fn default_keys<'a>() -> [(&'a str, &'a str); 6] { } const CW_HYPERLANE_GIT: &str = "https://github.com/many-things/cw-hyperlane"; -const CW_HYPERLANE_VERSION: &str = "0.0.3"; +const CW_HYPERLANE_VERSION: &str = "0.0.4"; fn make_target() -> String { let os = if cfg!(target_os = "linux") { @@ -112,7 +114,7 @@ pub fn install_codes(dir: Option) -> BTreeMap { unzip(&release_comp, dir_path); // make contract_name => path map - fs::read_dir(concat_path(dir_path, "artifacts")) + fs::read_dir(dir_path) .unwrap() .map(|v| { let entry = v.unwrap(); @@ -185,6 +187,20 @@ impl From<(CosmosResp, Deployments, String, u32)> for CosmosNetwork { } } +pub struct CosmosHyperlaneStack { + pub validators: Vec, + pub relayer: AgentHandles, +} + +impl Drop for CosmosHyperlaneStack { + fn drop(&mut self) { + for v in &mut self.validators { + stop_child(&mut v.1); + } + stop_child(&mut self.relayer.1); + } +} + #[apply(as_task)] fn launch_cosmos_node(config: CosmosConfig) -> CosmosResp { let home_path = match config.home_path { @@ -256,6 +272,7 @@ fn launch_cosmos_relayer(agent_config_path: PathBuf, relay_chains: Vec) .hyp_env("RELAYCHAINS", relay_chains.join(",")) .hyp_env("REORGPERIOD", "1") .hyp_env("DB", relayer_base.as_ref().to_str().unwrap()) + .hyp_env("ALLOW_LOCAL_CHECKPOINT_SYNCERS", "true") .spawn("RLY"); relayer @@ -330,7 +347,7 @@ fn run_locally() { if !targets.is_empty() { println!( - "{} -> {:?}", + "LINKING NODES: {} -> {:?}", node.domain, targets.iter().map(|v| v.domain).collect::>() ); @@ -387,19 +404,53 @@ fn run_locally() { launch_cosmos_validator(agent_config, agent_config_path.clone(), remotes) }) .collect::>(); - let hpl_val = hpl_val.into_iter().map(|v| v.join()).collect::>(); - let mut hpl_rly = launch_cosmos_relayer( + let hpl_rly = launch_cosmos_relayer( agent_config_path, agent_config_out.chains.into_keys().collect::>(), - ) - .join(); + ); - sleep(Duration::from_secs(30)); + for node in nodes.iter() { + let targets = nodes + .iter() + .filter(|v| v.domain == node.domain) + .collect::>(); - for mut node in hpl_val { - node.1.kill().unwrap(); + if !targets.is_empty() { + println!( + "DISPATCHING MAILBOX: {} -> {:?}", + node.domain, + targets.iter().map(|v| v.domain).collect::>() + ); + } + + for target in targets { + let cli = OsmosisCLI::new( + osmosisd.clone(), + node.launch_resp.home_path.to_str().unwrap(), + ); + + cli.wasm_execute( + &node.launch_resp.endpoint, + linker, + &node.deployments.mailbox, + mailbox::ExecuteMsg::Dispatch { + dest_domain: target.domain, + recipient_addr: bech32_decode(&target.deployments.mock_receiver) + .unwrap() + .into(), + msg_body: b"hello".into(), + }, + vec![], + ); + } } - hpl_rly.1.kill().unwrap(); + + let stack = CosmosHyperlaneStack { + validators: hpl_val.into_iter().map(|v| v.join()).collect(), + relayer: hpl_rly.join(), + }; + + sleep(Duration::from_secs(1000)); // wait for 2 min } #[cfg(test)] diff --git a/rust/utils/run-locally/src/cosmos/types.rs b/rust/utils/run-locally/src/cosmos/types.rs index 9b1a5e3597..2e03f901fa 100644 --- a/rust/utils/run-locally/src/cosmos/types.rs +++ b/rust/utils/run-locally/src/cosmos/types.rs @@ -48,6 +48,8 @@ pub struct Codes { pub hpl_igp_gas_oracle: u64, pub hpl_ism_multisig: u64, pub hpl_ism_routing: u64, + pub hpl_test_mock_ism: u64, + pub hpl_test_mock_msg_receiver: u64, pub hpl_token_cw20: u64, pub hpl_token_native: u64, pub hpl_mailbox: u64, @@ -63,6 +65,7 @@ pub struct Deployments { pub ism_multisig: String, pub hub: String, pub mailbox: String, + pub mock_receiver: String, pub va: String, } @@ -71,6 +74,11 @@ pub struct BalanceResponse { pub balances: Vec, } +#[derive(serde::Serialize, serde::Deserialize)] +pub struct CliWasmQueryResponse { + pub data: T, +} + #[derive(serde::Serialize, serde::Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct AgentConfigAddrs { @@ -127,10 +135,6 @@ impl AgentConfig { let cli = OsmosisCLI::new(bin, network.launch_resp.home_path.to_str().unwrap()); let validator = cli.get_keypair(validator); - println!("val_priv : {}", hex::encode(validator.priv_key.to_bytes())); - println!("val_pub : {}", hex::encode(validator.pub_key_to_binary())); - println!("val_addr : {}", validator.addr("osmo")); - AgentConfig { name: format!("cosmos-test-{}", network.domain), domain: network.domain, From f290e66637d8cc23f1f2070e33b719cb8467146a Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Fri, 25 Aug 2023 19:35:18 +0000 Subject: [PATCH 045/142] slow blocktime --- rust/utils/run-locally/src/cosmos/cli.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/utils/run-locally/src/cosmos/cli.rs b/rust/utils/run-locally/src/cosmos/cli.rs index b529be51ca..126687c12f 100644 --- a/rust/utils/run-locally/src/cosmos/cli.rs +++ b/rust/utils/run-locally/src/cosmos/cli.rs @@ -75,7 +75,7 @@ impl OsmosisCLI { node_config_path, Box::new(|v| { v["p2p"]["pex"] = toml_edit::value(false); - v["consensus"]["timeout_commit"] = toml_edit::value("0.1s"); + v["consensus"]["timeout_commit"] = toml_edit::value("0.5s"); }), ); From 78f90bcc5a103a3f94ca41e2ab7f936d99ed3576 Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Fri, 25 Aug 2023 19:40:41 +0000 Subject: [PATCH 046/142] archive mode --- rust/utils/run-locally/src/cosmos/cli.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/rust/utils/run-locally/src/cosmos/cli.rs b/rust/utils/run-locally/src/cosmos/cli.rs index 126687c12f..8b1be42b10 100644 --- a/rust/utils/run-locally/src/cosmos/cli.rs +++ b/rust/utils/run-locally/src/cosmos/cli.rs @@ -85,6 +85,7 @@ impl OsmosisCLI { app_config_path, Box::new(|v| { v["minimum-gas-prices"] = toml_edit::value("0.025uosmo"); + v["pruning"] = toml_edit::value("nothing"); // archive v["api"]["enable"] = toml_edit::value(false); v["grpc-web"]["enable"] = toml_edit::value(false); }), From 346de462d6c27641908d6a3f40bdaf5e9c76c5db Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Mon, 11 Sep 2023 02:01:18 +0000 Subject: [PATCH 047/142] cli source --- rust/utils/run-locally/src/cosmos/mod.rs | 83 ++++++++++++++++++------ 1 file changed, 62 insertions(+), 21 deletions(-) diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index da31ad0b74..5b0cd058ff 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -30,8 +30,11 @@ use cli::{OsmosisCLI, OsmosisEndpoint}; use self::deploy::deploy_cw_hyperlane; -const OSMOSIS_CLI_GIT: &str = "https://github.com/osmosis-labs/osmosis"; -const OSMOSIS_CLI_VERSION: &str = "16.1.1"; +// const OSMOSIS_CLI_GIT: &str = "https://github.com/osmosis-labs/osmosis"; +// const OSMOSIS_CLI_VERSION: &str = "19.0.0"; + +const OSMOSIS_CLI_GIT: &str = "https://github.com/hashableric/osmosis"; +const OSMOSIS_CLI_VERSION: &str = "19.0.0-mnts"; const KEY_HPL_VALIDATOR: (&str,&str) = ("hpl-validator", "guard evolve region sentence danger sort despair eye deputy brave trim actor left recipe debate document upgrade sustain bus cage afford half demand pigeon"); const KEY_HPL_RELAYER: (&str,&str) = ("hpl-relayer", "moral item damp melt gloom vendor notice head assume balance doctor retire fashion trim find biology saddle undo switch fault cattle toast drip empty"); @@ -73,26 +76,49 @@ fn make_target() -> String { format!("{}-{}", os, arch) } -pub fn install_cli(dir: Option) -> PathBuf { - let target = make_target(); +pub enum CLISource { + Local { path: String }, + Remote { url: String, version: String }, +} - let dir_path = match dir { - Some(path) => path, - None => tempdir().unwrap().into_path(), - }; - let dir_path = dir_path.to_str().unwrap(); +impl Default for CLISource { + fn default() -> Self { + Self::Remote { + url: OSMOSIS_CLI_GIT.to_string(), + version: OSMOSIS_CLI_VERSION.to_string(), + } + } +} - let release_name = format!("osmosisd-{OSMOSIS_CLI_VERSION}-{target}"); - let release_comp = format!("{release_name}.tar.gz"); +impl CLISource { + fn install_remote(dir: Option, git: String, version: String) -> PathBuf { + let target = make_target(); - log!("Downloading Osmosis CLI v{}", OSMOSIS_CLI_VERSION); - let uri = format!("{OSMOSIS_CLI_GIT}/releases/download/v{OSMOSIS_CLI_VERSION}/{release_comp}"); - download(&release_comp, &uri, dir_path); + let dir_path = match dir { + Some(path) => path, + None => tempdir().unwrap().into_path(), + }; + let dir_path = dir_path.to_str().unwrap(); - log!("Uncompressing Osmosis release"); - unzip(&release_comp, dir_path); + let release_name = format!("osmosisd-{version}-{target}"); + let release_comp = format!("{release_name}.tar.gz"); + + log!("Downloading Osmosis CLI v{}", version); + let uri = format!("{git}/releases/download/v{version}/{release_comp}"); + download(&release_comp, &uri, dir_path); + + log!("Uncompressing Osmosis release"); + unzip(&release_comp, dir_path); - concat_path(dir_path, "osmosisd") + concat_path(dir_path, "osmosisd") + } + + pub fn install(self, dir: Option) -> PathBuf { + match self { + CLISource::Local { path } => path.into(), + CLISource::Remote { url, version } => Self::install_remote(dir, url, version), + } + } } pub fn install_codes(dir: Option) -> BTreeMap { @@ -128,9 +154,15 @@ pub fn install_codes(dir: Option) -> BTreeMap { #[allow(dead_code)] pub fn install_cosmos( cli_dir: Option, + cli_src: Option, codes_dir: Option, ) -> (PathBuf, BTreeMap) { - let osmosisd = install_cli(cli_dir); + let osmosisd = cli_src + .unwrap_or(CLISource::Remote { + url: OSMOSIS_CLI_GIT.to_string(), + version: OSMOSIS_CLI_VERSION.to_string(), + }) + .install(cli_dir); let codes = install_codes(codes_dir); (osmosisd, codes) @@ -280,7 +312,12 @@ fn launch_cosmos_relayer(agent_config_path: PathBuf, relay_chains: Vec) #[allow(dead_code)] fn run_locally() { - let (osmosisd, codes) = install_cosmos(None, None); + let cli_src = Some(CLISource::Local { + path: "/Users/frostornge/dev/osmosis/eric/build/osmosisd".to_string(), + }); + // let cli_src = None; + + let (osmosisd, codes) = install_cosmos(None, cli_src, None); let addr_base = "tcp://0.0.0.0"; let default_config = CosmosConfig { @@ -409,10 +446,14 @@ fn run_locally() { agent_config_out.chains.into_keys().collect::>(), ); + sleep(Duration::from_secs(30)); // wait for 1 min + + // dispatch messages + for node in nodes.iter() { let targets = nodes .iter() - .filter(|v| v.domain == node.domain) + .filter(|v| v.domain != node.domain) .collect::>(); if !targets.is_empty() { @@ -450,7 +491,7 @@ fn run_locally() { relayer: hpl_rly.join(), }; - sleep(Duration::from_secs(1000)); // wait for 2 min + sleep(Duration::from_secs(1000)); // wait for a long time } #[cfg(test)] From 4edc9afd362a66f32beb1c1c88ceebede6bf2d29 Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Mon, 11 Sep 2023 09:57:37 +0000 Subject: [PATCH 048/142] add debug flag --- rust/utils/run-locally/src/cosmos/mod.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index 5b0cd058ff..02e73671d7 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -260,6 +260,7 @@ fn launch_cosmos_validator( agent_config: AgentConfig, agent_config_path: PathBuf, remotes: Vec, + debug: bool, ) -> AgentHandles { let validator_bin = concat_path(format!("../../{AGENT_BIN_PATH}"), "validator"); let validator_base = tempdir().unwrap(); @@ -287,13 +288,18 @@ fn launch_cosmos_validator( .hyp_env("VALIDATOR_KEY", agent_config.signer.key) .hyp_env("VALIDATOR_TYPE", agent_config.signer.typ) .hyp_env("VALIDATOR_PREFIX", "osmo1") + .hyp_env("TRACING_LEVEL", if debug { "debug" } else { "info" }) .spawn("VAL"); validator } #[apply(as_task)] -fn launch_cosmos_relayer(agent_config_path: PathBuf, relay_chains: Vec) -> AgentHandles { +fn launch_cosmos_relayer( + agent_config_path: PathBuf, + relay_chains: Vec, + debug: bool, +) -> AgentHandles { let relayer_bin = concat_path(format!("../../{AGENT_BIN_PATH}"), "relayer"); let relayer_base = tempdir().unwrap(); @@ -305,6 +311,7 @@ fn launch_cosmos_relayer(agent_config_path: PathBuf, relay_chains: Vec) .hyp_env("REORGPERIOD", "1") .hyp_env("DB", relayer_base.as_ref().to_str().unwrap()) .hyp_env("ALLOW_LOCAL_CHECKPOINT_SYNCERS", "true") + .hyp_env("TRACING_LEVEL", if debug { "debug" } else { "info" }) .spawn("RLY"); relayer @@ -312,6 +319,7 @@ fn launch_cosmos_relayer(agent_config_path: PathBuf, relay_chains: Vec) #[allow(dead_code)] fn run_locally() { + let debug = false; let cli_src = Some(CLISource::Local { path: "/Users/frostornge/dev/osmosis/eric/build/osmosisd".to_string(), }); @@ -438,15 +446,16 @@ fn run_locally() { others.remove(&chain_id); let remotes = others.into_iter().map(|v| v.0).collect::>(); - launch_cosmos_validator(agent_config, agent_config_path.clone(), remotes) + launch_cosmos_validator(agent_config, agent_config_path.clone(), remotes, debug) }) .collect::>(); let hpl_rly = launch_cosmos_relayer( agent_config_path, agent_config_out.chains.into_keys().collect::>(), + debug, ); - sleep(Duration::from_secs(30)); // wait for 1 min + sleep(Duration::from_secs(10)); // wait for 10 seconds // dispatch messages From 9c801b16d05d7e93be72b33f207d523eba984f4e Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Mon, 11 Sep 2023 09:58:19 +0000 Subject: [PATCH 049/142] fix provider --- .../hyperlane-cosmos/src/payloads/general.rs | 18 ++++++++ .../hyperlane-cosmos/src/payloads/mailbox.rs | 10 +++++ .../hyperlane-cosmos/src/providers/mod.rs | 44 +++++++++++++++++++ .../hyperlane-cosmos/src/providers/rpc.rs | 23 +++++++--- 4 files changed, 88 insertions(+), 7 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/payloads/general.rs b/rust/chains/hyperlane-cosmos/src/payloads/general.rs index b519ee83c7..ef39253229 100644 --- a/rust/chains/hyperlane-cosmos/src/payloads/general.rs +++ b/rust/chains/hyperlane-cosmos/src/payloads/general.rs @@ -2,3 +2,21 @@ use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Debug)] pub struct EmptyStruct {} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct Events { + pub events: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct Event { + #[serde(rename = "type")] + pub typ: String, + pub attributes: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct EventAttribute { + pub key: String, + pub value: String, +} diff --git a/rust/chains/hyperlane-cosmos/src/payloads/mailbox.rs b/rust/chains/hyperlane-cosmos/src/payloads/mailbox.rs index 1e724b8533..d59350072e 100644 --- a/rust/chains/hyperlane-cosmos/src/payloads/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/payloads/mailbox.rs @@ -10,6 +10,16 @@ pub struct CountRequest { pub count: EmptyStruct, } +#[derive(Serialize, Deserialize, Debug)] +pub struct ISMSpecifierRequest { + pub interchain_security_module: Vec<()>, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct ISMSpecifierResponse { + pub ism: Option, +} + #[derive(Serialize, Deserialize, Debug)] pub struct DefaultIsmRequest { pub default_ism: EmptyStruct, diff --git a/rust/chains/hyperlane-cosmos/src/providers/mod.rs b/rust/chains/hyperlane-cosmos/src/providers/mod.rs index b9416e7393..44b9f81138 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/mod.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/mod.rs @@ -1,4 +1,48 @@ +use async_trait::async_trait; +use hyperlane_core::{ + BlockInfo, ChainResult, HyperlaneChain, HyperlaneDomain, HyperlaneProvider, TxnInfo, H256, +}; + /// cosmos grpc provider pub mod grpc; /// cosmos rpc provider pub mod rpc; + +#[derive(Debug)] +pub struct CosmosProvider { + domain: HyperlaneDomain, +} + +impl CosmosProvider { + pub fn new(domain: HyperlaneDomain) -> Self { + Self { domain } + } +} + +impl HyperlaneChain for CosmosProvider { + fn domain(&self) -> &HyperlaneDomain { + &self.domain + } + + fn provider(&self) -> Box { + Box::new(CosmosProvider { + domain: self.domain.clone(), + }) + } +} + +#[async_trait] +impl HyperlaneProvider for CosmosProvider { + async fn get_block_by_hash(&self, _hash: &H256) -> ChainResult { + todo!() // FIXME + } + + async fn get_txn_by_hash(&self, _hash: &H256) -> ChainResult { + todo!() // FIXME + } + + async fn is_contract(&self, _address: &H256) -> ChainResult { + // FIXME + Ok(true) + } +} diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index 24f356754a..0b698fc82b 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -1,11 +1,12 @@ +use crate::binary::h256_to_h512; +use crate::payloads::general::{EventAttribute, Events}; use async_trait::async_trait; use cosmrs::rpc::client::{Client, CompatMode, HttpClient}; -use cosmrs::tendermint::abci::EventAttribute; use cosmrs::tendermint::hash::Algorithm; use cosmrs::tendermint::Hash; -use hyperlane_core::{ChainResult, ContractLocator, HyperlaneDomain, LogMeta, H256, H512, U256}; +use hyperlane_core::{ChainResult, ContractLocator, HyperlaneDomain, LogMeta, H256, U256}; use sha256::digest; -use crate::binary::h256_to_h512; +use tracing::debug; use crate::verify::{self, bech32_decode}; use crate::ConnectionConf; @@ -119,16 +120,24 @@ impl WasmIndexer for CosmosWasmIndexer { for (idx, tx) in tx_results.iter().enumerate() { let tx_hash = tx_hash[idx]; + if tx.code.is_err() { + debug!("tx {:?} has failed. skip!", tx_hash); + continue; + } + let mut available = false; let mut parse_result: Vec<(T, LogMeta)> = vec![]; - for (log_idx, event) in tx.events.clone().iter().enumerate() { - if event.kind.as_str().starts_with(Self::WASM_TYPE) + let logs = serde_json::from_str::>(&tx.log)?; + let logs = logs.first().unwrap(); + + for (log_idx, event) in logs.events.clone().into_iter().enumerate() { + if event.typ.as_str().starts_with(Self::WASM_TYPE) && event.attributes[0].value == addr { available = true; - } else if event.kind.as_str() != self.event_type { + } else if event.typ.as_str() != self.event_type { continue; } @@ -137,7 +146,7 @@ impl WasmIndexer for CosmosWasmIndexer { address: bech32_decode(addr.clone()), block_number: block_number as u64, block_hash: H256::from_slice(block.block_id.hash.as_bytes()), - transaction_id: h256_to_h512(tx_hash.clone()), + transaction_id: h256_to_h512(tx_hash), transaction_index: idx as u64, log_index: U256::from(log_idx), }; From 1cf319aa5b83c601899f6a97c7a29c99b7d2e91d Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Mon, 11 Sep 2023 09:59:00 +0000 Subject: [PATCH 050/142] label line needs fix --- rust/hyperlane-base/src/settings/chains.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rust/hyperlane-base/src/settings/chains.rs b/rust/hyperlane-base/src/settings/chains.rs index 1772e40f31..a4a6d7b97e 100644 --- a/rust/hyperlane-base/src/settings/chains.rs +++ b/rust/hyperlane-base/src/settings/chains.rs @@ -471,7 +471,7 @@ impl ChainConf { )); Ok(ism as Box) } - ChainConnectionConf::Cosmos(_conf) => todo!(), + ChainConnectionConf::Cosmos(_conf) => todo!(), // FIXME } .context(ctx) } @@ -534,7 +534,7 @@ impl ChainConf { ChainConnectionConf::Cosmos(conf) => { let signer = self.cosmos_signer().await.context(ctx)?; let ism = Box::new(h_cosmos::CosmosRoutingIsm::new( - conf.clone(), + &conf.clone(), locator.clone(), signer.unwrap().clone(), )); From fa107496b8287d7822dcec7988ebb3e9a42b9fcd Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Mon, 11 Sep 2023 09:59:16 +0000 Subject: [PATCH 051/142] apply fix to all contracts --- .../hyperlane-cosmos/src/interchain_gas.rs | 6 +- .../src/interchain_security_module.rs | 9 +++ rust/chains/hyperlane-cosmos/src/lib.rs | 8 +- rust/chains/hyperlane-cosmos/src/mailbox.rs | 38 ++++++--- .../hyperlane-cosmos/src/multisig_ism.rs | 4 +- rust/chains/hyperlane-cosmos/src/provider.rs | 79 ------------------- .../hyperlane-cosmos/src/routing_ism.rs | 10 +-- .../src/validator_announce.rs | 10 +-- 8 files changed, 55 insertions(+), 109 deletions(-) create mode 100644 rust/chains/hyperlane-cosmos/src/interchain_security_module.rs delete mode 100644 rust/chains/hyperlane-cosmos/src/provider.rs diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index b954edf1f7..9bd5e06737 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -1,5 +1,4 @@ use async_trait::async_trait; -use cosmrs::tendermint::abci::EventAttribute; use hyperlane_core::{ ChainResult, ContractLocator, HyperlaneChain, HyperlaneContract, Indexer, InterchainGasPaymaster, SequenceIndexer, U256, @@ -9,9 +8,10 @@ use std::ops::RangeInclusive; use tracing::info; use crate::grpc::WasmGrpcProvider; +use crate::payloads::general::EventAttribute; use crate::rpc::{CosmosWasmIndexer, WasmIndexer}; use crate::signers::Signer; -use crate::ConnectionConf; +use crate::{ConnectionConf, CosmosProvider}; /// A reference to a InterchainGasPaymaster contract on some Cosmos chain #[derive(Debug)] @@ -35,7 +35,7 @@ impl HyperlaneChain for CosmosInterchainGasPaymaster { } fn provider(&self) -> Box { - todo!() + Box::new(CosmosProvider::new(self.domain.clone())) } } diff --git a/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs new file mode 100644 index 0000000000..ac38bde418 --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs @@ -0,0 +1,9 @@ +use async_trait::async_trait; +use hyperlane_core::InterchainSecurityModule; + +pub struct CosmosInterchainSecurityModule {} + +// TODO +// #[async_trait] +// impl InterchainSecurityModule for CosmosInterchainSecurityModule { +// } diff --git a/rust/chains/hyperlane-cosmos/src/lib.rs b/rust/chains/hyperlane-cosmos/src/lib.rs index 1669f7dc15..99123ce3ad 100644 --- a/rust/chains/hyperlane-cosmos/src/lib.rs +++ b/rust/chains/hyperlane-cosmos/src/lib.rs @@ -7,6 +7,8 @@ mod contracts; mod interchain_gas; +mod interchain_security_module; +mod libs; mod mailbox; mod multisig_ism; mod payloads; @@ -15,11 +17,11 @@ mod routing_ism; mod signers; mod trait_builder; mod validator_announce; -mod libs; pub use self::{ - interchain_gas::*, mailbox::*, multisig_ism::*, providers::*, routing_ism::*, signers::*, - trait_builder::*, trait_builder::*, validator_announce::*, validator_announce::*, libs::*, + interchain_gas::*, interchain_security_module::*, libs::*, mailbox::*, multisig_ism::*, + providers::*, routing_ism::*, signers::*, trait_builder::*, trait_builder::*, + validator_announce::*, validator_announce::*, }; /// Safe default imports of commonly used traits/types. diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 59b260261c..98ded1f2e2 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -4,23 +4,24 @@ use std::ops::RangeInclusive; use std::str::FromStr; use crate::grpc::{WasmGrpcProvider, WasmProvider}; +use crate::payloads::general::EventAttribute; use crate::payloads::mailbox::{ProcessMessageRequest, ProcessMessageRequestInner}; use crate::payloads::{general, mailbox}; use crate::rpc::{CosmosWasmIndexer, WasmIndexer}; +use crate::CosmosProvider; use crate::{signers::Signer, verify, ConnectionConf}; use async_trait::async_trait; use cosmrs::proto::cosmos::base::abci::v1beta1::TxResponse; use cosmrs::proto::cosmos::tx::v1beta1::SimulateResponse; -use cosmrs::tendermint::abci::EventAttribute; use hyperlane_core::{ accumulator::incremental::IncrementalMerkle, utils::fmt_bytes, ChainResult, Checkpoint, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneMessage, HyperlaneProvider, Indexer, LogMeta, Mailbox, TxCostEstimate, TxOutcome, H256, U256, }; use hyperlane_core::{ContractLocator, MessageIndexer, RawHyperlaneMessage, SequenceIndexer, H512}; -use tracing::{info, instrument}; +use tracing::{info, instrument, warn}; /// A reference to a Mailbox contract on some Cosmos chain pub struct CosmosMailbox { @@ -60,7 +61,7 @@ impl HyperlaneChain for CosmosMailbox { } fn provider(&self) -> Box { - todo!() + Box::new(CosmosProvider::new(self.domain.clone())) } } @@ -126,10 +127,23 @@ impl Mailbox for CosmosMailbox { message_delivered: mailbox::DeliveredRequestInner { id }, }; - let data = self.provider.wasm_query(payload, None).await?; - let response: mailbox::DeliveredResponse = serde_json::from_slice(&data)?; + let delivered = match self.provider.wasm_query(payload, None).await { + Ok(v) => { + let response: mailbox::DeliveredResponse = serde_json::from_slice(&v)?; + + response.delivered + } + Err(err) => { + warn!( + "error while checking the message delivery status: {:?}", + err + ); + + false + } + }; - Ok(response.delivered) + Ok(delivered) } #[instrument(level = "debug", err, ret, skip(self))] @@ -167,15 +181,19 @@ impl Mailbox for CosmosMailbox { async fn recipient_ism(&self, recipient: H256) -> ChainResult { let address = verify::digest_to_addr(recipient, &self.signer.prefix)?; - let payload = mailbox::DefaultIsmRequest { - default_ism: general::EmptyStruct {}, + let payload = mailbox::ISMSpecifierRequest { + interchain_security_module: vec![], }; let data = self.provider.wasm_query_to(address, payload, None).await?; - let response: mailbox::DefaultIsmResponse = serde_json::from_slice(&data)?; + + let response: mailbox::ISMSpecifierResponse = serde_json::from_slice(&data)?; // convert Hex to H256 - let ism = H256::from_slice(&hex::decode(response.default_ism)?); + let ism = response.ism.unwrap_or_else(|| { + "0000000000000000000000000000000000000000000000000000000000000000".to_string() + }); + let ism = H256::from_slice(&hex::decode(ism)?); Ok(ism) } diff --git a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs index d3c110563f..9b6942a209 100644 --- a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs @@ -1,7 +1,7 @@ use crate::{ grpc::{WasmGrpcProvider, WasmProvider}, signers::Signer, - ConnectionConf, + ConnectionConf, CosmosProvider, }; use async_trait::async_trait; use hyperlane_core::{ @@ -51,7 +51,7 @@ impl HyperlaneChain for CosmosMultisigIsm { } fn provider(&self) -> Box { - todo!() + Box::new(CosmosProvider::new(self.domain.clone())) } } diff --git a/rust/chains/hyperlane-cosmos/src/provider.rs b/rust/chains/hyperlane-cosmos/src/provider.rs deleted file mode 100644 index 37879418bd..0000000000 --- a/rust/chains/hyperlane-cosmos/src/provider.rs +++ /dev/null @@ -1,79 +0,0 @@ -use std::{fmt, sync::Arc}; - -use async_trait::async_trait; - -use cosmrs::tendermint::{hash::Algorithm, Hash}; -use hyperlane_core::{ - BlockInfo, ChainCommunicationError, ChainResult, HyperlaneChain, HyperlaneDomain, - HyperlaneProvider, TxnInfo, H256, -}; -use tendermint_rpc::{client::CompatMode, Client as CosmosClient}; - -/// A wrapper around a cosmos provider to get generic blockchain information. -#[derive(Debug, Clone)] -pub struct CosmosProvider -where - C: CosmosClient + Send + Sync + fmt::Debug + 'static, -{ - compat_mode: CompatMode, - domain: HyperlaneDomain, - provider: Arc, -} - -impl HyperlaneChain for CosmosProvider -where - C: CosmosClient + Send + Sync + fmt::Debug + 'static, -{ - fn domain(&self) -> &HyperlaneDomain { - &self.domain - } - - fn provider(&self) -> Box { - Box::new(CosmosProvider { - compat_mode: self.compat_mode, - domain: self.domain.clone(), - provider: self.provider.clone(), - }) - } -} - -#[async_trait] -impl HyperlaneProvider for CosmosProvider -where - C: CosmosClient + Send + fmt::Debug + Sync + 'static, -{ - async fn get_block_by_hash(&self, hash: &H256) -> ChainResult { - // hash formats sha256 digest in bytes format (32bytes) - - // get block info from cosmos chain - let tm_hash: Hash = Hash::from_bytes(Algorithm::Sha256, hash.as_bytes()).unwrap(); - let block_info = self.provider.block_by_hash(tm_hash).await?; - - match block_info.block { - Some(block) => { - let block_hash = block.header.hash(); - let block_number = block.header.height.value(); - let block_timestamp = block.header.time; - - Ok(BlockInfo { - hash: *hash, - timestamp: block_timestamp.unix_timestamp().try_into().unwrap(), - number: block_number, - }) - } - None => Err(ChainCommunicationError::BlockNotFound(*hash)), - } - } - - async fn get_txn_by_hash(&self, hash: &H256) -> ChainResult { - // hash formats sha256 digest in bytes format (32bytes) - - let tm_hash: Hash = Hash::from_bytes(Algorithm::Sha256, hash.as_bytes()).unwrap(); - let txn_info = self.provider.tx(tm_hash, true).await?; - - todo!() - } - async fn is_contract(&self, address: &H256) -> ChainResult { - todo!() - } -} diff --git a/rust/chains/hyperlane-cosmos/src/routing_ism.rs b/rust/chains/hyperlane-cosmos/src/routing_ism.rs index c313070094..10ad96cb31 100644 --- a/rust/chains/hyperlane-cosmos/src/routing_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/routing_ism.rs @@ -10,29 +10,25 @@ use crate::{ payloads::ism_routes::{IsmRouteRequest, IsmRouteRequestInner, IsmRouteRespnose}, signers::Signer, verify::bech32_decode, - ConnectionConf, + ConnectionConf, CosmosProvider, }; /// A reference to a RoutingIsm contract on some Cosmos chain #[derive(Debug)] pub struct CosmosRoutingIsm { - _conf: ConnectionConf, domain: HyperlaneDomain, address: H256, - _signer: Signer, provider: Box, } impl CosmosRoutingIsm { /// create a new instance of CosmosRoutingIsm - pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { + pub fn new(conf: &ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); Self { - _conf: conf, domain: locator.domain.clone(), address: locator.address, - _signer: signer, provider: Box::new(provider), } } @@ -50,7 +46,7 @@ impl HyperlaneChain for CosmosRoutingIsm { } fn provider(&self) -> Box { - todo!() + Box::new(CosmosProvider::new(self.domain.clone())) } } diff --git a/rust/chains/hyperlane-cosmos/src/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/validator_announce.rs index 0de0fd985a..2a91ae28c2 100644 --- a/rust/chains/hyperlane-cosmos/src/validator_announce.rs +++ b/rust/chains/hyperlane-cosmos/src/validator_announce.rs @@ -4,7 +4,7 @@ use base64::Engine; use cosmrs::proto::cosmos::base::abci::v1beta1::TxResponse; use hyperlane_core::{ Announcement, ChainResult, ContractLocator, HyperlaneChain, HyperlaneContract, HyperlaneDomain, - HyperlaneProvider, SignedType, TxOutcome, ValidatorAnnounce, H160, H256, H512, U256, + HyperlaneProvider, SignedType, TxOutcome, ValidatorAnnounce, H256, U256, }; use crate::{ @@ -14,7 +14,7 @@ use crate::{ GetAnnounceStorageLocationsRequestInner, }, signers::Signer, - ConnectionConf, + ConnectionConf, CosmosProvider, }; /// A reference to a ValidatorAnnounce contract on some Cosmos chain @@ -23,7 +23,7 @@ pub struct CosmosValidatorAnnounce { _conf: ConnectionConf, domain: HyperlaneDomain, address: H256, - signer: Signer, + _signer: Signer, provider: Box, } @@ -36,7 +36,7 @@ impl CosmosValidatorAnnounce { _conf: conf, domain: locator.domain.clone(), address: locator.address, - signer: signer, + _signer: signer, provider: Box::new(provider), } } @@ -54,7 +54,7 @@ impl HyperlaneChain for CosmosValidatorAnnounce { } fn provider(&self) -> Box { - todo!() + Box::new(CosmosProvider::new(self.domain.clone())) } } From 2438d40254e8762489feaaa14b52a32c57e283f7 Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Tue, 12 Sep 2023 09:08:01 +0000 Subject: [PATCH 052/142] process_message --- rust/chains/hyperlane-cosmos/src/payloads/mailbox.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/chains/hyperlane-cosmos/src/payloads/mailbox.rs b/rust/chains/hyperlane-cosmos/src/payloads/mailbox.rs index d59350072e..74d4e52f7d 100644 --- a/rust/chains/hyperlane-cosmos/src/payloads/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/payloads/mailbox.rs @@ -42,7 +42,7 @@ pub struct MerkleTreeRequest { #[derive(Serialize, Deserialize, Debug)] pub struct ProcessMessageRequest { - pub process_message: ProcessMessageRequestInner, + pub process: ProcessMessageRequestInner, } #[derive(Serialize, Deserialize, Debug)] From 5e3ac40e1367ab08025dccfd4356fce61054b5af Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Tue, 12 Sep 2023 09:08:39 +0000 Subject: [PATCH 053/142] ism --- rust/chains/hyperlane-cosmos/Cargo.toml | 1 + .../src/interchain_security_module.rs | 91 +++++++++++++++++-- rust/chains/hyperlane-cosmos/src/mailbox.rs | 36 ++++---- 3 files changed, 102 insertions(+), 26 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/Cargo.toml b/rust/chains/hyperlane-cosmos/Cargo.toml index fcdb4c37d9..15233ce2a8 100644 --- a/rust/chains/hyperlane-cosmos/Cargo.toml +++ b/rust/chains/hyperlane-cosmos/Cargo.toml @@ -26,6 +26,7 @@ hyper = { workspace = true } hyper-tls = { workspace = true } sha256 = { workspace = true } hex = { workspace = true } +hpl-interface = { version = "0.0.1" } hyperlane-core = { path = "../../hyperlane-core" } diff --git a/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs index ac38bde418..11c70fefc2 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs @@ -1,9 +1,88 @@ use async_trait::async_trait; -use hyperlane_core::InterchainSecurityModule; +use hyperlane_core::{ + ChainResult, ContractLocator, Encode, HyperlaneChain, HyperlaneContract, HyperlaneDomain, + HyperlaneMessage, HyperlaneProvider, InterchainSecurityModule, ModuleType, H256, U256, +}; -pub struct CosmosInterchainSecurityModule {} +use crate::{ + grpc::{WasmGrpcProvider, WasmProvider}, + ConnectionConf, CosmosProvider, Signer, +}; -// TODO -// #[async_trait] -// impl InterchainSecurityModule for CosmosInterchainSecurityModule { -// } +#[derive(Debug)] +pub struct CosmosInterchainSecurityModule { + domain: HyperlaneDomain, + address: H256, + provider: Box, +} + +impl CosmosInterchainSecurityModule { + pub fn new(conf: &ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { + let provider: WasmGrpcProvider = + WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); + + Self { + domain: locator.domain.clone(), + address: locator.address, + provider: Box::new(provider), + } + } +} + +impl HyperlaneContract for CosmosInterchainSecurityModule { + fn address(&self) -> H256 { + self.address + } +} + +impl HyperlaneChain for CosmosInterchainSecurityModule { + fn domain(&self) -> &HyperlaneDomain { + &self.domain + } + + fn provider(&self) -> Box { + Box::new(CosmosProvider::new(self.domain.clone())) + } +} + +fn ism_type_to_module_type(ism_type: hpl_interface::ism::ISMType) -> ModuleType { + match ism_type { + hpl_interface::ism::ISMType::Unused => ModuleType::Unused, + hpl_interface::ism::ISMType::Routing => ModuleType::Routing, + hpl_interface::ism::ISMType::Aggregation => ModuleType::Aggregation, + hpl_interface::ism::ISMType::LegacyMultisig => ModuleType::LegacyMultisig, + hpl_interface::ism::ISMType::Multisig => ModuleType::LegacyMultisig, + _ => ModuleType::Null, + } +} + +#[async_trait] +impl InterchainSecurityModule for CosmosInterchainSecurityModule { + /// Returns the module type of the ISM compliant with the corresponding + /// metadata offchain fetching and onchain formatting standard. + async fn module_type(&self) -> ChainResult { + let query = hpl_interface::ism::ISMQueryMsg::ModuleType {}; + + let data = self.provider.wasm_query(query, None).await?; + + // FIXME: consistency + let resp_a = serde_json::from_slice::(&data); + let resp_b = serde_json::from_slice::(&data); + + Ok(match (resp_a, resp_b) { + (Ok(v), _) => ism_type_to_module_type(v), + (_, Ok(v)) => ism_type_to_module_type(v.typ), + _ => ModuleType::Null, + }) + } + + /// Dry runs the `verify()` ISM call and returns `Some(gas_estimate)` if the call + /// succeeds. + async fn dry_run_verify( + &self, + message: &HyperlaneMessage, + metadata: &[u8], + ) -> ChainResult> { + Ok(Some(U256::from(1000))) // TODO + } +} diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 98ded1f2e2..c6c6067d5b 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -1,4 +1,5 @@ use std::fmt::{Debug, Formatter}; +use std::io::Cursor; use std::num::NonZeroU64; use std::ops::RangeInclusive; use std::str::FromStr; @@ -20,7 +21,9 @@ use hyperlane_core::{ HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneMessage, HyperlaneProvider, Indexer, LogMeta, Mailbox, TxCostEstimate, TxOutcome, H256, U256, }; -use hyperlane_core::{ContractLocator, MessageIndexer, RawHyperlaneMessage, SequenceIndexer, H512}; +use hyperlane_core::{ + ContractLocator, Decode, MessageIndexer, RawHyperlaneMessage, SequenceIndexer, H512, +}; use tracing::{info, instrument, warn}; /// A reference to a Mailbox contract on some Cosmos chain @@ -190,10 +193,13 @@ impl Mailbox for CosmosMailbox { let response: mailbox::ISMSpecifierResponse = serde_json::from_slice(&data)?; // convert Hex to H256 - let ism = response.ism.unwrap_or_else(|| { - "0000000000000000000000000000000000000000000000000000000000000000".to_string() - }); - let ism = H256::from_slice(&hex::decode(ism)?); + let default_ism = self.default_ism().await?; + let ism = response + .ism + .map(hex::decode) + .transpose()? + .map(|v| H256::from_slice(&v)) + .unwrap_or(default_ism); Ok(ism) } @@ -205,7 +211,7 @@ impl Mailbox for CosmosMailbox { tx_gas_limit: Option, ) -> ChainResult { let process_message = ProcessMessageRequest { - process_message: ProcessMessageRequestInner { + process: ProcessMessageRequestInner { message: hex::encode(RawHyperlaneMessage::from(message)), metadata: hex::encode(metadata), }, @@ -230,7 +236,7 @@ impl Mailbox for CosmosMailbox { metadata: &[u8], ) -> ChainResult { let process_message = ProcessMessageRequest { - process_message: ProcessMessageRequestInner { + process: ProcessMessageRequestInner { message: hex::encode(RawHyperlaneMessage::from(message)), metadata: hex::encode(metadata), }, @@ -285,19 +291,9 @@ impl CosmosMailboxIndexer { let key = attr.key.as_str(); let value = attr.value.as_str(); - match key { - "version" => res.version = value.parse().unwrap(), - "nonce" => res.nonce = value.parse().unwrap(), - "origin" => res.origin = value.parse().unwrap(), - "sender" => { - res.sender = H256::from_slice(hex::decode(value).unwrap().as_slice()) - } - "destination" => res.destination = value.parse().unwrap(), - "recipient" => { - res.recipient = H256::from_slice(hex::decode(value).unwrap().as_slice()) - } - "body" => res.body = hex::decode(value).unwrap(), - _ => {} + if key == "message" { + let mut reader = Cursor::new(hex::decode(value).unwrap()); + res = HyperlaneMessage::read_from(&mut reader).unwrap(); } } From 5216d5aac02fbc8df5a8410a9bbfd22673dbb799 Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Tue, 12 Sep 2023 09:09:05 +0000 Subject: [PATCH 054/142] builder --- rust/Cargo.lock | 1 + rust/hyperlane-base/src/settings/chains.rs | 10 +++++++++- rust/utils/run-locally/src/cosmos/mod.rs | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 29f0298e44..529a9cb39e 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -4108,6 +4108,7 @@ dependencies = [ "bech32 0.9.1", "cosmrs", "hex 0.4.3", + "hpl-interface", "hyper", "hyper-tls", "hyperlane-core", diff --git a/rust/hyperlane-base/src/settings/chains.rs b/rust/hyperlane-base/src/settings/chains.rs index a4a6d7b97e..f1b1652041 100644 --- a/rust/hyperlane-base/src/settings/chains.rs +++ b/rust/hyperlane-base/src/settings/chains.rs @@ -471,7 +471,15 @@ impl ChainConf { )); Ok(ism as Box) } - ChainConnectionConf::Cosmos(_conf) => todo!(), // FIXME + ChainConnectionConf::Cosmos(conf) => { + let signer = self.cosmos_signer().await.context(ctx)?; + let ism = Box::new(h_cosmos::CosmosInterchainSecurityModule::new( + conf, + locator, + signer.unwrap(), + )); + Ok(ism as Box) + } } .context(ctx) } diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index 02e73671d7..50b7996c9e 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -495,7 +495,7 @@ fn run_locally() { } } - let stack = CosmosHyperlaneStack { + let _stack = CosmosHyperlaneStack { validators: hpl_val.into_iter().map(|v| v.join()).collect(), relayer: hpl_rly.join(), }; From 8da14b071540dac97aeb7661426b151cb2fb14ef Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Tue, 12 Sep 2023 09:50:50 +0000 Subject: [PATCH 055/142] temp fix --- rust/chains/hyperlane-cosmos/src/interchain_security_module.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs index 11c70fefc2..21753da869 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs @@ -52,6 +52,7 @@ fn ism_type_to_module_type(ism_type: hpl_interface::ism::ISMType) -> ModuleType hpl_interface::ism::ISMType::Aggregation => ModuleType::Aggregation, hpl_interface::ism::ISMType::LegacyMultisig => ModuleType::LegacyMultisig, hpl_interface::ism::ISMType::Multisig => ModuleType::LegacyMultisig, + hpl_interface::ism::ISMType::Owned => ModuleType::LegacyMultisig, _ => ModuleType::Null, } } From 93902176a1f6b35269257698e04d1eab98897d59 Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Tue, 12 Sep 2023 10:16:35 +0000 Subject: [PATCH 056/142] fix env; --- rust/utils/run-locally/src/cosmos/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index 50b7996c9e..fda9521c7d 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -310,7 +310,7 @@ fn launch_cosmos_relayer( .hyp_env("RELAYCHAINS", relay_chains.join(",")) .hyp_env("REORGPERIOD", "1") .hyp_env("DB", relayer_base.as_ref().to_str().unwrap()) - .hyp_env("ALLOW_LOCAL_CHECKPOINT_SYNCERS", "true") + .hyp_env("ALLOWLOCALCHECKPOINTSYNCERS", "true") .hyp_env("TRACING_LEVEL", if debug { "debug" } else { "info" }) .spawn("RLY"); From 5ec75f74b61e6af533fb69c0fcc9d5c5f8a62fcd Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Tue, 12 Sep 2023 10:33:32 +0000 Subject: [PATCH 057/142] temp update --- .../hyperlane-cosmos/src/interchain_security_module.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs index 21753da869..fff8878967 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs @@ -50,9 +50,9 @@ fn ism_type_to_module_type(ism_type: hpl_interface::ism::ISMType) -> ModuleType hpl_interface::ism::ISMType::Unused => ModuleType::Unused, hpl_interface::ism::ISMType::Routing => ModuleType::Routing, hpl_interface::ism::ISMType::Aggregation => ModuleType::Aggregation, - hpl_interface::ism::ISMType::LegacyMultisig => ModuleType::LegacyMultisig, - hpl_interface::ism::ISMType::Multisig => ModuleType::LegacyMultisig, - hpl_interface::ism::ISMType::Owned => ModuleType::LegacyMultisig, + hpl_interface::ism::ISMType::LegacyMultisig => ModuleType::MessageIdMultisig, + hpl_interface::ism::ISMType::Multisig => ModuleType::MessageIdMultisig, + hpl_interface::ism::ISMType::Owned => ModuleType::MessageIdMultisig, _ => ModuleType::Null, } } From 0a5dbaecef3cdc54d7bb053ee69c8367fc825ab4 Mon Sep 17 00:00:00 2001 From: hashableric Date: Wed, 13 Sep 2023 18:23:54 +0900 Subject: [PATCH 058/142] feat: run code successfully --- rust/Cargo.lock | 2 ++ rust/Cargo.toml | 1 + rust/agents/relayer/src/msg/metadata/base.rs | 1 + .../metadata/multisig/message_id_multisig.rs | 1 + .../hyperlane-cosmos/src/libs/verify.rs | 32 ++++++++++++++---- rust/chains/hyperlane-cosmos/src/mailbox.rs | 6 +++- rust/hyperlane-base/src/types/multisig.rs | 32 ++++++++++++++---- rust/hyperlane-core/Cargo.toml | 2 ++ rust/hyperlane-core/src/chain.rs | 9 ++++- rust/hyperlane-core/src/traits/signing.rs | 33 +++++++++++++++++++ rust/hyperlane-core/src/types/checkpoint.rs | 10 ++++-- rust/utils/run-locally/src/cosmos/mod.rs | 30 +++++++++-------- 12 files changed, 128 insertions(+), 31 deletions(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 529a9cb39e..1415ae73ed 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -4072,11 +4072,13 @@ dependencies = [ "cosmrs", "derive-new", "derive_more", + "elliptic-curve 0.12.3", "ethers-contract", "ethers-core", "ethers-providers", "eyre", "fixed-hash 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "generic-array 0.14.7", "getrandom 0.2.10", "hex 0.4.3", "hyperlane-base", diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 91583e77a7..0877000f50 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -178,6 +178,7 @@ hyper-tls = "0.5.0" hex = "0.4.3" tendermint-rpc = { version = "0.32.0", features = ["http-client", "tokio"]} hpl-interface = "0.0.1" +elliptic-curve = "0.12.3" [workspace.dependencies.ethers] git = "https://github.com/hyperlane-xyz/ethers-rs" diff --git a/rust/agents/relayer/src/msg/metadata/base.rs b/rust/agents/relayer/src/msg/metadata/base.rs index 03da9e3b26..d97a95d4e3 100644 --- a/rust/agents/relayer/src/msg/metadata/base.rs +++ b/rust/agents/relayer/src/msg/metadata/base.rs @@ -94,6 +94,7 @@ impl MetadataBuilder for BaseMetadataBuilder { ModuleType::CcipRead => Box::new(CcipReadIsmMetadataBuilder::new(base)), _ => return Err(MetadataBuilderError::UnsupportedModuleType(module_type).into()), }; + metadata_builder .build(ism_address, message) .await diff --git a/rust/agents/relayer/src/msg/metadata/multisig/message_id_multisig.rs b/rust/agents/relayer/src/msg/metadata/multisig/message_id_multisig.rs index 17374d5ea6..285eef2c3f 100644 --- a/rust/agents/relayer/src/msg/metadata/multisig/message_id_multisig.rs +++ b/rust/agents/relayer/src/msg/metadata/multisig/message_id_multisig.rs @@ -9,6 +9,7 @@ use hyperlane_base::MultisigCheckpointSyncer; use hyperlane_core::{unwrap_or_none_result, HyperlaneMessage, H256}; use tracing::{debug, trace, warn}; + use crate::msg::metadata::BaseMetadataBuilder; use super::base::{MetadataToken, MultisigIsmMetadataBuilder, MultisigMetadata}; diff --git a/rust/chains/hyperlane-cosmos/src/libs/verify.rs b/rust/chains/hyperlane-cosmos/src/libs/verify.rs index 8dcbb30d5c..afee491b01 100644 --- a/rust/chains/hyperlane-cosmos/src/libs/verify.rs +++ b/rust/chains/hyperlane-cosmos/src/libs/verify.rs @@ -80,12 +80,32 @@ pub fn pub_to_addr(pub_key: Vec, prefix: &str) -> ChainResult { /// encode H256 to bech32 address pub fn priv_to_binary_addr(priv_key: Vec) -> ChainResult { - let sha_hash = sha256_digest( - SigningKey::from_slice(priv_key.as_slice()) - .unwrap() - .public_key() - .to_bytes(), - )?; + let pub_key = SigningKey::from_slice(priv_key.as_slice()) + .unwrap() + .public_key() + .to_bytes(); + + println!("pub_key: {:?}", pub_key); + let sha_hash = sha256_digest(pub_key)?; + let rip_hash = ripemd160_digest(sha_hash)?; + + Ok(H160::from_slice(rip_hash.as_slice())) +} + +/// encode H256 to bech32 address +pub fn pub_to_binary_addr(pub_key: Vec) -> ChainResult { + let sha_hash = match (pub_key.len() == 33) && (pub_key[0] == 0x02 || pub_key[0] == 0x03) { + true => sha256_digest(pub_key)?, + false => { + let comp_pub_key = vec![0x03]; + let comp_pub_key = comp_pub_key + .into_iter() + .chain(pub_key[1..33].iter().cloned()) + .collect::>(); + + sha256_digest(comp_pub_key)? + } + }; let rip_hash = ripemd160_digest(sha_hash)?; Ok(H160::from_slice(rip_hash.as_slice())) diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index c6c6067d5b..e2e11f6bcb 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -25,6 +25,7 @@ use hyperlane_core::{ ContractLocator, Decode, MessageIndexer, RawHyperlaneMessage, SequenceIndexer, H512, }; use tracing::{info, instrument, warn}; +use crate::binary::h256_to_h512; /// A reference to a Mailbox contract on some Cosmos chain pub struct CosmosMailbox { @@ -222,7 +223,7 @@ impl Mailbox for CosmosMailbox { .wasm_send(process_message, tx_gas_limit) .await?; Ok(TxOutcome { - transaction_id: H512::from_slice(hex::decode(response.txhash).unwrap().as_slice()), + transaction_id: h256_to_h512(H256::from_slice(hex::decode(response.txhash).unwrap().as_slice())), executed: response.code == 0, gas_used: U256::from(response.gas_used), gas_price: U256::from(response.gas_wanted), @@ -242,6 +243,9 @@ impl Mailbox for CosmosMailbox { }, }; + println!("process_message: {:?}", process_message); + println!("metadata: {:?}", metadata); + let response: SimulateResponse = self.provider.wasm_simulate(process_message).await?; let result = TxCostEstimate { gas_limit: U256::from(response.gas_info.unwrap().gas_used), diff --git a/rust/hyperlane-base/src/types/multisig.rs b/rust/hyperlane-base/src/types/multisig.rs index 52bfeadca7..1ea20d3364 100644 --- a/rust/hyperlane-base/src/types/multisig.rs +++ b/rust/hyperlane-base/src/types/multisig.rs @@ -3,7 +3,8 @@ use std::sync::Arc; use derive_new::new; use eyre::Result; -use tracing::{debug, instrument, trace}; +use hyperlane_cosmos::verify::pub_to_binary_addr; +use tracing::{debug, info, instrument, trace, warn}; use hyperlane_core::{MultisigSignedCheckpoint, SignedCheckpointWithMessageId, H160, H256}; @@ -105,17 +106,24 @@ impl MultisigCheckpointSyncer { let mut signed_checkpoints_per_root: HashMap> = HashMap::new(); + warn!( + "Fetching checkpoint for index {}, validator {:?}", + index, validators + ); + for validator in validators.iter() { let addr = H160::from(*validator); if let Some(checkpoint_syncer) = self.checkpoint_syncers.get(&addr) { // Gracefully ignore an error fetching the checkpoint from a validator's // checkpoint syncer, which can happen if the validator has not // signed the checkpoint at `index`. + if let Ok(Some(signed_checkpoint)) = checkpoint_syncer.fetch_checkpoint(index).await { + warn!("signed_checkpoint: {:?}", signed_checkpoint); // If the signed checkpoint is for a different index, ignore it if signed_checkpoint.value.index != index { - debug!( + info!( validator = format!("{:#x}", validator), index = index, checkpoint_index = signed_checkpoint.value.index, @@ -123,10 +131,20 @@ impl MultisigCheckpointSyncer { ); continue; } - // Ensure that the signature is actually by the validator at the current index - let signer = signed_checkpoint.recover()?; + + // Ensure that the signature is actually by the validator + let domain = + KnownHyperlaneDomain::try_from(signed_checkpoint.value.mailbox_domain)?; + + let signer = match domain.domain_protocol() { + HyperlaneDomainProtocol::Cosmos => { + pub_to_binary_addr(signed_checkpoint.recover_pubkey()?.to_vec())? + } + _ => signed_checkpoint.recover()?, + }; + if H256::from(signer) != *validator { - debug!( + info!( validator = format!("{:#x}", validator), index = index, "Checkpoint signature mismatch" @@ -156,14 +174,14 @@ impl MultisigCheckpointSyncer { return Ok(Some(checkpoint)); } } else { - debug!( + info!( validator = format!("{:#x}", validator), index = index, "Unable to find signed checkpoint" ); } } else { - debug!(%validator, "Unable to find checkpoint syncer"); + info!(%validator, "Unable to find checkpoint syncer"); continue; } } diff --git a/rust/hyperlane-core/Cargo.toml b/rust/hyperlane-core/Cargo.toml index dc758c62a0..2730f8f422 100644 --- a/rust/hyperlane-core/Cargo.toml +++ b/rust/hyperlane-core/Cargo.toml @@ -43,6 +43,8 @@ primitive-types = { workspace = true, optional = true } solana-sdk = { workspace = true, optional = true } tiny-keccak = { workspace = true, features = ["keccak"]} uint.workspace = true +generic-array = { workspace = true } +elliptic-curve = { workspace = true } [dev-dependencies] hyperlane-base = { path = "../hyperlane-base" } diff --git a/rust/hyperlane-core/src/chain.rs b/rust/hyperlane-core/src/chain.rs index d63a78379e..2987122b63 100644 --- a/rust/hyperlane-core/src/chain.rs +++ b/rust/hyperlane-core/src/chain.rs @@ -99,6 +99,12 @@ pub enum KnownHyperlaneDomain { LineaGoerli = 59140, BaseGoerli = 84531, ScrollSepolia = 534351, + + /// Cosmos local chains + #[cfg_attr(feature = "strum", strum(serialize = "cosmos-test-26657"))] + CosmosTest26657 = 26657, + #[cfg_attr(feature = "strum", strum(serialize = "cosmos-test-26658"))] + CosmosTest26658 = 26658, } #[derive(Clone)] @@ -196,7 +202,7 @@ impl KnownHyperlaneDomain { Goerli, Mumbai, Fuji, ArbitrumGoerli, OptimismGoerli, BinanceSmartChainTestnet, Alfajores, MoonbaseAlpha, Sepolia, PolygonZkEvmTestnet, LineaGoerli, BaseGoerli, ScrollSepolia, Chiado ], - LocalTestChain: [Test1, Test2, Test3, FuelTest1, SealevelTest1, SealevelTest2], + LocalTestChain: [Test1, Test2, Test3, FuelTest1, SealevelTest1, SealevelTest2, CosmosTest26657, CosmosTest26658], }) } @@ -211,6 +217,7 @@ impl KnownHyperlaneDomain { ], HyperlaneDomainProtocol::Fuel: [FuelTest1], HyperlaneDomainProtocol::Sealevel: [SealevelTest1, SealevelTest2], + HyperlaneDomainProtocol::Cosmos: [CosmosTest26657, CosmosTest26658], }) } } diff --git a/rust/hyperlane-core/src/traits/signing.rs b/rust/hyperlane-core/src/traits/signing.rs index f54e9309f4..a8622dfe6f 100644 --- a/rust/hyperlane-core/src/traits/signing.rs +++ b/rust/hyperlane-core/src/traits/signing.rs @@ -2,6 +2,11 @@ use std::fmt::{Debug, Formatter}; use async_trait::async_trait; use auto_impl::auto_impl; +use elliptic_curve::consts::U32; +use ethers_core::k256::ecdsa::recoverable::Signature as RecoverableSignature; +use ethers_core::k256::{ecdsa::Signature as K256Signature, PublicKey as K256PublicKey}; +use generic_array::GenericArray; + use serde::{ ser::{SerializeStruct, Serializer}, Deserialize, Serialize, @@ -111,9 +116,37 @@ impl SignedType { pub fn recover(&self) -> Result { let hash = ethers_core::types::H256::from(self.value.eth_signed_message_hash()); let sig = ethers_core::types::Signature::from(self.signature); + Ok(sig.recover(hash)?.into()) } + /// Recover the public key of the signer + #[cfg(feature = "ethers")] + pub fn recover_pubkey(&self) -> Result, crate::HyperlaneProtocolError> { + use elliptic_curve::sec1::ToEncodedPoint; + + let hash = ethers_core::types::H256::from(self.value.eth_signed_message_hash()); + let signature = ethers_core::types::Signature::from(self.signature); + let recoverable_signature = { + let mut r_bytes = [0u8; 32]; + let mut s_bytes = [0u8; 32]; + signature.r.to_big_endian(&mut r_bytes); + signature.s.to_big_endian(&mut s_bytes); + let gar: &GenericArray = GenericArray::from_slice(&r_bytes); + let gas: &GenericArray = GenericArray::from_slice(&s_bytes); + let sig = K256Signature::from_scalars(*gar, *gas).unwrap(); + RecoverableSignature::new(&sig, signature.recovery_id().unwrap()).unwrap() + }; + let verify_key = recoverable_signature + .recover_verifying_key_from_digest_bytes(hash.as_ref().into()) + .unwrap(); + + let public_key = K256PublicKey::from(&verify_key); + let public_key = public_key.to_encoded_point(/* compress = */ false); + let public_key = public_key.as_bytes(); + Ok(public_key.to_vec()) + } + /// Check whether a message was signed by a specific address #[cfg(feature = "ethers")] pub fn verify(&self, signer: H160) -> Result<(), crate::HyperlaneProtocolError> { diff --git a/rust/hyperlane-core/src/types/checkpoint.rs b/rust/hyperlane-core/src/types/checkpoint.rs index 1fbd387e81..b5036c3a4c 100644 --- a/rust/hyperlane-core/src/types/checkpoint.rs +++ b/rust/hyperlane-core/src/types/checkpoint.rs @@ -35,7 +35,9 @@ impl Signable for CheckpointWithMessageId { fn signing_hash(&self) -> H256 { // sign: // domain_hash(mailbox_address, mailbox_domain) || root || index (as u32) || message_id - H256::from_slice( + println!("Signable for CheckpointWithMessageId\ndomain_hash: {:?}\nroot: {:?}\nindex: {:?}\nmessage_id: {:?}",domain_hash(self.mailbox_address, self.mailbox_domain), self.root, self.index.to_be_bytes(), self.message_id); + + let result = H256::from_slice( Keccak256::new() .chain(domain_hash( self.merkle_tree_hook_address, @@ -45,8 +47,10 @@ impl Signable for CheckpointWithMessageId { .chain(self.index.to_be_bytes()) .chain(self.message_id) .finalize() - .as_slice(), - ) + .as_slice()); + + println!("result: {:?}", result); + result } } diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index fda9521c7d..dbd75726b3 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -121,23 +121,26 @@ impl CLISource { } } -pub fn install_codes(dir: Option) -> BTreeMap { +pub fn install_codes(dir: Option, local: bool) -> BTreeMap { let dir_path = match dir { Some(path) => path, None => tempdir().unwrap().into_path(), }; - let dir_path = dir_path.to_str().unwrap(); - let release_name = format!("cw-hyperlane-v{CW_HYPERLANE_VERSION}"); - let release_comp = format!("{release_name}.tar.gz"); + if !local { + let dir_path = dir_path.to_str().unwrap(); + + let release_name = format!("cw-hyperlane-v{CW_HYPERLANE_VERSION}"); + let release_comp = format!("{release_name}.tar.gz"); - log!("Downloading cw-hyperlane v{}", CW_HYPERLANE_VERSION); - let uri = - format!("{CW_HYPERLANE_GIT}/releases/download/v{CW_HYPERLANE_VERSION}/{release_comp}"); - download(&release_comp, &uri, dir_path); + log!("Downloading cw-hyperlane v{}", CW_HYPERLANE_VERSION); + let uri = + format!("{CW_HYPERLANE_GIT}/releases/download/v{CW_HYPERLANE_VERSION}/{release_comp}"); + download(&release_comp, &uri, dir_path); - log!("Uncompressing cw-hyperlane release"); - unzip(&release_comp, dir_path); + log!("Uncompressing cw-hyperlane release"); + unzip(&release_comp, dir_path); + } // make contract_name => path map fs::read_dir(dir_path) @@ -163,7 +166,7 @@ pub fn install_cosmos( version: OSMOSIS_CLI_VERSION.to_string(), }) .install(cli_dir); - let codes = install_codes(codes_dir); + let codes = install_codes(codes_dir, true); (osmosisd, codes) } @@ -321,11 +324,12 @@ fn launch_cosmos_relayer( fn run_locally() { let debug = false; let cli_src = Some(CLISource::Local { - path: "/Users/frostornge/dev/osmosis/eric/build/osmosisd".to_string(), + path: "/Users/eric/many-things/osmosis/osmosis/build/osmosisd".to_string(), }); + let wasm_path: PathBuf = "/Users/eric/many-things/mitosis/cw-hyperlane/artifacts".into(); // let cli_src = None; - let (osmosisd, codes) = install_cosmos(None, cli_src, None); + let (osmosisd, codes) = install_cosmos(None, cli_src, Some(wasm_path)); let addr_base = "tcp://0.0.0.0"; let default_config = CosmosConfig { From f968434a23834dd12f34ac23fd7e440b63b0d299 Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Tue, 12 Sep 2023 11:55:45 +0000 Subject: [PATCH 059/142] no --- rust/utils/run-locally/src/cosmos/mod.rs | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index dbd75726b3..1eddd72b02 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -262,7 +262,6 @@ fn launch_cosmos_node(config: CosmosConfig) -> CosmosResp { fn launch_cosmos_validator( agent_config: AgentConfig, agent_config_path: PathBuf, - remotes: Vec, debug: bool, ) -> AgentHandles { let validator_bin = concat_path(format!("../../{AGENT_BIN_PATH}"), "validator"); @@ -284,7 +283,6 @@ fn launch_cosmos_validator( .hyp_env("CHECKPOINTSYNCER_PATH", checkpoint_path.to_str().unwrap()) .hyp_env("CHECKPOINTSYNCER_TYPE", "localStorage") .hyp_env("ORIGINCHAINNAME", agent_config.name) - .hyp_env("RELAYCHAINS", remotes.join(",")) .hyp_env("REORGPERIOD", "1") .hyp_env("DB", validator_base_db.to_str().unwrap()) .hyp_env("METRICS", agent_config.domain.to_string()) @@ -444,14 +442,8 @@ fn run_locally() { let hpl_val = agent_config_out .chains .clone() - .into_iter() - .map(|(chain_id, agent_config)| { - let mut others = agent_config_out.chains.clone(); - others.remove(&chain_id); - let remotes = others.into_iter().map(|v| v.0).collect::>(); - - launch_cosmos_validator(agent_config, agent_config_path.clone(), remotes, debug) - }) + .into_values() + .map(|agent_config| launch_cosmos_validator(agent_config, agent_config_path.clone(), debug)) .collect::>(); let hpl_rly = launch_cosmos_relayer( agent_config_path, From 005ba6ed4f281c914664f885f01dae28a33e191b Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Wed, 13 Sep 2023 04:46:43 +0000 Subject: [PATCH 060/142] custom wasm --- rust/utils/run-locally/src/cosmos/mod.rs | 18 ++- rust/utils/run-locally/src/cosmos/source.rs | 152 ++++++++++++++++++++ 2 files changed, 164 insertions(+), 6 deletions(-) create mode 100644 rust/utils/run-locally/src/cosmos/source.rs diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index 1eddd72b02..2d3daafdf3 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -14,6 +14,7 @@ mod crypto; mod deploy; mod link; mod rpc; +mod source; mod types; mod utils; @@ -22,13 +23,13 @@ use types::*; use utils::*; use crate::cosmos::link::link_networks; -use crate::logging::log; use crate::program::Program; use crate::utils::{as_task, concat_path, stop_child, AgentHandles, TaskHandle}; use crate::AGENT_BIN_PATH; use cli::{OsmosisCLI, OsmosisEndpoint}; use self::deploy::deploy_cw_hyperlane; +use self::source::{CLISource, CodeSource}; // const OSMOSIS_CLI_GIT: &str = "https://github.com/osmosis-labs/osmosis"; // const OSMOSIS_CLI_VERSION: &str = "19.0.0"; @@ -159,6 +160,7 @@ pub fn install_cosmos( cli_dir: Option, cli_src: Option, codes_dir: Option, + codes_src: Option, ) -> (PathBuf, BTreeMap) { let osmosisd = cli_src .unwrap_or(CLISource::Remote { @@ -321,13 +323,17 @@ fn launch_cosmos_relayer( #[allow(dead_code)] fn run_locally() { let debug = false; - let cli_src = Some(CLISource::Local { - path: "/Users/eric/many-things/osmosis/osmosis/build/osmosisd".to_string(), - }); - let wasm_path: PathBuf = "/Users/eric/many-things/mitosis/cw-hyperlane/artifacts".into(); + let cli_src = Some(CLISource::local( + "/Users/frostornge/dev/osmosis/eric/build/osmosisd", + )); // let cli_src = None; - let (osmosisd, codes) = install_cosmos(None, cli_src, Some(wasm_path)); + let code_src = Some(CodeSource::local( + "/Users/frostornge/dev/hyperlane/cw-hyperlane/artifacts", + )); + // let code_src = None; + + let (osmosisd, codes) = install_cosmos(None, cli_src, None, code_src); let addr_base = "tcp://0.0.0.0"; let default_config = CosmosConfig { diff --git a/rust/utils/run-locally/src/cosmos/source.rs b/rust/utils/run-locally/src/cosmos/source.rs new file mode 100644 index 0000000000..5c6b61ae98 --- /dev/null +++ b/rust/utils/run-locally/src/cosmos/source.rs @@ -0,0 +1,152 @@ +use std::{collections::BTreeMap, fs, path::PathBuf}; + +use tempfile::tempdir; + +use crate::{ + cosmos::{ + make_target, + utils::{download, unzip}, + }, + logging::log, + utils::concat_path, +}; + +use super::{CW_HYPERLANE_GIT, CW_HYPERLANE_VERSION, OSMOSIS_CLI_GIT, OSMOSIS_CLI_VERSION}; + +pub enum CodeSource { + Local { path: String }, + Remote { url: String, version: String }, +} + +impl Default for CodeSource { + fn default() -> Self { + Self::remote(CW_HYPERLANE_GIT, CW_HYPERLANE_VERSION) + } +} + +impl CodeSource { + pub fn local(path: &str) -> Self { + Self::Local { + path: path.to_string(), + } + } + + pub fn remote(url: &str, version: &str) -> Self { + Self::Remote { + url: url.to_string(), + version: version.to_string(), + } + } +} + +impl CodeSource { + fn install_local(src: String) -> BTreeMap { + // make contract_name => path map + fs::read_dir(src) + .unwrap() + .map(|v| { + let entry = v.unwrap(); + (entry.file_name().into_string().unwrap(), entry.path()) + }) + .filter(|(filename, _)| filename.ends_with(".wasm")) + .map(|v| (v.0.replace(".wasm", ""), v.1)) + .collect() + } + + fn install_remote( + dir: Option, + git: String, + version: String, + ) -> BTreeMap { + let dir_path = match dir { + Some(path) => path, + None => tempdir().unwrap().into_path(), + }; + let dir_path = dir_path.to_str().unwrap(); + + let release_name = format!("cw-hyperlane-v{version}"); + let release_comp = format!("{release_name}.tar.gz"); + + log!("Downloading cw-hyperlane v{}", version); + let uri = format!("{git}/releases/download/v{version}/{release_comp}"); + download(&release_comp, &uri, dir_path); + + log!("Uncompressing cw-hyperlane release"); + unzip(&release_comp, dir_path); + + // make contract_name => path map + fs::read_dir(dir_path) + .unwrap() + .map(|v| { + let entry = v.unwrap(); + (entry.file_name().into_string().unwrap(), entry.path()) + }) + .filter(|(filename, _)| filename.ends_with(".wasm")) + .map(|v| (v.0.replace(".wasm", ""), v.1)) + .collect() + } + + pub fn install(self, dir: Option) -> BTreeMap { + match self { + CodeSource::Local { path } => Self::install_local(path), + CodeSource::Remote { url, version } => Self::install_remote(dir, url, version), + } + } +} + +pub enum CLISource { + Local { path: String }, + Remote { url: String, version: String }, +} + +impl Default for CLISource { + fn default() -> Self { + Self::remote(OSMOSIS_CLI_GIT, OSMOSIS_CLI_VERSION) + } +} + +impl CLISource { + pub fn local(path: &str) -> Self { + Self::Local { + path: path.to_string(), + } + } + + pub fn remote(url: &str, version: &str) -> Self { + Self::Remote { + url: url.to_string(), + version: version.to_string(), + } + } +} + +impl CLISource { + fn install_remote(dir: Option, git: String, version: String) -> PathBuf { + let target = make_target(); + + let dir_path = match dir { + Some(path) => path, + None => tempdir().unwrap().into_path(), + }; + let dir_path = dir_path.to_str().unwrap(); + + let release_name = format!("osmosisd-{version}-{target}"); + let release_comp = format!("{release_name}.tar.gz"); + + log!("Downloading Osmosis CLI v{}", version); + let uri = format!("{git}/releases/download/v{version}/{release_comp}"); + download(&release_comp, &uri, dir_path); + + log!("Uncompressing Osmosis release"); + unzip(&release_comp, dir_path); + + concat_path(dir_path, "osmosisd") + } + + pub fn install(self, dir: Option) -> PathBuf { + match self { + CLISource::Local { path } => path.into(), + CLISource::Remote { url, version } => Self::install_remote(dir, url, version), + } + } +} From 683b7c258ed60f3f109ea36c801f4baedfb5276e Mon Sep 17 00:00:00 2001 From: hashableric Date: Wed, 13 Sep 2023 18:38:24 +0900 Subject: [PATCH 061/142] fix: remove unused chores --- rust/agents/relayer/src/msg/metadata/base.rs | 1 - .../src/msg/metadata/multisig/message_id_multisig.rs | 1 - rust/chains/hyperlane-cosmos/src/libs/verify.rs | 11 ++++------- rust/hyperlane-base/src/types/multisig.rs | 11 ++--------- rust/hyperlane-core/src/types/checkpoint.rs | 9 ++------- 5 files changed, 8 insertions(+), 25 deletions(-) diff --git a/rust/agents/relayer/src/msg/metadata/base.rs b/rust/agents/relayer/src/msg/metadata/base.rs index d97a95d4e3..03da9e3b26 100644 --- a/rust/agents/relayer/src/msg/metadata/base.rs +++ b/rust/agents/relayer/src/msg/metadata/base.rs @@ -94,7 +94,6 @@ impl MetadataBuilder for BaseMetadataBuilder { ModuleType::CcipRead => Box::new(CcipReadIsmMetadataBuilder::new(base)), _ => return Err(MetadataBuilderError::UnsupportedModuleType(module_type).into()), }; - metadata_builder .build(ism_address, message) .await diff --git a/rust/agents/relayer/src/msg/metadata/multisig/message_id_multisig.rs b/rust/agents/relayer/src/msg/metadata/multisig/message_id_multisig.rs index 285eef2c3f..17374d5ea6 100644 --- a/rust/agents/relayer/src/msg/metadata/multisig/message_id_multisig.rs +++ b/rust/agents/relayer/src/msg/metadata/multisig/message_id_multisig.rs @@ -9,7 +9,6 @@ use hyperlane_base::MultisigCheckpointSyncer; use hyperlane_core::{unwrap_or_none_result, HyperlaneMessage, H256}; use tracing::{debug, trace, warn}; - use crate::msg::metadata::BaseMetadataBuilder; use super::base::{MetadataToken, MultisigIsmMetadataBuilder, MultisigMetadata}; diff --git a/rust/chains/hyperlane-cosmos/src/libs/verify.rs b/rust/chains/hyperlane-cosmos/src/libs/verify.rs index afee491b01..58aac8f327 100644 --- a/rust/chains/hyperlane-cosmos/src/libs/verify.rs +++ b/rust/chains/hyperlane-cosmos/src/libs/verify.rs @@ -80,13 +80,10 @@ pub fn pub_to_addr(pub_key: Vec, prefix: &str) -> ChainResult { /// encode H256 to bech32 address pub fn priv_to_binary_addr(priv_key: Vec) -> ChainResult { - let pub_key = SigningKey::from_slice(priv_key.as_slice()) - .unwrap() - .public_key() - .to_bytes(); - - println!("pub_key: {:?}", pub_key); - let sha_hash = sha256_digest(pub_key)?; + let sha_hash = sha256_digest(SigningKey::from_slice(priv_key.as_slice()) + .unwrap() + .public_key() + .to_bytes())?; let rip_hash = ripemd160_digest(sha_hash)?; Ok(H160::from_slice(rip_hash.as_slice())) diff --git a/rust/hyperlane-base/src/types/multisig.rs b/rust/hyperlane-base/src/types/multisig.rs index 1ea20d3364..37cec3edb4 100644 --- a/rust/hyperlane-base/src/types/multisig.rs +++ b/rust/hyperlane-base/src/types/multisig.rs @@ -106,24 +106,17 @@ impl MultisigCheckpointSyncer { let mut signed_checkpoints_per_root: HashMap> = HashMap::new(); - warn!( - "Fetching checkpoint for index {}, validator {:?}", - index, validators - ); - for validator in validators.iter() { let addr = H160::from(*validator); if let Some(checkpoint_syncer) = self.checkpoint_syncers.get(&addr) { // Gracefully ignore an error fetching the checkpoint from a validator's // checkpoint syncer, which can happen if the validator has not // signed the checkpoint at `index`. - if let Ok(Some(signed_checkpoint)) = checkpoint_syncer.fetch_checkpoint(index).await { - warn!("signed_checkpoint: {:?}", signed_checkpoint); // If the signed checkpoint is for a different index, ignore it if signed_checkpoint.value.index != index { - info!( + debug!( validator = format!("{:#x}", validator), index = index, checkpoint_index = signed_checkpoint.value.index, @@ -144,7 +137,7 @@ impl MultisigCheckpointSyncer { }; if H256::from(signer) != *validator { - info!( + debug!( validator = format!("{:#x}", validator), index = index, "Checkpoint signature mismatch" diff --git a/rust/hyperlane-core/src/types/checkpoint.rs b/rust/hyperlane-core/src/types/checkpoint.rs index b5036c3a4c..1348fc1b1b 100644 --- a/rust/hyperlane-core/src/types/checkpoint.rs +++ b/rust/hyperlane-core/src/types/checkpoint.rs @@ -35,9 +35,7 @@ impl Signable for CheckpointWithMessageId { fn signing_hash(&self) -> H256 { // sign: // domain_hash(mailbox_address, mailbox_domain) || root || index (as u32) || message_id - println!("Signable for CheckpointWithMessageId\ndomain_hash: {:?}\nroot: {:?}\nindex: {:?}\nmessage_id: {:?}",domain_hash(self.mailbox_address, self.mailbox_domain), self.root, self.index.to_be_bytes(), self.message_id); - - let result = H256::from_slice( + H256::from_slice( Keccak256::new() .chain(domain_hash( self.merkle_tree_hook_address, @@ -47,10 +45,7 @@ impl Signable for CheckpointWithMessageId { .chain(self.index.to_be_bytes()) .chain(self.message_id) .finalize() - .as_slice()); - - println!("result: {:?}", result); - result + .as_slice()) } } From 0c164b476e9450bf65704de79af7e25d21fa317d Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Tue, 19 Sep 2023 14:36:16 +0000 Subject: [PATCH 062/142] dockerize (wip) --- rust/Dockerfile-e2e | 63 ++++++++++++++++++++++ rust/utils/run-locally/src/cosmos/mod.rs | 28 ++++++---- rust/utils/run-locally/src/cosmos/utils.rs | 1 - 3 files changed, 81 insertions(+), 11 deletions(-) create mode 100644 rust/Dockerfile-e2e diff --git a/rust/Dockerfile-e2e b/rust/Dockerfile-e2e new file mode 100644 index 0000000000..1962ed4225 --- /dev/null +++ b/rust/Dockerfile-e2e @@ -0,0 +1,63 @@ +FROM golang:1.20-alpine as builder + +RUN apk add --no-cache \ + ca-certificates \ + build-base \ + linux-headers \ + git + +WORKDIR /osmosis + +RUN git clone -b v19.0.0-mnts https://github.com/hashableric/osmosis.git . + +# Cosmwasm - Download correct libwasmvm version +RUN ARCH=$(uname -m) && WASMVM_VERSION=$(go list -m github.com/CosmWasm/wasmvm | sed 's/.* //') && \ + wget https://github.com/CosmWasm/wasmvm/releases/download/$WASMVM_VERSION/libwasmvm_muslc.$ARCH.a \ + -O /lib/libwasmvm_muslc.a && \ + # verify checksum + wget https://github.com/CosmWasm/wasmvm/releases/download/$WASMVM_VERSION/checksums.txt -O /tmp/checksums.txt && \ + sha256sum /lib/libwasmvm_muslc.a | grep $(cat /tmp/checksums.txt | grep libwasmvm_muslc.$ARCH | cut -d ' ' -f 1) + +RUN GOWORK=off go build -mod=readonly -tags "netgo,ledger,muslc" \ + -ldflags \ + "-X github.com/cosmos/cosmos-sdk/version.Name="osmosis" \ + -X github.com/cosmos/cosmos-sdk/version.AppName="osmosisd" \ + -X github.com/cosmos/cosmos-sdk/version.Version=${GIT_VERSION} \ + -X github.com/cosmos/cosmos-sdk/version.Commit=${GIT_COMMIT} \ + -X github.com/cosmos/cosmos-sdk/version.BuildTags=netgo,ledger,muslc \ + -w -s -linkmode=external -extldflags '-Wl,-z,muldefs -static'" \ + -trimpath \ + -o build/osmosisd ./cmd/osmosisd + +FROM rust:1.71.1 as tester + +WORKDIR /usr/src + +# 1a: Prepare for static linking +RUN apt-get update && \ + apt-get dist-upgrade -y && \ + apt-get install -y musl-tools clang && \ + rustup target add x86_64-unknown-linux-musl + +# Add workspace to workdir +COPY agents ./agents +COPY chains ./chains +COPY hyperlane-base ./hyperlane-base +COPY hyperlane-core ./hyperlane-core +COPY hyperlane-test ./hyperlane-test +COPY ethers-prometheus ./ethers-prometheus +COPY utils ./utils +COPY sealevel ./sealevel + +COPY Cargo.toml . +COPY Cargo.lock . + +# Build binaries +RUN cargo build --bin validator --bin relayer + +# Copy Osmosis binary from builder +COPY --from=builder /osmosis/build/* /bin + +# RUN \ +# E2E_OSMOSIS_CLI_PATH="/bin/osmosisd" \ +# cargo test --package run-locally --bin run-locally -- cosmos::test::test_run --exact --nocapture diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index 2d3daafdf3..02c5a94929 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -1,8 +1,8 @@ use std::collections::BTreeMap; -use std::fs; use std::path::{Path, PathBuf}; use std::thread::sleep; use std::time::Duration; +use std::{env, fs}; use hpl_interface::mailbox; use hpl_interface::types::bech32_decode; @@ -320,18 +320,26 @@ fn launch_cosmos_relayer( relayer } +const ENV_CLI_PATH_KEY: &str = "E2E_OSMOSIS_CLI_PATH"; +const ENV_CW_HYPERLANE_PATH_KEY: &str = "E2E_CW_HYPERLANE_PATH"; + #[allow(dead_code)] fn run_locally() { let debug = false; - let cli_src = Some(CLISource::local( - "/Users/frostornge/dev/osmosis/eric/build/osmosisd", - )); - // let cli_src = None; - - let code_src = Some(CodeSource::local( - "/Users/frostornge/dev/hyperlane/cw-hyperlane/artifacts", - )); - // let code_src = None; + + let cli_src = Some( + env::var(ENV_CLI_PATH_KEY) + .as_ref() + .map(|v| CLISource::local(v)) + .unwrap_or_default(), + ); + + let code_src = Some( + env::var(ENV_CW_HYPERLANE_PATH_KEY) + .as_ref() + .map(|v| CodeSource::local(v)) + .unwrap_or_default(), + ); let (osmosisd, codes) = install_cosmos(None, cli_src, None, code_src); diff --git a/rust/utils/run-locally/src/cosmos/utils.rs b/rust/utils/run-locally/src/cosmos/utils.rs index e2e4687d97..75eb27f8c0 100644 --- a/rust/utils/run-locally/src/cosmos/utils.rs +++ b/rust/utils/run-locally/src/cosmos/utils.rs @@ -8,7 +8,6 @@ use crate::utils::TaskHandle; pub(crate) fn sed(from: &str, to: &str, file: &str) { Program::new("sed") .raw_arg("-i") - .cmd("") .cmd(format!("s/{from}/{to}/g")) .cmd(file) .run() From 25023db00e78b6a9b8cc41c39ead5bb93e464dc2 Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Thu, 21 Sep 2023 12:42:53 +0000 Subject: [PATCH 063/142] binary -> docker (1) --- rust/Dockerfile-e2e | 63 --------- rust/utils/run-locally/src/cosmos/cli.rs | 143 ++++++++++++++------ rust/utils/run-locally/src/cosmos/link.rs | 27 +--- rust/utils/run-locally/src/cosmos/mod.rs | 50 ++++--- rust/utils/run-locally/src/cosmos/source.rs | 66 +-------- rust/utils/run-locally/src/cosmos/types.rs | 10 +- rust/utils/run-locally/src/cosmos/utils.rs | 1 + 7 files changed, 135 insertions(+), 225 deletions(-) delete mode 100644 rust/Dockerfile-e2e diff --git a/rust/Dockerfile-e2e b/rust/Dockerfile-e2e deleted file mode 100644 index 1962ed4225..0000000000 --- a/rust/Dockerfile-e2e +++ /dev/null @@ -1,63 +0,0 @@ -FROM golang:1.20-alpine as builder - -RUN apk add --no-cache \ - ca-certificates \ - build-base \ - linux-headers \ - git - -WORKDIR /osmosis - -RUN git clone -b v19.0.0-mnts https://github.com/hashableric/osmosis.git . - -# Cosmwasm - Download correct libwasmvm version -RUN ARCH=$(uname -m) && WASMVM_VERSION=$(go list -m github.com/CosmWasm/wasmvm | sed 's/.* //') && \ - wget https://github.com/CosmWasm/wasmvm/releases/download/$WASMVM_VERSION/libwasmvm_muslc.$ARCH.a \ - -O /lib/libwasmvm_muslc.a && \ - # verify checksum - wget https://github.com/CosmWasm/wasmvm/releases/download/$WASMVM_VERSION/checksums.txt -O /tmp/checksums.txt && \ - sha256sum /lib/libwasmvm_muslc.a | grep $(cat /tmp/checksums.txt | grep libwasmvm_muslc.$ARCH | cut -d ' ' -f 1) - -RUN GOWORK=off go build -mod=readonly -tags "netgo,ledger,muslc" \ - -ldflags \ - "-X github.com/cosmos/cosmos-sdk/version.Name="osmosis" \ - -X github.com/cosmos/cosmos-sdk/version.AppName="osmosisd" \ - -X github.com/cosmos/cosmos-sdk/version.Version=${GIT_VERSION} \ - -X github.com/cosmos/cosmos-sdk/version.Commit=${GIT_COMMIT} \ - -X github.com/cosmos/cosmos-sdk/version.BuildTags=netgo,ledger,muslc \ - -w -s -linkmode=external -extldflags '-Wl,-z,muldefs -static'" \ - -trimpath \ - -o build/osmosisd ./cmd/osmosisd - -FROM rust:1.71.1 as tester - -WORKDIR /usr/src - -# 1a: Prepare for static linking -RUN apt-get update && \ - apt-get dist-upgrade -y && \ - apt-get install -y musl-tools clang && \ - rustup target add x86_64-unknown-linux-musl - -# Add workspace to workdir -COPY agents ./agents -COPY chains ./chains -COPY hyperlane-base ./hyperlane-base -COPY hyperlane-core ./hyperlane-core -COPY hyperlane-test ./hyperlane-test -COPY ethers-prometheus ./ethers-prometheus -COPY utils ./utils -COPY sealevel ./sealevel - -COPY Cargo.toml . -COPY Cargo.lock . - -# Build binaries -RUN cargo build --bin validator --bin relayer - -# Copy Osmosis binary from builder -COPY --from=builder /osmosis/build/* /bin - -# RUN \ -# E2E_OSMOSIS_CLI_PATH="/bin/osmosisd" \ -# cargo test --package run-locally --bin run-locally -- cosmos::test::test_run --exact --nocapture diff --git a/rust/utils/run-locally/src/cosmos/cli.rs b/rust/utils/run-locally/src/cosmos/cli.rs index 8b1be42b10..531c271b20 100644 --- a/rust/utils/run-locally/src/cosmos/cli.rs +++ b/rust/utils/run-locally/src/cosmos/cli.rs @@ -33,21 +33,50 @@ impl OsmosisEndpoint { } pub struct OsmosisCLI { - pub bin: PathBuf, + pub image: String, pub home: String, + pub chain_id: String, } +const OSMOSIS_DOCKER_CLI_HOME: &str = "/etc/data/home"; + #[allow(dead_code)] impl OsmosisCLI { - pub fn new(bin: PathBuf, home: &str) -> Self { + pub fn new(image: &str, home: &str, chain_id: &str) -> Self { Self { - bin, + image: image.to_string(), home: home.to_string(), + chain_id: chain_id.to_string(), } } - fn cli(&self) -> Program { - Program::new(self.bin.clone()).arg("home", &self.home) + fn docker_cli(&self) -> Program { + Program::new("docker") + } + + fn docker_container_name(&self) -> String { + format!("osmosis-{}", self.chain_id) + } + + fn osmosis_cli(&self, p: Program) -> Program { + p.cmd(self.image.to_string()) + .arg("home", OSMOSIS_DOCKER_CLI_HOME) + } + + fn cli_run(&self) -> Program { + self.osmosis_cli( + self.docker_cli() + .cmd("run") + .raw_arg("--rm") + .arg("volume", format!("{}:{OSMOSIS_DOCKER_CLI_HOME}", self.home)), + ) + } + + fn cli_exec(&self) -> Program { + self.docker_cli() + .cmd("exec") + .cmd(self.docker_container_name()) + .cmd("osmosisd") } fn add_gas(&self, program: Program) -> Program { @@ -58,11 +87,12 @@ impl OsmosisCLI { .flag("yes") } - pub fn init(&self, moniker: &str, chain_id: &str) { - self.cli() + /// Must use cli_run to modify mounted home's genesis / config and something + pub fn init(&self, moniker: &str) { + self.cli_run() .cmd("init") .cmd(moniker) - .arg("chain-id", chain_id) + .arg("chain-id", self.chain_id.to_string()) .run() .join(); @@ -92,7 +122,7 @@ impl OsmosisCLI { ); // modify client config - let client_chain_id = chain_id.to_string(); + let client_chain_id = self.chain_id.to_string(); let client_config_path = concat_path(&self.home, "config/client.toml"); modify_toml( client_config_path, @@ -107,15 +137,15 @@ impl OsmosisCLI { self.add_default_keys(); self.add_genesis_accs(); - self.cli() + self.cli_run() .cmd("gentx") .cmd("validator") .cmd(format!("{}uosmo", GENESIS_FUND)) - .arg("chain-id", chain_id) + .arg("chain-id", self.chain_id.to_string()) .run() .join(); - self.cli().cmd("collect-gentxs").run().join(); + self.cli_run().cmd("collect-gentxs").run().join(); } pub fn start(&self, addr_base: String, port_base: u32) -> (AgentHandles, OsmosisEndpoint) { @@ -127,14 +157,17 @@ impl OsmosisCLI { let mut get_next_addr = || { let port = next_port; next_port += 1; - format!("{addr_base}:{port}") + (format!("{addr_base}:{port}"), port) }; - let addr = get_next_addr(); - let p2p_addr = get_next_addr(); - let rpc_addr = get_next_addr(); - let grpc_addr = get_next_addr().replace("tcp://", ""); - let pprof_addr = get_next_addr().replace("tcp://", ""); + let (addr, port) = get_next_addr(); + let (_p2p_addr, p2p_port) = get_next_addr(); + let (rpc_addr, rpc_port) = get_next_addr(); + let (grpc_addr, grpc_port) = get_next_addr(); + let grpc_addr = grpc_addr.replace("tcp://", ""); + + let (pprof_addr, pprof_port) = get_next_addr(); + let _pprof_addr = pprof_addr.replace("tcp://", ""); let endpoint = OsmosisEndpoint { addr, @@ -142,17 +175,28 @@ impl OsmosisCLI { grpc_addr, }; - let node = self - .cli() - .cmd("start") - .arg("address", &endpoint.addr) // default is tcp://0.0.0.0:26658 - // addrs - .arg("p2p.laddr", p2p_addr) // default is tcp://0.0.0.0:26655 - .arg("rpc.laddr", &endpoint.rpc_addr) // default is tcp://0.0.0.0:26657 - .arg("grpc.address", &endpoint.grpc_addr) // default is 0.0.0.0:9090 - .arg("rpc.pprof_laddr", pprof_addr) // default is localhost:6060 - .arg("log_level", "panic") - .spawn("COSMOS"); + // .arg("address", &endpoint.addr) // default is tcp://0.0.0.0:26658 + // .arg("p2p.laddr", p2p_addr) // default is tcp://0.0.0.0:26655 + // .arg("rpc.laddr", &endpoint.rpc_addr) // default is tcp://0.0.0.0:26657 + // .arg("grpc.address", &endpoint.grpc_addr) // default is 0.0.0.0:9090 + // .arg("rpc.pprof_laddr", pprof_addr) // default is localhost:6060 + // .arg("log_level", "panic") + let program_base = self + .osmosis_cli( + self.docker_cli() + .cmd("run") + .raw_arg("--rm") + .arg("volume", format!("{}:{OSMOSIS_DOCKER_CLI_HOME}", self.home)) + .arg("name", self.docker_container_name()) + .arg("publish", format!("{}:26658", &port)) + .arg("publish", format!("{}:26657", &rpc_port)) + .arg("publish", format!("{}:26655", &p2p_port)) + .arg("publish", format!("{}:9090", &grpc_port)) + .arg("publish", format!("{}:6060", &pprof_port)), + ) + .arg("log_level", "panic"); + + let node = program_base.cmd("start").spawn("COSMOS"); endpoint.wait_for_node(); @@ -169,11 +213,16 @@ impl OsmosisCLI { for (name, code) in codes { let cmd = self - .cli() + .docker_cli() + .arg( + "volume", + format!("{}:/etc/codes/{name}.wasm", code.to_str().unwrap()), + ) + .cmd(self.docker_container_name()) .cmd("tx") .cmd("wasm") .cmd("store") - .cmd(code.to_str().unwrap()) + .cmd(format!("/etc/codes/{name}.wasm")) .arg("from", sender); let cmd = self.add_gas(cmd); @@ -208,7 +257,7 @@ impl OsmosisCLI { label: &str, ) -> String { let mut cmd = self - .cli() + .cli_exec() .cmd("tx") .cmd("wasm") .cmd("instantiate") @@ -255,7 +304,7 @@ impl OsmosisCLI { funds: Vec, ) -> TxResponse { let mut cmd = self - .cli() + .cli_exec() .cmd("tx") .cmd("wasm") .cmd("execute") @@ -284,12 +333,12 @@ impl OsmosisCLI { pub fn wasm_query( &self, - endpoint: &OsmosisEndpoint, + _endpoint: &OsmosisEndpoint, contract: &str, query_msg: T, ) -> U { - let mut cmd = self - .cli() + let cmd = self + .cli_exec() .cmd("query") .cmd("wasm") .cmd("contract-state") @@ -297,8 +346,6 @@ impl OsmosisCLI { .cmd(contract) .cmd(serde_json::to_string(&query_msg).unwrap()); - cmd = endpoint.add_rpc(cmd); - let output = cmd.run_with_output().join(); let output = output.first().unwrap(); let output: CliWasmQueryResponse = serde_json::from_str(output).unwrap(); @@ -306,9 +353,9 @@ impl OsmosisCLI { output.data } - pub fn query_balance(&self, endpoint: &OsmosisEndpoint, addr: &str) -> BalanceResponse { - let cmd = endpoint - .add_rpc(self.cli()) + pub fn query_balance(&self, _endpoint: &OsmosisEndpoint, addr: &str) -> BalanceResponse { + let cmd = self + .cli_exec() .cmd("query") .cmd("bank") .cmd("balances") @@ -323,7 +370,7 @@ impl OsmosisCLI { fn add_genesis_accs(&self) { for name in default_keys().into_iter().map(|(name, _)| name) { - self.cli() + self.cli_run() .cmd("add-genesis-account") .cmd(self.get_addr(name)) .cmd(format!("{}uosmo", GENESIS_FUND * 2)) @@ -340,7 +387,13 @@ impl OsmosisCLI { pub fn add_key(&self, name: &str, mnemonic: &str) { let mut child = self - .cli() + .osmosis_cli( + self.docker_cli() + .cmd("run") + .flag("rm") + .raw_arg("-i") + .arg("volume", format!("{}:{OSMOSIS_DOCKER_CLI_HOME}", self.home)), + ) .cmd("keys") .cmd("add") .cmd(name) @@ -362,7 +415,7 @@ impl OsmosisCLI { pub fn get_addr(&self, name: &str) -> String { let out = self - .cli() + .cli_run() .cmd("keys") .cmd("show") .raw_arg("-a") @@ -374,7 +427,7 @@ impl OsmosisCLI { pub fn get_keypair(&self, name: &str) -> KeyPair { let cmd = self - .cli() + .cli_run() .cmd("keys") .cmd("export") .cmd(name) diff --git a/rust/utils/run-locally/src/cosmos/link.rs b/rust/utils/run-locally/src/cosmos/link.rs index 69ae15d935..19fb930dc7 100644 --- a/rust/utils/run-locally/src/cosmos/link.rs +++ b/rust/utils/run-locally/src/cosmos/link.rs @@ -1,5 +1,3 @@ -use std::path::Path; - use hpl_interface::ism; use super::{cli::OsmosisCLI, crypto::KeyPair, CosmosNetwork}; @@ -55,30 +53,11 @@ fn link_network( }, vec![], ); - - // TODO - // cli.wasm_execute( - // &network.launch_resp.endpoint, - // linker, - // &network.deployments.va, - // va::ExecuteMsg::Announce { - // validator: (), - // storage_location: (), - // signature: (), - // }, - // vec![], - // ); } -pub fn link_networks( - bin: &Path, - linker: &str, - validator: &str, - src: &CosmosNetwork, - dst: &CosmosNetwork, -) { - let src_cli = src.launch_resp.cli(bin); - let dst_cli = dst.launch_resp.cli(bin); +pub fn link_networks(linker: &str, validator: &str, src: &CosmosNetwork, dst: &CosmosNetwork) { + let src_cli = src.launch_resp.cli(); + let dst_cli = dst.launch_resp.cli(); let keypair = src_cli.get_keypair(validator); diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index 02c5a94929..6c1a4e0503 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -1,5 +1,5 @@ use std::collections::BTreeMap; -use std::path::{Path, PathBuf}; +use std::path::PathBuf; use std::thread::sleep; use std::time::Duration; use std::{env, fs}; @@ -29,13 +29,7 @@ use crate::AGENT_BIN_PATH; use cli::{OsmosisCLI, OsmosisEndpoint}; use self::deploy::deploy_cw_hyperlane; -use self::source::{CLISource, CodeSource}; - -// const OSMOSIS_CLI_GIT: &str = "https://github.com/osmosis-labs/osmosis"; -// const OSMOSIS_CLI_VERSION: &str = "19.0.0"; - -const OSMOSIS_CLI_GIT: &str = "https://github.com/hashableric/osmosis"; -const OSMOSIS_CLI_VERSION: &str = "19.0.0-mnts"; +use self::source::CodeSource; const KEY_HPL_VALIDATOR: (&str,&str) = ("hpl-validator", "guard evolve region sentence danger sort despair eye deputy brave trim actor left recipe debate document upgrade sustain bus cage afford half demand pigeon"); const KEY_HPL_RELAYER: (&str,&str) = ("hpl-relayer", "moral item damp melt gloom vendor notice head assume balance doctor retire fashion trim find biology saddle undo switch fault cattle toast drip empty"); @@ -175,7 +169,7 @@ pub fn install_cosmos( #[derive(Clone)] pub struct CosmosConfig { - pub cli_path: PathBuf, + pub image: String, pub home_path: Option, pub codes: BTreeMap, @@ -191,12 +185,18 @@ pub struct CosmosResp { pub node: AgentHandles, pub endpoint: OsmosisEndpoint, pub codes: Codes, + pub image: String, pub home_path: PathBuf, + pub chain_id: String, } impl CosmosResp { - pub fn cli(&self, bin: &Path) -> OsmosisCLI { - OsmosisCLI::new(bin.to_path_buf(), self.home_path.to_str().unwrap()) + pub fn cli(&self) -> OsmosisCLI { + OsmosisCLI::new( + &self.image, + self.home_path.to_str().unwrap(), + &self.chain_id, + ) } } @@ -245,9 +245,9 @@ fn launch_cosmos_node(config: CosmosConfig) -> CosmosResp { None => tempdir().unwrap().into_path(), }; - let cli = OsmosisCLI::new(config.cli_path, home_path.to_str().unwrap()); + let cli = OsmosisCLI::new(&config.image, home_path.to_str().unwrap(), &config.chain_id); - cli.init(&config.moniker, &config.chain_id); + cli.init(&config.moniker); let (node, endpoint) = cli.start(config.node_addr_base, config.node_port_base); let codes = cli.store_codes(&endpoint, "validator", config.codes); @@ -256,7 +256,9 @@ fn launch_cosmos_node(config: CosmosConfig) -> CosmosResp { node, endpoint, codes, + image: config.image, home_path, + chain_id: config.chain_id, } } @@ -320,19 +322,12 @@ fn launch_cosmos_relayer( relayer } -const ENV_CLI_PATH_KEY: &str = "E2E_OSMOSIS_CLI_PATH"; const ENV_CW_HYPERLANE_PATH_KEY: &str = "E2E_CW_HYPERLANE_PATH"; #[allow(dead_code)] fn run_locally() { let debug = false; - - let cli_src = Some( - env::var(ENV_CLI_PATH_KEY) - .as_ref() - .map(|v| CLISource::local(v)) - .unwrap_or_default(), - ); + let image = env::var("E2E_OSMOSIS_IMAGE").unwrap_or("frostornge/osmosis".to_string()); let code_src = Some( env::var(ENV_CW_HYPERLANE_PATH_KEY) @@ -341,11 +336,11 @@ fn run_locally() { .unwrap_or_default(), ); - let (osmosisd, codes) = install_cosmos(None, cli_src, None, code_src); + let codes = code_src.unwrap_or_default().install(None); let addr_base = "tcp://0.0.0.0"; let default_config = CosmosConfig { - cli_path: osmosisd.clone(), + image: image.to_string(), home_path: None, codes, @@ -385,7 +380,7 @@ fn run_locally() { .map(|v| (v.0.join(), v.1, v.2)) .map(|(launch_resp, chain_id, domain)| { let deployments = deploy_cw_hyperlane( - launch_resp.cli(&osmosisd), + launch_resp.cli(), launch_resp.endpoint.clone(), deployer.to_string(), launch_resp.codes.clone(), @@ -415,7 +410,7 @@ fn run_locally() { } for target in targets { - link_networks(&osmosisd, linker, validator, node, target); + link_networks(linker, validator, node, target); } } @@ -440,7 +435,7 @@ fn run_locally() { .map(|v| { ( format!("cosmos-test-{}", v.domain), - AgentConfig::new(osmosisd.clone(), validator, v), + AgentConfig::new(&image, validator, v), ) }) .collect::>(), @@ -485,8 +480,9 @@ fn run_locally() { for target in targets { let cli = OsmosisCLI::new( - osmosisd.clone(), + &image, node.launch_resp.home_path.to_str().unwrap(), + &node.chain_id, ); cli.wasm_execute( diff --git a/rust/utils/run-locally/src/cosmos/source.rs b/rust/utils/run-locally/src/cosmos/source.rs index 5c6b61ae98..ca542db218 100644 --- a/rust/utils/run-locally/src/cosmos/source.rs +++ b/rust/utils/run-locally/src/cosmos/source.rs @@ -3,15 +3,12 @@ use std::{collections::BTreeMap, fs, path::PathBuf}; use tempfile::tempdir; use crate::{ - cosmos::{ - make_target, - utils::{download, unzip}, - }, + cosmos::utils::{download, unzip}, logging::log, utils::concat_path, }; -use super::{CW_HYPERLANE_GIT, CW_HYPERLANE_VERSION, OSMOSIS_CLI_GIT, OSMOSIS_CLI_VERSION}; +use super::{CW_HYPERLANE_GIT, CW_HYPERLANE_VERSION}; pub enum CodeSource { Local { path: String }, @@ -75,7 +72,7 @@ impl CodeSource { unzip(&release_comp, dir_path); // make contract_name => path map - fs::read_dir(dir_path) + fs::read_dir(concat_path(dir_path, release_name)) .unwrap() .map(|v| { let entry = v.unwrap(); @@ -93,60 +90,3 @@ impl CodeSource { } } } - -pub enum CLISource { - Local { path: String }, - Remote { url: String, version: String }, -} - -impl Default for CLISource { - fn default() -> Self { - Self::remote(OSMOSIS_CLI_GIT, OSMOSIS_CLI_VERSION) - } -} - -impl CLISource { - pub fn local(path: &str) -> Self { - Self::Local { - path: path.to_string(), - } - } - - pub fn remote(url: &str, version: &str) -> Self { - Self::Remote { - url: url.to_string(), - version: version.to_string(), - } - } -} - -impl CLISource { - fn install_remote(dir: Option, git: String, version: String) -> PathBuf { - let target = make_target(); - - let dir_path = match dir { - Some(path) => path, - None => tempdir().unwrap().into_path(), - }; - let dir_path = dir_path.to_str().unwrap(); - - let release_name = format!("osmosisd-{version}-{target}"); - let release_comp = format!("{release_name}.tar.gz"); - - log!("Downloading Osmosis CLI v{}", version); - let uri = format!("{git}/releases/download/v{version}/{release_comp}"); - download(&release_comp, &uri, dir_path); - - log!("Uncompressing Osmosis release"); - unzip(&release_comp, dir_path); - - concat_path(dir_path, "osmosisd") - } - - pub fn install(self, dir: Option) -> PathBuf { - match self { - CLISource::Local { path } => path.into(), - CLISource::Remote { url, version } => Self::install_remote(dir, url, version), - } - } -} diff --git a/rust/utils/run-locally/src/cosmos/types.rs b/rust/utils/run-locally/src/cosmos/types.rs index 2e03f901fa..f8dc839fa4 100644 --- a/rust/utils/run-locally/src/cosmos/types.rs +++ b/rust/utils/run-locally/src/cosmos/types.rs @@ -1,4 +1,4 @@ -use std::{collections::BTreeMap, path::PathBuf}; +use std::collections::BTreeMap; use hpl_interface::types::bech32_decode; @@ -131,8 +131,12 @@ fn to_hex_addr(addr: &str) -> String { } impl AgentConfig { - pub fn new(bin: PathBuf, validator: &str, network: &CosmosNetwork) -> Self { - let cli = OsmosisCLI::new(bin, network.launch_resp.home_path.to_str().unwrap()); + pub fn new(image: &str, validator: &str, network: &CosmosNetwork) -> Self { + let cli = OsmosisCLI::new( + image, + network.launch_resp.home_path.to_str().unwrap(), + &network.chain_id, + ); let validator = cli.get_keypair(validator); AgentConfig { diff --git a/rust/utils/run-locally/src/cosmos/utils.rs b/rust/utils/run-locally/src/cosmos/utils.rs index 75eb27f8c0..24f254b841 100644 --- a/rust/utils/run-locally/src/cosmos/utils.rs +++ b/rust/utils/run-locally/src/cosmos/utils.rs @@ -8,6 +8,7 @@ use crate::utils::TaskHandle; pub(crate) fn sed(from: &str, to: &str, file: &str) { Program::new("sed") .raw_arg("-i") + .raw_arg("-e") .cmd(format!("s/{from}/{to}/g")) .cmd(file) .run() From 8838abf9ca6ab48aec5f8d905eb98f2f98d6cd6a Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Fri, 22 Sep 2023 23:23:37 +0900 Subject: [PATCH 064/142] Revert "binary -> docker (1)" This reverts commit ac6c2f79619303bea0b3f44c0693882dd7e3333e. --- rust/Dockerfile-e2e | 63 +++++++++ rust/utils/run-locally/src/cosmos/cli.rs | 143 ++++++-------------- rust/utils/run-locally/src/cosmos/link.rs | 27 +++- rust/utils/run-locally/src/cosmos/mod.rs | 50 +++---- rust/utils/run-locally/src/cosmos/source.rs | 66 ++++++++- rust/utils/run-locally/src/cosmos/types.rs | 10 +- rust/utils/run-locally/src/cosmos/utils.rs | 1 - 7 files changed, 225 insertions(+), 135 deletions(-) create mode 100644 rust/Dockerfile-e2e diff --git a/rust/Dockerfile-e2e b/rust/Dockerfile-e2e new file mode 100644 index 0000000000..1962ed4225 --- /dev/null +++ b/rust/Dockerfile-e2e @@ -0,0 +1,63 @@ +FROM golang:1.20-alpine as builder + +RUN apk add --no-cache \ + ca-certificates \ + build-base \ + linux-headers \ + git + +WORKDIR /osmosis + +RUN git clone -b v19.0.0-mnts https://github.com/hashableric/osmosis.git . + +# Cosmwasm - Download correct libwasmvm version +RUN ARCH=$(uname -m) && WASMVM_VERSION=$(go list -m github.com/CosmWasm/wasmvm | sed 's/.* //') && \ + wget https://github.com/CosmWasm/wasmvm/releases/download/$WASMVM_VERSION/libwasmvm_muslc.$ARCH.a \ + -O /lib/libwasmvm_muslc.a && \ + # verify checksum + wget https://github.com/CosmWasm/wasmvm/releases/download/$WASMVM_VERSION/checksums.txt -O /tmp/checksums.txt && \ + sha256sum /lib/libwasmvm_muslc.a | grep $(cat /tmp/checksums.txt | grep libwasmvm_muslc.$ARCH | cut -d ' ' -f 1) + +RUN GOWORK=off go build -mod=readonly -tags "netgo,ledger,muslc" \ + -ldflags \ + "-X github.com/cosmos/cosmos-sdk/version.Name="osmosis" \ + -X github.com/cosmos/cosmos-sdk/version.AppName="osmosisd" \ + -X github.com/cosmos/cosmos-sdk/version.Version=${GIT_VERSION} \ + -X github.com/cosmos/cosmos-sdk/version.Commit=${GIT_COMMIT} \ + -X github.com/cosmos/cosmos-sdk/version.BuildTags=netgo,ledger,muslc \ + -w -s -linkmode=external -extldflags '-Wl,-z,muldefs -static'" \ + -trimpath \ + -o build/osmosisd ./cmd/osmosisd + +FROM rust:1.71.1 as tester + +WORKDIR /usr/src + +# 1a: Prepare for static linking +RUN apt-get update && \ + apt-get dist-upgrade -y && \ + apt-get install -y musl-tools clang && \ + rustup target add x86_64-unknown-linux-musl + +# Add workspace to workdir +COPY agents ./agents +COPY chains ./chains +COPY hyperlane-base ./hyperlane-base +COPY hyperlane-core ./hyperlane-core +COPY hyperlane-test ./hyperlane-test +COPY ethers-prometheus ./ethers-prometheus +COPY utils ./utils +COPY sealevel ./sealevel + +COPY Cargo.toml . +COPY Cargo.lock . + +# Build binaries +RUN cargo build --bin validator --bin relayer + +# Copy Osmosis binary from builder +COPY --from=builder /osmosis/build/* /bin + +# RUN \ +# E2E_OSMOSIS_CLI_PATH="/bin/osmosisd" \ +# cargo test --package run-locally --bin run-locally -- cosmos::test::test_run --exact --nocapture diff --git a/rust/utils/run-locally/src/cosmos/cli.rs b/rust/utils/run-locally/src/cosmos/cli.rs index 531c271b20..8b1be42b10 100644 --- a/rust/utils/run-locally/src/cosmos/cli.rs +++ b/rust/utils/run-locally/src/cosmos/cli.rs @@ -33,50 +33,21 @@ impl OsmosisEndpoint { } pub struct OsmosisCLI { - pub image: String, + pub bin: PathBuf, pub home: String, - pub chain_id: String, } -const OSMOSIS_DOCKER_CLI_HOME: &str = "/etc/data/home"; - #[allow(dead_code)] impl OsmosisCLI { - pub fn new(image: &str, home: &str, chain_id: &str) -> Self { + pub fn new(bin: PathBuf, home: &str) -> Self { Self { - image: image.to_string(), + bin, home: home.to_string(), - chain_id: chain_id.to_string(), } } - fn docker_cli(&self) -> Program { - Program::new("docker") - } - - fn docker_container_name(&self) -> String { - format!("osmosis-{}", self.chain_id) - } - - fn osmosis_cli(&self, p: Program) -> Program { - p.cmd(self.image.to_string()) - .arg("home", OSMOSIS_DOCKER_CLI_HOME) - } - - fn cli_run(&self) -> Program { - self.osmosis_cli( - self.docker_cli() - .cmd("run") - .raw_arg("--rm") - .arg("volume", format!("{}:{OSMOSIS_DOCKER_CLI_HOME}", self.home)), - ) - } - - fn cli_exec(&self) -> Program { - self.docker_cli() - .cmd("exec") - .cmd(self.docker_container_name()) - .cmd("osmosisd") + fn cli(&self) -> Program { + Program::new(self.bin.clone()).arg("home", &self.home) } fn add_gas(&self, program: Program) -> Program { @@ -87,12 +58,11 @@ impl OsmosisCLI { .flag("yes") } - /// Must use cli_run to modify mounted home's genesis / config and something - pub fn init(&self, moniker: &str) { - self.cli_run() + pub fn init(&self, moniker: &str, chain_id: &str) { + self.cli() .cmd("init") .cmd(moniker) - .arg("chain-id", self.chain_id.to_string()) + .arg("chain-id", chain_id) .run() .join(); @@ -122,7 +92,7 @@ impl OsmosisCLI { ); // modify client config - let client_chain_id = self.chain_id.to_string(); + let client_chain_id = chain_id.to_string(); let client_config_path = concat_path(&self.home, "config/client.toml"); modify_toml( client_config_path, @@ -137,15 +107,15 @@ impl OsmosisCLI { self.add_default_keys(); self.add_genesis_accs(); - self.cli_run() + self.cli() .cmd("gentx") .cmd("validator") .cmd(format!("{}uosmo", GENESIS_FUND)) - .arg("chain-id", self.chain_id.to_string()) + .arg("chain-id", chain_id) .run() .join(); - self.cli_run().cmd("collect-gentxs").run().join(); + self.cli().cmd("collect-gentxs").run().join(); } pub fn start(&self, addr_base: String, port_base: u32) -> (AgentHandles, OsmosisEndpoint) { @@ -157,17 +127,14 @@ impl OsmosisCLI { let mut get_next_addr = || { let port = next_port; next_port += 1; - (format!("{addr_base}:{port}"), port) + format!("{addr_base}:{port}") }; - let (addr, port) = get_next_addr(); - let (_p2p_addr, p2p_port) = get_next_addr(); - let (rpc_addr, rpc_port) = get_next_addr(); - let (grpc_addr, grpc_port) = get_next_addr(); - let grpc_addr = grpc_addr.replace("tcp://", ""); - - let (pprof_addr, pprof_port) = get_next_addr(); - let _pprof_addr = pprof_addr.replace("tcp://", ""); + let addr = get_next_addr(); + let p2p_addr = get_next_addr(); + let rpc_addr = get_next_addr(); + let grpc_addr = get_next_addr().replace("tcp://", ""); + let pprof_addr = get_next_addr().replace("tcp://", ""); let endpoint = OsmosisEndpoint { addr, @@ -175,28 +142,17 @@ impl OsmosisCLI { grpc_addr, }; - // .arg("address", &endpoint.addr) // default is tcp://0.0.0.0:26658 - // .arg("p2p.laddr", p2p_addr) // default is tcp://0.0.0.0:26655 - // .arg("rpc.laddr", &endpoint.rpc_addr) // default is tcp://0.0.0.0:26657 - // .arg("grpc.address", &endpoint.grpc_addr) // default is 0.0.0.0:9090 - // .arg("rpc.pprof_laddr", pprof_addr) // default is localhost:6060 - // .arg("log_level", "panic") - let program_base = self - .osmosis_cli( - self.docker_cli() - .cmd("run") - .raw_arg("--rm") - .arg("volume", format!("{}:{OSMOSIS_DOCKER_CLI_HOME}", self.home)) - .arg("name", self.docker_container_name()) - .arg("publish", format!("{}:26658", &port)) - .arg("publish", format!("{}:26657", &rpc_port)) - .arg("publish", format!("{}:26655", &p2p_port)) - .arg("publish", format!("{}:9090", &grpc_port)) - .arg("publish", format!("{}:6060", &pprof_port)), - ) - .arg("log_level", "panic"); - - let node = program_base.cmd("start").spawn("COSMOS"); + let node = self + .cli() + .cmd("start") + .arg("address", &endpoint.addr) // default is tcp://0.0.0.0:26658 + // addrs + .arg("p2p.laddr", p2p_addr) // default is tcp://0.0.0.0:26655 + .arg("rpc.laddr", &endpoint.rpc_addr) // default is tcp://0.0.0.0:26657 + .arg("grpc.address", &endpoint.grpc_addr) // default is 0.0.0.0:9090 + .arg("rpc.pprof_laddr", pprof_addr) // default is localhost:6060 + .arg("log_level", "panic") + .spawn("COSMOS"); endpoint.wait_for_node(); @@ -213,16 +169,11 @@ impl OsmosisCLI { for (name, code) in codes { let cmd = self - .docker_cli() - .arg( - "volume", - format!("{}:/etc/codes/{name}.wasm", code.to_str().unwrap()), - ) - .cmd(self.docker_container_name()) + .cli() .cmd("tx") .cmd("wasm") .cmd("store") - .cmd(format!("/etc/codes/{name}.wasm")) + .cmd(code.to_str().unwrap()) .arg("from", sender); let cmd = self.add_gas(cmd); @@ -257,7 +208,7 @@ impl OsmosisCLI { label: &str, ) -> String { let mut cmd = self - .cli_exec() + .cli() .cmd("tx") .cmd("wasm") .cmd("instantiate") @@ -304,7 +255,7 @@ impl OsmosisCLI { funds: Vec, ) -> TxResponse { let mut cmd = self - .cli_exec() + .cli() .cmd("tx") .cmd("wasm") .cmd("execute") @@ -333,12 +284,12 @@ impl OsmosisCLI { pub fn wasm_query( &self, - _endpoint: &OsmosisEndpoint, + endpoint: &OsmosisEndpoint, contract: &str, query_msg: T, ) -> U { - let cmd = self - .cli_exec() + let mut cmd = self + .cli() .cmd("query") .cmd("wasm") .cmd("contract-state") @@ -346,6 +297,8 @@ impl OsmosisCLI { .cmd(contract) .cmd(serde_json::to_string(&query_msg).unwrap()); + cmd = endpoint.add_rpc(cmd); + let output = cmd.run_with_output().join(); let output = output.first().unwrap(); let output: CliWasmQueryResponse = serde_json::from_str(output).unwrap(); @@ -353,9 +306,9 @@ impl OsmosisCLI { output.data } - pub fn query_balance(&self, _endpoint: &OsmosisEndpoint, addr: &str) -> BalanceResponse { - let cmd = self - .cli_exec() + pub fn query_balance(&self, endpoint: &OsmosisEndpoint, addr: &str) -> BalanceResponse { + let cmd = endpoint + .add_rpc(self.cli()) .cmd("query") .cmd("bank") .cmd("balances") @@ -370,7 +323,7 @@ impl OsmosisCLI { fn add_genesis_accs(&self) { for name in default_keys().into_iter().map(|(name, _)| name) { - self.cli_run() + self.cli() .cmd("add-genesis-account") .cmd(self.get_addr(name)) .cmd(format!("{}uosmo", GENESIS_FUND * 2)) @@ -387,13 +340,7 @@ impl OsmosisCLI { pub fn add_key(&self, name: &str, mnemonic: &str) { let mut child = self - .osmosis_cli( - self.docker_cli() - .cmd("run") - .flag("rm") - .raw_arg("-i") - .arg("volume", format!("{}:{OSMOSIS_DOCKER_CLI_HOME}", self.home)), - ) + .cli() .cmd("keys") .cmd("add") .cmd(name) @@ -415,7 +362,7 @@ impl OsmosisCLI { pub fn get_addr(&self, name: &str) -> String { let out = self - .cli_run() + .cli() .cmd("keys") .cmd("show") .raw_arg("-a") @@ -427,7 +374,7 @@ impl OsmosisCLI { pub fn get_keypair(&self, name: &str) -> KeyPair { let cmd = self - .cli_run() + .cli() .cmd("keys") .cmd("export") .cmd(name) diff --git a/rust/utils/run-locally/src/cosmos/link.rs b/rust/utils/run-locally/src/cosmos/link.rs index 19fb930dc7..69ae15d935 100644 --- a/rust/utils/run-locally/src/cosmos/link.rs +++ b/rust/utils/run-locally/src/cosmos/link.rs @@ -1,3 +1,5 @@ +use std::path::Path; + use hpl_interface::ism; use super::{cli::OsmosisCLI, crypto::KeyPair, CosmosNetwork}; @@ -53,11 +55,30 @@ fn link_network( }, vec![], ); + + // TODO + // cli.wasm_execute( + // &network.launch_resp.endpoint, + // linker, + // &network.deployments.va, + // va::ExecuteMsg::Announce { + // validator: (), + // storage_location: (), + // signature: (), + // }, + // vec![], + // ); } -pub fn link_networks(linker: &str, validator: &str, src: &CosmosNetwork, dst: &CosmosNetwork) { - let src_cli = src.launch_resp.cli(); - let dst_cli = dst.launch_resp.cli(); +pub fn link_networks( + bin: &Path, + linker: &str, + validator: &str, + src: &CosmosNetwork, + dst: &CosmosNetwork, +) { + let src_cli = src.launch_resp.cli(bin); + let dst_cli = dst.launch_resp.cli(bin); let keypair = src_cli.get_keypair(validator); diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index 6c1a4e0503..02c5a94929 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -1,5 +1,5 @@ use std::collections::BTreeMap; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; use std::thread::sleep; use std::time::Duration; use std::{env, fs}; @@ -29,7 +29,13 @@ use crate::AGENT_BIN_PATH; use cli::{OsmosisCLI, OsmosisEndpoint}; use self::deploy::deploy_cw_hyperlane; -use self::source::CodeSource; +use self::source::{CLISource, CodeSource}; + +// const OSMOSIS_CLI_GIT: &str = "https://github.com/osmosis-labs/osmosis"; +// const OSMOSIS_CLI_VERSION: &str = "19.0.0"; + +const OSMOSIS_CLI_GIT: &str = "https://github.com/hashableric/osmosis"; +const OSMOSIS_CLI_VERSION: &str = "19.0.0-mnts"; const KEY_HPL_VALIDATOR: (&str,&str) = ("hpl-validator", "guard evolve region sentence danger sort despair eye deputy brave trim actor left recipe debate document upgrade sustain bus cage afford half demand pigeon"); const KEY_HPL_RELAYER: (&str,&str) = ("hpl-relayer", "moral item damp melt gloom vendor notice head assume balance doctor retire fashion trim find biology saddle undo switch fault cattle toast drip empty"); @@ -169,7 +175,7 @@ pub fn install_cosmos( #[derive(Clone)] pub struct CosmosConfig { - pub image: String, + pub cli_path: PathBuf, pub home_path: Option, pub codes: BTreeMap, @@ -185,18 +191,12 @@ pub struct CosmosResp { pub node: AgentHandles, pub endpoint: OsmosisEndpoint, pub codes: Codes, - pub image: String, pub home_path: PathBuf, - pub chain_id: String, } impl CosmosResp { - pub fn cli(&self) -> OsmosisCLI { - OsmosisCLI::new( - &self.image, - self.home_path.to_str().unwrap(), - &self.chain_id, - ) + pub fn cli(&self, bin: &Path) -> OsmosisCLI { + OsmosisCLI::new(bin.to_path_buf(), self.home_path.to_str().unwrap()) } } @@ -245,9 +245,9 @@ fn launch_cosmos_node(config: CosmosConfig) -> CosmosResp { None => tempdir().unwrap().into_path(), }; - let cli = OsmosisCLI::new(&config.image, home_path.to_str().unwrap(), &config.chain_id); + let cli = OsmosisCLI::new(config.cli_path, home_path.to_str().unwrap()); - cli.init(&config.moniker); + cli.init(&config.moniker, &config.chain_id); let (node, endpoint) = cli.start(config.node_addr_base, config.node_port_base); let codes = cli.store_codes(&endpoint, "validator", config.codes); @@ -256,9 +256,7 @@ fn launch_cosmos_node(config: CosmosConfig) -> CosmosResp { node, endpoint, codes, - image: config.image, home_path, - chain_id: config.chain_id, } } @@ -322,12 +320,19 @@ fn launch_cosmos_relayer( relayer } +const ENV_CLI_PATH_KEY: &str = "E2E_OSMOSIS_CLI_PATH"; const ENV_CW_HYPERLANE_PATH_KEY: &str = "E2E_CW_HYPERLANE_PATH"; #[allow(dead_code)] fn run_locally() { let debug = false; - let image = env::var("E2E_OSMOSIS_IMAGE").unwrap_or("frostornge/osmosis".to_string()); + + let cli_src = Some( + env::var(ENV_CLI_PATH_KEY) + .as_ref() + .map(|v| CLISource::local(v)) + .unwrap_or_default(), + ); let code_src = Some( env::var(ENV_CW_HYPERLANE_PATH_KEY) @@ -336,11 +341,11 @@ fn run_locally() { .unwrap_or_default(), ); - let codes = code_src.unwrap_or_default().install(None); + let (osmosisd, codes) = install_cosmos(None, cli_src, None, code_src); let addr_base = "tcp://0.0.0.0"; let default_config = CosmosConfig { - image: image.to_string(), + cli_path: osmosisd.clone(), home_path: None, codes, @@ -380,7 +385,7 @@ fn run_locally() { .map(|v| (v.0.join(), v.1, v.2)) .map(|(launch_resp, chain_id, domain)| { let deployments = deploy_cw_hyperlane( - launch_resp.cli(), + launch_resp.cli(&osmosisd), launch_resp.endpoint.clone(), deployer.to_string(), launch_resp.codes.clone(), @@ -410,7 +415,7 @@ fn run_locally() { } for target in targets { - link_networks(linker, validator, node, target); + link_networks(&osmosisd, linker, validator, node, target); } } @@ -435,7 +440,7 @@ fn run_locally() { .map(|v| { ( format!("cosmos-test-{}", v.domain), - AgentConfig::new(&image, validator, v), + AgentConfig::new(osmosisd.clone(), validator, v), ) }) .collect::>(), @@ -480,9 +485,8 @@ fn run_locally() { for target in targets { let cli = OsmosisCLI::new( - &image, + osmosisd.clone(), node.launch_resp.home_path.to_str().unwrap(), - &node.chain_id, ); cli.wasm_execute( diff --git a/rust/utils/run-locally/src/cosmos/source.rs b/rust/utils/run-locally/src/cosmos/source.rs index ca542db218..5c6b61ae98 100644 --- a/rust/utils/run-locally/src/cosmos/source.rs +++ b/rust/utils/run-locally/src/cosmos/source.rs @@ -3,12 +3,15 @@ use std::{collections::BTreeMap, fs, path::PathBuf}; use tempfile::tempdir; use crate::{ - cosmos::utils::{download, unzip}, + cosmos::{ + make_target, + utils::{download, unzip}, + }, logging::log, utils::concat_path, }; -use super::{CW_HYPERLANE_GIT, CW_HYPERLANE_VERSION}; +use super::{CW_HYPERLANE_GIT, CW_HYPERLANE_VERSION, OSMOSIS_CLI_GIT, OSMOSIS_CLI_VERSION}; pub enum CodeSource { Local { path: String }, @@ -72,7 +75,7 @@ impl CodeSource { unzip(&release_comp, dir_path); // make contract_name => path map - fs::read_dir(concat_path(dir_path, release_name)) + fs::read_dir(dir_path) .unwrap() .map(|v| { let entry = v.unwrap(); @@ -90,3 +93,60 @@ impl CodeSource { } } } + +pub enum CLISource { + Local { path: String }, + Remote { url: String, version: String }, +} + +impl Default for CLISource { + fn default() -> Self { + Self::remote(OSMOSIS_CLI_GIT, OSMOSIS_CLI_VERSION) + } +} + +impl CLISource { + pub fn local(path: &str) -> Self { + Self::Local { + path: path.to_string(), + } + } + + pub fn remote(url: &str, version: &str) -> Self { + Self::Remote { + url: url.to_string(), + version: version.to_string(), + } + } +} + +impl CLISource { + fn install_remote(dir: Option, git: String, version: String) -> PathBuf { + let target = make_target(); + + let dir_path = match dir { + Some(path) => path, + None => tempdir().unwrap().into_path(), + }; + let dir_path = dir_path.to_str().unwrap(); + + let release_name = format!("osmosisd-{version}-{target}"); + let release_comp = format!("{release_name}.tar.gz"); + + log!("Downloading Osmosis CLI v{}", version); + let uri = format!("{git}/releases/download/v{version}/{release_comp}"); + download(&release_comp, &uri, dir_path); + + log!("Uncompressing Osmosis release"); + unzip(&release_comp, dir_path); + + concat_path(dir_path, "osmosisd") + } + + pub fn install(self, dir: Option) -> PathBuf { + match self { + CLISource::Local { path } => path.into(), + CLISource::Remote { url, version } => Self::install_remote(dir, url, version), + } + } +} diff --git a/rust/utils/run-locally/src/cosmos/types.rs b/rust/utils/run-locally/src/cosmos/types.rs index f8dc839fa4..2e03f901fa 100644 --- a/rust/utils/run-locally/src/cosmos/types.rs +++ b/rust/utils/run-locally/src/cosmos/types.rs @@ -1,4 +1,4 @@ -use std::collections::BTreeMap; +use std::{collections::BTreeMap, path::PathBuf}; use hpl_interface::types::bech32_decode; @@ -131,12 +131,8 @@ fn to_hex_addr(addr: &str) -> String { } impl AgentConfig { - pub fn new(image: &str, validator: &str, network: &CosmosNetwork) -> Self { - let cli = OsmosisCLI::new( - image, - network.launch_resp.home_path.to_str().unwrap(), - &network.chain_id, - ); + pub fn new(bin: PathBuf, validator: &str, network: &CosmosNetwork) -> Self { + let cli = OsmosisCLI::new(bin, network.launch_resp.home_path.to_str().unwrap()); let validator = cli.get_keypair(validator); AgentConfig { diff --git a/rust/utils/run-locally/src/cosmos/utils.rs b/rust/utils/run-locally/src/cosmos/utils.rs index 24f254b841..75eb27f8c0 100644 --- a/rust/utils/run-locally/src/cosmos/utils.rs +++ b/rust/utils/run-locally/src/cosmos/utils.rs @@ -8,7 +8,6 @@ use crate::utils::TaskHandle; pub(crate) fn sed(from: &str, to: &str, file: &str) { Program::new("sed") .raw_arg("-i") - .raw_arg("-e") .cmd(format!("s/{from}/{to}/g")) .cmd(file) .run() From 14167f70d2ac5ef454c930ed535f9f427efc3eda Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Fri, 22 Sep 2023 23:23:44 +0900 Subject: [PATCH 065/142] Revert "dockerize (wip)" This reverts commit 096d32af4fbcdae1b0fb8e57b17527612248ea95. --- rust/Dockerfile-e2e | 63 ---------------------- rust/utils/run-locally/src/cosmos/mod.rs | 28 ++++------ rust/utils/run-locally/src/cosmos/utils.rs | 1 + 3 files changed, 11 insertions(+), 81 deletions(-) delete mode 100644 rust/Dockerfile-e2e diff --git a/rust/Dockerfile-e2e b/rust/Dockerfile-e2e deleted file mode 100644 index 1962ed4225..0000000000 --- a/rust/Dockerfile-e2e +++ /dev/null @@ -1,63 +0,0 @@ -FROM golang:1.20-alpine as builder - -RUN apk add --no-cache \ - ca-certificates \ - build-base \ - linux-headers \ - git - -WORKDIR /osmosis - -RUN git clone -b v19.0.0-mnts https://github.com/hashableric/osmosis.git . - -# Cosmwasm - Download correct libwasmvm version -RUN ARCH=$(uname -m) && WASMVM_VERSION=$(go list -m github.com/CosmWasm/wasmvm | sed 's/.* //') && \ - wget https://github.com/CosmWasm/wasmvm/releases/download/$WASMVM_VERSION/libwasmvm_muslc.$ARCH.a \ - -O /lib/libwasmvm_muslc.a && \ - # verify checksum - wget https://github.com/CosmWasm/wasmvm/releases/download/$WASMVM_VERSION/checksums.txt -O /tmp/checksums.txt && \ - sha256sum /lib/libwasmvm_muslc.a | grep $(cat /tmp/checksums.txt | grep libwasmvm_muslc.$ARCH | cut -d ' ' -f 1) - -RUN GOWORK=off go build -mod=readonly -tags "netgo,ledger,muslc" \ - -ldflags \ - "-X github.com/cosmos/cosmos-sdk/version.Name="osmosis" \ - -X github.com/cosmos/cosmos-sdk/version.AppName="osmosisd" \ - -X github.com/cosmos/cosmos-sdk/version.Version=${GIT_VERSION} \ - -X github.com/cosmos/cosmos-sdk/version.Commit=${GIT_COMMIT} \ - -X github.com/cosmos/cosmos-sdk/version.BuildTags=netgo,ledger,muslc \ - -w -s -linkmode=external -extldflags '-Wl,-z,muldefs -static'" \ - -trimpath \ - -o build/osmosisd ./cmd/osmosisd - -FROM rust:1.71.1 as tester - -WORKDIR /usr/src - -# 1a: Prepare for static linking -RUN apt-get update && \ - apt-get dist-upgrade -y && \ - apt-get install -y musl-tools clang && \ - rustup target add x86_64-unknown-linux-musl - -# Add workspace to workdir -COPY agents ./agents -COPY chains ./chains -COPY hyperlane-base ./hyperlane-base -COPY hyperlane-core ./hyperlane-core -COPY hyperlane-test ./hyperlane-test -COPY ethers-prometheus ./ethers-prometheus -COPY utils ./utils -COPY sealevel ./sealevel - -COPY Cargo.toml . -COPY Cargo.lock . - -# Build binaries -RUN cargo build --bin validator --bin relayer - -# Copy Osmosis binary from builder -COPY --from=builder /osmosis/build/* /bin - -# RUN \ -# E2E_OSMOSIS_CLI_PATH="/bin/osmosisd" \ -# cargo test --package run-locally --bin run-locally -- cosmos::test::test_run --exact --nocapture diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index 02c5a94929..2d3daafdf3 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -1,8 +1,8 @@ use std::collections::BTreeMap; +use std::fs; use std::path::{Path, PathBuf}; use std::thread::sleep; use std::time::Duration; -use std::{env, fs}; use hpl_interface::mailbox; use hpl_interface::types::bech32_decode; @@ -320,26 +320,18 @@ fn launch_cosmos_relayer( relayer } -const ENV_CLI_PATH_KEY: &str = "E2E_OSMOSIS_CLI_PATH"; -const ENV_CW_HYPERLANE_PATH_KEY: &str = "E2E_CW_HYPERLANE_PATH"; - #[allow(dead_code)] fn run_locally() { let debug = false; - - let cli_src = Some( - env::var(ENV_CLI_PATH_KEY) - .as_ref() - .map(|v| CLISource::local(v)) - .unwrap_or_default(), - ); - - let code_src = Some( - env::var(ENV_CW_HYPERLANE_PATH_KEY) - .as_ref() - .map(|v| CodeSource::local(v)) - .unwrap_or_default(), - ); + let cli_src = Some(CLISource::local( + "/Users/frostornge/dev/osmosis/eric/build/osmosisd", + )); + // let cli_src = None; + + let code_src = Some(CodeSource::local( + "/Users/frostornge/dev/hyperlane/cw-hyperlane/artifacts", + )); + // let code_src = None; let (osmosisd, codes) = install_cosmos(None, cli_src, None, code_src); diff --git a/rust/utils/run-locally/src/cosmos/utils.rs b/rust/utils/run-locally/src/cosmos/utils.rs index 75eb27f8c0..e2e4687d97 100644 --- a/rust/utils/run-locally/src/cosmos/utils.rs +++ b/rust/utils/run-locally/src/cosmos/utils.rs @@ -8,6 +8,7 @@ use crate::utils::TaskHandle; pub(crate) fn sed(from: &str, to: &str, file: &str) { Program::new("sed") .raw_arg("-i") + .cmd("") .cmd(format!("s/{from}/{to}/g")) .cmd(file) .run() From 507172e3e0818659966b2293aceabecda32d1015 Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Fri, 22 Sep 2023 14:25:07 +0000 Subject: [PATCH 066/142] use env --- rust/utils/run-locally/src/cosmos/mod.rs | 28 +++++++++++++++--------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index 2d3daafdf3..02c5a94929 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -1,8 +1,8 @@ use std::collections::BTreeMap; -use std::fs; use std::path::{Path, PathBuf}; use std::thread::sleep; use std::time::Duration; +use std::{env, fs}; use hpl_interface::mailbox; use hpl_interface::types::bech32_decode; @@ -320,18 +320,26 @@ fn launch_cosmos_relayer( relayer } +const ENV_CLI_PATH_KEY: &str = "E2E_OSMOSIS_CLI_PATH"; +const ENV_CW_HYPERLANE_PATH_KEY: &str = "E2E_CW_HYPERLANE_PATH"; + #[allow(dead_code)] fn run_locally() { let debug = false; - let cli_src = Some(CLISource::local( - "/Users/frostornge/dev/osmosis/eric/build/osmosisd", - )); - // let cli_src = None; - - let code_src = Some(CodeSource::local( - "/Users/frostornge/dev/hyperlane/cw-hyperlane/artifacts", - )); - // let code_src = None; + + let cli_src = Some( + env::var(ENV_CLI_PATH_KEY) + .as_ref() + .map(|v| CLISource::local(v)) + .unwrap_or_default(), + ); + + let code_src = Some( + env::var(ENV_CW_HYPERLANE_PATH_KEY) + .as_ref() + .map(|v| CodeSource::local(v)) + .unwrap_or_default(), + ); let (osmosisd, codes) = install_cosmos(None, cli_src, None, code_src); From 9a296e527d1ec2c3c3d701a1f741bcee35a1a720 Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Mon, 25 Sep 2023 00:44:23 +0000 Subject: [PATCH 067/142] re-fix: cw-hyperlane source --- rust/utils/run-locally/src/cosmos/mod.rs | 4 ++-- rust/utils/run-locally/src/cosmos/source.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index 02c5a94929..ce82162d28 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -55,9 +55,9 @@ fn default_keys<'a>() -> [(&'a str, &'a str); 6] { KEY_ACCOUNTS3, ] } - const CW_HYPERLANE_GIT: &str = "https://github.com/many-things/cw-hyperlane"; -const CW_HYPERLANE_VERSION: &str = "0.0.4"; + +const CW_HYPERLANE_VERSION: &str = "0.0.5"; fn make_target() -> String { let os = if cfg!(target_os = "linux") { diff --git a/rust/utils/run-locally/src/cosmos/source.rs b/rust/utils/run-locally/src/cosmos/source.rs index 5c6b61ae98..e883764bf0 100644 --- a/rust/utils/run-locally/src/cosmos/source.rs +++ b/rust/utils/run-locally/src/cosmos/source.rs @@ -75,7 +75,7 @@ impl CodeSource { unzip(&release_comp, dir_path); // make contract_name => path map - fs::read_dir(dir_path) + fs::read_dir(concat_path(dir_path, release_name)) .unwrap() .map(|v| { let entry = v.unwrap(); From 97615953888e4d90d09d56d28175eb87bd760bef Mon Sep 17 00:00:00 2001 From: hashableric Date: Sat, 14 Oct 2023 21:32:20 +0900 Subject: [PATCH 068/142] feat: missed --- .../src/interchain_security_module.rs | 17 ++-- rust/chains/hyperlane-cosmos/src/mailbox.rs | 11 ++- .../hyperlane-cosmos/src/providers/rpc.rs | 77 ++++++++++--------- .../hyperlane-cosmos/src/trait_builder.rs | 13 ++-- rust/hyperlane-base/src/settings/chains.rs | 2 +- rust/hyperlane-base/src/types/multisig.rs | 4 +- 6 files changed, 68 insertions(+), 56 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs index fff8878967..e84e195104 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs @@ -1,6 +1,6 @@ use async_trait::async_trait; use hyperlane_core::{ - ChainResult, ContractLocator, Encode, HyperlaneChain, HyperlaneContract, HyperlaneDomain, + ChainResult, ContractLocator, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneMessage, HyperlaneProvider, InterchainSecurityModule, ModuleType, H256, U256, }; @@ -10,13 +10,19 @@ use crate::{ }; #[derive(Debug)] +/// The Cosmos Interchain Security Module. pub struct CosmosInterchainSecurityModule { + /// The domain of the ISM contract. domain: HyperlaneDomain, + /// The address of the ISM contract. address: H256, + /// The provider for the ISM contract. provider: Box, } +/// The Cosmos Interchain Security Module Implementation. impl CosmosInterchainSecurityModule { + /// Creates a new Cosmos Interchain Security Module. pub fn new(conf: &ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { let provider: WasmGrpcProvider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); @@ -66,11 +72,12 @@ impl InterchainSecurityModule for CosmosInterchainSecurityModule { let data = self.provider.wasm_query(query, None).await?; - // FIXME: consistency - let resp_a = serde_json::from_slice::(&data); - let resp_b = serde_json::from_slice::(&data); + // Handle both the ISMType response and the ModuleTypeResponse response. + let ismtype_response = serde_json::from_slice::(&data); + let moduletye_response = + serde_json::from_slice::(&data); - Ok(match (resp_a, resp_b) { + Ok(match (ismtype_response, moduletye_response) { (Ok(v), _) => ism_type_to_module_type(v), (_, Ok(v)) => ism_type_to_module_type(v.typ), _ => ModuleType::Null, diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index e2e11f6bcb..e2d72c0ad4 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -16,6 +16,7 @@ use async_trait::async_trait; use cosmrs::proto::cosmos::base::abci::v1beta1::TxResponse; use cosmrs::proto::cosmos::tx::v1beta1::SimulateResponse; +use crate::binary::h256_to_h512; use hyperlane_core::{ accumulator::incremental::IncrementalMerkle, utils::fmt_bytes, ChainResult, Checkpoint, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneMessage, HyperlaneProvider, @@ -25,7 +26,6 @@ use hyperlane_core::{ ContractLocator, Decode, MessageIndexer, RawHyperlaneMessage, SequenceIndexer, H512, }; use tracing::{info, instrument, warn}; -use crate::binary::h256_to_h512; /// A reference to a Mailbox contract on some Cosmos chain pub struct CosmosMailbox { @@ -116,7 +116,7 @@ impl Mailbox for CosmosMailbox { let data = self.provider.wasm_query(payload, lag).await; if let Err(e) = data { - println!("error: {:?}", e); + warn!("error: {:?}", e); return Ok(0); } @@ -223,7 +223,9 @@ impl Mailbox for CosmosMailbox { .wasm_send(process_message, tx_gas_limit) .await?; Ok(TxOutcome { - transaction_id: h256_to_h512(H256::from_slice(hex::decode(response.txhash).unwrap().as_slice())), + transaction_id: h256_to_h512(H256::from_slice( + hex::decode(response.txhash).unwrap().as_slice(), + )), executed: response.code == 0, gas_used: U256::from(response.gas_used), gas_price: U256::from(response.gas_wanted), @@ -243,9 +245,6 @@ impl Mailbox for CosmosMailbox { }, }; - println!("process_message: {:?}", process_message); - println!("metadata: {:?}", metadata); - let response: SimulateResponse = self.provider.wasm_simulate(process_message).await?; let result = TxCostEstimate { gas_limit: U256::from(response.gas_info.unwrap().gas_used), diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index 0b698fc82b..0bfa71b3b7 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -115,48 +115,51 @@ impl WasmIndexer for CosmosWasmIndexer { let mut result: Vec<(T, LogMeta)> = vec![]; let tx_results = block_result.txs_results; - if let Some(tx_results) = tx_results { - let addr = self.get_contract_addr()?; - for (idx, tx) in tx_results.iter().enumerate() { - let tx_hash = tx_hash[idx]; - if tx.code.is_err() { - debug!("tx {:?} has failed. skip!", tx_hash); + if tx_results.is_none() { + return Ok(result); + } + + let addr = self.get_contract_addr()?; + + for (idx, tx) in tx_results.unwrap().iter().enumerate() { + let tx_hash = tx_hash[idx]; + if tx.code.is_err() { + debug!("tx {:?} has failed. skip!", tx_hash); + continue; + } + + let mut available = false; + + let mut parse_result: Vec<(T, LogMeta)> = vec![]; + + let logs = serde_json::from_str::>(&tx.log)?; + let logs = logs.first().unwrap(); + + for (log_idx, event) in logs.events.clone().into_iter().enumerate() { + if event.typ.as_str().starts_with(Self::WASM_TYPE) + && event.attributes[0].value == addr + { + available = true; + } else if event.typ.as_str() != self.event_type { continue; } - let mut available = false; - - let mut parse_result: Vec<(T, LogMeta)> = vec![]; - - let logs = serde_json::from_str::>(&tx.log)?; - let logs = logs.first().unwrap(); - - for (log_idx, event) in logs.events.clone().into_iter().enumerate() { - if event.typ.as_str().starts_with(Self::WASM_TYPE) - && event.attributes[0].value == addr - { - available = true; - } else if event.typ.as_str() != self.event_type { - continue; - } - - let msg = parser(event.attributes.clone()); - let meta = LogMeta { - address: bech32_decode(addr.clone()), - block_number: block_number as u64, - block_hash: H256::from_slice(block.block_id.hash.as_bytes()), - transaction_id: h256_to_h512(tx_hash), - transaction_index: idx as u64, - log_index: U256::from(log_idx), - }; - - parse_result.push((msg, meta)); - } + let msg = parser(event.attributes.clone()); + let meta = LogMeta { + address: bech32_decode(addr.clone()), + block_number: block_number as u64, + block_hash: H256::from_slice(block.block_id.hash.as_bytes()), + transaction_id: h256_to_h512(tx_hash), + transaction_index: idx as u64, + log_index: U256::from(log_idx), + }; + + parse_result.push((msg, meta)); + } - if available { - result.extend(parse_result); - } + if available { + result.extend(parse_result); } } diff --git a/rust/chains/hyperlane-cosmos/src/trait_builder.rs b/rust/chains/hyperlane-cosmos/src/trait_builder.rs index e0dc374993..3378fbe21b 100644 --- a/rust/chains/hyperlane-cosmos/src/trait_builder.rs +++ b/rust/chains/hyperlane-cosmos/src/trait_builder.rs @@ -29,9 +29,12 @@ pub struct RawConnectionConf { /// An error type when parsing a connection configuration. #[derive(thiserror::Error, Debug)] pub enum ConnectionConfError { - /// Missing `url` for connection configuration - #[error("Missing `url` for connection configuration")] - MissingConnectionUrl, + /// Missing `rpc_url` for connection configuration + #[error("Missing `rpc_url` for connection configuration")] + MissingConnectionRpcUrl, + /// Missing `grpc_url` for connection configuration + #[error("Missing `grpc_url` for connection configuration")] + MissingConnectionGrpcUrl, /// Missing `chainId` for connection configuration #[error("Missing `chainId` for connection configuration")] MissingChainId, @@ -58,11 +61,11 @@ impl FromRawConf<'_, RawConnectionConf> for ConnectionConf { .into_config_result(|| cwp.join("chainId"))?; let rpc_url = raw .rpc_url - .ok_or(MissingConnectionUrl) + .ok_or(MissingConnectionRpcUrl) .into_config_result(|| cwp.join("rpc_url"))?; let grpc_url = raw .grpc_url - .ok_or(MissingConnectionUrl) + .ok_or(MissingConnectionGrpcUrl) .into_config_result(|| cwp.join("grpc_url"))?; let prefix = raw .prefix diff --git a/rust/hyperlane-base/src/settings/chains.rs b/rust/hyperlane-base/src/settings/chains.rs index f1b1652041..914d67507f 100644 --- a/rust/hyperlane-base/src/settings/chains.rs +++ b/rust/hyperlane-base/src/settings/chains.rs @@ -292,7 +292,7 @@ impl ChainConf { conf.clone(), locator, signer, - "mailbox_process".to_string(), // TODO: is this correct for? + "mailbox_process".to_string(), )); Ok(indexer as Box>) } diff --git a/rust/hyperlane-base/src/types/multisig.rs b/rust/hyperlane-base/src/types/multisig.rs index 37cec3edb4..149d90f181 100644 --- a/rust/hyperlane-base/src/types/multisig.rs +++ b/rust/hyperlane-base/src/types/multisig.rs @@ -167,14 +167,14 @@ impl MultisigCheckpointSyncer { return Ok(Some(checkpoint)); } } else { - info!( + debug!( validator = format!("{:#x}", validator), index = index, "Unable to find signed checkpoint" ); } } else { - info!(%validator, "Unable to find checkpoint syncer"); + debug!(%validator, "Unable to find checkpoint syncer"); continue; } } From 98cd797c7d98b9b23501376ba819943a3729fa83 Mon Sep 17 00:00:00 2001 From: hashableric Date: Sun, 15 Oct 2023 03:17:52 +0900 Subject: [PATCH 069/142] feat: change build_message_indexer into SequenceIndexer --- .../hyperlane-cosmos/src/interchain_gas.rs | 10 +- rust/chains/hyperlane-cosmos/src/mailbox.rs | 120 +++++++++--------- .../hyperlane-cosmos/src/trait_builder.rs | 2 +- rust/hyperlane-base/src/settings/chains.rs | 37 +----- rust/utils/run-locally/src/cosmos/mod.rs | 46 +------ 5 files changed, 68 insertions(+), 147 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index 9bd5e06737..4d5d0d889d 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -78,6 +78,7 @@ impl CosmosInterchainGasPaymasterIndexer { message_id: H256::zero(), payment: U256::zero(), gas_amount: U256::zero(), + destination: 0, }; for attr in attrs { @@ -90,6 +91,7 @@ impl CosmosInterchainGasPaymasterIndexer { } "payment" => res.payment = value.parse().unwrap(), "gas_amount" => res.gas_amount = value.parse().unwrap(), + "dest_domain" => res.destination = value.parse().unwrap(), _ => {} } } @@ -145,18 +147,18 @@ impl Indexer for CosmosInterchainGasPaymasterIndexer { #[async_trait] impl SequenceIndexer for CosmosInterchainGasPaymasterIndexer { - async fn sequence_at_tip(&self) -> ChainResult<(u32, u32)> { + async fn sequence_and_tip(&self) -> ChainResult<(Option, u32)> { // TODO: implement when sealevel scraper support is implemented info!("Message delivery indexing not implemented"); - Ok((1, 1)) + Ok((Some(1), 1)) } } #[async_trait] impl SequenceIndexer for CosmosInterchainGasPaymasterIndexer { - async fn sequence_at_tip(&self) -> ChainResult<(u32, u32)> { + async fn sequence_and_tip(&self) -> ChainResult<(Option, u32)> { // TODO: implement when sealevel scraper support is implemented info!("Message delivery indexing not implemented"); - Ok((1, 1)) + Ok((Some(1), 1)) } } diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index e2d72c0ad4..d27770f5a1 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -2,7 +2,6 @@ use std::fmt::{Debug, Formatter}; use std::io::Cursor; use std::num::NonZeroU64; use std::ops::RangeInclusive; -use std::str::FromStr; use crate::grpc::{WasmGrpcProvider, WasmProvider}; use crate::payloads::general::EventAttribute; @@ -18,13 +17,11 @@ use cosmrs::proto::cosmos::tx::v1beta1::SimulateResponse; use crate::binary::h256_to_h512; use hyperlane_core::{ - accumulator::incremental::IncrementalMerkle, utils::fmt_bytes, ChainResult, Checkpoint, - HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneMessage, HyperlaneProvider, - Indexer, LogMeta, Mailbox, TxCostEstimate, TxOutcome, H256, U256, -}; -use hyperlane_core::{ - ContractLocator, Decode, MessageIndexer, RawHyperlaneMessage, SequenceIndexer, H512, + utils::fmt_bytes, ChainResult, HyperlaneChain, HyperlaneContract, HyperlaneDomain, + HyperlaneMessage, HyperlaneProvider, Indexer, LogMeta, Mailbox, TxCostEstimate, TxOutcome, + H256, U256, }; +use hyperlane_core::{ContractLocator, Decode, RawHyperlaneMessage, SequenceIndexer}; use tracing::{info, instrument, warn}; /// A reference to a Mailbox contract on some Cosmos chain @@ -78,34 +75,34 @@ impl Debug for CosmosMailbox { #[async_trait] impl Mailbox for CosmosMailbox { - #[instrument(level = "debug", err, ret, skip(self))] - async fn tree(&self, lag: Option) -> ChainResult { - let payload = mailbox::MerkleTreeRequest { - merkle_tree: general::EmptyStruct {}, - }; - - let data = self.provider.wasm_query(payload, lag).await?; - let response: mailbox::MerkleTreeResponse = serde_json::from_slice(&data)?; - - let branch = response - .branch - .iter() - .map(|b| { - if b.is_empty() { - "0000000000000000000000000000000000000000000000000000000000000000" - } else { - b - } - }) - .map(H256::from_str) - .collect::, _>>() - .expect("fail to parse tree branch"); - - Ok(IncrementalMerkle { - branch: branch.try_into().unwrap(), - count: response.count as usize, - }) - } + // #[instrument(level = "debug", err, ret, skip(self))] + // async fn tree(&self, lag: Option) -> ChainResult { + // let payload = mailbox::MerkleTreeRequest { + // merkle_tree: general::EmptyStruct {}, + // }; + + // let data = self.provider.wasm_query(payload, lag).await?; + // let response: mailbox::MerkleTreeResponse = serde_json::from_slice(&data)?; + + // let branch = response + // .branch + // .iter() + // .map(|b| { + // if b.is_empty() { + // "0000000000000000000000000000000000000000000000000000000000000000" + // } else { + // b + // } + // }) + // .map(H256::from_str) + // .collect::, _>>() + // .expect("fail to parse tree branch"); + + // Ok(IncrementalMerkle { + // branch: branch.try_into().unwrap(), + // count: response.count as usize, + // }) + // } #[instrument(level = "debug", err, ret, skip(self))] async fn count(&self, lag: Option) -> ChainResult { @@ -150,22 +147,22 @@ impl Mailbox for CosmosMailbox { Ok(delivered) } - #[instrument(level = "debug", err, ret, skip(self))] - async fn latest_checkpoint(&self, lag: Option) -> ChainResult { - let payload = mailbox::CheckPointRequest { - check_point: general::EmptyStruct {}, - }; + // #[instrument(level = "debug", err, ret, skip(self))] + // async fn latest_checkpoint(&self, lag: Option) -> ChainResult { + // let payload = mailbox::CheckPointRequest { + // check_point: general::EmptyStruct {}, + // }; - let data = self.provider.wasm_query(payload, None).await?; - let response: mailbox::CheckPointResponse = serde_json::from_slice(&data)?; + // let data = self.provider.wasm_query(payload, None).await?; + // let response: mailbox::CheckPointResponse = serde_json::from_slice(&data)?; - Ok(Checkpoint { - mailbox_address: self.address, - mailbox_domain: self.domain.id(), - root: response.root.parse().unwrap(), - index: response.count, - }) - } + // Ok(Checkpoint { + // mailbox_address: self.address, + // mailbox_domain: self.domain.id(), + // root: response.root.parse().unwrap(), + // index: response.count, + // }) + // } #[instrument(err, ret, skip(self))] async fn default_ism(&self) -> ChainResult { @@ -317,16 +314,6 @@ impl CosmosMailboxIndexer { } } -#[async_trait] -impl MessageIndexer for CosmosMailboxIndexer { - #[instrument(err, skip(self))] - async fn fetch_count_at_tip(&self) -> ChainResult<(u32, u32)> { - let tip = Indexer::::get_finalized_block_number(self as _).await?; - let count = self.count(None).await?; - Ok((count, tip)) - } -} - #[async_trait] impl Indexer for CosmosMailboxIndexer { async fn fetch_logs( @@ -373,9 +360,18 @@ impl Indexer for CosmosMailboxIndexer { #[async_trait] impl SequenceIndexer for CosmosMailboxIndexer { - async fn sequence_at_tip(&self) -> ChainResult<(u32, u32)> { - // TODO: implement when sealevel scraper support is implemented + async fn sequence_and_tip(&self) -> ChainResult<(Option, u32)> { + // TODO: implement when cosmos scraper support is implemented + info!("Message delivery indexing not implemented"); + Ok((Some(1), 1)) + } +} + +#[async_trait] +impl SequenceIndexer for CosmosMailboxIndexer { + async fn sequence_and_tip(&self) -> ChainResult<(Option, u32)> { + // TODO: implement when cosmos scraper support is implemented info!("Message delivery indexing not implemented"); - Ok((1, 1)) + Ok((Some(1), 1)) } } diff --git a/rust/chains/hyperlane-cosmos/src/trait_builder.rs b/rust/chains/hyperlane-cosmos/src/trait_builder.rs index 3378fbe21b..40ddc10892 100644 --- a/rust/chains/hyperlane-cosmos/src/trait_builder.rs +++ b/rust/chains/hyperlane-cosmos/src/trait_builder.rs @@ -46,7 +46,7 @@ pub enum ConnectionConfError { InvalidConnectionUrl(String, url::ParseError), } -impl FromRawConf<'_, RawConnectionConf> for ConnectionConf { +impl FromRawConf for ConnectionConf { fn from_config_filtered( raw: RawConnectionConf, cwp: &ConfigPath, diff --git a/rust/hyperlane-base/src/settings/chains.rs b/rust/hyperlane-base/src/settings/chains.rs index 914d67507f..3e3d080630 100644 --- a/rust/hyperlane-base/src/settings/chains.rs +++ b/rust/hyperlane-base/src/settings/chains.rs @@ -1,15 +1,12 @@ use ethers::{prelude::Selector, types::Chain}; use std::collections::HashMap; -use ethers::prelude::Selector; use eyre::{eyre, Context, Result}; use serde::Deserialize; -use std::collections::HashMap; use ethers_prometheus::middleware::{ ChainInfo, ContractInfo, PrometheusMiddlewareConf, WalletInfo, }; -use eyre::{eyre, Context, Result}; use hyperlane_core::{ AggregationIsm, CcipReadIsm, ContractLocator, HyperlaneAbi, HyperlaneDomain, HyperlaneDomainProtocol, HyperlaneMessage, HyperlaneProvider, HyperlaneSigner, IndexMode, @@ -65,37 +62,6 @@ pub enum ChainConnectionConf { Cosmos(h_cosmos::ConnectionConf), } -/// Specify the chain name (enum variant) under the `chain` key -#[derive(Debug, Deserialize)] -#[serde(tag = "protocol", content = "connection", rename_all = "camelCase")] -enum RawChainConnectionConf { - Ethereum(h_eth::RawConnectionConf), - Fuel(h_fuel::RawConnectionConf), - Sealevel(h_sealevel::RawConnectionConf), - Cosmos(h_cosmos::RawConnectionConf), - #[serde(other)] - Unknown, -} - -impl FromRawConf<'_, RawChainConnectionConf> for ChainConnectionConf { - fn from_config_filtered( - raw: RawChainConnectionConf, - cwp: &ConfigPath, - _filter: (), - ) -> ConfigResult { - use RawChainConnectionConf::*; - match raw { - Ethereum(r) => Ok(Self::Ethereum(r.parse_config(&cwp.join("connection"))?)), - Fuel(r) => Ok(Self::Fuel(r.parse_config(&cwp.join("connection"))?)), - Sealevel(r) => Ok(Self::Sealevel(r.parse_config(&cwp.join("connection"))?)), - Cosmos(r) => Ok(Self::Cosmos(r.parse_config(&cwp.join("connection"))?)), - Unknown => { - Err(eyre!("Unknown chain protocol")).into_config_result(|| cwp.join("protocol")) - } - } - } -} - impl ChainConnectionConf { /// Get what hyperlane protocol is in use for this chain. pub fn protocol(&self) -> HyperlaneDomainProtocol { @@ -218,6 +184,7 @@ impl ChainConf { .map(|m| Box::new(m) as Box) .map_err(Into::into) } + ChainConnectionConf::Cosmos(conf) => todo!(), } .context(ctx) } @@ -255,7 +222,7 @@ impl ChainConf { signer.clone(), "mailbox_dispatch".to_string(), // TODO: is this correct for? )); - Ok(indexer as Box) + Ok(indexer as Box>) } } .context(ctx) diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index ce82162d28..c9b050d029 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -23,6 +23,7 @@ use types::*; use utils::*; use crate::cosmos::link::link_networks; +use crate::logging::log; use crate::program::Program; use crate::utils::{as_task, concat_path, stop_child, AgentHandles, TaskHandle}; use crate::AGENT_BIN_PATH; @@ -77,51 +78,6 @@ fn make_target() -> String { format!("{}-{}", os, arch) } -pub enum CLISource { - Local { path: String }, - Remote { url: String, version: String }, -} - -impl Default for CLISource { - fn default() -> Self { - Self::Remote { - url: OSMOSIS_CLI_GIT.to_string(), - version: OSMOSIS_CLI_VERSION.to_string(), - } - } -} - -impl CLISource { - fn install_remote(dir: Option, git: String, version: String) -> PathBuf { - let target = make_target(); - - let dir_path = match dir { - Some(path) => path, - None => tempdir().unwrap().into_path(), - }; - let dir_path = dir_path.to_str().unwrap(); - - let release_name = format!("osmosisd-{version}-{target}"); - let release_comp = format!("{release_name}.tar.gz"); - - log!("Downloading Osmosis CLI v{}", version); - let uri = format!("{git}/releases/download/v{version}/{release_comp}"); - download(&release_comp, &uri, dir_path); - - log!("Uncompressing Osmosis release"); - unzip(&release_comp, dir_path); - - concat_path(dir_path, "osmosisd") - } - - pub fn install(self, dir: Option) -> PathBuf { - match self { - CLISource::Local { path } => path.into(), - CLISource::Remote { url, version } => Self::install_remote(dir, url, version), - } - } -} - pub fn install_codes(dir: Option, local: bool) -> BTreeMap { let dir_path = match dir { Some(path) => path, From d96b005a917136d80560978d528ee689de6aa2d4 Mon Sep 17 00:00:00 2001 From: hashableric Date: Sun, 15 Oct 2023 17:54:31 +0900 Subject: [PATCH 070/142] feat: implement defaults --- rust/Cargo.lock | 44 +++- rust/chains/hyperlane-cosmos/Cargo.toml | 2 +- .../src/interchain_security_module.rs | 6 +- rust/chains/hyperlane-cosmos/src/lib.rs | 5 +- rust/chains/hyperlane-cosmos/src/mailbox.rs | 29 --- .../hyperlane-cosmos/src/merkle_tree_hook.rs | 201 ++++++++++++++++++ .../hyperlane-cosmos/src/payloads/mailbox.rs | 25 --- .../src/payloads/merkle_tree_hook.rs | 41 ++++ .../hyperlane-cosmos/src/payloads/mod.rs | 1 + .../hyperlane-cosmos/src/trait_builder.rs | 58 +---- rust/hyperlane-base/src/settings/chains.rs | 23 +- rust/hyperlane-base/src/settings/mod.rs | 1 + .../hyperlane-base/src/settings/parser/mod.rs | 49 +++++ rust/hyperlane-base/src/settings/signers.rs | 79 +------ 14 files changed, 378 insertions(+), 186 deletions(-) create mode 100644 rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs create mode 100644 rust/chains/hyperlane-cosmos/src/payloads/merkle_tree_hook.rs diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 1415ae73ed..0ff1a233da 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -1799,6 +1799,24 @@ dependencies = [ "serde", ] +[[package]] +name = "cw20-base" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09558f87fd3d5e4a479761051b3f98ee2fa723d9e484b5679b6058ad0eadf8f1" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus", + "cw-utils", + "cw2", + "cw20", + "schemars", + "semver", + "serde", + "thiserror", +] + [[package]] name = "cynic" version = "2.2.8" @@ -3872,6 +3890,28 @@ dependencies = [ "thiserror", ] +[[package]] +name = "hpl-interface" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ce374f1f3bf048eacfff71e74ecf4700ef4e6d26085c9b3d89f5bb19bdf1ff5" +dependencies = [ + "bech32 0.9.1", + "cosmwasm-schema", + "cosmwasm-std", + "cosmwasm-storage", + "cw-storage-plus", + "cw2", + "cw20", + "cw20-base", + "ripemd", + "schemars", + "serde", + "sha2 0.10.8", + "sha3 0.10.8", + "thiserror", +] + [[package]] name = "http" version = "0.2.9" @@ -4110,7 +4150,7 @@ dependencies = [ "bech32 0.9.1", "cosmrs", "hex 0.4.3", - "hpl-interface", + "hpl-interface 0.0.2", "hyper", "hyper-tls", "hyperlane-core", @@ -7001,7 +7041,7 @@ dependencies = [ "ctrlc", "eyre", "hex 0.4.3", - "hpl-interface", + "hpl-interface 0.0.1", "hyperlane-core", "k256 0.13.1", "macro_rules_attribute", diff --git a/rust/chains/hyperlane-cosmos/Cargo.toml b/rust/chains/hyperlane-cosmos/Cargo.toml index 15233ce2a8..0da9b9bc93 100644 --- a/rust/chains/hyperlane-cosmos/Cargo.toml +++ b/rust/chains/hyperlane-cosmos/Cargo.toml @@ -26,7 +26,7 @@ hyper = { workspace = true } hyper-tls = { workspace = true } sha256 = { workspace = true } hex = { workspace = true } -hpl-interface = { version = "0.0.1" } +hpl-interface = { version = "0.0.2" } hyperlane-core = { path = "../../hyperlane-core" } diff --git a/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs index e84e195104..02ea5ace9d 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs @@ -57,8 +57,10 @@ fn ism_type_to_module_type(ism_type: hpl_interface::ism::ISMType) -> ModuleType hpl_interface::ism::ISMType::Routing => ModuleType::Routing, hpl_interface::ism::ISMType::Aggregation => ModuleType::Aggregation, hpl_interface::ism::ISMType::LegacyMultisig => ModuleType::MessageIdMultisig, - hpl_interface::ism::ISMType::Multisig => ModuleType::MessageIdMultisig, - hpl_interface::ism::ISMType::Owned => ModuleType::MessageIdMultisig, + hpl_interface::ism::ISMType::MerkleRootMultisig => ModuleType::MerkleRootMultisig, + hpl_interface::ism::ISMType::MessageIdMultisig => ModuleType::MessageIdMultisig, + hpl_interface::ism::ISMType::Null => ModuleType::Null, + hpl_interface::ism::ISMType::CcipRead => ModuleType::CcipRead, _ => ModuleType::Null, } } diff --git a/rust/chains/hyperlane-cosmos/src/lib.rs b/rust/chains/hyperlane-cosmos/src/lib.rs index 99123ce3ad..91fb4701f4 100644 --- a/rust/chains/hyperlane-cosmos/src/lib.rs +++ b/rust/chains/hyperlane-cosmos/src/lib.rs @@ -10,6 +10,7 @@ mod interchain_gas; mod interchain_security_module; mod libs; mod mailbox; +mod merkle_tree_hook; mod multisig_ism; mod payloads; mod providers; @@ -19,8 +20,8 @@ mod trait_builder; mod validator_announce; pub use self::{ - interchain_gas::*, interchain_security_module::*, libs::*, mailbox::*, multisig_ism::*, - providers::*, routing_ism::*, signers::*, trait_builder::*, trait_builder::*, + interchain_gas::*, interchain_security_module::*, libs::*, mailbox::*, merkle_tree_hook::*, + multisig_ism::*, providers::*, routing_ism::*, signers::*, trait_builder::*, trait_builder::*, validator_announce::*, validator_announce::*, }; diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index d27770f5a1..a232d2540a 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -75,35 +75,6 @@ impl Debug for CosmosMailbox { #[async_trait] impl Mailbox for CosmosMailbox { - // #[instrument(level = "debug", err, ret, skip(self))] - // async fn tree(&self, lag: Option) -> ChainResult { - // let payload = mailbox::MerkleTreeRequest { - // merkle_tree: general::EmptyStruct {}, - // }; - - // let data = self.provider.wasm_query(payload, lag).await?; - // let response: mailbox::MerkleTreeResponse = serde_json::from_slice(&data)?; - - // let branch = response - // .branch - // .iter() - // .map(|b| { - // if b.is_empty() { - // "0000000000000000000000000000000000000000000000000000000000000000" - // } else { - // b - // } - // }) - // .map(H256::from_str) - // .collect::, _>>() - // .expect("fail to parse tree branch"); - - // Ok(IncrementalMerkle { - // branch: branch.try_into().unwrap(), - // count: response.count as usize, - // }) - // } - #[instrument(level = "debug", err, ret, skip(self))] async fn count(&self, lag: Option) -> ChainResult { let payload = mailbox::CountRequest { diff --git a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs new file mode 100644 index 0000000000..add815fe7d --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -0,0 +1,201 @@ +use std::{fmt::Debug, num::NonZeroU64, ops::RangeInclusive, str::FromStr}; + +use async_trait::async_trait; +use hyperlane_core::{ + accumulator::incremental::IncrementalMerkle, ChainResult, Checkpoint, ContractLocator, + HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneMessage, HyperlaneProvider, + Indexer, LogMeta, MerkleTreeHook, MerkleTreeInsertion, SequenceIndexer, H256, +}; +use tracing::{info, instrument}; + +use crate::{ + grpc::{WasmGrpcProvider, WasmProvider}, + payloads::{ + general::{self, EventAttribute}, + merkle_tree_hook, + }, + rpc::{CosmosWasmIndexer, WasmIndexer}, + ConnectionConf, CosmosProvider, Signer, +}; + +#[derive(Debug)] +/// A reference to a MerkleTreeHook contract on some Cosmos chain +pub struct CosmosMerkleTreeHook { + /// Connection configuration + _conf: ConnectionConf, + /// Domain + domain: HyperlaneDomain, + /// Contract address + address: H256, + /// Signer + _signer: Signer, + /// Provider + provider: Box, +} + +impl CosmosMerkleTreeHook { + /// create new Cosmos MerkleTreeHook agent + pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); + + Self { + _conf: conf, + domain: locator.domain.clone(), + address: locator.address, + _signer: signer, + provider: Box::new(provider), + } + } +} + +impl HyperlaneContract for CosmosMerkleTreeHook { + fn address(&self) -> H256 { + self.address + } +} + +impl HyperlaneChain for CosmosMerkleTreeHook { + fn domain(&self) -> &HyperlaneDomain { + &self.domain + } + + fn provider(&self) -> Box { + Box::new(CosmosProvider::new(self.domain.clone())) + } +} + +#[async_trait] +impl MerkleTreeHook for CosmosMerkleTreeHook { + /// Return the incremental merkle tree in storage + #[instrument(level = "debug", err, ret, skip(self))] + async fn tree(&self, lag: Option) -> ChainResult { + let payload = merkle_tree_hook::MerkleTreeRequest { + merkle_tree: general::EmptyStruct {}, + }; + + let data = self.provider.wasm_query(payload, lag).await?; + let response: merkle_tree_hook::MerkleTreeResponse = serde_json::from_slice(&data)?; + + let branch = response + .branch + .iter() + .map(|s| s.as_str()) + .map(H256::from_str) + .collect::, _>>() + .expect("fail to parse tree branch"); + + Ok(IncrementalMerkle { + branch: branch.try_into().unwrap(), + count: response.count as usize, + }) + } + + /// Gets the current leaf count of the merkle tree + #[instrument(level = "debug", err, ret, skip(self))] + async fn count(&self, lag: Option) -> ChainResult { + let payload = merkle_tree_hook::MerkleTreeCountRequest { + count: general::EmptyStruct {}, + }; + + let data = self.provider.wasm_query(payload, lag).await?; + let response: merkle_tree_hook::MerkleTreeCountResponse = serde_json::from_slice(&data)?; + + Ok(response.count) + } + + #[instrument(level = "debug", err, ret, skip(self))] + async fn latest_checkpoint(&self, lag: Option) -> ChainResult { + let payload = merkle_tree_hook::CheckPointRequest { + check_point: general::EmptyStruct {}, + }; + + let data = self.provider.wasm_query(payload, None).await?; + let response: merkle_tree_hook::CheckPointResponse = serde_json::from_slice(&data)?; + + Ok(Checkpoint { + merkle_tree_hook_address: self.address, + mailbox_domain: self.domain.id(), + root: response.root.parse().unwrap(), + index: response.count, + }) + } +} + +// ------------------ Indexer ------------------ + +const EVENT_TYPE: &str = "post_dispatch"; + +#[derive(Debug)] +/// A reference to a MerkleTreeHookIndexer contract on some Cosmos chain +pub struct CosmosMerkleeTreeHookIndexer { + /// Cosmwasm indexer instance + indexer: Box, +} + +impl CosmosMerkleeTreeHookIndexer { + /// create new Cosmos MerkleTreeHookIndexer agent + pub fn new(conf: ConnectionConf, locator: ContractLocator) -> Self { + let indexer: CosmosWasmIndexer = + CosmosWasmIndexer::new(conf, locator, EVENT_TYPE.to_string()); + + Self { + indexer: Box::new(indexer), + } + } + + /// Get the parser for the indexer + fn get_parser(&self) -> fn(attrs: Vec) -> MerkleTreeInsertion { + |attrs: Vec| -> MerkleTreeInsertion { + let mut message_id = H256::zero(); + let mut leaf_index: u32 = 0; + + for attr in attrs { + let key = attr.key.as_str(); + let value = attr.value.as_str(); + + match key { + "message_id" => { + message_id = H256::from_slice(hex::decode(value).unwrap().as_slice()) + } + "leaf_index" => leaf_index = value.parse().unwrap(), + _ => {} + } + } + + MerkleTreeInsertion::new(leaf_index, message_id) + } + } +} + +#[async_trait] +impl Indexer for CosmosMerkleeTreeHookIndexer { + /// Fetch list of logs between `range` of blocks + async fn fetch_logs( + &self, + range: RangeInclusive, + ) -> ChainResult> { + let mut result: Vec<(MerkleTreeInsertion, LogMeta)> = vec![]; + let parser = self.get_parser(); + + for block_number in range { + let logs = self.indexer.get_event_log(block_number, parser).await?; + result.extend(logs); + } + + Ok(result) + } + + /// Get the chain's latest block number that has reached finality + async fn get_finalized_block_number(&self) -> ChainResult { + self.indexer.latest_block_height().await + } +} + +#[async_trait] +impl SequenceIndexer for CosmosMerkleeTreeHookIndexer { + async fn sequence_and_tip(&self) -> ChainResult<(Option, u32)> { + // TODO: implement when cosmos scraper support is implemented + info!("Message delivery indexing not implemented"); + Ok((Some(1), 1)) + } +} diff --git a/rust/chains/hyperlane-cosmos/src/payloads/mailbox.rs b/rust/chains/hyperlane-cosmos/src/payloads/mailbox.rs index 74d4e52f7d..4ac87829f6 100644 --- a/rust/chains/hyperlane-cosmos/src/payloads/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/payloads/mailbox.rs @@ -2,9 +2,7 @@ use serde::{Deserialize, Serialize}; use super::general::EmptyStruct; -const TREE_DEPTH: usize = 32; // Requests - #[derive(Serialize, Deserialize, Debug)] pub struct CountRequest { pub count: EmptyStruct, @@ -35,11 +33,6 @@ pub struct DeliveredRequestInner { pub id: String, // hexbinary } -#[derive(Serialize, Deserialize, Debug)] -pub struct MerkleTreeRequest { - pub merkle_tree: EmptyStruct, -} - #[derive(Serialize, Deserialize, Debug)] pub struct ProcessMessageRequest { pub process: ProcessMessageRequestInner, @@ -51,13 +44,7 @@ pub struct ProcessMessageRequestInner { pub message: String, } -#[derive(Serialize, Deserialize, Debug)] -pub struct CheckPointRequest { - pub check_point: EmptyStruct, -} - // Responses - #[derive(Serialize, Deserialize, Debug)] pub struct CountResponse { pub count: u32, @@ -72,15 +59,3 @@ pub struct DefaultIsmResponse { pub struct DeliveredResponse { pub delivered: bool, } - -#[derive(Serialize, Deserialize, Debug)] -pub struct MerkleTreeResponse { - pub branch: [String; TREE_DEPTH], - pub count: u32, -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct CheckPointResponse { - pub root: String, - pub count: u32, -} diff --git a/rust/chains/hyperlane-cosmos/src/payloads/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/payloads/merkle_tree_hook.rs new file mode 100644 index 0000000000..fe6e7a2b30 --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/payloads/merkle_tree_hook.rs @@ -0,0 +1,41 @@ +use serde::{Deserialize, Serialize}; + +use super::general::EmptyStruct; + +const TREE_DEPTH: usize = 32; + +// --------- Requests --------- + +#[derive(Serialize, Deserialize, Debug)] +pub struct MerkleTreeRequest { + pub merkle_tree: EmptyStruct, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct MerkleTreeCountRequest { + pub count: EmptyStruct, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct CheckPointRequest { + pub check_point: EmptyStruct, +} + +// --------- Responses --------- + +#[derive(Serialize, Deserialize, Debug)] +pub struct MerkleTreeResponse { + pub branch: [String; TREE_DEPTH], + pub count: u32, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct MerkleTreeCountResponse { + pub count: u32, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct CheckPointResponse { + pub root: String, + pub count: u32, +} diff --git a/rust/chains/hyperlane-cosmos/src/payloads/mod.rs b/rust/chains/hyperlane-cosmos/src/payloads/mod.rs index 209169158d..775b4eaf16 100644 --- a/rust/chains/hyperlane-cosmos/src/payloads/mod.rs +++ b/rust/chains/hyperlane-cosmos/src/payloads/mod.rs @@ -1,5 +1,6 @@ pub mod general; pub mod ism_routes; pub mod mailbox; +pub mod merkle_tree_hook; pub mod multisig_ism; pub mod validator_announce; diff --git a/rust/chains/hyperlane-cosmos/src/trait_builder.rs b/rust/chains/hyperlane-cosmos/src/trait_builder.rs index 40ddc10892..c2b415939c 100644 --- a/rust/chains/hyperlane-cosmos/src/trait_builder.rs +++ b/rust/chains/hyperlane-cosmos/src/trait_builder.rs @@ -13,19 +13,6 @@ pub struct ConnectionConf { prefix: String, } -/// Raw Cosmos connection configuration used for better deserialization errors. -#[derive(Debug, serde::Deserialize)] -pub struct RawConnectionConf { - /// A single url to connect to rpc - rpc_url: Option, - /// A single url to connect to grpc - grpc_url: Option, - /// The chain ID - chain_id: Option, - /// chain prefix - prefix: Option, -} - /// An error type when parsing a connection configuration. #[derive(thiserror::Error, Debug)] pub enum ConnectionConfError { @@ -46,41 +33,6 @@ pub enum ConnectionConfError { InvalidConnectionUrl(String, url::ParseError), } -impl FromRawConf for ConnectionConf { - fn from_config_filtered( - raw: RawConnectionConf, - cwp: &ConfigPath, - _filter: (), - ) -> ConfigResult { - use ConnectionConfError::*; - - // parse the connection relate informations - let chain_id = raw - .chain_id - .ok_or(MissingChainId) - .into_config_result(|| cwp.join("chainId"))?; - let rpc_url = raw - .rpc_url - .ok_or(MissingConnectionRpcUrl) - .into_config_result(|| cwp.join("rpc_url"))?; - let grpc_url = raw - .grpc_url - .ok_or(MissingConnectionGrpcUrl) - .into_config_result(|| cwp.join("grpc_url"))?; - let prefix = raw - .prefix - .ok_or(MissingPrefix) - .into_config_result(|| cwp.join("prefix"))?; - - Ok(ConnectionConf { - grpc_url, - rpc_url, - chain_id, - prefix, - }) - } -} - impl ConnectionConf { /// Get the GRPC url pub fn get_grpc_url(&self) -> String { @@ -101,4 +53,14 @@ impl ConnectionConf { pub fn get_prefix(&self) -> String { self.prefix.clone() } + + /// Create a new connection configuration + pub fn new(grpc_url: String, rpc_url: String, chain_id: String, prefix: String) -> Self { + Self { + grpc_url, + rpc_url, + chain_id, + prefix, + } + } } diff --git a/rust/hyperlane-base/src/settings/chains.rs b/rust/hyperlane-base/src/settings/chains.rs index 3e3d080630..998442030b 100644 --- a/rust/hyperlane-base/src/settings/chains.rs +++ b/rust/hyperlane-base/src/settings/chains.rs @@ -1,8 +1,7 @@ -use ethers::{prelude::Selector, types::Chain}; +use ethers::prelude::Selector; use std::collections::HashMap; use eyre::{eyre, Context, Result}; -use serde::Deserialize; use ethers_prometheus::middleware::{ ChainInfo, ContractInfo, PrometheusMiddlewareConf, WalletInfo, @@ -184,7 +183,16 @@ impl ChainConf { .map(|m| Box::new(m) as Box) .map_err(Into::into) } - ChainConnectionConf::Cosmos(conf) => todo!(), + ChainConnectionConf::Cosmos(conf) => { + let signer = self.cosmos_signer().await.context(ctx)?.unwrap(); + let hook = h_cosmos::CosmosMerkleTreeHook::new( + conf.clone(), + locator.clone(), + signer.clone(), + ); + + Ok(Box::new(hook) as Box) + } } .context(ctx) } @@ -220,7 +228,7 @@ impl ChainConf { conf.clone(), locator, signer.clone(), - "mailbox_dispatch".to_string(), // TODO: is this correct for? + "mailbox_dispatch".to_string(), )); Ok(indexer as Box>) } @@ -375,6 +383,13 @@ impl ChainConf { let indexer = Box::new(h_sealevel::SealevelMerkleTreeHookIndexer::new()); Ok(indexer as Box>) } + ChainConnectionConf::Cosmos(conf) => { + let indexer = Box::new(h_cosmos::CosmosMerkleeTreeHookIndexer::new( + conf.clone(), + locator, + )); + Ok(indexer as Box>) + } } .context(ctx) } diff --git a/rust/hyperlane-base/src/settings/mod.rs b/rust/hyperlane-base/src/settings/mod.rs index a46a467106..b999b8a323 100644 --- a/rust/hyperlane-base/src/settings/mod.rs +++ b/rust/hyperlane-base/src/settings/mod.rs @@ -73,6 +73,7 @@ pub use signers::*; pub use trace::*; mod envs { + pub use hyperlane_cosmos as h_cosmos; pub use hyperlane_ethereum as h_eth; pub use hyperlane_fuel as h_fuel; pub use hyperlane_sealevel as h_sealevel; diff --git a/rust/hyperlane-base/src/settings/parser/mod.rs b/rust/hyperlane-base/src/settings/parser/mod.rs index cbfe3b2fc3..cdf2960bf7 100644 --- a/rust/hyperlane-base/src/settings/parser/mod.rs +++ b/rust/hyperlane-base/src/settings/parser/mod.rs @@ -257,6 +257,55 @@ fn parse_chain( .into_iter() .next() .map(|url| ChainConnectionConf::Sealevel(h_sealevel::ConnectionConf { url })), + HyperlaneDomainProtocol::Cosmos => { + // ----- only for cosmos ----- + let mut local_err = ConfigParsingError::default(); + + let grpc_url = chain + .chain(&mut local_err) + .get_key("grpcUrls") + .parse_string() + .end() + .or_else(|| { + local_err.push( + &chain.cwp + "grpc_urls", + eyre!("Missing grpc definitions for chain"), + ); + None + }); + + let chain_id = chain + .chain(&mut local_err) + .get_key("chainId") + .parse_string() + .end() + .or_else(|| { + local_err.push(&chain.cwp + "chain_id", eyre!("Missing chain id for chain")); + None + }); + + let prefix = chain + .chain(&mut err) + .get_key("prefix") + .parse_string() + .end() + .or_else(|| { + local_err.push(&chain.cwp + "prefix", eyre!("Missing prefix for chain")); + None + }); + + if !local_err.is_ok() { + err.merge(local_err); + None + } else { + Some(ChainConnectionConf::Cosmos(h_cosmos::ConnectionConf::new( + grpc_url.unwrap().to_string(), + rpcs.first().unwrap().to_string(), + chain_id.unwrap().to_string(), + prefix.unwrap().to_string(), + ))) + } + } }; cfg_unwrap_all!(&chain.cwp, err: [connection, mailbox, interchain_gas_paymaster, validator_announce]); diff --git a/rust/hyperlane-base/src/settings/signers.rs b/rust/hyperlane-base/src/settings/signers.rs index c4bef96aec..50c25ed29c 100644 --- a/rust/hyperlane-base/src/settings/signers.rs +++ b/rust/hyperlane-base/src/settings/signers.rs @@ -10,9 +10,6 @@ use rusoto_core::{HttpClient, HttpConfig, Region}; use rusoto_kms::KmsClient; use tracing::instrument; -use ed25519_dalek::SecretKey; -use hyperlane_sealevel::Keypair; - use super::aws_credentials::AwsChainCredentialsProvider; /// Signer types @@ -43,68 +40,6 @@ pub enum SignerConf { Node, } -/// Raw signer types -#[derive(Debug, Deserialize, Default)] -#[serde(rename_all = "camelCase")] -pub struct RawSignerConf { - #[serde(rename = "type")] - signer_type: Option, - key: Option, - id: Option, - region: Option, - prefix: Option, -} - -impl FromRawConf<'_, RawSignerConf> for SignerConf { - fn from_config_filtered( - raw: RawSignerConf, - cwp: &ConfigPath, - _filter: (), - ) -> ConfigResult { - let key_path = || cwp + "key"; - let region_path = || cwp + "region"; - match raw.signer_type.as_deref() { - Some("hexKey") => Ok(Self::HexKey { - key: raw - .key - .ok_or_else(|| eyre!("Missing `key` for HexKey signer")) - .into_config_result(key_path)? - .parse() - .into_config_result(key_path)?, - }), - Some("aws") => Ok(Self::Aws { - id: raw - .id - .ok_or_else(|| eyre!("Missing `id` for Aws signer")) - .into_config_result(|| cwp + "id")?, - region: raw - .region - .ok_or_else(|| eyre!("Missing `region` for Aws signer")) - .into_config_result(region_path)? - .parse() - .into_config_result(region_path)?, - }), - Some("cosmosKey") => Ok(Self::CosmosKey { - key: raw - .key - .ok_or_else(|| eyre!("Missing `key` for CosmosKey signer")) - .into_config_result(key_path)? - .parse() - .into_config_result(key_path)?, - prefix: raw - .prefix - .ok_or_else(|| eyre!("Missing `prefix` for CosmosKey signer")) - .into_config_result(key_path)?, - }), - Some(t) => Err(eyre!("Unknown signer type `{t}`")).into_config_result(|| cwp + "type"), - None if raw.key.is_some() => Ok(Self::HexKey { - key: raw.key.unwrap().parse().into_config_result(key_path)?, - }), - None => Ok(Self::Node), - } - } -} - impl SignerConf { /// Try to convert the ethereum signer to a local wallet #[instrument(err)] @@ -145,14 +80,12 @@ impl BuildableWithSignerConf for hyperlane_ethereum::Signers { let signer = AwsSigner::new(client, id, 0).await?; hyperlane_ethereum::Signers::Aws(signer) } - SignerConf::CosmosKey { key, .. } => { - hyperlane_ethereum::Signers::Local(LocalWallet::from( - ethers::core::k256::ecdsa::SigningKey::from( - ethers::core::k256::SecretKey::from_be_bytes(key.as_bytes()) - .context("Invalid ethereum signer key")?, - ), - )) - } + SignerConf::CosmosKey { key, .. } => hyperlane_ethereum::Signers::Local( + LocalWallet::from(ethers::core::k256::ecdsa::SigningKey::from( + ethers::core::k256::SecretKey::from_be_bytes(key.as_bytes()) + .context("Invalid ethereum signer key")?, + )), + ), SignerConf::Node => bail!("Node signer"), }) } From 18099a4d17258e1c9a0d1c93aa6d22e294c032c9 Mon Sep 17 00:00:00 2001 From: hashableric Date: Sun, 15 Oct 2023 18:26:15 +0900 Subject: [PATCH 071/142] apply changes for v3 --- rust/agents/validator/src/validator.rs | 8 ++++---- rust/chains/hyperlane-cosmos/src/libs/mod.rs | 5 ++++- rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs | 4 ++-- rust/chains/hyperlane-cosmos/src/providers/mod.rs | 2 ++ rust/chains/hyperlane-cosmos/src/trait_builder.rs | 2 -- rust/hyperlane-base/src/types/multisig.rs | 2 +- 6 files changed, 13 insertions(+), 10 deletions(-) diff --git a/rust/agents/validator/src/validator.rs b/rust/agents/validator/src/validator.rs index e1532ff9e8..666df82887 100644 --- a/rust/agents/validator/src/validator.rs +++ b/rust/agents/validator/src/validator.rs @@ -10,8 +10,10 @@ use tracing::{error, info, info_span, instrument::Instrumented, warn, Instrument use hyperlane_base::{ db::{HyperlaneRocksDB, DB}, - run_all, BaseAgent, CheckpointSyncer, ContractSyncMetrics, CoreMetrics, HyperlaneAgentCore, - MessageContractSync, SignerConf, WatermarkContractSync, + run_all, + settings::SignerConf, + BaseAgent, CheckpointSyncer, ContractSyncMetrics, CoreMetrics, HyperlaneAgentCore, + WatermarkContractSync, }; use hyperlane_core::{ @@ -20,8 +22,6 @@ use hyperlane_core::{ H256, U256, }; use hyperlane_ethereum::{SingletonSigner, SingletonSignerHandle}; -use tokio::{task::JoinHandle, time::sleep}; -use tracing::{error, info, info_span, instrument::Instrumented, warn, Instrument}; use crate::{ settings::ValidatorSettings, diff --git a/rust/chains/hyperlane-cosmos/src/libs/mod.rs b/rust/chains/hyperlane-cosmos/src/libs/mod.rs index 4b721e3fda..6c33ef5122 100644 --- a/rust/chains/hyperlane-cosmos/src/libs/mod.rs +++ b/rust/chains/hyperlane-cosmos/src/libs/mod.rs @@ -1,2 +1,5 @@ +/// This module contains all the verification variables the libraries used by the Hyperlane Cosmos chain. pub mod verify; -pub mod binary; \ No newline at end of file + +/// This module contains all the Binary variables used by the Hyperlane Cosmos chain. +pub mod binary; diff --git a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs index add815fe7d..ea7f12083a 100644 --- a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs +++ b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -3,8 +3,8 @@ use std::{fmt::Debug, num::NonZeroU64, ops::RangeInclusive, str::FromStr}; use async_trait::async_trait; use hyperlane_core::{ accumulator::incremental::IncrementalMerkle, ChainResult, Checkpoint, ContractLocator, - HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneMessage, HyperlaneProvider, - Indexer, LogMeta, MerkleTreeHook, MerkleTreeInsertion, SequenceIndexer, H256, + HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneProvider, Indexer, LogMeta, + MerkleTreeHook, MerkleTreeInsertion, SequenceIndexer, H256, }; use tracing::{info, instrument}; diff --git a/rust/chains/hyperlane-cosmos/src/providers/mod.rs b/rust/chains/hyperlane-cosmos/src/providers/mod.rs index 44b9f81138..cf9422b2f8 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/mod.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/mod.rs @@ -8,12 +8,14 @@ pub mod grpc; /// cosmos rpc provider pub mod rpc; +/// A reference to a Cosmos chain #[derive(Debug)] pub struct CosmosProvider { domain: HyperlaneDomain, } impl CosmosProvider { + /// Create a reference to a Cosmos chain pub fn new(domain: HyperlaneDomain) -> Self { Self { domain } } diff --git a/rust/chains/hyperlane-cosmos/src/trait_builder.rs b/rust/chains/hyperlane-cosmos/src/trait_builder.rs index c2b415939c..a4fbbcf9c6 100644 --- a/rust/chains/hyperlane-cosmos/src/trait_builder.rs +++ b/rust/chains/hyperlane-cosmos/src/trait_builder.rs @@ -1,5 +1,3 @@ -use hyperlane_core::config::{ConfigErrResultExt, ConfigPath, ConfigResult, FromRawConf}; - /// Cosmos connection configuration #[derive(Debug, Clone)] pub struct ConnectionConf { diff --git a/rust/hyperlane-base/src/types/multisig.rs b/rust/hyperlane-base/src/types/multisig.rs index 149d90f181..14113de818 100644 --- a/rust/hyperlane-base/src/types/multisig.rs +++ b/rust/hyperlane-base/src/types/multisig.rs @@ -4,7 +4,7 @@ use std::sync::Arc; use derive_new::new; use eyre::Result; use hyperlane_cosmos::verify::pub_to_binary_addr; -use tracing::{debug, info, instrument, trace, warn}; +use tracing::{debug, instrument, trace}; use hyperlane_core::{MultisigSignedCheckpoint, SignedCheckpointWithMessageId, H160, H256}; From bd91ac7b457c00220c6fe541b30808350a7a4749 Mon Sep 17 00:00:00 2001 From: hashableric Date: Sun, 15 Oct 2023 19:45:45 +0900 Subject: [PATCH 072/142] feat: relayer buildable --- rust/hyperlane-core/src/traits/signing.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/rust/hyperlane-core/src/traits/signing.rs b/rust/hyperlane-core/src/traits/signing.rs index a8622dfe6f..f2d1691af6 100644 --- a/rust/hyperlane-core/src/traits/signing.rs +++ b/rust/hyperlane-core/src/traits/signing.rs @@ -3,8 +3,11 @@ use std::fmt::{Debug, Formatter}; use async_trait::async_trait; use auto_impl::auto_impl; use elliptic_curve::consts::U32; -use ethers_core::k256::ecdsa::recoverable::Signature as RecoverableSignature; -use ethers_core::k256::{ecdsa::Signature as K256Signature, PublicKey as K256PublicKey}; +#[cfg(feature = "ethers")] +use ethers_core::k256::{ + ecdsa::recoverable::Signature as RecoverableSignature, ecdsa::Signature as K256Signature, + PublicKey as K256PublicKey, +}; use generic_array::GenericArray; use serde::{ From 58fef1f1341053201b983f97a4ed3a6a26c220a3 Mon Sep 17 00:00:00 2001 From: hashableric Date: Sun, 15 Oct 2023 20:15:38 +0900 Subject: [PATCH 073/142] feat: implement aggregation_ism --- .../hyperlane-cosmos/src/aggregation_ism.rs | 81 +++++++++++++++++++ rust/chains/hyperlane-cosmos/src/lib.rs | 7 +- rust/chains/hyperlane-cosmos/src/mailbox.rs | 17 ---- .../src/payloads/aggregate_ism.rs | 17 ++++ .../hyperlane-cosmos/src/payloads/mod.rs | 1 + 5 files changed, 103 insertions(+), 20 deletions(-) create mode 100644 rust/chains/hyperlane-cosmos/src/aggregation_ism.rs create mode 100644 rust/chains/hyperlane-cosmos/src/payloads/aggregate_ism.rs diff --git a/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs b/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs new file mode 100644 index 0000000000..30f123bf1a --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs @@ -0,0 +1,81 @@ +use crate::{ + grpc::{WasmGrpcProvider, WasmProvider}, + payloads::aggregate_ism::{ + ModulesAndThresholdRequest, ModulesAndThresholdRequestInner, ModulesAndThresholdResponse, + }, + verify::bech32_decode, + ConnectionConf, CosmosProvider, Signer, +}; +use async_trait::async_trait; +use hyperlane_core::{ + AggregationIsm, ChainResult, ContractLocator, HyperlaneChain, HyperlaneContract, + HyperlaneDomain, HyperlaneMessage, HyperlaneProvider, RawHyperlaneMessage, H256, +}; +use tracing::instrument; + +/// A reference to an AggregationIsm contract on some Cosmos chain +#[derive(Debug)] +pub struct CosmosAggregationIsm { + _conf: ConnectionConf, + domain: HyperlaneDomain, + address: H256, + _signer: Signer, + provider: Box, +} + +impl CosmosAggregationIsm { + /// create new Cosmos AggregationIsm agent + pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); + + Self { + _conf: conf, + domain: locator.domain.clone(), + address: locator.address, + _signer: signer, + provider: Box::new(provider), + } + } +} + +impl HyperlaneContract for CosmosAggregationIsm { + fn address(&self) -> H256 { + self.address + } +} + +impl HyperlaneChain for CosmosAggregationIsm { + fn domain(&self) -> &HyperlaneDomain { + &self.domain + } + + fn provider(&self) -> Box { + Box::new(CosmosProvider::new(self.domain.clone())) + } +} + +#[async_trait] +impl AggregationIsm for CosmosAggregationIsm { + #[instrument(err)] + async fn modules_and_threshold( + &self, + message: &HyperlaneMessage, + ) -> ChainResult<(Vec, u8)> { + let payload = ModulesAndThresholdRequest { + modules_and_threshold: ModulesAndThresholdRequestInner { + message: hex::encode(RawHyperlaneMessage::from(message)), + }, + }; + + let data = self.provider.wasm_query(payload, None).await?; + let response: ModulesAndThresholdResponse = serde_json::from_slice(&data)?; + + let modules: Vec = response + .modules + .iter() + .map(|module| bech32_decode(module.clone())) + .collect(); + + Ok((modules, response.threshold)) + } +} diff --git a/rust/chains/hyperlane-cosmos/src/lib.rs b/rust/chains/hyperlane-cosmos/src/lib.rs index 91fb4701f4..b9ad1caf36 100644 --- a/rust/chains/hyperlane-cosmos/src/lib.rs +++ b/rust/chains/hyperlane-cosmos/src/lib.rs @@ -5,6 +5,7 @@ // TODO: Remove once we start filling things in #![allow(unused_variables)] +mod aggregation_ism; mod contracts; mod interchain_gas; mod interchain_security_module; @@ -20,9 +21,9 @@ mod trait_builder; mod validator_announce; pub use self::{ - interchain_gas::*, interchain_security_module::*, libs::*, mailbox::*, merkle_tree_hook::*, - multisig_ism::*, providers::*, routing_ism::*, signers::*, trait_builder::*, trait_builder::*, - validator_announce::*, validator_announce::*, + aggregation_ism::*, interchain_gas::*, interchain_security_module::*, libs::*, mailbox::*, + merkle_tree_hook::*, multisig_ism::*, providers::*, routing_ism::*, signers::*, + trait_builder::*, trait_builder::*, validator_announce::*, validator_announce::*, }; /// Safe default imports of commonly used traits/types. diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index a232d2540a..0ac22f8db2 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -118,23 +118,6 @@ impl Mailbox for CosmosMailbox { Ok(delivered) } - // #[instrument(level = "debug", err, ret, skip(self))] - // async fn latest_checkpoint(&self, lag: Option) -> ChainResult { - // let payload = mailbox::CheckPointRequest { - // check_point: general::EmptyStruct {}, - // }; - - // let data = self.provider.wasm_query(payload, None).await?; - // let response: mailbox::CheckPointResponse = serde_json::from_slice(&data)?; - - // Ok(Checkpoint { - // mailbox_address: self.address, - // mailbox_domain: self.domain.id(), - // root: response.root.parse().unwrap(), - // index: response.count, - // }) - // } - #[instrument(err, ret, skip(self))] async fn default_ism(&self) -> ChainResult { let payload = mailbox::DefaultIsmRequest { diff --git a/rust/chains/hyperlane-cosmos/src/payloads/aggregate_ism.rs b/rust/chains/hyperlane-cosmos/src/payloads/aggregate_ism.rs new file mode 100644 index 0000000000..a06d6379d3 --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/payloads/aggregate_ism.rs @@ -0,0 +1,17 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Debug)] +pub struct ModulesAndThresholdRequest { + pub modules_and_threshold: ModulesAndThresholdRequestInner, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct ModulesAndThresholdRequestInner { + pub message: String, // hexbinary +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct ModulesAndThresholdResponse { + pub threshold: u8, + pub modules: Vec, +} diff --git a/rust/chains/hyperlane-cosmos/src/payloads/mod.rs b/rust/chains/hyperlane-cosmos/src/payloads/mod.rs index 775b4eaf16..980e501a3c 100644 --- a/rust/chains/hyperlane-cosmos/src/payloads/mod.rs +++ b/rust/chains/hyperlane-cosmos/src/payloads/mod.rs @@ -1,3 +1,4 @@ +pub mod aggregate_ism; pub mod general; pub mod ism_routes; pub mod mailbox; From bc81b78a161631db66597363c37afed20854efdb Mon Sep 17 00:00:00 2001 From: hashableric Date: Sun, 15 Oct 2023 20:18:21 +0900 Subject: [PATCH 074/142] feat: implement aggregation_ism --- rust/hyperlane-base/src/settings/chains.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/rust/hyperlane-base/src/settings/chains.rs b/rust/hyperlane-base/src/settings/chains.rs index 998442030b..e685fd8ffe 100644 --- a/rust/hyperlane-base/src/settings/chains.rs +++ b/rust/hyperlane-base/src/settings/chains.rs @@ -555,8 +555,15 @@ impl ChainConf { ChainConnectionConf::Sealevel(_) => { Err(eyre!("Sealevel does not support aggregation ISM yet")).context(ctx) } - ChainConnectionConf::Cosmos(_) => { - Err(eyre!("Cosmos does not support aggregation ISM yet")).context(ctx) + ChainConnectionConf::Cosmos(conf) => { + let signer = self.cosmos_signer().await.context(ctx)?; + let ism = Box::new(h_cosmos::CosmosAggregationIsm::new( + conf.clone(), + locator.clone(), + signer.unwrap().clone(), + )); + + Ok(ism as Box) } } .context(ctx) From 5a49935c2d340ffb660c730714000245ab99de2f Mon Sep 17 00:00:00 2001 From: hashableric Date: Mon, 16 Oct 2023 23:16:13 +0900 Subject: [PATCH 075/142] feat: make vm runnable --- rust/Cargo.lock | 14 +- rust/Cargo.toml | 6 +- rust/agents/validator/src/settings.rs | 3 +- rust/build | 20 +++ .../hyperlane-cosmos/src/interchain_gas.rs | 8 +- rust/chains/hyperlane-cosmos/src/mailbox.rs | 82 ++++++--- .../hyperlane-cosmos/src/merkle_tree_hook.rs | 4 +- .../hyperlane-cosmos/src/payloads/mailbox.rs | 28 +++- .../hyperlane-base/src/settings/parser/mod.rs | 21 ++- rust/hyperlane-core/src/chain.rs | 6 +- rust/utils/run-locally/Cargo.toml | 1 + rust/utils/run-locally/src/cosmos/cli.rs | 1 - rust/utils/run-locally/src/cosmos/deploy.rs | 155 +++++++++--------- rust/utils/run-locally/src/cosmos/mod.rs | 23 ++- rust/utils/run-locally/src/cosmos/types.rs | 76 ++++----- 15 files changed, 283 insertions(+), 165 deletions(-) create mode 100755 rust/build diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 0ff1a233da..61d43732b9 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -3873,9 +3873,9 @@ dependencies = [ [[package]] name = "hpl-interface" -version = "0.0.1" +version = "0.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0602bdd62a179a66f7ed16e3e3a76b7c72cccf87437dcd0d8bc79f978fd13c2d" +checksum = "7ce374f1f3bf048eacfff71e74ecf4700ef4e6d26085c9b3d89f5bb19bdf1ff5" dependencies = [ "bech32 0.9.1", "cosmwasm-schema", @@ -3884,17 +3884,20 @@ dependencies = [ "cw-storage-plus", "cw2", "cw20", + "cw20-base", + "ripemd", "schemars", "serde", + "sha2 0.10.8", "sha3 0.10.8", "thiserror", ] [[package]] name = "hpl-interface" -version = "0.0.2" +version = "0.0.6-rc0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ce374f1f3bf048eacfff71e74ecf4700ef4e6d26085c9b3d89f5bb19bdf1ff5" +checksum = "38ee99a46cbcd112d634b544f3a4009ba7afb3de656218db18708d56aeec3996" dependencies = [ "bech32 0.9.1", "cosmwasm-schema", @@ -7038,10 +7041,11 @@ dependencies = [ name = "run-locally" version = "0.1.0" dependencies = [ + "cosmwasm-schema", "ctrlc", "eyre", "hex 0.4.3", - "hpl-interface 0.0.1", + "hpl-interface 0.0.6-rc0", "hyperlane-core", "k256 0.13.1", "macro_rules_attribute", diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 0877000f50..213dfa6a50 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -177,9 +177,13 @@ hyper = "0.14" hyper-tls = "0.5.0" hex = "0.4.3" tendermint-rpc = { version = "0.32.0", features = ["http-client", "tokio"]} -hpl-interface = "0.0.1" +hpl-interface = "0.0.6-rc0" elliptic-curve = "0.12.3" +## TODO: remove this +cosmwasm-schema = "1.2.7" + + [workspace.dependencies.ethers] git = "https://github.com/hyperlane-xyz/ethers-rs" tag = "2023-06-01" diff --git a/rust/agents/validator/src/settings.rs b/rust/agents/validator/src/settings.rs index 4c2c673b2a..f6870a31c5 100644 --- a/rust/agents/validator/src/settings.rs +++ b/rust/agents/validator/src/settings.rs @@ -65,7 +65,8 @@ impl FromRawConf for ValidatorSettings { .end(); let origin_chain_name_set = origin_chain_name.map(|s| HashSet::from([s])); - let base = p + + let base: Option = p .parse_from_raw_config::>>( origin_chain_name_set.as_ref(), "Expected valid base agent configuration", diff --git a/rust/build b/rust/build new file mode 100755 index 0000000000..807b06cac6 --- /dev/null +++ b/rust/build @@ -0,0 +1,20 @@ +TAG=$1 +USE_DEFAULT_PLATFORM=$2 +if [[ -z $TAG ]]; then + TAG="sha-$(git rev-parse --short HEAD)" + echo "Defaulting to tag $TAG" + + if [[ ! -z $(git status -s) ]]; then + echo "Note there are uncommitted changes" + fi + + # Apple M1 chips by default will build for arm64, which isn't compatible + # with our K8s setup. By manually building for amd64, we build an image + # compatible with our K8s infrastructure. + # More info: https://stackoverflow.com/a/71102144 + if [[ $USE_DEFAULT_PLATFORM != "true" ]]; then + PLATFORM="--platform=linux/amd64" + fi +fi + +DOCKER_BUILDKIT=1 docker build $PLATFORM -t gcr.io/abacus-labs-dev/hyperlane-agent:$TAG . diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index 4d5d0d889d..18dfaf45ff 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -149,8 +149,8 @@ impl Indexer for CosmosInterchainGasPaymasterIndexer { impl SequenceIndexer for CosmosInterchainGasPaymasterIndexer { async fn sequence_and_tip(&self) -> ChainResult<(Option, u32)> { // TODO: implement when sealevel scraper support is implemented - info!("Message delivery indexing not implemented"); - Ok((Some(1), 1)) + let tip = self.indexer.latest_block_height().await?; + Ok((None, tip)) } } @@ -158,7 +158,7 @@ impl SequenceIndexer for CosmosInterchainGasPaymasterIndex impl SequenceIndexer for CosmosInterchainGasPaymasterIndexer { async fn sequence_and_tip(&self) -> ChainResult<(Option, u32)> { // TODO: implement when sealevel scraper support is implemented - info!("Message delivery indexing not implemented"); - Ok((Some(1), 1)) + let tip = self.indexer.latest_block_height().await?; + Ok((None, tip)) } } diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 0ac22f8db2..415ea54aad 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -5,7 +5,9 @@ use std::ops::RangeInclusive; use crate::grpc::{WasmGrpcProvider, WasmProvider}; use crate::payloads::general::EventAttribute; -use crate::payloads::mailbox::{ProcessMessageRequest, ProcessMessageRequestInner}; +use crate::payloads::mailbox::{ + GeneralMailboxQuery, ProcessMessageRequest, ProcessMessageRequestInner, +}; use crate::payloads::{general, mailbox}; use crate::rpc::{CosmosWasmIndexer, WasmIndexer}; use crate::CosmosProvider; @@ -81,7 +83,10 @@ impl Mailbox for CosmosMailbox { count: general::EmptyStruct {}, }; - let data = self.provider.wasm_query(payload, lag).await; + let data = self + .provider + .wasm_query(GeneralMailboxQuery { mailbox: payload }, lag) + .await; if let Err(e) = data { warn!("error: {:?}", e); @@ -99,7 +104,11 @@ impl Mailbox for CosmosMailbox { message_delivered: mailbox::DeliveredRequestInner { id }, }; - let delivered = match self.provider.wasm_query(payload, None).await { + let delivered = match self + .provider + .wasm_query(GeneralMailboxQuery { mailbox: payload }, None) + .await + { Ok(v) => { let response: mailbox::DeliveredResponse = serde_json::from_slice(&v)?; @@ -124,7 +133,10 @@ impl Mailbox for CosmosMailbox { default_ism: general::EmptyStruct {}, }; - let data = self.provider.wasm_query(payload, None).await?; + let data = self + .provider + .wasm_query(GeneralMailboxQuery { mailbox: payload }, None) + .await?; let response: mailbox::DefaultIsmResponse = serde_json::from_slice(&data)?; // convert Hex to H256 @@ -136,22 +148,20 @@ impl Mailbox for CosmosMailbox { async fn recipient_ism(&self, recipient: H256) -> ChainResult { let address = verify::digest_to_addr(recipient, &self.signer.prefix)?; - let payload = mailbox::ISMSpecifierRequest { - interchain_security_module: vec![], + let payload = mailbox::RecipientIsmRequest { + recipient_ism: mailbox::RecipientIsmRequestInner { + recipient_addr: address, + }, }; - let data = self.provider.wasm_query_to(address, payload, None).await?; - - let response: mailbox::ISMSpecifierResponse = serde_json::from_slice(&data)?; + let data = self + .provider + .wasm_query(GeneralMailboxQuery { mailbox: payload }, None) + .await?; + let response: mailbox::RecipientIsmResponse = serde_json::from_slice(&data)?; // convert Hex to H256 - let default_ism = self.default_ism().await?; - let ism = response - .ism - .map(hex::decode) - .transpose()? - .map(|v| H256::from_slice(&v)) - .unwrap_or(default_ism); + let ism = verify::bech32_decode(response.ism); Ok(ism) } @@ -261,11 +271,29 @@ impl CosmosMailboxIndexer { count: general::EmptyStruct {}, }; - let data = self.provider.wasm_query(payload, lag).await?; + let data = self + .provider + .wasm_query(GeneralMailboxQuery { mailbox: payload }, lag) + .await?; let response: mailbox::CountResponse = serde_json::from_slice(&data)?; Ok(response.count) } + + #[instrument(level = "debug", err, ret, skip(self))] + async fn nonce(&self, lag: Option) -> ChainResult { + let payload = mailbox::NonceRequest { + nonce: general::EmptyStruct {}, + }; + + let data = self + .provider + .wasm_query(GeneralMailboxQuery { mailbox: payload }, lag) + .await?; + let response: mailbox::NonceResponse = serde_json::from_slice(&data)?; + + Ok(response.nonce) + } } #[async_trait] @@ -316,8 +344,14 @@ impl Indexer for CosmosMailboxIndexer { impl SequenceIndexer for CosmosMailboxIndexer { async fn sequence_and_tip(&self) -> ChainResult<(Option, u32)> { // TODO: implement when cosmos scraper support is implemented - info!("Message delivery indexing not implemented"); - Ok((Some(1), 1)) + let tip = self.indexer.latest_block_height().await?; + + let sequence = match NonZeroU64::new(tip as u64) { + None => None, + Some(n) => Some(self.nonce(Some(n)).await?), + }; + + Ok((sequence, tip)) } } @@ -325,7 +359,13 @@ impl SequenceIndexer for CosmosMailboxIndexer { impl SequenceIndexer for CosmosMailboxIndexer { async fn sequence_and_tip(&self) -> ChainResult<(Option, u32)> { // TODO: implement when cosmos scraper support is implemented - info!("Message delivery indexing not implemented"); - Ok((Some(1), 1)) + let tip = self.indexer.latest_block_height().await?; + + let sequence = match NonZeroU64::new(tip as u64) { + None => None, + Some(n) => Some(self.nonce(Some(n)).await?), + }; + + Ok((sequence, tip)) } } diff --git a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs index ea7f12083a..f7a092abfb 100644 --- a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs +++ b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -195,7 +195,7 @@ impl Indexer for CosmosMerkleeTreeHookIndexer { impl SequenceIndexer for CosmosMerkleeTreeHookIndexer { async fn sequence_and_tip(&self) -> ChainResult<(Option, u32)> { // TODO: implement when cosmos scraper support is implemented - info!("Message delivery indexing not implemented"); - Ok((Some(1), 1)) + let tip = self.indexer.latest_block_height().await?; + Ok((None, tip)) } } diff --git a/rust/chains/hyperlane-cosmos/src/payloads/mailbox.rs b/rust/chains/hyperlane-cosmos/src/payloads/mailbox.rs index 4ac87829f6..145ba5b16c 100644 --- a/rust/chains/hyperlane-cosmos/src/payloads/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/payloads/mailbox.rs @@ -3,19 +3,29 @@ use serde::{Deserialize, Serialize}; use super::general::EmptyStruct; // Requests +#[derive(Serialize, Deserialize, Debug)] +pub struct GeneralMailboxQuery { + pub mailbox: T, +} + #[derive(Serialize, Deserialize, Debug)] pub struct CountRequest { pub count: EmptyStruct, } #[derive(Serialize, Deserialize, Debug)] -pub struct ISMSpecifierRequest { - pub interchain_security_module: Vec<()>, +pub struct NonceRequest { + pub nonce: EmptyStruct, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct RecipientIsmRequest { + pub recipient_ism: RecipientIsmRequestInner, } #[derive(Serialize, Deserialize, Debug)] -pub struct ISMSpecifierResponse { - pub ism: Option, +pub struct RecipientIsmRequestInner { + pub recipient_addr: String, // hexbinary } #[derive(Serialize, Deserialize, Debug)] @@ -50,6 +60,11 @@ pub struct CountResponse { pub count: u32, } +#[derive(Serialize, Deserialize, Debug)] +pub struct NonceResponse { + pub nonce: u32, +} + #[derive(Serialize, Deserialize, Debug)] pub struct DefaultIsmResponse { pub default_ism: String, // hexbineary @@ -59,3 +74,8 @@ pub struct DefaultIsmResponse { pub struct DeliveredResponse { pub delivered: bool, } + +#[derive(Serialize, Deserialize, Debug)] +pub struct RecipientIsmResponse { + pub ism: String, +} diff --git a/rust/hyperlane-base/src/settings/parser/mod.rs b/rust/hyperlane-base/src/settings/parser/mod.rs index cdf2960bf7..de06129d11 100644 --- a/rust/hyperlane-base/src/settings/parser/mod.rs +++ b/rust/hyperlane-base/src/settings/parser/mod.rs @@ -263,12 +263,12 @@ fn parse_chain( let grpc_url = chain .chain(&mut local_err) - .get_key("grpcUrls") + .get_key("grpcUrl") .parse_string() .end() .or_else(|| { local_err.push( - &chain.cwp + "grpc_urls", + &chain.cwp + "grpc_url", eyre!("Missing grpc definitions for chain"), ); None @@ -407,11 +407,28 @@ fn parse_signer(signer: ValueParser) -> ConfigResult { .unwrap_or_default(); err.into_result(SignerConf::Aws { id, region }) }}; + (cosmosKey) => {{ + let key = signer + .chain(&mut err) + .get_key("key") + .parse_private_key() + .unwrap_or_default(); + let prefix = signer + .chain(&mut err) + .get_key("prefix") + .parse_string() + .unwrap_or_default(); + err.into_result(SignerConf::CosmosKey { + key, + prefix: prefix.to_string(), + }) + }}; } match signer_type { Some("hexKey") => parse_signer!(hexKey), Some("aws") => parse_signer!(aws), + Some("cosmosKey") => parse_signer!(cosmosKey), Some(t) => { Err(eyre!("Unknown signer type `{t}`")).into_config_result(|| &signer.cwp + "type") } diff --git a/rust/hyperlane-core/src/chain.rs b/rust/hyperlane-core/src/chain.rs index 2987122b63..94c2c5c44e 100644 --- a/rust/hyperlane-core/src/chain.rs +++ b/rust/hyperlane-core/src/chain.rs @@ -99,11 +99,9 @@ pub enum KnownHyperlaneDomain { LineaGoerli = 59140, BaseGoerli = 84531, ScrollSepolia = 534351, - + /// Cosmos local chains - #[cfg_attr(feature = "strum", strum(serialize = "cosmos-test-26657"))] CosmosTest26657 = 26657, - #[cfg_attr(feature = "strum", strum(serialize = "cosmos-test-26658"))] CosmosTest26658 = 26658, } @@ -306,7 +304,7 @@ impl HyperlaneDomain { ) -> Result { let name = name.to_ascii_lowercase(); if let Ok(domain) = KnownHyperlaneDomain::try_from(domain_id) { - if name == domain.as_str() { + if name == domain.as_str().to_ascii_lowercase() { Ok(HyperlaneDomain::Known(domain)) } else { Err(HyperlaneDomainConfigError::UnknownDomainName(name)) diff --git a/rust/utils/run-locally/Cargo.toml b/rust/utils/run-locally/Cargo.toml index d5b45c2b7a..04b272658b 100644 --- a/rust/utils/run-locally/Cargo.toml +++ b/rust/utils/run-locally/Cargo.toml @@ -28,3 +28,4 @@ macro_rules_attribute.workspace = true regex.workspace = true hyperlane-core = { path = "../../hyperlane-core" } hpl-interface.workspace = true +cosmwasm-schema.workspace = true diff --git a/rust/utils/run-locally/src/cosmos/cli.rs b/rust/utils/run-locally/src/cosmos/cli.rs index 8b1be42b10..6df450d7c9 100644 --- a/rust/utils/run-locally/src/cosmos/cli.rs +++ b/rust/utils/run-locally/src/cosmos/cli.rs @@ -194,7 +194,6 @@ impl OsmosisCLI { ret.insert(name, code_id); } - serde_json::from_str(&serde_json::to_string(&ret).unwrap()).unwrap() } diff --git a/rust/utils/run-locally/src/cosmos/deploy.rs b/rust/utils/run-locally/src/cosmos/deploy.rs index 1fe9598959..7a8dd0feb0 100644 --- a/rust/utils/run-locally/src/cosmos/deploy.rs +++ b/rust/utils/run-locally/src/cosmos/deploy.rs @@ -1,4 +1,5 @@ -use hpl_interface::{hub, igp_core, igp_gas_oracle, ism, va}; +use cosmwasm_schema::cw_serde; +use hpl_interface::{core, hook, igp, ism}; use macro_rules_attribute::apply; use crate::utils::as_task; @@ -8,56 +9,19 @@ use super::{ types::{Codes, Deployments}, }; -fn deploy_hub_mailbox( - cli: &OsmosisCLI, - endpoint: &OsmosisEndpoint, - (deployer, deployer_addr): (&str, &str), // (name, addr) - hub_code_id: u64, - mailbox_code_id: u64, - default_ism: &str, - origin_domain: u32, -) -> (String, String) { - // deploy hub - let hub = cli.wasm_init( - endpoint, - deployer, - Some(deployer_addr), - hub_code_id, - hub::InstantiateMsg { - origin_domain, - mailbox_code: mailbox_code_id, - }, - "hpl_hub", - ); - - let init_resp = cli.wasm_execute( - endpoint, - deployer, - &hub, - hub::ExecuteMsg::Instantiate { - owner: deployer_addr.to_string(), - default_ism: default_ism.to_string(), - }, - vec![], - ); +#[cw_serde] +pub struct IsmMultisigInstantiateMsg { + pub owner: String, + pub hrp: String, +} - let init_log = init_resp.logs.first().unwrap(); - let init_evt = init_log - .events - .iter() - .find(|v| v.typ == "wasm-mailbox_instantiated") - .unwrap(); - - let mailbox_addr = &init_evt - .attributes - .iter() - .find(|v| v.key == "_contract_address") - .unwrap() - .value; - - (hub, mailbox_addr.clone()) +#[cw_serde] +pub struct TestMockMsgReceiverInstantiateMsg { + pub hrp: String, } +const PREFIX: &str = "osmo"; + #[apply(as_task)] pub fn deploy_cw_hyperlane( cli: OsmosisCLI, @@ -68,26 +32,41 @@ pub fn deploy_cw_hyperlane( ) -> Deployments { let deployer_addr = &cli.get_addr(&deployer); + let mailbox = cli.wasm_init( + &endpoint, + &deployer, + Some(deployer_addr), + codes.hpl_mailbox, + core::mailbox::InstantiateMsg { + owner: deployer_addr.to_string(), + hrp: PREFIX.to_string(), + domain, + }, + "hpl_mailbox", + ); + // deploy igp set let igp = cli.wasm_init( &endpoint, &deployer, Some(deployer_addr), - codes.hpl_igp_core, - igp_core::InstantiateMsg { + codes.hpl_igp, + igp::core::InstantiateMsg { owner: deployer_addr.clone(), gas_token: "uosmo".to_string(), + mailbox: mailbox.to_string(), beneficiary: deployer_addr.clone(), + hrp: PREFIX.to_string(), }, - "hpl_igp_core", + "hpl_igp", ); let igp_oracle = cli.wasm_init( &endpoint, &deployer, Some(deployer_addr), - codes.hpl_igp_gas_oracle, - igp_gas_oracle::InstantiateMsg {}, + codes.hpl_igp_oracle, + igp::oracle::InstantiateMsg {}, "hpl_igp_gas_oracle", ); @@ -101,7 +80,7 @@ pub fn deploy_cw_hyperlane( owner: deployer_addr.clone(), isms: vec![], }, - "hpl_routing_ism", + "hpl_ism_routing", ); // deploy ism - multisig ism with no enrolled validators @@ -110,31 +89,37 @@ pub fn deploy_cw_hyperlane( &deployer, Some(deployer_addr), codes.hpl_ism_multisig, - ism::multisig::InstantiateMsg { + IsmMultisigInstantiateMsg { owner: deployer_addr.clone(), - addr_prefix: "osmo".to_string(), + hrp: PREFIX.to_string(), }, - "hpl_multisig_ism", + "hpl_ism_multisig", ); - let (hub, mailbox) = deploy_hub_mailbox( - &cli, + // deploy merkle hook + let hook_merkle = cli.wasm_init( &endpoint, - (&deployer, deployer_addr), - codes.hpl_hub, - codes.hpl_mailbox, - &ism_routing, - domain, + &deployer, + Some(deployer_addr), + codes.hpl_hook_merkle, + hook::merkle::InstantiateMsg { + owner: deployer_addr.clone(), + mailbox: mailbox.to_string(), + }, + "hpl_hook_merkle", ); - // deploy mock receiver - let mock_receiver = cli.wasm_init( + // deploy routing hook + let hook_routing = cli.wasm_init( &endpoint, &deployer, Some(deployer_addr), - codes.hpl_test_mock_msg_receiver, - igp_gas_oracle::InstantiateMsg {}, - "hpl_test_mock_msg_receiver", + codes.hpl_hook_routing, + hook::routing::InstantiateMsg { + owner: deployer_addr.clone(), + mailbox: mailbox.to_string(), + }, + "hpl_hook_routing", ); // deploy va @@ -143,22 +128,46 @@ pub fn deploy_cw_hyperlane( &deployer, Some(deployer_addr), codes.hpl_validator_announce, - va::InstantiateMsg { - addr_prefix: "osmo".to_string(), + core::va::InstantiateMsg { + hrp: PREFIX.to_string(), mailbox: mailbox.to_string(), - local_domain: domain, }, "hpl_validator_announce", ); + // ---------- mock area ----------- + // deploy mock receiver + let mock_receiver = cli.wasm_init( + &endpoint, + &deployer, + Some(deployer_addr), + codes.hpl_test_mock_msg_receiver, + TestMockMsgReceiverInstantiateMsg { + hrp: PREFIX.to_string(), + }, + "hpl_test_mock_msg_receiver", + ); + + // deploy mock hook + let mock_hook = cli.wasm_init( + &endpoint, + &deployer, + Some(deployer_addr), + codes.hpl_test_mock_hook, + igp::oracle::InstantiateMsg {}, + "hpl_test_mock_hook", + ); + Deployments { + hook_merkle, + hook_routing, igp, igp_oracle, ism_routing, ism_multisig, - hub, mailbox, mock_receiver, + mock_hook, va, } } diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index c9b050d029..dc48acf2c8 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -4,8 +4,7 @@ use std::thread::sleep; use std::time::Duration; use std::{env, fs}; -use hpl_interface::mailbox; -use hpl_interface::types::bech32_decode; +use hpl_interface::{core, types::bech32_decode}; use macro_rules_attribute::apply; use tempfile::tempdir; @@ -58,7 +57,7 @@ fn default_keys<'a>() -> [(&'a str, &'a str); 6] { } const CW_HYPERLANE_GIT: &str = "https://github.com/many-things/cw-hyperlane"; -const CW_HYPERLANE_VERSION: &str = "0.0.5"; +const CW_HYPERLANE_VERSION: &str = "0.0.6-rc0"; fn make_target() -> String { let os = if cfg!(target_os = "linux") { @@ -88,7 +87,7 @@ pub fn install_codes(dir: Option, local: bool) -> BTreeMap, local: bool) -> BTreeMap path map fs::read_dir(dir_path) .unwrap() @@ -225,6 +226,7 @@ fn launch_cosmos_validator( let validator_bin = concat_path(format!("../../{AGENT_BIN_PATH}"), "validator"); let validator_base = tempdir().unwrap(); let validator_base_db = concat_path(&validator_base, "db"); + fs::create_dir_all(&validator_base).unwrap(); fs::create_dir_all(&validator_base_db).unwrap(); let checkpoint_path = concat_path(&validator_base, "checkpoint"); @@ -243,7 +245,7 @@ fn launch_cosmos_validator( .hyp_env("ORIGINCHAINNAME", agent_config.name) .hyp_env("REORGPERIOD", "1") .hyp_env("DB", validator_base_db.to_str().unwrap()) - .hyp_env("METRICS", agent_config.domain.to_string()) + .hyp_env("METRICS", agent_config.domain_id.to_string()) .hyp_env("VALIDATOR_KEY", agent_config.signer.key) .hyp_env("VALIDATOR_TYPE", agent_config.signer.typ) .hyp_env("VALIDATOR_PREFIX", "osmo1") @@ -297,8 +299,9 @@ fn run_locally() { .unwrap_or_default(), ); - let (osmosisd, codes) = install_cosmos(None, cli_src, None, code_src); + let codes_dir = PathBuf::from("/Users/eric/many-things/mitosis/cw-hyperlane/artifacts/actual"); + let (osmosisd, codes) = install_cosmos(None, cli_src, Some(codes_dir), code_src); let addr_base = "tcp://0.0.0.0"; let default_config = CosmosConfig { cli_path: osmosisd.clone(), @@ -395,7 +398,7 @@ fn run_locally() { .iter() .map(|v| { ( - format!("cosmos-test-{}", v.domain), + format!("cosmostest{}", v.domain), AgentConfig::new(osmosisd.clone(), validator, v), ) }) @@ -449,13 +452,15 @@ fn run_locally() { &node.launch_resp.endpoint, linker, &node.deployments.mailbox, - mailbox::ExecuteMsg::Dispatch { + core::mailbox::ExecuteMsg::Dispatch(core::mailbox::DispatchMsg { dest_domain: target.domain, recipient_addr: bech32_decode(&target.deployments.mock_receiver) .unwrap() .into(), msg_body: b"hello".into(), - }, + hook: None, + metadata: None, + }), vec![], ); } diff --git a/rust/utils/run-locally/src/cosmos/types.rs b/rust/utils/run-locally/src/cosmos/types.rs index 2e03f901fa..e7e8b23068 100644 --- a/rust/utils/run-locally/src/cosmos/types.rs +++ b/rust/utils/run-locally/src/cosmos/types.rs @@ -43,29 +43,30 @@ pub struct Coin { #[derive(serde::Serialize, serde::Deserialize, Clone)] pub struct Codes { - pub hpl_hub: u64, - pub hpl_igp_core: u64, - pub hpl_igp_gas_oracle: u64, + pub hpl_hook_merkle: u64, + pub hpl_hook_routing: u64, + pub hpl_igp: u64, + pub hpl_igp_oracle: u64, pub hpl_ism_multisig: u64, pub hpl_ism_routing: u64, pub hpl_test_mock_ism: u64, + pub hpl_test_mock_hook: u64, pub hpl_test_mock_msg_receiver: u64, - pub hpl_token_cw20: u64, - pub hpl_token_native: u64, pub hpl_mailbox: u64, - pub hpl_multicall: u64, pub hpl_validator_announce: u64, } #[derive(serde::Serialize, serde::Deserialize, Clone)] pub struct Deployments { + pub hook_merkle: String, + pub hook_routing: String, pub igp: String, pub igp_oracle: String, pub ism_routing: String, pub ism_multisig: String, - pub hub: String, pub mailbox: String, pub mock_receiver: String, + pub mock_hook: String, pub va: String, } @@ -87,17 +88,9 @@ pub struct AgentConfigAddrs { pub validator_announce: String, } -#[derive(serde::Serialize, serde::Deserialize, Clone)] -pub struct AgentConfigConn { - pub rpc_url: String, - pub grpc_url: String, - pub chain_id: String, - pub prefix: String, -} - #[derive(serde::Serialize, serde::Deserialize, Clone)] pub struct AgentConfigSigner { - #[serde(rename = "type")] + #[serde(rename = "signerType")] pub typ: String, pub key: String, pub prefix: String, @@ -110,13 +103,24 @@ pub struct AgentConfigIndex { } #[derive(serde::Serialize, serde::Deserialize, Clone)] +pub struct AgentUrl { + pub http: String, +} + +#[derive(serde::Serialize, serde::Deserialize, Clone)] +#[serde(rename_all = "camelCase")] pub struct AgentConfig { pub name: String, - pub domain: u32, - pub addresses: AgentConfigAddrs, + pub domain_id: u32, + pub mailbox: String, + pub interchain_gas_paymaster: String, + pub validator_announce: String, pub protocol: String, pub finality_blocks: u32, - pub connection: AgentConfigConn, + pub chain_id: String, + pub rpc_urls: Vec, + pub grpc_url: String, + pub prefix: String, pub signer: AgentConfigSigner, pub index: AgentConfigIndex, } @@ -136,29 +140,25 @@ impl AgentConfig { let validator = cli.get_keypair(validator); AgentConfig { - name: format!("cosmos-test-{}", network.domain), - domain: network.domain, - addresses: AgentConfigAddrs { - mailbox: to_hex_addr(&network.deployments.mailbox), - interchain_gas_paymaster: to_hex_addr(&network.deployments.igp), - validator_announce: to_hex_addr(&network.deployments.va), - }, + name: format!("cosmostest{}", network.domain), + domain_id: network.domain, + mailbox: to_hex_addr(&network.deployments.mailbox), + interchain_gas_paymaster: to_hex_addr(&network.deployments.igp), + validator_announce: to_hex_addr(&network.deployments.va), protocol: "cosmos".to_string(), finality_blocks: 1, - connection: AgentConfigConn { - rpc_url: network - .launch_resp - .endpoint - .rpc_addr - .to_string() - .replace("tcp", "http"), - grpc_url: format!("http://{}", network.launch_resp.endpoint.grpc_addr), - chain_id: network.chain_id.to_string(), - prefix: "osmo".to_string(), - }, + chain_id: format!("cosmos-test-{}", network.domain), + rpc_urls: vec![AgentUrl { + http: format!( + "http://{}", + network.launch_resp.endpoint.rpc_addr.replace("tcp://", "") + ), + }], + grpc_url: format!("http://{}", network.launch_resp.endpoint.grpc_addr), + prefix: "osmo".to_string(), signer: AgentConfigSigner { typ: "cosmosKey".to_string(), - key: hex::encode(validator.priv_key.to_bytes()), + key: format!("0x{}", hex::encode(validator.priv_key.to_bytes())), prefix: "osmo".to_string(), }, index: AgentConfigIndex { from: 1, chunk: 10 }, From 72845357ca54075278e46965f9fabb3890b4acb2 Mon Sep 17 00:00:00 2001 From: hashableric Date: Tue, 17 Oct 2023 03:18:33 +0900 Subject: [PATCH 076/142] feat: runnable --- rust/agents/validator/src/validator.rs | 10 ++++- .../src/interchain_security_module.rs | 19 +++++++-- .../hyperlane-cosmos/src/libs/verify.rs | 30 ++++++++++++-- rust/chains/hyperlane-cosmos/src/mailbox.rs | 12 ++++-- .../hyperlane-cosmos/src/merkle_tree_hook.rs | 10 ++++- .../src/payloads/ism_routes.rs | 27 +++++++++++++ .../src/payloads/merkle_tree_hook.rs | 5 +++ .../hyperlane-cosmos/src/providers/grpc.rs | 2 + .../hyperlane-cosmos/src/routing_ism.rs | 14 ++++++- .../src/validator_announce.rs | 3 +- rust/utils/run-locally/src/cosmos/cli.rs | 24 +++++++++++ rust/utils/run-locally/src/cosmos/deploy.rs | 1 - rust/utils/run-locally/src/cosmos/link.rs | 40 ++++++++++++++++++- rust/utils/run-locally/src/cosmos/mod.rs | 11 +++-- rust/utils/run-locally/src/cosmos/types.rs | 7 +++- 15 files changed, 190 insertions(+), 25 deletions(-) diff --git a/rust/agents/validator/src/validator.rs b/rust/agents/validator/src/validator.rs index 666df82887..ab7d7341b0 100644 --- a/rust/agents/validator/src/validator.rs +++ b/rust/agents/validator/src/validator.rs @@ -4,7 +4,7 @@ use async_trait::async_trait; use derive_more::AsRef; use eyre::Result; use futures_util::future::ready; -use hyperlane_cosmos::verify::priv_to_binary_addr; +use hyperlane_cosmos::verify::{priv_to_addr_string, priv_to_binary_addr}; use tokio::{task::JoinHandle, time::sleep}; use tracing::{error, info, info_span, instrument::Instrumented, warn, Instrument}; @@ -229,7 +229,13 @@ impl Validator { async fn announce(&self) -> Result<()> { let address = match self.raw_signer { - SignerConf::CosmosKey { key, .. } => priv_to_binary_addr(key.0.as_slice().to_vec())?, + SignerConf::CosmosKey { key, .. } => { + let addr = priv_to_addr_string(key.0.as_slice().to_vec())?; + info!("Announcing validator with Cosmos key: {}", addr); + + priv_to_binary_addr(key.0.as_slice().to_vec())? + } + // SignerConf::HexKey { key } => priv_to_binary_addr(key.0.as_slice().to_vec())?, //self.signer.eth_address(), _ => self.signer.eth_address(), }; diff --git a/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs index 02ea5ace9d..0a7d708175 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs @@ -6,6 +6,12 @@ use hyperlane_core::{ use crate::{ grpc::{WasmGrpcProvider, WasmProvider}, + payloads::{ + general::EmptyStruct, + ism_routes::{ + QueryIsmGeneralRequest, QueryIsmModuleTypeRequest, QueryIsmModuleTypeResponse, + }, + }, ConnectionConf, CosmosProvider, Signer, }; @@ -70,17 +76,22 @@ impl InterchainSecurityModule for CosmosInterchainSecurityModule { /// Returns the module type of the ISM compliant with the corresponding /// metadata offchain fetching and onchain formatting standard. async fn module_type(&self) -> ChainResult { - let query = hpl_interface::ism::ISMQueryMsg::ModuleType {}; + let query = QueryIsmModuleTypeRequest { + module_type: EmptyStruct {}, + }; - let data = self.provider.wasm_query(query, None).await?; + let data = self + .provider + .wasm_query(QueryIsmGeneralRequest { i_s_m: query }, None) + .await?; // Handle both the ISMType response and the ModuleTypeResponse response. - let ismtype_response = serde_json::from_slice::(&data); + let ismtype_response = serde_json::from_slice::(&data); let moduletye_response = serde_json::from_slice::(&data); Ok(match (ismtype_response, moduletye_response) { - (Ok(v), _) => ism_type_to_module_type(v), + (Ok(v), _) => ism_type_to_module_type(v.typ), (_, Ok(v)) => ism_type_to_module_type(v.typ), _ => ModuleType::Null, }) diff --git a/rust/chains/hyperlane-cosmos/src/libs/verify.rs b/rust/chains/hyperlane-cosmos/src/libs/verify.rs index 58aac8f327..294a987ae7 100644 --- a/rust/chains/hyperlane-cosmos/src/libs/verify.rs +++ b/rust/chains/hyperlane-cosmos/src/libs/verify.rs @@ -80,15 +80,37 @@ pub fn pub_to_addr(pub_key: Vec, prefix: &str) -> ChainResult { /// encode H256 to bech32 address pub fn priv_to_binary_addr(priv_key: Vec) -> ChainResult { - let sha_hash = sha256_digest(SigningKey::from_slice(priv_key.as_slice()) - .unwrap() - .public_key() - .to_bytes())?; + let sha_hash = sha256_digest( + SigningKey::from_slice(priv_key.as_slice()) + .unwrap() + .public_key() + .to_bytes(), + )?; let rip_hash = ripemd160_digest(sha_hash)?; Ok(H160::from_slice(rip_hash.as_slice())) } +/// encode H256 to bech32 address +pub fn priv_to_addr_string(priv_key: Vec) -> ChainResult { + let sha_hash = sha256_digest( + SigningKey::from_slice(priv_key.as_slice()) + .unwrap() + .public_key() + .to_bytes(), + )?; + let rip_hash = ripemd160_digest(sha_hash)?; + + let addr = + bech32::encode("osmo", rip_hash.to_base32(), bech32::Variant::Bech32).map_err(|_| { + ChainCommunicationError::ParseError { + msg: "bech32".to_string(), + } + })?; + + Ok(addr) +} + /// encode H256 to bech32 address pub fn pub_to_binary_addr(pub_key: Vec) -> ChainResult { let sha_hash = match (pub_key.len() == 33) && (pub_key[0] == 0x02 || pub_key[0] == 0x03) { diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 415ea54aad..b688faf239 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -24,7 +24,7 @@ use hyperlane_core::{ H256, U256, }; use hyperlane_core::{ContractLocator, Decode, RawHyperlaneMessage, SequenceIndexer}; -use tracing::{info, instrument, warn}; +use tracing::{instrument, warn}; /// A reference to a Mailbox contract on some Cosmos chain pub struct CosmosMailbox { @@ -290,6 +290,7 @@ impl CosmosMailboxIndexer { .provider .wasm_query(GeneralMailboxQuery { mailbox: payload }, lag) .await?; + let response: mailbox::NonceResponse = serde_json::from_slice(&data)?; Ok(response.nonce) @@ -306,8 +307,13 @@ impl Indexer for CosmosMailboxIndexer { let parser = self.get_parser(); for block_number in range { - let logs = self.indexer.get_event_log(block_number, parser).await?; - result.extend(logs); + let logs = self.indexer.get_event_log(block_number, parser).await; + + if let Err(e) = logs { + warn!("error: {:?}", e); + continue; + } + result.extend(logs.unwrap()); } Ok(result) diff --git a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs index f7a092abfb..f914946840 100644 --- a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs +++ b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -97,7 +97,15 @@ impl MerkleTreeHook for CosmosMerkleTreeHook { count: general::EmptyStruct {}, }; - let data = self.provider.wasm_query(payload, lag).await?; + let data = self + .provider + .wasm_query( + merkle_tree_hook::MerkleTreeGenericRequest { + merkle_hook: payload, + }, + lag, + ) + .await?; let response: merkle_tree_hook::MerkleTreeCountResponse = serde_json::from_slice(&data)?; Ok(response.count) diff --git a/rust/chains/hyperlane-cosmos/src/payloads/ism_routes.rs b/rust/chains/hyperlane-cosmos/src/payloads/ism_routes.rs index c659cc5660..2a909554db 100644 --- a/rust/chains/hyperlane-cosmos/src/payloads/ism_routes.rs +++ b/rust/chains/hyperlane-cosmos/src/payloads/ism_routes.rs @@ -1,3 +1,4 @@ +use super::general::EmptyStruct; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Debug)] @@ -14,3 +15,29 @@ pub struct IsmRouteRequestInner { pub struct IsmRouteRespnose { pub ism: String, } + +#[derive(Serialize, Deserialize, Debug)] +pub struct QueryRoutingIsmGeneralRequest { + pub routing_ism: T, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct QueryRoutingIsmRouteResponse { + pub ism: String, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct QueryIsmGeneralRequest { + pub i_s_m: T, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct QueryIsmModuleTypeRequest { + pub module_type: EmptyStruct, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct QueryIsmModuleTypeResponse { + #[serde(rename = "type")] + pub typ: hpl_interface::ism::ISMType, +} diff --git a/rust/chains/hyperlane-cosmos/src/payloads/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/payloads/merkle_tree_hook.rs index fe6e7a2b30..0d73d249d1 100644 --- a/rust/chains/hyperlane-cosmos/src/payloads/merkle_tree_hook.rs +++ b/rust/chains/hyperlane-cosmos/src/payloads/merkle_tree_hook.rs @@ -4,6 +4,11 @@ use super::general::EmptyStruct; const TREE_DEPTH: usize = 32; +#[derive(Serialize, Deserialize, Debug)] +pub struct MerkleTreeGenericRequest { + pub merkle_hook: T, +} + // --------- Requests --------- #[derive(Serialize, Deserialize, Debug)] diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index f9d431d740..9587998387 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -311,6 +311,8 @@ impl WasmProvider for WasmGrpcProvider { funds: vec![], }; + println!("simulate msg: {:?}", serde_json::to_string(&payload)?); + let response = self .simulate_raw_tx(vec![msg.to_any().unwrap()], None) .await?; diff --git a/rust/chains/hyperlane-cosmos/src/routing_ism.rs b/rust/chains/hyperlane-cosmos/src/routing_ism.rs index 10ad96cb31..a0a4fd913c 100644 --- a/rust/chains/hyperlane-cosmos/src/routing_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/routing_ism.rs @@ -7,7 +7,9 @@ use hyperlane_core::{ use crate::{ grpc::{WasmGrpcProvider, WasmProvider}, - payloads::ism_routes::{IsmRouteRequest, IsmRouteRequestInner, IsmRouteRespnose}, + payloads::ism_routes::{ + IsmRouteRequest, IsmRouteRequestInner, IsmRouteRespnose, QueryRoutingIsmGeneralRequest, + }, signers::Signer, verify::bech32_decode, ConnectionConf, CosmosProvider, @@ -59,7 +61,15 @@ impl RoutingIsm for CosmosRoutingIsm { }, }; - let data = self.provider.wasm_query(payload, None).await?; + let data = self + .provider + .wasm_query( + QueryRoutingIsmGeneralRequest { + routing_ism: payload, + }, + None, + ) + .await?; let response: IsmRouteRespnose = serde_json::from_slice(&data)?; Ok(bech32_decode(response.ism)) diff --git a/rust/chains/hyperlane-cosmos/src/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/validator_announce.rs index 2a91ae28c2..c3d15568a6 100644 --- a/rust/chains/hyperlane-cosmos/src/validator_announce.rs +++ b/rust/chains/hyperlane-cosmos/src/validator_announce.rs @@ -92,8 +92,7 @@ impl ValidatorAnnounce for CosmosValidatorAnnounce { announce: AnnouncementRequestInner { validator: hex::encode(announcement.value.validator), storage_location: announcement.value.storage_location, - signature: base64::engine::general_purpose::STANDARD - .encode(announcement.signature.to_vec()), + signature: hex::encode(announcement.signature.to_vec()), }, }; diff --git a/rust/utils/run-locally/src/cosmos/cli.rs b/rust/utils/run-locally/src/cosmos/cli.rs index 6df450d7c9..94d4fc6210 100644 --- a/rust/utils/run-locally/src/cosmos/cli.rs +++ b/rust/utils/run-locally/src/cosmos/cli.rs @@ -320,6 +320,30 @@ impl OsmosisCLI { output } + pub fn bank_send( + &self, + endpoint: &OsmosisEndpoint, + sender: &str, + sender_addr: &str, + addr: &str, + funds: &str, + ) { + let mut cmd = self + .cli() + .cmd("tx") + .cmd("bank") + .cmd("send") + .cmd(sender_addr) + .cmd(addr) + .cmd(funds) + .arg("from", sender); + + cmd = self.add_gas(cmd); + cmd = endpoint.add_rpc(cmd); + + cmd.run().join(); + } + fn add_genesis_accs(&self) { for name in default_keys().into_iter().map(|(name, _)| name) { self.cli() diff --git a/rust/utils/run-locally/src/cosmos/deploy.rs b/rust/utils/run-locally/src/cosmos/deploy.rs index 7a8dd0feb0..1b7b3463d7 100644 --- a/rust/utils/run-locally/src/cosmos/deploy.rs +++ b/rust/utils/run-locally/src/cosmos/deploy.rs @@ -157,7 +157,6 @@ pub fn deploy_cw_hyperlane( igp::oracle::InstantiateMsg {}, "hpl_test_mock_hook", ); - Deployments { hook_merkle, hook_routing, diff --git a/rust/utils/run-locally/src/cosmos/link.rs b/rust/utils/run-locally/src/cosmos/link.rs index 69ae15d935..9b05f9de94 100644 --- a/rust/utils/run-locally/src/cosmos/link.rs +++ b/rust/utils/run-locally/src/cosmos/link.rs @@ -1,6 +1,6 @@ use std::path::Path; -use hpl_interface::ism; +use hpl_interface::{core, ism}; use super::{cli::OsmosisCLI, crypto::KeyPair, CosmosNetwork}; @@ -56,6 +56,44 @@ fn link_network( vec![], ); + cli.wasm_execute( + &network.launch_resp.endpoint, + linker, + &network.deployments.mailbox, + core::mailbox::ExecuteMsg::SetDefaultHook { + hook: network.deployments.mock_hook.clone(), + }, + vec![], + ); + + cli.wasm_execute( + &network.launch_resp.endpoint, + linker, + &network.deployments.mailbox, + core::mailbox::ExecuteMsg::SetRequiredHook { + hook: network.deployments.mock_hook.clone(), + }, + vec![], + ); + + cli.wasm_execute( + &network.launch_resp.endpoint, + linker, + &network.deployments.mailbox, + core::mailbox::ExecuteMsg::SetDefaultIsm { + ism: network.deployments.ism_routing.clone(), + }, + vec![], + ); + + cli.bank_send( + &network.launch_resp.endpoint, + linker, + &validator_addr, + "osmo1l83956lgpak5sun7ggupls7rk7p5cr95499jdf", + "10000000uosmo", + ); + // TODO // cli.wasm_execute( // &network.launch_resp.endpoint, diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index dc48acf2c8..15dca652cc 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -325,10 +325,10 @@ fn run_locally() { ( launch_cosmos_node(CosmosConfig { node_port_base: port_start + (i * 10), - chain_id: format!("local-node-{}", i), + chain_id: format!("cosmos-test-{}", i + 26657), ..default_config.clone() }), - format!("local-node-{}", i), + format!("cosmos-test-{}", i + 26657), domain_start + i, ) }) @@ -458,10 +458,13 @@ fn run_locally() { .unwrap() .into(), msg_body: b"hello".into(), - hook: None, + hook: Some(node.deployments.mock_hook.clone()), metadata: None, }), - vec![], + vec![Coin { + denom: "uosmo".to_string(), + amount: 510_000.to_string(), + }], ); } } diff --git a/rust/utils/run-locally/src/cosmos/types.rs b/rust/utils/run-locally/src/cosmos/types.rs index e7e8b23068..99396d51a5 100644 --- a/rust/utils/run-locally/src/cosmos/types.rs +++ b/rust/utils/run-locally/src/cosmos/types.rs @@ -115,6 +115,7 @@ pub struct AgentConfig { pub mailbox: String, pub interchain_gas_paymaster: String, pub validator_announce: String, + pub merkle_tree_hook: String, pub protocol: String, pub finality_blocks: u32, pub chain_id: String, @@ -145,6 +146,7 @@ impl AgentConfig { mailbox: to_hex_addr(&network.deployments.mailbox), interchain_gas_paymaster: to_hex_addr(&network.deployments.igp), validator_announce: to_hex_addr(&network.deployments.va), + merkle_tree_hook: to_hex_addr(&network.deployments.hook_merkle), protocol: "cosmos".to_string(), finality_blocks: 1, chain_id: format!("cosmos-test-{}", network.domain), @@ -161,7 +163,10 @@ impl AgentConfig { key: format!("0x{}", hex::encode(validator.priv_key.to_bytes())), prefix: "osmo".to_string(), }, - index: AgentConfigIndex { from: 1, chunk: 10 }, + index: AgentConfigIndex { + from: 1, + chunk: 100, + }, } } } From c12dfcbedb9272a95e74a229d6826d8645374a1e Mon Sep 17 00:00:00 2001 From: hashableric Date: Tue, 17 Oct 2023 04:22:20 +0900 Subject: [PATCH 077/142] feat: runnable --- rust/agents/relayer/src/msg/metadata/base.rs | 4 ++++ .../hyperlane-cosmos/src/interchain_security_module.rs | 2 +- rust/chains/hyperlane-cosmos/src/multisig_ism.rs | 6 +++++- rust/chains/hyperlane-cosmos/src/payloads/ism_routes.rs | 2 +- rust/utils/run-locally/src/cosmos/link.rs | 2 +- 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/rust/agents/relayer/src/msg/metadata/base.rs b/rust/agents/relayer/src/msg/metadata/base.rs index 03da9e3b26..44c943649a 100644 --- a/rust/agents/relayer/src/msg/metadata/base.rs +++ b/rust/agents/relayer/src/msg/metadata/base.rs @@ -83,6 +83,10 @@ impl MetadataBuilder for BaseMetadataBuilder { .context("When fetching module type")?; let base = self.clone_with_incremented_depth()?; + println!("ism_address: {:?}", ism_address); + println!("message: {:?}", message); + println!("module_type: {:?}", module_type); + let metadata_builder: Box = match module_type { ModuleType::MerkleRootMultisig => { Box::new(MerkleRootMultisigMetadataBuilder::new(base)) diff --git a/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs index 0a7d708175..b4e59d1c6e 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs @@ -82,7 +82,7 @@ impl InterchainSecurityModule for CosmosInterchainSecurityModule { let data = self .provider - .wasm_query(QueryIsmGeneralRequest { i_s_m: query }, None) + .wasm_query(QueryIsmGeneralRequest { ism: query }, None) .await?; // Handle both the ISMType response and the ModuleTypeResponse response. diff --git a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs index 9b6942a209..fedb5d7564 100644 --- a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs @@ -1,5 +1,6 @@ use crate::{ grpc::{WasmGrpcProvider, WasmProvider}, + payloads::ism_routes::QueryIsmGeneralRequest, signers::Signer, ConnectionConf, CosmosProvider, }; @@ -68,7 +69,10 @@ impl MultisigIsm for CosmosMultisigIsm { }, }; - let data = self.provider.wasm_query(payload, None).await?; + let data = self + .provider + .wasm_query(QueryIsmGeneralRequest { ism: payload }, None) + .await?; let response: multisig_ism::VerifyInfoResponse = serde_json::from_slice(&data)?; let validators: Vec = response diff --git a/rust/chains/hyperlane-cosmos/src/payloads/ism_routes.rs b/rust/chains/hyperlane-cosmos/src/payloads/ism_routes.rs index 2a909554db..1f2321a917 100644 --- a/rust/chains/hyperlane-cosmos/src/payloads/ism_routes.rs +++ b/rust/chains/hyperlane-cosmos/src/payloads/ism_routes.rs @@ -28,7 +28,7 @@ pub struct QueryRoutingIsmRouteResponse { #[derive(Serialize, Deserialize, Debug)] pub struct QueryIsmGeneralRequest { - pub i_s_m: T, + pub ism: T, } #[derive(Serialize, Deserialize, Debug)] diff --git a/rust/utils/run-locally/src/cosmos/link.rs b/rust/utils/run-locally/src/cosmos/link.rs index 9b05f9de94..7abf694a91 100644 --- a/rust/utils/run-locally/src/cosmos/link.rs +++ b/rust/utils/run-locally/src/cosmos/link.rs @@ -81,7 +81,7 @@ fn link_network( linker, &network.deployments.mailbox, core::mailbox::ExecuteMsg::SetDefaultIsm { - ism: network.deployments.ism_routing.clone(), + ism: network.deployments.ism_multisig.clone(), }, vec![], ); From cacab2cf4503657ae149e6b52dab18c06b7c46a3 Mon Sep 17 00:00:00 2001 From: hashableric Date: Tue, 17 Oct 2023 07:03:52 +0900 Subject: [PATCH 078/142] feat: test --- rust/agents/relayer/src/msg/metadata/base.rs | 4 --- .../metadata/multisig/merkle_root_multisig.rs | 4 +++ .../metadata/multisig/message_id_multisig.rs | 9 ++++-- rust/agents/validator/src/validator.rs | 2 +- rust/chains/hyperlane-cosmos/src/mailbox.rs | 16 +++++----- .../hyperlane-cosmos/src/merkle_tree_hook.rs | 31 ++++++++++++++----- .../src/payloads/merkle_tree_hook.rs | 2 +- rust/utils/run-locally/src/cosmos/deploy.rs | 11 +++++++ rust/utils/run-locally/src/cosmos/link.rs | 6 ++-- rust/utils/run-locally/src/cosmos/mod.rs | 5 +-- rust/utils/run-locally/src/cosmos/types.rs | 1 + 11 files changed, 62 insertions(+), 29 deletions(-) diff --git a/rust/agents/relayer/src/msg/metadata/base.rs b/rust/agents/relayer/src/msg/metadata/base.rs index 44c943649a..03da9e3b26 100644 --- a/rust/agents/relayer/src/msg/metadata/base.rs +++ b/rust/agents/relayer/src/msg/metadata/base.rs @@ -83,10 +83,6 @@ impl MetadataBuilder for BaseMetadataBuilder { .context("When fetching module type")?; let base = self.clone_with_incremented_depth()?; - println!("ism_address: {:?}", ism_address); - println!("message: {:?}", message); - println!("module_type: {:?}", module_type); - let metadata_builder: Box = match module_type { ModuleType::MerkleRootMultisig => { Box::new(MerkleRootMultisigMetadataBuilder::new(base)) diff --git a/rust/agents/relayer/src/msg/metadata/multisig/merkle_root_multisig.rs b/rust/agents/relayer/src/msg/metadata/multisig/merkle_root_multisig.rs index 4bd1261907..572d59bdd2 100644 --- a/rust/agents/relayer/src/msg/metadata/multisig/merkle_root_multisig.rs +++ b/rust/agents/relayer/src/msg/metadata/multisig/merkle_root_multisig.rs @@ -36,11 +36,14 @@ impl MultisigIsmMetadataBuilder for MerkleRootMultisigMetadataBuilder { checkpoint_syncer: &MultisigCheckpointSyncer, ) -> Result> { const CTX: &str = "When fetching MerkleRootMultisig metadata"; + + println!("{}", CTX); unwrap_or_none_result!( highest_leaf_index, self.highest_known_leaf_index().await, debug!("Couldn't get highest known leaf index") ); + println!("highest_leaf_index: {:?}", highest_leaf_index); unwrap_or_none_result!( leaf_index, self.get_merkle_leaf_id_by_message_id(message.id()) @@ -67,6 +70,7 @@ impl MultisigIsmMetadataBuilder for MerkleRootMultisigMetadataBuilder { highest_leaf_index, "Couldn't get checkpoint in range" ) ); + println!("quorum_checkpoint: {:?}", quorum_checkpoint); unwrap_or_none_result!( proof, self.get_proof(leaf_index, quorum_checkpoint.checkpoint.checkpoint) diff --git a/rust/agents/relayer/src/msg/metadata/multisig/message_id_multisig.rs b/rust/agents/relayer/src/msg/metadata/multisig/message_id_multisig.rs index 17374d5ea6..86bcc6c53c 100644 --- a/rust/agents/relayer/src/msg/metadata/multisig/message_id_multisig.rs +++ b/rust/agents/relayer/src/msg/metadata/multisig/message_id_multisig.rs @@ -7,7 +7,7 @@ use derive_new::new; use eyre::{Context, Result}; use hyperlane_base::MultisigCheckpointSyncer; use hyperlane_core::{unwrap_or_none_result, HyperlaneMessage, H256}; -use tracing::{debug, trace, warn}; +use tracing::{debug, info, trace, warn}; use crate::msg::metadata::BaseMetadataBuilder; @@ -37,24 +37,27 @@ impl MultisigIsmMetadataBuilder for MessageIdMultisigMetadataBuilder { let message_id = message.id(); const CTX: &str = "When fetching MessageIdMultisig metadata"; + println!("{}", CTX); unwrap_or_none_result!( leaf_index, self.get_merkle_leaf_id_by_message_id(message_id) .await .context(CTX)?, - debug!( + warn!( ?message, "No merkle leaf found for message id, must have not been enqueued in the tree" ) ); + println!("leaf_index: {:?}", leaf_index); unwrap_or_none_result!( quorum_checkpoint, checkpoint_syncer .fetch_checkpoint(validators, threshold as usize, leaf_index) .await .context(CTX)?, - trace!("No quorum checkpoint found") + warn!("No quorum checkpoint found") ); + println!("quorum_checkpoint: {:?}", quorum_checkpoint); if quorum_checkpoint.checkpoint.message_id != message_id { warn!( diff --git a/rust/agents/validator/src/validator.rs b/rust/agents/validator/src/validator.rs index ab7d7341b0..e2c951cad0 100644 --- a/rust/agents/validator/src/validator.rs +++ b/rust/agents/validator/src/validator.rs @@ -235,7 +235,7 @@ impl Validator { priv_to_binary_addr(key.0.as_slice().to_vec())? } - // SignerConf::HexKey { key } => priv_to_binary_addr(key.0.as_slice().to_vec())?, //self.signer.eth_address(), + SignerConf::HexKey { key } => priv_to_binary_addr(key.0.as_slice().to_vec())?, //self.signer.eth_address(), _ => self.signer.eth_address(), }; diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index b688faf239..40ecebc495 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -79,8 +79,8 @@ impl Debug for CosmosMailbox { impl Mailbox for CosmosMailbox { #[instrument(level = "debug", err, ret, skip(self))] async fn count(&self, lag: Option) -> ChainResult { - let payload = mailbox::CountRequest { - count: general::EmptyStruct {}, + let payload = mailbox::NonceRequest { + nonce: general::EmptyStruct {}, }; let data = self @@ -93,8 +93,8 @@ impl Mailbox for CosmosMailbox { return Ok(0); } - let response: mailbox::CountResponse = serde_json::from_slice(&data?)?; - Ok(response.count) + let response: mailbox::NonceResponse = serde_json::from_slice(&data?)?; + Ok(response.nonce) } #[instrument(level = "debug", err, ret, skip(self))] @@ -267,17 +267,17 @@ impl CosmosMailboxIndexer { #[instrument(level = "debug", err, ret, skip(self))] async fn count(&self, lag: Option) -> ChainResult { - let payload = mailbox::CountRequest { - count: general::EmptyStruct {}, + let payload = mailbox::NonceRequest { + nonce: general::EmptyStruct {}, }; let data = self .provider .wasm_query(GeneralMailboxQuery { mailbox: payload }, lag) .await?; - let response: mailbox::CountResponse = serde_json::from_slice(&data)?; + let response: mailbox::NonceResponse = serde_json::from_slice(&data)?; - Ok(response.count) + Ok(response.nonce) } #[instrument(level = "debug", err, ret, skip(self))] diff --git a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs index f914946840..5695bece25 100644 --- a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs +++ b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -70,10 +70,18 @@ impl MerkleTreeHook for CosmosMerkleTreeHook { #[instrument(level = "debug", err, ret, skip(self))] async fn tree(&self, lag: Option) -> ChainResult { let payload = merkle_tree_hook::MerkleTreeRequest { - merkle_tree: general::EmptyStruct {}, + tree: general::EmptyStruct {}, }; - let data = self.provider.wasm_query(payload, lag).await?; + let data = self + .provider + .wasm_query( + merkle_tree_hook::MerkleTreeGenericRequest { + merkle_hook: payload, + }, + lag, + ) + .await?; let response: merkle_tree_hook::MerkleTreeResponse = serde_json::from_slice(&data)?; let branch = response @@ -84,10 +92,11 @@ impl MerkleTreeHook for CosmosMerkleTreeHook { .collect::, _>>() .expect("fail to parse tree branch"); - Ok(IncrementalMerkle { - branch: branch.try_into().unwrap(), - count: response.count as usize, - }) + let branch_res: [H256; 32] = branch + .try_into() + .expect("fail to convert tree branch to array"); + + Ok(IncrementalMerkle::new(branch_res, response.count as usize)) } /// Gets the current leaf count of the merkle tree @@ -117,7 +126,15 @@ impl MerkleTreeHook for CosmosMerkleTreeHook { check_point: general::EmptyStruct {}, }; - let data = self.provider.wasm_query(payload, None).await?; + let data = self + .provider + .wasm_query( + merkle_tree_hook::MerkleTreeGenericRequest { + merkle_hook: payload, + }, + None, + ) + .await?; let response: merkle_tree_hook::CheckPointResponse = serde_json::from_slice(&data)?; Ok(Checkpoint { diff --git a/rust/chains/hyperlane-cosmos/src/payloads/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/payloads/merkle_tree_hook.rs index 0d73d249d1..7635f0ef72 100644 --- a/rust/chains/hyperlane-cosmos/src/payloads/merkle_tree_hook.rs +++ b/rust/chains/hyperlane-cosmos/src/payloads/merkle_tree_hook.rs @@ -13,7 +13,7 @@ pub struct MerkleTreeGenericRequest { #[derive(Serialize, Deserialize, Debug)] pub struct MerkleTreeRequest { - pub merkle_tree: EmptyStruct, + pub tree: EmptyStruct, } #[derive(Serialize, Deserialize, Debug)] diff --git a/rust/utils/run-locally/src/cosmos/deploy.rs b/rust/utils/run-locally/src/cosmos/deploy.rs index 1b7b3463d7..0d2137152a 100644 --- a/rust/utils/run-locally/src/cosmos/deploy.rs +++ b/rust/utils/run-locally/src/cosmos/deploy.rs @@ -157,6 +157,16 @@ pub fn deploy_cw_hyperlane( igp::oracle::InstantiateMsg {}, "hpl_test_mock_hook", ); + + let mock_ism = cli.wasm_init( + &endpoint, + &deployer, + Some(deployer_addr), + codes.hpl_test_mock_ism, + igp::oracle::InstantiateMsg {}, + "hpl_test_mock_ism", + ); + Deployments { hook_merkle, hook_routing, @@ -167,6 +177,7 @@ pub fn deploy_cw_hyperlane( mailbox, mock_receiver, mock_hook, + mock_ism, va, } } diff --git a/rust/utils/run-locally/src/cosmos/link.rs b/rust/utils/run-locally/src/cosmos/link.rs index 7abf694a91..ea647aebaa 100644 --- a/rust/utils/run-locally/src/cosmos/link.rs +++ b/rust/utils/run-locally/src/cosmos/link.rs @@ -61,7 +61,7 @@ fn link_network( linker, &network.deployments.mailbox, core::mailbox::ExecuteMsg::SetDefaultHook { - hook: network.deployments.mock_hook.clone(), + hook: network.deployments.hook_merkle.clone(), }, vec![], ); @@ -71,7 +71,7 @@ fn link_network( linker, &network.deployments.mailbox, core::mailbox::ExecuteMsg::SetRequiredHook { - hook: network.deployments.mock_hook.clone(), + hook: network.deployments.hook_merkle.clone(), }, vec![], ); @@ -81,7 +81,7 @@ fn link_network( linker, &network.deployments.mailbox, core::mailbox::ExecuteMsg::SetDefaultIsm { - ism: network.deployments.ism_multisig.clone(), + ism: network.deployments.ism_routing.clone(), }, vec![], ); diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index 15dca652cc..c5f776a3f3 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -224,10 +224,11 @@ fn launch_cosmos_validator( debug: bool, ) -> AgentHandles { let validator_bin = concat_path(format!("../../{AGENT_BIN_PATH}"), "validator"); - let validator_base = tempdir().unwrap(); + let validator_base = tempdir().expect("Failed to create a temp dir").into_path(); let validator_base_db = concat_path(&validator_base, "db"); - fs::create_dir_all(&validator_base).unwrap(); + fs::create_dir_all(&validator_base_db).unwrap(); + println!("Validator DB: {:?}", validator_base_db); let checkpoint_path = concat_path(&validator_base, "checkpoint"); let signature_path = concat_path(&validator_base, "signature"); diff --git a/rust/utils/run-locally/src/cosmos/types.rs b/rust/utils/run-locally/src/cosmos/types.rs index 99396d51a5..ac24c88b57 100644 --- a/rust/utils/run-locally/src/cosmos/types.rs +++ b/rust/utils/run-locally/src/cosmos/types.rs @@ -67,6 +67,7 @@ pub struct Deployments { pub mailbox: String, pub mock_receiver: String, pub mock_hook: String, + pub mock_ism: String, pub va: String, } From 7e49e8ecb9872fa568dfa068ca47e1b663291e06 Mon Sep 17 00:00:00 2001 From: hashableric Date: Tue, 17 Oct 2023 20:53:31 +0900 Subject: [PATCH 079/142] feat: test --- rust/Cargo.lock | 6 ++--- rust/Cargo.toml | 2 +- .../metadata/multisig/merkle_root_multisig.rs | 4 --- .../metadata/multisig/message_id_multisig.rs | 9 +++---- rust/agents/validator/src/submit.rs | 3 ++- .../hyperlane-cosmos/src/interchain_gas.rs | 6 ++--- rust/chains/hyperlane-cosmos/src/mailbox.rs | 8 +++--- .../hyperlane-cosmos/src/merkle_tree_hook.rs | 23 +++++++++++----- .../hyperlane-cosmos/src/providers/grpc.rs | 2 -- .../hyperlane-cosmos/src/providers/rpc.rs | 27 ++++++++++--------- .../src/db/rocks/hyperlane_db.rs | 2 ++ rust/utils/run-locally/src/cosmos/cli.rs | 11 +++++--- rust/utils/run-locally/src/cosmos/deploy.rs | 1 - rust/utils/run-locally/src/cosmos/link.rs | 23 ++++++++++++++-- rust/utils/run-locally/src/cosmos/mod.rs | 4 +-- 15 files changed, 78 insertions(+), 53 deletions(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 61d43732b9..a1102a9cfd 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -3895,9 +3895,9 @@ dependencies = [ [[package]] name = "hpl-interface" -version = "0.0.6-rc0" +version = "0.0.6-rc1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ee99a46cbcd112d634b544f3a4009ba7afb3de656218db18708d56aeec3996" +checksum = "91c7ac9f5da6c1a8ae58bd129c709d96122164d0f5f1788a7c0162d9dc1b69f3" dependencies = [ "bech32 0.9.1", "cosmwasm-schema", @@ -7045,7 +7045,7 @@ dependencies = [ "ctrlc", "eyre", "hex 0.4.3", - "hpl-interface 0.0.6-rc0", + "hpl-interface 0.0.6-rc1", "hyperlane-core", "k256 0.13.1", "macro_rules_attribute", diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 213dfa6a50..b97494c376 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -177,7 +177,7 @@ hyper = "0.14" hyper-tls = "0.5.0" hex = "0.4.3" tendermint-rpc = { version = "0.32.0", features = ["http-client", "tokio"]} -hpl-interface = "0.0.6-rc0" +hpl-interface = "0.0.6-rc1" elliptic-curve = "0.12.3" ## TODO: remove this diff --git a/rust/agents/relayer/src/msg/metadata/multisig/merkle_root_multisig.rs b/rust/agents/relayer/src/msg/metadata/multisig/merkle_root_multisig.rs index 572d59bdd2..4bd1261907 100644 --- a/rust/agents/relayer/src/msg/metadata/multisig/merkle_root_multisig.rs +++ b/rust/agents/relayer/src/msg/metadata/multisig/merkle_root_multisig.rs @@ -36,14 +36,11 @@ impl MultisigIsmMetadataBuilder for MerkleRootMultisigMetadataBuilder { checkpoint_syncer: &MultisigCheckpointSyncer, ) -> Result> { const CTX: &str = "When fetching MerkleRootMultisig metadata"; - - println!("{}", CTX); unwrap_or_none_result!( highest_leaf_index, self.highest_known_leaf_index().await, debug!("Couldn't get highest known leaf index") ); - println!("highest_leaf_index: {:?}", highest_leaf_index); unwrap_or_none_result!( leaf_index, self.get_merkle_leaf_id_by_message_id(message.id()) @@ -70,7 +67,6 @@ impl MultisigIsmMetadataBuilder for MerkleRootMultisigMetadataBuilder { highest_leaf_index, "Couldn't get checkpoint in range" ) ); - println!("quorum_checkpoint: {:?}", quorum_checkpoint); unwrap_or_none_result!( proof, self.get_proof(leaf_index, quorum_checkpoint.checkpoint.checkpoint) diff --git a/rust/agents/relayer/src/msg/metadata/multisig/message_id_multisig.rs b/rust/agents/relayer/src/msg/metadata/multisig/message_id_multisig.rs index 86bcc6c53c..e696019c0e 100644 --- a/rust/agents/relayer/src/msg/metadata/multisig/message_id_multisig.rs +++ b/rust/agents/relayer/src/msg/metadata/multisig/message_id_multisig.rs @@ -7,7 +7,7 @@ use derive_new::new; use eyre::{Context, Result}; use hyperlane_base::MultisigCheckpointSyncer; use hyperlane_core::{unwrap_or_none_result, HyperlaneMessage, H256}; -use tracing::{debug, info, trace, warn}; +use tracing::{debug, trace, warn}; use crate::msg::metadata::BaseMetadataBuilder; @@ -37,27 +37,24 @@ impl MultisigIsmMetadataBuilder for MessageIdMultisigMetadataBuilder { let message_id = message.id(); const CTX: &str = "When fetching MessageIdMultisig metadata"; - println!("{}", CTX); unwrap_or_none_result!( leaf_index, self.get_merkle_leaf_id_by_message_id(message_id) .await .context(CTX)?, - warn!( + debug!( ?message, "No merkle leaf found for message id, must have not been enqueued in the tree" ) ); - println!("leaf_index: {:?}", leaf_index); unwrap_or_none_result!( quorum_checkpoint, checkpoint_syncer .fetch_checkpoint(validators, threshold as usize, leaf_index) .await .context(CTX)?, - warn!("No quorum checkpoint found") + debug!("No quorum checkpoint found") ); - println!("quorum_checkpoint: {:?}", quorum_checkpoint); if quorum_checkpoint.checkpoint.message_id != message_id { warn!( diff --git a/rust/agents/validator/src/submit.rs b/rust/agents/validator/src/submit.rs index b94b5781a1..1c1122adc5 100644 --- a/rust/agents/validator/src/submit.rs +++ b/rust/agents/validator/src/submit.rs @@ -1,10 +1,11 @@ use std::num::NonZeroU64; +use std::str::FromStr; use std::sync::Arc; use std::time::{Duration, Instant}; use std::vec; use eyre::{bail, Result}; -use hyperlane_core::MerkleTreeHook; +use hyperlane_core::{MerkleTreeHook, H256}; use prometheus::IntGauge; use tokio::time::sleep; use tracing::{debug, info}; diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index 18dfaf45ff..5392fc8891 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -72,8 +72,8 @@ impl CosmosInterchainGasPaymasterIndexer { } } - fn get_parser(&self) -> fn(attrs: Vec) -> InterchainGasPayment { - |attrs: Vec| -> InterchainGasPayment { + fn get_parser(&self) -> fn(attrs: Vec) -> Option { + |attrs: Vec| -> Option { let mut res = InterchainGasPayment { message_id: H256::zero(), payment: U256::zero(), @@ -96,7 +96,7 @@ impl CosmosInterchainGasPaymasterIndexer { } } - res + Some(res) } } } diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 40ecebc495..467335f5d3 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -247,8 +247,8 @@ impl CosmosMailboxIndexer { } } - fn get_parser(&self) -> fn(attrs: Vec) -> HyperlaneMessage { - |attrs: Vec| -> HyperlaneMessage { + fn get_parser(&self) -> fn(attrs: Vec) -> Option { + |attrs: Vec| -> Option { let mut res = HyperlaneMessage::default(); for attr in attrs { @@ -261,7 +261,7 @@ impl CosmosMailboxIndexer { } } - res + Some(res) } } @@ -328,7 +328,7 @@ impl Indexer for CosmosMailboxIndexer { impl Indexer for CosmosMailboxIndexer { async fn fetch_logs(&self, range: RangeInclusive) -> ChainResult> { let mut result: Vec<(HyperlaneMessage, LogMeta)> = vec![]; - let parser: fn(Vec) -> HyperlaneMessage = self.get_parser(); + let parser: fn(Vec) -> Option = self.get_parser(); for block_number in range { let logs = self.indexer.get_event_log(block_number, parser).await?; diff --git a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs index 5695bece25..64e0fa8f8f 100644 --- a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs +++ b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -132,7 +132,7 @@ impl MerkleTreeHook for CosmosMerkleTreeHook { merkle_tree_hook::MerkleTreeGenericRequest { merkle_hook: payload, }, - None, + lag, ) .await?; let response: merkle_tree_hook::CheckPointResponse = serde_json::from_slice(&data)?; @@ -148,7 +148,7 @@ impl MerkleTreeHook for CosmosMerkleTreeHook { // ------------------ Indexer ------------------ -const EVENT_TYPE: &str = "post_dispatch"; +const EVENT_TYPE: &str = "hpl_hook_merkle::post_dispatch"; #[derive(Debug)] /// A reference to a MerkleTreeHookIndexer contract on some Cosmos chain @@ -169,10 +169,11 @@ impl CosmosMerkleeTreeHookIndexer { } /// Get the parser for the indexer - fn get_parser(&self) -> fn(attrs: Vec) -> MerkleTreeInsertion { - |attrs: Vec| -> MerkleTreeInsertion { + fn get_parser(&self) -> fn(attrs: Vec) -> Option { + |attrs: Vec| -> Option { let mut message_id = H256::zero(); let mut leaf_index: u32 = 0; + let mut attr_count = 0; for attr in attrs { let key = attr.key.as_str(); @@ -180,14 +181,22 @@ impl CosmosMerkleeTreeHookIndexer { match key { "message_id" => { - message_id = H256::from_slice(hex::decode(value).unwrap().as_slice()) + message_id = H256::from_slice(hex::decode(value).unwrap().as_slice()); + attr_count += 1; + } + "index" => { + leaf_index = value.parse().unwrap(); + attr_count += 1; } - "leaf_index" => leaf_index = value.parse().unwrap(), _ => {} } } - MerkleTreeInsertion::new(leaf_index, message_id) + if attr_count != 2 { + return None; + } + + Some(MerkleTreeInsertion::new(leaf_index, message_id)) } } } diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index 9587998387..f9d431d740 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -311,8 +311,6 @@ impl WasmProvider for WasmGrpcProvider { funds: vec![], }; - println!("simulate msg: {:?}", serde_json::to_string(&payload)?); - let response = self .simulate_raw_tx(vec![msg.to_any().unwrap()], None) .await?; diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index 0bfa71b3b7..bfb6b6bbb7 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -22,7 +22,7 @@ pub trait WasmIndexer: Send + Sync { async fn get_event_log( &self, block_number: u32, - parser: fn(Vec) -> T, + parser: fn(Vec) -> Option, ) -> ChainResult> where T: Send + Sync; @@ -87,7 +87,7 @@ impl WasmIndexer for CosmosWasmIndexer { async fn get_event_log( &self, block_number: u32, - parser: fn(Vec) -> T, + parser: fn(Vec) -> Option, ) -> ChainResult> where T: Send + Sync, @@ -145,17 +145,18 @@ impl WasmIndexer for CosmosWasmIndexer { continue; } - let msg = parser(event.attributes.clone()); - let meta = LogMeta { - address: bech32_decode(addr.clone()), - block_number: block_number as u64, - block_hash: H256::from_slice(block.block_id.hash.as_bytes()), - transaction_id: h256_to_h512(tx_hash), - transaction_index: idx as u64, - log_index: U256::from(log_idx), - }; - - parse_result.push((msg, meta)); + if let Some(msg) = parser(event.attributes.clone()) { + let meta = LogMeta { + address: bech32_decode(addr.clone()), + block_number: block_number as u64, + block_hash: H256::from_slice(block.block_id.hash.as_bytes()), + transaction_id: h256_to_h512(tx_hash), + transaction_index: idx as u64, + log_index: U256::from(log_idx), + }; + + parse_result.push((msg, meta)); + } } if available { diff --git a/rust/hyperlane-base/src/db/rocks/hyperlane_db.rs b/rust/hyperlane-base/src/db/rocks/hyperlane_db.rs index 4c496d741d..09f87e5338 100644 --- a/rust/hyperlane-base/src/db/rocks/hyperlane_db.rs +++ b/rust/hyperlane-base/src/db/rocks/hyperlane_db.rs @@ -142,6 +142,8 @@ impl HyperlaneRocksDB { debug!(insertion=?insertion, "Tree insertion already stored in db"); return Ok(false); } + + println!("process_tree_insertion: {:?}", insertion); // even if double insertions are ok, store the leaf by `leaf_index` (guaranteed to be unique) // rather than by `message_id` (not guaranteed to be recurring), so that leaves can be retrieved // based on insertion order. diff --git a/rust/utils/run-locally/src/cosmos/cli.rs b/rust/utils/run-locally/src/cosmos/cli.rs index 94d4fc6210..85a5c54f19 100644 --- a/rust/utils/run-locally/src/cosmos/cli.rs +++ b/rust/utils/run-locally/src/cosmos/cli.rs @@ -281,12 +281,13 @@ impl OsmosisCLI { output.unwrap() } - pub fn wasm_query( + pub fn wasm_query( + // U: serde::de::DeserializeOwned>( &self, endpoint: &OsmosisEndpoint, contract: &str, query_msg: T, - ) -> U { + ) { let mut cmd = self .cli() .cmd("query") @@ -300,9 +301,11 @@ impl OsmosisCLI { let output = cmd.run_with_output().join(); let output = output.first().unwrap(); - let output: CliWasmQueryResponse = serde_json::from_str(output).unwrap(); - output.data + println!("output: {:?}", output); + // let output: CliWasmQueryResponse = serde_json::from_str(output).unwrap(); + + // output.data } pub fn query_balance(&self, endpoint: &OsmosisEndpoint, addr: &str) -> BalanceResponse { diff --git a/rust/utils/run-locally/src/cosmos/deploy.rs b/rust/utils/run-locally/src/cosmos/deploy.rs index 0d2137152a..b74baeff0c 100644 --- a/rust/utils/run-locally/src/cosmos/deploy.rs +++ b/rust/utils/run-locally/src/cosmos/deploy.rs @@ -117,7 +117,6 @@ pub fn deploy_cw_hyperlane( codes.hpl_hook_routing, hook::routing::InstantiateMsg { owner: deployer_addr.clone(), - mailbox: mailbox.to_string(), }, "hpl_hook_routing", ); diff --git a/rust/utils/run-locally/src/cosmos/link.rs b/rust/utils/run-locally/src/cosmos/link.rs index ea647aebaa..0e6a560465 100644 --- a/rust/utils/run-locally/src/cosmos/link.rs +++ b/rust/utils/run-locally/src/cosmos/link.rs @@ -1,9 +1,18 @@ use std::path::Path; -use hpl_interface::{core, ism}; +use cosmwasm_schema::cw_serde; +use hpl_interface::{ + core, + ism::{self, multisig}, +}; use super::{cli::OsmosisCLI, crypto::KeyPair, CosmosNetwork}; +#[cw_serde] +pub struct GeneralIsmMessage { + pub ism: T, +} + fn link_network( cli: &OsmosisCLI, network: &CosmosNetwork, @@ -48,7 +57,7 @@ fn link_network( linker, &network.deployments.ism_routing, ism::routing::ExecuteMsg::Set { - ism: ism::routing::ISMSet { + ism: ism::routing::IsmSet { domain: target_domain, address: network.deployments.ism_multisig.clone(), }, @@ -94,6 +103,16 @@ fn link_network( "10000000uosmo", ); + cli.wasm_query( + &network.launch_resp.endpoint, + &network.deployments.ism_multisig, + multisig::QueryMsg::Ism( + ism::IsmQueryMsg::Verify { + message: hex::decode("0000000000000068220000000000000000000000000d1255b09d94659bb0888e0aa9fca60245ce402a0000682155208cd518cffaac1b5d8df216a9bd050c9a03f0d4f3ba88e5268ac4cd12ee2d68656c6c6f").unwrap().into(), + metadata: hex::decode("986a1625d44e4b3969b08a5876171b2b4fcdf61b3e5c70a86ad17b304f17740a9f45d99ea6bec61392a47684f4e5d1416ddbcb5fdef0f132c27d7034e9bbff1c00000000ba9911d78ec6d561413e3589f920388cbd7554fbddd8ce50739337250853ec3577a51fa40e727c05b50f15db13f5aad5857c89d432644be48d70325ea83fdb6c1c").unwrap().into(), + }) + ); + // TODO // cli.wasm_execute( // &network.launch_resp.endpoint, diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index c5f776a3f3..94bfc1ef5d 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -244,7 +244,7 @@ fn launch_cosmos_validator( .hyp_env("CHECKPOINTSYNCER_PATH", checkpoint_path.to_str().unwrap()) .hyp_env("CHECKPOINTSYNCER_TYPE", "localStorage") .hyp_env("ORIGINCHAINNAME", agent_config.name) - .hyp_env("REORGPERIOD", "1") + .hyp_env("REORGPERIOD", "100") .hyp_env("DB", validator_base_db.to_str().unwrap()) .hyp_env("METRICS", agent_config.domain_id.to_string()) .hyp_env("VALIDATOR_KEY", agent_config.signer.key) @@ -270,7 +270,7 @@ fn launch_cosmos_relayer( .env("CONFIG_FILES", agent_config_path.to_str().unwrap()) .env("RUST_BACKTRACE", "1") .hyp_env("RELAYCHAINS", relay_chains.join(",")) - .hyp_env("REORGPERIOD", "1") + .hyp_env("REORGPERIOD", "100") .hyp_env("DB", relayer_base.as_ref().to_str().unwrap()) .hyp_env("ALLOWLOCALCHECKPOINTSYNCERS", "true") .hyp_env("TRACING_LEVEL", if debug { "debug" } else { "info" }) From 125d3a786ef470252b2bd919a65a18d34facf2f2 Mon Sep 17 00:00:00 2001 From: hashableric Date: Wed, 18 Oct 2023 07:22:32 +0900 Subject: [PATCH 080/142] feat: e2e test success --- .../agents/relayer/src/msg/gas_payment/mod.rs | 3 +- rust/utils/run-locally/src/cosmos/cli.rs | 12 +- rust/utils/run-locally/src/cosmos/deploy.rs | 9 +- rust/utils/run-locally/src/cosmos/link.rs | 128 ++++++++++++++++-- rust/utils/run-locally/src/cosmos/mod.rs | 40 ++++-- 5 files changed, 165 insertions(+), 27 deletions(-) diff --git a/rust/agents/relayer/src/msg/gas_payment/mod.rs b/rust/agents/relayer/src/msg/gas_payment/mod.rs index 4ed30c9572..3114849246 100644 --- a/rust/agents/relayer/src/msg/gas_payment/mod.rs +++ b/rust/agents/relayer/src/msg/gas_payment/mod.rs @@ -7,7 +7,7 @@ use hyperlane_core::{ GasPaymentKey, HyperlaneMessage, InterchainGasExpenditure, InterchainGasPayment, TxCostEstimate, TxOutcome, U256, }; -use tracing::{debug, error, trace}; +use tracing::{debug, error, info, trace}; use self::policies::{GasPaymentPolicyMinimum, GasPaymentPolicyNone}; use crate::{ @@ -86,6 +86,7 @@ impl GasPaymentEnforcer { .db .retrieve_gas_payment_by_gas_payment_key(gas_payment_key)?; let current_expenditure = self.db.retrieve_gas_expenditure_by_message_id(msg_id)?; + for (policy, whitelist) in &self.policies { if !whitelist.msg_matches(message, true) { trace!( diff --git a/rust/utils/run-locally/src/cosmos/cli.rs b/rust/utils/run-locally/src/cosmos/cli.rs index 85a5c54f19..634e99181c 100644 --- a/rust/utils/run-locally/src/cosmos/cli.rs +++ b/rust/utils/run-locally/src/cosmos/cli.rs @@ -179,8 +179,11 @@ impl OsmosisCLI { let cmd = self.add_gas(cmd); let cmd = endpoint.add_rpc(cmd); + let raw_output = cmd.run_with_output().join(); + println!("wasm store code res: {:?}", raw_output); + let wasm_store_tx_resp: TxResponse = - serde_json::from_str(cmd.run_with_output().join().first().unwrap()).unwrap(); + serde_json::from_str(raw_output.first().unwrap()).unwrap(); let store_code_log = wasm_store_tx_resp.logs.first().unwrap(); let store_code_evt = store_code_log @@ -276,7 +279,12 @@ impl OsmosisCLI { ); } - let output = serde_json::from_str(cmd.run_with_output().join().first().unwrap()); + let run_result = cmd.run_with_output().join(); + + println!("wasm execute res: {:?}", run_result); + + let output: Result = + serde_json::from_str(run_result.first().unwrap()); output.unwrap() } diff --git a/rust/utils/run-locally/src/cosmos/deploy.rs b/rust/utils/run-locally/src/cosmos/deploy.rs index b74baeff0c..3bb7dd2d7e 100644 --- a/rust/utils/run-locally/src/cosmos/deploy.rs +++ b/rust/utils/run-locally/src/cosmos/deploy.rs @@ -20,6 +20,11 @@ pub struct TestMockMsgReceiverInstantiateMsg { pub hrp: String, } +#[cw_serde] +pub struct IGPOracleInstantiateMsg { + pub owner: String, +} + const PREFIX: &str = "osmo"; #[apply(as_task)] @@ -66,7 +71,9 @@ pub fn deploy_cw_hyperlane( &deployer, Some(deployer_addr), codes.hpl_igp_oracle, - igp::oracle::InstantiateMsg {}, + IGPOracleInstantiateMsg { + owner: deployer_addr.clone(), + }, "hpl_igp_gas_oracle", ); diff --git a/rust/utils/run-locally/src/cosmos/link.rs b/rust/utils/run-locally/src/cosmos/link.rs index 0e6a560465..420e192759 100644 --- a/rust/utils/run-locally/src/cosmos/link.rs +++ b/rust/utils/run-locally/src/cosmos/link.rs @@ -2,7 +2,7 @@ use std::path::Path; use cosmwasm_schema::cw_serde; use hpl_interface::{ - core, + core, igp, ism::{self, multisig}, }; @@ -13,6 +13,60 @@ pub struct GeneralIsmMessage { pub ism: T, } +#[cw_serde] +pub struct GeneralRouterMessage { + pub router: T, +} + +#[cw_serde] +pub struct GeneralHookMessage { + pub hook: T, +} + +#[cw_serde] +pub struct MockRouterMsg { + pub set_route: MockRouterMsgInner, +} + +#[cw_serde] +pub struct MockRouterMsgInner { + pub set: MockDomainRouteSet, +} + +#[cw_serde] +pub struct MockDomainRouteSet { + pub domain: u32, + pub route: String, +} + +#[cw_serde] +pub struct RemoteGasDataConfig { + pub remote_domain: u32, + pub token_exchange_rate: String, + pub gas_price: String, +} + +#[cw_serde] +pub struct RemoteGasDataConfigExecute { + pub set_remote_gas_data_configs: RemoteGasDataConfigExecuteInner, +} + +#[cw_serde] +pub struct RemoteGasDataConfigExecuteInner { + pub configs: Vec, +} + +#[cw_serde] +pub struct MockHookQueryMsg { + quote_dispatch: MockQuoteDispatch, +} + +#[cw_serde] +pub struct MockQuoteDispatch { + pub metadata: String, + pub message: String, +} + fn link_network( cli: &OsmosisCLI, network: &CosmosNetwork, @@ -24,6 +78,14 @@ fn link_network( let validator_addr = validator.addr(hrp); let validator_pubkey = validator.pub_key_to_binary(); + let dest_domain = if network.domain == 26657 { + 26658 + } else { + 26657 + }; + + // hook routing + // link src chain cli.wasm_execute( &network.launch_resp.endpoint, @@ -52,6 +114,23 @@ fn link_network( vec![], ); + cli.wasm_execute( + &network.launch_resp.endpoint, + linker, + &network.deployments.hook_routing, + GeneralRouterMessage { + router: MockRouterMsg { + set_route: MockRouterMsgInner { + set: MockDomainRouteSet { + domain: target_domain, + route: network.deployments.hook_merkle.clone(), + }, + }, + }, + }, + vec![], + ); + cli.wasm_execute( &network.launch_resp.endpoint, linker, @@ -70,7 +149,40 @@ fn link_network( linker, &network.deployments.mailbox, core::mailbox::ExecuteMsg::SetDefaultHook { - hook: network.deployments.hook_merkle.clone(), + hook: network.deployments.hook_routing.clone(), + }, + vec![], + ); + + cli.wasm_execute( + &network.launch_resp.endpoint, + linker, + &network.deployments.igp_oracle, + RemoteGasDataConfigExecute { + set_remote_gas_data_configs: RemoteGasDataConfigExecuteInner { + configs: vec![RemoteGasDataConfig { + remote_domain: dest_domain, + token_exchange_rate: "10000".to_string(), + gas_price: "1000000000".to_string(), + }], + }, + }, + vec![], + ); + + cli.wasm_execute( + &network.launch_resp.endpoint, + linker, + &network.deployments.igp, + GeneralRouterMessage { + router: MockRouterMsg { + set_route: MockRouterMsgInner { + set: MockDomainRouteSet { + domain: target_domain, + route: network.deployments.igp_oracle.clone(), + }, + }, + }, }, vec![], ); @@ -80,7 +192,7 @@ fn link_network( linker, &network.deployments.mailbox, core::mailbox::ExecuteMsg::SetRequiredHook { - hook: network.deployments.hook_merkle.clone(), + hook: network.deployments.igp.clone(), }, vec![], ); @@ -103,16 +215,6 @@ fn link_network( "10000000uosmo", ); - cli.wasm_query( - &network.launch_resp.endpoint, - &network.deployments.ism_multisig, - multisig::QueryMsg::Ism( - ism::IsmQueryMsg::Verify { - message: hex::decode("0000000000000068220000000000000000000000000d1255b09d94659bb0888e0aa9fca60245ce402a0000682155208cd518cffaac1b5d8df216a9bd050c9a03f0d4f3ba88e5268ac4cd12ee2d68656c6c6f").unwrap().into(), - metadata: hex::decode("986a1625d44e4b3969b08a5876171b2b4fcdf61b3e5c70a86ad17b304f17740a9f45d99ea6bec61392a47684f4e5d1416ddbcb5fdef0f132c27d7034e9bbff1c00000000ba9911d78ec6d561413e3589f920388cbd7554fbddd8ce50739337250853ec3577a51fa40e727c05b50f15db13f5aad5857c89d432644be48d70325ea83fdb6c1c").unwrap().into(), - }) - ); - // TODO // cli.wasm_execute( // &network.launch_resp.endpoint, diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index 94bfc1ef5d..f710a9e2de 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -4,6 +4,7 @@ use std::thread::sleep; use std::time::Duration; use std::{env, fs}; +use cosmwasm_schema::cw_serde; use hpl_interface::{core, types::bech32_decode}; use macro_rules_attribute::apply; use tempfile::tempdir; @@ -77,6 +78,20 @@ fn make_target() -> String { format!("{}-{}", os, arch) } +#[cw_serde] +pub struct MockDispatch { + pub dispatch: MockDispatchInner, +} + +#[cw_serde] +pub struct MockDispatchInner { + pub dest_domain: u32, + pub recipient_addr: String, + pub msg_body: String, + pub hook: Option, + pub metadata: String, +} + pub fn install_codes(dir: Option, local: bool) -> BTreeMap { let dir_path = match dir { Some(path) => path, @@ -274,6 +289,7 @@ fn launch_cosmos_relayer( .hyp_env("DB", relayer_base.as_ref().to_str().unwrap()) .hyp_env("ALLOWLOCALCHECKPOINTSYNCERS", "true") .hyp_env("TRACING_LEVEL", if debug { "debug" } else { "info" }) + .hyp_env("GASPAYMENTENFORCEMENT", "[{\"type\": \"none\"}]") .spawn("RLY"); relayer @@ -449,22 +465,26 @@ fn run_locally() { node.launch_resp.home_path.to_str().unwrap(), ); + let msg_body: &[u8; 5] = b"hello"; + cli.wasm_execute( &node.launch_resp.endpoint, linker, &node.deployments.mailbox, - core::mailbox::ExecuteMsg::Dispatch(core::mailbox::DispatchMsg { - dest_domain: target.domain, - recipient_addr: bech32_decode(&target.deployments.mock_receiver) - .unwrap() - .into(), - msg_body: b"hello".into(), - hook: Some(node.deployments.mock_hook.clone()), - metadata: None, - }), + MockDispatch { + dispatch: MockDispatchInner { + dest_domain: target.domain, + recipient_addr: hex::encode( + bech32_decode(&target.deployments.mock_receiver).unwrap(), + ), + msg_body: hex::encode(msg_body), + hook: None, + metadata: "".to_string(), + }, + }, vec![Coin { denom: "uosmo".to_string(), - amount: 510_000.to_string(), + amount: 25_000_000.to_string(), }], ); } From 34b977071b275567884ef8f3dfd3a4438a7f16f4 Mon Sep 17 00:00:00 2001 From: hashableric Date: Wed, 18 Oct 2023 19:13:54 +0900 Subject: [PATCH 081/142] =?UTF-8?q?chore:=20fix=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rust/utils/run-locally/src/cosmos/mod.rs | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index f710a9e2de..ca7d364b67 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -58,7 +58,7 @@ fn default_keys<'a>() -> [(&'a str, &'a str); 6] { } const CW_HYPERLANE_GIT: &str = "https://github.com/many-things/cw-hyperlane"; -const CW_HYPERLANE_VERSION: &str = "0.0.6-rc0"; +const CW_HYPERLANE_VERSION: &str = "0.0.6-rc3"; fn make_target() -> String { let os = if cfg!(target_os = "linux") { @@ -99,7 +99,7 @@ pub fn install_codes(dir: Option, local: bool) -> BTreeMap, local: bool) -> BTreeMap CosmosResp { Some(v) => v, None => tempdir().unwrap().into_path(), }; - let cli = OsmosisCLI::new(config.cli_path, home_path.to_str().unwrap()); cli.init(&config.moniker, &config.chain_id); @@ -316,9 +315,7 @@ fn run_locally() { .unwrap_or_default(), ); - let codes_dir = PathBuf::from("/Users/eric/many-things/mitosis/cw-hyperlane/artifacts/actual"); - - let (osmosisd, codes) = install_cosmos(None, cli_src, Some(codes_dir), code_src); + let (osmosisd, codes) = install_cosmos(None, cli_src, None, code_src); let addr_base = "tcp://0.0.0.0"; let default_config = CosmosConfig { cli_path: osmosisd.clone(), From 6770bb7574250c1509c8a86bc4d78a1bda23dedb Mon Sep 17 00:00:00 2001 From: hashableric Date: Wed, 25 Oct 2023 04:52:42 +0900 Subject: [PATCH 082/142] feat: apply bulk indexing --- .../hyperlane-cosmos/src/interchain_gas.rs | 18 +- rust/chains/hyperlane-cosmos/src/mailbox.rs | 21 +-- .../hyperlane-cosmos/src/merkle_tree_hook.rs | 12 +- .../hyperlane-cosmos/src/payloads/general.rs | 1 + .../hyperlane-cosmos/src/providers/rpc.rs | 174 +++++++++++------- rust/hyperlane-base/src/settings/chains.rs | 2 +- rust/package.json | 4 + 7 files changed, 120 insertions(+), 112 deletions(-) create mode 100644 rust/package.json diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index 5392fc8891..de2757eea5 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -1,14 +1,13 @@ use async_trait::async_trait; +use cosmrs::tendermint::abci::EventAttribute; use hyperlane_core::{ ChainResult, ContractLocator, HyperlaneChain, HyperlaneContract, Indexer, InterchainGasPaymaster, SequenceIndexer, U256, }; use hyperlane_core::{HyperlaneDomain, HyperlaneProvider, InterchainGasPayment, LogMeta, H256}; use std::ops::RangeInclusive; -use tracing::info; use crate::grpc::WasmGrpcProvider; -use crate::payloads::general::EventAttribute; use crate::rpc::{CosmosWasmIndexer, WasmIndexer}; use crate::signers::Signer; use crate::{ConnectionConf, CosmosProvider}; @@ -107,14 +106,8 @@ impl Indexer for CosmosInterchainGasPaymasterIndexer { &self, range: RangeInclusive, ) -> ChainResult> { - let mut result: Vec<(InterchainGasPayment, LogMeta)> = vec![]; let parser = self.get_parser(); - - for block_number in range { - let logs = self.indexer.get_event_log(block_number, parser).await?; - result.extend(logs); - } - + let result = self.indexer.get_range_event_logs(range, parser).await?; Ok(result) } @@ -126,13 +119,8 @@ impl Indexer for CosmosInterchainGasPaymasterIndexer { #[async_trait] impl Indexer for CosmosInterchainGasPaymasterIndexer { async fn fetch_logs(&self, range: RangeInclusive) -> ChainResult> { - let mut result: Vec<(InterchainGasPayment, LogMeta)> = vec![]; let parser = self.get_parser(); - - for block_number in range { - let logs = self.indexer.get_event_log(block_number, parser).await?; - result.extend(logs); - } + let result = self.indexer.get_range_event_logs(range, parser).await?; Ok(result .into_iter() diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 467335f5d3..eaf2c1ff32 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -4,7 +4,6 @@ use std::num::NonZeroU64; use std::ops::RangeInclusive; use crate::grpc::{WasmGrpcProvider, WasmProvider}; -use crate::payloads::general::EventAttribute; use crate::payloads::mailbox::{ GeneralMailboxQuery, ProcessMessageRequest, ProcessMessageRequestInner, }; @@ -16,6 +15,7 @@ use async_trait::async_trait; use cosmrs::proto::cosmos::base::abci::v1beta1::TxResponse; use cosmrs::proto::cosmos::tx::v1beta1::SimulateResponse; +use cosmrs::tendermint::abci::EventAttribute; use crate::binary::h256_to_h512; use hyperlane_core::{ @@ -303,18 +303,8 @@ impl Indexer for CosmosMailboxIndexer { &self, range: RangeInclusive, ) -> ChainResult> { - let mut result: Vec<(HyperlaneMessage, LogMeta)> = vec![]; let parser = self.get_parser(); - - for block_number in range { - let logs = self.indexer.get_event_log(block_number, parser).await; - - if let Err(e) = logs { - warn!("error: {:?}", e); - continue; - } - result.extend(logs.unwrap()); - } + let mut result = self.indexer.get_range_event_logs(range, parser).await?; Ok(result) } @@ -327,13 +317,8 @@ impl Indexer for CosmosMailboxIndexer { #[async_trait] impl Indexer for CosmosMailboxIndexer { async fn fetch_logs(&self, range: RangeInclusive) -> ChainResult> { - let mut result: Vec<(HyperlaneMessage, LogMeta)> = vec![]; let parser: fn(Vec) -> Option = self.get_parser(); - - for block_number in range { - let logs = self.indexer.get_event_log(block_number, parser).await?; - result.extend(logs); - } + let result = self.indexer.get_range_event_logs(range, parser).await?; Ok(result .into_iter() diff --git a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs index 64e0fa8f8f..1d8eab198d 100644 --- a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs +++ b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -1,17 +1,18 @@ use std::{fmt::Debug, num::NonZeroU64, ops::RangeInclusive, str::FromStr}; use async_trait::async_trait; +use cosmrs::tendermint::abci::EventAttribute; use hyperlane_core::{ accumulator::incremental::IncrementalMerkle, ChainResult, Checkpoint, ContractLocator, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneProvider, Indexer, LogMeta, MerkleTreeHook, MerkleTreeInsertion, SequenceIndexer, H256, }; -use tracing::{info, instrument}; +use tracing::instrument; use crate::{ grpc::{WasmGrpcProvider, WasmProvider}, payloads::{ - general::{self, EventAttribute}, + general::{self}, merkle_tree_hook, }, rpc::{CosmosWasmIndexer, WasmIndexer}, @@ -208,13 +209,8 @@ impl Indexer for CosmosMerkleeTreeHookIndexer { &self, range: RangeInclusive, ) -> ChainResult> { - let mut result: Vec<(MerkleTreeInsertion, LogMeta)> = vec![]; let parser = self.get_parser(); - - for block_number in range { - let logs = self.indexer.get_event_log(block_number, parser).await?; - result.extend(logs); - } + let result = self.indexer.get_range_event_logs(range, parser).await?; Ok(result) } diff --git a/rust/chains/hyperlane-cosmos/src/payloads/general.rs b/rust/chains/hyperlane-cosmos/src/payloads/general.rs index ef39253229..89d970a637 100644 --- a/rust/chains/hyperlane-cosmos/src/payloads/general.rs +++ b/rust/chains/hyperlane-cosmos/src/payloads/general.rs @@ -19,4 +19,5 @@ pub struct Event { pub struct EventAttribute { pub key: String, pub value: String, + pub index: bool, } diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index bfb6b6bbb7..ddd2c26bb6 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -1,11 +1,14 @@ +use std::collections::HashMap; +use std::ops::RangeInclusive; + use crate::binary::h256_to_h512; -use crate::payloads::general::{EventAttribute, Events}; use async_trait::async_trait; use cosmrs::rpc::client::{Client, CompatMode, HttpClient}; -use cosmrs::tendermint::hash::Algorithm; -use cosmrs::tendermint::Hash; +use cosmrs::rpc::endpoint::tx; +use cosmrs::rpc::query::{EventType, Query}; +use cosmrs::rpc::Order; +use cosmrs::tendermint::abci::EventAttribute; use hyperlane_core::{ChainResult, ContractLocator, HyperlaneDomain, LogMeta, H256, U256}; -use sha256::digest; use tracing::debug; use crate::verify::{self, bech32_decode}; @@ -18,10 +21,10 @@ pub trait WasmIndexer: Send + Sync { fn get_client(&self) -> ChainResult; /// get latest block height async fn latest_block_height(&self) -> ChainResult; - /// get event log - async fn get_event_log( + /// get range event logs + async fn get_range_event_logs( &self, - block_number: u32, + range: RangeInclusive, parser: fn(Vec) -> Option, ) -> ChainResult> where @@ -84,84 +87,115 @@ impl WasmIndexer for CosmosWasmIndexer { Ok(result.block.header.height.value() as u32) } - async fn get_event_log( + async fn get_range_event_logs( &self, - block_number: u32, + range: RangeInclusive, parser: fn(Vec) -> Option, ) -> ChainResult> where T: Send + Sync, { let client = self.get_client()?; - - let block = client.block(block_number).await?; - let block_result = client.block_results(block_number).await?; - - let tx_hash: Vec = block - .block - .data - .into_iter() - .map(|tx| { - H256::from_slice( - Hash::from_bytes( - Algorithm::Sha256, - hex::decode(digest(tx.as_slice())).unwrap().as_slice(), - ) - .unwrap() - .as_bytes(), - ) - }) - .collect(); - - let mut result: Vec<(T, LogMeta)> = vec![]; - let tx_results = block_result.txs_results; - - if tx_results.is_none() { - return Ok(result); + let contract_address = self.get_contract_addr()?; + + let block_step: u32 = 100; + let mut block_hash_vec: Vec<(u64, H256)> = vec![]; + let block_query: Query = format!( + "block.height >= {} AND block.height <= {}", + range.start(), + range.end(), + ) + .parse() + .unwrap(); + let total_block_count = range.end() - range.start() + 1; + let last_block_page = total_block_count / 100 + (total_block_count % 100 != 0) as u32; + + for _ in 1..=last_block_page { + let blocks = client + .block_search(block_query.clone(), 1, block_step as u8, Order::Ascending) + .await?; + + block_hash_vec.extend( + blocks + .blocks + .iter() + .map(|b| { + ( + b.block.header.height.value(), + H256::from_slice(b.block_id.hash.as_bytes()), + ) + }) + .collect::>(), + ); } - - let addr = self.get_contract_addr()?; - - for (idx, tx) in tx_results.unwrap().iter().enumerate() { - let tx_hash = tx_hash[idx]; - if tx.code.is_err() { - debug!("tx {:?} has failed. skip!", tx_hash); - continue; - } - - let mut available = false; - - let mut parse_result: Vec<(T, LogMeta)> = vec![]; - - let logs = serde_json::from_str::>(&tx.log)?; - let logs = logs.first().unwrap(); - - for (log_idx, event) in logs.events.clone().into_iter().enumerate() { - if event.typ.as_str().starts_with(Self::WASM_TYPE) - && event.attributes[0].value == addr - { - available = true; - } else if event.typ.as_str() != self.event_type { + let block_hash: HashMap = block_hash_vec.into_iter().collect(); + + // Page starts from 1 + let query = Query::from(EventType::Tx) + .and_gte("block.height", *range.start() as u64) + .and_lte("block.height", *range.end() as u64) + .and_eq( + format!("{}-{}._contract_address", Self::WASM_TYPE, self.event_type), + contract_address.clone(), + ); + + let tx_search_result = client + .tx_search(query.clone(), false, 1, 30, Order::Ascending) + .await?; + + let total_count = tx_search_result.total_count; + let last_page = total_count / 30 + (total_count % 30 != 0) as u32; + + let handler = |txs: Vec, + block_hashs: HashMap| + -> Vec<(T, LogMeta)> { + let mut result: Vec<(T, LogMeta)> = vec![]; + + // Get BlockHash from block_search + let client = self.get_client().unwrap(); + + for tx in txs { + if tx.tx_result.code.is_err() { + debug!("tx {:?} has failed. skip!", tx.hash); continue; } - if let Some(msg) = parser(event.attributes.clone()) { - let meta = LogMeta { - address: bech32_decode(addr.clone()), - block_number: block_number as u64, - block_hash: H256::from_slice(block.block_id.hash.as_bytes()), - transaction_id: h256_to_h512(tx_hash), - transaction_index: idx as u64, - log_index: U256::from(log_idx), - }; - - parse_result.push((msg, meta)); + let mut parse_result: Vec<(T, LogMeta)> = vec![]; + + for (log_idx, event) in tx.tx_result.events.clone().into_iter().enumerate() { + if event.kind.as_str().starts_with(Self::WASM_TYPE) + && event.attributes[0].value == contract_address + { + if let Some(msg) = parser(event.attributes.clone()) { + let meta = LogMeta { + address: bech32_decode(contract_address.clone()), + block_number: tx.height.value(), + block_hash: block_hashs[&tx.height.value()], + transaction_id: h256_to_h512(H256::from_slice(tx.hash.as_bytes())), + transaction_index: tx.index as u64, + log_index: U256::from(log_idx), + }; + + parse_result.push((msg, meta)); + } + } } - } - if available { result.extend(parse_result); } + + result + }; + + let mut result = handler(tx_search_result.txs, block_hash.clone()); + + for page in 2..=last_page { + println!("page: {}", page); + let tx_search_result = client + .tx_search(query.clone(), false, page, 30, Order::Ascending) + .await?; + + result.extend(handler(tx_search_result.txs, block_hash.clone())); } Ok(result) diff --git a/rust/hyperlane-base/src/settings/chains.rs b/rust/hyperlane-base/src/settings/chains.rs index e685fd8ffe..ade1112604 100644 --- a/rust/hyperlane-base/src/settings/chains.rs +++ b/rust/hyperlane-base/src/settings/chains.rs @@ -346,7 +346,7 @@ impl ChainConf { let indexer = Box::new(h_cosmos::CosmosInterchainGasPaymasterIndexer::new( conf.clone(), locator, - "pay-for-gas".to_string(), + "igp-core-pay-for-gas".to_string(), )); Ok(indexer as Box>) } diff --git a/rust/package.json b/rust/package.json new file mode 100644 index 0000000000..65bb74be9d --- /dev/null +++ b/rust/package.json @@ -0,0 +1,4 @@ +{ + "name": "rust", + "packageManager": "yarn@3.6.1" +} From 7df00551e131a58ae89973749c74e30bdc6d42ef Mon Sep 17 00:00:00 2001 From: hashableric Date: Wed, 25 Oct 2023 05:31:55 +0900 Subject: [PATCH 083/142] feat: successfully found logs --- rust/chains/hyperlane-cosmos/src/providers/rpc.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index ddd2c26bb6..0528a3ea5f 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -131,14 +131,16 @@ impl WasmIndexer for CosmosWasmIndexer { let block_hash: HashMap = block_hash_vec.into_iter().collect(); // Page starts from 1 - let query = Query::from(EventType::Tx) - .and_gte("block.height", *range.start() as u64) - .and_lte("block.height", *range.end() as u64) + let query = Query::default() + .and_gte("tx.height", *range.start() as u64) + .and_lte("tx.height", *range.end() as u64) .and_eq( format!("{}-{}._contract_address", Self::WASM_TYPE, self.event_type), contract_address.clone(), ); + println!("Query: {:?}", query.to_string()); + let tx_search_result = client .tx_search(query.clone(), false, 1, 30, Order::Ascending) .await?; From d71800fd123dcfd307a40e6ed66e0ce382c127b2 Mon Sep 17 00:00:00 2001 From: hashableric Date: Wed, 25 Oct 2023 06:01:48 +0900 Subject: [PATCH 084/142] fix: minor bugs --- rust/chains/hyperlane-cosmos/src/providers/rpc.rs | 5 ++--- rust/package.json | 4 ---- 2 files changed, 2 insertions(+), 7 deletions(-) delete mode 100644 rust/package.json diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index 0528a3ea5f..d7e6b18a37 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -152,6 +152,7 @@ impl WasmIndexer for CosmosWasmIndexer { block_hashs: HashMap| -> Vec<(T, LogMeta)> { let mut result: Vec<(T, LogMeta)> = vec![]; + let target_type = format!("{}-{}", Self::WASM_TYPE, self.event_type); // Get BlockHash from block_search let client = self.get_client().unwrap(); @@ -165,9 +166,7 @@ impl WasmIndexer for CosmosWasmIndexer { let mut parse_result: Vec<(T, LogMeta)> = vec![]; for (log_idx, event) in tx.tx_result.events.clone().into_iter().enumerate() { - if event.kind.as_str().starts_with(Self::WASM_TYPE) - && event.attributes[0].value == contract_address - { + if event.kind.as_str() == target_type { if let Some(msg) = parser(event.attributes.clone()) { let meta = LogMeta { address: bech32_decode(contract_address.clone()), diff --git a/rust/package.json b/rust/package.json deleted file mode 100644 index 65bb74be9d..0000000000 --- a/rust/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "rust", - "packageManager": "yarn@3.6.1" -} From 67c65027ad25c62143f9ae50bf0ce724e3549f7b Mon Sep 17 00:00:00 2001 From: hashableric Date: Wed, 25 Oct 2023 19:53:57 +0900 Subject: [PATCH 085/142] feat: apply code reviews --- rust/chains/hyperlane-cosmos/src/providers/rpc.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index d7e6b18a37..816e7aa0f2 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -5,7 +5,7 @@ use crate::binary::h256_to_h512; use async_trait::async_trait; use cosmrs::rpc::client::{Client, CompatMode, HttpClient}; use cosmrs::rpc::endpoint::tx; -use cosmrs::rpc::query::{EventType, Query}; +use cosmrs::rpc::query::Query; use cosmrs::rpc::Order; use cosmrs::tendermint::abci::EventAttribute; use hyperlane_core::{ChainResult, ContractLocator, HyperlaneDomain, LogMeta, H256, U256}; @@ -108,7 +108,8 @@ impl WasmIndexer for CosmosWasmIndexer { .parse() .unwrap(); let total_block_count = range.end() - range.start() + 1; - let last_block_page = total_block_count / 100 + (total_block_count % 100 != 0) as u32; + let last_block_page = + total_block_count / block_step + (total_block_count % block_step != 0) as u32; for _ in 1..=last_block_page { let blocks = client @@ -139,7 +140,7 @@ impl WasmIndexer for CosmosWasmIndexer { contract_address.clone(), ); - println!("Query: {:?}", query.to_string()); + debug!("Query: {:?}", query.to_string()); let tx_search_result = client .tx_search(query.clone(), false, 1, 30, Order::Ascending) @@ -159,7 +160,7 @@ impl WasmIndexer for CosmosWasmIndexer { for tx in txs { if tx.tx_result.code.is_err() { - debug!("tx {:?} has failed. skip!", tx.hash); + debug!(tx_hash=?tx.hash, "Indexed tx has failed, skipping"); continue; } @@ -191,7 +192,8 @@ impl WasmIndexer for CosmosWasmIndexer { let mut result = handler(tx_search_result.txs, block_hash.clone()); for page in 2..=last_page { - println!("page: {}", page); + debug!(page, "Making tx search RPC"); + let tx_search_result = client .tx_search(query.clone(), false, page, 30, Order::Ascending) .await?; From 3864d37c243dd3c719c431b8cf11f4c095fd6779 Mon Sep 17 00:00:00 2001 From: hashableric Date: Wed, 25 Oct 2023 20:03:39 +0900 Subject: [PATCH 086/142] feat: borrow --- rust/chains/hyperlane-cosmos/src/providers/rpc.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index 816e7aa0f2..b9a9172027 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -150,7 +150,7 @@ impl WasmIndexer for CosmosWasmIndexer { let last_page = total_count / 30 + (total_count % 30 != 0) as u32; let handler = |txs: Vec, - block_hashs: HashMap| + block_hashs: &HashMap| -> Vec<(T, LogMeta)> { let mut result: Vec<(T, LogMeta)> = vec![]; let target_type = format!("{}-{}", Self::WASM_TYPE, self.event_type); @@ -189,7 +189,7 @@ impl WasmIndexer for CosmosWasmIndexer { result }; - let mut result = handler(tx_search_result.txs, block_hash.clone()); + let mut result = handler(tx_search_result.txs, &block_hash); for page in 2..=last_page { debug!(page, "Making tx search RPC"); @@ -198,7 +198,7 @@ impl WasmIndexer for CosmosWasmIndexer { .tx_search(query.clone(), false, page, 30, Order::Ascending) .await?; - result.extend(handler(tx_search_result.txs, block_hash.clone())); + result.extend(handler(tx_search_result.txs, &block_hash)); } Ok(result) From 739194e471556ed0d5c2cd02abb12c78fc8278b2 Mon Sep 17 00:00:00 2001 From: hashableric Date: Wed, 25 Oct 2023 20:44:14 +0900 Subject: [PATCH 087/142] fix: add 'canonicalAsset' configuration into cosmos chain configuration --- rust/agents/validator/src/validator.rs | 4 ++-- rust/chains/hyperlane-cosmos/src/libs/verify.rs | 4 ++-- .../hyperlane-cosmos/src/providers/grpc.rs | 2 +- .../chains/hyperlane-cosmos/src/trait_builder.rs | 16 +++++++++++++++- rust/hyperlane-base/src/settings/parser/mod.rs | 8 ++++++++ 5 files changed, 28 insertions(+), 6 deletions(-) diff --git a/rust/agents/validator/src/validator.rs b/rust/agents/validator/src/validator.rs index e2c951cad0..9111d08b35 100644 --- a/rust/agents/validator/src/validator.rs +++ b/rust/agents/validator/src/validator.rs @@ -229,8 +229,8 @@ impl Validator { async fn announce(&self) -> Result<()> { let address = match self.raw_signer { - SignerConf::CosmosKey { key, .. } => { - let addr = priv_to_addr_string(key.0.as_slice().to_vec())?; + SignerConf::CosmosKey { key, prefix } => { + let addr = priv_to_addr_string(prefix.clone(), key.0.as_slice().to_vec())?; info!("Announcing validator with Cosmos key: {}", addr); priv_to_binary_addr(key.0.as_slice().to_vec())? diff --git a/rust/chains/hyperlane-cosmos/src/libs/verify.rs b/rust/chains/hyperlane-cosmos/src/libs/verify.rs index 294a987ae7..caacc0710f 100644 --- a/rust/chains/hyperlane-cosmos/src/libs/verify.rs +++ b/rust/chains/hyperlane-cosmos/src/libs/verify.rs @@ -92,7 +92,7 @@ pub fn priv_to_binary_addr(priv_key: Vec) -> ChainResult { } /// encode H256 to bech32 address -pub fn priv_to_addr_string(priv_key: Vec) -> ChainResult { +pub fn priv_to_addr_string(prefix: String, priv_key: Vec) -> ChainResult { let sha_hash = sha256_digest( SigningKey::from_slice(priv_key.as_slice()) .unwrap() @@ -102,7 +102,7 @@ pub fn priv_to_addr_string(priv_key: Vec) -> ChainResult { let rip_hash = ripemd160_digest(sha_hash)?; let addr = - bech32::encode("osmo", rip_hash.to_base32(), bech32::Variant::Bech32).map_err(|_| { + bech32::encode(&prefix, rip_hash.to_base32(), bech32::Variant::Bech32).map_err(|_| { ChainCommunicationError::ParseError { msg: "bech32".to_string(), } diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index f9d431d740..7006c03f85 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -246,7 +246,7 @@ impl WasmProvider for WasmGrpcProvider { let auth_info = signer_info.auth_info(Fee::from_amount_and_gas( Coin::new( Amount::from((gas_limit as f32 * DEFAULT_GAS_PRICE) as u64), - format!("u{}", self.signer.prefix.clone()).as_str(), + self.conf.get_canonical_asset().as_str(), ) .unwrap(), gas_limit, diff --git a/rust/chains/hyperlane-cosmos/src/trait_builder.rs b/rust/chains/hyperlane-cosmos/src/trait_builder.rs index a4fbbcf9c6..8629970bd9 100644 --- a/rust/chains/hyperlane-cosmos/src/trait_builder.rs +++ b/rust/chains/hyperlane-cosmos/src/trait_builder.rs @@ -9,6 +9,8 @@ pub struct ConnectionConf { chain_id: String, /// The prefix for the account address prefix: String, + /// Canoncial Assets Denom + canonical_asset: String, } /// An error type when parsing a connection configuration. @@ -52,13 +54,25 @@ impl ConnectionConf { self.prefix.clone() } + /// Get the asset + pub fn get_canonical_asset(&self) -> String { + self.canonical_asset.clone() + } + /// Create a new connection configuration - pub fn new(grpc_url: String, rpc_url: String, chain_id: String, prefix: String) -> Self { + pub fn new( + grpc_url: String, + rpc_url: String, + chain_id: String, + prefix: String, + canonical_asset: String, + ) -> Self { Self { grpc_url, rpc_url, chain_id, prefix, + canonical_asset, } } } diff --git a/rust/hyperlane-base/src/settings/parser/mod.rs b/rust/hyperlane-base/src/settings/parser/mod.rs index de06129d11..97032b59c3 100644 --- a/rust/hyperlane-base/src/settings/parser/mod.rs +++ b/rust/hyperlane-base/src/settings/parser/mod.rs @@ -294,6 +294,13 @@ fn parse_chain( None }); + let canoncial_asset = chain + .chain(&mut err) + .get_key("canonicalAsset") + .parse_string() + .end() + .or_else(|| format!("u{}", prefix)); + if !local_err.is_ok() { err.merge(local_err); None @@ -303,6 +310,7 @@ fn parse_chain( rpcs.first().unwrap().to_string(), chain_id.unwrap().to_string(), prefix.unwrap().to_string(), + canoncial_asset.unwrap().to_string(), ))) } } From e96ae467ded518efc110079104dc58fc2f3a843b Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Wed, 25 Oct 2023 12:02:01 +0000 Subject: [PATCH 088/142] remove block hash --- rust/chains/hyperlane-cosmos/build.rs | 8 --- rust/chains/hyperlane-cosmos/src/lib.rs | 1 - .../hyperlane-cosmos/src/libs/binary.rs | 4 +- .../hyperlane-cosmos/src/providers/rpc.rs | 60 ++++++------------- rust/hyperlane-core/src/types/checkpoint.rs | 3 +- 5 files changed, 21 insertions(+), 55 deletions(-) delete mode 100644 rust/chains/hyperlane-cosmos/build.rs diff --git a/rust/chains/hyperlane-cosmos/build.rs b/rust/chains/hyperlane-cosmos/build.rs deleted file mode 100644 index 6472e5dc9f..0000000000 --- a/rust/chains/hyperlane-cosmos/build.rs +++ /dev/null @@ -1,8 +0,0 @@ -use std::fs; - -fn main() { - // TODO: build the cosmos contracts/bindings - fs::create_dir_all("src/contracts").expect("failed to create contracts dir"); - fs::write("src/contracts/mod.rs", "// TODO: this should be generated") - .expect("failed to write contracts/mod.rs"); -} diff --git a/rust/chains/hyperlane-cosmos/src/lib.rs b/rust/chains/hyperlane-cosmos/src/lib.rs index b9ad1caf36..ce1a211558 100644 --- a/rust/chains/hyperlane-cosmos/src/lib.rs +++ b/rust/chains/hyperlane-cosmos/src/lib.rs @@ -6,7 +6,6 @@ #![allow(unused_variables)] mod aggregation_ism; -mod contracts; mod interchain_gas; mod interchain_security_module; mod libs; diff --git a/rust/chains/hyperlane-cosmos/src/libs/binary.rs b/rust/chains/hyperlane-cosmos/src/libs/binary.rs index 3c617ae429..8997d11ebd 100644 --- a/rust/chains/hyperlane-cosmos/src/libs/binary.rs +++ b/rust/chains/hyperlane-cosmos/src/libs/binary.rs @@ -1,6 +1,6 @@ -use std::cmp; use hyperlane_core::{H256, H512}; +use std::cmp; pub fn h256_to_h512(v: H256) -> H512 { let mut result: [u8; 64] = [0; 64]; @@ -9,4 +9,4 @@ pub fn h256_to_h512(v: H256) -> H512 { result[start_point..32].copy_from_slice(vec); H512::from_slice(&result) -} \ No newline at end of file +} diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index b9a9172027..07d6e2e4be 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -1,4 +1,3 @@ -use std::collections::HashMap; use std::ops::RangeInclusive; use crate::binary::h256_to_h512; @@ -14,6 +13,8 @@ use tracing::debug; use crate::verify::{self, bech32_decode}; use crate::ConnectionConf; +const PAGINATION_LIMIT: u8 = 100; + #[async_trait] /// Trait for wasm indexer. Use rpc provider pub trait WasmIndexer: Send + Sync { @@ -98,39 +99,6 @@ impl WasmIndexer for CosmosWasmIndexer { let client = self.get_client()?; let contract_address = self.get_contract_addr()?; - let block_step: u32 = 100; - let mut block_hash_vec: Vec<(u64, H256)> = vec![]; - let block_query: Query = format!( - "block.height >= {} AND block.height <= {}", - range.start(), - range.end(), - ) - .parse() - .unwrap(); - let total_block_count = range.end() - range.start() + 1; - let last_block_page = - total_block_count / block_step + (total_block_count % block_step != 0) as u32; - - for _ in 1..=last_block_page { - let blocks = client - .block_search(block_query.clone(), 1, block_step as u8, Order::Ascending) - .await?; - - block_hash_vec.extend( - blocks - .blocks - .iter() - .map(|b| { - ( - b.block.header.height.value(), - H256::from_slice(b.block_id.hash.as_bytes()), - ) - }) - .collect::>(), - ); - } - let block_hash: HashMap = block_hash_vec.into_iter().collect(); - // Page starts from 1 let query = Query::default() .and_gte("tx.height", *range.start() as u64) @@ -143,15 +111,14 @@ impl WasmIndexer for CosmosWasmIndexer { debug!("Query: {:?}", query.to_string()); let tx_search_result = client - .tx_search(query.clone(), false, 1, 30, Order::Ascending) + .tx_search(query.clone(), false, 1, PAGINATION_LIMIT, Order::Ascending) .await?; let total_count = tx_search_result.total_count; - let last_page = total_count / 30 + (total_count % 30 != 0) as u32; + let last_page = total_count / PAGINATION_LIMIT as u32 + + (total_count % PAGINATION_LIMIT as u32 != 0) as u32; - let handler = |txs: Vec, - block_hashs: &HashMap| - -> Vec<(T, LogMeta)> { + let handler = |txs: Vec| -> Vec<(T, LogMeta)> { let mut result: Vec<(T, LogMeta)> = vec![]; let target_type = format!("{}-{}", Self::WASM_TYPE, self.event_type); @@ -172,7 +139,8 @@ impl WasmIndexer for CosmosWasmIndexer { let meta = LogMeta { address: bech32_decode(contract_address.clone()), block_number: tx.height.value(), - block_hash: block_hashs[&tx.height.value()], + // FIXME: block_hash is not available in tx_search + block_hash: H256::zero(), transaction_id: h256_to_h512(H256::from_slice(tx.hash.as_bytes())), transaction_index: tx.index as u64, log_index: U256::from(log_idx), @@ -189,16 +157,22 @@ impl WasmIndexer for CosmosWasmIndexer { result }; - let mut result = handler(tx_search_result.txs, &block_hash); + let mut result = handler(tx_search_result.txs); for page in 2..=last_page { debug!(page, "Making tx search RPC"); let tx_search_result = client - .tx_search(query.clone(), false, page, 30, Order::Ascending) + .tx_search( + query.clone(), + false, + page, + PAGINATION_LIMIT, + Order::Ascending, + ) .await?; - result.extend(handler(tx_search_result.txs, &block_hash)); + result.extend(handler(tx_search_result.txs)); } Ok(result) diff --git a/rust/hyperlane-core/src/types/checkpoint.rs b/rust/hyperlane-core/src/types/checkpoint.rs index 1348fc1b1b..1fbd387e81 100644 --- a/rust/hyperlane-core/src/types/checkpoint.rs +++ b/rust/hyperlane-core/src/types/checkpoint.rs @@ -45,7 +45,8 @@ impl Signable for CheckpointWithMessageId { .chain(self.index.to_be_bytes()) .chain(self.message_id) .finalize() - .as_slice()) + .as_slice(), + ) } } From 436c0d95b318951cb452d298dd09d3983a42a10a Mon Sep 17 00:00:00 2001 From: hashableric Date: Thu, 26 Oct 2023 18:01:16 +0900 Subject: [PATCH 089/142] feat: e2e enable --- rust/Cargo.lock | 6 +-- rust/Cargo.toml | 2 +- rust/agents/validator/src/validator.rs | 11 +---- .../hyperlane-cosmos/src/libs/binary.rs | 20 +++++++++- .../hyperlane-cosmos/src/multisig_ism.rs | 12 +++--- .../src/validator_announce.rs | 8 +++- .../src/db/rocks/hyperlane_db.rs | 1 - .../hyperlane-base/src/settings/parser/mod.rs | 18 +++++++-- rust/hyperlane-base/src/types/multisig.rs | 11 +---- rust/utils/run-locally/src/cosmos/deploy.rs | 10 ++--- rust/utils/run-locally/src/cosmos/link.rs | 40 +++++++++++++++---- rust/utils/run-locally/src/cosmos/mod.rs | 7 +++- 12 files changed, 93 insertions(+), 53 deletions(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index a1102a9cfd..7f78751648 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -3895,9 +3895,9 @@ dependencies = [ [[package]] name = "hpl-interface" -version = "0.0.6-rc1" +version = "0.0.6-rc5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91c7ac9f5da6c1a8ae58bd129c709d96122164d0f5f1788a7c0162d9dc1b69f3" +checksum = "81f9e9d265630ce019d87c1e2931be566d9be4d155b65e483e93e60704801a3d" dependencies = [ "bech32 0.9.1", "cosmwasm-schema", @@ -7045,7 +7045,7 @@ dependencies = [ "ctrlc", "eyre", "hex 0.4.3", - "hpl-interface 0.0.6-rc1", + "hpl-interface 0.0.6-rc5", "hyperlane-core", "k256 0.13.1", "macro_rules_attribute", diff --git a/rust/Cargo.toml b/rust/Cargo.toml index b97494c376..1dc68c4d05 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -177,7 +177,7 @@ hyper = "0.14" hyper-tls = "0.5.0" hex = "0.4.3" tendermint-rpc = { version = "0.32.0", features = ["http-client", "tokio"]} -hpl-interface = "0.0.6-rc1" +hpl-interface = "0.0.6-rc5" elliptic-curve = "0.12.3" ## TODO: remove this diff --git a/rust/agents/validator/src/validator.rs b/rust/agents/validator/src/validator.rs index 9111d08b35..98e39eb2c1 100644 --- a/rust/agents/validator/src/validator.rs +++ b/rust/agents/validator/src/validator.rs @@ -228,16 +228,7 @@ impl Validator { } async fn announce(&self) -> Result<()> { - let address = match self.raw_signer { - SignerConf::CosmosKey { key, prefix } => { - let addr = priv_to_addr_string(prefix.clone(), key.0.as_slice().to_vec())?; - info!("Announcing validator with Cosmos key: {}", addr); - - priv_to_binary_addr(key.0.as_slice().to_vec())? - } - SignerConf::HexKey { key } => priv_to_binary_addr(key.0.as_slice().to_vec())?, //self.signer.eth_address(), - _ => self.signer.eth_address(), - }; + let address = self.signer.eth_address(); // Sign and post the validator announcement let announcement = Announcement { diff --git a/rust/chains/hyperlane-cosmos/src/libs/binary.rs b/rust/chains/hyperlane-cosmos/src/libs/binary.rs index 8997d11ebd..a75ffaa342 100644 --- a/rust/chains/hyperlane-cosmos/src/libs/binary.rs +++ b/rust/chains/hyperlane-cosmos/src/libs/binary.rs @@ -1,7 +1,7 @@ -use hyperlane_core::{H256, H512}; - +use hyperlane_core::{H160, H256, H512}; use std::cmp; +/// Convert H256 to H512 pub fn h256_to_h512(v: H256) -> H512 { let mut result: [u8; 64] = [0; 64]; let vec = v.0.as_slice(); @@ -10,3 +10,19 @@ pub fn h256_to_h512(v: H256) -> H512 { H512::from_slice(&result) } + +/// Convert H256 to H160 +pub fn h256_to_h160(v: H256) -> H160 { + let mut result = [0u8; 20]; + + result.copy_from_slice(&v.0[12..]); + H160::from_slice(&result) +} + +/// Convert H160 to H256 +pub fn h160_to_h256(v: H160) -> H256 { + let mut result = [0u8; 32]; + result[12..].copy_from_slice(v.as_bytes()); + + H256::from_slice(&result) +} diff --git a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs index fedb5d7564..bb2abe0fb8 100644 --- a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs @@ -1,4 +1,7 @@ +use std::str::FromStr; + use crate::{ + binary::h160_to_h256, grpc::{WasmGrpcProvider, WasmProvider}, payloads::ism_routes::QueryIsmGeneralRequest, signers::Signer, @@ -7,13 +10,10 @@ use crate::{ use async_trait::async_trait; use hyperlane_core::{ ChainResult, ContractLocator, HyperlaneChain, HyperlaneContract, HyperlaneDomain, - HyperlaneMessage, HyperlaneProvider, MultisigIsm, RawHyperlaneMessage, H256, + HyperlaneMessage, HyperlaneProvider, MultisigIsm, RawHyperlaneMessage, H160, H256, }; -use crate::{ - payloads::multisig_ism::{self, VerifyInfoRequest, VerifyInfoRequestInner}, - verify::bech32_decode, -}; +use crate::payloads::multisig_ism::{self, VerifyInfoRequest, VerifyInfoRequestInner}; /// A reference to a MultisigIsm contract on some Cosmos chain #[derive(Debug)] @@ -78,7 +78,7 @@ impl MultisigIsm for CosmosMultisigIsm { let validators: Vec = response .validators .iter() - .map(|v| bech32_decode(v.clone())) + .map(|v| h160_to_h256(H160::from_str(v).unwrap())) .collect(); Ok((validators, response.threshold)) diff --git a/rust/chains/hyperlane-cosmos/src/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/validator_announce.rs index c3d15568a6..d8e14911dc 100644 --- a/rust/chains/hyperlane-cosmos/src/validator_announce.rs +++ b/rust/chains/hyperlane-cosmos/src/validator_announce.rs @@ -1,6 +1,5 @@ use async_trait::async_trait; -use base64::Engine; use cosmrs::proto::cosmos::base::abci::v1beta1::TxResponse; use hyperlane_core::{ Announcement, ChainResult, ContractLocator, HyperlaneChain, HyperlaneContract, HyperlaneDomain, @@ -8,6 +7,7 @@ use hyperlane_core::{ }; use crate::{ + binary::h256_to_h160, grpc::{WasmGrpcProvider, WasmProvider}, payloads::validator_announce::{ self, AnnouncementRequest, AnnouncementRequestInner, GetAnnounceStorageLocationsRequest, @@ -64,7 +64,11 @@ impl ValidatorAnnounce for CosmosValidatorAnnounce { &self, validators: &[H256], ) -> ChainResult>> { - let vss = validators.iter().map(hex::encode).collect::>(); + let vss = validators + .iter() + .map(|v| h256_to_h160(*v)) + .map(|v| v.to_string()) + .collect::>(); let payload = GetAnnounceStorageLocationsRequest { get_announce_storage_locations: GetAnnounceStorageLocationsRequestInner { diff --git a/rust/hyperlane-base/src/db/rocks/hyperlane_db.rs b/rust/hyperlane-base/src/db/rocks/hyperlane_db.rs index 09f87e5338..f01a12a166 100644 --- a/rust/hyperlane-base/src/db/rocks/hyperlane_db.rs +++ b/rust/hyperlane-base/src/db/rocks/hyperlane_db.rs @@ -143,7 +143,6 @@ impl HyperlaneRocksDB { return Ok(false); } - println!("process_tree_insertion: {:?}", insertion); // even if double insertions are ok, store the leaf by `leaf_index` (guaranteed to be unique) // rather than by `message_id` (not guaranteed to be recurring), so that leaves can be retrieved // based on insertion order. diff --git a/rust/hyperlane-base/src/settings/parser/mod.rs b/rust/hyperlane-base/src/settings/parser/mod.rs index 97032b59c3..7d96285c01 100644 --- a/rust/hyperlane-base/src/settings/parser/mod.rs +++ b/rust/hyperlane-base/src/settings/parser/mod.rs @@ -294,12 +294,22 @@ fn parse_chain( None }); - let canoncial_asset = chain + let canonical_asset = if let Some(asset) = chain .chain(&mut err) - .get_key("canonicalAsset") + .get_opt_key("canonicalAsset") .parse_string() .end() - .or_else(|| format!("u{}", prefix)); + { + Some(asset.to_string()) + } else if let Some(hrp) = prefix { + Some(format!("u{}", hrp)) + } else { + local_err.push( + &chain.cwp + "canonical_asset", + eyre!("Missing canonical asset for chain"), + ); + None + }; if !local_err.is_ok() { err.merge(local_err); @@ -310,7 +320,7 @@ fn parse_chain( rpcs.first().unwrap().to_string(), chain_id.unwrap().to_string(), prefix.unwrap().to_string(), - canoncial_asset.unwrap().to_string(), + canonical_asset.unwrap(), ))) } } diff --git a/rust/hyperlane-base/src/types/multisig.rs b/rust/hyperlane-base/src/types/multisig.rs index 14113de818..d1a9b71806 100644 --- a/rust/hyperlane-base/src/types/multisig.rs +++ b/rust/hyperlane-base/src/types/multisig.rs @@ -3,7 +3,6 @@ use std::sync::Arc; use derive_new::new; use eyre::Result; -use hyperlane_cosmos::verify::pub_to_binary_addr; use tracing::{debug, instrument, trace}; use hyperlane_core::{MultisigSignedCheckpoint, SignedCheckpointWithMessageId, H160, H256}; @@ -126,15 +125,7 @@ impl MultisigCheckpointSyncer { } // Ensure that the signature is actually by the validator - let domain = - KnownHyperlaneDomain::try_from(signed_checkpoint.value.mailbox_domain)?; - - let signer = match domain.domain_protocol() { - HyperlaneDomainProtocol::Cosmos => { - pub_to_binary_addr(signed_checkpoint.recover_pubkey()?.to_vec())? - } - _ => signed_checkpoint.recover()?, - }; + let signer = signed_checkpoint.recover()?; if H256::from(signer) != *validator { debug!( diff --git a/rust/utils/run-locally/src/cosmos/deploy.rs b/rust/utils/run-locally/src/cosmos/deploy.rs index 3bb7dd2d7e..dd38b811ec 100644 --- a/rust/utils/run-locally/src/cosmos/deploy.rs +++ b/rust/utils/run-locally/src/cosmos/deploy.rs @@ -12,7 +12,6 @@ use super::{ #[cw_serde] pub struct IsmMultisigInstantiateMsg { pub owner: String, - pub hrp: String, } #[cw_serde] @@ -25,6 +24,9 @@ pub struct IGPOracleInstantiateMsg { pub owner: String, } +#[cw_serde] +pub struct EmptyMsg {} + const PREFIX: &str = "osmo"; #[apply(as_task)] @@ -59,7 +61,6 @@ pub fn deploy_cw_hyperlane( igp::core::InstantiateMsg { owner: deployer_addr.clone(), gas_token: "uosmo".to_string(), - mailbox: mailbox.to_string(), beneficiary: deployer_addr.clone(), hrp: PREFIX.to_string(), }, @@ -98,7 +99,6 @@ pub fn deploy_cw_hyperlane( codes.hpl_ism_multisig, IsmMultisigInstantiateMsg { owner: deployer_addr.clone(), - hrp: PREFIX.to_string(), }, "hpl_ism_multisig", ); @@ -160,7 +160,7 @@ pub fn deploy_cw_hyperlane( &deployer, Some(deployer_addr), codes.hpl_test_mock_hook, - igp::oracle::InstantiateMsg {}, + EmptyMsg {}, "hpl_test_mock_hook", ); @@ -169,7 +169,7 @@ pub fn deploy_cw_hyperlane( &deployer, Some(deployer_addr), codes.hpl_test_mock_ism, - igp::oracle::InstantiateMsg {}, + EmptyMsg {}, "hpl_test_mock_ism", ); diff --git a/rust/utils/run-locally/src/cosmos/link.rs b/rust/utils/run-locally/src/cosmos/link.rs index 420e192759..46ec9186fc 100644 --- a/rust/utils/run-locally/src/cosmos/link.rs +++ b/rust/utils/run-locally/src/cosmos/link.rs @@ -1,9 +1,10 @@ +use ::core::panic; use std::path::Path; use cosmwasm_schema::cw_serde; use hpl_interface::{ - core, igp, - ism::{self, multisig}, + core, + ism::{self}, }; use super::{cli::OsmosisCLI, crypto::KeyPair, CosmosNetwork}; @@ -67,6 +68,22 @@ pub struct MockQuoteDispatch { pub message: String, } +#[cw_serde] +pub struct GeneralIsmValidatorMessage { + pub enroll_validator: EnrollValidatorMsg, +} + +#[cw_serde] +pub struct EnrollValidatorMsg { + pub set: EnrollValidatorSet, +} + +#[cw_serde] +pub struct EnrollValidatorSet { + pub domain: u32, + pub validator: String, +} + fn link_network( cli: &OsmosisCLI, network: &CosmosNetwork, @@ -87,15 +104,24 @@ fn link_network( // hook routing // link src chain + let public_key = validator.priv_key.verifying_key().to_encoded_point(false); + let public_key = public_key.as_bytes(); + + let hash = hpl_interface::types::keccak256_hash(&public_key[1..]); + + let mut bytes = [0u8; 20]; + bytes.copy_from_slice(&hash.as_slice()[12..]); + cli.wasm_execute( &network.launch_resp.endpoint, linker, &network.deployments.ism_multisig, - ism::multisig::ExecuteMsg::EnrollValidator { - set: ism::multisig::ValidatorSet { - domain: target_domain, - validator: validator_addr.clone(), - validator_pubkey: validator_pubkey.clone().into(), + GeneralIsmValidatorMessage { + enroll_validator: EnrollValidatorMsg { + set: EnrollValidatorSet { + domain: target_domain, + validator: hex::encode(bytes).to_string(), + }, }, }, vec![], diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index ca7d364b67..ec843a754c 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -140,7 +140,7 @@ pub fn install_cosmos( version: OSMOSIS_CLI_VERSION.to_string(), }) .install(cli_dir); - let codes = install_codes(codes_dir, false); + let codes = install_codes(codes_dir, true); (osmosisd, codes) } @@ -315,7 +315,10 @@ fn run_locally() { .unwrap_or_default(), ); - let (osmosisd, codes) = install_cosmos(None, cli_src, None, code_src); + let path_buf = + PathBuf::from("/Users/eric/many-things/mitosis/cw-hyperlane/artifacts/dist/wasm"); + + let (osmosisd, codes) = install_cosmos(None, cli_src, Some(path_buf), code_src); let addr_base = "tcp://0.0.0.0"; let default_config = CosmosConfig { cli_path: osmosisd.clone(), From e6baa8e209d7c5482f25b874c6d1e03dd95d8b9e Mon Sep 17 00:00:00 2001 From: hashableric Date: Thu, 26 Oct 2023 18:12:04 +0900 Subject: [PATCH 090/142] feat: match right hex format --- rust/chains/hyperlane-cosmos/src/validator_announce.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/chains/hyperlane-cosmos/src/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/validator_announce.rs index d8e14911dc..30dd06c98e 100644 --- a/rust/chains/hyperlane-cosmos/src/validator_announce.rs +++ b/rust/chains/hyperlane-cosmos/src/validator_announce.rs @@ -67,7 +67,7 @@ impl ValidatorAnnounce for CosmosValidatorAnnounce { let vss = validators .iter() .map(|v| h256_to_h160(*v)) - .map(|v| v.to_string()) + .map(|v| hex::encode(v.as_bytes())) .collect::>(); let payload = GetAnnounceStorageLocationsRequest { From f4c66408847088b5afd832b9a0244a462efeae75 Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Thu, 26 Oct 2023 09:55:56 +0000 Subject: [PATCH 091/142] temp remove configs --- rust/config/cosmos_config.json | 56 ------------------- .../test_deployer-account.json | 13 ----- .../test_deployer-keypair.json | 1 - rust/config/test_sealevel_config.json | 48 ---------------- rust/config/testnet_neutron_config.json | 32 +++++++++++ rust/neutron_validator_config.json | 13 +++++ 6 files changed, 45 insertions(+), 118 deletions(-) delete mode 100644 rust/config/cosmos_config.json delete mode 100644 rust/config/test-sealevel-keys/test_deployer-account.json delete mode 100644 rust/config/test-sealevel-keys/test_deployer-keypair.json delete mode 100644 rust/config/test_sealevel_config.json create mode 100644 rust/config/testnet_neutron_config.json create mode 100644 rust/neutron_validator_config.json diff --git a/rust/config/cosmos_config.json b/rust/config/cosmos_config.json deleted file mode 100644 index 965bd03264..0000000000 --- a/rust/config/cosmos_config.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "chains": { - "cosmostest1": { - "name": "cosmostest1", - "domain": 2660, - "addresses": { - "mailbox": "0xc6f76a4bd3b31f4307f11d019c0ad01f29c9140ca03b9e50fcc0e08b20d5bce1", - "interchainGasPaymaster": "0xfccb93acc5b25b40d5cc723e6a9a32284ed9a55646f48bf2970e237bf15c3be5", - "validatorAnnounce": "0xc387032a0e3bbb29327c824d40c9bf446e0f9aa99937c23e5b18c3938373915f" - }, - "protocol": "cosmos", - "finalityBlocks": 1, - "connection": { - "rpc_url": "https://rpc.osmotest5.osmosis.zone", - "grpc_url": "https://osmosis-testnet-grpc.polkachu.com:12590", - "chain_id": "osmo-test-5", - "prefix": "osmo" - }, - "signer": { - "type": "cosmosKey", - "key": "984e39bb0d8974432114adcfcbe99d5984e8ac052fa3bb6059f5a77a88ef9912", - "prefix": "osmo" - }, - "index": { - "from": 2208944, - "chunk": 10 - } - }, - "cosmostest2": { - "name": "cosmostest2", - "domain": 21295, - "addresses": { - "mailbox": "0xc6f76a4bd3b31f4307f11d019c0ad01f29c9140ca03b9e50fcc0e08b20d5bce1", - "interchainGasPaymaster": "0xfccb93acc5b25b40d5cc723e6a9a32284ed9a55646f48bf2970e237bf15c3be5", - "validatorAnnounce": "0xc387032a0e3bbb29327c824d40c9bf446e0f9aa99937c23e5b18c3938373915f" - }, - "protocol": "cosmos", - "finalityBlocks": 1, - "connection": { - "rpc_url": "https://rpc.osmotest5.osmosis.zone", - "grpc_url": "https://osmosis-testnet-grpc.polkachu.com:12590", - "chain_id": "osmo-test-5", - "prefix": "osmo" - }, - "signer": { - "type": "cosmosKey", - "key": "984e39bb0d8974432114adcfcbe99d5984e8ac052fa3bb6059f5a77a88ef9912", - "prefix": "osmo" - }, - "index": { - "from": 2208944, - "chunk": 10 - } - } - } -} diff --git a/rust/config/test-sealevel-keys/test_deployer-account.json b/rust/config/test-sealevel-keys/test_deployer-account.json deleted file mode 100644 index 1541f52385..0000000000 --- a/rust/config/test-sealevel-keys/test_deployer-account.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "pubkey": "E9VrvAdGRvCguN2XgXsgu9PNmMM3vZsU8LSUrM68j8ty", - "account": { - "lamports": 500000000000000000, - "data": [ - "", - "base64" - ], - "owner": "11111111111111111111111111111111", - "executable": false, - "rentEpoch": 0 - } -} \ No newline at end of file diff --git a/rust/config/test-sealevel-keys/test_deployer-keypair.json b/rust/config/test-sealevel-keys/test_deployer-keypair.json deleted file mode 100644 index 36e1ec6786..0000000000 --- a/rust/config/test-sealevel-keys/test_deployer-keypair.json +++ /dev/null @@ -1 +0,0 @@ -[137,43,246,148,154,244,35,62,98,248,84,203,54,24,188,26,62,227,52,29,199,26,218,8,196,213,222,202,35,154,207,79,195,85,53,151,7,182,83,94,59,5,131,252,40,75,87,11,243,118,71,59,195,222,212,148,179,233,253,121,97,210,114,98] \ No newline at end of file diff --git a/rust/config/test_sealevel_config.json b/rust/config/test_sealevel_config.json deleted file mode 100644 index 5c127dcc3d..0000000000 --- a/rust/config/test_sealevel_config.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "chains": { - "sealeveltest1": { - "name": "sealeveltest1", - "chainId": 13375, - "domainId": 13375, - "mailbox": "692KZJaoe2KRcD6uhCQDLLXnLNA5ZLnfvdqjE4aX9iu1", - "interchainGasPaymaster": "DrFtxirPPsfdY4HQiNZj2A9o4Ux7JaL3gELANgAoihhp", - "validatorAnnounce": "DH43ae1LwemXAboWwSh8zc9pG8j72gKUEXNi57w8fEnn", - "protocol": "sealevel", - "blocks": { - "reorgPeriod": 0, - "confirmations": 0 - }, - "rpcUrls": [ - { - "http": "http://localhost:8899" - } - ], - "index": { - "from": 1, - "mode": "sequence" - } - }, - "sealeveltest2": { - "name": "sealeveltest2", - "chainId": 13376, - "domainId": 13376, - "mailbox": "9tCUWNjpqcf3NUSrtp7vquYVCwbEByvLjZUrhG5dgvhj", - "interchainGasPaymaster": "G5rGigZBL8NmxCaukK2CAKr9Jq4SUfAhsjzeri7GUraK", - "validatorAnnounce": "3Uo5j2Bti9aZtrDqJmAyuwiFaJFPFoNL5yxTpVCNcUhb", - "protocol": "sealevel", - "blocks": { - "reorgPeriod": 0, - "confirmations": 0 - }, - "rpcUrls": [ - { - "http": "http://localhost:8899" - } - ], - "index": { - "from": 1, - "mode": "sequence" - } - } - } -} diff --git a/rust/config/testnet_neutron_config.json b/rust/config/testnet_neutron_config.json new file mode 100644 index 0000000000..f53c45cbef --- /dev/null +++ b/rust/config/testnet_neutron_config.json @@ -0,0 +1,32 @@ +{ + "chains": { + "neutrontestnet": { + "name": "neutrontestnet", + "domainId": "33333", + "chainId": "duality-devnet", + "mailbox": "0xe9bf873ddcf065cd10fb6c060a8d6ff3ad7b2e6d7cdc77b93355781b4c6ea380", + "interchainGasPaymaster": "0xf1b66d6a2023c6f6d474a11255078fd2003e8ac0a30cbd5eb65c27afe1c30b38", + "validatorAnnounce": "0x3780ebcee9dadae3aebf7845d27d6cbdde30147f20e9fe264afcf476d70ba93b", + "merkleTreeHook": "0xa07bb16f1a99aff63a2c4a6a51d214a60e80c8f24cbd7ba4369ff836a31c9697", + "protocol": "cosmos", + "finalityBlocks": 1, + "rpcUrls": [ + { + "http": "http://54.149.31.83:26657" + } + ], + "grpcUrl": "http://52.43.22.152:9090", + "canonicalAsset": "token", + "prefix": "dual", + "signer": { + "signerType": "cosmosKey", + "key": "0xac30d9f8ba63095774e7c853e23b02768031aa5076576113bbc9f4f07f4d12c5", + "prefix": "dual" + }, + "index": { + "from": 1, + "chunk": 1000 + } + } + } +} diff --git a/rust/neutron_validator_config.json b/rust/neutron_validator_config.json new file mode 100644 index 0000000000..2e81af44ec --- /dev/null +++ b/rust/neutron_validator_config.json @@ -0,0 +1,13 @@ +{ + "db": "./neutron_validator_sigs", + "checkpointSyncer": { + "type": "localStorage", + "path": "./neutron_validator_sigs" + }, + "originChainName": "neutrontestnet", + "validator": { + "signerType": "cosmosKey", + "key": "0xac30d9f8ba63095774e7c853e23b02768031aa5076576113bbc9f4f07f4d12c5", + "prefix": "dual" + } +} From 88f836e0a47ab376a8a06e25fc0e24566d3c02f9 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Mon, 23 Oct 2023 14:51:29 +0100 Subject: [PATCH 092/142] wip: run validator on duality-testnet --- .gitignore | 2 ++ rust/chains/hyperlane-cosmos/src/payloads/general.rs | 3 ++- rust/chains/hyperlane-cosmos/src/providers/grpc.rs | 7 +++++-- rust/chains/hyperlane-cosmos/src/providers/rpc.rs | 8 +++++++- rust/utils/run-locally/src/cosmos/source.rs | 6 +++--- rust/utils/run-locally/src/cosmos/types.rs | 10 +++++----- rust/utils/run-locally/src/cosmos/utils.rs | 10 +++++++++- 7 files changed, 33 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index f9892417af..ae874f9953 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,5 @@ yarn-error.log .vscode tsconfig.editor.json + +rust/neutron_validator_sigs \ No newline at end of file diff --git a/rust/chains/hyperlane-cosmos/src/payloads/general.rs b/rust/chains/hyperlane-cosmos/src/payloads/general.rs index 89d970a637..9f75182d93 100644 --- a/rust/chains/hyperlane-cosmos/src/payloads/general.rs +++ b/rust/chains/hyperlane-cosmos/src/payloads/general.rs @@ -4,7 +4,8 @@ use serde::{Deserialize, Serialize}; pub struct EmptyStruct {} #[derive(Serialize, Deserialize, Debug, Clone)] -pub struct Events { +pub struct Log { + pub msg_index: u64, pub events: Vec, } diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index 7006c03f85..2f3c8f0843 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -18,6 +18,7 @@ use cosmrs::proto::cosmwasm::wasm::v1::{ }; use cosmrs::proto::traits::Message; +use cosmrs::tendermint::chain; use cosmrs::tx::{self, Fee, MessageExt, SignDoc, SignerInfo}; use cosmrs::{Amount, Coin}; use hyperlane_core::{ @@ -236,7 +237,9 @@ impl WasmProvider for WasmGrpcProvider { let private_key = SigningKey::from_slice(&self.signer.private_key).unwrap(); let public_key = private_key.public_key(); - let tx_body = tx::Body::new(msgs, "", 900u16); + let tx_body = tx::Body::new(msgs, "", 9000000u32); + println!("account info: {:?}", account_info); + println!("network: {:?}", self.conf.get_chain_id().parse::().unwrap()); let signer_info = SignerInfo::single_direct(Some(public_key), account_info.sequence); let gas_limit: u64 = gas_limit @@ -283,7 +286,7 @@ impl WasmProvider for WasmGrpcProvider { let tx_req = BroadcastTxRequest { tx_bytes: self.generate_raw_tx(msgs, gas_limit).await?, - mode: BroadcastMode::Block as i32, + mode: BroadcastMode::Sync as i32, }; let tx_res = client diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index 07d6e2e4be..4efb984db0 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -1,6 +1,10 @@ use std::ops::RangeInclusive; use crate::binary::h256_to_h512; +<<<<<<< HEAD +======= +use crate::payloads::general::{EventAttribute, Log}; +>>>>>>> 495408873 (wip: run validator on duality-testnet) use async_trait::async_trait; use cosmrs::rpc::client::{Client, CompatMode, HttpClient}; use cosmrs::rpc::endpoint::tx; @@ -77,7 +81,9 @@ impl CosmosWasmIndexer { impl WasmIndexer for CosmosWasmIndexer { fn get_client(&self) -> ChainResult { Ok(HttpClient::builder(self.get_conn_url()?.parse()?) - .compat_mode(CompatMode::V0_34) + // indexing fails unless this is commented out. I assume the decoding in `CompatMode::V0_34` + // is incompatible with the current data format. + // .compat_mode(CompatMode::V0_34) .build()?) } diff --git a/rust/utils/run-locally/src/cosmos/source.rs b/rust/utils/run-locally/src/cosmos/source.rs index e883764bf0..53b80849fc 100644 --- a/rust/utils/run-locally/src/cosmos/source.rs +++ b/rust/utils/run-locally/src/cosmos/source.rs @@ -5,7 +5,7 @@ use tempfile::tempdir; use crate::{ cosmos::{ make_target, - utils::{download, unzip}, + utils::{download, untar}, }, logging::log, utils::concat_path, @@ -72,7 +72,7 @@ impl CodeSource { download(&release_comp, &uri, dir_path); log!("Uncompressing cw-hyperlane release"); - unzip(&release_comp, dir_path); + untar(&release_comp, dir_path); // make contract_name => path map fs::read_dir(concat_path(dir_path, release_name)) @@ -138,7 +138,7 @@ impl CLISource { download(&release_comp, &uri, dir_path); log!("Uncompressing Osmosis release"); - unzip(&release_comp, dir_path); + untar(&release_comp, dir_path); concat_path(dir_path, "osmosisd") } diff --git a/rust/utils/run-locally/src/cosmos/types.rs b/rust/utils/run-locally/src/cosmos/types.rs index ac24c88b57..08cc30d7c4 100644 --- a/rust/utils/run-locally/src/cosmos/types.rs +++ b/rust/utils/run-locally/src/cosmos/types.rs @@ -89,7 +89,7 @@ pub struct AgentConfigAddrs { pub validator_announce: String, } -#[derive(serde::Serialize, serde::Deserialize, Clone)] +#[derive(serde::Serialize, serde::Deserialize, Clone, Debug)] pub struct AgentConfigSigner { #[serde(rename = "signerType")] pub typ: String, @@ -97,18 +97,18 @@ pub struct AgentConfigSigner { pub prefix: String, } -#[derive(serde::Serialize, serde::Deserialize, Clone)] +#[derive(serde::Serialize, serde::Deserialize, Clone, Debug)] pub struct AgentConfigIndex { pub from: u32, pub chunk: u32, } -#[derive(serde::Serialize, serde::Deserialize, Clone)] +#[derive(serde::Serialize, serde::Deserialize, Clone, Debug)] pub struct AgentUrl { pub http: String, } -#[derive(serde::Serialize, serde::Deserialize, Clone)] +#[derive(serde::Serialize, serde::Deserialize, Clone, Debug)] #[serde(rename_all = "camelCase")] pub struct AgentConfig { pub name: String, @@ -127,7 +127,7 @@ pub struct AgentConfig { pub index: AgentConfigIndex, } -#[derive(serde::Serialize, serde::Deserialize, Clone)] +#[derive(serde::Serialize, serde::Deserialize, Clone, Debug)] pub struct AgentConfigOut { pub chains: BTreeMap, } diff --git a/rust/utils/run-locally/src/cosmos/utils.rs b/rust/utils/run-locally/src/cosmos/utils.rs index e2e4687d97..c6cc7b5cca 100644 --- a/rust/utils/run-locally/src/cosmos/utils.rs +++ b/rust/utils/run-locally/src/cosmos/utils.rs @@ -15,7 +15,7 @@ pub(crate) fn sed(from: &str, to: &str, file: &str) { .join(); } -pub(crate) fn unzip(output: &str, dir: &str) { +pub(crate) fn untar(output: &str, dir: &str) { Program::new("tar") .flag("extract") .arg("file", output) @@ -24,6 +24,14 @@ pub(crate) fn unzip(output: &str, dir: &str) { .join(); } +pub(crate) fn unzip(output: &str, dir: &str) { + Program::new("unzip") + .cmd(output) + .working_dir(dir) + .run() + .join(); +} + pub(crate) fn download(output: &str, uri: &str, dir: &str) { Program::new("curl") .arg("output", output) From 15fc6f3efa777d7aeef3b10b001d7cc3621978b8 Mon Sep 17 00:00:00 2001 From: hashableric Date: Mon, 23 Oct 2023 23:39:28 +0900 Subject: [PATCH 093/142] fix: change chainId variable into correct value --- rust/chains/hyperlane-cosmos/src/providers/grpc.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index 2f3c8f0843..8451cfb41a 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -238,8 +238,6 @@ impl WasmProvider for WasmGrpcProvider { let public_key = private_key.public_key(); let tx_body = tx::Body::new(msgs, "", 9000000u32); - println!("account info: {:?}", account_info); - println!("network: {:?}", self.conf.get_chain_id().parse::().unwrap()); let signer_info = SignerInfo::single_direct(Some(public_key), account_info.sequence); let gas_limit: u64 = gas_limit From ab75c3d916b587da3202168485d6ce6386357aa1 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Mon, 23 Oct 2023 23:43:55 +0100 Subject: [PATCH 094/142] fix: event parsing --- rust/chains/hyperlane-cosmos/src/interchain_gas.rs | 3 ++- rust/chains/hyperlane-cosmos/src/mailbox.rs | 3 ++- rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index de2757eea5..f4dd1b6f65 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -82,7 +82,8 @@ impl CosmosInterchainGasPaymasterIndexer { for attr in attrs { let key = attr.key.as_str(); - let value = attr.value.as_str(); + let value = attr.value?; + let value = value.as_str(); match key { "message_id" => { diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index eaf2c1ff32..62fc07c831 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -253,7 +253,8 @@ impl CosmosMailboxIndexer { for attr in attrs { let key = attr.key.as_str(); - let value = attr.value.as_str(); + let value = attr.value?; + let value = value.as_str(); if key == "message" { let mut reader = Cursor::new(hex::decode(value).unwrap()); diff --git a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs index 1d8eab198d..7ff1082a7a 100644 --- a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs +++ b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -178,7 +178,8 @@ impl CosmosMerkleeTreeHookIndexer { for attr in attrs { let key = attr.key.as_str(); - let value = attr.value.as_str(); + let value = attr.value?; + let value = value.as_str(); match key { "message_id" => { From 797a6aedfd33904c3bdb4087a0d87d6effedc095 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Tue, 24 Oct 2023 11:13:24 +0100 Subject: [PATCH 095/142] include rpc diff in fix --- rust/chains/hyperlane-cosmos/src/providers/rpc.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index 4efb984db0..4376e7a5a6 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -6,11 +6,17 @@ use crate::binary::h256_to_h512; use crate::payloads::general::{EventAttribute, Log}; >>>>>>> 495408873 (wip: run validator on duality-testnet) use async_trait::async_trait; +<<<<<<< HEAD use cosmrs::rpc::client::{Client, CompatMode, HttpClient}; use cosmrs::rpc::endpoint::tx; use cosmrs::rpc::query::Query; use cosmrs::rpc::Order; use cosmrs::tendermint::abci::EventAttribute; +======= +use cosmrs::rpc::client::{Client, HttpClient}; +use cosmrs::tendermint::hash::Algorithm; +use cosmrs::tendermint::Hash; +>>>>>>> 58b3d462d (include rpc diff in fix) use hyperlane_core::{ChainResult, ContractLocator, HyperlaneDomain, LogMeta, H256, U256}; use tracing::debug; From e646482b0ba41685b4168af6b9c910d4c1343275 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Tue, 24 Oct 2023 23:15:33 +0100 Subject: [PATCH 096/142] merge part 2 --- rust/chains/hyperlane-cosmos/src/interchain_gas.rs | 2 +- rust/chains/hyperlane-cosmos/src/mailbox.rs | 2 +- rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index f4dd1b6f65..6556e9a6f5 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -82,7 +82,7 @@ impl CosmosInterchainGasPaymasterIndexer { for attr in attrs { let key = attr.key.as_str(); - let value = attr.value?; + let value = attr.value; let value = value.as_str(); match key { diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 62fc07c831..203f263eb0 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -253,7 +253,7 @@ impl CosmosMailboxIndexer { for attr in attrs { let key = attr.key.as_str(); - let value = attr.value?; + let value = attr.value; let value = value.as_str(); if key == "message" { diff --git a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs index 7ff1082a7a..bcc8693ee3 100644 --- a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs +++ b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -178,7 +178,7 @@ impl CosmosMerkleeTreeHookIndexer { for attr in attrs { let key = attr.key.as_str(); - let value = attr.value?; + let value = attr.value; let value = value.as_str(); match key { From 836e4a6b8e76a006d8e443130d151f881d3a1518 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Wed, 25 Oct 2023 00:52:18 +0100 Subject: [PATCH 097/142] gitignore relayer db --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ae874f9953..175e312900 100644 --- a/.gitignore +++ b/.gitignore @@ -30,4 +30,5 @@ yarn-error.log tsconfig.editor.json -rust/neutron_validator_sigs \ No newline at end of file +rust/neutron_validator_sigs +rust/relayer_db \ No newline at end of file From 5bd658b7a96f0372e1bb9b7ba5c57bccb6fa9d56 Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Thu, 26 Oct 2023 19:11:25 +0900 Subject: [PATCH 098/142] update config --- rust/config/testnet_neutron_config.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rust/config/testnet_neutron_config.json b/rust/config/testnet_neutron_config.json index f53c45cbef..18c5bffde3 100644 --- a/rust/config/testnet_neutron_config.json +++ b/rust/config/testnet_neutron_config.json @@ -4,10 +4,10 @@ "name": "neutrontestnet", "domainId": "33333", "chainId": "duality-devnet", - "mailbox": "0xe9bf873ddcf065cd10fb6c060a8d6ff3ad7b2e6d7cdc77b93355781b4c6ea380", - "interchainGasPaymaster": "0xf1b66d6a2023c6f6d474a11255078fd2003e8ac0a30cbd5eb65c27afe1c30b38", - "validatorAnnounce": "0x3780ebcee9dadae3aebf7845d27d6cbdde30147f20e9fe264afcf476d70ba93b", - "merkleTreeHook": "0xa07bb16f1a99aff63a2c4a6a51d214a60e80c8f24cbd7ba4369ff836a31c9697", + "mailbox": "0xdb33c78ca39541dd740659fbfd86fdd601fe7225f10f26e87595c5b8df6bdcda", + "interchainGasPaymaster": "0xae38a168ced2b1cdafd7da5de2fbd22749b1ab52e88cd0b121f750a6c20a2814", + "validatorAnnounce": "0x29d5f702a35d4135d98abf52c62ddc0cfd74001663ec14d284edff7d0419fb58", + "merkleTreeHook": "0xb6aac0c4650129ded8e645e6ef8dcbba710623b826e5a1dae34158a27247c668", "protocol": "cosmos", "finalityBlocks": 1, "rpcUrls": [ From 4074069785845a1d3017ddb4ec19906a4764214f Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Thu, 26 Oct 2023 19:31:00 +0900 Subject: [PATCH 099/142] relayer --- rust/config/testnet_config.json | 18 ++++++++++++ rust/neutron_relayer_config.json | 50 ++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 rust/config/testnet_config.json create mode 100644 rust/neutron_relayer_config.json diff --git a/rust/config/testnet_config.json b/rust/config/testnet_config.json new file mode 100644 index 0000000000..df2a4d0f1d --- /dev/null +++ b/rust/config/testnet_config.json @@ -0,0 +1,18 @@ +{ + "chains": { + "goerli": { + "name": "goerli", + "domain": 5, + "addresses": { + "mailbox": "0xCC737a94FecaeC165AbCf12dED095BB13F037685", + "interchainGasPaymaster": "0x8f9C3888bFC8a5B25AED115A82eCbb788b196d2a", + "validatorAnnounce": "0x3Fc742696D5dc9846e04f7A1823D92cb51695f9a" + }, + "protocol": "ethereum", + "finalityBlocks": 2, + "index": { + "from": 8039005 + } + } + } +} diff --git a/rust/neutron_relayer_config.json b/rust/neutron_relayer_config.json new file mode 100644 index 0000000000..7ec584b77e --- /dev/null +++ b/rust/neutron_relayer_config.json @@ -0,0 +1,50 @@ +{ + "relayChains": "neutrontestnet,goerli", + "chains": { + "neutrontestnet": { + "customUrl": "http://54.149.31.83:26657", + "signerType": "cosmosKey", + "key": "0xac30d9f8ba63095774e7c853e23b02768031aa5076576113bbc9f4f07f4d12c5", + "prefix": "dual" + }, + "goerli": { + "name": "goerli", + "chainId": 5, + + "mailbox": "0xCC737a94FecaeC165AbCf12dED095BB13F037685", + "interchainGasPaymaster": "0x8f9C3888bFC8a5B25AED115A82eCbb788b196d2a", + "validatorAnnounce": "0x3Fc742696D5dc9846e04f7A1823D92cb51695f9a", + + "rpcUrls": [ + { + "http": "https://goerli.infura.io/v3/87fb6a437dd846aea1eaa2e0362e8541" + }, + { + "http": "https://nd-604-431-130.p2pify.com/b3cd56f4836e63c4acb1ea497fd34bab,https://rpc.ankr.com/eth_goerli" + } + ], + "customRpcUrls": "https://goerli.infura.io/v3/87fb6a437dd846aea1eaa2e0362e8541,https://nd-604-431-130.p2pify.com/b3cd56f4836e63c4acb1ea497fd34bab,https://rpc.ankr.com/eth_goerli", + + "rpcConsensusType": "fallback", + "signerId": "alias/hyperlane-testnet4-key-relayer", + "signerType": "aws", + "signerRegion": "us-east-1" + } + }, + "gasPaymentEnforcement": [ + { + "type": "none" + } + ], + "defaultsigner": { + "type": "hexKey", + "key": "0xac30d9f8ba63095774e7c853e23b02768031aa5076576113bbc9f4f07f4d12c5" + }, + "allowLocalCheckpointSyncers": "true", + "checkpointsyncer": { + "type": "localStorage", + "path": "./neutron_validator_sigs" + }, + "metricsPort": 9091, + "db": "./relayer_db" +} From be24d62e52e115737b76d4e92330021c5463e584 Mon Sep 17 00:00:00 2001 From: byeongsu-hong Date: Thu, 26 Oct 2023 20:02:57 +0900 Subject: [PATCH 100/142] bump v3 config --- rust/config/testnet_config.json | 56 +++++++++++++++++++++++++++----- rust/neutron_relayer_config.json | 16 +-------- 2 files changed, 49 insertions(+), 23 deletions(-) diff --git a/rust/config/testnet_config.json b/rust/config/testnet_config.json index df2a4d0f1d..ca02ba7fe9 100644 --- a/rust/config/testnet_config.json +++ b/rust/config/testnet_config.json @@ -1,17 +1,57 @@ { "chains": { "goerli": { + "chainId": 5, + "domainId": 5, "name": "goerli", - "domain": 5, - "addresses": { - "mailbox": "0xCC737a94FecaeC165AbCf12dED095BB13F037685", - "interchainGasPaymaster": "0x8f9C3888bFC8a5B25AED115A82eCbb788b196d2a", - "validatorAnnounce": "0x3Fc742696D5dc9846e04f7A1823D92cb51695f9a" - }, "protocol": "ethereum", - "finalityBlocks": 2, + "displayName": "Goerli", + "nativeToken": { + "name": "Ether", + "symbol": "ETH", + "decimals": 18 + }, + "rpcUrls": [ + { + "http": "https://goerli.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161" + }, + { + "http": "https://rpc.ankr.com/eth_goerli" + }, + { + "http": "https://eth-goerli.public.blastapi.io" + } + ], + "blockExplorers": [ + { + "name": "Etherscan", + "url": "https://goerli.etherscan.io", + "apiUrl": "https://api-goerli.etherscan.io/api", + "family": "etherscan" + } + ], + "blocks": { + "confirmations": 1, + "reorgPeriod": 2, + "estimateBlockTime": 13 + }, + "isTestnet": true, + "merkleRootMultisigIsmFactory": "0x8e43aCfb338B137A3befd9b92BfD84E128adE0B8", + "messageIdMultisigIsmFactory": "0xDdB54502A8e2a31C48148C62A8a9E83a693d6173", + "aggregationIsmFactory": "0x8a176773d54292123d271FA0B9C7C8Def4c3a31b", + "aggregationHookFactory": "0x6bc243963f80AEa80948e8538bB114d4122DD9c5", + "routingIsmFactory": "0xd16c3f34d6A2e62185aC61f76F83D3AA1E969018", + "proxyAdmin": "0x0EdB3604D230963ecE9d83963164CFe2fDef576B", + "defaultIsm": "0x8BbdB0023ef47992b3E83E2B1B290D72A7477EfE", + "storageGasOracle": "0xeC34c715ee6d050b2172E8aF650Db779561266C1", + "interchainGasPaymaster": "0x0cD26594ea6c6526927C0F5225AC09F6288e7140", + "aggregationHook": "0x2dF77b3efe9B8f9aEDf7bFC86f40B048178d8116", + "protocolFee": "0x9293B8dAcA7933765de499C992B0Fa86Bb104b0f", + "merkleTreeHook": "0x28c294C61D3dE053462d2Cfa5d5f8c8D70605A59", + "mailbox": "0x49cfd6Ef774AcAb14814D699e3F7eE36Fdfba932", + "validatorAnnounce": "0x3c182AD9cA8A71bc107Ef440C2667E8360e1158E", "index": { - "from": 8039005 + "from": 9816044 } } } diff --git a/rust/neutron_relayer_config.json b/rust/neutron_relayer_config.json index 7ec584b77e..2284a9f4fb 100644 --- a/rust/neutron_relayer_config.json +++ b/rust/neutron_relayer_config.json @@ -8,24 +8,10 @@ "prefix": "dual" }, "goerli": { - "name": "goerli", - "chainId": 5, - - "mailbox": "0xCC737a94FecaeC165AbCf12dED095BB13F037685", - "interchainGasPaymaster": "0x8f9C3888bFC8a5B25AED115A82eCbb788b196d2a", - "validatorAnnounce": "0x3Fc742696D5dc9846e04f7A1823D92cb51695f9a", - - "rpcUrls": [ - { - "http": "https://goerli.infura.io/v3/87fb6a437dd846aea1eaa2e0362e8541" - }, - { - "http": "https://nd-604-431-130.p2pify.com/b3cd56f4836e63c4acb1ea497fd34bab,https://rpc.ankr.com/eth_goerli" - } - ], "customRpcUrls": "https://goerli.infura.io/v3/87fb6a437dd846aea1eaa2e0362e8541,https://nd-604-431-130.p2pify.com/b3cd56f4836e63c4acb1ea497fd34bab,https://rpc.ankr.com/eth_goerli", "rpcConsensusType": "fallback", + "signerId": "alias/hyperlane-testnet4-key-relayer", "signerType": "aws", "signerRegion": "us-east-1" From 2adc53eddc7d61322f8003bfcd08c560d2f6938f Mon Sep 17 00:00:00 2001 From: Nam Chu Hoai Date: Fri, 27 Oct 2023 22:38:53 -0400 Subject: [PATCH 101/142] Add Manta/Neutron config --- rust/config/testnet_neutron_config.json | 48 +++++++++++++++++++++++++ rust/neutron_relayer_config.json | 8 +---- rust/neutron_validator_config.json | 4 +-- 3 files changed, 51 insertions(+), 9 deletions(-) diff --git a/rust/config/testnet_neutron_config.json b/rust/config/testnet_neutron_config.json index 18c5bffde3..fb9b2c2140 100644 --- a/rust/config/testnet_neutron_config.json +++ b/rust/config/testnet_neutron_config.json @@ -27,6 +27,54 @@ "from": 1, "chunk": 1000 } + }, + "mantapacific": { + "name": "mantapacific", + "chainId": 169, + "domainId": 169, + "mailbox": "0x0A7F6aa5E928B53A3dfF154F26Fe0E883e4caC8D", + "interchainGasPaymaster": "0x1F86c5BB07384563816dE6D3246f306e4172FD8E", + "merkleTreeHook": "0xC569fe1C671A26A2Ecd775d931b63a6635Aa6081", + "validatorAnnounce": "0xaA318551A1B5C89dfC9544d8eFD8e584a88cf925", + "protocol": "ethereum", + "finalityBlocks": 1, + "rpcUrls": [ + { + "http": "https://pacific-rpc.manta.network/http" + } + ], + "index": { + "from": 400000, + "chunk": 5000 + } + }, + "neutron": { + "name": "neutron", + "domainId": "1853125230", + "chainId": "neutron-1", + "mailbox": "0xe735d1ad5ee30305c761a4699372722958f0e75f9520f3f4a84d6f5c8c97990b", + "interchainGasPaymaster": "0x809c8b1cee2ef86e94162a4254e9c8fed0868feccc173e9a296cc84d0f1a6b5f", + "validatorAnnounce": "0x932666c15f2316c491ad2437d971a18cdd25366a9d3b10efdc3b52cd66126fea", + "merkleTreeHook": "0xef2f5da7b32852be4d65fcbac90d970dd877a5350c99303749e4dc29c6006bd9", + "protocol": "cosmos", + "finalityBlocks": 1, + "rpcUrls": [ + { + "http": "https://rpc-kralum.neutron-1.neutron.org" + } + ], + "grpcUrl": "https://grpc-kralum.neutron-1.neutron.org:80", + "canonicalAsset": "untrn", + "prefix": "neutron", + "signer": { + "signerType": "cosmosKey", + "key": "0xac30d9f8ba63095774e7c853e23b02768031aa5076576113bbc9f4f07f4d12c5", + "prefix": "neutron" + }, + "index": { + "from": 4200000, + "chunk": 100000 + } } } } diff --git a/rust/neutron_relayer_config.json b/rust/neutron_relayer_config.json index 2284a9f4fb..b4fe55f616 100644 --- a/rust/neutron_relayer_config.json +++ b/rust/neutron_relayer_config.json @@ -1,12 +1,6 @@ { - "relayChains": "neutrontestnet,goerli", + "relayChains": "neutron,mantapacific", "chains": { - "neutrontestnet": { - "customUrl": "http://54.149.31.83:26657", - "signerType": "cosmosKey", - "key": "0xac30d9f8ba63095774e7c853e23b02768031aa5076576113bbc9f4f07f4d12c5", - "prefix": "dual" - }, "goerli": { "customRpcUrls": "https://goerli.infura.io/v3/87fb6a437dd846aea1eaa2e0362e8541,https://nd-604-431-130.p2pify.com/b3cd56f4836e63c4acb1ea497fd34bab,https://rpc.ankr.com/eth_goerli", diff --git a/rust/neutron_validator_config.json b/rust/neutron_validator_config.json index 2e81af44ec..58e3ada6ce 100644 --- a/rust/neutron_validator_config.json +++ b/rust/neutron_validator_config.json @@ -4,10 +4,10 @@ "type": "localStorage", "path": "./neutron_validator_sigs" }, - "originChainName": "neutrontestnet", + "originChainName": "neutron", "validator": { "signerType": "cosmosKey", "key": "0xac30d9f8ba63095774e7c853e23b02768031aa5076576113bbc9f4f07f4d12c5", - "prefix": "dual" + "prefix": "neutron" } } From 3c882da1601a8fdf375a509fb997ffd9aee56425 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Thu, 26 Oct 2023 16:32:03 +0100 Subject: [PATCH 102/142] A little bit of cleanup to get announcement not panicking --- rust/Cargo.lock | 1 + rust/agents/validator/src/validator.rs | 31 ++++--- .../hyperlane-cosmos/src/providers/grpc.rs | 84 +++++++++++-------- .../src/validator_announce.rs | 9 +- rust/hyperlane-base/Cargo.toml | 1 + rust/hyperlane-base/src/settings/chains.rs | 21 ++++- rust/hyperlane-base/src/settings/signers.rs | 41 +++++++-- rust/hyperlane-core/src/error.rs | 4 + 8 files changed, 135 insertions(+), 57 deletions(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 7f78751648..b4a3125bc0 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -4089,6 +4089,7 @@ dependencies = [ "rusoto_sts", "serde", "serde_json", + "solana-sdk", "static_assertions", "tempfile", "thiserror", diff --git a/rust/agents/validator/src/validator.rs b/rust/agents/validator/src/validator.rs index 98e39eb2c1..8bfc3bc503 100644 --- a/rust/agents/validator/src/validator.rs +++ b/rust/agents/validator/src/validator.rs @@ -209,7 +209,12 @@ impl Validator { fn log_on_announce_failure(result: ChainResult) { match result { Ok(outcome) => { - if !outcome.executed { + if outcome.executed { + info!( + tx_outcome=?outcome, + "Successfully announced validator", + ); + } else { error!( txid=?outcome.transaction_id, gas_used=?outcome.gas_used, @@ -221,7 +226,7 @@ impl Validator { Err(err) => { error!( ?err, - "Failed to announce validator. Make sure you have enough ETH in your account to pay for gas." + "Failed to announce validator. Make sure you have enough funds in your account to pay for gas." ); } } @@ -229,13 +234,14 @@ impl Validator { async fn announce(&self) -> Result<()> { let address = self.signer.eth_address(); + let announcement_location = self.checkpoint_syncer.announcement_location(); // Sign and post the validator announcement let announcement = Announcement { validator: address, mailbox_address: self.mailbox.address(), mailbox_domain: self.mailbox.domain().id(), - storage_location: self.checkpoint_syncer.announcement_location(), + storage_location: announcement_location.clone(), }; let signed_announcement = self.signer.sign(announcement.clone()).await?; self.checkpoint_syncer @@ -255,8 +261,12 @@ impl Validator { .await? .first() { - if locations.contains(&self.checkpoint_syncer.announcement_location()) { - info!("Validator has announced signature storage location"); + if locations.contains(&announcement_location) { + info!( + ?locations, + ?announcement_location, + "Validator has announced signature storage location" + ); break; } info!( @@ -264,9 +274,9 @@ impl Validator { "Validator has not announced signature storage location" ); - if self.core.settings.chains[self.origin_chain.name()] - .signer - .is_some() + if let Some(chain_signer) = self.core.settings.chains[self.origin_chain.name()] + .chain_signer() + .await? { let balance_delta = self .validator_announce @@ -276,8 +286,9 @@ impl Validator { if balance_delta > U256::zero() { warn!( tokens_needed=%balance_delta, - validator_address=?announcement.validator, - "Please send tokens to the validator address to announce", + eth_validator_address=?announcement.validator, + chain_signer=?chain_signer.address(), + "Please send tokens to your chain signer address to announce", ); } else { let result = self diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index 8451cfb41a..dbd5cd0e24 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -121,8 +121,17 @@ impl WasmProvider for WasmGrpcProvider { let mut client = ServiceClient::connect(self.get_conn_url()?).await?; let request = tonic::Request::new(GetLatestBlockRequest {}); - let response = client.get_latest_block(request).await.unwrap().into_inner(); - let height = response.block.unwrap().header.unwrap().height; + let response = client + .get_latest_block(request) + .await + .map_err(ChainCommunicationError::from_other)? + .into_inner(); + let height = response + .block + .ok_or_else(|| ChainCommunicationError::from_other_str("block not present"))? + .header + .ok_or_else(|| ChainCommunicationError::from_other_str("header not present"))? + .height; Ok(height as u64) } @@ -147,13 +156,11 @@ impl WasmProvider for WasmGrpcProvider { .insert("x-cosmos-block-height", height.into()); } - let result = client.smart_contract_state(request).await; - - if let Err(e) = result { - return Err(ChainCommunicationError::InvalidRequest { msg: e.to_string() }); - } - - let response = result.unwrap().into_inner(); + let response = client + .smart_contract_state(request) + .await + .map_err(ChainCommunicationError::from_other)? + .into_inner(); // TODO: handle query to specific block number Ok(response.data) @@ -183,13 +190,11 @@ impl WasmProvider for WasmGrpcProvider { .insert("x-cosmos-block-height", height.into()); } - let result = client.smart_contract_state(request).await; - - if let Err(e) = result { - return Err(ChainCommunicationError::InvalidRequest { msg: e.to_string() }); - } - - let response = result.unwrap().into_inner(); + let response = client + .smart_contract_state(request) + .await + .map_err(ChainCommunicationError::from_other)? + .into_inner(); // TODO: handle query to specific block number Ok(response.data) @@ -199,9 +204,19 @@ impl WasmProvider for WasmGrpcProvider { let mut client = QueryAccountClient::connect(self.get_conn_url()?).await?; let request = tonic::Request::new(QueryAccountRequest { address: account }); - let response = client.account(request).await.unwrap().into_inner(); - - let account = BaseAccount::decode(response.account.unwrap().value.as_slice())?; + let response = client + .account(request) + .await + .map_err(ChainCommunicationError::from_other)? + .into_inner(); + + let account = BaseAccount::decode( + response + .account + .ok_or_else(|| ChainCommunicationError::from_other_str("account not present"))? + .value + .as_slice(), + )?; Ok(account) } @@ -217,7 +232,11 @@ impl WasmProvider for WasmGrpcProvider { let tx_bytes = self.generate_raw_tx(msgs, gas_limit).await?; let sim_req = tonic::Request::new(SimulateRequest { tx: None, tx_bytes }); - let mut sim_res = client.simulate(sim_req).await.unwrap().into_inner(); + let mut sim_res = client + .simulate(sim_req) + .await + .map_err(ChainCommunicationError::from_other)? + .into_inner(); // apply gas adjustment sim_res.gas_info.as_mut().map(|v| { @@ -240,16 +259,13 @@ impl WasmProvider for WasmGrpcProvider { let tx_body = tx::Body::new(msgs, "", 9000000u32); let signer_info = SignerInfo::single_direct(Some(public_key), account_info.sequence); - let gas_limit: u64 = gas_limit - .unwrap_or(U256::from_str("100000").unwrap()) - .as_u64(); + let gas_limit: u64 = gas_limit.unwrap_or(U256::from(100000u64)).as_u64(); let auth_info = signer_info.auth_info(Fee::from_amount_and_gas( Coin::new( Amount::from((gas_limit as f32 * DEFAULT_GAS_PRICE) as u64), self.conf.get_canonical_asset().as_str(), - ) - .unwrap(), + )?, gas_limit, )); @@ -257,14 +273,13 @@ impl WasmProvider for WasmGrpcProvider { let sign_doc = SignDoc::new( &tx_body, &auth_info, - &self.conf.get_chain_id().parse().unwrap(), + &self.conf.get_chain_id().parse()?, account_info.account_number, - ) - .unwrap(); + )?; - let tx_signed = sign_doc.sign(&private_key).unwrap(); + let tx_signed = sign_doc.sign(&private_key)?; - Ok(tx_signed.to_bytes().unwrap()) + Ok(tx_signed.to_bytes()?) } async fn wasm_send(&self, payload: T, gas_limit: Option) -> ChainResult @@ -280,7 +295,7 @@ impl WasmProvider for WasmGrpcProvider { funds: vec![], } .to_any() - .unwrap()]; + .map_err(ChainCommunicationError::from_other)?]; let tx_req = BroadcastTxRequest { tx_bytes: self.generate_raw_tx(msgs, gas_limit).await?, @@ -293,7 +308,7 @@ impl WasmProvider for WasmGrpcProvider { .unwrap() .into_inner() .tx_response - .unwrap(); + .ok_or_else(|| ChainCommunicationError::from_other_str("Empty tx_response"))?; if tx_res.code != 0 { println!("TX_ERROR: {}", tx_res.raw_log); } @@ -313,7 +328,10 @@ impl WasmProvider for WasmGrpcProvider { }; let response = self - .simulate_raw_tx(vec![msg.to_any().unwrap()], None) + .simulate_raw_tx( + vec![msg.to_any().map_err(ChainCommunicationError::from_other)?], + None, + ) .await?; Ok(response) diff --git a/rust/chains/hyperlane-cosmos/src/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/validator_announce.rs index 30dd06c98e..98f4c3a030 100644 --- a/rust/chains/hyperlane-cosmos/src/validator_announce.rs +++ b/rust/chains/hyperlane-cosmos/src/validator_announce.rs @@ -115,11 +115,8 @@ impl ValidatorAnnounce for CosmosValidatorAnnounce { } async fn announce_tokens_needed(&self, announcement: SignedType) -> Option { - let out = self - .announce(announcement, None) - .await - .expect("failed to announce"); - - None + // TODO: check user balance. For now, just try announcing and + // allow the announce attempt to fail if there are not enough tokens. + Some(0u64.into()) } } diff --git a/rust/hyperlane-base/Cargo.toml b/rust/hyperlane-base/Cargo.toml index f2ba3ad52e..b3e5fbc74f 100644 --- a/rust/hyperlane-base/Cargo.toml +++ b/rust/hyperlane-base/Cargo.toml @@ -27,6 +27,7 @@ prometheus.workspace = true rocksdb.workspace = true serde.workspace = true serde_json.workspace = true +solana-sdk.worksapce = true static_assertions.workspace = true tempfile = { workspace = true, optional = true } thiserror.workspace = true diff --git a/rust/hyperlane-base/src/settings/chains.rs b/rust/hyperlane-base/src/settings/chains.rs index ade1112604..5e17a711ab 100644 --- a/rust/hyperlane-base/src/settings/chains.rs +++ b/rust/hyperlane-base/src/settings/chains.rs @@ -22,7 +22,7 @@ use hyperlane_fuel as h_fuel; use hyperlane_sealevel as h_sealevel; use crate::{ - settings::signers::{BuildableWithSignerConf, SignerConf}, + settings::signers::{BuildableWithSignerConf, ChainSigner, SignerConf}, CoreMetrics, }; @@ -605,6 +605,25 @@ impl ChainConf { } } + /// Returns a ChainSigner for the flavor of chain this is, if one is configured. + pub async fn chain_signer(&self) -> Result>> { + if let Some(conf) = &self.signer { + let chain_signer: Box = match &self.connection { + ChainConnectionConf::Ethereum(_) => Box::new(conf.build::().await?), + ChainConnectionConf::Fuel(_) => { + Box::new(conf.build::().await?) + } + ChainConnectionConf::Sealevel(_) => { + Box::new(conf.build::().await?) + } + ChainConnectionConf::Cosmos(_) => Box::new(conf.build::().await?), + }; + Ok(Some(chain_signer)) + } else { + Ok(None) + } + } + async fn ethereum_signer(&self) -> Result> { self.signer().await } diff --git a/rust/hyperlane-base/src/settings/signers.rs b/rust/hyperlane-base/src/settings/signers.rs index 50c25ed29c..b294f7f9cd 100644 --- a/rust/hyperlane-base/src/settings/signers.rs +++ b/rust/hyperlane-base/src/settings/signers.rs @@ -48,9 +48,15 @@ impl SignerConf { } } +/// A signer for a chain. +pub trait ChainSigner: Send { + /// The address of the signer, formatted in the chain's own address format. + fn address(&self) -> String; +} + /// Builder trait for signers #[async_trait] -pub trait BuildableWithSignerConf: Sized { +pub trait BuildableWithSignerConf: Sized + ChainSigner { /// Build a signer from a conf async fn build(conf: &SignerConf) -> Result; } @@ -80,17 +86,20 @@ impl BuildableWithSignerConf for hyperlane_ethereum::Signers { let signer = AwsSigner::new(client, id, 0).await?; hyperlane_ethereum::Signers::Aws(signer) } - SignerConf::CosmosKey { key, .. } => hyperlane_ethereum::Signers::Local( - LocalWallet::from(ethers::core::k256::ecdsa::SigningKey::from( - ethers::core::k256::SecretKey::from_be_bytes(key.as_bytes()) - .context("Invalid ethereum signer key")?, - )), - ), + SignerConf::CosmosKey { key, .. } => { + bail!("cosmosKey signer is not supported by Ethereum") + } SignerConf::Node => bail!("Node signer"), }) } } +impl ChainSigner for hyperlane_ethereum::Signers { + fn address(&self) -> String { + self.address().to_string() + } +} + #[async_trait] impl BuildableWithSignerConf for fuels::prelude::WalletUnlocked { async fn build(conf: &SignerConf) -> Result { @@ -107,6 +116,12 @@ impl BuildableWithSignerConf for fuels::prelude::WalletUnlocked { } } +impl ChainSigner for fuels::prelude::WalletUnlocked { + fn address(&self) -> String { + self.address().to_string() + } +} + #[async_trait] impl BuildableWithSignerConf for Keypair { async fn build(conf: &SignerConf) -> Result { @@ -124,6 +139,12 @@ impl BuildableWithSignerConf for Keypair { } } +impl ChainSigner for Keypair { + fn address(&self) -> String { + solana_sdk::signer::Signer::pubkey(self).to_string() + } +} + #[async_trait] impl BuildableWithSignerConf for hyperlane_cosmos::Signer { async fn build(conf: &SignerConf) -> Result { @@ -137,3 +158,9 @@ impl BuildableWithSignerConf for hyperlane_cosmos::Signer { }) } } + +impl ChainSigner for hyperlane_cosmos::Signer { + fn address(&self) -> String { + self.address() + } +} diff --git a/rust/hyperlane-core/src/error.rs b/rust/hyperlane-core/src/error.rs index a7388091ba..b69d731bc4 100644 --- a/rust/hyperlane-core/src/error.rs +++ b/rust/hyperlane-core/src/error.rs @@ -93,6 +93,10 @@ pub enum ChainCommunicationError { /// Cosmrs library error #[error("{0}")] Cosmrs(#[from] CosmrsError), + #[error("{0}")] + CosmrsErrorReport(#[from] cosmrs::ErrorReport), + #[error("{0}")] + CosmrsTendermintError(#[from] cosmrs::tendermint::Error), /// Tonic error #[error("{0}")] Tonic(#[from] tonic::transport::Error), From 07f55e25cbcb6461e2c7814c59b6ca7fc0d6cd88 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Thu, 26 Oct 2023 16:52:02 +0100 Subject: [PATCH 103/142] Make Clippy happy --- rust/agents/relayer/src/msg/gas_payment/mod.rs | 2 +- .../msg/metadata/multisig/message_id_multisig.rs | 2 +- rust/agents/validator/src/submit.rs | 4 ++-- rust/agents/validator/src/validator.rs | 10 +++------- .../src/interchain_security_module.rs | 1 - rust/chains/hyperlane-cosmos/src/mailbox.rs | 2 +- rust/chains/hyperlane-cosmos/src/providers/grpc.rs | 7 +++---- rust/chains/hyperlane-cosmos/src/providers/rpc.rs | 14 ++------------ .../hyperlane-ethereum/tests/signer_output.rs | 3 +-- rust/hyperlane-base/src/settings/signers.rs | 14 +++++++------- rust/hyperlane-core/src/error.rs | 2 ++ rust/utils/run-locally/src/cosmos/cli.rs | 1 - rust/utils/run-locally/src/cosmos/link.rs | 3 +-- rust/utils/run-locally/src/cosmos/mod.rs | 4 ++-- rust/utils/run-locally/src/cosmos/source.rs | 1 + 15 files changed, 27 insertions(+), 43 deletions(-) diff --git a/rust/agents/relayer/src/msg/gas_payment/mod.rs b/rust/agents/relayer/src/msg/gas_payment/mod.rs index 3114849246..a2031a5be0 100644 --- a/rust/agents/relayer/src/msg/gas_payment/mod.rs +++ b/rust/agents/relayer/src/msg/gas_payment/mod.rs @@ -7,7 +7,7 @@ use hyperlane_core::{ GasPaymentKey, HyperlaneMessage, InterchainGasExpenditure, InterchainGasPayment, TxCostEstimate, TxOutcome, U256, }; -use tracing::{debug, error, info, trace}; +use tracing::{debug, error, trace}; use self::policies::{GasPaymentPolicyMinimum, GasPaymentPolicyNone}; use crate::{ diff --git a/rust/agents/relayer/src/msg/metadata/multisig/message_id_multisig.rs b/rust/agents/relayer/src/msg/metadata/multisig/message_id_multisig.rs index e696019c0e..3ccfcf57b7 100644 --- a/rust/agents/relayer/src/msg/metadata/multisig/message_id_multisig.rs +++ b/rust/agents/relayer/src/msg/metadata/multisig/message_id_multisig.rs @@ -7,7 +7,7 @@ use derive_new::new; use eyre::{Context, Result}; use hyperlane_base::MultisigCheckpointSyncer; use hyperlane_core::{unwrap_or_none_result, HyperlaneMessage, H256}; -use tracing::{debug, trace, warn}; +use tracing::{debug, warn}; use crate::msg::metadata::BaseMetadataBuilder; diff --git a/rust/agents/validator/src/submit.rs b/rust/agents/validator/src/submit.rs index 1c1122adc5..7663709196 100644 --- a/rust/agents/validator/src/submit.rs +++ b/rust/agents/validator/src/submit.rs @@ -1,11 +1,11 @@ use std::num::NonZeroU64; -use std::str::FromStr; + use std::sync::Arc; use std::time::{Duration, Instant}; use std::vec; use eyre::{bail, Result}; -use hyperlane_core::{MerkleTreeHook, H256}; +use hyperlane_core::MerkleTreeHook; use prometheus::IntGauge; use tokio::time::sleep; use tracing::{debug, info}; diff --git a/rust/agents/validator/src/validator.rs b/rust/agents/validator/src/validator.rs index 8bfc3bc503..900b87405a 100644 --- a/rust/agents/validator/src/validator.rs +++ b/rust/agents/validator/src/validator.rs @@ -4,15 +4,13 @@ use async_trait::async_trait; use derive_more::AsRef; use eyre::Result; use futures_util::future::ready; -use hyperlane_cosmos::verify::{priv_to_addr_string, priv_to_binary_addr}; + use tokio::{task::JoinHandle, time::sleep}; use tracing::{error, info, info_span, instrument::Instrumented, warn, Instrument}; use hyperlane_base::{ db::{HyperlaneRocksDB, DB}, - run_all, - settings::SignerConf, - BaseAgent, CheckpointSyncer, ContractSyncMetrics, CoreMetrics, HyperlaneAgentCore, + run_all, BaseAgent, CheckpointSyncer, ContractSyncMetrics, CoreMetrics, HyperlaneAgentCore, WatermarkContractSync, }; @@ -45,7 +43,6 @@ pub struct Validator { reorg_period: u64, interval: Duration, checkpoint_syncer: Arc, - raw_signer: SignerConf, } #[async_trait] @@ -104,7 +101,6 @@ impl BaseAgent for Validator { reorg_period: settings.reorg_period, interval: settings.interval, checkpoint_syncer, - raw_signer: settings.validator.clone(), }) } @@ -287,7 +283,7 @@ impl Validator { warn!( tokens_needed=%balance_delta, eth_validator_address=?announcement.validator, - chain_signer=?chain_signer.address(), + chain_signer=?chain_signer.address_string(), "Please send tokens to your chain signer address to announce", ); } else { diff --git a/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs index b4e59d1c6e..1e27fca038 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs @@ -67,7 +67,6 @@ fn ism_type_to_module_type(ism_type: hpl_interface::ism::ISMType) -> ModuleType hpl_interface::ism::ISMType::MessageIdMultisig => ModuleType::MessageIdMultisig, hpl_interface::ism::ISMType::Null => ModuleType::Null, hpl_interface::ism::ISMType::CcipRead => ModuleType::CcipRead, - _ => ModuleType::Null, } } diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 203f263eb0..06239fb587 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -305,7 +305,7 @@ impl Indexer for CosmosMailboxIndexer { range: RangeInclusive, ) -> ChainResult> { let parser = self.get_parser(); - let mut result = self.indexer.get_range_event_logs(range, parser).await?; + let result = self.indexer.get_range_event_logs(range, parser).await?; Ok(result) } diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index dbd5cd0e24..4a91b8f8b7 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -18,7 +18,6 @@ use cosmrs::proto::cosmwasm::wasm::v1::{ }; use cosmrs::proto::traits::Message; -use cosmrs::tendermint::chain; use cosmrs::tx::{self, Fee, MessageExt, SignDoc, SignerInfo}; use cosmrs::{Amount, Coin}; use hyperlane_core::{ @@ -26,7 +25,6 @@ use hyperlane_core::{ }; use serde::Serialize; use std::num::NonZeroU64; -use std::str::FromStr; use crate::verify; use crate::{signers::Signer, ConnectionConf}; @@ -90,7 +88,7 @@ pub trait WasmProvider: Send + Sync { /// Cosmwasm GRPC Provider pub struct WasmGrpcProvider { conf: ConnectionConf, - domain: HyperlaneDomain, + _domain: HyperlaneDomain, address: H256, signer: Signer, } @@ -100,7 +98,7 @@ impl WasmGrpcProvider { pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { Self { conf, - domain: locator.domain.clone(), + _domain: locator.domain.clone(), address: locator.address, signer, } @@ -231,6 +229,7 @@ impl WasmProvider for WasmGrpcProvider { let mut client = TxServiceClient::connect(self.get_conn_url()?).await?; let tx_bytes = self.generate_raw_tx(msgs, gas_limit).await?; + #[allow(deprecated)] let sim_req = tonic::Request::new(SimulateRequest { tx: None, tx_bytes }); let mut sim_res = client .simulate(sim_req) diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index 4376e7a5a6..f9777227d6 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -1,22 +1,12 @@ use std::ops::RangeInclusive; use crate::binary::h256_to_h512; -<<<<<<< HEAD -======= -use crate::payloads::general::{EventAttribute, Log}; ->>>>>>> 495408873 (wip: run validator on duality-testnet) use async_trait::async_trait; -<<<<<<< HEAD use cosmrs::rpc::client::{Client, CompatMode, HttpClient}; use cosmrs::rpc::endpoint::tx; use cosmrs::rpc::query::Query; use cosmrs::rpc::Order; use cosmrs::tendermint::abci::EventAttribute; -======= -use cosmrs::rpc::client::{Client, HttpClient}; -use cosmrs::tendermint::hash::Algorithm; -use cosmrs::tendermint::Hash; ->>>>>>> 58b3d462d (include rpc diff in fix) use hyperlane_core::{ChainResult, ContractLocator, HyperlaneDomain, LogMeta, H256, U256}; use tracing::debug; @@ -54,7 +44,7 @@ pub trait WasmIndexer: Send + Sync { /// Cosmwasm RPC Provider pub struct CosmosWasmIndexer { conf: ConnectionConf, - domain: HyperlaneDomain, + _domain: HyperlaneDomain, address: H256, event_type: String, } @@ -66,7 +56,7 @@ impl CosmosWasmIndexer { pub fn new(conf: ConnectionConf, locator: ContractLocator, event_type: String) -> Self { Self { conf, - domain: locator.domain.clone(), + _domain: locator.domain.clone(), address: locator.address, event_type, } diff --git a/rust/chains/hyperlane-ethereum/tests/signer_output.rs b/rust/chains/hyperlane-ethereum/tests/signer_output.rs index c8af292cb7..a69629114b 100644 --- a/rust/chains/hyperlane-ethereum/tests/signer_output.rs +++ b/rust/chains/hyperlane-ethereum/tests/signer_output.rs @@ -7,7 +7,6 @@ use std::{fs::OpenOptions, io::Write, str::FromStr}; use hex::FromHex; use serde_json::{json, Value}; -use ethers::signers::Signer; use hyperlane_core::{ accumulator::{ merkle::{merkle_root_from_branch, MerkleTree}, @@ -15,7 +14,7 @@ use hyperlane_core::{ }, test_utils, utils::domain_hash, - Checkpoint, HyperlaneMessage, HyperlaneSignerExt, H160, H256, + HyperlaneMessage, H160, H256, }; /// Output proof to /vector/message.json diff --git a/rust/hyperlane-base/src/settings/signers.rs b/rust/hyperlane-base/src/settings/signers.rs index b294f7f9cd..8125e5c0d9 100644 --- a/rust/hyperlane-base/src/settings/signers.rs +++ b/rust/hyperlane-base/src/settings/signers.rs @@ -51,7 +51,7 @@ impl SignerConf { /// A signer for a chain. pub trait ChainSigner: Send { /// The address of the signer, formatted in the chain's own address format. - fn address(&self) -> String; + fn address_string(&self) -> String; } /// Builder trait for signers @@ -86,7 +86,7 @@ impl BuildableWithSignerConf for hyperlane_ethereum::Signers { let signer = AwsSigner::new(client, id, 0).await?; hyperlane_ethereum::Signers::Aws(signer) } - SignerConf::CosmosKey { key, .. } => { + SignerConf::CosmosKey { .. } => { bail!("cosmosKey signer is not supported by Ethereum") } SignerConf::Node => bail!("Node signer"), @@ -95,8 +95,8 @@ impl BuildableWithSignerConf for hyperlane_ethereum::Signers { } impl ChainSigner for hyperlane_ethereum::Signers { - fn address(&self) -> String { - self.address().to_string() + fn address_string(&self) -> String { + ethers::signers::Signer::address(self).to_string() } } @@ -117,7 +117,7 @@ impl BuildableWithSignerConf for fuels::prelude::WalletUnlocked { } impl ChainSigner for fuels::prelude::WalletUnlocked { - fn address(&self) -> String { + fn address_string(&self) -> String { self.address().to_string() } } @@ -140,7 +140,7 @@ impl BuildableWithSignerConf for Keypair { } impl ChainSigner for Keypair { - fn address(&self) -> String { + fn address_string(&self) -> String { solana_sdk::signer::Signer::pubkey(self).to_string() } } @@ -160,7 +160,7 @@ impl BuildableWithSignerConf for hyperlane_cosmos::Signer { } impl ChainSigner for hyperlane_cosmos::Signer { - fn address(&self) -> String { + fn address_string(&self) -> String { self.address() } } diff --git a/rust/hyperlane-core/src/error.rs b/rust/hyperlane-core/src/error.rs index b69d731bc4..6c0f705aa5 100644 --- a/rust/hyperlane-core/src/error.rs +++ b/rust/hyperlane-core/src/error.rs @@ -93,9 +93,11 @@ pub enum ChainCommunicationError { /// Cosmrs library error #[error("{0}")] Cosmrs(#[from] CosmrsError), + /// Cosmrs ErrorReport #[error("{0}")] CosmrsErrorReport(#[from] cosmrs::ErrorReport), #[error("{0}")] + /// Cosmrs Tendermint Error CosmrsTendermintError(#[from] cosmrs::tendermint::Error), /// Tonic error #[error("{0}")] diff --git a/rust/utils/run-locally/src/cosmos/cli.rs b/rust/utils/run-locally/src/cosmos/cli.rs index 634e99181c..b221c9f499 100644 --- a/rust/utils/run-locally/src/cosmos/cli.rs +++ b/rust/utils/run-locally/src/cosmos/cli.rs @@ -3,7 +3,6 @@ use std::{collections::BTreeMap, io::Write, path::PathBuf, process::Stdio}; use k256::ecdsa::SigningKey; use crate::{ - cosmos::types::CliWasmQueryResponse, program::Program, utils::{concat_path, AgentHandles, TaskHandle}, }; diff --git a/rust/utils/run-locally/src/cosmos/link.rs b/rust/utils/run-locally/src/cosmos/link.rs index 46ec9186fc..46bc5cabcc 100644 --- a/rust/utils/run-locally/src/cosmos/link.rs +++ b/rust/utils/run-locally/src/cosmos/link.rs @@ -1,4 +1,3 @@ -use ::core::panic; use std::path::Path; use cosmwasm_schema::cw_serde; @@ -93,7 +92,7 @@ fn link_network( target_domain: u32, ) { let validator_addr = validator.addr(hrp); - let validator_pubkey = validator.pub_key_to_binary(); + let _validator_pubkey = validator.pub_key_to_binary(); let dest_domain = if network.domain == 26657 { 26658 diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index ec843a754c..5cd7a66f3b 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -5,7 +5,7 @@ use std::time::Duration; use std::{env, fs}; use cosmwasm_schema::cw_serde; -use hpl_interface::{core, types::bech32_decode}; +use hpl_interface::types::bech32_decode; use macro_rules_attribute::apply; use tempfile::tempdir; @@ -132,7 +132,7 @@ pub fn install_cosmos( cli_dir: Option, cli_src: Option, codes_dir: Option, - codes_src: Option, + _codes_src: Option, ) -> (PathBuf, BTreeMap) { let osmosisd = cli_src .unwrap_or(CLISource::Remote { diff --git a/rust/utils/run-locally/src/cosmos/source.rs b/rust/utils/run-locally/src/cosmos/source.rs index 53b80849fc..6aada599f0 100644 --- a/rust/utils/run-locally/src/cosmos/source.rs +++ b/rust/utils/run-locally/src/cosmos/source.rs @@ -86,6 +86,7 @@ impl CodeSource { .collect() } + #[allow(dead_code)] pub fn install(self, dir: Option) -> BTreeMap { match self { CodeSource::Local { path } => Self::install_local(path), From 41107770a1c3ad85f1163d22d83709276067718c Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Thu, 26 Oct 2023 16:58:15 +0100 Subject: [PATCH 104/142] nit --- rust/agents/validator/src/submit.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/rust/agents/validator/src/submit.rs b/rust/agents/validator/src/submit.rs index 7663709196..b94b5781a1 100644 --- a/rust/agents/validator/src/submit.rs +++ b/rust/agents/validator/src/submit.rs @@ -1,5 +1,4 @@ use std::num::NonZeroU64; - use std::sync::Arc; use std::time::{Duration, Instant}; use std::vec; From 19960d3b9089d2422f8baf0b6cbbb14ac51a9a78 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Fri, 27 Oct 2023 12:02:11 +0100 Subject: [PATCH 105/142] Fix validator self-announcement to estimate gas --- .../hyperlane-cosmos/src/providers/grpc.rs | 18 +++++---------- .../src/validator_announce.rs | 23 ++++++++++++++++--- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index 4a91b8f8b7..2925a93443 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -60,7 +60,6 @@ pub trait WasmProvider: Send + Sync { async fn simulate_raw_tx + Sync + Send>( &self, msgs: I, - gas_limit: Option, ) -> ChainResult; /// generate raw tx @@ -218,17 +217,13 @@ impl WasmProvider for WasmGrpcProvider { Ok(account) } - async fn simulate_raw_tx( - &self, - msgs: I, - gas_limit: Option, - ) -> ChainResult + async fn simulate_raw_tx(&self, msgs: I) -> ChainResult where I: IntoIterator + Send + Sync, { let mut client = TxServiceClient::connect(self.get_conn_url()?).await?; - let tx_bytes = self.generate_raw_tx(msgs, gas_limit).await?; + let tx_bytes = self.generate_raw_tx(msgs, None).await?; #[allow(deprecated)] let sim_req = tonic::Request::new(SimulateRequest { tx: None, tx_bytes }); let mut sim_res = client @@ -258,7 +253,7 @@ impl WasmProvider for WasmGrpcProvider { let tx_body = tx::Body::new(msgs, "", 9000000u32); let signer_info = SignerInfo::single_direct(Some(public_key), account_info.sequence); - let gas_limit: u64 = gas_limit.unwrap_or(U256::from(100000u64)).as_u64(); + let gas_limit: u64 = gas_limit.unwrap_or(U256::from(300000u64)).as_u64(); let auth_info = signer_info.auth_info(Fee::from_amount_and_gas( Coin::new( @@ -327,10 +322,9 @@ impl WasmProvider for WasmGrpcProvider { }; let response = self - .simulate_raw_tx( - vec![msg.to_any().map_err(ChainCommunicationError::from_other)?], - None, - ) + .simulate_raw_tx(vec![msg + .to_any() + .map_err(ChainCommunicationError::from_other)?]) .await?; Ok(response) diff --git a/rust/chains/hyperlane-cosmos/src/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/validator_announce.rs index 98f4c3a030..44eb8e65e3 100644 --- a/rust/chains/hyperlane-cosmos/src/validator_announce.rs +++ b/rust/chains/hyperlane-cosmos/src/validator_announce.rs @@ -2,8 +2,9 @@ use async_trait::async_trait; use cosmrs::proto::cosmos::base::abci::v1beta1::TxResponse; use hyperlane_core::{ - Announcement, ChainResult, ContractLocator, HyperlaneChain, HyperlaneContract, HyperlaneDomain, - HyperlaneProvider, SignedType, TxOutcome, ValidatorAnnounce, H256, U256, + Announcement, ChainCommunicationError, ChainResult, ContractLocator, HyperlaneChain, + HyperlaneContract, HyperlaneDomain, HyperlaneProvider, SignedType, TxOutcome, + ValidatorAnnounce, H256, U256, }; use crate::{ @@ -100,9 +101,25 @@ impl ValidatorAnnounce for CosmosValidatorAnnounce { }, }; + // Perform gas estimation if a limit wasn't already provided. + // TODO: refactor `wasm_send` to do this gas estimation automatically + // instead of using a default hardcoded value if the gas limit is `None`. + let tx_gas_limit = if let Some(gas_limit) = tx_gas_limit { + gas_limit + } else { + // A multiplier is applied already for us + self.provider + .wasm_simulate(announce_request.clone()) + .await? + .gas_info + .ok_or_else(|| ChainCommunicationError::from_other_str("gas info not present"))? + .gas_used + .into() + }; + let response: TxResponse = self .provider - .wasm_send(announce_request, tx_gas_limit) + .wasm_send(announce_request, Some(tx_gas_limit)) .await?; Ok(TxOutcome { From eeb779981c1c7427d6452938f871713563c965bd Mon Sep 17 00:00:00 2001 From: Nam Chu Hoai Date: Fri, 27 Oct 2023 22:35:52 -0400 Subject: [PATCH 106/142] Also decode base64-encoded events --- rust/chains/hyperlane-cosmos/src/mailbox.rs | 21 ++++++++++++-- .../hyperlane-cosmos/src/merkle_tree_hook.rs | 29 ++++++++++++++++++- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 06239fb587..5aedb4d63d 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -1,3 +1,4 @@ +use base64::Engine; use std::fmt::{Debug, Formatter}; use std::io::Cursor; use std::num::NonZeroU64; @@ -258,11 +259,25 @@ impl CosmosMailboxIndexer { if key == "message" { let mut reader = Cursor::new(hex::decode(value).unwrap()); - res = HyperlaneMessage::read_from(&mut reader).unwrap(); + return Some(HyperlaneMessage::read_from(&mut reader).unwrap()); } - } - Some(res) + if key == "bWVzc2FnZQ==" { + let mut reader = Cursor::new( + hex::decode( + String::from_utf8( + base64::engine::general_purpose::STANDARD + .decode(value) + .unwrap(), + ) + .unwrap(), + ) + .unwrap(), + ); + return Some(HyperlaneMessage::read_from(&mut reader).unwrap()); + } + } + None } } diff --git a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs index bcc8693ee3..53a01f5684 100644 --- a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs +++ b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -1,13 +1,14 @@ use std::{fmt::Debug, num::NonZeroU64, ops::RangeInclusive, str::FromStr}; use async_trait::async_trait; +use base64::Engine; use cosmrs::tendermint::abci::EventAttribute; use hyperlane_core::{ accumulator::incremental::IncrementalMerkle, ChainResult, Checkpoint, ContractLocator, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneProvider, Indexer, LogMeta, MerkleTreeHook, MerkleTreeInsertion, SequenceIndexer, H256, }; -use tracing::instrument; +use tracing::{info, instrument}; use crate::{ grpc::{WasmGrpcProvider, WasmProvider}, @@ -190,6 +191,32 @@ impl CosmosMerkleeTreeHookIndexer { leaf_index = value.parse().unwrap(); attr_count += 1; } + "aW5kZXg=" => { + leaf_index = String::from_utf8( + base64::engine::general_purpose::STANDARD + .decode(value) + .unwrap(), + ) + .unwrap() + .parse() + .unwrap(); + attr_count += 1; + } + "bWVzc2FnZV9pZA==" => { + message_id = H256::from_slice( + hex::decode( + String::from_utf8( + base64::engine::general_purpose::STANDARD + .decode(value) + .unwrap(), + ) + .unwrap(), + ) + .unwrap() + .as_slice(), + ); + attr_count += 1; + } _ => {} } } From acd8ec10baf8f209f9147563b32a8d13a54b9837 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Fri, 27 Oct 2023 12:50:20 +0100 Subject: [PATCH 107/142] fix build --- .../hyperlane-cosmos/src/payloads/validator_announce.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/payloads/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/payloads/validator_announce.rs index 64624a2f38..fdf449c7c4 100644 --- a/rust/chains/hyperlane-cosmos/src/payloads/validator_announce.rs +++ b/rust/chains/hyperlane-cosmos/src/payloads/validator_announce.rs @@ -17,12 +17,12 @@ pub struct GetAnnounceStorageLocationsRequestInner { pub validators: Vec, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] pub struct AnnouncementRequest { pub announce: AnnouncementRequestInner, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] pub struct AnnouncementRequestInner { pub validator: String, pub storage_location: String, From b3e241f47d88b333422fd28ff052fed1e3ffde4d Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Fri, 27 Oct 2023 14:47:40 +0100 Subject: [PATCH 108/142] Some more logs for funding the chain signer --- rust/agents/validator/src/validator.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/rust/agents/validator/src/validator.rs b/rust/agents/validator/src/validator.rs index 900b87405a..e70a50a69f 100644 --- a/rust/agents/validator/src/validator.rs +++ b/rust/agents/validator/src/validator.rs @@ -202,12 +202,13 @@ impl Validator { tasks } - fn log_on_announce_failure(result: ChainResult) { + fn log_on_announce_failure(result: ChainResult, chain_signer: &String) { match result { Ok(outcome) => { if outcome.executed { info!( tx_outcome=?outcome, + ?chain_signer, "Successfully announced validator", ); } else { @@ -215,6 +216,7 @@ impl Validator { txid=?outcome.transaction_id, gas_used=?outcome.gas_used, gas_price=?outcome.gas_price, + ?chain_signer, "Transaction attempting to announce validator reverted. Make sure you have enough funds in your account to pay for transaction fees." ); } @@ -222,6 +224,7 @@ impl Validator { Err(err) => { error!( ?err, + ?chain_signer, "Failed to announce validator. Make sure you have enough funds in your account to pay for gas." ); } @@ -274,6 +277,8 @@ impl Validator { .chain_signer() .await? { + let chain_signer = chain_signer.address_string(); + info!(eth_validator_address=?announcement.validator, ?chain_signer, "Attempting self announce"); let balance_delta = self .validator_announce .announce_tokens_needed(signed_announcement.clone()) @@ -283,7 +288,7 @@ impl Validator { warn!( tokens_needed=%balance_delta, eth_validator_address=?announcement.validator, - chain_signer=?chain_signer.address_string(), + ?chain_signer, "Please send tokens to your chain signer address to announce", ); } else { @@ -291,7 +296,7 @@ impl Validator { .validator_announce .announce(signed_announcement.clone(), None) .await; - Self::log_on_announce_failure(result); + Self::log_on_announce_failure(result, &chain_signer); } } else { warn!(origin_chain=%self.origin_chain, "Cannot announce validator without a signer; make sure a signer is set for the origin chain"); From 57911c044ed2fe8d857abdedd8a550ea6ff394c7 Mon Sep 17 00:00:00 2001 From: Nam Chu Hoai Date: Sat, 28 Oct 2023 18:54:36 -0400 Subject: [PATCH 109/142] Dont one-shot indexing --- rust/config/testnet_neutron_config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/config/testnet_neutron_config.json b/rust/config/testnet_neutron_config.json index fb9b2c2140..de987f9d28 100644 --- a/rust/config/testnet_neutron_config.json +++ b/rust/config/testnet_neutron_config.json @@ -72,7 +72,7 @@ "prefix": "neutron" }, "index": { - "from": 4200000, + "from": 4000000, "chunk": 100000 } } From 08606f45bbbba51d37e94bd77b3b7e2a5965b84a Mon Sep 17 00:00:00 2001 From: Nam Chu Hoai Date: Sat, 28 Oct 2023 19:28:36 -0400 Subject: [PATCH 110/142] Remove --- rust/config/testnet_neutron_config.json | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/rust/config/testnet_neutron_config.json b/rust/config/testnet_neutron_config.json index de987f9d28..277521e1a2 100644 --- a/rust/config/testnet_neutron_config.json +++ b/rust/config/testnet_neutron_config.json @@ -18,11 +18,6 @@ "grpcUrl": "http://52.43.22.152:9090", "canonicalAsset": "token", "prefix": "dual", - "signer": { - "signerType": "cosmosKey", - "key": "0xac30d9f8ba63095774e7c853e23b02768031aa5076576113bbc9f4f07f4d12c5", - "prefix": "dual" - }, "index": { "from": 1, "chunk": 1000 @@ -66,11 +61,6 @@ "grpcUrl": "https://grpc-kralum.neutron-1.neutron.org:80", "canonicalAsset": "untrn", "prefix": "neutron", - "signer": { - "signerType": "cosmosKey", - "key": "0xac30d9f8ba63095774e7c853e23b02768031aa5076576113bbc9f4f07f4d12c5", - "prefix": "neutron" - }, "index": { "from": 4000000, "chunk": 100000 From c66f4ea2df6042e0fa74d70be8b5cffcd5255ea3 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Sun, 29 Oct 2023 20:26:59 +0000 Subject: [PATCH 111/142] Use new mainnet config --- rust/config/mainnet3_config.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/rust/config/mainnet3_config.json b/rust/config/mainnet3_config.json index fc06c4c8d5..90101e5416 100644 --- a/rust/config/mainnet3_config.json +++ b/rust/config/mainnet3_config.json @@ -45,7 +45,7 @@ "mailbox": "0x979Ca5202784112f4738403dBec5D0F3B9daabB9", "validatorAnnounce": "0x1df063280C4166AF9a725e3828b4dAC6c7113B08", "index": { - "from": 145551152 + "from": 143699718 } }, "avalanche": { @@ -97,7 +97,7 @@ "mailbox": "0xFf06aFcaABaDDd1fb08371f9ccA15D73D51FeBD6", "validatorAnnounce": "0x9Cad0eC82328CEE2386Ec14a12E81d070a27712f", "index": { - "from": 37133307 + "from": 36881761 } }, "base": { @@ -150,7 +150,7 @@ "protocolFee": "0x99ca8c74cE7Cfa9d72A51fbb05F9821f5f826b3a", "validatorAnnounce": "0x182E8d7c5F1B06201b102123FC7dF0EaeB445a7B", "index": { - "from": 5959667 + "from": 5702757 } }, "bsc": { @@ -205,7 +205,7 @@ "protocolFee": "0xA8Aa5f14a5463a78E45CC068F11c867949F3E367", "validatorAnnounce": "0x7024078130D9c2100fEA474DAD009C2d1703aCcd", "index": { - "from": 33068482 + "from": 32897848 } }, "celo": { @@ -258,7 +258,7 @@ "mailbox": "0x50da3B3907A08a24fe4999F4Dcf337E8dC7954bb", "validatorAnnounce": "0xCeF677b65FDaA6804d4403083bb12B8dB3991FE1", "index": { - "from": 22208016 + "from": 22105253 } }, "ethereum": { @@ -318,7 +318,7 @@ "mailbox": "0xc005dc82818d67AF737725bD4bf75435d065D239", "validatorAnnounce": "0xCe74905e51497b4adD3639366708b821dcBcff96", "index": { - "from": 18466263 + "from": 18423787 } }, "gnosis": { @@ -417,7 +417,7 @@ "protocolFee": "0xCd3e29A9D293DcC7341295996a118913F7c582c0", "validatorAnnounce": "0x8c1001eBee6F25b31863A55EadfF149aF88B356F", "index": { - "from": 4763137 + "from": 4720894 } }, "optimism": { @@ -465,7 +465,7 @@ "mailbox": "0xd4C1905BB1D26BC93DAC913e13CaCC278CdCC80D", "validatorAnnounce": "0x30f5b08e01808643221528BB2f7953bf2830Ef38", "index": { - "from": 111554952 + "from": 111298042 } }, "polygon": { @@ -524,7 +524,7 @@ "protocolFee": "0xF8F3629e308b4758F8396606405989F8D8C9c578", "validatorAnnounce": "0x454E1a1E1CA8B51506090f1b5399083658eA4Fc5", "index": { - "from": 49352047 + "from": 49114872 } }, "polygonzkevm": { @@ -576,7 +576,7 @@ "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", "validatorAnnounce": "0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9", "index": { - "from": 6789061 + "from": 6581140 } }, "scroll": { @@ -625,7 +625,7 @@ "mailbox": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", "validatorAnnounce": "0xd83A4F747fE80Ed98839e05079B1B7Fe037b1638", "index": { - "from": 426670 + "from": 275252 } } }, From f11f969100b3d538b20e3dfae57e1b37b20eee2f Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Sun, 29 Oct 2023 21:15:30 +0000 Subject: [PATCH 112/142] Rust config signerType -> type --- rust/hyperlane-base/src/settings/parser/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/hyperlane-base/src/settings/parser/mod.rs b/rust/hyperlane-base/src/settings/parser/mod.rs index 7d96285c01..7edaae6d6a 100644 --- a/rust/hyperlane-base/src/settings/parser/mod.rs +++ b/rust/hyperlane-base/src/settings/parser/mod.rs @@ -394,7 +394,7 @@ fn parse_signer(signer: ValueParser) -> ConfigResult { let signer_type = signer .chain(&mut err) - .get_opt_key("signerType") + .get_opt_key("type") .parse_string() .end(); From 896dce63b797653d342a16a4ef2ea684566931e6 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Mon, 30 Oct 2023 11:50:13 +0000 Subject: [PATCH 113/142] Use encode_hex instead --- rust/hyperlane-base/src/settings/signers.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/hyperlane-base/src/settings/signers.rs b/rust/hyperlane-base/src/settings/signers.rs index 8125e5c0d9..a3b5301d54 100644 --- a/rust/hyperlane-base/src/settings/signers.rs +++ b/rust/hyperlane-base/src/settings/signers.rs @@ -96,7 +96,7 @@ impl BuildableWithSignerConf for hyperlane_ethereum::Signers { impl ChainSigner for hyperlane_ethereum::Signers { fn address_string(&self) -> String { - ethers::signers::Signer::address(self).to_string() + ethers::abi::AbiEncode::encode_hex(ethers::signers::Signer::address(self)) } } From 6e73f47e1a300e05952221f0a04942f4a95b4464 Mon Sep 17 00:00:00 2001 From: Nam Chu Hoai Date: Sun, 29 Oct 2023 20:33:49 -0400 Subject: [PATCH 114/142] Base64 decode igp events --- .../hyperlane-cosmos/src/interchain_gas.rs | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index 6556e9a6f5..9da6ee2470 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -1,4 +1,6 @@ use async_trait::async_trait; +use base64::engine::general_purpose::STANDARD; +use base64::Engine; use cosmrs::tendermint::abci::EventAttribute; use hyperlane_core::{ ChainResult, ContractLocator, HyperlaneChain, HyperlaneContract, Indexer, @@ -6,6 +8,7 @@ use hyperlane_core::{ }; use hyperlane_core::{HyperlaneDomain, HyperlaneProvider, InterchainGasPayment, LogMeta, H256}; use std::ops::RangeInclusive; +use tracing::info; use crate::grpc::WasmGrpcProvider; use crate::rpc::{CosmosWasmIndexer, WasmIndexer}; @@ -89,9 +92,36 @@ impl CosmosInterchainGasPaymasterIndexer { "message_id" => { res.message_id = H256::from_slice(hex::decode(value).unwrap().as_slice()) } + "bWVzc2FnZV9pZA==" => { + res.message_id = H256::from_slice( + hex::decode( + String::from_utf8(STANDARD.decode(value).unwrap()).unwrap(), + ) + .unwrap() + .as_slice(), + ) + } "payment" => res.payment = value.parse().unwrap(), + "cGF5bWVudA==" => { + res.payment = String::from_utf8(STANDARD.decode(value).unwrap()) + .unwrap() + .parse() + .unwrap() + } "gas_amount" => res.gas_amount = value.parse().unwrap(), + "Z2FzX2Ftb3VudA==" => { + res.gas_amount = String::from_utf8(STANDARD.decode(value).unwrap()) + .unwrap() + .parse() + .unwrap() + } "dest_domain" => res.destination = value.parse().unwrap(), + "ZGVzdF9kb21haW4=" => { + res.destination = String::from_utf8(STANDARD.decode(value).unwrap()) + .unwrap() + .parse() + .unwrap() + } _ => {} } } From 581bbbc6b74ba1cf7bf57b545367ddef63c63388 Mon Sep 17 00:00:00 2001 From: Nam Chu Hoai Date: Mon, 30 Oct 2023 05:34:15 -0400 Subject: [PATCH 115/142] Add announcement key in config (#2870) Adds a key in there that if it has funds, can be used the announce. Otherwise the operator has to specify their own key or somebody else has to announce --- rust/config/mainnet3_config.json | 75 +++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/rust/config/mainnet3_config.json b/rust/config/mainnet3_config.json index 90101e5416..73761219ba 100644 --- a/rust/config/mainnet3_config.json +++ b/rust/config/mainnet3_config.json @@ -370,7 +370,80 @@ "protocolFee": "0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88", "validatorAnnounce": "0x87ED6926abc9E38b9C7C19f835B41943b622663c", "index": { - "from": 30715963 + "from": 30696004 + } + }, + "mantapacific": { + "protocol": "ethereum", + "domainId": 169, + "chainId": 169, + "name": "mantapacific", + "displayName": "Manta Pacific", + "displayNameShort": "Manta", + "nativeToken": { + "name": "Ether", + "symbol": "ETH", + "decimals": 18 + }, + "blocks": { + "confirmations": 1, + "reorgPeriod": 0, + "estimateBlockTime": 3 + }, + "rpcUrls": [ + { + "http": "https://pacific-rpc.manta.network/http" + } + ], + "isTestnet": false, + "merkleRootMultisigIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "messageIdMultisigIsmFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "aggregationIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "aggregationHookFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "routingIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "domainRoutingIsm": "0xDEed16fe4b1c9b2a93483EDFf34C77A9b57D31Ff", + "storageGasOracle": "0x19dc38aeae620380430C200a6E990D5Af5480117", + "interchainGasPaymaster": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", + "merkleTreeHook": "0x149db7afD694722747035d5AEC7007ccb6F8f112", + "aggregationHook": "0x8464aF853363B8d6844070F68b0AB34Cb6523d0F", + "protocolFee": "0xd83A4F747fE80Ed98839e05079B1B7Fe037b1638", + "validatorAnnounce": "0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9", + "index": { + "from": 437384 + }, + "signer": { + "signerType": "hexKey", + "key": "0x5486418967eabc770b0fcb995f7ef6d9a72f7fc195531ef76c5109f44f51af26" + } + }, + "neutron": { + "name": "neutron", + "domainId": "1853125230", + "chainId": "neutron-1", + "mailbox": "0x848426d50eb2104d5c6381ec63757930b1c14659c40db8b8081e516e7c5238fc", + "interchainGasPaymaster": "0x504ee9ac43ec5814e00c7d21869a90ec52becb489636bdf893b7df9d606b5d67", + "validatorAnnounce": "0xf3aa0d652226e21ae35cd9035c492ae41725edc9036edf0d6a48701b153b90a0", + "merkleTreeHook": "0xcd30a0001cc1f436c41ef764a712ebabc5a144140e3fd03eafe64a9a24e4e27c", + "protocol": "cosmos", + "finalityBlocks": 1, + "rpcUrls": [ + { + "http": "https://rpc-kralum.neutron-1.neutron.org" + } + ], + "grpcUrl": "https://grpc-kralum.neutron-1.neutron.org:80", + "canonicalAsset": "untrn", + "prefix": "neutron", + "index": { + "from": 4000000, + "chunk": 100000 + }, + "signer": { + "signerType": "cosmosKey", + "key": "0x5486418967eabc770b0fcb995f7ef6d9a72f7fc195531ef76c5109f44f51af26", + "prefix": "neutron" } }, "moonbeam": { From 9d01ee8d09e38c575de68f885d05374ee7db4cce Mon Sep 17 00:00:00 2001 From: Nam Chu Hoai Date: Tue, 24 Oct 2023 21:29:41 -0400 Subject: [PATCH 116/142] Update mainnet config in rust --- rust/config/mainnet3_config.json | 75 +------------------------------- 1 file changed, 1 insertion(+), 74 deletions(-) diff --git a/rust/config/mainnet3_config.json b/rust/config/mainnet3_config.json index 73761219ba..8354fd51b1 100644 --- a/rust/config/mainnet3_config.json +++ b/rust/config/mainnet3_config.json @@ -370,80 +370,7 @@ "protocolFee": "0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88", "validatorAnnounce": "0x87ED6926abc9E38b9C7C19f835B41943b622663c", "index": { - "from": 30696004 - } - }, - "mantapacific": { - "protocol": "ethereum", - "domainId": 169, - "chainId": 169, - "name": "mantapacific", - "displayName": "Manta Pacific", - "displayNameShort": "Manta", - "nativeToken": { - "name": "Ether", - "symbol": "ETH", - "decimals": 18 - }, - "blocks": { - "confirmations": 1, - "reorgPeriod": 0, - "estimateBlockTime": 3 - }, - "rpcUrls": [ - { - "http": "https://pacific-rpc.manta.network/http" - } - ], - "isTestnet": false, - "merkleRootMultisigIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", - "messageIdMultisigIsmFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", - "aggregationIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", - "aggregationHookFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", - "routingIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", - "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", - "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", - "domainRoutingIsm": "0xDEed16fe4b1c9b2a93483EDFf34C77A9b57D31Ff", - "storageGasOracle": "0x19dc38aeae620380430C200a6E990D5Af5480117", - "interchainGasPaymaster": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", - "merkleTreeHook": "0x149db7afD694722747035d5AEC7007ccb6F8f112", - "aggregationHook": "0x8464aF853363B8d6844070F68b0AB34Cb6523d0F", - "protocolFee": "0xd83A4F747fE80Ed98839e05079B1B7Fe037b1638", - "validatorAnnounce": "0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9", - "index": { - "from": 437384 - }, - "signer": { - "signerType": "hexKey", - "key": "0x5486418967eabc770b0fcb995f7ef6d9a72f7fc195531ef76c5109f44f51af26" - } - }, - "neutron": { - "name": "neutron", - "domainId": "1853125230", - "chainId": "neutron-1", - "mailbox": "0x848426d50eb2104d5c6381ec63757930b1c14659c40db8b8081e516e7c5238fc", - "interchainGasPaymaster": "0x504ee9ac43ec5814e00c7d21869a90ec52becb489636bdf893b7df9d606b5d67", - "validatorAnnounce": "0xf3aa0d652226e21ae35cd9035c492ae41725edc9036edf0d6a48701b153b90a0", - "merkleTreeHook": "0xcd30a0001cc1f436c41ef764a712ebabc5a144140e3fd03eafe64a9a24e4e27c", - "protocol": "cosmos", - "finalityBlocks": 1, - "rpcUrls": [ - { - "http": "https://rpc-kralum.neutron-1.neutron.org" - } - ], - "grpcUrl": "https://grpc-kralum.neutron-1.neutron.org:80", - "canonicalAsset": "untrn", - "prefix": "neutron", - "index": { - "from": 4000000, - "chunk": 100000 - }, - "signer": { - "signerType": "cosmosKey", - "key": "0x5486418967eabc770b0fcb995f7ef6d9a72f7fc195531ef76c5109f44f51af26", - "prefix": "neutron" + "from": 30623434 } }, "moonbeam": { From 7acc566cc15c6290dd5a788de62e71060e72af32 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Mon, 30 Oct 2023 12:00:50 +0000 Subject: [PATCH 117/142] Fully move from signerType -> type --- rust/config/mainnet3_config.json | 73 ++++++++++++++++++++++ rust/utils/run-locally/src/cosmos/types.rs | 2 +- 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/rust/config/mainnet3_config.json b/rust/config/mainnet3_config.json index 8354fd51b1..babf2d4332 100644 --- a/rust/config/mainnet3_config.json +++ b/rust/config/mainnet3_config.json @@ -373,6 +373,79 @@ "from": 30623434 } }, + "mantapacific": { + "protocol": "ethereum", + "domainId": 169, + "chainId": 169, + "name": "mantapacific", + "displayName": "Manta Pacific", + "displayNameShort": "Manta", + "nativeToken": { + "name": "Ether", + "symbol": "ETH", + "decimals": 18 + }, + "blocks": { + "confirmations": 1, + "reorgPeriod": 0, + "estimateBlockTime": 3 + }, + "rpcUrls": [ + { + "http": "https://pacific-rpc.manta.network/http" + } + ], + "isTestnet": false, + "merkleRootMultisigIsmFactory": "0x8F7454AC98228f3504Bb91eA3D8Adafe6406110A", + "messageIdMultisigIsmFactory": "0xEb9FcFDC9EfDC17c1EC5E1dc085B98485da213D6", + "aggregationIsmFactory": "0x1052eF3419f26Bec74Ed7CEf4a4FA6812Bc09908", + "aggregationHookFactory": "0x0761b0827849abbf7b0cC09CE14e1C93D87f5004", + "routingIsmFactory": "0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1", + "proxyAdmin": "0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7", + "mailbox": "0x3a464f746D23Ab22155710f44dB16dcA53e0775E", + "domainRoutingIsm": "0xDEed16fe4b1c9b2a93483EDFf34C77A9b57D31Ff", + "storageGasOracle": "0x19dc38aeae620380430C200a6E990D5Af5480117", + "interchainGasPaymaster": "0x0D63128D887159d63De29497dfa45AFc7C699AE4", + "merkleTreeHook": "0x149db7afD694722747035d5AEC7007ccb6F8f112", + "aggregationHook": "0x8464aF853363B8d6844070F68b0AB34Cb6523d0F", + "protocolFee": "0xd83A4F747fE80Ed98839e05079B1B7Fe037b1638", + "validatorAnnounce": "0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9", + "index": { + "from": 437384 + }, + "signer": { + "type": "hexKey", + "key": "0x5486418967eabc770b0fcb995f7ef6d9a72f7fc195531ef76c5109f44f51af26" + } + }, + "neutron": { + "name": "neutron", + "domainId": "1853125230", + "chainId": "neutron-1", + "mailbox": "0x848426d50eb2104d5c6381ec63757930b1c14659c40db8b8081e516e7c5238fc", + "interchainGasPaymaster": "0x504ee9ac43ec5814e00c7d21869a90ec52becb489636bdf893b7df9d606b5d67", + "validatorAnnounce": "0xf3aa0d652226e21ae35cd9035c492ae41725edc9036edf0d6a48701b153b90a0", + "merkleTreeHook": "0xcd30a0001cc1f436c41ef764a712ebabc5a144140e3fd03eafe64a9a24e4e27c", + "protocol": "cosmos", + "finalityBlocks": 1, + "rpcUrls": [ + { + "http": "https://rpc-kralum.neutron-1.neutron.org" + } + ], + "grpcUrl": "https://grpc-kralum.neutron-1.neutron.org:80", + "canonicalAsset": "untrn", + "prefix": "neutron", + "index": { + "from": 4000000, + "chunk": 100000 + }, + "signer": { + "type": "cosmosKey", + "key": "0x5486418967eabc770b0fcb995f7ef6d9a72f7fc195531ef76c5109f44f51af26", + "prefix": "neutron" + } + }, "moonbeam": { "chainId": 1284, "domainId": 1284, diff --git a/rust/utils/run-locally/src/cosmos/types.rs b/rust/utils/run-locally/src/cosmos/types.rs index 08cc30d7c4..8632687b15 100644 --- a/rust/utils/run-locally/src/cosmos/types.rs +++ b/rust/utils/run-locally/src/cosmos/types.rs @@ -91,7 +91,7 @@ pub struct AgentConfigAddrs { #[derive(serde::Serialize, serde::Deserialize, Clone, Debug)] pub struct AgentConfigSigner { - #[serde(rename = "signerType")] + #[serde(rename = "type")] pub typ: String, pub key: String, pub prefix: String, From d1f1361541481bc9a193a65e54f63f93e9bf42b1 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Tue, 31 Oct 2023 10:29:20 +0000 Subject: [PATCH 118/142] Remove mantapacific signer in light of https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/2875 --- rust/config/mainnet3_config.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/rust/config/mainnet3_config.json b/rust/config/mainnet3_config.json index babf2d4332..d6489e6617 100644 --- a/rust/config/mainnet3_config.json +++ b/rust/config/mainnet3_config.json @@ -412,10 +412,6 @@ "validatorAnnounce": "0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9", "index": { "from": 437384 - }, - "signer": { - "type": "hexKey", - "key": "0x5486418967eabc770b0fcb995f7ef6d9a72f7fc195531ef76c5109f44f51af26" } }, "neutron": { From 985b2d785f4cec4617034ac31555b33b2a696941 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Tue, 31 Oct 2023 11:48:50 +0000 Subject: [PATCH 119/142] Explicitly parse U256 gas payment data as dec strs --- rust/chains/hyperlane-cosmos/src/interchain_gas.rs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index 9da6ee2470..4543306469 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -103,17 +103,15 @@ impl CosmosInterchainGasPaymasterIndexer { } "payment" => res.payment = value.parse().unwrap(), "cGF5bWVudA==" => { - res.payment = String::from_utf8(STANDARD.decode(value).unwrap()) - .unwrap() - .parse() - .unwrap() + let dec_str = String::from_utf8(STANDARD.decode(value).unwrap()).unwrap(); + // U256's from_str assumes a radix of 16, so we explicitly use from_dec_str. + res.payment = U256::from_dec_str(dec_str.as_str()).unwrap(); } "gas_amount" => res.gas_amount = value.parse().unwrap(), "Z2FzX2Ftb3VudA==" => { - res.gas_amount = String::from_utf8(STANDARD.decode(value).unwrap()) - .unwrap() - .parse() - .unwrap() + let dec_str = String::from_utf8(STANDARD.decode(value).unwrap()).unwrap(); + // U256's from_str assumes a radix of 16, so we explicitly use from_dec_str. + res.gas_amount = U256::from_dec_str(dec_str.as_str()).unwrap(); } "dest_domain" => res.destination = value.parse().unwrap(), "ZGVzdF9kb21haW4=" => { From f558a61413c726675b46d06c8fcbdd60bca60164 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Tue, 31 Oct 2023 17:24:05 +0000 Subject: [PATCH 120/142] Remove second neutron config --- rust/config/testnet_config.json | 58 -------------------- rust/config/testnet_neutron_config.json | 70 ------------------------- 2 files changed, 128 deletions(-) delete mode 100644 rust/config/testnet_config.json delete mode 100644 rust/config/testnet_neutron_config.json diff --git a/rust/config/testnet_config.json b/rust/config/testnet_config.json deleted file mode 100644 index ca02ba7fe9..0000000000 --- a/rust/config/testnet_config.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "chains": { - "goerli": { - "chainId": 5, - "domainId": 5, - "name": "goerli", - "protocol": "ethereum", - "displayName": "Goerli", - "nativeToken": { - "name": "Ether", - "symbol": "ETH", - "decimals": 18 - }, - "rpcUrls": [ - { - "http": "https://goerli.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161" - }, - { - "http": "https://rpc.ankr.com/eth_goerli" - }, - { - "http": "https://eth-goerli.public.blastapi.io" - } - ], - "blockExplorers": [ - { - "name": "Etherscan", - "url": "https://goerli.etherscan.io", - "apiUrl": "https://api-goerli.etherscan.io/api", - "family": "etherscan" - } - ], - "blocks": { - "confirmations": 1, - "reorgPeriod": 2, - "estimateBlockTime": 13 - }, - "isTestnet": true, - "merkleRootMultisigIsmFactory": "0x8e43aCfb338B137A3befd9b92BfD84E128adE0B8", - "messageIdMultisigIsmFactory": "0xDdB54502A8e2a31C48148C62A8a9E83a693d6173", - "aggregationIsmFactory": "0x8a176773d54292123d271FA0B9C7C8Def4c3a31b", - "aggregationHookFactory": "0x6bc243963f80AEa80948e8538bB114d4122DD9c5", - "routingIsmFactory": "0xd16c3f34d6A2e62185aC61f76F83D3AA1E969018", - "proxyAdmin": "0x0EdB3604D230963ecE9d83963164CFe2fDef576B", - "defaultIsm": "0x8BbdB0023ef47992b3E83E2B1B290D72A7477EfE", - "storageGasOracle": "0xeC34c715ee6d050b2172E8aF650Db779561266C1", - "interchainGasPaymaster": "0x0cD26594ea6c6526927C0F5225AC09F6288e7140", - "aggregationHook": "0x2dF77b3efe9B8f9aEDf7bFC86f40B048178d8116", - "protocolFee": "0x9293B8dAcA7933765de499C992B0Fa86Bb104b0f", - "merkleTreeHook": "0x28c294C61D3dE053462d2Cfa5d5f8c8D70605A59", - "mailbox": "0x49cfd6Ef774AcAb14814D699e3F7eE36Fdfba932", - "validatorAnnounce": "0x3c182AD9cA8A71bc107Ef440C2667E8360e1158E", - "index": { - "from": 9816044 - } - } - } -} diff --git a/rust/config/testnet_neutron_config.json b/rust/config/testnet_neutron_config.json deleted file mode 100644 index 277521e1a2..0000000000 --- a/rust/config/testnet_neutron_config.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "chains": { - "neutrontestnet": { - "name": "neutrontestnet", - "domainId": "33333", - "chainId": "duality-devnet", - "mailbox": "0xdb33c78ca39541dd740659fbfd86fdd601fe7225f10f26e87595c5b8df6bdcda", - "interchainGasPaymaster": "0xae38a168ced2b1cdafd7da5de2fbd22749b1ab52e88cd0b121f750a6c20a2814", - "validatorAnnounce": "0x29d5f702a35d4135d98abf52c62ddc0cfd74001663ec14d284edff7d0419fb58", - "merkleTreeHook": "0xb6aac0c4650129ded8e645e6ef8dcbba710623b826e5a1dae34158a27247c668", - "protocol": "cosmos", - "finalityBlocks": 1, - "rpcUrls": [ - { - "http": "http://54.149.31.83:26657" - } - ], - "grpcUrl": "http://52.43.22.152:9090", - "canonicalAsset": "token", - "prefix": "dual", - "index": { - "from": 1, - "chunk": 1000 - } - }, - "mantapacific": { - "name": "mantapacific", - "chainId": 169, - "domainId": 169, - "mailbox": "0x0A7F6aa5E928B53A3dfF154F26Fe0E883e4caC8D", - "interchainGasPaymaster": "0x1F86c5BB07384563816dE6D3246f306e4172FD8E", - "merkleTreeHook": "0xC569fe1C671A26A2Ecd775d931b63a6635Aa6081", - "validatorAnnounce": "0xaA318551A1B5C89dfC9544d8eFD8e584a88cf925", - "protocol": "ethereum", - "finalityBlocks": 1, - "rpcUrls": [ - { - "http": "https://pacific-rpc.manta.network/http" - } - ], - "index": { - "from": 400000, - "chunk": 5000 - } - }, - "neutron": { - "name": "neutron", - "domainId": "1853125230", - "chainId": "neutron-1", - "mailbox": "0xe735d1ad5ee30305c761a4699372722958f0e75f9520f3f4a84d6f5c8c97990b", - "interchainGasPaymaster": "0x809c8b1cee2ef86e94162a4254e9c8fed0868feccc173e9a296cc84d0f1a6b5f", - "validatorAnnounce": "0x932666c15f2316c491ad2437d971a18cdd25366a9d3b10efdc3b52cd66126fea", - "merkleTreeHook": "0xef2f5da7b32852be4d65fcbac90d970dd877a5350c99303749e4dc29c6006bd9", - "protocol": "cosmos", - "finalityBlocks": 1, - "rpcUrls": [ - { - "http": "https://rpc-kralum.neutron-1.neutron.org" - } - ], - "grpcUrl": "https://grpc-kralum.neutron-1.neutron.org:80", - "canonicalAsset": "untrn", - "prefix": "neutron", - "index": { - "from": 4000000, - "chunk": 100000 - } - } - } -} From 4d4dce4b913d3e6b22ec9ae175d0f29b4618d587 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Tue, 31 Oct 2023 12:39:17 +0000 Subject: [PATCH 121/142] Cosmos cleanup 0 (#2876) ### Description Addresses a handful of issues in https://github.com/hyperlane-xyz/hyperlane-monorepo/pull/2865 ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- rust/agents/validator/src/validator.rs | 70 ------------------- rust/build | 20 ------ rust/chains/hyperlane-cosmos/.gitignore | 1 - .../hyperlane-cosmos/src/aggregation_ism.rs | 22 ++---- .../hyperlane-cosmos/src/interchain_gas.rs | 35 +--------- rust/chains/hyperlane-cosmos/src/mailbox.rs | 2 +- .../hyperlane-cosmos/src/merkle_tree_hook.rs | 2 +- .../src/payloads/aggregate_ism.rs | 19 ++++- 8 files changed, 23 insertions(+), 148 deletions(-) delete mode 100755 rust/build delete mode 100644 rust/chains/hyperlane-cosmos/.gitignore diff --git a/rust/agents/validator/src/validator.rs b/rust/agents/validator/src/validator.rs index e70a50a69f..bc9ba325b4 100644 --- a/rust/agents/validator/src/validator.rs +++ b/rust/agents/validator/src/validator.rs @@ -308,73 +308,3 @@ impl Validator { Ok(()) } } - -#[cfg(test)] -mod test { - use std::str::FromStr; - - use ethers::{ - signers::Wallet, - utils::{self}, - }; - use hyperlane_core::{Announcement, HyperlaneSigner, Signable, H256}; - use hyperlane_ethereum::Signers; - use k256::ecdsa::SigningKey; - - #[tokio::test] - async fn sign_manual() -> eyre::Result<()> { - let test_key = "45bde72a537e11d1cef58836d9278268fd393c0400852ce045fc0c2de7bbe90d"; - - let cases = [( - "0xf9e25a6be80f6d48727e42381fc3c3b7834c0cb4", - "0xcb4530690c80917c7e412498e7258fff4569857b2aae8e020091cf2d75730656", - 26657, - "file:///var/folders/3v/g38z040x54x8l6b160vv66b40000gn/T/.tmpY4ofw1/checkpoint", - )]; - - let to_announcement = |c: (&str, &str, u32, &str)| -> eyre::Result { - let validator = hyperlane_core::H160::from_str(c.0)?; - let mailbox_address = hyperlane_core::H256::from_str(c.1)?; - let mailbox_domain = c.2; - let storage_location = c.3.to_string(); - - Ok(Announcement { - validator, - mailbox_address, - mailbox_domain, - storage_location, - }) - }; - - for c in cases { - let announcement = to_announcement(c)?; - let hash = announcement.signing_hash(); - - // eth sign - let eth_signer = Signers::Local(Wallet::from_str(test_key)?); - let eth_sign = eth_signer.sign_hash(&hash).await?; - let eth_sign_raw = eth_sign.to_vec(); - - // raw sign - let cosmos_sign_raw = { - let signing_key = - SigningKey::from_bytes(H256::from_str(test_key)?.as_bytes().into())?; - - let message = hash.as_ref(); - let message_hash = utils::hash_message(message); // ERC-191 - - let (sign, recov) = - signing_key.sign_prehash_recoverable(message_hash.as_bytes())?; - - let mut sign_raw = sign.to_vec(); - sign_raw.push(recov.to_byte() + 27); // ERC-155 - - sign_raw - }; - - assert_eq!(eth_sign_raw, cosmos_sign_raw); - } - - Ok(()) - } -} diff --git a/rust/build b/rust/build deleted file mode 100755 index 807b06cac6..0000000000 --- a/rust/build +++ /dev/null @@ -1,20 +0,0 @@ -TAG=$1 -USE_DEFAULT_PLATFORM=$2 -if [[ -z $TAG ]]; then - TAG="sha-$(git rev-parse --short HEAD)" - echo "Defaulting to tag $TAG" - - if [[ ! -z $(git status -s) ]]; then - echo "Note there are uncommitted changes" - fi - - # Apple M1 chips by default will build for arm64, which isn't compatible - # with our K8s setup. By manually building for amd64, we build an image - # compatible with our K8s infrastructure. - # More info: https://stackoverflow.com/a/71102144 - if [[ $USE_DEFAULT_PLATFORM != "true" ]]; then - PLATFORM="--platform=linux/amd64" - fi -fi - -DOCKER_BUILDKIT=1 docker build $PLATFORM -t gcr.io/abacus-labs-dev/hyperlane-agent:$TAG . diff --git a/rust/chains/hyperlane-cosmos/.gitignore b/rust/chains/hyperlane-cosmos/.gitignore deleted file mode 100644 index 7040d337ab..0000000000 --- a/rust/chains/hyperlane-cosmos/.gitignore +++ /dev/null @@ -1 +0,0 @@ -src/contracts \ No newline at end of file diff --git a/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs b/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs index 30f123bf1a..772a552e25 100644 --- a/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs @@ -1,25 +1,21 @@ use crate::{ grpc::{WasmGrpcProvider, WasmProvider}, - payloads::aggregate_ism::{ - ModulesAndThresholdRequest, ModulesAndThresholdRequestInner, ModulesAndThresholdResponse, - }, + payloads::aggregate_ism::{ModulesAndThresholdRequest, ModulesAndThresholdResponse}, verify::bech32_decode, ConnectionConf, CosmosProvider, Signer, }; use async_trait::async_trait; use hyperlane_core::{ AggregationIsm, ChainResult, ContractLocator, HyperlaneChain, HyperlaneContract, - HyperlaneDomain, HyperlaneMessage, HyperlaneProvider, RawHyperlaneMessage, H256, + HyperlaneDomain, HyperlaneMessage, HyperlaneProvider, H256, }; use tracing::instrument; /// A reference to an AggregationIsm contract on some Cosmos chain #[derive(Debug)] pub struct CosmosAggregationIsm { - _conf: ConnectionConf, domain: HyperlaneDomain, address: H256, - _signer: Signer, provider: Box, } @@ -29,10 +25,8 @@ impl CosmosAggregationIsm { let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); Self { - _conf: conf, domain: locator.domain.clone(), address: locator.address, - _signer: signer, provider: Box::new(provider), } } @@ -61,20 +55,12 @@ impl AggregationIsm for CosmosAggregationIsm { &self, message: &HyperlaneMessage, ) -> ChainResult<(Vec, u8)> { - let payload = ModulesAndThresholdRequest { - modules_and_threshold: ModulesAndThresholdRequestInner { - message: hex::encode(RawHyperlaneMessage::from(message)), - }, - }; + let payload = ModulesAndThresholdRequest::new(message); let data = self.provider.wasm_query(payload, None).await?; let response: ModulesAndThresholdResponse = serde_json::from_slice(&data)?; - let modules: Vec = response - .modules - .iter() - .map(|module| bech32_decode(module.clone())) - .collect(); + let modules: Vec = response.modules.into_iter().map(bech32_decode).collect(); Ok((modules, response.threshold)) } diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index 4543306469..34b881cf19 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -8,7 +8,6 @@ use hyperlane_core::{ }; use hyperlane_core::{HyperlaneDomain, HyperlaneProvider, InterchainGasPayment, LogMeta, H256}; use std::ops::RangeInclusive; -use tracing::info; use crate::grpc::WasmGrpcProvider; use crate::rpc::{CosmosWasmIndexer, WasmIndexer}; @@ -18,11 +17,8 @@ use crate::{ConnectionConf, CosmosProvider}; /// A reference to a InterchainGasPaymaster contract on some Cosmos chain #[derive(Debug)] pub struct CosmosInterchainGasPaymaster { - _conf: ConnectionConf, domain: HyperlaneDomain, address: H256, - _signer: Signer, - _provider: Box, } impl HyperlaneContract for CosmosInterchainGasPaymaster { @@ -49,11 +45,8 @@ impl CosmosInterchainGasPaymaster { let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); Self { - _conf: conf, domain: locator.domain.clone(), address: locator.address, - _signer: signer, - _provider: Box::new(provider), } } } @@ -145,36 +138,10 @@ impl Indexer for CosmosInterchainGasPaymasterIndexer { } } -#[async_trait] -impl Indexer for CosmosInterchainGasPaymasterIndexer { - async fn fetch_logs(&self, range: RangeInclusive) -> ChainResult> { - let parser = self.get_parser(); - let result = self.indexer.get_range_event_logs(range, parser).await?; - - Ok(result - .into_iter() - .map(|(msg, meta)| (msg.message_id, meta)) - .collect()) - } - - async fn get_finalized_block_number(&self) -> ChainResult { - self.indexer.latest_block_height().await - } -} - #[async_trait] impl SequenceIndexer for CosmosInterchainGasPaymasterIndexer { async fn sequence_and_tip(&self) -> ChainResult<(Option, u32)> { - // TODO: implement when sealevel scraper support is implemented - let tip = self.indexer.latest_block_height().await?; - Ok((None, tip)) - } -} - -#[async_trait] -impl SequenceIndexer for CosmosInterchainGasPaymasterIndexer { - async fn sequence_and_tip(&self) -> ChainResult<(Option, u32)> { - // TODO: implement when sealevel scraper support is implemented + // TODO: implement when cosmwasm scraper support is implemented let tip = self.indexer.latest_block_height().await?; Ok((None, tip)) } diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 5aedb4d63d..0b15896317 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -250,7 +250,7 @@ impl CosmosMailboxIndexer { fn get_parser(&self) -> fn(attrs: Vec) -> Option { |attrs: Vec| -> Option { - let mut res = HyperlaneMessage::default(); + let res = HyperlaneMessage::default(); for attr in attrs { let key = attr.key.as_str(); diff --git a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs index 53a01f5684..2eb3f8d446 100644 --- a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs +++ b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -8,7 +8,7 @@ use hyperlane_core::{ HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneProvider, Indexer, LogMeta, MerkleTreeHook, MerkleTreeInsertion, SequenceIndexer, H256, }; -use tracing::{info, instrument}; +use tracing::instrument; use crate::{ grpc::{WasmGrpcProvider, WasmProvider}, diff --git a/rust/chains/hyperlane-cosmos/src/payloads/aggregate_ism.rs b/rust/chains/hyperlane-cosmos/src/payloads/aggregate_ism.rs index a06d6379d3..7bb5d40d09 100644 --- a/rust/chains/hyperlane-cosmos/src/payloads/aggregate_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/payloads/aggregate_ism.rs @@ -1,17 +1,30 @@ +use hyperlane_core::{HyperlaneMessage, RawHyperlaneMessage}; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Debug)] pub struct ModulesAndThresholdRequest { - pub modules_and_threshold: ModulesAndThresholdRequestInner, + modules_and_threshold: ModulesAndThresholdRequestInner, +} + +impl ModulesAndThresholdRequest { + pub fn new(message: &HyperlaneMessage) -> Self { + Self { + modules_and_threshold: ModulesAndThresholdRequestInner { + message: hex::encode(RawHyperlaneMessage::from(message)), + }, + } + } } #[derive(Serialize, Deserialize, Debug)] -pub struct ModulesAndThresholdRequestInner { - pub message: String, // hexbinary +struct ModulesAndThresholdRequestInner { + /// Hex-encoded Hyperlane message + pub message: String, } #[derive(Serialize, Deserialize, Debug)] pub struct ModulesAndThresholdResponse { pub threshold: u8, + /// Bech32-encoded module addresses pub modules: Vec, } From df741d86f727558080dd36f2d03794ea3be03f3a Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Wed, 1 Nov 2023 10:11:03 +0000 Subject: [PATCH 122/142] add neutrontestnet into testnet4_config.json --- rust/config/testnet4_config.json | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/rust/config/testnet4_config.json b/rust/config/testnet4_config.json index d0fbd12598..f55f051f15 100644 --- a/rust/config/testnet4_config.json +++ b/rust/config/testnet4_config.json @@ -1009,5 +1009,28 @@ } } }, + "neutrontestnet": { + "name": "neutrontestnet", + "domainId": "33333", + "chainId": "duality-devnet", + "mailbox": "0xdb33c78ca39541dd740659fbfd86fdd601fe7225f10f26e87595c5b8df6bdcda", + "interchainGasPaymaster": "0xae38a168ced2b1cdafd7da5de2fbd22749b1ab52e88cd0b121f750a6c20a2814", + "validatorAnnounce": "0x29d5f702a35d4135d98abf52c62ddc0cfd74001663ec14d284edff7d0419fb58", + "merkleTreeHook": "0xb6aac0c4650129ded8e645e6ef8dcbba710623b826e5a1dae34158a27247c668", + "protocol": "cosmos", + "finalityBlocks": 1, + "rpcUrls": [ + { + "http": "http://54.149.31.83:26657" + } + ], + "grpcUrl": "http://52.43.22.152:9090", + "canonicalAsset": "token", + "prefix": "dual", + "index": { + "from": 1, + "chunk": 1000 + } + }, "defaultRpcConsensusType": "fallback" } \ No newline at end of file From 6e3dee68e680db732fe6890dbe0eaa139726b31c Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Tue, 31 Oct 2023 19:12:40 +0000 Subject: [PATCH 123/142] Fix lag issue with Mailbox message sequence_and_tip (#2879) ### Description The old implementation of the `sequence_and_tip` fn in mailbox.rs used to look like this, where it'd end up passing the tip as the lag! ``` let sequence = match NonZeroU64::new(tip as u64) { None => None, Some(n) => Some(self.nonce(Some(n)).await?), }; ``` Shuffled things around where we correctly just specify the `tip` as the block number instead of a lag. This means that all functions that were calling `wasm_query` with the lag needed to start getting the lagged block num instead Sometimes I believe this would create a bug where we'd ask for a block height 1 and get back RPC errors. I believe most of the time we'd ask for a block height of 0, in which case it'd just act like we were asking for the tip ### Drive-by changes n/a ### Related issues n/a ### Backward compatibility n/a ### Testing plan to roll it out once I get an image --- rust/chains/hyperlane-cosmos/src/lib.rs | 1 + rust/chains/hyperlane-cosmos/src/mailbox.rs | 98 ++++++------------- .../hyperlane-cosmos/src/merkle_tree_hook.rs | 13 ++- .../hyperlane-cosmos/src/providers/grpc.rs | 41 ++------ rust/chains/hyperlane-cosmos/src/utils.rs | 23 +++++ 5 files changed, 71 insertions(+), 105 deletions(-) create mode 100644 rust/chains/hyperlane-cosmos/src/utils.rs diff --git a/rust/chains/hyperlane-cosmos/src/lib.rs b/rust/chains/hyperlane-cosmos/src/lib.rs index ce1a211558..0480f72f5a 100644 --- a/rust/chains/hyperlane-cosmos/src/lib.rs +++ b/rust/chains/hyperlane-cosmos/src/lib.rs @@ -17,6 +17,7 @@ mod providers; mod routing_ism; mod signers; mod trait_builder; +mod utils; mod validator_announce; pub use self::{ diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 0b15896317..690c2375cb 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -11,7 +11,7 @@ use crate::payloads::mailbox::{ use crate::payloads::{general, mailbox}; use crate::rpc::{CosmosWasmIndexer, WasmIndexer}; use crate::CosmosProvider; -use crate::{signers::Signer, verify, ConnectionConf}; +use crate::{signers::Signer, utils::get_block_height_for_lag, verify, ConnectionConf}; use async_trait::async_trait; use cosmrs::proto::cosmos::base::abci::v1beta1::TxResponse; @@ -40,8 +40,7 @@ impl CosmosMailbox { /// Create a reference to a mailbox at a specific Ethereum address on some /// chain pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { - let provider: WasmGrpcProvider = - WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); Self { _conf: conf, @@ -80,22 +79,8 @@ impl Debug for CosmosMailbox { impl Mailbox for CosmosMailbox { #[instrument(level = "debug", err, ret, skip(self))] async fn count(&self, lag: Option) -> ChainResult { - let payload = mailbox::NonceRequest { - nonce: general::EmptyStruct {}, - }; - - let data = self - .provider - .wasm_query(GeneralMailboxQuery { mailbox: payload }, lag) - .await; - - if let Err(e) = data { - warn!("error: {:?}", e); - return Ok(0); - } - - let response: mailbox::NonceResponse = serde_json::from_slice(&data?)?; - Ok(response.nonce) + let block_height = get_block_height_for_lag(&self.provider, lag).await?; + self.nonce_at_block(block_height).await } #[instrument(level = "debug", err, ret, skip(self))] @@ -222,11 +207,29 @@ impl Mailbox for CosmosMailbox { } } +impl CosmosMailbox { + #[instrument(level = "debug", err, ret, skip(self))] + async fn nonce_at_block(&self, block_height: Option) -> ChainResult { + let payload = mailbox::NonceRequest { + nonce: general::EmptyStruct {}, + }; + + let data = self + .provider + .wasm_query(GeneralMailboxQuery { mailbox: payload }, block_height) + .await?; + + let response: mailbox::NonceResponse = serde_json::from_slice(&data)?; + + Ok(response.nonce) + } +} + /// Struct that retrieves event data for a Cosmos Mailbox contract #[derive(Debug)] pub struct CosmosMailboxIndexer { + mailbox: CosmosMailbox, indexer: Box, - provider: Box, } impl CosmosMailboxIndexer { @@ -238,13 +241,12 @@ impl CosmosMailboxIndexer { signer: Signer, event_type: String, ) -> Self { - let indexer: CosmosWasmIndexer = - CosmosWasmIndexer::new(conf.clone(), locator.clone(), event_type.clone()); - let provider: WasmGrpcProvider = WasmGrpcProvider::new(conf, locator, signer); + let mailbox = CosmosMailbox::new(conf.clone(), locator.clone(), signer.clone()); + let indexer: CosmosWasmIndexer = CosmosWasmIndexer::new(conf, locator, event_type); Self { + mailbox, indexer: Box::new(indexer), - provider: Box::new(provider), } } @@ -280,37 +282,6 @@ impl CosmosMailboxIndexer { None } } - - #[instrument(level = "debug", err, ret, skip(self))] - async fn count(&self, lag: Option) -> ChainResult { - let payload = mailbox::NonceRequest { - nonce: general::EmptyStruct {}, - }; - - let data = self - .provider - .wasm_query(GeneralMailboxQuery { mailbox: payload }, lag) - .await?; - let response: mailbox::NonceResponse = serde_json::from_slice(&data)?; - - Ok(response.nonce) - } - - #[instrument(level = "debug", err, ret, skip(self))] - async fn nonce(&self, lag: Option) -> ChainResult { - let payload = mailbox::NonceRequest { - nonce: general::EmptyStruct {}, - }; - - let data = self - .provider - .wasm_query(GeneralMailboxQuery { mailbox: payload }, lag) - .await?; - - let response: mailbox::NonceResponse = serde_json::from_slice(&data)?; - - Ok(response.nonce) - } } #[async_trait] @@ -350,29 +321,20 @@ impl Indexer for CosmosMailboxIndexer { #[async_trait] impl SequenceIndexer for CosmosMailboxIndexer { async fn sequence_and_tip(&self) -> ChainResult<(Option, u32)> { - // TODO: implement when cosmos scraper support is implemented let tip = self.indexer.latest_block_height().await?; - let sequence = match NonZeroU64::new(tip as u64) { - None => None, - Some(n) => Some(self.nonce(Some(n)).await?), - }; - - Ok((sequence, tip)) + // No sequence for message deliveries. + Ok((None, tip)) } } #[async_trait] impl SequenceIndexer for CosmosMailboxIndexer { async fn sequence_and_tip(&self) -> ChainResult<(Option, u32)> { - // TODO: implement when cosmos scraper support is implemented let tip = self.indexer.latest_block_height().await?; - let sequence = match NonZeroU64::new(tip as u64) { - None => None, - Some(n) => Some(self.nonce(Some(n)).await?), - }; + let sequence = self.mailbox.nonce_at_block(Some(tip.into())).await?; - Ok((sequence, tip)) + Ok((Some(sequence), tip)) } } diff --git a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs index 2eb3f8d446..d6374b65fb 100644 --- a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs +++ b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -17,6 +17,7 @@ use crate::{ merkle_tree_hook, }, rpc::{CosmosWasmIndexer, WasmIndexer}, + utils::get_block_height_for_lag, ConnectionConf, CosmosProvider, Signer, }; @@ -75,13 +76,15 @@ impl MerkleTreeHook for CosmosMerkleTreeHook { tree: general::EmptyStruct {}, }; + let block_height = get_block_height_for_lag(&self.provider, lag).await?; + let data = self .provider .wasm_query( merkle_tree_hook::MerkleTreeGenericRequest { merkle_hook: payload, }, - lag, + block_height, ) .await?; let response: merkle_tree_hook::MerkleTreeResponse = serde_json::from_slice(&data)?; @@ -108,13 +111,15 @@ impl MerkleTreeHook for CosmosMerkleTreeHook { count: general::EmptyStruct {}, }; + let block_height = get_block_height_for_lag(&self.provider, lag).await?; + let data = self .provider .wasm_query( merkle_tree_hook::MerkleTreeGenericRequest { merkle_hook: payload, }, - lag, + block_height, ) .await?; let response: merkle_tree_hook::MerkleTreeCountResponse = serde_json::from_slice(&data)?; @@ -128,13 +133,15 @@ impl MerkleTreeHook for CosmosMerkleTreeHook { check_point: general::EmptyStruct {}, }; + let block_height = get_block_height_for_lag(&self.provider, lag).await?; + let data = self .provider .wasm_query( merkle_tree_hook::MerkleTreeGenericRequest { merkle_hook: payload, }, - lag, + block_height, ) .await?; let response: merkle_tree_hook::CheckPointResponse = serde_json::from_slice(&data)?; diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index 2925a93443..027294a935 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -24,7 +24,6 @@ use hyperlane_core::{ ChainCommunicationError, ChainResult, ContractLocator, HyperlaneDomain, H256, U256, }; use serde::Serialize; -use std::num::NonZeroU64; use crate::verify; use crate::{signers::Signer, ConnectionConf}; @@ -42,7 +41,7 @@ pub trait WasmProvider: Send + Sync { async fn wasm_query( &self, payload: T, - maybe_lag: Option, + block_height: Option, ) -> ChainResult>; /// query to specific contract address @@ -50,7 +49,7 @@ pub trait WasmProvider: Send + Sync { &self, to: String, payload: T, - maybe_lag: Option, + block_height: Option, ) -> ChainResult>; /// query account info @@ -133,41 +132,19 @@ impl WasmProvider for WasmGrpcProvider { Ok(height as u64) } - async fn wasm_query(&self, payload: T, maybe_lag: Option) -> ChainResult> + async fn wasm_query(&self, payload: T, block_height: Option) -> ChainResult> where T: Serialize + Send + Sync, { - let mut client = WasmQueryClient::connect(self.get_conn_url()?).await?; - - let mut request = tonic::Request::new(QuerySmartContractStateRequest { - address: self.get_contract_addr()?, - query_data: serde_json::to_string(&payload)?.as_bytes().to_vec(), - }); - - if let Some(lag) = maybe_lag { - let height = self.latest_block_height().await?; - let height = height.saturating_sub(lag.get()); - - request - .metadata_mut() - .insert("x-cosmos-block-height", height.into()); - } - - let response = client - .smart_contract_state(request) + self.wasm_query_to(self.get_contract_addr()?, payload, block_height) .await - .map_err(ChainCommunicationError::from_other)? - .into_inner(); - - // TODO: handle query to specific block number - Ok(response.data) } async fn wasm_query_to( &self, to: String, payload: T, - maybe_lag: Option, + block_height: Option, ) -> ChainResult> where T: Serialize + Send + Sync, @@ -178,13 +155,10 @@ impl WasmProvider for WasmGrpcProvider { query_data: serde_json::to_string(&payload)?.as_bytes().to_vec(), }); - if let Some(lag) = maybe_lag { - let height = self.latest_block_height().await?; - let height = height.saturating_sub(lag.get()); - + if let Some(block_height) = block_height { request .metadata_mut() - .insert("x-cosmos-block-height", height.into()); + .insert("x-cosmos-block-height", block_height.into()); } let response = client @@ -193,7 +167,6 @@ impl WasmProvider for WasmGrpcProvider { .map_err(ChainCommunicationError::from_other)? .into_inner(); - // TODO: handle query to specific block number Ok(response.data) } diff --git a/rust/chains/hyperlane-cosmos/src/utils.rs b/rust/chains/hyperlane-cosmos/src/utils.rs new file mode 100644 index 0000000000..86dc4de736 --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/utils.rs @@ -0,0 +1,23 @@ +use std::num::NonZeroU64; + +use crate::grpc::{WasmGrpcProvider, WasmProvider}; +use hyperlane_core::ChainResult; + +/// Given a lag, returns the block height at the moment. +/// If the lag is None, a block height of None is given, indicating that the +/// tip directly can be used. +pub(crate) async fn get_block_height_for_lag( + provider: &WasmGrpcProvider, + lag: Option, +) -> ChainResult> { + let block_height = match lag { + Some(lag) => { + let tip = provider.latest_block_height().await?; + let block_height = tip - lag.get(); + Some(block_height) + } + None => None, + }; + + Ok(block_height) +} From 71984b580761e610bbfeeaff08d9b97f9726e34f Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Wed, 1 Nov 2023 10:39:03 +0000 Subject: [PATCH 124/142] Move neutrontestnet config key oops --- rust/config/testnet4_config.json | 44 ++++++++++++++++---------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/rust/config/testnet4_config.json b/rust/config/testnet4_config.json index f55f051f15..928ba88f18 100644 --- a/rust/config/testnet4_config.json +++ b/rust/config/testnet4_config.json @@ -1007,29 +1007,29 @@ "index": { "from": 4558491 } - } - }, - "neutrontestnet": { - "name": "neutrontestnet", - "domainId": "33333", - "chainId": "duality-devnet", - "mailbox": "0xdb33c78ca39541dd740659fbfd86fdd601fe7225f10f26e87595c5b8df6bdcda", - "interchainGasPaymaster": "0xae38a168ced2b1cdafd7da5de2fbd22749b1ab52e88cd0b121f750a6c20a2814", - "validatorAnnounce": "0x29d5f702a35d4135d98abf52c62ddc0cfd74001663ec14d284edff7d0419fb58", - "merkleTreeHook": "0xb6aac0c4650129ded8e645e6ef8dcbba710623b826e5a1dae34158a27247c668", - "protocol": "cosmos", - "finalityBlocks": 1, - "rpcUrls": [ - { - "http": "http://54.149.31.83:26657" + }, + "neutrontestnet": { + "name": "neutrontestnet", + "domainId": "33333", + "chainId": "duality-devnet", + "mailbox": "0xdb33c78ca39541dd740659fbfd86fdd601fe7225f10f26e87595c5b8df6bdcda", + "interchainGasPaymaster": "0xae38a168ced2b1cdafd7da5de2fbd22749b1ab52e88cd0b121f750a6c20a2814", + "validatorAnnounce": "0x29d5f702a35d4135d98abf52c62ddc0cfd74001663ec14d284edff7d0419fb58", + "merkleTreeHook": "0xb6aac0c4650129ded8e645e6ef8dcbba710623b826e5a1dae34158a27247c668", + "protocol": "cosmos", + "finalityBlocks": 1, + "rpcUrls": [ + { + "http": "http://54.149.31.83:26657" + } + ], + "grpcUrl": "http://52.43.22.152:9090", + "canonicalAsset": "token", + "prefix": "dual", + "index": { + "from": 1, + "chunk": 1000 } - ], - "grpcUrl": "http://52.43.22.152:9090", - "canonicalAsset": "token", - "prefix": "dual", - "index": { - "from": 1, - "chunk": 1000 } }, "defaultRpcConsensusType": "fallback" From 35dcc7d4ae28a3696b7087f96bc5333f5b8f5b00 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Wed, 1 Nov 2023 11:30:36 +0000 Subject: [PATCH 125/142] fix: progress on removing unwraps (#2880) ### Description ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- rust/Cargo.lock | 1 + .../hyperlane-cosmos/src/interchain_gas.rs | 43 +++++++----------- rust/chains/hyperlane-cosmos/src/mailbox.rs | 45 ++++++++++--------- .../hyperlane-cosmos/src/merkle_tree_hook.rs | 36 ++++++--------- .../hyperlane-cosmos/src/providers/rpc.rs | 14 +++--- rust/hyperlane-core/Cargo.toml | 1 + rust/hyperlane-core/src/error.rs | 30 ++++++++----- rust/hyperlane-core/src/types/mod.rs | 2 +- 8 files changed, 84 insertions(+), 88 deletions(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index b4a3125bc0..94408303b5 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -4108,6 +4108,7 @@ version = "0.1.0" dependencies = [ "async-trait", "auto_impl 1.1.0", + "base64 0.21.4", "borsh 0.9.3", "bs58 0.5.0", "bytes", diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index 34b881cf19..0b32b519b9 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -67,15 +67,11 @@ impl CosmosInterchainGasPaymasterIndexer { } } - fn get_parser(&self) -> fn(attrs: Vec) -> Option { - |attrs: Vec| -> Option { - let mut res = InterchainGasPayment { - message_id: H256::zero(), - payment: U256::zero(), - gas_amount: U256::zero(), - destination: 0, - }; - + fn get_parser( + &self, + ) -> fn(attrs: Vec) -> ChainResult> { + |attrs: Vec| -> ChainResult> { + let mut res = InterchainGasPayment::default(); for attr in attrs { let key = attr.key.as_str(); let value = attr.value; @@ -83,41 +79,34 @@ impl CosmosInterchainGasPaymasterIndexer { match key { "message_id" => { - res.message_id = H256::from_slice(hex::decode(value).unwrap().as_slice()) + res.message_id = H256::from_slice(hex::decode(value)?.as_slice()) } "bWVzc2FnZV9pZA==" => { res.message_id = H256::from_slice( - hex::decode( - String::from_utf8(STANDARD.decode(value).unwrap()).unwrap(), - ) - .unwrap() - .as_slice(), + hex::decode(String::from_utf8(STANDARD.decode(value)?)?)?.as_slice(), ) } - "payment" => res.payment = value.parse().unwrap(), + "payment" => res.payment = value.parse()?, "cGF5bWVudA==" => { - let dec_str = String::from_utf8(STANDARD.decode(value).unwrap()).unwrap(); + let dec_str = String::from_utf8(STANDARD.decode(value)?)?; // U256's from_str assumes a radix of 16, so we explicitly use from_dec_str. - res.payment = U256::from_dec_str(dec_str.as_str()).unwrap(); + res.payment = U256::from_dec_str(dec_str.as_str())?; } - "gas_amount" => res.gas_amount = value.parse().unwrap(), + "gas_amount" => res.gas_amount = value.parse()?, "Z2FzX2Ftb3VudA==" => { - let dec_str = String::from_utf8(STANDARD.decode(value).unwrap()).unwrap(); + let dec_str = String::from_utf8(STANDARD.decode(value)?)?; // U256's from_str assumes a radix of 16, so we explicitly use from_dec_str. - res.gas_amount = U256::from_dec_str(dec_str.as_str()).unwrap(); + res.gas_amount = U256::from_dec_str(dec_str.as_str())?; } - "dest_domain" => res.destination = value.parse().unwrap(), + "dest_domain" => res.destination = value.parse()?, "ZGVzdF9kb21haW4=" => { - res.destination = String::from_utf8(STANDARD.decode(value).unwrap()) - .unwrap() - .parse() - .unwrap() + res.destination = String::from_utf8(STANDARD.decode(value)?)?.parse()? } _ => {} } } - Some(res) + Ok(Some(res)) } } } diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 690c2375cb..2c0c0eb9ad 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -24,7 +24,9 @@ use hyperlane_core::{ HyperlaneMessage, HyperlaneProvider, Indexer, LogMeta, Mailbox, TxCostEstimate, TxOutcome, H256, U256, }; -use hyperlane_core::{ContractLocator, Decode, RawHyperlaneMessage, SequenceIndexer}; +use hyperlane_core::{ + ChainCommunicationError, ContractLocator, Decode, RawHyperlaneMessage, SequenceIndexer, +}; use tracing::{instrument, warn}; /// A reference to a Mailbox contract on some Cosmos chain @@ -171,7 +173,7 @@ impl Mailbox for CosmosMailbox { .await?; Ok(TxOutcome { transaction_id: h256_to_h512(H256::from_slice( - hex::decode(response.txhash).unwrap().as_slice(), + hex::decode(response.txhash)?.as_slice(), )), executed: response.code == 0, gas_used: U256::from(response.gas_used), @@ -194,7 +196,14 @@ impl Mailbox for CosmosMailbox { let response: SimulateResponse = self.provider.wasm_simulate(process_message).await?; let result = TxCostEstimate { - gas_limit: U256::from(response.gas_info.unwrap().gas_used), + gas_limit: U256::from( + response + .gas_info + .ok_or(ChainCommunicationError::TxCostEstimateError( + "Failed to estimate gas limit".to_string(), + ))? + .gas_used, + ), gas_price: U256::from(2500), l2_gas_limit: None, }; @@ -250,8 +259,10 @@ impl CosmosMailboxIndexer { } } - fn get_parser(&self) -> fn(attrs: Vec) -> Option { - |attrs: Vec| -> Option { + fn get_parser( + &self, + ) -> fn(attrs: Vec) -> ChainResult> { + |attrs: Vec| -> ChainResult> { let res = HyperlaneMessage::default(); for attr in attrs { @@ -260,26 +271,18 @@ impl CosmosMailboxIndexer { let value = value.as_str(); if key == "message" { - let mut reader = Cursor::new(hex::decode(value).unwrap()); - return Some(HyperlaneMessage::read_from(&mut reader).unwrap()); + let mut reader = Cursor::new(hex::decode(value)?); + return Ok(Some(HyperlaneMessage::read_from(&mut reader)?)); } if key == "bWVzc2FnZQ==" { - let mut reader = Cursor::new( - hex::decode( - String::from_utf8( - base64::engine::general_purpose::STANDARD - .decode(value) - .unwrap(), - ) - .unwrap(), - ) - .unwrap(), - ); - return Some(HyperlaneMessage::read_from(&mut reader).unwrap()); + let mut reader = Cursor::new(hex::decode(String::from_utf8( + base64::engine::general_purpose::STANDARD.decode(value)?, + )?)?); + return Ok(Some(HyperlaneMessage::read_from(&mut reader)?)); } } - None + Ok(None) } } } @@ -304,7 +307,7 @@ impl Indexer for CosmosMailboxIndexer { #[async_trait] impl Indexer for CosmosMailboxIndexer { async fn fetch_logs(&self, range: RangeInclusive) -> ChainResult> { - let parser: fn(Vec) -> Option = self.get_parser(); + let parser = self.get_parser(); let result = self.indexer.get_range_event_logs(range, parser).await?; Ok(result diff --git a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs index d6374b65fb..e6295ac6c1 100644 --- a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs +++ b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -178,8 +178,10 @@ impl CosmosMerkleeTreeHookIndexer { } /// Get the parser for the indexer - fn get_parser(&self) -> fn(attrs: Vec) -> Option { - |attrs: Vec| -> Option { + fn get_parser( + &self, + ) -> fn(attrs: Vec) -> ChainResult> { + |attrs: Vec| -> ChainResult> { let mut message_id = H256::zero(); let mut leaf_index: u32 = 0; let mut attr_count = 0; @@ -191,35 +193,25 @@ impl CosmosMerkleeTreeHookIndexer { match key { "message_id" => { - message_id = H256::from_slice(hex::decode(value).unwrap().as_slice()); + message_id = H256::from_slice(hex::decode(value)?.as_slice()); attr_count += 1; } "index" => { - leaf_index = value.parse().unwrap(); + leaf_index = value.parse::()?; attr_count += 1; } "aW5kZXg=" => { leaf_index = String::from_utf8( - base64::engine::general_purpose::STANDARD - .decode(value) - .unwrap(), - ) - .unwrap() - .parse() - .unwrap(); + base64::engine::general_purpose::STANDARD.decode(value)?, + )? + .parse()?; attr_count += 1; } "bWVzc2FnZV9pZA==" => { message_id = H256::from_slice( - hex::decode( - String::from_utf8( - base64::engine::general_purpose::STANDARD - .decode(value) - .unwrap(), - ) - .unwrap(), - ) - .unwrap() + hex::decode(String::from_utf8( + base64::engine::general_purpose::STANDARD.decode(value)?, + )?)? .as_slice(), ); attr_count += 1; @@ -229,10 +221,10 @@ impl CosmosMerkleeTreeHookIndexer { } if attr_count != 2 { - return None; + return Ok(None); } - Some(MerkleTreeInsertion::new(leaf_index, message_id)) + Ok(Some(MerkleTreeInsertion::new(leaf_index, message_id))) } } } diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index f9777227d6..2d2ad116f9 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -26,7 +26,7 @@ pub trait WasmIndexer: Send + Sync { async fn get_range_event_logs( &self, range: RangeInclusive, - parser: fn(Vec) -> Option, + parser: fn(Vec) -> ChainResult>, ) -> ChainResult> where T: Send + Sync; @@ -93,7 +93,7 @@ impl WasmIndexer for CosmosWasmIndexer { async fn get_range_event_logs( &self, range: RangeInclusive, - parser: fn(Vec) -> Option, + parser: fn(Vec) -> ChainResult>, ) -> ChainResult> where T: Send + Sync, @@ -120,7 +120,7 @@ impl WasmIndexer for CosmosWasmIndexer { let last_page = total_count / PAGINATION_LIMIT as u32 + (total_count % PAGINATION_LIMIT as u32 != 0) as u32; - let handler = |txs: Vec| -> Vec<(T, LogMeta)> { + let handler = |txs: Vec| -> ChainResult> { let mut result: Vec<(T, LogMeta)> = vec![]; let target_type = format!("{}-{}", Self::WASM_TYPE, self.event_type); @@ -137,7 +137,7 @@ impl WasmIndexer for CosmosWasmIndexer { for (log_idx, event) in tx.tx_result.events.clone().into_iter().enumerate() { if event.kind.as_str() == target_type { - if let Some(msg) = parser(event.attributes.clone()) { + if let Some(msg) = parser(event.attributes.clone())? { let meta = LogMeta { address: bech32_decode(contract_address.clone()), block_number: tx.height.value(), @@ -156,10 +156,10 @@ impl WasmIndexer for CosmosWasmIndexer { result.extend(parse_result); } - result + Ok(result) }; - let mut result = handler(tx_search_result.txs); + let mut result = handler(tx_search_result.txs)?; for page in 2..=last_page { debug!(page, "Making tx search RPC"); @@ -174,7 +174,7 @@ impl WasmIndexer for CosmosWasmIndexer { ) .await?; - result.extend(handler(tx_search_result.txs)); + result.extend(handler(tx_search_result.txs)?); } Ok(result) diff --git a/rust/hyperlane-core/Cargo.toml b/rust/hyperlane-core/Cargo.toml index 2730f8f422..f07417da89 100644 --- a/rust/hyperlane-core/Cargo.toml +++ b/rust/hyperlane-core/Cargo.toml @@ -12,6 +12,7 @@ version = { workspace = true } [dependencies] async-trait.workspace = true auto_impl.workspace = true +base64 = { workspace = true } borsh.workspace = true bs58.workspace = true bytes = { workspace = true, features = ["serde"] } diff --git a/rust/hyperlane-core/src/error.rs b/rust/hyperlane-core/src/error.rs index 6c0f705aa5..a69ee46d97 100644 --- a/rust/hyperlane-core/src/error.rs +++ b/rust/hyperlane-core/src/error.rs @@ -6,9 +6,7 @@ use std::ops::Deref; use crate::config::StrOrIntParseError; use cosmrs::proto::prost; use cosmrs::Error as CosmrsError; -// use ethers_contract::ContractError; -// use ethers_core::types::SignatureError; -// use ethers_providers::{Middleware, ProviderError}; +use std::string::FromUtf8Error; use crate::HyperlaneProviderError; use crate::H256; @@ -105,12 +103,27 @@ pub enum ChainCommunicationError { /// protobuf error #[error("{0}")] Protobuf(#[from] prost::DecodeError), + /// base64 error + #[error("{0}")] + Base64(#[from] base64::DecodeError), + /// utf8 error + #[error("{0}")] + Utf8(#[from] FromUtf8Error), /// Serde JSON error #[error("{0}")] JsonParseError(#[from] serde_json::Error), - /// Hex parse error + /// String hex parsing error #[error("{0}")] HexParseError(#[from] hex::FromHexError), + /// Uint hex parsing error + #[error("{0}")] + UintParseError(#[from] uint::FromHexError), + /// Decimal string parsing error + #[error("{0}")] + FromDecStrError(#[from] uint::FromDecStrErr), + /// Int string parsing error + #[error("{0}")] + ParseIntError(#[from] std::num::ParseIntError), /// Invalid Request #[error("Invalid Request: {msg:?}")] InvalidRequest { @@ -123,12 +136,9 @@ pub enum ChainCommunicationError { /// Error message msg: String, }, - /// Not match connection type - #[error("Not match connection type: require {msg:?}")] - NotMatchConnectionType { - /// Error message - msg: String, - }, + /// Failed to estimate transaction gas cost. + #[error("Failed to estimate transaction gas cost {0}")] + TxCostEstimateError(String), } impl ChainCommunicationError { diff --git a/rust/hyperlane-core/src/types/mod.rs b/rust/hyperlane-core/src/types/mod.rs index 4ef1f4411b..b6bdf50a25 100644 --- a/rust/hyperlane-core/src/types/mod.rs +++ b/rust/hyperlane-core/src/types/mod.rs @@ -115,7 +115,7 @@ pub struct GasPaymentKey { } /// A payment of a message's gas costs. -#[derive(Debug, Copy, Clone)] +#[derive(Debug, Copy, Clone, Default)] pub struct InterchainGasPayment { /// Id of the message pub message_id: H256, From 7289e0ff4d7b9cf2c55a7392339d7d59d74abdf9 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Wed, 1 Nov 2023 18:13:30 +0000 Subject: [PATCH 126/142] refactor: finish removing unwraps (#2881) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Description - Removes unwraps and expects from everywhere but `run-locally` - Precomputes the `address` in `Signer` at construction time, to propagate the error early and keep signatures ergonomic by not requiring a `Result`. Couldn't also precompile `SigningKey` (the privkey type) because it's not `Sync` 😢 - Defines a `hyperlane-cosmos`-specific error enum (`HyperlaneCosmosError`), which can be converted to `ChainCommunicationError` with the `?` operator. This is a pattern we'd like to refactor towards in the future, to remove dependencies from `hyperlane-core` as much as possible - One inconvenience is that you need to `.map_err()` to `HyperlaneCosmosError` first, to use `?`. I wish `?` had deref coercion semantics where it'd keep covnerting until an error matches, but I assume this isn't possible because while you can only have a single `Deref` impl, you can have multiple `From` impls. - Writing this I'm realising we could write a small macro to implement `From for ChainCommunicationError` for all the sub-errors of `HyperlaneCosmosError` et al (cc @tkporter) --- .../hyperlane-cosmos/src/aggregation_ism.rs | 5 +- rust/chains/hyperlane-cosmos/src/error.rs | 21 ++++++++ rust/chains/hyperlane-cosmos/src/lib.rs | 8 ++- .../hyperlane-cosmos/src/libs/verify.rs | 17 +++--- rust/chains/hyperlane-cosmos/src/mailbox.rs | 2 +- .../hyperlane-cosmos/src/merkle_tree_hook.rs | 17 +++--- .../hyperlane-cosmos/src/multisig_ism.rs | 6 +-- .../hyperlane-cosmos/src/providers/grpc.rs | 16 +++--- .../hyperlane-cosmos/src/providers/rpc.rs | 4 +- .../hyperlane-cosmos/src/routing_ism.rs | 2 +- rust/chains/hyperlane-cosmos/src/signers.rs | 52 ++++++++++++++----- .../src/validator_announce.rs | 3 +- rust/hyperlane-base/src/settings/signers.rs | 4 +- rust/hyperlane-core/src/error.rs | 3 ++ 14 files changed, 104 insertions(+), 56 deletions(-) create mode 100644 rust/chains/hyperlane-cosmos/src/error.rs diff --git a/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs b/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs index 772a552e25..6b60be5bcc 100644 --- a/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs @@ -60,8 +60,9 @@ impl AggregationIsm for CosmosAggregationIsm { let data = self.provider.wasm_query(payload, None).await?; let response: ModulesAndThresholdResponse = serde_json::from_slice(&data)?; - let modules: Vec = response.modules.into_iter().map(bech32_decode).collect(); + let modules: ChainResult> = + response.modules.into_iter().map(bech32_decode).collect(); - Ok((modules, response.threshold)) + Ok((modules?, response.threshold)) } } diff --git a/rust/chains/hyperlane-cosmos/src/error.rs b/rust/chains/hyperlane-cosmos/src/error.rs new file mode 100644 index 0000000000..cb101f009e --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/error.rs @@ -0,0 +1,21 @@ +use hyperlane_core::ChainCommunicationError; + +/// Errors from the crates specific to the hyperlane-cosmos +/// implementation. +/// This error can then be converted into the broader error type +/// in hyperlane-core using the `From` trait impl +#[derive(Debug, thiserror::Error)] +pub enum HyperlaneCosmosError { + /// bech32 error + #[error("{0}")] + Bech32(#[from] bech32::Error), + /// gRPC error + #[error("{0}")] + GrpcError(#[from] tonic::Status), +} + +impl From for ChainCommunicationError { + fn from(value: HyperlaneCosmosError) -> Self { + ChainCommunicationError::from_other(value) + } +} diff --git a/rust/chains/hyperlane-cosmos/src/lib.rs b/rust/chains/hyperlane-cosmos/src/lib.rs index 0480f72f5a..a68c97aee8 100644 --- a/rust/chains/hyperlane-cosmos/src/lib.rs +++ b/rust/chains/hyperlane-cosmos/src/lib.rs @@ -6,6 +6,7 @@ #![allow(unused_variables)] mod aggregation_ism; +mod error; mod interchain_gas; mod interchain_security_module; mod libs; @@ -21,10 +22,7 @@ mod utils; mod validator_announce; pub use self::{ - aggregation_ism::*, interchain_gas::*, interchain_security_module::*, libs::*, mailbox::*, - merkle_tree_hook::*, multisig_ism::*, providers::*, routing_ism::*, signers::*, + aggregation_ism::*, error::*, interchain_gas::*, interchain_security_module::*, libs::*, + mailbox::*, merkle_tree_hook::*, multisig_ism::*, providers::*, routing_ism::*, signers::*, trait_builder::*, trait_builder::*, validator_announce::*, validator_announce::*, }; - -/// Safe default imports of commonly used traits/types. -pub mod prelude {} diff --git a/rust/chains/hyperlane-cosmos/src/libs/verify.rs b/rust/chains/hyperlane-cosmos/src/libs/verify.rs index caacc0710f..8fe0fba28a 100644 --- a/rust/chains/hyperlane-cosmos/src/libs/verify.rs +++ b/rust/chains/hyperlane-cosmos/src/libs/verify.rs @@ -6,17 +6,20 @@ use hyperlane_core::{ChainCommunicationError, ChainResult, H160, H256}; use ripemd::Ripemd160; use sha2::{Digest, Sha256}; +use crate::HyperlaneCosmosError; + /// decode bech32 address to H256 -pub fn bech32_decode(addr: String) -> H256 { - let (_hrp, data, _variant) = bech32::decode(addr.as_str()).unwrap(); +pub fn bech32_decode(addr: String) -> ChainResult { + let (_hrp, data, _variant) = + bech32::decode(addr.as_str()).map_err(Into::::into)?; - let value = Vec::::from_base32(&data).unwrap(); + let value = Vec::::from_base32(&data).map_err(Into::::into)?; let mut result: [u8; 32] = [0; 32]; let start_point = cmp::max(0, 32 - value.len()); result[start_point..32].copy_from_slice(value.as_slice()); - H256::from(result) + Ok(H256::from(result)) } /// encode H256 to bech32 address @@ -81,8 +84,7 @@ pub fn pub_to_addr(pub_key: Vec, prefix: &str) -> ChainResult { /// encode H256 to bech32 address pub fn priv_to_binary_addr(priv_key: Vec) -> ChainResult { let sha_hash = sha256_digest( - SigningKey::from_slice(priv_key.as_slice()) - .unwrap() + SigningKey::from_slice(priv_key.as_slice())? .public_key() .to_bytes(), )?; @@ -94,8 +96,7 @@ pub fn priv_to_binary_addr(priv_key: Vec) -> ChainResult { /// encode H256 to bech32 address pub fn priv_to_addr_string(prefix: String, priv_key: Vec) -> ChainResult { let sha_hash = sha256_digest( - SigningKey::from_slice(priv_key.as_slice()) - .unwrap() + SigningKey::from_slice(priv_key.as_slice())? .public_key() .to_bytes(), )?; diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 2c0c0eb9ad..40c6c47970 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -149,7 +149,7 @@ impl Mailbox for CosmosMailbox { let response: mailbox::RecipientIsmResponse = serde_json::from_slice(&data)?; // convert Hex to H256 - let ism = verify::bech32_decode(response.ism); + let ism = verify::bech32_decode(response.ism)?; Ok(ism) } diff --git a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs index e6295ac6c1..f24389c052 100644 --- a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs +++ b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -4,9 +4,9 @@ use async_trait::async_trait; use base64::Engine; use cosmrs::tendermint::abci::EventAttribute; use hyperlane_core::{ - accumulator::incremental::IncrementalMerkle, ChainResult, Checkpoint, ContractLocator, - HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneProvider, Indexer, LogMeta, - MerkleTreeHook, MerkleTreeInsertion, SequenceIndexer, H256, + accumulator::incremental::IncrementalMerkle, ChainCommunicationError, ChainResult, Checkpoint, + ContractLocator, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneProvider, + Indexer, LogMeta, MerkleTreeHook, MerkleTreeInsertion, SequenceIndexer, H256, }; use tracing::instrument; @@ -94,12 +94,11 @@ impl MerkleTreeHook for CosmosMerkleTreeHook { .iter() .map(|s| s.as_str()) .map(H256::from_str) - .collect::, _>>() - .expect("fail to parse tree branch"); + .collect::, _>>()?; - let branch_res: [H256; 32] = branch - .try_into() - .expect("fail to convert tree branch to array"); + let branch_res: [H256; 32] = branch.try_into().map_err(|_| { + ChainCommunicationError::from_other_str("Failed to build merkle branch array") + })?; Ok(IncrementalMerkle::new(branch_res, response.count as usize)) } @@ -149,7 +148,7 @@ impl MerkleTreeHook for CosmosMerkleTreeHook { Ok(Checkpoint { merkle_tree_hook_address: self.address, mailbox_domain: self.domain.id(), - root: response.root.parse().unwrap(), + root: response.root.parse()?, index: response.count, }) } diff --git a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs index bb2abe0fb8..83d6f6646d 100644 --- a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs @@ -75,12 +75,12 @@ impl MultisigIsm for CosmosMultisigIsm { .await?; let response: multisig_ism::VerifyInfoResponse = serde_json::from_slice(&data)?; - let validators: Vec = response + let validators: ChainResult> = response .validators .iter() - .map(|v| h160_to_h256(H160::from_str(v).unwrap())) + .map(|v| H160::from_str(v).map(h160_to_h256).map_err(Into::into)) .collect(); - Ok((validators, response.threshold)) + Ok((validators?, response.threshold)) } } diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index 027294a935..021033e0b2 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -1,5 +1,4 @@ use async_trait::async_trait; -use cosmrs::crypto::secp256k1::SigningKey; use cosmrs::proto::cosmos::auth::v1beta1::BaseAccount; use cosmrs::proto::cosmos::auth::v1beta1::{ query_client::QueryClient as QueryAccountClient, QueryAccountRequest, @@ -25,8 +24,8 @@ use hyperlane_core::{ }; use serde::Serialize; -use crate::verify; use crate::{signers::Signer, ConnectionConf}; +use crate::{verify, HyperlaneCosmosError}; const DEFAULT_GAS_PRICE: f32 = 0.05; const DEFAULT_GAS_ADJUSTMENT: f32 = 1.25; @@ -218,13 +217,14 @@ impl WasmProvider for WasmGrpcProvider { where I: IntoIterator + Send + Sync, { - let account_info = self.account_query(self.signer.address()).await?; + let account_info = self.account_query(self.signer.address.clone()).await?; - let private_key = SigningKey::from_slice(&self.signer.private_key).unwrap(); + let private_key = self.signer.signing_key()?; let public_key = private_key.public_key(); let tx_body = tx::Body::new(msgs, "", 9000000u32); - let signer_info = SignerInfo::single_direct(Some(public_key), account_info.sequence); + let signer_info = + SignerInfo::single_direct(Some(self.signer.public_key), account_info.sequence); let gas_limit: u64 = gas_limit.unwrap_or(U256::from(300000u64)).as_u64(); @@ -256,7 +256,7 @@ impl WasmProvider for WasmGrpcProvider { let mut client = TxServiceClient::connect(self.get_conn_url()?).await?; let msgs = vec![MsgExecuteContract { - sender: self.signer.address(), + sender: self.signer.address.clone(), contract: self.get_contract_addr()?, msg: serde_json::to_string(&payload)?.as_bytes().to_vec(), funds: vec![], @@ -272,7 +272,7 @@ impl WasmProvider for WasmGrpcProvider { let tx_res = client .broadcast_tx(tx_req) .await - .unwrap() + .map_err(Into::::into)? .into_inner() .tx_response .ok_or_else(|| ChainCommunicationError::from_other_str("Empty tx_response"))?; @@ -288,7 +288,7 @@ impl WasmProvider for WasmGrpcProvider { T: Serialize + Send + Sync, { let msg = MsgExecuteContract { - sender: self.signer.address(), + sender: self.signer.address.clone(), contract: self.get_contract_addr()?, msg: serde_json::to_string(&payload)?.as_bytes().to_vec(), funds: vec![], diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index 2d2ad116f9..ba3159ffe5 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -125,7 +125,7 @@ impl WasmIndexer for CosmosWasmIndexer { let target_type = format!("{}-{}", Self::WASM_TYPE, self.event_type); // Get BlockHash from block_search - let client = self.get_client().unwrap(); + let client = self.get_client()?; for tx in txs { if tx.tx_result.code.is_err() { @@ -139,7 +139,7 @@ impl WasmIndexer for CosmosWasmIndexer { if event.kind.as_str() == target_type { if let Some(msg) = parser(event.attributes.clone())? { let meta = LogMeta { - address: bech32_decode(contract_address.clone()), + address: bech32_decode(contract_address.clone())?, block_number: tx.height.value(), // FIXME: block_hash is not available in tx_search block_hash: H256::zero(), diff --git a/rust/chains/hyperlane-cosmos/src/routing_ism.rs b/rust/chains/hyperlane-cosmos/src/routing_ism.rs index a0a4fd913c..7f96175664 100644 --- a/rust/chains/hyperlane-cosmos/src/routing_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/routing_ism.rs @@ -72,6 +72,6 @@ impl RoutingIsm for CosmosRoutingIsm { .await?; let response: IsmRouteRespnose = serde_json::from_slice(&data)?; - Ok(bech32_decode(response.ism)) + Ok(bech32_decode(response.ism)?) } } diff --git a/rust/chains/hyperlane-cosmos/src/signers.rs b/rust/chains/hyperlane-cosmos/src/signers.rs index f990db0f3f..e07de304e1 100644 --- a/rust/chains/hyperlane-cosmos/src/signers.rs +++ b/rust/chains/hyperlane-cosmos/src/signers.rs @@ -1,33 +1,59 @@ -use cosmrs::crypto::secp256k1::SigningKey; +use cosmrs::crypto::{secp256k1::SigningKey, PublicKey}; +use hyperlane_core::ChainResult; use crate::verify; #[derive(Clone, Debug)] /// Signer for cosmos chain pub struct Signer { - /// prefix for signer address + /// public key + pub public_key: PublicKey, + /// precomputed address, because computing it is a fallible operation + /// and we want to avoid returning `Result` + pub address: String, + /// address prefix pub prefix: String, - pub(crate) private_key: Vec, + private_key: Vec, } impl Signer { /// create new signer - pub fn new(private_key: Vec, prefix: String) -> Self { - Self { + /// + /// # Arguments + /// * `private_key` - private key for signer + /// * `prefix` - prefix for signer address + pub fn new(private_key: Vec, prefix: String) -> ChainResult { + let address = Self::address(&private_key, &prefix)?; + + let signing_key = Self::build_signing_key(&private_key)?; + SigningKey::from_slice(&private_key)?; + let public_key = signing_key.public_key(); + Ok(Self { + public_key, private_key, + address, prefix, - } + }) } /// get bech32 address - pub fn address(&self) -> String { - verify::pub_to_addr( - SigningKey::from_slice(self.private_key.as_slice()) - .unwrap() + fn address(private_key: &Vec, prefix: &str) -> ChainResult { + let address = verify::pub_to_addr( + SigningKey::from_slice(private_key.as_slice())? .public_key() .to_bytes(), - self.prefix.as_str(), - ) - .unwrap() + prefix, + )?; + Ok(address) + } + + /// Build a SigningKey from a private key. This cannot be + /// precompiled and stored in `Signer`, because `SigningKey` is not `Sync`. + pub fn signing_key(&self) -> ChainResult { + Self::build_signing_key(&self.private_key) + } + + fn build_signing_key(private_key: &Vec) -> ChainResult { + Ok(SigningKey::from_slice(private_key.as_slice())?) } } diff --git a/rust/chains/hyperlane-cosmos/src/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/validator_announce.rs index 44eb8e65e3..dc59c8c0bb 100644 --- a/rust/chains/hyperlane-cosmos/src/validator_announce.rs +++ b/rust/chains/hyperlane-cosmos/src/validator_announce.rs @@ -123,8 +123,7 @@ impl ValidatorAnnounce for CosmosValidatorAnnounce { .await?; Ok(TxOutcome { - transaction_id: H256::from_slice(hex::decode(response.txhash).unwrap().as_slice()) - .into(), + transaction_id: H256::from_slice(hex::decode(response.txhash)?.as_slice()).into(), executed: response.code == 0, gas_used: U256::from(response.gas_used), gas_price: U256::from(response.gas_wanted), diff --git a/rust/hyperlane-base/src/settings/signers.rs b/rust/hyperlane-base/src/settings/signers.rs index a3b5301d54..d072d428b6 100644 --- a/rust/hyperlane-base/src/settings/signers.rs +++ b/rust/hyperlane-base/src/settings/signers.rs @@ -152,7 +152,7 @@ impl BuildableWithSignerConf for hyperlane_cosmos::Signer { SignerConf::HexKey { .. } => bail!("HexKey signer is not supported by cosmos"), SignerConf::Aws { .. } => bail!("Aws signer is not supported by cosmos"), SignerConf::CosmosKey { key, prefix } => { - hyperlane_cosmos::Signer::new(key.as_bytes().to_vec(), prefix.clone()) + hyperlane_cosmos::Signer::new(key.as_bytes().to_vec(), prefix.clone())? } SignerConf::Node => bail!("Node signer is not supported by cosmos"), }) @@ -161,6 +161,6 @@ impl BuildableWithSignerConf for hyperlane_cosmos::Signer { impl ChainSigner for hyperlane_cosmos::Signer { fn address_string(&self) -> String { - self.address() + self.address.clone() } } diff --git a/rust/hyperlane-core/src/error.rs b/rust/hyperlane-core/src/error.rs index a69ee46d97..4faab8c4d1 100644 --- a/rust/hyperlane-core/src/error.rs +++ b/rust/hyperlane-core/src/error.rs @@ -124,6 +124,9 @@ pub enum ChainCommunicationError { /// Int string parsing error #[error("{0}")] ParseIntError(#[from] std::num::ParseIntError), + /// Hash string parsing error + #[error("{0}")] + HashParsingError(#[from] fixed_hash::rustc_hex::FromHexError), /// Invalid Request #[error("Invalid Request: {msg:?}")] InvalidRequest { From 11499cc402484e467210cbbfbf7f267deb09295b Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Thu, 2 Nov 2023 14:35:49 +0000 Subject: [PATCH 127/142] Correctly consider reorg period when indexing, set reorg period to 1 on Neutron (#2885) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Description Hopeful quick fix to indexing issues we're seeing. Leading theory is that the tx_search is asking for a block range that the servicing RPC node doesn't actually have state for. Curious if @nambrot you feel we should go with a more conservative reorg period, maybe 2 blocks? My personal theory is that this isn't just bad RPC load balancing, but that the tip that's returned is simply committed to but the state transition hasn't yet been executed, see https://github.com/CosmWasm/cosmwasm/blob/main/SEMANTICS.md#sdk-context > First, the Tendermint engine will seek 2/3+ consensus on a list of transactions to be included in the next block. This is done without executing them. They are simply subjected to a minimal pre-filter by the Cosmos SDK module, to ensure they are validly formatted transactions, with sufficient gas fees, and signed by an account with sufficient fees to pay it. Notably, this means many transactions that error may be included in a block. > Once a block is committed (typically every 5s or so), the transactions are then fed to the Cosmos SDK sequentially in order to execute them. Each one returns a result or error along with event logs, which are recorded in the TxResults section of the next block. The AppHash (or merkle proof or blockchain state) after executing the block is also included in the next block. ### Drive-by changes Fix a typo for `CosmosMerkleTreeHookIndexer` ### Related issues n/a ### Backward compatibility non breaking ### Testing None 😛 --- .../hyperlane-cosmos/src/interchain_gas.rs | 14 ++++++--- rust/chains/hyperlane-cosmos/src/mailbox.rs | 12 ++++--- .../hyperlane-cosmos/src/merkle_tree_hook.rs | 16 +++++----- .../hyperlane-cosmos/src/providers/rpc.rs | 31 ++++++++++++++----- rust/config/mainnet3_config.json | 3 ++ rust/config/testnet4_config.json | 3 ++ rust/hyperlane-base/src/settings/chains.rs | 6 +++- 7 files changed, 60 insertions(+), 25 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index 0b32b519b9..955182ec2d 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -59,8 +59,14 @@ pub struct CosmosInterchainGasPaymasterIndexer { impl CosmosInterchainGasPaymasterIndexer { /// create new Cosmos InterchainGasPaymasterIndexer agent - pub fn new(conf: ConnectionConf, locator: ContractLocator, event_type: String) -> Self { - let indexer: CosmosWasmIndexer = CosmosWasmIndexer::new(conf, locator, event_type.clone()); + pub fn new( + conf: ConnectionConf, + locator: ContractLocator, + event_type: String, + reorg_period: u32, + ) -> Self { + let indexer: CosmosWasmIndexer = + CosmosWasmIndexer::new(conf, locator, event_type.clone(), reorg_period); Self { indexer: Box::new(indexer), @@ -123,7 +129,7 @@ impl Indexer for CosmosInterchainGasPaymasterIndexer { } async fn get_finalized_block_number(&self) -> ChainResult { - self.indexer.latest_block_height().await + self.indexer.get_finalized_block_number().await } } @@ -131,7 +137,7 @@ impl Indexer for CosmosInterchainGasPaymasterIndexer { impl SequenceIndexer for CosmosInterchainGasPaymasterIndexer { async fn sequence_and_tip(&self) -> ChainResult<(Option, u32)> { // TODO: implement when cosmwasm scraper support is implemented - let tip = self.indexer.latest_block_height().await?; + let tip = self.get_finalized_block_number().await?; Ok((None, tip)) } } diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 40c6c47970..d14e28f32c 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -249,9 +249,11 @@ impl CosmosMailboxIndexer { locator: ContractLocator, signer: Signer, event_type: String, + reorg_period: u32, ) -> Self { let mailbox = CosmosMailbox::new(conf.clone(), locator.clone(), signer.clone()); - let indexer: CosmosWasmIndexer = CosmosWasmIndexer::new(conf, locator, event_type); + let indexer: CosmosWasmIndexer = + CosmosWasmIndexer::new(conf, locator, event_type, reorg_period); Self { mailbox, @@ -300,7 +302,7 @@ impl Indexer for CosmosMailboxIndexer { } async fn get_finalized_block_number(&self) -> ChainResult { - self.indexer.latest_block_height().await + self.indexer.get_finalized_block_number().await } } @@ -317,14 +319,14 @@ impl Indexer for CosmosMailboxIndexer { } async fn get_finalized_block_number(&self) -> ChainResult { - self.indexer.latest_block_height().await + self.indexer.get_finalized_block_number().await } } #[async_trait] impl SequenceIndexer for CosmosMailboxIndexer { async fn sequence_and_tip(&self) -> ChainResult<(Option, u32)> { - let tip = self.indexer.latest_block_height().await?; + let tip = Indexer::::get_finalized_block_number(&self).await?; // No sequence for message deliveries. Ok((None, tip)) @@ -334,7 +336,7 @@ impl SequenceIndexer for CosmosMailboxIndexer { #[async_trait] impl SequenceIndexer for CosmosMailboxIndexer { async fn sequence_and_tip(&self) -> ChainResult<(Option, u32)> { - let tip = self.indexer.latest_block_height().await?; + let tip = Indexer::::get_finalized_block_number(&self).await?; let sequence = self.mailbox.nonce_at_block(Some(tip.into())).await?; diff --git a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs index f24389c052..17be845421 100644 --- a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs +++ b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -160,16 +160,16 @@ const EVENT_TYPE: &str = "hpl_hook_merkle::post_dispatch"; #[derive(Debug)] /// A reference to a MerkleTreeHookIndexer contract on some Cosmos chain -pub struct CosmosMerkleeTreeHookIndexer { +pub struct CosmosMerkleTreeHookIndexer { /// Cosmwasm indexer instance indexer: Box, } -impl CosmosMerkleeTreeHookIndexer { +impl CosmosMerkleTreeHookIndexer { /// create new Cosmos MerkleTreeHookIndexer agent - pub fn new(conf: ConnectionConf, locator: ContractLocator) -> Self { + pub fn new(conf: ConnectionConf, locator: ContractLocator, reorg_period: u32) -> Self { let indexer: CosmosWasmIndexer = - CosmosWasmIndexer::new(conf, locator, EVENT_TYPE.to_string()); + CosmosWasmIndexer::new(conf, locator, EVENT_TYPE.to_string(), reorg_period); Self { indexer: Box::new(indexer), @@ -229,7 +229,7 @@ impl CosmosMerkleeTreeHookIndexer { } #[async_trait] -impl Indexer for CosmosMerkleeTreeHookIndexer { +impl Indexer for CosmosMerkleTreeHookIndexer { /// Fetch list of logs between `range` of blocks async fn fetch_logs( &self, @@ -243,15 +243,15 @@ impl Indexer for CosmosMerkleeTreeHookIndexer { /// Get the chain's latest block number that has reached finality async fn get_finalized_block_number(&self) -> ChainResult { - self.indexer.latest_block_height().await + self.indexer.get_finalized_block_number().await } } #[async_trait] -impl SequenceIndexer for CosmosMerkleeTreeHookIndexer { +impl SequenceIndexer for CosmosMerkleTreeHookIndexer { async fn sequence_and_tip(&self) -> ChainResult<(Option, u32)> { // TODO: implement when cosmos scraper support is implemented - let tip = self.indexer.latest_block_height().await?; + let tip = self.get_finalized_block_number().await?; Ok((None, tip)) } } diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index ba3159ffe5..e073fbc03f 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -7,7 +7,9 @@ use cosmrs::rpc::endpoint::tx; use cosmrs::rpc::query::Query; use cosmrs::rpc::Order; use cosmrs::tendermint::abci::EventAttribute; -use hyperlane_core::{ChainResult, ContractLocator, HyperlaneDomain, LogMeta, H256, U256}; +use hyperlane_core::{ + ChainCommunicationError, ChainResult, ContractLocator, HyperlaneDomain, LogMeta, H256, U256, +}; use tracing::debug; use crate::verify::{self, bech32_decode}; @@ -20,8 +22,8 @@ const PAGINATION_LIMIT: u8 = 100; pub trait WasmIndexer: Send + Sync { /// get rpc client fn get_client(&self) -> ChainResult; - /// get latest block height - async fn latest_block_height(&self) -> ChainResult; + /// get latest finalized block height + async fn get_finalized_block_number(&self) -> ChainResult; /// get range event logs async fn get_range_event_logs( &self, @@ -47,18 +49,25 @@ pub struct CosmosWasmIndexer { _domain: HyperlaneDomain, address: H256, event_type: String, + reorg_period: u32, } impl CosmosWasmIndexer { const WASM_TYPE: &str = "wasm"; /// create new Cosmwasm RPC Provider - pub fn new(conf: ConnectionConf, locator: ContractLocator, event_type: String) -> Self { + pub fn new( + conf: ConnectionConf, + locator: ContractLocator, + event_type: String, + reorg_period: u32, + ) -> Self { Self { conf, _domain: locator.domain.clone(), address: locator.address, event_type, + reorg_period, } } @@ -83,11 +92,19 @@ impl WasmIndexer for CosmosWasmIndexer { .build()?) } - async fn latest_block_height(&self) -> ChainResult { + async fn get_finalized_block_number(&self) -> ChainResult { let client = self.get_client()?; - let result = client.latest_block().await?; - Ok(result.block.header.height.value() as u32) + let latest_height: u32 = client + .latest_block() + .await? + .block + .header + .height + .value() + .try_into() + .map_err(ChainCommunicationError::from_other)?; + Ok(latest_height.saturating_sub(self.reorg_period)) } async fn get_range_event_logs( diff --git a/rust/config/mainnet3_config.json b/rust/config/mainnet3_config.json index d6489e6617..67e5b98c7e 100644 --- a/rust/config/mainnet3_config.json +++ b/rust/config/mainnet3_config.json @@ -436,6 +436,9 @@ "from": 4000000, "chunk": 100000 }, + "blocks": { + "reorgPeriod": 1 + }, "signer": { "type": "cosmosKey", "key": "0x5486418967eabc770b0fcb995f7ef6d9a72f7fc195531ef76c5109f44f51af26", diff --git a/rust/config/testnet4_config.json b/rust/config/testnet4_config.json index 928ba88f18..6679cc0056 100644 --- a/rust/config/testnet4_config.json +++ b/rust/config/testnet4_config.json @@ -1029,6 +1029,9 @@ "index": { "from": 1, "chunk": 1000 + }, + "blocks": { + "reorgPeriod": 1 } } }, diff --git a/rust/hyperlane-base/src/settings/chains.rs b/rust/hyperlane-base/src/settings/chains.rs index 5e17a711ab..f974622612 100644 --- a/rust/hyperlane-base/src/settings/chains.rs +++ b/rust/hyperlane-base/src/settings/chains.rs @@ -229,6 +229,7 @@ impl ChainConf { locator, signer.clone(), "mailbox_dispatch".to_string(), + self.reorg_period, )); Ok(indexer as Box>) } @@ -268,6 +269,7 @@ impl ChainConf { locator, signer, "mailbox_process".to_string(), + self.reorg_period, )); Ok(indexer as Box>) } @@ -347,6 +349,7 @@ impl ChainConf { conf.clone(), locator, "igp-core-pay-for-gas".to_string(), + self.reorg_period, )); Ok(indexer as Box>) } @@ -384,9 +387,10 @@ impl ChainConf { Ok(indexer as Box>) } ChainConnectionConf::Cosmos(conf) => { - let indexer = Box::new(h_cosmos::CosmosMerkleeTreeHookIndexer::new( + let indexer = Box::new(h_cosmos::CosmosMerkleTreeHookIndexer::new( conf.clone(), locator, + self.reorg_period, )); Ok(indexer as Box>) } From 284c400b0509cadb638762129bee322f67258950 Mon Sep 17 00:00:00 2001 From: Yorke Rhodes Date: Thu, 2 Nov 2023 11:27:27 -0400 Subject: [PATCH 128/142] Small build cleanup --- rust/Cargo.lock | 951 ++++++------------ rust/Cargo.toml | 16 +- .../hyperlane-cosmos/src/providers/rpc.rs | 2 +- 3 files changed, 340 insertions(+), 629 deletions(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 94408303b5..7bd66adcd7 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -104,9 +104,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.7.7" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ "getrandom 0.2.10", "once_cell", @@ -115,15 +115,13 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" dependencies = [ "cfg-if", - "getrandom 0.2.10", "once_cell", "version_check", - "zerocopy", ] [[package]] @@ -350,9 +348,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.74" +version = "0.1.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" dependencies = [ "proc-macro2 1.0.69", "quote 1.0.33", @@ -372,9 +370,9 @@ dependencies = [ [[package]] name = "atoi" -version = "2.0.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +checksum = "d7c57d12312ff59c811c0643f4d80830505833c9ffaebd193d819392b265be8e" dependencies = [ "num-traits", ] @@ -497,6 +495,19 @@ dependencies = [ "derive-new", ] +[[package]] +name = "bae" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b8de67cc41132507eeece2584804efcb15f85ba516e34c944b7667f480397a" +dependencies = [ + "heck 0.3.3", + "proc-macro-error", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + [[package]] name = "base16ct" version = "0.1.1" @@ -539,9 +550,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.5" +version = "0.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" [[package]] name = "base64ct" @@ -610,12 +621,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" -dependencies = [ - "serde", -] +checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" [[package]] name = "bitmaps" @@ -832,9 +840,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.5.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" +checksum = "da74e2b81409b1b743f8f0c62cc6254afefb8b8e50bbfe3735550f7aeefa3448" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -1105,6 +1113,7 @@ checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" dependencies = [ "atty", "bitflags 1.3.2", + "clap_derive 3.2.25", "clap_lex 0.2.4", "indexmap 1.9.3", "once_cell", @@ -1115,31 +1124,44 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.7" +version = "4.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b" +checksum = "d04704f56c2cde07f43e8e2c154b43f216dc5c92fc98ada720177362f953b956" dependencies = [ "clap_builder", - "clap_derive", + "clap_derive 4.4.2", ] [[package]] name = "clap_builder" -version = "4.4.7" +version = "4.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663" +checksum = "0e231faeaca65ebd1ea3c737966bf858971cd38c3849107aa3ea7de90a804e45" dependencies = [ "anstream", "anstyle", - "clap_lex 0.6.0", + "clap_lex 0.5.1", "strsim 0.10.0", ] [[package]] name = "clap_derive" -version = "4.4.7" +version = "3.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008" +dependencies = [ + "heck 0.4.1", + "proc-macro-error", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "clap_derive" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873" dependencies = [ "heck 0.4.1", "proc-macro2 1.0.69", @@ -1158,9 +1180,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961" [[package]] name = "cobs" @@ -1520,28 +1542,13 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.11" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] -[[package]] -name = "crc" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4939f9ed1444bd8c896d37f3090012fa6e7834fe84ef8c9daa166109515732f9" - [[package]] name = "crc32fast" version = "1.3.2" @@ -1970,7 +1977,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" dependencies = [ "const-oid 0.9.5", - "pem-rfc7468", "zeroize", ] @@ -2127,6 +2133,15 @@ dependencies = [ "walkdir", ] +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys", +] + [[package]] name = "dirs-next" version = "2.0.0" @@ -2137,6 +2152,17 @@ dependencies = [ "dirs-sys-next", ] +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + [[package]] name = "dirs-sys-next" version = "0.1.2" @@ -2265,9 +2291,9 @@ dependencies = [ [[package]] name = "ed25519" -version = "2.2.3" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +checksum = "60f6d271ca33075c88028be6f04d502853d63a5ece419d269c15315d4fc1cf1d" dependencies = [ "pkcs8 0.10.2", "signature 2.1.0", @@ -2343,9 +2369,6 @@ name = "either" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" -dependencies = [ - "serde", -] [[package]] name = "elliptic-curve" @@ -2509,17 +2532,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "etcetera" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" -dependencies = [ - "cfg-if", - "home", - "windows-sys 0.48.0", -] - [[package]] name = "eth-keystore" version = "0.3.0" @@ -2981,17 +2993,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "flume" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" -dependencies = [ - "futures-core", - "futures-sink", - "spin 0.9.8", -] - [[package]] name = "fnv" version = "1.0.7" @@ -3402,9 +3403,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" dependencies = [ "futures-channel", "futures-core", @@ -3417,9 +3418,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" dependencies = [ "futures-core", "futures-sink", @@ -3427,15 +3428,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" [[package]] name = "futures-executor" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" dependencies = [ "futures-core", "futures-task", @@ -3444,20 +3445,20 @@ dependencies = [ [[package]] name = "futures-intrusive" -version = "0.5.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +checksum = "a604f7a68fbf8103337523b1fadc8ade7361ee3f112f7c680ad179651616aed5" dependencies = [ "futures-core", "lock_api", - "parking_lot 0.12.1", + "parking_lot 0.11.2", ] [[package]] name = "futures-io" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" [[package]] name = "futures-locks" @@ -3471,9 +3472,9 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2 1.0.69", "quote 1.0.33", @@ -3482,15 +3483,15 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" [[package]] name = "futures-timer" @@ -3500,9 +3501,9 @@ checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" dependencies = [ "futures-channel", "futures-core", @@ -3652,7 +3653,7 @@ dependencies = [ "indexmap 1.9.3", "slab", "tokio", - "tokio-util 0.7.10", + "tokio-util 0.7.9", "tracing", ] @@ -3671,7 +3672,7 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" dependencies = [ - "ahash 0.7.7", + "ahash 0.7.6", ] [[package]] @@ -3680,7 +3681,7 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash 0.7.7", + "ahash 0.7.6", ] [[package]] @@ -3689,16 +3690,16 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.6", + "ahash 0.8.3", ] [[package]] name = "hashbrown" -version = "0.14.2" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" +checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12" dependencies = [ - "ahash 0.8.6", + "ahash 0.8.3", "allocator-api2", ] @@ -3717,7 +3718,7 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" dependencies = [ - "hashbrown 0.14.2", + "hashbrown 0.14.1", ] [[package]] @@ -3726,7 +3727,7 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" dependencies = [ - "base64 0.21.5", + "base64 0.21.4", "bytes", "headers-core", "http", @@ -3972,7 +3973,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.10", + "socket2 0.4.9", "tokio", "tower-service", "tracing", @@ -4018,14 +4019,14 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.24.2" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" dependencies = [ "futures-util", "http", "hyper", - "rustls 0.21.8", + "rustls 0.21.7", "tokio", "tokio-rustls 0.24.1", ] @@ -4222,7 +4223,7 @@ dependencies = [ "account-utils", "anyhow", "async-trait", - "base64 0.21.5", + "base64 0.21.4", "borsh 0.9.3", "derive-new", "hyperlane-core", @@ -4255,7 +4256,7 @@ dependencies = [ "bincode", "borsh 0.9.3", "bs58 0.5.0", - "clap 4.4.7", + "clap 4.4.6", "hex 0.4.3", "hyperlane-core", "hyperlane-sealevel-connection-client", @@ -4359,7 +4360,7 @@ version = "0.1.0" dependencies = [ "access-control", "account-utils", - "base64 0.21.5", + "base64 0.21.4", "blake3", "borsh 0.9.3", "getrandom 0.2.10", @@ -4383,7 +4384,7 @@ version = "0.1.0" dependencies = [ "access-control", "account-utils", - "base64 0.21.5", + "base64 0.21.4", "borsh 0.9.3", "hyperlane-core", "hyperlane-sealevel-interchain-security-module-interface", @@ -4631,16 +4632,16 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.58" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows-core", + "windows", ] [[package]] @@ -4791,21 +4792,12 @@ dependencies = [ [[package]] name = "indexmap" -<<<<<<< HEAD -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" -dependencies = [ - "equivalent", - "hashbrown 0.14.2", -======= version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" dependencies = [ "equivalent", "hashbrown 0.14.1", ->>>>>>> 4bdeccde8 (feat: osmosis localnet with cw-hyperlane contract code) ] [[package]] @@ -4820,17 +4812,6 @@ dependencies = [ "regex", ] -[[package]] -name = "inherent" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce243b1bfa62ffc028f1cc3b6034ec63d649f3031bc8a4fbbb004e1ac17d1f68" -dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 2.0.38", -] - [[package]] name = "inout" version = "0.1.3" @@ -4854,9 +4835,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.9.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" [[package]] name = "is-terminal" @@ -4904,9 +4885,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.65" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" dependencies = [ "wasm-bindgen", ] @@ -4978,9 +4959,6 @@ name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -dependencies = [ - "spin 0.5.2", -] [[package]] name = "lazycell" @@ -5004,12 +4982,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - [[package]] name = "librocksdb-sys" version = "0.11.0+8.1.1" @@ -5074,17 +5046,6 @@ dependencies = [ "libsecp256k1-core", ] -[[package]] -name = "libsqlite3-sys" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc22eff61b133b115c6e8c74e818c628d6d5e7a502afea6f64dee076dd94326" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] - [[package]] name = "libz-sys" version = "1.1.12" @@ -5110,9 +5071,9 @@ checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" dependencies = [ "autocfg", "scopeguard", @@ -5308,9 +5269,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.9" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", "wasi 0.11.0+wasi-snapshot-preview1", @@ -5426,13 +5387,24 @@ dependencies = [ "memoffset 0.6.5", ] +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", +] + [[package]] name = "nix" version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.0", "cfg-if", "libc", ] @@ -5514,23 +5486,6 @@ dependencies = [ "serde", ] -[[package]] -name = "num-bigint-dig" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" -dependencies = [ - "byteorder", - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand 0.8.5", - "smallvec", - "zeroize", -] - [[package]] name = "num-complex" version = "0.2.4" @@ -5626,7 +5581,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", - "libm", ] [[package]] @@ -5750,11 +5704,11 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.58" +version = "0.10.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9dfc0783362704e97ef3bd24261995a699468440099ef95d869b4d9732f829a" +checksum = "bac25ee399abb46215765b1cb35bc0212377e58a061560d8b29b024fd0430e7c" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.0", "cfg-if", "foreign-types", "libc", @@ -5782,9 +5736,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.94" +version = "0.9.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f55da20b29f956fb01f0add8683eb26ee13ebe3ebd935e49898717c6b4b2830" +checksum = "db4d56a4c0478783083cfafcc42493dd4a981d41669da64b4572a2a089b51b1d" dependencies = [ "cc", "libc", @@ -5811,15 +5765,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "ordered-float" -version = "3.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1e1c390732d15f1d48471625cd92d154e66db2c56645e29a9cd26f4699f72dc" -dependencies = [ - "num-traits", -] - [[package]] name = "ordered-multimap" version = "0.4.3" @@ -5832,9 +5777,9 @@ dependencies = [ [[package]] name = "os_str_bytes" -version = "6.6.1" +version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" +checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" [[package]] name = "ouroboros" @@ -5843,18 +5788,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1358bd1558bd2a083fed428ffeda486fbfb323e698cdda7794259d592ca72db" dependencies = [ "aliasable", - "ouroboros_macro 0.15.6", -] - -[[package]] -name = "ouroboros" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2ba07320d39dfea882faa70554b4bd342a5f273ed59ba7c1c6b4c840492c954" -dependencies = [ - "aliasable", - "ouroboros_macro 0.17.2", - "static_assertions", + "ouroboros_macro", ] [[package]] @@ -5870,19 +5804,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "ouroboros_macro" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec4c6225c69b4ca778c0aea097321a64c421cf4577b331c61b229267edabb6f8" -dependencies = [ - "heck 0.4.1", - "proc-macro-error", - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 2.0.38", -] - [[package]] name = "overload" version = "0.1.1" @@ -5939,7 +5860,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.9", + "parking_lot_core 0.9.8", ] [[package]] @@ -5958,13 +5879,13 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.4.1", + "redox_syscall 0.3.5", "smallvec", "windows-targets 0.48.5", ] @@ -6079,15 +6000,6 @@ dependencies = [ "base64 0.13.1", ] -[[package]] -name = "pem-rfc7468" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] - [[package]] name = "percent-encoding" version = "2.3.0" @@ -6105,9 +6017,9 @@ dependencies = [ [[package]] name = "pest" -version = "2.7.5" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae9cee2a55a544be8b89dc6848072af97a20f2422603c10865be2a42b580fff5" +checksum = "c022f1e7b65d6a24c0dbbd5fb344c66881bc01f3e5ae74a1c8100f2f985d98a4" dependencies = [ "memchr", "thiserror", @@ -6116,9 +6028,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.5" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81d78524685f5ef2a3b3bd1cafbc9fcabb036253d9b1463e726a91cd16e2dfc2" +checksum = "35513f630d46400a977c4cb58f78e1bfbe01434316e60c37d27b9ad6139c66d8" dependencies = [ "pest", "pest_generator", @@ -6126,9 +6038,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.5" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68bd1206e71118b5356dae5ddc61c8b11e28b09ef6a31acbd15ea48a28e0c227" +checksum = "bc9fc1b9e7057baba189b5c626e2d6f40681ae5b6eb064dc7c7834101ec8123a" dependencies = [ "pest", "pest_meta", @@ -6139,9 +6051,9 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.7.5" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c747191d4ad9e4a4ab9c8798f1e82a39affe7ef9648390b7e5548d18e099de6" +checksum = "1df74e9e7ec4053ceb980e7c0c8bd3594e977fde1af91daba9c928e8e8c6708d" dependencies = [ "once_cell", "pest", @@ -6190,17 +6102,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "pkcs1" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" -dependencies = [ - "der 0.7.8", - "pkcs8 0.10.2", - "spki 0.7.2", -] - [[package]] name = "pkcs8" version = "0.8.0" @@ -6560,7 +6461,7 @@ dependencies = [ "futures-util", "libc", "quinn-proto", - "socket2 0.4.10", + "socket2 0.4.9", "tokio", "tracing", ] @@ -6725,15 +6626,6 @@ dependencies = [ "bitflags 1.3.2", ] -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_users" version = "0.4.3" @@ -6747,14 +6639,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.2" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "d119d7c7ca818f8a53c300863d4f87566aac09943aef5b355bb83969dae75d87" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.3", - "regex-syntax 0.8.2", + "regex-automata 0.4.1", + "regex-syntax 0.8.1", ] [[package]] @@ -6768,13 +6660,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "465c6fc0621e4abc4187a2bda0937bfd4f722c2730b29562e19689ea796c9a4b" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax 0.8.1", ] [[package]] @@ -6785,9 +6677,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "56d84fdd47036b038fc80dd333d10b6aab10d5d31f4a366e20014def75328d33" [[package]] name = "relayer" @@ -6839,7 +6731,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" dependencies = [ "async-compression", - "base64 0.21.5", + "base64 0.21.4", "bytes", "cookie", "cookie_store", @@ -6850,7 +6742,7 @@ dependencies = [ "http", "http-body", "hyper", - "hyper-rustls 0.24.2", + "hyper-rustls 0.24.1", "hyper-tls", "ipnet", "js-sys", @@ -6860,7 +6752,7 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.8", + "rustls 0.21.7", "rustls-pemfile 1.0.3", "serde", "serde_json", @@ -6869,7 +6761,7 @@ dependencies = [ "tokio", "tokio-native-tls", "tokio-rustls 0.24.1", - "tokio-util 0.7.10", + "tokio-util 0.7.9", "tower-service", "url", "wasm-bindgen", @@ -6917,9 +6809,9 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.5" +version = "0.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" +checksum = "9babe80d5c16becf6594aa32ad2be8fe08498e7ae60b77de8df700e67f191d7e" dependencies = [ "cc", "getrandom 0.2.10", @@ -6952,7 +6844,7 @@ dependencies = [ "rkyv_derive", "seahash", "tinyvec", - "uuid 1.5.0", + "uuid 1.4.1", ] [[package]] @@ -7019,26 +6911,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "rsa" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ef35bf3e7fe15a53c4ab08a998e42271eab13eb0db224126bc7bc4c4bad96d" -dependencies = [ - "const-oid 0.9.5", - "digest 0.10.7", - "num-bigint-dig", - "num-integer", - "num-traits", - "pkcs1", - "pkcs8 0.10.2", - "rand_core 0.6.4", - "signature 2.1.0", - "spki 0.7.2", - "subtle", - "zeroize", -] - [[package]] name = "run-locally" version = "0.1.0" @@ -7052,7 +6924,7 @@ dependencies = [ "k256 0.13.1", "macro_rules_attribute", "maplit", - "nix 0.27.1", + "nix 0.26.4", "regex", "ripemd", "serde", @@ -7239,11 +7111,11 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.21" +version = "0.38.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" +checksum = "745ecfa778e66b2b63c88a61cb36e0eea109e803b0b86bf9879fbc77c70e86ed" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.0", "errno", "libc", "linux-raw-sys", @@ -7271,20 +7143,20 @@ checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99" dependencies = [ "log", "ring 0.16.20", - "sct 0.7.1", + "sct 0.7.0", "webpki 0.22.4", ] [[package]] name = "rustls" -version = "0.21.8" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c" +checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" dependencies = [ "log", - "ring 0.17.5", + "ring 0.16.20", "rustls-webpki", - "sct 0.7.1", + "sct 0.7.0", ] [[package]] @@ -7326,17 +7198,17 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" dependencies = [ - "base64 0.21.5", + "base64 0.21.4", ] [[package]] name = "rustls-webpki" -version = "0.101.7" +version = "0.101.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +checksum = "3c7d5dece342910d9ba34d259310cae3e0154b873b35408b787b59bce53d34fe" dependencies = [ - "ring 0.17.5", - "untrusted 0.9.0", + "ring 0.16.20", + "untrusted 0.7.1", ] [[package]] @@ -7380,9 +7252,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.10.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" +checksum = "35c0a159d0c45c12b20c5a844feb1fe4bea86e28f17b92a5f0c42193634d3782" dependencies = [ "cfg-if", "derive_more", @@ -7392,9 +7264,9 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.10.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" +checksum = "912e55f6d20e0e80d63733872b40e1227c0bce1e1ab81ba67d696339bfd7fd29" dependencies = [ "proc-macro-crate 1.2.1", "proc-macro2 1.0.69", @@ -7534,32 +7406,19 @@ dependencies = [ [[package]] name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring 0.17.5", - "untrusted 0.9.0", -] - -[[package]] -name = "sea-bae" -version = "0.2.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd3534a9978d0aa7edd2808dc1f8f31c4d0ecd31ddf71d997b3c98e9f3c9114" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" dependencies = [ - "heck 0.4.1", - "proc-macro-error", - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 2.0.38", + "ring 0.16.20", + "untrusted 0.7.1", ] [[package]] name = "sea-orm" -version = "0.12.4" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14d17105eb8049488d2528580ecc3f0912ab177d600f10e8e292d6994870ba6a" +checksum = "fade86e8d41fd1a4721f84cb834f4ca2783f973cc30e6212b7fafc134f169214" dependencies = [ "async-stream", "async-trait", @@ -7567,32 +7426,31 @@ dependencies = [ "chrono", "futures", "log", - "ouroboros 0.17.2", + "ouroboros", "rust_decimal", "sea-orm-macros", "sea-query", "sea-query-binder", + "sea-strum", "serde", "serde_json", "sqlx", - "strum 0.25.0", "thiserror", "time", "tracing", "url", - "uuid 1.5.0", + "uuid 1.4.1", ] [[package]] name = "sea-orm-cli" -version = "0.12.4" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66b46c28caf05824ecd1e68865de762959aa3640e1c21a415a00090e67b1658" +checksum = "efbf34a2caf70c2e3be9bb1e674e9540f6dfd7c8f40f6f05daf3b9740e476005" dependencies = [ "chrono", - "clap 4.4.7", + "clap 3.2.25", "dotenvy", - "glob", "regex", "sea-schema", "tracing", @@ -7602,26 +7460,25 @@ dependencies = [ [[package]] name = "sea-orm-macros" -version = "0.12.5" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a836864040c92d0615497eeccf97e1aee312857bf2ab36d74a74ce1c5c2cefc3" +checksum = "28936f26d62234ff0be16f80115dbdeb3237fe9c25cf18fbcd1e3b3592360f20" dependencies = [ - "heck 0.4.1", + "bae", + "heck 0.3.3", "proc-macro2 1.0.69", "quote 1.0.33", - "sea-bae", - "syn 2.0.38", - "unicode-ident", + "syn 1.0.109", ] [[package]] name = "sea-orm-migration" -version = "0.12.4" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a340d727bafe3d817b55f920498cc469e8664e8b654017d2ec93a31aed40b70f" +checksum = "278d3adfd0832b6ffc17d3cfbc574d3695a5c1b38814e0bc8ac238d33f3d87cf" dependencies = [ "async-trait", - "clap 4.4.7", + "clap 3.2.25", "dotenvy", "futures", "sea-orm", @@ -7633,27 +7490,24 @@ dependencies = [ [[package]] name = "sea-query" -version = "0.30.2" +version = "0.28.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb3e6bba153bb198646c8762c48414942a38db27d142e44735a133cabddcc820" +checksum = "bbab99b8cd878ab7786157b7eb8df96333a6807cc6e45e8888c85b51534b401a" dependencies = [ "bigdecimal", "chrono", - "derivative", - "inherent", - "ordered-float", "rust_decimal", "sea-query-derive", "serde_json", "time", - "uuid 1.5.0", + "uuid 1.4.1", ] [[package]] name = "sea-query-binder" -version = "0.5.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36bbb68df92e820e4d5aeb17b4acd5cc8b5d18b2c36a4dd6f4626aabfa7ab1b9" +checksum = "4cea85029985b40dfbf18318d85fe985c04db7c1b4e5e8e0a0a0cdff5f1e30f9" dependencies = [ "bigdecimal", "chrono", @@ -7662,27 +7516,27 @@ dependencies = [ "serde_json", "sqlx", "time", - "uuid 1.5.0", + "uuid 1.4.1", ] [[package]] name = "sea-query-derive" -version = "0.4.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25a82fcb49253abcb45cdcb2adf92956060ec0928635eb21b4f7a6d8f25ab0bc" +checksum = "63f62030c60f3a691f5fe251713b4e220b306e50a71e1d6f9cce1f24bb781978" dependencies = [ "heck 0.4.1", "proc-macro2 1.0.69", "quote 1.0.33", - "syn 2.0.38", + "syn 1.0.109", "thiserror", ] [[package]] name = "sea-schema" -version = "0.14.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cd9561232bd1b82ea748b581f15909d11de0db6563ddcf28c5d908aee8282f1" +checksum = "eeb2940bb5a10bc6cd05b450ce6cd3993e27fddd7eface2becb97fc5af3a040e" dependencies = [ "futures", "sea-query", @@ -7691,13 +7545,35 @@ dependencies = [ [[package]] name = "sea-schema-derive" -version = "0.2.0" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6f686050f76bffc4f635cda8aea6df5548666b830b52387e8bc7de11056d11e" +checksum = "56821b7076f5096b8f726e2791ad255a99c82498e08ec477a65a96c461ff1927" dependencies = [ - "heck 0.4.1", + "heck 0.3.3", + "proc-macro2 1.0.69", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "sea-strum" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "391d06a6007842cfe79ac6f7f53911b76dfd69fc9a6769f1cf6569d12ce20e1b" +dependencies = [ + "sea-strum_macros", +] + +[[package]] +name = "sea-strum_macros" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69b4397b825df6ccf1e98bcdabef3bbcfc47ff5853983467850eeab878384f21" +dependencies = [ + "heck 0.3.3", "proc-macro2 1.0.69", "quote 1.0.33", + "rustversion", "syn 1.0.109", ] @@ -7803,9 +7679,9 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.190" +version = "1.0.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" +checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537" dependencies = [ "serde_derive", ] @@ -7840,9 +7716,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.190" +version = "1.0.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" +checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5" dependencies = [ "proc-macro2 1.0.69", "quote 1.0.33", @@ -7862,9 +7738,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" dependencies = [ "itoa", "ryu", @@ -7873,9 +7749,9 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.17" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145" +checksum = "8725e1dfadb3a50f7e5ce0b1a540466f6ed3fe7a0fca2ac2b8b831d31316bd00" dependencies = [ "proc-macro2 1.0.69", "quote 1.0.33", @@ -8113,9 +7989,9 @@ checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" [[package]] name = "socket2" -version = "0.4.10" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" dependencies = [ "libc", "winapi", @@ -8123,9 +7999,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" dependencies = [ "libc", "windows-sys 0.48.0", @@ -8387,7 +8263,7 @@ name = "solana-frozen-abi" version = "1.14.13" source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" dependencies = [ - "ahash 0.7.7", + "ahash 0.7.6", "blake3", "block-buffer 0.9.0", "bs58 0.4.0", @@ -8471,7 +8347,7 @@ dependencies = [ "rand 0.7.3", "serde", "serde_derive", - "socket2 0.4.10", + "socket2 0.4.9", "solana-logger", "solana-sdk", "solana-version", @@ -8484,7 +8360,7 @@ name = "solana-perf" version = "1.14.13" source = "git+https://github.com/hyperlane-xyz/solana.git?tag=hyperlane-1.14.13-2023-07-04#62a6421cab862c77b9ac7a8d93f54f8b5b223af7" dependencies = [ - "ahash 0.7.7", + "ahash 0.7.6", "bincode", "bv", "caps", @@ -8659,7 +8535,7 @@ dependencies = [ "num-traits", "num_cpus", "once_cell", - "ouroboros 0.15.6", + "ouroboros", "rand 0.7.3", "rayon", "regex", @@ -9084,221 +8960,98 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.7.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e50c216e3624ec8e7ecd14c6a6a6370aad6ee5d8cfc3ab30b5162eeeef2ed33" +checksum = "f8de3b03a925878ed54a954f621e64bf55a3c1bd29652d0d1a17830405350188" dependencies = [ "sqlx-core", "sqlx-macros", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", ] [[package]] name = "sqlx-core" -version = "0.7.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d6753e460c998bbd4cd8c6f0ed9a64346fcca0723d6e75e52fdc351c5d2169d" +checksum = "fa8241483a83a3f33aa5fff7e7d9def398ff9990b2752b6c6112b83c6d246029" dependencies = [ - "ahash 0.8.6", + "ahash 0.7.6", "atoi", + "base64 0.13.1", "bigdecimal", + "bitflags 1.3.2", "byteorder", "bytes", "chrono", - "crc", "crossbeam-queue", + "dirs", "dotenvy", "either", "event-listener", "futures-channel", "futures-core", "futures-intrusive", - "futures-io", "futures-util", "hashlink", "hex 0.4.3", - "indexmap 2.1.0", + "hkdf", + "hmac 0.12.1", + "indexmap 1.9.3", + "itoa", + "libc", "log", + "md-5 0.10.6", "memchr", - "native-tls", + "num-bigint 0.4.4", "once_cell", "paste", "percent-encoding", + "rand 0.8.5", "rust_decimal", "serde", "serde_json", + "sha1", "sha2 0.10.8", "smallvec", "sqlformat", + "sqlx-rt", + "stringprep", "thiserror", "time", - "tokio", "tokio-stream", - "tracing", "url", - "uuid 1.5.0", + "uuid 1.4.1", + "whoami", ] [[package]] name = "sqlx-macros" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a793bb3ba331ec8359c1853bd39eed32cdd7baaf22c35ccf5c92a7e8d1189ec" -dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", - "sqlx-core", - "sqlx-macros-core", - "syn 1.0.109", -] - -[[package]] -name = "sqlx-macros-core" -version = "0.7.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a4ee1e104e00dedb6aa5ffdd1343107b0a4702e862a84320ee7cc74782d96fc" +checksum = "9966e64ae989e7e575b19d7265cb79d7fc3cbbdf179835cb0d716f294c2049c9" dependencies = [ "dotenvy", "either", "heck 0.4.1", - "hex 0.4.3", "once_cell", "proc-macro2 1.0.69", "quote 1.0.33", - "serde", "serde_json", - "sha2 0.10.8", "sqlx-core", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", + "sqlx-rt", "syn 1.0.109", - "tempfile", - "tokio", "url", ] [[package]] -name = "sqlx-mysql" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "864b869fdf56263f4c95c45483191ea0af340f9f3e3e7b4d57a61c7c87a970db" -dependencies = [ - "atoi", - "base64 0.21.5", - "bigdecimal", - "bitflags 2.4.1", - "byteorder", - "bytes", - "chrono", - "crc", - "digest 0.10.7", - "dotenvy", - "either", - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "generic-array 0.14.7", - "hex 0.4.3", - "hkdf", - "hmac 0.12.1", -<<<<<<< HEAD -======= - "indexmap 1.9.3", ->>>>>>> 4bdeccde8 (feat: osmosis localnet with cw-hyperlane contract code) - "itoa", - "log", - "md-5 0.10.6", - "memchr", - "once_cell", - "percent-encoding", - "rand 0.8.5", - "rsa", - "rust_decimal", - "serde", - "sha1", - "sha2 0.10.8", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror", - "time", - "tracing", - "uuid 1.5.0", - "whoami", -] - -[[package]] -name = "sqlx-postgres" -version = "0.7.2" +name = "sqlx-rt" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb7ae0e6a97fb3ba33b23ac2671a5ce6e3cabe003f451abd5a56e7951d975624" +checksum = "804d3f245f894e61b1e6263c84b23ca675d96753b5abfd5cc8597d86806e8024" dependencies = [ - "atoi", - "base64 0.21.5", - "bigdecimal", - "bitflags 2.4.1", - "byteorder", - "chrono", - "crc", - "dotenvy", - "etcetera", - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "hex 0.4.3", - "hkdf", - "hmac 0.12.1", - "home", - "itoa", - "log", - "md-5 0.10.6", - "memchr", - "num-bigint 0.4.4", + "native-tls", "once_cell", - "rand 0.8.5", - "rust_decimal", - "serde", - "serde_json", - "sha1", - "sha2 0.10.8", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror", - "time", - "tracing", - "uuid 1.5.0", - "whoami", -] - -[[package]] -name = "sqlx-sqlite" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59dc83cf45d89c555a577694534fcd1b55c545a816c816ce51f20bbe56a4f3f" -dependencies = [ - "atoi", - "chrono", - "flume", - "futures-channel", - "futures-core", - "futures-executor", - "futures-intrusive", - "futures-util", - "libsqlite3-sys", - "log", - "percent-encoding", - "serde", - "sqlx-core", - "time", - "tracing", - "url", - "uuid 1.5.0", + "tokio", + "tokio-native-tls", ] [[package]] @@ -9356,18 +9109,9 @@ name = "strum" version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" -<<<<<<< HEAD -<<<<<<< HEAD -dependencies = [ - "strum_macros 0.25.3", -] -======= ->>>>>>> 59dbe23de (feat: fix cargo error) -======= dependencies = [ "strum_macros 0.25.2", ] ->>>>>>> 5fd30e2e6 (fix: change trait_builder into compatible) [[package]] name = "strum_macros" @@ -9395,18 +9139,10 @@ dependencies = [ ] [[package]] -<<<<<<< HEAD -<<<<<<< HEAD -name = "strum_macros" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" -======= name = "strum_macros" version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad8d03b598d3d0fff69bf533ee3ef19b8eeb342729596df84bcc7e1f96ec4059" ->>>>>>> 5fd30e2e6 (fix: change trait_builder into compatible) dependencies = [ "heck 0.4.1", "proc-macro2 1.0.69", @@ -9416,11 +9152,6 @@ dependencies = [ ] [[package]] -<<<<<<< HEAD -======= ->>>>>>> 59dbe23de (feat: fix cargo error) -======= ->>>>>>> 5fd30e2e6 (fix: change trait_builder into compatible) name = "subtle" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -9582,13 +9313,13 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.8.1" +version = "3.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" dependencies = [ "cfg-if", "fastrand", - "redox_syscall 0.4.1", + "redox_syscall 0.3.5", "rustix", "windows-sys 0.48.0", ] @@ -9601,7 +9332,7 @@ checksum = "3f0a7d05cf78524782337f8edd55cbc578d159a16ad4affe2135c92f7dbac7f0" dependencies = [ "bytes", "digest 0.10.7", - "ed25519 2.2.3", + "ed25519 2.2.2", "ed25519-consensus", "flex-error", "futures", @@ -9723,18 +9454,18 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" -version = "1.0.50" +version = "1.0.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.50" +version = "1.0.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" dependencies = [ "proc-macro2 1.0.69", "quote 1.0.33", @@ -9837,7 +9568,7 @@ dependencies = [ "parking_lot 0.12.1", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.5", + "socket2 0.5.4", "tokio-macros", "windows-sys 0.48.0", ] @@ -9901,7 +9632,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.8", + "rustls 0.21.7", "tokio", ] @@ -9990,9 +9721,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "1d68074620f57a0b21594d9735eb2e98ab38b17f80d3fcb189fca266771ca60d" dependencies = [ "bytes", "futures-core", @@ -10090,9 +9821,9 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "ee2ef2af84856a50c1d430afce2fdded0a4ec7eda868db86409b4543df0797f9" dependencies = [ "log", "pin-project-lite", @@ -10351,7 +10082,7 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5ccd538d4a604753ebc2f17cd9946e89b77bf87f6a8e2309667c6f2e87855e3" dependencies = [ - "base64 0.21.5", + "base64 0.21.4", "log", "once_cell", "url", @@ -10402,9 +10133,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.5.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ad59a7560b41a70d191093a945f0b87bc1deeda46fb237479708a1d6b6cdfc" +checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" dependencies = [ "serde", ] @@ -10510,7 +10241,7 @@ dependencies = [ "tokio", "tokio-stream", "tokio-tungstenite 0.20.1", - "tokio-util 0.7.10", + "tokio-util 0.7.9", "tower-service", "tracing", ] @@ -10529,9 +10260,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.88" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -10539,9 +10270,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.88" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", @@ -10554,9 +10285,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.38" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" dependencies = [ "cfg-if", "js-sys", @@ -10566,9 +10297,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.88" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote 1.0.33", "wasm-bindgen-macro-support", @@ -10576,9 +10307,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.88" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2 1.0.69", "quote 1.0.33", @@ -10589,9 +10320,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.88" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "wasm-timer" @@ -10610,9 +10341,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.65" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" dependencies = [ "js-sys", "wasm-bindgen", @@ -10634,7 +10365,7 @@ version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" dependencies = [ - "ring 0.17.5", + "ring 0.17.3", "untrusted 0.9.0", ] @@ -10679,6 +10410,10 @@ name = "whoami" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22fc3756b8a9133049b26c7f61ab35416c130e8c09b660f5b3958b446f52cc50" +dependencies = [ + "wasm-bindgen", + "web-sys", +] [[package]] name = "winapi" @@ -10712,10 +10447,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows-core" -version = "0.51.1" +name = "windows" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" dependencies = [ "windows-targets 0.48.5", ] @@ -10950,26 +10685,6 @@ dependencies = [ "time", ] -[[package]] -name = "zerocopy" -version = "0.7.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e50cbb27c30666a6108abd6bc7577556265b44f243e2be89a8bc4e07a528c107" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25f293fe55f0a48e7010d65552bb63704f6ceb55a1a385da10d41d8f78e4a3d" -dependencies = [ - "proc-macro2 1.0.69", - "quote 1.0.33", - "syn 2.0.38", -] - [[package]] name = "zeroize" version = "1.6.0" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 1dc68c4d05..9edea2a973 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -23,7 +23,6 @@ members = [ "sealevel/libraries/serializable-account-meta", "sealevel/libraries/test-transaction-utils", "sealevel/libraries/test-utils", - "sealevel/programs/helloworld", "sealevel/programs/hyperlane-sealevel-token", "sealevel/programs/hyperlane-sealevel-token-collateral", "sealevel/programs/hyperlane-sealevel-token-native", @@ -57,7 +56,7 @@ auto_impl = "1.0" backtrace = "0.3" base64 = "0.21.2" bincode = "1.3" -borsh = "0.9" # 0.9 is needed for solana 1.14 +borsh = "0.9" bs58 = "0.5.0" bytes = "1" clap = "4" @@ -84,8 +83,10 @@ fuels = "0.38" fuels-code-gen = "0.38" futures = "0.3" futures-util = "0.3" -generic-array = { version = "1.0", features = ["serde", "more_lengths"] } -getrandom = { version = "0.2", features = ["js"] } # Required for WASM support https://docs.rs/getrandom/latest/getrandom/#webassembly-support +generic-array = { version = "0.14", features = ["serde", "more_lengths"] } +getrandom = { version = "0.2", features = [ + "js", +] } # Required for WASM support https://docs.rs/getrandom/latest/getrandom/#webassembly-support itertools = "0.11.0" jsonrpc-core = "18.0" k256 = { version = "0.13.1", features = ["std", "ecdsa"] } @@ -93,7 +94,7 @@ log = "0.4" macro_rules_attribute = "0.2" maplit = "1.0" mockall = "0.11" -nix = { version = "0.27", default-features = false } +nix = { version = "0.26", default-features = false } num = "0.4" num-bigint = "0.4" num-derive = "0.4.0" @@ -107,10 +108,6 @@ regex = "1.5" reqwest = "0.11" rlp = "=0.5.2" rocksdb = "0.21.0" -<<<<<<< HEAD -sea-orm = { version = "0.12.3", features = ["sqlx-postgres", "runtime-tokio-native-tls", "with-bigdecimal", "with-time", "macros"] } -sea-orm-migration = { version = "0.12.3", features = ["sqlx-postgres", "runtime-tokio-native-tls"] } -======= sea-orm = { version = "0.11.1", features = [ "sqlx-postgres", "runtime-tokio-native-tls", @@ -122,7 +119,6 @@ sea-orm-migration = { version = "0.11.1", features = [ "sqlx-postgres", "runtime-tokio-native-tls", ] } ->>>>>>> 4bdeccde8 (feat: osmosis localnet with cw-hyperlane contract code) semver = "1.0" serde = { version = "1.0", features = ["derive"] } serde_bytes = "0.11" diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index e073fbc03f..deb266c29a 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -2,7 +2,7 @@ use std::ops::RangeInclusive; use crate::binary::h256_to_h512; use async_trait::async_trait; -use cosmrs::rpc::client::{Client, CompatMode, HttpClient}; +use cosmrs::rpc::client::{Client, HttpClient}; use cosmrs::rpc::endpoint::tx; use cosmrs::rpc::query::Query; use cosmrs::rpc::Order; From b926434047d009ff255cce6004850e320a2bfa3e Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Fri, 3 Nov 2023 10:13:05 +0000 Subject: [PATCH 129/142] Index merkle tree insertions just like messages (#2886) ### Description Moves merkle tree hook insertion indexing away from the watermarked contract sync to the same method that message indexing uses * Generalizes all the MessageContractSync / MessageSyncCursor etc to work with any "sequenced" data. Sequenced data means a data type that has a sequence # that increases 1 at a time as it's created. E.g. a message's nonce is its sequence, or a merkle tree insertion's leaf index is its sequence ### Drive-by changes Minor idiomatic changes ### Related issues n/a ### Backward compatibility I believe this is fully backward compatible ### Testing Tested locally by running a relayer with an empty data dir & with an existing data dir. Also tested a validator locally --- rust/agents/relayer/src/relayer.rs | 16 +- rust/agents/scraper/src/chain_scraper/mod.rs | 19 +-- rust/agents/validator/src/validator.rs | 8 +- .../hyperlane-cosmos/src/merkle_tree_hook.rs | 62 +++++-- .../src/merkle_tree_hook.rs | 14 +- rust/config/testnet4_config.json | 2 +- .../src/contract_sync/cursor.rs | 159 +++++++++--------- rust/hyperlane-base/src/contract_sync/mod.rs | 23 ++- .../src/db/rocks/hyperlane_db.rs | 59 +++++-- rust/hyperlane-base/src/settings/base.rs | 13 +- rust/hyperlane-base/src/settings/chains.rs | 3 + rust/hyperlane-core/src/traits/db.rs | 27 ++- rust/hyperlane-core/src/types/merkle_tree.rs | 8 +- rust/hyperlane-core/src/types/message.rs | 8 +- 14 files changed, 251 insertions(+), 170 deletions(-) diff --git a/rust/agents/relayer/src/relayer.rs b/rust/agents/relayer/src/relayer.rs index 96e911d6a8..93ac88a8bb 100644 --- a/rust/agents/relayer/src/relayer.rs +++ b/rust/agents/relayer/src/relayer.rs @@ -9,10 +9,12 @@ use derive_more::AsRef; use eyre::Result; use hyperlane_base::{ db::{HyperlaneRocksDB, DB}, - run_all, BaseAgent, ContractSyncMetrics, CoreMetrics, HyperlaneAgentCore, MessageContractSync, - WatermarkContractSync, + run_all, BaseAgent, ContractSyncMetrics, CoreMetrics, HyperlaneAgentCore, + SequencedDataContractSync, WatermarkContractSync, +}; +use hyperlane_core::{ + HyperlaneDomain, HyperlaneMessage, InterchainGasPayment, MerkleTreeInsertion, U256, }; -use hyperlane_core::{HyperlaneDomain, InterchainGasPayment, MerkleTreeInsertion, U256}; use tokio::{ sync::{ mpsc::{self, UnboundedReceiver, UnboundedSender}, @@ -50,7 +52,7 @@ pub struct Relayer { destination_chains: HashSet, #[as_ref] core: HyperlaneAgentCore, - message_syncs: HashMap>, + message_syncs: HashMap>>, interchain_gas_payment_syncs: HashMap>>, /// Context data for each (origin, destination) chain pair a message can be @@ -58,7 +60,7 @@ pub struct Relayer { msg_ctxs: HashMap>, prover_syncs: HashMap>>, merkle_tree_hook_syncs: - HashMap>>, + HashMap>>, dbs: HashMap, whitelist: Arc, blacklist: Arc, @@ -314,7 +316,9 @@ impl Relayer { ) -> Instrumented>> { let index_settings = self.as_ref().settings.chains[origin.name()].index.clone(); let contract_sync = self.merkle_tree_hook_syncs.get(origin).unwrap().clone(); - let cursor = contract_sync.rate_limited_cursor(index_settings).await; + let cursor = contract_sync + .forward_backward_message_sync_cursor(index_settings) + .await; tokio::spawn(async move { contract_sync.clone().sync("merkle_tree_hook", cursor).await }) .instrument(info_span!("ContractSync")) } diff --git a/rust/agents/scraper/src/chain_scraper/mod.rs b/rust/agents/scraper/src/chain_scraper/mod.rs index 09294905a6..78410277d3 100644 --- a/rust/agents/scraper/src/chain_scraper/mod.rs +++ b/rust/agents/scraper/src/chain_scraper/mod.rs @@ -8,8 +8,8 @@ use eyre::Result; use hyperlane_base::settings::IndexSettings; use hyperlane_core::{ unwrap_or_none_result, BlockInfo, Delivery, HyperlaneDomain, HyperlaneLogStore, - HyperlaneMessage, HyperlaneMessageStore, HyperlaneProvider, HyperlaneWatermarkedLogStore, - InterchainGasPayment, LogMeta, H256, + HyperlaneMessage, HyperlaneProvider, HyperlaneSequenceIndexerStore, + HyperlaneWatermarkedLogStore, InterchainGasPayment, LogMeta, H256, }; use itertools::Itertools; use tracing::trace; @@ -370,23 +370,22 @@ impl HyperlaneLogStore for HyperlaneSqlDb { } #[async_trait] -impl HyperlaneMessageStore for HyperlaneSqlDb { - /// Gets a message by nonce. - async fn retrieve_message_by_nonce(&self, nonce: u32) -> Result> { +impl HyperlaneSequenceIndexerStore for HyperlaneSqlDb { + /// Gets a message by its nonce. + async fn retrieve_by_sequence(&self, sequence: u32) -> Result> { let message = self .db - .retrieve_message_by_nonce(self.domain().id(), &self.mailbox_address, nonce) + .retrieve_message_by_nonce(self.domain().id(), &self.mailbox_address, sequence) .await?; Ok(message) } - /// Retrieves the block number at which the message with the provided nonce - /// was dispatched. - async fn retrieve_dispatched_block_number(&self, nonce: u32) -> Result> { + /// Gets the block number at which the log occurred. + async fn retrieve_log_block_number(&self, sequence: u32) -> Result> { unwrap_or_none_result!( tx_id, self.db - .retrieve_dispatched_tx_id(self.domain().id(), &self.mailbox_address, nonce) + .retrieve_dispatched_tx_id(self.domain().id(), &self.mailbox_address, sequence) .await? ); unwrap_or_none_result!(block_id, self.db.retrieve_block_id(tx_id).await?); diff --git a/rust/agents/validator/src/validator.rs b/rust/agents/validator/src/validator.rs index bc9ba325b4..96feb97b8f 100644 --- a/rust/agents/validator/src/validator.rs +++ b/rust/agents/validator/src/validator.rs @@ -11,7 +11,7 @@ use tracing::{error, info, info_span, instrument::Instrumented, warn, Instrument use hyperlane_base::{ db::{HyperlaneRocksDB, DB}, run_all, BaseAgent, CheckpointSyncer, ContractSyncMetrics, CoreMetrics, HyperlaneAgentCore, - WatermarkContractSync, + SequencedDataContractSync, }; use hyperlane_core::{ @@ -33,7 +33,7 @@ pub struct Validator { #[as_ref] core: HyperlaneAgentCore, db: HyperlaneRocksDB, - merkle_tree_hook_sync: Arc>, + merkle_tree_hook_sync: Arc>, mailbox: Arc, merkle_tree_hook: Arc, validator_announce: Arc, @@ -154,7 +154,9 @@ impl Validator { let index_settings = self.as_ref().settings.chains[self.origin_chain.name()].index_settings(); let contract_sync = self.merkle_tree_hook_sync.clone(); - let cursor = contract_sync.rate_limited_cursor(index_settings).await; + let cursor = contract_sync + .forward_backward_message_sync_cursor(index_settings) + .await; tokio::spawn(async move { contract_sync.clone().sync("merkle_tree_hook", cursor).await }) .instrument(info_span!("MerkleTreeHookSyncer")) } diff --git a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs index 17be845421..47447e6a8e 100644 --- a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs +++ b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -104,7 +104,6 @@ impl MerkleTreeHook for CosmosMerkleTreeHook { } /// Gets the current leaf count of the merkle tree - #[instrument(level = "debug", err, ret, skip(self))] async fn count(&self, lag: Option) -> ChainResult { let payload = merkle_tree_hook::MerkleTreeCountRequest { count: general::EmptyStruct {}, @@ -112,18 +111,7 @@ impl MerkleTreeHook for CosmosMerkleTreeHook { let block_height = get_block_height_for_lag(&self.provider, lag).await?; - let data = self - .provider - .wasm_query( - merkle_tree_hook::MerkleTreeGenericRequest { - merkle_hook: payload, - }, - block_height, - ) - .await?; - let response: merkle_tree_hook::MerkleTreeCountResponse = serde_json::from_slice(&data)?; - - Ok(response.count) + self.count_at_block(block_height).await } #[instrument(level = "debug", err, ret, skip(self))] @@ -154,6 +142,28 @@ impl MerkleTreeHook for CosmosMerkleTreeHook { } } +impl CosmosMerkleTreeHook { + #[instrument(level = "debug", err, ret, skip(self))] + async fn count_at_block(&self, block_height: Option) -> ChainResult { + let payload = merkle_tree_hook::MerkleTreeCountRequest { + count: general::EmptyStruct {}, + }; + + let data = self + .provider + .wasm_query( + merkle_tree_hook::MerkleTreeGenericRequest { + merkle_hook: payload, + }, + block_height, + ) + .await?; + let response: merkle_tree_hook::MerkleTreeCountResponse = serde_json::from_slice(&data)?; + + Ok(response.count) + } +} + // ------------------ Indexer ------------------ const EVENT_TYPE: &str = "hpl_hook_merkle::post_dispatch"; @@ -161,17 +171,29 @@ const EVENT_TYPE: &str = "hpl_hook_merkle::post_dispatch"; #[derive(Debug)] /// A reference to a MerkleTreeHookIndexer contract on some Cosmos chain pub struct CosmosMerkleTreeHookIndexer { + /// The CosmosMerkleTreeHook + merkle_tree_hook: CosmosMerkleTreeHook, /// Cosmwasm indexer instance indexer: Box, } impl CosmosMerkleTreeHookIndexer { /// create new Cosmos MerkleTreeHookIndexer agent - pub fn new(conf: ConnectionConf, locator: ContractLocator, reorg_period: u32) -> Self { - let indexer: CosmosWasmIndexer = - CosmosWasmIndexer::new(conf, locator, EVENT_TYPE.to_string(), reorg_period); + pub fn new( + conf: ConnectionConf, + locator: ContractLocator, + signer: Signer, + reorg_period: u32, + ) -> Self { + let indexer: CosmosWasmIndexer = CosmosWasmIndexer::new( + conf.clone(), + locator.clone(), + EVENT_TYPE.to_string(), + reorg_period, + ); Self { + merkle_tree_hook: CosmosMerkleTreeHook::new(conf, locator, signer), indexer: Box::new(indexer), } } @@ -250,8 +272,12 @@ impl Indexer for CosmosMerkleTreeHookIndexer { #[async_trait] impl SequenceIndexer for CosmosMerkleTreeHookIndexer { async fn sequence_and_tip(&self) -> ChainResult<(Option, u32)> { - // TODO: implement when cosmos scraper support is implemented let tip = self.get_finalized_block_number().await?; - Ok((None, tip)) + let sequence = self + .merkle_tree_hook + .count_at_block(Some(tip.into())) + .await?; + + Ok((Some(sequence), tip)) } } diff --git a/rust/chains/hyperlane-ethereum/src/merkle_tree_hook.rs b/rust/chains/hyperlane-ethereum/src/merkle_tree_hook.rs index 3881b03250..1beffed5bc 100644 --- a/rust/chains/hyperlane-ethereum/src/merkle_tree_hook.rs +++ b/rust/chains/hyperlane-ethereum/src/merkle_tree_hook.rs @@ -130,7 +130,7 @@ where Ok(logs) } - #[instrument(level = "debug", err, ret, skip(self))] + #[instrument(level = "debug", err, skip(self))] async fn get_finalized_block_number(&self) -> ChainResult { Ok(self .provider @@ -147,15 +147,13 @@ impl SequenceIndexer for EthereumMerkleTreeHookIndexer ChainResult<(Option, u32)> { - // The InterchainGasPaymasterIndexerBuilder must return a `SequenceIndexer` type. - // It's fine if only a blanket implementation is provided for EVM chains, since their - // indexing only uses the `Index` trait, which is a supertrait of `SequenceIndexer`. - // TODO: if `SequenceIndexer` turns out to not depend on `Indexer` at all, then the supertrait - // dependency could be removed, even if the builder would still need to return a type that is both - // ``SequenceIndexer` and `Indexer`. let tip = self.get_finalized_block_number().await?; - Ok((None, tip)) + let sequence = self.contract.count().block(u64::from(tip)).call().await?; + Ok((Some(sequence), tip)) } } diff --git a/rust/config/testnet4_config.json b/rust/config/testnet4_config.json index 6679cc0056..12621e6035 100644 --- a/rust/config/testnet4_config.json +++ b/rust/config/testnet4_config.json @@ -1028,7 +1028,7 @@ "prefix": "dual", "index": { "from": 1, - "chunk": 1000 + "chunk": 100000 }, "blocks": { "reorgPeriod": 1 diff --git a/rust/hyperlane-base/src/contract_sync/cursor.rs b/rust/hyperlane-base/src/contract_sync/cursor.rs index 14cff9b02a..cbbd393dbd 100644 --- a/rust/hyperlane-base/src/contract_sync/cursor.rs +++ b/rust/hyperlane-base/src/contract_sync/cursor.rs @@ -10,9 +10,9 @@ use async_trait::async_trait; use derive_new::new; use eyre::Result; use hyperlane_core::{ - ChainCommunicationError, ChainResult, ContractSyncCursor, CursorAction, HyperlaneMessage, - HyperlaneMessageStore, HyperlaneWatermarkedLogStore, IndexMode, Indexer, LogMeta, - SequenceIndexer, + ChainCommunicationError, ChainResult, ContractSyncCursor, CursorAction, + HyperlaneSequenceIndexerStore, HyperlaneWatermarkedLogStore, IndexMode, Indexer, LogMeta, + SequenceIndexer, Sequenced, }; use tokio::time::sleep; use tracing::{debug, warn}; @@ -25,11 +25,11 @@ const ETA_TIME_WINDOW: f64 = 2. * 60.; const MAX_SEQUENCE_RANGE: u32 = 100; /// A struct that holds the data needed for forwards and backwards -/// message sync cursors. +/// sequence sync cursors. #[derive(Debug, new)] -pub(crate) struct MessageSyncCursor { - indexer: Arc>, - db: Arc, +pub(crate) struct SequenceSyncCursor { + indexer: Arc>, + db: Arc>, sync_state: SyncState, } @@ -129,41 +129,34 @@ impl SyncState { } } -impl MessageSyncCursor { - async fn retrieve_message_by_nonce(&self, nonce: u32) -> Option { - if let Ok(Some(message)) = self.db.retrieve_message_by_nonce(nonce).await { - Some(message) - } else { - None - } +impl SequenceSyncCursor { + async fn retrieve_by_sequence(&self, sequence: u32) -> Option { + self.db.retrieve_by_sequence(sequence).await.ok().flatten() } - async fn retrieve_dispatched_block_number(&self, nonce: u32) -> Option { - if let Ok(Some(block_number)) = self.db.retrieve_dispatched_block_number(nonce).await { - Some(u32::try_from(block_number).unwrap()) - } else { - None - } + async fn retrieve_log_block_number(&self, sequence: u32) -> Option { + self.db + .retrieve_log_block_number(sequence) + .await + .ok() + .flatten() + .map(|num| u32::try_from(num).unwrap()) } - async fn update( - &mut self, - logs: Vec<(HyperlaneMessage, LogMeta)>, - prev_sequence: u32, - ) -> Result<()> { - // If we found messages, but did *not* find the message we were looking for, - // we need to rewind to the block at which we found the last message. + async fn update(&mut self, logs: Vec<(T, LogMeta)>, prev_sequence: u32) -> Result<()> { + // If we found logs, but did *not* find the log we were looking for, + // we need to rewind to the block at which we found the last log. if !logs.is_empty() && !logs .iter() - .any(|m| m.0.nonce == self.sync_state.next_sequence) + .any(|m| m.0.sequence() == self.sync_state.next_sequence) { - warn!(next_nonce=?self.sync_state.next_sequence, "Target nonce not found, rewinding"); - // If the previous nonce has been synced, rewind to the block number + warn!(next_sequence=?self.sync_state.next_sequence, "Target sequence not found, rewinding"); + // If the previous sequence has been synced, rewind to the block number // at which it was dispatched. Otherwise, rewind all the way back to the start block. - if let Some(block_number) = self.retrieve_dispatched_block_number(prev_sequence).await { + if let Some(block_number) = self.retrieve_log_block_number(prev_sequence).await { self.sync_state.next_block = block_number; - warn!(block_number, "Rewound to previous known message"); + warn!(block_number, "Rewound to previous known sequenced log"); } else { self.sync_state.next_block = self.sync_state.start_block; } @@ -174,15 +167,15 @@ impl MessageSyncCursor { } } -/// A MessageSyncCursor that syncs forwards in perpetuity. -pub(crate) struct ForwardMessageSyncCursor { - cursor: MessageSyncCursor, +/// A SequenceSyncCursor that syncs forwards in perpetuity. +pub(crate) struct ForwardSequenceSyncCursor { + cursor: SequenceSyncCursor, } -impl ForwardMessageSyncCursor { +impl ForwardSequenceSyncCursor { pub fn new( - indexer: Arc>, - db: Arc, + indexer: Arc>, + db: Arc>, chunk_size: u32, start_block: u32, next_block: u32, @@ -190,7 +183,7 @@ impl ForwardMessageSyncCursor { next_sequence: u32, ) -> Self { Self { - cursor: MessageSyncCursor::new( + cursor: SequenceSyncCursor::new( indexer, db, SyncState::new( @@ -206,17 +199,17 @@ impl ForwardMessageSyncCursor { } async fn get_next_range(&mut self) -> ChainResult>> { - // Check if any new messages have been inserted into the DB, + // Check if any new logs have been inserted into the DB, // and update the cursor accordingly. while self .cursor - .retrieve_message_by_nonce(self.cursor.sync_state.next_sequence) + .retrieve_by_sequence(self.cursor.sync_state.next_sequence) .await .is_some() { if let Some(block_number) = self .cursor - .retrieve_dispatched_block_number(self.cursor.sync_state.next_sequence) + .retrieve_log_block_number(self.cursor.sync_state.next_sequence) .await { debug!(next_block = block_number, "Fast forwarding next block"); @@ -224,8 +217,8 @@ impl ForwardMessageSyncCursor { self.cursor.sync_state.next_block = block_number; } debug!( - next_nonce = self.cursor.sync_state.next_sequence + 1, - "Fast forwarding next nonce" + next_sequence = self.cursor.sync_state.next_sequence + 1, + "Fast forwarding next sequence" ); self.cursor.sync_state.next_sequence += 1; } @@ -236,7 +229,7 @@ impl ForwardMessageSyncCursor { let cursor_count = self.cursor.sync_state.next_sequence; Ok(match cursor_count.cmp(&mailbox_count) { Ordering::Equal => { - // We are synced up to the latest nonce so we don't need to index anything. + // We are synced up to the latest sequence so we don't need to index anything. // We update our next block number accordingly. self.cursor.sync_state.next_block = tip; None @@ -259,7 +252,7 @@ impl ForwardMessageSyncCursor { } #[async_trait] -impl ContractSyncCursor for ForwardMessageSyncCursor { +impl ContractSyncCursor for ForwardSequenceSyncCursor { async fn next_action(&mut self) -> ChainResult<(CursorAction, Duration)> { // TODO: Fix ETA calculation let eta = Duration::from_secs(0); @@ -278,29 +271,29 @@ impl ContractSyncCursor for ForwardMessageSyncCursor { /// If the previous block has been synced, rewind to the block number /// at which it was dispatched. /// Otherwise, rewind all the way back to the start block. - async fn update(&mut self, logs: Vec<(HyperlaneMessage, LogMeta)>) -> Result<()> { - let prev_nonce = self.cursor.sync_state.next_sequence.saturating_sub(1); - // We may wind up having re-indexed messages that are previous to the nonce that we are looking for. - // We should not consider these messages when checking for continuity errors. + async fn update(&mut self, logs: Vec<(T, LogMeta)>) -> Result<()> { + let prev_sequence = self.cursor.sync_state.next_sequence.saturating_sub(1); + // We may wind up having re-indexed logs that are previous to the sequence that we are looking for. + // We should not consider these logs when checking for continuity errors. let filtered_logs = logs .into_iter() - .filter(|m| m.0.nonce >= self.cursor.sync_state.next_sequence) + .filter(|m| m.0.sequence() >= self.cursor.sync_state.next_sequence) .collect(); - self.cursor.update(filtered_logs, prev_nonce).await + self.cursor.update(filtered_logs, prev_sequence).await } } -/// A MessageSyncCursor that syncs backwards to sequence (nonce) zero. -pub(crate) struct BackwardMessageSyncCursor { - cursor: MessageSyncCursor, +/// A SequenceSyncCursor that syncs backwards to sequence zero. +pub(crate) struct BackwardSequenceSyncCursor { + cursor: SequenceSyncCursor, synced: bool, } -impl BackwardMessageSyncCursor { +impl BackwardSequenceSyncCursor { #[allow(clippy::too_many_arguments)] pub fn new( - indexer: Arc>, - db: Arc, + indexer: Arc>, + db: Arc>, chunk_size: u32, start_block: u32, next_block: u32, @@ -309,7 +302,7 @@ impl BackwardMessageSyncCursor { synced: bool, ) -> Self { Self { - cursor: MessageSyncCursor::new( + cursor: SequenceSyncCursor::new( indexer, db, SyncState::new( @@ -326,12 +319,12 @@ impl BackwardMessageSyncCursor { } async fn get_next_range(&mut self) -> ChainResult>> { - // Check if any new messages have been inserted into the DB, + // Check if any new logs have been inserted into the DB, // and update the cursor accordingly. while !self.synced { if self .cursor - .retrieve_message_by_nonce(self.cursor.sync_state.next_sequence) + .retrieve_by_sequence(self.cursor.sync_state.next_sequence) .await .is_none() { @@ -345,7 +338,7 @@ impl BackwardMessageSyncCursor { if let Some(block_number) = self .cursor - .retrieve_dispatched_block_number(self.cursor.sync_state.next_sequence) + .retrieve_log_block_number(self.cursor.sync_state.next_sequence) .await { // It's possible that eth_getLogs dropped logs from this block, therefore we cannot do block_number - 1. @@ -367,13 +360,13 @@ impl BackwardMessageSyncCursor { /// If the previous block has been synced, rewind to the block number /// at which it was dispatched. /// Otherwise, rewind all the way back to the start block. - async fn update(&mut self, logs: Vec<(HyperlaneMessage, LogMeta)>) -> Result<()> { + async fn update(&mut self, logs: Vec<(T, LogMeta)>) -> Result<()> { let prev_sequence = self.cursor.sync_state.next_sequence.saturating_add(1); - // We may wind up having re-indexed messages that are previous to the sequence (nonce) that we are looking for. - // We should not consider these messages when checking for continuity errors. + // We may wind up having re-indexed logs that are previous to the sequence that we are looking for. + // We should not consider these logs when checking for continuity errors. let filtered_logs = logs .into_iter() - .filter(|m| m.0.nonce <= self.cursor.sync_state.next_sequence) + .filter(|m| m.0.sequence() <= self.cursor.sync_state.next_sequence) .collect(); self.cursor.update(filtered_logs, prev_sequence).await } @@ -385,43 +378,43 @@ pub enum SyncDirection { Backward, } -/// A MessageSyncCursor that syncs forwards in perpetuity. -pub(crate) struct ForwardBackwardMessageSyncCursor { - forward: ForwardMessageSyncCursor, - backward: BackwardMessageSyncCursor, +/// A SequenceSyncCursor that syncs forwards in perpetuity. +pub(crate) struct ForwardBackwardSequenceSyncCursor { + forward: ForwardSequenceSyncCursor, + backward: BackwardSequenceSyncCursor, direction: SyncDirection, } -impl ForwardBackwardMessageSyncCursor { +impl ForwardBackwardSequenceSyncCursor { /// Construct a new contract sync helper. pub async fn new( - indexer: Arc>, - db: Arc, + indexer: Arc>, + db: Arc>, chunk_size: u32, mode: IndexMode, ) -> Result { - let (count, tip) = indexer.sequence_and_tip().await?; - let count = count.ok_or(ChainCommunicationError::from_other_str( - "Failed to query message count", + let (sequence, tip) = indexer.sequence_and_tip().await?; + let sequence = sequence.ok_or(ChainCommunicationError::from_other_str( + "Failed to query sequence", ))?; - let forward_cursor = ForwardMessageSyncCursor::new( + let forward_cursor = ForwardSequenceSyncCursor::new( indexer.clone(), db.clone(), chunk_size, tip, tip, mode, - count, + sequence, ); - let backward_cursor = BackwardMessageSyncCursor::new( + let backward_cursor = BackwardSequenceSyncCursor::new( indexer.clone(), db.clone(), chunk_size, tip, tip, mode, - count.saturating_sub(1), - count == 0, + sequence.saturating_sub(1), + sequence == 0, ); Ok(Self { forward: forward_cursor, @@ -432,7 +425,7 @@ impl ForwardBackwardMessageSyncCursor { } #[async_trait] -impl ContractSyncCursor for ForwardBackwardMessageSyncCursor { +impl ContractSyncCursor for ForwardBackwardSequenceSyncCursor { async fn next_action(&mut self) -> ChainResult<(CursorAction, Duration)> { // TODO: Proper ETA for backwards sync let eta = Duration::from_secs(0); @@ -454,7 +447,7 @@ impl ContractSyncCursor for ForwardBackwardMessageSyncCursor { self.forward.cursor.sync_state.next_block.saturating_sub(1) } - async fn update(&mut self, logs: Vec<(HyperlaneMessage, LogMeta)>) -> Result<()> { + async fn update(&mut self, logs: Vec<(T, LogMeta)>) -> Result<()> { match self.direction { SyncDirection::Forward => self.forward.update(logs).await, SyncDirection::Backward => self.backward.update(logs).await, diff --git a/rust/hyperlane-base/src/contract_sync/mod.rs b/rust/hyperlane-base/src/contract_sync/mod.rs index d569d2c14f..3968ad9f57 100644 --- a/rust/hyperlane-base/src/contract_sync/mod.rs +++ b/rust/hyperlane-base/src/contract_sync/mod.rs @@ -4,8 +4,8 @@ use cursor::*; use derive_new::new; use hyperlane_core::{ utils::fmt_sync_time, ContractSyncCursor, CursorAction, HyperlaneDomain, HyperlaneLogStore, - HyperlaneMessage, HyperlaneMessageStore, HyperlaneWatermarkedLogStore, Indexer, - SequenceIndexer, + HyperlaneSequenceIndexerStore, HyperlaneWatermarkedLogStore, Indexer, SequenceIndexer, + Sequenced, }; pub use metrics::ContractSyncMetrics; use tokio::time::sleep; @@ -121,20 +121,17 @@ where } } -/// A ContractSync for syncing messages using a MessageSyncCursor -pub type MessageContractSync = ContractSync< - HyperlaneMessage, - Arc, - Arc>, ->; -impl MessageContractSync { +/// A ContractSync for syncing messages using a SequenceSyncCursor +pub type SequencedDataContractSync = + ContractSync>, Arc>>; +impl SequencedDataContractSync { /// Returns a new cursor to be used for syncing dispatched messages from the indexer pub async fn forward_message_sync_cursor( &self, index_settings: IndexSettings, next_nonce: u32, - ) -> Box> { - Box::new(ForwardMessageSyncCursor::new( + ) -> Box> { + Box::new(ForwardSequenceSyncCursor::new( self.indexer.clone(), self.db.clone(), index_settings.chunk_size, @@ -149,9 +146,9 @@ impl MessageContractSync { pub async fn forward_backward_message_sync_cursor( &self, index_settings: IndexSettings, - ) -> Box> { + ) -> Box> { Box::new( - ForwardBackwardMessageSyncCursor::new( + ForwardBackwardSequenceSyncCursor::new( self.indexer.clone(), self.db.clone(), index_settings.chunk_size, diff --git a/rust/hyperlane-base/src/db/rocks/hyperlane_db.rs b/rust/hyperlane-base/src/db/rocks/hyperlane_db.rs index f01a12a166..807645beb0 100644 --- a/rust/hyperlane-base/src/db/rocks/hyperlane_db.rs +++ b/rust/hyperlane-base/src/db/rocks/hyperlane_db.rs @@ -4,9 +4,9 @@ use paste::paste; use tracing::{debug, instrument, trace}; use hyperlane_core::{ - GasPaymentKey, HyperlaneDomain, HyperlaneLogStore, HyperlaneMessage, HyperlaneMessageStore, - HyperlaneWatermarkedLogStore, InterchainGasExpenditure, InterchainGasPayment, - InterchainGasPaymentMeta, LogMeta, MerkleTreeInsertion, H256, + GasPaymentKey, HyperlaneDomain, HyperlaneLogStore, HyperlaneMessage, + HyperlaneSequenceIndexerStore, HyperlaneWatermarkedLogStore, InterchainGasExpenditure, + InterchainGasPayment, InterchainGasPaymentMeta, LogMeta, MerkleTreeInsertion, H256, }; use super::{ @@ -28,6 +28,8 @@ const PENDING_MESSAGE_RETRY_COUNT_FOR_MESSAGE_ID: &str = "pending_message_retry_count_for_message_id_"; const MERKLE_TREE_INSERTION: &str = "merkle_tree_insertion_"; const MERKLE_LEAF_INDEX_BY_MESSAGE_ID: &str = "merkle_leaf_index_by_message_id_"; +const MERKLE_TREE_INSERTION_BLOCK_NUMBER_BY_LEAF_INDEX: &str = + "merkle_tree_insertion_block_number_by_leaf_index_"; const LATEST_INDEXED_GAS_PAYMENT_BLOCK: &str = "latest_indexed_gas_payment_block"; type DbResult = std::result::Result; @@ -137,7 +139,11 @@ impl HyperlaneRocksDB { } /// Store the merkle tree insertion event, and also store a mapping from message_id to leaf_index - pub fn process_tree_insertion(&self, insertion: &MerkleTreeInsertion) -> DbResult { + pub fn process_tree_insertion( + &self, + insertion: &MerkleTreeInsertion, + insertion_block_number: u64, + ) -> DbResult { if let Ok(Some(_)) = self.retrieve_merkle_tree_insertion_by_leaf_index(&insertion.index()) { debug!(insertion=?insertion, "Tree insertion already stored in db"); return Ok(false); @@ -149,6 +155,11 @@ impl HyperlaneRocksDB { self.store_merkle_tree_insertion_by_leaf_index(&insertion.index(), insertion)?; self.store_merkle_leaf_index_by_message_id(&insertion.message_id(), &insertion.index())?; + + self.store_merkle_tree_insertion_block_number_by_leaf_index( + &insertion.index(), + &insertion_block_number, + )?; // Return true to indicate the tree insertion was processed Ok(true) } @@ -260,8 +271,8 @@ impl HyperlaneLogStore for HyperlaneRocksDB { #[instrument(skip_all)] async fn store_logs(&self, leaves: &[(MerkleTreeInsertion, LogMeta)]) -> Result { let mut insertions = 0; - for (insertion, _meta) in leaves { - if self.process_tree_insertion(insertion)? { + for (insertion, meta) in leaves { + if self.process_tree_insertion(insertion, meta.block_number)? { insertions += 1; } } @@ -270,16 +281,31 @@ impl HyperlaneLogStore for HyperlaneRocksDB { } #[async_trait] -impl HyperlaneMessageStore for HyperlaneRocksDB { - /// Gets a message by nonce. - async fn retrieve_message_by_nonce(&self, nonce: u32) -> Result> { - let message = self.retrieve_message_by_nonce(nonce)?; +impl HyperlaneSequenceIndexerStore for HyperlaneRocksDB { + /// Gets data by its sequence. + async fn retrieve_by_sequence(&self, sequence: u32) -> Result> { + let message = self.retrieve_message_by_nonce(sequence)?; Ok(message) } - /// Retrieve dispatched block number by message nonce - async fn retrieve_dispatched_block_number(&self, nonce: u32) -> Result> { - let number = self.retrieve_dispatched_block_number_by_nonce(&nonce)?; + /// Gets the block number at which the log occurred. + async fn retrieve_log_block_number(&self, sequence: u32) -> Result> { + let number = self.retrieve_dispatched_block_number_by_nonce(&sequence)?; + Ok(number) + } +} + +#[async_trait] +impl HyperlaneSequenceIndexerStore for HyperlaneRocksDB { + /// Gets data by its sequence. + async fn retrieve_by_sequence(&self, sequence: u32) -> Result> { + let insertion = self.retrieve_merkle_tree_insertion_by_leaf_index(&sequence)?; + Ok(insertion) + } + + /// Gets the block number at which the log occurred. + async fn retrieve_log_block_number(&self, sequence: u32) -> Result> { + let number = self.retrieve_merkle_tree_insertion_block_number_by_leaf_index(&sequence)?; Ok(number) } } @@ -357,3 +383,10 @@ make_store_and_retrieve!( H256, u32 ); +make_store_and_retrieve!( + pub, + merkle_tree_insertion_block_number_by_leaf_index, + MERKLE_TREE_INSERTION_BLOCK_NUMBER_BY_LEAF_INDEX, + u32, + u64 +); diff --git a/rust/hyperlane-base/src/settings/base.rs b/rust/hyperlane-base/src/settings/base.rs index efdda4e834..135d80ea0b 100644 --- a/rust/hyperlane-base/src/settings/base.rs +++ b/rust/hyperlane-base/src/settings/base.rs @@ -3,14 +3,15 @@ use std::{collections::HashMap, fmt::Debug, sync::Arc}; use eyre::{eyre, Context, Result}; use futures_util::future::try_join_all; use hyperlane_core::{ - Delivery, HyperlaneChain, HyperlaneDomain, HyperlaneMessageStore, HyperlaneProvider, - HyperlaneWatermarkedLogStore, InterchainGasPaymaster, InterchainGasPayment, Mailbox, - MerkleTreeHook, MerkleTreeInsertion, MultisigIsm, ValidatorAnnounce, H256, + Delivery, HyperlaneChain, HyperlaneDomain, HyperlaneMessage, HyperlaneProvider, + HyperlaneSequenceIndexerStore, HyperlaneWatermarkedLogStore, InterchainGasPaymaster, + InterchainGasPayment, Mailbox, MerkleTreeHook, MerkleTreeInsertion, MultisigIsm, + ValidatorAnnounce, H256, }; use crate::{ settings::{chains::ChainConf, trace::TracingConfig}, - ContractSync, ContractSyncMetrics, CoreMetrics, HyperlaneAgentCore, MessageContractSync, + ContractSync, ContractSyncMetrics, CoreMetrics, HyperlaneAgentCore, SequencedDataContractSync, WatermarkContractSync, }; @@ -183,7 +184,7 @@ impl Settings { build_contract_fns!(build_validator_announce, build_validator_announces -> dyn ValidatorAnnounce); build_contract_fns!(build_provider, build_providers -> dyn HyperlaneProvider); build_indexer_fns!(build_delivery_indexer, build_delivery_indexers -> dyn HyperlaneWatermarkedLogStore, WatermarkContractSync); - build_indexer_fns!(build_message_indexer, build_message_indexers -> dyn HyperlaneMessageStore, MessageContractSync); + build_indexer_fns!(build_message_indexer, build_message_indexers -> dyn HyperlaneSequenceIndexerStore, SequencedDataContractSync); build_indexer_fns!(build_interchain_gas_payment_indexer, build_interchain_gas_payment_indexers -> dyn HyperlaneWatermarkedLogStore, WatermarkContractSync); - build_indexer_fns!(build_merkle_tree_hook_indexer, build_merkle_tree_hook_indexers -> dyn HyperlaneWatermarkedLogStore, WatermarkContractSync); + build_indexer_fns!(build_merkle_tree_hook_indexer, build_merkle_tree_hook_indexers -> dyn HyperlaneSequenceIndexerStore, SequencedDataContractSync); } diff --git a/rust/hyperlane-base/src/settings/chains.rs b/rust/hyperlane-base/src/settings/chains.rs index f974622612..6764b4b4f9 100644 --- a/rust/hyperlane-base/src/settings/chains.rs +++ b/rust/hyperlane-base/src/settings/chains.rs @@ -387,9 +387,12 @@ impl ChainConf { Ok(indexer as Box>) } ChainConnectionConf::Cosmos(conf) => { + let signer = self.cosmos_signer().await.context(ctx)?; let indexer = Box::new(h_cosmos::CosmosMerkleTreeHookIndexer::new( conf.clone(), locator, + // TODO: remove signer requirement entirely + signer.unwrap().clone(), self.reorg_period, )); Ok(indexer as Box>) diff --git a/rust/hyperlane-core/src/traits/db.rs b/rust/hyperlane-core/src/traits/db.rs index 50f9960e04..3fbebf52db 100644 --- a/rust/hyperlane-core/src/traits/db.rs +++ b/rust/hyperlane-core/src/traits/db.rs @@ -4,7 +4,7 @@ use async_trait::async_trait; use auto_impl::auto_impl; use eyre::Result; -use crate::{HyperlaneMessage, LogMeta}; +use crate::LogMeta; /// Interface for a HyperlaneLogStore that ingests logs. #[async_trait] @@ -15,14 +15,26 @@ pub trait HyperlaneLogStore: Send + Sync + Debug { async fn store_logs(&self, logs: &[(T, LogMeta)]) -> Result; } -/// Extension of HyperlaneLogStore trait that supports getting the block number at which a known message was dispatched. +/// A sequence is a monotonically increasing number that is incremented every time a message ID is indexed. +/// E.g. for Mailbox indexing, this is equal to the message nonce, and for merkle tree hook indexing, this +/// is equal to the leaf index. +pub trait Sequenced: 'static + Send + Sync { + /// The sequence of this sequenced type. + fn sequence(&self) -> u32; +} + +/// Extension of HyperlaneLogStore trait that supports indexed sequenced data. #[async_trait] #[auto_impl(&, Box, Arc)] -pub trait HyperlaneMessageStore: HyperlaneLogStore { - /// Gets a message by nonce. - async fn retrieve_message_by_nonce(&self, nonce: u32) -> Result>; - /// Gets the block number at which a message was dispatched. - async fn retrieve_dispatched_block_number(&self, nonce: u32) -> Result>; +pub trait HyperlaneSequenceIndexerStore: HyperlaneLogStore +where + T: Send + Sync, +{ + /// Gets data by its sequence. + async fn retrieve_by_sequence(&self, sequence: u32) -> Result>; + + /// Gets the block number at which the log occurred. + async fn retrieve_log_block_number(&self, nonce: u32) -> Result>; } /// Extension of HyperlaneLogStore trait that supports a high watermark for the highest indexed block number. @@ -31,6 +43,7 @@ pub trait HyperlaneMessageStore: HyperlaneLogStore { pub trait HyperlaneWatermarkedLogStore: HyperlaneLogStore { /// Gets the block number high watermark async fn retrieve_high_watermark(&self) -> Result>; + /// Stores the block number high watermark async fn store_high_watermark(&self, block_number: u32) -> Result<()>; } diff --git a/rust/hyperlane-core/src/types/merkle_tree.rs b/rust/hyperlane-core/src/types/merkle_tree.rs index 1a5a4058f0..2e9020043d 100644 --- a/rust/hyperlane-core/src/types/merkle_tree.rs +++ b/rust/hyperlane-core/src/types/merkle_tree.rs @@ -1,7 +1,7 @@ use derive_new::new; use std::io::{Read, Write}; -use crate::{Decode, Encode, HyperlaneProtocolError, H256}; +use crate::{Decode, Encode, HyperlaneProtocolError, Sequenced, H256}; /// Merkle Tree Hook insertion event #[derive(Debug, Copy, Clone, new)] @@ -22,6 +22,12 @@ impl MerkleTreeInsertion { } } +impl Sequenced for MerkleTreeInsertion { + fn sequence(&self) -> u32 { + self.leaf_index + } +} + impl Encode for MerkleTreeInsertion { fn write_to(&self, writer: &mut W) -> std::io::Result where diff --git a/rust/hyperlane-core/src/types/message.rs b/rust/hyperlane-core/src/types/message.rs index 1faec8436d..4ebaffc1cd 100644 --- a/rust/hyperlane-core/src/types/message.rs +++ b/rust/hyperlane-core/src/types/message.rs @@ -2,7 +2,7 @@ use sha3::{digest::Update, Digest, Keccak256}; use std::fmt::{Debug, Display, Formatter}; use crate::utils::{fmt_address_for_domain, fmt_domain}; -use crate::{Decode, Encode, HyperlaneProtocolError, H256}; +use crate::{Decode, Encode, HyperlaneProtocolError, Sequenced, H256}; const HYPERLANE_MESSAGE_PREFIX_LEN: usize = 77; @@ -39,6 +39,12 @@ pub struct HyperlaneMessage { pub body: Vec, } +impl Sequenced for HyperlaneMessage { + fn sequence(&self) -> u32 { + self.nonce + } +} + impl Debug for HyperlaneMessage { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { write!( From 453734a5170c84831146e1bb7756395d2f3b2225 Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Fri, 3 Nov 2023 17:17:30 +0000 Subject: [PATCH 130/142] Refactor indexing (#2889) ### Description * Stops creating a new client a bunch of times in rpc.rs (I haven't yet changed grpc.rs - this is because the client's functions are `&mut self`, so will have to think about what to do here) * Changes `unwrap_or_none_result` to not include the `let Some(varname)` bit so we can do `let varname = unwrap_or_none_result!(...)` * Instead of a `get_parser(&self, ...)` fn that returns a closure, we just pass a the function `Self::[data_type]_parser` * Refactors these parsers to be a bit more defensive - e.g. each param is represented as an Option so it's clear if one isn't parsed, and we also get the `_contract_address` param (which is auto-set by the cosmwasm runtime). It returns a `ParsedEvent` so that we can return the `_contract_address` in there too * Refactors the range indexing in rpc.rs, including an important fix to ensure that the contract address of an event is the one we actually want to index ### Drive-by changes n/a ### Related issues n/a ### Backward compatibility Fully ### Testing Unit tests, ran locally --- rust/Cargo.lock | 1 + rust/Cargo.toml | 1 + .../metadata/multisig/merkle_root_multisig.rs | 12 +- .../metadata/multisig/message_id_multisig.rs | 6 +- rust/agents/scraper/src/chain_scraper/mod.rs | 5 +- rust/chains/hyperlane-cosmos/Cargo.toml | 1 + .../hyperlane-cosmos/src/interchain_gas.rs | 242 ++++++++++++---- rust/chains/hyperlane-cosmos/src/mailbox.rs | 157 ++++++++--- .../hyperlane-cosmos/src/merkle_tree_hook.rs | 193 ++++++++----- .../hyperlane-cosmos/src/payloads/general.rs | 10 + .../hyperlane-cosmos/src/providers/rpc.rs | 260 ++++++++++-------- rust/chains/hyperlane-cosmos/src/utils.rs | 25 +- rust/hyperlane-base/src/settings/chains.rs | 11 +- .../src/settings/loader/arguments.rs | 2 +- rust/hyperlane-core/src/types/merkle_tree.rs | 2 +- rust/hyperlane-core/src/types/message.rs | 2 +- rust/hyperlane-core/src/types/mod.rs | 2 +- rust/hyperlane-core/src/utils.rs | 9 +- 18 files changed, 632 insertions(+), 309 deletions(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 7bd66adcd7..19f764e785 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -4160,6 +4160,7 @@ dependencies = [ "hyper", "hyper-tls", "hyperlane-core", + "once_cell", "ripemd", "serde", "serde_json", diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 9edea2a973..e7a6e3a9cb 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -99,6 +99,7 @@ num = "0.4" num-bigint = "0.4" num-derive = "0.4.0" num-traits = "0.2" +once_cell = "1.18.0" parking_lot = "0.12" paste = "1.0" pretty_env_logger = "0.5.0" diff --git a/rust/agents/relayer/src/msg/metadata/multisig/merkle_root_multisig.rs b/rust/agents/relayer/src/msg/metadata/multisig/merkle_root_multisig.rs index 4bd1261907..325288447a 100644 --- a/rust/agents/relayer/src/msg/metadata/multisig/merkle_root_multisig.rs +++ b/rust/agents/relayer/src/msg/metadata/multisig/merkle_root_multisig.rs @@ -36,13 +36,11 @@ impl MultisigIsmMetadataBuilder for MerkleRootMultisigMetadataBuilder { checkpoint_syncer: &MultisigCheckpointSyncer, ) -> Result> { const CTX: &str = "When fetching MerkleRootMultisig metadata"; - unwrap_or_none_result!( - highest_leaf_index, + let highest_leaf_index = unwrap_or_none_result!( self.highest_known_leaf_index().await, debug!("Couldn't get highest known leaf index") ); - unwrap_or_none_result!( - leaf_index, + let leaf_index = unwrap_or_none_result!( self.get_merkle_leaf_id_by_message_id(message.id()) .await .context(CTX)?, @@ -51,8 +49,7 @@ impl MultisigIsmMetadataBuilder for MerkleRootMultisigMetadataBuilder { "No merkle leaf found for message id, must have not been enqueued in the tree" ) ); - unwrap_or_none_result!( - quorum_checkpoint, + let quorum_checkpoint = unwrap_or_none_result!( checkpoint_syncer .fetch_checkpoint_in_range( validators, @@ -67,8 +64,7 @@ impl MultisigIsmMetadataBuilder for MerkleRootMultisigMetadataBuilder { highest_leaf_index, "Couldn't get checkpoint in range" ) ); - unwrap_or_none_result!( - proof, + let proof = unwrap_or_none_result!( self.get_proof(leaf_index, quorum_checkpoint.checkpoint.checkpoint) .await .context(CTX)?, diff --git a/rust/agents/relayer/src/msg/metadata/multisig/message_id_multisig.rs b/rust/agents/relayer/src/msg/metadata/multisig/message_id_multisig.rs index 3ccfcf57b7..e5feffb85f 100644 --- a/rust/agents/relayer/src/msg/metadata/multisig/message_id_multisig.rs +++ b/rust/agents/relayer/src/msg/metadata/multisig/message_id_multisig.rs @@ -37,8 +37,7 @@ impl MultisigIsmMetadataBuilder for MessageIdMultisigMetadataBuilder { let message_id = message.id(); const CTX: &str = "When fetching MessageIdMultisig metadata"; - unwrap_or_none_result!( - leaf_index, + let leaf_index = unwrap_or_none_result!( self.get_merkle_leaf_id_by_message_id(message_id) .await .context(CTX)?, @@ -47,8 +46,7 @@ impl MultisigIsmMetadataBuilder for MessageIdMultisigMetadataBuilder { "No merkle leaf found for message id, must have not been enqueued in the tree" ) ); - unwrap_or_none_result!( - quorum_checkpoint, + let quorum_checkpoint = unwrap_or_none_result!( checkpoint_syncer .fetch_checkpoint(validators, threshold as usize, leaf_index) .await diff --git a/rust/agents/scraper/src/chain_scraper/mod.rs b/rust/agents/scraper/src/chain_scraper/mod.rs index 78410277d3..4d91fed5a8 100644 --- a/rust/agents/scraper/src/chain_scraper/mod.rs +++ b/rust/agents/scraper/src/chain_scraper/mod.rs @@ -382,13 +382,12 @@ impl HyperlaneSequenceIndexerStore for HyperlaneSqlDb { /// Gets the block number at which the log occurred. async fn retrieve_log_block_number(&self, sequence: u32) -> Result> { - unwrap_or_none_result!( - tx_id, + let tx_id = unwrap_or_none_result!( self.db .retrieve_dispatched_tx_id(self.domain().id(), &self.mailbox_address, sequence) .await? ); - unwrap_or_none_result!(block_id, self.db.retrieve_block_id(tx_id).await?); + let block_id = unwrap_or_none_result!(self.db.retrieve_block_id(tx_id).await?); Ok(self.db.retrieve_block_number(block_id).await?) } } diff --git a/rust/chains/hyperlane-cosmos/Cargo.toml b/rust/chains/hyperlane-cosmos/Cargo.toml index 0da9b9bc93..1825ec7174 100644 --- a/rust/chains/hyperlane-cosmos/Cargo.toml +++ b/rust/chains/hyperlane-cosmos/Cargo.toml @@ -19,6 +19,7 @@ url = { workspace = true } bech32 = { workspace = true } base64 = { workspace = true } serde_json = { workspace = true } +once_cell = { workspace = true } tonic = { workspace = true } sha2 = { workspace = true } ripemd = { workspace = true } diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index 955182ec2d..621f76fa7b 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -1,18 +1,21 @@ use async_trait::async_trait; -use base64::engine::general_purpose::STANDARD; -use base64::Engine; +use base64::{engine::general_purpose::STANDARD as BASE64, Engine}; use cosmrs::tendermint::abci::EventAttribute; use hyperlane_core::{ - ChainResult, ContractLocator, HyperlaneChain, HyperlaneContract, Indexer, - InterchainGasPaymaster, SequenceIndexer, U256, + ChainCommunicationError, ChainResult, ContractLocator, HyperlaneChain, HyperlaneContract, + HyperlaneDomain, HyperlaneProvider, Indexer, InterchainGasPaymaster, InterchainGasPayment, + LogMeta, SequenceIndexer, H256, U256, }; -use hyperlane_core::{HyperlaneDomain, HyperlaneProvider, InterchainGasPayment, LogMeta, H256}; +use once_cell::sync::Lazy; use std::ops::RangeInclusive; -use crate::grpc::WasmGrpcProvider; -use crate::rpc::{CosmosWasmIndexer, WasmIndexer}; -use crate::signers::Signer; -use crate::{ConnectionConf, CosmosProvider}; +use crate::{ + grpc::WasmGrpcProvider, + rpc::{CosmosWasmIndexer, ParsedEvent, WasmIndexer}, + signers::Signer, + utils::{CONTRACT_ADDRESS_ATTRIBUTE_KEY, CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64}, + ConnectionConf, CosmosProvider, +}; /// A reference to a InterchainGasPaymaster contract on some Cosmos chain #[derive(Debug)] @@ -51,6 +54,24 @@ impl CosmosInterchainGasPaymaster { } } +// ------------------ Indexer ------------------ + +const MESSAGE_ID_ATTRIBUTE_KEY: &str = "message_id"; +static MESSAGE_ID_ATTRIBUTE_KEY_BASE64: Lazy = + Lazy::new(|| BASE64.encode(MESSAGE_ID_ATTRIBUTE_KEY)); + +const PAYMENT_ATTRIBUTE_KEY: &str = "payment"; +static PAYMENT_ATTRIBUTE_KEY_BASE64: Lazy = + Lazy::new(|| BASE64.encode(PAYMENT_ATTRIBUTE_KEY)); + +const GAS_AMOUNT_ATTRIBUTE_KEY: &str = "gas_amount"; +static GAS_AMOUNT_ATTRIBUTE_KEY_BASE64: Lazy = + Lazy::new(|| BASE64.encode(GAS_AMOUNT_ATTRIBUTE_KEY)); + +const DESTINATION_ATTRIBUTE_KEY: &str = "dest_domain"; +static DESTINATION_ATTRIBUTE_KEY_BASE64: Lazy = + Lazy::new(|| BASE64.encode(DESTINATION_ATTRIBUTE_KEY)); + /// A reference to a InterchainGasPaymasterIndexer contract on some Cosmos chain #[derive(Debug)] pub struct CosmosInterchainGasPaymasterIndexer { @@ -58,62 +79,88 @@ pub struct CosmosInterchainGasPaymasterIndexer { } impl CosmosInterchainGasPaymasterIndexer { + /// The interchain gas payment event type from the CW contract. + const INTERCHAIN_GAS_PAYMENT_EVENT_TYPE: &str = "igp-core-pay-for-gas"; + /// create new Cosmos InterchainGasPaymasterIndexer agent pub fn new( conf: ConnectionConf, locator: ContractLocator, - event_type: String, reorg_period: u32, - ) -> Self { - let indexer: CosmosWasmIndexer = - CosmosWasmIndexer::new(conf, locator, event_type.clone(), reorg_period); + ) -> ChainResult { + let indexer = CosmosWasmIndexer::new( + conf, + locator, + Self::INTERCHAIN_GAS_PAYMENT_EVENT_TYPE.into(), + reorg_period, + )?; - Self { + Ok(Self { indexer: Box::new(indexer), - } + }) } - fn get_parser( - &self, - ) -> fn(attrs: Vec) -> ChainResult> { - |attrs: Vec| -> ChainResult> { - let mut res = InterchainGasPayment::default(); - for attr in attrs { - let key = attr.key.as_str(); - let value = attr.value; - let value = value.as_str(); - - match key { - "message_id" => { - res.message_id = H256::from_slice(hex::decode(value)?.as_slice()) - } - "bWVzc2FnZV9pZA==" => { - res.message_id = H256::from_slice( - hex::decode(String::from_utf8(STANDARD.decode(value)?)?)?.as_slice(), - ) - } - "payment" => res.payment = value.parse()?, - "cGF5bWVudA==" => { - let dec_str = String::from_utf8(STANDARD.decode(value)?)?; - // U256's from_str assumes a radix of 16, so we explicitly use from_dec_str. - res.payment = U256::from_dec_str(dec_str.as_str())?; - } - "gas_amount" => res.gas_amount = value.parse()?, - "Z2FzX2Ftb3VudA==" => { - let dec_str = String::from_utf8(STANDARD.decode(value)?)?; - // U256's from_str assumes a radix of 16, so we explicitly use from_dec_str. - res.gas_amount = U256::from_dec_str(dec_str.as_str())?; - } - "dest_domain" => res.destination = value.parse()?, - "ZGVzdF9kb21haW4=" => { - res.destination = String::from_utf8(STANDARD.decode(value)?)?.parse()? - } - _ => {} + fn interchain_gas_payment_parser( + attrs: &Vec, + ) -> ChainResult> { + let mut contract_address: Option = None; + let mut gas_payment = IncompleteInterchainGasPayment::default(); + + for attr in attrs { + let key = attr.key.as_str(); + let value = attr.value.as_str(); + + match key { + CONTRACT_ADDRESS_ATTRIBUTE_KEY => { + contract_address = Some(value.to_string()); + } + v if *CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64 == v => { + contract_address = Some(String::from_utf8(BASE64.decode(value)?)?); + } + + MESSAGE_ID_ATTRIBUTE_KEY => { + gas_payment.message_id = Some(H256::from_slice(hex::decode(value)?.as_slice())); + } + v if *MESSAGE_ID_ATTRIBUTE_KEY_BASE64 == v => { + gas_payment.message_id = Some(H256::from_slice( + hex::decode(String::from_utf8(BASE64.decode(value)?)?)?.as_slice(), + )); + } + + PAYMENT_ATTRIBUTE_KEY => { + gas_payment.payment = Some(U256::from_dec_str(value)?); + } + v if *PAYMENT_ATTRIBUTE_KEY_BASE64 == v => { + let dec_str = String::from_utf8(BASE64.decode(value)?)?; + // U256's from_str assumes a radix of 16, so we explicitly use from_dec_str. + gas_payment.payment = Some(U256::from_dec_str(dec_str.as_str())?); + } + + GAS_AMOUNT_ATTRIBUTE_KEY => { + gas_payment.gas_amount = Some(U256::from_dec_str(value)?); + } + v if *GAS_AMOUNT_ATTRIBUTE_KEY_BASE64 == v => { + let dec_str = String::from_utf8(BASE64.decode(value)?)?; + // U256's from_str assumes a radix of 16, so we explicitly use from_dec_str. + gas_payment.gas_amount = Some(U256::from_dec_str(dec_str.as_str())?); + } + + DESTINATION_ATTRIBUTE_KEY => { + gas_payment.destination = Some(value.parse::()?); + } + v if *DESTINATION_ATTRIBUTE_KEY_BASE64 == v => { + gas_payment.destination = + Some(String::from_utf8(BASE64.decode(value)?)?.parse()?); } - } - Ok(Some(res)) + _ => {} + } } + + let contract_address = contract_address + .ok_or_else(|| ChainCommunicationError::from_other_str("missing contract_address"))?; + + Ok(ParsedEvent::new(contract_address, gas_payment.try_into()?)) } } @@ -123,8 +170,10 @@ impl Indexer for CosmosInterchainGasPaymasterIndexer { &self, range: RangeInclusive, ) -> ChainResult> { - let parser = self.get_parser(); - let result = self.indexer.get_range_event_logs(range, parser).await?; + let result = self + .indexer + .get_range_event_logs(range, Self::interchain_gas_payment_parser) + .await?; Ok(result) } @@ -141,3 +190,86 @@ impl SequenceIndexer for CosmosInterchainGasPaymasterIndex Ok((None, tip)) } } + +#[derive(Default)] +struct IncompleteInterchainGasPayment { + message_id: Option, + payment: Option, + gas_amount: Option, + destination: Option, +} + +impl TryInto for IncompleteInterchainGasPayment { + type Error = ChainCommunicationError; + + fn try_into(self) -> Result { + let message_id = self + .message_id + .ok_or_else(|| ChainCommunicationError::from_other_str("missing message_id"))?; + let payment = self + .payment + .ok_or_else(|| ChainCommunicationError::from_other_str("missing payment"))?; + let gas_amount = self + .gas_amount + .ok_or_else(|| ChainCommunicationError::from_other_str("missing gas_amount"))?; + let destination = self + .destination + .ok_or_else(|| ChainCommunicationError::from_other_str("missing destination"))?; + + Ok(InterchainGasPayment { + message_id, + payment, + gas_amount, + destination, + }) + } +} + +#[cfg(test)] +mod tests { + use cosmrs::tendermint::abci::EventAttribute; + use hyperlane_core::{InterchainGasPayment, H256, U256}; + use std::str::FromStr; + + use crate::{rpc::ParsedEvent, utils::event_attributes_from_str}; + + use super::*; + + #[test] + fn test_interchain_gas_payment_parser() { + // Examples from https://rpc-kralum.neutron-1.neutron.org/tx_search?query=%22tx.height%20%3E=%204000000%20AND%20tx.height%20%3C=%204100000%20AND%20wasm-igp-core-pay-for-gas._contract_address%20=%20%27neutron12p8wntzra3vpfcqv05scdx5sa3ftaj6gjcmtm7ynkl0e6crtt4ns8cnrmx%27%22&prove=false&page=1&per_page=100 + + let expected = ParsedEvent::new( + "neutron12p8wntzra3vpfcqv05scdx5sa3ftaj6gjcmtm7ynkl0e6crtt4ns8cnrmx".into(), + InterchainGasPayment { + message_id: H256::from_str( + "5dcf6120f8adf4f267eb1a122a85c42eae257fbc872671e93929fbf63daed19b", + ) + .unwrap(), + payment: U256::from(2), + gas_amount: U256::from(25000), + destination: 169, + }, + ); + + let assert_parsed_event = |attrs: &Vec| { + let parsed_event = + CosmosInterchainGasPaymasterIndexer::interchain_gas_payment_parser(attrs).unwrap(); + + assert_eq!(parsed_event, expected); + }; + + // Non-base64 version + let non_base64_attrs = event_attributes_from_str( + r#"[{"key":"_contract_address","value":"neutron12p8wntzra3vpfcqv05scdx5sa3ftaj6gjcmtm7ynkl0e6crtt4ns8cnrmx", "index": true},{"key":"dest_domain","value":"169", "index": true},{"key":"gas_amount","value":"25000", "index": true},{"key":"gas_refunded","value":"0", "index": true},{"key":"gas_required","value":"2", "index": true},{"key":"message_id","value":"5dcf6120f8adf4f267eb1a122a85c42eae257fbc872671e93929fbf63daed19b", "index": true},{"key":"payment","value":"2", "index": true},{"key":"sender","value":"neutron1vdazwhwkh9wy6ue66pjpuvrxcrywv2ww956dq6ls2gh0n7t9f5rs2hydt2", "index": true}]"#, + ); + assert_parsed_event(&non_base64_attrs); + + // Base64 version + let base64_attrs = event_attributes_from_str( + r#"[{"key":"X2NvbnRyYWN0X2FkZHJlc3M=","value":"bmV1dHJvbjEycDh3bnR6cmEzdnBmY3F2MDVzY2R4NXNhM2Z0YWo2Z2pjbXRtN3lua2wwZTZjcnR0NG5zOGNucm14","index":true},{"key":"ZGVzdF9kb21haW4=","value":"MTY5","index":true},{"key":"Z2FzX2Ftb3VudA==","value":"MjUwMDA=","index":true},{"key":"Z2FzX3JlZnVuZGVk","value":"MA==","index":true},{"key":"Z2FzX3JlcXVpcmVk","value":"Mg==","index":true},{"key":"bWVzc2FnZV9pZA==","value":"NWRjZjYxMjBmOGFkZjRmMjY3ZWIxYTEyMmE4NWM0MmVhZTI1N2ZiYzg3MjY3MWU5MzkyOWZiZjYzZGFlZDE5Yg==","index":true},{"key":"cGF5bWVudA==","value":"Mg==","index":true},{"key":"c2VuZGVy","value":"bmV1dHJvbjF2ZGF6d2h3a2g5d3k2dWU2NnBqcHV2cnhjcnl3djJ3dzk1NmRxNmxzMmdoMG43dDlmNXJzMmh5ZHQy","index":true}]"#, + ); + + assert_parsed_event(&base64_attrs); + } +} diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index d14e28f32c..301e212a78 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -1,24 +1,29 @@ -use base64::Engine; -use std::fmt::{Debug, Formatter}; -use std::io::Cursor; -use std::num::NonZeroU64; -use std::ops::RangeInclusive; +use base64::{engine::general_purpose::STANDARD as BASE64, Engine}; +use std::{ + fmt::{Debug, Formatter}, + io::Cursor, + num::NonZeroU64, + ops::RangeInclusive, +}; use crate::grpc::{WasmGrpcProvider, WasmProvider}; use crate::payloads::mailbox::{ GeneralMailboxQuery, ProcessMessageRequest, ProcessMessageRequestInner, }; use crate::payloads::{general, mailbox}; -use crate::rpc::{CosmosWasmIndexer, WasmIndexer}; +use crate::rpc::{CosmosWasmIndexer, ParsedEvent, WasmIndexer}; use crate::CosmosProvider; use crate::{signers::Signer, utils::get_block_height_for_lag, verify, ConnectionConf}; use async_trait::async_trait; - use cosmrs::proto::cosmos::base::abci::v1beta1::TxResponse; use cosmrs::proto::cosmos::tx::v1beta1::SimulateResponse; use cosmrs::tendermint::abci::EventAttribute; +use once_cell::sync::Lazy; -use crate::binary::h256_to_h512; +use crate::{ + binary::h256_to_h512, + utils::{CONTRACT_ADDRESS_ATTRIBUTE_KEY, CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64}, +}; use hyperlane_core::{ utils::fmt_bytes, ChainResult, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneMessage, HyperlaneProvider, Indexer, LogMeta, Mailbox, TxCostEstimate, TxOutcome, @@ -31,7 +36,6 @@ use tracing::{instrument, warn}; /// A reference to a Mailbox contract on some Cosmos chain pub struct CosmosMailbox { - _conf: ConnectionConf, domain: HyperlaneDomain, address: H256, signer: Signer, @@ -42,10 +46,9 @@ impl CosmosMailbox { /// Create a reference to a mailbox at a specific Ethereum address on some /// chain pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { - let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); + let provider = WasmGrpcProvider::new(conf, locator.clone(), signer.clone()); Self { - _conf: conf, domain: locator.domain.clone(), address: locator.address, signer, @@ -234,6 +237,12 @@ impl CosmosMailbox { } } +// ------------------ Indexer ------------------ + +const MESSAGE_ATTRIBUTE_KEY: &str = "message"; +static MESSAGE_ATTRIBUTE_KEY_BASE64: Lazy = + Lazy::new(|| BASE64.encode(MESSAGE_ATTRIBUTE_KEY)); + /// Struct that retrieves event data for a Cosmos Mailbox contract #[derive(Debug)] pub struct CosmosMailboxIndexer { @@ -242,50 +251,73 @@ pub struct CosmosMailboxIndexer { } impl CosmosMailboxIndexer { + /// The message dispatch event type from the CW contract. + const MESSAGE_DISPATCH_EVENT_TYPE: &str = "mailbox_dispatch"; + /// Create a reference to a mailbox at a specific Ethereum address on some /// chain pub fn new( conf: ConnectionConf, locator: ContractLocator, signer: Signer, - event_type: String, reorg_period: u32, - ) -> Self { + ) -> ChainResult { let mailbox = CosmosMailbox::new(conf.clone(), locator.clone(), signer.clone()); - let indexer: CosmosWasmIndexer = - CosmosWasmIndexer::new(conf, locator, event_type, reorg_period); - - Self { + let indexer = CosmosWasmIndexer::new( + conf, + locator, + Self::MESSAGE_DISPATCH_EVENT_TYPE.into(), + reorg_period, + )?; + + Ok(Self { mailbox, indexer: Box::new(indexer), - } + }) } - fn get_parser( - &self, - ) -> fn(attrs: Vec) -> ChainResult> { - |attrs: Vec| -> ChainResult> { - let res = HyperlaneMessage::default(); + fn hyperlane_message_parser( + attrs: &Vec, + ) -> ChainResult> { + let mut contract_address: Option = None; + let mut message: Option = None; - for attr in attrs { - let key = attr.key.as_str(); - let value = attr.value; - let value = value.as_str(); + for attr in attrs { + let key = attr.key.as_str(); + let value = attr.value.as_str(); - if key == "message" { - let mut reader = Cursor::new(hex::decode(value)?); - return Ok(Some(HyperlaneMessage::read_from(&mut reader)?)); + match key { + CONTRACT_ADDRESS_ATTRIBUTE_KEY => { + contract_address = Some(value.to_string()); + } + v if *CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64 == v => { + contract_address = Some(String::from_utf8(BASE64.decode(value)?)?); } - if key == "bWVzc2FnZQ==" { - let mut reader = Cursor::new(hex::decode(String::from_utf8( - base64::engine::general_purpose::STANDARD.decode(value)?, - )?)?); - return Ok(Some(HyperlaneMessage::read_from(&mut reader)?)); + MESSAGE_ATTRIBUTE_KEY => { + // Intentionally using read_from to get a Result::Err if there's + // an issue with the message. + let mut reader = Cursor::new(hex::decode(value)?); + message = Some(HyperlaneMessage::read_from(&mut reader)?); } + v if *MESSAGE_ATTRIBUTE_KEY_BASE64 == v => { + // Intentionally using read_from to get a Result::Err if there's + // an issue with the message. + let mut reader = + Cursor::new(hex::decode(String::from_utf8(BASE64.decode(value)?)?)?); + message = Some(HyperlaneMessage::read_from(&mut reader)?); + } + + _ => {} } - Ok(None) } + + let contract_address = contract_address + .ok_or_else(|| ChainCommunicationError::from_other_str("missing contract_address"))?; + let message = + message.ok_or_else(|| ChainCommunicationError::from_other_str("missing message"))?; + + Ok(ParsedEvent::new(contract_address, message)) } } @@ -295,8 +327,10 @@ impl Indexer for CosmosMailboxIndexer { &self, range: RangeInclusive, ) -> ChainResult> { - let parser = self.get_parser(); - let result = self.indexer.get_range_event_logs(range, parser).await?; + let result = self + .indexer + .get_range_event_logs(range, Self::hyperlane_message_parser) + .await?; Ok(result) } @@ -309,13 +343,8 @@ impl Indexer for CosmosMailboxIndexer { #[async_trait] impl Indexer for CosmosMailboxIndexer { async fn fetch_logs(&self, range: RangeInclusive) -> ChainResult> { - let parser = self.get_parser(); - let result = self.indexer.get_range_event_logs(range, parser).await?; - - Ok(result - .into_iter() - .map(|(msg, meta)| (msg.id(), meta)) - .collect()) + // TODO: implement when implementing Cosmos scraping + todo!() } async fn get_finalized_block_number(&self) -> ChainResult { @@ -343,3 +372,41 @@ impl SequenceIndexer for CosmosMailboxIndexer { Ok((Some(sequence), tip)) } } + +#[cfg(test)] +mod tests { + use cosmrs::tendermint::abci::EventAttribute; + use hyperlane_core::HyperlaneMessage; + + use crate::{rpc::ParsedEvent, utils::event_attributes_from_str}; + + use super::*; + + #[test] + fn test_hyperlane_message_parser() { + // Examples from https://rpc-kralum.neutron-1.neutron.org/tx_search?query=%22tx.height%20%3E=%204000000%20AND%20tx.height%20%3C=%204100000%20AND%20wasm-mailbox_dispatch._contract_address%20=%20%27neutron1sjzzd4gwkggy6hrrs8kxxatexzcuz3jecsxm3wqgregkulzj8r7qlnuef4%27%22&prove=false&page=1&per_page=100 + + let expected = ParsedEvent::new( + "neutron1sjzzd4gwkggy6hrrs8kxxatexzcuz3jecsxm3wqgregkulzj8r7qlnuef4".into(), + HyperlaneMessage::from(hex::decode("03000000006e74726e0000000000000000000000006ba6343a09a60ac048d0e99f50b76fd99eff1063000000a9000000000000000000000000281973b53c9aacec128ac964a6f750fea40912aa48656c6c6f2066726f6d204e657574726f6e204d61696e6e657420746f204d616e74612050616369666963206f63742032392c2031323a353520616d").unwrap()), + ); + + let assert_parsed_event = |attrs: &Vec| { + let parsed_event = CosmosMailboxIndexer::hyperlane_message_parser(attrs).unwrap(); + + assert_eq!(parsed_event, expected); + }; + + // Non-base64 version + let non_base64_attrs = event_attributes_from_str( + r#"[{"key":"_contract_address","value":"neutron1sjzzd4gwkggy6hrrs8kxxatexzcuz3jecsxm3wqgregkulzj8r7qlnuef4","index":true},{"key":"sender","value":"0000000000000000000000006ba6343a09a60ac048d0e99f50b76fd99eff1063","index":true},{"key":"destination","value":"169","index":true},{"key":"recipient","value":"000000000000000000000000281973b53c9aacec128ac964a6f750fea40912aa","index":true},{"key":"message","value":"03000000006e74726e0000000000000000000000006ba6343a09a60ac048d0e99f50b76fd99eff1063000000a9000000000000000000000000281973b53c9aacec128ac964a6f750fea40912aa48656c6c6f2066726f6d204e657574726f6e204d61696e6e657420746f204d616e74612050616369666963206f63742032392c2031323a353520616d","index":true}]"#, + ); + assert_parsed_event(&non_base64_attrs); + + // Base64 version + let base64_attrs = event_attributes_from_str( + r#"[{"key":"X2NvbnRyYWN0X2FkZHJlc3M=","value":"bmV1dHJvbjFzanp6ZDRnd2tnZ3k2aHJyczhreHhhdGV4emN1ejNqZWNzeG0zd3FncmVna3Vsemo4cjdxbG51ZWY0","index":true},{"key":"c2VuZGVy","value":"MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNmJhNjM0M2EwOWE2MGFjMDQ4ZDBlOTlmNTBiNzZmZDk5ZWZmMTA2Mw==","index":true},{"key":"ZGVzdGluYXRpb24=","value":"MTY5","index":true},{"key":"cmVjaXBpZW50","value":"MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjgxOTczYjUzYzlhYWNlYzEyOGFjOTY0YTZmNzUwZmVhNDA5MTJhYQ==","index":true},{"key":"bWVzc2FnZQ==","value":"MDMwMDAwMDAwMDZlNzQ3MjZlMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNmJhNjM0M2EwOWE2MGFjMDQ4ZDBlOTlmNTBiNzZmZDk5ZWZmMTA2MzAwMDAwMGE5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjgxOTczYjUzYzlhYWNlYzEyOGFjOTY0YTZmNzUwZmVhNDA5MTJhYTQ4NjU2YzZjNmYyMDY2NzI2ZjZkMjA0ZTY1NzU3NDcyNmY2ZTIwNGQ2MTY5NmU2ZTY1NzQyMDc0NmYyMDRkNjE2ZTc0NjEyMDUwNjE2MzY5NjY2OTYzMjA2ZjYzNzQyMDMyMzkyYzIwMzEzMjNhMzUzNTIwNjE2ZA==","index":true}]"#, + ); + assert_parsed_event(&base64_attrs); + } +} diff --git a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs index 47447e6a8e..b972d3383e 100644 --- a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs +++ b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -1,13 +1,14 @@ use std::{fmt::Debug, num::NonZeroU64, ops::RangeInclusive, str::FromStr}; use async_trait::async_trait; -use base64::Engine; +use base64::{engine::general_purpose::STANDARD as BASE64, Engine}; use cosmrs::tendermint::abci::EventAttribute; use hyperlane_core::{ accumulator::incremental::IncrementalMerkle, ChainCommunicationError, ChainResult, Checkpoint, ContractLocator, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneProvider, Indexer, LogMeta, MerkleTreeHook, MerkleTreeInsertion, SequenceIndexer, H256, }; +use once_cell::sync::Lazy; use tracing::instrument; use crate::{ @@ -16,22 +17,21 @@ use crate::{ general::{self}, merkle_tree_hook, }, - rpc::{CosmosWasmIndexer, WasmIndexer}, - utils::get_block_height_for_lag, + rpc::{CosmosWasmIndexer, ParsedEvent, WasmIndexer}, + utils::{ + get_block_height_for_lag, CONTRACT_ADDRESS_ATTRIBUTE_KEY, + CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64, + }, ConnectionConf, CosmosProvider, Signer, }; #[derive(Debug)] /// A reference to a MerkleTreeHook contract on some Cosmos chain pub struct CosmosMerkleTreeHook { - /// Connection configuration - _conf: ConnectionConf, /// Domain domain: HyperlaneDomain, /// Contract address address: H256, - /// Signer - _signer: Signer, /// Provider provider: Box, } @@ -42,10 +42,8 @@ impl CosmosMerkleTreeHook { let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); Self { - _conf: conf, domain: locator.domain.clone(), address: locator.address, - _signer: signer, provider: Box::new(provider), } } @@ -166,7 +164,13 @@ impl CosmosMerkleTreeHook { // ------------------ Indexer ------------------ -const EVENT_TYPE: &str = "hpl_hook_merkle::post_dispatch"; +const INDEX_ATTRIBUTE_KEY: &str = "index"; +pub(crate) static INDEX_ATTRIBUTE_KEY_BASE64: Lazy = + Lazy::new(|| BASE64.encode(INDEX_ATTRIBUTE_KEY)); + +const MESSAGE_ID_ATTRIBUTE_KEY: &str = "message_id"; +pub(crate) static MESSAGE_ID_ATTRIBUTE_KEY_BASE64: Lazy = + Lazy::new(|| BASE64.encode(MESSAGE_ID_ATTRIBUTE_KEY)); #[derive(Debug)] /// A reference to a MerkleTreeHookIndexer contract on some Cosmos chain @@ -178,75 +182,71 @@ pub struct CosmosMerkleTreeHookIndexer { } impl CosmosMerkleTreeHookIndexer { + /// The message dispatch event type from the CW contract. + const MERKLE_TREE_INSERTION_EVENT_TYPE: &str = "hpl_hook_merkle::post_dispatch"; + /// create new Cosmos MerkleTreeHookIndexer agent pub fn new( conf: ConnectionConf, locator: ContractLocator, signer: Signer, reorg_period: u32, - ) -> Self { - let indexer: CosmosWasmIndexer = CosmosWasmIndexer::new( + ) -> ChainResult { + let indexer = CosmosWasmIndexer::new( conf.clone(), locator.clone(), - EVENT_TYPE.to_string(), + Self::MERKLE_TREE_INSERTION_EVENT_TYPE.into(), reorg_period, - ); + )?; - Self { + Ok(Self { merkle_tree_hook: CosmosMerkleTreeHook::new(conf, locator, signer), indexer: Box::new(indexer), - } + }) } - /// Get the parser for the indexer - fn get_parser( - &self, - ) -> fn(attrs: Vec) -> ChainResult> { - |attrs: Vec| -> ChainResult> { - let mut message_id = H256::zero(); - let mut leaf_index: u32 = 0; - let mut attr_count = 0; - - for attr in attrs { - let key = attr.key.as_str(); - let value = attr.value; - let value = value.as_str(); - - match key { - "message_id" => { - message_id = H256::from_slice(hex::decode(value)?.as_slice()); - attr_count += 1; - } - "index" => { - leaf_index = value.parse::()?; - attr_count += 1; - } - "aW5kZXg=" => { - leaf_index = String::from_utf8( - base64::engine::general_purpose::STANDARD.decode(value)?, - )? - .parse()?; - attr_count += 1; - } - "bWVzc2FnZV9pZA==" => { - message_id = H256::from_slice( - hex::decode(String::from_utf8( - base64::engine::general_purpose::STANDARD.decode(value)?, - )?)? - .as_slice(), - ); - attr_count += 1; - } - _ => {} + fn merkle_tree_insertion_parser( + attrs: &Vec, + ) -> ChainResult> { + let mut contract_address: Option = None; + let mut insertion = IncompleteMerkleTreeInsertion::default(); + + for attr in attrs { + let key = attr.key.as_str(); + let value = attr.value.as_str(); + + match key { + CONTRACT_ADDRESS_ATTRIBUTE_KEY => { + contract_address = Some(value.to_string()); + } + v if *CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64 == v => { + contract_address = Some(String::from_utf8(BASE64.decode(value)?)?); } - } - if attr_count != 2 { - return Ok(None); - } + MESSAGE_ID_ATTRIBUTE_KEY => { + insertion.message_id = Some(H256::from_slice(hex::decode(value)?.as_slice())); + } + v if *MESSAGE_ID_ATTRIBUTE_KEY_BASE64 == v => { + insertion.message_id = Some(H256::from_slice( + hex::decode(String::from_utf8(BASE64.decode(value)?)?)?.as_slice(), + )); + } - Ok(Some(MerkleTreeInsertion::new(leaf_index, message_id))) + INDEX_ATTRIBUTE_KEY => { + insertion.leaf_index = Some(value.parse::()?); + } + v if *INDEX_ATTRIBUTE_KEY_BASE64 == v => { + insertion.leaf_index = Some(String::from_utf8(BASE64.decode(value)?)?.parse()?); + } + + _ => {} + } } + + let contract_address = contract_address + .ok_or_else(|| ChainCommunicationError::from_other_str("missing contract_address"))?; + + Ok(ParsedEvent::new(contract_address, insertion.try_into()?)) } } @@ -257,8 +257,10 @@ impl Indexer for CosmosMerkleTreeHookIndexer { &self, range: RangeInclusive, ) -> ChainResult> { - let parser = self.get_parser(); - let result = self.indexer.get_range_event_logs(range, parser).await?; + let result = self + .indexer + .get_range_event_logs(range, Self::merkle_tree_insertion_parser) + .await?; Ok(result) } @@ -281,3 +283,68 @@ impl SequenceIndexer for CosmosMerkleTreeHookIndexer { Ok((Some(sequence), tip)) } } + +#[derive(Default)] +struct IncompleteMerkleTreeInsertion { + leaf_index: Option, + message_id: Option, +} + +impl TryInto for IncompleteMerkleTreeInsertion { + type Error = ChainCommunicationError; + + fn try_into(self) -> Result { + let leaf_index = self + .leaf_index + .ok_or_else(|| ChainCommunicationError::from_other_str("missing leaf_index"))?; + let message_id = self + .message_id + .ok_or_else(|| ChainCommunicationError::from_other_str("missing message_id"))?; + + Ok(MerkleTreeInsertion::new(leaf_index, message_id)) + } +} + +#[cfg(test)] +mod tests { + use cosmrs::tendermint::abci::EventAttribute; + use hyperlane_core::H256; + use std::str::FromStr; + + use crate::{rpc::ParsedEvent, utils::event_attributes_from_str}; + + use super::*; + + #[test] + fn test_merkle_tree_insertion_parser() { + // Examples from https://rpc-kralum.neutron-1.neutron.org/tx_search?query=%22tx.height%20%3E=%204000000%20AND%20tx.height%20%3C=%204100000%20AND%20wasm-hpl_hook_merkle::post_dispatch._contract_address%20=%20%27neutron1e5c2qqquc86rd3q77aj2wyht40z6z3q5pclaq040ue9f5f8yuf7qnpvkzk%27%22&prove=false&page=1&per_page=100 + + let expected = ParsedEvent::new( + "neutron1e5c2qqquc86rd3q77aj2wyht40z6z3q5pclaq040ue9f5f8yuf7qnpvkzk".into(), + MerkleTreeInsertion::new( + 4, + H256::from_str("a21078beac8bc19770d532eed0b4ada5ef0b45992cde219979f07e3e49185384") + .unwrap(), + ), + ); + + let assert_parsed_event = |attrs: &Vec| { + let parsed_event = + CosmosMerkleTreeHookIndexer::merkle_tree_insertion_parser(attrs).unwrap(); + + assert_eq!(parsed_event, expected); + }; + + // Non-base64 version + let non_base64_attrs = event_attributes_from_str( + r#"[{"key":"_contract_address","value":"neutron1e5c2qqquc86rd3q77aj2wyht40z6z3q5pclaq040ue9f5f8yuf7qnpvkzk","index":true},{"key":"index","value":"4","index":true},{"key":"message_id","value":"a21078beac8bc19770d532eed0b4ada5ef0b45992cde219979f07e3e49185384","index":true}]"#, + ); + assert_parsed_event(&non_base64_attrs); + + // Base64 version + let base64_attrs = event_attributes_from_str( + r#"[{"key":"X2NvbnRyYWN0X2FkZHJlc3M=","value":"bmV1dHJvbjFlNWMycXFxdWM4NnJkM3E3N2FqMnd5aHQ0MHo2ejNxNXBjbGFxMDQwdWU5ZjVmOHl1ZjdxbnB2a3pr","index":true},{"key":"aW5kZXg=","value":"NA==","index":true},{"key":"bWVzc2FnZV9pZA==","value":"YTIxMDc4YmVhYzhiYzE5NzcwZDUzMmVlZDBiNGFkYTVlZjBiNDU5OTJjZGUyMTk5NzlmMDdlM2U0OTE4NTM4NA==","index":true}]"#, + ); + assert_parsed_event(&base64_attrs); + } +} diff --git a/rust/chains/hyperlane-cosmos/src/payloads/general.rs b/rust/chains/hyperlane-cosmos/src/payloads/general.rs index 9f75182d93..488cae2d37 100644 --- a/rust/chains/hyperlane-cosmos/src/payloads/general.rs +++ b/rust/chains/hyperlane-cosmos/src/payloads/general.rs @@ -22,3 +22,13 @@ pub struct EventAttribute { pub value: String, pub index: bool, } + +impl From for cosmrs::tendermint::abci::EventAttribute { + fn from(val: EventAttribute) -> Self { + cosmrs::tendermint::abci::EventAttribute { + key: val.key, + value: val.value, + index: val.index, + } + } +} diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index deb266c29a..cbed71afdb 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -2,17 +2,15 @@ use std::ops::RangeInclusive; use crate::binary::h256_to_h512; use async_trait::async_trait; -use cosmrs::rpc::client::{Client, HttpClient}; -use cosmrs::rpc::endpoint::tx; +use cosmrs::rpc::client::{Client, CompatMode, HttpClient}; +use cosmrs::rpc::endpoint::{tx, tx_search::Response as TxSearchResponse}; use cosmrs::rpc::query::Query; use cosmrs::rpc::Order; use cosmrs::tendermint::abci::EventAttribute; -use hyperlane_core::{ - ChainCommunicationError, ChainResult, ContractLocator, HyperlaneDomain, LogMeta, H256, U256, -}; -use tracing::debug; +use hyperlane_core::{ChainCommunicationError, ChainResult, ContractLocator, LogMeta, H256, U256}; +use tracing::{instrument, trace}; -use crate::verify::{self, bech32_decode}; +use crate::verify::digest_to_addr; use crate::ConnectionConf; const PAGINATION_LIMIT: u8 = 100; @@ -20,35 +18,43 @@ const PAGINATION_LIMIT: u8 = 100; #[async_trait] /// Trait for wasm indexer. Use rpc provider pub trait WasmIndexer: Send + Sync { - /// get rpc client - fn get_client(&self) -> ChainResult; - /// get latest finalized block height + /// Get the finalized block height. async fn get_finalized_block_number(&self) -> ChainResult; - /// get range event logs + + /// Get logs for the given range using the given parser. async fn get_range_event_logs( &self, range: RangeInclusive, - parser: fn(Vec) -> ChainResult>, + parser: for<'a> fn(&'a Vec) -> ChainResult>, ) -> ChainResult> where - T: Send + Sync; + T: Send + Sync + 'static; } -// #[derive(Debug)] -// /// Cosmwasm RPC Provider -// pub struct CosmosWasmIndexer { -// address: String, -// rpc_endpoint: HttpClientUrl, // rpc_endpoint -// target_type: String, -// } +#[derive(Debug, Eq, PartialEq)] +/// An event parsed from the RPC response. +pub struct ParsedEvent { + contract_address: String, + event: T, +} + +impl ParsedEvent { + /// Create a new ParsedEvent. + pub fn new(contract_address: String, event: T) -> Self { + Self { + contract_address, + event, + } + } +} #[derive(Debug)] /// Cosmwasm RPC Provider pub struct CosmosWasmIndexer { - conf: ConnectionConf, - _domain: HyperlaneDomain, - address: H256, - event_type: String, + client: HttpClient, + contract_address: H256, + contract_address_bech32: String, + target_event_kind: String, reorg_period: u32, } @@ -61,41 +67,110 @@ impl CosmosWasmIndexer { locator: ContractLocator, event_type: String, reorg_period: u32, - ) -> Self { - Self { - conf, - _domain: locator.domain.clone(), - address: locator.address, - event_type, + ) -> ChainResult { + let client = HttpClient::builder(conf.get_rpc_url().parse()?) + // Consider supporting different compatibility modes. + .compat_mode(CompatMode::latest()) + .build()?; + Ok(Self { + client, + contract_address: locator.address, + contract_address_bech32: digest_to_addr(locator.address, conf.get_prefix().as_str())?, + target_event_kind: format!("{}-{}", Self::WASM_TYPE, event_type), reorg_period, - } + }) } +} - /// get rpc client url - fn get_conn_url(&self) -> ChainResult { - Ok(self.conf.get_rpc_url()) +impl CosmosWasmIndexer { + #[instrument(level = "trace", err, skip(self))] + async fn tx_search(&self, query: Query, page: u32) -> ChainResult { + Ok(self + .client + .tx_search(query, false, page, PAGINATION_LIMIT, Order::Ascending) + .await?) } - /// get contract address - pub fn get_contract_addr(&self) -> ChainResult { - verify::digest_to_addr(self.address, self.conf.get_prefix().as_str()) + // Iterate through all txs, filter out failed txs, find target events + // in successful txs, and parse them. + fn handle_txs( + &self, + txs: Vec, + parser: for<'a> fn(&'a Vec) -> ChainResult>, + ) -> ChainResult + '_> + where + T: 'static, + { + let logs_iter = txs + .into_iter() + .filter(|tx| { + // Filter out failed txs + let tx_failed = tx.tx_result.code.is_err(); + if tx_failed { + trace!(tx_hash=?tx.hash, "Indexed tx has failed, skipping"); + } + !tx_failed + }) + .flat_map(move |tx| { + // Find target events in successful txs + self.handle_tx(tx, parser) + }); + + Ok(logs_iter) + } + + // Iter through all events in the tx, looking for any target events + // made by the contract we are indexing. + fn handle_tx( + &self, + tx: tx::Response, + parser: for<'a> fn(&'a Vec) -> ChainResult>, + ) -> impl Iterator + '_ + where + T: 'static, + { + tx.tx_result.events.into_iter().enumerate().filter_map(move |(log_idx, event)| { + if event.kind.as_str() != self.target_event_kind { + return None; + } + + parser(&event.attributes) + .map_err(|err| { + // This can happen if we attempt to parse an event that just happens + // to have the same name but a different structure. + tracing::trace!(?err, tx_hash=?tx.hash, log_idx, ?event, "Failed to parse event attributes"); + }) + .ok() + .and_then(|parsed_event| { + // This is crucial! We need to make sure that the contract address + // in the event matches the contract address we are indexing. + // Otherwise, we might index events from other contracts that happen + // to have the same target event name. + if parsed_event.contract_address != self.contract_address_bech32 { + trace!(tx_hash=?tx.hash, log_idx, ?event, "Event contract address does not match indexer contract address"); + return None; + } + + Some((parsed_event.event, LogMeta { + address: self.contract_address, + block_number: tx.height.value(), + // FIXME: block_hash is not available in tx_search. + // This isn't strictly required atm. + block_hash: H256::zero(), + transaction_id: h256_to_h512(H256::from_slice(tx.hash.as_bytes())), + transaction_index: tx.index.into(), + log_index: U256::from(log_idx), + })) + }) + }) } } #[async_trait] impl WasmIndexer for CosmosWasmIndexer { - fn get_client(&self) -> ChainResult { - Ok(HttpClient::builder(self.get_conn_url()?.parse()?) - // indexing fails unless this is commented out. I assume the decoding in `CompatMode::V0_34` - // is incompatible with the current data format. - // .compat_mode(CompatMode::V0_34) - .build()?) - } - async fn get_finalized_block_number(&self) -> ChainResult { - let client = self.get_client()?; - - let latest_height: u32 = client + let latest_height: u32 = self + .client .latest_block() .await? .block @@ -107,93 +182,48 @@ impl WasmIndexer for CosmosWasmIndexer { Ok(latest_height.saturating_sub(self.reorg_period)) } + #[instrument(err, skip(self, parser))] async fn get_range_event_logs( &self, range: RangeInclusive, - parser: fn(Vec) -> ChainResult>, + parser: for<'a> fn(&'a Vec) -> ChainResult>, ) -> ChainResult> where - T: Send + Sync, + T: Send + Sync + 'static, { - let client = self.get_client()?; - let contract_address = self.get_contract_addr()?; - // Page starts from 1 let query = Query::default() .and_gte("tx.height", *range.start() as u64) .and_lte("tx.height", *range.end() as u64) .and_eq( - format!("{}-{}._contract_address", Self::WASM_TYPE, self.event_type), - contract_address.clone(), + format!("{}._contract_address", self.target_event_kind), + self.contract_address_bech32.clone(), ); - debug!("Query: {:?}", query.to_string()); - - let tx_search_result = client - .tx_search(query.clone(), false, 1, PAGINATION_LIMIT, Order::Ascending) - .await?; + let tx_search_result = self.tx_search(query.clone(), 1).await?; + // Using the first tx_search_result, we can calculate the total number of pages. let total_count = tx_search_result.total_count; - let last_page = total_count / PAGINATION_LIMIT as u32 - + (total_count % PAGINATION_LIMIT as u32 != 0) as u32; - - let handler = |txs: Vec| -> ChainResult> { - let mut result: Vec<(T, LogMeta)> = vec![]; - let target_type = format!("{}-{}", Self::WASM_TYPE, self.event_type); - - // Get BlockHash from block_search - let client = self.get_client()?; + let last_page = div_ceil(total_count, PAGINATION_LIMIT.into()); - for tx in txs { - if tx.tx_result.code.is_err() { - debug!(tx_hash=?tx.hash, "Indexed tx has failed, skipping"); - continue; - } - - let mut parse_result: Vec<(T, LogMeta)> = vec![]; - - for (log_idx, event) in tx.tx_result.events.clone().into_iter().enumerate() { - if event.kind.as_str() == target_type { - if let Some(msg) = parser(event.attributes.clone())? { - let meta = LogMeta { - address: bech32_decode(contract_address.clone())?, - block_number: tx.height.value(), - // FIXME: block_hash is not available in tx_search - block_hash: H256::zero(), - transaction_id: h256_to_h512(H256::from_slice(tx.hash.as_bytes())), - transaction_index: tx.index as u64, - log_index: U256::from(log_idx), - }; - - parse_result.push((msg, meta)); - } - } - } - - result.extend(parse_result); - } + let mut logs = self + .handle_txs(tx_search_result.txs, parser)? + .collect::>(); - Ok(result) - }; + // If there are any more pages, fetch them and append to the result. + for page in 2..=last_page { + trace!(page, "Performing tx search"); - let mut result = handler(tx_search_result.txs)?; + let tx_search_result = self.tx_search(query.clone(), page).await?; - for page in 2..=last_page { - debug!(page, "Making tx search RPC"); - - let tx_search_result = client - .tx_search( - query.clone(), - false, - page, - PAGINATION_LIMIT, - Order::Ascending, - ) - .await?; - - result.extend(handler(tx_search_result.txs)?); + logs.extend(self.handle_txs(tx_search_result.txs, parser)?); } - Ok(result) + Ok(logs) } } + +// TODO: just use div_ceil when upgrading from 1.72.1 to 1.73.0 or above +fn div_ceil(numerator: u32, denominator: u32) -> u32 { + (numerator as f32 / denominator as f32).ceil() as u32 +} diff --git a/rust/chains/hyperlane-cosmos/src/utils.rs b/rust/chains/hyperlane-cosmos/src/utils.rs index 86dc4de736..898298f438 100644 --- a/rust/chains/hyperlane-cosmos/src/utils.rs +++ b/rust/chains/hyperlane-cosmos/src/utils.rs @@ -1,7 +1,16 @@ use std::num::NonZeroU64; -use crate::grpc::{WasmGrpcProvider, WasmProvider}; +use base64::{engine::general_purpose::STANDARD as BASE64, Engine}; use hyperlane_core::ChainResult; +use once_cell::sync::Lazy; + +use crate::grpc::{WasmGrpcProvider, WasmProvider}; + +/// The event attribute key for the contract address. +pub(crate) const CONTRACT_ADDRESS_ATTRIBUTE_KEY: &str = "_contract_address"; +/// Base64 encoded version of the contract address attribute key, i.e. +pub(crate) static CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64: Lazy = + Lazy::new(|| BASE64.encode(CONTRACT_ADDRESS_ATTRIBUTE_KEY)); /// Given a lag, returns the block height at the moment. /// If the lag is None, a block height of None is given, indicating that the @@ -21,3 +30,17 @@ pub(crate) async fn get_block_height_for_lag( Ok(block_height) } + +#[cfg(test)] +/// Helper function to create a Vec from a JSON string - +/// crate::payloads::general::EventAttribute has a Deserialize impl while +/// cosmrs::tendermint::abci::EventAttribute does not. +pub(crate) fn event_attributes_from_str( + attrs_str: &str, +) -> Vec { + serde_json::from_str::>(attrs_str) + .unwrap() + .into_iter() + .map(|attr| attr.into()) + .collect() +} diff --git a/rust/hyperlane-base/src/settings/chains.rs b/rust/hyperlane-base/src/settings/chains.rs index 6764b4b4f9..338bccab67 100644 --- a/rust/hyperlane-base/src/settings/chains.rs +++ b/rust/hyperlane-base/src/settings/chains.rs @@ -228,9 +228,8 @@ impl ChainConf { conf.clone(), locator, signer.clone(), - "mailbox_dispatch".to_string(), self.reorg_period, - )); + )?); Ok(indexer as Box>) } } @@ -268,9 +267,8 @@ impl ChainConf { conf.clone(), locator, signer, - "mailbox_process".to_string(), self.reorg_period, - )); + )?); Ok(indexer as Box>) } } @@ -348,9 +346,8 @@ impl ChainConf { let indexer = Box::new(h_cosmos::CosmosInterchainGasPaymasterIndexer::new( conf.clone(), locator, - "igp-core-pay-for-gas".to_string(), self.reorg_period, - )); + )?); Ok(indexer as Box>) } } @@ -394,7 +391,7 @@ impl ChainConf { // TODO: remove signer requirement entirely signer.unwrap().clone(), self.reorg_period, - )); + )?); Ok(indexer as Box>) } } diff --git a/rust/hyperlane-base/src/settings/loader/arguments.rs b/rust/hyperlane-base/src/settings/loader/arguments.rs index eedbb476de..0f72d68eb4 100644 --- a/rust/hyperlane-base/src/settings/loader/arguments.rs +++ b/rust/hyperlane-base/src/settings/loader/arguments.rs @@ -155,7 +155,7 @@ impl Iterator for ArgumentParser { impl ArgumentParser { #[inline(never)] fn find_next_kv_pair(&mut self) -> Result, Error> { - unwrap_or_none_result!(idx, self.index_of_next_key()); + let idx = unwrap_or_none_result!(self.index_of_next_key()); // full term without leading '--' let term = &os_to_str(&self.0[idx])?[2..]; if term.is_empty() { diff --git a/rust/hyperlane-core/src/types/merkle_tree.rs b/rust/hyperlane-core/src/types/merkle_tree.rs index 2e9020043d..96ea78ff1c 100644 --- a/rust/hyperlane-core/src/types/merkle_tree.rs +++ b/rust/hyperlane-core/src/types/merkle_tree.rs @@ -4,7 +4,7 @@ use std::io::{Read, Write}; use crate::{Decode, Encode, HyperlaneProtocolError, Sequenced, H256}; /// Merkle Tree Hook insertion event -#[derive(Debug, Copy, Clone, new)] +#[derive(Debug, Copy, Clone, new, Eq, PartialEq)] pub struct MerkleTreeInsertion { leaf_index: u32, message_id: H256, diff --git a/rust/hyperlane-core/src/types/message.rs b/rust/hyperlane-core/src/types/message.rs index 4ebaffc1cd..0291d33fb2 100644 --- a/rust/hyperlane-core/src/types/message.rs +++ b/rust/hyperlane-core/src/types/message.rs @@ -21,7 +21,7 @@ impl From<&HyperlaneMessage> for RawHyperlaneMessage { } /// A full Hyperlane message between chains -#[derive(Default, Clone)] +#[derive(Default, Clone, Eq, PartialEq)] pub struct HyperlaneMessage { /// 1 Hyperlane version number pub version: u8, diff --git a/rust/hyperlane-core/src/types/mod.rs b/rust/hyperlane-core/src/types/mod.rs index b6bdf50a25..c1e39e491b 100644 --- a/rust/hyperlane-core/src/types/mod.rs +++ b/rust/hyperlane-core/src/types/mod.rs @@ -115,7 +115,7 @@ pub struct GasPaymentKey { } /// A payment of a message's gas costs. -#[derive(Debug, Copy, Clone, Default)] +#[derive(Debug, Copy, Clone, Default, Eq, PartialEq)] pub struct InterchainGasPayment { /// Id of the message pub message_id: H256, diff --git a/rust/hyperlane-core/src/utils.rs b/rust/hyperlane-core/src/utils.rs index 9d8b8b0017..41e9c115d0 100644 --- a/rust/hyperlane-core/src/utils.rs +++ b/rust/hyperlane-core/src/utils.rs @@ -238,13 +238,14 @@ macro_rules! many_to_one { /// return Ok(None); /// }; /// // after: -/// unwrap_or_none_result!(idx, self.index_of_next_key()); +/// let idx = unwrap_or_none_result!(self.index_of_next_key()); /// ``` #[macro_export] macro_rules! unwrap_or_none_result { - ($variable_name:ident, $e:expr $(, $else_e:expr)?) => { - let Some($variable_name) = $e - else { + ($e:expr $(, $else_e:expr)?) => { + if let Some(inner) = $e { + inner + } else { $($else_e;)? return Ok(None); }; From 2a7d6d6004ce0120e809c2348da006663ef4c7b5 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Tue, 7 Nov 2023 17:56:43 +0000 Subject: [PATCH 131/142] refactor: delegate keypair encoding to cosmrs (#2887) ### Description Delegates bech32 encoding, decoding, and cosmos address building from a private key to cosmrs/tendermint upstream crates. The only place where this wasn't doable was the tests, because of a cyclic dependency - left a TODO comment there. As part of this, renamed `rust/chains/hyperlane-cosmos/src/libs/verify.rs` -> `rust/chains/hyperlane-cosmos/src/libs/address.rs` ~~**Warning**: We should re-enable e2e and make sure everything still works locally, since the actual `encode`/`decode` functions that end up being called _are_ different~~ ### Testing Tested manually EVM <> Duality (both ways) --- rust/Cargo.lock | 2 + rust/Cargo.toml | 1 + rust/chains/hyperlane-cosmos/Cargo.toml | 8 +- .../hyperlane-cosmos/src/aggregation_ism.rs | 11 +- rust/chains/hyperlane-cosmos/src/error.rs | 6 + .../src/interchain_security_module.rs | 31 +--- rust/chains/hyperlane-cosmos/src/lib.rs | 1 + .../hyperlane-cosmos/src/libs/address.rs | 142 ++++++++++++++++++ .../hyperlane-cosmos/src/libs/binary.rs | 28 ---- rust/chains/hyperlane-cosmos/src/libs/mod.rs | 5 +- .../hyperlane-cosmos/src/libs/verify.rs | 132 ---------------- rust/chains/hyperlane-cosmos/src/mailbox.rs | 19 +-- .../hyperlane-cosmos/src/multisig_ism.rs | 3 +- .../hyperlane-cosmos/src/providers/grpc.rs | 6 +- .../hyperlane-cosmos/src/providers/rpc.rs | 32 ++-- .../hyperlane-cosmos/src/routing_ism.rs | 6 +- rust/chains/hyperlane-cosmos/src/signers.rs | 17 +-- rust/chains/hyperlane-cosmos/src/types.rs | 24 +++ .../src/validator_announce.rs | 5 +- rust/hyperlane-base/src/settings/chains.rs | 2 +- rust/hyperlane-core/src/error.rs | 4 + rust/hyperlane-core/src/traits/signing.rs | 21 +-- .../src/types/primitive_types.rs | 3 +- rust/hyperlane-core/src/utils.rs | 6 +- rust/utils/run-locally/Cargo.toml | 2 +- rust/utils/run-locally/src/cosmos/crypto.rs | 4 + rust/utils/run-locally/src/cosmos/link.rs | 1 - 27 files changed, 256 insertions(+), 266 deletions(-) create mode 100644 rust/chains/hyperlane-cosmos/src/libs/address.rs delete mode 100644 rust/chains/hyperlane-cosmos/src/libs/binary.rs delete mode 100644 rust/chains/hyperlane-cosmos/src/libs/verify.rs create mode 100644 rust/chains/hyperlane-cosmos/src/types.rs diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 19f764e785..2d3e25700d 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -4155,6 +4155,7 @@ dependencies = [ "base64 0.21.4", "bech32 0.9.1", "cosmrs", + "derive-new", "hex 0.4.3", "hpl-interface 0.0.2", "hyper", @@ -4166,6 +4167,7 @@ dependencies = [ "serde_json", "sha2 0.10.8", "sha256", + "tendermint", "thiserror", "tokio", "tonic", diff --git a/rust/Cargo.toml b/rust/Cargo.toml index e7a6e3a9cb..3345fe9887 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -149,6 +149,7 @@ static_assertions = "1.1" strum = "0.25.0" strum_macros = "0.25.2" tempfile = "3.3" +tendermint = "0.32.2" thiserror = "1.0" time = "0.3" tiny-keccak = "2.0.2" diff --git a/rust/chains/hyperlane-cosmos/Cargo.toml b/rust/chains/hyperlane-cosmos/Cargo.toml index 1825ec7174..e3ff363ae9 100644 --- a/rust/chains/hyperlane-cosmos/Cargo.toml +++ b/rust/chains/hyperlane-cosmos/Cargo.toml @@ -10,6 +10,7 @@ version = { workspace = true } [dependencies] async-trait = { workspace = true } cosmrs = { workspace = true, features = ["cosmwasm", "tokio", "grpc", "rpc"] } +derive-new = { workspace = true } serde = { workspace = true } thiserror = { workspace = true } tokio = { workspace = true } @@ -27,12 +28,7 @@ hyper = { workspace = true } hyper-tls = { workspace = true } sha256 = { workspace = true } hex = { workspace = true } +tendermint = { workspace = true, features = ["rust-crypto", "secp256k1"]} hpl-interface = { version = "0.0.2" } hyperlane-core = { path = "../../hyperlane-core" } - -# These should only be used if it _must_ be used to interop with the inner library, -# all errors exported from a chain crate should be using thiserror or handrolled to -# make error handling easier. -# eyre = "never" -# anyhow = never diff --git a/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs b/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs index 6b60be5bcc..373d71a1fc 100644 --- a/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs @@ -1,7 +1,9 @@ +use std::str::FromStr; + use crate::{ + address::CosmosAddress, grpc::{WasmGrpcProvider, WasmProvider}, payloads::aggregate_ism::{ModulesAndThresholdRequest, ModulesAndThresholdResponse}, - verify::bech32_decode, ConnectionConf, CosmosProvider, Signer, }; use async_trait::async_trait; @@ -60,8 +62,11 @@ impl AggregationIsm for CosmosAggregationIsm { let data = self.provider.wasm_query(payload, None).await?; let response: ModulesAndThresholdResponse = serde_json::from_slice(&data)?; - let modules: ChainResult> = - response.modules.into_iter().map(bech32_decode).collect(); + let modules: ChainResult> = response + .modules + .into_iter() + .map(|module| CosmosAddress::from_str(&module).map(|ca| ca.digest())) + .collect(); Ok((modules?, response.threshold)) } diff --git a/rust/chains/hyperlane-cosmos/src/error.rs b/rust/chains/hyperlane-cosmos/src/error.rs index cb101f009e..7ed0d141ce 100644 --- a/rust/chains/hyperlane-cosmos/src/error.rs +++ b/rust/chains/hyperlane-cosmos/src/error.rs @@ -12,6 +12,12 @@ pub enum HyperlaneCosmosError { /// gRPC error #[error("{0}")] GrpcError(#[from] tonic::Status), + /// Cosmos error + #[error("{0}")] + CosmosError(#[from] cosmrs::Error), + /// Cosmos error report + #[error("{0}")] + CosmosErrorReport(#[from] cosmrs::ErrorReport), } impl From for ChainCommunicationError { diff --git a/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs index 1e27fca038..5b122e2c02 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs @@ -8,10 +8,9 @@ use crate::{ grpc::{WasmGrpcProvider, WasmProvider}, payloads::{ general::EmptyStruct, - ism_routes::{ - QueryIsmGeneralRequest, QueryIsmModuleTypeRequest, QueryIsmModuleTypeResponse, - }, + ism_routes::{QueryIsmGeneralRequest, QueryIsmModuleTypeRequest}, }, + types::IsmType, ConnectionConf, CosmosProvider, Signer, }; @@ -57,19 +56,6 @@ impl HyperlaneChain for CosmosInterchainSecurityModule { } } -fn ism_type_to_module_type(ism_type: hpl_interface::ism::ISMType) -> ModuleType { - match ism_type { - hpl_interface::ism::ISMType::Unused => ModuleType::Unused, - hpl_interface::ism::ISMType::Routing => ModuleType::Routing, - hpl_interface::ism::ISMType::Aggregation => ModuleType::Aggregation, - hpl_interface::ism::ISMType::LegacyMultisig => ModuleType::MessageIdMultisig, - hpl_interface::ism::ISMType::MerkleRootMultisig => ModuleType::MerkleRootMultisig, - hpl_interface::ism::ISMType::MessageIdMultisig => ModuleType::MessageIdMultisig, - hpl_interface::ism::ISMType::Null => ModuleType::Null, - hpl_interface::ism::ISMType::CcipRead => ModuleType::CcipRead, - } -} - #[async_trait] impl InterchainSecurityModule for CosmosInterchainSecurityModule { /// Returns the module type of the ISM compliant with the corresponding @@ -84,16 +70,9 @@ impl InterchainSecurityModule for CosmosInterchainSecurityModule { .wasm_query(QueryIsmGeneralRequest { ism: query }, None) .await?; - // Handle both the ISMType response and the ModuleTypeResponse response. - let ismtype_response = serde_json::from_slice::(&data); - let moduletye_response = - serde_json::from_slice::(&data); - - Ok(match (ismtype_response, moduletye_response) { - (Ok(v), _) => ism_type_to_module_type(v.typ), - (_, Ok(v)) => ism_type_to_module_type(v.typ), - _ => ModuleType::Null, - }) + let module_type_response = + serde_json::from_slice::(&data)?; + Ok(IsmType(module_type_response.typ).into()) } /// Dry runs the `verify()` ISM call and returns `Some(gas_estimate)` if the call diff --git a/rust/chains/hyperlane-cosmos/src/lib.rs b/rust/chains/hyperlane-cosmos/src/lib.rs index a68c97aee8..82a4a0ece1 100644 --- a/rust/chains/hyperlane-cosmos/src/lib.rs +++ b/rust/chains/hyperlane-cosmos/src/lib.rs @@ -18,6 +18,7 @@ mod providers; mod routing_ism; mod signers; mod trait_builder; +mod types; mod utils; mod validator_announce; diff --git a/rust/chains/hyperlane-cosmos/src/libs/address.rs b/rust/chains/hyperlane-cosmos/src/libs/address.rs new file mode 100644 index 0000000000..b9454eea92 --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/libs/address.rs @@ -0,0 +1,142 @@ +use std::str::FromStr; + +use cosmrs::{ + crypto::{secp256k1::SigningKey, PublicKey}, + AccountId, +}; +use derive_new::new; +use hyperlane_core::{ChainCommunicationError, ChainResult, Error::Overflow, H256}; +use tendermint::account::Id as TendermintAccountId; +use tendermint::public_key::PublicKey as TendermintPublicKey; + +/// Wrapper around the cosmrs AccountId type that abstracts bech32 encoding +#[derive(new, Debug)] +pub struct CosmosAddress { + /// Bech32 encoded cosmos account + account_id: AccountId, + /// Hex representation (digest) of cosmos account + digest: H256, +} + +impl CosmosAddress { + /// Returns a Bitcoin style address: RIPEMD160(SHA256(pubkey)) + /// Source: https://github.com/cosmos/cosmos-sdk/blob/177e7f45959215b0b4e85babb7c8264eaceae052/crypto/keys/secp256k1/secp256k1.go#L154 + pub fn from_pubkey(pubkey: PublicKey, prefix: &str) -> ChainResult { + // Get the inner type + let tendermint_pubkey = TendermintPublicKey::from(pubkey); + // Get the RIPEMD160(SHA256(pubkey)) + let tendermint_id = TendermintAccountId::from(tendermint_pubkey); + // Bech32 encoding + let account_id = AccountId::new(prefix, tendermint_id.as_bytes())?; + // Hex digest + let digest = Self::bech32_decode(account_id.clone())?; + Ok(CosmosAddress::new(account_id, digest)) + } + + /// Creates a wrapper arround a cosmrs AccountId from a private key byte array + pub fn from_privkey(priv_key: &[u8], prefix: &str) -> ChainResult { + let pubkey = SigningKey::from_slice(priv_key)?.public_key(); + Self::from_pubkey(pubkey, prefix) + } + + /// Creates a wrapper arround a cosmrs AccountId from a H256 digest + /// + /// - digest: H256 digest (hex representation of address) + /// - prefix: Bech32 prefix + pub fn from_h256(digest: H256, prefix: &str) -> ChainResult { + // This is the hex-encoded version of the address + let bytes = digest.as_bytes(); + // Bech32 encode it + let account_id = AccountId::new(prefix, bytes)?; + Ok(CosmosAddress::new(account_id, digest)) + } + + /// Builds a H256 digest from a cosmos AccountId (Bech32 encoding) + fn bech32_decode(account_id: AccountId) -> ChainResult { + // Temporarily set the digest to a default value as a placeholder. + // Can't implement H256::try_from for AccountId to avoid this. + let cosmos_address = CosmosAddress::new(account_id, Default::default()); + H256::try_from(&cosmos_address) + } + + /// String representation of a cosmos AccountId + pub fn address(&self) -> String { + self.account_id.to_string() + } + + /// H256 digest of the cosmos AccountId + pub fn digest(&self) -> H256 { + self.digest + } +} + +impl TryFrom<&CosmosAddress> for H256 { + type Error = ChainCommunicationError; + + fn try_from(cosmos_address: &CosmosAddress) -> Result { + // `to_bytes()` decodes the Bech32 into a hex, represented as a byte vec + let bytes = cosmos_address.account_id.to_bytes(); + let h256_len = H256::len_bytes(); + let Some(start_point) = h256_len.checked_sub(bytes.len()) else { + // input is too large to fit in a H256 + return Err(Overflow.into()); + }; + let mut empty_hash = H256::default(); + let result = empty_hash.as_bytes_mut(); + result[start_point..].copy_from_slice(bytes.as_slice()); + Ok(H256::from_slice(result)) + } +} + +impl FromStr for CosmosAddress { + type Err = ChainCommunicationError; + + fn from_str(s: &str) -> Result { + let account_id = AccountId::from_str(s)?; + let digest = Self::bech32_decode(account_id.clone())?; + Ok(Self::new(account_id, digest)) + } +} + +#[cfg(test)] +pub mod test { + use hyperlane_core::utils::hex_or_base58_to_h256; + + use super::*; + + #[test] + fn test_bech32_decode() { + let addr = "dual1pk99xge6q94qtu3568x3qhp68zzv0mx7za4ct008ks36qhx5tvss3qawfh"; + let cosmos_address = CosmosAddress::from_str(addr).unwrap(); + assert_eq!( + cosmos_address.digest, + H256::from_str("0d8a53233a016a05f234d1cd105c3a3884c7ecde176b85bde7b423a05cd45b21") + .unwrap() + ); + } + + #[test] + fn test_bech32_decode_from_cosmos_key() { + let hex_key = "0x5486418967eabc770b0fcb995f7ef6d9a72f7fc195531ef76c5109f44f51af26"; + let key = hex_or_base58_to_h256(hex_key).unwrap(); + let prefix = "neutron"; + let addr = CosmosAddress::from_privkey(key.as_bytes(), prefix) + .expect("Cosmos address creation failed"); + assert_eq!( + addr.address(), + "neutron1kknekjxg0ear00dky5ykzs8wwp2gz62z9s6aaj" + ); + } + + #[test] + fn test_bech32_encode_from_h256() { + let hex_key = "0x1b16866227825a5166eb44031cdcf6568b3e80b52f2806e01b89a34dc90ae616"; + let key = hex_or_base58_to_h256(hex_key).unwrap(); + let prefix = "dual"; + let addr = CosmosAddress::from_h256(key, prefix).expect("Cosmos address creation failed"); + assert_eq!( + addr.address(), + "dual1rvtgvc38sfd9zehtgsp3eh8k269naq949u5qdcqm3x35mjg2uctqfdn3yq" + ); + } +} diff --git a/rust/chains/hyperlane-cosmos/src/libs/binary.rs b/rust/chains/hyperlane-cosmos/src/libs/binary.rs deleted file mode 100644 index a75ffaa342..0000000000 --- a/rust/chains/hyperlane-cosmos/src/libs/binary.rs +++ /dev/null @@ -1,28 +0,0 @@ -use hyperlane_core::{H160, H256, H512}; -use std::cmp; - -/// Convert H256 to H512 -pub fn h256_to_h512(v: H256) -> H512 { - let mut result: [u8; 64] = [0; 64]; - let vec = v.0.as_slice(); - let start_point = cmp::max(0, 32 - vec.len()); - result[start_point..32].copy_from_slice(vec); - - H512::from_slice(&result) -} - -/// Convert H256 to H160 -pub fn h256_to_h160(v: H256) -> H160 { - let mut result = [0u8; 20]; - - result.copy_from_slice(&v.0[12..]); - H160::from_slice(&result) -} - -/// Convert H160 to H256 -pub fn h160_to_h256(v: H160) -> H256 { - let mut result = [0u8; 32]; - result[12..].copy_from_slice(v.as_bytes()); - - H256::from_slice(&result) -} diff --git a/rust/chains/hyperlane-cosmos/src/libs/mod.rs b/rust/chains/hyperlane-cosmos/src/libs/mod.rs index 6c33ef5122..d89e6cd7db 100644 --- a/rust/chains/hyperlane-cosmos/src/libs/mod.rs +++ b/rust/chains/hyperlane-cosmos/src/libs/mod.rs @@ -1,5 +1,2 @@ /// This module contains all the verification variables the libraries used by the Hyperlane Cosmos chain. -pub mod verify; - -/// This module contains all the Binary variables used by the Hyperlane Cosmos chain. -pub mod binary; +pub mod address; diff --git a/rust/chains/hyperlane-cosmos/src/libs/verify.rs b/rust/chains/hyperlane-cosmos/src/libs/verify.rs deleted file mode 100644 index 8fe0fba28a..0000000000 --- a/rust/chains/hyperlane-cosmos/src/libs/verify.rs +++ /dev/null @@ -1,132 +0,0 @@ -use std::cmp; - -use bech32::{FromBase32, ToBase32}; -use cosmrs::crypto::secp256k1::SigningKey; -use hyperlane_core::{ChainCommunicationError, ChainResult, H160, H256}; -use ripemd::Ripemd160; -use sha2::{Digest, Sha256}; - -use crate::HyperlaneCosmosError; - -/// decode bech32 address to H256 -pub fn bech32_decode(addr: String) -> ChainResult { - let (_hrp, data, _variant) = - bech32::decode(addr.as_str()).map_err(Into::::into)?; - - let value = Vec::::from_base32(&data).map_err(Into::::into)?; - let mut result: [u8; 32] = [0; 32]; - - let start_point = cmp::max(0, 32 - value.len()); - result[start_point..32].copy_from_slice(value.as_slice()); - - Ok(H256::from(result)) -} - -/// encode H256 to bech32 address -pub fn digest_to_addr(digest: H256, prefix: &str) -> ChainResult { - let addr = bech32::encode( - prefix, - digest.as_bytes().to_base32(), - bech32::Variant::Bech32, - ) - .map_err(|_| ChainCommunicationError::InvalidRequest { - msg: "invalid address".to_string(), - })?; - - Ok(addr) -} - -/// encode H256 to bech32 address -pub fn sha256_digest(bz: impl AsRef<[u8]>) -> ChainResult<[u8; 32]> { - let mut hasher = Sha256::new(); - - hasher.update(bz); - - hasher - .finalize() - .as_slice() - .try_into() - .map_err(|_| ChainCommunicationError::ParseError { - msg: "sha256 digest".to_string(), - }) -} - -/// encode H256 to bech32 address -pub fn ripemd160_digest(bz: impl AsRef<[u8]>) -> ChainResult<[u8; 20]> { - let mut hasher = Ripemd160::new(); - - hasher.update(bz); - - hasher - .finalize() - .as_slice() - .try_into() - .map_err(|_| ChainCommunicationError::ParseError { - msg: "ripemd160".to_string(), - }) -} - -/// encode H256 to bech32 address -pub fn pub_to_addr(pub_key: Vec, prefix: &str) -> ChainResult { - let sha_hash = sha256_digest(pub_key)?; - let rip_hash = ripemd160_digest(sha_hash)?; - - let addr = - bech32::encode(prefix, rip_hash.to_base32(), bech32::Variant::Bech32).map_err(|_| { - ChainCommunicationError::ParseError { - msg: "bech32".to_string(), - } - })?; - - Ok(addr) -} - -/// encode H256 to bech32 address -pub fn priv_to_binary_addr(priv_key: Vec) -> ChainResult { - let sha_hash = sha256_digest( - SigningKey::from_slice(priv_key.as_slice())? - .public_key() - .to_bytes(), - )?; - let rip_hash = ripemd160_digest(sha_hash)?; - - Ok(H160::from_slice(rip_hash.as_slice())) -} - -/// encode H256 to bech32 address -pub fn priv_to_addr_string(prefix: String, priv_key: Vec) -> ChainResult { - let sha_hash = sha256_digest( - SigningKey::from_slice(priv_key.as_slice())? - .public_key() - .to_bytes(), - )?; - let rip_hash = ripemd160_digest(sha_hash)?; - - let addr = - bech32::encode(&prefix, rip_hash.to_base32(), bech32::Variant::Bech32).map_err(|_| { - ChainCommunicationError::ParseError { - msg: "bech32".to_string(), - } - })?; - - Ok(addr) -} - -/// encode H256 to bech32 address -pub fn pub_to_binary_addr(pub_key: Vec) -> ChainResult { - let sha_hash = match (pub_key.len() == 33) && (pub_key[0] == 0x02 || pub_key[0] == 0x03) { - true => sha256_digest(pub_key)?, - false => { - let comp_pub_key = vec![0x03]; - let comp_pub_key = comp_pub_key - .into_iter() - .chain(pub_key[1..33].iter().cloned()) - .collect::>(); - - sha256_digest(comp_pub_key)? - } - }; - let rip_hash = ripemd160_digest(sha_hash)?; - - Ok(H160::from_slice(rip_hash.as_slice())) -} diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 301e212a78..e0bfe8c565 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -4,8 +4,10 @@ use std::{ io::Cursor, num::NonZeroU64, ops::RangeInclusive, + str::FromStr, }; +use crate::address::CosmosAddress; use crate::grpc::{WasmGrpcProvider, WasmProvider}; use crate::payloads::mailbox::{ GeneralMailboxQuery, ProcessMessageRequest, ProcessMessageRequestInner, @@ -13,17 +15,14 @@ use crate::payloads::mailbox::{ use crate::payloads::{general, mailbox}; use crate::rpc::{CosmosWasmIndexer, ParsedEvent, WasmIndexer}; use crate::CosmosProvider; -use crate::{signers::Signer, utils::get_block_height_for_lag, verify, ConnectionConf}; +use crate::{signers::Signer, utils::get_block_height_for_lag, ConnectionConf}; use async_trait::async_trait; use cosmrs::proto::cosmos::base::abci::v1beta1::TxResponse; use cosmrs::proto::cosmos::tx::v1beta1::SimulateResponse; use cosmrs::tendermint::abci::EventAttribute; use once_cell::sync::Lazy; -use crate::{ - binary::h256_to_h512, - utils::{CONTRACT_ADDRESS_ATTRIBUTE_KEY, CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64}, -}; +use crate::utils::{CONTRACT_ADDRESS_ATTRIBUTE_KEY, CONTRACT_ADDRESS_ATTRIBUTE_KEY_BASE64}; use hyperlane_core::{ utils::fmt_bytes, ChainResult, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneMessage, HyperlaneProvider, Indexer, LogMeta, Mailbox, TxCostEstimate, TxOutcome, @@ -137,7 +136,7 @@ impl Mailbox for CosmosMailbox { #[instrument(err, ret, skip(self))] async fn recipient_ism(&self, recipient: H256) -> ChainResult { - let address = verify::digest_to_addr(recipient, &self.signer.prefix)?; + let address = CosmosAddress::from_h256(recipient, &self.signer.prefix)?.address(); let payload = mailbox::RecipientIsmRequest { recipient_ism: mailbox::RecipientIsmRequestInner { @@ -152,8 +151,8 @@ impl Mailbox for CosmosMailbox { let response: mailbox::RecipientIsmResponse = serde_json::from_slice(&data)?; // convert Hex to H256 - let ism = verify::bech32_decode(response.ism)?; - Ok(ism) + let ism = CosmosAddress::from_str(&response.ism)?; + Ok(ism.digest()) } #[instrument(err, ret, skip(self))] @@ -175,9 +174,7 @@ impl Mailbox for CosmosMailbox { .wasm_send(process_message, tx_gas_limit) .await?; Ok(TxOutcome { - transaction_id: h256_to_h512(H256::from_slice( - hex::decode(response.txhash)?.as_slice(), - )), + transaction_id: H256::from_slice(hex::decode(response.txhash)?.as_slice()).into(), executed: response.code == 0, gas_used: U256::from(response.gas_used), gas_price: U256::from(response.gas_wanted), diff --git a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs index 83d6f6646d..7277c7737e 100644 --- a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs @@ -1,7 +1,6 @@ use std::str::FromStr; use crate::{ - binary::h160_to_h256, grpc::{WasmGrpcProvider, WasmProvider}, payloads::ism_routes::QueryIsmGeneralRequest, signers::Signer, @@ -78,7 +77,7 @@ impl MultisigIsm for CosmosMultisigIsm { let validators: ChainResult> = response .validators .iter() - .map(|v| H160::from_str(v).map(h160_to_h256).map_err(Into::into)) + .map(|v| H160::from_str(v).map(H256::from).map_err(Into::into)) .collect(); Ok((validators?, response.threshold)) diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index 021033e0b2..a39db5a8b0 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -24,8 +24,9 @@ use hyperlane_core::{ }; use serde::Serialize; +use crate::address::CosmosAddress; +use crate::HyperlaneCosmosError; use crate::{signers::Signer, ConnectionConf}; -use crate::{verify, HyperlaneCosmosError}; const DEFAULT_GAS_PRICE: f32 = 0.05; const DEFAULT_GAS_ADJUSTMENT: f32 = 1.25; @@ -106,7 +107,8 @@ impl WasmGrpcProvider { } fn get_contract_addr(&self) -> ChainResult { - verify::digest_to_addr(self.address, self.signer.prefix.as_str()) + let cosmos_address = CosmosAddress::from_h256(self.address, &self.conf.get_prefix())?; + Ok(cosmos_address.address()) } } diff --git a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs index cbed71afdb..111ed4881d 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/rpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/rpc.rs @@ -1,6 +1,5 @@ use std::ops::RangeInclusive; -use crate::binary::h256_to_h512; use async_trait::async_trait; use cosmrs::rpc::client::{Client, CompatMode, HttpClient}; use cosmrs::rpc::endpoint::{tx, tx_search::Response as TxSearchResponse}; @@ -10,7 +9,7 @@ use cosmrs::tendermint::abci::EventAttribute; use hyperlane_core::{ChainCommunicationError, ChainResult, ContractLocator, LogMeta, H256, U256}; use tracing::{instrument, trace}; -use crate::verify::digest_to_addr; +use crate::address::CosmosAddress; use crate::ConnectionConf; const PAGINATION_LIMIT: u8 = 100; @@ -28,17 +27,17 @@ pub trait WasmIndexer: Send + Sync { parser: for<'a> fn(&'a Vec) -> ChainResult>, ) -> ChainResult> where - T: Send + Sync + 'static; + T: Send + Sync + PartialEq + 'static; } #[derive(Debug, Eq, PartialEq)] /// An event parsed from the RPC response. -pub struct ParsedEvent { +pub struct ParsedEvent { contract_address: String, event: T, } -impl ParsedEvent { +impl ParsedEvent { /// Create a new ParsedEvent. pub fn new(contract_address: String, event: T) -> Self { Self { @@ -52,8 +51,7 @@ impl ParsedEvent { /// Cosmwasm RPC Provider pub struct CosmosWasmIndexer { client: HttpClient, - contract_address: H256, - contract_address_bech32: String, + contract_address: CosmosAddress, target_event_kind: String, reorg_period: u32, } @@ -74,8 +72,10 @@ impl CosmosWasmIndexer { .build()?; Ok(Self { client, - contract_address: locator.address, - contract_address_bech32: digest_to_addr(locator.address, conf.get_prefix().as_str())?, + contract_address: CosmosAddress::from_h256( + locator.address, + conf.get_prefix().as_str(), + )?, target_event_kind: format!("{}-{}", Self::WASM_TYPE, event_type), reorg_period, }) @@ -99,7 +99,7 @@ impl CosmosWasmIndexer { parser: for<'a> fn(&'a Vec) -> ChainResult>, ) -> ChainResult + '_> where - T: 'static, + T: PartialEq + 'static, { let logs_iter = txs .into_iter() @@ -127,7 +127,7 @@ impl CosmosWasmIndexer { parser: for<'a> fn(&'a Vec) -> ChainResult>, ) -> impl Iterator + '_ where - T: 'static, + T: PartialEq + 'static, { tx.tx_result.events.into_iter().enumerate().filter_map(move |(log_idx, event)| { if event.kind.as_str() != self.target_event_kind { @@ -146,18 +146,18 @@ impl CosmosWasmIndexer { // in the event matches the contract address we are indexing. // Otherwise, we might index events from other contracts that happen // to have the same target event name. - if parsed_event.contract_address != self.contract_address_bech32 { + if parsed_event.contract_address != self.contract_address.address() { trace!(tx_hash=?tx.hash, log_idx, ?event, "Event contract address does not match indexer contract address"); return None; } Some((parsed_event.event, LogMeta { - address: self.contract_address, + address: self.contract_address.digest(), block_number: tx.height.value(), // FIXME: block_hash is not available in tx_search. // This isn't strictly required atm. block_hash: H256::zero(), - transaction_id: h256_to_h512(H256::from_slice(tx.hash.as_bytes())), + transaction_id: H256::from_slice(tx.hash.as_bytes()).into(), transaction_index: tx.index.into(), log_index: U256::from(log_idx), })) @@ -189,7 +189,7 @@ impl WasmIndexer for CosmosWasmIndexer { parser: for<'a> fn(&'a Vec) -> ChainResult>, ) -> ChainResult> where - T: Send + Sync + 'static, + T: PartialEq + Send + Sync + 'static, { // Page starts from 1 let query = Query::default() @@ -197,7 +197,7 @@ impl WasmIndexer for CosmosWasmIndexer { .and_lte("tx.height", *range.end() as u64) .and_eq( format!("{}._contract_address", self.target_event_kind), - self.contract_address_bech32.clone(), + self.contract_address.address(), ); let tx_search_result = self.tx_search(query.clone(), 1).await?; diff --git a/rust/chains/hyperlane-cosmos/src/routing_ism.rs b/rust/chains/hyperlane-cosmos/src/routing_ism.rs index 7f96175664..497aedcc87 100644 --- a/rust/chains/hyperlane-cosmos/src/routing_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/routing_ism.rs @@ -1,3 +1,5 @@ +use std::str::FromStr; + use async_trait::async_trait; use hyperlane_core::{ @@ -6,12 +8,12 @@ use hyperlane_core::{ }; use crate::{ + address::CosmosAddress, grpc::{WasmGrpcProvider, WasmProvider}, payloads::ism_routes::{ IsmRouteRequest, IsmRouteRequestInner, IsmRouteRespnose, QueryRoutingIsmGeneralRequest, }, signers::Signer, - verify::bech32_decode, ConnectionConf, CosmosProvider, }; @@ -72,6 +74,6 @@ impl RoutingIsm for CosmosRoutingIsm { .await?; let response: IsmRouteRespnose = serde_json::from_slice(&data)?; - Ok(bech32_decode(response.ism)?) + Ok(CosmosAddress::from_str(&response.ism)?.digest()) } } diff --git a/rust/chains/hyperlane-cosmos/src/signers.rs b/rust/chains/hyperlane-cosmos/src/signers.rs index e07de304e1..0194bb5452 100644 --- a/rust/chains/hyperlane-cosmos/src/signers.rs +++ b/rust/chains/hyperlane-cosmos/src/signers.rs @@ -1,7 +1,7 @@ use cosmrs::crypto::{secp256k1::SigningKey, PublicKey}; use hyperlane_core::ChainResult; -use crate::verify; +use crate::address::CosmosAddress; #[derive(Clone, Debug)] /// Signer for cosmos chain @@ -23,10 +23,8 @@ impl Signer { /// * `private_key` - private key for signer /// * `prefix` - prefix for signer address pub fn new(private_key: Vec, prefix: String) -> ChainResult { - let address = Self::address(&private_key, &prefix)?; - + let address = CosmosAddress::from_privkey(&private_key, &prefix)?.address(); let signing_key = Self::build_signing_key(&private_key)?; - SigningKey::from_slice(&private_key)?; let public_key = signing_key.public_key(); Ok(Self { public_key, @@ -36,17 +34,6 @@ impl Signer { }) } - /// get bech32 address - fn address(private_key: &Vec, prefix: &str) -> ChainResult { - let address = verify::pub_to_addr( - SigningKey::from_slice(private_key.as_slice())? - .public_key() - .to_bytes(), - prefix, - )?; - Ok(address) - } - /// Build a SigningKey from a private key. This cannot be /// precompiled and stored in `Signer`, because `SigningKey` is not `Sync`. pub fn signing_key(&self) -> ChainResult { diff --git a/rust/chains/hyperlane-cosmos/src/types.rs b/rust/chains/hyperlane-cosmos/src/types.rs new file mode 100644 index 0000000000..d2e7c965ad --- /dev/null +++ b/rust/chains/hyperlane-cosmos/src/types.rs @@ -0,0 +1,24 @@ +use hyperlane_core::ModuleType; + +pub struct IsmType(pub hpl_interface::ism::ISMType); + +impl From for IsmType { + fn from(value: hpl_interface::ism::ISMType) -> Self { + IsmType(value) + } +} + +impl From for ModuleType { + fn from(value: IsmType) -> Self { + match value.0 { + hpl_interface::ism::ISMType::Unused => ModuleType::Unused, + hpl_interface::ism::ISMType::Routing => ModuleType::Routing, + hpl_interface::ism::ISMType::Aggregation => ModuleType::Aggregation, + hpl_interface::ism::ISMType::LegacyMultisig => ModuleType::MessageIdMultisig, + hpl_interface::ism::ISMType::MerkleRootMultisig => ModuleType::MerkleRootMultisig, + hpl_interface::ism::ISMType::MessageIdMultisig => ModuleType::MessageIdMultisig, + hpl_interface::ism::ISMType::Null => ModuleType::Null, + hpl_interface::ism::ISMType::CcipRead => ModuleType::CcipRead, + } + } +} diff --git a/rust/chains/hyperlane-cosmos/src/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/validator_announce.rs index dc59c8c0bb..59a98a7462 100644 --- a/rust/chains/hyperlane-cosmos/src/validator_announce.rs +++ b/rust/chains/hyperlane-cosmos/src/validator_announce.rs @@ -4,11 +4,10 @@ use cosmrs::proto::cosmos::base::abci::v1beta1::TxResponse; use hyperlane_core::{ Announcement, ChainCommunicationError, ChainResult, ContractLocator, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneProvider, SignedType, TxOutcome, - ValidatorAnnounce, H256, U256, + ValidatorAnnounce, H160, H256, U256, }; use crate::{ - binary::h256_to_h160, grpc::{WasmGrpcProvider, WasmProvider}, payloads::validator_announce::{ self, AnnouncementRequest, AnnouncementRequestInner, GetAnnounceStorageLocationsRequest, @@ -67,7 +66,7 @@ impl ValidatorAnnounce for CosmosValidatorAnnounce { ) -> ChainResult>> { let vss = validators .iter() - .map(|v| h256_to_h160(*v)) + .map(|v| H160::from(*v)) .map(|v| hex::encode(v.as_bytes())) .collect::>(); diff --git a/rust/hyperlane-base/src/settings/chains.rs b/rust/hyperlane-base/src/settings/chains.rs index 338bccab67..8ca4a1cda1 100644 --- a/rust/hyperlane-base/src/settings/chains.rs +++ b/rust/hyperlane-base/src/settings/chains.rs @@ -149,7 +149,7 @@ impl ChainConf { Ok(Box::new(h_cosmos::CosmosMailbox::new( conf.clone(), locator.clone(), - signer.clone().unwrap(), + signer.clone().expect("Cosmos signer not configured"), )) as Box) } } diff --git a/rust/hyperlane-core/src/error.rs b/rust/hyperlane-core/src/error.rs index 4faab8c4d1..42a150aa6c 100644 --- a/rust/hyperlane-core/src/error.rs +++ b/rust/hyperlane-core/src/error.rs @@ -8,6 +8,7 @@ use cosmrs::proto::prost; use cosmrs::Error as CosmrsError; use std::string::FromUtf8Error; +use crate::Error as PrimitiveTypeError; use crate::HyperlaneProviderError; use crate::H256; @@ -142,6 +143,9 @@ pub enum ChainCommunicationError { /// Failed to estimate transaction gas cost. #[error("Failed to estimate transaction gas cost {0}")] TxCostEstimateError(String), + /// Primitive type error + #[error(transparent)] + PrimitiveTypeError(#[from] PrimitiveTypeError), } impl ChainCommunicationError { diff --git a/rust/hyperlane-core/src/traits/signing.rs b/rust/hyperlane-core/src/traits/signing.rs index f2d1691af6..81f1c348b2 100644 --- a/rust/hyperlane-core/src/traits/signing.rs +++ b/rust/hyperlane-core/src/traits/signing.rs @@ -1,19 +1,20 @@ -use std::fmt::{Debug, Formatter}; - use async_trait::async_trait; use auto_impl::auto_impl; -use elliptic_curve::consts::U32; -#[cfg(feature = "ethers")] -use ethers_core::k256::{ - ecdsa::recoverable::Signature as RecoverableSignature, ecdsa::Signature as K256Signature, - PublicKey as K256PublicKey, -}; -use generic_array::GenericArray; - use serde::{ ser::{SerializeStruct, Serializer}, Deserialize, Serialize, }; +use std::fmt::{Debug, Formatter}; + +#[cfg(feature = "ethers")] +use { + elliptic_curve::consts::U32, + ethers_core::k256::{ + ecdsa::recoverable::Signature as RecoverableSignature, ecdsa::Signature as K256Signature, + PublicKey as K256PublicKey, + }, + generic_array::GenericArray, +}; use crate::utils::fmt_bytes; use crate::{Signature, H160, H256}; diff --git a/rust/hyperlane-core/src/types/primitive_types.rs b/rust/hyperlane-core/src/types/primitive_types.rs index 58dd9bffab..2b0f5112e6 100644 --- a/rust/hyperlane-core/src/types/primitive_types.rs +++ b/rust/hyperlane-core/src/types/primitive_types.rs @@ -10,9 +10,10 @@ use uint::construct_uint; use crate::types::serialize; /// Error type for conversion. -#[derive(Debug, PartialEq, Eq)] +#[derive(Debug, PartialEq, Eq, thiserror::Error)] pub enum Error { /// Overflow encountered. + #[error("Overflow when creating primitive type")] Overflow, } diff --git a/rust/hyperlane-core/src/utils.rs b/rust/hyperlane-core/src/utils.rs index 41e9c115d0..56a3e4c9b3 100644 --- a/rust/hyperlane-core/src/utils.rs +++ b/rust/hyperlane-core/src/utils.rs @@ -1,7 +1,9 @@ -use std::{str::FromStr, time::Duration}; - use eyre::Result; use sha3::{digest::Update, Digest, Keccak256}; +use std::str::FromStr; + +#[cfg(feature = "float")] +use std::time::Duration; use crate::{KnownHyperlaneDomain, H160, H256}; diff --git a/rust/utils/run-locally/Cargo.toml b/rust/utils/run-locally/Cargo.toml index 04b272658b..1f59fb2fb3 100644 --- a/rust/utils/run-locally/Cargo.toml +++ b/rust/utils/run-locally/Cargo.toml @@ -10,6 +10,7 @@ publish.workspace = true version.workspace = true [dependencies] +hyperlane-core = { path = "../../hyperlane-core" } toml_edit.workspace = true k256.workspace = true ripemd.workspace = true @@ -26,6 +27,5 @@ ureq = { workspace = true, default-features = false } which.workspace = true macro_rules_attribute.workspace = true regex.workspace = true -hyperlane-core = { path = "../../hyperlane-core" } hpl-interface.workspace = true cosmwasm-schema.workspace = true diff --git a/rust/utils/run-locally/src/cosmos/crypto.rs b/rust/utils/run-locally/src/cosmos/crypto.rs index b583ee3b89..e4520cbcbf 100644 --- a/rust/utils/run-locally/src/cosmos/crypto.rs +++ b/rust/utils/run-locally/src/cosmos/crypto.rs @@ -1,3 +1,7 @@ +// TODO: this file can be removed if `CosmosAddress` can be imported from `hyperlane-cosmos`. +// However, adding a hyperlane-cosmos dep creates a dep cycle. +// Look into how this can be fixed. + use k256::ecdsa::{SigningKey, VerifyingKey}; use ripemd::Ripemd160; use sha2::{Digest, Sha256}; diff --git a/rust/utils/run-locally/src/cosmos/link.rs b/rust/utils/run-locally/src/cosmos/link.rs index 46bc5cabcc..1e65aa4b25 100644 --- a/rust/utils/run-locally/src/cosmos/link.rs +++ b/rust/utils/run-locally/src/cosmos/link.rs @@ -92,7 +92,6 @@ fn link_network( target_domain: u32, ) { let validator_addr = validator.addr(hrp); - let _validator_pubkey = validator.pub_key_to_binary(); let dest_domain = if network.domain == 26657 { 26658 From 2622389cbf188626c186a2d4675acee10856302e Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Wed, 8 Nov 2023 12:36:33 +0000 Subject: [PATCH 132/142] Optional cosmos signer (#2890) Removes cosmos signer unwraps by making the signer optional. Depends on https://github.com/hyperlane-xyz/hyperlane-monorepo/pull/2887 --- .../hyperlane-cosmos/src/aggregation_ism.rs | 4 +-- .../hyperlane-cosmos/src/interchain_gas.rs | 4 +-- .../src/interchain_security_module.rs | 4 +-- rust/chains/hyperlane-cosmos/src/mailbox.rs | 17 ++++++---- .../hyperlane-cosmos/src/merkle_tree_hook.rs | 6 ++-- .../hyperlane-cosmos/src/multisig_ism.rs | 8 ++--- .../hyperlane-cosmos/src/providers/grpc.rs | 30 +++++++++-------- .../hyperlane-cosmos/src/routing_ism.rs | 4 +-- .../src/validator_announce.rs | 8 ++--- rust/hyperlane-base/src/settings/chains.rs | 33 ++++++++----------- 10 files changed, 57 insertions(+), 61 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs b/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs index 373d71a1fc..4b700ff1ff 100644 --- a/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs @@ -23,8 +23,8 @@ pub struct CosmosAggregationIsm { impl CosmosAggregationIsm { /// create new Cosmos AggregationIsm agent - pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { - let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); + pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Option) -> Self { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer); Self { domain: locator.domain.clone(), diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index 621f76fa7b..a1be3cca62 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -44,8 +44,8 @@ impl InterchainGasPaymaster for CosmosInterchainGasPaymaster {} impl CosmosInterchainGasPaymaster { /// create new Cosmos InterchainGasPaymaster agent - pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { - let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); + pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Option) -> Self { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer); Self { domain: locator.domain.clone(), diff --git a/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs index 5b122e2c02..510a309558 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs @@ -28,9 +28,9 @@ pub struct CosmosInterchainSecurityModule { /// The Cosmos Interchain Security Module Implementation. impl CosmosInterchainSecurityModule { /// Creates a new Cosmos Interchain Security Module. - pub fn new(conf: &ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { + pub fn new(conf: &ConnectionConf, locator: ContractLocator, signer: Option) -> Self { let provider: WasmGrpcProvider = - WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); + WasmGrpcProvider::new(conf.clone(), locator.clone(), signer); Self { domain: locator.domain.clone(), diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index e0bfe8c565..a25e6c7b99 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -35,25 +35,30 @@ use tracing::{instrument, warn}; /// A reference to a Mailbox contract on some Cosmos chain pub struct CosmosMailbox { + config: ConnectionConf, domain: HyperlaneDomain, address: H256, - signer: Signer, provider: Box, } impl CosmosMailbox { /// Create a reference to a mailbox at a specific Ethereum address on some /// chain - pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { - let provider = WasmGrpcProvider::new(conf, locator.clone(), signer.clone()); + pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Option) -> Self { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); Self { + config: conf, domain: locator.domain.clone(), address: locator.address, - signer, provider: Box::new(provider), } } + + /// Prefix used in the bech32 address encoding + pub fn prefix(&self) -> String { + self.config.get_prefix() + } } impl HyperlaneContract for CosmosMailbox { @@ -136,7 +141,7 @@ impl Mailbox for CosmosMailbox { #[instrument(err, ret, skip(self))] async fn recipient_ism(&self, recipient: H256) -> ChainResult { - let address = CosmosAddress::from_h256(recipient, &self.signer.prefix)?.address(); + let address = CosmosAddress::from_h256(recipient, &self.prefix())?.address(); let payload = mailbox::RecipientIsmRequest { recipient_ism: mailbox::RecipientIsmRequestInner { @@ -256,7 +261,7 @@ impl CosmosMailboxIndexer { pub fn new( conf: ConnectionConf, locator: ContractLocator, - signer: Signer, + signer: Option, reorg_period: u32, ) -> ChainResult { let mailbox = CosmosMailbox::new(conf.clone(), locator.clone(), signer.clone()); diff --git a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs index b972d3383e..37cc02669a 100644 --- a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs +++ b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -38,8 +38,8 @@ pub struct CosmosMerkleTreeHook { impl CosmosMerkleTreeHook { /// create new Cosmos MerkleTreeHook agent - pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { - let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); + pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Option) -> Self { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer); Self { domain: locator.domain.clone(), @@ -189,7 +189,7 @@ impl CosmosMerkleTreeHookIndexer { pub fn new( conf: ConnectionConf, locator: ContractLocator, - signer: Signer, + signer: Option, reorg_period: u32, ) -> ChainResult { let indexer = CosmosWasmIndexer::new( diff --git a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs index 7277c7737e..0af9065eb0 100644 --- a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs @@ -17,23 +17,19 @@ use crate::payloads::multisig_ism::{self, VerifyInfoRequest, VerifyInfoRequestIn /// A reference to a MultisigIsm contract on some Cosmos chain #[derive(Debug)] pub struct CosmosMultisigIsm { - _conf: ConnectionConf, domain: HyperlaneDomain, address: H256, - _signer: Signer, provider: Box, } impl CosmosMultisigIsm { /// create a new instance of CosmosMultisigIsm - pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { - let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); + pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Option) -> Self { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer); Self { - _conf: conf, domain: locator.domain.clone(), address: locator.address, - _signer: signer, provider: Box::new(provider), } } diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index a39db5a8b0..91626bd609 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -19,9 +19,7 @@ use cosmrs::proto::traits::Message; use cosmrs::tx::{self, Fee, MessageExt, SignDoc, SignerInfo}; use cosmrs::{Amount, Coin}; -use hyperlane_core::{ - ChainCommunicationError, ChainResult, ContractLocator, HyperlaneDomain, H256, U256, -}; +use hyperlane_core::{ChainCommunicationError, ChainResult, ContractLocator, H256, U256}; use serde::Serialize; use crate::address::CosmosAddress; @@ -86,17 +84,15 @@ pub trait WasmProvider: Send + Sync { /// Cosmwasm GRPC Provider pub struct WasmGrpcProvider { conf: ConnectionConf, - _domain: HyperlaneDomain, address: H256, - signer: Signer, + signer: Option, } impl WasmGrpcProvider { /// create new Cosmwasm GRPC Provider - pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { + pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Option) -> Self { Self { conf, - _domain: locator.domain.clone(), address: locator.address, signer, } @@ -110,6 +106,12 @@ impl WasmGrpcProvider { let cosmos_address = CosmosAddress::from_h256(self.address, &self.conf.get_prefix())?; Ok(cosmos_address.address()) } + + fn get_signer(&self) -> ChainResult { + self.signer + .clone() + .ok_or(ChainCommunicationError::SignerUnavailable) + } } #[async_trait] @@ -219,14 +221,14 @@ impl WasmProvider for WasmGrpcProvider { where I: IntoIterator + Send + Sync, { - let account_info = self.account_query(self.signer.address.clone()).await?; + let signer = self.get_signer()?; + let account_info = self.account_query(signer.address.clone()).await?; - let private_key = self.signer.signing_key()?; + let private_key = signer.signing_key()?; let public_key = private_key.public_key(); let tx_body = tx::Body::new(msgs, "", 9000000u32); - let signer_info = - SignerInfo::single_direct(Some(self.signer.public_key), account_info.sequence); + let signer_info = SignerInfo::single_direct(Some(signer.public_key), account_info.sequence); let gas_limit: u64 = gas_limit.unwrap_or(U256::from(300000u64)).as_u64(); @@ -255,10 +257,11 @@ impl WasmProvider for WasmGrpcProvider { where T: Serialize + Send + Sync, { + let signer = self.get_signer()?; let mut client = TxServiceClient::connect(self.get_conn_url()?).await?; let msgs = vec![MsgExecuteContract { - sender: self.signer.address.clone(), + sender: signer.address, contract: self.get_contract_addr()?, msg: serde_json::to_string(&payload)?.as_bytes().to_vec(), funds: vec![], @@ -289,8 +292,9 @@ impl WasmProvider for WasmGrpcProvider { where T: Serialize + Send + Sync, { + let signer = self.get_signer()?; let msg = MsgExecuteContract { - sender: self.signer.address.clone(), + sender: signer.address, contract: self.get_contract_addr()?, msg: serde_json::to_string(&payload)?.as_bytes().to_vec(), funds: vec![], diff --git a/rust/chains/hyperlane-cosmos/src/routing_ism.rs b/rust/chains/hyperlane-cosmos/src/routing_ism.rs index 497aedcc87..dc0a8e1041 100644 --- a/rust/chains/hyperlane-cosmos/src/routing_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/routing_ism.rs @@ -27,8 +27,8 @@ pub struct CosmosRoutingIsm { impl CosmosRoutingIsm { /// create a new instance of CosmosRoutingIsm - pub fn new(conf: &ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { - let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); + pub fn new(conf: &ConnectionConf, locator: ContractLocator, signer: Option) -> Self { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer); Self { domain: locator.domain.clone(), diff --git a/rust/chains/hyperlane-cosmos/src/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/validator_announce.rs index 59a98a7462..aa39eee5b6 100644 --- a/rust/chains/hyperlane-cosmos/src/validator_announce.rs +++ b/rust/chains/hyperlane-cosmos/src/validator_announce.rs @@ -20,23 +20,19 @@ use crate::{ /// A reference to a ValidatorAnnounce contract on some Cosmos chain #[derive(Debug)] pub struct CosmosValidatorAnnounce { - _conf: ConnectionConf, domain: HyperlaneDomain, address: H256, - _signer: Signer, provider: Box, } impl CosmosValidatorAnnounce { /// create a new instance of CosmosValidatorAnnounce - pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Signer) -> Self { - let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); + pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Option) -> Self { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer); Self { - _conf: conf, domain: locator.domain.clone(), address: locator.address, - _signer: signer, provider: Box::new(provider), } } diff --git a/rust/hyperlane-base/src/settings/chains.rs b/rust/hyperlane-base/src/settings/chains.rs index 8ca4a1cda1..88120f3f27 100644 --- a/rust/hyperlane-base/src/settings/chains.rs +++ b/rust/hyperlane-base/src/settings/chains.rs @@ -149,7 +149,7 @@ impl ChainConf { Ok(Box::new(h_cosmos::CosmosMailbox::new( conf.clone(), locator.clone(), - signer.clone().expect("Cosmos signer not configured"), + signer.clone(), )) as Box) } } @@ -184,12 +184,9 @@ impl ChainConf { .map_err(Into::into) } ChainConnectionConf::Cosmos(conf) => { - let signer = self.cosmos_signer().await.context(ctx)?.unwrap(); - let hook = h_cosmos::CosmosMerkleTreeHook::new( - conf.clone(), - locator.clone(), - signer.clone(), - ); + let signer = self.cosmos_signer().await.context(ctx)?; + let hook = + h_cosmos::CosmosMerkleTreeHook::new(conf.clone(), locator.clone(), signer); Ok(Box::new(hook) as Box) } @@ -223,11 +220,11 @@ impl ChainConf { Ok(indexer as Box>) } ChainConnectionConf::Cosmos(conf) => { - let signer = self.cosmos_signer().await.context(ctx)?.unwrap(); + let signer = self.cosmos_signer().await.context(ctx)?; let indexer = Box::new(h_cosmos::CosmosMailboxIndexer::new( conf.clone(), locator, - signer.clone(), + signer, self.reorg_period, )?); Ok(indexer as Box>) @@ -262,7 +259,7 @@ impl ChainConf { Ok(indexer as Box>) } ChainConnectionConf::Cosmos(conf) => { - let signer = self.cosmos_signer().await.context(ctx)?.unwrap(); + let signer = self.cosmos_signer().await.context(ctx)?; let indexer = Box::new(h_cosmos::CosmosMailboxIndexer::new( conf.clone(), locator, @@ -306,7 +303,7 @@ impl ChainConf { let paymaster = Box::new(h_cosmos::CosmosInterchainGasPaymaster::new( conf.clone(), locator.clone(), - signer.unwrap().clone(), + signer, )); Ok(paymaster as Box) } @@ -389,7 +386,7 @@ impl ChainConf { conf.clone(), locator, // TODO: remove signer requirement entirely - signer.unwrap().clone(), + signer, self.reorg_period, )?); Ok(indexer as Box>) @@ -420,7 +417,7 @@ impl ChainConf { let va = Box::new(h_cosmos::CosmosValidatorAnnounce::new( conf.clone(), locator.clone(), - signer.unwrap().clone(), + signer, )); Ok(va as Box) @@ -460,9 +457,7 @@ impl ChainConf { ChainConnectionConf::Cosmos(conf) => { let signer = self.cosmos_signer().await.context(ctx)?; let ism = Box::new(h_cosmos::CosmosInterchainSecurityModule::new( - conf, - locator, - signer.unwrap(), + conf, locator, signer, )); Ok(ism as Box) } @@ -496,7 +491,7 @@ impl ChainConf { let ism = Box::new(h_cosmos::CosmosMultisigIsm::new( conf.clone(), locator.clone(), - signer.unwrap().clone(), + signer, )); Ok(ism as Box) } @@ -530,7 +525,7 @@ impl ChainConf { let ism = Box::new(h_cosmos::CosmosRoutingIsm::new( &conf.clone(), locator.clone(), - signer.unwrap().clone(), + signer, )); Ok(ism as Box) } @@ -564,7 +559,7 @@ impl ChainConf { let ism = Box::new(h_cosmos::CosmosAggregationIsm::new( conf.clone(), locator.clone(), - signer.unwrap().clone(), + signer, )); Ok(ism as Box) From 3391c550c0a685ed2015cd222a7855951db1e4ce Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Thu, 9 Nov 2023 11:45:34 +0000 Subject: [PATCH 133/142] Fix null deser of EventAttribute.value (#2902) ### Description ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- rust/Cargo.lock | 32 +++++++++++++++++++++++--------- rust/Cargo.toml | 10 ++++++++++ 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 2d3e25700d..338f8431e4 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -1430,7 +1430,7 @@ checksum = "73c9d2043a9e617b0d602fbc0a0ecd621568edbf3a9774890a6d562389bd8e1c" dependencies = [ "prost", "prost-types", - "tendermint-proto", + "tendermint-proto 0.32.2 (registry+https://github.com/rust-lang/crates.io-index)", "tonic", ] @@ -9330,8 +9330,7 @@ dependencies = [ [[package]] name = "tendermint" version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f0a7d05cf78524782337f8edd55cbc578d159a16ad4affe2135c92f7dbac7f0" +source = "git+https://github.com/hyperlane-xyz/tendermint-rs.git?branch=trevor/0.32.2-fork#feea28d47e73bf7678e1e5cdced0f5ca51b69286" dependencies = [ "bytes", "digest 0.10.7", @@ -9353,7 +9352,7 @@ dependencies = [ "signature 2.1.0", "subtle", "subtle-encoding", - "tendermint-proto", + "tendermint-proto 0.32.2 (git+https://github.com/hyperlane-xyz/tendermint-rs.git?branch=trevor/0.32.2-fork)", "time", "zeroize", ] @@ -9361,8 +9360,7 @@ dependencies = [ [[package]] name = "tendermint-config" version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71a72dbbea6dde12045d261f2c70c0de039125675e8a026c8d5ad34522756372" +source = "git+https://github.com/hyperlane-xyz/tendermint-rs.git?branch=trevor/0.32.2-fork#feea28d47e73bf7678e1e5cdced0f5ca51b69286" dependencies = [ "flex-error", "serde", @@ -9390,11 +9388,27 @@ dependencies = [ "time", ] +[[package]] +name = "tendermint-proto" +version = "0.32.2" +source = "git+https://github.com/hyperlane-xyz/tendermint-rs.git?branch=trevor/0.32.2-fork#feea28d47e73bf7678e1e5cdced0f5ca51b69286" +dependencies = [ + "bytes", + "flex-error", + "num-derive 0.3.3", + "num-traits", + "prost", + "prost-types", + "serde", + "serde_bytes", + "subtle-encoding", + "time", +] + [[package]] name = "tendermint-rpc" version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d119d83a130537fc4a98c3c9eb6899ebe857fea4860400a61675bfb5f0b35129" +source = "git+https://github.com/hyperlane-xyz/tendermint-rs.git?branch=trevor/0.32.2-fork#feea28d47e73bf7678e1e5cdced0f5ca51b69286" dependencies = [ "async-trait", "bytes", @@ -9415,7 +9429,7 @@ dependencies = [ "subtle-encoding", "tendermint", "tendermint-config", - "tendermint-proto", + "tendermint-proto 0.32.2 (git+https://github.com/hyperlane-xyz/tendermint-rs.git?branch=trevor/0.32.2-fork)", "thiserror", "time", "tokio", diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 3345fe9887..3f30b725c8 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -312,3 +312,13 @@ version = "=0.1.0" git = "https://github.com/hyperlane-xyz/solana-program-library.git" branch = "hyperlane" + +[patch.crates-io.tendermint] +version = "=0.32.2" +git = "https://github.com/hyperlane-xyz/tendermint-rs.git" +branch = "trevor/0.32.2-fork" + +[patch.crates-io.tendermint-rpc] +version = "=0.32.2" +git = "https://github.com/hyperlane-xyz/tendermint-rs.git" +branch = "trevor/0.32.2-fork" From 302c8e471a21359fec9300e6d5b11ae31526dd89 Mon Sep 17 00:00:00 2001 From: ByeongSu Hong Date: Thu, 9 Nov 2023 20:49:24 +0700 Subject: [PATCH 134/142] hyperlane (#2906) ### Description ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- rust/Cargo.lock | 6 +++--- rust/Cargo.toml | 4 ++-- rust/utils/run-locally/src/cosmos/deploy.rs | 18 ++++++++++++++---- rust/utils/run-locally/src/cosmos/mod.rs | 11 ++++------- 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 338f8431e4..f4a829246c 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -3896,9 +3896,9 @@ dependencies = [ [[package]] name = "hpl-interface" -version = "0.0.6-rc5" +version = "0.0.6-rc3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81f9e9d265630ce019d87c1e2931be566d9be4d155b65e483e93e60704801a3d" +checksum = "9124bd88d88aba044ae790007bcbf25493b93424156e8759523c9c5d02229b0c" dependencies = [ "bech32 0.9.1", "cosmwasm-schema", @@ -6922,7 +6922,7 @@ dependencies = [ "ctrlc", "eyre", "hex 0.4.3", - "hpl-interface 0.0.6-rc5", + "hpl-interface 0.0.6-rc3", "hyperlane-core", "k256 0.13.1", "macro_rules_attribute", diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 3f30b725c8..d9d2534752 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -174,8 +174,8 @@ ripemd = "0.1.3" hyper = "0.14" hyper-tls = "0.5.0" hex = "0.4.3" -tendermint-rpc = { version = "0.32.0", features = ["http-client", "tokio"]} -hpl-interface = "0.0.6-rc5" +tendermint-rpc = { version = "0.32.0", features = ["http-client", "tokio"] } +hpl-interface = "=0.0.6-rc3" elliptic-curve = "0.12.3" ## TODO: remove this diff --git a/rust/utils/run-locally/src/cosmos/deploy.rs b/rust/utils/run-locally/src/cosmos/deploy.rs index dd38b811ec..ba89b280b8 100644 --- a/rust/utils/run-locally/src/cosmos/deploy.rs +++ b/rust/utils/run-locally/src/cosmos/deploy.rs @@ -53,16 +53,26 @@ pub fn deploy_cw_hyperlane( ); // deploy igp set + #[cw_serde] + pub struct GasOracleInitMsg { + pub hrp: String, + pub owner: String, + pub gas_token: String, + pub beneficiary: String, + pub default_gas_usage: String, + } + let igp = cli.wasm_init( &endpoint, &deployer, Some(deployer_addr), codes.hpl_igp, - igp::core::InstantiateMsg { + GasOracleInitMsg { + hrp: PREFIX.to_string(), owner: deployer_addr.clone(), gas_token: "uosmo".to_string(), beneficiary: deployer_addr.clone(), - hrp: PREFIX.to_string(), + default_gas_usage: "250000".to_string(), }, "hpl_igp", ); @@ -72,10 +82,10 @@ pub fn deploy_cw_hyperlane( &deployer, Some(deployer_addr), codes.hpl_igp_oracle, - IGPOracleInstantiateMsg { + igp::oracle::InstantiateMsg { owner: deployer_addr.clone(), }, - "hpl_igp_gas_oracle", + "hpl_igp_oracle", ); // deploy ism - routing ism with empty routes diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index 5cd7a66f3b..8afb6a4a77 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -56,9 +56,9 @@ fn default_keys<'a>() -> [(&'a str, &'a str); 6] { KEY_ACCOUNTS3, ] } -const CW_HYPERLANE_GIT: &str = "https://github.com/many-things/cw-hyperlane"; -const CW_HYPERLANE_VERSION: &str = "0.0.6-rc3"; +const CW_HYPERLANE_GIT: &str = "https://github.com/many-things/cw-hyperlane"; +const CW_HYPERLANE_VERSION: &str = "0.0.6-rc6"; fn make_target() -> String { let os = if cfg!(target_os = "linux") { @@ -140,7 +140,7 @@ pub fn install_cosmos( version: OSMOSIS_CLI_VERSION.to_string(), }) .install(cli_dir); - let codes = install_codes(codes_dir, true); + let codes = install_codes(codes_dir, false); (osmosisd, codes) } @@ -315,10 +315,7 @@ fn run_locally() { .unwrap_or_default(), ); - let path_buf = - PathBuf::from("/Users/eric/many-things/mitosis/cw-hyperlane/artifacts/dist/wasm"); - - let (osmosisd, codes) = install_cosmos(None, cli_src, Some(path_buf), code_src); + let (osmosisd, codes) = install_cosmos(None, cli_src, None, code_src); let addr_base = "tcp://0.0.0.0"; let default_config = CosmosConfig { cli_path: osmosisd.clone(), From a95d42477b3a23b522e30620984d675a09a55f4e Mon Sep 17 00:00:00 2001 From: Trevor Porter Date: Fri, 10 Nov 2023 13:43:47 +0000 Subject: [PATCH 135/142] GRPC refactor (#2905) ### Description * Creates a single channel that's cloned (which can be done [cheaply and is encouraged](https://docs.rs/tonic/latest/tonic/transport/struct.Channel.html)) when creating a new client. * general cleanup & renaming * I believe a chain signer will not be required by e.g. the validator, will confirm this locally ### Drive-by changes n/a ### Related issues n/a ### Backward compatibility yee ### Testing builds, local test --- .../hyperlane-cosmos/src/aggregation_ism.rs | 12 +- .../hyperlane-cosmos/src/interchain_gas.rs | 12 +- .../src/interchain_security_module.rs | 12 +- rust/chains/hyperlane-cosmos/src/mailbox.rs | 27 +- .../hyperlane-cosmos/src/merkle_tree_hook.rs | 14 +- .../hyperlane-cosmos/src/multisig_ism.rs | 12 +- .../hyperlane-cosmos/src/providers/grpc.rs | 364 ++++++++++-------- .../hyperlane-cosmos/src/routing_ism.rs | 12 +- .../src/validator_announce.rs | 37 +- rust/hyperlane-base/src/settings/chains.rs | 22 +- 10 files changed, 290 insertions(+), 234 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs b/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs index 4b700ff1ff..c9d7200117 100644 --- a/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/aggregation_ism.rs @@ -23,14 +23,18 @@ pub struct CosmosAggregationIsm { impl CosmosAggregationIsm { /// create new Cosmos AggregationIsm agent - pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Option) -> Self { - let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer); + pub fn new( + conf: ConnectionConf, + locator: ContractLocator, + signer: Option, + ) -> ChainResult { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer)?; - Self { + Ok(Self { domain: locator.domain.clone(), address: locator.address, provider: Box::new(provider), - } + }) } } diff --git a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs index a1be3cca62..54360054c4 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_gas.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_gas.rs @@ -44,13 +44,17 @@ impl InterchainGasPaymaster for CosmosInterchainGasPaymaster {} impl CosmosInterchainGasPaymaster { /// create new Cosmos InterchainGasPaymaster agent - pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Option) -> Self { - let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer); + pub fn new( + conf: ConnectionConf, + locator: ContractLocator, + signer: Option, + ) -> ChainResult { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer)?; - Self { + Ok(Self { domain: locator.domain.clone(), address: locator.address, - } + }) } } diff --git a/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs index 510a309558..72a0ac984d 100644 --- a/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs +++ b/rust/chains/hyperlane-cosmos/src/interchain_security_module.rs @@ -28,15 +28,19 @@ pub struct CosmosInterchainSecurityModule { /// The Cosmos Interchain Security Module Implementation. impl CosmosInterchainSecurityModule { /// Creates a new Cosmos Interchain Security Module. - pub fn new(conf: &ConnectionConf, locator: ContractLocator, signer: Option) -> Self { + pub fn new( + conf: &ConnectionConf, + locator: ContractLocator, + signer: Option, + ) -> ChainResult { let provider: WasmGrpcProvider = - WasmGrpcProvider::new(conf.clone(), locator.clone(), signer); + WasmGrpcProvider::new(conf.clone(), locator.clone(), signer)?; - Self { + Ok(Self { domain: locator.domain.clone(), address: locator.address, provider: Box::new(provider), - } + }) } } diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index a25e6c7b99..f4098417a9 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -18,7 +18,6 @@ use crate::CosmosProvider; use crate::{signers::Signer, utils::get_block_height_for_lag, ConnectionConf}; use async_trait::async_trait; use cosmrs::proto::cosmos::base::abci::v1beta1::TxResponse; -use cosmrs::proto::cosmos::tx::v1beta1::SimulateResponse; use cosmrs::tendermint::abci::EventAttribute; use once_cell::sync::Lazy; @@ -44,15 +43,19 @@ pub struct CosmosMailbox { impl CosmosMailbox { /// Create a reference to a mailbox at a specific Ethereum address on some /// chain - pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Option) -> Self { - let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer.clone()); + pub fn new( + conf: ConnectionConf, + locator: ContractLocator, + signer: Option, + ) -> ChainResult { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer)?; - Self { + Ok(Self { config: conf, domain: locator.domain.clone(), address: locator.address, provider: Box::new(provider), - } + }) } /// Prefix used in the bech32 address encoding @@ -199,16 +202,10 @@ impl Mailbox for CosmosMailbox { }, }; - let response: SimulateResponse = self.provider.wasm_simulate(process_message).await?; + let gas_limit = self.provider.wasm_estimate_gas(process_message).await?; + let result = TxCostEstimate { - gas_limit: U256::from( - response - .gas_info - .ok_or(ChainCommunicationError::TxCostEstimateError( - "Failed to estimate gas limit".to_string(), - ))? - .gas_used, - ), + gas_limit: gas_limit.into(), gas_price: U256::from(2500), l2_gas_limit: None, }; @@ -264,7 +261,7 @@ impl CosmosMailboxIndexer { signer: Option, reorg_period: u32, ) -> ChainResult { - let mailbox = CosmosMailbox::new(conf.clone(), locator.clone(), signer.clone()); + let mailbox = CosmosMailbox::new(conf.clone(), locator.clone(), signer.clone())?; let indexer = CosmosWasmIndexer::new( conf, locator, diff --git a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs index 37cc02669a..28592d1f37 100644 --- a/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs +++ b/rust/chains/hyperlane-cosmos/src/merkle_tree_hook.rs @@ -38,14 +38,18 @@ pub struct CosmosMerkleTreeHook { impl CosmosMerkleTreeHook { /// create new Cosmos MerkleTreeHook agent - pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Option) -> Self { - let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer); + pub fn new( + conf: ConnectionConf, + locator: ContractLocator, + signer: Option, + ) -> ChainResult { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer)?; - Self { + Ok(Self { domain: locator.domain.clone(), address: locator.address, provider: Box::new(provider), - } + }) } } @@ -200,7 +204,7 @@ impl CosmosMerkleTreeHookIndexer { )?; Ok(Self { - merkle_tree_hook: CosmosMerkleTreeHook::new(conf, locator, signer), + merkle_tree_hook: CosmosMerkleTreeHook::new(conf, locator, signer)?, indexer: Box::new(indexer), }) } diff --git a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs index 0af9065eb0..a9d84dec7f 100644 --- a/rust/chains/hyperlane-cosmos/src/multisig_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/multisig_ism.rs @@ -24,14 +24,18 @@ pub struct CosmosMultisigIsm { impl CosmosMultisigIsm { /// create a new instance of CosmosMultisigIsm - pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Option) -> Self { - let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer); + pub fn new( + conf: ConnectionConf, + locator: ContractLocator, + signer: Option, + ) -> ChainResult { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer)?; - Self { + Ok(Self { domain: locator.domain.clone(), address: locator.address, provider: Box::new(provider), - } + }) } } diff --git a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs index 91626bd609..41b81e65b9 100644 --- a/rust/chains/hyperlane-cosmos/src/providers/grpc.rs +++ b/rust/chains/hyperlane-cosmos/src/providers/grpc.rs @@ -1,48 +1,64 @@ use async_trait::async_trait; -use cosmrs::proto::cosmos::auth::v1beta1::BaseAccount; -use cosmrs::proto::cosmos::auth::v1beta1::{ - query_client::QueryClient as QueryAccountClient, QueryAccountRequest, +use cosmrs::{ + proto::{ + cosmos::{ + auth::v1beta1::{ + query_client::QueryClient as QueryAccountClient, BaseAccount, QueryAccountRequest, + }, + base::{ + abci::v1beta1::TxResponse, + tendermint::v1beta1::{service_client::ServiceClient, GetLatestBlockRequest}, + }, + tx::v1beta1::{ + service_client::ServiceClient as TxServiceClient, BroadcastMode, + BroadcastTxRequest, SimulateRequest, TxRaw, + }, + }, + cosmwasm::wasm::v1::{ + query_client::QueryClient as WasmQueryClient, MsgExecuteContract, + QuerySmartContractStateRequest, + }, + traits::Message, + }, + tx::{self, Fee, MessageExt, SignDoc, SignerInfo}, + Amount, Coin, }; -use cosmrs::proto::cosmos::base::abci::v1beta1::TxResponse; -use cosmrs::proto::cosmos::base::tendermint::v1beta1::{ - service_client::ServiceClient, GetLatestBlockRequest, -}; -use cosmrs::proto::cosmos::tx::v1beta1::service_client::ServiceClient as TxServiceClient; -use cosmrs::proto::cosmos::tx::v1beta1::{ - BroadcastMode, BroadcastTxRequest, SimulateRequest, SimulateResponse, -}; -use cosmrs::proto::cosmwasm::wasm::v1::{ - query_client::QueryClient as WasmQueryClient, MsgExecuteContract, - QuerySmartContractStateRequest, -}; -use cosmrs::proto::traits::Message; - -use cosmrs::tx::{self, Fee, MessageExt, SignDoc, SignerInfo}; -use cosmrs::{Amount, Coin}; -use hyperlane_core::{ChainCommunicationError, ChainResult, ContractLocator, H256, U256}; +use hyperlane_core::{ChainCommunicationError, ChainResult, ContractLocator, U256}; use serde::Serialize; +use tonic::transport::{Channel, Endpoint}; use crate::address::CosmosAddress; use crate::HyperlaneCosmosError; use crate::{signers::Signer, ConnectionConf}; -const DEFAULT_GAS_PRICE: f32 = 0.05; -const DEFAULT_GAS_ADJUSTMENT: f32 = 1.25; +/// The gas price to use for transactions. +/// TODO: is there a nice way to get a suggested price dynamically? +const DEFAULT_GAS_PRICE: f64 = 0.05; +/// A multiplier applied to a simulated transaction's gas usage to +/// calculate the estimated gas. +const GAS_ESTIMATE_MULTIPLIER: f64 = 1.25; +/// The number of blocks in the future in which a transaction will +/// be valid for. +const TIMEOUT_BLOCKS: u64 = 1000; #[async_trait] /// Cosmwasm GRPC Provider pub trait WasmProvider: Send + Sync { - /// get latest block height + /// Get latest block height. + /// Note that in Tendermint, validators come to consensus on a block + /// before they execute the transactions in that block. This means that + /// we may not be able to make state queries against this block until + /// the next one is committed! async fn latest_block_height(&self) -> ChainResult; - /// query to already define contract address + /// Perform a wasm query against the stored contract address. async fn wasm_query( &self, payload: T, block_height: Option, ) -> ChainResult>; - /// query to specific contract address + /// Perform a wasm query against a specified contract address. async fn wasm_query_to( &self, to: String, @@ -50,74 +66,176 @@ pub trait WasmProvider: Send + Sync { block_height: Option, ) -> ChainResult>; - /// query account info - async fn account_query(&self, address: String) -> ChainResult; - - /// simulate raw tx - async fn simulate_raw_tx + Sync + Send>( - &self, - msgs: I, - ) -> ChainResult; - - /// generate raw tx - async fn generate_raw_tx + Sync + Send>( - &self, - msgs: I, - gas_limit: Option, - ) -> ChainResult>; - - /// send tx + /// Send a wasm tx. async fn wasm_send( &self, payload: T, gas_limit: Option, ) -> ChainResult; - /// simulate tx - async fn wasm_simulate( - &self, - payload: T, - ) -> ChainResult; + /// Estimate gas for a wasm tx. + async fn wasm_estimate_gas(&self, payload: T) -> ChainResult; } #[derive(Debug)] -/// Cosmwasm GRPC Provider +/// CosmWasm GRPC provider. pub struct WasmGrpcProvider { + /// Connection configuration. conf: ConnectionConf, - address: H256, + /// A contract address that can be used as the default + /// for queries / sends / estimates. + contract_address: CosmosAddress, + /// Signer for transactions. signer: Option, + /// GRPC Channel that can be cheaply cloned. + /// See https://docs.rs/tonic/latest/tonic/transport/struct.Channel.html#multiplexing-requests + channel: Channel, } impl WasmGrpcProvider { - /// create new Cosmwasm GRPC Provider - pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Option) -> Self { - Self { + /// Create new CosmWasm GRPC Provider. + pub fn new( + conf: ConnectionConf, + locator: ContractLocator, + signer: Option, + ) -> ChainResult { + let channel = Endpoint::new(conf.get_grpc_url())?.connect_lazy(); + let contract_address = CosmosAddress::from_h256(locator.address, &conf.get_prefix())?; + + Ok(Self { conf, - address: locator.address, + contract_address, signer, - } + channel, + }) + } + + /// Gets a signer, or returns an error if one is not available. + fn get_signer(&self) -> ChainResult<&Signer> { + self.signer + .as_ref() + .ok_or(ChainCommunicationError::SignerUnavailable) + } +} + +impl WasmGrpcProvider { + /// Generates an unsigned SignDoc for a transaction. + async fn generate_unsigned_sign_doc( + &self, + msgs: Vec, + gas_limit: u64, + ) -> ChainResult { + // As this function is only used for estimating gas or sending transactions, + // we can reasonably expect to have a signer. + let signer = self.get_signer()?; + let account_info = self.account_query(signer.address.clone()).await?; + let current_height = self.latest_block_height().await?; + let timeout_height = current_height + TIMEOUT_BLOCKS; + + let tx_body = tx::Body::new( + msgs, + String::default(), + TryInto::::try_into(timeout_height) + .map_err(ChainCommunicationError::from_other)?, + ); + let signer_info = SignerInfo::single_direct(Some(signer.public_key), account_info.sequence); + + let auth_info = signer_info.auth_info(Fee::from_amount_and_gas( + Coin::new( + Amount::from((gas_limit as f64 * DEFAULT_GAS_PRICE) as u64), + self.conf.get_canonical_asset().as_str(), + )?, + gas_limit, + )); + + SignDoc::new( + &tx_body, + &auth_info, + &self.conf.get_chain_id().parse()?, + account_info.account_number, + ) + .map_err(Into::into) } - fn get_conn_url(&self) -> ChainResult { - Ok(self.conf.get_grpc_url()) + /// Generates a raw signed transaction including `msgs`, estimating gas if a limit is not provided. + async fn generate_raw_signed_tx( + &self, + msgs: Vec, + gas_limit: Option, + ) -> ChainResult> { + let gas_limit = if let Some(l) = gas_limit { + l + } else { + self.estimate_gas(msgs.clone()).await? + }; + + let sign_doc = self.generate_unsigned_sign_doc(msgs, gas_limit).await?; + + let signer = self.get_signer()?; + let tx_signed = sign_doc.sign(&signer.signing_key()?)?; + Ok(tx_signed.to_bytes()?) } - fn get_contract_addr(&self) -> ChainResult { - let cosmos_address = CosmosAddress::from_h256(self.address, &self.conf.get_prefix())?; - Ok(cosmos_address.address()) + /// Estimates gas for a transaction containing `msgs`. + async fn estimate_gas(&self, msgs: Vec) -> ChainResult { + // Get a sign doc with 0 gas, because we plan to simulate + let sign_doc = self.generate_unsigned_sign_doc(msgs, 0).await?; + + let raw_tx = TxRaw { + body_bytes: sign_doc.body_bytes, + auth_info_bytes: sign_doc.auth_info_bytes, + // The poorly documented trick to simuluating a tx without a valid signature is to just pass + // in a single empty signature. Taken from cosmjs: + // https://github.com/cosmos/cosmjs/blob/44893af824f0712d1f406a8daa9fcae335422235/packages/stargate/src/modules/tx/queries.ts#L67 + signatures: vec![vec![]], + }; + + let mut client = TxServiceClient::new(self.channel.clone()); + let tx_bytes = raw_tx + .to_bytes() + .map_err(ChainCommunicationError::from_other)?; + #[allow(deprecated)] + let sim_req = tonic::Request::new(SimulateRequest { tx: None, tx_bytes }); + let gas_used = client + .simulate(sim_req) + .await + .map_err(ChainCommunicationError::from_other)? + .into_inner() + .gas_info + .ok_or_else(|| ChainCommunicationError::from_other_str("gas info not present"))? + .gas_used; + + let gas_estimate = (gas_used as f64 * GAS_ESTIMATE_MULTIPLIER) as u64; + + Ok(gas_estimate) } - fn get_signer(&self) -> ChainResult { - self.signer - .clone() - .ok_or(ChainCommunicationError::SignerUnavailable) + /// Queries an account. + async fn account_query(&self, account: String) -> ChainResult { + let mut client = QueryAccountClient::new(self.channel.clone()); + + let request = tonic::Request::new(QueryAccountRequest { address: account }); + let response = client + .account(request) + .await + .map_err(ChainCommunicationError::from_other)? + .into_inner(); + + let account = BaseAccount::decode( + response + .account + .ok_or_else(|| ChainCommunicationError::from_other_str("account not present"))? + .value + .as_slice(), + )?; + Ok(account) } } #[async_trait] impl WasmProvider for WasmGrpcProvider { async fn latest_block_height(&self) -> ChainResult { - let mut client = ServiceClient::connect(self.get_conn_url()?).await?; + let mut client = ServiceClient::new(self.channel.clone()); let request = tonic::Request::new(GetLatestBlockRequest {}); let response = client @@ -139,7 +257,7 @@ impl WasmProvider for WasmGrpcProvider { where T: Serialize + Send + Sync, { - self.wasm_query_to(self.get_contract_addr()?, payload, block_height) + self.wasm_query_to(self.contract_address.address(), payload, block_height) .await } @@ -152,7 +270,7 @@ impl WasmProvider for WasmGrpcProvider { where T: Serialize + Send + Sync, { - let mut client = WasmQueryClient::connect(self.get_conn_url()?).await?; + let mut client = WasmQueryClient::new(self.channel.clone()); let mut request = tonic::Request::new(QuerySmartContractStateRequest { address: to, query_data: serde_json::to_string(&payload)?.as_bytes().to_vec(), @@ -173,104 +291,37 @@ impl WasmProvider for WasmGrpcProvider { Ok(response.data) } - async fn account_query(&self, account: String) -> ChainResult { - let mut client = QueryAccountClient::connect(self.get_conn_url()?).await?; - - let request = tonic::Request::new(QueryAccountRequest { address: account }); - let response = client - .account(request) - .await - .map_err(ChainCommunicationError::from_other)? - .into_inner(); - - let account = BaseAccount::decode( - response - .account - .ok_or_else(|| ChainCommunicationError::from_other_str("account not present"))? - .value - .as_slice(), - )?; - Ok(account) - } - - async fn simulate_raw_tx(&self, msgs: I) -> ChainResult - where - I: IntoIterator + Send + Sync, - { - let mut client = TxServiceClient::connect(self.get_conn_url()?).await?; - - let tx_bytes = self.generate_raw_tx(msgs, None).await?; - #[allow(deprecated)] - let sim_req = tonic::Request::new(SimulateRequest { tx: None, tx_bytes }); - let mut sim_res = client - .simulate(sim_req) - .await - .map_err(ChainCommunicationError::from_other)? - .into_inner(); - - // apply gas adjustment - sim_res.gas_info.as_mut().map(|v| { - v.gas_used = (v.gas_used as f32 * DEFAULT_GAS_ADJUSTMENT) as u64; - v - }); - - Ok(sim_res) - } - - async fn generate_raw_tx(&self, msgs: I, gas_limit: Option) -> ChainResult> - where - I: IntoIterator + Send + Sync, - { - let signer = self.get_signer()?; - let account_info = self.account_query(signer.address.clone()).await?; - - let private_key = signer.signing_key()?; - let public_key = private_key.public_key(); - - let tx_body = tx::Body::new(msgs, "", 9000000u32); - let signer_info = SignerInfo::single_direct(Some(signer.public_key), account_info.sequence); - - let gas_limit: u64 = gas_limit.unwrap_or(U256::from(300000u64)).as_u64(); - - let auth_info = signer_info.auth_info(Fee::from_amount_and_gas( - Coin::new( - Amount::from((gas_limit as f32 * DEFAULT_GAS_PRICE) as u64), - self.conf.get_canonical_asset().as_str(), - )?, - gas_limit, - )); - - // signing - let sign_doc = SignDoc::new( - &tx_body, - &auth_info, - &self.conf.get_chain_id().parse()?, - account_info.account_number, - )?; - - let tx_signed = sign_doc.sign(&private_key)?; - - Ok(tx_signed.to_bytes()?) - } - async fn wasm_send(&self, payload: T, gas_limit: Option) -> ChainResult where T: Serialize + Send + Sync, { let signer = self.get_signer()?; - let mut client = TxServiceClient::connect(self.get_conn_url()?).await?; + let mut client = TxServiceClient::new(self.channel.clone()); let msgs = vec![MsgExecuteContract { - sender: signer.address, - contract: self.get_contract_addr()?, + sender: signer.address.clone(), + contract: self.contract_address.address(), msg: serde_json::to_string(&payload)?.as_bytes().to_vec(), funds: vec![], } .to_any() .map_err(ChainCommunicationError::from_other)?]; + // We often use U256s to represent gas limits, but Cosmos expects u64s. Try to convert, + // and if it fails, just fallback to None which will result in gas estimation. + let gas_limit: Option = gas_limit.and_then(|limit| match limit.try_into() { + Ok(limit) => Some(limit), + Err(err) => { + tracing::warn!( + ?err, + "failed to convert gas_limit to u64, falling back to estimation" + ); + None + } + }); + let tx_req = BroadcastTxRequest { - tx_bytes: self.generate_raw_tx(msgs, gas_limit).await?, + tx_bytes: self.generate_raw_signed_tx(msgs, gas_limit).await?, mode: BroadcastMode::Sync as i32, }; @@ -281,27 +332,26 @@ impl WasmProvider for WasmGrpcProvider { .into_inner() .tx_response .ok_or_else(|| ChainCommunicationError::from_other_str("Empty tx_response"))?; - if tx_res.code != 0 { - println!("TX_ERROR: {}", tx_res.raw_log); - } Ok(tx_res) } - async fn wasm_simulate(&self, payload: T) -> ChainResult + async fn wasm_estimate_gas(&self, payload: T) -> ChainResult where T: Serialize + Send + Sync, { + // Estimating gas requires a signer, which we can reasonably expect to have + // since we need one to send a tx with the estimated gas anyways. let signer = self.get_signer()?; let msg = MsgExecuteContract { - sender: signer.address, - contract: self.get_contract_addr()?, + sender: signer.address.clone(), + contract: self.contract_address.address(), msg: serde_json::to_string(&payload)?.as_bytes().to_vec(), funds: vec![], }; let response = self - .simulate_raw_tx(vec![msg + .estimate_gas(vec![msg .to_any() .map_err(ChainCommunicationError::from_other)?]) .await?; diff --git a/rust/chains/hyperlane-cosmos/src/routing_ism.rs b/rust/chains/hyperlane-cosmos/src/routing_ism.rs index dc0a8e1041..0a646c005b 100644 --- a/rust/chains/hyperlane-cosmos/src/routing_ism.rs +++ b/rust/chains/hyperlane-cosmos/src/routing_ism.rs @@ -27,14 +27,18 @@ pub struct CosmosRoutingIsm { impl CosmosRoutingIsm { /// create a new instance of CosmosRoutingIsm - pub fn new(conf: &ConnectionConf, locator: ContractLocator, signer: Option) -> Self { - let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer); + pub fn new( + conf: &ConnectionConf, + locator: ContractLocator, + signer: Option, + ) -> ChainResult { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer)?; - Self { + Ok(Self { domain: locator.domain.clone(), address: locator.address, provider: Box::new(provider), - } + }) } } diff --git a/rust/chains/hyperlane-cosmos/src/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/validator_announce.rs index aa39eee5b6..a5d9d2838b 100644 --- a/rust/chains/hyperlane-cosmos/src/validator_announce.rs +++ b/rust/chains/hyperlane-cosmos/src/validator_announce.rs @@ -2,9 +2,8 @@ use async_trait::async_trait; use cosmrs::proto::cosmos::base::abci::v1beta1::TxResponse; use hyperlane_core::{ - Announcement, ChainCommunicationError, ChainResult, ContractLocator, HyperlaneChain, - HyperlaneContract, HyperlaneDomain, HyperlaneProvider, SignedType, TxOutcome, - ValidatorAnnounce, H160, H256, U256, + Announcement, ChainResult, ContractLocator, HyperlaneChain, HyperlaneContract, HyperlaneDomain, + HyperlaneProvider, SignedType, TxOutcome, ValidatorAnnounce, H160, H256, U256, }; use crate::{ @@ -27,14 +26,18 @@ pub struct CosmosValidatorAnnounce { impl CosmosValidatorAnnounce { /// create a new instance of CosmosValidatorAnnounce - pub fn new(conf: ConnectionConf, locator: ContractLocator, signer: Option) -> Self { - let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer); - - Self { + pub fn new( + conf: ConnectionConf, + locator: ContractLocator, + signer: Option, + ) -> ChainResult { + let provider = WasmGrpcProvider::new(conf.clone(), locator.clone(), signer)?; + + Ok(Self { domain: locator.domain.clone(), address: locator.address, provider: Box::new(provider), - } + }) } } @@ -96,25 +99,9 @@ impl ValidatorAnnounce for CosmosValidatorAnnounce { }, }; - // Perform gas estimation if a limit wasn't already provided. - // TODO: refactor `wasm_send` to do this gas estimation automatically - // instead of using a default hardcoded value if the gas limit is `None`. - let tx_gas_limit = if let Some(gas_limit) = tx_gas_limit { - gas_limit - } else { - // A multiplier is applied already for us - self.provider - .wasm_simulate(announce_request.clone()) - .await? - .gas_info - .ok_or_else(|| ChainCommunicationError::from_other_str("gas info not present"))? - .gas_used - .into() - }; - let response: TxResponse = self .provider - .wasm_send(announce_request, Some(tx_gas_limit)) + .wasm_send(announce_request, tx_gas_limit) .await?; Ok(TxOutcome { diff --git a/rust/hyperlane-base/src/settings/chains.rs b/rust/hyperlane-base/src/settings/chains.rs index 88120f3f27..e1010d5fd8 100644 --- a/rust/hyperlane-base/src/settings/chains.rs +++ b/rust/hyperlane-base/src/settings/chains.rs @@ -146,11 +146,9 @@ impl ChainConf { } ChainConnectionConf::Cosmos(conf) => { let signer = self.cosmos_signer().await.context(ctx)?; - Ok(Box::new(h_cosmos::CosmosMailbox::new( - conf.clone(), - locator.clone(), - signer.clone(), - )) as Box) + h_cosmos::CosmosMailbox::new(conf.clone(), locator.clone(), signer.clone()) + .map(|m| Box::new(m) as Box) + .map_err(Into::into) } } .context(ctx) @@ -186,7 +184,7 @@ impl ChainConf { ChainConnectionConf::Cosmos(conf) => { let signer = self.cosmos_signer().await.context(ctx)?; let hook = - h_cosmos::CosmosMerkleTreeHook::new(conf.clone(), locator.clone(), signer); + h_cosmos::CosmosMerkleTreeHook::new(conf.clone(), locator.clone(), signer)?; Ok(Box::new(hook) as Box) } @@ -304,7 +302,7 @@ impl ChainConf { conf.clone(), locator.clone(), signer, - )); + )?); Ok(paymaster as Box) } } @@ -418,7 +416,7 @@ impl ChainConf { conf.clone(), locator.clone(), signer, - )); + )?); Ok(va as Box) } @@ -458,7 +456,7 @@ impl ChainConf { let signer = self.cosmos_signer().await.context(ctx)?; let ism = Box::new(h_cosmos::CosmosInterchainSecurityModule::new( conf, locator, signer, - )); + )?); Ok(ism as Box) } } @@ -492,7 +490,7 @@ impl ChainConf { conf.clone(), locator.clone(), signer, - )); + )?); Ok(ism as Box) } } @@ -526,7 +524,7 @@ impl ChainConf { &conf.clone(), locator.clone(), signer, - )); + )?); Ok(ism as Box) } } @@ -560,7 +558,7 @@ impl ChainConf { conf.clone(), locator.clone(), signer, - )); + )?); Ok(ism as Box) } From 3a55ff004500a222bede16857a618c915e3c1b2d Mon Sep 17 00:00:00 2001 From: ByeongSu Hong Date: Fri, 10 Nov 2023 23:37:38 +0700 Subject: [PATCH 136/142] fix: e2e working (#2908) --- rust/utils/run-locally/src/cosmos/deploy.rs | 2 +- rust/utils/run-locally/src/cosmos/mod.rs | 34 ++++++++++++++------- rust/utils/run-locally/src/cosmos/source.rs | 6 +++- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/rust/utils/run-locally/src/cosmos/deploy.rs b/rust/utils/run-locally/src/cosmos/deploy.rs index ba89b280b8..859f9f05dd 100644 --- a/rust/utils/run-locally/src/cosmos/deploy.rs +++ b/rust/utils/run-locally/src/cosmos/deploy.rs @@ -72,7 +72,7 @@ pub fn deploy_cw_hyperlane( owner: deployer_addr.clone(), gas_token: "uosmo".to_string(), beneficiary: deployer_addr.clone(), - default_gas_usage: "250000".to_string(), + default_gas_usage: "25000".to_string(), }, "hpl_igp", ); diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index 8afb6a4a77..75f97908e7 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -32,11 +32,8 @@ use cli::{OsmosisCLI, OsmosisEndpoint}; use self::deploy::deploy_cw_hyperlane; use self::source::{CLISource, CodeSource}; -// const OSMOSIS_CLI_GIT: &str = "https://github.com/osmosis-labs/osmosis"; -// const OSMOSIS_CLI_VERSION: &str = "19.0.0"; - -const OSMOSIS_CLI_GIT: &str = "https://github.com/hashableric/osmosis"; -const OSMOSIS_CLI_VERSION: &str = "19.0.0-mnts"; +const OSMOSIS_CLI_GIT: &str = "https://github.com/osmosis-labs/osmosis"; +const OSMOSIS_CLI_VERSION: &str = "19.0.0"; const KEY_HPL_VALIDATOR: (&str,&str) = ("hpl-validator", "guard evolve region sentence danger sort despair eye deputy brave trim actor left recipe debate document upgrade sustain bus cage afford half demand pigeon"); const KEY_HPL_RELAYER: (&str,&str) = ("hpl-relayer", "moral item damp melt gloom vendor notice head assume balance doctor retire fashion trim find biology saddle undo switch fault cattle toast drip empty"); @@ -249,6 +246,7 @@ fn launch_cosmos_validator( let validator = Program::default() .bin(validator_bin) + .working_dir("../../") .env("CONFIG_FILES", agent_config_path.to_str().unwrap()) .env( "MY_VALIDATOR_SIGNATURE_DIRECTORY", @@ -261,9 +259,11 @@ fn launch_cosmos_validator( .hyp_env("REORGPERIOD", "100") .hyp_env("DB", validator_base_db.to_str().unwrap()) .hyp_env("METRICS", agent_config.domain_id.to_string()) - .hyp_env("VALIDATOR_KEY", agent_config.signer.key) - .hyp_env("VALIDATOR_TYPE", agent_config.signer.typ) - .hyp_env("VALIDATOR_PREFIX", "osmo1") + .hyp_env("VALIDATOR_SIGNER_TYPE", agent_config.signer.typ) + .hyp_env("VALIDATOR_KEY", agent_config.signer.key.clone()) + .hyp_env("VALIDATOR_PREFIX", "osmo") + .hyp_env("SIGNER_SIGNER_TYPE", "hexKey") + .hyp_env("SIGNER_KEY", agent_config.signer.key) .hyp_env("TRACING_LEVEL", if debug { "debug" } else { "info" }) .spawn("VAL"); @@ -281,6 +281,7 @@ fn launch_cosmos_relayer( let relayer = Program::default() .bin(relayer_bin) + .working_dir("../../") .env("CONFIG_FILES", agent_config_path.to_str().unwrap()) .env("RUST_BACKTRACE", "1") .hyp_env("RELAYCHAINS", relay_chains.join(",")) @@ -301,6 +302,19 @@ const ENV_CW_HYPERLANE_PATH_KEY: &str = "E2E_CW_HYPERLANE_PATH"; fn run_locally() { let debug = false; + log!("Building rust..."); + Program::new("cargo") + .cmd("build") + .working_dir("../../") + .arg("features", "test-utils") + .arg("bin", "relayer") + .arg("bin", "validator") + .arg("bin", "scraper") + .arg("bin", "init-db") + .filter_logs(|l| !l.contains("workspace-inheritance")) + .run() + .join(); + let cli_src = Some( env::var(ENV_CLI_PATH_KEY) .as_ref() @@ -438,8 +452,6 @@ fn run_locally() { debug, ); - sleep(Duration::from_secs(10)); // wait for 10 seconds - // dispatch messages for node in nodes.iter() { @@ -492,7 +504,7 @@ fn run_locally() { relayer: hpl_rly.join(), }; - sleep(Duration::from_secs(1000)); // wait for a long time + sleep(Duration::from_secs(20)); // wait for a long time } #[cfg(test)] diff --git a/rust/utils/run-locally/src/cosmos/source.rs b/rust/utils/run-locally/src/cosmos/source.rs index 6aada599f0..655e3b48ac 100644 --- a/rust/utils/run-locally/src/cosmos/source.rs +++ b/rust/utils/run-locally/src/cosmos/source.rs @@ -102,7 +102,11 @@ pub enum CLISource { impl Default for CLISource { fn default() -> Self { - Self::remote(OSMOSIS_CLI_GIT, OSMOSIS_CLI_VERSION) + if make_target().starts_with("darwin") { + Self::remote("https://github.com/hashableric/osmosis", "19.0.0-mnts") + } else { + Self::remote(OSMOSIS_CLI_GIT, OSMOSIS_CLI_VERSION) + } } } From 5d2ee001471d9b5b071c943137181b062ea3b32a Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Wed, 15 Nov 2023 13:36:43 +0000 Subject: [PATCH 137/142] chore: use larger runner for github actions (#2909) Size of rust build exceeds the storage space in the `ubuntu-latest` runner. `larger-runner` has more storage, but let's see if it also has all the system dependencies required to build --- .github/workflows/agent-release-artifacts.yml | 2 +- .github/workflows/e2e.yml | 7 ++++--- .github/workflows/mergify.yml.bak | 6 +++--- .github/workflows/monorepo-docker.yml | 4 ++-- .github/workflows/node.yml | 14 +++++++------- .github/workflows/rust-docker.yml | 4 ++-- .github/workflows/rust-skipped.yml | 4 ++-- .github/workflows/rust.yml | 4 ++-- rust/utils/run-locally/src/cosmos/mod.rs | 2 +- rust/utils/run-locally/src/cosmos/utils.rs | 4 +++- 10 files changed, 27 insertions(+), 24 deletions(-) diff --git a/.github/workflows/agent-release-artifacts.yml b/.github/workflows/agent-release-artifacts.yml index 76b782f5e1..d2f61e6322 100644 --- a/.github/workflows/agent-release-artifacts.yml +++ b/.github/workflows/agent-release-artifacts.yml @@ -16,7 +16,7 @@ env: jobs: prepare: - runs-on: ubuntu-latest + runs-on: larger-runner outputs: tag_date: ${{ steps.taggen.outputs.TAG_DATE }} tag_sha: ${{ steps.taggen.outputs.TAG_SHA }} diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 7091183146..9481b2d145 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -4,7 +4,6 @@ on: push: branches: [main] pull_request: - branches: '*' workflow_dispatch: concurrency: @@ -21,7 +20,7 @@ defaults: jobs: e2e: - runs-on: ubuntu-latest + runs-on: larger-runner steps: - uses: actions/setup-node@v3 with: @@ -68,7 +67,9 @@ jobs: key: ${{ runner.os }}-yarn-cache-${{ hashFiles('./yarn.lock') }} - name: build test run: cargo build --release --bin run-locally - - name: run test + - name: run CosmWasm test + run: RUST_BACKTRACE=1 cargo test --package run-locally --bin run-locally -- cosmos::test --nocapture + - name: run test (excluding CosmWasm) run: ./target/release/run-locally env: E2E_CI_MODE: 'true' diff --git a/.github/workflows/mergify.yml.bak b/.github/workflows/mergify.yml.bak index 3cde1aee3c..2adc55518f 100644 --- a/.github/workflows/mergify.yml.bak +++ b/.github/workflows/mergify.yml.bak @@ -24,7 +24,7 @@ on: jobs: automerge: - runs-on: ubuntu-latest + runs-on: larger-runner steps: - name: automerge @@ -38,7 +38,7 @@ jobs: # in rust.yml complete: - runs-on: ubuntu-latest + runs-on: larger-runner needs: [build, test, lint] steps: @@ -52,7 +52,7 @@ jobs: # in solidity.yml complete: - runs-on: ubuntu-latest + runs-on: larger-runner needs: [install, lint, test] steps: diff --git a/.github/workflows/monorepo-docker.yml b/.github/workflows/monorepo-docker.yml index 9952c3507e..af71889120 100644 --- a/.github/workflows/monorepo-docker.yml +++ b/.github/workflows/monorepo-docker.yml @@ -13,7 +13,7 @@ concurrency: cancel-in-progress: true jobs: check-env: - runs-on: ubuntu-latest + runs-on: larger-runner # assign output from step to job output outputs: gcloud-service-key: ${{ steps.gcloud-service-key.outputs.defined }} @@ -27,7 +27,7 @@ jobs: run: echo "::set-output name=defined::true" build-and-push-to-gcr: - runs-on: ubuntu-latest + runs-on: larger-runner # uses check-env to determine if secrets.GCLOUD_SERVICE_KEY is defined needs: [check-env] diff --git a/.github/workflows/node.yml b/.github/workflows/node.yml index e4f51e9ff1..bab2278fdc 100644 --- a/.github/workflows/node.yml +++ b/.github/workflows/node.yml @@ -14,7 +14,7 @@ env: jobs: yarn-install: - runs-on: ubuntu-latest + runs-on: larger-runner steps: - uses: actions/checkout@v3 with: @@ -39,7 +39,7 @@ jobs: fi yarn-build: - runs-on: ubuntu-latest + runs-on: larger-runner needs: [yarn-install] steps: - uses: actions/checkout@v3 @@ -70,7 +70,7 @@ jobs: run: yarn build lint-prettier: - runs-on: ubuntu-latest + runs-on: larger-runner needs: [yarn-install] steps: - uses: actions/checkout@v3 @@ -94,7 +94,7 @@ jobs: fi test-ts: - runs-on: ubuntu-latest + runs-on: larger-runner needs: [yarn-build] steps: - uses: actions/checkout@v3 @@ -116,7 +116,7 @@ jobs: run: yarn workspace @hyperlane-xyz/infra run test # test-env: - # runs-on: ubuntu-latest + # runs-on: larger-runner # needs: [yarn-build] # strategy: # matrix: @@ -140,7 +140,7 @@ jobs: env: ETHERSCAN_API_KEY: '' - runs-on: ubuntu-latest + runs-on: larger-runner needs: [yarn-build] steps: @@ -189,7 +189,7 @@ jobs: sarif_file: ${{ steps.slither.outputs.sarif }} coverage-sol: - runs-on: ubuntu-latest + runs-on: larger-runner needs: [yarn-build] steps: diff --git a/.github/workflows/rust-docker.yml b/.github/workflows/rust-docker.yml index 7c75426f97..4c64a7cb1c 100644 --- a/.github/workflows/rust-docker.yml +++ b/.github/workflows/rust-docker.yml @@ -12,7 +12,7 @@ concurrency: cancel-in-progress: true jobs: check-env: - runs-on: ubuntu-latest + runs-on: larger-runner # assign output from step to job output outputs: gcloud-service-key: ${{ steps.gcloud-service-key.outputs.defined }} @@ -26,7 +26,7 @@ jobs: run: echo "::set-output name=defined::true" build-and-push-to-gcr: - runs-on: ubuntu-latest + runs-on: larger-runner # uses check-env to determine if secrets.GCLOUD_SERVICE_KEY is defined needs: [check-env] diff --git a/.github/workflows/rust-skipped.yml b/.github/workflows/rust-skipped.yml index bd2669ac17..9a8d0e07ed 100644 --- a/.github/workflows/rust-skipped.yml +++ b/.github/workflows/rust-skipped.yml @@ -12,13 +12,13 @@ env: jobs: test-rs: - runs-on: ubuntu-latest + runs-on: larger-runner steps: - run: 'echo "No test required" ' lint-rs: - runs-on: ubuntu-latest + runs-on: larger-runner steps: - run: 'echo "No lint required" ' diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 0546f86913..ebb5623de5 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -25,7 +25,7 @@ defaults: jobs: test-rs: - runs-on: ubuntu-latest + runs-on: larger-runner steps: - uses: actions/checkout@v3 @@ -51,7 +51,7 @@ jobs: run: cargo test lint-rs: - runs-on: ubuntu-latest + runs-on: larger-runner steps: - uses: actions/checkout@v3 diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index 75f97908e7..3bdf82f20b 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -504,7 +504,7 @@ fn run_locally() { relayer: hpl_rly.join(), }; - sleep(Duration::from_secs(20)); // wait for a long time + sleep(Duration::from_secs(100)); // wait for a long time } #[cfg(test)] diff --git a/rust/utils/run-locally/src/cosmos/utils.rs b/rust/utils/run-locally/src/cosmos/utils.rs index c6cc7b5cca..759038d09d 100644 --- a/rust/utils/run-locally/src/cosmos/utils.rs +++ b/rust/utils/run-locally/src/cosmos/utils.rs @@ -8,7 +8,9 @@ use crate::utils::TaskHandle; pub(crate) fn sed(from: &str, to: &str, file: &str) { Program::new("sed") .raw_arg("-i") - .cmd("") + // Temporary fix to get `sed` working on linux + // Note that this breaks the script on mac + // .cmd("") .cmd(format!("s/{from}/{to}/g")) .cmd(file) .run() From 1ce01d373797cfa52cedeec4a69cdc6be4a52357 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Wed, 15 Nov 2023 15:01:26 +0000 Subject: [PATCH 138/142] Add cw run-locally invariants (#2919) Adds "gas payment count" and "confirmed submitted messages" as termination invariants to the cw run-locally, to get the test to actually fail if messages are not delivered --- rust/chains/hyperlane-cosmos/src/mailbox.rs | 2 +- rust/utils/run-locally/src/cosmos/mod.rs | 74 ++++++++++++++++++++- 2 files changed, 72 insertions(+), 4 deletions(-) diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index f4098417a9..6fd36cc655 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -253,7 +253,7 @@ impl CosmosMailboxIndexer { /// The message dispatch event type from the CW contract. const MESSAGE_DISPATCH_EVENT_TYPE: &str = "mailbox_dispatch"; - /// Create a reference to a mailbox at a specific Ethereum address on some + /// Create a reference to a mailbox at a specific Cosmos address on some /// chain pub fn new( conf: ConnectionConf, diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index 3bdf82f20b..01e3864edc 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -1,12 +1,13 @@ use std::collections::BTreeMap; use std::path::{Path, PathBuf}; use std::thread::sleep; -use std::time::Duration; +use std::time::{Duration, Instant}; use std::{env, fs}; use cosmwasm_schema::cw_serde; use hpl_interface::types::bech32_decode; use macro_rules_attribute::apply; +use maplit::hashmap; use tempfile::tempdir; mod cli; @@ -26,7 +27,7 @@ use crate::cosmos::link::link_networks; use crate::logging::log; use crate::program::Program; use crate::utils::{as_task, concat_path, stop_child, AgentHandles, TaskHandle}; -use crate::AGENT_BIN_PATH; +use crate::{fetch_metric, AGENT_BIN_PATH}; use cli::{OsmosisCLI, OsmosisEndpoint}; use self::deploy::deploy_cw_hyperlane; @@ -290,6 +291,7 @@ fn launch_cosmos_relayer( .hyp_env("ALLOWLOCALCHECKPOINTSYNCERS", "true") .hyp_env("TRACING_LEVEL", if debug { "debug" } else { "info" }) .hyp_env("GASPAYMENTENFORCEMENT", "[{\"type\": \"none\"}]") + .hyp_env("METRICSPORT", 9093.to_string()) .spawn("RLY"); relayer @@ -300,6 +302,7 @@ const ENV_CW_HYPERLANE_PATH_KEY: &str = "E2E_CW_HYPERLANE_PATH"; #[allow(dead_code)] fn run_locally() { + const TIMEOUT_SECS: u64 = 60 * 10; let debug = false; log!("Building rust..."); @@ -453,6 +456,7 @@ fn run_locally() { ); // dispatch messages + let mut dispatched_messages = 0; for node in nodes.iter() { let targets = nodes @@ -469,6 +473,7 @@ fn run_locally() { } for target in targets { + dispatched_messages += 1; let cli = OsmosisCLI::new( osmosisd.clone(), node.launch_resp.home_path.to_str().unwrap(), @@ -504,7 +509,70 @@ fn run_locally() { relayer: hpl_rly.join(), }; - sleep(Duration::from_secs(100)); // wait for a long time + // Mostly copy-pasta from `rust/utils/run-locally/src/main.rs` + // TODO: refactor to share code + let loop_start = Instant::now(); + // give things a chance to fully start. + sleep(Duration::from_secs(5)); + let mut failure_occurred = false; + loop { + // look for the end condition. + if termination_invariants_met(dispatched_messages).unwrap_or(false) { + // end condition reached successfully + break; + } else if (Instant::now() - loop_start).as_secs() > TIMEOUT_SECS { + // we ran out of time + log!("timeout reached before message submission was confirmed"); + failure_occurred = true; + break; + } + + sleep(Duration::from_secs(5)); + } + + if failure_occurred { + panic!("E2E tests failed"); + } else { + log!("E2E tests passed"); + } +} + +fn termination_invariants_met(messages_expected: u32) -> eyre::Result { + let gas_payments_scraped = fetch_metric( + "9093", + "hyperlane_contract_sync_stored_events", + &hashmap! {"data_type" => "gas_payment"}, + )? + .iter() + .sum::(); + let expected_gas_payments = messages_expected; + if gas_payments_scraped != expected_gas_payments { + log!( + "Scraper has scraped {} gas payments, expected {}", + gas_payments_scraped, + expected_gas_payments + ); + return Ok(false); + } + + let delivered_messages_scraped = fetch_metric( + "9093", + "hyperlane_operations_processed_count", + &hashmap! {"phase" => "confirmed"}, + )? + .iter() + .sum::(); + if delivered_messages_scraped != messages_expected { + log!( + "Relayer confirmed {} submitted messages, expected {}", + delivered_messages_scraped, + messages_expected + ); + return Ok(false); + } + + log!("Termination invariants have been meet"); + Ok(true) } #[cfg(test)] From 3987688394453491e1f07528c07922d8d9d255ef Mon Sep 17 00:00:00 2001 From: ByeongSu Hong Date: Mon, 20 Nov 2023 23:46:46 +0700 Subject: [PATCH 139/142] fix: use metricsport (#2925) ### Description ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- rust/utils/run-locally/src/cosmos/mod.rs | 2 +- rust/utils/run-locally/src/cosmos/utils.rs | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/rust/utils/run-locally/src/cosmos/mod.rs b/rust/utils/run-locally/src/cosmos/mod.rs index 01e3864edc..4a25053027 100644 --- a/rust/utils/run-locally/src/cosmos/mod.rs +++ b/rust/utils/run-locally/src/cosmos/mod.rs @@ -259,7 +259,7 @@ fn launch_cosmos_validator( .hyp_env("ORIGINCHAINNAME", agent_config.name) .hyp_env("REORGPERIOD", "100") .hyp_env("DB", validator_base_db.to_str().unwrap()) - .hyp_env("METRICS", agent_config.domain_id.to_string()) + .hyp_env("METRICSPORT", agent_config.domain_id.to_string()) .hyp_env("VALIDATOR_SIGNER_TYPE", agent_config.signer.typ) .hyp_env("VALIDATOR_KEY", agent_config.signer.key.clone()) .hyp_env("VALIDATOR_PREFIX", "osmo") diff --git a/rust/utils/run-locally/src/cosmos/utils.rs b/rust/utils/run-locally/src/cosmos/utils.rs index 759038d09d..07800b3c8f 100644 --- a/rust/utils/run-locally/src/cosmos/utils.rs +++ b/rust/utils/run-locally/src/cosmos/utils.rs @@ -6,15 +6,17 @@ use crate::program::Program; use crate::utils::TaskHandle; pub(crate) fn sed(from: &str, to: &str, file: &str) { - Program::new("sed") - .raw_arg("-i") - // Temporary fix to get `sed` working on linux - // Note that this breaks the script on mac - // .cmd("") + let mut program = Program::new("sed").raw_arg("-i"); + + if cfg!(target_os = "macos") { + program = program.cmd(""); + } + + program .cmd(format!("s/{from}/{to}/g")) .cmd(file) .run() - .join(); + .join() } pub(crate) fn untar(output: &str, dir: &str) { From 5a9cd844dde0b54b35cb3ddd70a0c52a1818c6d7 Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Tue, 21 Nov 2023 12:10:54 +0000 Subject: [PATCH 140/142] Dan/more cw agent remediations (#2912) ### Description ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- .gitignore | 3 - rust/Cargo.lock | 27 +-- rust/Cargo.toml | 207 +++++++++--------- rust/chains/hyperlane-cosmos/Cargo.toml | 28 +-- rust/chains/hyperlane-cosmos/src/mailbox.rs | 8 +- .../src/payloads/ism_routes.rs | 2 +- rust/chains/hyperlane-cosmos/src/types.rs | 22 +- .../src/validator_announce.rs | 7 +- rust/chains/hyperlane-ethereum/Cargo.toml | 6 - rust/chains/hyperlane-fuel/Cargo.toml | 6 - rust/hyperlane-base/Cargo.toml | 1 + .../src/settings/parser/connection_parser.rs | 127 +++++++++++ .../hyperlane-base/src/settings/parser/mod.rs | 113 +--------- rust/hyperlane-base/src/settings/signers.rs | 54 +++-- rust/hyperlane-core/src/traits/mod.rs | 17 ++ 15 files changed, 315 insertions(+), 313 deletions(-) create mode 100644 rust/hyperlane-base/src/settings/parser/connection_parser.rs diff --git a/.gitignore b/.gitignore index 175e312900..f9892417af 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,3 @@ yarn-error.log .vscode tsconfig.editor.json - -rust/neutron_validator_sigs -rust/relayer_db \ No newline at end of file diff --git a/rust/Cargo.lock b/rust/Cargo.lock index f4a829246c..b8eb2e6580 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -3872,28 +3872,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "hpl-interface" -version = "0.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ce374f1f3bf048eacfff71e74ecf4700ef4e6d26085c9b3d89f5bb19bdf1ff5" -dependencies = [ - "bech32 0.9.1", - "cosmwasm-schema", - "cosmwasm-std", - "cosmwasm-storage", - "cw-storage-plus", - "cw2", - "cw20", - "cw20-base", - "ripemd", - "schemars", - "serde", - "sha2 0.10.8", - "sha3 0.10.8", - "thiserror", -] - [[package]] name = "hpl-interface" version = "0.0.6-rc3" @@ -4099,6 +4077,7 @@ dependencies = [ "tracing-error", "tracing-futures", "tracing-subscriber", + "url", "walkdir", "warp", ] @@ -4157,7 +4136,7 @@ dependencies = [ "cosmrs", "derive-new", "hex 0.4.3", - "hpl-interface 0.0.2", + "hpl-interface", "hyper", "hyper-tls", "hyperlane-core", @@ -6922,7 +6901,7 @@ dependencies = [ "ctrlc", "eyre", "hex 0.4.3", - "hpl-interface 0.0.6-rc3", + "hpl-interface", "hyperlane-core", "k256 0.13.1", "macro_rules_attribute", diff --git a/rust/Cargo.toml b/rust/Cargo.toml index d9d2534752..c1ee840430 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -1,43 +1,43 @@ [workspace] members = [ - "agents/relayer", - "agents/scraper", - "agents/validator", - "chains/hyperlane-cosmos", - "chains/hyperlane-ethereum", - "chains/hyperlane-fuel", - "chains/hyperlane-sealevel", - "ethers-prometheus", - "hyperlane-base", - "hyperlane-core", - "hyperlane-test", - "sealevel/client", - "sealevel/libraries/access-control", - "sealevel/libraries/account-utils", - "sealevel/libraries/ecdsa-signature", - "sealevel/libraries/hyperlane-sealevel-connection-client", - "sealevel/libraries/hyperlane-sealevel-token", - "sealevel/libraries/interchain-security-module-interface", - "sealevel/libraries/message-recipient-interface", - "sealevel/libraries/multisig-ism", - "sealevel/libraries/serializable-account-meta", - "sealevel/libraries/test-transaction-utils", - "sealevel/libraries/test-utils", - "sealevel/programs/hyperlane-sealevel-token", - "sealevel/programs/hyperlane-sealevel-token-collateral", - "sealevel/programs/hyperlane-sealevel-token-native", - "sealevel/programs/hyperlane-sealevel-igp", - "sealevel/programs/hyperlane-sealevel-igp-test", - "sealevel/programs/ism/multisig-ism-message-id", - "sealevel/programs/ism/test-ism", - "sealevel/programs/mailbox", - "sealevel/programs/mailbox-test", - "sealevel/programs/test-send-receiver", - "sealevel/programs/validator-announce", - "utils/abigen", - "utils/backtrace-oneline", - "utils/hex", - "utils/run-locally", + "agents/relayer", + "agents/scraper", + "agents/validator", + "chains/hyperlane-cosmos", + "chains/hyperlane-ethereum", + "chains/hyperlane-fuel", + "chains/hyperlane-sealevel", + "ethers-prometheus", + "hyperlane-base", + "hyperlane-core", + "hyperlane-test", + "sealevel/client", + "sealevel/libraries/access-control", + "sealevel/libraries/account-utils", + "sealevel/libraries/ecdsa-signature", + "sealevel/libraries/hyperlane-sealevel-connection-client", + "sealevel/libraries/hyperlane-sealevel-token", + "sealevel/libraries/interchain-security-module-interface", + "sealevel/libraries/message-recipient-interface", + "sealevel/libraries/multisig-ism", + "sealevel/libraries/serializable-account-meta", + "sealevel/libraries/test-transaction-utils", + "sealevel/libraries/test-utils", + "sealevel/programs/hyperlane-sealevel-igp", + "sealevel/programs/hyperlane-sealevel-igp-test", + "sealevel/programs/hyperlane-sealevel-token", + "sealevel/programs/hyperlane-sealevel-token-collateral", + "sealevel/programs/hyperlane-sealevel-token-native", + "sealevel/programs/ism/multisig-ism-message-id", + "sealevel/programs/ism/test-ism", + "sealevel/programs/mailbox", + "sealevel/programs/mailbox-test", + "sealevel/programs/test-send-receiver", + "sealevel/programs/validator-announce", + "utils/abigen", + "utils/backtrace-oneline", + "utils/hex", + "utils/run-locally", ] [workspace.package] @@ -62,13 +62,13 @@ bytes = "1" clap = "4" color-eyre = "0.6" config = "0.13.3" +convert_case = "0.6" cosmrs = { version = "0.14", default-features = false, features = [ - "cosmwasm", - "rpc", - "tokio", - "grpc", + "cosmwasm", + "rpc", + "tokio", + "grpc", ] } -convert_case = "0.6" crunchy = "0.2" ctrlc = "3.2" curve25519-dalek = { version = "~3.2", features = ["serde"] } @@ -84,9 +84,14 @@ fuels-code-gen = "0.38" futures = "0.3" futures-util = "0.3" generic-array = { version = "0.14", features = ["serde", "more_lengths"] } -getrandom = { version = "0.2", features = [ - "js", -] } # Required for WASM support https://docs.rs/getrandom/latest/getrandom/#webassembly-support +# Required for WASM support https://docs.rs/getrandom/latest/getrandom/#webassembly-support +bech32 = "0.9.1" +elliptic-curve = "0.12.3" +getrandom = { version = "0.2", features = ["js"] } +hex = "0.4.3" +hpl-interface = "=0.0.6-rc3" +hyper = "0.14" +hyper-tls = "0.5.0" itertools = "0.11.0" jsonrpc-core = "18.0" k256 = { version = "0.13.1", features = ["std", "ecdsa"] } @@ -107,24 +112,27 @@ primitive-types = "=0.12.1" prometheus = "0.13" regex = "1.5" reqwest = "0.11" +ripemd = "0.1.3" rlp = "=0.5.2" rocksdb = "0.21.0" sea-orm = { version = "0.11.1", features = [ - "sqlx-postgres", - "runtime-tokio-native-tls", - "with-bigdecimal", - "with-time", - "macros", + "sqlx-postgres", + "runtime-tokio-native-tls", + "with-bigdecimal", + "with-time", + "macros", ] } sea-orm-migration = { version = "0.11.1", features = [ - "sqlx-postgres", - "runtime-tokio-native-tls", + "sqlx-postgres", + "runtime-tokio-native-tls", ] } semver = "1.0" serde = { version = "1.0", features = ["derive"] } serde_bytes = "0.11" serde_derive = "1.0" serde_json = "1.0" +sha2 = { version = "0.10.6", default-features = false } +sha256 = "1.1.4" sha3 = "0.10" solana-account-decoder = "=1.14.13" solana-banks-client = "=1.14.13" @@ -139,7 +147,7 @@ solana-sdk = "=1.14.13" solana-transaction-status = "=1.14.13" solana-zk-token-sdk = "=1.14.13" spl-associated-token-account = { version = "=1.1.2", features = [ - "no-entrypoint", + "no-entrypoint", ] } spl-noop = { version = "=0.1.3", features = ["no-entrypoint"] } spl-token = { version = "=3.5.0", features = ["no-entrypoint"] } @@ -150,12 +158,14 @@ strum = "0.25.0" strum_macros = "0.25.2" tempfile = "3.3" tendermint = "0.32.2" +tendermint-rpc = { version = "0.32.0", features = ["http-client", "tokio"] } thiserror = "1.0" time = "0.3" tiny-keccak = "2.0.2" -toml_edit = "0.19.14" tokio = { version = "1", features = ["parking_lot"] } tokio-test = "0.4" +toml_edit = "0.19.14" +tonic = "0.9.2" tracing = { version = "0.1", features = ["release_max_level_debug"] } tracing-error = "0.2" tracing-futures = "0.2" @@ -166,159 +176,146 @@ url = "2.3" walkdir = "2" warp = "0.3" which = "4.3" -sha256 = "1.1.4" -bech32 = "0.9.1" -tonic = "0.9.2" -sha2 = { version = "0.10.6", default-features = false } -ripemd = "0.1.3" -hyper = "0.14" -hyper-tls = "0.5.0" -hex = "0.4.3" -tendermint-rpc = { version = "0.32.0", features = ["http-client", "tokio"] } -hpl-interface = "=0.0.6-rc3" -elliptic-curve = "0.12.3" ## TODO: remove this cosmwasm-schema = "1.2.7" - [workspace.dependencies.ethers] +features = [] git = "https://github.com/hyperlane-xyz/ethers-rs" tag = "2023-06-01" -features = [] [workspace.dependencies.ethers-contract] +features = ["legacy"] git = "https://github.com/hyperlane-xyz/ethers-rs" tag = "2023-06-01" -features = ["legacy"] [workspace.dependencies.ethers-core] +features = [] git = "https://github.com/hyperlane-xyz/ethers-rs" tag = "2023-06-01" -features = [] [workspace.dependencies.ethers-providers] +features = [] git = "https://github.com/hyperlane-xyz/ethers-rs" tag = "2023-06-01" -features = [] [workspace.dependencies.ethers-signers] +features = ["aws"] git = "https://github.com/hyperlane-xyz/ethers-rs" tag = "2023-06-01" -features = ["aws"] [patch.crates-io.curve25519-dalek] -version = "3.2.2" -git = "https://github.com/Eclipse-Laboratories-Inc/curve25519-dalek" branch = "v3.2.2-relax-zeroize" +git = "https://github.com/Eclipse-Laboratories-Inc/curve25519-dalek" +version = "3.2.2" [patch.crates-io.ed25519-dalek] -version = "1.0.1" -git = "https://github.com/Eclipse-Laboratories-Inc/ed25519-dalek" branch = "main" +git = "https://github.com/Eclipse-Laboratories-Inc/ed25519-dalek" +version = "1.0.1" [patch.crates-io.primitive-types] -version = "=0.12.1" -git = "https://github.com/hyperlane-xyz/parity-common.git" branch = "hyperlane" +git = "https://github.com/hyperlane-xyz/parity-common.git" +version = "=0.12.1" [patch.crates-io.rlp] -version = "=0.5.2" -git = "https://github.com/hyperlane-xyz/parity-common.git" branch = "hyperlane" +git = "https://github.com/hyperlane-xyz/parity-common.git" +version = "=0.5.2" [patch.crates-io.solana-account-decoder] -version = "=1.14.13" git = "https://github.com/hyperlane-xyz/solana.git" tag = "hyperlane-1.14.13-2023-07-04" +version = "=1.14.13" [patch.crates-io.solana-banks-client] -version = "=1.14.13" git = "https://github.com/hyperlane-xyz/solana.git" tag = "hyperlane-1.14.13-2023-07-04" +version = "=1.14.13" [patch.crates-io.solana-banks-interface] -version = "=1.14.13" git = "https://github.com/hyperlane-xyz/solana.git" tag = "hyperlane-1.14.13-2023-07-04" +version = "=1.14.13" [patch.crates-io.solana-banks-server] -version = "=1.14.13" git = "https://github.com/hyperlane-xyz/solana.git" tag = "hyperlane-1.14.13-2023-07-04" +version = "=1.14.13" [patch.crates-io.solana-clap-utils] -version = "=1.14.13" git = "https://github.com/hyperlane-xyz/solana.git" tag = "hyperlane-1.14.13-2023-07-04" +version = "=1.14.13" [patch.crates-io.solana-cli-config] -version = "=1.14.13" git = "https://github.com/hyperlane-xyz/solana.git" tag = "hyperlane-1.14.13-2023-07-04" +version = "=1.14.13" [patch.crates-io.solana-client] -version = "=1.14.13" git = "https://github.com/hyperlane-xyz/solana.git" tag = "hyperlane-1.14.13-2023-07-04" +version = "=1.14.13" [patch.crates-io.solana-program] -version = "=1.14.13" git = "https://github.com/hyperlane-xyz/solana.git" tag = "hyperlane-1.14.13-2023-07-04" +version = "=1.14.13" [patch.crates-io.solana-program-test] -version = "=1.14.13" git = "https://github.com/hyperlane-xyz/solana.git" tag = "hyperlane-1.14.13-2023-07-04" +version = "=1.14.13" [patch.crates-io.solana-sdk] -version = "=1.14.13" git = "https://github.com/hyperlane-xyz/solana.git" tag = "hyperlane-1.14.13-2023-07-04" +version = "=1.14.13" [patch.crates-io.solana-transaction-status] -version = "=1.14.13" git = "https://github.com/hyperlane-xyz/solana.git" tag = "hyperlane-1.14.13-2023-07-04" +version = "=1.14.13" [patch.crates-io.solana-zk-token-sdk] -version = "=1.14.13" git = "https://github.com/hyperlane-xyz/solana.git" tag = "hyperlane-1.14.13-2023-07-04" +version = "=1.14.13" [patch.crates-io.spl-associated-token-account] -version = "=1.1.2" -git = "https://github.com/hyperlane-xyz/solana-program-library.git" branch = "hyperlane" +git = "https://github.com/hyperlane-xyz/solana-program-library.git" +version = "=1.1.2" [patch.crates-io.spl-noop] -version = "=0.1.3" -git = "https://github.com/hyperlane-xyz/solana-program-library.git" branch = "hyperlane" +git = "https://github.com/hyperlane-xyz/solana-program-library.git" +version = "=0.1.3" [patch.crates-io.spl-token] -version = "=3.5.0" -git = "https://github.com/hyperlane-xyz/solana-program-library.git" branch = "hyperlane" +git = "https://github.com/hyperlane-xyz/solana-program-library.git" +version = "=3.5.0" [patch.crates-io.spl-token-2022] -version = "=0.5.0" -git = "https://github.com/hyperlane-xyz/solana-program-library.git" branch = "hyperlane" +git = "https://github.com/hyperlane-xyz/solana-program-library.git" +version = "=0.5.0" [patch.crates-io.spl-type-length-value] version = "=0.1.0" - git = "https://github.com/hyperlane-xyz/solana-program-library.git" branch = "hyperlane" [patch.crates-io.tendermint] -version = "=0.32.2" -git = "https://github.com/hyperlane-xyz/tendermint-rs.git" branch = "trevor/0.32.2-fork" +git = "https://github.com/hyperlane-xyz/tendermint-rs.git" +version = "=0.32.2" [patch.crates-io.tendermint-rpc] -version = "=0.32.2" -git = "https://github.com/hyperlane-xyz/tendermint-rs.git" branch = "trevor/0.32.2-fork" +git = "https://github.com/hyperlane-xyz/tendermint-rs.git" +version = "=0.32.2" diff --git a/rust/chains/hyperlane-cosmos/Cargo.toml b/rust/chains/hyperlane-cosmos/Cargo.toml index e3ff363ae9..59bf545d54 100644 --- a/rust/chains/hyperlane-cosmos/Cargo.toml +++ b/rust/chains/hyperlane-cosmos/Cargo.toml @@ -9,26 +9,26 @@ version = { workspace = true } [dependencies] async-trait = { workspace = true } +base64 = { workspace = true } +bech32 = { workspace = true } cosmrs = { workspace = true, features = ["cosmwasm", "tokio", "grpc", "rpc"] } derive-new = { workspace = true } +hex = { workspace = true } +hpl-interface.workspace = true +hyper = { workspace = true } +hyper-tls = { workspace = true } +once_cell = { workspace = true } +ripemd = { workspace = true } serde = { workspace = true } +serde_json = { workspace = true } +sha2 = { workspace = true } +sha256 = { workspace = true } +tendermint = { workspace = true, features = ["rust-crypto", "secp256k1"] } thiserror = { workspace = true } tokio = { workspace = true } -tracing-futures = { workspace = true } +tonic = { workspace = true } tracing = { workspace = true } +tracing-futures = { workspace = true } url = { workspace = true } -bech32 = { workspace = true } -base64 = { workspace = true } -serde_json = { workspace = true } -once_cell = { workspace = true } -tonic = { workspace = true } -sha2 = { workspace = true } -ripemd = { workspace = true } -hyper = { workspace = true } -hyper-tls = { workspace = true } -sha256 = { workspace = true } -hex = { workspace = true } -tendermint = { workspace = true, features = ["rust-crypto", "secp256k1"]} -hpl-interface = { version = "0.0.2" } hyperlane-core = { path = "../../hyperlane-core" } diff --git a/rust/chains/hyperlane-cosmos/src/mailbox.rs b/rust/chains/hyperlane-cosmos/src/mailbox.rs index 6fd36cc655..657cf0a980 100644 --- a/rust/chains/hyperlane-cosmos/src/mailbox.rs +++ b/rust/chains/hyperlane-cosmos/src/mailbox.rs @@ -181,12 +181,8 @@ impl Mailbox for CosmosMailbox { .provider .wasm_send(process_message, tx_gas_limit) .await?; - Ok(TxOutcome { - transaction_id: H256::from_slice(hex::decode(response.txhash)?.as_slice()).into(), - executed: response.code == 0, - gas_used: U256::from(response.gas_used), - gas_price: U256::from(response.gas_wanted), - }) + + Ok(response.try_into()?) } #[instrument(err, ret, skip(self), fields(msg=%message, metadata=%fmt_bytes(metadata)))] diff --git a/rust/chains/hyperlane-cosmos/src/payloads/ism_routes.rs b/rust/chains/hyperlane-cosmos/src/payloads/ism_routes.rs index 1f2321a917..052a1cc48b 100644 --- a/rust/chains/hyperlane-cosmos/src/payloads/ism_routes.rs +++ b/rust/chains/hyperlane-cosmos/src/payloads/ism_routes.rs @@ -39,5 +39,5 @@ pub struct QueryIsmModuleTypeRequest { #[derive(Serialize, Deserialize, Debug)] pub struct QueryIsmModuleTypeResponse { #[serde(rename = "type")] - pub typ: hpl_interface::ism::ISMType, + pub typ: hpl_interface::ism::IsmType, } diff --git a/rust/chains/hyperlane-cosmos/src/types.rs b/rust/chains/hyperlane-cosmos/src/types.rs index d2e7c965ad..1a3f44ad3e 100644 --- a/rust/chains/hyperlane-cosmos/src/types.rs +++ b/rust/chains/hyperlane-cosmos/src/types.rs @@ -1,9 +1,9 @@ use hyperlane_core::ModuleType; -pub struct IsmType(pub hpl_interface::ism::ISMType); +pub struct IsmType(pub hpl_interface::ism::IsmType); -impl From for IsmType { - fn from(value: hpl_interface::ism::ISMType) -> Self { +impl From for IsmType { + fn from(value: hpl_interface::ism::IsmType) -> Self { IsmType(value) } } @@ -11,14 +11,14 @@ impl From for IsmType { impl From for ModuleType { fn from(value: IsmType) -> Self { match value.0 { - hpl_interface::ism::ISMType::Unused => ModuleType::Unused, - hpl_interface::ism::ISMType::Routing => ModuleType::Routing, - hpl_interface::ism::ISMType::Aggregation => ModuleType::Aggregation, - hpl_interface::ism::ISMType::LegacyMultisig => ModuleType::MessageIdMultisig, - hpl_interface::ism::ISMType::MerkleRootMultisig => ModuleType::MerkleRootMultisig, - hpl_interface::ism::ISMType::MessageIdMultisig => ModuleType::MessageIdMultisig, - hpl_interface::ism::ISMType::Null => ModuleType::Null, - hpl_interface::ism::ISMType::CcipRead => ModuleType::CcipRead, + hpl_interface::ism::IsmType::Unused => ModuleType::Unused, + hpl_interface::ism::IsmType::Routing => ModuleType::Routing, + hpl_interface::ism::IsmType::Aggregation => ModuleType::Aggregation, + hpl_interface::ism::IsmType::LegacyMultisig => ModuleType::MessageIdMultisig, + hpl_interface::ism::IsmType::MerkleRootMultisig => ModuleType::MerkleRootMultisig, + hpl_interface::ism::IsmType::MessageIdMultisig => ModuleType::MessageIdMultisig, + hpl_interface::ism::IsmType::Null => ModuleType::Null, + hpl_interface::ism::IsmType::CcipRead => ModuleType::CcipRead, } } } diff --git a/rust/chains/hyperlane-cosmos/src/validator_announce.rs b/rust/chains/hyperlane-cosmos/src/validator_announce.rs index a5d9d2838b..f7024439dc 100644 --- a/rust/chains/hyperlane-cosmos/src/validator_announce.rs +++ b/rust/chains/hyperlane-cosmos/src/validator_announce.rs @@ -104,12 +104,7 @@ impl ValidatorAnnounce for CosmosValidatorAnnounce { .wasm_send(announce_request, tx_gas_limit) .await?; - Ok(TxOutcome { - transaction_id: H256::from_slice(hex::decode(response.txhash)?.as_slice()).into(), - executed: response.code == 0, - gas_used: U256::from(response.gas_used), - gas_price: U256::from(response.gas_wanted), - }) + Ok(response.try_into()?) } async fn announce_tokens_needed(&self, announcement: SignedType) -> Option { diff --git a/rust/chains/hyperlane-ethereum/Cargo.toml b/rust/chains/hyperlane-ethereum/Cargo.toml index a7de33d53a..8d6db17f45 100644 --- a/rust/chains/hyperlane-ethereum/Cargo.toml +++ b/rust/chains/hyperlane-ethereum/Cargo.toml @@ -33,12 +33,6 @@ url.workspace = true hyperlane-core = { path = "../../hyperlane-core" } ethers-prometheus = { path = "../../ethers-prometheus", features = ["serde"] } -# These should only be used if it _must_ be used to interop with the inner library, -# all errors exported from a chain crate should be using thiserror or handrolled to -# make error handling easier. -# eyre = "never" -# anyhow = never - [build-dependencies] abigen = { path = "../../utils/abigen", features = ["ethers"] } hyperlane-core = { path = "../../hyperlane-core", features = ["test-utils"] } diff --git a/rust/chains/hyperlane-fuel/Cargo.toml b/rust/chains/hyperlane-fuel/Cargo.toml index d9b85aab2d..7dabcdd514 100644 --- a/rust/chains/hyperlane-fuel/Cargo.toml +++ b/rust/chains/hyperlane-fuel/Cargo.toml @@ -21,11 +21,5 @@ url.workspace = true hyperlane-core = { path = "../../hyperlane-core" } -# These should only be used if it _must_ be used to interop with the inner library, -# all errors exported from a chain crate should be using thiserror or handrolled to -# make error handling easier. -# eyre = "never" -# anyhow = never - [build-dependencies] abigen = { path = "../../utils/abigen", features = ["fuels"] } diff --git a/rust/hyperlane-base/Cargo.toml b/rust/hyperlane-base/Cargo.toml index b3e5fbc74f..02d870e644 100644 --- a/rust/hyperlane-base/Cargo.toml +++ b/rust/hyperlane-base/Cargo.toml @@ -36,6 +36,7 @@ tracing-error.workspace = true tracing-futures.workspace = true tracing-subscriber = { workspace = true, features = ["json", "ansi"] } tracing.workspace = true +url.workspace = true warp.workspace = true backtrace = { workspace = true, optional = true } diff --git a/rust/hyperlane-base/src/settings/parser/connection_parser.rs b/rust/hyperlane-base/src/settings/parser/connection_parser.rs new file mode 100644 index 0000000000..5a56cb253b --- /dev/null +++ b/rust/hyperlane-base/src/settings/parser/connection_parser.rs @@ -0,0 +1,127 @@ +use eyre::eyre; +use hyperlane_core::config::ConfigErrResultExt; +use hyperlane_core::{config::ConfigParsingError, HyperlaneDomainProtocol}; +use url::Url; + +use crate::settings::envs::*; +use crate::settings::ChainConnectionConf; + +use super::ValueParser; + +pub fn build_ethereum_connection_conf( + rpcs: &Vec, + chain: &ValueParser, + err: &mut ConfigParsingError, + default_rpc_consensus_type: &str, +) -> Option { + let Some(first_url) = rpcs.clone().into_iter().next() else { + return None; + }; + let rpc_consensus_type = chain + .chain(err) + .get_opt_key("rpcConsensusType") + .parse_string() + .unwrap_or(default_rpc_consensus_type); + + match rpc_consensus_type { + "single" => Some(h_eth::ConnectionConf::Http { url: first_url }), + "fallback" => Some(h_eth::ConnectionConf::HttpFallback { urls: rpcs.clone() }), + "quorum" => Some(h_eth::ConnectionConf::HttpQuorum { urls: rpcs.clone() }), + ty => Err(eyre!("unknown rpc consensus type `{ty}`")) + .take_err(err, || &chain.cwp + "rpc_consensus_type"), + } + .map(ChainConnectionConf::Ethereum) +} + +pub fn build_cosmos_connection_conf( + rpcs: &Vec, + chain: &ValueParser, + err: &mut ConfigParsingError, +) -> Option { + let mut local_err = ConfigParsingError::default(); + + let grpc_url = chain + .chain(&mut local_err) + .get_key("grpcUrl") + .parse_string() + .end() + .or_else(|| { + local_err.push( + &chain.cwp + "grpc_url", + eyre!("Missing grpc definitions for chain"), + ); + None + }); + + let chain_id = chain + .chain(&mut local_err) + .get_key("chainId") + .parse_string() + .end() + .or_else(|| { + local_err.push(&chain.cwp + "chain_id", eyre!("Missing chain id for chain")); + None + }); + + let prefix = chain + .chain(err) + .get_key("prefix") + .parse_string() + .end() + .or_else(|| { + local_err.push(&chain.cwp + "prefix", eyre!("Missing prefix for chain")); + None + }); + + let canonical_asset = if let Some(asset) = chain + .chain(err) + .get_opt_key("canonicalAsset") + .parse_string() + .end() + { + Some(asset.to_string()) + } else if let Some(hrp) = prefix { + Some(format!("u{}", hrp)) + } else { + local_err.push( + &chain.cwp + "canonical_asset", + eyre!("Missing canonical asset for chain"), + ); + None + }; + + if !local_err.is_ok() { + err.merge(local_err); + None + } else { + Some(ChainConnectionConf::Cosmos(h_cosmos::ConnectionConf::new( + grpc_url.unwrap().to_string(), + rpcs.first().unwrap().to_string(), + chain_id.unwrap().to_string(), + prefix.unwrap().to_string(), + canonical_asset.unwrap(), + ))) + } +} + +pub fn build_connection_conf( + domain_protocol: HyperlaneDomainProtocol, + rpcs: &Vec, + chain: &ValueParser, + err: &mut ConfigParsingError, + default_rpc_consensus_type: &str, +) -> Option { + match domain_protocol { + HyperlaneDomainProtocol::Ethereum => { + build_ethereum_connection_conf(rpcs, chain, err, default_rpc_consensus_type) + } + HyperlaneDomainProtocol::Fuel => rpcs + .into_iter() + .next() + .map(|url| ChainConnectionConf::Fuel(h_fuel::ConnectionConf { url: url.clone() })), + HyperlaneDomainProtocol::Sealevel => rpcs.iter().next().map(|url| { + ChainConnectionConf::Sealevel(h_sealevel::ConnectionConf { url: url.clone() }) + }), + HyperlaneDomainProtocol::Cosmos => build_cosmos_connection_conf(rpcs, chain, err), + } +} diff --git a/rust/hyperlane-base/src/settings/parser/mod.rs b/rust/hyperlane-base/src/settings/parser/mod.rs index 7edaae6d6a..781a7c7f2d 100644 --- a/rust/hyperlane-base/src/settings/parser/mod.rs +++ b/rust/hyperlane-base/src/settings/parser/mod.rs @@ -21,10 +21,11 @@ use serde_json::Value; pub use self::json_value_parser::ValueParser; pub use super::envs::*; use crate::settings::{ - chains::IndexSettings, trace::TracingConfig, ChainConf, ChainConnectionConf, - CoreContractAddresses, Settings, SignerConf, + chains::IndexSettings, parser::connection_parser::build_connection_conf, trace::TracingConfig, + ChainConf, ChainConnectionConf, CoreContractAddresses, Settings, SignerConf, }; +mod connection_parser; mod json_value_parser; /// The base agent config @@ -224,107 +225,13 @@ fn parse_chain( .end(); cfg_unwrap_all!(&chain.cwp, err: [domain]); - - let connection: Option = match domain.domain_protocol() { - HyperlaneDomainProtocol::Ethereum => { - if rpcs.len() <= 1 { - rpcs.into_iter() - .next() - .map(|url| ChainConnectionConf::Ethereum(h_eth::ConnectionConf::Http { url })) - } else { - let rpc_consensus_type = chain - .chain(&mut err) - .get_opt_key("rpcConsensusType") - .parse_string() - .unwrap_or(default_rpc_consensus_type); - match rpc_consensus_type { - "single" => Some(h_eth::ConnectionConf::Http { - url: rpcs.into_iter().next().unwrap(), - }), - "fallback" => Some(h_eth::ConnectionConf::HttpFallback { urls: rpcs }), - "quorum" => Some(h_eth::ConnectionConf::HttpQuorum { urls: rpcs }), - ty => Err(eyre!("unknown rpc consensus type `{ty}`")) - .take_err(&mut err, || &chain.cwp + "rpc_consensus_type"), - } - .map(ChainConnectionConf::Ethereum) - } - } - HyperlaneDomainProtocol::Fuel => rpcs - .into_iter() - .next() - .map(|url| ChainConnectionConf::Fuel(h_fuel::ConnectionConf { url })), - HyperlaneDomainProtocol::Sealevel => rpcs - .into_iter() - .next() - .map(|url| ChainConnectionConf::Sealevel(h_sealevel::ConnectionConf { url })), - HyperlaneDomainProtocol::Cosmos => { - // ----- only for cosmos ----- - let mut local_err = ConfigParsingError::default(); - - let grpc_url = chain - .chain(&mut local_err) - .get_key("grpcUrl") - .parse_string() - .end() - .or_else(|| { - local_err.push( - &chain.cwp + "grpc_url", - eyre!("Missing grpc definitions for chain"), - ); - None - }); - - let chain_id = chain - .chain(&mut local_err) - .get_key("chainId") - .parse_string() - .end() - .or_else(|| { - local_err.push(&chain.cwp + "chain_id", eyre!("Missing chain id for chain")); - None - }); - - let prefix = chain - .chain(&mut err) - .get_key("prefix") - .parse_string() - .end() - .or_else(|| { - local_err.push(&chain.cwp + "prefix", eyre!("Missing prefix for chain")); - None - }); - - let canonical_asset = if let Some(asset) = chain - .chain(&mut err) - .get_opt_key("canonicalAsset") - .parse_string() - .end() - { - Some(asset.to_string()) - } else if let Some(hrp) = prefix { - Some(format!("u{}", hrp)) - } else { - local_err.push( - &chain.cwp + "canonical_asset", - eyre!("Missing canonical asset for chain"), - ); - None - }; - - if !local_err.is_ok() { - err.merge(local_err); - None - } else { - Some(ChainConnectionConf::Cosmos(h_cosmos::ConnectionConf::new( - grpc_url.unwrap().to_string(), - rpcs.first().unwrap().to_string(), - chain_id.unwrap().to_string(), - prefix.unwrap().to_string(), - canonical_asset.unwrap(), - ))) - } - } - }; + let connection = build_connection_conf( + domain.domain_protocol(), + &rpcs, + &chain, + &mut err, + default_rpc_consensus_type, + ); cfg_unwrap_all!(&chain.cwp, err: [connection, mailbox, interchain_gas_paymaster, validator_announce]); err.into_result(ChainConf { diff --git a/rust/hyperlane-base/src/settings/signers.rs b/rust/hyperlane-base/src/settings/signers.rs index d072d428b6..2979488544 100644 --- a/rust/hyperlane-base/src/settings/signers.rs +++ b/rust/hyperlane-base/src/settings/signers.rs @@ -103,16 +103,15 @@ impl ChainSigner for hyperlane_ethereum::Signers { #[async_trait] impl BuildableWithSignerConf for fuels::prelude::WalletUnlocked { async fn build(conf: &SignerConf) -> Result { - Ok(match conf { - SignerConf::HexKey { key } => { - let key = fuels::signers::fuel_crypto::SecretKey::try_from(key.as_bytes()) - .context("Invalid fuel signer key")?; - fuels::prelude::WalletUnlocked::new_from_private_key(key, None) - } - SignerConf::Aws { .. } => bail!("Aws signer is not supported by fuel"), - SignerConf::CosmosKey { .. } => bail!("Cosmos signer is not supported by fuel"), - SignerConf::Node => bail!("Node signer is not supported by fuel"), - }) + if let SignerConf::HexKey { key } = conf { + let key = fuels::signers::fuel_crypto::SecretKey::try_from(key.as_bytes()) + .context("Invalid fuel signer key")?; + Ok(fuels::prelude::WalletUnlocked::new_from_private_key( + key, None, + )) + } else { + bail!(format!("{conf:?} key is not supported by fuel")); + } } } @@ -125,17 +124,16 @@ impl ChainSigner for fuels::prelude::WalletUnlocked { #[async_trait] impl BuildableWithSignerConf for Keypair { async fn build(conf: &SignerConf) -> Result { - Ok(match conf { - SignerConf::HexKey { key } => { - let secret = SecretKey::from_bytes(key.as_bytes()) - .context("Invalid sealevel ed25519 secret key")?; + if let SignerConf::HexKey { key } = conf { + let secret = SecretKey::from_bytes(key.as_bytes()) + .context("Invalid sealevel ed25519 secret key")?; + Ok( Keypair::from_bytes(&ed25519_dalek::Keypair::from(secret).to_bytes()) - .context("Unable to create Keypair")? - } - SignerConf::Aws { .. } => bail!("Aws signer is not supported by fuel"), - SignerConf::CosmosKey { .. } => bail!("Cosmos signer is not supported by fuel"), - SignerConf::Node => bail!("Node signer is not supported by fuel"), - }) + .context("Unable to create Keypair")?, + ) + } else { + bail!(format!("{conf:?} key is not supported by sealevel")); + } } } @@ -148,14 +146,14 @@ impl ChainSigner for Keypair { #[async_trait] impl BuildableWithSignerConf for hyperlane_cosmos::Signer { async fn build(conf: &SignerConf) -> Result { - Ok(match conf { - SignerConf::HexKey { .. } => bail!("HexKey signer is not supported by cosmos"), - SignerConf::Aws { .. } => bail!("Aws signer is not supported by cosmos"), - SignerConf::CosmosKey { key, prefix } => { - hyperlane_cosmos::Signer::new(key.as_bytes().to_vec(), prefix.clone())? - } - SignerConf::Node => bail!("Node signer is not supported by cosmos"), - }) + if let SignerConf::CosmosKey { key, prefix } = conf { + Ok(hyperlane_cosmos::Signer::new( + key.as_bytes().to_vec(), + prefix.clone(), + )?) + } else { + bail!(format!("{conf:?} key is not supported by cosmos")); + } } } diff --git a/rust/hyperlane-core/src/traits/mod.rs b/rust/hyperlane-core/src/traits/mod.rs index ec2c9e04f4..555082dbc5 100644 --- a/rust/hyperlane-core/src/traits/mod.rs +++ b/rust/hyperlane-core/src/traits/mod.rs @@ -15,6 +15,8 @@ pub use routing_ism::*; pub use signing::*; pub use validator_announce::*; +use crate::{ChainCommunicationError, ChainResult, H256, U256}; + mod aggregation_ism; mod ccip_read_ism; mod cursor; @@ -60,3 +62,18 @@ impl From for TxOutcome { } } } + +impl TryFrom for TxOutcome { + type Error = ChainCommunicationError; + + fn try_from( + response: cosmrs::proto::cosmos::base::abci::v1beta1::TxResponse, + ) -> ChainResult { + Ok(Self { + transaction_id: H256::from_slice(hex::decode(response.txhash)?.as_slice()).into(), + executed: response.code == 0, + gas_used: U256::from(response.gas_used), + gas_price: U256::one(), + }) + } +} From 4370b0894ec40137eb725b38a1d360e25ae98c83 Mon Sep 17 00:00:00 2001 From: Nam Chu Hoai Date: Tue, 21 Nov 2023 16:26:22 +0300 Subject: [PATCH 141/142] Actually default to none policy (#2921) ### Description ### Drive-by changes ### Related issues ### Backward compatibility ### Testing --- rust/agents/relayer/src/settings/mod.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/rust/agents/relayer/src/settings/mod.rs b/rust/agents/relayer/src/settings/mod.rs index 18ea52dddb..a595f0899b 100644 --- a/rust/agents/relayer/src/settings/mod.rs +++ b/rust/agents/relayer/src/settings/mod.rs @@ -143,7 +143,7 @@ impl FromRawConf for RelayerSettings { raw_gas_payment_enforcement_path, &raw_gas_payment_enforcement, ); - let gas_payment_enforcement = gas_payment_enforcement_parser.into_array_iter().map(|itr| { + let mut gas_payment_enforcement = gas_payment_enforcement_parser.into_array_iter().map(|itr| { itr.filter_map(|policy| { let policy_type = policy.chain(&mut err).get_opt_key("type").parse_string().end(); let minimum_is_defined = matches!(policy.get_opt_key("minimum"), Ok(Some(_))); @@ -187,7 +187,11 @@ impl FromRawConf for RelayerSettings { matching_list, }) }).collect_vec() - }).unwrap_or_else(|_| vec![GasPaymentEnforcementConf::default()]); + }).unwrap_or_default(); + + if gas_payment_enforcement.is_empty() { + gas_payment_enforcement.push(GasPaymentEnforcementConf::default()); + } let whitelist = p .chain(&mut err) From 7d6f4ce4b29c6b51c090dd9d77a5bc907d1ec1ca Mon Sep 17 00:00:00 2001 From: Daniel Savu <23065004+daniel-savu@users.noreply.github.com> Date: Tue, 21 Nov 2023 16:24:38 +0000 Subject: [PATCH 142/142] rm unused import --- rust/hyperlane-base/src/settings/parser/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/hyperlane-base/src/settings/parser/mod.rs b/rust/hyperlane-base/src/settings/parser/mod.rs index 781a7c7f2d..76ed1d5944 100644 --- a/rust/hyperlane-base/src/settings/parser/mod.rs +++ b/rust/hyperlane-base/src/settings/parser/mod.rs @@ -22,7 +22,7 @@ pub use self::json_value_parser::ValueParser; pub use super::envs::*; use crate::settings::{ chains::IndexSettings, parser::connection_parser::build_connection_conf, trace::TracingConfig, - ChainConf, ChainConnectionConf, CoreContractAddresses, Settings, SignerConf, + ChainConf, CoreContractAddresses, Settings, SignerConf, }; mod connection_parser;

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