From 514b0513de4f450d00c510a4e7ef4e5b7dc57f11 Mon Sep 17 00:00:00 2001 From: nym21 Date: Sun, 22 Mar 2026 23:16:52 +0100 Subject: [PATCH] global: final snapshot and fixes before release --- Cargo.lock | 12 +- Cargo.toml | 2 +- crates/brk_computer/src/blocks/import.rs | 2 +- crates/brk_computer/src/cointime/import.rs | 2 +- .../src/distribution/cohorts/utxo/fenwick.rs | 28 +-- .../src/distribution/cohorts/utxo/groups.rs | 131 +++++++---- .../distribution/cohorts/utxo/percentiles.rs | 12 +- .../distribution/cohorts/utxo/tick_tock.rs | 2 +- .../src/distribution/compute/recover.rs | 3 + .../src/distribution/state/cost_basis/data.rs | 3 - crates/brk_computer/src/distribution/vecs.rs | 221 ++++++++++-------- crates/brk_computer/src/indexes/mod.rs | 2 +- crates/brk_computer/src/inputs/import.rs | 2 +- crates/brk_computer/src/market/import.rs | 2 +- crates/brk_computer/src/mining/import.rs | 2 +- crates/brk_computer/src/outputs/import.rs | 2 +- crates/brk_computer/src/pools/mod.rs | 2 +- crates/brk_computer/src/prices/mod.rs | 2 +- crates/brk_computer/src/scripts/import.rs | 2 +- crates/brk_computer/src/supply/import.rs | 2 +- .../brk_computer/src/transactions/import.rs | 2 +- crates/brk_indexer/src/lib.rs | 6 + crates/brk_indexer/src/vecs/mod.rs | 2 +- crates/brk_query/src/lib.rs | 3 +- crates/brk_server/src/api/openapi/mod.rs | 18 +- .../assets/fonts/InstrumentSerif-Italic.woff2 | Bin 0 -> 27772 bytes .../fonts/InstrumentSerif-Regular.woff2 | Bin 0 -> 27212 bytes website/assets/fonts/Satoshi-Variable.woff2 | Bin 0 -> 42588 bytes website/scripts/chart/index.js | 7 +- website/scripts/utils/dom.js | 6 + website/styles/chart.css | 21 +- website/styles/elements.css | 2 - website/styles/fonts.css | 26 +++ website/styles/panes/chart.css | 4 +- 34 files changed, 323 insertions(+), 210 deletions(-) create mode 100644 website/assets/fonts/InstrumentSerif-Italic.woff2 create mode 100644 website/assets/fonts/InstrumentSerif-Regular.woff2 create mode 100644 website/assets/fonts/Satoshi-Variable.woff2 diff --git a/Cargo.lock b/Cargo.lock index b6090729d..d2c67baea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2538,9 +2538,9 @@ dependencies = [ [[package]] name = "rawdb" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f1a1534553d4e626de325e000d3250490fb4020d8f177747615f345016c8f0a" +checksum = "dc7e70161aa9dbfcc1f858cae94eda70c9073bab5b22167bc6ab0f85d27054cf" dependencies = [ "libc", "log", @@ -3432,9 +3432,9 @@ checksum = "8f54a172d0620933a27a4360d3db3e2ae0dd6cceae9730751a036bbf182c4b23" [[package]] name = "vecdb" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a45f0491e73f467ff4dcb360d4341ad6281719362f29b040c2b769d18e161ab1" +checksum = "417cdef9fd0ada1659e1499c7180b3b8edf5256b99eb846c7f960c10a755ea3c" dependencies = [ "itoa", "libc", @@ -3455,9 +3455,9 @@ dependencies = [ [[package]] name = "vecdb_derive" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac60cdf47669f66acd6debfd66705464fb7c2519eed7b3692495d037f6d6399" +checksum = "aba470bc1a709df1efaace5885b25e7685988c64b61ac379758d861d12312735" dependencies = [ "quote", "syn", diff --git a/Cargo.toml b/Cargo.toml index 30afa2cb1..95275b8f2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -87,7 +87,7 @@ tower-http = { version = "0.6.8", features = ["catch-panic", "compression-br", " tower-layer = "0.3" tracing = { version = "0.1", default-features = false, features = ["std"] } ureq = { version = "3.3.0", features = ["json"] } -vecdb = { version = "0.7.0", features = ["derive", "serde_json", "pco", "schemars"] } +vecdb = { version = "0.7.1", features = ["derive", "serde_json", "pco", "schemars"] } # vecdb = { path = "../anydb/crates/vecdb", features = ["derive", "serde_json", "pco", "schemars"] } [workspace.metadata.release] diff --git a/crates/brk_computer/src/blocks/import.rs b/crates/brk_computer/src/blocks/import.rs index ce27837ce..004859ffa 100644 --- a/crates/brk_computer/src/blocks/import.rs +++ b/crates/brk_computer/src/blocks/import.rs @@ -21,7 +21,7 @@ impl Vecs { indexer: &Indexer, indexes: &indexes::Vecs, ) -> Result { - let db = open_db(parent_path, super::DB_NAME, 50_000_000)?; + let db = open_db(parent_path, super::DB_NAME, 1_000_000)?; let version = parent_version; let lookback = LookbackVecs::forced_import(&db, version)?; diff --git a/crates/brk_computer/src/cointime/import.rs b/crates/brk_computer/src/cointime/import.rs index 39df2e410..c7808d5bd 100644 --- a/crates/brk_computer/src/cointime/import.rs +++ b/crates/brk_computer/src/cointime/import.rs @@ -22,7 +22,7 @@ impl Vecs { indexes: &indexes::Vecs, cached_starts: &CachedWindowStarts, ) -> Result { - let db = open_db(parent_path, DB_NAME, 1_000_000)?; + let db = open_db(parent_path, DB_NAME, 250_000)?; let version = parent_version; let v1 = version + Version::ONE; let activity = ActivityVecs::forced_import(&db, version, indexes, cached_starts)?; diff --git a/crates/brk_computer/src/distribution/cohorts/utxo/fenwick.rs b/crates/brk_computer/src/distribution/cohorts/utxo/fenwick.rs index 4bc73eaad..0ed2e82cc 100644 --- a/crates/brk_computer/src/distribution/cohorts/utxo/fenwick.rs +++ b/crates/brk_computer/src/distribution/cohorts/utxo/fenwick.rs @@ -3,7 +3,10 @@ use brk_types::{Cents, CentsCompact, Sats}; use crate::{ distribution::state::PendingDelta, - internal::{PERCENTILES, PERCENTILES_LEN, algo::{FenwickNode, FenwickTree}}, + internal::{ + PERCENTILES, PERCENTILES_LEN, + algo::{FenwickNode, FenwickTree}, + }, }; use super::COST_BASIS_PRICE_DIGITS; @@ -70,7 +73,6 @@ pub(super) struct CostBasisFenwick { // to a flat bucket index across two tiers. // --------------------------------------------------------------------------- -/// Map rounded dollars to a flat bucket index. /// Prices >= $1M are clamped to the last bucket. #[inline] fn dollars_to_bucket(dollars: u64) -> usize { @@ -83,7 +85,6 @@ fn dollars_to_bucket(dollars: u64) -> usize { } } -/// Convert a bucket index back to a price in Cents. #[inline] fn bucket_to_cents(bucket: usize) -> Cents { let dollars: u64 = if bucket < TIER1_START { @@ -96,24 +97,18 @@ fn bucket_to_cents(bucket: usize) -> Cents { Cents::from(dollars * 100) } -/// Map a CentsCompact price to a bucket index. #[inline] fn price_to_bucket(price: CentsCompact) -> usize { cents_to_bucket(price.into()) } -/// Map a Cents price to a bucket index. #[inline] fn cents_to_bucket(price: Cents) -> usize { dollars_to_bucket(u64::from(price.round_to_dollar(COST_BASIS_PRICE_DIGITS)) / 100) } -// --------------------------------------------------------------------------- -// CostBasisFenwick implementation -// --------------------------------------------------------------------------- - -impl CostBasisFenwick { - pub(super) fn new() -> Self { +impl Default for CostBasisFenwick { + fn default() -> Self { Self { tree: FenwickTree::new(TREE_SIZE), totals: CostBasisNode::default(), @@ -121,7 +116,9 @@ impl CostBasisFenwick { initialized: false, } } +} +impl CostBasisFenwick { pub(super) fn is_initialized(&self) -> bool { self.initialized } @@ -153,7 +150,8 @@ impl CostBasisFenwick { return; } let bucket = price_to_bucket(price); - let delta = CostBasisNode::new(net_sats, price.as_u128() as i128 * net_sats as i128, is_sth); + let delta = + CostBasisNode::new(net_sats, price.as_u128() as i128 * net_sats as i128, is_sth); self.tree.add(bucket, &delta); self.totals.add_assign(&delta); } @@ -236,8 +234,7 @@ impl CostBasisFenwick { sat_targets[PERCENTILES_LEN + 1] = total_sats - 1; // max let mut sat_buckets = [0usize; PERCENTILES_LEN + 2]; - self.tree - .kth(&sat_targets, &sat_field, &mut sat_buckets); + self.tree.kth(&sat_targets, &sat_field, &mut sat_buckets); result.min_price = bucket_to_cents(sat_buckets[0]); (0..PERCENTILES_LEN).for_each(|i| { @@ -253,8 +250,7 @@ impl CostBasisFenwick { } let mut usd_buckets = [0usize; PERCENTILES_LEN]; - self.tree - .kth(&usd_targets, &usd_field, &mut usd_buckets); + self.tree.kth(&usd_targets, &usd_field, &mut usd_buckets); (0..PERCENTILES_LEN).for_each(|i| { result.usd_prices[i] = bucket_to_cents(usd_buckets[i]); diff --git a/crates/brk_computer/src/distribution/cohorts/utxo/groups.rs b/crates/brk_computer/src/distribution/cohorts/utxo/groups.rs index aeb4bb7c9..a7633e344 100644 --- a/crates/brk_computer/src/distribution/cohorts/utxo/groups.rs +++ b/crates/brk_computer/src/distribution/cohorts/utxo/groups.rs @@ -1,8 +1,8 @@ use std::path::Path; use brk_cohort::{ - AgeRange, AmountRange, Class, ByEpoch, OverAmount, UnderAmount, UnderAge, - OverAge, SpendableType, CohortContext, Filter, Filtered, Term, + AgeRange, AmountRange, ByEpoch, Class, CohortContext, Filter, Filtered, OverAge, OverAmount, + SpendableType, Term, UnderAge, UnderAmount, }; use brk_error::Result; use brk_traversable::Traversable; @@ -17,8 +17,8 @@ use crate::{ distribution::{ DynCohortVecs, metrics::{ - AllCohortMetrics, BasicCohortMetrics, CohortMetricsBase, - CoreCohortMetrics, ExtendedAdjustedCohortMetrics, ExtendedCohortMetrics, ImportConfig, + AllCohortMetrics, BasicCohortMetrics, CohortMetricsBase, CoreCohortMetrics, + ExtendedAdjustedCohortMetrics, ExtendedCohortMetrics, ImportConfig, MinimalCohortMetrics, ProfitabilityMetrics, RealizedFullAccum, SupplyCore, TypeCohortMetrics, }, @@ -52,11 +52,16 @@ pub struct UTXOCohorts { pub profitability: ProfitabilityMetrics, pub matured: AgeRange>, #[traversable(skip)] + pub(super) caches: UTXOCohortsTransientState, +} + +/// In-memory state that does NOT survive rollback. +#[derive(Clone, Default)] +pub(crate) struct UTXOCohortsTransientState { pub(super) fenwick: CostBasisFenwick, /// Cached partition_point positions for tick_tock boundary searches. /// Avoids O(log n) binary search per boundary per block; scans forward /// from last known position (typically O(1) per boundary). - #[traversable(skip)] pub(super) tick_tock_cached_positions: [usize; 20], } @@ -258,7 +263,7 @@ impl UTXOCohorts { let prefix = CohortContext::Utxo.prefix(); let matured = AgeRange::try_new(&|_f: Filter, - name: &'static str| + name: &'static str| -> Result { AmountPerBlockCumulativeRolling::forced_import( db, @@ -284,24 +289,30 @@ impl UTXOCohorts { over_amount, profitability, matured, - fenwick: CostBasisFenwick::new(), - tick_tock_cached_positions: [0; 20], + caches: UTXOCohortsTransientState::default(), }) } + /// Reset in-memory caches that become stale after rollback. + pub(crate) fn reset_caches(&mut self) { + self.caches = UTXOCohortsTransientState::default(); + } + /// Initialize the Fenwick tree from all age-range BTreeMaps. /// Call after state import when all pending maps have been drained. pub(crate) fn init_fenwick_if_needed(&mut self) { - if self.fenwick.is_initialized() { + if self.caches.fenwick.is_initialized() { return; } let Self { sth, - fenwick, + caches, age_range, .. } = self; - fenwick.compute_is_sth(&sth.metrics.filter, age_range.iter().map(|v| v.filter())); + caches + .fenwick + .compute_is_sth(&sth.metrics.filter, age_range.iter().map(|v| v.filter())); let maps: Vec<_> = age_range .iter() @@ -312,27 +323,27 @@ impl UTXOCohorts { if map.is_empty() { return None; } - Some((map, fenwick.is_sth_at(i))) + Some((map, caches.fenwick.is_sth_at(i))) }) .collect(); - fenwick.bulk_init(maps.into_iter()); + caches.fenwick.bulk_init(maps.into_iter()); } /// Apply pending deltas from all age-range cohorts to the Fenwick tree. /// Call after receive/send, before push_cohort_states. pub(crate) fn update_fenwick_from_pending(&mut self) { - if !self.fenwick.is_initialized() { + if !self.caches.fenwick.is_initialized() { return; } - // Destructure to get separate borrows on fenwick and age_range + // Destructure to get separate borrows on caches and age_range let Self { - fenwick, age_range, .. + caches, age_range, .. } = self; for (i, sub) in age_range.iter().enumerate() { if let Some(state) = sub.state.as_ref() { - let is_sth = fenwick.is_sth_at(i); + let is_sth = caches.fenwick.is_sth_at(i); state.for_each_cost_basis_pending(|&price, delta| { - fenwick.apply_delta(price, delta, is_sth); + caches.fenwick.apply_delta(price, delta, is_sth); }); } } @@ -455,8 +466,7 @@ impl UTXOCohorts { .try_for_each(|vecs| { let sources = filter_minimal_sources_from(amr.iter(), Some(&vecs.metrics.filter)); - vecs.metrics - .compute_from_sources(si, &sources, exit) + vecs.metrics.compute_from_sources(si, &sources, exit) }) }), ]; @@ -483,8 +493,16 @@ impl UTXOCohorts { all.push(&mut self.all); all.push(&mut self.sth); all.push(&mut self.lth); - all.extend(self.under_age.iter_mut().map(|x| x as &mut dyn DynCohortVecs)); - all.extend(self.over_age.iter_mut().map(|x| x as &mut dyn DynCohortVecs)); + all.extend( + self.under_age + .iter_mut() + .map(|x| x as &mut dyn DynCohortVecs), + ); + all.extend( + self.over_age + .iter_mut() + .map(|x| x as &mut dyn DynCohortVecs), + ); all.extend( self.over_amount .iter_mut() @@ -542,7 +560,8 @@ impl UTXOCohorts { .metrics .activity .transfer_volume - .block.cents + .block + .cents .read_only_clone(); let under_1h_value_destroyed = self .age_range @@ -567,7 +586,13 @@ impl UTXOCohorts { // Clone all_supply_sats and all_utxo_count for non-all cohorts. let all_supply_sats = self.all.metrics.supply.total.sats.height.read_only_clone(); - let all_utxo_count = self.all.metrics.outputs.unspent_count.height.read_only_clone(); + let all_utxo_count = self + .all + .metrics + .outputs + .unspent_count + .height + .read_only_clone(); // Destructure to allow parallel mutable access to independent fields. let Self { @@ -636,9 +661,10 @@ impl UTXOCohorts { }) }), Box::new(|| { - over_amount - .par_iter_mut() - .try_for_each(|v| v.metrics.compute_rest_part2(prices, starting_indexes, au, exit)) + over_amount.par_iter_mut().try_for_each(|v| { + v.metrics + .compute_rest_part2(prices, starting_indexes, au, exit) + }) }), Box::new(|| { epoch.par_iter_mut().try_for_each(|v| { @@ -653,19 +679,22 @@ impl UTXOCohorts { }) }), Box::new(|| { - amount_range - .par_iter_mut() - .try_for_each(|v| v.metrics.compute_rest_part2(prices, starting_indexes, au, exit)) + amount_range.par_iter_mut().try_for_each(|v| { + v.metrics + .compute_rest_part2(prices, starting_indexes, au, exit) + }) }), Box::new(|| { - under_amount - .par_iter_mut() - .try_for_each(|v| v.metrics.compute_rest_part2(prices, starting_indexes, au, exit)) + under_amount.par_iter_mut().try_for_each(|v| { + v.metrics + .compute_rest_part2(prices, starting_indexes, au, exit) + }) }), Box::new(|| { - type_ - .par_iter_mut() - .try_for_each(|v| v.metrics.compute_rest_part2(prices, starting_indexes, au, exit)) + type_.par_iter_mut().try_for_each(|v| { + v.metrics + .compute_rest_part2(prices, starting_indexes, au, exit) + }) }), ]; @@ -829,12 +858,30 @@ impl UTXOCohorts { sth.metrics.realized.push_accum(&sth_acc); lth.metrics.realized.push_accum(<h_acc); - all.metrics.unrealized.investor_cap_in_profit_raw.push(CentsSquaredSats::new(all_icap.0)); - all.metrics.unrealized.investor_cap_in_loss_raw.push(CentsSquaredSats::new(all_icap.1)); - sth.metrics.unrealized.investor_cap_in_profit_raw.push(CentsSquaredSats::new(sth_icap.0)); - sth.metrics.unrealized.investor_cap_in_loss_raw.push(CentsSquaredSats::new(sth_icap.1)); - lth.metrics.unrealized.investor_cap_in_profit_raw.push(CentsSquaredSats::new(lth_icap.0)); - lth.metrics.unrealized.investor_cap_in_loss_raw.push(CentsSquaredSats::new(lth_icap.1)); + all.metrics + .unrealized + .investor_cap_in_profit_raw + .push(CentsSquaredSats::new(all_icap.0)); + all.metrics + .unrealized + .investor_cap_in_loss_raw + .push(CentsSquaredSats::new(all_icap.1)); + sth.metrics + .unrealized + .investor_cap_in_profit_raw + .push(CentsSquaredSats::new(sth_icap.0)); + sth.metrics + .unrealized + .investor_cap_in_loss_raw + .push(CentsSquaredSats::new(sth_icap.1)); + lth.metrics + .unrealized + .investor_cap_in_profit_raw + .push(CentsSquaredSats::new(lth_icap.0)); + lth.metrics + .unrealized + .investor_cap_in_loss_raw + .push(CentsSquaredSats::new(lth_icap.1)); } } diff --git a/crates/brk_computer/src/distribution/cohorts/utxo/percentiles.rs b/crates/brk_computer/src/distribution/cohorts/utxo/percentiles.rs index d71484a7f..37a9573f7 100644 --- a/crates/brk_computer/src/distribution/cohorts/utxo/percentiles.rs +++ b/crates/brk_computer/src/distribution/cohorts/utxo/percentiles.rs @@ -24,7 +24,7 @@ impl UTXOCohorts { date_opt: Option, states_path: &Path, ) -> Result<()> { - if self.fenwick.is_initialized() { + if self.caches.fenwick.is_initialized() { self.push_fenwick_results(spot_price); } @@ -38,18 +38,18 @@ impl UTXOCohorts { /// Push all Fenwick-derived per-block results: percentiles, density, profitability. fn push_fenwick_results(&mut self, spot_price: Cents) { - let (all_d, sth_d, lth_d) = self.fenwick.density(spot_price); + let (all_d, sth_d, lth_d) = self.caches.fenwick.density(spot_price); - let all = self.fenwick.percentiles_all(); + let all = self.caches.fenwick.percentiles_all(); push_cost_basis(&all, all_d, &mut self.all.metrics.cost_basis); - let sth = self.fenwick.percentiles_sth(); + let sth = self.caches.fenwick.percentiles_sth(); push_cost_basis(&sth, sth_d, &mut self.sth.metrics.cost_basis); - let lth = self.fenwick.percentiles_lth(); + let lth = self.caches.fenwick.percentiles_lth(); push_cost_basis(<h, lth_d, &mut self.lth.metrics.cost_basis); - let prof = self.fenwick.profitability(spot_price); + let prof = self.caches.fenwick.profitability(spot_price); push_profitability(&prof, &mut self.profitability); } diff --git a/crates/brk_computer/src/distribution/cohorts/utxo/tick_tock.rs b/crates/brk_computer/src/distribution/cohorts/utxo/tick_tock.rs index a7df31039..d17d9ae3f 100644 --- a/crates/brk_computer/src/distribution/cohorts/utxo/tick_tock.rs +++ b/crates/brk_computer/src/distribution/cohorts/utxo/tick_tock.rs @@ -42,7 +42,7 @@ impl UTXOCohorts { // Cohort 0 covers [0, 1) hours // Cohort 20 covers [15*365*24, infinity) hours let mut age_cohorts: Vec<_> = self.age_range.iter_mut().map(|v| &mut v.state).collect(); - let cached = &mut self.tick_tock_cached_positions; + let cached = &mut self.caches.tick_tock_cached_positions; // For each boundary (in hours), find blocks that just crossed it for (boundary_idx, &boundary_hours) in AGE_BOUNDARIES.iter().enumerate() { diff --git a/crates/brk_computer/src/distribution/compute/recover.rs b/crates/brk_computer/src/distribution/compute/recover.rs index e352ae1d7..7db1db946 100644 --- a/crates/brk_computer/src/distribution/compute/recover.rs +++ b/crates/brk_computer/src/distribution/compute/recover.rs @@ -128,6 +128,9 @@ pub(crate) fn reset_state( utxo_cohorts.reset_separate_cost_basis_data()?; addr_cohorts.reset_separate_cost_basis_data()?; + // Reset in-memory caches (fenwick, tick_tock positions) + utxo_cohorts.reset_caches(); + Ok(RecoveredState { starting_height: Height::ZERO, }) diff --git a/crates/brk_computer/src/distribution/state/cost_basis/data.rs b/crates/brk_computer/src/distribution/state/cost_basis/data.rs index 163cf684d..91f238905 100644 --- a/crates/brk_computer/src/distribution/state/cost_basis/data.rs +++ b/crates/brk_computer/src/distribution/state/cost_basis/data.rs @@ -249,7 +249,6 @@ pub struct CostBasisData { pending: FxHashMap, cache: Option>, rounding_digits: Option, - generation: u64, investor_cap_raw: CentsSquaredSats, pending_investor_cap: PendingInvestorCapDelta, } @@ -297,7 +296,6 @@ impl CostBasisData { if self.pending.is_empty() { return; } - self.generation = self.generation.wrapping_add(1); let map = &mut self.map.as_mut().unwrap().map; for (cents, PendingDelta { inc, dec }) in self.pending.drain() { match map.entry(cents) { @@ -353,7 +351,6 @@ impl CostBasisOps for CostBasisData { pending: FxHashMap::default(), cache: None, rounding_digits: None, - generation: 0, investor_cap_raw: CentsSquaredSats::ZERO, pending_investor_cap: PendingInvestorCapDelta::default(), } diff --git a/crates/brk_computer/src/distribution/vecs.rs b/crates/brk_computer/src/distribution/vecs.rs index 55c978b46..22bef272e 100644 --- a/crates/brk_computer/src/distribution/vecs.rs +++ b/crates/brk_computer/src/distribution/vecs.rs @@ -4,8 +4,8 @@ use brk_error::Result; use brk_indexer::Indexer; use brk_traversable::Traversable; use brk_types::{ - Cents, EmptyAddrData, EmptyAddrIndex, FundedAddrData, FundedAddrIndex, Height, - Indexes, StoredF64, SupplyState, Timestamp, TxIndex, Version, + Cents, EmptyAddrData, EmptyAddrIndex, FundedAddrData, FundedAddrIndex, Height, Indexes, + StoredF64, SupplyState, Timestamp, TxIndex, Version, }; use tracing::{debug, info}; use vecdb::{ @@ -23,15 +23,16 @@ use crate::{ state::BlockState, }, indexes, inputs, - internal::{CachedWindowStarts, PerBlockCumulativeRolling, db_utils::{finalize_db, open_db}}, + internal::{ + CachedWindowStarts, PerBlockCumulativeRolling, + db_utils::{finalize_db, open_db}, + }, outputs, prices, transactions, }; use super::{ AddrCohorts, AddrsDataVecs, AnyAddrIndexesVecs, RangeMap, UTXOCohorts, - addr::{ - AddrCountsVecs, AddrActivityVecs, DeltaVecs, NewAddrCountVecs, TotalAddrCountVecs, - }, + addr::{AddrActivityVecs, AddrCountsVecs, DeltaVecs, NewAddrCountVecs, TotalAddrCountVecs}, }; const VERSION: Version = Version::new(22); @@ -48,8 +49,7 @@ pub struct AddrMetricsVecs { pub funded_index: LazyVecFrom1, #[traversable(wrap = "indexes", rename = "empty")] - pub empty_index: - LazyVecFrom1, + pub empty_index: LazyVecFrom1, } #[derive(Traversable)] @@ -73,23 +73,26 @@ pub struct Vecs { pub coinblocks_destroyed: PerBlockCumulativeRolling, pub addrs: AddrMetricsVecs, - /// In-memory block state for UTXO processing. Persisted via supply_state. - /// Kept across compute() calls to avoid O(n) rebuild on resume. + /// In-memory state that does NOT survive rollback. + /// Grouped so that adding a new field automatically gets it reset. #[traversable(skip)] - chain_state: Vec, - /// In-memory tx_index→height reverse lookup. Kept across compute() calls. - #[traversable(skip)] - tx_index_to_height: RangeMap, + caches: DistributionTransientState, +} - /// Cached height→price mapping. Incrementally extended, O(new_blocks) on resume. - #[traversable(skip)] - cached_prices: Vec, - /// Cached height→timestamp mapping. Incrementally extended, O(new_blocks) on resume. - #[traversable(skip)] - cached_timestamps: Vec, - /// Cached sparse table for O(1) range-max price queries. Incrementally extended. - #[traversable(skip)] - cached_price_range_max: PriceRangeMax, +/// In-memory state that does NOT survive rollback. +/// On rollback, the entire struct is replaced with `Default::default()`. +#[derive(Clone, Default)] +struct DistributionTransientState { + /// Block state for UTXO processing. Persisted via supply_state. + chain_state: Vec, + /// tx_index→height reverse lookup. + tx_index_to_height: RangeMap, + /// Height→price mapping. Incrementally extended. + prices: Vec, + /// Height→timestamp mapping. Incrementally extended. + timestamps: Vec, + /// Sparse table for O(1) range-max price queries. Incrementally extended. + price_range_max: PriceRangeMax, } const SAVED_STAMPED_CHANGES: u16 = 10; @@ -109,9 +112,11 @@ impl Vecs { let version = parent_version + VERSION; - let utxo_cohorts = UTXOCohorts::forced_import(&db, version, indexes, &states_path, cached_starts)?; + let utxo_cohorts = + UTXOCohorts::forced_import(&db, version, indexes, &states_path, cached_starts)?; - let addr_cohorts = AddrCohorts::forced_import(&db, version, indexes, &states_path, cached_starts)?; + let addr_cohorts = + AddrCohorts::forced_import(&db, version, indexes, &states_path, cached_starts)?; // Create address data BytesVecs first so we can also use them for identity mappings let funded_addr_index_to_funded_addr_data = BytesVec::forced_import_with( @@ -147,8 +152,7 @@ impl Vecs { let total_addr_count = TotalAddrCountVecs::forced_import(&db, version, indexes)?; // Per-block delta of total (global + per-type) - let new_addr_count = - NewAddrCountVecs::forced_import(&db, version, indexes, cached_starts)?; + let new_addr_count = NewAddrCountVecs::forced_import(&db, version, indexes, cached_starts)?; // Growth rate: delta change + rate (global + per-type) let delta = DeltaVecs::new(version, &addr_count, cached_starts, indexes); @@ -186,12 +190,7 @@ impl Vecs { funded: funded_addr_index_to_funded_addr_data, empty: empty_addr_index_to_empty_addr_data, }, - chain_state: Vec::new(), - tx_index_to_height: RangeMap::default(), - - cached_prices: Vec::new(), - cached_timestamps: Vec::new(), - cached_price_range_max: PriceRangeMax::default(), + caches: DistributionTransientState::default(), db, states_path, @@ -201,6 +200,12 @@ impl Vecs { Ok(this) } + /// Reset in-memory caches that become stale after rollback. + fn reset_in_memory_caches(&mut self) { + self.utxo_cohorts.reset_caches(); + self.caches = DistributionTransientState::default(); + } + /// Main computation loop. /// /// Processes blocks to compute UTXO and address cohort metrics: @@ -222,32 +227,6 @@ impl Vecs { starting_indexes: &mut Indexes, exit: &Exit, ) -> Result<()> { - let cache_target_len = prices - .spot - .cents - .height - .len() - .min(blocks.time.timestamp_monotonic.len()); - let cache_current_len = self.cached_prices.len(); - if cache_target_len < cache_current_len { - self.cached_prices.truncate(cache_target_len); - self.cached_timestamps.truncate(cache_target_len); - self.cached_price_range_max.truncate(cache_target_len); - } else if cache_target_len > cache_current_len { - let new_prices = prices - .spot - .cents - .height - .collect_range_at(cache_current_len, cache_target_len); - let new_timestamps = blocks - .time - .timestamp_monotonic - .collect_range_at(cache_current_len, cache_target_len); - self.cached_prices.extend(new_prices); - self.cached_timestamps.extend(new_timestamps); - } - self.cached_price_range_max.extend(&self.cached_prices); - // 1. Find minimum height we have data for across stateful vecs let current_height = Height::from(self.supply_state.len()); let min_stateful = self.min_stateful_len(); @@ -281,9 +260,6 @@ impl Vecs { &mut self.addr_cohorts, )?; - if recovered.starting_height.is_zero() { - info!("State recovery validation failed, falling back to fresh start"); - } debug!( "recover_state completed, starting_height={}", recovered.starting_height @@ -295,12 +271,14 @@ impl Vecs { debug!("recovered_height={}", recovered_height); - // Take chain_state and tx_index_to_height out of self to avoid borrow conflicts - let mut chain_state = std::mem::take(&mut self.chain_state); - let mut tx_index_to_height = std::mem::take(&mut self.tx_index_to_height); + let needs_fresh_start = recovered_height.is_zero(); + let needs_rollback = recovered_height < current_height; - // Recover or reuse chain_state - let starting_height = if recovered_height.is_zero() { + if needs_fresh_start || needs_rollback { + self.reset_in_memory_caches(); + } + + if needs_fresh_start { self.supply_state.reset()?; self.addrs.funded.reset_height()?; self.addrs.empty.reset_height()?; @@ -311,11 +289,44 @@ impl Vecs { &mut self.utxo_cohorts, &mut self.addr_cohorts, )?; - - chain_state.clear(); - tx_index_to_height.truncate(0); - info!("State recovery: fresh start"); + } + + // Populate price/timestamp caches from the prices module. + // Must happen AFTER rollback/reset (which clears caches) but BEFORE + // chain_state rebuild (which reads from them). + let cache_target_len = prices + .spot + .cents + .height + .len() + .min(blocks.time.timestamp_monotonic.len()); + let cache_current_len = self.caches.prices.len(); + if cache_target_len < cache_current_len { + self.caches.prices.truncate(cache_target_len); + self.caches.timestamps.truncate(cache_target_len); + self.caches.price_range_max.truncate(cache_target_len); + } else if cache_target_len > cache_current_len { + let new_prices = prices + .spot + .cents + .height + .collect_range_at(cache_current_len, cache_target_len); + let new_timestamps = blocks + .time + .timestamp_monotonic + .collect_range_at(cache_current_len, cache_target_len); + self.caches.prices.extend(new_prices); + self.caches.timestamps.extend(new_timestamps); + } + self.caches.price_range_max.extend(&self.caches.prices); + + // Take chain_state and tx_index_to_height out of self to avoid borrow conflicts + let mut chain_state = std::mem::take(&mut self.caches.chain_state); + let mut tx_index_to_height = std::mem::take(&mut self.caches.tx_index_to_height); + + // Recover or reuse chain_state + let starting_height = if recovered_height.is_zero() { Height::ZERO } else if chain_state.len() == usize::from(recovered_height) { // Normal resume: chain_state already matches, reuse as-is @@ -335,8 +346,8 @@ impl Vecs { .enumerate() .map(|(h, supply)| BlockState { supply, - price: self.cached_prices[h], - timestamp: self.cached_timestamps[h], + price: self.caches.prices[h], + timestamp: self.caches.timestamps[h], }) .collect(); debug!("chain_state rebuilt"); @@ -352,12 +363,11 @@ impl Vecs { starting_indexes.height = starting_height; } - // 2b. Validate computed versions + // 2c. Validate computed versions debug!("validating computed versions"); let base_version = VERSION; self.utxo_cohorts.validate_computed_versions(base_version)?; - self.addr_cohorts - .validate_computed_versions(base_version)?; + self.addr_cohorts.validate_computed_versions(base_version)?; debug!("computed versions validated"); // 3. Get last height from indexer @@ -371,9 +381,9 @@ impl Vecs { if starting_height <= last_height { debug!("calling process_blocks"); - let cached_prices = std::mem::take(&mut self.cached_prices); - let cached_timestamps = std::mem::take(&mut self.cached_timestamps); - let cached_price_range_max = std::mem::take(&mut self.cached_price_range_max); + let prices = std::mem::take(&mut self.caches.prices); + let timestamps = std::mem::take(&mut self.caches.timestamps); + let price_range_max = std::mem::take(&mut self.caches.price_range_max); process_blocks( self, @@ -386,27 +396,33 @@ impl Vecs { last_height, &mut chain_state, &mut tx_index_to_height, - &cached_prices, - &cached_timestamps, - &cached_price_range_max, + &prices, + ×tamps, + &price_range_max, exit, )?; - self.cached_prices = cached_prices; - self.cached_timestamps = cached_timestamps; - self.cached_price_range_max = cached_price_range_max; + self.caches.prices = prices; + self.caches.timestamps = timestamps; + self.caches.price_range_max = price_range_max; } // Put chain_state and tx_index_to_height back - self.chain_state = chain_state; - self.tx_index_to_height = tx_index_to_height; + self.caches.chain_state = chain_state; + self.caches.tx_index_to_height = tx_index_to_height; // 5. Compute aggregates (overlapping cohorts from separate cohorts) info!("Computing overlapping cohorts..."); { let (r1, r2) = rayon::join( - || self.utxo_cohorts.compute_overlapping_vecs(starting_indexes, exit), - || self.addr_cohorts.compute_overlapping_vecs(starting_indexes, exit), + || { + self.utxo_cohorts + .compute_overlapping_vecs(starting_indexes, exit) + }, + || { + self.addr_cohorts + .compute_overlapping_vecs(starting_indexes, exit) + }, ); r1?; r2?; @@ -420,8 +436,14 @@ impl Vecs { info!("Computing rest part 1..."); { let (r1, r2) = rayon::join( - || self.utxo_cohorts.compute_rest_part1(prices, starting_indexes, exit), - || self.addr_cohorts.compute_rest_part1(prices, starting_indexes, exit), + || { + self.utxo_cohorts + .compute_rest_part1(prices, starting_indexes, exit) + }, + || { + self.addr_cohorts + .compute_rest_part1(prices, starting_indexes, exit) + }, ); r1?; r2?; @@ -442,11 +464,9 @@ impl Vecs { self.addrs .activity .compute_rest(starting_indexes.height, exit)?; - self.addrs.new.compute( - starting_indexes.height, - &self.addrs.total, - exit, - )?; + self.addrs + .new + .compute(starting_indexes.height, &self.addrs.total, exit)?; // 7. Compute rest part2 (relative metrics) let height_to_market_cap = self @@ -468,7 +488,14 @@ impl Vecs { exit, )?; - let all_utxo_count = self.utxo_cohorts.all.metrics.outputs.unspent_count.height.read_only_clone(); + let all_utxo_count = self + .utxo_cohorts + .all + .metrics + .outputs + .unspent_count + .height + .read_only_clone(); self.addr_cohorts .compute_rest_part2(prices, starting_indexes, &all_utxo_count, exit)?; diff --git a/crates/brk_computer/src/indexes/mod.rs b/crates/brk_computer/src/indexes/mod.rs index 8e8bca6f3..303be424a 100644 --- a/crates/brk_computer/src/indexes/mod.rs +++ b/crates/brk_computer/src/indexes/mod.rs @@ -93,7 +93,7 @@ impl Vecs { parent_version: Version, indexer: &Indexer, ) -> Result { - let db = open_db(parent, DB_NAME, 10_000_000)?; + let db = open_db(parent, DB_NAME, 1_000_000)?; let version = parent_version; diff --git a/crates/brk_computer/src/inputs/import.rs b/crates/brk_computer/src/inputs/import.rs index 4f14611f3..372604334 100644 --- a/crates/brk_computer/src/inputs/import.rs +++ b/crates/brk_computer/src/inputs/import.rs @@ -17,7 +17,7 @@ impl Vecs { indexes: &indexes::Vecs, cached_starts: &CachedWindowStarts, ) -> Result { - let db = open_db(parent_path, super::DB_NAME, 50_000_000)?; + let db = open_db(parent_path, super::DB_NAME, 20_000_000)?; let version = parent_version; let spent = SpentVecs::forced_import(&db, version)?; diff --git a/crates/brk_computer/src/market/import.rs b/crates/brk_computer/src/market/import.rs index 2a996bcc4..24091ae21 100644 --- a/crates/brk_computer/src/market/import.rs +++ b/crates/brk_computer/src/market/import.rs @@ -19,7 +19,7 @@ impl Vecs { parent_version: Version, indexes: &indexes::Vecs, ) -> Result { - let db = open_db(parent_path, super::DB_NAME, 1_000_000)?; + let db = open_db(parent_path, super::DB_NAME, 250_000)?; let version = parent_version; let ath = AthVecs::forced_import(&db, version, indexes)?; diff --git a/crates/brk_computer/src/mining/import.rs b/crates/brk_computer/src/mining/import.rs index 8d6492d7d..09d0ee778 100644 --- a/crates/brk_computer/src/mining/import.rs +++ b/crates/brk_computer/src/mining/import.rs @@ -17,7 +17,7 @@ impl Vecs { indexes: &indexes::Vecs, cached_starts: &CachedWindowStarts, ) -> Result { - let db = open_db(parent_path, super::DB_NAME, 50_000_000)?; + let db = open_db(parent_path, super::DB_NAME, 1_000_000)?; let version = parent_version; let rewards = RewardsVecs::forced_import(&db, version, indexes, cached_starts)?; diff --git a/crates/brk_computer/src/outputs/import.rs b/crates/brk_computer/src/outputs/import.rs index 86331b3f3..372604334 100644 --- a/crates/brk_computer/src/outputs/import.rs +++ b/crates/brk_computer/src/outputs/import.rs @@ -17,7 +17,7 @@ impl Vecs { indexes: &indexes::Vecs, cached_starts: &CachedWindowStarts, ) -> Result { - let db = open_db(parent_path, super::DB_NAME, 10_000_000)?; + let db = open_db(parent_path, super::DB_NAME, 20_000_000)?; let version = parent_version; let spent = SpentVecs::forced_import(&db, version)?; diff --git a/crates/brk_computer/src/pools/mod.rs b/crates/brk_computer/src/pools/mod.rs index 487102b88..7612551c0 100644 --- a/crates/brk_computer/src/pools/mod.rs +++ b/crates/brk_computer/src/pools/mod.rs @@ -41,7 +41,7 @@ impl Vecs { indexes: &indexes::Vecs, cached_starts: &CachedWindowStarts, ) -> Result { - let db = open_db(parent_path, DB_NAME, 1_000_000)?; + let db = open_db(parent_path, DB_NAME, 100_000)?; let pools = pools(); let version = parent_version + Version::new(3) + Version::new(pools.len() as u32); diff --git a/crates/brk_computer/src/prices/mod.rs b/crates/brk_computer/src/prices/mod.rs index adb98a649..7b8dc2de3 100644 --- a/crates/brk_computer/src/prices/mod.rs +++ b/crates/brk_computer/src/prices/mod.rs @@ -38,7 +38,7 @@ impl Vecs { version: Version, indexes: &indexes::Vecs, ) -> brk_error::Result { - let db = open_db(parent, DB_NAME, 1_000_000)?; + let db = open_db(parent, DB_NAME, 100_000)?; let this = Self::forced_import_inner(&db, version, indexes)?; finalize_db(&this.db, &this)?; Ok(this) diff --git a/crates/brk_computer/src/scripts/import.rs b/crates/brk_computer/src/scripts/import.rs index a17660a24..8243ce8f6 100644 --- a/crates/brk_computer/src/scripts/import.rs +++ b/crates/brk_computer/src/scripts/import.rs @@ -18,7 +18,7 @@ impl Vecs { indexes: &indexes::Vecs, cached_starts: &CachedWindowStarts, ) -> Result { - let db = open_db(parent_path, super::DB_NAME, 50_000_000)?; + let db = open_db(parent_path, super::DB_NAME, 1_000_000)?; let version = parent_version; let count = CountVecs::forced_import(&db, version, indexes, cached_starts)?; diff --git a/crates/brk_computer/src/supply/import.rs b/crates/brk_computer/src/supply/import.rs index 7bca20832..d6169529f 100644 --- a/crates/brk_computer/src/supply/import.rs +++ b/crates/brk_computer/src/supply/import.rs @@ -26,7 +26,7 @@ impl Vecs { cointime: &cointime::Vecs, cached_starts: &CachedWindowStarts, ) -> Result { - let db = open_db(parent, super::DB_NAME, 10_000_000)?; + let db = open_db(parent, super::DB_NAME, 1_000_000)?; let version = parent_version + VERSION; let supply_metrics = &distribution.utxo_cohorts.all.metrics.supply; diff --git a/crates/brk_computer/src/transactions/import.rs b/crates/brk_computer/src/transactions/import.rs index 1a50a06c4..4be2a16e2 100644 --- a/crates/brk_computer/src/transactions/import.rs +++ b/crates/brk_computer/src/transactions/import.rs @@ -19,7 +19,7 @@ impl Vecs { indexes: &indexes::Vecs, cached_starts: &CachedWindowStarts, ) -> Result { - let db = open_db(parent_path, super::DB_NAME, 50_000_000)?; + let db = open_db(parent_path, super::DB_NAME, 10_000_000)?; let version = parent_version; let count = CountVecs::forced_import(&db, version, indexer, indexes, cached_starts)?; diff --git a/crates/brk_indexer/src/lib.rs b/crates/brk_indexer/src/lib.rs index c8a6ed0ae..3fdd6faf3 100644 --- a/crates/brk_indexer/src/lib.rs +++ b/crates/brk_indexer/src/lib.rs @@ -110,6 +110,12 @@ impl Indexer { debug!("Starting indexing..."); let last_blockhash = self.vecs.blocks.blockhash.collect_last(); + // Rollback sim + // let last_blockhash = self + // .vecs + // .blocks + // .blockhash + // .collect_one_at(self.vecs.blocks.blockhash.len() - 2); debug!("Last block hash found."); let (starting_indexes, prev_hash) = if let Some(hash) = last_blockhash { diff --git a/crates/brk_indexer/src/vecs/mod.rs b/crates/brk_indexer/src/vecs/mod.rs index e45209d6c..2a95af6fb 100644 --- a/crates/brk_indexer/src/vecs/mod.rs +++ b/crates/brk_indexer/src/vecs/mod.rs @@ -49,7 +49,7 @@ impl Vecs { tracing::debug!("Opening vecs database..."); let db = Database::open(&parent.join("vecs"))?; tracing::debug!("Setting min len..."); - db.set_min_len(PAGE_SIZE * 50_000_000)?; + db.set_min_len(PAGE_SIZE * 60_000_000)?; let (blocks, transactions, inputs, outputs, addrs, scripts) = parallel_import! { blocks = BlocksVecs::forced_import(&db, version), diff --git a/crates/brk_query/src/lib.rs b/crates/brk_query/src/lib.rs index e7d844d21..fbd4a7bae 100644 --- a/crates/brk_query/src/lib.rs +++ b/crates/brk_query/src/lib.rs @@ -63,7 +63,8 @@ impl Query { /// Current computed height (series) pub fn computed_height(&self) -> Height { - Height::from(self.computer().distribution.supply_state.len()) + let len = self.computer().distribution.supply_state.len(); + Height::from(len.saturating_sub(1)) } /// Minimum of indexed and computed heights diff --git a/crates/brk_server/src/api/openapi/mod.rs b/crates/brk_server/src/api/openapi/mod.rs index 6b3490c5c..c048ee3b3 100644 --- a/crates/brk_server/src/api/openapi/mod.rs +++ b/crates/brk_server/src/api/openapi/mod.rs @@ -107,14 +107,6 @@ All errors return structured JSON with a consistent format: ), ..Default::default() }, - Tag { - name: "Metrics".to_string(), - description: Some( - "Deprecated — use Series".to_string(), - ), - extensions: [("x-deprecated".to_string(), serde_json::Value::Bool(true))].into(), - ..Default::default() - }, Tag { name: "Blocks".to_string(), description: Some( @@ -165,6 +157,14 @@ All errors return structured JSON with a consistent format: ), ..Default::default() }, + Tag { + name: "Metrics".to_string(), + description: Some( + "Deprecated — use Series".to_string(), + ), + extensions: [("deprecated".to_string(), serde_json::Value::Bool(true))].into(), + ..Default::default() + }, ]; OpenApi { @@ -172,4 +172,4 @@ All errors return structured JSON with a consistent format: tags, ..OpenApi::default() } -} \ No newline at end of file +} diff --git a/website/assets/fonts/InstrumentSerif-Italic.woff2 b/website/assets/fonts/InstrumentSerif-Italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..77dd4c278c33c8b2503cfb857a7982d3c5327458 GIT binary patch literal 27772 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%0A{-z(qMR(_%=nz)*I(FHc{tfW(=;bN#)9zC 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≫3u*WdzJRYn#Z;Wxs84p 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

jc>~Px=r2JzdAf#XE-aw80d-h)C>Jf`h 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 UQN@G*cXn2eGW>(=$KZQ40M%1td;kCd literal 0 HcmV?d00001 diff --git a/website/assets/fonts/Satoshi-Variable.woff2 b/website/assets/fonts/Satoshi-Variable.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b00e833ed4a0c99492f1bf88e51487c1ebcd1646 GIT binary patch literal 42588 zcmZ6xQ;=v&v@KY+ZQJ%P+qP}nRl984wr$(CZ5zGM?dZ6#-}uRh{L7VdVCGzIa-vKC zfB^qcq78uZZvlMl0{|#K{D1fU+yDOq>#qxTKsN?Xsvw`Zs(@k`5uePzg$GQZPf1xo z8Hbz*AcBNm8W932@Czoez!W;v5r84El>?9shy*xRAA|rjh7~+ZTWhl40SwpZQvslH z!3ILOq{F=2?^I=MCUnH+Z-JXo!HM-?^_Y_ugBu|?^LxAVkt3=j53Zybt%5r~P< zMzpAvNa=ySBd0{sF#FVLAb5%yU)i6yO|W@1#v(#1>zAti*-Q)ibTQ_mr@4x}JA?yy zzk9zZi=aXJiKW6w)v34DDib$r1gSX^K9E!BTL>zaVrse<^{LKdlPA=Qf~7oMD#WLD zQRVorz)6&I$>ALyNdm0N?K?O3IFfYMEjUakhoZA+$6GEwbE6qza#B;FXl?mEU#bj{_FDCC=3FfGv~o5pj_a1(+!u zr##=M@69eZpNxaK`C^hdmVJnnF5;0Y{KX<5DHPC=RK#xR*p>4x4!}B5!y~p;{wj6+ z44xsSoZoII5;q6vj0I&dg4xkNN;Y{;)f~y;YD@V!f#A{OxYHJQIfJ6DxDcBX`t5U} z0e(5VwVtcIuPQRr;3EJ+tuO#u$_l$+#v}nymFD^~NcmuI?a#A)K*Zq$Zud`r}PM%OF%XhaWv$+c&9n@rAwwuV$vG||OJJ%U&C$ug@ z5kVvf#6)0#P{BYDd%3ZnPg}2MKp9~})`yy-m6>*$0SVP>F=CwoEW(Ivo!7f_`}l?j zi%!;W&`#!CJygW1!|_yxyc}w-{EmV?+rS3DVL24VEN&JHRtYJ;L6~t^m6Ry9u9j6L z{{yy$l5KE}F@-OxBmYFq`vH{wh*4!0OYc7FfCeo9e`LBbl4ZUwow~E%QV@f+C3- z#qpXK=FwOO$c_2!tWE?y<`Q~92kb}k>o>z%yK^ZbNuho(PIlM{Lq$up>~y9MsFgTK z8bipste2s;k433_lE&4{?^tx|{V~8eRJeJn=EQpxtrb*2ttu8AF6TE;AoqR7!|R*x zBzh;ECm)a8XKG$#eGU;H%MPN6?Q09fM@_h=NiH0G0Q^_uTUMQRV!K-fZ~O)h5%^}> z$}_CZl^3?R#BE+#2zky~Op*{LM<8%|F^aC@CSk>qiX2CDLj}%@Z5P|kbX=*~->(*$ zy1zzo85s`k=Wm>d$Q#e?mjLBFZWWm_r(?9AXvkRRb$~2dAelul2@5pBq+uC%ouo1X z<6s>Dre_3_iGtyY1p{EyBXU$2M^{TNl;E60_DfMhQRJVF>)q4O7mqj7@AjP;r|)_j z)~0l%nJT%8s2|i_nP2N8JRft82mA)?mf;1I;Y`AZZ+w}m7O7s%;Ag-G1Wyylc!mj+ zzpHBHA8uMLQw#p0e;=m0n!AO!byTWt15(op4wHyv9rMl#ywG)$@&{!e9(z+*JIUn) zQ!)e(hE`s5CAWhxu0zuOYT03ya&LO#cnC$s_UkC@A<_e(7~8oes$U=|?{a(HzJB>? zn<)mJ!ja#tn%H3L>iHW}_0dc*BuL^FKgJaG7Jxg|umZ%oriz0ULjA6UCnriI)yyBL zg9g*|gAhdDzG5JMl4tIrb6V6acc+qHxL3a*1cZf2!otMk_R#z`k%M7>7js5&2$2wp zh~VSRV}(wppcm@T)y-)YgD@DQEwsgjjB_mfXeKdL)hz)9Rn}d9-gfuon(4#O32a=r zfj0@}K#U~__zj~|f8BapO+v4dyWM}Uvkw?BN5jG>MbR{jV|z1_H)-52+VK0INMrTL zrSM?~7@4K#5*hx?Nhzu#5s!$IldU8Vg@c`s6mcWtBIA?!CKu)YjPaB8OAn+AGh>dB z;fK9BtriTq-vjB z);!|6y~m4v4M5v2kKB^JH-0tT8vO2WY*K2QS?+h>M_N+D3IHI(=mV=q&As9R5`gpP z4L>jo?8b?g$P-~z%i1w$RvvDpXUY$|w@Jxb$t6^) zDn~ttc(nC{ofeuOHxTFgA$lsZ8h#TuIw#gH7;qt2|7F2rB9x~X)>J22Nwl$5CVFwe zmm{>u0?Ii4jPD%UJbp~oJ;YAcUeO|~Mupehxc@32K}9cvm0E>|CMdsjXLdcXcnI_#-Xf` zk(B(@*r5((Sv)_=9=HTHAvr&MR@SvAAANI$m<%9s$%gAl77_qyV(cGj{EnnuK82!( zdfmd+MS~A124hs+2u(N=JW;4a>);)2~J=QSEc-`vY=b%-%I7(zE^v z{l%_Fxd!DP0BMIV2okB3O?OlpJa9l-A>JhX&AF?3ivrj4oV2T7nfq=t*?aWXVqT<7 zjP!`cr*J$9DbL--Dn)Z!K^|GXOg&U_q3Ph~N#rImZlnIfvf3j)QZ*$hstu$3IZhI6 zpT0UlHg-`>GI3IyTCMI|OSQg>(b4eza)i92Wp`A}dxlbi#_SgmBmsL)Vl~!s+?u#u z1Zw+%sUi8H`$5FaO2%irlK-((F$FAj_}Gz%3{FRz2+WUJ77?6TM%sLJQ{*eKEX`W_ zA+eIVoT*wT(@uaC>+>C+hWeu`2D^=Pyw%+dtj2e9L@peZYC!-@O7k=_c~?(dTUBf_hsb~XJm zk;$WDqsxN9U-7(2q9OfTl|L zw^U89QGQ4?>ReV@rxV%Lk+MYB9~aHT=8j1pXyx5K!DXhfHLPM-pQO?b z7ui=i;k92b2OWm!=jnJG77budt9+Sc=`hBs7>}FIQ$5G*seqqgLq=Xg@dn(@`6BB{ zp&?3_@x*V@86~d5GDN8Gf%_fC&P}#u@l_%RjHi=;oLF6`)gXov_>Q2^O+Im<_}bkSXR*)WwDs$*cOJDb7iJpShq7pbENS4aR3;%ojh=%LpB)Q zw5-+WLBwn`1(*mQc@gduE~>s7rVDLr2AmVmSWY@Dexr?UEf-}ot32NEMQ}6fX^<4O z(ztU;1?HHJh;U?|P^&l0Bj?v~@f{6ycM?D69;Uf-GyP_LmbYWF5%OvwA`2P11z&YC zm_x2Ve9(?1{H%STs_WanH*dRBk84;Hz#T(&xO@*2ltfNU;~#V6NtoKEzm!QHP`OKR zi+m&xIlKz!L8NpDIWHR0C|Sd0a*l@CJOnV|<>tDsvgMDki~}>dfjakF!Uk)^Wr$bjIa7K(Z%z5<(vI&Q=gl+=k)uG0hs$+EL4tjO4eVa zg_6*)WlxI>PsfLNIA{X8Q}yjQKVc}f7%bPAU@^Z`F#B!3y^m>7EEd!%a^x6BM1(Z# zn?_c7#2LPv{S#dC$wD*;&R#b7%>%tzU>XNyv_==}NqFmfE7fvEW;sw>l)V9< z5EliuzOZ^LD2{%#lqO(c4*!IBrN{A=V4y+s{_%6)K(sw3HvbpzM)nvdi0mjm)iOGuA}RSGDlRk%dg*-ByO81~R7;J~Mh zCoon;!9u&Hk8pWwr1vZae93LRfM4p2u zKwNajUszzgZbbkp^H4`INZDe+#F{KFDcrLmo>*;X-}~B60PvSj`K>^_KA|ZN-Tgdy zb;tZswG;04=LdA)WTO!3(}A8DR>&J^7RewmpE-KK+^C_t#6mVcd+jy!_05Wm&sx%f zdczeUxyTRFpAt@vAR(TaKtZ0V%H_kp;a99^#t1-OURhBUu%e>e%G?rl%?knrOpHLm z90o0v96`buDp{3FTTO1aFIvm(=8yXm${z)oG#a+h$wTNM4>Dr2tnjo9+LPE{d}t|Z zt4#4axQRbo=+Aw5goC0{bR&3`$mFbL^A}GDQF+0nj9CPQbT2gIN*i!^!G&|k5(yg` zL~Lb^33w_@=b|n91ePR~x6CnS>kgZ%NJJ;bo-NaVJn*7pZy&{ZUWSySGrn%qPc7)! zxvxG4`TF+Xo(}J|`t#m_U$aJTd;1Rmo?2i)%CiC#M=d_84xx#O0jl>v_%hu^exbQ9 z#?4y(#@;WK&v!k~c;S0LjhpFtKTp51N{xzwAtC+;1q(QqJO&P+a6zNG|L%rJsf-0z z=Z_CC*WYnNr#7A*esks7;XxXj>MENDB$n<4&o2so4VHO+D^);MK-a85ca5F-ETzMu z$VWMIOB#43v%vE7_Tb{==IH8dA3u&fdhuJa(C)oE5F$)YU?fn|K_)RU_R zEC5iL;0P4zb#3@D*sZ0#luga9y9Mgn?sLsn?&ke!SKRMT`gM`U92N9jAjsTq@eTv} z&wC2&a*aZ)#`G{Oo3zBkJXWg(mg=U`z8-Y(T{l*+|KqZiSOCfwie53R5i4~Xx1Na| zk0!9)E3dmJb(sGvtqzt7Ks}|Bu3Qv76&r1Uz0p#8?Q3M}E=5g55RSk{o(3*vppOm( z>ZY|C7fd67o_lfOPc8rt*7z8k04lM{775s0HF0?h0hBU}0@<|;$` ztE?3D1uux2Sef0*$3SYxLKcCsYU+IC5$J;q+XqHzVUuPj|TN4B4cui z1@N}J)xrfY94GGs7hJfx*(dzvdSmUXI*^z-Qc@RYH=3u!)T5GoFs`VX(=E|_$|zq< zC}(DH(s_DN)_{vlard7&n(qQDa zOqANzP`*I4;QmDH{=8l0(r&t5ZBT!bB>WYEb2wTHS2CN?X>&f-qhl1BKy%DAbCS=Y?aoX6&zrC)Eqi}$qWMsB_e39G*YX~rbttFxf>^vqL{ijU=Q;xbOUm$6cQj85JQ z<7)NQ$tsM5O#g6Yomb-9dQswfF4VTZCqpMeYborH1+aBkIlcS*RRBNo*Ss1%aX+=4 zQj=MsszcIpGGM@nqUFMfKSALf6Umu87$t$AWdt*y{(VA$;lPZ?yCAuH`9gU0=QqSY ze`_H601W34Bezsifg z&3WENNw~cu+_Yn(M8vF;F7X%cx@B=RbibE~DdGDdE+;1l@_&gORbzNxA`93mkxZr| zn(j|Fk@C+b$Z{`j11`#;6pGX(bR=u!OSXzUBTh8)b^Z@s4knxnt z88J0EJ%HK$#`T=qczOgZ6{j6q>Y5sxN5R9Fn?}fWOmyUyg-Lu64nb;PwOVP!8pQ~N4D3OWf=Bcn+=1eSOXMw_ z!4ij0{^RW&#UqqSz&`<%$$qwHrviB0dhHv0AWBHp^|+2^vunP*qstv%g+!OV3!)@@ z%!1dSXtAUV{b~f-ypkNcvy(QQ=Uqpv(IGRmG_^IbFtJHA`so_M7IC(6Z`|#(1NceT z<<;oJcK5BgVOENP=dEs5Xsxq?#(7PR!S@+?WjqwKbW1T8xYJ%iQa^e&8T0{w@E(*V zvtAgiR`Ag)VgLnWi4`?*JTi7o+0)2bhNKZE^Au)2!}0+`y^k-=2tp4NqRiug>{=;% zZDXU7Ta^cpB{|Xv;3nZ#h)M&Qv*N;7)XEXoGsBKZ$J3CAAKi6$_N%n1$8)(huniGQ zK?cZ;!#OW2BO(c%@r#rlVm^%LCu>*TA!Y(_tO#qoZE&}+SbtJ*a)z~7rWjk`iG%^= zA0R@MU6Ux*aaTrvYtd=3M1jvk>f$1|TL z^$w9ZSlDpqYK4`xCT&wri(c;`qHSVFSch{R!Ug9#Fj9x05iLYgQ)mc9-LM;neTo4c zW6@9i<1^50aBLwB;U6?h5{S>?kEUtfZXN~fk*l0oFNbi-;OlI-bhB>(rBevEICDdA zd4X`ek{YN5+B5_RZkrFtLNK_6qj(PDQC@-odxmulHuPeY9~n*_0|*=5pRX^_P#KG8 z4PxkWb$r0=--flH;N`C**5-B`JTh$RfQ5AJKc9PY0uLTFFY1Fwuv**S-f)#jPh<3E zQ*@9Z?#-|vd>6S&f3}wiY9QY5+|J-xrX|f{Obp&W)@cHGOBYNb$S6rfYUM=kQ@>1g z+sel4_+bNpsV;0D-rw9)R3lnqlnzYzDdT^0HjjUo4iaUjANYO!!V9n#ZTPZgmHQ3H zao7b-_maAS)CHstSOxF{1HgeN(YgcfyBCBk%fVPSeF;qN8^Y&>WeyNbp;%?SnIN3Y zYxqBqELJQB5xC>j_8fr@UYK)CSK;OB@IU$3$n$;qg`T5oba(#krjYl2{)MU&xMJi{ z2vRL)9UD516{9{A4yZHPjM4GR^hp;U>n9B5aJ(8SXFjFV?r{9Z_WFpVz;`k_KuQ=F zA=i_HD)?Vl022DYO`)R@1faw7V>{0$2>9OwD}&+xi*>;H?E(J=T>8xaCAxsH{}3!r z-<$u>8nf{N5u1!!Q8@%eb!a>{yQjfeV!G{l@*aQ#YrGvSC=NS?xZn1uNd?=y+4R2b zc&im>Js^aU(glm>jZl(^WqrC6dHVLFJH*qbImpo#16W=UT0RZEx*0Od0%W*blgUr(FAtuESh*O88F?m>=j`o9s~J~NOVjp%^3klxDp zUt+60GNP16p;D|WqC<67OLt7{SP{B5#k|ZuFnAb9!gQj-n$dPHu6FsrAl%R16B1+? z(-#VYLZ%ZeqF{81khCn4Or#@D|B31oFN|UnO{pKj{Cxu1Eb12)X~AiKkPIl2k2fTR z%+`)Ls?7-eKXMOHDKyak70*S@7&NTmQb*AtqM6kG$90MN83~;PVJ(|HAw=gS5Y0cP z=EzfLFCu@ZtE*7ylGv!UxLbDI0P3jiU2;E<{bbW`Y7V3yL@Pbo{cr3!BmcPFBkir9 z`Nv~A2Y5K8Zu=>ptKnz0<+FK!EoZZ>>vfz9UL*^5>Vz`Rv|rrn z(3|T@LaZ!7=fXTl)!EJaNs7mOYgb&A%JxhbLP)aC=(Q*YxcE~|YvM0)V0d)k{#`ED z-EEZ=n|1}Y=*E*;?qqu#FOL^J4ieNE{bDnW`(nWt)MZ=3mRawaD8PK?5VMK1Pid}nLaU3s`1NivOQM^D&= z?XKQ@AG19fvoN3q`^I>3jR$TfIoA z7Ttri@Or6q_iJ$`cRuv=*B2A4^oZn@jt(Rs@Bf=69uu-|CvKiNPmJE88sGf_U0x}S z>2bj4wuz!RBd{wyFLp%j2aYB4c=kYk;j89N?xZA{{>V;gC1oTzj28W=+N(=ncp_#< zc)jQa4MW80JHl=*va$SNj3h}|5wQ?%Op>CTmE@C~0{X25*o5&U73cNi zI42dc6aj`E5}%z)vOjpHXbrygS2whJno6r2>QVv!ZAA=w4EfqS%1S@%__JRp95 zpY1!2bg2zat15%Ck7zcx6TSsb&!0VF9cx;J+qV(R6!u$=7f*C8?47{xM;R?SLH^rp z8Z~A=PWn~!!t>dcb1VD6f00 zz?Akob4BPzlnLZT%{F@$Uj#QeiT>RvCR(R=+=HP7H&U}~A{nNDuMlR*Oc1dD^U+us zGta@~K(fgUTW$2Qi3xmTrrgjG#&6x86BaKzk~KvYnWNP%m|XNa-KD!7n?l>Gxxe2j z%HW+IP_n42GS-v`^g5EY_vB17>GCJ!IUHsYrgs1$`nl)zM^#@hJQ=U$C##YMBzSm} z>b8)d1zE0{=EeOFbMLE8P5OQ}LSq1f&G_hqSz;^nyB}MAly~0Cy9=WVGccEzUxAWH z(o1*V;_Y{-?K*10j#ggfO-tsD)i<9K<+EzfG0*j)yOrwz)k{X|{GTf0d_dfBcdQ32 za2ECBh=W{UDIrzT1|sNQT|x0=T)!b?FDuur)orO-Q$<^OS&H_sJDK1kQMJT3`ZC!} z7|((hAy$`4xBjIOlzGUQ+k!G11>W#LXZX_6wVmgd!*AWNe;=`B2Zr$%iVK)tep{23@4)gn1MjJkebBBlG!CwgRh4ty@3w}ngxL^+;bbf>Bn3E| zf-VHp&OiKtgi@XoS1XLp_tj+D)oVXmY6C?_6ng;KLJ)r7QD*vkndQX9FLRQ5%xc<- zdFN%Ki5QHwXmrXh6C633VvGXw07Hp!Asp4pB&LleaXt5RIvidP%lCt6MGhfYKVCeE zBFo@lEi83PI0EK`DcY=$xV$9!tZ0cOTV{nlp3;|C%>ZskTbb!mnW;G_y*QaJWz)a) zKGs#m1RC0}jBNcvFHn=4W6c6xEg*ifiI_wzdob%1{#3^v(P^EvrKWRmP6s~xfTYp_ zvg(zIrYG*Xhv^2}%f~Fr7ZU{9#F%hM1L7XdP!L^`GR|{hsJ$p*eKPQh_!O_xku$sx z&egb;KGdi^v6y!DLba#3y6-|Yf4Q4zvf6O68)>pyak9Ii=4N3DZ>W^?X%F4uOoeT7 zECagLI3vwNdgqXqr3=qj><^{1xsNu+a z^uBybBnFD^UrUw%Ys>6tCJ7<|i*Hd9hps&L5yczIuh=Pk1uoQX$&W%E&JT;d)@Pa6 z(NtIUsJUXI>um~ay_Q#)nBKkT95pX1Kto?6BzfYRZxiDI-4WeYGqDZLtI7_m5Vx;f7?^c*ZOY1`}6j zMpW7Aa~JMC#&`PTx4nQ}=<4U+i80MxqGkY2=PUG~Z?Fr*GL5+B^)ZM^x)(tk3)G9C z8BZUZByqfk6$a;voW6UfMt+C}oeOpsuB8k3r&4kslSd`LMqz0Sej}oy7P>5d+Q_F5 zbx}ObaQpe>lQsC=lQ&Cz?}ikH!0LdI>FiDD4Y$5+I1;gm++aNJfQI_`GgegKi3{1-;AO6G=T|*uL*$-!T5i)bstp>K zc4T@Hl0c3K@oh>n1M=Z%z2XwKKd;y9*6`O8y{@N#%_QMt2JiOQ1UO-4F5-TEBMe0! zSlac73onGFQudwP4v>)&6O3PatAlc zs+I2(2y$4m+Rr4ZMGKsjq*?L*%k$-26+Tc0|dolgvPqo7!(eW6hYyz zS@H5^1tKERa^pni4hqQ$j4^4nqk@8}0z+fd!{S`RAnK8j8z3-37kj5rBsyA5ZHCUKp>GxWfPk6451P{Vb}2qFvH`Sb*s{nx-n_h zlp~6yQMZMES|b2yJi=K7f@v?dSI{Ib&dMECvT7$PHg@`FmSQIJ_zNe}aHtCRx&cX4 zNs&}-{f}Ym6gg88jZB!bbVHKEII_czL9?jzIq}FJIsSzD;K+_L49-PUI!CzyMO{?y zr{X=grV0*O=5Bj}mG)kmHMnb2SMgGIFqvYnu#3NJB7Zto2*Kai$0z%6MiM`R$OY&< zA6Lcbh&hA2Y3t3Lq!b&k0IIznTf0nkt6RHs6=!|4Xk&(f$evBE?~)PB_mM1VieIV6 zOg>WWlY*N3UONSC8LeG-%F zvr(Jo1R-aEAI$d%FN^7KfURR=D6mHFtb|N$pM1)NFko++NcNs*iipybS+qSo;4Z}5 zJOg`n`WQJA6B>49=G-7Pb9^zoUJ}X2{To(CCKG6M#5YLCRmzu-mt#^4p75c5Nb8;XvAzaY0a9x!37{)4giviP$X<67nDqt3I7eL29z!Y$*(}BT zV!xCHj=xX^euqPJiXuLTo$u%;igc1yI+^KBv~>51Og>@#a%!*M+5&IxLy?HYajpyR zRg(p2fnW+L$oRlPlykL@jZEQC^yOMFR-GsSvv>{B@O@a9=#=UPBv(CKkdu$~l>@m2JZ_ z_DcG%vO}NSU;n0z4^wmu=k8WSv3OorVGswtOWV@Vsn2a2g^)t?E2XhB?e7vHI!Q!E zCyxlVvr@gSV|viIv#G$0GP`1BWKZq76AM&WI;74&!x#qO$&aT6ouP@VPZz?wP(FY&F$s0&Z5&d~H-^Y_d-SSD%d;f=0Y z+yEd@%9J?F`ygq%>0f?nR$TEziM{1Nibi^}`vpUi$u)s!tE)jj;FS!}Jz#voC32ap zwECJ1fdUv1*z1hfUC)enAS@_Yu%JTw@+?U(#e$sjkjh}R!7GBPf^LIE`t}%zCjr#~ za>0l8fHeVPgZ=h6+MsfO&GOj_;PP$rX9}qq2=#tCBL*0ut~?;?#`#*flXMn!)7?D(dxtFLUX|9~_9XhUSfLCXfJEZp3n?>dlF zT$r3ra=O#D0$%!E2GyqKJReq)Ry(&|epYIiO#bvG9=>mB&C|0*qQr;e@ySh`a**@% zplZJH?ad1XPWD0f_{$x?djs|Py#D+f68~hvyM3hC0*-0(yWl}0nP5J}g>rT|NN>OZ ze2y#uf9|7zVR>_f0KP~G{dxz*^Sg0k5eFYZesf4TU?>QWD8K1-(eET3)G0sjtfa@6 zS4&OQcgWO)MEclh?c0f?ER0rFSkZMQpL^cM=X92Ql?+W;s*!C;)Rlntq#pHHR8OO_ zCO3cHx__>;+qixId}g{;{l@!TL$|VTZDo|kQC}+)APy=aV8}BW&5EL1>Tb0?>JyG3 z5Q2rXw0Z7}VjC1GK*730*1rJ*%3!34i_X-UX##<9`2LPgKy+!VHotnodq(4_yp zFv!eldAtI&<9^#1-u3g`B<9cNeYvp8+YJoc??i&o4%22e7Qr& z3h1o>FR+83*Vvc{ic!LzR?&nA%QH=4#rI~5Q!J6_FO5z|eWMwE zB4kv%bc%=%nl6-u9DSe4#Y2L0k7}b7+X|}czHNjI8o`_D3QGtNLfldgnXQ~LS8|H% zD>Erhm-V3|RpKQL+MR_ko)9lwDoYogGHGZEBoqrjFwPC+Qj<@zY3^6Ep%^u0g7ez>SBA1BRgRN0uzW}nxtYLV@=|(js8Bq0{w@(e6bEm3jcUZPzCDld6bd%E4 zdrPRz@=OpZI8mb#6%H3VSb--Y7GA|DOed3OieC^c$dDf8*O~P$e{W#-0yd5}9tT8} zN0*1}%OUsZW?xf5-HAuOrh1>>lYxSd<&|HB+Sw&mfb zR#a40e{T z82AVP2x>1V!F+>4YkG%WTxeq9omG+%P%UMXMtc*m3yEaV>F^%=XKom9hC6I@PW`NtFG0bnZjNl|zAPnA} zpNmZa-txs9u@Ry0N1+D7^E7;owCD$&+n|5S?ON&8Upl+!K$3y=8$TZNXkT?Ej&N6Z zZp@`A+RqVEW57oMbQ)keP0Y8^f0%(EbW?SO)YiTUO;A- z;&t@%@z?9AHs6KQq{u}aJdpf>(t8rr8Hn9dJF$pQ{gD>i;JdKep-`y>Htn2Uu7-`5 z?lvHIyEcHV9lV4QD+M^Y7orI^pq4}O{UXC`^WAUi36v;sI}ZW1PY7`ur!$<DVgedE#N6!OSj5$R+jMXzoZ!2cX_y;TlRpH_poHroIx}xjPa=O&&q&iuIL`KWb z8Zog(NS)K1#)*E&bt3N@(QDi`rY<_rqJAJzR86Vdn;@grSe)LdIv?r&KUjlxglNXmy_$nK&!ZU1tKMn zgU+xyI8x}x#9HIF0GK+(6p7mbO&naJ5j>})OQ`IrIbmrf_DyNqdYHNkEYvj)z!n;s zfr*yE0W?geZ&|DE>QG_M{p_Nl`b(JiiBpeQI|; zBpzj!?$kjg52|AfX_AR|YXV^(Z!lSD#Z2BsX*GHb7=&NdXxICXeH15_3>Sz@iu#?B zhoxc_8x{u|oIoeaLJ9TB0v`62IbGm>*t-;l6fq*;X9X2F=wvMNLaTde_CTT*sT%}P z?niqdO-+f>+Gl7U?c#)9MMPN<1(eYj36Lzvkg!4;I!dR*LaxVJ+gFzqYM7j?TleUR zl<}9IUo#W}X|T=YEDH6e#&@Y6YDuL3`zcCeKjxxl9@ey}l!HHtP1q#zGn#=TX);Z% z9o`QRAhe7fD%;6*SCRd(##_QB*6PG4Z9VsGCcUmHeS}I+{_h|C-ai4Wbq&5mYF7!; zIUdWt1&DP7cpF7Fwm zsQr;)zIUZJZB+x90)MT zSbTKDd!=+xm77QO6P>fZbURXB~ckk{T{!!{AJT0u)dzJq7FmS`xh z%6!>LLr{T2^j4mp`>Ba@Uy3#^+YX{|&N7-o)0!2y^1Ug2_+2X`zL{Z=9vzhjv&6ySd%+?kHh9m6?8w!-a_j zTn$CD%Mny{5b6}h9^YMdLIzG$4_vB4RiqJcSK(5-9VTLD@ZW<;j6dQU05X<;2GT1< z5Y$s=P57G3+M^+X-iz{b#fsLfQ;V?@_JgL9sVsH2B%m3tm&IQ!XM2uV%mQI-z)Ol< zQigsIznnX!4&x0yE$&DQJ1sb#)Z`M*h7cDhe-8%UxKVX|pL-&d508-y%zLxgOvYhL zGs+G$Yw43Y?Dz*fEi*yU+T8l^k}3Rt{xSTV34_(|tY&;>1ltnBG*D^{?W{8v8!T%G z_Ip%ZtEE;t^n8Tpx02~t6G70@3^q&?ZkM_XHPsnF;k$488lN&hwZRZn+`J0}IDkax zGu;WPTrT#@_}%b!Cn!QoL8CvOPW_h0+;_o04!soQWzeCwku`@#QBC=MI~aD!YJ8ib(w2dvK(n70Bz_w;zrXlG zfPP7cCBdHK=a}JfxRziPo3zkpK^K1{-)cULWUG2p*w@Qg_6@yh{mL;-^nN6LYlUnn z`@#lmmyzpxjVe*WJVpG@D9T&vd|yN;BRuM<(45rxI1usz;|kQ;-XlKQKpClL?!U|3 z89>Y592r0ow}svHfHIDP8I`f=Q$hnsfxXCNhXh^g8H6$(p;?nqVk*$Mz3zXu$g?g+ zxB%N-V_$jx&g%YTWp`%u!`NbCW{GV~Va5|r?m;};zX5(1j7`&_P{|Lg_Y72#Q1*GH z=OIg>RR9dRA?7IhM*s8Uw6{GfBvJHG;H{H%vPD#`8cD?k zkkkJZ72@fkn00&9Sru}4vBSPldKkN?s%bPIWS<99t#?YG2)Wvq+Z1bl8!LPI@=iCs zbn}=T{sCx&_%$&Zwq8n4kwC;$taqs=6pGsMFR@)(@A-JXG%-aH*_ zi_(OEN4t4G943~SyFzR*_-lr4Y-!JJI5v&$q5bHNMY(kA^fnw~f7X7-YIo5DdJBl;=7K`O%?SODj@M&+h^kET+Bby1wRFvS z&mc1IH0Fgq***N3OwO^lze6Ua`{JBP*p9Y$j^7d-7KnPQ(AqkkIZA`AJl6@m(y18FzN8?7+Q~FsRxWCGhefBXk(s5j z^jz2484>E45@BlI371>9j}omDHz|cOFGc_xjoVj@#A}k zMr#(KBNfxg@+ed@Axfr>5-j4cL@+{xr~uoI@My@VC!gXP;gWIU(yw6Q+j0TT#4%>D z1?;TTOk4Vl6fSGsgVuAPXjy~qH4EC_zc=F4E;o&6{(VkHB=V%spG{5k-V{-IZ1^p} zim(g9&3{2s^aYy7kn>ZMu=S3%TfN%qRA@rv(%=d7 zVslxc|BbHAG4twHIoe` zr_uTn@hc2n)$uKRODL2)jF#+8;O4TP8bjb8!n3Sa8RB(MFMNr*whxUYl=-c=bDwNyB00Cv)p7U)!DU76QeqRZ zkDQMC?_Ym1JeW04;h=Glk>0MvaPL0E1cnTn{2U+ue2AXEt&NQr`@FW}Ngu66cBH{K zz=~|yx(hk{vLxGxbB}9qn0rn=NB^ z05!F`T%0vet34JO_7>Ya^p{Rx+qeDe?ajpy*Pm2}!C8xHEvK(}=4-LLZ{DfuxtSZK z;>bwFVZqN~!MuDLT{=_l$nX)RZE#5TuQM}!-cxHw4L4O4E;pNdluj>_nGH^fU+VIZaG^uP8@Rb`a5)_p~}e_wUc4Nihw z%HdSaf~IHRzVS%SFizm=LHJeLGYOl8Fkmu;Lvnk3skO7KW!rvEDyR3$R=Hy^BiK5( zHzS~NwL-RQQ+*{WxrrU8pvkZ(bxQI)|2UuLAGzp&T2|N&7@V)F1Q>XPBETBGf-Tr( zL0!OgI1_(+PCXe*H@govvy&6oynB%{b;v=~x`*6pfW-ERte${%*}wg6HeG_IhI+U3 zQ;X8!I78qC47V>Jg@w#3-Rw+U0i3hfZ-KC!@r?Bm^CWOBhQ{=Vb^N@;HXb%+*lbogp~W} z;>SCI7c{a?W*Bm$vHaQ>TW~_}M7WgXq~rR-#1;rbTxrkqW_k1W_)>dqg6wyYd$ZZl z@gNqt3l_md7(ei@mm0oR!CuxErU>4C76zevPhhdu;0*4p$hm-7!>P37Az*yJexC;e^=BBQSeJTOzP^iK>S5l&eR$LDmiCD9{{bsN z)W2ux4TIYv+cx$2b33v8NB2(d7VF-x!*MC;*~ISbFC}-1%tV=U_olSMf{`@GuCig^ zNLoSRVV%2nmMRIEDGVOZZ1bbMILln0!fep!Dss8RXe#!(#Yn)EF0ema1)7g+d);2p zMD<0>)s%eq7TmvRT4|WpIKj_5((p0#=o-T4w-%wDs4#c*czruBuDoPwrzg9GolLYx zsPIBe>AeAZZ%}v88v4LJY08JUNufkjBg>Ud?%bK2NX@j+nM@i;$xKWfXrVEg(Pg|j zo*r)UU{5!>_5RAKKt2`syoGysXC!r~}1Q7nv?CWNadld`!4nkgH01a>hj$K*q8AJ+%lI2%(h9 zv+FnpV+Bi)rPzpZ5h*)Ra9U1rxHlx#Yg5Ye7blpL>R6I&`9|yzll27wd8#PgX|c=_ zI<;@kLun&t=Q1B!8;_tKIB96cs1oV zvv9bZ8rQXmWQ5eIsP^#RbAK5t!|sk;QY0qI_f~Id>*4mW zB|9U`95L6%Cg-TMlxzzvAt42iNjWVReCqaQa0%sB*AixO(Poch7w~<6!DUI5drbBj zopWYIRf#|p1l*U9kep9YCT7y;87gG^Z1Djbeo7g>4i}@F5%OeYOcaS4E0awJrKzc6 zuBd|t^Sf258mL_mKbE=C|*^aTc7gcsdvkHrKdg9L>$@ z&enGGb;sUyv;TQ^FHvV1l7LPYQuZ^x!VkKX%}&lDN<}8{T4>d|OrqH4v8**jX`o~Q zCek`}*s?Bq&y*?d5EPt>3(;bP41<`oBzIYWsXZe%u~aOmHW+!;#bULoOu}7Y07LyA zw6X3uw|YMeveO+{rXpL)s!h`IDhq{5dP+QH%4yWAVkF9N4duCJKp~4?0^qMYado*= zQ?j&dM*2|IDAqo26$ab>2h2Y`b4V}o6fqQrO0lpSNo|eKAA`$|HoG_sLDLTS20s`+ z>{_!;fZ&JzgWc~rVw9>pA*a${Co+4k!EgRG$?+Kj<{Z*9b zvJMI7Um-T_*i(!2a$`8mJhbv*hL(BSO%}cZi~j%H7o@9&EJGOqHRz#tW$?ogwZw>^ z*u8~b#$X`SofiYXz6=s8|JUXY4$gTuIH?n(;3yOfh4cyqk0|@SrYu6%Ox8l|)@3iN z{)-f@Wfe$7WGK0|iVyifZG^EPx68DQ+@u1yAEI^Wce%bJvTf6Qe@h1pHJFf+p6v)k z%t5p>@J*dC;}AiTm{zX*;K7ZDE}Xh@gmAFr?+ponldXYPLl= z2qN7<>B`sR0#xMm=*IQ&h`e`2iEb6r7c9|2iW@ffauNMgSS;9vQj+cY8)QjGtgcgT z?KX7>7Z)cuyj%}v{bEp5*NctDh2o~%FceoUjMN{#YS4gwm}AWh9Zy8EjJmMb-8j4-HLF+fw3`m zecFF}eQR@NLkFJ?&6kyD3)z)}N$C^Op4VyR+bFsLfXT!y&*#e-);LLh@7N&RX+_Z0 zd2(jmpaOL*6**cv7|`3%OOdFB>fZ+2z2TofuU8@B&$|dw_#>SX68I>)S^KBjCtHF) zC1LCPqTC2%M2NrN5od^Oo>U^CGgWRhk7J9YXlQ-Wk3gnZp?0S$`4sfSF9h22j~u)&-SHYaQWcJ%1@o~)$zA7 zy0|Y(ed*flrcCvuqINuOQ>?fTtCo(z$=+4PDJX*3oA2TbPUY_)QMdA8HHnA1C`lRp zXSGPlfzEm)<+yYvt2^k4ixXRUd(qJr zs2pU4O7;$aKLPBjniwIBET6A5t1C~AP)F7iN5Yy&*|c|JIcYs1BpE^q zl1J!CL%215V@V`Q271^DB?~llgbHO+Jur0r=s)rAw)fkn9CWTSuiCx&-}RFR%*%lt z9ew-M2gcI_MkD5E(4xVcpf&%bfi*Un1cXi)6Fu#&F6amo0z!O}(~&weyMiPqon%Z% z2v(|vuWj-@o_OM`+CHCnai!wFR>1Tqi~i8grpJbUI5y@#!j6t*lf6rvCJMKAt1)zY z5$7xPg4a`K-4e=tx)3ph%Y88#UbHAg|T}T zMjoA-$jkX0!q{l!GX4BTb>!K8pvSh>@Hx(Gx)hc;|8#g0NRH;P&DlhyDv!jmtrVet z$CTYfdLE$5eh21sn0;pRA3^{AMOdqc<4uYugXc+_m`I0JZJyO`n~kTN$j24(&FC{4 zVm+f@jQ8Q?7hsojB)1jMIily%+~^r9`GIL2KtY6 z$3;_*_WF7gZpa<9`m7z%uh8SZyclV~JrT3&ajEZvYuH~NWtR4?zZ74IK^Hp>jT}fw@AqiceWQ=qbgTHeR+(_Eq zD;*mG1T=q2&BVE12e)63Xi`(@Y^h*lvZSs?YBDe2h>8v9FxirY_)YDnmH_^le$Ric z`1c{ETiN~0udOhbrk)F_O@(L$co$EvE?vacsA>|FWy!;=;}p^^3Z5kbK#gN-#!7w^ zT-qgnbgm(@I}?ag7#0Y{<=SET5Dmq@hAG>EN1=ZF--;MlSKk1yje6EYPGd+^MO=Q7 zCRtVQlLM=5d#;|i9enbMI0CFK7l|sgCRObcSyFO?GI61f7-3|%tPjy+sYpcXZ|Ji7 z1|+iNJ}|w}^Ezs?eu@6yi0uI4rq)s*519RAzFEMRI%;SJV>MOm5(s1||H@J-CdNdQ zE3=wd4o4$XnYG>k{(3Y%{^(aQK}i(|l+?L1QF#{YFBJN37VB@|!PTO?_d9XqyVos| zp0-X;h%hmn)(7bRk}o(Ffl6h?=2R&6w5GW|Eoq!lQ6=Bm>`G5-aWVUbN_|Y;J!;K8 zy-{zBDg5<&(Qg1?!O6qDM$4J*;BLTPIUn@&uH|?6wwEUJOPBxuo%66#IXTzH;Rwte zLatm+%C@q(uIxn_*$RrBNFd7?G!a3-so*#nEdxph z#RP$(r(^JWK&b6Z+L@KbrS>yn1y7Qq)xg^fa1sP2ha+q-BEsp?qxfuJ)ltm`I z6oZx%$Z;wSmP*lLa5BL2%28LgXnSwR;t-M?iII?~c#STOM$_X6S`z5O7j`FfDGa(4 z3hji#IsvHOxjFXk4DY%nfQ3L6Z=3zO62&yiRZ63bjqdw2^R-kG&m~Vza>~7`=!FPW zL3GSQ1bk@b+OS!0=d3U(0PYL`TrKkBmM#e)Dq5t(chkpFKXeV50oiLwE=bfF3oH#I zPpviPnk`%m^3E`qhpm3v1HVP3>5o*J0lJy6F13FsJbGC~)R|}tSC=RdC}dnLMzQ3n z_Yx3PZi&7bt{aL7-3w*1bkY{xWN>4Z1p2Eto@=QS+E-jM7b! znSfz&Rl!C5f5XXe(Ega%|0d02w_!H<#80}-|BYX1Y%N9!B^nlAuK_G!a(AY;=|BxA zkf)S!1V)`WUV=(Z)}Hk-+|_$d!SCEm2V`fvG9^dWY@-10OUEU2yR>(Ymzf=9;(?yYT2;sdmluZ?k## z{jMA6us>=IdMj=!zj0!aO7^Qs?~E)LXLOkFF5o+k^c* z6Z4<{1hOwp)4Dw;lQT&*xdSTG$PbB~Dvyj&O2XQHctcqbsn)3@<>cQ!v`NFFm5NAf z)|7zugWYci$EJ9sh&?yo?ER_jZwl&0)7JN?eexRim3RGfY3tv)&)Q9V@Cc{;bbQZh z{(hVFY3W7IL@pUf;D#E{I{PjI);xjSUjuy#9It_u_(2^rN?=gq45;m+5%_;DQBNRh zh$Ny`Ph3n5iJ%>YwM|O^)+^CpLCvjbROU=%>eXKgutzrbgmNCD2#b4$2{A-;GFGP| zkFkCh1-vyuC9nNI6kz3yrx&z%k*? z3@PaUhyiO>L!J%-+{r~JiU54y8b%-Og7AxpB3(5u*b;r5LzT>*PwnI$kFo~is&yh$ zqVNLkWx!Mx*3KGroJ$p7IgfKZ+Ok4yw5_Ap&_`$&gkRXe{b?1||7~mxn4b4b8;5gD z%1_m~rXj+~Y$xW3ar5Kq9pZI}<5_m_VbNxwYTu+tgqxdg&)Qm|btkGH9||41GrLph z&I9Dv+Fk7rC=+wfwp)y8ce9grP-b|&Z9}66u z&UDgHB8YwXKIZ$+G2V{`3|jvY)JG36BY8tQNRU^dnz0sFM5Uj?!j-G>nX^J&sb&Ul z87o18LkU###vg`^kc=YWprT}p!?j~UZR)N)u8K%h)f#hnur8NG%Stj*veL=QnD$p| znN@z{XG`yJSxYpd(qfyXVk+{e2^ zdqR)jc9)cHAa8(Cy{0;gFN*+6LqAUcc;dvQZxS%{0L5?V>T=kFqjYvU>=d9Lf>%F#4)|n|{FfEB{397T=Z=y5=(=P)}=CPrs^c2j~*SL#d8 zW^|fN%nol(6Gzi6^6=>e3MD8vS0wasYrj&_>gC@JzOYQL`C%D=aTKxAy=HpF?6#-~Vk_9P(@>`u=Gw@*KMV{HK5_e_NLp z{C)iACA3s0oj1S~)6yJtU`=-WJ7@R&6Q@XOPQtgDxb0E6bHKZiG0xzK{u2;yNACQ5 z=hnve1N0y6{qlqjj$HaMToQi^gmewQu>p7A4UHA4r>7UR|Bx|o;M$)6f?!qFE)Xif z+Q6lj^Q5n+ovtf_`Idnn554^vJw~ZwRM9w?A$&Ss&Ov11~;P6eg6PEv|Osg zPUUhORH)o0aG1ljld*tuv1f=H+ucjYe))eqJZHs-5fQJfDPR$l&JS^?G~`ms^Ag<=_iAcAz!$s<-cq z7xyWscjzeHGGYL{QUyfvO2t-uU`0lL5m8;4f+c&vNP4!H9 zs*pl5JET|Pi_N87SkT$%=(jP_rE9h|mk(xj{eb*Dkxn-{h#Za;N72*x$_yaVT0pd0 zDcsG9#shGkg-mo#^d~Baz(pT{q%_2lNb10c%n(EF!R%orwbZ_-#~_)Z{&l4*Oct1+ zqW3IQ;c}+To!S#C!WEid23+ARWw$go5ravLja4l{Dqu*dZ{=j=vOA4Nc1IT4h+f|^ z3>~ObAWLWGX5cl3xO{=2$l${eq0l1VN+O>_PQ8)XK398)yYb4e%7U!EZVB_?Y+PE>j2^%{l+WY|odLI)# z1t_!^R~Ku8t=d+c&KGEQKI=GpbDD)`dCjsn4F4;{P0vr+(C$;?dsnk?STg%oVN&`s+c|}~Myo4{x6U&786)O}) z{Bv6-gLK`8*j}xL#O(eW8~fX?+M0{a7lAX28k>^`W`3jYH(=<`h)c5i8DENw^aAwz z+FH4yMx#+Is8wjS3*_uq6VX#Kr&Jy?O{9r~wl zj>_D4eh|f{Gq>e$!+l>}DEcR!x3enQz`A33-jZ(J>K}KI-smdmJncSUaL*g*B3qU| z-CSV6{I*v0tog&*v}esPz_=MOzw+}`24|fxVS14u^n{mKNaPXC zj6TL5#^_>ti6I^2A~KV#Cf6|EWgcF-y^K*F>I>8YYJ_!RMW9>gU(*BZgDW$~Dw&@% zZJf=VtHS0tanjT#reI{mZ%$H-zV)|ls#+;0~6Eh2%4Kjk_KuMr#&>-jp=r$+;`fuZ7ZLz{w zdu(p(KjgR zzzKL5-Uq*h&>)luE2045L+nHRjF>?NB5BARWE*lf@-{MuqM))+i%>^U6KEQ`8GQkL z1wD-sFg2JQOe^Y|nV zj8o%0xK7*&+;u#OZ@|0p#rOgI1^g8PD0e4t33Y^Rgd2owgcK1;WE0bgUBtD-Ur3qob zxdYtw+&$d8+#B2x?i}|Y-fW(ZhvKF28hG8jGrX^S2%p1G_{;eh1&rYTf_}jk z!BN3A!GK^w2n$6aQ|J&@2{#K5F*x_ly(5|-3KbQLc8jiv!^P?1_2OT}69Xb72nkIh zl~~xnU%iqIlKql#X@C?e#Y@>zjnpMAlD0~BNN-Aik$wo8Cu7LOGMy}2wm`OCwomq* zY*hA6K2<(fj+Q6N^W}B&4*7cdZ;H7JgQ8t=NO4wiPwA%=C`*-xl+RQ_D!r;-^(YaV z*qQiF?N#4WztQ+>?NXS4N0jUzYnR94FdDR>>CKjBBp)wa)Cwm?=RN-T3Oj zZ!4Z3%@fwFqG9c0Madu};Ef(I287ud&zKlC*CP}ztZPQA(AcHxQi+7*&T&=<5tFaC zv==zDI~SjLE(yae|JH!-&bV;VekpUdaSY7S-KKFd*fhUZ+9Sy*?jNh7Kt?Nvc~P`7 zZ2EHICT_rjh79CJFE-&h7%;^V+>nkcBr7`%R0`FMp4!uUP2KV zMv(gqIu)plu3_NDV~t4(uWlH{;j=i_7MUgZLwVZy{FbIUE~C+vUCuw#(L#h9)>K7N z)%#rSq|{E3iTB`PnK#?W8KcvzlnX(Aut0z*ULnrz@6)b^TxGQ#!sL&fmVzfkr1iDuMT};XfWJe0^ePjT!y@ zlh2}e+xB`XI;ZIHcmPfMmK@FU66YL;WR`EasFa&6l_FKGNqXe9v2MhU4I)UB(8sRwU6?NmLiR%7@{z4bgqu>ULth{m^epk+=n<`vA`wIJs45TD z8|l57sKcr}AJ78PV?0dUyYW17tttAp5NFlhObN|_GQGbqAgyeZJ$+w2dRv;Wd`036o| zZi)j>T;+x_6ofMdkx_}rs*VexQVHMKL3FJ*#z#edO;UsO~CUfXgZsHq}=7U@+Gio zs1v+>gw{>yQEL(GceFd4DWted6AT;`hum>Z%>{U>{QPuKt$;YBfvZcq1gyxnz~MsGng7H-JxqMBce`1|pl;w=GC-W}C^ zKJtmOOhF@miP-4D;o%G+%EoNoVJLZO-+;u0_LpdMQymCZ2|ILDao=k#o|c9Ee3d~3 z4nm2<-4cxJCs@CyUbWXBI^ldjM%{ z*v^-4&V4_WY4?XVOvcq#0XNCY&O%LX!_l%_ZPODa>vihms8qGyT z{!tX1E^GJ(8Jkpzda;m=GrcNMp`LkCkaP|Fq`E*bBIU0LlPT{Sw93+W;>u8VgX+m< z)6Kq3UPPCqaJml-W&>Yp+!)atGaxri+>H5F&*3Ir0X#n}*yl4xJe>8RQxanT7d)*f z`cGe@(pq8k&;C3H%wp>8-x5xeyc*_=EvmY83;}jh5|Nc}L8RsoOM~k*VcvO}bpPN0 zgpW##f{A>0G?oT7J%v8IIoQCw9{9d5zU)kY<84KY0r zQ_kG2Z@P-5I=~C*)=+CQ3vUXG&BHMiUPs?39{_N6HGI-}#aug`@mPsOBx4aTz{#A6 z%aIB!lAx6*TeZG`zdk`f{ytEBS+U0b;6M72%V1WQ`N35qRP0EU05?T4JlX@*nMUJj zq(@A5dIQQSPEE&Qm|)GwSVD3ak3wdX6m@_`bzY-0uo(JVqLYlc-FQmcO1fg7J>dc> z>`4?Q)CK`~gBm0Fw4ps`Uq_sQ4uI%^>R2XWfOGM{!HxOz-HihGG&riU>ln1G4t> z1dW`b&W_A9Ey?pmv}Nyu=i-0kojBv<9@Zu+W9Jofc1*J>yCxsy?-s;XHVMzPh# zGOyHldWQCKr@pIO;~lA!@A*hr{ky8WXSmi;M@kB|s$6iUQ;7yPtfV=(vTwPH{X0Tl zU`r#pyJngb6*)0331N5l?meKtM4T!jnB(?u`C#=Pm^6<457*|S%YrZf@ zCAfg888ZNCe9J|*&Jz#9zA}1ULMvma2x40Vt0sD*_9NnpQ}bc;>;|(}T-GdOz)qX6 z+rL2Q`kLzxWs}CLjUMN=1Q$^HQac*hMRa=*!#z}O43Epcd~MOTPB!j(=O>WpG)M|G z&9FPDw>C^DC$aai<>9AdHIGYz!?=tnD`qfQjIgV!7G1)l{N=JmA&E^TGEO>Q=f-v{ zQ+7quw;-;>hCh~D>Sv?q?0ny`(tNp2iO;=PG`KrcPD_enhs6csl!}**p<%AjlPqP& zyzAcve8Nuc;Mf9ve;Fa7WR=KL~Ws)2Nq* zX-F#R*1;H2Q$+558vT6$ui=I^y)3*X9ByQ8zB6mq_e}t~Otte}?qs$4gsN}k6bKPW zS>w|=w_IHy>o%}~vST|zF3 zc)%CjU z)Zj7Y^FGB-&u7nlR~@Mxh|22Wm-CbD`?DuCvu*l23y9@P;XF(D^eDrX&r+#cvXEO; zndBwOH{aGciqaAxSc&X$Peo10C|gBp3^;Q^WVH^oZROmt4n?+69hxa>A2oS>ozjoD zS+U!kOx$MCTD2U%Qr;fcxq=9%8Lk69k~F}6EBFFgGbuwn6>vG9|!MyZK$Wn{YCEmPrh4R*R|U#bw7%g8?M#hH{Nphaj<~x|Myx z3^HLhuR(d64y>IsykSF}{9F#zf-tD!fpB(!l- zCkvST9G$_J;EAr9PK@ZQWdKqtvkG`v6_;-~$mVJ$0N#%&q;x02yimzrd_9kkMUvBA zRlrV&XMck*KJbhr{VEC~jFmf56oK+``d>d+w%kG-n@NM7?aZ#ngWDYsv@M91o+oiQ z7*20{W<(;FkM;Hr12;cr9E%BlykSnP-OfKwiL{lJ<6)u9U9a!I_UD0pKjqeiyjw0! z!^gN~PmL|6v58~v=)A+)DZ!s2dN*&KR(*M}9E}C`gLr*)dE16MA}~ZP&fL5~`j0YT z+3&uU97?d#=tU)f|C}St^P_49BY0)pt;m>XFjkn3UQZ5SO6xveUt+K zb0FsGA~;a5uj?A85;5ZZF4x|dR-2lx;aBCt@@&R;BiPIUf^iY%Nk@Q?u*gj2It?)= zLpvnMCX0%?Jhq3=u1kacVBRhW$~dO3o3ScX3qqzSr9b>Z4ppW|seyua5U&D$mm{aa z>5!;R1^GjGJ+Ls!5T()?!cbY8CYD04WO?U{(pbESO3HRh!z{m!T=bPv8+#I(`N-ZbX%nj*AH22#_ zVH9|}=ec6qT-$Q1op5S%%o1cmO=nb&1DCW-JAxp_mBc73MS=H*xbnGUb_i$eW}12R zDx<+rxWhWEUEK<s#}qYh$v=cfi*QYhoVp@0RXV#5FBDV?1b> z?!GEbAEGl8Bx*H9h6`Ipcum>ng{~koP)G>13kV=__uUir@;V43$j_hTOqBqLx!NoBU)J*1_G9*>wCCnw<_eAl17sPY0Kyd;ZtLe}= z41<*t%LdwhnDl!wk`!5`LpAbvqcCw{0bKMIpZ`*Z|0!Dc9w2r}vTtxNnBb}=1V%Kb zjOQd|>#3wb&@t<-Q#F_G&Fm;eMKF}~LAfYy(o{XQUE^Y~HRUtLBO6pvV>8d3-3WbT&m!$eRwbnqTFwM(b z))1#wO7Jx=RX|n;o=6I5$^PqcfSE;>V`UlI;DDV^7X#1)<^z8t7{b{#Ib7D#Tt(* zP>ne!V{l>3S)KBp`HScyK6H%UMxHxiO(fGEG!G*7K~N#-df6UgTG=|J9&07%Wx(U* zM^B5QHB-l^u8d5&-f93XT(KxTDSqzvT~<&3r%3XPekUTwMpB2Lg3PgTKEou8@a z65D$had-^*p>))ic7i+bDN6wESqwGRwScjt4;t&ptcr)nFcY^+8>**ox7GPO|Co_8SJQ3E0Y{mQ`9K{E1UEJ|!;d>ugva!_MoJ!)j8_s}> z+Qv6Ob7qF(+E<(|YKDt9pGqvn{-Dux_WZ*HIK&c5Fz2H0O(nys12EtW`c;0^^(4xc zbx0bG`L#fk#IO+FD&_|&g+$ndhvC!gSm~Qb&ke#-rL+%%M&l7K6JtrGp(%N!5(}bW zc!H{2)T~*`PPG)8eN~!`#3oO89W~dXE&A=t2m)rXA?TivM-A|Fe~rlm7ly7U5pe)^ z1!mm+*1v14$1Z257F9rN>K$-nJ!CvQ%T_UH4iGxaVh(t(S`Sa*oaLqT)m1k!>e!H{ z;6W6i7i|9&!}3?|f<8UJN}mF&m=dpzmyFGrF1QqSw`N&f*)p8h43ofHzB`eIvF6SO zjxn{%YvzR)?_{_Pd*Q!U2s8w?aB17HA*bq7Im-AF5BtT;Y&*UVcZs9RlrcC`*Ju(eLNRbToT} z?g_8nbfTGyjE#LRgW}*?4b^!Cn5$v5bm0FvDoFkY!Wt;)Ok~<`37yZJFCO=p?}wu8 znxq<(PG%)o!^ASzI8L?uJ*6`|oN-=RoA>O_eL1T(8KHKPG1Lvv^Eo8ud(A%WE6{4 z;?GW8X3WWBSHpCsRm}_@uA>%3+@An{c?Z?ZE>tfriafTL#;Z8~iluKZbr<5nS~j5R zRhCt(L^1Zc=Ke87rCDScCu?r>8de~m;-G#(*vdGQVv8w~(m36-e0TDo=s8H-t^#+= za@N(Gti-fVLFH23FV^e*Fy@POB*iq=wt0__!W2mJ9TWxLy^?vgfN4_p0c)kil92oQ zK+LaC%gu8VFpZV;%^t(=70y%?y6lD=1is#7Yq|!hEDdPl^4y;=ygWe_y~g2lFjeKF zJGPyNs6Da^av#0k-8=vlRW)m)Nc0+O(4>fahY%IRxl6L?9OFbk;-h5l-$~u`(W>t_ zYFuEc$^|c$=lT!AVTEN+@`~N)yIk!DC6TK$$z6XS9U)6Z*F6JS4;}VkQj()y)qW@z zgynZpil0EK!iDw76_g5Hjc&JK|7!bW${wn9bU#e>z{f0w)}{`ch%^NH0uQwx-H+%3{8Rozf0ny*{mVNcSJaZMh7#d9F zeD7LCKfjxeGls20;A@51JSclO%S&dad{H3s(}XfFxynrby)9Vr&qq{{`<{YvYdr`#&97RJ(fiW0OaZ)|sJ z+eZv?Q$<3FmRmfhF5s{QnLag@cCHbZH{$#(J1G&(Jtx*^%y4^hVE-l5#3mDT#DJ@g z4k~aOLN8-ZCtIu*BJUX_g3>%@s$dzwlRLcC=Bz^qlczr?phlJSZ$eLFFK&aVw>f52 z=Fk)GP%IIT{Ep=WcG0`$+J#T5UD)`pW5jC&uEc zH>f>XqV@1_hJF%xU3!ODS8mCl9nPf$71e7{f7h@@d3eXz!vv1`dUUU;9i*X3!5p12 z%HI-Gy}iRKJIfs|#HCkc(wCi^TN$TB#lK-OBhLxf1eCD%nSDTk5)2ADC8 zn_r=dhH+7=3pGoXm9e|tz8Bp-wZZjK>k26Flr7hW!aI#QrC;D+?}C79yXL8k*=E$k zUdtTbC;I8y`8w3^ENg(ctR7Cc{nEq5lSp>XpSKaUK6T3IL&T>GL3Wa<0*bs~6;eoKx9 zgaC?1Yn4Ftcb4jgIa!mKkc1lJw{LZ=Jv%~>`Sy=Ji$uWgA&@>->*SIfTqkx+SIa9@ zR~zJ&n_nju3bw<->T27#JvGKo?ArKim4(u3ed461*$Lh)&Ugc$0PZP3ho10HpNtR`fA62?qNVi z@{At=tXLXxJvKbJnY|gSuD~a_l+)?l9WU>`0ueHSu^QaP21qYgri}sf$k^!AHt_sg z8h0Kd?Cl`j4p~a!Z@+N2z_KnY&)dm=iYR---c5M z$78?sWwV+NX^^dRbz8(p%Q()ZbGmrLq070J74dpmS%F&ebaZ{tajr!}oM>6Kr)G?N z^*e@YNhs-g?I{W=PUiTVP_uODTS?wG01o|&9o-XRRPv?YT51!rDNc)g7h(hUTOG)h zj2nx?I}OZ(S_`LV_35~5Kf035?s>f=L3lzpNNlOwGvq?4cH`+9 z!n$S2E!VH<|sHtZ{oFq)I3F;H7sg_nzejL5`aUBXr(1rNC81H*JW%< z!Qz#~oonVhYL%>@@KjoA+*)3z)a%qpWp#Ju)4E;1_sDO&+w|Z2SX0+2DFMJ`ujaRd0-nj#F>H$L z(0VWaX#$mv?kTGZD@tjuQ^1Y_MiZ?rioW(pU6xWqRRsoV5As9V;%{#c)NV0WtEAM& zTCQ1kyU0cVR3g2vT1~xcL>*=w^KTV+u)c%7e479A$%l!jz$oc*wmXMNd&1#nUKpIh zUoFUa@0yJh-FgXPIQb;EhF~&5IsoEZZf+Hp(xr%<0ZnXp+bHiej}$th{!R6g+2eAWjR9J3iY=x%-=-=Nud%}P;9 zhjgBuo0jBE7sO*LQaojEGOJVW^Nw=CDFFv?eV{P)B@0p)Tpwp^f=cERO_n;jYT0M; zK^blrvL|h;XdpKJ&BG0t^yH8X$S8t(Ym&A0)VFgj1a`lDjb*P`@JP9S(qT0ZsE7at zAZL?<hGSL0CcSL*~21h=c?-aI5xs7BSC@ zYrIlX%5yN}8-rW1CrI~7*M{13f{--d@*$ z40haa;=tDZICb<`Wig4RZ5avoP7HhJ4PxL_K=>FuGy^SXIJDiNH zY_xv3VvKBvgxaE;D1a!1l2rO|)|_`kg@*qYcDY(y#?JHa*c*%=gO#pa_DkGe@h7H*?Zl>{PsV@_f)*$<@lyf^P}2h)#E z5tpQ3!@+lV5N1??;AN{@oMGexQz0@oepvw!n_`DRHH6f1exUe!+#mrr8S080fzIUs4~B6E__(JTFQhPzfG?i%1>GUcPL4U# z)i}n8Y+7EWX87e=$N4tBUX6pVh42Ax0w_`6hxkoUA5Qc7c#}G&iK@)gB&0~0Sv?Gy{=gD4rn=eB<28??RYnWvcoz`-A`rfQ z>XC;2^oiahsIoQH)HHSe#HkYD;=y|cAr196B28jzL5B3q5XezlV-A+Ee?+eD-XpbnxQ0LJjXLYunFu8V@EF*A5?k7aR&M| z-0AQ2v}ev)Brs^CO$+DxKnli80YQtX#(NrpaQ^e73=l<_^BUC$c5wU|6Wxh=)&Wl? zu-Y^V(rlhKCj}q)6n}^(2e3Mw7=lkK=QRUDY>YjxbHQleRbA6O55{?JXcB|toJF^E z3D%QO5t_c=G%cwca5wf{o9loze`DCK7<)Fh883hZgszDu%sfQtZ5Fz0uKYD@ z^kZ4Uxa{bw=!3zqkTp6Qs)7LB@0o}SCdoqVo4{H;s2NO(&{K!^jym8(mLCdtPF}B& zOgD{=R8dKkC4nO$*|CX8UgBOtay-&A5wd}R#`$We1y3rB*P)*3q0I$_PR#HC6C1GXCYU*JG&{D+ zL}NfHIk;z$sv&Cvd;V!HT=d8k7z9*9~ z*&Kj4!Vu`rH)vqRatDSGv|qSc`kgLfnk8CEn9pNC_E)9NQZ!O0M;W1uNb?aFjX*Eb z9|Ro0%>TYYI8NI7W!<4tjnl@U!o+tnLwOD<6wv6T^M-dVX!wMI3Ng;?e^axU9tLNv zR)JB8H8`kNt(6!pIUX+k$jN3G^g(7(3}c%Tk=n@u28v;#M$;$Zi$*U7MI04Q??q3#S37k=6wXxYH*ERK*a z6mAr<$!jr+IVj8o9|Q`i38j#R=?h|a7-=x2O^wG|Wf=jhYj!Q3OiJn6py29SE)`=R zJyrQ#9gyaLF`bZSCn_p5+DXZj(lmzG!l6j{c}Y%{61cu?-N+fhhg1aVgnJMEifXQu zO!H3oBc;5AYH3HViyG!kRnWL+d~Rh~TuL`~iO z#9p0JiJONZb(KAv&1odXH1I4tlU_>wM5?A4dLgF~il8)N{Ju2LTLu#Fm=z_ToX`1zjqMq+U&-=C_tgGO$wcD-?7xFNjT`<*W%)Lg$Xaj zcpsg^Mnl?_5ff$RK{t_IUawYBr?gh8e9#{10ite|KtN)zoig5XHN zDC)c57+xkPvvCT7J3?txNP;NJx-E*fE{l>NiE~5}0$@4N@>e9C$;97;xCYQDgBI{` zkB(?M2n}F1%2EuD6IGpSF(me;W5f{RypGnj!YkC|(qz(qoalZTZ@>gO34tztSD_A< z+xzyXTD#ex*BMOOXuVc07jl`3#*2z5u;&Sb5;mDB5cTHq`Tav9{C$Yu746+!ot<1B zBz>(=Dkb8n$q9+aiMt5`0|IRhTj7X%k0&X-FkXO51K)*rI~`VwQKyot{h_Mr%8WoxQ3UYO#VHqC8kt96#Wx|tg)NP!A0dwI<;A0jZy#LI^QhQdn+uCkS2X3e zW+9EN(70@}tXAUtc7;d5j99t4Mk_EL#3XTC#`dOUeH}za!SE#4+!7D>b z>f_o#i^=iZFvbdTT2mUF6SJp^&pv6@zy*K=o|NIO{g*7Tx2nph=N(9&A~G`GHwCrB z_maUM3fz~!tHc9IRM^JNH5UbA& zd{y8jDcg)t8EmGJ=HW5Mo{DGN()!ht15YY78WiwYNeW8@V#VWDm;*?p9D$3mEDvyP zKu8B=WO*!MqoGc#6^UJ3Yl!Nr6ojg zK1iyO=L?2#21c;GaN3a>QULE2XDrAts>rP*OlAW-(HEo$)Alik<9#!}z&m3Ud{_ZA zN%mK-;5o{e)?)y>T0tN+vfXClvKDzog1XJqC@K$nYEdW|`eEW|p1dz6sOZCCBAOP< z-oA(Fmym>FGQ|zEu&=|Qd9=*eeOdsZL7oY|2D#bQNKH)=*pZ*1gV*#K00j133`15a8kLE)*yv&=#G06AkR)pOevZS?%@xS`_dGhxPC> zEGy3`$M@r;IA`l32%(_-=oDu=CqW>m>9lfR zJe0?Ro`OP;E;Od+?TFgjN3&RqB}7MgQgdA^>aJYzU1G-J@uegzv2$|B$-4hK`gjf1 zF5%>Pth8s+EoFbOP#g3(j{%Zjwtt$uW&H6Pkym|OT*kx z8?HnXF(5&J30uaYgK#-}+nVg<^GMLtep5~^z9$9cY8f-GrQ8(W&f|~3zKS=Q(Qj~vLgEFJ<@JO@KC;WKde=kk?M*V9$I_U8Y0>I!s;g`9 z(UL^pv4FOVw3G(1De>ew_^%#TkK&+NdrIdwImN&LE;ytvQ-|~Av}Xxk$%#n&Fgw{> zEC&7xw)3P!N3f;dHVoQ%lQ!EYOaC2{mOmQJ=HT?7uDObS>Cs&u(|>nk1!PsmR@qo} zg;rZ!3|n<-HatokT!4*@+6=o7BW!Sx=PVw&l!%%QY6=+942JW~wL`B-@i;2?V9vnJ z2_XDsvpKL}WxT{eai+RHzTJ=~gfjsA5l9OTwi&)S)0vO`>_htd?=E_p;W%*&HQX^t zdg_f)Dy_0H=f`UzbO}{xla6J2J0jQc6M-jqk4b=;lb;xd&>&)rzS(ord{E!ZaO-cG zY35CC%mGucFtRbD@M=op+n#8&*#tCek}*UD8^;ww4ac)-Vd3~i&p`1lPSW*J49&wS@Z=16NmfV=vWOKjLsY3=QJOdpB?2p+67c`x|mkn~7v1dZr7j;PIS z*s?uAQ2&RmI+&!6)&uhCcQ3R^idF!QOIyDqeFSAkYK{DKc7{EaAr3fPgZ8O}Vb_oC z2i(g6bzs{bOPc`KiJhAzCQ)gV?68B)k)Hq-T-M9i|ELPV`d6<{u!iW9(lF>d?yZ&? zg}_lK`@|=;7*j*sD`&n+GCI3Z=7%&`}CMh@6oq*S2AeGSLdO zl{MO+Sw3Z13DFocjfhM+IPI%@gZ>VeF zQca^E`a9owdjDbXIq>V;$Mg=u`fxjNzAu!CG5x2PkCBl=5;Wo2PP}>h*B7Z&r>pT5 z?~wO*H*CQ9UbyDtXA7ZS?&|0>5W4{A&1&qOAa-1T;tXi#HROw-TMxf9I$eH^M`P7x zJ>U(wv+Dj+*WCF=|M+9)wyxa;ND<5WTy_9mj!$HbU64qiOX2A4M^CbI{W$ZAo+jqf zqQ}qlz6kAhals2*Gb*3(p9jCW?QY;}&n|2$@ueHw=YrP#F~7CWHk*JyVeab#n*|4j zz?s$9N#y+KkN)4^U8(oOb#a>yK9^1xo$ z-c^4L!xlRJ!oa^jhoq8+Kep$b8=M6Y6oH|hG6+Uc3@2?7I0j}tGhbnRbTkbRLQphR z1A7^hjQh+nR&TaY!BN>@UWJ`UvpR(yFQpFw897Xa0YRAD1GF5d;R%8k27Ht;Xme&Q zEvL2$FErY;l?7I>!0xR7Taz=@RqjjrVe0&lLDpx3s8KdVcz_ z2RrqS_=_GN_Z&CM7i>>63Yxuu@C=*q0)uIzwZh(~EBa3arm0WNL z;rZ)Qwxzi7OT(tHy2^lk)?t8ZOZ9r)1hj(lND`67SGoETLU0pI(DBqX0+o`$3WHDW zJd2isGL9^evhKJejKC_1A~5)quiOCMt?+p>IVh(zMKV3XXI=Uk^D2IW+P=W4y`JVw z@5`(`0+t#ZQl3nMj&RfrM9k4p=4%mK4Th9uPDojW*jK~!rd#5PfSQbJXuNjk$e2}I ztGI}n=2&QUt(4J;4ESSz^en&;ZSCV1z%U9g6$-Z)N{bZssdylO)TyeSDuo}x4yNTt znZTQSbi90tkucLJe`k6Fpf(#n#q#0h^57goHoHWm(KHaQu;ET&YPtL)Xsm9W1Je_0 zH=rLOG41lj?@?FEJ5~u6IyT)T#&(wGh9(4|p{l|=OIWl9GnFtM0lww9Bjq{Tq>h<= z@9{nsS7#yC!YC;MRG#JlZw&Hs>fqTq5M%7n(|2&jAthB+&BW*lal6NW8?;Y7u*C-v zI*Jptaef2^S9?6`3zMhSlRG{3Ar=K0{fEH{+_%O;d`{B~u&~4FTQH>uDi+L@4B77~ zxaNjT2xmrP9cJ6sw_iO{ggC=UjaqH{;g3vs>kiI)D5$bXjReA}B1;pjsG45LYfXEo z)?_oc-G({d=8A6fnF(s@Z|ha4<3~vWM$g46J(VZGNz#K)l>>M_oz_A#Oj}*G#!uc8PVv57Mq$2f*0@jtHJhw>)D`nDG zMP(NrI0aJiUI^@Nn7VxQDnX1La1tFHc|Ih|K~Zj+c*DusQCU0TDQdM3draxvHL8B6 zS?(0%fg7ZEjR2S;GCQhi0CFb0>K7?R&m7+4)aaHDK^M-10KcCT7G~)28jPT*Cr5+^ z1Oc=ljm7i2EG0;-E>+h@oLMUwliCI|bd-|THr5q}tlMYov=9`_b|bFD-nc0Xj&o`^ zjSxCrdJ2Vhla2BN<0z-Z;@BzS&X?Qf@Rd!%ZbL{pf+12gol@~UXAx?T_Fd+DW3a~v zCzRHXkp|Pef~MmlJS!!}v@#IAGs$|;J1cj%PX$ScVv2xHtFi!E3i7f)b>oyArf(Gh z$WX@!bw+52nrjcZkcWhR#tUxx;Gdx@&aYBWJ0|)7c>a>mkPQ%FQ0HEg1h6CE{hVGi z|FzGWN>Y~`R;$en+N~(uGuGM+1l_vn!Lq01YV;WW_AH5vN;S4DoNIw13Gwhf3EpF1 z_X8hf3Xs6$uFf(Erd`@b9af3?t~$C;WpGV55gY?&)HCcXrAn>nQBC8iMnM=;W7Jj@G8x7N(=@jmbTF}#S|Il?q^+W%^Cm^bXb%h zX^x4*gGH>j|5YcI(O3hHvqBf618$O+?A@#%)|SXr*Z|P1#j}MP&`B~07okIT0CG#s zH8(SQWthMI?bQ4!e)H`~YJK8z-4j@rqrr;zt=1I(6#?L>zMNrC_Z;_r#qnts`0W5t zSA8psq6ad3>Lgh48AH#ACy-lx4SVBmfE!Qq(8g1bgB9;ix7hCl@NeI@yPwh9=;7f0 zJ38b|u|qGp%hO3`%Ge8Hh$arFE$=+kWmnN}t8Q^kD!1&8r+L=;{ke59`=wmKl90?I zp4I~0FT0Sl{4$fR2g%ck=U@SZWvH*VjlLI)K^f~5?O6%dP5Gsinq(!Y z1RxBzSid7x512l=b1IXm`OVve%PF^MG9S@$hO3VKJAyO7fU-J z$7qPlA>yFshdTg{(QFSUj}H?o3`F>J=hfn~kR+NWM{F1#@ar7Lyw_#TV&dm4mbDmu3(%)CV3mm7m%L8w z3ULV-REJk0qA)m-?*KdmO=E(r1Wj_xr=~sn2G0nq@*7a zG<~22TAh4C;GXC=CMW+oVawlv4!&mUL~Wlq0MUAT^LZ)&uMh)q@^|#4C==8E#|kin zb-P@3&iVrK@6SkSz^#+uK|k1;U0R+oG!%`qDw@_7fpW(Qes*^Y_J-!%bZ;;b&K_V; z{P-u~`vUK88sVA&c(4}rr?3C!w@UQ2M*#P3d5DMs0D}LLS^w(R0s4tMBR9W>&_7G4 znR5*8E?TGYU&>i6Vwnw1+kEwCAN>SLz5yvd)dfb=Hh+86fa}8~v>Zd#YY>k5Eeyeb zJ29uI;N7o?h>bT))^gsGB^W-zu{5DA6;HPaDY_uo?;;;}I_rP`3*y`+)kVX-JGV`%DI);aY|gKCu3GNo!UVVQb) z3p37jE#Fzoa4ykwgyXoWheJM#sV0L%Z(_Y8i7-oP{B-{v3Vj z6iQWT%`IToQl=a>Ztfa9A`!{T3)%aKFSI?2Syswnn;c~r!zj|Wq$E+M+t0ESO9+Sm zYZsPS9E?`y{>6|QQI#~ctgwZ*Q>~j+odkNXzVTgHp>h#8wVoJYq-%npdY zX%8$#o9iU7hwGD%JFgHLD&h*E;j|?9KL}a=T&27EEGX@TOjrYPBt50FV=1T z*0y;$c{1g!)oV7fn&WcFL=%YXifGbj<~1n#rN(gf4fMVrVmac9`-{xbmC|a7@ zp=`srMedo0zdvnXVWz$gb*mMtW=-BCt#LBSFCqrr8x% zvv*{JC@`{vASAMfOjzU$L@|*AcnOTN5G3Q!rmqLeWgtTA-HR}CUn87;O^fhc6GsF# z6+}eZS|Tzd+Y^y%(g8Zb*EhTWgq)kb`_ZSRMGe%r$c!D1H!teFB_ zvogX%xl4%%kalAuB8+wgs_eLV#w7W%_LD(x-(`TB%y(F3Kn4_wMS5J0S(9L|11A&K zsImve261ecrm=$or)V7M&nc}_Cv*|CxNOXbQPT!RkF}pymLoa>M79+=hHR6H*q7h! zhC?f>c*@IS%p7f0VQ4R{*M~H~zNYz8EhO6kD88cNW4#s{cj>XrBjfL5UT$l%GS5uM z`XD$(sLLJiDAR18X?iMVZ{jdYT7$B}-O#$&X0Ehkvbm_OoosTO1!a80fcScqEeInr zD1_$ST{dTU$|D}R6Z*8Oc3`{QN}v3V;a5z`686htz@T`kires)zz=PWNVU30= z!niIdlWAHnlMPiyJl)VLs;Yo!xG*i7HHk!-Ac2+4z~TeoFsue7Pz{heGjlLpn4B-y zcBwK^FV0+#*b-QER7z2c3$OXd(I^q)F~ci$(mz?WucUth&^TKPr)Am}M?6O4hwUm8 z;mpN%inN&|M^`N^lLW0%`I8c7oa;EwcNH0<8&{uF6;!b9g>ZAhMVEYWz8eZFoO=;G zisX3@ey%~DHtxe>0|%+{{zH1Y;;J#OcW-cubMmiRy}YL59WqpCK4CQZny)y%#fJ+Y zfu9?0%F@seM~WOJDt`gdqQ{7-w?1C>GY;gZZwa3D^Kk_k8_#$XjEkQ@c0v9gX3ds8hf*=hOfp${&RjN?Vu~Gxc_Y^FJf)TT&zMF{DR)=i?mf>u``q6Af_?iB96WUR$kAiRPds0E@>EfANoiSmMP*fWI8syV z9*q31zM-+Hna4v6|4VCIyV4xmgq*coIfEi9bd{PZ6=U0@N{3YG`hh5vaImYOqvu13 zKsjM>VKm*m7@-h7CX~73uHWr5XurM2jTxo!XIpX_Ar3QT5*$v5DOx(&)!ozEm+GIL zn@1L2Tv}dvpasi0X9)0{(}(Aenso_QTi0GAv>A>>x3**Pd*1X%GgS2sDVwsTH(^1QMP^9ZI24U# z9L0PX_U)d((1K=`KR2>!G@;x|$i0UgFPl`d{JLD2Kygp)+Edqgaq`9}>irSQD0BHn zS4b`@)>_$Ov$joiW{N6XUa|@sPv>H-UcKe7d{@`C8aiw27dMv1mU?{xTmBGl<*(DS zX(GNg_fc$bySIJZ*dCkPS7ZX)M?ZyKk9MEQu3pMa4`c7N;S_DOKZgBL`;K*>(Sxfu z&J3lW>lDCUpnw7dD!^ckH0WL9^1~oQ8OmTNAVI^@C|X~k9=a2NxG7q|zyg~X1Vj+S zkW^8oaN!CUjG1622hVZArBFf%OF+P9Kkvim5FsLp08-d$Jp$i*(#_M%ER+ATTxj%U z;quh^!lAK@PxMbT94r}7BCAdA_ZhYs&&esGkLML8Xq(q!=uj9b>p>1b_F(2~2OTD1Y*2kd}8fT=bH zOmtCD6PE!!1Zv41>d1va10mf*I@bcQ13(ZUK%gKH02BfS2m}I!1<)8ib((01fFO`4 zP(UCMl*|ySa9*R}J52q?%p4P#Z;HGI2EPP4<=h&ilNl55s~jC?A&4XsEkHJT11=-r z>h1eFv|syrr@^$o9DVKAoq(ZyR5j;2R-u2h7=DL-0|H z_+tw1hNW0Mh%m(DA;m64h=TJ@fRUW_RO3?kLcuP+hyek9Q{X5>h>*TaAmHGYBh3&* z=6?X+j-9m_5wlQOKy-ieP0w$}k3}b`<)Y_mEr^0BC_%j(N6&4&uuOsQq4Uld0Pj3E zmLW!R_Gm!brLo%VGv0vzkAba<0i7VcGQ`=Iixw@QVZuYLq8ITVkFKP3MNjs9_|vx& z8G#lltiwz{@6pNe&T~`b`NBsVHXcbofOa-yodJf^qDR1>z;hE0V4k|fYcEl=*o@1$ oTGAK9`vI?x8tfO$g3KBe`V;69k|fq4_+E06y1n-(K?wi=0FR&Q7XSbN literal 0 HcmV?d00001 diff --git a/website/scripts/chart/index.js b/website/scripts/chart/index.js index 233f02b66..5b603df3f 100644 --- a/website/scripts/chart/index.js +++ b/website/scripts/chart/index.js @@ -403,7 +403,7 @@ export function createChart({ parent, brk, fitContent }) { if (!pane) return; if (this.isAllHidden(paneIndex)) { const chartHeight = ichart.chartElement().clientHeight; - pane.setStretchFactor(chartHeight > 0 ? 32 / (chartHeight - 32) : 0); + pane.setStretchFactor(chartHeight > 0 ? 48 / (chartHeight - 48) : 0); } else { pane.setStretchFactor(1); } @@ -1445,7 +1445,7 @@ export function createChart({ parent, brk, fitContent }) { const lastTd = ichart .chartElement() - .querySelector("table > tr:last-child > td:nth-child(2)"); + .querySelector("table > tr:last-child > td:last-child"); const chart = { get panes() { @@ -1474,9 +1474,6 @@ export function createChart({ parent, brk, fitContent }) { groups, id: "index", }); - const sep = document.createElement("span"); - sep.textContent = "|"; - indexField.append(sep); if (lastTd) lastTd.append(indexField); }, diff --git a/website/scripts/utils/dom.js b/website/scripts/utils/dom.js index 613273971..3fe785fb3 100644 --- a/website/scripts/utils/dom.js +++ b/website/scripts/utils/dom.js @@ -308,6 +308,12 @@ export function createSelect({ arrow.textContent = "↓"; field.append(arrow); } + + field.addEventListener("click", (e) => { + if (e.target !== select) { + select.showPicker(); + } + }); } return field; diff --git a/website/styles/chart.css b/website/styles/chart.css index 645007273..9c81df9c6 100644 --- a/website/styles/chart.css +++ b/website/styles/chart.css @@ -1,4 +1,5 @@ .chart { + position: relative; display: flex; flex-direction: column; min-height: 0; @@ -138,6 +139,7 @@ display: flex; flex-shrink: 0; gap: 0.375rem; + cursor: pointer; } table > tr { @@ -203,15 +205,18 @@ td:last-child > .field { position: absolute; - top: 0; left: 0; - right: 0; z-index: 50; - display: flex; + display: inline-flex; font-size: var(--font-size-xs); + align-items: center; + } + + tr:not(:last-child) > td:last-child > .field { + top: 0; + right: 0; gap: 0.375rem; background-color: var(--background-color); - align-items: center; text-transform: uppercase; padding-left: 0.625rem; padding-top: 0.35rem; @@ -232,10 +237,14 @@ } } + tr:last-child > td:last-child > .field { + bottom: 2.125rem; + } + button.capture { position: absolute; - top: 0.5rem; - right: 0.5rem; + top: -0.75rem; + right: -0.75rem; z-index: 50; font-size: var(--font-size-xs); line-height: var(--line-height-xs); diff --git a/website/styles/elements.css b/website/styles/elements.css index 34452058d..6fc3ba1ad 100644 --- a/website/styles/elements.css +++ b/website/styles/elements.css @@ -95,7 +95,6 @@ button { } h1 { - text-transform: uppercase; font-size: var(--font-size-xl); line-height: var(--line-height-xl); font-weight: 300; @@ -242,7 +241,6 @@ summary { &::-webkit-details-marker { display: none; } - } :is(a, button, summary) { diff --git a/website/styles/fonts.css b/website/styles/fonts.css index b2f5a39b1..e5a1c7604 100644 --- a/website/styles/fonts.css +++ b/website/styles/fonts.css @@ -14,8 +14,34 @@ font-display: block; } +@font-face { + font-family: Instrument; + src: url("/assets/fonts/InstrumentSerif-Regular.woff2") format("woff2"); + font-style: normal; + font-display: block; +} + +@font-face { + font-family: Instrument; + src: url("/assets/fonts/InstrumentSerif-Italic.woff2") format("woff2"); + font-style: italic; + font-display: block; +} + +@font-face { + font-family: Satoshi; + src: url("/assets/fonts/Satoshi-Variable.woff2") format("woff2"); + font-weight: 100 900; + font-display: block; +} + html { font-family: "Lilex", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; } + +h1 { + font-family: + Instrument, Charter, "Bitstream Charter", "Sitka Text", Cambria, serif; +} diff --git a/website/styles/panes/chart.css b/website/styles/panes/chart.css index b8c7fc91f..22e5ca29e 100644 --- a/website/styles/panes/chart.css +++ b/website/styles/panes/chart.css @@ -44,14 +44,14 @@ white-space: nowrap; overflow-x: auto; padding-bottom: 1rem; - margin-bottom: -1rem; + margin-bottom: -0.75rem; padding-left: var(--main-padding); margin-left: var(--negative-main-padding); padding-right: var(--main-padding); margin-right: var(--negative-main-padding); h1 { - font-size: 1.375rem; + font-size: 2rem; letter-spacing: 0.075rem; text-wrap: nowrap; }