From e095499297d25f0ac0b13cc6e1f5c1a5987e72c4 Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Thu, 8 Feb 2024 11:50:28 +0200 Subject: [PATCH 01/36] add HermesEventPayload trait, update wasm Module --- hermes/bin/src/event.rs | 16 ++++++ hermes/bin/src/lib.rs | 5 +- hermes/bin/src/main.rs | 4 +- hermes/bin/src/wasm/context.rs | 4 +- hermes/bin/src/wasm/mod.rs | 4 +- hermes/bin/src/wasm/module.rs | 97 ++++++++++++++++++++++------------ 6 files changed, 90 insertions(+), 40 deletions(-) create mode 100644 hermes/bin/src/event.rs diff --git a/hermes/bin/src/event.rs b/hermes/bin/src/event.rs new file mode 100644 index 000000000..bb32b5639 --- /dev/null +++ b/hermes/bin/src/event.rs @@ -0,0 +1,16 @@ +pub trait HermesEventPayload { + /// Returns the name of the event associated with the payload. + fn event_name(&self) -> &str; + + /// Executes the behavior associated with the payload, using the provided Hermes + /// bindings and state store. + /// + /// # Arguments + /// + /// * `instance` - The Hermes instance to use for executing the payload's behavior. + /// + /// # Returns + /// + /// An `anyhow::Result` indicating the success or failure of the payload execution. + fn execute(&self, instance: &mut ModuleInstance) -> anyhow::Result<()>; +} diff --git a/hermes/bin/src/lib.rs b/hermes/bin/src/lib.rs index 8c97656ca..454439996 100644 --- a/hermes/bin/src/lib.rs +++ b/hermes/bin/src/lib.rs @@ -1,4 +1,7 @@ //! Intentionally empty //! This file exists, so that doc tests can be used inside binary crates. -mod wasm; +#[allow(dead_code, missing_docs, clippy::missing_docs_in_private_items)] +pub(crate) mod event; +mod runtime; +pub(crate) mod wasm; diff --git a/hermes/bin/src/main.rs b/hermes/bin/src/main.rs index 1634e0bd9..83de6a71d 100644 --- a/hermes/bin/src/main.rs +++ b/hermes/bin/src/main.rs @@ -1,7 +1,9 @@ //! The Hermes Node. +#[allow(dead_code, missing_docs, clippy::missing_docs_in_private_items)] +pub(crate) mod event; mod runtime; -mod wasm; +pub(crate) mod wasm; fn main() { println!("Hello, world!"); diff --git a/hermes/bin/src/wasm/context.rs b/hermes/bin/src/wasm/context.rs index 6d767cc2f..b5b1c3913 100644 --- a/hermes/bin/src/wasm/context.rs +++ b/hermes/bin/src/wasm/context.rs @@ -31,8 +31,8 @@ impl Context { } /// Increments the module's execution counter and sets the event name to be executed - pub(crate) fn use_for(&mut self, even_name: String) { - self.event_name = Some(even_name); + pub(crate) fn use_for(&mut self, event_name: String) { + self.event_name = Some(event_name); self.counter += 1; } diff --git a/hermes/bin/src/wasm/mod.rs b/hermes/bin/src/wasm/mod.rs index d35f1a012..4ec605598 100644 --- a/hermes/bin/src/wasm/mod.rs +++ b/hermes/bin/src/wasm/mod.rs @@ -2,5 +2,5 @@ //! All implementation based on [wasmtime](https://crates.io/crates/wasmtime) crate dependency. pub(crate) mod context; -mod engine; -mod module; +pub(crate) mod engine; +pub(crate) mod module; diff --git a/hermes/bin/src/wasm/module.rs b/hermes/bin/src/wasm/module.rs index edc866863..8122631a7 100644 --- a/hermes/bin/src/wasm/module.rs +++ b/hermes/bin/src/wasm/module.rs @@ -8,15 +8,23 @@ use std::error::Error; use wasmtime::{ InstancePre as WasmInstancePre, Linker as WasmLinker, Module as WasmModule, Store as WasmStore, - WasmParams, WasmResults, }; use super::{context::Context, engine::Engine}; +use crate::event::HermesEventPayload; /// Interface for linking WASM imports -pub(crate) trait LinkImport { +pub(crate) trait Host { /// Link imports to the `wasmtime::Linker` - fn link(&self, linker: &mut WasmLinker) -> Result<(), Box>; + fn link_imports(linker: &mut WasmLinker) -> anyhow::Result<()>; +} + +/// Interface for WASM module instance +pub(crate) trait ModuleInstance: Sized { + /// Instantiate WASM module instance + fn instantiate( + store: WasmStore, pre_instance: &WasmInstancePre, + ) -> anyhow::Result; } /// Structure defines an abstraction over the WASM module @@ -27,7 +35,7 @@ pub(crate) trait LinkImport { /// The primary goal for it is to make a WASM state *immutable* along WASM module /// execution. It means that `Module::call_func` execution does not have as side effect /// for the WASM module's state, it becomes unchanged. -pub(crate) struct Module { +pub(crate) struct Module> { /// `wasmtime::InstancePre` entity /// /// A reason why it is used a `wasmtime::InstancePre` instead of `wasmtime::Instance` @@ -41,9 +49,11 @@ pub(crate) struct Module { /// `Context` entity context: Context, + + _host: std::marker::PhantomData, } -impl Module { +impl> Module { /// Instantiate WASM module /// /// # Errors @@ -51,20 +61,18 @@ impl Module { #[allow(dead_code)] pub(crate) fn new( engine: Engine, app_name: String, module_bytes: &[u8], - imports: &[Box>], ) -> Result> { let module = WasmModule::new(&engine, module_bytes)?; let mut linker = WasmLinker::new(&engine); - for import in imports { - import.link(&mut linker)?; - } + H::link_imports(&mut linker)?; let pre_instance = linker.instantiate_pre(&module)?; Ok(Self { pre_instance, engine, context: Context::new(app_name), + _host: std::marker::PhantomData, }) } @@ -75,19 +83,15 @@ impl Module { /// # Errors /// - `wasmtime::Error`: WASM call error #[allow(dead_code)] - pub(crate) fn call_func( - &mut self, name: &str, args: Args, - ) -> Result> - where - Args: WasmParams, - Ret: WasmResults, - { - self.context.use_for(name.to_string()); - - let mut store = WasmStore::new(&self.engine, self.context.clone()); - let instance = self.pre_instance.instantiate(&mut store)?; - let func = instance.get_typed_func(&mut store, name)?; - Ok(func.call(&mut store, args)?) + pub(crate) fn execute_event( + &mut self, event: &impl HermesEventPayload, + ) -> Result<(), Box> { + self.context.use_for(event.event_name().to_string()); + + let store = WasmStore::new(&self.engine, self.context.clone()); + let mut intance = M::instantiate(store, &self.pre_instance)?; + event.execute(&mut intance)?; + Ok(()) } } @@ -95,10 +99,9 @@ impl Module { mod tests { use super::*; - struct ImportHelloFunc; - - impl LinkImport for ImportHelloFunc { - fn link(&self, linker: &mut WasmLinker) -> Result<(), Box> { + struct TestHost; + impl Host for TestHost { + fn link_imports(linker: &mut WasmLinker) -> anyhow::Result<()> { linker.func_wrap("", "hello", || { println!("hello"); })?; @@ -106,6 +109,35 @@ mod tests { } } + struct TestModuleInstance { + store: WasmStore, + instance: wasmtime::Instance, + } + impl ModuleInstance for TestModuleInstance { + fn instantiate( + mut store: WasmStore, pre_instance: &WasmInstancePre, + ) -> anyhow::Result { + let instance = pre_instance.instantiate(&mut store)?; + Ok(Self { store, instance }) + } + } + + struct TestEvent; + impl HermesEventPayload for TestEvent { + fn event_name(&self) -> &str { + "inc_global" + } + + fn execute(&self, instance: &mut TestModuleInstance) -> anyhow::Result<()> { + let func = instance + .instance + .get_typed_func::<(), i32>(&mut instance.store, "inc_global")?; + let result = func.call(&mut instance.store, ())?; + assert_eq!(result, 1); + Ok(()) + } + } + #[test] /// Tests that after instantiation of `Module` its state does not change after each /// `Module::call_func` execution @@ -114,9 +146,9 @@ mod tests { let wat = r#" (module (import "" "hello" (func $hello_0)) - (export "call_hello" (func $call_hello)) + (export "inc_global" (func $inc_global)) - (func $call_hello (result i32) + (func $inc_global (result i32) global.get $global_val i32.const 1 i32.add @@ -127,14 +159,11 @@ mod tests { (global $global_val (mut i32) (i32.const 0)) )"#; - let mut module = Module::new(engine, "app".to_string(), wat.as_bytes(), &[Box::new( - ImportHelloFunc, - )]) - .expect(""); + let mut module = + Module::::new(engine, "app".to_string(), wat.as_bytes()).expect(""); for _ in 0..10 { - let res: i32 = module.call_func("call_hello", ()).expect(""); - assert_eq!(res, 1); + module.execute_event(&TestEvent).expect(""); } } } From 4f490d1cedac622b0feeb3f267c2db2acf3f43fb Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Thu, 8 Feb 2024 12:03:17 +0200 Subject: [PATCH 02/36] refactor --- hermes/bin/src/event.rs | 9 +++---- hermes/bin/src/wasm/module.rs | 51 +++++++++++++++++++++-------------- 2 files changed, 35 insertions(+), 25 deletions(-) diff --git a/hermes/bin/src/event.rs b/hermes/bin/src/event.rs index bb32b5639..1e40bcdde 100644 --- a/hermes/bin/src/event.rs +++ b/hermes/bin/src/event.rs @@ -1,16 +1,15 @@ -pub trait HermesEventPayload { +pub trait HermesEventPayload { /// Returns the name of the event associated with the payload. fn event_name(&self) -> &str; - /// Executes the behavior associated with the payload, using the provided Hermes - /// bindings and state store. + /// Executes the behavior associated with the payload, using the provided executor. /// /// # Arguments /// - /// * `instance` - The Hermes instance to use for executing the payload's behavior. + /// * `executor` - The to use for executing the payload's behavior. /// /// # Returns /// /// An `anyhow::Result` indicating the success or failure of the payload execution. - fn execute(&self, instance: &mut ModuleInstance) -> anyhow::Result<()>; + fn execute(&self, executor: &mut Executor) -> anyhow::Result<()>; } diff --git a/hermes/bin/src/wasm/module.rs b/hermes/bin/src/wasm/module.rs index 8122631a7..ba3337bec 100644 --- a/hermes/bin/src/wasm/module.rs +++ b/hermes/bin/src/wasm/module.rs @@ -20,13 +20,37 @@ pub(crate) trait Host { } /// Interface for WASM module instance -pub(crate) trait ModuleInstance: Sized { +pub(crate) trait WasmInstance: Sized { /// Instantiate WASM module instance fn instantiate( - store: WasmStore, pre_instance: &WasmInstancePre, + store: &mut WasmStore, pre_instance: &WasmInstancePre, ) -> anyhow::Result; } +impl WasmInstance for wasmtime::Instance { + fn instantiate( + mut store: &mut WasmStore, pre_instance: &WasmInstancePre, + ) -> anyhow::Result { + let instance = pre_instance.instantiate(&mut store)?; + Ok(instance) + } +} + +#[allow(dead_code)] +pub(crate) struct ModuleInstance { + store: WasmStore, + instance: Instance, +} + +impl ModuleInstance { + pub(crate) fn new( + mut store: WasmStore, pre_instance: &WasmInstancePre, + ) -> anyhow::Result { + let instance = Instance::instantiate(&mut store, pre_instance)?; + Ok(Self { store, instance }) + } +} + /// Structure defines an abstraction over the WASM module /// It instantiates the module with the provided context data, /// links all provided imports to the module instance, @@ -83,13 +107,13 @@ impl> Module { /// # Errors /// - `wasmtime::Error`: WASM call error #[allow(dead_code)] - pub(crate) fn execute_event( - &mut self, event: &impl HermesEventPayload, + pub(crate) fn execute_event( + &mut self, event: &impl HermesEventPayload>, ) -> Result<(), Box> { self.context.use_for(event.event_name().to_string()); let store = WasmStore::new(&self.engine, self.context.clone()); - let mut intance = M::instantiate(store, &self.pre_instance)?; + let mut intance = ModuleInstance::new(store, &self.pre_instance)?; event.execute(&mut intance)?; Ok(()) } @@ -109,26 +133,13 @@ mod tests { } } - struct TestModuleInstance { - store: WasmStore, - instance: wasmtime::Instance, - } - impl ModuleInstance for TestModuleInstance { - fn instantiate( - mut store: WasmStore, pre_instance: &WasmInstancePre, - ) -> anyhow::Result { - let instance = pre_instance.instantiate(&mut store)?; - Ok(Self { store, instance }) - } - } - struct TestEvent; - impl HermesEventPayload for TestEvent { + impl HermesEventPayload> for TestEvent { fn event_name(&self) -> &str { "inc_global" } - fn execute(&self, instance: &mut TestModuleInstance) -> anyhow::Result<()> { + fn execute(&self, instance: &mut ModuleInstance) -> anyhow::Result<()> { let func = instance .instance .get_typed_func::<(), i32>(&mut instance.store, "inc_global")?; From eeeb90d10e49ac98c44d1dbfbb678b29429e17cf Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Thu, 8 Feb 2024 12:11:16 +0200 Subject: [PATCH 03/36] refactor --- hermes/bin/src/event.rs | 2 +- hermes/bin/src/wasm/engine.rs | 7 ++----- hermes/bin/src/wasm/module.rs | 10 ++++------ 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/hermes/bin/src/event.rs b/hermes/bin/src/event.rs index 1e40bcdde..adbed6f03 100644 --- a/hermes/bin/src/event.rs +++ b/hermes/bin/src/event.rs @@ -6,7 +6,7 @@ pub trait HermesEventPayload { /// /// # Arguments /// - /// * `executor` - The to use for executing the payload's behavior. + /// * `executor` - The executor to use for executing the payload's behavior. /// /// # Returns /// diff --git a/hermes/bin/src/wasm/engine.rs b/hermes/bin/src/wasm/engine.rs index eae4ba262..3ef011925 100644 --- a/hermes/bin/src/wasm/engine.rs +++ b/hermes/bin/src/wasm/engine.rs @@ -1,10 +1,7 @@ //! WASM engine implementation //! Wrapper over the `wasmtime::Engine` struct with some specific configuration setup. -use std::{ - error::Error, - ops::{Deref, DerefMut}, -}; +use std::ops::{Deref, DerefMut}; use wasmtime::{Config as WasmConfig, Engine as WasmEngine}; @@ -33,7 +30,7 @@ impl Engine { /// /// - `wasmtime::Error`: engine initialization error. #[allow(dead_code)] - pub(crate) fn new() -> Result> { + pub(crate) fn new() -> anyhow::Result { let mut config = WasmConfig::new(); config.wasm_component_model(true); config.consume_fuel(false); diff --git a/hermes/bin/src/wasm/module.rs b/hermes/bin/src/wasm/module.rs index ba3337bec..9d2968d81 100644 --- a/hermes/bin/src/wasm/module.rs +++ b/hermes/bin/src/wasm/module.rs @@ -4,8 +4,6 @@ //! //! All implementation based on [wasmtime](https://crates.io/crates/wasmtime) crate dependency. -use std::error::Error; - use wasmtime::{ InstancePre as WasmInstancePre, Linker as WasmLinker, Module as WasmModule, Store as WasmStore, }; @@ -85,7 +83,7 @@ impl> Module { #[allow(dead_code)] pub(crate) fn new( engine: Engine, app_name: String, module_bytes: &[u8], - ) -> Result> { + ) -> anyhow::Result { let module = WasmModule::new(&engine, module_bytes)?; let mut linker = WasmLinker::new(&engine); @@ -109,12 +107,12 @@ impl> Module { #[allow(dead_code)] pub(crate) fn execute_event( &mut self, event: &impl HermesEventPayload>, - ) -> Result<(), Box> { + ) -> anyhow::Result<()> { self.context.use_for(event.event_name().to_string()); let store = WasmStore::new(&self.engine, self.context.clone()); - let mut intance = ModuleInstance::new(store, &self.pre_instance)?; - event.execute(&mut intance)?; + let mut instance = ModuleInstance::new(store, &self.pre_instance)?; + event.execute(&mut instance)?; Ok(()) } } From f4e333c48846ebd0d91ed8f1357ff26e251faeb3 Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Thu, 8 Feb 2024 13:42:45 +0200 Subject: [PATCH 04/36] update test --- hermes/bin/src/wasm/module.rs | 67 ++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 29 deletions(-) diff --git a/hermes/bin/src/wasm/module.rs b/hermes/bin/src/wasm/module.rs index 9d2968d81..9156f25a2 100644 --- a/hermes/bin/src/wasm/module.rs +++ b/hermes/bin/src/wasm/module.rs @@ -5,7 +5,11 @@ //! All implementation based on [wasmtime](https://crates.io/crates/wasmtime) crate dependency. use wasmtime::{ - InstancePre as WasmInstancePre, Linker as WasmLinker, Module as WasmModule, Store as WasmStore, + component::{ + Component as WasmModule, Instance as WasmInstance, InstancePre as WasmInstancePre, + Linker as WasmLinker, + }, + Store as WasmStore, }; use super::{context::Context, engine::Engine}; @@ -18,14 +22,14 @@ pub(crate) trait Host { } /// Interface for WASM module instance -pub(crate) trait WasmInstance: Sized { +pub(crate) trait Instance: Sized { /// Instantiate WASM module instance fn instantiate( store: &mut WasmStore, pre_instance: &WasmInstancePre, ) -> anyhow::Result; } -impl WasmInstance for wasmtime::Instance { +impl Instance for WasmInstance { fn instantiate( mut store: &mut WasmStore, pre_instance: &WasmInstancePre, ) -> anyhow::Result { @@ -35,16 +39,16 @@ impl WasmInstance for wasmtime::Instance { } #[allow(dead_code)] -pub(crate) struct ModuleInstance { +pub(crate) struct ModuleInstance { store: WasmStore, - instance: Instance, + instance: I, } -impl ModuleInstance { +impl ModuleInstance { pub(crate) fn new( mut store: WasmStore, pre_instance: &WasmInstancePre, ) -> anyhow::Result { - let instance = Instance::instantiate(&mut store, pre_instance)?; + let instance = I::instantiate(&mut store, pre_instance)?; Ok(Self { store, instance }) } } @@ -105,7 +109,7 @@ impl> Module { /// # Errors /// - `wasmtime::Error`: WASM call error #[allow(dead_code)] - pub(crate) fn execute_event( + pub(crate) fn execute_event( &mut self, event: &impl HermesEventPayload>, ) -> anyhow::Result<()> { self.context.use_for(event.event_name().to_string()); @@ -124,25 +128,26 @@ mod tests { struct TestHost; impl Host for TestHost { fn link_imports(linker: &mut WasmLinker) -> anyhow::Result<()> { - linker.func_wrap("", "hello", || { + linker.instance("")?.func_wrap("hello", |_, ()| { println!("hello"); + Ok(()) })?; Ok(()) } } struct TestEvent; - impl HermesEventPayload> for TestEvent { + impl HermesEventPayload> for TestEvent { fn event_name(&self) -> &str { - "inc_global" + "inc-global" } - fn execute(&self, instance: &mut ModuleInstance) -> anyhow::Result<()> { + fn execute(&self, instance: &mut ModuleInstance) -> anyhow::Result<()> { let func = instance .instance - .get_typed_func::<(), i32>(&mut instance.store, "inc_global")?; - let result = func.call(&mut instance.store, ())?; - assert_eq!(result, 1); + .get_typed_func::<(), (i32,)>(&mut instance.store, "inc-global")?; + let (res,) = func.call(&mut instance.store, ())?; + assert_eq!(res, 1); Ok(()) } } @@ -153,20 +158,24 @@ mod tests { fn preserve_module_state_test() { let engine = Engine::new().expect(""); let wat = r#" - (module - (import "" "hello" (func $hello_0)) - (export "inc_global" (func $inc_global)) - - (func $inc_global (result i32) - global.get $global_val - i32.const 1 - i32.add - global.set $global_val - global.get $global_val - ) - - (global $global_val (mut i32) (i32.const 0)) - )"#; + (component + (core module $Module + (export "inc-global" (func $inc_global)) + + (func $inc_global (result i32) + global.get $global_val + i32.const 1 + i32.add + global.set $global_val + global.get $global_val + ) + + (global $global_val (mut i32) (i32.const 0)) + ) + (core instance $module (instantiate (module $Module))) + (func $inc_global (result s32) (canon lift (core func $module "inc-global"))) + (export "inc-global" (func $inc_global)) + )"#; let mut module = Module::::new(engine, "app".to_string(), wat.as_bytes()).expect(""); From de56aefea067b04a73f42c0f199a10adeb71af6e Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Thu, 8 Feb 2024 14:00:54 +0200 Subject: [PATCH 05/36] update --- hermes/bin/src/wasm/module.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/hermes/bin/src/wasm/module.rs b/hermes/bin/src/wasm/module.rs index 9156f25a2..faa553df5 100644 --- a/hermes/bin/src/wasm/module.rs +++ b/hermes/bin/src/wasm/module.rs @@ -127,11 +127,7 @@ mod tests { struct TestHost; impl Host for TestHost { - fn link_imports(linker: &mut WasmLinker) -> anyhow::Result<()> { - linker.instance("")?.func_wrap("hello", |_, ()| { - println!("hello"); - Ok(()) - })?; + fn link_imports(_linker: &mut WasmLinker) -> anyhow::Result<()> { Ok(()) } } From f789e2990822f3eeb260db8f960a8518c5ba54da Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Thu, 8 Feb 2024 14:26:54 +0200 Subject: [PATCH 06/36] add docs --- hermes/bin/src/event.rs | 3 +++ hermes/bin/src/lib.rs | 1 - hermes/bin/src/main.rs | 1 - hermes/bin/src/wasm/module.rs | 19 +++++++++++++++---- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/hermes/bin/src/event.rs b/hermes/bin/src/event.rs index adbed6f03..4cd71b01c 100644 --- a/hermes/bin/src/event.rs +++ b/hermes/bin/src/event.rs @@ -1,3 +1,6 @@ +//! Hermes event definition + +/// A trait for defining the behavior of a Hermes event. pub trait HermesEventPayload { /// Returns the name of the event associated with the payload. fn event_name(&self) -> &str; diff --git a/hermes/bin/src/lib.rs b/hermes/bin/src/lib.rs index 454439996..c3a7e94ed 100644 --- a/hermes/bin/src/lib.rs +++ b/hermes/bin/src/lib.rs @@ -1,7 +1,6 @@ //! Intentionally empty //! This file exists, so that doc tests can be used inside binary crates. -#[allow(dead_code, missing_docs, clippy::missing_docs_in_private_items)] pub(crate) mod event; mod runtime; pub(crate) mod wasm; diff --git a/hermes/bin/src/main.rs b/hermes/bin/src/main.rs index 83de6a71d..9b00c25be 100644 --- a/hermes/bin/src/main.rs +++ b/hermes/bin/src/main.rs @@ -1,6 +1,5 @@ //! The Hermes Node. -#[allow(dead_code, missing_docs, clippy::missing_docs_in_private_items)] pub(crate) mod event; mod runtime; pub(crate) mod wasm; diff --git a/hermes/bin/src/wasm/module.rs b/hermes/bin/src/wasm/module.rs index faa553df5..0a7445c75 100644 --- a/hermes/bin/src/wasm/module.rs +++ b/hermes/bin/src/wasm/module.rs @@ -38,13 +38,20 @@ impl Instance for WasmInstance { } } -#[allow(dead_code)] +/// Structure defines an abstraction over the WASM module instance. +/// It holds the state of the WASM module along with its context data. +/// It is used to interact with the WASM module. pub(crate) struct ModuleInstance { - store: WasmStore, - instance: I, + /// `wasmtime::Store` entity + #[allow(dead_code)] + pub(crate) store: WasmStore, + /// `Instance` entity + #[allow(dead_code)] + pub(crate) instance: I, } impl ModuleInstance { + /// Instantiates WASM module pub(crate) fn new( mut store: WasmStore, pre_instance: &WasmInstancePre, ) -> anyhow::Result { @@ -76,6 +83,7 @@ pub(crate) struct Module> { /// `Context` entity context: Context, + /// `Host` type _host: std::marker::PhantomData, } @@ -102,7 +110,10 @@ impl> Module { }) } - /// Call WASM module's function. + /// Executes a Hermes event by calling some WASM function. + /// This function abstraction over actual execution of the WASM function, + /// actuall definition is inside `HermesEventPayload` trait implementation. + /// /// For each call creates a brand new `wasmtime::Store` instance, which means that /// is has an initial state, based on the provided context for each call. /// From c0092a80f3b276e3676140c8a33fbc56f237abc6 Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Thu, 8 Feb 2024 15:24:10 +0200 Subject: [PATCH 07/36] update --- hermes/bin/src/wasm/module.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/hermes/bin/src/wasm/module.rs b/hermes/bin/src/wasm/module.rs index 0a7445c75..1f99d2f1c 100644 --- a/hermes/bin/src/wasm/module.rs +++ b/hermes/bin/src/wasm/module.rs @@ -93,9 +93,8 @@ impl> Module { /// # Errors /// - `wasmtime::Error`: WASM call error #[allow(dead_code)] - pub(crate) fn new( - engine: Engine, app_name: String, module_bytes: &[u8], - ) -> anyhow::Result { + pub(crate) fn new(app_name: String, module_bytes: &[u8]) -> anyhow::Result { + let engine = Engine::new()?; let module = WasmModule::new(&engine, module_bytes)?; let mut linker = WasmLinker::new(&engine); @@ -163,7 +162,6 @@ mod tests { /// Tests that after instantiation of `Module` its state does not change after each /// `Module::call_func` execution fn preserve_module_state_test() { - let engine = Engine::new().expect(""); let wat = r#" (component (core module $Module @@ -184,11 +182,13 @@ mod tests { (export "inc-global" (func $inc_global)) )"#; - let mut module = - Module::::new(engine, "app".to_string(), wat.as_bytes()).expect(""); + let mut module = Module::::new("app".to_string(), wat.as_bytes()) + .expect("cannot load a WASM module"); for _ in 0..10 { - module.execute_event(&TestEvent).expect(""); + module + .execute_event(&TestEvent) + .expect("cannot execute `TestEvent` event"); } } } From 855b5db572ccafd91f48d7f7bd0198800bea0cdd Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Thu, 8 Feb 2024 15:32:33 +0200 Subject: [PATCH 08/36] fix spelling --- hermes/bin/src/wasm/module.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hermes/bin/src/wasm/module.rs b/hermes/bin/src/wasm/module.rs index 1f99d2f1c..8d519f883 100644 --- a/hermes/bin/src/wasm/module.rs +++ b/hermes/bin/src/wasm/module.rs @@ -111,7 +111,7 @@ impl> Module { /// Executes a Hermes event by calling some WASM function. /// This function abstraction over actual execution of the WASM function, - /// actuall definition is inside `HermesEventPayload` trait implementation. + /// actual definition is inside `HermesEventPayload` trait implementation. /// /// For each call creates a brand new `wasmtime::Store` instance, which means that /// is has an initial state, based on the provided context for each call. From 3d06b90f678bec98e8d03cd8f5a977937bfba657 Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Thu, 8 Feb 2024 15:56:44 +0200 Subject: [PATCH 09/36] update --- hermes/bin/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/hermes/bin/src/lib.rs b/hermes/bin/src/lib.rs index c3a7e94ed..ef20beea0 100644 --- a/hermes/bin/src/lib.rs +++ b/hermes/bin/src/lib.rs @@ -2,5 +2,4 @@ //! This file exists, so that doc tests can be used inside binary crates. pub(crate) mod event; -mod runtime; pub(crate) mod wasm; From d53509344d99046c8be259205d21b9d99ca80cd1 Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Thu, 8 Feb 2024 20:25:31 +0200 Subject: [PATCH 10/36] refactor Context --- hermes/bin/src/lib.rs | 1 + hermes/bin/src/main.rs | 1 + hermes/bin/src/runtime/extensions/mod.rs | 2 +- hermes/bin/src/runtime/host/hermes/binary/mod.rs | 2 +- hermes/bin/src/runtime/host/hermes/cardano/mod.rs | 2 +- hermes/bin/src/runtime/host/hermes/cbor/mod.rs | 2 +- hermes/bin/src/runtime/host/hermes/cron/mod.rs | 2 +- hermes/bin/src/runtime/host/hermes/crypto/mod.rs | 2 +- hermes/bin/src/runtime/host/hermes/hash/mod.rs | 2 +- hermes/bin/src/runtime/host/hermes/init/mod.rs | 2 +- hermes/bin/src/runtime/host/hermes/json/mod.rs | 2 +- hermes/bin/src/runtime/host/hermes/kv_store/mod.rs | 2 +- hermes/bin/src/runtime/host/hermes/localtime/mod.rs | 2 +- hermes/bin/src/runtime/host/hermes/logging/mod.rs | 2 +- hermes/bin/src/runtime/host/hermes/mod.rs | 2 +- hermes/bin/src/runtime/host/wasi/cli/mod.rs | 2 +- hermes/bin/src/runtime/host/wasi/clocks/mod.rs | 2 +- hermes/bin/src/runtime/host/wasi/clocks/monotonic.rs | 2 +- hermes/bin/src/runtime/host/wasi/clocks/wall.rs | 2 +- hermes/bin/src/runtime/host/wasi/filesystem/mod.rs | 2 +- hermes/bin/src/runtime/host/wasi/http/mod.rs | 2 +- hermes/bin/src/runtime/host/wasi/io/error.rs | 2 +- hermes/bin/src/runtime/host/wasi/io/mod.rs | 2 +- hermes/bin/src/runtime/host/wasi/io/streams.rs | 2 +- hermes/bin/src/runtime/host/wasi/mod.rs | 2 +- hermes/bin/src/runtime/host/wasi/random/insecure.rs | 2 +- hermes/bin/src/runtime/host/wasi/random/insecure_seed.rs | 2 +- hermes/bin/src/runtime/host/wasi/random/mod.rs | 2 +- hermes/bin/src/runtime/host/wasi/random/secure.rs | 2 +- hermes/bin/src/{wasm/context.rs => state.rs} | 2 +- hermes/bin/src/wasm/mod.rs | 1 - hermes/bin/src/wasm/module.rs | 4 ++-- 32 files changed, 32 insertions(+), 31 deletions(-) rename hermes/bin/src/{wasm/context.rs => state.rs} (97%) diff --git a/hermes/bin/src/lib.rs b/hermes/bin/src/lib.rs index ef20beea0..33cd83245 100644 --- a/hermes/bin/src/lib.rs +++ b/hermes/bin/src/lib.rs @@ -2,4 +2,5 @@ //! This file exists, so that doc tests can be used inside binary crates. pub(crate) mod event; +pub(crate) mod state; pub(crate) mod wasm; diff --git a/hermes/bin/src/main.rs b/hermes/bin/src/main.rs index 9b00c25be..3ace6cc16 100644 --- a/hermes/bin/src/main.rs +++ b/hermes/bin/src/main.rs @@ -2,6 +2,7 @@ pub(crate) mod event; mod runtime; +pub(crate) mod state; pub(crate) mod wasm; fn main() { diff --git a/hermes/bin/src/runtime/extensions/mod.rs b/hermes/bin/src/runtime/extensions/mod.rs index a8a330e3d..96145b660 100644 --- a/hermes/bin/src/runtime/extensions/mod.rs +++ b/hermes/bin/src/runtime/extensions/mod.rs @@ -19,7 +19,7 @@ use self::{ cron::api::CronTagged, }, }; -use crate::{runtime, wasm::context::Context}; +use crate::{runtime, state::Context}; bindgen!({ world: "hermes", diff --git a/hermes/bin/src/runtime/host/hermes/binary/mod.rs b/hermes/bin/src/runtime/host/hermes/binary/mod.rs index 79eda72b9..8876c6091 100644 --- a/hermes/bin/src/runtime/host/hermes/binary/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/binary/mod.rs @@ -7,7 +7,7 @@ use crate::runtime::extensions::{hermes::binary::api::Host, HermesState, Statefu pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::wasm::context::Context) -> Self { + fn new(_ctx: &crate::state::Context) -> Self { State {} } } diff --git a/hermes/bin/src/runtime/host/hermes/cardano/mod.rs b/hermes/bin/src/runtime/host/hermes/cardano/mod.rs index 5ce9639ba..7bd5aaf16 100644 --- a/hermes/bin/src/runtime/host/hermes/cardano/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/cardano/mod.rs @@ -13,7 +13,7 @@ use crate::runtime::extensions::{ pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::wasm::context::Context) -> Self { + fn new(_ctx: &crate::state::Context) -> Self { State {} } } diff --git a/hermes/bin/src/runtime/host/hermes/cbor/mod.rs b/hermes/bin/src/runtime/host/hermes/cbor/mod.rs index d8a8eca09..439fe1f36 100644 --- a/hermes/bin/src/runtime/host/hermes/cbor/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/cbor/mod.rs @@ -7,7 +7,7 @@ use crate::runtime::extensions::{hermes::cbor::api::Host, HermesState, Stateful} pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::wasm::context::Context) -> Self { + fn new(_ctx: &crate::state::Context) -> Self { State {} } } diff --git a/hermes/bin/src/runtime/host/hermes/cron/mod.rs b/hermes/bin/src/runtime/host/hermes/cron/mod.rs index c0afb9f1f..acb7b9a96 100644 --- a/hermes/bin/src/runtime/host/hermes/cron/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/cron/mod.rs @@ -11,7 +11,7 @@ use crate::runtime::extensions::{ pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::wasm::context::Context) -> Self { + fn new(_ctx: &crate::state::Context) -> Self { State {} } } diff --git a/hermes/bin/src/runtime/host/hermes/crypto/mod.rs b/hermes/bin/src/runtime/host/hermes/crypto/mod.rs index 649ca3f6f..c75e58ae0 100644 --- a/hermes/bin/src/runtime/host/hermes/crypto/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/crypto/mod.rs @@ -16,7 +16,7 @@ use crate::runtime::extensions::{ pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::wasm::context::Context) -> Self { + fn new(_ctx: &crate::state::Context) -> Self { State {} } } diff --git a/hermes/bin/src/runtime/host/hermes/hash/mod.rs b/hermes/bin/src/runtime/host/hermes/hash/mod.rs index df85fb5e7..5f4a7655c 100644 --- a/hermes/bin/src/runtime/host/hermes/hash/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/hash/mod.rs @@ -13,7 +13,7 @@ use crate::runtime::extensions::{ pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::wasm::context::Context) -> Self { + fn new(_ctx: &crate::state::Context) -> Self { State {} } } diff --git a/hermes/bin/src/runtime/host/hermes/init/mod.rs b/hermes/bin/src/runtime/host/hermes/init/mod.rs index 90d6f2f5d..d78dc0b17 100644 --- a/hermes/bin/src/runtime/host/hermes/init/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/init/mod.rs @@ -9,7 +9,7 @@ use crate::runtime::extensions::Stateful; pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::wasm::context::Context) -> Self { + fn new(_ctx: &crate::state::Context) -> Self { State {} } } diff --git a/hermes/bin/src/runtime/host/hermes/json/mod.rs b/hermes/bin/src/runtime/host/hermes/json/mod.rs index de80f9986..3adb02d19 100644 --- a/hermes/bin/src/runtime/host/hermes/json/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/json/mod.rs @@ -7,7 +7,7 @@ use crate::runtime::extensions::{hermes::json::api::Host, HermesState, Stateful} pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::wasm::context::Context) -> Self { + fn new(_ctx: &crate::state::Context) -> Self { State {} } } diff --git a/hermes/bin/src/runtime/host/hermes/kv_store/mod.rs b/hermes/bin/src/runtime/host/hermes/kv_store/mod.rs index 3aa72f098..6fdac308f 100644 --- a/hermes/bin/src/runtime/host/hermes/kv_store/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/kv_store/mod.rs @@ -10,7 +10,7 @@ use crate::runtime::extensions::{ pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::wasm::context::Context) -> Self { + fn new(_ctx: &crate::state::Context) -> Self { State {} } } diff --git a/hermes/bin/src/runtime/host/hermes/localtime/mod.rs b/hermes/bin/src/runtime/host/hermes/localtime/mod.rs index 09a676b06..2d426b7c5 100644 --- a/hermes/bin/src/runtime/host/hermes/localtime/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/localtime/mod.rs @@ -11,7 +11,7 @@ use crate::runtime::extensions::{ pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::wasm::context::Context) -> Self { + fn new(_ctx: &crate::state::Context) -> Self { State {} } } diff --git a/hermes/bin/src/runtime/host/hermes/logging/mod.rs b/hermes/bin/src/runtime/host/hermes/logging/mod.rs index 1d9489ef5..bbd2a4399 100644 --- a/hermes/bin/src/runtime/host/hermes/logging/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/logging/mod.rs @@ -13,7 +13,7 @@ use crate::runtime::extensions::{ pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::wasm::context::Context) -> Self { + fn new(_ctx: &crate::state::Context) -> Self { State {} } } diff --git a/hermes/bin/src/runtime/host/hermes/mod.rs b/hermes/bin/src/runtime/host/hermes/mod.rs index a3a173886..0b0a07143 100644 --- a/hermes/bin/src/runtime/host/hermes/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/mod.rs @@ -42,7 +42,7 @@ pub(crate) struct State { } impl Stateful for State { - fn new(ctx: &crate::wasm::context::Context) -> Self { + fn new(ctx: &crate::state::Context) -> Self { Self { binary: binary::State::new(ctx), cardano: cardano::State::new(ctx), diff --git a/hermes/bin/src/runtime/host/wasi/cli/mod.rs b/hermes/bin/src/runtime/host/wasi/cli/mod.rs index 01c76d06b..96c2fd342 100644 --- a/hermes/bin/src/runtime/host/wasi/cli/mod.rs +++ b/hermes/bin/src/runtime/host/wasi/cli/mod.rs @@ -13,7 +13,7 @@ use crate::runtime::extensions::{ pub(crate) struct State {} impl Stateful for State { - fn new(ctx: &crate::wasm::context::Context) -> Self { + fn new(ctx: &crate::state::Context) -> Self { Self {} } } diff --git a/hermes/bin/src/runtime/host/wasi/clocks/mod.rs b/hermes/bin/src/runtime/host/wasi/clocks/mod.rs index ea6268e15..443ac4ffd 100644 --- a/hermes/bin/src/runtime/host/wasi/clocks/mod.rs +++ b/hermes/bin/src/runtime/host/wasi/clocks/mod.rs @@ -16,7 +16,7 @@ pub(crate) struct State { } impl Stateful for State { - fn new(ctx: &crate::wasm::context::Context) -> Self { + fn new(ctx: &crate::state::Context) -> Self { Self { monotonic: monotonic::State::new(ctx), wall: wall::State::new(ctx), diff --git a/hermes/bin/src/runtime/host/wasi/clocks/monotonic.rs b/hermes/bin/src/runtime/host/wasi/clocks/monotonic.rs index f87139211..4b5d47699 100644 --- a/hermes/bin/src/runtime/host/wasi/clocks/monotonic.rs +++ b/hermes/bin/src/runtime/host/wasi/clocks/monotonic.rs @@ -10,7 +10,7 @@ use crate::runtime::extensions::{ pub(crate) struct State {} impl Stateful for State { - fn new(ctx: &crate::wasm::context::Context) -> Self { + fn new(ctx: &crate::state::Context) -> Self { Self {} } } diff --git a/hermes/bin/src/runtime/host/wasi/clocks/wall.rs b/hermes/bin/src/runtime/host/wasi/clocks/wall.rs index a67bb7c45..b21b3fb63 100644 --- a/hermes/bin/src/runtime/host/wasi/clocks/wall.rs +++ b/hermes/bin/src/runtime/host/wasi/clocks/wall.rs @@ -9,7 +9,7 @@ use crate::runtime::extensions::{ pub(crate) struct State {} impl Stateful for State { - fn new(ctx: &crate::wasm::context::Context) -> Self { + fn new(ctx: &crate::state::Context) -> Self { Self {} } } diff --git a/hermes/bin/src/runtime/host/wasi/filesystem/mod.rs b/hermes/bin/src/runtime/host/wasi/filesystem/mod.rs index dcf12bf82..52cdb4a20 100644 --- a/hermes/bin/src/runtime/host/wasi/filesystem/mod.rs +++ b/hermes/bin/src/runtime/host/wasi/filesystem/mod.rs @@ -20,7 +20,7 @@ use crate::runtime::extensions::{ pub(crate) struct State {} impl Stateful for State { - fn new(ctx: &crate::wasm::context::Context) -> Self { + fn new(ctx: &crate::state::Context) -> Self { Self {} } } diff --git a/hermes/bin/src/runtime/host/wasi/http/mod.rs b/hermes/bin/src/runtime/host/wasi/http/mod.rs index 095801795..2a35d7d81 100644 --- a/hermes/bin/src/runtime/host/wasi/http/mod.rs +++ b/hermes/bin/src/runtime/host/wasi/http/mod.rs @@ -24,7 +24,7 @@ use crate::runtime::extensions::{ pub(crate) struct State {} impl Stateful for State { - fn new(ctx: &crate::wasm::context::Context) -> Self { + fn new(ctx: &crate::state::Context) -> Self { Self {} } } diff --git a/hermes/bin/src/runtime/host/wasi/io/error.rs b/hermes/bin/src/runtime/host/wasi/io/error.rs index 117e3885d..e2299348a 100644 --- a/hermes/bin/src/runtime/host/wasi/io/error.rs +++ b/hermes/bin/src/runtime/host/wasi/io/error.rs @@ -10,7 +10,7 @@ use crate::runtime::extensions::{ pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::wasm::context::Context) -> Self { + fn new(_ctx: &crate::state::Context) -> Self { Self {} } } diff --git a/hermes/bin/src/runtime/host/wasi/io/mod.rs b/hermes/bin/src/runtime/host/wasi/io/mod.rs index bfb5727cd..6132c34c4 100644 --- a/hermes/bin/src/runtime/host/wasi/io/mod.rs +++ b/hermes/bin/src/runtime/host/wasi/io/mod.rs @@ -15,7 +15,7 @@ pub(crate) struct State { } impl Stateful for State { - fn new(ctx: &crate::wasm::context::Context) -> Self { + fn new(ctx: &crate::state::Context) -> Self { Self { error: error::State::new(ctx), streams: streams::State::new(ctx), diff --git a/hermes/bin/src/runtime/host/wasi/io/streams.rs b/hermes/bin/src/runtime/host/wasi/io/streams.rs index e427b699d..841768b05 100644 --- a/hermes/bin/src/runtime/host/wasi/io/streams.rs +++ b/hermes/bin/src/runtime/host/wasi/io/streams.rs @@ -12,7 +12,7 @@ use crate::runtime::extensions::{ pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::wasm::context::Context) -> Self { + fn new(_ctx: &crate::state::Context) -> Self { Self {} } } diff --git a/hermes/bin/src/runtime/host/wasi/mod.rs b/hermes/bin/src/runtime/host/wasi/mod.rs index d35916f36..da72302e6 100644 --- a/hermes/bin/src/runtime/host/wasi/mod.rs +++ b/hermes/bin/src/runtime/host/wasi/mod.rs @@ -27,7 +27,7 @@ pub(crate) struct State { } impl Stateful for State { - fn new(ctx: &crate::wasm::context::Context) -> Self { + fn new(ctx: &crate::state::Context) -> Self { Self { cli: cli::State::new(ctx), clocks: clocks::State::new(ctx), diff --git a/hermes/bin/src/runtime/host/wasi/random/insecure.rs b/hermes/bin/src/runtime/host/wasi/random/insecure.rs index 3cbc5add0..c274bc891 100644 --- a/hermes/bin/src/runtime/host/wasi/random/insecure.rs +++ b/hermes/bin/src/runtime/host/wasi/random/insecure.rs @@ -6,7 +6,7 @@ use crate::runtime::extensions::{wasi::random::insecure::Host, HermesState, Stat pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::wasm::context::Context) -> Self { + fn new(_ctx: &crate::state::Context) -> Self { Self {} } } diff --git a/hermes/bin/src/runtime/host/wasi/random/insecure_seed.rs b/hermes/bin/src/runtime/host/wasi/random/insecure_seed.rs index 8306e3aab..d5286ce56 100644 --- a/hermes/bin/src/runtime/host/wasi/random/insecure_seed.rs +++ b/hermes/bin/src/runtime/host/wasi/random/insecure_seed.rs @@ -6,7 +6,7 @@ use crate::runtime::extensions::{wasi::random::insecure_seed::Host, HermesState, pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::wasm::context::Context) -> Self { + fn new(_ctx: &crate::state::Context) -> Self { Self {} } } diff --git a/hermes/bin/src/runtime/host/wasi/random/mod.rs b/hermes/bin/src/runtime/host/wasi/random/mod.rs index a4881c2ee..6c7633237 100644 --- a/hermes/bin/src/runtime/host/wasi/random/mod.rs +++ b/hermes/bin/src/runtime/host/wasi/random/mod.rs @@ -19,7 +19,7 @@ pub(crate) struct State { } impl Stateful for State { - fn new(ctx: &crate::wasm::context::Context) -> Self { + fn new(ctx: &crate::state::Context) -> Self { Self { insecure: insecure::State::new(ctx), insecure_seed: insecure_seed::State::new(ctx), diff --git a/hermes/bin/src/runtime/host/wasi/random/secure.rs b/hermes/bin/src/runtime/host/wasi/random/secure.rs index 8f8893810..270f889fb 100644 --- a/hermes/bin/src/runtime/host/wasi/random/secure.rs +++ b/hermes/bin/src/runtime/host/wasi/random/secure.rs @@ -6,7 +6,7 @@ use crate::runtime::extensions::{wasi::random::random::Host, HermesState, Statef pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::wasm::context::Context) -> Self { + fn new(_ctx: &crate::state::Context) -> Self { Self {} } } diff --git a/hermes/bin/src/wasm/context.rs b/hermes/bin/src/state.rs similarity index 97% rename from hermes/bin/src/wasm/context.rs rename to hermes/bin/src/state.rs index b5b1c3913..04f4f734c 100644 --- a/hermes/bin/src/wasm/context.rs +++ b/hermes/bin/src/state.rs @@ -1,4 +1,4 @@ -//! WASM module's context implementation. +//! Hermes state implementation. use rusty_ulid::Ulid; diff --git a/hermes/bin/src/wasm/mod.rs b/hermes/bin/src/wasm/mod.rs index 4ec605598..2a847a259 100644 --- a/hermes/bin/src/wasm/mod.rs +++ b/hermes/bin/src/wasm/mod.rs @@ -1,6 +1,5 @@ //! WASM related structures and functions which are specific for the Hermes use case. //! All implementation based on [wasmtime](https://crates.io/crates/wasmtime) crate dependency. -pub(crate) mod context; pub(crate) mod engine; pub(crate) mod module; diff --git a/hermes/bin/src/wasm/module.rs b/hermes/bin/src/wasm/module.rs index 8d519f883..51a1223f2 100644 --- a/hermes/bin/src/wasm/module.rs +++ b/hermes/bin/src/wasm/module.rs @@ -12,8 +12,8 @@ use wasmtime::{ Store as WasmStore, }; -use super::{context::Context, engine::Engine}; -use crate::event::HermesEventPayload; +use super::engine::Engine; +use crate::{event::HermesEventPayload, state::Context}; /// Interface for linking WASM imports pub(crate) trait Host { From ca497973f901125c6dfcf7a8425bcb7618b508fc Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Thu, 8 Feb 2024 20:43:21 +0200 Subject: [PATCH 11/36] refactor --- hermes/bin/src/lib.rs | 1 + hermes/bin/src/runtime/extensions/mod.rs | 66 +++----- .../bin/src/runtime/host/hermes/binary/mod.rs | 6 +- .../src/runtime/host/hermes/cardano/mod.rs | 21 ++- .../bin/src/runtime/host/hermes/cbor/mod.rs | 6 +- .../bin/src/runtime/host/hermes/cron/mod.rs | 22 +-- .../bin/src/runtime/host/hermes/crypto/mod.rs | 21 ++- .../bin/src/runtime/host/hermes/hash/mod.rs | 13 +- .../bin/src/runtime/host/hermes/init/mod.rs | 5 +- .../bin/src/runtime/host/hermes/json/mod.rs | 6 +- .../src/runtime/host/hermes/kv_store/mod.rs | 23 ++- .../src/runtime/host/hermes/localtime/mod.rs | 17 ++- .../src/runtime/host/hermes/logging/mod.rs | 11 +- hermes/bin/src/runtime/host/hermes/mod.rs | 49 +++--- hermes/bin/src/runtime/host/wasi/cli/mod.rs | 9 +- .../bin/src/runtime/host/wasi/clocks/mod.rs | 12 +- .../src/runtime/host/wasi/clocks/monotonic.rs | 9 +- .../bin/src/runtime/host/wasi/clocks/wall.rs | 8 +- .../src/runtime/host/wasi/filesystem/mod.rs | 99 ++++++------ hermes/bin/src/runtime/host/wasi/http/mod.rs | 142 +++++++++--------- hermes/bin/src/runtime/host/wasi/io/error.rs | 11 +- hermes/bin/src/runtime/host/wasi/io/mod.rs | 11 +- .../bin/src/runtime/host/wasi/io/streams.rs | 41 +++-- hermes/bin/src/runtime/host/wasi/mod.rs | 29 ++-- .../src/runtime/host/wasi/random/insecure.rs | 7 +- .../runtime/host/wasi/random/insecure_seed.rs | 5 +- .../bin/src/runtime/host/wasi/random/mod.rs | 18 +-- .../src/runtime/host/wasi/random/secure.rs | 7 +- hermes/bin/src/state.rs | 31 ++++ 29 files changed, 359 insertions(+), 347 deletions(-) diff --git a/hermes/bin/src/lib.rs b/hermes/bin/src/lib.rs index 33cd83245..0154504fe 100644 --- a/hermes/bin/src/lib.rs +++ b/hermes/bin/src/lib.rs @@ -2,5 +2,6 @@ //! This file exists, so that doc tests can be used inside binary crates. pub(crate) mod event; +pub(crate) mod runtime; pub(crate) mod state; pub(crate) mod wasm; diff --git a/hermes/bin/src/runtime/extensions/mod.rs b/hermes/bin/src/runtime/extensions/mod.rs index 96145b660..95c00f67d 100644 --- a/hermes/bin/src/runtime/extensions/mod.rs +++ b/hermes/bin/src/runtime/extensions/mod.rs @@ -5,61 +5,35 @@ //! ``` //! cargo expand --bin hermes runtime::extensions //! ``` -#![allow(clippy::indexing_slicing)] use wasmtime::{ - component::{bindgen, Component, Linker}, + component::{Component, Linker}, Config, Engine, Store, }; -use self::{ +use self::bindings::{ exports::hermes::cardano::event_on_block::BlockSrc, hermes::{ cardano::api::{CardanoBlock, CardanoBlockchainId, CardanoTxn}, cron::api::CronTagged, }, }; -use crate::{runtime, state::Context}; - -bindgen!({ - world: "hermes", - path: "../../wasm/wasi/wit", -}); - -/// All Hermes runtime extensions states need to implement this. -pub(crate) trait Stateful { - /// Initial state for the given context - fn new(ctx: &Context) -> Self; +use crate::state::{Context, HermesState}; + +/// WASM component autogenerated bindings +#[allow(clippy::indexing_slicing)] +pub(crate) mod bindings { + use wasmtime::component::bindgen; + bindgen!({ + world: "hermes", + path: "../../wasm/wasi/wit", + }); } - -#[allow(dead_code)] -/// State for Hermes runtime -pub(crate) struct HermesState { - /// Hermes custom extensions state - pub hermes: runtime::host::hermes::State, - - /// WASI standard extensions state - pub wasi: runtime::host::wasi::State, - - /// The context of the wasm modules using this State. - pub ctx: Context, -} - -impl Stateful for HermesState { - fn new(ctx: &Context) -> HermesState { - HermesState { - hermes: runtime::host::hermes::State::new(ctx), - wasi: runtime::host::wasi::State::new(ctx), - ctx: ctx.clone(), - } - } -} - #[allow(dead_code)] /// Link a component to the Hermes runtime. pub(crate) fn link_runtime(engine: &Engine) -> anyhow::Result> { let mut linker = Linker::new(engine); - Hermes::add_to_linker(&mut linker, |state: &mut HermesState| state)?; + bindings::Hermes::add_to_linker(&mut linker, |state: &mut HermesState| state)?; Ok(linker) } @@ -67,6 +41,8 @@ pub(crate) fn link_runtime(engine: &Engine) -> anyhow::Result anyhow::Result<()> { + use crate::state::Stateful; + // Configure an `Engine` and compile the `Component` that is being run for // the application. let mut config = Config::new(); @@ -96,10 +72,10 @@ fn example() -> anyhow::Result<()> { ); // - let (bindings, _) = Hermes::instantiate_pre(&mut store, &instance_pre)?; + let (bindings, _) = bindings::Hermes::instantiate_pre(&mut store, &instance_pre)?; // Show how we call the events in our API. - let _result = bindings.interface5.call_init(&mut store)?; + let _result = bindings.hermes_init_event().call_init(&mut store)?; // HTTP API to be rewritten, but this is how its called. // let arg1 = ??; @@ -137,13 +113,15 @@ fn example() -> anyhow::Result<()> { tag: "tag".to_string(), }; let arg1 = false; - let _result = bindings.interface4.call_on_cron(&mut store, &arg0, arg1)?; + let _result = bindings + .hermes_cron_event() + .call_on_cron(&mut store, &arg0, arg1)?; // Example of calling kv_update let arg0 = "key"; - let arg1 = hermes::kv_store::api::KvValues::KvString("value".to_string()); + let arg1 = bindings::hermes::kv_store::api::KvValues::KvString("value".to_string()); bindings - .interface6 + .hermes_kv_store_event() .call_kv_update(&mut store, arg0, &arg1)?; Ok(()) diff --git a/hermes/bin/src/runtime/host/hermes/binary/mod.rs b/hermes/bin/src/runtime/host/hermes/binary/mod.rs index 8876c6091..11e2dcd58 100644 --- a/hermes/bin/src/runtime/host/hermes/binary/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/binary/mod.rs @@ -1,7 +1,9 @@ //! Host - CBOR implementations -#![allow(unused_variables)] -use crate::runtime::extensions::{hermes::binary::api::Host, HermesState, Stateful}; +use crate::{ + runtime::extensions::bindings::hermes::binary::api::Host, + state::{HermesState, Stateful}, +}; /// State pub(crate) struct State {} diff --git a/hermes/bin/src/runtime/host/hermes/cardano/mod.rs b/hermes/bin/src/runtime/host/hermes/cardano/mod.rs index 7bd5aaf16..3a8bf65c2 100644 --- a/hermes/bin/src/runtime/host/hermes/cardano/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/cardano/mod.rs @@ -1,12 +1,11 @@ //! Host - Cardano Blockchain implementations -#![allow(unused_variables)] -use crate::runtime::extensions::{ - hermes::cardano::api::{ +use crate::{ + runtime::extensions::bindings::hermes::cardano::api::{ CardanoBlock, CardanoBlockchainId, CardanoTxn, FetchError, Host, Slot, TxnError, UnsubscribeOptions, }, - HermesState, Stateful, + state::{HermesState, Stateful}, }; /// State @@ -47,7 +46,7 @@ impl Host for HermesState { /// `whence` == `stop` will prevent the blockchain syncing, and the caller will be /// unsubscribed. fn subscribe_blocks( - &mut self, net: CardanoBlockchainId, whence: Slot, + &mut self, _net: CardanoBlockchainId, _whence: Slot, ) -> wasmtime::Result> { todo!() } @@ -72,7 +71,7 @@ impl Host for HermesState { /// the last block received. This would result in the last block being sent as an /// event twice, /// once before the `stop` and once after the `continue`. - fn unsubscribe(&mut self, events: UnsubscribeOptions) -> wasmtime::Result<()> { + fn unsubscribe(&mut self, _events: UnsubscribeOptions) -> wasmtime::Result<()> { todo!() } @@ -82,7 +81,7 @@ impl Host for HermesState { /// **Parameters** /// /// - `net` : The blockchain network to subscribe to txn events from. - fn subscribe_txn(&mut self, net: CardanoBlockchainId) -> wasmtime::Result<()> { + fn subscribe_txn(&mut self, _net: CardanoBlockchainId) -> wasmtime::Result<()> { todo!() } @@ -99,7 +98,7 @@ impl Host for HermesState { /// data from the rollback point. No action is required to actually follow the /// rollback, unless the /// default behavior is not desired. - fn subscribe_rollback(&mut self, net: CardanoBlockchainId) -> wasmtime::Result<()> { + fn subscribe_rollback(&mut self, _net: CardanoBlockchainId) -> wasmtime::Result<()> { todo!() } @@ -124,7 +123,7 @@ impl Host for HermesState { /// parallel /// to automated block fetch. fn fetch_block( - &mut self, net: CardanoBlockchainId, whence: Slot, + &mut self, _net: CardanoBlockchainId, _whence: Slot, ) -> wasmtime::Result> { todo!() } @@ -146,7 +145,7 @@ impl Host for HermesState { /// This function exists to support `fetch-block`. /// Transactions from subscribed block events, should be processed as transaction /// events. - fn get_txns(&mut self, block: CardanoBlock) -> wasmtime::Result> { + fn get_txns(&mut self, _block: CardanoBlock) -> wasmtime::Result> { todo!() } @@ -168,7 +167,7 @@ impl Host for HermesState { /// This is proposed functionality, and is not yet active. /// All calls to this function will return `post-txn-not-allowed` error. fn post_txn( - &mut self, net: CardanoBlockchainId, txn: CardanoTxn, + &mut self, _net: CardanoBlockchainId, _txn: CardanoTxn, ) -> wasmtime::Result> { todo!() } diff --git a/hermes/bin/src/runtime/host/hermes/cbor/mod.rs b/hermes/bin/src/runtime/host/hermes/cbor/mod.rs index 439fe1f36..7a0c67235 100644 --- a/hermes/bin/src/runtime/host/hermes/cbor/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/cbor/mod.rs @@ -1,7 +1,9 @@ //! Host - CBOR implementations -#![allow(unused_variables)] -use crate::runtime::extensions::{hermes::cbor::api::Host, HermesState, Stateful}; +use crate::{ + runtime::extensions::bindings::hermes::cbor::api::Host, + state::{HermesState, Stateful}, +}; /// State pub(crate) struct State {} diff --git a/hermes/bin/src/runtime/host/hermes/cron/mod.rs b/hermes/bin/src/runtime/host/hermes/cron/mod.rs index acb7b9a96..9e590d383 100644 --- a/hermes/bin/src/runtime/host/hermes/cron/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/cron/mod.rs @@ -1,10 +1,11 @@ //! Host - Cron implementations -#![allow(unused_variables)] -use crate::runtime::extensions::{ - hermes::cron::api::{CronEventTag, CronSched, CronTagged, CronTime, Host}, - wasi::clocks::monotonic_clock::Instant, - HermesState, Stateful, +use crate::{ + runtime::extensions::{ + bindings::hermes::cron::api::{CronEventTag, CronSched, CronTagged, CronTime, Host}, + bindings::wasi::clocks::monotonic_clock::Instant, + }, + state::{HermesState, Stateful}, }; /// State @@ -41,7 +42,7 @@ impl Host for HermesState { /// If the crontab entry already exists, the retrigger flag can be changed by calling /// this function. This could be useful where a retriggering crontab event is desired /// to be stopped, but ONLY after it has triggered once more. - fn add(&mut self, entry: CronTagged, retrigger: bool) -> wasmtime::Result { + fn add(&mut self, _entry: CronTagged, _retrigger: bool) -> wasmtime::Result { todo!() } @@ -68,7 +69,7 @@ impl Host for HermesState { /// It is added as a non-retriggering event. /// Listing the crontabs after this call will list the delay in addition to all other /// crontab entries. - fn delay(&mut self, duration: Instant, tag: CronEventTag) -> wasmtime::Result { + fn delay(&mut self, _duration: Instant, _tag: CronEventTag) -> wasmtime::Result { todo!() } @@ -89,7 +90,7 @@ impl Host for HermesState { /// may times before a later one. /// - `0` - `cron-tagged` - The Tagged crontab event. /// - `1` - `bool` - The state of the retrigger flag. - fn ls(&mut self, tag: Option) -> wasmtime::Result> { + fn ls(&mut self, _tag: Option) -> wasmtime::Result> { todo!() } @@ -106,7 +107,7 @@ impl Host for HermesState { /// /// - `true`: The requested crontab was deleted and will not trigger. /// - `false`: The requested crontab does not exist. - fn rm(&mut self, entry: CronTagged) -> wasmtime::Result { + fn rm(&mut self, _entry: CronTagged) -> wasmtime::Result { todo!() } @@ -137,7 +138,8 @@ impl Host for HermesState { /// - For example specifying a `month` as `3` and `2-4` will /// remove the individual month and only produce the range. fn mkcron( - &mut self, dow: CronTime, month: CronTime, day: CronTime, hour: CronTime, minute: CronTime, + &mut self, _dow: CronTime, _month: CronTime, _day: CronTime, _hour: CronTime, + _minute: CronTime, ) -> wasmtime::Result { todo!() } diff --git a/hermes/bin/src/runtime/host/hermes/crypto/mod.rs b/hermes/bin/src/runtime/host/hermes/crypto/mod.rs index c75e58ae0..ace016b55 100644 --- a/hermes/bin/src/runtime/host/hermes/crypto/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/crypto/mod.rs @@ -1,15 +1,14 @@ //! Host - Crypto implementations -#![allow(unused_variables)] -use crate::runtime::extensions::{ - hermes::{ +use crate::{ + runtime::extensions::bindings::hermes::{ binary::api::Bstr, crypto::api::{ Ed25519Bip32, Ed25519Bip32PrivateKey, Ed25519Bip32PublicKey, Ed25519Bip32Signature, Host, HostEd25519Bip32, }, }, - HermesState, Stateful, + state::{HermesState, Stateful}, }; /// State @@ -28,14 +27,14 @@ impl HostEd25519Bip32 for HermesState { /// /// - `private_key` : The key to use, if not supplied one is RANDOMLY generated. fn new( - &mut self, private_key: Option, + &mut self, _private_key: Option, ) -> wasmtime::Result> { todo!() } /// Get the public key for this private key. fn public_key( - &mut self, self_: wasmtime::component::Resource, + &mut self, _resource: wasmtime::component::Resource, ) -> wasmtime::Result { todo!() } @@ -46,7 +45,7 @@ impl HostEd25519Bip32 for HermesState { /// /// - `data` : The data to sign. fn sign_data( - &mut self, self_: wasmtime::component::Resource, data: Bstr, + &mut self, _resource: wasmtime::component::Resource, _data: Bstr, ) -> wasmtime::Result { todo!() } @@ -63,8 +62,8 @@ impl HostEd25519Bip32 for HermesState { /// - `true` : Signature checked OK. /// - `false` : Signature check failed. fn check_sig( - &mut self, self_: wasmtime::component::Resource, data: Bstr, - sig: Ed25519Bip32Signature, + &mut self, _resource: wasmtime::component::Resource, _data: Bstr, + _sig: Ed25519Bip32Signature, ) -> wasmtime::Result { todo!() } @@ -73,7 +72,7 @@ impl HostEd25519Bip32 for HermesState { /// /// Note: uses BIP32 HD key derivation. fn derive( - &mut self, self_: wasmtime::component::Resource, + &mut self, _resource: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } @@ -86,7 +85,7 @@ impl HostEd25519Bip32 for HermesState { todo!() } - fn drop(&mut self, rep: wasmtime::component::Resource) -> wasmtime::Result<()> { + fn drop(&mut self, _rep: wasmtime::component::Resource) -> wasmtime::Result<()> { todo!() } } diff --git a/hermes/bin/src/runtime/host/hermes/hash/mod.rs b/hermes/bin/src/runtime/host/hermes/hash/mod.rs index 5f4a7655c..c011208a9 100644 --- a/hermes/bin/src/runtime/host/hermes/hash/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/hash/mod.rs @@ -1,12 +1,11 @@ //! Host - Hash implementations -#![allow(unused_variables)] -use crate::runtime::extensions::{ - hermes::{ +use crate::{ + runtime::extensions::bindings::hermes::{ binary::api::Bstr, hash::api::{Errno, Host}, }, - HermesState, Stateful, + state::{HermesState, Stateful}, }; /// State @@ -21,21 +20,21 @@ impl Stateful for State { impl Host for HermesState { /// Hash a binary buffer with BLAKE2s fn blake2s( - &mut self, buf: Bstr, outlen: Option, key: Option, + &mut self, _buf: Bstr, _outlen: Option, _key: Option, ) -> wasmtime::Result> { todo!() } /// Hash a binary buffer with `BLAKE2b` fn blake2b( - &mut self, buf: Bstr, outlen: Option, key: Option, + &mut self, _buf: Bstr, _outlen: Option, _key: Option, ) -> wasmtime::Result> { todo!() } /// Hash a binary buffer with BLAKE3 fn blake3( - &mut self, buf: Bstr, outlen: Option, key: Option, + &mut self, _buf: Bstr, _outlen: Option, _key: Option, ) -> wasmtime::Result> { todo!() } diff --git a/hermes/bin/src/runtime/host/hermes/init/mod.rs b/hermes/bin/src/runtime/host/hermes/init/mod.rs index d78dc0b17..da727827b 100644 --- a/hermes/bin/src/runtime/host/hermes/init/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/init/mod.rs @@ -1,9 +1,6 @@ //! Host - Init implementations -#![allow(unused_variables)] -use crate::runtime::extensions::Stateful; - -#[allow(dead_code)] +use crate::state::Stateful; /// State pub(crate) struct State {} diff --git a/hermes/bin/src/runtime/host/hermes/json/mod.rs b/hermes/bin/src/runtime/host/hermes/json/mod.rs index 3adb02d19..bac4649ab 100644 --- a/hermes/bin/src/runtime/host/hermes/json/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/json/mod.rs @@ -1,7 +1,9 @@ //! Host - JSON implementations -#![allow(unused_variables)] -use crate::runtime::extensions::{hermes::json::api::Host, HermesState, Stateful}; +use crate::{ + runtime::extensions::bindings::hermes::json::api::Host, + state::{HermesState, Stateful}, +}; /// State pub(crate) struct State {} diff --git a/hermes/bin/src/runtime/host/hermes/kv_store/mod.rs b/hermes/bin/src/runtime/host/hermes/kv_store/mod.rs index 6fdac308f..e1ce6a91b 100644 --- a/hermes/bin/src/runtime/host/hermes/kv_store/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/kv_store/mod.rs @@ -1,9 +1,8 @@ //! Host - KV-Store implementations -#![allow(unused_variables)] -use crate::runtime::extensions::{ - hermes::kv_store::api::{Host, KvValues}, - HermesState, Stateful, +use crate::{ + runtime::extensions::bindings::hermes::kv_store::api::{Host, KvValues}, + state::{HermesState, Stateful}, }; /// State @@ -18,14 +17,14 @@ impl Stateful for State { impl Host for HermesState { /// Set a value in the local key-value store /// Setting None will cause the Key to be deleted from the KV store. - fn kv_set(&mut self, key: String, value: Option) -> wasmtime::Result<()> { + fn kv_set(&mut self, _key: String, _value: Option) -> wasmtime::Result<()> { todo!() } /// Get a value from the local key-value store /// Returns the default if not set. fn kv_get_default( - &mut self, key: String, default: Option, + &mut self, _key: String, _default: Option, ) -> wasmtime::Result> { todo!() } @@ -33,14 +32,14 @@ impl Host for HermesState { /// Get a value from the local key-value store /// Returns None if the Key does not exist in the KV Store. /// This is a convenience function, and is equivalent to `kv-get-default(key, none)` - fn kv_get(&mut self, key: String) -> wasmtime::Result> { + fn kv_get(&mut self, _key: String) -> wasmtime::Result> { todo!() } /// Get a value, and then set it (Atomic) /// Setting None will cause the Key to be deleted from the KV store. fn kv_get_set( - &mut self, key: String, value: Option, + &mut self, _key: String, _value: Option, ) -> wasmtime::Result> { todo!() } @@ -62,7 +61,7 @@ impl Host for HermesState { /// concatenated /// Note: There will be no spaces added. So "My string" + u32(77) = "My string77" fn kv_add( - &mut self, key: String, value: Option, + &mut self, _key: String, _value: Option, ) -> wasmtime::Result> { todo!() } @@ -74,7 +73,7 @@ impl Host for HermesState { /// equivalent. /// For example: `u64(7) != s64(7)`, `float64(-1) != s64(-1)`. fn kv_cas( - &mut self, key: String, test: Option, value: Option, + &mut self, _key: String, _test: Option, _value: Option, ) -> wasmtime::Result> { todo!() } @@ -82,7 +81,7 @@ impl Host for HermesState { /// Subscribe to any updates made to a particular Key. /// After this call, this module will receive Key Update events when a key is written. /// It returns the current value of the Key and None if it is not set. - fn kv_subscribe(&mut self, key: String) -> wasmtime::Result> { + fn kv_subscribe(&mut self, _key: String) -> wasmtime::Result> { todo!() } @@ -90,7 +89,7 @@ impl Host for HermesState { /// After this call, this module will no longer receive Key Update events when a key /// is written. /// It returns the current value of the Key and None if it is not set. - fn kv_unsubscribe(&mut self, key: String) -> wasmtime::Result> { + fn kv_unsubscribe(&mut self, _key: String) -> wasmtime::Result> { todo!() } } diff --git a/hermes/bin/src/runtime/host/hermes/localtime/mod.rs b/hermes/bin/src/runtime/host/hermes/localtime/mod.rs index 2d426b7c5..be02de105 100644 --- a/hermes/bin/src/runtime/host/hermes/localtime/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/localtime/mod.rs @@ -1,10 +1,11 @@ //! Host - Localtime implementations -#![allow(unused_variables)] -use crate::runtime::extensions::{ - hermes::localtime::api::{Errno, Host, Localtime, Timezone}, - wasi::clocks::wall_clock::Datetime, - HermesState, Stateful, +use crate::{ + runtime::extensions::{ + bindings::hermes::localtime::api::{Errno, Host, Localtime, Timezone}, + bindings::wasi::clocks::wall_clock::Datetime, + }, + state::{HermesState, Stateful}, }; /// State @@ -31,7 +32,7 @@ impl Host for HermesState { /// `localtime` : the converted time. /// `errno` : An error indicating why conversion failed. fn get_localtime( - &mut self, when: Option, tz: Option, + &mut self, _when: Option, _tz: Option, ) -> wasmtime::Result> { todo!() } @@ -49,7 +50,7 @@ impl Host for HermesState { /// `localtime` : the converted time. /// `errno` : An error indicating why conversion failed. fn alt_localtime( - &mut self, time: Localtime, tz: Option, + &mut self, _time: Localtime, _tz: Option, ) -> wasmtime::Result> { todo!() } @@ -64,7 +65,7 @@ impl Host for HermesState { /// /// `datetime` : the converted time. /// `errno` : An error indicating why conversion failed. - fn get_datetime(&mut self, time: Localtime) -> wasmtime::Result> { + fn get_datetime(&mut self, _time: Localtime) -> wasmtime::Result> { todo!() } } diff --git a/hermes/bin/src/runtime/host/hermes/logging/mod.rs b/hermes/bin/src/runtime/host/hermes/logging/mod.rs index bbd2a4399..72f0522c1 100644 --- a/hermes/bin/src/runtime/host/hermes/logging/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/logging/mod.rs @@ -1,12 +1,11 @@ //! Host - Logging implementations -#![allow(unused_variables)] -use crate::runtime::extensions::{ - hermes::{ +use crate::{ + runtime::extensions::bindings::hermes::{ json::api::Json, logging::api::{Host, Level}, }, - HermesState, Stateful, + state::{HermesState, Stateful}, }; /// State @@ -65,8 +64,8 @@ impl Host for HermesState { /// Backtrace must be contained in a single `log` call. Multiple log calls will be /// considered independent logs. fn log( - &mut self, level: Level, file: Option, fn_: Option, line: Option, - col: Option, ctx: Option, msg: String, data: Option, + &mut self, _level: Level, _file: Option, _fn_: Option, _line: Option, + _col: Option, _ctx: Option, _msg: String, _data: Option, ) -> wasmtime::Result<()> { todo!() } diff --git a/hermes/bin/src/runtime/host/hermes/mod.rs b/hermes/bin/src/runtime/host/hermes/mod.rs index 0b0a07143..93a7d702b 100644 --- a/hermes/bin/src/runtime/host/hermes/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/mod.rs @@ -1,5 +1,7 @@ //! Runtime modules - extensions - HERMES custom extensions +use crate::state::Stateful; + pub(crate) mod binary; pub(crate) mod cardano; pub(crate) mod cbor; @@ -12,49 +14,46 @@ pub(crate) mod kv_store; pub(crate) mod localtime; pub(crate) mod logging; -use crate::runtime::extensions::Stateful; - -#[allow(dead_code)] /// Hermes extensions state pub(crate) struct State { /// Binary extensions state - binary: binary::State, + _binary: binary::State, /// Cardano extensions state - cardano: cardano::State, + _cardano: cardano::State, /// CBOR extensions state - cbor: cbor::State, + _cbor: cbor::State, /// Cron extensions state - cron: cron::State, + _cron: cron::State, /// Crypto extensions state - crypto: crypto::State, + _crypto: crypto::State, /// Hash extensions state - hash: hash::State, + _hash: hash::State, /// Init extensions state - init: init::State, + _init: init::State, /// JSON extensions state - json: json::State, + _json: json::State, /// KV store extensions state - kv_store: kv_store::State, + _kv_store: kv_store::State, /// Localtime extensions state - localtime: localtime::State, + _localtime: localtime::State, /// Logging extensions state - logging: logging::State, + _logging: logging::State, } impl Stateful for State { fn new(ctx: &crate::state::Context) -> Self { Self { - binary: binary::State::new(ctx), - cardano: cardano::State::new(ctx), - cbor: cbor::State::new(ctx), - cron: cron::State::new(ctx), - crypto: crypto::State::new(ctx), - hash: hash::State::new(ctx), - init: init::State::new(ctx), - json: json::State::new(ctx), - kv_store: kv_store::State::new(ctx), - localtime: localtime::State::new(ctx), - logging: logging::State::new(ctx), + _binary: binary::State::new(ctx), + _cardano: cardano::State::new(ctx), + _cbor: cbor::State::new(ctx), + _cron: cron::State::new(ctx), + _crypto: crypto::State::new(ctx), + _hash: hash::State::new(ctx), + _init: init::State::new(ctx), + _json: json::State::new(ctx), + _kv_store: kv_store::State::new(ctx), + _localtime: localtime::State::new(ctx), + _logging: logging::State::new(ctx), } } } diff --git a/hermes/bin/src/runtime/host/wasi/cli/mod.rs b/hermes/bin/src/runtime/host/wasi/cli/mod.rs index 96c2fd342..cedfda2fc 100644 --- a/hermes/bin/src/runtime/host/wasi/cli/mod.rs +++ b/hermes/bin/src/runtime/host/wasi/cli/mod.rs @@ -1,19 +1,18 @@ //! Host - WASI - CLI implementations -#![allow(unused_variables)] -use crate::runtime::extensions::{ - wasi::{ +use crate::{ + runtime::extensions::bindings::wasi::{ cli, io::streams::{InputStream, OutputStream}, }, - HermesState, Stateful, + state::{HermesState, Stateful}, }; /// WASI State pub(crate) struct State {} impl Stateful for State { - fn new(ctx: &crate::state::Context) -> Self { + fn new(_ctx: &crate::state::Context) -> Self { Self {} } } diff --git a/hermes/bin/src/runtime/host/wasi/clocks/mod.rs b/hermes/bin/src/runtime/host/wasi/clocks/mod.rs index 443ac4ffd..220c86126 100644 --- a/hermes/bin/src/runtime/host/wasi/clocks/mod.rs +++ b/hermes/bin/src/runtime/host/wasi/clocks/mod.rs @@ -1,25 +1,23 @@ //! Host - WASI - Clock implementations -#![allow(unused_variables)] -use crate::runtime::extensions::Stateful; +use crate::state::Stateful; mod monotonic; mod wall; -#[allow(dead_code)] /// WASI State pub(crate) struct State { /// monotonic State - monotonic: monotonic::State, + _monotonic: monotonic::State, /// wall State - wall: wall::State, + _wall: wall::State, } impl Stateful for State { fn new(ctx: &crate::state::Context) -> Self { Self { - monotonic: monotonic::State::new(ctx), - wall: wall::State::new(ctx), + _monotonic: monotonic::State::new(ctx), + _wall: wall::State::new(ctx), } } } diff --git a/hermes/bin/src/runtime/host/wasi/clocks/monotonic.rs b/hermes/bin/src/runtime/host/wasi/clocks/monotonic.rs index 4b5d47699..ee68930b0 100644 --- a/hermes/bin/src/runtime/host/wasi/clocks/monotonic.rs +++ b/hermes/bin/src/runtime/host/wasi/clocks/monotonic.rs @@ -1,16 +1,15 @@ //! Host - WASI - monotonic clock implementations -#![allow(unused_variables)] -use crate::runtime::extensions::{ - wasi::clocks::monotonic_clock::{Duration, Host, Instant}, - HermesState, Stateful, +use crate::{ + runtime::extensions::bindings::wasi::clocks::monotonic_clock::{Duration, Host, Instant}, + state::{HermesState, Stateful}, }; /// WASI State pub(crate) struct State {} impl Stateful for State { - fn new(ctx: &crate::state::Context) -> Self { + fn new(_ctx: &crate::state::Context) -> Self { Self {} } } diff --git a/hermes/bin/src/runtime/host/wasi/clocks/wall.rs b/hermes/bin/src/runtime/host/wasi/clocks/wall.rs index b21b3fb63..69677bb6b 100644 --- a/hermes/bin/src/runtime/host/wasi/clocks/wall.rs +++ b/hermes/bin/src/runtime/host/wasi/clocks/wall.rs @@ -1,15 +1,15 @@ //! Host - WASI - Wall Clock implementations -use crate::runtime::extensions::{ - wasi::clocks::wall_clock::{Datetime, Host}, - HermesState, Stateful, +use crate::{ + runtime::extensions::bindings::wasi::clocks::wall_clock::{Datetime, Host}, + state::{HermesState, Stateful}, }; /// WASI State pub(crate) struct State {} impl Stateful for State { - fn new(ctx: &crate::state::Context) -> Self { + fn new(_ctx: &crate::state::Context) -> Self { Self {} } } diff --git a/hermes/bin/src/runtime/host/wasi/filesystem/mod.rs b/hermes/bin/src/runtime/host/wasi/filesystem/mod.rs index 52cdb4a20..c28cfefd7 100644 --- a/hermes/bin/src/runtime/host/wasi/filesystem/mod.rs +++ b/hermes/bin/src/runtime/host/wasi/filesystem/mod.rs @@ -1,8 +1,7 @@ //! Host - WASI - Filesystem implementations -#![allow(unused_variables)] -use crate::runtime::extensions::{ - wasi::{ +use crate::{ + runtime::extensions::bindings::wasi::{ filesystem::{ self, types::{ @@ -13,14 +12,14 @@ use crate::runtime::extensions::{ }, io::streams::{InputStream, OutputStream}, }, - HermesState, Stateful, + state::{HermesState, Stateful}, }; /// WASI State pub(crate) struct State {} impl Stateful for State { - fn new(ctx: &crate::state::Context) -> Self { + fn new(_ctx: &crate::state::Context) -> Self { Self {} } } @@ -35,7 +34,7 @@ impl filesystem::types::HostDescriptor for HermesState { /// /// Note: This allows using `read-stream`, which is similar to `read` in POSIX. fn read_via_stream( - &mut self, self_: wasmtime::component::Resource, offset: Filesize, + &mut self, _descriptor: wasmtime::component::Resource, _offset: Filesize, ) -> wasmtime::Result, ErrorCode>> { todo!() } @@ -47,7 +46,7 @@ impl filesystem::types::HostDescriptor for HermesState { /// Note: This allows using `write-stream`, which is similar to `write` in /// POSIX. fn write_via_stream( - &mut self, self_: wasmtime::component::Resource, offset: Filesize, + &mut self, _descriptor: wasmtime::component::Resource, _offset: Filesize, ) -> wasmtime::Result, ErrorCode>> { todo!() } @@ -59,7 +58,7 @@ impl filesystem::types::HostDescriptor for HermesState { /// Note: This allows using `write-stream`, which is similar to `write` with /// `O_APPEND` in in POSIX. fn append_via_stream( - &mut self, self_: wasmtime::component::Resource, + &mut self, _descriptor: wasmtime::component::Resource, ) -> wasmtime::Result, ErrorCode>> { todo!() } @@ -68,8 +67,8 @@ impl filesystem::types::HostDescriptor for HermesState { /// /// This is similar to `posix_fadvise` in POSIX. fn advise( - &mut self, self_: wasmtime::component::Resource, offset: Filesize, - length: Filesize, advice: Advice, + &mut self, _descriptor: wasmtime::component::Resource, _offset: Filesize, + _length: Filesize, _advice: Advice, ) -> wasmtime::Result> { todo!() } @@ -81,7 +80,7 @@ impl filesystem::types::HostDescriptor for HermesState { /// /// Note: This is similar to `fdatasync` in POSIX. fn sync_data( - &mut self, self_: wasmtime::component::Resource, + &mut self, _descriptor: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } @@ -93,7 +92,7 @@ impl filesystem::types::HostDescriptor for HermesState { /// Note: This returns the value that was the `fs_flags` value returned /// from `fdstat_get` in earlier versions of WASI. fn get_flags( - &mut self, self_: wasmtime::component::Resource, + &mut self, _descriptor: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } @@ -109,7 +108,7 @@ impl filesystem::types::HostDescriptor for HermesState { /// Note: This returns the value that was the `fs_filetype` value returned /// from `fdstat_get` in earlier versions of WASI. fn get_type( - &mut self, self_: wasmtime::component::Resource, + &mut self, _descriptor: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } @@ -119,7 +118,7 @@ impl filesystem::types::HostDescriptor for HermesState { /// /// Note: This was called `fd_filestat_set_size` in earlier versions of WASI. fn set_size( - &mut self, self_: wasmtime::component::Resource, size: Filesize, + &mut self, _descriptor: wasmtime::component::Resource, _size: Filesize, ) -> wasmtime::Result> { todo!() } @@ -130,8 +129,8 @@ impl filesystem::types::HostDescriptor for HermesState { /// /// Note: This was called `fd_filestat_set_times` in earlier versions of WASI. fn set_times( - &mut self, self_: wasmtime::component::Resource, - data_access_timestamp: NewTimestamp, data_modification_timestamp: NewTimestamp, + &mut self, _descriptor: wasmtime::component::Resource, + _data_access_timestamp: NewTimestamp, _data_modification_timestamp: NewTimestamp, ) -> wasmtime::Result> { todo!() } @@ -148,8 +147,8 @@ impl filesystem::types::HostDescriptor for HermesState { /// /// Note: This is similar to `pread` in POSIX. fn read( - &mut self, self_: wasmtime::component::Resource, length: Filesize, - offset: Filesize, + &mut self, _descriptor: wasmtime::component::Resource, _length: Filesize, + _offset: Filesize, ) -> wasmtime::Result, bool), ErrorCode>> { todo!() } @@ -164,8 +163,8 @@ impl filesystem::types::HostDescriptor for HermesState { /// /// Note: This is similar to `pwrite` in POSIX. fn write( - &mut self, self_: wasmtime::component::Resource, buffer: Vec, - offset: Filesize, + &mut self, _descriptor: wasmtime::component::Resource, _buffer: Vec, + _offset: Filesize, ) -> wasmtime::Result> { todo!() } @@ -180,7 +179,7 @@ impl filesystem::types::HostDescriptor for HermesState { /// directory. Multiple streams may be active on the same directory, and they /// do not interfere with each other. fn read_directory( - &mut self, self_: wasmtime::component::Resource, + &mut self, _descriptor: wasmtime::component::Resource, ) -> wasmtime::Result, ErrorCode>> { todo!() @@ -193,7 +192,7 @@ impl filesystem::types::HostDescriptor for HermesState { /// /// Note: This is similar to `fsync` in POSIX. fn sync( - &mut self, self_: wasmtime::component::Resource, + &mut self, _descriptor: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } @@ -202,7 +201,7 @@ impl filesystem::types::HostDescriptor for HermesState { /// /// Note: This is similar to `mkdirat` in POSIX. fn create_directory_at( - &mut self, self_: wasmtime::component::Resource, path: String, + &mut self, _descriptor: wasmtime::component::Resource, _path: String, ) -> wasmtime::Result> { todo!() } @@ -217,7 +216,7 @@ impl filesystem::types::HostDescriptor for HermesState { /// /// Note: This was called `fd_filestat_get` in earlier versions of WASI. fn stat( - &mut self, self_: wasmtime::component::Resource, + &mut self, _descriptor: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } @@ -230,8 +229,8 @@ impl filesystem::types::HostDescriptor for HermesState { /// /// Note: This was called `path_filestat_get` in earlier versions of WASI. fn stat_at( - &mut self, self_: wasmtime::component::Resource, path_flags: PathFlags, - path: String, + &mut self, _descriptor: wasmtime::component::Resource, _path_flags: PathFlags, + _path: String, ) -> wasmtime::Result> { todo!() } @@ -243,9 +242,9 @@ impl filesystem::types::HostDescriptor for HermesState { /// Note: This was called `path_filestat_set_times` in earlier versions of /// WASI. fn set_times_at( - &mut self, self_: wasmtime::component::Resource, path_flags: PathFlags, - path: String, data_access_timestamp: NewTimestamp, - data_modification_timestamp: NewTimestamp, + &mut self, _descriptor: wasmtime::component::Resource, _path_flags: PathFlags, + _path: String, _data_access_timestamp: NewTimestamp, + _data_modification_timestamp: NewTimestamp, ) -> wasmtime::Result> { todo!() } @@ -254,9 +253,9 @@ impl filesystem::types::HostDescriptor for HermesState { /// /// Note: This is similar to `linkat` in POSIX. fn link_at( - &mut self, self_: wasmtime::component::Resource, old_path_flags: PathFlags, - old_path: String, new_descriptor: wasmtime::component::Resource, - new_path: String, + &mut self, _descriptor: wasmtime::component::Resource, + _old_path_flags: PathFlags, _old_path: String, + _new_descriptor: wasmtime::component::Resource, _new_path: String, ) -> wasmtime::Result> { todo!() } @@ -280,8 +279,8 @@ impl filesystem::types::HostDescriptor for HermesState { /// /// Note: This is similar to `openat` in POSIX. fn open_at( - &mut self, self_: wasmtime::component::Resource, path_flags: PathFlags, - path: String, open_flags: OpenFlags, flags: DescriptorFlags, + &mut self, _descriptor: wasmtime::component::Resource, _path_flags: PathFlags, + _path: String, _open_flags: OpenFlags, _flags: DescriptorFlags, ) -> wasmtime::Result, ErrorCode>> { todo!() } @@ -293,7 +292,7 @@ impl filesystem::types::HostDescriptor for HermesState { /// /// Note: This is similar to `readlinkat` in POSIX. fn readlink_at( - &mut self, self_: wasmtime::component::Resource, path: String, + &mut self, _descriptor: wasmtime::component::Resource, _path: String, ) -> wasmtime::Result> { todo!() } @@ -304,7 +303,7 @@ impl filesystem::types::HostDescriptor for HermesState { /// /// Note: This is similar to `unlinkat(fd, path, AT_REMOVEDIR)` in POSIX. fn remove_directory_at( - &mut self, self_: wasmtime::component::Resource, path: String, + &mut self, _descriptor: wasmtime::component::Resource, _path: String, ) -> wasmtime::Result> { todo!() } @@ -313,8 +312,8 @@ impl filesystem::types::HostDescriptor for HermesState { /// /// Note: This is similar to `renameat` in POSIX. fn rename_at( - &mut self, self_: wasmtime::component::Resource, old_path: String, - new_descriptor: wasmtime::component::Resource, new_path: String, + &mut self, _old_descriptor: wasmtime::component::Resource, _old_path: String, + _new_descriptor: wasmtime::component::Resource, _new_path: String, ) -> wasmtime::Result> { todo!() } @@ -326,8 +325,8 @@ impl filesystem::types::HostDescriptor for HermesState { /// /// Note: This is similar to `symlinkat` in POSIX. fn symlink_at( - &mut self, self_: wasmtime::component::Resource, old_path: String, - new_path: String, + &mut self, _old_descriptor: wasmtime::component::Resource, _old_path: String, + _new_path: String, ) -> wasmtime::Result> { todo!() } @@ -337,7 +336,7 @@ impl filesystem::types::HostDescriptor for HermesState { /// Return `error-code::is-directory` if the path refers to a directory. /// Note: This is similar to `unlinkat(fd, path, 0)` in POSIX. fn unlink_file_at( - &mut self, self_: wasmtime::component::Resource, path: String, + &mut self, _descriptor: wasmtime::component::Resource, _path: String, ) -> wasmtime::Result> { todo!() } @@ -349,8 +348,8 @@ impl filesystem::types::HostDescriptor for HermesState { /// wasi-filesystem does not expose device and inode numbers, so this function /// may be used instead. fn is_same_object( - &mut self, self_: wasmtime::component::Resource, - other: wasmtime::component::Resource, + &mut self, _descriptor: wasmtime::component::Resource, + _other: wasmtime::component::Resource, ) -> wasmtime::Result { todo!() } @@ -375,7 +374,7 @@ impl filesystem::types::HostDescriptor for HermesState { /// /// However, none of these is required. fn metadata_hash( - &mut self, self_: wasmtime::component::Resource, + &mut self, _descriptor: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } @@ -385,13 +384,13 @@ impl filesystem::types::HostDescriptor for HermesState { /// /// This performs the same hash computation as `metadata-hash`. fn metadata_hash_at( - &mut self, self_: wasmtime::component::Resource, path_flags: PathFlags, - path: String, + &mut self, _descriptor: wasmtime::component::Resource, _path_flags: PathFlags, + _path: String, ) -> wasmtime::Result> { todo!() } - fn drop(&mut self, rep: wasmtime::component::Resource) -> wasmtime::Result<()> { + fn drop(&mut self, _rep: wasmtime::component::Resource) -> wasmtime::Result<()> { todo!() } } @@ -399,13 +398,13 @@ impl filesystem::types::HostDescriptor for HermesState { impl filesystem::types::HostDirectoryEntryStream for HermesState { /// Read a single directory entry from a `directory-entry-stream`. fn read_directory_entry( - &mut self, self_: wasmtime::component::Resource, + &mut self, _dir: wasmtime::component::Resource, ) -> wasmtime::Result, ErrorCode>> { todo!() } fn drop( - &mut self, rep: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result<()> { todo!() } @@ -423,7 +422,7 @@ impl filesystem::types::Host for HermesState { /// Note that this function is fallible because not all stream-related /// errors are filesystem-related errors. fn filesystem_error_code( - &mut self, err: wasmtime::component::Resource, + &mut self, _err: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } diff --git a/hermes/bin/src/runtime/host/wasi/http/mod.rs b/hermes/bin/src/runtime/host/wasi/http/mod.rs index 2a35d7d81..1da11e533 100644 --- a/hermes/bin/src/runtime/host/wasi/http/mod.rs +++ b/hermes/bin/src/runtime/host/wasi/http/mod.rs @@ -1,8 +1,7 @@ //! Host - WASI - HTTP implementations -#![allow(unused_variables)] -use crate::runtime::extensions::{ - wasi::{ +use crate::{ + runtime::extensions::bindings::wasi::{ http::{ self, outgoing_handler::{ @@ -17,14 +16,14 @@ use crate::runtime::extensions::{ }, io::streams::{InputStream, OutputStream}, }, - HermesState, Stateful, + state::{HermesState, Stateful}, }; /// WASI State pub(crate) struct State {} impl Stateful for State { - fn new(ctx: &crate::state::Context) -> Self { + fn new(_ctx: &crate::state::Context) -> Self { Self {} } } @@ -51,7 +50,7 @@ impl http::types::HostFutureIncomingResponse for HermesState { /// but those will be reported by the `incoming-body` and its /// `output-stream` child. fn get( - &mut self, self_: wasmtime::component::Resource, + &mut self, _res: wasmtime::component::Resource, ) -> wasmtime::Result< Option, ErrorCode>, ()>>, > { @@ -59,7 +58,7 @@ impl http::types::HostFutureIncomingResponse for HermesState { } fn drop( - &mut self, rep: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result<()> { todo!() } @@ -89,7 +88,7 @@ impl http::types::HostFields for HermesState { /// An error result will be returned if any header or value was /// syntactically invalid, or if a header was forbidden. fn from_list( - &mut self, entries: Vec<(FieldKey, FieldValue)>, + &mut self, _entries: Vec<(FieldKey, FieldValue)>, ) -> wasmtime::Result, HeaderError>> { todo!() } @@ -99,7 +98,7 @@ impl http::types::HostFields for HermesState { /// present but empty, this is represented by a list with one or more /// empty field-values present. fn get( - &mut self, self_: wasmtime::component::Resource, name: FieldKey, + &mut self, _fields: wasmtime::component::Resource, _name: FieldKey, ) -> wasmtime::Result> { todo!() } @@ -107,7 +106,7 @@ impl http::types::HostFields for HermesState { /// Returns `true` when the key is present in this `fields`. If the key is /// syntactically invalid, `false` is returned. fn has( - &mut self, self_: wasmtime::component::Resource, name: FieldKey, + &mut self, _fields: wasmtime::component::Resource, _name: FieldKey, ) -> wasmtime::Result { todo!() } @@ -117,8 +116,8 @@ impl http::types::HostFields for HermesState { /// /// Fails with `header-error.immutable` if the `fields` are immutable. fn set( - &mut self, self_: wasmtime::component::Resource, name: FieldKey, - value: Vec, + &mut self, _fields: wasmtime::component::Resource, _name: FieldKey, + _value: Vec, ) -> wasmtime::Result> { todo!() } @@ -128,7 +127,7 @@ impl http::types::HostFields for HermesState { /// /// Fails with `header-error.immutable` if the `fields` are immutable. fn delete( - &mut self, self_: wasmtime::component::Resource, name: FieldKey, + &mut self, _fields: wasmtime::component::Resource, _name: FieldKey, ) -> wasmtime::Result> { todo!() } @@ -138,7 +137,8 @@ impl http::types::HostFields for HermesState { /// /// Fails with `header-error.immutable` if the `fields` are immutable. fn append( - &mut self, self_: wasmtime::component::Resource, name: FieldKey, value: FieldValue, + &mut self, _fields: wasmtime::component::Resource, _name: FieldKey, + _value: FieldValue, ) -> wasmtime::Result> { todo!() } @@ -150,7 +150,7 @@ impl http::types::HostFields for HermesState { /// which have multiple values are represented by multiple entries in this /// list with the same key. fn entries( - &mut self, self_: wasmtime::component::Resource, + &mut self, _fields: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } @@ -159,12 +159,12 @@ impl http::types::HostFields for HermesState { /// `fields` constructor on the return value of `entries`. The resulting /// `fields` is mutable. fn clone( - &mut self, self_: wasmtime::component::Resource, + &mut self, _fields: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } - fn drop(&mut self, rep: wasmtime::component::Resource) -> wasmtime::Result<()> { + fn drop(&mut self, _rep: wasmtime::component::Resource) -> wasmtime::Result<()> { todo!() } } @@ -194,14 +194,16 @@ impl http::types::HostFutureTrailers for HermesState { /// `delete` methods will return an error, and the resource must be /// dropped before the parent `future-trailers` is dropped. fn get( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result< Option>, ErrorCode>, ()>>, > { todo!() } - fn drop(&mut self, rep: wasmtime::component::Resource) -> wasmtime::Result<()> { + fn drop( + &mut self, _rep: wasmtime::component::Resource, + ) -> wasmtime::Result<()> { todo!() } } @@ -217,7 +219,7 @@ impl http::types::HostOutgoingBody for HermesState { /// this `outgoing-body` may be retrieved at most once. Subsequent calls /// will return error. fn write( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result, ()>> { todo!() } @@ -232,13 +234,13 @@ impl http::types::HostOutgoingBody for HermesState { /// to the body (via `write`) does not match the value given in the /// Content-Length. fn finish( - &mut self, this: wasmtime::component::Resource, - trailers: Option>, + &mut self, _this: wasmtime::component::Resource, + _trailers: Option>, ) -> wasmtime::Result> { todo!() } - fn drop(&mut self, rep: wasmtime::component::Resource) -> wasmtime::Result<()> { + fn drop(&mut self, _rep: wasmtime::component::Resource) -> wasmtime::Result<()> { todo!() } } @@ -250,14 +252,14 @@ impl HostOutgoingResponse for HermesState { /// /// * `headers` is the HTTP Headers for the Response. fn new( - &mut self, headers: wasmtime::component::Resource, + &mut self, _headers: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } /// Get the HTTP Status Code for the Response. fn status_code( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result { todo!() } @@ -265,7 +267,7 @@ impl HostOutgoingResponse for HermesState { /// Set the HTTP Status Code for the Response. Fails if the status-code /// given is not a valid http status code. fn set_status_code( - &mut self, self_: wasmtime::component::Resource, status_code: StatusCode, + &mut self, _rep: wasmtime::component::Resource, _status_code: StatusCode, ) -> wasmtime::Result> { todo!() } @@ -279,7 +281,7 @@ impl HostOutgoingResponse for HermesState { /// `outgoing-request` is dropped, or its ownership is transferred to /// another component by e.g. `outgoing-handler.handle`. fn headers( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } @@ -290,13 +292,13 @@ impl HostOutgoingResponse for HermesState { /// this `outgoing-response` can be retrieved at most once. Subsequent /// calls will return error. fn body( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result, ()>> { todo!() } fn drop( - &mut self, rep: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result<()> { todo!() } @@ -319,7 +321,7 @@ impl http::types::HostIncomingBody for HermesState { /// and for that backpressure to not inhibit delivery of the trailers if /// the user does not read the entire body. fn stream( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result, ()>> { todo!() } @@ -327,12 +329,12 @@ impl http::types::HostIncomingBody for HermesState { /// Takes ownership of `incoming-body`, and returns a `future-trailers`. /// This function will trap if the `input-stream` child is still alive. fn finish( - &mut self, this: wasmtime::component::Resource, + &mut self, _this: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } - fn drop(&mut self, rep: wasmtime::component::Resource) -> wasmtime::Result<()> { + fn drop(&mut self, _rep: wasmtime::component::Resource) -> wasmtime::Result<()> { todo!() } } @@ -340,7 +342,7 @@ impl http::types::HostIncomingBody for HermesState { impl HostIncomingResponse for HermesState { /// Returns the status code from the incoming response. fn status( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result { todo!() } @@ -353,7 +355,7 @@ impl HostIncomingResponse for HermesState { /// This headers resource is a child: it must be dropped before the parent /// `incoming-response` is dropped. fn headers( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } @@ -361,13 +363,13 @@ impl HostIncomingResponse for HermesState { /// Returns the incoming body. May be called at most once. Returns error /// if called additional times. fn consume( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result, ()>> { todo!() } fn drop( - &mut self, rep: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result<()> { todo!() } @@ -384,14 +386,14 @@ impl http::types::HostResponseOutparam for HermesState { /// The user may provide an `error` to `response` to allow the /// implementation determine how to respond with an HTTP error response. fn set( - &mut self, param: wasmtime::component::Resource, - response: Result, ErrorCode>, + &mut self, _param: wasmtime::component::Resource, + _response: Result, ErrorCode>, ) -> wasmtime::Result<()> { todo!() } fn drop( - &mut self, rep: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result<()> { todo!() } @@ -405,7 +407,7 @@ impl http::types::HostRequestOptions for HermesState { /// The timeout for the initial connect to the HTTP Server. fn connect_timeout( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } @@ -413,14 +415,14 @@ impl http::types::HostRequestOptions for HermesState { /// Set the timeout for the initial connect to the HTTP Server. An error /// return value indicates that this timeout is not supported. fn set_connect_timeout( - &mut self, self_: wasmtime::component::Resource, duration: Option, + &mut self, _rep: wasmtime::component::Resource, _duration: Option, ) -> wasmtime::Result> { todo!() } /// The timeout for receiving the first byte of the Response body. fn first_byte_timeout( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } @@ -428,7 +430,7 @@ impl http::types::HostRequestOptions for HermesState { /// Set the timeout for receiving the first byte of the Response body. An /// error return value indicates that this timeout is not supported. fn set_first_byte_timeout( - &mut self, self_: wasmtime::component::Resource, duration: Option, + &mut self, _rep: wasmtime::component::Resource, _duration: Option, ) -> wasmtime::Result> { todo!() } @@ -436,7 +438,7 @@ impl http::types::HostRequestOptions for HermesState { /// The timeout for receiving subsequent chunks of bytes in the Response /// body stream. fn between_bytes_timeout( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } @@ -445,12 +447,14 @@ impl http::types::HostRequestOptions for HermesState { /// body stream. An error return value indicates that this timeout is not /// supported. fn set_between_bytes_timeout( - &mut self, self_: wasmtime::component::Resource, duration: Option, + &mut self, _rep: wasmtime::component::Resource, _duration: Option, ) -> wasmtime::Result> { todo!() } - fn drop(&mut self, rep: wasmtime::component::Resource) -> wasmtime::Result<()> { + fn drop( + &mut self, _rep: wasmtime::component::Resource, + ) -> wasmtime::Result<()> { todo!() } } @@ -467,7 +471,7 @@ impl http::types::HostOutgoingRequest for HermesState { /// It is the obligation of the `outgoing-handler.handle` implementation /// to reject invalid constructions of `outgoing-request`. fn new( - &mut self, headers: wasmtime::component::Resource, + &mut self, _headers: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } @@ -479,14 +483,14 @@ impl http::types::HostOutgoingRequest for HermesState { /// this `outgoing-request` can be retrieved at most once. Subsequent /// calls will return error. fn body( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result, ()>> { todo!() } /// Get the Method for the Request. fn method( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result { todo!() } @@ -494,7 +498,7 @@ impl http::types::HostOutgoingRequest for HermesState { /// Set the Method for the Request. Fails if the string present in a /// `method.other` argument is not a syntactically valid method. fn set_method( - &mut self, self_: wasmtime::component::Resource, method: Method, + &mut self, _rep: wasmtime::component::Resource, _method: Method, ) -> wasmtime::Result> { todo!() } @@ -502,7 +506,7 @@ impl http::types::HostOutgoingRequest for HermesState { /// Get the combination of the HTTP Path and Query for the Request. /// When `none`, this represents an empty Path and empty Query. fn path_with_query( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } @@ -511,8 +515,8 @@ impl http::types::HostOutgoingRequest for HermesState { /// When `none`, this represents an empty Path and empty Query. Fails is the /// string given is not a syntactically valid path and query uri component. fn set_path_with_query( - &mut self, self_: wasmtime::component::Resource, - path_with_query: Option, + &mut self, _rep: wasmtime::component::Resource, + _path_with_query: Option, ) -> wasmtime::Result> { todo!() } @@ -520,7 +524,7 @@ impl http::types::HostOutgoingRequest for HermesState { /// Get the HTTP Related Scheme for the Request. When `none`, the /// implementation may choose an appropriate default scheme. fn scheme( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } @@ -529,7 +533,7 @@ impl http::types::HostOutgoingRequest for HermesState { /// implementation may choose an appropriate default scheme. Fails if the /// string given is not a syntactically valid uri scheme. fn set_scheme( - &mut self, self_: wasmtime::component::Resource, scheme: Option, + &mut self, _rep: wasmtime::component::Resource, _scheme: Option, ) -> wasmtime::Result> { todo!() } @@ -538,7 +542,7 @@ impl http::types::HostOutgoingRequest for HermesState { /// with Related Schemes which do not require an Authority. The HTTP and /// HTTPS schemes always require an authority. fn authority( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } @@ -548,7 +552,7 @@ impl http::types::HostOutgoingRequest for HermesState { /// HTTPS schemes always require an authority. Fails if the string given is /// not a syntactically valid uri authority. fn set_authority( - &mut self, self_: wasmtime::component::Resource, authority: Option, + &mut self, _rep: wasmtime::component::Resource, _authority: Option, ) -> wasmtime::Result> { todo!() } @@ -562,13 +566,13 @@ impl http::types::HostOutgoingRequest for HermesState { /// `outgoing-request` is dropped, or its ownership is transferred to /// another component by e.g. `outgoing-handler.handle`. fn headers( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } fn drop( - &mut self, rep: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result<()> { todo!() } @@ -577,28 +581,28 @@ impl http::types::HostOutgoingRequest for HermesState { impl http::types::HostIncomingRequest for HermesState { /// Returns the method of the incoming request. fn method( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result { todo!() } /// Returns the path with query parameters from the request, as a string. fn path_with_query( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } /// Returns the protocol scheme from the request. fn scheme( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } /// Returns the authority from the request, if it was present. fn authority( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } @@ -612,7 +616,7 @@ impl http::types::HostIncomingRequest for HermesState { /// the parent `incoming-request` is dropped. Dropping this /// `incoming-request` before all children are dropped will trap. fn headers( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } @@ -620,13 +624,13 @@ impl http::types::HostIncomingRequest for HermesState { /// Gives the `incoming-body` associated with this request. Will only /// return success at most once, and subsequent calls will return error. fn consume( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result, ()>> { todo!() } fn drop( - &mut self, rep: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result<()> { todo!() } @@ -645,7 +649,7 @@ impl http::types::Host for HermesState { /// Note that this function is fallible because not all io-errors are /// http-related errors. fn http_error_code( - &mut self, err: wasmtime::component::Resource, + &mut self, _err: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } @@ -663,8 +667,8 @@ impl http::outgoing_handler::Host for HermesState { /// or not allowed to be made. Otherwise, protocol errors are reported /// through the `future-incoming-response`. fn handle( - &mut self, request: wasmtime::component::Resource, - options: Option>, + &mut self, _request: wasmtime::component::Resource, + _options: Option>, ) -> wasmtime::Result, ErrorCode>> { todo!() diff --git a/hermes/bin/src/runtime/host/wasi/io/error.rs b/hermes/bin/src/runtime/host/wasi/io/error.rs index e2299348a..0e1c1484e 100644 --- a/hermes/bin/src/runtime/host/wasi/io/error.rs +++ b/hermes/bin/src/runtime/host/wasi/io/error.rs @@ -1,9 +1,8 @@ //! WASI IO Error -#![allow(unused_variables)] -use crate::runtime::extensions::{ - wasi::io::error::{Error, Host, HostError}, - HermesState, Stateful, +use crate::{ + runtime::extensions::bindings::wasi::io::error::{Error, Host, HostError}, + state::{HermesState, Stateful}, }; /// WASI State @@ -24,12 +23,12 @@ impl HostError for HermesState { /// details. Parsing this string is a major platform-compatibility /// hazard. fn to_debug_string( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result { todo!() } - fn drop(&mut self, rep: wasmtime::component::Resource) -> wasmtime::Result<()> { + fn drop(&mut self, _rep: wasmtime::component::Resource) -> wasmtime::Result<()> { todo!() } } diff --git a/hermes/bin/src/runtime/host/wasi/io/mod.rs b/hermes/bin/src/runtime/host/wasi/io/mod.rs index 6132c34c4..c661c4eff 100644 --- a/hermes/bin/src/runtime/host/wasi/io/mod.rs +++ b/hermes/bin/src/runtime/host/wasi/io/mod.rs @@ -1,24 +1,23 @@ //! Host - WASI IO Implementation -use crate::runtime::extensions::Stateful; +use crate::state::Stateful; pub(crate) mod error; pub(crate) mod streams; -#[allow(dead_code)] /// WASI State pub(crate) struct State { /// WASI IO error state - error: error::State, + _error: error::State, /// WASI IO streams state - streams: streams::State, + _streams: streams::State, } impl Stateful for State { fn new(ctx: &crate::state::Context) -> Self { Self { - error: error::State::new(ctx), - streams: streams::State::new(ctx), + _error: error::State::new(ctx), + _streams: streams::State::new(ctx), } } } diff --git a/hermes/bin/src/runtime/host/wasi/io/streams.rs b/hermes/bin/src/runtime/host/wasi/io/streams.rs index 841768b05..6986e6027 100644 --- a/hermes/bin/src/runtime/host/wasi/io/streams.rs +++ b/hermes/bin/src/runtime/host/wasi/io/streams.rs @@ -1,11 +1,10 @@ //! WASI IO Streams -#![allow(unused_variables)] -use crate::runtime::extensions::{ - wasi::io::streams::{ +use crate::{ + runtime::extensions::bindings::wasi::io::streams::{ Host, HostInputStream, HostOutputStream, InputStream, OutputStream, StreamError, }, - HermesState, Stateful, + state::{HermesState, Stateful}, }; /// WASI State @@ -40,7 +39,7 @@ impl HostInputStream for HermesState { /// as a return value by the callee. The callee may return a list of bytes /// less than `len` in size while more bytes are available for reading. fn read( - &mut self, self_: wasmtime::component::Resource, len: u64, + &mut self, _rep: wasmtime::component::Resource, _len: u64, ) -> wasmtime::Result, StreamError>> { todo!() } @@ -48,7 +47,7 @@ impl HostInputStream for HermesState { /// Read bytes from a stream, after blocking until at least one byte can /// be read. Except for blocking, behavior is identical to `read`. fn blocking_read( - &mut self, self_: wasmtime::component::Resource, len: u64, + &mut self, _rep: wasmtime::component::Resource, _len: u64, ) -> wasmtime::Result, StreamError>> { todo!() } @@ -58,7 +57,7 @@ impl HostInputStream for HermesState { /// Behaves identical to `read`, except instead of returning a list /// of bytes, returns the number of bytes consumed from the stream. fn skip( - &mut self, self_: wasmtime::component::Resource, len: u64, + &mut self, _rep: wasmtime::component::Resource, _len: u64, ) -> wasmtime::Result> { todo!() } @@ -66,12 +65,12 @@ impl HostInputStream for HermesState { /// Skip bytes from a stream, after blocking until at least one byte /// can be skipped. Except for blocking behavior, identical to `skip`. fn blocking_skip( - &mut self, self_: wasmtime::component::Resource, len: u64, + &mut self, _rep: wasmtime::component::Resource, _len: u64, ) -> wasmtime::Result> { todo!() } - fn drop(&mut self, rep: wasmtime::component::Resource) -> wasmtime::Result<()> { + fn drop(&mut self, _rep: wasmtime::component::Resource) -> wasmtime::Result<()> { todo!() } } @@ -87,7 +86,7 @@ impl HostOutputStream for HermesState { /// become ready when this function will report at least 1 byte, or an /// error. fn check_write( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } @@ -100,7 +99,7 @@ impl HostOutputStream for HermesState { /// returns Err(closed) without writing if the stream has closed since /// the last call to check-write provided a permit. fn write( - &mut self, self_: wasmtime::component::Resource, contents: Vec, + &mut self, _rep: wasmtime::component::Resource, _contents: Vec, ) -> wasmtime::Result> { todo!() } @@ -130,7 +129,7 @@ impl HostOutputStream for HermesState { /// let _ = this.check-write(); // eliding error handling /// ``` fn blocking_write_and_flush( - &mut self, self_: wasmtime::component::Resource, contents: Vec, + &mut self, _rep: wasmtime::component::Resource, _contents: Vec, ) -> wasmtime::Result> { todo!() } @@ -146,7 +145,7 @@ impl HostOutputStream for HermesState { /// completed. The `subscribe` pollable will become ready when the /// flush has completed and the stream can accept more writes. fn flush( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } @@ -154,7 +153,7 @@ impl HostOutputStream for HermesState { /// Request to flush buffered output, and block until flush completes /// and stream is ready for writing again. fn blocking_flush( - &mut self, self_: wasmtime::component::Resource, + &mut self, _rep: wasmtime::component::Resource, ) -> wasmtime::Result> { todo!() } @@ -179,7 +178,7 @@ impl HostOutputStream for HermesState { /// passing a list of bytes, you simply pass the number of zero-bytes /// that should be written. fn write_zeroes( - &mut self, self_: wasmtime::component::Resource, len: u64, + &mut self, _rep: wasmtime::component::Resource, _len: u64, ) -> wasmtime::Result> { todo!() } @@ -209,7 +208,7 @@ impl HostOutputStream for HermesState { /// let _ = this.check-write(); // eliding error handling /// ``` fn blocking_write_zeroes_and_flush( - &mut self, self_: wasmtime::component::Resource, len: u64, + &mut self, _rep: wasmtime::component::Resource, _len: u64, ) -> wasmtime::Result> { todo!() } @@ -228,8 +227,8 @@ impl HostOutputStream for HermesState { /// This function returns the number of bytes transferred; it may be less /// than `len`. fn splice( - &mut self, self_: wasmtime::component::Resource, - src: wasmtime::component::Resource, len: u64, + &mut self, _rep: wasmtime::component::Resource, + _src: wasmtime::component::Resource, _len: u64, ) -> wasmtime::Result> { todo!() } @@ -240,13 +239,13 @@ impl HostOutputStream for HermesState { /// `output-stream` is ready for writing, and the `input-stream` /// is ready for reading, before performing the `splice`. fn blocking_splice( - &mut self, self_: wasmtime::component::Resource, - src: wasmtime::component::Resource, len: u64, + &mut self, _rep: wasmtime::component::Resource, + _src: wasmtime::component::Resource, _len: u64, ) -> wasmtime::Result> { todo!() } - fn drop(&mut self, rep: wasmtime::component::Resource) -> wasmtime::Result<()> { + fn drop(&mut self, _rep: wasmtime::component::Resource) -> wasmtime::Result<()> { todo!() } } diff --git a/hermes/bin/src/runtime/host/wasi/mod.rs b/hermes/bin/src/runtime/host/wasi/mod.rs index da72302e6..f43c19cf9 100644 --- a/hermes/bin/src/runtime/host/wasi/mod.rs +++ b/hermes/bin/src/runtime/host/wasi/mod.rs @@ -1,5 +1,7 @@ //! Runtime modules - extensions - WASI standard extensions +use crate::state::Stateful; + pub(crate) mod cli; pub(crate) mod clocks; pub(crate) mod filesystem; @@ -7,34 +9,31 @@ pub(crate) mod http; pub(crate) mod io; pub(crate) mod random; -use crate::runtime::extensions::Stateful; - -#[allow(dead_code)] /// WASI State pub(crate) struct State { /// WASI CLI State - cli: cli::State, + _cli: cli::State, /// WASI Clock State - clocks: clocks::State, + _clocks: clocks::State, /// WASI Filesystem State - filesystem: filesystem::State, + _filesystem: filesystem::State, /// WASI HTTP State - http: http::State, + _http: http::State, /// WASI IO State - io: io::State, + _io: io::State, /// WASI Random State - random: random::State, + _random: random::State, } impl Stateful for State { fn new(ctx: &crate::state::Context) -> Self { Self { - cli: cli::State::new(ctx), - clocks: clocks::State::new(ctx), - filesystem: filesystem::State::new(ctx), - http: http::State::new(ctx), - io: io::State::new(ctx), - random: random::State::new(ctx), + _cli: cli::State::new(ctx), + _clocks: clocks::State::new(ctx), + _filesystem: filesystem::State::new(ctx), + _http: http::State::new(ctx), + _io: io::State::new(ctx), + _random: random::State::new(ctx), } } } diff --git a/hermes/bin/src/runtime/host/wasi/random/insecure.rs b/hermes/bin/src/runtime/host/wasi/random/insecure.rs index c274bc891..98e41115e 100644 --- a/hermes/bin/src/runtime/host/wasi/random/insecure.rs +++ b/hermes/bin/src/runtime/host/wasi/random/insecure.rs @@ -1,6 +1,9 @@ //! Insecure RNG -use crate::runtime::extensions::{wasi::random::insecure::Host, HermesState, Stateful}; +use crate::{ + runtime::extensions::bindings::wasi::random::insecure::Host, + state::{HermesState, Stateful}, +}; /// WASI State pub(crate) struct State {} @@ -20,7 +23,7 @@ impl Host for HermesState { /// There are no requirements on the values of the returned bytes, however /// implementations are encouraged to return evenly distributed values with /// a long period. - fn get_insecure_random_bytes(&mut self, len: u64) -> wasmtime::Result> { + fn get_insecure_random_bytes(&mut self, _len: u64) -> wasmtime::Result> { todo!() } diff --git a/hermes/bin/src/runtime/host/wasi/random/insecure_seed.rs b/hermes/bin/src/runtime/host/wasi/random/insecure_seed.rs index d5286ce56..66d9c67d9 100644 --- a/hermes/bin/src/runtime/host/wasi/random/insecure_seed.rs +++ b/hermes/bin/src/runtime/host/wasi/random/insecure_seed.rs @@ -1,6 +1,9 @@ //! Insecure RNG -use crate::runtime::extensions::{wasi::random::insecure_seed::Host, HermesState, Stateful}; +use crate::{ + runtime::extensions::bindings::wasi::random::insecure_seed::Host, + state::{HermesState, Stateful}, +}; /// WASI State pub(crate) struct State {} diff --git a/hermes/bin/src/runtime/host/wasi/random/mod.rs b/hermes/bin/src/runtime/host/wasi/random/mod.rs index 6c7633237..43fff7e4a 100644 --- a/hermes/bin/src/runtime/host/wasi/random/mod.rs +++ b/hermes/bin/src/runtime/host/wasi/random/mod.rs @@ -1,29 +1,27 @@ //! Host - WASI - Random implementations -#![allow(unused_variables)] + +use crate::state::Stateful; pub(crate) mod insecure; pub(crate) mod insecure_seed; pub(crate) mod secure; -use crate::runtime::extensions::Stateful; - -#[allow(dead_code)] /// WASI State pub(crate) struct State { /// insecure State - insecure: insecure::State, + _insecure: insecure::State, /// insecure_seed State - insecure_seed: insecure_seed::State, + _insecure_seed: insecure_seed::State, /// secure State - secure: secure::State, + _secure: secure::State, } impl Stateful for State { fn new(ctx: &crate::state::Context) -> Self { Self { - insecure: insecure::State::new(ctx), - insecure_seed: insecure_seed::State::new(ctx), - secure: secure::State::new(ctx), + _insecure: insecure::State::new(ctx), + _insecure_seed: insecure_seed::State::new(ctx), + _secure: secure::State::new(ctx), } } } diff --git a/hermes/bin/src/runtime/host/wasi/random/secure.rs b/hermes/bin/src/runtime/host/wasi/random/secure.rs index 270f889fb..b31ae5ecf 100644 --- a/hermes/bin/src/runtime/host/wasi/random/secure.rs +++ b/hermes/bin/src/runtime/host/wasi/random/secure.rs @@ -1,6 +1,9 @@ //! Random RNG -use crate::runtime::extensions::{wasi::random::random::Host, HermesState, Stateful}; +use crate::{ + runtime::extensions::bindings::wasi::random::random::Host, + state::{HermesState, Stateful}, +}; /// WASI State pub(crate) struct State {} @@ -25,7 +28,7 @@ impl Host for HermesState { /// This function must always return fresh data. Deterministic environments /// must omit this function, rather than implementing it with deterministic /// data. - fn get_random_bytes(&mut self, len: u64) -> wasmtime::Result> { + fn get_random_bytes(&mut self, _len: u64) -> wasmtime::Result> { todo!() } diff --git a/hermes/bin/src/state.rs b/hermes/bin/src/state.rs index 04f4f734c..14a3c6c91 100644 --- a/hermes/bin/src/state.rs +++ b/hermes/bin/src/state.rs @@ -2,6 +2,8 @@ use rusty_ulid::Ulid; +use crate::runtime::host::{hermes, wasi}; + /// A WASM module's context structure, which is intended to be passed to the /// `wasmtime::Store` during the WASM module's state initialization process. #[derive(Clone)] @@ -60,3 +62,32 @@ impl Context { self.counter } } + +/// All Hermes runtime extensions states need to implement this. +pub(crate) trait Stateful { + /// Initial state for the given context + fn new(ctx: &Context) -> Self; +} + +#[allow(dead_code)] +/// State for Hermes runtime +pub(crate) struct HermesState { + /// Hermes custom extensions state + pub hermes: hermes::State, + + /// WASI standard extensions state + pub wasi: wasi::State, + + /// The context of the wasm modules using this State. + pub ctx: Context, +} + +impl Stateful for HermesState { + fn new(ctx: &Context) -> HermesState { + HermesState { + hermes: hermes::State::new(ctx), + wasi: wasi::State::new(ctx), + ctx: ctx.clone(), + } + } +} From 660eb5a70f9b4f657d0aa4dbee2244e7fe0d6c6d Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Thu, 8 Feb 2024 21:44:47 +0200 Subject: [PATCH 12/36] update wasm::module --- hermes/bin/src/event.rs | 6 +- hermes/bin/src/lib.rs | 2 +- hermes/bin/src/runtime/extensions/mod.rs | 14 +--- hermes/bin/src/wasm/module.rs | 81 +++++++----------------- 4 files changed, 31 insertions(+), 72 deletions(-) diff --git a/hermes/bin/src/event.rs b/hermes/bin/src/event.rs index 4cd71b01c..18dcb6758 100644 --- a/hermes/bin/src/event.rs +++ b/hermes/bin/src/event.rs @@ -1,7 +1,9 @@ //! Hermes event definition +use crate::wasm::module::ModuleInstance; + /// A trait for defining the behavior of a Hermes event. -pub trait HermesEventPayload { +pub trait HermesEventPayload { /// Returns the name of the event associated with the payload. fn event_name(&self) -> &str; @@ -14,5 +16,5 @@ pub trait HermesEventPayload { /// # Returns /// /// An `anyhow::Result` indicating the success or failure of the payload execution. - fn execute(&self, executor: &mut Executor) -> anyhow::Result<()>; + fn execute(&self, executor: &mut ModuleInstance) -> anyhow::Result<()>; } diff --git a/hermes/bin/src/lib.rs b/hermes/bin/src/lib.rs index 0154504fe..a88cdcc95 100644 --- a/hermes/bin/src/lib.rs +++ b/hermes/bin/src/lib.rs @@ -2,6 +2,6 @@ //! This file exists, so that doc tests can be used inside binary crates. pub(crate) mod event; -pub(crate) mod runtime; +mod runtime; pub(crate) mod state; pub(crate) mod wasm; diff --git a/hermes/bin/src/runtime/extensions/mod.rs b/hermes/bin/src/runtime/extensions/mod.rs index 95c00f67d..d2aaa5196 100644 --- a/hermes/bin/src/runtime/extensions/mod.rs +++ b/hermes/bin/src/runtime/extensions/mod.rs @@ -29,14 +29,6 @@ pub(crate) mod bindings { path: "../../wasm/wasi/wit", }); } -#[allow(dead_code)] -/// Link a component to the Hermes runtime. -pub(crate) fn link_runtime(engine: &Engine) -> anyhow::Result> { - let mut linker = Linker::new(engine); - bindings::Hermes::add_to_linker(&mut linker, |state: &mut HermesState| state)?; - - Ok(linker) -} /// Example of how to call the autogenerated entry points #[allow(dead_code)] @@ -51,14 +43,14 @@ fn example() -> anyhow::Result<()> { let component = Component::from_file(&engine, "./your-component.wasm")?; // Instantiation of bindings always happens through a `Linker`. - // Configuration of the linker is done through a generated `add_to_linker` - // method on the bindings structure. // // Note that the closure provided here is a projection from `T` in // `Store` to `&mut U` where `U` implements the `HelloWorldImports` // trait. In this case the `T`, `MyState`, is stored directly in the // structure so no projection is necessary here. - let linker = link_runtime(&engine)?; + let mut linker = Linker::new(&engine); + bindings::Hermes::add_to_linker(&mut linker, |state: &mut HermesState| state)?; + let instance_pre = linker.instantiate_pre(&component)?; // As with the core wasm API of Wasmtime instantiation occurs within a diff --git a/hermes/bin/src/wasm/module.rs b/hermes/bin/src/wasm/module.rs index 51a1223f2..4d740c31e 100644 --- a/hermes/bin/src/wasm/module.rs +++ b/hermes/bin/src/wasm/module.rs @@ -5,59 +5,25 @@ //! All implementation based on [wasmtime](https://crates.io/crates/wasmtime) crate dependency. use wasmtime::{ - component::{ - Component as WasmModule, Instance as WasmInstance, InstancePre as WasmInstancePre, - Linker as WasmLinker, - }, + component::{Component as WasmModule, InstancePre as WasmInstancePre, Linker as WasmLinker}, Store as WasmStore, }; use super::engine::Engine; -use crate::{event::HermesEventPayload, state::Context}; - -/// Interface for linking WASM imports -pub(crate) trait Host { - /// Link imports to the `wasmtime::Linker` - fn link_imports(linker: &mut WasmLinker) -> anyhow::Result<()>; -} - -/// Interface for WASM module instance -pub(crate) trait Instance: Sized { - /// Instantiate WASM module instance - fn instantiate( - store: &mut WasmStore, pre_instance: &WasmInstancePre, - ) -> anyhow::Result; -} - -impl Instance for WasmInstance { - fn instantiate( - mut store: &mut WasmStore, pre_instance: &WasmInstancePre, - ) -> anyhow::Result { - let instance = pre_instance.instantiate(&mut store)?; - Ok(instance) - } -} +use crate::{ + event::HermesEventPayload, + runtime::extensions::bindings, + state::{Context, HermesState, Stateful}, +}; /// Structure defines an abstraction over the WASM module instance. /// It holds the state of the WASM module along with its context data. /// It is used to interact with the WASM module. -pub(crate) struct ModuleInstance { +pub(crate) struct ModuleInstance { /// `wasmtime::Store` entity - #[allow(dead_code)] - pub(crate) store: WasmStore, + pub(crate) _store: WasmStore, /// `Instance` entity - #[allow(dead_code)] - pub(crate) instance: I, -} - -impl ModuleInstance { - /// Instantiates WASM module - pub(crate) fn new( - mut store: WasmStore, pre_instance: &WasmInstancePre, - ) -> anyhow::Result { - let instance = I::instantiate(&mut store, pre_instance)?; - Ok(Self { store, instance }) - } + pub(crate) _instance: bindings::Hermes, } /// Structure defines an abstraction over the WASM module @@ -68,26 +34,23 @@ impl ModuleInstance { /// The primary goal for it is to make a WASM state *immutable* along WASM module /// execution. It means that `Module::call_func` execution does not have as side effect /// for the WASM module's state, it becomes unchanged. -pub(crate) struct Module> { +pub(crate) struct Module { /// `wasmtime::InstancePre` entity /// /// A reason why it is used a `wasmtime::InstancePre` instead of `wasmtime::Instance` /// partially described in this [RFC](https://github.com/bytecodealliance/rfcs/blob/main/accepted/shared-host-functions.md). /// It separates and optimizes the linkage of the imports to the WASM runtime from the /// module actual initialization process. - pre_instance: WasmInstancePre, + pre_instance: WasmInstancePre, /// `Engine` entity engine: Engine, /// `Context` entity context: Context, - - /// `Host` type - _host: std::marker::PhantomData, } -impl> Module { +impl Module { /// Instantiate WASM module /// /// # Errors @@ -98,14 +61,13 @@ impl> Module { let module = WasmModule::new(&engine, module_bytes)?; let mut linker = WasmLinker::new(&engine); - H::link_imports(&mut linker)?; + bindings::Hermes::add_to_linker(&mut linker, |state: &mut HermesState| state)?; let pre_instance = linker.instantiate_pre(&module)?; Ok(Self { pre_instance, engine, context: Context::new(app_name), - _host: std::marker::PhantomData, }) } @@ -119,14 +81,17 @@ impl> Module { /// # Errors /// - `wasmtime::Error`: WASM call error #[allow(dead_code)] - pub(crate) fn execute_event( - &mut self, event: &impl HermesEventPayload>, - ) -> anyhow::Result<()> { + pub(crate) fn execute_event(&mut self, event: &impl HermesEventPayload) -> anyhow::Result<()> { self.context.use_for(event.event_name().to_string()); + let state = HermesState::new(&self.context); + + let mut store = WasmStore::new(&self.engine, state); + let (instance, _) = bindings::Hermes::instantiate_pre(&mut store, &self.pre_instance)?; - let store = WasmStore::new(&self.engine, self.context.clone()); - let mut instance = ModuleInstance::new(store, &self.pre_instance)?; - event.execute(&mut instance)?; + event.execute(&mut ModuleInstance { + _instance: instance, + _store: store, + })?; Ok(()) } } @@ -136,7 +101,7 @@ mod tests { use super::*; struct TestHost; - impl Host for TestHost { + impl Host for TestHost { fn link_imports(_linker: &mut WasmLinker) -> anyhow::Result<()> { Ok(()) } From 57cab29617eb4db73358ee9a67f07def166d7943 Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Fri, 9 Feb 2024 10:23:33 +0200 Subject: [PATCH 13/36] fix formating --- hermes/bin/src/lib.rs | 6 +++--- hermes/bin/src/main.rs | 6 +++--- hermes/bin/src/runtime/host/hermes/cron/mod.rs | 6 +++--- hermes/bin/src/runtime/host/hermes/localtime/mod.rs | 6 +++--- hermes/bin/src/wasm/mod.rs | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/hermes/bin/src/lib.rs b/hermes/bin/src/lib.rs index a88cdcc95..f951eee69 100644 --- a/hermes/bin/src/lib.rs +++ b/hermes/bin/src/lib.rs @@ -1,7 +1,7 @@ //! Intentionally empty //! This file exists, so that doc tests can be used inside binary crates. -pub(crate) mod event; +mod event; mod runtime; -pub(crate) mod state; -pub(crate) mod wasm; +mod state; +mod wasm; diff --git a/hermes/bin/src/main.rs b/hermes/bin/src/main.rs index 3ace6cc16..404c9fbc5 100644 --- a/hermes/bin/src/main.rs +++ b/hermes/bin/src/main.rs @@ -1,9 +1,9 @@ //! The Hermes Node. -pub(crate) mod event; +mod event; mod runtime; -pub(crate) mod state; -pub(crate) mod wasm; +mod state; +mod wasm; fn main() { println!("Hello, world!"); diff --git a/hermes/bin/src/runtime/host/hermes/cron/mod.rs b/hermes/bin/src/runtime/host/hermes/cron/mod.rs index 9e590d383..a6aa3ee08 100644 --- a/hermes/bin/src/runtime/host/hermes/cron/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/cron/mod.rs @@ -1,9 +1,9 @@ //! Host - Cron implementations use crate::{ - runtime::extensions::{ - bindings::hermes::cron::api::{CronEventTag, CronSched, CronTagged, CronTime, Host}, - bindings::wasi::clocks::monotonic_clock::Instant, + runtime::extensions::bindings::{ + hermes::cron::api::{CronEventTag, CronSched, CronTagged, CronTime, Host}, + wasi::clocks::monotonic_clock::Instant, }, state::{HermesState, Stateful}, }; diff --git a/hermes/bin/src/runtime/host/hermes/localtime/mod.rs b/hermes/bin/src/runtime/host/hermes/localtime/mod.rs index be02de105..1f2f1f791 100644 --- a/hermes/bin/src/runtime/host/hermes/localtime/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/localtime/mod.rs @@ -1,9 +1,9 @@ //! Host - Localtime implementations use crate::{ - runtime::extensions::{ - bindings::hermes::localtime::api::{Errno, Host, Localtime, Timezone}, - bindings::wasi::clocks::wall_clock::Datetime, + runtime::extensions::bindings::{ + hermes::localtime::api::{Errno, Host, Localtime, Timezone}, + wasi::clocks::wall_clock::Datetime, }, state::{HermesState, Stateful}, }; diff --git a/hermes/bin/src/wasm/mod.rs b/hermes/bin/src/wasm/mod.rs index 2a847a259..01bc8bf6b 100644 --- a/hermes/bin/src/wasm/mod.rs +++ b/hermes/bin/src/wasm/mod.rs @@ -1,5 +1,5 @@ //! WASM related structures and functions which are specific for the Hermes use case. //! All implementation based on [wasmtime](https://crates.io/crates/wasmtime) crate dependency. -pub(crate) mod engine; +mod engine; pub(crate) mod module; From 4e05ff3711a0f18682e23fae58e1db3a3df1b7aa Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Fri, 9 Feb 2024 10:48:39 +0200 Subject: [PATCH 14/36] commented out test --- hermes/bin/src/wasm/module.rs | 117 +++++++++++++++++----------------- 1 file changed, 59 insertions(+), 58 deletions(-) diff --git a/hermes/bin/src/wasm/module.rs b/hermes/bin/src/wasm/module.rs index 4d740c31e..ca40e69c5 100644 --- a/hermes/bin/src/wasm/module.rs +++ b/hermes/bin/src/wasm/module.rs @@ -98,62 +98,63 @@ impl Module { #[cfg(test)] mod tests { - use super::*; - - struct TestHost; - impl Host for TestHost { - fn link_imports(_linker: &mut WasmLinker) -> anyhow::Result<()> { - Ok(()) - } - } - - struct TestEvent; - impl HermesEventPayload> for TestEvent { - fn event_name(&self) -> &str { - "inc-global" - } - - fn execute(&self, instance: &mut ModuleInstance) -> anyhow::Result<()> { - let func = instance - .instance - .get_typed_func::<(), (i32,)>(&mut instance.store, "inc-global")?; - let (res,) = func.call(&mut instance.store, ())?; - assert_eq!(res, 1); - Ok(()) - } - } - - #[test] - /// Tests that after instantiation of `Module` its state does not change after each - /// `Module::call_func` execution - fn preserve_module_state_test() { - let wat = r#" - (component - (core module $Module - (export "inc-global" (func $inc_global)) - - (func $inc_global (result i32) - global.get $global_val - i32.const 1 - i32.add - global.set $global_val - global.get $global_val - ) - - (global $global_val (mut i32) (i32.const 0)) - ) - (core instance $module (instantiate (module $Module))) - (func $inc_global (result s32) (canon lift (core func $module "inc-global"))) - (export "inc-global" (func $inc_global)) - )"#; - - let mut module = Module::::new("app".to_string(), wat.as_bytes()) - .expect("cannot load a WASM module"); - - for _ in 0..10 { - module - .execute_event(&TestEvent) - .expect("cannot execute `TestEvent` event"); - } - } + // use super::*; + + // struct TestHost; + // impl Host for TestHost { + // fn link_imports(_linker: &mut WasmLinker) -> anyhow::Result<()> { + // Ok(()) + // } + // } + + // struct TestEvent; + // impl HermesEventPayload> for TestEvent { + // fn event_name(&self) -> &str { + // "inc-global" + // } + + // fn execute(&self, instance: &mut ModuleInstance) -> + // anyhow::Result<()> { let func = instance + // .instance + // .get_typed_func::<(), (i32,)>(&mut instance.store, "inc-global")?; + // let (res,) = func.call(&mut instance.store, ())?; + // assert_eq!(res, 1); + // Ok(()) + // } + // } + + // #[test] + // /// Tests that after instantiation of `Module` its state does not change after each + // /// `Module::call_func` execution + // fn preserve_module_state_test() { + // let wat = r#" + // (component + // (core module $Module + // (export "inc-global" (func $inc_global)) + + // (func $inc_global (result i32) + // global.get $global_val + // i32.const 1 + // i32.add + // global.set $global_val + // global.get $global_val + // ) + + // (global $global_val (mut i32) (i32.const 0)) + // ) + // (core instance $module (instantiate (module $Module))) + // (func $inc_global (result s32) (canon lift (core func $module + // "inc-global"))) (export "inc-global" (func $inc_global)) + // )"#; + + // let mut module = + // Module::new("app".to_string(), wat.as_bytes()).expect("cannot load a WASM + // module"); + + // for _ in 0..10 { + // module + // .execute_event(&TestEvent) + // .expect("cannot execute `TestEvent` event"); + // } + // } } From b3a110d5de70913fb861d4e1b8b0b974fa79216c Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Fri, 9 Feb 2024 13:37:05 +0200 Subject: [PATCH 15/36] move event mod under the event_queue mod --- hermes/bin/src/{ => event_queue}/event.rs | 0 hermes/bin/src/event_queue/mod.rs | 3 +++ hermes/bin/src/lib.rs | 2 +- hermes/bin/src/main.rs | 2 +- hermes/bin/src/wasm/module.rs | 2 +- 5 files changed, 6 insertions(+), 3 deletions(-) rename hermes/bin/src/{ => event_queue}/event.rs (100%) create mode 100644 hermes/bin/src/event_queue/mod.rs diff --git a/hermes/bin/src/event.rs b/hermes/bin/src/event_queue/event.rs similarity index 100% rename from hermes/bin/src/event.rs rename to hermes/bin/src/event_queue/event.rs diff --git a/hermes/bin/src/event_queue/mod.rs b/hermes/bin/src/event_queue/mod.rs new file mode 100644 index 000000000..2ff22d7c4 --- /dev/null +++ b/hermes/bin/src/event_queue/mod.rs @@ -0,0 +1,3 @@ +//! Hermes event queue implementation. + +pub(crate) mod event; diff --git a/hermes/bin/src/lib.rs b/hermes/bin/src/lib.rs index f951eee69..802f8a952 100644 --- a/hermes/bin/src/lib.rs +++ b/hermes/bin/src/lib.rs @@ -1,7 +1,7 @@ //! Intentionally empty //! This file exists, so that doc tests can be used inside binary crates. -mod event; +mod event_queue; mod runtime; mod state; mod wasm; diff --git a/hermes/bin/src/main.rs b/hermes/bin/src/main.rs index 404c9fbc5..117bdf2fe 100644 --- a/hermes/bin/src/main.rs +++ b/hermes/bin/src/main.rs @@ -1,6 +1,6 @@ //! The Hermes Node. -mod event; +mod event_queue; mod runtime; mod state; mod wasm; diff --git a/hermes/bin/src/wasm/module.rs b/hermes/bin/src/wasm/module.rs index ca40e69c5..edd4aba77 100644 --- a/hermes/bin/src/wasm/module.rs +++ b/hermes/bin/src/wasm/module.rs @@ -11,7 +11,7 @@ use wasmtime::{ use super::engine::Engine; use crate::{ - event::HermesEventPayload, + event_queue::event::HermesEventPayload, runtime::extensions::bindings, state::{Context, HermesState, Stateful}, }; From cb3a602cf518acd10f2dd8154c27ddea697dcae0 Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Fri, 9 Feb 2024 13:41:02 +0200 Subject: [PATCH 16/36] move bindings mod to the separate file --- hermes/bin/src/runtime/extensions/bindings.rs | 16 ++++++++++++++++ hermes/bin/src/runtime/extensions/mod.rs | 10 +--------- 2 files changed, 17 insertions(+), 9 deletions(-) create mode 100644 hermes/bin/src/runtime/extensions/bindings.rs diff --git a/hermes/bin/src/runtime/extensions/bindings.rs b/hermes/bin/src/runtime/extensions/bindings.rs new file mode 100644 index 000000000..d96716d9f --- /dev/null +++ b/hermes/bin/src/runtime/extensions/bindings.rs @@ -0,0 +1,16 @@ +//! Hermes `wasmtime::component::bindgen` generated code +//! +//! *Note* +//! Inspect the generated code with: +//! ``` +//! cargo expand --bin hermes runtime::extensions::bindings +//! ``` + +#![allow(clippy::indexing_slicing)] + +use wasmtime::component::bindgen; + +bindgen!({ + world: "hermes", + path: "../../wasm/wasi/wit", +}); diff --git a/hermes/bin/src/runtime/extensions/mod.rs b/hermes/bin/src/runtime/extensions/mod.rs index d2aaa5196..75bb5e4bf 100644 --- a/hermes/bin/src/runtime/extensions/mod.rs +++ b/hermes/bin/src/runtime/extensions/mod.rs @@ -20,15 +20,7 @@ use self::bindings::{ }; use crate::state::{Context, HermesState}; -/// WASM component autogenerated bindings -#[allow(clippy::indexing_slicing)] -pub(crate) mod bindings { - use wasmtime::component::bindgen; - bindgen!({ - world: "hermes", - path: "../../wasm/wasi/wit", - }); -} +pub(crate) mod bindings; /// Example of how to call the autogenerated entry points #[allow(dead_code)] From 421411f8ff6a47bfaae0c3b750305effd67c7539 Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Fri, 9 Feb 2024 13:50:11 +0200 Subject: [PATCH 17/36] move Context and Statefull to another module --- hermes/bin/src/runtime/extensions/mod.rs | 5 +- hermes/bin/src/runtime/extensions/state.rs | 68 ++++++++++++++++++ .../bin/src/runtime/host/hermes/binary/mod.rs | 9 ++- .../src/runtime/host/hermes/cardano/mod.rs | 13 ++-- .../bin/src/runtime/host/hermes/cbor/mod.rs | 9 ++- .../bin/src/runtime/host/hermes/cron/mod.rs | 13 ++-- .../bin/src/runtime/host/hermes/crypto/mod.rs | 17 +++-- .../bin/src/runtime/host/hermes/hash/mod.rs | 13 ++-- .../bin/src/runtime/host/hermes/init/mod.rs | 4 +- .../bin/src/runtime/host/hermes/json/mod.rs | 9 ++- .../src/runtime/host/hermes/kv_store/mod.rs | 9 ++- .../src/runtime/host/hermes/localtime/mod.rs | 13 ++-- .../src/runtime/host/hermes/logging/mod.rs | 13 ++-- hermes/bin/src/runtime/host/hermes/mod.rs | 4 +- hermes/bin/src/runtime/host/wasi/cli/mod.rs | 13 ++-- .../bin/src/runtime/host/wasi/clocks/mod.rs | 4 +- .../src/runtime/host/wasi/clocks/monotonic.rs | 9 ++- .../bin/src/runtime/host/wasi/clocks/wall.rs | 9 ++- .../src/runtime/host/wasi/filesystem/mod.rs | 23 +++--- hermes/bin/src/runtime/host/wasi/http/mod.rs | 31 ++++---- hermes/bin/src/runtime/host/wasi/io/error.rs | 9 ++- hermes/bin/src/runtime/host/wasi/io/mod.rs | 4 +- .../bin/src/runtime/host/wasi/io/streams.rs | 11 +-- hermes/bin/src/runtime/host/wasi/mod.rs | 4 +- .../src/runtime/host/wasi/random/insecure.rs | 9 ++- .../runtime/host/wasi/random/insecure_seed.rs | 9 ++- .../bin/src/runtime/host/wasi/random/mod.rs | 4 +- .../src/runtime/host/wasi/random/secure.rs | 9 ++- hermes/bin/src/state.rs | 72 ++----------------- hermes/bin/src/wasm/module.rs | 7 +- 30 files changed, 247 insertions(+), 179 deletions(-) create mode 100644 hermes/bin/src/runtime/extensions/state.rs diff --git a/hermes/bin/src/runtime/extensions/mod.rs b/hermes/bin/src/runtime/extensions/mod.rs index 75bb5e4bf..d89e461ad 100644 --- a/hermes/bin/src/runtime/extensions/mod.rs +++ b/hermes/bin/src/runtime/extensions/mod.rs @@ -18,14 +18,15 @@ use self::bindings::{ cron::api::CronTagged, }, }; -use crate::state::{Context, HermesState}; +use crate::state::HermesState; pub(crate) mod bindings; +pub(crate) mod state; /// Example of how to call the autogenerated entry points #[allow(dead_code)] fn example() -> anyhow::Result<()> { - use crate::state::Stateful; + use crate::runtime::extensions::state::{Context, Stateful}; // Configure an `Engine` and compile the `Component` that is being run for // the application. diff --git a/hermes/bin/src/runtime/extensions/state.rs b/hermes/bin/src/runtime/extensions/state.rs new file mode 100644 index 000000000..7f61b2c2d --- /dev/null +++ b/hermes/bin/src/runtime/extensions/state.rs @@ -0,0 +1,68 @@ +//! Hermes runtime extensions state. + +use rusty_ulid::Ulid; + +/// A WASM module's context structure, which is intended to be passed to the +/// `wasmtime::Store` during the WASM module's state initialization process. +#[derive(Clone)] +pub(crate) struct Context { + /// Hermes application name + app_name: String, + + /// module ULID id + module_id: Ulid, + + /// event name to be executed + event_name: Option, + + /// module's execution counter + counter: u64, +} + +impl Context { + /// Creates a new instance of the `Context`. + pub(crate) fn new(app_name: String) -> Self { + Self { + app_name, + module_id: Ulid::generate(), + event_name: None, + counter: 0, + } + } + + /// Increments the module's execution counter and sets the event name to be executed + pub(crate) fn use_for(&mut self, event_name: String) { + self.event_name = Some(event_name); + self.counter += 1; + } + + /// Get the application name + #[allow(dead_code)] + pub(crate) fn app_name(&self) -> &str { + &self.app_name + } + + /// Get the module id + #[allow(dead_code)] + pub(crate) fn module_id(&self) -> &Ulid { + &self.module_id + } + + /// Get the event name + #[allow(dead_code)] + pub(crate) fn event_name(&self) -> Option<&String> { + self.event_name.as_ref() + } + + /// Get the counter value + #[allow(dead_code)] + pub(crate) fn counter(&self) -> u64 { + self.counter + } +} + +/// All Hermes runtime extensions states need to implement this. +pub(crate) trait Stateful { + /// Initial state for the given context + fn new(ctx: &Context) -> Self; +} diff --git a/hermes/bin/src/runtime/host/hermes/binary/mod.rs b/hermes/bin/src/runtime/host/hermes/binary/mod.rs index 11e2dcd58..763e74690 100644 --- a/hermes/bin/src/runtime/host/hermes/binary/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/binary/mod.rs @@ -1,15 +1,18 @@ //! Host - CBOR implementations use crate::{ - runtime::extensions::bindings::hermes::binary::api::Host, - state::{HermesState, Stateful}, + runtime::extensions::{ + bindings::hermes::binary::api::Host, + state::{Context, Stateful}, + }, + state::HermesState, }; /// State pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::state::Context) -> Self { + fn new(_ctx: &Context) -> Self { State {} } } diff --git a/hermes/bin/src/runtime/host/hermes/cardano/mod.rs b/hermes/bin/src/runtime/host/hermes/cardano/mod.rs index 3a8bf65c2..8ab3dda37 100644 --- a/hermes/bin/src/runtime/host/hermes/cardano/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/cardano/mod.rs @@ -1,18 +1,21 @@ //! Host - Cardano Blockchain implementations use crate::{ - runtime::extensions::bindings::hermes::cardano::api::{ - CardanoBlock, CardanoBlockchainId, CardanoTxn, FetchError, Host, Slot, TxnError, - UnsubscribeOptions, + runtime::extensions::{ + bindings::hermes::cardano::api::{ + CardanoBlock, CardanoBlockchainId, CardanoTxn, FetchError, Host, Slot, TxnError, + UnsubscribeOptions, + }, + state::{Context, Stateful}, }, - state::{HermesState, Stateful}, + state::HermesState, }; /// State pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::state::Context) -> Self { + fn new(_ctx: &Context) -> Self { State {} } } diff --git a/hermes/bin/src/runtime/host/hermes/cbor/mod.rs b/hermes/bin/src/runtime/host/hermes/cbor/mod.rs index 7a0c67235..685fded80 100644 --- a/hermes/bin/src/runtime/host/hermes/cbor/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/cbor/mod.rs @@ -1,15 +1,18 @@ //! Host - CBOR implementations use crate::{ - runtime::extensions::bindings::hermes::cbor::api::Host, - state::{HermesState, Stateful}, + runtime::extensions::{ + bindings::hermes::cbor::api::Host, + state::{Context, Stateful}, + }, + state::HermesState, }; /// State pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::state::Context) -> Self { + fn new(_ctx: &Context) -> Self { State {} } } diff --git a/hermes/bin/src/runtime/host/hermes/cron/mod.rs b/hermes/bin/src/runtime/host/hermes/cron/mod.rs index a6aa3ee08..463e2a9e1 100644 --- a/hermes/bin/src/runtime/host/hermes/cron/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/cron/mod.rs @@ -1,18 +1,21 @@ //! Host - Cron implementations use crate::{ - runtime::extensions::bindings::{ - hermes::cron::api::{CronEventTag, CronSched, CronTagged, CronTime, Host}, - wasi::clocks::monotonic_clock::Instant, + runtime::extensions::{ + bindings::{ + hermes::cron::api::{CronEventTag, CronSched, CronTagged, CronTime, Host}, + wasi::clocks::monotonic_clock::Instant, + }, + state::{Context, Stateful}, }, - state::{HermesState, Stateful}, + state::HermesState, }; /// State pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::state::Context) -> Self { + fn new(_ctx: &Context) -> Self { State {} } } diff --git a/hermes/bin/src/runtime/host/hermes/crypto/mod.rs b/hermes/bin/src/runtime/host/hermes/crypto/mod.rs index ace016b55..2b06252de 100644 --- a/hermes/bin/src/runtime/host/hermes/crypto/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/crypto/mod.rs @@ -1,21 +1,24 @@ //! Host - Crypto implementations use crate::{ - runtime::extensions::bindings::hermes::{ - binary::api::Bstr, - crypto::api::{ - Ed25519Bip32, Ed25519Bip32PrivateKey, Ed25519Bip32PublicKey, Ed25519Bip32Signature, - Host, HostEd25519Bip32, + runtime::extensions::{ + bindings::hermes::{ + binary::api::Bstr, + crypto::api::{ + Ed25519Bip32, Ed25519Bip32PrivateKey, Ed25519Bip32PublicKey, Ed25519Bip32Signature, + Host, HostEd25519Bip32, + }, }, + state::{Context, Stateful}, }, - state::{HermesState, Stateful}, + state::HermesState, }; /// State pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::state::Context) -> Self { + fn new(_ctx: &Context) -> Self { State {} } } diff --git a/hermes/bin/src/runtime/host/hermes/hash/mod.rs b/hermes/bin/src/runtime/host/hermes/hash/mod.rs index c011208a9..9f1a642a2 100644 --- a/hermes/bin/src/runtime/host/hermes/hash/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/hash/mod.rs @@ -1,18 +1,21 @@ //! Host - Hash implementations use crate::{ - runtime::extensions::bindings::hermes::{ - binary::api::Bstr, - hash::api::{Errno, Host}, + runtime::extensions::{ + bindings::hermes::{ + binary::api::Bstr, + hash::api::{Errno, Host}, + }, + state::{Context, Stateful}, }, - state::{HermesState, Stateful}, + state::HermesState, }; /// State pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::state::Context) -> Self { + fn new(_ctx: &Context) -> Self { State {} } } diff --git a/hermes/bin/src/runtime/host/hermes/init/mod.rs b/hermes/bin/src/runtime/host/hermes/init/mod.rs index da727827b..b796452e0 100644 --- a/hermes/bin/src/runtime/host/hermes/init/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/init/mod.rs @@ -1,12 +1,12 @@ //! Host - Init implementations -use crate::state::Stateful; +use crate::runtime::extensions::state::{Context, Stateful}; /// State pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::state::Context) -> Self { + fn new(_ctx: &Context) -> Self { State {} } } diff --git a/hermes/bin/src/runtime/host/hermes/json/mod.rs b/hermes/bin/src/runtime/host/hermes/json/mod.rs index bac4649ab..9b360f379 100644 --- a/hermes/bin/src/runtime/host/hermes/json/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/json/mod.rs @@ -1,15 +1,18 @@ //! Host - JSON implementations use crate::{ - runtime::extensions::bindings::hermes::json::api::Host, - state::{HermesState, Stateful}, + runtime::extensions::{ + bindings::hermes::json::api::Host, + state::{Context, Stateful}, + }, + state::HermesState, }; /// State pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::state::Context) -> Self { + fn new(_ctx: &Context) -> Self { State {} } } diff --git a/hermes/bin/src/runtime/host/hermes/kv_store/mod.rs b/hermes/bin/src/runtime/host/hermes/kv_store/mod.rs index e1ce6a91b..36d79c21b 100644 --- a/hermes/bin/src/runtime/host/hermes/kv_store/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/kv_store/mod.rs @@ -1,15 +1,18 @@ //! Host - KV-Store implementations use crate::{ - runtime::extensions::bindings::hermes::kv_store::api::{Host, KvValues}, - state::{HermesState, Stateful}, + runtime::extensions::{ + bindings::hermes::kv_store::api::{Host, KvValues}, + state::{Context, Stateful}, + }, + state::HermesState, }; /// State pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::state::Context) -> Self { + fn new(_ctx: &Context) -> Self { State {} } } diff --git a/hermes/bin/src/runtime/host/hermes/localtime/mod.rs b/hermes/bin/src/runtime/host/hermes/localtime/mod.rs index 1f2f1f791..8ee18ae29 100644 --- a/hermes/bin/src/runtime/host/hermes/localtime/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/localtime/mod.rs @@ -1,18 +1,21 @@ //! Host - Localtime implementations use crate::{ - runtime::extensions::bindings::{ - hermes::localtime::api::{Errno, Host, Localtime, Timezone}, - wasi::clocks::wall_clock::Datetime, + runtime::extensions::{ + bindings::{ + hermes::localtime::api::{Errno, Host, Localtime, Timezone}, + wasi::clocks::wall_clock::Datetime, + }, + state::{Context, Stateful}, }, - state::{HermesState, Stateful}, + state::HermesState, }; /// State pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::state::Context) -> Self { + fn new(_ctx: &Context) -> Self { State {} } } diff --git a/hermes/bin/src/runtime/host/hermes/logging/mod.rs b/hermes/bin/src/runtime/host/hermes/logging/mod.rs index 72f0522c1..d872929c4 100644 --- a/hermes/bin/src/runtime/host/hermes/logging/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/logging/mod.rs @@ -1,18 +1,21 @@ //! Host - Logging implementations use crate::{ - runtime::extensions::bindings::hermes::{ - json::api::Json, - logging::api::{Host, Level}, + runtime::extensions::{ + bindings::hermes::{ + json::api::Json, + logging::api::{Host, Level}, + }, + state::{Context, Stateful}, }, - state::{HermesState, Stateful}, + state::HermesState, }; /// State pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::state::Context) -> Self { + fn new(_ctx: &Context) -> Self { State {} } } diff --git a/hermes/bin/src/runtime/host/hermes/mod.rs b/hermes/bin/src/runtime/host/hermes/mod.rs index 93a7d702b..ffe732a92 100644 --- a/hermes/bin/src/runtime/host/hermes/mod.rs +++ b/hermes/bin/src/runtime/host/hermes/mod.rs @@ -1,6 +1,6 @@ //! Runtime modules - extensions - HERMES custom extensions -use crate::state::Stateful; +use crate::runtime::extensions::state::{Context, Stateful}; pub(crate) mod binary; pub(crate) mod cardano; @@ -41,7 +41,7 @@ pub(crate) struct State { } impl Stateful for State { - fn new(ctx: &crate::state::Context) -> Self { + fn new(ctx: &Context) -> Self { Self { _binary: binary::State::new(ctx), _cardano: cardano::State::new(ctx), diff --git a/hermes/bin/src/runtime/host/wasi/cli/mod.rs b/hermes/bin/src/runtime/host/wasi/cli/mod.rs index cedfda2fc..d1237cda5 100644 --- a/hermes/bin/src/runtime/host/wasi/cli/mod.rs +++ b/hermes/bin/src/runtime/host/wasi/cli/mod.rs @@ -1,18 +1,21 @@ //! Host - WASI - CLI implementations use crate::{ - runtime::extensions::bindings::wasi::{ - cli, - io::streams::{InputStream, OutputStream}, + runtime::extensions::{ + bindings::wasi::{ + cli, + io::streams::{InputStream, OutputStream}, + }, + state::{Context, Stateful}, }, - state::{HermesState, Stateful}, + state::HermesState, }; /// WASI State pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::state::Context) -> Self { + fn new(_ctx: &Context) -> Self { Self {} } } diff --git a/hermes/bin/src/runtime/host/wasi/clocks/mod.rs b/hermes/bin/src/runtime/host/wasi/clocks/mod.rs index 220c86126..674319ca3 100644 --- a/hermes/bin/src/runtime/host/wasi/clocks/mod.rs +++ b/hermes/bin/src/runtime/host/wasi/clocks/mod.rs @@ -1,6 +1,6 @@ //! Host - WASI - Clock implementations -use crate::state::Stateful; +use crate::runtime::extensions::state::{Context, Stateful}; mod monotonic; mod wall; @@ -14,7 +14,7 @@ pub(crate) struct State { } impl Stateful for State { - fn new(ctx: &crate::state::Context) -> Self { + fn new(ctx: &Context) -> Self { Self { _monotonic: monotonic::State::new(ctx), _wall: wall::State::new(ctx), diff --git a/hermes/bin/src/runtime/host/wasi/clocks/monotonic.rs b/hermes/bin/src/runtime/host/wasi/clocks/monotonic.rs index ee68930b0..e3e77bbe7 100644 --- a/hermes/bin/src/runtime/host/wasi/clocks/monotonic.rs +++ b/hermes/bin/src/runtime/host/wasi/clocks/monotonic.rs @@ -1,15 +1,18 @@ //! Host - WASI - monotonic clock implementations use crate::{ - runtime::extensions::bindings::wasi::clocks::monotonic_clock::{Duration, Host, Instant}, - state::{HermesState, Stateful}, + runtime::extensions::{ + bindings::wasi::clocks::monotonic_clock::{Duration, Host, Instant}, + state::{Context, Stateful}, + }, + state::HermesState, }; /// WASI State pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::state::Context) -> Self { + fn new(_ctx: &Context) -> Self { Self {} } } diff --git a/hermes/bin/src/runtime/host/wasi/clocks/wall.rs b/hermes/bin/src/runtime/host/wasi/clocks/wall.rs index 69677bb6b..2a25685d7 100644 --- a/hermes/bin/src/runtime/host/wasi/clocks/wall.rs +++ b/hermes/bin/src/runtime/host/wasi/clocks/wall.rs @@ -1,15 +1,18 @@ //! Host - WASI - Wall Clock implementations use crate::{ - runtime::extensions::bindings::wasi::clocks::wall_clock::{Datetime, Host}, - state::{HermesState, Stateful}, + runtime::extensions::{ + bindings::wasi::clocks::wall_clock::{Datetime, Host}, + state::{Context, Stateful}, + }, + state::HermesState, }; /// WASI State pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::state::Context) -> Self { + fn new(_ctx: &Context) -> Self { Self {} } } diff --git a/hermes/bin/src/runtime/host/wasi/filesystem/mod.rs b/hermes/bin/src/runtime/host/wasi/filesystem/mod.rs index c28cfefd7..60462a1f0 100644 --- a/hermes/bin/src/runtime/host/wasi/filesystem/mod.rs +++ b/hermes/bin/src/runtime/host/wasi/filesystem/mod.rs @@ -1,25 +1,28 @@ //! Host - WASI - Filesystem implementations use crate::{ - runtime::extensions::bindings::wasi::{ - filesystem::{ - self, - types::{ - Advice, Descriptor, DescriptorFlags, DescriptorStat, DescriptorType, - DirectoryEntry, DirectoryEntryStream, Error, ErrorCode, Filesize, - MetadataHashValue, NewTimestamp, OpenFlags, PathFlags, + runtime::extensions::{ + bindings::wasi::{ + filesystem::{ + self, + types::{ + Advice, Descriptor, DescriptorFlags, DescriptorStat, DescriptorType, + DirectoryEntry, DirectoryEntryStream, Error, ErrorCode, Filesize, + MetadataHashValue, NewTimestamp, OpenFlags, PathFlags, + }, }, + io::streams::{InputStream, OutputStream}, }, - io::streams::{InputStream, OutputStream}, + state::{Context, Stateful}, }, - state::{HermesState, Stateful}, + state::HermesState, }; /// WASI State pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::state::Context) -> Self { + fn new(_ctx: &Context) -> Self { Self {} } } diff --git a/hermes/bin/src/runtime/host/wasi/http/mod.rs b/hermes/bin/src/runtime/host/wasi/http/mod.rs index 1da11e533..da8b2a55e 100644 --- a/hermes/bin/src/runtime/host/wasi/http/mod.rs +++ b/hermes/bin/src/runtime/host/wasi/http/mod.rs @@ -1,29 +1,32 @@ //! Host - WASI - HTTP implementations use crate::{ - runtime::extensions::bindings::wasi::{ - http::{ - self, - outgoing_handler::{ - ErrorCode, FutureIncomingResponse, OutgoingRequest, RequestOptions, - }, - types::{ - Duration, FieldKey, FieldValue, Fields, FutureTrailers, HeaderError, Headers, - HostIncomingResponse, HostOutgoingResponse, IncomingBody, IncomingRequest, - IncomingResponse, IoError, Method, OutgoingBody, OutgoingResponse, - ResponseOutparam, Scheme, StatusCode, Trailers, + runtime::extensions::{ + bindings::wasi::{ + http::{ + self, + outgoing_handler::{ + ErrorCode, FutureIncomingResponse, OutgoingRequest, RequestOptions, + }, + types::{ + Duration, FieldKey, FieldValue, Fields, FutureTrailers, HeaderError, Headers, + HostIncomingResponse, HostOutgoingResponse, IncomingBody, IncomingRequest, + IncomingResponse, IoError, Method, OutgoingBody, OutgoingResponse, + ResponseOutparam, Scheme, StatusCode, Trailers, + }, }, + io::streams::{InputStream, OutputStream}, }, - io::streams::{InputStream, OutputStream}, + state::{Context, Stateful}, }, - state::{HermesState, Stateful}, + state::HermesState, }; /// WASI State pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::state::Context) -> Self { + fn new(_ctx: &Context) -> Self { Self {} } } diff --git a/hermes/bin/src/runtime/host/wasi/io/error.rs b/hermes/bin/src/runtime/host/wasi/io/error.rs index 0e1c1484e..2b0aa8828 100644 --- a/hermes/bin/src/runtime/host/wasi/io/error.rs +++ b/hermes/bin/src/runtime/host/wasi/io/error.rs @@ -1,15 +1,18 @@ //! WASI IO Error use crate::{ - runtime::extensions::bindings::wasi::io::error::{Error, Host, HostError}, - state::{HermesState, Stateful}, + runtime::extensions::{ + bindings::wasi::io::error::{Error, Host, HostError}, + state::{Context, Stateful}, + }, + state::HermesState, }; /// WASI State pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::state::Context) -> Self { + fn new(_ctx: &Context) -> Self { Self {} } } diff --git a/hermes/bin/src/runtime/host/wasi/io/mod.rs b/hermes/bin/src/runtime/host/wasi/io/mod.rs index c661c4eff..6994734de 100644 --- a/hermes/bin/src/runtime/host/wasi/io/mod.rs +++ b/hermes/bin/src/runtime/host/wasi/io/mod.rs @@ -1,6 +1,6 @@ //! Host - WASI IO Implementation -use crate::state::Stateful; +use crate::runtime::extensions::state::{Context, Stateful}; pub(crate) mod error; pub(crate) mod streams; @@ -14,7 +14,7 @@ pub(crate) struct State { } impl Stateful for State { - fn new(ctx: &crate::state::Context) -> Self { + fn new(ctx: &Context) -> Self { Self { _error: error::State::new(ctx), _streams: streams::State::new(ctx), diff --git a/hermes/bin/src/runtime/host/wasi/io/streams.rs b/hermes/bin/src/runtime/host/wasi/io/streams.rs index 6986e6027..aeb8b5b52 100644 --- a/hermes/bin/src/runtime/host/wasi/io/streams.rs +++ b/hermes/bin/src/runtime/host/wasi/io/streams.rs @@ -1,17 +1,20 @@ //! WASI IO Streams use crate::{ - runtime::extensions::bindings::wasi::io::streams::{ - Host, HostInputStream, HostOutputStream, InputStream, OutputStream, StreamError, + runtime::extensions::{ + bindings::wasi::io::streams::{ + Host, HostInputStream, HostOutputStream, InputStream, OutputStream, StreamError, + }, + state::{Context, Stateful}, }, - state::{HermesState, Stateful}, + state::HermesState, }; /// WASI State pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::state::Context) -> Self { + fn new(_ctx: &Context) -> Self { Self {} } } diff --git a/hermes/bin/src/runtime/host/wasi/mod.rs b/hermes/bin/src/runtime/host/wasi/mod.rs index f43c19cf9..f8b5f0a08 100644 --- a/hermes/bin/src/runtime/host/wasi/mod.rs +++ b/hermes/bin/src/runtime/host/wasi/mod.rs @@ -1,6 +1,6 @@ //! Runtime modules - extensions - WASI standard extensions -use crate::state::Stateful; +use crate::runtime::extensions::state::{Context, Stateful}; pub(crate) mod cli; pub(crate) mod clocks; @@ -26,7 +26,7 @@ pub(crate) struct State { } impl Stateful for State { - fn new(ctx: &crate::state::Context) -> Self { + fn new(ctx: &Context) -> Self { Self { _cli: cli::State::new(ctx), _clocks: clocks::State::new(ctx), diff --git a/hermes/bin/src/runtime/host/wasi/random/insecure.rs b/hermes/bin/src/runtime/host/wasi/random/insecure.rs index 98e41115e..6fe934459 100644 --- a/hermes/bin/src/runtime/host/wasi/random/insecure.rs +++ b/hermes/bin/src/runtime/host/wasi/random/insecure.rs @@ -1,15 +1,18 @@ //! Insecure RNG use crate::{ - runtime::extensions::bindings::wasi::random::insecure::Host, - state::{HermesState, Stateful}, + runtime::extensions::{ + bindings::wasi::random::insecure::Host, + state::{Context, Stateful}, + }, + state::HermesState, }; /// WASI State pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::state::Context) -> Self { + fn new(_ctx: &Context) -> Self { Self {} } } diff --git a/hermes/bin/src/runtime/host/wasi/random/insecure_seed.rs b/hermes/bin/src/runtime/host/wasi/random/insecure_seed.rs index 66d9c67d9..7f414d6b0 100644 --- a/hermes/bin/src/runtime/host/wasi/random/insecure_seed.rs +++ b/hermes/bin/src/runtime/host/wasi/random/insecure_seed.rs @@ -1,15 +1,18 @@ //! Insecure RNG use crate::{ - runtime::extensions::bindings::wasi::random::insecure_seed::Host, - state::{HermesState, Stateful}, + runtime::extensions::{ + bindings::wasi::random::insecure_seed::Host, + state::{Context, Stateful}, + }, + state::HermesState, }; /// WASI State pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::state::Context) -> Self { + fn new(_ctx: &Context) -> Self { Self {} } } diff --git a/hermes/bin/src/runtime/host/wasi/random/mod.rs b/hermes/bin/src/runtime/host/wasi/random/mod.rs index 43fff7e4a..416a6e6b6 100644 --- a/hermes/bin/src/runtime/host/wasi/random/mod.rs +++ b/hermes/bin/src/runtime/host/wasi/random/mod.rs @@ -1,6 +1,6 @@ //! Host - WASI - Random implementations -use crate::state::Stateful; +use crate::runtime::extensions::state::{Context, Stateful}; pub(crate) mod insecure; pub(crate) mod insecure_seed; @@ -17,7 +17,7 @@ pub(crate) struct State { } impl Stateful for State { - fn new(ctx: &crate::state::Context) -> Self { + fn new(ctx: &Context) -> Self { Self { _insecure: insecure::State::new(ctx), _insecure_seed: insecure_seed::State::new(ctx), diff --git a/hermes/bin/src/runtime/host/wasi/random/secure.rs b/hermes/bin/src/runtime/host/wasi/random/secure.rs index b31ae5ecf..878ff8dd2 100644 --- a/hermes/bin/src/runtime/host/wasi/random/secure.rs +++ b/hermes/bin/src/runtime/host/wasi/random/secure.rs @@ -1,15 +1,18 @@ //! Random RNG use crate::{ - runtime::extensions::bindings::wasi::random::random::Host, - state::{HermesState, Stateful}, + runtime::extensions::{ + bindings::wasi::random::random::Host, + state::{Context, Stateful}, + }, + state::HermesState, }; /// WASI State pub(crate) struct State {} impl Stateful for State { - fn new(_ctx: &crate::state::Context) -> Self { + fn new(_ctx: &Context) -> Self { Self {} } } diff --git a/hermes/bin/src/state.rs b/hermes/bin/src/state.rs index 14a3c6c91..e5b1d9401 100644 --- a/hermes/bin/src/state.rs +++ b/hermes/bin/src/state.rs @@ -1,73 +1,9 @@ //! Hermes state implementation. -use rusty_ulid::Ulid; - -use crate::runtime::host::{hermes, wasi}; - -/// A WASM module's context structure, which is intended to be passed to the -/// `wasmtime::Store` during the WASM module's state initialization process. -#[derive(Clone)] -pub(crate) struct Context { - /// Hermes application name - app_name: String, - - /// module ULID id - module_id: Ulid, - - /// event name to be executed - event_name: Option, - - /// module's execution counter - counter: u64, -} - -impl Context { - /// Creates a new instance of the `Context`. - pub(crate) fn new(app_name: String) -> Self { - Self { - app_name, - module_id: Ulid::generate(), - event_name: None, - counter: 0, - } - } - - /// Increments the module's execution counter and sets the event name to be executed - pub(crate) fn use_for(&mut self, event_name: String) { - self.event_name = Some(event_name); - self.counter += 1; - } - - /// Get the application name - #[allow(dead_code)] - pub(crate) fn app_name(&self) -> &str { - &self.app_name - } - - /// Get the module id - #[allow(dead_code)] - pub(crate) fn module_id(&self) -> &Ulid { - &self.module_id - } - - /// Get the event name - #[allow(dead_code)] - pub(crate) fn event_name(&self) -> Option<&String> { - self.event_name.as_ref() - } - - /// Get the counter value - #[allow(dead_code)] - pub(crate) fn counter(&self) -> u64 { - self.counter - } -} - -/// All Hermes runtime extensions states need to implement this. -pub(crate) trait Stateful { - /// Initial state for the given context - fn new(ctx: &Context) -> Self; -} +use crate::runtime::{ + extensions::state::{Context, Stateful}, + host::{hermes, wasi}, +}; #[allow(dead_code)] /// State for Hermes runtime diff --git a/hermes/bin/src/wasm/module.rs b/hermes/bin/src/wasm/module.rs index edd4aba77..094555010 100644 --- a/hermes/bin/src/wasm/module.rs +++ b/hermes/bin/src/wasm/module.rs @@ -12,8 +12,11 @@ use wasmtime::{ use super::engine::Engine; use crate::{ event_queue::event::HermesEventPayload, - runtime::extensions::bindings, - state::{Context, HermesState, Stateful}, + runtime::extensions::{ + bindings, + state::{Context, Stateful}, + }, + state::HermesState, }; /// Structure defines an abstraction over the WASM module instance. From aa551ed5be3cd3ff8b144a1143583a22fa01fcf0 Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Fri, 9 Feb 2024 14:01:24 +0200 Subject: [PATCH 18/36] update error handling --- hermes/Cargo.toml | 1 + hermes/bin/Cargo.toml | 1 + hermes/bin/src/wasm/engine.rs | 10 +++++++--- hermes/bin/src/wasm/module.rs | 22 ++++++++++++++++------ 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/hermes/Cargo.toml b/hermes/Cargo.toml index e49bfaa73..6a9cacf24 100644 --- a/hermes/Cargo.toml +++ b/hermes/Cargo.toml @@ -56,3 +56,4 @@ pallas-hardano = { version = "0.22.0" } wasmtime = "17.0.0" rusty_ulid = "2.0.0" anyhow = "1.0.71" +thiserror = "1.0.56" diff --git a/hermes/bin/Cargo.toml b/hermes/bin/Cargo.toml index 9c01f1b57..2c1da890d 100644 --- a/hermes/bin/Cargo.toml +++ b/hermes/bin/Cargo.toml @@ -16,3 +16,4 @@ workspace = true wasmtime = { workspace = true, features = ["component-model"] } rusty_ulid = { workspace = true } anyhow = { workspace = true } +thiserror = { workspace = true } diff --git a/hermes/bin/src/wasm/engine.rs b/hermes/bin/src/wasm/engine.rs index 3ef011925..dd67fb1b0 100644 --- a/hermes/bin/src/wasm/engine.rs +++ b/hermes/bin/src/wasm/engine.rs @@ -5,6 +5,11 @@ use std::ops::{Deref, DerefMut}; use wasmtime::{Config as WasmConfig, Engine as WasmEngine}; +/// WASM engine configuration error +#[derive(thiserror::Error, Debug)] +#[error("Incorrect `wasmtime::Engine` configuration")] +struct BadEngineConfigError; + /// WASM Engine struct #[derive(Clone)] pub(crate) struct Engine(WasmEngine); @@ -27,15 +32,14 @@ impl Engine { /// Creates a new instance of the `Engine`. /// /// # Errors - /// - /// - `wasmtime::Error`: engine initialization error. + /// - `BadEngineConfigError` #[allow(dead_code)] pub(crate) fn new() -> anyhow::Result { let mut config = WasmConfig::new(); config.wasm_component_model(true); config.consume_fuel(false); - let engine = WasmEngine::new(&config)?; + let engine = WasmEngine::new(&config).map_err(|_| BadEngineConfigError)?; Ok(Self(engine)) } diff --git a/hermes/bin/src/wasm/module.rs b/hermes/bin/src/wasm/module.rs index 094555010..b83ea6f88 100644 --- a/hermes/bin/src/wasm/module.rs +++ b/hermes/bin/src/wasm/module.rs @@ -19,6 +19,11 @@ use crate::{ state::HermesState, }; +/// Bad WASM module error +#[derive(thiserror::Error, Debug)] +#[error("Bad WASM module")] +struct BadWASMModuleError; + /// Structure defines an abstraction over the WASM module instance. /// It holds the state of the WASM module along with its context data. /// It is used to interact with the WASM module. @@ -57,15 +62,19 @@ impl Module { /// Instantiate WASM module /// /// # Errors - /// - `wasmtime::Error`: WASM call error + /// - `BadModuleError` + /// - `BadEngineConfigError` #[allow(dead_code)] pub(crate) fn new(app_name: String, module_bytes: &[u8]) -> anyhow::Result { let engine = Engine::new()?; - let module = WasmModule::new(&engine, module_bytes)?; + let module = WasmModule::new(&engine, module_bytes).map_err(|_| BadWASMModuleError)?; let mut linker = WasmLinker::new(&engine); - bindings::Hermes::add_to_linker(&mut linker, |state: &mut HermesState| state)?; - let pre_instance = linker.instantiate_pre(&module)?; + bindings::Hermes::add_to_linker(&mut linker, |state: &mut HermesState| state) + .map_err(|_| BadWASMModuleError)?; + let pre_instance = linker + .instantiate_pre(&module) + .map_err(|_| BadWASMModuleError)?; Ok(Self { pre_instance, @@ -82,14 +91,15 @@ impl Module { /// is has an initial state, based on the provided context for each call. /// /// # Errors - /// - `wasmtime::Error`: WASM call error + /// - `BadModuleError` #[allow(dead_code)] pub(crate) fn execute_event(&mut self, event: &impl HermesEventPayload) -> anyhow::Result<()> { self.context.use_for(event.event_name().to_string()); let state = HermesState::new(&self.context); let mut store = WasmStore::new(&self.engine, state); - let (instance, _) = bindings::Hermes::instantiate_pre(&mut store, &self.pre_instance)?; + let (instance, _) = bindings::Hermes::instantiate_pre(&mut store, &self.pre_instance) + .map_err(|_| BadWASMModuleError)?; event.execute(&mut ModuleInstance { _instance: instance, From aed5512c8e38b2c355c21f95e401ed796a85430f Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Fri, 9 Feb 2024 14:31:44 +0200 Subject: [PATCH 19/36] fix docs --- hermes/bin/src/runtime/extensions/bindings.rs | 4 +--- hermes/bin/src/runtime/extensions/mod.rs | 6 ------ hermes/bin/src/runtime/host/wasi/http/mod.rs | 10 ---------- hermes/bin/src/runtime/host/wasi/io/streams.rs | 13 ------------- hermes/bin/src/wasm/module.rs | 2 +- wasm/wasi/wit/deps/http/types.wit | 6 ++---- wasm/wasi/wit/deps/io/streams.wit | 8 ++------ 7 files changed, 6 insertions(+), 43 deletions(-) diff --git a/hermes/bin/src/runtime/extensions/bindings.rs b/hermes/bin/src/runtime/extensions/bindings.rs index d96716d9f..ed59bd944 100644 --- a/hermes/bin/src/runtime/extensions/bindings.rs +++ b/hermes/bin/src/runtime/extensions/bindings.rs @@ -2,9 +2,7 @@ //! //! *Note* //! Inspect the generated code with: -//! ``` -//! cargo expand --bin hermes runtime::extensions::bindings -//! ``` +//! `cargo expand --bin hermes runtime::extensions::bindings` #![allow(clippy::indexing_slicing)] diff --git a/hermes/bin/src/runtime/extensions/mod.rs b/hermes/bin/src/runtime/extensions/mod.rs index d89e461ad..52aff0da5 100644 --- a/hermes/bin/src/runtime/extensions/mod.rs +++ b/hermes/bin/src/runtime/extensions/mod.rs @@ -1,10 +1,4 @@ //! Hermes runtime extensions -//! -//! *Note* -//! Inspect the generated code with: -//! ``` -//! cargo expand --bin hermes runtime::extensions -//! ``` use wasmtime::{ component::{Component, Linker}, diff --git a/hermes/bin/src/runtime/host/wasi/http/mod.rs b/hermes/bin/src/runtime/host/wasi/http/mod.rs index da8b2a55e..edc03203f 100644 --- a/hermes/bin/src/runtime/host/wasi/http/mod.rs +++ b/hermes/bin/src/runtime/host/wasi/http/mod.rs @@ -32,12 +32,6 @@ impl Stateful for State { } impl http::types::HostFutureIncomingResponse for HermesState { - /// * - /// /// Returns a pollable which becomes ready when either the Response has - /// /// been received, or an error has occurred. When this pollable is ready, - /// /// the `get` method will return `some`. - /// subscribe: func() -> pollable; - /// */ /// Returns the incoming HTTP Response, or an error, once one is ready. /// /// The outer `option` represents future readiness. Users can wait on this @@ -173,10 +167,6 @@ impl http::types::HostFields for HermesState { } impl http::types::HostFutureTrailers for HermesState { - /// Returns a pollable which becomes ready when either the trailers have - /// been received, or an error has occurred. When this pollable is ready, - /// the `get` method will return `some`. - /// subscribe: func() -> pollable; // Hermes does NOT support `poll` /// Returns the contents of the trailers, or an error which occurred, /// once the future is ready. /// diff --git a/hermes/bin/src/runtime/host/wasi/io/streams.rs b/hermes/bin/src/runtime/host/wasi/io/streams.rs index aeb8b5b52..c96645894 100644 --- a/hermes/bin/src/runtime/host/wasi/io/streams.rs +++ b/hermes/bin/src/runtime/host/wasi/io/streams.rs @@ -161,19 +161,6 @@ impl HostOutputStream for HermesState { todo!() } - /// * - /// /// Create a `pollable` which will resolve once the output-stream - /// /// is ready for more writing, or an error has occurred. When this - /// /// pollable is ready, `check-write` will return `ok(n)` with n>0, or an - /// /// error. - /// /// - /// /// If the stream is closed, this pollable is always ready immediately. - /// /// - /// /// The created `pollable` is a child resource of the `output-stream`. - /// /// Implementations may trap if the `output-stream` is dropped before - /// /// all derived `pollable`s created with this function are dropped. - /// subscribe: func() -> pollable; - /// */ /// Write zeroes to a stream. /// /// this should be used precisely like `write` with the exact same diff --git a/hermes/bin/src/wasm/module.rs b/hermes/bin/src/wasm/module.rs index b83ea6f88..6b59837f2 100644 --- a/hermes/bin/src/wasm/module.rs +++ b/hermes/bin/src/wasm/module.rs @@ -9,7 +9,6 @@ use wasmtime::{ Store as WasmStore, }; -use super::engine::Engine; use crate::{ event_queue::event::HermesEventPayload, runtime::extensions::{ @@ -17,6 +16,7 @@ use crate::{ state::{Context, Stateful}, }, state::HermesState, + wasm::engine::Engine, }; /// Bad WASM module error diff --git a/wasm/wasi/wit/deps/http/types.wit b/wasm/wasi/wit/deps/http/types.wit index a54536d99..f2ee86fe2 100644 --- a/wasm/wasi/wit/deps/http/types.wit +++ b/wasm/wasi/wit/deps/http/types.wit @@ -438,7 +438,7 @@ interface types { /// Returns a pollable which becomes ready when either the trailers have /// been received, or an error has occured. When this pollable is ready, /// the `get` method will return `some`. - //subscribe: func() -> pollable; // Hermes does NOT support `poll` + // subscribe: func() -> pollable; // Hermes does NOT support `poll` /// Returns the contents of the trailers, or an error which occured, /// once the future is ready. @@ -547,12 +547,10 @@ interface types { /// This resource is returned by the `wasi:http/outgoing-handler` interface to /// provide the HTTP Response corresponding to the sent Request. resource future-incoming-response { - /* /// Returns a pollable which becomes ready when either the Response has /// been received, or an error has occured. When this pollable is ready, /// the `get` method will return `some`. - subscribe: func() -> pollable; - */ + // subscribe: func() -> pollable; // Hermes does NOT support `poll` /// Returns the incoming HTTP Response, or an error, once one is ready. /// diff --git a/wasm/wasi/wit/deps/io/streams.wit b/wasm/wasi/wit/deps/io/streams.wit index 2f9f520d2..5b7cf0649 100644 --- a/wasm/wasi/wit/deps/io/streams.wit +++ b/wasm/wasi/wit/deps/io/streams.wit @@ -83,15 +83,13 @@ interface streams { len: u64, ) -> result; - /* /// Create a `pollable` which will resolve once either the specified stream /// has bytes available to read or the other end of the stream has been /// closed. /// The created `pollable` is a child resource of the `input-stream`. /// Implementations may trap if the `input-stream` is dropped before /// all derived `pollable`s created with this function are dropped. - subscribe: func() -> pollable; - */ + // subscribe: func() -> pollable; // Hermes does NOT support `poll` } @@ -170,7 +168,6 @@ interface streams { /// and stream is ready for writing again. blocking-flush: func() -> result<_, stream-error>; - /* /// Create a `pollable` which will resolve once the output-stream /// is ready for more writing, or an error has occured. When this /// pollable is ready, `check-write` will return `ok(n)` with n>0, or an @@ -181,8 +178,7 @@ interface streams { /// The created `pollable` is a child resource of the `output-stream`. /// Implementations may trap if the `output-stream` is dropped before /// all derived `pollable`s created with this function are dropped. - subscribe: func() -> pollable; - */ + // subscribe: func() -> pollable; // Hermes does NOT support `poll` /// Write zeroes to a stream. /// From 35b861a48bfe5c4499aeb3f2315fadb0466449e3 Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Tue, 13 Feb 2024 10:04:12 +0200 Subject: [PATCH 20/36] update errors --- hermes/bin/src/wasm/engine.rs | 6 +++--- hermes/bin/src/wasm/module.rs | 13 +++++++------ 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/hermes/bin/src/wasm/engine.rs b/hermes/bin/src/wasm/engine.rs index dd67fb1b0..42329b9cd 100644 --- a/hermes/bin/src/wasm/engine.rs +++ b/hermes/bin/src/wasm/engine.rs @@ -7,8 +7,8 @@ use wasmtime::{Config as WasmConfig, Engine as WasmEngine}; /// WASM engine configuration error #[derive(thiserror::Error, Debug)] -#[error("Incorrect `wasmtime::Engine` configuration")] -struct BadEngineConfigError; +#[error("Incorrect `wasmtime::Engine` configuration, err: {0}")] +struct BadEngineConfigError(String); /// WASM Engine struct #[derive(Clone)] @@ -39,7 +39,7 @@ impl Engine { config.wasm_component_model(true); config.consume_fuel(false); - let engine = WasmEngine::new(&config).map_err(|_| BadEngineConfigError)?; + let engine = WasmEngine::new(&config).map_err(|e| BadEngineConfigError(e.to_string()))?; Ok(Self(engine)) } diff --git a/hermes/bin/src/wasm/module.rs b/hermes/bin/src/wasm/module.rs index 6b59837f2..f354694bc 100644 --- a/hermes/bin/src/wasm/module.rs +++ b/hermes/bin/src/wasm/module.rs @@ -21,8 +21,8 @@ use crate::{ /// Bad WASM module error #[derive(thiserror::Error, Debug)] -#[error("Bad WASM module")] -struct BadWASMModuleError; +#[error("Bad WASM module, err: {0}")] +struct BadWASMModuleError(String); /// Structure defines an abstraction over the WASM module instance. /// It holds the state of the WASM module along with its context data. @@ -67,14 +67,15 @@ impl Module { #[allow(dead_code)] pub(crate) fn new(app_name: String, module_bytes: &[u8]) -> anyhow::Result { let engine = Engine::new()?; - let module = WasmModule::new(&engine, module_bytes).map_err(|_| BadWASMModuleError)?; + let module = WasmModule::new(&engine, module_bytes) + .map_err(|e| BadWASMModuleError(e.to_string()))?; let mut linker = WasmLinker::new(&engine); bindings::Hermes::add_to_linker(&mut linker, |state: &mut HermesState| state) - .map_err(|_| BadWASMModuleError)?; + .map_err(|e| BadWASMModuleError(e.to_string()))?; let pre_instance = linker .instantiate_pre(&module) - .map_err(|_| BadWASMModuleError)?; + .map_err(|e| BadWASMModuleError(e.to_string()))?; Ok(Self { pre_instance, @@ -99,7 +100,7 @@ impl Module { let mut store = WasmStore::new(&self.engine, state); let (instance, _) = bindings::Hermes::instantiate_pre(&mut store, &self.pre_instance) - .map_err(|_| BadWASMModuleError)?; + .map_err(|e| BadWASMModuleError(e.to_string()))?; event.execute(&mut ModuleInstance { _instance: instance, From 673e01b28e31d210784ae871e45eff084a6ffe8e Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Tue, 13 Feb 2024 10:29:02 +0200 Subject: [PATCH 21/36] setup benchmarks --- hermes/Cargo.toml | 1 + hermes/bin/Cargo.toml | 9 +++++++++ hermes/bin/benches/module.rs | 12 ++++++++++++ 3 files changed, 22 insertions(+) create mode 100644 hermes/bin/benches/module.rs diff --git a/hermes/Cargo.toml b/hermes/Cargo.toml index 6a9cacf24..cc22fbe2d 100644 --- a/hermes/Cargo.toml +++ b/hermes/Cargo.toml @@ -57,3 +57,4 @@ wasmtime = "17.0.0" rusty_ulid = "2.0.0" anyhow = "1.0.71" thiserror = "1.0.56" +criterion = "0.5.1" diff --git a/hermes/bin/Cargo.toml b/hermes/bin/Cargo.toml index 2c1da890d..839c861e8 100644 --- a/hermes/bin/Cargo.toml +++ b/hermes/bin/Cargo.toml @@ -9,11 +9,20 @@ edition.workspace = true license.workspace = true repository.workspace = true +[features] +bench = ["dep:criterion"] + [lints] workspace = true +[[bench]] +name = "module" +harness = false +required-features = ["bench"] + [dependencies] wasmtime = { workspace = true, features = ["component-model"] } rusty_ulid = { workspace = true } anyhow = { workspace = true } thiserror = { workspace = true } +criterion = { workspace = true, optional = true } diff --git a/hermes/bin/benches/module.rs b/hermes/bin/benches/module.rs new file mode 100644 index 000000000..2165b0ef2 --- /dev/null +++ b/hermes/bin/benches/module.rs @@ -0,0 +1,12 @@ +//! `wasm::Module` benchmark +#![allow(missing_docs, clippy::missing_docs_in_private_items)] + +use criterion::{criterion_group, criterion_main, Criterion}; + +fn module_benches(c: &mut Criterion) { + c.bench_function("module_bench", |_b| {}); +} + +criterion_group!(benches, module_benches); + +criterion_main!(benches); From 58a58f8a5ae367f510f05bbbd1c29dab99bea6ff Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Tue, 13 Feb 2024 10:57:56 +0200 Subject: [PATCH 22/36] add module_hermes_component_bench --- hermes/bin/benches/component.wasm | Bin 0 -> 1851728 bytes hermes/bin/benches/module.rs | 4 +++- hermes/bin/src/lib.rs | 3 +++ hermes/bin/src/wasm/module.rs | 33 ++++++++++++++++++++++++++++++ 4 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 hermes/bin/benches/component.wasm diff --git a/hermes/bin/benches/component.wasm b/hermes/bin/benches/component.wasm new file mode 100644 index 0000000000000000000000000000000000000000..91b869ee8c26cfee850b39a17b5dbaaf83d1b951 GIT binary patch literal 1851728 zcmeFadw`u)b@%_=&SlOyGjo!eBoi{gK0|;BfIHvWqJ*;XsHs90@leer$OdZDfF>!nzJpYPhwb1st! zp!oLfAHS2F=Xv(tYp=cb+H0-7_S*Y76Kp@Qw>Job(#r7cC<*Gj_U)M5yKCPSE2bx= zuADe96NgDKZ+hau{>gm@CRR*dIkSKJ^!B}RSUD~X7hJXdz^=_ZXJ+=Vnz?5G#DOhi zE7zE?8scP>oRB-ElG<4 zsOs&4jDt7{s(IGT)%(b(EDFQWwSuwNy3Yt-F z#c~hq*f~MNQ8*nXSM8kG7so)r{;HMoe1(dWE>?ieS}2zK#dB~a%>$Fr5_Ezo%fL#- z#c|GXTFSUvusWqTz`?S5U2cznl09uEC|PN>k%UvFp4|smFvdtscpxY$F}^Om+McfD z=_-4=oTn>;5~Y%d5NYF4!^r6CQS^m{API!+;PyQTUK|uFLt!|Oag+Q5Gn3O3){AQR zwlD1u5Zo|;fA0zxUJ@NT6kHM?I&>&Jq-U-n89{JKfjpIk*M--TxXuy*AbB;4RR20M44iaP)dW%U4?JaA6jrl5-GmlY;h|_cnp;m!d@*V@dFAwui4~Vk zPws!|Y|RVex$C)E^^Q``Adc@1-ybGXp%}M5rKsFfu0-WZC5nP-tv3qFJ++`(sZ?VA z_4P;9dJtuwFsxRpt(tMAT1^U39bWfDQBn^oJXIr=M?u&_BCe1Mz<}5V!8}x_8YIf9 zhSewxs(n!*isnbCb{JL$qNpz%?4z*-C3JU-xR(vd~^89@aFJ_@b>VI@aqO{(KUF723 zjl?BOEz>0~7>~-_!tto)g3%~w6kNfD_1mmYF%26fS9GPRMw#k80QNK+6<5ism;0-e zVI^;&07#MA#obgYWgsP?PF%@FYN+Ib%|U;fH1t?*g0ZJjku*VIH7z%4WY?OFUf0{` zbAhY4s_Ww$yQF^G_4FdBjz-AewOOA+T8v!iqTO^YcEN_Y?1Dd4|N5(EhlQN5Zm^6n zz^%{qSF5WaO4LkK{r3?4)oo$%NudziXtVy`GE4<96`Js(m}7d<#Ju*GM$89~Nz931 zJa@N@BR>b{?ms56&ksv;H!+*}uQL=i*cW8Xulp>CQtXP&wkY*iKZbwtq|n-cqy@$@ zafS1bi?-zdT+&y>VZiVORiv;;tG)@}YAseSGL*??mK!OzB6(~!s;*kMe%C_fqBNPn z`rIml)Cb{x%|^fL|G9_%rekvSNlVacj)~#}VOY!AS4hX^(p6Mq5ETqJ#6#RrS;s9N zkCt*v#-q{tL&EM8%Uw|akdoMjGMZex>#`Kq_0{jP!ZG+%a{bLl z-PLn;eLoBr<%B*7vlWg;!;O~lnQD|;qh0C^oRyYS2Zd$VGbQVFPH$L?s*GG%zg1QR z(-Sh1RacwB^dzo#b5P0we$xQ@0O-dQ^-n=(;_3njJ%)P>U>*ST-8?scsxbh-0032& ztO!btK}r_5LAPM4u@K={MCqbtW5^97~MMK6uD}Xj@L3$D*e^> z<5%RQBrwf1XgBCHQ^sUqX0s@>UMGc&401z8hBD!>yy2E`X#UWEM_wB0w|kLsv5bHH z4og)Sno9jG_FQ#EKMkO0?@|s_^n#+?_iLNRs{WxggzU~ zI!v=>is!X)9c!i#j-dWFLu$<59H8YZg1$`dx-FF}^j9xz&mG4SVc}rrHQb2eI}E#* z-3E%Sebk^Bn#(7pJ)uYic$p^8!N77k)@N2Q2$gBGw4UQN2F~=dLj+u{zxvYlz�K z(5d>{J&$P-y#eKlptn&3JJ!vWnvhb?RG}!(rlkqT!ru0sx;m#htNuncg<))WPo}5- z2FsT6C0)uVZ=>a~#E@iSwi}ieGLi~@FpyvkP3Y$v0L|s7Pzr`4V<-#~UfsZ+$p?kgH zQ9^SM`l}1+BQ^1ny}6u{x$Lk0Mq4Dh`y_iMLxsH>;)cB%R?p0cjYg6HdLxIhI2zR$ zw4!V$YA8rjqfvsr;)dzOI%7$p#Z?3nm}}c#een}(yudy8Gh3O@px)_zcP1M}fVw@O ziFUWTM>La-E z4(DN~7zexX=Fe~RkX3O#t}@lAMq6CfrlA_(H8~Q2xGkeKc!P1~wKnFZM-0sTzg(7(+5tdt1Y@l#LWDDRgG#ZQi0}www?HYV ziyI3`EhL5CydsDji|FeRSzcDNzAoyozA-5re<-}Jz;|J;r-k&9z)u0)t8Tosi_l6` z?s?o$xfgQ7mc4`$XRy>_-vu~*nGX6=^%4fDVwv<++KV-7TuYT zzYzwNvQCrA<`thjK^io#%U?^olc$8n~mjexw2Nc6>4Fn zJI$?B3rYQ}rUa|NJ_h7iv$5K(ZmeO1*Sb}1?Nno(TjSQ%?>4CQWRJV`ZhWe-0pJar zgGq8WlCyEDvB@NLlUd2lly1f@dT0F%QfH8Y;hK2P)EGaFyr(rAPj^qx1mev8>fzeF z#Rx+W5s?b_I^PE0(xK?OLGFXx%WXlqJ35A-JQ#u-NqIyEH|H|&&_ zM?yH+j^A{O3QO(^Vo^E&I3@ z**MM}*I0t854$C97_pK#j3QabyA!-PoXF#eNLMg6WHbd!3SG&1oV!jySpZZ%@gNIx4i&Lro|Ci3|- z38y=wiEx_!F+-H zHTQz4#tYpGO;cY)y%%i`u1IeT8^6x;uQwYnb}w$cBz?r%d?__v=3e4n>Ry)374^o& z>9>LgRJco;jqPr`ySUl7RMmHowWHa%%w49e2{*9}3NCk-y304jvPxH|-cEpaHXFO# zE_X$<(Nw+NWbJM?_P9OD+UxeJ-aglK`=}?@0y7EBAhj&Ak_{w8&|oj8dtlk-IX2V`_8a& z4W-vK8^7Uxqw#VqCU$hR|Ifx*Nh~ zTL6E3=w2T--XIJ1M&-Scyjw$eYuLCgbZ-dVZDDKrc~h7k z2^((~)SH32J#_qk6Hj-9=}_Y>%6|)~w}y`Y%D*#ocZSR2pz*fQ-4VLCv1-y_#6yj@ z3;6A%kA$M;9ZJ4~8t)7py?U25^loLoo6NgHcURcBJ9O^~-Q8jRJsOo1)BPR+ya#~y zhVH%LQnC*R{nddmJR}QT|5v5`8mM1Rc1XbG-#iQ(o(6+uj_W@(ICEcdkyP_h5A_Rg z75u(oEF$+$u#Ee07%s_Yqlks;6YWMQN>Koa@iU?BTYMFnfxh3%NqeKggBz?pXXdj}^cOJ00tCHSxgK!Umw_k3H8?4`DxEFwX zq1F>q%qxWO%v&RV5I2S>S?q?~;wfB~Ixb6+xh#H++;RQYUzoQad$PR!PYjv9*ZA=` zA=B3zz~h8W-(vtzDP;N!bMz1Y3v%=cgV3*eB97kkf03hq{A4-$$uJyz^7@Zr7EoK; zM+WLx~4bV!uYolz5=OdVAE~m5Aju%@H19)wR?WL2V^KC43^59eSVg>5 zOgWAN8P#>|0Bd)sRwEDnTG!O5#ZB=+IVJto`;u@x7ynQzx;&f#wOOdghcVbZR@f`s z)KS<=Q){g7WStxA9Ho;2$hWj?Az7i53G*MqEs=>8bz81IeW^q2S!A`xQrJX}-=l<6 zv4U&Jn*6AFq~?uB8x?dKhGnsvF9Dke+vcMdOo&^Fv31OavF5@h5>0E$;uho47Ag*n zN6&;%=0;Xrik~RJO3kl7<2~j&;48YBbs_N1}xIDI#qI z@DYtt&^QUurS2rRbgFT(JGnQ~vN>Sc6>Hfw=(llCg%hVX8>3{7jz`b(w+lR~Wu#bK zUF2`i1KVkCnLDk?;y-q$ONr_JQepssTh8DKeZo>Ja4VXuuVRG)Ug&Qx@!eiUY86Wj zFpUug7~9RdD{!l|hDWH@P`akc;%hC@f!M7Zk1kUKuCbof`tfL|zwPn2LHHqM9e3mZ zbz-vj-EibEnnkC6k(lfetKAusJ#rXjVvW|z;KshFL^;!UM<$D{rOGTb-I?Y~ zV98wWZ_-Z80ntP4Qm`E%$&fW*Ml5sFp2g2`WaBT6N&S6|R^Mhv)lc{s51*dlTwLTv${ubf@#k1Y16J zW|c4tHP4j~Sy=($gEKQbqpUXp^YiGD2_oGZW2a1b@*;EW8P z-G-Gpj3)NukA6hzhu<-VTqId+cPV*?1Gk{R`t~P2v?3P_Lt+jY_CzM#wszUqMl)>d zm)&9M39^mC73F)fQ7qxAkYcA-`^DUBGq`MiR+(i)T>q%iRzpx{A5+m8h4oQ*U2@2a zR)nBOUgpty7dO!}0^DZjyr$Yh2i^SVLjM3dStfvAGu_m)c7CGks@$X8kBm}6SF^|4 zkIvQpcC8LTwFduiNG?KfBfC4YrI`>AOtWm_WOm=r4I?q5A=nRpxXr*AlaQU*oiNZHjgO#eCm4FTm`H^ zsgm!pkkOjs@V z@pRc3iSY6b@kU5qL0`>jTq$&`6tEtn)NdQ9WQ|)R&oS%lTFTaLh+jy}by{+*C%wKY zS5SfZ4XVD8tc^{g^P7~l*=-i$Gl<-?V`SZZAtCw1ow*_2A`DOC+3y=Q&VueO?ku;Z z*+|8SjXoX^CzRSkSUzyi5MSzzXY%;WX5$=T*b0WNO~Uf$DvPkZ8r$J;yyq?6}aK?=A#yRnmG95EnHGzdzS2aDVkLqFB3CtqCYfAIMHM z*->Sgn&p_9*`dH_iw?R;j-|BaUWSFWG_;_(**;o@wouuzR1N~tsa1}_*GREE+DHxa z7-m=ynVk~nST)zFp)DqS-I`Y*vszl$aQcsRjlY>yTj~RdT4E4K%&b`^(&LdBf{Am| z0+*XO45)O%Zgplnf(^1Z$hpi6V=;)G3*164qlVu*mXs2hf{79IxM%b*<7B z9p32-$@Eu$&UliJpWzbe_?cO^B>jj5hU^Sl`bm54(GF&Mzdcve2km}TJn3teeRMpj z^7F-$J{^XA`B=?0Z9`?pT>D4fpC9mg} zJfRFrj$PMinx}X;2Bst(C!1YwfAuVmJ)uUd(N_dNHQymbd2I1B z)re7;xHqWZAZ%nO(qlZSWV44wWbZ5%mZAOHvpz0oN0PEfG>7c!lqq5WTlR26Aop`a zpl90Q0+ZPgyMPo8(czLm>`U970TWjtX24#i)gIOstATretC*eWW_FM2pB3eq5bKu7 zvFU;=g$cOBsi91kpzh|?A28l!Vm+#D$|2;r*xI7z5k+5~{?G(zAxS*lF=1HF^j36> z#-pp18e?@_R2b!2w@8XkBt^F@n1bH3eZ7@a5ux9^p3u z?O-=fO7D5qk;6e_DIg~+eBw^7AF-jSH%{Sj#i@Y$NlnKjmZ|n>WLaDUZ`Te*$e^!q z%iIdTN4b(}tAJV6WL_K7#`9`bTSJzQcqnU~Tc>L4-DYo>-*n&FqTQS>m#!7UI(I7j}@U7lB3xKoy z7(Kl;MqB(CrMe9<^#yK=V>`P3H#S_)pvp6_-X;p8On}d<|CJS-1GBcebKKUc#<_^| zxn8zLnFx#SS=ej&17Twu-}BrycivRve4x%p=>OW&tL7XNBe$jOQeWVnU4N`yGTeBM zg#AL0UD#xDyvWar?l}aUJ6?B)Qg@V}M~k!PM4J%<)b|T&!Fwv`ck5LfQ|-T1*(`@G zz1P^Smu_^*>2m_na@QuouEY5^MD1O?5Quh|BcmMGc5`s7Ls`(ApTuJ2Th4aqSVr2! z&FOpqYzr?xpXDljypskkde?%OX11zGA2fP>q?dE~1oDqqx3VR^oe*pcq+c^Ii(7V_ z%<4RS6*AS%I(-$QcL?1S-lap^;>^3u`nR~hDrTL-yLy*}wB= zU%vVNM}G46$aJ76Y;g9&|M365>edHd^$)M`0H6BNPrmipH-GeR(iXs{4}awSpS<^< z{^EQOaK~r=_p5IE?nl0Nq5!@ThPj)cy4@qOZ{3?W7d1!V`!+;TLDvy1?#xKyB1Sqo zf5}LcvdfT`?di~g^u&XWq-7T46ze&p89kN(mR;)YcDGcMO#?cr1d5!b78L^_Df{)UDJ1_Iv+&oov%JZ z17ZEODz7rs{C8|w)0pp^&?#z08)4=TR8Kn!0HT2z34G%i!5s7l$WJ!0r1jk+QJayT zDX5(C zF)429m4ZNH(n*AG0wRuh{85AVK0Sw3k0y4zP`w2mgYl2uO^Ev-j?x;~>mSfa9p@p{ zFfB3Gp08<8{d(Bi9+BjBFq}??%@LCi^=AaaCAV62hDd9O-14=jPPxT{@WW$ri(E=> zBQLj+_1fe%@^Z_J(3V?XcBz>cqPJeGcSt*qm2eo3;Kt&~g;CB$JVnR!YDVOGN;(^2c*Y@w+Sl zbDV}8couVTG|J)Mi^{0q0LN5K-1ER4dAi*N{fXy2?nJfTx2g=e-%i5yp)EF0pQhyxA%RjM;^E?Lq@VpeImk0FK-EI_J2VUUrKQj%&R%<*Dv3f4uqcTO)P ziq_#Ynn`cJ70Uzy@if>f;YjPLkHnK+lJO@xr&mlC&*?6lhR_rgA9*vi)9Vb|Ra4_W zosEW_jdXo4IobXZuEOPOgepA0YqVbctK)u_{YHtNc@o_hiKxUo|m9FP1n zpm|?gd@=4zc8&Y0Iqn%IITA+Wp2z41$Yb=+9T;=&As|O0)K#k1=0|#>yu9?W#~v%; z*Yd>LD=i)5Sa z{bZ3nMQUCx+Y_YMnm$GnUL+{9cF`6Q>}B5ToY^N@Z8ic5;mvM@J68bpR#QQT&Ox3Z zMh@Yt#0$0>^cvy02(6&%(m4aiG@8c6YNDlamdZ3vyOBn8R$F+W4nyGa(^AuOp_5FW zm1&gGwouF_tW{CQO7j4+#SWk88*&E*(e$7cAU#BT7k+^b$i4%KgTA~}ivouyW*lAOl zvX3%Bp54YtfzB4E>P@FcywGsnN!Z`ROzEgWx5w_yfmoORFL~}T84AFM6#Ht)qRPd%q@2{0?s0jebc8&D7Sk4c(-8`G$*h3c-e(lM+W1(1B zt-w?^q1ytPC_%Yx)QpI8mpE`Op>YCS+NCLCiaoT}+cVll7%;c_y2@dAuo zPE-rNozq(|*~pT;u&%`>20+-_E+;}nw`|%(;utfH+cpuVabfp!iDEL1q8A#7!4l1+ z_+OF$8rwZRwUhaxQy|pASprcOwMd^VfW181ArMigKu8kWLZCq$B4X%?*HEf_ye(XwD1VQ9H!2%UM<93%0ji}_0Q z+p!v!wO)AP0b%mYj)^X_T{V>}#4dLnhSx_>Jh&wQhFT+oXCR?6DX=mU)~~!clSS4i zG6>L+afT;UP#%IYiYLF;Xmg`1H@)1!jbfV{rp!vVxxs6X*z z&fQEm!wB`6r0b?#0)g?umMFt!7+pxsEG;$@z$B0}3vL>-#0c2|UWkHQbamPcT?r{G zw4}@>ct|X!W~;a+8uG&`N+vF4!i*$)1G;Ubpk*D&ZK#@l=z?^Q+Obj5p!iW}*y~tC zLnZM19EKibcNsHz4caT{5;=^P#>K4H?h7H{zpM$-?DTV+5L>m{h{K`TtJZE4q8LK^ zUt0{}5Md9mrryON$FC8RX8MpVV&e374wE>1_}Z!Ze`rpJR-D~rq~s^NS_L0f(E(QB z!hFA9`pDw;AYS7>!-@_ELY%v?$GQT)3#Bl5_8^PSlv(B|9$Y%4~VG`_@JOT5f1 znU$Ii1^7N?=jlec6^yE8uB$=kD}-5JR41n_G zV`euN?o3?yIx(wtkFOrotl+d)?#(j`mNwnnrEI+;2%LnQbGzGA+F^p-ESsSXs{eQ8;? zh#AcqU|paFxLE_3wcDjx4GeL-1!D}5tfNunjifwSlG!4Zb%! zu|_M3K87SOiy)T9&EoSMSC&v0TXEI6<-@aIgeNFgWovE-jx$zKDeiDyabG%Fg(^@i zR>j_9rO_6vB6dCS#1yO3?w98Z9y`pDt7;shA+gHV?mV*xl}V&mEt6XY9e$v_mJ-X` zl;;Z+@3WTC$b6+?l&T|It@NYA!r1b6TcKEyl_BBDBwG??A_VmaZN7})(R^xz(Z+yb z%FT#s`sD%;9vl7jG?^6O>}u@0I+YnQB6sc1(FU#TRxi9>;#WmxylB)Vs8D=0-&%-|)&W+==z!w1bQ=L}=|JoQ z-xh@fjR`+iD%Sz{o2kN+TD9dYS0p{(#&uEk-y_1<8Us|5;2Hw0ZMizTvrK>?u};eg ziMP=Us#;X3$qsS-d-C%A?i8CR*{%uDM044i)Laz#Fk(n>+(+hRW3+FHiD!Pb*}y`{ zE|lQXsB}mnagKz-O_?WKQBwy&M6;%*Q}IW;P8f8Kwzc$)0BC4$LbQOuq`jjqAad&8 z5#5<_v7n;f!x2V-W6EspD(lFek2SBYA%!kroAE>O&{iv|h_KTE32eT!2N}vI^OaAH z*gD@bQfbPKTvV&Dq5g>I396qD+xzM5aHyZQwIk2;-MOs*=DsKhv5hhM^4*(`95y}j zW;4b^plw3VfXR-lG9qN5TiZ9*q!^|Ty@qPWT0t`D=@Ri0h%WQ$KlPLWh>CYq`|gvf z_R5eg?<~GM)^R{UThl+*5kd`Zlnyn|)(=7Og!!i7^g*2zk!(llZ6ZKtZ5bLJcGPa+ zQpRY|o|f~pl$=^KeN=Vwqd#PgHGMR>dSVbM#NQ(g4q^89g;9}lFTT}^M&P^3tUg*m z6QrK{2M(*lsQNl1w&Sba1%e52`q{@`em;w7-rLGFgZs864VsX!BbEW%0EDN_Js`ZN zDGoYh9YU0xAI6x@o_2FIq0BPW8Cia2FY<$XIVI2nyxd8=pw=!9;f>aGrIoH+8Ct}O zaPU&{%G*Wq?+BgqX00o<=JilQs%YerEWzVNQH~$`!rBi?msY7>HPdAx&0S z1l|VD`r(_jx+eP)0!1afBcr(vp|cs8$M%F}eK`h7&zj76^!U5D(wfV%0XQFDAFj2m zB?L%FQr_G!4MjATAZ=Gq8Run2wk`1|NKo8NHeC!w@R+LDo;C!hb28!8uOiOP2Hqjm zFhza@eUHr>@ICf^QBeK$uH#c-z8PaC0oi9MC=-*Op580vufJM{gYaQP0dU4X-wz@K zjxruN-1Q%L`|%cjtG>O}(>4VLB%5YKBK?q=N?^uPb6bcM$xKDE57KjT{VB4wg34&kn?VeSJ;ge{3b)iC{#JhC z2BhFaAyW>C`;#;yAsk84T7K+J-Ch=#Wyjbvr_~I1kbYe3^79KO3={Na_tTtcT zXQ<}p3oQ`eH0nF}f+bXL*XcU(rEGjL3G>a0FM}fm9YHj{SS~M}8eh7|L=8k{>loAv zk&F&zNPRGYHdc&X$`7=3@ub|z6F+Sj#vuJnH!G@x*xsWuKNhtG5tbCaAbRKb)?4AF zmRJ~mdycjsJiICTEcs3=g0I=){W19-RN#D^&mb`xJ!EC7X-_BxzYTl54A$mA?|ea{ zj$tFbyn>J(eyxof5q>ZC2)K|O&IsV>7D(kxgU>Qy1m&+$xu!K1*y2!q9vW~sP`b!( z25sFQtC%5^?&zT=6?^U{xhYH zqwHj6U&PWn|EQ*0Ou(B|=%OWATR9AF@3w9J8Q$L01z|)_MpY`xM)!YPqECdxo!*h)&j^?E25-{QP*DHsGVuSQP^PosL$ ziFILRjc}tkqhBb6yac$#y31@yugfFJG=fB)4hF*HNbe7Fo?BK+2O-!AVtXTOV3y)7 z>`F5C%JXJ-N;5kVrpS~dSsnx_SjEeG-6+uLm=|;tX_scO+*rqn)fr%S*0mlNSeEtlw^hhu@ z4K;@k-_Ox6-hYQD+K=LemEAhLPSnfF*sW!&UGo|JFdnEE<@C^bM%g8D=E~`Q-7<1A z%IpL$lqfrIn9jBv&zkn9jk28}n%6N!_(^<4p&=c~wG{h{O1_H!)*kCdE-j8<1=@31s~pl+!2!0S-;EK7okF zx#Jk6I-9HlzBXi0dM!VamFF<@B7~KGS%m)Sq4U_NW|%t?QD-7!01&)Q@1J!Qxwr8X{9 z&PT*^REk3>!e^%g7zoJCD4L@+qeUV>54PF;aa-s2=3A>DjA6^R$ds5djAaaEUNY09 z-v}Uwqxv#GI;tPT7H^1JhGHIqwq6DRyZ=6kPxY?~tv}6@cG@t!C83jriZ=(#xjB$) zlz5~8St4$-MBF&;s$0#Epp7C6!um)7$<7v^+O!QVAU6^+V)2Y#vD0c_$7`fyhzPzL zqTdLNv5L8p@>}`@F`R~#=}afnmUavVER{0>1v+-_D`lgsU1AJn0|Us7c8j@bkk=#R z{w;*Gpd&G1Mhxfeb6Rv-!;?hM{h^VZEUVcj3$MDHEP3t7c8O+L_|ujjn~=!zihzk2 zmeQgLuDHqT0s`XImY^Z)VGBRRON5i(7l%QF5vjm9`}qW3s^m47k(w4G?~$G0l&2#l z9yKa@*GSP*y>hA9gE%4{w&zV7bq8KTB{MSP{BY7pr3)u1!&wwg^xTk1ym(J`P`cqc zsR8w8pywI~nKc^+&QLI=jp#s)8EBY`g)-(j<1}j0!X#I57F)H!4;?x)3zJ|7zb4hp z=3P>V_t}s4y37v?vEGii*G6prSK@h%tuP($#2|nKZJL-!mOR>N))CQMrm+IChHj*I z1Rqj9Bf}f-*3z63M>nFF@v?Za=d>N|nNAO1f5VMePa%t%w3(h0W((~opUtoxKI|H0 zd*BZzo{-_dura70xUsLJ6b1}*lO^tTIz@Gd$-R|bB!CPst5C%b@MVRej2pM}%2za{XIXQ|) z*ici!7(*fVq>{c78vGQC7vgyp7@zo6-Oi4Rft<8s>;-gTuO`Ku4Hxtl{78Kr&eEUO zuwn1BY92SOc2&zkk5JFoVvHrDjL(N|bUin+N<=SYWtj?y=d)#^IYi@{#o4yq5wQK7w1JQD04DR`AZldvvxSVppT|Ogb%}aqlF+3za&Pi zXI(SBRdvKA0$i+ZSzPf{NS82Y+Rw=?i&&2@RT;8R5eGQ*i+Z5r)&AvrS`qN}tbSIH zEk^yWOaU9NS9En(kL$N9e8s}rJ@oTA zlS@*+$$XKIgzXUaVa1%5f*MJ)`3G6H1N%rnT8^fVrC+8f?VlP+(#ke|P_@YmZKww8 zUQPRToGfn1L1urgfnu(bT zs3M`r>8gGuZgcn%^s1DV;O2|N_Iv3%Hb@jnKWGo5>(Lhf58BWlv*l*gzUx<*L;Qw_ zy}wjSzu%dIIV+`)igkKX7lZp*?T zNe=QXSFk7N>r31cPtt?k9hkE}_vFG@N?|L1sUZE@lj?zf*<0re^S)?h{WyIY@^a_J zv_na&ix6E~ta)2Q_`<)FdVj*70+Ot1$HYVy`P2Th{0Liab0_Mqc|O)cnc??u@L}Yb z%K|b(En~BZR$?NnxqE~k9MHUp?rL(%gm@kEcKXMUp^uStU!?-1*z;kPrd4Yq!1)Z2*I!b6);Q z*Y<_x;f(QgD-okRyf4zqkxpUMhdDhW)`J*ZAx)=-tbOi?;UdiDI#6E6t&TA|tMW-> zw05Ot50rTt!}u45{}_zMWSfuF$!PM7(K6>qHhlGrhQy4~D3SR{c!*EPXn6lPj8>cr zfx=Dc5GcL0kh??#;uV|dWc_AlXZjR&a9ON{zk}(YWb8O9-lkP$Sp86uKc;1)5i$Vy zjTWvjc}!Pea#(+!o+=Qj(UOkf3-jKvUftA>2YC~cX^!7zG-S4SisfZT&xh}{l7&1% zfEXxy6_iy7;nfT}3*X7cSHyr=;X7OUDhE3pf{QhKEswUD;qFLugzsw1A9+b5#EMoh z-y<@t7^ohZI-#<;git~Uq^6QaO=g{FpFwMNly_3nYH}8e6@w#KL|&m8A*gHJe5V|z zUJzpV@RZvot6%*FG~xB8BGaD+>KDMklTWMAdVOU8V3z*8vbZcKL8IRyRk0hwKXa1GY}7RvI1n}%z~}Ra z7eAYE*}z03wB@vo2_++94)oS|2IPOE!&X$RKD}}#)f(WEve@s=_EObmLJFm&G2rI0QxM?@r7TdA+HF!5mOZtTVwdr8NjLp!? zP6XoU5Rx z$p;20);Yp>d!s_EOD9PoPvQR_UY$%IyZ+JA6pwaqa&{%z!^WYur#SR11p_)sA60mV zfMSo@L&&WI`gN4717^}uZ}AeCWKNn)dw6*$1L8%I3{g)TkvJ}U?@1dLXO5!G3{@z> zGkri-aWP>&@l-F45h7`uE1XobH%c3p!x%`O*jx#7Nuo}NbcUVMsla0n1}|cG)ZSd- zMJ`Dwn=2Yw!b}~InT9edxj0AF^O*QVV+63xQt%*^7loAjjpZA(ioz~4rPvArKZd^_ zOF3gEh}CdWioI<~iLz{|1u*Tse zu$iS|{T9s`IOBRxtKw7WV0A^1{Wypod*MhVzbFmPwR3{>FUv9iReJ*RnTNd#r9Pw| z%Y01|9g!%1%FqD*Aa@F80ciEpI`kM+Uln!rx{&o6_8yZ{>MG?v;1Zo924L~DgHvFf z)${sW)NA^H&y@EQe8~Uf^;GU)S*I^0TC&^J?)B~>+{nA{c_S8lBI}`!zJRbU0w|G4p*9$`^3(6mFMkUR$uuzWzJ__~d{xa z-wlruoH_=@1gHLQll<){j)?ol9j7SsrN^m$x0UUZTmL%vbvVQ?F3P7RAI8UN53xF8 z;T%R}#0=>0NI|gIz2XBnyN^A_!T*PYec0V_CjG8ts<|o%&Ip*=*rAZ>QoLuk2b>MU zRH?nb;Oxgf_2pH+rdg43ENWJbwz$FvX!gGce$+$;_(sqW<%7J{a`D&=fCfZGqJlQ` z9Z2x5y2tDERKo&2s_hhBeaUDGdDD_#7V7n`GvMr)4m}c)PWjm(_;*PdYa9{-8~Je zeQ-*XXZ`&$@73xJ^^gGc;Uhuy$Ngat1WERdxbNC`aQmKJm$~iJR~)DZ^`J)Hs_82a z%&G{(S-WQa`b`sSFI&5D{pAze*KgmncJ=BttM=@= zbb9;rHLG?^PEV{lFuh~d<$GsV?VY@A<@AAIDLBsu=QC)yx1+s@eOK;vm+d;RV|v%# zUHi80o1u)Tc(9nenqRSFa_|1heG~g;3?oelTM*on!Kfel7Ww9Vm<#8FPXgzUXW@*& zne#~Z9KU$9F8t;5=vm=HM*&u!o5 zE;(m<`Vz;uT{#gHpl>jvSG*`?&!W4`_xUrIZv=dD+J^b!EB9YKGuhJtQ{j0+jXu6spL>6nr~EqK=P-W1I=Od($6(*&z7@YQ zF+J%f_gto?-1NlMmAj@V4!BmyzKN?;(g?1O>cQ#MS@rw_6VnG)ZQnC-^~5#%C$HGK zi{jmr2Uo4!!B9-Dnx42~*MS)XPcpY_-(?e5uiP=c9THdWnp`n{`RWaqtyy#FrQ27p z9~)bJ`KqgS&8)Z-s4FJ+tr%OmdVJ+rr(}JQHh0se#zFnd)3@+^3g27?E}fj*Gh1#q z#$ImoIv)UjA>Vu)FWf(~YjWT0adel6KlwNg0H5+&k%8L|S+xUm9!aY-jp7(o6WNzT`kK$MY4Q6Zz^R-F19(8jMDx zc6$3&7ayG10S!C0@87;-*UU9;^5Deu<$ETt0{(;0HIMtP8GQ}tlMXCG1KC@%z#DVPx5G7;ZC3_|=pK)$_*A+WwF3DI}aZb6L2~t@8W*7Vj{Gz>7 zs0Zrr3EaiA?ux3BRi!Mivjteyy(p`b*9C3x5P0>umNMDjQ~BoOKFaelzNhhZ`n=pN z=Tcc-;jfmCj>L*ws11x{NKx6n=dQoZ|Z~zM^>yxgT3IwsvgY*!r>Yu?=Gz$2P4V zTaC$Hy>|7w)$3P}uimhFg z>(`F2-LQ7!+D+@m)~#N*X5HF#>(;GbH@tuO44BzIJ@w`1WynQ zuHCq9~!}P>%n|@@aNn|xQG9jKalVgKkcJ0b3MhgK8Ze^Eq>#I-j$b4 zTzcgd7jM7x(&>qV;k@wVzJWsAS6{TG@4mAa&kN@>e?*(Y7?U0+;kJRji{rj(^)(@8 zJsAz+zF{5;E2%fXxMgTxU);C3dPZRzhM`yp_&a#5WNB5fZ9rJc1Juee^bCMFd*%|NQ$hsc&FfWA6Aei4E zJ<_`Yr~y@|R-eveFuRBC-mSCtAz!_V=nFk;qc6yo9#uQzkFOeG?&5*)c)FQ$sH;zf zHnw8B3nkCo@+{`|D{>8N7`OGxA)tEiT2!aMKmw`eqy2TFB zB@o_W49eXS(c|SBgVA9ds$Q;ZZBgiLt6N`(wEvfqkZy&Ui`TQbS3L{mM~5=gS~W|X zD@18sSAMz8fF4<|N}D(TrI^qbmAM$u?!@Do;3t}*I)sY|Pls@oI?dFXa2IJ4S9@l2 zUYTZc%zhc?s~xtfD%(`choU#PO`W3G?*+HsCAjmv;Lgw0z$Pm{yA7)En$i}uneey< zdGX5d+yR-|<78@=beh^<@`(TZg1c?NL^o$pv0GM4?H-mTt38h+tMkH6^D>vr%pSU* zM`=0)rKd|!Dl3Ebd?rDu&X$~-mz>^N&6_*a*V0)_b~-NV@4R+@=dZ+tkvDZN0ymK3 zQev>hGsAJzkUlYEW;q#!+{t(x+v{Z(R&*HKikDd!;3>`cA_Zu5(-dSjD=f1w?_gd{ zn$ccdzstk!qWwe(8anSD~(VYW}>e#AIfEK4d0bt--Rg!47L? zp4Ng~Sr_KkY>^~TF4s^8tXaOJgz>3a^`}<5dx(Bf3(@9#Nh(@y3*S+l{ZDW3sqyEj z)$Z=>ER)h+6n1FFtQpsv6plP}n3NuGQYsyKdrbSP^-5o^Z2j$FX)giWLpR?qX9m12 z8Emg(7O0+I6fW#kibdT@anw*hRo->ZT^%g?d5uTA*FEjdw$_T$?)DPVY{F3;dE(ik zgS;nc(sD-TmYs>b#ZIH5(k8YlrD`u++a2o5v8WeEk^R*8|I})COa5GTWtKLyC)k#O zpEU`z`7zr^Z_Tb^!>oDrD6Tv)WjRyxp~?KQ?%^rs7XQgFC8`}#(jLvO8L-m_K8o_E zHX={0_Rr6?pU0D|nxER^oi<`h`RrWj;Mn8Fxw@Eml*c$r)aK{D+`uaAsv>QJZIvRH z)(T1;H3FF-@Z$W`f><3rWBrtgTJF+#x2Gl6?b1&1HczBC?*gWv4W@-nzZ{=#_ol-W zF|TEQF2e)4*V5_On6t8AmNMX4F3dffMIEdfngwSjY;m{B95)+=g;$Ge&g-z_(dnlh z-!Ai>-U;1K{fV94nwvGojeLwpIk%zpkNLUG2&6<)+wwsLI%R<(L$)Qrvc>o^GC3RBi)fr52cIk5jFq zw&Cw>fm^aQWxQ%qv9Qgm zvldHS7v&A*fEwtb*|n9qxK))HnW`S8n1VtzW%OHH6~5WwSqLr4hNgCb7S391G@dXk zzdBB1Cw8_DmycX7$0nn7s;6zLZRtwTg6Oc+X~pZYhfzZ(?O1@=v*2r-sRgIPpq?9 zm?+nbxnn5#2Sau|i3@>o}5QPS^4t@?#=8zNLT$L_Ur zakqV$t*l6;lyz1Yl{trGbPr>61$TxgMJB1K%S3&PqcbyNJfYG{4x zi0b-2SM!E7Dg@lR+Ay(fPo6f6eI43l8J$z7W!Sj2**s6f*dEn6)h}ySG@yDJV=`Tw zJ$YKknK_T9boT5CUxzxVC24BtNt<)VG;u-?a|$wX8a|pY26_A}Dj?1BPnex=GiEoz znG5h_rR2%DRyJI7I9F|TxAEz8t}PC#3fjD?+!yJd7)Am)wP zqGWDBHcVc&1koPVwp3Z^6LokFA(=Jmg`-Bb_`-#+Q@hU+$GnSP z9FG#0cAw_fdbamEwI&EY{*Ob|?3CHAeV0%E1}7Z-A+&^WgARml(v8pMd|9Ul+xbRs z(&eqXyn{>p_rU%!4`Gq;+D_`Q1|H_SIZNE>}psMsR&wmRT?%rA+gRti$vX>^6X;OqIMbujjtnD2rT$=H-@8R+*!OvEg`{r`;8M{47`G;0 zefq`Zi9Dh4TS0Ao`mQFol=NNCt)BF~+fqF}l$Mjqr%7F)W`fE$czlU(vHtw5ZuxU$ z24Vj$(m&H9pLrr{{y{;+!N9l4Eti59kV=AY=o+3&(Qt5>>&>J;#69|oF5lASd%FA! zm-xqAE&u@0E5!Pdz%zR~d>#r(={gm?l1uqTT;9ny40~?n7WBMXiJrG`je<%}CfZZF>r3RZ^APao z%&XCD{lpc6urHM6kxZ5;*&nI{B+Dz6tovmAy&ztv^t|v-;9gA>eL=|d@E{Km^8s$9 z-{xWzeTD}p`moA+eou*>Kja$q9N`)Vy}t`Kmn3_+8D9pIgFJqX!lZ62+6dpn;p8y6 zmne5AxrxX3Yczu7xAVtx(EFP_my^DaQqpgbj6!lNnG#HD*2Cnjq<)m8qU2qqD)fS~ zpjUw9BzZHp>q#T^y@Kw}nx`sdif-V|3yO-^B#sV=l9Wfb7*(-U<9Xg9E|`I!_x->Q zCCN4luTTeqL>yXzl+Z&l^S>*%9L#&Z)#&{`x1~wD!^3lO#98037M8#`VvptI7HX%W z1JhL6#6#~#to^>fq^E7ZJd+Y>0!`0PzDnXhaz?0RD5*W2v_>}QRcS|tu}Gy>_;m_l z`l-;-jr=^LEJOZcp9p$|yqwg2pSo@29T|pPrH1@E`U3JBk3xR0$H$0@xIdhQUE|k< zJ#Fkz8FV@`4rw^vcXxW0(TOd1E?K$bqem$bn?cr=*$ zU|^qYgZ=H%U@t*3^(np_uzJ$_Ixo;_JLEg7?fHT)Z$i#_%a@i?i+BpBGK3Vi0>DfqB(E$Pqbkk;U8c)UU8cCiFX!@EzTsz* z-vI{8|93w12c-BE^V-3m6b=;$m>GJ2gd`_1yaEZUfrE8}80U7$( zO!b{CQOHokDHwAmFMACKS90a=umtbr9{sg0f3M3obon-y_=jA&Q1@zqm!mFci5&IQ z4fUnu4hQexx((Ey;U4`^m$=5IqRV_P@j@;afT=aVt|CJpqx!Tgk)yuWQ1esjp#C^l zy^His?$JEna*CWTY;Fb7YA*45E*F5Qh59*U=wqmP4bwh3>OV5ncau9De1+?ug1X2? zYP3d|RF|!~Jey1WYh1cePm-aJp>Af09QBV4^{2=k4t~n@r=UKSS0|!h)#XxMuFz$g zOMEq#F4VV?(L#MomM8?@M4*yjTv{7`licCp1l}WBPgCdn_lc}hbQOu{S}w87$=PI@ z(0+qArkcDB6aH(M;0JTN9DIehLD^radi;h?=&ua$iWqZ68~T8tkF=nd@TB*+4ELvj zOcr!P9~Sf>NcFhS0Q&44`X7Kiop4(R9S&@(`Or3?D)f?h|rJ?<|8 z{jnT+=b|9^Jl{6%4+vWRnTLKoPc2INc!lF?zHR9H1pO!&J@f;e(0>Hv$wYqI(4P`? ze~vp!=~(d)mn12SQzRUvXOaE_ti=KN8`6uw9n#b2A_4E11Ndpw1OSk)0AD;)Z@Ptr ziJUt{1qsQRZe>h@gp9mJ)jUki=oT*VGiiDoSvF2Pq5kuHqqSif8Q99pc|87gcc1^J zvqt$i3^L#D8k%0){SJ!1361nQ=UeGMT7DVyWqtl%V5HB*cR)E{Im2dy6?4|yA?okZ z<+pVCFqh&Vb4e1bB9R4o@z0RvEK71pmb!isvJ$;OmzQuU?&30(lrG^W0fVB6{1Gb> zL<R;>;jDP#t3l~RG9M%d8(j@c%SrvuEESc;N&PfS#icEzdTBwBN$EUN zE=v_k&n2}sOBG8mB(>G2f}$FzmrJAEj6T?;RxEgC+RL&uc?wF6 zW?6p#ekRePTAr1q=CiDI+f z!Rv}PaWCG^rQFu3HVT=!-}K6LGcblCDG7mE3BeZBmXRujy;6@C@u*Mj4a!SuYhXp8 zTsxCnsa)I2Eh+a(ynYLj*QZy4_2WDtd-g27T&WWA?pN}JtkK>)A!BoQo)9~~m?y-} zUcC`31ZwB}JfU{po+YyR`eCsq{0^DJ!AZP2yNV86$US_C4M`Xt~uoQ z$k4~8rw?a|e0mxYt3$nuOEiXSll0}>qc`dD9$ntA%kOfD|Ac1tUh5E0vM8RC1 zB#;}Lgr_kz37YWa05_d$B|0cu5`AQAnQE`O`b-|6xVF7Xezd>M$=gx@E3I5>4A2sV;_9{1?5E^pN3c3tk| z62F^E7wV6Z(L(*vERmz0Fx2r$LVYIJ1EhCxkM7Xr9$kJ*myd9X|Ab2y>MxVgLj8p- zQ3w{r&>OtZP_J4l)H}I;nDiaoKbZu<_o)?qibVA1y8I=VSZ?EYct8Rk;1(obR3iB* z*C_c0SFjd-`{aOiaPfyEF9JRpF8&9PFVJJXSf+42HA7eI<8fywGKy#AkLBVv9w!7l zSo(b)|AlXKX6Zh1%74ryD4lUi5M0GK+R~95M6XuX>$vpf#3PHzU3ZWp`om9tmZs$2 z50evqvIwQ5YO7CG>hHl^{S23HCoGLb-k&V2<82QS7Kmymg=q-FwK|w`fIRCM%jrlJo zw*Y|QRxW;NK{bvEq#AxLJn%WVTM7q$s#`J;LtQ-?aNG!d-Db2GpUv%+pk<_+Jib|v zNicW|cYXSvPi7D9qZ7|3k@FV5VJP+#{u#u}c_6&r zf3Ic#H&Xeh^j@ACWb0Gzxre7h((@5+Q5f6?gOcEmvMBz2vWA22b3K9dlGA*R7jlcv zB@z9aE-%w%LYKW<;%mA5g$YX*tGz=-KjD(dM82QOP+Yw0MXQ3~HGFN(s9im#r<-V- zIir4kXKL`K&eYKBTB+h8@SO)fW{KfjEn7 zyqBD5h>3TG+SureZtHtTSF-=T?Ie}TYeAh6E2I#6COH|gLQ(xT>5MF;GqT>hvPG8V zwk{yir~ga9-Uk{}EX^-!~E6bpuTdoK82M z=X2t_v@@etI_bR#0Il@s>MVL6rk$7is>xmVcGIh2=%820V!emXF-Fr zC`%=!he_?pQiak#lRA{8ilu)grC|e0P*ek~pl;ff(Z|H2R>BHqL9M= zol2eXIge>nm>vbwDIQaD*IU7|X&oR-0WKM)lMNFjP0*9@6fp!MR;%hs2$o8rzj)WP zsrF4(U9NVl>WZvt-KwrsRmz6<3DGJIx(JM~R&q=Pf_F1`duPD=0*^Pj>xbaH2G1}Y zKQ5~gT(27Ahk;O2*IG)2)PIKP`YiRON2TvsKkvGU>hs0WGu2@5VO4mVM#C8NQ6-=L z-&8$_E}(wj*Qvj-qy8{;->v%3v{w4HwJ6Lv{`XP#Rh5U)zjBLyq|2jRil;Gf1UfXX z+5+T%@d8F5%X+rYQoEDnb|~LfB#ZCTScN96-=sNYIJ#N+x3u%6pXB>bU8#8kT!J62 z59VKvdg6cW;#MxrzaAb${DHg;Aow1aBr)mg!&75<@pbAE0pJdof{;*0DvU;5>lIl(f`NZ zdw@w*EDzs(!pu1{n`dWX7nWt0uq=7eB?%%3Dkvxz5e$d{6i^gY#Dt290mXo#qM#Ts zpqSBXz;s1LK}A4C!HiDXnGb-Nj}lm2b`?|b#|E4@f!nf%e1%BtHG)H++A7u#9*YGzCyJ6$SPVCQ z2-G_Ob7i&Yv5f>rUhO)PPcKY^V%_HvAuaK-Nd1-|dwa!yPJ))JVqXcP6z?XodwFFV zdDa8}Q=zpbC;lYcZo5(H05g&;Lq*}1Px5Kha}0AC4^wPlt{|`~(19xhK_z4FL%hwi zj!DudL=8LsxTpu%L$&1sZe0wr%}+$sCW5-6Hfd4uVSavVwU%8szcQ0ziUI;k3sOP& z!FtZ&kSm{LHR+D6X>STEpX?I|YO{o`oRh1oxKf%b_g$FHm12lI-9J{|=H>mcp1k>z zmzI#s`3Imnamk%8g8X=aNFwfwdRp5l(A+ECS}g+5@$Bs++C#m>RM2(x+*Jf;AxBbL zfdQtlfEH^V2JoA>8ZFgocxd_nX!2rhq|{|^GgTBI4G=SyM4rWyyl1Jr`D$ohWzOK4 zme&ZvO!wgyhSfyp6hv}X`#I#T3puPkc^1p@Ml*60!DOx~D+=P0;Wc5n#b=NOw>_+d zW{|ir+)rBY$!KEFW%OWC#)gy9*>Doh24BR}{8WM;CDQ zarUyF=rgqFIFXL(cDnYUjL7oI@0;?s#K!rVmi#xp_$VZFr?jylA`Ef1! zdZ?vpIbkY?6FZ)#V58w=GF$IX&`pBg66__xegxK01T*0X%b6@m9}(C=X1x~s1WIvV z;bWU=ch<3a_{}aEB$f@LzkK^t_ddznF%EQ$Mr?#p>LvAra;uaI(ao`Jh zzJbQalFNJ-#9S}IMhSkFU@L)@)vu1mEg+Z|64*gzt?|WB9ssn)?z1{J56Nhpy(Gj$ zLq1yLrcmYMxGxe5k2h}6s=f}1m+*Ti^)K+9d74K`aH0egB$!NKT}lvXw|NlcqucEk z9|^j|DlPhVsHLjQo=R;3Kbog`r3AM~aEAo<5m*ZeBBEb`5Q=`$M`CJ%O=+qqR}5Ud zmxvxh*a`d`o}K9`e~`<(2gH0pf`vI29irL|qj-h&VU#WU6pAC%;7* z?+x)I&8redd@rz{e9Vjw0&@(JL(2%GYsdTY(0VX|3U`#0lq_6iiuK%ECp``NvM8nE zn~BPcFg7UW3&fLe5Xh=AHUi#aJN^OnZQ${Wh2$+FHCzPOT%o#IC%`uc;0KH4He?p1gA{m(ib)E0icUeN%Y-Q=sTl-qI7!vU>_%}2--X;!;ris1y{Mt3pHxS>7(OCB zAY?WR3Yt=z#ssX}#Vfng(YW}j;t7b)L!nlb(Gctl4^uHo;>ObVei^xw;VFWqWee5d z)KzlS%Op8q;*<9nE$A4rKY7qYKII{AxabDo5cT^{{;rVZ6WdzL=3VKEu!-{W$@>X5 z$Ii>evK-!y(+1YEWqn;o_Mu)LmDdusd^@&>*C9odXSU_mzi3U4f}K$R9dgL0;3F89 zQepX|uEtK;(wDR4ZidRsCc#k!=aJzdpC@(&5vsd454mB9N~4I%i(7hqemiM;KFR%s z-zew}e!fKc6pBsKvJ+#>7o7;zbs7Y21J@dxb2J4p7gxzJVFY-c-<#z4Ek@kV-PEvD zeN4Cu11tw=Ikzw;u;fz<75&jCR273*mg1^2~7(oFc*L1lCjn7Wtx;E*VnieM6F#BN|}y>tJCI zc^eP&E&?lwzUbbX!bK@%%_Ad(5dnd5B-OrO68R)+a#ZcP;t(iYb zsJ^F2SPP*$$KwKw$&Qi!8YE+5Tzbw$J_P~0!kb9XShq%|jbATI;} z&V#9B?m-gsnC)2yghJ(_Ekf^x;t9PYL#Ui-y64efL!npHD^#>d%I`T`Cu;G@GQX1w zyoZ@>J6njq62zn?q6X8DLDI=YIY+REX_d02^zE_9DXZM8$@!h^^nnCf&0Gv`Q}NA4%dhfKDq6veaQVdlser0 zO7@z31R4!6a;e&n@L2G(c$)JicwB;~BzTs9C5QKMZ{(RxihL5uqlh_1R-lCL%o9lA9IvTj<}eH|>jZqht?t%!5X+UST?q$) zpTP4S##|m8=5-+E9TF^%;1LO)Ah4b#=qvpy*ifvNq>jUo8f2zyXHF+5`v8V91n!u1 z)p9i=6J4Q>%|!X{+DvqfIw=!frzVDIydCzIH@S{=)u-xEwk3u!8kOS%pr0vpwi0J( z_K{%m!I0%uFzoBq5w+~&pv&GL_VoUmtl4K_iFVix_V3iunl4M0%#S;mY;RL-`6QBu zQ5Ls;rtmN?BFL&CSGJw~Ftip;ntLUI;;>~l&#XL> zx$C{Hh}%isj65#Z#{v;{jtG!aZq_)9|OlT4tVV<*S(Fb#jeADyB+V?3l% zbvNNcjQx&gI1H|Q35tTiDkT;fm7O8TM-TXF9|;Ehty=VjP)pS_gc}h36;HFl;RG!u zXd^)f0&5q7i0A_#grfKLk(k;mCiYpYMc)avRIMef1kXA`sn01w#gW++#N1PYeI+E9;~a?49zOV$K{@w z_%!I(nvZL`T*U;PWxf=m@e#1CQkwpSx?0nh%ZgIPdpE$jcqy~Zhjfb8;b`b>Jo@{=)dL|C6Mp;rmrysG9BP4-0<6moCFOQ_0_ z6h8$zc~ru>YMoz%AqG_OD{E6W2PtyLOvN9oO_^eP!VI}Sr{Zsu(wqoJx!jyTB2Y`k zH<5t;lCW5LS+rvD5$Q0;40Az7jtfXQ%FD4dlEZDtX*UVXqs47?24fM!G5ln7ybdHM zrx4`3SuetqU4@nma+TW!Vh5T9Cy`_14gu@qV`lClUv2PMUc!HA+t!BqwqnBoJd0MX#~%BswCi%;iP8~$yzjyKxUE2 zJd^7Q-0g{wdTzl))aFB?T7;b|0;Cj~Ma;g4PVP;RZRd(Ux)BtgJgLJiP~?;Tn22Mi zcN(D|hs(oFkK$pwdE!A96V;!hu2S4*3<=v<2C-DR^z<0`4btQJER+`53ep)QX0?IHHn}LS}Ne2qe zFsJgk7uJ}yTuS|h=yyl|$E7;YiL{pq+>gkew(U2F%NufZz8=ckI2}7%xo@8$X0=y@ zsfpgFQ6r#ug(bUzq-5fYs%I#*7AW4?e7iiL@~y#hn14R)z`Hb6pU9J z?>9v@E1;8)*QmTO1H@VKsP;ydV3Bi2VscSwgFQDm>cM zZek|-EeA@zvnN%;zD>U5p6H|!FQH!ST=?3?j>N@phwqXat;EMC(VI(8S86IyazfI8 z+t`*pFJJ0Hx)%R8awz9PvDmzhtWGFcTkJ|K_AOA7pY2;LtxL(zmQt`-u~>{$u~>oJ z@LNW9^iU-Q*^N>GBCj^akyy}^DhaVvIL0K~YYst#;~)|XjwVM)PffYd23$Dit7bwUBGVJgZ*jneIYo3KC0?%Ze}#Ax#($=UMP}j>qUAGX9fU zqB#W-k#bTD&zl8=)!d=w0Z%LyAn>%4rIbk9BuxHi+h(Fy?LP(&G@-dSe`98A&e$tB z^#n?`WQk3+iMM1)`xjhCFaus~u|Klb_`0D+@)C5dSR zS8)d%QkzC=Q>h@%>zVQb($b&66%fnDGzb}xQ2rxn!KYvhmUYK#KqhMi=GDR}ZaV!b@^)(NTXS0LR1g<^ zH|Vm`n|btuMe94QTPlddQv4@rX@1>8?GHnsZx9!K`BgOU)40}vMqX*H{Yq<%hZeVB z;YPn8bVE?Hk(cxO1Sr}nT~{1J(N?*V1y-!3Y<)1PF|UqWbt}BHGdCkBS+~Nkg{dGe z8m%D>r8n`|H(>drSt^K2t@xt_VUe4cC&R*qQx*NuAQi-6DgS^pp6+^{X({gFKo*T2 z#9?UhrB@vPL!fSlC1~^@4og*I($ZA~55bU2VbUdoI1KIhbY7E3n(mFC-y zQV^B%BRL$&=4>W#_n>-qtqJTuA&N9=UP;oOxJ$!s;-1NoCHup&%fu?R)s@xA&Xe$d zLRL*KfvwvZ*oH>fl42v(Sc? zNl!e9dZME9j2l~{BEMFGww z#x(G-sN|Q-evk`j&D_QW4*||jmSnA6V&ydz!$a0KBlbK}bC(iyJs&J({fHOHVApLA zS%l}0@L0Tp;O;m|sq(F4czd+8W5urEM#TU^v*I8^yW%K9w_+S&e#IGtj;(2-GS1gl9dBqxe^se|)9^}}hpJs(ciBrgvub*y36aCDu zXrrIy6I{xV`jw@ ze$1};w;ywr+Y-Iln=GLNeU_y=%$8HJDQoA3M@qXTH)KoeC})5)Z<>yndjK(M?ASe) z^s%}|_sRJSJQm&fs@d%mIU5FI&FeH&bMdRO<{}B%aS9&+#9oWl;cKe-UW<8*%{nuF zrU9{@HIT`b_Q*;Viv4llw~M zuAFHhx7$2Jc1JkJN4RGT_foX;WLLqxH+i+6y$H@#5$?N%TegB8cPD)5?g4i`WgY|6 z>iw8-e-mml5pMPgp6nTLei7k*LAcGTK=!w263Q;Tgi{ZoR`zn?mMx*DiF~CflzlIp zu}d?#KM?Lwt$c3h*pvKT?u;YW>{NnxfMiSE8@9gr(MJgIv) zYXrToO*R+ibb`h9{csn;ovcZvf;dxbb|bwI5B;HPcIdfY-%j={qkU^TN1eW%?CI&z z?D_Lq>0W@~o)2k$=~7bp9C4xI#J&EP?74|#YPCPSw`zXrKSoZ-FFk2ne){XY3HVAN zUJ{=PPpwLMO+WLE_sTI%MSD4O2zqlx zdl`mc`jDogy?;idoX17{QUcSc?2FJ=x|?v+Z9fBXloZ2O&9Gkpo8)22l_aya-IXh; z83a8mX+dOmPhpAV+LgD8beX&DK>ABi>`?kj5A&q6OqJSdPoSk|5VUk{3o^UKCu-?` zZX>-}T1#)ORo~e|LgD%C>Ie@ATDTy{R&FT^OxvzJjNHEJv}u87oAWc}Uy~`H1?DC2 z)heGs(DEe}`H8-#@KqO}V6G*kFjsOg;*#&81v(V6y~(yK*M&ORe&bk085K->h*v=l z+TG5n^MQ)94UYLhr3jm?0kKQJPbAX?X<(7>VZ&fPa(QQD`$@lqAc## zBZ48bf|Od5t%4YDs8wS?z6Vy~W2U_hOn$yX+e8>~8L~9=hlwlPQBp(6!j(gJvmQWp zUmi#3es7;cbc{rCFawA;Jdi;AfMesRvO3XSj)I`OO95TwP{7>eW_B0Q;azIG3#fFL z9C2HESY%D7&fks@IcwKKykp6%12~CF8`?6lITs*CSL)q_Zl@(txZ-U!qJVy^ekV7BaJh>L^DWSL_ACyRRDWpR^K5Eqsr(&XbT z7A1Da2Zc(szi9hP$RfXv63vlvB6$NPg1D5>MwgK8#^dsU1to&GurHNg*c%BY#5(xE(Q|n25#8yND7?8e9`0 zQLoNpxR_6%bJA2w|L4aUpCsuuFN5U$QCd0Q?sXyypLRsuL?wK~0ke-G-a0AFe4J0{ z+}c-fA%d^|Mml@NMnNimBs5jqGh2D1jOKObR9%MG1JXHi?v%GLvq?JFh@(BIeSn~O zhL{=D9V%$Phw}c;5`EGI#t+Or;c7)kWGRj^xeRx2=iP*uoCR55ZL@6@p8#2W0;6yX zSnm^{{A`H{Yu8xb3o6JSqjD~X(_J7z#&MP$bjjWULtjObtiw4Ykdv*)=@1;`JqGoA zz#b;z!%?SSi>W5ZPvH$I(Ck~NqyqD+2U(x!5R}W^8V$pD|zVzG@CsW zOVA&yq)yFdORjbY6U@LRHXGEc{X(8}vZ~{t;UVmkdA45;5v2TVK{g6vUA0DC0@g0C z8MUL7W@Fp7FXvgvRSH!B5q`HlPd@FtkwBKE>N?5tEWuzX&Bk?ZFIS()vRo~LNS5sP zd3KP0?3zM~^Qo~@`&k~#3RMObmi#t6^(XxRo4fo9_&}Q#?UM@PNL-@c(mTKOS{_FQ zJO%rtf;c>@`Jp^tR4QGr)G&~ac*S4nL(Ogz^QQ04;#CkyyOPwbT{;!SF;Vr4r17j- z&XZ5N8+x5v?rYPebt;Hc64ySo(y5C`ZwYfp>#7%(?7o`ab{?ooTTESZP_qc6*`V&J zAWr5_RUwH56$A_Xia67al2m}evR-u}RX$;dAnt6Uk2l*&(24z8=@HTQs(Gcd6D&PK zI$)`&QhJ0|=0xw7(i_ZHxG65Nti+u_X{u3p|2Xc*deX z=h$W$h5M_2U3k4rl7q69``#(Epk29E3ZDtV$gg6#M`31#F1@ubxs``_C8uruzqPvB z-;gD&w!HR7VO?^)Op*hpM1u)R9So#8+LCWuk;%8w$={{;^QV5>z5&1736tf%Zp$jy z@LX5+85(QaixfW&%YVS@ZFX~yrtR(nau3x<3xV`C_Ic=?ucdo&SXx3m5y)+`9bQk9 zfR}DIY7D{dsMl<7f{THij}E4ayn6ajBT^fzcLNCXmn^S!KO)0ANQEbpAxCy@L53X3 zkk`DmB;-r0^J#Vt*i%9&7D~Wc?8*M?lK+EZl+%_n^yJfQXJVpU-qRV%Mj+343KQV7={YNg%ue^d{-1Q;Jxj6q-A_`&HjL( zYxWp56EkF;E@q%+X zhqh9LJ(sB1!*=aEf+&TQ*<&8>sq4V(yD)F}0n| zVewC<%&SI@ylK+TPf&du_1rpaH!lHfJ?e>T$VJ zt$k$q2!Z~ zc^Q%QTBdCxQ_>#%&t;lx$kUMqj9KL(Mox69kNwY8lWlwh^2x_MiO2<7W#DESuUCWi^3jdTx(0MNX&6#} z(j(94tx+67mL&EOEcFc{A2n$P*1R(2jlMFPQ?GZT2Vy!FZ<|%2uhTL6cvtsNcdlm9`-`Tr4MnaX0GH!6AD4!Z}*i(tTcVOAGEkLp^%kwmSd$t#tenmtU` zuzAhJDE4r1QF+a;61rZ+N?CfC@69SfK3(N!YBFU=K4-OO^|-7h@@@CuJWxk&8Qkxw zGY85u5=EWIdCI5Zr6SXay$1fIMEP_Rox86V4omHFr^s<)FL5%_WvnDqel9bwzxv^T zL$=pwC>#R=jusgly?u`DX6w2=&e&i)`gP+(EUxhQGR6)O-HS$&f=6s29??Gt0IfQT zW&#y|*}gyRCpR`^o0@n`(^54!So*rq%a0e{$GpSh?VKVg_urK4x8#@9txikId?g?E zxmvbu8{FMmo7$n>HbTy6;0rNWvHE2lv@Kf==c@9F9YSRIi9Rw3#%Vs%Q%*FJa(bH7 z?aN)&0X?Yo)dh*s7e~AVA zL#KE}_mH79&&zAic_3XoJMkVt);8gL1l6NC-FSbRLKia-t@LjuNxQMEf4iJVZ+vcN zgwZJOKs-vSGrWAZUGJ-y4EsAyl~nrQFCZ*mMOOY4z2s0`vr#jkP4{WPXNRtN9#A?Jy7TFZ&mUzq7py!!dbpZRlek zOfyuFaJO8WM;oirhx)RVazBH;USHMYSybI%>Xx(T$nU6WJ>^a{H?>8>f`+7u%c5JU z;u^Co6(DTdH>)0`797yQV`1=mH-?2p5X~}{)B?G8=0eRA7P&GUAh7(V=8`I(g7Nh5 z4zTqG;qGxN6(F!pH7+HU$TVXnk@T?zwY+j`IKn!GM9q3Rk%D}sVP{OvL*GUA!4dfbO^8-O|S z4fdRK>E1Y~b~5xEeJ8zn*GFXFx5wmY*l0_WR5tO?iL+#=7V|dRavs>O%V3iv&9=2P z{YeE!R^ZYyjkZ>&f;gL}nx9GI+0AH1qDpmz?O#NY*i+iB(N>X|Zc&Yy0|~#DX*Q8Y z&Yo>a<5}H>ClUt0b~h0uWXsB{(XUdw^a-RMLQ->*8vRzD3gR3pE>;(inC|OyN(FKDo>e7G3k8#D zg@D-fXEPDum`P$m8RZFw=<9U0sx^loBBO&SBQ***c6?6SF-N~+zFkitZO)}ae7b&VWDe)r>A?HWN!ytB zRh1o+{FlB#{pApkv6EKweWhG?%3sVrFr_)?etm)84B&l;1xa>-SGiPLy?2@u(*^#~Bz zxAqMXVLK^6gl$rQ$OJw$K)!+P;Q$cbt-i$X3t1?+=2<2<*2AhA4Q4N`f*6T#o{S2rdPjv|&9*;vWEUv-~DQS*-~! z1e|P;s+$dUEFhdM<{D}w;II-fAG!fyj}zF>5a=2dnT9>%W`3Rg7N}LWVV`gt-JPYi zeW+#FzYu9E`ku{KtIHN}8h$^>lDc_bf0T*oG4k|4z#U}u_|hJ{*HE+X138kE_ntJ=tN#KS3v%#N zhU)XQpYqhJhPvc6kbR`k*9~>%8z4`?_RBIuy|^4iTH)C@4RzUDAVcb^lPMr3d!l3v zTgw~C{Z6*k&HPVKuZHotrgvPtfv(i6w8AN5HzK?_;P$h2g&X$?Vi3RR zpZubc<`o?f9IvD%?x<~wz9X~f=j~=Hs~kgABeYku3MWUrGM@?&kQK{whD`DZvSYUQ zHgerU3@998$5^$^4B;&BO&u4WRIIDp-Z!l#46`cuHtuy^E?H~Y#j&Q&%YGhP2n}L= z9l3lXa&8$LU>Q>cqJV_vLhLUiemMUdGkA$p7e5gl?whe;s+pnMgN)7YXEJ9gEp zWh-|V-&{Nte?(d01O#o1nphWi;^Vbdr?1lO;)T8tj(SwD)>ZC`%vvqvJC<2e%nWJQ z4ppH<-69kbO4J0A7;53ObWz#mei8Xn#7?c_d--}62;Qf{ndJ8kt+(`za=&kgwY|O( zALr+pOx3KtE0L_s%WW9dWs&r3&lsh*Ef@BMPBTN7O?xvmR(~L69 zW@D>L0`q3zbmq%_Zsi9y0lSFV_fov!_ki6CWT&6m-)!>PcHYXjfdS2SWz0~U0L}JD z+)x+rqmK6F&F`E@Z4oqIL3YL%j*uTnV<9u?RSFDu`&^@U_^9PH!8EP3|?@RX8clgG=3FOcDhI;01QltXq_Zwto?)t=R@*9K3}27u19k;TrGXF%=~ zt3Ah(>v@pB)*zCnenlf%XWAoLpGeAHOKEsOS3A-rmcL=BSuDHkWGrgksI<-R(7Y>Q zlaZ6DfwkBBhU&k@P`#6e^&-#LKOo+{&QKZokfnBgm?1lr28n341nN$YFn$k4a742c zAG6eIK&NCDX@9_Yzx!EIjzU`bVoPlR>|Q1g;H7&R(8~zyl?21@BeFMwe`f%n@1njS z6UP{83!ss#_h=hH5VC&Ohn>W?1iS4HZHQsLx2K`n?L~agNSsyMK5z~sVJyqjTq64m z@_F2_H|=MrT?YHej1h)<2e2DEhTWf$IUUeQL_qljLmdN%0CU9@M1Mq}m0&R1*IZ$! z)qrF)8{SAoD+uh)1hQkY_owd4{`o=tjP%+9%KG(TL-nBNY9#%vp$-HDF<*PZP`R@H zz=zUXl{x3kv9|gMuouUiQYIfsEWzX3|BkhD^L#>~5Q>d*<+k=IdX>2%*4X*lpZ9g1 z6|n;M6n|l=Cz7;NjR;4Z!p6z9j?5VFM=qF0*lAmm(Mh@R9$NQo~*F9AeI zqAx-=vl6u5jTI%F3wa^IL}h<&bWgl{HaEjSl1t2Dw_(N-J#nSciy{+KD6Y3~ucoNg zcY2j(VWsRcBs+tB_4KmfgIJN1M!MKVYx9%Q-T9mn0)j53MTWk9Db94iQrZw}DCsl5 zBu$W#5>qCyz7$11iSTQ4{#WSadGmWdsFm2^9ZN-19@A&5%Z zNna%)Bz`TI@C??8^QE{?d3EtE3+N?+oM-`94aeCP&c5)9Tpejgy2<0Ifwfe(F^x4Vg*ixFGdsS22R`;BLr=c--mf} zh2V*Cr_%sZ6iub5WP8(unZXf!R=&!rMx9qLroYV@T ziDdaUR^;C4+b$fAm3Mg@dQ8hma;Eyl=>Gl#3Lb=l)u>_HX0L=ghYgXhVDe$4jSvOB zk>tqB8YxcO?|X{-)9>S&p!@i~lsrj{4ST5`#fD3bMv* zp3{ZH8n+xoz9FF!d(f@QLG3CtCn0x#dkgX}t1MBBp~nlt!aMQ9A@ng2J%HAZ!Qvp^ z07~39RVh`W89OD)uz4|vUQPc=u4)jynpTP7sM}u{pR)3jEfGISkZxv6@_VjxA=cNf zbGLD}x)ZSfj5)XXHq>s=innpE@(J3^;yM#|A#A<~OUHXAc4n|I2GP3CWFV~u@pYBK zzR_d+2Ls)0Mo~p^Z=hER5)5>?QWp;NDT0IpeU``P4fKURUp)g|zU>?ibonxKIMC&_ zN;uGqLH-*9U7w&7$7=_=-q>XhbRk3rx)A)K^a#e6j;g&pzxo~ybUiLg5c{_V`g6Y6 zB1*DL;$8HtR85WTvbZ-Z^%o?Vl}31mshyQ%AZN}>lZ3l8UOOw%73$1NF`+bz|I=AX z_seoh3T7ou(DPq^`g&-qN>~>AK15qQ;WTk~_I-#pUP64xL4F>Y3+z_pdEL*WJ(J|= z?dQ>+LGoy)I7=#A826mw!oXJI6qoq6(oS(5h~JX;`U6Wl#WwLiZa~mZu}!=z^k>?3 z9g!{mY_rG?{8@erucv5#Rt4g>LDZjih?j&8PS>=3yw<^Kf;QJkzv_DNvNJ62`Bm5D zOVtPYRrd*)OPr#Z_(w5UXS#|w#@;9rI>yl;p<|pONZ=Uf3xZ>Ge|p#xB4;$aylY|* z?J4!^+rU$<6Pbah%tzDEQ}zZ4J>__i3{N@NWAr@bB9PEiE(gi*lxn2tfj`KLbQ67goXWtDvWW#gZD-cC{e2)4)a%6I3q06-ZDyxziF>Zahd> zxw#-2m0RvHdX9MOX$<- z`GOq4!c9)6mk1J^POk&em6g-!%^+T7!^3D-O8CpuX?eZtoldv%JEk-UrL_&$Sz7M{ zV>#hEOH18R_xnCNOMlnX81A=e6Tfz4x(dlX| zi)5Lus)Zq#uKI&WD|yRrkf4Qv<-hL!W7w$%>v6pvIe|TAupZY0JzWJ;&o5%jlVSzh zmXoBoz?O4C!l`G8Ac6VT3Gx?H&t?%5c<17FAb~ym3li8%HpP>8OUNLFIYfPo& z#{uozW2w+}!=~&TV{Nu|-QLFFON(?lQ~42}Kjb9*{w^{1YhQR$G7pGVYF|D}Ljs^+sISVAio=ZGN&zG+Q3GKNVB*UKha^oSeXKz7v z(3c0^RWByQmv5=-%kACY=DihQ@61~L{1t}!1hDS~>B)5D|-oUQLp>*oL7na&4T7Z&nT&7fHt3+9wu6 zSS|4eW+JB;*3BSJX``&GNhoHy;WR0AYRDiZ_l9ORG#eyZLFh)Jd7;rX$v>#6!63H0 zdv|icgqIUO{(RhM?c`7L2*nV10h8-)$@U0&5WIK#%Hd^<&NWMN6`Q%vzCJ;Y8O+zs z7KtWPIdPU!WC;k*iOKoI_H`KzFS;EgG_jc;5zlAvWes+?V^-B5%&O=*bi zCVslC3eDSENVsYaH}0PQj<1hyq|#s=vAtb!PA-hHD{jHtCb_w0ykjNKuHqP!hBw}|^4xv>J|a~$ z;;|0S6rb?8M`)cj5yEQNJ9lrCHJbQFiN9Q&Gn}|f!*zbYBx~^l92QIbgVL{ibW)MC%a^eFs z2$kO_;>Tv(*K;!##bQk%V1h065dsTcA zv!t)lm%AT>lY5%>sFIF-wb{ab)o&bL?eN;xY@rfg(agPtcZ^Y#;N`d)D!i86I(aBX zj~C=ttAq24-y1HMjJH_L6UUJ{O;V>?Ir;LZNTMa9SMk$b0cs2Sb-c6t%$;7kR1HE- zaus^am)zgRo2sN-`dcj6g;t})1O%`4kQ{fTFIXB-OR7Vta9{I9i@ij2m<5GJe3AR9 zUuV4;kn&W*W=7j6Wz6FRjkKtXX7)pNsczD8LH@UD(uDjkX*W^p5j&Omo(c^W}pe31GM==7`h#ln4~U3(Tst^Ai7pZm4a zU2qOp6z2G~(uB;DDj`Hps)XRLox_7EZHrqdDL9zY1byna)GvvS$>6jrm!mk~N<$?v{u$za}4k}$|8PWfZamYU%W%SSUSc9pA z-0&SNrDoZU6LPzEv>=%`d&N55;ww=mM<9}(V>fmi`NDMXTgx4R8?nq>N&N)>)fQG6 z3TdA9IxEKwPLZ`CU-b>SNZ4P^aA;bX((Y=tq~Sj5_inn~a6$YaFZnhK|7*TOb5k0r zHDutOlH#4pB~?V%vFcx#S@%yVD{&Xq>?Q)1Qman>d!20QFVao{L3`$};}z}?zQ5Ei zKwPnKjPMjFaAmPS%ogl%+c(WkE z&Mu!>J!4~B1sZPT`U?_l}6M1vq z4a8e?>Nn@|P2_MRH$@Qtl}TcM`o=;be8#Ns1ZG_>$SS)$>!5wO4k5^dQl~$0=}8nH zo#-_obD|eQ=0vaYjESBSYA5=EU?Nse?5F0$d-*LHO!Qw< z>@)$tDTvGp^52-m+KUjhO&GwA+-MPkbW<6dj*QKKpf`pxJ_CZceUR%iLec$RcENIG zCLrkTgAD$F;BOxsxe_BZ-KROFaphW!5VV`q1Kc_FL61}{+TgF8kr{+tme{qgdZhxp zjI~RX1MkC^V6$D0xAErk2`7>)DrJ9L-$c?)44pZV=+^TllEISpA50{pg+G``rg%v0 zM6%;EvYu*Y1%(GwO)wFu@V%H`kl^k0%(77UGiMfm-l&~fbmMMsW(nsW%^@rCV0O_u z%j^P2q4Wj~CzPQe;e;|CBx6FECXB(!;37f13B_IJcS>!tm-X`I1@@Keg{82~naawE%YHQ>`_*oOFok8wUR8c) zh3P9x_Nk*Ko-uVHecP!k3!=@`wa@U3u{W@tTRyfH*HhPyOm5i&{SllkQa^1R4;+*X zMEkQ;=$|y6;h!{~>7O)#Q{vD`XhNowutlW53LvU-+N1Fls?1STcA>Am=)v(KVd7`1 zKZ|7DG%}qo1hMCF^G~MIC4$HtBUgmhfyf-AuLx}h@vaCt!K|o<-|Z+D%!-{*XF=;_@ntH(A zL8fmq9XPLgoi>>cT$CC*yf%w}`)PvTaC(&AVYWuTa#qptMKnE58Shyg6CX|F+yQO7 z=bMS-F4%Ykh`zJCmv3;4Z*NNh#Hg&;PUauZ!pZV3q1 zD$6+*#nyp%N+HT_#@hdMz}PEc*tef&sjYx<5tsD8y4zCy?*VDYw>;k=((Yc6LYuS0 z*ZLB?Nnn3KAZLQzk1!yOU(A7Ix9g$rMj*G`IY6Oh%s%%*+mAr=<{`b!0jA&KN250bkZ=bo=xcu{4p*_9IBc%E+~yhE_}3skb0O3KHa z`z*nH0_y>SZ-EqFs?Lm8F6V#Jfz;=QJ)P$&iJwND{v@*dn;;GNrcq{&1)p<10HnT) z(laDw^4pVt;2SqU>Jp@G{mD>!{tPnNFmlhL7VA(`SH9h;wmJhywKtsHUi1bMr<0iK zU=%xpZ}13Gt<<$fx!X5`(DHSINoU2Q96pgpdVXq_QRr-Xq?XWatL?gcJf=o9VjodXEgjNspGki%oqTE=6%v+4M?oT(fx9v`2 zOCh%yg>GZ2R|Fwn2y={FrO69259sami|lXlFEuNi2n#)CB7 zzT-eseF3B%$Kvimrh4@NkP~UgJq|I|bRad~upZ{Ah7vz78qaL&%y>QRYyG$A^_7*W zXJ%QM@yxuL@g3pGggF zI4&2i;n9JWX@Jc5jwqYKugv$KVXRer!MFlazu=zik>BvT5J(l8M(#cIz_s+i;I-hY ziTp>k49WKl_r9Byl62jPKQS7(_x9npTOsHn`5A7id?4dZ`ux{MPGTs?Vvx$DkB*3jN(PARG@tb{i>bsO<4LsyoG58Kz-Q z`T$q@C|K_Eot63+Cft@a=XUJ#huEmpb6YD(yj~OyIT#!5?v3heL?Et<#`rw^d=t zzEhdmiwW`x>@>lCK;d`Hz!BsaCKj1o3NM%6Ss?P6Ag}S7d(&I&dfx`QjQRY?6&MpJ z+{HEQM~VC_NL${TN2ER3$xuH6g+mcgKU*Zv5%|y>0IgdDIc9*VW&^s=RYcNzgY1n4 z2jgF_0(72>@u}ih3v;R54@A1*aSI26w8g24V=cUy)j$M^Xb`E~;PXs%DNy(WRcL;` zsg48+x!4=6X(XkbZ#~J>U3e-+j7W>v;2-CSh>jE*sZS)OehnfikvtJaBX+A_gF|jL z)f}MkyShCjk|!cMk`k#xB&A|4t$iV)Z^vmz6pd6NB03_ie&k<=S!y#-cwXIs5y^AC zKZg|FLjy-rBG!o@XP@OwB89RpjpV5xS(9z6206AWEXRoTO7oV-_8AQ5k7Q8u_vU{K zSjd3?i@( zAy@>IoWwV|_1@4vXAM&oQ1TiB_j^_ZLqGJ9DdmRx0?;XYeQc=v0gXKNxuu$XVR^{0 z``KzKASp_(DeRKo{B9IbA|ux7!#CT3k|#jaxrQ15=#+1X>^#Lw@oPJGhN)HpC94c; z*$hj?uA&s;PyE3S6p(oGPfJx6YaV6Zb1lEj^$3Bk)@Z5LW7U}87FM0*N0H%OuAS*$ z$Fe(uJ}9K0gftap>?;T?6Wu>0Bb(@JFmXR@FdnF!=&g{f^FTfq!dAn&q>^7W04g^| z;`TZgoV~thI$^T z&S&o4(weWsw*jdj| zvvRCQXyp-7&MO%NeF;YXk4Unl;Shp*?m-?w7N?qHqt8(g5Dd;-BuhvLF2TrFw&ZQQ zAiM-4gzyrKpaFd|zD~-}PU!@ywQ{S`O&(5E&d1 zq!0e(G@$x?8BY3|UV~D8Cl09Y!*c!5GD|%R2%^lN7`5gf1h(AIJO-#vo8ma`xPxFq z2NEtO*Z@?!+M~Sr3AB|2sZXIb$ujKyzU24V06`G86tCQuw0k7|e$u}t?Eo%23Bt~! z68F}C;9Q_O#$x83YE$*im5FSLXCb%IXqNq=7}uo!1(zAPT`O@h8JDOK}1_1ZBc z<8Ey_ql<1i!B&?r{nd0%I4}6EENAL9T@sC)U-t4kh9-QGXzLv9&*9Rc^c?=xuC>Fa zP|x9{m}j%wv8NI|3e@ywo6wglkCT9!Qf8)E*O=;Epk@UN$E7Tfe*$Jy17l)i7O zAwbPq@rjwz9{G*K%-7I(G4A@gEL;5o)a*=Kny){{{xFM^$&+YUeT+9`jIAC7YHrDL zMh)SwN=V#|#F{x-38(5#k05TXrcW&8o}NKydYs93b2~$+&L+8UtUB=4rGlbZ0!)dI?fbk+(bYHes!$5F7}F!<`EEmN6V81cVVzj&n9yet-}Y zjw78?*W@rRBy`}eo%_l#eg_j4(Gr%{%IQg_=A8Jk;u6JD&MpIL35Ay@67h~19L>8n zbej2ixyX3kNhDrEvk_FKaJrRBECQJXl4@ZTxc7mGaM3w+y3yEeeFGOkAxQZUDtWjA zkk{8|DtyB!b`FNH4+LG0WlmrBEyRQbU5{zhW3Vr$aG5jMeGuCo06{DWf%PDt+{0P= z?L#E+sZY^*jkqdXGb_uPNDE5(-lW&ukd><~5fYl%32ljh5LzN21eOrIIU+(!%*eFF z{7g#-s~q8kmKY16t|g{G(@h*$Vj6^qB|<`IiRr$a&=NBs$hZqFq0Fb{ct;#{<^b-% zdRq_R_6cWs<^b-HD0OUq5iWviWB^}EyNHCiNR~x-KYtOf3E=>4Gl>Cw!PTZZdj(_m zRauOF3ubR7*hfb0G$Hj^2Wbz2XMvi@;#IYe+w_g4etUot=Ri{Cxr{<{*e8bPhWU8$v||Zw1a|*`_4t$P4YeK+gug~bxOp;X7MJqb&%miV@KlNde$yI)Ktd#q2>WvoevJ? za1_u;M4gC$`tw8tM3DOPL_|jlE#Xq-_;>tjZ`j3DyYim|x<1uxF3$%vasv(iClD`V z&Wz-#KPAEzL3S|DpZA+;-+O!wA_7i-$y8U)@>3#6{cMqxe~d(`5V2_ewvMp!XoXC(jJj857FYty>Gh)&wD)MB!i>zZ%RS(a4at?5cr^S17SL%h5QXk%)jx_cYYod-y5!OZz)1_G$cx8be#F6Deo% z?R*d9EWgkQTcisAxX_5``lbCHwuiRh2DefLX@#AB=a(&kiZwLbSBg_}!}L<>XN%;C zutfya&lXAf$4I18)Q|LGSj*7X)sC9t z9^tL4!t;*ct3@Fp_-au|2)pQP5;kvqn zOMF7#Aj_*hp;bV5x-Q{8*5Oi0Iy(4+AF_N>UTgqxn5$k?Fw^sI@(q% z05~0Igja)hfi7z|dS8VL30L`q7I3u7H*?~zmNKdHDS^qwOO`Q+GlJq0NKYvT#%JuNHV*vi)e?w!~eXfwwu`%%K9WFmFiF z!qTq5Y!Yw9k}V)~C@FFpW#FZ=xytgS-$Ih3^gSctrbpD~&_9Sq0v|i^9os-aFAyt! zRO$mj+cGj=MvzHq4mJT{(^gJVOwcyFAH%C^K&-q|l~-s1>B5||=TW@ar5hPfHO%hk zC(4e>cq%vkvaj+Fw6yV5!Z`q5siWZf$nXR|gAhbo;t&W`B5fMK19voHdJ8f;UKu|G zMDm`*(|oxo-YAiQe_WFojp>KNtiR}b)+tQjAo^p{3onK&ON`Nt>oP_Ffz3Q{b{+kBy}6?#;I=x+@t`hfM9 zq?JaCL=DIYNxIr7Omv;Z)?E<3y^`dc8fpfJ|IHN{HS;CyS|cY%e*R-Ih(3CCW>c0_ zo8G`n3!}=p+b5)jAYUl%HS!+zlkO^I(wB&hmxV(9X*3hXtg(A`x|{SdkvDQXG0&C^7@AnR><7XmH%Fybr zDhqpw#-FOz+E>FKYTq9u)P4j=sQo06TJ4qdm~Z%j6k%KzZ{Q5U@KP3ZWlyskIv->F zfFQRHvuARU5)kyw!^Cwo!VD>Ln!R)QC0FsD?mDiZ2QyLVPJ@{!Bm^^2NC;-4kdWzt z>pyB%&Jmf~UxN1E*46&Dy4pMQ{4Uf?YJ3SbnC$l$DP7kfm|R13{y(e|I><-=5h(s7 zbYC|fYpaz24kq=lI@8Wq(AylR)65E9?3ir`?41Zs1v<*j!(V!Md)$t)@*Lyu7B!OQ zh-*v_|vmFIGrr4~P^fc8}KqD;%vn~WQ5@E}m z&$$7hQ`S~+m$R9*EgMaCF9+^9O*}7eA3|iAkLYz&n+%(E8i)PHjqO_LeQ^#c&dVDXsL1{ z!6Y>Ac;Yf1B%zE1JzvOpn9q39h>V5BKB8A-OJJ3`DEzYbN(j<5!+{YHg7;k8be^7c zj!V1_qK#Be?m#8cCLtQE&eULIrUp{4hz3H4Xb=#54eTe&_|u)H88dOWj1uohlj2d{ zOl)Hi$=r%`-8w(*?GeI7-sJfnfjP`uio}1;XCXHuw^=z+o71KosV#WwT8Z$x=#}*L6_6rC>`*AESHld$}t&|#V ztLXscI%iReqz?*g7A(K}283Yw9TI}&cS!jE!}8mn%3HNZ0IP(THuttR)LVc)Ecv00 zcc`I}we7t_4UMFDx6>WaNM!YRAEz5~!l6^n_7D5?@^gxR*tgALrM-iB_L^s?aex+Z zfPbi=%Xt;#dq5+Ra<(imRM-C7ONr?A%G3Pm(_Y(S+d%=5LL&z0&-?zz06keJjorH^o2fh+Qp{&5zr~uU1_Q> z0gaU1!TC3!k@_`o7n|xnK(jS|&QxOojYQO`U%>qDOm*r;KacahsSX9U6%aZ1bAK|` z9l-yf+qb5rF10L=?Rz49Z6Ar~c5JStE(5fAN9SAWNYe4HZ?E*{P59pL1h?GqA zQ|j04!YeIxAD{&!_-f3xfG#J}<0D99VAMb6BEu{q;L8s!mABScG}5M>*I8;fpsVmS zk-LOVj(jJ6#D8l5TDM4^Z$IXrdOq<}rV=^lQy-~cTC49Zbp@cM)%--EfG($g;)-A$T(ZyDK0h(>E?zTD+&}^^oVyhnkof66OQBPYr zyZR}&^|RG0fX*{&kgam}1!1|O^#3xNJI`gu*PFl|NH7m@pW@x!4kE{J=Kn9iT|=G^ z3psJ;phP1P0p~K6$aLb$9}#^`M5Z8()SuGu07IP!XmzR&G1SF?Ms`1)uZaO#K%|^U zIMtVveVwv{0_s;MQcgsJ`nBFcwuo*KX%PYS>lR6g*kJfgrdj~F^2d_Rn{&;Cb;-7- zisXqPtyg*#GVB{!%P$2q+lTk??@afCh_vZXvPb|l5=pt8Wx%U|7O;ZJek-7nNICx)iPWcl zX{kI*^#HV@yK(Y28qi22B_g2yl>3;p-U4)e&YEJWI{+>1NoJ%^0F6{KH4Ox|t@cu8 zqn`oI7O`8zqLIp-#!N8>(0OW@4~79+bcF2)CWk|rLv%{@XOv4bUm$ITgMe&?)Kb3^f>talOTU`g;CX3(#x@{||fL0bWJX z^*>v3cQ^Nj8%Pfc2_U@%5D1_UP%xlUMJX1dfGDUaC|D2>k)jj@5oy5+SP&Ey3kpgT z8!8HRR8&+%EGUYv{(ryO+0AY+%IoW^-}C>z`#iIE&Y3f3X3m^BGdpc}Xre2eBumNG zMR&M_r6Ajc6#_jMz)^Tl3WbD#ZOwEMYp&unf#(7Odywm!;CY?^i?9rHIlJK`>-1xh z4x9|B-X14+;1aGzXa9APE*f=EWLY?$*$eJ)1|hQjIOI^TyCR!>y)HJxC3M36NykHr^wz2)2CA~V`5RbyibhPI91R9(SSpd&=0xZH^tqt)ZT*B#y^Fv$g z**r#tjBJO2BHZC*p*T&83~?cxWH1$;O$4TZTdbcUI>AW>TLu^+aykGCq|X_Km<=a^ zodgo68HAX#zz}`mq(no&p2Z+5MaWA?bOAg&2vG3rZo|$ixWj>v zT7Iz_UzmFsWKl3UalIj~g_9Y5<5>)eHz;7rCPQq1ld3FULjMOR$;QC5ngEsj{MQU| z2b>If{c}T9{sI8o&s+N-s;>Z0yu;zSmjJ(*oOcLgT{ua02%h7yi!%Y&WSR?MNZx=; zSOj1{Mwty$0Fc|LTvM!olOfmDFvT-)GNib^DXxK&AvFq2aVDG$Sq^jY5u6N3#2BwL zoD6xW$P{0~$&hKCO|c1%A-LRi3#>vu9^>H>@F_<*U&q-Vxra1iv?*$z2I3aF45)$t zZ?bMM!ZyMoOz0gpAjYB=IPu;Rg?q^YYkA6J$EAj7Ks^~{1I3NVW($B4H4rGZ!Hrw! z0&z^{Xu-tUlC0Od3HCmnWy&G#K&+>DTYU@&QQgk1YmZF zDmQ@_r{YVR(-hf(r&XyK@e>O2-3SeoTKLKDa+`@In;OhG}4v51XKi zLvYS&+>J0|9hzm{Q5e5atn#C{atrlC9_oCZoi2}Pnq5~3u>dad7L06aJ&f0KI0?Lp zjdAawcxvhm&y{oUMuRaDNSh?dZPiE&Hv! zRh($W<*7Ji`Z`T~2zPj{-@qWC!66kA(RDEZPLhQ}LO{i2w@%Ww^(};0FBVI2Vgy=79O5JX7AKR zGAfHg7+u2<-@(Bz^eSh7G8+$-uE41Y+%*-&V?JC<`L3U!1Lce`#3Hys=(_aNM*=eh zkIYfPe1X#7{uu2j0fRM zI2N@BznJChG8G~lSW% zj`wo2u$L)5go{o|Iim$O&IW?^0ey6D88i+-`GKI`K;P;HEh!hY6zDHykUE>v25*j+ z!9}0ajB)tiME`r5(GMqzZiXZN0sOb1|2>FFzGA)UQCh;08 zh?c-U2LTk6N2lcZ|5TPX7RYzQX^7hR86i(s#nLeIqo1}Gs1iID!Nrb&nMi#KhuGj^ zMKmCPPl(WOVWxROoAD?fEJCHV$lm3ffSHJgkGY30uq@cIfr8ls+!JG!*2YGnj0}z= zxYASUvGEFq9*9coa*@hN6z(t%gUdKfFUMj2VH{Q?4{}pWFc0@!51B137k72JxW>IV z8h%-XJ`h=v`!23R?&Or+fI0WS8vZKdDp76p5S2)B!w3Sj_|R3$s|g5rLXgwtZ} z6vIVbrmCw9{UH}EI~R(|&A$Wq0Zd8+(Ig8g}}yMLE(d{5ND-j;VyaHDX8 zW%4)2S@!WRj4<~^-yF!9bt)0+M4uEJE7@zx7a(^JyE(L}=!{?^oH@jOn$Y^SaDd8o zL(7sqjX2h+Zpmt(yo{Ho;#u>mySe3r2pL&l)ha`z4Nq`l4HvsnSSK0Pu~kP2xf?u^ ze=YFltP7%Bt!uck>mX3F`$qAnG}4CX+19;5Lm30H5?As}(4%+{yg2cMK%3O$=gHdDK$Om>E&yd3#uK1+-a{47 zg3dAJSU*+YGXtjvOGQ!-2P8A}3dpkhyQH;Y zCn%yKkJRjpyG3Tefstk|x!MqW;0OqP36$=za(4%(TU~C4W%w!JRZZaoK!`1^WLu== zW&0Ue$pdh)yCWABxwYShSy}2>E01?!?oQ6$5y`Oc|H?(MVdQQ$9BcjUZsu#ch*WE} zLa@Sfvdy?PCx~cc#_cy%oYN2~z zKXR3-CT`qgHSK@Rt(DGzSxxeMIpYv<)NPu3zT89j=gU2WcfOo(HN^1Gm#>Tf@J`xq z0pOpsCn@FOpD!nZN)bG1Pn@(@-uZGO7z<~`-IMk{!arY54Egxy%ZZ>>EIVH=MLF9O zWw$fXx57bttKMBEx+4^2bSgx-3nil%gZm+~-@@0!|CjEE#EBBv3HQwU_3uIU??XPX zYQ~xPe@*#o?Gj=>9PxYcU-E(LUy1)(AG-cg`2Xy1zcN9=9_R&B;J;Xj&%`FpaVt@F zKsy}QTm@-QJ<}AE;Xr%iAJJ|HUBX$CcF`Zv_5$5Rmv;Fd(Y^?}UtHRU%hTS4ZNS0& zo`wbODR9W|deAc1E1OXk2Gjmk6D+X&h{wqV=nc={K)&@>^cRBwO4KBxc+=Ej!=&Zs zn=Z-ij%Ckv1!$wecIM6JpwZirbZnGjH6GUo7USm;gyw>vo}BWH7mBR_tgHUjYS zWKNlfJp*1oUIF0eqvALfhPc;j7+#8zofex(5XyjB>Z zR+n-xrNe7M@{1tGa{+LUC;tWjtKs>Tz^ee7Vz!4DhUC`)a1{Vf|KyJZ@Ekm;0|9&o zVBZUdU#V)cWNmG%SJyE_txVK&44#t+bOCULA)k`IF5C^};{-#XW7>K=Y&^_39=+gF zxldq!9UK6ttBKUv04~^zRb05#Hkj@my$^O3P6AK2!wf%M>S&asF09}nI0?jhVqpwU zGWZUjV|yv!u|B%^2~IM&{cK&l50|YV@i#4F+3en@x?SpV*l5qFhDagc4a1uy{0K36S;P_33xCU;FVEK1$gVouMN6lBT zrT-|+*z_uPMPbv-Oswox#eaYLqo9Tn=CboQ$&z z-Ax+$8Ob^XgyMvNiW!8+Lco6<=LlsGA`9gp1cb7)G45_qmC^|T$EKmC;BrQx<%Af7 z$eyffh_B(KL_=hubV4B^Syv2%YC8mM{u(_coUFN(-?@85Wf49DQ0;)qPQ@Wd$RH%q zP!2-McZ6i2lD5Z2Q*JhuxgG=0{RF7WAyHLKc7)vi2{NG{WYbM}9v_#1%lQ&Rr63^m zV}Uk1;W3rrtzmQ@g6CTTSpYQLYS0NzhRlcOEdmVrGeC&-5dy(<)Ge6yi@2o)E@yWH zCe6V#u(X|eCHRbNJjTH_y&dTH@m?k;9{4_tDLhg7`A}0Ff1W9tz7!pgNu~TK?jCzJ zDOv(fh4kOvEc#B4E_%Shy8m@#BD{|@kRYA#Z-05pDaDliJSJgVN7?mM5`abO+=L8aZBc1(ex@MN z!X1*s+(ad!zLf;L^8hBgRw7O#JE2bEwIJ96Kz^mlc{301bPRG58aS7%0Cfz&U1r_H zfdDcA)ITPM?ftve>IP@U8Z9;J**gLV_uCEQ5P_x1A<4aFO?!F(A-M?aNj2rh+#$(Y z_KnC5BN5?!+ZkScST=_5qwshTu4xO+sFsT%3S866HRD?RKSMv(8iO=D>R|6tUEnup zM(cXm;sn=pafk-2pQw#@noW3UAkXQ5so5AjCwM^hCovp=lOZ9XZ5CDw;bce<0Mi*S z;V~Nza{(SN!R5V#rnLi}DlY^0JfgYXc@01p6SEw)I|MXqs<{ydmk&wXZiw^X@}7VV zx&of91bA?H;2VZm1DAI@#zQaCvjc9GhWEW-KGX}=XV1Ak{0%38KyM6Evke|2;cjRS z6vq6oqXZN2SPxfY1a3n7;$)nh?WTzu+jzl!4;r8WJy0-gj>cJ z1IWh3ynlvU#c}R<4+k~i$XdvY$MyH#M&*5shp`urhVKYbXR~Hl`IQm5h{As~g196aRQdLn4Ox%J|KrnmyGZg-*Q{T9K?2((K;aJSHF zfxu{p$GLFW&MQrMkXs1|-LP2C<*sSrL|NUR5`@uZw-DFDdGT~)8C`%;`XnN`0gEZG;*_I*83CgZQFa-DKcC*s%bs_?fRFI*7w{4P zKin^Xx>#957hk|Zg^Ux9#v2zL{b#ku{vSB{GcPbiZ#eot9D}bNU=tJl{kLLM2^{=F zKkqfKwbVcld^cR(s!%O?WvV&mby#K?^ST9Yt6GTbarJv{MtggVkGYy?TOEDGkF^ZZ zy*6GFHo0W-M*nxdfKq>iN7i2S-P>cD-Vh$M5RZ|>^v7G|h-#Wx30Hp<%wENSgQ?^$ zaP?0uPZr`9A`69l(g7E#V~kb*QY2b&$e$q#Cc>OmQb%{pktFdv%~sW6*9Sa61ID6HWr5e1r;;f!HUL1G0-2HwH~0jTViDNv`1c z!;;HPxaLV3GAU<6?!gX8{UJX1l`~^4d?(_%q+=SB!=WLV7x@(r!#EdH;&5lBYC*q> zRdOMAgu-h|4RMyt)db9gySw*_w&`LM+=wxnu@3Vw zoiS}QVhCcjd;=`n<8d?Gh*Ox84jqtTxgo6+e6PV>*#Ld}`i_R^aU6hVv?rAT8EJUP z@N}n!AQ|2cTA4fO(so__;h|2f*_%ioCu#;~o1l za?pGqhSMG4dl7ENStOMk5l_MFlSE-B3TUMblexVe)-3OGO|;pGwlM5@?23RR0LeXv zS}8!-Mus=XnD%>waZ@G%p)*h;hsc;gQ*TfKq;3SZXm67pq1W>56 zQ2qK)Jj{#nSP56s2`au7aiiw}$cy9CsORfqC|pSbfbTEH=GsdDyy9qj{Bp$3!NaVM z$8@+7tl5~+-ne)JjsVhl`ASf6kEi)Me8*e`s`_yTaEqatH&z!{!j(jUGY7w>i#y>; z8e>m#f7JS|a3$j*=d|N-0vE1iE>alV2|GXGN>X6ChMa&(ya*5TQas*;E6Jr+nk~9u z!V^wLIrAi3N&&}=o7H<5;vBe=iAcumiOE{HlEIZUojX&_cl)3|PX%UJCCGjhd~W`) zgzqEbX8<1-nK17drHhZ?O6nwQdL9~!8>b0tk<8mn3IG^9&r$~yqQRd5$I)pY%J5JvF00`8&~Af%GYjkU6C zesMh#=+F+U0Vq-77qCS~2H>tWsJD4E9=F03z7NCYt{3e@b#;N=C_EnTg{ua`oDVU6 z12}oOA)bPhWT#zfh%Imu2!+^7Q8{ojBw-l_?Qjx!8H;j7j(IqMmFWW1@{f27Z3^PI znKilaHu*F|d;(WE99atjLLYPnlx$^R*kmOK7(a|*Ob6}KFQ72@VNEU_?*WDJ1WoS_ zkJ%fKtBB!DeF#`t8K2{TE9{049n;JW;0^~uaVjSJGa>&eYhh0IO7|lszCu73lh@f@5CX@vJgS#E}e7=%LpW1vFT`gAJ8JUq6*6^?|NG=r(>^Y28@ zaVH+H!WDj1E;vLhbiNGg8}CJ%Sp#4DGcYqS1co#OJXV+(+mYZHeso|YJlVcebXb1sBgh8sJZZCC&CH3Y~-XKg$Bh$tTX zmPGrbX#(VzULP;P9`3UZaTOOLTbyHv>);5eZl@Izoe6hURk_Mt(gs3`@*JZ5SQSw46fT^@CpK0+-CRzJo+|6I9AL<05bCw_vD;(Gr0G|!x)Ok190cB z)r{r0=wct-`Fjux|83^Mp9eXvT>z#F0idi3Vdb>9y0tggg2;*fezg0od7O}M-t!5UKZVKV@OMyWm%KY z;-#y83q#-wAgB=Ttud}@iLn%@u6S2QC}@HR>9-=0JUqDkKDnB%84m(rijy%P(sRBc zSHUNLNGAMJh1q1WA--Q|h{<;x@Rs^);iJW{NRzb1`zI49~~#O}~&2Zm~DU z;=%0~aWqKz-JlNnHs3!N%ry`m+NyCle{_b$j2DrP!_4hYHZlB{JdEE{fnfnG| z(hGfEyin8hqv1(!jmI!zhU4|@8{DkGQFeR=fYVARJsH zkZ@p)pc2Cea&8O1$bJ1>F2wd;xsyTm%MZB`5f5@jJ2+HeaS$%QCAqwPYWW#B9{mYS`7wYmVJMD84Dq39k4~ zbM?e1eG8&Xd;sFZW@)xVvd0v(h%ZB~L(TsP+oa7lNiG@W!glGL1k8R)Vwsce?8nH^ zp5rQQ^gYNZ9{{J*8>_6#vb5K1s~N5sAtNFRJ4KQrOBDin7h{{&x2p!=t8xrSM2=S& zE(45ho*p|jKrxnQn1plO6mUb5@nWsAQvjd`fR=A*IZiHsp#TP*WL9;4m@LG20#D&Y zL}LKVNdXw(#Ae*utq^RWEzi|z#d@CWQpAX8m?|s>%ov4vZF!!SY41l-Jp_0(U>7tI z>$yy0pH?U7n+aH$1>jVPBMQvu9Azk&>v&hlV?qFtP+~h)+tn^hQY2hv*R<|Yi4sAH z#pVSNt&)l6FR>pgWDC+lg*0>Z;Y?2-QlSecP#>Nv(}%u@6W{uu>H|9-S09ET`CUwY zEA-)K=!3Xf>BBD&QYHZEL$N9y>oVRqpbtbyefZmaf2Ms zG|(WUY>@K+pgOJCHEzXI^_;J@EW0x5nwlUHA8O18e}1E78xA#EB0`N;B7%*Uh)|;? zqO8%{<56i$lBaD@am_^f$}2I61{Xiy)@1L0sjEZ@rPHB6k5P$!avY9!SE3y8Lr#Vq z^=={Hk9q<4qh9-#vQckc`2A6DF#&JXJCuML^-iH*je3{C?~i)70Qeh6y-|*O_b@X{ za}qh?74t%)-9(OdGl7#MUFY^MU#y z(lQc0EpS;)ceGufn05)7R#xpYM4GNSkz zmxDy$q!9smmx zWkHqzKp`A{RCXQwEI_mg0(JpF=A9bw3yi7!<87G)yyI;J07A#xn3>S=Hif7SykAO{ z9Cg3E>>+|JJ(C1z>6X{hB?67c=GT`QgBs6< z^B=Z~sLaW4w+j0?Rj;Waig!l6$~l3KfV_z&zJ2(1GKXYAJ82LhCmb@FWit@*Waz^< z>crBh45N+pm`(%!X@)%zHBYXDbEa_djyxW98K$Mo@py1CE&f#$C?3o+pT|<3MC~$w z;&~s*^gJ*{W7bReFLUp-h+n3=S9)*?P_}n&o|h!W%N5BLy5AF|A%6Tyy{=zEiTLdj zTDQU8v6LI#NR{oUSGkCzfH?jUJsp3T&Krfb9P?^CxTq5!!)eO*iTWH5Ik)yK=BVpo zlI>hhv~2@08lFc8+z4PZJYQj1Dt>4Akkgvuu2H!7b-H^uz?&$VC(<1#UD`bm<1MJUzo2^pcC9E)wk5)Wsw&SnpmF*i9LW*#^UdQz4Wo;m@e0RSAxodZ7wNej+_ob@aQ z>OKMkIs43h0mOK%B?yIlYgj{muj|P%zBPDJ@a7QdKiP#L64CPHI+5Fl1mFu=*rWQE z!A*8+oa~Scx48^+%QF<#VpSe;jPKAJ+0)bzLn7|dI|!@28mF+SqLjy4(^M{qNc`S# zVqQUr7<6WLJgs{b-y0ceJ}#|TqY&20?CFu zoV^AEAK89tLAyT3WO4ja-Jei{qG3>^XW2a;bJMRx#A$ljR7zVSf-`LOfRNKn_8=8U zO7AR8!gW%GkcdI$5$EU$!uf0)MwqO!$MJ={?*WKu03t@d^AqYKlfXW`rgH{36#(EX zWTNp3hL&zfXSdP^GRS-P976!_o+2?BgtJKat&RzkU!lIs2qhYIq9Y*sEdZdt&RF>O z&=1vhwn23TYR-Y$CJyU|JP=SSE1X=gEC43HR!_3;P}QhWCMiam6GdNH%+PcsaVz@D zfsCx)T*uHa`$|+m$SPcjTDXrjalJAGM}ebf2>PR%Mz=-aLEXs!|5@aJNN*UOhHS5N z`CGTZ&(^~slWc+Ssum~_Y=L7?6rVyB$Fe57$kr^tA-$%xTOk-NGzG)AbvXqyLe(kD zET>>rzv}WJ0z7&k1I*?&X7gWq?IdP%kDE#>1p;#B~yvG zL9Yh9`3*Pz6+r~0P?JC}jYmwPl$uf>o z%UN=D=0gDHUJoM;Jont_Y+dG^cpSSMncK(6tO)Z)JS6H6Q0}d1=98#C*_cjZf5tUR z*;$>(?6W_+9knQza2gx-wMvAQS>{$oD|Km=-@{>n*Nya@7pa+HRYJc_$w_P6+-MT+ z@@6Jx97&gl0gmeP4l?cLMrHejRW4tz&vWL!j-VUd4$xVP+Q_6ui2;o-MJRyB9t_gc3%nlp6z8V!ccVPvLhBV zB#u#jReVC=a{?0o@vVjoYxC-!*+DiS*saqR)6Vs&6nWINmo{o-AL z@%s&@E$U+>(^-pj9)db;anq6WjJxP})roWmN%tUxNV?3KGCz{8kbX&*xC27!3o!nW z63_?&&sHR$DGYsGcLlTrz!3|G1B^9{y~U{E4=!ZYU~u7ZaIuS_7+5$QSlF}N_L{^& zMF9Y}ty(M>H7beKw!vr;Vc9$cY z9U_f*)U>`<>KJ3r)67(RcL0$vRgVjMbYB5+1;hX?H=sOE}t!Ac2*FgtH0PxJ}6#8Y|Th&#jY9JD5lWcFa zATxyp8*6reyBr+s3!3n1W@qr~jntMfwd!Wg=u;Cg2j!+_Jr6&NNGl@8Fh3~ulL)r* zoB9PPytfGQ+eLmg&03P5xKZZb=f~WI_(?>NpG0_LqW6`^>KNcz*G#Zp4Ir@N(y{uf zcPmnq%&8Q&HYy5>h_=a5YfTXG4we`S6au#r$a=84DjpK?CKe1FAo7v(l2*x?&etF> zBru~=o^v;Z+JnHbN;U26DxTE*16nid_SLRTYO+#N^)^<&8t&vJ5rr2-lB_G#aupG2 z%@e9eP7fejFR;UI|N?d3hxwlvg5xGNbA!nT7LOTE^9{36JZ) zQxiT{nb$|kxc-HCeYA}0f0WnQGfD@lLMrhm3w=0?@X{hY%YJ&SHpbZ3^kdh6hwM6j zMQGS1Q!(uhZYrxIHIXW%bRLskM)~#^uQlBo9@ribC%)Hu0$Xz>WT{w zG~q=6xcK0&q!1A*G!el<6Al%ch+v_qQla@(iNO4-UuX_vezVYay<1(iF-S35tBt?^ zNDAZ=x_6J-RCe#4)ZNd4!nj2%eHw~u@z59rlMHOUUqalft6t|M;=71rW!7>1W%MfYH5*%wy5W&k)YpG=_MoHu4sGC*uAcB{prk>!YN+TsNM}52~fbcFyMWDrf zY0Tfv0A&8WO)71O2<}l!Bcg%{Rd0{liKGecQELH&yGPBguJRw)g$Z8Q0v|5=Y_^nkT-)jAy zsrD_iY{0?0KqVryda6i{bdA_I)yE@;AyZ96sL(_N3r#pwXd;4zu1bPnp(Wx^o9cf@ z3aSe$lL9rAmiaJy54`+IyK=i{SN6iD)Vd#bWn+T%y|OEnKo{SXkY}B)?21ItW;auI zMIvakvy@#SLfY(Cm0ght+U#SMU6Bad><^S(A%Zr$ZF#%$YEcDt<*bQr0P-&4FC^5C zd_18Hf!8-{XAs7eiDjzyd&ZE{CZ+uXG1Lo?%>{9`T!VaHPQdm@l_gqBARMO{h#+%7Ys4_Lhz=4c~@P7-Z5K0X=8-*v8|pCnQ;86@o=dIm^nibr@Pw zNQ7*i&-D*r&a&#+i-)-gmO5o1ZjbS=ATA=?H^7$rGRTF9P&*^y-)mTsIHlAyFsF)1N(XnnK!u^B`UC zW#ed=0G@7&pBHiFJc`*rD*O47hE6ZE_~e^}xaxrJIK0@fE`YS2X5HvykQD*Q*w?_> za3UsDJgQXyMgYhN+X*Sr1^|`-sB*d^&or!||L;4~VCSl~!*-DMZUV>8 z@~3}_gInoe;~`fp)~Vwv?GY#kU#ETvNqOG}$OSgOK3aC8J`tgB14zr}-l(r1HwcGs zsNB$TcUtdNh*~D|dBigIx|+`z@h>9T)_LVEZu{~Uw|04p`+j+g+oin4-B-@y_BkQY zMu#OfvX4{dKsMvxD47Lk=Cj=VIld4iA}9nRLPB6SuRbdv^m7MdQ^YoiLh9Ix2=+sq zI2fuA7tg`*tQJG@31K)1Y#WXbOX751yd94F&|^B7zm^(&f`*t2#~5N8T>Mmo(_@}@ zg$f^taCs(Gio7kdAZJov#7+$<@?BBOniVM02dGA`j8#A#6OQJWk%&-56A>ySI}ERk zLjM;UvfR@_Ir3F zt18j~&AMo{TY{sQKTLo*lb|DFJtlInSKE1J3a0A;q#ZD;CvoF;0RVUZr}OexSj7Rz z`7LKHfbj%2V87p0L7q1saKsUYGCH>b;?gKyaz~X<80KW)JCk;2>q3(@ZcfDtlfAJpS;gKEeEN) z5%>WX`O%dvMF{;HKe{4sPmsHj%=I4$*#whsLUSF}4L5dRu_KvZ3|-b8-(bQ8Hpxpg zH{aL0`8G;Negg&et~X+DlN`L>s16WE_Qe=9GPVb_B-Nb9y8=uer&;sAbtet-$bO=B zRAfW|(fbuA(gEkl8M_(?dM|V$)f%}lZC&xKj97=#GGo}KQ7W*)IjSp`jE)1tXVPX!PuC)$;S{V&B)W^6vjlktvj z64e=JzE;_~DXn zXiIz30yoq~XrB|bCeBY|;6t|h6l*n|=^)Jnz*lwqHAUK+q{Uhh{_L}q*h~OO4bu{S z31t2jVW3?dxnTwrO)a~zLa<_?+V!lq3PHUEqFLf}4W866-E&z-=`&5-d$lt{NG(+o)F$rjjyVQxNw;(TMLM+SIq3#{iDhdb)Lig)Xyin z2)>DBy=GR9eGx#Y%g(G%6<-obX&*@}&KOTN`R8e+R^XNaaPAZxKMOsNdYiilm0v3)PgEJX@&=v#&aFWg%k7)@2=!0PT z9+>OaXJgdXDQD`L$S*IYlKGtioXl_gaVozrMCQzM={q4T`6b7p6*~xS+%N2#B$SgT z$+v23Btfet;eb^mtTwU2Cx^juoME(YhuiLVBc-=BH%obj%F+@qOWPBlL=lpU-0a78 z!ERC3(onx$Kk}u5w}Wx=+s&=Fe{#cL224{OW!F-G*vW6V^?MfP$M0E+5$N|U0|A73 zmM$c9dzM&(fZUVc?uQ+i&mn7L5QUPBS*puOM3m$Y8YYz>a2^7aKTMMTmGplC3$OP? zk7^9SV>Vp!FPfQ*{_+I4!8!OgR${vgu&NL0YPTBc_K5&k zX-rdnD9h;$)8O>;9T>wCbj@* zaH1ZuCaHpPQK7+VEzd7I5pKcY!O!ZeQZEFMJP2LjUZlqC5FricjSA5ah=$2}QejvyxV+_K~ip8vWh){OW=EB(_!plzN^ZUyLQLjOky)yvUAFU@Lw;w>v z2QRz}Eoy%QOH$NaT=O zSmZ=_B8T_?G=RoZ{-g%LqPu2)CTf2ZHDHY9%s}6?3zAK~Tst~C2*5!AUPqOTq4^PZ zR92xflB@(UYi`}CMyYK4@~!3c_GOJAMa@6y*BoOCb0!|LJ9rRANa!7(#)EIn#>w!_ zf~)+nmh~pyK4!vIhBaeDS>+Z-E2ZU<7Hj;SW%{}V{*b;_2YFCm3H$oG2GqZ+uiMDZ z)7L!&psx{HEM|opg`u++t(FJ>zPb2a-Hq^@BjjU~Z>`FaLS?%p+%(O8DFD~+uU7#X ze#Y`UaQzWn<=XE3#&1EGX!1tstPS`EWHCgShTHytybE%wuB<%$%E}kOf8;VN26aU; zvuNd60vb-r&7!6E5kc8WQyY-oADi0Wl^q2UX{x)4{Q{tJ4M+CE16j}}36XinyJ47u zA#6n#xmwBIJNuJJb^DivWr)+LEx({#4DvUdTDPFy3q1#OP=e3ctS79_YT zcR8ijFx~EZi>qNZ0iSZMo*8-a5f_1`DJpkNixsG86vBo3vFo>d4B$o8r%%I#Aw1qB zbcc<&kruA<-LbWg;l%*KI)W?Tp8!uf&fd89jn$x!*4C&4-*UKS*|_Dv*cZXGnm~0;=f5$yv5Jd@3~8=8 zGw0=W29^dQzu@j_S_BRpnl(&_d>w#K{NAx9fXE9!v67Y?X@eF_M2ry{^^8qYuKc$@+^uA635ne5(FHm*c7_TUP*qwfZOfF@tPdP2A` z$qA)hHyneIaP{Zq(20Q`-Ma{ifaZmSJmG)6dZ(U^#Au-rtqX?a?}sd=kUfFSKM-LdW}PcbHdNc)%RSdUC8$@P$(or*z^j>+0KA&n0>57~y9jtSbC7_lndGJLtD30`zh5&& z0RD-ZsZ_3J2#0Fswu@Y;(YBB4(9*f01T)~sY-kQDf^exn?+tzvgkp$e=TPdVBU|XPtx)dH-ndbAF|Qks4lD|q`|ssz@#Q)Rja2O z>9A8ZyK0r}6v)S`O}VlKG3^4weDG*DAl+$x87h?gE;REKx1c0_0m!$#uatmO!Aedt zIYpoy@6skFzK-A}9_@#U7W$)ThofTGk@f;ypfUt9-bG-rS>1UYGCl|(af@CpY2X>C ziu)nsL-`mr{sdKHW}$)jIHy_NY6)5oLHgL>0c8jo2b99u9>W4JxU_DrCs}7G)uA}e zVR{Q|mr@-fr0V>va!Z6;Y4!);z=T+5<^|a2=-H465hL`Z-&*_;RvgvHXqljb;mEhf z9P1)zp($?5Te2Yn6pbveyCg!IK+nMW2+zRz2+zQI2!BVQ1s+unYPCbT4Ou*9KVb2M zZ;jItFs`_!#lD>-ARMyDjQO|s?-5U2Onux*cxgY=&7PkdPg*|0la`P0q~#-mRr!0u zk?STo6vpL99fNnh^dr1w@!f7*Rd-W|9NJItLSMx2gJ-?RT^7qxif|(HJvtjtz0#Lz zxKbaG_d;~iW>ZXpo0<@r3Wa52Gb^j|bSBbxA8y)#$j^9XU^+jZU-k+|@02P-DU!Lr-I2!}Rs z5)s_MnNI?2ly-P$P!V$LU$WH~z&~`Bh4S;yvgkiTH0CdO6m2xbw8wR9IO`7I3_=$e zn!LG3PMYSzV97bOA6Y%9^Jyu%QE zsZI`}%2TP;#sv`E{qm)5->+UsT@%l{(c;FEz@@B$7gtO z{$pA?^h0jeTa3Dr+Hl$yQ|v(Sv{c<1ve?ZD*?=_D8hKqA0^j4QW6hmhhLG3oSpCZo z>bjj5ut$*PNkS6fk{)?1fVlo>$5{$^1WJGXyBa>|sSHaUqyKdr4*WNC(^^H2#iThC$wRd1XQx`Z0l3Z4MkV|8)hqIUOz_S`wiFj&X8R0W)SMoJmsjA=l zOoRtpAM@QZ(E13g*5~tNoS98C{tS=Uq<}WeY*v;}jw)srR`q!jKEiw@k>?l)W@hUY zKaY}MQQn{CH;eo_)Qa7x^2;_qvvD%2vj^&B8A3;#o9#4%T5W-!gBE8(1}?q_P`4?T zZo5OrY*ZL@wTaUaKwSWN-(nf^bO2N`<}h!AR%oB65OE^5Xie=!3c(hWw^^$jrr4+z z055+Qm7cuL19<%hTE4INGz(OGi;7Q*-Yz03Lgn`mUIQown@|JD1$D3i5DqnfBqIKu z1~3pwcnx3-{AyGUHvGx2UC9n*Ar#K*_P4-_$Udck+o#MzylG9)nyK6?33z?VHUR(q zK82RCqCRDhn}Z|hQ;x735wI+NHTPaF@z zs9Dds`&6*%gjuV&mhN-{kO`pwM7^q02%vz#5`2h42T)9ab6BtR!R1{9FbnxB7>%JH zb69t`NB050KZmspz~4ECwVGkk%(tTk3h%h0o~Lskd$ zPm9$**A0vykZt8vgt0~}!q|KH(U1U)9$=YDlHsZch;E&aS5opDP{mmb|3Uckr|ap7 zI{?(}44|W)0eaZJ4OlrLd+s|yeW<%egEjXAYHrY(sJVR8*@2qti}-2PQF9NWN=5+4 zNJY(^1z-w*{uiR=dI4BMfHhYMz#0Oqxpz@>+X$fMV#w7V`cZQaqUOX2ftt$%@OReS z!{usj#!^?z>Bv`E&3zNBxrZmz$${<5L3zs$mHxO0`xSxYdzwKFf2Y=eI1grsd*nkGy6_20MGp04h zO>TbzaKG+oz6&-y6_!>6Hh%&T^0RE|y}^RrN*X>0F7zvKADMYA9=xR}tr-rdRS3A3 zmzke<#A_J;;ZxN~vf+@O*K<8{ttk?q-f3~&N~-NPgpLSLOV%4izJXz3%OE0SO?B(z z0G!gzOtPj!XGzc!1Su(Iy2ag*L~z2Y%0<}Q7$t<`u4F?@U0H)LA0Y4eys55L#F7D#WDkc}HtW`T>e7g=2v6IBxg+oTZHWk8zfDB&Br@U93pNqK z7wnoO@LsUjK)U`5_BH^a7wklkhHkMoTtsdB9d>xwKa!ll1cC>%B_eb%n|wfW_>pAb z`E$Pjcp*LmsL=#I1-%Ob?rAY8z)GO@1o$%qIQ=>Z@GaBc4UZ8TH$jl{mF zl(*s1mV)Pz0Ybm;7gY2Fe8!Du)6#mFs6lx%*XdZG-3pg>6m|XW5qRx84(qi%x|Q}F z&Tdu+xE~cYmw3cKlcoHK+x(>}{-tC&e;HWbiN_T;f#qzN43wiWOo-l$4><_nPU5Uq z0NH9Y@)7G00OMCY3O4{#su|~;qKk!a8INjNPoYKr#8&yB7NQB#SLA;Zhf;YkHRF;{ zTsckjJhCR|w}!oLie+#aE28i8gegTnG9GZO8eQBbN1ZzQXk71l2h1vKNNNX<7>?@@ zK)74Hl7=k8^svjp-3b6Letok|geIDT?VuQhp>{w-h3#M-((v2CN&x>8+JSyDMs8+r zJUE2Qs00Hu8qI;Df{YYR%c?U_7X#rk-qDQC&`w#!Uusz=qcftyWbD@D)MK!XtVYfJ zz}nd*H&%=Yh?ActlbGKlI?=uU(Gy7z+25shH`o9(RJxptC>ac`y;`=0RGPL z#F2fHOe!oazOPBv8>Z+4m$4`E8pcgj%OV74e3oi`5`g;`8IHYD>8$~R{tb;}|FHV8 zL^Q%je7wWzM1)k3h@c8`ND;aeLL!2fLP!hzTZh#V^S^6>x#3@G&kIOOPFpSC?!Itl z)DBEs^R33SzftIwG(yKmN>sPbH|>m0`H?i$`X!7T9p)+_Mi4IdcaBtzUn120PFOg( zNoEa(B*rs%ka^}6uyF5Ri)}L-t}{dg+hsCaYesMU-$;K4gl>n@W!(ix(oY43XJ}=m zcXJD)mEM5brZvwzBlg`bZjIMO*vaRkZNq z;L3Zr#<}Q>^wra_RPZDoSsU;$ug672Deey2ZeHOo#s;w1QRQSD6qi{#0p;HccTGmD zYI$*?t9>77)WE~2hsVORbup)|X3YQ45FfzJX{Q;F2&_yz13cuiPB%rwFvXnKva@t* zq54~9U{hIJJjTFvX{h~G{%SN7eRSDAw9*|YLG(>ibUDU|-FcgH(y z`1l-aRREUz@sA(vMj(OQk6-8FGKAWXA9b+BdIXfaOZUo=#cBey5+W4e+`#Io7!Xb< zjX3tviUFIPTzu`I5Hwsa$E16~WC|D--`p&kR-lU|(qAw7;A=SB4gU$F94ilJkXgQk}0QqWIU; z*m8_uya?)iE#^`NVAJn52n|qMWsuL@L9(TZ=0m{7^bCECI?nagw%r@iJZ9zmE zGj6}D*1bH0mYTAv3IJmxXtQkSWu;4zPm7nUJZAraZSRF%Ct0OTgg z8X7=^mXt|Bgu_MB0$OGQTp%r0fWMTS0MgJ>vV7h8@i$(`KnQVkN8Sdy;yB3})E^T} z9{Y13s97F+bBS97s!z_xks4N#Dm5!5=hH}DX)1F~>-MV(mx@aHk5Q>h1m(X_rA~xO zJz58LLu_)b+nS(t+g9J2q!?5Jy|ix2gW2bCu}2glVBI!?NhTN;Z)+N9sf<=07!+@- zYoD()g7EO}TGN1#WhnweCL9v7BnSwZa7f4!!D4zsCc+nTtObNj<*Ny-FX-<9NI|!I z+Z30;u^Y)!g7pO5yqutG2Vj|lo5~CN+20U!a|pUX3HsG?f-WsD=xyZ%{qEs{ejiMV zm7tGPf`&vXXzLsWQv}0L)>2{{(6_Mk67g~~VUJc-QJ)llb5(Twt*UTzSrvL||94F> z1CCWuq(n{gOr7tqVCoxn{^S5GtKvQ-NfO8o=kvn^C!%Snih-&s_6Dm0J^EwitKx_9 zRbgJ@DpEk_e*}{;tP1q#tH6Ag^w*1S1G8oD_b#oLR2k9M!N2I@DkA#1(8Nv#EXk6` zIK^hH%Ri!yan=Rk9q{P^KM(jsd5m)e033*Nc!YBb{QhC6B>*Zq*dvc`t|1%mFw`~z z-r>DH0KCI{VoTugUM7Ih;k`77^mmVMIy`GqfN04tX$cOGZWaSzBewo09@}Iu6gsv^ zMDWCe1od~bbXb%-1 zgS0s!j$Gxo2KEuf=rg`3-+me>2J8c+jusx?ep0|>78s(>i1vW#S|P697Cb0&PCiT&{Bp0BryUJAf|PKb;9Ingn1X(FHg3v#1dPrzgx{AZ7>?yQBs z2mJB_Z`XIg3>g9M18?I2aKgmVf}-cKGqLuT=)N0f4{T zz@A>tzzRKn6W-*q@aPZM<#fEBaR$>U$TG!wFQO)MpgnS*4w(Y5D0>aHk<$zmdoW{zub4TC2{ayCG@V6TS4q*Dytg zS*U(hV{hH!R$ono(eTI#`4m#qIC&YZsiv&@oh+&bIEm7+2w0Dt_8SoUv>YdFdM-f` z2Ardd{6Tn>!kvMsQGGW&#+P_p_>>T5%m?NU$jw}V#~!#dc#W0N8EC8-qRa2wooQ(m z`Q;2q54U7SX%9?CO@uo$D>eg-fO(~+o|&H=`(Tj^v!$O|;2?>oU~cr3yD4lu3i0we ztcqqld9N;JEYZcVBrSvw(j0*w>m+Z2a|=91!wtiGkIMBq1oA*(dsQj zjDYIRuCE!HZyVyGeVUlvOfznL*AThy8De$~#yu5EB;$tXygH#Ssg?_1jrD=GF~#$6 z6zg9sIp2}J8oV83@4_v-D%L?YaSCGLSSOOLhC?S4zWRUf!CJ_Vty;gsh7ecs@h~37 zGk9b;uq5>~BfAP(6x_(>m@K=&5GT}ur2;-NXq$@h01e2u-#V5u9x2 zRGh!=+4njCm}qzSb$}57LhC&VApHl{J*5cNB5fEuqjW0Ef7Kao)-+Fpn zil!}u;AzK2l+McIUF|5Kbf6vf{a?8V_5rz@u@tjjjVjqq0Fi2~R){J<`h2Tg*&a!C7kFAA-uUQnVaC;mP7>Swj_dydvjYvlqC*8m?h{h=EG&*jApw1eqA^#09XKi zd_c!0OaLze*zlk(euR@DJ0HT`535z2P{?t>UcwN@x#f^9Ho-~Y>tA$H|5p`fv}K69 z;bh2;Of1@Dxc~-0TVX(2JwG&{Y4(KBHNdVshc;g^| zX92{(bl=wio-^Dvhhmh`Q;@aL4f}x72O9yoj~kAY1NjcUMgsq^F04MoRaL&NFl(_> zP6{9vI%V3DM2aT@+CoG~TRenqE^*ZdqlEC(C>um*YE&YE>LU?B^&ujlKC%T)1kMxi zRti|dt2OmC5dpbtA>ev|0C+Z12XE>{|?rFlB$2%z&4=%TcZ9C zqFlKf{^|OELDfI&3%PM(g}6U~)hiMAlo#;E|8W9l@8 z;a>xP_QeqY>1%L`nLwJJ<@5lsAHexSs~XK6kGU+oA)NnycJy)h>%#BkI@V_R*{<0K zIX~eJ`Xlw#yezN2CG5`MbqFg(VVBKkT+j|d7z5)f;h;&7XorG z$+fNsz}Y5tAoc9*rq8L=Y#d9l&Qu5{n0=>~Yxgg5DTqk9%%~!)8ppes2ubeJl58HY zWGY1PO-NY76qjlwS*B&#LyBAymNVshJKGwgC@9C219rN7iK37Qxx=$cK-3_qDXg

Uaf##372wU%eO-EP22M+0;wJaf=x`)3 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≻awI>~uQLH_e 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

|rWn|q9hQSOJyS(m_e>3FyJzZ|MjH;= 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

+ln0?0}=9fR8BS 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

((Y2dAr2&>G^^VdavAD)bI+6|Rj) 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