From 919eabb6afbab2dc690f146ffab6b93598ed4e2d Mon Sep 17 00:00:00 2001 From: Danilo Guanabara Date: Mon, 23 Aug 2021 12:26:30 -0300 Subject: [PATCH 01/23] Deleted unused order_filter.rs --- src/model/order_filter.rs | 83 --------------------------------------- 1 file changed, 83 deletions(-) delete mode 100644 src/model/order_filter.rs diff --git a/src/model/order_filter.rs b/src/model/order_filter.rs deleted file mode 100644 index f210cd7..0000000 --- a/src/model/order_filter.rs +++ /dev/null @@ -1,83 +0,0 @@ -use rust_decimal::prelude::Decimal; -use serde::Deserialize; -use serde::Serialize; -use super::OrderStatus; -use super::OrderType; -use super::Side; -use std::ops::Range; - -/// This struct represents an order -#[derive(Default, Serialize, Deserialize, Clone, Debug)] -#[allow(missing_docs)] -pub struct OrderFilter { - pub market_pair: Option, - pub client_order_id: Option, - pub order_type: Option, - pub side: Option, - pub status: Option, - pub created_at: Option>, - pub size: Option>, - pub price: Option>, - pub remaining: Option>, -} - -impl OrderFilter { - /// Creates an OrderFilter without any filtering rule. - pub fn new() -> Self { - Default::default() - } - - /// Set market pair. - pub fn with_market_pair(mut self, market_pair: Option) -> Self { - self.market_pair = market_pair; - self - } - - /// Set client order ID. - pub fn with_client_order_id(mut self, client_order_id: Option) -> Self { - self.client_order_id = client_order_id; - self - } - - /// Set OrderType. - pub fn with_order_type(mut self, order_type: Option) -> Self { - self.order_type = order_type; - self - } - - /// Set Side. - pub fn with_side(mut self, side: Option) -> Self { - self.side = side; - self - } - - /// Set OrderStatus. - pub fn with_status(mut self, status: Option) -> Self { - self.status = status; - self - } - - /// Set creation time. - pub fn with_created_at(mut self, created_at: Option>) -> Self { - self.created_at = created_at; - self - } - - /// Set size. - pub fn with_size(mut self, size: Option>) -> Self { - self.size = size; - self - } - - /// Set price. - pub fn with_price(mut self, price: Option>) -> Self { - self.price = price; - self - } - - /// Set remaining. - pub fn with_remaining(mut self, remaining: Option>) -> Self { - self.remaining = remaining; - self - } -} \ No newline at end of file From adee7a6da6fd83cef1ad99604afd8b550ad1f13e Mon Sep 17 00:00:00 2001 From: Danilo Guanabara Date: Mon, 23 Aug 2021 12:35:32 -0300 Subject: [PATCH 02/23] Updating openlimits-binance --- crates/openlimits-binance/Cargo.toml | 2 +- crates/openlimits-binance/src/client/account.rs | 4 ++-- crates/openlimits-binance/src/client/market.rs | 2 +- crates/openlimits-binance/src/client/websocket.rs | 6 +++--- crates/openlimits-binance/src/lib.rs | 10 +++++----- crates/openlimits-binance/src/transport.rs | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/crates/openlimits-binance/Cargo.toml b/crates/openlimits-binance/Cargo.toml index bc2ee21..ed363b2 100644 --- a/crates/openlimits-binance/Cargo.toml +++ b/crates/openlimits-binance/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -exchange = { path = "../openlimits-exchange" } +openlimits-exchange = "0.1" async-trait = "0.1" serde = { version = "1.0.126", features = ["derive"] } serde_json = "1.0.64" diff --git a/crates/openlimits-binance/src/client/account.rs b/crates/openlimits-binance/src/client/account.rs index 7b390d3..409db21 100644 --- a/crates/openlimits-binance/src/client/account.rs +++ b/crates/openlimits-binance/src/client/account.rs @@ -1,13 +1,13 @@ use std::collections::HashMap; use rust_decimal::prelude::*; use serde_json::json; -use exchange::errors::OpenLimitsError; use crate::model::{ AccountInformation, AllOrderReq, Balance, Order, ORDER_SIDE_BUY, ORDER_SIDE_SELL, ORDER_TYPE_LIMIT, ORDER_TYPE_LIMIT_MAKER, ORDER_TYPE_MARKET, OrderCanceled, OrderRequest, TimeInForce, TradeHistory, TradeHistoryReq, }; -use exchange::traits::info::MarketPair; +use openlimits_exchange::errors::OpenLimitsError; +use openlimits_exchange::traits::info::MarketPair; use super::BaseClient; use super::shared::Result; diff --git a/crates/openlimits-binance/src/client/market.rs b/crates/openlimits-binance/src/client/market.rs index a236fa3..070f82b 100644 --- a/crates/openlimits-binance/src/client/market.rs +++ b/crates/openlimits-binance/src/client/market.rs @@ -5,7 +5,7 @@ use crate::model::{ BookTickers, KlineParams, KlineSummaries, KlineSummary, OrderBook, PriceStats, Prices, SymbolPrice, Ticker, }; -pub use exchange::OpenLimitsError; +pub use openlimits_exchange::OpenLimitsError; use rust_decimal::prelude::Decimal; use super::shared::Result; diff --git a/crates/openlimits-binance/src/client/websocket.rs b/crates/openlimits-binance/src/client/websocket.rs index 0632e53..d57a289 100644 --- a/crates/openlimits-binance/src/client/websocket.rs +++ b/crates/openlimits-binance/src/client/websocket.rs @@ -6,17 +6,17 @@ use serde::{de, Deserialize, Serialize}; use serde_json::Value; use tokio::sync::mpsc::{unbounded_channel, UnboundedSender}; use tokio_tungstenite::{connect_async, tungstenite::protocol::Message}; -use exchange::errors::OpenLimitsError; +use openlimits_exchange::errors::OpenLimitsError; pub use crate::{ BinanceParameters, model::websocket::{BinanceSubscription, BinanceWebsocketMessage}, }; -pub use exchange::{ +pub use openlimits_exchange::{ model::websocket::OpenLimitsWebSocketMessage, model::websocket::Subscription, model::websocket::WebSocketResponse, }; -use exchange::traits::stream::{ExchangeWs, Subscriptions}; +use openlimits_exchange::traits::stream::{ExchangeWs, Subscriptions}; use super::shared::Result; const WS_URL_PROD: &str = "wss://stream.openlimits-binance.com:9443/stream"; diff --git a/crates/openlimits-binance/src/lib.rs b/crates/openlimits-binance/src/lib.rs index 4e4a247..efbe5b9 100644 --- a/crates/openlimits-binance/src/lib.rs +++ b/crates/openlimits-binance/src/lib.rs @@ -2,7 +2,7 @@ pub mod model; -pub use exchange::shared; +pub use openlimits_exchange::shared; use async_trait::async_trait; use model::KlineSummaries; @@ -10,7 +10,7 @@ use transport::Transport; use client::BaseClient; use std::convert::TryFrom; use model::{websocket::TradeMessage, SymbolFilter, ORDER_TYPE_LIMIT, ORDER_TYPE_MARKET}; -use exchange::{ +use openlimits_exchange::{ errors::OpenLimitsError, model::{ AskBid, Balance, CancelAllOrdersRequest, CancelOrderRequest, Candle, @@ -21,7 +21,7 @@ use exchange::{ } }; -use exchange::Result; +use openlimits_exchange::Result; mod binance_content_error; mod binance_credentials; @@ -36,8 +36,8 @@ pub use transport::*; pub mod client; pub use client::websocket::BinanceWebsocket; -use exchange::traits::info::{ExchangeInfo, ExchangeInfoRetrieval, MarketPair, MarketPairHandle}; -use exchange::traits::{Exchange, ExchangeMarketData, ExchangeAccount}; +use openlimits_exchange::traits::info::{ExchangeInfo, ExchangeInfoRetrieval, MarketPair, MarketPairHandle}; +use openlimits_exchange::traits::{Exchange, ExchangeMarketData, ExchangeAccount}; /// The main struct of the openlimits-binance module #[derive(Clone)] diff --git a/crates/openlimits-binance/src/transport.rs b/crates/openlimits-binance/src/transport.rs index a3ebb07..2fd11e0 100644 --- a/crates/openlimits-binance/src/transport.rs +++ b/crates/openlimits-binance/src/transport.rs @@ -9,7 +9,7 @@ use serde::Serialize; use sha2::Sha256; use url::Url; use crate::BinanceContentError; -use exchange::OpenLimitsError; +use openlimits_exchange::OpenLimitsError; use super::shared::Result; type HmacSha256 = Hmac; From 95527fb4e098ab8069f0b1015cbbb048b1f14f66 Mon Sep 17 00:00:00 2001 From: Danilo Guanabara Date: Mon, 23 Aug 2021 12:36:36 -0300 Subject: [PATCH 03/23] UPdating Cargo.toml --- crates/openlimits-binance/Cargo.toml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/crates/openlimits-binance/Cargo.toml b/crates/openlimits-binance/Cargo.toml index ed363b2..1557584 100644 --- a/crates/openlimits-binance/Cargo.toml +++ b/crates/openlimits-binance/Cargo.toml @@ -1,8 +1,13 @@ [package] name = "openlimits-binance" version = "0.1.0" -authors = ["Danilo Guanabara "] +authors = ["Danilo Guanabara "] edition = "2018" +description = "Binance implementation for OpenLimits." +license = "BSD-2-Clause" +repository = "https://github.com/nash-io/openlimits" +keywords = ["cryptocurrency", "exchange", "openlimits", "api"] + # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html From 0b58f91c5f94dc67728a82cbe22fe28afb17ca3e Mon Sep 17 00:00:00 2001 From: Danilo Guanabara Date: Mon, 23 Aug 2021 12:37:43 -0300 Subject: [PATCH 04/23] (cargo-release) start next development iteration 0.1.1-alpha.0 --- crates/openlimits-binance/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/openlimits-binance/Cargo.toml b/crates/openlimits-binance/Cargo.toml index 1557584..cdb78dc 100644 --- a/crates/openlimits-binance/Cargo.toml +++ b/crates/openlimits-binance/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "openlimits-binance" -version = "0.1.0" +version = "0.1.1-alpha.0" authors = ["Danilo Guanabara "] edition = "2018" description = "Binance implementation for OpenLimits." From 81d50b5ec461bbd0a1540d74b61d10e14355c2aa Mon Sep 17 00:00:00 2001 From: Danilo Guanabara Date: Mon, 23 Aug 2021 13:29:31 -0300 Subject: [PATCH 05/23] Clean up --- build.rs | 4 +- src/exchange/mod.rs | 10 +- src/exchange/nash/mod.rs | 505 +-------------------------------------- 3 files changed, 16 insertions(+), 503 deletions(-) diff --git a/build.rs b/build.rs index 5ea0c46..ab38381 100644 --- a/build.rs +++ b/build.rs @@ -34,8 +34,8 @@ fn main() { .join("lib"); let from_dll = target_path.join("gmp.dll"); let from_lib = target_path.join("gmp.lib"); - std::fs::copy(dll_path, from_dll).expect(&format!("Couldn't copy dll from {}", from_dll.to_string())); - std::fs::copy(lib_path, from_lib).expect(&format!("Couldn't copy lib from {}", from_lib.to_string())); + std::fs::copy(dll_path, &from_dll).expect(&format!("Couldn't copy dll from {}", from_dll.display())); + std::fs::copy(lib_path, &from_lib).expect(&format!("Couldn't copy lib from {}", from_lib.display())); } #[cfg(not(target_os = "windows"))] diff --git a/src/exchange/mod.rs b/src/exchange/mod.rs index ad054e1..9c23643 100644 --- a/src/exchange/mod.rs +++ b/src/exchange/mod.rs @@ -1,9 +1,9 @@ //! This module contains all the implemented exchanges. -pub use binance; +pub use openlimits_binance as binance; pub mod coinbase; pub mod nash; -pub use exchange::traits; -pub use exchange::shared; -pub use exchange::model; -pub use exchange::errors; \ No newline at end of file +pub use openlimits_exchange::traits; +pub use openlimits_exchange::shared; +pub use openlimits_exchange::model; +pub use openlimits_exchange::errors; \ No newline at end of file diff --git a/src/exchange/nash/mod.rs b/src/exchange/nash/mod.rs index cb78014..78720e6 100644 --- a/src/exchange/nash/mod.rs +++ b/src/exchange/nash/mod.rs @@ -14,10 +14,9 @@ pub use subscription_response_wrapper::SubscriptionResponseWrapper; pub use utils::client_from_params_failable; pub use super::shared; -use std::convert::{TryFrom, TryInto}; +use std::convert::TryInto; use async_trait::async_trait; use nash_native_client::Client; -use nash_protocol::protocol::subscriptions::SubscriptionResponse; use rust_decimal::prelude::*; use crate::{ errors::OpenLimitsError, @@ -26,18 +25,17 @@ use crate::{ GetHistoricTradesRequest, GetOrderHistoryRequest, GetOrderRequest, GetPriceTickerRequest, OpenLimitOrderRequest, OpenMarketOrderRequest, Order, OrderBookRequest, OrderBookResponse, OrderCanceled, Paginator, - Ticker, Trade, TradeHistoryRequest, websocket::WebSocketResponse, + Ticker, Trade, TradeHistoryRequest, }, - model::websocket::OpenLimitsWebSocketMessage, }; -use crate::exchange::traits::info::ExchangeInfo; -use crate::exchange::traits::info::ExchangeInfoRetrieval; -use crate::exchange::traits::Exchange; -use crate::exchange::traits::ExchangeMarketData; -use crate::exchange::traits::ExchangeAccount; -use crate::exchange::traits::info::MarketPair; -use crate::exchange::traits::info::MarketPairHandle; use super::shared::Result; +use openlimits_exchange::traits::info::ExchangeInfo; +use openlimits_exchange::traits::info::ExchangeInfoRetrieval; +use openlimits_exchange::traits::Exchange; +use openlimits_exchange::traits::ExchangeMarketData; +use openlimits_exchange::traits::ExchangeAccount; +use openlimits_exchange::traits::info::MarketPair; +use openlimits_exchange::traits::info::MarketPairHandle; /// This struct is the main struct of this module and it is used for communications with the nash openlimits-exchange pub struct Nash { @@ -364,488 +362,3 @@ impl ExchangeInfoRetrieval for Nash { self.exchange_info.get_pair(name) } } - -impl From<&OrderBookRequest> for nash_protocol::protocol::orderbook::OrderbookRequest { - fn from(req: &OrderBookRequest) -> Self { - let market = req.market_pair.clone(); - Self { market } - } -} - -impl From for OrderBookResponse { - fn from(book: nash_protocol::protocol::orderbook::OrderbookResponse) -> Self { - Self { - update_id: Some(book.update_id as u64), - last_update_id: Some(book.last_update_id as u64), - bids: book.bids.into_iter().map(Into::into).collect(), - asks: book.asks.into_iter().map(Into::into).collect(), - } - } -} - -impl From for AskBid { - fn from(resp: nash_protocol::types::OrderbookOrder) -> Self { - let price = Decimal::from_str(&resp.price).expect("Couldn't parse Decimal from string."); - let qty = Decimal::from_str(&resp.amount.to_string()) - .expect("Couldn't parse Decimal from string."); - Self { price, qty } - } -} - -impl From<&CancelOrderRequest> for nash_protocol::protocol::cancel_order::CancelOrderRequest { - fn from(req: &CancelOrderRequest) -> Self { - // TODO: why this param? - let market = req.market_pair.clone().expect("Couldn't get market_pair."); - - Self { - market, - order_id: req.id.clone(), - } - } -} - -impl From for OrderCanceled { - fn from(resp: nash_protocol::protocol::cancel_order::CancelOrderResponse) -> Self { - Self { id: resp.order_id } - } -} - -impl From<&CancelAllOrdersRequest> for nash_protocol::protocol::cancel_all_orders::CancelAllOrders { - fn from(req: &CancelAllOrdersRequest) -> Self { - // TODO: why is this required param for Nash? - let market = req - .market_pair - .clone() - .expect("Market pair is a required param for Nash"); - Self { market } - } -} - -impl From for OrderType { - fn from(order_type: nash_protocol::types::OrderType) -> Self { - match order_type { - nash_protocol::types::OrderType::Limit => OrderType::Limit, - nash_protocol::types::OrderType::Market => OrderType::Market, - nash_protocol::types::OrderType::StopLimit => OrderType::StopLimit, - nash_protocol::types::OrderType::StopMarket => OrderType::StopMarket, - } - } -} - -impl From for Order { - fn from(resp: nash_protocol::protocol::place_order::PlaceOrderResponse) -> Self { - Self { - id: resp.order_id, - market_pair: resp.market.name, - client_order_id: None, - created_at: Some(resp.placed_at.timestamp_millis() as u64), - order_type: resp.order_type.into(), - side: resp.buy_or_sell.into(), - status: resp.status.into(), - size: Decimal::from(0), - price: None, - remaining: None, - trades: Vec::new(), - } - } -} - -impl TryFrom<&TradeHistoryRequest> - for nash_protocol::protocol::list_account_trades::ListAccountTradesRequest -{ - type Error = OpenLimitsError; - fn try_from(req: &TradeHistoryRequest) -> super::shared::Result { - let (before, limit, range) = try_split_paginator(req.paginator.clone())?; - - Ok(Self { - market: req.market_pair.clone(), - before, - limit, - range, - }) - } -} - -impl From for Trade { - fn from(resp: nash_protocol::types::Trade) -> Self { - let qty = Decimal::from_str(&resp.amount.to_string()) - .expect("Couldn't parse Decimal from string."); - let price = Decimal::from_str(&resp.limit_price.to_string()) - .expect("Couldn't parse Decimal from string."); - - let fees = match resp.account_side { - nash_protocol::types::AccountTradeSide::Taker => { - Decimal::from_str(&resp.taker_fee.to_string()) - .expect("Couldn't parse Decimal from string.") - } - _ => Decimal::from(0), - }; - - let (buyer_order_id, seller_order_id) = match resp.direction { - nash_protocol::types::BuyOrSell::Buy => (resp.taker_order_id, resp.maker_order_id), - nash_protocol::types::BuyOrSell::Sell => (resp.maker_order_id, resp.taker_order_id), - }; - - Self { - id: resp.id, - created_at: resp.executed_at.timestamp_millis() as u64, - fees: Some(fees), - liquidity: Some(resp.account_side.into()), - market_pair: resp.market.clone(), - buyer_order_id: Some(buyer_order_id), - seller_order_id: Some(seller_order_id), - price, - qty, - side: resp.direction.into(), - } - } -} - -impl From for Side { - fn from(side: nash_protocol::types::BuyOrSell) -> Self { - match side { - nash_protocol::types::BuyOrSell::Buy => Side::Buy, - nash_protocol::types::BuyOrSell::Sell => Side::Sell, - } - } -} - -impl From for Liquidity { - fn from(side: nash_protocol::types::AccountTradeSide) -> Self { - match side { - nash_protocol::types::AccountTradeSide::Taker => Liquidity::Taker, - _ => Liquidity::Maker, - } - } -} - -impl TryFrom<&GetHistoricRatesRequest> - for nash_protocol::protocol::list_candles::ListCandlesRequest -{ - type Error = OpenLimitsError; - fn try_from(req: &GetHistoricRatesRequest) -> super::shared::Result { - let (before, limit, range) = try_split_paginator(req.paginator.clone())?; - - Ok(Self { - market: req.market_pair.clone(), - chronological: None, - before, - interval: Some( - req.interval - .try_into() - .expect("Couldn't convert Interval to CandleInterval."), - ), - limit, - range, - }) - } -} - -impl TryFrom<&GetHistoricTradesRequest> - for nash_protocol::protocol::list_trades::ListTradesRequest -{ - type Error = OpenLimitsError; - fn try_from(req: &GetHistoricTradesRequest) -> super::shared::Result { - let market = req.market_pair.clone(); - let (before, limit, _) = try_split_paginator(req.paginator.clone())?; - //FIXME: Some issues with the graphql protocol for the market to be non nil - Ok(Self { - market, - before, - limit, - }) - } -} - -impl TryFrom for nash_protocol::types::CandleInterval { - type Error = OpenLimitsError; - fn try_from(interval: Interval) -> super::shared::Result { - match interval { - Interval::OneMinute => Ok(nash_protocol::types::CandleInterval::OneMinute), - Interval::FiveMinutes => Ok(nash_protocol::types::CandleInterval::FiveMinute), - Interval::FifteenMinutes => Ok(nash_protocol::types::CandleInterval::FifteenMinute), - Interval::ThirtyMinutes => Ok(nash_protocol::types::CandleInterval::ThirtyMinute), - Interval::OneHour => Ok(nash_protocol::types::CandleInterval::OneHour), - Interval::SixHours => Ok(nash_protocol::types::CandleInterval::SixHour), - Interval::TwelveHours => Ok(nash_protocol::types::CandleInterval::TwelveHour), - Interval::OneDay => Ok(nash_protocol::types::CandleInterval::OneDay), - _ => { - let err = MissingImplementationContent { - message: String::from("Not supported interval"), - }; - Err(OpenLimitsError::MissingImplementation(err)) - } - } - } -} - -impl From for Candle { - fn from(candle: nash_protocol::types::Candle) -> Self { - let close = Decimal::from_str(&candle.close_price.to_string()) - .expect("Couldn't parse Decimal from string."); - let high = Decimal::from_str(&candle.high_price.to_string()) - .expect("Couldn't parse Decimal from string."); - let low = Decimal::from_str(&candle.low_price.to_string()) - .expect("Couldn't parse Decimal from string."); - let open = Decimal::from_str(&candle.open_price.to_string()) - .expect("Couldn't parse Decimal from string."); - let volume = Decimal::from_str(&candle.a_volume.to_string()) - .expect("Couldn't parse Decimal from string."); - - Self { - close, - high, - low, - open, - time: candle.interval_start.timestamp_millis() as u64, - volume, - } - } -} - -impl TryFrom<&GetOrderHistoryRequest> - for nash_protocol::protocol::list_account_orders::ListAccountOrdersRequest -{ - type Error = OpenLimitsError; - fn try_from(req: &GetOrderHistoryRequest) -> super::shared::Result { - let (before, limit, range) = try_split_paginator(req.paginator.clone())?; - - Ok(Self { - market: req.market_pair.clone(), - before, - limit, - range, - buy_or_sell: None, - order_type: None, - status: match req.order_status.clone() { - Some(v) => Some( - v.into_iter() - .map(TryInto::try_into) - .collect::>>()?, - ), - None => None, - }, - }) - } -} - -impl From for Order { - fn from(order: nash_protocol::types::Order) -> Self { - let size = Decimal::from_str(&order.amount_placed.to_string()) - .expect("Couldn't parse Decimal from string."); - let price = order - .limit_price - .map(|p| Decimal::from_str(&p.to_string()).unwrap()); - let remaining = Some( - Decimal::from_str(&order.amount_remaining.to_string()) - .expect("Couldn't parse Decimal from string."), - ); - - Self { - id: order.id, - market_pair: order.market.clone(), - client_order_id: None, - created_at: Some(order.placed_at.timestamp_millis() as u64), - order_type: order.order_type.into(), - side: order.buy_or_sell.into(), - status: order.status.into(), - size, - price, - remaining, - trades: order.trades.into_iter().map(Into::into).collect(), - } - } -} - -impl From for OrderStatus { - fn from(status: nash_protocol::types::OrderStatus) -> Self { - match status { - nash_protocol::types::OrderStatus::Filled => OrderStatus::Filled, - nash_protocol::types::OrderStatus::Open => OrderStatus::Open, - nash_protocol::types::OrderStatus::Canceled => OrderStatus::Canceled, - nash_protocol::types::OrderStatus::Pending => OrderStatus::Pending, - } - } -} - -impl TryFrom for nash_protocol::types::OrderStatus { - type Error = OpenLimitsError; - fn try_from(status: OrderStatus) -> super::shared::Result { - Ok(match status { - OrderStatus::Filled => nash_protocol::types::OrderStatus::Filled, - OrderStatus::Open => nash_protocol::types::OrderStatus::Open, - OrderStatus::Canceled => nash_protocol::types::OrderStatus::Canceled, - OrderStatus::Pending => nash_protocol::types::OrderStatus::Pending, - _ => { - return Err(OpenLimitsError::InvalidParameter( - "Had invalid order status for Nash".to_string(), - )) - } - }) - } -} - -impl From<&GetPriceTickerRequest> for nash_protocol::protocol::get_ticker::TickerRequest { - fn from(req: &GetPriceTickerRequest) -> Self { - let market = req.market_pair.clone(); - - Self { market } - } -} - -impl From for Ticker { - fn from(resp: nash_protocol::protocol::get_ticker::TickerResponse) -> Self { - let mut price = None; - if resp.best_ask_price.is_some() && resp.best_bid_price.is_some() { - let ask = Decimal::from_str(&resp.best_ask_price.unwrap().to_string()) - .expect("Couldn't parse Decimal from string."); - let bid = Decimal::from_str(&resp.best_bid_price.unwrap().to_string()) - .expect("Couldn't parse Decimal from string."); - price = Some((ask + bid) / Decimal::from(2)); - } - let mut price_24h = None; - if resp.high_price_24h.is_some() && resp.low_price_24h.is_some() { - let day_high = Decimal::from_str( - &resp - .high_price_24h - .expect("Couldn't get high price 24h.") - .to_string(), - ) - .expect("Couldn't parse Decimal from string."); - let day_low = Decimal::from_str( - &resp - .low_price_24h - .expect("Couldn't get low price 24h.") - .to_string(), - ) - .expect("Couldn't parse Decimal from string."); - price_24h = Some((day_high + day_low) / Decimal::from(2)); - } - Self { price, price_24h } - } -} - -impl From<&GetOrderRequest> for nash_protocol::protocol::get_account_order::GetAccountOrderRequest { - fn from(req: &GetOrderRequest) -> Self { - Self { - order_id: req.id.clone(), - } - } -} - -impl From for BuyOrSell { - fn from(side: Side) -> Self { - match side { - Side::Buy => BuyOrSell::Buy, - Side::Sell => BuyOrSell::Sell, - } - } -} - -impl TryFrom for nash_protocol::types::OrderType { - type Error = OpenLimitsError; - fn try_from(order_type: OrderType) -> Result { - match order_type { - OrderType::Limit => Ok(Self::Limit), - OrderType::Market => Ok(Self::Market), - OrderType::StopLimit => Ok(Self::StopLimit), - OrderType::StopMarket => Ok(Self::StopMarket), - OrderType::Unknown => Err(OpenLimitsError::InvalidParameter( - "Had invalid order type for Nash".to_string(), - )), - } - } -} - -impl From for SubscribeAccountOrders { - fn from(account_orders: AccountOrders) -> Self { - Self { - market: account_orders.market.clone(), - order_type: account_orders.order_type.map(|x| { - x.iter() - .cloned() - .map(|x| x.try_into().ok()) - .filter(|x| x.is_some()) - .map(|x| x.unwrap()) - .collect() - }), - range: account_orders.range.map(|range| DateTimeRange { - start: timestamp_to_utc_datetime(range.start), - stop: timestamp_to_utc_datetime(range.end), - }), - buy_or_sell: account_orders.buy_or_sell.map(|x| x.into()), - status: account_orders.status.map(|x| { - x.iter() - .cloned() - .map(|x| x.try_into().ok()) - .filter(|x| x.is_some()) - .map(|x| x.unwrap()) - .collect() - }), - } - } -} - -impl From for nash_protocol::protocol::subscriptions::SubscriptionRequest { - fn from(sub: Subscription) -> Self { - match sub { - Subscription::OrderBookUpdates(market) => Self::Orderbook( - nash_protocol::protocol::subscriptions::updated_orderbook::SubscribeOrderbook { - market, - }, - ), - Subscription::Trades(market) => Self::Trades( - nash_protocol::protocol::subscriptions::trades::SubscribeTrades { market }, - ), - Subscription::AccountOrders(account_orders) => Self::AccountOrders( - account_orders.into() - ), - Subscription::AccountTrades(market_name) => Self::AccountTrades( - nash_protocol::protocol::subscriptions::new_account_trades::SubscribeAccountTrades { - market_name - } - ), - Subscription::AccountBalance(symbol) => Self::AccountBalances( - nash_protocol::protocol::subscriptions::updated_account_balances::SubscribeAccountBalances { - symbol - } - ), - _ => panic!("Not supported Subscription"), - } - } -} - -impl TryFrom for WebSocketResponse { - type Error = OpenLimitsError; - - fn try_from(value: SubscriptionResponseWrapper) -> Result { - match value.0 { - SubscriptionResponse::Orderbook(resp) => Ok(WebSocketResponse::Generic( - OpenLimitsWebSocketMessage::OrderBook(OrderBookResponse { - update_id: Some(resp.update_id as u64), - last_update_id: Some(resp.last_update_id as u64), - asks: resp.asks.into_iter().map(Into::into).collect(), - bids: resp.bids.into_iter().map(Into::into).collect(), - }), - )), - SubscriptionResponse::Trades(resp) => { - let trades = resp.trades.into_iter().map(|x| x.into()).collect(); - Ok(WebSocketResponse::Generic( - OpenLimitsWebSocketMessage::Trades(trades), - )) - } - SubscriptionResponse::Ticker(resp) => Ok(WebSocketResponse::Raw( - SubscriptionResponseWrapper(SubscriptionResponse::Ticker(resp)), - )), - SubscriptionResponse::AccountTrades(resp) => Ok(WebSocketResponse::Raw( - SubscriptionResponseWrapper(SubscriptionResponse::AccountTrades(resp)), - )), - SubscriptionResponse::AccountOrders(resp) => Ok(WebSocketResponse::Raw( - SubscriptionResponseWrapper(SubscriptionResponse::AccountOrders(resp)), - )), - SubscriptionResponse::AccountBalances(resp) => Ok(WebSocketResponse::Raw( - SubscriptionResponseWrapper(SubscriptionResponse::AccountBalances(resp)), - )), - } - } -} From e2cb305c6a59b316b764fcb5af107b1b54a5b3ee Mon Sep 17 00:00:00 2001 From: Danilo Guanabara Date: Mon, 23 Aug 2021 13:32:59 -0300 Subject: [PATCH 06/23] Working tests --- src/exchange/mod.rs | 2 +- tests/exchange/websocket.rs | 36 ++++++++++++++++++------------------ tests/mod.rs | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/exchange/mod.rs b/src/exchange/mod.rs index 9c23643..37e159f 100644 --- a/src/exchange/mod.rs +++ b/src/exchange/mod.rs @@ -2,7 +2,7 @@ pub use openlimits_binance as binance; pub mod coinbase; -pub mod nash; +// pub mod nash; pub use openlimits_exchange::traits; pub use openlimits_exchange::shared; pub use openlimits_exchange::model; diff --git a/tests/exchange/websocket.rs b/tests/exchange/websocket.rs index a185127..d6fb380 100644 --- a/tests/exchange/websocket.rs +++ b/tests/exchange/websocket.rs @@ -3,15 +3,15 @@ // supported exchanges. use dotenv::dotenv; -use nash_native_client::Environment; +use openlimits::prelude::*; use openlimits::exchange::coinbase::client::websocket::CoinbaseWebsocket; use openlimits::exchange::coinbase::{Coinbase, CoinbaseCredentials, CoinbaseParameters}; use openlimits::OpenLimits; -use openlimits::exchange::nash::{Nash, NashCredentials, NashParameters}; use openlimits::exchange::shared::Result; use std::env; -use tokio::time::Duration; -use openlimits::prelude::*; +// use nash_native_client::Environment; +// use openlimits::exchange::nash::{Nash, NashCredentials, NashParameters}; +// use tokio::time::Duration; #[tokio::test] async fn account_test() { @@ -23,20 +23,20 @@ async fn ws_test() { let _websocket = init_ws().await; } -async fn _nash() -> Result { - let parameters = NashParameters { - affiliate_code: None, - credentials: Some(NashCredentials { - secret: env::var("NASH_API_SECRET").expect("Couldn't get environment variable."), - session: env::var("NASH_API_KEY").expect("Couldn't get environment variable."), - }), - environment: Environment::Sandbox, - client_id: 1, - timeout: Duration::from_secs_f32(10.0), - sign_states_loop_interval: None, - }; - OpenLimits::instantiate(parameters).await -} +// async fn _nash() -> Result { +// let parameters = NashParameters { +// affiliate_code: None, +// credentials: Some(NashCredentials { +// secret: env::var("NASH_API_SECRET").expect("Couldn't get environment variable."), +// session: env::var("NASH_API_KEY").expect("Couldn't get environment variable."), +// }), +// environment: Environment::Sandbox, +// client_id: 1, +// timeout: Duration::from_secs_f32(10.0), +// sign_states_loop_interval: None, +// }; +// OpenLimits::instantiate(parameters).await +// } async fn coinbase() -> Result { let parameters = CoinbaseParameters { diff --git a/tests/mod.rs b/tests/mod.rs index e0c2354..fc1c3cc 100644 --- a/tests/mod.rs +++ b/tests/mod.rs @@ -2,6 +2,6 @@ extern crate openlimits; mod exchange; mod apis; -// mod openlimits-binance; +// mod binance; mod coinbase; -mod nash; +// mod nash; From 19a0c96659e6e96ccc1ec7e99f70583d68730dd6 Mon Sep 17 00:00:00 2001 From: Danilo Guanabara Date: Mon, 23 Aug 2021 13:38:16 -0300 Subject: [PATCH 07/23] Moving redist to nash-mpc --- build.rs | 42 ------------------------------------------ redist/x86/gmp.dll | Bin 859671 -> 0 bytes redist/x86/gmp.lib | Bin 124942 -> 0 bytes redist/x86_64/gmp.dll | Bin 896000 -> 0 bytes redist/x86_64/gmp.lib | Bin 383348 -> 0 bytes 5 files changed, 42 deletions(-) delete mode 100644 build.rs delete mode 100644 redist/x86/gmp.dll delete mode 100644 redist/x86/gmp.lib delete mode 100644 redist/x86_64/gmp.dll delete mode 100644 redist/x86_64/gmp.lib diff --git a/build.rs b/build.rs deleted file mode 100644 index ab38381..0000000 --- a/build.rs +++ /dev/null @@ -1,42 +0,0 @@ -#[cfg(target_os = "windows")] -fn main() { - use std::process::Command; - use std::path::Path; - - let rustup_output = Command::new("rustup") - .arg("which") - .arg("rustc") - .output() - .expect("Couldn't get rustup output."); - let rustc_path = String::from_utf8(rustup_output.stdout).expect("Couldn't get toolchain path"); - let toolchain_path = Path::new(&rustc_path) - .parent().unwrap() - .parent().unwrap(); - - let toolchain_triple = toolchain_path - .file_name() - .map(|name| name.to_string_lossy().to_string()) - .map(|name| name.replace("stable-", "")) - .expect("Couldn't get toolchain triple."); - let architecture = if let Some(_) = toolchain_triple.find("x86_64") { - "x86_64" - } else { - "x86" - }; - - let source_path = Path::new(env!("CARGO_MANIFEST_DIR")).join("redist").join(architecture); - let dll_path = source_path.join("gmp.dll"); - let lib_path = source_path.join("gmp.lib"); - let target_path = toolchain_path - .join("lib") - .join("rustlib") - .join(toolchain_triple) - .join("lib"); - let from_dll = target_path.join("gmp.dll"); - let from_lib = target_path.join("gmp.lib"); - std::fs::copy(dll_path, &from_dll).expect(&format!("Couldn't copy dll from {}", from_dll.display())); - std::fs::copy(lib_path, &from_lib).expect(&format!("Couldn't copy lib from {}", from_lib.display())); -} - -#[cfg(not(target_os = "windows"))] -fn main() {} \ No newline at end of file diff --git a/redist/x86/gmp.dll b/redist/x86/gmp.dll deleted file mode 100644 index 74b9d5d609ab6c2f28a8d3b6bc02b9fdae4e14ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 859671 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%0DGmw$^*K3iPlZUw; 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

Pj7=n=o?N3Y(GWg)e$P-<6 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%0AfqW+cFoX=RGV=lj@FYGX1$9Dbw?yZFx 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�gnfNIy6|zc$CgmHHujf2nc`2D&6~?( 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 RGaHy0Hyq2D*0Yrj{~!BleM|rV diff --git a/redist/x86_64/gmp.dll b/redist/x86_64/gmp.dll deleted file mode 100644 index c7253c973d8b342396bea5049bf4c984759ed1c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 896000 zcmeFadwf*Yx$r*|CKwdlK|rxm37WRd@y1kbnL|NAeV?^wa>1VS zd4K=>-hY04G_x=3@~me)>$$JBQ(tTd4GV=r5&ka}LZNm1%D)=*_kaGglGkTX+;Dd2 z=@HLQS{F_}KWXk=U%$6%(LLY!+C5+Xc2(_{@4ovx>8h{XS#?k5?y9ffU1ePV`KoV! z=c{*KK5EpN)y1Z7NQ6RPeQ-=@qIL6v&=Y5dzW?!1s3-LCsJ`y01DTG&wxz{8l)Eyf$~}G&KR;)%)%>0WaC*6#nOA&ziYn&`{FTKu^o`TY(eKm%zO~YQ z73Ds~@1nm`F8)c?UX764f?|8W{%|=}=>Pxoe+>hsJL>p~;UT}SHxkk&)`awV`rLW9 z-28bndvLO4KbNvM)o;r@;EX#+p;)ed+wwcI2g0WF(Xrj-p+xMBzsd5j$GyN?)4A-M z`-X?QM`{y|P-wjeeHUI%+Fd=S_Mg*CyV+_qmiJ|O?uvY&hFYYv*$j5|6>HH@&VLFQ{Vg))qwwF%F zYZL2u$J=47qq(X zNo!8|98dZRQ9nH@WqTWhhbQg5g|=+@j^)Ec;lBqp$ho7Yc<2g;0MUmqGbh&RjjrPxs%O&N$x}h(>MWr)9X{%zN^^NXY-Jlxg7o{|?^& zkRR{IylELOF#D6$`vBb!N`;X;XwYw#8CUaN1#&Kh`(D|*>c+75$=w@A2i@s*v-gJ&3I%XJED<|q*gY-7>8!xyR^4`o zOs#%LQ!qa7&u>OTx@%MyXgFw#sad?pyI0ju=lUOetLTE3f#e%{_Wf{Xk#|Lx>U4u3 zL4f#9sYK?XelTwf01IIL+~Awh^x!W5ETMbv%AhVS57X*r^VFZnp9bkktN%2Y-OaRF zoPOVn1jYR--Yi^rd5QcQST`nAGY_h10jiJ?aQaLJZu&nsMSDrxsGe%it-i{%lhu4m%70nPoAwq+=H{g=(a|8hfg9oE{u}fwa5ps!{TD3VDzkpG zX>YZ+r^{EyLmBBG#DA%2VZ(Z%1yh0d( zt#0=eoAAd_XwZO#QB*-GUKW6YdgIp6HZ4Cs(DLph4D&dD1V2-)_4A7V%od}%3V=f1 zFXz&C*D!jS+BB$nRXz!-suBWYTWp(m<`ZGz5>w$0tTTU?kDf8`Px#h|QP+HTcxb(7 zao%%>>3N0pTwH&=UmuY-+W@#h+Mlez_8Lp~;}>d|j~WZ`mc3bXenHuV+V*61g~=3E zn06!BvU6tsK$V&AI?K%aSFPH|T!hU0zDvvzji$EYz>HOU3#{$T==DOG3eLi2GraBo z+Fdq>2o1JOiu=t*_zEvbSZu8Add3 zbsRA4yxFlYB}MJg#bV$=tG@;K;TFaEExJ--Re=HQ6vwMD^Itt+=1$Nv_;rJtPe{k> z;I%Nl;WSZoTT^jre}{U?)DAyW5sePf3=;%jD9se-gL;D|Fpwmsy*+6+3YlD0Z1xPA zh0&MVofovbdqlC_oluo-d6NGZZX8ktxWZ&z>CuJ$&)s(p* zcw*UuR*C7BpAVvBeP~82cekm#ZQQkSCrp&;NzKU7z?Y;Gn~5*4m!|AWu1@kSInbhh zOTa-zW;$WRu_C5>_5MBsf zN`^aEP7S3i%tDUeOkXmd)9S}iNzWcH(;mE7s=MEVcFvmOPiTz00MLN z79c`iH;2MzHaCn%_q>~MW=C}Q#&W~n+Jgl(B8d3xl#rgv{yd3y)#r}U(bEa`e8NgRmpm6i?+6V;nuuY=8oJX^`d#Z zm3~!6qy8p>cA%>>vd1e1bv0JjSX-HBBXS?-G3Tkkc@V^H-x1_ z-9D$JB#r2k%kzwx_3PauqKj3AN9W*O?9JCx7`t`lPO)@Gf&-o?PwV`TK z&6>)x`Z9A}UHIafk>krAVM$nslMeH*#yNLQSq1a5*56uXN6wi&X_Z!YH&f5@HrJQm zKfB>SBKOZW+Ygw`ckkYHcLNu!GQ!-qCE=RUHW+AnrkU-Vp{>4^dWyf9c5lkw5{0qt zx8ZTVHR3oWF4tD?ml9&xM0vbVINv+T5!+?HRDZ)RYb%rg%zohMc@X>xhJjHiK)$~1 z8QQa=ZCahW$oAD}t3{1ckR)xud|5cHeZuVMqEkx>)QMVVJzGKtJUC^)X?DDA@!yC8 z$q^o40`X_>(1UL2=4H>H9OuiM>PAthq?m!$Us(T zt6dsQxOe5&ujInA-)B4lW~>fI3g#PS({G|iyFC`Quq8mYB(x%V7 zOsh5GglQj=3#n8$9X6}G<`(dm9C66MjNA1BY?Ae3Zx=$?=bAtXeDC<90gl2eH^_XM z_6J53L~Ycw-hIq~457;$;W2AW78tiW4$8CrGDjo!QNpBy=V-$GTM4%H0xd%_WsdhL zIKXblA^%rWY(sxB=}#5g5p=dc=z)1KJ0S2wGAGpfPJp~RN`nfePZupHSkudTidV3N7Zkm38NQy=(I$ zpR767GQ+for6<`ZtlEwF6BF|XKH`o%59J}+ZnlW(QeY_Nh_OxPst>jShxXu^G@+~s z!`>Nt8;t0G?DZ2+onD3jI_db$v$A%Pb36+o|1okc(V579Cz-Du$4VjZ^_mv=HTrsNmbxna<73Wj+yZFU@7M+0j@mxcoKU-kQ*!+)pEy(&IUH=gf@+=%8NSF^;? zm4q)9Mecczp2QmcVW1Qj^=qg64?ECM-Fqq(uQ^;mRUKp6i?COCf?1WTEGpcCbaPo3 z#rn!zOkaQp;DXL_(c?^er|EEiV@2Uyvwm0RP_cSoA2{V{=?=EmGE0O{$Pp!Z3eW7b z7-{WhGrxBjFxa!CTg-=k4PMn>C(gs{iK|rux@th1*+vWRY%dRG8&~8H47W$Sv%`O< zA*nybgbA3YdwcZ_CZ@D0HuVi+B;G0uaI(_7%xqJIcfGJhXHE~=e&!tjnQ~i`ffD9~ zlg<|^6ZRG;7FL?D+Y+(XM6@mG+*E1AbIV5Q(OjxFcfC8dktsoWMl9KSg<fjpVw^Ba)6pw+Q6iMLO#88vq;5X~8=;J*-g75_P|R?C zyppQ~P}haAUmVq!o!F?YspU5N7kOK)txe(C4sJfDJ$yNDnB0GS8Imb)qkw5AJkv>d zD8b{WsTMT%b;uwIs7Lo=VcJb*VXId60esVOrOED(7WrBB_?aszvitU|JdsF`QH4H3 z>p(en;>r^>nJ&})eAsd$=h4MFbJdB^3VLfvjHii^w)!YgneI%@%y#v7M{pjQ(Txzd zkkb?@pb|cyICY|}CD9{QFx#lzDwq8Bsb70Oiz-1o*A)2e>K>=)4cu6Tjmh|(721Q3 zQVxhTd#j;6b2z~39<%jPEzBT^x)?z<3-@*@V2MBB_q&2XYsLA3gA zUIz1>bP}QDB{I|vs_Dd{q%&&&OSnX*n6;`?85A;NC0NXxPEDoN+l6am7$R@w|{n^@-aJ;Rx|QOIMA9^bZne1nK6vyczBY0unPC_P`{8?ja+4A%vt&}RA^ zunMBgOA>v<60ImT^E~>n`|K0wC9%e6V?9RMcCD_8&fIIt+^eY7m+vYAs60-r&kEUT zt20oh=j>KENxEN!#vD*vdrbfH=NNX%o&Ij@m}N(*Ekr)TTl-5c+arQiTXP9DllK0k zeJA9SvfmF>w}ib%x1aC6O!ziFRo&hl?KErK!p$-x3GEjj++*p57j?9O^gW=31}ys} z^U;LegTvZ%$F?NG$GlyyheLE|WtVR33xUt@F)*q}n~nIXI@dp9#OAsRcP%XAi4>!kh(qm?A3V5A6L$tGOOu{|_bb9m^BfLFTyX|^+ z`i^86fcDa!_u_XWAt&Y4Z`Rh#MLTj56*JxGQ*y-x~o^E&NLR^9mCPWW7c%fuo?h<$4Wftvn? z*V>2ttqs6HJp4PS3!qr|pa)C!U-R?+D!?xBw&w-pgilB4ca>*lkN<9koM#D-E$MBA=$HEUIvkKR>iUdiZKT zAA#~@!Gdo1CS>nMP`VSSm^1J|#I`9gwE91BBiM5?=m+!Q2PVR?$9w+%NXT#!op_ZM zmRZ1y5~ycJ^RP^tVEWpKy|_ZFdmp9BcliUHPI>G_BBekpM9l_JYpT0Mm|bxESay`f;b$sI8H6EZ*9 z#tO4#X2AO6ThN1Q=P_hfr-w5`tOFUBJF>;=TLR@ILQ&9R!}jb<#T>^t*vFdDY{9Kr zyA0!gKdiG5Q26q&z;SIr;a?5lNTSqCF`QHde7eVe1==<+6ecI_uU1zHZ71yK6VdmK z=mGEZKMb>q&{^hJL=W397~yx|0}{%*1S7(-jcI*&7%Kdaib>(7#(N#_alu^qA4UJR zPx=vFFb8U0irrMD?7eCMwfsIh}qKlqYv=Y#d7XAjR{85@Wk@5{E7TGrz%s{mrO z*S@4Mo#P%(S#cd}bt51bvvvnOV+R%n9N+JisRNuOH(m`OF-{SuJ$@TtsR=F4reBc0 zvj;07&G9n5B@$KA<1W4>n{~Drw0V1x943!#YVpl+6{U=;B8gU zn*2ZZmpkG8srZcGM}Vwf^T4!Q`~x7VU-eQKO8->xfXNaMn0!R5%!?YE_ogiTSkH=u zpY2(Zp0iN9Wg9_+E#I{kYF9K;r1hRppz1kuDtX$b{Zr13)YDbLo)z(&{qkE8Xr~K_ zQrt4?QKEC*F9!U@o8u|FH1kKZCD4?+Um6TipwF7lO_0Wi_1POmpEb}wOFHfBK&SnX zD%kZGvc89T+-^8uEjMemFpxiq*N0feV=abHLmG&jdLPTHI zV{PcqM!ZG(>{EL5$UMa1TvNd~RnPT!dA4Bk7SSA1!{zb+#H^xHFIg5K#I5-opu z%W0;CeI)1{6&l3~HG5Vhz@h{d1|g`wy(U^P?HA12S5$*_(%{*HY!%c%`VL=v+u)WOo)FBg8GG|J3r*9D5$ayw!fbjb$w>T0cT)Iel zT~gGO$V@Qo=ap+SoIn>_Qzq=xej&C?e^!_S^7T^qH?AZ+9nn6~lZa>R8)j&~cu(}C z7jy}A{-bFhN!q8xbV5(+f_tGSH7CMvcz<|BRGy9KNiBh%v`gtp8}<16D;|$+i{+#t z^rY|!>ZNR77~k~oN}ZPiHED-ZlU^vQNgG8?I#tL#Y{d63ok=Y-KDT<2gsB)8EqLqi zK@h=Fme}KgxwI-ua=$6*EUjJylMBYSt3i*xZ-ie@)xLplwVx4oKN0YY`oi*;N+{@l za$&=1_M%|3WG^P2->u|UCzyl@!IaLsD`9U;+Ams8qEdGwhhY_6bc2w^I&XGI6Y#os9=gk)Dd zEwdFrp?&YSa*L1E8vF55f zigNt+>KdFVXz9(-W&y==jOI$ScYo5I@UpaE<-3O`+0)xyx zCPSX-M*bE5U1+E>f3Ya@f8AEpL+4i4%yJ{2(%m`3%ttNPXsn`UkCS*`RMUsA7Ys$4 z8F{Mqn3aEPxYhesJ!bv9PQ@?kZ5s7W%?@!ud93fD=1IWE3rV^Me~aYF-6`Q%OIp+aT-F{PcO=J95MR{u#U?POe ze+V6RcdBui_9_2!sAjHSu-v)Lxc+*A=h+-~Kuw>b+<05&kRO4b#V%p?S%N9MT{QJ7 zF>luVA{_D;u#A=b!Ce7yzp6bn3TO%L_*>9M8>|+QSJ-h%CxE@R34bd(+I&fV3i$cZ zaz!2Y4QRRFzYi<1Q}63=F%}=uAoSk---7-CN@qUcGw(xXd9>_SWzU>Gj^i}OIO4sg zc1^E8lTj)BxY!`YmF@k+SBiS4ENF~H|1m~T?BDw{@BGDrivUm50|ctJVM-{*;N2Qj z7h9#%;vKE{f29e++Y6|OW=>Zun<=W?JbVnz{$ry3i^C{*>3L&s-!sg5)iEyXxnltkLa6P`+(5~McZ`H0NTMa5XIYqx3}6-$gZnNf)a zVFc~0&n>^me6)L1aefP}JQ!^{S2ddPtMchX{-?wz&@jur>U>j_$?cKaf%zek0kRXa2Wt$*ib^c5m9-rV zkWhv*BI$fZY-+{H>_&IO2>ZH7c3(K!5ti7kH!<91DhWHRy{{+-v4gbLzomXZ5}w&y zM8Z-yUc7U~mn95{An8n34RN2;pqvf%pS0sYc@#IDa+tJyjYcpX(Q56Tmfh!7o=teo zN#QctocXkAA5=_RvVfU?9fy;B9BXopJ9Z?M-&Ru!DHe{zR;x|3xZwUnBUnef4;T<$ftVYt5z8spqw|l7<_9&EB-Q>UskC zf{S^;$_kLB(C($|mX!TLp_0BVdr$U*LS{X&eiqE3mPjZS|6p;|9QSrr?ZWHuDeUSpSjkbSEysdTb2-Z$z;Y zp5fF~6t&Z&JCjVrH?%s@yDayHvVN_yMm?w@dlSRuo6Tw|CEafkA8_ZvJ(NM`YF8g4see{kA+pt zk3Q~Q0lvX1jqyS~^(OF$k6T zEP3aR=Q$3aSPll0ISVW3bKzvzGsD<5cebjkaH)Gp9tyuSgW zFS*t7J~bIWSET~^g>ebgV{DTubOp8{Y#fZf2UT32^}ViC$LsA9-be$~U<4{zuB4w_ zuowO0I{F9}%xUutUoT392Sh4}Whyxmx^rs;7f_w#h1q>6=dQ|xY&YoC);z)!*l5yu zpwd1iY8zuB=Fzis9L~>_eaPO8y9cgtQUz$X+pi=X0z4S`l`7JFIM#t77VQxCRjO6g zhV9YqM!aeH*#|w&F)N~t5y)+C}^h4sczq19ntFdh#}?P z**A3V6o0_eor-s*@eiZh?e+c$#=Bn<{WiY!8h66k+FFTesALc$z6*D;_RwbpkI}Z>LH#lEV9G<+yO)+}^?R6GeaoKE z;!c>NwBaJ%8uo7G6*v*yEr8mICxBgP$qmI;leNtPvfz%+=eSpurNVtOAO?rcd)S-w zW#xvaP_8tt^i*ud?g`)vlH3$BTob+aM%+JRn!^LWJ}H5up1S`Os3eK;in0sLa~o)XO9{m6N17buWW z?2Aa5_moyQMwGVN=I)6~-*HAZx{JbuXe}EE6;xPyhcJkAKl6)!I= zF6n%|(iyGQN&XuPXKj?nc(5M&U)*Co)spJiq&<96o*r2?5>L%`u?SM+Z>2!qXf=O0 z8-2Xu-c~XJlC^jXTFs~@iZKaC@J?&kh4`PftYp+0NEDTIZ{aiRt}fDr<=p-P&dl~C z$$9u+Tl>Hi!bz*|po&F+YPaI+Digr}JkN^tlJVEmm$?sw<3~U>KxnB`L}qZyOB4&2 zrxynzXI6zy&RImq`5+OAp(#jeUNdK-gnQ?L#O~dJehRZ;tYoV7Lfs^_QMcNAldNgI z7pBs^E|?!1ZLF!cGv2mzoT-2VG^EXZj4?gZ{i6o^z32z=mkk08OULQa9Y*w&Roh~} zC)kUAAddxyXZPdK`~Lh0laP)w8tn8Q8EM$7b^E=0e_T313q;Tnz zYogGla!lb5f?a~&J!W*1Jy1qqy8^IZ7E|*yd%QRSORFpV z2cT|&%Zcw;zPf+@`{9Z2SaI0@7VsBULG?34zO6dA1}yiBxGy5&UJ$XSfqdOr6p@sa zU6io*h={`!sfhJzYepjlp#P$s(8c>uyhVGckzb^^_@55u{fQ#xj@YSJ?cFxgEa6-T zEg{cPYg5k6l_J*cS46&bL_2VQkhT8#u(lTOR4BfE`N-&Ym@BgGy^y^fQ8z5!wtN)H z^c^DSno@4{MkC(1VreS=a{2-_ZDzXH8>DgE`8-fj5<6YY7gBBcB59e#}>07lm6b)AQnyP?QWigA!qo(tQP zKx8p>=ugiU1uel^a^uePW$#T;&&qDBkkq9FPb_C_H9R%ljW=wJ{|XQ;Y_PJMDhe+U zs^-qhVt%II)+L)^E`l5$qt#pZnd3*bwco?HuG@Re-dFT!FKONhHcAv)wfgUop~TWq zJEvp~;TIJCp~URGR^-mGlp7&AZ9Wd!5Bb{FyBqJgop}TC+T;D<7<}~m{rp!6 zR~W!PujdQFG-WfdhOsEbPxm#Zy-2?fi0{$u<)VC$Tfyah5r3BIWhJ8#rU)8lyOHPR z4k=aMm$|n<*sj^EJ(^TX(7WA}7B&>N7GA{YN71MgmC?j4u}jG`Qi!-uIU`#TBUXHK z`sMp3;A{|RlJ;gx9O95{6Y+ae_(iou(!_!BPDDcC1!=Z>iqK7gXE*Z9tlf%}^*OxL z^)tE6o(iW&@}RsYq}9iQIxotal2jI1Px9-|q8c#oGNU_FF3bY|$>b7!Oy5|@d|ZIX zp`-mc4>9~W5BPfBW)>!ut?cw1%zsHZ-4Q>s0=;lIgGU`;xoisQ@f}M?C8B$v0J4E( zr3`gcXsa)Te)4c_!RzNlDqJ)sKMOKzwnBkyfWPFuSw6 zv=4`OX5cT?>VBgt&#kTyViyJmVG5n^f>@=TU8&VQ0&3uJh!NKm?;h&k{5J3IFAb2R z|Bn=Dka>w6tKY?Br2oOJ#WLQ>G;Zt@Jq6FQOsv9HGgwDu5#NB_oc75>U%L;-@nhn5tjNp#sldI8^uYBHHcXhA;tUA7Y8WVzfF>olo)28 z5W}7aEzEDlK56q#&MR4E5)YB34z>S~NfVCuQ8k@`SvDKz`^cse|5zmR-n?Ru|Bw_d z5t*2J{Sb@>f}*jf){#G%qOc;hMgyY|+r7w%-}u65g>Qi^;Oq1MnW;+Jo&FRMqF@JC zulOJ1EzHIL25$$eo9M3xZ)L%!KTTp!GRXTSh%JdClO^t2Gob9t?N#3Gv z|8Fu0!2{KCKd0T74i!`Xv(m6Tz_c_8A% zCF7st4lMhn6w!7R*uIH&lMy=^ZDPl!R(A#bB7uWG<=j!p_!2SpXHC?}h^Fk)4ggKej<4Xli5DRd-FBg@0ZnI`7b4_$vq?k zFy5p+biU$Nq_(C=&R4Dj@fmsluo?owu@l=RjPjADLQ8aa{M7QZq8N0fF^oKHpGrBY zO85&gAygjkOE=)ABl}7phS5XK&SRbSW7Co{U!R&4c%AJOn`d#VQ+^a4qAs|_M$|42QDy2aF6CEaDCky{` zVC;j2dc~iDq0V-Uc%Kkw1)T={h&&Q{+S>Yf=PKDq4l9X4nA1SZW8R0jNQdHhk%)f)?2B<5@_bSB@oNq|9 zh2)6(x3#(^hNg&M0~a=F=;tS5Z$mypa*~$O6zh(H$yXE6R}=MbEZ5Z;7&?=GioBEB z&6X2sw0iO0qG-IFJzhwk%abiUNroG(?8~sC&6uR=C8Q`BHg3bQgjE+Z=>Sb~-M1u1 zWUu!#VU)EUq!cKHCGwJUZ3Q}K&ImV=?M`7GE&Of5J34Ma`;Pu_g9N9F>(eaRR>eq! zdL{F2=lnat#ecWH#JqIA2tHmErC3fNk(KcdBu%gO9>W=}mQruh`Eq59?52AvQzQpR zn{au%-w4Y(+*u+T$>hQ1s$Wt=rYoD)6VDMSjke;DsqNIYpXE~VceO_vjS-Dv58$Hx zI-S&^(*6|0>yp`ankn~#!K?1z?-k|YoJf%g=3>yL;?HSy+ZADgNgSTHlZ>Gv`<>pu zp~hLYo1A%o;9~^@DfA>s;L~k1q8{tXzNLb_Y_iPAVpi7AXw~0ot18@tL3}!769+?f zQvew|^s1*MSVtG?m=(yvM%3vx*xX>h0sf6S?nulw{7d2&$JO?A66o=XD=#ZUO4%J+ z{XZ~ar}H4O|ND8+?%x&d1^hUYqA5BG9^AmM>7A>Z6kq1N9N8-VE|!ZCZBN8@C2RB7 z7yGzcrA!>(&AOU7w0*bVAUiZQRJ_t;i}{G& zV;j^wGY|03SD0QRTm%7(7B$6B%QW~J_%HHZ@0+|B-WL3W1ZNGI&ZL~IMQxa6a3UQ@=y5{=so*}lX|V2Zt+ zP4G2&2{eTzM=%AnxbPUr|T zMqr6bM@-sg+MnZ$ZL|ulv!{_ElzAM4-2ZlOCrJgAqfqzRL*9R1y^rMv;aBC~EEtp! zFK+X}$?$iR(Vipiz4g0uNrrD#>WxIGZ@A}DoUpPzI^?Ye=nc)7SHE2cz-Ay%x&{W8*Z_A7k2x7o+MPB80G)=R#S(N)U&=2@gfDtVwM8ZRjL=o_^Zomsj{wyrY%WAtKDTpF*LiR1^k5GCvh=Y?A!^G zx;HTzwV#rfbaz68*22xSXLpK9Br{Ht-{;5u^l|^*)M~{@){|cl-YVS_1ql zyesw72kqcTP(DL!U6P5!TQ-2Ae;56{BqvVCk0dW~q8Kbc&>qQ0g+5|UM8_fI3njzs zCU`81E=M@|tgc2GnTCwq897C*C{UzweeZ4t*0jE3#uShm({#sXv4I%$C&E zMYW)6BiWNF?JvouKCxEVC}-H))M*Z_b{LBVKN@#rfB557>$l`um~|v}KWuUl9F1`N zYHem~Hot;gO?%W%)WZHk0U1qE#hh4hh5~0N1cxTXkECZx_NhJE;2aODwvQ9A5DA=w z6>E*Q%KkGwo?Ch;=~93ECpL54jH4{_fxu8SMEXx`m;y}){0=RscboYro3+|ZcF`cX zC)=OrjI*(M?+mtGN(uEKTP)Me%PfHeaC;yZlzE;LVOqq8S)l+93J{& zh(10vo|$kKh`nv^z<$>1ZUdRJl;juPSRK@;UvfjRoW72AxulXrv0~n%5qmw_JQ zP5PPPUNs(1z2VLsU*MRpEA7-lH}VlV5AHO>QO;cMUsZqjxms0XGS=XGOt~YQWFNP9 zLgOD0{{X9O_z9;ciuz1Qp&heri{y`-raxQu(lEXaoD!ICKE@`77r}J3ki5HbLz5tK zkR)@K&?edL-(nvRcEO8IAMIo8c1fl0E2;FWWlG&UhXz9fdM1e|tk^VuXYokRBU$D+ zt6Ge&F7K+(DF?Ky?3Y;Koh+y>|7vEc!Rz>apvRZ=`=9l%N2qLGmv`@<)f()QxW&N% z`^$Tb=l*x33H5JCek!^P8w@#WRD19tKqjBAI6rQB#wo+S4ie@dtU>8c52}F`qp-1` z6=whgsQy^`LXzF_0)pzC%F{Uw&qDn;$YR@4c6E>UtJjsksL%dxq-B=M1b_==E*eNW zm2)~cW6{2mP%73%DHpZD+loEYy`z|4nmXuxmwUXf2gMy3kW81Vf>jf#~CY06)TGsqw@n5QS1__PY~;d6svJ zC{t?au=f@2x}QUqW-d_aHeMcBPOFOip7Y_S{fmo>l0JuRVPZzPH8UIzKUiFu_lDb> z+%KZh-H0kRyCNNlH!Yh9=VQaCE^@fgPTD=2FyP&>ZQW-{oOz4H_; zr3`dDp(g`HX8~>4-LxQ^Ll)@St{Lg|`uZBM#|tv=B;06wcDFZUb~x1iZ-c=_z8OxL zfkJ>DVV9wd$nxN(!banjGlukvBz(ZeuK@>2+IppF&#WAv0<1u_{-C_8W4Xc>^51JQ zfW`O|<50LqV~kB4a$IbqDYA5hh%wv;ecF%Y@RWh36kPwe+hd2^|0#SICmE?qHeNEG zfsbWsgL9H*$Bo85cGb)1294+cZTX7^+CPu>$H)ZCUbQsWC*Q>=Hs2sRqrk9v`7}`_ zS;GU`BY~lK`--!r9+tTb%ZYG8Xm6(+5L{R>3IbUPy~7a(CINWGEwF8Qm2w2+#e|20 zU_+4sHIf8EaVb4&5DlO!s?li$dyZ&k`K4;dy{N6yqwx65DArG|qOe6V{C5SOHtk=P zpF-LDkK|;3Qpvu0K(r_J!7zYWOSDCdpt14z(vLz+5Z~u32=jOse~RGj@{%P?9=CnM zJAbDTdcJ#?5YW)`4h_sIGNox)Vrqu%338f^*gKprqju#=bnR%gDZYEzILX6F*&BIc zdt?_U?DyF5icT7z$B96jMAhP8iA3z3l=D?GO`IDlmfR-k36l4ojPFlh7+3j+%g;^L zZiVm9aU#!=j{0ITEZ@UPHk)yEb0&s8az_yA!m95f%ypW@S>$`PR@Xz*(#4}e7h0X1 zjYuw*+bj>Ho0<>xgJkI*MgQ(1axjQVEdLSg16zkAm4n@@kzaNjVQqM)oP6}~)o2|O z7@VeLQd9Q?$uHbU#JZS;+foYmeuM&qd-tlfE(uOSD)VXWJ^ATkdy?NS0dQ$=Y|x$x zANRMnLq#MZ=t?3v z|4A(wGl%A`q)p;b4BF<*{YT|RY3ROhbF1t($pAL07kRH^lgc56i)16t$E0s1{}=z1 zJ`f~=o~}`gUnHtseg}+JP9f`kT4%7xAYg4GZ%u!KLsrul8SbosoKOWf z^Tt-o!Fi!9W320NN79b82C=k2Y6Rn?8BUQEgb}oil5*C@!P44;@A1UI23O{aB>Ix% z)ZQog3t+9SkCWtx@+mj{7{Eoj$&d}!0iN4RyMCjccsL$zfU4F`DUJvoz_h0-PKl38 zjDl?NQ3clTkj}c#XWo~#_W=^;v#1{Fj&$P86zS@9C6|jDksNfd^s6@QLHWJ{UTP5K zpQ9ev2(Gj`Io&0`Ra<+AUviXX{s-YH-a)?VOT3cjs(g&fLr@ESpN3a|RM0QcG9`Mw z$Cw!w7;a+D=QWr&y$YTd1_keZ%G>awNS? zM3ID3sq@yNO^j^KIY3IkuEdLoj0ekB)VlT19cA$XX?0uZ#O~yD(`NsBl#}@^HNMx7 zolVmCT|wjaE5+s;qp}gj;;_X8o`usQQAIwW+nWiR_etJRd&(vqXRE(SW=U-_*r!vJJxt%@&VtY0g2p`dRWf;0+T)#SP%HLg`6x<|{B7Qg->Oyo ze1g^D4w?B8&hLX5z0FU+YvvZ|9*jKnb4FT+C>iZ&LwAE)(JLs=8T^!J~SMS~JrDH|WA;$z4XY5PT1oNfa$5j@ApL9arG~W9Q zL3PkhffORy(}9;_{$!kQ>qsnm)*Id~i!${rjyD3f8;P$@Ca^li{~8%cK|LAJN8-)P z&ov({^3NgTv5&^K`77x~;)EY+{=DD9=4nsbwQLTdq+5FPB_TJqiz%uXkAr_Lf0R56 z=DWp;Pv5B3ACp!EOZRs}CIi!Q50p~eDFz>~kNRN>D!hwk;;#tqm2>5Uhw zcrjovvh&>UJSn`T4k}>Hucv6i-^3%uK}zo5qFgcqueM4!+9Vkf&rk=3tJR66&HgFp zemKbsqLS?vr#As+2hJe&y1}-k*eOI9Q_10jiP$M!wvHX;)DkUql+WI{okH)<*DF%Q zz=&8LP1x@m+I6p^teUdp&&Tht=9Pp3ZOvAi^nQ;*!WlA{MOOZeVTou@GW;g0<%;{Y zdhw&Fjn&j;b8?tn5aEH8A$ze16*2OP(Gd=zSMw^8bxjctlG&;uCQh~>Z_oEGgeL~k z0KCPefJwMXxzlBpVQO_ho}|tcN{d681RuUcKwy{D+>5+zSCU}Ip}JEPR0^coE?b0r zvGyChVJHubS=HAb{(#YGb^95E^ynr@m~lp<&{)LZ;|Q+seK+gT-GK{ayjn-j*nE-= z??~@_poC?v(phQyMXGNn5h8$zcI*R%X75+Bra1yG%idkLhU8DZcaIuB3p4mt?m85s z`j!&?+07Z>U(cQNNAKpa1Z^~GKNQ1-#76w(a>Am5R;!a^?*jN>Up0V#`zF{oIU}|t z7#FjOFK2)P<=#TGD(l~(nuneNlfz<)h@2`XicIl(WX+So9N<_oW6;N@!Uv`Eq`RPy zxm0(rV+qcyAeHa=itcgvD;?}%TxlFsWzUxE>r930gF$2GL?ZyUvhNpQ<05H{=uu!F z$G+UIWSBOC2~;LGDQ(_4g0f(QIE|U(0UBuL=+yKmQ0V`qAO36<%vxZ!d%uhy!$9Q6 z6z?&1P8dN0oBVV7`3s2C>SWEb)cx72m6gyy2#k4mQN?6i=(mJjSakPSbW}jZnqWh5aYtV_-lyXVPVXr+QM+n04 z)`&jXf0W=eWLcY~qXf_Yeo?lQv}8FvFXpSCtJVD*eWut^G%0(ske;AOrYK*LFSrKP zHb5QAv&WDO`(7chX_=7r@K!oVVUKb4jFM`{6YLP_x`++K?%3(14$m;$$c5f}pP*+X zr(_d~(po3UcivBb1w*`uE1AbcJcYM27117&&8C)|bjY5OW0TlxQef5?@6O<37QO8j z$=!qV>Oq~#t4}uf5$-Oo0QtTOI$&mxF9Hz#*5)*U!_gz07b^z%VCV54g)Nn~@VvWb z5R%w^U)*qldwe+F@O32HRS!a3eM&H4A1#8`!O@Ck-IHWIYF_){k^?!4fOS&CiZ^9; z51xYa*r&%7u!(U`91SyjISx6m3rueq?88>M2+gb8rT8 z5b-h}SKC;hLdGjOcf|V(QzSE@Oo;bsD;eHz2HzdCvXN@e`p3Aw=iN&XD)S@$G8Rb5 z?n1$UG0OOw`B1?&NOxnAbTjv|*kERFU__o>TCXV%`l!2=DS)!HIyrb-QJ3f~LRVsl zD!THoQiK2%zNOXer8bA6k#WsMfBB7+Z&u~=_-6x-P$a`U1RKzd(q@Dbz1ypxoHYY* zL)}{44DNN(9he_&?I*b*Q~tl9bAJr474VM%gH&288waQm=q(?DU$WvA@YSk3D*Odp zFwO`E{Y74YQF5XRaF_EGn?PwxiKm#UbzT?wwdgIxOgUeKT+%XuOyxzLAcVrKk=k|X zzf;ZOMrl&b{xrCdl%atq`U{<*3h{t~9AqG6{ZG@FQeo*)=py=xw={d8rOB?&JjWC-UwP&`mp)uT45+6mpAwNhGc4c=lheB?-R*nd?c;+ShRIL?&t#D9bPo+!KQ@}5RUJ~CG2 zDj)Xd^Uf;r=)Hxl-nV~@(e^K@lY5>9E4QAev4uETLm)7nhpHuEk#-rX3iHB5+C7B$ zR8npc<@`V0lkN2CASDHjJE2}c!-6mKo|e@hV6frgu=i_xrcy3|3Om@_$a^#Utm-6` z{(66ZE{Cb%H7BjBM%wcJ1xum`lSuig45q&hANFJtAW` z?7cY&t7W7hs@Q=%T=amvd|H+7{^wwQ2mZ@aJjGoC_Q;iep1gTO1Ui~uUy3Fo-Y?!R z1}_Ml?)ApePd}c$-UGa={Z@6v;;Rl7!N(|yp#ah$?5bYaMo}Zz}wRO&%Pz0%`TOe?0f&%B@JN```%mCs-bEbfgxI`8N3iy;!F+l z#5vT`+l@;`eSz`8jUv04h#QjbQaN<=us4&&s9)ccJ%6gH0j1omO%|KyJgHX6 z9h@t~6D;X)tA1=_7~jVLk$Ug2PlcTv_}#Y-#mX?EQzz zBp0jQlS5yoeoQ`!$N^bwwUE=XkPqghc5@Qj+Q;IXBhi2)bLlk6#mS1gu>i`HNW1oR?*jdX9BS zvcz#u&Kie!=8EqB3(5q8kwIh{WO?v8O%iX|;#ap^*iUhaBt7YBBBBYjE!iqD8M>&V zwp3RQANH={wXz}_)bcv)m9riBeCF!i4DB)O)Ehy2o$}PSfNU?IW-RB+Vo~K%ElJ?7alE>;n zUoPjCulPN=jq(&aFf0J6QIbjnc^kBMMzOs!rK)Poof{s(4J8MBE20-9opC$=k)xg5 zQAhqI5^`sr;-osA5B@~k+WqzeXkGcj=E9aa+LMu267CJB;HYv%j^@wE z5m92pHx%@L7&)5ng*6TIaT@=*3>sCR-WV3I)E>%Gx>O*^kwnN|MBHV^{*}BPa;J9(n|_n_ zreyf7Sp~H^qlNGp?Z$K#-}ra_)WYUd97Xh8p(wPD!j>r=jC{yK9kUy zTfR&+Oc3aZe3qmt+Tz`Mk(_b-A|`;Sy8+ef;g;xYnWtHA9I;q#Jw~Qv(2-;^(Ux#8 zLZOP$u-4EW%Rx)h8R>afJUxu&TJT&FbI+VB`_Zl1oUC(92GZuIH%s1p2_^QD54)X$ zbymbKNRUXJTmA;rQW(q0xJw15aew^hNN6^MffB`%DgQNZ8P61=p2emezRI(lbFKs2 z%Q0T0MRkB2_LK(CIF}yehy3rdMoqlf=R7N`quIY7)>2%>oWJ^Kj*!?ih=%*Wuej>q z5~>rLL9P-W)!Pqd3s>45@PBQ!MCZuOHKO}H@lj+?&MH20z8x{*-^Pd;tL8mZVV{6i zc(6TogP>tBS)y)jtdco-nK?1-$oA5lY;v!~Av5kHk48cqj~RcTDlCUGjvF92Z6C%Z zG?~{I@Y-Y(fSj#e#r;<9nHlbnct89vnVd~QLPX|#-AxcIEb2`h6ecO+YJLp++Yxis zMj2p9AAozTWK^YLy$6zHSPw=8d#-E@MVL>?7S4zHPWd9F<)Fxx54>q2h#8E}W6-gHC<5&`gx{l%6&=t67se*wo0DZ>97k(PSpUa2hF4!A)>g z*?(2VRf_L*;765oWog!$lut#sutn4YRBKXuauT0rh3-pAlroAo58l(Luq=_+YqrRnQmN{ATrk*HP?4yVZhN=q9`Glt@4H zvS|BkIUSWvrs}0s;XVH$Z?j#eI3ZDW+?tFEAX12cY`potGfj8GZFOgskxO?}~cM=K3!S{S* z=;z&|t#&m0HucfO772o^;FKTE>Pyv+J(YPKC1{Qu?8q^p=Ct{pczMgh_nk*#DseJ7 zwtPaPTN74r+6jU`oMyp^XR%{Se&Y?@23;rJk)LF6Lgt;ZV?40p?WBs{CqjRxI?>CF zx8B>XzH~4392TcaKwXBrR@+=4 z|ATBs44NV1+qifJE@w5kx8}H!uVOmN*koJ+Ar3EAFVpa{g58S0eDB|q@m-4_7ht=e zR{jccy{Jz*%LhFPPIU%KElDd({Q(rF4M%1a(QWm<&RBjU)6GZixZ}g(d=?YJ9L}@A zkC?38U1*+dPuPQivf70V)mI2P#Jhd*B{-F?uaCTdFT{;lgg*HIV>lV_uv}wUc=0BH z>J*2@N(e*pCzh(QJEe zt-UXs8u|tX6OI^E;+`eqnxw0!{@CM8W6$3ABz}zF>V2Ey%1j;GsZZ%&k z=VXeM`@{rsY{GLGX-!gZj!@#!F%=mJ|g@g##*bKN1maruL*Zo0BacW}Q1 ze5NfK?J?t>rgkl%Yz9aE08Vsi#@NFqR_hno%uZPnY z53==_vB(KgcE;mGsigDmF5TYa%*V5pL9gWF%_}J&p*lV%4rtQ=O}mD3N_x8JdSqGD%rW-NA#*d$RVn{AjotoYKG z$ea{^o*v#I#x`HF=0q+toD(G(CnrFP(H`%G#=txKAw&}=_Tu&YZ`3Czq7GT&8OTkK z@4hCO7v;EQ1E}n?lYARIADM3QQLp9m@sodurGs8yoUmpmb5N#=qpocdoyC7kTuyQm zppS5xWIs9FeTz4mT|}Hl_E)7}z=W+oi$g*Fnd?iA2Wx#v%%e@^z|=acc2CkB`3V5BgzB{e*O^J0Td)xXa{_IRodVPerpm3bV=o^WV918K@)tp12Mi;j;RUM3DGhT z@+?0Q;uczl8~Gd_74(ZrNW%(4K5~O@u=zT^Myx%vnf-wLJ)slwZl7hepQTcbnU*M@sBOboQBJbnhmncADk$CR!6|QRMCH!wM>+>EX z$)8tXE$`149{L%|D(8rr_tJ6aQ`l8Oa5BM%AHLTLu(+cP_Kryw`ZYPp8^14uV{O*r zE1WRileIGcrW5Qt0M-Y4q|adzmQ*@VmQSaulONqci-2zxJG+W9Kiajz5=E0 z)0E2#gC(bZPqG)OZFOxe1sSHVka5 zEJ9Rlcc9$&IWBo&gAyp--M>eg{JZc?b+5dq-WPbNT&MCWgR?-P;;a3@ZaF&G2Qy^9 zibQ+~{BpvF@)Gk&-@s@j|>* zMzCaX#?I)Bq6Lem(qoNUTeW(0BG_`%$tcrdkha>^wx{=6dV0~*Z>xCE1xNtJga`!i z62Qyej7Y#r0toYaf7aeJnM8YDzw>*2|M>YjJxumqdtIOPtY>Lib(u=G>z);eWynF7b}*+ADj*Pw>Cp+P$^! zCFI`U=`<#Mr`q20kZv3C>fGb#t+p4mY&-1tHtAqChkxR4_K?NWF87AC^ien!@2ko8 zCm9BVTm43>?gf!h=0^OE-?r*>2y3n7kQS}ISS^MfgYfSDR zLXDmVDPZq63EYjBbfh3@1T)u_0}|+lTEq!(Z*~&~B%(;MiBRzTS>+~m9-8>Q_Oq`d zg>9QV)XiIBrT&YynEd62Z>-TD1|3`5Dfl&E%d0cE{uD{*Nq_iBDv0+Zp{t7|H0fKV zBvkvPVKCug(9jC*&e8Ng?Q2(PF~Y-~uN(3XQU53D<_YL#IY!4}_R}fRO?a5%{=F*& zqTXKn3GnDxJ`?A$%k~)ynmdp>p?2FZ@f{jKfqfT-)5jm2Qw=@Yt9UzEbvqekICCo$ zwA=N1^1Q=Wg{pS@R|Wjm63q<|8c@(Wr3B!}7RC>n7Y-T>}u^v}EJ9{=QQ5ib4eEk zNK$&DAaj&gj^r)qB+AoWxkn5?D$-XoL9qPSuZd;$pXRu91|0N~%Egq373gjIA2mLg z-a^>h^is06%v3JF(lPNIrHqcr-IgYQg=e1XCC9rUM^52a@ZQITzDSPe8Aocx5!wlO z30nKPUizHcJ3SJto$s!f$tX%*0oN-VD3A_t!GwJtmD(M#q93x_7e|Qb zX0g*<&0i{K6@)qAI&CjwoxfCAVE2*RPkUXhSzqtMa=<=jIY-QM#r_3nxB(VGNkGda zfq7e@iTDQ*OdgdFFTLZW*ynGwzwY*{b|}1*hJhLY?t%`IBPg{Wj<&P(x&39@rIkMW zYb?=b3jcbUdciROk+%uFT>@MEA1bm?agBivYw0Zh6>Co0=eyJw&y-n!yml92Oo-GHYiQoBMJnpYpZpl&8sy(K@b}7HtAw@G4>|DVZVXQ37=5)8AEaRC)Cl{o-n`0UF?4Q^?h|A%sz1HGynWB!TS>#5E@+lO^BWkbGY%=(0_s02W$|;_kTbUA%r8_zPU#rMj zii1{sDrv|MQPz!54a`T;{de~_@=dV3Am8ZjrFA`33G~>&+5JZ!hh=#mL z!9aVs>NCULo2;mUkmQrTNWHx(brwF#KB{!-ABkI!wamRI7tXbc&iZPIC=E@F6>km& zeAW_<3L~`}M!dzow+#2MKpvbA4o_F%iz_$FB5xaaJsf#vX`G?#LLY19{Mw^WefK@@ zqmUE?h3{f%)KywaXC$94jX8Kz)dP^v#S9y1{EfwPV<02HA`IPgrQ}#-#q{73q{-dFH$ocR!i!s zC_Zt6zBY4EnK`@iW4-z9jkI$&f#J^Bc`iI(MNyFBk@G+0Gj;1H`5g6gD4JBJJtoB| zuCS!D)H0Q}5uD+jP-78%Kt^xN+*xjRJ837CTaN<=&KYTc7dd1?;Ee?*WAy0WgzmgG zGOo%MVSHNyyIgsxmkDtwydUg-9blaK7izaysSlYJQ?W}oX;7jX-MFB{hoouvN@U0d zr06a%v8KQnYpL#mTrdMWyEh;l5$9X;b~ZL4Pfp-YRG(`h@oEUKG;Ut`uG4+$0nA$~ zCKXzCC`!HIfKx?=>{H|E;a2K$UWNjnUvL+7yY+@f3rm@nsk-1SJ>ksso#oD{q9;@y z;}oMoFvB8KD8EiH#vKXVvF3HiVWuOI3jw9)D5&U`Ww_g$?~Et(0XzFEh+{kz70zQa zW8bG|QZH)7flVq8O}?f)aU4)is09S%BtI^KY!MeW#B?aTQQIW{LKpLs+-JOVaAboF zkQvYf*n72~RY=?}pvOGiqljl8M?ZT4s@ehhmfYKF&pZFCOAxWpKBJ-NO%HvOFhxR{ zua^rI%gSKcGF}niv=;x8p9ZGtp)9{b>37|9ueVqu2HmuXXm}8;=3K*4;RZe94h0Ch zI1}8*ySD~bhpgC+97@7Pd<$FXkAr2U1XQQC5lU25(E9PpFQMv`s|u7-ZR8ItB|nSO zCoX-tJ;}Yshb>kTC9S$gWye0Zu)M7M&EWHVm3OY;|GDKAK#KlZ9(R)rkZ&e5pa-F~ z_6$HVj2~X&YdBO4K!w?oIMa-PUmSMtb!>}7`&Cl>6G z@YhCmLx68sE}WA-V06xz{K``3Yu*L~7Qe8sgSio%!*&(wz`M9 zT!H$j%#Xq)F%*gOOe2*Lho_3u#AOe^dmo@=5T=2j(|4S628?b6oy<3dsDS^ITb2iY zXCj1AAnD}la5IVZ6 z_I8gZ<}qvn70kJNm!XTqUNhYgHx6*_`b6;1>w^#1RqLX~6$+(vBGG-LUoJcxQ#NmF z?*C|A@A-?XXNVMvfR?usenPtG7wlg$08LuSfA0EM;kM*09|R&|ILal25<2+sU(i8G zW&AAMe~2S0#ztR0hV3qaoO~vZ3qWaaBm{bmzn#gGtj(-kC3hFzX7l{9@wVK z_HX#}mSws1ed(c}JU`x;mxPLh=z++QVJ_R>69g$nm+T?Cb@yTPwqIz&v7pYNa137(#CGX_e^j#VQImt58SY{ z`SGZ4Wz~jg)s#xa8XscEzShgQ?vvp3G(CCbG-pV}VnxrJ`T# zMu|$|j(`US{3Zk-FtHoRE`8+|a7nw{Q@bxuPwAmDk+Ac)kyk?UU%?;w$GC>^@DiFc%gIATmGwMUk8(>2tJ=rj*(cuEP1my$ zQ3`D&X35N4sT07Fs}k<6f3*w#QLp5%oM&FB@ycM;$6-H!ik()rjjgM=q;FLqUGh7g z`K;7!lvP>_A_L=@S;VCLH{80&Huu`>rZZwvPQ8c0L zIO>*#k)(YnqeL%+6}HQ?5iKOpIi4$9wBRXo?@UjVL_{#RGHdZ5hGh`2kxq#a1%*f? zs#MpqQ!03(X+O)s)sOfIt8Tw3KBF?9z0~JNAHI#OqS@Gq19C&rS40C1R^63Uz&&tP z59(;;u}xvt4>j~8-iiertB%l5C~2paJ)IwXuJ{|_`=`qpH9$+RFWlpZ6W+2+5MCE@ zz*s4XopI6rD1JnxI09bjfeI~XHRHuzxz@in+P(`(oEz7WM#gpDh&TZy58Od-v79rD zGQB20wycL=q4MDVMqe$Skk9L@xKugvjVAbYg*}U~UwjHy=#+Vc#8ZtpjSoS+2}D!B z@Mx4p^2fnMmd0iWq@UK8#j;YTKz}Aq27E5#blq?iXf#*{7tvcYH*DsX=;Rrz;oYO? zk0b-T@1$P|K7nQ&)yrj|`Q<8fuSK2-K<=cPr}4xG#Ww64Xn@ifGztBZD5!vzpWTVu z5%DR~uERf&&T_BtuU+#`bIh6mbLVrs^yJLKqB9T6S@zqco&A>7VYbIPdVvn@`q{#WOPxDqIE3F~9}u=Z_%n4BaEoFb2yRA>C+H ze7NVPU&U`K$l;TGZz^nFHUJXEBm$wTjS^1h&LjOZ=@>DWH<%082#pIDL?fq8o>5;> z8x<+;rkM3`9kd!!u)IND=1KN9JRzGH0T&IIXUk;+0umn;O^oF7A4ah~ifo@E{Q_H5WXKUBq7^4@_%vr<(ZB(|wt+E2-nAO}fmuJei zTrr`%Ba*^GC3!vfxS9`9(0G^~PEBd_c_+b1xN|d`C*yZxJ@_-0OI%EIW&{m`=`7ZP zw%%Hd4X!MC(29eDwBU5G9Z-+k5xiZaf!87Zd**7#yv)~yPf<(yYOx9pz-OM-;glLj zx7Nh{ov~Cy?Jw|?Scls#);KDnI{UcM@FebQrVGfMu+t%}C0)VN)D2h=e7&~~v(E&t z9_jwDu&)a36N4Lgea>)HRxy94%=1&3bj_>v!a5!nw%kw#u#zpu(P>JZU`nx`c5ZJ8 z-^-afES&xN*Rwy$;$w1nPv@G4iAT3R6iVTYRMTle;<{-_g6Pr8&0nj)RRylyTC!C; z#`v@L@T)B3&w+ITZ>ak|e`zx77V{%;g0gX!%2 z8KjksuxZv1++X|Eg3-BP`4s=_YbWnDa(+2(L2vo_!Mf|2uM0Jm+2?-~ zJJB!jPfc&N=YWF(^*Fci84Q*KkVN1cZZ%x>eVN>j=7n*!c;CK)vM^io_`^>uN0C2D z&yK8x%?)d&blQK?sFQQceO5{n5XDXz$xN)?zZ$rP_jnLNawh!-C$QhNUi1};$oRl3Ev{r(-xCA9-r%Zlv^3Ct z%zB=HMLcCc;P|t@hI5Jr4rF6yK6LxO3F3E@lkd1sa(^+~s#hOtwEyhU&53(lqu~q> zo=oUufvR~olZu2T{0i{cI2CQ@e6tsFRYHk{pM7bnk4Ar&49tz`OG~UoOy(lZRqs4| z<|FUiv441-;S=&d05s5kEhDny7d#}F?&Sb({9UVocw3Y30}L8OO(ZRpb~&obFjzuW z8#skyP+Z8r!P!M8kpo;72Cck5UivK6V3-=iPFz_4lIJ8h8qc0Ff{lakE}RKQ|Xek>nj8`vza$NtHz2iZq;3B$fa3~YO zrnT0L0I)Y{ty)2+TW~Idxuk=OLI!-Jg#_{q6}h90eJB>F2MkQurJUo%^IJiQ0NHu- z?U^hj=XAG5Q{`>EW0MrsSSCNg*k_MsX$U>4T4SFyLBCeQ9_$rS6E$Nm;@^mY!x(hR zB{=Hijst80y7S=mk$h+GSoEvkeVcg6zgKord4zv$(+I2eNM)BEVO_YDLmFlrBcc>Q zVVF2`Shq>HmvsGQ*(tA33>J)ijnx&t#Vk1xMo4jiiy`;8NKFq|mEmmcC{*s`O|o8? zF{MX7xHy0ZW!-KGc6W=r)?=el@Wgn*yVgBO0~ni(1`*vS37&w+k=(SONXw(F6t_;s zcNn=}dS+mXQTTRoGLGxW)4g~2T6elf>gzTnuCA+3#EAjHZvwN~%AN&hMhK~iC=>*Y zkY=tLJw{G3I3cLYle>5nLDO50(<1a8VIJoegd-(`ZxSjpZGjU|TcI>P(`c>^&6B_; zkjt}Y?WRwzo+|49h&-LanqNSL#_8lZc$KpV+%JlRune_Hs(Tyl677KU_kd(^t z{#^*2IA*?qUSL9=0_bW<>-b(|;PsV}aNvOTz)d<9YBuCs1ldMS69v2?WZZWBMS$d* zX!kY*gBL642$5>stq53IQO#fE_~G~UX20!^rnfG*Q8vV}xskvdEFKZ$ki_?~B8~}X zb>b3SYWHmVk{twXG(Ak&X-}QzFj0!U&9ZV-+o$` zH%Cz=ami7a57KhzG*%%*R$*g4GUBTYYgu0f*$gAhs>3=8v0 zewfVTV>PQ0X9lH|F=!x77wC-qpVrbB&F3?Uw1!;@ji=00Nv9%WwSbEXnYDtcqgx(cMdFbuHa$c?cN{%<<_DPPPRIq zZqHtG7^g5Ix}*wdVC2a|1FQ#Sc0lYPBhM;ww5DxO;WK}Q{k6ZtDN+A|wqQLde4UyLA8P+ zM7}t&>>av?+MnYkQVr-_0Dd|4V2*g#i%Y&#vt~*k;n?*%g9Q&9;gvyTV&Q3I-Pv?i$MIhKPy9k@ zneM9EfG8U5{)h<6_b$S*{!J6s6it5=g7xagZ1_kB=)-i&6@d#lgB$MN+Zz}at@#Xh zmjUt_c&LkJ;+ZRjoQkgI?lYYAJaGF@7+oZNF+!_vm{dvWwP6V_-S+*JjHV#k z{SFa^L2DUt(wwQC7k1|FY%%fpaw7z9S7i0-p{Q;JN4bn>7skCa*!@q&z2^%WH!6u%YTy+5$V@?q z;F%a}XU4DLuZ=Q%4ye2L5eMYO&)|x%YM7?}5;t*_aN+vIh5ZlTjnQ{Z4N!JDI;y&k*8P-~R-!asZiIbic?T(z#?fTj9jxK&lf0E1( zkerto`!{D5=(7b9h@@**IA5b|cH~KF<`MejD2b_ej=RM23rae_;OVkxR$jqt zpW{K9!D92`E=)WM^MfL?^=_!&jYpxz?DPTl!Ur^~4bI!t@Gr`{(Mar0x%-DGfkWd(F%pfKHn+x-1IjHkVy8!W78 zZHdc0FaVKpYooZZXNTgXxt0?G-*rk9UGc|ppaFCbTk|n46~G(b`$eqWT4*%lZ&#WL zXwKd5W>Jh^`Li>G@sPcFx$)30xbz{F%mLLA`P6qx362|`G&+ma*?8mdk+Z~ZV#CZT- zQH(z&wiHiz69TI3(i-Le6pw>e+k}k#Z$K}k-thzD=_Unm#}x>!(QM|*Kk8zJPcTh{)kZx$OmDm( zH}+HyD_$_GY2{h$`H|DC2PNa;<`%)tG)x>hf82j)b2&j21-pHujSNKIL*j$O&!b$5 zJp0Pa?thAORA^4Nd}A@__p~YHXxHl_FKxZxSMh;cFDP^OoPTBX`NGb`Mp8M^oez${ zXHTcyAezr~WrKnc7pWi7^wHu)f=x03hQ48-t#TK>+pj|tyNnLaNZMN|E{JbImu@&{kK7d*^401g_*Wd_PGKB z7_^svAW~5VaOVUuMyMm&U5Q--j}f8=$*{o8niIiwTVo%oznNnnH=nLmn}i7&-lq6R zt;VRI@-CRI9)N5;5Zx+!GK!r*9AGS6$;^CSHl3>>2h$txY=-CtXJ?h8ol4K{G#+II zJJwcKspt{?S5h@_n4++)oG3YCrcM4fUq@Sy>`@6xtlK@fEviZB>%}3rHxk=8pjs`*{?qG;-3_Y%74&VhE%sS zj;5e$H?jpO>Ka5uu2*1GmwGN@oygNWk3_pWK(5J0$8|($QIWazRM&E^qMqx6FX(gt z>DgtRP@zjdh$mzytd4ZQt1ZfrxMM)v3d7J3RLt4=Of}y?1_UHqFEnvi4OeaOf|c9w zE8N9x-6c-2Y*_8=^h3qKSh~h!VDNms#EhE&W3&VtL8a7)k|6y0wkMD$mH;JtL`~S0vKx`TyxQe zcd!c|b_LmU_=Y==U2~Bqm)-<5v)d7LB7pwe6D|>Y))mQlXZ4h2=D&?r0yQe{Im^h~ zHz_dMTJm>Mn;1j}m)=a=26bdCF0pnQCS2EQ=-DjXFQqS;RqhIOY!k$z)OuFCDBFgK zRnYy>{oEa^q|Jz?1sGC>|eK*~9`<#^(l09UU z&@J}rIp(^C;Mm|?tT&l3JG87htm{{qvmEYZU!xwG&rC{N;!DVUcKB+e)W)#9(ho8u8Yj6i zJz)J=5C5G0@o0dx^lrKepFJGQ-d$l#fe3+(1S5!UubvlK@-$X$wgg2VR_>99u zQ#|lN?Q8k<5C=J$L?4lccL&O6^>&d*W)Aj=p%)Y?+H1FOqoP#(73uPGTt_XR$+q0b zDB#koYYFL~mt}2-z}y9~mbmem#Fmz@)mM32T+FQ(cs$)@t7Pp3F(xjMO)OSKX2ay| zcQw^eK0N|{5mMX8gY3zJ17m`q|1B~4HB2O-fbt7-oXzZ6_(k}HqJlB@+TXwv6LOPX z#MR3cRjYpBkd<<#&qyTCN^3k8Gz+Pv$MbpaC3k$m7o?;znkqBtj^KtRXB5_a8y?@H zKW8Ef4nLKFM3nR8+Fp_qEqHY9`PE*?TNz4HrZ&!5oe1`;)CFm_7&3IF;)4BH_7S6D zSN`)t-drzUa2Y+spA!{lnrN?g+-R?#@i0bEinOCRQxxL`ae#2_Gd>WZ2+#(lqZcoD z-~SXZm~Qhs=_{p=FS^aUa<&N;Bn7e?8%C($eI2y@7S!`uuO=1c#kh zq~x)Y?5D*Ep2L_-oFK+CM$J0^k8y$z$9v-hGhw64zMKyWcPg&qd+iLX%@TSsgKs=0 ziiw-x$GQoWwKLSAOGnAjij&EYKG7+q@q;;Lq!>T=IDdR1evpVa2JrciL-q;&YSc$bx@q{GTGOJm8w!4Of zI6^ntHG%f4u=G2ATwMA@yZy)&#bxgs_tz!1P#S+2?iYU;Epq1Sb4%&DfBfN%^BFL$ zcy#>9c*3XQiOcPEP;9QDI4Onuyy0E1{=bSR{3D?kE-9776GlD}PpFd{=HmIW{>ym6 z?_Ofo*^@pG*w5YBC!X;CWBmE_es=X4#YsGLcIhPci9avH$Al2mN*(KwS}hGyd8a16RwI0=><0qoxpWS zSa|j!SDG&E5^HZ=3*!OYzvfNe(4|J?FH(5*NQZ7zaR-7vKA!z#awjS7W{#xHCjUnXDiRMXAmWd(J^wuh9s!a=o6#9nPnw@fvNiJ z-M$6j27~vU8FlR#>0FGy1;h6?W=9c1pJ(&i6F`x1PT^NU{sX-u{JeeB?dnSSd2@if z(i_q?5ox?zahVa3c(>a5su6fRya@Xoz9P9&$$w&>CMIHh#)sSs$tZ=|y`YDzG}IDo zcz+OBzB~ALa4@+NG>lGb$3M|>VtR=z%gc<9E{$fmYP>a9Ry zkX(H3W8@V*x}Q5veqrHp$zt*I|1b5s{VZF=uJXF?(x=ydbghNw{rZ1(xjQu*5`&fR zF)`SaYnAAbVdo=(0fpRz`VzN~|4ZfBX!lPlO?_xO){lP{^`**(C4dk)NP$b5ZfH2b zU1)s}=XC#i#O~TJ!~=Gi;L*g1;Q$#WmNcP76_mfpQnJr}cGW*{O0mRYdCN-HGRKWQ>V0gcTrRB9|kqL?i`eb#^0c>(iA!YPR)Lk zF%$$-QvKEP*vP%n%)etK#-D)@g%3f1!&NrY&@&MHEyGPemiq<%Fx!eLH@?i5#grS5 zlX$`C0o^-e2UXX7i?)UKo0$*n6*ona03NXavYAmQ=S?ky3Q&10b6hmt9oJQ`n@_xb z6X*J<{_x!NC*tSI+A}ax(-lOuU9%b-yj5l(_~=CMKO|jBDE+GS&}&o?&3brdmfNkE z)RVZ)DC0BnTI@6?9p^}TN2Y-1vAx#YBk34-)p}TU3tpdOS3>1-qUk0L0)H4-J#VPB z^e=oIsi|#ElaJz`^Tyn=%u30N5am+`{^4+&#-2!EMpKWK+{t5P0u&E7!Q#~(X9P{o z?64Ajq56qdFJgpRG^UM}|83kA$&0LF9 zQ@o!u)wD0E;!f4@IK5Lpf`KiV?x7m%vI9Gr-uTg(;jbg7_kH#tDw4YC9HTacFPrC-k9XM4O)e$q{j9=! zPtWfB+B_icaldnh=3g=;YF)c>Dy)qzI{$47u+=1MZgpp2c8gukdv_LQb8%^OPT^zP zH2SnwLuGfHW?3DGS52?^M2YGBO3dgpJ#ngGiYAysCKWo>G&xEqR>Gn^X<#BwxyFNj z9WDgtqZtz)IXN>>wpaPx8X)stR2hz8PB3lwC*2PF z^FPp(6XsK&`-8_Hpk0at)+a`V0^{bz<-$vbb3W*_@2rPF(lwl`mjN&LGD+NOk2XgI ziv4>RbKvBX9zK?L@}Fg2R^y)AXE|Si^3>!7JjwmBpMC89_g%H;pDPzJrXXjlkdb1U zN2TF$m4b1gr``NzO<|xVKr_MVjVqox2v!rlHGiaBg*S!LAI5P9Os|fo$@j8Req41e z?3ZcT8TTlL$Z+Y9Z(m=mE9;?=Fo5D+=3LSSd2F{@#DZ?BBVMy!lOf0hqc1dlyD~ea z0t8dbz{J7Rp<_t1#SXnR5Ndb351Fvjln4=OvCrfU)!{Bld`32m?pCY}Uu1TeaEau+ zG~PZ3PR1BA;kUh7NZr^LtZE4Q+i-%0c`QcbNq#r7A(%$e;kOevrNbkmH4UmTnk{c8 z+tx5ll@NBTuoW0a&$Mjl7`ZaiNJ zL9t(GGuxsy4$S^(;lR*JYss003*p_3FR9qW^cM$W9U|u&p5ww)IVBXh$XfEgR**AC z{ETU^&!kjHS>D`xo0WP_1+q8mI@@c|yk%K;N1xHTVN$t8#NA(39()mE!ZWLW?hs&I z28c@+HzTnF>dc%Mxz*5|R+?e?L6M-A~cp1VvU#3s>p#=Em#ZoD`b8ihwl z4!F*7?LN64PBoBVkdUz@ulYnAQxl@)`mzM>{wPAT=0bPU_@)*X_@7{N86nB1K zaCLd**<^b|B#9Em$ZnT(UzWH8Z#AKB_rus0TPSY%DW|wwUY0-1Ji_2ateW@SKvc6m ztY{eE63+XNZZmh{ShgJ0jeUuc%Oci`M-$^rDu81alWG$QVfX6t!BAkFAUi~_N*WRE zjfwf+#j$mwFCJKx7!k<~$_&R|ix5iMKlbTLFlfpEr=R8wp5yjao z;pKKS=x;E`<<44O7>r*Tj(4y~KIaC8%sRSgUZq1cq7ldV3U$>EQH8pR&!cjCJLglA zkQ;u^za_^j@|DSVjze~8!?UIXR;VO>y8Kd78|Er`I+@wsg9h#k9BbQxV~nz(2LJMM z7{2EcUhv;`A=So4YRI?AITd_~ZZnkYFd*Jok;>1#iW6yWRVdJHEs@M=&ZmfeNRri+ z*&Z-QykFUQ{msGj5i2!ZI{4!07pkyb{%S3O8w6ep_-$hu||c#3QgKTtM|Ci#`25K;M>z< zrF7*8l5Z6IQf9L0I75J=?+y9)=huTJ*EyJ65W&Dl1owS}jQ&}08vP#`rPua&w(_6$ z?gWzt-fI3;c{LvsJ%36iuC2y9mv)N|LgX}!e9}P(@1V%I&Gb$VLPg+MeCe7aMfCc} zIFN}o0(|MbU-;5_zwo8&!QAL}F)hH}!*u?1MN9h+`;SCw5IJ#L-LA`?eHuZ|QQyZD zj`$9#xA<P8L0nqt{6NL}#~aL2oIwk#5X$_yvYvl0&z_8u zO_IRhD_i+D0_xze%)c8Aup#l=Pk;+lKb0vN9Kh)TPj-0~FOjEq1S^6H$1=0XAB|yO zVc`S|)Lub%Uye)@G~{EK9x$A|N^pCvxvc;ZEk+Hi~g;Xk;0 zTtzLsB>c&*MzWV4C4fb)Aq^i43?|<@imnV)bBiCPAcvi`_{VBDJ3k-tx8QGo;PUJY zOCH^L?jMZ#2ymclx@Jae-Uz|pn;Xq$?cPQ>fHE%1HG?RNn<`@rmKiiY{QGg>H?~oZ zERA|%RlU|n`j!-)`v(%UBFavZJKdfCq&dU`=|19AVmbk>!zOr(KCk6r98H z+xKzKZU#;vi|5jigUJI^7p|dTx`i^euPZEKe1ybK+_dwF3)nA50ov>9iJcw-!Ni9j zcmp2)u_0@dJyREqO4`+o#A~im4XM5SYT^`Pfsd@zOh%Zh4`mor0_ZMWag-;`TP{Kx zI7k+pEJF#o?{aQjr!8SWaa1HZx2G)8RVW)u-yo~#EO{OlSrRjlsQTo(1Ya=o%IX+! zX)FCrD4cX~5bC%1<-Rs)kf8|T-cIA8DB?uDgcz)pwgj}1s^H&9%__x=5Itxuy@ZO% z|A&)xI}+wFGhSjPqUkU9!~$Dt-*--?fU0^GqGz?24%G)?KA6!|;pt}vo8`b^06+d{ z`cgjJitqnUS|aeFItJZKijdXzN&dC(xmKIR{UZk2re1<1?Tj?rs(8eZ4Cb4Y5Gh=l zNm&SsqL3-$>Uwp^py@?{>c=r{(3dI(l@Ze<&l_PoZ6BB)mOeF-zN`ZOc$)FdKBgk< z;ySn?4ajmlc<0B^8c+nfNC+B+?7sTa5`r}-L5|MS@p)gdKBYB`{Dwl3?Z z>t}-$c~e*U6Y6~iT}GLrZ`?nzcerib@3v93E%=g3J%a{$&y(uWcjeK$Q1puT8WxEwlA z2$b&)d*5(oS&GsVXg!u0bR#VYF$}qvdvQH1ZdgQ#GwLcA(I?}tWAb1PP#&zwd{cOZ zF^bbiw_^Oi?8&$I%7`vHiX42|s zsK!iwEPGqt$lZNb!3gQh%rlS|D2Q4EyL}jW5hQ21!Sja1)hzjYiW>0c?A zUzpCs2r4B#ZgC%*XGFK~GEM|5=lSc^mQOkxx+_JLA|_DGy; zO)WrNat3#gVC;FB_}i&9_XW`sVSz;d13wc)&5pVE+J6L#3QMKFm6mU{Oq4Uvbf5L9 z#H9mS5mn^I>+xm|Kc6GBTZj#nt!*)L9G@i9?MA<-fueggC4b{Q$_diJ=HKxe~-KFuVTB2W~;4;l4b20Y8GAQ zd2l7J;RwO6zBgrh1{#S6HYH98=9?3vjcrZyPAn&hR7{>~fI^5*##}Pkm`nUk!s56< zl5b5r%2tqGSr33DUn8whTlDnUCh};nHA;tvR470io7&DIPO?~lJODk#M4iDZycR$) z$H$vx!S2l_Dh1onfSj8*9Fq%r7jTJ7^P;Q$XrP(A=wIhE@&fQ_Dfp@^4J3=7NseI)vzgf?b=&fDIX&Ua5M?`m< z^I0a_^eeqy0tIvuz~m;#)I4CF|IRTZuVv$7hj z^Aor_=S%lCXDPp+kKC`-KBR8dox_vBI%}ycGA4C84U z&X2->++WsAU<3EwUz}&S`4nEe_?_cvjvw3NM&RMMrSwl!l@m(1MSB3o2FFm?--9LS;Cglld(+1my|w(sc{;Z5r^m z51^rOcq4TN)2}NAyrl|1b((IbPgb4o2V&mMo>>f^qK60aX%NHyC)DLX<3&+je(Ye6 zxpPH^0npEQR{8M49ai=+GeHO)TQF!L?4ZAJjrEE$or&}?yVc(PTY;F(#tb&Ig~3>L z;+G6kJPH-O5!&8; zAYobW3}`!&e3!dJn=#mJ4P}R>#6HLZFf=^G3HtWh*FJ?h-?c;~#?W~?JWldZM{Y#E zDY^479&VtP5F-CbJ&M6kM%}@0g87xfj2`H5@rL`R)M6VatZV zuk3!^k!r*2cg7l4Fq<8!>I#l)4pkkA8qJo_0nHkp#Q(QYSnxNY{ssVUjjh;z-L53$ z7}vQ$|LrStZe$}dU+&y7SFKEOhg}cfWRjTT*&U7mp}cn8*}xh#o28i9YX8KP;}6Q3 z*m9R2^*PX`bDKC<97pOX z7ix4$qVm*J<9I3>i(=653=~izc1a!*=#T2=yQ2Ca%*^8rw}xa zK_Ga&Q}%?fj4Juws}(cP+%H1rzS_THE~>50gWv}xNAfOx7Csao4(7q%q$m_DoeAJV zuHQhk`*o$Uw^A~Mx;fZDlzh3WE870PZ_T)tswUIdltMgk%QUO+FLtSE8M}^dhpKkk z8`heh8$^D|Pj|EajTMqq_b2wcQ|PdM#^wVq=0RWL*r>3kvlo;Z;5eqJt%n%`$g*l3 zP5C>FxwUuc%&*{#!htxgJiSiq_g~DST)fQMRkcJjRsI$=S9?3Iv6lQ$Q4_FQc>9(` zj0uPztQK-gUXNHUB|iPYaLN~WlI*eIq6_c9$j{Kyjdl;avFa^WWgMPeJJ^1~Dp_fC zlCmn_!l#M+Alni%s`9j0`!sM7is;`X_@k=s_8imrs)VCO)J@z-ex17n?&qwHd0uQR zv&u|k?uV`%gWm0trs9%n;`@HbtCC0P58l&0>dF10AP;-{P-y}S>rkg`$|z-pV#b9N z9ZTjut;1BF$vq{#wQW~bySoGgotEsLB3>VNX3hPJj0itxout8WAXM99!amv4s$w-t zh*~=fvW#bj*PfF{%TQpRf|-QPs@sMJ&G@?s5`Imee2(%$Hnr-A7~rVbpb$wYGDz5^ zNHREXZMdpcM47lP-9W;g17jKvom$lr8n-jus6MX^RW%8j>JoQKMVc33@i3c;>-Y|@ zVdrlkUf;4T&wfen@OFjikUQ`0$M)eScQs)Coi6c*{Pp7dT+9rTvWH*j&4)6?(09#8 zB2M29ojOkQ2(eprB0ULXuhHYG7C(Xa*1~VnOcg1ZL}foH?EKPB9!n<;pH6|U>q}fG zw5`My1m9xJZ_A0o7;XD5NX+oAQ^&O>w-2aVm&?l6vp{FeGW*mc<_X@2e(a8uacmR6 z^%e+ti>OGhv3G&oa*QI~>hH+?wcmdH^mvfDC{|u`{h3g$aE+^zqD$w$?Bt%WlE2X) z+f_CDn*m30*W1k0e`=;?J}EnXb66fjuJ*1FL9H|dMFHjZ!`vDaK^>|Dm-&t-jVc8D zDo{4uah7fbb63VCDLL%Uzlz0eF-3OSKR6DB1@6q)xf{SUyR_WTA2Q{O?n=}Iu6aomNnh*zn_I3hJQEVaOcLJ;$$=ri^w#Qs@aEEWO zzw%qEH>py4ldb!j)88#sP0Vg;zO>v7yjNY}_QTHLA!wYd-F4yATW(*ZXGhq%+&=_k zyT$&;C0x;Fvv+&(>yUUOM$?aK8E$opyhOfU1Yr)Gu;BJs<{Nai%a}0j5AlF7!$4Tm zDCWz{M%zbbrw04`ztJcZipeN8BYB%JOgTlG!$rm-SX(tAsO~s=pSt}fPS74kCv)HH zOHgnV7t5@^s+FyV75hBxCZPE(S6&f*FiJ~ozaE5ez4Chq_Zu5?q&}1mmN&^qZNFP@ zVEDYDvf~%{tn;%eCASOmzvx{_7d}z`w!Y;*sjq*&@>i^s?584C=-zW#$EdO{oNkU` zXf+0 zZLWHScaFV?cg8tPHf;NDQ*Gn6g=g8dr1 z*Pwf|v-jFheO;0uWd3qx zZO6WjKDtmJrl*eGf@YMl<6Lppf}k0hnGzo(*E4s@nKD!JWHruHXA(n`e2mRwyB&_| z=y$mAW7wdfVn<#kTZxM2o^gq=-+gsfZ+ua#28H3vmN29Z@< zaLG-Bg~lnraZs(vLI|vRvkRsU5J)HM0A$e{d_iE*%@h(3{TxYA7uuii@t7$0I1C!O zlfdK3uL|COoU?M8Rlm`$wITue zZ4b)JP%8H+_B$iE*IbC)ja!zp3o{ECWtV3_<;tAg7V+(8_bwetm98tIj|7sVOOcd1 z`Z!6td@nQT*QTC`kFXq8z|DD|8QB`il(%5?nvPF-aglN-pgS9Y(ElWM{ZKvgY^!eFmHRZ~4g|RqhNnyLOS5)*Ke0 zba=cy?ILJ06CN+i=l$Hdisw^{dHuuT;v0J1WORodT<(kS6kn`%_V8Vi7w-K64B{lhO+9j)DZyu!mjJLpHil_8aAd8uTa7leNIb4e^u?D=#H;&>%f|5cm9k*CLC5s1RuMHDDNO49K37iA%v{xM+uZ4^qB3^6S;&kQ^+yi zN@Pantk$ctH=SJux{wBq=XU0JoR7fKAvJQ$zsKC$IPnVrd{(Fj=D5_&Xn1J_vxnF) ziA+>2KAO&@u;&azrudF{m`i`i8LZ8Y8B+uL6|?Hlq$$yTfm?%#KX%*q-n%VqF1(kzyp%eYA(sb9 z5;Z)U8A65*C73y18O9RD^FIg#7)V6Q(zS@0Vh1V$gxk^N84bf~hm&(*x0$PgyddD% zTh1w1FX4+Oy|1U09V;&?Rf9kd@x^iFA!Rrl>oQ2MFd{qfBl+Sa=47tGRS+X`_BPxc zZmGZ%8<=rh5yz5fR@YuDpC^-lWzM+VRbKy!wS4%f$}PAkk9*wV#6*ES8`}q5Pc8oL z40xQ|0JT!Ly^pD-*%yO`Q^2NsB{QL3dwzv|&YSz+mo}rYrMS}=g=^sufrX(*>hE1E zJz`NBe{-+L*k%39&WD|E4Vvkc#!#Zme9l(7nZ25-I{R1E$5Ho(rBz`h&6W?rhrO@; z34KVJ{jJi1HNYQ*d(!c~H-=w&o7>pyE-on#N@@0vPC6FL&WA0AE28NS?CZYBh|&k~ zazoC{eFisj*YawmHk;YJS)xqAcdCGs z*8APTh@`nhi^+Iq;wib)H(z~aNc#4q%St?RciPRB>2>dAWcdl?v{w5jt$lqDb?h3C+ z&;C165KkH@4yV@+`?5<2(MUS2eZuequj660y43E=2w^v!`0U$erLaql7-1Aw!k=-V_+(?lf1yV#CkR4 zo+ur!mtfUZbKP1x>cXA+RS>Zcj7hJr+T>qvv|c2vd023Cd|P*no3wQ@gC5=OI{9JDVu!hrKdnxD0yEaoH-oSq{sZqd0+h;( z1(uFaT-`1W(KtrrSKAjpY|djm9;4~d#xn1|x;ot@PsROKqzl)8+|QBMysXW+WgeZ! zl}qz!s$xFkr2a`6V(&vF)N1zLPeM1*I!)h1QxaBNI*>H{-YM+21ogHY@FnHv7AGao1wkkJjLY zA6nJpe8y~N_@l7J*Y@4EfVYR(=C9TBPilkSHtFEBG z{?hCP<$A+O=*@W%uW5-{k(Pje z0eJ|%>FxpJR_)mDE)(_QO;Hadl5R+53pDH*6Y{OX){(ZmJE|wWWrb}wabEG_?dore z9;tnwXJ=w?Q_kKiCTJD;#WLdjQ?ee$VvT31)?;_#T8tISvrgC3qy2``=$| zwu39gDV#{tjVt&%Hycpx+ z)3PJS2Pc2VdiWGd2)>(}+v_5~ahdtAll=}i;Z}~=M%@QNscfF+?E~`WMQUcgjwe8N z3WGwU4eKHU9&C+!c%HwmW$q8XEkJsb4Ti=AEI!jk3oCeXD|PhofMOm2y|o()DuJws*aQ;C2A> ztru1XpGUAPGhuftwUQ6dr7;=b5<_qyjiwKCb7r>cVL0*h{E8@20!ISMqWL}6;*(9y z`m1(&@Fk|HES!GVNcK8fncJpM8nwa6W%uro8$pp{F@6G zf1+yAUG1Hzj>Pk(^g(ltIDprh-SbcZN`|mAEuT~)s9AD90Gy!SyPv_o^6sQX134}C~~m_GxVxw$P@`z{9ybg`nEp}02`Xh1w-rt*kBN=ySrlhlP& zp(GE&gZGx?0!|h5YAP+Al#UboGmmOWn_bTBX`>Zl^Q6j}bB7bB)j43CcoxxOnX*3x zSN!Ok-~5sLp6uf7yQ*4=qkK1L<4x=*tdzhN z&5YKiC{S2nE=vdO=I?#_++9yW_IJVR@<(bY3J&|pc7WAIK7SKqzCA3PJ4Xm6wKv=6 zJTQ>+Kj+lq5ycW~)rW$#9_@aQ6CDp0HsK1px>84tGWN}W(pgJ!@xBxzXgRY4zNM%Df}=ADqIz4V5Vf8vKMo|`psxY5*)7q)E4ABAsKNpJj4Pn1 z6TGPL2_#3o?8)P zx?Xym2AuU!R|(DZvzN(_G58W^8IyykwaJwSo2&NtIr;{j+m4Ulp@yA<8x9Q&Wu;)< zE)PS9R@(N&ZLu0Ic$ZbA4}v?))ymwPGQ)5&A)`x_04SIY(L0K0@-2KfZoNQW@_h(Y zjXgS>veS;jK-il7Ql2DI1IhLzPiFXmbtO!uJz7ILYlzg>8uPWpYm^-bR1_sHT|`G$j|7f=5*&X3AEe4bvNTV9yLKKi*nn2R{iOJF6Qeq&ssi}2)3)Z|jh z72qkuG%maZclq!*ya^9iS`UxsdDS+Ic#ALO7cgj=Z=kLbIZb~RI>Y}OWt}Fh+yrKK z?}%kD$MgMw>-j!kA7-avpu_XM>kaP|U;`i=MuC4w1V1$d|1S44*J1t{_cLOW6>Wx^ zfIWy2yXU*qhTa6V1-LsVR(7v_2Yv(a$Sbo$(RkLQI!}yt`M>ql(QY{YaV8wUt(N?8 zdoNW;K5~o8!tQ_5RJelqG+Ko1W|g+vzvelj>?lqT>1F!p=AiQO^KO*K6`vp5Lg z>O^zHNUD3p*j@kRdA!tquy5m`qZGp`X`jMhhSzap{-M4H-%G67DWB#utlgw}TYx2j zXPp6@P5P!kQ+fP(h9^du65ob@y7O-ol{hAq+RjC@vLtX_PWB8)T%ZfX7`fJQ0~9U= z&OFY%eQrOU5B;#&G45&OeBsd+nn)e zknXnXb&znR09(V=%EX#vOr}Msy@GPG=qhg6TKeC-=cJyCUh%Q?X53LWBV*0Ct-5MX z51CSQV#{Qd4io#{NeFTtV@bHvs@n{6=dOiTp%Nms>b}AU%kgBH%5wparDu1A((lJmg_E4tw3c8seZuK_T?F!rtccKvKfrYT%HXs;-Opn!n z-XT&XDktH8J252aa>ay>M_{G-R{M66I~ni+#ZiO;wYJ1nQZmfHQ%TE8?=BXzQfz%x zp>_Oz)g-DRQzL$))92E$nweBIvsHHp1iS1=;Q75o>P7uXzk6XcGXl@3+DkQi$n_in z*`eTLgnOPneuOSFUCHgowI8fnlLS}WdSV#Pxw;16FNw0T0nieIG;bySEEYZI{N#EF z-$6sR3DX*iY7-y}iP>9bXy1ps0AFC4?D;qMAL$oM=Xt^wGtY7$s#bBXG&VXRJd~O4 z1NMz`G+G4peFPOY`ww#1WM{MzFWLuxtC4#zYs7c903LuQ1EO;vzPcg-04wd!JvV^a z?*WkD)Bp( zQ_WF1J$0vo<0t+X4gpyjZ7k`Ki+%kZ%853=uMcXPbEmocHG-+^5Io@=}+g8h$_IwBi( z&yoLN`x*JmUAZo5bXRRF{(^uvk+7n}o(E5$16{Zjj4xbu{mo1vq-(`rwXa7KzBD`X zCY*O;UA}$Jt=|1f10!`Lq8%cM+ySkFn; z!OMkvoV$6;x$FYr5yel&NsYh%K6HHM-YUjFNA|-kpK`Y2;F~0~xP409Ub2dz#y#_PLiFwCiX69T>wZlXaP|awg5?Ez%UC%gUHG6nFK=~h> z7EN9sV)6J_Kiov8jYhOplxzfv#Y%re^+L90v*^q0-8{dh7H{(`>$`hiKm!oNIj~N# zb)+b?mZn6@HQVr4EPs=I@dgz(@q&G!a0|_v%O^VQGe0oefese4%dx2l4V2L;)ea%Z zB{|tA1zsk8S12UR3% ze1~@RSKS3>doi~Y_`%#pGv!=0OQ&`OFF5?1bLf=zu_wYgFYvb~p!U0;mDpJw2-sCvZGHcP=4|RL?*8gl@36Y5vO1o* zw<3la6BW%B+49$ntwdp55+F&DCmSp$&LrFdjOA_PRh|Vf-I_bL_uOet91ZVV$(hrf z*d5$I*jGC>IC(yZ6zF4-jN@3z=M!hcCfZ?-{x+>6+n7T?r7h9lqN{qD0L*C5G9M}I zm}S5s{nhXhu%lSF{5r#eYL)H-H}yvwgXx(#1I#Rw>K~OVZH5aJocpEf^YUrue&Ere zp*H(R!{9g9Q{OUsG9gpWfAG`eSFRD#OtSsfE|EPm&g|;8rran|lF1ketCKm>+~_p9 z2q?xWCR>a9hZ~HhJ)z1vM1Dalz#Kk6g`kEjWK) z&^ohWpLHgjd&IFLKOD$SaKtJ4cb|1#3;)~7{~GsMv&i&xZj1HcZ>UZ*G+w>{f|QXK z-T2|p-9Df!S6Mh8xCb97x(n#N`N;l1#6==y_d^~ct_bd~0NQNW4^BekHl@sr02^!vU$f6koZuD|?cZ`X4_41M`Fe&;r@*mauNvOeSMYkx&)a6I?<>D=dMq2IUxUU#eY5EEyRV&lXp z6`812_j3f#to~dxq z#1sICT!q$9BZ*(;-YCYb^QH>P8wmi>8!s^N!Z^41zkNsSW!?oyNeArTYdyKRk?I>C zF;a^XJ(f5lo{3%574xmR=VTJrk>oIF{jia6nuz~E+>iNVYjoVfn4gPuOSHRFX;~jQ zUae=s?9%zO&<)#&Ad$?%ipP++P=akTptqX+1{mRVKv# z8kZ?^9bo{Ro@9(IzraY|+r#OP0KA-t?8~Jndn^82wKuE~9220iE19D8Opd=L(*7<7 zu8oIs6a+m$Oi@LiZq}7t3z(po3VS*q6Vf^NKjJeV~DshuwYhs>%wXEz**%@bZ zNe4Er)Vv79M|(KEap6B0a7Rc8ABg0dOfn>!P0DlH5ZPU%lUe>%rop$qVH&*e;Y@fX z+_3V5ZxZjKOrc!}=IS1vq0M=H*0?kB=kdj-E9ox}!P z?fw1X8+?h+Xx&+F7IpDv-WBfw;pw5tR9P4IA%*k0ch_ z3*KgP%~d;v{pH59=GPgCkMqM7`lh-P4)8zrwR^5xE@e1?6OiQfuj zG56`25N7=UA?{q@qpGfjpGg7+MNgtpgQA8STc)Kosn#+DH3Ktp2G0Nr_^6`TRIgUs zTA2~B2xt=ZbQp-QYHw}py=qHu?NzI7f!a0?NCK!N1R;Px5Y#gaXh0=FEc5->-e)G0 zfcEzLeGh&LbI#fCz4qGcy{5DTKVp1xpd2&K|DwOTSwwW8fc{E&>SqqtewlCFJy^{x z3N9t&s)9>tM{quDF5t;pD*$j(Lf6HnznDb6l3Ifj<41tdrd}}q#>o3}CK4VHl7dGB zK)0p`=xo{qT_+Yag8%;+a0w&R2VD2x4AJ>@)#^efsn?ce&*oQ(X*p5H-Ov1F?~ED= zdaCwMNj&TcJmNQ@%$(ePbas)_jq*4MM0Qj3)}Wi%2o6AVpkKe0-sDJcrCR_eS*qX# zx&f1n0fd85i+cny;TLq#)Qia>%v1RO$WJu&g@8EnexiX{xbxq0^x;xFCx>eb^n1de zUPt8Y!hqEx5=+E+$?<1D4mi89?G}>fW41(%OTBM&UUT37k|U}}5Mk*jNbNsm)&4c5 z#1BB?`9aGVH9?k;a|6Az_*?u8SH0=3)5KW*MvUJ#gi?YZ7Ido{(e!;1ikqofa%U&r zVg$2~w}^uxad7V1OK`T_L<=t!z0>bL$w`Q++sp_Ne&K>;7Wjk(1MLnB`u4 zC4i~?E~J6SBB5bH zUXJ0VGS1WV9k%vpZB&-v;gC){on##5|Cu_c2_}g1k^B#r4#Y0j`62JbuRxrTC0(%O z79I}wbU0xGG)L37nto6^u#GD!#~C@!>$d=0;`~%wAB^2mhMt!kkPf&`(%bBV^R4YP zYM$g7RSTm3U-K)p?5s(N@_C0w5LgaL+aYHNzvXJ@@LP581nkw*2>}xBW|BQXjT;3i$eMW@8G6g;s z09mnW(%zNwpSk>{Q^u(OG6goM0{gr5pR8EC=`LPY1sGbYWObG#gF>!h5Il&>I{9SC6TJ!aPR> z7awxC?^_7~=Af7CQxOwSVfpPZk6yj*-E||5g4bcpAaS`u=#@F@7)U2gSkB@va=O1~ zn-zx~wBSlc2kbk_E=+VIf0KLZQC!~-d$&Wb-|V|)_K((2^tVy6{|<3}u-`P6D~Aqx~ayZTTn z`Yz^GB<hCt5<@#EN_OW*B z+`OI}#7G4@SMdXgo%j-;1JIbGnsYqPD@gN|nM$%*^^^Wf_ot$}+8vP+<=RdlT@ zFmV#Ah4qp1nNPWlUsQPXk}AaG6^DujVivZ0+kN{fPh=$f0&Q+U%Hu)pFNqOC19tV< zAKdY{20)TvYx57`a>=PQ45^%Nham>i~EJO}f^}6STGFmmpM;RZJ1j z#7eoW=KV%E^!-kRe=!qOzQ}M*`<+=MfUQW`G-gtJso>%G^<^`W5sS0fZ(f#43K!jR z7R3T(-vtc6>n^bJkcnF-r<6~2dez&FCC{qf?zHc8$Fdov;CtCNM! z$&|w~HZndWj3;fXWwNB%0LxS#-GH$rlF9?b*FtXNS>;R_4zB;3OP?rS6e8dG))4l9 z0X1GLBRu4+;NQfzKu>DF;QQ@EY`Sww0c$Su1I$P31tC9j6(n$N67>gV{XN&00=|66Yql3>-0SBBYJ*{I#&JYJR{EQkl`Ub7zBIH6j`@u$#k6rN|cmy z{p$Ys5py@ur%Q4*h)dM#tHny=TVb#@D&9)ulDt?QwAVyVKxMk77p{3tgj~k$Ei5;& za5qyNGb-%Zr*NXC6g27g(5cD2atizCai;SQ(W|Efbm%&91b_m2=mPdl)GW%5UEb7) z`!pwjm1_z1N+;>lmf*Dc<9-&4Yh!Cb@)y=T#dp)U!>D;wYDqpsvDC99$OcE)LU>}- z2(QGIRk2>l7vOnhyT%j$hi;X53#~;;5O(!!VE}$3w1F1wsrg3De@p8aT8Nacwm}}q zGn(zYSH~B{T1Vb-CCdX!;8ilvwfH4zM>KG08^UFH;K@jl)TlvomdlM=tnM((MMkOM za?e$HI$C6coY|uHB=Cz-D`~==xrm|boNE3S{!$>BlYGby?sfi1rC4yU8{~H({pQH) zYq(_P_4%~KtT_^h*QTJ9-0Q>-@hTSHi;V{c%*}~Er{Nerus2g`Q-?A%Vk^UYrPRZe za#3#Iek;tM(SJy)W$nBI)+e)^+I#WC6opfb+;3{{-(iU9y;lm2fqUOW^!|f^_?>Kh zJ7rB|VKuE%$#;>lXr0>ns|qaNE~6&NTb;3}j@OEvG0}o!Zern!VbmxWeq>^D#$nO` z3+3=g?z)i(4#i#?^LreJ01V|7CV^+)fsjs#(IGQ11y=mfRwPC( zpb*TGlZC`3Xv;#X!0E4!9Or_Ja`l&&$@V%r8wf9=2kHke5B*6qh`wDa6Q5Bl=3V%b z^fTYdOV<*!gsZ3_vj)P%SPAWLxvYgzdzhVL`e`_uUSE-N7GN(U(^nB>{0AF=GYQ=9 z6rpi}4w{Z6k|jIjTur$|4qXeLaPs)7;17%qd3VSeEuTBn@Z;=iSKr-;bZqh(kRbY! zWx!p%b1Fgz5ub?(vy3b;T~(~493f8jQ>N9~e^8Y{^U|1*6ao4^RC($7I-d4vL4EyH z5x)y%NrBr=YA>UwdgmNn2FvH^^{N+%FVIIT$gecLkdBA%#~lU|0c?fSRl~l)3RM}b zt<^@Et#PW?#KLX8G)i|dJ`mrUynWai8In7+`WG0lz zojp?Ioy$rYs9#-FoZZwE6y*3%2`f>(GY>AF3_TU=1y?l&;-hktUy=3pc7Pbr0B%NE zE@>;``OT)MP{K1*rejfn)NWJ#z;CNA=u0(@4hHpk&&Mffr`eZzJ0jzxA==YzxrHk* zK#)>N~EU}S2tDA}l2Y8E_5IJig zP9?fqtGA8cdj`XOEndk|gdxkUs(PI9Kn|0MFBy*KqwX)6GfvAs$a@h&zG4p9Vv>d^ zGA!{MD!J!M0`~LLsFnLbY=FbQrsy7s{OdIRMA{5dSn^3sgncRqF7)=4T)n1$tX4^&>bI&6rUuT!b1>xYrQ|7UwEBs&+bhK4`=6xg9DV;sMx&8jD|tY)jE^-+tqBcTj|&NbwUb}I1%FfBnY@Xf z!5E_Z)S`#c#MazJ7brNB_=kmh)+dCoOfNx}|A2BHINEjKEMaGq>%hAxowFPVT)M~g z8|c80G~+kWmO0eA{h3A)^s!L{rF@IAk;8SsC`5R-&V1^ zD@W2Z)W7Gin^nNC6E|-Z9>^*y|BGy(^JQ|kVPe&6ggSl11CQ~Jb5ej`UgUeYaYep{ zEB+YyaaMflKhlnIXf6lXKZ;{{JkZunY-&l{A%`BXTO!vYK6AB+#Mfm&R{aDBs!MT_`X z0%-|Nj%jG@s=^+UVb%+J3n@OiqTaqD-!I-9O$)x@_mT&(esa7R1$(E$@2fRuoVapQ z9!C#6?QMz-kB{dvSrdu}2%*t$zG4qqwKW_cx;fdP$D5{>()_iITii#7GIE9f#HaU0 znL+ZsgUEIg4psEyU- z(_1WHYFNMhsf}W+7u|!4-dCe1sSj5Chq=m*JQgk& z-3Qs*ppgEQPtc)jXoq|d#*!QPL6!2BVEOU%6fH?ad86PU-MD;?9B{iJcs~Ah!o!OF zM<^anL0Svdl;dppZvpNpV!({=5W=QUv>x;(3gTn|GKG9NT?%J$v<qAX&VhZ9YO&z5gwSlxW7Lv!mpG^Y8Mz7; zs}yAifHnV20e`u^GtsaW*q4etD+BlC&d+FAj$C=N1Nw)2^ywJmh@0@pX^-8WuSz$( zKNvDdWuEPLuXf)Yd^)H=r;5R(c9^2KgHH|m$VfXiR27Jx;K887Nj=tyB@bq^` zdCY68=e2QJeP|!>yhDz3#t9VBc`YK(IQPSVB%hiyHf`bcu)Dsfal+3# zuk2CG!}B5&QK5~oOHm(Apc<&;dHC4m6V6wc^%svEEx)J~+EsA`9m2XUUds#uzT=HW zTlitch!-Ef%@anai#vGO*A*1HI8qVxjUsjK4vHxGpo$GfW^L3Ngx4A%GEn0dI|Enz zk+nX?gRjbhrPpY|Qnf}ZbE$3;65km{tMI0gVoU{;2#J_Id!652rep!EmvE?&hvePl zm0A!mhoj))y*abp^=lc2_z@IzqxvTN8gc>d4h{D(b$~Q0 zyVvo%Wn{?-(MsKmJSW^EeN<^GM=bndlVL#!B%D z39cZ#lae4h7lFbgx!p7iCEqp5Y$@Ti|A3{+sO8vSQi|e+&2^G%dfS$Ap)LR$%bOLC zrWJC!1SgMdk)B3XG@k#aECf}A74pgvPMNiB#I@nAU%4%d2zI8#j{2?y?>OX~{-F{D zBI|SZJ}f_XI=lH-S>Cv+7Z^WfS&7LS2zoP_YD7Il*e|1YGpG{TWwbPT9rUu8Lnz7Y zfj@ISDAP&NQS3%nK!70>(9-%wzG?SOw{R_nWa+}2oj+5U(6-QaH7ni5eqH!sU*R9E1|s{W9x5iYjPTrthnu_}d}m_@4|Gulm3!=lltew)3-4HvC7 zW2Z}%4F=3!NCk1nU#vrQC>z6KvW0y5)bm$nL}UaJ1o{6CNy(}Chw%W8 zaNN*n=u{m3XXUjD>jhLfM{c8KQgUEFCSoh@U{^%vM6U4Uq*^0?4U?^?;e9H<2Yj6_ zE%$6sywxXLpA0c^7p>O$|3;lu;y+c*0L}bOG>s~W zr@{}~5k?UR>Nzt;arv^G>E8z{ai?2y_@>a(a+%)>AxlhegFta@JN|0)_Y<|G^#=WPDjp7?&y!-Gdl$aT9*tM~SM0@d(VrbDDY=DF+4pzJ$20dV5 zJ*8mIG{M`o&oEre_g>^|+L=ELj#twU*rmTlxX^W>R0AItbXU}~-BlYsa2G>2xq?80 zz%yi4hjq#5WXXhq>6^rlSB+zXCXE|4+xX!ZEz$;l&`I6E_6bs;dowsS|%0S#i8gm7-d@&huMPi}D zQ{ghwrFL>T%aN1#Dzyf-`^WLw?fSFZEq2>gz9^Y?-=!sKm-Dn_G{xCt>|j!L;$cB- zX5=Jd;0T_W3j6mLIX=_Z zzVt4Kx)Z0;j_hOYXnrK7@K>5P22!EyL}al^bQW?&*n32twGlYoi1%3h4+{4D1r~15 zwflk?>&A-a+=`e0e^B{^2c@@x#Nno0U_9^->IdRiX%~C)B;-OSw3D*R4}K=AH$ovH zYXxr4q;AN!p8Quh0V+CI>oB~{IvA4p&EYQ>!g1Zsx$9Q!q$J;z2RM&kc0>`%$b@ob ze-L^Pm1ZS*d3VKnu_LN_!-FAsek*CEU()NxouT5J3gt-*Rf2+w#ijR~ z`VBsL7VXb#?`4Yd3D_G+Uh-6<=cID27UMVkhkq`JhDbPN?6T%)ehEXSeG>$i$(lQJPj$|*N$)Fg8hlV@kQXt0u|bY zDmACVTPiLWx>%>WOW=xMi7^z_;}d+zIbXbvf6c0PP2XqMQMLPu+pe0PSPRT_e3_R1 zA}#g*6GJPS8?gC%T)v$PjUxfeC3qCvs~HBO^yT_gc}$o8OmihR!2?; zF$%G*kt4L4x6!$>3Ls;9wA|CF`n{rT2goxr`k4R`JhYBx9Y*DF%rqrP_lO`}M;<=J zi8@%Z7bog~cUKBQAz(iVU=*p6vPMLzM6OI|;44%JLC9C7!BH^)pJUru+WtoA#)GHH zK}b`xFa5%$X3TBZqh`R-*-lBimg6U&pni=yp zdOL#^9~dDyGsF`#YIoDlF?2B*e~?`+J`lb{WDaRLNI!bp$QmJnF78&viD+elGhvLd zBSHLbBmh%GVknS_yk|Yd)S$Hz0>MM8GdxpN!mvpF#>8n9$3Ffqhyj3C(OZblLIuG4 zH@FfhCf3d>$S(Q!p!%a(+zN1ktAZ`LDR`oRi(o7#UtaejgAB zNZdvVF(;}HJZ2RbG*uk-HhGh^TjyWv8#Zr-rQ*p2%FwXxyi~~p6EO2mw9E;93jrL0xH*37j-oyS66IJu9EX)BZUl<-Ra~rF+uBh;@_2g zxbMtlq!XmYX4wS)MrMJGF<+Xd;nWQ#H;=e?H-WNPvaYL(mS_90t(ZJ)ks<6Blfc6S@)z5oFNp#*?gW#fT9zDt|1$Oz4-VsqO0j%W=jd zTu?UhY4rBWxo?D;fsIu92(7`?`Y{Z+)Gi2m3W(isfBDFO3OUZ<=kz{(60jGQJtX6H z$yKMKQ*gCQyTbh7^*BGtY zPjG*N_2WSjus_6S^i6-oD!=#5fH#?HVi9V7$H9=Rx{1mGQC@5MbS`NjI=~MOud^j_ z#)JQreUeW7sX9qwZ-A@lWU$Jdf>6~q%Lo6AIU{Ie9VELn4VEYu+tQKBlTJ+7#ek*V z`4B@Nk_aRX4Tnk(Zi5e8x*L4J>38flZV%$`%JKJOLd`i{BY^x1M!0r(SXMUH_WCL&=`kex*&zb z2-zo)&NiCBufyei$qmQ}K3jd1 z+<=_k1p1t}DiCHW&*0pity(wQcR4SV{fU3uBmN_$qMDs(kLpU>?P>k! zuQ$kWI+MSx6T4e@L;N@%;hnbVU7JQ$YQ9RtSPHeFgud;OC=-YJz6yCFAO~O9aO9kd zZg02U=cD9Hg*q{(XwwE2SZ`pQM=&#JhV_ApH39E>U)!upMCJjewNR|#{yL|G z=%)C3fZWtN;XQ+q!04Rl*}?|yH+wqu_vH38ytQJV+Egd;(Nx9cs;t!^UlL*)k-9Vp zbv06@*dd$%XaX*!-udNHIWpkXOjxKi{~W5iMlsOq?2VFWZ}GG28HNi>L_R6JW|&Y$ zq1XxHxa&P&`k;^s@17cnPd%bc^Wl*5^!UQDKnLl*&6Fr7ZL5v&3d&we*xL1kR{*(X zGs&IYtBgl8$%_B;bwVFdv9;++2&hi#AVQ;j}M{I6iz&^!f!kR$W<_} z$UT00i!!zM_h53-NTTjKGZtw;EWlE$)XWVq*jnK8a~3k>Ym9DJ5+BWAlc(((cfT!C z0x9EpNrNmB8(1=zk4?{)W3xYjbYAhtA>V4-iJXyYiWI8`@ndfwKXwD%`Bp91kA|UY zU)au1WKT-d@v!|czhm14PYE0SWm<%v_pOec5%8^=e<}_=!siTZkI5&0r=Z-)p>Bff zH0?}8E8Z>6o;J5d!O2+r_t6#tn3;T#kQF4^xfINV-G6d0jLTRt)skaaqJ`wxG+`n& z77$4uU#I*F?RIq^k!y%w`$*jFf(m?q=1XQechI{M3qWop|A3ZnbHC$|r7u!=Bcn8v zi&@eW*x|yA*Rnn1d7~yK;8PWSUQ|Y+u^av|8^}%B!${9YZ*8J%Xo!9l5sq4v$hoO? zL;y&h?Cz(TS_ijPBUCb&^9WkcefVd@Zhjsg-g=2G+^~BvEW6(ektH%nYfP|^>s~3| zjGA@QRV-MD{>xWjED{Dl9(B~B=R+-lb9!Yof0@Ex@j1fp5Ky5+F}+;s39$+zxPgja z5EGeWYiP{0=7Q*Vl)NvsHrg(lHLaNveZ%DQ)hK&d-|i^xu+UTFCapbacPqX?y;pQV zp%`dr&0h2_F8|g6CX|&qcdsLFX07;mCVwtNPV4B`liErw7-mm1bY3MPtjx2mO8(rjnUQ%6$HMTjMn4=N7dxd-nYq1lNGA-C)@@%h`h zRQWR|U;NDd=4upi3U>x%8mS*~cD(l_yHjy_$q*4e;PPtsg(3XISmhTO4~ZR7*modu zf!{YARbgiyOI7u{Vy|al2C*|Q=#`s#DZ$l_w@6{U`O88`%qWFASxQThlf!5da4J>S zIs2Upy#zJfIv-hQ6HedFS@F6YH(u8qV1-0i*qt9^fuZ9*NP|hw4(P^*1j2lW?IT9` zL%;9BGQw*xLLC{hPg?Sfyh~G8J7a3yML7noPOzRB-vpdNYlhC#8uqnBhD(UV$Y~0@ zD0v^Bhl-rp*Ro(gF)tPkfuqHA=;Tm*=xLY5^S>gi05|7sVv6trvH;3*7q(`-Gj=4M zYREBaFIGdu%}|21HD|KO=OQJ)Qe}~capha}yyo7VXc2w^JT?jxSC4JZiF_nENFhO$ zUOs3iT@2ho(4pL9S^EBrS@p=+;)}ttxhcecX+o*^rQi? zzYG-QKrV zdyUZ@e&1NY^?2DM4A=-BGc*^IkiqaB3U;S2bvq2a3f2dizy2?f}vMqVrT!JmpXN@IN38lfdXmzP`C?8cOe0#;V2|2EcPXl^L@V9 z_loEFg!C3}00?l_otKy6yS;GUg=XyX5?+?rw-;k3=f ze^>Anzq}9|<;UH3_5Jwm{_;A8BvNv->Yn0Y>`uAO{jocXxzVSffMkp!RY~Jae?kJWXeAW;ZU6bx^V{PB8tT-j((Jrz56K*Wn zE0#UGQ6h?~3rWJ%hyBia-YC*Rd4GOH(lmuVP?hg@-sLGxR_sqrzg3w!U`KJtd42{* z{oa+H=t)oottw(;&C`rlrl3nXb7@$2E;PyQJn<0-1vP!*ETZMi{h^cN43s@;xG&X4{6u>%Z}TZ7=Yi+j&{ris;>-(Wdvw07*cHW4HOQeKdXaTCYQ*jdy%krD z8{q(FGRbF+HNVw}WvQFFIU6?gy1GJ`71e#P5ys0JFqHWDXo-W%)Ou}pHeDy1`idud zJe#^qHZ?L_K`4v6)A{X1vY)IafRb>2&XcSzmrC@@in0;yL&oohkz&_(MKRh-e|};D zE35fBXZ)`q`PRw0Ep>W+$%@=5-|C#NJkrl1Y$^>K;<7Q4Ja89F(9Di!LRR(7kf zQFlr>wmFK!hB46aS9J>AupXD|j!$ztmN%-$6d}im;8?v1SB0&h4_C06VZ>dwr60b_ zk}n2gH-UZMz%f=iYwb2_&H(3#_Tf`5YP{Mi+Kh)(OqZ%_i>=tTC1L!JV&R#5Q39ZP zGd3hx!D-lz4LPjL*4{~?(GCw;!==}TGXT~gE&ShT4r#(Dgd1;%QPV=xetQ$talCl6 zzae!_pyIGSy))oF9F#<5@vE`w=roqxBgH5|J^U7?w+20*q#FHb3zy92i(CuDdSC4) zf)UAkxZjqc0w&?gwDrA&e-BF2o_3rh@%?^#aL~I(IHi!?4zonrde}iJ+fG`gLlpOr zetIVylsF!G{Md~?_$lxn$RoRJsxjzmHy%7*`XsA{2l!V~RHH`nkKqh5nzT8i2aL}@ZwoW9Ukd=0^2yZzO>a|vsiTvJClf9MS?XC`)*e zqW?xT!DK}$FG2V}|8*VZ`;^!9*sl&76+5zC%hm-q!pRJAYKzfz=B zjBgohh8n9^C15js?ZZ+Sfl>A)$~wED;u2yU0D?hJgbw%--l#oCSqEF%%5Pc-&NO2M ziI2d>QqcK6g`k}z>bUH*luz$)LcD5}{4Id@5M#!nOl$=h4;H$`$N-&lK;m-noBHs* zHnWoQgS^keKPi)-zKT@Z139NEDGWh*?1<*#>KRJgA+Mf;(0-+f1X1{RWObw-6Xy}D ztW2S(n7^1oK#loJ#BGMv36za?&ShZ{F6xS+Kb3`+Cl?VN8y}5M>pKJ=DUB}zL!(CQ z1_T$0G+$ZzUBZh%Y;LjNhhnm~x(({23-d2NO9I$70$Kz-T>)ROu}B;O#>c09DK~vx z4LqQ7pJgE6ta}v%NMf5(3Hh!Rbqz>qR*8MS5`-k2$C+C=9yyD}xVj`{2hQrP*vi== z%Zu?iKK}5f`<)+ACg9nnlM;pO{Ef&6Np-`SB`;CX`)O31XUr$zOQx*?XbJiYuzm~3 zRp%jnq51UT8yJ3veUNkaHs{XyaZJ$#z+cw6_YBaoQ4;Yg=6x!_{5&Ko@Wp?3-A7{{HsSi0So~zb&beH%P9i@-im0j_Mtcszk z8O5QhyCK+v4vkiU7A%}b=zsuZ@Nd~zh;y`>fT9Xjl?~DqZN`GB1Vav z2p}$GV*K7N2vvxjZYOmmWNdsA#P{?4>?d6}kMlDjj}0U3!gEEu}e*Y`7vjpP{@&XD9|C4prd?bnpo> zZ>ornM(t{K5C%}cF@K?}02SGHvlNkYt|P{Y@(gH{3Wp~3UOR1vi*f%koh-2pV>buR#d(s^G+UuDqKimjdz5; zohVmqJ+n0VC=Jq;h|G^Jmddu^;8ft}T{R@oid#w;)`l75h;MCxFAyN=HySgrez& zJW^&K>RdqT)Cb~Iawo(`6%ze5T(zcWM@R%6q*o;BuZyZwV!PkT8m5(yY9G?@cbg<+ zkYrq#nv>;*U7xnHz#`YU!q?)v+ES^+x+ZFZ4-nXpjO!D}J`E`i!2?v5W>h&u`qiNZ z<<=DdJb;)80d@7gU6dn8qXcjz;x6h4=LyNmq8+26cOOL@sD8uVb?#`x_NTLN&K&Jm zXJ-yedGda>kC;$Qe-Rw@3MXNib318DFgkb$K^O-bc3G#*z>S}HAGn1`Q~k|vY{v_&Hke-ihcnukMO zC6sQXT=AovS<77Ypok9EXRzeI;J@1Ex|$eH>zWV9w0}x=`)!%_)BX_J&oMr(4BiXn zK0y?!d%t5m7-tEvuNF#8*-db`m4&NoAdL}CqKo7vdfmLM%+%Sp)xEdvS;LLq@xP^x+7mSV}oA%o&*g-gh$*$ zWnOsQ4cev0f1~g=bx>|V5f?i$m-GiHg&aJLh+K2`HDV%*%eUi21Agk?Y0P|*C`D<{ zKVlZaJxUD9iZ$Lfc~gru#1F>3fWAv_qwn}#gSk&rps|&SlltIbnK(k~%sR>EGOJft zr}?$`puo?8Go(qvV&q`;Cq4qa@PmT}wceVavs~_T6$&Yh%v#1PRK`?FwX3#jRoW{T zE)C7j_2P^&t;`e_4d&e{yGGGJ?m25Ja25y<#x5sX$?E9)G*o_Fli0s#7=)~1K&Yt# z7_QtJ8(-*lh_d(|ob1xW&|#9r(yE~Ino}0s!Z!xU)ky>qil8W`F2C( z3ixMdXGBi)fN~Y9Q>TuGtY!JKyIc@Y>ywa&X*_uUAHjpO)e1vj(7yOHIv3K1Nf}G5 z!4P-r;W@#Z(ql7fXR29`FL6UcrPonk5eW&fnzcWD=SR*Y94GEQwW&E%jG8~l2KhdW zoo3I6n7u4NG8tn&;VqTR4=#N3W|=S&0@BWFMTh|B7tXtaH;4eIid;~w_YF5DUgR76 z$qw8Gvzv>)q&yjgTeioSuok9$d4WB(&?X6+vi@`FTdrrYWAqi~$H9L_89NY~|syCKR{Jcx;!_I*(FsLed zAw8p|$Ls?nB?ERD(gtU^qwBnu?{D;Caq^bdM7VV-a%5Q`U;xlZv*lp2XKHVoDk;GMP%k0lBx5x1+^ zyYQmiSSCUk6VH8hbYvgB)Z$n8gyTIXi)4~@6Z|NHkUk2;!Ci7(H)`@UO)iq_G+nMd!kd5%yOVra;M%*2HF=`6!$Odd zojZUE?wAz%dI735&G9k08eB_DfCx!!uoZ~*S8ViqiC2A4tgwtp8l-NYZV zoA4c`iB9CpJ3fQVk7QS!-LEPHB^h@RO^Zmn>LB#GR;j0nrBHU&u~}7x42S-y*TP4a zT90;x?Ka>JlKg3B5(2}p5Ya-utKeyxXh&vvfqYW#dBX0U3QMIV$|}Cvaq0=On}s># zco!;4{^>rY<$ELKjgmnt+J24mCU4C6WKFCea1JiuF-@0?eI!IyK|h^%Y(k-%s$S@F zCB-0ki%XZcOwd&MYV@nbQd>%E5QQ=e>7mVef)~l>^}Qu@bq_Rj;v0%?R&@M(@_cLG z^Co$Qu1eG0E%GcL70}tJh*OCfAVYo5qziqYeEkLPliT@_h5hU5`tUytucpT$V~!32 zf_zjfe4L#p2(G#e@@;&f=z+A#2gD~VO ztaV(`e;p@hzM+K!g}RM=jYiUgRP+;?G_Lud*?#nNZR$R63;6tn^T_`eQr9;X%dblu z90F27?UdQ451vo=%@wcPr`S4*rJGmuUU{Z{g6d@2_sly*&zq{M`6r}artL?M+4ijL zwxtsduceB1vo}V|g^2R!vvE3U_20oQZ1()=ih{F8+p~)4tW-czp9gyr<`nCpPO3hM z6`6+FTf2V#<=h8M2hS=l`(M?IhiJXTM65I(Z^q{eaHf~q`USrepw)-zo!<#PlHI%u zN9wce)D)+IGD4nAA-r|FiZhR>TI4lMS+a)W)#t?1pR&^sVeRJH+1ny>D+qbUbixbY4rnFJ8Xu zeR&@K1ba7hQe(#DM}r6q#(cXtda>Vb5>r6Ql<99cd=BY%I3qzX2@oSAgYj!pSjY{< zj?ao$dLpM2XE+?oZw&kL8zRWfIqgJtx}~mmtDGeZqGf(rAbz>j!Q~Now-4#%6iLtr zkr^9aZ~BH)FWKyR;x+th_+#2&>~IA(=MxSl!?L6)enk?xaGyD6U-@n33}ehosQJQl z8w*~A4(eORTnZ+CpXDzwr!R<8z$n5PFgujf8^;LcB$gf$%IQGBD8zh%cuqrZ2^d!o zGQ}W_TfCeMHifOuwRay$q1guD7yp#~^bIx^i8xtg?nGmbd@(DGlhC>75n9H%@)P2e zh=pnVSaF;HShil%e81yX(imzt&>J{>T8U zFTq~+N}9D|x4`}c#7#$HNC6%{Lb8m606QE)N(w&=(U;@x^j%iS>|FD{ACyRLl2S}w zG1EmmXp@qw5lQP zz}lBr3EGo*9lznu|1*R^ol#4SffQk;T&I@wQ6^8*Q}n=Mr&lOJzB2sSo{1`Xot8m? zn-DlTe?N_}RIOTGDPvN3reGCPYrTgMqq7hAOey0Yu`;&Z*YZ;CSJCrGIgL_&C{?HTyK>X`G|k`X=%y;XWzDT> zkG{kGr5q@mgjowzB)v_-5}l^+gOFJN2`5JYI#{@FLaD@#BcaF=u?O@y#-d*<_?cYb zOGe6U$J>cdb$lA}wQQaL;28V1N|pkdy9BHtFyPPz=lA5qu^pERbmLSyP>l8uF-`dYsZ}AOI5J}xCi{n&5Qq;fj*d6xCt3wga3k2`Tuv{-JzBic&IUf-i2c)A z-XO=70jWiCO8KA`M69S*@ReIS*5?mgDE`0z5C22Z*y9k3z^mJ+V!N(~p*uohWi9HmawSQ(g9( zJRIwYgRok~L3mx_AgF5@*K)nyF!aL6S31gO76XkLWF_tce(iqx+on06{y3+5fU$9FR z0vtu}h%wl?D2qMw&kDxPBkGITL0a5}c(6-7T*2{cukS1WVbIq$|9uh>iM$M*v)jHj zO}XSo8Pe5PnS=$DbZC5DEtcz}ajkAhZY_RfbNv%#a0t;E`x@fn5 z{Y=$eMpi9}y_ag`Mf3#glw8X`uBaaRP~J=`h@K*^PMOGN9%tE;3)CkG&zF9E%9TKm z`efNx7vduzq-CFeH@ny=-v$JZBR*%Tv?Rrexo_DwqL#g~G(Dd90)Emw+T|#*Z7A#Z zFCEc>D%;nguD+l&RZqUXT5N4nYJ~1?X6#u;0$_J)XJX~sDlj%me0WX=#!dmoT=;sU zAADum=>cDk!~>UGtwo^fEDd+~3n;kiml`$t9DwzX2BBq{p{O5bESIwv_O1aMEW2pd z`MMO8(NMyQUV(_bxIy6U|23SYN7)}<{_n%vnMcDLug*LMyt%K>{3r01RqV|FJ$UQi z!oLV_{nt;(>d{jXu|qaqWnybREH#k}5QF5#iSY|zrigY%sJ=X-=2^}l3W>YsMM9He zWet;JcQh1C!l$M%G~&}qVjDc-9}{EOHx`6O9GMuqqp>jTd3zFOzgAIlqJ2FVMbXC- z?K_$aht-Fw>+|MZn|OitvKo>GK6M-T$AG%3PVSuZlJj*1Rn{$|zIo<;7htcU#eQuv zxJj|=8%jQ7grO0KF|lea@zjTljycwF(dJ3E)m)iuGN0n6`+ z>_}I3M6uRaIvYM>gOP>DFWhLx$8Iuvws5W@=gXNoBQiA91M!)^39qVTIV~MYp0D96 z^S&`MnyY%F6|*)L@G{f`$(X+hCE6wyAh419$l6$v{t(#2oo8)Ab=jCdt5w8$pZVvi ztGT?V${JQChviFcUj#CW8+ zU}D^A=mk+w5knrkg}bU5m!0Il2@a8u-TGsQB+b0OK`Qmidx!T3POv&mUN0}ZFkM5$V!!O>%qzKzN(Vo{(5b`vcMIBOyCE7X3zP_Q* z^fZNv*2^m*q*4lW;1`QMc4#ZvQzNcsvPl@c!I|`N6Rl=H_E9Ox5Qv%&l3pjL?yjJdD2R==Jf)`V{qB zACIh0QNQ)!Ro40x9eaIr53)YesDMY-0{zqV@&12aAMdf($9wepc#mEmUj6g+(LKoe zNTUPRCoP|`s^BO@7;!79KPrg%wi}q()+-EHUZm_AfBbfBw=+35oD=wdLB-ZddBfLR zu^$u|k2C@35VDi(;q5~@g_Y-A^=!39;3u~=?AaBz-wG4+v3e7+gGo@gE&7+RJtAb! z6$OYEkz`?m0sMH0RrOez#3e9eI&K03Gh;PnPpTt>Q8n3B2glUa*;*>Yo0$dtueABj#`A^)l$V)4L_{4)6$185Xw zY7tD&o2F-znfF-P)9M3$v{$eytC2gjgD9t!l~k;+!x(_I(CZPZ-m5Mw)`c+ez2Us+ zy|OlD>_+X}s28Y_Ek>GOzyewJ6?%~xNrG#Q*l2mSo7Kf-Io5~{vhOqGVtu|xs=ER0#ayprwRL-Sun)Z#X-|SM}p+*ojojrLZi>dgE zjIcQiTJRUXDjR}t6$rkwVr#{|ii5y}3%>;S492T8{93V5WE~I~I4DApu$>HlWjJn~ z+n8i?$h(S3TJ|WQpgRKv;SpOx9<({6YNqO&viD)%hUg!0?he_vWuVxvF!F%?Wg4%R zEo2+gK+FDe6_(Ahsurnzuh=JS_)LA?UKbdKY+$oet4&XjnfHnd#H>%nYK2c@7pn2g z85B5X4sr-B`@_qbhnVXF&8CP4Lf&R3!){HoFWj0rm7x(^!k#q(!l4n{!Wff#NXVq7 z6%vqU=b}$3khW|X`|kiR6WN9DeI`f`m@h=ZvkL44uG0{#4lDB&@sGuNC`bmP>t$Vl z=u-YwKT6U+6pV-MHIw2))tZDouUVeg!=80P_(l%+#Q62AnLe}_`ME2$DtW-yxh?_Y zy$Y;DY_U*47~^AOfr!qsd)V^OSLXDFV?X4Hvm3Gx>rEHrr6If9vajv6SiJ(ZU@gLe zj5uNncncguqK7?TGL8_x;R{}u-=zw^N1FDBtRxApjM^Ux+KfG>4z%nAD<}c{zYeuw z+21ad^@X#)9XQ9Fi`AzHzrQV@-d}Q8SJx*Q&~#=t{bsKwSqa2eFS4|r%>hib{E9dF z3Cjr07(E9vYGZGx$v{JVabrk`{xid-xh*a~ZOJ(QzM zW-<}_N$3XI*x?(QS$IerLkSN7uLPhxiSenrbNhOmZ_?eYpGmFD+zzbRN$HVZ4Z69p zKt7&EW0rmT=hCKvc#d9w(zkT!)i>i2_99M(W2ot4Yz6)AapxQA=yJD$5Z;YhTk)A? z)K=i%vD4iODJat{40R;kMm5c?S|-JcyA=ZKn+iD#?p9>i6MFovNEXG0os|X^X^I7x zLH0G}s9jC(2Mu-cO)9X#dO!B4{Ybj|!9Ah(gWXaC-NRTF51{wM?Lh5^9`4l~z#Ds| zN%jM6`!<5xeHC#y>C~O% z&-FPB_3RR29j~aN&6e@|Rsw`{LJ1+XH>*2x2!z}?(avwd@G|-)MNyB)A*Boj~JJ3``@uwgXiRNx4!WnR ztrAkCl0DAfF3FI_1a=fe?;;E8`$}L+Q3)Gw)O=0U8bQY?zC}XEJBhP-mU`qHF^CBv z)6$kJ9VfB=XqS{NU!q63mm-%4kg!eVE6cRFg-_0^o3R>d;}>%HM5ra_CF6k#=a!SRJNpUk+;{ks!FZ=GmPpJJyJf%g^Q}hDIVKY}F4iJTcXI zn+V%|6CTVMGGG9Zv;ic5%m>bh_j0)kc_v7r^365XCQloi4-I}uHkoRo-$Hlre{7R~ z{S$_K8bijMs~1pZ|Gq0`^)kuk#2$duIrqfu;ZG3HG0I|vNO1+>Orq1-R;8-73QQvz zVIrL>eXx{u>iL*xq!&R%?w@}6rFt*Et(p&u-Fpo@!jzCrj!v?AN?JOj=2vW1b&3G- zXR|K>vDVfhWbywb$W5*2127XAc+!=BWcrZaAvqz$`GJ!zE@`E>OqPcw_$SHMFpog* zC-!+aBkWOUn0P4%ocKF{2IrPj5EA&8ILpd}Zea4hTk6Kgha2f(iRwSwcd$Ggns#00 zLKD~m`ATXnIYu$36xSbxjUS~jBM^l>-X)SCq-v{^pB_joe}_75D#@C73qJcDyan+R zOxy}>DEd+6Q%ZXdK1w+%UZB2LCJ+xJ;5qD%PdnqNh59Yan}PQ6dVGi=1tp>jxvwlj^rk24%po+vuTr$~^UhN|jK=P373pwSyb-i3o#zU{u^G~d@TOmObqQdT@l8@2e zv6?b!demmqV8uRZ(tboHgMl^a%I??>eN5mA$MO;;f1ER{o|rJAh+EL>pQ6OIn7z!B zt;P(>e+_Z0D4QIs?nNtBydBY<$SI4k9mT}zO>XeEkas;dByU5$Jt1RUBQga7lh@C} z{O5dON6q-HsIb<~C0c#rWJYG;be&q2-06-eupO~+{j5_=N)zFiffzLx$ppBrjlZ_` zw6hRq$2(W3;f*9Iw6lS|Wq2d~*IcW|M@vS{pJkFvEjDU9^km0A{u<&WCudQBGJaa> z*{o^RAy6+nO^<{0NJJufGNu>*m3n#W+s68=N>9d0Plo2{#X^5P_XQgJ7n&$?n@ASA zEAYJg?|T;W?%9_7X4Y8c-coDrj*Tl)53CItI|I|JtQS}Y6H2`{cO4|xbxP`_N&REM zOPZy{0c(vDvOk_~+W(lUxT(FRj&GL>IoJ8W?Z3tnBZC%(-i8Q=Ts|bT_F#C~ zo(g%;613;c8A^z-u$QWvbLM_DF@DF#&|2Hg9yh)pS=Y^;U3i6?)RIkVrzy1G^%LX6 zPli)weZszv7a+(fE)(Wh4-bOZ9M(Z@g!QHm2pV6{|HMUV&mr!7BQk5tw{_N+aNh!i z_7#LuZ_Ir%3|c4%alIAl)$`wA*}eW7Sw!Or7NF61w7#G%@*3)3-9xfLpYH+p$LRF^ zf$D#T3Y<)!lVG9oz*9go>b<}4kMi4UcRX7uGP?%?YR)%sGpcIk5VizGrXWNPF4aTV ztT44v}vUWxxMU9%L)hPBm zfeqo8 zCkbl8lzz^2D!N*N@IWc&cRVD2pC%{z`y*HHos))#SoGFqi~&O%iC!*|Q13f({I#vQ zvrn?S{mZUrLH)w4JxMl@DgOAi1XSvP5#0nE@Fw5j=!a2j?E4*BZiV^6T}ee3RmR7{5?cfGYXNaAyV4g$HmhnQ!z<9&(Y<6Db z37Q!Tb`|$`r;~h3AVaS1d*O@t&`UAX&K)1mztkL(MlodIu(1sYvdyXNC^~d zc}Dkx#8mh#iF^yT@#)9?9;p&_s_im77QW3_ChX$#y#Z4ifPInU7VN^>y5N(W*jc^{_uIVl!G(bio ziPqDH3@aCcZe%RDLD6+5Y?Xe(GkK<*e1`f|iv!0cC1lOsCCC6X5jyi_p><;6E=BGY z3B)hI1~U3MehIu(tmfWbd=C)j{ltacBjEXtF2xaf+b71Ror7p#4=hn)8l`07EU-~~ zoH~)gR=pW|cdXcGXYDo)2{7z!3ETI&S%;N>tln3qs%+%gKAjmARJNnJuAKpup=8!TU!Ijr6q(JlB3TRHE6kPlhcWpWUY9wB}~FCX`L z6FU!PUF>aflydi77ET%AW!B268}xZiJd&@Q*ufs&QYRV5mZ&&W?!vHUkb*3aWn9*! zgwo`jLs`<0-VJBx=3I7SA0od7H#gjl(Ian zLIf+NHBn)NQdWzz!%uM6h6GE~Yy9~Wgn+CLW}bTrh4E^5kN0hS(jS^KDCUjOZGX2rnF<<=(_a@Y5AScnP(EuG6`IDuLMG^gHKVo-s&`Zd@(~PQvPn#y#=rH}Vw! zKwr<$q9e~#tmFZnQ6dQR7Wg>R8PskJ)lYu|ZQM}75l6b>DPY)9+X z)61#Nn{^!Gf}ZZ=bofKeoe=cj(L?6RRZ^haENU}{aZ2CMzw3NdgCXx0;$V$ndxm~l zih2_8;XOzLQ1z0vr!`aDGi$RsVl!~zkC_Ds;fIBKW~%eSVz?S&4QbkpasO1~|Te z&d9Os@rC~DubVLdg46x!_4HpQjt3;H@=r&SDDob%Pr+AQi{AXU(#ZKlmo{p|VL>f; zsON2&Fe33-evg%B^>l{>C-m$Jc^X1RZOP*iAN8P#;)5)@aeu8qMtoimm+_6AWD@8~ z`pM?zh+S4}LU*WWgS6=320@J1*4LKY6Kq}2JG7E}*TqtqQc|DSstUw5RMZA#2_oH- z%Vq&nin*sV} zIBCm+z3LiHFBf(jyBC1LXt570T>n0x??CmzOO@?@2Sf~dTbL1pVJYfHQ8LGQ#aWve z&p?-HPbh#HF@Dz#xUn0ed=fmIsPyKmH;1h^M|6Zd5LW>Dgpr^R?IYSh|7|8kYAALaf}@*C z;OD{sb~yHS8@X^_q?Njn|61I9m5$yq>skx}Hfz3b}8&4Mu;PCG`MyR4X@PcY9w{H}z^pOhScLS3IxC{u$I@J@2B z=7T8D0vO3V)A!E2o^Fdys zOZZQ4*vQYoVdZHY*0*zdU;D!!^7Uib=ZKf8*yns9Z5rbmU4Tr)-l7Lpfor1keKFDb zr^S?M2pB{Z(dj0|;^OnHbm%42gEbNzDXWgpvDI0SwWF?m2u3+#_pQgPtbY311GWB- zt#KtXelkTs-1&><0qm4$=$boXqGbpjyjx`4tP>;%DGQaH41tjmUkfwte2u#_ zdA8tdrsdi0PEju`Lw0T`&&jzw7B~U}@|;8K{baNXZ%b$X`%@jN3ZbZ2<yhI*-j)$PjjNYI^-XJtq-SQCM=ikLoRnHjoD8jj~*#QdkXGIu*nywropXu#3L z20)H_&O#}o`%rx<;{@k+x?)#V@EQT4JVILL-Q4TswJ14nmqgyeKtz&tAoc}%!rjhS zn}O0;xSJJ*x$y{~`3rD_4YBuDUbL5S_=2tT9|e>aU&I=S01v6D0(h*r4ml4XhRg2M zdAwPABa$Xvur(ra!rYaTjjJ%P@O(+Sm>^v&pbNT2HH)nEi_A~M+5|3rwLkYAevetE zSK3(oDo^qJyW_!~qNBL55On`z^P7rv;VT7k5ZTOM_$E`C5o zT2#}ixgUA26C=K5Vh+Fb{Q(qIO21DkUie~3g=0K;1p{`j?AJJlW$e%6#TUi%w^3YT z1bkxO+h#0^FvfPkq`#fa>okxVHW^Rpn$}-PtyBF z;FRTnf@rB$`x=ZzLs_&yJpVf4+yQ^?P^u5l90(D5jTc`nYm9w>95W5;lX(NQCT8gV zopaCgKzQaP!unYQh;wn7hB%G-($|IE>ph~kR|(IZGPQTIOGj;+FUk>@<*K1Sy?+EI zs8lOA5O=Wos=X&^FMI3MzBM(feUkv%S@@$>?c2VF&)zrLF$OVzalH7C0?A{h*Bgr@ zFSQHV*$Z|EFoy!pM)Sp#bS9kHe?ZPfYB2Y5B}@m9vd~KvBN>QZ0`ajI$Vz{B2mvkm zB1vPnI4;KlWlujWR^KxKi>+&rIY*UlOhl8C;@NYMxY1%d*jvw}J(mb3yG$_I-C#1m zXGh`;P#1DDW+7A4w}D>QnM@|}eMZ4PJ5y)q{eBSC$ur?oJNwS3;MA`(n#A{kUxf$d zo3rF1V6sJUNuBfI7j*sI3R9~6%wEdO8F2QTLa!41OSiMdzYHaXz;TUA`BHPtbHFju_(n*Jm4O&j*)VS&FwkN~WGye6lHC2^1GPf^@L z?tIR0Ke~-}-)621q0K#qi3I)Jclc-0;*#I7L(bXIGl|V$00!?AF>*<4HrgGyuGN{i z8!r;)LOv$i_$4LZ8^gox0^W63Az>pVlD`F%l#?@mCWgRP{MrI#cM-ydtfF4uL*#B$ z(pj=8fVz=vKa5c61oUmOz{#Z5Ys~l5+xbNjq@mHzkLY{w=f3R`B0!T~s{pZi@~;Y> zkSJ%d57bX{!cClD4Maeo$nriZgqX7P*RKO zg-4l6jFYoTHnEQ<#;2W+F@BS_mo_rEhFV5r~*Ma5zjYT7czTGDDu z3Q9(1bPvo3R%mG}N*lF!sx6fa(w1u{QFh0T)M}5toqCS#si!x4{-^bz)t(s$B%ne< z6eC^;;AIa37*I(7VgBFW+IvER+H?Nz`+h#}=Y9FKW@gXY>+-B;J?ptYwiP{ShX(aK zz$kk9M`(D%$m3R#NtZD~E%nL@Kd0_HT9Sh?=WRQ@HWGe` z6#!)tXN`CcWqHnOctVRc%lMB2rDbG3W0L5ofA84SID)(o@7`8_6&@)z<=CtSsU+;o z+2UHlE#!^2om0#jZXZ<$LuaV#=OZ?lg!Q5YJ|c7|+IQV<-(Z;8}AyX^I#IBbDzPO|rUKU*j7lmH&nGZ%Mz zZ~S$DDeWaihFv_xYHa0$pT^-F=0~kK_v#Q?MtbL`_#hHOyz(gXEHh<$Z(1#reMOaT zO~6>0sKI^VtOeD!dqpM5wZY+v*23A)Njo#lxMG+k+xR?hO$~|HWK*yE0}h~{a7C5n ze469LWKy5?pOb&(V&?IMKJ!SO%N#ua=QCE@&hdz|uR5C-$G|xLeDZstTV~y+U0x>1 zKIl%nlkk0Bl(?u)mK7xqs)N6F=Fe4vhvKEW_>0HB?c8fZrJ|UbvpiA(7wch9ky5ky zS{AE0X5A&?5`<8pD_muZ*3>nauAL)9I&leAzmRlZPdaZU7-9|Y`CJ+fmJ%%x#wztp z7kbc7v4t;DJsHo>&z63+^Gh{o^}cA0-~Te|f8J0PU3x}zoc|z3ks12vH2q1y)y%ax z@2yAWVd{UuO$cTv^-ZJ#QvqCpfnrN1cpd~zC{s?=>GGdfdAu2SqZnfuW_F0k#Ui8AB%)U^iGzwC?(e-7;O+-Mp2J!m+ z{dH)czk#mtb8woCuku$6%chjj5p?^(TdKm zOyHdJcvXu5w2v=#1}+{ti3@hbq0zQN*guC4(j_KKetS9UbZKg#chX&yzJ8tHL=19oU=?aqglHj5_v;{YCV;K5#fx1~|cC!poN~Scvb-hhnN~ zyr=pAtOf-c$TdcR6C;e%I37tPL&I^E^j_IiC4gG?Ix&$l+$sCO^9n1@$=g#-Bd0C8 z-c0co`iCeeWp<+G5OAO*XU$7X_tLFT4{iL>nX$T6kK`%Je_D;*fv4XBPv8zcgFlbq zIaTK6K1$`%#TRo`|B%(mdfdI86#ol<>C>PO`S`4mBm-nhj0E)jdvq9qSnbZYLw{tA zovJ7Omwmy1o>;ck@KG9Q>1Ugz%W2C@k(FDGA28j$wCt6*oZh#a5{dp4KB)Sh7c;(U z7Bi1v{G*KOkAKa7NB@X>{k=Kh>{O?=myHwIBXKx|qoRa6i*6*Gg6?ujZb7!kHZ=k(LOl=`JZy5_9=eRBWLteTO`Occ7$_Qw5% z8HCp1odCkmj)!(A`gDeMUoOs4Y*fc%Fd=VAIuq^i2h{yPl=vah=DGNXRN504SIx5; zKPZ&xli1J?Y_~JR-Rto-kg~@c_-Dy^rzJCk4Ds0H{gDjo@yuxk6|vp6cteGSnbQ(= zTT~X~D)-#Mas141=UI3~B7+C~rX*AlUwOP5oZ$;UZrBiWujB05mgI;goDpsCAGm9! zhSWT_%!4Z(Ec$O+#+@^S!40#RD#OM@8*TVe^0bCg=;$orqq^`DC0sV=iF-d6-23=o zh(Ds==F+`iZupK+zJd<@^L)~MK3fQ!1!ciiaM)?r)hGUiOWSJrx{tT|-gZ=|I-1g< zbq2T54bX%p>II0$fddIK29 zi6edph=75!Pr8Md(~4W=OE|a=4-j$jzZ*o9-5|ikD$RrZY$s6h`{3q#qvDkJK*f*w zs7SiL{{uXnt_d^fdn4k7J|dp;e}IR_|2}oo79Amw5!YIe{k$N;hPFUbS35x)<(&*&NG9LsR39hb>T-CnAWm7Ob5QwVTh+ zqPim5Sz3C-kwc?&v63HRx`qCT3f^w^=^_mnyuNB)WX-u;cF~$<>#hU(9i~+;5VE`C zMlQsgvt!Ho7HYK~vCApIop9$>taueTo|4U%x4#;-9ywg|23|;55(wbDX|?spR3c*6 zR%8b7`$yESy^}^eIm53QKt!FL?VYTCITN57agWvbN8ZicWge`lTGY{#T6cHJfM8Q^=B1{79T?#L>FVy z>$3l#bRmssT56Z-h}LvltA=RRT%gODwX9aUE44oKO?j5s#8=&$0LFW3oGcAu>ttVe zjc<7P!ny6VX}FSxlqlleXw@RPIc&eMqJfR#G1|uKu>HfF`iWL#!}lKKvC^~Aekajs zRj_FdKC@M~H3E77(fc(m+QM^ldFFy1R`b-mQExjtjsF#ir)6#S`+q>cUdgY?x~A%l z=8z?|uMt_WD>g-lW3N+m?@FpC+60%>1J(?Xu&<^fELmM|Of8VW*?6P9lkUA>)8dXLVl`*$vXy}oe@C;H_; zYlXUhYN6xD5p2g{Iy)6g_*wT zDnZvBCLJQsI1 z+Itq-WKaCF*|T_NCR^fEP+j&4tmdkVswmpeLtCRvEK9%O%zUVx<|$=~p?!TRqW6)v z{r=3aeMp?ukU@K@iRhQenpHlnGc2OzT1UwsOW1_#v$fXy(PpMa=l*<$@>tvZKch_nwd8c%wbX|Pgf8~e3`uHMJsk{kjPXV*OLBRBIC zl26T?+e5MgbVw;IYiL8s_iKU!%+X&?Pu}B@94$v*$P+gXHWROzkCCd*YJ3P?XFNR- z9B$zg@A~DQ<+=3{DhU`?Y%#ys#d5200Ur!ORscsWeGWlbGm-bUQc) ziHW5=PN%@IvR!Y{NLtTv5LW0eQ~SS$w{`nbE;|TX0epOgX#VHY31u>z z2q{E(jbh-6!H^T?kmZ4p#%MM$oS}@S)M_O6$|>F^p$eO}h=?$0Omq#?OrbiJ>V~(4 zD@Z!y63%#-dIS^i**$P&ZpB5^N-nF%A?Ki-{y0BOiRta}eC6lYS9`tQt{y?=)KTmC8~kwimB4O>`qEOmF(d82o8pxw)9E(OtO zSXzZb6D#5KSN-T7@mV@!^}t@d57Jsg)jU3+)DEsZ*b@D6xjW<((fSAI)@kXz2&{%y zQ4JJpvuT7=qLNSJPj@nXRU8<@Ad{?|NkfLyC{f-sf8FV!L><>tsUxl^Xo(1d{)MuU z?w9TRlPZBzu`cO;HWy?(s|Qv z+U%TA&DVxVKAsm1cU~aEfp^9vvH_gpy+ew04z5JzdG()~R;;*ax*NTuEcG$}?4l|e z!sULoZi;9x$FF1mSg(nMB;QTJ4Sw zzdVaW`dge$pDDDjfA%=d79pdm&4`^u+nkH^#O1}@4Y^W zyu-De$>}tq{;_07G=<`MDKounhlxuv{9%41Z(DazQ3jzDPjr;%3MM@*bs@E^!+y8G z^<=$HYN+~o-7c2y%F?R@yjqP))4&47gP0!hL-}L@{S5kkqaR{Uz51CS(^h@$F7=gf zkR0Kki)MO2%l>Q8I#BUZW=Yhd<;;LI=BcU9dH0Wk5?aj`paOWJshz-AZ`iLSYc&MF zJzn(y-AU-8xj+c6YkLqS$NkwS)oum+YMVFUH*BqgIk&;I!>6SKxl3-hB?x5 zF=n1M8?04h%$Xa3uRBI7KSwz7di^UT`K()KuW0fZ=Oo!s%DG2n_%b(JwxkE-W~8lW z{YrS?e?iNvyR81~(j90#toA*~riGdk<>tm~7)e*j@*81KZY*1H34qX9HPa+U&dd|$ zVm%igs$BEeC=@QM$)QRl_%Y$m+zcWq~QYHa`Bu%Dc~FR6j_vE=mf#a{7V?*qm4MR30iFKwQ`Ovl4qOO%62Iwp3q9lFBD~D z!jbdSY1SQw!B=Wqe7P5&=-6)vjf}$ka6p|wlw=Ojw}jR{G-Uq)4#xgd(gRsaEbrTm z^8ZBdpwd6`hkHo>@-ABwQ6So?i#ake_wrH_`|JQi@5p`c(*>EIy7Cr{+%GCW$F@rS z&fObtz9P8Zwqbwx4E>2p`vOM(K4}iQg|xXWMQ5m{Yw^-vszyaNv|29KGwtsoBYXRI zm%pNsXnEeXvs-AURY3`ODaW@$o3^9j+Z=RU*pR1Jkr)X1FAJeBEkL-?mA{JTc7R&F zvv9H6W#A4BO|zX3SdF)c(*|#JGD@3RU^1lZSH@(AP~U)5UT!9nLv1Y!c0gCX?|ldb z_`hNKk2&uEr~GG;4A7PznrXDyfo9A>QEmq6oDx{IO8UTaAmjdyKfAa05aN zFoaC{M-dpLe)vryL&-^eEeSS1cKOIvvGn?|Yiz*^3c5_0d zWs0=#wjRmHYMxv&jr-I&V%GUS`<-J4mhHyA=H%Ktp^nkUP4!&siBOU3>|;Uq;|tR`={7l4ux_hv3XDw8Iv7P~V)!G-C&jE=)!2mm0Vw!hkr68V5# zx6cIEq2#gnt;7(j6z6>X95@ln!vXDvxGV4VbELbu*PxIXJFeZ*wI@bzF}_Q_$jR2! zDgh88-n|C#n2pRU6R>~bD_%9)yKrZ*xO{O{J=n^NR^v1DZ(|SiXI}3uW++|#8dtM% z)_XVe2wNz$4J%0kWsKoPH5AveI!6@*3XBghn~!J-{3GED?`t}BdGRJME)xCL(U3Hy z+3A4KAoErN-GJmS=D&w7W@|W`BDZ6uA|K6@30^C5h+a4Rh?uo?n*53;9m13O2F)>8 z6cpKdnBF)>p;AsJ@7|H`TIUKLX_{ybHsr4cnIKO$&M;)_BK|x!4+QsK{D8L8oQrS2 zXwHQp*X^C{N15Y%XFEsa#Npu4JaZuOJzSjhH^J}kWxN9)Tc!T)qCa!Ld6%0R@q&r4 zDY?AQQW~Xe>=k<_AgPu--6QG4qm(b47(eG3l0sRl6pO>t8P=)?^=ZZ7*ZE_uI!)wg z#bJ5QTB}rdlP|vCtW;inF^?czx!*VxRO6W{;+8LWM{NB z@B7ke9}K;F(B*>Bd-XH_efv4@A#QQ!A5<~ z|B-u8@eb@i+g~fS6e?p4PKd)8fA7(d`rp6pd+kM5^eE?swdx5yUeWUh^TqSOEIXH9 z?*0*9C&O)udx&uM;lEmc7>Y4*l+l?LEs|#`Fu8p^FJt zDD=2EyJVhq6exLxHJs`hSQBliNO4e>Ki^kbz6y2AS~}As8@!mmsV>V_SLt zO`aFN5lRnFoa7z_zURwaX%iIaO}s&nBEKj=_T z2*9M#%pH~0`{LLjLJI18d1TyqBd)pzuP|oCqJJgXw>nNZ%Lr(L<6$aUMEp@qm#{qI z;^M=kCRYeRr1)AXUoej=1(46G`onFv&0y{xFrv!=Q=RCJE`M#+FKEQB{PO^(zdsfY z32xOwtM{pmM+Xz=ps?8APamr2Q+X~eLY_=7eY@a&K~l8vulzy+7X6nEP-nz)Y|a0G z?oC} zv7Pi9j5~a*KM~V&@3ZLeqo!wa(cZ$2sTKv^D5X%*h~g{R3hh*l08@3_lmCt16lc`FO}k8zGkR@SEA4+_R-Y}u zD#YTbDxsAL*e3&jIGcfOXzSDvu#c-y1$YCz4U~Gn3GlSLDg@Z=;l1$nXK4l^aVLXWfqz`(mQdT!Ezd@Fp6k#K_g|@8J6G^E&~@=#jWXR2nT-as&ed!BUTb0 zOu7$rQ-rjpo5tcmN)&aaG6iHv&_rx?C*{S^Z=%xcP=-0b85?Q7w=3Wje@F%4Z%tCb zLlO1UEBT_5Wjs*Lu~KJ5W%ub!!>G5+Rl^`x{J(`KM9p^cZ8RTY-Uw&Lb0o`8CO_UT zin^Eq$l2e{5CrOI%FrGXT_jaIX=9S7n#c=@5aG4Mrw>aEr_bSE9Gw_`{n*kxs8GSM zW>HFW6wJfSfyUJS>@x{d+|tZxyx(?$(l?}=;61Ve2d#PFPfSyy7N+^GiZ1ctxGJi* z-8PA;{qIU>qI#L#yT797Yod86;O0Nsr8IsZTklF(hCO`a8l4RmWe+F7;KZU>&}e)3 z^sy{%ygmHN2`ug^_l6x^iOfZGM;)AtUrxGH-XT$bk}MJ3ugV0fldyT1O598~d{k)t zbZ5jB748e&=*&=2H+< zi2%LRRq8~p2kKq83%inTRaO4CTy*cXTR`BrAfV+lIQ!zX70xQHpE>@&v0tJ0*{`F_ zmPH2p1y)geW21H~zX|}tKlB3N|I7Q8m+3v}+7+ynN^_g3<5s_Uq*f$+*Lev=L4A${ ztIyxZ%3&rNghFN0LnEH@ub<78VCP8)t4BVf{XbVzX0H{{r~^d`mM$u^uLr_fxs^8 zfx`CqyB`l>rwn#qH>OV$xK4+2HNN&g>9kG*cNIb&fLP?yOoNA zTSjt;tUgEV?ke53IL`)cX`;p>)p&H!cr1+>S~UDYpCu^uO*sZt%OE?2IzDG#_e;8D zN*$6P#8fEd{_e}6P{&acsG@xw^6BiI5zX8>H(@FhzyT6spP*c8bF4>aCH37{jh9MI z!Kuu9=H*bCJEI(hpR>O0uv_t|n$6bq)|16cW9u%d5~>TmvOAh3G-hZKd}9tOA@9u& zBWdDUzA?4XcJ`w1@zZfiO;9UC??vAAw86!zt*2%~#Qj3Wvaj_Y@AiM_6=l~e*QKwv zD2+8f$~_0~gimp4)Pvrwt-Yhx|G@j@pyOn6={Gh?+NBpnNvhLNa9;Rhr1~E3le8~9 zVB}janSL#-JLYq}6go`1Q)rhT%=eS?Rh=Yn#+@w*_a8#Z@Op6W4a7upB#n{{)rg!~ zh+LV~@Nxd27>;+p1a9q5WuD{Y3l;FiTaW&)}y=wA3mPFBO zcwDH%j=v5rGzVMmQ#AT~nU`ki*H1woU`V*%K+Ts&8rtZ$qJ?>X_G%-48X73h`B_8g zn9x)w@jnzneTsWR3YFiPa-{fD=mU~M#S=Kw5thFN4KtD`8o!1?1~3bIk_e!z9Y7>A z)5U}LA#gXLkMSXefD*Kj#B~B(=L=jPueW^|u&$p0USCEG;HCBR`~sdArmyzFYS<4R zUZlp40NdX44o|=>Yrr6&4Wm(5Z_W?w4SEP!lDx?>&Ef@e)@wL70nxv4Xpx)hoJ*-e zBX3HG@5>>X5p?0G!%Bgh7A1L8++V;U(XB2bME>Dh&4oiwB_nQfL#gy3Vt+~AG%S)Y zZsLV`4d{xz1K<%bJ<=Zi7?c3k;t#vtAKty|>w{AP_ALiaX1Z|WoPNPISUAv=X#p}IbHf;*CO7@(`G>Xp!zYG@`08`>4-~8)405|ux!P!7~ zoEjRk!}P_~?W6Gt^+^Ck$xJ>FB|Y*jxV4Q!MQ|0MOSd-C=*%6%R&!gQSmg=Kwi+eR z`&a;nVTZ0~dX_!>TLHAkf;9gfv_%)i(TMSXDe7QZ(ebB1=qKv0;N702a|GQ07VULl z;kN)w;Z`2`Uj-$zSA~RsfYh}7#BcG;G)xTta`oY_!1ScrYw_+6 z`%m;mPvP4sQigIRb2*S9FA|TtZ+MwB6?!z1M@fohmmYV<(}jxE@A`D%ocjie_Uq4N zcqRhwA?A|$KVQ9%lWset()d>8$uf6Ix30e@+4E$ilQZdj{$d4;;#BQCo$d_f_McCt zC2pkpXlOG(v>oT6ta|fkhbh|kE&%1*d};{cPIfQe*$ zqHZe|p82}K#uAwEtl!hjs(DFw=4m}apY>IKmeYdR;bCz%F$Apw(ms_C zOlX;#@j8g16IEZnUe%t8>L_ z(W76F9>0p0@T;J70flXd-6s%D)o@;#drn=D& z(YwENEo3fn*^n*X!MVyWR7s4t>{-~HqV9Z**j?Vu8200tvyqGNDw2W3jDg*PAC>u& zjr5-mQv-?mdfN_dGE9vBq-0X_&ZRRG!DEWk99Bz=U*16Tcot!rS<`z|kSl>6LTHck zU8YIL!0<`cyhNq4$sQNfnG6&63tr8tw7!2-_a2MUM3l`|b0f{JddTw89(AvAm5!HN zQdGosMB40fjt!MSvv%&tWR=bfu|YSRjsP($r$24JLe$Gq^Pug(P^HDYGuKzj+Sj43 z%LkCfRr2EiJ?i99yu6}{t(PQHLG*8fi5=5>A@aKt?2Mlc)tIe2pFo&4XkERP%~RA5 zITFV;7)zmI_CmW84v|3Ra$xAuP$V-W%VEx&9K+eE;kZtr5?=Rul$^RS@XYG@klA7H!{0al9CH3^cuM`({oJ5bf{4x8pokn$ zgko_Q-Cu5Zc_NcIAD_hqJ>J-rvg*wI5WqbwPmB8l*eGks0Dz2xkCy>m8N5shhZ@Eb=HYp$qt$P2NYA;mvggqfK|~-vZ!1t}<)l7MP2%k$U5CPkuL| z`poQmBdU4teK2*GaRedO%$z&yv!E({d7I4h|9hyq$)M^Tv*eDGp)di_6nKJx+{03z zh`LuDH*o}pzlz}9vg$Kz6xi`B+>%^SqR$R9A?zFLcUEuBpU02b`OC{mdwE-JX)h=8 z^u%7iwxoA28wt=XVl)<|?`Jgj?FYu1TR3wy4lgJ9H>a)zSG>YM`R!EmafTf#h?Lzq z1;GC|#LMgx7X9bFpJwpkF$>I3+Z8SRG6I$EX7(? zr7wTOst+eM6WXz6ule{Usnupg!|jpq4i&LFl_`;+O|PiWr3=LHKu!bvj)z{1hhB<9 z=rWi+AiXddd;0VTFw~#dBsVjs3*!Pe4mXDG8?jvQme1KIm9mJAThgMjf?=2aET)1Z z#t>UK3kHpJCQx+ZphC|iLVMzwNeqlK%?!mtyxEL}y`+2+17+h5KjZ8!hBb6<)qIqK|E?L?*h>eY8V`+Q&mhnd3JmJn3A z_>zWh7;tAN;&sj3N~g)|94h=LgJQECRv3jnZ=VJa>XrurDnnB%%lj`e1FN!C}g`7*?a~O-;o=j5XVr z-5ReuLhgM|9(YE!3B4E(9n--}1_!Uyk57Qi!TamM_c?g+&~qo(kU25f(qFR4W`&Ka zX{Kn?A*?iBx0PK#LohyZ0Q;PL&bkiZ*P-*(*<|^}I)F*pL(KuC3jCy#4`BW;=7xc? zg5dXQZ=i%eTCq1J!~&txdr#h%e@}r?3qGbAG9_3x%A#w8kPR<8f9#^>&U~hrSVYx3_CNh1s9Oz#1UO%XFl|M zKFjCat?%xM5N|3s!OWDAFcwACb-Ao8MY>G(PY)x;^^7DSCw`^gOWIF$-OE1={SsYn zC<}RC{o8=D!q59pXSI~SK@EWkOyyGAnmBppV>L`Rn0o0*J#-C;AI)aU88veyQ##C) zkP}A7o3ntXnC_e$Ugu7k>^$H7yebE^d))GhO_B>M*@@~}7oiSmuGpr=q!MV{`W;d~ z(UEKPvWFvU)O+L!24xO=v|ePtvDI50Sb%J5N+hL5ReTDYljiNPTkkY^el9s`I~U;!3fu1TQfpr&)-} z_ccYsMTmk9|ikJj0ZcU7szZo}A_#YAXCn z_?CnV`?TF05|a9b*76fUfYrT#2z+(Fjj{pYOxVI7#BPE?| ztDyqu8&)CwW`3a;IVLDq&{MhScv0B=LY)H1wbAg_$YZqva^2Pl40C1#1|YJ{?@0_M zHPg`0Cm;j4Jrgcv1^Cww8E)O#g41fQv$A^Y;1;|4FB*}t1+LsaOlN0q8AmmdY&7HQ z7rgT;&>J-BGx@TfRv~JViL7Xm13l{)N#6t3NG7fyeA8<9@U}gv!&Gjnj5@c@u(!K3d~NtSL`MoFVtXq^A#)MdIn(Upi=8A2*|Ap3t%% z1rlY^a6T5!!#UV|DT72&0+mvKgAQ6>8aRgao%nlU)~!EffIIW{l1p(fbCIK?-rM+E z0u4+4u`B|?L;qirwTTK$KVjq=^i~rpZ7bHOZ;dbDTtFt>W~<>k`pLvbvb+gS>_t+D zII+>T8~w!$6O~41s2;H2agRVpGO-DnRF(B`?8Rv24`vrLuJ$dwf%Lw?(JDFd|vOQNZ>^MbRBkc5Z5ab!HG?ZI$p$i2_ln8jx>qkAQC&J zkQ?n?&ppgBb~ea#HaddJ#`lc=B7r_Q(O*KaK@JMir_)@t=1J==w-V4is4n{gOFPuUlSj425cS7&ijvLhI#6;9!ZW3a_CXZi^<|E)M{T4iVt32lNz6J z!b^s-=N@TBJ8^Yy#{6oqJw~bm!~fFzFjnKW)1!? z!Wu@f#ospm0C(U_Y!Z&V^Jvgd-U%p=IW3u)6T9;FgKn8dA$O7lj2S~u5}CgU&E45B z=r>4MIbc!*!{{FNvasznroDC7Ee7R`nz63Ea0Yp>hCBz45uZpNe8N=u6?S7!bByfT znC#}Tsz9EB*GiA|IfX;Ui{F0^qL`zs{0cfF;J>Leh@Na#7irHqm#`1o*w4)on$N1F z!YP|W$(u>fiJGowN24|St-J2v#!sD^NsbjbT-M@eUxYiQtFhj<|A7>IHT!vWEV>ce za#o|^{REe9aK8XsNk%-Qhe-F$3qjm+{#M!&4|eD0Sc?kI75sxleu5ZBRp+Vq1Ub2I zn>jzl%}#OxhleA?iSUmP2P90Yxs4p4C`e^Bev3IOF`hZtsWT{a$2aJ@j&FKWb6NeH z>^?_m0t*4V9|sy8Q1a5*L+ZpmF;;oGTk&yotQ6>y9A+p@k~PX<*LxPOiIV_^b|5r7 zUOx;7k{<&Vcg1r>vdd56Yyp2DN~-v&;;%ED=1lYy;7%^s2|V%l$*aDZOZ8kZ$N%o1 zoD;|9E`HXT$+!D*f*0ZeLw4maP#>$wq{2n|oJu^xS6Gc5Jng?ht@BI|WAjp-S$BLH z=s=IT-}~UrTn>Rhz6gYOwi&};TK-e)50b5NLA_V}xryw>Dr4e-NGmgI81Nj+wKU0F z{tf@g*Ci(bC?Yy%4NIM$r&Krd#&)?yTC}M+lu(LD3|6C(uE%PgCSZ>oy3&>~&%D%i zrJE?;Jc!xD*nfjRT*W$BoI=B2WVq9U=+QH*hQWRV^Gl6sSAS{RT%)0-7yD;4kuet< z^v)bm+Yhg_(>cN`YvE2tz`gh}=;VayVl;o4Iav^EWKY10_?J<5oik@r{#iD$G*f4T z)v$*-Xj!s!m0l0#QeE>Gk%^_@5()RGq)XRX8^}i$1UFS2q;6Y;Y(VcG-)dY;55apG z!()Np_d7Ws&DWOIzr`NpKh30AqUN5++^3c5BN$}pPGJ=5BzvWjDh|m};;Wxx7yJZ78(W@isrLa?a;1-C>1aARdiHIv#%V)rqKqeuEt>(kh z0kq1Ho%22$&*jfgXP1*VtDDPOuwsM zTdwmozMd}sTZeK7-bj8xZ%b@PPVexKx8k|NISJgtt%qMogga<&S|!}iqZ#b6R9=#; zld({PxN&hY;Es{{Q?JTt+jE|qHG%3a`qSEaFVQ^)HMIXRaf zg9P*_&zLqRd(0NN#`BGzQA?cablhgSJ)@QAKF4h{$a=^5_} zUt|00wvma(82hJZ7GH#6|FCyIXu;p~AYHtYLR!LB$i3Xee`YpwcsAh6>2O{mVSRZIA63T|P@sy>8oTwQDL z0qLt?{RQoM55#PheF$O%1zmAQvL+%rnCp0#w~g2{Au?E;N|7tPZrxOeR3GlUaFtGD zY|<=6jRx7PiV_PH1ym}wD~9LUBGki?w6r<|G*|I zPB^y4`!Bx3NUX^t;*;iJOPm{T;ZR>6>a^xxhl0gxatjCY(}Ml-ddiEQ_Mt||@%{6o zW5fS*RVVX_IZa?1@<}AO7pEz-Hq9~eQs6<-!LO0Fcc{l*6%Fsirbb?=vVXKhbK)vqN$aoGpI>n;-#WqLqpQg)($|z1_IaY6K|qZ2tkg5mJ#nyB3`RsM1Y~`dM@1 z<+ql_omiZ8Vz+BL-lE?u}0CLVAkclM57@bM3W%F&#%5QHAwkQ;TiBtDA~79C3!o0fXY_cJr;zxtm1~U04)Yg3Ocb~4%Y2#XsyKrr^4xwo~SxC}{3X;pn( zE^&NdjU|P9lmjDqhKlhZ`)Kb}@y|*}J*NYo#2_Xef&VIZaS>rZ*{K2nMm~gt2jLOw zcpJiG@@*n|bR^41bjLA&llcl=0S0m%m{7#mAoWI||IQ$MOJF3z z7WsMJsj>O>=kYf)YrY|=JEN{Wx)HrPnJc3$-k@*ESi$0Mtn7FBL-#UCcqYmbi#iUx z7Fp?l!5d7#o#X-Y(T2r$c&A@4esfkw{ye6#8m||ox3fekC~*DSWDumo`x($gH83AK z+6ocwh!3u>=rV?g_MUOEdCD~6n**pj7^gbp1y@#b-Im*fTY?0!nUn_rU?d2un#CME zfmviBbdM&mgtOnp%xov+#Y0qdHqJV!>&*2nvD6)5e7z`8iMxAiB5dla%_}MUSufo$ zgcBtzS7JEJ?kWs7bOAoy=$~?xscXq?MV>fuLS8i7B}zQPDx7ZQY;urhrNnG-*(u~* z1c5^S>%Hg4`(B6cl-}>$Gd}}!P1OZ*)DHGPG7;;@|fq(8xFghYP{&z zx++t(jfcLopM%D2n}mRl<5+R}P*JU6YO{fYJEYsb-_Qf-_R71Nwc*eM_|)&Q?o9El z{}iO?0R!2z*~|iTGKXu3WK?I#?7~032YpHJUDQile2%ZIEGxdO4s#`0>DpxkOghcU z%nieO;*CvK!!gi3R{espV#q(r@b)vHD^d5FP>ednIBLd1+ahhpZ6(KlD>XQMw9>l! z5t>Ha@0N=T2(0I51w;6bMXdM{Tw`;^0mbI%V2T7zp|dO9A)lcRT+PV@Y#ZJ560q+- z77#Gld~%$UK82*YkghG{fo`^&VV7tuN3Ni@7wwyj?WPm*Z=>jfBn@D72@bZ|V?%}-kkH~6%z@A7Lf8QM z4BblEmr=Ger_=i}7lLS!?au0qn1R$H6l?W<&Rxp{n(*H!Upke-^f1J|PIS{Ntvg-- z9;BWPTyQ=JuYu6w`y25g@aK7iMiOUtn!a^TNP%mF9%hrb!wi&$&jL4E0mNixk5FV= z(Qa~9KsH7+TX)x)ac*KyAj8mBltKrrhD&+s*}R%pp(vdP>xm|(nY$+4Jvr3eRs<6w z&QYuJO|Vb?1HYmfBS83!wJ+J~O-1Tqv6KyFRFvjc!*}Uata=$}q5zn0R z=xEk>rCTv78h#!GZ6W)*(b~15`+{+W>{3x29XAt*4CJ~-?dB4Z~2QVcvHzH87IgKKn`FXwcGrgN* zEl*p?v4+^^z1iS;#A(WlPx2wlbU9PAn!G6lrZAPPP&)q`u4b>AC;8`k`&0VKNIGAe zzZZmI9wY_3nompz73mywl}S2^ao}dPc=NIG)7j(jBv2(%?C_j|Wckx{<@16!od)?Y zs&C}x%kihBGUhip3ugcDw8>ZWj_cK_?f3YurRMKsOe0a7149zL%S3CeC!!SF?3xUA z4C2zE#E{%V8?(@sX>P^x6s+*TQ-4>E-KQdJ*V!Yn1`S6|f!&)(@1X~ND>FO_`%JAl znAEhQpw+rQ#za2$lTTLcU4;5wj;$(SS|@#cAt5CasEQDM~&MIW4lMqz!667#V4 zk5^?GOupW>DgNDNhq4Hwcs2|po51gf)M-klLJ9KQ4BT+4zGfx~n=9#WZk&vI%I10t z5{K;QQIq(XGZw`VFy5pN!gJNI+CHatHB6Av#ZYy7anpPmy6kaq&b}a_4(3D8O8mCm z33exH@`M4W4kjpVGdod!3!)M0N!^p6dIW}eEkN%rf&r}Ow&vWk8&VN&Mp+tz z6txk|@)ZYqVcH*@#P_fK!anog{pP=K@L!l(YvmW<8NCWPtL1Ul=2o1JvSeapB_$%p zc=4L96w!wJ&oJoI$i{JZ;1MqkUc>J=MDaDH(ru;vLJ;BNDiYDn<$=0pPdRz%r^kh4!3?_88MG{uhUDaTs~#ASW~{0MZz0uHrFo^=Gb`J8#RTp zV2_69jfD40zjBLW9u9k#&5#r%(FC(mv&=@hSm;2KRJ#?4ao-q^dDUzNH!UOq&xxJ7 zqSA%YTGCi=JYY*?zA+S+Zm`M(O79K9HSsbBltI?3fz`9!`^tn;iigd6 zpQT5$1;{ZX2;5&g<;Z_OI+KAIPX~dbk{!iZ8{wT&>_(b`2SjZ&DbN^|444SN;EmRCdqkW~kubMdw)=q75^jx#vW;7#7S5W$ z1n}f*N&nQ|iDX?>B*LZGLar~n&f|_DIfjCDmeZ`vX-hg3J<7)0_k%ZM4y?3`xPN@d zLvu(P^F^09ZRxeO{7&kC_T6esVEwtx@iCO6df9&`I(Q>56*da7tG9Y-^!6+>{~?1= zWg9}ip~O#t1vDmjktd~nS{mKUjvO+>S2_(9TwTZe3 z2|$yqX(k>l;S{a(GL{o_uRm_|Sz0tRG z!74DytiZR(_l@dbP$l4B)9cRg<<*=>to2BQ`8)}LW~BCN&J783*a3$@MRO*R_D%l1 zXw@X|;+brh46uBW0FicKp67gqt}?Bt%mc=fY0E) zWjw9&r|COHY`^HV86&@&kAF}9N+FwXVX{D_=+A?7qjk=wsN(d zS%9IxFq)qhQmeAr4tLutihhHKXqIrNb(%n!8^ne}d=7g*WIC#x_l+UZ%#=#$S|6lg zEaZ`&tyq8lv_OMX+K-d$^Y)74>K(7^%kY!pQ#3Peq;b+c?42UIP}ha@(D)L+&^zkT zkcYAzZ<=T1qC>{etwb@r+b_=V1v7w|;@{v@`%ST7j)Cd=Xw7=`k|?&Cth;g=T=YoS zkE#6V{TQDh61rOrU!b}CfJ*8p=sZ5SlHFT}s_8qW5LC z%wJr?1vKZzGIxUU1;1>nc9;OEinkIWqqyny(##*?y_k|$owR6EPj$8LfN|J+aT(%6 zgnk1$R-zv#E)Y;4;$F=#G7d(^Y_b}pyapS#QklTI17-;3?95;N5;hxarAt;yPR(-I zQiU1bRrL_Gx%V~+NO2viFtRLhDI9iJuTTfQCPHuA1_=@VdotY_nd*R70n)i&j1cC` zOT;@240H|N(e=b%xI@n4iZt*-rORe|RlQe*w0{4pF?#QbQiuQ-1^4DbPXQ=}P9N{k zOu)Tw`=|0Uu4;$86@%b=DyYMCs+-OXktBr>oYc;&yrzFerGlMC4CbkVj)BNQETJ+ zHPX&p&g^5OgZ`11DCDqiZo;YSbQXBb1$U)y>~*H}r1zC`0aX^f7cX(rZvlUheAL zhD2dR8Jfk62EU(`f*%C{o&*?i1tg%2QdbnB@(U^ z-HQR_UgPs~UzUTtvG_E2Hq{-mDKu?w1c@lvqzLwS=Nb@jN{jZZafT=}pqve9(Lp@H zf<~@~wk&7InEMS?qrsuEbW)2EI=>OZB)X%+XAF??JfI`gsZ|&24H3)P{;NIt-*O@K zJO7XyXQR`GYa*u)a*OH$Por+0lA_dv4M^iOrZshjPtW2RT;I8Z(p|;+H>K88Vt)N@mdb~A`0tTadY9S6Zt3AoLJNDO5U-Zmqhs53cQ&Z)6UCw_$A)A$zehl zc5YwLO=8Roi7_v!GeYM=u;dz|B0i=iK4v3N;Vd`tV1m3Sh?iaPvpMW^u)xy#&;Y&n z63IrZB&R19N$wenGsYi3vCuRtHS0SoSlT-#^q1}`JXzIEBcaQx@EKw7TKB-U1{{w?m=)H|upmd*iw z07_Lppx9Ev3?Hqz#tR={9VULIemGi@wjPSg@}iHw=6>q)3gI;-;%7q15Q2c?Y@-sQ zgj{!MvJ4OTR!#@GJ8Y(8TMxEcX}RZ_s2=ZDd4oO1Y2zP9&3LTHXC?CJS3qie41Ox! z`1qQgqbJ-q=wD{6MB8AmY5(N0t)D!`uejUT;Dkk8yhm$KKL-Tzs_k@7ZPJ>Oi(3z7 zt+eu{*=vryqko7-Yi7}DT{C07^eB|8aOTu+mi>}o4DuSte||${>T|MR#zOldHOFpy1iMcy8OyN~pwB>& zgp#=#C39AaC!#WTasTPEsA;SJ82ylc;@w_1vS;9;=sPbIUc|MAp(w{)v-Y+v5E1M9 zf;oFRsN@SoJ{bGbPL&=DR9?4#*8pA$zg%a9cf~IQ;3I+?Ymb-$vpDb6C#BTSR%fF% zv9a|ZVmIU!WHsCfhRf$|)L)H@TYeVb@r!54_ZLps)toB~qHHvHbp=dSgi1q1#S%!6`aJ%*>BXCS zV0E8N-3U94QY%HGOtgMJ+lk5q{cx79jYOFDe$6e*KABjflT~J*WG%O>xh&~W++cU> z)G;K&^arUo{!V|VbKCE{p@;E&xcz)})Ln)N9*qF*hy)tGaZ04ki@CSs$q=ndcwfK{ zi*mqu(`t}@Q(A%qxiAkA5U@_92;X8XMt1vdySqI;=G-dyn)KogJt#tRsSkiVGNI>E zg84EU+{I55p};zapu^6pWGcP5p?%ZQ_#@?wG~awS{M?xdacV3K}Z7 z&sq8*!S~J7SL4OaR7&pyUzyWN!{qOUR{`%;p;rZYO0e{SFJ|n)UdpkoA ziL~oqSQ+I@MNeLf}l2I>^6C-VVdIOFg5|u8|wZhNL(UR7))~-9QfL>Vm zOUqD55l%YBcP$|d#p&_&S|`i%5sEXJattUC$UrgcDMgK-=ERciy|E<3Ue9_elHN7B zex&>h{P+(O1-8rX-Wnf+S5>A_%%k>=D+vYf6IxlB)o_QtWg5*oQE%0BCafzu3ug!V z5&s9pTbfP&mO${W-yah#NY*snzC(sgh?At>d(@Hp>mHU3<5H4-{XBp^#AJ*bPbMGf z9(`4ap_%6!d`eAG-)EHi?!4{E!oRHkyYIb@PMY;J%mWVt{L*yHSuw;3TL{GIDR1c` zB2G``uj6~LE{1yOcbNX(^6|_!G|qa;JArul6-%PKqR{^<3OP)y?%r`?%l zTPrJpXX-3}^pnlG&U0KJR>RxChEzJJ7Mf$8`t{xT{H=^#(a> zlW=tIj1XB68s4FAF2iuMLNlBr&Jx>dkV+&${4^nks7cDur&@PTMBs)w_HCZG|D^XW zt&PaGr-+UgZ#CK+qD^c=!`&s%G{;nJ1d=8LT&@RM*q5!c;k9xYiLt-wBR5#TL?6M2 z5fMJIURZh*=XjIh07lO1A9W8Xv;Om9+?=|+9mMf-eW`!6MpnamCXcb!22}Y^0|Cyp zTt!hr^$uPdW(1vAZ#2VU**+{0^l;x{F6=YRB7YbS(fE57;IC;(_9pA}p(ALA&obqH zxm`tq(xs_;Thc+;T)3LC8GIcUuu_!3`kvObyfjerLe)`bY4$&Os%e6$scZI@(9 zXUqoY+fMHZx%%PPW3Wt>k#r14{#jVok}pEHo#(oDu;bdN##8w{o}SD-9pY2|1%6&l z+zjBrQ@fA9!S#LV#b5u?rxy%}2v>_p+mXmz63dh$(%njyu^T%9Sxav|H}wxp@vEV7 zR>L8n!A2N*aoC#?HrrvgqJtS|E6hT&P+J+JBoq1`?QNbBB-5SCx8d*H)aY`~GSK-NTs1aW?BjYwi6`o0DGB!923?+n|Cm`FiWn<}ni~dw^tz z)d;Cp2{4t_051+&*X9iPNmr{Z%mXZzlo)Hr)fMOb3VZnjyWr2uP*#w@E!O<2^8#^yy+Fh<^PWQiDNRDCV-SCNOHOS zU+G;4{9|oj|NEnlzm(H1!_pS64uUhiN4mg-4V-0^8=PL;FM*jk!uZcw4O=)D-heCV zw{CqrJ){bkiaeU+CXQf09*mA78wuy!ieCUYMLTfX?MwZ`4!2h3-E*IhC@4Z}qwa+i zpi%Lku_gl?DU0ZuduGE(VG9fP+F{V_I(+Mst=yD_(@JzxasBn*Vf5!D7wMMxp+TbO zeg0Ojj{Ka?RFke`4nBJae}k6}&Q2Zm=g8yM>=TvC48N;*QC%&P&)~0&lHT|PewDBV zTzm>mR^w0k-KWRZS+wf+iDZ~F)%YWG7T)C(12*-UP&3)25R71mnyfp-i1r)D`84C; z`y-1A@pf`>k@I8Y3vhl?DJ~nC|1Qsh`@s0;v{(%?w)#Fgd*ve0aFi(;{}%igVohGf zPj!A`1mK@GAVwuo0#ojq!Cb|EiAZp}VFiO>GCti#*+2YKx?f|hf;I9dOcoT8UV$~N zSN*>9e&S&6<$)TZDudYpBcc6Gg(2`~dj?=Uch0I$8J8M*-03a*iQJsB{!WiK!}W=D z^d6|zc{vLqtm5|nGA?;P_IvLroEnVZXvUwkp{yP=Viyr{1C)B9*Bi6AIrYQRzLd74 zL4k|xx>xtC5B&xT&Ukb%TN0P&Hc<$kkNo$=se8fDs28_X-a{k)G zNRloYVQ?!qG-*tnP1r~h;nu`CC@b6JxubXiW>fbYkB%;S(Im!nP#QuXsyi5rDQv>p z+U_B=DzqFqFq`_%fR3oM!L62~tWBhXAvP}DW~V!pe*rY8k7CmB`CD~M8XF_*R-4;| zHCvBwG#+a7%F?sniK8$+xsO!SG&fqtnXjmlb%#`gSRs`KsuKZhtYJLY-L#r%v3jz` zpT&6w53%~49wHeg`BV;odj8v;aW1|}W(r!BUNxQDm_twWZx5y~8Ww(bVy9L7i``_# z9T6q*A?w0$h(0iH-z$B>(l1CP8Z1~5S%2m8JhPz2RP#zWZA+`Yr+hnZ{h8WO*31nf zw>xFtgPO4zZI{2I$hEA;``K(nny0n@YbC+$saa=T*+Btk_HyB1+N1NO51ZY{dBb4h z7yd~X5y3-mX(E5rL=-Da&4Yi`DvWXqWF(KoV6ugK|MH0eWilNYI51v6es{&*HG+}* z`>N&qjb@&BK!218*wq6+Y$i$ULHKBK9XX>SR$>Q9yl&-sT3UOhd*S3Yzx(ZPe;dO& z%X-+0=k|?>h4)9f4vQPS8*Wrj2dB7+ON*$6$k^R>gyM^d7B~9C3f7qDPyylKHtfeO z)xzoaN>?rg;n5n&i=;MEQ?%}Sim?%DG`(OZ+*n=KD%tnorMhf~(;dqessp@rN06oi z^*JPbGy&sCz4F(3?P~E+%|Q>=stt5E#XZ+w4;Q0c>a2(HQ0%cu{TJ?V){3{7pOo)E zICGfDQrI77layXKb3BROOZjI<+*cv6)nOR9aGT0<+aYX}=qS8j-(V!PyKnU`D>!bv zZm}AhT&ufqqBBY+xYtQgJ>RbJH7qug+ncRMaH^LpHPM`zSPyEW3H_uopH4^8#Q{N0 z^ImAQ6h5)qOXG~T{5IoL}MZZjMW1rxmoX8L063?E1>?+YZk_4`1&6rGn3q=pxOoLT+d zlg#^PB{LOOQjMPuIWeRan#6H>3)u!OhSeZBjWd+UTvcf`lz~4qPMzl;L}l4;-}9(e z8D{>kvxvb*;_dk)R-j7mzEpO*`|%a&;(12e)fzr^NO|8YIW< zjZUn`YN%zN-umAlqJD-?+L!Uh%@0otKI41L8*l>$ynhb^;=1M%A0wv1YE)>ax$Dud zWXvfwc(luV6k#ChEa}O&s|B~SH-<5EB{#v~24n&&t+%O16E>42l89w<&QHnzg0~XR zCP1Eln`!kDMAWL)hX`aeIZ%={Trtl@%;($209L6F4gf>ITYtH(R0$B)!|USV_IOxV zKuN!VNK}6@!7XZll(E(hZ-b15F~(2y-J(2oedJy`1sROc(5 zfC!>uiq^bo-PJvi2vIXbYt;p`#IvXVd@Au($!}ymSElzKej~(zGp%IZD}>@u&frzP zaDqiG$3svBEO^vQ&U2eed-G99~=c}^Na-xq2=hrJrt4rDvKIyfw?ubFs zCV3MfQ!wVFIGKgTKhKr6<)eTjGi$V-ifjHaeXomE5Ng=e6F+t4dYHR)sSlD$scs#4 zNBGXerXH>} zKO%2>)>^kNPPk^2d-CodnG0_gW;yN%lgP`Pcde0C3`ij6y4s|@z1loZRv3v)o?Vg9 z^WL=|4cf8@(;w#RS z9G1Mv4hTVbBg-GDq}Emu-hT~}FHBKuVFdea((>|RqKOw9E6s~}LDUG~sndPBfk8yObQneSIo13!Ya=rd#3^yu$6$i>Kf=E2==H zGU>Sk6!Dj2_V(7<3FpSSD7!BMFS+lVW0EUD_t-oi`OwkWnSuZDT{+tzYLYF-LHjN|#rz!ReQptv_K>UaH@sR>4h51-_Z+izlS6uf4TC_?d8zZc;OfeK~Uy_BWf?r0Og@ZDA zv!FHnkpCJBk=zL46xaD(#+}7fD3BY--AmMQm+qiUa&*uy&LgJZ@AURN%=9Z!+4MVC z{eIc+*Z8O?`V7(j45khY5=sFTAWTr?S-P{(ab2!I_^@`_&?>^^yhNy*-?WNvn;#S( z3(4cm`KTs}WWtd+z9g{{xQO4Tq^z_K>#S90p~TT$u>)`8^<{;@&|j~zxTO>pbO6mW zRGNG?;;(w~t%s8@jOyOu9pUttefG(&&`S&h-bd0x=2x0kM)j^aCD0Xfli|9KZo)XT z18uX5+~VHCF>2|bl{(*Em0rA7{KNXg;FEL}hJVPK*%&AQS})aq5=@|(20GjS!HpAf zUdVsHG><5P99x;|IUgke1-;zFWtHKzjfV(HwN`C6G{&dpACVW=M`1=mGx0;IA< zC`k5#chQ<2>+V1Ch<)!2W(-54?FBF`vWG~c<)yx8jzOz5_`s$mTE3)1@Lcr@@0x%y z#R|eL$!LUQ%d%nl7r2FG2UC33miqZYd{*P3r5C`id3L#hqpIgF*AmTsZSLK#h?0Jk z?xjtdk+EzX2xDiP)1eDtH*sbtdp%~;0cqJL^?GZ`Q53EnI$j3n)RO2Tfp6neL5-o(V?s^6q;lsqxCJ2)`722hnaS|1Nl+R(0&98Lm zYxsS&VtAcW`>xu-vSRLt$;eHbwDG>1)d_+&fxj_t*#aXIfa9eMUOTk4sV=!LZc+>wvw^pIS2%_ zvAY8uqd0KGvFO;0#K{z=%zTpnl=w&)d!;`Ot{MMa2j_^pN6b!X35L2HB+|ww|LY9- zzf&E)!|?&1(L?wLkX>e6fTe}?!`O8QZ3a`pSh{J=$2mH>FJ^THyB1vC-cS6NUVa=W z-B$ea*MBC?eSO|KB$~OLnfW;WC7=L~_ucDAxH&(To>_t5f}+%*${c1i%M-i*mGkIS zj^zebJFSMTbb?=e33cxG;X|r#!y>s~48bEI-H`32ag-)h%#wp3QnPj0ixKzBAzv@J zP(S$lO^RZp|Cr-3VkdeCPay|p#5p7~+-^1KzDU$**#<%UdgS=~Y^7^9acext<9;sf z*zskr@Rk{-xGq0b@A{l8VTmZUfHATcO2;?PH=_VrGM3G0wHk_;ZsK+83LorFo9?23{+{M z3e{>9yK8Z~kYG`IBT38rhH0YJ-^le9V|vC}RufsX_5Rjjz{0uCR|=s(k3sCT~TLVO%RA6=t6(RK}$379VQd zQ;d84I<&ke6ARv(p8du7rT$4s?A<+5`#ABIx8h8`Sd_&yzCch`P>fC-)bY;~9RJ+t zHHi*7(!H0H&x&VxDw+5*;S{3#)f_;5`FhiKrf|ZqpGVh)ieA13yjIfZ>I3Qdm21=v zkN%qL5^#Cf;ucL1ha!m+$Nv&se1;9H@Riu233%|Na({6HLV-4fPAi3D85}1QHCY@5 z&1wYF`BZO-`gcJiHAri-o$VZkT*5_C(Edro%t0aFLR+8By}_pUR=xt(C=@|)D~$(Z zYOmP5X2w-XnhrH^oQitscKHK{d@{q1ejS+>5Y>maS6^CmvCI_Mc zy8Xg{!)`ahyFSimHt|M%H!HO0Rbw3D8>HY&sdf=y`Sap^df_o1Eb{3H;HK1rcWDu| zn32sS8UHgN3vL_7(&Ty&&Tz|!0a##du$8B5cqxCr_LXXytSJe<3h`t;qWQLTk1Nu{ z!SnrX|9rI?-imp&P@E))cLCY{i%4fkIj}6@Q4!}{kFB&@;qVAs4`g2Xac;?_U-3L< z|AJt{6vN=Bj!$_jVDYaqM*C-RP01Qjx=0D@~zi>x(dIu`_!{|AbGzCYQyL3zilj| zgPFY9yf?R~e8F5wP_rwqKy`9;h1ax+(IVMhtQjIvLLZekLSpu!_ra}^ymPDTUzhN9 zk~Ps##k=D;UJi<_F~_wxPmz_4_YXeb{b%8)QrG3LpsVX9vl}gsYAX%<7vU%CHD98B z?Oc2{<)&GLm0xEks-K_JQ1|zUGu=xOdS3tJiY&EY)Czyj7u?(~%rS&;0TYH!pbv907Kcz8eYbK@qalJEVHkhU zYjAy$ajTfYu9o&B=ycCEe36?Uv1P*K-DS$3-ND1|rq?9mh?sP;UJ+}<&*JVDu1O5Qip&~KIVaD3j%Ch zMSkJVhBpe|h=jUt^V;xy1v+HrADG|+7?tUh=E5g!ft*T|X|0A&RQi7IZsWKaf{Z6~ zN#Z4m>aZaoPZXwBO55Oj%{??Gd#G=xA-}zUk5^f<4kxwe)x1wz584Z^P5l<)MC+F2 zc$JmKUFFxZ`4h22dQGD^rJ|#zKAD6GDkRJYgcIfl7la}jd{cC}Iy0-~C~CLzvRP=6 zSH0#e4Bed%6@-Qo1!n?qK9YCf{{!bkMT7Vvk{YV?P#2yg0nH6HH`z(apJNn-R1Hd5 zfRF9L;6KFwudQL90R*)LUj7xsK~gyXG)-H3bO0<^!W{hm8h}=G2`38CdoaNHlK5tI zU#I?6O|6C)H_1R!Z%Fbv92|!$gGIpTmsU_C}9 zdk1B#S(G3}vM61Bq3EO6e4MD2Fs~>$iOptmKc4W2#z<-mot<(IyV6v^wN;mSzQ$x_ zeVe6k6EVpH*$(3OMI3oPiOk^@UwI`IbBK&(MXga&x&7GNN z^QU4&&tFjv2-3OdY!3T0hpz1CBUsF`gRc=F*b8Y56~O865mYliwRDZP=zwf#kwfqg z;fpX`DL_>3gXLxV(viBn8RWTIWAYq%2Pi$rla7x>nD25;pK35O{Kp1>yGG;G&89CM zhWrL*7OunBIM{{z7y&iZ&61~Jz`0=^SB|x>-Nk!F`x^Sx z1vm#}>T2iX6Tl&Sx(vXP>Fnxat_}15TL_1Pd6Fwa8P?Z z)0Z-}aY~uDJO{3%2(Qo99Z0vmitF-Gx1PTN3DSit+kd&+1w-&erLN# z3j;ovot<{2-@r<5c@xW*E*fl~`$~is7+Kux%;Yz-E4Z098;_2lO*C=y8JbJ{>#g`P zzyp%;o{NuP(U_(SK28{O>%icG&0k|cO0C9uz)>>@ zgKQ+5gU3gWD1nTyV=&8PJG`bjY~3O`X#vk57d+U(3!8&rv{4ca`>pI=6@1|Odfa`c z^x&HjQIl4qCauI|X5vs2(kg4>9A ziQK{_hlh~JTExVv+~JJmHy=h&3Xh|Wmf(ga^t(s;`(yt`_zkEzIP!4(Lp;0$UaE0& zf3qfHO0*evf3)uJLHn=!Y+Rl&g%kAs2j8=;Wh7#-$NxzpoWu@`GZx040%V|@ zu+D+(fI;dqT%*HA>xOxA=oK}85BP^4W2h~E6CZzUlUc$JWE5GpEB@I^|A(K(7$VPE zFR%o|1(YlNPgLJJUnaKIyM&q0z-$*gJP2+YX?Vi=&I}-09GAqmm-dN5EgBP1u9cGw zk>OE_4-owZ73l%D4vb9^pPEq_@u^N_MSq^Dv6EIi+{(tmr{}ZdH)i74F4$FFmKA-j zKnPN3LtrT}x}gnW=lKJ{GoJ_Y`GwQ7b(GvF>kG$3>*MCT1sV=YLU7N*V#%6{YciVl z@a7@UksLJJ8uTu;XW*)+}D-H~+%2 z7(rq34$ZVP53nzX5V>D01?xU%yR9EzOh$CH!f<9go5P5NjSIUvPU20NrbIl{w3&b? z1*?XUAI7s?PM}4%dSBF%$+w@K_9xxC0s>a#Y|;P>=4|J#ahy$`@6FjZfz!s;U_ZZp z;8@0X4K4QXylcKVXy=K*Fu;j2yA|TbnUmTX|3`QzpS0M zr6RuBLk`se+0<=p(dB-KyN&&i7%#(jz&nRikd5VwwFyb>ycfE}>i6%RtIPi8-uas{ zUjNQnYhyIlX1m9+5#m(X@C;I%WZAzkq(5klWNz$T1c@va4)e>V|0-8B_Yl(Oo_R*k zJi^kY6P;<2O5avaWKj5<|LN54Z%UOe>W?&uk8lqhV$7AH~(1 zT5f&a^7!wUJ!#V!t-`4dcFSXV#e(s2Jo9nOpAr~LOf z3wdQ?;BNHmg-igsK2Fe zD$`py>r9ScHT=Z-HN6*dJ`QiJcl8@};pkp$)E#`!#&EHn$)y++h!Qtk;?Z93UrDpl z8sABpl}z2L+QhDFIE<#-xr>}ts6?KPtxD#e^P2vVGXu6)r22e}!$cGv>(_PWvQ0E;V9gFL(*VbaG!=L5dRTG}N+Cwjh2wC)2tCnTzUufv zBJ@23;zlQ{8t6Azi+r}z{07Jr`{4@Ehr)4eq7J{{_dZfXXXmJ%9K!W)I-<+~-p&pn6*PF5T+ z=zeqKYnS?oY)Nimm)H1Z$wSSpHkR^iZYz1&*Vsu9)vY?GG@gP*@8dD^RBl=(H&2z- z%FSkd?kHsq4+ZHG5dkikcvitBNo6EKDwSldgPxyw+8y-#_#t=D^T!j*0)(8r%|Y)T zW=9|ALcphZE8aljg>g^h!&{M{Q@po~+94RsE(s3iA~6P!lEGrkYjS}oiZLTlXGSNt z8cg{QG0Sw~S?Y(;9N;QflAkK*ypJS?M-sLfl-_C{?D-WR9#rV}$R z>Gkfs0fZ$#fljLrGR;(uy!W*g3{n6dSB$KCms{{+cNU%e*?#(6L!%S(wN>&*Ds-_v zYR9FUEoi28;5`t`cqdkpc#-%vty|;5iW0B+dLcB44$MbH`tcyV9a4D(-<;g*CKher z_Sz|KNaWoqoMl^82kg5(Dz=sXT?aQw@=N){w=X3C--3e(s7S@%X2MFDu{FK5n+xa% zGovBrGi&_9wTK(U{1(fQ=OHEJJv_~lBVRo`+C?aRDUsEx=2aRA#6A@49s>zOcH)ei zH}XPUPxD^CFtY~52TE3!kCgIL%+np_J>m>0^!7H4#5{XePda~nIXSFtEUeLU@|63X zAceEME{?VeZaH#RUnh;h6u?ve51};Ekv`omIQ6JBC=}ANJrAm&2Y@$<3Pa-%rB zE8*hcuyf>Nf9VmYUAWxM*RAMhDX3sL$~GRDukwI@kBkrzl0|(I455f^Vju+`R}{FNda>O(7n7oOu%YP4+;%52~UgG3$bRkI)q?OpR}onXXj~DMLg@cVJMzO zjxc~_qDiwVF_*0hK6yMta7r-tQx(Jo%hVVe>Q{y>b`4qJ@WAw(ZlNj|%lo`kr8Q+p zWGfp}k6;`MR;H zFL*2d9o$VWJ^D#D8+r?VAknQpkn}#X2_?lT_mj3?$_jlV(rxDd9sJ*hvI1qsd1%y- zE54~MRwP5;_{?Bn>PW?eBbZ1-+G%U`sjQ95n{F2BP!ZWy!GYNNLRgO3$7K*3^w_L_UUG23K>9nN1 zwhP-!3BJYa^fTSKt~~q$vPxuMpqUQoD0Ll96aLU{)f8Wg8VU1uS^I_5X$Ynk2W2%2 zp!^1+i9t9IVemy$E7ZV+j!WmSD^DN%II*c<(uDBSNUk@vU;-MbuSl^0V~JQ%_6LU# z9+kV7*R+TSg|t%hQahEx8bURM0^N)Qw#fD&%5ne;h+dvu&Ws@K>Gn2u7_u)ybpo0o^TG1qhM4O`1&R`@ygP3M4Hcdq5&LxRB#NSj<&4GlD>OY4 zgJ@VgjxKD&fAFIa8A@|n;RHEqr3s&TE#9CsS&iFW(Ry zM3Zq&Rd~QX7fexkE{9s2kZ6MF=>0*41{C9t2ofjh59d0Mig&Dvsqp0vL0q-D<50vR zvgv9qZ^1|1`W@ zTY4j6u5Z$B_yapW*RZFxly;msZ2nv_xaTb^lJN2u?yKATsRTnR)l*1NHkB{=a7)C2}&80LH;-fivFztkIwB3UZ1ba z>%u=qaCSmNDo!$Ov#x|=b?~PF8?!WzyukJVvDbyGu!zzDA}dNZb@BtdIXf`Tif-nZ znR_|7)7_h>7hBn`#gV}ak%wni1)t{u7-5BYnvHY~V{&gxZ{r@CI_M#R_!XXkhM)GZ z(eQ)6g@&^tCBZ$!A4Kn>rJ5L&S?>@Y-ciiDyT<}{|Fh;JskJRUg|jS;Jx(hygrBRi z8EWjxsIlOWJRIHzUIuUJQdGgtj=j$?5FL9*ay2@OwrTu{=LU|?Hvp1BhhE`-c%{G; z5wkGK03t`F=;K<9pUng@Z>*n_&TT;#OCSr;)#=VXB>5bTyqu(<<@nCpYK)n^G2*~E z$zBBb$KzhKnx~T0+mqF+y3bNTpnGFa@$tj4`tdw|%Ovoq0hgB>}PcmB%ZSAMNKq4TsxICIufltpXWD9Gpo~fLOyR zLz=)Tl5T3`k+OK7JHfF-iGdfHu|4@yDir6v8?w5dL1s4D?N;CaGn0vSGiUj+d|t+Gd+60-x*eS zCdU&6i8=6jlfI+uM{0W^!@x{GzB5_ffzpPMM!M0I;BF9B>H!ki_Z@OXcBJE-Uef_E z1%dtX8eU6xGWxCECqbtZ7B+8BZ03pnk+m~2NL8F+AwX+bwc~f%sqv5vr?r9T@%1wF zhrPmAjY!V;K0#v3UZo|3aKM8_wsRk?`=_^6KL=2W1aFwCbp)KulR=MvfqkB;UYja3 z8Dx{=dy~~cNKy@G1g-3FZ@YKv+cm%|3um3gm^8xu$?-=RWNkIs9-cSv4F=qu9le86 zuD7i6n(kt@wJN;$baMRG+G@iyP5a~|8&yuZ)rFqR9+i* zF6h7NHSOkN#(QGR<%KaPAx@1Clhw3KcYAaqVl-X$E69w7>}~(r+VRhEN@HN^srk>a zFxKO?vANBu@f}Gyh<4bDtzvrhp9D88DM4p|#d0(gtKKXv?D)+*DZeo?aRcPyyTm+N zfGqGKO;Zv7JHktNCZels7olr(%wL*I@e=sU16skdsSFAP6f7o`a(F2?wF+iL95 zBgygD@3x180>C?jYT-NTu89CVTyzH@9R850IyC&DG&9{UP4l5VN8eV77>-TcR!AWB>888cFE%~v9G7Nes?D`Sv+*BTwdi6Z?Mp1)67?5G!|fJhzbm(& zv;iOe5K5y1mlZM>DQmz$(tsJ?EK4O06D|9kBK?Y4+Xm|@@co8JN1EB|t~NPDNyKaV zgZxhy78Yt3_yx2#$`SBU*3;1uta7o=|G)}dhCSRMHX@&oJwLjCyxTn+&Zd{};f z>1gW64*>UQbvXh|CGs~D1!TzP3SULejUk&bj^KWd9PI6tbu2TYXe%B|l3ckr*|`du ztbrqv?4s`MI%TsQkr=PnOa?ICLJ20*H->!dRST5d>+Je5jW0PrznBu)lRkUMnHsvT zyaA;KqJ>=~$Xq~JTu1jLlbsAI`<^%nkD(@bP-Fh*AN%H73+aels5pkgi3jW zozjaFRHdAtPU(SB4de|Fr5ctufTS$x(MP7`@2FJX0QrF73suY;;E(38@-!}9c9pyV zX}qCEQ?76!bQqZ7>18{)VUaNw7)Sn_lcZcQBk(?GED z0^UWyTR>3(&k}HCbFZTzA%?8sB0)BrpD;nrTtK+t8`^gD)8TSz?(?vB+l;|$Unae? z+gDbC%IHQ{%;e8K!48Q5(Hb?$;U1Th;9*_?cfv2&K)T#gp;ax3Zw{~4N*7fBiiaee zDF+YApN?P=7c^L8r;bondx)EO9S`>FDM8{j{hT#{Pd>)=#Uxd(jc-ULIB#pIlH`4< zTSe;bwsijTURI++{xF2Gqi3om@BCvmdMLhuGIi%K9^1EJ(Fy7NwFGgA`l5Ifk!lN$ zCnfAT$)$(-I8-mbjV~jhKX+VwQ*vorU+L19AXX)O-`zKgqA8WhrCl_+B-ff8-B~-j zE#0=eDl@u6Yf=8Dw}`)Z_l{fLLMxj%3TO&e}vpNN|0$ z52b_xLAt*y5lP8glGKIG67GFpx7U)%Tb;@5MKe~HH=Kcw+Z&u*gWuz2iy+mwW@3^4 zeT^Pq0Xu{Hxn%;5-EC1e7H#zU2hPA0kDq7!4Cg;aWEvA;qYzF*Us@8J5yOJ6s=6RvyXv~?ezFolma31CRe zuM?bA3d4<0#_q`i-E?`VnfGjAszqVblWMhat46ovAg3R*^kZ`LV~&2**pD{doPsNw zUzn6wG`jIBCGhNBCAU=loGFpwr1mw`q2wd@lb+!^ zenC1WDk*?`I$GZk59ab5yNnOCRfZ0J7G0iIynM)>{#JCEfzPlWbXEK6c5Y-z&SGZl zLrSHF7iwYZR8iOY!8fQ9t$gzHxnV|o`C6xQrNI}t(Rjy%xr7Dy#O{31jY2UuJK zxz3gFT-MR?VLD}j<&31^a~KR_^sBMV;ec#jJQf)r>^aL_o>jc;g7UX=S(BZjS88}( zZD{z9aU-1C-_O!DT4MtS9lNR&lOZm}APV853qXW)=-PNJIl>>fjE>Sg8)4c}GC4oT_B}DO|Cfw{X$5 z{T_2JW%OQ?!f1n^^gm5c3)1aE3UuE;MX3|vgL7p+9NfW^@MqmGp;5Up0qh0(DQD98 zi8s@Qd82y0yGv=;a7GQxb% zKS*f%_&r|s!CXU$sP~TG6I|(T)bpvKbK4#1s`dnpY88Kp$X=p;`$wXkJM+7N8qjm}bDbwxW6 zbT?X95nl~2SWav2MFLjxt_Ipq0<;OB0)c!ChTx;2?_4!zlzYz*5-^eG!(Mh5^A0Ye zO%lp#@YL7ID0G}`XSQCjImjBA1XORFupn3h5{T6-Xm=PV4pJm;Y2`9PrFfb(TVsR* z81+=^Ko)Gn@P%_@(*?|16POO9Z5xNd8V*Sjj3Qco_ zeNQmwROazhHxI+F;`;Ik9RxMHe-n$(JavCyK0z(LMzdfN$OyG1;f-vQmgI~m6ML0- zYDR?=)8l-lU#Ft%)38Q|_rW)f?Os#PPvw1r9Igrl9j|y{fACfJNQHYtM!0|D5qub! zE(Y=AXRPauV$N1af|D`DLB$%7=cuUKo>X$Tff56Kt8!!Os|sb3!Qf#8Fpwn59IV=F zjFhT=1d(T}GPxwRD{5lVUVcg7{v0IW%E~-EA#!$=|oU} zb~3SJ;ThSw^==B9yyKG!H+|uOj_WwO3JfLoDnL8Q{t|!Rbx@=xrJ7 z)S3J>;~LJLmQRi7opyXG){k{bc6AvNyAtUPNMo+ubZ*S5K57b7wsl)R+^Y)b??~sd z)8(%&=Wri9Y&8AqakYSh^*+RUgG{S~2e_W5UJz+;2<^$8g*M=dasFspD(i6Z1hI}J zU?}Te1`dRZM;>%qK)*V}6|$H@O*|xjVH3fd=u*k-dnkD3`54vdXnR@(S)Qm}1nRq7 zI8E|M$X`2-T1I6&NiwO2+_So;ES^oQ^D;fTTQ&VDrU{7hty%uaxnzE{ z6q28;$X`MKX+WsgMY!^pkK@zFG7fSX^Jad0fjM1Kp)ZhL8O<@xFcdz>FZCu&`iinr z4g3b0y0(Jm##x2dI*M3VZcHCvxq<)J^M6M%g$kw6{%>yGs|tOw%{gY@xMuDRpDmuV zhV9>3eqFLGQ}^(MRxl*PUhdFmZmo2un*cP_^+|M%NY$C#o3)7^B*C?$Egzfblte9ifou-dUC1Q#C0QgwiiCUGgfj{q0EX2r1IC5)mFc403ug{K`hrB zR}vdwNRl4Nn`vC;O79S;4xwm07 z6~HF-#>npqH06CUustHZMkYT`XDQZQJ9~0A_DUo?bnkGxn>{euYdV4E*_?iNRrDUa z@F{{&Tc@d{rHXs1@7L%%mDsTOC5ESwm43F&LL9wjy>D{Y)w%kQQuiY^EqDH;sOsGk z-eOfCKq%s7NUDKPhrw0&XAOc>(>Ask5<4^q`lP|u1piI0NKqihSmQM-U|lZ=mPV+5 z!y74Ku4_DM_rQs8)BiATn&O4%zSW4gWD8rkZwtf$k_(6Q0J$Z{1&`{*S53^Sv6ToF zHW|Ug=&lU6SLJ3507Pj*Q;DY+@7B1erxA`V_B%)<*&XcLY4fQ6Sf*~HGBq%+Y5B4z z)!ejP<&zG))YGA**Hj}L8|mmC%c;^5eUBB}HBrsh6K`IDGei9BNQfxfWX`ie<#y{z zl(r_tpA2TZ`j0`q{cPPT@~)B3WfjYcFZL=j>jT_|52X@qi;1nct}JPb8GZl|wCHzO zX~3}ci}pnr(@p+Cf4o1eBI+LJK$CgN@xQb2%}cR(Ny6&j^h!SAtuH+)=ZLuK-Xpcg zR-qJh^}AKnJh7#|215*m*bd^hhF`xOnKc8b55Jsme#>fSCpja$ST5e4snWD)4e$GBSJ-T4H6 zx#KlS?tTQ6z@WIsTmCbCfzau;m#fg6S5YQ{&o`r$x7`3q)7UM$#o)0wrg$M5@>*}%SKW|@yzDJ&RbPoNZ@Jt6T&E#EX>5%efoVA9 z!K~r81s8kGcQO&Arx$pOnNc=NnHGr;{k|?JaAGrPi+d|sxK-(Xd|P8znbtfZg4%+fyKV+dBQ7T_D` z)V62X=u?7kSbtya?@w4N{T}_1?v_$&%*Sa2nJLe z|I02^HuIrXg~c7SIDQ=IhQ;CL;KlLdTWxWKy@M7fLzOk|^e+x?-BuM1Z|KMd(HV_> z=*`O@ea8Y%XJru0<*m(a?Y_?%9=7P=w*@4nzx5Ad?Ash}fqFT)aY#O;Dpa^jm^LMl zv5AvMl~a@z&)#pR(wBm15b!K64*bL@i;Bk2tqnd6cjDqWcM*duKn}*cClRco=xDA7 z=ZTL|Q8U(?&Q03pk6!EN%C<&QW)J(PYJhVWPgR*Z^O@No!F#f@)1BBoN&Agh9DXgT zLIfZeNO1w{1GK;<%Y|9A4A%V|CLG)L$W zz1e)K1Xq<$qGQ{U8Qn%|xu)OfaeN!{Gs=4Kb{^TYU9y z!6fO1S_wBSj6@N@(wm(PLlLPvijtfdIf7K@!`wIFa*#L#-7mdu)xem$A1t09kRUNz z?GHYJL&v}o_#}+}Zi}AGizcx~_CdcP$!L)ivAV&yW5xRynQzN^bro;|AKqO};Kbyn^ z?&fcKsCrE`us^tRi<47+n5}y~(FmP<<6& zDO8T=9_{j)ZBRnSVqUY{&SE}KyR6ie`!jXdlw}ID-=b7;503O%+9e;brCr=o1_8`x zt}MqojB{=G2_~2MjbS-fcbdIj@9Tkz%W`GMMGs;98gl>gTv=(lv9%mVThZ_k3GUuf zJac<(z={w;f=`8386$7gxA-I(=Q*`K`G$9roES;DZNnDchV50F(U zmDrN>uGxY@g;YzVq3%k;0%F1aXMvEba_b6XN;(fK=VPI!EV0d7@l)DOCZ6+F&OpB$ zTctGjTLz=qGI3j0BT$FI@2-*|k|dL?%6DxQl~6XEBY6f_C5Rh4DL4aKnM9jJ z;Fu8YB3JEkXnZzOy51g#Jnw?b+^a7_cJ-cK$5UZ#u!wHE|43H4VS`(4*7Kq_fPZfP z9;m_ARdn>6Rw%c97wicyIH-1?Z38by=IgqW3CSFRt2$=c!q zh$VaMq!`+;u87)wY@<$_vwNaHIlxl{W8<{;j}gsF3H5!`tuB?8y#GR zz;p@tc`RIq!sT9aD7`maY@T3cS8(Nq806y_%N$4A>1WA%o!N$;q}NvtW!el zwY@@GQjFk#(;fDK$Rs!qWmmhVPp!Y+~JFG!pRn5~8MSh?>5pfSahbVh7UC(+G3mb#kLLoYn0cpU>a8mTh}2 zhZW_@a7~>{Q?HWSXP~Kk?K`Z=Te&w`XmcOEA~#jEDy&1@Jmlt6OaTgtVLp5fUh1@0 zRn*SgnA;YA4iwY*W9gA`C*dP-Qeno&`*7OMu8M?{)h&gx1;y`1Cx@M{NW=6C%dL~) zoF$Hz$*rrEC)ZQZaTVVzlrgO*J9e37ak}M=%L`?gWNpV9 zb^9|E1Q)RTSq9_p95b=gtr^l?cs(AY5x>$Qo5~Mnxn`tpk~uf$W8OP&uRA2`pd9^M zdPo&{avh6m3ZLw2Y%P7XlAmq8Ba)At$`?uvx9u76XboTef827>LyZ^WvhhJq*jo^% z;+?q-No3+eQ-#2S#ti+zF!(Q!j;xEjwYhatGUv7>+uk@^SzvNc*T&W*JCD{DZi>}% zh+FY>KwP~yxwKaU@>b~33vg;sSXr({#AK5_05rn`nAG1xdlVdx)I}Dhwe_DcCyOa| zid=M_y<=WIND>Cg!w9@9@Q0Pv@>CkP2i-f1JClv;N|Q>;`6!)VSvY?}hU{N8Dl!x# zkaO~f<7uUT@EX{xRhBf2(s{7277unF9w_OeeE*o@p9R4xPt3#) z$@8cxP^vY=<|}v~1?ap9lWi?~%`FMGL~k&QFu1K-qU9b|S-RQPHuT_|dyx9ZM0nt4 z0|B5`&CqEF-$j6wd)F?i8fvYMi=(`^m?pg9_zIgWleBT<^6q zPHqLuCSP8dr0rl+W;VUUV?Y%w zukzp!|#I)fG<0D6Ux;nDG>wjorPI@gMz&XUUStZfhMW=kr*nG>JH zPH|7HVzF(>#&<@zM!c1Oq8k&2AJCWzSM<853Yaq{IWUPcvSv2L31fw?^aeLSdlWg< zE|ChM%L*@D-Wy!UWj}WX5>Gu_xDMe|%<=fjb?z{ojIHTD*R7*eq#UA#E(TjWc#|`n zt%TPkle&hv75w$h4Yi9RA1!lBHOzp8h0HX9%Ji zr1Q8e2zZVz2tKZuMpF$?sR{zy9~6&08i{S79wJ-&qGv_qC>D zZ~3to^ji1ImPqe;3MWgHhIpHw-XVar+_u2aUwr+kZk{wjj(?gk>OFj(^5E!m)61&I zP9Ep3m3l2A6j zDSJAlM&Cu9f)sJ!wuv;DO$659oeSvr7_c-eK_B!N;=P0p{oLoq$!EmYIrsNII!#oW z6}eK=Y*f^I($`G(3pi!QWn-=)dE)tS)*WUu{N&@eKa*mmpg z+UmXTIm`vpwxhdmd-c+6Y;Sh-flQ+HmQf8}HnHJrnQojw`AihrTkirPK=#6CKV$xylhlRJ$WQ5ho#J=|H|!ax3%$Ekuk-&IZhoRea7!n)IJjlv zTZr~BxCtaoz-`JVIs<&!+)G*SSI=f*+tNrNd=m&GxMgBn!+l0qI3gqsfft-%aLf`& z60PfAx30nM-K-`{N4nXs(LZLETWsB2|3epeG#UriF_d8+Qig__=CCR6(YHYZfTk;4 z9@P>ypWT!Z+>nWpe?HW=eqd(+_QxP}ENnE!Q_*k#)$w5x(D<^6PB%V>SMNQ(f2D7x z?%h?zayz?=TOW`H)VaO4dW-u#3~4|k!<%q54g8-V=sh|nRd1oMbZ-5EMG;KF(lHE8JBA_TQ{iO6NN2?T0$(>FTyU|Q z?R(6Vo^B})qJN&ZvXJhL5GS7KYxnx$`~&Lv#01fI`N{O?^BDav9z}!ozuDZ*?C4d} z|0>^omRfRy^uI}q!6H2>DI2#)1za2F)aUfS`_o(Zkt#Ktza!HB@_Uf}cRz_^QOn77 z+^(bl%|e@`|E&gV91Hs5$z*Hs}3^HM`7tf-8 zB{6~%O5**&7j|-7xZnIUrbvrFA7wCx1?lkL*F7`R-)GU^uO6bm&z~rHXMrEvu2EMZ z6$KNYXRsK%p%x4B?`!KCfkTv^FD2kd8l)3$C;cQeE|w#0s+>axtNe$qccfossilXp zBcd#zIwB&?VFh(Z#AIO+;&?9=Y1m}Ykp45`LVoLvn6BGY8}HExOOT(a^I@U#eT2l= z8L>voVz{IU1YZXeIdXkDi2}tQkDM^%fh;Gp_ZcYLQy1Y2lr+Y?=rZxSVjH%!hs^F} zMlTBM@QVcvCbO3%f=QxxZxZKX?JRE90kanW-h!ehNJ45@#Nwsmy__4-jM&k#hJ~`D zr5{|r!;Y4i?H;hf!{&MLn1~>(aKlfTNa}XVJl&*)yv`O;H!vbY8+wUV2zV>^03ooHn z5@Q^atIpyt6U(#S|Kn3nx_`qa5q<)sHon_Gi~;?^kg?oN({^jffPMmQg#Sbvik~49 zdCB7QE-Q?AN(1m88}*MZ$LT)>($rxBp_1^SOZ|g;{IPKm>Sk?s#`a+s4SyHHuPvL6;3ldBz2<@CU~3z2xgGt zWVH0iuIor8coE_nkhR5fF&1x=?aO|mKHDAadf2i6^uo3pFao}QgNvL{;4mT@1iYy8 zWTn}{-CMaHTux^#gCBNuH<(8H#O}wie`8O{ts*^AP0(Adknh?WM1=4k1;j!BuD{OQ zUbj&lfLKZdt1_=30i854nLLWd6CS^91c7grIkIde`*tJVwEDSG)GE#7KT{6#wOpCG zQGCN45Y>N%h-m7<+5=bN3-_4{B|Id{4QXd!YzHL+UCs6DDiGB+`?0q4SPnqMy79U) zBkDK7bnyP;takS`93ro&pt);jQp)1Gt)`3SrPhM{D4P z#l3#vw%)hfMl`%XQ%Ebo-GvY1qxf9)UJ20o)TWB=o484?o00oKU(C{o{?*TSpM6#C z#;2*F*KYQ^vCopr@!%_0=k9o#A_HsFW4GYWw26Vfa#e29)41jMW4G!GbL62JPnTD7 zg4pB7R_h{OiTl!HpW{}#v8`;uPdI_7VVo#>{jtvihI2E>nz{4*Mh*Q-AayqXmGW%< z)(VDSkuBU%&Q!)F`?|PP&TQ%@h~H)k*x6UXgz&2Iu`x0M)vyRfPTc+Uh~#7ZD8W>v z2QVu0%*$Npo&nxyWL;^9OKdfR)31O*AABVmbil<%iWVMxRWJY+0b|uuJvwXRk?XURKP3SBmfyCla0@DC~qqh zB)h!3J_V)%rQ1jf_9mZS#n?y~`{#Or7cTp9=mB080B0Pq0%nUVfE8=0oUM3igCluC^+8mxPN1bi%`p z^1b{kqkOW+d(BB2I>y@0IL^z~AzS^3#h_(C{7uMh&_}?) z0NMRAooDJ+UsX73EzOloD@;9VtO#q!jQ2wl4h1hBR@6u32k=Ng%lJ`m@Z|4Ez#?bu zi2tGQMAaGmjwi!Qxs20u=h5!v@TuNkGaqlo{WLw8`SkWPAG0#J!MVP-2cI1>z;*v+ z1B96u$7mz-R;YhBRE;u?wI!TsL#inWrcJ`1;CEtc#&6|M03R^m_nc$Vv{m8**Ykwv z1#G+Zue0q>)9N5*F<8EFhOk+g{QHuH1=uce@=Xy+rW``@V=2@iTire3LH(?I5$`8X z7!&;b`4oNm6q=VCg1OPx?Tu_yVbw=Mf@S zSV$Je`R_CaBOCV}M;qrib{&nkXY<#PM&_&u#oSL}vhj@(>BiUbFj$L=e|tHd>v(sj_a?th2Fi5kzno?L;NIUDH)K0v*DGu z-ArTk@6XmfFTWz!=p7TLKn`9gVKl9NuI#9eITNIwMP5eJ+!-W)8$$wUd~g3{Q)`72 zSij@Ezf=`j810_N1koIqpHlUjM5NAYdK&nW(8d^^Cd!EUHEn=XxbVppax z2^Lz3Sp-v;*K}#AR-59yQwhDE+NKH=_xY6SY?A&I*&Lj8hdn3pSNuv5HAwp86C=(j zMZa*ZO9@5hNJN8~!i^(Kyr%EM8vQy>JBkmP`mUae_tK&7-*;7E#>FL(eWOE1o7ozH zxp>v@)ybe*f#S_Cay6YmuurUBbQ%V1@ZL1wMH?}J7yEEKXgqSJ1~ylRm^rS4V(|t| zaF(~?C-kjlcN&1Z?Gw_bv#g^lY~)KaF(faYw;p7VF%LV<;5bI3L?x_{j;yiwOm9VX z8F1G9VvB__ztiN{l1qwhpf)ZnW%Nc$L)Dfo+H3NaYcRJ{KN^35=5^dqeUtDzwylAr z3Uz3d8X6-U7+vsnB3Rt07?8j}mr<>haNT(HOmF2hnv%>(UMX|p<1lh4xPo_pj<-^H zuO?ApS(A2hpU7Ra2cy-;!ShhiPGu=Bm^qLW2Bze-!Ed=H6t2NWH8C06pN!+>e;s(i zSW>#-i&96hA@* zTwH|1;6WDw9H>}bcuD_03BK_Qx{R;&(Qq~_*H$j1+RJGN65_XC8Tn)MHtg&EmeE%$ z1CD>Vv#8jDtY$&>GBFl}h;2E|n8Q4JYog$UTYhjVod_W~J##He&b|cL5`L(vgsOu! zczw6I<}k3zVP)_hdh$P`JyhI4miAcl)+Q|lYn41pUOs?6TPRx>eB@_LP+|6N_}k+$@BMn)l7oyu-zS z)$KF4TZB?Ym=8g%Z(tR4wjYD1xBM9{K;ewPbwy`=KX@5TFj^5sBx}0#RT3(j0&=aP z7SKKh)c+|IlC7=??S{DK5Weo-W8L0W+=cH-M!t*7NV^4OJ<0vVk;N}sNt>Hm^v>XM zv%#x^7d3#FnJIaUmn(z;+n{ZPz|0i=%l-F^p|PF;4~!zb+x71)SBR9&SK5yL`M$*} z*?jva`U)b(O)cs-oMXUULhmKs@>6KYZLHi*JK-Cm%@Lx_%EtBuKc^)|52|rNP0j&J zh13RbV~r7BXA*1-#Y#jl{Rlti;;3lm1Esp)Q8o~C^;MwO3HP_9uqIIp>p0kSh+ z(+2T5Llq`*Fol>o_1b~p8xMgmxkG?`K8=?67~~l1g8m1jf_sfH8Jv<~R3^a8vdxAM z4K2Z@IG7$s-8N1esr(lwOs;Olwq&JX1Dngy`ZJizsbWLWY38$z`6xG{&4+&Hs9$OX zr_RB=JgrcuEq{Mr}TG-Zs;Q7&@Bc2}9Go`<XzDZ$rf!aPpFN<%nvx;B{gEc==lZxFYtQG@ZtYQfJfwl208aScDLnQe$uPHj3 zj9-Sg;`gkeDKgar@`Q^^Y$0^42pQ4jz(cQP<94GG?aEin6sNJIW9x$d0@1kVe#>ai zabb6GA6L`yby{CZL)!dPQ>APusI_y>ohy71S<@eNt0ga6LVud)6(?-3EL5dtAw z{hi#j{%+Tvtb0!7ENj@;Q=h{X*)LoZ^K)Y;F1O0gxXO7!3Gm&}tv|6&P|o)tUj48M zzrf>eT^xoO0vLUt9(;j*Mb4+AJqZ`tY64gJ&TCb|_=|0S89^B-wB4CP87^V~Hu!Vp6Mh?r zqz~@O#_c+b99>_;^^}~&Y#~iKue3J7uR$||)aRIbw(bSEW%u}gd3MY;!HbB=+?eNz z;MxQm0$eXCp^eTEa9gejzC!x`_O&TiyJc_qh%hKDH|`2NrsXT&NET|1zfa4Jc^!kX zExLR;Q;BZ)`ysx`@5K2t%05MHtOm74rwiy)IS}Ss=Lb1yN8^RT+bi0W!E^t{(+p@1 zXQA@&RT=~@=P64LBm&dKA>1H>|E-5ug*oshej`GS1MbJ*xBNE5pEQj^SuhB65up7hn;@~4=TZE^#tSp{}yaxS|@idv}3 zJraCLNX}l;E3)|9$7c#+teY83ZwQtu4ikB0Yk%vY+wSrem|r(?#r#-!w?UBmL*Vzd zA4?77;OB=w;Tg^6nCW}VkFY&$m^NTH)?htoiZw~!8M8CE4^$x~c3^~bL!ec5` zXfl4TAOe9+4|zr&cPkH=Br~hD?Z}8I^e*>e@=>^6Nqjr{|0#Sai9eUynX8?Imucr^ zg{h-*3nw9DTCNtW0m;aSz4 z6=a)MJNO$SqSVF@kt@aPI_BNk0U^Z4r2d0sSEKepZQ-(`rj9`QF#`IF z!mP3l`2#-&1(#63d10@gw^d-iwx|dVvo~jAhlAM+A-b22t<`N@YZOY~|`802PZG+vU;%{#7l8p%$W2dPeK%Y>)3lO%-g#gyzdtG-@3@mBpQNJL|$@EIZx zA)gSLc6DK@95^wbRbE1pp4|3xYA30{#(mw#NAlN5Njyb8Lw1tV!bpXwgr$nXe6#+8 zl*>LFc{OT(btG@)XEGG2B+lZ=bmE=*)2PU>5W&{YdyXk3$&KBU$=|%4C3}QXxHF{u z<_#*)n+vG9#5k)oY5C9-9(DrOBWCxMcu@Xcy{5&&(a!RJ&+J8awgJ6c84HW%H4NVB z(}w+#phC=WOmV+|K%#Axg-MV-$&;Tu6-Q|nKXUJ)UH zf<`Iv(6nk(M+FzqyoQ@9Wt6!c`C8J4N81+x3B#MIOV~q#gYARg{nUD&VobQ4&QLVV zXT6xCOt!WqJWO5lSm%-Oc*!CrpBv(KpQUwdBSs7cr5FXFud$IVlSn33Eyhd@kfd_!P_^(?xuUV!xKrM_pfnd^=8wTFL*}V@#I>frO_A@t& ziGJm~Q4^|!H@m}YIzyOL_pHPY=qmi=nPd6rw`i7Nr^UNNS30c*em{gSb{F~LEoed< zU;MgsA}xj#*?xPN{aBwpf0OY}^ibMZnEuBmhp2Wbzf^Z~F0<^$G8xp-kP)lTx`LloPh( zCvSNz-!uxA7A$3Z0ohhfEm+`2(LwANv%>lD#eR(e20B#fk-i|EXh&br@K#LZFC0&M zf+u^owAPK+_M}k-GMq%aJF>=_l2ttMrL3V-8A+iTs~R#j*0T?`GgWRq77bO1XrN z5-~Gf$c$v6?zS=db#KU;Bk51WUczT^fH+7p3?vh8K@z6pRE~rET5j+J@-n>mOs{Dd zLxJDDJ*{xZ`#JM}nV;#z3lw5ZtZ^C;R;&^;gA3K-s`4_`=3bM-K%ufb89$h=YaguN ze;3#k`7V>k9`dkLQiy4-t%!P`n~oht#dR^&?vsT(CU62n*W)#-k|TcI;?C$}7JWea z5ZAv2ovHgCjn->czV*ySBqgXn8}@vrWK*mS?p&v_Iu0N{t+U$vYnWcSxD$4y>70UY z99d3wTI)@%jT=e7Te69x{S)uk!$|Mr`rU#EJAFhtce3StbBFRS%9@#7El;)oX)yIz+-a%}TYh z1o&}YRJEB%4#iZMDUCp^WtQOe=s~^W8q=$Dbj0M-R}*$XDBRIjfzwj3(w@|7%xS*0 zjBzzHl0(zZ;Fjp-9Jy3#BiNiXw4ph${Ov68kCTZWg`Z`}QnaEASUA%JY0YiiZU1;3&kD;#IJwzuXK`hov>Q;qX5kk$M|7nn~RL>0+^%t{$E8?%gY2EWgDm4 zMM6uwrUlw$p#0q0++ULMH`AE>3Nzw}?$MeTDm%MRD)M`$k1Pz@mu?GfWwAhcuL*lJ zvd0>4#RvJKO|(S4M0&`6{5N$D;}G6kS|ZqyGDlSfpIL{j(Vrj4*+-1OB2!DR8}ZjO zfrj{N_=@qNLFq5K_+dnnoBc-lGgo$WQQXtrvQTbPk9X;dlj& z+Il&O;M0Tng*z&MgN7ugoS`#W8wyh|%Eb1uKEdx-(rs>3vXGhpCyFc)b2(3(LVwXb zurEnY_)0X7LfI$&8gUb4gTmo;YJ|-!CFpKES$8=LcbB|UqH-#*pd*O>$}1(Ym>u`_Lm(>XfGP4wR`7^{-v5N}sf@#BS6ng?bVIryN|wS-R>QdhFdNpg$s;T(i{9gGs7c6U-S(rm{Ffln;OA43 zZmLKlgY`lbR%X83HPqDr4@r##%Gct?pw={Pg(3fj>5s&x ziuxl|My>qJ7rOY1r#hM>sh2Q>rLY04JOfpc6XS+j!Ult>NI_Y9K|hNj`$` zR1(w@be+tt%Gb_~T1Ym&1Vf?}6UVPq?zxPs`|6&ScoYdlSkQtrX+1N!o9ARof2qC^ zh3G)va;u=)s=ctE3ZByA?pw(SOK+ZoEGf|%XQJIs*`$hnxtWtKKS*xoL_NE@_-w3w z;ISB(x+i#O;1|3Odmzu!HjmSXUNnSq{M#FNZoPCh%==k&(wu|3HIF$OaccYXs; zP3DO80`&WXYk8D94U}|)EqA%xtoWv_OU7HVW%0)Jphv2K{7g(%Itb26=k7R;MMRG_ zaft1Tdnl?Wm11s9UG$}SV8?W?X$;s(Mud4(8nBSl<}-nNI`Lxt2jJa{PVeX2k-Xf` zwM4|9`EW~t90PkwHoP$xFohhT`Fgam1CxD{-P66h5Dlgt#!bCAF65ihQ0=iQ8 zENaO`r$qd?5{IKf^105e^Qajjb=yIhP3EG7Q|d2FWXCM}2gDVs_TuS0B}u|9;xsju zs|uMjVhX)*^c8l5Un3@K(Sbx;!#=qujbZ?(H|B9joWlX3bf#~r!n{nJ`K+(8ZBjzn zHH%Q2x^{qr?6y(_73KG*W7P{uiFy+7Md;2F3ccH0>Zx5eC3twb)+UPqz81F?txpY0 z#kRboyf?pa3w%47K=O|zz;StZL;0)}0R6NxP*^RI8p|zfi?vVA)&f!!b zEwFWA&i1hJ)m8FPWD?jR88eQJc%$(W3RFl^u;6<-JrusA3$w_{HqroQ|WO#-yVy9Mui0DMb+;k;zx9dCtd z>tyOkM%ESYy(%icA&yje$q+w;hC%yT`?6KrvY;_s)ZkOMj8;tcpKXhh^;?GToA7e( zm>#F>Na1?SbUws!%u(~gVg99XN5-?b3j;Ck1K5Sc0kY83JP);LH!#sT3BGu+mo zOr1AeA8GRSMfi1k%@jm-^3M|3ZbV<;YNfS8XVl@XAO|~?^XcqaAQYY^8-l})+Gw+9 zrDLnZn-PB;Jb{y2E+iQ3+Glu5E7sJgnbt9h!`<(=CKtf{l5mM+$H4O}1sY)G*ZHu+ULQ(1XNgu@ey_+!1Dwd@6q6;DyXIC%C7{)=L!MYnsWhh4=^~eIQ}Hm#pg} zkVI#ao@YyUh0ZhDI2;n1IPn7tUoG%qn$>Z3w>u^!`5ED#!MV5}j3}Bm$btFkWynW`vlbL_W#$0h z{_XYoHZO+j=%q#M+H3kYO9g?dUSF+%#FdvLeTR1%zIw}*Tq?qEQ%dg%6dKsrP#z0U z<5o1z;yy=8SOTEHkD}dSZF$3moN?X==LsLY<@0$-pfg@9ha`h+@UKFdUsHr2+RwG~ z!U`Qamj45<6+vxl*b{u2XBjSpSi>OKLDM)M^-CA}@y$>hInxdG4@EB?{ts=73W^$g z&3%9>yq>)^WOiVHR;36z6R$;G~kE7+;~{p#{fQR$lV-+2$=BjHK18(kH(kW33g+;Ur6?(a_rbZ#k&Fq=GImeIhd~Z$ z@<$_OXe8g6K6M`BY1~&XYfs@U@>5Zlja`IZCDLg8(;{%5-yHT#Q5ZWEnO#s&FJY7r zC;a{f{3=#QdKEgBe#p-7)q8Q@(;%${sk(~Br31m&m(V^Az<^bEsUo2d{qu7ZQK%xq z31l2o*$3!_lgJp`79Q0a*5+Qet9JHcToBZflmD!I)VahH#^wn>0le zxJ#qfA~#J~!dKWc;&vx|K9hL6{wyru;|9yKgV%v=ehJCpFGeKY;Y`LXgVx~Jv=h8~ zhf=SN!q}x{&?UzbY6khUL~!5Ae2Z|O-w$_t1?Zs^#^O)I2Z9lc`{8bP4cIsOs1KIV zzDPIEPZzZ3(mT+eVSwJ@03Bux2Z8kTBBURMf;vdQ-}LRkd6opA!Ek<;(Is*Ia&;Gg zbGmetRI>CVOCPik{%0UQnM^STVz)mUkDNhH+DoNfo{sekP^}|T{fD(RH7%_IIK|uh zd7>&9i8GpRz+%x9aYI+dT3`PQvu33pWR6sh8rj8nZSaKK)ZX12`N6WzQpmtc$SCbc zcuq^WrM9xas@M;~52KcBqw|cdeg5W>Yyr_H6ALxsJSlZ7NRoGD29kixV6;a$w@X2K zBdtgUgD}B0YMdhob4oxZ#v)079$d&1(cXyi2sob&&e6*BG*N@a@BBuME4Y|ZNYUQG z^pKYOLx@)w%I<$JK#8i%TQ||--h(+$iTMoznq4kJ?lSILjuMmO3YGT{ozGm&XF5a@ zbIdl*5KLHF*@>o_4MtkidVt~1Rp5uTvP{=&I^OhCJbBE_H$O>_lxK$rq2*!xgBF4n za1@cTM?eq&SfAj#dhH8E`4q_XzerG=pryerFmQeKS1_duc$7N29rB+!g#S#kF?1za ziT4`;y=?W1{xfY2*sH>{@iSH15oTg>0;z2OI$h--m2-TfBs z+;$H4R$2p`Q&{)#O$i)Me&P3x;Z1|(sUlNC`?E86MGG12x`-pOq9v5}(ZBFZv|2oW z7Ky68_si%#jj!=x<7BboOW&6~uDnuB{|yG!CU$r${);b|dqf8Z@J#ekc(%L$`D?&X zJzuzjFC?1ddFnEB5InM;;E`HlMhq_*)bM;7q5}$Xb5hNd?4ZfQOti@3_{0=mL*m6k zSwXXsEqo;OxfWY^vhDDQ+QQdm`2K_LsaS2woSWjC<2$avgwEOiqNJpv4Mmq=$vx2y zC09TdZ~2im+{$U_&wLKFh&hf}g8Rqe%0_t^P*6kCqV>~^S$a&gH3%Eb@a@+{6_R+o z9y4_Y6MKbqGHERzOiCuvLaKZO(VM60?FYF^GB|W^=P{CXB2aUb=Z2ghP+#*vuL;gs zrj;gGCn^5L^KkDN0@g=q5IZE?3xXAlzKTNt!Aot=9aouP&t^O;r{Q)#Cf zdc4~NMMMo;KmVE3l40<4y~fUCX4jJ40n!%90guyRQ4W~Se9Fo-6XYly5_s1&8oYZO z%th-0u8V=mdyTI`4(0Bc2*|2LE@x#VS@z4B!LzrRV)x@Lg_c9n4;bDT)2E*}Qhx?6 zb&F1s4in_V|2wBMD|$QRO=2@N;u<^YQjiAYHwqO;+9;M5ymPBt4)j*;qI$0(a|!Bz zWZ_Emy{A)Jn!(*2i9z+JnLqW=bMX~!@+|RA*M+j%k7cgb8Z`}VPQU<2XeqDTu3M3i z&hP{wNkYO%zi{I^V7DWvjviXVMFHs{KBMP^r+ECWs}RE;ZO=vHlYoRrjv5nutv`@0 zc=D(#@6MMVWmEwj=VDk@Rbj858jWCm%AmafpU8|t#v{!29|wu;as>NF0p z+nep$uHD-0y|%m7idLI&7X-P80u~8)dxwAqtPn)W|NDE+`_4>;Ty*nMX6Aj*?K$VU zpXWTsQvB`mvotFiH#^9Y3dW*OB$QfqS4{*{0e_m_*ZDvDRu7tj<7;GpO+Hq-k+Pd3 zMG3fq+w(QKpuX5Y)_me8S5jy0XJTl%8BT6L%J9l;zr0($d!6P)dbde}TqXQ4O?{JNE+3dBHFV>M-u)==Y=Tk9K&Wm0Q=q82jpQETRUl7DVPkjB7=OPUc??&M zF1(O0J@D&&xie&)mh5*KI%I!4az68d`Pr0}Lz0aypWlvKugz9u#Hp{7#nOA!lI?88 zmmE*sPi2SwoDWjjPT;oMMxmnqGBv51*jB=+TM{vjEY{3oPYgD$17eq!Azh<)-_Hht z|9Mgk20_%56{kh;5lOepf{+-(kSb}57u9$rDusDre9ZJ2#z9+B5!|d?iFHkTDzej4 z8lXFdry?(UnM3Sw4dq!<%XP=xbYwdjcTVSqom6HHmq5M9-Fj!GGKaXW0R1vOI32+_ zl2hNj_acN*{*S(H;vsk@CqF4qaa-ck2x7AeBLY1~`M;_Y{Z60ZHl{SQiR0Q+p-(+M zH&Y{DUov}T2T|WZ1uY%$6LXjX#2(I}**JXW%74io5MkMb9oWW)-AkvvsyoIL_;#wi z#8E1x%I|=zubE5*)#HNpew5VP{rG&n+H1JI<)B(sXB6NU4g0~?SF2oyoPUXIN=Kf@ zk2Q;T9W_=c5P@ zHc6KCYdcGJ?3CsX-Sa3rc1lYJa?BhC(g<+*yLi~&wMbDSNOqFv^3Zpr*HdT`kJ_TI^}*U7JSEzG8gAe1ucZ5 zG7>ot#}(VuVn6;Gyl!N?fy(xSB%~9FF1(JW9sUKl!mLj9=co#I706kpytPf~somhq zZ2toc`YPpAH?-G%3d=%P6@6$a*R|8q810QriLe!BJ+h(JGSpjD zp_G3>TQh?O+Nr>IE@|{mz;Uxb9{pZRO=Oq<722c-?OjuCjZLqV$5+13h{&!YMBCVg ziA_^Z?%?HkQ+;aYCQmpC;~;Ekgf(QW*%pE%{=57^_Ap&d4~TTQP|L3VWLbisY_n`1 z<6}Q%GMy`>!f<~thiOz!+hgH&8M|ki5HLsX4nVbiGA@PG-kEmGB*sOgUSZqJ{~YX^ z*$`*9p!;&Id-mtjOuB5F<^8v5Eh@(qz@pXumpO2yGcK8na!0VHh-X3m|D{y^zijgV zpCdWheW9FAPo*8PH??yn?Fe7MliW*4$6)`cLmWlL4CapiL_Zkl^n>W#lKCOtn-;Uj z{}-^levTKhdktJa#GA{}j`-1r9rD=U^sgq`qYXa=M1`%MW%~x~kGOp|FMqW`v@vD& z_HxDL!IoetF1;};%{()0;&3E#`BLl%$}?%yXDjHqukec5zJp;XCEbt zNKJN9uXgq>YS})?N(?%6ZgbTx5isut!^JXy?H8Jf=TaQLgRQWvrfU7XCmsA zz*B?i*T`GY5J$4v4uR(JulO_j&^)flj?1eXkghqEbc_?#V0^5d?A#xX9g3_5xr4A; z&>{u)pPR1Tgz;wLltX}uA1<@N5|IE3Cf6Cv=MnsL#bBZSY)etamf3#4f!vwKDKbQ5 zx56h7E%9w$K?n~O$8DPv0BOAhhhEfa-G9}|@ZYn|)wr)8e<$r|c z$8x_E!Oficmwdtb)?jzaYd7-Lr=1rMrNhiC)N$7L06_#B(TC7khy@Ij;OrU@!bGPYM>&8u8O%BhsInxR_pkkeHqjeK&gZxD&}jthbcL#xI6^R&erA>` ztr8g0hFLqs!Wf_=!!!y!^~);4C<9R9V^{f~Wq4hO?_bU%ojTMo?3FX7G-96Ei1ir^ zca#6nRA#SeltE~G$yjYdN8UhDu6-;Tp`aPXz|H0)SZ9AXgZ$kZ9ncP@SIYSPJP3#A zM#s}|jWwkr@caNj$N-f?9hQY3nKg8zh_T>*j)uJQIz_cP2$Ho=yD1E?!x;HCxHzHq z=&%Ro-L9!ra@@=&|0DmQVYrG3ys;?-KMNOR$05qd#?@e?W%dbnO{7C^ERh}FT2W!K zw>Ebw%sk+G#4V(2Urx5{?WY*&pP8pGk)LMSa;OIzZB-xm5q$L)_-fIf7fJl4SZYin zv{qYcp_QGh$*nl|LUs^NL~mJD(V{iPchJ~8cLZw5%4F4$<=P^td+C<*4Uczome1dO zJy*x(izmhhj|>Y8~Q zpXWc$KV{xyBK$DsNdIW@eP8JxvYlhaQgBQoz66%Ya9Xd#%#l@NOW?SUGE5X0N@g7_ zNYze0M$}rXBzkt-`6>9A7>?|U-(pM>R(4@LP;*{o*az_O#+QgE5Kk}1 z*nGZ19C+6caw~y$;aBj4?Gay_4e-O;wH@d@4q=$4)TgUyJPgiETr$)47YrfMBF2=1 zg)69r0UvF6g2{z0CU>rkHlE0LMWPKOMt$CgQnl+PSIJkimh(VLR#Q{;wB(QIXttLb zz$E@$qlpuosQmLx6)9crBi>Z=^eAuCQKhL+a3lXK$fENLu9m4PXg(g}s1H)!U$s)K z$hrSCUUqh@3;_il41Kk0%&m|ABMO5-suXbA7|9khudELgQh4m%CTHcInxSC`cqeE7&ih657{guRV~~p=U4MwnP&tlQs4or zj#J;JmLFXOfd9wOQY0NX3QMPGMqg84883pV8q4JY2mDdXHO%}}spu&@3Z@7bpHad7kl}QZLVnX{7#KV3 z?0?O00!Xf`Ez4+9PwzLkqS*QrOm`lLfn*0&^GOc4T@_xrbDo zx{^VY0~s`nZaffQJXT^z99I5Iakp-^3Ufc4i)XNR{r@}6jKfn66#t((#i$8bl?^P8PAOS9ihLQ8ttCaY|{@^bHG}f4xouOnQz`Z?I4gK_xe5Jo8TdYwyHc-syKmcGxS_qeLrXjCG&`l1PQr zM%tJs=KaM{UN&`FWlaRto;`HC>IiHie9iVKKyR9stKNU|I=MK9jErZNF?cNj2n65owA(p}Eq#4QjrTwnXPJ3(cq#$-#G$i@?02M7>o(x{5^J7GCIFnxH>kUl{ z0I|q49pXo1A7mDH@?7oqOl*wW=f`189p&uMTxw1xW$W52WzNrvE_zDR0zs7fo!fSw zDxN|h1iV)}FSH`gvew={Y*VP7HI)Da(8&l{W)Aqjo`LC3bQ{-e@Z4CBB{YJkv8~`Y z@mdYzf*WVs9&?cvXUgd)fgw)oMYh*ey`$2zqYE1B2fvHJ&|Dp?TXVTg3wpMYkeAn2mf4$la z;Ph%8<^XKq5@X*BWPE^j;xSUWF#!SGGyHuxAq46#d1-!CDXwr8jVqn`WT~&L;LCCw zrP!%rRl*E0cK7M*jc(9MKCi^mq0;o`(|)jpIU~C0&(!z->o-E9z@`u;IV>?`GP?1H ze_j&ONll&I5n^(pI9vy}AJ(kh0>Z}YU+tGT z|6xNb|3n6qM`gylMiks?$Ir$3TlT+#i}J4vB@Ix!HpMfYCfe3j|mA? zKX6`Z$5dRw|2ta#Vx;Ax6f8E?*t=I-sjGftc$wyk8Uyj zTC3OF^8M2_=vNM(6R_AGSI?GiCAP_MRx*(ZR^!9eRy8v`7!pU6jU6DhOBZqMN`K39 zJ+0m2ya6{k!g4Xe2z{>Ny%f(~K*{_(L7E|1+u_X_zE93M+d?-FJoI z6%^sE@fSS*xknK~Hh=zaen|&I=^)TY3ad>w9oCF3V0{z%NISAFFS_hYiTo1X{`DmO zNoEu*Q6|EKN%%bB;z5b74!&a0aYJdOIr`A^1gB=p27`-i#T9ZeJ}EntxRLo3)*mXM zF8X78W)ojws`iMhI@SCJ9!=I)KBw_f<{f&8uXF8@^D$XLj9l_LX0~#4P3P9|pJDqW zCNMU4sG8Qo1}b$*SHYRDOMS5~J8k6f*jDepbawReY{gj^lF97tf3K8byN7T)3q_@x zm(GqGEzFnXiGN9~a+N4T1gho*yy=(LJh~X;lsaiSYLV2VDrqE@y#d|L`OV(_B5l|X zBrYbl+p)<-DQd6&$koQsT0m0*0yw=|3Fy?XUU1}9HF={%J;DB{TxVzA6qEi4$cL8wbO;jEleAB@0451H`;8i|{{(-24XQ?c@%bD z(JAOe>gGq(vdII~V*Dr!cow(11{eYB?FOPxQy_#0nIJq6L|~Rdr2ed{omak3h&~AY zD#>OZ1>O@xTTvo=hv@rU*_wxlcng9JyROk33P_~SXXs9hAJ%fs4lvyAKUJR6+wC%O ze?TvQjVWHDJ4|Zy3XqkTqA<$8n$o=kvhK|QkUR|Fb7AFv&ua}|tD#k3ZTKp+$QA@> zq#1Zu2!&tcVYFc+=$xlFR0$y-v9nIzf-dq=PF1T=KNef#4UmFx%rh@7Z}mbAh$Tr{ zn5Z7FIWV8PoF!rkWBlF!&uIV>5hWS`i0}XGnfwyD#(+?O6|!MVI#sSQoMzfGe$!B?`!n zLg>Sh;c16L~VKR1Emv z|4Dw~dL+i1D3f~)#lY#2Zx#!U?!@4xBB3#(AT$_iS26hOOM71AZpGkJw%EP$*nB<1 zBa=xB0S(ZIf?MmG>`47H*j1^d-~iNTM*KQY*ONzZ_F zp~qV$31@pFA9i>^d+ypeR0o|p2vz}9pqP6_sIBh$8f(1`|bgByT3}ATvuOg8VHg(14JufB zBYB9FR>m;B+!B9GMoZO(>gbPGMSt8}9et!T`bcyAs)20aS2EIR?E6Rnw|zW-OO=Zp z3o<<2)-x}r(FxW%Visq|(#&cb9~Qg9ji1%4Y&Ee6+epuGU-HnK9PUF@t8sQ3=CXY_ z4Y%7v%Lq2jwDT$L8H==WAEsz(4tY1&HDzzT8>a|8n@1!!?hTezs<|egO(g;=Y_eB# zs3!Mm*bwIl=*#1%!9u4+pu`3m2DdLzb~1OuYCr%PbR;W+4sO>psU!WS;FR2|*R4I} ziL2dS04X;L&kg-hcCOWN3XGd4n>gl)HiCJ|ZN~Ey&&H2NIL?MGuIbP?Gy-+Q=d|uY zwniv2BX=nySzOYe)*${^*q>XMN}lD|&85F9)L)9)bK8E{i$AM=@2q%sHc_X~d-+&? z99yZ(I=VBz4UV9+QbOS@BK?rAO3OU=n4DK$%j^BJUyRhR?3dXpeu}4>8$fYVn5!ws z`?EB%mDQ~#@#S_t*`*0mLh2CU=x6aIO<;5U(n|B+?DzMl({2xT`NJuGe;Vu2?iKA8g7MJ zyY&3u7l>ccM)>qVoQ;FpO$2OhVYoQYgQzXf|0YH4up-41ZeYcu(&#jzp!`(-H|LiQ zD9_4+K~Y+>B^TRzuVi2!ptsCc%X-expgo(d1JZ=2t-$wVp=6%_s-R{(lC@r8Pyv!# z7?}ydvosjgsc?3>`czaT7!&jBe+IT3&W9Xs{(O3oUv_f%^Z>_^o|SKDvOlwE1d|IR z2p7x9jOP9OKiSO)ikC<|e+YkD*oXBzfY!qY1>o7Kh4cXU?bFJ2A6 z&Q&aOlB-xdgYpw=U~vxnHGXB7IOkNkgCC`|I5%H^$%n|AuMhK~KfeBf4*}M4q?}*B z)l>c$Xq^~B=Q6(CsBgTyPjC1OC^EB?XZQ0vc>R~)Yiw1fL#gsD+Hxik&Uy@|sc;Nu zB}Ud#2}X@sO!vmT%T1%yyf}}se9jzM*dsJ_Bu?R(oYa`0DH9@}k_5;{2dUNybMrQb zrw-M==0fe)b<@5VWuq#{I`3k+GH?U_7m42az21yB5me?gn7% ze*947LzW>pHCu67xC7)i%PPf`=WAHzdj>h&^TF96TrC*veL?YL;kp;hV=5e67D=8UtVJ!k?Y0?@G7M ze%*;UjK1}n({WIk@3sEXb#z)WbHG5b=KSdt0$!m=Sj^%}TD3UvsWH41R`GQdxINn+ z{Rs#qH8P*2m=She*^n|r7IfXG9V?s_E);WbYo!Gs+$GpXP_=^bc`lW-D1gnB+Nedh zMFW5E)gtKTQ@K0n?xc{smO^xm-cHlG{jjc%OPBM&`7W>ec+U`aQA%5?`+_XcN#&aP zE`@uCXwxf25Z%)QM8BhuAPF5EZn4B^iusi>t8aa*XE;n`gftkg)K9PI3!Z$n!b;sp zrQYFs`{g3Ig!J95)D{YbaH&iIE@?)<*$2QYb`Qk!%5Nk0Hl5V?D!>r>o+XItgcP@9^ZS70`AEKGfdf zy6(?KaP>rv7g8vMs}FKKqc6Bh$?>ZAdxEPgIi5nL-r=f$Bo9{)lrtQdUcM_%2kd4s{fk znP&DwKTg9)slwV-P({h*2ly?XIrWn?R~yaZd=2^^W1hm z6PRD#qO~1PA?=3srq0=h*mup)F|O!;b7apDc99lv~@erQW<1%-P@)SDZM zAd+n84x&jE3i+(c6v*!w`SHIW?ir4}AP8wmCex7m`c6F^&j;`aP=fV zZlO>JS0D1@g>(9V3p(kd!5q)FMDOclaH(1Wt}Sc|^bXguZ{^|YL4N#{61m6m^%^~X zr?mVrjP>i3crT1~+lW49AY@*lLfZlIVT0un^*u1wzVUV0f&l(Jo_1xdKjVGhjP(P+ zlIILPFw-xnr93lje2n<<;HPm-*?EXPgKj>HD0^HuWPz3N#_^JvQlLS0;xXa#^3jTV zq;(JXzcJOtQLN@k7YB>mhrRCiCF^|5x>Zr)y{y}a;qP$=^*`@YxhnzMtwjLY%=_O*aRX)>qiOxZOP_w_ZOF-p9b`P_Kc`<%~q=L&s4 zbnpaKdY{j4?(Ka(uj75+^VuI*797#8O0?lWi2>+qO8e7l?ls~K{3C7o`RrNFKS!bW zCFkdy`9A0NK@jgfa9OdY0+;<-pV)e4F?92(oaZ)0a=v5F|3S`wXIRe=c9HYPaEiAzUg`&|i*m+q`*tA8 z!_|YFzl{>P&HDp6|IM`}<&TjUU!cT$;cxp->thB=<@{jhYkfcbt#5q&&6)t7{Cakk z7frnHo4Hqyu&k%OuZ~uV9tc&017{~(tCb#sv zcyD^Amv0hw(#P=);a_JGEyx@{FpOza5Xiw|98*)e3&FE%-%yhwEoSEQ@WA z^u*uhQ7D9~5B_#?UvQQ3w<{1W?*T4VE5P-EKIPF`VpoFo>Vd!giW0duQ8;ABI8RlB z+fLN>@60Z7DCrTJ$K2;p;oSL`49Ojq#vdapTJa&9Hg?1xKgAe-i^5V8RcoU6e(fbf z2yFYWh8uafN}Ka=agG+(=;a{b;dFfbuZX!aUOuBL*(Z6*IsX+rE8cqywj52CI6q6J z`g#n97x58ngq0fm>EQp z%!)Stnqowf+{i9&9Rn!ZJ(b@{DZ4;=gY`b$3OSYQ9ZhnRS-V|O@T@&n1NA^s~L zZ!-1sIChRBJ`Vl41nQt64OKwWro2lIYWvrq&Q%gY5u8V=8#z<)Dz{S8q$ReHs0(X@`7h-F&K9+of@|W%TvJ^KqC<3H{+?mHIc-|YVKSh622T0&vL)B1GJ_bp-V(o zS1rBc(w?CzT1%~8xR$~v)-v}AS|jf&zep)Ks8OGsi;6#~YAo~0I2Vn@*3?vOy#4cW z#Vg^v6BcdZ&gST%z5Ix*Q9M)jWS}Oq#(coIkEi7tlg9+zr9bYv9nk~YaBBTm&h5|+S6%Lv< zwNANTwC2NdX7NmbwEZ*~Y7x#HGgJf70rxD{Mf`>h18-;m^cxofCR zh(k$y!#%2OAw*9TMP#7^L=TyNxaDX$VI|U$)q{%_%1+q9cQ)H4AYud_4ARE?qrw70 z4e*almX9P1Dga@ct$P*FQLiZ$4zRTT2mua+D6JSC zUHCXCTz`b1$wGiqbm3)yw&2Jl79hIte;CJtBfr)6MR$Q>{?~^}>2}2}d}#&`kVaEn zI7~_Sk|xQNly65VMTi)amj@oGkM+6Z7WbdPsUP-XkumR}W+>_heiiiW=cIYitv&7~ z6z9aAJ9Y|+I=pv8Nrz2AhcgNt&MoS2MxjGvRHAo-$VDFHIQ^JCb@|S(Mq~nu< zjum0xqM-av$?yQusfCV>XVFI3p8wH4Iu1u@9slFGB_02eUNo2N8HXL;Rn+m^LdO7V zdoW>p{_nx`9@e%n#kpZ69gYe*%p>0c|CFK*NrkC!I8j>Ip+0SjFYUQQ)4EJPC{#pK zJmZ{_jvqob$ODO);s1mO0S2o(<2KX`TM2e&RvRT;4b;(wpYh$A*lM{acKO%QMD8q> z!pT4X64oN$hl2e6L5tHTmCU5w9%k}bzh+Wq7Hkbl5h0fVP0|8TH6x-cz8+2e`B5mX%Uq?rKx)lR1)c< z;}EN@<8h_rSsQd*L?x4pI_`~1?m_DHImOGcV8h9@DL%k(1!)nL>=Xn6q`gtehkEYt zSY)~wS8JD!Z=;v+fdwPZ3c7_Zd!ds5LPpdd84+!WLkw0wB#}|nm(FR)3ufU@S6CwP zW8@d3z3~BYkE)3@D^>mQz=uw#uzy+H`OYPlyZFu*7ouvvQm+(w?H1*d^QZAkQ{;F^ zPcrFXWsfUz>;%O|pcCYSc#m*blaX4$quX?M(|e$^`kuQi(AiO(QiZM-2VKnwx|(0q zRc{nFwCAplrLarz#1^_dGw5<^(B%h;y6jB?{T!{P2Nbt1yU^BFFs{($uXV?m#81%W zkN6!Y$)39`Oz2mUD}}Bu54s}OLipl;qNuCh=xG%aw>RiQd10Jm50+%1%cr^R z$@M0A^CZ6nTS!KZqDtk>RJvowKM*kArcUk&v{koXG?6nKdFqsWx!9d*>jUE}-VX>D zm9qQi>>yefEo>Q&!eyFuti%qd#Bag|=wa>(%QT=!wKV4U<)FhEc~Je&7IoMg_MhH! zhsR?7r4U@$g>}5wj)`@VFWYz&LfRV*{1o+}2S|^lfoDsVqML(`i{#6UqKy>x9e^b*dw$(Ol7x4p}kE9i8= zk>9~dq7C05MT0dF63GQLk-HDaum2ygg?#Ixk8g`l^eGWuX3Xyyqz^&jVIPJy=hBA> zh4ASC|Ky-sd)y0s+|YB!g~fYyNJ)o(f}GWI5q>}jgZ#MHeBNcqB|Fl5DkYj8v~UHky!J9{Gh5qmsjpw6nRINgZe~3&NU8S+z2;@gxp|O(Z@%PFp+wto z`T4x22`!0iH3n?!P{Zd}l+Pb#-qmg;9Cb&h)8cNnT z_gm~Wai_McpQ>t}(_UK7UwaByi4M*CGfBy0KnPO*YiA*fhwI&9|Ktxv6i1yqk)N(V zlh4tHn|KhfYL90Bl`qNKW@i@`^~-Sgcj>nHL|YesRQ+Brk-;C#tsLt%9>F1%&a8{Q zNCHOrcepLSwY-XZmqzxpK$B?0FPSc#;Aon_)v@DRxIGbXkM19j@xm@bY(=LKPdxYm zbgtN{WahGL#f9}pN6_489d;SFg6XulmGRL<5vxT4F|ab{m(L|f{gDw@WpBR#htL3f z2lwRw-C_T=TX}bMM0C*!u1e6$1|G}xKb&NehAxLw+1vZ${CeB(e}dE^o(exmF`3M) z^!Fc6GEWY?aBFBXvmE@0Hhz%y60o_^mKI9|{Yw}+S7IdVkM@h+y^!}FXGkK$yWT)w zemf`BA{Xi5rz^pkJ1cK`iz)ZI*buf}+(Tx0XD^wuoco0j0zFA*_vF@_7dcT@c6By& zfz&xS3kJPEm6x(~7QW4wpg=ek6ZDR$Sol`q9lEB?`fwiQ+V}^2vBlwDjIRCvBlKW~q=Dd-+ot}>Ix86tN-jiX1>tyCRcMt8;mOOv0C4$=E z9eR~hn%>6OvlV~RV8|Ywc?--2X{UPm8)q>WQ<2qrSl#8iS#5QYQd=*$DtDz0bYUKm zW;4#3;w1&!uFj60pzo8pM)rAkFMO)%&AKzH+VA*Kcz-GD1l8HSUR5igU(WwlC+!;9 z{a169DXfr_bdZ*k>(8fs|HGB62EUu!@07bnmf2y!h`ue#du;bxH--0@)gv6jyvN?y zeW^%?4ri%JNk5mZn2xslpM+e3M920vL;5}jCEI#3DdVA8sLQ{9Aa|J_txJ2g&%`rt z>K2%I>mc(d}HTwI=fqM?{)ioqY0lTW7c@=o_#kT$%4O92CRtrjuR5jxox6zYZ;0X%U6D zU6@I5KgN5xhw@1gg7Pf6Wx|!d&3~(ZK)Vmpuvhzh{(f!lp$zWV_A-O=_jgT)+N!qP zxw{)Q1m}WlDDR;u|9&;h>bPqt^$1L~M8d%}l%64E5t`+`OXJ8%=tWQ6{gU&kc+1J; z2fj6+^Gru>t9DRAq_lb3?*ABcQ#_=~hZlT&S?$?9VVyv3_k zdAMM&=AA9o@-QS{qkr+93#3In`nAOfiWLYv> zcX$*Tbx}@W1$MYvi#y8_Xu+qIU~sB`JsOkZK{}{+rS3+I*T0J%=+cnwR+~ywN4*)* zMF$`rzlKl}O~s6`(A)ked6dphxGY(_g3gpz+vW6|E&2D#ahCS=a+28c*xt9Qz1iBa znd`6QwIR1Kdu}>AWP%3kMGzyLB}hk5Fm^;24i!;~V?z`i&2%^J`QKLEkY&^^tI7D} zmnBa>!z_!F6ERF-d(IG-%2ha#jF6m9M?3>=mCjsTn#vU>da-UUo@F^*Q{^sekxmY1 zk^tMLk*g7)L-xKjVRpl+9YDQ()zIjo!<6%f5qzkwNW7Y#le!?BWwxX_lgM6AFw_1% zv{ozb9!c5QZt5+urQ$sR?mwjmwd+(&Yh*VNkz2 ztf+XI$JdNy0d(n*h&`c`un@mmeG|`7x0D|0a}GQF^DsJXghk8mpUT5rr|{T6fv;@~ z7DvyPrpg2yF-+-x0=`Cpk_mV^EMAy^B|Kt!(e$Nb@Vqb;KjBrbUHrvn!{L=7hp=k) zK$mxPF3Zgd=VBD>LSOZJ$72&bV59hpZS*E&xr`X^b=MBA4N;u>K)qJco1|(3;7QkN>;sHcV^XF z^G-uB2j^FiKTAD#e}Lrd*khjO*SQVaB0U{?~=sM$~p1I7jD}JT+R+beAJA6 z*&k6Zol=I0j- zyEr(=l#Dyx!hW#<*z;eeFg zOLbcDs+O$hRIm2_ko>lGt_1$-&|AE;nBk}s974g3!wG{3#I(pX~hz8vl<)tz&k$7I$ z|5Ud{8GpQfRll0ZD>YR|Z<)||u&!NFPJ=MU4X$rbsarIXTG|HN>(;A=*E!Htx^-

9J0>Ty>Tf^dK=^?Ywd;A?FvCNoWw%Qj_33V3_`0~w$~#`l&Ekujr>NO$UB+jq zz9+b_XfKPBn@aIuUBk|U;ZAp*M;lJ1NPYmP>7K|T%Z>K+;d*})aYFB}OlF6zO18X$ z0NidyQ!C?1Mc(uWGnQmzMg6{hx3zk;3}!#{Zn|qaGkPzC0A(OLK|ul8xmu(x7M~pi zxvd7mXOK;anDo0<{<8j&GPF09#FfH=L&NR<1p-h`w1R)`fq@K z?#`CQ@cC$iqW$3Y(S_&orF(v#!`V?R!%Og$9M$(5pJ&lpZ7IN0RMUqo9jNfNnWw^H z$NBeIjwv)Nm(m! z6PXUXcN@tYbiN&_P`?7Md&vI~qeyUf+=OJLVr12CZ5X%ap$sk-;ttGvZ6s1fs}U9A zx05CPe~FQZnv$)!+(eX@c{6kLiE>6D86Y}FD2xaA>R=M>LS%Z2GuF%whFg98;*4+M z`5;o!@Z$B$5pIY4TS4S<`9dNC6IBno;jPbbZM|z=@>Q}b(-F*7^dYw{(TBckg%7%) z5!WenjNM^~BkVkEbGKT^y2~tJ;R->7=0Vd_($9 zD7*4Hj&7g32Aaq}5CJ^%hO0bD>hi|f1U0V=ecHJdBg0&8D_p8SCpJ7$0H?$ z6eRVZa27a~7&#&O&`$qijrvuX#K6o}ThM5O{9Sp08*Ti9em2qrv*9Qr2&T}N5t^1gg;ZNune;l$ai{2%!mvPj9dXdh&lg_-Mos?#tOB2GG zztde!Aj1p+|+iNB(sGx)26wkaUbS|mc`^2dYh4z9+^MC5h<`xFmK8VNFrTYoMk z&l5do_F*v<`0_hm=QGJm5=TRQrPJ}{Uot8)fZ73BIJXNF%Rdm#&EOi+AbEzp`bHh5`<<*AM;osfp4ZosH)e7{62l(Rj72#%ne67qxpsifS z5KUWIT<8!Vz<&Qv2Z9dA6?f?Ll$B0T;lt@ECx-pup)Iw4J@P&3z8NP*pC>5!jCAI2 z$(EPOCuK*UW_w{MjoDcd5JTxX#Kk9O>&|3-Q8sduvg6KbY@V1Mc2=}uDOly7$+(hB zt_l8djhKt+u!oCrI91F1(T~_Fm=MM^I_yt8!YqPiXr|%KHF)yVnGMc#k~4F>f8pN& zH^watSi3BrZH#>Doh~iy_fMn{?NTVPhZpbHgXU!RQSk>c+^K z*UVG)I;2-7IaiRI|}ilTD3`BrXZAXA~$H(`QGs+D}3S zk~6q=pI;shrsDO|!Gt3LV%;1EcZH{4DU^Z;8PR!O=43B6P#pGa;qH!Iozf8i`XQB# z4N!sqrvkTVRPy#xz|iF`E=KXVO*?X)%3P^3*LAl=#6I8JzE! zpj$j!$y}8X`|SBlqsa};pPLB(-8Vq!K``ZzgO>15JaT^tgy{WFg~*OONovFf+KB5) z8<4e`@0sU_Q;%ooMe?_-AwHrFKS!+k_tA;FS$-+#Bzl zg-lm=^g0@6w7LZ;vkmXSd0vc8ag+mr|3zn;yFS&xyEyqIW;G;}UwBt?>BwFrsz!|d zxI5aQ5PiQEWO5}O{-z_Z_+O&?{1EdrQlKCI=>HTdnO^uYYUsGV`U8xB{d`DZ#A?*O zi8h0+pKCn8z>olo8viMc;6%HJXPp*s{`|5HodKV0ea57rZX) zbfOLt%U0atHmD}!DPDC9wXr{<%X8bU(OhupV{M1@Z8UpKb>-SgW+&jud0W57`*X~a zyw|EQUuI82psW1RU~&qb)7pxx!pzwz7BRz%T`bi8ictHrpf*c{t`v;+5D392Q#g)G zXx9w^K{8&NRi-1^^i}6WiXp5R3;b!HW*qQEj8iGaeh>70Q7UpM-8A}niU=`2La9mF zit{mVQgjp&1V^7yQhvu;?sirah|L&Eo&2MnPT!6bUWok&Be>}i?P3Nbo-ttx<$XUni zwVk*A3sS?2<-Ax_Bg?Z9Va?4aB@Na_FJo^#5Y^@ij}Fzm@WW$k&`iA z=612@oxYcfz2!wdp~Cr%=(Zmr2mQ_LHS?M4u*g2X2L9pez@*$H9=iH+2agv+6!3x< z1X<&+Y;(YlaR_hH!+<^0@bH8@q@RJ!b?x2bR;k#Wu0ZA{8R&;O9QpxBJ;xAew*+EqF6{fC6JYcRnb}*Z7h+(`P#M zVgG4F6<9l=aZ|KW2a7%{^n1%lyBYHLYFy0NOL? z#0m-a?s({9zYFFpR2*_3Q#gsVob$KxATZ(>!0z}G#s#C>@4s=_O1j&8#SDH=N$=6B zg)fcQfBCV68>pJ4;qG9hzw%o_x8d~MWZkkz@^Tdo^u*xLKQSCApqVFZ%mLxVvS6&y z$LdyeU_lyJ`iKU?+BW<)1(Rlg%wowga_RpjkLi568Iqng5 z-Xal|jjL=D?n1m1SB`g3*njgiG z4(JBhoDNH$N=GU^!|SZf9cR7H7r-`TRhk^Me@0m2e<+lwdNaE4SA1DKv8m#a$DMT( zGeZs$_o5LrE_NmEd?|Mq-vWM3Q|wJ5#Ef^W6Uu0`<&;R*KGSw~pvMtcvtI38l^L== z46NBnR70X_E$waLTj0-hx6u#Rt_@Q$gLp3XBSl|=C4;uX8D~>v{#ji`6p%JtH_I<` zTPh`Kqe)hadRG<{=Utb6|h6G4_?W@8N7A2JY!VxfLJZAaCSj7JU{e8Df_4W&jv?HB7NB5Jz5MOdg)O94**nVGuBq>-j@i1Z{%oUuU1&*yq zXI{sFUXjAr2e6SWF=e>&u+7c@Woz>W>LH3*?3{ zxKR$){r>M?227@nXlCsgJS$x_Rw?w)TeAtf-BHXyvzexM=>XL!LJY^4u<0OJF<7=w z@K#hlhAFW5?Z7(|)dV+MN4!bKmUFE4gO$;HKB<95&gmjMbcwZbVaUhVz_0{ft%!HF z;O=F-{Oez0E!C7I%Lm|tyZLhG5FbXjE6{8|6CrjBe|X;6@gNgfwd~GTK|jW}ftw3c z)AmXH-fz{7tS4;g?CeArChOI=^wa&=>@S54Rjr=$M%aL%H-Jm{T)ykwPBxQ8jdhG* z8UZ9+vs_-WlY6)Y*QX@sWPEocPy+szJhUUnZQz|6$Ng2?7T>`(R||5cxPQjqp1U31 zq38AgK$}=J2XoI*ZE?IC{_2@gSju1fz4RXV>!W~zDKeb3fv89ELFg^G>$2THCyF0$ z2!=por)LMnwc}dHWtQTCvc}DC6?-u|H^PPsTR^;?A?0;acII2O)-ZBDbu7`k;um4U zQW#=OrPIPVqK%*B;DD%sL?G1Ub_io6@g*DqkhdATX9H|I74f~SmOOA)`PzMBXW*+K zzv^ZOZJ|6Xh|PMh9efvJj!#8460zY_g%~V?Sj1FQnrpg8n-G9o?@6}gDpIlIyT|~S z_b7W!WiS@8diKo;kWkps1N@42u7zJFh<^Mnzx*$2NeMxPA2mC%olUGn^K;ul$8thg z8+JEjqYz*JMUjzvWGrc^t_{BeWD`&HQst)mSe|#h5OtD0$}2$hppW_=6k_@2>mj5+ z6_!Z=Kn=1o#S$P8q~nwbf-nJ&JU0(e(Fp=;-bCFd|KHShxw}!=SbE~Ej$r0S{P931?HU#Wu|ww)0Z3=#Zqq3p24Oivc!{~qw07naKah+O{Duze z|2qnq%~JC5Gj4t9bNyG{`yKIQ>;`6HnkMCB&Rtq1o4=Y{#fBAp`WQv@*XlJzyv7Z6 zgY!?Cz2iVGRALjsT4k%h-|sJZ!%*Cx8wq@^z~pECRISS>64#0^>F??yugnPWr@-Um zOJ;^o(RdE~8)&q+j^(kC`2-@!?>?M5-lG?!#{OsG0}sCzUvlPu+jtza4dst3I_nm# z*sid7IQ%aE>uSDWoLHt3M(&m&oGMp6Ms>|ib+~kE{LQvZ4hgMFi$DA|2jh%X?at(5 z@FV@*X>vKgyqbFACby`(kpM0(T50>+2*m)H8(Jj9(qC8<95jPd~&j7cX_hB1}=eHW1JHe z=R|c6ce3gB6=lc@cb>vx37mIa_YK2vce=u(lU4ibJ|g)rysLajNwiwWAyI@ z03iX3;TjRZHEyMWbuHYj2&}!>u#$rTSj3~g-mTnYe}Vv=0$6VdtUA#r(P98Z$gSIz z7vfd}=V1TvHo+v{L1ZPthZSCAorm-;brH#PU|zUwUgX^Xu%oJ)OUEBM#xp%iuiN4!kn^$CTRX6Vs!HOM(i26J1g!l^wPMph0k0r)fJP#`H| zOe`zlbEgHqN@T)vB#OB`=JaD^mX79gQ;oGRC4=!xW&JNI7wT1 z1*!%mnw{&cL+d1vrdQH@I6XSgGD8z|%-C`VD5mv;4@Db(h*@2=Et>r|9UqXI$n#=8 z1cAR1+&2t;6QhX$QTg!_Bw_gieVbl6jCT&7qYZZ>;p3_>k1t8nLyPc|;`?(md1G`# zR;Pwm>N2x+R%bImr~^(qe9Pl=ys8EL^RR^gTY=?1s$?tH@o!o7Cetlv#a0U?r%6&cbxcQdXl=F>Vtqk! ztrlfXmLi;tElbueS5ZS|_eNgU0SMHZ#!aeF9c?^~v89@3j+{k=)EQERoeDUNelahx z9+9yOG&^LVDonLQB`&(o{0E}9xynAoxu79Y+s$$spX8DuY-Be)c?-Jpv!3X)We@0$ zT67GC*JP)|y`>bJ4k~piAjbRo8iuO*+Wkw{?f}`-k-zDD&@XulCBAYDwhJm$5cEcb zKHD#?e)>5n5PS{P7LB{QCbQRHzF9bchd|memv!QmV_yc6YsBv)HIctHsr@b`9DX$#;3|>%BVscYVik1l6PYPXygUZF4iwiDgp=4 z{IAil-rDdXe9WosrL9Q+oxuqlg9M$QQvTh~YTzO*QLVk%==U=K1G0bt!k;k(?sc>4 zOuIFHnwrKX3*~03C6B!e6g99U6+^BN$LN0xdzjS0dM&zIWe>@9{4<0;NFZ6V( zo<4frM`zBu_=hhHNG{p@hs(!`-tD#AKV5a}K{rUZE?@rFpnx1Fr&trA-QkQE)f!+k zW?p}1eYE@QzM?5DwmXhWM_otNxv|OGoKHpnd!|R) zTX`QG#Qv88P0aHi?L6xKy6E{doxv4 z|0=-2Q#W9>_4WULt<3*uFtF<6V|i;#I7aN7v&z&6=*TEx?=AlJSwTBCoCPeO%)MO_ zP_$lcPa9A$^>nS2x5o=xNc1T?P=qtQVCkuGzdmRdGr;UJSj9&Fyp66^)#Gx&1 zJVxHqb|ETioCZ)mV)dR)c`Vw zv4E76{l?;b!htj_iQU$no%>xV1#pV&+&w+nxsYmT=e9U_+-abI_yOsSys=w=W}tsu z2n|Cn34_2=2JwtIsm^-aX2MWa$PT&)jBEyPSsm$ek-CZOisCZu*1ko3}2Cb8#HzErzJwAiRS02`*z+j`?kgGTPek*_HDB2Y3y64)XK!&%3uoU5S)K- zapyvZynU;Bp?zD7KNj~`R37{GejBH-e<})B6__$1n!TTK1r7&!ccg(u-e9p2+!6rU zrvv9`5#R^pCI@p@&fi12TjwCWv3`&OD7T zkuHgHX&SCnCPmn~4*Y*6e-O3Nx1Bp#y0#ZNMyE|T4I62^fUQVS7!$Ya_F^!{akl16 zjc(ap;dDw_xQWaLPOK83VV-3vcd5LA>zqjb3uOKg=jG^U0g_`zA^(c7!r}IkVQNX; z0h9kjwE$1Ohld7GV&5^!DaZS`fBJ0?-?(>-Z`^6bVnB;&A~bcab?yq?s&nJYPej{J z)6UN7K&~9KYgs%-q`p+z{21RN{eM{BvOkn+&z!&DZt$6~_@0$po4@=hrQ8PX?_&2c z80fv~C{_{#mCG`G=f5#K{4~@T%w+iyquD{yWn?SQr@?OQ@xACQ&`Z^xXv2Mh{l2)^ ze%EwbX@9uWG}bH@w;-K^TvP z+2SMg|A4rwKSHR{UzupU!Iz=!wA~xA$BS*u)dJ#T z+gNb{Sa{&ZvX8XOZ)N)wcWZH1Ue%UlHraVgWis`q@XUh+{ymU@vEPGcf`hdQUlHJI9%$}x`9w$yjB*$N^(hg5P|Dtw&} ziW8{gt*RMCOJ)8yPGaA#B|EudwjZVK<$ZHqCB7&zihuD2au%O?00Z+mPn`8-wPXPO4cj#`K~7 zZbVtCY5Gw1M_lpGVGfBL8nk53hdD*sCqCCpnc)k2JSQ%#50bjJp-sw3Jk0EcqsP}6J@XWI&A zCovCS?WjoA9`u(EW({n7%QEe;j#SfE{Y=de#NAt3R-Dqd`HQ(jl)bK=RdaI~#jQ?Pz z9CXuL-C~*lVHIsR)m7k0o@?gR1>U0B1Y>iOg#vkj5YgHDVwUD zKG+0E%}@*OPQ_Y48HEdjHm#}H)}+p(tm0e=P?v;2I1X?g(i@jPcsE!Rnh%h07{bOp z_;dG8oIalRAv$O$k^N$4{4uqdu6?16(;vu-iA_UxCOg+oBBhixapzk~ctD=MRn7gAXHna1M2YFAktbX&c0k)%S9WQe0O$s;$N zX25`TU_h#g2P~wHB$tfc^5xsO;<2~1(~};BPBgLp_BT2@qCY_6d@9;Ffj+(L&!s(} zB*v%3r^mk-|I+jzenGS$H-Q=ST9f*4l2eaPWK6Z{y0-NdkqiVno^W`wed;grO1vlGKlMZdL- zUXbz0L#;5gS18ZV0uj2(^H$08oIe;RVeUNMChKd;f_VDe8T>{y zND@0KIVH)y!A^|dG=Po5#kaO6N!yUy2AWs^<>!PRnYI2n9F&0+ty(*8aOX1S@A$~l zjYq21#-o!qL=b|+O)e|F&*4#q&Vsw6N9#zZQKMk3X9x;~&Nz@haxxL@8b>_)sYp%c zqGbK5ia1f38;@REPKi5xo7oRFtabR_yxI*&9Y7exVN4Em5G%*MIr5?% z2C0bsoQ8a=pi2z>6iP-S)*g?+I|nKr))?W*(Z;_qC(Z;P?&w#1Fnbl;V9+x8Edq01 zrla)hR_4OwYJy43?1{bUW$XI0KotYQVeLjPuMjU9fKx_Y)D3O>RIs1i^eJFnSs6!M zG&au}!_N7fwwzGXz4uS}LSe!ho(HX%sGN>02K5iIvjp!R;Lb66*-5N4{x(FWrfAU) z)#zpm+^aegZTK|Zh{;43UaD{5Cb%N#uv5?|EMJ_b{cpp2=-KK;RT}LNyo)aE$B%;j zR8-H|9WOBe0X5cP>)3-&Qob|SC_$U`5CU5@-tRR-YNIF`*VRR3xik41qIYgQW%K9D zrih}*$s9qZ$o%4$C&V^FX={us$V|pI=HQqo1c$gTf}qc zD$hwPBhYzYpU?WY2g@xfCq1lK87!Bp&sp>OA6y!#t4dULMi=Q09Mb}&m%=zau4+*m zkaU+LHMz@yJiy;3+Q@9)cq9m<(=K6o)mq~Ii3veZj%LrdjgYkf0>4FrgaU}*M2BLt zQ4Dyhzu-}0nTlIi7g3^OI5ux=L^>_&K;yl(Rnxwp0k@gU?}$@@P^|7fHChxaLx|nC_LF~8vQB%OmI5L*~z&) zEoaHmyJQn#!x#+AJ9OrB1pgOLGJfEzX5KCz`_$Fh#3`Ko8!Y3uek1eeCo}x8xaj;D zKDwVZF`GIC$vJvp)w|JqZvwnz(`5|Fb>RQopT#>?C1ZDVJ#AJ>*5*%8bMfr3fza2& z|J6k4LDH;0V6$8gu_ONPIWUH)W~6oi>9A62#*&8(UFs&l3-aePyrw}bja)v13h3NL z$`3NMY881;i`0>?8B3{V`Cd1E7Hya=TG$y~cnzPa+A!ad&U;MEB-WL2*dtN(%$;xK zF5tcNCYHg@i|hfPjVnOuLT2KYgv@8S(FvJ}?B?B^nTmBD4kpYyBVGGcz|XE~qV0*9 z3LPfV84_IYG@RLv{>EN)d+vLtdRH4>c>$i#+={Y19!D36&$r#?D$xHcENH3a+ z0?FShFrgP2QUy+t(Ku(xIWs1+U9&#QjQrEFIfiwK;l!b8Km5OSG{Kqz|x`yj;^H zt~8DtnZ+^b%m%eMN|6u4b$WciKk8)5ACfztg5eQ(&3^0+|I9xLL5PS*);^PLIt!^{ zNRAiGI}es*PL}MTQ&SO+(5&_!(%O&{QZWJST*kJ0Rm+l@YcOu6(sZD{1oLTeM#giP z(2(hjr5NemcIQU%1^DASR4Wmd;F_^kpen`n++Lz~NwA%#TK|RsdoS~9*R?6HjXPHa zcV6!W343=TLqLg_L&7dzG3YsWo+dv?)O$AHkF~Gr4-d|)o_BHm;p%ypEjT=%fzA6A zX9en;2iCXZ0DCsR@tp;4pMk`jck0+p3DkjWNRq&3W~u)hzD1g)UF%HJ;?Cy!)}z5M z@xl7$a=cH$1KD3C`amks2kPHG3F|JiIjsYu&p7G-If#8xIlL1k#zF{k{u3XP8loe9 zuqeycA?4)xKfu)@6(eu{K(ao;VN~ate6w_NWiMr(yD~fIxQ$0S$PM;P(dwISK*Hl> z_Qw9KGcq`u{TL#=Ci6@x!g?Ku#|~k!v1&%gY)$&t(;*Tl+PIFXN^puCiaoPxy|jW; zLwp#rGGr_y^lo>Su!6X8qoOfeJU%WB$^03#EBI=+UY(t?W3V=uX9YrkhJVBVSXUoZ;Toai;xqqIQ9_m{wp8M%Uhd?&ASn`&($5b*yQYUft>v- z9np8RA)_9#*eud9=ihyblZPIwKom_N-4x;M5Bek1yQ)TWQ-&}ST#@neU*!cEZi%wI zm(92Zt@z*lv$Peq=A1|b6(@8NiLKp;L?TwFz^^An7hT5qV$%;)y%=5iC#r*vu^0W{k)+k=K`#0{J*@hj;Y{7dV7at9{1z^r zdp3CTd9it^6;9rvA13Q7^4|R1Di{RopRRf(kav&pK*uD1&u6N3eX!0r=u93x9m=EJ zLUESGT^1CZR3?Xl(?I;3-w9)8&Zfi;MH{u-5KcTy{YMlOzYt3|xneXy015ovRsO7U z(&K%|eT|}v)r?yeczEmx9$-KI5Kz}X?-+U0946QF=iy@NNogXf2q*tn``do6sa~la zG2`k7yegsO$mm^b5u#Eora0Cf&=;QduBzmN6tg^HxgYV((YqZPGxGLN<6%fzWl%;u z!vT*2xzQ}6sK3-`*>h5mzcRo}|2B;e8QX=59>|{6*@Jqhs zML>WbeaV5my~%wOcH0E!09sTn@TB5K(BCo}aBUrWv+*F^&AY!Q8;6gzq+-ozmn+%}e2@IIgE}ae%p^X*_DHUh zgw}J2)+laGFqgZU0dbR@I$I+BM78Es`FFCE!7DU%x8adp$Q3)+)#k`p(1r|qM;e$j#Qu{K4|9AmIf5OP4M`^U(5val#$^2lre&EP!C*%0PP#|Q zLocTz`}MMB?7?(odp!E@E7O@blZReNk2n&%NyjjAukPTglC+MsClz&{wqxzey6%x2 zKUu%8GCx$W>h_Vi@Rfm#q|098K5dvqzlYpyW|>nXI+8K8!gSU1T6)kee5Rq1=kn02 zI#qMxCZ=jlI<_{&Udq2WM;~bxh*p%>$*NVi+~P$x8&KKLaQwaN(R?p+8W=RRB-TUA z!%}p(T=A=6cwuL2=xk{^wyej_PV_P-w*6LgmWp+dW~%L5!RKpv{4e&7R4erQ0eV9f z!WWs!tfsiF(l|j@BQ#oZSkP*UhgkspeUXZ$3YdTj_0nNhc+y=#_NS$hGO%)2Y)C{mZ@6Hjiz_ zH(vE7ZMN|LhGhMgvc<&bcqeX7RV}-jBmASEfxAR*{)LzMVr43G?o>Q&ZpZ11Us@LZ z!O}Ew4&Q06+)%eA*}1|s+_ok}wr=bKZ^{E2E!Ff4e!KH&*iNE<;zvxwkP(m6vO z1+N?25s&RlH{CwCJ)uMv%-!3`&3kYeY;NU&w;9g2(L1gM+Vl>+#x#<0G#Oc+1`7O< zq#R{$9L~n+Q)+L1EqUlAb~%Mlrx7pRl00pb2>m$`dMER;%r+K@ zNPo96b>ddD$zWq^qIVr)kn#FldGwwi^Nmz(X(g+i&-b#cn}!f0B-RF{uqmsJ%Hs$+ zU~u^Dw;}{=e1};bT<>mh&uDPF;jJj+X`Fe*Cz~j1 z`YI%u^UlN5>Qx;gUo5sOn?mWPJ80*@kwY1#II?t)&78IOPCVjhf%t&-bnK9K+FS67 zB&oDc+mfsTOAnX`{64H@Sq-AhvJc>Z@ExY5Mj+?Gv<;~${9KA#iQe@A^(ZYzYHT7Y zdO_hoN|IED&d{ou7 z_n#qAqhbdHD~L+0v}KA_QmJLGR5LoGXK)6nf^u6>+O(Ei^_FTPwB@yvsK;?2ZMC(p z*S6Z))>iw}w$y5GLVyHNNQgoN#o+5X1TolZ0x0=^fBT#>$%J6<>+}5md?Yhx_St*w zwbx#Iy>I0ZEeB_^&df+bH2MPg6it-;k&1NTh#F={!Q+=k1Jt1Ngi$sV*O71&4bd2C zG&_9T&lnAyQh1EZTdLm^ujmLfbOR2pBZmXzuJ4E3{V`a~;K;R*HwuuuIego_44qI^ zIQ7+V6c}03$Lvpw@9s&H7TS`x#3WnnRt6-JWP&D8(~(slmzoaHfoH!YotS;yyAH3xf%#iB1}R z05XH)HKnq=5<$uBNJl!X(cKo}B%Zm^+mli3U~hsA_Fe;|wt)jG71@C37LZy8B3E*F zYbr`%nJo}v_%_wAv~0m}A$x{DX#>tg!^W)WBDU`qHK9DN*no95B%`33+gtUGDKElr zCjQeWVZ^R$R9;@K5_CksAO#eX(kxQ5ni}=TdF(-qJ=rCt?lkGe#%^kkZSg!pihDOX z%|Dic*W`Yb1~(s{7GHFvyqZ12a(i3NeVS)=zS!;aDt`=%7-8|fNEcgwfw@Yd0dT6I zz!~l&>3ntJ+o=Xv(zI`sA%{(yKbClx6l6BeyO}ikK(H;RbPw$X2WJZOMu0 z?9jiPz+tRw(5dUZ^mAdO{nnx8M!H7PNH6egwmAOb1hsE}l>$lhYT2V$ES)_UdW03u zq4#Tioe;fP`TYQItJtqg#CL&~;x%)a>2%-djQBUkL(BHYJ6Bw#cZ-U-RV8#K-e>4D z`$O|$JaWix=a>lJaTyOK1gRThk?6RGF~t=pdL_j<+u#6?8j(u5mfgFE18bm0OR>`D zsOI${EFlTI$9apB3#}Fd1fKl{0tN8djl0zk-apl|zYVZER1c3~N`B3tXR?Q$SnoRF zMr@l4f2x1rKEOH|Mxt5(Fkx~bs>aQBpM)ZPVvLzfIxrR~59iA|Kckec6D?cW3rPbM zDZA&W8*jfh-F&K;{cIXwu3-!7gDdklmUWLXJ*sSKgj{-^)DL{hbSD{Pfg0TMR^a)6 zf4DYeU`&Z5NVN7WEyQV!q@Ly_(4a{PH@3!hpjK||OVHd4a}3RG+^gtP(endgy2(5TruP6RNt-B4 z0Bin5d}Q}k5j}D7k=<3NbqM%fjXZK@)gLw8ylTd>BCrkjb#|hKuoxgXSO{H8R$kw^ zqfdY@kl!+UsVD!asho-sN1iUC7cm*gZ%q(;i!cJ|;jSn6A+lfRCz2M_1z!JFbBj#@CVzZc_ zi5sDB#1JcY8CzVE(#lilNikIt1)9x3+xTG)L8>Ockk6BSIY6g>wwlE=^3=p+^qp{x zUBTG)5Bh#^^&|FjHTPGvD%}UwxjMzT|vA?j4J9U`e4%f<>s4M`pvOZJ; zPRAeqL;;OoDDAw>!=pACPVyQv1NdGt^o|aY2fizh$y#?VJsNtrd8p3GvBVai#3OI| z=BN}F-2?0?ufOo^?b_EO3T9X2l4>5P7KTU%(B~pX?hqOYpMrhR(Aj=Ubwl-C1@P(M-+Xbkj#S9G31A=)CMTgVRyj~H0X-sddh=*z1DWq~TN zEw2hROA0Zn0EbA@o`NdyK@l!zN`=t^JWS+;QZQ(RZX7ooQkyJ=KvC1-nqL`Jgk_UL zFxyuM&;dR#>+42QkgmuwoIp?xsuWnPvv5t%mZuN22l{}|QEt0MGsTq9PailMeqsFM zjXuzojJ$1)_K=*{2SBo~4-AH6G?73b@Q{o?P{GiFK0tV@uMZd$pMnS~6dQfOLvf%F zczBjRpju4Ab6y`1rhR>2N^tLiI0Xr5YkNGu(F_Cg(Lxyud7 z&Io5N_i&QRhLbW&+;1YS45x(RPzjo?;rl(6U~?)v9hCrv*^!RywnpzVDnSDblbh9| z?2e5_Lu$~=o>c_h?W{HFvpQ0tHL2l5$u|=Ch;1!=+Y0Ry`x7Y}Fj%zNmTj32Gpy(W zbb*Y1=J`B$TS3$oW<|~;VjjY^D)c96MTYZ8H_zOfL@Lg||4>p>b*XzTT*u=_zI;E7 z2Z4OwWaRtj-FN8C=m(TH@vrERim(eg&w1cmFo)23_Y~eU<4<5zj7!!N8b~+cOloi! za?FQse^9ak)H)9$EpmUaXUMNdk?+f_CIhPE`{6)~Ye~dg=F9gx=)z3k7#OO@cahuC zPY6r!;74w6lH5KX`gGZ+v|6r#`|AO_L~CW5#;$LA(pH(~f+rJkJ{f(Q{1CclT@dF} zkr!E2Sx4uIhu0xX{qia!OZ}EVk2TV@(@vg~Au|)YnctZ%(&0d{kwBsbXR^eC==$oJ zR`wHtq{96>MjorMqFoD($T(48o6hvXJqElMh>SuNFZDX3gGsmwWROtDhCh`7Zb5wL z6X>o%pnHFE#AS#C$659@(AFp1Zv&z3{`KY78ou_4O6F5RzE5T^TCy4XyV zoQgdJAgksn>er5y0GCY@Buh%ehk;ZE(%cu?QO*McvwUhrj44og%LFf*5e=B<_l;V0 zXR;D*m!@Tc({w1@W$tR}T<5KVaCAfB+|}Wl&$0Gck}*_f%xaM!?SnqiiKy*r<$jGMc;GhGdwe; zCcSYC{J-b-cyzz`L^$_zzVyZK8aOlo)J-zH)-T)V*3uwPwFBfQ!VSqr!x{Q?D^_Dn zSuAH$A%Z6?zr z`;~ZZpS@Q|r@n!gD^fQ5{SC{09`~W-wSG!q^@lw@>-|QKTd!rY?4f>5(&`gp1mV4A z^&(9$AWnWiO?>}dj2UUHew4!7T=$o>6-!WIRbm=@v6$Eg`uYkl5iv##gMx1G7%;bZnA}|9+aIkvL3b^d$gS-xbR&MBhtckJ7AO;Z1#Hr1TQ+139g6L@rbI)`_qv(eEdD4 z<;*N;NBdb9uHD7UR3NUplI+6v0sCQGe>xesAC4mo)8Vu?q|)K{{j!ZH6j@jOC(B;a z4m>@Eaj!GGFwqX@E-m2Pb>z>3CT6wxEvph0Y@{OB*t}`b(qgPo+gWPGk0?*EoeF$( z+#!61YaXOmlhE`{Bhn{2Kw~;r5{}!m9;c_$@X9~F7fK_DOz|vD1GF}HXw~Z;Y99&b z?lV24TSUWY)lzJS2RXa`D*0yCFqgZ}*IgYSj!QV-wh_5k6Eg?4VaL)@pS`j1#2niF^fvr8Ok5Xf3mkvFVj z0JLxFNZ4FnQoSf1X$#Jc;%f0PnNi1^Y~_nEMyqju-AZNVbeT*!WM zN{-=JDd$trPd2g0FmbN?^>{eZD`q=8?&}`Ox)vMQOpMIOX3pIvB`4X5$CW49r!TKX z7{8MhmA>rFknIdco1LON4Yr%vm+dqFXNiti$5|MlT@rqa_*InH=7XSGAt`VTD50l4rpheMrFws1&%o z(UW$Xkb-*YH#QzFT?Czs5a@Ey*kziHM-@L8b{T%f&s7h6NC-p1tIp$-08QBflD%oq z#^-mYJICOTp9a#@osW|WlV+Ry{Q9VP{pQ|2x^*uFw`~1K)L*}?|4BL%<+-008zsY5 zs3!_vskd4IamrspIoxyO_DYe+rGajb^U4rO802GrT>6A3uY+~%Nh1%?RlVO8BdWVc z=*}3fKTUUr*fIT&^hWK#$~4SNmNzxth_+BnJewp}(dGQ|XZ{Q9Klkh6Z`pKxB6k^) z3PjPqNW0YtXpcCb)pl&%oT1I zD8CJJq0IDl6XF(3h+?6Cv+m^@^>g8L=+-0GgjbC>q*i0fyRjE9_XH}574bfa>N9(E z{;ri=v6?}#yO`p81j{3$J0~fHhZ@oM@{^=0H8DrCGBlEQx3l;*3GXi>T!d>ssqv63 z(uRNamn#bR*Fd=fUjTlBWbc!7OaUmLQT{$7{EVY%#U zk`^8TBxa`x2y4DR&J>M`fxO|2Vq+lY!D=-NWzX~#e^BnT^aS;!$-(XhnZSItTK+u)f2mG<6J(ZW)It2k6T08W@^VgfLR;3~g>VYFD!}>?J^JYETrR6?qon zCK=hK57I8vxyvY@v@y1#S1S`zS+??l!b@sI0(jWA?nz{GqHuZKJV2JUlp zDGH@T*2BwrM_W1fg`NVb0KCWSgOTp&;l)e?W|i>FO1Rt<7zho(?L#VEpjwxidQTGj zXAcBwTPTBYVz{OU2s6FZ9nlp{2;l6P_kp7mv}4I%^n`}_<_PQ)Tg#l`=pNe34BHVs z9Ila4O13C3MS7w=oLk|XlBGO}0Ih`6W`}f-4S)1_0G8O)glfmcQ1|d!y@@j3??grE znI#>N?krA}L^D@2(GQbR3TV}rQuY@lK{UtgzuQ!v=Eh^}PeyLHL|m4AV)c9PFSIt~ zu{4MMZWDq`Z1aBSs^!{W$Om!zRm}<`d`ou8jCf>wJhw0ukG{R+Dv1ns^}Lk5FP^<= zp4I&V_?JCC%i4tw!HTU3vyi=!6xcN+N%m zV#%tBi<@YQ?D-%=hiW#_ZXly8IJQJ$-LP&35;~o2k~^|#aL1PTRH^gaQc>6WF4aVR zyPDd<1<0bl*q1l*n$u{9msv9x13SHN=HWg;5C}w%c6QmCyyW5EGukJAs7{08-z9%| z@$a7e(c&y$VHOsXPojecSjyt#FzlwrVXD6t>v;+GAk>5GWj(1VEG5xW%?VN;t~tT1 z?h+`h-s=7^py zP#Q;DhqI33p6Ou+HG)VxQ4rQ}8gC$KkW`iMZ8wSbC5Jo>z-f47SCR!pRMMcu?mC;5NA_+BeG-3AFJ1_y7`Mo6)fXgV zWCpFg&f`E)`v`<-c0!1f4c&B)pOqx~eR+WazAk|QBN8&;V&lK{Hl=&LFD!tCX3{AR z0||{DNriSxad0M557`*GllCDaFktIU*Gq1TZfC?t3_5NuP1!HFuK}NcVyO*bB2BPi zoimrPX+W_rEYwp+8#N9eSh`suz#EVlEENcnSeI^ge?l)Z_%?=bzk`oj$T6%>uW+s9 zaBntf00z$>NR+n+atk0kD>zyKOXSt8qr$z0)&=syioH552#GWfe*E}FtS-Jq;vYxx zNwL~x{EbCiV!)Ndw@BNLx-zJ+<3hOvhGPrUfhB#4eKz0N-He~g^5WU9h8K$N71v^! z<5`>BxqT^UATnb)qtn06D;g|PAF~6$=)7ElvUogM9A3GQM*g|S7FiT+S~^BYouV8d z=1Qc@DR_Ilhz#2Vd~we*(LY|mM4)cNi&GI?v@ncxWN(@Rg}F(apfuR1Gpj>sXz2Sw zpw5u0uLGja{I9dwB8$f@%JiNVUiCgk6qOo{%`wKy15N}(bc_H4Z;l6I5!|jl+?Fn@ zHJ*$~jm8a-nlLf?M!04q-HEzupadDoIaFbR$P8ri!KrjXV}zfKZH9De4x)9=xnExlrk06mbz$ouN>wJvYk_bG{Yq@Us!dfW#5T92dmvUf3Mk-#xi zUsY$Q%UdR5mqaT^*k|BYiv{@t=cf=^j8M#b1r=`IxV;rrjW>CUCIglw;`laLah|Ey z{$Tp?+|ct9k=6vXzw%Fvr(^@g4|%1h&6x~Q#1Ux~?jo1o3@g&CRpW*_=OUn$zX3E; z@lL^achCw>u*J#_mo|nKB-)a)L$_WeSHHTTgq~Lq$gpqalr85e=i$JBjOr5=jPY9R zFW`(V!1@xT7b9i^^>RcVc3JFq!fONk{T`YKuM+xeg{Sg*N(eELfmhbKl&OY6Vkf5Os?$xmaLmDyKN;UFQH4#8i2dsYE|Al?F|&`xK% z?6QNuaeI@=RoRxdr8q?XhS?~maEabccKi3b4`XQ7-vf4IZzFb>=&szQNKGT3D&^g2 zxpAk4Yc8d+Rk_WIY}6KR;dv^TqTE>acur=nU)gF>lZ+`U9o=2^VaiD?{ea3`m_(dp zrhbUQ69otf*B<(`?y{ylT-Ws6(2-uYDPDBhGiNxzTg@4fyQb9GR=7onJ56NBoI$Da zQ+u#wO;#!Ei5y|$p;%)zGoBbP+`!A=GJDc#mh_Mr5TW4HjVT`0dAjIfLp&D?d3S3+ zX;M`&mi~eHMVn*xre(XRL{h729bWO2o`CKK)=x1Z3fI?hfl_pRIJX)q;3d1Up>u4g zvGq`Iqx%4lWJkW+ATOCqjbnzo(Qb}6?V@0wY-1jwN*+iyk?;m2K9Zd8{wcr=?D&AQ zx!T8!aYzMr{oT|LWT+Unik$R@w5c~py{ZQ83|yPUnvWkN+P3U=Wxko*yud9qa$NO?Jm!SI0J<6& z7k9j8uOmdj@P7t_pS#YQD)B;v)~r}7E?B^->+svle9OUQtaJX9{#9YT1yic|D7aKN z3pk1p3gM;3sPlPxcZc&^K(|K@;?`r^F}ZEy?M?Q!NSn&EjE%M}tsI0obozP2(Kfq1 zJbg`X^Y>!iJrpRQ;+!)Z%{HiQw0Y@Jud-3}*;qK;l1qK2B-9dZ2&WrDRNSNR%C%_U z@J;QPHA@-__e$sQ>O6QL9lI@VuXo-h;4kQUQ@(3NVZUUO`pf&Kj@-8AxEaKSjN??jbh^=nIBo@Tn?OvmtokC{x>tdzJ*-7uYt;9PQIhJ%P>OXCj z8HV9|ah)TFSCWTiTPjcltnYKjV3Z&0XI?j}MMASi0 zB$uIvw>U4Oe_MKX0JPjBJBc`JR}Cd^9?Gv2CUuxsNI(>hQH#%3`HWDjU+*1 zKcX&X*cY9Tp)Bfgh3d_+^+>kqfH!y%ZCDQwQ=E&wVm5TRR`<+D@Tk;+fXpEzN6CHO z28693@v&vOKltZHa*RcG_~PQcRCb&hdwyy{nU?zF^y6cU@eoe;J5z7*B*%H0!)%$1 z8Crs)a(!RF*_R!$uNir3w$t@xkGs$A9B1T5vNik3kBFb9iv!M^yow_&9eKKXhhYH0 zdiJX~_#I~9$&W|tn}uuP6N ziCEHHBbK9McVy zQEaZpH15&VU@`ZSzr-)rg>&CRMuI!N(D26C&{s)o5z0LEso!DGd0lYMuc>~+{RvI4uLB#RT&>|E z=ej3!BsHQ{c_c>Jj2#focw^)?iUL+{N~U-;hcNBr{vbJ86;^VoGmLn%C=q$qNYhxs zz4L&?Ht0r&-aHkbml;vLERs;I6385;l6F)ca^C{cI1MdsQL)tVqM(d3Mvm0!(Ba}Nk`4&-Sg$HnjmG0uFhNmMP&5xS39DPvPFjPLO6B`SjH8jmwU z&_8_!29eXu1704k(FGd1Q%QP5?m|hUm0N>zI9tNTFWHLR ziE09a-{+o2gF3Si;oB5(H}WrS6Ma7$!6WlYeDLV!H}Oz$d)=L?qQPUA|Dck-DwWD;&R9k{ASUB ziW*Boet48K4xKCNy(n)72Q-JF>4r@*QQLR2=bK|zR%I*VCtW?ONDaqDzfx&B_$;Su z(r$9*a@7j_Nv~6yGTC$-ABs}sF6L6(OHnHO{FlDoz8wbh!+!$TF3iuw585n%Y*x%pabXOTCS73wqNzQsv=_vh;fMLyOwd70k@J zMt7$%i(^eL9+uEsCz@fIyX$n#?;E-LHdEedusD-S@*chQioSXXp6V@+{9FVhW9gA8 z0xV2){)s5XbnV+_sBrC*tb&IFFV6rx?CisXVyT4(_a^v;+0WtI?&J-vqZkqO(LA5G zC!^T#X7_bE^7)4# z0X9kyyzTzGe`1hKnI|tG!Lz;5`Md{7xaJJ{IRc0p1$w5bdRFr-y3V{yB%95LT)Hoi z%^y$t4B}|Ncs4IibK$Q&e(YXqU_+GCv4}`_yNdSq705N&U(iiD`izIqnzCR-N+k^# zF)mR1kH@_pZWptpF6iswJBl^mO3Ds&Q1bTaK#ow-0dfRoO=VYbcft3(Q;oth74$cF zTwMa(zU2NJAQ-}M9r^~wx^NBV=w3>{uUuqC>vu1}TFK?>6c@+4ZTR1!=u(n;x#8cml4}S~4TuY{{NZ}My?UL=(y{O(sO9i)()s8tlB0onx5wbcN zc-HTmcMJ@$XF=NckGl`LQr6mo`il^>-28&-E<*W|ay#n1SnX!)`L#IvLIfS#~%RS6% zYH|GI;CrXV?55g$wleEX-b`8b6UqfSM|DG`6RBRb6)eKJIV;i52oK!$1^%n9O8YraHFli5%6F3(OC}EXsGfF?N@?H0IwU z*XJRBeIEDM2O6S&#O6fAsk#~TV~2VxQU0FDo0dQYm$55TG^oO^9{gN`- zv^3{9)=bP=_Id&>s^%bwr7QR6fxNMSdNZl)i5O`;_*k$lPU8&*Fab5Sxa9l*D9HSL z13&qVbf{PZNj-DDpyWmakJBHX!uoQvwF>n>B>HLQZ!B}*i^gL6v@x?0$pph+c8a@} z-?Z=2p=UCOz8GHlsCkFq>|H3kt%o^wC!uf>LZ>Ke{1Z3IwJO=+Yf?$^vZyK@%CQ%f zi$V)AVrIL@`N%_uxp;l(6n<684rj;s&q4Z?B$$!eIC32WG3wLNT}v_~#S(&tS5!y2 zte2LK`wHh5Uy>?XuZ=KC?6ks2(o?y?5^$5DnTK~SmNiNM~kCe(oVhuJ~=1NQ?|5Cp)@7$k9V9sKk3h4W=sGKkN-bPb(H)+R^@ zVOJml;&;#83X4eCYdD``kvHSfZHs$inS&oxICyyFulP-FQZ#j=$tw`49yec^&`MBi z!t(HY8nTlj#*GgXWiXpAlXZa71@gUx*3vCl56J^v^<_|pJMLJGkchM-qAlUO9$*}9 z2a!+F7&0CEI||n%B3&_7#rO_GqY4VXmG4B+K2L6Av(}3GrN4UTEAxEeV=juW%=YCw zqlcH==$%JYy-bJpQYf(a^l?h;zvaW|;^Rtl*C6T+ZRsQpbd)(mb5{ZB45Br+R#VBN zq53tUfSt-v1`Au$+^SWGfYA&U?dEJ+_I))DTFMYRpk*&-b7#cJ0kG;XF8!F=ql?q? zfR@kDl34d60Z1kTo4W$g89ji~K!v_=6bR!>i<<5np(Oc3zCb1%1IyUq@0vCrMRq z(=%qOJJQYZ#eIF4&b2KkItc?9pQaKH!pjj{^^$n`G#) z^M6Q&5p$TF4xM=m)wV8EwXIuAZ+?p^yzk1Ur}!th&#&e}#@JJIDp`H3)P!wSs0 zxr2yAq2d^7j}KItqmaJd$q!Nj zkFaH2=J0rriIq9ZQ{%!7)^&X>`cBm>(NQHOb|#tVYwX~$C?18Gh(5VZ0B$xO+rYC! zv%j6^$&JE!{E5_noAgjm616XfYdd&LD%`-GTxa*hBd;;$; z-2!-ttD0qYe3>J=2Ah}27d=_803$y$%9!q>?_g>sr982^>hmJT+)T>w)3-O5Fol8! znTC3IPG&0VRGkCEYL(9!I4ezQ8a?tUUcR`PTSUH!OyU@)#yCXzQAV~$OEo=Z#;qV54JAZ}JQD6{KLlka zfyIOlKW+@X&cSPt0&sTVMv}o7*)x#6OspMy7JtRG+>}#|*yU9J)TbmlLP2qW-vw>bU9-3DS~Aid;-LjD>y%r-_hE;1eN39r9T(V4pbifh$$X7b@{^i@|)( zVURxHcJBN{YfhybQ(Hv-tmVvFb}`mn>Z5ZyeR257`@;PkqRM;SP7$_U&rL4|i>(}! zZY;7M;42^*QIVgZq;<5WYR0des#>6W4>o~lv)e{!vwTCGvcAQu^m1Gp|L#n8Yji> z(Mm?v6Tw;gwsmiK>P(YkGyW-sVhCZ}lGcJbp9sru2^4R^F3lEJW_N zU`~NuUiYXF)?OU0naVp>?ut?!hRAzI!tcKJnRkQtwAW;#FdHW8Z5R>YvVR?n;(tp9 zOP&x+*?2?opnHMVj!7Tvqkg+*0vnW@(43~LdClhx-Wovt&R2-?a2G-w;@cwkmY?Pk zdQ@_saU{7P_`ZkI%X34|4M_bOa9~JXH0m)Vg1i*C1-&l<9ADkz+KxD-*DC7`dl`7C zXMU7;IY%v*C#O6XMG)2=XC!0z`=IJL_JA%_8gvco^@F`D zU`XyVA>{T?u(E1Sp^mr3zf8}W;8H+$6hC|Cv+o~?w%Tn=FQl@saffhMuKXd2aKIhX zd)l(k;?F4GfOlgPyCL!&41|s0bR$q_d>;pPJ$p-QPo#;~xznRd+rd?ZbMa5WEFTDT z;>N_>?2>51(i3wdi{qh2N&-#W!Qal`dT_8khtt~TQsk1>g9KrGi&K1fs3Cd~-%4|5 zO>l@6*k8Q(26;9{LG+~Ja%>sv%er`^o9aqR=vowu9**a}*c;9z2RXe&RXY2Si>%7c zXs1@-SZ4zBv_9r!3>klUh0%b}`t_DVDx7Ke2>G}Tu;g?(7ko-wMSPo$p!cTcZhT88 z3ZDOHH_3^Kk>%mZCwFMu;UCVfKn zc%{?ugBWI_d?yyc8a}CdCL2-XMiB2kvQ63gSyboV%|BiomOwYY4YVguX>pv9#0sZ$ z7Dc*a6w9v=|Mw16?=WME!47m5UBz|`QTFT5km^%KWz@q7T=XXT5dLP48x4ZTA5#kq z4esU~zEb<2G9^(0`y0c#3$V=?eYrzBp9Vjo&bT=A%9(5!X5_r{V=(L;VW8D7RY$iL z2cdYS$=QQ-%%^P3)BR4d1z!i4jdonHwcqb=?FGWOMG%zs^?dE?`+!d8*nBp( z4zhVy>bJ#R zYRp6UnZeMr&QHF_+#lQvYgOz%O z^W3NOW6(9?BqyISLs(8s{p<7_Z-O-ZuFd%;L!`QXpXnMZ2qtA!9>!iHse=mc(A`Ct z)d_e#;8Zb=5V*(?QZQmFgu|P9YA<5=X|XZ~hE$)dp#MB|nCL@M3?f9zkOaKWiuAB} z#H_SByJpalt7O^1;t%FnG_0TD=(4?~gOg?Vb8OG8yke19Ux=OICBZIhSO$Rd_fz`2hNi-+?gB>vIpz00WW~Zeqe#e!MF|1x=0*Y*XI`-S zEPc0GdM+$S$nsYHYxsK*{xvi4tIRaTqNcI$v=<_0x(2Q7a z@y96!GSU!{58`a++u!n}43B=kYqWTRFu|3H!!#g{4M6jE0G1d!m0KBq8pcMM7tSjKn<5}hp$|KC?13{ZeAMZXg?u0X-Jgo>(+#) zZ_7;@*7789oTIW?O=0q7-ZH? zG}XM_g=AO-a&!LSPstO+Z&Co&xPDN5?tdGqhL_+YD-H@nOH19eF?mSOXdVzB3Vuy( z>CE2AzTPa?i=Vn;xR@WQ*MN zB9|T>Zlclt5BBQn^%@mz^KxJe|9;Tx=2=>7uv(pJYJY4;YQSc`B z{8gN@PVLoO|MuP>5aE8)Mg!_yy*F6AD5eJ@$GdftESn*rhY; zIC3YS^X_})9@ujO`R;P;C#t(`?tvYpSo}^aS`DFH_D)r~#0KMuH*!)v0Tfj)TDj?^ zGPnNo6^Ipn%j#_bU-n9_RA0x{-=&}d`LM4}7BZ>(C?}$7U1%Z6x`GZ_uU!--!L$&r z-D~t`au=aMt+RU`C#s4=fM}T6&52gy$Sm_JTi#s ze$%-=Cv%i3GE+^I%wGS}iMfq+&QC7Ut=4F4C5B=-&?^$)+t_Ae}$DzRsDT z`8*z|+lBtS6?+$nN;x+=_)Bm@aguoH%9eEY{U*WlsaABKaob={NdMVW7JOGhnk6Po zt^!=M|58dA@GeunB6s>2bKN^qbY}O(5R73c?5+kKy8bcE*H)rt`v2;aX=Dv-namDW5i#bsu8~tv>4;xpS zR$k`{f3^niZ8Uu738<+^Z>Hda;fHbObI~pqZo|2t6>glAoTc%&Ay>?ViSG&c*GBP9 z^H%Ru;oA4pmx6Yn=Wxw_a9VC|1hR63G#e9L6+v9fH6Ns$Z@d%ht+&_3uzzZw_Y7g5 zleJ;miErEco8mR|1YPe_&ZGyW2g+y={H_DE^7V9RgY%5VhC#lnNV3UGu?^A6)68@d zpwHB^lgreRF{nyC8vhr4b(WqX7Ojsa|C-kOojrGARrQ}?M1{BPcdowl-QLcy@u#ps zR}&d#^*$wOb#lNXOdT_X1r6wF2VdBsNIU}PWe7LNxTfUX@C$z;CV-Nc5 zRNCO2$V{?x9-2p>zCQ!TKn;@N%XBTx&ag74@pSbnC##~e>G)&7&9$tMun%>tl`Nyw zxJk~vmoOxDfJt2B8D4n_hdkh5|0SkJ%!&GYJR*n1=T#=o4t^CjmTfB=gON4(jI8Rl zfMJEG!yq2QPbS+s;8QEsYEKPNUn`29;9-&bQ`k^`E1D0IkG&ir{_)l zD|>QzedfjEtlo{`+TZb@e5s{T$ZpJ442e0w^}@9YEBIa<*`2_=Xj(c zvT;tjOvxk4YcUp-{myl2q&4pH_JeaS@;4`9Z}q+2E?BWvQ|v=_BX;v483d``W>VR? z!lU!KLiE%X$Y=fPQ&Ju+oju;qEmciM8NMjK*xMYB)WbK@>^%y{t}VSJH;IVl^`eI~ zp~SCoK8I_T3eiYEzUP*+Ai|YGj~~FaQ2SHn82uaRwbTAaqW3v}hh{h>`c8-N?X!71 ze?r{Aol~3;+Qkz&6AZCS-t&rdLF>*hsiY^l!Bimo2=D5?RAs0_%T;6Cjf|&wv;^R; z^T{?`tN1FN!LJ?Ry7u*A0%f8ETXiMEDHMf503BY=1Gw==20$a1LXgHb!A6_4+UY>u zrAFLpf-Vc@XH4QjNzbhJx|K5#>ZB=RtAeSgS9AHA^JDdpP1D0>x0&6Aebd|rpX44w zE^KC-CUa>cBus)MxiSp+`_32zT<3XA66PMNY;}eES?`Q*c3xY3sMmd%Z_XKi=F^k@ za|84yej|ovHSyK%jp742#VsWsH9!8={Kyv?NJ5aYrjVcp2|iV{sbUJ+sO?L%>1OPB zTaw++#xgGzSDiXNmm2*}3`^_H@v8GWPpc#7bTjRUXq{%4Y)Ou8nVOAnrrxmkB)+B8 ze>AM`(J=qfsJ=&|c$CaElvF>0C`2S`AB=sG%icN<0`Dv$ z<}P>6Mk`mfxyx>5N2RdiXAYDk!_!HtIq8CTp}NYF6{%2jZ%03KgY3~<68MT$d|9bA z;_6|Red=mxr)YS++j@*-T$ql2$FWYT7c|-<6MXk8DJsnl=V~2HtJ5IcZD@o~2_jl_ z@pJjkd~1;UN;?0U3mo)_mMrFIiRDfOH=mMrT%R4T@CXl zb-{b}bS-Zcz;yMnJW@vKeUkc%ukJ~WcwcJ7tz{`2pTTqnTR4pA-clm$BByXq=quFr z7KRPh^u2UicJZsDJWNk3p82Y})pP!CqiO6hEs?6-4oQc$APMz!o(Zwk=xNck(8yh0 z^XH3bo}h9`_bbyvsa*ie1#4~e^E~9rqpDrQtl_!_QI8>3sOt9nUsRpIb8 z`eBqJybR8hnZ}Yu_oYHYdusTb!nc*#N;EP6S}@oY$*a9E;*YTBBh%1AESJH2p7TwI4E`h#;M@#cW?eSHKia4l4=m%wPrpJ z%+#yEw^_Jk=mj&|i~8;8|M%0rh{9YO6kzYEr-CyEj&G`TMd`0WITQQ&v_kXrBFFe2D|iL-$t(bf2=X z8OFMgB2cetK87Be(pN+0q|}HZG%cm+u+)f8!yX|Iu@3PKUZGsMecdQ4cV$`dQf?U^ zuO61lUOTFK&5>^hZ|XI>d3b&7I_l368~&NO!J$*&&&4LGaR2*Qf*4Adh3j%TpCLhN z$K&1&*ZxLdE4x(+kc9E@N(nD`cMqp>QjlBsCVST=8(uC+hMx1!`D8ZCwOg!WDtpfP zvQ35`zM_=UmMkL%2lSt^RHy-;9d{KPAyO7(@~Se8!<-e9H8dA!W#i`~P+p3faO3%1 zspw19zmkJwIYT3QB9J5_(jc7u=Oc{tGfSFMd#UUR^v3`U7}f{?uW)}R;4GNJ3k;x{ zthxZQP1?_O-rsi?>(c=FbADhP1RET?ag1O>&Uz%tcHk*;o?IbqWgVgCxr!2;JD22! zjz?o8=a-WhH}-&<=V!1j@{(E^E@C4}nq2b)@hGTfJCL=Sonr`eGcqKX%8-E+-1>o< zPf)nrXeOdavR&@<2Ew$;N$!rzF>ah_c%z7D`{q}1`{YJmtSGibbWeEY9RO_dz}xXw zB_f#fpGAslc1CfdcB+yhlDJ_f%&JGt-#*Yo1CgIUow!Slh<5PmBru7zdKNIYBj;An zLu_>lY(73cXt|8Sr`In27;5U1<{Tua^ml(3E>8Lbe;&I`xSaPBB|@g#o$bHn1M;4# zWcmF##Sc@|hWh2-dC&FA$LD7ip8pI>W)e2NQueXjlu?)DW*&EhE%0_m&#%gz-!iKr z3a`NGR=X1wczsnF@;fptLG0^E1gj{rGE_`xx}=9Ui>xU5+DiGf_uzqB@BDZoct#i? zqR8Za;x?DpN}B?*ojTE9TF_R0gtYIAw-cSV-$?FFkfgcZt%gPu&rETV4P{Oli=1E|#2>;obLqBh7wfQqF$u>&BA>#W2_}U5b3-**7j4_RF-#OCp(J@S_S@@3yrf*}u=`($=F(zm+ zl?}ej$oPw9btNm?3RId=8X-_=R-@nqDx1vX^3_tN7`=ufF4EoP@BKZhKkAk7h0-ZbV6Y=Ulh2v9+76?iW=Vc5C>adW-u+LTgC>sRuW@ zJ* z*Ds|?A#}#q3V{V z=UYt_=;F<`4qd%+b}{0cm+lwZB=?d0#je~L;fH6nTg9_loI5`%Jfeypf&*p_j|s2( zDcw=?XenJ%VYz>I1XFjO=;MtRTn;sBK6iFeK?xAX1q z<8IC#+kcJBapU|->Nqp}L-3Qbj-7E6-(}&d@9*otIR|*SRO&=X=P#PvpuNrUdZQSv zD6F!vbF?SNk$<^PVSrY2CKV@Y@8MSxvSG1UjXkQ_<2-U6D?^n@V;H#2Q0RcNr@2eUde`itDeTxP@44aiSY@Fgab6OqR#1c zR(FTDTZXe&Ovy|3OTlKTXS1kmWoS*3xZ6^H#{|12zNQxCRMv?PFe*o(M@c&x_8d#< zFJ|hW?YQL!7p9*Kf8zs?lf7xeT&`72&$oAA6{Afo)4}<9daDVKmQk)K+1B~z3jW3; z4Hu@HmxM)}Q?oNqF15HCIn38aRI+srSQk$N`*L z>8N*0)g^tieT)3CK|vhq&vr`zIo$RUEX}=Js{hK;a^9p{=*c^%_aG*4swCPWijZjZ zLh$GoAM9H%_~&%y=dV||W}{Hl$8GW)W_9Oztal%XH?KqrHlF)_$Go$bqRir1HS{v* zIdsbt2BlwQasLx2ji#HI2CU;Bq13EzADkP>VmK1cIB*JM+xswvwAl|^B?eo$EZ8y; znFw7vI=qX7R8iAAJvc}lhg*iM?zvd@X7vOIiTiyozD0+B+CCH`IH2vNB$t7oJ%)6} z_p!CSb@xy5n8|_nrGp{;>L?3YnWx!LgEl;ZnvP*k{psi_5(WmPqqUTo*RCm~ql+kl zFo2E*!^%R!Gz4j{4h2KfQE7;Kflc?YYk zKvLF-B6gk-WF)39-scHIB6jIp4?yd_npvPfkPSDRa0@vF*fz;hODY+;3uqfCmq-EOhdd6=*!`Gko!!RAszLYIhpSf&@uYPCqHv zS&`Fomh8SH#_O?DLp3%EQll?Kc9uzj^|t-p!fsOm>F=1aYs>S&t`{T;2| z*EZ(d2tqeiJE#e~V&BBey76VU@-3Y>6^%1jG8$Z?!fG-{GByr?@7`*iJ%Zi7(Q4Zh zB89sPWkLFK;z_9tkDxNFcCG=yY(j8UNBDDv_Jriwt2Ty{C<&x8cGB?59)^`Oq|Y&?L_uIgSZ%9s6ZHksbjS*#c;}(@RmX zWOKRoyqNuNa9)^kuVma<=5_q8AP}GF0jI(|c{j9hN9MJVT#K&(jzIHx@)B)sqhId# z53xsx@jcENeZyg~m)c9AZ6rrIyk%x%&16~$*UHdzgn306wb$4Ul2I|+Ex{VDYTW2Qi{fFT9GQJT+=k5`Ez)mDuc7FXs?cFqv`NV2-|4X5LNdEhN z@t1OSDr@6j{>qtLi79LgjRIl>qzBUgxi8 z0>{WRtxzZ0G!cH!A&0QEp3ZXv_L2Z(g#zRYow&F2T48(-_i0eSume~ikw?v~q**V# zTrNIiqDf(s6#;~Adk8M#w;mS0?FqiE@ZMcxe*SacgL-5UYC7|vyxwnf{E0mJZhfZy z7)-Dg3M4lUdJ<)4j+@lhky~__=kf3#u|z6rUDGDClt5K|N>%Pu!R;14a-!dh8QdF>P!~$$v^dYxLRUjFez;}>&A9&~+3-?H%D#VGy?KjY zlJ-8!ej{N&&HiVrLk3b=KA_w>B3~wZ5fB{jvCLkgGo~CzinM;12iM{UT%^pV1m5h=3Xr6U1_H4{ntkewO-gY4XhBN<4 zV~eeAz;u1vOtS4Y`;GF~lik}>XG8R$NQO}7G&0%xVP>~Mj&t`b{V`)o;lAkfs?z3` zYHHSShjSi&pWm3eenP5!ns_ruhChN3?9BYeV56Kn*eKs)6lPjmZYU@K^LUKchAeVd zQSiy}Eg3Sa_2cu{@eQ)-HGd*}`gWjDtWD_r#l*=Io!i0u+0h2N4>4qb1A~-xVJ$AtQt_M}U$+lO$_1%^_dtx5@&OeDI6>y_GE~Y;} z$ReM{45hl8^$lpzbVn2t#&+kIqvXgNu)bB4!8^(*?sJ2T^62T_BA-*R$m32mihr$Y zP8_ATAJChtD+N8iadf;->WBAzN5T90)Y%+y2Jf5bl3>dUtlCBH4=|4MWfEvED%YpD z7^;5O6ZdZK=L$V^zwCeE&@OU6$CrNIZtTGaLw576$;`oFx29GcTtgfE)d_#=IprHx z9P|$MhD^gT@lgFGxseq_2DWvO%CI~)^W-7adrGY#thS=)&w{ISXPxK1X{$2^i%~ZqvIJ+W!-sU$cTrcH*mqeu}tbmvw$UQlbMi?RZ=-~Rocd@|7-hnQtFx|xlXB4;u~DqLJSTeMn|bUS`1T zG37fS!vVlwsuK9IduQ?B3R~ez+4w~uHb&I6!7OVv1;h%g@17!1>xETp9?$ABhB6Kb zMTk-c5D70=f-Hq#;Iu*fbRW!eKUgZLzT|$4WxT$w08jr$?{a+O{ia{9NPOH2(XXL9 z@zsJpAl-rV2YTw6vg(*H+xt20oIzvnK15P<8gohAl6CVjq<==Stj_vf9vb__x)b+I_Qw% zw?j`h668?F`7K;Ao&Ee70-85eAFyB3$uu2l<}uVEKHOQZ*68z*HMOsQbtQepQ(0iZ zOpygDrNzPwW4p8 zBrP6rzV-qA=q)RN88a0$eb8wb&JQMUvY_H0+Y!4yRpGd$3NV}#0KhLk2HebwUiq!j z+0PF~Yof4d=bwFfN%4wX-REKcp58ft-tzlV{BAYW6pwC1w^NlZ6JS%Ldso=2kwe}z ztcF*LO|`2%L>-(fq5Ibe_i|w!hqF<^_~Dhh05NxY2-2EDP=W&Iv_wtbc?R8_M{$dn z%FI2L+=Gf1c0iPq46z$=Fu$4%wX&g|%xSWuo{m|ADWa!v#q6t?5k|lZoG=}(- zbbdiguH$+Hd>Ea`?|I<%b(is?kLQ@`uWfX0(wjdF-t1gkM^v(c2i>{I0a}59_3(&t zPMVxRc4<{vA~%&3`-)NmeVd0758F@vOK~v(YF?}RUA&y$a{kZs_a`XN?=M$^ z`?jbEqN~y0q9f_$A&*W_QG*ZBcq3V?i#N6C>0MT`tG9` zwj|sYIU~4P6OxetcAv)40^>B9LRRAe=be*KKX!<`_P&ppR4VV}+Zh3Y*2)DH-RsQz z1saVwRhgIc5%6r+(Y-%to{8L?aU_xuA_8MQ582LBOeOrPIMn1=<`ujTuG7ov8E)Y3 zDm6fZbG{3H@?Eo4Q4pQqBT^?Tv4U`TNXu1Q=dX0Yv0~~sa{BIe-i1OGG6;{>aqKD4 z_tHxGtme%eydTZ`=N>W80cYdbg27F$${%?qO^^fG2>4zX&KtvYwT33tyNMWaEPN+H zcIL24W>2*;Z-%&eVwmA4$rDF55e`sWzw9lJFd{m*x$nr+>4@`bd?H&;YM1>CDGEd` zaS`o$CK0~5wOOP+JwrP-1pJp21`p`s50ynevi@hmPqE|ciq!L15aS0&JqWM5W{-o_OF zHoRD3HSDHf&dkzbINGsa6aO?U8Qog-VFhu6W7%nNv?JRU_zPC-ZAUE0y9}Oa=36RzPd$HBk29AHS@t~- zs)=nbd{5hJgODsl`LNy6;EWBmwD$0Y!a{{f8)FgZ^Yh$xgPEtv`S3EhVboUcbW;+V z4UeU?C1sm|IeAIyI%llYLr@91uG}JVb>cLiS<$ezYgMS?-5Tu^d z$VbZmGXD6nR(2|Z>1(`9nhjO2ayu_STJ{N^{hhny;`Z)o_M@-p_)TUOqhefQFMeQe z-2MWgBWsAS2yJ_e=@zxU*t_ws#G0zP6t^&k zCj5q6R(n>v^N9sw7qi-vnl3J+%#<}ni1q}>61No#HJMIMr4thA;|PFh`}w%d4sE1Z z4a?>J3{?5&T<+?R4P5Edc`?7zd;i5>X$oDqH?wp6_pBUY#Ki0YPm7jVhvg$2V_G+V z3F_UhzH#tlK52v*07=^~U;>_gxVKqOz>k9aRORkVvWp+Uh<_+%?qf;YZ*;z2dZez= z&b$M&FQ%Dk!)3{P61I@6puf=i_=SHE4i`Q%E&I?b_25-2z@#A@U58dcI5>R3AP0+x z#wo)7CsNV9t(Duofjdv~H_wP}K!`^-r;2QP4B2e09t+u=*g0PCLmE|(3^!PD z@SB9ftyP_t_#PxPEL>Y>0OpX~!Q5HMCaDHyEuUm9L+dqp3L1uMbq#>zbo&J>Yc{VD zxetPR=f@^|i#V@rt=ZhQ8|;ZJL%5d6QdaVT*`TK|R+gwbvlvpuD!=d~^uefY9lg!& z*R+drme$s+>2oKE)aJH(*l|Av6msqv{N2Zqq~C}qbg#h(IPRSXc@BK;XX&iG-jzwkmsaZP`Z6`Vbr_hRGz6J4HxdK=q|IoWTiARgBUMcx z3GwDrs!mFsU9vev-V}lJo#&B?dARf3zDEsJ6{&2=M$XxdrRM3`sm-NzYK|(tr4+Gk zBZ2OzjiXX$$2Sj4@#`q`$t}b5>nJ)axur0b%D{XCe97*XK|#DwAby|_#Fzo`(){H0 zp+CG=2wplgASb(9^H3K8?Y9_ZS{w!RKLi2!1%nN|k0F&E9KSyBAf;rpM)OhZ!C%qW zWx?+aRR;b%zV)I|E-;URbiaw2Ng?Y0d+_J!?}Xtbl!NB`do=)?a(C_f5)2y*o; zyqhKkTl2pMf1WK>jt2VC z@Y|1HpBw0y{hsM~Glx*JCz)|dZss15At?z^xnx-?OBPc0)1#DcWZ5y)`ec_HrR-1j zr0mhRJRNIwZXsw5d7qT~T$2B;~$& zj$Ljr(p0j>{OzqLuVsI}i^B6nMwQ7|p`iqcxUFRMzO!h7Wj}Q__jx4BUnj4V3im0B zE&BatIz!gzdWHXINgzFIP4cY9^zl!pkAFVM;|iW_OCSFN$LKb0dg-lhPT3z$*mS=5JT9x z1=HmAp)(5ckq)&eAC|)qQX9GjA43*N1?H25`J{)}r-yH#VBTrEnusnk4MP?^6})me zZ-lMkJ1qN}(msUcA@e>AfNxeRi@BJsrkwS*WH;B9R&9gu7jN&$yjaZb*9V8(d|uTj zNw8Dquk1C?5D884Z>F&~DO{{`9|5iWUj8~ZOiY}eH+hZAcXH8FrZLp{QT@ml%U(zJ zbny0J_deb$nEP@b6yXygtC+0#U76ORC(IKK(>To@`GPgP)q9VO~}*qw-8Ylim7EjLc#W-l_JS7sy>UfN-vK{6%9h4?VI|FAUQgqYSy|;wSR( zLu;nmH@+~+Ko#Fr#w*HP4&QMlVyp)(kP3g@xTa6_08*Dn@yp_gGI{3zt z(3;fm7fP++`6V%J^iAuarkw0F0^QbdVZMB)9%?yQ3Gd_ZtsefThCn{qyLtQ@RXgUOg zMT^kp%g)?5EIoWHEVr0lIf7l;cesw2i5y_h+%jzR>uk;9&i*eB_JV0Pr1NC@_kV^b z@UXYxtDo`tyGAbA$i^QC05L@yN2Q1F99~ZXe#{!p-!xU+;yke@H(Qpr0`X^fTtY>F0my1K!x~7 z8TqBWKG{uh-gy?z+x(j3fo_W?V5JQr&+B#$tJh4dcRbR<(oXdpF(Y_lTv-Q z6(RwWvKk|%G&}d6AB0^?VsGOyh-17-1>`>eZtdX%sK=zy2;8<-M3}ZTH@FQugItWWsaYk`(F= zshZbsjz{YSk|jrkwNcOaO< zB`JDU3yD$()450npn@Z09OuWK{5WOE&55ed=*++$IH@k#u;(K2?O|Li|NUe`=S8XF zahxGlu*?yQHxJ_su*YGXs=_#BFNPCwhAg_)Rn|lrcMWa57Ca9vy3D-@SoKFs0O`GJ1qT4x^Vh%pVO=f-6;q3OAE?!c*QfE@+o-xTBl z(6HPQ0{cdRT?K0gcF0wb-zdnd;PT95v1deE^rLvBy}LaS% z^N;aM+kb#x)7$?I{EiXW!Y{B76YTGaUt$g_^QAZjAh-~}M!zIr{VFsPBg9#erw}Y`zF;kT2%Vmj1lz(bSNh?)B!$2t2(36jwpT>f)|FJvugimp`1D3sA%qB1Z!nMk!-qClBTnCk2zDe8mVG+0#Xg3xEx&pO<^9Ww|J|AqApx++}X_QBS-Abw-T-g}QB^8WF0MR8S;QqsCXSn9y7~SH|tQy_ZDB!O)T%iwmwCSITajUvXAu{M$UKsfpg zn2k~~6hB$1cy`i@@|H@^g5g&yEu$8M_GDrl7pKeCq+-l2dQMcI8d#R#EWhT(e8=-Q#!oJQ6;Uk}xcP}vo;pV1)Z zCZNA-kW{W@Vlc?zi{EPy3Kn5q_6Ff{J1=ZRbyFMrEY`Z4pv(tf;H@vA#<9T6UNtJk zwMmRrHI(Vx%}CxnxXZ*YMQ;(zjfL@_-u-)u`BeT9$0z|8Tz84D)j8)1;Q0U8d+)HQ zmZo2H28N{Ipnzf~2Lpl_Kv5VObkIRD=ZKgC;vi9u-QcUMa;+>dREdrX!^ zounEg5E=j_eQQA_fk1HhifH0gG)ND9Tb2X2Ig8e`10pof!GQ|mK*kVkzrs;>ywc94 zthR`zMduu8(iiHVxYrNIL;HB3en=Km4sf|iZV3qJmy^UU9dc6YhQR(#7rL-BI*>B} z=k6YYKtVxC?3yA(EyF8nNhwz$pv=}$h@bRidodQJ&q|Ys520dWqm!mXaA%Jw5ds@Q-Kdap7s0-r=njT|wWR5v%_tj{NUE{dc9gQPKJBDlf!qa-3 zrP0B6FV4wVpX2s&!98g47KZD z=s>3cP#tPK`Wf`7E!k0sMnn(8O%?%mF>A)BCo(WPf))ZPkwpTcDaCK(K|GO|;`vfo zrnHZ*6fc7-hZl~dbL~^OnWHyF80fxRtP6mJY2Z=PKHw1jn>Ii}7l9L2=#iSo$Iz)E ziK9*R^}+r_a>GQUMiG~Vz!*xxUI`9kSEO+HS_0bO&*l4Hx5pNcNKEaa3&Ui_K;DuEE1gxJGOshaf5Hl2PGk zO0hJ#7g!P8!s>v|ZD>YqhVR4p@6Gt{)UoM1_R8YBvN<{t2a&XngOKGCQ!|*)D1xIe zb^s999CSPO#tDkedx}- zY{L^&82w0=&{8B#*5ZpGgg~!00ic&Q#F0Eg*pMX3Hv$iu;n5vX7=)k&7%LM?|C`$) zx&4aC=@a`9&j8*R?6eMP!CZ#XtW-IZwZsf2{J7$)Y5{1%s~sQ&RG9gSo&Mm2p~{Dd zZ=jWxGR*YlR^gIg?8Vp)`H)K%RAp*YCQKAaVl=eGAL(Iafu1)6z0vRn$DM#7*x(GJ z^z#ScF!&wBNe^*AvN>YIS-dNBGUzB=ABVqpYL$jyUmSn`TH7xV$4YSC1ZM=W#~U45 znp7Fz)GtlKbuygG=yDl`nzD!d;H=2-5&NE~V8PuHD?Z`occY>A?=PtNlXWFs96e%O3Vrs~=Avhxo3lBDY z&t<2~!q87?`Z3oH%!Fa`vvf`X+D2Ur`mDu}hLr+o(kwjS6DLC=q#Z6|eD2~lm0cDG z{vA7-UA)07KMK7CaFQhi*GE^@^K^$eaScBJ7uzOWXg1@*(&B zDfj+?Jbj_|$u#fLCrmS*nP^_(q>^r~TLOU5VKa(r%YjjV-*xpP6YuMCouV!yE8ASC z4YkzM73gv_c>r<>!Y~p8U9Sr1Q(g#d2{zuDoS77@0Ku zjZFM9Ecr^Dm0UaC4S1`de{zJ?e+U6hG&$N(Css|`tcfK+=uzro)3}Os!pREvo0uV* z$q(%3_k@QpUu`>-@)l14;8Cn zs7FKY02+L|2;6HhcIR}J%>bh=KY&KrE;4a8R05S_L=+aRuVAb+cDH1z$qazuqZ+4h zVL2*5aS>5qQ4G)k!kHHVt~&=uBmvc{!O_G~Ur>$Z#1+_>gCLUBq$32xYY|b{K3Q6p zU1=Tx{~?ceC?D8xSr85^y;A&5K!diE62NOhLH{QT|8QS{WDp9dsn9KUOCThp(#v3> z7?w2X|zG6JfZR9nFQ%AWj*2IvCq$yfcb+IKJl>h^Ev8^=e zDSN<~vn)JtjAOXP1jZ^ix;ud;i6JMcN92h7@H`dM1n~4!9B`gj4@m;ym7=JWozY|P z90X_)`V4vwKz-3?43&{3<3D_kq|ab3!wyys9biR<+-`4t?ouD0X^RGw)(~Bc5j~kW zJ2@EWqn)L53V@AV^IrT?I%f?Y18+#@je%g-`a?F}uR%mH`-wmq^$qtWOT#g<1pjE> zqKEqBVEYDDsFn1jbpWOkm@i0YeMKf<=^$`)fYD)T9TO3n0|(60!H_{Z**3MIDUHKn zdAio(%f*4XkLeOpz$YH%6j#Ym6>llw#!F$a0VG-DrB%Yz0HZHFSE>w#YfP;Sfqd$0 zPu5ioihOTTO$ARGOc`N9n1IyGz^DKL#K;X>z-Qc`VHk-x$lZUFK8VsEX^f1 zWTxXQ{q#$G`R`LNOJr*8xcA0iNs&DEj;RsVJaJ-LqOn6xwfMvmKrQm9{--oO3`E(+-WRijhTD} zmx%|U70rn=an6e{)m+6MaB5%UIcd@}P!F@s2D&ifoe5RYm=4iiCXm4Cy0C5P*Nju- zr;X`>IVw1ERAFMf3@(+mTvpOU5_8QB*&GXEc*7Co^}Brl_l?M;hs0shlackXABv5i zxj2{{R9~9Z8=Vb%yOOVjNSEXU`D**uh_k>#Xt??sLCIeCPHMIS0cnD|TtvHU<}q5cM2{t{%1J7N-MhaOx3 zJDGwQT+R(XU_s*auH0~t12D36DTwLi;v5=&TxnqOqI7aL5CNDQg_iTcfCEH8@|EdT z!!)-_#XFxRU3DtXf#CMVQ1u41MJH~A3$&mF!XRM8HMZn%A;SAb1P)&iGs}#Z*&x>p z37GV&=6ioO+@Ks;<6!~F3 z;e{naZ1iL4^{<+M4C-tzp}zR8AnD-?+Qfi1jBdQ&CQy*ne_xK~ndDJXovjd3a`t6~ zdXl9`1!qp;958QsRvCLU=FjKCU=4+~FrhZ)$>BKO4%1BFTZObWR_Na99SIk)zruUG zCD(s=qw+6n?~oMk=${k2)r)M1xuw}5FJ)kQxU@|=IT+C7=x;YJ%?=wsnTfi8R+-rm z4980CK+9tZj59CbPETY<$GGBqDYcFLK|+PL{yhXlKkN&kdjpJ>aXuB(V8QC2p}z}e z$8rID{6nZ4yFyrp;#}%=_$j&VEt~VlZX`>7-r7sCj(i&SzzfG z_Kq|AJHRosECbsQu&{nJ6Z`M;Q|_)bg|;d>3<#><=}+Xltv^p8j%kXoDm1l_5C=pV zW0iVmLzB0-vD#Ur9V0=w1 zI-oTp&_5x#!yJuO*hc^ox9@8uGd$`V5J_x^?s^{|!+ zT&J?uzX>M?G>mE<7_*F(q5VQEUZ;CTam)?J1&vj3knR_$aZd?Y;t%`ARx~~NF=0zJ zygkDb1c$o~H?cn650ropO=cP*D}~k!mjaan6k~34cCnoGbDQONWfzOm43J;m9Cl@uIuI)u4``# zKMF{p--*#zoLhJr_O->x6>pfB*KC5)x$zucFY2Ws5{}ZOVYv_n^$a6PTu2XvksdkC zmKm8skd#!6E)?d--8zecCM$K*#M0U1luUXE=PT_OD8y%tkLTbc(n13KD7*`NEy8u( z#YwQQZ9~eSzE~QQCZB}GhUwBuO$l`{?mpWnajPdXtOadQMb?}kksVeo3w`uC-yd)zB^O3F-Bgh!TyxL@16XY^@=^F1)g_n!6~U0B zE~zU`vI8chF(P#jfMF&cS5aN!i&q7$3u0#-0O0-;XNKX+1}&zrRgKq$(u6HOo?c=9 zh(l(|z@pgNsLX9tCS13RDnjR9$(sYZ!fPYeuXE(OA!2#pU<`lgMzT3IT1w~cgUyoY zM+n0<4$pvc&2wXSLp z_n0QvK?vlOfiGg6P|FWaRLh-iTs3KW!K(R+s(IR&69{7qSI0grMAK4fT_l8j#!xLI zG(VJRjETUu2UWreIqRkqXLLc|>ZS~Q7F!o3EITJw0SA^35tSmx;;(A5+IG|NTTYQyi0u7cF&IvS#5RzZdGx{TKu&VJ69{9235oplk zfs0SY%ADagUb&ex7y11pBC`>Rseej2kX&c82EoxYXjFZ0KL2O`W5mU1))0wVF={d48z~ZSK!^I zwf^8;sL1G|jCXToIg;S|3S+J@r#X07IzOEFzO;WD&^t6)hV!ghwsk|A%|^I9*DZLK8PCmO6QI)QxQ4!BlKBT8}*}yH0ohy z(j#shCry&*MnCF^@P}e%iIU26LV)cC6Ueg$>Kqg5`qH_T(7?Zw4Nbx1 zE0bvo)|WP;K|xxQ&P?v*5DfJlLeDSC)6bkq{$WV0Hm1!*^DH3 z9$Z=iRgRZa?O?k7k7Oz0@aLU9Nix%huLlpMNpH&F-?xd1oCJSzOWdQMlrH9k|p{j za@-h3a*fty5-5#sG22AJeOKs|mSTN?CkCr@%%i1qrt+D@V4|!qo{kP`O;{39e&wz2 z5688J51{IwA1WWmhdcOyR^W$OWGFKDpzENDd{rT}%hXbV4%v*_Z!xPB`6zz{P69E| zP$Y_GAqRDFSlm#IWIa&P5iB#Xu`mjJXP5M#fWFXG73SZOt= zG;$|i_6utg6Z&!pxuLU8s7jp`mcjy~ouNIX4nfDra0&(FUryxLk;o&2$mKl7Isq@- zx^1w-H(^Rd^BFb=F0~icVR`>Ho+B}ba` z3C5#=e5Sw6;Dq@V7|$kzVe-G3pVux$OQ=o?tr3YUW?`^O011?)Jn+&Fb3=ZAOz_IiH{Zf=XVBt8 zt5R%!pKtn|F*=O$VU#!x&{9euPfXtp9Vunm`C_gK_C@F zS7i^;X@hdqmSToA)7QZ#k$UVdLdT6W0N@n_gBmye2-Sk22pPwOX#$hZhR=DtwUWAH``QfsPA9y1XX7Y^n{Qa) z0~K!Y$O*$`@H$DhjJ%%xM>-e6odWciKb!iM{o5V%4E*mS#vT^@A-)sCf*6l zr*YG#bn&wMJkp(mNKlU!scRPt`{$0FI_l6fscr&^T z|D*QVIPVdxnnC22UPiuf1<9;l2E7O1VFY6ra>mhODK<#_aVsa*;o5kGv5P1vgWb?J z*>F1)vOOZ|VqukbTFH5ZF}ED~nwIK|;C4n2{k{{Wg{rjr zzRlqwEs5;V?0yFFM-`DK*Mwms2re2mHX{c_h-6pDXXBolNG+YrfyA8f;vT)ai-)BwOR?Rfu z!ZuLy^uCy`M`&xf0o9$@4-Wz}zpQ=t>YragpNiND=S+JetN@_14upXr1cxQH5$nP= z5^K}GY0dlk#@8iprP{8Rng?vX=n^@He-RAto;h)AsJ*bu&B%dHxUQY%8~8J>HgX`J zb<*U`RBK)IEf}Im@Q@vpykLI9-sztlC6R9r<4IMFBe|jW z1P1q!?IHag6}fm}i$PdR8t;qS`mj&m3vS3rDwi6knZ=Z^KcQCXeLW1j=8Vl7hd;j&e=J^&7?+GOK)Ss<`~pADhT7%M#yl z**y}|x;Pn;H7RqDBpi479@8#34!pJE#K)AJ++@zM%GBgv*83+?L6||v65mpK^t?P)3kk808OR4lQtz^}y=~6=nybATOL_NZ^ z7K{~TxwEM_st*VKKQEN>N0EkC$TkJuXH~=0&z-`fSiW&%TTtbs^BWLtBjK^J-fX^x zGHq9^Zxv{;Ul+Cfopg+jQfh9Z9aFVsn*6JeWEuKOU$7N8ldjf~6mdLU=7iLc6u!7C zR3C*HsG&H%nKZBAfwPEfDAqO>?*GzG`Ha+zmhdd-q|}&BUy=Bgh$>B5M0v`njZlmE zG7YO>81^fZAI?WdL10X)^H_`J$*@$BQGgaJpd#dce1w$stDGX4Uj{A_)|{mpy+n<| z{4UGkLWg4xg~rt2g3O5JAS5`EVaNe>DW)A_1P(Mf@nE!xNvSnWqh>S=LS(5v$DP;F znJxZFog5N`iH{tZuz2wSLA8v13$^6r2ac2Y|I_A5p%v@D|4xqNCJ@Ucpe!c)%1$SK zTYt((88V_m(~CskI{G+5Bs%4mSTTeY_3PsA#-jy@p;0vtFNkFC z`rad$l*YR(t$BM$(GeIMnUm}H1bYu#y77&&9-!2z++y@~4wk@zhZaL#Fme>=y%QmJ zxx5YfQ7mu7ztgAMd^f^h^&=i^CN|JxpG6u6Nd{s4B^*s469ncuRgxd7n#0dA2kiGy z-x=VAm$7a^WpJtVmlD6D=%&DupNBm73+fl!pLMy=crk7vW%}0vC{QSVCc>kS_$s@@ zjb(Cr8jwz4andl9RG^6y=?ejdfmDKR-!gV-1UK`fV}-tC^7ld-vI#g*s9z1k9@W{M zQqi0qnzmTMIt5MYV&bvZC|`nMX$eV4$ot$72_+z5y#ju@_);MX1#r_ukY49}0^gnk$@aw6_Q^qEa>Thfzn9)QoZJkMZco`!t z(THA1jiuGn^=)620LRW(Red%2x=zNEAw&h~iS*<<3h)wJC}!D67iZ$?K-uv~e21CY z`vz^9Y=hC5`M||l0Jts%p}hjHYVs#kMIpW%O?Z0f@4AqU7>jA=<8r-kr4-&TtvY*P z^L4FR7&-~f$1u-zVRSU+W0Y?|u{tV%4nsIN(JOfI2}<$e^B433hyCUtG@Q|7V693O zh<#p8nmn}uN7!o6wZ+(=lUYpi-)IL9VwQ@)4{@KMn@k5;DKl6Pt~xP1{nEL1l;h-( zCZjER&Q)sCOSgr!`#vu>SJ8 zcoMi&5tyZ_qWFTH2Q^O+L>Zc;z%uCOWOS%#q}t$m0i(m4pJEYKWVkTb=rE0s6y8gsmS;1jB{4Na6Pu4$A!CnfehP=^m!QTR2sQa|yVWNn;j3g=!pRf0WJW zt~h$WuhW$w*Fcvve;)C|bH8@PbOpgR&(LZyBu#ZTeO6(8+hHN$gmWSwg+kZ$7F~ah zqcsk=U>#}%o3$maBmUBbJ)+AlvFCwITXOVZU6`I(ThLW1A}gX1P0xWJy0pn4>dYC;RX2q zfKE!uu}E)p_>MRI%1TJ84FhAFB~T$a&4ot?JQ}7@!}34kSK5141)C4;*mxr_V-le) z(wDauiGIZk`z5enLjprlfQiaHm)66uf6YW?hw~w-_NBnE z1Riqjf@7rMIurB@br$&dLEP)#5(@SUy|#Rr@+r$-ZAbk7=lwXG^(g=rCz3)v*fl(V z>|$f>qxZLi#+Ozds589@O`n081X@>LwIWdt9?V%{eK`PPQ~+hMDzBHrDyt6$L<-k` zO8ZBoBC18!TFL=eC1NL37G_@aW}!LJc6$(y=2oXWLSDkH`?XkmB}70N{^7<*yh~@& z2_?8S0gPAR*Ep=m6zEeyc^v2inWRbaTt-8X5nQdDQe?a^Wq$aEIdL-?{YD!o)DhMs zAf04szQ~O{!fDMKQ3{PRz|rVn_8pIu8OCm zOWH2xclGLFqghYsTg=Gmb5=1$6swsmUkx- z$N{pn5GvNR#Xuma&~$+L0gKb!ZH*3YB_zS5$syotqr;kSL?fG#5Mr84{VNPxj8BY) zt)$Ot%{8$2NZhpYTHj?Fd5!M|e1;1E0hOGj9MXFrLF428As%Jn<}jgcUtPs>lrY&W8;lLY#-~VOzNcSN$VsvFP2_ zNIpJZYo~1|L268H#V?g&Y)C1G4WCZZB&e>iB3?sLv;kDL27lovJPxsP>ESYEp|By? z>q3Q5rhgPjGDuHXOcSn)ezm98%m*S5wVg*djDvn(iqRMEqVsa{4b92qwD^`>iyheM zstRykZmZBLh`nUSYw8^I$t6*Sv_vk%PejTDlnGL5a?4MFZ}jc>qU~%= zxEbg$6fYmt#UawIIc*S&ZbFW3rMo`2|dil8;!xVBc&Nm3dd7!QIeVLq&VgyLi{wDP0s4zSxhxH(`@p#-GDw8{IJ&S3i8+$6BkQI7TZV20WM+VWi#(3` zIR56oGn6v;?<5CH)0d84PWpisAQMj7nK><|9uw!TfVgr(!#^s)jKs_wv1nhBemI(d zDrGMW*uq{;HV$CC2jCGJfp7*2jsJ2PiR*_7UHyEpDK>E*al$uPYZTs}@P>!NroZTs zV__Ap&Za(Rtr;uPMp|n+e>8>0OgoTsE#Z+?)45m^`W@Shom8$gN;ZeV2-w8sL?l1O zUK!90YvHu@o3B3=M!Su5HUoi|(P7U=Xh5x~4On||>njRvMXd=&ZcRpF0X{h;ehm$6 z1KD&DiFw}MPLEpR?JmFZ_PK8;|4-iT2Cn3In_QHZX(M7+{X`I&*+9VBSgv7qEuOEb zD@7O2WIGq-lRkLb@hS(OU0)@do|4xpN#5?2t`g;GAZ zlAy=Y)zF4X_`~jhV@L=bzmm9s7&n>{ALe__79__nr-irg*_kTB?TF z=WL4IB2eEKnNoYdW+ZHL}?jfsZ#H4KE1mnKK=spQa z8GrEWeOj{}fWXB#8p;TV)7b`Q=(k55(PBqfzaac+2@rG$(qQ1XNnxBH1CJIj-w{G) z{V76cGm*vD?8t&pC@|$w8t+jB?yW$h!ZiZ_viY~xtUh2h=TNj%@Vp|}<#jgR_-1sN z&5E%3&RYG9s*c|kI#CaV&Jse^p}uOxfl$h1wsD1+jjKEqnpU>@7SwxmHqVjD=#Ydg zer3<~A7~WY@UieZUmnAU9kR+q#pAt@lTvFo4(d8%j@YJX0H2|0OSI zi52arS23Y<7x#$kY#a$J*X;G*gae7LLjDQ+6;X;|0ApjWe)>WfrOP0zh>`_iZ4(Y| z5}QSak#`Twpc5xMmN&uXO|)N%^Nc(w<;aBeZ|%`47!Gy&kBd zYg)!n#%2h0F%z&HKHc?l)Cn!nzD)VB%u)F=bHppudYBF*3E?_bwpXFuFN`5pDys;zHJs`jaBeXj zbj5ziGN_ip@APMmUJSwV`dO?nC5{vd)e_pD@Kb7SmH;00kr8~jCNHi#ZG4R6P;3{D zYJr!O-ewIecoGG5pT}q2>|2a3nXbKkhiwlRp*EtaEr&yC9|bwl*;ZEs2O$KnLBS zOGTkO_?32tE@weKIqgMji~ev1><_$fUjjnlm5KgvCGH8^WS+-RQHpOBmM3}>{nhFA zT7?7~zAeBlsOe3p%rlJ9?lwkZkh0opO3K|QzejY8#KJV@^kji@jIF9jG_W_d zl}J&aJ+ZIxFBIMx3Pkqk`FrvdCOXQ*{rPUdq1>|jWsL4Quf>Qkx*y`h&3yPbAI{># z34Az&54-VUYd&nkhaP-bnGenR@bfFKoacOagAa4~@DLwv=EJ}Fa26j<;KLz&*o_Zc z^I;P{^x(tFd}z*xp9}f&`S1oG=J4SmKHSWQv-ofV3rqPQ9jY1zrCb>r3C)x%gBC;~ zlkHhdUnnaBnBNYP0kk%9lP!sF1Uxsh7>Yy+b#swwINJiG?QBcO%-qN%%K#Lb&d@Xi z^i2WB20|E8vB=N*t+qUwT`@V*EVB?h;Q$Z^ zNb?e<)!3!w7Cp*@Z6)A{%@ zeAtf<+w);dKJ?+kT6|c64}a>p{NM2513tXShbQ@PHy^Iy!+Cr-oe#(GVLv`>&xbAf z(1(SFl~%Zi@YfH`!G5;oE{`C(3O^xUc>n*y|94V=iIp;_M^--1+IavU+VWu;kl!9n zBqkDb6Lb2@0&|JEC0H*f$1YQqBZZ`rm(K$13{^`7ikFPxy6~9ABneaA67` z3VAwN{m!?-Vvg|r0>4@!y#IeKbRXYL86t7XnmL6I95ZID%4y)JQDdV9s-m4nM~@yGJITpw{P4-qE!;=NdGne4 z0UsOvFDb^38r)w<aHt2kDzR=q~eTD6^=U0nZr-#MuNYk&X8^>K6e@bvPoQ@37yp9a2u4gDK6ZqhU$ zuvzn<7XR1kP`2PQP0Jp|J1!g!+;F<+UG)}QyzLr4EYR*+T2;O2(&dtxv#mZjoXQxf zi~kyxyl3CtA43gSKdnt|H@f@n(CGOKj@@r_X8-jWiFG5I9&rsDJ8tC(&uxni_8(Zj zewF2>?j1T#S#6;iza&^zX!B*#6SD?>y{Ekx-Z`$e^SReIduBb8R&3rkH{8Fgv58MZ zADjvnIl2BOM-l`)f00nuDpVfUx{V^dZ98Q|`wo#EJ9X~TwOjWdJ$nrt6g4<{$k1WK zM~oabdd%3Eak1l7aTDSvPMQqI4W&)+zk?D=6N&2k`nZpeb{~Z!Z@->?eHPItQ3(C{ z?U(S|TbUPAtZSN>n3^D@f2I zDl?^SzG!^v3RQ-F>8&qce~Q01THmF^WaH%nb&TqFk0txhyz|^xJ9<%-zCG<%jXki% zB4=E)Id#__?-DdilOH@I|Jm`+E-8)YPH=o|k$F;Exx+E#xtP^;SN}EBv{8#7P4>vs zJs!qRFkbPz+4bxY>@?thBX3|i6Tb#YN)}FgLkgrw z14N>SH+28(7$XwRuaoCDFWOY3_VkN%+GQ>}^|n`?lvdS5HHRb?%i+Yp)%lj^*TILa z)qzJ^e{;32dgR?%_ca3!4>Hy(a`!&GDicMppD;cPUWA3P=nePV)ZyDk`u{@%<9qsF z2&>0G>1>uechTCXi|$|WtZ}%-^9SF(8_wH*O4+tc)Ul-JB_SK8E=c;EIl5Dojpxp^ z`H~fW;%3J}k7Gi(D8xJYNYR$P$6oe)KYVVxlSew-yD|N8mtpRq{TC=xwijG}S;Ow3 z`OM~aKPS9gE6SM^eKja5@#^VY@vZHh>%NmIq&DT9h8Y*M)voC(B0r`uWj6r91k;9rj-TGNrI-R|mt!0p0eu{?hSXV*QMvoA!-!I%W|Pt2|M8U5|^_ zZKZL8ZHLS=cm7uJmtU{ChugZjN^LBsKOfa3eB+hAyMGM1VKX9qXa4<=n^V3%_d0eg za&KIpa+;r}dt*FRrfTDkX8AXpPpr2^`O0qW?Yn!->v^SIU()vOk^A;?L&IUa8_&*J zkN(`%{$}i{87t#P?pWJ;>({g9&%5=0mSL>X_PcMlu#hj6M@#l@aT2>0eY0%dHET=Y ztZSClf0SR_G{SeqMWg>lb&f;e^~-hE*Sx=}dF=5~=QfmIy(4Ykj4nd>q|=;mkF5^# zMPhVEiGiT)2t8kpxls^}G`DVETO&YK`+7UIXyN25ieaz)V|>U|A^iTE?VBLL6UYDgqqy|CoWAlWfAO#hLYhC*3-3ZG z^k+dM;Crcv8C;MFHfgY*10TBZA>WHdJ^6RCjMC4*1)@oO0fYDg?(zlD0uB8fd4BH7 zEIcC7=xSViW*shUfVB$xy&KDgP6xTLBAj&7&+iTwwlZ=BjK3{m@ds~V(8kZ}ACBkl z|HY(<$gG7ki+`L8FHrcskaTC^ne%g5xcBlC7EW3d!!q`c>B2HzU*R;v{M_`a4D->t z2UvC%i2|&PNo^2qT7IJ{h4(jI^rmoT@TO1-`#&2$n!*CNs{1GmDW|JN89O)Fe2Kz= zf&Oo(fSJQ?pCHViq+0JJ%%jUaA5NGncD{EY%y%8SHNy$vr$OhIG(xz(>PCmI2$xPB zyF-I8@Nc_}2MF^ksYeY%##Y<@uHOb3-#%7##U5b(c<|ob&uG+RPG<*h2Ii}iCws33 z<~=s!JRvauRQJ?@M_w?cT`>)DYXx7JKQli{Mnb>I&uQen3wqNO&g|s-CZYv4b)Vl`FA-%0phn&&l*i_(#&M} zThINw)~+zsbg|KU-?(Px64rR-&A72vJC?UniK&V6&#>+d z)AwK65pv?vtAX?GZy09cS=*)6t`6HklK)43A$+c7=QMb(&6uW4i6ANawKr_rma!@+ z^+W#T;5Mdd4W0G1y*nL9+uFkXVABd+M<+S)aD09<_%N6;AODSl>iqNKb1m#QUJe;E zTx@;@HG{;X4Q zS+KucFB6Hje7tsTK>N(d7pb47&ohsS{oFXunXtrw3#OwF(Kk+^+B=YttV#r z$bOzZ`O%gaN20E~d$lVu28Hr;nS^67)66yn)|%D6?ocT_(v-q=EpV7mQmaz&*&0aM1M}+=8cbvM8ZX(6fSdeQS&u`)cXtZ+!*0 zsIJExeKSLY=9sJq*=<%d`|j@SjO7h?UwLJCF*0~!#ip3ruwU+Q-`TBJG;hwg$6ts{ zsg-@aa;?2bDvd}BA11(^srGTy+hvMoy^^%^<@a@S!;8{y|2QnEANY7vpQB6PjuhY= zr~34;D?codZ?}1(ko9M$^z6~ia{iv1c@7Cv1h{J5c6U7d&(eS%o15JbnPsGmTQs0) zQ;Wyz0;)S~*zeYBsWAR5TlLQG^6u+R`Sx8%NGBM)t@o`S7CWiQiAVwN?6X?st_*W( z`tz^q7uro+vG_`hmX$B=pBA&AMZoUt+-+x#9bE-DpKtLsZj1|Q z%=61~pttIYYf!Hy=FKQTTM( zdoH#(FTkA-tJ{5+p>89duU3m5^}N#LnC$+c8@V}+^$ooQjq3f0l4VB*?)2XtJ7UoO zoH=U}&DC$5y1yxRdc32L=k`Mr1UP^G$MYX~bpP!qzzy`uuovGx)o}c+q8?3mjZ96n z>fd449QP_6PUV_h`}A_40QWv@P36z`IyU6_biK&7Uj7$(E$3IBCBcFn#KF56Q7**vJS^R*qygRZImK|`kraGkFF zD4Ef&t(f|t(y~caX-69Un)l!IS}rEq8VE z-e9r&=PYxd=bqLAT=>1`8$10ysR7@Qc8Z4S-|kuQ(JJ?a(%d3$%t`@nSGm@M=j-Y> z=oBeiRq|=WuKi8xCmvHjvtIoA(vVY`D_RI}8#~W$U)krW58vN*LqqJcdD2STI^%j? zj6B}@wE%abrX;-&4KmOWzyy`TqM4Bi7#FxpC979?%Vzy`~Mt| z1UO~j<$D2zz3cP+{D4T&t!dSutk6L{-^7W<3!eyZBaS`}oix_DewP30Wgat=4r(uC z$=s^Ty38B@qCxd{FOvkgddB@FK3nzmczJLL8ry|lVI7C{U2gekTwtwc0$jr$XfQK?$oRH37;&t936MN+uzat=4S7@ zo_tblziz1jH_SGy$BT*k>+*8wm}p~3uG_3{X7!v;jXGSc>n6Z`dG<_eyD+J)f7f*d z>sPfrKB-&KmT$MKSSWZ#5xi`Ai<>l20^p2eEzJo14E&RA<K=rIS_O>J@LxptNmZ^uJmq-m*{-Y_(K9* zq-;!<{S#|JNT6zo|WFq5xMT_jb22+x_cw`_TEL-O!qu-f!YM zbT(5~O>e$9wtw&Ip#t2-iw~P`KW0;hm#3Ma-<=iS-D+CNYepP;)uM_3x98M>_HL{7 z-pcrc4hqXjS(7>#H)__sckWc#i1lwfXgDca?AI5aQ&UKI@?XxAsK8#PcJndcW`exAmea zopO7QYOuERVvqLoUbc5NdDwP?09PmTQ%FhBS1(@P=R$pP93=|qdB10&D!H)rSOKnz zEN55sowvQ79ZeqoTCK?o-`uuMrRBS#Urqg3Q?W9vl>j&Kz~8C1`;U6@ z>v^)402g+lf!C5#$2@~~>{@(dX}yb8di4l=ruuBEss1TtP4X}k0q#!Hp8I)ush<4! zb`i+*7~XrZri(}!vOTF&t_AHMxVWaGd~Raa$~v^{)JqR!gYbgih# zCIPO3q0KU7&9R>RICx34LU*}f@BlO0iz{keG=Di&fLkEmFWWk(o2UPb)_$JCiGeAw=*G^r_DStqV~f8i$~Ujx_b>>SY3cyIj?5=nQ0X~`Em8Ks9(vd<9j|> zJl&NUw`9azu>d#F#v=H>?2CtGo~P$ESn^zqeF}2~W?uj0b;PrCUpsMSw2NPs)PDK`H2k<}hUw~bgf zeXr}a(5b34$M{{=j@Mt;%zslkRDgT_<3r0-k2xOvcz#VJ8oXuyp+`0qjy7|vdEebr zfLnXw#OnHwV?FK{Z?&9V(f0aj)##s}=GK>XIH=6*o^sztfLnfk_`BGbeLeVb|GLOy z+_&CWme{6VX|g4*;LU3R&ffjp)ruI75^VW-FYXrD^%@*B~opAEF9bR?9h^lvQY+Dsm z{@ke94wIY(+9ggoQYX5vkl&BaQ~I`#duJ~b;0n@o^2(;q-FbcEmPqvKXU(T4s?QNm zZ;&#zT`B!OsTw$>e7NEsqAfCS_hs=dn*~k%$JBJIW$o;IC zr;%+FU9%zEVwwnW(_r|_eA~+X;OOZ&H7xGj?V9`XR@Y+Fz@U@e6CCAzY720KPsH9F z{L0Ur*PHH%4)uJM_e|F!KD_;?B`@oi6X3@5DtTO^hO>L)%KqE#^;mzesomS!HM?)m~*=6ht$?g4@0B8Eo$o2a#K6I-c zBCgRr=-HNC?O!Bqp$PAs&hr%trO*;#4j&om{ zF5FhntyjR$jU{1mk8@o|2L?CUchNq)0=8dHiJZ^WIqw0$e{o>0b%G zOx<`r_KB$N{NlUC&r9CcK52ELN*#%?{;+z-&_1^JKe>h;`q*G*--}NMzEE0@awrm? zDu2necI#7?0^GhGW>fmk)VuQf?o*K{b#e3d)+T24Hw+6tQ1U^5`#Hq2+4=Cht~VdF zy&l~t{;Bgu?YbrAbxo??8=Rai?{G_i`*h?|PIkkKuDo9SRFtvtX5$X+Oiqqi^5T49 zkCOu2;SoD5_XlOTDzE++FnxQ?XNldHCdCGhHaXlVBR4Ah+a>|dDmQ(m`OpKdy#D-* zxK4I6#iaYqT(4SgRp$$E+Nq9B8}8fUdUkDk^Mm;r&k_gBYTB&%A(Pz&*u+qH(m8mb~x&}^X!8i z`)x2cojy^&=z z!8K({=L!2qo4y!0b!Isy`~Ify%wCx*njUK)z_q+qKC4I3a93V$e<2#^JV={7&-CZ) zi+kRtzo;$1)!06B-m%wxUHulVxcb#3^@VIi6}x)P(@lM@hQxJjA*v|A{it2|P-WT4 zmDlfIfPBs?l^;#-y)9ZMP5fjcz}?ijRJ9Fm?Rr?^cx!ZWkUqoCuPEqB9f|Gjkcs`C z#1;y0K`Xbns=lC^D?bm=i=0>NYyB)rV&CN6q9p~>t_W~n{V#p-`03;79Z;;eZE{0j zkTm3L*4nj_%(4Ai{#fvVZHK0|Og@mh@>Xpi}whJ8H7y6Khv~USSX=2JRnu zA&o2D@<0auND)?mfb#<1d>zifW1-P}h5|$`;7P_45+0NtVgTG&jKUIG9=w7IK z=Pg6NttX7c305`G0a{09%b6xm()N9c|lNsZ}cUv{QZs(|bRc(s^Hz)a= z((rtyOU%akr-H2ezaCgk`FL`7_i`r3rSG>@IXM zRjv+Qu`jnnq5$XpW6Oy6FJoM~I_7;)P13)1p49!zNS#ahsqM=71h2b2R)EWI*mX~@ zTG1~2yzGrg)~BdP#ck!s_}S<-IJE9Bz%6cF{(!t^Z>(vbJ6!RwWQ2OrM)f!vR zT0g1LtO;{E2ymOuKMZ=arK1Z!e|tmhH}Gzbb>V>Ok`1>Om&%vhb_P|&ataqukLu1Z z*M5GJnBkt1pWM%82tv-yKwwx(Lk$C)4~(JOG}bfH?~>?l&+h{ zzN!x^3vjaz=iF3ho4fGy%eNq(?BYMoD|t+6+RU|E+YABj^!Z2Yf{*-g zp7JuU^FBNAyNp*Sx)0Qrvs>Hn!eQOkz}*7e_It+}4j&m!I#0poR{CJnTH0SjFp35q?`;n60 ztN*+a0$c^(YW2NlTz2N?weLmZ*JGtQ3#xSc{&(ZW>lgGE;0n%M-B9sXp0io;xnwit z}>B5To^a((|d8wo)%8S4_B*G>&>@+wyi7WzoUUmFCUlfapvdAA4K90-49l~ zRejKKL;B09jXi|?-tJ0Nwz<98Ib_g+(IvrSKcrTFy>|0Z)0%6NH=T_h+pAQr)#<)# z(~lWzoca0mhdTn}ZgoHNb4?gatvXQ!l?oonKp z+h$+%?>*xBN7-oaJ^FfI-CXL<8XOtnTq^&rrCiJXd(~)XejfixRPZW4Xx2mzrwXal z&u%H$CgeA_@i~(*Tce%#=|VTn9n<#H!1`^ry^S*Sy0mW1{@5{tmJ4tXrI{NnGW$C7 z^ZifgzvlKn>%4F83C`Hodxb`TYpSjFEYQ%^d3z)KgVqrzKRNr1{@K1mcwOV)wF1qy zB$V>0|83>LyEWT8^LBwxqKtFSMUBMu>quN5xc;;rCFHkk{*8aK`?q!uQTTS9U*7L? z;wPUwAKT~o+?Su}`C(eqegfQp`-{9T>~87I+Ydey_c`0H^-T`^l-GY}aijp3lla-{ zf3fx^@Kinjy5|yGzi!E7`O4%x*BBVkQ zijXK}m*3DmeLtV~@ALisevkj}KXttBIWzM-Gw00f+_`gJubB>#iXatjr7oT&ujf=t_I5rQpOqPfv&^5>pUT-@O?pdaWZ4<+Fos%bdriR^|`a_1NN|(GX)ic_G@@6aTCOu51$<>cEj5X+=FAkST zHXmg4H|pw zM7}I@>#ARj@>2fxPZyd+7WZggSGmI={v#JXufKV&6fg5TGG$z43B&GLy%&w7Xz8_sHapRDa=jO3U8su4T?(yC<4yg`!{j(8)#RVv zT_5gco4(?H#7Uz(nZk1IkG~L_8Vtym~b7ac+&xCuo*&h$cUMqeSstD% zXg-2W8E;yJ>fyw4H90=mt|BIGvGH$z!?R)B{7Pal+3nfz*|PJ2tAdZMx7YLtCEwiZ z{)N%RzaQmE^x-nKw)l}L<5H_YcTUaIXz+AQfxxRGo7#3XT@i`HV|&|vax)>R{pwiH zYAmbzSJIb9nY3CZL1o3~|32^ME9i2f!`#S}@vF6sy2a)+UzGTD=R&h6?l#I(kh2Y* zmT@FY^vcInc`C2P3daRqu%5osR4YHt|6}Q|ejJR}3=5jEB2&h>)<6?CjSRK+^{NWi zdZCbzvna1v#wKy@o+we9Bj2GAb`91|rCtEi%us6kkOc@V@<;#D(+t#UUp5R+N z5it~orfcZ5Te`4cmuxImomTyuXMQeXX3>`wEmXUZ2aEr-x_G~L7{<5#m15@foS#P&s-d%v5sO6{DE zvb@y9tJi(Jd-iWXXG)*v#-gk+nKBOd8{|*F=-_GYxp`zVFCI$BdER(o_8o0_@{T3R7?b+0b<849t9~obqFHPcziGslzvDxcaX$fy z{QLWFqaFTFVU75UI8FRa{6Op_b`V>L4a8bv1+j>jPs}D}5L1XJiBZHO!~mi<(Vgf- zv?iJo4Tw5KHKHO>iYQ7X6S;^iL^>jo2#CvspM-COFN6`od%_z+7vVYKDWQSzfN+OU zMkpp+C*%??5;6&CghWCdA&L-A2qyRwd5jGxDU$4}!Y@SpG>@$d0(@jduX{BwK@z8PPSe}KP>ufmt% zOYjBwYxrDzHvR%W1AiKyj8DMF;bZWT_%M73J`nGV_r`nS-SIAXN4zcG3U7ut!5iZB z@w#{|ygFV5zYQ;km&QxtMe)LTGM*RDg=fdJ;2H3=cxpTWkHZ7}Dzb#kBXh_sGL1|k zV!TmygUH9(~fwth{{$x?IxUm9Rnk)|$b<THD)rqNM?5}rdx4N90s2O38k3PWiCHqzoC z56T!QhcF-zvb-V7O#q%t8-e+uge*5#m{)t_oKVI<3G;cwd~OXm5D3$IuWuYfU>eA6 zfHDTkbtoI4jKM=LEa&>hF+5BI&lN*}aX1hT^9I7a-Y`!f%;Vhv)53J#Fg`E_oYw)KKE#aV$Je0LNi`IE)X3587~e&cGNFlpE)yg>oZ)<2)OA8KIBczlCF1NS+hqy>opVABCWE&@Px723oUK~K#J*i7z0>(9pjw$cB8h=B7&{*QXX z2=ztqA9@0h$-!f)aQlyX0^9ZfrYBIh3>o0@f9eU;p-ny6XyXDfUKdJKPyR(e{!KTm zVEdGX>Hd>$#K5?J(Fr%m{EvFk0FMX2wxtav%wq`e8>%0M+OVDF!8lhK*8q7ja2hIj zfB&f`8#-bL?53qaj~`Tsk8F>iozkZBK@<{Qksjr1GsedAnz^v8aEBMx!} zpzc8Cf7GKG7zf+e|E)f4=#m@c+C%Pt(kJ_djkXN+26F8o*DVi9Z9FV1l(2pO)wT7F zc(@PCjOyHf)Hj&-f7G`aSPrNU8+!LY>Ksh-SLa|SZd2zr_2&OU=hpv!(7Cv()%9$+ zGG`gwR^aAVy}C|wXLX&vW_7&|ZqR=nI^=J7gO$YWr9_)Wy*eO2jnp)aA(2?)2C-%R(VsH9lJMDFLadrDwU+e#J z$=>kDjyx6>9dkVPMBK^vgj0!0$tkI)&!nHt$UJxcLe|CXoXb~o^RDJ!zj3pmu&DS} z>Fu)eimK{6HFs<8Kd5{7sG+f``N`9kXRYneU%c#m)z$sF_szS${(%pJL&GDZpU1|( zOiq3MHZ%KU?$`Xn((=mM?{y3o!NZ!<(85YHv%m_&2?*f)1F)tW^@MKv8(#VwPWl@@ z`kS@etlJ+a^FKc38!qM>)%urO{a2kf-OMSK`mZ{rru|E;E}_-Bc8yZ85?Hg1s#R{( z4OZ^nM(rLxs^6$z^W)7Lwzh55@nr|BWmk6(tmm7zu%`V3?>`I<4t*Sk)&2B&qrzV% zCa0#pPJf%3nf?Cb$K20fu;vSkOUuhEt81|O>-YHMr!4M`X#aU6r&HvAJ)qauR+bii z&Hb4D_H}Y%{PU-gk3$~@`rp0necj#F+416eTWibHC(TWb^^YDtxPPy<=1z50MS0on z(vsq$!h)MOu3x*FmwV-MPWGjXSr^Wq%gi{Ne&%#qYHCVyQsSwE_>*yQCt{DsL`O#* zi#!?;5gvBrNN7m#;ln|J0RjGge!hne9`y0{KCpkk*S>w89v<#)Zmupa&U^PdIXXHx z*xT9J+S*uKTUl9JT9})gneEwQYHDI^ynDBik)ff1!LD8U`g(dhckbAstE;1BGs=H}+&;^KsXgM)*eot=%1 zjg^&^g@uI~1|}vZMn*;k80hKg>FDTaVW6R*A;CZm0~Hk&{PjVEE}sNE9uGUU2o44; z3>X*yV8PIM9|D2UCp9o2?BBc@0gxcS6FwmFPWIztG4qY5lq5A9w!Oo&Uf4M1<2yVc~|ONaP>; z_N2Fmu7zxY>pryhy5n1ps0o-GR(O9_01fy|OBx)Kem;nAI zQNsiqyD*xtu?wS#wCtR$5D(}$xY!^b1OIZsXc9ci4x?!{@UZ1b`);@fll(y8&}X@ z9t3*?`pCO(UPpKtJtO{H*ncPd$Mo*dHP9dPUGzHr;v55%vpyTKWc&57&l3S>#LKWs0D{lQ_ceV(rVn`iy^G7{k~ z{2c}0Zy^9*oPm7k{D*-DG0bq2h8t`P8{-x*>VFIWFL^g$Uj7~%l@0Up-xmkcpqk~Hx4Ts;WZ$xYaRv9WC$Jhbc`V+%i zL3dvz7X&s{EmDSd#yB*Za9D@@U7!Mc?j7wRj!LJ6o329V0-(kIj(Qn&l&!5 z@E*?BFMp)ZdK#7I*)%G0W>%jmDl35FK}Pfb8u=TDijTBm-vo(~6S~N5oVPeP@JfH} zQKCpmwIpV|iwUjQ>1h(j!ntb9E28|F@|j)ucWML0Gu<+X%ZY$hD&9`uCYAYE`-3GG z_W3u5pt4$xAC1q^$tT!TcO0GhZHktMjxF9aV*3ME1j#P&BgCT2Y7r?fykBL$57>JOCR_0Yvz9{Jyu_0^2RxD;NLZ-F?*00XuIJcj6Nh zCT#N3&YT=-Y|7JaE9q9zEHZSlwMz~U?y|%6YH7@W6jlCS3A+mxk)UDy%hCdHqL*{D~;NchjW_g0Fp zfqEB(Gvq@07TxiQ{B`2RDY~=lKhWzuexNq$lw&U82wi^Qv05)%Nj%-LG z>vRs#a}M|8)iAw*j*s5?>@H|dk_Cv9qt=V8vtVA=%H#G|dvMrDRw(wg6yP7*wln>> z0Pv=84#`U?S6I9QO2GO~+Pz;gD5s_R0|)t9Cpc@Hu;u}O_0n-0?h-!{3le&U^z5~b zf!%t}IMtyL03TJG<(a67x5AD|U=*EWw)6_G)owNhc!h4eUrEJo7sq(-;JkKWOENe% z(f+1bG7t+0#Yi@R*97dFdNl?l$^mm6t=F>B^mk4# z98Zh)X{)-c(kSOqlx(a(r8`C?E|1BYd={g)TV(cucM4Xl#s8$_!{3-vJNAhLxcFrP zg;TpKd%n2i5|Z$o>5}k8;YX-`mEWoOk$&kXHv3f1-6M}@aAn8#c%T1u2;(?>HsfLd zHCBQ&s_hlFh)bn#4vmK61>WNbV}5mR0;Wf;QO@BCN$!aeXWWuvpW0QfG8|iPnZh!X zheQVZxOAxHA==NaJ=2b!MlvXzsJ*p3>pz94%=%o=w`m~6YOW_Rc`Td>oH8s7} zPpRv>L!Jtwoa_+()ed$uoCgmrXGH9NY?dO6Y`tz3-JTGmqn1p^NKTV^`#*9<5pGa8 z<$ymA;Z&vA$B*v{= zj0|H=4^A`El+nMoGj&yqnwpzRKU{z26L>- zYn|X?Rf3*$L1t^k9p+aCHZHyI4>P*N*}(}N6E`^yLci}WX-Eir9XqRW!)UP! zeU6=Fpj+R%cZfRGscC*tU>y+L&Sh$B^`0*wTxO901NMjew=IS&3QjQ2 zNoK9?zB2uLJ7}eFXqIb#NxO;YcFd`bE*SitN1v-hOz-%Q44v7o`yl&BtD!9`NA@Ga zWpbdx_4oJnPcPx5v?l1c{eG{j*g@f>{oGd)S4Y^>^Rc#qgq^>RavX%ZK$#<#hG%0Y z-OVuhskA)R$X;3}Q&1>f?U+ro_lGmwlGReh_jg>`a#ED}a>mhdBEFTSpTY^_;H_U? zW&<6xw;qIUsS2T?a7-VM>`;YX+L8J+LE2G7aKXaz*G@+^Fgkeiqugm$U>f`fniUbah1g?e; zbAlRT)>kz>0wCvg2MYKxf%u!n9Kw_IV1~jWcJ%c=V-*5RzTIpd3=cnUcJ|;kIxPG6 zaOsKwkg&k>%o(tPY_rfu;?m3@-p{Eoem^5ve{^ z=twI)y<#o_e!u;dyVpe##1$N|;@%?;=qQ{XR{1aj-43woH(&QwnR^!Px47-;6#S7u z2N!FVbv`dn1UKJ1_V9ah1GSge7{wi=fpYb6^qV5V@W>Dm+*xJ--* zGR6ap?>mppOA!O26i&{d@5k5uK|t*2ojou4I{x|>4Pe5j1|szV^_hWRnp*|HtX8Z@ zyOAI`rAHq`+sy$q3r)V=>(BvPDICp~vsW*>M1m6ry1H`BIn-#qB0BTG^EYt=_-50R zpe+vuZjRsBGsg_pXymG^uSo)0pI7Vc`U(Kf#kSd=!*-W*kY$qq@o1v|e(w7p(Eg#m zj>n*)yeCj{IOP^jjsam|>k{j*Uw2>g*EQ{@yx^Odf6Ah(6i}jYyhbi+-kQk-tF0|Z z+=9VhI}tUFK=0BW0KDaKcE*^R0;Zo8<(SrZ;6swezKhTY!kYA!GLs5Gox)kVmvn8S zD-VRra8U);GGwFWQEu`p@9Lxm$675Pr(6>T%~t+;al-cC6Vb`%qopPgUOPs=+7bug zSpR0d>VSr1>v}a17(8-huL8$k`##=z?w_7!jNm}`P3fgGao`+A_8KOz8nCDAcak`z z2d*6Un*QW_73fho2d3Q=ZY4hh&XHb*ubTV~(ehBe?hG!pwgo!}rz1!|s=`7vPEoVB0Hx|5a-ZU_{}xeaJOFSn&=_aqGo48U+3AhmY*N(4IZw3fjHilw7X7 z4A%7QTaZXrpg-^>MOy#0uee<I=a)4m^eAo$afiTm;QfLcy8*WN0AQ2X+ipyiVhU`64GC5LmxtgnK@3Og2z^QduX zy;9U^HGED`1JBiu??s@(T#+EJHv>jm zq1!?teP#sh&u=C5nx9;Y27?WxyKGG=pz&HY2itW7h`KaaiGDf_7EjTppJ4R^ySE%XtgJx|5-dJHQVpm94DOFo zFT%ysJt!Q-O0}OK?x|sXir=rwetw>ha?%Opv&GN3Fb)>1%=P(2;A{ndj6j?b5JChW zT^)4=c|i>_?&&-jI0gS^`?0_wGbQOxn996`pkhD12$XX&oh~B0xd{ZeA7%=BSO9p~ z5B2D!3u0Wguh3of%mkT}Dw1C#bTGaYPESf}g4zBk3@7!^Q9q7iJCwtaOl_- z*0}!#|0>{qZb9Z6bHcn}xLND@Lm5*joG?I!Ki-2VoEmnMnWrWLo_nB)V>Za2mv;^`ghWO>yDC8oRluzq(j3vDw*!BwOyRQ%>LCgB6a@+?}~H zpxCdpaJ4QT$PeD4I!|j3DhwqhO5V0%k|`W9{onX1MICJR_<8nkm*-kgPFuud$3rs3 z7`C(+df$8BF~w^UQQaP+7}C`rQ!Fn{!JY5cJt-+V;0%Qm-1w4us@n@&(Q!6;mkiS_ zl;dIEF?+k@4d#Rj(5l#gx~?Iti#uXI#*6_6Km) zsm=E6dHG?1NK6Yh_sfe}_K;tJD987O3TybD5|Gwz`+7;07YrJGPI1B8L7w+9bhplXXUi#p?|#L6 zR-a8V>7_efm}IDf^EWT$9CDP0{gFQ$tEuGSu|O3Z$lr#nu{vs@98Y(_{f*+EFw4Ii ztW{rSg8bKuep|=FfX{RlT%j=;3@q;6Z`7TEEuwHVOcm#co<-n7zu2bHzPKWaa-^4C zo(o}iVP#xJpN(3a#wLu3a@Ca1U|b(Xlo_5_1zrNbE6-}kg4-01(d8`*Y_j)o1e`#x z!ss3rlymvmE=S2|7Mz<=N<`x82vFz4m}aMZ2fR9AW54Ge3DaOz*~V@wh^wM-mdtK* zeE7MJE0?3|ZED5-`OyK}VI!uL^#R-$8@1RPPk4lF>bA7r6C?*N`>o3Sj8OoL1_>DR zIz4PHg%ewOu9^0L7xK}m_rAf>hpx?w4>>KZW|KUH1WZh~zHgPyHL(Aaj>o}nH^eO^ zp-be(2h4C5z5U|M8{9(*$Kadx@2Zj##PjI&p2C9zcTo=EQJf20D-!2+_PCsDK@kWP zX8rm5T?2S^qd7e0nLY0Op@=d1ydqo^g|pz&#<5#0EDt|z zJ|nnqO~n`G{F40eV~BGBd-%mu9qFPn?N6UQsxL zHcJW1Jzwy@b()XuZ#?6Oazd;5t*7>V!t};eY2J`c!f{8u_ltY>8F5j*Fdb>-k0U2O z|8UM+1=jFSd*&NelxnflC0IWU75!FszyRfh$9>|UHfqOLTq!(SaDWptcC!4TNh%ki z)3wU6{(zh0;)QtlQO^1NvD3x{ zNAO~S+bt%$BSDFCZ;PewF^rvTdO+#XJY0Ltl7_CA0p=5h<7Kf-*OhRQ*d8$_+-#Re zhjLb8>lEnnZ1DwwW&syL-;i^L z@-sWo{%K&RM<@w1N8yye9LrK|ZJ_#bpF>e?Qv5Z_k*@AqgA{q1gQ(es|!WnbDi*FxQ>naW4GtuJ=+ z;NPpK+|yurj*N~zUD6z##yufPNFNmPB7ACbiR-A*#H~>{5iA;g+lY^;X$GBYf@iZ} zPw7v93Ok#xCy(9Iqopo#Ta?Q8_#I2<+d9;8Vp!=bxrZ^$1+mp>%sxyi$|>5Pn6&*>GjZzE_ZIt59P$j8ST|teL$C~4%4xljNqvg}@c1$- zBSZ?P3v=>v{rx3UPLoZ$|Ga!C%29hGJUe8Tj;q$zRj66=pte6A`or{DG)mAEHj-YMF zD(UdfwNGsXnAM23emSo{$({vFXn6wFTMCMFX|tL}#k1Pv_Mn_n*?_pk?m<$YNN>y2 z-Sd3LYLM(FTkD#_-F#=5TU1oJ-0;pWIL8vcN{A1`IOV0b8;UnTyBUmpmdyCB)N zH-UCY4&`*2wZ&=}*MUnN;_ijC*RV3~XFhDj-at}Z>wC?YAK<8{Jqa-d2{dF1XLM2Q z2%_Ok{}mVatkqGB59LgU+l$>{?WFnOLD+il3!H#uo+*`sDEj9M0j2@hNB}^fH@B)o2h4YO4VB5TZJ|ojCU8)uK!dG-$)UKpeAvq?Q zFeiAQBg#b&LleN!I+eyt<+a;C)`?f0-Z*djeW%-&q-_)q%g0{^UuBOmanvVKC)&il zMmh8KX^gDyN;I_B3Ub;9qv)-Ck|#NjNHd7-{aSKJgc*6;__@G$coCyU;TS6mlrg4e zGwUhesj(`zyN7b*wGN7ljf&DY_`NE&xiUk47dxf#=(jul%{MVLS2h zX;C;1f#%X`^1E2Vi!!jz zZ^zaBRM5L(%TKc3zT(lklEQ3A;oKB`L7-0cVdJND6L=SWJ{sjr*s9lDUOB>gtKLG- zoNb-{lE~wTRhvn=eA_;2>5B)6Z*PU#ddPPn@CE1Qqxe^bAHx^^WcDtHo#ZR}!G};z zMEP!8VksjPw=J9hrQQ%KBV!*G)n}nJIbjk}?)tmvbS8K*XV}V_Eh(IafL#iM1^paU z63?s>n-1BboaAfT)RvKWVm@1A)i_zAzMwJZh2B$g?;u!jmT1a4P!^) zFi8m3OS?{TCe-x0bEzmhZF;c@R(xmM}OhdGExicFpypQig@ z^FAF(F{0T^;qXL-8_eW0a3_BZl%}n+RYy5=*^iH1*b~gw!|?uW?1fdTGXjS>U3-qR zKm5|hskJ+j>zR)0KE8J(T6YRZyIA<@evJb>45jDKuA6_CL^*A=4KDj8T&TlIS`W99 zIXLETljoe3{g~-*xm&S&MzI{zZ8CZ1)6TUYtyioF?Xc-6Z`?4C&7$3S0WFMob`uV_Jo~ zds|0Ezy)($Hp$YTfO0PSjhJOD>l4fzW1KA|v9wNaKJW4#d&^$zc)2mdk&%&pRoJh$ z{{wv}g%hM)JK9)1PA+e=j7xnu`5k>3y~mE}`yTo>Rxx7(Y5N`xhpCL$)=| z9ddbloLO^w{CC`NJUB|>xITWZvwEjS$UORmsE{)89m+XSB%{tvM@2Wh_V~7U96_L1 zsq=BA&IyjxH85Qj*2t&WxyL4O>hb%3)Le{yp2# z9B-h>7Iw#Yr;vRzLA^Kd2$g>AIBD6sR*>e`#7XMV6M`ox9Npj-D&OP|iq8B@s}?3o!2%bZMc{$hz8cAXb_siNf)_HMR2L zkd}Bu_s1$l1O6CPs&Aed5un_8g>S#@bl3-v1*TnQRg2G=1;mW zO%Lt7JfD*lV(ocd z%CPk8Aai$-&M(W?yFhJ)=(c7C8k&m~&iG)3x^A_el!d&#%A5+%VU!bfGo}B2Op(wV zqsTXsTIWPxey>N0JLmaTlk9&z=o;sg^=mm|Y0}Mog~AaIFI5a#PLvtRv=ZasVRb_} z7KQn14|uFNyxp$rp3K)`$QHpI6=B4%y!iIz>OB%a@MbTdq+!TgMujkJW0+ zi445qAI-?HLOBw#Itu9ro9M4|`c{71ZYboKt0o@Q*~Pb`UaCC&bv08@@WoPz=LwR9 z6pjtQP}-T&ZwiiY+&FK)kO5#zV7&wc%&3 z)+7n#AemoGvzNn2K5Y9|EEeflS30}7=Ea=EJVY6{Sx67D&m<@3q{!c5Y@~3!7L*d^ zk2C5lt75Qb+{d6P_n*+k<>JR1)uH_`H={vv>y&`b0=LAC+RI`p7rtli=rC3d$T2y2 zBrBQyDTR|`{^Z%U!NTel{>NIY;+k^GOobT>uW*&F&`Ps^B4>~EFuw`fBdV2J(vZ}SW4KH59pPPR|4&&Ga z*7T&*cG5#f+5ktj$DGbvsJ5%g5%{<&^LI3orlYsLs7R#cdrjdS8niqZ?SumYt8ePr z;@9Oijjtf;R!pXb)lV#_wUBtJI0e@Y;BZM9NyUQE+lTVp=y1U9(!*2PTj06@Sg_fJ z`|kL3xl$#=SQlCLo_?HNiIzutrkr8Y-iR;PXgj^qu?NWK9lHFifk;SvFx&!3@|V4iBPYi1q|(kml0kvS;G^VW^qV;!7KdMn$In9pWg=bb7U zr`DxFyv@xB=-C-$?c+?IX!Xinc4 z?l2~T;Nqp9%Z+hH6$T1J??lxwBis?^M#?>_-rrB zZGsDpY_)vYc?w6wB!9B|)j^lXqWv#U3DY~FoVy1eNjkbn?u@F%bMx8NvVNges%|uh zHxl#R`!RLoHFfLs)0<8jXQBPppYrf^r;;5E0^OV<*oRVPp26Y&KcU5Gtll(8K-)vf zfSa$y6}#3Ogz30uk1_c{jyHa zNuFtWm@RQiRYHVrSl;fIVHvD7<_KVJk}DH{FWsfNg|73S#{m-V zPkWXKRvdNm3VV(5 z$h0Q4zxWl#zT|Vu)||)eVma;=#UA>6=pmct?$;y^N_l4Fqc4>`tq4CZPx4TprZctYO&hi4LDN z1SuTjoB1Xq=6GQ8_T;@xxSTe6eGGXUYxTbY&|3CxSJFuwD825{TBeH!51r*Xzx+VJ z)|FpbvG8TIDCPR3cY#z9pVABc#3vLOH_=p~77vIM6dro?B$a zgC2`cGb88JF^Jz<-6(KO@jdn6pnUn#mPx%?e+YjtsJ5K_CAzj zbF#pzN(=!7+e+EYX0V{6B5CbOCIZxrD@)y@;o8Z^$l^FyFK95dSug!!5yz*m@!)Yq z&VfB0Dy}F8Yg1R2T7d`OEwZa7U*SL$r=x6X8xBM`E<8eDXKpq>TEN>B1Kv%1K&a)V6a+9N zsjsXI;lYW>F84uB0@y|2+(y!-zn+8+i!b%}$lVZ8M>(_yULX8;5dl4wZTKT<1i)VY zz%Y;z1NK#xwMt45fMuxqgT+Av?51$;-@TfanM(lJdlPdPjrS>`oI6iHuf9pc!S#{u zN=M5PKwd0+j}ojG)$Xe3e%J|PDSmU85gK#vp>WC#Bt9885Wu+nn-^o>PRXL2+2gZ< zA1eqz{ppX7K6el>TI18akAMen-0uhHu)z9#8{lcv!~jbQ$F9@&k?Ai2P?33sp>X7XgZ^y^~wkfLQZ62!(ivfmcn84?Oan}CxY@g zO~rGK;l%|wDlL+{EagChmhXIVV!K9jQEO4Z7hKKE{ zV&sXye{I^Gg|>zl!5&4tP*Fm9h_6iV}$+lF{Vco;`0FP>$$jmT-$<0_aXRyO(x?2zcunUw$0M0hWq* z!pk}YzTZ=+6Q?17{S?krK`_v`BGXyM%_M@V3cB-96TETbX^?6zf zr)ux#0)-T4HH^bb`B@7|p5Ch-Z(E1Y1SV zhXzoA_{8f0C+}o@MmhL6)8pK*y*-%W8(4s&W}0s#lx{$0%7gJjn2X18;JI?V4mlGK z-~iUD|9_ zabRsWN0MiO2%ze0aj1rjKn3Dq-OB$lZ_Rq*YeYY}>_DChmw>BzPdSn#okK}ZkI z7Sf;HWB4=+0nW!2PbOy&fCMjfu?! zonfmk6qjG30*VS{ey`p_C+KLb@aRqqIBg`FtpTl9&aRGB)+P}^28Ba&qU5Rc6>4DH zsJN5wElmkp9&(P_77J({5R=5cC+m=BEp3u|nXfeeDvj%=eMs)Kjf372IEz?KL*4TK?zp&71^8s9=)F* ziHiUro5I0&oTSUfkienQ=3!eZ`%5T?Bm2Ar0-vJ;zgypEmQ#Vls~uT9masl2PCmW@ z?b2p=n;7pvJ4V<9Hp@fvYd52cDhcq;iRJsozDP$o#{y4J_N)@YHl@P%Ig=RBne+B& z5By$TbeX(1lR^Z>O+j8Kq3!N93dbqKU+h5$36Ov0A8em{cnakhh>BIbKSBkps?5K; zs}R5;Ra%>)+eqNG7%_N3RH zz*3v_p>sWuOW|x~NluZhpaH8Y)jfj^fi5UVQTk1@L@HbdZ|1_tiCG*-&&jv@os9st ze*5~~NE#615&g)0kP6gOIO{=`DZAd#fVZ-Ep5EhBjwt79Z@p0PZUTU7Lv-(1!U1XH zPmk^&rv@xh^u7mRJJ+EVxcy)Y4QQrtbQ7$34sg%{evEo7siM&m<-E=cb)k+2Kq^pD zX^RaW)GY5XVE3j1omJ~=536xN);fy7Q%M3X6b_HSQPiv*Ehv>VmhC>>Ym9Q3vSptX z8^QaWm@U?P9}9*RIezXK^4oUPfFJX(Tg(&?(4VLoqYek_Iw%~6jMES7@6&?q zyF1dYG$(XXPR8efb%FyCU~}A4_?>Z}P(zY=uN5A&O2mj?k)i>8OSiulE)hXDg~Jj0 z#IzIPIjMn!T!S_h4Xw$+K|*n2V!Iz1Fqa7OQ0Ne9gQ4@Jh(2Sh+?Dy7wl)Q zFAh(JlEB#;&-2ZN31Eq9>Ps{17mrXlN**#9Z6tc|q{h~Ze5w+z$oMC;T|YppX9xSa zPqx?BTp)n-@$@e*r?6m9L3QcCI0+OTmmZv~qy=LX4ka77MOiopUH|Xpi$4KfPpsB& z;O@qMbbj^gDKZbfTuYJZ(&umvfq$Ov`TAtzebYiG#rqzrp~#s>3xkm}j60|V zPr^U9c}&iBK4@b7RP8UPuQf&Bx_qW-iSzQAKrO zT~PG#u|4@j@;Hp=vt&uFt?Cpsl^bl=I`tZvdzXB5_{O*Ax{r-MWIeM**s^Gw z)cYTrRh(9yvD&ME95T5vvjt^2GdZeXX(R>JP^>)S%3rv??F}O+uwN*BYeO+`Dn2&4(oU%A7Of#E1r8W1ZXrd>knNUr{g7!gkky6QOLM5Pz>r^($%F_C2+ zeT)0Or+tqp-Z>)RkGV3v$av$u^)^I8h3zHFL5y}l<~N0cV|>}wgr`0Hb{O3==hCe( z4S}Vfwt@{24{e}c3|u9XqS$(w( zLl>1X0(CnFhCIW(nPjP{#70Cg&-L$66ub$1l}QIrXQvlG(KVE(>t|NJtxDD zad`V)U@CjXvr(d*N>!f=!yps6)2yU?pE9l|^t2K)hH3UUO}QSqGc{C<4@8o(N=J+w!K!hEuRgb_qPK!FxRVP<=-D)B~yBt8-xH<U`1lb6 zx!)oqhcm~)ZH11Lh7)H+?0mO{2$T+im0{y&w+Q01pIx<&O@#M?Qzy9!=e|6SHn-H% zpnA{^sITa#B{SIAV?T>)S-W=uw!xr)GQ-@jKDthIiw`@1=kbmP&Z~2>ua-D)A-|u3 z%5j1D)yKIpxpIvxgz#q2v+HBv=Ucy$oL*EqTYY#4emPoy7v{<8_mO*(s?%Br@;$<{ zX=ZyPynZrBCKTQWcFD|=b9@g>i96}H$*0`~XQD!CIj~lzxNQ0*j%8GV4+NJwtFi}j zLjgwlg4N}qx@LmemmK)b!iztNVX73w)L;4Pac=M>L)J*oBi>uUv{Uyh-uQ0$R?*W` z91%r8U!t+>m)SY21*ziD8p}-(G;|`4S+PP&9{2oOkpFd1++2B*_C-6d+}7Yk_U%^z zjrvq*jb<^IpPpO}yU%4H{X1d#+)RCkzwGYQgC#k@>{puhN?1t%hJ|daOMekq6oyjI zCg1e7Po8H8b<6_9(wWDvl>K`psB*JD8J-8hITA$%CU@Q)I!ynx3);Ku(ii5Gzv#pE zVe9Ta{B;&YeCZQz9FC`UZ(bYCKX3-%d(J&!SKKDqf*t?JA#obWdL6jM9`QVo?d^H( z(Udgc^qX--;rqp&UYA(jlQyY9VA;B%Kvgn8QCI!t@vcPhHulW@qRn|n)dCpAA6iJeKo=KUdFNbM}ra{GX^kf3OgyEghn zoyDPYBC~t8;%p?mBwL`xKY4LafT!+)fldURon6U&a>7fuc_{HAdq)_^3U2%O%8@ag z&q=H`Zcz6akl6?xnLUE8!1Xa)G=ZB8$~ zR>bYr(3^CCaD~fotuyQJcMU_@0+Y-R*OYrIPGy~)rCYHFY0i%w&9^BRteOWTyLIeA zBXuxG^d`#>Z^Dl{(N>q>j*E6$a&PMs)>IqPEN?q#dpz=zxJU%M_JmMAjoS`vZ6QDJ z@WLMeAsW8(at^pI$%}Jr4gD7YckwCw5D7at#2>td^W6qQuB7H!ee#&^pDf1ajhu&D zai{%VITMxEx)R>0hFSxO;A@!}4+?L=s*TT}x>f~{*Uwy~b(E@r;htyAn;nn(QH8y8fnZwBX=A~7OeqWmy ze|j4Ub0Bkd!-n_b<5&i9wG6A7fi*)%nw#GIopRsuq31VDL7O$?uEt)Sm-Oavu_lWt z;OrC48IgwMDwjj;O+Fe)Vo$%oq0O9`2^u4$Nn0`zaS@e~QU1N=9K&L66a=-|f1DaJk-PmM? z_Ip$q-WozIM*yMuvv+zL7Nt6#g@&*><#awY?L%axo#ngtiiSYrsw1boE*!V|<&4)H zi6I0$B6wl!`g50JmnN=?$pH30zSVsGpuC>paQj}!J3UyU);aY=ZudTFN8hI^P!Hbv zE;5m{e!)B*h+bvT)q{L`AH3>hl{R`xW{&iAU9i6@Anj2-tFB}>$u8fl18LTIhOfu3 zb;AesXBX^rpk>TOJx42jCE>kqzM_l{XuSwnxH0^ETsfz# zGOA^*2re!9^sSmnX+s0J%>}(?o~_d@ajsnFxTgUjcA|%#{Av45mtD^aN@zelB^AzO zL*37j*I$+HK39jGeoHd6say1XzC1~1mm18*E9qlJv@&jIa_VYdRRgRf_nWI$9;Lln z$rM7=YOs*M9df10J=|QP(8sD=6<7mn2a2EEeKfIILvo8<6;{KOu_nZ+MJ5{P-G?nI zK#@e9Z+-2-g|N$lwrQKnU~LpENZ!8avVY*CvQ(=K;wj#ItLvL78hE*(myDF*tk=q1 zESl6&&XAgsOH>&ePb}salkK$B3Z5zNMC68KdyJezSaRQIZdnMacqze}^P5MSWGu&3 z;+k**sFdIYJ$G5@-U;8pPZwO`f)s&DDuyway>pD2zLb{XoFY^P46@O?DyMO6Iil`8 zSAa|b1>trB*3;~`XJ36TQGk12x)mNpMzm~x*dQ=8P=KdjPKeQrv#1sCaZS1C$b*X` z&efzHOtp{IY29H8c}Q|667(H>ecztkyQ_9f4)%oX@+-|Rb=Gr=#5A?ZLG_K@>9drF zEy`ymaN?ZhV1E=(Nj&>qZ_Mbyx;(ucY_09*c&tXPe1Fz=;n@No)h2B95=OH zC^~l%#(KB7h9#~AOazMGQY1bJ*IIgSGUI3RvS7q)CD&yjT<&|lajO4vLh4r4%6l2$ zRMW@ZBoBJ+bb*Cqz(NM@G;R4(F$dj9Fn?vOvLg)*g~>0hF5Qdg;YoeFjwHXr476wL zR3zB^AatVQkdlV1X~kI@^wKwxCRsV+H7PKDp85D-E-TsX{IHfyniSlkZAvLxy<4$= zd3RHgPzqEMm*+x!?pT+deABqZ;fM=18 z!QQ+lc}$6q zZTs-OdJ?rb$TBot5oG&{GUrm+tr|h%A@d4U$$LbSHrj(oqo0YvMq;8{bWT9T-BYQ< zmt)01fg_=rNh(N2oWAyYp^X@nMqqR7)Rew)Toto;uPX*r{kmGe9Ayf=Ur-Bl=Msa= zUTe-Vurv29F?7Oe?(8lcD2*mNyao?3ZVkd>*{?$#%yEoe{pGQ1@*U=&bHt&bO z`Rxo~P4Pd>tS1No-Dx8!m*mPRbRBhQh>j58_FwdjpXRkR7?2~3<`)9)l7{^m57|$j z6BTQ-j|)KvHsb27;?s4B`%U#MUj#vEx$}acQu(M}P|!)EBtZz`(pW#XlkT`073-<5 zEC{nZ6%if#F&U>I9ve8URLBRTSM$@j6TywGMQuo9agiwt3 z!AI}$uQ8%SddhPGVB(&fed||9-fQCON{z&0oL>n$59qg9GY9cQ*W(9NZcN1!S8%Ap z4-NQX&*#B z9OJxBj7^h9=ac81Zae{zaU3`<>ZH5&#Vp#=;U{1Kwth-cuV#<$HL;w(d;(}x9(LO2wzwE{b zZ=15(hKwB(6^%;zpK9@eo18>Xz_`ex04(=KP2z=XO_Ed0 zoo?FK^!s7X z1M#faKW*7vkjWz(AdjWy0Uv`wvGZb$%!a2qCBYCk;G3qq z8ySm>D8&fKBouSQITe4-AJS66t^F&hUXk43#BjIy4R@Cgv9a~ijf>pCD%r2<(m`?Z zIziI?RTXZa;LpLEX$yAU8a;?L`p5+@vk4SM2glD?=Vh`bc5s0>_0n{H#m1Me88`8e z3NASN;@=W3M!AFQgC%HzquO12}wTYW6y_a zZ!lL+IGm8?1iKyy=E6Hvb!@EC38Ke2p}JcA{Z+$ZEtvmk_k(~FY6~d_qM6HXM46gl z9rih3zs*F;~z@5to$ zZ>Aq(-;zAH&JG&sr}Wy3>#Z)3yqvRMV26fB(TcuW7oKK3VQ^(GU!6D^3p5?BH|H=dui!40=Pd@>)JKJA5hdn_~zqEv9#Un;ZI* z4T3r^&uGj%xl77&S%LBs8{jL{Cw!on>P%g7ek3`>1|s>rw5N?-c#?zlSNpr!;M`*8 z(%5Ryr>9eDN|?uNV3IS*-kH`lSfWWr-;}|Iqz(A`YAJb~V0+j@(-)D8y?h&KGI`@mrEIU&73o1zJxrhR+sp5r=l|dp|(Nh82E_@psbi z+=$=XXrKQs!wOFqq)94G#B2h&{WPO7tk6N&PIf?c1=exaBM)&|p;noIc(OTJUp}s= z#-y7CCPHwryV>5KzHmyLeQjrfrKexXHg&fj-*ogye*1t0wlI2UbScxvO%Ci!`Epnw z-$dR5bGVa(%XZyw^d<|85t9C}jca@Fcz(Mq#FGWm9w)T5`yE&rn5C55H9_LuV}!5x z5iP1Eskz(>qhf*dTq_H=`#q`0WKJ6AKV=3RDnjdvM#CxaB5`=AmKlWd+1$&>Yy4$C zn50PNG6VM=f2~WZ?JFoW_U)H?&x%rMLJ!qj6S)+S^r&FmyIGnmwI6`DD^w$u97&*v{PfghP& z^DpIg880KwO@>cMJinYtn_+9FE$jZXMzB=9L#1YIIDH=$<{@IGB>4>hk&RARZG` zF2CrA%4V%2QhQ2PbHE6ZZt@YwoE=mN~D_@oz2aNYi=T}*$`}mVNYD-g(L)HWGmkm*`D=iA- z+Iho{1Gj2ek)@JDZv2;AK5;)p|6`$b&5`oVe11Lc>k;AO;52`3z@O#&FQ05)^sfU3 z=#6}aoorCFvXP7JuldXX&)z364~fx>QqNu3?;l_QGL6?8s;C^{XxH~*PF)OOon0jT zN3E`z0jx#+8m#bwkO}QnhY>R+N3&K?D>4((VH@g zg#l2{uRBpZsbw|1t=2GsW&j%Nw^#U$hesh|2t$R#0DFXr-t3Or_ik3iKc1hZ2Z!(n z3)@;#BJz7|9ru%8)Cl*sT4E))(~AA z&ZN}h-T;#ti47AR+Ees!rzqj#ajJ(4rUV|sjgs`hOEVL?I)P1<{Sqm3Ly#Ws-$y$z z=|=fmO0}yUqZ?Ng%Q$V+mnBa^2Z>h}P7Y2Cl0K4K4X*q}3k)4e5se_Tv(L);*m#{5?p+b+ zJnv=8s7CNcZ7m$toMM z0kn`(CrMx?&ZzaxMmF`M9WB%`mSo<~KU-ec;I132M+;5kZ5QXpbu0HHCjkM+yv~Z_K=y;-7Kkh^J4`vE1v~ZtZ%!kMz<;{9P6HXr`Eu>$hzeb1& zdvwU%C3-+g3xu6xO4q5{JU(>gacPXxKzza?|4<)Y?Ty2V`h@p1@TFB#8SnUU5t=VU z@q5n@-6a)#0!(wlnf1pMm68oKAi_wod_Bxypu<2_X`+$_{EE+(88WU+xI9Vg)woFm z?13Z~zTDiIwPOj$!bze5iz}>!V>3S_@bVsw#a^WWYodylz8Zq{XUE$Uw;X9eT#MqF z8=;2MopGfs`SUc;SXgNODbeleX=2ra z*fPsWEHg7TiW+)v-+OIx+rf@XGN&VPiV9W-zuC4aVxFZ;Qt$YWQ^7O2?=M4eo37@4 z-!)Pkq5_IbIIp+oBkwWD^hlF-Q^8B$<2Lb0=^Fz%_w(nUP=PqhVn-VFK$xWY-0I+C zDkKeHnM)icnf#d=jALUp6_j`VB5@DYCCy-pdR9|G1#2ooO0S}L96lJT+2mwX0b`fs zM6(&;OfJdE&77N5FfFWg`9Np%eGQhlpgw{MK0bQdyGq*nvt{yYd&@N{h}144dZ0$e z?Np<+zT!y*_j-)5im6d0_9n!vFEDhL-d^|huXq9W&zP-fnu1pV2%uwrr(S)(z7^WkfhAkD{?_~6`a zN#4=E^7<7@;1mkkg!Ms2T8vDE1zw9I0Ze1#jH~CBnnB*=+8H^iapZ_I} zu`Wu$jeh7Tcjb8JzA1(5WHTiYUfBN`R_MXWu|@eg@Bt;SxIqc{r9TC@e;Pb0%Xtydc%2f?z0tdB zX-IPWruVw*gD6S}eOAM}_I%}I?6r#RU*VKs!ZQ-yQbm#06e=aX7eooG4uZYWd&coM zpTyx+x>CYO!_1jq?_{6f)zl0ka7J{}Ox)tJPt6u@DfSD9SW?1S>0=FgE!2-{=i?*E z^(ohZ1CG^ouIOpD&{?7W6wSP(mr{)O53L6ZQTw-3eU*N|5A| zY+f-8^cP`y{WOh}5=qfpW!@5Bvi2?L9*YMHC1i%5%$a!p@S!7(R$e(lF*!2#0+pFTBbMz81 z*d+>ZXp>LLFe`gPku`xYF-`$X7V~S0>=S|3_+P$18liwKN&QllXvGYTj#CRy-cW#= zut&h@A&$J#g-JKh4hl&7_Hjs-WC)+ykbjk|nF6MUUiVBos!QvZA%)Rb|_93XnGIwahOv787A!ye^$j0Ukzb)O1GfCF4P_^Wtt%K%3rFTBVaAWq_xQ zyz+L+f1E%p=; zpGjd~BmOjA>b3gpc{>XDlJ-y@Noko9^!|}UrWplb(G2@1A4x=>5n%C>(4v6QW@nON zBGe81Yt*TUsuW?G!@!&@D$f#P{4klr3S-50gb}K^XK{xrg9wiXP8kGQ1m=w<%{<21jgX1d+ zsqYorJIEorqrBqskn7L8vq4nCE#y#LDt&Xc>ybe+hwZh4$K)_U9K<*_u{yL|k;B_KW9m`GLiwtixt}ZL)5A z?{g{TTSZCnsXs^*A%}Bpp!4+5B^*zAY3G^{IXH!#RXF2i#d=JBW6y?{94sE2tPEbV z`u4WISBagD9LNr5HiQM+GlqgRI4LQ}LA=P*F&wXqfr&RX6$hUj&USgBrm{b~k>fL_ z0xmg}AAcD&9~*X>41X>K_Q_!FL#tEgX_fm?MpMT~H^^YxML-^{5rli~MOcp9M>6>6 zV{*_e)BmPY`bm`9G#OMTGM7I2mfPv>zu0?bf(#;sMQs8uns4wDBn0as96U0M}2BBo&RnukP zvqRYWtSEqE%ZCi^B<(!&v=u04%DCM{=S>C;Tl1`%h9jG*DeASoj%0x0+{EfCbxd@9 z_CKazM+QP>8?&^8szX65Y!!C4WMGI$aK96IGW>$J^{#+985qmll>?EY|=Dom#bMotxfy%WCDcADu^SmO?`qf%w5QG|I7WY@qI6eR9+hs%-apYJ{ zz+p0j=#7)fcxSoEfMRAP@>cK8$?bCq=9ierKrU`fZJXe=1Vw$$%$?(8aQ3<<-<-ov zkZdmZa3cj7^iy%Jy%95^KeoFNbr($rMPiY9k0~CheQTVZGsPzZg-3GVKhu2boFnS) zP5ea)nFgN)-{k7T};1pgq$+KXJOV>W`3J#IN63;z{ghp~wApu>!{ti;ePjI9! za~!|HGG3`y-%1L)yDB@et^xzh0csXTO{6fE{86QC@6wye}#CeScL_!pKBjKneoUdMn@jS$#_JZNeP$NI@fOJMh)|_Bi%)tN?We zDWtF162D2v@x9I%-XEMm3bvH;ZM)Y*QOuw?5gSbkLhh$5e>&-iPpZ4oD@2e2U5pv_ z=}Rfrn;#W5Z-lS25{+84WxG2$ z;mD2^lOri$7qa-9lIm(DW<|9f&y&J}m*;%ItWKcNt5B|V3sM;Iy4>tVou^1k&i3`G z9x0G1jJ&hB(-{%8H@lS@x0Fw`SoWh3O>&(;Vz^V78 z+8W<<_F^Ulh6iSG67N}z^!K}yU(%C8B-2*|F&&8yL2R@-C+SFGh~W7{Vy7|YoAr!w zHz`RWR_%NeUDtaeTg`978ziLAvAl1-?tWo=q|u7U)Vtl#Nxrq#GJy%sdLw7Ra4oq+rjygO#-YZh%D9UMnZJL zhMC`{lEB&HztVE1#Z<8=k|vizNT6{!!i1T{zW6hYIT`qpK-Z?;2h^FLS4es2iYPou z;6zp;!B468{R~&!DGMA(AX89NdEr*d*O7Apd2g*r;9k9XX->a2=K|{@hbjp;#N|1kKTRR6lHa{pB2NNaqmgx1?48k*2DzWE z%aDMXc|^S4*_1h|u+WfJED4NNFt^jmwWSOzb$DGsvh>-1T@9X;y{>osj+W$oArh#2 z>smJT;-r11B;Es2E)obA%sC$P!j_~l)U}lxiQq-bVsHLpsbzG!EyL(>W&D zWs%*xnl|nXB;ZA|B%0pd&9|6-gV-5~vbl4NHRMeo#n-QB_cv73B+!74k;eG;y-uMl ze&I+$0yd|J(>{3k1WC(O3sVy#_XB4v7wfQ(Bgse;e-ILd;?rbk8^%t--|82DP2D4g zFW-rx@4v?DMF+`TH~dZvp-G>3yWafj)F2(oNLnNYCwW=&ueir<6D$$l*+il}SRMUB znbG%^wBo35lYSzGXII$Q)}C%ojP!}-=#CS^oJt7M+iQiFZ*k39;*1f4T-(o#cemIx zq<+)@Fj-(hk5(vYwn2${ab~Pk+<+|2yf@N zC}f%6=FFQq?o5oN5k`kw-pV|2>T<-Bc}HR}t`8;LdNb?4p8Jd2z=jwIQL_$w%vb9A zhxng9K1U3ECvm+Mxv ziJ^CJO31Wq%BPS2X~Dq>n4SWp@{Ue zUEYvKzZkWBogF_hY=rE8E(>+p+ zoLKpl_ko2NDi6Ml4{Wq}7f>Z}yE764gBc=4RJ?t*CCfyKi-8y-aS8?wF$7`wxXSs5 z$a~(gH4IszhU5u1P~4|du2zKhduV?fQr#Lz55J-*QQaD_s7pns`k19ULv>$`WMbgNytlQMhmb^Gu2AZeTNt2vM}FyDV&?f& zfmr#6H!)C2Q*drXT%xa#M&BzS1%v1(n@3%2jASa@Uc(5*VF0x&bJb3xXAhS*dXFp` z12nbUKSY97dkNwuV)i32kaV5&I&(%_w(E}A)c92lR4b?3|M0#wA0jthUl)XdeW^<) zPc6izDMebi<@qD=2V+mtoxF2c4pod@>|8NmZMm&wjkNSw=^0Qq>;4CRxkV>}TYW{Ce@wI`BXOi77fZ1ZM2 zivgQxCvg{se2?dQr~O!rF_5(?L(sx;?*^%r&L*oK1`J_jpM{J!nA$l)9Je2>e%Z{A{228dX-`FXBfknxOty1lK)d(!-O{OFv8CEkPTfe{i)`tcH*&($ zCI?kPb7*Gde%ZOlnK4fjpC__>o98$N5(kBR!}Pwf1YV$joPIhHSHhJ&=&GAJuRdp!sC|S1M&$pr29Wh{zSc0qQT*(jp%!Vje2#3VYYQ-=Xxf0 z;CnO(?M9i??S43Q;7xM;@mn;6cw}D@B2BHz8+rZYbUzy6pU_V+su3}r5hFO8*@Fh9 zQA08A%v zzKA-$bq>!CZs=aQEZg;f)M_*wEmM?56rD$OE z*1B!EH*M7St~yESE*d1Adm~8`dOu58ROY7rI3bMm}_hD{Jy=GdP6Bx?PjpcaWca{2D9Eu8>N)n0N*|T^`@hWe4uaU*%*u-m3GZDZS!|w{Z(Pjo{a9YSVe00FN3Xh-j zMe3u0wWw){2B)RBE|YnNKoWJ1GR_iwRZo>yLt1Z|rddNjNO zy>+sa9sbx~e0qJvXb9)w*EfRQ-UHS_^?N8Z+*vVn9UsRM-d!?zaPt@%c(?5gF7r3E z4p%uJ$3x;o@AESej+gIkcoI3{$RjDmFrN-M^De)bm%va%V>6m$a8=Wyk7 z4);)i%Mh&DuOj)gNhjux4AM7FIjDcs!{=BwscZ6i8wI(2T<>RbD=0f9y&cWAP_Q%7 zc!#CU&aONSSKjU`3PkizIXmp@iOaUk@ELwVfyqf~kI@Q>;g-)g^6KYNFegATlgjnW zM+4gW-c6(6Y+|F-I7uLRhg5V#`xpw!XD%u8;%t`(>}bCW9zj9>-Os!|pEngxedQBq zdXIt)TC|h7^$v)Y0Q z-+7fAFC+1szLc+Sx32W9J~nc^hh)D9U}Pu?S&5J0gW|UB3v8? z&ISehC~=D$GhZV=7~Xo@WsQQRD~l)FHnwzV=cbt*tWe;V$0Yj3vP^GdO4&}|9Pz*G z@wb8&42*r%Q6E%HQP2|J?{>Z*SdracMn2vI1=orNYF1puV{QhFDhC*%KtQ*+dr;Kn z{!9*WBa;CVzmDHCP@wdp@%78rm5bUaXizP|ueYd99UNGpX%t|YZ#s(WtQY6CdlTVHApRq~ zBI$(6SlTvqQ%8xRz^VR%kH90XFC1+R;unxOd@`S^pb?W7mweMpn>hGU@RBAA`}SC- z7Qx+#2QQc^Tx3DPi7+iC#aV~&M~{2j zJ(y6CnJ#{P*1z|{7rwC31v(T&cIqCa1WHu(N1xTmrA404^!678niq9X41Z(Ur9twA zDArKwS_sFUw6>5zQKNw79Nv=rBD$4S11qa4eU=M;B;A*?xVPVc@}F#LcB`^8U!7=L=X2OFKt|sa@iq* z`vKpAKPODuKPxxFFWV#nOhELDCPz;9=Rn#OyG{f`E|$$z(uInh*Oh-RtPw%(#;Kl4 zGaH`~L#x*-%S1pJUR#LyQ09bLdC;ei^n=u*#<~M&P0(M^0Q;l^$9=~ra ziZeyBkH}e-kT09RC@~ykjd+X1v1`vYoZJkzn;XH(*BlHJfo%9~>T#~lS<&1+ake2M zpxVlEQ{=v`7U8_2U(rhhA4`f<;_{n1bT5>LO}-+6#2;sJUef=t%jmPFP(}L8B)PVz z?d=8G28Zd9XGDPNsP>dwlMRvUm253W^2$6t?b~B3c*Ez?w~gY_c0@PAn^T<6ag2{( zuh&Zn>DxsaT+g`S?m}2NR<7Dc1QWs;QR}w!W{2A&#xu=Cu*E_~ZTLcROfsB6a-oq3 zboKa0Qt~x2h<HBG zX1GV*y*1j^S3?AKvW2-V`L-pR#udASi0;8K?oR`8PD_97{S+~;Dk6}kw>vLqE8@X% z>S9b-IT18DzHNP)<#IW`s^R4F10rbCSjG7gC~)I|&6D+VDdNw0=4V-jL7r1(36D>f z5P{7Thr<5y@WM^DLCIhw%b-xi{konOH<72WiyWKp5&>Pa;^%dxvaU?7XgzMEA2L=t zMHTacuP!lOyDSg!uhEaZcZ!=-~VqyD!d7nE?)?pLvjp$G;aQj@>x;9@m zNkKxZdK1x0$XG1!r99`uVHrEjn2z{=zWC#^shrPrRRED4qW57ve@I(*sLqfw8(H}v z5%E8D!JC0+F5imLsHT_%BEb0+nOG7M(V+hAPLom`5j3tPeT~K_fAS2#WS4 z%pdyuf6*e@ta6Md0!FKGJFS%X%Bj|MN3KXBDBZiQ#^I5=>_1)HbSwhNuhq}j)3aG! zc1JiCOLmnAB5N32icWTEsZ z#sNrvDRH!qdNr4=&fC3D+dhcyiO&3^&gaPyIKL)k#=ME3S|%fFTH8aRnVBX`2kG12 zDI-N|s`wx8+YZ=vLj3>f+Rxico|#Eo%$^fS{C`v9{4A_A^ zV-OQZyq0wV@n>ssLJfXGW9)&9(AIe(u+@0Wpj{{-p%ut zc2xa7ZhlG|-1#XZlqBWTE*Jt^R-G@4UHx%I{GPW4?bG{mG^~!T8S{i=zY% zl1IXnh;-Y(3JxwFArTt$J9+!>-0iGv9GpD7C-{X$uwuV+wks*Cs%dIz>lhrF|6lM& zM-BIAgzN~NjhEyJ+#>Q}$>G3bhe5 z=Dyt|iX=fvT*IVub|N|=9F}E-2grL#lFJuYJMSM;853>KV*6zFd+vW${+#b`{Bzzv z_~+b0M~lcEP56UUM~UBTr2jFXL4=Th7bQ;Qa7YpFvHBO<$07>1Ncr-Wl;_{^&eVR) z?*X5ll_#_a#uKCq)F69QvP~n>4FK3G{b`k20LCk(x8LOwf*Vg)HG^<9X!#hD=_imJ zTT|)08WVn6oYP{;<6XMwo!ZOheGZwd=SN;UXT0Z}x^d2(0c}V|Qgk*TG_!E-S(2^~ z);#U?WBxx_K528lwct(oxl(KOh>Bl%ULX6-2W};{?ybnP>ZmUk>?^&FeDonr<>ga@ z?!?%)Q^wMVk-8^ki%PuB)zCiBqO_NEqg!j0 zqOI$Dr%GM}k9^&Jv!jq2GK#OcXoS??bN-C|Y5%tWbB?&9_HP>sWZv&8ja;)o z?R8|0KkfetFa8f~{;RqF9e;27zu*7&8vGv)4l|L@pm>D8+rMl65gPm(U-WP7KX!j( z+yB7k?>WEw3`g_+?ECv#|7|z)Z)^Xt``hL>|NHw*6e}h!At@y-BWrun?vnjw2S+Do z7gslT4^J;|A74NJfWV;O|7fS8s-~`?sdY+QM^{hZz|hF}w8@#Xre@|AmLO^lqJbd# z+x}1aS0Ca3tKvv7Lut2-lDBzxbl?v9onYz9<0v*AEU!*8cyhXge3R=h^%hpW)Bv97Sw65S!oo{;7V*wfJ+M z-)pKJtxHyr z{IUIa6g`^vXJ3l{WF6~&NTLHj-3V!Ac{8D$>XTlE{~inkZtTs-mH$E{R13HAPh=WD!eQF=-iT z4OMkt@NMKb}#5Ay?63F2t z)TE?Tk+X@aX-JDosYpsm$jYc|NU2LmNQ+@LkW)x#{_piAG$d8TB-F%ZRAptb8Y-F^ zG7@U)vg)F$8fp?U8ZzRtSgg2|m>L#~99C3RS`4{B|0*iTWmHv>6&F)c(Ug=?5tYVj zs>^7KN=t~T$jYjSs!2=9%802;Nytcw%F0TMtER`-t!Pi~rXj&B)l>zxaRsI6(Nx zzxbn{6)^u7kEDwHS6TmyS3cqo|Kcwl@#M?@@j8SZ@uGk6IY+$tU;OhUKI|{P`-p%1 z7Y|1leEo0!$o{_rH!=G_Pd0W1Hc{}lb-(0lCl>gxe|P@OYoGn+`6OTX2U9=)gKS6m z$FAVZKfLntKX~B?#UE&#y@82ob2D4b8L||3YgXyq9Q-Op_#of zziJizraPSB^1(0M+rIkBHymr#F23qbz?a}MUSneZU2LW;`V{AD4OkJm#)~OY#&`2ln}n{9xyWG=0(1`YQLX5@_LGP_w&Y&N513%Ol^|% z*qzgR^hUVfch9_iZ6MH*a791sK2|H>ogrs1$K>?>54Teb84iYa9>mN)ZtT7C+}6YH zhZ5ZTSX4SaHga8}S1{9*z1yK|`_wS|iWS~Z4A*9<>Gp>%q7P~!dqd+cT|Cm+8z^e6 zA(5LozC2Bjv6Gcfqk|>~r<;eaPjfiH*|y!d#o_)$6oY)W$letU?`inj67Yy zH6MrZs7y2dlgrxF1oFwPmkCluh71>eQZz}r5E+T@ z=4P_2%*ZRfR9Q@Y2IYET+kf{F0p1FK3gn1agVH`neWqLd2}c6PTJW6JtHeAH*Jtb&qpM zsG%v%H-ZQ6Bnd5XTV_?big8awsTK9HN9nE5;2P##T0G$)T~V04MKe-qb87-nk+QC+!V2sctaXsx+#+tcPDBJ*#HgsKfRRB(MU8-piW(7j$BBv~ zE~DS?f0pjkoeuLn@Ap2}_r2d2uItWy*T3r2UUll6K2`j!uIs>Yh5pSAcdnRx&D4G; zFZ|Qj`_Dd9xqW4)&JTrlUU$|x&+PGD@$%qT)@AqGdS17UKaU;1VAg=D%CEy;)Su#c zI^)W^^S8X$F!$jl&&)~Q|HD<6zq5S8FIC;ve|h7%D?V-a@kyt=p`H221G|I&rlVvm zE6^VB_c-_FGoL=Vd&Vsdi!Q(B#R0#+Tb`XU`i?Vx{^V{~((%1Iq))%=jDg+n*z!TgV`p{MI^Vb`?X}a} z-gm^`ir-(+kp5%e)33j8!!^f!JMf!x)wG{7dVf{0wr=SS=`)9&zW1laH*T2n_VRrr zN9}GKIA-hE@WLB6zBJu8p}%*)U&fr&v*Rpj0;d1&Ob)BFe4B_I3ag;)OjwNF--6?c69#Pqw4nE8*topEJZ z+g(@h{PNds1xxZD*_8EMU2^E&7cV?=-nVCGY&hl0UHz{0PF}SCqOlb_kLb7X+QQfO zT(;pa8FzgD;q-s}v}Ba({nXM<`%*_dx%QLIXWvqJ>7Ad#_;%3V*r_0G;qCU0#x zrSbbOXU}YU_Al*D%zgKP$984(y<^jyf6WNa+|#pZ*UuY99{bC;A8*SV)N|aY{qDHt zimE5Kym!SV&&`;(ZP1}lj_MxxJ*~^V6M9rEdwty-6BitK_MR(0J?oy~lP|B^zxlYG zkESdrntRfFvyXf~bo|6_`K4J~URb}g_f6OSSa-}T%T_)-dB#~|M}GO%%I%@I)0!Hu z9r0!NV9oCjWPJL;N3-)+ojdRHb%6x~I^6j;&&z*%>-HNafA@O%mrJLgY_q#SbM-00>uYUc+2lG;vtp9CQ z(?2_(^yohZJmNp`^HHN8f3b1=$tx~yJbz~1`pmC()h}P`xg$Td+sQLd>D11>!}uD#QQgM`vuPp0oF!!25LtyRJ)rWbA^vNAotm-0$|; zrJLJ-QZ%#U(j!an^R|2Nn|sfzTCSh>)$Xlp7p~gf-t|G~;(Pwx?#>(UU)C+T;>XL= z%C5ZYk;$D8Jo97diPig#f9QU8 zukfvZYoG6@El;n$;{yNgo=flDdHYij>$~p1^~#H<-%;=VX3+AgrH>Z*Cp`bd=|8QS z(|BOsheZ#L_Z@h6*Gsu=$_~y?`Ehj8xzo?;QQ_*{%RfDP%BOp~uNymJ{KAs^>9V9@|%cS?Z*`e@uO> z^S(Q`-+9NSXI}A6;Ta3MJTc~zM*MP7Yx1a9~&#XT|6)S&;@-e8e+J4p-??2qWXRjqSXU!Uy_04THeg3p`L4Njuzjl9W%$8Z*W;}cE8wKU3 z9d+ZkFQ2&jiO(OO?|2)NM%9$aZ6<_fDC+^r=lx%$ncg4FC*DcCFb^8ZvO2?mgYWp#-|G47u`%idm#8>?~Z@X-8)tMjf zeB#10&YE@8jZ>$;d}rrb%ks|uxX+-bx(oBK9XFxtX+7Uu_tmW*T=Da$yC3-Ull>Jh z%{zE|*ndXn?DKEkp0)7i6D}NCvEa}H_Z_Obpzp}{jw(6#-7nvI{`uefUYm1Z0*8?X z-aoMSNcXUP`v*_De)^O)xAk|`J^Gb?)y^^L`SULQ`t9Z8UjDsi+?bndFL$jgn{v;= zP=^bjOS zSG_WKcJ;a?15Z9@LwcL^dtd$Pi>>LME?waHr@5YMX?>S@+b-k%M|O?L_Il7}?~ms7 zw!0a7b{p5HSp1C@pHG?gX5r%uQ;JIGEa<;r=n!wXvb3V8Bdb!L;R7=I zFDNPKepZm&R3nb!4T>-w;Deb~A_Y+WC>J|DC`AGAInv_2oSJ|DC`AGAInv_2o0 z->*N(=!>p}`ESdW4_yau21C&G@bh38x&c15i&7)d znQ#b9L<`>v{ODTvSuh)255EAi(GBodARpZX^Iz1fVzfF!sg9rm?ST(~%Oni!=0NCc z#15YWu1EXfnc!A*HoOWfN7uohgO%tec=%CDJ%rAL8@nmB9xePYP>)vK*&~09Qrppf zxP4Eh_MkoRGaT~w1-c&o4yYW$bHJYuv_lKe0bS7{xDI&H!cCwrT6i>v|M}2)?Nb zp&g427ViCLN~%gW-3)LVc^VJO6?U5r=G9WH)s!h*9G*OJo+L0Ht2zFgoknrd2e(k z{BO_~tu9t-5%8g_;W3wx2HFpo1!yC52)-$s{G)5&PeC@i37*M0BgN=!`14%KB6he> z9%VuM;H$xMbPfCvxCdPakLO^;TC^X|2kX%xcrmDx@bKMWBf1v8w19e$Fz~r^=&R^# zIEe%0zd(E7qd^ne3!e-QqJ8lF;1IeF-pDBwzoF~lyt%YpK5@dUffro|e-C=2RWW@S z^hNvOW#ANaE!+TnXkk@Cy-9d@AQ*=B!3)3$bTzyIWTNZfCNLH)Jff621f2;tgp`_r z7VcKgm_d8tp$n8+C}H41`IazOGbezQAo?2Wp(TS4t^F~gRX}^ z220UR@VEz=)6jl+-zwS{-3U)!%~%pU{KrF#9kg0Qe*l}%*>El307rv6t))HCUN~zV zWtTAU3ebSAgCBdCc0$*~OCRArgsy=PJaK{&DN3;j- z{SsM`Fz|0XC<|J>%-C%p{}LWPeHZPB&V*0f&3sshhOgPfJquj}?|+N2jBbK|dYe9p zR`1Y8UgHQd0a-lQfV-L{wXfJ%h=ZsBsHhcqc7m+vkeUO4~6#jyH zG};5-`W5pVx)y#C^hMXhUxQQ7P4IpHpzS0K{9_Y+7_Gijsx!CimF zGk)M+jLw8l{1<%{?St6+?-u7h*jnmPp?f)6BVY8bi+{w-Nk6Va-TroIC+M5kz~HdRyE zXyMUmnyNti;k&>!VuzmqOVRc43*dTm1NC!o$yW)>I?99-eiirVgUB;qgal$}^XE;LE#f%8RasCm&5tL0Qlq_z`ds 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

q_-{k|Vu1D?Lw#|feKA1$ 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 z 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 K6Z7i6+5Z8e#1}#U diff --git a/redist/x86_64/gmp.lib b/redist/x86_64/gmp.lib deleted file mode 100644 index f21f469c79b8b684fadcdceee3ae3bf8e61c517b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 383348 zcmeI54V+|0Rp@JaXCcNALI@#*5SFln5W_OlGdsHpA%qYy28?_LjFFq3?w;KaGu<=Y zJ)6ynh-mF5kVqGj1dtLF(Se{r%rv>tC7v4(psyl>0c?}$k^4h~BuY0W!C^vqNvAQ@2z4E<^EqGIdetKq3n4s$ypx|b0~YiLGsYOVh-hDeUk5kbE7=`t0W6&iaC_# zQ%RQJEap&FZX-E=kC;PwB&4G}>UAWK{<4@uxnv*7rJG_7<#9KYT=pd~hw}JSNPg&Y zF^BTQFCux;hr}GpQ@%xVCDZ}s8S5lhK{+T_Lm4O)+#{6M6(sHFh&hz*ACVk}^PpUN zHOV^E0j2+SlC2BG9Lfl;5oP;rB-h<8=1`8EL-K4$LwU{{NuCR7D9?v`i1NY?$xp-a zC@+C)L%9L24drEUeJC%7?*ru(pCEbFsbUW07omPAzw}O$U;d7mL%H!nlAB&C=1^Y$ zDUvt9b)mfJnIvy{nV3WQ4Ja4o<`YQXeu-m_zy77m)njd&L~e-`_!U$LV4Y0;dB;fhK|YiPxF(dPQ%LqdQ#4Qxyo}`h4~PcJBfmj%(b=Mba`9Cp zm%LmwP%ixh$qzI|1LX%_P4f6}i3Z9QP$tR~KSc7Bb43H?Y0o2h`e#K0<*L0TS8s|2 z$}|6nqy>7E_KQfma34?(A4hWS<)VSI{!)_u$3z2V3+j(DdLqg8D?|h3x=)iFgL*jq(n- zK9qO9pX6P46AhI2tdP9#sA!=4?mJ0t5u$3q9NInJEgYs$k{!l*i0g}HwSu{}o>Zv4Oc)e(#eDO;pUxMpFxecxb<;x!?`3JaG zlz+T{DOYqJi=aC>Q0Ma4jfz!u6p1=Q7EET`L+W-+h~uU2|U%Qs(!G zT_|_!lN|Rpu?yvRNJqKHc_jBdEOw#X>qe4$e_HH9IrVsw(=HafP)>g~$rn$}?9WlKcFO$5mDR!a!^pNBw9}v4xe&#zQFS|_a zLV5X%NM7+?u?yu@P%g?Z-azt8aPLrF2Rf7+;TV*g;5d}me}d!q;kw?jQq-U0Uj<((fSdDm%T7s`9CA$i}eN%z&%B|1)Ka=Dyo+x&q{N)WKfAtZu3*`&nCb<>T zP`>mUlH1@Op#1#_B>wxF@LisN! z1LeCnN|~SgypS?~vY1D?+Y?ESdySY!IsP`1d+ZbQDEHhXx!28N9_8NOB02SOVjktR z7m%F(NimP|fD=g`c!`)tdC;p#9t`E8oDF57oO6Wa+|P=6l!u>3@`$5i9%b=^B+K(+ z9%bbq$-#9ok8;6#NiMuY%%eQ|9FoTz7V{{NeKX1TL)j>ook{|~!+De^yqM$)xMq|m z!8uT#as|oLUMl8Mp8jc)t4{!kpRN+~DF6I2l7E3T zly96!^37+6d6YZhyFvNZS4jSAMa-jo7w!Yd?zuOU?E0M8jdHh>NRGQg>_#~r@}QjX z4w4gZ7rRmJbtcKZpDcEx+~;{D_kFk6jdH)QkemVeP|kcR$(|R8-6&_hlVtB5VmHb| z&n9_TN9;!VzSodE{1aj~%ECNJ^J1|ZW%*i?6}WzsgHQ&_BhMpw6r2O)(SJ>H$thwt z%B7c)JnnU3H_Bz7C3*abVmHbUJ%QwhUo3W`Jn43lr=Bi$qg;74$un*gyHT!!dxr93 zdr7Lx#cq_=4J7SPi`^(|a9t>e`y|(XQtU?Afa6dGM@hEcDR!fbzCm*2La`g==rNLG zH;dgU&;BaOPo67wqx{rilIOos>_&Ovw@6+L$D+LS8j>4cCw8N}?CT^y5BCz~7j7bX z)n~+Rl-C?j@>)0+<#lj zUoLi|yyHV8zkQO}jq)yF2<1I*C3zoQAIb-wN^%R7iSofOll(zb>_+*+XOn#N17bJI z$BrZU#Fb(<$|qk*@+r7pls`X%<_1@~Cjm>Itq3W!!SG|5~qbsVz-Bzda zQbbijwqw=N!4UrK!4aN9rfm;f{mx)x!_VMo-CV1+xll{Fdevw<%%gQW$L8R=YP%N{ z)T@kI=X=(0(C@aN)eSCvyH~j>GWU2iUhR$jB8`r6bb3dkvyP3@<{8%KQffC}vwL(i zI3<=htW<)Nw=Ns#Y>utOX|>+XSyR{+-XkYZeI2$)?dD6=VJoh~R^4g!Sx48kf?J_9 z@?3z##`b!2O|II>=bwi%ne%L~))nK_E5eTyRQ?!#w#(@XK_6dLvg)<$xy6W6SY)cYeg9nqR`G8~+lFj?UH{$M;a{ zOpehw_}M`r6)A0=;72U8pw8q7pur5NGU;nUwILlMsVVN=3)Q zhlMyDRWf}@HZibdj+Sx_1~DT;qcnN^6JZ8(ohtX0Q-HpMKfDmAlbSg({ zeSOew2IX{(*3DI$$y||a48nqplFE@EgJQH!=GYt#I_tfS)!=vLs&&5A)@rpm>}_RP>-cfMI?l8KI>L8maj~Q(1pR;qxR%!AK zTi5y3#yq5?Je|&3t6c>@wt>~kT>b9RvHX(#vRt*wcPPw(3QDscf^*4ztChLx8XBWB zIYxoy!W>d(a>NZI=5bqg`0QURDX4@&V7WG=g3@~H>s>Ga|ukoij#W{jOOTYU2c;?xx0tD{mwAFT&tyA?V8)Ebvj3IvNpO4 zGR-)s(VY%bg4`jOHn*ko+E#n88t`j$vb4-?&E{QIHu>U)A8BWq%ns+`_9Xfv=WM3qUe(2EFv5wgKF34Y$ll`)wef5z&9 zTk9wIB?lavtj0&tn()Rzn-3T3)+%Um@jz6W^Tj2Y)Q!zS^o?qrJpOQNqthD&O^;Q| zJcqht{22x&$fG&Rx=&ZI!hv6#-Ti!59mPN{S=!ev2Hz`i;UO!Q`POy1L z=__%Poc!i|&Rv$*I5H_tZhgWivrbTX<6hcYPw8}yxDkRZZVR+#I_K`$jFQTs4tHn` zK<)@gB=nB7vv=PdBKGE_sL|Y6fbvuPJPvF_}ve;yYPFC?@5#<%eC6z zp7;qtUQ=raJ9~ghRYz?^v9tC->2waiT99mNw6WO&2Qa*!ZAVRIkRrH~Dw}C9>2q*0 zd8Bi`x|5MkpNV{Vx9$-6v>p_krHU^^s&om_C7AQC597O~b#(N4w>1o$n6}p09Kjhd zgEZsj(_>~7|q?{_j$y=AryE1Lz!qaNKEi1HqZ9J!qRno`$ zn!1)x<^ZD0JnVgd9iXojYBPzfg9maIv*RRu>b&ZNu zLfKnY7%4UyO7#a1AWQC7i-z7NFmb@ zweaV*RXJLn%fAB1psxV>lztj1Ot??e}3d0wPwtI{fYJle$gUOQTy%dakE&}YE* zEcj(;l{^+dgue`W|-l*T<_Y^~W#n-~x1>Lvhk1?6`R4VSP=sgpSA^+zU8r;fyQdnAl`Y(fw4FnBWSy}sAr zs7sA=n4=FK#wI7eQlqyyVZ;R8XZJ@1zmS7UZSt)oN;G<#v%bWYsKllEYh2NKTVgYj zQ|nF6{mb<^jo#+eX9+64U+Zm7eU>n%)|;Hm^)=UOn=f&d%UW-9>Z=LPy{z>%r@Wet zo@d_)lw~I=$RB_4l-VV5slHZPZAx6y*A!f<(c7H*&V@O(-sEi7pIfVKK7C|RVpHoW zC%Og^?M5l{(5wl+!_h})8eKT^3x&_?qr;0~o93!@X;t4FAC+a1&gSsH1}Me0jQ9b@ zyq0QCW%Z^c$k|NfB)yxn?((rr(wm%t*}@BQ??ZI$njPpGK+Fb0lY=0OtEaP=$sx|y z=gk;_yS6oip{r`OzX6vAacOX{{HY)5EczV!_~3GE!RE@hhU}R0_E9K~E1VZImic zyBdRc*j9$ZjvbzmGOlttPcq$q#g1#hYY{Od*&Re#w|iYY&G z5b#cr(&VA>%|xMoVsK1cNy-j-lT+S}MB!eVe?(lgzO7z9`{ld9Lme@9=P8M@7ElTu{iJHZc zKEOmB;R>uSxDGGDDS1_YGts4(lrVRMyDVE~cfJKjS$8Rv9a3cJ!_nd1T41P*PUl!e z!xFaDkjv`*oc?J|M(3Q1`1RJ6X!NE;sfkO}YLyRtj<9tfj*QmH6*&Qv&G7+95xD@a zn#wbi@|>^Go2l2Y%#1oWi!;j(b9CC#m1`ZH2R{XUD|r;^Y>uGilsSwyLQ@aJLge&1 zTZ*1-=U%JU$@6RuVe;t_u!Mo3a1KaisXgBRTEjzi?X(_zoS=?DihBtqhNZ0+Bs{Nq%X@Ob}Pouf3XsOm-6<7iEZkgMK}R+*hd=a~2cWVcr5 z0RP*I|M&4bQ%Wa~Q?^45Wp&c@5jAB>l}TRKQM9@40nF6GxfzS? z3g!<7xuZlX+o&fUqSEvc)zb1hxJe;(&}P{LlXr1cEpJxsO>aOSeyiBRIZ1y0=-Mf- zQ&UtdrOP!*Zn;a|2)?-nsdn=<)8(2ZKY#7@Hr4o!I#IQlD%PghQbAW!C~0l3nk?oX zwO~}_C`GGw z1nFVL;>IdQV%D)H{S8{8*jK)VpX!`OCInY2lymi??CvzNzNn8*s>IS^JYMT!{ z_3d`IhDVv*PYsXqFTy#%yAo{th|I-WYUOdYne6%K_-cEzgM)`#H7Aa9L`UmZ*!j`X zxh44MtXQ`>NJyU$j`C|ug@u!7`juOvN{z0t)wy=tpVjOiXVUGF#C*;5nFO0RjzP(b zavNl+kPb#7vzum1Ms3YCD7DGgtjtvfUxJfjbH^o`pEh1+oD3Q|I-VX5H_|9&9-Pq- z1yrrl)jE)?n^S{h$PN5WFOlf3-UrSHV|AXdGv{vU*6O@B?0Sa>xbY5~?SFc|R8h^;`B}Mt8t1#L1H*1Or*zxpU zx%Fi_MYC%!DKAt}vb5=5_|%Cc-{YtA$dSD$f9aSoQV{;pvAqb~| zr|DlA%x3q~^bt`uQyRpv!ilVKK~_s8;AafS2jw_wlTXLUotuEgX*K2ZS6jdd^%T5* zwTc7H;7|Lfax`KSz1ENw9f?GveXqjH(Y1lMIus zG3=-rr_x9llxLKbN7;{>68#i6cTgf_G}kCU>I-qcA^NrG1gE?(EUYpbJ4K)CPU@Yr zv$_!m&*YI>PiJ(0EAGX)dYu#eZyjF^&MpT{6KT-L#PEmhnqlWs&BX0j5WtQ4jYcO= ztV6uc)oB%_)7wiBomxcpB)Xk>x^rob`*)%GrUsF44#=j+2Z_13n z1nZ_k+0nJrm9JH5S0T>;ds;XHeAYV#nd@+LItTnH-P6b%q?0+u!)<@iat)^0l1iqB z=6g*WbV`Nq$)7O|=~}0A_@{?tT}!mZ@!>{E$HT{<0MbxuFf9nqP8v#uw$YpK4arJn z(xa<~40V@uF{m^&k0vqupKrzwt`B)X;5X-Vcf4BF8ii(oD?s2Tp;Fj%j|U5 zTHEWeCYJOLC3qWxR8zJ`C0&AY59EjFwEB$0F3i|o^Hy`L!BDVP%JOT*Y#|RAxq+N% zEAxQs5kX;eGKXED;Z(^gWu9Qw#+n^pTaz)F@OwuSYQJ}BP=i^?bevj&AkP80{JTL4 znTFHS4}~L=YtZOhwaOME)_CAS!5R;%Qf1IO`RKOcff9LJGoy;I4pRJ*L%?lj zL%C4}0C{?^)UeX-YJaMt*VI{+DJ3oeG%^(HRQ+uP4wuIYS3h=d{~kRAVT2*oEByz*B&Y z@8DnetF2GQGx*2JJ>Di97^f2p)!KI7?bcPk8c$RMjZw*T^l1mu2WgEV)ahM?^n#O# z^i9Rr;Opf{YQEIEZ%k7dm#Og739?X&tmQ|S0M(FrpmE!P34p`v@yPZVDDq|jNDrhY zgFH6+3B*LhhF7?0ACA#s`EXW4Xq<$FqC+|Ac0&^p=-r&&7orc3mC_S~m5I>DKr?7B z15X$v+S?_|i?V}4UqKJu@eQw=Bd^u!O-|*|MVF?XEVoq5y8+`71H2dYN4Uw}IqI&4 z$_vl14ih=SQ`Q|XzuNM$f*js?R9gMj*+lOcr9+9wDikWH0YB12ys5 zPMga6YCM(k1#CU)RM4VErWKo6t#pniK;u*UdUSia{sxlt13Z+ADNuf2P;Ry!Q_ak-bd00oMu z+o&jga|o4y2%guyh2vbklM~!cj3opm%FH&&=C8>IDwz(0vYl?Vdc9oY@8_G8bO;cK z-^O+q?>ro4s@>^@N%Ax*?qpkM|5SC!?s1War@PMSgiV_Ngne!pcJ|#^b97B6_q5u} zsJ+TFdW4=~9%Q za;hKhu%V&T3LJs1Kvk??f5<}HR*ot z*<20EKFTZgH1VC4XOHhJ9);x#d3WVM@YWFL!F%1aEmHS?WpQc8_kaI_CLQlT z-Sq{y5adwa|1q?w@_%|m{pUfB!;6I%{@EiIu2J8U;S=x9Z6GH*`Ghd{-+WJ4-t8b~ z)aNtb6XyFG$l3MzRv<~f@cXz^{cry)-16Or;HQ_r-0JLq-G*#M=_w(g#_s@yh`&4h zXMX|ifBT$!gO_D~OY$xdDemu^zH#>#NDL{BtOI@n_8jm*-eIERp7;@7m`<8K_))zY z0&kX66K6LN^#GKb=cAC_YwnzvMfdkgyevcI@%x#?%L&f+Hi?&0oqUsc*;Ah{;^o}> ze1?}(;HtU2bTltICI)5T_kofdGgv=-S!T{9g?w*_i{P(f#?;0G$7+-GEEam4dy3Rf zvNr92o>e$@dg$?HHXJiC-`e(zY|qYph5ZXFj?XolZPluwhvtanO3umZ7h&zr+0JjI zAufPV+U`WNU4R>KKnsSk?&ACrR4*I|Pg^%WT$uSd1Oix_G zqt!`%4(^ zm>{i7QnRviY8IQ3*E4JF*E0<@YQl~D73bOGx;I=KzO3yzhZOR?Aufc!%J$gDZ@TE{ zIYmi!_A}Ut+pbw-=f^yDoij z;5VFW%XMF6ZLIxSP#XNx5SPNcYk$n+dP5te6OtTpqRg=!nzbnNkNO;C%MZu%!KTU^ zzCKow0ZPYv7C5nHcZ_W|W6f82)W8Z{m>rv|A~`^D}&Q(D-C)eYn1}dcaob z^^iKj&;Iinap&SYi>C+tOq=g)9=#S*L@R!h95Le0C2AMIz%dF)mIn4v9iIACKWf+m<(iay`G`z?sx2yS>0O>ZnG($#D~scBjOXkpughJb(Fz4M(u~0X(+`kIU8eFy><5ZVgx) zpC7GEvcrfcFO(kn6)rm&bHnM810pdr=~n9?BZ9nG#y@|^5M!TlnX9#7jDO;8hP{6H z@Cu0LIQo>$Imn3}7n}10m!K)JIY3EZbEGCo3?pt_X1j~WTVg6ZH#}c2hcVlIt@zZ@tDcJl={Su2z5aAL{vxaX{ml>dOoPQEit zdF>SKdFzf_AvQ27k)(zZQC^7m!I(8_9_LcCm9MqAmuh(J{EEG{DFz#P5I*Vo6+lQZ zDF z49vy)NtCWfvSz)RvB%Q9!_+)j451b=z&L~z>{ur^^O^13eZMjO?+;Y zE=dg|K3r^$c%-F9KD?nhB{qj1b>=-6<`_IuN!2mkyJAF&i+?OG2u96 zXm}(%>7MxtBVt_G5$79r)MKlsgdJ5IztPglRI9bZi5?eU=b+C{wl;_3>qtZblcRJ= zY8dh3vb&NvpsCp$4m$YUFj$Y5tC!5!UCGwQvpJ4B$qyrzycDkhp0%AxR~&v;TdVZ2 z%4#!PhE7L!3|@8~j@gtRv<-1NysLRQ0E=6r5F{@xNfRTsTvk1Z{g$R4Jo6czhKw_I z^R-BfRS)pMLtCSOB{wBW5+l-FJZZ6PNE%$XK@eqYlNh})c&3P~jSrAkCfO-5XD}kp zYx3HMC6Ap^w+%<;>Ju?y&XOIhO$?9JCh6hCoXc9zrb|!8jsT9Y%DzM1jP4E<3~4b@;2E5_YgQ5j#?uWQP%pF0+8d z_ZfCNowZiGf(1F*vcvGN2f8*sJVu+OhZBE}J)v1^wa(S_^t(sL82j($OAljQ)z-$t z$5AKwVZ@-z+EMW^%g>>lTP?=g(SG-k-(pEck{3qQxwKZ|9K%bc;%xca8%Ar@*R}D@ zjnO9QDG_M28um3g8uU<2k9tH$u0Aqj?pWQ!Mzk(T4I=_w#x2CzE;X>H(UeewyED1t z7D&yc9h;UJk>}DEH!w;x|yJNcl9&jEHf0LX9}f@X}jf@51I0t36zD zoUNTy)6Fn~RzXutPFm}A%o06wEZkXEm1X*>GpAtVtJ7Qmxd*pjG zKk!7U{x;2E&ehjp#E)%lJboN?k{?F=xID8)JkaN-ne)6t#xrXO6j_@ZfJmPth!asR zE!de3L9J1>f&TM!SRhrK5Fo8i^23NJ7f)I|!0>~sN~`OJy)le|=F1Snla}jbRgHX# zoT{dKWQ-_tY01PHK1Z+*MJHQ3#A(SSDzY{;2$4QziIx}<=d!9)+}|e%TC(2S^%+|t z#;Q`XM5;zL9O;xKNsQ=oAxWI>le7k#xQz}^6G^H@H6-bjBuR|8bQuK`_cJ7Q4|V&U zA-YDnde@9muytJSmyvgInxUsHLqoZe!Z5Sf-{~giBDV_g%(GulFTsT z%VoxoxQEM3h0m;)n>S}0XJ*X!kx%PVH46Nm9_&g)RZY(LX_mM%`YrY~dG7NG5l7%m z!@*M!cQzbhjp{*?DM^dOi95%w*sMLB;Co||FzlQyN&g*-6o#EGVz7=m$q^&!T;?E( z<0FoyVh*A~C0J1C>XQU9BG6^NkNBRDpp2~$W4@0jrM@kjV1GFA=(ru5wcglqE{EL>_j zv`b{JUJhdgJCdVn6SY@bpR_xS=B$)n3kL$qH8f0T#j*T`$Cf}|u%j2LoRTP(iiv$Q_wAIkbEwv4sK z1dOUt4N5vCNfINTT;?x}|L{rb^`%Y9*D5h)3ld3GqZ*J@LXsm!gt@eC;!cmF(bTnW zrbaPIHYv#xBjQ|IH}UU2OH! zET7MaNf&m+zZ!Nry(4IHri2|;8{h0`Ws)66WO^}ft!C{x>|giT8A^I`wL6UG=&T_o zvNkb2q)zg~iB!iU@3R)E{+ECs^}y0>+b&K_h!~0=TB_ih_}tRv^BGayE`gd(>=6%bsiN#h5uJDWTfL&6m=e0HYFcizI<)EFPBPTHOlaYp-LUz6uOeeLbD>83gQli?bXxX6P&M(W(Yhoxj3{&2Yen3ysp)KQz%0>yGmL2*j zNs<_m>9X&b_)J*>B!|&mZ5!#5)G(sk<$25E3l23HhRKy0#(pqB zjqg@VMUodr{JP9E6Q4J{Y;3kxVMiEPXmp`Q{G~$;Hdwi~S3GL4 zCShYGbxCR%k>^5<_^e9}?6Ey1)PxVAgf^<0u!H#W0Y=2R?EftO!leeBn_Q`3?Ej2} z#EuQBl9q-MS1x^U@fnAiY3YN*gh$QP>;fe%Pt7h+u0BZ+BYs?Vff64N2trGhYum;3 zox@$A6h0H;f{ZwFnVTa%=CdPvUb(WvnVW-cRJ;om(KB(xb3Y@lTzqHo#{oan<~!Hz z0;MP-r#jV!?JtpLY=`V?vhVyyK1bQMUtHfg*aeEvNw;468Ik5PGf;d~Q?uIZgH^|g zrP-3hm>Fnl<8|4sHfeJhG3PQSDn8=VlPx(6n?sEF0~K1Aq=pl1j(5?RwP^DnYHC`; zVe9&;*Uxy}3}e@3r#7C|arH@p81d%P=Mo<_1Pz9xjqUYnG2d2;(dTNJ+V}ujb&?-W zoH^cIY}Urt|G@Cm$E6V2wp)z#S1qWCPYo)Pyl^7SWqkBQhL=tU&CQgoziOG<_~cl1 zk{?EVx%kQAfBXDoYi}5SGO-hw90|?@tHX#a7iz=@9cs|z2)7T=~5`ZlOY^1_K57hm`m!^`SuT6lq)_#O=^lDu#t#$}%A?`d9| zYqYg~#{DP8Sh=o^$Bj`Y+2O>CV|He(-~9n%XR8`r*TM;cxq37wp&^8q-81(rQpop) z+}m63nX78zK%+HDVi>XF;?0QPHNoxIfDfpN4-6`jyf7leWhJn9zu~1j zu8!r)%Z^t9123{BJ~5<9GQ)`m$I-o6Yn9&TGBXYRY+?p#5+9>9G zU1~<-Va~17j{RUF2Wu0dBb7;ZN<3J)hURVZT&?$b>`XyqPjORYaVG6@vdoAFms#rK z-7Yo#?Tsn2I9Qv=;z(u6;w*8Z!evGIyIgkGrp7N`i>U!sk{L#1xY!%IH&U5ohY=+%{c!Qy9y?QGZ@h6Ra(X6=L@jZm!(}AuoencO+Zs-+uRD(H%!Kxd z5gRV;llU#o%V2w4O-~P8*T!p~j566iapJ_q*1SWr)9)Ud5?g~c@tBc{Brl8@aakuN z{+H$jr+=y?nz@ce?RcHkR%L4Afn&8vdKj_dGKwkQ?$9$O)&>~yt&LP9dEvx|OY8JM zH7~vXktyK?YvLIhsYvotBE$H-+t=jrgqtldu&?;kj79bORGWYsrA)EYERkW$4gNQo zo!_+V^u{m)G*_>NF=GN(lzKBjx8x$z33EW3jL7gpJoY_nGbY~VG6RI=$_!&3pIn6; z7#diYoE%GNGUCA{RwI5x6LScrE=^AhrEBAXW0c7jiV+ts?1;Cz>`c$NH)0ZvdmCkv zof0GFcsFlx*_oa(OvEG_!!*hyJDeDCnKSWbkDYwI9EN8s5%K%sN|j`W5hpI=-r`M~ zneNthYkex1p_+Iej#4F=VMK?^*n)VYW(K$1oSv}-QyUK*t4-2VV#OQ}=M4@$cwDZ1 zamK6(V8m~uq$0@+BUW5mDDmr>7kt9tbgYn~ns{bLsZz`=a$>|~h19RP%uL4$DFh^3 zA*FRmYB*8iLe1-4YNp{?zFQR%;y=sR>XOtjBE@B{g!om5nkn&TfEwSQk%}ZQjOcLL zB}?37c%kP~=Ia0Mc$X}&DA5x(tu9FoBQ9LLVDT#+HTm|M7_mJ`O<-pxKVfr`5f5(0 z{>;HSA&!$>)p@aR+&wy$|I-`lKM!&eR)h;$|w?=+P%1cRFA5N6G%Cu-+PXtAm?4uX%ZpGO9L$bE(qcpN4n_yvqm< zkW^bUAFKK-NyZov<-(YFRg$p-Q_GmF*<{8jOOi201iCOLUYTTUWoj9dHJi*BWl1u| zh)oy9#4jWn+ds98$(l`OjItydW5l!f$8m#M^T%G1WNcCXmUHbBo~67m>yP0WntnCJ zRq$`hAETO0hD_y2QpSja7s|xXrzvZqDVs{lWXmE@g#O!I^({|v z`goK2mS;NoCiN}Psm~YnEt~cEOyBYh`2BMGmM`}x>mF&XSDPEnVfW}}z7dKCD3fLF z*oE4N!QX~>BD}kH%&S!lm!F*AYUzANY<($yO8TsE^>ejcNvyK9T=@IJm*wgLQpop) zxB~vxafP)?V$o1P?#5tlDyiJwW5wK$bzCC!y0Ym&|4MC0S0->gNkUh0w69&B%}cdNs# zerLVc$4#YkjW6thYr~iIsV*Ufd~b*=;je4A!kWdFE6S0yU5r@#V(hKY+B4=};u3c7 zFmBhJEmfx~hAdV4JgSf}hbmQ@h$XF062yqKFUB*0XN{m2djwUZtzo`)={^xb=XnHO z91tXH69Yu*BtMK8da*#_r(J$lrpf}T+C%_peUczXe7sm7@gk3)sj@&T^%h8}Q~Vrc z#KDUN5-;@lS(+vvXoYGMTOg%R62ypk7lOnKJc622MG(~{CP?X%1TiArg&^^Km!SR2 z(?pP}O+=8^CkbN2w+lhyc^*Mi)r##;v|?JHB#05mE(D36@(7x$R&0Nw71R18L5z5H z>4}Nwx&$pxRZom+6E$K=o#dxPqn!X7{5yH&=1+S3OqCb3OtpytQu-u8oM?0z&v=eU z&{TOr%Ly+?>yrdA;?ZT!k@yLZAn7-3^k5IAT*q3O^VgP5jbc+|laefPBGbhhJv(M8 zTaK8ctHe<}aZT$}1RdbSrpxH+kGljdO_fJYwTY~dQYZN-k!g-ceaz!$s{Em)gg>P9 zNrFmbnnTd_9zhgG$<-HPwqZ+Do7e;?eUczfWV*CrM_q!NQ`Lr1Z6bh_I>}FoOLHvH zbsj%cWr3Or3#9c)f;e&Mc>(6c@| zyqNPIri|Iqz=^6&h>un$`C&w(%d=<1$l<5zx3jf8jJ-^O9jr+Rj?^WoVZ@!wvuDK6 zqbA?>im_|5q^1U%^!n%(PNcbvRcyJ;bce7qx}UAJVZ?cm8&#Xg;%I%!>a3Jlv(xo} ze<#o0*bE42P8C5|n>vD|K1ooCHFF3W1O%bGJO#04WrMIbbp%O$k|0K`xp+RJ?-G>p zPBBc+C)jcUfts+(!U`k4T%LU;HXLTqTIFhScKocgeg%L;re=bt%!wu!PkG(&G9C{4 zht_(lgKU}Mc*?dmek|-(evq~C@zKg8JB)~O z**#rc>#(yi=v1ry4R9dg*|_l7czjrFuC3RDR7b#$YbBpF0vy%UETpO~OOi20)VUdt zdCl4$p1m5za<)Yg>HhU#E3&L#rv1d8b^m6j@Ad&YHQSO zgJf%?PLDWR@i@BN#XlvUc#h)|cly*T92ly6JN>DzA&*9VauLRFF(MohZw zaW2*zW~xrFb*O@;hT|AD{E~C^lo)%QLu=;ODzrmEYLY5OoVpp$>X@~5t?N={TD5$M zIxT9~nqIqx&zQ0Pk!`0VnoM2O_K6d(jy^Ru}(TTxLQMbK)+jPVPEwL3MvQtf9>brtb*n!bvXpUjk+W_U>=42d8zRys>0!jBizO0Q zdGz!aVI1j51+k)Ou|%duu_dxeNtPHf>(bK~KT^jMcn!I-#O&#BDqx~v542QHT9PJ4 z{JQki#4}u)a6^Xa>ZzF;MTW_yBuQdKvrA7+JUt+3ih63mO6(v>Ws)6E^g5maGHXwh zzS3o<*FVx7jd+ik=oT zl`Tu0v3 zKGKt7rm|&;=_3(Kv5%znNrD)W?cyVeC%Oc|VvuTas(d7;Mv*~s(~>kXV%ufjk@(?= zrhMBrrjI0PiOrExC;4GSv&))BafRWh-Re)tenqk-zVRVdk{L$ax-cVt$Yll=y65Uk zbJoEEAPa%5Aytx@60dfGxA5=ey&0cim|0b0lC90nVYP*2K zx{Sn%$45-jqZM-Hi8E(bBZD=nhe@U+Nn*sU%YHNB@*0wIwoIJ;W-LibkkS#yCL>~9 zERy&^pQBX@^XA*au`QCSQH@2?DJhH8WW=t^{6}$F4N1@xWa}$&W@1Z=BzdWC+)PrE zB}UA;SS9fTbu4A`bGx zNg>}G;sW@qW*VuQcrBXNCG8IE!_YZKCA^htskQR*_v zAuf#w%GVQOjB*%){HDuMC;4GStjn%N;;}A2IDj-g7D&}5vOrp&B#05eE*3~!5)m{t z7D$p3TOg%Q^23N#m({T1F_s^EawR;8CtrRTt6_&DRhz*6Xl;@nMtr(hA91ly4?glM z+rAge|3OZo2b&R86Q66g$cRf9e#E1Fe(-@`)5A~nSTo{h;#18Q8PVvnQc+xF_!$hQ z=y@?iRU5zY(#llZwaAD*mzbe=lwqg4F*uU%Zn2!0A=SjkM(L8<{A^f`xx4&lkGT zQqyTebCv6y4i+`CCIL01OH#v#G#6VV9_dljoEmDHLHE21)POEY4I{c-s1X-<)GSU7 zHNit$he*wYr?xI~V#;No#q$j{t$t^)(Ztp**H((L&*D(k#&4#yGHG!b(d1%r#6h2( zY`NihHxiMcol?3aHH;W?dGe+>psCp$!lO5iR2$oJS3JGMH(QDrPu{GrnP-aQU%Wq&iM&=j2VcU8Cj!RLq#b` zk{FTbvZsew4oHF-_VE022~)Q1A7dSvqRG^%4k(+LWQr4^j(c*m_6)ow!xZl8oNq7g zBIF`8I^NrS)`)33#K6OHv$Z^o70|#(_#|MZ zN?I9CY`QSB=rDurRj#oj9y1tFta=-pl{Gx5N;1QUOqW?>V!<-A*&b~7;Zb+la>JN4 zwmDF>3DD8nBt47>b?J49M;Llw7kF9;B^~8lEf1&H<<`ij$V*9*#E4gysF2uaNa_yP z;E9{?Jg@E6uv=|rY>zlmp|DmyQBi7=Dn>lJ^yS6FL#n{x><%SV*|u_=zP#c_*QypO zlbB?R6Tgn1XMb=`h~s4ca9->icaNe6p8N_d+G zxeerWCm+t=QTg`kd|2M?AbaccExY-?1|Rm-=fiHSd|`WVr~2RinLKakJk3;pdo)^Y zZEpZj_}qb9+dRgzUV<8VIE85mnwsY`;?`xHR(zkKsW%u-$1Joy)x@Vq>5|kiV$@~t z4soufMm@v=_d3hB=f>E(qu+CD6hP!9C0XLcrsMW()*_7$Gc0uvVH=ohJ9baiK-<{# z9;LxQ4S|in3K8|8CO$c+NbaV#jfpaQms)E*g#Ok>asNBm16s2BVR^%-vE0 zZ?cbzf3ajNO9;juiw-z`%jP8{IbuY$%b19Gh|5tA+qit~(R_^oNv0Ta z>=Gps5B8ao?FY6YxpBmp%}*S~jajcVp{K@(RF^gN;w*=n^?_{0vL%PHehA2swFxZ` zDN`2bAR{hao*^Y3a;1ndGYu$$ znuPG6D#;8ZE?rtL@j#cEHP{LmUb%9^YrQJ0O+=1VCfQ-csLQ-Gai+_TvF7>m!05%$6(I?gODp@AlC=$cRIi-nux$WoEIREi=5{ zdIdF!><#LYmWB~^E|x~z-=k(~EKRU_11(K@^+xj`Bi6i7=5CzsFq5-?%$U0YfJA0y zf{kIsk(Xm$W^HWZewG*9*n=LBNe>6lwv~DSf(ZJ+}jlICNRbD(>yjqn=)?Y*D@~ z8f#XW+CD(Jd!aq@s+^2C9$>_&%QNf5$uU#e_ShIt&4iXs;S$*-qffSJjF@$qB_!?@ z5ky95I(lnFOTB~Sr6p-%M6*k84R#5zaXh-e`L=Dm-kPdSeXBOXM`A>`i;pDkY4{m* zx<^~EiOgcV8gx1sf6CP&aeSnpRz6K(V$votBHN{f6DP(@Nu+Y+i4%`B$jBNcaH6yn zO)HG(c3Gh)?%~i>EiJFZqv~Ow#(b?4XN4jx>eV$0QL+h1ju>(65|_xV;Ad&- zY>}!_oh{NyNtPHthGg`PV&QuXct=~jtlr{PMs}MHL9~kIw{E# zBeq>^k+^%r(lptkX1y&!b&?-OG`q}+6nFFZsTP$f$~F?onG=alw60NXicCt9Bt~4j z%p4KBLy|I%7;$EfD2i&FA|Pmj9b!bV%eo>l@6nTQ8^&3|h~(5@lV)Z=BTik`iHKc> znbvsNJKAjG4(DpVQLZB&oOL2mt^7tTPENIC`x$ZT1Mw58E`!Yg?`rS-J-A^YyztMY zz4Om?@=e-1f4M&2vOEdA;q~C&`4`paGkfQs19|QQ@n4f?_c!XeTBKc_N8RcOJosY( z+gNAoBVnEKW!EA-nH2K9A=copp2Ofk6xA?^TbwgV9wW+Kym2vCM;?4zxmq)hH|~%Y zG>TqIk|ajFyX;E?hFJZ=*GGqYYvVTl^mC<%u`i9Tjc1ySGRY1jzFl^P5Z~3U1Krqc zxnb-Kp=wft%>-|p5!EjJfAJkn&9$xeV6`VVa?I7@F#7+dHXb`xo3uHMIChzHB>pR) z2e*jIxy@qCIZ~|18r4BW2}zC^@$6!S#J2;Eni=~&d@B@eh^5GyuqW1jMhv@nKH@($ zJ@6o~KD1!DwqFd-N7ckLJX)8uIVE6Gwec;EqfZjVh*CEX?4j2+$9Gpr&{lAtXAXJ>bmro|KC43$VQzXtS%qFA7opI$H;ejYlx@8KQ)xNHL9xqMx`QI z#Fm#@gVOPxg@uLYGAHgFk9f@5(}MrKhAI4(acsPGl3dLyt&L_6#u5FIee(ysYc`OX1BY|;i731WkCaEeBY3CNh zzmt3Q|5|hZ@%UVcV)#T3QBcX=#-?_$y@Vu3jEM9~yqoc*6Z&b`ufqP<8BV_{)la(( z@}2GEbNW?YKMng|`1EUh(VvA|)Du&^ej4__E~w9E`e}P14|g`v*FBDKhT4Xl@UUnn z5@pMj?!j3rbs649^=gQ#;Xl_()zmKLt1eTLHAeh;f6Us&@O>gv_zXh#xw)v(texh3 z=aX1F%gHy1we#xpMXasV=QFJBfotTl_AmaoAvvqIH#@Cyx7vd8a0->el?@=-XE~WTn7>_nH$J@^IX+Wv7P4yr~mPC6mUQHiI^AF6qq9J%^OkE7nWeK=o+xbbvZ zo0uR{C;8#T)8i<@tc?cW;qfCMza{T)u6BsAo22x^ZH;1(oU|lOj5vB3-4p*1(KJ2Q zNKV_ThiF1CjuAgEYa+$%E;5C1Gu$oGc8o8a{DV`S3pRg)3PE-SCa-%*!xzOB*9R14K)M63%t;x^6Bq3#$a!VRZ{9bFrb9ivRL!-z{4??(Ks%MLtE zBv+fm@NN*1j^9)%RgxJ-#JP;RiZ2;v+VCuzakbt(ywM%XrTf|P!x(ji?v+<7-~NP& zNv0Ul=Q4^R{w84R@L=$)oZB(RD2C!m)~JppN=S0Vh(ec@{II@G^;gtghY3d6+N4tu zaCq6?*SVyS?+t;Ytzm8I0D|d8NqQJj=duz>e9^z(*^q#u4zo5J z^)C!NYvZbq@%&Nm80>YGD?f~<2(NiH@+tC@k}Ppz$}vm$l#RQZ&ExKcHfc6bVlT94 zEq-Dzv}iU@;z=Q9HV?*JxwCmbSL~68Nk99pp&W zCW1)olLT?%%4I&-pX+d`>=_yfU+5DTg$$j-t`SfJlS}{gJ zi4mxmGYYD8DQXrNQRHHC#Gg9UY{-XL=IiJ1S}dwf$d1w`>0!i^%lt3#Nr#@^s0aH} zSLi5bYkL^;zrfCz8if$qgd|6dICC@ZtIt~8=T97tx<^}W=;B_#)XtY9M%)KDa%vQk zah@^byW-ua%hN8Gf zMht;IX^S{9==fO+vlfH?SV&ODc8KR)OH%4>&;)uI@#o?di9dGeskVkybGzE?K~QK4 zM#I1cIW-EKGB+t{i5QXT!jkx-kfr|Au|zehWl1F^St@aA?6uq1f*2V$%m>;$#)+psV(*@`hD)=TlKj9DA~_)x?Y+WCB+NY2=U)$l|$s>eyCC23+r zt;_g__}_IjWo(@|;~&}p0Wm=%=cOb`VnnaY=)U-14M{n-bDYtA%S#fZ2|g1ej$NKq zCVt=NNbaaIzgNptzC3Z}B+1rKAv1xd2`wNe<{j_wF>5`%57e=gv29}e zF|N$?8+>+QAa_);=lyojhjp zeoat&uz5YK&d-$|M%0^X;(?=7NoE*P?=n&%-sdti9s5lqAi;jqN|j`$M723~=Dn7g zjm>R%DEa2#x^ZhYTYJNZYPSbojRM2trzL4(M77J#RpLDkO-Ny`trlbFDxe4|36Epb*-HDZ(z((YwOzh;23R^9!A8vJjYPH%cEy|6`zujtHohF zRaMd>YZK!`>Lfpmcy!@M{Eo{{tJ9exeyBDPKT4hChY@=&-j4Wf!;jo}C|ldZ@phml zJ~gOF^1_HO7jH+rQ}ePq+8T~~{UaHB$P91C)W!qHYE$$aV8oP5bVvM_M^C<<4kIEc z8S(9nQYD#TM3IZd5$`a}3}!+ zWJT2|hDawQIby_^OUotR?r}67Ef?|=v|OZ0GQ)@@m-*4+e;Q`M>~x3lTOGF#XY4OC z=3=b6HS&#*my#rj6Jw6|2cEUL7&iwb<=lcXcDh#-1vZEPO83|gFe1#w3W?t|?5M3U zrpOApHS(>Hmy)zXoLF@KVCVs=#J%mQWEKMS|)>vdY=)?V+4b+W2lIE~7W1$3&l?OytxJLjjjSD(Vl=WIRH8acUh!_32j1k_@ULC-uKQe=2TK>?Ve*~c8sbs#k57lJ zMOF1TD)r2|RnpX8a(riDVPSEF5qDlF{_?MDURwQ5KjVFZ82+-ViN}%F)nG%^Fe1)n ztW^A(Lru=}Q5my*fDouj2o0)|%y44MW&iru8)iBkXz{1zd4@1qnQG&sW3)+n7}4c2 zM@;-`K+lv!1ri|E1H)Zio4Nq#ud<+zVEYjb;U^!ZtwDt@pwHT+0*k{?EF zx%AP+|8V%J`uUDbaQf)Dj+hY@w9PK=kyuZYH#4meyJzst}u^zdKIwmI_>)FqUDwokv@miOe z?r^vSPC~BZSd7t7v^%Oc5jOxpM=HP+8-W-{M37iU=G%Z@#qMGE=e z5IC_}jy5_Ja5iKsg zZt-&tHTaYL|Gw7^b_U$}5SjG&)G{YF9JfoeHY4X{h8Ni46n~rcU8jOlFq5mCwC*lTT-(=pWLGe^PK^5C;sETCik&k z;L_9SuC=z;>DLQo?!sv*UTj5)i1AnP;pNDPEe4h;oVZ zh@aBD47=-{-r8Eu%rN3Sx;7p+Mww)X5m_$mi02x1D%t%F&7e;Kkv{2&Nnit&0b2`S&RZTo(v@S_ai6f)6u&>FHz#n(1 zX?Blp!hyN=!5ML6xs@%}CSpg{F&VvSGUCW(zPiAPP=_`)*YL3jNL;SuFxn`rNeE3k z+Sg=6h|3P7;(EJBR~H@Pyi;~hxX-~r~kHXb>SI@ww=qQ#{@C5~EtHs!pi zjBO61Kh^6~Z323fGR4j!BXV5kB8%%RJH7EJU%SH?o$B?mCIK~4m1KqyF)n+L3S5aV z{TsZ~a*9jdYpiy>_b9emwnh;_x~fS(d65x4F7v*`cEk})QO?!(Va)q797WTV{gk9d zVnmdSMH0Ba&9_J}%{OB&=)Yr;!imckB$&~h~3Ss=!4l9zhvfAx7j-lLEDKrtny8(*7{w&ZRddaG8Oj2WDdA>IpG> zW6c;FP$ik+M4RI^ezP`L5Tp5qnT)LsW5)utD={(?h+)K=%b2JbXkre*jPU6g6IC_w zS|_bb+L;n%#y*mLO&$})2SG_YgZFiM))MR5MCiz#dy1U}PL#QC5^cQP=y2~ry3GI+18kXSwswdyQ-gjTszx;^>6D~ZV#J=yObvni$~smFCId^5 zvL%TzQ-esN8r6WL5|SJ-qS2*w6F8H>ax|K{*3Hx?CdnoxSXwxr5uGlrn}8j(T$ZM; zbsOn6%buQ5 zeW*!&w-cRwllpF_)#o#v61*PlyPZ{^&-C3+fIQs3TT64)-OAQ8IuYuHFWX-`lN9p3 zA#fuZ^=p7yc+D7oPLjfiM=zAwKiBAc+}Ym9xkq-AV#CsMmPZTzTof&`CLS-ONfN_} zKbNui%G~GPktvz|0}leln)u8pU6L9`1iFmHi)XsjOwW!8NDl3N;QGc^o1}*ki!M7N zh#zz4L9?Ih_yuD}1o`mc0GbJ24I|!M#=FGTnwR#*=9D}kiE83CQA(AxF^tG^nbjl9 zj)|F6fkt;eg^h2!`)wwywIpM0mchIlmm z<5?6{i>m5xRLVKlsv1y^?<~OU03#|~`cUErH8CySWz9Fz$LK?u+IT!!Z4Ev|4J(Q33-pF}0>QrTGtUcQ2S)WU!^?~)Hm0KH^A5Whoh!Hg|1c@K;30j>h zf@E!K2qJxwAVvgvIUc9FaDuOcJ`nmauFsM3b#8-v=r`eu{?z+A=);^-pU?Ak(1&T( z=QF+z?!d@ht@}7d&=`KX!)~`f23s_)*5KcKTe1g0J@I92(S@Xt?+u8G>u6w2tz4k$ zl2cr*Frv%L@w}W_g@mPoNMS zQvlaCUrZqw_dh`%S4K~z@abnc*XvVBqoJVU~)YKQ(c1Vv-?Vw;thkBjRRdQ zKhs+SRuCB@SsC;XAAK3OycQB6ur z5wo8Wm0mnBv%RlJs{1?a%2;e`+?AF{ehc~dLVFYy))#uD(%_#4%-HsQp|CcNHxwn+ z07U-Ken#}UjJS#mG)XXIKk9a~UO{@QqQ}~u)R;X^K+v^un=emagOK!!_A?^UWoDu{ zKOl&H+vHW}wx7z*J!(w~RL<?hg4S73^=yQ3hh}iEE z1npJ@6yZ-g*VxaFpP40{8*GVXjUtRpLXsm!9JOpQRw~g4C+}MKyOGqK#8{$g%OHpZKoxGaWa^>ep*{Eek)Vj<=6N`!O z0l%nR{ivPKLksDuH&_a+wAET>#IXxgVj*Oz(_L$AuV?L>|2LS@wW>8%CNXKJN@QC$ z2Ig(@{vMAAn9A8c@gm#ko7dW<3HFE)* zf-UmJ@X2~ksy3ko((0t`*?ByBe~B}RhdXy%Zn}+KA9&^JAMxT$rbZz}HX+FoC*mEi z6Ph(UbY93&#tfZ;fWyn$q13K;=wnA)(aQ*?(kAI)M7ztgbznypvioWZd$!hR=c~;0 zWPE2-U#pVLFe2N<^AYD-W;VK`UKiJw<=SfP-17lQbZy)=%T*`&;Y6@!cSYI56gPuT zXRXz)#;w(L3^&SGJ|p^i48)G;n+_gc#h*KLM9ycLL&k`dpU3Nbc4^-N;7)?h`xG$Zc36wg6BIAL87t{1}fJ|{UV-c##> zZi9TMJNZ)Uf^fah-uisYkR)GtUR>|9uRh-j<$^u);2-Wv`v;l(4|D#U7+bDHovtct zi89rPl!mw*-ZfEvjeMShv?NW8h;-SvLF`fYUJg-D<-QHIHFMFb&yeJc5wTu~S251Y z4xSHGT+yRW?0!V~_)fZ|vwrrHvQ+pd-oewYiQ_tX>KbTN&x{ePE@P|WOpl&?V?;Y2 zTh)*JamH4)ssV>$cHY=9q0h$%q$K3Apky9^CdqCFGJi@aykA+WegM>S> zQ%zhuW0f_)kdd8=48y6h6mUWMCR_rjM z&kOM!)&=P4V6R7rd9iN{gGBOwdeglychA;Iy|Bcdt!6M8%ex&Uv1e=43&UL?@kM{k zzG$W!f_pY`dtvwY8OnAPW9R#GnkS37O%$<{p84F|dBl1D47X9IYg&4%UMMjiYr}4% zOif%jCb8!-RGsf|mHpOB`95rJ;T5$IWq z6`rOjg7$dWYLBbVU|Y@{%QaSbKiN*Zvz$$14k-}? z+0{jyVwl++f}^~#xz^0KH?HlC9ScqE(%Ko=+W7D|`V>KnjL32ElEuA!f*>Z?J%n>p z|Nr-r6-By6H6WR!Buk8#av8Z2CwnaA%h1k8u81M1mfh=DtCGwxV#&q+h{zje#PL7;)(3csKjz zgpqe;ZoNOLk$0RYeM1poX|t3G$j4G~ z$MOBzIMyjhsDVdWBu0$88Lw2Gm1hARZ|LbC>B58QWrOET1<8k?2P>v+TlW~<(81q^ zcpALBhGrEOhy^wBFp5)?EG=-N-SN!DS@XlcM={kJjqnS=+bTC=$Tix8Yvk}{`*uxI z$oGbL9Q>vAV}6ZX+JclClw_N>z=(C1kvEv{>)rRYR&PDqnB~q#-V`gcHZ=^9K1mQK z@?C7v-3>u%lKQZ_IfCEwG}t1yMm|SgN|Gc-+`Fub7IzCtqKA-YOOl>%ZCf=H6p{Sf zRne`H;ziY{mL;8*q=^v&pW)ux?vNsQhCSLNeC6Y7b9-xsAXyv7%?=W3;Gy2y0w>a4 zW?j!m6!rS8^?X~kozJ?qz{ncanxZvIs)31oY(})ZJV6?IJ=({nRsbzguHMnkpR=Jk zg38%hC03bahY`n~;a04nnOR>Sv|Hm$S4Fd1F|RgmE9NKEz@u8Roky&f55zG?+#3kT zwdz*5N_FryX`JobDsM1;7LBvrt$zG08fSC&H*)qZGA`u_aK4?6v&|`b7SuK7 Date: Mon, 23 Aug 2021 17:45:13 -0300 Subject: [PATCH 08/23] Preparing ligen --- Cargo.toml | 16 ++++++++++------ crates/openlimits-exchange/Cargo.toml | 5 +++++ crates/openlimits-exchange/build.rs | 14 ++++++++++++++ crates/openlimits-exchange/src/lib.rs | 2 -- src/lib.rs | 12 ++++++------ src/prelude/mod.rs | 2 -- 6 files changed, 35 insertions(+), 16 deletions(-) create mode 100644 crates/openlimits-exchange/build.rs diff --git a/Cargo.toml b/Cargo.toml index fe36cb8..980ab5c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,10 +12,9 @@ keywords = ["cryptocurrency", "exchange", "openlimits", "api"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [features] -default = ["rust_gmp"] -rust_gmp = ["nash-protocol/rust_gmp", "nash-native-client/rust_gmp"] -num_bigint = ["nash-protocol/num_bigint", "nash-native-client/num_bigint"] -python = ["pyo3"] +#default = ["rust_gmp"] +#rust_gmp = ["nash-protocol/rust_gmp", "nash-native-client/rust_gmp"] +#num_bigint = ["nash-protocol/num_bigint", "nash-native-client/num_bigint"] [dependencies] async-trait = "0.1" @@ -41,8 +40,13 @@ tungstenite = "0.12" sha2 = "0.9.1" url = "2.1.1" derive_more = "0.99" -nash-protocol = { version = "0.1", default-features = false, features = ["rustcrypto"] } -nash-native-client = { version = "0.1", default-features = false, features = ["rustcrypto"] } +#nash-protocol = { version = "0.1", default-features = false, features = ["rustcrypto"] } +#nash-native-client = { version = "0.1", default-features = false, features = ["rustcrypto"] } pyo3 = { version = "0.12.3", optional = true } openlimits-binance = { version = "0.1" } openlimits-exchange = { version = "0.1" } + +[build-dependencies] +ligen = { path = "../../sensorial/systems/ligen/ligen" } +ligen-c = { path = "../../sensorial/systems/ligen/ligen-c" } +ligen-cmake = { path = "../../sensorial/systems/ligen/ligen-cmake" } \ No newline at end of file diff --git a/crates/openlimits-exchange/Cargo.toml b/crates/openlimits-exchange/Cargo.toml index bbf9dfa..acdfc70 100644 --- a/crates/openlimits-exchange/Cargo.toml +++ b/crates/openlimits-exchange/Cargo.toml @@ -27,3 +27,8 @@ anyhow = "1.0.38" reqwest = { version = "0.11", features = ["json", "blocking"] } tokio-tungstenite = { version = "0.13", features = ["tls"] } tokio = "1.6.0" + +[build-dependencies] +ligen = { path = "../../../../sensorial/systems/ligen/ligen" } +ligen-c = { path = "../../../../sensorial/systems/ligen/ligen-c" } +ligen-cmake = { path = "../../../../sensorial/systems/ligen/ligen-cmake" } \ No newline at end of file diff --git a/crates/openlimits-exchange/build.rs b/crates/openlimits-exchange/build.rs new file mode 100644 index 0000000..44af587 --- /dev/null +++ b/crates/openlimits-exchange/build.rs @@ -0,0 +1,14 @@ +use ligen::prelude::*; +use ligen_c::CGenerator; +use ligen_cmake::{CMakeGenerator, Language}; +use ligen::ir::Module; + +fn main() { + let module = Module::from_path("src/model/candle.rs").expect("Couldn't read module."); + if let Ok(project) = Project::read_from_module(module) { + let c_generator = CGenerator::default(); + let cmake_generator = CMakeGenerator::new(Language::C); + cmake_generator.generate(&project).expect("Couldn't generate CMake project."); + c_generator.generate(&project).expect("Couldn't generate C bindings"); + } +} diff --git a/crates/openlimits-exchange/src/lib.rs b/crates/openlimits-exchange/src/lib.rs index 8dcf137..7985ccb 100644 --- a/crates/openlimits-exchange/src/lib.rs +++ b/crates/openlimits-exchange/src/lib.rs @@ -1,5 +1,3 @@ -// mod openlimits-exchange; -// pub use crate::openlimits-exchange::*; pub mod market; pub mod message; pub mod errors; diff --git a/src/lib.rs b/src/lib.rs index f6a8614..e073847 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,10 +3,10 @@ //! //!## Project goals //! -//!This is an ambitious project that seeks to create a new industry standard API implementation for secure, -//! correct and high performance cryptocurrency trading. -//! It is initially focused on spot exchanges as a method to define how initial data structures and project architecture -//! should be to allow zero cost abstractions +//!This is an ambitious project that seeks to create a new industry standard API implementation for secure, +//! correct and high performance cryptocurrency trading. +//! It is initially focused on spot exchanges as a method to define how initial data structures and project architecture +//! should be to allow zero cost abstractions //! around the exchanges' peculiarities. So initial project goals are: //! //!* Based on Rust, memory safe by default. @@ -29,13 +29,13 @@ //! //!### Testing //! -//!In order to run the tests you will have to provide environment variables for the sandbox API of the exchanges, +//!In order to run the tests you will have to provide environment variables for the sandbox API of the exchanges, //! you can use environment variables or use a `.env` file. //! //!### Sponsorship //! //!We invite industry participants to join us in sponsoring a new high quality open source standard for crypto trading APIs. [ -//! Nash](https://nash.io) is dedicating a maintainer and initial rewards for external contributors that close issues. +//! Nash](https://nash.io) is dedicating a maintainer and initial rewards for external contributors that close issues. //! Look for the wiki [rewards table](https://github.com/nash-io/openlimits/wiki/Rewards-sizes) and for reward size labels on open issues. pub mod exchange; diff --git a/src/prelude/mod.rs b/src/prelude/mod.rs index edd4096..3cd3477 100644 --- a/src/prelude/mod.rs +++ b/src/prelude/mod.rs @@ -4,6 +4,4 @@ pub use crate::model::{OrderBookRequest, OrderBookResponse}; pub use crate::exchange::traits::stream::ExchangeWs; pub use crate::exchange::traits::info::{ExchangeInfo, ExchangeInfoRetrieval, MarketPair, MarketPairHandle}; pub use crate::exchange::traits::{Exchange, ExchangeAccount, ExchangeMarketData}; -pub use nash_native_client::Environment; -pub use tokio::time::Duration; From d9ae21e56ea85c948d1bdb091c3dcc354e37bc53 Mon Sep 17 00:00:00 2001 From: Danilo Guanabara Date: Tue, 24 Aug 2021 01:40:56 -0300 Subject: [PATCH 09/23] Building first files --- crates/openlimits-exchange/.gitignore | 2 ++ crates/openlimits-exchange/Cargo.toml | 7 ++++--- crates/openlimits-exchange/build.rs | 15 +++++++++------ 3 files changed, 15 insertions(+), 9 deletions(-) create mode 100644 crates/openlimits-exchange/.gitignore diff --git a/crates/openlimits-exchange/.gitignore b/crates/openlimits-exchange/.gitignore new file mode 100644 index 0000000..fa8d85a --- /dev/null +++ b/crates/openlimits-exchange/.gitignore @@ -0,0 +1,2 @@ +Cargo.lock +target diff --git a/crates/openlimits-exchange/Cargo.toml b/crates/openlimits-exchange/Cargo.toml index acdfc70..e28fd9e 100644 --- a/crates/openlimits-exchange/Cargo.toml +++ b/crates/openlimits-exchange/Cargo.toml @@ -29,6 +29,7 @@ tokio-tungstenite = { version = "0.13", features = ["tls"] } tokio = "1.6.0" [build-dependencies] -ligen = { path = "../../../../sensorial/systems/ligen/ligen" } -ligen-c = { path = "../../../../sensorial/systems/ligen/ligen-c" } -ligen-cmake = { path = "../../../../sensorial/systems/ligen/ligen-cmake" } \ No newline at end of file +ligen = { path = "../../../../sensorial/systems/ligen/ligen" } +ligen-c = { path = "../../../../sensorial/systems/ligen/generators/ligen-c" } +ligen-csharp = { path = "../../../../sensorial/systems/ligen/generators/ligen-csharp" } +ligen-cmake = { path = "../../../../sensorial/systems/ligen/generators/ligen-cmake" } \ No newline at end of file diff --git a/crates/openlimits-exchange/build.rs b/crates/openlimits-exchange/build.rs index 44af587..abbe5e1 100644 --- a/crates/openlimits-exchange/build.rs +++ b/crates/openlimits-exchange/build.rs @@ -1,14 +1,17 @@ use ligen::prelude::*; -use ligen_c::CGenerator; -use ligen_cmake::{CMakeGenerator, Language}; +// use ligen_c::CGenerator; +// use ligen_cmake::{CMakeGenerator, Language}; +use ligen_csharp::CSharpGenerator; use ligen::ir::Module; fn main() { let module = Module::from_path("src/model/candle.rs").expect("Couldn't read module."); if let Ok(project) = Project::read_from_module(module) { - let c_generator = CGenerator::default(); - let cmake_generator = CMakeGenerator::new(Language::C); - cmake_generator.generate(&project).expect("Couldn't generate CMake project."); - c_generator.generate(&project).expect("Couldn't generate C bindings"); + // let c_generator = CGenerator::default(); + // let cmake_generator = CMakeGenerator(Language::C); + let csharp_generator = CSharpGenerator::default(); + // cmake_generator.generate(&project).expect("Couldn't generate CMake project."); + // c_generator.generate(&project).expect("Couldn't generate C bindings."); + csharp_generator.generate(&project).expect("Couldn't generate C# bindings.") } } From f33bd05802a28ca841d57c05ee45e92ffb564dcc Mon Sep 17 00:00:00 2001 From: Danilo Guanabara Date: Wed, 1 Sep 2021 12:04:28 -0300 Subject: [PATCH 10/23] Adding structures and enumerations --- Cargo.toml | 5 --- crates/openlimits-exchange/Cargo.toml | 1 + crates/openlimits-exchange/build.rs | 7 ++-- crates/openlimits-exchange/src/errors.rs | 2 ++ crates/openlimits-exchange/src/exchange.rs | 2 ++ crates/openlimits-exchange/src/market/mod.rs | 2 ++ crates/openlimits-exchange/src/message/mod.rs | 2 ++ .../openlimits-exchange/src/model/interval.rs | 2 ++ crates/openlimits-exchange/src/model/mod.rs | 36 +++++++++---------- crates/openlimits-exchange/src/model/order.rs | 2 ++ .../src/model/order_filter.rs | 2 ++ .../src/model/paginator.rs | 2 ++ .../openlimits-exchange/src/model/python.rs | 2 ++ .../src/model/request/mod.rs | 2 ++ .../openlimits-exchange/src/model/ticker.rs | 2 ++ .../src/model/time_in_force_visitor.rs | 2 ++ crates/openlimits-exchange/src/model/trade.rs | 2 ++ .../src/model/transaction.rs | 4 ++- .../src/model/websocket.rs | 2 ++ crates/openlimits-exchange/src/shared.rs | 2 ++ crates/openlimits-exchange/src/traits/mod.rs | 2 ++ 21 files changed, 58 insertions(+), 27 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 980ab5c..87bc805 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,8 +45,3 @@ derive_more = "0.99" pyo3 = { version = "0.12.3", optional = true } openlimits-binance = { version = "0.1" } openlimits-exchange = { version = "0.1" } - -[build-dependencies] -ligen = { path = "../../sensorial/systems/ligen/ligen" } -ligen-c = { path = "../../sensorial/systems/ligen/ligen-c" } -ligen-cmake = { path = "../../sensorial/systems/ligen/ligen-cmake" } \ No newline at end of file diff --git a/crates/openlimits-exchange/Cargo.toml b/crates/openlimits-exchange/Cargo.toml index e28fd9e..692fb59 100644 --- a/crates/openlimits-exchange/Cargo.toml +++ b/crates/openlimits-exchange/Cargo.toml @@ -27,6 +27,7 @@ anyhow = "1.0.38" reqwest = { version = "0.11", features = ["json", "blocking"] } tokio-tungstenite = { version = "0.13", features = ["tls"] } tokio = "1.6.0" +ligen-macro = { path = "../../../../sensorial/systems/ligen/ligen/macro" } [build-dependencies] ligen = { path = "../../../../sensorial/systems/ligen/ligen" } diff --git a/crates/openlimits-exchange/build.rs b/crates/openlimits-exchange/build.rs index abbe5e1..56f31d9 100644 --- a/crates/openlimits-exchange/build.rs +++ b/crates/openlimits-exchange/build.rs @@ -2,11 +2,12 @@ use ligen::prelude::*; // use ligen_c::CGenerator; // use ligen_cmake::{CMakeGenerator, Language}; use ligen_csharp::CSharpGenerator; -use ligen::ir::Module; +//use ligen::ir::Module; fn main() { - let module = Module::from_path("src/model/candle.rs").expect("Couldn't read module."); - if let Ok(project) = Project::read_from_module(module) { + // let module = Module::from_path("src/model/candle.rs").expect("Couldn't read module."); + // if let Ok(project) = Project::read_from_module(module) { + if let Ok(project) = Project::current() { // let c_generator = CGenerator::default(); // let cmake_generator = CMakeGenerator(Language::C); let csharp_generator = CSharpGenerator::default(); diff --git a/crates/openlimits-exchange/src/errors.rs b/crates/openlimits-exchange/src/errors.rs index b54fec7..2612516 100644 --- a/crates/openlimits-exchange/src/errors.rs +++ b/crates/openlimits-exchange/src/errors.rs @@ -1,3 +1,5 @@ +ligen_macro::ignore!(); + use serde::{Deserialize, Serialize}; use std::fmt; use thiserror::Error; diff --git a/crates/openlimits-exchange/src/exchange.rs b/crates/openlimits-exchange/src/exchange.rs index 8663cbc..cbbcfaf 100644 --- a/crates/openlimits-exchange/src/exchange.rs +++ b/crates/openlimits-exchange/src/exchange.rs @@ -1,3 +1,5 @@ +ligen_macro::ignore!(); + use messaging::Subscriber; use async_trait::async_trait; diff --git a/crates/openlimits-exchange/src/market/mod.rs b/crates/openlimits-exchange/src/market/mod.rs index 06d1f16..b3dee07 100644 --- a/crates/openlimits-exchange/src/market/mod.rs +++ b/crates/openlimits-exchange/src/market/mod.rs @@ -1,3 +1,5 @@ +ligen_macro::ignore!(); + pub mod symbol; use symbol::Symbol; diff --git a/crates/openlimits-exchange/src/message/mod.rs b/crates/openlimits-exchange/src/message/mod.rs index 88bac56..73298ea 100644 --- a/crates/openlimits-exchange/src/message/mod.rs +++ b/crates/openlimits-exchange/src/message/mod.rs @@ -1,2 +1,4 @@ +ligen_macro::ignore!(); + pub mod request; pub mod subscription; \ No newline at end of file diff --git a/crates/openlimits-exchange/src/model/interval.rs b/crates/openlimits-exchange/src/model/interval.rs index 93d046b..ca2eccf 100644 --- a/crates/openlimits-exchange/src/model/interval.rs +++ b/crates/openlimits-exchange/src/model/interval.rs @@ -1,3 +1,5 @@ +ligen_macro::ignore!(); + use chrono::Duration; use serde::Deserialize; use serde::Serialize; diff --git a/crates/openlimits-exchange/src/model/mod.rs b/crates/openlimits-exchange/src/model/mod.rs index 6a9bf50..c4b1517 100644 --- a/crates/openlimits-exchange/src/model/mod.rs +++ b/crates/openlimits-exchange/src/model/mod.rs @@ -1,23 +1,23 @@ //! This module provides models that are used in the openlimits-exchange module -mod request; -mod ask_bid; -mod balance; -mod candle; -mod interval; -mod liquidity; -mod order_canceled; -mod order_filter; -mod order_status; -mod order_type; -mod order; -mod paginator; -mod side; -mod ticker; -mod time_in_force_visitor; -mod time_in_force; -mod trade; -mod transaction; +pub mod request; +pub mod ask_bid; +pub mod balance; +pub mod candle; +pub mod interval; +pub mod liquidity; +pub mod order_canceled; +pub mod order_filter; +pub mod order_status; +pub mod order_type; +pub mod order; +pub mod paginator; +pub mod side; +pub mod ticker; +pub mod time_in_force_visitor; +pub mod time_in_force; +pub mod trade; +pub mod transaction; pub use request::*; pub use ask_bid::AskBid; diff --git a/crates/openlimits-exchange/src/model/order.rs b/crates/openlimits-exchange/src/model/order.rs index 4ad8ad9..9f0de75 100644 --- a/crates/openlimits-exchange/src/model/order.rs +++ b/crates/openlimits-exchange/src/model/order.rs @@ -1,3 +1,5 @@ +ligen_macro::ignore!(); + use derive_more::Constructor; use rust_decimal::prelude::Decimal; use serde::Deserialize; diff --git a/crates/openlimits-exchange/src/model/order_filter.rs b/crates/openlimits-exchange/src/model/order_filter.rs index 4239114..bdf6767 100644 --- a/crates/openlimits-exchange/src/model/order_filter.rs +++ b/crates/openlimits-exchange/src/model/order_filter.rs @@ -1,3 +1,5 @@ +ligen_macro::ignore!(); + use rust_decimal::prelude::Decimal; use serde::Deserialize; use serde::Serialize; diff --git a/crates/openlimits-exchange/src/model/paginator.rs b/crates/openlimits-exchange/src/model/paginator.rs index 756c474..77aafc3 100644 --- a/crates/openlimits-exchange/src/model/paginator.rs +++ b/crates/openlimits-exchange/src/model/paginator.rs @@ -1,3 +1,5 @@ +ligen_macro::ignore!(); + use serde::Deserialize; use serde::Serialize; diff --git a/crates/openlimits-exchange/src/model/python.rs b/crates/openlimits-exchange/src/model/python.rs index 0a60f4c..2b74d94 100644 --- a/crates/openlimits-exchange/src/model/python.rs +++ b/crates/openlimits-exchange/src/model/python.rs @@ -1,3 +1,5 @@ +ligen_macro::ignore!(); + use super::websocket::{OpenLimitsWebSocketMessage, Subscription}; use crate::exchange::any::InitAnyExchange; use crate::exchange::binance::{BinanceCredentials, BinanceParameters}; diff --git a/crates/openlimits-exchange/src/model/request/mod.rs b/crates/openlimits-exchange/src/model/request/mod.rs index b2dcd0f..52ea50a 100644 --- a/crates/openlimits-exchange/src/model/request/mod.rs +++ b/crates/openlimits-exchange/src/model/request/mod.rs @@ -1,5 +1,7 @@ //! This module contains all the request response pairs. +ligen_macro::ignore!(); + mod cancel_all_order_request; mod cancel_order_request; mod get_historic_rates_request; diff --git a/crates/openlimits-exchange/src/model/ticker.rs b/crates/openlimits-exchange/src/model/ticker.rs index f7d6967..0e63a61 100644 --- a/crates/openlimits-exchange/src/model/ticker.rs +++ b/crates/openlimits-exchange/src/model/ticker.rs @@ -1,3 +1,5 @@ +ligen_macro::ignore!(); + use derive_more::Constructor; use rust_decimal::prelude::Decimal; use serde::Deserialize; diff --git a/crates/openlimits-exchange/src/model/time_in_force_visitor.rs b/crates/openlimits-exchange/src/model/time_in_force_visitor.rs index a371e31..cd903e5 100644 --- a/crates/openlimits-exchange/src/model/time_in_force_visitor.rs +++ b/crates/openlimits-exchange/src/model/time_in_force_visitor.rs @@ -1,3 +1,5 @@ +ligen_macro::ignore!(); + use chrono::Duration; use serde::de::Visitor; use serde::de; diff --git a/crates/openlimits-exchange/src/model/trade.rs b/crates/openlimits-exchange/src/model/trade.rs index fac2796..f85b7b1 100644 --- a/crates/openlimits-exchange/src/model/trade.rs +++ b/crates/openlimits-exchange/src/model/trade.rs @@ -1,3 +1,5 @@ +ligen_macro::ignore!(); + use derive_more::Constructor; use rust_decimal::prelude::Decimal; use serde::Deserialize; diff --git a/crates/openlimits-exchange/src/model/transaction.rs b/crates/openlimits-exchange/src/model/transaction.rs index e48cb08..2f32684 100644 --- a/crates/openlimits-exchange/src/model/transaction.rs +++ b/crates/openlimits-exchange/src/model/transaction.rs @@ -1,3 +1,5 @@ +ligen_macro::ignore!(); + use derive_more::Constructor; use serde::Deserialize; use serde::Serialize; @@ -9,4 +11,4 @@ pub struct Transaction { pub market_pair: String, pub client_order_id: Option, pub created_at: u64, -} \ No newline at end of file +} diff --git a/crates/openlimits-exchange/src/model/websocket.rs b/crates/openlimits-exchange/src/model/websocket.rs index 7bee549..05edfac 100644 --- a/crates/openlimits-exchange/src/model/websocket.rs +++ b/crates/openlimits-exchange/src/model/websocket.rs @@ -1,3 +1,5 @@ +ligen_macro::ignore!(); + use super::{OrderBookResponse, Trade}; use crate::model::{OrderStatus, OrderType, Side}; use serde::{Deserialize, Serialize}; diff --git a/crates/openlimits-exchange/src/shared.rs b/crates/openlimits-exchange/src/shared.rs index 1299b3e..9317281 100644 --- a/crates/openlimits-exchange/src/shared.rs +++ b/crates/openlimits-exchange/src/shared.rs @@ -1,5 +1,7 @@ //! This module cointains some auxiliar functions that are used in the openlimits-exchange module +ligen_macro::ignore!(); + pub type Result = std::result::Result; pub mod string_to_decimal { diff --git a/crates/openlimits-exchange/src/traits/mod.rs b/crates/openlimits-exchange/src/traits/mod.rs index 110470f..7a21d03 100644 --- a/crates/openlimits-exchange/src/traits/mod.rs +++ b/crates/openlimits-exchange/src/traits/mod.rs @@ -1,5 +1,7 @@ //! This module cointains the traits that are used in the openlimits-exchange module. +ligen_macro::ignore!(); + mod exchange_account; mod exchange_market_data; mod exchange; From 486630f41d33139a87e523bc39dd7164a6ae6bb6 Mon Sep 17 00:00:00 2001 From: Danilo Guanabara Date: Mon, 4 Oct 2021 10:17:51 -0300 Subject: [PATCH 11/23] cs files --- Cargo.toml | 3 + bindings/csharp/.gitignore | 2 + bindings/csharp/AskBid.cs | 47 + bindings/csharp/Balance.cs | 41 + bindings/csharp/BinanceClientConfig.cs | 27 + bindings/csharp/CString.cs | 19 + bindings/csharp/Candle.cs | 24 + bindings/csharp/CoinbaseClientConfig.cs | 29 + bindings/csharp/ExchangeClient.cs | 712 ++++++++ bindings/csharp/FFIResult.cs | 143 ++ bindings/csharp/GetHistoricRatesRequest.cs | 44 + bindings/csharp/GetHistoricTradesRequest.cs | 22 + bindings/csharp/GetOrderHistoryRequest.cs | 20 + bindings/csharp/GetTradeHistoryRequest.cs | 23 + bindings/csharp/LICENSE.txt | 25 + bindings/csharp/LimitOrderRequest.cs | 48 + bindings/csharp/Liquidity.cs | 9 + bindings/csharp/MarketOrderRequest.cs | 14 + bindings/csharp/MarketPair.cs | 61 + bindings/csharp/NashClientConfig.cs | 42 + bindings/csharp/OpenLimits.csproj | 38 + bindings/csharp/Order.cs | 97 + bindings/csharp/OrderStatus.cs | 16 + bindings/csharp/OrderType.cs | 11 + bindings/csharp/Orderbook.cs | 29 + bindings/csharp/OrderbookResponse.cs | 23 + bindings/csharp/Paginator.cs | 22 + bindings/csharp/Side.cs | 8 + bindings/csharp/Test.cs | 16 + bindings/csharp/TimeInForce.cs | 10 + bindings/csharp/Trade.cs | 91 + bindings/csharp/TradesResponse.cs | 16 + bindings/csharp/lib/Cargo.toml | 19 + bindings/csharp/lib/src/lib.rs | 1594 +++++++++++++++++ build.rs | 3 + examples/binance.rs | 16 - examples/binance_websocket.rs | 30 - examples/coinbase.rs | 16 - examples/csharp/.gitignore | 2 + examples/csharp/Example.csproj | 12 + examples/csharp/Program.cs | 47 + examples/csharp/run.sh | 4 + .../orderbook.rs} | 4 +- src/lib.rs | 16 +- 44 files changed, 3423 insertions(+), 72 deletions(-) create mode 100644 bindings/csharp/.gitignore create mode 100644 bindings/csharp/AskBid.cs create mode 100644 bindings/csharp/Balance.cs create mode 100644 bindings/csharp/BinanceClientConfig.cs create mode 100644 bindings/csharp/CString.cs create mode 100644 bindings/csharp/Candle.cs create mode 100644 bindings/csharp/CoinbaseClientConfig.cs create mode 100644 bindings/csharp/ExchangeClient.cs create mode 100644 bindings/csharp/FFIResult.cs create mode 100644 bindings/csharp/GetHistoricRatesRequest.cs create mode 100644 bindings/csharp/GetHistoricTradesRequest.cs create mode 100644 bindings/csharp/GetOrderHistoryRequest.cs create mode 100644 bindings/csharp/GetTradeHistoryRequest.cs create mode 100644 bindings/csharp/LICENSE.txt create mode 100644 bindings/csharp/LimitOrderRequest.cs create mode 100644 bindings/csharp/Liquidity.cs create mode 100644 bindings/csharp/MarketOrderRequest.cs create mode 100644 bindings/csharp/MarketPair.cs create mode 100644 bindings/csharp/NashClientConfig.cs create mode 100644 bindings/csharp/OpenLimits.csproj create mode 100644 bindings/csharp/Order.cs create mode 100644 bindings/csharp/OrderStatus.cs create mode 100644 bindings/csharp/OrderType.cs create mode 100644 bindings/csharp/Orderbook.cs create mode 100644 bindings/csharp/OrderbookResponse.cs create mode 100644 bindings/csharp/Paginator.cs create mode 100644 bindings/csharp/Side.cs create mode 100644 bindings/csharp/Test.cs create mode 100644 bindings/csharp/TimeInForce.cs create mode 100644 bindings/csharp/Trade.cs create mode 100644 bindings/csharp/TradesResponse.cs create mode 100644 bindings/csharp/lib/Cargo.toml create mode 100644 bindings/csharp/lib/src/lib.rs create mode 100644 build.rs delete mode 100644 examples/binance.rs delete mode 100644 examples/binance_websocket.rs delete mode 100644 examples/coinbase.rs create mode 100644 examples/csharp/.gitignore create mode 100644 examples/csharp/Example.csproj create mode 100644 examples/csharp/Program.cs create mode 100755 examples/csharp/run.sh rename examples/{coinbase_websocket.rs => rust/orderbook.rs} (91%) diff --git a/Cargo.toml b/Cargo.toml index 87bc805..fb07281 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,9 @@ license = "BSD-2-Clause" repository = "https://github.com/nash-io/openlimits" keywords = ["cryptocurrency", "exchange", "openlimits", "api"] +[[example]] +name = "orderbook" +path = "examples/rust/orderbook.rs" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/bindings/csharp/.gitignore b/bindings/csharp/.gitignore new file mode 100644 index 0000000..7de5508 --- /dev/null +++ b/bindings/csharp/.gitignore @@ -0,0 +1,2 @@ +obj +bin diff --git a/bindings/csharp/AskBid.cs b/bindings/csharp/AskBid.cs new file mode 100644 index 0000000..f5be660 --- /dev/null +++ b/bindings/csharp/AskBid.cs @@ -0,0 +1,47 @@ +namespace OpenLimits +{ + using System; + using System.Runtime.InteropServices; + using System.Globalization; + [StructLayout(LayoutKind.Sequential, Pack = 1)] + internal struct FFIAskBid + { + public readonly IntPtr price; + public readonly IntPtr qty; + + public FFIAskBid(IntPtr price, IntPtr qty) + { + this.price = price; + this.qty = qty; + } + + public void Dispose() { + ExchangeClient.FreeString(price); + ExchangeClient.FreeString(qty); + } + + public AskBid ToAskBid() { + return new AskBid( + CString.ToString(this.price), + CString.ToString(this.qty) + ); + } + } + + public struct AskBid + { + public readonly decimal price; + public readonly decimal qty; + + public AskBid(string price, string qty) + { + this.price = Decimal.Parse(price, System.Globalization.NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture); + this.qty = Decimal.Parse(qty, System.Globalization.NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture); + } + + public override string ToString() + { + return "AskBid { price=" + price + ", qty=" + qty + "}"; + } + } +} \ No newline at end of file diff --git a/bindings/csharp/Balance.cs b/bindings/csharp/Balance.cs new file mode 100644 index 0000000..fe6ccd8 --- /dev/null +++ b/bindings/csharp/Balance.cs @@ -0,0 +1,41 @@ +namespace OpenLimits +{ + using System.Runtime.InteropServices; + using System; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct FFIBalance + { + public readonly IntPtr asset; + public readonly IntPtr total; + public readonly IntPtr free; + + public void Dispose() { + ExchangeClient.FreeString(asset); + ExchangeClient.FreeString(total); + ExchangeClient.FreeString(free); + } + + public Balance ToBalance() { + return new Balance( + CString.ToString(this.asset), + CString.ToString(this.total), + CString.ToString(this.free) + ); + } + } + + public struct Balance + { + public readonly string asset; + public readonly string total; + public readonly string free; + + public Balance(string asset, string total, string free) + { + this.asset = asset; + this.total = total; + this.free = free; + } + } +} \ No newline at end of file diff --git a/bindings/csharp/BinanceClientConfig.cs b/bindings/csharp/BinanceClientConfig.cs new file mode 100644 index 0000000..e0c1a12 --- /dev/null +++ b/bindings/csharp/BinanceClientConfig.cs @@ -0,0 +1,27 @@ + +namespace OpenLimits +{ + using System.Runtime.InteropServices; + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct BinanceClientConfig + { + public readonly string apikey; + public readonly string secret; + public readonly bool sandbox; + + private BinanceClientConfig(string apikey, string secret, bool sandbox) + { + this.apikey = apikey; + this.secret = secret; + this.sandbox = sandbox; + } + + public static BinanceClientConfig Authenticated(string apikey, string secret, bool sandbox) { + return new BinanceClientConfig(apikey, secret, sandbox); + } + + public static BinanceClientConfig Unauthenticated(bool sandbox) { + return new BinanceClientConfig(null, null, sandbox); + } + } +} \ No newline at end of file diff --git a/bindings/csharp/CString.cs b/bindings/csharp/CString.cs new file mode 100644 index 0000000..062b59c --- /dev/null +++ b/bindings/csharp/CString.cs @@ -0,0 +1,19 @@ +namespace OpenLimits +{ + using System.Runtime.InteropServices; + using System; + using System.Text; + + public class CString { + public static string ToString(IntPtr handle) { + if (handle.ToInt64() == 0) { + return null; + } + int len = 0; + while (Marshal.ReadByte(handle,len) != 0) { ++len; } + byte[] buffer = new byte[len]; + Marshal.Copy(handle, buffer, 0, buffer.Length); + return Encoding.UTF8.GetString(buffer); + } + } +} \ No newline at end of file diff --git a/bindings/csharp/Candle.cs b/bindings/csharp/Candle.cs new file mode 100644 index 0000000..0995712 --- /dev/null +++ b/bindings/csharp/Candle.cs @@ -0,0 +1,24 @@ +namespace OpenLimits +{ + using System.Runtime.InteropServices; + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct Candle + { + public readonly ulong time; + public readonly double low; + public readonly double high; + public readonly double open; + public readonly double close; + public readonly double volume; + + public Candle(ulong time, double low, double high, double open, double close, double volume) + { + this.time = time; + this.low = low; + this.high = high; + this.open = open; + this.close = close; + this.volume = volume; + } + } +} \ No newline at end of file diff --git a/bindings/csharp/CoinbaseClientConfig.cs b/bindings/csharp/CoinbaseClientConfig.cs new file mode 100644 index 0000000..d503bb1 --- /dev/null +++ b/bindings/csharp/CoinbaseClientConfig.cs @@ -0,0 +1,29 @@ + +namespace OpenLimits +{ + using System.Runtime.InteropServices; + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct CoinbaseClientConfig + { + public readonly string apikey; + public readonly string secret; + public readonly string passphrase; + public readonly bool sandbox; + + private CoinbaseClientConfig(string apikey, string secret, string passphrase, bool sandbox) + { + this.apikey = apikey; + this.secret = secret; + this.passphrase = passphrase; + this.sandbox = sandbox; + } + + public static CoinbaseClientConfig Authenticated(string apikey, string secret, string passphrase, bool sandbox) { + return new CoinbaseClientConfig(apikey, secret, passphrase, sandbox); + } + + public static CoinbaseClientConfig Unauthenticated(bool sandbox) { + return new CoinbaseClientConfig(null, null, null, sandbox); + } + } +} \ No newline at end of file diff --git a/bindings/csharp/ExchangeClient.cs b/bindings/csharp/ExchangeClient.cs new file mode 100644 index 0000000..8948f1d --- /dev/null +++ b/bindings/csharp/ExchangeClient.cs @@ -0,0 +1,712 @@ + +namespace OpenLimits +{ + + using System; + using System.Threading; + using System.Collections.Generic; + using System.Runtime.InteropServices; + public class ExchangeClient + { + static HashSet _clients = new HashSet(); + private void handleResult(FFIResult result) { + string message = "Unknown error"; + if (result.message.ToInt64() != 0) { + message = CString.ToString(result.message); + FreeString(result.message); + } + switch(result.tag) { + case ResultTag.Ok: return; + case ResultTag.InvalidArgument: + throw new ArgumentException(message); + case ResultTag.BinanceError: + throw new BinanceError(message); + case ResultTag.CoinbaseError: + throw new CoinbaseError(message); + case ResultTag.NashProtocolError: + throw new NashProtocolError(message); + case ResultTag.MissingImplementation: + throw new MissingImplementation(message); + case ResultTag.AssetNotFound: + throw new AssetNotFound(message); + case ResultTag.NoApiKeySet: + throw new NoApiKeySet(message); + case ResultTag.InternalServerError: + throw new InternalServerError(message); + case ResultTag.ServiceUnavailable: + throw new ServiceUnavailable(message); + case ResultTag.Unauthorized: + throw new Unauthorized(message); + case ResultTag.SymbolNotFound: + throw new SymbolNotFound(message); + case ResultTag.SocketError: + throw new SocketError(message); + case ResultTag.GetTimestampFailed: + throw new GetTimestampFailed(message); + case ResultTag.ReqError: + throw new ReqError(message); + case ResultTag.InvalidHeaderError: + throw new InvalidHeaderError(message); + case ResultTag.InvalidPayloadSignature: + throw new InvalidPayloadSignature(message); + case ResultTag.IoError: + throw new IoError(message); + case ResultTag.PoisonError: + throw new PoisonError(message); + case ResultTag.JsonError: + throw new JsonError(message); + case ResultTag.ParseFloatError: + throw new ParseFloatError(message); + case ResultTag.UrlParserError: + throw new UrlParserError(message); + case ResultTag.Tungstenite: + throw new Tungstenite(message); + case ResultTag.TimestampError: + throw new TimestampError(message); + case ResultTag.UnkownResponse: + throw new UnkownResponse(message); + case ResultTag.NotParsableResponse: + throw new NotParsableResponse(message); + case ResultTag.MissingParameter: + throw new MissingParameter(message); + case ResultTag.WebSocketMessageNotSupported: + throw new WebSocketMessageNotSupported(message); } + } + /// Used by rust to write data directly to C# thus avoiding changing ownership + private FFITrade[] subTradesBuff = new FFITrade[1024]; + private FFIAskBid[] subAsksBuff = new FFIAskBid[1024]; + private FFIAskBid[] subBidsBuff = new FFIAskBid[1024]; + + // Callbacks from rust into C#. Some callbacks come in a "private" and public version. + // Some objects, especially those containing strings or array of objects will be serialized into a + // C# version after arriving. Strings exchanged from rust to C# must be freed manually. So it is important not to expose + // The internals + public delegate void OnError(); + public delegate void OnPing(); + public delegate void OnDisconnect(); + public delegate void OnOrderbook(OrderbookResponse orderbook); + unsafe private delegate void OnOrderbookFFI(ulong bidActualValueLen, ulong askActualValueLen, IntPtr market, ulong lastUpdateId, ulong updateId); + public delegate void OnTrades(TradesResponse trades); + private delegate void OnTradesFFI(ulong bidActualValueLen, IntPtr market); + private OnError onErrorCb; + private List onErrorCbs = new List(); + + private OnPing onPingCb; + private List onPingCbs = new List(); + private OnOrderbookFFI onOrderbookCb; + private OnTradesFFI onTradesCb; + + private Dictionary> onOrderbookCbs = new Dictionary>(); + private Dictionary> onTradesCbs = new Dictionary>(); + + private OnDisconnect onDisconnectCb; + private List onDisconnectCbs = new List(); + + + + const string NativeLib = "libopenlimits_sharp"; + + unsafe private IntPtr _client_handle; + unsafe private IntPtr _sub_handle; + + [DllImport(NativeLib, EntryPoint = "free_string", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] + unsafe private static extern void FreeStringInternal(IntPtr handle); + static public void FreeString(IntPtr handle) { + if (handle.ToInt64() == 0) { + return; + } + FreeStringInternal(handle); + } + + + [DllImport(NativeLib, EntryPoint = "disconnect", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] + unsafe internal static extern void Disconnect(IntPtr subhandle); + + [DllImport(NativeLib, EntryPoint = "init_binance", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] + unsafe private static extern FFIResult InitBinance(BinanceClientConfig config, out IntPtr client); + + [DllImport(NativeLib, EntryPoint = "init_nash", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] + unsafe private static extern FFIResult InitNash(string apikey, string secret, ulong clientid, NashEnvironment environment, ulong timeout, string affiliateCode, out IntPtr client); + + + [DllImport(NativeLib, EntryPoint = "init_coinbase", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] + unsafe private static extern FFIResult InitCoinbase(string apikey, string secret, string passphrase, bool sandbox, out IntPtr client); + + + [DllImport(NativeLib, EntryPoint = "init_subscriptions", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] + unsafe private static extern FFIResult InitCbs(IntPtr client, + OnError onError, OnPing onPing, OnOrderbookFFI onOrderbook, OnTradesFFI onTrades, OnDisconnect onDisconnect, + IntPtr bidBuffPtr, UIntPtr bidBufLen, + IntPtr askBuffPtr, UIntPtr askBufLen, + IntPtr taskBuffPtr, UIntPtr tradeBufLen, + out IntPtr subhandle + ); + + + [DllImport(NativeLib, EntryPoint = "order_book", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] + unsafe private static extern FFIResult Orderbook(IntPtr client, string market, + IntPtr bidBuffPtr, ulong bidBufLen, out ulong bidActualValueLen, + IntPtr askBuffPtr, ulong AskBufLen, out ulong askActualValueLen, + out ulong lastUpdateId, + out ulong updateId + ); + + [DllImport(NativeLib, EntryPoint = "get_price_ticker", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] + unsafe private static extern FFIResult GetPriceTicker(IntPtr client, string market, out double price); + + [DllImport(NativeLib, EntryPoint = "get_historic_rates", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] + unsafe private static extern FFIResult GetHistoricRates(IntPtr client, string market, Interval interval, Paginator paginator, + IntPtr buffPtr, UIntPtr valueBufLen, out UIntPtr actualValueLen + ); + + [DllImport(NativeLib, EntryPoint = "get_historic_trades", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] + unsafe private static extern FFIResult GetHistoricTrades(IntPtr client, string market, Paginator paginator, + IntPtr buffPtr, UIntPtr valueBufLen, out UIntPtr actualValueLen + ); + + [DllImport(NativeLib, EntryPoint = "place_order", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] + unsafe private static extern FFIResult PlaceOrder(IntPtr client, string market, + string qty, + bool limit, + string price, + Side side, + TimeInForce tif, + ulong tifDuration, + bool postOnly, + out FFIOrder order + ); + + [DllImport(NativeLib, EntryPoint = "get_all_open_orders", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] + unsafe private static extern FFIResult GetAllOpenOrders(IntPtr client, + IntPtr buffPtr, UIntPtr valueBufLen, out UIntPtr actualValueLen + ); + + [DllImport(NativeLib, EntryPoint = "subscribe_orderbook", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] + unsafe private static extern FFIResult SubscribeToOrderbook(IntPtr client, IntPtr subhandle, string market); + + [DllImport(NativeLib, EntryPoint = "subscribe_trades", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] + unsafe private static extern FFIResult SubscribeToTrades(IntPtr client, IntPtr subhandle, string market); + + [DllImport(NativeLib, EntryPoint = "get_order_history", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] + unsafe private static extern FFIResult GetOrderHistory(IntPtr client, + string market, Paginator paginator, + IntPtr buffPtr, UIntPtr valueBufLen, out UIntPtr actualValueLen + ); + + [DllImport(NativeLib, EntryPoint = "get_trade_history", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] + unsafe private static extern FFIResult GetTradeHistory(IntPtr client, + string market, string orderId, Paginator paginator, + IntPtr buffPtr, UIntPtr valueBufLen, out UIntPtr actualValueLen + ); + + [DllImport(NativeLib, EntryPoint = "get_account_balances", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] + unsafe private static extern FFIResult GetAccountBalances(IntPtr client, + Paginator paginator, + IntPtr buffPtr, UIntPtr valueBufLen, out UIntPtr actualValueLen + ); + + + [DllImport(NativeLib, EntryPoint = "cancel_all_orders", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] + unsafe private static extern FFIResult CancelAllOrders(IntPtr client, string market, IntPtr buffPtr, UIntPtr valueBufLen, out UIntPtr actualValueLen); + + [DllImport(NativeLib, EntryPoint = "cancel_order", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] + unsafe private static extern FFIResult CancelOrder(IntPtr client, string orderId, string market); + + + [DllImport(NativeLib, EntryPoint = "get_order", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] + unsafe private static extern FFIResult GetOrder(IntPtr client, string orderId, string market, out FFIOrder result); + + [DllImport(NativeLib, EntryPoint = "receive_pairs", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] + unsafe private static extern FFIResult ReceivePairs(IntPtr client, IntPtr buffPtr, UIntPtr valueBufLen, out UIntPtr actualValueLen); + + private void handleFFIResult(FFIResult result) { + } + private void onPingHandler() { + foreach(var callback in this.onPingCbs) { + callback(); + } + } + private void onErrorHandler() { + foreach(var callback in this.onErrorCbs) { + callback(); + } + } + unsafe private void onTradesHandler(ulong tradeBuffLen, IntPtr marketStr) { + var market = CString.ToString(marketStr); + FreeString(marketStr); + var tradesList = new List(); + + for (int i = 0 ; i < (int)tradeBuffLen ; i ++) { + tradesList.Add(subTradesBuff[i].ToTrade()); + subTradesBuff[i].Dispose(); + } + + if (!onTradesCbs.ContainsKey(market)) { + return; + } + var trades = new TradesResponse(market, tradesList); + this.onTradesCbs.TryGetValue(market, out var callbacks); + foreach(var callback in callbacks) { + callback(trades); + } + } + unsafe private void onOrderbookHandler(ulong bidActualValueLen, ulong askActualValueLen, IntPtr marketStr, ulong lastUpdateId, ulong updateId) { + var market = CString.ToString(marketStr); + FreeString(marketStr); + + var bidsList = new List(); + var asksList = new List(); + + + for (int i = 0 ; i < (int)bidActualValueLen ; i ++) { + bidsList.Add(subBidsBuff[i].ToAskBid()); + subBidsBuff[i].Dispose(); + } + + for (int i = 0 ; i < (int)askActualValueLen ; i ++) { + asksList.Add(subAsksBuff[i].ToAskBid()); + subAsksBuff[i].Dispose(); + } + + if (!onOrderbookCbs.ContainsKey(market)) { + return; + } + var latestOrderbook = new OrderbookResponse( + market, + asksList, + bidsList, + lastUpdateId, + updateId + ); + + this.onOrderbookCbs.TryGetValue(market, out var callbacks); + foreach(var callback in callbacks) { + callback(latestOrderbook); + } + } + EventWaitHandle ewh = new EventWaitHandle(false, EventResetMode.ManualReset); + Thread ewhThreadHandle = null; + private void onDisconnect() { + ewh.Set(); + _clients.Remove(this); + + foreach(var callback in this.onDisconnectCbs) { + callback(); + } + } + + unsafe private IntPtr InitCbs() { + _clients.Add(this); + fixed (FFIAskBid* bidBuff = subBidsBuff.AsSpan()) { + fixed (FFIAskBid* askBuff = subAsksBuff.AsSpan()) { + fixed (FFITrade* tradeBuff = subTradesBuff.AsSpan()) { + this.onOrderbookCb = this.onOrderbookHandler; + this.onTradesCb = this.onTradesHandler; + this.onPingCb = this.onPingHandler; + this.onErrorCb = this.onErrorHandler; + this.onTradesCb = this.onTradesHandler; + this.onDisconnectCb = this.onDisconnect; + InitCbs( + _client_handle, + this.onErrorCb, + this.onPingCb, + this.onOrderbookCb, + this.onTradesCb, + this.onDisconnectCb, + + (IntPtr)bidBuff, (UIntPtr)subBidsBuff.Length, + (IntPtr)askBuff, (UIntPtr)subAsksBuff.Length, + (IntPtr)tradeBuff, (UIntPtr)subTradesBuff.Length, + out var handle + ); + return handle; + } + } + } + } + + unsafe public ExchangeClient(BinanceClientConfig config) { + handleResult( + ExchangeClient.InitBinance(config, out var client_handle) + ); + + _client_handle = client_handle; + _sub_handle = InitCbs(); + } + + unsafe public ExchangeClient(NashClientConfig config) { + handleResult( + ExchangeClient.InitNash(config.apikey, config.secret, config.clientId, config.environment, config.timeout, config.affiliateCode, out var client_handle) + ); + _client_handle = client_handle; + _sub_handle = InitCbs(); + } + unsafe public ExchangeClient(CoinbaseClientConfig config) { + handleResult( + ExchangeClient.InitCoinbase(config.apikey, config.secret, config.passphrase, config.sandbox, out var client_handle) + ); + _client_handle = client_handle; + _sub_handle = InitCbs(); + } + + unsafe public double GetPriceTicker(string market) { + var result = ExchangeClient.GetPriceTicker(_client_handle, market, out double price); + return price; + } + unsafe public OrderbookResponse Orderbook(string market) { + var bids = new FFIAskBid[512]; + var asks = new FFIAskBid[512]; + var bidsLen = bids.Length; + var asksLen = asks.Length; + var bidsList = new List(); + var asksList = new List(); + ulong lastUpdateId = 0; + ulong updateId = 0; + + fixed (FFIAskBid* bidBuff = bids.AsSpan()) { + fixed (FFIAskBid* askBuff = asks.AsSpan()) { + handleResult( + ExchangeClient.Orderbook( + _client_handle, + market, + (IntPtr)bidBuff, (ulong) bidsLen, out var actualBidsLen, + (IntPtr)askBuff, (ulong) asksLen, out var actualAsksLen, + out lastUpdateId, + out updateId + ) + ); + for (int i = 0 ; i < Math.Min(bidsLen, (int)actualBidsLen) ; i ++) { + bidsList.Add(bids[i].ToAskBid()); + bids[i].Dispose(); + } + for (int i = 0 ; i < Math.Min(asksLen, (int)actualAsksLen) ; i ++) { + asksList.Add(asks[i].ToAskBid()); + asks[i].Dispose(); + } + } + } + + return new OrderbookResponse( + market, + asksList, + bidsList, + lastUpdateId, + updateId + ); + } + + unsafe public IEnumerable GetHistoricRates(GetHistoricRatesRequest req) { + var limit = req.paginator == null ? 0 : req.paginator.limit; + var candles = new Candle[Math.Max(limit, 256)]; + var candlesLen = candles.Length; + var candlesList = new List(); + + + fixed (Candle* candleBuff = candles.AsSpan()) { + handleResult(ExchangeClient.GetHistoricRates( + _client_handle, + req.market, req.interval, req.paginator, + (IntPtr)candleBuff, (UIntPtr)candlesLen, out var actualCandleLen + )); + for (int i = 0 ; i < (int)actualCandleLen ; i ++) { + candlesList.Add(candles[i]); + } + } + + return candlesList; + } + unsafe public IEnumerable GetHistoricTrades(GetHistoricTradesRequest req) { + var limit = req.paginator == null ? 0 : req.paginator.limit; + var trades = new FFITrade[Math.Max(limit, 256)]; + var tradesLen = trades.Length; + var tradesList = new List(); + + + fixed (FFITrade* tradeBuff = trades.AsSpan()) { + handleResult(ExchangeClient.GetHistoricTrades( + _client_handle, + req.market, + req.paginator, + (IntPtr)tradeBuff, (UIntPtr)tradesLen, out var actualTradeLen + )); + for (int i = 0 ; i < (int)actualTradeLen ; i ++) { + tradesList.Add(trades[i].ToTrade()); + trades[i].Dispose(); + } + } + + return tradesList; + } + + + unsafe public Order LimitBuy(LimitOrderRequest request) { + handleResult(ExchangeClient.PlaceOrder( + _client_handle, + request.market, + request.size, + true, + request.price, + Side.Buy, + request.timeInForce, + request.timeInForceDurationMs, + request.postOnly, + out FFIOrder ffiOrder + )); + var order = ffiOrder.ToOrder(); + ffiOrder.Dispose(); + return order; + } + unsafe public Order LimitSell(LimitOrderRequest request) { + handleResult(ExchangeClient.PlaceOrder( + _client_handle, + request.market, + request.size, + true, + request.price, + Side.Sell, + request.timeInForce, + request.timeInForceDurationMs, + request.postOnly, + out FFIOrder ffiOrder + )); + var order = ffiOrder.ToOrder(); + ffiOrder.Dispose(); + return order; + } + + unsafe public Order MarketBuy(MarketOrderRequest request) { + handleResult(ExchangeClient.PlaceOrder( + _client_handle, + request.market, + request.size, + false, + null, + Side.Buy, + TimeInForce.GTC, + 0, + false, + out FFIOrder ffiOrder + )); + var order = ffiOrder.ToOrder(); + ffiOrder.Dispose(); + return order; + } + + unsafe public void CancelOrder(string orderId, string market) { + handleResult(ExchangeClient.CancelOrder( + _client_handle, + orderId, + market + )); + } + + unsafe public Order GetOrder(string orderId, string market) { + handleResult(ExchangeClient.GetOrder( + _client_handle, + orderId, + market, + out var result + )); + + var order = result.ToOrder(); + result.Dispose(); + return order; + } + + unsafe public void CancelOrder(string orderId) { + CancelOrder(orderId, null); + } + + unsafe public Order MarketSell(MarketOrderRequest request) { + handleResult(ExchangeClient.PlaceOrder( + _client_handle, + request.market, + request.size, + false, + null, + Side.Sell, + TimeInForce.GTC, + 0, + false, + out FFIOrder ffiOrder + )); + var order = ffiOrder.ToOrder(); + ffiOrder.Dispose(); + return order; + } + unsafe public IEnumerable GetAllOpenOrders() { + var orders = new FFIOrder[256]; + var ordersLen = orders.Length; + var ordersList = new List(); + + + fixed (FFIOrder* orderBuff = orders.AsSpan()) { + handleResult(ExchangeClient.GetAllOpenOrders( + _client_handle, + (IntPtr)orderBuff, (UIntPtr)ordersLen, out var actualCandleLen + )); + for (int i = 0 ; i < (int)actualCandleLen ; i ++) { + ordersList.Add(orderBuff[i].ToOrder()); + orderBuff[i].Dispose(); + } + } + + return ordersList; + } + + unsafe public IEnumerable GetOrderHistory(GetOrderHistoryRequest req) { + var limit = req.paginator == null ? 0 : req.paginator.limit; + var orders = new FFIOrder[Math.Max(limit, 256)]; + var ordersLen = orders.Length; + var ordersList = new List(); + + + fixed (FFIOrder* orderBuff = orders.AsSpan()) { + handleResult(ExchangeClient.GetOrderHistory( + _client_handle, + req.market, req.paginator, + (IntPtr)orderBuff, (UIntPtr)ordersLen, out var actualCandleLen + )); + for (int i = 0 ; i < (int)actualCandleLen ; i ++) { + ordersList.Add(orderBuff[i].ToOrder()); + orderBuff[i].Dispose(); + } + } + + return ordersList; + } + + unsafe public IEnumerable GetTradeHistory(GetTradeHistoryRequest req) { + var limit = req.paginator == null ? 0 : req.paginator.limit; + var trades = new FFITrade[Math.Max(limit, 256)]; + var tradesLen = trades.Length; + var tradesList = new List(); + + + fixed (FFITrade* tradeBuff = trades.AsSpan()) { + handleResult(ExchangeClient.GetTradeHistory( + _client_handle, + req.market, req.orderId, req.paginator, + (IntPtr)tradeBuff, (UIntPtr)tradesLen, out var actualCandleLen + )); + for (int i = 0 ; i < (int)actualCandleLen ; i ++) { + tradesList.Add(tradeBuff[i].ToTrade()); + tradeBuff[i].Dispose(); + } + } + + return tradesList; + } + + unsafe public IEnumerable GetAccountBalances(Paginator paginator) { + var limit = paginator == null ? 0 : paginator.limit; + var balances = new FFIBalance[Math.Max(limit, 256)]; + var balancesLen = balances.Length; + var balancesList = new List(); + + + fixed (FFIBalance* balanceBuff = balances.AsSpan()) { + handleResult(ExchangeClient.GetAccountBalances( + _client_handle, + paginator, + (IntPtr)balanceBuff, (UIntPtr)balancesLen, out var actualCandleLen + )); + for (int i = 0 ; i < (int)actualCandleLen ; i ++) { + balancesList.Add(balanceBuff[i].ToBalance()); + balanceBuff[i].Dispose(); + } + } + + return balancesList; + } + public IEnumerable GetAccountBalances() { + return this.GetAccountBalances(null); + } + + unsafe public IEnumerable CancelAllOrders(string market) { + var orders = new IntPtr[1024]; + var ordersLen = orders.Length; + var cancelledOrdersList = new List(); + fixed (IntPtr* orderBuff = orders.AsSpan()) { + handleResult(ExchangeClient.CancelAllOrders( + _client_handle, + market, + (IntPtr)orderBuff, (UIntPtr)ordersLen, out var actualLen + )); + for (int i = 0 ; i < (int)actualLen ; i ++) { + cancelledOrdersList.Add(CString.ToString(orders[i])); + ExchangeClient.FreeString(orders[i]); + } + } + return cancelledOrdersList; + } + + unsafe public IEnumerable ReceivePairs() { + var marketPairs = new FFIMarketPair[1024]; + var marketPairsLen = marketPairs.Length; + var pairs = new List(); + fixed (FFIMarketPair* buff = marketPairs.AsSpan()) { + handleResult(ExchangeClient.ReceivePairs( + _client_handle, + (IntPtr)buff, (UIntPtr)marketPairsLen, out var actualLen + )); + for (int i = 0 ; i < (int)actualLen ; i ++) { + pairs.Add(marketPairs[i].ToMarketPair()); + marketPairs[i].Dispose(); + } + } + return pairs; + } + + private void WaitForEwh() { + ewh.WaitOne(); + } + + private void SetupEWH() { + if (ewhThreadHandle != null) { + return; + } + + ewhThreadHandle = new Thread(this.WaitForEwh); + ewhThreadHandle.Start(); + } + + public void Listen( + OnError onError, + OnPing onPing + ) { + this.onErrorCbs.Add(onError); + this.onPingCbs.Add(onPing); + + this.SetupEWH(); + + } + + unsafe public void SubscribeToOrderbook(string market, OnOrderbook onOrderbook) { + if (!this.onOrderbookCbs.ContainsKey(market)) { + this.onOrderbookCbs.Add(market, new List()); + } + this.onOrderbookCbs.TryGetValue(market, out var callbacks); + callbacks.Add(onOrderbook); + handleFFIResult(SubscribeToOrderbook(this._client_handle, this._sub_handle, market)); + this.SetupEWH(); + } + unsafe public void SubscribeToTrades(string market, OnTrades onTrades) { + if (!this.onTradesCbs.ContainsKey(market)) { + this.onTradesCbs.Add(market, new List()); + } + this.onTradesCbs.TryGetValue(market, out var callbacks); + callbacks.Add(onTrades); + handleFFIResult(SubscribeToTrades(this._client_handle, this._sub_handle, market)); + this.SetupEWH(); + } + + public void SubscribeToDisconnect(OnDisconnect cb) { + this.onDisconnectCbs.Add(cb); + } + + unsafe public void Disconnect() { + Disconnect(_sub_handle); + } + } +} diff --git a/bindings/csharp/FFIResult.cs b/bindings/csharp/FFIResult.cs new file mode 100644 index 0000000..4cc4737 --- /dev/null +++ b/bindings/csharp/FFIResult.cs @@ -0,0 +1,143 @@ +namespace OpenLimits +{ + + using System; + using System.Runtime.InteropServices; + + // Used to store a result from rust to C# + [StructLayout(LayoutKind.Sequential)] + internal struct FFIResult { + public ResultTag tag; + public IntPtr message; + } + + // Contains the different error types + internal enum ResultTag { + Ok, + InvalidArgument, + BinanceError, + CoinbaseError, + NashProtocolError, + MissingImplementation, + AssetNotFound, + NoApiKeySet, + InternalServerError, + ServiceUnavailable, + Unauthorized, + SymbolNotFound, + SocketError, + GetTimestampFailed, + ReqError, + InvalidHeaderError, + InvalidPayloadSignature, + IoError, + PoisonError, + JsonError, + ParseFloatError, + UrlParserError, + Tungstenite, + TimestampError, + UnkownResponse, + NotParsableResponse, + MissingParameter, + WebSocketMessageNotSupported, + + InitializeException, + SubscribeException, + NoMarketPair + } + + public class OpenLimitsError: Exception { + public OpenLimitsError(string message): base(message) { } + + } + + public class BinanceError : OpenLimitsError { + public BinanceError(string message): base(message) { } + }; + public class CoinbaseError : OpenLimitsError { + public CoinbaseError(string message): base(message) { } + }; + public class NashProtocolError : OpenLimitsError { + public NashProtocolError(string message): base(message) { } + }; + public class MissingImplementation : OpenLimitsError { + public MissingImplementation(string message): base(message) { } + }; + public class AssetNotFound : OpenLimitsError { + public AssetNotFound(string message): base(message) { } + }; + public class NoApiKeySet : OpenLimitsError { + public NoApiKeySet(string message): base(message) { } + }; + public class InternalServerError : OpenLimitsError { + public InternalServerError(string message): base(message) { } + }; + public class ServiceUnavailable : OpenLimitsError { + public ServiceUnavailable(string message): base(message) { } + }; + public class Unauthorized : OpenLimitsError { + public Unauthorized(string message): base(message) { } + }; + public class SymbolNotFound : OpenLimitsError { + public SymbolNotFound(string message): base(message) { } + }; + public class SocketError : OpenLimitsError { + public SocketError(string message): base(message) { } + }; + public class GetTimestampFailed : OpenLimitsError { + public GetTimestampFailed(string message): base(message) { } + }; + public class ReqError : OpenLimitsError { + public ReqError(string message): base(message) { } + }; + public class InvalidHeaderError : OpenLimitsError { + public InvalidHeaderError(string message): base(message) { } + }; + public class InvalidPayloadSignature : OpenLimitsError { + public InvalidPayloadSignature(string message): base(message) { } + }; + public class IoError : OpenLimitsError { + public IoError(string message): base(message) { } + }; + public class PoisonError : OpenLimitsError { + public PoisonError(string message): base(message) { } + }; + public class JsonError : OpenLimitsError { + public JsonError(string message): base(message) { } + }; + public class ParseFloatError : OpenLimitsError { + public ParseFloatError(string message): base(message) { } + }; + public class UrlParserError : OpenLimitsError { + public UrlParserError(string message): base(message) { } + }; + public class Tungstenite : OpenLimitsError { + public Tungstenite(string message): base(message) { } + }; + public class TimestampError : OpenLimitsError { + public TimestampError(string message): base(message) { } + }; + public class UnkownResponse : OpenLimitsError { + public UnkownResponse(string message): base(message) { } + }; + public class NotParsableResponse : OpenLimitsError { + public NotParsableResponse(string message): base(message) { } + }; + public class MissingParameter : OpenLimitsError { + public MissingParameter(string message): base(message) { } + }; + public class WebSocketMessageNotSupported : OpenLimitsError { + public WebSocketMessageNotSupported(string message): base(message) { } + }; + + public class InitializeException : OpenLimitsError { + public InitializeException(string message): base(message) { } + }; + public class SubscribeException : OpenLimitsError { + public SubscribeException(string message): base(message) { } + }; + public class NoMarketPair : OpenLimitsError { + public NoMarketPair(string message): base(message) { } + }; +} \ No newline at end of file diff --git a/bindings/csharp/GetHistoricRatesRequest.cs b/bindings/csharp/GetHistoricRatesRequest.cs new file mode 100644 index 0000000..2a32d24 --- /dev/null +++ b/bindings/csharp/GetHistoricRatesRequest.cs @@ -0,0 +1,44 @@ +namespace OpenLimits +{ + using System.Runtime.InteropServices; + + public enum Interval { + OneMinute, + ThreeMinutes, + FiveMinutes, + FifteenMinutes, + ThirtyMinutes, + OneHour, + TwoHours, + FourHours, + SixHours, + EightHours, + TwelveHours, + OneDay, + ThreeDays, + OneWeek, + OneMonth, + } + + [StructLayout(LayoutKind.Sequential)] + public struct GetHistoricRatesRequest + { + public readonly string market; + public readonly Interval interval; + public readonly Paginator paginator; + + public GetHistoricRatesRequest(string market, Interval interval, Paginator paginator) + { + this.market = market; + this.interval = interval; + this.paginator = paginator; + } + + public GetHistoricRatesRequest(string market, Interval interval) + { + this.market = market; + this.interval = interval; + this.paginator = null; + } + } +} \ No newline at end of file diff --git a/bindings/csharp/GetHistoricTradesRequest.cs b/bindings/csharp/GetHistoricTradesRequest.cs new file mode 100644 index 0000000..93fc688 --- /dev/null +++ b/bindings/csharp/GetHistoricTradesRequest.cs @@ -0,0 +1,22 @@ +namespace OpenLimits +{ + using System.Runtime.InteropServices; + [StructLayout(LayoutKind.Sequential, Pack=1)] + public struct GetHistoricTradesRequest + { + public readonly string market; + public readonly Paginator paginator; + + public GetHistoricTradesRequest(string market, Paginator paginator) + { + this.market = market; + this.paginator = paginator; + } + + public GetHistoricTradesRequest(string market) + { + this.market = market; + this.paginator = null; + } + } +} \ No newline at end of file diff --git a/bindings/csharp/GetOrderHistoryRequest.cs b/bindings/csharp/GetOrderHistoryRequest.cs new file mode 100644 index 0000000..487738a --- /dev/null +++ b/bindings/csharp/GetOrderHistoryRequest.cs @@ -0,0 +1,20 @@ +namespace OpenLimits +{ + public struct GetOrderHistoryRequest + { + public readonly string market; + public readonly Paginator paginator; + + public GetOrderHistoryRequest(string market, Paginator paginator) + { + this.market = market; + this.paginator = paginator; + } + + public GetOrderHistoryRequest(string market) + { + this.market = market; + this.paginator = null; + } + } +} \ No newline at end of file diff --git a/bindings/csharp/GetTradeHistoryRequest.cs b/bindings/csharp/GetTradeHistoryRequest.cs new file mode 100644 index 0000000..6b04a18 --- /dev/null +++ b/bindings/csharp/GetTradeHistoryRequest.cs @@ -0,0 +1,23 @@ +namespace OpenLimits +{ + public struct GetTradeHistoryRequest + { + public readonly string market; + public readonly string orderId; + public readonly Paginator paginator; + + public GetTradeHistoryRequest(string market, string orderId, Paginator paginator) + { + this.market = market; + this.orderId = orderId; + this.paginator = paginator; + } + + public GetTradeHistoryRequest(string market, string orderId) + { + this.market = market; + this.orderId = orderId; + this.paginator = null; + } + } +} \ No newline at end of file diff --git a/bindings/csharp/LICENSE.txt b/bindings/csharp/LICENSE.txt new file mode 100644 index 0000000..dcdf74a --- /dev/null +++ b/bindings/csharp/LICENSE.txt @@ -0,0 +1,25 @@ +BSD 2-Clause License + +Copyright (c) 2020, openlimits +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/bindings/csharp/LimitOrderRequest.cs b/bindings/csharp/LimitOrderRequest.cs new file mode 100644 index 0000000..41c7a78 --- /dev/null +++ b/bindings/csharp/LimitOrderRequest.cs @@ -0,0 +1,48 @@ +namespace OpenLimits +{ + public struct LimitOrderRequest + { + public readonly string price; + public readonly string size; + public readonly string market; + public readonly TimeInForce timeInForce; + public readonly ulong timeInForceDurationMs; + public readonly bool postOnly; + + public LimitOrderRequest(string price, string size, string market, TimeInForce timeInForce, ulong timeInForceDurationMs, bool postOnly) + { + this.price = price; + this.size = size; + this.market = market; + this.timeInForce = timeInForce; + this.timeInForceDurationMs = timeInForceDurationMs; + this.postOnly = postOnly; + } + + public static LimitOrderRequest immediateOrCancel(string price, string size, string market) { + return new LimitOrderRequest(price, size, market, TimeInForce.IOC, 0, false); + } + public static LimitOrderRequest goodTillCancelled(string price, string size, string market) { + return new LimitOrderRequest(price, size, market, TimeInForce.GTC, 0, false); + } + public static LimitOrderRequest fillOrKill(string price, string size, string market) { + return new LimitOrderRequest(price, size, market, TimeInForce.FOK, 0, false); + } + public static LimitOrderRequest goodTillTIme(string price, string size, string market, ulong timeInForceDurationMs) { + return new LimitOrderRequest(price, size, market, TimeInForce.GTT, timeInForceDurationMs, false); + } + + public static LimitOrderRequest immediateOrCancelPostOnly(string price, string size, string market) { + return new LimitOrderRequest(price, size, market, TimeInForce.IOC, 0, true); + } + public static LimitOrderRequest goodTillCancelledPostOnly(string price, string size, string market) { + return new LimitOrderRequest(price, size, market, TimeInForce.GTC, 0, true); + } + public static LimitOrderRequest fillOrKillPostOnly(string price, string size, string market) { + return new LimitOrderRequest(price, size, market, TimeInForce.FOK, 0, true); + } + public static LimitOrderRequest goodTillTImePostOnly(string price, string size, string market, ulong timeInForceDurationMs) { + return new LimitOrderRequest(price, size, market, TimeInForce.GTT, timeInForceDurationMs, true); + } + } +} \ No newline at end of file diff --git a/bindings/csharp/Liquidity.cs b/bindings/csharp/Liquidity.cs new file mode 100644 index 0000000..82bbd2d --- /dev/null +++ b/bindings/csharp/Liquidity.cs @@ -0,0 +1,9 @@ +namespace OpenLimits +{ + public enum Liquidity + { + Unknown, + Maker, + Taker + } +} \ No newline at end of file diff --git a/bindings/csharp/MarketOrderRequest.cs b/bindings/csharp/MarketOrderRequest.cs new file mode 100644 index 0000000..ffa6bdc --- /dev/null +++ b/bindings/csharp/MarketOrderRequest.cs @@ -0,0 +1,14 @@ +namespace OpenLimits +{ + public struct MarketOrderRequest + { + public readonly string size; + public readonly string market; + + public MarketOrderRequest(string size, string market) + { + this.size = size; + this.market = market; + } + } +} \ No newline at end of file diff --git a/bindings/csharp/MarketPair.cs b/bindings/csharp/MarketPair.cs new file mode 100644 index 0000000..8982383 --- /dev/null +++ b/bindings/csharp/MarketPair.cs @@ -0,0 +1,61 @@ +namespace OpenLimits +{ + using System.Runtime.InteropServices; + using System; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct FFIMarketPair + { + public readonly IntPtr baseSymbol; + public readonly IntPtr quote; + public readonly IntPtr symbol; + public readonly IntPtr baseIncrement; + public readonly IntPtr quoteIncrement; + public readonly IntPtr baseMinPrice; + public readonly IntPtr quoteMinPrice; + + public void Dispose() { + ExchangeClient.FreeString(baseSymbol); + ExchangeClient.FreeString(quote); + ExchangeClient.FreeString(symbol); + ExchangeClient.FreeString(baseIncrement); + ExchangeClient.FreeString(quoteIncrement); + ExchangeClient.FreeString(baseMinPrice); + ExchangeClient.FreeString(quoteMinPrice); + } + + public MarketPair ToMarketPair() { + return new MarketPair( + CString.ToString(this.baseSymbol), + CString.ToString(this.quote), + CString.ToString(this.symbol), + CString.ToString(this.baseIncrement), + CString.ToString(this.quoteIncrement), + CString.ToString(this.baseMinPrice), + CString.ToString(this.quoteMinPrice) + ); + } + } + + public struct MarketPair + { + public readonly string baseSymbol; + public readonly string quote; + public readonly string symbol; + public readonly string baseIncrement; + public readonly string quoteIncrement; + public readonly string baseMinPrice; + public readonly string quoteMinPrice; + + public MarketPair(string baseSymbol, string quote, string symbol, string baseIncrement, string quoteIncrement, string baseMinPrice, string quoteMinPrice) + { + this.baseSymbol = baseSymbol; + this.quote = quote; + this.symbol = symbol; + this.baseIncrement = baseIncrement; + this.quoteIncrement = quoteIncrement; + this.baseMinPrice = baseMinPrice; + this.quoteMinPrice = quoteMinPrice; + } + } +} \ No newline at end of file diff --git a/bindings/csharp/NashClientConfig.cs b/bindings/csharp/NashClientConfig.cs new file mode 100644 index 0000000..857e57b --- /dev/null +++ b/bindings/csharp/NashClientConfig.cs @@ -0,0 +1,42 @@ +using System.Diagnostics; +using System.Runtime.InteropServices; +namespace OpenLimits +{ + public enum NashEnvironment { + Sandbox, + Production + } + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct NashClientConfig + { + public readonly string apikey; + public readonly string secret; + public readonly string affiliateCode; + + public readonly ulong clientId; + public readonly NashEnvironment environment; + public readonly ulong timeout; + + private NashClientConfig(string apikey, string secret, ulong clientId, NashEnvironment environment, ulong timeout, string affiliateCode) + { + this.apikey = apikey; + this.secret = secret; + this.clientId = clientId; + this.environment = environment; + this.timeout = timeout; + this.affiliateCode = affiliateCode; + } + + static public NashClientConfig Authenticated(string apikey, string secret, ulong clientId, NashEnvironment environment, ulong timeout) { + return new NashClientConfig(apikey, secret, clientId, environment, timeout, null); + } + + static public NashClientConfig Authenticated(string apikey, string secret, string affiliateCode, ulong clientId, NashEnvironment environment, ulong timeout) { + return new NashClientConfig(apikey, secret, clientId, environment, timeout, affiliateCode); + } + + static public NashClientConfig Unauthenticated(ulong clientId, NashEnvironment environment, ulong timeout) { + return new NashClientConfig(null, null, clientId, environment, timeout, null); + } + } +} \ No newline at end of file diff --git a/bindings/csharp/OpenLimits.csproj b/bindings/csharp/OpenLimits.csproj new file mode 100644 index 0000000..27f0948 --- /dev/null +++ b/bindings/csharp/OpenLimits.csproj @@ -0,0 +1,38 @@ + + + Openlimits + 0.1.15 + jankjr + nash + Nash;Openlimits;Trading;Cryptocurrency + + This is the offical openlimits c# wrapper. + + + + LICENSE.txt + + + netcoreapp5.0 + + + true + + + + + + + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + diff --git a/bindings/csharp/Order.cs b/bindings/csharp/Order.cs new file mode 100644 index 0000000..9de76df --- /dev/null +++ b/bindings/csharp/Order.cs @@ -0,0 +1,97 @@ +namespace OpenLimits +{ + using System; + using System.Globalization; + + internal struct FFIOrder + { + public readonly IntPtr id; + public readonly IntPtr marketPair; + public readonly IntPtr clientOrderId; + public readonly ulong createdAt; + public readonly OrderType orderType; + public readonly Side side; + public readonly OrderStatus status; + public readonly IntPtr size; + public readonly IntPtr price; + public readonly IntPtr remaining; + + public void Dispose() { + ExchangeClient.FreeString(id); + ExchangeClient.FreeString(marketPair); + ExchangeClient.FreeString(size); + ExchangeClient.FreeString(price); + ExchangeClient.FreeString(remaining); + } + + public Order ToOrder() { + return new Order( + CString.ToString(this.id), + CString.ToString(this.marketPair), + CString.ToString(this.clientOrderId), + this.createdAt, + this.orderType, + this.side, + this.status, + CString.ToString(this.size), + CString.ToString(this.price), + CString.ToString(this.remaining) + ); + } + } + + public struct Order + { + public readonly string id; + public readonly string marketPair; + public readonly string clientOrderId; + public readonly ulong createdAt; + public readonly OrderType orderType; + public readonly Side side; + public readonly OrderStatus status; + public readonly decimal size; + public readonly decimal? price; + public readonly decimal? remaining; + + public Order(string id, string marketPair, string clientOrderId, ulong createdAt, OrderType orderType, Side side, OrderStatus status, string size, string price, string remaining) + { + this.id = id; + this.marketPair = marketPair; + this.clientOrderId = clientOrderId; + this.createdAt = createdAt; + this.orderType = orderType; + this.side = side; + this.status = status; + + this.size = decimal.Parse(size, System.Globalization.NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture); + this.price = price == null ? default(decimal?) : decimal.Parse(price, System.Globalization.NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture); + this.remaining = remaining == null ? default(decimal?) : decimal.Parse(remaining, System.Globalization.NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture); + } + + public override bool Equals(object obj) + { + return base.Equals(obj); + } + + public override int GetHashCode() + { + return base.GetHashCode(); + } + + public override string ToString() + { + return "Order{" + + "id='" + id + '\'' + + ", market='" + marketPair + '\'' + + ", clientOrderId='" + clientOrderId + '\'' + + ", createdAt=" + createdAt + + ", orderType='" + orderType + '\'' + + ", side='" + side + '\'' + + ", status='" + status + '\'' + + ", size='" + size + '\'' + + ", price='" + price + '\'' + + ", remaining='" + remaining + '\'' + + '}'; + } + } +} \ No newline at end of file diff --git a/bindings/csharp/OrderStatus.cs b/bindings/csharp/OrderStatus.cs new file mode 100644 index 0000000..0e092d6 --- /dev/null +++ b/bindings/csharp/OrderStatus.cs @@ -0,0 +1,16 @@ +namespace OpenLimits +{ + public enum OrderStatus + { + New, + PartiallyFilled, + Filled, + Canceled, + PendingCancel, + Rejected, + Expired, + Open, + Pending, + Active, + } +} \ No newline at end of file diff --git a/bindings/csharp/OrderType.cs b/bindings/csharp/OrderType.cs new file mode 100644 index 0000000..76e95a6 --- /dev/null +++ b/bindings/csharp/OrderType.cs @@ -0,0 +1,11 @@ +namespace OpenLimits +{ + public enum OrderType + { + Limit, + Market, + StopLimit, + StopMarket, + Unknown, + } +} \ No newline at end of file diff --git a/bindings/csharp/Orderbook.cs b/bindings/csharp/Orderbook.cs new file mode 100644 index 0000000..8aed160 --- /dev/null +++ b/bindings/csharp/Orderbook.cs @@ -0,0 +1,29 @@ +namespace OpenLimits { + using System.Collections.Generic; + public class Orderbook { + private readonly Dictionary _bids = new Dictionary(); + private readonly Dictionary _asks = new Dictionary(); + + public void Update(OrderbookResponse changes) { + foreach(var ask in changes.asks) { + if (ask.qty == 0){ + if (_asks.ContainsKey(ask.price)) { + _asks.Remove(ask.price); + } + } else { + _asks.Add(ask.price, ask.qty); + } + } + + foreach(var bid in changes.bids) { + if (bid.qty == 0){ + if (_bids.ContainsKey(bid.price)) { + _bids.Remove(bid.price); + } + } else { + _bids.Add(bid.price, bid.qty); + } + } + } + } +} \ No newline at end of file diff --git a/bindings/csharp/OrderbookResponse.cs b/bindings/csharp/OrderbookResponse.cs new file mode 100644 index 0000000..b81775c --- /dev/null +++ b/bindings/csharp/OrderbookResponse.cs @@ -0,0 +1,23 @@ +namespace OpenLimits +{ + using System.Collections.Generic; + + public class OrderbookResponse + { + readonly public string market; + readonly public IEnumerable asks; + readonly public IEnumerable bids; + + readonly public ulong lastUpdateId; + readonly public ulong updateId; + + public OrderbookResponse(string market, IEnumerable asks, IEnumerable bids, ulong lastUpdateId, ulong updateId) + { + this.market = market; + this.asks = asks; + this.bids = bids; + this.lastUpdateId = lastUpdateId; + this.updateId = updateId; + } + } +} \ No newline at end of file diff --git a/bindings/csharp/Paginator.cs b/bindings/csharp/Paginator.cs new file mode 100644 index 0000000..beba137 --- /dev/null +++ b/bindings/csharp/Paginator.cs @@ -0,0 +1,22 @@ +namespace OpenLimits +{ + using System.Runtime.InteropServices; + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public class Paginator + { + public readonly ulong startTime; + public readonly ulong endTime; + public readonly ulong limit; + public readonly string before; + public readonly string after; + + public Paginator(ulong startTime, ulong endTime, ulong limit, string before, string after) + { + this.startTime = startTime; + this.endTime = endTime; + this.limit = limit; + this.before = before; + this.after = after; + } + } +} \ No newline at end of file diff --git a/bindings/csharp/Side.cs b/bindings/csharp/Side.cs new file mode 100644 index 0000000..fded14c --- /dev/null +++ b/bindings/csharp/Side.cs @@ -0,0 +1,8 @@ +namespace OpenLimits +{ + public enum Side + { + Buy, + Sell + } +} \ No newline at end of file diff --git a/bindings/csharp/Test.cs b/bindings/csharp/Test.cs new file mode 100644 index 0000000..56d27ea --- /dev/null +++ b/bindings/csharp/Test.cs @@ -0,0 +1,16 @@ +using System; +using System.Runtime.InteropServices; + +namespace OpenLimits { + public class Test { + public static void Hello() { + Console.WriteLine("Hello"); + } + + const string NativeLib = "libopenlimits_sharp"; + + [DllImport(NativeLib, EntryPoint = "say_something", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] + unsafe public static extern void SaySomething(); + + } +} \ No newline at end of file diff --git a/bindings/csharp/TimeInForce.cs b/bindings/csharp/TimeInForce.cs new file mode 100644 index 0000000..fc39877 --- /dev/null +++ b/bindings/csharp/TimeInForce.cs @@ -0,0 +1,10 @@ +namespace OpenLimits +{ + public enum TimeInForce + { + GTC, + FOK, + IOC, + GTT + } +} \ No newline at end of file diff --git a/bindings/csharp/Trade.cs b/bindings/csharp/Trade.cs new file mode 100644 index 0000000..fefed07 --- /dev/null +++ b/bindings/csharp/Trade.cs @@ -0,0 +1,91 @@ +namespace OpenLimits +{ + using System.Runtime.InteropServices; + using System; + using System.Globalization; + + + [StructLayout(LayoutKind.Sequential)] + internal struct FFITrade { + public readonly IntPtr id; + public readonly IntPtr buyerOrderId; + public readonly IntPtr sellerOrderId; + public readonly IntPtr marketPair; + + public readonly IntPtr price; + public readonly IntPtr qty; + public readonly IntPtr fees; + public readonly Side side; + public readonly Liquidity liquidity; + public readonly ulong createdAt; + + public void Dispose() { + ExchangeClient.FreeString(id); + ExchangeClient.FreeString(buyerOrderId); + ExchangeClient.FreeString(sellerOrderId); + ExchangeClient.FreeString(marketPair); + ExchangeClient.FreeString(price); + ExchangeClient.FreeString(qty); + ExchangeClient.FreeString(fees); + } + + public Trade ToTrade() { + return new Trade( + CString.ToString(this.id), + CString.ToString(this.buyerOrderId), + CString.ToString(this.sellerOrderId), + CString.ToString(this.marketPair), + CString.ToString(this.price), + CString.ToString(this.qty), + CString.ToString(this.fees), + this.side, + this.liquidity, + this.createdAt + ); + } + } + + public struct Trade { + public readonly string id; + public readonly string buyerOrderId; + public readonly string sellerOrderId; + public readonly string marketPair; + public readonly decimal price; + public readonly decimal qty; + public readonly decimal? fees; + + public readonly Side side; + public readonly Liquidity liquidity; + public readonly ulong createdAt; + + public Trade(string id, string buyerOrderId, string sellerOrderId, string marketPair, string price, string qty, string fees, Side side, Liquidity liquidity, ulong createdAt) + { + this.id = id; + this.buyerOrderId = buyerOrderId; + this.sellerOrderId = sellerOrderId; + this.marketPair = marketPair; + this.price = decimal.Parse(price, System.Globalization.NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture); + this.qty = decimal.Parse(qty, System.Globalization.NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture); + this.fees = fees == null ? default(decimal?): decimal.Parse(fees, System.Globalization.NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture); + this.side = side; + this.liquidity = liquidity; + this.createdAt = createdAt; + } + + public override string ToString() + { + return "Trade{" + + "id='" + id + '\'' + + ", buyer_order_id='" + buyerOrderId + '\'' + + ", seller_order_id='" + sellerOrderId + '\'' + + ", market_pair='" + marketPair + '\'' + + ", price=" + price + + ", qty=" + qty + + ", fees=" + fees + + ", side='" + side + '\'' + + ", liquidity='" + liquidity + '\'' + + ", createdAt=" + createdAt + + '}'; + } + } +} \ No newline at end of file diff --git a/bindings/csharp/TradesResponse.cs b/bindings/csharp/TradesResponse.cs new file mode 100644 index 0000000..6960180 --- /dev/null +++ b/bindings/csharp/TradesResponse.cs @@ -0,0 +1,16 @@ +namespace OpenLimits +{ + using System.Collections.Generic; + + public class TradesResponse + { + readonly public string market; + readonly public IEnumerable trades; + + public TradesResponse(string market, IEnumerable trades) + { + this.market = market; + this.trades = trades; + } + } +} \ No newline at end of file diff --git a/bindings/csharp/lib/Cargo.toml b/bindings/csharp/lib/Cargo.toml new file mode 100644 index 0000000..6b1d6c1 --- /dev/null +++ b/bindings/csharp/lib/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "openlimitssharp" +version = "0.1.0" +authors = ["kjr "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +name = "openlimits_sharp" +crate-type = ["cdylib"] + +[dependencies] +tokio = { version = "0.2.22", features = ["full"] } +chrono = { version = "0.4.11" } +futures-util = "0.3" +thiserror = "1.0.22" +rust_decimal = "1.7.0" +openlimits = { path = "../../../" } diff --git a/bindings/csharp/lib/src/lib.rs b/bindings/csharp/lib/src/lib.rs new file mode 100644 index 0000000..4cf754c --- /dev/null +++ b/bindings/csharp/lib/src/lib.rs @@ -0,0 +1,1594 @@ + +#[no_mangle] +pub extern "cdecl" fn say_something() { + println!("Saying something"); +} + +// use std::{convert::{TryInto}}; +// use rust_decimal::prelude::*; +// use rust_decimal::Decimal; +// use chrono::Duration; +// use openlimits::{ +// OpenLimits, +// exchange::{ +// traits::{ +// ExchangeAccount, +// ExchangeMarketData, +// stream::OpenLimitsWs, +// info::{MarketPair, ExchangeInfoRetrieval} +// }, +// // nash::{ +// // NashCredentials, +// // NashParameters, +// // Environment +// // }, +// binance::{ +// BinanceCredentials, +// BinanceParameters, +// }, +// coinbase::{ +// CoinbaseCredentials, +// CoinbaseParameters, +// }, +// model::{ +// OrderBookRequest, +// GetOrderRequest, +// Liquidity, +// Side, +// CancelAllOrdersRequest, +// CancelOrderRequest, +// OrderType, +// AskBid, +// TimeInForce, +// OpenLimitOrderRequest, +// OrderStatus, +// OpenMarketOrderRequest, +// GetOrderHistoryRequest, +// TradeHistoryRequest, +// GetHistoricTradesRequest, +// GetHistoricRatesRequest, +// GetPriceTickerRequest, +// Paginator, +// Balance, +// Order, +// Trade, +// Interval, +// Candle, +// websocket::{Subscription, OpenLimitsWebSocketMessage, WebSocketResponse} +// } +// }, +// errors::OpenLimitsError, +// // any_exchange::{AnyExchange, InitAnyExchange, AnyWsExchange}, +// }; +// use tokio::stream::StreamExt; +// use std::{ffi::CStr, ffi::CString, os::raw::c_char}; +// use thiserror::Error; +// +// #[repr(u32)] +// #[derive(Debug, Copy, Clone)] +// pub enum FFIInterval { +// OneMinute, +// ThreeMinutes, +// FiveMinutes, +// FifteenMinutes, +// ThirtyMinutes, +// OneHour, +// TwoHours, +// FourHours, +// SixHours, +// EightHours, +// TwelveHours, +// OneDay, +// ThreeDays, +// OneWeek, +// OneMonth +// } +// +// #[repr(C)] +// #[derive(Debug, Copy, Clone)] +// pub struct FFIMarketPair { +// base: *mut c_char, +// quote: *mut c_char, +// symbol: *mut c_char, +// base_increment: *mut c_char, +// quote_increment: *mut c_char, +// base_min_price: *mut c_char, +// quote_min_price: *mut c_char, +// } +// +// fn interval_from_ffi_interval( +// interval: FFIInterval +// ) -> Result { +// #[allow(unreachable_patterns)] +// match interval { +// FFIInterval::OneMinute => Ok(Interval::OneMinute), +// FFIInterval::ThreeMinutes => Ok(Interval::ThreeMinutes), +// FFIInterval::FiveMinutes => Ok(Interval::FiveMinutes), +// FFIInterval::FifteenMinutes => Ok(Interval::FifteenMinutes), +// FFIInterval::ThirtyMinutes => Ok(Interval::ThirtyMinutes), +// FFIInterval::OneHour => Ok(Interval::OneHour), +// FFIInterval::TwoHours => Ok(Interval::TwoHours), +// FFIInterval::FourHours => Ok(Interval::FourHours), +// FFIInterval::SixHours => Ok(Interval::SixHours), +// FFIInterval::EightHours => Ok(Interval::EightHours), +// FFIInterval::TwelveHours => Ok(Interval::TwelveHours), +// FFIInterval::OneDay => Ok(Interval::OneDay), +// FFIInterval::ThreeDays => Ok(Interval::ThreeDays), +// FFIInterval::OneWeek => Ok(Interval::OneWeek), +// FFIInterval::OneMonth => Ok(Interval::OneMonth), +// _ => Err(format!("Invalid interval value {:?}", interval)) +// } +// } +// +// +// #[repr(C)] +// #[derive(Debug, Copy, Clone)] +// pub struct FFICandle { +// time: u64, +// low: f64, +// high: f64, +// open: f64, +// close: f64, +// volume: f64, +// } +// +// #[repr(C)] +// #[derive(Debug, Copy, Clone)] +// pub struct FFIPaginator { +// start_time: u64, +// end_time: u64, +// limit: u64, +// before: *mut c_char, +// after: *mut c_char, +// } +// +// +// fn string_to_c_str(s: String) -> *mut c_char { +// let cex = CString::new(s).expect("Failed to create CString!"); +// let raw = cex.into_raw(); +// // println!("Handling ownership of {:?} to c#", raw); +// +// raw +// } +// +// +// #[repr(C)] +// #[derive(Debug, Copy, Clone)] +// pub struct FFIBalance { +// asset: *mut c_char, +// total: *mut c_char, +// free: *mut c_char, +// } +// +// fn to_ffi_balance(b: Balance) -> FFIBalance { +// FFIBalance { +// asset: string_to_c_str(b.asset), +// total: string_to_c_str(b.total.to_string()), +// free: string_to_c_str(b.free.to_string()) +// } +// } +// +// fn market_pair_to_ffi(pair: MarketPair) -> FFIMarketPair { +// let base_min_price = pair.min_base_trade_size.map(|f|string_to_c_str(f.to_string())).unwrap_or(std::ptr::null_mut()); +// let quote_min_price = pair.min_quote_trade_size.map(|f|string_to_c_str(f.to_string())).unwrap_or(std::ptr::null_mut()); +// +// FFIMarketPair { +// base: string_to_c_str(pair.base), +// quote: string_to_c_str(pair.quote), +// symbol: string_to_c_str(pair.symbol), +// base_increment: string_to_c_str(pair.base_increment.to_string()), +// quote_increment: string_to_c_str(pair.quote_increment.to_string()), +// base_min_price, +// quote_min_price, +// } +// } +// +// fn c_str_to_string(s: *mut c_char) -> Result { +// let str = unsafe { CStr::from_ptr(s) }; +// str.to_str().map(String::from) +// } +// fn nullable_cstr(s: *mut c_char) -> Result, std::str::Utf8Error> { +// if s.is_null() { +// Ok(None) +// } else { +// c_str_to_string(s).map(Some) +// } +// } +// +// +// impl TryInto for FFIPaginator { +// type Error = std::str::Utf8Error; +// fn try_into(self) -> Result { +// Ok( +// Paginator { +// start_time: match self.start_time { 0 => None, v => Some(v) }, +// end_time: match self.end_time { 0 => None, v => Some(v) }, +// limit: match self.limit { 0 => None, v => Some(v) }, +// before: nullable_cstr(self.before)?, +// after: nullable_cstr(self.after)?, +// } +// ) +// } +// } +// +// +// #[derive(Error, Debug)] +// pub enum OpenlimitsSharpError { +// #[error("Invalid argument {0}")] +// InvalidArgument(String), +// #[error("Failed to initialize: {0}")] +// InitializeException(String), +// #[error("Failed to subscribe: {0}")] +// SubscribeException(String), +// #[error("{0}")] +// OpenLimitsError(#[from] OpenLimitsError) +// } +// +// #[repr(u32)] +// #[derive(Debug, Copy, Clone)] +// pub enum OpenLimitsResultTag { +// Ok, +// InvalidArgument, +// BinanceError, +// CoinbaseError, +// NashProtocolError, +// MissingImplementation, +// AssetNotFound, +// NoApiKeySet, +// InternalServerError, +// ServiceUnavailable, +// Unauthorized, +// SymbolNotFound, +// SocketError, +// GetTimestampFailed, +// ReqError, +// InvalidHeaderError, +// InvalidPayloadSignature, +// IoError, +// PoisonError, +// JsonError, +// ParseFloatError, +// UrlParserError, +// Tungstenite, +// TimestampError, +// UnkownResponse, +// NotParsableResponse, +// MissingParameter, +// +// WebSocketMessageNotSupported, +// +// InitializeException, +// SubscribeException, +// NoMarketPair +// } +// +// #[repr(C)] +// #[derive(Debug, Copy, Clone)] +// pub struct OpenLimitsResult { +// tag: OpenLimitsResultTag, +// message: *mut c_char +// } +// +// fn result_to_ffi(r: Result<(), OpenlimitsSharpError>) -> OpenLimitsResult { +// match r { +// Ok(_) => OpenLimitsResult { tag: OpenLimitsResultTag::Ok, message: std::ptr::null_mut() }, +// Err(e) => { +// match e { +// OpenlimitsSharpError::InvalidArgument(msg) => OpenLimitsResult { tag: OpenLimitsResultTag::InvalidArgument, message: string_to_c_str(msg) }, +// OpenlimitsSharpError::InitializeException(msg) => OpenLimitsResult { tag: OpenLimitsResultTag::InitializeException, message: string_to_c_str(msg) }, +// OpenlimitsSharpError::SubscribeException(msg) => OpenLimitsResult { tag: OpenLimitsResultTag::SubscribeException, message: string_to_c_str(msg) }, +// OpenlimitsSharpError::OpenLimitsError(e) => { +// let message = match &e { +// OpenLimitsError::BinanceError(e) => e.msg.clone(), +// OpenLimitsError::CoinbaseError(e) => e.message.clone(), +// OpenLimitsError::NashProtocolError(e) => e.0.to_string(), +// OpenLimitsError::MissingImplementation(e) => e.message.clone(), +// OpenLimitsError::AssetNotFound() => String::from("Asset not found"), +// OpenLimitsError::NoApiKeySet() => String::from("No api key set"), +// OpenLimitsError::InternalServerError() => String::from("Internal server error"), +// OpenLimitsError::ServiceUnavailable() => String::from("Service unavailable"), +// OpenLimitsError::Unauthorized() => String::from("Unauthorized"), +// OpenLimitsError::SymbolNotFound() => String::from("Symbol not found"), +// OpenLimitsError::SocketError() => String::from("Socket error"), +// OpenLimitsError::GetTimestampFailed() => String::from("Get timestamp failed"), +// OpenLimitsError::ReqError(e) => e.to_string(), +// OpenLimitsError::InvalidHeaderError(e) => e.to_string(), +// OpenLimitsError::InvalidPayloadSignature(e) => e.to_string(), +// OpenLimitsError::IoError(e) => e.to_string(), +// OpenLimitsError::PoisonError() => String::from("Poison error"), +// OpenLimitsError::JsonError(e) => e.to_string(), +// OpenLimitsError::ParseFloatError(e) => e.to_string(), +// OpenLimitsError::UrlParserError(e) => e.to_string(), +// OpenLimitsError::Tungstenite(e) => e.to_string(), +// OpenLimitsError::TimestampError(e) => e.to_string(), +// OpenLimitsError::UnkownResponse(e) => e.clone(), +// OpenLimitsError::NotParsableResponse(e) => e.clone(), +// OpenLimitsError::MissingParameter(e) => e.clone(), +// OpenLimitsError::WebSocketMessageNotSupported() => String::from("WebSocket message not supported"), +// OpenLimitsError::NoMarketPair => String::from("No market pair") +// }; +// let tag = match &e { +// OpenLimitsError::BinanceError(_) => OpenLimitsResultTag::BinanceError, +// OpenLimitsError::CoinbaseError(_) => OpenLimitsResultTag::CoinbaseError, +// OpenLimitsError::NashProtocolError(_) => OpenLimitsResultTag::NashProtocolError, +// OpenLimitsError::MissingImplementation(_) => OpenLimitsResultTag::MissingImplementation, +// OpenLimitsError::AssetNotFound() => OpenLimitsResultTag::AssetNotFound, +// OpenLimitsError::NoApiKeySet() => OpenLimitsResultTag::NoApiKeySet, +// OpenLimitsError::InternalServerError() => OpenLimitsResultTag::InternalServerError, +// OpenLimitsError::ServiceUnavailable() => OpenLimitsResultTag::ServiceUnavailable, +// OpenLimitsError::Unauthorized() => OpenLimitsResultTag::Unauthorized, +// OpenLimitsError::SymbolNotFound() => OpenLimitsResultTag::SymbolNotFound, +// OpenLimitsError::SocketError() => OpenLimitsResultTag::SocketError, +// OpenLimitsError::GetTimestampFailed() => OpenLimitsResultTag::GetTimestampFailed, +// OpenLimitsError::ReqError(_) => OpenLimitsResultTag::ReqError, +// OpenLimitsError::InvalidHeaderError(_) => OpenLimitsResultTag::InvalidHeaderError, +// OpenLimitsError::InvalidPayloadSignature(_) => OpenLimitsResultTag::InvalidPayloadSignature, +// OpenLimitsError::IoError(_) => OpenLimitsResultTag::IoError, +// OpenLimitsError::PoisonError() => OpenLimitsResultTag::PoisonError, +// OpenLimitsError::JsonError(_) => OpenLimitsResultTag::JsonError, +// OpenLimitsError::ParseFloatError(_) => OpenLimitsResultTag::ParseFloatError, +// OpenLimitsError::UrlParserError(_) => OpenLimitsResultTag::UrlParserError, +// OpenLimitsError::Tungstenite(_) => OpenLimitsResultTag::Tungstenite, +// OpenLimitsError::TimestampError(_) => OpenLimitsResultTag::TimestampError, +// OpenLimitsError::UnkownResponse(_) => OpenLimitsResultTag::UnkownResponse, +// OpenLimitsError::NotParsableResponse(_) => OpenLimitsResultTag::NotParsableResponse, +// OpenLimitsError::MissingParameter(_) => OpenLimitsResultTag::MissingParameter, +// OpenLimitsError::WebSocketMessageNotSupported() => OpenLimitsResultTag::WebSocketMessageNotSupported, +// OpenLimitsError::NoMarketPair => OpenLimitsResultTag::NoMarketPair, +// }; +// OpenLimitsResult { tag, message: string_to_c_str(message) } +// }, +// } +// } +// } +// } +// +// #[repr(C)] +// #[derive(Debug, Copy, Clone)] +// pub struct FFIAskBid { +// pub price: *mut c_char, +// pub qty: *mut c_char, +// } +// +// #[repr(u32)] +// #[derive(Debug, Copy, Clone)] +// pub enum FFILiquidity { +// Unknown, +// Maker, +// Taker, +// } +// #[repr(u32)] +// #[derive(Debug, Copy, Clone)] +// pub enum FFISide { +// Buy, +// Sell, +// } +// +// #[repr(u32)] +// #[derive(Debug, Copy, Clone)] +// pub enum FFITIF { +// GTC, +// FOK, +// IOC, +// GTT +// } +// +// fn ffitif_to_tif(tif: FFITIF, ms: u64) -> TimeInForce { +// match tif { +// FFITIF::GTC => TimeInForce::GoodTillCancelled, +// FFITIF::IOC => TimeInForce::ImmediateOrCancelled, +// FFITIF::FOK => TimeInForce::FillOrKill, +// FFITIF::GTT => TimeInForce::GoodTillTime( +// Duration::milliseconds(ms as i64) +// ), +// } +// } +// +// #[repr(u32)] +// #[derive(Debug, Copy, Clone)] +// pub enum FFIOrderType { +// Limit, +// Market, +// StopLimit, +// StopMarket, +// Unknown, +// } +// +// fn order_type_to_ffi(t: OrderType) -> FFIOrderType { +// match t { +// OrderType::Limit => FFIOrderType::Limit, +// OrderType::Market => FFIOrderType::Market, +// OrderType::StopLimit => FFIOrderType::StopLimit, +// OrderType::StopMarket => FFIOrderType::StopMarket, +// OrderType::Unknown => FFIOrderType::Unknown, +// } +// } +// +// #[repr(u32)] +// #[derive(Debug, Copy, Clone)] +// pub enum FFIOrderStatus { +// New, +// PartiallyFilled, +// Filled, +// Canceled, +// PendingCancel, +// Rejected, +// Expired, +// Open, +// Pending, +// Active, +// } +// +// +// fn order_status_to_ffi(t: OrderStatus) -> FFIOrderStatus { +// match t { +// OrderStatus::New => FFIOrderStatus::New, +// OrderStatus::PartiallyFilled => FFIOrderStatus::PartiallyFilled, +// OrderStatus::Filled => FFIOrderStatus::Filled, +// OrderStatus::Canceled => FFIOrderStatus::Canceled, +// OrderStatus::PendingCancel => FFIOrderStatus::PendingCancel, +// OrderStatus::Rejected => FFIOrderStatus::Rejected, +// OrderStatus::Expired => FFIOrderStatus::Expired, +// OrderStatus::Open => FFIOrderStatus::Open, +// OrderStatus::Pending => FFIOrderStatus::Pending, +// OrderStatus::Active => FFIOrderStatus::Active, +// } +// } +// +// #[repr(C)] +// #[derive(Debug, Copy, Clone)] +// pub struct FFITrade { +// id: *mut c_char, +// buyer_order_id: *mut c_char, +// seller_order_id: *mut c_char, +// market_pair: *mut c_char, +// price: *mut c_char, +// qty: *mut c_char, +// fees: *mut c_char, +// side: FFISide, +// liquidity: FFILiquidity, +// created_at: u64, +// } +// +// #[repr(C)] +// #[derive(Debug, Copy, Clone)] +// pub struct FFIOrder { +// pub id: *mut c_char, +// pub market_pair: *mut c_char, +// pub client_order_id: *mut c_char, +// pub created_at: u64, +// pub order_type: FFIOrderType, +// pub side: FFISide, +// pub status: FFIOrderStatus, +// pub size: *mut c_char, +// pub price: *mut c_char, +// pub remaining: *mut c_char, +// } +// +// fn order_to_ffi(t: Order) -> FFIOrder { +// FFIOrder { +// id: string_to_c_str(t.id), +// market_pair: string_to_c_str(t.market_pair), +// client_order_id: match t.client_order_id { +// None => std::ptr::null_mut(), +// Some(client_order_id) => string_to_c_str(client_order_id) +// }, +// created_at: match t.created_at { +// None => 0, +// Some(created_at) => created_at +// }, +// order_type: order_type_to_ffi(t.order_type), +// side: match t.side { +// Side::Buy => FFISide::Buy, +// Side::Sell => FFISide::Sell, +// }, +// status: order_status_to_ffi(t.status), +// size: string_to_c_str(t.size.to_string()), +// price: match t.price { +// Some(price) => string_to_c_str(price.to_string()), +// None => std::ptr::null_mut() +// }, +// remaining: match t.remaining { +// Some(rem) => string_to_c_str(rem.to_string()), +// None => std::ptr::null_mut() +// } +// } +// } +// +// #[repr(C)] +// #[derive(Debug, Copy, Clone)] +// pub struct FFIGetHistoricTradesRequest { +// market: *mut c_char, +// paginator: *mut FFIPaginator +// } +// +// +// fn to_ffi_ask_bid(f: &AskBid) -> FFIAskBid { +// FFIAskBid { +// price: string_to_c_str(f.price.to_string()), +// qty: string_to_c_str(f.qty.to_string()) +// } +// } +// +// fn to_ffi_candle(f: &Candle) -> FFICandle { +// FFICandle { +// time: f.time, +// low: f.low.to_f64().unwrap(), +// high: f.high.to_f64().unwrap(), +// open: f.open.to_f64().unwrap(), +// close: f.close.to_f64().unwrap(), +// volume: f.volume.to_f64().unwrap(), +// } +// } +// +// fn option_string_to_c_str(s: Option) -> *mut c_char { +// match s { +// None => std::ptr::null_mut(), +// Some(s ) => string_to_c_str(s) +// } +// } +// +// fn to_ffi_trade(f: &Trade) -> FFITrade { +// FFITrade { +// id: string_to_c_str(f.id.clone()), +// buyer_order_id: option_string_to_c_str(f.buyer_order_id.clone()), +// seller_order_id: option_string_to_c_str(f.seller_order_id.clone()), +// market_pair: string_to_c_str(f.market_pair.clone()), +// price: string_to_c_str(f.price.to_string()), +// qty: string_to_c_str(f.qty.to_string()), +// fees: match f.fees { +// Some(f) => string_to_c_str(f.to_string()), +// None => std::ptr::null_mut(), +// }, +// side: match f.side { +// Side::Buy => FFISide::Buy, +// Side::Sell => FFISide::Sell, +// }, +// liquidity: match f.liquidity { +// Some(Liquidity::Maker) => FFILiquidity::Maker, +// Some(Liquidity::Taker) => FFILiquidity::Taker, +// None => FFILiquidity::Unknown, +// }, +// created_at: f.created_at, +// } +// } +// +// #[repr(C)] +// #[derive(Debug)] +// pub struct FFIBinanceConfig { +// apikey: *mut c_char, +// secret: *mut c_char, +// sandbox: bool +// } +// +// type Out = *mut T; +// +// +// fn binance_credentials_from_ptrs(apikey: *mut c_char, secret: *mut c_char) -> Result, std::str::Utf8Error> { +// if apikey.is_null() { +// return Ok(None) +// } +// if secret.is_null() { +// return Ok(None) +// } +// +// Ok( +// Some( +// BinanceCredentials { +// api_key: c_str_to_string(apikey)?, +// api_secret: c_str_to_string(secret)? +// } +// ) +// ) +// } +// +// impl TryInto for FFIBinanceConfig { +// type Error = (); +// fn try_into(self) -> Result { +// Ok( +// BinanceParameters { +// credentials: binance_credentials_from_ptrs(self.apikey, self.secret).map_err(|_|())?, +// sandbox: self.sandbox, +// } +// ) +// } +// } +// +// #[repr(u32)] +// #[derive(Debug)] +// pub enum FFINashEnv { +// Sandbox, +// Production +// } +// +// #[repr(C)] +// pub struct ExchangeClient { +// client: AnyExchange, +// init_params: InitAnyExchange, +// channel: Option>, +// runtime: tokio::runtime::Runtime +// } +// +// #[repr(C)] +// #[derive(Debug)] +// pub struct InitResult { +// client: *mut ExchangeClient, +// } +// type SubResult = std::result::Result; +// type SubChannel = tokio::sync::oneshot::Sender; +// pub enum SubthreadCmd { +// Sub(Subscription, SubChannel), +// Disconnect +// } +// +// #[no_mangle] +// pub extern "cdecl" fn init_binance( +// config: FFIBinanceConfig, +// out_client: Out<*mut ExchangeClient> +// ) -> OpenLimitsResult { +// let call = move|| -> Result<(), OpenlimitsSharpError>{ +// let init_params: InitAnyExchange = config.try_into().map(InitAnyExchange::Binance).map_err(|_| OpenlimitsSharpError::InitializeException(String::from("Failed to parse config")))?; +// let mut runtime = tokio::runtime::Builder::new().basic_scheduler().enable_all().build().map_err(|_| OpenlimitsSharpError::InitializeException(String::from("Failed to start tokio runtime")))?; +// +// let client_future = OpenLimits::instantiate(init_params.clone()); +// let client: AnyExchange = runtime.block_on(client_future)?; +// +// +// let b = Box::new(ExchangeClient{ +// client, +// init_params, +// channel: None, +// runtime +// }); +// unsafe { +// *out_client = Box::into_raw(b); +// Ok(()) +// } +// }; +// +// result_to_ffi(call()) +// } +// +// #[no_mangle] +// pub extern "cdecl" fn init_coinbase( +// apikey: *mut c_char, +// api_secret: *mut c_char, +// passphrase: *mut c_char, +// sandbox: bool, +// out_client: Out<*mut ExchangeClient> +// ) -> OpenLimitsResult { +// let call = move|| -> Result<(), OpenlimitsSharpError>{ +// let api_key = nullable_cstr(apikey).map_err(|e| +// OpenlimitsSharpError::InvalidArgument(format!("Failed to parse apikey string. Invalid character on pos {}", e.valid_up_to())) +// )?; +// +// let api_secret = nullable_cstr(api_secret).map_err(|e| +// OpenlimitsSharpError::InvalidArgument(format!("Failed to parse api_secret string. Invalid character on pos {}", e.valid_up_to())) +// )?; +// +// let passphrase = nullable_cstr(passphrase).map_err(|e| +// OpenlimitsSharpError::InvalidArgument(format!("Failed to parse passphrase string. Invalid character on pos {}", e.valid_up_to())) +// )?; +// +// let init_params: InitAnyExchange = InitAnyExchange::Coinbase( +// CoinbaseParameters { +// sandbox, +// credentials: match (api_key, api_secret, passphrase) { +// (Some(api_key), Some(api_secret), Some(passphrase)) => Ok( +// Some( +// CoinbaseCredentials { +// api_key, +// api_secret, +// passphrase +// } +// ) +// ), +// (None, None, None) => Ok(None), +// _ => Err(OpenlimitsSharpError::InvalidArgument(format!("Invalid credentials"))) +// }? +// } +// ); +// +// let mut runtime = tokio::runtime::Builder::new().basic_scheduler().enable_all().build().map_err(|_| OpenlimitsSharpError::InitializeException(String::from("Failed to start tokio runtime")))?; +// +// let client_future = OpenLimits::instantiate(init_params.clone()); +// let client: AnyExchange = runtime.block_on(client_future)?; +// +// +// let b = Box::new(ExchangeClient{ +// client, +// init_params, +// channel: None, +// runtime +// }); +// unsafe { +// *out_client = Box::into_raw(b); +// Ok(()) +// } +// }; +// +// result_to_ffi(call()) +// } +// +// +// +// #[no_mangle] +// pub extern "cdecl" fn init_nash( +// apikey: *mut c_char, +// secret: *mut c_char, +// client_id: u64, +// environment: FFINashEnv, +// timeout: u64, +// affiliate_code: *mut c_char, +// out_client: Out<*mut ExchangeClient> +// ) -> OpenLimitsResult { +// let call = move|| -> Result<(), OpenlimitsSharpError>{ +// let mut credentials: Option = None; +// if !apikey.is_null() && !secret.is_null() { +// credentials = Some( +// NashCredentials { +// secret: c_str_to_string(secret).map_err(|e| +// OpenlimitsSharpError::InvalidArgument(format!("Failed to parse market string. Invalid character on pos {}", e.valid_up_to())) +// )?, +// session: c_str_to_string(apikey).map_err(|e| +// OpenlimitsSharpError::InvalidArgument(format!("Failed to parse session string. Invalid character on pos {}", e.valid_up_to())) +// )? +// } +// ) +// } +// +// let environment = match environment { +// FFINashEnv::Production => Environment::Production, +// FFINashEnv::Sandbox => Environment::Sandbox, +// }; +// +// let affiliate_code = nullable_cstr(affiliate_code).map_err(|e| +// OpenlimitsSharpError::InvalidArgument(format!("Failed to parse affiliate_code string. Invalid character on pos {}", e.valid_up_to())) +// )?; +// +// let nash_params = NashParameters { +// affiliate_code, +// credentials, +// client_id, +// timeout: std::time::Duration::from_millis(timeout), +// environment +// }; +// +// let init_params = InitAnyExchange::Nash( +// nash_params +// ); +// +// let mut runtime = tokio::runtime::Builder::new().basic_scheduler().enable_all().build().map_err(|_| OpenlimitsSharpError::InitializeException(String::from("Failed to start tokio runtime")))?; +// +// let client_future = OpenLimits::instantiate(init_params.clone()); +// let client: AnyExchange = runtime.block_on(client_future)?; +// +// let b = Box::new(ExchangeClient{ +// client, +// init_params, +// channel: None, +// runtime +// }); +// unsafe { +// *out_client = Box::into_raw(b); +// Ok(()) +// } +// }; +// +// result_to_ffi(call()) +// } +// +// #[no_mangle] +// pub extern "cdecl" fn order_book( +// client: *mut ExchangeClient, +// market: *mut c_char, +// bids_buff: *mut FFIAskBid, bids_buff_len: u64, actual_bids_buff_len: Out, +// asks_buff: *mut FFIAskBid, asks_buff_len: u64, actual_asks_buff_len: Out, +// last_update_id: Out, +// update_id: Out, +// ) -> OpenLimitsResult { +// let call = move|| -> Result<(), OpenlimitsSharpError>{ +// if client.is_null() { +// return Err(OpenlimitsSharpError::InvalidArgument(String::from("client is null"))); +// } +// +// if market.is_null() { +// return Err(OpenlimitsSharpError::InvalidArgument(String::from("market is null"))); +// } +// let market_pair = c_str_to_string(market).map_err(|e| +// OpenlimitsSharpError::InvalidArgument(format!("Failed to parse market string. Invalid character on pos {}", e.valid_up_to())) +// )?; +// +// let req = OrderBookRequest { +// market_pair +// }; +// unsafe { +// let resp = (*client).runtime.block_on( +// (*client).client.order_book(&req) +// )?; +// +// let bids = std::slice::from_raw_parts_mut::(bids_buff, bids_buff_len as usize); +// let ffi_bids: Vec = resp.bids.iter().map(to_ffi_ask_bid).collect(); +// let l = std::cmp::min(bids_buff_len as usize, ffi_bids.len() as usize); +// bids[0..l].copy_from_slice(&ffi_bids[0..l]); +// (*actual_bids_buff_len) = l as u64; +// +// let asks = std::slice::from_raw_parts_mut::(asks_buff, asks_buff_len as usize); +// let ffi_asks: Vec = resp.asks.iter().map(to_ffi_ask_bid).collect(); +// let l = std::cmp::min(asks_buff_len as usize, ffi_asks.len() as usize); +// asks[0..l].copy_from_slice(&ffi_asks[0..l]); +// (*actual_asks_buff_len) = l as u64; +// (*last_update_id) = resp.last_update_id.unwrap_or_default(); +// (*update_id) = resp.update_id.unwrap_or_default(); +// }; +// Ok(()) +// }; +// +// result_to_ffi(call()) +// } +// +// +// +// #[no_mangle] +// pub extern "cdecl" fn get_price_ticker( +// client: *mut ExchangeClient, +// market: *mut c_char, +// price: Out +// ) -> OpenLimitsResult { +// let call = move|| -> Result<(), OpenlimitsSharpError> { +// if client.is_null() { +// return Err(OpenlimitsSharpError::InvalidArgument(String::from("client is null"))); +// } +// +// if market.is_null() { +// return Err(OpenlimitsSharpError::InvalidArgument(String::from("market is null"))); +// } +// let market_pair = c_str_to_string(market).map_err(|e| +// OpenlimitsSharpError::InvalidArgument(format!("Failed to parse market string. Invalid character on pos {}", e.valid_up_to())) +// )?; +// +// let req = GetPriceTickerRequest { +// market_pair +// }; +// unsafe { +// let resp = (*client).runtime.block_on( +// (*client).client.get_price_ticker(&req) +// )?; +// let price_opt = resp.price; +// let price_opt = price_opt.map(|f| f.to_f64()).flatten(); +// (*price) = price_opt.unwrap_or(std::f64::NAN); +// Ok(()) +// } +// }; +// +// +// result_to_ffi(call()) +// } +// +// +// #[no_mangle] +// pub extern "cdecl" fn get_historic_rates( +// client: *mut ExchangeClient, +// market: *mut c_char, +// interval: FFIInterval, +// paginator: *mut FFIPaginator, +// candles_buff: *mut FFICandle, candles_buff_len: usize, actual_candles_buff_len: Out, +// ) -> OpenLimitsResult { +// let call = move|| -> Result<(), OpenlimitsSharpError> { +// if client.is_null() { +// return Err(OpenlimitsSharpError::InvalidArgument(String::from("client is null"))); +// } +// let mut paginator_res: Option> = None; +// if !paginator.is_null() { +// unsafe { +// let pag: Result = (*paginator).try_into(); +// paginator_res = Some(pag); +// } +// } +// let paginator = paginator_res.transpose().map_err(|_| OpenlimitsSharpError::InvalidArgument(String::from("Invalid paginator")))?; +// let market_pair = c_str_to_string(market).map_err(|e| +// OpenlimitsSharpError::InvalidArgument(format!("Failed to parse market string. Invalid character on pos {}", e.valid_up_to())) +// )?; +// let interval = interval_from_ffi_interval(interval).map_err(|_| OpenlimitsSharpError::InvalidArgument(String::from("Invalid interval")))?; +// +// let req = GetHistoricRatesRequest { +// paginator, +// market_pair, +// interval +// }; +// unsafe { +// let resp = (*client).runtime.block_on( +// (*client).client.get_historic_rates(&req) +// )?; +// +// +// let canles = std::slice::from_raw_parts_mut::(candles_buff, candles_buff_len); +// let ffi_candles: Vec = resp.iter().map(to_ffi_candle).collect(); +// let l = std::cmp::min(candles_buff_len, ffi_candles.len()); +// canles[0..l].copy_from_slice(&ffi_candles[0..l]); +// (*actual_candles_buff_len) = l; +// Ok(()) +// } +// }; +// result_to_ffi(call()) +// } +// +// #[no_mangle] +// pub extern "cdecl" fn get_historic_trades( +// client: *mut ExchangeClient, +// market: *mut c_char, +// paginator: *mut FFIPaginator, +// buff: *mut FFITrade, buff_len: usize, actual_buff_len: Out, +// ) -> OpenLimitsResult { +// let call = move|| -> Result<(), OpenlimitsSharpError> { +// if client.is_null() { +// return Err(OpenlimitsSharpError::InvalidArgument(String::from("client is null"))); +// } +// let market_pair = c_str_to_string(market).map_err(|e| +// OpenlimitsSharpError::InvalidArgument(format!("Failed to parse market string. Invalid character on pos {}", e.valid_up_to())) +// )?; +// +// +// let mut paginator_res: Option> = None; +// if !paginator.is_null() { +// unsafe { +// let pag: Result = (*paginator).try_into(); +// paginator_res = Some(pag); +// } +// } +// let paginator = paginator_res.transpose().map_err(|_| OpenlimitsSharpError::InvalidArgument(String::from("Invalid paginator")))?; +// +// let req = GetHistoricTradesRequest { +// paginator, +// market_pair, +// }; +// unsafe { +// let resp = (*client).runtime.block_on( +// (*client).client.get_historic_trades(&req) +// )?; +// +// let trades = std::slice::from_raw_parts_mut::(buff, buff_len); +// let ffi_trades: Vec = resp.iter().map(to_ffi_trade).collect(); +// let l = std::cmp::min(buff_len, ffi_trades.len()); +// trades[0..l].copy_from_slice(&ffi_trades[0..l]); +// (*actual_buff_len) = l; +// Ok(()) +// } +// }; +// result_to_ffi(call()) +// } +// #[no_mangle] +// +// pub extern "cdecl" fn place_order( +// client: *mut ExchangeClient, +// market: *mut c_char, +// qty: *mut c_char, +// limit: bool, +// price: *mut c_char, +// side: FFISide, +// tif: FFITIF, +// tif_duration: u64, +// _post_only: bool, +// +// result: Out +// ) -> OpenLimitsResult { +// let call = move|| -> Result<(), OpenlimitsSharpError> { +// if client.is_null() { +// return Err(OpenlimitsSharpError::InvalidArgument(String::from("client is null"))); +// } +// let market_pair = c_str_to_string(market).map_err(|e| +// OpenlimitsSharpError::InvalidArgument(format!("Failed to parse market string. Invalid character on pos {}", e.valid_up_to())) +// )?; +// let size = c_str_to_string(qty).map(|q| Decimal::from_str(q.as_str())); +// let size = size.map_err(|e| +// OpenlimitsSharpError::InvalidArgument(format!("Failed to parse size string. Invalid character on pos {}", e.valid_up_to())) +// )?; +// let size = size.map_err(|e| +// OpenlimitsSharpError::InvalidArgument(format!("Failed to parse size string: {}", e)) +// )?; +// +// +// if limit == false { +// let req = OpenMarketOrderRequest { +// market_pair, +// size +// }; +// +// unsafe { +// #[allow(unreachable_patterns)] +// match side { +// FFISide::Buy => { +// let order = (*client).runtime.block_on( +// (*client).client.market_buy(&req) +// )?; +// (*result) = order_to_ffi(order); +// return Ok(()); +// }, +// FFISide::Sell => { +// let order = (*client).runtime.block_on( +// (*client).client.market_sell(&req) +// )?; +// (*result) = order_to_ffi(order); +// return Ok(()); +// }, +// e => return Err(OpenlimitsSharpError::InvalidArgument(format!("Invalid side size string: {:?}", e))) +// } +// } +// } +// let price = c_str_to_string(price).map(|q| Decimal::from_str(q.as_str())).map_err(|e| +// OpenlimitsSharpError::InvalidArgument(format!("Failed to parse price string. Invalid character on pos {}", e.valid_up_to())) +// )?; +// let price = price.map_err(|e| +// OpenlimitsSharpError::InvalidArgument(format!("Failed to parse price string: {}", e)) +// )?; +// +// let time_in_force = ffitif_to_tif(tif, tif_duration); +// let req = OpenLimitOrderRequest { +// market_pair, +// price, +// time_in_force, +// size, +// post_only: _post_only +// }; +// unsafe { +// #[allow(unreachable_patterns)] +// match side { +// FFISide::Buy => { +// let order = (*client).runtime.block_on( +// (*client).client.limit_buy(&req) +// )?; +// (*result) = order_to_ffi(order); +// return Ok(()); +// }, +// FFISide::Sell => { +// let order = (*client).runtime.block_on( +// (*client).client.limit_sell(&req) +// )?; +// (*result) = order_to_ffi(order); +// return Ok(()); +// }, +// e => return Err(OpenlimitsSharpError::InvalidArgument(format!("Invalid side size string: {:?}", e))) +// } +// } +// }; +// +// result_to_ffi(call()) +// } +// +// #[no_mangle] +// pub extern "cdecl" fn get_all_open_orders( +// client: *mut ExchangeClient, +// buff: *mut FFIOrder, buff_len: usize, actual_buff_len: Out, +// ) -> OpenLimitsResult { +// let call = move|| -> Result<(), OpenlimitsSharpError> { +// if client.is_null() { +// return Err(OpenlimitsSharpError::InvalidArgument(String::from("client is null"))); +// } +// +// unsafe { +// let resp = (*client).runtime.block_on( +// (*client).client.get_all_open_orders() +// )?; +// +// let orders = std::slice::from_raw_parts_mut::(buff, buff_len); +// let ffi_orders: Vec = resp.into_iter().map(order_to_ffi).collect(); +// let l = std::cmp::min(buff_len, ffi_orders.len()); +// orders[0..ffi_orders.len()].copy_from_slice(&ffi_orders[0..l]); +// (*actual_buff_len) = l; +// }; +// Ok(()) +// }; +// +// result_to_ffi(call()) +// } +// +// #[no_mangle] +// pub extern "cdecl" fn get_order_history( +// client: *mut ExchangeClient, +// market: *mut c_char, +// paginator: *mut FFIPaginator, +// buff: *mut FFIOrder, buff_len: usize, actual_buff_len: Out, +// ) -> OpenLimitsResult { +// let call = move|| -> Result<(), OpenlimitsSharpError> { +// if client.is_null() { +// return Err(OpenlimitsSharpError::InvalidArgument(String::from("client is null"))); +// } +// let market_pair = nullable_cstr(market).map_err(|e| +// OpenlimitsSharpError::InvalidArgument(format!("Failed to parse market string. Invalid character on pos {}", e.valid_up_to())) +// )?; +// +// +// let mut paginator_res: Option> = None; +// if !paginator.is_null() { +// unsafe { +// let pag: Result = (*paginator).try_into(); +// paginator_res = Some(pag); +// } +// } +// let paginator = paginator_res.transpose().map_err(|_| OpenlimitsSharpError::InvalidArgument(String::from("Invalid paginator")))?; +// +// let req = GetOrderHistoryRequest { +// paginator, +// market_pair, +// }; +// unsafe { +// let resp = (*client).runtime.block_on( +// (*client).client.get_order_history(&req) +// )?; +// +// let orders = std::slice::from_raw_parts_mut::(buff, buff_len); +// let ffi_orders: Vec = resp.into_iter().map(order_to_ffi).collect(); +// let l = std::cmp::min(buff_len, ffi_orders.len()); +// +// orders[0..l].copy_from_slice(&ffi_orders[0..l]); +// (*actual_buff_len) = l; +// } +// Ok(()) +// }; +// +// result_to_ffi(call()) +// } +// +// +// +// #[no_mangle] +// pub extern "cdecl" fn get_trade_history( +// client: *mut ExchangeClient, +// market: *mut c_char, +// order_id: *mut c_char, +// paginator: *mut FFIPaginator, +// buff: *mut FFITrade, buff_len: usize, actual_buff_len: Out, +// ) -> OpenLimitsResult { +// let call = move|| -> Result<(), OpenlimitsSharpError> { +// if client.is_null() { +// return Err(OpenlimitsSharpError::InvalidArgument(String::from("client is null"))); +// } +// let market_pair = nullable_cstr(market).map_err(|e| +// OpenlimitsSharpError::InvalidArgument(format!("Failed to parse market string. Invalid character on pos {}", e.valid_up_to())) +// )?; +// let order_id = nullable_cstr(order_id).map_err(|e| +// OpenlimitsSharpError::InvalidArgument(format!("Failed to parse order_id string. Invalid character on pos {}", e.valid_up_to())) +// )?; +// +// +// let mut paginator_res: Option> = None; +// if !paginator.is_null() { +// unsafe { +// let pag: Result = (*paginator).try_into(); +// paginator_res = Some(pag); +// } +// } +// let paginator = paginator_res.transpose().map_err(|_| OpenlimitsSharpError::InvalidArgument(String::from("Invalid paginator")))?; +// +// let req = TradeHistoryRequest { +// paginator, +// order_id, +// market_pair, +// }; +// unsafe { +// let resp = (*client).runtime.block_on( +// (*client).client.get_trade_history(&req) +// )?; +// +// let trades = std::slice::from_raw_parts_mut::(buff, buff_len); +// let ffi_trades: Vec = resp.iter().map(to_ffi_trade).collect(); +// let l = std::cmp::min(buff_len, ffi_trades.len()); +// +// trades[0..ffi_trades.len()].copy_from_slice(&ffi_trades[0..l]); +// (*actual_buff_len) = l; +// } +// Ok(()) +// }; +// +// result_to_ffi(call()) +// +// } +// +// +// #[no_mangle] +// pub extern "cdecl" fn get_account_balances( +// client: *mut ExchangeClient, +// paginator: *mut FFIPaginator, +// buff: *mut FFIBalance, buff_len: usize, actual_buff_len: Out, +// ) -> OpenLimitsResult { +// let call = move|| -> Result<(), OpenlimitsSharpError> { +// if client.is_null() { +// return Err(OpenlimitsSharpError::InvalidArgument(String::from("client is null"))); +// } +// +// let mut paginator_res: Option> = None; +// if !paginator.is_null() { +// unsafe { +// let pag: Result = (*paginator).try_into(); +// paginator_res = Some(pag); +// } +// } +// let paginator = paginator_res.transpose().map_err(|_| OpenlimitsSharpError::InvalidArgument(String::from("Invalid paginator")))?; +// +// +// unsafe { +// let resp = (*client).runtime.block_on( +// (*client).client.get_account_balances(paginator) +// )?; +// +// let balances = std::slice::from_raw_parts_mut::(buff, buff_len); +// let ffi_balances: Vec = resp.into_iter().map(to_ffi_balance).collect(); +// let l = std::cmp::min(buff_len, ffi_balances.len()); +// +// balances[0..l].copy_from_slice(&ffi_balances[0..l]); +// (*actual_buff_len) = l; +// } +// Ok(()) +// }; +// +// result_to_ffi(call()) +// } +// +// +// #[no_mangle] +// pub extern "cdecl" fn cancel_all_orders( +// client: *mut ExchangeClient, +// market: *mut c_char, +// buff: *mut *mut c_char, buff_len: usize, actual_buff_len: Out, +// ) -> OpenLimitsResult { +// let call = move|| -> Result<(), OpenlimitsSharpError> { +// if client.is_null() { +// return Err(OpenlimitsSharpError::InvalidArgument(String::from("client is null"))); +// } +// let market_pair = nullable_cstr(market).map_err(|e| +// OpenlimitsSharpError::InvalidArgument(format!("Failed to parse market string. Invalid character on pos {}", e.valid_up_to())) +// )?; +// +// +// unsafe { +// let resp = (*client).runtime.block_on( +// (*client).client.cancel_all_orders(&CancelAllOrdersRequest { +// market_pair +// }) +// )?; +// +// let ids = std::slice::from_raw_parts_mut::<*mut c_char>(buff, buff_len); +// let ffi_ids: Vec<*mut c_char> = resp.into_iter().map(|c|string_to_c_str(c.id)).collect(); +// let l = std::cmp::min(buff_len, ffi_ids.len()); +// +// ids[0..l].copy_from_slice(&ffi_ids[0..l]); +// (*actual_buff_len) = l; +// } +// Ok(()) +// }; +// result_to_ffi(call()) +// } +// +// #[no_mangle] +// pub extern "cdecl" fn get_order( +// client: *mut ExchangeClient, +// order_id: *mut c_char, +// market: *mut c_char, +// result: Out, +// ) -> OpenLimitsResult { +// let call = move|| -> Result<(), OpenlimitsSharpError> { +// if client.is_null() { +// return Err(OpenlimitsSharpError::InvalidArgument(String::from("client is null"))); +// } +// +// let id = c_str_to_string(order_id).map_err(|e| +// OpenlimitsSharpError::InvalidArgument(format!("Failed to parse market string. Invalid character on pos {}", e.valid_up_to())) +// )?; +// let market_pair = nullable_cstr(market).map_err(|e| +// OpenlimitsSharpError::InvalidArgument(format!("Failed to parse market string. Invalid character on pos {}", e.valid_up_to())) +// )?; +// +// unsafe { +// let order = (*client).runtime.block_on( +// (*client).client.get_order( &GetOrderRequest { +// id, +// market_pair +// }) +// )?; +// (*result) = order_to_ffi(order); +// } +// +// Ok(()) +// }; +// +// result_to_ffi(call()) +// } +// +// #[no_mangle] +// pub extern "cdecl" fn cancel_order( +// client: *mut ExchangeClient, +// order_id: *mut c_char, +// market: *mut c_char, +// ) -> OpenLimitsResult { +// let call = move|| -> Result<(), OpenlimitsSharpError> { +// if client.is_null() { +// return Err(OpenlimitsSharpError::InvalidArgument(String::from("client is null"))); +// } +// let id = c_str_to_string(order_id).map_err(|e| +// OpenlimitsSharpError::InvalidArgument(format!("Failed to parse market string. Invalid character on pos {}", e.valid_up_to())) +// )?; +// let market_pair = nullable_cstr(market).map_err(|e| +// OpenlimitsSharpError::InvalidArgument(format!("Failed to parse market string. Invalid character on pos {}", e.valid_up_to())) +// )?; +// +// unsafe { +// (*client).runtime.block_on( +// (*client).client.cancel_order(&CancelOrderRequest { +// id, +// market_pair +// }) +// )?; +// } +// Ok(()) +// }; +// result_to_ffi(call()) +// } +// +// +// #[no_mangle] +// pub extern "cdecl" fn receive_pairs( +// client: *mut ExchangeClient, +// buff: *mut FFIMarketPair, buff_len: usize, actual_buff_len: Out, +// ) -> OpenLimitsResult { +// let call = move|| -> Result<(), OpenlimitsSharpError> { +// if client.is_null() { +// return Err(OpenlimitsSharpError::InvalidArgument(String::from("client is null"))); +// } +// unsafe { +// let pairs = (*client).runtime.block_on( +// (*client).client.retrieve_pairs() +// )?; +// +// let pairs_buff = std::slice::from_raw_parts_mut::(buff, buff_len); +// let pairs_ffi: Vec = pairs.into_iter().map(market_pair_to_ffi).collect(); +// let l = std::cmp::min(buff_len, pairs_ffi.len()); +// +// pairs_buff[0..l].copy_from_slice(&pairs_ffi[0..l]); +// (*actual_buff_len) = l; +// } +// Ok(()) +// }; +// result_to_ffi(call()) +// } +// +// #[repr(C)] +// #[derive(Copy, Clone)] +// pub struct FFITradeBox(*mut FFITrade); +// unsafe impl Send for FFITradeBox {} +// unsafe impl Sync for FFITradeBox {} +// #[repr(C)] +// #[derive(Copy, Clone)] +// pub struct FFIAskBidBox(*mut FFIAskBid); +// unsafe impl Send for FFIAskBidBox {} +// unsafe impl Sync for FFIAskBidBox {} +// +// #[no_mangle] +// #[allow(unsafe_code)] +// pub extern "cdecl" fn init_subscriptions( +// client: *mut ExchangeClient, +// on_error: extern fn(), +// on_ping: extern fn(), +// on_orderbook: extern fn(bids_len: u64, asks_len: u64, market: *mut c_char, last_update_id: u64, update_id: u64), +// on_trades: extern fn(buff_len: u64, market: *mut c_char), +// on_disconnet: extern fn(), +// bids_buff: FFIAskBidBox, bids_buff_len: usize, +// asks_buff: FFIAskBidBox, asks_buff_len: usize, +// trades_buff: FFITradeBox, trades_buff_len: usize, +// sub_handle: Out<*mut tokio::sync::mpsc::UnboundedSender> +// ) -> OpenLimitsResult { +// let (sub_request_tx, mut sub_rx) = tokio::sync::mpsc::unbounded_channel::(); +// +// let init_params = unsafe { +// (*client).init_params.clone() +// }; +// let (finish_tx, finish_rx) = tokio::sync::oneshot::channel::>(); +// +// std::thread::spawn(move || { +// let call = move|| -> Result<(tokio::runtime::Runtime, OpenLimitsWs), OpenlimitsSharpError> { +// let mut rt = tokio::runtime::Builder::new() +// .basic_scheduler() +// .enable_all() +// .build() +// .map_err(|_| OpenlimitsSharpError::InitializeException(String::from("Failed to start tokio runtime")))?; +// let client: OpenLimitsWs = rt.block_on(OpenLimitsWs::instantiate(init_params))?; +// +// Ok((rt, client)) +// }; +// +// let (mut rt, client) = match call() { +// Ok(e) => e, +// Err(e) => { +// finish_tx.send(Err(e)).expect("Failed to communicate result back to main thread"); +// return; +// } +// }; +// finish_tx.send(Ok(())).expect("Failed to communicate result back to main thread"); +// +// loop { +// let subcmd = sub_rx.next(); +// let thread_cmd = rt.block_on(subcmd); +// match thread_cmd { +// Some(SubthreadCmd::Disconnect) => { +// break; +// }, +// Some(SubthreadCmd::Sub(sub, writer)) => { +// let result = rt.block_on(client.subscribe(sub.clone(), move |resp| { +// let out_asks = unsafe { std::slice::from_raw_parts_mut::(asks_buff.0, asks_buff_len) }; +// let out_bids = unsafe { std::slice::from_raw_parts_mut::(bids_buff.0, bids_buff_len) }; +// let resp = match resp { +// Ok(e) => e, +// Err(_) => { +// on_error(); +// return +// } +// }; +// let resp = match resp { +// WebSocketResponse::Generic(msg) => msg, +// _ => { +// return; +// } +// }; +// +// match resp { +// OpenLimitsWebSocketMessage::Ping => { +// on_ping(); +// }, +// OpenLimitsWebSocketMessage::Trades(trades) => { +// let out_trades = unsafe { std::slice::from_raw_parts_mut::(trades_buff.0, trades_buff_len) }; +// let market = match sub.clone() { +// Subscription::Trades(market) => market, +// _ => panic!("Unreachable") +// }; +// for (i, trade) in trades.iter().enumerate() { +// out_trades[i] = to_ffi_trade(trade); +// } +// on_trades(trades.len() as u64, string_to_c_str(market)); +// }, +// OpenLimitsWebSocketMessage::OrderBook(resp) => { +// let market = match sub.clone() { +// Subscription::OrderBookUpdates(market) => market, +// _ => panic!("Unreachable") +// }; +// for (i, bid) in resp.bids.iter().enumerate() { +// out_bids[i] = to_ffi_ask_bid(bid); +// } +// for (i, ask) in resp.asks.iter().enumerate() { +// out_asks[i] = to_ffi_ask_bid(ask); +// } +// on_orderbook( +// resp.bids.len() as u64, +// resp.asks.len() as u64, +// string_to_c_str(market.clone()), +// resp.last_update_id.unwrap_or_default(), +// resp.update_id.unwrap_or_default() +// ); +// }, +// OpenLimitsWebSocketMessage::OrderBookDiff(resp) => { +// let market = match sub.clone() { +// Subscription::OrderBookUpdates(market) => market, +// _ => panic!("Unreachable") +// }; +// for (i, bid) in resp.bids.iter().enumerate() { +// out_bids[i] = to_ffi_ask_bid(bid); +// } +// for (i, ask) in resp.asks.iter().enumerate() { +// out_asks[i] = to_ffi_ask_bid(ask); +// } +// on_orderbook( +// resp.bids.len() as u64, +// resp.asks.len() as u64, +// string_to_c_str(market.clone()), +// resp.last_update_id.unwrap_or_default(), +// resp.update_id.unwrap_or_default() +// ); +// } +// }; +// })); +// writer.send(result).expect("Failed to send result back to subcribe call"); +// }, +// None => {} +// } +// } +// on_disconnet(); +// }); +// +// unsafe { +// let r = match (*client).runtime.block_on( +// finish_rx +// ) { +// Err(error) => Err(OpenlimitsSharpError::InitializeException(format!("Failed while waiting for subscription thread to intialize: {}", error.to_string()))), +// Ok(e) => e +// }; +// +// *sub_handle = Box::into_raw(Box::new(sub_request_tx)); +// +// result_to_ffi(r) +// } +// } +// +// +// #[no_mangle] +// pub extern fn free_string(s: *mut c_char) { +// unsafe { +// if s.is_null() { return } +// CString::from_raw(s) +// }; +// } +// +// #[no_mangle] +// pub extern "cdecl" fn subscribe_orderbook( +// client: *mut ExchangeClient, +// channel: *mut tokio::sync::mpsc::UnboundedSender, +// market: *mut c_char, +// ) -> OpenLimitsResult { +// let call = move|| -> Result<(), OpenlimitsSharpError> { +// if channel.is_null() { +// return Err(OpenlimitsSharpError::InvalidArgument(String::from("channel is null"))); +// } +// let market_pair = c_str_to_string(market).map_err(|e| +// OpenlimitsSharpError::InvalidArgument(format!("Failed to parse market string. Invalid character on pos {}", e.valid_up_to())) +// )?; +// +// let (finish_tx, finish_rx) = tokio::sync::oneshot::channel::(); +// unsafe { +// (*channel).send( +// SubthreadCmd::Sub(Subscription::OrderBookUpdates( +// market_pair, +// ), finish_tx) +// ).map_err(|_| OpenlimitsSharpError::SubscribeException(String::from("failed to send subscription to handler")))?; +// +// let result = (*client).runtime.block_on(finish_rx).map_err(|_| OpenlimitsSharpError::SubscribeException(String::from("failed to get subscription result from handler")))?; +// +// match result { +// Ok(_) => Ok(()), +// Err(e) => Err(OpenlimitsSharpError::OpenLimitsError(e)) +// } +// } +// }; +// result_to_ffi(call()) +// } +// +// #[no_mangle] +// pub extern "cdecl" fn subscribe_trades( +// client: *mut ExchangeClient, +// channel: *mut tokio::sync::mpsc::UnboundedSender, +// market: *mut c_char +// ) -> OpenLimitsResult { +// let call = move|| -> Result<(), OpenlimitsSharpError> { +// if channel.is_null() { +// return Err(OpenlimitsSharpError::InvalidArgument(String::from("channel is null"))); +// } +// let market_pair = c_str_to_string(market).map_err(|e| +// OpenlimitsSharpError::InvalidArgument(format!("Failed to parse market string. Invalid character on pos {}", e.valid_up_to())) +// )?; +// let (finish_tx, finish_rx) = tokio::sync::oneshot::channel::(); +// +// unsafe { +// (*channel).send( +// SubthreadCmd::Sub(Subscription::Trades( +// market_pair, +// ), finish_tx) +// ).map_err(|_| OpenlimitsSharpError::SubscribeException(String::from("failed to send subscription to handler")))?; +// +// let result = (*client).runtime.block_on(finish_rx).map_err(|_| OpenlimitsSharpError::SubscribeException(String::from("failed to get subscription result from handler")))?; +// +// match result { +// Ok(_) => Ok(()), +// Err(e) => Err(OpenlimitsSharpError::OpenLimitsError(e)) +// } +// } +// }; +// result_to_ffi(call()) +// } +// +// #[no_mangle] +// pub extern "cdecl" fn disconnect( +// channel: *mut tokio::sync::mpsc::UnboundedSender, +// ) { +// unsafe { +// let res = (*channel).send( +// SubthreadCmd::Disconnect +// ); +// res.map_err(|_| "Send error").expect("Failed to disconnect"); +// } +// } \ No newline at end of file diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..2a778e4 --- /dev/null +++ b/build.rs @@ -0,0 +1,3 @@ +fn main() { + +} diff --git a/examples/binance.rs b/examples/binance.rs deleted file mode 100644 index d1a550d..0000000 --- a/examples/binance.rs +++ /dev/null @@ -1,16 +0,0 @@ -use openlimits::exchange::binance::Binance; -use openlimits::exchange::binance::BinanceParameters; -use openlimits::prelude::*; - -#[tokio::main] -async fn main() { - let binance = Binance::new(BinanceParameters::prod()) - .await - .expect("Couldn't create openlimits-binance client"); - - let order_book = binance.order_book(&OrderBookRequest {market_pair: "BTCEUR".to_string()}) - .await - .expect("Couldn't get order book"); - - println!("{:?}", order_book); -} \ No newline at end of file diff --git a/examples/binance_websocket.rs b/examples/binance_websocket.rs deleted file mode 100644 index ec88fff..0000000 --- a/examples/binance_websocket.rs +++ /dev/null @@ -1,30 +0,0 @@ -use openlimits::exchange::traits::stream::OpenLimitsWs; -use openlimits::exchange::binance::BinanceWebsocket; -use openlimits::exchange::binance::BinanceParameters; -use openlimits::prelude::*; -use openlimits::model::websocket::OpenLimitsWebSocketMessage::OrderBook; -use openlimits::model::websocket::Subscription::OrderBookUpdates; -use openlimits::model::websocket::WebSocketResponse::Generic; - -#[tokio::main] -async fn main() { - let binance_websocket = OpenLimitsWs { - websocket: BinanceWebsocket::new(BinanceParameters::prod()) - .await - .expect("Failed to create Client") - }; - - binance_websocket.subscribe(OrderBookUpdates("btceur".to_string()), move |m| { - let r = m.as_ref(); - - if let Ok(Generic(OrderBook(order_book))) = r { - println!("{:?}", order_book) - } else if let Err(err) = r { - println!("{:#?}", err); - } - }) - .await - .expect("Failed to subscribe to orderbook on Binance"); - - std::thread::sleep(std::time::Duration::from_millis(5000)); -} \ No newline at end of file diff --git a/examples/coinbase.rs b/examples/coinbase.rs deleted file mode 100644 index cda6395..0000000 --- a/examples/coinbase.rs +++ /dev/null @@ -1,16 +0,0 @@ -use openlimits::exchange::coinbase::Coinbase; -use openlimits::exchange::coinbase::CoinbaseParameters; -use openlimits::prelude::*; - -#[tokio::main] -async fn main() { - let coinbase = Coinbase::new(CoinbaseParameters::prod()) - .await - .expect("Couldn't create coinbase client"); - - let order_book = coinbase.order_book(&OrderBookRequest {market_pair: "BTC-EUR".to_string()}) - .await - .expect("Couldn't get order book"); - - println!("{:?}", order_book); -} \ No newline at end of file diff --git a/examples/csharp/.gitignore b/examples/csharp/.gitignore new file mode 100644 index 0000000..7de5508 --- /dev/null +++ b/examples/csharp/.gitignore @@ -0,0 +1,2 @@ +obj +bin diff --git a/examples/csharp/Example.csproj b/examples/csharp/Example.csproj new file mode 100644 index 0000000..356e3d5 --- /dev/null +++ b/examples/csharp/Example.csproj @@ -0,0 +1,12 @@ + + + + + + + + Exe + netcoreapp5.0 + + + diff --git a/examples/csharp/Program.cs b/examples/csharp/Program.cs new file mode 100644 index 0000000..2ec3a36 --- /dev/null +++ b/examples/csharp/Program.cs @@ -0,0 +1,47 @@ +using System; + +namespace Example +{ + using OpenLimits; + using System.Threading; + class Program + { +// static public void PrintBook(OrderbookResponse orderbook) { +// Console.WriteLine("New orderbook orders in " + orderbook.market); +// Console.WriteLine("asks"); +// foreach(var ask in orderbook.asks) { +// Console.WriteLine(ask); +// } +// +// Console.WriteLine("bids"); +// foreach(var bid in orderbook.bids) { +// Console.WriteLine(bid); +// } +// } + + static public void Main(string[] args) + { + Console.WriteLine("Init"); + Test.Hello(); + Test.SaySomething(); + NashClientConfig config = NashClientConfig.Unauthenticated(0, NashEnvironment.Production, 1000); + Console.WriteLine(config.environment); +// var client = new ExchangeClient(config); +// +// client.SubscribeToDisconnect(() => { +// Console.WriteLine("Disconnected"); +// }); +// foreach(var market in client.R qeceivePairs()) { +// client.SubscribeToOrderbook(market.symbol, PrintBook); +// } +// +// GC.Collect(); +// GC.WaitForPendingFinalizers(); + + // Noia markets only available in NashEnvironment.Production + // Console.WriteLine("Listening to the noia markets"); + // client.SubscribeToOrderbook("noia_usdc", PrintBook); + // client.SubscribeToOrderbook("noia_btc", PrintBook); + } + } +} \ No newline at end of file diff --git a/examples/csharp/run.sh b/examples/csharp/run.sh new file mode 100755 index 0000000..be91e87 --- /dev/null +++ b/examples/csharp/run.sh @@ -0,0 +1,4 @@ +cargo build --manifest-path ../../bindings/csharp/lib/Cargo.toml +cp ../../bindings/csharp/lib/target/debug/libopenlimits_sharp.so ./bin/Debug/netcoreapp5.0/ +dotnet run + diff --git a/examples/coinbase_websocket.rs b/examples/rust/orderbook.rs similarity index 91% rename from examples/coinbase_websocket.rs rename to examples/rust/orderbook.rs index 6fca2cc..be3fdd1 100644 --- a/examples/coinbase_websocket.rs +++ b/examples/rust/orderbook.rs @@ -21,8 +21,8 @@ async fn main() { println!("{:#?}", err); } }) - .await - .expect("Failed to subscribe to orderbook on Coinbase"); + .await + .expect("Failed to subscribe to orderbook on Coinbase"); std::thread::sleep(std::time::Duration::from_millis(5000)); } \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index e073847..ba4c839 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -46,11 +46,11 @@ use crate::exchange::shared::Result; pub use crate::exchange::errors; pub use crate::exchange::model; -/// Can be used to initiate exchanges -pub struct OpenLimits {} - -impl OpenLimits { - pub async fn instantiate(parameters: E::InitParams) -> Result { - Ok(E::new(parameters).await?) - } -} +// /// Can be used to initiate exchanges +// pub struct OpenLimits {} +// +// impl OpenLimits { +// pub async fn instantiate(parameters: E::InitParams) -> Result { +// Ok(E::new(parameters).await?) +// } +// } From 99b532e812c742c722d7e4cd65d27abf58e877c4 Mon Sep 17 00:00:00 2001 From: Danilo Guanabara Date: Wed, 6 Oct 2021 21:07:51 -0300 Subject: [PATCH 12/23] WIP --- Cargo.toml | 8 +++ bindings/csharp/Test.cs | 16 ------ build.rs | 14 +++++ examples/csharp/Example.csproj | 2 +- examples/csharp/Program.cs | 35 ++++++------- examples/csharp/run.sh | 4 +- src/bindings.rs | 42 +++++++++++++++ src/bindings/client.rs | 51 +++++++++++++++++++ src/bindings/client/ask_bid.rs | 18 +++++++ src/bindings/client/coinbase.rs | 30 +++++++++++ src/bindings/environment.rs | 5 ++ src/bindings/string.rs | 20 ++++++++ src/exchange/coinbase/client/base_client.rs | 2 +- src/exchange/coinbase/coinbase_credentials.rs | 2 +- src/exchange/coinbase/coinbase_parameters.rs | 2 +- src/exchange/coinbase/mod.rs | 12 ++++- src/exchange/coinbase/transport.rs | 2 - src/exchange/mod.rs | 2 +- src/lib.rs | 14 ++--- src/openlimits.rs | 16 ++++++ 20 files changed, 241 insertions(+), 56 deletions(-) delete mode 100644 bindings/csharp/Test.cs create mode 100644 src/bindings.rs create mode 100644 src/bindings/client.rs create mode 100644 src/bindings/client/ask_bid.rs create mode 100644 src/bindings/client/coinbase.rs create mode 100644 src/bindings/environment.rs create mode 100644 src/bindings/string.rs create mode 100644 src/openlimits.rs diff --git a/Cargo.toml b/Cargo.toml index fb07281..065a45f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,7 @@ path = "examples/rust/orderbook.rs" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [features] +bindings = ["ligen", "ligen-macro", "ligen-csharp"] #default = ["rust_gmp"] #rust_gmp = ["nash-protocol/rust_gmp", "nash-native-client/rust_gmp"] #num_bigint = ["nash-protocol/num_bigint", "nash-native-client/num_bigint"] @@ -48,3 +49,10 @@ derive_more = "0.99" pyo3 = { version = "0.12.3", optional = true } openlimits-binance = { version = "0.1" } openlimits-exchange = { version = "0.1" } +ligen-macro = { path = "../../sensorial/systems/ligen/ligen/macro", optional = true } +ligen = { path = "../../sensorial/systems/ligen/ligen", optional = true } +lazy_static = "1.4.0" + +[build-dependencies] +ligen = { path = "../../sensorial/systems/ligen/ligen", optional = true } +ligen-csharp = { path = "../../sensorial/systems/ligen/generators/ligen-csharp", optional = true } \ No newline at end of file diff --git a/bindings/csharp/Test.cs b/bindings/csharp/Test.cs deleted file mode 100644 index 56d27ea..0000000 --- a/bindings/csharp/Test.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Runtime.InteropServices; - -namespace OpenLimits { - public class Test { - public static void Hello() { - Console.WriteLine("Hello"); - } - - const string NativeLib = "libopenlimits_sharp"; - - [DllImport(NativeLib, EntryPoint = "say_something", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] - unsafe public static extern void SaySomething(); - - } -} \ No newline at end of file diff --git a/build.rs b/build.rs index 2a778e4..86c289f 100644 --- a/build.rs +++ b/build.rs @@ -1,3 +1,17 @@ + fn main() { + #[cfg(feature = "bindings")] + { + use ligen::prelude::*; + use ligen_csharp::CSharpGenerator; + match Project::current() { + Ok(project) => { + let csharp_generator = CSharpGenerator::default(); + csharp_generator.generate(&project).expect("Failed to generate C# bindings."); + }, + Err(e) => println!("e: {:#?}", e) + } + } } + diff --git a/examples/csharp/Example.csproj b/examples/csharp/Example.csproj index 356e3d5..76a9358 100644 --- a/examples/csharp/Example.csproj +++ b/examples/csharp/Example.csproj @@ -1,7 +1,7 @@ - + diff --git a/examples/csharp/Program.cs b/examples/csharp/Program.cs index 2ec3a36..8bdba4d 100644 --- a/examples/csharp/Program.cs +++ b/examples/csharp/Program.cs @@ -2,30 +2,27 @@ namespace Example { - using OpenLimits; + using Openlimits; using System.Threading; class Program { -// static public void PrintBook(OrderbookResponse orderbook) { -// Console.WriteLine("New orderbook orders in " + orderbook.market); -// Console.WriteLine("asks"); -// foreach(var ask in orderbook.asks) { -// Console.WriteLine(ask); -// } -// -// Console.WriteLine("bids"); -// foreach(var bid in orderbook.bids) { -// Console.WriteLine(bid); -// } -// } - static public void Main(string[] args) { - Console.WriteLine("Init"); - Test.Hello(); - Test.SaySomething(); - NashClientConfig config = NashClientConfig.Unauthenticated(0, NashEnvironment.Production, 1000); - Console.WriteLine(config.environment); +// Console.WriteLine("Init"); +// Test.Hello(); +// var test = new Test(64, Environment.Sandbox); +// Console.WriteLine(test.value); +// Console.WriteLine(test.environment); +// var test2 = Test.Create(32); +// Console.WriteLine(test2.value); +// Console.WriteLine(test2.environment); + CoinbaseParameters parameters = new CoinbaseParameters(Environment.Production, "a", "b", "c"); + Client client = Client.Coinbase(parameters); + Client.OrderBook(client, "BTC-EUR"); +// var person = new Person("Danilo", "Guanabara"); +// Test.Display(person); +// NashClientConfig config = NashClientConfig.Unauthenticated(0, NashEnvironment.Production, 1000); +// Console.WriteLine(config.environment); // var client = new ExchangeClient(config); // // client.SubscribeToDisconnect(() => { diff --git a/examples/csharp/run.sh b/examples/csharp/run.sh index be91e87..9e621b8 100755 --- a/examples/csharp/run.sh +++ b/examples/csharp/run.sh @@ -1,4 +1,4 @@ -cargo build --manifest-path ../../bindings/csharp/lib/Cargo.toml -cp ../../bindings/csharp/lib/target/debug/libopenlimits_sharp.so ./bin/Debug/netcoreapp5.0/ +# cargo build --manifest-path ../../Cargo.toml +cp ../../target/ligen/openlimits/lib/openlimits.dll ./bin/Debug/netcoreapp5.0/openlimits_csharp.dll dotnet run diff --git a/src/bindings.rs b/src/bindings.rs new file mode 100644 index 0000000..a499c21 --- /dev/null +++ b/src/bindings.rs @@ -0,0 +1,42 @@ +#![allow(non_snake_case)] + +pub mod string; +pub mod environment; +pub mod client; +// use ligen::marshalling::{MarshalFrom, MarshalInto}; + +// #[repr(C)] +// pub struct Test { +// pub value: i32, +// pub environment: Environment, +// } +// +// // pub type Callback = Box; +// +// pub struct Person { +// first_name: String, +// last_name: String +// } +// +// +// impl Test { +// pub fn hello() { +// println!("Hello from Test"); +// } +// +// pub fn create(value: i32) -> Self { +// Self { value, environment: Environment::Production } +// } +// +// pub fn print(value: String) { +// println!("{}", value); +// } +// +// pub fn display(person: Person) { +// println!("{} {}", person.first_name, person.last_name); +// } +// +// // pub fn set_callback(callback: Callback) { +// // callback(Environment::Production); +// // } +// } diff --git a/src/bindings/client.rs b/src/bindings/client.rs new file mode 100644 index 0000000..feb3813 --- /dev/null +++ b/src/bindings/client.rs @@ -0,0 +1,51 @@ +use crate::exchange::coinbase::{CoinbaseParameters, Coinbase}; +use crate::prelude::*; + +mod ask_bid; +pub use ask_bid::FFIAskBid; + +pub mod coinbase; + +mod runtime { + use ligen_macro::inner_ligen; + inner_ligen!(ignore); + mod runtime { + lazy_static::lazy_static! { + pub static ref RUNTIME: tokio::runtime::Runtime = tokio::runtime::Runtime::new().unwrap(); + } + } + pub use runtime::RUNTIME; +} + +use runtime::RUNTIME; +use crate::model::AskBid; +use rust_decimal::Decimal; + +#[repr(C)] +pub struct Client { + client: *mut Coinbase +} + +impl Client { + pub fn coinbase(parameters: CoinbaseParameters) -> Self { + let client = crate::OpenLimits::instantiate(parameters); + let client = RUNTIME.block_on(client); + let client = client.unwrap(); + let client = Box::into_raw(Box::new(client)); + Self { client } + } + + pub fn order_book(self, market_pair: String) -> AskBid { + unsafe { + if let Some(client) = self.client.as_ref() { + let response = RUNTIME.block_on(client.order_book(&OrderBookRequest { market_pair })); + let response = response.unwrap(); + response.asks[0] + } else { + let price = Decimal::new(1, 1); + let qty = Decimal::new(1, 1); + AskBid { price, qty } + } + } + } +} diff --git a/src/bindings/client/ask_bid.rs b/src/bindings/client/ask_bid.rs new file mode 100644 index 0000000..9037bb9 --- /dev/null +++ b/src/bindings/client/ask_bid.rs @@ -0,0 +1,18 @@ +use ligen::marshalling::MarshalFrom; +use crate::model::AskBid; +use rust_decimal::Decimal; +use std::str::FromStr; + +#[repr(C)] +pub struct FFIAskBid { + price: i64, + qty: i64 +} + +impl MarshalFrom for AskBid { + fn marshal_from(from: FFIAskBid) -> Self { + let qty = Decimal::from_str(&String::marshal_from(from.qty)).expect("Invalid number format."); + let price = Decimal::from_str(&String::marshal_from(from.price)).expect("Invalid number format."); + Self { qty, price } + } +} \ No newline at end of file diff --git a/src/bindings/client/coinbase.rs b/src/bindings/client/coinbase.rs new file mode 100644 index 0000000..8b37fce --- /dev/null +++ b/src/bindings/client/coinbase.rs @@ -0,0 +1,30 @@ +use crate::bindings::string::FFIString; +use crate::bindings::environment::Environment; +use crate::exchange::coinbase::{CoinbaseParameters, CoinbaseCredentials}; +use ligen::marshalling::MarshalFrom; + +#[repr(C, packed(1))] +pub struct FFICoinbaseParameters { + environment: Environment, + apiKey: FFIString, + apiSecret: FFIString, + passphrase: FFIString +} + +impl MarshalFrom for CoinbaseParameters { + fn marshal_from(from: FFICoinbaseParameters) -> Self { + let sandbox = match from.environment { + Environment::Sandbox => true, + _ => false + }; + let api_key = String::marshal_from(from.apiKey); + let api_secret = String::marshal_from(from.apiSecret); + let passphrase = String::marshal_from(from.passphrase); + let credentials = if !api_key.is_empty() && !api_secret.is_empty() && !passphrase.is_empty() { + Some(CoinbaseCredentials { api_key, api_secret, passphrase }) + } else { + None + }; + Self { sandbox, credentials } + } +} \ No newline at end of file diff --git a/src/bindings/environment.rs b/src/bindings/environment.rs new file mode 100644 index 0000000..452cb3f --- /dev/null +++ b/src/bindings/environment.rs @@ -0,0 +1,5 @@ +#[repr(u32)] +pub enum Environment { + Sandbox, + Production +} diff --git a/src/bindings/string.rs b/src/bindings/string.rs new file mode 100644 index 0000000..514063b --- /dev/null +++ b/src/bindings/string.rs @@ -0,0 +1,20 @@ +use ligen::marshalling::MarshalFrom; + +#[repr(C)] +pub struct FFIString { + pub pointer: *mut i8 +} + +impl MarshalFrom for String { + fn marshal_from(value: FFIString) -> Self { + #[allow(unsafe_code)] + unsafe { + if value.pointer.is_null() { + "".into() + } else { + let cstr = std::ffi::CStr::from_ptr(value.pointer); + cstr.to_string_lossy().to_string() + } + } + } +} diff --git a/src/exchange/coinbase/client/base_client.rs b/src/exchange/coinbase/client/base_client.rs index 4fab813..71138bd 100644 --- a/src/exchange/coinbase/client/base_client.rs +++ b/src/exchange/coinbase/client/base_client.rs @@ -1,7 +1,7 @@ use super::Transport; /// The coinbase client -#[derive(Clone)] +#[derive(Clone, Debug)] pub struct BaseClient { pub transport: Transport, } \ No newline at end of file diff --git a/src/exchange/coinbase/coinbase_credentials.rs b/src/exchange/coinbase/coinbase_credentials.rs index 824b782..af12590 100644 --- a/src/exchange/coinbase/coinbase_credentials.rs +++ b/src/exchange/coinbase/coinbase_credentials.rs @@ -1,5 +1,5 @@ /// This struct represents the coinbase credentials -#[derive(Clone)] +#[derive(Clone, Debug)] pub struct CoinbaseCredentials { pub api_key: String, pub api_secret: String, diff --git a/src/exchange/coinbase/coinbase_parameters.rs b/src/exchange/coinbase/coinbase_parameters.rs index a85557b..17297b8 100644 --- a/src/exchange/coinbase/coinbase_parameters.rs +++ b/src/exchange/coinbase/coinbase_parameters.rs @@ -1,7 +1,7 @@ use super::CoinbaseCredentials; /// This struct represents the coinbase parameters -#[derive(Default, Clone)] +#[derive(Default, Clone, Debug)] pub struct CoinbaseParameters { pub sandbox: bool, pub credentials: Option, diff --git a/src/exchange/coinbase/mod.rs b/src/exchange/coinbase/mod.rs index 1ae4c1c..f5659fa 100644 --- a/src/exchange/coinbase/mod.rs +++ b/src/exchange/coinbase/mod.rs @@ -19,6 +19,11 @@ //! } //! ``` +#[cfg(feature = "bindings")] +use ligen_macro::inner_ligen; + +#[cfg(feature = "bindings")] +inner_ligen!(ignore); use std::convert::TryFrom; use async_trait::async_trait; @@ -126,10 +131,13 @@ impl ExchangeInfoRetrieval for Coinbase { #[async_trait] impl ExchangeMarketData for Coinbase { async fn order_book(&self, req: &OrderBookRequest) -> Result { - self.client + println!("order_book"); + let response = self.client .book::(&req.market_pair) .await - .map(Into::into) + .map(Into::into); + println!("returning order_book"); + response } async fn get_price_ticker(&self, req: &GetPriceTickerRequest) -> Result { diff --git a/src/exchange/coinbase/transport.rs b/src/exchange/coinbase/transport.rs index efd6fb1..76d229d 100644 --- a/src/exchange/coinbase/transport.rs +++ b/src/exchange/coinbase/transport.rs @@ -235,7 +235,6 @@ impl Transport { }; let sign_message = format!("{}{}{}", prefix, path, body); - println!("sign message: {}", sign_message); mac.update(sign_message.as_bytes()); let signature = base64::encode(mac.finalize().into_bytes()); @@ -250,7 +249,6 @@ impl Transport { StatusCode::OK => { let text = response.text().await?; serde_json::from_str::(&text).map_err(move |err| { - println!("{}", &text); OpenLimitsError::NotParsableResponse(format!("Error:{} Payload: {}", err, text)) }) } diff --git a/src/exchange/mod.rs b/src/exchange/mod.rs index 37e159f..2815e9a 100644 --- a/src/exchange/mod.rs +++ b/src/exchange/mod.rs @@ -6,4 +6,4 @@ pub mod coinbase; pub use openlimits_exchange::traits; pub use openlimits_exchange::shared; pub use openlimits_exchange::model; -pub use openlimits_exchange::errors; \ No newline at end of file +pub use openlimits_exchange::errors; diff --git a/src/lib.rs b/src/lib.rs index ba4c839..2a10eb2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -40,17 +40,11 @@ pub mod exchange; pub mod prelude; +#[cfg(feature = "bindings")] +pub mod bindings; -use crate::prelude::*; -use crate::exchange::shared::Result; pub use crate::exchange::errors; pub use crate::exchange::model; -// /// Can be used to initiate exchanges -// pub struct OpenLimits {} -// -// impl OpenLimits { -// pub async fn instantiate(parameters: E::InitParams) -> Result { -// Ok(E::new(parameters).await?) -// } -// } +mod openlimits; +pub use openlimits::*; \ No newline at end of file diff --git a/src/openlimits.rs b/src/openlimits.rs new file mode 100644 index 0000000..b218bbd --- /dev/null +++ b/src/openlimits.rs @@ -0,0 +1,16 @@ +#[cfg(feature = "bindings")] +use ligen_macro::inner_ligen; +#[cfg(feature = "bindings")] +inner_ligen!(ignore); + +use crate::prelude::*; +use crate::exchange::shared::Result; + +/// Can be used to initiate exchanges +pub struct OpenLimits {} + +impl OpenLimits { + pub async fn instantiate(parameters: E::InitParams) -> Result { + Ok(E::new(parameters).await?) + } +} From cad4f97251c4fd92d4fd63f3ba5bcae0c85b4581 Mon Sep 17 00:00:00 2001 From: Danilo Guanabara Date: Fri, 15 Oct 2021 16:24:45 -0300 Subject: [PATCH 13/23] Generating generics and arrays --- examples/csharp/Example.csproj | 2 +- examples/csharp/Program.cs | 25 +++++++------ examples/csharp/run.sh | 3 +- src/bindings/ask_bid.rs | 34 +++++++++++++++++ src/bindings/client.rs | 27 +++++++++----- src/bindings/client/ask_bid.rs | 18 --------- src/bindings/client/coinbase.rs | 17 +++++++++ src/{bindings.rs => bindings/mod.rs} | 3 ++ src/bindings/option.rs | 4 ++ src/bindings/orderbook.rs | 18 +++++++++ src/bindings/string.rs | 39 +++++++++++++++++++- src/bindings/vector/mod.rs | 53 +++++++++++++++++++++++++++ src/bindings/vector/vector.methods.cs | 27 ++++++++++++++ src/exchange/coinbase/mod.rs | 7 +--- 14 files changed, 231 insertions(+), 46 deletions(-) create mode 100644 src/bindings/ask_bid.rs delete mode 100644 src/bindings/client/ask_bid.rs rename src/{bindings.rs => bindings/mod.rs} (94%) create mode 100644 src/bindings/option.rs create mode 100644 src/bindings/orderbook.rs create mode 100644 src/bindings/vector/mod.rs create mode 100644 src/bindings/vector/vector.methods.cs diff --git a/examples/csharp/Example.csproj b/examples/csharp/Example.csproj index 76a9358..6ed5d8c 100644 --- a/examples/csharp/Example.csproj +++ b/examples/csharp/Example.csproj @@ -1,7 +1,7 @@ - + diff --git a/examples/csharp/Program.cs b/examples/csharp/Program.cs index 8bdba4d..bd6327c 100644 --- a/examples/csharp/Program.cs +++ b/examples/csharp/Program.cs @@ -4,22 +4,25 @@ namespace Example { using Openlimits; using System.Threading; + using System.Collections.Generic; class Program { static public void Main(string[] args) { -// Console.WriteLine("Init"); -// Test.Hello(); -// var test = new Test(64, Environment.Sandbox); -// Console.WriteLine(test.value); -// Console.WriteLine(test.environment); -// var test2 = Test.Create(32); -// Console.WriteLine(test2.value); -// Console.WriteLine(test2.environment); CoinbaseParameters parameters = new CoinbaseParameters(Environment.Production, "a", "b", "c"); Client client = Client.Coinbase(parameters); - Client.OrderBook(client, "BTC-EUR"); -// var person = new Person("Danilo", "Guanabara"); + AskBid askBid = client.OrderBook("BTC-EUR"); + Console.WriteLine(Decimal.Parse(askBid.qty)); + Console.WriteLine(askBid.price); + var list = new List(); + list.Add(1); + list.Add(2); + list.Add(3); + Console.WriteLine(client.Sum(list)); + var result = client.Mul(list, 2); + foreach (var value in result) { + Console.WriteLine(value); + } // Test.Display(person); // NashClientConfig config = NashClientConfig.Unauthenticated(0, NashEnvironment.Production, 1000); // Console.WriteLine(config.environment); @@ -28,7 +31,7 @@ static public void Main(string[] args) // client.SubscribeToDisconnect(() => { // Console.WriteLine("Disconnected"); // }); -// foreach(var market in client.R qeceivePairs()) { +// foreach(var market in client.ReceivePairs()) { // client.SubscribeToOrderbook(market.symbol, PrintBook); // } // diff --git a/examples/csharp/run.sh b/examples/csharp/run.sh index 9e621b8..91fd993 100755 --- a/examples/csharp/run.sh +++ b/examples/csharp/run.sh @@ -1,4 +1,5 @@ # cargo build --manifest-path ../../Cargo.toml -cp ../../target/ligen/openlimits/lib/openlimits.dll ./bin/Debug/netcoreapp5.0/openlimits_csharp.dll +# cp ../../target/ligen/openlimits/lib/openlimits.dll ./bin/Debug/netcoreapp5.0/openlimits_csharp.dll +cp ../../target/ligen/openlimits/lib/libopenlimits.so ./bin/Debug/netcoreapp5.0/libopenlimits_csharp.so dotnet run diff --git a/src/bindings/ask_bid.rs b/src/bindings/ask_bid.rs new file mode 100644 index 0000000..e039197 --- /dev/null +++ b/src/bindings/ask_bid.rs @@ -0,0 +1,34 @@ +use ligen::marshalling::{MarshalFrom, MarshalInto}; +use crate::model::AskBid; +use rust_decimal::Decimal; +use std::str::FromStr; +use crate::bindings::string::FFIString; + +use ligen_macro::inner_ligen; + +inner_ligen! { + ffi(AskBid(name = "FFIAskBid")), + csharp(ffi(FFIAskBid(name = "AskBid"))) +} + +#[repr(C)] +pub struct FFIAskBid { + price: FFIString, + qty: FFIString +} + +impl MarshalFrom for AskBid { + fn marshal_from(from: FFIAskBid) -> Self { + let qty = Decimal::from_str(&String::marshal_from(from.qty)).expect("Invalid number format."); + let price = Decimal::from_str(&String::marshal_from(from.price)).expect("Invalid number format."); + Self { qty, price } + } +} + +impl MarshalFrom for FFIAskBid { + fn marshal_from(from: AskBid) -> Self { + let qty = from.qty.marshal_into(); + let price = from.price.marshal_into(); + Self { price, qty } + } +} \ No newline at end of file diff --git a/src/bindings/client.rs b/src/bindings/client.rs index feb3813..fa10f61 100644 --- a/src/bindings/client.rs +++ b/src/bindings/client.rs @@ -1,26 +1,27 @@ -use crate::exchange::coinbase::{CoinbaseParameters, Coinbase}; -use crate::prelude::*; +use rust_decimal::Decimal; -mod ask_bid; -pub use ask_bid::FFIAskBid; +use runtime::RUNTIME; + +pub use crate::bindings::ask_bid::FFIAskBid; +use crate::exchange::coinbase::{Coinbase, CoinbaseParameters}; +use crate::model::AskBid; +use crate::prelude::*; pub mod coinbase; mod runtime { use ligen_macro::inner_ligen; + + pub use runtime::RUNTIME; + inner_ligen!(ignore); mod runtime { lazy_static::lazy_static! { pub static ref RUNTIME: tokio::runtime::Runtime = tokio::runtime::Runtime::new().unwrap(); } } - pub use runtime::RUNTIME; } -use runtime::RUNTIME; -use crate::model::AskBid; -use rust_decimal::Decimal; - #[repr(C)] pub struct Client { client: *mut Coinbase @@ -35,6 +36,14 @@ impl Client { Self { client } } + pub fn sum(self, a: Vec) -> u64 { + a.iter().sum() + } + + pub fn mul(self, a: Vec, n: u64) -> Vec { + a.iter().map(|x| x * n).collect() + } + pub fn order_book(self, market_pair: String) -> AskBid { unsafe { if let Some(client) = self.client.as_ref() { diff --git a/src/bindings/client/ask_bid.rs b/src/bindings/client/ask_bid.rs deleted file mode 100644 index 9037bb9..0000000 --- a/src/bindings/client/ask_bid.rs +++ /dev/null @@ -1,18 +0,0 @@ -use ligen::marshalling::MarshalFrom; -use crate::model::AskBid; -use rust_decimal::Decimal; -use std::str::FromStr; - -#[repr(C)] -pub struct FFIAskBid { - price: i64, - qty: i64 -} - -impl MarshalFrom for AskBid { - fn marshal_from(from: FFIAskBid) -> Self { - let qty = Decimal::from_str(&String::marshal_from(from.qty)).expect("Invalid number format."); - let price = Decimal::from_str(&String::marshal_from(from.price)).expect("Invalid number format."); - Self { qty, price } - } -} \ No newline at end of file diff --git a/src/bindings/client/coinbase.rs b/src/bindings/client/coinbase.rs index 8b37fce..77dfd57 100644 --- a/src/bindings/client/coinbase.rs +++ b/src/bindings/client/coinbase.rs @@ -2,6 +2,23 @@ use crate::bindings::string::FFIString; use crate::bindings::environment::Environment; use crate::exchange::coinbase::{CoinbaseParameters, CoinbaseCredentials}; use ligen::marshalling::MarshalFrom; +use ligen_macro::inner_ligen; + +inner_ligen! { + ffi(CoinbaseParameters(name = "FFICoinbaseParameters")), + marshal( + FFICoinbaseParameters( + name = "CoinbaseParameters" + ) + ), + csharp( + ffi( + FFICoinbaseParameters( + name = "CoinbaseParameters" + ) + ), + ) +} #[repr(C, packed(1))] pub struct FFICoinbaseParameters { diff --git a/src/bindings.rs b/src/bindings/mod.rs similarity index 94% rename from src/bindings.rs rename to src/bindings/mod.rs index a499c21..a57ddb3 100644 --- a/src/bindings.rs +++ b/src/bindings/mod.rs @@ -3,6 +3,9 @@ pub mod string; pub mod environment; pub mod client; +pub mod ask_bid; +pub mod orderbook; +pub mod vector; // use ligen::marshalling::{MarshalFrom, MarshalInto}; // #[repr(C)] diff --git a/src/bindings/option.rs b/src/bindings/option.rs new file mode 100644 index 0000000..7f995d7 --- /dev/null +++ b/src/bindings/option.rs @@ -0,0 +1,4 @@ +// pub enum FFIOption { +// Some(T), +// None +// } diff --git a/src/bindings/orderbook.rs b/src/bindings/orderbook.rs new file mode 100644 index 0000000..8bd49c9 --- /dev/null +++ b/src/bindings/orderbook.rs @@ -0,0 +1,18 @@ +// use crate::model::OrderBookResponse; +// use crate::bindings::client::FFIAskBid; +// use crate::bindings::vector::FFIVector; +// +// #[repr(C)] +// pub struct FFIOrderBookResponse { +// update_id: *mut u64, +// last_update_id: *mut u64, +// bids: FFIVector, +// asks: FFIVector +// } +// +// impl MarshalFrom for FFIOrderBookResponse { +// fn marshal_from(value: OrderBookResponse) -> Self { +// +// Self { update_id, last_update_id, bids, asks } +// } +// } \ No newline at end of file diff --git a/src/bindings/string.rs b/src/bindings/string.rs index 514063b..e423ec7 100644 --- a/src/bindings/string.rs +++ b/src/bindings/string.rs @@ -1,4 +1,25 @@ -use ligen::marshalling::MarshalFrom; +use ligen::marshalling::{MarshalFrom, MarshalInto}; +use ligen_macro::inner_ligen; +use rust_decimal::Decimal; + +inner_ligen! { + FFIString(ignore = true), + ffi( + String(name = "FFIString") + ), + csharp( + marshal( + FFIString( + name = "string", + MarshalAs = "UnmanagedType.LPStr" + ), + String( + name = "string", + MarshalAs = "UnmanagedType.LPStr" + ) + ), + ) +} #[repr(C)] pub struct FFIString { @@ -18,3 +39,19 @@ impl MarshalFrom for String { } } } + +impl MarshalFrom for FFIString { + fn marshal_from(value: String) -> Self { + let mut value = value; + let pointer = value.as_mut_ptr() as *mut i8; + // FIXME: Memory leak. + Box::into_raw(Box::new(value)); + Self { pointer } + } +} + +impl MarshalFrom for FFIString { + fn marshal_from(value: Decimal) -> Self { + value.to_string().marshal_into() + } +} diff --git a/src/bindings/vector/mod.rs b/src/bindings/vector/mod.rs new file mode 100644 index 0000000..c75437f --- /dev/null +++ b/src/bindings/vector/mod.rs @@ -0,0 +1,53 @@ +use ligen_macro::inner_ligen; +use ligen::marshalling::MarshalFrom; + +inner_ligen! { + ffi( + Vec(name = "FFIVector") + ), + csharp( + ffi( + Vec( + name = "FFIVector" + ), + FFIVector( + name = "FFIVector" + ) + ), + marshal( + Vec( + name = "List" + ), + FFIVector( + name = "List", + methods = "src/bindings/vector/vector.methods.cs", + generics = " where T: unmanaged" + ) + ), + ) +} + +#[repr(C)] +pub struct FFIVector { + pub pointer: *mut T, + pub length: u64 +} + +impl MarshalFrom> for Vec { + fn marshal_from(from: FFIVector) -> Self { + let length = from.length as usize; + unsafe { + std::slice::from_raw_parts(from.pointer, length).to_vec() + } + } +} + +impl MarshalFrom> for FFIVector { + fn marshal_from(mut from: Vec) -> Self { + let pointer = from.as_mut_ptr(); + let length = from.len() as u64; + // FIXME: Memory leak. + std::mem::forget(from); + Self { pointer, length } + } +} diff --git a/src/bindings/vector/vector.methods.cs b/src/bindings/vector/vector.methods.cs new file mode 100644 index 0000000..f650c87 --- /dev/null +++ b/src/bindings/vector/vector.methods.cs @@ -0,0 +1,27 @@ +public static implicit operator FFIVector(List from) { + var array = from.ToArray(); + ulong length = (ulong) from.Count; + GCHandle handle = GCHandle.Alloc(array, GCHandleType.Pinned); + try { + IntPtr pointer = handle.AddrOfPinnedObject(); + return new FFIVector(pointer, length); + } finally { + // if (handle.IsAllocated) + // handle.Free(); + } +} + +public static implicit operator List(FFIVector from) { + unsafe { + T[] array = new T[from.length]; + fixed (T* apointer = array) { + long length = (long) from.length * (long) sizeof(T); + Buffer.MemoryCopy((void*) from.pointer, (void*) apointer, length, length); + List list = new List(); + foreach (T t in array) { + list.Add(t); + } + return list; + } + } +} \ No newline at end of file diff --git a/src/exchange/coinbase/mod.rs b/src/exchange/coinbase/mod.rs index f5659fa..e5f33ba 100644 --- a/src/exchange/coinbase/mod.rs +++ b/src/exchange/coinbase/mod.rs @@ -131,13 +131,10 @@ impl ExchangeInfoRetrieval for Coinbase { #[async_trait] impl ExchangeMarketData for Coinbase { async fn order_book(&self, req: &OrderBookRequest) -> Result { - println!("order_book"); - let response = self.client + self.client .book::(&req.market_pair) .await - .map(Into::into); - println!("returning order_book"); - response + .map(Into::into) } async fn get_price_ticker(&self, req: &GetPriceTickerRequest) -> Result { From 8e44adc552c2d6c4d93591a38a46b4e74875ac84 Mon Sep 17 00:00:00 2001 From: Danilo Guanabara Date: Fri, 15 Oct 2021 23:49:39 -0300 Subject: [PATCH 14/23] Preparing structures --- src/bindings/client.rs | 18 +++------- src/bindings/orderbook.rs | 50 +++++++++++++++++---------- src/bindings/vector/mod.rs | 25 +++++++------- src/bindings/vector/vector.methods.cs | 9 ++--- 4 files changed, 52 insertions(+), 50 deletions(-) diff --git a/src/bindings/client.rs b/src/bindings/client.rs index fa10f61..00a312e 100644 --- a/src/bindings/client.rs +++ b/src/bindings/client.rs @@ -1,10 +1,6 @@ -use rust_decimal::Decimal; - use runtime::RUNTIME; -pub use crate::bindings::ask_bid::FFIAskBid; use crate::exchange::coinbase::{Coinbase, CoinbaseParameters}; -use crate::model::AskBid; use crate::prelude::*; pub mod coinbase; @@ -44,17 +40,11 @@ impl Client { a.iter().map(|x| x * n).collect() } - pub fn order_book(self, market_pair: String) -> AskBid { + pub fn order_book(self, market_pair: String) -> OrderBookResponse { unsafe { - if let Some(client) = self.client.as_ref() { - let response = RUNTIME.block_on(client.order_book(&OrderBookRequest { market_pair })); - let response = response.unwrap(); - response.asks[0] - } else { - let price = Decimal::new(1, 1); - let qty = Decimal::new(1, 1); - AskBid { price, qty } - } + let client = self.client.as_ref().unwrap(); + let response = RUNTIME.block_on(client.order_book(&OrderBookRequest { market_pair })); + response.unwrap() } } } diff --git a/src/bindings/orderbook.rs b/src/bindings/orderbook.rs index 8bd49c9..2fbd0ea 100644 --- a/src/bindings/orderbook.rs +++ b/src/bindings/orderbook.rs @@ -1,18 +1,32 @@ -// use crate::model::OrderBookResponse; -// use crate::bindings::client::FFIAskBid; -// use crate::bindings::vector::FFIVector; -// -// #[repr(C)] -// pub struct FFIOrderBookResponse { -// update_id: *mut u64, -// last_update_id: *mut u64, -// bids: FFIVector, -// asks: FFIVector -// } -// -// impl MarshalFrom for FFIOrderBookResponse { -// fn marshal_from(value: OrderBookResponse) -> Self { -// -// Self { update_id, last_update_id, bids, asks } -// } -// } \ No newline at end of file +use crate::model::OrderBookResponse; +use crate::bindings::vector::FFIVector; +use ligen_macro::inner_ligen; +use std::ptr::null_mut; +use ligen::marshalling::MarshalFrom; +use crate::bindings::ask_bid::FFIAskBid; + +# Replicate generics logic to struct fields. +# We should have a FFI and a normal structure. + +inner_ligen! { + ffi(OrderBookResponse(name = "FFIOrderBookResponse")), + csharp() +} + +#[repr(C)] +pub struct FFIOrderBookResponse { + update_id: *mut u64, + last_update_id: *mut u64, + bids: FFIVector, + asks: FFIVector +} + +impl MarshalFrom for FFIOrderBookResponse { + fn marshal_from(_value: OrderBookResponse) -> Self { + let update_id = null_mut(); + let last_update_id = null_mut(); + let bids = Default::default(); + let asks = Default::default(); + Self { update_id, last_update_id, bids, asks } + } +} diff --git a/src/bindings/vector/mod.rs b/src/bindings/vector/mod.rs index c75437f..5450cdc 100644 --- a/src/bindings/vector/mod.rs +++ b/src/bindings/vector/mod.rs @@ -1,23 +1,16 @@ use ligen_macro::inner_ligen; use ligen::marshalling::MarshalFrom; +use std::ptr::null_mut; inner_ligen! { - ffi( - Vec(name = "FFIVector") - ), + ffi(Vec(name = "FFIVector")), csharp( ffi( - Vec( - name = "FFIVector" - ), - FFIVector( - name = "FFIVector" - ) + Vec(name = "FFIVector"), + FFIVector(name = "FFIVector") ), marshal( - Vec( - name = "List" - ), + Vec(name = "List"), FFIVector( name = "List", methods = "src/bindings/vector/vector.methods.cs", @@ -33,6 +26,14 @@ pub struct FFIVector { pub length: u64 } +impl Default for FFIVector { + fn default() -> Self { + let pointer = null_mut(); + let length = 0; + Self { pointer, length } + } +} + impl MarshalFrom> for Vec { fn marshal_from(from: FFIVector) -> Self { let length = from.length as usize; diff --git a/src/bindings/vector/vector.methods.cs b/src/bindings/vector/vector.methods.cs index f650c87..4b13cf2 100644 --- a/src/bindings/vector/vector.methods.cs +++ b/src/bindings/vector/vector.methods.cs @@ -6,6 +6,7 @@ public static implicit operator FFIVector(List from) { IntPtr pointer = handle.AddrOfPinnedObject(); return new FFIVector(pointer, length); } finally { + // FIXME: Memory leak? It seems to be garbage collected. // if (handle.IsAllocated) // handle.Free(); } @@ -17,11 +18,7 @@ public static implicit operator List(FFIVector from) { fixed (T* apointer = array) { long length = (long) from.length * (long) sizeof(T); Buffer.MemoryCopy((void*) from.pointer, (void*) apointer, length, length); - List list = new List(); - foreach (T t in array) { - list.Add(t); - } - return list; + return new List(array); } } -} \ No newline at end of file +} From 936115b4297ee9599414ef1f2456b1198834f8aa Mon Sep 17 00:00:00 2001 From: Danilo Guanabara Date: Wed, 20 Oct 2021 22:35:54 -0300 Subject: [PATCH 15/23] string marshalling --- examples/csharp/Program.cs | 8 +-- examples/csharp/run.sh | 4 +- src/bindings/client.rs | 18 ++++--- src/bindings/orderbook.rs | 4 +- src/bindings/string.rs | 57 -------------------- src/bindings/string/mod.rs | 78 +++++++++++++++++++++++++++ src/bindings/string/string.methods.cs | 12 +++++ src/bindings/vector/vector.methods.cs | 46 ++++++++-------- 8 files changed, 133 insertions(+), 94 deletions(-) delete mode 100644 src/bindings/string.rs create mode 100644 src/bindings/string/mod.rs create mode 100644 src/bindings/string/string.methods.cs diff --git a/examples/csharp/Program.cs b/examples/csharp/Program.cs index bd6327c..606697d 100644 --- a/examples/csharp/Program.cs +++ b/examples/csharp/Program.cs @@ -11,9 +11,9 @@ static public void Main(string[] args) { CoinbaseParameters parameters = new CoinbaseParameters(Environment.Production, "a", "b", "c"); Client client = Client.Coinbase(parameters); - AskBid askBid = client.OrderBook("BTC-EUR"); - Console.WriteLine(Decimal.Parse(askBid.qty)); - Console.WriteLine(askBid.price); +// OrderBookResponse response = client.OrderBook("BTC-EUR"); +// Console.WriteLine(Decimal.Parse(askBid.qty)); +// Console.WriteLine(askBid.price); var list = new List(); list.Add(1); list.Add(2); @@ -23,6 +23,8 @@ static public void Main(string[] args) foreach (var value in result) { Console.WriteLine(value); } + Console.WriteLine(client.GetName()); + // Test.Display(person); // NashClientConfig config = NashClientConfig.Unauthenticated(0, NashEnvironment.Production, 1000); // Console.WriteLine(config.environment); diff --git a/examples/csharp/run.sh b/examples/csharp/run.sh index 91fd993..6f62228 100755 --- a/examples/csharp/run.sh +++ b/examples/csharp/run.sh @@ -1,5 +1,5 @@ # cargo build --manifest-path ../../Cargo.toml -# cp ../../target/ligen/openlimits/lib/openlimits.dll ./bin/Debug/netcoreapp5.0/openlimits_csharp.dll -cp ../../target/ligen/openlimits/lib/libopenlimits.so ./bin/Debug/netcoreapp5.0/libopenlimits_csharp.so +cp ../../target/ligen/openlimits/lib/openlimits.dll ./bin/Debug/netcoreapp5.0/openlimits_csharp.dll +# cp ../../target/ligen/openlimits/lib/libopenlimits.so ./bin/Debug/netcoreapp5.0/libopenlimits_csharp.so dotnet run diff --git a/src/bindings/client.rs b/src/bindings/client.rs index 00a312e..526333b 100644 --- a/src/bindings/client.rs +++ b/src/bindings/client.rs @@ -1,7 +1,7 @@ use runtime::RUNTIME; use crate::exchange::coinbase::{Coinbase, CoinbaseParameters}; -use crate::prelude::*; +// use crate::prelude::*; pub mod coinbase; @@ -40,11 +40,15 @@ impl Client { a.iter().map(|x| x * n).collect() } - pub fn order_book(self, market_pair: String) -> OrderBookResponse { - unsafe { - let client = self.client.as_ref().unwrap(); - let response = RUNTIME.block_on(client.order_book(&OrderBookRequest { market_pair })); - response.unwrap() - } + pub fn get_name(self) -> String { + "Abc".to_string() } + + // pub fn order_book(self, market_pair: String) -> OrderBookResponse { + // unsafe { + // let client = self.client.as_ref().unwrap(); + // let response = RUNTIME.block_on(client.order_book(&OrderBookRequest { market_pair })); + // response.unwrap() + // } + // } } diff --git a/src/bindings/orderbook.rs b/src/bindings/orderbook.rs index 2fbd0ea..ff3e248 100644 --- a/src/bindings/orderbook.rs +++ b/src/bindings/orderbook.rs @@ -5,8 +5,8 @@ use std::ptr::null_mut; use ligen::marshalling::MarshalFrom; use crate::bindings::ask_bid::FFIAskBid; -# Replicate generics logic to struct fields. -# We should have a FFI and a normal structure. +// # Replicate generics logic to struct fields. +// # We should have a FFI and a normal structure. inner_ligen! { ffi(OrderBookResponse(name = "FFIOrderBookResponse")), diff --git a/src/bindings/string.rs b/src/bindings/string.rs deleted file mode 100644 index e423ec7..0000000 --- a/src/bindings/string.rs +++ /dev/null @@ -1,57 +0,0 @@ -use ligen::marshalling::{MarshalFrom, MarshalInto}; -use ligen_macro::inner_ligen; -use rust_decimal::Decimal; - -inner_ligen! { - FFIString(ignore = true), - ffi( - String(name = "FFIString") - ), - csharp( - marshal( - FFIString( - name = "string", - MarshalAs = "UnmanagedType.LPStr" - ), - String( - name = "string", - MarshalAs = "UnmanagedType.LPStr" - ) - ), - ) -} - -#[repr(C)] -pub struct FFIString { - pub pointer: *mut i8 -} - -impl MarshalFrom for String { - fn marshal_from(value: FFIString) -> Self { - #[allow(unsafe_code)] - unsafe { - if value.pointer.is_null() { - "".into() - } else { - let cstr = std::ffi::CStr::from_ptr(value.pointer); - cstr.to_string_lossy().to_string() - } - } - } -} - -impl MarshalFrom for FFIString { - fn marshal_from(value: String) -> Self { - let mut value = value; - let pointer = value.as_mut_ptr() as *mut i8; - // FIXME: Memory leak. - Box::into_raw(Box::new(value)); - Self { pointer } - } -} - -impl MarshalFrom for FFIString { - fn marshal_from(value: Decimal) -> Self { - value.to_string().marshal_into() - } -} diff --git a/src/bindings/string/mod.rs b/src/bindings/string/mod.rs new file mode 100644 index 0000000..cde3651 --- /dev/null +++ b/src/bindings/string/mod.rs @@ -0,0 +1,78 @@ +use ligen::marshalling::{MarshalFrom, MarshalInto}; +use ligen_macro::inner_ligen; +use rust_decimal::Decimal; +use std::ffi::{CString, CStr}; + +inner_ligen! { + ffi( + String(name = "FFIString"), + FFString(opaque = true) + ), + + csharp( + ffi( + String( + name = "FFIString" + ), + ), + marshal( + FFIString( + methods = "src/bindings/string/string.methods.cs", + ), + String( + name = "string", + methods = "src/bindings/string/string.methods.cs", + ) + ), + ) + + // csharp( + // marshal( + // FFIString( + // name = "string", + // MarshalAs = "UnmanagedType.LPStr" + // ), + // String( + // name = "string", + // MarshalAs = "UnmanagedType.LPStr" + // ) + // ), + // ) +} + +pub struct FFIString { + string: CString +} + +impl FFIString { + pub fn new(pointer: *mut i8) -> Self { + let string = unsafe { + CStr::from_ptr(pointer).to_owned() + }; + Self { string } + } + + pub fn get_pointer(self) -> *const i8 { + self.string.as_ptr() + } +} + +impl MarshalFrom for String { + fn marshal_from(value: FFIString) -> Self { + value.string.to_string_lossy().to_string() + } +} + +impl MarshalFrom for FFIString { + fn marshal_from(value: String) -> Self { + let error = format!("Failed to create CString from String({}).", value); + let string = CString::new(value).expect(&error); + Self { string } + } +} + +impl MarshalFrom for FFIString { + fn marshal_from(value: Decimal) -> Self { + value.to_string().marshal_into() + } +} diff --git a/src/bindings/string/string.methods.cs b/src/bindings/string/string.methods.cs new file mode 100644 index 0000000..f44c86e --- /dev/null +++ b/src/bindings/string/string.methods.cs @@ -0,0 +1,12 @@ + public static implicit operator string(FFIString from) { + unsafe { + return Marshal.PtrToStringUTF8(from.Pointer()); + } + } + + public static implicit operator FFIString(string from) { + unsafe { + return new FFIString(Marshal.StringToHGlobalAnsi(from)); + // FIXME: Memory leak https://docs.microsoft.com/pt-br/dotnet/api/system.runtime.interopservices.marshal.freehglobal?view=net-5.0 + } + } \ No newline at end of file diff --git a/src/bindings/vector/vector.methods.cs b/src/bindings/vector/vector.methods.cs index 4b13cf2..93c824d 100644 --- a/src/bindings/vector/vector.methods.cs +++ b/src/bindings/vector/vector.methods.cs @@ -1,24 +1,24 @@ -public static implicit operator FFIVector(List from) { - var array = from.ToArray(); - ulong length = (ulong) from.Count; - GCHandle handle = GCHandle.Alloc(array, GCHandleType.Pinned); - try { - IntPtr pointer = handle.AddrOfPinnedObject(); - return new FFIVector(pointer, length); - } finally { - // FIXME: Memory leak? It seems to be garbage collected. - // if (handle.IsAllocated) - // handle.Free(); - } -} - -public static implicit operator List(FFIVector from) { - unsafe { - T[] array = new T[from.length]; - fixed (T* apointer = array) { - long length = (long) from.length * (long) sizeof(T); - Buffer.MemoryCopy((void*) from.pointer, (void*) apointer, length, length); - return new List(array); + public static implicit operator FFIVector(List from) { + var array = from.ToArray(); + ulong length = (ulong) from.Count; + GCHandle handle = GCHandle.Alloc(array, GCHandleType.Pinned); + try { + IntPtr pointer = handle.AddrOfPinnedObject(); + return new FFIVector(pointer, length); + } finally { + // FIXME: Memory leak? It seems to be garbage collected. + // if (handle.IsAllocated) + // handle.Free(); + } } - } -} + + public static implicit operator List(FFIVector from) { + unsafe { + T[] array = new T[from.length]; + fixed (T* apointer = array) { + long length = (long) from.length * (long) sizeof(T); + Buffer.MemoryCopy((void*) from.pointer, (void*) apointer, length, length); + return new List(array); + } + } + } \ No newline at end of file From a536116b8a873ce2862d81932eb808429cdbb568 Mon Sep 17 00:00:00 2001 From: Danilo Guanabara Date: Wed, 27 Oct 2021 16:43:03 -0300 Subject: [PATCH 16/23] String marshalling is broken --- examples/csharp/Program.cs | 10 ++++++++-- src/bindings/client.rs | 4 ++-- src/bindings/string/mod.rs | 19 +++++++++++++++---- src/bindings/string/string.methods.cs | 2 +- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/examples/csharp/Program.cs b/examples/csharp/Program.cs index 606697d..7b1a544 100644 --- a/examples/csharp/Program.cs +++ b/examples/csharp/Program.cs @@ -5,13 +5,20 @@ namespace Example using Openlimits; using System.Threading; using System.Collections.Generic; + using System.Runtime.InteropServices; class Program { static public void Main(string[] args) { + var ffi_string = Client.FFIGetName(); + Console.WriteLine(ffi_string); +// var ptr = FFIString.FFIGetPointer(ffi_string); +// Console.WriteLine(ptr); + return; CoinbaseParameters parameters = new CoinbaseParameters(Environment.Production, "a", "b", "c"); + string key = parameters.apiKey; Client client = Client.Coinbase(parameters); -// OrderBookResponse response = client.OrderBook("BTC-EUR"); +// Console.WriteLine(Decimal.Parse(askBid.qty)); // Console.WriteLine(Decimal.Parse(askBid.qty)); // Console.WriteLine(askBid.price); var list = new List(); @@ -23,7 +30,6 @@ static public void Main(string[] args) foreach (var value in result) { Console.WriteLine(value); } - Console.WriteLine(client.GetName()); // Test.Display(person); // NashClientConfig config = NashClientConfig.Unauthenticated(0, NashEnvironment.Production, 1000); diff --git a/src/bindings/client.rs b/src/bindings/client.rs index 526333b..0311be3 100644 --- a/src/bindings/client.rs +++ b/src/bindings/client.rs @@ -40,8 +40,8 @@ impl Client { a.iter().map(|x| x * n).collect() } - pub fn get_name(self) -> String { - "Abc".to_string() + pub fn get_name() -> String { + "Abc".into() } // pub fn order_book(self, market_pair: String) -> OrderBookResponse { diff --git a/src/bindings/string/mod.rs b/src/bindings/string/mod.rs index cde3651..5673d34 100644 --- a/src/bindings/string/mod.rs +++ b/src/bindings/string/mod.rs @@ -5,8 +5,11 @@ use std::ffi::{CString, CStr}; inner_ligen! { ffi( - String(name = "FFIString"), - FFString(opaque = true) + String( + opaque = true, + name = "FFIString" + ), + FFIString(opaque = true) ), csharp( @@ -44,6 +47,12 @@ pub struct FFIString { string: CString } +impl Drop for FFIString { + fn drop(&mut self) { + println!("Why is {} being dropped?", self.get_pointer() as u64); + } +} + impl FFIString { pub fn new(pointer: *mut i8) -> Self { let string = unsafe { @@ -52,8 +61,10 @@ impl FFIString { Self { string } } - pub fn get_pointer(self) -> *const i8 { - self.string.as_ptr() + pub fn get_pointer(&self) -> *const i8 { + let ptr = self.string.as_ptr(); + println!("ptr: {} of {}", ptr as u64, self.string.to_string_lossy()); + ptr } } diff --git a/src/bindings/string/string.methods.cs b/src/bindings/string/string.methods.cs index f44c86e..925d122 100644 --- a/src/bindings/string/string.methods.cs +++ b/src/bindings/string/string.methods.cs @@ -1,6 +1,6 @@ public static implicit operator string(FFIString from) { unsafe { - return Marshal.PtrToStringUTF8(from.Pointer()); + return Marshal.PtrToStringUTF8(from.GetPointer()); } } From 5389ab30da89bacd60a076a17cc0cb1d9fa1267a Mon Sep 17 00:00:00 2001 From: Danilo Guanabara Date: Wed, 27 Oct 2021 17:30:09 -0300 Subject: [PATCH 17/23] Removed ligen from openlimits-exchange --- Cargo.toml | 4 ++-- bindings/REMOVE_ME | 0 .../openlimits-binance/src/client/websocket.rs | 4 ++-- crates/openlimits-binance/src/transport.rs | 4 ++-- crates/openlimits-exchange/Cargo.toml | 7 ------- crates/openlimits-exchange/build.rs | 18 ------------------ crates/openlimits-exchange/src/errors.rs | 2 -- crates/openlimits-exchange/src/exchange.rs | 2 -- crates/openlimits-exchange/src/market/mod.rs | 2 -- crates/openlimits-exchange/src/message/mod.rs | 2 -- .../openlimits-exchange/src/model/interval.rs | 2 -- crates/openlimits-exchange/src/model/order.rs | 2 -- .../src/model/order_filter.rs | 2 -- .../openlimits-exchange/src/model/paginator.rs | 2 -- crates/openlimits-exchange/src/model/python.rs | 2 -- .../src/model/request/mod.rs | 2 -- crates/openlimits-exchange/src/model/ticker.rs | 2 -- .../src/model/time_in_force_visitor.rs | 2 -- crates/openlimits-exchange/src/model/trade.rs | 2 -- .../src/model/transaction.rs | 2 -- .../openlimits-exchange/src/model/websocket.rs | 2 -- crates/openlimits-exchange/src/shared.rs | 2 -- crates/openlimits-exchange/src/traits/mod.rs | 2 -- src/lib.rs | 2 +- tests/mod.rs | 6 +++--- 25 files changed, 10 insertions(+), 69 deletions(-) create mode 100644 bindings/REMOVE_ME delete mode 100644 crates/openlimits-exchange/build.rs diff --git a/Cargo.toml b/Cargo.toml index 065a45f..72b92e4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,8 +47,8 @@ derive_more = "0.99" #nash-protocol = { version = "0.1", default-features = false, features = ["rustcrypto"] } #nash-native-client = { version = "0.1", default-features = false, features = ["rustcrypto"] } pyo3 = { version = "0.12.3", optional = true } -openlimits-binance = { version = "0.1" } -openlimits-exchange = { version = "0.1" } +openlimits-binance = { path = "crates/openlimits-binance" } +openlimits-exchange = { path = "crates/openlimits-exchange" } ligen-macro = { path = "../../sensorial/systems/ligen/ligen/macro", optional = true } ligen = { path = "../../sensorial/systems/ligen/ligen", optional = true } lazy_static = "1.4.0" diff --git a/bindings/REMOVE_ME b/bindings/REMOVE_ME new file mode 100644 index 0000000..e69de29 diff --git a/crates/openlimits-binance/src/client/websocket.rs b/crates/openlimits-binance/src/client/websocket.rs index d57a289..2afd66c 100644 --- a/crates/openlimits-binance/src/client/websocket.rs +++ b/crates/openlimits-binance/src/client/websocket.rs @@ -19,8 +19,8 @@ pub use openlimits_exchange::{ use openlimits_exchange::traits::stream::{ExchangeWs, Subscriptions}; use super::shared::Result; -const WS_URL_PROD: &str = "wss://stream.openlimits-binance.com:9443/stream"; -const WS_URL_SANDBOX: &str = "wss://testnet.openlimits-binance.vision/stream"; +const WS_URL_PROD: &str = "wss://stream.binance.com:9443/stream"; +const WS_URL_SANDBOX: &str = "wss://testnet.binance.vision/stream"; #[derive(Debug, Clone, Deserialize, Serialize)] #[serde(untagged)] diff --git a/crates/openlimits-binance/src/transport.rs b/crates/openlimits-binance/src/transport.rs index 2fd11e0..8084480 100644 --- a/crates/openlimits-binance/src/transport.rs +++ b/crates/openlimits-binance/src/transport.rs @@ -55,9 +55,9 @@ impl Transport { fn get_base_url(sandbox: bool) -> String { if sandbox { - String::from("https://testnet.openlimits-binance.vision") + String::from("https://testnet.binance.vision") } else { - String::from("https://api.openlimits-binance.com") + String::from("https://api.binance.com") } } diff --git a/crates/openlimits-exchange/Cargo.toml b/crates/openlimits-exchange/Cargo.toml index 692fb59..bbf9dfa 100644 --- a/crates/openlimits-exchange/Cargo.toml +++ b/crates/openlimits-exchange/Cargo.toml @@ -27,10 +27,3 @@ anyhow = "1.0.38" reqwest = { version = "0.11", features = ["json", "blocking"] } tokio-tungstenite = { version = "0.13", features = ["tls"] } tokio = "1.6.0" -ligen-macro = { path = "../../../../sensorial/systems/ligen/ligen/macro" } - -[build-dependencies] -ligen = { path = "../../../../sensorial/systems/ligen/ligen" } -ligen-c = { path = "../../../../sensorial/systems/ligen/generators/ligen-c" } -ligen-csharp = { path = "../../../../sensorial/systems/ligen/generators/ligen-csharp" } -ligen-cmake = { path = "../../../../sensorial/systems/ligen/generators/ligen-cmake" } \ No newline at end of file diff --git a/crates/openlimits-exchange/build.rs b/crates/openlimits-exchange/build.rs deleted file mode 100644 index 56f31d9..0000000 --- a/crates/openlimits-exchange/build.rs +++ /dev/null @@ -1,18 +0,0 @@ -use ligen::prelude::*; -// use ligen_c::CGenerator; -// use ligen_cmake::{CMakeGenerator, Language}; -use ligen_csharp::CSharpGenerator; -//use ligen::ir::Module; - -fn main() { - // let module = Module::from_path("src/model/candle.rs").expect("Couldn't read module."); - // if let Ok(project) = Project::read_from_module(module) { - if let Ok(project) = Project::current() { - // let c_generator = CGenerator::default(); - // let cmake_generator = CMakeGenerator(Language::C); - let csharp_generator = CSharpGenerator::default(); - // cmake_generator.generate(&project).expect("Couldn't generate CMake project."); - // c_generator.generate(&project).expect("Couldn't generate C bindings."); - csharp_generator.generate(&project).expect("Couldn't generate C# bindings.") - } -} diff --git a/crates/openlimits-exchange/src/errors.rs b/crates/openlimits-exchange/src/errors.rs index 2612516..b54fec7 100644 --- a/crates/openlimits-exchange/src/errors.rs +++ b/crates/openlimits-exchange/src/errors.rs @@ -1,5 +1,3 @@ -ligen_macro::ignore!(); - use serde::{Deserialize, Serialize}; use std::fmt; use thiserror::Error; diff --git a/crates/openlimits-exchange/src/exchange.rs b/crates/openlimits-exchange/src/exchange.rs index cbbcfaf..8663cbc 100644 --- a/crates/openlimits-exchange/src/exchange.rs +++ b/crates/openlimits-exchange/src/exchange.rs @@ -1,5 +1,3 @@ -ligen_macro::ignore!(); - use messaging::Subscriber; use async_trait::async_trait; diff --git a/crates/openlimits-exchange/src/market/mod.rs b/crates/openlimits-exchange/src/market/mod.rs index b3dee07..06d1f16 100644 --- a/crates/openlimits-exchange/src/market/mod.rs +++ b/crates/openlimits-exchange/src/market/mod.rs @@ -1,5 +1,3 @@ -ligen_macro::ignore!(); - pub mod symbol; use symbol::Symbol; diff --git a/crates/openlimits-exchange/src/message/mod.rs b/crates/openlimits-exchange/src/message/mod.rs index 73298ea..88bac56 100644 --- a/crates/openlimits-exchange/src/message/mod.rs +++ b/crates/openlimits-exchange/src/message/mod.rs @@ -1,4 +1,2 @@ -ligen_macro::ignore!(); - pub mod request; pub mod subscription; \ No newline at end of file diff --git a/crates/openlimits-exchange/src/model/interval.rs b/crates/openlimits-exchange/src/model/interval.rs index ca2eccf..93d046b 100644 --- a/crates/openlimits-exchange/src/model/interval.rs +++ b/crates/openlimits-exchange/src/model/interval.rs @@ -1,5 +1,3 @@ -ligen_macro::ignore!(); - use chrono::Duration; use serde::Deserialize; use serde::Serialize; diff --git a/crates/openlimits-exchange/src/model/order.rs b/crates/openlimits-exchange/src/model/order.rs index 9f0de75..4ad8ad9 100644 --- a/crates/openlimits-exchange/src/model/order.rs +++ b/crates/openlimits-exchange/src/model/order.rs @@ -1,5 +1,3 @@ -ligen_macro::ignore!(); - use derive_more::Constructor; use rust_decimal::prelude::Decimal; use serde::Deserialize; diff --git a/crates/openlimits-exchange/src/model/order_filter.rs b/crates/openlimits-exchange/src/model/order_filter.rs index bdf6767..4239114 100644 --- a/crates/openlimits-exchange/src/model/order_filter.rs +++ b/crates/openlimits-exchange/src/model/order_filter.rs @@ -1,5 +1,3 @@ -ligen_macro::ignore!(); - use rust_decimal::prelude::Decimal; use serde::Deserialize; use serde::Serialize; diff --git a/crates/openlimits-exchange/src/model/paginator.rs b/crates/openlimits-exchange/src/model/paginator.rs index 77aafc3..756c474 100644 --- a/crates/openlimits-exchange/src/model/paginator.rs +++ b/crates/openlimits-exchange/src/model/paginator.rs @@ -1,5 +1,3 @@ -ligen_macro::ignore!(); - use serde::Deserialize; use serde::Serialize; diff --git a/crates/openlimits-exchange/src/model/python.rs b/crates/openlimits-exchange/src/model/python.rs index 2b74d94..0a60f4c 100644 --- a/crates/openlimits-exchange/src/model/python.rs +++ b/crates/openlimits-exchange/src/model/python.rs @@ -1,5 +1,3 @@ -ligen_macro::ignore!(); - use super::websocket::{OpenLimitsWebSocketMessage, Subscription}; use crate::exchange::any::InitAnyExchange; use crate::exchange::binance::{BinanceCredentials, BinanceParameters}; diff --git a/crates/openlimits-exchange/src/model/request/mod.rs b/crates/openlimits-exchange/src/model/request/mod.rs index 52ea50a..b2dcd0f 100644 --- a/crates/openlimits-exchange/src/model/request/mod.rs +++ b/crates/openlimits-exchange/src/model/request/mod.rs @@ -1,7 +1,5 @@ //! This module contains all the request response pairs. -ligen_macro::ignore!(); - mod cancel_all_order_request; mod cancel_order_request; mod get_historic_rates_request; diff --git a/crates/openlimits-exchange/src/model/ticker.rs b/crates/openlimits-exchange/src/model/ticker.rs index 0e63a61..f7d6967 100644 --- a/crates/openlimits-exchange/src/model/ticker.rs +++ b/crates/openlimits-exchange/src/model/ticker.rs @@ -1,5 +1,3 @@ -ligen_macro::ignore!(); - use derive_more::Constructor; use rust_decimal::prelude::Decimal; use serde::Deserialize; diff --git a/crates/openlimits-exchange/src/model/time_in_force_visitor.rs b/crates/openlimits-exchange/src/model/time_in_force_visitor.rs index cd903e5..a371e31 100644 --- a/crates/openlimits-exchange/src/model/time_in_force_visitor.rs +++ b/crates/openlimits-exchange/src/model/time_in_force_visitor.rs @@ -1,5 +1,3 @@ -ligen_macro::ignore!(); - use chrono::Duration; use serde::de::Visitor; use serde::de; diff --git a/crates/openlimits-exchange/src/model/trade.rs b/crates/openlimits-exchange/src/model/trade.rs index f85b7b1..fac2796 100644 --- a/crates/openlimits-exchange/src/model/trade.rs +++ b/crates/openlimits-exchange/src/model/trade.rs @@ -1,5 +1,3 @@ -ligen_macro::ignore!(); - use derive_more::Constructor; use rust_decimal::prelude::Decimal; use serde::Deserialize; diff --git a/crates/openlimits-exchange/src/model/transaction.rs b/crates/openlimits-exchange/src/model/transaction.rs index 2f32684..43cc091 100644 --- a/crates/openlimits-exchange/src/model/transaction.rs +++ b/crates/openlimits-exchange/src/model/transaction.rs @@ -1,5 +1,3 @@ -ligen_macro::ignore!(); - use derive_more::Constructor; use serde::Deserialize; use serde::Serialize; diff --git a/crates/openlimits-exchange/src/model/websocket.rs b/crates/openlimits-exchange/src/model/websocket.rs index 05edfac..7bee549 100644 --- a/crates/openlimits-exchange/src/model/websocket.rs +++ b/crates/openlimits-exchange/src/model/websocket.rs @@ -1,5 +1,3 @@ -ligen_macro::ignore!(); - use super::{OrderBookResponse, Trade}; use crate::model::{OrderStatus, OrderType, Side}; use serde::{Deserialize, Serialize}; diff --git a/crates/openlimits-exchange/src/shared.rs b/crates/openlimits-exchange/src/shared.rs index 9317281..1299b3e 100644 --- a/crates/openlimits-exchange/src/shared.rs +++ b/crates/openlimits-exchange/src/shared.rs @@ -1,7 +1,5 @@ //! This module cointains some auxiliar functions that are used in the openlimits-exchange module -ligen_macro::ignore!(); - pub type Result = std::result::Result; pub mod string_to_decimal { diff --git a/crates/openlimits-exchange/src/traits/mod.rs b/crates/openlimits-exchange/src/traits/mod.rs index 7a21d03..110470f 100644 --- a/crates/openlimits-exchange/src/traits/mod.rs +++ b/crates/openlimits-exchange/src/traits/mod.rs @@ -1,7 +1,5 @@ //! This module cointains the traits that are used in the openlimits-exchange module. -ligen_macro::ignore!(); - mod exchange_account; mod exchange_market_data; mod exchange; diff --git a/src/lib.rs b/src/lib.rs index 2a10eb2..924c4d3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -47,4 +47,4 @@ pub use crate::exchange::errors; pub use crate::exchange::model; mod openlimits; -pub use openlimits::*; \ No newline at end of file +pub use crate::openlimits::*; \ No newline at end of file diff --git a/tests/mod.rs b/tests/mod.rs index fc1c3cc..f1fc56b 100644 --- a/tests/mod.rs +++ b/tests/mod.rs @@ -1,7 +1,7 @@ extern crate openlimits; mod exchange; -mod apis; -// mod binance; -mod coinbase; +// mod apis; +mod binance; +// mod coinbase; // mod nash; From 722b39461f7e6a715a64ae386223954dd4127a14 Mon Sep 17 00:00:00 2001 From: Danilo Guanabara Date: Thu, 28 Oct 2021 15:51:18 -0300 Subject: [PATCH 18/23] Binance test fixes --- crates/openlimits-binance/Cargo.toml | 4 +- .../src/binance_parameters.rs | 9 +- .../openlimits-binance/src/client/account.rs | 24 +- .../src/client/websocket.rs | 7 +- crates/openlimits-binance/src/lib.rs | 5 +- crates/openlimits-binance/src/model/order.rs | 16 +- .../src/model/order_status.rs | 6 + crates/openlimits-exchange/src/exchange.rs | 27 +- crates/openlimits-exchange/src/lib.rs | 1 + tests/binance/account.rs | 205 ++------------- tests/binance/callbacks.rs | 19 ++ tests/binance/market.rs | 43 +--- tests/binance/mod.rs | 4 +- tests/binance/streams.rs | 22 ++ tests/binance/ws_callbacks.rs | 43 ---- tests/binance/ws_streams.rs | 39 --- tests/mod.rs | 3 +- tests/template/account.rs | 233 ++++++++++++++++++ tests/template/callbacks.rs | 28 +++ tests/template/market.rs | 43 ++++ tests/template/mod.rs | 4 + tests/template/streams.rs | 24 ++ 22 files changed, 458 insertions(+), 351 deletions(-) create mode 100644 tests/binance/callbacks.rs create mode 100644 tests/binance/streams.rs delete mode 100644 tests/binance/ws_callbacks.rs delete mode 100644 tests/binance/ws_streams.rs create mode 100644 tests/template/account.rs create mode 100644 tests/template/callbacks.rs create mode 100644 tests/template/market.rs create mode 100644 tests/template/mod.rs create mode 100644 tests/template/streams.rs diff --git a/crates/openlimits-binance/Cargo.toml b/crates/openlimits-binance/Cargo.toml index cdb78dc..d9c2c60 100644 --- a/crates/openlimits-binance/Cargo.toml +++ b/crates/openlimits-binance/Cargo.toml @@ -12,7 +12,7 @@ keywords = ["cryptocurrency", "exchange", "openlimits", "api"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -openlimits-exchange = "0.1" +openlimits-exchange = { path = "../openlimits-exchange" } async-trait = "0.1" serde = { version = "1.0.126", features = ["derive"] } serde_json = "1.0.64" @@ -28,4 +28,4 @@ sha2 = "0.9.1" url = "2.1.1" futures = "0.3" tokio = "1.6.0" -tokio-tungstenite = { version = "0.13", features = ["tls"] } +tokio-tungstenite = { version = "0.13", features = ["tls"] } \ No newline at end of file diff --git a/crates/openlimits-binance/src/binance_parameters.rs b/crates/openlimits-binance/src/binance_parameters.rs index 6ec0160..2e46eb3 100644 --- a/crates/openlimits-binance/src/binance_parameters.rs +++ b/crates/openlimits-binance/src/binance_parameters.rs @@ -1,9 +1,10 @@ use super::BinanceCredentials; +use openlimits_exchange::exchange::Environment; /// This struct represents the type of environment that will be used and receives a boolean and the credentials as parameters. #[derive(Default, Clone, Debug)] pub struct BinanceParameters { - pub sandbox: bool, + pub environment: Environment, pub credentials: Option, } @@ -11,15 +12,15 @@ impl BinanceParameters { /// Sandbox environment pub fn sandbox() -> Self { Self { - sandbox: true, + environment: Environment::Sandbox, ..Default::default() } } /// Production environment - pub fn prod() -> Self { + pub fn production() -> Self { Self { - sandbox: false, + environment: Environment::Production, ..Default::default() } } diff --git a/crates/openlimits-binance/src/client/account.rs b/crates/openlimits-binance/src/client/account.rs index 409db21..17573f1 100644 --- a/crates/openlimits-binance/src/client/account.rs +++ b/crates/openlimits-binance/src/client/account.rs @@ -85,11 +85,11 @@ impl BaseClient { tif: TimeInForce, post_only: bool, ) -> Result { - let order_type = match post_only { - true => ORDER_TYPE_LIMIT_MAKER, - false => ORDER_TYPE_LIMIT, - } - .to_string(); + let (order_type, time_in_force) = match post_only { + true => (ORDER_TYPE_LIMIT_MAKER.to_string(), None), + false => (ORDER_TYPE_LIMIT.to_string(), Some(tif)), + }; + let buy: OrderRequest = OrderRequest { symbol: pair.symbol, quantity: qty.round_dp(pair.base_increment.normalize().scale()), @@ -99,7 +99,7 @@ impl BaseClient { )), order_side: ORDER_SIDE_BUY.to_string(), order_type, - time_in_force: Some(tif), + time_in_force, }; let transaction = self @@ -120,11 +120,11 @@ impl BaseClient { tif: TimeInForce, post_only: bool, ) -> Result { - let order_type = match post_only { - true => ORDER_TYPE_LIMIT_MAKER, - false => ORDER_TYPE_LIMIT, - } - .to_string(); + let (order_type, time_in_force) = match post_only { + true => (ORDER_TYPE_LIMIT_MAKER.to_string(), None), + false => (ORDER_TYPE_LIMIT.to_string(), Some(tif)), + }; + let sell: OrderRequest = OrderRequest { symbol: pair.symbol, quantity: qty.round_dp(pair.base_increment.normalize().scale()), @@ -134,7 +134,7 @@ impl BaseClient { )), order_side: ORDER_SIDE_SELL.to_string(), order_type, - time_in_force: Some(tif), + time_in_force, }; let transaction = self diff --git a/crates/openlimits-binance/src/client/websocket.rs b/crates/openlimits-binance/src/client/websocket.rs index 2afd66c..00f9dd5 100644 --- a/crates/openlimits-binance/src/client/websocket.rs +++ b/crates/openlimits-binance/src/client/websocket.rs @@ -18,6 +18,7 @@ pub use openlimits_exchange::{ }; use openlimits_exchange::traits::stream::{ExchangeWs, Subscriptions}; use super::shared::Result; +use openlimits_exchange::exchange::Environment; const WS_URL_PROD: &str = "wss://stream.binance.com:9443/stream"; const WS_URL_SANDBOX: &str = "wss://testnet.binance.vision/stream"; @@ -67,9 +68,9 @@ impl ExchangeWs for BinanceWebsocket { .collect::>() .join("/"); - let ws_url = match self.parameters.sandbox { - true => WS_URL_SANDBOX, - false => WS_URL_PROD, + let ws_url = match self.parameters.environment { + Environment::Sandbox => WS_URL_SANDBOX, + Environment::Production => WS_URL_PROD, }; let endpoint = url::Url::parse(&format!("{}?streams={}", ws_url, streams)) .map_err(OpenLimitsError::UrlParserError)?; diff --git a/crates/openlimits-binance/src/lib.rs b/crates/openlimits-binance/src/lib.rs index efbe5b9..b2ccf00 100644 --- a/crates/openlimits-binance/src/lib.rs +++ b/crates/openlimits-binance/src/lib.rs @@ -38,6 +38,7 @@ pub mod client; pub use client::websocket::BinanceWebsocket; use openlimits_exchange::traits::info::{ExchangeInfo, ExchangeInfoRetrieval, MarketPair, MarketPairHandle}; use openlimits_exchange::traits::{Exchange, ExchangeMarketData, ExchangeAccount}; +use openlimits_exchange::exchange::Environment; /// The main struct of the openlimits-binance module #[derive(Clone)] @@ -59,14 +60,14 @@ impl Exchange for Binance { transport: Transport::with_credential( &credentials.api_key, &credentials.api_secret, - parameters.sandbox, + parameters.environment == Environment::Sandbox, )?, }, }, None => Binance { exchange_info: ExchangeInfo::new(), client: BaseClient { - transport: Transport::new(parameters.sandbox)?, + transport: Transport::new(parameters.environment == Environment::Sandbox)?, }, }, }; diff --git a/crates/openlimits-binance/src/model/order.rs b/crates/openlimits-binance/src/model/order.rs index 9e6b144..802ef9c 100644 --- a/crates/openlimits-binance/src/model/order.rs +++ b/crates/openlimits-binance/src/model/order.rs @@ -12,19 +12,21 @@ pub struct Order { pub symbol: String, pub order_id: u64, pub client_order_id: String, - #[serde(with = "string_to_decimal")] + #[serde(default, with = "string_to_decimal")] pub price: Decimal, - #[serde(with = "string_to_decimal")] + #[serde(default, with = "string_to_decimal")] pub orig_qty: Decimal, - #[serde(with = "string_to_decimal")] + #[serde(default, with = "string_to_decimal")] pub executed_qty: Decimal, + #[serde(default)] pub status: OrderStatus, - pub time_in_force: String, - #[serde(rename = "type")] + #[serde(default)] + pub time_in_force: Option, + #[serde(default, rename = "type")] pub type_name: String, - pub side: String, - #[serde(with = "string_to_opt_decimal")] #[serde(default)] + pub side: String, + #[serde(default, with = "string_to_opt_decimal")] pub stop_price: Option, #[serde(default)] pub iceberg_qty: Option, diff --git a/crates/openlimits-binance/src/model/order_status.rs b/crates/openlimits-binance/src/model/order_status.rs index 726aacb..6570b45 100644 --- a/crates/openlimits-binance/src/model/order_status.rs +++ b/crates/openlimits-binance/src/model/order_status.rs @@ -12,4 +12,10 @@ pub enum OrderStatus { PendingCancel, Rejected, Expired, +} + +impl Default for OrderStatus { + fn default() -> Self { + Self::New + } } \ No newline at end of file diff --git a/crates/openlimits-exchange/src/exchange.rs b/crates/openlimits-exchange/src/exchange.rs index 8663cbc..72d0b3f 100644 --- a/crates/openlimits-exchange/src/exchange.rs +++ b/crates/openlimits-exchange/src/exchange.rs @@ -1,15 +1,22 @@ -use messaging::Subscriber; -use async_trait::async_trait; - -#[async_trait] -pub trait Exchange: Subscriber { - type InitializationParameters; - - fn endpoint_url(environment: Environment) -> &'static str; - async fn new(parameters: Self::InitializationParameters) -> Result where Self: Sized; -} +// use messaging::Subscriber; +// use async_trait::async_trait; +// +// #[async_trait] +// pub trait Exchange: Subscriber { +// type InitializationParameters; +// +// fn endpoint_url(environment: Environment) -> &'static str; +// async fn new(parameters: Self::InitializationParameters) -> Result where Self: Sized; +// } +#[derive(Debug, Clone, Copy, PartialEq)] pub enum Environment { Production, Sandbox } + +impl Default for Environment { + fn default() -> Self { + Self::Production + } +} diff --git a/crates/openlimits-exchange/src/lib.rs b/crates/openlimits-exchange/src/lib.rs index 7985ccb..6d32ca1 100644 --- a/crates/openlimits-exchange/src/lib.rs +++ b/crates/openlimits-exchange/src/lib.rs @@ -5,5 +5,6 @@ pub mod prelude; pub mod model; pub mod shared; pub mod traits; +pub mod exchange; pub use errors::*; \ No newline at end of file diff --git a/tests/binance/account.rs b/tests/binance/account.rs index e47e418..4298f6d 100644 --- a/tests/binance/account.rs +++ b/tests/binance/account.rs @@ -1,244 +1,69 @@ use dotenv::dotenv; use std::env; +use crate::template::account; + use openlimits::{ OpenLimits, exchange::binance::Binance, exchange::binance::BinanceCredentials, exchange::binance::BinanceParameters, - prelude::*, - model::{ - CancelAllOrdersRequest, CancelOrderRequest, GetOrderHistoryRequest, OpenLimitOrderRequest, - OpenMarketOrderRequest, TimeInForce, TradeHistoryRequest, - }, }; -use rust_decimal::prelude::Decimal; -use openlimits::model::GetPriceTickerRequest; +use openlimits_exchange::exchange::Environment; #[tokio::test] -#[ignore] async fn limit_buy() { - let pair_text = "BNBBUSD"; - let exchange = init().await; - let price = get_price(&exchange, pair_text).await; - let req = OpenLimitOrderRequest { - client_order_id: None, - price, - size: Decimal::new(1, 1), - market_pair: String::from(pair_text), - post_only: false, - time_in_force: TimeInForce::GoodTillCancelled, - }; - let resp = exchange.limit_buy(&req).await.expect("Couldn't limit buy."); - println!("{:?}", resp); + account::limit_buy(&init().await).await; } #[tokio::test] async fn limit_sell() { - let exchange = init().await; - let price = get_price(&exchange, "BNBBTC").await; - let req = OpenLimitOrderRequest { - client_order_id: None, - price, - post_only: false, - size: Decimal::new(1, 1), - market_pair: String::from("BNBBTC"), - time_in_force: TimeInForce::GoodTillCancelled, - }; - let resp = exchange - .limit_sell(&req) - .await - .expect("Couldn't limit sell."); - println!("{:?}", resp); + account::limit_sell(&init().await).await; } #[tokio::test] -#[ignore] async fn post_only() { - let exchange = init().await; - /*let req = CancelAllOrdersRequest { - market_pair: Some("BNBBTC".to_string()), - }; - openlimits-exchange.cancel_all_orders(&req).await.expect("Couldn't cancel all orders.");*/ - - let req = OpenLimitOrderRequest { - client_order_id: None, - price: Decimal::new(1, 3), - size: Decimal::new(1, 1), - market_pair: String::from("BNBBTC"), - post_only: true, - time_in_force: TimeInForce::GoodTillCancelled, - }; - let resp = exchange - .limit_sell(&req) - .await - .expect("Couldn't limit sell."); - println!("{:?}", resp); + account::post_only(&init().await).await; } #[tokio::test] -#[ignore] async fn market_buy() { - let exchange = init().await; - let req = OpenMarketOrderRequest { - client_order_id: None, - size: Decimal::new(1, 2), - market_pair: String::from("BNBBUSD"), - }; - let resp = exchange - .market_buy(&req) - .await - .expect("Couldn't market buy."); - println!("{:?}", resp); + account::market_buy(&init().await).await; } #[tokio::test] async fn market_sell() { - let exchange = init().await; - let req = OpenMarketOrderRequest { - client_order_id: None, - size: Decimal::new(1, 1), - market_pair: String::from("BNBBTC"), - }; - let resp = exchange - .market_sell(&req) - .await - .expect("Couldn't market sell."); - println!("{:?}", resp); + account::market_sell(&init().await).await; } #[tokio::test] -#[ignore = "TODO fix"] async fn cancel_order() { - let exchange = init().await; - let req = OpenLimitOrderRequest { - client_order_id: None, - price: Decimal::new(1, 3), - size: Decimal::new(1, 1), - market_pair: String::from("BNBBTC"), - post_only: false, - time_in_force: TimeInForce::GoodTillCancelled, - }; - let order = exchange - .limit_sell(&req) - .await - .expect("Couldn't limit sell."); - - let req = CancelOrderRequest { - id: order.id, - market_pair: Some(order.market_pair), - }; - - let resp = exchange - .cancel_order(&req) - .await - .expect("Couldn't cancel order."); - println!("{:?}", resp); + account::cancel_order(&init().await).await; } #[tokio::test] -#[ignore = "TODO fix"] async fn cancel_all_orders() { - let exchange = init().await; - let req = OpenLimitOrderRequest { - client_order_id: None, - price: Decimal::new(1, 3), - size: Decimal::new(1, 1), - market_pair: String::from("BNBBTC"), - post_only: false, - time_in_force: TimeInForce::GoodTillCancelled, - }; - exchange - .limit_sell(&req) - .await - .expect("Couldn't limit sell."); - - exchange - .limit_sell(&req) - .await - .expect("Couldn't limit sell."); - - let req = CancelAllOrdersRequest { - market_pair: Some("BNBBTC".to_string()), - }; - - let resp = exchange - .cancel_all_orders(&req) - .await - .expect("Couldn't cancel all orders."); - println!("{:?}", resp); + account::cancel_all_orders(&init().await).await; } #[tokio::test] async fn get_order_history() { - let exchange = init().await; - let req = GetOrderHistoryRequest { - market_pair: Some(String::from("BNBBTC")), - order_status: None, - paginator: None, - }; - - let resp = exchange - .get_order_history(&req) - .await - .expect("Couldn't get order history."); - println!("{:?}", resp); -} - -async fn get_price(exchange: &Binance, pair: &str) -> Decimal { - let get_price_ticker_request = GetPriceTickerRequest { market_pair: pair.to_string() }; - let ticker = exchange.get_price_ticker(&get_price_ticker_request).await.expect("Couldn't get ticker."); - ticker.price.expect("Couldn't get price.") + account::get_order_history(&init().await).await; } #[tokio::test] async fn get_all_open_orders() { - let exchange = init().await; - let price = get_price(&exchange, "BNBBTC").await; - let req = OpenLimitOrderRequest { - client_order_id: None, - price, - size: Decimal::new(1, 1), - market_pair: String::from("BNBBTC"), - post_only: false, - time_in_force: TimeInForce::GoodTillCancelled, - }; - exchange - .limit_sell(&req) - .await - .expect("Couldn't limit sell."); - - let resp = exchange - .get_all_open_orders() - .await - .expect("Couldn't get all open orders."); - println!("{:?}", resp); + account::get_all_open_orders(&init().await).await; } #[tokio::test] async fn get_account_balances() { - let exchange = init().await; - - let resp = exchange - .get_account_balances(None) - .await - .expect("Couldn't get acount balances."); - println!("{:?}", resp); + account::get_account_balances(&init().await).await; } #[tokio::test] async fn get_trade_history() { - let exchange = init().await; - let req = TradeHistoryRequest { - market_pair: Some("BNBBTC".to_string()), - ..Default::default() - }; - - let resp = exchange - .get_trade_history(&req) - .await - .expect("Couldn't get trade history."); - println!("{:?}", resp); + account::get_trade_history(&init().await).await; } async fn init() -> Binance { @@ -249,7 +74,7 @@ async fn init() -> Binance { api_key: env::var("BINANCE_API_KEY").expect("Couldn't get environment variable."), api_secret: env::var("BINANCE_API_SECRET").expect("Couldn't get environment variable."), }), - sandbox: true, + environment: Environment::Sandbox, }; OpenLimits::instantiate(parameters) diff --git a/tests/binance/callbacks.rs b/tests/binance/callbacks.rs new file mode 100644 index 0000000..7a028cf --- /dev/null +++ b/tests/binance/callbacks.rs @@ -0,0 +1,19 @@ +use openlimits::exchange::binance::{BinanceParameters, client::websocket::BinanceWebsocket}; +use openlimits::exchange::traits::stream::ExchangeWs; +use crate::template::callbacks; + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn orderbook() { + callbacks::orderbook(&init().await).await; +} + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn trades() { + callbacks::trades(&init().await).await; +} + +async fn init() -> BinanceWebsocket { + BinanceWebsocket::new(BinanceParameters::production()) + .await + .expect("Failed to create Client") +} diff --git a/tests/binance/market.rs b/tests/binance/market.rs index e7e4b91..efee6ec 100644 --- a/tests/binance/market.rs +++ b/tests/binance/market.rs @@ -2,63 +2,34 @@ use openlimits::{ OpenLimits, exchange::binance::Binance, exchange::binance::BinanceParameters, - prelude::*, - model::{GetHistoricRatesRequest, GetPriceTickerRequest, Interval, OrderBookRequest}, }; +use openlimits_exchange::exchange::Environment; +use crate::template::market; #[tokio::test] async fn order_book() { - let exchange = init().await; - let req = OrderBookRequest { - market_pair: "BNBBTC".to_string(), - }; - let _response = exchange - .order_book(&req) - .await - .expect("Couldn't get order book."); + market::order_book(&init().await).await; } #[tokio::test] async fn get_price_ticker() { - let exchange = init().await; - let req = GetPriceTickerRequest { - market_pair: "BNBBTC".to_string(), - }; - let _response = exchange - .get_price_ticker(&req) - .await - .expect("Couldn't get price ticker."); + market::get_price_ticker(&init().await).await; } #[tokio::test] async fn get_historic_rates() { - let exchange = init().await; - let req = GetHistoricRatesRequest { - market_pair: "BNBBTC".to_string(), - interval: Interval::OneHour, - paginator: None, - }; - let _response = exchange - .get_historic_rates(&req) - .await - .expect("Couldn't get historic rates."); + market::get_historic_rates(&init().await).await; } #[tokio::test] async fn pair() { - let exchange = Binance::new(BinanceParameters::sandbox()) - .await - .expect("Failed to create Client"); - let _response = exchange - .get_pair("BTCUSDT") - .await - .expect("Couldn't get pair."); + market::pair(&init().await).await; } async fn init() -> Binance { let parameters = BinanceParameters { credentials: None, - sandbox: true, + environment: Environment::Sandbox, }; OpenLimits::instantiate(parameters) diff --git a/tests/binance/mod.rs b/tests/binance/mod.rs index 94d82bd..d22ce9e 100644 --- a/tests/binance/mod.rs +++ b/tests/binance/mod.rs @@ -1,4 +1,4 @@ mod account; mod market; -mod ws_callbacks; -mod ws_streams; +mod callbacks; +mod streams; diff --git a/tests/binance/streams.rs b/tests/binance/streams.rs new file mode 100644 index 0000000..fef4593 --- /dev/null +++ b/tests/binance/streams.rs @@ -0,0 +1,22 @@ +use openlimits::{ + exchange::binance::{BinanceParameters, BinanceWebsocket}, +}; +use openlimits::exchange::traits::stream::ExchangeWs; + +use crate::template::streams; + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn orderbook() { + streams::orderbook(&init().await).await; +} + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn trades() { + streams::trades(&init().await).await; +} + +async fn init() -> BinanceWebsocket { + BinanceWebsocket::new(BinanceParameters::production()) + .await + .expect("Failed to create Binance stream.") +} diff --git a/tests/binance/ws_callbacks.rs b/tests/binance/ws_callbacks.rs deleted file mode 100644 index 7fbd033..0000000 --- a/tests/binance/ws_callbacks.rs +++ /dev/null @@ -1,43 +0,0 @@ -use std::sync::mpsc::sync_channel; - -use openlimits::{ - exchange::binance::{BinanceParameters, client::websocket::BinanceWebsocket}, - model::websocket::Subscription, -}; -use openlimits::exchange::traits::stream::{ExchangeWs, OpenLimitsWs}; - -async fn test_subscription_callback(websocket: OpenLimitsWs, sub: Subscription) { - let (tx, rx) = sync_channel(0); - - websocket - .subscribe(sub, move |m| { - m.as_ref().expect("Couldn't get response."); - tx.send(()).expect("Couldn't send sync message."); - }) - .await - .expect("Couldn't subscribe."); - - rx.recv().expect("Couldn't receive sync message."); -} - -#[tokio::test(flavor = "multi_thread", worker_threads = 2)] -async fn orderbook() { - let ws = init().await; - let sub = Subscription::OrderBookUpdates("bnbbtc".to_string()); - test_subscription_callback(ws, sub).await; -} - -#[tokio::test(flavor = "multi_thread", worker_threads = 2)] -async fn trades() { - let ws = init().await; - let sub = Subscription::Trades("btcusdt".to_string()); - test_subscription_callback(ws, sub).await; -} - -async fn init() -> OpenLimitsWs { - OpenLimitsWs { - websocket: BinanceWebsocket::new(BinanceParameters::prod()) - .await - .expect("Failed to create Client"), - } -} diff --git a/tests/binance/ws_streams.rs b/tests/binance/ws_streams.rs deleted file mode 100644 index 1029838..0000000 --- a/tests/binance/ws_streams.rs +++ /dev/null @@ -1,39 +0,0 @@ -use futures::stream::StreamExt; - -use openlimits::{ - exchange::binance::{BinanceParameters, BinanceWebsocket}, - model::websocket::Subscription, -}; -use openlimits::exchange::traits::stream::{ExchangeWs, OpenLimitsWs}; - -#[tokio::test(flavor = "multi_thread", worker_threads = 2)] -async fn orderbook() { - let ws = init().await; - let s = ws - .create_stream(&[Subscription::OrderBookUpdates("bnbbtc".to_string())]) - .await; - - let ob = s.expect("Couldn't create stream.").next().await; - - print!("{:?}", ob); -} - -#[tokio::test(flavor = "multi_thread", worker_threads = 2)] -async fn trades() { - let ws = init().await; - let s = ws - .create_stream(&[Subscription::Trades("bnbbtc".to_string())]) - .await; - - let trades = s.expect("Couldn't create stream.").next().await; - - print!("{:?}", trades); -} - -async fn init() -> OpenLimitsWs { - OpenLimitsWs { - websocket: BinanceWebsocket::new(BinanceParameters::prod()) - .await - .expect("Failed to create Client"), - } -} diff --git a/tests/mod.rs b/tests/mod.rs index f1fc56b..7b14c26 100644 --- a/tests/mod.rs +++ b/tests/mod.rs @@ -1,6 +1,7 @@ extern crate openlimits; -mod exchange; +mod template; +// mod exchange; // mod apis; mod binance; // mod coinbase; diff --git a/tests/template/account.rs b/tests/template/account.rs new file mode 100644 index 0000000..0797827 --- /dev/null +++ b/tests/template/account.rs @@ -0,0 +1,233 @@ +use std::str::FromStr; + +use openlimits::{ + prelude::*, + model::{ + CancelAllOrdersRequest, CancelOrderRequest, GetOrderHistoryRequest, OpenLimitOrderRequest, + OpenMarketOrderRequest, TimeInForce, TradeHistoryRequest, GetPriceTickerRequest + }, +}; +use rust_decimal::prelude::*; + + +async fn get_current_price(exchange: &impl Exchange, market_pair: &str, multiplier: f32) -> Decimal { + let market_pair = market_pair.into(); + let ticket = exchange + .get_price_ticker(&GetPriceTickerRequest { market_pair }) + .await + .unwrap(); + let price = ticket.price.unwrap(); + price * Decimal::from_f32(multiplier).unwrap() +} + +pub async fn limit_buy(exchange: &impl Exchange) { + let pair_text = "BNBBUSD"; + let price = get_price(exchange, pair_text).await; + let req = OpenLimitOrderRequest { + client_order_id: None, + price, + size: Decimal::new(1, 1), + market_pair: String::from(pair_text), + post_only: false, + time_in_force: TimeInForce::GoodTillCancelled, + }; + let resp = exchange.limit_buy(&req).await.expect("Couldn't limit buy."); + println!("{:?}", resp); +} + +pub async fn limit_sell(exchange: &impl Exchange) { + let price = get_price(exchange, "BNBBTC").await; + let req = OpenLimitOrderRequest { + client_order_id: None, + price, + post_only: false, + size: Decimal::new(1, 1), + market_pair: String::from("BNBBTC"), + time_in_force: TimeInForce::GoodTillCancelled, + }; + let resp = exchange + .limit_sell(&req) + .await + .expect("Couldn't limit sell."); + println!("{:?}", resp); +} + +pub async fn post_only(exchange: &impl Exchange) { + let price = get_current_price(exchange, "BNBBTC", 1.5).await; + let req = OpenLimitOrderRequest { + client_order_id: None, + price, + size: Decimal::new(1, 1), + market_pair: String::from("BNBBTC"), + post_only: true, + time_in_force: TimeInForce::GoodTillCancelled, + }; + let resp = exchange + .limit_sell(&req) + .await + .expect("Couldn't limit sell."); + println!("{:?}", resp); + + let price = get_current_price(exchange, "BNBBTC", 0.5).await; + let req = OpenLimitOrderRequest { + client_order_id: None, + price, + size: Decimal::new(1, 1), + market_pair: String::from("BNBBTC"), + post_only: true, + time_in_force: TimeInForce::GoodTillCancelled, + }; + let resp = exchange + .limit_buy(&req) + .await + .expect("Couldn't limit buy."); + + println!("{:?}", resp); +} + +pub async fn market_buy(exchange: &impl Exchange) { + let req = OpenMarketOrderRequest { + client_order_id: None, + size: Decimal::from_str("0.1").unwrap(), + market_pair: String::from("BNBBUSD"), + }; + let resp = exchange + .market_buy(&req) + .await + .expect("Couldn't market buy."); + println!("{:?}", resp); +} + +pub async fn market_sell(exchange: &impl Exchange) { + let req = OpenMarketOrderRequest { + client_order_id: None, + size: Decimal::new(1, 1), + market_pair: String::from("BNBBTC"), + }; + let resp = exchange + .market_sell(&req) + .await + .expect("Couldn't market sell."); + println!("{:?}", resp); +} + +pub async fn cancel_order(exchange: &impl Exchange) { + let price = get_current_price(exchange, "BNBBTC", 1.5).await; + let req = OpenLimitOrderRequest { + client_order_id: None, + price, + size: Decimal::from_str("1.0").unwrap(), + market_pair: String::from("BNBBTC"), + post_only: false, + time_in_force: TimeInForce::GoodTillCancelled, + }; + let order = exchange + .limit_sell(&req) + .await + .expect("Couldn't limit sell."); + + let req = CancelOrderRequest { + id: order.id, + market_pair: Some(order.market_pair), + }; + + let resp = exchange + .cancel_order(&req) + .await + .expect("Couldn't cancel order."); + println!("{:?}", resp); +} + +pub async fn cancel_all_orders(exchange: &impl Exchange) { + let price = get_current_price(exchange, "BNBBTC", 1.5).await; + let req = OpenLimitOrderRequest { + client_order_id: None, + price, + size: Decimal::from_str("1.0").unwrap(), + market_pair: String::from("BNBBTC"), + post_only: false, + time_in_force: TimeInForce::GoodTillCancelled, + }; + exchange + .limit_sell(&req) + .await + .expect("Couldn't limit sell."); + + exchange + .limit_sell(&req) + .await + .expect("Couldn't limit sell."); + + let req = CancelAllOrdersRequest { + market_pair: Some("BNBBTC".to_string()), + }; + + let resp = exchange + .cancel_all_orders(&req) + .await + .expect("Couldn't cancel all orders."); + println!("{:?}", resp); +} + +pub async fn get_order_history(exchange: &impl Exchange) { + let req = GetOrderHistoryRequest { + market_pair: Some(String::from("BNBBTC")), + order_status: None, + paginator: None, + }; + + let resp = exchange + .get_order_history(&req) + .await + .expect("Couldn't get order history."); + println!("{:?}", resp); +} + +async fn get_price(exchange: &impl Exchange, pair: &str) -> Decimal { + let get_price_ticker_request = GetPriceTickerRequest { market_pair: pair.to_string() }; + let ticker = exchange.get_price_ticker(&get_price_ticker_request).await.expect("Couldn't get ticker."); + ticker.price.expect("Couldn't get price.") +} + +pub async fn get_all_open_orders(exchange: &impl Exchange) { + let price = get_price(exchange, "BNBBTC").await; + let req = OpenLimitOrderRequest { + client_order_id: None, + price, + size: Decimal::new(1, 1), + market_pair: String::from("BNBBTC"), + post_only: false, + time_in_force: TimeInForce::GoodTillCancelled, + }; + exchange + .limit_sell(&req) + .await + .expect("Couldn't limit sell."); + + let resp = exchange + .get_all_open_orders() + .await + .expect("Couldn't get all open orders."); + println!("{:?}", resp); +} + +pub async fn get_account_balances(exchange: &impl Exchange) { + let resp = exchange + .get_account_balances(None) + .await + .expect("Couldn't get acount balances."); + println!("{:?}", resp); +} + +pub async fn get_trade_history(exchange: &impl Exchange) { + let req = TradeHistoryRequest { + market_pair: Some("BNBBTC".to_string()), + ..Default::default() + }; + + let resp = exchange + .get_trade_history(&req) + .await + .expect("Couldn't get trade history."); + println!("{:?}", resp); +} \ No newline at end of file diff --git a/tests/template/callbacks.rs b/tests/template/callbacks.rs new file mode 100644 index 0000000..e6bf871 --- /dev/null +++ b/tests/template/callbacks.rs @@ -0,0 +1,28 @@ +use std::sync::mpsc::sync_channel; + +use openlimits::model::websocket::Subscription; +use openlimits::exchange::traits::stream::ExchangeWs; + +async fn test_subscription_callback(websocket: &impl ExchangeWs, sub: Subscription) { + let (tx, rx) = sync_channel(0); + + websocket + .subscribe(sub, move |m| { + m.as_ref().expect("Couldn't get response."); + tx.send(()).expect("Couldn't send sync message."); + }) + .await + .expect("Couldn't subscribe."); + + rx.recv().expect("Couldn't receive sync message."); +} + +pub async fn orderbook(ws: &impl ExchangeWs) { + let sub = Subscription::OrderBookUpdates("bnbbtc".to_string()); + test_subscription_callback(ws, sub).await; +} + +pub async fn trades(ws: &impl ExchangeWs) { + let sub = Subscription::Trades("btcusdt".to_string()); + test_subscription_callback(ws, sub).await; +} diff --git a/tests/template/market.rs b/tests/template/market.rs new file mode 100644 index 0000000..ad4e075 --- /dev/null +++ b/tests/template/market.rs @@ -0,0 +1,43 @@ +use openlimits::{ + prelude::*, + model::{GetHistoricRatesRequest, GetPriceTickerRequest, Interval, OrderBookRequest}, +}; + +pub async fn order_book(exchange: &impl Exchange) { + let req = OrderBookRequest { + market_pair: "BNBBTC".to_string(), + }; + let _response = exchange + .order_book(&req) + .await + .expect("Couldn't get order book."); +} + +pub async fn get_price_ticker(exchange: &impl Exchange) { + let req = GetPriceTickerRequest { + market_pair: "BNBBTC".to_string(), + }; + let _response = exchange + .get_price_ticker(&req) + .await + .expect("Couldn't get price ticker."); +} + +pub async fn get_historic_rates(exchange: &impl Exchange) { + let req = GetHistoricRatesRequest { + market_pair: "BNBBTC".to_string(), + interval: Interval::OneHour, + paginator: None, + }; + let _response = exchange + .get_historic_rates(&req) + .await + .expect("Couldn't get historic rates."); +} + +pub async fn pair(exchange: &impl Exchange) { + let _response = exchange + .get_pair("BTCUSDT") + .await + .expect("Couldn't get pair."); +} \ No newline at end of file diff --git a/tests/template/mod.rs b/tests/template/mod.rs new file mode 100644 index 0000000..111c103 --- /dev/null +++ b/tests/template/mod.rs @@ -0,0 +1,4 @@ +pub mod account; +pub mod market; +pub mod streams; +pub mod callbacks; \ No newline at end of file diff --git a/tests/template/streams.rs b/tests/template/streams.rs new file mode 100644 index 0000000..beb1705 --- /dev/null +++ b/tests/template/streams.rs @@ -0,0 +1,24 @@ +use futures::stream::StreamExt; + +use openlimits::model::websocket::Subscription; +use openlimits::exchange::traits::stream::ExchangeWs; + +pub async fn orderbook(ws: &impl ExchangeWs) { + let s = ws + .create_stream(&[Subscription::OrderBookUpdates("bnbbtc".to_string())]) + .await; + + let ob = s.expect("Couldn't create stream.").next().await; + + print!("{:?}", ob); +} + +pub async fn trades(ws: &impl ExchangeWs) { + let s = ws + .create_stream(&[Subscription::Trades("bnbbtc".to_string())]) + .await; + + let trades = s.expect("Couldn't create stream.").next().await; + + print!("{:?}", trades); +} From 063e6b8866b872ef072f553cfe371a230ec179cb Mon Sep 17 00:00:00 2001 From: Danilo Guanabara Date: Wed, 3 Nov 2021 14:37:08 -0300 Subject: [PATCH 19/23] All tests are passing --- .../openlimits-binance/src/client/account.rs | 19 +- .../openlimits-binance/src/client/market.rs | 12 +- .../src/client/websocket.rs | 7 +- crates/openlimits-binance/src/lib.rs | 50 ++-- .../src/model/market_pair.rs | 11 + crates/openlimits-binance/src/model/mod.rs | 2 + crates/openlimits-exchange/src/lib.rs | 1 - crates/openlimits-exchange/src/market/mod.rs | 6 - .../openlimits-exchange/src/market/symbol.rs | 7 - .../src/message/subscription.rs | 2 +- .../openlimits-exchange/src/model/currency.rs | 19 ++ .../src/model/market_pair.rs | 6 + crates/openlimits-exchange/src/model/mod.rs | 2 + .../model/request/cancel_all_order_request.rs | 3 +- .../request/get_historic_rates_request.rs | 3 +- .../request/get_order_history_request.rs | 3 +- .../model/request/get_price_ticker_request.rs | 5 +- .../model/request/open_limit_order_request.rs | 5 +- .../request/open_market_order_request.rs | 5 +- .../src/model/request/order_book_request.rs | 5 +- .../model/request/trade_history_request.rs | 3 +- crates/openlimits-exchange/src/model/trade.rs | 2 +- .../src/model/websocket.rs | 15 +- .../src/traits/info/exchange_info.rs | 4 +- .../traits/info/exchange_info_retrieval.rs | 7 +- .../src/traits/info/market_pair.rs | 4 +- .../src/traits/info/market_pair_handle.rs | 8 +- .../src/traits/info/mod.rs | 2 +- examples/rust/orderbook.rs | 12 +- src/exchange/coinbase/client/account.rs | 15 +- src/exchange/coinbase/client/market.rs | 20 +- src/exchange/coinbase/client/websocket.rs | 33 +-- src/exchange/coinbase/coinbase_parameters.rs | 9 +- src/exchange/coinbase/mod.rs | 50 ++-- src/exchange/coinbase/model/market_pair.rs | 11 + src/exchange/coinbase/model/mod.rs | 3 + .../model/websocket/coinbase_subscription.rs | 9 +- src/exchange/coinbase/model/websocket/mod.rs | 26 ++- src/exchange/coinbase/transport.rs | 4 +- src/prelude/mod.rs | 2 +- tests/binance/account.rs | 28 +-- tests/binance/callbacks.rs | 11 +- tests/binance/client.rs | 38 ++++ tests/binance/market.rs | 18 +- tests/binance/mod.rs | 1 + tests/binance/streams.rs | 12 +- tests/coinbase/account.rs | 214 ++---------------- tests/coinbase/callbacks.rs | 12 + tests/coinbase/client.rs | 36 +++ tests/coinbase/exchange.rs | 21 -- tests/coinbase/market.rs | 71 +----- tests/coinbase/mod.rs | 4 +- tests/coinbase/streams.rs | 12 + tests/mod.rs | 2 +- tests/template/account.rs | 68 +++--- tests/template/callbacks.rs | 16 +- tests/template/market.rs | 18 +- tests/template/streams.rs | 18 +- 58 files changed, 448 insertions(+), 564 deletions(-) create mode 100644 crates/openlimits-binance/src/model/market_pair.rs delete mode 100644 crates/openlimits-exchange/src/market/mod.rs delete mode 100644 crates/openlimits-exchange/src/market/symbol.rs create mode 100644 crates/openlimits-exchange/src/model/currency.rs create mode 100644 crates/openlimits-exchange/src/model/market_pair.rs create mode 100644 src/exchange/coinbase/model/market_pair.rs create mode 100644 tests/binance/client.rs create mode 100644 tests/coinbase/callbacks.rs create mode 100644 tests/coinbase/client.rs delete mode 100644 tests/coinbase/exchange.rs create mode 100644 tests/coinbase/streams.rs diff --git a/crates/openlimits-binance/src/client/account.rs b/crates/openlimits-binance/src/client/account.rs index 17573f1..934f0f5 100644 --- a/crates/openlimits-binance/src/client/account.rs +++ b/crates/openlimits-binance/src/client/account.rs @@ -1,13 +1,9 @@ use std::collections::HashMap; use rust_decimal::prelude::*; use serde_json::json; -use crate::model::{ - AccountInformation, AllOrderReq, Balance, Order, ORDER_SIDE_BUY, ORDER_SIDE_SELL, ORDER_TYPE_LIMIT, - ORDER_TYPE_LIMIT_MAKER, ORDER_TYPE_MARKET, OrderCanceled, OrderRequest, TimeInForce, - TradeHistory, TradeHistoryReq, -}; +use crate::model::{AccountInformation, AllOrderReq, Balance, Order, ORDER_SIDE_BUY, ORDER_SIDE_SELL, ORDER_TYPE_LIMIT, ORDER_TYPE_LIMIT_MAKER, ORDER_TYPE_MARKET, OrderCanceled, OrderRequest, TimeInForce, TradeHistory, TradeHistoryReq, MarketPair}; use openlimits_exchange::errors::OpenLimitsError; -use openlimits_exchange::traits::info::MarketPair; +use openlimits_exchange::traits::info::MarketPairInfo; use super::BaseClient; use super::shared::Result; @@ -79,7 +75,7 @@ impl BaseClient { // Place a LIMIT order - BUY pub async fn limit_buy( &self, - pair: MarketPair, + pair: MarketPairInfo, qty: Decimal, price: Decimal, tif: TimeInForce, @@ -114,7 +110,7 @@ impl BaseClient { pub async fn limit_sell( &self, - pair: MarketPair, + pair: MarketPairInfo, qty: Decimal, price: Decimal, tif: TimeInForce, @@ -146,7 +142,7 @@ impl BaseClient { } // Place a MARKET order - BUY - pub async fn market_buy(&self, pair: MarketPair, qty: Decimal) -> Result { + pub async fn market_buy(&self, pair: MarketPairInfo, qty: Decimal) -> Result { let buy: OrderRequest = OrderRequest { symbol: pair.symbol, quantity: qty.round_dp(pair.base_increment.normalize().scale()), @@ -165,7 +161,7 @@ impl BaseClient { } // Place a MARKET order - SELL - pub async fn market_sell(&self, pair: MarketPair, qty: Decimal) -> Result { + pub async fn market_sell(&self, pair: MarketPairInfo, qty: Decimal) -> Result { let sell: OrderRequest = OrderRequest { symbol: pair.symbol, quantity: qty.round_dp(pair.base_increment.normalize().scale()), @@ -192,7 +188,8 @@ impl BaseClient { Ok(order_canceled) } - pub async fn cancel_all_orders(&self, symbol: &str) -> Result> { + pub async fn cancel_all_orders>(&self, symbol: P) -> Result> { + let symbol = symbol.into().0; let params = json! {{"symbol":symbol}}; let orders_canceled = self .transport diff --git a/crates/openlimits-binance/src/client/market.rs b/crates/openlimits-binance/src/client/market.rs index 070f82b..a6d4ce7 100644 --- a/crates/openlimits-binance/src/client/market.rs +++ b/crates/openlimits-binance/src/client/market.rs @@ -1,10 +1,7 @@ use serde_json::json; use serde_json::Value; use super::BaseClient; -use crate::model::{ - BookTickers, KlineParams, KlineSummaries, KlineSummary, OrderBook, PriceStats, Prices, - SymbolPrice, Ticker, -}; +use crate::model::{BookTickers, KlineParams, KlineSummaries, KlineSummary, OrderBook, PriceStats, Prices, SymbolPrice, Ticker, MarketPair}; pub use openlimits_exchange::OpenLimitsError; use rust_decimal::prelude::Decimal; use super::shared::Result; @@ -12,10 +9,12 @@ use super::shared::Result; // Market Data endpoints impl BaseClient { // Order book (Default 100; max 100) - pub async fn get_depth(&self, symbol: &str, limit: I) -> Result + pub async fn get_depth(&self, symbol: S, limit: I) -> Result where I: Into>, + S: Into { + let symbol = format!("{}", symbol.into().0); let limit = limit.into().unwrap_or(100); let params = json! {{"symbol": symbol, "limit": limit}}; @@ -31,7 +30,8 @@ impl BaseClient { } // Latest price for ONE symbol. - pub async fn get_price(&self, symbol: &str) -> Result { + pub async fn get_price>(&self, symbol: S) -> Result { + let symbol = format!("{}", symbol.into().0); let params = json! {{"symbol": symbol}}; let price = self diff --git a/crates/openlimits-binance/src/client/websocket.rs b/crates/openlimits-binance/src/client/websocket.rs index 00f9dd5..17fe25f 100644 --- a/crates/openlimits-binance/src/client/websocket.rs +++ b/crates/openlimits-binance/src/client/websocket.rs @@ -72,7 +72,7 @@ impl ExchangeWs for BinanceWebsocket { Environment::Sandbox => WS_URL_SANDBOX, Environment::Production => WS_URL_PROD, }; - let endpoint = url::Url::parse(&format!("{}?streams={}", ws_url, streams)) + let endpoint = url::Url::parse(&format!("{}?streams={}", ws_url, streams.to_lowercase())) .map_err(OpenLimitsError::UrlParserError)?; let (ws_stream, _) = connect_async(endpoint).await?; @@ -180,9 +180,8 @@ impl Display for BinanceSubscription { impl From for BinanceSubscription { fn from(subscription: Subscription) -> Self { match subscription { - Subscription::OrderBookUpdates(symbol) => BinanceSubscription::Depth(symbol, None), - Subscription::Trades(symbol) => BinanceSubscription::Trade(symbol), - _ => unimplemented!(), + Subscription::OrderBookUpdates(symbol) => BinanceSubscription::Depth(crate::model::MarketPair::from(symbol).0, None), + Subscription::Trades(symbol) => BinanceSubscription::Trade(crate::model::MarketPair::from(symbol).0) } } } diff --git a/crates/openlimits-binance/src/lib.rs b/crates/openlimits-binance/src/lib.rs index b2ccf00..2c51803 100644 --- a/crates/openlimits-binance/src/lib.rs +++ b/crates/openlimits-binance/src/lib.rs @@ -36,9 +36,10 @@ pub use transport::*; pub mod client; pub use client::websocket::BinanceWebsocket; -use openlimits_exchange::traits::info::{ExchangeInfo, ExchangeInfoRetrieval, MarketPair, MarketPairHandle}; +use openlimits_exchange::traits::info::{ExchangeInfo, ExchangeInfoRetrieval, MarketPairInfo, MarketPairHandle}; use openlimits_exchange::traits::{Exchange, ExchangeMarketData, ExchangeAccount}; use openlimits_exchange::exchange::Environment; +use openlimits_exchange::model::market_pair::MarketPair; /// The main struct of the openlimits-binance module #[derive(Clone)] @@ -83,7 +84,7 @@ impl Exchange for Binance { #[async_trait] impl ExchangeInfoRetrieval for Binance { - async fn retrieve_pairs(&self) -> Result> { + async fn retrieve_pairs(&self) -> Result> { self.client.get_exchange_info().await.map(|v| { v.symbols .into_iter() @@ -114,7 +115,7 @@ impl ExchangeInfoRetrieval for Binance { }) .expect("Couldn't find tick size."); - MarketPair { + MarketPairInfo { base: symbol.base_asset, quote: symbol.quote_asset, symbol: symbol.symbol, @@ -134,8 +135,9 @@ impl ExchangeInfoRetrieval for Binance { .await } - async fn get_pair(&self, name: &str) -> Result { - self.exchange_info.get_pair(name) + async fn get_pair(&self, market_pair: &MarketPair) -> Result { + let name = crate::model::MarketPair::from(market_pair.clone()).0; + self.exchange_info.get_pair(&name) } } @@ -143,14 +145,14 @@ impl ExchangeInfoRetrieval for Binance { impl ExchangeMarketData for Binance { async fn order_book(&self, req: &OrderBookRequest) -> Result { self.client - .get_depth(req.market_pair.as_str(), None) + .get_depth(req.market_pair.clone(), None) .await .map(Into::into) } async fn get_price_ticker(&self, req: &GetPriceTickerRequest) -> Result { self.client - .get_price(&req.market_pair) + .get_price(req.market_pair.clone()) .await .map(Into::into) } @@ -172,7 +174,7 @@ impl ExchangeMarketData for Binance { #[async_trait] impl ExchangeAccount for Binance { async fn limit_buy(&self, req: &OpenLimitOrderRequest) -> Result { - let pair = self.exchange_info.get_pair(&req.market_pair)?.read()?; + let pair = self.get_pair(&req.market_pair).await?.read()?; self.client .limit_buy( pair, @@ -185,7 +187,7 @@ impl ExchangeAccount for Binance { .map(Into::into) } async fn limit_sell(&self, req: &OpenLimitOrderRequest) -> Result { - let pair = self.exchange_info.get_pair(&req.market_pair)?.read()?; + let pair = self.get_pair(&req.market_pair).await?.read()?; self.client .limit_sell( pair, @@ -199,11 +201,11 @@ impl ExchangeAccount for Binance { } async fn market_buy(&self, req: &OpenMarketOrderRequest) -> Result { - let pair = self.exchange_info.get_pair(&req.market_pair)?.read()?; + let pair = self.get_pair(&req.market_pair).await?.read()?; self.client.market_buy(pair, req.size).await.map(Into::into) } async fn market_sell(&self, req: &OpenMarketOrderRequest) -> Result { - let pair = self.exchange_info.get_pair(&req.market_pair)?.read()?; + let pair = self.get_pair(&req.market_pair).await?.read()?; self.client .market_sell(pair, req.size) .await @@ -228,7 +230,7 @@ impl ExchangeAccount for Binance { async fn cancel_all_orders(&self, req: &CancelAllOrdersRequest) -> Result> { if let Some(pair) = req.market_pair.as_ref() { self.client - .cancel_all_orders(pair) + .cancel_all_orders(pair.clone()) .await .map(|v| v.into_iter().map(Into::into).collect()) } else { @@ -316,7 +318,7 @@ impl From for Vec { false => Side::Sell, }, liquidity: None, - created_at: trade_message.event_time, + created_at: trade_message.event_time.to_string(), }] } } @@ -337,7 +339,7 @@ impl From for Trade { false => Side::Buy, }, liquidity: None, - created_at: trade.trade_order_time, + created_at: trade.trade_order_time.to_string(), } } } @@ -426,7 +428,7 @@ impl From for Trade { true => Some(Liquidity::Maker), false => Some(Liquidity::Taker), }, - created_at: trade_history.time, + created_at: trade_history.time.to_string(), } } } @@ -445,9 +447,10 @@ impl TryFrom<&GetOrderHistoryRequest> for model::AllOrderReq { fn try_from(req: &GetOrderHistoryRequest) -> Result { Ok(Self { paginator: req.paginator.clone().map(|p| p.into()), - symbol: req.market_pair.clone().ok_or_else(|| { - OpenLimitsError::MissingParameter("market_pair parameter is required.".to_string()) - })?, + symbol: req.market_pair + .clone() + .map(|market| crate::model::MarketPair::from(market).0) + .ok_or_else(|| OpenLimitsError::MissingParameter("market_pair parameter is required.".to_string()))?, }) } } @@ -457,9 +460,10 @@ impl TryFrom<&TradeHistoryRequest> for model::TradeHistoryReq { fn try_from(trade_history: &TradeHistoryRequest) -> Result { Ok(Self { paginator: trade_history.paginator.clone().map(|p| p.into()), - symbol: trade_history.market_pair.clone().ok_or_else(|| { - OpenLimitsError::MissingParameter("market_pair parameter is required.".to_string()) - })?, + symbol: trade_history.market_pair + .clone() + .map(|market| crate::model::MarketPair::from(market).0) + .ok_or_else(|| OpenLimitsError::MissingParameter("market_pair parameter is required.".to_string()))?, }) } } @@ -467,11 +471,11 @@ impl TryFrom<&TradeHistoryRequest> for model::TradeHistoryReq { impl From<&GetHistoricRatesRequest> for model::KlineParams { fn from(req: &GetHistoricRatesRequest) -> Self { let interval: &str = req.interval.into(); - + let symbol = crate::model::MarketPair::from(req.market_pair.clone()).0; Self { interval: String::from(interval), paginator: req.paginator.clone().map(|d| d.into()), - symbol: req.market_pair.clone(), + symbol, } } } diff --git a/crates/openlimits-binance/src/model/market_pair.rs b/crates/openlimits-binance/src/model/market_pair.rs new file mode 100644 index 0000000..531830f --- /dev/null +++ b/crates/openlimits-binance/src/model/market_pair.rs @@ -0,0 +1,11 @@ +use openlimits_exchange::model::market_pair::MarketPair as OMarketPair; +use serde::{Serialize, Deserialize}; + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct MarketPair(pub String); + +impl From for MarketPair { + fn from(from: OMarketPair) -> MarketPair { + MarketPair(format!("{}{}", from.0, from.1).to_uppercase()) + } +} \ No newline at end of file diff --git a/crates/openlimits-binance/src/model/mod.rs b/crates/openlimits-binance/src/model/mod.rs index 640d4c1..56dadbf 100644 --- a/crates/openlimits-binance/src/model/mod.rs +++ b/crates/openlimits-binance/src/model/mod.rs @@ -7,6 +7,7 @@ pub const ORDER_SIDE_BUY: &str = "BUY"; pub const ORDER_SIDE_SELL: &str = "SELL"; pub const TIME_IN_FORCE_GTC: &str = "GTC"; +mod market_pair; mod account_information; mod all_order_req; mod ask_bid; @@ -46,6 +47,7 @@ mod transaction; mod user_data_stream; pub mod websocket; +pub use market_pair::MarketPair; pub use account_information::AccountInformation; pub use all_order_req::AllOrderReq; pub use ask_bid::AskBid; diff --git a/crates/openlimits-exchange/src/lib.rs b/crates/openlimits-exchange/src/lib.rs index 6d32ca1..e62b74c 100644 --- a/crates/openlimits-exchange/src/lib.rs +++ b/crates/openlimits-exchange/src/lib.rs @@ -1,4 +1,3 @@ -pub mod market; pub mod message; pub mod errors; pub mod prelude; diff --git a/crates/openlimits-exchange/src/market/mod.rs b/crates/openlimits-exchange/src/market/mod.rs deleted file mode 100644 index 06d1f16..0000000 --- a/crates/openlimits-exchange/src/market/mod.rs +++ /dev/null @@ -1,6 +0,0 @@ -pub mod symbol; - -use symbol::Symbol; - -#[derive(Debug, Clone)] -pub struct MarketPair(pub Symbol, pub Symbol); diff --git a/crates/openlimits-exchange/src/market/symbol.rs b/crates/openlimits-exchange/src/market/symbol.rs deleted file mode 100644 index cbe617c..0000000 --- a/crates/openlimits-exchange/src/market/symbol.rs +++ /dev/null @@ -1,7 +0,0 @@ -#[derive(Debug, Clone)] -pub enum Symbol { - ETH, - BTC, - NEO, - USDC -} diff --git a/crates/openlimits-exchange/src/message/subscription.rs b/crates/openlimits-exchange/src/message/subscription.rs index 358df9b..76eacbd 100644 --- a/crates/openlimits-exchange/src/message/subscription.rs +++ b/crates/openlimits-exchange/src/message/subscription.rs @@ -1,4 +1,4 @@ -use crate::market::MarketPair; +use crate::model::market_pair::MarketPair; #[derive(Debug, Clone)] pub enum Subscription { diff --git a/crates/openlimits-exchange/src/model/currency.rs b/crates/openlimits-exchange/src/model/currency.rs new file mode 100644 index 0000000..2611780 --- /dev/null +++ b/crates/openlimits-exchange/src/model/currency.rs @@ -0,0 +1,19 @@ +use serde::{Serialize, Deserialize}; +use std::fmt; + +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Hash)] +#[allow(missing_docs)] +pub enum Currency { + BTC, + ETH, + Other(String) +} + +impl fmt::Display for Currency { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Other(s) => write!(f, "{}", s), + _ => write!(f, "{:?}", self) + } + } +} diff --git a/crates/openlimits-exchange/src/model/market_pair.rs b/crates/openlimits-exchange/src/model/market_pair.rs new file mode 100644 index 0000000..b636819 --- /dev/null +++ b/crates/openlimits-exchange/src/model/market_pair.rs @@ -0,0 +1,6 @@ +use serde::{Serialize, Deserialize}; +pub use crate::model::currency::Currency; + +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Hash)] +#[allow(missing_docs)] +pub struct MarketPair(pub Currency, pub Currency); \ No newline at end of file diff --git a/crates/openlimits-exchange/src/model/mod.rs b/crates/openlimits-exchange/src/model/mod.rs index c4b1517..26f87d1 100644 --- a/crates/openlimits-exchange/src/model/mod.rs +++ b/crates/openlimits-exchange/src/model/mod.rs @@ -18,6 +18,8 @@ pub mod time_in_force_visitor; pub mod time_in_force; pub mod trade; pub mod transaction; +pub mod currency; +pub mod market_pair; pub use request::*; pub use ask_bid::AskBid; diff --git a/crates/openlimits-exchange/src/model/request/cancel_all_order_request.rs b/crates/openlimits-exchange/src/model/request/cancel_all_order_request.rs index 8ea34b7..c5dcfe0 100644 --- a/crates/openlimits-exchange/src/model/request/cancel_all_order_request.rs +++ b/crates/openlimits-exchange/src/model/request/cancel_all_order_request.rs @@ -1,9 +1,10 @@ use derive_more::Constructor; use serde::Deserialize; use serde::Serialize; +use crate::model::market_pair::MarketPair; /// This struct represents the cancellation of all orders #[derive(Serialize, Deserialize, Clone, Constructor, Debug, PartialEq)] pub struct CancelAllOrdersRequest { - pub market_pair: Option, + pub market_pair: Option, } \ No newline at end of file diff --git a/crates/openlimits-exchange/src/model/request/get_historic_rates_request.rs b/crates/openlimits-exchange/src/model/request/get_historic_rates_request.rs index d2db566..b2611bb 100644 --- a/crates/openlimits-exchange/src/model/request/get_historic_rates_request.rs +++ b/crates/openlimits-exchange/src/model/request/get_historic_rates_request.rs @@ -2,11 +2,12 @@ use derive_more::Constructor; use serde::Deserialize; use serde::Serialize; use crate::model::{Paginator, Interval}; +use crate::model::market_pair::MarketPair; /// This struct represents the historic of the rates #[derive(Serialize, Deserialize, Clone, Constructor, Debug)] pub struct GetHistoricRatesRequest { - pub market_pair: String, + pub market_pair: MarketPair, pub paginator: Option, pub interval: Interval, } \ No newline at end of file diff --git a/crates/openlimits-exchange/src/model/request/get_order_history_request.rs b/crates/openlimits-exchange/src/model/request/get_order_history_request.rs index bdd5ea5..57e9a83 100644 --- a/crates/openlimits-exchange/src/model/request/get_order_history_request.rs +++ b/crates/openlimits-exchange/src/model/request/get_order_history_request.rs @@ -2,11 +2,12 @@ use derive_more::Constructor; use serde::Deserialize; use serde::Serialize; use crate::model::{OrderStatus, Paginator}; +use crate::model::market_pair::MarketPair; /// This struct represents the historic of the orders #[derive(Serialize, Deserialize, Clone, Constructor, Debug)] pub struct GetOrderHistoryRequest { - pub market_pair: Option, + pub market_pair: Option, pub order_status: Option>, pub paginator: Option, } \ No newline at end of file diff --git a/crates/openlimits-exchange/src/model/request/get_price_ticker_request.rs b/crates/openlimits-exchange/src/model/request/get_price_ticker_request.rs index 330b886..f44c6f7 100644 --- a/crates/openlimits-exchange/src/model/request/get_price_ticker_request.rs +++ b/crates/openlimits-exchange/src/model/request/get_price_ticker_request.rs @@ -1,9 +1,10 @@ use derive_more::Constructor; use serde::Deserialize; use serde::Serialize; +use crate::model::market_pair::MarketPair; /// This struct represents the ticker price. -#[derive(Serialize, Deserialize, Clone, Constructor, Debug, Default, PartialEq)] +#[derive(Serialize, Deserialize, Clone, Constructor, Debug, PartialEq)] pub struct GetPriceTickerRequest { - pub market_pair: String, + pub market_pair: MarketPair, } \ No newline at end of file diff --git a/crates/openlimits-exchange/src/model/request/open_limit_order_request.rs b/crates/openlimits-exchange/src/model/request/open_limit_order_request.rs index a7c7220..681ded2 100644 --- a/crates/openlimits-exchange/src/model/request/open_limit_order_request.rs +++ b/crates/openlimits-exchange/src/model/request/open_limit_order_request.rs @@ -3,12 +3,13 @@ use rust_decimal::prelude::Decimal; use serde::Deserialize; use serde::Serialize; use crate::model::TimeInForce; +use crate::model::market_pair::MarketPair; /// This struct represents an open limit order -#[derive(Serialize, Deserialize, Clone, Constructor, Debug, Default, PartialEq)] +#[derive(Serialize, Deserialize, Clone, Constructor, Debug, PartialEq)] pub struct OpenLimitOrderRequest { pub client_order_id: Option, - pub market_pair: String, + pub market_pair: MarketPair, pub size: Decimal, pub price: Decimal, pub time_in_force: TimeInForce, diff --git a/crates/openlimits-exchange/src/model/request/open_market_order_request.rs b/crates/openlimits-exchange/src/model/request/open_market_order_request.rs index 2195b30..6cdfa16 100644 --- a/crates/openlimits-exchange/src/model/request/open_market_order_request.rs +++ b/crates/openlimits-exchange/src/model/request/open_market_order_request.rs @@ -2,11 +2,12 @@ use derive_more::Constructor; use rust_decimal::prelude::Decimal; use serde::Deserialize; use serde::Serialize; +use crate::model::market_pair::MarketPair; /// This struct represents an open market order -#[derive(Serialize, Deserialize, Clone, Constructor, Debug, Default, PartialEq)] +#[derive(Serialize, Deserialize, Clone, Constructor, Debug, PartialEq)] pub struct OpenMarketOrderRequest { pub client_order_id: Option, - pub market_pair: String, + pub market_pair: MarketPair, pub size: Decimal, } \ No newline at end of file diff --git a/crates/openlimits-exchange/src/model/request/order_book_request.rs b/crates/openlimits-exchange/src/model/request/order_book_request.rs index cf45293..7f7446f 100644 --- a/crates/openlimits-exchange/src/model/request/order_book_request.rs +++ b/crates/openlimits-exchange/src/model/request/order_book_request.rs @@ -1,9 +1,10 @@ use derive_more::Constructor; use serde::Deserialize; use serde::Serialize; +use crate::model::market_pair::MarketPair; /// This struct represents an order book request -#[derive(Serialize, Deserialize, Clone, Constructor, Debug, Default, PartialEq)] +#[derive(Serialize, Deserialize, Clone, Constructor, Debug, PartialEq)] pub struct OrderBookRequest { - pub market_pair: String, + pub market_pair: MarketPair, } \ No newline at end of file diff --git a/crates/openlimits-exchange/src/model/request/trade_history_request.rs b/crates/openlimits-exchange/src/model/request/trade_history_request.rs index af2f839..40110f0 100644 --- a/crates/openlimits-exchange/src/model/request/trade_history_request.rs +++ b/crates/openlimits-exchange/src/model/request/trade_history_request.rs @@ -1,11 +1,12 @@ use serde::Deserialize; use serde::Serialize; use crate::model::Paginator; +use crate::model::market_pair::MarketPair; /// This struct represents the trade history #[derive(Serialize, Deserialize, Default)] pub struct TradeHistoryRequest { - pub market_pair: Option, + pub market_pair: Option, pub order_id: Option, pub paginator: Option, } \ No newline at end of file diff --git a/crates/openlimits-exchange/src/model/trade.rs b/crates/openlimits-exchange/src/model/trade.rs index fac2796..9ccf9ed 100644 --- a/crates/openlimits-exchange/src/model/trade.rs +++ b/crates/openlimits-exchange/src/model/trade.rs @@ -17,5 +17,5 @@ pub struct Trade { pub fees: Option, pub side: Side, pub liquidity: Option, - pub created_at: u64, + pub created_at: String, } \ No newline at end of file diff --git a/crates/openlimits-exchange/src/model/websocket.rs b/crates/openlimits-exchange/src/model/websocket.rs index 7bee549..aa25ea7 100644 --- a/crates/openlimits-exchange/src/model/websocket.rs +++ b/crates/openlimits-exchange/src/model/websocket.rs @@ -2,11 +2,12 @@ use super::{OrderBookResponse, Trade}; use crate::model::{OrderStatus, OrderType, Side}; use serde::{Deserialize, Serialize}; use std::ops::Range; +use crate::model::market_pair::MarketPair; /// This struct represents the account order #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Hash)] pub struct AccountOrders { - pub market: Option, + pub market: Option, pub order_type: Option>, pub buy_or_sell: Option, pub range: Option>, @@ -16,12 +17,12 @@ pub struct AccountOrders { /// This enum represents a subscription #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Hash)] pub enum Subscription { - Ticker(String), // symbol - OrderBookUpdates(String), // symbol - Trades(String), // symbol - AccountTrades(String), // symbol - AccountBalance(String), // symbol - AccountOrders(AccountOrders), + // Ticker(MarketPair), // symbol + OrderBookUpdates(MarketPair), // symbol + Trades(MarketPair), // symbol + // AccountTrades(MarketPair), // symbol + // AccountBalance(MarketPair), // symbol + // AccountOrders(AccountOrders), } /// This enum represents a websocket response diff --git a/crates/openlimits-exchange/src/traits/info/exchange_info.rs b/crates/openlimits-exchange/src/traits/info/exchange_info.rs index 25ec88b..a01332c 100644 --- a/crates/openlimits-exchange/src/traits/info/exchange_info.rs +++ b/crates/openlimits-exchange/src/traits/info/exchange_info.rs @@ -5,12 +5,12 @@ use crate::errors::OpenLimitsError; use super::shared::Result; use super::ExchangeInfoRetrieval; use super::MarketPairHandle; -use super::MarketPair; +use super::MarketPairInfo; /// This struct represents informations about the openlimits-exchange #[derive(Clone)] pub struct ExchangeInfo { - pairs: Arc>>>>, + pairs: Arc>>>>, } impl ExchangeInfo { diff --git a/crates/openlimits-exchange/src/traits/info/exchange_info_retrieval.rs b/crates/openlimits-exchange/src/traits/info/exchange_info_retrieval.rs index 558addb..1fe69f5 100644 --- a/crates/openlimits-exchange/src/traits/info/exchange_info_retrieval.rs +++ b/crates/openlimits-exchange/src/traits/info/exchange_info_retrieval.rs @@ -1,12 +1,13 @@ use async_trait::async_trait; use super::shared::Result; use super::MarketPairHandle; -use super::MarketPair; +use super::MarketPairInfo; +use crate::model::market_pair::MarketPair; /// This struct represents the information retrieval #[async_trait] pub trait ExchangeInfoRetrieval: Sync { - async fn get_pair(&self, name: &str) -> Result; - async fn retrieve_pairs(&self) -> Result>; + async fn get_pair(&self, market_pair: &MarketPair) -> Result; + async fn retrieve_pairs(&self) -> Result>; async fn refresh_market_info(&self) -> Result>; } \ No newline at end of file diff --git a/crates/openlimits-exchange/src/traits/info/market_pair.rs b/crates/openlimits-exchange/src/traits/info/market_pair.rs index f6e6ed2..9301719 100644 --- a/crates/openlimits-exchange/src/traits/info/market_pair.rs +++ b/crates/openlimits-exchange/src/traits/info/market_pair.rs @@ -1,7 +1,9 @@ use rust_decimal::Decimal; +// TODO: Use MarketPair inside MarketPairInfo. + #[derive(Debug, Clone)] -pub struct MarketPair { +pub struct MarketPairInfo { pub base: String, pub quote: String, pub symbol: String, diff --git a/crates/openlimits-exchange/src/traits/info/market_pair_handle.rs b/crates/openlimits-exchange/src/traits/info/market_pair_handle.rs index e68c7bb..d91df17 100644 --- a/crates/openlimits-exchange/src/traits/info/market_pair_handle.rs +++ b/crates/openlimits-exchange/src/traits/info/market_pair_handle.rs @@ -2,20 +2,20 @@ use std::sync::Arc; use std::sync::RwLock; use crate::errors::OpenLimitsError; use super::shared::Result; -use super::MarketPair; +use super::MarketPairInfo; #[derive(Debug)] pub struct MarketPairHandle { - pub inner: Arc>, + pub inner: Arc>, } impl<'a> MarketPairHandle { - pub fn new(inner: Arc>) -> Self { + pub fn new(inner: Arc>) -> Self { Self { inner } } - pub fn read(&'a self) -> Result { + pub fn read(&'a self) -> Result { self.inner .read() .map(|guard| guard.clone()) diff --git a/crates/openlimits-exchange/src/traits/info/mod.rs b/crates/openlimits-exchange/src/traits/info/mod.rs index 3191695..a92a458 100644 --- a/crates/openlimits-exchange/src/traits/info/mod.rs +++ b/crates/openlimits-exchange/src/traits/info/mod.rs @@ -8,7 +8,7 @@ mod utils; pub use exchange_info_retrieval::ExchangeInfoRetrieval; pub use exchange_info::ExchangeInfo; pub use market_pair_handle::MarketPairHandle; -pub use market_pair::MarketPair; +pub use market_pair::MarketPairInfo; pub use utils::*; pub use super::shared; diff --git a/examples/rust/orderbook.rs b/examples/rust/orderbook.rs index be3fdd1..7884f8a 100644 --- a/examples/rust/orderbook.rs +++ b/examples/rust/orderbook.rs @@ -1,18 +1,18 @@ -use openlimits::exchange::traits::stream::OpenLimitsWs; +use openlimits::prelude::*; use openlimits::exchange::coinbase::client::websocket::CoinbaseWebsocket; use openlimits::exchange::coinbase::CoinbaseParameters; use openlimits::model::websocket::OpenLimitsWebSocketMessage::OrderBook; use openlimits::model::websocket::Subscription::OrderBookUpdates; use openlimits::model::websocket::WebSocketResponse::Generic; - +use openlimits_exchange::model::market_pair::MarketPair; +use openlimits_exchange::model::currency::Currency; #[tokio::main] async fn main() { - let coinbase_websocket = OpenLimitsWs { - websocket: CoinbaseWebsocket::new(CoinbaseParameters::prod()) - }; + let coinbase_websocket = CoinbaseWebsocket::new(CoinbaseParameters::production()).await.unwrap(); + let market = MarketPair(Currency::ETH, Currency::BTC); - coinbase_websocket.subscribe(OrderBookUpdates("BTC-EUR".to_string()), move |m| { + coinbase_websocket.subscribe(OrderBookUpdates(market), move |m| { let r = m.as_ref(); if let Ok(Generic(OrderBook(order_book))) = r { diff --git a/src/exchange/coinbase/client/account.rs b/src/exchange/coinbase/client/account.rs index 0261927..88a1415 100644 --- a/src/exchange/coinbase/client/account.rs +++ b/src/exchange/coinbase/client/account.rs @@ -6,9 +6,10 @@ use crate::exchange::{ Paginator, }, }; -use crate::exchange::traits::info::MarketPair; +use crate::exchange::traits::info::MarketPairInfo; use super::BaseClient; use super::shared::Result; +use crate::exchange::coinbase::model::MarketPair; impl BaseClient { pub async fn get_account(&self, paginator: Option<&Paginator>) -> Result> { @@ -26,7 +27,7 @@ impl BaseClient { } // TODO: refactor buy and sell in order creation in commun function - pub async fn market_buy(&self, pair: MarketPair, size: Decimal) -> Result { + pub async fn market_buy(&self, pair: MarketPairInfo, size: Decimal) -> Result { let data = OrderRequest { product_id: pair.symbol, client_oid: None, @@ -47,7 +48,7 @@ impl BaseClient { Ok(transaction) } - pub async fn market_sell(&self, pair: MarketPair, size: Decimal) -> Result { + pub async fn market_sell(&self, pair: MarketPairInfo, size: Decimal) -> Result { let data = OrderRequest { product_id: pair.symbol, client_oid: None, @@ -70,7 +71,7 @@ impl BaseClient { pub async fn limit_buy( &self, - pair: MarketPair, + pair: MarketPairInfo, size: Decimal, price: Decimal, time_in_force: OrderTimeInForce, @@ -102,7 +103,7 @@ impl BaseClient { pub async fn limit_sell( &self, - pair: MarketPair, + pair: MarketPairInfo, size: Decimal, price: Decimal, time_in_force: OrderTimeInForce, @@ -150,10 +151,10 @@ impl BaseClient { Ok(resp) } - pub async fn cancel_all_orders(&self, product_id: Option<&str>) -> Result> { + pub async fn cancel_all_orders>(&self, product_id: Option

) -> Result> { let params = if let Some(product_id) = product_id { CancelAllOrders { - product_id: Some(String::from(product_id)), + product_id: Some(product_id.into().0), } } else { CancelAllOrders { product_id: None } diff --git a/src/exchange/coinbase/client/market.rs b/src/exchange/coinbase/client/market.rs index 78831b4..937966a 100644 --- a/src/exchange/coinbase/client/market.rs +++ b/src/exchange/coinbase/client/market.rs @@ -7,6 +7,7 @@ use crate::{ }; use super::shared::Result; use super::BaseClient; +use crate::exchange::coinbase::model::MarketPair; impl BaseClient { pub async fn products(&self) -> Result> { @@ -18,31 +19,32 @@ impl BaseClient { self.transport.get::<_, ()>(&endpoint, None).await } - pub async fn book(&self, pair: &str) -> Result> + pub async fn book(&self, pair: P) -> Result> where T: BookLevel + Debug + 'static, T: for<'de> Deserialize<'de>, + P: Into { - let endpoint = format!("/products/{}/book?level={}", pair, T::level()); + let endpoint = format!("/products/{}/book?level={}", pair.into().0, T::level()); self.transport.get::<_, ()>(&endpoint, None).await } - pub async fn trades(&self, pair: &str, paginator: Option<&Paginator>) -> Result> { - let endpoint = format!("/products/{}/trades", pair); + pub async fn trades>(&self, pair: P, paginator: Option<&Paginator>) -> Result> { + let endpoint = format!("/products/{}/trades", pair.into().0); self.transport.get(&endpoint, paginator).await } - pub async fn ticker(&self, pair: &str) -> Result { - let endpoint = format!("/products/{}/ticker", pair); + pub async fn ticker>(&self, pair: P) -> Result { + let endpoint = format!("/products/{}/ticker", pair.into().0); self.transport.get::<_, ()>(&endpoint, None).await } - pub async fn candles( + pub async fn candles>( &self, - pair: &str, + pair: P, params: Option<&CandleRequestParams>, ) -> Result> { - let endpoint = format!("/products/{}/candles", pair); + let endpoint = format!("/products/{}/candles", pair.into().0); self.transport.get(&endpoint, params).await } } diff --git a/src/exchange/coinbase/client/websocket.rs b/src/exchange/coinbase/client/websocket.rs index 7936ec4..0cdadb7 100644 --- a/src/exchange/coinbase/client/websocket.rs +++ b/src/exchange/coinbase/client/websocket.rs @@ -21,9 +21,10 @@ use futures::stream::BoxStream; use std::sync::Mutex; use tokio::sync::mpsc::{unbounded_channel, UnboundedSender}; use super::shared::Result; +use openlimits_exchange::exchange::Environment; -const WS_URL_PROD: &str = "wss://ws-feed.pro.coinbase.com"; -const WS_URL_SANDBOX: &str = "wss://ws-feed-public.sandbox.pro.coinbase.com"; +const WS_URL_PROD: &str = "wss://ws-feed.exchange.coinbase.com"; +const WS_URL_SANDBOX: &str = "wss://ws-feed-public.sandbox.exchange.coinbase.com"; #[derive(Debug, Clone, Deserialize, Serialize)] #[serde(untagged)] @@ -42,14 +43,6 @@ pub struct CoinbaseWebsocket { } impl CoinbaseWebsocket { - pub fn new(parameters: CoinbaseParameters) -> Self { - Self { - subscriptions: Default::default(), - parameters, - disconnection_senders: Default::default(), - } - } - pub async fn subscribe_(&mut self, subscription: CoinbaseSubscription) -> Result<()> { let (channels, product_ids) = match &subscription { CoinbaseSubscription::Level2(product_id) => ( @@ -60,7 +53,10 @@ impl CoinbaseWebsocket { vec![Channel::Name(ChannelType::Heartbeat)], vec![product_id.clone()], ), - _ => unimplemented!(), + CoinbaseSubscription::Matches(product_id) => ( + vec![Channel::Name(ChannelType::Matches)], + vec![product_id.clone()] + ) }; let subscribe = Subscribe { _type: SubscribeCmd::Subscribe, @@ -75,7 +71,7 @@ impl CoinbaseWebsocket { } pub async fn connect(&self, subscribe: Subscribe) -> Result> { - let ws_url = if self.parameters.sandbox { + let ws_url = if self.parameters.environment == Environment::Sandbox { WS_URL_SANDBOX } else { WS_URL_PROD @@ -123,7 +119,11 @@ impl ExchangeWs for CoinbaseWebsocket { type Response = CoinbaseWebsocketMessage; async fn new(parameters: Self::InitParams) -> Result { - Ok(CoinbaseWebsocket::new(parameters)) + Ok(Self { + subscriptions: Default::default(), + parameters, + disconnection_senders: Default::default(), + }) } async fn disconnect(&self) { @@ -139,7 +139,7 @@ impl ExchangeWs for CoinbaseWebsocket { &self, subscription: Subscriptions, ) -> Result>> { - let ws_url = if self.parameters.sandbox { + let ws_url = if self.parameters.environment == Environment::Sandbox { WS_URL_SANDBOX } else { WS_URL_PROD @@ -156,7 +156,10 @@ impl ExchangeWs for CoinbaseWebsocket { vec![Channel::Name(ChannelType::Heartbeat)], vec![product_id.clone()], ), - _ => unimplemented!(), + CoinbaseSubscription::Matches(product_id) => ( + vec![Channel::Name(ChannelType::Matches)], + vec![product_id.clone()] + ) }; let subscribe = Subscribe { _type: SubscribeCmd::Subscribe, diff --git a/src/exchange/coinbase/coinbase_parameters.rs b/src/exchange/coinbase/coinbase_parameters.rs index 17297b8..bd33ffb 100644 --- a/src/exchange/coinbase/coinbase_parameters.rs +++ b/src/exchange/coinbase/coinbase_parameters.rs @@ -1,23 +1,24 @@ use super::CoinbaseCredentials; +use openlimits_exchange::exchange::Environment; /// This struct represents the coinbase parameters #[derive(Default, Clone, Debug)] pub struct CoinbaseParameters { - pub sandbox: bool, + pub environment: Environment, pub credentials: Option, } impl CoinbaseParameters { pub fn sandbox() -> Self { Self { - sandbox: true, + environment: Environment::Sandbox, ..Default::default() } } - pub fn prod() -> Self { + pub fn production() -> Self { Self { - sandbox: false, + environment: Environment::Production, ..Default::default() } } diff --git a/src/exchange/coinbase/mod.rs b/src/exchange/coinbase/mod.rs index e5f33ba..df88973 100644 --- a/src/exchange/coinbase/mod.rs +++ b/src/exchange/coinbase/mod.rs @@ -1,17 +1,19 @@ //! This module provides functionality for communicating with the coinbase API. //! # Example -//! ``` +//! ```no_run //! use openlimits::exchange::coinbase::Coinbase; //! use openlimits::exchange::coinbase::CoinbaseParameters; //! use openlimits::prelude::*; +//! use openlimits::model::market_pair::*; //! //! #[tokio::main] //! async fn main() { -//! let coinbase = Coinbase::new(CoinbaseParameters::prod()) +//! let coinbase = Coinbase::new(CoinbaseParameters::production()) //! .await //! .expect("Couldn't create coinbase client"); - -//! let order_book = coinbase.order_book(&OrderBookRequest {market_pair: "BTC-EUR".to_string()}) +//! +//! let market_pair = MarketPair(Currency::BTC, Currency::ETH); +//! let order_book = coinbase.order_book(&OrderBookRequest { market_pair }) //! .await //! .expect("Couldn't get order book"); @@ -40,7 +42,7 @@ use crate::{ Paginator, Side, Ticker, TimeInForce, Trade, TradeHistoryRequest, }, }; -use crate::exchange::traits::info::{ExchangeInfoRetrieval, MarketPair, MarketPairHandle}; +use crate::exchange::traits::info::{ExchangeInfoRetrieval, MarketPairInfo, MarketPairHandle}; use crate::exchange::traits::Exchange; use crate::prelude::*; use super::shared::Result; @@ -57,6 +59,9 @@ pub use coinbase_content_error::CoinbaseContentError; pub use coinbase_credentials::CoinbaseCredentials; pub use coinbase_parameters::CoinbaseParameters; pub use super::shared; +use openlimits_exchange::exchange::Environment; +pub use crate::exchange::coinbase::client::websocket::CoinbaseWebsocket; +use openlimits_exchange::model::market_pair::MarketPair; #[derive(Clone)] pub struct Coinbase { @@ -78,14 +83,14 @@ impl Exchange for Coinbase { &credentials.api_key, &credentials.api_secret, &credentials.passphrase, - parameters.sandbox, + parameters.environment == Environment::Sandbox, )?, }, }, None => Coinbase { exchange_info: ExchangeInfo::new(), client: BaseClient { - transport: Transport::new(parameters.sandbox)?, + transport: Transport::new(parameters.environment == Environment::Sandbox)?, }, }, }; @@ -101,10 +106,10 @@ impl Exchange for Coinbase { #[async_trait] impl ExchangeInfoRetrieval for Coinbase { - async fn retrieve_pairs(&self) -> Result> { + async fn retrieve_pairs(&self) -> Result> { self.client.products().await.map(|v| { v.into_iter() - .map(|product| MarketPair { + .map(|product| MarketPairInfo { symbol: product.id, base: product.base_currency, quote: product.quote_currency, @@ -123,8 +128,9 @@ impl ExchangeInfoRetrieval for Coinbase { .await } - async fn get_pair(&self, name: &str) -> Result { - self.exchange_info.get_pair(name) + async fn get_pair(&self, name: &MarketPair) -> Result { + let name = crate::exchange::coinbase::model::MarketPair::from(name.clone()).0; + self.exchange_info.get_pair(&name) } } @@ -132,19 +138,19 @@ impl ExchangeInfoRetrieval for Coinbase { impl ExchangeMarketData for Coinbase { async fn order_book(&self, req: &OrderBookRequest) -> Result { self.client - .book::(&req.market_pair) + .book::(req.market_pair.clone()) .await .map(Into::into) } async fn get_price_ticker(&self, req: &GetPriceTickerRequest) -> Result { - self.client.ticker(&req.market_pair).await.map(Into::into) + self.client.ticker(req.market_pair.clone()).await.map(Into::into) } async fn get_historic_rates(&self, req: &GetHistoricRatesRequest) -> Result> { let params = model::CandleRequestParams::try_from(req)?; self.client - .candles(&req.market_pair, Some(¶ms)) + .candles(req.market_pair.clone(), Some(¶ms)) .await .map(|v| v.into_iter().map(Into::into).collect()) } @@ -204,7 +210,7 @@ impl From for Order { #[async_trait] impl ExchangeAccount for Coinbase { async fn limit_buy(&self, req: &OpenLimitOrderRequest) -> Result { - let pair = self.exchange_info.get_pair(&req.market_pair)?.read()?; + let pair = self.get_pair(&req.market_pair).await?.read()?; self.client .limit_buy( pair, @@ -218,7 +224,7 @@ impl ExchangeAccount for Coinbase { } async fn limit_sell(&self, req: &OpenLimitOrderRequest) -> Result { - let pair = self.exchange_info.get_pair(&req.market_pair)?.read()?; + let pair = self.get_pair(&req.market_pair).await?.read()?; self.client .limit_sell( pair, @@ -232,12 +238,12 @@ impl ExchangeAccount for Coinbase { } async fn market_buy(&self, req: &OpenMarketOrderRequest) -> Result { - let pair = self.exchange_info.get_pair(&req.market_pair)?.read()?; + let pair = self.get_pair(&req.market_pair).await?.read()?; self.client.market_buy(pair, req.size).await.map(Into::into) } async fn market_sell(&self, req: &OpenMarketOrderRequest) -> Result { - let pair = self.exchange_info.get_pair(&req.market_pair)?.read()?; + let pair = self.get_pair(&req.market_pair).await?.read()?; self.client .market_sell(pair, req.size) .await @@ -253,7 +259,7 @@ impl ExchangeAccount for Coinbase { async fn cancel_all_orders(&self, req: &CancelAllOrdersRequest) -> Result> { self.client - .cancel_all_orders(req.market_pair.as_deref()) + .cancel_all_orders(req.market_pair.clone()) .await .map(|v| v.into_iter().map(Into::into).collect()) } @@ -339,7 +345,7 @@ impl From for Trade { "T" => Some(Liquidity::Taker), _ => None, }, - created_at: (fill.created_at.timestamp_millis()) as u64, + created_at: fill.created_at.to_string(), } } } @@ -380,7 +386,7 @@ impl TryFrom<&GetHistoricRatesRequest> for model::CandleRequestParams { impl From<&GetOrderHistoryRequest> for model::GetOrderRequest { fn from(req: &GetOrderHistoryRequest) -> Self { Self { - product_id: req.market_pair.clone(), + product_id: req.market_pair.clone().map(|market| crate::exchange::coinbase::model::MarketPair::from(market).0), paginator: req.paginator.clone().map(|p| p.into()), status: None, } @@ -471,7 +477,7 @@ impl From<&TradeHistoryRequest> for model::GetFillsReq { Self { order_id: req.order_id.clone(), paginator: req.paginator.clone().map(|p| p.into()), - product_id: req.market_pair.clone(), + product_id: req.market_pair.clone().map(|market| crate::exchange::coinbase::model::MarketPair::from(market).0), } } } diff --git a/src/exchange/coinbase/model/market_pair.rs b/src/exchange/coinbase/model/market_pair.rs new file mode 100644 index 0000000..0fbc4da --- /dev/null +++ b/src/exchange/coinbase/model/market_pair.rs @@ -0,0 +1,11 @@ +use openlimits_exchange::model::market_pair::MarketPair as OMarketPair; +use serde::{Serialize, Deserialize}; + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct MarketPair(pub String); + +impl From for MarketPair { + fn from(from: OMarketPair) -> MarketPair { + MarketPair(format!("{}-{}", from.0, from.1).to_uppercase()) + } +} \ No newline at end of file diff --git a/src/exchange/coinbase/model/mod.rs b/src/exchange/coinbase/model/mod.rs index e146c0c..77641b6 100644 --- a/src/exchange/coinbase/model/mod.rs +++ b/src/exchange/coinbase/model/mod.rs @@ -1,4 +1,6 @@ //! This module provides models that are used in the coinbase module + +mod market_pair; mod account; mod book_level; mod book_record_l1; @@ -31,6 +33,7 @@ mod ticker; mod trade; pub mod websocket; +pub use market_pair::MarketPair; pub use account::Account; pub use book_level::BookLevel; pub use book_record_l1::BookRecordL1; diff --git a/src/exchange/coinbase/model/websocket/coinbase_subscription.rs b/src/exchange/coinbase/model/websocket/coinbase_subscription.rs index c6b44e1..91fb19e 100644 --- a/src/exchange/coinbase/model/websocket/coinbase_subscription.rs +++ b/src/exchange/coinbase/model/websocket/coinbase_subscription.rs @@ -4,19 +4,20 @@ use crate::model::websocket::Subscription; #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub enum CoinbaseSubscription { Heartbeat(String), - Status, + // Status, // Ticker(String), Level2(String), // User, - // Matches, + Matches(String), // FullChannel } impl From for CoinbaseSubscription { fn from(subscription: Subscription) -> Self { match subscription { - Subscription::OrderBookUpdates(symbol) => CoinbaseSubscription::Level2(symbol), - _ => unimplemented!(), + Subscription::OrderBookUpdates(symbol) => CoinbaseSubscription::Level2(crate::exchange::coinbase::model::MarketPair::from(symbol).0), + Subscription::Trades(symbol) => CoinbaseSubscription::Matches(crate::exchange::coinbase::model::MarketPair::from(symbol).0), + // Subscription::Ticker(ticket) => } } } \ No newline at end of file diff --git a/src/exchange/coinbase/model/websocket/mod.rs b/src/exchange/coinbase/model/websocket/mod.rs index 08f1e71..079e11a 100644 --- a/src/exchange/coinbase/model/websocket/mod.rs +++ b/src/exchange/coinbase/model/websocket/mod.rs @@ -52,6 +52,7 @@ pub use subscribe_cmd::SubscribeCmd; pub use subscribe::Subscribe; pub use ticker::Ticker; pub use super::shared; +use openlimits_exchange::model::Trade; impl TryFrom for WebSocketResponse { type Error = OpenLimitsError; @@ -60,12 +61,33 @@ impl TryFrom for WebSocketResponse { Ok(WebSocketResponse::Generic(level2.try_into()?)) - } - _ => Ok(WebSocketResponse::Raw(value)), + }, + CoinbaseWebsocketMessage::Match(match_) => { + Ok(WebSocketResponse::Generic(match_.into())) + }, + _ => Ok(WebSocketResponse::Raw(value)) } } } +impl From for OpenLimitsWebSocketMessage { + fn from(match_: Match) -> Self { + let market_pair = match_.product_id; + let price = match_.price; + let qty = match_.size; + let id = format!("{}", match_.trade_id); + let buyer_order_id = Some(match_.taker_order_id); + let seller_order_id = Some(match_.maker_order_id); + let created_at = match_.time; + let fees = None; + let liquidity = None; + let side = match_.side.into(); + let trade = Trade { market_pair, price, qty, id, buyer_order_id, created_at, fees, liquidity, seller_order_id, side }; + let trades = vec![trade]; + Self::Trades(trades) + } +} + impl TryFrom for OpenLimitsWebSocketMessage { type Error = OpenLimitsError; diff --git a/src/exchange/coinbase/transport.rs b/src/exchange/coinbase/transport.rs index 76d229d..8b3f8b6 100644 --- a/src/exchange/coinbase/transport.rs +++ b/src/exchange/coinbase/transport.rs @@ -65,9 +65,9 @@ impl Transport { fn get_base_url(sandbox: bool) -> String { if sandbox { - String::from("https://api-public.sandbox.pro.coinbase.com") + String::from("https://api-public.sandbox.exchange.coinbase.com") } else { - String::from("https://api.pro.coinbase.com") + String::from("https://api.exchange.coinbase.com") } } diff --git a/src/prelude/mod.rs b/src/prelude/mod.rs index 3cd3477..e6b4eb7 100644 --- a/src/prelude/mod.rs +++ b/src/prelude/mod.rs @@ -2,6 +2,6 @@ pub use crate::model::{OrderBookRequest, OrderBookResponse}; pub use crate::exchange::traits::stream::ExchangeWs; -pub use crate::exchange::traits::info::{ExchangeInfo, ExchangeInfoRetrieval, MarketPair, MarketPairHandle}; +pub use crate::exchange::traits::info::{ExchangeInfo, ExchangeInfoRetrieval, MarketPairInfo, MarketPairHandle}; pub use crate::exchange::traits::{Exchange, ExchangeAccount, ExchangeMarketData}; diff --git a/tests/binance/account.rs b/tests/binance/account.rs index 4298f6d..e986c74 100644 --- a/tests/binance/account.rs +++ b/tests/binance/account.rs @@ -1,15 +1,5 @@ -use dotenv::dotenv; -use std::env; - use crate::template::account; - -use openlimits::{ - OpenLimits, - exchange::binance::Binance, - exchange::binance::BinanceCredentials, - exchange::binance::BinanceParameters, -}; -use openlimits_exchange::exchange::Environment; +use super::client::init_signed as init; #[tokio::test] async fn limit_buy() { @@ -65,19 +55,3 @@ async fn get_account_balances() { async fn get_trade_history() { account::get_trade_history(&init().await).await; } - -async fn init() -> Binance { - dotenv().ok(); - - let parameters = BinanceParameters { - credentials: Some(BinanceCredentials { - api_key: env::var("BINANCE_API_KEY").expect("Couldn't get environment variable."), - api_secret: env::var("BINANCE_API_SECRET").expect("Couldn't get environment variable."), - }), - environment: Environment::Sandbox, - }; - - OpenLimits::instantiate(parameters) - .await - .expect("Failed to create Client") -} diff --git a/tests/binance/callbacks.rs b/tests/binance/callbacks.rs index 7a028cf..f96142b 100644 --- a/tests/binance/callbacks.rs +++ b/tests/binance/callbacks.rs @@ -1,6 +1,5 @@ -use openlimits::exchange::binance::{BinanceParameters, client::websocket::BinanceWebsocket}; -use openlimits::exchange::traits::stream::ExchangeWs; use crate::template::callbacks; +use super::client::init_ws as init; #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn orderbook() { @@ -10,10 +9,4 @@ async fn orderbook() { #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn trades() { callbacks::trades(&init().await).await; -} - -async fn init() -> BinanceWebsocket { - BinanceWebsocket::new(BinanceParameters::production()) - .await - .expect("Failed to create Client") -} +} \ No newline at end of file diff --git a/tests/binance/client.rs b/tests/binance/client.rs new file mode 100644 index 0000000..11b0cd8 --- /dev/null +++ b/tests/binance/client.rs @@ -0,0 +1,38 @@ +use dotenv::dotenv; +use openlimits::{ + exchange::binance::{Binance, BinanceParameters, BinanceWebsocket, BinanceCredentials}, + OpenLimits, + exchange::traits::{ + Exchange, + stream::ExchangeWs + } +}; +use openlimits_exchange::exchange::Environment; + +pub async fn init_ws() -> BinanceWebsocket { + BinanceWebsocket::new(BinanceParameters::production()) + .await + .expect("Failed to create Binance stream.") +} + +pub async fn init() -> Binance { + Binance::new(BinanceParameters::sandbox()) + .await + .expect("Failed to create Client") +} + +pub async fn init_signed() -> Binance { + dotenv().ok(); + + let parameters = BinanceParameters { + credentials: Some(BinanceCredentials { + api_key: std::env::var("BINANCE_API_KEY").expect("Couldn't get environment variable."), + api_secret: std::env::var("BINANCE_API_SECRET").expect("Couldn't get environment variable."), + }), + environment: Environment::Sandbox, + }; + + OpenLimits::instantiate(parameters) + .await + .expect("Failed to create Client") +} \ No newline at end of file diff --git a/tests/binance/market.rs b/tests/binance/market.rs index efee6ec..561dfac 100644 --- a/tests/binance/market.rs +++ b/tests/binance/market.rs @@ -1,10 +1,5 @@ -use openlimits::{ - OpenLimits, - exchange::binance::Binance, - exchange::binance::BinanceParameters, -}; -use openlimits_exchange::exchange::Environment; use crate::template::market; +use super::client::init; #[tokio::test] async fn order_book() { @@ -25,14 +20,3 @@ async fn get_historic_rates() { async fn pair() { market::pair(&init().await).await; } - -async fn init() -> Binance { - let parameters = BinanceParameters { - credentials: None, - environment: Environment::Sandbox, - }; - - OpenLimits::instantiate(parameters) - .await - .expect("Failed to create Client") -} diff --git a/tests/binance/mod.rs b/tests/binance/mod.rs index d22ce9e..7a50994 100644 --- a/tests/binance/mod.rs +++ b/tests/binance/mod.rs @@ -2,3 +2,4 @@ mod account; mod market; mod callbacks; mod streams; +pub mod client; \ No newline at end of file diff --git a/tests/binance/streams.rs b/tests/binance/streams.rs index fef4593..88c9695 100644 --- a/tests/binance/streams.rs +++ b/tests/binance/streams.rs @@ -1,9 +1,5 @@ -use openlimits::{ - exchange::binance::{BinanceParameters, BinanceWebsocket}, -}; -use openlimits::exchange::traits::stream::ExchangeWs; - use crate::template::streams; +use super::client::init_ws as init; #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn orderbook() { @@ -14,9 +10,3 @@ async fn orderbook() { async fn trades() { streams::trades(&init().await).await; } - -async fn init() -> BinanceWebsocket { - BinanceWebsocket::new(BinanceParameters::production()) - .await - .expect("Failed to create Binance stream.") -} diff --git a/tests/coinbase/account.rs b/tests/coinbase/account.rs index bf0c080..e986c74 100644 --- a/tests/coinbase/account.rs +++ b/tests/coinbase/account.rs @@ -1,245 +1,57 @@ -use dotenv::dotenv; -use std::env; - -use openlimits::{ - OpenLimits, - exchange::coinbase::Coinbase, - exchange::coinbase::CoinbaseCredentials, - exchange::coinbase::CoinbaseParameters, - prelude::*, - model::{ - CancelAllOrdersRequest, CancelOrderRequest, GetOrderHistoryRequest, OpenLimitOrderRequest, - OpenMarketOrderRequest, TimeInForce, TradeHistoryRequest, - }, -}; -use rust_decimal::prelude::Decimal; +use crate::template::account; +use super::client::init_signed as init; #[tokio::test] -#[ignore] async fn limit_buy() { - let exchange = init().await; - let req = OpenLimitOrderRequest { - client_order_id: None, - time_in_force: TimeInForce::GoodTillCancelled, - post_only: false, - price: Decimal::new(1, 3), - size: Decimal::new(1, 1), - market_pair: String::from("ETH-BTC"), - }; - let resp = ExchangeAccount::limit_buy(&exchange, &req) - .await - .expect("Couldn't limit buy."); - println!("{:?}", resp); + account::limit_buy(&init().await).await; } #[tokio::test] -#[ignore] async fn limit_sell() { - let exchange = init().await; - let req = OpenLimitOrderRequest { - client_order_id: None, - time_in_force: TimeInForce::GoodTillCancelled, - post_only: false, - price: Decimal::new(1, 1), - size: Decimal::new(1, 1), - market_pair: String::from("ETH-BTC"), - }; - let resp = exchange - .limit_sell(&req) - .await - .expect("Couldn't limit sell."); - println!("{:?}", resp); + account::limit_sell(&init().await).await; } #[tokio::test] async fn post_only() { - let exchange = init().await; - let req = OpenLimitOrderRequest { - client_order_id: None, - time_in_force: TimeInForce::GoodTillCancelled, - price: Decimal::new(1, 1), - size: Decimal::new(1, 1), - post_only: true, - market_pair: String::from("ETH-BTC"), - }; - let resp = exchange - .limit_sell(&req) - .await - .expect("Couldn't limit sell."); - println!("{:?}", resp); + account::post_only(&init().await).await; } #[tokio::test] -#[ignore] async fn market_buy() { - let exchange = init().await; - let req = OpenMarketOrderRequest { - client_order_id: None, - size: Decimal::new(1, 1), - market_pair: String::from("ETH-BTC"), - }; - let resp = exchange - .market_buy(&req) - .await - .expect("Couldn't limit buy."); - println!("{:?}", resp); + account::market_buy(&init().await).await; } #[tokio::test] -#[ignore] async fn market_sell() { - let exchange = init().await; - let req = OpenMarketOrderRequest { - client_order_id: None, - size: Decimal::new(1, 1), - market_pair: String::from("ETH-BTC"), - }; - let resp = exchange - .market_sell(&req) - .await - .expect("Couldn't market sell."); - println!("{:?}", resp); + account::market_sell(&init().await).await; } #[tokio::test] async fn cancel_order() { - let exchange = init().await; - let req = OpenLimitOrderRequest { - client_order_id: None, - time_in_force: TimeInForce::GoodTillCancelled, - post_only: false, - price: Decimal::new(1, 1), - size: Decimal::new(1, 1), - market_pair: String::from("ETH-BTC"), - }; - let order = exchange - .limit_sell(&req) - .await - .expect("Couldn't limit sell."); - - let req = CancelOrderRequest { - id: order.id, - market_pair: Some(order.market_pair), - }; - let resp = exchange - .cancel_order(&req) - .await - .expect("Couldn't cancel order."); - println!("{:?}", resp); + account::cancel_order(&init().await).await; } #[tokio::test] -#[ignore] async fn cancel_all_orders() { - let exchange = init().await; - let req = OpenLimitOrderRequest { - client_order_id: None, - time_in_force: TimeInForce::GoodTillCancelled, - post_only: false, - price: Decimal::new(1, 1), - size: Decimal::new(1, 1), - market_pair: String::from("ETH-BTC"), - }; - exchange - .limit_sell(&req) - .await - .expect("Couldn't limit sell."); - - exchange - .limit_sell(&req) - .await - .expect("Couldn't limit sell."); - - let req = CancelAllOrdersRequest { - market_pair: Some("ETH-BTC".to_string()), - }; - - let resp = exchange - .cancel_all_orders(&req) - .await - .expect("Couldn't cancel all orders."); - println!("{:?}", resp); + account::cancel_all_orders(&init().await).await; } #[tokio::test] async fn get_order_history() { - let exchange = init().await; - let req = GetOrderHistoryRequest { - market_pair: Some(String::from("ETH-BTC")), - order_status: None, - paginator: None, - }; - - let resp = exchange - .get_order_history(&req) - .await - .expect("Couldn't get order history."); - println!("{:?}", resp); + account::get_order_history(&init().await).await; } #[tokio::test] async fn get_all_open_orders() { - let exchange = init().await; - let req = OpenLimitOrderRequest { - client_order_id: None, - time_in_force: TimeInForce::GoodTillCancelled, - post_only: false, - price: Decimal::new(1, 1), - size: Decimal::new(1, 1), - market_pair: String::from("ETH-BTC"), - }; - exchange - .limit_sell(&req) - .await - .expect("Couldn't limit sell."); - - let resp = exchange - .get_all_open_orders() - .await - .expect("Couldn't get all open orders."); - println!("{:?}", resp); + account::get_all_open_orders(&init().await).await; } #[tokio::test] async fn get_account_balances() { - let exchange = init().await; - let resp = exchange - .get_account_balances(None) - .await - .expect("Couldn't get account balances."); - println!("{:?}", resp); + account::get_account_balances(&init().await).await; } #[tokio::test] async fn get_trade_history() { - let exchange = init().await; - let req = TradeHistoryRequest { - market_pair: Some("ETH-BTC".to_string()), - ..Default::default() - }; - - let resp = exchange - .get_trade_history(&req) - .await - .expect("Couldn't get trade history."); - println!("{:?}", resp); -} - -async fn init() -> Coinbase { - dotenv().ok(); - - let parameters = CoinbaseParameters { - credentials: Some(CoinbaseCredentials { - api_key: env::var("COINBASE_API_KEY").expect("Couldn't get environment variable."), - api_secret: env::var("COINBASE_API_SECRET") - .expect("Couldn't get environment variable."), - passphrase: env::var("COINBASE_PASSPHRASE") - .expect("Couldn't get environment variable."), - }), - sandbox: true, - }; - - OpenLimits::instantiate(parameters) - .await - .expect("Failed to create Client") + account::get_trade_history(&init().await).await; } diff --git a/tests/coinbase/callbacks.rs b/tests/coinbase/callbacks.rs new file mode 100644 index 0000000..f96142b --- /dev/null +++ b/tests/coinbase/callbacks.rs @@ -0,0 +1,12 @@ +use crate::template::callbacks; +use super::client::init_ws as init; + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn orderbook() { + callbacks::orderbook(&init().await).await; +} + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn trades() { + callbacks::trades(&init().await).await; +} \ No newline at end of file diff --git a/tests/coinbase/client.rs b/tests/coinbase/client.rs new file mode 100644 index 0000000..9501d0e --- /dev/null +++ b/tests/coinbase/client.rs @@ -0,0 +1,36 @@ +use dotenv::dotenv; +use openlimits::{ + exchange::coinbase::{Coinbase, CoinbaseParameters, CoinbaseWebsocket, CoinbaseCredentials}, + OpenLimits, +}; +use openlimits::prelude::*; +use openlimits_exchange::exchange::Environment; + +pub async fn init_ws() -> CoinbaseWebsocket { + CoinbaseWebsocket::new(CoinbaseParameters::production()) + .await + .expect("Failed to create Binance stream.") +} + +pub async fn init() -> Coinbase { + Coinbase::new(CoinbaseParameters::sandbox()) + .await + .expect("Failed to create Client") +} + +pub async fn init_signed() -> Coinbase { + dotenv().ok(); + + let parameters = CoinbaseParameters { + credentials: Some(CoinbaseCredentials { + api_key: std::env::var("COINBASE_API_KEY").expect("Couldn't get environment variable."), + api_secret: std::env::var("COINBASE_API_SECRET").expect("Couldn't get environment variable."), + passphrase: std::env::var("COINBASE_PASSPHRASE").expect("Couldn't get environment variable.") + }), + environment: Environment::Sandbox, + }; + + OpenLimits::instantiate(parameters) + .await + .expect("Failed to create Client") +} \ No newline at end of file diff --git a/tests/coinbase/exchange.rs b/tests/coinbase/exchange.rs deleted file mode 100644 index 921af01..0000000 --- a/tests/coinbase/exchange.rs +++ /dev/null @@ -1,21 +0,0 @@ -use openlimits::exchange::coinbase::{Coinbase, CoinbaseParameters}; -use openlimits::OpenLimits; -use openlimits::prelude::*; - -#[tokio::test] -async fn retrieve_pairs() { - let exchange = init().await; - let result = exchange.retrieve_pairs().await.expect("Couldn't retrieve pairs"); - println!("{:#?}", result); -} - -async fn init() -> Coinbase { - let parameters = CoinbaseParameters { - credentials: None, - sandbox: true, - }; - - OpenLimits::instantiate(parameters) - .await - .expect("Failed to create Client") -} diff --git a/tests/coinbase/market.rs b/tests/coinbase/market.rs index d121f5f..561dfac 100644 --- a/tests/coinbase/market.rs +++ b/tests/coinbase/market.rs @@ -1,81 +1,22 @@ -use openlimits::{ - OpenLimits, - exchange::coinbase::Coinbase, - exchange::coinbase::CoinbaseParameters, - prelude::*, - model::{GetHistoricRatesRequest, GetPriceTickerRequest, Interval, OrderBookRequest}, -}; +use crate::template::market; +use super::client::init; #[tokio::test] async fn order_book() { - let exchange = init().await; - let req = OrderBookRequest { - market_pair: "ETH-BTC".to_string(), - }; - let _response = exchange - .order_book(&req) - .await - .expect("Couldn't get order book."); + market::order_book(&init().await).await; } #[tokio::test] async fn get_price_ticker() { - let exchange = init().await; - let req = GetPriceTickerRequest { - market_pair: "ETH-BTC".to_string(), - }; - let _response = exchange - .get_price_ticker(&req) - .await - .expect("Couldn't get price ticker."); + market::get_price_ticker(&init().await).await; } #[tokio::test] async fn get_historic_rates() { - let exchange = init().await; - let req = GetHistoricRatesRequest { - market_pair: "ETH-BTC".to_string(), - interval: Interval::OneHour, - paginator: None, - }; - let _response = exchange - .get_historic_rates(&req) - .await - .expect("Couldn't get historic rates."); -} - -#[tokio::test] -async fn get_historic_rates_invalid_interval() { - let exchange = init().await; - let req = GetHistoricRatesRequest { - market_pair: "ETH-BTC".to_string(), - interval: Interval::TwoHours, - paginator: None, - }; - let _response = exchange - .get_historic_rates(&req) - .await - .expect_err("Invalid rate isn't invalid."); + market::get_historic_rates(&init().await).await; } #[tokio::test] async fn pair() { - let exchange = Coinbase::new(CoinbaseParameters::sandbox()) - .await - .expect("Failed to create Client"); - let _response = exchange - .get_pair("BTC-USD") - .await - .expect("Couldn't get pair."); -} - -async fn init() -> Coinbase { - let parameters = CoinbaseParameters { - credentials: None, - sandbox: true, - }; - - OpenLimits::instantiate(parameters) - .await - .expect("Failed to create Client") + market::pair(&init().await).await; } diff --git a/tests/coinbase/mod.rs b/tests/coinbase/mod.rs index b149829..7a50994 100644 --- a/tests/coinbase/mod.rs +++ b/tests/coinbase/mod.rs @@ -1,3 +1,5 @@ mod account; mod market; -mod exchange; \ No newline at end of file +mod callbacks; +mod streams; +pub mod client; \ No newline at end of file diff --git a/tests/coinbase/streams.rs b/tests/coinbase/streams.rs new file mode 100644 index 0000000..88c9695 --- /dev/null +++ b/tests/coinbase/streams.rs @@ -0,0 +1,12 @@ +use crate::template::streams; +use super::client::init_ws as init; + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn orderbook() { + streams::orderbook(&init().await).await; +} + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn trades() { + streams::trades(&init().await).await; +} diff --git a/tests/mod.rs b/tests/mod.rs index 7b14c26..b0e0912 100644 --- a/tests/mod.rs +++ b/tests/mod.rs @@ -4,5 +4,5 @@ mod template; // mod exchange; // mod apis; mod binance; -// mod coinbase; +mod coinbase; // mod nash; diff --git a/tests/template/account.rs b/tests/template/account.rs index 0797827..2da662e 100644 --- a/tests/template/account.rs +++ b/tests/template/account.rs @@ -8,10 +8,12 @@ use openlimits::{ }, }; use rust_decimal::prelude::*; +use openlimits::exchange::model::market_pair::MarketPair; +use openlimits::model::currency::Currency; -async fn get_current_price(exchange: &impl Exchange, market_pair: &str, multiplier: f32) -> Decimal { - let market_pair = market_pair.into(); +async fn get_current_price(exchange: &impl Exchange, market_pair: &MarketPair, multiplier: f32) -> Decimal { + let market_pair = market_pair.clone(); let ticket = exchange .get_price_ticker(&GetPriceTickerRequest { market_pair }) .await @@ -21,13 +23,13 @@ async fn get_current_price(exchange: &impl Exchange, market_pair: &str, multipli } pub async fn limit_buy(exchange: &impl Exchange) { - let pair_text = "BNBBUSD"; - let price = get_price(exchange, pair_text).await; + let market_pair = MarketPair(Currency::ETH, Currency::BTC); + let price = get_price(exchange, &market_pair).await; let req = OpenLimitOrderRequest { client_order_id: None, price, size: Decimal::new(1, 1), - market_pair: String::from(pair_text), + market_pair, post_only: false, time_in_force: TimeInForce::GoodTillCancelled, }; @@ -36,13 +38,14 @@ pub async fn limit_buy(exchange: &impl Exchange) { } pub async fn limit_sell(exchange: &impl Exchange) { - let price = get_price(exchange, "BNBBTC").await; + let market_pair = MarketPair(Currency::ETH, Currency::BTC); + let price = get_price(exchange, &market_pair).await; let req = OpenLimitOrderRequest { client_order_id: None, price, post_only: false, size: Decimal::new(1, 1), - market_pair: String::from("BNBBTC"), + market_pair, time_in_force: TimeInForce::GoodTillCancelled, }; let resp = exchange @@ -53,12 +56,13 @@ pub async fn limit_sell(exchange: &impl Exchange) { } pub async fn post_only(exchange: &impl Exchange) { - let price = get_current_price(exchange, "BNBBTC", 1.5).await; + let market_pair = MarketPair(Currency::ETH, Currency::BTC); + let price = get_current_price(exchange, &market_pair, 1.5).await; let req = OpenLimitOrderRequest { client_order_id: None, price, size: Decimal::new(1, 1), - market_pair: String::from("BNBBTC"), + market_pair: market_pair.clone(), post_only: true, time_in_force: TimeInForce::GoodTillCancelled, }; @@ -68,12 +72,12 @@ pub async fn post_only(exchange: &impl Exchange) { .expect("Couldn't limit sell."); println!("{:?}", resp); - let price = get_current_price(exchange, "BNBBTC", 0.5).await; + let price = get_current_price(exchange, &market_pair, 0.8).await; let req = OpenLimitOrderRequest { client_order_id: None, price, size: Decimal::new(1, 1), - market_pair: String::from("BNBBTC"), + market_pair, post_only: true, time_in_force: TimeInForce::GoodTillCancelled, }; @@ -86,10 +90,11 @@ pub async fn post_only(exchange: &impl Exchange) { } pub async fn market_buy(exchange: &impl Exchange) { + let market_pair = MarketPair(Currency::ETH, Currency::BTC); let req = OpenMarketOrderRequest { client_order_id: None, size: Decimal::from_str("0.1").unwrap(), - market_pair: String::from("BNBBUSD"), + market_pair, }; let resp = exchange .market_buy(&req) @@ -99,10 +104,11 @@ pub async fn market_buy(exchange: &impl Exchange) { } pub async fn market_sell(exchange: &impl Exchange) { + let market_pair = MarketPair(Currency::ETH, Currency::BTC); let req = OpenMarketOrderRequest { client_order_id: None, size: Decimal::new(1, 1), - market_pair: String::from("BNBBTC"), + market_pair, }; let resp = exchange .market_sell(&req) @@ -112,12 +118,13 @@ pub async fn market_sell(exchange: &impl Exchange) { } pub async fn cancel_order(exchange: &impl Exchange) { - let price = get_current_price(exchange, "BNBBTC", 1.5).await; + let market_pair = MarketPair(Currency::ETH, Currency::BTC); + let price = get_current_price(exchange, &market_pair, 1.5).await; let req = OpenLimitOrderRequest { client_order_id: None, price, size: Decimal::from_str("1.0").unwrap(), - market_pair: String::from("BNBBTC"), + market_pair, post_only: false, time_in_force: TimeInForce::GoodTillCancelled, }; @@ -139,12 +146,13 @@ pub async fn cancel_order(exchange: &impl Exchange) { } pub async fn cancel_all_orders(exchange: &impl Exchange) { - let price = get_current_price(exchange, "BNBBTC", 1.5).await; + let market_pair = MarketPair(Currency::ETH, Currency::BTC); + let price = get_current_price(exchange, &market_pair, 1.5).await; let req = OpenLimitOrderRequest { client_order_id: None, price, size: Decimal::from_str("1.0").unwrap(), - market_pair: String::from("BNBBTC"), + market_pair, post_only: false, time_in_force: TimeInForce::GoodTillCancelled, }; @@ -158,9 +166,8 @@ pub async fn cancel_all_orders(exchange: &impl Exchange) { .await .expect("Couldn't limit sell."); - let req = CancelAllOrdersRequest { - market_pair: Some("BNBBTC".to_string()), - }; + let market_pair = Some(MarketPair(Currency::ETH, Currency::BTC)); + let req = CancelAllOrdersRequest { market_pair }; let resp = exchange .cancel_all_orders(&req) @@ -170,8 +177,10 @@ pub async fn cancel_all_orders(exchange: &impl Exchange) { } pub async fn get_order_history(exchange: &impl Exchange) { + let market_pair = MarketPair(Currency::ETH, Currency::BTC); + let market_pair = Some(market_pair); let req = GetOrderHistoryRequest { - market_pair: Some(String::from("BNBBTC")), + market_pair, order_status: None, paginator: None, }; @@ -183,19 +192,21 @@ pub async fn get_order_history(exchange: &impl Exchange) { println!("{:?}", resp); } -async fn get_price(exchange: &impl Exchange, pair: &str) -> Decimal { - let get_price_ticker_request = GetPriceTickerRequest { market_pair: pair.to_string() }; +async fn get_price(exchange: &impl Exchange, market_pair: &MarketPair) -> Decimal { + let market_pair = market_pair.clone(); + let get_price_ticker_request = GetPriceTickerRequest { market_pair }; let ticker = exchange.get_price_ticker(&get_price_ticker_request).await.expect("Couldn't get ticker."); ticker.price.expect("Couldn't get price.") } pub async fn get_all_open_orders(exchange: &impl Exchange) { - let price = get_price(exchange, "BNBBTC").await; + let market_pair = MarketPair(Currency::ETH, Currency::BTC); + let price = get_price(exchange, &market_pair).await; let req = OpenLimitOrderRequest { client_order_id: None, price, size: Decimal::new(1, 1), - market_pair: String::from("BNBBTC"), + market_pair, post_only: false, time_in_force: TimeInForce::GoodTillCancelled, }; @@ -220,10 +231,9 @@ pub async fn get_account_balances(exchange: &impl Exchange) { } pub async fn get_trade_history(exchange: &impl Exchange) { - let req = TradeHistoryRequest { - market_pair: Some("BNBBTC".to_string()), - ..Default::default() - }; + let market_pair = MarketPair(Currency::ETH, Currency::BTC); + let market_pair = Some(market_pair); + let req = TradeHistoryRequest { market_pair, ..Default::default() }; let resp = exchange .get_trade_history(&req) diff --git a/tests/template/callbacks.rs b/tests/template/callbacks.rs index e6bf871..6026fc2 100644 --- a/tests/template/callbacks.rs +++ b/tests/template/callbacks.rs @@ -2,27 +2,31 @@ use std::sync::mpsc::sync_channel; use openlimits::model::websocket::Subscription; use openlimits::exchange::traits::stream::ExchangeWs; +use openlimits_exchange::model::market_pair::MarketPair; +use openlimits::model::currency::Currency; async fn test_subscription_callback(websocket: &impl ExchangeWs, sub: Subscription) { let (tx, rx) = sync_channel(0); websocket .subscribe(sub, move |m| { - m.as_ref().expect("Couldn't get response."); - tx.send(()).expect("Couldn't send sync message."); + m.as_ref().expect("Failed to get response."); + tx.send(()).expect("Failed to send sync message."); }) .await - .expect("Couldn't subscribe."); + .expect("Failed to subscribe."); - rx.recv().expect("Couldn't receive sync message."); + rx.recv().expect("Failed to receive sync message."); } pub async fn orderbook(ws: &impl ExchangeWs) { - let sub = Subscription::OrderBookUpdates("bnbbtc".to_string()); + let market = MarketPair(Currency::ETH, Currency::BTC); + let sub = Subscription::OrderBookUpdates(market); test_subscription_callback(ws, sub).await; } pub async fn trades(ws: &impl ExchangeWs) { - let sub = Subscription::Trades("btcusdt".to_string()); + let market = MarketPair(Currency::ETH, Currency::BTC); + let sub = Subscription::Trades(market); test_subscription_callback(ws, sub).await; } diff --git a/tests/template/market.rs b/tests/template/market.rs index ad4e075..ff91713 100644 --- a/tests/template/market.rs +++ b/tests/template/market.rs @@ -2,11 +2,12 @@ use openlimits::{ prelude::*, model::{GetHistoricRatesRequest, GetPriceTickerRequest, Interval, OrderBookRequest}, }; +use openlimits_exchange::model::market_pair::MarketPair; +use openlimits_exchange::model::currency::Currency; pub async fn order_book(exchange: &impl Exchange) { - let req = OrderBookRequest { - market_pair: "BNBBTC".to_string(), - }; + let market_pair = MarketPair(Currency::ETH, Currency::BTC); + let req = OrderBookRequest { market_pair }; let _response = exchange .order_book(&req) .await @@ -14,9 +15,8 @@ pub async fn order_book(exchange: &impl Exchange) { } pub async fn get_price_ticker(exchange: &impl Exchange) { - let req = GetPriceTickerRequest { - market_pair: "BNBBTC".to_string(), - }; + let market_pair = MarketPair(Currency::ETH, Currency::BTC); + let req = GetPriceTickerRequest { market_pair }; let _response = exchange .get_price_ticker(&req) .await @@ -24,8 +24,9 @@ pub async fn get_price_ticker(exchange: &impl Exchange) { } pub async fn get_historic_rates(exchange: &impl Exchange) { + let market_pair = MarketPair(Currency::ETH, Currency::BTC); let req = GetHistoricRatesRequest { - market_pair: "BNBBTC".to_string(), + market_pair, interval: Interval::OneHour, paginator: None, }; @@ -36,8 +37,9 @@ pub async fn get_historic_rates(exchange: &impl Exchange) { } pub async fn pair(exchange: &impl Exchange) { + let market_pair = MarketPair(Currency::ETH, Currency::BTC); let _response = exchange - .get_pair("BTCUSDT") + .get_pair(&market_pair) .await .expect("Couldn't get pair."); } \ No newline at end of file diff --git a/tests/template/streams.rs b/tests/template/streams.rs index beb1705..2b03c85 100644 --- a/tests/template/streams.rs +++ b/tests/template/streams.rs @@ -2,10 +2,13 @@ use futures::stream::StreamExt; use openlimits::model::websocket::Subscription; use openlimits::exchange::traits::stream::ExchangeWs; +use openlimits_exchange::model::market_pair::MarketPair; +use openlimits::exchange::model::currency::Currency; pub async fn orderbook(ws: &impl ExchangeWs) { + let market_pair = MarketPair(Currency::ETH, Currency::BTC); let s = ws - .create_stream(&[Subscription::OrderBookUpdates("bnbbtc".to_string())]) + .create_stream(&[Subscription::OrderBookUpdates(market_pair)]) .await; let ob = s.expect("Couldn't create stream.").next().await; @@ -14,11 +17,14 @@ pub async fn orderbook(ws: &impl ExchangeWs) { } pub async fn trades(ws: &impl ExchangeWs) { - let s = ws - .create_stream(&[Subscription::Trades("bnbbtc".to_string())]) - .await; - - let trades = s.expect("Couldn't create stream.").next().await; + let market_pair = MarketPair(Currency::ETH, Currency::BTC); + let mut s = ws + .create_stream(&[Subscription::Trades(market_pair)]) + .await + .expect("Couldn't create stream."); + let trades = s.next().await; + print!("{:?}", trades); + let trades = s.next().await; print!("{:?}", trades); } From c0ada3ff7da4c1570913ecb352d50704b85f9713 Mon Sep 17 00:00:00 2001 From: Danilo Guanabara Date: Sat, 6 Nov 2021 08:50:48 -0300 Subject: [PATCH 20/23] openlimits-exchange impl --- Cargo.toml | 8 ++- src/exchange/mod.rs | 2 +- src/exchange/nash/mod.rs | 24 +++++--- src/exchange/nash/nash_websocket.rs | 5 +- .../nash/subscription_request_wrapper.rs | 0 .../nash/subscription_response_wrapper.rs | 30 ---------- src/exchange/nash/subscription_wrapper.rs | 57 +++++++++++++++++++ 7 files changed, 80 insertions(+), 46 deletions(-) create mode 100644 src/exchange/nash/subscription_request_wrapper.rs create mode 100644 src/exchange/nash/subscription_wrapper.rs diff --git a/Cargo.toml b/Cargo.toml index 72b92e4..75b369d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,9 +16,9 @@ path = "examples/rust/orderbook.rs" [features] bindings = ["ligen", "ligen-macro", "ligen-csharp"] -#default = ["rust_gmp"] -#rust_gmp = ["nash-protocol/rust_gmp", "nash-native-client/rust_gmp"] -#num_bigint = ["nash-protocol/num_bigint", "nash-native-client/num_bigint"] +default = ["rust_gmp"] +rust_gmp = ["nash-protocol/rust_gmp", "nash-native-client/rust_gmp"] +num_bigint = ["nash-protocol/num_bigint", "nash-native-client/num_bigint"] [dependencies] async-trait = "0.1" @@ -46,6 +46,8 @@ url = "2.1.1" derive_more = "0.99" #nash-protocol = { version = "0.1", default-features = false, features = ["rustcrypto"] } #nash-native-client = { version = "0.1", default-features = false, features = ["rustcrypto"] } +nash-protocol = { path = "../nash-rust/nash-protocol", default-features = false, features = ["rustcrypto"] } +nash-native-client = { path = "../nash-rust/nash-native-client", default-features = false, features = ["rustcrypto"] } pyo3 = { version = "0.12.3", optional = true } openlimits-binance = { path = "crates/openlimits-binance" } openlimits-exchange = { path = "crates/openlimits-exchange" } diff --git a/src/exchange/mod.rs b/src/exchange/mod.rs index 2815e9a..1e9eda2 100644 --- a/src/exchange/mod.rs +++ b/src/exchange/mod.rs @@ -2,7 +2,7 @@ pub use openlimits_binance as binance; pub mod coinbase; -// pub mod nash; +pub mod nash; pub use openlimits_exchange::traits; pub use openlimits_exchange::shared; pub use openlimits_exchange::model; diff --git a/src/exchange/nash/mod.rs b/src/exchange/nash/mod.rs index 78720e6..7d5899f 100644 --- a/src/exchange/nash/mod.rs +++ b/src/exchange/nash/mod.rs @@ -4,13 +4,13 @@ mod nash_credentials; mod nash_parameters; mod nash_websocket; -mod subscription_response_wrapper; +mod subscription_wrapper; mod utils; pub use nash_credentials::NashCredentials; pub use nash_parameters::NashParameters; pub use nash_websocket::NashWebsocket; -pub use subscription_response_wrapper::SubscriptionResponseWrapper; +pub use subscription_wrapper::*; pub use utils::client_from_params_failable; pub use super::shared; @@ -34,8 +34,9 @@ use openlimits_exchange::traits::info::ExchangeInfoRetrieval; use openlimits_exchange::traits::Exchange; use openlimits_exchange::traits::ExchangeMarketData; use openlimits_exchange::traits::ExchangeAccount; -use openlimits_exchange::traits::info::MarketPair; +use openlimits_exchange::traits::info::MarketPairInfo; use openlimits_exchange::traits::info::MarketPairHandle; +use crate::model::market_pair::MarketPair; /// This struct is the main struct of this module and it is used for communications with the nash openlimits-exchange pub struct Nash { @@ -286,13 +287,15 @@ impl Nash { req: &OpenLimitOrderRequest, buy_or_sell: nash_protocol::types::BuyOrSell, ) -> nash_protocol::protocol::place_order::LimitOrderRequest { + let market = req.market_pair.clone(); + let market = nash_protocol::types::market_pair::MarketPair::from(market).0; nash_protocol::protocol::place_order::LimitOrderRequest { client_order_id: req.client_order_id.clone(), cancellation_policy: nash_protocol::types::OrderCancellationPolicy::from( req.time_in_force, ), allow_taker: !req.post_only, - market: req.market_pair.clone(), + market, buy_or_sell, amount: format!("{}", req.size), price: format!("{}", req.price), @@ -302,9 +305,11 @@ impl Nash { pub fn convert_market_request( req: &OpenMarketOrderRequest, ) -> nash_protocol::protocol::place_order::MarketOrderRequest { + let market = req.market_pair.clone(); + let market = nash_protocol::types::market_pair::MarketPair::from(market).0; nash_protocol::protocol::place_order::MarketOrderRequest { client_order_id: req.client_order_id.clone(), - market: req.market_pair.clone(), + market, amount: format!("{}", req.size), } } @@ -328,13 +333,13 @@ impl Nash { #[async_trait] impl ExchangeInfoRetrieval for Nash { - async fn retrieve_pairs(&self) -> Result> { + async fn retrieve_pairs(&self) -> Result> { Ok(self .list_markets() .await? .markets .iter() - .map(|(symbol, v)| MarketPair { + .map(|(symbol, v)| MarketPairInfo { symbol: symbol.to_string(), base: v.asset_a.asset.name().to_string(), quote: v.asset_b.asset.name().to_string(), @@ -358,7 +363,8 @@ impl ExchangeInfoRetrieval for Nash { .await } - async fn get_pair(&self, name: &str) -> Result { - self.exchange_info.get_pair(name) + async fn get_pair(&self, name: &MarketPair) -> Result { + let name = nash_protocol::types::market_pair::MarketPair::from(name.clone()).0; + self.exchange_info.get_pair(&name) } } diff --git a/src/exchange/nash/nash_websocket.rs b/src/exchange/nash/nash_websocket.rs index d879119..5fd80f6 100644 --- a/src/exchange/nash/nash_websocket.rs +++ b/src/exchange/nash/nash_websocket.rs @@ -2,12 +2,11 @@ use std::{pin::Pin, task::Context, task::Poll}; use async_trait::async_trait; use futures::stream::{BoxStream, SelectAll, Stream, StreamExt}; pub use nash_native_client::{Client, Environment}; -use nash_protocol::protocol::subscriptions::SubscriptionRequest; use nash_protocol::protocol::ResponseOrError; use crate::errors::OpenLimitsError; use crate::exchange::traits::stream::{ExchangeWs, Subscriptions}; use super::NashParameters; -use super::SubscriptionResponseWrapper; +use super::{SubscriptionRequestWrapper, SubscriptionResponseWrapper}; use super::utils::*; use super::shared::Result; @@ -31,7 +30,7 @@ impl Stream for NashWebsocket { impl ExchangeWs for NashWebsocket { type InitParams = NashParameters; - type Subscription = SubscriptionRequest; + type Subscription = SubscriptionRequestWrapper; type Response = SubscriptionResponseWrapper; async fn new(params: Self::InitParams) -> Result { diff --git a/src/exchange/nash/subscription_request_wrapper.rs b/src/exchange/nash/subscription_request_wrapper.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/exchange/nash/subscription_response_wrapper.rs b/src/exchange/nash/subscription_response_wrapper.rs index 25e0e83..e69de29 100644 --- a/src/exchange/nash/subscription_response_wrapper.rs +++ b/src/exchange/nash/subscription_response_wrapper.rs @@ -1,30 +0,0 @@ -pub use nash_native_client::{Client, Environment}; -use nash_protocol::protocol::subscriptions::SubscriptionResponse; - -#[derive(Debug)] -pub struct SubscriptionResponseWrapper(pub SubscriptionResponse); - -impl Clone for SubscriptionResponseWrapper { - fn clone(&self) -> Self { - match &self.0 { - SubscriptionResponse::Orderbook(o) => { - SubscriptionResponseWrapper(SubscriptionResponse::Orderbook(o.clone())) - } - SubscriptionResponse::Trades(t) => { - SubscriptionResponseWrapper(SubscriptionResponse::Trades(t.clone())) - } - SubscriptionResponse::Ticker(ticker) => { - SubscriptionResponseWrapper(SubscriptionResponse::Ticker(ticker.clone())) - } - SubscriptionResponse::AccountBalances(balances) => { - SubscriptionResponseWrapper(SubscriptionResponse::AccountBalances(balances.clone())) - } - SubscriptionResponse::AccountOrders(orders) => { - SubscriptionResponseWrapper(SubscriptionResponse::AccountOrders(orders.clone())) - } - SubscriptionResponse::AccountTrades(trades) => { - SubscriptionResponseWrapper(SubscriptionResponse::AccountTrades(trades.clone())) - } - } - } -} \ No newline at end of file diff --git a/src/exchange/nash/subscription_wrapper.rs b/src/exchange/nash/subscription_wrapper.rs new file mode 100644 index 0000000..37579fe --- /dev/null +++ b/src/exchange/nash/subscription_wrapper.rs @@ -0,0 +1,57 @@ +use nash_protocol::protocol::subscriptions::{SubscriptionRequest, SubscriptionResponse}; +use openlimits_exchange::model::websocket::Subscription; +use nash_protocol::protocol::subscriptions::trades::SubscribeTrades; +use nash_protocol::protocol::subscriptions::updated_orderbook::SubscribeOrderbook; +use nash_protocol::types::market_pair::MarketPair; +use crate::model::websocket::{WebSocketResponse, OpenLimitsWebSocketMessage}; +use std::convert::TryFrom; +use crate::errors::*; + +#[derive(Clone, Debug)] +pub struct SubscriptionRequestWrapper(pub SubscriptionRequest); + +#[derive(Clone, Debug)] +pub struct SubscriptionResponseWrapper(pub SubscriptionResponse); + +impl TryFrom for SubscriptionRequestWrapper { + type Error = OpenLimitsError; + fn try_from(from: Subscription) -> Result { + Ok(match from { + Subscription::Trades(market) => { + let market = MarketPair::from(market).0; + let request = SubscriptionRequest::Trades(SubscribeTrades { market }); + Self(request) + }, + Subscription::OrderBookUpdates(market) => { + let market = MarketPair::from(market).0; + let request = SubscriptionRequest::Orderbook(SubscribeOrderbook { market }); + Self(request) + } + }) + } +} +// +// impl TryFrom> for SubscriptionResponseWrapper { +// type Error = OpenLimitsError; +// fn try_from(from: WebSocketResponse) -> Result { +// match from { +// WebSocketResponse::Generic(message) => { +// OpenLimitsWebSocketMessage::Trades(trades) => { +// +// }, +// OpenLimitsWebSocketMessage::OrderBook(orderbook) => { +// +// }, +// OpenLimitsWebSocketMessage::OrderBookDiff(orderbook_diff) => { +// +// }, +// OpenLimitsWebSocketMessage::Ping => { +// +// } +// }, +// WebSocketResponse::Raw() +// } +// let response = SubscriptionResponse::Orderbook() +// Self(response) +// } +// } \ No newline at end of file From bd7ebe9688d0237c0edeafb56eaddc3660c30627 Mon Sep 17 00:00:00 2001 From: Danilo Guanabara Date: Thu, 11 Nov 2021 17:04:34 -0300 Subject: [PATCH 21/23] All tests are passing --- .../src/client/websocket.rs | 4 +- .../src/model/market_pair.rs | 8 +- src/exchange/nash/mod.rs | 20 +- src/exchange/nash/nash_credentials.rs | 4 +- src/exchange/nash/nash_parameters.rs | 27 +- src/exchange/nash/nash_websocket.rs | 9 +- .../nash/subscription_request_wrapper.rs | 0 .../nash/subscription_response_wrapper.rs | 0 src/exchange/nash/subscription_wrapper.rs | 57 ---- src/exchange/nash/utils.rs | 8 +- tests/exchange/websocket.rs | 2 +- tests/mod.rs | 3 +- tests/nash/account.rs | 281 ++---------------- tests/nash/callbacks.rs | 12 + tests/nash/client.rs | 40 +++ tests/nash/market.rs | 102 +------ tests/nash/mod.rs | 4 +- tests/nash/streams.rs | 12 + tests/old_nash_tests/account.rs | 279 +++++++++++++++++ tests/old_nash_tests/market.rs | 110 +++++++ tests/old_nash_tests/mod.rs | 3 + tests/{nash => old_nash_tests}/websocket.rs | 0 tests/template/account.rs | 10 +- tests/template/callbacks.rs | 3 +- tests/template/market.rs | 3 +- tests/template/streams.rs | 6 +- 26 files changed, 567 insertions(+), 440 deletions(-) delete mode 100644 src/exchange/nash/subscription_request_wrapper.rs delete mode 100644 src/exchange/nash/subscription_response_wrapper.rs delete mode 100644 src/exchange/nash/subscription_wrapper.rs create mode 100644 tests/nash/callbacks.rs create mode 100644 tests/nash/client.rs create mode 100644 tests/nash/streams.rs create mode 100644 tests/old_nash_tests/account.rs create mode 100644 tests/old_nash_tests/market.rs create mode 100644 tests/old_nash_tests/mod.rs rename tests/{nash => old_nash_tests}/websocket.rs (100%) diff --git a/crates/openlimits-binance/src/client/websocket.rs b/crates/openlimits-binance/src/client/websocket.rs index 17fe25f..30026c7 100644 --- a/crates/openlimits-binance/src/client/websocket.rs +++ b/crates/openlimits-binance/src/client/websocket.rs @@ -7,11 +7,11 @@ use serde_json::Value; use tokio::sync::mpsc::{unbounded_channel, UnboundedSender}; use tokio_tungstenite::{connect_async, tungstenite::protocol::Message}; use openlimits_exchange::errors::OpenLimitsError; -pub use crate::{ +use crate::{ BinanceParameters, model::websocket::{BinanceSubscription, BinanceWebsocketMessage}, }; -pub use openlimits_exchange::{ +use openlimits_exchange::{ model::websocket::OpenLimitsWebSocketMessage, model::websocket::Subscription, model::websocket::WebSocketResponse, diff --git a/crates/openlimits-exchange/src/model/market_pair.rs b/crates/openlimits-exchange/src/model/market_pair.rs index b636819..9b14337 100644 --- a/crates/openlimits-exchange/src/model/market_pair.rs +++ b/crates/openlimits-exchange/src/model/market_pair.rs @@ -3,4 +3,10 @@ pub use crate::model::currency::Currency; #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Hash)] #[allow(missing_docs)] -pub struct MarketPair(pub Currency, pub Currency); \ No newline at end of file +pub struct MarketPair(pub Currency, pub Currency); + +impl MarketPair { + pub fn inverse(&self) -> MarketPair { + MarketPair(self.1.clone(), self.0.clone()) + } +} \ No newline at end of file diff --git a/src/exchange/nash/mod.rs b/src/exchange/nash/mod.rs index 7d5899f..8f08f61 100644 --- a/src/exchange/nash/mod.rs +++ b/src/exchange/nash/mod.rs @@ -4,13 +4,11 @@ mod nash_credentials; mod nash_parameters; mod nash_websocket; -mod subscription_wrapper; mod utils; pub use nash_credentials::NashCredentials; pub use nash_parameters::NashParameters; pub use nash_websocket::NashWebsocket; -pub use subscription_wrapper::*; pub use utils::client_from_params_failable; pub use super::shared; @@ -37,6 +35,7 @@ use openlimits_exchange::traits::ExchangeAccount; use openlimits_exchange::traits::info::MarketPairInfo; use openlimits_exchange::traits::info::MarketPairHandle; use crate::model::market_pair::MarketPair; +use openlimits_exchange::MissingImplementationContent; /// This struct is the main struct of this module and it is used for communications with the nash openlimits-exchange pub struct Nash { @@ -50,10 +49,12 @@ impl Exchange for Nash { type InnerClient = Client; async fn new(params: Self::InitParams) -> Result { - Ok(Self { + let nash = Self { exchange_info: ExchangeInfo::new(), transport: client_from_params_failable(params).await?, - }) + }; + nash.refresh_market_info().await.ok(); + Ok(nash) } fn inner_client(&self) -> Option<&Self::InnerClient> { @@ -244,7 +245,7 @@ impl ExchangeAccount for Nash { async fn market_sell(&self, req: &OpenMarketOrderRequest) -> Result { let req: nash_protocol::protocol::place_order::MarketOrderRequest = Nash::convert_market_request(req); - + println!("{:#?}", req); let resp = self.transport.run_http(req).await; Ok( Nash::unwrap_response::( @@ -254,8 +255,9 @@ impl ExchangeAccount for Nash { ) } - async fn market_buy(&self, _: &OpenMarketOrderRequest) -> Result { - unimplemented!("Market buys are not supported by nash. A market buy can be simulated by placing a market sell in the inverse market. Market buy in btc_usdc should be translated to a market sell in usdc_btc.") + async fn market_buy(&self, _req: &OpenMarketOrderRequest) -> Result { + let message = "Nash client doesn't implement market_buy".into(); + Err(OpenLimitsError::MissingImplementation(MissingImplementationContent { message })) } async fn get_order(&self, req: &GetOrderRequest) -> Result { @@ -291,9 +293,7 @@ impl Nash { let market = nash_protocol::types::market_pair::MarketPair::from(market).0; nash_protocol::protocol::place_order::LimitOrderRequest { client_order_id: req.client_order_id.clone(), - cancellation_policy: nash_protocol::types::OrderCancellationPolicy::from( - req.time_in_force, - ), + cancellation_policy: req.time_in_force.into(), allow_taker: !req.post_only, market, buy_or_sell, diff --git a/src/exchange/nash/nash_credentials.rs b/src/exchange/nash/nash_credentials.rs index f42653a..39e0f67 100644 --- a/src/exchange/nash/nash_credentials.rs +++ b/src/exchange/nash/nash_credentials.rs @@ -1,6 +1,6 @@ /// This structure represents the Nash account credentials #[derive(Clone)] pub struct NashCredentials { - pub secret: String, - pub session: String, + pub api_secret: String, + pub api_key: String, } \ No newline at end of file diff --git a/src/exchange/nash/nash_parameters.rs b/src/exchange/nash/nash_parameters.rs index 3ac62ef..2d3b6e5 100644 --- a/src/exchange/nash/nash_parameters.rs +++ b/src/exchange/nash/nash_parameters.rs @@ -1,6 +1,7 @@ use tokio::time::Duration; -pub use nash_native_client::{Client, Environment}; +pub use nash_native_client::Client; use super::NashCredentials; +use openlimits_exchange::exchange::Environment; /// This struct represents the parameters #[derive(Clone)] @@ -12,3 +13,27 @@ pub struct NashParameters { pub timeout: Duration, pub sign_states_loop_interval: Option, } + +impl NashParameters { + pub fn production() -> Self { + Self { + affiliate_code: None, + credentials: None, + client_id: 1, + environment: Environment::Production, + timeout: Duration::new(10, 0), + sign_states_loop_interval: None + } + } + + pub fn sandbox() -> Self { + Self { + affiliate_code: None, + credentials: None, + client_id: 1, + environment: Environment::Sandbox, + timeout: Duration::new(10, 0), + sign_states_loop_interval: None + } + } +} diff --git a/src/exchange/nash/nash_websocket.rs b/src/exchange/nash/nash_websocket.rs index 5fd80f6..d51dcce 100644 --- a/src/exchange/nash/nash_websocket.rs +++ b/src/exchange/nash/nash_websocket.rs @@ -6,9 +6,9 @@ use nash_protocol::protocol::ResponseOrError; use crate::errors::OpenLimitsError; use crate::exchange::traits::stream::{ExchangeWs, Subscriptions}; use super::NashParameters; -use super::{SubscriptionRequestWrapper, SubscriptionResponseWrapper}; use super::utils::*; use super::shared::Result; +use nash_protocol::protocol::subscriptions::{SubscriptionRequest, SubscriptionResponse}; /// This struct represents a websocket connection pub struct NashWebsocket { @@ -29,9 +29,8 @@ impl Stream for NashWebsocket { #[async_trait] impl ExchangeWs for NashWebsocket { type InitParams = NashParameters; - - type Subscription = SubscriptionRequestWrapper; - type Response = SubscriptionResponseWrapper; + type Subscription = SubscriptionRequest; + type Response = SubscriptionResponse; async fn new(params: Self::InitParams) -> Result { Ok(Self { @@ -56,7 +55,7 @@ impl ExchangeWs for NashWebsocket { let s = streams.map(|message| match message { Ok(msg) => match msg { - ResponseOrError::Response(resp) => Ok(SubscriptionResponseWrapper(resp.data)), + ResponseOrError::Response(resp) => Ok(resp.data), ResponseOrError::Error(resp) => { let f = resp .errors diff --git a/src/exchange/nash/subscription_request_wrapper.rs b/src/exchange/nash/subscription_request_wrapper.rs deleted file mode 100644 index e69de29..0000000 diff --git a/src/exchange/nash/subscription_response_wrapper.rs b/src/exchange/nash/subscription_response_wrapper.rs deleted file mode 100644 index e69de29..0000000 diff --git a/src/exchange/nash/subscription_wrapper.rs b/src/exchange/nash/subscription_wrapper.rs deleted file mode 100644 index 37579fe..0000000 --- a/src/exchange/nash/subscription_wrapper.rs +++ /dev/null @@ -1,57 +0,0 @@ -use nash_protocol::protocol::subscriptions::{SubscriptionRequest, SubscriptionResponse}; -use openlimits_exchange::model::websocket::Subscription; -use nash_protocol::protocol::subscriptions::trades::SubscribeTrades; -use nash_protocol::protocol::subscriptions::updated_orderbook::SubscribeOrderbook; -use nash_protocol::types::market_pair::MarketPair; -use crate::model::websocket::{WebSocketResponse, OpenLimitsWebSocketMessage}; -use std::convert::TryFrom; -use crate::errors::*; - -#[derive(Clone, Debug)] -pub struct SubscriptionRequestWrapper(pub SubscriptionRequest); - -#[derive(Clone, Debug)] -pub struct SubscriptionResponseWrapper(pub SubscriptionResponse); - -impl TryFrom for SubscriptionRequestWrapper { - type Error = OpenLimitsError; - fn try_from(from: Subscription) -> Result { - Ok(match from { - Subscription::Trades(market) => { - let market = MarketPair::from(market).0; - let request = SubscriptionRequest::Trades(SubscribeTrades { market }); - Self(request) - }, - Subscription::OrderBookUpdates(market) => { - let market = MarketPair::from(market).0; - let request = SubscriptionRequest::Orderbook(SubscribeOrderbook { market }); - Self(request) - } - }) - } -} -// -// impl TryFrom> for SubscriptionResponseWrapper { -// type Error = OpenLimitsError; -// fn try_from(from: WebSocketResponse) -> Result { -// match from { -// WebSocketResponse::Generic(message) => { -// OpenLimitsWebSocketMessage::Trades(trades) => { -// -// }, -// OpenLimitsWebSocketMessage::OrderBook(orderbook) => { -// -// }, -// OpenLimitsWebSocketMessage::OrderBookDiff(orderbook_diff) => { -// -// }, -// OpenLimitsWebSocketMessage::Ping => { -// -// } -// }, -// WebSocketResponse::Raw() -// } -// let response = SubscriptionResponse::Orderbook() -// Self(response) -// } -// } \ No newline at end of file diff --git a/src/exchange/nash/utils.rs b/src/exchange/nash/utils.rs index 788d040..17712ed 100644 --- a/src/exchange/nash/utils.rs +++ b/src/exchange/nash/utils.rs @@ -6,12 +6,12 @@ pub async fn client_from_params_failable(params: NashParameters) -> Result { Client::from_keys( - &credentials.secret, - &credentials.session, + &credentials.api_secret, + &credentials.api_key, params.affiliate_code, false, params.client_id, - params.environment, + params.environment.into(), params.timeout, ) .await? @@ -22,7 +22,7 @@ pub async fn client_from_params_failable(params: NashParameters) -> Result Nash { - dotenv().ok(); - - let parameters = NashParameters { - affiliate_code: None, - credentials: Some(NashCredentials { - secret: env::var("NASH_API_SECRET").expect("Couldn't get environment variable."), - session: env::var("NASH_API_KEY").expect("Couldn't get environment variable."), - }), - environment: Environment::Sandbox, - client_id: 1, - timeout: NativeDuration::new(10, 0), - sign_states_loop_interval: None, - }; - - OpenLimits::instantiate(parameters) - .await - .expect("Failed to create Client") + account::get_trade_history(&init().await).await; } diff --git a/tests/nash/callbacks.rs b/tests/nash/callbacks.rs new file mode 100644 index 0000000..f96142b --- /dev/null +++ b/tests/nash/callbacks.rs @@ -0,0 +1,12 @@ +use crate::template::callbacks; +use super::client::init_ws as init; + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn orderbook() { + callbacks::orderbook(&init().await).await; +} + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn trades() { + callbacks::trades(&init().await).await; +} \ No newline at end of file diff --git a/tests/nash/client.rs b/tests/nash/client.rs new file mode 100644 index 0000000..bc3486e --- /dev/null +++ b/tests/nash/client.rs @@ -0,0 +1,40 @@ +use dotenv::dotenv; +use openlimits::{ + exchange::nash::{Nash, NashParameters, NashWebsocket, NashCredentials}, + OpenLimits, +}; +use openlimits::prelude::*; +use openlimits_exchange::exchange::Environment; +use std::time::Duration; + +pub async fn init_ws() -> NashWebsocket { + NashWebsocket::new(NashParameters::production()) + .await + .expect("Failed to create Binance stream.") +} + +pub async fn init() -> Nash { + Nash::new(NashParameters::sandbox()) + .await + .expect("Failed to create Client") +} + +pub async fn init_signed() -> Nash { + dotenv().ok(); + + let parameters = NashParameters { + credentials: Some(NashCredentials { + api_key: std::env::var("NASH_API_KEY").expect("Couldn't get environment variable."), + api_secret: std::env::var("NASH_API_SECRET").expect("Couldn't get environment variable."), + }), + environment: Environment::Sandbox, + affiliate_code: None, + client_id: 1, + sign_states_loop_interval: None, + timeout: Duration::new(10, 0) + }; + + OpenLimits::instantiate(parameters) + .await + .expect("Failed to create Client") +} \ No newline at end of file diff --git a/tests/nash/market.rs b/tests/nash/market.rs index 1548420..561dfac 100644 --- a/tests/nash/market.rs +++ b/tests/nash/market.rs @@ -1,110 +1,22 @@ -use nash_native_client::Environment; -use openlimits::{ - OpenLimits, - prelude::*, - model::GetHistoricTradesRequest, - model::Paginator, - model::{GetHistoricRatesRequest, GetPriceTickerRequest, Interval, OrderBookRequest}, - exchange::nash::Nash, - exchange::nash::NashCredentials, - exchange::nash::NashParameters, -}; - -use dotenv::dotenv; -use std::env; -use tokio::time::Duration; +use crate::template::market; +use super::client::init; #[tokio::test] async fn order_book() { - let exchange = init().await; - let req = OrderBookRequest { - market_pair: "eth_btc".to_string(), - }; - let _response = exchange - .order_book(&req) - .await - .expect("Couldn't get order book."); + market::order_book(&init().await).await; } #[tokio::test] async fn get_price_ticker() { - let exchange = init().await; - let req = GetPriceTickerRequest { - market_pair: "eth_btc".to_string(), - }; - let _response = exchange - .get_price_ticker(&req) - .await - .expect("Couldn't get price ticker."); + market::get_price_ticker(&init().await).await; } #[tokio::test] async fn get_historic_rates() { - let exchange = init().await; - let req = GetHistoricRatesRequest { - market_pair: "eth_btc".to_string(), - interval: Interval::OneHour, - paginator: None, - }; - let _response = exchange - .get_historic_rates(&req) - .await - .expect("Couldn't get historic rates."); + market::get_historic_rates(&init().await).await; } #[tokio::test] -async fn get_historic_trades() { - let exchange = init().await; - let req = GetHistoricTradesRequest { - market_pair: "eth_btc".to_string(), - paginator: Some(Paginator { - limit: Some(100), - ..Default::default() - }), - }; - let _response = exchange - .get_historic_trades(&req) - .await - .expect("Couldn't get historic trades."); -} - -#[tokio::test] -async fn retrieve_pairs() { - let exchange = init().await; - let _response = exchange - .refresh_market_info() - .await - .expect("Couldn't get pairs."); -} - -// #[tokio::test] -// async fn get_historic_rates_invalid_interval() { -// let mut openlimits-exchange = init().await; -// let req = GetHistoricRatesRequest { -// market_pair: "eth_btc".to_string(), -// interval: Interval::TwoHours, -// paginator: None, -// }; -// let resp = openlimits-exchange.get_historic_rates(&req).await; -// assert!(resp.is_err()); -// } - -async fn init() -> Nash { - dotenv().ok(); - - let parameters = NashParameters { - affiliate_code: None, - credentials: Some(NashCredentials { - secret: env::var("NASH_API_SECRET").expect("Couldn't get environment variable."), - session: env::var("NASH_API_KEY").expect("Couldn't get environment variable."), - }), - environment: Environment::Sandbox, - client_id: 1, - timeout: Duration::new(10, 0), - sign_states_loop_interval: None, - }; - - OpenLimits::instantiate(parameters) - .await - .expect("Failed to create Client") +async fn pair() { + market::pair(&init().await).await; } diff --git a/tests/nash/mod.rs b/tests/nash/mod.rs index b66643a..7a50994 100644 --- a/tests/nash/mod.rs +++ b/tests/nash/mod.rs @@ -1,3 +1,5 @@ mod account; mod market; -mod websocket; +mod callbacks; +mod streams; +pub mod client; \ No newline at end of file diff --git a/tests/nash/streams.rs b/tests/nash/streams.rs new file mode 100644 index 0000000..88c9695 --- /dev/null +++ b/tests/nash/streams.rs @@ -0,0 +1,12 @@ +use crate::template::streams; +use super::client::init_ws as init; + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn orderbook() { + streams::orderbook(&init().await).await; +} + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn trades() { + streams::trades(&init().await).await; +} diff --git a/tests/old_nash_tests/account.rs b/tests/old_nash_tests/account.rs new file mode 100644 index 0000000..2b1deba --- /dev/null +++ b/tests/old_nash_tests/account.rs @@ -0,0 +1,279 @@ +use chrono::Duration; +use dotenv::dotenv; +use nash_native_client::Environment; +use openlimits::{ + OpenLimits, + prelude::*, + model::OpenMarketOrderRequest, + model::{ + CancelAllOrdersRequest, CancelOrderRequest, GetOrderHistoryRequest, OpenLimitOrderRequest, + TimeInForce, TradeHistoryRequest, + }, + exchange::nash::Nash, + exchange::nash::NashCredentials, + exchange::nash::NashParameters, +}; +use rust_decimal::prelude::{Decimal, FromStr}; +use std::env; +use std::time::Duration as NativeDuration; + +// FIXME: https://github.com/nash-io/openlimits/issues/157 +// #[tokio::test] +async fn _limit_buy() { + let exchange = init().await; + let req = OpenLimitOrderRequest { + client_order_id: None, + time_in_force: TimeInForce::GoodTillCancelled, + price: Decimal::from_str("100.46").expect("Couldn't parse string."), + size: Decimal::from_str("0.10000").expect("Couldn't parse string."), + market_pair: String::from("eth_usdc"), + post_only: false, + }; + let resp = exchange + .limit_buy(&req) + .await + .expect("Couldn't parse string."); + println!("{:?}", resp); +} + +// FIXME: https://github.com/nash-io/openlimits/issues/157 +// #[tokio::test] +async fn _limit_buy_ioc() { + let exchange = init().await; + let req = OpenLimitOrderRequest { + client_order_id: None, + time_in_force: TimeInForce::ImmediateOrCancelled, + price: Decimal::from_str("414.46").expect("Couldn't parse string."), + size: Decimal::from_str("0.10000").expect("Couldn't parse string."), + market_pair: String::from("eth_usdc"), + post_only: false, + }; + let resp = exchange + .limit_buy(&req) + .await + .expect("Couldn't request limit buy."); + println!("{:?}", resp); +} + +// FIXME: https://github.com/nash-io/openlimits/issues/157 +// #[tokio::test] +async fn _limit_buy_fok() { + let exchange = init().await; + let req = OpenLimitOrderRequest { + client_order_id: None, + time_in_force: TimeInForce::FillOrKill, + price: Decimal::from_str("414.46").expect("Couldn't parse string."), + size: Decimal::from_str("0.10000").expect("Couldn't parse string."), + market_pair: String::from("eth_usdc"), + post_only: false, + }; + let resp = exchange + .limit_buy(&req) + .await + .expect("Couldn't request limit buy."); + println!("{:?}", resp); +} + +#[tokio::test] +#[ignore] +async fn limit_buy_ggt() { + let exchange = init().await; + let req = OpenLimitOrderRequest { + client_order_id: None, + time_in_force: TimeInForce::GoodTillTime(Duration::hours(2)), + price: Decimal::from_str("414.46").expect("Couldn't parse string."), + size: Decimal::from_str("0.02000").expect("Couldn't parse string."), + market_pair: String::from("eth_usdc"), + post_only: false, + }; + let resp = exchange + .limit_buy(&req) + .await + .expect("Couldn't request limit buy."); + println!("{:?}", resp); +} + +// FIXME: https://github.com/nash-io/openlimits/issues/157 +// #[tokio::test] +async fn _market_buy() { + let exchange = init().await; + let req = OpenMarketOrderRequest { + client_order_id: None, + size: Decimal::from_str("10.0").expect("Couldn't parse string."), + market_pair: String::from("usdc_eth"), + }; + let resp = exchange + .market_sell(&req) + .await + .expect("Couldn't request market buy."); + println!("{:?}", resp); +} + +// FIXME: https://github.com/nash-io/openlimits/issues/157 +// #[tokio::test] +async fn _market_sell() { + let exchange = init().await; + let req = OpenMarketOrderRequest { + client_order_id: None, + size: Decimal::from_str("0.02").expect("Couldn't parse string."), + market_pair: String::from("eth_usdc"), + }; + let resp = exchange + .market_sell(&req) + .await + .expect("Couldn't request market buy."); + println!("{:?}", resp); +} + +// FIXME: https://github.com/nash-io/openlimits/issues/157 +// #[tokio::test] +async fn _limit_sell() { + let exchange = init().await; + let req = OpenLimitOrderRequest { + client_order_id: None, + time_in_force: TimeInForce::GoodTillTime(Duration::hours(2)), + price: Decimal::from_str("800.46").expect("Couldn't parse string."), + size: Decimal::from_str("0.02").expect("Couldn't parse string."), + market_pair: String::from("eth_usdc"), + post_only: false, + }; + let resp = exchange + .limit_sell(&req) + .await + .expect("Couldn't request limit sell."); + println!("{:?}", resp); +} + +// FIXME: https://github.com/nash-io/openlimits/issues/157 +// #[tokio::test] +async fn _cancel_order() { + let exchange = init().await; + let req = OpenLimitOrderRequest { + client_order_id: None, + time_in_force: TimeInForce::GoodTillCancelled, + price: Decimal::from_str("200.46").expect("Couldn't parse string."), + size: Decimal::from_str("0.0300").expect("Couldn't parse string."), + market_pair: String::from("eth_usdc"), + post_only: false, + }; + let order = exchange + .limit_buy(&req) + .await + .expect("Couldn't request limit buy."); + + let req = CancelOrderRequest { + id: order.id, + market_pair: Some(order.market_pair), + }; + let resp = exchange + .cancel_order(&req) + .await + .expect("Couldn't cancel order."); + println!("{:?}", resp); +} + +// FIXME: https://github.com/nash-io/openlimits/issues/157 +// #[tokio::test] +async fn _cancel_all_orders() { + let exchange = init().await; + let req = OpenLimitOrderRequest { + client_order_id: None, + time_in_force: TimeInForce::GoodTillCancelled, + price: Decimal::from_str("200.46").expect("Couldn't parse string."), + size: Decimal::from_str("0.10000").expect("Couldn't parse string."), + market_pair: String::from("eth_usdc"), + post_only: false, + }; + + exchange + .limit_sell(&req) + .await + .expect("Couldn't limit sell."); + + let req = CancelAllOrdersRequest { + market_pair: Some("eth_btc".to_string()), + }; + + let resp = exchange + .cancel_all_orders(&req) + .await + .expect("Couldn't cancel all orders."); + println!("{:?}", resp); +} + +#[tokio::test] +async fn get_order_history() { + let exchange = init().await; + let req = GetOrderHistoryRequest { + market_pair: Some(String::from("eth_btc")), + order_status: None, + paginator: None, + }; + + let resp = exchange + .get_order_history(&req) + .await + .expect("Couldn't get order history."); + println!("{:?}", resp); +} + +// #[tokio::test] +// async fn get_all_open_orders() { +// let mut openlimits-exchange = init().await; +// let req = OpenLimitOrderRequest { +// client_order_id: None, +// time_in_force: TimeInForce::GoodTillCancelled, +// price: Decimal::new(1, 1), +// size: Decimal::new(2, 2), +// market_pair: String::from("eth_btc"), +// }; +// openlimits-exchange.limit_sell(&req).await.expect("Couldn't limit sell."); + +// let resp = openlimits-exchange.get_all_open_orders().await.expect("Couldn't get all open orders."); +// println!("{:?}", resp); +// } + +#[tokio::test] +async fn get_account_balances() { + let exchange = init().await; + let resp = exchange + .get_account_balances(None) + .await + .expect("Couldn't get account balances."); + println!("{:?}", resp); +} + +#[tokio::test] +async fn get_trade_history() { + let exchange = init().await; + let req = TradeHistoryRequest { + market_pair: Some("eth_btc".to_string()), + ..Default::default() + }; + + let resp = exchange + .get_trade_history(&req) + .await + .expect("Couldn't get trade history."); + println!("{:?}", resp); +} + +async fn init() -> Nash { + dotenv().ok(); + + let parameters = NashParameters { + affiliate_code: None, + credentials: Some(NashCredentials { + secret: env::var("NASH_API_SECRET").expect("Couldn't get environment variable."), + session: env::var("NASH_API_KEY").expect("Couldn't get environment variable."), + }), + environment: Environment::Sandbox, + client_id: 1, + timeout: NativeDuration::new(10, 0), + sign_states_loop_interval: None, + }; + + OpenLimits::instantiate(parameters) + .await + .expect("Failed to create Client") +} diff --git a/tests/old_nash_tests/market.rs b/tests/old_nash_tests/market.rs new file mode 100644 index 0000000..1548420 --- /dev/null +++ b/tests/old_nash_tests/market.rs @@ -0,0 +1,110 @@ +use nash_native_client::Environment; +use openlimits::{ + OpenLimits, + prelude::*, + model::GetHistoricTradesRequest, + model::Paginator, + model::{GetHistoricRatesRequest, GetPriceTickerRequest, Interval, OrderBookRequest}, + exchange::nash::Nash, + exchange::nash::NashCredentials, + exchange::nash::NashParameters, +}; + +use dotenv::dotenv; +use std::env; +use tokio::time::Duration; + +#[tokio::test] +async fn order_book() { + let exchange = init().await; + let req = OrderBookRequest { + market_pair: "eth_btc".to_string(), + }; + let _response = exchange + .order_book(&req) + .await + .expect("Couldn't get order book."); +} + +#[tokio::test] +async fn get_price_ticker() { + let exchange = init().await; + let req = GetPriceTickerRequest { + market_pair: "eth_btc".to_string(), + }; + let _response = exchange + .get_price_ticker(&req) + .await + .expect("Couldn't get price ticker."); +} + +#[tokio::test] +async fn get_historic_rates() { + let exchange = init().await; + let req = GetHistoricRatesRequest { + market_pair: "eth_btc".to_string(), + interval: Interval::OneHour, + paginator: None, + }; + let _response = exchange + .get_historic_rates(&req) + .await + .expect("Couldn't get historic rates."); +} + +#[tokio::test] +async fn get_historic_trades() { + let exchange = init().await; + let req = GetHistoricTradesRequest { + market_pair: "eth_btc".to_string(), + paginator: Some(Paginator { + limit: Some(100), + ..Default::default() + }), + }; + let _response = exchange + .get_historic_trades(&req) + .await + .expect("Couldn't get historic trades."); +} + +#[tokio::test] +async fn retrieve_pairs() { + let exchange = init().await; + let _response = exchange + .refresh_market_info() + .await + .expect("Couldn't get pairs."); +} + +// #[tokio::test] +// async fn get_historic_rates_invalid_interval() { +// let mut openlimits-exchange = init().await; +// let req = GetHistoricRatesRequest { +// market_pair: "eth_btc".to_string(), +// interval: Interval::TwoHours, +// paginator: None, +// }; +// let resp = openlimits-exchange.get_historic_rates(&req).await; +// assert!(resp.is_err()); +// } + +async fn init() -> Nash { + dotenv().ok(); + + let parameters = NashParameters { + affiliate_code: None, + credentials: Some(NashCredentials { + secret: env::var("NASH_API_SECRET").expect("Couldn't get environment variable."), + session: env::var("NASH_API_KEY").expect("Couldn't get environment variable."), + }), + environment: Environment::Sandbox, + client_id: 1, + timeout: Duration::new(10, 0), + sign_states_loop_interval: None, + }; + + OpenLimits::instantiate(parameters) + .await + .expect("Failed to create Client") +} diff --git a/tests/old_nash_tests/mod.rs b/tests/old_nash_tests/mod.rs new file mode 100644 index 0000000..b66643a --- /dev/null +++ b/tests/old_nash_tests/mod.rs @@ -0,0 +1,3 @@ +mod account; +mod market; +mod websocket; diff --git a/tests/nash/websocket.rs b/tests/old_nash_tests/websocket.rs similarity index 100% rename from tests/nash/websocket.rs rename to tests/old_nash_tests/websocket.rs diff --git a/tests/template/account.rs b/tests/template/account.rs index 2da662e..d7b007a 100644 --- a/tests/template/account.rs +++ b/tests/template/account.rs @@ -14,11 +14,11 @@ use openlimits::model::currency::Currency; async fn get_current_price(exchange: &impl Exchange, market_pair: &MarketPair, multiplier: f32) -> Decimal { let market_pair = market_pair.clone(); - let ticket = exchange + let ticker = exchange .get_price_ticker(&GetPriceTickerRequest { market_pair }) .await - .unwrap(); - let price = ticket.price.unwrap(); + .expect("Failed to get price ticker."); + let price = ticker.price.unwrap_or(Decimal::from_f32(1.0).unwrap()); price * Decimal::from_f32(multiplier).unwrap() } @@ -28,7 +28,7 @@ pub async fn limit_buy(exchange: &impl Exchange) { let req = OpenLimitOrderRequest { client_order_id: None, price, - size: Decimal::new(1, 1), + size: Decimal::from_f32(0.1).unwrap(), market_pair, post_only: false, time_in_force: TimeInForce::GoodTillCancelled, @@ -196,7 +196,7 @@ async fn get_price(exchange: &impl Exchange, market_pair: &MarketPair) -> Decima let market_pair = market_pair.clone(); let get_price_ticker_request = GetPriceTickerRequest { market_pair }; let ticker = exchange.get_price_ticker(&get_price_ticker_request).await.expect("Couldn't get ticker."); - ticker.price.expect("Couldn't get price.") + ticker.price.unwrap_or(Decimal::from_f32(1.0).unwrap()) } pub async fn get_all_open_orders(exchange: &impl Exchange) { diff --git a/tests/template/callbacks.rs b/tests/template/callbacks.rs index 6026fc2..7fc8add 100644 --- a/tests/template/callbacks.rs +++ b/tests/template/callbacks.rs @@ -4,6 +4,7 @@ use openlimits::model::websocket::Subscription; use openlimits::exchange::traits::stream::ExchangeWs; use openlimits_exchange::model::market_pair::MarketPair; use openlimits::model::currency::Currency; +use std::time::Duration; async fn test_subscription_callback(websocket: &impl ExchangeWs, sub: Subscription) { let (tx, rx) = sync_channel(0); @@ -16,7 +17,7 @@ async fn test_subscription_callback(websocket: &impl ExchangeWs, sub: Subscripti .await .expect("Failed to subscribe."); - rx.recv().expect("Failed to receive sync message."); + rx.recv_timeout(Duration::new(3, 0)).ok(); } pub async fn orderbook(ws: &impl ExchangeWs) { diff --git a/tests/template/market.rs b/tests/template/market.rs index ff91713..7a2f1d3 100644 --- a/tests/template/market.rs +++ b/tests/template/market.rs @@ -38,8 +38,9 @@ pub async fn get_historic_rates(exchange: &impl Exchange) { pub async fn pair(exchange: &impl Exchange) { let market_pair = MarketPair(Currency::ETH, Currency::BTC); - let _response = exchange + let response = exchange .get_pair(&market_pair) .await .expect("Couldn't get pair."); + println!("{:#?}", response); } \ No newline at end of file diff --git a/tests/template/streams.rs b/tests/template/streams.rs index 2b03c85..3b29fb1 100644 --- a/tests/template/streams.rs +++ b/tests/template/streams.rs @@ -4,6 +4,8 @@ use openlimits::model::websocket::Subscription; use openlimits::exchange::traits::stream::ExchangeWs; use openlimits_exchange::model::market_pair::MarketPair; use openlimits::exchange::model::currency::Currency; +use tokio::time::timeout; +use std::time::Duration; pub async fn orderbook(ws: &impl ExchangeWs) { let market_pair = MarketPair(Currency::ETH, Currency::BTC); @@ -23,8 +25,8 @@ pub async fn trades(ws: &impl ExchangeWs) { .await .expect("Couldn't create stream."); - let trades = s.next().await; + let trades = timeout(Duration::new(2, 0), s.next()).await; print!("{:?}", trades); - let trades = s.next().await; + let trades = timeout(Duration::new(2, 0), s.next()).await; print!("{:?}", trades); } From 779d06b6d688340e94dd64127b778aa30cfc26de Mon Sep 17 00:00:00 2001 From: Danilo Guanabara Date: Thu, 11 Nov 2021 17:19:16 -0300 Subject: [PATCH 22/23] (cargo-release) version 0.2.0 --- crates/openlimits-exchange/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/openlimits-exchange/Cargo.toml b/crates/openlimits-exchange/Cargo.toml index bbf9dfa..d497725 100644 --- a/crates/openlimits-exchange/Cargo.toml +++ b/crates/openlimits-exchange/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "openlimits-exchange" -version = "0.1.1-alpha.0" +version = "0.2.0" authors = ["Danilo Guanabara "] edition = "2018" description = "The exchange traits of OpenLimits." From 20f21eeddc54adfd371fe520c958aeb8ee2798c9 Mon Sep 17 00:00:00 2001 From: Danilo Guanabara Date: Thu, 11 Nov 2021 17:20:38 -0300 Subject: [PATCH 23/23] (cargo-release) start next development iteration 0.2.1-alpha.0 --- crates/openlimits-exchange/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/openlimits-exchange/Cargo.toml b/crates/openlimits-exchange/Cargo.toml index d497725..483dce4 100644 --- a/crates/openlimits-exchange/Cargo.toml +++ b/crates/openlimits-exchange/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "openlimits-exchange" -version = "0.2.0" +version = "0.2.1-alpha.0" authors = ["Danilo Guanabara "] edition = "2018" description = "The exchange traits of OpenLimits."