From 8fb8dd476889b7990f5f5bc1ee7950069c2001ab Mon Sep 17 00:00:00 2001 From: Zeeshan Lakhani Date: Tue, 31 Oct 2023 02:05:58 -0400 Subject: [PATCH 01/24] feat: go from websocket-server to json rpc websocket/http server Includes: - re-purposing of feature flags * metrics is always a thing (on) * monitoring is the gated feature * websocket-server flag is gone, we only gate push notifications - jsonrpc setup and rpc method register - prometheus exposition format to json parser - Added todo around split networking config Notes: - will not merge this in until example app has been restored with the client changes --- .envrc | 2 +- .gitignore | 1 + Cargo.lock | 503 +++++++++++++++++- README.md | 10 + examples/websocket-relay/README.md | 9 +- flake.lock | 12 +- homestar-functions/README.md | 7 +- homestar-runtime/Cargo.toml | 48 +- homestar-runtime/fixtures/settings.toml | 2 +- homestar-runtime/src/event_handler.rs | 30 +- homestar-runtime/src/event_handler/event.rs | 12 +- homestar-runtime/src/logger.rs | 1 + homestar-runtime/src/metrics.rs | 26 +- homestar-runtime/src/metrics/exporter.rs | 38 +- homestar-runtime/src/metrics/node.rs | 17 +- homestar-runtime/src/network/mod.rs | 11 +- homestar-runtime/src/network/rpc.rs | 1 + homestar-runtime/src/network/webserver.rs | 430 +++++++++++++++ .../src/network/{ws => webserver}/listener.rs | 16 +- .../src/network/{ws => webserver}/notifier.rs | 0 .../src/network/webserver/prom.rs | 434 +++++++++++++++ homestar-runtime/src/network/webserver/rpc.rs | 235 ++++++++ homestar-runtime/src/network/ws.rs | 325 ----------- homestar-runtime/src/runner.rs | 352 ++++-------- homestar-runtime/src/settings.rs | 29 +- .../src/test_utils/proc_macro/src/lib.rs | 2 +- homestar-runtime/src/worker.rs | 19 +- homestar-runtime/tests/cli.rs | 49 +- .../tests/fixtures/test_mdns1.toml | 4 +- .../tests/fixtures/test_mdns2.toml | 4 +- .../tests/fixtures/test_metrics.toml | 4 +- .../tests/fixtures/test_network1.toml | 4 +- .../tests/fixtures/test_network2.toml | 4 +- homestar-runtime/tests/fixtures/test_v4.toml | 3 +- .../tests/fixtures/test_v4_alt.toml | 3 +- homestar-runtime/tests/fixtures/test_v6.toml | 3 +- .../tests/fixtures/test_workflow.toml | 3 +- homestar-runtime/tests/main.rs | 1 + homestar-runtime/tests/metrics.rs | 4 +- homestar-runtime/tests/network.rs | 4 +- homestar-runtime/tests/utils.rs | 11 +- 41 files changed, 1913 insertions(+), 760 deletions(-) create mode 100644 homestar-runtime/src/network/webserver.rs rename homestar-runtime/src/network/{ws => webserver}/listener.rs (87%) rename homestar-runtime/src/network/{ws => webserver}/notifier.rs (100%) create mode 100644 homestar-runtime/src/network/webserver/prom.rs create mode 100644 homestar-runtime/src/network/webserver/rpc.rs delete mode 100644 homestar-runtime/src/network/ws.rs diff --git a/.envrc b/.envrc index a874fac6..5951dee6 100644 --- a/.envrc +++ b/.envrc @@ -1,5 +1,5 @@ use_flake -export RUST_LOG=homestar=debug,homestar_runtime=debug,libp2p=info,libp2p_gossipsub::behaviour=debug,tarpc=info,tower_http=debug +export RUST_LOG=homestar=debug,homestar_runtime=debug,libp2p=info,libp2p_gossipsub::behaviour=debug,tarpc=info,tower_http=debug,jsonrpsee_server=debug export RUST_BACKTRACE=full export RUSTFLAGS="--cfg tokio_unstable" diff --git a/.gitignore b/.gitignore index 0b74cf8d..8e6e9508 100644 --- a/.gitignore +++ b/.gitignore @@ -35,6 +35,7 @@ report.json homestar.err homestar.out homestar.pid +homestar.log* # locks homestar-wasm/Cargo.lock diff --git a/Cargo.lock b/Cargo.lock index d23633f2..b8fc0631 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -88,6 +88,15 @@ dependencies = [ "version_check", ] +[[package]] +name = "aho-corasick" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +dependencies = [ + "memchr", +] + [[package]] name = "aho-corasick" version = "1.0.5" @@ -371,11 +380,9 @@ checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" dependencies = [ "async-trait", "axum-core", - "base64 0.21.4", "bitflags 1.3.2", "bytes", "futures-util", - "headers", "http", "http-body", "hyper", @@ -387,10 +394,7 @@ dependencies = [ "pin-project-lite", "rustversion", "serde", - "sha1", "sync_wrapper", - "tokio", - "tokio-tungstenite", "tower", "tower-layer", "tower-service", @@ -461,6 +465,15 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +[[package]] +name = "beef" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" +dependencies = [ + "serde", +] + [[package]] name = "bimap" version = "0.6.3" @@ -1613,6 +1626,12 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" +[[package]] +name = "dyn-clone" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d2f3407d9a573d666de4b5bdf10569d73ca9478087346697dcbae6244bfbcd" + [[package]] name = "ecolor" version = "0.23.0" @@ -1687,6 +1706,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "endian-type" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" + [[package]] name = "enum-as-inner" version = "0.5.1" @@ -1755,6 +1780,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "erased-serde" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c138974f9d5e7fe373eb04df7cae98833802ae4b11c24ac7039a21d5af4b26c" +dependencies = [ + "serde", +] + [[package]] name = "errno" version = "0.3.3" @@ -2044,6 +2078,10 @@ name = "futures-timer" version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" +dependencies = [ + "gloo-timers", + "send_wrapper", +] [[package]] name = "futures-util" @@ -2161,6 +2199,52 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "gloo-net" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ac9e8288ae2c632fa9f8657ac70bfe38a1530f345282d7ba66a1f70b72b7dc4" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils", + "http", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "gloo-utils" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "h2" version = "0.3.21" @@ -2358,7 +2442,6 @@ dependencies = [ "assert_cmd", "async-trait", "atomic_refcell", - "axum", "byte-unit", "chrono", "clap", @@ -2372,6 +2455,7 @@ dependencies = [ "diesel", "diesel_migrations", "dotenvy", + "dyn-clone", "enum-assoc", "faststr", "flume 0.11.0", @@ -2388,11 +2472,14 @@ dependencies = [ "ipfs-api", "ipfs-api-backend-hyper", "itertools 0.11.0", + "jsonrpsee", "libipld", "libp2p", "libsqlite3-sys", + "maplit", "metrics", "metrics-exporter-prometheus", + "metrics-util", "miette", "names", "nix 0.27.1", @@ -2403,6 +2490,7 @@ dependencies = [ "puffin", "puffin_egui", "rand", + "regex", "reqwest", "retry", "rm_rf", @@ -2422,13 +2510,17 @@ dependencies = [ "thiserror", "tokio", "tokio-serde", + "tokio-stream", "tokio-tungstenite", "tokio-util", + "tower", + "tower-http", "tracing", "tracing-appender", "tracing-logfmt", "tracing-subscriber", "tryhard", + "typetag", "url", "wait-timeout", "wnfs-common", @@ -2505,6 +2597,12 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "http-range-header" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" + [[package]] name = "http-serde" version = "1.1.3" @@ -2570,6 +2668,22 @@ dependencies = [ "hyper", ] +[[package]] +name = "hyper-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" +dependencies = [ + "futures-util", + "http", + "hyper", + "log", + "rustls", + "rustls-native-certs", + "tokio", + "tokio-rustls", +] + [[package]] name = "hyper-timeout" version = "0.4.1" @@ -2717,6 +2831,12 @@ dependencies = [ "web-sys", ] +[[package]] +name = "inventory" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1be380c410bf0595e94992a648ea89db4dd3f3354ba54af206fd2a68cf5ac8e" + [[package]] name = "io-extras" version = "0.17.4" @@ -2905,6 +3025,152 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "078e285eafdfb6c4b434e0d31e8cfcb5115b651496faca5749b88fafd4f23bfd" +[[package]] +name = "jsonrpsee" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "affdc52f7596ccb2d7645231fc6163bb314630c989b64998f3699a28b4d5d4dc" +dependencies = [ + "jsonrpsee-client-transport", + "jsonrpsee-core", + "jsonrpsee-http-client", + "jsonrpsee-server", + "jsonrpsee-types", + "jsonrpsee-wasm-client", + "jsonrpsee-ws-client", + "tokio", +] + +[[package]] +name = "jsonrpsee-client-transport" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b005c793122d03217da09af68ba9383363caa950b90d3436106df8cabce935" +dependencies = [ + "futures-channel", + "futures-util", + "gloo-net", + "http", + "jsonrpsee-core", + "pin-project", + "rustls-native-certs", + "soketto", + "thiserror", + "tokio", + "tokio-rustls", + "tokio-util", + "tracing", + "url", + "webpki-roots", +] + +[[package]] +name = "jsonrpsee-core" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da2327ba8df2fdbd5e897e2b5ed25ce7f299d345b9736b6828814c3dbd1fd47b" +dependencies = [ + "anyhow", + "async-lock", + "async-trait", + "beef", + "futures-timer", + "futures-util", + "hyper", + "jsonrpsee-types", + "parking_lot", + "rand", + "rustc-hash", + "serde", + "serde_json", + "soketto", + "thiserror", + "tokio", + "tracing", + "wasm-bindgen-futures", +] + +[[package]] +name = "jsonrpsee-http-client" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f80c17f62c7653ce767e3d7288b793dfec920f97067ceb189ebdd3570f2bc20" +dependencies = [ + "async-trait", + "hyper", + "hyper-rustls", + "jsonrpsee-core", + "jsonrpsee-types", + "serde", + "serde_json", + "thiserror", + "tokio", + "tower", + "tracing", + "url", +] + +[[package]] +name = "jsonrpsee-server" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82c39a00449c9ef3f50b84fc00fc4acba20ef8f559f07902244abf4c15c5ab9c" +dependencies = [ + "futures-util", + "http", + "hyper", + "jsonrpsee-core", + "jsonrpsee-types", + "route-recognizer", + "serde", + "serde_json", + "soketto", + "thiserror", + "tokio", + "tokio-stream", + "tokio-util", + "tower", + "tracing", +] + +[[package]] +name = "jsonrpsee-types" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be0be325642e850ed0bdff426674d2e66b2b7117c9be23a7caef68a2902b7d9" +dependencies = [ + "anyhow", + "beef", + "serde", + "serde_json", + "thiserror", + "tracing", +] + +[[package]] +name = "jsonrpsee-wasm-client" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c7cbb3447cf14fd4d2f407c3cc96e6c9634d5440aa1fbed868a31f3c02b27f0" +dependencies = [ + "jsonrpsee-client-transport", + "jsonrpsee-core", + "jsonrpsee-types", +] + +[[package]] +name = "jsonrpsee-ws-client" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bca9cb3933ccae417eb6b08c3448eb1cb46e39834e5b503e395e5e5bd08546c0" +dependencies = [ + "http", + "jsonrpsee-client-transport", + "jsonrpsee-core", + "jsonrpsee-types", + "url", +] + [[package]] name = "keccak" version = "0.1.4" @@ -3584,6 +3850,12 @@ dependencies = [ "libc", ] +[[package]] +name = "maplit" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" + [[package]] name = "match_cfg" version = "0.1.0" @@ -3701,12 +3973,16 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "111cb375987443c3de8d503580b536f77dc8416d32db62d9456db5d93bd7ac47" dependencies = [ + "aho-corasick 0.7.20", "crossbeam-epoch", "crossbeam-utils", "hashbrown 0.13.2", + "indexmap 1.9.3", "metrics", "num_cpus", + "ordered-float", "quanta", + "radix_trie", "sketches-ddsketch", ] @@ -4026,6 +4302,15 @@ dependencies = [ "tokio", ] +[[package]] +name = "nibble_vec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43" +dependencies = [ + "smallvec", +] + [[package]] name = "nix" version = "0.24.3" @@ -4185,6 +4470,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + [[package]] name = "opentelemetry" version = "0.18.0" @@ -4228,6 +4519,15 @@ 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 = "owned_ttf_parser" version = "0.19.0" @@ -4809,6 +5109,16 @@ dependencies = [ "scheduled-thread-pool", ] +[[package]] +name = "radix_trie" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c069c179fcdc6a2fe24d8d18305cf085fdbd4f922c041943e203685d6a1c58fd" +dependencies = [ + "endian-type", + "nibble_vec", +] + [[package]] name = "rand" version = "0.8.5" @@ -4944,14 +5254,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", + "aho-corasick 1.0.5", "memchr", - "regex-automata 0.3.8", - "regex-syntax 0.7.5", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", ] [[package]] @@ -4968,10 +5278,16 @@ name = "regex-automata" version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" + +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ - "aho-corasick", + "aho-corasick 1.0.5", "memchr", - "regex-syntax 0.7.5", + "regex-syntax 0.8.2", ] [[package]] @@ -4986,6 +5302,12 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + [[package]] name = "reqwest" version = "0.11.22" @@ -5086,6 +5408,12 @@ dependencies = [ "serde", ] +[[package]] +name = "route-recognizer" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746" + [[package]] name = "rtnetlink" version = "0.10.1" @@ -5182,6 +5510,27 @@ dependencies = [ "sct", ] +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +dependencies = [ + "base64 0.21.4", +] + [[package]] name = "rustls-webpki" version = "0.101.5" @@ -5236,6 +5585,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +dependencies = [ + "windows-sys", +] + [[package]] name = "scheduled-thread-pool" version = "0.2.7" @@ -5272,12 +5630,41 @@ dependencies = [ "zeroize", ] +[[package]] +name = "security-framework" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "semver" version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +[[package]] +name = "send_wrapper" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" + [[package]] name = "serde" version = "1.0.190" @@ -5413,6 +5800,19 @@ dependencies = [ "syn 2.0.33", ] +[[package]] +name = "sha-1" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + [[package]] name = "sha1" version = "0.10.5" @@ -5589,6 +5989,22 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "soketto" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" +dependencies = [ + "base64 0.13.1", + "bytes", + "futures", + "http", + "httparse", + "log", + "rand", + "sha-1", +] + [[package]] name = "spdx" version = "0.10.2" @@ -6074,6 +6490,16 @@ dependencies = [ "syn 2.0.33", ] +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls", + "tokio", +] + [[package]] name = "tokio-serde" version = "0.8.0" @@ -6098,6 +6524,7 @@ dependencies = [ "futures-core", "pin-project-lite", "tokio", + "tokio-util", ] [[package]] @@ -6120,6 +6547,7 @@ checksum = "1d68074620f57a0b21594d9735eb2e98ab38b17f80d3fcb189fca266771ca60d" dependencies = [ "bytes", "futures-core", + "futures-io", "futures-sink", "pin-project-lite", "slab", @@ -6217,6 +6645,25 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower-http" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140" +dependencies = [ + "bitflags 2.4.0", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-range-header", + "pin-project-lite", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "tower-layer" version = "0.3.2" @@ -6420,6 +6867,30 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +[[package]] +name = "typetag" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80960fd143d4c96275c0e60b08f14b81fbb468e79bc0ef8fbda69fb0afafae43" +dependencies = [ + "erased-serde", + "inventory", + "once_cell", + "serde", + "typetag-impl", +] + +[[package]] +name = "typetag-impl" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfc13d450dc4a695200da3074dacf43d449b968baee95e341920e47f61a3b40f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.33", +] + [[package]] name = "ucan" version = "0.4.0" @@ -7461,6 +7932,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-roots" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" + [[package]] name = "websocket-relay" version = "0.1.0" diff --git a/README.md b/README.md index 58ea6072..bccaaef1 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,7 @@ ## Outline - [Quickstart](#quickstart) +- [Packages](#packages) - [Running Examples](#running-examples) - [Workspace](#workspace) - [Contributing](#contributing) @@ -80,6 +81,14 @@ components (currently focused on authoring in Rust), please jump into our [`homestar-functions`](./homestar-functions) directory and check out our examples there. +## Packages + +Each `homestar` release will also build packages for distribution across +different platforms. + +- [homebrew][homebrew]: `brew install fission-codes/fission/homestar` + This includes `ipfs` in the install by default. + ## Running Examples All [examples](./examples) contain instructions for running @@ -187,6 +196,7 @@ conditions. [demo-1]: https://www.loom.com/share/3204037368fe426ba3b4c952b0691c5c [foundations-for-openworld-compute]: https://youtu.be/dRz5mau6fsY [guest]: https://github.com/bytecodealliance/wit-bindgen#supported-guest-languages +[homebrew]: https://brew.sh/ [host-runtime]: https://github.com/bytecodealliance/wit-bindgen#host-runtimes-for-components [ipfs-thing-ipvm]: https://www.youtube.com/watch?v=rzJWk1nlYvs [ipld]: https://ipld.io/ diff --git a/examples/websocket-relay/README.md b/examples/websocket-relay/README.md index a6ac7bd5..46a41427 100644 --- a/examples/websocket-relay/README.md +++ b/examples/websocket-relay/README.md @@ -63,7 +63,14 @@ if they've been previously run. On macOS, for example, a simple homebrew install would install everything you need: `brew install rust npm ipfs` -We have packaged homestar binaries via brew, so `brew install fission-codes/fission/homestar` will install everything you need, including `ipfs`. You will still need npm to run this example. From this folder, you can run the example via `homestar start --config ./config/settings.toml --db homestar.db`. +We have packaged homestar binaries via brew, so +`brew install fission-codes/fission/homestar` will install everything you need, +including `ipfs`. You will still need npm to run this example. From this folder, +you can then run the example like this: + +``` +homestar start --config ./config/settings.toml --db homestar.db` +``` Running `homestar` via `cargo run` requires a minimum Rust version of `1.70.0`. If you've got an older install of rust, update it with diff --git a/flake.lock b/flake.lock index edcb403f..954b707a 100644 --- a/flake.lock +++ b/flake.lock @@ -36,11 +36,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1696577711, - "narHash": "sha256-94VRjvClIKDym1QRqPkX5LTQoAwZ1E6QE/3dWtOXSIQ=", + "lastModified": 1698553279, + "narHash": "sha256-T/9P8yBSLcqo/v+FTOBK+0rjzjPMctVymZydbvR/Fak=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "a2eb207f45e4a14a1e3019d9e3863d1e208e2295", + "rev": "90e85bc7c1a6fc0760a94ace129d3a1c61c3d035", "type": "github" }, "original": { @@ -68,11 +68,11 @@ ] }, "locked": { - "lastModified": 1696558324, - "narHash": "sha256-TnnP4LGwDB8ZGE7h2n4nA9Faee8xPkMdNcyrzJ57cbw=", + "lastModified": 1698726852, + "narHash": "sha256-V1S4TTzg++GzPc96i/yy4jib+7/xU0LXHcggm9MllMM=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "fdb37574a04df04aaa8cf7708f94a9309caebe2b", + "rev": "ec19bd20af08f3b004089cc12ab54c823ed899b7", "type": "github" }, "original": { diff --git a/homestar-functions/README.md b/homestar-functions/README.md index 96fe8c85..2369da24 100644 --- a/homestar-functions/README.md +++ b/homestar-functions/README.md @@ -50,9 +50,8 @@ cd test && cargo build --target wasm32-unknown-unknown --profile release-wasm-fn cargo build -p homestar-functions-test --target wasm32-unknown-unknown --profile release-wasm-fn ``` -Guest Wasm modules will be generated within the -`../target/wasm32-unknown-unknown/release` directory, e.g. -`../target/wasm32-unknown-unknown/release-wasm-fn/homestar_functions_test.wasm`. +Guest Wasm modules will be generated within the top-level `homestar` directory: +`./target/wasm32-unknown-unknown/release-wasm-fn/homestar_functions_test.wasm`. Sadly, this module is **not yet** an actual `component`. But, we can leverage the [wasm-tools][wasm-tools] tooling ([wit-component][wit-component] in @@ -98,7 +97,7 @@ conditions. [kv-demo]: https://github.com/Mossaka/keyvalue-component-model-demo [spiderlightning]: https://github.com/deislabs/spiderlightning [wasi]: https://github.com/WebAssembly/WASI -[wasm32]: https://doc.rust-lang.org/rustc/platform-support/wasm64-unknown-unknown.html +[wasm32]: https://rustwasm.github.io/docs/wasm-pack/prerequisites/non-rustup-setups.html#manually-add-wasm32-unknown-unknown [wasmtime]: https://github.com/bytecodealliance/wasmtime [wasm-tools]: https://github.com/bytecodealliance/wasm-tools [wit-bindgen]: https://github.com/bytecodealliance/wit-bindgen diff --git a/homestar-runtime/Cargo.toml b/homestar-runtime/Cargo.toml index b73dbcab..b5156a4c 100644 --- a/homestar-runtime/Cargo.toml +++ b/homestar-runtime/Cargo.toml @@ -39,10 +39,6 @@ path = "tests/main.rs" anyhow = { workspace = true } async-trait = "0.1" atomic_refcell = { workspace = true } -axum = { version = "0.6", default-features = false, features = [ - "ws", - "headers", -], optional = true } byte-unit = { workspace = true } chrono = { workspace = true } clap = { version = "4.4", default-features = false, features = [ @@ -68,6 +64,7 @@ diesel = { version = "2.1", default-features = false, features = [ ] } diesel_migrations = "2.1" dotenvy = "0.15" +dyn-clone = "1.0" enum-assoc = { workspace = true } faststr = { workspace = true } flume = { version = "0.11", default-features = false, features = ["async"] } @@ -86,6 +83,9 @@ ipfs-api-backend-hyper = { version = "0.6", default-features = false, features = "with-send-sync", ], optional = true } itertools = { workspace = true } +jsonrpsee = { version = "0.20", default-features = false, features = [ + "server", +] } libipld = { workspace = true } libp2p = { version = "0.52", default-features = false, features = [ "kad", @@ -106,16 +106,19 @@ libp2p = { version = "0.52", default-features = false, features = [ libsqlite3-sys = { version = "0.26", default-features = false, features = [ "bundled", ] } -metrics = { version = "0.21", default-features = false, optional = true } +metrics = { version = "0.21", default-features = false } metrics-exporter-prometheus = { version = "0.12.1", default-features = false, features = [ "http-listener", -], optional = true } +] } +metrics-util = "0.15" miette = { version = "5.10", default-features = false, features = ["fancy"] } -names = { version = "0.14", default-features = false, optional = true } +names = { version = "0.14", default-features = false } +once_cell = { version = "1.18", default-features = false } proptest = { version = "1.2", optional = true } puffin = { version = "0.17", default-features = false, optional = true } puffin_egui = { version = "0.23.0", default-features = false, optional = true } rand = { workspace = true } +regex = "1.10" reqwest = { version = "0.11", default-features = false, features = [ "blocking", "json", @@ -124,7 +127,7 @@ sec1 = { version = "0.7", default-features = false, features = ["pem"] } semver = { version = "1.0", default-features = false } serde = { workspace = true } serde_ipld_dagcbor = { workspace = true } -serde_json = { version = "1.0", optional = true, default-features = false, features = [ +serde_json = { version = "1.0", default-features = false, features = [ "raw_value", ] } serde_with = { version = "3.3", default-features = false, features = [ @@ -148,7 +151,19 @@ tokio = { workspace = true } tokio-serde = { version = "0.8", default-features = false, features = [ "messagepack", ] } +tokio-stream = { version = "0.1", default-features = false, features = [ + "sync", +] } tokio-util = { version = "0.7", default-features = false } +tower = { version = "0.4", default-features = false, features = [ + "log", + "timeout", +] } +tower-http = { version = "0.4", default-features = false, features = [ + "trace", + "catch-panic", + "cors", +] } tracing = { workspace = true } tracing-appender = "0.2" tracing-logfmt = "0.3" @@ -158,6 +173,7 @@ tracing-subscriber = { version = "0.3", default-features = false, features = [ "registry", ] } tryhard = "0.5" +typetag = "0.2" url = "2.4" wnfs-common = "0.1" @@ -171,8 +187,11 @@ homestar-core = { version = "0.1", path = "../homestar-core", features = [ "test-utils", ] } homestar_runtime_proc_macro = { path = "src/test_utils/proc_macro", package = "homestar-runtime-tests-proc-macro" } +jsonrpsee = { version = "0.20", default-features = false, features = [ + "client", +] } +maplit = "1.0" nix = { version = "0.27", features = ["signal"] } -once_cell = { version = "1.18", default-features = false } predicates = { version = "3.0", default-features = false } prometheus-parse = "0.2.4" rand = { workspace = true } @@ -182,7 +201,10 @@ serial_test = { version = "2.0", default-features = false, features = [ "file_locks", ] } strip-ansi-escapes = "0.2.0" -tokio-tungstenite = { version = "0.20", default-features = false } +sysinfo = { version = "0.29", default-features = false } +tokio-tungstenite = { version = "0.20", default-features = false, features = [ + "connect", +] } wait-timeout = "0.2" [features] @@ -191,13 +213,11 @@ dev = ["ansi-logs", "ipfs", "monitoring", "websocket-notify"] ansi-logs = ["tracing-logfmt/ansi_logs"] console = ["dep:console-subscriber"] ipfs = ["dep:ipfs-api", "dep:ipfs-api-backend-hyper"] -metrics = ["dep:metrics", "dep:metrics-exporter-prometheus"] -monitoring = ["metrics", "dep:sysinfo"] +monitoring = ["dep:sysinfo"] profile = ["dep:puffin", "dep:puffin_egui"] test-utils = ["dep:proptest"] wasmtime-default = ["homestar-wasm/default"] -websocket-notify = ["websocket-server", "dep:serde_json", "dep:names"] -websocket-server = ["dep:axum"] +websocket-notify = [] [package.metadata.docs.rs] all-features = true diff --git a/homestar-runtime/fixtures/settings.toml b/homestar-runtime/fixtures/settings.toml index edf2cf1b..9561abe7 100644 --- a/homestar-runtime/fixtures/settings.toml +++ b/homestar-runtime/fixtures/settings.toml @@ -2,5 +2,5 @@ [node.network] events_buffer_len = 1000 -websocket_port = 9999 +webserver_port = 9999 node_addresses = ["/ip4/127.0.0.1/tcp/9998/ws"] diff --git a/homestar-runtime/src/event_handler.rs b/homestar-runtime/src/event_handler.rs index 542c7b4f..c8f13b88 100644 --- a/homestar-runtime/src/event_handler.rs +++ b/homestar-runtime/src/event_handler.rs @@ -1,7 +1,7 @@ //! [EventHandler] implementation for handling network events and messages. -#[cfg(feature = "websocket-server")] -use crate::network::ws; +#[cfg(feature = "websocket-notify")] +use crate::network::webserver; #[cfg(feature = "ipfs")] use crate::network::IpfsCli; use crate::{ @@ -42,11 +42,8 @@ where } /// Event loop handler for [libp2p] network events and commands. -#[cfg(feature = "websocket-server")] -#[cfg_attr( - docsrs, - doc(cfg(all(feature = "websocket-server", feature = "websocket-notify"))) -)] +#[cfg(feature = "websocket-notify")] +#[cfg_attr(docsrs, doc(cfg(feature = "websocket-notify")))] #[allow(missing_debug_implementations, dead_code)] pub(crate) struct EventHandler { receipt_quorum: usize, @@ -61,14 +58,14 @@ pub(crate) struct EventHandler { request_response_senders: FnvHashMap, rendezvous_cookies: FnvHashMap, pubsub_enabled: bool, - ws_msg_sender: ws::Notifier, + ws_msg_sender: webserver::Notifier, node_addresses: Vec, announce_addresses: Vec, external_address_limit: u32, } /// Event loop handler for [libp2p] network events and commands. -#[cfg(not(feature = "websocket-server"))] +#[cfg(not(feature = "websocket-notify"))] #[allow(missing_debug_implementations, dead_code)] pub(crate) struct EventHandler { receipt_quorum: usize, @@ -102,12 +99,12 @@ where } /// Create an [EventHandler] with channel sender/receiver defaults. - #[cfg(feature = "websocket-server")] + #[cfg(feature = "websocket-notify")] pub(crate) fn new( swarm: Swarm, db: DB, settings: &settings::Node, - ws_msg_sender: ws::Notifier, + ws_msg_sender: webserver::Notifier, ) -> Self { let (sender, receiver) = Self::setup_channel(settings); Self { @@ -131,7 +128,7 @@ where } /// Create an [EventHandler] with channel sender/receiver defaults. - #[cfg(not(feature = "websocket-server"))] + #[cfg(not(feature = "websocket-notify"))] pub(crate) fn new(swarm: Swarm, db: DB, settings: &settings::Node) -> Self { let (sender, receiver) = Self::setup_channel(settings); Self { @@ -163,13 +160,10 @@ where /// [tokio::sync::broadcast::Sender] for sending messages through the /// webSocket server to subscribers. - #[cfg(all(feature = "websocket-server", feature = "websocket-notify"))] - #[cfg_attr( - docsrs, - doc(cfg(all(feature = "websocket-server", feature = "websocket-notify"))) - )] + #[cfg(feature = "websocket-notify")] + #[cfg_attr(docsrs, doc(cfg(feature = "websocket-notify")))] #[allow(dead_code)] - pub(crate) fn ws_sender(&self) -> ws::Notifier { + pub(crate) fn ws_sender(&self) -> webserver::Notifier { self.ws_msg_sender.clone() } diff --git a/homestar-runtime/src/event_handler/event.rs b/homestar-runtime/src/event_handler/event.rs index e2044480..545aa047 100644 --- a/homestar-runtime/src/event_handler/event.rs +++ b/homestar-runtime/src/event_handler/event.rs @@ -2,7 +2,7 @@ use super::EventHandler; #[cfg(feature = "websocket-notify")] -use crate::network::ws::notifier::NotifyReceipt; +use crate::network::webserver::notifier::NotifyReceipt; #[cfg(feature = "ipfs")] use crate::network::IpfsCli; use crate::{ @@ -16,9 +16,9 @@ use crate::{ }; use anyhow::Result; use async_trait::async_trait; -use homestar_core::workflow::Pointer; +use homestar_core::workflow::Receipt as InvocationReceipt; #[cfg(feature = "websocket-notify")] -use homestar_core::{ipld::DagJson, workflow::Receipt as InvocationReceipt}; +use homestar_core::{ipld::DagJson, workflow::Pointer}; use libipld::{Cid, Ipld}; use libp2p::{ kad::{record::Key, Quorum, Record}, @@ -31,6 +31,7 @@ use tokio::sync::oneshot; use tracing::{error, info, warn}; /// A [Receipt] captured (inner) event. +#[allow(dead_code)] #[derive(Debug, Clone)] pub(crate) struct Captured { /// The captured receipt. @@ -184,6 +185,7 @@ impl Captured { } } + #[allow(dead_code)] fn store_and_notify( mut self, event_handler: &mut EventHandler, @@ -193,12 +195,12 @@ impl Captured { { let receipt = Db::find_receipt_by_cid(self.receipt, &mut event_handler.db.conn()?)?; let invocation_receipt = InvocationReceipt::from(&receipt); - let invocation_notification = invocation_receipt.clone(); let instruction_bytes = receipt.instruction_cid_as_bytes(); let receipt_cid = receipt.cid(); - #[cfg(all(feature = "websocket-server", feature = "websocket-notify"))] + #[cfg(feature = "websocket-notify")] { + let invocation_notification = invocation_receipt.clone(); let ws_tx = event_handler.ws_sender(); let metadata = self.metadata.to_owned(); let receipt = NotifyReceipt::with(invocation_notification, receipt_cid, metadata); diff --git a/homestar-runtime/src/logger.rs b/homestar-runtime/src/logger.rs index 4e5dd8f3..089411bb 100644 --- a/homestar-runtime/src/logger.rs +++ b/homestar-runtime/src/logger.rs @@ -58,6 +58,7 @@ fn init( ) .add_directive("tarpc=info".parse().expect(DIRECTIVE_EXPECT)) .add_directive("tower_http=info".parse().expect(DIRECTIVE_EXPECT)) + .add_directive("jsonrpsee=info".parse().expect(DIRECTIVE_EXPECT)) }); #[cfg(all( diff --git a/homestar-runtime/src/metrics.rs b/homestar-runtime/src/metrics.rs index bba7533f..e0b308e9 100644 --- a/homestar-runtime/src/metrics.rs +++ b/homestar-runtime/src/metrics.rs @@ -2,19 +2,33 @@ use crate::settings; use anyhow::Result; +use metrics_exporter_prometheus::PrometheusHandle; +#[cfg(feature = "monitoring")] use tokio::runtime::Handle; mod exporter; +#[cfg(feature = "monitoring")] mod node; /// Start metrics collection and setup scrape endpoint. -pub(crate) async fn start(settings: &settings::Monitoring) -> Result<()> { - let handle = Handle::current(); - exporter::setup_metrics_recorder(settings)?; +#[cfg(feature = "monitoring")] +pub(crate) async fn start( + monitor_settings: &settings::Monitoring, + network_settings: &settings::Network, +) -> Result { + let metrics_hdl = exporter::setup_metrics_recorder(network_settings)?; // Spawn tick-driven process collection task - #[cfg(feature = "monitoring")] - handle.spawn(node::collect_metrics(settings.process_collector_interval)); + let handle = Handle::current(); + handle.spawn(node::collect_metrics( + monitor_settings.process_collector_interval, + )); + + Ok(metrics_hdl) +} - Ok(()) +#[cfg(not(feature = "monitoring"))] +pub(crate) async fn start(network_settings: &settings::Network) -> Result { + let metrics_hdl = exporter::setup_metrics_recorder(network_settings)?; + Ok(metrics_hdl) } diff --git a/homestar-runtime/src/metrics/exporter.rs b/homestar-runtime/src/metrics/exporter.rs index 675c53a5..f3e0c11d 100644 --- a/homestar-runtime/src/metrics/exporter.rs +++ b/homestar-runtime/src/metrics/exporter.rs @@ -1,31 +1,43 @@ //! Metrics Prometheus recorder. -use crate::{metrics::node, settings}; -use metrics_exporter_prometheus::{Matcher, PrometheusBuilder}; +#[cfg(feature = "monitoring")] +use crate::metrics::node; +use crate::settings; +use metrics_exporter_prometheus::{Matcher, PrometheusBuilder, PrometheusHandle}; +use metrics_util::layers::{PrefixLayer, Stack}; use std::net::{IpAddr, Ipv4Addr, SocketAddr}; +use tokio::runtime::Handle; /// Set up Prometheus buckets for matched metrics and install recorder. -pub(crate) fn setup_metrics_recorder(settings: &settings::Monitoring) -> anyhow::Result<()> { +pub(crate) fn setup_metrics_recorder( + settings: &settings::Network, +) -> anyhow::Result { const EXPONENTIAL_SECONDS: &[f64] = &[ 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0, ]; - let socket = SocketAddr::new( - IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), - settings.metrics_port, - ); + let socket = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), settings.metrics_port); - #[cfg(feature = "monitoring")] - node::describe(); - - PrometheusBuilder::new() + let (recorder, exporter) = PrometheusBuilder::new() .set_buckets_for_metric( Matcher::Suffix("_duration_seconds".to_string()), EXPONENTIAL_SECONDS, )? .with_http_listener(socket) - .install() + .build() .expect("failed to install recorder/exporter"); - Ok(()) + let rt_hdl = Handle::current(); + rt_hdl.spawn(exporter); + + let hdl = recorder.handle(); + + Stack::new(recorder) + .push(PrefixLayer::new("homestar")) + .install()?; + + #[cfg(feature = "monitoring")] + node::describe(); + + Ok(hdl) } diff --git a/homestar-runtime/src/metrics/node.rs b/homestar-runtime/src/metrics/node.rs index 2544692e..bb58f389 100644 --- a/homestar-runtime/src/metrics/node.rs +++ b/homestar-runtime/src/metrics/node.rs @@ -1,14 +1,13 @@ //! Node metrics, including system, process, network, and database information -use crate::db::ENV as DATABASE_URL; +use crate::Db; use anyhow::{anyhow, Context, Result}; use metrics::{describe_counter, describe_gauge, Unit}; -use std::{env, time::Duration}; +use std::time::Duration; use sysinfo::{ get_current_pid, CpuRefreshKind, Disk, DiskExt, NetworkExt, Networks, NetworksExt, ProcessExt, ProcessRefreshKind, RefreshKind, System, SystemExt, }; -use tokio::fs; use tracing::{info, warn}; /// Create and describe gauges for node metrics. @@ -152,11 +151,11 @@ async fn collect_stats(sys: System) -> Result<()> { .iter() .fold(0, |acc, interface| acc + interface.1.received()) } - async fn compute_database_size() -> Option { - let url = env::var(DATABASE_URL).unwrap(); - match fs::metadata(url).await { - Ok(metadata) => Some(metadata.len()), - Err(_) => None, + async fn compute_database_size() -> Option { + if let Ok(size) = Db::size().await { + Some(size.get_value()) + } else { + None } } @@ -223,7 +222,7 @@ async fn collect_stats(sys: System) -> Result<()> { // Database metrics if let Some(database_size) = compute_database_size().await { - metrics::gauge!("database_size_bytes", database_size as f64); + metrics::gauge!("database_size_bytes", database_size); } Ok(()) diff --git a/homestar-runtime/src/network/mod.rs b/homestar-runtime/src/network/mod.rs index 257f0ae0..01a55a31 100644 --- a/homestar-runtime/src/network/mod.rs +++ b/homestar-runtime/src/network/mod.rs @@ -1,7 +1,9 @@ -//! [libp2p], [websocket], and [ipfs] networking interfaces. +//! [libp2p], multi-use [http] and [websocket] server, and [ipfs] networking +//! interfaces. //! //! [libp2p]: libp2p -//! [websocket]: axum::extract::ws +//! [http]: jsonrpsee::server +//! [websocket]: jsonrpsee::server //! [ipfs]: ipfs_api pub(crate) mod error; @@ -10,8 +12,9 @@ pub(crate) mod ipfs; pub(crate) mod pubsub; pub mod rpc; pub(crate) mod swarm; -#[cfg(feature = "websocket-server")] -pub(crate) mod ws; +pub(crate) mod webserver; +#[allow(unused_imports)] +pub(crate) use error::Error; #[cfg(feature = "ipfs")] pub(crate) use ipfs::IpfsCli; diff --git a/homestar-runtime/src/network/rpc.rs b/homestar-runtime/src/network/rpc.rs index 9f4f0e72..0452118e 100644 --- a/homestar-runtime/src/network/rpc.rs +++ b/homestar-runtime/src/network/rpc.rs @@ -47,6 +47,7 @@ pub(crate) enum ServerMessage { /// /// [Workflow]: homestar_core::Workflow RunErr(runner::Error), + /// For skipping server messages. Skip, } diff --git a/homestar-runtime/src/network/webserver.rs b/homestar-runtime/src/network/webserver.rs new file mode 100644 index 00000000..e0332a3e --- /dev/null +++ b/homestar-runtime/src/network/webserver.rs @@ -0,0 +1,430 @@ +//! Sets up a websocket server for sending and receiving messages from browser +//! clients. + +use crate::{runner, runner::WsSender, settings}; +use anyhow::{anyhow, Result}; +use faststr::FastStr; +use homestar_core::Workflow; +use homestar_wasm::io::Arg; +use http::{header::CONTENT_TYPE, Method}; +use jsonrpsee::{ + self, + server::{middleware::ProxyGetRequestLayer, ServerHandle}, +}; +use metrics_exporter_prometheus::PrometheusHandle; +use std::{ + net::{IpAddr, SocketAddr, TcpListener}, + str::FromStr, + time::Duration, +}; +use tokio::runtime::Handle; +#[cfg(feature = "websocket-notify")] +use tokio::sync::broadcast; +use tower_http::cors::{self, CorsLayer}; +use tracing::info; + +pub(crate) mod listener; +#[cfg(feature = "websocket-notify")] +pub(crate) mod notifier; +mod prom; +mod rpc; + +#[cfg(feature = "websocket-notify")] +pub(crate) use notifier::Notifier; +use rpc::{Context, JsonRpc}; + +/// Message type for messages sent back from the +/// websocket server to the [runner] for example. +/// +/// [runner]: crate::Runner +#[allow(dead_code)] +#[derive(Debug)] +pub(crate) enum Message { + /// Error attempting to run a [Workflow]. + RunErr(runner::Error), + /// Run a workflow, given a tuple of name, and [Workflow]. + RunWorkflow((FastStr, Workflow<'static, Arg>)), + /// Acknowledgement of a [Workflow] run. + AckWorkflow, +} + +/// WebSocket server fields. +#[cfg(feature = "websocket-notify")] +#[derive(Clone, Debug)] +pub(crate) struct Server { + /// Address of the websocket server. + addr: SocketAddr, + /// TODO + capacity: usize, + /// Message sender for broadcasting to clients connected to the + /// websocket server. + notifier: Notifier, + /// Receiver timeout for the websocket server. + receiver_timeout: Duration, + /// TODO + webserver_timeout: Duration, +} + +#[cfg(not(feature = "websocket-notify"))] +#[derive(Clone, Debug)] +pub(crate) struct Server { + /// Address of the websocket server. + addr: SocketAddr, + /// TODO + capacity: usize, + /// Receiver timeout for the websocket server. + receiver_timeout: Duration, + /// TODO + webserver_timeout: Duration, +} + +impl Server { + /// Setup bounded, MPMC channel for runtime to send and received messages + /// through the websocket connection(s). + #[cfg(feature = "websocket-notify")] + fn setup_channel( + capacity: usize, + ) -> (broadcast::Sender>, broadcast::Receiver>) { + broadcast::channel(capacity) + } + + #[cfg(feature = "websocket-notify")] + pub(crate) fn new(settings: &settings::Network) -> Result { + let (sender, _receiver) = Self::setup_channel(settings.websocket_capacity); + let host = IpAddr::from_str(&settings.webserver_host.to_string())?; + let port_setting = settings.webserver_port; + let addr = if port_available(host, port_setting) { + SocketAddr::from((host, port_setting)) + } else { + let port = (port_setting..port_setting + 1000) + .find(|port| port_available(host, *port)) + .ok_or_else(|| anyhow!("no free TCP ports available"))?; + SocketAddr::from((host, port)) + }; + + Ok(Self { + addr, + capacity: settings.websocket_capacity, + notifier: Notifier::new(sender), + receiver_timeout: settings.websocket_receiver_timeout, + webserver_timeout: settings.webserver_timeout, + }) + } + + #[cfg(not(feature = "websocket-notify"))] + pub(crate) fn new(settings: &settings::Network) -> Result { + let host = IpAddr::from_str(&settings.webserver_host.to_string())?; + let port_setting = settings.webserver_port; + let addr = if port_available(host, port_setting) { + SocketAddr::from((host, port_setting)) + } else { + let port = (port_setting..port_setting + 1000) + .find(|port| port_available(host, *port)) + .ok_or_else(|| anyhow!("no free TCP ports available"))?; + SocketAddr::from((host, port)) + }; + + Ok(Self { + addr, + capacity: settings.websocket_capacity, + receiver_timeout: settings.websocket_receiver_timeout, + webserver_timeout: settings.webserver_timeout, + }) + } + + /// Start the websocket server. + #[cfg(feature = "websocket-notify")] + pub(crate) async fn start( + &self, + runner_sender: WsSender, + metrics_hdl: PrometheusHandle, + ) -> Result { + let module = JsonRpc::new(Context::new( + metrics_hdl, + self.notifier.clone(), + runner_sender, + self.receiver_timeout, + )) + .await?; + + self.start_inner(module).await + } + + /// Start the websocket server. + #[cfg(not(feature = "websocket-notify"))] + pub(crate) async fn start( + &self, + runner_sender: WsSender, + metrics_hdl: PrometheusHandle, + ) -> Result { + let module = JsonRpc::new(Context::new( + metrics_hdl, + runner_sender, + self.receiver_timeout, + )) + .await?; + self.start_inner(module).await + } + + /// Get websocket message sender for broadcasting messages to websocket + /// clients. + #[cfg(feature = "websocket-notify")] + pub(crate) fn notifier(&self) -> Notifier { + self.notifier.clone() + } + + async fn start_inner(&self, module: JsonRpc) -> Result { + let addr = self.addr; + info!("webserver listening on {}", addr); + + let cors = CorsLayer::new() + // Allow `POST` when accessing the resource + .allow_methods([Method::GET, Method::POST]) + // Allow requests from any origin + .allow_origin(cors::Any) + .allow_headers([CONTENT_TYPE]); + + let middleware = tower::ServiceBuilder::new() + .layer(ProxyGetRequestLayer::new("/health", rpc::HEALTH_ENDPOINT)?) + .layer(ProxyGetRequestLayer::new( + "/metrics", + rpc::METRICS_ENDPOINT, + )?) + .layer(cors) + .timeout(self.webserver_timeout); + + let runtime_hdl = Handle::current(); + + let server = jsonrpsee::server::Server::builder() + .custom_tokio_runtime(runtime_hdl.clone()) + .set_middleware(middleware) + .set_message_buffer_capacity(self.capacity as u32) + .build(addr) + .await + .expect("Webserver to startup"); + + let hdl = server.start(module.into_inner()); + runtime_hdl.spawn(hdl.clone().stopped()); + + Ok(hdl) + } +} + +fn port_available(host: IpAddr, port: u16) -> bool { + TcpListener::bind((host.to_string(), port)).is_ok() +} + +#[cfg(test)] +mod test { + use super::*; + use crate::{metrics, settings::Settings}; + #[cfg(feature = "websocket-notify")] + use homestar_core::{ + ipld::DagJson, + test_utils, + workflow::{config::Resources, instruction::RunInstruction, prf::UcanPrf, Task}, + }; + #[cfg(feature = "websocket-notify")] + use jsonrpsee::core::client::{Subscription, SubscriptionClientT}; + #[cfg(feature = "websocket-notify")] + use jsonrpsee::types::error::ErrorCode; + use jsonrpsee::{core::client::ClientT, rpc_params, ws_client::WsClientBuilder}; + #[cfg(feature = "websocket-notify")] + use notifier::NotifyReceipt; + use tokio::sync::mpsc; + + #[tokio::test] + async fn ws_connect() { + let mut settings = Settings::load().unwrap(); + settings.node.network.metrics_port = 6000; + settings.node.network.webserver_port = 1200; + let server = Server::new(settings.node().network()).unwrap(); + #[cfg(feature = "monitoring")] + let metrics_hdl = metrics::start(settings.monitoring(), settings.node.network()) + .await + .unwrap(); + #[cfg(not(feature = "monitoring"))] + let metrics_hdl = metrics::start(settings.node.network()).await.unwrap(); + let (runner_tx, _runner_rx) = mpsc::channel(1); + server.start(runner_tx, metrics_hdl).await.unwrap(); + + let ws_url = format!("ws://{}", server.addr); + let http_url = format!("http://{}", server.addr); + + tokio_tungstenite::connect_async(ws_url.clone()) + .await + .unwrap(); + + let client = WsClientBuilder::default().build(ws_url).await.unwrap(); + let ws_resp: serde_json::Value = client + .request(rpc::HEALTH_ENDPOINT, rpc_params![]) + .await + .unwrap(); + + assert_eq!(ws_resp, serde_json::json!({"healthy": true})); + let http_resp = reqwest::get(format!("{}/health", http_url)).await.unwrap(); + assert_eq!(http_resp.status(), 200); + let http_resp = http_resp.json::().await.unwrap(); + assert_eq!(http_resp, serde_json::json!({"healthy": true})); + } + + #[cfg(feature = "monitoring")] + #[tokio::test] + async fn ws_metrics_no_prefix() { + let mut settings = Settings::load().unwrap(); + settings.node.network.metrics_port = 6001; + settings.node.network.webserver_port = 1201; + let server = Server::new(settings.node().network()).unwrap(); + + let metrics_hdl = metrics::start(settings.monitoring(), settings.node.network()) + .await + .unwrap(); + let (runner_tx, _runner_rx) = mpsc::channel(1); + server.start(runner_tx, metrics_hdl).await.unwrap(); + + let ws_url = format!("ws://{}", server.addr); + + let client = WsClientBuilder::default().build(ws_url).await.unwrap(); + let ws_resp1: serde_json::Value = client + .request(rpc::METRICS_ENDPOINT, rpc_params![]) + .await + .unwrap(); + + let len = if let serde_json::Value::Array(array) = &ws_resp1["metrics"] { + array.len() + } else { + panic!("expected array"); + }; + + assert!(len > 0); + } + + #[cfg(feature = "websocket-notify")] + #[tokio::test] + async fn ws_subscribe_unsubscribe_network_events() { + let mut settings = Settings::load().unwrap(); + settings.node.network.metrics_port = 6002; + settings.node.network.webserver_port = 1202; + let server = Server::new(settings.node().network()).unwrap(); + #[cfg(feature = "monitoring")] + let metrics_hdl = metrics::start(settings.monitoring(), settings.node.network()) + .await + .unwrap(); + #[cfg(not(feature = "monitoring"))] + let metrics_hdl = metrics::start(settings.node.network()).await.unwrap(); + let (runner_tx, _runner_rx) = mpsc::channel(1); + server.start(runner_tx, metrics_hdl).await.unwrap(); + + let ws_url = format!("ws://{}", server.addr); + + let client1 = WsClientBuilder::default().build(ws_url).await.unwrap(); + let mut sub: Subscription> = client1 + .subscribe( + rpc::SUBSCRIBE_NETWORK_EVENTS_ENDPOINT, + rpc_params![], + rpc::UNSUBSCRIBE_NETWORK_EVENTS_ENDPOINT, + ) + .await + .unwrap(); + + // send any bytes through (vec>, jsonrpsee::core::error::Error> = client + .subscribe( + rpc::SUBSCRIBE_RUN_WORKFLOW_ENDPOINT, + rpc_params![], + rpc::UNSUBSCRIBE_RUN_WORKFLOW_ENDPOINT, + ) + .await; + + assert!(sub.is_err()); + + if let Err(jsonrpsee::core::error::Error::Call(err)) = sub { + let check = ErrorCode::InvalidParams; + assert_eq!(err.code(), check.code()); + } else { + panic!("expected same error code"); + } + } + + #[cfg(feature = "websocket-notify")] + #[tokio::test] + async fn ws_subscribe_workflow_runner_timeout() { + let mut settings = Settings::load().unwrap(); + settings.node.network.metrics_port = 6004; + settings.node.network.webserver_port = 1204; + let server = Server::new(settings.node().network()).unwrap(); + let metrics_hdl = metrics::start(settings.monitoring(), settings.node.network()) + .await + .unwrap(); + let (runner_tx, _runner_rx) = mpsc::channel(1); + server.start(runner_tx, metrics_hdl).await.unwrap(); + + let ws_url = format!("ws://{}", server.addr); + + let config = Resources::default(); + let instruction1 = test_utils::workflow::instruction::(); + let (instruction2, _) = test_utils::workflow::wasm_instruction_with_nonce::(); + + let task1 = Task::new( + RunInstruction::Expanded(instruction1), + config.clone().into(), + UcanPrf::default(), + ); + let task2 = Task::new( + RunInstruction::Expanded(instruction2), + config.into(), + UcanPrf::default(), + ); + + let workflow = Workflow::new(vec![task1.clone(), task2.clone()]); + let run_str = format!( + r#"{{"name": "test","workflow": {}}}"#, + workflow.to_json_string().unwrap() + ); + let run: serde_json::Value = serde_json::from_str(&run_str).unwrap(); + let client = WsClientBuilder::default().build(ws_url).await.unwrap(); + let sub: Result>, jsonrpsee::core::error::Error> = client + .subscribe( + rpc::SUBSCRIBE_RUN_WORKFLOW_ENDPOINT, + rpc_params![run], + rpc::UNSUBSCRIBE_RUN_WORKFLOW_ENDPOINT, + ) + .await; + + assert!(sub.is_err()); + + // Assure error is not on parse of params, but due to runner + // timeout (as runner is not available). + if let Err(jsonrpsee::core::error::Error::Call(err)) = sub { + let check = ErrorCode::InternalError; + assert_eq!(err.code(), check.code()); + } else { + panic!("expected same error code"); + } + } +} diff --git a/homestar-runtime/src/network/ws/listener.rs b/homestar-runtime/src/network/webserver/listener.rs similarity index 87% rename from homestar-runtime/src/network/ws/listener.rs rename to homestar-runtime/src/network/webserver/listener.rs index e933f7d7..47a37c7a 100644 --- a/homestar-runtime/src/network/ws/listener.rs +++ b/homestar-runtime/src/network/webserver/listener.rs @@ -1,9 +1,7 @@ -use std::borrow::Cow; - use faststr::FastStr; use homestar_core::{ipld::DagJson, Workflow}; use homestar_wasm::io::Arg; -use names::Name; +use names::{Generator, Name}; use serde::{de, Deserialize, Deserializer, Serialize}; use serde_json::value::RawValue; @@ -13,7 +11,6 @@ use serde_json::value::RawValue; /// implementation, which is not a direct [Deserialize] implementation. #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub(crate) struct Run<'a> { - pub(crate) action: Cow<'static, str>, #[serde(default = "default_name")] pub(crate) name: FastStr, #[serde(deserialize_with = "from_raw_value")] @@ -21,7 +18,7 @@ pub(crate) struct Run<'a> { } fn default_name() -> FastStr { - let mut name_gen = names::Generator::with_naming(Name::Numbered); + let mut name_gen = Generator::with_naming(Name::Numbered); name_gen .next() .unwrap_or_else(|| "workflow".to_string()) @@ -36,6 +33,12 @@ where Workflow::from_json(raw_value.get().as_bytes()).map_err(de::Error::custom) } +/// Filter metrics by prefix. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub(crate) struct MetricsPrefix { + pub(crate) prefix: String, +} + #[cfg(test)] mod test { use super::*; @@ -64,13 +67,12 @@ mod test { let workflow = Workflow::new(vec![task1.clone(), task2.clone()]); let run = Run { - action: Cow::Borrowed("run"), name: "test".into(), workflow: workflow.clone(), }; let run_str = format!( - r#"{{"action": "run","name": "test","workflow": {}}}"#, + r#"{{"name": "test","workflow": {}}}"#, workflow.to_json_string().unwrap() ); diff --git a/homestar-runtime/src/network/ws/notifier.rs b/homestar-runtime/src/network/webserver/notifier.rs similarity index 100% rename from homestar-runtime/src/network/ws/notifier.rs rename to homestar-runtime/src/network/webserver/notifier.rs diff --git a/homestar-runtime/src/network/webserver/prom.rs b/homestar-runtime/src/network/webserver/prom.rs new file mode 100644 index 00000000..622b8850 --- /dev/null +++ b/homestar-runtime/src/network/webserver/prom.rs @@ -0,0 +1,434 @@ +/// A module to parse prometheus metrics data into json +/// +/// Influenced by https://crates.io/crates/prom2jsonrs/0.1.0. +use anyhow::{anyhow, bail, Result}; +use dyn_clone::DynClone; +use once_cell::sync::Lazy; +use regex::Regex; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; + +const HISTOGRAM_TYPE: &str = "HISTOGRAM"; +const SUMMARY_TYPE: &str = "SUMMARY"; + +static METRIC_REGEX_NO_LABEL: Lazy<&Regex> = Lazy::new(|| { + static RE: once_cell::sync::OnceCell = once_cell::sync::OnceCell::new(); + RE.get_or_init(|| Regex::new(r"([a-zA-Z_:][a-zA-Z0-9_:]*)\s(-?[\d.]+(?:e-?\d+)?|NaN)").unwrap()) +}); + +static METRIC_REGEX_WITH_LABEL: Lazy<&Regex> = Lazy::new(|| { + static RE: once_cell::sync::OnceCell = once_cell::sync::OnceCell::new(); + RE.get_or_init(|| { + Regex::new(r"[a-zA-Z_:][a-zA-Z0-9_:]*\{(.*)\}\s(-?[\d.]+(?:e-?\d+)?|NaN)").unwrap() + }) +}); + +static LABELS_REGEX: Lazy<&Regex> = Lazy::new(|| { + static RE: once_cell::sync::OnceCell = once_cell::sync::OnceCell::new(); + RE.get_or_init(|| Regex::new("([a-zA-Z0-9_:]*)=\"([^\"]+)\"").unwrap()) +}); + +static MULTI_NEWLINE: Lazy<&Regex> = Lazy::new(|| { + static RE: once_cell::sync::OnceCell = once_cell::sync::OnceCell::new(); + RE.get_or_init(|| Regex::new(r"\n\n").unwrap()) +}); + +type Labels = HashMap; +type Value = String; + +#[derive(Clone, Serialize)] +/// A parsed representation of the prometheus metrics data +pub(crate) struct PrometheusData { + metrics: Vec, +} + +impl PrometheusData { + /// Parse promethues metric data from string + pub(crate) fn from_string(s: &str) -> Result { + let text = MULTI_NEWLINE.replace_all(s, "\n"); + let mut metrics = Vec::new(); + let mut metric_lines = Vec::new(); + let mut num_comment_lines = 0; + for line in text.lines() { + if line.starts_with('#') { + if num_comment_lines == 2 { + // One set complete + metrics.push(MetricFamily::from_raw(&metric_lines)?); + metric_lines = vec![line]; + num_comment_lines = 1; + } else { + num_comment_lines += 1; + metric_lines.push(line); + } + } else { + metric_lines.push(line) + } + } + Ok(PrometheusData { metrics }) + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +struct Metric { + labels: Option, + value: Value, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +struct Summary { + labels: Option, + quantiles: Labels, + count: Value, + sum: Value, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +struct Histogram { + labels: Option>, + buckets: Labels, + count: Value, + sum: Value, +} + +#[derive(Debug, Clone, PartialEq, Serialize)] +#[serde(rename_all = "lowercase")] +enum MetricType { + Gauge, + Histogram, + Summary, +} + +#[derive(Clone, Serialize)] +struct MetricFamily { + metric_type: MetricType, + metric_name: String, + help: String, + data: Vec>, +} + +#[typetag::serde(tag = "type")] +trait MetricLike: DynClone { + fn parse_from_string(s: &str) -> Result<(Value, Option)> + where + Self: Sized, + { + if let Some(caps) = METRIC_REGEX_NO_LABEL.captures(s) { + Ok((caps[2].to_string(), None)) + } else if let Some(caps) = METRIC_REGEX_WITH_LABEL.captures(s) { + let value = caps[2].to_string(); + let mut labels: HashMap = HashMap::new(); + for cap in LABELS_REGEX.captures_iter(&caps[1]) { + labels.insert(cap[1].to_string(), cap[2].to_string()); + } + Ok((value, Some(labels))) + } else { + Err(anyhow!("invalid format {}", s)) + } + } + + fn metric_type() -> String + where + Self: Sized; +} + +dyn_clone::clone_trait_object!(MetricLike); + +impl Metric { + fn from_string(s: &str) -> Result { + let (value, labels) = Self::parse_from_string(s)?; + Ok(Metric { labels, value }) + } +} + +#[typetag::serde(name = "metric")] +impl MetricLike for Metric { + fn metric_type() -> String { + String::from("DEFAULT") + } +} + +impl Summary { + fn from_raw(metric_name: &str, raw_lines: &Vec<&str>) -> Result { + let mut sum = String::from(""); + let mut count = String::from(""); + let sum_prefix = format!("{}_sum", metric_name); + let count_prefix = format!("{}_count", metric_name); + let mut labels = HashMap::new(); + let mut quantiles = HashMap::new(); + for raw_line in raw_lines { + if raw_line.starts_with(&sum_prefix) { + sum = Summary::parse_from_string(raw_line)?.0; + } else if raw_line.starts_with(&count_prefix) { + count = Summary::parse_from_string(raw_line)?.0; + } else if let Some(caps) = METRIC_REGEX_WITH_LABEL.captures(raw_line) { + for cap in LABELS_REGEX.captures_iter(&caps[1]) { + let key = &cap[1]; + let value = &cap[2]; + match key { + "quantile" => quantiles.insert(key.to_string(), value.to_string()), + _ => labels.insert(key.to_string(), value.to_string()), + }; + } + } else { + bail!("invalid format {}", raw_line); + } + } + + Ok(Summary { + sum, + count, + labels: Some(labels), + quantiles, + }) + } +} + +#[typetag::serde] +impl MetricLike for Summary { + fn metric_type() -> String { + String::from(SUMMARY_TYPE) + } +} + +impl Histogram { + fn from_raw(metric_name: &str, raw_lines: &Vec<&str>) -> Result { + let mut sum = String::from(""); + let mut count = String::from(""); + let sum_prefix = format!("{}_sum", metric_name); + let count_prefix = format!("{}_count", metric_name); + let mut labels: HashMap = HashMap::new(); + let mut buckets: HashMap = HashMap::new(); + for raw_line in raw_lines { + if raw_line.starts_with(&sum_prefix) { + sum = Summary::parse_from_string(raw_line)?.0; + } else if raw_line.starts_with(&count_prefix) { + count = Summary::parse_from_string(raw_line)?.0; + } else if let Some(caps) = METRIC_REGEX_WITH_LABEL.captures(raw_line) { + for cap in LABELS_REGEX.captures_iter(&caps[1]) { + let key = &cap[1]; + let value = &cap[2]; + match key { + "le" => buckets.insert(value.to_string(), caps[2].to_string()), + _ => labels.insert(key.to_string(), value.to_string()), + }; + } + } else { + bail!("invalid format {}", raw_line) + } + } + + Ok(Histogram { + sum, + count, + labels: Some(labels), + buckets, + }) + } +} + +#[typetag::serde] +impl MetricLike for Histogram { + fn metric_type() -> String { + String::from(HISTOGRAM_TYPE) + } +} + +impl MetricFamily { + fn from_raw(raw: &[&str]) -> Result { + let mut raw_iter = raw.iter(); + let help = MetricFamily::metric_help_fron_raw( + raw_iter + .next() + .ok_or(anyhow!("invalid metric help{}", raw.join("\n")))?, + ); + let (metric_name, metric_type) = MetricFamily::metric_name_and_type( + raw_iter + .next() + .ok_or(anyhow!("invalid metric name/type {}", raw.join("\n")))?, + )?; + let mut data: Vec> = Vec::new(); + match metric_type { + MetricType::Gauge => { + for raw_line in raw_iter { + data.push(Box::new(Metric::from_string(raw_line)?)) + } + } + MetricType::Histogram => { + let count_prefix = format!("{}_count", metric_name); + let mut histogram_lines: Vec<&str> = Vec::new(); + for raw_line in raw_iter { + histogram_lines.push(raw_line); + if raw_line.starts_with(&count_prefix) { + data.push(Box::new(Histogram::from_raw( + &metric_name, + &histogram_lines, + )?)); + histogram_lines = Vec::new(); + } + } + } + MetricType::Summary => { + let count_prefix = format!("{}_count", metric_name); + let mut summary_lines: Vec<&str> = Vec::new(); + for raw_line in raw_iter { + summary_lines.push(raw_line); + if raw_line.starts_with(&count_prefix) { + data.push(Box::new(Summary::from_raw(&metric_name, &summary_lines)?)); + summary_lines = Vec::new(); + } + } + } + } + Ok(MetricFamily { + metric_type, + metric_name, + help, + data, + }) + } + + fn metric_name_and_type(type_line: &str) -> Result<(String, MetricType)> { + let tags: Vec<&str> = type_line.split_whitespace().collect(); + let (name, type_raw) = (tags[2], tags[3]); + let metric_type = match type_raw { + "gauge" => MetricType::Gauge, + "counter" => MetricType::Gauge, + "histogram" => MetricType::Histogram, + "summary" => MetricType::Summary, + _ => bail!("invalid metric type {}", type_raw), + }; + + Ok((name.to_string(), metric_type)) + } + + fn metric_help_fron_raw(help_line: &str) -> String { + let tags: Vec<&str> = help_line.split_whitespace().collect(); + tags[3..].join(" ").to_string() + } +} + +#[cfg(test)] +mod test { + use super::*; + use maplit::hashmap; + + #[test] + fn parse_metric() { + assert_eq!( + Metric { + labels: None, + value: String::from("205632") + }, + Metric::from_string("go_memstats_mspan_inuse_bytes 205632").unwrap() + ); + assert_eq!( + Metric { + labels: Some(hashmap!{ + "dialer_name".to_string() => "default".to_string(), + "reason".to_string() => "unknown".to_string(), + }), + value: String::from("0") + }, + Metric::from_string("net_conntrack_dialer_conn_failed_total{dialer_name=\"default\",reason=\"unknown\"} 0").unwrap() + ) + } + + #[test] + fn parse_metric_raw_data() { + let raw_data = "# HELP go_goroutines Number of goroutines that currently exist. +# TYPE go_goroutines gauge +go_goroutines 31 +# HELP go_info Information about the Go environment. +# TYPE go_info gauge +go_info{version=\"go1.15.5\"} 1"; + let prom_data = PrometheusData::from_string(raw_data).unwrap(); + assert_eq!(MetricType::Gauge, prom_data.metrics[0].metric_type) + } + + #[test] + fn parse_metric_summary() { + let raw_data = + "prometheus_engine_query_duration_seconds{slice=\"inner_eval\",quantile=\"0.5\"} NaN +prometheus_engine_query_duration_seconds{slice=\"inner_eval\",quantile=\"0.9\"} NaN +prometheus_engine_query_duration_seconds{slice=\"inner_eval\",quantile=\"0.99\"} NaN +prometheus_engine_query_duration_seconds_sum{slice=\"inner_eval\"} 12 +prometheus_engine_query_duration_seconds_count{slice=\"inner_eval\"} 0"; + let summary = Summary::from_raw( + "prometheus_engine_query_duration_seconds", + &raw_data.lines().collect(), + ) + .unwrap(); + assert_eq!(summary.sum, "12".to_string()); + assert_eq!( + summary.labels, + Some(hashmap! {"slice".to_string() => "inner_eval".to_string()}) + ); + } + + #[test] + fn parse_metric_histogram() { + let raw_data = r#"prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="0.1"} 10871 +prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="0.2"} 10871 +prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="0.4"} 10871 +prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="1"} 10871 +prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="3"} 10871 +prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="8"} 10871 +prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="20"} 10871 +prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="60"} 10871 +prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="120"} 10871 +prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="+Inf"} 10871 +prometheus_http_request_duration_seconds_sum{handler="/metrics"} 67.48398663499978 +prometheus_http_request_duration_seconds_count{handler="/metrics"} 10871"#; + let histogram = Histogram::from_raw( + "prometheus_http_request_duration_seconds", + &raw_data.lines().collect(), + ) + .unwrap(); + assert_eq!(histogram.sum, "67.48398663499978"); + assert_eq!( + histogram.labels, + Some(hashmap! {"handler".to_string() => "/metrics".to_string()}) + ); + } + + #[test] + fn parse_metric_collection_to_json() { + let raw_data = r#"# HELP homestar_process_disk_total_read_bytes Total bytes read from disk. +# TYPE homestar_process_disk_total_read_bytes gauge +homestar_process_disk_total_read_bytes 45969408 + +# HELP homestar_process_virtual_memory_bytes The virtual memory size in bytes. +# TYPE homestar_process_virtual_memory_bytes gauge +homestar_process_virtual_memory_bytes 418935930880 + +# HELP homestar_network_received_bytes The bytes received since last refresh. +# TYPE homestar_network_received_bytes gauge +homestar_network_received_bytes 0 + +# HELP homestar_system_available_memory_bytes The amount of available memory. +# TYPE homestar_system_available_memory_bytes gauge +homestar_system_available_memory_bytes 0 + +# HELP homestar_system_disk_available_space_bytes The total amount of available disk space. +# TYPE homestar_system_disk_available_space_bytes gauge +homestar_system_disk_available_space_bytes 0 + +# HELP homestar_system_load_average_percentage The load average over a five minute interval. +# TYPE homestar_system_load_average_percentage gauge +homestar_system_load_average_percentage 6.26611328125"#; + + let prom_data = PrometheusData::from_string(raw_data).unwrap(); + let json_string = serde_json::to_string(&prom_data).unwrap(); + let root: serde_json::Value = serde_json::from_str(&json_string).unwrap(); + + let check = root + .get("metrics") + .and_then(|v| v.get(0)) + .and_then(|v| v.get("data")) + .and_then(|v| v.get(0)) + .and_then(|v| v.get("value")) + .unwrap(); + + assert_eq!(check, &serde_json::Value::String("45969408".to_string())); + } +} diff --git a/homestar-runtime/src/network/webserver/rpc.rs b/homestar-runtime/src/network/webserver/rpc.rs new file mode 100644 index 00000000..da449917 --- /dev/null +++ b/homestar-runtime/src/network/webserver/rpc.rs @@ -0,0 +1,235 @@ +use super::{listener, prom::PrometheusData}; +#[cfg(feature = "websocket-notify")] +use super::{Message, Notifier}; +use crate::runner::WsSender; +#[cfg(feature = "websocket-notify")] +use anyhow::anyhow; +use anyhow::Result; +#[cfg(feature = "websocket-notify")] +use futures::StreamExt; +use jsonrpsee::{ + server::RpcModule, + types::{error::ErrorCode, ErrorObjectOwned}, +}; +#[cfg(feature = "websocket-notify")] +use jsonrpsee::{SubscriptionMessage, SubscriptionSink, TrySendError}; +use metrics_exporter_prometheus::PrometheusHandle; +use std::time::Duration; +#[cfg(feature = "websocket-notify")] +use tokio::{ + runtime::Handle, + select, + sync::oneshot, + time::{self, Instant}, +}; +#[cfg(feature = "websocket-notify")] +use tokio_stream::wrappers::BroadcastStream; +#[cfg(feature = "websocket-notify")] +use tracing::{error, info, warn}; + +/// Health endpoint. +pub(crate) const HEALTH_ENDPOINT: &str = "health"; +/// Metrics endpoint for prometheus / openmetrics polling. +pub(crate) const METRICS_ENDPOINT: &str = "metrics"; + +/// Run a workflow and subscribe to that workflow's events. +#[cfg(feature = "websocket-notify")] +pub(crate) const SUBSCRIBE_RUN_WORKFLOW_ENDPOINT: &str = "subscribe_run_workflow"; +/// Unsubscribe from a workflow's events. +#[cfg(feature = "websocket-notify")] +pub(crate) const UNSUBSCRIBE_RUN_WORKFLOW_ENDPOINT: &str = "unsubscribe_run_workflow"; +/// Subscribe to network events. +#[cfg(feature = "websocket-notify")] +pub(crate) const SUBSCRIBE_NETWORK_EVENTS_ENDPOINT: &str = "subscribe_network_events"; +/// Unsubscribe from network events. +#[cfg(feature = "websocket-notify")] +pub(crate) const UNSUBSCRIBE_NETWORK_EVENTS_ENDPOINT: &str = "unsubscribe_network_events"; + +/// TODO +#[cfg(feature = "websocket-notify")] +pub(crate) struct Context { + metrics_hdl: PrometheusHandle, + notifier: Notifier, + runner_sender: WsSender, + receiver_timeout: Duration, +} + +/// TODO +#[allow(dead_code)] +#[cfg(not(feature = "websocket-notify"))] +pub(crate) struct Context { + metrics_hdl: PrometheusHandle, + runner_sender: WsSender, + receiver_timeout: Duration, +} + +impl Context { + /// TODO + #[cfg(feature = "websocket-notify")] + #[cfg_attr(docsrs, doc(cfg(feature = "websocket-notify")))] + pub(crate) fn new( + metrics_hdl: PrometheusHandle, + notifier: Notifier, + runner_sender: WsSender, + receiver_timeout: Duration, + ) -> Self { + Self { + metrics_hdl, + notifier, + runner_sender, + receiver_timeout, + } + } + + /// TODO + #[cfg(not(feature = "websocket-notify"))] + pub(crate) fn new( + metrics_hdl: PrometheusHandle, + runner_sender: WsSender, + receiver_timeout: Duration, + ) -> Self { + Self { + metrics_hdl, + runner_sender, + receiver_timeout, + } + } +} + +/// TODO +pub(crate) struct JsonRpc(RpcModule); + +impl JsonRpc { + /// Create a new [JsonRpc] instance, registering methods on initialization. + pub(crate) async fn new(ctx: Context) -> Result { + let module = Self::register(ctx).await?; + Ok(Self(module)) + } + + #[allow(dead_code)] + /// Get a reference to the inner [RpcModule]. + pub(crate) fn inner(&self) -> &RpcModule { + &self.0 + } + + /// Get and take ownership of the inner [RpcModule]. + pub(crate) fn into_inner(self) -> RpcModule { + self.0 + } + + async fn register(ctx: Context) -> Result> { + let mut module = RpcModule::new(ctx); + + module.register_async_method(HEALTH_ENDPOINT, |_, _| async move { + serde_json::json!({ "healthy": true }) + })?; + + module.register_async_method(METRICS_ENDPOINT, |params, ctx| async move { + let render = ctx.metrics_hdl.render(); + + // TODO: Handle prefix specific metrics in parser. + match params.one::() { + Ok(listener::MetricsPrefix { prefix: _prefix }) => { + PrometheusData::from_string(&render) + .map_err(|_err| ErrorObjectOwned::from(ErrorCode::InternalError)) + } + Err(_) => PrometheusData::from_string(&render) + .map_err(|_err| ErrorObjectOwned::from(ErrorCode::InternalError)), + } + })?; + + #[cfg(feature = "websocket-notify")] + module.register_subscription( + SUBSCRIBE_NETWORK_EVENTS_ENDPOINT, + SUBSCRIBE_NETWORK_EVENTS_ENDPOINT, + UNSUBSCRIBE_NETWORK_EVENTS_ENDPOINT, + |_, pending, ctx| async move { + let sink = pending.accept().await?; + let rx = ctx.notifier.inner().subscribe(); + let stream = BroadcastStream::new(rx); + Self::handle_event_subscription(sink, stream).await?; + Ok(()) + }, + )?; + + #[cfg(feature = "websocket-notify")] + module.register_subscription( + SUBSCRIBE_RUN_WORKFLOW_ENDPOINT, + SUBSCRIBE_RUN_WORKFLOW_ENDPOINT, + UNSUBSCRIBE_RUN_WORKFLOW_ENDPOINT, + |params, pending, ctx| async move { + match params.one::>() { + Ok(listener::Run { name, workflow }) => { + let (tx, rx) = oneshot::channel(); + ctx.runner_sender + .send((Message::RunWorkflow((name, workflow)), Some(tx))) + .await?; + + if (time::timeout_at(Instant::now() + ctx.receiver_timeout, rx).await) + .is_err() + { + error!("did not acknowledge message in time"); + let _ = pending + .reject(ErrorObjectOwned::from(ErrorObjectOwned::from( + ErrorCode::InternalError, + ))) + .await; + return Ok(()); + } + } + Err(err) => { + warn!("failed to parse run workflow params: {}", err); + let _ = pending.reject(err).await; + return Ok(()); + } + } + let sink = pending.accept().await?; + let rx = ctx.notifier.inner().subscribe(); + let stream = BroadcastStream::new(rx); + Self::handle_event_subscription(sink, stream).await?; + Ok(()) + }, + )?; + + Ok(module) + } + + #[cfg(feature = "websocket-notify")] + async fn handle_event_subscription( + mut sink: SubscriptionSink, + mut stream: BroadcastStream>, + ) -> Result<()> { + let rt_hdl = Handle::current(); + rt_hdl.spawn(async move { + loop { + select! { + _ = sink.closed() => { + break Ok(()); + } + next_msg = stream.next() => { + let msg = match next_msg { + Some(Ok(msg)) => msg, + Some(Err(err)) => { + error!("subscription stream error: {}", err); + break Err(err.into()); + } + None => break Ok(()), + }; + let sub_msg = SubscriptionMessage::from_json(&msg)?; + match sink.try_send(sub_msg) { + Ok(()) => (), + Err(TrySendError::Closed(_)) => { + break Err(anyhow!("subscription sink closed")); + } + Err(TrySendError::Full(_)) => { + info!("subscription sink full"); + } + } + } + } + } + }); + + Ok(()) + } +} diff --git a/homestar-runtime/src/network/ws.rs b/homestar-runtime/src/network/ws.rs deleted file mode 100644 index 0493cb10..00000000 --- a/homestar-runtime/src/network/ws.rs +++ /dev/null @@ -1,325 +0,0 @@ -//! Sets up a websocket server for sending and receiving messages from browser -//! clients. - -use crate::{ - channel::AsyncBoundedChannelReceiver, - runner::{self, WsSender}, - settings, -}; -use anyhow::{anyhow, Result}; -use axum::{ - extract::{ - ws::{self, Message as AxumMsg, WebSocketUpgrade}, - ConnectInfo, State, TypedHeader, - }, - response::IntoResponse, - routing::get, - Router, -}; -use faststr::FastStr; -use futures::{stream::StreamExt, SinkExt}; -use homestar_core::Workflow; -use homestar_wasm::io::Arg; -use std::{ - net::{IpAddr, SocketAddr, TcpListener}, - ops::ControlFlow, - str::FromStr, - time::Duration, -}; -use tokio::{ - runtime::Handle, - select, - sync::{broadcast, oneshot}, - time::{self, Instant}, -}; -use tracing::{debug, error, info, warn}; - -#[cfg(feature = "websocket-notify")] -pub(crate) mod listener; -#[cfg(feature = "websocket-notify")] -pub(crate) mod notifier; -#[cfg(feature = "websocket-notify")] -pub(crate) use notifier::Notifier; - -/// Message type for messages sent back from the -/// websocket server to the [runner] for example. -/// -/// [runner]: crate::Runner -#[allow(dead_code)] -#[derive(Debug)] -pub(crate) enum Message { - /// Notify the listener that the websocket server is shutting down - /// gracefully. - GracefulShutdown(oneshot::Sender<()>), - /// Error attempting to run a [Workflow]. - RunErr(runner::Error), - /// Run a workflow, given a tuple of name, and [Workflow]. - RunWorkflow((FastStr, Workflow<'static, Arg>)), - /// Acknowledgement of a [Workflow] run. - /// - /// TODO: Temporary Ack until we define semantics for JSON-RPC or similar. - RunWorkflowAck, -} - -/// WebSocket server fields. -#[allow(dead_code)] -#[derive(Clone, Debug)] -pub(crate) struct Server { - /// Address of the websocket server. - addr: SocketAddr, - /// Message sender for broadcasting to clients connected to the - /// websocket server. - notifier: Notifier, - /// Receiver timeout for the websocket server. - receiver_timeout: Duration, -} - -/// State used for the websocket server routes. -#[derive(Clone, Debug)] -struct ServerState { - notifier: Notifier, - runner_sender: WsSender, - receiver_timeout: Duration, -} - -impl Server { - /// Setup bounded, MPMC channel for runtime to send and received messages - /// through the websocket connection(s). - fn setup_channel( - capacity: usize, - ) -> (broadcast::Sender>, broadcast::Receiver>) { - broadcast::channel(capacity) - } - - pub(crate) fn new(settings: &settings::Network) -> Result { - let (sender, _receiver) = Self::setup_channel(settings.websocket_capacity); - - let host = IpAddr::from_str(&settings.websocket_host.to_string())?; - let port_setting = settings.websocket_port; - let addr = if port_available(host, port_setting) { - SocketAddr::from((host, port_setting)) - } else { - let port = (port_setting..port_setting + 1000) - .find(|port| port_available(host, *port)) - .ok_or_else(|| anyhow!("no free TCP ports available"))?; - SocketAddr::from((host, port)) - }; - - Ok(Self { - addr, - notifier: Notifier::new(sender), - receiver_timeout: settings.websocket_receiver_timeout, - }) - } - - /// Start the websocket server given settings. - pub(crate) async fn start( - &self, - rx: AsyncBoundedChannelReceiver, - runner_sender: WsSender, - ) -> Result<()> { - let addr = self.addr; - info!("websocket server listening on {}", addr); - let app = Router::new().route( - "/", - get(ws_handler).with_state(ServerState { - notifier: self.notifier.clone(), - runner_sender, - receiver_timeout: self.receiver_timeout, - }), - ); - - axum::Server::bind(&addr) - .serve(app.into_make_service_with_connect_info::()) - .with_graceful_shutdown(async { - if let Ok(Message::GracefulShutdown(tx)) = rx.recv_async().await { - info!("websocket server shutting down"); - let _ = tx.send(()); - } - }) - .await?; - - Ok(()) - } - - /// Get websocket message sender for broadcasting messages to websocket - /// clients. - pub(crate) fn notifier(&self) -> Notifier { - self.notifier.clone() - } -} - -async fn ws_handler( - ws: WebSocketUpgrade, - user_agent: Option>, - State(state): State, - ConnectInfo(addr): ConnectInfo, -) -> impl IntoResponse { - let user_agent = if let Some(TypedHeader(user_agent)) = user_agent { - user_agent.to_string() - } else { - String::from("Unknown browser") - }; - info!("`{user_agent}` at {addr} connected."); - - // Finalize the upgrade process by returning upgrade callback. - // We can customize the callback by sending additional info such as address. - ws.on_upgrade(move |socket| handle_socket(socket, addr, state)) -} - -async fn handle_socket(mut socket: ws::WebSocket, addr: SocketAddr, state: ServerState) { - // Send a ping (unsupported by some browsers) just to kick things off and - // get a response. - if socket.send(AxumMsg::Ping(vec![1, 2, 3])).await.is_ok() { - debug!("Pinged {}...", addr); - } else { - info!("Could not send ping {}!", addr); - // no Error here since the only thing we can do is to close the connection. - // If we can not send messages, there is no way to salvage the statemachine anyway. - return; - } - - // Receive single message from a client (we can either receive or send with - // the socket). This will likely be the Pong for our Ping or a processed - // message from client. - // Waiting for message from a client will block this task, but will not - // block other client's connections. - if let Some(msg) = socket.recv().await { - if let Ok(msg) = msg { - if process_message(msg, addr, &state).await.is_break() { - return; - } - } else { - info!("client {} abruptly disconnected", addr); - return; - } - } - - // By splitting socket we can send and receive at the same time. - let (mut socket_sender, mut socket_receiver) = socket.split(); - let mut subscribed_rx = state.notifier.inner().subscribe(); - let handle = Handle::current(); - - let mut send_task = handle.spawn(async move { - while let Ok(msg) = subscribed_rx.recv().await { - // In any websocket error, break loop. - if socket_sender.send(AxumMsg::Binary(msg)).await.is_err() { - break; - } - } - }); - - let mut recv_task = handle.spawn(async move { - let mut cnt = 0; - while let Some(Ok(msg)) = socket_receiver.next().await { - cnt += 1; - if process_message(msg, addr, &state).await.is_break() { - break; - } - } - cnt - }); - - // If any one of the tasks exit, abort the other. - select! { - _ = (&mut send_task) => recv_task.abort(), - _ = (&mut recv_task) => send_task.abort(), - }; - - info!("Websocket context {} destroyed", addr); -} - -/// Process [messages]. -/// -/// [messages]: Message -async fn process_message( - msg: AxumMsg, - addr: SocketAddr, - state: &ServerState, -) -> ControlFlow<(), ()> { - match msg { - AxumMsg::Text(t) => { - debug!(">>> {} sent str: {:?}", addr, t); - } - AxumMsg::Binary(bytes) => { - debug!(">>> {} sent {}", addr, bytes.len()); - match serde_json::from_slice::>(&bytes) { - Ok(listener::Run { - action, - name, - workflow, - }) if action.eq("run") => { - let (tx, rx) = oneshot::channel(); - if let Err(err) = state - .runner_sender - .send((Message::RunWorkflow((name, workflow)), Some(tx))) - .await - { - error!(err=?err, "error sending message to runner"); - } - - if (time::timeout_at(Instant::now() + state.receiver_timeout, rx).await) - .is_err() - { - error!("did not acknowledge action=run message in time"); - } - } - Ok(_) => warn!("unknown action or message shape"), - // another message - Err(_err) => debug!( - "{}", - std::str::from_utf8(&bytes).unwrap_or(format!("{:?}", bytes).as_ref()) - ), - } - } - AxumMsg::Close(c) => { - if let Some(cf) = c { - info!( - ">>> {} sent close with code {} and reason `{}`", - addr, cf.code, cf.reason - ); - } else { - info!(">>> {} sent close message without CloseFrame", addr); - } - return ControlFlow::Break(()); - } - - AxumMsg::Pong(v) => { - debug!(">>> {} sent pong with {:?}", addr, v); - } - // You should never need to manually handle AxumMsg::Ping, as axum's websocket library - // will do so for you automagically by replying with Pong and copying the v according to - // spec. But if you need the contents of the pings you can see them here. - AxumMsg::Ping(v) => { - debug!(">>> {} sent ping with {:?}", addr, v); - } - } - ControlFlow::Continue(()) -} - -fn port_available(host: IpAddr, port: u16) -> bool { - TcpListener::bind((host.to_string(), port)).is_ok() -} - -#[cfg(test)] -mod test { - use super::*; - use crate::{channel, settings::Settings}; - use tokio::sync::mpsc; - - #[tokio::test] - async fn ws_connect() { - let settings = Settings::load().unwrap(); - let server = Server::new(settings.node().network()).unwrap(); - let (_ws_tx, ws_rx) = channel::AsyncBoundedChannel::oneshot(); - let (runner_tx, _runner_rx) = mpsc::channel(1); - let _ws_hdl = tokio::spawn({ - let ws_server = server.clone(); - async move { ws_server.start(ws_rx, runner_tx).await } - }); - - tokio_tungstenite::connect_async("ws://localhost:1337".to_string()) - .await - .unwrap(); - } -} diff --git a/homestar-runtime/src/runner.rs b/homestar-runtime/src/runner.rs index 0d721a48..4708aece 100644 --- a/homestar-runtime/src/runner.rs +++ b/homestar-runtime/src/runner.rs @@ -1,16 +1,14 @@ //! General [Runner] interface for working across multiple workers //! and executing workflows. -#[cfg(feature = "websocket-server")] -use crate::network::ws; #[cfg(feature = "ipfs")] use crate::network::IpfsCli; use crate::{ - channel::{AsyncBoundedChannel, AsyncBoundedChannelReceiver, AsyncBoundedChannelSender}, + channel::AsyncBoundedChannelSender, db::Database, event_handler::{Event, EventHandler}, metrics, - network::{rpc, swarm}, + network::{rpc, swarm, webserver}, worker::WorkerMessage, workflow, Settings, Worker, }; @@ -22,7 +20,9 @@ use faststr::FastStr; use futures::future::poll_fn; use homestar_core::Workflow; use homestar_wasm::io::Arg; +use jsonrpsee::server::ServerHandle; use libipld::Cid; +use metrics_exporter_prometheus::PrometheusHandle; #[cfg(not(test))] use std::sync::atomic::{AtomicUsize, Ordering}; use std::{ops::ControlFlow, rc::Rc, sync::Arc, task::Poll}; @@ -72,12 +72,16 @@ pub(crate) type RpcReceiver = mpsc::Receiver<( )>; /// [mpsc::Sender] for sending messages websocket server clients. -#[cfg(feature = "websocket-server")] -pub(crate) type WsSender = mpsc::Sender<(ws::Message, Option>)>; +pub(crate) type WsSender = mpsc::Sender<( + webserver::Message, + Option>, +)>; /// [mpsc::Receiver] for receiving messages from websocket server clients. -#[cfg(feature = "websocket-server")] -pub(crate) type WsReceiver = mpsc::Receiver<(ws::Message, Option>)>; +pub(crate) type WsReceiver = mpsc::Receiver<( + webserver::Message, + Option>, +)>; impl ModifiedSet for RunningTaskSet { fn append_or_insert(&self, cid: Cid, mut handles: Vec) { @@ -93,26 +97,6 @@ impl ModifiedSet for RunningTaskSet { /// Used to manage workers and execute/run [Workflows]. /// /// [Workflows]: homestar_core::Workflow -#[cfg(feature = "websocket-server")] -#[cfg_attr(docsrs, doc(cfg(feature = "websocket-server")))] -#[allow(dead_code)] -#[derive(Debug)] -pub struct Runner { - event_sender: Arc>, - expiration_queue: Rc>>, - running_tasks: Arc, - running_workers: RunningWorkerSet, - runtime: tokio::runtime::Runtime, - settings: Arc, - ws_server: Arc, -} - -/// Runner interface. -/// Used to manage workers and execute/run [Workflows]. -/// -/// [Workflows]: homestar_core::Workflow -#[cfg(not(feature = "websocket-server"))] -#[allow(dead_code)] #[derive(Debug)] pub struct Runner { event_sender: Arc>, @@ -121,6 +105,7 @@ pub struct Runner { running_workers: RunningWorkerSet, runtime: tokio::runtime::Runtime, settings: Arc, + webserver: Arc, } impl Runner { @@ -136,20 +121,8 @@ impl Runner { mpsc::channel(capacity) } - /// Oneshot channel for sending direct messages to the websocket server, - /// e.g. for shutdown. - #[cfg(feature = "websocket-server")] - pub(crate) fn setup_ws_oneshot_channel() -> ( - AsyncBoundedChannelSender, - AsyncBoundedChannelReceiver, - ) { - let (tx, rx) = AsyncBoundedChannel::oneshot(); - (tx, rx) - } - /// MPSC channel for sending and receiving messages through to/from /// websocket server clients. - #[cfg(feature = "websocket-server")] pub(crate) fn setup_ws_mpsc_channel(capacity: usize) -> (WsSender, WsReceiver) { mpsc::channel(capacity) } @@ -187,57 +160,35 @@ impl Runner { ) -> Result { let swarm = runtime.block_on(swarm::new(settings.node()))?; - #[cfg(feature = "websocket-server")] - { - let ws_server = ws::Server::new(settings.node().network())?; - let ws_msg_tx = ws_server.notifier(); - - let event_handler = EventHandler::new(swarm, db, settings.node(), ws_msg_tx); - let event_sender = event_handler.sender(); - - #[cfg(feature = "ipfs")] - let _event_handler_hdl = runtime.spawn({ - let ipfs = IpfsCli::default(); - event_handler.start(ipfs) - }); - - #[cfg(not(feature = "ipfs"))] - let _event_handler_hdl = runtime.spawn(event_handler.start()); - - Ok(Self { - event_sender, - expiration_queue: Rc::new(AtomicRefCell::new(DelayQueue::new())), - running_tasks: DashMap::new().into(), - running_workers: DashMap::new(), - runtime, - settings: settings.into(), - ws_server: ws_server.into(), - }) - } + let webserver = webserver::Server::new(settings.node().network())?; + #[cfg(feature = "websocket-notify")] + let ws_msg_tx = webserver.notifier(); - #[cfg(not(feature = "websocket-server"))] - { - let event_handler = EventHandler::new(swarm, db, settings.node()); - let event_sender = event_handler.sender(); - - #[cfg(feature = "ipfs")] - let _event_handler_hdl = runtime.spawn({ - let ipfs = IpfsCli::default(); - event_handler.start(ipfs) - }); - - #[cfg(not(feature = "ipfs"))] - let _event_handler_hdl = runtime.spawn(event_handler.start()); - - Ok(Self { - event_sender, - expiration_queue: Rc::new(AtomicRefCell::new(DelayQueue::new())), - running_tasks: DashMap::new().into(), - running_workers: DashMap::new(), - runtime, - settings: settings.into(), - }) - } + #[cfg(feature = "websocket-notify")] + let event_handler = EventHandler::new(swarm, db, settings.node(), ws_msg_tx); + #[cfg(not(feature = "websocket-notify"))] + let event_handler = EventHandler::new(swarm, db, settings.node()); + + let event_sender = event_handler.sender(); + + #[cfg(feature = "ipfs")] + let _event_handler_hdl = runtime.spawn({ + let ipfs = IpfsCli::default(); + event_handler.start(ipfs) + }); + + #[cfg(not(feature = "ipfs"))] + let _event_handler_hdl = runtime.spawn(event_handler.start()); + + Ok(Self { + event_sender, + expiration_queue: Rc::new(AtomicRefCell::new(DelayQueue::new())), + running_tasks: DashMap::new().into(), + running_workers: DashMap::new(), + runtime, + settings: settings.into(), + webserver: webserver.into(), + }) } /// Listen loop for [Runner] signals and messages. @@ -245,25 +196,29 @@ impl Runner { fn serve(self, db: impl Database + 'static) -> Result<()> { let message_buffer_len = self.settings.node.network.events_buffer_len; - #[cfg(feature = "websocket-server")] - let (ws_sender, mut ws_receiver) = { - let (oneshot_ws_tx, oneshot_ws_rx) = Self::setup_ws_oneshot_channel(); + #[cfg(feature = "monitoring")] + let metrics_hdl: PrometheusHandle = self.runtime.block_on(metrics::start( + self.settings.monitoring(), + self.settings.node.network(), + ))?; + + #[cfg(not(feature = "monitoring"))] + let metrics_hdl: PrometheusHandle = self + .runtime + .block_on(metrics::start(self.settings.node.network()))?; + + let (mut ws_receiver, ws_hdl) = { let (mpsc_ws_tx, mpsc_ws_rx) = Self::setup_ws_mpsc_channel(message_buffer_len); - let _ws_hdl = self.runtime.spawn({ - let ws_server = self.ws_server.clone(); - async move { ws_server.start(oneshot_ws_rx, mpsc_ws_tx).await } - }); - (oneshot_ws_tx, mpsc_ws_rx) + let ws_hdl = self + .runtime + .block_on(self.webserver.start(mpsc_ws_tx, metrics_hdl))?; + (mpsc_ws_rx, ws_hdl) }; let (rpc_tx, mut rpc_rx) = Self::setup_rpc_channel(message_buffer_len); let (runner_worker_tx, mut runner_worker_rx) = Self::setup_worker_channel(message_buffer_len); - #[cfg(feature = "metrics")] - self.runtime - .block_on(metrics::start(&self.settings.monitoring))?; - let shutdown_timeout = self.settings.node.shutdown_timeout; let rpc_server = rpc::Server::new(self.settings.node.network(), rpc_tx.into()); let rpc_sender = rpc_server.sender(); @@ -272,39 +227,22 @@ impl Runner { let shutdown_time_left = self.runtime.block_on(async { let mut gc_interval = tokio::time::interval(self.settings.node.gc_interval); loop { - // Sadness to get around https://github.com/tokio-rs/tokio/issues/3974. - #[cfg(feature = "websocket-server")] - let ws_receiver_wait = ws_receiver.recv(); - #[cfg(not(feature = "websocket-server"))] - let ws_receiver_wait: future::Pending> = std::future::pending(); - select! { biased; // Handle RPC messages. Some((rpc_message, Some(oneshot_tx))) = rpc_rx.recv() => { let now = time::Instant::now(); - #[cfg(feature = "websocket-server")] let handle = self.handle_command_message( rpc_message, Channels { rpc: rpc_sender.clone(), runner: runner_worker_tx.clone(), - ws: ws_sender.clone(), }, + ws_hdl.clone(), db.clone(), now ).await; - #[cfg(not(feature = "websocket-server"))] - let handle = self.handle_command_message( - rpc_message, - Channels { - rpc: rpc_sender.clone(), - runner: runner_worker_tx.clone(), - }, - db.clone(), - now - ).await; match handle { Ok(ControlFlow::Break(())) => break now.elapsed(), @@ -320,9 +258,9 @@ impl Runner { _ => {} } } - Some((ws::Message::RunWorkflow((name, workflow)), Some(oneshot_tx))) = ws_receiver_wait => { - // TODO: Parse this from the workflow data itself. + Some((webserver::Message::RunWorkflow((name, workflow)), Some(oneshot_tx))) = ws_receiver.recv() => { info!("running workflow: {}", name); + // TODO: Parse this from the workflow data itself. let workflow_settings = workflow::Settings::default(); match self.run_worker( workflow, @@ -333,11 +271,11 @@ impl Runner { ).await { Ok(_) => { info!("sending message to rpc server"); - let _ = oneshot_tx.send(ws::Message::RunWorkflowAck); + let _ = oneshot_tx.send(webserver::Message::AckWorkflow); } Err(err) => { error!(err=?err, "error handling ws message"); - let _ = oneshot_tx.send(ws::Message::RunErr(err.into())); + let _ = oneshot_tx.send(webserver::Message::RunErr(err.into())); } } } @@ -369,33 +307,18 @@ impl Runner { let now = time::Instant::now(); let drain_timeout = now + shutdown_timeout; - // Sub-select handling of runner `shutdown`. - #[cfg(feature = "websocket-server")] { - select! { - // Graceful shutdown. - Ok(()) = self.shutdown(rpc_sender, ws_sender) => { - break now.elapsed(); - }, - // Force shutdown upon drain timeout. - _ = time::sleep_until(drain_timeout) => { - info!("shutdown timeout reached, shutting down runner anyway"); - break now.elapsed(); - } - } - } - #[cfg(not(feature = "websocket-server"))] { - select! { - // Graceful shutdown. - Ok(()) = self.shutdown(rpc_sender) => { - break now.elapsed(); - }, - // Force shutdown upon drain timeout. - _ = time::sleep_until(drain_timeout) => { - info!("shutdown timeout reached, shutting down runner anyway"); - break now.elapsed(); - } + select! { + // Graceful shutdown. + Ok(()) = self.shutdown(rpc_sender, ws_hdl) => { + break now.elapsed(); + }, + // Force shutdown upon drain timeout. + _ = time::sleep_until(drain_timeout) => { + info!("shutdown timeout reached, shutting down runner anyway"); + break now.elapsed(); } } + } } } @@ -559,47 +482,18 @@ impl Runner { /// a) RPC and runner-related channels. /// b) Event-handler channels. /// c) Running workers - #[cfg(feature = "websocket-server")] async fn shutdown( &self, rpc_sender: Arc>, - ws_sender: AsyncBoundedChannelSender, + ws_hdl: ServerHandle, ) -> Result<()> { let (shutdown_sender, shutdown_receiver) = oneshot::channel(); let _ = rpc_sender.try_send(rpc::ServerMessage::GracefulShutdown(shutdown_sender)); let _ = shutdown_receiver.await; - let (shutdown_sender, shutdown_receiver) = oneshot::channel(); - let _ = self - .event_sender - .send_async(Event::Shutdown(shutdown_sender)) - .await; - let _ = shutdown_receiver.await; - - let (shutdown_sender, shutdown_receiver) = oneshot::channel(); - let _ = ws_sender - .send_async(ws::Message::GracefulShutdown(shutdown_sender)) - .await; - let _ = shutdown_receiver.await; - - // abort all workers - self.abort_workers(); - - Ok(()) - } - - /// Sequence for shutting down a [Runner], including: - /// a) RPC and runner-related channels. - /// b) Event-handler channels. - /// c) Running workers - #[cfg(not(feature = "websocket-server"))] - async fn shutdown( - &self, - rpc_sender: Arc>, - ) -> Result<()> { - let (shutdown_sender, shutdown_receiver) = oneshot::channel(); - let _ = rpc_sender.try_send(rpc::ServerMessage::GracefulShutdown(shutdown_sender)); - let _ = shutdown_receiver.await; + info!("shutting down webserver"); + let _ = ws_hdl.stop(); + ws_hdl.clone().stopped().await; let (shutdown_sender, shutdown_receiver) = oneshot::channel(); let _ = self @@ -618,6 +512,7 @@ impl Runner { &self, msg: rpc::ServerMessage, channels: Channels, + ws_hdl: ServerHandle, db: impl Database + 'static, now: time::Instant, ) -> Result> { @@ -626,30 +521,15 @@ impl Runner { rpc::ServerMessage::ShutdownCmd => { info!("RPC shutdown signal received, shutting down runner"); let drain_timeout = now + self.settings.node.shutdown_timeout; - #[cfg(feature = "websocket-server")] - { - select! { - // we can unwrap here b/c we know we have a sender based - // on the feature flag. - Ok(()) = self.shutdown(channels.rpc, channels.ws) => { - Ok(ControlFlow::Break(())) - }, - _ = time::sleep_until(drain_timeout) => { - info!("shutdown timeout reached, shutting down runner anyway"); - Ok(ControlFlow::Break(())) - } - } - } - #[cfg(not(feature = "websocket-server"))] - { - select! { - Ok(()) = self.shutdown(rpc_sender) => { - Ok(ControlFlow::Break(())) - }, - _ = time::sleep_until(drain_timeout) => { - info!("shutdown timeout reached, shutting down runner anyway"); - Ok(ControlFlow::Break(())) - } + select! { + // we can unwrap here b/c we know we have a sender based + // on the feature flag. + Ok(()) = self.shutdown(channels.rpc, ws_hdl) => { + Ok(ControlFlow::Break(())) + }, + _ = time::sleep_until(drain_timeout) => { + info!("shutdown timeout reached, shutting down runner anyway"); + Ok(ControlFlow::Break(())) } } } @@ -744,20 +624,10 @@ struct WorkflowData { timestamp: NaiveDateTime, } -#[cfg(feature = "websocket-server")] #[derive(Debug)] struct Channels { rpc: Arc>, runner: mpsc::Sender, - ws: AsyncBoundedChannelSender, -} - -#[cfg(not(feature = "websocket-server"))] -#[derive(Debug)] -struct Channels { - rpc: Arc>, - runner: mpsc::Sender, - runner: Arc>, } #[cfg(test)] @@ -772,11 +642,14 @@ mod test { #[homestar_runtime_proc_macro::runner_test] fn shutdown() { - let TestRunner { runner, settings } = TestRunner::start(); - + let TestRunner { + runner, + mut settings, + } = TestRunner::start(); + settings.node.network.metrics_port = 7001; + settings.node.network.webserver_port = 2001; let (tx, _rx) = Runner::setup_rpc_channel(1); - let (ws_oneshot_tx, ws_oneshot_rx) = Runner::setup_ws_oneshot_channel(); - let (ws_tx, _ws_rx) = Runner::setup_ws_mpsc_channel(1); + let (runner_tx, _runner_rx) = Runner::setup_ws_mpsc_channel(1); let rpc_server = rpc::Server::new(settings.node.network(), Arc::new(tx)); let rpc_sender = rpc_server.sender(); @@ -785,22 +658,28 @@ mod test { settings.node.network.rpc_port, ); - runner.runtime.block_on(async { + let ws_hdl = runner.runtime.block_on(async { rpc_server.spawn().await.unwrap(); - - #[cfg(feature = "websocket-server")] - runner.runtime.spawn({ - let ws_server = runner.ws_server.clone(); - async move { ws_server.start(ws_oneshot_rx, ws_tx).await } - }); - + #[cfg(feature = "monitoring")] + let metrics_hdl = metrics::start(settings.monitoring(), settings.node.network()) + .await + .unwrap(); + #[cfg(not(feature = "monitoring"))] + let metrics_hdl = metrics::start(settings.node.network()).await.unwrap(); + + let ws_hdl = runner + .webserver + .start(runner_tx, metrics_hdl) + .await + .unwrap(); let _stream = TcpStream::connect(addr).await.expect("Connection error"); let _another_stream = TcpStream::connect(addr).await.expect("Connection error"); + + ws_hdl }); runner.runtime.block_on(async { - #[cfg(feature = "websocket-server")] - match runner.shutdown(rpc_sender, ws_oneshot_tx).await { + match runner.shutdown(rpc_sender, ws_hdl).await { Ok(()) => { // with shutdown, we should not be able to connect to the server(s) let stream_error = TcpStream::connect(addr).await; @@ -816,19 +695,6 @@ mod test { } _ => panic!("Shutdown failed."), } - #[cfg(not(feature = "websocket-server"))] - match runner.shutdown(rpc_sender).await { - Ok(()) => { - // with shutdown, we should not be able to connect to the server(s) - let stream_error = TcpStream::connect(addr).await; - assert!(stream_error.is_err()); - assert!(matches!( - stream_error.unwrap_err().kind(), - std::io::ErrorKind::ConnectionRefused - )); - } - _ => panic!("Shutdown failed."), - } }); } diff --git a/homestar-runtime/src/settings.rs b/homestar-runtime/src/settings.rs index 27c9bf0e..f4ce65a9 100644 --- a/homestar-runtime/src/settings.rs +++ b/homestar-runtime/src/settings.rs @@ -36,12 +36,10 @@ impl Settings { /// Process monitoring settings. #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] pub struct Monitoring { - /// Monitoring collection interval in milliseconds. - pub process_collector_interval: u64, - /// Metrics port for prometheus scraping. - pub metrics_port: u16, /// Tokio console port. pub console_subscriber_port: u16, + /// Monitoring collection interval in milliseconds. + pub process_collector_interval: u64, } /// Server settings. @@ -65,10 +63,13 @@ pub struct Node { } /// Network-related settings for a homestar node. +/// TODO: Split-up and re-arrange. #[serde_as] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[serde(default)] pub struct Network { + /// Metrics port for prometheus scraping. + pub metrics_port: u16, /// Buffer-length for event(s) / command(s) channels. pub(crate) events_buffer_len: usize, /// Address for [Swarm] to listen on. @@ -117,11 +118,14 @@ pub struct Network { /// Transport connection timeout. #[serde_as(as = "DurationSeconds")] pub(crate) transport_connection_timeout: Duration, - /// Websocket-server host address. + /// Webserver host address. #[serde(with = "http_serde::uri")] - pub(crate) websocket_host: Uri, - /// Websocket-server port. - pub(crate) websocket_port: u16, + pub(crate) webserver_host: Uri, + /// Webserver-server port. + pub(crate) webserver_port: u16, + /// TODO + #[serde_as(as = "DurationSeconds")] + pub(crate) webserver_timeout: Duration, /// Number of *bounded* clients to send messages to, used for a /// [tokio::sync::broadcast::channel] pub(crate) websocket_capacity: usize, @@ -165,7 +169,6 @@ pub(crate) struct Database { impl Default for Monitoring { fn default() -> Self { Self { - metrics_port: 4000, process_collector_interval: 5000, console_subscriber_port: 5555, } @@ -184,6 +187,7 @@ impl Default for Database { impl Default for Network { fn default() -> Self { Self { + metrics_port: 4000, events_buffer_len: 1024, listen_address: Uri::from_static("/ip4/0.0.0.0/tcp/0"), // TODO: we would like to enable this by default, however this breaks mdns on at least some linux distros. Requires further investigation. @@ -203,8 +207,9 @@ impl Default for Network { rpc_port: 3030, rpc_server_timeout: Duration::new(120, 0), transport_connection_timeout: Duration::new(20, 0), - websocket_host: Uri::from_static("127.0.0.1"), - websocket_port: 1337, + webserver_host: Uri::from_static("127.0.0.1"), + webserver_port: 1337, + webserver_timeout: Duration::new(60, 0), websocket_capacity: 1024, websocket_receiver_timeout: Duration::from_millis(200), workflow_quorum: 3, @@ -297,7 +302,7 @@ mod test { let mut default_modded_settings = Node::default(); default_modded_settings.network.events_buffer_len = 1000; - default_modded_settings.network.websocket_port = 9999; + default_modded_settings.network.webserver_port = 9999; default_modded_settings.gc_interval = Duration::from_secs(1800); default_modded_settings.shutdown_timeout = Duration::from_secs(20); default_modded_settings.network.node_addresses = diff --git a/homestar-runtime/src/test_utils/proc_macro/src/lib.rs b/homestar-runtime/src/test_utils/proc_macro/src/lib.rs index fb2386fb..f40a5c7e 100644 --- a/homestar-runtime/src/test_utils/proc_macro/src/lib.rs +++ b/homestar-runtime/src/test_utils/proc_macro/src/lib.rs @@ -98,7 +98,7 @@ pub fn runner_test(_attr: TokenStream, item: TokenStream) -> TokenStream { impl TestRunner { fn start() -> TestRunner { let mut settings = crate::Settings::load().unwrap(); - settings.node.network.websocket_port = ::homestar_core::test_utils::ports::get_port() as u16; + settings.node.network.webserver_port = ::homestar_core::test_utils::ports::get_port() as u16; settings.node.network.rpc_port = ::homestar_core::test_utils::ports::get_port() as u16; settings.node.db.url = Some(format!("{}.db", #func_name_as_string)); let db = crate::test_utils::db::MemoryDb::setup_connection_pool(&settings.node, None).unwrap(); diff --git a/homestar-runtime/src/worker.rs b/homestar-runtime/src/worker.rs index 0a122e36..f7e1b64a 100644 --- a/homestar-runtime/src/worker.rs +++ b/homestar-runtime/src/worker.rs @@ -4,13 +4,15 @@ //! [Workflow]: homestar_core::Workflow //! [EventHandler]: crate::event_handler::EventHandler +#[cfg(feature = "websocket-notify")] +use crate::event_handler::event::Replay; #[cfg(feature = "ipfs")] use crate::network::IpfsCli; use crate::{ channel::{AsyncBoundedChannel, AsyncBoundedChannelSender}, db::Database, event_handler::{ - event::{Captured, QueryRecord, Replay}, + event::{Captured, QueryRecord}, swarm_event::{FoundEvent, ResponseEvent}, Event, }, @@ -156,8 +158,8 @@ where }; #[cfg(not(feature = "ipfs"))] - let fetch_fn = |rscs: Vec| { - async move { fetch::get_resources(rscs, workflow_settings_fetch).await }.boxed() + let fetch_fn = |rscs: FnvHashSet| { + async move { Fetch::get_resources(rscs, workflow_settings_fetch).await }.boxed() }; let scheduler_ctx = TaskScheduler::init( @@ -170,6 +172,7 @@ where self.run_queue(scheduler_ctx.scheduler, running_tasks).await } + #[allow(unused_mut)] async fn run_queue( mut self, mut scheduler: TaskScheduler<'a>, @@ -257,7 +260,7 @@ where } } - // Always replay previous receipts. + // Replay previous receipts if subscriptions are on. #[cfg(feature = "websocket-notify")] { if scheduler.ran.as_ref().is_some_and(|ran| !ran.is_empty()) { @@ -629,9 +632,11 @@ mod test { assert_eq!(running_tasks.get(&worker_workflow_cid).unwrap().len(), 1); // First receipt is a replay receipt. - let replay_msg = rx.recv_async().await.unwrap(); - - assert!(matches!(replay_msg, Event::ReplayReceipts(_))); + #[cfg(feature = "websocket-notify")] + { + let replay_msg = rx.recv_async().await.unwrap(); + assert!(matches!(replay_msg, Event::ReplayReceipts(_))); + } // we should have received 1 receipt let next_run_receipt = rx.recv_async().await.unwrap(); diff --git a/homestar-runtime/tests/cli.rs b/homestar-runtime/tests/cli.rs index 204b1feb..cfde28d5 100644 --- a/homestar-runtime/tests/cli.rs +++ b/homestar-runtime/tests/cli.rs @@ -1,6 +1,8 @@ #[cfg(not(windows))] use crate::utils::kill_homestar_daemon; -use crate::utils::{kill_homestar, startup_ipfs, stop_all_bins, BIN_NAME}; +#[cfg(feature = "ipfs")] +use crate::utils::startup_ipfs; +use crate::utils::{kill_homestar, stop_all_bins, BIN_NAME}; use anyhow::Result; use assert_cmd::prelude::*; use once_cell::sync::Lazy; @@ -390,48 +392,3 @@ fn test_server_v4_serial() -> Result<()> { Ok(()) } - -#[test] -#[file_serial] -#[cfg(not(windows))] -fn test_daemon_v4_serial() -> Result<()> { - let _ = stop_all_bins(); - - #[cfg(feature = "ipfs")] - let _ = startup_ipfs(); - - Command::new(BIN.as_os_str()) - .arg("start") - .arg("-c") - .arg("tests/fixtures/test_v4.toml") - .arg("-d") - .env("DATABASE_URL", "homestar.db") - .stdout(Stdio::piped()) - .assert() - .success(); - - let socket = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 9830); - let result = retry(Exponential::from_millis(1000).take(10), || { - TcpStream::connect(socket).map(|stream| stream.shutdown(Shutdown::Both)) - }); - - if result.is_err() { - panic!("Homestar server/runtime failed to start in time"); - } - - Command::new(BIN.as_os_str()) - .arg("ping") - .arg("--host") - .arg("127.0.0.1") - .arg("-p") - .arg("9830") - .assert() - .success() - .stdout(predicate::str::contains("127.0.0.1")) - .stdout(predicate::str::contains("pong")); - - let _ = stop_all_bins(); - let _ = kill_homestar_daemon(); - - Ok(()) -} diff --git a/homestar-runtime/tests/fixtures/test_mdns1.toml b/homestar-runtime/tests/fixtures/test_mdns1.toml index d870de70..1a8abdd6 100644 --- a/homestar-runtime/tests/fixtures/test_mdns1.toml +++ b/homestar-runtime/tests/fixtures/test_mdns1.toml @@ -1,13 +1,13 @@ [monitoring] process_collector_interval = 500 -metrics_port = 4001 console_subscriber_port = 5560 [node] [node.network] +metrics_port = 4001 rpc_port = 9800 -websocket_port = 8000 +webserver_port = 8000 listen_address = "/ip4/0.0.0.0/tcp/0" enable_rendezvous = false diff --git a/homestar-runtime/tests/fixtures/test_mdns2.toml b/homestar-runtime/tests/fixtures/test_mdns2.toml index fe0fe2b3..f75653a4 100644 --- a/homestar-runtime/tests/fixtures/test_mdns2.toml +++ b/homestar-runtime/tests/fixtures/test_mdns2.toml @@ -1,13 +1,13 @@ [monitoring] process_collector_interval = 500 -metrics_port = 4002 console_subscriber_port = 5561 [node] [node.network] +metrics_port = 4002 rpc_port = 9801 -websocket_port = 8001 +webserver_port = 8001 listen_address = "/ip4/0.0.0.0/tcp/0" enable_rendezvous = false diff --git a/homestar-runtime/tests/fixtures/test_metrics.toml b/homestar-runtime/tests/fixtures/test_metrics.toml index 726d6c60..a8feda9d 100644 --- a/homestar-runtime/tests/fixtures/test_metrics.toml +++ b/homestar-runtime/tests/fixtures/test_metrics.toml @@ -1,13 +1,13 @@ [monitoring] process_collector_interval = 500 -metrics_port = 4020 console_subscriber_port = 5570 [node] [node.network] +metrics_port = 4020 rpc_port = 9810 -websocket_port = 8010 +webserver_port = 8010 [node.network.keypair_config] existing = { key_type = "ed25519", path = "./fixtures/__testkey_ed25519.pem" } diff --git a/homestar-runtime/tests/fixtures/test_network1.toml b/homestar-runtime/tests/fixtures/test_network1.toml index 1477ae03..3458ffbc 100644 --- a/homestar-runtime/tests/fixtures/test_network1.toml +++ b/homestar-runtime/tests/fixtures/test_network1.toml @@ -1,13 +1,13 @@ [monitoring] process_collector_interval = 500 -metrics_port = 4030 console_subscriber_port = 5580 [node] [node.network] +metrics_port = 4030 rpc_port = 9820 -websocket_port = 8020 +webserver_port = 8020 listen_address = "/ip4/127.0.0.1/tcp/7000" node_addresses = [ "/ip4/127.0.0.1/tcp/7001/p2p/16Uiu2HAm3g9AomQNeEctL2hPwLapap7AtPSNt8ZrBny4rLx1W5Dc", diff --git a/homestar-runtime/tests/fixtures/test_network2.toml b/homestar-runtime/tests/fixtures/test_network2.toml index d2aa2675..b3f1fa80 100644 --- a/homestar-runtime/tests/fixtures/test_network2.toml +++ b/homestar-runtime/tests/fixtures/test_network2.toml @@ -1,13 +1,13 @@ [monitoring] process_collector_interval = 500 -metrics_port = 4031 console_subscriber_port = 5581 [node] [node.network] +metrics_port = 4031 rpc_port = 9821 -websocket_port = 8021 +webserver_port = 8021 listen_address = "/ip4/127.0.0.1/tcp/7001" node_addresses = [ "/ip4/127.0.0.1/tcp/7000/p2p/12D3KooWDpJ7As7BWAwRMfu1VU2WCqNjvq387JEYKDBj4kx6nXTN", diff --git a/homestar-runtime/tests/fixtures/test_v4.toml b/homestar-runtime/tests/fixtures/test_v4.toml index 86d4a97c..284f8d20 100644 --- a/homestar-runtime/tests/fixtures/test_v4.toml +++ b/homestar-runtime/tests/fixtures/test_v4.toml @@ -1,11 +1,12 @@ [monitoring] process_collector_interval = 500 -metrics_port = 4040 console_subscriber_port = 5590 [node] [node.network] +metrics_port = 4040 events_buffer_len = 1000 rpc_port = 9830 rpc_host = "127.0.0.1" +webserver_port = 8030 diff --git a/homestar-runtime/tests/fixtures/test_v4_alt.toml b/homestar-runtime/tests/fixtures/test_v4_alt.toml index d8088378..144bfc69 100644 --- a/homestar-runtime/tests/fixtures/test_v4_alt.toml +++ b/homestar-runtime/tests/fixtures/test_v4_alt.toml @@ -1,11 +1,12 @@ [monitoring] process_collector_interval = 500 -metrics_port = 4041 console_subscriber_port = 5591 [node] [node.network] +metrics_port = 4041 events_buffer_len = 1000 rpc_port = 9831 rpc_host = "127.0.0.1" +webserver_port = 8040 diff --git a/homestar-runtime/tests/fixtures/test_v6.toml b/homestar-runtime/tests/fixtures/test_v6.toml index 07711b16..4036af8e 100644 --- a/homestar-runtime/tests/fixtures/test_v6.toml +++ b/homestar-runtime/tests/fixtures/test_v6.toml @@ -1,12 +1,13 @@ [monitoring] process_collector_interval = 500 -metrics_port = 4042 console_subscriber_port = 5592 [node] [node.network] +metrics_port = 4042 events_buffer_len = 1000 rpc_port = 9832 rpc_host = "::1" +webserver_port = 8050 diff --git a/homestar-runtime/tests/fixtures/test_workflow.toml b/homestar-runtime/tests/fixtures/test_workflow.toml index 549f337a..6a0efb11 100644 --- a/homestar-runtime/tests/fixtures/test_workflow.toml +++ b/homestar-runtime/tests/fixtures/test_workflow.toml @@ -1,10 +1,11 @@ [monitoring] process_collector_interval = 500 -metrics_port = 4050 console_subscriber_port = 5600 [node] [node.network] +metrics_port = 4050 events_buffer_len = 1000 rpc_port = 9840 +webserver_port = 8060 diff --git a/homestar-runtime/tests/main.rs b/homestar-runtime/tests/main.rs index e957b31f..cdaa6596 100644 --- a/homestar-runtime/tests/main.rs +++ b/homestar-runtime/tests/main.rs @@ -1,4 +1,5 @@ pub(crate) mod cli; +#[cfg(feature = "monitoring")] pub(crate) mod metrics; pub(crate) mod network; pub(crate) mod utils; diff --git a/homestar-runtime/tests/metrics.rs b/homestar-runtime/tests/metrics.rs index 3252996c..02fda3bc 100644 --- a/homestar-runtime/tests/metrics.rs +++ b/homestar-runtime/tests/metrics.rs @@ -37,8 +37,8 @@ fn test_metrics_serial() -> Result<()> { metrics .samples .iter() - .find(|sample| sample.metric.as_str() == "system_used_memory_bytes") - .and_then(|sample| Some(sample.value.to_owned())) + .find(|sample| sample.metric.as_str() == "homestar_system_used_memory_bytes") + .map(|sample| sample.value.to_owned()) } let _ = stop_homestar(); diff --git a/homestar-runtime/tests/network.rs b/homestar-runtime/tests/network.rs index 27fce6df..6231546a 100644 --- a/homestar-runtime/tests/network.rs +++ b/homestar-runtime/tests/network.rs @@ -95,7 +95,6 @@ fn test_rpc_listens_on_address_serial() -> Result<()> { Ok(()) } -#[cfg(feature = "websocket-server")] #[test] #[file_serial] fn test_websocket_listens_on_address_serial() -> Result<()> { @@ -113,8 +112,7 @@ fn test_websocket_listens_on_address_serial() -> Result<()> { let dead_proc = kill_homestar(homestar_proc, None); let stdout = retrieve_output(dead_proc); - let logs_expected = - check_lines_for(stdout, vec!["websocket server listening", "127.0.0.1:8020"]); + let logs_expected = check_lines_for(stdout, vec!["webserver listening", "127.0.0.1:8020"]); assert!(logs_expected); diff --git a/homestar-runtime/tests/utils.rs b/homestar-runtime/tests/utils.rs index 57c8711a..2c868a41 100644 --- a/homestar-runtime/tests/utils.rs +++ b/homestar-runtime/tests/utils.rs @@ -9,13 +9,13 @@ use nix::{ use once_cell::sync::Lazy; use predicates::prelude::*; use retry::{delay::Fixed, retry}; +#[cfg(feature = "ipfs")] +use std::net::{IpAddr, Ipv4Addr, Shutdown, SocketAddr, TcpStream}; use std::{ - net::{IpAddr, Ipv4Addr, Shutdown, SocketAddr, TcpStream}, path::PathBuf, process::{Child, Command, Stdio}, time::Duration, }; -use strip_ansi_escapes; #[cfg(not(windows))] use sysinfo::PidExt; use sysinfo::{ProcessExt, SystemExt}; @@ -28,6 +28,7 @@ static BIN: Lazy = Lazy::new(|| assert_cmd::cargo::cargo_bin(BIN_NAME)) const IPFS: &str = "ipfs"; /// Start-up IPFS daemon for tests with the feature turned-on. +#[cfg(feature = "ipfs")] pub(crate) fn startup_ipfs() -> Result<()> { let path = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join(".ipfs"); println!("starting ipfs daemon...{}", path.to_str().unwrap()); @@ -94,15 +95,15 @@ pub(crate) fn retrieve_output(proc: Child) -> String { /// Check process output for all predicates in any line pub(crate) fn check_lines_for(output: String, predicates: Vec<&str>) -> bool { output - .split("\n") + .split('\n') .map(|line| { // Line contains all predicates predicates .iter() .map(|pred| predicate::str::contains(*pred).eval(line)) - .fold(true, |acc, curr| acc && curr) + .all(|curr| curr) }) - .fold(false, |acc, curr| acc || curr) + .any(|curr| curr) } /// Wait for process to exit or kill after timeout. From 42c122fcda42f73eed93b61aaf4967aabef1a91e Mon Sep 17 00:00:00 2001 From: Zeeshan Lakhani Date: Tue, 31 Oct 2023 14:01:17 -0400 Subject: [PATCH 02/24] refactor: cleanup settings --- examples/websocket-relay/src/main.rs | 1 - homestar-core/src/test_utils/ports.rs | 2 +- homestar-runtime/src/metrics/node.rs | 4 +-- homestar-runtime/src/network/webserver.rs | 24 +++++++++------- homestar-runtime/src/network/webserver/rpc.rs | 4 +-- homestar-runtime/src/settings.rs | 28 +++++++++++++++++-- .../src/test_utils/proc_macro/src/lib.rs | 1 + homestar-runtime/tests/metrics.rs | 1 + 8 files changed, 46 insertions(+), 19 deletions(-) diff --git a/examples/websocket-relay/src/main.rs b/examples/websocket-relay/src/main.rs index e3909584..35b77ec0 100644 --- a/examples/websocket-relay/src/main.rs +++ b/examples/websocket-relay/src/main.rs @@ -36,7 +36,6 @@ fn main() -> Result<()> { Runner::start(settings, db).expect("Failed to start runtime"); // ipfs cleanup after runtime is stopped - if let Some(mut ipfs_daemon) = ipfs_daemon { match ipfs_daemon.try_wait() { Ok(Some(status)) => info!("exited with: {status}"), diff --git a/homestar-core/src/test_utils/ports.rs b/homestar-core/src/test_utils/ports.rs index 362c2868..673fc0fa 100644 --- a/homestar-core/src/test_utils/ports.rs +++ b/homestar-core/src/test_utils/ports.rs @@ -9,6 +9,6 @@ static PORTS: OnceCell = OnceCell::new(); /// Return a unique port(in runtime) for test pub fn get_port() -> usize { PORTS - .get_or_init(|| AtomicUsize::new(rand::thread_rng().gen_range(3000..3800))) + .get_or_init(|| AtomicUsize::new(rand::thread_rng().gen_range(3000..6800))) .fetch_add(1, Ordering::Relaxed) } diff --git a/homestar-runtime/src/metrics/node.rs b/homestar-runtime/src/metrics/node.rs index bb58f389..d25e575d 100644 --- a/homestar-runtime/src/metrics/node.rs +++ b/homestar-runtime/src/metrics/node.rs @@ -108,8 +108,8 @@ pub(crate) fn describe() { } /// Collect node metrics on a settings-defined interval. -pub(crate) async fn collect_metrics(interval: u64) { - let mut interval = tokio::time::interval(Duration::from_millis(interval)); +pub(crate) async fn collect_metrics(interval: Duration) { + let mut interval = tokio::time::interval(interval); // Log static system info log_static_info(); diff --git a/homestar-runtime/src/network/webserver.rs b/homestar-runtime/src/network/webserver.rs index e0332a3e..f18e4460 100644 --- a/homestar-runtime/src/network/webserver.rs +++ b/homestar-runtime/src/network/webserver.rs @@ -233,11 +233,15 @@ mod test { use notifier::NotifyReceipt; use tokio::sync::mpsc; + fn set_ports(settings: &mut Settings) { + settings.node.network.metrics_port = test_utils::ports::get_port() as u16; + settings.node.network.webserver_port = test_utils::ports::get_port() as u16; + } + #[tokio::test] async fn ws_connect() { let mut settings = Settings::load().unwrap(); - settings.node.network.metrics_port = 6000; - settings.node.network.webserver_port = 1200; + set_ports(&mut settings); let server = Server::new(settings.node().network()).unwrap(); #[cfg(feature = "monitoring")] let metrics_hdl = metrics::start(settings.monitoring(), settings.node.network()) @@ -272,8 +276,8 @@ mod test { #[tokio::test] async fn ws_metrics_no_prefix() { let mut settings = Settings::load().unwrap(); - settings.node.network.metrics_port = 6001; - settings.node.network.webserver_port = 1201; + set_ports(&mut settings); + settings.monitoring.process_collector_interval = Duration::from_millis(100); let server = Server::new(settings.node().network()).unwrap(); let metrics_hdl = metrics::start(settings.monitoring(), settings.node.network()) @@ -284,6 +288,9 @@ mod test { let ws_url = format!("ws://{}", server.addr); + // wait for interval to pass + std::thread::sleep(Duration::from_millis(100)); + let client = WsClientBuilder::default().build(ws_url).await.unwrap(); let ws_resp1: serde_json::Value = client .request(rpc::METRICS_ENDPOINT, rpc_params![]) @@ -303,8 +310,7 @@ mod test { #[tokio::test] async fn ws_subscribe_unsubscribe_network_events() { let mut settings = Settings::load().unwrap(); - settings.node.network.metrics_port = 6002; - settings.node.network.webserver_port = 1202; + set_ports(&mut settings); let server = Server::new(settings.node().network()).unwrap(); #[cfg(feature = "monitoring")] let metrics_hdl = metrics::start(settings.monitoring(), settings.node.network()) @@ -341,8 +347,7 @@ mod test { #[tokio::test] async fn ws_subscribe_workflow_incorrect_params() { let mut settings = Settings::load().unwrap(); - settings.node.network.metrics_port = 6003; - settings.node.network.webserver_port = 1203; + set_ports(&mut settings); let server = Server::new(settings.node().network()).unwrap(); let metrics_hdl = metrics::start(settings.monitoring(), settings.node.network()) .await @@ -375,8 +380,7 @@ mod test { #[tokio::test] async fn ws_subscribe_workflow_runner_timeout() { let mut settings = Settings::load().unwrap(); - settings.node.network.metrics_port = 6004; - settings.node.network.webserver_port = 1204; + set_ports(&mut settings); let server = Server::new(settings.node().network()).unwrap(); let metrics_hdl = metrics::start(settings.monitoring(), settings.node.network()) .await diff --git a/homestar-runtime/src/network/webserver/rpc.rs b/homestar-runtime/src/network/webserver/rpc.rs index da449917..6749585d 100644 --- a/homestar-runtime/src/network/webserver/rpc.rs +++ b/homestar-runtime/src/network/webserver/rpc.rs @@ -96,7 +96,7 @@ impl Context { } } -/// TODO +/// [RpcModule] wrapper. pub(crate) struct JsonRpc(RpcModule); impl JsonRpc { @@ -106,8 +106,8 @@ impl JsonRpc { Ok(Self(module)) } - #[allow(dead_code)] /// Get a reference to the inner [RpcModule]. + #[allow(dead_code)] pub(crate) fn inner(&self) -> &RpcModule { &self.0 } diff --git a/homestar-runtime/src/settings.rs b/homestar-runtime/src/settings.rs index f4ce65a9..c8d3b081 100644 --- a/homestar-runtime/src/settings.rs +++ b/homestar-runtime/src/settings.rs @@ -33,13 +33,25 @@ impl Settings { } } -/// Process monitoring settings. +/// Monitoring settings. +#[cfg(feature = "monitoring")] +#[serde_as] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] pub struct Monitoring { /// Tokio console port. pub console_subscriber_port: u16, /// Monitoring collection interval in milliseconds. - pub process_collector_interval: u64, + #[serde_as(as = "DurationMilliSeconds")] + pub process_collector_interval: Duration, +} + +/// Monitoring settings. +#[cfg(not(feature = "monitoring"))] +#[serde_as] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +pub struct Monitoring { + /// Tokio console port. + pub console_subscriber_port: u16, } /// Server settings. @@ -166,10 +178,20 @@ pub(crate) struct Database { pub(crate) max_pool_size: u32, } +#[cfg(feature = "monitoring")] +impl Default for Monitoring { + fn default() -> Self { + Self { + process_collector_interval: Duration::from_millis(5000), + console_subscriber_port: 5555, + } + } +} + +#[cfg(not(feature = "monitoring"))] impl Default for Monitoring { fn default() -> Self { Self { - process_collector_interval: 5000, console_subscriber_port: 5555, } } diff --git a/homestar-runtime/src/test_utils/proc_macro/src/lib.rs b/homestar-runtime/src/test_utils/proc_macro/src/lib.rs index f40a5c7e..928e3b49 100644 --- a/homestar-runtime/src/test_utils/proc_macro/src/lib.rs +++ b/homestar-runtime/src/test_utils/proc_macro/src/lib.rs @@ -100,6 +100,7 @@ pub fn runner_test(_attr: TokenStream, item: TokenStream) -> TokenStream { let mut settings = crate::Settings::load().unwrap(); settings.node.network.webserver_port = ::homestar_core::test_utils::ports::get_port() as u16; settings.node.network.rpc_port = ::homestar_core::test_utils::ports::get_port() as u16; + settings.node.network.metrics_port = ::homestar_core::test_utils::ports::get_port() as u16; settings.node.db.url = Some(format!("{}.db", #func_name_as_string)); let db = crate::test_utils::db::MemoryDb::setup_connection_pool(&settings.node, None).unwrap(); let runner = crate::Runner::start(settings.clone(), db).unwrap(); diff --git a/homestar-runtime/tests/metrics.rs b/homestar-runtime/tests/metrics.rs index 02fda3bc..e764b888 100644 --- a/homestar-runtime/tests/metrics.rs +++ b/homestar-runtime/tests/metrics.rs @@ -13,6 +13,7 @@ use std::{ static BIN: Lazy = Lazy::new(|| assert_cmd::cargo::cargo_bin(BIN_NAME)); const METRICS_URL: &str = "http://localhost:4020"; +#[cfg(feature = "monitoring")] #[test] #[file_serial] fn test_metrics_serial() -> Result<()> { From 0370da64ba725bb5a558610f305df19564056f06 Mon Sep 17 00:00:00 2001 From: Zeeshan Lakhani Date: Wed, 1 Nov 2023 23:21:37 -0400 Subject: [PATCH 03/24] refactor: testing around e2e websocket/jsonrpc, feature-fl --- Cargo.lock | 14 ++ examples/websocket-relay/README.md | 4 +- examples/websocket-relay/example_test.wasm | Bin 358815 -> 285147 bytes .../relay-app/src/lib/workflow.ts | 34 ++-- homestar-core/src/test_utils/ports.rs | 2 +- homestar-core/src/test_utils/workflow.rs | 16 +- homestar-core/src/workflow/input/parse.rs | 2 +- homestar-core/src/workflow/instruction.rs | 6 +- homestar-core/src/workflow/task.rs | 2 +- homestar-functions/README.md | 2 +- homestar-functions/add/src/lib.rs | 4 + homestar-functions/add/wit/host.wit | 1 + homestar-runtime/Cargo.toml | 1 + homestar-runtime/src/metrics/exporter.rs | 3 +- homestar-runtime/src/network/webserver.rs | 65 +++--- homestar-runtime/src/runner.rs | 23 +-- homestar-runtime/src/tasks/fetch.rs | 69 +++---- homestar-runtime/src/workflow/settings.rs | 2 +- homestar-runtime/tests/cli.rs | 4 +- .../test-workflow-image-pipeline.json | 75 +++++++ ...test_workflow.toml => test_workflow1.toml} | 0 .../tests/fixtures/test_workflow2.toml | 11 + homestar-runtime/tests/main.rs | 2 + homestar-runtime/tests/utils.rs | 4 +- homestar-runtime/tests/webserver.rs | 127 ++++++++++++ homestar-wasm/fixtures/example_add.wasm | Bin 8768 -> 8780 bytes homestar-wasm/fixtures/example_add.wat | 176 ++++++++-------- .../fixtures/example_add_component.wasm | Bin 8765 -> 8803 bytes .../fixtures/example_add_component.wat | 189 +++++++++--------- homestar-wasm/fixtures/example_test.wasm | Bin 286703 -> 285147 bytes .../fixtures/example_test_component.wasm | Bin 287104 -> 285548 bytes homestar-wasm/tests/execute_wasm.rs | 2 - 32 files changed, 526 insertions(+), 314 deletions(-) create mode 100644 homestar-runtime/tests/fixtures/test-workflow-image-pipeline.json rename homestar-runtime/tests/fixtures/{test_workflow.toml => test_workflow1.toml} (100%) create mode 100644 homestar-runtime/tests/fixtures/test_workflow2.toml create mode 100644 homestar-runtime/tests/webserver.rs diff --git a/Cargo.lock b/Cargo.lock index b8fc0631..848a24b0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2511,6 +2511,7 @@ dependencies = [ "tokio", "tokio-serde", "tokio-stream", + "tokio-test", "tokio-tungstenite", "tokio-util", "tower", @@ -6527,6 +6528,19 @@ dependencies = [ "tokio-util", ] +[[package]] +name = "tokio-test" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89b3cbabd3ae862100094ae433e1def582cf86451b4e9bf83aa7ac1d8a7d719" +dependencies = [ + "async-stream", + "bytes", + "futures-core", + "tokio", + "tokio-stream", +] + [[package]] name = "tokio-tungstenite" version = "0.20.1" diff --git a/examples/websocket-relay/README.md b/examples/websocket-relay/README.md index 46a41427..dc074bf1 100644 --- a/examples/websocket-relay/README.md +++ b/examples/websocket-relay/README.md @@ -63,9 +63,9 @@ if they've been previously run. On macOS, for example, a simple homebrew install would install everything you need: `brew install rust npm ipfs` -We have packaged homestar binaries via brew, so +We have packaged homestar binaries using brew, so `brew install fission-codes/fission/homestar` will install everything you need, -including `ipfs`. You will still need npm to run this example. From this folder, +including `ipfs`. You will still need `npm` to run this example. From this folder, you can then run the example like this: ``` diff --git a/examples/websocket-relay/example_test.wasm b/examples/websocket-relay/example_test.wasm index 8ac772fdc0957fa82cec223ec893a3e8b9a77e81..b382b252b6466241d86a0e378e0019a8fd910b6c 100755 GIT binary patch literal 285147 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 yeLcRz)_Ft=FO=G#h08{(OPIts3OU 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

*mI0o7Uz3gZua^jZy08B27MdL_6gkI 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 diff --git a/examples/websocket-relay/relay-app/src/lib/workflow.ts b/examples/websocket-relay/relay-app/src/lib/workflow.ts index c32fb005..19aaf894 100644 --- a/examples/websocket-relay/relay-app/src/lib/workflow.ts +++ b/examples/websocket-relay/relay-app/src/lib/workflow.ts @@ -50,7 +50,7 @@ export async function run(workflowId: WorkflowId) { // Record the first workflow that ran if (!firstWorkflowToRun) { - firstWorkflowToRunStore.set(workflowId) + firstWorkflowToRunStore.set(workflowId); } // Set workflow status to working @@ -164,11 +164,11 @@ export async function handleMessage(event: MessageEvent) { const updatedTasks = store[activeWorkflow.id].map((t) => t.id === taskId ? { - ...t, - status, - message: getTaskMessage(status), - receipt, - } + ...t, + status, + message: getTaskMessage(status), + receipt, + } : t ); @@ -259,7 +259,7 @@ export const workflowOneJson = { }, nnc: "", op: "wasm/run", - rsc: "ipfs://bafybeiabbxwf2vn4j3zm7bbojr6rt6k7o6cg6xcbhqkllubmsnvocpv7y4", + rsc: "ipfs://bafybeichafzlolnoamugvfuyynjnj2gse7avstiqkeiuwuv2gyztap4qm4", }, }, { @@ -274,7 +274,7 @@ export const workflowOneJson = { args: [ { "await/ok": { - "/": "bafyrmibalyvlsj3zo2vdgjmvawdszh546jz53ejhud7u6lkmpg6mcvq5ja", + "/": "bafyrmigev36skyfjnslfswcez24rnrorzeaxkrpb3wci2arfkly5zcrepy", }, }, ], @@ -282,7 +282,7 @@ export const workflowOneJson = { }, nnc: "", op: "wasm/run", - rsc: "ipfs://bafybeiabbxwf2vn4j3zm7bbojr6rt6k7o6cg6xcbhqkllubmsnvocpv7y4", + rsc: "ipfs://bafybeichafzlolnoamugvfuyynjnj2gse7avstiqkeiuwuv2gyztap4qm4", }, }, { @@ -297,7 +297,7 @@ export const workflowOneJson = { args: [ { "await/ok": { - "/": "bafyrmiepk7vo7qcndopjhuywtv6bly7ojd6gzmwlqm4uzsingbyxluytny", + "/": "bafyrmiegkif6ofatmowjjmw7yttm7mi5pjjituoxtp5qqsmc3fw65ypbm4", }, }, 20.2, @@ -306,7 +306,7 @@ export const workflowOneJson = { }, nnc: "", op: "wasm/run", - rsc: "ipfs://bafybeiabbxwf2vn4j3zm7bbojr6rt6k7o6cg6xcbhqkllubmsnvocpv7y4", + rsc: "ipfs://bafybeichafzlolnoamugvfuyynjnj2gse7avstiqkeiuwuv2gyztap4qm4", }, }, ], @@ -336,7 +336,7 @@ export const workflowTwoJson = { }, nnc: "", op: "wasm/run", - rsc: "ipfs://bafybeiabbxwf2vn4j3zm7bbojr6rt6k7o6cg6xcbhqkllubmsnvocpv7y4", + rsc: "ipfs://bafybeichafzlolnoamugvfuyynjnj2gse7avstiqkeiuwuv2gyztap4qm4", }, }, { @@ -351,7 +351,7 @@ export const workflowTwoJson = { args: [ { "await/ok": { - "/": "bafyrmibalyvlsj3zo2vdgjmvawdszh546jz53ejhud7u6lkmpg6mcvq5ja", + "/": "bafyrmigev36skyfjnslfswcez24rnrorzeaxkrpb3wci2arfkly5zcrepy", }, }, ], @@ -359,7 +359,7 @@ export const workflowTwoJson = { }, nnc: "", op: "wasm/run", - rsc: "ipfs://bafybeiabbxwf2vn4j3zm7bbojr6rt6k7o6cg6xcbhqkllubmsnvocpv7y4", + rsc: "ipfs://bafybeichafzlolnoamugvfuyynjnj2gse7avstiqkeiuwuv2gyztap4qm4", }, }, { @@ -374,7 +374,7 @@ export const workflowTwoJson = { args: [ { "await/ok": { - "/": "bafyrmiepk7vo7qcndopjhuywtv6bly7ojd6gzmwlqm4uzsingbyxluytny", + "/": "bafyrmiegkif6ofatmowjjmw7yttm7mi5pjjituoxtp5qqsmc3fw65ypbm4", }, }, ], @@ -382,7 +382,7 @@ export const workflowTwoJson = { }, nnc: "", op: "wasm/run", - rsc: "ipfs://bafybeiabbxwf2vn4j3zm7bbojr6rt6k7o6cg6xcbhqkllubmsnvocpv7y4", + rsc: "ipfs://bafybeichafzlolnoamugvfuyynjnj2gse7avstiqkeiuwuv2gyztap4qm4", }, }, ], @@ -432,7 +432,7 @@ function sampleReceipt( workflowId: string, op: TaskOperation ) { - const base64Cat = getStore(base64CatStore) + const base64Cat = getStore(base64CatStore); return { metadata: { diff --git a/homestar-core/src/test_utils/ports.rs b/homestar-core/src/test_utils/ports.rs index 673fc0fa..f817b9b9 100644 --- a/homestar-core/src/test_utils/ports.rs +++ b/homestar-core/src/test_utils/ports.rs @@ -9,6 +9,6 @@ static PORTS: OnceCell = OnceCell::new(); /// Return a unique port(in runtime) for test pub fn get_port() -> usize { PORTS - .get_or_init(|| AtomicUsize::new(rand::thread_rng().gen_range(3000..6800))) + .get_or_init(|| AtomicUsize::new(rand::thread_rng().gen_range(2000..6800))) .fetch_add(1, Ordering::Relaxed) } diff --git a/homestar-core/src/test_utils/workflow.rs b/homestar-core/src/test_utils/workflow.rs index d03baf25..81d4b7d3 100644 --- a/homestar-core/src/test_utils/workflow.rs +++ b/homestar-core/src/test_utils/workflow.rs @@ -19,13 +19,13 @@ use std::collections::BTreeMap; use url::Url; const RAW: u64 = 0x55; +const WASM_CID: &str = "bafkreihxcyjgyrz437ewzi7md55uqt2zf6yr3zn7xrfi4orc34xdc5jgrm"; type NonceBytes = Vec; /// Return a `mocked` `wasm/run` [Instruction]. pub fn wasm_instruction<'a, T>() -> Instruction<'a, T> { - let wasm = "bafybeihzvrlcfqf6ffbp2juhuakspxj2bdsc54cabxnuxfvuqy5lvfxapy".to_string(); - let resource = Url::parse(format!("ipfs://{wasm}").as_str()).unwrap(); + let resource = Url::parse(format!("ipfs://{WASM_CID}").as_str()).unwrap(); Instruction::new( resource, @@ -45,8 +45,7 @@ where Ipld: From, T: Clone, { - let wasm = "bafybeihzvrlcfqf6ffbp2juhuakspxj2bdsc54cabxnuxfvuqy5lvfxapy".to_string(); - let resource = Url::parse(format!("ipfs://{wasm}").as_str()).unwrap(); + let resource = Url::parse(format!("ipfs://{WASM_CID}").as_str()).unwrap(); let instr = Instruction::new( resource.clone(), @@ -100,8 +99,7 @@ where /// Return a `mocked` `wasm/run` [Instruction], along with it's [Nonce] as bytes. pub fn wasm_instruction_with_nonce<'a, T>() -> (Instruction<'a, T>, NonceBytes) { - let wasm = "bafybeihzvrlcfqf6ffbp2juhuakspxj2bdsc54cabxnuxfvuqy5lvfxapy".to_string(); - let resource = Url::parse(format!("ipfs://{wasm}").as_str()).unwrap(); + let resource = Url::parse(format!("ipfs://{WASM_CID}").as_str()).unwrap(); let nonce = Nonce::generate(); ( @@ -120,8 +118,7 @@ pub fn wasm_instruction_with_nonce<'a, T>() -> (Instruction<'a, T>, NonceBytes) /// Return a `mocked` [Instruction]. pub fn instruction<'a, T>() -> Instruction<'a, T> { - let wasm = "bafybeihzvrlcfqf6ffbp2juhuakspxj2bdsc54cabxnuxfvuqy5lvfxapy".to_string(); - let resource = Url::parse(format!("ipfs://{wasm}").as_str()).unwrap(); + let resource = Url::parse(format!("ipfs://{WASM_CID}").as_str()).unwrap(); Instruction::new( resource, @@ -132,8 +129,7 @@ pub fn instruction<'a, T>() -> Instruction<'a, T> { /// Return a `mocked` [Instruction], along with it's [Nonce] as bytes. pub fn instruction_with_nonce<'a, T>() -> (Instruction<'a, T>, NonceBytes) { - let wasm = "bafybeihzvrlcfqf6ffbp2juhuakspxj2bdsc54cabxnuxfvuqy5lvfxapy".to_string(); - let resource = Url::parse(format!("ipfs://{wasm}").as_str()).unwrap(); + let resource = Url::parse(format!("ipfs://{WASM_CID}").as_str()).unwrap(); let nonce = Nonce::generate(); ( diff --git a/homestar-core/src/workflow/input/parse.rs b/homestar-core/src/workflow/input/parse.rs index acf189ae..8e73858b 100644 --- a/homestar-core/src/workflow/input/parse.rs +++ b/homestar-core/src/workflow/input/parse.rs @@ -64,7 +64,7 @@ impl From> for Args { /// use libipld::Ipld; /// use url::Url; /// -/// let wasm = "bafybeihzvrlcfqf6ffbp2juhuakspxj2bdsc54cabxnuxfvuqy5lvfxapy".to_string(); +/// let wasm = "bafkreihxcyjgyrz437ewzi7md55uqt2zf6yr3zn7xrfi4orc34xdc5jgrm".to_string(); /// let resource = Url::parse(format!("ipfs://{wasm}").as_str()).unwrap(); /// /// let inst = Instruction::unique( diff --git a/homestar-core/src/workflow/instruction.rs b/homestar-core/src/workflow/instruction.rs index 7aed2649..fbc11d09 100644 --- a/homestar-core/src/workflow/instruction.rs +++ b/homestar-core/src/workflow/instruction.rs @@ -132,7 +132,7 @@ where /// use libipld::Ipld; /// use url::Url; /// -/// let wasm = "bafybeihzvrlcfqf6ffbp2juhuakspxj2bdsc54cabxnuxfvuqy5lvfxapy".to_string(); +/// let wasm = "bafkreihxcyjgyrz437ewzi7md55uqt2zf6yr3zn7xrfi4orc34xdc5jgrm".to_string(); /// let resource = Url::parse(format!("ipfs://{wasm}").as_str()).unwrap(); /// /// let instr = Instruction::unique( @@ -154,7 +154,7 @@ where /// use libipld::{cid::{multihash::{Code, MultihashDigest}, Cid}, Ipld, Link}; /// use url::Url; -/// let wasm = "bafybeihzvrlcfqf6ffbp2juhuakspxj2bdsc54cabxnuxfvuqy5lvfxapy".to_string(); +/// let wasm = "bafkreihxcyjgyrz437ewzi7md55uqt2zf6yr3zn7xrfi4orc34xdc5jgrm".to_string(); /// let resource = Url::parse(format!("ipfs://{wasm}").as_str()).expect("IPFS URL"); /// let h = Code::Blake3_256.digest(b"beep boop"); /// let cid = Cid::new_v1(0x55, h); @@ -330,7 +330,7 @@ mod test { ( RESOURCE_KEY.into(), Ipld::String( - "ipfs://bafybeihzvrlcfqf6ffbp2juhuakspxj2bdsc54cabxnuxfvuqy5lvfxapy".into() + "ipfs://bafkreihxcyjgyrz437ewzi7md55uqt2zf6yr3zn7xrfi4orc34xdc5jgrm".into() ) ), (OP_KEY.into(), Ipld::String("ipld/fun".to_string())), diff --git a/homestar-core/src/workflow/task.rs b/homestar-core/src/workflow/task.rs index e55e70fd..77e6e9d5 100644 --- a/homestar-core/src/workflow/task.rs +++ b/homestar-core/src/workflow/task.rs @@ -190,7 +190,7 @@ mod test { ( "rsc".into(), Ipld::String( - "ipfs://bafybeihzvrlcfqf6ffbp2juhuakspxj2bdsc54cabxnuxfvuqy5lvfxapy".into(), + "ipfs://bafkreihxcyjgyrz437ewzi7md55uqt2zf6yr3zn7xrfi4orc34xdc5jgrm".into(), ), ), ("op".into(), Ipld::String("ipld/fun".to_string())), diff --git a/homestar-functions/README.md b/homestar-functions/README.md index 2369da24..b407936e 100644 --- a/homestar-functions/README.md +++ b/homestar-functions/README.md @@ -50,7 +50,7 @@ cd test && cargo build --target wasm32-unknown-unknown --profile release-wasm-fn cargo build -p homestar-functions-test --target wasm32-unknown-unknown --profile release-wasm-fn ``` -Guest Wasm modules will be generated within the top-level `homestar` directory: +Guest Wasm modules will be generated in the top-level `homestar` directory: `./target/wasm32-unknown-unknown/release-wasm-fn/homestar_functions_test.wasm`. Sadly, this module is **not yet** an actual `component`. But, we can leverage diff --git a/homestar-functions/add/src/lib.rs b/homestar-functions/add/src/lib.rs index 2c67e6a1..18bdd1b6 100644 --- a/homestar-functions/add/src/lib.rs +++ b/homestar-functions/add/src/lib.rs @@ -8,6 +8,10 @@ wit_bindgen::generate!({ pub struct Component; impl Guest for Component { + fn add_one(input: i32) -> i32 { + input + 1 + } + fn add_two(input: i32) -> i32 { input + 2 } diff --git a/homestar-functions/add/wit/host.wit b/homestar-functions/add/wit/host.wit index 27654fc1..0c2d6d2e 100644 --- a/homestar-functions/add/wit/host.wit +++ b/homestar-functions/add/wit/host.wit @@ -1,5 +1,6 @@ package homestar-functions:add world add { + export add-one: func(input: s32) -> s32 export add-two: func(input: s32) -> s32 } diff --git a/homestar-runtime/Cargo.toml b/homestar-runtime/Cargo.toml index b5156a4c..3573096b 100644 --- a/homestar-runtime/Cargo.toml +++ b/homestar-runtime/Cargo.toml @@ -202,6 +202,7 @@ serial_test = { version = "2.0", default-features = false, features = [ ] } strip-ansi-escapes = "0.2.0" sysinfo = { version = "0.29", default-features = false } +tokio-test = "0.4" tokio-tungstenite = { version = "0.20", default-features = false, features = [ "connect", ] } diff --git a/homestar-runtime/src/metrics/exporter.rs b/homestar-runtime/src/metrics/exporter.rs index f3e0c11d..52d52168 100644 --- a/homestar-runtime/src/metrics/exporter.rs +++ b/homestar-runtime/src/metrics/exporter.rs @@ -27,11 +27,10 @@ pub(crate) fn setup_metrics_recorder( .build() .expect("failed to install recorder/exporter"); + let hdl = recorder.handle(); let rt_hdl = Handle::current(); rt_hdl.spawn(exporter); - let hdl = recorder.handle(); - Stack::new(recorder) .push(PrefixLayer::new("homestar")) .install()?; diff --git a/homestar-runtime/src/network/webserver.rs b/homestar-runtime/src/network/webserver.rs index f18e4460..fac01e30 100644 --- a/homestar-runtime/src/network/webserver.rs +++ b/homestar-runtime/src/network/webserver.rs @@ -217,11 +217,11 @@ fn port_available(host: IpAddr, port: u16) -> bool { #[cfg(test)] mod test { use super::*; - use crate::{metrics, settings::Settings}; + use crate::settings::Settings; + use homestar_core::test_utils; #[cfg(feature = "websocket-notify")] use homestar_core::{ ipld::DagJson, - test_utils, workflow::{config::Resources, instruction::RunInstruction, prf::UcanPrf, Task}, }; #[cfg(feature = "websocket-notify")] @@ -231,6 +231,7 @@ mod test { use jsonrpsee::{core::client::ClientT, rpc_params, ws_client::WsClientBuilder}; #[cfg(feature = "websocket-notify")] use notifier::NotifyReceipt; + use serial_test::file_serial; use tokio::sync::mpsc; fn set_ports(settings: &mut Settings) { @@ -238,17 +239,27 @@ mod test { settings.node.network.webserver_port = test_utils::ports::get_port() as u16; } + async fn metrics_handle(settings: Settings) -> PrometheusHandle { + #[cfg(feature = "monitoring")] + let metrics_hdl = crate::metrics::start(settings.monitoring(), settings.node.network()) + .await + .unwrap(); + + #[cfg(not(feature = "monitoring"))] + let metrics_hdl = crate::metrics::start(settings.node.network()) + .await + .unwrap(); + + metrics_hdl + } + #[tokio::test] + #[file_serial] async fn ws_connect() { let mut settings = Settings::load().unwrap(); set_ports(&mut settings); let server = Server::new(settings.node().network()).unwrap(); - #[cfg(feature = "monitoring")] - let metrics_hdl = metrics::start(settings.monitoring(), settings.node.network()) - .await - .unwrap(); - #[cfg(not(feature = "monitoring"))] - let metrics_hdl = metrics::start(settings.node.network()).await.unwrap(); + let metrics_hdl = metrics_handle(settings).await; let (runner_tx, _runner_rx) = mpsc::channel(1); server.start(runner_tx, metrics_hdl).await.unwrap(); @@ -270,19 +281,19 @@ mod test { assert_eq!(http_resp.status(), 200); let http_resp = http_resp.json::().await.unwrap(); assert_eq!(http_resp, serde_json::json!({"healthy": true})); + + unsafe { metrics::clear_recorder() } } #[cfg(feature = "monitoring")] #[tokio::test] + #[file_serial] async fn ws_metrics_no_prefix() { let mut settings = Settings::load().unwrap(); set_ports(&mut settings); settings.monitoring.process_collector_interval = Duration::from_millis(100); let server = Server::new(settings.node().network()).unwrap(); - - let metrics_hdl = metrics::start(settings.monitoring(), settings.node.network()) - .await - .unwrap(); + let metrics_hdl = metrics_handle(settings).await; let (runner_tx, _runner_rx) = mpsc::channel(1); server.start(runner_tx, metrics_hdl).await.unwrap(); @@ -304,20 +315,18 @@ mod test { }; assert!(len > 0); + + unsafe { metrics::clear_recorder() } } #[cfg(feature = "websocket-notify")] #[tokio::test] + #[file_serial] async fn ws_subscribe_unsubscribe_network_events() { let mut settings = Settings::load().unwrap(); set_ports(&mut settings); let server = Server::new(settings.node().network()).unwrap(); - #[cfg(feature = "monitoring")] - let metrics_hdl = metrics::start(settings.monitoring(), settings.node.network()) - .await - .unwrap(); - #[cfg(not(feature = "monitoring"))] - let metrics_hdl = metrics::start(settings.node.network()).await.unwrap(); + let metrics_hdl = metrics_handle(settings).await; let (runner_tx, _runner_rx) = mpsc::channel(1); server.start(runner_tx, metrics_hdl).await.unwrap(); @@ -333,25 +342,27 @@ mod test { .await .unwrap(); - // send any bytes through (vec) let (invocation_receipt, runtime_receipt) = crate::test_utils::receipt::receipts(); let receipt = NotifyReceipt::with(invocation_receipt, runtime_receipt.cid(), None); server.notifier.notify(receipt.to_json().unwrap()).unwrap(); let msg = sub.next().await.unwrap().unwrap(); let returned: NotifyReceipt = DagJson::from_json(&msg).unwrap(); + assert_eq!(returned, receipt); assert!(sub.unsubscribe().await.is_ok()); + + unsafe { metrics::clear_recorder() } } #[cfg(feature = "websocket-notify")] #[tokio::test] + #[file_serial] async fn ws_subscribe_workflow_incorrect_params() { let mut settings = Settings::load().unwrap(); set_ports(&mut settings); let server = Server::new(settings.node().network()).unwrap(); - let metrics_hdl = metrics::start(settings.monitoring(), settings.node.network()) - .await - .unwrap(); + let metrics_hdl = metrics_handle(settings).await; let (runner_tx, _runner_rx) = mpsc::channel(1); server.start(runner_tx, metrics_hdl).await.unwrap(); @@ -374,17 +385,18 @@ mod test { } else { panic!("expected same error code"); } + + unsafe { metrics::clear_recorder() } } #[cfg(feature = "websocket-notify")] #[tokio::test] + #[file_serial] async fn ws_subscribe_workflow_runner_timeout() { let mut settings = Settings::load().unwrap(); set_ports(&mut settings); let server = Server::new(settings.node().network()).unwrap(); - let metrics_hdl = metrics::start(settings.monitoring(), settings.node.network()) - .await - .unwrap(); + let metrics_hdl = metrics_handle(settings).await; let (runner_tx, _runner_rx) = mpsc::channel(1); server.start(runner_tx, metrics_hdl).await.unwrap(); @@ -410,6 +422,7 @@ mod test { r#"{{"name": "test","workflow": {}}}"#, workflow.to_json_string().unwrap() ); + let run: serde_json::Value = serde_json::from_str(&run_str).unwrap(); let client = WsClientBuilder::default().build(ws_url).await.unwrap(); let sub: Result>, jsonrpsee::core::error::Error> = client @@ -430,5 +443,7 @@ mod test { } else { panic!("expected same error code"); } + + unsafe { metrics::clear_recorder() } } } diff --git a/homestar-runtime/src/runner.rs b/homestar-runtime/src/runner.rs index 4708aece..c02576b5 100644 --- a/homestar-runtime/src/runner.rs +++ b/homestar-runtime/src/runner.rs @@ -7,7 +7,6 @@ use crate::{ channel::AsyncBoundedChannelSender, db::Database, event_handler::{Event, EventHandler}, - metrics, network::{rpc, swarm, webserver}, worker::WorkerMessage, workflow, Settings, Worker, @@ -197,7 +196,7 @@ impl Runner { let message_buffer_len = self.settings.node.network.events_buffer_len; #[cfg(feature = "monitoring")] - let metrics_hdl: PrometheusHandle = self.runtime.block_on(metrics::start( + let metrics_hdl: PrometheusHandle = self.runtime.block_on(crate::metrics::start( self.settings.monitoring(), self.settings.node.network(), ))?; @@ -205,7 +204,7 @@ impl Runner { #[cfg(not(feature = "monitoring"))] let metrics_hdl: PrometheusHandle = self .runtime - .block_on(metrics::start(self.settings.node.network()))?; + .block_on(crate::metrics::start(self.settings.node.network()))?; let (mut ws_receiver, ws_hdl) = { let (mpsc_ws_tx, mpsc_ws_rx) = Self::setup_ws_mpsc_channel(message_buffer_len); @@ -636,18 +635,15 @@ mod test { use crate::{network::rpc::Client, test_utils::WorkerBuilder}; use homestar_core::test_utils as core_test_utils; use rand::thread_rng; + use serial_test::file_serial; use std::net::SocketAddr; use tarpc::context; use tokio::net::TcpStream; + #[file_serial] #[homestar_runtime_proc_macro::runner_test] fn shutdown() { - let TestRunner { - runner, - mut settings, - } = TestRunner::start(); - settings.node.network.metrics_port = 7001; - settings.node.network.webserver_port = 2001; + let TestRunner { runner, settings } = TestRunner::start(); let (tx, _rx) = Runner::setup_rpc_channel(1); let (runner_tx, _runner_rx) = Runner::setup_ws_mpsc_channel(1); let rpc_server = rpc::Server::new(settings.node.network(), Arc::new(tx)); @@ -661,11 +657,13 @@ mod test { let ws_hdl = runner.runtime.block_on(async { rpc_server.spawn().await.unwrap(); #[cfg(feature = "monitoring")] - let metrics_hdl = metrics::start(settings.monitoring(), settings.node.network()) + let metrics_hdl = crate::metrics::start(settings.monitoring(), settings.node.network()) .await .unwrap(); #[cfg(not(feature = "monitoring"))] - let metrics_hdl = metrics::start(settings.node.network()).await.unwrap(); + let metrics_hdl = crate::metrics::start(settings.node.network()) + .await + .unwrap(); let ws_hdl = runner .webserver @@ -696,6 +694,8 @@ mod test { _ => panic!("Shutdown failed."), } }); + + unsafe { metrics::clear_recorder() } } #[homestar_runtime_proc_macro::runner_test] @@ -819,7 +819,6 @@ mod test { #[homestar_runtime_proc_macro::runner_test] fn gc_while_workers_finished() { let TestRunner { runner, settings } = TestRunner::start(); - runner.runtime.block_on(async { let worker = WorkerBuilder::new(settings.node).build().await; let _ = worker.run(runner.running_tasks()).await; diff --git a/homestar-runtime/src/tasks/fetch.rs b/homestar-runtime/src/tasks/fetch.rs index cc752a33..54ce2e90 100644 --- a/homestar-runtime/src/tasks/fetch.rs +++ b/homestar-runtime/src/tasks/fetch.rs @@ -5,44 +5,32 @@ #[cfg(feature = "ipfs")] use crate::network::IpfsCli; -#[cfg(any(test, feature = "test-utils"))] -use crate::tasks::WasmContext; use crate::workflow::{self, Resource}; use anyhow::Result; use fnv::FnvHashSet; -#[cfg(all(feature = "ipfs", not(test), not(feature = "test-utils")))] -use futures::{stream::FuturesUnordered, TryStreamExt}; use indexmap::IndexMap; -#[cfg(all(feature = "ipfs", not(test), not(feature = "test-utils")))] -use libipld::Cid; use std::sync::Arc; -#[cfg(all(feature = "ipfs", not(test), not(feature = "test-utils")))] -use tracing::info; -#[cfg(all(feature = "ipfs", not(test), not(feature = "test-utils")))] -use tryhard::RetryFutureConfig; pub(crate) struct Fetch; +#[cfg(test)] +const WASM_CID: &str = "bafkreihxcyjgyrz437ewzi7md55uqt2zf6yr3zn7xrfi4orc34xdc5jgrm"; + impl Fetch { /// Gather resources from IPFS or elsewhere, leveraging an exponential backoff. - #[cfg(all(feature = "ipfs", not(test), not(feature = "test-utils")))] + #[cfg(all(feature = "ipfs", not(test)))] #[cfg_attr(docsrs, doc(cfg(feature = "ipfs")))] pub(crate) async fn get_resources( resources: FnvHashSet, settings: Arc, ipfs: IpfsCli, ) -> Result>> { - let settings = settings.as_ref(); + use futures::{stream::FuturesUnordered, TryStreamExt}; + let _settings = settings.as_ref(); let tasks = FuturesUnordered::new(); for rsc in resources.iter() { - info!(rsc = rsc.to_string(), "Fetching resource"); - let task = tryhard::retry_fn(|| async { Self::fetch(rsc.clone(), ipfs.clone()).await }) - .with_config( - RetryFutureConfig::new(settings.retries) - .exponential_backoff(settings.retry_initial_delay) - .max_delay(settings.retry_max_delay), - ); - + tracing::info!(rsc = rsc.to_string(), "Fetching resource"); + let task = Self::fetch(rsc.clone(), ipfs.clone()); tasks.push(task); } @@ -51,14 +39,14 @@ impl Fetch { |mut acc, res| { let answer = res.1?; acc.insert(res.0, answer); + Ok::<_, anyhow::Error>(acc) }, ) } /// Gather resources via URLs, leveraging an exponential backoff. - /// TODO: Client calls (only) over http(s). - #[cfg(all(not(feature = "ipfs"), not(test), not(feature = "test-utils")))] + #[cfg(all(not(feature = "ipfs"), not(test)))] #[allow(dead_code)] pub(crate) async fn get_resources( _resources: FnvHashSet, @@ -67,7 +55,7 @@ impl Fetch { Ok(IndexMap::default()) } - #[cfg(all(not(feature = "ipfs"), any(test, feature = "test-utils")))] + #[cfg(all(not(feature = "ipfs"), test))] #[doc(hidden)] #[allow(dead_code)] pub(crate) async fn get_resources( @@ -77,17 +65,19 @@ impl Fetch { println!("Running in test mode"); use crate::tasks::FileLoad; let path = std::path::PathBuf::from(format!( - "{}/../homestar-wasm/fixtures/example_test.wasm", + "{}/../homestar-wasm/fixtures/example_add.wasm", env!("CARGO_MANIFEST_DIR") )); - let bytes = WasmContext::load(path).await?; + let bytes = crate::tasks::WasmContext::load(path).await.unwrap(); let mut map = IndexMap::default(); - let rsc = "ipfs://bafybeihzvrlcfqf6ffbp2juhuakspxj2bdsc54cabxnuxfvuqy5lvfxapy"; - map.insert(Resource::Url(url::Url::parse(rsc)?), bytes); + map.insert( + Resource::Url(url::Url::parse(format!("ipfs://{WASM_CID}").as_str()).unwrap()), + bytes, + ); Ok(map) } - #[cfg(all(feature = "ipfs", any(test, feature = "test-utils")))] + #[cfg(all(feature = "ipfs", test))] #[doc(hidden)] #[allow(dead_code)] pub(crate) async fn get_resources( @@ -98,25 +88,26 @@ impl Fetch { println!("Running in test mode"); use crate::tasks::FileLoad; let path = std::path::PathBuf::from(format!( - "{}/../homestar-wasm/fixtures/example_test.wasm", + "{}/../homestar-wasm/fixtures/example_add.wasm", env!("CARGO_MANIFEST_DIR") )); - let bytes = WasmContext::load(path).await?; + let bytes = crate::tasks::WasmContext::load(path).await.unwrap(); let mut map = IndexMap::default(); - let rsc = "ipfs://bafybeihzvrlcfqf6ffbp2juhuakspxj2bdsc54cabxnuxfvuqy5lvfxapy"; - map.insert(Resource::Url(url::Url::parse(rsc)?), bytes); + map.insert( + Resource::Url(url::Url::parse(format!("ipfs://{WASM_CID}").as_str()).unwrap()), + bytes, + ); Ok(map) } - #[cfg(all(feature = "ipfs", not(test), not(feature = "test-utils")))] - #[cfg_attr(docsrs, doc(cfg(feature = "ipfs")))] + #[cfg(all(feature = "ipfs", not(test)))] async fn fetch(rsc: Resource, client: IpfsCli) -> Result<(Resource, Result>)> { match rsc { Resource::Url(url) => { let bytes = match (url.scheme(), url.domain(), url.path()) { ("ipfs", Some(cid), _) => { - let cid = Cid::try_from(cid)?; - client.get_cid(cid).await + let parsed_cid = libipld::Cid::try_from(cid)?; + client.get_cid(parsed_cid).await } (_, Some("ipfs.io"), _) => client.get_resource(&url).await, (_, _, path) if path.contains("/ipfs/") || path.contains("/ipns/") => { @@ -126,14 +117,14 @@ impl Fetch { let split: Vec<&str> = domain.splitn(3, '.').collect(); // subdomain-gateway case: // - if let (Ok(_cid), "ipfs") = (Cid::try_from(split[0]), split[1]) { + if let (Ok(_cid), "ipfs") = (libipld::Cid::try_from(split[0]), split[1]) { client.get_resource(&url).await } else { - // TODO: reqwest call + // TODO: reqwest call or error todo!() } } - // TODO: reqwest call + // TODO: reqwest call or error (_, _, _) => todo!(), }; diff --git a/homestar-runtime/src/workflow/settings.rs b/homestar-runtime/src/workflow/settings.rs index dc5c0313..dd83d1b3 100644 --- a/homestar-runtime/src/workflow/settings.rs +++ b/homestar-runtime/src/workflow/settings.rs @@ -35,7 +35,7 @@ impl Default for Settings { retry_max_delay: Duration::new(1, 0), retry_initial_delay: Duration::from_millis(50), p2p_timeout: Duration::from_millis(10), - timeout: Duration::from_secs(120), + timeout: Duration::from_secs(90), } } } diff --git a/homestar-runtime/tests/cli.rs b/homestar-runtime/tests/cli.rs index cfde28d5..69aa7c80 100644 --- a/homestar-runtime/tests/cli.rs +++ b/homestar-runtime/tests/cli.rs @@ -197,7 +197,7 @@ fn test_workflow_run_serial() -> Result<()> { let mut homestar_proc = Command::new(BIN.as_os_str()) .arg("start") .arg("-c") - .arg("tests/fixtures/test_workflow.toml") + .arg("tests/fixtures/test_workflow1.toml") .arg("--db") .arg("homestar.db") .stdout(Stdio::piped()) @@ -311,7 +311,7 @@ fn test_signal_kill_serial() -> Result<()> { #[cfg(feature = "ipfs")] let _ = startup_ipfs(); - let mut homestar_proc = Command::new(BIN.as_os_str()) + let homestar_proc = Command::new(BIN.as_os_str()) .arg("start") .arg("--db") .arg("homestar.db") diff --git a/homestar-runtime/tests/fixtures/test-workflow-image-pipeline.json b/homestar-runtime/tests/fixtures/test-workflow-image-pipeline.json new file mode 100644 index 00000000..bf46aab7 --- /dev/null +++ b/homestar-runtime/tests/fixtures/test-workflow-image-pipeline.json @@ -0,0 +1,75 @@ +{ + "tasks": [ + { + "cause": null, + "meta": { + "memory": 4294967296, + "time": 100000 + }, + "prf": [], + "run": { + "input": { + "args": [ + { + "/": "bafybeiejevluvtoevgk66plh5t6xiy3ikyuuxg3vgofuvpeckb6eadresm" + }, + 150, + 350, + 500, + 500 + ], + "func": "crop" + }, + "nnc": "", + "op": "wasm/run", + "rsc": "ipfs://bafybeichafzlolnoamugvfuyynjnj2gse7avstiqkeiuwuv2gyztap4qm4" + } + }, + { + "cause": null, + "meta": { + "memory": 4294967296, + "time": 100000 + }, + "prf": [], + "run": { + "input": { + "args": [ + { + "await/ok": { + "/": "bafyrmigev36skyfjnslfswcez24rnrorzeaxkrpb3wci2arfkly5zcrepy" + } + } + ], + "func": "rotate90" + }, + "nnc": "", + "op": "wasm/run", + "rsc": "ipfs://bafybeichafzlolnoamugvfuyynjnj2gse7avstiqkeiuwuv2gyztap4qm4" + } + }, + { + "cause": null, + "meta": { + "memory": 4294967296, + "time": 100000 + }, + "prf": [], + "run": { + "input": { + "args": [ + { + "await/ok": { + "/": "bafyrmiegkif6ofatmowjjmw7yttm7mi5pjjituoxtp5qqsmc3fw65ypbm4" + } + } + ], + "func": "grayscale" + }, + "nnc": "", + "op": "wasm/run", + "rsc": "ipfs://bafybeichafzlolnoamugvfuyynjnj2gse7avstiqkeiuwuv2gyztap4qm4" + } + } + ] +} diff --git a/homestar-runtime/tests/fixtures/test_workflow.toml b/homestar-runtime/tests/fixtures/test_workflow1.toml similarity index 100% rename from homestar-runtime/tests/fixtures/test_workflow.toml rename to homestar-runtime/tests/fixtures/test_workflow1.toml diff --git a/homestar-runtime/tests/fixtures/test_workflow2.toml b/homestar-runtime/tests/fixtures/test_workflow2.toml new file mode 100644 index 00000000..e81e6d9f --- /dev/null +++ b/homestar-runtime/tests/fixtures/test_workflow2.toml @@ -0,0 +1,11 @@ +[monitoring] +process_collector_interval = 500 +console_subscriber_port = 5600 + +[node] + +[node.network] +metrics_port = 4070 +events_buffer_len = 1000 +rpc_port = 9860 +webserver_port = 8061 diff --git a/homestar-runtime/tests/main.rs b/homestar-runtime/tests/main.rs index cdaa6596..466774db 100644 --- a/homestar-runtime/tests/main.rs +++ b/homestar-runtime/tests/main.rs @@ -3,3 +3,5 @@ pub(crate) mod cli; pub(crate) mod metrics; pub(crate) mod network; pub(crate) mod utils; +#[cfg(all(feature = "websocket-notify", feature = "test-utils"))] +pub(crate) mod webserver; diff --git a/homestar-runtime/tests/utils.rs b/homestar-runtime/tests/utils.rs index 2c868a41..c3cc19a8 100644 --- a/homestar-runtime/tests/utils.rs +++ b/homestar-runtime/tests/utils.rs @@ -23,9 +23,10 @@ use wait_timeout::ChildExt; /// Binary name, which is different than the crate name. pub(crate) const BIN_NAME: &str = "homestar"; +/// TODO +pub(crate) const IPFS: &str = "ipfs"; static BIN: Lazy = Lazy::new(|| assert_cmd::cargo::cargo_bin(BIN_NAME)); -const IPFS: &str = "ipfs"; /// Start-up IPFS daemon for tests with the feature turned-on. #[cfg(feature = "ipfs")] @@ -81,7 +82,6 @@ pub(crate) fn stop_ipfs() -> Result<()> { pub(crate) fn stop_all_bins() -> Result<()> { let _ = stop_ipfs(); let _ = stop_homestar(); - Ok(()) } diff --git a/homestar-runtime/tests/webserver.rs b/homestar-runtime/tests/webserver.rs new file mode 100644 index 00000000..8bae4ba7 --- /dev/null +++ b/homestar-runtime/tests/webserver.rs @@ -0,0 +1,127 @@ +#[cfg(feature = "ipfs")] +use crate::utils::startup_ipfs; +use crate::utils::{kill_homestar, stop_all_bins, BIN_NAME, IPFS}; +use anyhow::Result; +use futures::StreamExt; +use jsonrpsee::{ + core::client::{Subscription, SubscriptionClientT}, + rpc_params, + ws_client::WsClientBuilder, +}; +use once_cell::sync::Lazy; +use retry::{delay::Exponential, retry}; +use serial_test::file_serial; +use std::{ + fs, + net::{IpAddr, Ipv4Addr, Shutdown, SocketAddr, TcpStream}, + path::PathBuf, + process::{Command, Stdio}, +}; + +static BIN: Lazy = Lazy::new(|| assert_cmd::cargo::cargo_bin(BIN_NAME)); +const SUBSCRIBE_RUN_WORKFLOW_ENDPOINT: &str = "subscribe_run_workflow"; +const UNSUBSCRIBE_RUN_WORKFLOW_ENDPOINT: &str = "unsubscribe_run_workflow"; + +#[test] +#[file_serial] +fn test_workflow_run_serial() -> Result<()> { + let _ = stop_all_bins(); + + #[cfg(feature = "ipfs")] + let _ = startup_ipfs(); + + let add_image_args = vec![ + "add", + "--cid-version", + "1", + "../examples/websocket-relay/synthcat.png", + ]; + + let add_wasm_args = vec![ + "add", + "--cid-version", + "1", + "../examples/websocket-relay/example_test.wasm", + ]; + + fs::remove_file("homestar.db").unwrap(); + + let _ipfs_add_img = Command::new(IPFS) + .args(add_image_args) + .stdout(Stdio::piped()) + .output() + .expect("`ipfs add` of synthcat.png"); + + let _ipfs_add_wasm = Command::new(IPFS) + .args(add_wasm_args) + .stdout(Stdio::piped()) + .output() + .expect("`ipfs add` of wasm mod"); + + let mut homestar_proc = Command::new(BIN.as_os_str()) + .arg("start") + .arg("-c") + .arg("tests/fixtures/test_workflow2.toml") + .arg("--db") + .arg("homestar.db") + //.stdout(Stdio::piped()) + .spawn() + .unwrap(); + + let ws_port = 8061; + let socket = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), ws_port); + let result = retry(Exponential::from_millis(1000).take(10), || { + TcpStream::connect(socket).map(|stream| stream.shutdown(Shutdown::Both)) + }); + + if result.is_err() { + homestar_proc.kill().unwrap(); + panic!("Homestar server/runtime failed to start in time"); + } + + let ws_url = format!("ws://{}:{}", Ipv4Addr::LOCALHOST, ws_port); + + tokio_test::block_on(async { + tokio_tungstenite::connect_async(ws_url.clone()) + .await + .unwrap(); + + let workflow_str = + fs::read_to_string("tests/fixtures/test-workflow-image-pipeline.json").unwrap(); + let json: serde_json::Value = serde_json::from_str(&workflow_str).unwrap(); + let json_string = serde_json::to_string(&json).unwrap(); + let run_str = format!(r#"{{"name": "test","workflow": {}}}"#, json_string); + let run: serde_json::Value = serde_json::from_str(&run_str).unwrap(); + + let client = WsClientBuilder::default().build(ws_url).await.unwrap(); + let sub: Subscription> = client + .subscribe( + SUBSCRIBE_RUN_WORKFLOW_ENDPOINT, + rpc_params![run], + UNSUBSCRIBE_RUN_WORKFLOW_ENDPOINT, + ) + .await + .unwrap(); + + // we have 3 operations + sub.take(3) + .for_each(|msg| async move { + let json: serde_json::Value = serde_json::from_slice(&msg.unwrap()).unwrap(); + let check = json.get("metadata").unwrap(); + let expected1 = serde_json::json!({"name": "test", "replayed": true, "workflow": {"/": "bafyrmicvwgispoezdciv5z6w3coutfjjtnhtmbegpcrrocqd76y7dvtknq"}}); + let expected2 = serde_json::json!({"name": "test", "replayed": false, "workflow": {"/": "bafyrmicvwgispoezdciv5z6w3coutfjjtnhtmbegpcrrocqd76y7dvtknq"}}); + if check == &expected1 || check == &expected2 { + println!("JSONRPC response is expected"); + } else { + panic!("JSONRPC response is not expected"); + } + }) + .await; + }); + + let _ = Command::new(BIN.as_os_str()).arg("stop").output(); + let _ = kill_homestar(homestar_proc, None); + let _ = stop_all_bins(); + + Ok(()) +} diff --git a/homestar-wasm/fixtures/example_add.wasm b/homestar-wasm/fixtures/example_add.wasm index ff7d18bc174b0fb60040ba6a185d506963b932fc..23dced58dd0d910978b3d8211839be9b54a53bb5 100755 GIT binary patch delta 667 zcmZ8fK~ED=5Pmb;?qavK8w5p5>D$!<(X>IqUcB^0h*o2IAu-{yS?DTVpe?0H!Gjy6 zfK`djJDC_0qX{ALB0cCyi6>3eyGL(EqklnXF(JmoOXhvw_h!DCdAp+@M<1RE8F2>f zk&Jy&Rp;EfN^KdL<`j$RO4((w7uA<4Oo>i8lO?<6Is0MYXTeo4@>0Z+=`m*9_I;mmCcx9p_BKDTkF`JKpeZBp3fAO1Sngg6ggPm^JQH<} z`gZ3E_F#5eU|snBuFt$dWR^OJA<>xUIAew}hdEAwVX+wFs_5BMu(25E@>wVk>+)x4 zqEiU}0(o9*(e<+?V54Jnom5~$p3}d;dZ#x!0dQAVV_U@Z9c+e4_TNJUWGleQ4hN5{TbRY?0m>DQ0%}8h};VN{v9X^EUMux*qK9kbRR==J8Y>1cFc? v2jNn=x>#RfE1~^w1x!9N?b@RhEn>I<))FxGM zX_Bh72g@84L{NGu2K8A*}--kw7=5_H5Nj4(KR0I6HQ^3dZccm;j_1GJ&L(Zf26I`F5S&>>yC1Bx|W#ylnGHNtm2Q!wBj zdB$sqp+aDIP5uqaffm2y-4N^-FN5`A#CKAHbzV@v!eE#fnE|-VyV|y3^wEJV+O|Wl z1#^8Y49dD|F~F0)`0&w@4>)-h@Qy3V0=6(?AnVvU+;IcDs4zsq7I6$IhtFJ;BD-x< zi9suegg*&KaLvni!%hS!u_+N?Kotp)IXI;e3c&%t9C<6I2aeqUxX*7!&j_nKQ7YV zc*NgH!9M>U@BEi*COVSn;y)7?#L`YDQ~%7XB@@EMMsfmr!*|KY;Ct|Qm*g8S>BmEp uz|g&UkgN6Pa(k7m^5^=eSV9&kmdm+%t-@dsH5cnl3C$Ht)oYDPaelr&$3necGWu48k!dHyA!kZ`TkP8b% z%dr$2Uq2#$9!|bEI5dNWHoo*wu5c94u+c|VDrG4Wj3#oy#vPBL{ZZv^%mqb?c!cCH z$3KvK^w@QP4S7Ft#u}KQ9+t(ufzXO$QS%_?po6g?za+L{Q+AU16RVzM3nz3xM^BOT z>6=Ozn_j_GI5XDex8!u#QaL(ifLJiC1DAH{B8fjp%?t&2z`Nytrm5NJ$RDW|sB#pe z^jgd5mO{PqSNc4?;JHjrJN)Z=nKZ1*XPMK`?tjWWhu{-WS7VbhY{g{99FE)h5o591 z%$2IO@{LL@*SLG9sgC4FPswdljL~idRbY&cro+L$QL0i(@c+FVu<#Izb`em9th_=B Fe*r0`vitx5 delta 646 zcmZ`%O=uHA6rT4s*+jS7EH-M|{LL<*#9~4XF$iMmK#N3>Tok1qq<_|I+JwevQz{tq z=T8LIL8KN0Pe}Q z{)&*}gB>r?`a|1w=mxtfu<%@uKTy+t!MSaymQMYsWy7jiPKa&h` zuqlhB65#mhTI!IU<5P@grb3Y3JXR@ zUKxHvW=2M?0X&d*!zao4R+v-$G290!HzVmp(=}<~wC?5T&fto>^I_wW3z!OL#(nuY zQV5tT5ul(0r^2@6>F7C%+l^j0N_^Wwj!E+7diA&pMq7T1*8hub#OeyMeydeez` zO8a--t#}NY@@YH^E$2i08NjAoGBd;3bjDaK)>3oD^1{+$IaR%Rqo$6hPh@1@6cPGB beiay_rRnhZQ_+#7W!VhL^VX1(O^^Quk@}%+ diff --git a/homestar-wasm/fixtures/example_add_component.wat b/homestar-wasm/fixtures/example_add_component.wat index a2e56260..9e46312a 100644 --- a/homestar-wasm/fixtures/example_add_component.wat +++ b/homestar-wasm/fixtures/example_add_component.wat @@ -9,6 +9,12 @@ (type (;6;) (func (param i32 i32 i32) (result i32))) (func (;0;) (type 0)) (func (;1;) (type 1) (param i32) (result i32) + call 2 + local.get 0 + i32.const 1 + i32.add + ) + (func (;2;) (type 0) block ;; label = @1 i32.const 0 i32.load8_u offset=1049029 @@ -18,11 +24,14 @@ i32.const 1 i32.store8 offset=1049029 end + ) + (func (;3;) (type 1) (param i32) (result i32) + call 2 local.get 0 i32.const 2 i32.add ) - (func (;2;) (type 2) (param i32 i32) (result i32) + (func (;4;) (type 2) (param i32 i32) (result i32) (local i32 i32 i32 i32 i32) i32.const 0 local.set 2 @@ -54,7 +63,7 @@ i32.add i32.const 12 i32.add - call 3 + call 5 local.tee 1 i32.eqz br_if 0 (;@1;) @@ -154,7 +163,7 @@ i32.store offset=4 local.get 2 local.get 1 - call 4 + call 6 br 1 (;@2;) end local.get 2 @@ -217,7 +226,7 @@ i32.store offset=4 local.get 1 local.get 3 - call 4 + call 6 end local.get 0 i32.const 8 @@ -226,7 +235,7 @@ end local.get 2 ) - (func (;3;) (type 1) (param i32) (result i32) + (func (;5;) (type 1) (param i32) (result i32) (local i32 i32 i32 i32 i32 i32 i32 i32 i64) block ;; label = @1 block ;; label = @2 @@ -499,10 +508,6 @@ i32.eqz br_if 10 (;@2;) local.get 0 - i32.const 0 - local.get 0 - i32.sub - i32.and i32.ctz i32.const 2 i32.shl @@ -513,26 +518,23 @@ i32.load offset=4 i32.const -8 i32.and - local.set 1 - block ;; label = @13 - local.get 6 - i32.load offset=16 - local.tee 0 - br_if 0 (;@13;) - local.get 6 - i32.const 20 - i32.add - i32.load - local.set 0 - end - local.get 1 local.get 2 i32.sub local.set 5 block ;; label = @13 - local.get 0 - i32.eqz - br_if 0 (;@13;) + block ;; label = @14 + local.get 6 + i32.load offset=16 + local.tee 0 + br_if 0 (;@14;) + local.get 6 + i32.const 20 + i32.add + i32.load + local.tee 0 + i32.eqz + br_if 1 (;@13;) + end loop ;; label = @14 local.get 0 i32.load offset=4 @@ -572,7 +574,7 @@ end end local.get 6 - call 5 + call 7 local.get 5 i32.const 16 i32.lt_u @@ -618,11 +620,6 @@ local.get 1 i32.shl i32.and - local.tee 0 - i32.const 0 - local.get 0 - i32.sub - i32.and i32.ctz local.tee 1 i32.const 3 @@ -849,10 +846,6 @@ i32.eqz br_if 3 (;@2;) local.get 0 - i32.const 0 - local.get 0 - i32.sub - i32.and i32.ctz i32.const 2 i32.shl @@ -926,7 +919,7 @@ br_if 1 (;@2;) end local.get 6 - call 5 + call 7 block ;; label = @3 block ;; label = @4 local.get 1 @@ -958,7 +951,7 @@ br_if 0 (;@5;) local.get 0 local.get 1 - call 6 + call 8 br 2 (;@3;) end local.get 1 @@ -1321,7 +1314,7 @@ br_if 0 (;@14;) local.get 1 local.get 0 - call 6 + call 8 br 12 (;@2;) end local.get 0 @@ -1421,7 +1414,7 @@ i32.lt_u br_if 0 (;@15;) local.get 5 - call 5 + call 7 br 1 (;@14;) end block ;; label = @15 @@ -1567,7 +1560,7 @@ i32.load offset=1048996 local.get 8 i32.add - call 7 + call 9 br 6 (;@2;) end i32.const 0 @@ -1640,7 +1633,7 @@ br_if 0 (;@5;) local.get 0 local.get 2 - call 6 + call 8 br 1 (;@4;) end local.get 2 @@ -1960,7 +1953,7 @@ end local.get 1 ) - (func (;4;) (type 3) (param i32 i32) + (func (;6;) (type 3) (param i32 i32) (local i32 i32 i32 i32) local.get 0 local.get 1 @@ -2027,7 +2020,7 @@ i32.lt_u br_if 0 (;@4;) local.get 0 - call 5 + call 7 br 1 (;@3;) end block ;; label = @4 @@ -2113,7 +2106,7 @@ i32.lt_u br_if 0 (;@6;) local.get 2 - call 5 + call 7 br 1 (;@5;) end block ;; label = @6 @@ -2227,7 +2220,7 @@ br_if 0 (;@1;) local.get 0 local.get 1 - call 6 + call 8 return end local.get 1 @@ -2276,7 +2269,7 @@ local.get 1 i32.store offset=8 ) - (func (;5;) (type 4) (param i32) + (func (;7;) (type 4) (param i32) (local i32 i32 i32 i32 i32) local.get 0 i32.load offset=24 @@ -2437,7 +2430,7 @@ return end ) - (func (;6;) (type 3) (param i32 i32) + (func (;8;) (type 3) (param i32 i32) (local i32 i32 i32 i32) i32.const 31 local.set 2 @@ -2596,7 +2589,7 @@ local.get 0 i32.store offset=8 ) - (func (;7;) (type 3) (param i32 i32) + (func (;9;) (type 3) (param i32 i32) (local i32 i32) i32.const 0 local.get 0 @@ -2607,6 +2600,7 @@ local.tee 2 i32.const -8 i32.add + local.tee 3 i32.store offset=1049004 i32.const 0 local.get 0 @@ -2616,15 +2610,13 @@ i32.add i32.const 8 i32.add - local.tee 3 + local.tee 2 i32.store offset=1048996 - local.get 2 - i32.const -4 - i32.add local.get 3 + local.get 2 i32.const 1 i32.or - i32.store + i32.store offset=4 local.get 0 local.get 1 i32.add @@ -2634,7 +2626,7 @@ i32.const 2097152 i32.store offset=1049016 ) - (func (;8;) (type 4) (param i32) + (func (;10;) (type 4) (param i32) (local i32 i32 i32 i32 i32) local.get 0 i32.const -8 @@ -2697,9 +2689,7 @@ i32.const 1 i32.or i32.store offset=4 - local.get 1 - local.get 0 - i32.add + local.get 3 local.get 0 i32.store return @@ -2710,7 +2700,7 @@ i32.lt_u br_if 0 (;@3;) local.get 1 - call 5 + call 7 br 1 (;@2;) end block ;; label = @3 @@ -2799,7 +2789,7 @@ i32.lt_u br_if 0 (;@8;) local.get 3 - call 5 + call 7 br 1 (;@7;) end block ;; label = @8 @@ -2945,7 +2935,7 @@ br_if 0 (;@4;) end end - call 9 + call 11 i32.const 0 i32.load offset=1048996 i32.const 0 @@ -2964,7 +2954,7 @@ br_if 0 (;@2;) local.get 1 local.get 0 - call 6 + call 8 i32.const 0 i32.const 0 i32.load offset=1049024 @@ -2974,7 +2964,7 @@ i32.store offset=1049024 local.get 1 br_if 1 (;@1;) - call 9 + call 11 return end local.get 0 @@ -3024,7 +3014,7 @@ i32.store offset=8 end ) - (func (;9;) (type 0) + (func (;11;) (type 0) (local i32 i32) i32.const 0 local.set 0 @@ -3056,7 +3046,7 @@ select i32.store offset=1049024 ) - (func (;10;) (type 5) (param i32 i32 i32 i32) (result i32) + (func (;12;) (type 5) (param i32 i32 i32 i32) (result i32) (local i32 i32 i32 i32 i32) block ;; label = @1 block ;; label = @2 @@ -3080,7 +3070,7 @@ br_if 0 (;@8;) local.get 2 local.get 3 - call 2 + call 4 local.tee 2 i32.eqz br_if 5 (;@3;) @@ -3092,10 +3082,10 @@ local.get 3 i32.lt_u select - call 12 + call 14 local.set 3 local.get 0 - call 8 + call 10 local.get 3 return end @@ -3138,15 +3128,15 @@ local.get 0 i32.const -8 i32.add - local.set 6 + local.tee 6 + local.get 2 + i32.add + local.set 7 local.get 2 local.get 1 i32.ge_u br_if 1 (;@13;) - local.get 6 - local.get 2 - i32.add - local.tee 7 + local.get 7 i32.const 0 i32.load offset=1049004 i32.eq @@ -3181,7 +3171,7 @@ i32.lt_u br_if 2 (;@12;) local.get 7 - call 5 + call 7 br 3 (;@11;) end local.get 1 @@ -3226,18 +3216,15 @@ i32.const 3 i32.or i32.store offset=4 - local.get 1 - local.get 3 - i32.add - local.tee 2 - local.get 2 + local.get 7 + local.get 7 i32.load offset=4 i32.const 1 i32.or i32.store offset=4 local.get 1 local.get 3 - call 4 + call 6 local.get 0 return end @@ -3295,8 +3282,8 @@ i32.const 3 i32.or i32.store offset=4 - local.get 1 - local.get 3 + local.get 6 + local.get 2 i32.add local.tee 2 local.get 2 @@ -3306,7 +3293,7 @@ i32.store offset=4 local.get 1 local.get 3 - call 4 + call 6 local.get 0 return end @@ -3368,8 +3355,8 @@ i32.const 1 i32.or i32.store offset=4 - local.get 1 - local.get 3 + local.get 6 + local.get 2 i32.add local.tee 2 local.get 3 @@ -3400,7 +3387,7 @@ br_if 7 (;@1;) end local.get 3 - call 3 + call 5 local.tee 1 i32.eqz br_if 4 (;@3;) @@ -3424,10 +3411,10 @@ local.get 3 i32.lt_u select - call 12 + call 14 local.set 3 local.get 0 - call 8 + call 10 local.get 3 return end @@ -3440,7 +3427,7 @@ br_if 1 (;@5;) local.get 2 local.get 3 - call 2 + call 4 local.set 0 br 2 (;@4;) end @@ -3466,7 +3453,7 @@ br 3 (;@2;) end local.get 3 - call 3 + call 5 local.set 0 end local.get 0 @@ -3506,7 +3493,7 @@ i32.store offset=1049004 local.get 0 ) - (func (;11;) (type 6) (param i32 i32 i32) (result i32) + (func (;13;) (type 6) (param i32 i32 i32) (result i32) (local i32 i32 i32 i32 i32 i32 i32 i32) block ;; label = @1 block ;; label = @2 @@ -3687,34 +3674,38 @@ end local.get 0 ) - (func (;12;) (type 6) (param i32 i32 i32) (result i32) + (func (;14;) (type 6) (param i32 i32 i32) (result i32) local.get 0 local.get 1 local.get 2 - call 11 + call 13 ) (memory (;0;) 17) (global (;0;) (mut i32) i32.const 1048576) (global (;1;) i32 i32.const 1049030) (global (;2;) i32 i32.const 1049040) (export "memory" (memory 0)) - (export "add-two" (func 1)) - (export "cabi_realloc" (func 10)) + (export "add-one" (func 1)) + (export "add-two" (func 3)) + (export "cabi_realloc" (func 12)) (export "__data_end" (global 1)) (export "__heap_base" (global 2)) (@producers - (processed-by "wit-component" "0.14.2") - (processed-by "wit-bindgen-rust" "0.12.0") + (processed-by "wit-component" "0.16.0") + (processed-by "wit-bindgen-rust" "0.13.0") ) ) (core instance (;0;) (instantiate 0)) (alias core export 0 "memory" (core memory (;0;))) (alias core export 0 "cabi_realloc" (core func (;0;))) (type (;0;) (func (param "input" s32) (result s32))) - (alias core export 0 "add-two" (core func (;1;))) + (alias core export 0 "add-one" (core func (;1;))) (func (;0;) (type 0) (canon lift (core func 1))) - (export (;1;) "add-two" (func 0)) + (export (;1;) "add-one" (func 0)) + (alias core export 0 "add-two" (core func (;2;))) + (func (;2;) (type 0) (canon lift (core func 2))) + (export (;3;) "add-two" (func 2)) (@producers - (processed-by "wit-component" "0.14.0") + (processed-by "wit-component" "0.16.0") ) ) diff --git a/homestar-wasm/fixtures/example_test.wasm b/homestar-wasm/fixtures/example_test.wasm index e4368bb748551fc41c66882a57f0e5db044b980f..b382b252b6466241d86a0e378e0019a8fd910b6c 100755 GIT binary patch literal 285147 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 yeLcRz)_Ft=FO=G#h08{(OPIts3OU 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�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%0DLq6d(OejT2eNsPm*(@ToS_%BWtvxO6NhNW1 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 RQEIIx{V6WmUf#>+{{bA*be;eJ diff --git a/homestar-wasm/fixtures/example_test_component.wasm b/homestar-wasm/fixtures/example_test_component.wasm index 033cc89a1d73a1012c6b94c5ee9781303c282924..914a7b504c272a5820a29a939d6f1acbdce062ef 100644 GIT binary patch literal 285548 zcmeFa3%p%dUGF$TU~J2S85vD0R*)nIp|vHg6+q_^cBGB&o*Q&EfP^>aUZXca!{ zP6d+29K5#4Zo4S~0)!GYK+qg4Btoi@mUF5G*@Xx}0|qD%B}kwF0z?dlpwW{<@Avl~ zW3ETC^Jt6be(vYq>~_sL#~5=w{^S21|1oBC`<=fz9K}(5a_{Vj`#6fC_7u}Zf8*jQTDSxBeqUg4&Wrp17w#*leRnWi3P0g2~5ZN2KG(v*aWUo+4c^j>j zyLqCqySugXOpSL_shmr*0NeHjpH=V8q`#et8r4V)w70b$g(6#<5nCGQ$@WV#qr3jTBDLi*+^Pz zM0qxQPAwU!)%*VAvG2dMmNrHjBXj4?OC#QDWNDI)q;xQi=g%3crYX-Eg}4ssK5Zn8 zpj`T9D?*0U8WMf}fdaZ4o(|fPm?8c#&zVv0cufP4J z03eNT-4z4%Sp{`4#9m(x$Af1Cb8`l<9I>ATY3Pp|&5XRlcD z`gH#9Cf`lJ8~G-qp1eM9#C^7qLXlOxHOlFuh!OO7UA zNWPr>L-OC#W9iq@ucxQtzezuyekT2^^rPvA(j)2bWyjOEWxtypNT<`s)6b=!O+TIf zUHbX-3+dtXVEV~)TlU86t=U_$2ePf%o3o+K-*3Gij?(MNX0AA5bm-F0D>& zzi6v3>WwvD)2W29R@CRnK$R9*ZsRN}V@azmIB`?gsG}kiC@LzPI<@Pgn!k@a_3I-jf(c(T0k}Jj>!YPSW?;hg(PF#Hxm#p+3%Ofp zh38pe+FHOPa3W)l-Kp?wyHnxZ3b(9qe0?;F$Ep<`vO5)S*qsX3xvN=j)$WvAu{-60 ze?{GLAy@8{8{3_7#Q++XdxhO8_j0>a?h@|&h%U1`<<7S|<<8?yn16jVVt2|Nwmao| z3V34cC%z>LD7xt1osLUJ|JOYO^nd+RMgNPv@XXM^JCy$i(EtB94>L=|%#t26OPEs6 z%*g37Gf>8}G2;*YZ0xgfoRnk*&&@pVOiN~!!lohz#z!rv6KoPMfXeDfsx*Hf%ui-4 z?FGY8vbxA%%$ToypqkXBZZtCCkr8c{%pY2N>>ZX3NFSXH4eWEY5-c9{>UuvzJ z`n|r?YB%+N^rcq1srNnRho(_v-PAX9Q&aGYtW;Td8Zh44mzQtQWRair^55B)4|e+e zxR?KjefgHzt@-_BPFwsopJ-Q@_DvJ*OtZ{XRg=|B7E>eKhzlE9k=|+eqG>8;1l+1` zVD9Nx%)IJt&?5yORwngXO*f0#-=@O(=L7Op+p$XhpU;f!gdyjnyt&|{7xp40<6O=E zJxZV;7rjvQ1ACs1(8(Z@EZ?ktf#{J#k5gu5THdQC9vUz1AJ3+cu+8mpueXTE%+oR@ zpX6UnLLX)>?FM9L+y=XhY{+b@s#n{RhMwq6iX)>lHxHtBpV<7GcS|l&BFo>T;<}yJ zNgcq49C=)xETkLUsf&8CD=jv~X&;kGe8;2@2>_WIWHM8+7!+Uw8ZC*3~c45Il3EXuwPl#oIGfl`74J?Ue0Hfm#a z6@kCxbJk(c>!iM2kUxo~87r*bI2^0?qUzaR)w8{-*dF2tp+6Jb^Qs&4C@p%(#*YB98?T`wBN&_sL45Ub9( ziy^B8y#<=B^91n?8Sz1~U|>;g4>ftII-yz4-!nx6i>bL*Sfxn;($)>NeCH&G3RrWI z8BcHC0KU7iHt-Dqh~OL}SsKNOw9OS!EQ(>k$fw?28#IgmJ?yHz7q_dfi5Q-G=~Bd{ z^{qn(xr5ho&414@Jj&l`z;1pU?@x)ikaU-F{F_*TMk8yA_-BlSz-5R#p6FnB2;EW_ zuZM(qD&kv4JK(!?KD*m=r(25HGrUP}q%4TOGFbxEU{WsRN!?nR%rl~t$*_>Am;6_C z2|OYHtCAR7q9H>Ds|V~9ir`Pv)R}>bK?6(h9IIWCu#fXU59rk65?28RBmdcCO-2Hh zv4>dIl9O+@SDJGy#}Z38-QMGTXfbigU<7L8r4Bv(g^WF$0Meg${hz%%b7!{ipM(Me zFH=J<(VU1WNsrRzsnMwHiA__p`D8V&plG;P3*wQx%T)fvy?SjYnrNp6Tj04? z&~@orQG~c#2jEV$RUeR~w+>KGJ-mN1QuC=gf@KPRkRdbw%m>JVKrCnDT9HCbV=;!R zxFaQ?Qz}c`WTHur^G9US1AeuD-lrychjHnyVy34!r33-&k#BrahP>PzCz?g(81w)Dl?)jN7iwQknX)Tlk#KqamXOj&>gWwX%zw7>fj zp1%7?aJx&brn38>?8UlY#9d%<=lcjSdN4=ccEOA;0039|K6{`{s{6dyVQ~JwuflFM zj0l$MU$!Com;K!Nm;HU;%VlrWs3^<|_*<(2@=^WU)B#*ax;I#MK*Km$t!L|yTh6q* zBYP>k^(y$EFxWy(*xXrk48HVR`U+=^S>}LK>vD;oH11-5tD}B3$Sy72uMU=nY zzoqwfsAI794gjMeH>g-j`@--j`s$cw`GGMG!b}3P07(G`MTRfRdQznxgNZ z2an)kvLRR(dDnauz74t>`=QKgHdn*^N*H+IvT0%@iDL7(WD|iC)3hX?IuH7LY2*9b zG~RYLmpvUvWu^UBlM5pa0IbECdP6-_l>rp_&JvRSiPnz5`$J6pFEcgt3=^&M%>@j+ zD8Ye+Q_7ve^thWoC>jDxuceaIssUF)F`Ij#nst#GKqVpv!~ydm$L2~f*+IbmHMh{4 zyU21WTyV?28RKnUGXv$U&bIC-J39eVK(4z4C6BWUJ2oaY+J{LtDS1ac!V6Qei0gW{ z&n<7mm9Z?NhA|@>Kh{CFZQK*Sc;+N7Bzfq{3EbQ~blsmOXg{RH0YSUmu-RZ{(w2_( zI&Lx`kXduE-HLBlemQS6#cnZ5)O z(BWbH-#&lplW*Pi&3`^-&e&*t+qQ3f>w6FV;MjXM;j?JIKr@G4CaI42wA#cCRZYtV z$zp-B;EH(pWywDBDeNS7rJH{3H1^V74L)kVq^BMAyH2SCComPH()r}*Go47>)|jpw zi1b#zPmF%8MsU|%BDiy)(g1z>Ys#ecR!rM`;dD?hS6pcj!U`(zKHqvpt+zKh%9OPA48V^naT z06Ac>JjsNg5q*b?%$rcf_6$;p2ZragAI7O*9G?qgr3V-%C5+z`qrWp<;(lo5Trw=N?x>7=gPT+zBU)9&bRN(G1&0nZVTL#0Af|BU{3LqXOv;4Gj zNka95m`Qlg6bXyr`sIK`iskebDQwAF2_2TQEo~EWnbpicqROJ?k5QyxjFH2z-bk}?$i>sxL3o2xO(5?<()8OH&FxQ=$ zyIL}_TF5!e{7iIkApA_bQPe0|XDS+~wQleI)02_=3Afi6;9vS40~NTp5TlC4_hBXS z2xTl`V!cOs9tm=EQL*7cK5eD&o{S|+I<+;LX8c`6ZK7QhgbYfl)GVp}?K-l)E>jQA zsiny})fE$XGB9=JCTrw>;#(a{uJ%=pwQH)e(9bfQERDdkA5%FOx9idhsI{S54L4iz zc2QZIhHN~(0T*ASZcwwo?q1L87kN=DPF|2$r_`bTp~ilwjnJuHz3D~jMWprD+k5e1 z9cm1AsDu*8jPr3`mo?zHH^G>7`9kxy9y9H+8%V-^G<)fxL__0m}See66yD ztXxWiasGocHEKh{P@Noi>bCd>Waj(fX{JY_Q0eSQ<@ie`@`J*u=2a0*G6=D3-lg*Q zOp(4AS|k*XzSzLd8)x3Jkql~D@qjRPx8 zUHQ=mn9TcrWB0z#z3+3_sr1^l?&zcjs6s;1p`GNO)0xu|C8Hk>$Up|vWn%+y_;#P~ zm*JG`1vU;ez{H6TN{#U*69V#>$I>A5Zj^!0#YkocpW^{hUnci2^aD0 zOv2YNz(}CaBkp?03jhMPF&1it93bBP0*-kr_0#gQm;$8?Y<}e3#1d{wHZJD>0Lsb6 znoez*fz{@`YIb_v>*dw_fU4BuI{J`S*6HF6G4v^RVcc6HEPkEz7u=FRAv_uNx0NN?`y3|}8TLAo0I zs;-HP5fjNxqxer6ql#wuijwKlQLcjW5nbucVM||`JkE6--RhvO=v4c4)%d1)*cUP% z;i{F}KMmJyx&r(&6@NV(u7|>Pf4J@p*X`lDIb2WU*hEaz(7l_tPZ#j=bp1o)r{nuJ z?_w3(EiG6ajMuK~5YKa5P3@>5K;7P|5L0+wbK5LscePafYHo|A?CeXKQp)mVJ3%LU zMSvwO?60g! zPt(tWiQG$y;Qgo;TIl~CdtRA5!WHl0)bK;6ZSrs|rtMh690O%KRRtMTdqD<@X7ND= z&}ZOLmHCwcPg>ko#mS!BWB}c2=p-~8OSV)sSa*_&>JuFTqimXOzSPX=M0lfIDA^sc zF}<$@)R_c=rjFBzQFJB{;leJ1%3$>YMC6npLVck^rj+VV^n=Kq>^8-V?#y6QrxHIW zC#^{);u2;9{j=NDmisitel}p*E_#7SXW^Cyu{O>HV?~I{ST_qp*oGOKN}uePZR*0ush z$dp@HU2S~(_nD>dR8}RA0`Kv?-@0dV^5FHWlD&GGJcW|?u3}ZPTTkyjbr<7R6vGr)uqHtH$kEatK(fN_%H4d0bdNP`$_Tn}$tz){5q;^f+E=f*bUH(Hzh3 zhoLXLuV{_exx4nhsqtjW%D{tL*rBv>cwjz{RKloxy({U+I2AAK4=;FL>WSz;McCOT zn&XM*E&@v3?J!L4a+ec{xXM^^9BqM4UYux{4yhTy*obD2Rp&98>AEN(oEqd7U-{Ul zziP9ozMYGhC>QkY5fDk&eN=zPgoxWFn0O%dL&VFi={iiv{wAPitA42#aR=sH-&a zc-37;cW0?4hDW72w*nitvqLKNtEo``9M#kR2drm#E-9>2$fr4p5Wo3fdxTvPF=Awy zS_CM^ck$q6LWrV00_n{LKZ_Fawgzwwo; z;|i^NPG`732{qIgphHW_#eO=r%oNs!vz6{xAq#h{W$I$o-lD;JnORx_Xro=ljwTR8 zu?#>X19R}cW7=OGp{o7#aMW5zq(w}x-Q+#@PQ7~V@MR9afLskXjZ&_``i#6ms-?(& zM)nEy0G6`<Y4r#RnE42nB#L?=rB;My9tK!4{i&=wsNMa>NPX(><8<1Av&PVp!Ve zFx_K7z$9zWrMja?5V=Wsw=)kThTxBRZqt7p?F_@XKItnfhS31U=$MFOD9(?E`=d#R z2|85AxS#Kie-3Gve@bs4_rCtQD1Q+8jgX+zf6G$dWeAYzl@sj+Tz5WaqP>voHgcanOKw*C)hkftfCJ|3{2z9YNs{7?0L( z8omNNtKyplGQ13CY9qmsIu3|n9F;nf9uVxeDiX5xl`<1 zwgElKYGVQrP67qpZXhC}(_mTHx)rda>h5M>Hk()y8#I}Is*1))_AH?N zENFUs=e=MXmd@rE1IW|yM6n30-Wt0zJA{gdJYk@5&|&rIbX*d;qBT&)q$-u{Lh(x$ zdPr3#ttu*-Ox%`t4b*ii)OGT#y3C50sjlNz7Zq(!+>XJzPK3ISpH&yZ>@)Z4sMSS9 zI}^8Ou&!gFuA^twb>1-^rmls6t8n`UYdR8YI!sNTwaTYK;Qh>f0u}cV#SUtWHQgdE zR|yT_(n3C=Tv1(L)YpL(pp`LZ4{61}fxzV?Yle9S55Q)_ury%UQhBgUuH~QBjG~)q z0Ua_K!Do3f+*AIZdV9z)aLCIOILbBg_7{sU()Fcu4bR3k@jG5jFlBn@3x=0D+^}-W zFLSe96@`~kEz_tFGf_Zg^A8XNH{rI!7z+claV%qQRYeVT$A-Bey0ZZ)PEOu|J#|G0 z8kh*xIX{>fq6a5xhlfk0OL@ShY+p5);%|hlky$@_twF3N!Q4W7z1mvPbXRy%JrVfJ zZurK{!v)P5%;bTe=onESClWC5@?-V(QbD4~*7&GL1Pk~0^_s=fVn`W9J^zd+Jx%9{ zdTVLZ&2_D!E;tsNbzeWRt57~rViE*!j8N>jrLJxF?@DeNUTTaAm0~I7B=`1w1Y(@H zCN`uK`nWBY!su1e-ntth-q$9KMpG(+{hhq^M);<+`k-vbS1W`$WlGc!fk~`&4dMv4 z$+Rny66eJl@gy-I<7v|84k7B0S{mRQw{L$}+L2ZEhr)+U-Wv3c3qPKCF^4OGW@~FV zAiNt$@H=6FSosTp$rVjE-%rIJ_3z2}mf_3&EJzHZSJgH7!%Un^fO$Yr3T08vKPxb| zM!^u%Uu+dAjQEUf}JOU6lh+nVY2? z9^mP6Xwd8t!si}Wqv|g2YS}R`X-H>nk*)XT*9il665eTADtMaZpYtfebl?eH@OKa%)Cur|TWa#a=Jx40wxvXs7{-uwX*JnQ6nwzAk~PBzL>i5H%ytFx~sRgBm*6 zom#g$B2YR|>trTyy3J=SICxCJhLepU=u>h}-Oqr5k&eL~c*nSkh})OT!YmoT8v{k# z9sh3ICTe%ReWjj}lcoI3yre^8iQ8?bF$kfF)iw!rTmCXhM znR#je1hYW8)8#?Y5GdLNFP}9lRt0^~%tWB6fWR!Qp-13)2qa~Yq%&iM=0F7tP&Z)A zQ*VE!X)sI$#9W9IQ>Tq3Aa24#yO8VIR}p4P zLpXsn(DgW+%)ODTg^r5u$v7&bIG^T*2I)Y(V zbT%+vHa-*`V+utvp$ZvmNAzpcn$h7vf+D$@rWV3O#`>uRw4)`#`B^(zV@Mh!Sm~#? z);GQ4=bGA@fiZKJ3jiH@1v(W=A$1&yp&+JnZG6YVQCFGeE>s=E4y+|uOG=VOK{#@yvH3=Y82ks>F14&q7w!# zFa{-7CHu>|PtgQv26F(Lcy^AFW@anFK*$lbMo+WJFZJdzDT&Qs; zlF5CT$bObIZ6+q%WUhCm&LXmG_krL2qT(z-q8C}Uv7ft169YoC#s(Nacny??K!2Or zY39)s=5l|`P*LD|Du$$$z&;!67)sq$Z$XPj)1xyC%QTCnAc%A#Q{{k~K@W~DMp`VD z4r22pHNcVpxCusN6cTo#XiLuOHLuyUf@Z^NS|6%NcP~2Ny@Z0bfQS@l?{tNY)$ix$ zEZ`Cnpcrx9NY|>f000qcvTQn$B)|cXf1wmj`;o7j;pv3E3nCbeZVAns!p0T5Jjen~ zkx2>Ua=o<#E2ulaRDc{WqB>QLx)OA<{dD9W zt#{fgg;BR`%^-HEf6LCnt_42??3(^q^g}?e&Uw+ReQD^`xe$6m#GseNY!|)S0lls? z#F{9U4Wbta4+j`(5g>CmdR;jKdR;k)ULI-of;5Yuqa$L4`QZ|A9tnuE*Sz^|H>DQ4 zPgq39<`=sYR`~C%upCcJ=WdgAdx&MTyvHohP(>JseTQ-85eU-XV!CFxu?KCb0JY3k zC$K9~1%;WuO}E2J|Gm{{ixOkWc57`1Mx*70)>QwgTaj>Pd!KD%`PB}DQ_0fLLaYl= z)>eA7V34x51psXoWqEhqjMU_5Z8yd~943cixG7-y=o(7EJkaE^b?7t-|-2QkRwdO6L^GH5as-bVFzJ3p@33+zrUFjq#MT;1OOOgIGRD9HC! z40-#iFvkfd3kH>H^S0=c3QW*M?Bb>wGtBWG)Tu=-s53oHevzvNO`h0{^H{*G*&1e_ zRS^uAzyPTnernc)84(qRwm@9H+JY6Ai+SR70GnApacjE})*bCBnL&q?I%~?OVdYtd zGPYv9b(!a@=bF9+ULxcH<6qZ-vE$S--PaiWCE35)MJG1_r)Egf%TKLNJjb@n1&aabVdI>rySV{7 z8bLnvFeh?zx_O{SutIkC>9+E=3Hyb75VpX;jdx-=n1n3wIW|u8lNnJ!DAMoZ=*_83 zb~_~d-_jUoIJ@iaGJ_AbpdMY)7`kqq&={7Q zX*SYt`ZSw7j0bY`xMemV<1oFJxoDVXNFHNqd#%51iVA%p6)nK9vQG<;m*iaOKl($E z{yU%j423@%MzOulr&}(aLHO5hh9XS2tQw<-f(z!FfC^JBO>gw7B)Yn-1C%NyY5?;X zv`wyUtOu!<9MVrg!``09W}#o2Hu zos9;MmL$u+8{Ocq8K4_D%q-|8_q6{*rJIp3ZSo{t`gjELr@#wbGpG}a5H)qe6DboR z|D+=%8~tfOq43>OG30}mOtH%mP>5bJU3Vb8g(W;}HLp4#o}~5E+@s(M{$vS_9^>iY zOp>zbj(%KP$vq}CsCi#dnH~k3OyVGdsnY8qGpscD-V};#Wk!aWk=g$aGtvw*(!jmS z-?a6)G#oPxhL8p6J_ogrx_TVE`O9lN2_vw>R8Ub|~6CmdhU`H%n!ZYNU8aQ@Rxc zbBNW;lcknj1TEVOF;pYCo7T}yhF(m$V`A)mx7n6ax@18rOmDMbCx1V)6Det;U8s6- zPziJT=2g0(QrHIwATi9XZ1UNrMA7Z2V$xTk&{zOrpEy@J%>-5?uMW&$VIafFZ}>W) z%Tals8BCpp0SR{#>mEVKEwwYW1;@e}>5gzTgb?kx1&S~Tt|~-$P`EleR0Du+Hf~^A zqp6sBHuvjgJ72C&7&Tk+LP}bS65c zT;L)r-0{B}U@eno4^AaW%Z@v3dEO?3gyel=*=GV+17b+vmeBxPM9v9`TDf73Sdi7M ztb5;$aX8fB>!YvzylB|NlLdaQ^76EsnK)zj%bA%~$)r)b$eAh6!g|Oy)^W{2YwD2L zxJl3IwD;n`D^A}kb=)1IbMyUB86WQ)XGc<>-7DlH^^i6Fc$^;*Q*007=MM(eP3bQ%fdrc z7FJWG9}vV&v#ekTinql;RxpL+N@i%#j*nrf7sC^6Nc!?(K2~k9bYe}hWTGuMR|p{i zaI$(D?fKY`E{LJSb-iQ5@C;aGP&CSoL!oyzY|Cmj9gae|;ClvXaM(btMx7`vC+bZt zaTx0hTrgt8ES(`>?@MAat?Q#BHOx?MPqNh=x~X}a9tal1$4=H1`KG&*)pkqWIBlVy ztov7)VInN-ErN;NbHb(w?*g)jBtmS;&>A0>%vBH8WjKZGyZQj<9@Eo z7*IdgC1%m?A+50!KaK^)UU~Rj#l1|2kLkQfJ5J$Zbfd^R(aoX2wZwVOM>oB)ywjzd zCQ@Kv7+t0VTlY-o@vw9P@_bHdaKSQZPJdF_6~l8=CI<$rAP6a#%aJ}rv+CBcx+)yv zr#=w;iS+3G1zfQ;VRmH(bXF`T5bHy4HmWETSKceBgjzrk=#3JHPNcOAvMKicFpyI= zHbQWHL@Z$G;lDc7LIbO^i;6y?_t}yUqI+i@)zW&Oe?`oPS)82QZ%6nkazs)_+A3o( zCS!hJ&w)K{nWl&Zk6z|2I#3Yj>^XgdmKnsUz#R;LCY=IL-%oE(y*_Xjg@OAa_j8u= zUF8VN{bq3{$GTuFnYoaP;n^?Ome?@~VpjSsnNx56ju1YszFI7}b!a>;L%vlLdtvgo z3oZz3tNJv@k?d9incU;`=supQbng`ttp@j1^RN2CWy+(~{E0GU+R7ZL=Enw8_E+<- zl_}b8q)_Gj>w_tWs`)pR(!;Ft-$9a?D)bl#WQwO=o}9?qS7`*Gor&_U5a;o5I-%X{ zmg_lmCv5joj_nNMJ#N@b-T`m|g>sBxD5q{YV?O7AHKF8Xwg<_IAL=Gv-AmkTWr{Js z3rSB`PcSi%6xs<-&w)g2uaO3DI#tt$VU2p)maR&sbx-jJb-ij;vO`zmL$~XSl-Q;# z7{685)~a+fmbQ5rYVISc>{sG-B|*niEoZNYrc+_{jl*W|*WAaf49W_Wfa7T##3@=o zi-tR=Y4RiEGvSz!Wo5)_Tj+dmJ*|ZVhvm*Lv+8ObC;lx60GaJCuW;Si( zdV+N()8f!*kCG;H^|Z7ut~=FDuG_g60*y5nT}UH22iO-WzNH zYCp8Q(*R`3t%U}`K8Olpf}|i=LR7o-zM>%Jk^EZ*E^T!Xhx6d7xsMx4x6yD`MEg@% zN5jQ0Fuxt!mdeTXY*2htQ_awXL5j6D44P8K0lT2aGhmtWCMgrx5ATnkW;bbmLPb3r zQ-i13Mtqal*78);uHAZ_Ryg;&|6Rmk`RY@7E#dHv(Be~h?Q&OnIwKLB@NHK2-<)WObEn@$JB8QKVL&{4jJSi z#@sq=r+M@@%voxe)G$hxcM4m>VBf7?j*2Pb5UO~6*<5+c!EH$nRJF`_tGAFv9h`^1 zth7e4IWebglPw1ldEwj5Gy!%>Od5f8QjB>wjA^K!G3|-jNJ1mKV-qcEgf00nuc@hN z9Nm8!7+q~`yO3u~Co7_Xv%|r3wCDwF8X0EK)7o*Xjr7Ua%=p?%u4o&$cRiAHv?r&PSZYelJw%Ne~x^93GoB zmr#?GI@N;~PL*c;%8ejh0Istt-78skn(%@u8yL_`Hv~Y}-S#&LO8;n3>O%-qUdEDF z3$l0RZ|P;b-S)zN4JiZMjZUb%wq9OzU)^buUKe84oG20OEgK`#Jvz|XX4}BY*@GYg z9+?X2tzYVVFt%N5+nF;>aqJ$nx&MxJat8Wq@4P<-TZYs;{2bKZz|7_poOJr zetPzHFuQmw<=j$0;nk31aMRzIqo zw*~Ze*q3+L_45$A*}&+kyVJdsk|llooU${=lloLeiW~d8If%e#GJxuG^u?=wR$$Zu zE3P)i!T6<1^u~YH|FsLwiSIkct>|H)8ZH10>npn;RL^FnC59rd`t4m7Sic5ruDi{K zB0dm_UTq2cN;Y@*l^BojPQecYfNui$ z$5;kbq&)(DD5tG>phb40g`rG#hoS|-9yEU#L%9Gh7*EzVu$Vp%ARK8j4!T%J;PUg< zK6F2m(_d^#?%h5j*BdkvF(_LyFP&H|gk95-$wY2L>&kieMi zCW>SDA!Yb`#28??Vrt@3_Kf)Eag<(Zof5eoEctgmSDMMvMef4yEa#FfU5rWNk!F=% z<*icln~xO{Rw3GM!}XsjSlY3xb9F<*b}1a-?ty$iS5$$q>HM&+OWS*ZRqLoE#w%GVkOi4cwZ*8)F#qp;Y;`8snBIS$Ih8i5CND`5v_+$C`(6=bd7)1cB-2f4 z%JNd{42ob~mUmDD<#QfO)*JQv+BC!y@6?3F`S<*2E;wbZ0hNFdS)efb*GxY#5TJzg z3@MpD78T&8?Oa`6-rsk?u6Mk8T!pCP;;LQcTEfy|fxlJFA7le6dm7Cc;qdsLvVw;X z$4pB;oczt|zQ!j_OJB>Vgd;wL;3x{g>{6)eOwG*4E2mHs4d4A$>9^BhHm7*(H10>d zV`GTh52RY}YqRj=_WE0OYLEBRnF;1^!9tebs3R`j0 z$mazv=Pp`r4Fa*PP&yxY*0djy_x zM2ET!wFvOrVR_vVy~NMZ&#FDtFB-bwAwx7IVN;H1&p<;5x((%Sp4&Ir&`*i@#*!DR zJy_5FzDhMZa%#a=IYfN%SiY> z)i@3d@zrt#?pm}eu@9R2ANqU`b6{5@uTZDOANe zH*FcKxiNu}p_Y1&-W%&QP$ zSsSZ2I+4Y?{-EV_og}0(!w2*=BVM+pi&ihiXj%rayOdn^39h}IGR(*tJe&Ld%`93H^ zy=VpL#3?IR`Wo3kQYE@WfjL3{Q@8ueHhYC>TuV(dD}*w}&$~KzFfV|Hi~uxyCqGqz zn&)i`2JP1r1&7JT#4>m>`s1vqh^F1{hxVhYV{kTqo?{uYe{4fJgEHM5ON_0v{_IWd z+aUteG*_MRs3q8%K5Fwg6}cxP_Qc0)?F3XJIDB?`Q}f=m_gyEQk)8V1;V7y9NF!bz z`*dTGK&3j*Jar4WE4YGLI@LUXFDgAGRS_O0+}4 z{P*q!vX&8EHAng2to02dhD_|9(Mv2tk1LNV4X+cdBS#M6o1IK)Z zdDp0HWU-$^Srs#!wo9ndyEW-Hb>U3j{J-8qiXqtG(XwH@<>{ckU^bBY`2(Fu0`euA z>=-2FTMr(${D-pa<3X$p1;7=YflVEFSynUpRMCEn4sdVNtYU!)C@E2t8Fx%M;~qGg zm(xuvp+z(sZve-H@lpdrVRQtaUF;LNU#`c)<#DlFH36YQV1Me?@>7Y-b|QwOX;0Qq zSQIWZ*v=r2N}&_=aal}7y+~CxL_ty8{Kav+=N5&?-N6qjXtnf|Sb)bO;<4NjOMjouGN-)i7+NlozR8rX zF3}{R0dvkk*c|E}wQI_w(f#@o6L+cO=%AY<30$mA<#>r(1hr$+wiN>2poa}XTtByr z;=>?bNdI$hn|+H$hb_ETm!YMBwNn{MlbFD6P!mqjA`HKxB^QAK!ey6*1GnvP3@C7+G(j677C=rh)N)n113-z)#=@^ z559wO%WyQ>I!C871?Ds;h-j4CdLw<)QT7CUr>^P86J~)bG_IRFHQv==G&o|4*)v~x zOemp7*!+zxC@Rz^`RK0@u^{FqDzqyUhYL)PeYStuk8r9?5H715c?@^PNUt)TUZ??4 zr`)4fryoZhzn{de)o-1*W-PAN&myNWinfIL{<~s)rx&KbUKk>fbKYD3Cf7UhtxWBLtjyJ)NS+hZ$%9BJMoRNmX zY3{`j0S=-{`0vXlI>np3O0t@gJXww6SpzkqJCNbdJk~#n#$8Fz{ANtbP?g&=P)2X< z8%UvB?%+TQopVP9QdG~0{uF0lt1^)oWM#(~KixFA4$4OBZR!qN@O|KM_Qi@T;qQ}n zz;_(r9h*??)>-gbIaa;hK|8a-c9jDd;z51vRCl=}=Iga?>fb&>Wk;-N`1Xi}j$RXq zzpHD&kmKPML9VIqeH5>#G&%OZ|G@D9L0mAgCH3~5Vj(q(EOd)-szRS4WqOQ@P+~B1 zIgvuK=}@$39@0#ZsuFc{!^H#oNGVm%`&~!W8<`(o_aYX{nUK_Y(()EnO~mCq zH4&BXkq4#$keDLoP|`j9UmYpWxc?Q<97di=ya-mtVmN3W7L(Yq92$tN+6g9s69^`D z7`q93KRg?oCSIhtum8x6zHi_3PIjkO0aHSV{^bWu<02SXpNfD$(8)AH#;DON*vjKe z^ZXw>aun9YK@NUd?h@39pNx{#34~X~a_RCar*G;~RB}2rDP=~_l^l6&Pbw4#)rQtg zwRyY|50$zI=k!+sW{Y>wqht-Qa3a5ShztFx=!=Zevvz})p~b$0JwSS=5dUYdo*hI+ z7bHm;Er;cRak7umA12x&e=Y>8-Z(s~py%Q~IC;c)hR8vrBY=s#3e1PiJQJM}V?HJ# z{XG(zbR?dA=U7Y%V=R<|k#_Gf-b7xA?2?%g&N+brNP7)+Sx?q_L`l?PHkp(q{h6ak z7Fe-_p#%zy>%;xbE!NScUavvq6e;6Ma4{H$>A;a2iE(Dww+u71f`e&P2Rp`E1{i*l zGDh9EVuS&1RZ*L@aFt4B;RLmtc~K`=9vo;~O3c0iaiR_$97q9j?#MYQC(cPZb56>Z zbK2U`pOWj?XQ7_7!hM!gq8}p-DJ6Q&@HMI({|Z~QPb~F5ZXrcGy!nAHD%;1m;aEsR zknOIuU=%YZK6%7i?P}wh6dY-xV58WCyhD6k*Gn+wP@h|YNBHB2YMNDVsLh1$w3MzL z$(m7|Fbx3u=Ha?7?nFNfJo?57c;snQ@ZT}rk022m1f8{Skb5)*ovl8;HbCh;1Eook zyrvp2uV;7{dWK@uqzJ=s1O1Ge&J5H<+JLM#^00O@Yj;b(-1I2}@2hVI2U0Y)BLgXP z#hn;PF~T!g;4&k3$3QFAW6QN6x_yK1_CR=M0LW*7P+DmBgB;HrFcE`zgluf^i0}8{kja~)T)J$!h?-yOldn(X>m_wHWnVAx-}^;BVrCL4(a2x>P>Ea?`f`bOi_G-B z5|7q=uVg3WV>0E3_`Q-3SNH%|P-hN(wCBNb2j4CiXL$-SPx*sWH1Ca0BcFx z9!vt3&rFSVW0D2`qmyV2TKPZBjg|uv&Zl%E1Z`H`h_ov4C`RHY3pcs5D3Ve3b)h!< z^(bkF;jV~n(RLvkV<8Qx=XetjpPWqk{djfnHEXqFilZCa(Dji^h1^Sjf>f4qA*3N^ zdcf3Dk@{|$CY$1o-LK2{Xp}aWfr3K41ZEG#ajrJK#~<5c=%A(cjp32{3sDyZvlY=o zA8*Ka$rg61Cu8zb#fXDlwI_GJ! z^yF7P6H!jaVoDUw21ixQP=~aSjOmJ&N7D);TNSB}5dgA0`cy9g0FrPZBoHm>agei7 zG#Bi1leURxU9i*e+&m=P(Z55U=KDMoVQBIqGr@c)u&8RG1IxKPSk$&U9gN(uPtXgm z_e)O746lyYDa=syS5$XtU?W))M-d>Z^L0`A0nC-*uEeJ-$BI4$V{52@%;L8=2!29S zUT}b=MbnB;?)z)n>U!U#Smz&7Z%xt3dMy3*Ng6ZdamlyN{>%{Z+kP%X7nAN6Pm|>- z-xn-rltIFC7qV()t{!->PN$`8A8TYlJ;+w#M%;al_S%Q9*h>(v15l?DS}7WLmtf419e@r8T6`tuht z-=|Mjd+U=4qcIQ;^4f1-_@h1}cuK@8BCMTh_C1HL%8^T#acvVthVGN#M6#V(iTkph zkeE4+drH@#s%m8B|74a(&w!z-XuwV=~Sh`#5wEf*~y4E zL5rk$Q)F_1k78NRjX?WGA3o{~=2ZLTih;4%ypno#f9l!ov#)ig_OI)j`_v>hc(`-CSf0pwv%yOPZ zEqBl-e61|^xG#6aCx5+Ljswf};y0Ag{AplC-#%viF?Q_9^U>3H$Ywzx$WQqvF%t>{ zkz|2}#_yThvUBV7W0UBs4~?hyZ{CH!|DQBRQSC<&H^5t%bJ(E#UypPS#@mT`c*_FU-(tJwU zGP|Ws2yG0X8}+JFz}kba`4#b=Xy3*g*Y`?dRbm2Nb00PzZ@!hJ&oAmmyco zhX&gfZ-|Oc=au%#pF<09dV~$ zyMHoj&l=y<&P{=s<<2NY+%;pWaWVr77AJ6=%PpbdfFoMpe!Knrxs6wQeE+XzpE| zxzsY}C8O;*TEo8N3Y$P=_E}X>RsIX3EJn;yyKERKa{W);xrz7l!H9MN(nL9R&3{YJ zk^O1N^lnXdeRMZsi8O!}j`{GVwp8*z>qB`D3}4RwdJwpKY{d=T_eH1#2}c$w;)5lZ zDO3~%c%g6qJ`3lPn!lg81Bz_yu7ZV*d;xX58;g9tKABL;?Y3?%Y-`xD{_ z-R{Hb`npf}Tmi9*{;0#hXK(dwZAf}?(HHFq%3#GE*{tD#u?%mv{0!ZCF)B{qr%dp! zsH}ZRO@&D7ZU^aVUk6`os-M@miP4}!cX$9yq4&^8xHDDJMkIa9#-@>VIm(-|Ua-Nn zy|vOrni*~!87+`T@6Rl1mUduYa2w2+QPk8l!eImV!LDf0sn-a^qB_lT3#CQhE=OT5 zKR7E5%*FY~Oie)5`5RzhCGs!c!<)l)f>eT`;Vn9#B7#obq3=*oMBV)odco~Eubb{G zVwAq5{@nk}`hzAVQthwtwa=_Zd2kIP+HSyI*Ng*TGVs!c1m|V>p9??$S|SG&G3Ac} z=|biN4s;dp-yu`N+aC$)D5bn{q``YdUoBl5XdQ)j^Fdy4t9IuMqK3S8e zI_z7@Uc}0Fl3*>FVDpLOy!rxYp8uOhXu|(|wy(aUQphv#q%8qTMW8%S7^5L@nF(S@ zfotmf+yjb&y-_(kp8JCD$iYt|L>m--jHWr*(Cv;yj*0uq|ksnM6x z=(QJX^f|uKYiSe_*c<10=Ziqt{>ftSVZQ#^Pbh{x^WbZ}j#>!Y1q5<`lj&d zk6EGTGdBG%BRn2%nx;g@wAzOAj(r+a@|zKA+Q&i0^>UXUpTA@v8V0q->p>mYy_; zM3qW*7fD=x-3le!(CDUOklDrJVB(+*u`TKQ8qR!sP%q&a-l+ukKk&PgCUu^^%=)4H z*|soMxYRLK*v4fR7@uBML)ck-(TmPV z$>K00cl5Okp~tN$K{z>iM67Xum&#I6L@-CEsnGal*rz~zJa7wPJh38>=(58HF%`8lue= z?vSMhCnkMlL!g(g%`2j0brFHZrN48xNyAX|!fplD8xikW{xA13@s|>Rc}Zay-@DY> zK2wdWIAi@EdZZn4E}iUQ*$SP6qqgwMf@0EY4nFxi#6dVMXP`>*y)&*HjTHmlyHK@7 z%N3H(jkf@2Qj1EC^Z`2}#^q=N;bgB770FSf5AUDk$SsAu@igV1SPx*fsgiGVX=@G# zIam}0FWyW77qlU4?MbX!yz}`Z>arXd?5iP3CnBS$uM2l;2-(4ZS5*wHy^HFfD^7!F zrjHFfruI+~q^6bk}Xvur~Z>KDcJjs)Z^Q&H}%n2F3Wr z>s-QW6Y3fvE5uq6fXbsq&C4w(j!n#)QUvr5Y6RB7UJcb=4MdO-X4HGdW`W#un z3^0l2vK-*7TdX%Y0{A%Hc`IUiQKWrTGajLt`|W$Fxuf3}PZ+wt5dgsNurXKqnG>0D z&W-g-z&>x49u%zp^oBG51%Y}}xDW=%mx{2i^ZN`n%>^F|_1vos+&BQzwWHwhtJfN& z1<{*F!-^==?9YlUQpK?pFcj2j{x3@qDeeo9d%ixSe}i+hW3ccew*L7M8xj{$^L24l zQk2a_vTG!b6N}!}YFy&2iBv96I=~J&B}n-|*JhQ0*-OWxpHuhmV!o4?$VQ8FJeGJH zzR^cEPfGxSUwFgJ`s%Aow2FS~8D{h53xpC}6I0(cF+&nOz}NDy3#QM4z_4!URN!&L zQGUiW37VZ~wi%&|Rz&aB?2tvyBj{;ZGviv?g{@z$<`qI` zjtebM`n?haU(aiURVKGVg=pKGHSUO^AtcoLb|pxZCysS-I~pzFoK4k6n(BTISuB+% zEK#|)t27eyLpBU0MkNRQA3&2^z2mge@k%1=bJMS!|IiKkOTug@F{`sWd zYR&;91xQJHK&0k7`e1vFQ~Bbi)XiaA7>G^hpD-l~FHc zqA(C8g@I^EffdMd6d1v*+51ssT`xr##24$yNY90T=-e3++~WMB9zvRhC0ftMg`&kn z=(_;XWR7V%qW?JBt`ykIJ-km>QE zG1XaYRbwe^vJP zxtzaDXC_~*PF&Ziz~6vq7?16Tko?saxyoo8?r6dOvkF^aqBk54$=LLTT*g9_Ve3VN zeBtsJ`cia#dC;%lO+i7{6427L+BK|b^C1J0Bnwk%B3q&gUxz46i=Ax+DdHYy)d1C7 zp)>o8%$B*My5^<2M6a*)pubxBDGJXY+7Mas&);KrsPgOCv7P`cS!9B$sm?9ytzZez zsb-m?6B2w&)bX(rOa+Pnd2C@qKrn@^J9Nw)ixM14tqX@86eH?$P+kQQ2C7%od;37M zILdp(&lVTeAY=HL4*YeN#>p~(hXtBT17x2S4jY5}0p$^kG7yYgEMy2P(LFmkhrblL z?Z_OqbuJ-A>}jL`z93zkZ`T<7922RO*trH=GUmtBb!I~W{P~}$oD7(_EL_Cc2mBMbsR zM-I|j=@|;QEC3w}91^>CfJ6R4eEtY;fFp`Xyt*ML9&QrUO85ig^xqjYx=8>~O2+{M z>akIz*Mw(^m8ybLf(`7#`lEJIhx_@d2on;y?<*D={ELCq zC!hQswgzz1oamsnvV1FTC}U+Y9`EUX*3 zvwn^H4`7-pN^67#peaifM+8EnPPinM>VNIO)GhTyPM?K~H>_dBkDH}8jjp%7H;^?o z5E+_DEr!cU?c}0w3Rr9dCSbv?OJZXDh;(0Jr5*xNG?!475GYaOXbFA`Dq|Czbgols(7hKlId2j_#X3An)2p8_L3L~IQG3x^0RgeGpLt9`Rp5|~zQ zwwNmF#@#^S5WXR$%z$l@5*At`F1?5WGKHYxsyAPN1QrDTUX9O&#+}qzwDMpku#ZKm zPIqiXuInoU8l7JZGmc4PzK(c>4+4N9gP*b-)zBbE|T zTDYwk7ea%^tsD?!EismgM5-<=4cT8eOX7ox;Y^dpOUCG+y)y~1BjN%gAI z>y<=1y`q)AULo2;uV5kry%Jbep5B?E%Pny7=2Bg@wjRqI3R{kNdws$zRa#nSM6FF{ z@W%B}9HUvYZmkd!LuU|=+i>)=5S1xUenv1cZgKP49>SWY7JOFbUkP|BO9g}#O98Ds z!rnL>fpJWjbr66W4`R^Ni(%hIY0WDLVutZqXw6LZqYKkUm82O@)jZ~JpF-++`=~cR z$snpg8bUxO#czE^s>A*Kq`*VElah!A&DPLx!lVG}fHAf=(5xYG{F3<2LY3Y;s1JjG z1F#@c$V0~rL_r6^08@`4>_3^b;~4S{t0P+4bQ5ZiTvR!@e&a9*po+Fg6JcK2&N|8d zfGS^)r&}w_bQRgEB2XQ0DkAN(vIO5J<(oY!je(t7;;!u|U2T>N^G`M>%W$%TlwKa{ zVrt#e+YRSeQdj3Ur7sTriVU}peS5)O2@nNQsKzJ~ImKa%N)CGaS%qioyvEA*g% z&(rC$UF}Cu{o<#+^6BcN+h1$cciXn~u?^H-sUy;)bs9O@fVr)^Uo=>G-vPY}NX8w9 zAfX-5ZL}%SZJS2QU@Go5Ike=RiWr29ajoS!#zNuciHD!gj9_h@=VOAW)`_t`RwX#C zvkP2R7sVgNbs|f6x(^6{3WQ$ZH<6kHcf}rs)pwlH4$Q+hv@>k#x zjRc|0`{JsaFdwW-@4+ReT3VM(IZrvL6~=Sdw4qkuOQGQ86HfCKoP4(BSO@X3mzI;2 z3526KUz*St()`#e!Lg?m3tshZIz%a;mH6^Y*n)ox!5}lmhSME0ii4O#pY)PMZ6i_T zRgwk;uP}zpzyb#8Wsf|Pz4-bKO`u^9|4>}~6VOD+hMc0&r}j>nYpGOsMx{WEkQ)kHD!EfihKq;XP}ow* z-Qsh%hul!uQpw%sb9aW^P}ow*-Qjb0hul!uQptVL=k5);p|GWrOOK3cal6MCd^8jc z?^$Xu_mPlm*Okfi;N!mVXxEj=fx*Z9;nA*`mxGT7!=qg}A%F1k@$hI@nDOA_k??3& zMl|?%EIitkgO3IuPlQLiGS%Vnl&(y*OhSeqaxIm|Gd_27$PI-pmE0*MGu0tC6t+}y zxA@%cAvYAZRC2fZ+?^pe6t+}yclg}hAvYAZRB|8mxqCxyC~T?Z?(w;ghTKrtQptV9 z=T3**P}ow*-RE-;gxpZrQpw%#a}R~wP}ow*J?L`}hul!uQptVX=N=8Yp|GWrd&K7+ z54oYRrILHh=bj9?p|GWTK3OvSQ1FB=_*69rxS%&>OcucH5{vurEdA+=2zX@Nd?^ux zFjI4eAtt4q$lYpM8?Fec5#p8TWT^yQaIx|#92d6hU&Q_3U9T`mi={OQWUA8#lAft~1d2c@}5vx+|Zf6wQ>kiTum>r6+NL?|J-|syz@JpZSCbv%W@_$nmR)QZn zX7ksEf;j3?WKpW5_oNDdd@dInc@?#%`0-bA26<{S1;1vuA#QcZW$Ls?;8ducUbwB+ z-Xnb}a+5Q3t6yut&s~+ikQeFfAB0lKJ%0-@!?p^wO?6%0Iboq)-+9_Qq#`)aw=b(G z)Jj`=YTaiV$h2ANliTgvnr8R%N(t6A7oU7@xo-6U7CGMRoMNIHc9P*QIO(hDO zIIe2x{kzQ(b3?q-uJC+GT>>$8&gJ}5(#Dw;`&V#qu$8$!I;3w%l@%!rYH)$d?H@g=oHbI-<$jK2qx}KgDI^eda z<>t-uZSs2EQuS6t$GfeWWB6>HCVM8uZWf3Y_9r;Ia*viQ6(- zzN)F5)>%rxe5ckynUZZ>MPnzF&hw*O^*lwokYMv%K2oBxW9pU=@Q(%1PP`)ec3kj# zg5R;^Xq>;fgvXeC3eROqJ-$#v^mBCn~!1Y-)d zuaCCQO;G-ACU_EU2%&b))rS>1DrW9P{ywWwAD?`vNFUlL-#S*RxJFz^n4T>6k^p?4+qW92-4i)QbYmwTr7nUb`7x-D(t@rsV^8&+ijpO|b zu8(%<<>Z>^j~3i8Lq*ggR5+ymw5(E(wsg`>W?ifqV|*^TX;^XB(>Uxskqs1>mVHE# zMPweIr62$+>aMck7=524S#Y2Rcg@5Kf5wfC^2>Y~>gX&H-2QN+)j@rogULUXY3Yrx z6!JYyh7ljpZcc{w51CeK+);?1SVUhZZ01lO!Yc17*s-`|q#0HMJEXI2%N&*Y0{~ex zZivt5iuQb3S9bcG)D<7&30*6zl4H6;+DCPzUq@%Hik{>iTie&18y>kuAQ|18Eyw%C z|5P*|sYSEF%h_op5j|AsI0gT$woMZw^{cWx&GUTLh((jRbRhFbvRRc`vu2H88^xUV zkql%$t2$B}85tSIZX^JW$hH1zm(_bUa4TNwAE2`TH0ziIcX|wv6fUN zY>GIxDozStJlf?-R zof7;`a+H;xPc${3eDbU*`hrTEZQh5Po9z~WRm31m7EIh%`et?-nTmkcLL>#m?3rRi zG3D^(t&xzE_hVW5i>uPrTCuumSX&8B8XkX>7y6NAzZ3!YX;L{)I0~Zd8(O34qR~I` zG}4bl(r}deRtI!tv1-4r zER0R-3Yb=}ioSdvOro0*QodC@Z(Pha`2}N2HUQzu~EJC?73oso;m>eX7R<*;+&>No=#KqpH@??r_P^jgT20yVwHWzRA>r9ge72CavGtEH=;;Oo(~|zT3;G#$^x*}o(q9xm`pX4g zntW)1mnQobcxm$J0xwPWF7VQ1&jLvkQ@Z<98dJ|mHg&CK=rWjO(|Wuq3&Gcm6q2FZ zx9qQN5!piC_c)+Ms3D+-J9P4e;E`*mhmMjpLM^9lhH0+*cci zj442*n(u_EM;vK|q_w(7bbRJab(bAgp9ee2Hsk)P2~I>%TV=y7yznzs*4I%))j&t} z+}BaoH_!~MHY%IBHW$4RXen%>f5bDukMA}Ke)jRK8M}1}0Q)ZnFgEi@Nlb@p_`qiz zVhJyWh7H1tkg35DavYWKSWS-V89UaSSV6mgm@_~>@wMp?>ltekywC{Fg4Yayk9|cI z1xpO-Pez#1ta_`4a0M0}lp*b$Zs5;F@!{)UnA2Fq9iJIN zx6vJ1GTM*sIQdgy?%biMSZ`Pxk7V~D(#8`-ni`;y{9eOgGOKEht3DV3)R164OAiOS z=18{A8^lWW3W6!h$V~s-C-Zpg(_#J3ZKwTbz&s0 z1fNkFAZSc0(D1~PIO2isspVe$}ViDl3SQJ`Ye|Q6h+o^agX`KQPLkJ1MeVCD^C8?LZ+%?^)Lke)bcIf6Q@t0?hVz}9wu<5 z{x-tv8`jP*k9LOC)&rg9Hf#mO+v@QChdLwUo9=4Q0%h!gfn+sX;#onC3Y~A5Kdi1j z?}2Td`U7w5SUTBNFIeaV7x{P<0UYZo%I)5?9jB|6YheNlFsBw2X!8Vlbj$gQICsd3FQmdnJ}ES@ z*guVy^)SrStkl(u%ZkOtXudbNV1*b9irgLi)<ML>!H$1%Uf%Yif7t`kG3O&{ti5~L}Wy)ek zrxd<663Sdwa2nP`d!YgYw9pq*Z;`z1I(|c2hS0G^KyuO=;9!yV;o`El7DI2#x2Wfx zdVar+0BNCJP8gUE5O}CSEk8mGVWv$q<|#~Uw*+5E_i%(k0;1)7j{!%k4Q?;beAX-V zI*9J4n0x=I^XCxOfp0)R^Mgg~A+=l#Ep zIQKkb;^gz#Vp)U4NvPV)#91rJuS=Zt0ODK#vtx4X!$-qLSPQHK$%~-TMa2?mv?RBeb>#hZTvmt+SRI}n^w%+4Ohz02spHH*9rgY?78hb6R)^;${dF|jd=^7H?5Sgm zv5wFWUWp=m4h>b8gG#5A)PLDJMCjzU4<@Xg`s4~!@|Se zeT>61lru?SC46${+rp36Y5X#1<_QGzjBPRX6XD>Rz)sGiOK5lBCF&AO`gMttOD(ws zU1CA8q>p704%F_kEa>U~XIcIF#8YNjIt;30Srubh;H(aTDp{7)3ZqWMsaV!9#VZ$Q zS?ALw7J+9^L6`7izemGp6UF@ejYi~yH0!C`By^zZQIX|T8dQZq#UxF7N);9JbOzM! zQ87evE)^s2FGj`r|0S80qGz{YQv>3!IPs0dpPsKN3^VRyhW0K6f`;0U{lK34|h zCn3tu=zz@8jK})}GC@I76pOtTD`WHO1M>QB!GPSU49M|JBlN|XjN336kA3&)i#q;8 zeb|3s+!*aY)K~By%(=gHHRt};T&^U^1@bqDvzV~jVNt6%5e(WELs-SZAA2%`a>c~H`ndg!fw=S1uh~yU z;%Mr;^fCL{bf-SZqtCvjgZ!z*^?xZS;-@so_b1&-KmIv4>4ug2G$-A@v*Y?lv%-%* zx&N}@$8%Hh<2wg~q@0)jNv1H}dFfHIT`VU5^%&Q`f1nNX_Cp(mx8HB$^BMLBZQReM z%>!*L4YXk~fzU<~6X>_`*-VlB^U@`<$t{Xrz;Vw&8x}bTZIqFNvM--vGaI#WPZmS_ zu?<(hIQ<0Huba6zy<68aE>1tLYkF}if$>L7hsgG*b-ot*&+MjQhDoxl^Qe`jThpYw zhU$k*aTPNI?=@jsqrDr4ql({|GXvi~E9Ft6Y?v7!jkq!$u)39Uyq{$tE9H2ZWpI48 zEQ5iWfzwvX)5|hAZKWs>@&2c3rQA_kDS6*Yxx=iKI}0l%KW(K*vzFNh?>lX!Jg=>k z!viC`%{HuLrF=MADTjxxl$!?HSk+4T)o7*MG;F0D8farxE9IA>m2zmt#;R7z zJEN6y@X1;!i=~yqX$6IqvKXzD16k*PM$3(fbKEH6xeA1G=89Y9%FB{Ftd{NO`69{bv&+^jRG&(X_IEaq`B#|N%Oom zX-=f49C-O^8UimTIO=;KX!6KF8>^Z$|2++Xmq$3He4veE18uBo(tJ4$ftO?HP~e3# zDPzh8R#`}@Tq*GK7ikE*JjlW1mEcXtsjPQS$}mxHhb)g@HEBpsn;B1(Q@P$BsLb!M z=;@RrC#TJfZ~OX;(`Lral5@_Tc}ivmXX>IjNc&{h{BnNhsF@jGEX<7bw3#trX8hV| zGvj$}X52q8G_M*t`Fu1p?jJTYmIm5b)y(*8G&7cl&5U~n+E~@h_*67A?in^SIKk*t z&5VynGvml;Gvh9C{RlJT*Mpg%Fv#f%n$?zWtoQd;mTs_Y_oPL;%?vCF^#=!}BAiDiwPu_O6y%O2U0SoX-GshT4p&#au6F)XpHIxVtC*lnydPWtOg4+rB! zTWUTxjFTs^O8ptlapiQDigCggB9*l(6+311Wh|$SlheitVi?lTx|?iWDtleHkf`;n z>{0Py33!i8Gp)a1O186);|aMfH>`M!ov}iIBkx-(Y(G5DslH(rB|mMaoT{Djq0@HC z^E&du{@XEH@Pu~CZjH9vl53V*DeOg8X=GI^mhD-=4pfy!R<%+7FU_!Q zOJ1i&1}zl!imEiSs)h2uhm9+KOpQD_`-EMhP$aTX$S^DHlh+74^Vw@-)`(K-*%gD{ zrkuDv!cO^!sj(SSX0cResO>O=PTMS?aMisqZmifW>AJwYEjGjG^wFr zG<0^yJn8prK03#Rh`QsDKTHqxILkrH$CB#ZWebOBt=&{ zhOmn(M}kw%wgh~F!yYp?!D2X$u5E>#BiVC0fTO)%4}Mjfq=aqW*r=5qS^L|hH2nGM zG}d}tncnc{ssPJ6Zd1uYiCeQ*Tqwk8t6LYg;AQ1?*st-K>~+{W^~v;F5CuqnRuB@lta$1O3A>97BP47~P(?_j{iz~^ zjeR9Q#wZ9;f9Il-S0+gqKSi9h`l7*J(KNeUG}zO(5RHjWSmA3p;b72iEs93XO-MA5 zC-wx0qCtBS4P%m~WA6YCWbK6I*p02ZW9!`lHMJ-tVa4O5Ry;msp5Q1+r|r8rkC6k( zZFj(DQb@wuAt@^*HlLz)7?hK+)~o1yp&-I)iJDeRs5;lUW&*aDPn~iZpE6F^H`{R< z%c=6jlU0`?`S{7mNvSR^QGA5D3>loYr`2l?8FgVx@MlFkgj}en)N9LI8`0~KP*PJu z$y25^JE*&`NBpzW>o8yYlzMHm=_7g_W~yqMsd~!2W`8DU8`_T=36RyWQFzrRnCL4$ z9o9NZ@wNMkZ@d!%z}E2`1veHI-4n1HUaHP@#PGS=)7jfBK4Jyk41GC zLSI-W;Sf4PUp0&3KMg!^JcZL<_mySO&!qMX?&VXW{%tbFD@Z8xUNF%O1y7m!7?w_3 zZVrrj;VeeBU)7F3jc^vDnWEQVgErz>jAm3F-~j5<9Oaf+Fn{}JG1^0aq;eKxD8XRm zgyqn_j2SzNQOY|Wz^GAT*;$PGHlucV79&F;`;kBJTlXyj<+8IFFHO@oXKYD!m&-Uq zB-a@tI`RC$zr&{V-|ufcA=~ob%kX9!ea7G0J15QMNgSM@?f*f|Wa}3)j@gX%`BGAD z(XT@^JK?-B-A=O8e#+6FvXnWPM4N##4oz}2liC*+b=oBb9JZhz`o#HM_{4S|@oSRH zBT6XO;lp|Ho=(<8D{&I0&V9a!iy9Vqy1R(GdAr-rouhn94 zB4qICfD;aQ7zu-8;k7lbb2;(3YmS>*&v20F)NhI^0HhpVD&ubeu{Dk;ED;O(FUV$T z2gJ@$mtW^{iHM!&HWFl#I$(5;i$-{TnTACT-31iuZiX@r57#k>d5Kgzq*RRo%98f2 zw+fx(LR`{1l;%4Bvpm?LQ!$HkEtngCg?}`d}+Pn>1Ql!9j zioBga7kK;LWxV~PHh5+`>8lQ3fla_Cl07h(uBfiiKDT!kjZgzBs`c*Y3xA^H#GmN6 zVgCHbW&9a-DiS}YiTv|tk{?Iw+Q$Z97#LKaqq_EgEBVp1s#$ZeWFEC@wCz$8gSw=@8jv(r6a(=E?tEcv**ItegCqt z`^h`LqlW6|yW_i@^`hfT?06aLJqwQSDtz}Gb$p)zn{iYG=6RzAN7!mB24SMjsPzfM zL71nj21kIgdK~7v*kl~Vj~{%#49g=-vlaQVFd0KeYU&bYqz-W=Hcw~oo@dF$UL{WW z-Dxq7V$J7`svKdet;m|uVjRJcPn#7-fU&x&e2!X-Ut5*Ca)xG8dvC!J9nP}iKMNOqSH99uq)+0yIFMc!M%@MMl-%vw3_}=s-C_ zvCwayg#W@>oNUZrqTwM!L&(u;Do1Mo4a2=&hL;K&jGC5eaf;MbwoGF*HA$eU_W2g| zqDS_Rm=<=mUP0ZNZvkO-vN|l?Wd@z-G=CuPq_HP7>%1i}C_#BK7h!Iguz|tBX%ARbzeawL_M(-lZNvlm0=}ZhRl9=}CN1lvbLR@u5OPnN z3L*`#!IO~&W)S8>K7v-^WlT*-6qF7agnGOa(nmNxK7scsrwhs{9PC0p3ir5#d%{tn zFWw=IC_68GosfQB`hV&;`Sa2r?=rI&`P?=x5uXbPktFbWNHgIe)C;dBj{C=*t09N~ zlls*Q{?H#MuUGcTK);RsS&Liw*?Al97KS+j~*~){Q0+esrAmWm5ByJhGCqTlQ1BaPj)xd!BvTTQLA8g>LQ{7?7PQ@KX$BSi8q!Vvt?_l6f_{Rv9bp{*bi#2- zCVUJXoO!Op!!zX`Alu~nDU_w@{!C9aP;x=%h|KdB=7-R)LktyC8pHf3BaN>xqb z4lt7mQH6JW)Mv(I;H#X$4c`-6aln22;wU)^S*uS2mmzKSiE#Nn*;U=Cl~H;mXh5mC z3QFD7Ma(%?F)JC$PYJVOWDeQ00kf7Ug1fQ;W}l3hk~ljrq~2!;?^zZMP$@~~Wn6&q zI^kc>!+~;#41F8To`heR0ZEIE^xMp2oevE!$!6 z(~2$*eR^M(zA3%_hfki|zhB2Fx`Zq|GW9{&JXK%E&e|7>75@wtb%4NIP`W3 zLfwO(+xd}Rru$-pv#pG#yx;Em|Fvi7*xZa#aR?qp5s zsagKHKEW8Lvp+MBDSy=@r^@CGAp5Tk*_GpFDA$y8NzNWCF~;J83t3Q7O-3d*|aeLLm$0u_?v0baO2^R!Yxg!w}hL zz|8koS*(Px!k+n7AuO6dLkJ62$N<8k{61?4g99X3Bk)%B=mUq5u2d{dimNCJ(a4R% zcy8h$GcSlopTo4&V#35@!Zj-50f#lP3?&{|{oNoQmXe$XvP&S`L|k>j71M{k^WZujdD>Q<{#vqA> z2@1^-7FiVNsXyxi7+t9$ehMoxCX`_i1hC99fS=~mtK=Y75H_G%Rz%oS5kMt(hUFV8 z31Hz-J(~g;bX8ce0Ro1Q6`baYZy8Q-u;b#6m2grx*v~#r!g7w~I0=6CgdFN`37_dK0wV#PIZ_|v{n(n3mG$wh(Yt;2Mag2;BiJTHs0~3CoIHCf z7qdC8D0xOTIgPP8C}YtBl;{!BwlIs_?u(qc-8jbf_=1eMjvl{^OJTKh8<-fky!5$w z=uZsz+$zCn9IyJ^7hwtVx+@%QnXb#0rs&f$74MOMvDf)%NRT4%#UqML7CXPH?>>ntx1VAw z0+5faXZ?sA^y?RT#LDO^{=3gF-=ynQmZgF?K*BZ5+*m9Eh|&OYtM&CPt?x&=vuvmT zqmyr>B8zN%=Za0eWLH=(qLS3N7W{R)b=7)ug~~f`l??S#R_{=J9qYFvRQnZiOLxoV z=_U$wr27xrh-rChmcWDt1USqyn&GR2&0=7zU zwLL!D6M`C?+l60mB@q;me{)6Ko+htW*5Vn(9!?06XwI z0A{0}h(*X0#3iENn3^+!{Hv_b|1mYV(4RC~;#&W-yT`qcc?vA`gVG^g4N`=v5 z4J96_pjUuOtAZd_z|Nx)I{>>+*sx=||=whyXP`kei; zE{5a5;bh5QU^fQ$0C-jfJSzduf~M{nCBDV7if&rXgaGe1i z@UbZPfwKn{!hNO1N;?or{Az>>xAuYQ*rNRiEe2YK7Q=m|#R7-ZEu&{z&=YO(fdfH> zO9}YnM*u6bnV>K-L7o(@$oG*?8_1;aTWYi=Tq16r`>oH9+&j4r_dN)f0~_7iYr?WPo|S` zcq@cKPkXgJCg{#&FJ+kz`XVx~JZ1}IxwPA~NR`&NH9RW5A(?`USr=?|`M`4iToJ*EI!{e`q&$(6~Qmx7y<7UugMC(>M0Ii9O7kvxJG5m}*a`j8`&V z+0&h{%GbP_$`e$d+#4$ALzQz?=K0#aesS?cvU?BEEH2)M6ezGuM2;;K#$0WeL-`U= zuxE%p+$Uuv+2lLci>BZIN`vfm66&VEMwbXqgiM_gBq}aGtiiYZc>Hu4WOD3MYn?C% zO`*GMiijYP#`^q9S!@md{LWWsm1^2$yBaE>ml>Y)lpD3=asYv5=v?tp7}^;x)?hX) zCT3`$F1n^Sd`D2Dq{NyF{`%e85T?Q87@TBN%S^x7Ae-8H@AzY!+QeQkA_ANgkL93+ zX2uqJO~Ls4`(LTq)zkovKeFnNy!@elg8AN9I|0eCkTq4d!eh0=WG_?eaFlA%$vViw zyU2mL|4BH9#njS6@W8n+lfG<)rkt!Wi-lU}o9%;(nE-&+d~}?lj%FdVUs6uVQi>Hb zAxuodY}wv!+jw}wKc4RHOP*GwhvBf?AzmSc*}t% z=1EkTqo37m^d9+4W7DVy%?17kf;1_D;#Q;#OwzMm7JhCk+oVY%j6Zq9<72zIwd;bv zVX<~K9+%eekGV+@s=%%FrPtKA9EjGd-qv2(D~I zF1xIQHI-71=isJl8F^LMMq?J+9FwZU;oAok^80j0o{cF_84cz_Kzo4dFqiuH`T!@PtkqNGh5&?L1uGfNLdXr%^0w)raNgIvYdbt%xqbUj*jiz~J zGK@yk((hAyx@|I37>#V~no=3Bgwbe zIU2Pz8nK~~_|>%~tDP?kJ=XskE~Z~JO~);BsoRpNUFO(D?KgILJLlu&kdjKzBS0EX z*f*7XlL>~BnuKryuF%Cej&P5hVBy^!WC0?R@Di%w7)18ey%-?OvrdPMIg+XGvup`;Xb>h`+ z$uR!Oq;0S(`GBxOuZ$XbElSs_X)?bfLyG*LKIeyVT&<6Jdf+Fn*o1P|cY0IQL*%oQnyarnhWWQkZw^(^%=Ff*MRGD zU(@{}+pbBN34x)3v1nXtmmAlBg}%nWFl|GZ{rw+XVruWtOn!~4^@>0KewF@}n8Msq z22im&2;s8~#kTI(ja`Om!>?U*6o}lU8J(`+fZxX!llJ2|JRgaR8#+MQ%=gMJc440y z5tSg3t}acY_pu2cssaQV(J;xze7`1Bwnw9tW_uFS$8Wk1aelGC_b}Jak=U~ov-M_~ zt@MY%h!!sS&2RjVn}6f2|M!8Pyf8<}UGmsB{_vY`efuX4{s8GDtu<75NrqOy0{^Vg z(0Xs$&p7B$jDrqHDG89;H1i703A<>g5KL<`ip4zmdsx^!n~d&bf8LvJ*6}J~E9zln z$S$w@qkr_dMcQE#ywD>xsaY|9#8C0^(67JF@(hJm?nSb_+*QKAsMv?(5^~V~58({n zfukvh3v)jXAQ(LiR&<^!i@o|KCw@D}L%#lYc-V5i9!_4*7@O|(N8bxWERamCfNI0P zSr*vM`>%#uL&f1LHJW8uNiI40nJ=C9qsj&7@}9;-Fjl{v&;C`SaVmg8dp%SU<(2O? zR{H?W&``rq2=xPvC`)nxTq)dGL*tfm0k$LYFagXNxus}h!M_L#z4JLy9Po2$MrN$F zK2}f1%zbeROu%3=?!}0+^aisnMc^F99m9e?XAAWWGF6P>`O z=BG5heqg8cCa?xf^)Q>?O(7P8Wnq9YkPraCe@05_4plK5kZHaeJ|M}U#grNvhI`|> z%=A!6^f&L^r>@~SDP;gNt}lz`cv7|2Yq=)!{S;du(ISM*qS4^Dn=EWg*qtsk=}F3Q ztHK5VyR47q@!=5QhRfR<_uB>Wu(@H)F6$5V6E|s}Qj%;39NWOH#+4py)JTA%=+p-le?Z~lk)TQkSBa6xPkq2lG-dpyE=8qm3xKVX%imdLVJ;F4-wnp(?6!>eavbj30Ny*3*3nM7ieI5-)(6itGiJs4i8#qi2mR5Ww9h`4wDgYeP%d_A2gQu+GB z1Da+o#ONtaCFC4}Q+}8mC3L32aks=|8J1%Kmz3Ll&QzWz8JdT%z+QBvJPVwL zh2A8z_wN+LY27)$#1q{KGXmvRPe|g(ijp)&{PdfqYSHeP+Li8^VAvRFlV8@R8I}wu z))?ntxRzvE1CC*m_vtBhBQ0p7AcTTJMgfIV95g^>*-(#DO*Mti439!IQdc%aYnDD* z#j1^b7QIYmH&({rwDp&ouh;@E7G>aEbkd*C~!!ix)l%A5_3&v6x+S3d{*mza$7d?-lwY?1M$WpZ0gPBkPxp zL5>h$u1rYCJgKb8xH@ud>4yA*M45&SNo2a`r-^pSgad`-Or4i}Tt0;iMd78k4|Mv2 zDhg6TLasHsExB8Tp=~~ddsn0WU}aH*j6)ghD5(i9+19jiq1yJ};N5ASOOb15SNepJ zUd*5>;vpuH)5qgzizibydQ^JfxiiV3&He^ zTV5IS=b-)>j3(taj4_wxUw;|WJE6e0P!aBAnh$@@K6r=^*3%?OChNkJEDdC z&L1h7ID!43uWW}nYHGs28yKQ}pG90Hh9}IfYDa}YMV>`Xm%W;pK>z8h+Vw!GV_=s4 zlw=bL!)u{!zB=$)QFV#;!duW-5(RzkI^f0+TnK9?@;jv{WbwilfDLn^xFdJT|A7Be z<9Fz-lwu1aPzz)#b}55U4Jp0WTwV*Cw9u83Aph_!_bn!#obh21GiUqzXg@8T?GL3R z^}O^ovLP67@Se+n-vK!`X2vdu-cQwbJ$hh-8&EQ97m5H>o+F3~OD1e>u0 zOTZ>ha1cz35q0k=mQJI38*M1v;Ca|^lXMrdXd=1AkCrT<_LVlnV?VlW-kNOLYZw(u zWnubx|FyjK&iCGNG`ZHF{KnVcu&}$(7xK1(fwp=rB|s5R<5OY4=hJdmGFTMep1^>? z<{$t!h_)~v4rinFaGuqP?nHw}`^?sZ_XV7| zu$B(Q2N>S!77!F0YJO$52k{hUpqgUr>-|ZC`f>e5aiN@gW1BpaB5rIGk({A14~MXL z5v*C1ex};n@~MBonq6K4-NBrZ-U)-E`P2YxpRU4ngV{{fUJio*pG8sG*NCR7!CGb=TaQt-ny=GM;S0&(fL{%9=Xefh&Ur1!UV_q;ebL@uez$oo&RW25=G-!F%&yl7BZEGgU^3|>t4Xw8#; zP44r@^lQ?7HTG$)*dDiiP7nlsrxuUFtfk6STY&Xxfp?ay1!Btd(Eb~kPP;Ak|+38g2Z#7zo)^13;;NNDBt5VD2; z`}AwQYcyg_S$`Me*ROmQWGxbx4_1Oy)V<)+cq?c3~P@zDhn2n1{ z5u7!3Y6AiC{4>as#!<>-Iis|zL z_nG$YPV`>1hWHR}RZv2@D_KPY5U~@H=Ei~#hKZq(5(se%!3SKEMCQ`85A<7RW{SUv z0JWxo05WDVJoc4zKrF`k9JE4~3n?*}c3N19fgmM2CJn^~4KjQcJ%tN8f1&}T%iPtr zWHMw0>b6bqLy~NA8HNXuj?}am@?#82hq21~;!+hB@Kcq8BBrq37lJZeK^{t}U6a^%E4UpO~ma{R9ICWb({k+d*{!M(a{(EZqgi4*VR}(ED#Pug{cJIZfg{giJcYvAB3Z- z1L6{szG)>DfMR1viBi9;hTH)y%q$4sdjB(yg-CwG1Pb%s_lP~7b9njQB-@FZYN`n3 zc~qvBuZOt>jmiE`t)!T3c)ZbHCyvn?2VSZC;s0DZHD7PW|D}1enH4{(*M@$KK`iF_ zl`^S_578`6?wMc~nGLcPzI*5qR@En?A3bc3%+wx!>mhrjVQpE1_t+!m7?wXeM!eIU z!%UVoteK9ebe~niD4|lwkzU@=A6p%n3Hnc?pz(Ryd04Vz&SU5Q3%883m5^&5Lav%b zAoFW5FpASiF_!*dv7$CQxPGX3!iv`q7c0~>6vHKiG#JBGd#4h^HONT_*afz1K1Us!x_8nm4X5ODf zPity}mA3XmAUe2>B} z)rq<*50^F+uFLYB4vSxDSxg1_qjw4~#A~#K#wH8&645m!CDK((G(?I`Eq|O9*ZdHqJxr3rxW~xR1<;xUJRZ9qWfAGYFg}-DkD^7mwkNBN>OWpSOeUN_pbN$V? z=z3r3j~&*{XYTghd8SNS(Ugsu@mS#=SNd>8r zbCZ*nj7`BeW5G9zf^WovZ>WG|G=<*C1yPg;E2iV?1Zw~G*MN=GHhYM`l@AjhS}vL8 zy}?1C$$tYjDe~e%W7-r2XN(kw;y;B)uFy2J#L0v}OoX)qIW_&G=a7XKLn<+I4-zwR zvvu7$oFCP-YMyHTP32?}a+--18`dIUXeh);Txo$nOdEvc7HhjVuAsd-&SSBqqM=0m4H;+K6Ww8EF)NP#jDbLJK3Cu#73vcd{j z)$SxQbF|E+)~vrh;&BzTOKMGFO5(njSc47&)8Uj<6*c#c~AsXJwq zyvFY4xqAgA+ZX&jzYYr!3$5!Iu`-WDkN9|zM#6{vaaHVukfv1L!-F71gr z)@&|oU5^T^Zg5w~}#a z()m1aB~V8RE0zSRXZ%7LO>%kUJ$zLjSk_MjRb&LDS$K+aRvueOltz?RQ?w~@%Y2zn zo3|d$NMYOpLg+?6(i}h$^Ux~R-;0WtEyJfs@c=#x=b?`)+2S~B=w|cb1O_T|kxbxx zr%AX)`zeryqT)o)E{t1P0064I>j|#pUBijaMqFbhh8bfXMp*RiYITlh0C<4z)&P_bKVm=5GO;#Exh$u>7>knkQGA{%)B9rKY3#Sn?L}4s@Uo><&pA45)zX(G>K<%)^OH-`9j$ zFI{3nQ&|gc!g7x(XSz!rYGDeof$m<_OHm-aO1CXPxyawX)j%lnw}EySvsz&a+Namj zi@KXMxP|E5tsm)!@sP4)&bS;ni^OX9P4blZrJJHW#Z+;nPifNHKl)FfrO#2{|C@eu z+e`Nr1e-~o%X~n)`g66?35t)V^~SK2?Q+zE!69Fg={)E;_5EHZxe zH*1z-EJ-m$gN8h*Hye;KTJ8R0u=UrcyA{yz;+HWBgF7MQzKUs8P92rDn*} zV9zogDcrO?4NV%uB%|{*wC^%W7B;bLcVm)(Y8nQUovP8$pw-l&qvpDhh9SnHL}?hj z0_NygZ{?mtBdTCctyV=VQKEt3?iigUq4;{zm9H_JD-koz@=>W0s3g+ZLuQ-rV4jK&&s46& zS4OAp*?7`T`phbBUzWW$kQveq*?VOVpG@}N@-8BZr<}gG(kE9--+Rhmw0P2!&)@sy ztZ!=c$9IjbVkY#yLZuHXSO3=6qD62>33m zAvd%#FPyg4B3l0Dze2a8bU!Iut943vdd%>&=DP+@hexZEC#gr4rN};mYNQ8;X>K98 z>k{tnd=uQY|CPODlY_!>mDc-KlmHuv(XC>hn-y5{GJu9e!0hh8`kGj*$OGf|ZT6OI zpBr@-W_bLO*p`IE-`jtnrurhnt)_lf6c9;xJ_mBZ)H3AsXDlVgHb6z4a_3hhUL)Qaz~Km;a!9kgak3=p zlpLS{1Y7`72tLNy((tR$CRT5`HlZsa+rXz?-mhwte7Hvzcd2TVWi>Q?RM930<}BdJ zGUI~E^C+*|v{wjw!o!63$`}mf$vU5qu8C6ij?S|bo;GM9Zuo4BSyb( zM+<-1x>$u)?Hfbc^)&efwejs6nt|YN0|cisZvG(XQCFN|*HA4dOHvm+_QJc-?^@~o zM8tzTk?)t&KK*bs8qv{^2a9*Wx}&cN6#D?l8Mu^UW%l~Xc7=7K^m5j9Py*MPMe#&jpPo9`zdX}9>dT@Sd|MLa)3`S|Tdg(G!Qt~h- z`co)R*vwmmE0!Cq-pnsmG^-Lc)4&fNUpgY`r3yS~VGiM5dCl6qGLvH!@TAGj?7(}# zu>aNfqzjtrgoggT;a+m@Z>-#t1(*1H52bMr9-iLMHgeX!e`(l&eItc1mRRO~Yxe=( zxAblvP4IxqgIv#X+it_(3ZRlY3-^;UO}u21fMT0h5A%qzt~Vji zP>kEOy#Os~#~=BkWaO=A0qweTOuKB(XIJUZ)vT#svZn{a)A{Tt0fi^8(=G$y!&8oF z%)}|K&a)|r!jwe8AO17i^)K-c>RN;a1(ZTJZ3R&9uu-khqv)SVLvK>zCBz$@;#wB` z@^{9*Om2h^DUFiRtf&rqpRjoXe?YNN zF(p)J!wOJATuB$Lb5@9{?vEKh|4fX^AWKvJ=s*d5-;qGC02c%wgbNUW3sMKT+JXyp z!>r*i@fj_JyAi?YDoiS7?Vf=WOt0vj>BjbS&+=n2Ek7_~m)#>q{|C@=;-aFhAb;S|~OVi0i&Zm#MK@ z(j04~b;1N{kMKq3ZN_bU?-TD!d*hy6k@PIxDv9mQ+zwpn?i~q&NuI78c7E?;Y0y-y zHJ(ff&whLbSLUe`L?nEh|A?y`^^iX!71ezoU@xPLS)swS2(9)Ze>#hd?`Hi zKGAu~Z)ULYZ1FTXrSG-F@4EfwrE&kS7qq1X;PPwck~If=GeNyHb-;;M%p?~ilCE$t ziA8lCONMkj20Nax5t6?qEI`V4s(m*O!Xdn(H}{yzd12HzKGnV{$lkP3h)gG>Ni5HW-tDh;h$wDII#~Q=eJ1+yppvozmQmWn62)&D>5}c~G?4#>Q>v z&Pb>Db^P~$-YPQ)RQ6D{q?nxXCqAiqMQnKxa27{N!X2n8z>=obfuVcoAe(@bcHJVMzixnXP zj*$j+t$YEELj2v4#Cbi`KAYsDZ5jD7a-~i9L7GrlMm7#HCebp9ho}r9uyspaIg3Wa zsIHo!?99RDRgao@$J&03R3=;WGtQy`77oC7SW23*G*^a`sW73?;+a2T1I3@49tE29 z-VRvguEP!`G=%U9S9@%d!k=>u?XXFi>ELUEGUSvUBi|Q78#3}{KpuS-@|teu!t5Fy zIDqcy_sKtSRIc%hqhQ|pJ1~)7w03@1?IbOK|1aD}*}OkAFw|>MM!bUF)`yJjh+cYL ziZ#}2OVkV#CQiL|q6d=46pQXO{^P2GsCE2Gqs4}}LI@gZYC2NG4hszr8#ILpgGr`J zuh5@Y#Rl0B1nuLdFb_0)gSD`ZpX>O!&L6S2OB3g1@Bwe`G);O@Kp$H$O`+VDtY)CV z8s4YcMf&qnf7G6QCg4?5=;4K9R$QWcyRcAne~nwW>tZ1yB3=qu{|rQi0M}+|pUf2} z*`)SmZRYblvrWPzqu-{W?QD_glvch~v`e$lE?{T^?eWqC6oLzqAI8H++pz9_;3O$b-wVrgcvGCb>X^}k5n-WuOkiVP@5#GoC(mg6?GJx3!(apa%$ ze-<2f-P*pfj6wUl8v(1cue(V(k33mQUJCFE^)xb-4qEmX3BuhR?t2GIOAG(6*^-%dKs5sPjvUV->f;@aew$fq5@^? z0p~c~@i!k;0WbuJ(-m3=0MH`0(`W*74I->)=(PnU zE1K>)czc0F+4?XE511asDqa3`YPUUJ$I#W=xcqUO2`@|EWCB$>c3LKq#=0Z@NpphPag;(!AHeE!ftiRv64 zC^3cLr><;In{Fs2OseJ9_aLv@dqh8QXfLCZXob%BDCYBcL9Jz+Zjvx=Y+?jd$K}u+ z6T6p8i4^z~10|7XOw`2A@M>KuKtSS%E$DEAcAx%L=`bo5yf7e$db!<4{-G+;LR%Up zh2g{1M^LYg!4|1E)cguEFBtif8O2P{OAGml?pjUHR$(0gZ-g422!nd8)|+)3@9J$v z3*X+uRA+x{sl6LnN^N4xC-yUj+0K%_)m;mkH@_SeJ1zqh-OtgOT?Qx_%_0H1nf>@& z8v~mPXfQJ<7yJS2AoNfVpSeM`<9}QzrnX+%>yKE0+FU0uQBrQLqg&Utq@~`>1yZ=?3X>IOG{*TGBnyY^jgzhwX0-g>)RXQMKtm7&xIIp#sHDNHzH9ZbAncx`gC zyt_HPDlKB;?OHmpmUzTEsRaZ~6JmC2J9?R<23J~&RYv)IF}ff66ER>hx;q<@=QZq} z3tWfoVL5oufiIr8YJ8$49kDDv0dFIE_I9Cg0gz1%z?2~YuMK@-Q5dr_@VrrjYh{m3 z_+$3s*Kff7q4KocFqSrJ3K^3$DV#7lWh&Lb%Qto2UPMurT6mNFFF20u7MR#yftQZ>6W$sd`0hqc@HGm!h^? zD&pDrCI$^H%U0i}P=x|n6;>Zl7Xxo~R> zD_J(!dC)2T*`lTE?O1y0qe?Uov}zO5po&=8v1JW}Ku~D2F!=gFF6!O$?YE z!zCR50^LcJ#z_vr!+=IZTll&^@m@Y{RyFS*`P(-y@HI1iVA5E{CZe_Q+(7XkB)`re zDE*3A%48(Lhco_ev-Urjb$;UjtWGJz2p^HM(5}TGB*5$lJ$2q8{swwI?4Zs}OUN{% zPObAHGmeRvep(I$p`7U92SrQAEO=J!Q`O!q?8~-iC)T<rO$KtkEESSr`m`vh0F?knbs2TB?1N5!7#cJ4{q-&q7|x2LTAvI>+ZVb zWct?L22-1|NN->0As&P+&E=FjKwm2`q?TmyvBKZN9%f&=4F|E^Esuy#N}n6$>GKj^ zpTStDxk&(V?VuFJE)kLtwhb>VR$nN)dZgObz)=7IM#HCc^-I+^fiyC#Giw(lSf|b0 z8i1bu;v2OzEHQ!(I`D|KIq(+mz}=VR;e7|6+eYbeVk`adTOP(C3D=R|gV##Vw9(xY z%v7vV+rKGT1PhDg%acbR8A&KRq`c1vHPWj1Nr*JE1IaUzc1{R9-~gz=elm^m`R zxH!wgMhC$U8ufF3)anH##J;JjG^0PW{+K=ajA;)-D*-6I!hULj==7d*y!k%<(c4{O z@^B#Vkfy%EN2G&z>4dcwJn~fUb(kR&6NHI0S!Y`I!uj4}osIznE`WqRUqC|{4Y5v# zV8|h>8iOHVH$b3wnp+c4a@X4nXy_PF1|<2z_F4rL+X|QZ{vx)qP{azLwl4&FwEl&W zQ-Ki+Qcdz5&CGJqT&3no8Hiy6=A2ST&zQu7CtlAF@nU}UE;5v;R%1QOJzr2jXOq8E zft^Bi-FId--JfAxYE{xdHCUjxGfC7@lkbR@Y^NsdXDOFj%Eb%(o`FXW7t_2bPc8Xh zWXoKXeytzIZZNDhq zC^IbpMEr@LizF54RS)d?EQ}$X@ z65A@dA@ne?!!biqWQS}gPy$W}bT@eqvLY54s4}d8liLm;a2s7s0|OqErEc3)9o{Zm z<(r9*4Qth^7O;^wIw@9oF;}4*v>H%DKH2(kL__C;5Z;S45f60 z5IliKMOXs43a|jitqDO^K4lOJRWfi>!9;vU?XvZ-#FOb+;~81oqCFNjL~#D-fDb*g zvKTBdi5SR{_YfQi(Y43cv-8>F7<~~0wtwisG2nqUaV02Z>Ye#ODjgUrumx0+%op2K zH|t{pu^R8gt50QPpM1nO8hF)h?tRuFXPgk*$Vaq6{Fr@-I0Bw>%y$dGnrEN(>MI{yI`XF~otL2ahR1z_XE85fQj%Ro>l?1{iucb<2 zEhmqJZ(Np&Mq+1#1*s$35KIAzL3O04q|K>~m+A<6GpeKUzB}=2lG<0Y(Cj6M{;b{;tacdkJEnk^+^3g&BB<>`?*$-3mu^# zUZFXj;b%}4Yru}`YQmDdiodU*r4b7UZcLMagEC-xlaYk~-}nXD&V^k%jUeA#E%A5i zm;YY>kd+oTwsaq^hiTR*-0Gc}dxBU;rAK!Boo7=-bgqd;GwN^&Vo}0EMl=yoW>aST zK!Ir~9~le=b68 zq+moLGK8k3sbUlwnzJwNFp*0wWy&d&=C-B9WB%7|60;Rz+uCLqT%eQjj><4M9K1(| z6u`_uqbYR*g@t2Ws&=n*MBgGtN*h01|f18aB-jt&wkdnk_P=uL^U zMtIy~bR<@V%#}hnKsGB2DnRA8*^n&*%@UF9g)$L|eTuyEXZu46zXcPLiVD{Gv!#*I zaHuhV*dBkz4BNr38J8_u)WHmp-^)&tffV~8HJK63FaV&p{5U!oPHXP%MJ8hyk(p)3Ru@AasxL$rO>3e? zY{fYCiX;#gYV85UG9W1y8qGT+sprR`VvZ8#!lD)>fBHnkbbiTLDrOsMR0Ngm(yc{% zn5^T(i)0aKn3wJ%HAS+aIfQI)NIcYLiQ2se-`vJyTEB5@0dGcRQ7+H{2Gb(>a8dWR zG>dccbT2zLfKaZG^-Ha2qq`>Ce)e-?Ar4{78x#|vs^|AmL7 z^4M&SQPv;RkIsKp6J69BXqYqS%q6Y=l=j=HdTshB942P)bFo{Qx;0C|7ymQuv1*&! z*eNIHh-@MAwy^U%|JgofZgJ+%2x~EK4X;UhX_7-`)p%_3@qUx<5+`dZIpYDKY6Y0? zw5*q-OhfyL_^bYU6g!%Lv-}R+;e*UIkc-uSnhhs~Q|G}g0xc$a|_pbkD3nV#s zkLhRgY5o0L^B~P@+qOl&wt{J4hg~vJ6uGI00$cKlHNSeR5n#;!rd=7y=zu?Bgm@?r zA_x)HMXx2R7U}g~s}|{{zEueJO6X;z>1yZz9Zx-N8D0=N{fas3)n$Q|u4BXnpidak z?MfeEwt+ql!agIAL6n_UD1>!>O|)*o?$GAbZ~L3i|M`u7cqi#BIH8yP#wY&Z=%GLT z_-F5hR0$bbkjCgS%^j~gl5G_yY<<1fU$#R^aT#|AsyomI#Wqz-(oBnBfgT7%Wb6E| z+s3;1w!`V|CMm=cwH+guNiOiJm={9cVsEh)O_t29`cZCKmHGJ{$vWD*yR5U0Rq~ZO zbfn08_v`zoMQQ;;T-OHzgiS30iVO}q7!Y$Tg1-zgI}&t&z9#tx zGn;iWdF6}T19IrCEq3bsMbrc+U?IL>x)nDx*3u6(yMd1oTPu5J{V8y2OHL~|Eqk5# zKd0d$s_J0Ez7Fs55D?N8paZ8xN|W$+ZNC&HZ61=-z6bh+0|WLUf1pAkq2DYwZ(M6 z_fqGSZlMGzI09iMrnKOCl*#jHcX~wr7Z=TDln-bS#3FY#B}@y-MQvN;TTes#@U+MW|Ky33Ifi(FgivAH5*O@zE!kGl3v|!pT(^Q?+Z3mb_jjcru8lX4d1Au(rxFUp5U(nrx9;U$FeGxuo@5P;8RUbpi_fQgk zzpXcQN%GHOBxPepr(^2pZuj{<_hL7<3uYH4;i?xPX8c2+Y|&NOkIr?^(I{^p+2ZE= zXw(BNFhd;EjZ%h-i+XWbloAeg-TnxLj3(?PFgSVB@> z!#--JgMi625crnd!KrYHa{t?$t3a33t?Y{4IRGuaGbq$-HXk%&^{?Bae8R+?<4^vO z^>GW^Y8m*=-G0r!-2iva%lA-W24m+OXbqCLSVDH_q&6`YyPq#eFo+C07m?1g#huf+ zS$)xzGNzJI;v!T`(15C9c%Bd6oXWVv|G?h91x} zh4P_)uM8qbvW`rd$Hj#HJb&j+8W&@f&%asv)xQ}}j!p?DwqXW6dky_EZDp$DRb7pq zblQZI3=_eQOcNo&)(9K|`JL-Zjq+TB_aeW`!MjILJHFl)%NTAqIk(WG&Y-3R)u6~( z5Y1RHen6)j=6b;Xc6?Zhr`NefSb^I1Q$xf_CYWboa9Ew7tH#JMDD*a?#E`npuB)M- z>o^fZgD9Pf+G-I#e6V1;tFz6!)42(xN ztgS85TXR*tHG3+0YtHqgw>*=}DTCqSlI`#Z02XRx35s+2XLC}-C)=IFLI%8kw)FXI z`ExdQlf<;%mZG%tAyw|3?amgfrk3KlX0VWnCmW;b24B}nq}>s}|REVlWqrQ=2iSt!9JJEv?7-G;W++tRMMjQXY0lmj#nCLL3 zR>tGQnSW@YdA;Eu7${ofA_|cIrYkzbm-;<~DHwr~cIa{u%_@$^cFZLxy!By2qNxGI z8#-MeF)#Fj^u6(}{SA5nD(vct6mUO$<$A%W3ZpO@L&7cvQFq;7EI1hp+QFTo0r8ex z&zLIaX0~UNVxxrMeO1??uq5x8B69$bgg2#xSzDp7UnrM)ZTKa|AF&>wV!nz2WX;07 zrqXtS{x*_8?t2e|dDb5{JbuJ_&X-@-JzJ3MWQ5cig4l(dmF+U;WLQ6Lb%SBOg`uB{ zoSCR^-S`3M*7;2E>G)PK>~th*1r`HgkN6IzV#W(Glu$Ar%i6x#nkWG|KLE1b03lTo z0~J6Fj61F702uQE<6M7l9}H>U&05ANC784<-Oo9jLUUqUlTOGL2P)|il|gSfGtj+c zs*<5VW1pc)ep!K^!f--sBiKgcki&q*4DF&&a1Z(#S8Vf7Cxg2%#5M$pN3f04E|5aN z+-SC`^3AL8UNmq9Mhfg>$e0hB6bH>l^MMbC+R|z3)cx&Y`G~SiuxRkoMHL}$&OdGh z2w5g|C;(8L+o^cUL*flWmZljQIcx;eOWH>=ye%C|!7LZfdo8<)Xxjj2Dw?)9bwN!M zvDd*-VA)#pwU_TmUV>;~`VfH+0-)In6m{E14~Z?Cv8FImdm*eiHq*23A)R_<#dTf_ z8~ObCYimo0=dw3Vt>w^Rl zRCFVD4zC#I$NinZCh-fIE+oXtm}$GS7P@C4HfJsnCQ#^sAclsl@E;PGElkzMP{G&{ zyrU3Bra_H=vIMXXv?Z2)NvEnme3td+On>3|cAWj@fJ3HvuqCPJ-{>aYS^DXSOI)_6 zS7(zvG!(n4jZ5O%nvuoO=T0^ZI>k7 zbCtQa%}rh3n^GJ!RfWWzdp$wW*rjn8gZWrx*uLp@WLQd%qhgrL%t$?$)cCy@g^ZcN zzQ1aCxbhpdX>IP|5dX%@Hfc&O(UG%>gD-V9NW(L?HV5#F+O@V=wiVR)jTQ|$U;*kF z4LXAtO~3fJ5Y1qP*6 z)gnKNs>#+Qv2bA#L34TQ)dLZ^dgun^LC_?=sR3DwVH22jva4h_ZsIl}78&mEdEff0 zEG-U2G|9}osVp{PO&KZ}Y&368U*@xei#0YWV1kEh>TKKDEZQQfiosGVf6~c){h!e& zF&R&yrIHR721^C(hQV8NOkX$Sg9)@?rciPN=hkmaXaS2*CJ12l$NkI<5CvBU3=m~E z$lBD^KmI-uBic9qpc&NP@9#D5t}v*-_ED#ov!PautKeOffxCp0$ENk_#$#immoVn5N61B(-(2AYp zqBMz(dOD62VC^JX(mtp#&tAa(|M>t3K@uP{Wc&jks5A7|{i9!3EcAXUG;~H?(brj| zo6Ahtytn2V!6cT{hVA$qGr14jTQ^9m&^GqgTzJcAhhOY3PSpxeq;|JcLShQ(hz`y? zmrJ@eJNLrue58b}I^}i7!@^mjZ>z>AW+@}x*~J~3w{mwS!X5ibpETlV{Ud?<)IUs2 zjT%6ZD*n|Q4=4_Y-vYX=B^?XN)YPE1tSjDtkD`Rd9D5#63v2YgOXv(Q{jGPDs z!iAJ*__$LnfNS=Uu|ko6QSB}&`{(S@Z;r-daq6z(ZBdEW!cMPs67D9E09zGup>l)S zMGm-a^b&VvrBg;AspP@>dO0xH}pQ3ZR(?-7%zqxHR}6dt0FF-r|$yFo$JfErSzA~SdcwWeCE9iW4^ znhN`f7=t&UE?>|e5~4AH*Stl#%~BM2V-|7}l-Vz6&3l6n1qtFP*5qr90O(oUt8+e( zC*)YqllG0JTtI{O$_7xRr?@fmpn^Va`@8%4R4}Z^WaH8Scm`KX)~-ooL$Uj;X0X=j znyQ($p7dX|C!Z1A1vv7C0m_ZZpM^S_=9Kx}BrSf{2uaU`7_25GGRb-{(?MzL3v(h% z(z<@Y2+2YzUk-K>2r+L}b`#UbH!Zh-#OtNum1*OTU;*8+%mSKElCB6>T0kK)1WYsC zxk&Jiu`vYVs0CKg(*PWv8OKnEO|CK|vgRMO=Hu|coj!zS4$zE1ws;;$SoG0!8-oC(13>Fkt+yMDVy9reeOS9mZ!w~1 z&+fdSgjNs$nP7v5#ropdRLU?YAK9in>EU|F7^sT_RR_r$GgsbreaOXW@Cr<9QiAFH zfVqYNK%`=_i|q%$AqGLJ)XI#8QszPZLsr=Yie{`PmYu}yc;Cf02zcK>gza$qc((`d z&2w+luAowL@@kq#uxw<`CfJR;v|gNmhOoDy#nXimXkw#X z=T{8VX_2V0)0iR-m?R9y8kowG6nD>ZVJzV%+)*OUP&D*G6O2~RKE@Zk<@#F{SVOq( z#449jMT9{F&_RJ5nIalR(gaqpr9;_6euS+88Rh^x2&B9jMv}Bb`ZSVWgay{5a|h~5 zz|h@hNUT!&MXVKatOBs=<=JxD0RVQ5z}}|UW9G^oZ#(>pfBn_JfA`;#MFh$(dFR`{ z`io!q!~gNA9m-sp)kk2lV*3;TE)1Zg)is&v{985F1CobRbpkb?c797`SGUdvR{N;X zNu>1UoBX~1uk6n|4S*HWz^s#<-%%B90zy&;#|HA{-&M(w!hnRWn@J0>go7w6GM5Xr zmHL~A1n2oqv;>A}$7LFgln6t*N6Li>s^3<-+0Nzv>BHN4H9w`%8~*IH8=#}+ZL1(M zFwjS4plDXM=E<@*yM@gw?5Y#Pv+?oqoEe6UgB_6qTG^V->iei)Qpk89bzd~}i);Y+Ad)V%SJ@*;Aw5_;|K z+{DiqPG5U894+D>$T4K3EK+}84ypaUq2f2tZsN(Fh-Z?o*=*3{ANwzGrg#3P|0)hG z*qjc{bkhOK1vyoZM8N*YsiA0yoCw+b+4UUmtQF#X4DKvcIfgm&s#=mYhkYgn%=ssj z9K=T#m@HA;ATV=zWwp)&fmNkuncqPZZe=WJP>-dB8@QYeOu*XUTzB50DJstQqPnLA z)6#S3{H*gwfe~aqlGM2^`DZvMOmZrQtjITi&>cPP@Iwj4jlv2XLE3Ae7bwAAken(u zL218?nw1)~6k2d~s|7&kr9X&E1LMeI~2X5uC;PTBm>H3J&>Y=F=@VK`A2LK)r2@gsRl9VmJd$`nFF7IuJt zbhpNZh*);jGPf}dn!Kp-6-EFC>smldLc*%lxF8Y@%J*#@jHr05G_yWZ8Qr&66&7n9 zf#FvB`$-cDq^6f|;)}2f&aXYWgTGeR%gv8Q($9cnEe{hL&OkE10zk4S3O z68KQ_HgeC>eMEVlUyS$Cd7QumPQs!fozK9B`_$lDIS1HIQn)=1Wv#bmI&K#JIFVx_ zr$L8x(?V6djGksDFvqn>Q`zF4HB~f$!`;n;}KZK|238EdgK-NT3=aA(-#%$?g;)*y)<8rG8i`s>V<0#(x1!! zi8&t3qZZ4FyrIYlO2Xxs+9YqJSh1CC+_$9X}6bB&`RqQv zu7NOc@BQ}4-!q25`#4Stq(aA!=%lo|N9*_$GEca1|De?@{gj8(Fz<9M?Ur*Br$R9| zHdTK^GM;8{&<<8&)-12pf41?nV~9a0XpT>`uA98Bjb{)F+Ede=H>`QXS|(0NpSYH} zBGMMGWjr9n(%=_y46q1FEKt*M4Q_=c6hG=E)Ec8!Z;T^?_F8HXaX?;t^X^?7QN%nG zrXUehnzUwY0MfhqLT}Pdsy(txY-@n9?1p9;q#G7CVKUn1*Myd6*K#r@)uICHMD~W; zWbGY2Q=2SToGiZ+%lh9zEVRcnXRO(GXgNTAeE~HkTK=L1sX)JbbXKYe4R_bmyO|G>g)WQ;@`COm}3ChQg67&^##_mcGNzLOs9+Xi!wIh zvP}?_rcspj;Q(9l-2rUHvVI>}dnI^(ZWvqF4P&c-murWAYXbKE^>V2BGF!JS!(J@w ze;KG_Ss!YG%dxEAJFpPT`dDa`WgYq%FoXFM>#bq)nNX(uIC{sWpvENga@xjNi$^hm zUSGg3=4bgoswT>X_+RfzSd3rma(`r$Xp>x|9NXj$3>Mh{H!DmJNw`l7Z4pc13@qw?Dc+CHXh17^M;dz@P-AO7-<@M7m4X&28+^VyNChqju}?#y~j zTq3C?^U1HF=*A2>TT;+_v)qqj;uFH83_~xyZ|;|}G~vxUqAMFRq*mk31+;ZV_w3J%#^MwNtjUOON>PpT=99`G3P3OG*=pX90+ z_%w`x&vgtg;0}B?D)_Xrh)=026JVGK)q1sKt4VUp!KpB+b*H4sv7}j0D||R641-!- zI;I|Vw?=rDXF$Tcu#Rp7>yH`YJ|(R8)-(C6U3M`wDtKQ{-jjCtDoarVY0&3PD`+EZ z#ipP}SapgG?jISXhG|}rK}avzT6z1CG#H-Z?FvsXr$>H`urG>GJ5Yq+=+mc2Lm@T> zCOF&%RVZ=>93LoB_8){a z>)e@_w%0=_G9yGNX#s7v6^J6?*WLP(WZD5Zv$C^9F1wpC;*F83w#h&84-%PA8}YOo z_j+;wN;09rQ`drY>~q#HH62bO0BM_@eknRFgL@dFna2+T#*i&lBmv9#??L<22m!mk z6fpb|qax$%sR)=ViJZI^1&pSiwt!X0X^A(GbHk~Ub0cId$;rJ29kyLwa2xaolCBp? z&yXBl**-In^engW()LUs=mwsUkG9bWY>8<`V8ktuwIHy_8c01z)K^2|WX)1bnmba|O9_ zli2K}_)oG`N7oIr3BT9!Z+&2wpV3O2pOG%uD4yBGOR&pq;2Lr!FKwUAJ@S8!JNweM z3p~?Rrg%>jzOubV3BYqO(U`B7S^}OC6NzC0>qrlTJJeOw4QEmom}pbUIvXepOr$eQ zYQ|Vy%EDcbJ6nL=RYqdCo1;vO(SX_R|0glqzcXfQyPoT^gJ8)gtb$_0O14qmFvLAM zrJLZYVGYwZb{*DHT_;=|7+`aB%D}Ka3$jnV~XrQM?v)6iq!FI_d?d%8@UGFmU9HxWJL~T;Ry9qSh6*%40x( z6^zMs9skY>40@G&!KLl1#Gr%|FKxeomtoKs!fsq%)J%7=|4DCtSdGR3@bJb zcVg4Puwv72CpHZXD>e;xJ<0;ZlJOny<|qpcOU`$^+e}%*Sp00t!reLC*)Aeo$J224 zV#>tgO<4TFuZzY1ePr=D*lsk7FK1@4_;O~JMqb9uz~Yd1$4;b$akWn7e;dF_(w!Y* zbUi>XOWua{GCK$^IOkqWE@0WzS!!xU(HQe%{(kG^a?uFv{q6BBDnqqdyXIRImY1xo zVZ|(Etw2Cw3&XrWE&t-DH7twkU}>CUF&k!V2rx`_eqWT;NCw3fli1`BJ}!y}PlN2t z=wBcOm$lD_lS80F<_{W1jZGn(=$oKu610hb7b3W3sRs40@2B!}0;!aK zY^gj<#PZ*R)@sT4lB-oMmG3ZDWTqS!MhQf)RKW8UXjgC(Jd!mKtstK462(sxeL_0^ zrPh`GOVRHFQS!oowDow~VszJvWSNo^a}ji5K=^@zXe^L6S5xY>LO?v49T3|F3`L}Z z66e4oNK0(yEY)5c+tuMNrrJdAZ%7CW--W}EEQ&$~J73Y}?ZJCtlj#_DVidZp{nCQ; zfy%DI(GgCc=&`XeN4aP-Z&;yX7ntv2pDKBvZx?)r_%0*FwXjqfDx$gH4yV z|5@OJA1noVW~3nFBmGd|f}KWrhyo=rF+lR9=evqIS=W9ZrgD(B2l+or&AQV+KwvO8PlYr_Ex>tKXm*8Y)#znijInobaO z&vXKt1-a@e+%DwMec@B;QWsVe4SG`#8iXac_qFE#&))mM$#GQozTG{ue`j`gWJ|Ve zX{DagVz0omMdDb#wgV~!Y#f^y5+@ICAlDc8$1 zBHj==h=)U#L@%siA@W5bf;eFbf{0iU0VYvEA-co~@B2GdJ=482yIK)QazCHzwWhnP zt4~#(I_K1>Q>RY-Cz(wxAvIC?gVZ#YQTI6|$4gDrJx|mLMC~bEGa)ElQ!FT5Q!FM` zqY(2#i7Mh36RhE%j7BneHzh3hVgfOPq;cIdz{@njf0-EI`C@>d@{nAR*5H8#+o{NbiN@WTN)d}OPD+UyfKxZM21P*MOYd%m1}5YZCVfcHC+@_X(~5yznChU%3)P#GE$Lw zHsqM65tzs3RhTk35ynrjI$UH6MQd42J%beC6SXdo?X~uYdvS8bP>vh{B zOS~5012!~nw9%#vH+C3wWK!1xhYdQKxt+OBZOYgX2kM{49-+k>)*foJn%iJFhrlPa zP!Se(YL8kv>(yGkuKqkaI>?{4wc%`cnC3APc{{zWqs+9W94@4oN?k}XICwb`?^r zU2Q2dg%oR7TgrSP#Z0PgDQ5~PWmk3+c>@>EWj9$!kr8aVkfK)1x22pcq^K2V+EOOI zn{T^XG1-jkg%q{oOk2uCe$I`*PPdzEOPMaDhOK!4|BC4HkOPML8h-wcPQaZKsjOEC;bK>5d zeE0oONU?rsOPML8SUK4c5o-$I^A)dvG1K z{PN#AWBI;m`Q+Ch(}KKGtc+)_D++FUd#N`3?QV$#g}6Bj9%BE z3hL&1ISWtdt>Bu8uP>=hDyct9{b0S0yL7Zlgctu5(QHI5$78cesuo4cCKQ z<;Sx}&**cz^&E6PYH>IICwN^$-<-e7{e-fe!Rw6p?z{y*NIZ7jd<;<@8r5^ zF1VxubX--25e_0rz<@phpCXx$c@1+kxoyDc@D(&hd8KgDMBVI3GT$J%F*DsEZm~{8 zH0q^3a@=Wj*FGL}QarqMev|x^p$ct&;n^J2{WBD&NMqUiv^U&Y=*Cu^d?j9Fb@2EJ zK_Om(mn+Wu8Pxi z^v#}xxE?^1Q z9ZgD@M?1Cz=<}Q93d2m&_~^{*<`6gDm9(2k7m0{GxpQZl>=JMVv$18Ht==s-?KjTx zXSFfSWh)*6q@NPfglG?Rh)rtcgQjDG)V6fscFnB-HJ;FEih%(|pR{tb2@gbPC^S;B z-3{_`E0T}LdXa>(p76vYf?(B%zukZL@z!+8X$SSbLQ3Ww{nR&=FWX82hLE;izRVQm z%dD}*TugHq^zsr0R3idwjReFD+KkQ(!Ioa?5ZFbG7HcmL7_uN<$Qh-qH3?}1Y!Zi| z=$HA9!5P6L@!}oN(|%^X607*W_TJPO#L196$*#1!T`H;DTN0_;BvMZXW{t^+rNqWL8ZPl7gi9p+Cr~NWD)1iL{>l7mdFy*omFgc+@4(4k`S5U8mw$md>_8_?)p^nQEUD`pC5H_hPoTo!852%%3EfZdS z|4D_{iUq>Uq*zXPAz0iLjqGm;uPG3wk!OMQ(lMBmPi^9hm;2%dqPpbX z^CW!je=(}n;D4lAH%E`}OuKhASX!^9J=9c4w zR3vh9XY7aj82csJ7-0zCp@Ya-VnEr!PZ(3t8q7LUy~qN;>m!BtCjrLOH+Z3Aq|qt_ zQ8{=ak33SZNB2ScUK8OT`R^(xP5x!mFHIf}6;d=U*;h!R+3r9-MI&%fnP{9;v(hhj z5>9e&EvigjKrO8@rDu^zxRx#=lYXrzlN7rk6S*PixCA0})mfpEA|-`tp>#T{Y}%8T z0_x2@fou1QYrRMoN^NDgs9Ua^7-?li$9dU$0JG>9Ncr5=+?J-Zec zJK~&$Vu$@WLG1J);QHFdj{MJCVu#fOi>H$pJO8eN=15*-m_7GcAw^>4$$U!cXWD7x z_HOzANyVAYoJ81?PDtSCCP-}67?oUFP) zbTEjt&B@Y&GK%BX1wl-jtS&RYNn?WIMXxEcOp8Z^MIRp{T#Dl3q7X-EW5eKxJi3s zMoADuUa7`x55kB;e=tR@J!TcV$9B7gJzM~_9%!y~Vn|Hfw1Eme0I=A$IzvV`0J6Dn z2pqHPxzXE1bmr21HiWCcE%=YH|3gD~;x~8+;cO~$@g3}1mk>ai*A*X2?efa-ZfW4X zkF*55;~7A9nZ#ru>2)(jyfb|!;uMhj+~GXlGyc+>7S6$%X9Yxp!Vj=ljXQAwrXP+> z6`NUx1P%)CZFa(I>FZqF#2eJ{d9Ikx_mbr~Sx6D*oGGMO!LXpBZooR`UQ6?Y1?o$~ zy38cT zmK0Wia&pkUVl}gsO(jeQEfqp2lUlNYEKcntKod;bu_YBo7F$8kw?h(fDG}~c?0cpo z5L5@QfJxYZA&wgq$8n5TtM|dP;ajXml#moNODV0?Os4u2IIe|tAyc_{i^#OM-LKL)-~_J2vUFpkXAP8qlVP03_BMVM1G~L7xz)4g#x<1} zLm?0ZR?uFc*m8iP`AmFPMrefKn53Y&^C%Vz+C-HL%7vcDPmI8t5+FaXesB-p6SAf9 zGI2%-0%jpxyww*nPar^<^*5Sj(aCDJ8Hp zdMANiHW+8;V%=#-Nwx;*R&EfLll-#HCAI%o90;!?NGyV5+2UK<2t>TQE_6P}cm)7O zh|XdivP+bvHhHCTsrp9aJsRh0 zCV@e1V_7QJvZzTx;%d87RGqSBizXxV86v=Qy+v^etX%n^mq?qUT0Nm9ispeZWskOs zWet>CgIzkT40a`Igy*iC)DxD6RXOWURt6fZHxlm-VnMe+EZ!j5=mV7vCNWLqdq#Cc zpCSU;!K1Mi7!pB)9YY#J#+sC(ln`D=i{geNVG8v!stnSo+TRJ2qUTCermB9KO!dOk zWNH;~nN0Pf_TN>eE-`?JC1@-Ih+n)yDxWRd_K!g&LdPA?71aj83}1+ffyK@PkRy>0 zPT{VjI+ZIoccLxOaz?8_;!)TMe3Qbk_Q(kmx#g%ze;d1}Y_;eU)Drf7Q41Icw}e5$ z^5>2$)j;;hXAlbFhQx&lNh8{H5Y+|M5d2f^*u9rWig#xaJ!nwwFwZjMVzY#kaYg7- z2zn{)GS1+|pnufkA5SAP6#ghV4Yiir*c+T(z%-` zsh;ZkmQcAj$EqxA>(pEk8XI+%TZY|NiPhL$U1guxs~#3-4EyU`zs*K}EP69leqn!v#@o^d#>cmDPLll>-M{U1@A=3dKK|%^122>ngPL9wQByTfLjhGMRwKquANc|m4>LXRf>0Jt*@dz{3a_zKN1vW+VF=s|K zwAjT)HY3d_U8S9_a?1|Sh8a+JK1jMEo&^8Ktv)6_6j4vb7hhnRuTsUoh}!IlMLk5* zN*e4H=}Qb%N0P>RB_2&0srr%=pstGEqds7@3ZgNG7>ZF}$O^}ig>2mAEXowQ%o&2| zdW4G-DjpAN6Q(DU4=tWASCJmkih_SFaRA? zJDFvakiMJ@s`i6w{1KF17U_FLc+YX&A4Xdk6AqAK{L;I%e^ejY$1ut~adnLW%!h4Q zIuZVG^xo69eJ{R$TluG1O?cY2lv7nX@DX7kBNstz89LN}c^U$?(av~8NV&4IS<-@r zA9?c|e8YW%kMI8cf(AnjI6FZDf;TQ&AVwFx2JK}X@0V$;QNEcCc%M^_MQW$5*S_P) z&l+pXJg?TrcR`r{lq1abBFwS~lih~bMj}j9VRo=(Gi1!X81KaB9$7LS`~4D{#v=~=!c^3Z6+=squa+R&z_=nHDG z`e=B2;86(`qh6DULMphwMuctFy7^cKJ8OHLaPS2^Rr^KZ9RC2?%wOthTRbLVdXn^3 zO%bh!6D=X2^$^dxG)0}yNv|dcv1&b~z=_tUo~eLu^h*BqlA9rjad^P zq62+nT{{NJsMla!$cPbb&N$T3-|4#R*^@yz_y*cH?_-T98zu~|SegtKR+RCaK+OP3 zBG5?2x(X69(gAgpM|VkPrpQkYv0;GO9a|AzT+>|{Si`WZQe@$S#(MYI>p${df~ZSt zS|7;M%5YsYSJf3P;{sk=iwrF^VHf8 z%%ATli4|!fxi0Vndpdjvn9}}SI1m&!HZT}n6}?aPCi(@#>5`M% z5567n!@CJ&xU&56?w7y3tMu~Tm)n2I%U|9TM^;{1rw+rMYNEO7u=_68{^~0vTMr{! zUrrMwxL-~aK5N%YblRO7a1^0AF1qD@F##$q!wXLoP7|K%sy`>#M}WoVFdGD32JBDR zGYcE(C2QRNzt!M!MxvuJtSHt}M#c74k}tb9tqBAbu5GVP8zaH_(yNCRrWMIFk7Uw& z3|97WbH-Y|RTcOI?bKC``tMZa({@eWpW8K5eM0?qqWDS zX00DA5A+WX!So)Xw^7#TDdRR8{cXF3vgS@U8!fKh#JEQ=tzoy%Op=(pv+$gUHA*M zMqT;~q2kZ_e&92A2;(cdj)(u!0RN={{!70fxXeBR>7m>DUU&&`)$=a_u5kAfEc8Zt zk9WY?HNx2_d&a*HoULk>jSB3k?dK``Pbl-}Df?q~4P~G1Q1-PVw6B}`5l(eE3)}tA z)(|e8J)erL5`e zSHN6cZmZWzTT}S#dV)yR8SsIjuu}dIZ(BR@&3JKW#*0Cxn(<FfW>x&m4mF`cjsCdVWR+(C|Y{@^_~ z4h%Ce){*-doCYY`B#4ydr#yzutAE%7bvMs28gnqIJ> zVwC3BcGWj>AsEEd6RPfx#%5p>qL0|EbXXVwNxHuFH7jhLc3RZeLmS#IK^@oLt`qOk ziB{4(K`iLVe-y>YrEd3sf!%+i2Qwd%Dv!SbhHrLfZyUeb(E~cxk z%X3{_&pK@`*J*Y7d<2rqI*wz*LT3$!&N>eitjjtsU7_7Ir7;bPE7;;|du<-z34#nf zq8VQ}=lF|(-fTFLGOe9D@h54s&^Ctu{492gwC?77H*(Ujn{9Su-5ru1T>H9pV;z-| zHdRt?4rv%)O*f*bsgH)!5%m!iE3*>q-U#3=^x<%t>OlEn>^3U>leVF!E)a9R59i|Q z4brxbPJZV7W$UNsqB1~1vdz*5(66iALgWJLD{0J*!wYQ8{1;VAY!6+N9J$9^$)Xwb zQ4QC}95+<0e-Z)F^g) zTgk259J|y?Zo$U>*h|oMm77al7E3@&)WdSmZL9H`X5+2bpf+2$#juJIMFtK=W+4!8hvMp$u{2mhW<*ql*2QaFkv0c)#jbHcSD0ivNFkF(q_?C|+CZDT z1XXTB{psmQ{j#)P-&DO(xFbdf?a^>i6jV96kVo(m>81!(k@##wrwF1L4F$-mhZAco@y1M9RZ<`)7*wq zW`^bKr+#Ff$kyUmEn@%1`n-NYb5MXK84 zVtMXmEj!A6kcCXsY73_Aadnf3?Q0Lb@jlZDt3S%)Gcl!YE5DGSw5D%s3ghQTUU}9? z%t-#@`Y`hH#68F{Q%DTyBRY2&JxWKkn@T?ZbxpnhDw|@yq<*=8y{LW#SxsxeXpS6| z3cc5|7G~+U)>CDFL2H&?O6%DyU8S(rJREk;1XasDShmVsr^<+CpFw{;!=@>evA_?h=5$yVmt*%XdZ$+5n} zOnSsm+gwy1LH|qDW#rs|cS%GXgf8k}0}N-}Fn5Cl?e*o_jvA#`fE-60#o_b{t&Uy( zd@T%IAz#6IdU<`gv{eDG6T?WI$uY2o^^zIcWl`j!pCVL1Nn3MyaRnb~Hw| z9i)i|xgihoN|6;Ebpp83BCdYNlPm{wgdhSK z?O`IDbSx=igFsl2fm)duagQvj)3C{LdO}eFt-5WwIkaD60$?gl%G-TGbix+hoj*70hlB>!=Vn0{zPOJ`t3 zBcH_bF^L<|y}%oyYM(HaSd&#nj{>PTBuylB8wq1c_aj=r1jgYcYfvQ}NgK64Gyv8v z-zrTAVqr~dA)1%{maYiW_v#8(-osT(Z(62OzSpX@52vm2a;K(`!CjGn7um7z#mbo8DOMaIig4)7H!zg&#~EDN~bDW!=GtkCO~;b zrOUW{>DQ9qW|-?-!^?Q>{`S7#XQ5m3`!&T!X<$oyym9H*=mv&8rezqNmjWcUe~EIQ zw)AV!))HR}wM)E~Hnqg-`qHmG%PvX)>nqJ;>c(w`+zM&%#Gc2#?vbvAEZ2I(pPKja8I-9?}dZEe1JA8)`Us^v4qJ* z!<&j5nW^{^cPz6pULqli{E%(s68E^-7{8(UQF@7&^A+8o$)HS{jS&OYl@jY$nRLGb z&u^a4ywFU=SeQ@6PYi%k3DhCl^S=6 zFW+p-$1n)N`RkY#T`0Y59A%@9(jspU4VDbG4aQ#~*qgDM8dey^o2!xtyRbYW!Ch28 zrLb#Oi?PL&Pdk&5TuTrw>tY>?Y%POk1|RsA}UQE)c}z-0Mhf0N~-22oUWK&H$)Zn zVB0iv6Owwp(`IT&468C7wO;N?KoRL?PQo5&ZEPGms={_F)ANIO(@J?eozD-di(EBK z{KF;YGtsKfI>^94dKZ;ul~OsWM1mKbR8~s8J%53d%6K9h7qA&}47R@4dWRd^f3k%8 zF|bq9TUgJgD7V*idQ*6naYVxm%ciWNSyU|zLckHpD4dNb#1E;~KqaadWJdS8gt_5q zTtm_mAE9ZAlk*O6Oz_~W$SvMi=Vm%Ct7y*td&E~}-pXyRn1JeY11BhsKs8ha^;GT^ z^2G^UM0YIZ7S+k_R)U~A*xi<}{B&}zDramVmKhGmk(xnRUFQ)?Ejhr4dYgNXXM0un z9E)N$YD_lr2$%PDVy~ zl1c2;)!2HI#oJocE>r48Tt$hJWYFXflv7cOv`np)wuF?yb!Vy9xa2JLTBNxI@Di_u z#1D%xv!y@c-%~BUTH;HSoQ4_GR=wU0$~kA0k4X@e6-LESj?+({r@{hOq z%dP&h*|DY)}}fTvB-4B<=OktSX4N$U?Bt{txW5aGhPNT@QjpXqAZIJE5 zscpMq{$@j}-;`%eqOCv_L<4cxb#vz3*&MZ2*4OGKTXDjurATef%#Rl{SL>9krAf|` zkoqT;D@rR?miEd(o>U_pWp5A{TmW=<`O~kBS97^ctH@Eh$#2JEzk@vSMFo43?IX}R zg#HyA=Gl$0!Jg36a$7y5v}gk(n-xl)OHD!1u0)TO$e{VELTWV!H1~joI<7#Or_8nK6+USxwknJQJlPh&T zI*n6?F6#-MkIwfC$`=@{WucijQq9^??1)?${!4s+*iJL{l~p2VB(oU4An}+IkLMCA zA5GX8lWZlK@EoAR_N(dp<4mDzlU{lN-CmOGh}~qxxXJJlUxM1QAk^NYkNEgqcE$RT zeM_)0z4s;(V#Q_YbYC-FRWYAM(W$T!l)wliHg9*MGJ0RUD05m6Re9f&+TZx{Nx%U` zfS(8z32rLNirm(l6V0qlK$P&6kTpzGl$BHE_2#S1tjB%A-zuR}`F~m)i)u}3GiIY5 zQA0np1mnd@H>v%GSl&VyBnWH;T{sp+Y#SDxq>z^=^uSj?X8A;6ZdMPqzsABtHc>%y zKP$siR2eo3@a3dbmo-ztMJESt6T~j z67@lWw>)oKqCVOvB0RriiTa>+Tb>7(s1Mq`<#}w0{$fXn<@wYS{iShQ_4)J?{e@O- zc|L1-I`$E(7Z+Ut;*2l{dvtUS^9Q=+*zX#EgZH`<-oO~U+m2vp82H{l zHx@}IQ>!D*`!@Mn`Nbt_2$&kam!huOJ%DqA?vZ!viVEjuPOAqU+h%v zKaD$;lOr@?grMV$IN8{8*gzA#qr;ex@zCcj&p^jK@DPYbTk$RUs$~uQF=jOl!>vYT zFmi|uA77WQp<0OWMf&yC92-K)BiozA!?!K#0+6G5#OV|NCSfYhl1E>B`7-V}{ zhX!T>;P)&K!Av^j@dCiN?#Pt-rQ&8Se>d$uY{?W%Rx-unWE{U5$ zq17a>urSO?KF)tjRqiAo383JjYa&7rrEDA3u5IR2Vb}JFK-(fGciL$Cvmz2VZsLuo z3$(8AVz0gEmg+zqIWbK zkdCv~l_l7qy_N2@LE7-JI;Y2&Zf_YLune(s7cvwO8CC9DjL=PDZHs>T?0TY~Ptf?@ zK)VH1@nB9>gp_i<7*+o7#S5p&=TLISHHDH-X!m^>RTh@~WM63rj)=2S<#=vV2F5@) z`aT_{dqxWS!#Yb;#X!->2)xnFT&&R(G+QbRIT;-(ECbUu$e5q<_S%yoAm88gRzneY zH1cTEDAW$rdVlt|)~MLBCe{ZZSi3i^a7H^%N+J5bkDOoHY99FF^H~&pm-;yH)Zut&E7Y$)Ct`91AS!sNd@W~x~ zBNKy)2>>k7qs}EVG1uI^ z_myjZ(?Z3jC}o(^qzW#0hJKz-lob4`Ee$zINGb{s(Msa9q9tH1Olf6lVO#%p8t=9~ zZ=j4RK}Q>cW8#WgJ}%9C1D5Zj;7E2k`;ct$j+Fk(<~!`#O&pFEka0s@m*y<^HY-jW zE4BozuXxC+Ii`S2v_NWv^+qWqhbH}G!&-LJEo>!~aM$L{pXAzq3)=;)ur%5Z0&S{A z=PJ?x11%rPts_noZMxp78pmlyWV8|MG#K3!{bVC{694@Kpz;L~NG2v4fFhBd2Yn%k zHTyUHga}DixR00T3x`i|}+oKm-gLtJ%yLR!U|BR>zd*BySpG>^aZ6F~59pSWZ1QtA^T2yMqx^f$1ec_$BK z5t(wi0c>&EK_dxfl{VSJ_r7|SL&Ei*!b0Z~D=^oy3E=ty%UO8(Yohhw|JPNWtCH)u zMfzXqFC$zYSG}}sXD==Tfr(p>aJ!l-SbPZ=BGA2v{z^8F>as73%r}Q+6R!5 zRt5F#)!dCzHFbKrz4n+I3`z8hTXg~mD|UUTlVX#Cz%YADqt{+Z>SQ#~93=F`@yq~Y zdY(ruBWoVD%ha0od|Sh1%}v==qw=)fWm=St$}>vptTjCrcN&qCt^UtsX`>{0ao2VP z79DBaQVMZxg06uC1ufo<`mhyG5FDh4J8A`cCCG=m@UoVW9&eeW-a;-hSB@95L6ZWQ zjSr^`;Gp5z<+Z9vn9S*|Ly=WCjcX^chD4Rm$BPYBS>tF|Qz7)c?%QzMRGQF+r%a{E z+JIW9oT{86l z&4oE)BIdo$E|!S~ra2(1K z^oer>^mq%9zfIifZ>mNC(7SRhnU9|2>Hn!o2-u-5ES!m46DgP`)vnPC@ioyZF4Vp% zR`l_dJVz2>$qQq2eXmJ=UJW31Z6TrdS4w7BN)YVaIlz6iwA86Iw%++Q-x!2p zxEXw%<(DGPP1lKZiuWmAZ01VL_Wg{SC_P_6+DpV zu3E6VgJ|-yIAyd$smYyGF8YDNc|l7+Kyh)#31X@;WCy{^eI{=9poEObL?a)g`9j4cf6d8~)LZF%wah_0TMopeUJ0Krf=7fsPgY6Dv!U z2kp9Y7)kt5c~)LrD9vK1bDw_rA66@AM~ zDLdl7+jeTKkAKIUD8Q_TrL&7jRnCtR@@;Hqu*LK333N>X8r5Kce=-uKDI6U`lY->A~@#%OXyhb@H z@0O=aw$OkIIrg@Ahug{#g1$@m9u=mhy=IY{eJkrUQSA>sTwCF@M zwke9-%dnR@&4Of(%tG&G3qGvb`vHy^;gnX!%;jpe-%+z{QDAI>))3|rT`d86ZsBlmLkkeX^BmBG6R+DP^mXp zk@y_{1*Rx{I0_`qVZ7bT1mNiQ+B?+?EM#hyD|xq8Qcg&c z*WRzzOZmq*Xvo=C+EQY{JLe%ZRB;nWK0X$?Eu{V#wVtts!F_*9TISsU<8geqI`!c+ zd062E?}qv;K(T*nl(+qZCQQ+-z5~kJdhXg*ns~^Yj4F4q&ee3Z%B!JtNgCDOY_uk% zr}2+5ec@;A-P>r@rU-(1tKM2M+oIb0$9VwdB|OM<(PBW{l=|E5Va}VdIA3)eW8#UVV7&8C=6NYbNDXipo52A9J`o&@VbQZ+AlyC73Mxd{R8y8UQjD;1c} z454CoPunU-X_}Hruox^?zQc`Vz-hL=VLB7M(bW0Y>lqEiwLcSDL)iNmgFe%Zki zHlz@t`mg2!tx*LJcKYTuh&rUhD>oDpSY!_)<9Ky2N?UlM?Nk)VNqR%2mKhS(&x8u|km> zQ+}U})85)i@f#7$*+L{mN6VIGlsQsjDQ`vXUnD_QQg6*8_k7>g5JaPwz_eUe1;xNV zJ5frjC^4`@Eae2pUSo$T*up5}d=HT)BT>$}VfxJ5UVzj-Y`sgf`HbJ=rQnmh%3iA% znJRCD0Z~oh6i?W_ehZW*EP(9}bn2;=`~)E|%brm*)#0=Iu?e&CeFa>g(AjA(VP9XM z-6Lgr&dLzj;|?B}LzIDv^aARYUZijCxSg)t zo4vq6oeMVlUE^Y%dDyevy?W>E4V`LxGRv13ypw+}eeOddEkW8H6AYj0g!U_Q9gpD$u47QD&D3#*KwhRCSR@yNgag9T z8Y;Nl-o-~0)~mvLK`~EqJs<#7T5_|y!B=xlc~!b*dwrF$z*7>cZrr-=Q))3ZJcQ`I z(3S2?FAhkc275#6x%G%x7wXF~1r|u$>J3IP>l#LS!33Qf3lrioFtH*hO)jRIgXK~j zF|&4u-$3o$s5@x23>Gd&RDY=cLeT*iwPKkVR1EUBq7q z7#mg`2|{H?>FRWa913XcD)6|2BSm+mYj@gXuRY#*hwxexLTfNRm-AVUC)l%&ZUci7 zP2d;M?r6SztI=2?g@enOAo17p${i9qL|c}qON?ODsgPjLjg1xDWDHN9L(mahfQ;K| zh-c$LXPYZ)R20%$(^w&Z=hGI|&N|&BmY( zbXcX%qfZgV6QyP~SJaLeo6zTDF&}cBUNOz>3v5<4mVxKubu_fGf5uALAeDYB9w+O8ik3HW9W zNSp$iz7#gOo7HJ%fR5q%zF8BX$I1ILL%v!v;HH_BsYWqRw!9qx6zCtoW9q=Agq! zP}})8HgIc`Sg6#vDz*Cr;z7HRxHlWLZ=h^vz1ywR`P^lqBXhzbo5#gL zo)p=xrdy3R8alj6qX2Z;E<@XL+LQpKQj*v(Q~PzBb;rJ5+&^^ z4VDt@VyF%*U~4(XE0YM@Mh}ieLZq9OFm;FXBGqT-y(tKsye*B3Pi;a}A*c+}Ju%)I zD>r)l>{`?a^B)!|%)0T1=NRxdMbR%ya3%>Rzoytc@l6WM76xEZmIBpZXrh=e5Ki`w zKp{Qu*jJR(57A(>>R86nTh{$dIPGBO&ZvvVjeQ=TV`%MlWB*#(3646z`@X6g1(AP$IZ5tHIB5udVWv(;Q^gsb zeZKHdRtRYWgFR-W?C!~700w_XMqOu>+Vt0aVkiD`}HJdQQ#@7*hqo!C#_ z)yP`F$HChpOA+Yop0@@#Sp=~1wE*{4-rU_XJGOk4Rr$_;qJ@hj!*SAtl%+fd89rF? zCT!d0B;8!jKJ#y$gYaPZh0YE*ipi^tHuoc9Me3ISuPuLfd;WqeG#Z#(j6kz2OIoCM z2j56RHSY)^qtJo`xN}OL_stxAtrwi|qS4ztqx)P8Ol#oo;QZW%5b|q}yf7l`e;M#+3>p0?)gi5R zTyq}q#%P$&b)Q+(2Nvd%fipD>#qM1~j?YB?43?I#G^KVi%d7qH&Kp`9Z zdYajeSTiVr%%h$q!~$nA!&7;XW4=4?0k2)i zw?}Ih-n|Dq{Pa6~g;X{+!B5)2tE#F^IIz%`+83JdBj_V2h^3=Vn z`FenPQ9ys|8=Y)h$kharK}9-|)|Kza;D8f6=a4>!t|es(V?I*VGtXt{ggc(l{d3I zg45i#+!o2x2t%P3WxW2J$ngkDb_f3sMZ%NvTU3C;3yHo*skfZ3Jf)8odYBVI0zLCO z*TL6!GLL3uGffIxSgchCZ5K=6f52o-fNkHcRd?b8ChpXq&~QISwgxei@E{7 zBI@p{xPSEdPza@TxPK0hWgg2F_r35~;*nLf`wkmW=pm8X`I_+9!z1JOZvW`z5fe{! z{{mT5xj!j1G#GD#Off4TM`Ge)rxdxWlrh%m4nEW%6f+2!nyC(E+jyp^3jb?&@BA46sBz1c_j_~|2FizKsUYYjWL&L+F3d@0JakmFbAMT>} z!KSFV*1%ZAwR%T`6|$;sdmHwKlWob;#ncGh3^3@v+DhYlo^NMrqg=_FYQ(gw z0bYSXeW)+KQ8E)~o~?;wf^`rGy>*&kTB`b!?x<PnZYmwWlC%4(nS!$SIgzS|+ zy0EK{MaQoEwx+4>=JJK`mO$sKl*8d@3>_Hqgh1RBD_@U7C9?J0i%EZETIU z$ljZ{-{i2h6fH^{0mVHhWY4q#zN)J&L4N&_RLPeP~0|L#MO=|ncVaAI|!RoUhg($Zn=PW1C zyGbkfaAu{s-E-5Zn<7Dk3&$Q)vzcmwsqiS@UeqP~b?9HPl^!+MIpIevq>p18> zS!H~cW)pYVGWyYhFJI!D_o6yvuSq%6?UI|%6+^Kqfi;%V@?+-#pLVh~D? z#3EM`C%Wm#vK#Lf2Ei=9d$^Bkzbn+xyV5p0y+5G$7%bI+?tI!Fxx^9gtVwKG9B`<6 zpJ6z5!#YB{EBDyne01-;PXj}br{X{i!1O#OBHQj}*NdY)v1vEHJ3sBCM{rc+A0Evm z_MPC>d@>=ZQR-c+8VsR`l z?^CBksbibBBzwEnH|~`(@0s;C7R9)|^arbgcWMj^aE%E1kn}n(q2!KO12frZ^~zz* zm6~6{!oKnO4e~Tqg4NuCJUn;I5cv!@alg=*S-Z)`|A+E9ji&l2S?=sh zP?c@`1J#=#c`bQjClnz{fa0GpA=yZ}mNeVR@_;8x=@*N?$2cUUt82#KS)v=!J%AVg zm>cL`F%5WiF<1J8rf>t{*B;Kuo}qKm@>Mt08BXC?ohR_C#Zr*9nb)wJYD6lj z!wV!JM|SE3l(EFk6aii70c|bAK%)W#lu2Y`5zu8G&}b157SzswQUL&&jS)`-gRW4PH4Ac&w$EkfEdTCG0l;(EUqiDBer zc`x$8(W=t)`n8`nPEo+q{(7IykLYq+(2(h0ONT5TARm)E-5D{kq)0mO&`vfZcxlP# zw}T1{q@{-^>H{VgkRWb$g_mh=%uXotnW;^eY=NSCN*qkPP3Ia*?x^=wy!@u;EOsX| zI-RPG&ze@FWPIiyl6pm&?5LkdLv7fHAkEdkM!Wm!{lHGNwbj%M7WRVN#V6{{?LP|h z_Asq{_K!r&*Ck-JnQEiCrAWG8|Ete|aaQ54`6mb!Y~ZtIR9 zE`6;--KnB^#bKN5+LU1PBx}sAf=LZNJEXk-h|tDt`HS?%0H~>8l}EQ``{k zcJb9_p^JS~dIu(k3O&J^RhRk9(?e{yrM?71^Y&|s>v~kv8I5sIy+P1vV#z)Edb?fe z{a1V4A=R&`7^_0=i0aZz8geV#F@4lb0p1=1B6v^jwp-iWLnUJOq{?dM?N*aYY7(Q7 zN4fQBx0d>RcdSUy+xalauW8^?2aTshF4cE@AQ^m~@4R%Vl|iU$k|fAA0Gz9XmC@*} zmD4&KBBf8oTP%FTGMfK;FH4a#3AmV;;@ninnv*(-+W}VKP~W8InYizDCoH#Vc@Ej@ zVfN9Y(k_uxpH^|1b^zF7z-ac=3y<`;t9Ob`xaryH7gVXo3is6BJkH8)s(X7jBSKrr zT)FYg)4(Wkf~jqX=c!8NUoMOXGpD4f%Ub8%>$qyNj>nnq+odxz^C=nerZ^eGQe~6( zD1xRlc0mg0b9``>#y!kw%t7Qv5;DSR%Bm3<6uQ~+?GTt=@~;O;0x3>aIsvd!G=kE( z^A6`8{!p!tR7=8HFsIh0eVjiaDN7hb0jm!oEUR#3 z1x6&q037b!uLd+uDkHv?Zfc}ZB&oj9Dq5|!Vte@%p?Dsb(w(k%C!)Q-UN+=tE8LJ( za|j2aK?EIgoA)cgNDZN90S>Gftqezv?i6d9Y~|>DjS2+b7))14E>)}y&Btr1C~xs! zx+2CI+GMfRn_eBQpxtcN+foqu)=mG5x*}5$Ls8671d1&&HYR|@=66tubwB9t=d~); z+pN)GI!K*ptiCohQYvONPNj#}&3#BtKOsYl?x456!K9~~m5u(iAD9eYWtza9X=d6h zU+)#p;Yh?}z0w-^GC~h>x-T8l>|jV=NNGm15`N0MFc8vwkYgpJ1pBqy1{lP+Zdpo< z2$pj&%iCB%ZsBi5+HG2*`m!t$+fVnhSko;qeg@X(eoc;JdZ9FUz{r$p47z(nZV|PQ z)%RkN=MAhPt9=fQb#r%*{ylF^qef5z@(#9IsSXxFF&b)Yw@TtKqJ|9FC?S`E!8(1@ z56UUre@vq)KWXTo(nGX3W_Krbr$)UVF@x!lS~V!*kjoorD+59Jwn+rp+~ER^P_~;X zq^!`#w7_s~gh*Tw5sLcNCGr78)Kb?*1v3eC>Tlv6WO}3mp)4#>3o931aPx&yq$8g! zq|jsTOd&;eoBr24MJvx_Atm4r;#bL_1f5GY^_0R5eh*EOK}+aFGUyDU6EyO-nv*t3 z*2DFvrbMY`s@!~`DpXDbyXttd@IqN93MtAnQ%F&s!-bS0&9>@Npj=4`Bmn)cmJgX$ z$EcKePf^i!+DliF0Xh=n4>B+bKRxc*|tPgdZj@Oy1KeaLm^F4 zZ3^P2Ny;?IlQJK;Nz?T+afgabrA1h_>$%@c?;uGSIIYz>_|rrWI3b|~+Ti)Rq>PpA z8Mv3h*m!w|OLo~v1NWK_qavdSnIOH_c%;!CLVHkgsXE&mL+KDLB%?`PlXMit_t1uP zcnQt4d}jtJ$Z_?Rbsxh^TDr3#fnLErDaA1ZU9SNJ-BwV1DfE|0@$`v2!4~BO5(uTK zv1dZb0OED1;D!%+=j+a=;9$_Do)VgEs>g6g_EQ=ra#H+x}jP4u)!8*TX3 zEDO_6=~8G)1xUcLtd)VKrJLA*Plxa zpdoc=Z}4xFgvDd*`2#)bRH^0aR7-$~>Bnvx8WE`SE4$}a6er(A!@6?Yl0sR|Y#4T= zE;8k~2|l;EQ8h50i4|zOUp}NwZ7FDLR25HK%3%WNSGM5EgdXxNNKboi>Gt?C;pr(% z$QO&lXEOyp6H|+4R3CA|;lf+Z2B$6Me$9j72~CrH%6%baaZbyZ@6|{l8+tN?GYng= znT|@?wASqs+8)V@9j!NSAH*(*btIQ&~a{{w;0r|B6gkuvH z0|E@#--;i@l1uqqY;AB{ss=TgFqPw=O0){+Dg(BJvZ}8SN`e}zSsggk6g3NEktUVB zNo%Ejx%gufY$yB$v`sD6Vr!~`ndfTihI44s>bVCZ|BGH$d~9;wglA|FlVSy<4|D;h zE`ka9lmQ23PWu%qVJ2VJ5?C=?Z4N72K?>vm4v9=ovCMe7ZbayoZo0!fg_x~TP^xa2 zv~CEiF}7)qZmVn*H6`vn8nwAX)umb{z(}xFRa-c%tl^P<7Fp^Cg5}Ozc`G-yXdA|B z(YA340_R*9Wh%!g082doi2MT!{3mv)5Ta|Jk^qwY)6#0u3*!gkB7uWM`5r*8-QK{# zON&ODTqlauN%88Ins!B!!&d!q;UgoGfrOPd)T%?eeoDRaJYx9b(}xc#V#JK@S)T{% zkQmXS2WYvK1>UIgfdts%m%3ekZ+;9{DMMz!hW&hZWJU-kScR)u|WosQbL$0bI z8}5B)*1jxcvCUGU5dDnLmfdATzflxS+v3nRTf+C->WM!QRW?{v$a3niin_>6Jf16x z3dg_Pp69soX4Ua|Abj%HX2gb!#1_e0DD^*v?bA4(ylf zfDO##1}pyAKAiHe_{`q{>v6%dNR)yda;He+s5Uunb+E>@d=e;26*R8|Z}*CaD&*M{ zcZy$R{mx(%yAg)X(pHb?(d4p5mqvIwWpIdO2rJ^|Z5v8+k=%vV_DsYu%Az-j<-5GE z4t*haYds<+pcWo$kLp&c^)^FT=1Y-mb=BJa_wr6#cd0PnfgMDC7#$^Fg#56%*8D1- z?oWs9_?@RBtRexMS6FYlpNtOK6P4b&SjgtJC=>VZGOprYOP`qV!38v`mUAee86 zV4hj~1K-VC_!g_0d*Y3AB+u*DzM=|^XpQ5vqcp+|*0U3%)e4$BMsw;un^jI9V2K2b zepc81NX=H1{~-7-3LD zre9YDy^=eWm?)AZ4xze_8+0q~pjMLx0AzcAkCh_9fy>IYv5pVCE9enn!JjMk?s7Ah zPha54HJi()a?7r37lbb#*vK8VoQkI~(4MoD{#FG?-sZf=ep)+6EwnNDSs?eh9HVn@>=F-Y+blCgka_(#6J1?I`Wib~;$VU3xvs+Fh(;CvJ>`YcEd|ybj_^cszC-8`wxy9<6P!PBMue z(Gq3*s}uH0;WXO5I%cmB#O<$U>=lbi?XTvn8XAk*0DjtDna@>M?S!ytnq^n*EB>BO z*fP;o`;;F2aK@VQs31XQBhvcvIrQ`!;tPuiYOlPrC06E^$0kwXn(n2V3E&lgfRXpE z_s4^enT{nnmpme3Rrba${Q}*uD^m$XfYMtusYp$OiKIGe9+cBuc(OGIJG(}M7(JJh zZ(WRv-aiyIP98{{ZLC-eTBhjA{6lNp!Y2Da&5JBV*)O&#m1AUhN3tsOxn+B;xhU7% zNxSw#)8-%UzGcrL_Q_Lv=o~NfCnzS_D&k$sFs`8eJS7U-k7Plt%&LEo(6zS0mmB*F|AJO8dDg7q3}6?4>di)Vl#s|AyL9aUZg4 z4{f3)f7pD0(jK)3M6smqA@el%&5ElWMP9c>q=`r~)K6v(8ah6Q}i&^`kb;?4nN3(WtvW&jS zDE`x-R-dzLpbjrIzHLV~guys3H0+4TJdiKh$5oeoVI=mHeg1WOC9w-_?KRr+=R4Tp zl13BXv@Am%`x{x4Z{Jgvb)|c&!S1IWN!ZWgc3V;qaeLk>-pmS8wDVkNPw6FeVO2V4 zIlW_btg}G#IcF`W+##s^(LzoRvdQN>o`+e?sWB#3`l-cphHWqzQI5S$^~9^8z4WjZ zCd>KjmXmVYbNcNtO+tT%<;3&2J*VFh)6DrH%c=bsZEg3PVwyQWWjW99lvCP8uI*p4 zoELP;iLznDaN4pgdT2);+H2k}{G8|BZr4C!`}7b_KJok7q-`ItES*VAx<#&ze-yG> zyN?*OKpnzwW@2N1M#m`4k3UTDW>}2eBhC9ZN!Iz}M}DvM@#!T#mYVNJ*rPVW{uc&Y z4ShC`!BZFSvJd1SHKDdwBb$wk{W|&Gci+gbfey0~&J*Z78`)E4Oy7V8##hIqmh!7= z*kFz}PYdv0Fc-kEHu=y`X3r~>Z%7qD}nY_v-C##X^&#^AO zfV=DLZY6hD+MUj$xy|PTmvZ1HH^Q??rnlIGTOiEX3?*N+oi$ zN*}9G@X2fydfXJfq;7Kx-M&=wQd{r;cRIA>c(mPX$IOP>X>cY-g9n=TZ8*}r^~*`z zm66j}>olpBiX{4OJ4OoEG8dy}e$1<2nl?n(rR#(<#YiP2r$ke39wWs@z@3e02-nvjmC=%*|jmUn^MZdYUFQeI$Vgn*V+4fFe6y1`+`a`(o(Sa^=qVr6at^bfvB zNujZ94|FPJTvc6gkW_n8FizyH1H}NKN$5&Q9VYf_(d)gIh%kaaOkE*+@n@#doUqCcby7xl+m=dAp%EHIWrR_{#-II` zWflFtU<%>4ndRjFp1zin-R9PzgKtY8UD>DIJuygR#-`UJiLvRR+ka{^! zMHlRols3{1V9(z#8-Q0*u-;q~F_3B`A>OVeA$v6U`k6LZc5n5!=!85-s7f@-u~4>q z+c0@lWja62X6@&b8lV=dwe+3#TJJrz>{@#@2&0^r+QNG2e@UN!+Et7yo z%yvv#e8je{IKKQknHi=Hz|=o1yHRGWX#;R{`2ftM(+1$w@&TCPrwzcqZ!NnCG7pK^ z&(bf41#y}EVrHebI_>@Tvg_nmH6=Ho^6VJ34&*n#e2|^%bb9#!f>~<;-|suU+(wCi zHfLjSoU^?zqM;W0}n|CTDnURlJi5ASax16lmGmWaW8hJNNIrc{EN z0N?IkN<&lr>QcS}ak?A%SbvTk7QsFCt*H*BQ;(4qr4g z6>RoHUoc2i9jxm34WL)=Q^TaLWeVf$Z#NTK+kZDVYg%2TR?<~sGS^3-5tx3ruL_$GAJjs38Nrqyf17%^>$cBzPZ}& zbgYFZF~OFRoURz3SHGw`0aNNQ?h+6gM2qkb34(_g)Q!!HQSV4c z08cI-z=nL|qJJ6k*&Zhg1;17|XB4IMaVg-Ro)13O8~)?ih|ynW7vidIZUI~5-a z9s8nMy1YW|SfF-sAPCD72WCt!nS-fERYudG>Rl~V?en)S3U90RDXX>ccXm{9Vtc;J z+kgi|On+(lU2X>Z7Dqm~u)YE0>$sa14vtyI6KJwUtWI0&0x^R z^G5|?c|30`=WPHcpI9~kCjV$r@nCPZmWe~AspPpau?_yIMJk9(s;2Ud*v3q+=-BD8 zzqtqxx4Z;$qbfjh-=m3}F`%sybIWg}83Wn?oL)WvGX}H)*mq*tXf|U&8-Tgx12AJi z8-TH|EV~9W26WIimk+?E*=;r0{ncgHz~&)s01ho1fEtjSab=EP%&D+GFLZkNqD{S@ z)tY&?%$A5RxQp>m=Eno_`{4V>G?%fdXw$YB*%1~79yhaDk+6&KC9}B)pL|e7kkXnE zJz<4nNe580?ZXco{^IX`_}+IuK?vJkp5HL_xrhJZ===VO<3FOxiH?qZ4%g0PtE}D2 zJc@Ab?e#L*-}jcsMs8$oyvRv}Yi|z|Wg3Hx&inCjx15s*`&Rzt`~TwUOSE$J|KhE@+PCsI9@~H360N-YKdO~q ziAza7gi?;7%DEvBq&oHA{Vc_*{Y|_=;9 zMwKN%K(fLYg)@546?%y^fqU{=w*Js#=nk4X#q>s_PXb5VgppIY@A>W4CEl>@s$Xgb z&ZqL}t$oKjlW$j&olC7=X;NZbyLVh&P4<-i;xhi=eaH@Acig`HXa6l$9k$={Ej#@n zBW1TmiM6`J)3A1*Q6q}d2y2mK8CB2&d#R_(8mtKS8M#r;rsxkiz{_G+59z%RUa<{u-x1VV`{+bwPFDTb4U(W|o!ZlztFHSR)7rC4lsX zFeIxizKb^Vj9dd>dE271DSBExru!_k8d&s#o7E)}-5Pn+gU$RYMfR!IGBbO2A;p*uKt zg3~8<*%NoGciq7$6be#IGfE4YwYUkTE7Z&)B$yV-)-T`1P+k>mf&vg|#P2=O6?4IV zRryvzyt@t7HrMhvg~^PB5>L}w+Xtyy-q*lLC#CZK|HxaZUx|%vL}FJ?po-Lq^)Js; z2{+M}Ig8`Vm?K-O7aMqZtq2`*Of{hD79#;*traXilpAn^r$vuqis~XZwhDoDD4tA& zpGbR&*Mf8f(fVO(d6d;gt(-Md<1;;zVOzpazIO$TrEd4D}l5{NCdjHb*?O zx6a&>!zSCvJ&1!iG-pTy-;_mb%kJPk+uaB6krT7YBbq?s{;x@v`KWUxovKER7w_b( zCO%?sJt><{Gg-VePrC?>uWDI`y9WtpLGaMr_8kgolKAC9H;kdODV-=P>M6Jo-*+m= zG#nvJzu8i=xeVtwR|Xsa5XL7ak5+6X-3fr5co_wBZOZ^NmZ~w!4^bkI?MNbRLv17o zK;vdRBaoU1LHd9z)F$rC)p?!j%$M3tO+6vLY->8t+bgeGLOfj?%f}#43GvF3Wm8F0 zJY5lYBc2G0DVcN!yZ9F&nCqBmBwO`oyL!?@(GRHL4JLGw8~u6`wO0Zc67-(2|{Au(WqagdTC~Ry@?lt`0#HKOcKpr~eT!#q~S<7EGTg8aS#N-BvSeb7F**X*?# zB!fSPZEgY+YDL;*Op-K5#I&pO`MBjMg>WeQ5ybbu(SRf)gSvL^(s=7t#cZ1Vl$bmm z0OY$8p{)(X2yHH9ZH}PV(1xhs4b+|eTk5%9Uwd0JbteSH7}wz)5-Aaxtl{6ySOJe} ze1=e6#NV_fWjq5myl~b402OHOmv-GYMZ|A4;#Juwcr@A3=v&yfTq|+eigyln$%m%b zGzqGJ=hpQ7bF|V|0@F<&;-2A5YTb;zx!;tjJ~u@;CLHWg^hO%}?zWwcit0r6tCE8n zM|hDos&*Jk9~#^GopyFgUs_EoNUJHbm||&V9yZ8cK;jMFguE8W`Y^zq3vgGftVi@< z1^3%2D}5=$9gq(RvO+OIIk3hKH*dhbY$l*c6ZpzTk_SE?fY%zpJFJI9tzyykh?Ru6 zx+*y;;Pl>8T&0ko4$n`9=M!AXK_OQqr~EywxhgsC@4?ws$*~yX27kmD>2t>jsP@1( z9iEUjnoK2)0f?^89nf1&6^dD-<2oBR{7DCf*Zr}oHAB2tTG+3DIwR*1J%gBOpDt+r ztNlvo2j^T>`GdMrFuzubQEL|49OK$+RTTsPACD(U9j;?Zqq3tx)FOoVnz|*OiRnXW z_oFmMzcjzHy-`(g0-ituw^d_e1{B_UKKQnhd&eUkc~ z=1yAY`FOT~uKEh}s&MOJ&N;|+uW&&wt3T)ejkhSd&u>)c8%RrCoiR*ri$`GZX;BPn5(G2FZN?Pcd6Jz|p6&o@Mh{F8j4!(ELt}+N z@a6o6M(gD~c{ANMnnwat;{PUdQNr@bT(qL&I?j>EQTmKlzYlWM6c{QjeIMj_asfGF zkPVD>#@=MYopT|BaDNUWxFFp3iO#^zRtfjLdhjxOk8Zti-_5NZ*((-x6R!~)X2QKS zY+P3q?gs-oPq zq}VWWT;Th3f~STQKdvtrSSBRRp%SXcz=FFh`AtH}XupB51EPHHV(V(V5MgKIg z*g!_7obc&+^|C}s!Dwl>pNj)?Vc)gJ0R?o_=jRoG4%vI#bTi$=?K~&j3I;#!el_P zm3)`rg~+^omrP{nA^_+D5l`-3H*a*3N%(3yKvo;-h}Ko%zA?0u5n||7?q7*&81LHN zVFdI;Upk->a3G9_HV`Ug-b?{L+PFKMPw`kgz*%`a6gE-_cqGw5g9HBIP|`SW2SNGl z&Hkiu{*L-ecbk_zGYN-b@&QBP1-dc>URW}5CRDO1>^8+r(^#jwk_~ve6QXcywp4<8 z=?*3FLVs2BS2b@@9N4L(_d-QwCsb8gh>F&T$#I)*@_{+TMTXBB!J|&*+e<{M74A$S zrP87bXfW-NNs6&5ohYKmnGhIkgp2RYi1jX%Vf}jpIz?pn(N#5Iw@^N1P`%99KlCVwrXp+~Gvz@NX?V*I@ce%oxD|AIcxJXx+^gLbBS1;BTX5}CN(^uEf>1+q`oS0lqhYBNq+^nJgf9aaAxv9s=Z#d z?lcHYzIHArw89`D>2D)JI>=q&V+-eIL30Pg#HT3z;ccX1e{&ExW89DlMGXQI`4Xw* z#a_r?B=OF9xjX8sxUAVxzkmyPxVbUBqkf?Te`%}9@p`|BaOOf1){K@C-;6$z)=Z3S z-iBb)08sJLziOhNdXm@$*$(Q4fUSHW@z2)PAm#~T-n=E`d6vo|N4PDZq9y&;q#UxG zZ&rFSCpb?RQZ7m_ax;aL)#++?xRAn`!EU~g(&vsQ+eiGuM^yRMxRlvQS_>i~5^tq1 z=~8RxurG84f2NQ(0!b}A^XDxikZfRBqqrzQIvT~sq}SFsFdKQ(tQOgsN;d5?U(l&M zExUB$>y(upHRRO{G>mR6Oc4~y%*<#fvSMMgRVqucVWmh%JONx5QYsSop2`p)+}>!q z42A3MO8=H7sCLt_X@DK+^O=PuvF48k^gy(rQaP}uf)y1cD*Hq z{=?-fu`2|Za+r*4z4~_}l7n?mdxeQpMp%1k_cu0rc-_s*dM^d@!7XWzM1hjn9f~E> zg9cC$B=$t1lWK>Y7FoL?^D>7dSsIb>p1+1Xl=S>Hm2bq&rSaV2rTE4F+0GmHGNLIu zXh8s6*&hm>-;RUH+03Ty;9KU#bfBmip=b2aJj&9{uwYPz&cl`s)}g!I(Ly%X}6xF@+DeKYdJ@63&5`>anq zl-;*Atnw4KoTBD;4uJFRdl^Pqu2NOt&W-_aJ`#75((d)|rr5epT`D(eAZB#se0mwO z!8z`b+Gd0!#cziiN;bDP9r?93>c+}7KmR{*Zvj*n zNFKUG8Wa?e#v&9!3{nIE0Z|YIB}5QJLXfa%#X!D2sQ2gl-h2ORee3_N^$ly7dFI*q z^vvF8??2-fzwG>P{oX-=rU5+oip>bTek=?KE~Mi-=Kl9ii~oy}_y6By7HS-rPYzTC zIF_C5?hyY|g~I=+5NIeg!T`i+$CjYL1y~l)n*Vr}|Jw>V{@+%Jg275cFFsQvHt zjP!t5Y}Nwa34-x85@02IXRsc)KJWx^L@zvmv@^Pb0v}ot;JYs5AHghxojj18`{gl! z-Q|D=SAbpAJ2`Df*XDV?qFyK7Rb)&@rLT5z|#F-#tImNhe6BI0WSqDW(&yv zi`ReZ+gavn$GJi^K=bc+tOa1@FFOyqMDvS9U@=8tmwz_{$OxFH2h{Et8p^X{)j_kt z58J&!X9S_G@}RBsPSt@%S^N(|hAegU}zvXBF% zAnF6D17Zb3=t2aXtp?9_{5i#w%21_G$$ zB_Q&E#Tq+9o4;a`-wQy3vQcyh7!1fG0%Er`jN#AXi~j)jfrdbTBv2W&4HM!&zlMZ5 z^Lxj}-vhFM&0u7B6H+rsOhCb)auR~b0b0`n^)fa*0FtmT$iP+-EGvU}9|6bhjMxIQ z&_iPPJ5bvppSK=Zi2zL9fr8XuCJ(Xz0vJFAutYUbL1+wOXQ^sv4;b*Z2rLi>0xj^x z9(aDppJMf*0>Ct#UqVTO<_8GkL79;C1dAgZ(t=kUu+asW3dIosy`w;>q3s+5fT%%R zy@97-)oUP5J5}zyiHAajhjzC>1p_7mvh5@XZV(jxYoHNGGVxdGAYK=MgSGUCU1GB+$^EsR=-KcjN?ge5a?7v4MK}d+`3BJ%tf(qJNWchf5%tHwkR#1Fj%U z2lN6$2qr%P3jP;?cXmHQfzAp*Yn7rPB7=Pmu^`FLLex+`Xe|gFs2p0F9>f8^$2~!} zpy!}N(Asam$qaUI+#wt&0;&b<%LQ$F^NYxUH-L{uHGT?4oe8oHVhDvaXUl? zTNgk?hAKouYq^72W?+^0Uz7&l@j`!78p;Ei2v9e$2hbwazgP(A5rq3s_W#iP?>vAp zJ0$uqLj0P}1eyWcku>BlN!y9JVURodMS{P24>a%BI@*9He@Pnh4+(Y%4Tu0jn12xg z+Q;g@5#hI_{dXcjUoU@48bpczLDC=w>`2-U5kPqVf0VS}?1E$;$T>9gXlMO~otZL_ zctCOn`uk5g14bL-{eO`g$_*JJs4I|qK*9wwf%p=ds0IWB4wdptVE$7S^!z^p10&YM zK{)VFHtcxp|5f2Zp+M;&`TwWj|5kBGjs+n>2V_S;0s-j>6h6kqC*pi|-jYE|NcsNK zQ6M~!*aH&<<@&d}{r9?HU~UK!GRix(fbJ0{$lA z&IA!?DVM&NO}SvBCrG0UW;-{K(0VOkcc0kUZfL=J(0J5d7&xFe53n^07V7#A`Ult% z76vVyvO_@_L_w5Z{%j{y*v`)#VvIpaaF97RmITXHgCc7Q1di)hX}}Wd-JWU71A7o4 zphY*~Bp8H<$x;Je6r`g8^Uk2GI$6M(qV%$EW2 ze^1BSX;2QRA4pIT2?-1pIVg6M2$8XbUt{pEnoQn7nk zEtQ*d_GVm{(9X)q7R2U21?rNp*|{Wib`}6Y@1O}JJA(0>F<@DK7_^@aN-sXf6nt`r zx)n>410~bD5Dgdtu5(~FG!zut?DRS27xE{V7z82XfadJXCi^?*of80a=Y%o0UN4Zb z9sBin-YtmZTL?pLz4&N=hQ5oT^w@(T^87%0wSo%3BO(ECo1rZ6AHrAiPw>hP=m*C{ z15$t)qu`)V0CpMv=N1zU2!q^1Iwc5p+lU7K5W)cn9~~u#-a|@`5+s11SAfi5SDt8q z#8}?~Pe}lEDlrO-9bm0*MM2gh8Ynj+Iw}hMG=oSSsY1bFpt0>RVs90S9}pS-`y_$u z->?9Hp=aQ0983`W7Xqg+IHCJp;PiOM0CNLZMo<9lzhLISV5WcJA(-VaJoCTs5X|}) zp5Kyol8NXC;Yt>P}P>ZYLJ;zE{JmXnirm-YAakd~8?SCx^M+sQ!jbEUdb0%Zb& zKs^`X3@{3~-T?Iq{slh*u*hF0j{Q<$e1X9)kZa zAA*(t%Ksg}`vII{Zn~eAz(sHk2@IkJlKiPbp240}KN2O}l|pd~BKeZTJ$*xbAw-a; ziw}hqN^uPa34JJj9>K?8uoeUZw2;V-3_|S@11AogqJQ0^z`Zy)CBO+CfaNeraFTtdQb>?zBt=8RM9*F}FeE70Ro2y2 zMTP99q@t#-tgI@pN_J6KP?3{!RaKR9BdfW}tH{ZdmE7GG6=i)qT>{B~wPYV3s_PEF z0H=TPih^W-8G?4411ABTf8c6x56M_??Jr)=V_`7-UvL`eAf(%W@DMBqU{AkLvX7@5 zDTqSxhB`$i`B6N`!JeTM5}+70loIIfLk;uv^Y||^gG?v}m;$&!I{g2kjJmr~+I?Rz9Rq^(7-bA!n9zDupk%_#tpjwI|6$J(}X>OJ%WqEMB(MI za<~U<1U7;gfsY_n!3(r1Tou^>qeswV=;8EedL%tI1D1ixKxAMt;2CIHj4arrOBOGS zmZgZM+!AVuW(l!GSi&sPEy0)YOXwxqCFBxu3A;qk597!2 zqxfm~5&Q&x3_l$|oFC7R=BMRH@)P;7{PabzB3u!wh^7cpL@2@((G|gq@I~k%+9G5T zu?Sm4?*wzgIiZ|roDfa~CyW!F6Wj^!gm$8JLOKzhuuk-ouu0q`YLaFWF-e%jOwvul zC-IZ$N!m%|BykcuNv{Lb!RerMXmk)d1RabHoeo?FuY=a1)j{eIb+9`0ZLl_68>)?_ z4betu!?e-0!Q1d{=r-CmWE-&!+eRM)i^0X9VrXIzF@zXQ3|$O71|Nftp^ZVt5M!`0 z^xLouWCqp@W`;6Dm|@J|W@s~{8MXn@2Wx;gAj4o`h%k5<@(b(>;tSjZJ`bCRv%}co z&9HpfaoBel7IqS7`2nD9-Y_KaIn2Pf;9(fpHf|fWO_L9|gY}`lAo~z~7^8j}P+naivz|a+Bf+T+&OdM#xEJ^f zP6qdo4f=x@1NV@v_ya>Wf$1;!F}SDu3)TepknR4H9;yqnF@KIf&$qw>sO<2++C~fR zp|ZlLfj(}8V^m*CP%t@A+C9W?$F>B?0_z^UV-A3U04hNa0{&sg>bR3VeJE}kBmrM? zaG+$@`U;khD1OLKX{>J}zQx`}Ma{>k%^v{*-Pj>YTj`%M#1oB+OF~AtX6>RId<9pbE zPe23sPdTpCK*|n@+QskUx_JCuH*>zLTKiI7tfpBS;ZWkWPq+5g^(?>7lgH3GrMm z{C}jZUx@E7n=D9R09F{#5u8vz&rzEE=ry{2+rzWQ^FDEZAuOP1|uOzQ5 zuOhE1uO_dqAg3U&prD|rproLzprW9vpr)X%D5of|sGz8*sHCW@sG_K!Dm{X8fnNXLVJi`O4P{DpA`9yrLy(-pX4cSs&V@Is0r{*t+LaQ#mi6hF7$ zCA5R*kX-%2|H}VMcz0?FB9Vc7LQ)Mf?EtVTkOzt#K7%XNr{6IS#SIDwerMfjMuzuPJ%PI9ACf=GVUV2~-;^%%(w7%)#i5MF>t>7Pjr zK{-&&?+C6?oP}jz+|g0^|IY_#%Kzno_&*-Ve;p|3_^ZbMrhOn1l=T6DZNxAAE2d@G z@i#6Y5A=TK5DtU&gJ+N|{=ppq_Yh5CM`UDV99<%U|5!5;FlP{R$RyWev21g;#U>g-24v!#!4Rz^I3~)vS6PlTk1-D(ecyS zd6#ROl4~$nyo#2#?OOi;iiJZ()z&WNdS%r;kaulz6HuD;mpsDTdnUTdvb!z*xbl7G6$F`OA`3o|#qGC3e zic7APmS4No)bbERq+#XN(9yRjEAM?;jOFAK+@-BE|6ysnvkOHM+9e{UsHS0Pe9+v= z#@7C@!%=5fio17E_=%X*((6^#?fsQie$>|Nqk_lLNR%|v9SN6}iH+w)%G2|pgz&45J5o_66g#1Uf4jtc4%2^d;t4Gcj=3dJ6Kcek4rjUk?3pwDfHv!XS^ z5@J6a5O|UMjZ~3zI08l;ONdk9#A+gWY~l0@vxyz=#kG2x4gF`068+11NPYqb?*8`J1@JVF~=@`8Y*-I4_0{g^N3rg7QYwBJo&; zEa(0B;N7vG2|+l2R)a_u8WtKmJZJ35xc$haJ@l-J=KL5;>wgB8;8p(x1#Od-g zYM|k9{SxtWv0uawq6jEN0^`1eTCp9wF>sU(np+7GM<<1Hqp>B#R;uyRN}=#r1RW;! ze8Niehh2@6xAo$rxNJ*qLQ3fuDlt(DQ%Mlfb z>!=&JZ;0>cEyPdcHvU$4#Obula(4Eo&z$9XO-Fy=;P)RgvN{fqPHz&^(lfIvYMPom zyBnqL+uE(s)nYPk+EZ9IzZlTYVLaStZ()$?7zfa6O#9%Zj{8#3zr^0>!W29 z*U;2AvOD5%)X9yKmRSL^bUvP(eY;G{sBh#(iA}6+X>EHkvb>Uzbh@;xwXO3}-`Fd| zf_qQ9p7j}-n%NyX>Xee6QFEuE?S9vz5k@xlBMzUx{M?T94VajuRQs%q)%(LbAMW;;#@b;K z7|Y zfFOkevVoK*N};$gL}ctufRdFrLB^Kib|dMLyRm9GNp$=+BL_~FQ5q>gFF+rA1{I&r zNn|~hgO){W0!ib*$F>Rv)5H#Q(V%0u(Xo>>tCx_f_&5ia*hXAz51PQCi6mgua0WOU zOfZoTc^GvFADh6zLtw)nM8&3JZj{onqvT6aabqG_8ZfgFNE$Z?RKgOy>&AJ~F>=v&_(_>Uj94va7er1~291?vX}QUm`HS3^GJ zH{J@0tA3^UXY8#C(%1yMtL@-+KG8UZ_&WttDNt!nAix6nzhhK20E5?MSOSU!%S1cF z9GQz@Ozb3n8j>^rl2oyzgd9nVS~ewxxaKU)_uW|r_LHPixb3X61)o-d69iO+X{S|h z(2><;IZD*!c*urpd?g2UmB{AHUL_W0Q~}FNEhUz)KC%^Mpu`F`CSVPlnzpHYL$>=c zD{!cPq2v$=_UX_vJmxUWAH2XzgP;uo{@{j0IaUTZ1;`-+On(r9^Kl;`YT)s34ip>@ zTqar)xf>_J0Vk<~3@99sH!K0c3kT!qa0Chmk`NGF;K%9ez_+3hK)&I82qYN11uz;U zfU_Xjfae9NLD@Js7D+(xft|wOV5$fnE(VGRr6SQl^08n93Mv(95~vgb!8{0c(7r#l z@WKt@V0#H99FBuqz!6v)oC_R*Ct{5d+@L%-T$K(EYD5#^!g#nl3XTDdLU1BbNCp(x zUJZeP)58Jnk-P{#@TZG_W5EJrL_8d59Xtdf2oFV~5O_ES`3evLv=$4Mh`?b82)G=- zJW3A0Xt)@j1`I2J1V}Z21R0SUI0T{q38#f)p$d_RE?pS>fdCAd26raGFrEk)3Jzxe znuCvGpo?%$1R9=?;9{bMi{LnkGDtblHv~cyz86p)0p<NCTog>Ns45UL5q3fRqPiV&PgyVK5r5 z4VGO{!ULxRcS1s>1Vn*ff+KOPJCudP+2C|oB>Djk>I^$XRlqAK9USoVrcKJ>+Atb6$@Uv*u)lIvEeaOxFZY2$bV z-{Om@Q=^0Vk_YeL??u%_W2GDCGkM$2x-m5Hu9B*~3QJLp|cxcco{y|Pb1?VjPs&98L7w%nZYd8rWMFsa{1J3M|!Yv9IB zxls`f*n~x_#Yi_BxxcM`{kDM6!#dk@xlMiaSMN0zHX_7ur_fHdqcmN@i^Q6fQB+yR zgU9S|@RILqNxR=Ut2Z8s33vr>Aq^HtFuYhwNva9pufK!2I@?yHIMlds`7t(J=_`yr z{Te=xqkwL@nbs>tTFV!g@8gyUcW|9sxA69MA^Y&Wl%ph>!dzBA=3;z~UxjnuU&qDU zJ*4008m*?7FE%i}YivCob?WYqN#55kM$%)fYf;b7P!0}#wc_Y_6 zq<3}FcqI3wmhZ!X((miT&%G8s_x>35Q!+T^ajU=4c`Qg8weKx2Qqk!k;rin!+Sj`S z(B{|m5TXnW#MWdI&EsA5$L#8os3iQ5``w~h@-w=x6GsakkBSQx^jF`$Hu8vFtL{)7 z?QI!NhkFgTe45%x35_4`)U}kb(hMUW0tvLG`-0E#OAwf2tip9v`wpKQ>Pg5UTxOl+ma}+I*0P@kq-I3 z{`%8}qf)$;6Gy5$+%AZ$x_-EL#Vdr6?Te_u;4kW^(7jLczy>ng!O-!>ZMiIwjc+O? zYmTdN-=VpXKA1(@`r>WF(s-1>s}x8OBmyS%GMfpMC9)0>9A^Q z*!~8Nxx=_q{$BLkPc$*^4n#QPb|EFhv(jbr`L;J%zt4v){0*V_(;)4Lbppz?qYkM~ z7V#+m!sgs>vftC_RhXZ)vDZN5_~GGEcjBb(vgS)wtIC#&&cf!2n7-Qmi`(^bJgfKa zrFJwuk;|^LD!X!97_HLZl#LmADsDGn-R3bWBopag*JwkQDA>HApmxU8^XIP8QkPK?e$zc_(Wz!2Q z^ZjcJ!U+=(D7Bqq*DDD-gMNCxeQd_Fsy&bU@)M~ikb%MK7 zZ@0vRJ=!c{d0({4;z?<k>fn^=8{uMF#?oyw=n%QP<-nP9BweKh!O`a^clw+)98 zmq6aR2=9q{Yu%zmvqSbwbZneLtn_34YQh)vgtW@Nwn1rjnY_jLkeBZrxI& zPAR{3pddk$P*EWG_**^xR8J*?nd6cZozJ?#Q=L)YGjtundzlWeA%yha-S_voAFCJk za{q`*K4wljy|W&6H8GL9g)3Dr;7Ie~V+9Lgdq+oo4)d8wvpPkq&|H+}7JbbF(`JGd z+_jQVC_d{_d3wOAK8vk${k7ft(!-qcj-?lQqn{UBu$9-+cpAJX7J4^qLb59EFfrA2qIrI;`?ZbaY~S z3d}r^71q)1-y&?{dRz|jcdEr5T^B02R8Chnp2vEf8)p6Xu)Nuib1p6;FRdb;v71dB z*+zde&y^lIKE%`O!kn5WZP}csl)2E%-#=Q6`LGs!^i~IDzh9=Ik8H73$bt%!MgV=qy}yY zXG8k0>eT`F8%jhTYBfNNU&CYHcl2OtqtZ}GY-Z?23ud|u%>nx1q!i+iZ^+!btSZ}{ zcHaNXynR6BA-!~WXf-KAR;8w_=oF+Sr4AaG^^q8 z!K<$eObX6FG^kp}?Eh@4tAAfOe&0TYr+Pv5^tuvrMtgYAoZf4GY{l9Gp=hJs5@LrR zZm>PmzG>BbUBmJXOO*MG=vIpb^*4tntw=|bKe`{PIazA2l=p zpuooKw+B?mU($GwEV)+<-+8$-6jv+#0#)kLulTHZz{`K`xg(eGAj8k2ouWAxA4W@z zbs6b$JnFTz>-fGq_rc}(=l63L7~8K^ne-HOW&ln-?p|ReJ`Tq2>)q>{{FLi?d!O`O z#53Kzs?4w-zGr3jNM>=0EoNWTF3Y=N?Uuj#PB6DKb}DD{QA<(Zt?0r$X0?kY5#KHe zQ|k+u(P8I|o8>Q@7+5Xh60 zgf=?+__=Dn*nzR}IP2c*MAtHlBn=MsleB>^l8gJ_ROC02u02D!U;pY?dLt_QedPfr z@hYa9)LXl{Zr$XFTPc@)uUHmp6H=rs;XzQ%Xi68Se{TFckz7`uieZyewhXTJMRuI#-{h_?uoN+T3)sB5r@Q_5Y7v?e+~zzq5qA8lagnLE^2vA%nf z^)iGNW z(YthFy68JyOVy=UPSNmiRlkah8Szlh3?GzS=l9D-ei6}hKYKpml#XoXNBeAXYv+Bp z<*}PIlh;i6n)+7CK1^o)Olg!c@L<1Sjqn%!&}_IIFd=*Jv0UueS2pwdt{01SyuUt5 zc+P%I<$fT2YDAB!<7}n*w1e)pwdt;ch0j5!PFJ!msj_YA#-lEYYPSgUFAC^|+nlQ! znL7QX+CfqC&Y_P-2j1FLN1N||!TDj^M?ljBZ*X#Keo>)2K0V!ksPLm$%~y-FPPVi0 z8uIoU3HXfiIX^{y-2G%)-!hH*(rMj$_mh91WyOuyjZHVI)_wk>F+(A#vgh>-oN#Fwo%RwH87Hhlj5V%OKYGbQ>&7rJFm ztmna!R*MU}U#W;DDxb^BGyf?gbMCIS$d8GILZ$%6GhuAgO3!3eDsC91GV0IiAW3lv z&7ql7Gt8eIj%*!TG%C=xSrNd*`|KlY4_$wDx~s23HCjzCX4p~WfnQxpXw>khCl9H^ zyoU%iCDXHfENgKQ*A9$$_AuAdh23x{>A0)j6%CL5S#k00IaXn!O0kNc1y6c8n|pFc zz?inw1XarD?(>}GI21m2uCeC05$zQ|nHp|G?ZLg$hy1=j`21?IEYrh+zoNP~@)=EV z4*9P83I;s^>3_AjvzD_}dt`rP@&5L**bV=TsqW$p-3*3tQtkZ%{&E2>474R2)y9nS z{bBHr%bhh3&u)@i<=O`F&EwGCB5yNQSG5R{jMu;{B6Wu>8A zvy%-FGO}N@{~C}@5hp4No)fgiOMQg-?BcDukwb~k-<@JkIHsmCW3!;Um&x8! zNY=0(d1>>aYq8kegZYBKD`P!<%xcHyg3vcEKHtM#Ul&94%zoOeySD7DVb$=8SuvH6 z=!$E)g;e$$xe_?`^MTnD!I`Z{VnX}%0HKpy_IsO5!W7PJ9knc#7G9mXM4L5{Hc;!M zwK-_EQVehaYv9$x@FIA{VDzxcjCCzs5YS zeOOh;l)!&Ju$A7xlBSKSAWvn@3Z2}&dVuc6<;Sh@9qWFZE_D+Fi1cT)g1e)I_rNQU zzA@kni$9)KJy#=mF8R#rj7ZO(CkCG_+1&TN(ZNJ0=$C27`*b0#zURfw41R7=yk`47 zAx@<$+mS6;C^*z;jc%B3ujm~`22spFF`fGd|KP40?T%%6{c*{{&e!HRs|O8^!oG{R z4)}ylll9rgYjo~hfU^ykF+TasQZkb#9&k>@?|!wdRbG*(zsQ~aCZBuf2?lRZs@kfT zC(SWDYE<#^*iPPy?XVlN)1BW^J)wFsU*lxu7i@muNWJKhhErbz*!%Y5!d6*uj~Ge? z%B6#kV7(p&de{wB?tklcQuO8Rt&>Hlq4~=%_BN0xUL(Bq3}J`S>g*n@Z&hDh?X_D7 zx$~u}vnW67)dK6H_x+He=H?gK#H{*CZqr%QR2(2dS6rPF-BKj zXcj0X-4)|~o4Dzr|G?06*H8N_^udK@N`Tt^PL)#&SBaC4hQz3!ZnL)KuvpUH3#Rgu ztzTCeDow>GuBWCmI%oDFWnkyN8 zjIa*TLar;MN#xL9`h5GI^yE|HCj5agaQ#<8bd`+J~Id z>fN7EU(P&odjjeI)#na9#FB24%D|jtwmq2_>N202^UfR^Zj?jw`o>#*=(eC2br-r& z@?iOq*YWm_unFeE7Jo89<3+9Q$_2zQQhOk^`|K4yQ)T}>Nol(K3&gUyt&*oRUI-~X z=ldL+v}9#9D!e6Na@l^B(Q~SUC0L))u;EsnHb z>ta$4*-mn9V<26*g6qi1?e{;euaL||RLeFtynRhN{rnf$6q*g(%Cu%0zJ0!hjYQ#w zMEc6gYK@Q~pW>VK-xu-aHCR{A3JtQV#&EVLi7!xWLxg&Sr?2{bx#u_hs4*yrWw!CP zyT5jLz0`&e!Jhu{DC(idjk9|?!h2I94Ik%BUdVL{ScH!bX*e>$PZ4KIkJyP3#2-{v zeJi4{KRF*>%h^@O<87&Yw~_AW7hF1x<*UI*KPn9L4n=aMP8;**?>o2G;obX@F*CK( zjOSBdPw5SFj((TjEk&(3x2@jpWJ+BK#jSRHeyzHHt^!ok?~K*Uq@((vfa!Gn8!OvOO?yqy^h#=OKy5P6~)ij z(oo|gCeP9q{Ou)6HQ$LxA6`7K54Q?+7cO{aE0E-!bi%ar%VM{)a6PgTSVLqaHrE(uWG4gO8=+GT}TRmj0>w2na z(<&|AF?PUcZB@U|R)7 z`rGpcqH7U$ugFI)x>_8G>x#!3A6w4ueJa$4<;Xnu`QDyREoM23<~uXA{&dfAzBgdj zW$3_mQgO+}_qX{L7#W}59&2kOIdJ(z8!ypbf|Y@L$j(Pm2Ra~T!B_t`1V?|P2<(W;b-X={5Fwmlx^ zOKH;YDfIn0Zz8X3q;s|I!-uco*5f}YEA+*cPA8PazEvKZiRa$OCfd#MI;H8%5h>69 zvpI)eq{*kI7!+;twrfc05tq)fe={~dAU~@%*`W76A?oX^WU>Qp?D}e?sgzv>(>y0< z7Hi9sXA?|~hwU4@G1>G-km=V?Iq9Rm^*ksM&&LH{xc_y)@RCA|2LATgqD_p;sJY7{ z0!@Wyc!6y1jfb<4{@*5sm5DPJnB@<%s9lE#-Jg29`!+pYu;Rrz*n3sp-xFUHVzi-ddDZpW zTqO(L@!LOi`r1yP(~FaG*hoF{?bzA6p79G0eU;yzxezz?U5n=%GtIRXx9cK(52#rW zZ$GA=aM)~qA$c?+gt+f%bkrMjx18s*)R_=3i+$A-hZWiO>b?^Fa^PkhpXO}Xb-C;T zRf*$M2?8_*wEQ;`?y`*U5~fpPIg8#~+pzdT2>Ir6QsJiYZHYB4rqZY9M;N+32BeLn zb=5}#=laVv7~F1}-1&Ov>PeG(g8~l{LT1BGA@;n>dKYx`+@%+958gR#vH!kwucJ6m zxb4xV&&R&T>~T#Wos4i_@D5}&jYk}6RKd&e-C*vL<>#nL$rNEbxJ#P+u2D7R70vFS zCnWoieJFaxZ;ZJA<@lW^v9HzEMLEuFo3}E)ZOpj(sZac1;mOI(+~o*L28ZE5BK4C~ zQ@7;%nzppi8+I)n#U!rPcWkE&rpYp|zNhe0mw(=!es(Czrc-9Dd$Q|&)KHB{Zt2%% zfvR-gmU?$7Tq|R0a_k*5h12&Jt1`u3a-TmMy*spf>C}lfBUTT)@Dd-=gskOB?hA*O z?_u_GoT)XWN*qxW9bZy3j|>!VJkTZB_tB8&nAi_?{&X_!m$ny}SWds^H};Rc9G~9b zq13-&m9+@`bZOxzqBv-UY_D0>CCH{oRc^8x$Y8UD{G@f6tCs5 zpS&_tQ*0JOV%djCPC5FnLCfY6W1Y9g5Z2iw@Oay*6`^f-d>#?FR#n#@kiK_Hns|yE!Cu|cNNxLe_DkuX~KUP zSlzZCOFGoq?t3hthwIt)#y#SJpHFTL&kA02S+dd4M?Sc*g1b%Y!{o60C8y+hThTL4 zZ=}9|jZtCl?$L7d6Eu-3$TK*iO?0TEZ?k(?A@AwxljOqkgd_aN_nSed9ofr@kymbw zT-9#S$w_T7R6xZqeW^|J7s9Uhp1|(fGlR`Y|3+t==tehXcoI+T;>33n>bc)O zm*h6%@8)UGwB_+~G-Iu@8(>9WP+&@By~#uxm6UIes+VW1wpA(A?p9G+9ne|XG}Aev zbW?4pNkJ_-v{2$`6-;8?bw>L5#}m>60&c=AlHY_|=Q)MsJx>Z5*Q>T`wBcaFiLc}h9MMk`N-1-ZES|M>9D z-S@x9m4^|`df`!_^&a9$$CGeQN9m{E4qx8ub{Ln@Z761IYZ!mN-i($-(yaWY zf`QB6O@nSeGrj$12lPHVeC)U+9@L@w_H1XPH(e)FIeYKOt(4vqWUrpprS%?rA^Xwr zZ(XBiW)nRCtSNcLUp6|Z)0`3zj% z>f+V=W|TeoZN@2R;X(4p1y5tTrMZV^mk#1m=28&sb3)J7r*G-GCidewhAkWx$T zWUuYPpUpJCNtgM}`D0$lr=Yw^L9Ze%vGtI-OAESEw?boE!0VA!aUvWF0vCe&P=I0@5 z;Y938VemnwbKg78oU@?IJ)46fp4IMN$geR7&F4;Cxg9G@y)7|wrtYdQQyqN?vFXW; z+$Lv_(0faZ3-|PQ?W>~v7^~`&Q@^I$T7K`Qjz zxcsvD$ek-U3sYrsUl-cMv#cr2+0C1+WWDO>9_YI}8L+4Qrh;vA^A|6b_}kGYxhI&V zR{j*n#@PmbyQw-yF}Cq13D!i(JicoH>VZD^80Dx)Q$5sbI z>{3K`Cy7Q+>T<8mA?Z)8V3Ao9``8yB$4R;^cj)lX6D^|?3=PmZX_2RHJ@Z>@;x93# zIMmAro=a&tFm~yY1M_m3n)&Q&+1!`rY{R{h@K8O=KxG?o%CcvvL*0qV1Cb1^vg)W# zwI6DR@HQz$HouwF$I@R`CKh_4=5I`5mtAVza|FtG6K2n!Z7NTHf2%ak)nPuDufTc5wgA?5Na(#&GXx;?aLZOlgAPKDihU#c1>&UQnyqNm*j+) zjwQT!aAi4f zS?+v(GLU+FEvpbVdt{9q%Q4TD|N2#aWntfkyV`qlpPaD$^t#c@b@qES$C?6jM1BAk z5qn!R<~+7Qmh~1OJ}R{CfB^K zTRstQ6@NYT-0<#|M~ap1-&^x{Ep^7OlcJm&l(2?@xYPi7o)!1afU}5Z%6r!6L+(;q zCcK)L+T9E%hWMSh7qZ;#e=G)MW}adlOj<**-;LI^zJ-=ba%oxX3Vk$-G&X*%dsO~O zilTYt6H&>#^xS2!2kBqu8zLVy64_g-o=M8*rRf;Q?X#48i#0G`?TCEc6X#bpZeGHV zWUhB(8BST0&b^eS;jp}Rlz;Y=(b!A0|GD014|P2(OQcN{vdwcvuTc1PEQKE+k5=H`VEIjU6nT^qLp5#ufH5j_!y*H<-6 zGv1zm@HuaEBrT5TJ*?4b`*>Ae7FW-UWb!ye(}%ZKmHDgjWEtuEAvPK)qnF72j#pUH zaVQ-A$vj$C6h61`64%`aZJwJ$_%0_}qSfKH3QG@i*(bBg{`E zS${k}E6D!k`_yLo)NZco(?2)rp-zIsQn~Nq2IVmOa6I@JNk^I%VwYa6i(~?9;KL;*Za- z9eCd8ReJr(9fO?i;EMd9y?ZJ+;%*7=O?BWBGpysxjPnNVVvdEQ zy=|*n{Ms?hqWnp;CB{cn{b9l$K@M`1(O7!S>PL#+IoZ_S4&mdg6>~W&Oan1}5zJ@r zxby{{!qZ+lU8@mVKe~CY7~51>=o21rX~gXOm6o)Sv2u(2+1~8%`LNRLQ6Bdw>;1lI zUQ$&qp7{kSc0Ufg%giSyGMw4x&8!*}EA3E2HB4r?8~SnBHpF)N-T^HkO9hebY8n$Q zC;HEX+wzyXkF<0>xE_BCt{=yyQrUK5U9Zbs?8+wXyMy2Fye{v2&2Q+BnjbKw?$S0H zVtNtO)~`V*rFp5;_e@na`0F^HUsEx0pIk?i?5gzLoX)P3+gS0Rv#)yEGdP7GD9Q9~ zIej1%BpH1!`*fP~s!hx41?_0wH@hxxkDEF(Om5hHpDxU0@#!plYgy?)uweC`rbbuL zu~9-kh|x75CF^4sSSR*i;du0%j>{wb?$PBph*|~O;}xHlfcnD>BDmj&GmWA)j0QJ) z1R1!x&xx*lUVY1#v8eu|CjL8ft$Od~8B03$#Zx!#kIZ<=4A~#;e5ZI(B3n$i`_|rg z(aO#G-m}?ZLcHBkgF;tYwMZN(!+b#p)IE;nzdD4pQ99h{GU@ibSZ;t|U$I0!Z}4I4 z)~&%B>Yf|d>xy&l2bkqW8kAmROgym5IHQSMz{G~*d}OQ0N~49-JGVM=T$zK5MrMP9 zg_XVf>CfrdDJ3%M2r^Ye?mlI&B=5-+x|7GEzb_={o|W)<+9Pmjt#~GInS1EmGk>Zfe^Yq@mzOI7_rKl^h{ECLH!7JsDsM7jhQA^jqwY}7PIK)*MK>J43%$@Y| z;A?ipz&kI-iMR0D%3VDJDkpwu;MlZZB$+4+H;a7fX}r`XIFiDFCeYT4}CD_@x%Is z-CSVz@h6C5Yu`$=B+;>q?4O48zkM?O{{6c?_Hg$%=i-A#tM}Zr3)uUlej$NXQ(S-g zK~s{p$?-({syF*i3J5*Q;v!&8a(Xb5p_X0io7p`NKUWgD!>NQ5=RZHW%%W=4Aj_9> ztYq>O-ChI3fu|?acPX=&ertYVcJa``jJ+diG`1f~dsAE}PnTkU(8|$ijbvO*W;bWr z&!)0GF}xVfZ}UT6C0D5DOOC#{pY{3jsw_XJ-Ig^2TUH~AZrQkdR~dMd&-8cTOa@Bd z4KW^fW92#EB{rTjyZCw)MzKR`8mVo%o91*mest(X*ev~)x|DTES&x+=DL}$SEl=|dj9g8&$qOFXo9w{ zZ=Uw?5=Gzg)|*$lQRulLcG_}$!Frr`Q9(OV{A0Dg@axv_S%lo(w{C-^UCj>DWtAS? z?g5K<4|d|&^6n%H^6nEIB{OTt;v~lN&WDSR%$Su13Z0dx6a3sQ@kZR>y;|Oo`KHm~ z%&)SIIQ30Z#j zcNy{1Me4ztrQlD+w3|8#?@h~AmD)W51iqWr{0zycF34x|-_JR6r*3**s1G$Mi~uIt zygM9x+P?hziGuKumUDdhyAIvwoV8wIAI*_D$B}DzJkBP6Lw7j- znJ1g0?lpGJ%km?$Qp=1CL#_jThcEY6G-@)0s(j0KrG0MIlE7p+Mn0W|UNSapIrNb7;8iE^pEZw8rZv>XOA#5}&6eOc5n z%_Lq)H%)R$h(7JKw*+0d=g~Yip2M>XPHVYze{fu;{kC=k%)2_YtH|&zMz>2CDZb)Yj<8+C^RoP(H~bGcou1)XxEf}FHikK za@*H^xadv6ck^mnZX!SN7wff$nSynymp^V(qotxE_0cU?dmi3GlYBDdOW#?9nQcs*HX2LUlXvlh_E&etw@J#gPD|wFm z{G0?2eZo2pUqwARrOLf%2t$TJxit}$({&o;Oor9MbENOw4+mH1%e22D(|l?&evGE_jorJKd1mW+ePGuQ0Umqw)l_4Tu9_Gg zcIk8W7Y%!+XsZ_5bbR$wb?b|!((n8f9sAXZ%yn()r2P#}e;jeAxluKsegW?biyo&o zK0A2*t)?%__pUX&+i&yZ)&>1;_xVAKvAKKJyxHm8f@~w3ogZ-ES+GlN>(bH6ck8FU z)b3CI^>}#ic46i6i8s9))`zb_hKeI(l1BsoQv}E=Td+$NI(m7UK49ICms-h<}9=e#%pLe_+Iq`XDwgTqsvBr~q-wiHs zd(h*MhWR76Ueqhz^nd-a)Xl+@dNj#%^Yz*8W4H8rF`)bXVcANyC^-AndF{)=@h|OK zJslcXuz8_88{YQmog8{=c-a$^??=UCjUNBJpUb{BHvyd7@f2EvwnxpPtP$r-hNiZ{ob#AT0D06 zcy<=lUzV@JO+#X2lLte8xj5(Hr~Zzb9JhPAwQu+^Wz_ZAQx5iZ^1QGpWZ-1^vGI-P z?zrJrtCarMf>7BS=flqj%-A)zVx8hoS1)U8x|!ufPv1$~3iYp6Wa5<7Z9ZRgKk4B< zWvi-*Z_&q9cXS?{l=qNv#qhNS?iDRJ$zxmiN58`R6%$PBBd-)Moy~u3#{pS$?iqV^ z^ro8=eZ1rPZ0cZFCHvl&cgJp={c~xb`}R|s4sYpuw)gDSi}IXtuRpEEq~^&9)lR!C zS++F#VU{|%5@!S_)vR-VNidoJ%eIHIY`3*f+{9>Zhw$=HX6|OpE;qZnj&x&4h ztGi>Bre|JyT}U?c;?%3nH+JrJGWO`ssol5k&c41v!K>Hr%xmvt91wTbzT&U$iTer>pps-BN8b!mz7hVX$CwG*>wDQNwA9uGOmz4KpXpzD@eHI-o2Y>I+;Ah6(lioD{VSW6M_jSL1 zE_$|hsSO^HMGhJ7CbwE$dh)F7t6F3^Ieq$o2L&5Gs&dx5$jG*@H-~w=++SvNxz?{6 zHJKi`dydEC3Qv-pf3EWElDd6~=s!*Cw{0E1`%s;(ZS%dX^wZMbkKFqD)$7~k(7nfl zTt}CzJEry88|T9I&2BZeO@q0A&i$0HhO2VL#IZYln&$6zqxhMtP=8t74^;+iDY{@@ zui%)1ucm$8eb8^*J^xvGYK?vO+i(}3fQ})htCu?eVtz{g**%)f3HUU#XZ2C8ub&n; zSIhjnc2}nc8}4z9|Q_&%Y)?UA7~>J}c?uGRUYtH7>uhC7|RCE2|warep&|b+t*fG~?rz?Yum0h2QZ8{w_ zvd@l{RX%BIJy;wWI9a*vdf?OFbH478b#R#>{aN??W@~m;DKOeN`VWXs>Ek&@XPWcvvZf|KJUkm z9|v@vP;K|cz&=qF2>w{V{I+t%jik#*coQ+_qrlo4Op?qc@vRF2CH=Sl;g1>I8>XXJ1^c z?NR@i7wfmhMC-=y%pK^aHcj5|(!5N=Ggn{d{bTjWpFC=WwT^iC;E(OAoyt3E2UWNM0R6Xo=-d;Dk+nMOwO~QUP z%$)h#mQsb?eNvia=`wupxnms_Tjcjfs;1S7%64POOm8{XI(GyX`*3+$cWiNzHX#inZx;W67AObxHqw{h4+4s{Oh@FPBjD&p&=;-ZO`_ry14JH@AL9@J*mv9}v0w~ei{E-K&E zogeljUm3nR@7a94*B2TnZ|!ySQt$XVE2j>$?^yIvoAUc^AAWat=mwMXs4@*#H3_O7 z)bz|_ZJAXwN0juv&_{h@^^6`Ni96iN+jnvNW#7BQ=Qid#6sW7bq-vhumM?o6RrmAs z;gur&7lanB>fhP?=E1~!gI(tIZSS4xOSm~v;9vq@*QZhqu#)r?tL9+ir`rzv0e4heD;77*b2sUVf=@lk2quFEv`P ze^|M7x8C=A%iZTp^_beV&c0WruO8REN?w(1Xx;_mjjO6%bPTE)a8293#F_UK=zWx0Y8HIHUXec$c+%<-nv&S8sw=~uMTuXoSA zD7$unX9@45ssXLCo@;*m)DOd!Z=E}`O2oGNO>=a*cYfU2J$I5To$OOA_Zo*bZ|BXJ z(mC$qt(_678q@6y1}7;7Z8sTJ1sP6&7bRfRVtEad%Je;Hyj;v<@~0Ux|hl+Mg|Y)8`JQ{{1(ce{#aQ- zp4;iBT6OQq`)zy23_V_KaGtg+7ME5w`+4IB{jnos$L$YmQQWm+?E_9LZ`_DJJyjml zqT9xg`E!N68g`=Rk15+H%#Q9?E5t6#*H*r#nR<3te zcAY%1c%MbC2YT21?MALfi{yDPs8^iZnXTDnAK6Q^wQJ>~byf$TE6Bx!8B^ zM*p}v1tM0FRu2zSooeOBs?9Be!ZMtDZ z|D*vqcbr`tf3(uBCtjEdkA8bbG10G4$9oH#9jY^|-1cVC#Y>Jl@xcFM`McLjxei~@ z>i&rOr2qFXf7m+lmto72x)1P*)bt-U`q$x=U!F@TnlGz-*6`yaPw8_TdgU6BHTv_C z*Vk?@f73`|@c5XR$M|ISz7b(9=SBo94Vdxin$PXW)!r0tQ$D58$^Av{^xoNgdQ_VU zk=GB0J{qkY;aRD}&A4K})SNnVMYU;i|0l6qY7O^V{#)mVo^$FQ7}4uay^2}K`z!B- zZJF_@(^k8jgZ#F~KCJ)qkc#`W=Y1K}UUux#)ph$XH||(inOZEd%hO}4m$Yje=VSltrt{klU0JrG zf^%rLsxGZZUOl_qchS~!MS>zKOdrti!_g`8WX8uw2Shk{4ZB>Z(C`Lt5A=UOevSNo zbV5q2l+6amY_TJE^l*B;YVg&pIcEIkF}|nkn`$nRBTC)aVw_Xy_Kb0t>PJ*x*rssF z=HqV9ZDqRSu(e~Mox6P_SC)P>J?F;Ko(;RadX!vz#?%ML{o+D?ZxMT}-qdM^CLbS0 zt|{ep=~kn9e(rM)d@#J;@^EGa|Ik57zr!&fw)XUzxWC)`X7w+sM{XWFrgc!2H#I7j zD0u7WPtK2zIX|oJ`|H#$E!O-nY*Vh4mpVHI$d~S_+vC#e^K0=?+%DyqQtHc9yLv1s zzUh3I+2wMbKeF$HPyDu}p{myXmtAOTT<$+_S?iRGdn-JunD<=k?azk?hnDOAu53g3 z-MuqY!Y@quu-`XWHXyM0fY|w|!_L>K<6$~??@f(WV@H%})Ydp5yo14gvw7sYllNaQ zELk~gzSsIYZUr_JTCcelxnQj0^!(G@W(*p5CZeX(_QIu~cDp^%xG?s>tUlBF-^}(f z&h3cTInRThEt3mAdTZ)E^`3TRT-OpO{SKbUxpm-%f%|ox7uElx@rrsutK$#6`6J(! z+x7SOcUfR}%(dA?-?f$3x0ru9W>cO$(VGXC*%4GLqD4pUIr`qvXZ@tC+D=VhpB|Z`&~DYKJ4tyKPmg*2L*$u^%e3oBzWb^#IMz4#@TMM1vbXqcM}eTgutS@l zd#^hB=Yd`o+vhHOxoPSP<%?mny4=t;SkfV(<= z>8Jd|Rk5RP-rqpK+^Eo)?C5@!^BIZRzFp;`9ZzYnc*n zrZ*hzTz=$&sXPBvti0rIuG>7a{HfFxj$L*8R+O7stL--D*2zuR&pdOn=*xjAZ-4OV z5uIz$jI-C4yZCK#9$Cdf}>FbWlzUNfE%lEskS>Jg0*oHN86(}?9_Od^JO{_W6Q?@7m z$;6O6{*kv&cYm3Mu{!S~4@TW!K0#*G{?nmhZPO@6LxSHs@U* zb$vupkDh&}9&G=}dG*^lsqNge>gq54bm`rg*yeMKwk@By^3cwLc2!-^ms>P_=g>3V z0{S#~QU3RJjc%tFJ2$4)>nEQ&Yx+-lIqh(l%T67tCK~4-A92%nQAy7su~|(y9p-O0 zJgrdn)-cnBcEQU650-SQQ}6nRRcki43C};U|H)Cgf9rns(zXwN>vFih?OS(xbhb%P z=04K(_ZYl;+_vTq3YRO^q(sn>BO9*Hk8Z5h2LF*Pzp+4;T(I)Q3G4TiXg@P#gKw3Q zQ};H{x-#T@1`JTI~?9A)c zu+fdjr_YV>E849=kM%D~AIQDz&Z=QG$J!^1ZB+J70q-FbZl6n%C+_&;)t-dU5g`Ra z+E;&j?Z}cj@wKzH?eO#9dhf3HJLDGpaLu9}U8Bc(pUPUyBmZE-+)wzFmhS{T4rwx31D( z`*A{vMU&+lj@No6bI2YsF?MHe?UV+?l0Q972&#JM&ebm3>)STp3ods(5U-(j^Y$2c zvi;j(m5)R}on8BE$qhgI1?Mw%+o8Gn;@mOMMg?w~&LsrBEhk9(e<~lpR>1Y(YLV|rq*i|=-l?vldiJ{_doT@dtATT4uv0v z{@gv=&+R@8-uvFQy4&gLOCo+)uxG^c${{zp?zvsMcSvG`izUWxExw_^nNf|GuO7CLEel}+8gJb@P<1%|^vjfhPDt9+OrSz#T=Fdng zPjNH5;hZw;pn(lr%&92~lZK^tHrvT9`G27NKf9Xk?I?eDvlq+X+58#jmfO3UlaWs5 z>T3RE=VDH^cgNN&l)szVE(Q6gx|*FS|4*)F2V75Ts=}O)T88*F-yucQeaf-OTud6K2^{H?yOin>p20VH(QIpGxI-Gk>7` zKf9alQ!M4r$;*#>C`Y;8)BSUEH-Ab&`9CR4jaYhx+3vNa{4R8Tj_zg$+z%@MZI-{n z{Q0%LiO&C$mEX;bO>s=AGKJ}YP5E8TDY$O2{@;k@w{thU;@-$U@cMT*m0;;n|DUP+ zuI7)pFJk?_VELo|aqr|G-OTP(elJ(EBjTohRG1QZ`C0wDnm zcQrf773S2Z3e!fL@+-_KxNoffQ6JR)uoX~x`$xUJqx_vw|EZSx|C6Oh{ePnJE6g9E z8?63Qss0t_Tr7Xo|0lFRH#al>G>lo6PhoaMdrWmxn5OXZv-($%W`X74?v=|L&$DEd7`D{~62Qs{bDpW;eS2w^sfCpfJVp z@=Nvqv*rG0)*}nLf7Z0FgrjWsQhH4oQzY)uC z=WJsAzo7qRSb9PKp%>};?+PnOp$gB`v1vN z{v5pgRR0dnCf5JIhyH)E=zm?79{ryi)xWdJ(*HyMp^sGln=F6ye{R(N73Sxx{LueY zOZj)&l;6o@v480Qt@`iD^0(T*&(5ZIWPe=J^dEnC&1!!fss5cz%>GgTZ`J=iEPu2= z=&syDVa8wLG0Sc{nHdHGrWJDDu@FJ1qi@bZ)XJ2{(J|Nqje|4s^17na_^ zTK~=_*8dCo|B&UMUjMIH`JGHo=nv5UB zcBA(DCf)vPdHJRK&+Nae=^OUnz8Fgn{r^DqpV9v3=lA~u?*ChNvxl7PKkolqg=x7> z`CW|DSF3-^TvGb2sCU(3)j0VE@s^Q{O2}BYF8*{lorK z{$&3@Qu}u`WorN3VgJzwk^K*3>3RLTn$zq*`a^2}cWmn4-Tac3ANK#VrTrhVDZkYI zyPMyLc6YW*8VHZ?_oD& z&(rOH2bP}KzryT7^&{y214;eAV&zZMe>;o*^6{_K{=1lL$N#YZ=*va>Z_&Rm>%Xo2 zcQLuq_%Ca^{qM=kFV%l$|6NTP>_2o|wEq=Zdepx&)j#Y%*&o6F7v%L1+au5EVoD$X z!~W+~n0{gDdHG@gVK>tC-^FA*{)hdi@(cF=8cQ$O|4+91Z)5-8yOugXk2ae6 zUSXQZ%g^c`_Mh@k8~?eQGT48VQI>`3-=hDmSbARnu>W*@j_KpSdp7m&VzP|?-OWy) zEbae{P5Gtv-^FA*{?BOte`o0h{r{T%cX2VX@&9A1{dZBAOuYPD|C#+q|L17Y|IF<_ z`aegD{x@XlVgEg-{<-~!{{wqW`hSa+ANJpa^xwslHvYHT|2;P4?3vj1KzJ?xJY z^3TNn=VkfB{yV|`ymT?K@&A3R{=Zb1=JWD@LH{$g|F6>Rzlx>j^)I#mZkU;%@fWxM zE+)(PKTZD~2iufis{h~X|0~Q-$$rrI?+gBaG%vqY|C#+)n7t@HY|5AX|NJaH?tiBK zznjU%|9>O#|KBJ~OKr;k_x=BiEWKd=|BCTkjrKY->()|Co7XMG`{~xj`ztsM_nQiqS{y+RK(f=>W(hK@; zWB(QA7rg#O|36#0{qN1o&+1>W|IGhan6vZpv++Otf1F43|Esg~=>OkQ`QiW5_$$r- zcQd8=|L@TMW89Ud|K$I_P?$E`lpp>-#!cz|zrviA<MyIcML0`UJoV*Kf@Fiqp-XY~*NpYl)Z{}txPy!KeGNGvyxvM|7T+V$-hjS|8qALW$C|U{}twEbp2faKal;$^$Y&L zo|hl-X#O#6{*T#zg*h89Kh;0RK2ra`0!t75&(!~SGuin6*(LTryTY`_ru?w~7&m^^ z{!{q{`+t?C7wo^oSL}Z>*?;msVE-{6K>q)DUVd)>DSz_+lP&uHh?k$~zu^BTTlBvr zOV8_H@c%I$CjGbd{{{Q+V6p$FY|8)l?SEO8UeN!q*?(uN{eP71{}1HlXY~*LxAFfK z<{Z5IO#d_b|MgjV^nVJ`{&WA|&6MWAqLyKKrYwf_pUC(EDfe@6d5D@%{|m#P2n zX0q}BpIhz!U90_nt}xBz<MpZovEY|1aS|M36C@{|9Mc{kDimuBe&{kO6InfU*( z(Xt%r_P-x5KdXPi{(s5;hi@nP|Fv0q*#GyW|M36G|4Q@!-Arlz|9h+d&&r?f|8KV` zzf}J-@&74*!T!6k^xXbS{eL%;jsKqo{y(l!cGIf=Srn#Oy!@>GrSpH8`2Q%I=>K3RLb|EKy9?0*LTpOrst{BK{`rur_0?EhnhX}wMPG5$k8{#E-=`$itznjU%|9@q*{|~MD|4Lz6$kLqH`p@kD_pbj-{QpeW|Cg}*`TXDC_y50l{eKuQKdb-0zy9Bt zrAPaJL+zj2f4=@N`2TM*_x}&tlwWH9Gx7ib;r0Jsy!>4M|K|FCHI^Rzf2QmIg8xtJ z|Co2N@&BJGOq*=VkNzLy$aMezKUn|A+GzUvzr_FN>;L)D|6@Ih*8ivS^7H~Q+{{~uWYr}+!P|JU*IOZA`Ge|K|+ z`G3j!zYk0Q7ybWiSpWYljQ_JKOsj3mpUL{aSbkjlcd!4m{L|O}$MN#B`WM#!-;w=u zH)ojt=j;FPEaU%RmY&zY;QwPjETjLA^?z&reEt8VP5GtvAM5{O`TvRaf2?ha>;FIS z@^k&S@&Db;na}^Hum9I$>CykWi}pVg|KFYZKdk?=@~5x=|7ufysr`31f5ZNNWBp&^ z|I_+E=5}Ovto9%4|8scxGqwNj=1lFsu>RkbrRVjZ!TwA9e}(xKD}UPf-@!6|4Mx&8l=|LT2_|6gWP|9{{A|K9cg5xo4Y{ssS^umAJ%v-LmW`G4#Be^ZOa>1S^j+e?_2Bt8R!2qUH>m=)qkx2Pv_-FK606K{vYfA zy!>BS|8LLIbN&CT>;Gxvf4rUaHUB>o`%mlNe`o!lt{-ieJ^z!*`hPqxzf}L3{m1%0 zFF)0PChPycEd5{f|8q#}e-4Fdtxfs=`|JM`c==iV!~f^&|L?8q|GfN6|AqDc_ZI&@ zgr(>8FZlmh56kHPXI%e3ZBzcgZ~x1(^uqZ6YxDn^tp5+<<>&fu;DZ{ zdf5LgqW#ar|Id=S{oid<{*3zX$@1s={|~MI-?QpJ*8k`6^0WHSsQ*uR`M;FcZ@=M46|Ni=aEHA%Q|NoNzuP~Ko>Hp&Tzo%sV-&0{)X;c18{C}JJ z&-nh|WtRRwU;iJ&%g^dxSpRqV#`-_rL80~kAeNrjKezu_|97$I|F_ovkK2@AYX7C{ z{~4eEEzQyk`u{EeU$Xw+pO>HO|5yEg>+?VK{-5>v|2ix^>_1!o=j(s``TuXP|L?FV zzf}LF{=ZfK1^?fTrT?4j|F^9AkM;kbc=J zrTU+V{ipSB!Tx{m`hNm1zf}MKqW@oorAPgvy?=B4|B1x@KT()A*pwgZKUl~8uJwPX zzp(zF7wbPxmi7P1y!@>GvHnl_r>*~dd;LF*rRVkkSN(si|2tX6zvpbq|M%_x_pbjB z;pON0|2NnF16X?4|5u{@hyO2K|9_Ra{oij>{*3zn4gdc?SpTQ>C#(Kr{eKZJ{}=TC zTmHYArRVjZLI1z$|KGws1lULbpZ|UT?>_vm9sExZ{?`xuuOIkdKk$E3KR~tppMFyR zT%Pww z$i9$OMx(}%pw;V?Q7Ub$MqNv3#BO9dwaSnbo}h||)r7}tbjmt)mA-wdM@6Nle~$F7 z!ujq&rhTvY`EN+%laMKY+UJV)yrTWDXfG_<7mN1CqI1!{ShOb=E}QLrMSEyv2eb!T zeoz<`1LZ(vP#gGzP!I`>U@%w+_JLc#4*BwHI)~rv4`1LoedPGq;bV`F13t9P7aiyE z44@8z772GfLz{iQG#f_mRj+61ks5?k|x;asA@`Az8dXT_Kkj z%11J_5q^JrK^E^9$&G~YevqpR@@&Y|u6TNqscmt24&+)Anc5EzpDQ`vTF7Gl`ytaF zY&`xh$V$i=bxxm{5TBUf163_}(jte)>y28bo8^?1g!44Vc}QRURO*hg+K8qa zm0Dv6)EN__qO_4(jV>WjhqDFhdZ}WyYQI>0WRI|#2pyZe(o;{0W4W(@e8UQZ)S&yBz zruBy$0C-yJ@9BfCgSAD$G01N+pnl(=>6xfCXpBmgQmu`oMur|=t%;&@DAPBjB*UOF81#m%NKd-*l_<58 z2)}}O)Q1E;@ML{5{h<-k39;NwAUDzIsF}nWqiw^QA}m;=Q5yr&t|}mHd(1|3CARSc z5#L`Q7muPCt-;JDlP#iq+#HaN=5mnr*r3&xx^4lP>N*%uT^D`pDbwQn5-Nuc<)bx*YvSS)l1i81@n@iHWMjGf9_fn<@+ZjDZh1HvZ6AqD?VN|(Bb@GyC|8uo z)Fya%dz@dCqaag1$-{M!#d}CH-9sKuc1jEItnA}dz&t*ELJ z6;-)%1@zAbXjTPdf|{wMR$n19(O}dYpp#eDddjFhJ_3~2e|qjny+OlH9;b<`5T{Ct z(1a)Iv^p*6eT`o{WnnmXDJTQ&4_dm6Ox6>t`lWa=-(@U{}U9przoAB{*#(C7^?spv|p_*7uNdK=*>$ z5A|VOraqkH|I$4%s^a2f>7Ml8V7VtH(Ld0A;c_X7Tv{TRk;vsC(^!_L&kLFS9WFbf zf1+@)ZFGX%*~D<@&`Hw!eU_Pso^SN?{(-8S+{7Q4%CPdIvYSJLxP)- zU3J*($$VcAd{dqOyX8Pv6r~~aBWr;CF#M7oLEECX%jKhxvkUTU7z(<-ek`RD{TLhu z411K_SnXI2*Q%w{^zNqA_tF@mV)ea^Fc2^ZY3EF~+Mj>7Z0wGsX#Z|5tg}Qe<}IEw zOo_;b;eOHhgUe$eQ-8$evnV@_HE1BK*6N}~UG0M7jo^|=k9Wm!FgYGodjPjRVw@bY$cFsr^chQ+dVwsr|6Ayf(5i z9K%Ed5{lt52hqy`rQ!T^LUY2$j z@mnmT9&)2Ts>lS%ak7=c81aXw5@O(tTFN4c(-U$VT@RhUw~k$MsHLXDF@Or!^odbn zJf-a=xu;YoajHJytR05;)~XX?*!9qLQeDzGB|SVwqm7P9AQ^s#K9a%!-Dip~y=Lmm zSiRGfK~Rk#RgKos5rnEnP{nFNs*2U{oBhx7vvQ@z6o{{eh=6bkrXv-DDg~)3;TNH* z6jUWhRRzBYRTaNzLk*y+AuC|jp(ymD_>avG(l?a@Y9tHMMK_DrL^sh!wbMj|gy`bJ zv{6xE(W(Ho(JwAOFjC)CZD<*<(KYI0z#KqClqOc)u$MNfm0pX{E1W8$t;`##n8nrUEle)R!*8d1+iteQ70pOUJkWV2>1sp?%+QeIJw%Bev>371?mj>X=s` zX8;$JW2a?YG7~q`5!WNiG#=-2QCu(e{amgCnQRc3>q4$7k*SUF@XiQV3UW6|`gM?L zT$XWM9D%-!hQ_5!S4^yoL2?~3EM=75N)pTP^OLVj_LR%_Ak)3&@&m|ZtGG;ap#0wR zV^wjih!CeSWSZya;fauGY{lgzkjW?E@(Rd#1)1gvD@tUzRcY}@AiT67kCmh!3E5i+ zCs{oIM94Hx$@8BoiT`6JGWn4_{$YfZz2WjJ$mB0``L#rLg|d|r!rdT?>E9#1cz+&1 z&LPBq2w9AO2{O&6@%)rHUjaeBEIFSy!bxX%d>@HiK_dG~Hx_hLVS|N`e`eP-wv`^|0I)d&96TKGL7pzy|T$%oL!yV9Nirh_F3#axa>>8`FSq>b|MFld?`!|^%D?YlKKb|k%P;@F ze+A^<^RJ+sw+98<1L-XP(Aph+X#Gz7&|2QtKD5sFJ)dv{n%w`*2P0GY3GYYdT|W&0y6p3{QM-7-<9$FY$hXI zjkR#4$~sF%ZctFi@PI)7u<+2pj*W!#T>C5M!4m`Gc=YNw(!kH6hYVT-28Xw380OzJ zJg8By57smFSRCTlf5mzZE|a&J7r2hZG^rD0TuxNl?KdL&{+O!a|Ff&tUAZh zw1uq33Cns4J+DCHD=yc??;_w|zb34n(=!Kr-r_i}Cm#8d|EmOC9wN6qizUhwhs!Rw zk5oTg{s}VGHC1n?TrQtuc*Qv}CBd9V`1g2#Yd^PfOxa0S!>J3xQ%5#Ub9%)k%q1x3LE5CLui zYW6>Z*5Ef#39JJK@DjLzQJ@((3d(|?L3i*FklM}!9l<3~3v2^@K?)$%83r1IgP z0;0fOKx#S_v<1I|YG4!S1>OR3O~-*?a1!`{)j$WH0_q0lfUe*gs0V%pKY-5wEf0@j zS|0t`gYP0>K2U)_fftwvT7fg5BKQUL1TO$}Ya>A*I0DLmC`C&>S2C<-iKi13UuM z?aTt5z-3SyYzO_o2Y{YfHXJkohd?Q?6hwo2fZUF0pdI)FR0o?uZ}1M#G{kt&5}X1R zz#5-heD%ENB5v0B^7g#DOQEAearhfUBS`*a-%JPrx1w2L50lC0Oatw}AD}we40?liAS)OTT7pxc0$2m|;29_k=7Ml=9n=TAz(9~{G5ZY$ z;kyCY4U}LW=mu^8PcQ+5fYZPitOfDlIdB0ZKvQrSlm^Q{47d;Sfa#z;xBzN^Euarb z1`c2d2mt#*aj*!e!EKNOOa@`#9H;^|fCTUwD8LvH1dfC9U?qqJk3j+O6X*=CfI46Y z=np;uJ75NWU@s^N7JvwF6J!HFg4W2 z)B@W;UyuTvz%bAl90Vo75)cLMf?QxKXbXM^)xaju3%ms$U>pbrCxH)G4RqisC2gg7; zumbb|k3fDf3v>dPL2a-d^aCG&GZ+qcpgPzLdV_Z$D;N)2 zf>WRZSOfIn87K_qf^cvh)Car3K#*z~^6wsm?*?EuP=a}&8@K^H!2}QjP6J=C7Q}<+ zzy*u|O~GMM8Y}}b;6BI$ri1q20;mDDfIc7@IDjD_0PF|F!6Kjrw?Pgt8H9mzpbFRk z62NPq0AoN9I1b8#l^_;81_i)Rpfk7v>VO@fKlljjfEoCKy`U&q03yImkPZ9@T7%y} zC9n<{z)Ro;MuBGFC@2el2Hn9!kPplR9l<3~3v2^@K?-mJ!$4zj5R?QQ0{Ou#&R>bI4c>vQU_59EPJs$w4bX#UpfH#V!ohV=AM64HK`Ng= z_{GlRsB)R!{X#*~<`<4bE-1+KE|^k~Qz2&&8H$jW zKgnWvh$Nh3F}#%|oMbV)DdgP3`RhRzueTxOY(jVk$i*bGhah)Ccu|Qg=GPhFVtGgw z!^0)%NfyJqNz#)nhN~puB#Ytnu2>=A`bc&anB+Z?;{B(nZo&puSw8)1g$~P zIs=7S-urZdlk0-``1`lGs;rn&$d0?8AFgRJw6e-@iT&YTN5Z8Z4A*-f+-^I1X_Wrq z^X2zHvt;?McS{GsVYJT2<-^s&Fr>9NEo5{wX>xbS=y+}9e1fb;I68*3@OVjllEwIm zPL_!dp8s*kEs*}dHXmty1uy++Sxk`K^kkDVN?ZrkEtg@?P+zt(jQD@=TI2L;n#^^% z<;f;B4kK^so6zQD4*2HxFc9~+v>>Y>qccnk?*zGsAoqh@Oppga&MU}+A(w%S$0&pK zp=?f>p2NgLlz1e#t;Rr)ZidiW%0Kn69p1R2a(dnNWRrO*&X&nHRYC&2;iOE^<6X91 zcq~pCk)&jApV+?Z(h%3$5-0%O7e7G9#^8L^w*5f>px-b8GRqs$blTnqyw!*|w)C+$ zH+u^DFwzu29O@(g)8Yy51X*hk6UI1iAkOKH_Fnv-Iky(CDzKL)g6?>-Nw^|%%cL8Z zOF_pAWHtf;tz3f7vwV7-p2C?wgT zjO%7`S~aZ;8a1)jSBJhk`^XrTp+cM{Ax5ue?V;U0PZ`zM8ML*`ufdq0iB}fEy61Q2 zO>YHPP^ne%_%`BgI8A(bL=r0GEUuvguAvB^K9%aj1yFq?fk?~ClHFQsjES)cwQ42m zdK*;nrOV(=1H3(nR}j$obW`F@=R}Q7yP^J%y`rg8#aiBAt%Y|hkvUpjq7KVnxEa{p z0Pkq1HMNvjptb+xG?CUy-hp!l;X00>pCVlj*6TE4dxL{x)BZ5vwUPTn z{s-+HTW7O*Ke(?}PddTh)jf#(@&dG1Ln8W9{;scOxe)z>^_^ZgwQLfe_rv>O2dE$5 za%+@Vlsj7cX@7c8ke(|~0Ek~0P(72L!`YDGWy1t5Dx8kfF#=AQEZ(5)g(X6IbH>mM zuLi54@FGQg(m!}>@KO&RrLKr)seM_0fmh_?^g6mX(GNY@LR$k|2aWH8@gk2(i5K&Y zT53M@uAtID?<1jI#cTU$&`q-E@vk6VDa7aL={ac{FZZT5)Rk(ON%q2Ic_r`nl*(wF zT2|nZCmRPD^KiEe`Soyh?grhI&`3DzZx~dgAk9d3(iWK-VBn+WTWX= z0^*wRZ3ctE5I}a$^1cJQI=p_|ClW7Tyt^L!~hrjyl+Xq+DOM@*zU=y%u z2pWpz1s1&PL{;pAbjOjNY|2f1lRiJhwnz_Wb;Gcd*Qr0JJ}IQH4#?2w?aM(Nkh;}7ET*;~7o%fdw^^rj}plBjU&({nPSEIjR6q@{7M<&9r!T2+EF zPLJnW^w{J1>gJqI)hqU)m<;!rW{JzGHuiZLxH<|E7V)RXm@b?{AP^TRjw z2c&-*ojx%-Mj5Y))nMdD-MT@mG4iu0Wt|bX7~*mr;%V_35mj_rLeeXGu@F^Zd8G?! zrXy_;eDn6n-YBbp7oYLQ8+wHZEm|suwRG+DOpC@)OIcw*(vZD*X1&HRgGy(_LqsTR zlC{pGsEbgd4Ow3bq#jTyduD07{Q7vFcs2+fj7F)C#})}JH#`)8xO5MtaoP1LEvHi> z4(Y5kPWt(jvJqd1gU*c9EMAH9D-nlUq4YfQF-b=1pRFAodz=R^nxogkgAYhU_f49{ z*t&@yx+{9=i*7xcWE~}Ncy7@N9^d*76y0OCmjm5n%TPrrtAe;R)|AG@sFYNJN0W6! zJnD0#@zS?yNQ){Pfw*Mrc-+v$2JXKELHlot@52j}`1 z4HD~NF@j2aawqdXhYSR1mQ_Pomr0Gz(!A9#JlVq`Z7}|^zK6=jKr9*>bV8%{3A~q> zhq$Ce%{58Ap`=Q-g#>kSv9Mpb=?O6yd{wW>3?TIj#}S|U)nL6+mk4LUsG+Cm5-4w* z6MsZJCF1e6&g&aGm_S=((6!)nvf?i-eOXJ(E5B6!^o9ZDLI9S$m zK>jF~b3mr?5tmOvrf~+B|Ab67oy#OHS zH@OIV6B(!b3Hmf1?)?0midr%k!i8WEz`s zncg`hpPS2OtIS>kM$aOQ#eM3$^JH`H9kHQ`#l2viJh_~`$q8tWaI$+W-154wO@uxO zr+F%&&rKW0&~^&i1aHd#r&KAp)M|88c<hm9A8R zb#BaNAjNuR+N{AkL_^&BNJD-|2LFe=9*Y&hL>n5CN|#h1+47EVMSN#P8tQh@i>q`n zV>BEJ!Ey2>sPk0wcf{G1r)`)Pt!FzCu>RGu>k>2ODjF!tVvxQ%(&GlEM=)A^8s=W{ zU72Xw595_(h)+HSyT9yg7Awmu-~z(w{^EL2ZB%u5X&dLZM#cPL1SStH=SoK0;+e!v zy9Gkr;_ofxtb%V^dx76+(Dc&k6O9&^OoE!+MQvbSzU`2sd}O*?mMjCC>3L_5hY)A)NQ(DHh+I_FkcWN|Y-JGR=3A z&E(+~AyYpm%2a+XSCWL2EQVK+oUe`~KFMPIx{`2`#qfHPaFWIF29U+;Zz_pTvKT*5 z5>B!h-b@lsvKZc65>B!h-U70CJ#8fMNfzU`m4uTlhPRW1lPreQKCfbZkt~LHkc5*g zhIf>NlPrdJhAfsxEs0OE7+)g^Cs_=Sl7y2ihDS@nNfyInB;h2B;aW*J$zphSNjS-3 zINv9iw|A1o@Hoig{pb&w#!Ni^0LX!Y`~zfvK^_EI)W4CC$u{!zqaf2-AD2fzFm^^yCv!ONW%9@!uLtS_e;VLNWu?F!VgKp4@<(2 zNWzaw!jD51%SU?+i{<-6lKz4u{Y6RmB}w>YN%$2>_*F^xHA(n&N%##(_@9#So09Nb zlJMJ-@H>+5yOQwxkj4A+5VClG?BO%g_=4-3Gh`a?aGBn%p|Km6T_KD5o)0q3JMnOm zD@$bZxp;UMgwuSeD2vxa;WU=!;l(BKNfzUiEXJ=4S-k!#kj3k-3R%3qYLIFEj^`H! zS?rHUt||%l5@dgbi{%M`ERHuw_LjsKueSrj#p~?|S-jp(kZBywuaDLe#Q0q#GT)b( z$0xawke+1m`lBF=*H5z8zmqJcC%L(BK9Z?C^y>A$IIg2%Yd9aaVt6Mk%F_)&nry;(R^vDMMLc|s zL|!YAe}OFC$Cr?)o$~aL@SCoyi9wZQ#5}YHdr1XaCh*e^HH?jqQPCb#Ep?i(-ulM+ zL_;Im|0-0A4Y)MA5L%*3+gHrkCq6#WcFlDt&Yy&%G_PF~za6X$!#DO(!{)!*D6K}_ zLW7xS+HpFXE&hdA{jyMG7pZ9p*UM;K>j>8+#zklhY*EnSn)eCUM@1R225S9QYp{hX zMYH@+W3JpX{~xZ8XS4G7#&tM*u{Mz%-;TJJJot9PcOiVc;Jc*t+XvrNx7DrR4e;#- zxtTS5IDSK286)sr7{DAbM&es6^C-xTY0F}NJ(gJXu?@KcZk2J(;T9j4e$h^_Mw|5Q zkRFo@;cRk&O)7-5m0vMW>NiB0>=1iqh;A_3pG~X7PSG~!9gR4Fv;t_^c`y|2CtpRi ziAQybUD*;@fChrKGuQA(J+V+~p zTCNF|f-9F?!#K#6`J+bGWn9Y{EN8bp&v?Z3H$?KC^&$5rQ=wO!6D?*cSby z;{l2B*jx>>7A#>yEY7#2?Rc$A7NIfN$uPvS_J>6)>#x?9{mj+YtM;cUEI(~R04>~! zbxPw97D#)@W4rn=gU%?1Q@?CI2TyKOFKyDp*=fSCkY|k_U{Twa@jN{(sijG6(4klZ zLJiRotr5nS!~)rhn05J!nhedHVv-9z44%`m9&gN6x@-ta=7dbv83J)5VYO@zg=lFhelpP1G%>5jn6@*Nv(<4-_*$=Z>%MAlUz(nM?J2V)T^ zl&=8=vUj{uDAp2D+byGLv&OWthSGYD^;8*dLB``KQ?xZ3AvPVQIZ3v;dbgHr+iL0a zLdtIR3=V%@h_AI{MN*rP#HLKyIxUu6<7lZEOOWV|(c9w>qUf;eI~_1+qOkL|?Gbe5 zF|_P03`lfXMb{g8h=+ues3O>AoHXrbJ*rWw)M_?oj_Gn_z$G^I*$dlV(ySUksT!L_ zMi}%xuu31VjfYiZm(M3HHGQzPgfV^XxVJtr7OP(LXCTFs#faVWm@*E~Oo2 zH-fGA(cbjldR=Ui5_4)AV-gMdqvv*qhGZvUbCKH6l&JUx9z%(%O zrmY<9NXwKe zpnUoDPs4B6W{mZ8>X0iKIr7<^+v+104jKU~Bos-72q$4!;pkow={2V$j<# zQ2F>bh4VU~`$6UB_nXd3_ma{P{Qgonou9%f4at-z-7g-O-$U|`=ywA8lKx-}m9VN8phS_YV{Y zzMwv64T6wY7kqaIiJ&haAC90h^N&4#5L7Pm)#x|%byP0#H&5$~<43l8%8r4P;5YCG zxCE|&Ti^kB26+0+zUi0pbJm|HHZe?K^%w&y}>{*81N6B zi#}8?`jEY$JUF~hr*Ps+$0;3sGCLm~$2(E>4pQtLaEuPxIXJl}JhOOY#TKpEbL57j z$J;OIDzz_acjW(3+a#{Id&wSwPrwWMSQu0T!9WeDy-}N{l9Jt`x}!GA&qKOT=b>}* z{)YECq!%$OJY|Vs7?=t+fL-7ixCv4~&Xsu15cq?(AO`dW!vVD)g6fItjmkhW-Jfnw zUJNb1V}a2soA6EHlt10)Jb1qQK90Qv_|O#KE?Hw&JkFs`jKq|NT!Ej|k!sZ55lMDg z@a&a0jp8w+)+IRM`RQstzMgatPZy}8H9Bwl+f#JBvX8Hw1J#&QLAMQH(gcsKk>WpzP2A~=jCnn0=ahM;&5o>%SN>l-jMJ~%i z52EVS-gw{y!wEW)o1Gue1tf&qgt<@#b`JFVoy^f*?w(zmSZ*hCc9%D>ldFvK2+F~m z<)G-U*Xpe2H&O<<(lZc)*!dl-=XbPo&xWFk;c^F=vzL8*zj*rwawk02V9@q)kU2P& zVwt$&50_!C3D1C14%yRlNIUMLz~wvHv$qGG9o@6aW$9_;c$+YXUHpIsb`CUDc5=k? z)p4p`GAFwGIG;mAY@&gFc%+}04zY8(SkCF{?CxfbDR+@M`^XzOT23bKlO#_{QsB?9 zMQakg*|b(t7OP~L-%3i)2xH@TNk(*tW#neb$lZlyM2F>W?2gMV8R0C}n}L1eEz^CH zn~`>$oljvoUlvz(Gt$E33Yk+0R%{mohA#=4n!a?JZ0SYkhuK*?EN98;>h2+zrKONV On|!{c2l7ny;Qs+6~{n)IX`$qKfm7Q`ZYyw0W4DqP~E zLX+mrTaRrsZHE#{fLICy2s%QreKD0ts}v0~r4dsN7@$DV2mvBSi5iblbKW=7^ZVax z?dKyOO_TFo)y*}>yUia6!*V@s|xBY4>ilcb?lXD{O<0y*ae~*is;?2=b zmCgDW-IVe--h5M1{*7*mqMNFg8FHhWGG8=SLH`~%HD888WZ%W55fZE>dxcU|e`mOK ztL2%h?xdP5vYb}mqb1bKgvdI6*G?qn z=DYY8rN5Ky%qnq}pIVLob^g@jdRC7cQI=(ZhKt?lK8~}jmQf~)`OUH+ersvH#;cXA zUeB71v{p;wIE}Lgb=BiI$!hhiK{5U%Q5p}&Eh?zjscNKFYgE!G8%b;RMl_n`b85** zt={*a$G-n*Ep3dXBNvU0r4g^CS(>CHDg8_5&Kasz(=<(LB-V5@#BZ85l14Ib{(_;Q zv=+yW#=JDG)H1UDzk038K%<2Ws-84R%ao_zdNsW`uGi{m)`;R71E+svHX13T&l*V_ zs}cSswWy|)T0Fw|VoF-F|7*AU;~#+%EsRvFQ5IGCsZrMmFyOjqe0)4zyg170mk3Uc ztj;SD1K=OPPHH27t3EO^RIiQHRf1faqF7Y1LjF&$+1{OUsEAJTFKSe>l!if2R;!I< zBUDmvWf|yBsF9-jrC^2sQ8bd+za>kOrAxqLd~5t}eky4kT~xg|-5k5AsoAKxIdX6P z*j~GC)3x@IWUTtDulvDZ`^qE#@GFCS46wxVS9hW>u$c~ zmN))V^qy>fufBms?-=Q2Sl#^z*2o=wUFo%U$3?yOy3O7(^qSYa_U4T@zlPzbaq~5= zdHw5dzV$V~c=K(qOOwV&k~ng4^Ih?$;y;Z)6Hk6M{Yv_!^l0*D@gK)WoIa6$GCh?3Y5HgB_Vm5!Wk2+y6^p0S`R_>H zmHtco$@ov=H)WrXzZgFq|5N;>_{;HE;^Xn3$Nv@|NZyo8CtH#?Cm&9}nf_7w@%R(* z*5nW4_oZ)5-j>{-ye0Wi@?bih?M%LtzB_$S`nB|P@ju7kO5UITb@KV-Q1YhqzVzwj zZ<5a?N0Nid+mqi)zLb15`K#nB$*0r5OlFcVBwtIuo*Yj8BKd6cI&Ey-&vGnWd z;q)8niTE$m&!tbNPo?|PPoxLaZP~Zdw`cFj{yg22em?y|dLaFabT<8Bx4wl%vydu#TVY)dw@|DM)PxJdIAalHA`DgH$+U)QNDv)iKL>XR-i;vy;1BFpbl zeo>i7hTBa65X zg(nq?*Qu6>mf}gOy|6A#|9{%0A7WhUpGIXJ4PB=5>hh?DB|zP$UPa9}$33WCv96N_ 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 P+1}sM19?Vz;Pd|gxf{9F diff --git a/homestar-wasm/tests/execute_wasm.rs b/homestar-wasm/tests/execute_wasm.rs index 3d3e8062..f387fc06 100644 --- a/homestar-wasm/tests/execute_wasm.rs +++ b/homestar-wasm/tests/execute_wasm.rs @@ -35,8 +35,6 @@ async fn test_wasm_exceeds_max_memory() { } else { panic!("Expected WasmRuntimeError") } - - //assert() } #[tokio::test] From 083b7437aef7352d66ca080949cee9da478b89fc Mon Sep 17 00:00:00 2001 From: Zeeshan Lakhani Date: Thu, 2 Nov 2023 22:15:54 -0400 Subject: [PATCH 04/24] chore: return of the retry --- homestar-runtime/src/tasks/fetch.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/homestar-runtime/src/tasks/fetch.rs b/homestar-runtime/src/tasks/fetch.rs index 54ce2e90..6b1deecc 100644 --- a/homestar-runtime/src/tasks/fetch.rs +++ b/homestar-runtime/src/tasks/fetch.rs @@ -26,11 +26,16 @@ impl Fetch { ipfs: IpfsCli, ) -> Result>> { use futures::{stream::FuturesUnordered, TryStreamExt}; - let _settings = settings.as_ref(); + let settings = settings.as_ref(); let tasks = FuturesUnordered::new(); for rsc in resources.iter() { tracing::info!(rsc = rsc.to_string(), "Fetching resource"); - let task = Self::fetch(rsc.clone(), ipfs.clone()); + let task = tryhard::retry_fn(|| async { Self::fetch(rsc.clone(), ipfs.clone()).await }) + .with_config( + tryhard::RetryFutureConfig::new(settings.retries) + .exponential_backoff(settings.retry_initial_delay) + .max_delay(settings.retry_max_delay), + ); tasks.push(task); } From b979a2de2dd04851bb2e40dc20bac3ba53e17189 Mon Sep 17 00:00:00 2001 From: Zeeshan Lakhani Date: Fri, 3 Nov 2023 10:07:38 -0400 Subject: [PATCH 05/24] chore: test setup --- homestar-runtime/tests/cli.rs | 26 -------------------------- homestar-runtime/tests/webserver.rs | 8 ++++---- 2 files changed, 4 insertions(+), 30 deletions(-) diff --git a/homestar-runtime/tests/cli.rs b/homestar-runtime/tests/cli.rs index 69aa7c80..4f5581e6 100644 --- a/homestar-runtime/tests/cli.rs +++ b/homestar-runtime/tests/cli.rs @@ -1,7 +1,5 @@ #[cfg(not(windows))] use crate::utils::kill_homestar_daemon; -#[cfg(feature = "ipfs")] -use crate::utils::startup_ipfs; use crate::utils::{kill_homestar, stop_all_bins, BIN_NAME}; use anyhow::Result; use assert_cmd::prelude::*; @@ -22,9 +20,6 @@ static BIN: Lazy = Lazy::new(|| assert_cmd::cargo::cargo_bin(BIN_NAME)) fn test_help_serial() -> Result<()> { let _ = stop_all_bins(); - #[cfg(feature = "ipfs")] - let _ = startup_ipfs(); - Command::new(BIN.as_os_str()) .arg("help") .assert() @@ -57,9 +52,6 @@ fn test_help_serial() -> Result<()> { fn test_version_serial() -> Result<()> { let _ = stop_all_bins(); - #[cfg(feature = "ipfs")] - let _ = startup_ipfs(); - Command::new(BIN.as_os_str()) .arg("--version") .assert() @@ -80,9 +72,6 @@ fn test_version_serial() -> Result<()> { fn test_server_not_running_serial() -> Result<()> { let _ = stop_all_bins(); - #[cfg(feature = "ipfs")] - let _ = startup_ipfs(); - Command::new(BIN.as_os_str()) .arg("ping") .assert() @@ -123,9 +112,6 @@ fn test_server_not_running_serial() -> Result<()> { fn test_server_serial() -> Result<()> { let _ = stop_all_bins(); - #[cfg(feature = "ipfs")] - let _ = startup_ipfs(); - Command::new(BIN.as_os_str()) .arg("start") .arg("-db") @@ -191,9 +177,6 @@ fn test_server_serial() -> Result<()> { fn test_workflow_run_serial() -> Result<()> { let _ = stop_all_bins(); - #[cfg(feature = "ipfs")] - let _ = startup_ipfs(); - let mut homestar_proc = Command::new(BIN.as_os_str()) .arg("start") .arg("-c") @@ -263,9 +246,6 @@ fn test_workflow_run_serial() -> Result<()> { fn test_daemon_serial() -> Result<()> { let _ = stop_all_bins(); - #[cfg(feature = "ipfs")] - let _ = startup_ipfs(); - Command::new(BIN.as_os_str()) .arg("start") .arg("-c") @@ -308,9 +288,6 @@ fn test_daemon_serial() -> Result<()> { fn test_signal_kill_serial() -> Result<()> { let _ = stop_all_bins(); - #[cfg(feature = "ipfs")] - let _ = startup_ipfs(); - let homestar_proc = Command::new(BIN.as_os_str()) .arg("start") .arg("--db") @@ -351,9 +328,6 @@ fn test_signal_kill_serial() -> Result<()> { fn test_server_v4_serial() -> Result<()> { let _ = stop_all_bins(); - #[cfg(feature = "ipfs")] - let _ = startup_ipfs(); - let mut homestar_proc = Command::new(BIN.as_os_str()) .arg("start") .arg("-c") diff --git a/homestar-runtime/tests/webserver.rs b/homestar-runtime/tests/webserver.rs index 8bae4ba7..2becc51f 100644 --- a/homestar-runtime/tests/webserver.rs +++ b/homestar-runtime/tests/webserver.rs @@ -44,7 +44,7 @@ fn test_workflow_run_serial() -> Result<()> { "../examples/websocket-relay/example_test.wasm", ]; - fs::remove_file("homestar.db").unwrap(); + let _ = fs::remove_file("homestar_test_workflow_run_serial.db"); let _ipfs_add_img = Command::new(IPFS) .args(add_image_args) @@ -63,8 +63,8 @@ fn test_workflow_run_serial() -> Result<()> { .arg("-c") .arg("tests/fixtures/test_workflow2.toml") .arg("--db") - .arg("homestar.db") - //.stdout(Stdio::piped()) + .arg("homestar_test_workflow_run_serial.db") + .stdout(Stdio::piped()) .spawn() .unwrap(); @@ -103,7 +103,7 @@ fn test_workflow_run_serial() -> Result<()> { .await .unwrap(); - // we have 3 operations + // we have 3 operations0 sub.take(3) .for_each(|msg| async move { let json: serde_json::Value = serde_json::from_slice(&msg.unwrap()).unwrap(); From ad13842bbdc4ca0208226f6b5e9ca820a58bb7ba Mon Sep 17 00:00:00 2001 From: Zeeshan Lakhani Date: Mon, 6 Nov 2023 11:50:45 -0500 Subject: [PATCH 06/24] fix: subscription map, checks, multiple broadcasts --- homestar-runtime/src/event_handler.rs | 23 ++- homestar-runtime/src/event_handler/event.rs | 40 +++++- homestar-runtime/src/network/webserver.rs | 85 +++++++++-- .../src/network/webserver/notifier.rs | 82 +++++++++-- homestar-runtime/src/network/webserver/rpc.rs | 134 +++++++++++++++--- homestar-runtime/src/runner.rs | 18 ++- homestar-runtime/src/runner/response.rs | 5 +- homestar-runtime/src/workflow/info.rs | 27 +++- homestar-runtime/tests/utils.rs | 1 + homestar-runtime/tests/webserver.rs | 47 +++++- 10 files changed, 395 insertions(+), 67 deletions(-) diff --git a/homestar-runtime/src/event_handler.rs b/homestar-runtime/src/event_handler.rs index c8f13b88..fab391bd 100644 --- a/homestar-runtime/src/event_handler.rs +++ b/homestar-runtime/src/event_handler.rs @@ -1,7 +1,7 @@ //! [EventHandler] implementation for handling network events and messages. #[cfg(feature = "websocket-notify")] -use crate::network::webserver; +use crate::network::webserver::{self, notifier}; #[cfg(feature = "ipfs")] use crate::network::IpfsCli; use crate::{ @@ -58,7 +58,8 @@ pub(crate) struct EventHandler { request_response_senders: FnvHashMap, rendezvous_cookies: FnvHashMap, pubsub_enabled: bool, - ws_msg_sender: webserver::Notifier, + ws_evt_sender: webserver::Notifier, + ws_workflow_sender: webserver::Notifier, node_addresses: Vec, announce_addresses: Vec, external_address_limit: u32, @@ -104,7 +105,8 @@ where swarm: Swarm, db: DB, settings: &settings::Node, - ws_msg_sender: webserver::Notifier, + ws_evt_sender: webserver::Notifier, + ws_workflow_sender: webserver::Notifier, ) -> Self { let (sender, receiver) = Self::setup_channel(settings); Self { @@ -120,7 +122,8 @@ where connected_peers: FnvHashMap::default(), rendezvous_cookies: FnvHashMap::default(), pubsub_enabled: settings.network.enable_pubsub, - ws_msg_sender, + ws_evt_sender, + ws_workflow_sender, node_addresses: settings.network.node_addresses.clone(), announce_addresses: settings.network.announce_addresses.clone(), external_address_limit: settings.network.max_announce_addresses, @@ -163,8 +166,16 @@ where #[cfg(feature = "websocket-notify")] #[cfg_attr(docsrs, doc(cfg(feature = "websocket-notify")))] #[allow(dead_code)] - pub(crate) fn ws_sender(&self) -> webserver::Notifier { - self.ws_msg_sender.clone() + pub(crate) fn ws_workflow_sender(&self) -> webserver::Notifier { + self.ws_workflow_sender.clone() + } + + /// TODO + #[cfg(feature = "websocket-notify")] + #[cfg_attr(docsrs, doc(cfg(feature = "websocket-notify")))] + #[allow(dead_code)] + pub(crate) fn ws_evt_sender(&self) -> webserver::Notifier { + self.ws_evt_sender.clone() } /// Start [EventHandler] that matches on swarm and pubsub [events]. diff --git a/homestar-runtime/src/event_handler/event.rs b/homestar-runtime/src/event_handler/event.rs index 545aa047..24cb7de8 100644 --- a/homestar-runtime/src/event_handler/event.rs +++ b/homestar-runtime/src/event_handler/event.rs @@ -2,7 +2,7 @@ use super::EventHandler; #[cfg(feature = "websocket-notify")] -use crate::network::webserver::notifier::NotifyReceipt; +use crate::network::webserver::notifier::{Header, Message, NotifyReceipt, SubscriptionTyp}; #[cfg(feature = "ipfs")] use crate::network::IpfsCli; use crate::{ @@ -18,7 +18,13 @@ use anyhow::Result; use async_trait::async_trait; use homestar_core::workflow::Receipt as InvocationReceipt; #[cfg(feature = "websocket-notify")] -use homestar_core::{ipld::DagJson, workflow::Pointer}; +use homestar_core::{ + ipld::DagJson, + workflow::{ + receipt::metadata::{WORKFLOW_KEY, WORKFLOW_NAME_KEY}, + Pointer, + }, +}; use libipld::{Cid, Ipld}; use libp2p::{ kad::{record::Key, Quorum, Record}, @@ -201,7 +207,7 @@ impl Captured { #[cfg(feature = "websocket-notify")] { let invocation_notification = invocation_receipt.clone(); - let ws_tx = event_handler.ws_sender(); + let ws_tx = event_handler.ws_workflow_sender(); let metadata = self.metadata.to_owned(); let receipt = NotifyReceipt::with(invocation_notification, receipt_cid, metadata); if let Ok(json) = receipt.to_json() { @@ -209,7 +215,13 @@ impl Captured { cid = receipt_cid.to_string(), "Sending receipt to websocket" ); - let _ = ws_tx.notify(json); + let _ = ws_tx.notify(Message::new( + Header::new( + SubscriptionTyp::Cid(self.workflow.cid), + self.workflow.name.clone(), + ), + json, + )); } } @@ -315,7 +327,7 @@ impl Replay { let invocation_notification = invocation_receipt; let receipt_cid = receipt.cid(); - let ws_tx = event_handler.ws_sender(); + let ws_tx = event_handler.ws_workflow_sender(); let metadata = self.metadata.to_owned(); let receipt = NotifyReceipt::with(invocation_notification, receipt_cid, metadata); if let Ok(json) = receipt.to_json() { @@ -323,7 +335,23 @@ impl Replay { cid = receipt_cid.to_string(), "Sending receipt to websocket" ); - let _ = ws_tx.notify(json); + + if let Some(ipld) = &self.metadata { + match (ipld.get(WORKFLOW_KEY), ipld.get(WORKFLOW_NAME_KEY)) { + (Ok(Ipld::Link(cid)), Ok(Ipld::String(name))) => { + let header = Header::new( + SubscriptionTyp::Cid(*cid), + Some((name.to_string()).into()), + ); + let _ = ws_tx.notify(Message::new(header, json)); + } + (Ok(Ipld::Link(cid)), Err(_err)) => { + let header = Header::new(SubscriptionTyp::Cid(*cid), None); + let _ = ws_tx.notify(Message::new(header, json)); + } + _ => (), + } + } } }); diff --git a/homestar-runtime/src/network/webserver.rs b/homestar-runtime/src/network/webserver.rs index fac01e30..738986c0 100644 --- a/homestar-runtime/src/network/webserver.rs +++ b/homestar-runtime/src/network/webserver.rs @@ -9,8 +9,9 @@ use homestar_wasm::io::Arg; use http::{header::CONTENT_TYPE, Method}; use jsonrpsee::{ self, - server::{middleware::ProxyGetRequestLayer, ServerHandle}, + server::{middleware::ProxyGetRequestLayer, RandomStringIdProvider, ServerHandle}, }; +use libipld::Cid; use metrics_exporter_prometheus::PrometheusHandle; use std::{ net::{IpAddr, SocketAddr, TcpListener}, @@ -45,7 +46,7 @@ pub(crate) enum Message { /// Run a workflow, given a tuple of name, and [Workflow]. RunWorkflow((FastStr, Workflow<'static, Arg>)), /// Acknowledgement of a [Workflow] run. - AckWorkflow, + AckWorkflow((Cid, FastStr)), } /// WebSocket server fields. @@ -56,9 +57,11 @@ pub(crate) struct Server { addr: SocketAddr, /// TODO capacity: usize, + /// TODO + evt_notifier: Notifier, /// Message sender for broadcasting to clients connected to the /// websocket server. - notifier: Notifier, + workflow_msg_notifier: Notifier, /// Receiver timeout for the websocket server. receiver_timeout: Duration, /// TODO @@ -84,13 +87,17 @@ impl Server { #[cfg(feature = "websocket-notify")] fn setup_channel( capacity: usize, - ) -> (broadcast::Sender>, broadcast::Receiver>) { + ) -> ( + broadcast::Sender, + broadcast::Receiver, + ) { broadcast::channel(capacity) } #[cfg(feature = "websocket-notify")] pub(crate) fn new(settings: &settings::Network) -> Result { - let (sender, _receiver) = Self::setup_channel(settings.websocket_capacity); + let (evt_sender, _receiver) = Self::setup_channel(settings.websocket_capacity); + let (msg_sender, _receiver) = Self::setup_channel(settings.websocket_capacity); let host = IpAddr::from_str(&settings.webserver_host.to_string())?; let port_setting = settings.webserver_port; let addr = if port_available(host, port_setting) { @@ -105,7 +112,8 @@ impl Server { Ok(Self { addr, capacity: settings.websocket_capacity, - notifier: Notifier::new(sender), + evt_notifier: Notifier::new(evt_sender), + workflow_msg_notifier: Notifier::new(msg_sender), receiver_timeout: settings.websocket_receiver_timeout, webserver_timeout: settings.webserver_timeout, }) @@ -141,7 +149,8 @@ impl Server { ) -> Result { let module = JsonRpc::new(Context::new( metrics_hdl, - self.notifier.clone(), + self.evt_notifier.clone(), + self.workflow_msg_notifier.clone(), runner_sender, self.receiver_timeout, )) @@ -169,8 +178,15 @@ impl Server { /// Get websocket message sender for broadcasting messages to websocket /// clients. #[cfg(feature = "websocket-notify")] - pub(crate) fn notifier(&self) -> Notifier { - self.notifier.clone() + pub(crate) fn evt_notifier(&self) -> Notifier { + self.evt_notifier.clone() + } + + /// Get websocket message sender for broadcasting messages to websocket + /// clients. + #[cfg(feature = "websocket-notify")] + pub(crate) fn workflow_msg_notifier(&self) -> Notifier { + self.workflow_msg_notifier.clone() } async fn start_inner(&self, module: JsonRpc) -> Result { @@ -198,6 +214,7 @@ impl Server { let server = jsonrpsee::server::Server::builder() .custom_tokio_runtime(runtime_hdl.clone()) .set_middleware(middleware) + .set_id_provider(Box::new(RandomStringIdProvider::new(16))) .set_message_buffer_capacity(self.capacity as u32) .build(addr) .await @@ -230,7 +247,7 @@ mod test { use jsonrpsee::types::error::ErrorCode; use jsonrpsee::{core::client::ClientT, rpc_params, ws_client::WsClientBuilder}; #[cfg(feature = "websocket-notify")] - use notifier::NotifyReceipt; + use notifier::{self, Header, NotifyReceipt}; use serial_test::file_serial; use tokio::sync::mpsc; @@ -345,11 +362,51 @@ mod test { // send any bytes through (Vec) let (invocation_receipt, runtime_receipt) = crate::test_utils::receipt::receipts(); let receipt = NotifyReceipt::with(invocation_receipt, runtime_receipt.cid(), None); - server.notifier.notify(receipt.to_json().unwrap()).unwrap(); - let msg = sub.next().await.unwrap().unwrap(); - let returned: NotifyReceipt = DagJson::from_json(&msg).unwrap(); + server + .evt_notifier + .notify(notifier::Message::new( + Header::new( + notifier::SubscriptionTyp::EventSub( + rpc::SUBSCRIBE_NETWORK_EVENTS_ENDPOINT.to_string(), + ), + None, + ), + receipt.to_json().unwrap(), + )) + .unwrap(); + + // send an unknown msg: this should be dropped + server + .evt_notifier + .notify(notifier::Message::new( + Header::new( + notifier::SubscriptionTyp::EventSub("test".to_string()), + None, + ), + vec![], + )) + .unwrap(); + + server + .evt_notifier + .notify(notifier::Message::new( + Header::new( + notifier::SubscriptionTyp::EventSub( + rpc::SUBSCRIBE_NETWORK_EVENTS_ENDPOINT.to_string(), + ), + None, + ), + receipt.to_json().unwrap(), + )) + .unwrap(); + + let msg1 = sub.next().await.unwrap().unwrap(); + let returned1: NotifyReceipt = DagJson::from_json(&msg1).unwrap(); + assert_eq!(returned1, receipt); + + let msg2 = sub.next().await.unwrap().unwrap(); + let _returned1: NotifyReceipt = DagJson::from_json(&msg2).unwrap(); - assert_eq!(returned, receipt); assert!(sub.unsubscribe().await.is_ok()); unsafe { metrics::clear_recorder() } diff --git a/homestar-runtime/src/network/webserver/notifier.rs b/homestar-runtime/src/network/webserver/notifier.rs index 31e118e0..44c861bf 100644 --- a/homestar-runtime/src/network/webserver/notifier.rs +++ b/homestar-runtime/src/network/webserver/notifier.rs @@ -1,51 +1,117 @@ //! Notifier for broadcasting messages to websocket clients. use anyhow::Result; +use faststr::FastStr; use homestar_core::{ipld::DagJson, workflow::Receipt}; use libipld::{ipld, Cid, Ipld}; -use std::sync::Arc; +use std::{fmt, sync::Arc}; use tokio::sync::broadcast; /// Type-wrapper for websocket sender. #[derive(Debug)] -pub(crate) struct Notifier(Arc>>); +pub(crate) struct Notifier(Arc>); -impl Clone for Notifier { +impl Clone for Notifier { fn clone(&self) -> Self { Self(self.0.clone()) } } -impl Notifier { +impl Notifier +where + T: Send + Sync + fmt::Debug + 'static, +{ /// Create a new [Notifier]. - pub(crate) fn new(sender: broadcast::Sender>) -> Self { + pub(crate) fn new(sender: broadcast::Sender) -> Self { Self(sender.into()) } /// Get a reference to the inner [broadcast::Sender]. #[allow(dead_code)] - pub(crate) fn inner(&self) -> &Arc>> { + pub(crate) fn inner(&self) -> &Arc> { &self.0 } /// Get and take ownership of the inner [broadcast::Sender]. #[allow(dead_code)] - pub(crate) fn into_inner(self) -> Arc>> { + pub(crate) fn into_inner(self) -> Arc> { self.0 } /// Send a message to all connected websocket clients. - pub(crate) fn notify(&self, msg: Vec) -> Result<()> { + pub(crate) fn notify(&self, msg: T) -> Result<()> { let _ = self.0.send(msg)?; Ok(()) } } +/// Subscription type: either directed via a [Cid] or an event subscription string. +#[allow(dead_code)] +#[derive(Debug, Clone)] +pub(crate) enum SubscriptionTyp { + EventSub(String), + Cid(Cid), +} + +/// A header for a message to be sent to a websocket client. +#[derive(Debug, Clone)] +pub(crate) struct Header { + pub(crate) subscription: SubscriptionTyp, + pub(crate) ident: Option, +} + +impl Header { + /// Create a new [Header]. + pub(crate) fn new(sub: SubscriptionTyp, ident: Option) -> Self { + Self { + subscription: sub, + ident, + } + } +} + +/// A message to be sent to a websocket client, with a header and payload. +#[derive(Debug, Clone)] +pub(crate) struct Message { + pub(crate) header: Header, + pub(crate) payload: Vec, +} + +impl Message { + /// TODO + pub(crate) fn new(header: Header, payload: Vec) -> Self { + Self { header, payload } + } + + /// TODO + #[allow(dead_code)] + pub(crate) fn header(&self) -> &Header { + &self.header + } + + /// TODO + pub(crate) fn payload(&self) -> &[u8] { + &self.payload + } +} + /// A [Receipt] that is sent out *just* for websocket notifications. #[derive(Debug, Clone, PartialEq)] pub(crate) struct NotifyReceipt(Ipld); impl NotifyReceipt { + /// TODO + #[allow(dead_code)] + pub(crate) fn inner(&self) -> &Ipld { + &self.0 + } + + /// TODO + #[allow(dead_code)] + pub(crate) fn into_inner(self) -> Ipld { + self.0.to_owned() + } + pub(crate) fn with(receipt: Receipt, cid: Cid, metadata: Option) -> Self { let receipt: Ipld = receipt.into(); let data = ipld!({ diff --git a/homestar-runtime/src/network/webserver/rpc.rs b/homestar-runtime/src/network/webserver/rpc.rs index 6749585d..e9fae049 100644 --- a/homestar-runtime/src/network/webserver/rpc.rs +++ b/homestar-runtime/src/network/webserver/rpc.rs @@ -1,19 +1,30 @@ use super::{listener, prom::PrometheusData}; #[cfg(feature = "websocket-notify")] -use super::{Message, Notifier}; +use super::{ + notifier::{self, Header, Notifier, SubscriptionTyp}, + Message, +}; use crate::runner::WsSender; #[cfg(feature = "websocket-notify")] use anyhow::anyhow; use anyhow::Result; #[cfg(feature = "websocket-notify")] +use dashmap::DashMap; +#[cfg(feature = "websocket-notify")] +use faststr::FastStr; +#[cfg(feature = "websocket-notify")] use futures::StreamExt; use jsonrpsee::{ server::RpcModule, types::{error::ErrorCode, ErrorObjectOwned}, }; #[cfg(feature = "websocket-notify")] -use jsonrpsee::{SubscriptionMessage, SubscriptionSink, TrySendError}; +use jsonrpsee::{ConnectionId, SubscriptionMessage, SubscriptionSink, TrySendError}; +#[cfg(feature = "websocket-notify")] +use libipld::Cid; use metrics_exporter_prometheus::PrometheusHandle; +#[cfg(feature = "websocket-notify")] +use std::sync::Arc; use std::time::Duration; #[cfg(feature = "websocket-notify")] use tokio::{ @@ -25,13 +36,12 @@ use tokio::{ #[cfg(feature = "websocket-notify")] use tokio_stream::wrappers::BroadcastStream; #[cfg(feature = "websocket-notify")] -use tracing::{error, info, warn}; +use tracing::{debug, error, info, warn}; /// Health endpoint. pub(crate) const HEALTH_ENDPOINT: &str = "health"; /// Metrics endpoint for prometheus / openmetrics polling. pub(crate) const METRICS_ENDPOINT: &str = "metrics"; - /// Run a workflow and subscribe to that workflow's events. #[cfg(feature = "websocket-notify")] pub(crate) const SUBSCRIBE_RUN_WORKFLOW_ENDPOINT: &str = "subscribe_run_workflow"; @@ -49,9 +59,11 @@ pub(crate) const UNSUBSCRIBE_NETWORK_EVENTS_ENDPOINT: &str = "unsubscribe_networ #[cfg(feature = "websocket-notify")] pub(crate) struct Context { metrics_hdl: PrometheusHandle, - notifier: Notifier, + evt_notifier: Notifier, + workflow_msg_notifier: Notifier, runner_sender: WsSender, receiver_timeout: Duration, + workflow_listeners: Arc>, } /// TODO @@ -69,15 +81,18 @@ impl Context { #[cfg_attr(docsrs, doc(cfg(feature = "websocket-notify")))] pub(crate) fn new( metrics_hdl: PrometheusHandle, - notifier: Notifier, + evt_notifier: Notifier, + workflow_msg_notifier: Notifier, runner_sender: WsSender, receiver_timeout: Duration, ) -> Self { Self { metrics_hdl, - notifier, + evt_notifier, + workflow_msg_notifier, runner_sender, receiver_timeout, + workflow_listeners: DashMap::new().into(), } } @@ -145,9 +160,14 @@ impl JsonRpc { UNSUBSCRIBE_NETWORK_EVENTS_ENDPOINT, |_, pending, ctx| async move { let sink = pending.accept().await?; - let rx = ctx.notifier.inner().subscribe(); + let rx = ctx.evt_notifier.inner().subscribe(); let stream = BroadcastStream::new(rx); - Self::handle_event_subscription(sink, stream).await?; + Self::handle_event_subscription( + sink, + stream, + SUBSCRIBE_NETWORK_EVENTS_ENDPOINT.to_string(), + ) + .await?; Ok(()) }, )?; @@ -165,10 +185,17 @@ impl JsonRpc { .send((Message::RunWorkflow((name, workflow)), Some(tx))) .await?; - if (time::timeout_at(Instant::now() + ctx.receiver_timeout, rx).await) - .is_err() + if let Ok(Ok(Message::AckWorkflow((cid, name)))) = + time::timeout_at(Instant::now() + ctx.receiver_timeout, rx).await { - error!("did not acknowledge message in time"); + ctx.workflow_listeners + .insert(pending.connection_id(), (cid, name)); + debug!( + "inserted workflow listener with connection_id: {:#?}", + pending.connection_id() + ); + } else { + warn!("did not acknowledge message in time"); let _ = pending .reject(ErrorObjectOwned::from(ErrorObjectOwned::from( ErrorCode::InternalError, @@ -183,10 +210,11 @@ impl JsonRpc { return Ok(()); } } + let sink = pending.accept().await?; - let rx = ctx.notifier.inner().subscribe(); + let rx = ctx.workflow_msg_notifier.inner().subscribe(); let stream = BroadcastStream::new(rx); - Self::handle_event_subscription(sink, stream).await?; + Self::handle_workflow_subscription(sink, stream, ctx).await?; Ok(()) }, )?; @@ -197,7 +225,8 @@ impl JsonRpc { #[cfg(feature = "websocket-notify")] async fn handle_event_subscription( mut sink: SubscriptionSink, - mut stream: BroadcastStream>, + mut stream: BroadcastStream, + subscription_type: String, ) -> Result<()> { let rt_hdl = Handle::current(); rt_hdl.spawn(async move { @@ -208,7 +237,14 @@ impl JsonRpc { } next_msg = stream.next() => { let msg = match next_msg { - Some(Ok(msg)) => msg, + Some(Ok(notifier::Message { + header: Header { + subscription: SubscriptionTyp::EventSub(evt), + .. + }, + payload, + })) if evt == subscription_type => payload, + Some(Ok(_)) => continue, Some(Err(err)) => { error!("subscription stream error: {}", err); break Err(err.into()); @@ -232,4 +268,70 @@ impl JsonRpc { Ok(()) } + + #[cfg(feature = "websocket-notify")] + async fn handle_workflow_subscription( + mut sink: SubscriptionSink, + mut stream: BroadcastStream, + ctx: Arc, + ) -> Result<()> { + let rt_hdl = Handle::current(); + rt_hdl.spawn(async move { + loop { + select! { + _ = sink.closed() => { + ctx.workflow_listeners.remove(&sink.connection_id()); + break Ok(()); + } + next_msg = stream.next() => { + let msg = match next_msg { + Some(Ok(notifier::Message { + header: Header { subscription: SubscriptionTyp::Cid(cid), ident }, + payload, + })) => { + let msg = ctx.workflow_listeners + .get(&sink.connection_id()) + .and_then(|v| { + let (v_cid, v_name) = v.value(); + if v_cid == &cid && (Some(v_name) == ident.as_ref() || ident.is_none()) { + Some(payload) + } else { + None + } + }); + msg + } + Some(Ok(notifier::Message { + header: notifier::Header { subscription: _sub, ..}, + .. + })) => { + continue; + } + Some(Err(err)) => { + error!("subscription stream error: {}", err); + ctx.workflow_listeners.remove(&sink.connection_id()); + break Err(err.into()); + } + None => break Ok(()), + }; + + if let Some(msg) = msg { + let sub_msg = SubscriptionMessage::from_json(&msg)?; + match sink.try_send(sub_msg) { + Ok(()) => (), + Err(TrySendError::Closed(_)) => { + break Err(anyhow!("subscription sink closed")); + } + Err(TrySendError::Full(_)) => { + info!("subscription sink full"); + } + } + } + } + } + } + }); + + Ok(()) + } } diff --git a/homestar-runtime/src/runner.rs b/homestar-runtime/src/runner.rs index c02576b5..3511f26f 100644 --- a/homestar-runtime/src/runner.rs +++ b/homestar-runtime/src/runner.rs @@ -160,11 +160,17 @@ impl Runner { let swarm = runtime.block_on(swarm::new(settings.node()))?; let webserver = webserver::Server::new(settings.node().network())?; + #[cfg(feature = "websocket-notify")] - let ws_msg_tx = webserver.notifier(); + let (ws_msg_tx, ws_evt_tx) = { + let ws_msg_tx = webserver.workflow_msg_notifier(); + let ws_evt_tx = webserver.evt_notifier(); + + (ws_msg_tx, ws_evt_tx) + }; #[cfg(feature = "websocket-notify")] - let event_handler = EventHandler::new(swarm, db, settings.node(), ws_msg_tx); + let event_handler = EventHandler::new(swarm, db, settings.node(), ws_evt_tx, ws_msg_tx); #[cfg(not(feature = "websocket-notify"))] let event_handler = EventHandler::new(swarm, db, settings.node()); @@ -268,9 +274,9 @@ impl Runner { runner_worker_tx.clone(), db.clone(), ).await { - Ok(_) => { + Ok(data) => { info!("sending message to rpc server"); - let _ = oneshot_tx.send(webserver::Message::AckWorkflow); + let _ = oneshot_tx.send(webserver::Message::AckWorkflow((data.info.cid, data.name))); } Err(err) => { error!(err=?err, "error handling ws message"); @@ -577,7 +583,7 @@ impl Runner { // `clone`, as the underlying type is an `Arc`. let initial_info = Arc::clone(&worker.workflow_info); let workflow_timeout = worker.workflow_settings.timeout; - let workflow_name = worker.workflow_name.to_string(); + let workflow_name = worker.workflow_name.clone(); let timestamp = worker.workflow_started; // Spawn worker, which initializees the scheduler and runs @@ -619,7 +625,7 @@ impl Runner { struct WorkflowData { info: Arc, - name: String, + name: FastStr, timestamp: NaiveDateTime, } diff --git a/homestar-runtime/src/runner/response.rs b/homestar-runtime/src/runner/response.rs index 7f656456..ea08e08b 100644 --- a/homestar-runtime/src/runner/response.rs +++ b/homestar-runtime/src/runner/response.rs @@ -6,6 +6,7 @@ use crate::{ workflow::{self, IndexedResources}, }; use chrono::NaiveDateTime; +use faststr::FastStr; use libipld::Cid; use serde::{Deserialize, Serialize}; use std::{fmt, net::SocketAddr, sync::Arc}; @@ -20,7 +21,7 @@ use tabled::{ #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Tabled)] pub struct AckWorkflow { pub(crate) cid: Cid, - pub(crate) name: String, + pub(crate) name: FastStr, pub(crate) num_tasks: u32, #[tabled(skip)] pub(crate) progress: Vec, @@ -44,7 +45,7 @@ impl AckWorkflow { /// Workflow information for response / display. pub(crate) fn new( workflow_info: Arc, - name: String, + name: FastStr, timestamp: NaiveDateTime, ) -> Self { Self { diff --git a/homestar-runtime/src/workflow/info.rs b/homestar-runtime/src/workflow/info.rs index a82f6e99..4222b9e0 100644 --- a/homestar-runtime/src/workflow/info.rs +++ b/homestar-runtime/src/workflow/info.rs @@ -30,6 +30,7 @@ use tracing::info; pub const WORKFLOW_TAG: &str = "ipvm/workflow"; const CID_KEY: &str = "cid"; +const NAME_KEY: &str = "name"; const NUM_TASKS_KEY: &str = "num_tasks"; const PROGRESS_KEY: &str = "progress"; const PROGRESS_COUNT_KEY: &str = "progress_count"; @@ -137,6 +138,7 @@ impl StoredReceipt { #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct Info { pub(crate) cid: Cid, + pub(crate) name: Option, pub(crate) num_tasks: u32, pub(crate) progress: Vec, pub(crate) progress_count: u32, @@ -147,8 +149,11 @@ impl fmt::Display for Info { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!( f, - "cid: {}, progress: {}/{}", - self.cid, self.progress_count, self.num_tasks + "cid: {}, local_name: {}, name, progress: {}/{}", + self.cid, + self.name.clone().unwrap_or(self.cid.to_string().into()), + self.progress_count, + self.num_tasks ) } } @@ -161,6 +166,7 @@ impl Info { let cid = stored.cid.cid(); Self { cid, + name: stored.name.map(|name| name.into()), num_tasks: stored.num_tasks as u32, progress, progress_count, @@ -173,6 +179,7 @@ impl Info { let cid = stored.cid.cid(); Self { cid, + name: stored.name.map(|name| name.into()), num_tasks: stored.num_tasks as u32, progress: vec![], progress_count: 0, @@ -379,6 +386,14 @@ impl From for Ipld { fn from(workflow: Info) -> Self { Ipld::Map(BTreeMap::from([ (CID_KEY.into(), Ipld::Link(workflow.cid)), + ( + NAME_KEY.into(), + workflow + .name + .as_ref() + .map(|name| name.to_string().into()) + .unwrap_or(Ipld::Null), + ), ( NUM_TASKS_KEY.into(), Ipld::Integer(workflow.num_tasks as i128), @@ -406,6 +421,13 @@ impl TryFrom for Info { .ok_or_else(|| anyhow!("no `cid` set"))? .to_owned(), )?; + let name = map + .get(NAME_KEY) + .and_then(|ipld| match ipld { + Ipld::Null => None, + ipld => Some(ipld), + }) + .and_then(|ipld| from_ipld(ipld.to_owned()).ok()); let num_tasks = from_ipld( map.get(NUM_TASKS_KEY) .ok_or_else(|| anyhow!("no `num_tasks` set"))? @@ -429,6 +451,7 @@ impl TryFrom for Info { Ok(Self { cid, + name, num_tasks, progress, progress_count, diff --git a/homestar-runtime/tests/utils.rs b/homestar-runtime/tests/utils.rs index c3cc19a8..4f3b787d 100644 --- a/homestar-runtime/tests/utils.rs +++ b/homestar-runtime/tests/utils.rs @@ -29,6 +29,7 @@ pub(crate) const IPFS: &str = "ipfs"; static BIN: Lazy = Lazy::new(|| assert_cmd::cargo::cargo_bin(BIN_NAME)); /// Start-up IPFS daemon for tests with the feature turned-on. +#[allow(dead_code)] #[cfg(feature = "ipfs")] pub(crate) fn startup_ipfs() -> Result<()> { let path = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join(".ipfs"); diff --git a/homestar-runtime/tests/webserver.rs b/homestar-runtime/tests/webserver.rs index 2becc51f..7f4ccc65 100644 --- a/homestar-runtime/tests/webserver.rs +++ b/homestar-runtime/tests/webserver.rs @@ -2,7 +2,7 @@ use crate::utils::startup_ipfs; use crate::utils::{kill_homestar, stop_all_bins, BIN_NAME, IPFS}; use anyhow::Result; -use futures::StreamExt; +use futures::{FutureExt, StreamExt}; use jsonrpsee::{ core::client::{Subscription, SubscriptionClientT}, rpc_params, @@ -64,7 +64,7 @@ fn test_workflow_run_serial() -> Result<()> { .arg("tests/fixtures/test_workflow2.toml") .arg("--db") .arg("homestar_test_workflow_run_serial.db") - .stdout(Stdio::piped()) + //.stdout(Stdio::piped()) .spawn() .unwrap(); @@ -93,18 +93,21 @@ fn test_workflow_run_serial() -> Result<()> { let run_str = format!(r#"{{"name": "test","workflow": {}}}"#, json_string); let run: serde_json::Value = serde_json::from_str(&run_str).unwrap(); - let client = WsClientBuilder::default().build(ws_url).await.unwrap(); - let sub: Subscription> = client + let client1 = WsClientBuilder::default() + .build(ws_url.clone()) + .await + .unwrap(); + let sub1: Subscription> = client1 .subscribe( SUBSCRIBE_RUN_WORKFLOW_ENDPOINT, - rpc_params![run], + rpc_params![run.clone()], UNSUBSCRIBE_RUN_WORKFLOW_ENDPOINT, ) .await .unwrap(); - // we have 3 operations0 - sub.take(3) + // we have 3 operations + sub1.take(3) .for_each(|msg| async move { let json: serde_json::Value = serde_json::from_slice(&msg.unwrap()).unwrap(); let check = json.get("metadata").unwrap(); @@ -117,6 +120,36 @@ fn test_workflow_run_serial() -> Result<()> { } }) .await; + + // separate subscription, only 3 events too + let mut sub2: Subscription> = client1 + .subscribe( + SUBSCRIBE_RUN_WORKFLOW_ENDPOINT, + rpc_params![run.clone()], + UNSUBSCRIBE_RUN_WORKFLOW_ENDPOINT, + ) + .await + .unwrap(); + + assert!(sub2.next().await.is_some()); + assert!(sub2.next().await.is_some()); + assert!(sub2.next().await.is_some()); + assert!(sub2.next().now_or_never().is_none()); + + let client2 = WsClientBuilder::default().build(ws_url).await.unwrap(); + let mut sub3: Subscription> = client2 + .subscribe( + SUBSCRIBE_RUN_WORKFLOW_ENDPOINT, + rpc_params![run], + UNSUBSCRIBE_RUN_WORKFLOW_ENDPOINT, + ) + .await + .unwrap(); + + assert!(sub3.next().await.is_some()); + assert!(sub3.next().await.is_some()); + assert!(sub3.next().await.is_some()); + assert!(sub3.next().now_or_never().is_none()); }); let _ = Command::new(BIN.as_os_str()).arg("stop").output(); From 24a8741a0aa1524c24e9503203d28e9ec124691e Mon Sep 17 00:00:00 2001 From: Brian Ginsburg Date: Thu, 2 Nov 2023 13:36:16 -0700 Subject: [PATCH 07/24] chore: fix tests --- homestar-runtime/src/tasks/fetch.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/homestar-runtime/src/tasks/fetch.rs b/homestar-runtime/src/tasks/fetch.rs index 6b1deecc..f3f5d9d6 100644 --- a/homestar-runtime/src/tasks/fetch.rs +++ b/homestar-runtime/src/tasks/fetch.rs @@ -42,6 +42,7 @@ impl Fetch { tasks.try_collect::>().await?.into_iter().try_fold( IndexMap::default(), |mut acc, res| { + println!("NOT TEST"); let answer = res.1?; acc.insert(res.0, answer); From 598fecc41360ea24dbc5124a4a631f31dbbae759 Mon Sep 17 00:00:00 2001 From: Brian Ginsburg Date: Sat, 4 Nov 2023 11:14:50 -0700 Subject: [PATCH 08/24] feat: Add event notification --- homestar-runtime/Cargo.toml | 2 +- homestar-runtime/src/event_handler.rs | 1 + .../src/event_handler/notification.rs | 172 ++++++++++++++++++ .../src/event_handler/swarm_event.rs | 24 ++- 4 files changed, 196 insertions(+), 3 deletions(-) create mode 100644 homestar-runtime/src/event_handler/notification.rs diff --git a/homestar-runtime/Cargo.toml b/homestar-runtime/Cargo.toml index 3573096b..253c8dba 100644 --- a/homestar-runtime/Cargo.toml +++ b/homestar-runtime/Cargo.toml @@ -106,6 +106,7 @@ libp2p = { version = "0.52", default-features = false, features = [ libsqlite3-sys = { version = "0.26", default-features = false, features = [ "bundled", ] } +maplit = "1.0" metrics = { version = "0.21", default-features = false } metrics-exporter-prometheus = { version = "0.12.1", default-features = false, features = [ "http-listener", @@ -190,7 +191,6 @@ homestar_runtime_proc_macro = { path = "src/test_utils/proc_macro", package = "h jsonrpsee = { version = "0.20", default-features = false, features = [ "client", ] } -maplit = "1.0" nix = { version = "0.27", features = ["signal"] } predicates = { version = "3.0", default-features = false } prometheus-parse = "0.2.4" diff --git a/homestar-runtime/src/event_handler.rs b/homestar-runtime/src/event_handler.rs index fab391bd..9d616737 100644 --- a/homestar-runtime/src/event_handler.rs +++ b/homestar-runtime/src/event_handler.rs @@ -23,6 +23,7 @@ use tokio::select; pub mod channel; pub(crate) mod error; pub(crate) mod event; +pub(crate) mod notification; pub(crate) mod swarm_event; pub(crate) use error::RequestResponseError; pub(crate) use event::Event; diff --git a/homestar-runtime/src/event_handler/notification.rs b/homestar-runtime/src/event_handler/notification.rs new file mode 100644 index 00000000..9e0b0066 --- /dev/null +++ b/homestar-runtime/src/event_handler/notification.rs @@ -0,0 +1,172 @@ +use anyhow::anyhow; +use chrono::prelude::Utc; +use homestar_core::ipld::DagJson; +use libipld::{serde::from_ipld, Ipld}; +use serde::{Deserialize, Serialize}; +use std::collections::BTreeMap; + +const TYPE_KEY: &str = "type"; +const DATA_KEY: &str = "data"; +const TIMESTAMP_KEY: &str = "timestamp"; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub(crate) struct EventNotification { + ty: EventNotificationType, + data: Ipld, + timestamp: i64, +} + +impl EventNotification { + pub(crate) fn new(ty: EventNotificationType, data: BTreeMap<&str, String>) -> Self { + let ipld_data = data + .iter() + .map(|(key, val)| (key.to_string(), Ipld::String(val.to_owned()))) + .collect(); + + Self { + ty, + data: Ipld::Map(ipld_data), + timestamp: Utc::now().timestamp_millis(), + } + } +} + +impl DagJson for EventNotification where Ipld: From {} + +impl From for Ipld { + fn from(notification: EventNotification) -> Self { + Ipld::Map(BTreeMap::from([ + ("type".into(), notification.ty.into()), + ("data".into(), notification.data), + ("timestamp".into(), notification.timestamp.into()), + ])) + } +} + +impl TryFrom for EventNotification { + type Error = anyhow::Error; + + fn try_from(ipld: Ipld) -> Result { + let map = from_ipld::>(ipld)?; + + let ty: EventNotificationType = map + .get(TYPE_KEY) + .ok_or_else(|| anyhow!("missing {TYPE_KEY}"))? + .to_owned() + .try_into()?; + + let data = map + .get(DATA_KEY) + .ok_or_else(|| anyhow!("missing {DATA_KEY}"))? + .to_owned(); + + let timestamp = from_ipld( + map.get(TIMESTAMP_KEY) + .ok_or_else(|| anyhow!("missing {TIMESTAMP_KEY}"))? + .to_owned(), + )?; + + Ok(EventNotification { + ty, + data, + timestamp, + }) + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub(crate) enum EventNotificationType { + SwarmNotification(SwarmNotification), +} + +impl DagJson for EventNotificationType where Ipld: From {} + +impl From for Ipld { + fn from(notification: EventNotificationType) -> Self { + match notification { + EventNotificationType::SwarmNotification(n) => n.into(), + } + } +} + +impl TryFrom for EventNotificationType { + type Error = anyhow::Error; + + fn try_from(ipld: Ipld) -> Result { + let ty = from_ipld::(ipld)?; + + match ty.as_str() { + "connectionEstablished" => Ok(EventNotificationType::SwarmNotification( + SwarmNotification::ConnnectionEstablished, + )), + _ => Err(anyhow!("Missing notification type.")), + } + } +} + +// Types of swarm notification sent to clients +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub(crate) enum SwarmNotification { + ConnnectionEstablished, + ConnnectionClosed, +} + +impl DagJson for SwarmNotification where Ipld: From {} + +#[allow(unused_variables, non_snake_case)] +impl From for Ipld { + fn from(notification: SwarmNotification) -> Self { + match notification { + SwarmNotification::ConnnectionEstablished => { + Ipld::String("connectionEstablished".into()) + } + SwarmNotification::ConnnectionClosed => Ipld::String("connectionClosed".into()), + } + } +} + +impl TryFrom for SwarmNotification { + type Error = anyhow::Error; + + fn try_from(ipld: Ipld) -> Result { + let ty = from_ipld::(ipld)?; + + match ty.as_str() { + "connectionEstablished" => Ok(SwarmNotification::ConnnectionEstablished), + "connectionClosed" => Ok(SwarmNotification::ConnnectionClosed), + _ => Err(anyhow!("Missing notification type.")), + } + } +} + +#[cfg(test)] +mod test { + use super::*; + use libp2p::PeerId; + use maplit::btreemap; + + #[test] + fn notification_rountrip_bytes() { + let peer_id = PeerId::random().to_string(); + let address: String = "/ip4/127.0.0.1/tcp/7000".to_string(); + + let notification = EventNotification::new( + EventNotificationType::SwarmNotification(SwarmNotification::ConnnectionEstablished), + btreemap! { + "peer_id" => peer_id.clone(), + "address" => address.clone() + }, + ); + let bytes = notification.to_json().unwrap(); + + let parsed = EventNotification::from_json(bytes.as_ref()).unwrap(); + let data: BTreeMap = from_ipld(parsed.data).unwrap(); + + assert_eq!( + parsed.ty, + EventNotificationType::SwarmNotification(SwarmNotification::ConnnectionEstablished) + ); + assert_eq!(data.get("peer_id").unwrap(), &peer_id); + assert_eq!(data.get("address").unwrap(), &address); + } +} diff --git a/homestar-runtime/src/event_handler/swarm_event.rs b/homestar-runtime/src/event_handler/swarm_event.rs index c64cf194..383dfb34 100644 --- a/homestar-runtime/src/event_handler/swarm_event.rs +++ b/homestar-runtime/src/event_handler/swarm_event.rs @@ -5,7 +5,11 @@ use super::EventHandler; use crate::network::IpfsCli; use crate::{ db::{Connection, Database}, - event_handler::{event::QueryRecord, Event, Handler, RequestResponseError}, + event_handler::{ + event::QueryRecord, + notification::{EventNotification, EventNotificationType, SwarmNotification}, + Event, Handler, RequestResponseError, + }, libp2p::multiaddr::MultiaddrExt, network::swarm::{CapsuleTag, ComposedEvent, RequestResponseKey, HOMESTAR_PROTOCOL_VER}, receipt::{RECEIPT_TAG, VERSION_KEY}, @@ -17,6 +21,7 @@ use anyhow::{anyhow, Result}; use async_trait::async_trait; use homestar_core::{ consts, + ipld::DagJson, workflow::{Pointer, Receipt as InvocationReceipt}, }; use libipld::{Cid, Ipld}; @@ -33,6 +38,7 @@ use libp2p::{ swarm::{dial_opts::DialOpts, SwarmEvent}, PeerId, StreamProtocol, }; +use maplit::btreemap; use std::{collections::HashSet, fmt}; use tracing::{debug, error, info, warn}; @@ -590,7 +596,21 @@ async fn handle_swarm_event( } => { debug!(peer_id=peer_id.to_string(), endpoint=?endpoint, "peer connection established"); // add peer to connected peers list - event_handler.connected_peers.insert(peer_id, endpoint); + event_handler + .connected_peers + .insert(peer_id, endpoint.clone()); + + let notification = EventNotification::new( + EventNotificationType::SwarmNotification(SwarmNotification::ConnnectionEstablished), + btreemap! { + "peer_id" => peer_id.to_string(), + "address" => endpoint.get_remote_address().to_string() + }, + ); + + if let Ok(json) = notification.to_json() { + let _ = event_handler.ws_msg_sender.notify(json); + } } SwarmEvent::ConnectionClosed { peer_id, cause, .. } => { debug!( From 6de0b6b852a1423e8681e7951ea86171325dade4 Mon Sep 17 00:00:00 2001 From: Brian Ginsburg Date: Sat, 4 Nov 2023 14:27:31 -0700 Subject: [PATCH 09/24] chore: Add send notification utility --- .../src/event_handler/notification.rs | 20 +++++++++++++--- .../src/event_handler/swarm_event.rs | 24 +++++++++---------- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/homestar-runtime/src/event_handler/notification.rs b/homestar-runtime/src/event_handler/notification.rs index 9e0b0066..fae77fd8 100644 --- a/homestar-runtime/src/event_handler/notification.rs +++ b/homestar-runtime/src/event_handler/notification.rs @@ -1,14 +1,25 @@ +use crate::network::webserver::Notifier; use anyhow::anyhow; use chrono::prelude::Utc; use homestar_core::ipld::DagJson; use libipld::{serde::from_ipld, Ipld}; use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; +use tracing::warn; const TYPE_KEY: &str = "type"; const DATA_KEY: &str = "data"; const TIMESTAMP_KEY: &str = "timestamp"; +/// Send notification as bytes +pub(crate) fn send(notifier: Notifier, notification: EventNotification) { + if let Ok(json) = notification.to_json() { + let _ = notifier.notify(json); + } else { + warn!("Unable to serialize notification as bytes: {notification:?}"); + } +} + #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub(crate) struct EventNotification { ty: EventNotificationType, @@ -82,9 +93,9 @@ pub(crate) enum EventNotificationType { impl DagJson for EventNotificationType where Ipld: From {} impl From for Ipld { - fn from(notification: EventNotificationType) -> Self { - match notification { - EventNotificationType::SwarmNotification(n) => n.into(), + fn from(event_type: EventNotificationType) -> Self { + match event_type { + EventNotificationType::SwarmNotification(ty) => ty.into(), } } } @@ -99,6 +110,9 @@ impl TryFrom for EventNotificationType { "connectionEstablished" => Ok(EventNotificationType::SwarmNotification( SwarmNotification::ConnnectionEstablished, )), + "connectionClosed" => Ok(EventNotificationType::SwarmNotification( + SwarmNotification::ConnnectionClosed, + )), _ => Err(anyhow!("Missing notification type.")), } } diff --git a/homestar-runtime/src/event_handler/swarm_event.rs b/homestar-runtime/src/event_handler/swarm_event.rs index 383dfb34..b81bba0a 100644 --- a/homestar-runtime/src/event_handler/swarm_event.rs +++ b/homestar-runtime/src/event_handler/swarm_event.rs @@ -7,7 +7,7 @@ use crate::{ db::{Connection, Database}, event_handler::{ event::QueryRecord, - notification::{EventNotification, EventNotificationType, SwarmNotification}, + notification::{self, EventNotification, EventNotificationType, SwarmNotification}, Event, Handler, RequestResponseError, }, libp2p::multiaddr::MultiaddrExt, @@ -21,7 +21,6 @@ use anyhow::{anyhow, Result}; use async_trait::async_trait; use homestar_core::{ consts, - ipld::DagJson, workflow::{Pointer, Receipt as InvocationReceipt}, }; use libipld::{Cid, Ipld}; @@ -600,17 +599,18 @@ async fn handle_swarm_event( .connected_peers .insert(peer_id, endpoint.clone()); - let notification = EventNotification::new( - EventNotificationType::SwarmNotification(SwarmNotification::ConnnectionEstablished), - btreemap! { - "peer_id" => peer_id.to_string(), - "address" => endpoint.get_remote_address().to_string() - }, + notification::send( + event_handler.ws_sender(), + EventNotification::new( + EventNotificationType::SwarmNotification( + SwarmNotification::ConnnectionEstablished, + ), + btreemap! { + "peer_id" => peer_id.to_string(), + "address" => endpoint.get_remote_address().to_string() + }, + ), ); - - if let Ok(json) = notification.to_json() { - let _ = event_handler.ws_msg_sender.notify(json); - } } SwarmEvent::ConnectionClosed { peer_id, cause, .. } => { debug!( From 2b11d6000cd77e0887e8deef38574cd3e94b2c8d Mon Sep 17 00:00:00 2001 From: Brian Ginsburg Date: Sat, 4 Nov 2023 14:33:17 -0700 Subject: [PATCH 10/24] test: Add notification json string roundtrip test --- .../src/event_handler/notification.rs | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/homestar-runtime/src/event_handler/notification.rs b/homestar-runtime/src/event_handler/notification.rs index fae77fd8..41e5e517 100644 --- a/homestar-runtime/src/event_handler/notification.rs +++ b/homestar-runtime/src/event_handler/notification.rs @@ -160,7 +160,7 @@ mod test { use maplit::btreemap; #[test] - fn notification_rountrip_bytes() { + fn notification_bytes_rountrip() { let peer_id = PeerId::random().to_string(); let address: String = "/ip4/127.0.0.1/tcp/7000".to_string(); @@ -183,4 +183,29 @@ mod test { assert_eq!(data.get("peer_id").unwrap(), &peer_id); assert_eq!(data.get("address").unwrap(), &address); } + + #[test] + fn notification_json_string_rountrip() { + let peer_id = PeerId::random().to_string(); + let address: String = "/ip4/127.0.0.1/tcp/7000".to_string(); + + let notification = EventNotification::new( + EventNotificationType::SwarmNotification(SwarmNotification::ConnnectionEstablished), + btreemap! { + "peer_id" => peer_id.clone(), + "address" => address.clone() + }, + ); + let json_string = notification.to_json_string().unwrap(); + + let parsed = EventNotification::from_json_string(json_string).unwrap(); + let data: BTreeMap = from_ipld(parsed.data).unwrap(); + + assert_eq!( + parsed.ty, + EventNotificationType::SwarmNotification(SwarmNotification::ConnnectionEstablished) + ); + assert_eq!(data.get("peer_id").unwrap(), &peer_id); + assert_eq!(data.get("address").unwrap(), &address); + } } From 25d2ede865c304c85c76a823aa9f456c2e5bae38 Mon Sep 17 00:00:00 2001 From: Brian Ginsburg Date: Sat, 4 Nov 2023 14:40:25 -0700 Subject: [PATCH 11/24] chore: Add connection closed notification --- .../src/event_handler/swarm_event.rs | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/homestar-runtime/src/event_handler/swarm_event.rs b/homestar-runtime/src/event_handler/swarm_event.rs index b81bba0a..d2717783 100644 --- a/homestar-runtime/src/event_handler/swarm_event.rs +++ b/homestar-runtime/src/event_handler/swarm_event.rs @@ -599,6 +599,7 @@ async fn handle_swarm_event( .connected_peers .insert(peer_id, endpoint.clone()); + #[cfg(feature = "websocket-notify")] notification::send( event_handler.ws_sender(), EventNotification::new( @@ -612,7 +613,12 @@ async fn handle_swarm_event( ), ); } - SwarmEvent::ConnectionClosed { peer_id, cause, .. } => { + SwarmEvent::ConnectionClosed { + peer_id, + cause, + endpoint, + .. + } => { debug!( peer_id = peer_id.to_string(), "peer connection closed, cause: {cause:?}" @@ -641,6 +647,18 @@ async fn handle_swarm_event( "removed peer from kademlia table" ); } + + #[cfg(feature = "websocket-notify")] + notification::send( + event_handler.ws_sender(), + EventNotification::new( + EventNotificationType::SwarmNotification(SwarmNotification::ConnnectionClosed), + btreemap! { + "peer_id" => peer_id.to_string(), + "address" => endpoint.get_remote_address().to_string() + }, + ), + ); } SwarmEvent::OutgoingConnectionError { connection_id, From b449e980f4ea281d630e0b058c271a70262f7a4c Mon Sep 17 00:00:00 2001 From: Brian Ginsburg Date: Sat, 4 Nov 2023 15:00:45 -0700 Subject: [PATCH 12/24] chore: Improve notification send utility --- .../src/event_handler/notification.rs | 4 ++- .../src/event_handler/swarm_event.rs | 28 ++++++++----------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/homestar-runtime/src/event_handler/notification.rs b/homestar-runtime/src/event_handler/notification.rs index 41e5e517..a2a71e74 100644 --- a/homestar-runtime/src/event_handler/notification.rs +++ b/homestar-runtime/src/event_handler/notification.rs @@ -12,7 +12,9 @@ const DATA_KEY: &str = "data"; const TIMESTAMP_KEY: &str = "timestamp"; /// Send notification as bytes -pub(crate) fn send(notifier: Notifier, notification: EventNotification) { +pub(crate) fn send(notifier: Notifier, ty: EventNotificationType, data: BTreeMap<&str, String>) { + let notification = EventNotification::new(ty, data); + if let Ok(json) = notification.to_json() { let _ = notifier.notify(json); } else { diff --git a/homestar-runtime/src/event_handler/swarm_event.rs b/homestar-runtime/src/event_handler/swarm_event.rs index d2717783..4c5d1539 100644 --- a/homestar-runtime/src/event_handler/swarm_event.rs +++ b/homestar-runtime/src/event_handler/swarm_event.rs @@ -7,7 +7,7 @@ use crate::{ db::{Connection, Database}, event_handler::{ event::QueryRecord, - notification::{self, EventNotification, EventNotificationType, SwarmNotification}, + notification::{self, EventNotificationType, SwarmNotification}, Event, Handler, RequestResponseError, }, libp2p::multiaddr::MultiaddrExt, @@ -602,15 +602,11 @@ async fn handle_swarm_event( #[cfg(feature = "websocket-notify")] notification::send( event_handler.ws_sender(), - EventNotification::new( - EventNotificationType::SwarmNotification( - SwarmNotification::ConnnectionEstablished, - ), - btreemap! { - "peer_id" => peer_id.to_string(), - "address" => endpoint.get_remote_address().to_string() - }, - ), + EventNotificationType::SwarmNotification(SwarmNotification::ConnnectionEstablished), + btreemap! { + "peer_id" => peer_id.to_string(), + "address" => endpoint.get_remote_address().to_string() + }, ); } SwarmEvent::ConnectionClosed { @@ -651,13 +647,11 @@ async fn handle_swarm_event( #[cfg(feature = "websocket-notify")] notification::send( event_handler.ws_sender(), - EventNotification::new( - EventNotificationType::SwarmNotification(SwarmNotification::ConnnectionClosed), - btreemap! { - "peer_id" => peer_id.to_string(), - "address" => endpoint.get_remote_address().to_string() - }, - ), + EventNotificationType::SwarmNotification(SwarmNotification::ConnnectionClosed), + btreemap! { + "peer_id" => peer_id.to_string(), + "address" => endpoint.get_remote_address().to_string() + }, ); } SwarmEvent::OutgoingConnectionError { From 73da4a2c39cd9480a6f996f580cd39d501902cea Mon Sep 17 00:00:00 2001 From: Brian Ginsburg Date: Sat, 4 Nov 2023 15:30:05 -0700 Subject: [PATCH 13/24] chore: Add connection error notifications --- .../src/event_handler/notification.rs | 14 ++++++++-- .../src/event_handler/swarm_event.rs | 27 +++++++++++++++++-- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/homestar-runtime/src/event_handler/notification.rs b/homestar-runtime/src/event_handler/notification.rs index a2a71e74..77f29ea4 100644 --- a/homestar-runtime/src/event_handler/notification.rs +++ b/homestar-runtime/src/event_handler/notification.rs @@ -125,6 +125,8 @@ impl TryFrom for EventNotificationType { pub(crate) enum SwarmNotification { ConnnectionEstablished, ConnnectionClosed, + OutgoingConnectionError, + IncomingConnectionError, } impl DagJson for SwarmNotification where Ipld: From {} @@ -137,6 +139,12 @@ impl From for Ipld { Ipld::String("connectionEstablished".into()) } SwarmNotification::ConnnectionClosed => Ipld::String("connectionClosed".into()), + SwarmNotification::OutgoingConnectionError => { + Ipld::String("outgoingConnectionError".into()) + } + SwarmNotification::IncomingConnectionError => { + Ipld::String("incomingConnectionError".into()) + } } } } @@ -148,8 +156,10 @@ impl TryFrom for SwarmNotification { let ty = from_ipld::(ipld)?; match ty.as_str() { - "connectionEstablished" => Ok(SwarmNotification::ConnnectionEstablished), - "connectionClosed" => Ok(SwarmNotification::ConnnectionClosed), + "connectionEstablished" => Ok(Self::ConnnectionEstablished), + "connectionClosed" => Ok(Self::ConnnectionClosed), + "outgoingConnectionError" => Ok(Self::OutgoingConnectionError), + "incomingConnectionError" => Ok(Self::IncomingConnectionError), _ => Err(anyhow!("Missing notification type.")), } } diff --git a/homestar-runtime/src/event_handler/swarm_event.rs b/homestar-runtime/src/event_handler/swarm_event.rs index 4c5d1539..735328f6 100644 --- a/homestar-runtime/src/event_handler/swarm_event.rs +++ b/homestar-runtime/src/event_handler/swarm_event.rs @@ -664,7 +664,19 @@ async fn handle_swarm_event( err=?error, connection_id=?connection_id, "outgoing connection error" - ) + ); + + #[cfg(feature = "websocket-notify")] + notification::send( + event_handler.ws_sender(), + EventNotificationType::SwarmNotification( + SwarmNotification::OutgoingConnectionError, + ), + btreemap! { + "peer_id" => peer_id.map_or("Unknown peer".into(), |p| p.to_string()), + "error" => error.to_string() + }, + ); } SwarmEvent::IncomingConnectionError { connection_id, @@ -678,7 +690,18 @@ async fn handle_swarm_event( local_address=local_addr.to_string(), remote_address=send_back_addr.to_string(), "incoming connection error" - ) + ); + + #[cfg(feature = "websocket-notify")] + notification::send( + event_handler.ws_sender(), + EventNotificationType::SwarmNotification( + SwarmNotification::IncomingConnectionError, + ), + btreemap! { + "error" => error.to_string() + }, + ); } SwarmEvent::ListenerError { listener_id, error } => { error!(err=?error, listener_id=?listener_id, "listener error") From 5b5dcc30f98ae70e9c876ce45f5b01ceaf4efa63 Mon Sep 17 00:00:00 2001 From: Brian Ginsburg Date: Sat, 4 Nov 2023 15:43:36 -0700 Subject: [PATCH 14/24] chore: Add listening on notification --- .../src/event_handler/notification.rs | 3 +++ homestar-runtime/src/event_handler/swarm_event.rs | 15 +++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/homestar-runtime/src/event_handler/notification.rs b/homestar-runtime/src/event_handler/notification.rs index 77f29ea4..eabf89bb 100644 --- a/homestar-runtime/src/event_handler/notification.rs +++ b/homestar-runtime/src/event_handler/notification.rs @@ -125,6 +125,7 @@ impl TryFrom for EventNotificationType { pub(crate) enum SwarmNotification { ConnnectionEstablished, ConnnectionClosed, + ListeningOn, OutgoingConnectionError, IncomingConnectionError, } @@ -139,6 +140,7 @@ impl From for Ipld { Ipld::String("connectionEstablished".into()) } SwarmNotification::ConnnectionClosed => Ipld::String("connectionClosed".into()), + SwarmNotification::ListeningOn => Ipld::String("listeningOn".into()), SwarmNotification::OutgoingConnectionError => { Ipld::String("outgoingConnectionError".into()) } @@ -158,6 +160,7 @@ impl TryFrom for SwarmNotification { match ty.as_str() { "connectionEstablished" => Ok(Self::ConnnectionEstablished), "connectionClosed" => Ok(Self::ConnnectionClosed), + "listeningOn" => Ok(Self::ListeningOn), "outgoingConnectionError" => Ok(Self::OutgoingConnectionError), "incomingConnectionError" => Ok(Self::IncomingConnectionError), _ => Err(anyhow!("Missing notification type.")), diff --git a/homestar-runtime/src/event_handler/swarm_event.rs b/homestar-runtime/src/event_handler/swarm_event.rs index 735328f6..99f65f90 100644 --- a/homestar-runtime/src/event_handler/swarm_event.rs +++ b/homestar-runtime/src/event_handler/swarm_event.rs @@ -584,9 +584,20 @@ async fn handle_swarm_event( } SwarmEvent::NewListenAddr { address, .. } => { let local_peer = *event_handler.swarm.local_peer_id(); + info!( - "local node is listening on {}", - address.with(Protocol::P2p(local_peer)) + peer_id = local_peer.to_string(), + "local node is listening on {}", address + ); + + #[cfg(feature = "websocket-notify")] + notification::send( + event_handler.ws_sender(), + EventNotificationType::SwarmNotification(SwarmNotification::ListeningOn), + btreemap! { + "peer_id" => local_peer.to_string(), + "address" => address.to_string() + }, ); } SwarmEvent::IncomingConnection { .. } => {} From 153736576ded9ac4d1d06d74562e76ec519c4a48 Mon Sep 17 00:00:00 2001 From: Brian Ginsburg Date: Sun, 5 Nov 2023 09:30:03 -0800 Subject: [PATCH 15/24] refactor: Move serialization to event notification type --- .../src/event_handler/notification.rs | 64 +++++++++---------- 1 file changed, 30 insertions(+), 34 deletions(-) diff --git a/homestar-runtime/src/event_handler/notification.rs b/homestar-runtime/src/event_handler/notification.rs index eabf89bb..5ab9e257 100644 --- a/homestar-runtime/src/event_handler/notification.rs +++ b/homestar-runtime/src/event_handler/notification.rs @@ -4,7 +4,7 @@ use chrono::prelude::Utc; use homestar_core::ipld::DagJson; use libipld::{serde::from_ipld, Ipld}; use serde::{Deserialize, Serialize}; -use std::collections::BTreeMap; +use std::{collections::BTreeMap, fmt, str::FromStr}; use tracing::warn; const TYPE_KEY: &str = "type"; @@ -95,9 +95,11 @@ pub(crate) enum EventNotificationType { impl DagJson for EventNotificationType where Ipld: From {} impl From for Ipld { - fn from(event_type: EventNotificationType) -> Self { - match event_type { - EventNotificationType::SwarmNotification(ty) => ty.into(), + fn from(ty: EventNotificationType) -> Self { + match ty { + EventNotificationType::SwarmNotification(subtype) => { + Ipld::String(format!("network:{}", subtype)) + } } } } @@ -106,16 +108,17 @@ impl TryFrom for EventNotificationType { type Error = anyhow::Error; fn try_from(ipld: Ipld) -> Result { - let ty = from_ipld::(ipld)?; - - match ty.as_str() { - "connectionEstablished" => Ok(EventNotificationType::SwarmNotification( - SwarmNotification::ConnnectionEstablished, - )), - "connectionClosed" => Ok(EventNotificationType::SwarmNotification( - SwarmNotification::ConnnectionClosed, - )), - _ => Err(anyhow!("Missing notification type.")), + if let Some((ty, subtype)) = from_ipld::(ipld)?.split_once(':') { + match ty { + "network" => Ok(EventNotificationType::SwarmNotification( + SwarmNotification::from_str(subtype)?, + )), + _ => Err(anyhow!("Missing event notification type: {}", ty)), + } + } else { + Err(anyhow!( + "Event notification type missing colon delimiter between type and subtype." + )) } } } @@ -130,40 +133,33 @@ pub(crate) enum SwarmNotification { IncomingConnectionError, } -impl DagJson for SwarmNotification where Ipld: From {} - -#[allow(unused_variables, non_snake_case)] -impl From for Ipld { - fn from(notification: SwarmNotification) -> Self { - match notification { - SwarmNotification::ConnnectionEstablished => { - Ipld::String("connectionEstablished".into()) - } - SwarmNotification::ConnnectionClosed => Ipld::String("connectionClosed".into()), - SwarmNotification::ListeningOn => Ipld::String("listeningOn".into()), +impl fmt::Display for SwarmNotification { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match *self { + SwarmNotification::ConnnectionEstablished => write!(f, "connectionEstablished"), + SwarmNotification::ConnnectionClosed => write!(f, "connectionClosed"), + SwarmNotification::ListeningOn => write!(f, "listeningOn"), SwarmNotification::OutgoingConnectionError => { - Ipld::String("outgoingConnectionError".into()) + write!(f, "outgoingConnectionError") } SwarmNotification::IncomingConnectionError => { - Ipld::String("incomingConnectionError".into()) + write!(f, "incomingConnectionError") } } } } -impl TryFrom for SwarmNotification { - type Error = anyhow::Error; - - fn try_from(ipld: Ipld) -> Result { - let ty = from_ipld::(ipld)?; +impl FromStr for SwarmNotification { + type Err = anyhow::Error; - match ty.as_str() { + fn from_str(ty: &str) -> Result { + match ty { "connectionEstablished" => Ok(Self::ConnnectionEstablished), "connectionClosed" => Ok(Self::ConnnectionClosed), "listeningOn" => Ok(Self::ListeningOn), "outgoingConnectionError" => Ok(Self::OutgoingConnectionError), "incomingConnectionError" => Ok(Self::IncomingConnectionError), - _ => Err(anyhow!("Missing notification type.")), + _ => Err(anyhow!("Missing swarm notification type: {}", ty)), } } } From 7a12666b0ccc9c5bc8f61e59a779e1d89d757481 Mon Sep 17 00:00:00 2001 From: Brian Ginsburg Date: Sun, 5 Nov 2023 10:06:34 -0800 Subject: [PATCH 16/24] chore: Move swarm notification types into a module --- .../src/event_handler/notification.rs | 46 ++----------------- .../src/event_handler/notification/swarm.rs | 44 ++++++++++++++++++ 2 files changed, 48 insertions(+), 42 deletions(-) create mode 100644 homestar-runtime/src/event_handler/notification/swarm.rs diff --git a/homestar-runtime/src/event_handler/notification.rs b/homestar-runtime/src/event_handler/notification.rs index 5ab9e257..0efa1404 100644 --- a/homestar-runtime/src/event_handler/notification.rs +++ b/homestar-runtime/src/event_handler/notification.rs @@ -4,9 +4,12 @@ use chrono::prelude::Utc; use homestar_core::ipld::DagJson; use libipld::{serde::from_ipld, Ipld}; use serde::{Deserialize, Serialize}; -use std::{collections::BTreeMap, fmt, str::FromStr}; +use std::{collections::BTreeMap, str::FromStr}; use tracing::warn; +pub(crate) mod swarm; +pub(crate) use swarm::SwarmNotification; + const TYPE_KEY: &str = "type"; const DATA_KEY: &str = "data"; const TIMESTAMP_KEY: &str = "timestamp"; @@ -123,47 +126,6 @@ impl TryFrom for EventNotificationType { } } -// Types of swarm notification sent to clients -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -pub(crate) enum SwarmNotification { - ConnnectionEstablished, - ConnnectionClosed, - ListeningOn, - OutgoingConnectionError, - IncomingConnectionError, -} - -impl fmt::Display for SwarmNotification { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match *self { - SwarmNotification::ConnnectionEstablished => write!(f, "connectionEstablished"), - SwarmNotification::ConnnectionClosed => write!(f, "connectionClosed"), - SwarmNotification::ListeningOn => write!(f, "listeningOn"), - SwarmNotification::OutgoingConnectionError => { - write!(f, "outgoingConnectionError") - } - SwarmNotification::IncomingConnectionError => { - write!(f, "incomingConnectionError") - } - } - } -} - -impl FromStr for SwarmNotification { - type Err = anyhow::Error; - - fn from_str(ty: &str) -> Result { - match ty { - "connectionEstablished" => Ok(Self::ConnnectionEstablished), - "connectionClosed" => Ok(Self::ConnnectionClosed), - "listeningOn" => Ok(Self::ListeningOn), - "outgoingConnectionError" => Ok(Self::OutgoingConnectionError), - "incomingConnectionError" => Ok(Self::IncomingConnectionError), - _ => Err(anyhow!("Missing swarm notification type: {}", ty)), - } - } -} - #[cfg(test)] mod test { use super::*; diff --git a/homestar-runtime/src/event_handler/notification/swarm.rs b/homestar-runtime/src/event_handler/notification/swarm.rs new file mode 100644 index 00000000..8e98947b --- /dev/null +++ b/homestar-runtime/src/event_handler/notification/swarm.rs @@ -0,0 +1,44 @@ +use anyhow::anyhow; +use serde::{Deserialize, Serialize}; +use std::{fmt, str::FromStr}; + +// Swarm notification types sent to clients +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub(crate) enum SwarmNotification { + ConnnectionEstablished, + ConnnectionClosed, + ListeningOn, + OutgoingConnectionError, + IncomingConnectionError, +} + +impl fmt::Display for SwarmNotification { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match *self { + SwarmNotification::ConnnectionEstablished => write!(f, "connectionEstablished"), + SwarmNotification::ConnnectionClosed => write!(f, "connectionClosed"), + SwarmNotification::ListeningOn => write!(f, "listeningOn"), + SwarmNotification::OutgoingConnectionError => { + write!(f, "outgoingConnectionError") + } + SwarmNotification::IncomingConnectionError => { + write!(f, "incomingConnectionError") + } + } + } +} + +impl FromStr for SwarmNotification { + type Err = anyhow::Error; + + fn from_str(ty: &str) -> Result { + match ty { + "connectionEstablished" => Ok(Self::ConnnectionEstablished), + "connectionClosed" => Ok(Self::ConnnectionClosed), + "listeningOn" => Ok(Self::ListeningOn), + "outgoingConnectionError" => Ok(Self::OutgoingConnectionError), + "incomingConnectionError" => Ok(Self::IncomingConnectionError), + _ => Err(anyhow!("Missing swarm notification type: {}", ty)), + } + } +} From 7086ef92ab1563bf7005705774ab3d1a6fffcec7 Mon Sep 17 00:00:00 2001 From: Brian Ginsburg Date: Sun, 5 Nov 2023 10:10:24 -0800 Subject: [PATCH 17/24] chore: Add comments --- homestar-runtime/src/event_handler/notification.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/homestar-runtime/src/event_handler/notification.rs b/homestar-runtime/src/event_handler/notification.rs index 0efa1404..70d479d8 100644 --- a/homestar-runtime/src/event_handler/notification.rs +++ b/homestar-runtime/src/event_handler/notification.rs @@ -14,7 +14,7 @@ const TYPE_KEY: &str = "type"; const DATA_KEY: &str = "data"; const TIMESTAMP_KEY: &str = "timestamp"; -/// Send notification as bytes +/// Send notification as bytes. pub(crate) fn send(notifier: Notifier, ty: EventNotificationType, data: BTreeMap<&str, String>) { let notification = EventNotification::new(ty, data); @@ -25,6 +25,7 @@ pub(crate) fn send(notifier: Notifier, ty: EventNotificationType, data: BTreeMap } } +/// Notification sent to clients. #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub(crate) struct EventNotification { ty: EventNotificationType, @@ -90,6 +91,7 @@ impl TryFrom for EventNotification { } } +/// Types of notification sent to clients. #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub(crate) enum EventNotificationType { SwarmNotification(SwarmNotification), From 48308132869a360c5bffd6f991dce0fb29ab0710 Mon Sep 17 00:00:00 2001 From: Brian Ginsburg Date: Mon, 6 Nov 2023 09:32:10 -0800 Subject: [PATCH 18/24] chore: Update sent message format --- .../src/event_handler/notification.rs | 17 ++++++++++++++--- .../src/event_handler/swarm_event.rs | 10 +++++----- homestar-runtime/src/network/webserver.rs | 1 + 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/homestar-runtime/src/event_handler/notification.rs b/homestar-runtime/src/event_handler/notification.rs index 70d479d8..e09f96c3 100644 --- a/homestar-runtime/src/event_handler/notification.rs +++ b/homestar-runtime/src/event_handler/notification.rs @@ -1,4 +1,7 @@ -use crate::network::webserver::Notifier; +use crate::network::webserver::{ + notifier::{self, Header, Message, Notifier, SubscriptionTyp}, + SUBSCRIBE_NETWORK_EVENTS_ENDPOINT, +}; use anyhow::anyhow; use chrono::prelude::Utc; use homestar_core::ipld::DagJson; @@ -15,11 +18,19 @@ const DATA_KEY: &str = "data"; const TIMESTAMP_KEY: &str = "timestamp"; /// Send notification as bytes. -pub(crate) fn send(notifier: Notifier, ty: EventNotificationType, data: BTreeMap<&str, String>) { +pub(crate) fn send( + notifier: Notifier, + ty: EventNotificationType, + data: BTreeMap<&str, String>, +) { + let header = Header::new( + SubscriptionTyp::EventSub(SUBSCRIBE_NETWORK_EVENTS_ENDPOINT.to_string()), + None, + ); let notification = EventNotification::new(ty, data); if let Ok(json) = notification.to_json() { - let _ = notifier.notify(json); + let _ = notifier.notify(Message::new(header, json)); } else { warn!("Unable to serialize notification as bytes: {notification:?}"); } diff --git a/homestar-runtime/src/event_handler/swarm_event.rs b/homestar-runtime/src/event_handler/swarm_event.rs index 99f65f90..0c1c36e0 100644 --- a/homestar-runtime/src/event_handler/swarm_event.rs +++ b/homestar-runtime/src/event_handler/swarm_event.rs @@ -592,7 +592,7 @@ async fn handle_swarm_event( #[cfg(feature = "websocket-notify")] notification::send( - event_handler.ws_sender(), + event_handler.ws_evt_sender(), EventNotificationType::SwarmNotification(SwarmNotification::ListeningOn), btreemap! { "peer_id" => local_peer.to_string(), @@ -612,7 +612,7 @@ async fn handle_swarm_event( #[cfg(feature = "websocket-notify")] notification::send( - event_handler.ws_sender(), + event_handler.ws_evt_sender(), EventNotificationType::SwarmNotification(SwarmNotification::ConnnectionEstablished), btreemap! { "peer_id" => peer_id.to_string(), @@ -657,7 +657,7 @@ async fn handle_swarm_event( #[cfg(feature = "websocket-notify")] notification::send( - event_handler.ws_sender(), + event_handler.ws_evt_sender(), EventNotificationType::SwarmNotification(SwarmNotification::ConnnectionClosed), btreemap! { "peer_id" => peer_id.to_string(), @@ -679,7 +679,7 @@ async fn handle_swarm_event( #[cfg(feature = "websocket-notify")] notification::send( - event_handler.ws_sender(), + event_handler.ws_evt_sender(), EventNotificationType::SwarmNotification( SwarmNotification::OutgoingConnectionError, ), @@ -705,7 +705,7 @@ async fn handle_swarm_event( #[cfg(feature = "websocket-notify")] notification::send( - event_handler.ws_sender(), + event_handler.ws_evt_sender(), EventNotificationType::SwarmNotification( SwarmNotification::IncomingConnectionError, ), diff --git a/homestar-runtime/src/network/webserver.rs b/homestar-runtime/src/network/webserver.rs index 738986c0..f3150530 100644 --- a/homestar-runtime/src/network/webserver.rs +++ b/homestar-runtime/src/network/webserver.rs @@ -32,6 +32,7 @@ mod rpc; #[cfg(feature = "websocket-notify")] pub(crate) use notifier::Notifier; +pub(crate) use rpc::SUBSCRIBE_NETWORK_EVENTS_ENDPOINT; use rpc::{Context, JsonRpc}; /// Message type for messages sent back from the From 8207f2e50110063e9a8b63029549a1fcd10ce2a7 Mon Sep 17 00:00:00 2001 From: Brian Ginsburg Date: Mon, 6 Nov 2023 10:48:36 -0800 Subject: [PATCH 19/24] test: Add connection notifications test --- homestar-runtime/tests/network.rs | 2 + .../tests/network/notification.rs | 125 ++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 homestar-runtime/tests/network/notification.rs diff --git a/homestar-runtime/tests/network.rs b/homestar-runtime/tests/network.rs index 6231546a..5c039d7d 100644 --- a/homestar-runtime/tests/network.rs +++ b/homestar-runtime/tests/network.rs @@ -8,6 +8,8 @@ use std::{ time::Duration, }; +mod notification; + #[allow(dead_code)] static BIN: Lazy = Lazy::new(|| assert_cmd::cargo::cargo_bin(BIN_NAME)); diff --git a/homestar-runtime/tests/network/notification.rs b/homestar-runtime/tests/network/notification.rs new file mode 100644 index 00000000..0ad00437 --- /dev/null +++ b/homestar-runtime/tests/network/notification.rs @@ -0,0 +1,125 @@ +use crate::utils::{kill_homestar, stop_homestar, BIN_NAME}; +use anyhow::Result; +use jsonrpsee::{ + core::client::{Subscription, SubscriptionClientT}, + rpc_params, + ws_client::WsClientBuilder, +}; +use once_cell::sync::Lazy; +use retry::{delay::Exponential, retry}; +use serial_test::file_serial; +use std::{ + net::{IpAddr, Ipv4Addr, Shutdown, SocketAddr, TcpStream}, + path::PathBuf, + process::{Command, Stdio}, + time::Duration, +}; + +static BIN: Lazy = Lazy::new(|| assert_cmd::cargo::cargo_bin(BIN_NAME)); +const SUBSCRIBE_NETWORK_EVENTS_ENDPOINT: &str = "subscribe_network_events"; +const UNSUBSCRIBE_NETWORK_EVENTS_ENDPOINT: &str = "unsubscribe_network_events"; + +#[test] +#[file_serial] +fn test_connection_notifications_serial() -> Result<()> { + let _ = stop_homestar(); + + let homestar_proc1 = Command::new(BIN.as_os_str()) + .env( + "RUST_LOG", + "homestar=debug,homestar_runtime=debug,libp2p=debug,libp2p_gossipsub::behaviour=debug", + ) + .arg("start") + .arg("-c") + .arg("tests/fixtures/test_network1.toml") + .arg("--db") + .arg("homestar1.db") + .stdout(Stdio::piped()) + .spawn() + .unwrap(); + + let ws_port = 8020; + let socket = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), ws_port); + let result = retry(Exponential::from_millis(1000).take(10), || { + TcpStream::connect(socket).map(|stream| stream.shutdown(Shutdown::Both)) + }); + + if result.is_err() { + let _ = kill_homestar(homestar_proc1, None); + panic!("Homestar server/runtime failed to start in time"); + } + + let ws_url = format!("ws://{}:{}", Ipv4Addr::LOCALHOST, ws_port); + tokio_test::block_on(async { + tokio_tungstenite::connect_async(ws_url.clone()) + .await + .unwrap(); + + let client = WsClientBuilder::default() + .build(ws_url.clone()) + .await + .unwrap(); + let mut sub: Subscription> = client + .subscribe( + SUBSCRIBE_NETWORK_EVENTS_ENDPOINT, + rpc_params![], + UNSUBSCRIBE_NETWORK_EVENTS_ENDPOINT, + ) + .await + .unwrap(); + + let homestar_proc2 = Command::new(BIN.as_os_str()) + .env( + "RUST_LOG", + "homestar=debug,homestar_runtime=debug,libp2p=debug,libp2p_gossipsub::behaviour=debug", + ) + .arg("start") + .arg("-c") + .arg("tests/fixtures/test_network2.toml") + .arg("--db") + .arg("homestar2.db") + .stdout(Stdio::piped()) + .spawn() + .unwrap(); + + let _ = kill_homestar(homestar_proc2, None); + + tokio::time::sleep(Duration::from_secs(2)).await; + + { + let msg = sub + .next() + .await + .expect("Subscription did not receive a connection established message"); + let json: serde_json::Value = serde_json::from_slice(&msg.unwrap()).unwrap(); + let typ = json["type"].as_str().unwrap(); + let peer_id = json["data"]["peer_id"].as_str().unwrap(); + + assert_eq!(typ, "network:connectionEstablished"); + assert_eq!( + peer_id, + "16Uiu2HAm3g9AomQNeEctL2hPwLapap7AtPSNt8ZrBny4rLx1W5Dc" + ); + } + + { + let msg = sub + .next() + .await + .expect("Subscription did not receive a connection closed message"); + let json: serde_json::Value = serde_json::from_slice(&msg.unwrap()).unwrap(); + let typ = json["type"].as_str().unwrap(); + let peer_id = json["data"]["peer_id"].as_str().unwrap(); + + assert_eq!(typ, "network:connectionClosed"); + assert_eq!( + peer_id, + "16Uiu2HAm3g9AomQNeEctL2hPwLapap7AtPSNt8ZrBny4rLx1W5Dc" + ); + } + }); + + let _ = kill_homestar(homestar_proc1, None); + + Ok(()) +} From 53345f2bb3e4647bd324a9f764d115a3df55b923 Mon Sep 17 00:00:00 2001 From: Brian Ginsburg Date: Mon, 6 Nov 2023 10:58:14 -0800 Subject: [PATCH 20/24] test: Fix libp2p listens on address test --- homestar-runtime/tests/network.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/homestar-runtime/tests/network.rs b/homestar-runtime/tests/network.rs index 5c039d7d..300ae0c9 100644 --- a/homestar-runtime/tests/network.rs +++ b/homestar-runtime/tests/network.rs @@ -64,7 +64,8 @@ fn test_libp2p_listens_on_address_serial() -> Result<()> { stdout, vec![ "local node is listening", - "/ip4/127.0.0.1/tcp/7000/p2p/12D3KooWDpJ7As7BWAwRMfu1VU2WCqNjvq387JEYKDBj4kx6nXTN", + "/ip4/127.0.0.1/tcp/7000", + "12D3KooWDpJ7As7BWAwRMfu1VU2WCqNjvq387JEYKDBj4kx6nXTN", ], ); From 46c78f3d8c3be2d4aeac7bc5942b2466b24c8c0b Mon Sep 17 00:00:00 2001 From: Brian Ginsburg Date: Mon, 6 Nov 2023 11:03:07 -0800 Subject: [PATCH 21/24] chore: Rename to use typ --- .../src/event_handler/notification.rs | 42 +++++++++---------- .../src/event_handler/swarm_event.rs | 16 +++---- 2 files changed, 27 insertions(+), 31 deletions(-) diff --git a/homestar-runtime/src/event_handler/notification.rs b/homestar-runtime/src/event_handler/notification.rs index e09f96c3..0b46e171 100644 --- a/homestar-runtime/src/event_handler/notification.rs +++ b/homestar-runtime/src/event_handler/notification.rs @@ -20,7 +20,7 @@ const TIMESTAMP_KEY: &str = "timestamp"; /// Send notification as bytes. pub(crate) fn send( notifier: Notifier, - ty: EventNotificationType, + ty: EventNotificationTyp, data: BTreeMap<&str, String>, ) { let header = Header::new( @@ -39,20 +39,20 @@ pub(crate) fn send( /// Notification sent to clients. #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub(crate) struct EventNotification { - ty: EventNotificationType, + typ: EventNotificationTyp, data: Ipld, timestamp: i64, } impl EventNotification { - pub(crate) fn new(ty: EventNotificationType, data: BTreeMap<&str, String>) -> Self { + pub(crate) fn new(typ: EventNotificationTyp, data: BTreeMap<&str, String>) -> Self { let ipld_data = data .iter() .map(|(key, val)| (key.to_string(), Ipld::String(val.to_owned()))) .collect(); Self { - ty, + typ, data: Ipld::Map(ipld_data), timestamp: Utc::now().timestamp_millis(), } @@ -64,7 +64,7 @@ impl DagJson for EventNotification where Ipld: From {} impl From for Ipld { fn from(notification: EventNotification) -> Self { Ipld::Map(BTreeMap::from([ - ("type".into(), notification.ty.into()), + ("type".into(), notification.typ.into()), ("data".into(), notification.data), ("timestamp".into(), notification.timestamp.into()), ])) @@ -77,7 +77,7 @@ impl TryFrom for EventNotification { fn try_from(ipld: Ipld) -> Result { let map = from_ipld::>(ipld)?; - let ty: EventNotificationType = map + let typ: EventNotificationTyp = map .get(TYPE_KEY) .ok_or_else(|| anyhow!("missing {TYPE_KEY}"))? .to_owned() @@ -95,7 +95,7 @@ impl TryFrom for EventNotification { )?; Ok(EventNotification { - ty, + typ, data, timestamp, }) @@ -104,29 +104,29 @@ impl TryFrom for EventNotification { /// Types of notification sent to clients. #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -pub(crate) enum EventNotificationType { +pub(crate) enum EventNotificationTyp { SwarmNotification(SwarmNotification), } -impl DagJson for EventNotificationType where Ipld: From {} +impl DagJson for EventNotificationTyp where Ipld: From {} -impl From for Ipld { - fn from(ty: EventNotificationType) -> Self { - match ty { - EventNotificationType::SwarmNotification(subtype) => { +impl From for Ipld { + fn from(typ: EventNotificationTyp) -> Self { + match typ { + EventNotificationTyp::SwarmNotification(subtype) => { Ipld::String(format!("network:{}", subtype)) } } } } -impl TryFrom for EventNotificationType { +impl TryFrom for EventNotificationTyp { type Error = anyhow::Error; fn try_from(ipld: Ipld) -> Result { if let Some((ty, subtype)) = from_ipld::(ipld)?.split_once(':') { match ty { - "network" => Ok(EventNotificationType::SwarmNotification( + "network" => Ok(EventNotificationTyp::SwarmNotification( SwarmNotification::from_str(subtype)?, )), _ => Err(anyhow!("Missing event notification type: {}", ty)), @@ -151,7 +151,7 @@ mod test { let address: String = "/ip4/127.0.0.1/tcp/7000".to_string(); let notification = EventNotification::new( - EventNotificationType::SwarmNotification(SwarmNotification::ConnnectionEstablished), + EventNotificationTyp::SwarmNotification(SwarmNotification::ConnnectionEstablished), btreemap! { "peer_id" => peer_id.clone(), "address" => address.clone() @@ -163,8 +163,8 @@ mod test { let data: BTreeMap = from_ipld(parsed.data).unwrap(); assert_eq!( - parsed.ty, - EventNotificationType::SwarmNotification(SwarmNotification::ConnnectionEstablished) + parsed.typ, + EventNotificationTyp::SwarmNotification(SwarmNotification::ConnnectionEstablished) ); assert_eq!(data.get("peer_id").unwrap(), &peer_id); assert_eq!(data.get("address").unwrap(), &address); @@ -176,7 +176,7 @@ mod test { let address: String = "/ip4/127.0.0.1/tcp/7000".to_string(); let notification = EventNotification::new( - EventNotificationType::SwarmNotification(SwarmNotification::ConnnectionEstablished), + EventNotificationTyp::SwarmNotification(SwarmNotification::ConnnectionEstablished), btreemap! { "peer_id" => peer_id.clone(), "address" => address.clone() @@ -188,8 +188,8 @@ mod test { let data: BTreeMap = from_ipld(parsed.data).unwrap(); assert_eq!( - parsed.ty, - EventNotificationType::SwarmNotification(SwarmNotification::ConnnectionEstablished) + parsed.typ, + EventNotificationTyp::SwarmNotification(SwarmNotification::ConnnectionEstablished) ); assert_eq!(data.get("peer_id").unwrap(), &peer_id); assert_eq!(data.get("address").unwrap(), &address); diff --git a/homestar-runtime/src/event_handler/swarm_event.rs b/homestar-runtime/src/event_handler/swarm_event.rs index 0c1c36e0..b9e952a8 100644 --- a/homestar-runtime/src/event_handler/swarm_event.rs +++ b/homestar-runtime/src/event_handler/swarm_event.rs @@ -7,7 +7,7 @@ use crate::{ db::{Connection, Database}, event_handler::{ event::QueryRecord, - notification::{self, EventNotificationType, SwarmNotification}, + notification::{self, EventNotificationTyp, SwarmNotification}, Event, Handler, RequestResponseError, }, libp2p::multiaddr::MultiaddrExt, @@ -593,7 +593,7 @@ async fn handle_swarm_event( #[cfg(feature = "websocket-notify")] notification::send( event_handler.ws_evt_sender(), - EventNotificationType::SwarmNotification(SwarmNotification::ListeningOn), + EventNotificationTyp::SwarmNotification(SwarmNotification::ListeningOn), btreemap! { "peer_id" => local_peer.to_string(), "address" => address.to_string() @@ -613,7 +613,7 @@ async fn handle_swarm_event( #[cfg(feature = "websocket-notify")] notification::send( event_handler.ws_evt_sender(), - EventNotificationType::SwarmNotification(SwarmNotification::ConnnectionEstablished), + EventNotificationTyp::SwarmNotification(SwarmNotification::ConnnectionEstablished), btreemap! { "peer_id" => peer_id.to_string(), "address" => endpoint.get_remote_address().to_string() @@ -658,7 +658,7 @@ async fn handle_swarm_event( #[cfg(feature = "websocket-notify")] notification::send( event_handler.ws_evt_sender(), - EventNotificationType::SwarmNotification(SwarmNotification::ConnnectionClosed), + EventNotificationTyp::SwarmNotification(SwarmNotification::ConnnectionClosed), btreemap! { "peer_id" => peer_id.to_string(), "address" => endpoint.get_remote_address().to_string() @@ -680,9 +680,7 @@ async fn handle_swarm_event( #[cfg(feature = "websocket-notify")] notification::send( event_handler.ws_evt_sender(), - EventNotificationType::SwarmNotification( - SwarmNotification::OutgoingConnectionError, - ), + EventNotificationTyp::SwarmNotification(SwarmNotification::OutgoingConnectionError), btreemap! { "peer_id" => peer_id.map_or("Unknown peer".into(), |p| p.to_string()), "error" => error.to_string() @@ -706,9 +704,7 @@ async fn handle_swarm_event( #[cfg(feature = "websocket-notify")] notification::send( event_handler.ws_evt_sender(), - EventNotificationType::SwarmNotification( - SwarmNotification::IncomingConnectionError, - ), + EventNotificationTyp::SwarmNotification(SwarmNotification::IncomingConnectionError), btreemap! { "error" => error.to_string() }, From 18ee2973ef41d2842f59b442d6891a4eab23a915 Mon Sep 17 00:00:00 2001 From: Brian Ginsburg Date: Mon, 6 Nov 2023 11:09:49 -0800 Subject: [PATCH 22/24] chore: Remove print line --- homestar-runtime/src/tasks/fetch.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/homestar-runtime/src/tasks/fetch.rs b/homestar-runtime/src/tasks/fetch.rs index f3f5d9d6..6b1deecc 100644 --- a/homestar-runtime/src/tasks/fetch.rs +++ b/homestar-runtime/src/tasks/fetch.rs @@ -42,7 +42,6 @@ impl Fetch { tasks.try_collect::>().await?.into_iter().try_fold( IndexMap::default(), |mut acc, res| { - println!("NOT TEST"); let answer = res.1?; acc.insert(res.0, answer); From df7b34017b5751f9ddcc64f855d8740e0a70677b Mon Sep 17 00:00:00 2001 From: Brian Ginsburg Date: Tue, 7 Nov 2023 10:02:51 -0800 Subject: [PATCH 23/24] chore: Move receipt notification to event handler --- homestar-runtime/src/event_handler/event.rs | 70 ++++--------------- .../src/event_handler/notification.rs | 59 ++++++++++++++-- .../src/event_handler/notification/receipt.rs | 44 ++++++++++++ .../src/event_handler/swarm_event.rs | 10 +-- homestar-runtime/src/network/webserver.rs | 10 +-- .../src/network/webserver/notifier.rs | 45 +----------- homestar-runtime/tests/network.rs | 1 + 7 files changed, 122 insertions(+), 117 deletions(-) create mode 100644 homestar-runtime/src/event_handler/notification/receipt.rs diff --git a/homestar-runtime/src/event_handler/event.rs b/homestar-runtime/src/event_handler/event.rs index 368f0325..7c222cf7 100644 --- a/homestar-runtime/src/event_handler/event.rs +++ b/homestar-runtime/src/event_handler/event.rs @@ -2,7 +2,7 @@ use super::EventHandler; #[cfg(feature = "websocket-notify")] -use crate::network::webserver::notifier::{Header, Message, NotifyReceipt, SubscriptionTyp}; +use crate::event_handler::notification::emit_receipt; #[cfg(feature = "ipfs")] use crate::network::IpfsCli; use crate::{ @@ -16,15 +16,9 @@ use crate::{ }; use anyhow::Result; use async_trait::async_trait; -use homestar_core::workflow::Receipt as InvocationReceipt; #[cfg(feature = "websocket-notify")] -use homestar_core::{ - ipld::DagJson, - workflow::{ - receipt::metadata::{WORKFLOW_KEY, WORKFLOW_NAME_KEY}, - Pointer, - }, -}; +use homestar_core::workflow::Pointer; +use homestar_core::workflow::Receipt as InvocationReceipt; use libipld::{Cid, Ipld}; use libp2p::{ kad::{record::Key, Quorum, Record}, @@ -251,23 +245,11 @@ impl Captured { #[cfg(feature = "websocket-notify")] { - let invocation_notification = invocation_receipt.clone(); - let ws_tx = event_handler.ws_workflow_sender(); - let metadata = self.metadata.to_owned(); - let receipt = NotifyReceipt::with(invocation_notification, receipt_cid, metadata); - if let Ok(json) = receipt.to_json() { - info!( - cid = receipt_cid.to_string(), - "Sending receipt to websocket" - ); - let _ = ws_tx.notify(Message::new( - Header::new( - SubscriptionTyp::Cid(self.workflow.cid), - self.workflow.name.clone(), - ), - json, - )); - } + emit_receipt( + event_handler.ws_workflow_sender(), + receipt.clone(), + self.metadata.to_owned(), + ) } if event_handler.pubsub_enabled { @@ -367,37 +349,13 @@ impl Replay { self.pointers.iter().collect::>() ); + #[cfg(feature = "websocket-notify")] receipts.into_iter().for_each(|receipt| { - let invocation_receipt = InvocationReceipt::from(&receipt); - let invocation_notification = invocation_receipt; - let receipt_cid = receipt.cid(); - - let ws_tx = event_handler.ws_workflow_sender(); - let metadata = self.metadata.to_owned(); - let receipt = NotifyReceipt::with(invocation_notification, receipt_cid, metadata); - if let Ok(json) = receipt.to_json() { - info!( - cid = receipt_cid.to_string(), - "Sending receipt to websocket" - ); - - if let Some(ipld) = &self.metadata { - match (ipld.get(WORKFLOW_KEY), ipld.get(WORKFLOW_NAME_KEY)) { - (Ok(Ipld::Link(cid)), Ok(Ipld::String(name))) => { - let header = Header::new( - SubscriptionTyp::Cid(*cid), - Some((name.to_string()).into()), - ); - let _ = ws_tx.notify(Message::new(header, json)); - } - (Ok(Ipld::Link(cid)), Err(_err)) => { - let header = Header::new(SubscriptionTyp::Cid(*cid), None); - let _ = ws_tx.notify(Message::new(header, json)); - } - _ => (), - } - } - } + emit_receipt( + event_handler.ws_workflow_sender(), + receipt, + self.metadata.to_owned(), + ); }); Ok(()) diff --git a/homestar-runtime/src/event_handler/notification.rs b/homestar-runtime/src/event_handler/notification.rs index 0b46e171..8daa09a3 100644 --- a/homestar-runtime/src/event_handler/notification.rs +++ b/homestar-runtime/src/event_handler/notification.rs @@ -1,24 +1,69 @@ -use crate::network::webserver::{ - notifier::{self, Header, Message, Notifier, SubscriptionTyp}, - SUBSCRIBE_NETWORK_EVENTS_ENDPOINT, +use crate::{ + network::webserver::{ + notifier::{self, Header, Message, Notifier, SubscriptionTyp}, + SUBSCRIBE_NETWORK_EVENTS_ENDPOINT, + }, + Receipt, }; use anyhow::anyhow; use chrono::prelude::Utc; -use homestar_core::ipld::DagJson; +use homestar_core::{ + ipld::DagJson, + workflow::{ + receipt::metadata::{WORKFLOW_KEY, WORKFLOW_NAME_KEY}, + Receipt as InvocationReceipt, + }, +}; use libipld::{serde::from_ipld, Ipld}; use serde::{Deserialize, Serialize}; use std::{collections::BTreeMap, str::FromStr}; -use tracing::warn; +use tracing::{info, warn}; +pub(crate) mod receipt; pub(crate) mod swarm; +pub(crate) use receipt::ReceiptNotification; pub(crate) use swarm::SwarmNotification; const TYPE_KEY: &str = "type"; const DATA_KEY: &str = "data"; const TIMESTAMP_KEY: &str = "timestamp"; -/// Send notification as bytes. -pub(crate) fn send( +/// Send receipt notification as bytes. +pub(crate) fn emit_receipt( + notifier: Notifier, + receipt: Receipt, + metadata: Option, +) { + let invocation_receipt = InvocationReceipt::from(&receipt); + let receipt_cid = receipt.cid(); + let notification = ReceiptNotification::with(invocation_receipt, receipt_cid, metadata.clone()); + + if let Ok(json) = notification.to_json() { + info!( + cid = receipt_cid.to_string(), + "Sending receipt to websocket" + ); + if let Some(ipld) = metadata { + match (ipld.get(WORKFLOW_KEY), ipld.get(WORKFLOW_NAME_KEY)) { + (Ok(Ipld::Link(cid)), Ok(Ipld::String(name))) => { + let header = + Header::new(SubscriptionTyp::Cid(*cid), Some((name.to_string()).into())); + let _ = notifier.notify(Message::new(header, json)); + } + (Ok(Ipld::Link(cid)), Err(_err)) => { + let header = Header::new(SubscriptionTyp::Cid(*cid), None); + let _ = notifier.notify(Message::new(header, json)); + } + _ => (), + } + } + } else { + warn!("Unable to serialize receipt as bytes: {receipt:?}"); + } +} + +/// Send event notification as bytes. +pub(crate) fn emit_event( notifier: Notifier, ty: EventNotificationTyp, data: BTreeMap<&str, String>, diff --git a/homestar-runtime/src/event_handler/notification/receipt.rs b/homestar-runtime/src/event_handler/notification/receipt.rs new file mode 100644 index 00000000..f2f222ec --- /dev/null +++ b/homestar-runtime/src/event_handler/notification/receipt.rs @@ -0,0 +1,44 @@ +use homestar_core::{ipld::DagJson, workflow::Receipt}; +use libipld::{ipld, Cid, Ipld}; + +/// A [Receipt] that is sent out *just* for websocket notifications. +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct ReceiptNotification(Ipld); + +impl ReceiptNotification { + /// TODO + #[allow(dead_code)] + pub(crate) fn inner(&self) -> &Ipld { + &self.0 + } + + /// TODO + #[allow(dead_code)] + pub(crate) fn into_inner(self) -> Ipld { + self.0.to_owned() + } + + pub(crate) fn with(receipt: Receipt, cid: Cid, metadata: Option) -> Self { + let receipt: Ipld = receipt.into(); + let data = ipld!({ + "receipt": receipt, + "metadata": metadata.as_ref().map(|m| m.to_owned()).map_or(Ipld::Null, |m| m), + "receipt_cid": cid, + }); + ReceiptNotification(data) + } +} + +impl DagJson for ReceiptNotification where Ipld: From {} + +impl From for Ipld { + fn from(receipt: ReceiptNotification) -> Self { + receipt.0 + } +} + +impl From for ReceiptNotification { + fn from(ipld: Ipld) -> Self { + ReceiptNotification(ipld) + } +} diff --git a/homestar-runtime/src/event_handler/swarm_event.rs b/homestar-runtime/src/event_handler/swarm_event.rs index 309ed3be..2c22db6e 100644 --- a/homestar-runtime/src/event_handler/swarm_event.rs +++ b/homestar-runtime/src/event_handler/swarm_event.rs @@ -720,7 +720,7 @@ async fn handle_swarm_event( ); #[cfg(feature = "websocket-notify")] - notification::send( + notification::emit_event( event_handler.ws_evt_sender(), EventNotificationTyp::SwarmNotification(SwarmNotification::ListeningOn), btreemap! { @@ -741,7 +741,7 @@ async fn handle_swarm_event( .insert(peer_id, endpoint.clone()); #[cfg(feature = "websocket-notify")] - notification::send( + notification::emit_event( event_handler.ws_evt_sender(), EventNotificationTyp::SwarmNotification(SwarmNotification::ConnnectionEstablished), btreemap! { @@ -786,7 +786,7 @@ async fn handle_swarm_event( } #[cfg(feature = "websocket-notify")] - notification::send( + notification::emit_event( event_handler.ws_evt_sender(), EventNotificationTyp::SwarmNotification(SwarmNotification::ConnnectionClosed), btreemap! { @@ -808,7 +808,7 @@ async fn handle_swarm_event( ); #[cfg(feature = "websocket-notify")] - notification::send( + notification::emit_event( event_handler.ws_evt_sender(), EventNotificationTyp::SwarmNotification(SwarmNotification::OutgoingConnectionError), btreemap! { @@ -832,7 +832,7 @@ async fn handle_swarm_event( ); #[cfg(feature = "websocket-notify")] - notification::send( + notification::emit_event( event_handler.ws_evt_sender(), EventNotificationTyp::SwarmNotification(SwarmNotification::IncomingConnectionError), btreemap! { diff --git a/homestar-runtime/src/network/webserver.rs b/homestar-runtime/src/network/webserver.rs index f3150530..91573977 100644 --- a/homestar-runtime/src/network/webserver.rs +++ b/homestar-runtime/src/network/webserver.rs @@ -235,7 +235,7 @@ fn port_available(host: IpAddr, port: u16) -> bool { #[cfg(test)] mod test { use super::*; - use crate::settings::Settings; + use crate::{event_handler::notification::ReceiptNotification, settings::Settings}; use homestar_core::test_utils; #[cfg(feature = "websocket-notify")] use homestar_core::{ @@ -248,7 +248,7 @@ mod test { use jsonrpsee::types::error::ErrorCode; use jsonrpsee::{core::client::ClientT, rpc_params, ws_client::WsClientBuilder}; #[cfg(feature = "websocket-notify")] - use notifier::{self, Header, NotifyReceipt}; + use notifier::{self, Header}; use serial_test::file_serial; use tokio::sync::mpsc; @@ -362,7 +362,7 @@ mod test { // send any bytes through (Vec) let (invocation_receipt, runtime_receipt) = crate::test_utils::receipt::receipts(); - let receipt = NotifyReceipt::with(invocation_receipt, runtime_receipt.cid(), None); + let receipt = ReceiptNotification::with(invocation_receipt, runtime_receipt.cid(), None); server .evt_notifier .notify(notifier::Message::new( @@ -402,11 +402,11 @@ mod test { .unwrap(); let msg1 = sub.next().await.unwrap().unwrap(); - let returned1: NotifyReceipt = DagJson::from_json(&msg1).unwrap(); + let returned1: ReceiptNotification = DagJson::from_json(&msg1).unwrap(); assert_eq!(returned1, receipt); let msg2 = sub.next().await.unwrap().unwrap(); - let _returned1: NotifyReceipt = DagJson::from_json(&msg2).unwrap(); + let _returned1: ReceiptNotification = DagJson::from_json(&msg2).unwrap(); assert!(sub.unsubscribe().await.is_ok()); diff --git a/homestar-runtime/src/network/webserver/notifier.rs b/homestar-runtime/src/network/webserver/notifier.rs index 2630dd15..dc7abd6a 100644 --- a/homestar-runtime/src/network/webserver/notifier.rs +++ b/homestar-runtime/src/network/webserver/notifier.rs @@ -2,8 +2,7 @@ use anyhow::Result; use faststr::FastStr; -use homestar_core::{ipld::DagJson, workflow::Receipt}; -use libipld::{ipld, Cid, Ipld}; +use libipld::Cid; use std::{fmt, sync::Arc}; use tokio::sync::broadcast; @@ -95,45 +94,3 @@ impl Message { &self.payload } } - -/// A [Receipt] that is sent out *just* for websocket notifications. -#[derive(Debug, Clone, PartialEq)] -pub(crate) struct NotifyReceipt(Ipld); - -impl NotifyReceipt { - /// TODO - #[allow(dead_code)] - pub(crate) fn inner(&self) -> &Ipld { - &self.0 - } - - /// TODO - #[allow(dead_code)] - pub(crate) fn into_inner(self) -> Ipld { - self.0.to_owned() - } - - pub(crate) fn with(receipt: Receipt, cid: Cid, metadata: Option) -> Self { - let receipt: Ipld = receipt.into(); - let data = ipld!({ - "receipt": receipt, - "metadata": metadata.as_ref().map(|m| m.to_owned()).map_or(Ipld::Null, |m| m), - "receipt_cid": cid, - }); - NotifyReceipt(data) - } -} - -impl DagJson for NotifyReceipt where Ipld: From {} - -impl From for Ipld { - fn from(receipt: NotifyReceipt) -> Self { - receipt.0 - } -} - -impl From for NotifyReceipt { - fn from(ipld: Ipld) -> Self { - NotifyReceipt(ipld) - } -} diff --git a/homestar-runtime/tests/network.rs b/homestar-runtime/tests/network.rs index c26724fb..0884b91c 100644 --- a/homestar-runtime/tests/network.rs +++ b/homestar-runtime/tests/network.rs @@ -11,6 +11,7 @@ use std::{ time::Duration, }; +#[cfg(feature = "websocket-notify")] mod notification; #[allow(dead_code)] From 794d3c71e522ce4ac6b86af98a188b14ec9daf5b Mon Sep 17 00:00:00 2001 From: Brian Ginsburg Date: Tue, 7 Nov 2023 10:10:28 -0800 Subject: [PATCH 24/24] chore: Add network notification test configs --- .../tests/fixtures/test_notification1.toml | 20 +++++++++++++++++++ .../tests/fixtures/test_notification2.toml | 20 +++++++++++++++++++ .../tests/network/notification.rs | 8 +++++--- 3 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 homestar-runtime/tests/fixtures/test_notification1.toml create mode 100644 homestar-runtime/tests/fixtures/test_notification2.toml diff --git a/homestar-runtime/tests/fixtures/test_notification1.toml b/homestar-runtime/tests/fixtures/test_notification1.toml new file mode 100644 index 00000000..979515fd --- /dev/null +++ b/homestar-runtime/tests/fixtures/test_notification1.toml @@ -0,0 +1,20 @@ +[monitoring] +process_collector_interval = 500 +console_subscriber_port = 5582 + +[node] + +[node.network] +metrics_port = 4032 +rpc_port = 9822 +webserver_port = 8022 +listen_address = "/ip4/127.0.0.1/tcp/7010" +node_addresses = [ + "/ip4/127.0.0.1/tcp/7011/p2p/16Uiu2HAm3g9AomQNeEctL2hPwLapap7AtPSNt8ZrBny4rLx1W5Dc", +] +enable_mdns = false +enable_rendezvous_client = false + +# Peer ID 12D3KooWDpJ7As7BWAwRMfu1VU2WCqNjvq387JEYKDBj4kx6nXTN +[node.network.keypair_config] +existing = { key_type = "ed25519", path = "./fixtures/__testkey_ed25519.pem" } diff --git a/homestar-runtime/tests/fixtures/test_notification2.toml b/homestar-runtime/tests/fixtures/test_notification2.toml new file mode 100644 index 00000000..dd22b7a1 --- /dev/null +++ b/homestar-runtime/tests/fixtures/test_notification2.toml @@ -0,0 +1,20 @@ +[monitoring] +process_collector_interval = 500 +console_subscriber_port = 5583 + +[node] + +[node.network] +metrics_port = 4033 +rpc_port = 9823 +webserver_port = 8023 +listen_address = "/ip4/127.0.0.1/tcp/7011" +node_addresses = [ + "/ip4/127.0.0.1/tcp/7010/p2p/12D3KooWDpJ7As7BWAwRMfu1VU2WCqNjvq387JEYKDBj4kx6nXTN", +] +enable_mdns = false +enable_rendezvous_client = false + +# Peer ID 16Uiu2HAm3g9AomQNeEctL2hPwLapap7AtPSNt8ZrBny4rLx1W5Dc +[node.network.keypair_config] +existing = { key_type = "secp256k1", path = "./fixtures/__testkey_secp256k1.der" } diff --git a/homestar-runtime/tests/network/notification.rs b/homestar-runtime/tests/network/notification.rs index 0ad00437..ea2d9b19 100644 --- a/homestar-runtime/tests/network/notification.rs +++ b/homestar-runtime/tests/network/notification.rs @@ -31,14 +31,14 @@ fn test_connection_notifications_serial() -> Result<()> { ) .arg("start") .arg("-c") - .arg("tests/fixtures/test_network1.toml") + .arg("tests/fixtures/test_notification1.toml") .arg("--db") .arg("homestar1.db") .stdout(Stdio::piped()) .spawn() .unwrap(); - let ws_port = 8020; + let ws_port = 8022; let socket = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), ws_port); let result = retry(Exponential::from_millis(1000).take(10), || { TcpStream::connect(socket).map(|stream| stream.shutdown(Shutdown::Both)) @@ -68,6 +68,8 @@ fn test_connection_notifications_serial() -> Result<()> { .await .unwrap(); + tokio::time::sleep(Duration::from_millis(200)).await; + let homestar_proc2 = Command::new(BIN.as_os_str()) .env( "RUST_LOG", @@ -75,7 +77,7 @@ fn test_connection_notifications_serial() -> Result<()> { ) .arg("start") .arg("-c") - .arg("tests/fixtures/test_network2.toml") + .arg("tests/fixtures/test_notification2.toml") .arg("--db") .arg("homestar2.db") .stdout(Stdio::piped())

Wg*QjA7G=>fzY!+XR}_=IGk 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