From c1d1646c4d62300ec48503aa65623ee7e3df8685 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Sun, 1 May 2022 09:54:19 +0200 Subject: [PATCH 01/28] Change the way new layout assignations are computed. The function now computes an optimal assignation (with respect to partition size) that minimizes the distance to the former assignation, using flow algorithms. This commit was written by Mendes Oulamara --- src/rpc/Cargo.toml | 1 + src/rpc/layout.rs | 839 +++++++++++++++++++++--------------------- src/util/bipartite.rs | 378 +++++++++++++++++++ src/util/lib.rs | 1 + 4 files changed, 806 insertions(+), 413 deletions(-) create mode 100644 src/util/bipartite.rs diff --git a/src/rpc/Cargo.toml b/src/rpc/Cargo.toml index efaacf2e..654c1dc6 100644 --- a/src/rpc/Cargo.toml +++ b/src/rpc/Cargo.toml @@ -23,6 +23,7 @@ gethostname = "0.2" hex = "0.4" tracing = "0.1.30" rand = "0.8" +itertools="0.10" sodiumoxide = { version = "0.2.5-0", package = "kuska-sodiumoxide" } async-trait = "0.1.7" diff --git a/src/rpc/layout.rs b/src/rpc/layout.rs index b9c02c21..afd7df17 100644 --- a/src/rpc/layout.rs +++ b/src/rpc/layout.rs @@ -1,10 +1,14 @@ use std::cmp::Ordering; -use std::collections::{HashMap, HashSet}; +use std::cmp::{min}; +use std::collections::{HashMap}; use serde::{Deserialize, Serialize}; use garage_util::crdt::{AutoCrdt, Crdt, LwwMap}; use garage_util::data::*; +use garage_util::bipartite::*; + +use rand::prelude::SliceRandom; use crate::ring::*; @@ -164,445 +168,454 @@ impl ClusterLayout { true } - /// Calculate an assignation of partitions to nodes - pub fn calculate_partition_assignation(&mut self) -> bool { - let (configured_nodes, zones) = self.configured_nodes_and_zones(); - let n_zones = zones.len(); - println!("Calculating updated partition assignation, this may take some time..."); - println!(); + /// This function calculates a new partition-to-node assignation. + /// The computed assignation maximizes the capacity of a + /// partition (assuming all partitions have the same size). + /// Among such optimal assignation, it minimizes the distance to + /// the former assignation (if any) to minimize the amount of + /// data to be moved. A heuristic ensures node triplets + /// dispersion (in garage_util::bipartite::optimize_matching()). + pub fn calculate_partition_assignation(&mut self) -> bool { + + //The nodes might have been updated, some might have been deleted. + //So we need to first update the list of nodes and retrieve the + //assignation. + let old_node_assignation = self.update_nodes_and_ring(); - // Get old partition assignation - let old_partitions = self.parse_assignation_data(); + let (node_zone, _) = self.get_node_zone_capacity(); + + //We compute the optimal number of partition to assign to + //every node and zone. + if let Some((part_per_nod, part_per_zone)) = self.optimal_proportions(){ + //We collect part_per_zone in a vec to not rely on the + //arbitrary order in which elements are iterated in + //Hashmap::iter() + let part_per_zone_vec = part_per_zone.iter() + .map(|(x,y)| (x.clone(),*y)) + .collect::>(); + //We create an indexing of the zones + let mut zone_id = HashMap::::new(); + for i in 0..part_per_zone_vec.len(){ + zone_id.insert(part_per_zone_vec[i].0.clone(), i); + } + + //We compute a candidate for the new partition to zone + //assignation. + let nb_zones = part_per_zone.len(); + let nb_nodes = part_per_nod.len(); + let nb_partitions = 1<>(); + + //We create the structure for the partition-to-node assignation. + let mut node_assignation = + vec![vec![None; self.replication_factor ];nb_partitions]; + //We will decrement part_per_nod to keep track of the number + //of partitions that we still have to associate. + let mut part_per_nod = part_per_nod.clone(); + + //We minimize the distance to the former assignation(if any) + + //We get the id of the zones of the former assignation + //(and the id no_zone if there is no node assignated) + let no_zone = part_per_zone_vec.len(); + let old_zone_assignation : Vec> = + old_node_assignation.iter().map(|x| x.iter().map( + |id| match *id { Some(i) => zone_id[&node_zone[i]] , + None => no_zone } + ).collect()).collect(); - // In various cases, not enough nodes will have been added for all partitions - // in the step above (e.g. due to node removals, or new zones being added). - // Here we add more nodes to make a complete (but sub-optimal) assignation, - // using an initial partition assignation that is calculated using the multi-dc maglev trick - match self.initial_partition_assignation() { - Some(initial_partitions) => { - for (part, ipart) in partitions.iter_mut().zip(initial_partitions.iter()) { - for (id, info) in ipart.nodes.iter() { - if part.nodes.len() < self.replication_factor { - part.add(None, n_zones, id, info.unwrap()); - } - } - assert!(part.nodes.len() == self.replication_factor); - } - } - None => { - // Not enough nodes in cluster to build a correct assignation. - // Signal it by returning an error. - return false; - } - } + //We minimize the distance to the former zone assignation + zone_assignation = optimize_matching( + &old_zone_assignation, &zone_assignation, nb_zones+1); //+1 for no_zone - // Calculate how many partitions each node should ideally store, - // and how many partitions they are storing with the current assignation - // This defines our target for which we will optimize in the following loop. - let total_capacity = configured_nodes - .iter() - .map(|(_, info)| info.capacity.unwrap_or(0)) - .sum::() as usize; - let total_partitions = self.replication_factor * (1 << PARTITION_BITS); - let target_partitions_per_node = configured_nodes - .iter() - .map(|(id, info)| { - ( - *id, - info.capacity.unwrap_or(0) as usize * total_partitions / total_capacity, - ) - }) - .collect::>(); + //We need to assign partitions to nodes in their zone + //We first put the nodes assignation that can stay the same + for i in 0..nb_partitions{ + for j in 0..self.replication_factor { + if let Some(Some(former_node)) = old_node_assignation[i].iter().find( + |x| if let Some(id) = x { + zone_id[&node_zone[*id]] == zone_assignation[i][j] + } + else {false} + ) + { + if part_per_nod[*former_node] > 0 { + node_assignation[i][j] = Some(*former_node); + part_per_nod[*former_node] -= 1; + } + } + } + } - let mut partitions_per_node = self.partitions_per_node(&partitions[..]); + + //We complete the assignation of partitions to nodes + let mut rng = rand::thread_rng(); + for i in 0..nb_partitions { + for j in 0..self.replication_factor { + if node_assignation[i][j] == None { + let possible_nodes : Vec = (0..nb_nodes) + .filter( + |id| zone_id[&node_zone[*id]] == zone_assignation[i][j] + && part_per_nod[*id] > 0).collect(); + assert!(possible_nodes.len()>0); + //We randomly pick a node + if let Some(nod) = possible_nodes.choose(&mut rng){ + node_assignation[i][j] = Some(*nod); + part_per_nod[*nod] -= 1; + } + } + } + } - println!("Target number of partitions per node:"); - for (node, npart) in target_partitions_per_node.iter() { - println!("{:?}\t{}", node, npart); - } - println!(); + //We write the assignation in the 1D table + self.ring_assignation_data = Vec::::new(); + for i in 0..nb_partitions{ + for j in 0..self.replication_factor { + if let Some(id) = node_assignation[i][j] { + self.ring_assignation_data.push(id as CompactNodeType); + } + else {assert!(false)} + } + } - // Shuffle partitions between nodes so that nodes will reach (or better approach) - // their target number of stored partitions - loop { - let mut option = None; - for (i, part) in partitions.iter_mut().enumerate() { - for (irm, (idrm, _)) in part.nodes.iter().enumerate() { - let errratio = |node, parts| { - let tgt = *target_partitions_per_node.get(node).unwrap() as f32; - (parts - tgt) / tgt - }; - let square = |x| x * x; + true + } + else { false } + } - let partsrm = partitions_per_node.get(*idrm).cloned().unwrap_or(0) as f32; + /// The LwwMap of node roles might have changed. This function updates the node_id_vec + /// and returns the assignation given by ring, with the new indices of the nodes, and + /// None of the node is not present anymore. + /// We work with the assumption that only this function and calculate_new_assignation + /// do modify assignation_ring and node_id_vec. + fn update_nodes_and_ring(&mut self) -> Vec>> { + let nb_partitions = 1usize< = self.roles.items().iter() + .map(|(k, _, _)| *k) + .collect(); + + if ring.len() == rf*nb_partitions { + for i in 0..nb_partitions { + for j in 0..self.replication_factor { + node_assignation[i][j] = new_node_id_vec.iter() + .position(|id| *id == self.node_id_vec[ring[i*rf + j] as usize]); + } + } + } - for (idadd, infoadd) in configured_nodes.iter() { - // skip replacing a node by itself - // and skip replacing by gateway nodes - if idadd == idrm || infoadd.capacity.is_none() { - continue; - } + self.node_id_vec = new_node_id_vec; + self.ring_assignation_data = vec![]; + return node_assignation; + } + + ///This function compute the number of partition to assign to + ///every node and zone, so that every partition is replicated + ///self.replication_factor times and the capacity of a partition + ///is maximized. + fn optimal_proportions(&mut self) -> Option<(Vec, HashMap)> { + + let mut zone_capacity :HashMap= HashMap::new(); + + let (node_zone, node_capacity) = self.get_node_zone_capacity(); + let nb_nodes = self.node_id_vec.len(); - // We want to try replacing node idrm by node idadd - // if that brings us close to our goal. - let partsadd = partitions_per_node.get(*idadd).cloned().unwrap_or(0) as f32; - let oldcost = square(errratio(*idrm, partsrm) - errratio(*idadd, partsadd)); - let newcost = - square(errratio(*idrm, partsrm - 1.) - errratio(*idadd, partsadd + 1.)); - if newcost >= oldcost { - // not closer to our goal - continue; - } - let gain = oldcost - newcost; + for i in 0..nb_nodes + { + if zone_capacity.contains_key(&node_zone[i]) { + zone_capacity.insert(node_zone[i].clone(), zone_capacity[&node_zone[i]] + node_capacity[i]); + } + else{ + zone_capacity.insert(node_zone[i].clone(), node_capacity[i]); + } + } - let mut newpart = part.clone(); + //Compute the optimal number of partitions per zone + let sum_capacities: u32 =zone_capacity.values().sum(); + + if sum_capacities <= 0 { + println!("No storage capacity in the network."); + return None; + } - newpart.nodes.remove(irm); - if !newpart.add(None, n_zones, idadd, infoadd) { - continue; - } - assert!(newpart.nodes.len() == self.replication_factor); + let nb_partitions = 1< = + zone_capacity.iter() + .map(|(k, v)| (k.clone(), min(nb_partitions, + (self.replication_factor*nb_partitions + **v as usize)/sum_capacities as usize) ) ).collect(); - if !old_partitions[i] - .is_valid_transition_to(&newpart, self.replication_factor) - { - continue; - } + //The replication_factor-1 upper bounds the number of + //part_per_zones that are greater than nb_partitions + for _ in 1..self.replication_factor { + //The number of partitions that are not assignated to + //a zone that takes nb_partitions. + let sum_capleft : u32 = zone_capacity.keys() + .filter(| k | {part_per_zone[*k] < nb_partitions} ) + .map(|k| zone_capacity[k]).sum(); + + //The number of replication of the data that we need + //to ensure. + let repl_left = self.replication_factor + - part_per_zone.values() + .filter(|x| {**x == nb_partitions}) + .count(); + if repl_left == 0 { + break; + } - if option - .as_ref() - .map(|(old_gain, _, _, _, _)| gain > *old_gain) - .unwrap_or(true) - { - option = Some((gain, i, idadd, idrm, newpart)); - } - } - } - } - if let Some((_gain, i, idadd, idrm, newpart)) = option { - *partitions_per_node.entry(idadd).or_insert(0) += 1; - *partitions_per_node.get_mut(idrm).unwrap() -= 1; - partitions[i] = newpart; - } else { - break; - } - } + for k in zone_capacity.keys() { + if part_per_zone[k] != nb_partitions + { + part_per_zone.insert(k.to_string() , min(nb_partitions, + (nb_partitions*zone_capacity[k] as usize + *repl_left)/sum_capleft as usize)); + } + } + } - // Check we completed the assignation correctly - // (this is a set of checks for the algorithm's consistency) - assert!(partitions.len() == (1 << PARTITION_BITS)); - assert!(partitions - .iter() - .all(|p| p.nodes.len() == self.replication_factor)); + //Now we divide the zone's partition share proportionally + //between their nodes. + + let mut part_per_nod : Vec = (0..nb_nodes).map( + |i| (part_per_zone[&node_zone[i]]*node_capacity[i] as usize)/zone_capacity[&node_zone[i]] as usize + ) + .collect(); - let new_partitions_per_node = self.partitions_per_node(&partitions[..]); - assert!(new_partitions_per_node == partitions_per_node); + //We must update the part_per_zone to make it correspond to + //part_per_nod (because of integer rounding) + part_per_zone = part_per_zone.iter().map(|(k,_)| + (k.clone(), 0)) + .collect(); + for i in 0..nb_nodes { + part_per_zone.insert( + node_zone[i].clone() , + part_per_zone[&node_zone[i]] + part_per_nod[i]); + } - // Show statistics - println!("New number of partitions per node:"); - for (node, npart) in partitions_per_node.iter() { - let tgt = *target_partitions_per_node.get(node).unwrap(); - let pct = 100f32 * (*npart as f32) / (tgt as f32); - println!("{:?}\t{}\t({}% of {})", node, npart, pct as i32, tgt); - } - println!(); + //Because of integer rounding, the total sum of part_per_nod + //might not be replication_factor*nb_partitions. + // We need at most to add 1 to every non maximal value of + // part_per_nod. The capacity of a partition will be bounded + // by the minimal value of + // node_capacity_vec[i]/part_per_nod[i] + // so we try to maximize this minimal value, keeping the + // part_per_zone capped - let mut diffcount = HashMap::new(); - for (oldpart, newpart) in old_partitions.iter().zip(partitions.iter()) { - let nminus = oldpart.txtplus(newpart); - let nplus = newpart.txtplus(oldpart); - if nminus != "[...]" || nplus != "[...]" { - let tup = (nminus, nplus); - *diffcount.entry(tup).or_insert(0) += 1; - } - } - if diffcount.is_empty() { - println!("No data will be moved between nodes."); - } else { - let mut diffcount = diffcount.into_iter().collect::>(); - diffcount.sort(); - println!("Number of partitions that move:"); - for ((nminus, nplus), npart) in diffcount { - println!("\t{}\t{} -> {}", npart, nminus, nplus); - } - } - println!(); + let discrepancy : usize = + nb_partitions*self.replication_factor + - part_per_nod.iter().sum::(); + + //We use a stupid O(N^2) algorithm. If the number of nodes + //is actually expected to be high, one should optimize this. - // Calculate and save new assignation data - let (nodes, assignation_data) = - self.compute_assignation_data(&configured_nodes[..], &partitions[..]); + for _ in 0..discrepancy { + if let Some(idmax) = (0..nb_nodes) + .filter(|i| part_per_zone[&node_zone[*i]] < nb_partitions) + .max_by( |i,j| + (node_capacity[*i]*(part_per_nod[*j]+1) as u32) + .cmp(&(node_capacity[*j]*(part_per_nod[*i]+1) as u32)) + ) + { + part_per_nod[idmax] += 1; + part_per_zone.insert(node_zone[idmax].clone(),part_per_zone[&node_zone[idmax]]+1); + } + } - self.node_id_vec = nodes; - self.ring_assignation_data = assignation_data; + //We check the algorithm consistency + + let discrepancy : usize = + nb_partitions*self.replication_factor + - part_per_nod.iter().sum::(); + assert!(discrepancy == 0); + assert!(if let Some(v) = part_per_zone.values().max() + {*v <= nb_partitions} else {false} ); + + Some((part_per_nod, part_per_zone)) + } + + + //Returns vectors of zone and capacity; indexed by the same (temporary) + //indices as node_id_vec. + fn get_node_zone_capacity(& self) -> (Vec , Vec) { + + let node_zone = self.node_id_vec.iter().map( + |id_nod| match self.node_role(id_nod) { + Some(NodeRole{zone,capacity:_,tags:_}) => zone.clone() , + _ => "".to_string() + } + ).collect(); + + let node_capacity = self.node_id_vec.iter().map( + |id_nod| match self.node_role(id_nod) { + Some(NodeRole{zone:_,capacity,tags:_}) => + if let Some(c)=capacity + {*c} + else {0}, + _ => 0 + } + ).collect(); - true - } + (node_zone,node_capacity) + } - fn initial_partition_assignation(&self) -> Option>> { - let (configured_nodes, zones) = self.configured_nodes_and_zones(); - let n_zones = zones.len(); - - // Create a vector of partition indices (0 to 2**PARTITION_BITS-1) - let partitions_idx = (0usize..(1usize << PARTITION_BITS)).collect::>(); - - // Prepare ring - let mut partitions: Vec = partitions_idx - .iter() - .map(|_i| PartitionAss::new()) - .collect::>(); - - // Create MagLev priority queues for each node - let mut queues = configured_nodes - .iter() - .filter(|(_id, info)| info.capacity.is_some()) - .map(|(node_id, node_info)| { - let mut parts = partitions_idx - .iter() - .map(|i| { - let part_data = - [&u16::to_be_bytes(*i as u16)[..], node_id.as_slice()].concat(); - (*i, fasthash(&part_data[..])) - }) - .collect::>(); - parts.sort_by_key(|(_i, h)| *h); - let parts_i = parts.iter().map(|(i, _h)| *i).collect::>(); - (node_id, node_info, parts_i, 0) - }) - .collect::>(); - - let max_capacity = configured_nodes - .iter() - .filter_map(|(_, node_info)| node_info.capacity) - .fold(0, std::cmp::max); - - // Fill up ring - for rep in 0..self.replication_factor { - queues.sort_by_key(|(ni, _np, _q, _p)| { - let queue_data = [&u16::to_be_bytes(rep as u16)[..], ni.as_slice()].concat(); - fasthash(&queue_data[..]) - }); - - for (_, _, _, pos) in queues.iter_mut() { - *pos = 0; - } - - let mut remaining = partitions_idx.len(); - while remaining > 0 { - let remaining0 = remaining; - for i_round in 0..max_capacity { - for (node_id, node_info, q, pos) in queues.iter_mut() { - if i_round >= node_info.capacity.unwrap() { - continue; - } - for (pos2, &qv) in q.iter().enumerate().skip(*pos) { - if partitions[qv].add(Some(rep + 1), n_zones, node_id, node_info) { - remaining -= 1; - *pos = pos2 + 1; - break; - } - } - } - } - if remaining == remaining0 { - // No progress made, exit - return None; - } - } - } - - Some(partitions) - } - - fn configured_nodes_and_zones(&self) -> (Vec<(&Uuid, &NodeRole)>, HashSet<&str>) { - let configured_nodes = self - .roles - .items() - .iter() - .filter(|(_id, _, info)| info.0.is_some()) - .map(|(id, _, info)| (id, info.0.as_ref().unwrap())) - .collect::>(); - - let zones = configured_nodes - .iter() - .filter(|(_id, info)| info.capacity.is_some()) - .map(|(_id, info)| info.zone.as_str()) - .collect::>(); - - (configured_nodes, zones) - } - - fn compute_assignation_data<'a>( - &self, - configured_nodes: &[(&'a Uuid, &'a NodeRole)], - partitions: &[PartitionAss<'a>], - ) -> (Vec, Vec) { - assert!(partitions.len() == (1 << PARTITION_BITS)); - - // Make a canonical order for nodes - let mut nodes = configured_nodes - .iter() - .filter(|(_id, info)| info.capacity.is_some()) - .map(|(id, _)| **id) - .collect::>(); - let nodes_rev = nodes - .iter() - .enumerate() - .map(|(i, id)| (*id, i as CompactNodeType)) - .collect::>(); - - let mut assignation_data = vec![]; - for partition in partitions.iter() { - assert!(partition.nodes.len() == self.replication_factor); - for (id, _) in partition.nodes.iter() { - assignation_data.push(*nodes_rev.get(id).unwrap()); - } - } - - nodes.extend( - configured_nodes - .iter() - .filter(|(_id, info)| info.capacity.is_none()) - .map(|(id, _)| **id), - ); - - (nodes, assignation_data) - } - - fn parse_assignation_data(&self) -> Vec> { - if self.ring_assignation_data.len() == self.replication_factor * (1 << PARTITION_BITS) { - // If the previous assignation data is correct, use that - let mut partitions = vec![]; - for i in 0..(1 << PARTITION_BITS) { - let mut part = PartitionAss::new(); - for node_i in self.ring_assignation_data - [i * self.replication_factor..(i + 1) * self.replication_factor] - .iter() - { - let node_id = &self.node_id_vec[*node_i as usize]; - - if let Some(NodeRoleV(Some(info))) = self.roles.get(node_id) { - part.nodes.push((node_id, Some(info))); - } else { - part.nodes.push((node_id, None)); - } - } - partitions.push(part); - } - partitions - } else { - // Otherwise start fresh - (0..(1 << PARTITION_BITS)) - .map(|_| PartitionAss::new()) - .collect() - } - } - - fn partitions_per_node<'a>(&self, partitions: &[PartitionAss<'a>]) -> HashMap<&'a Uuid, usize> { - let mut partitions_per_node = HashMap::<&Uuid, usize>::new(); - for p in partitions.iter() { - for (id, _) in p.nodes.iter() { - *partitions_per_node.entry(*id).or_insert(0) += 1; - } - } - partitions_per_node - } } -// ---- Internal structs for partition assignation in layout ---- -#[derive(Clone)] -struct PartitionAss<'a> { - nodes: Vec<(&'a Uuid, Option<&'a NodeRole>)>, + +#[cfg(test)] +mod tests { + use super::*; + use itertools::Itertools; + + fn check_assignation(cl : &ClusterLayout) { + + //Check that input data has the right format + let nb_partitions = 1usize<>(); + + let zone_vec = node_zone.iter().unique().collect::>(); + let zone_nb_part = zone_vec.iter().map( |z| cl.ring_assignation_data.iter() + .filter(|x| node_zone[**x as usize] == **z) + .count() + ).collect::>(); + + //Check optimality of the zone assignation : would it be better for the + //node_capacity/node_partitions ratio to change the assignation of a partition + + if let Some(idmin) = (0..nb_nodes).min_by( + |i,j| (node_capacity[*i]*node_nb_part[*j] as u32) + .cmp(&(node_capacity[*j]*node_nb_part[*i] as u32)) + ){ + if let Some(idnew) = (0..nb_nodes) + .filter( |i| if let Some(p) = zone_vec.iter().position(|z| **z==node_zone[*i]) + {zone_nb_part[p] < nb_partitions } + else { false }) + .max_by( + |i,j| (node_capacity[*i]*(node_nb_part[*j]as u32+1)) + .cmp(&(node_capacity[*j]*(node_nb_part[*i] as u32+1))) + ){ + assert!(node_capacity[idmin]*(node_nb_part[idnew] as u32+1) >= + node_capacity[idnew]*node_nb_part[idmin] as u32); + } + + } + + //In every zone, check optimality of the nod assignation + for z in zone_vec { + let node_of_z_iter = (0..nb_nodes).filter(|id| node_zone[*id] == *z ); + if let Some(idmin) = node_of_z_iter.clone().min_by( + |i,j| (node_capacity[*i]*node_nb_part[*j] as u32) + .cmp(&(node_capacity[*j]*node_nb_part[*i] as u32)) + ){ + if let Some(idnew) = node_of_z_iter.min_by( + |i,j| (node_capacity[*i]*(node_nb_part[*j] as u32+1)) + .cmp(&(node_capacity[*j]*(node_nb_part[*i] as u32+1))) + ){ + assert!(node_capacity[idmin]*(node_nb_part[idnew] as u32+1) >= + node_capacity[idnew]*node_nb_part[idmin] as u32); + } + } + } + + } + + fn update_layout(cl : &mut ClusterLayout, node_id_vec : &Vec, + node_capacity_vec : &Vec , node_zone_vec : &Vec) { + for i in 0..node_id_vec.len(){ + if let Some(x) = FixedBytes32::try_from(&[i as u8;32]) { + cl.node_id_vec.push(x); + } + + let update = cl.roles.update_mutator(cl.node_id_vec[i] , + NodeRoleV(Some(NodeRole{ + zone : (node_zone_vec[i].to_string()), + capacity : (Some(node_capacity_vec[i])), + tags : (vec![])}))); + cl.roles.merge(&update); + } + } + + #[test] + fn test_assignation() { + + let mut node_id_vec = vec![1,2,3]; + let mut node_capacity_vec = vec![4000,1000,2000]; + let mut node_zone_vec= vec!["A", "B", "C"].into_iter().map(|x| x.to_string()).collect(); + + let mut cl = ClusterLayout { + node_id_vec: vec![], + + roles : LwwMap::new(), + + replication_factor: 3, + ring_assignation_data : vec![], + version:0, + staging: LwwMap::new(), + staging_hash: sha256sum(&[1;32]), + }; + update_layout(&mut cl, &node_id_vec, &node_capacity_vec, &node_zone_vec); + cl.calculate_partition_assignation(); + check_assignation(&cl); + + node_id_vec = vec![1,2,3, 4, 5, 6, 7, 8, 9]; + node_capacity_vec = vec![4000,1000,1000, 3000, 1000, 1000, 2000, 10000, 2000]; + node_zone_vec= vec!["A", "B", "C", "C", "C", "B", "G", "H", "I"].into_iter().map(|x| x.to_string()).collect(); + update_layout(&mut cl, &node_id_vec, &node_capacity_vec, &node_zone_vec); + cl.calculate_partition_assignation(); + check_assignation(&cl); + + node_capacity_vec = vec![4000,1000,2000, 7000, 1000, 1000, 2000, 10000, 2000]; + update_layout(&mut cl, &node_id_vec, &node_capacity_vec, &node_zone_vec); + cl.calculate_partition_assignation(); + check_assignation(&cl); + + + node_capacity_vec = vec![4000,4000,2000, 7000, 1000, 9000, 2000, 10, 2000]; + update_layout(&mut cl, &node_id_vec, &node_capacity_vec, &node_zone_vec); + cl.calculate_partition_assignation(); + check_assignation(&cl); + + } } -impl<'a> PartitionAss<'a> { - fn new() -> Self { - Self { nodes: Vec::new() } - } - fn nplus(&self, other: &PartitionAss<'a>) -> usize { - self.nodes - .iter() - .filter(|x| !other.nodes.contains(x)) - .count() - } - fn txtplus(&self, other: &PartitionAss<'a>) -> String { - let mut nodes = self - .nodes - .iter() - .filter(|x| !other.nodes.contains(x)) - .map(|x| format!("{:?}", x.0)) - .collect::>(); - nodes.sort(); - if self.nodes.iter().any(|x| other.nodes.contains(x)) { - nodes.push("...".into()); - } - format!("[{}]", nodes.join(" ")) - } - - fn is_valid_transition_to(&self, other: &PartitionAss<'a>, replication_factor: usize) -> bool { - let min_keep_nodes_per_part = (replication_factor + 1) / 2; - let n_removed = self.nplus(other); - - if self.nodes.len() <= min_keep_nodes_per_part { - n_removed == 0 - } else { - n_removed <= self.nodes.len() - min_keep_nodes_per_part - } - } - - // add is a key function in creating a PartitionAss, i.e. the list of nodes - // to which a partition is assigned. It tries to add a certain node id to the - // assignation, but checks that doing so is compatible with the NECESSARY - // condition that the partition assignation must be dispersed over different - // zones (datacenters) if enough zones exist. This is why it takes a n_zones - // parameter, which is the total number of zones that have existing nodes: - // if nodes in the assignation already cover all n_zones zones, then any node - // that is not yet in the assignation can be added. Otherwise, only nodes - // that are in a new zone can be added. - fn add( - &mut self, - target_len: Option, - n_zones: usize, - node: &'a Uuid, - role: &'a NodeRole, - ) -> bool { - if let Some(tl) = target_len { - if self.nodes.len() != tl - 1 { - return false; - } - } - - let p_zns = self - .nodes - .iter() - .map(|(_id, info)| info.unwrap().zone.as_str()) - .collect::>(); - if (p_zns.len() < n_zones && !p_zns.contains(&role.zone.as_str())) - || (p_zns.len() == n_zones && !self.nodes.iter().any(|(id, _)| *id == node)) - { - self.nodes.push((node, Some(role))); - true - } else { - false - } - } -} diff --git a/src/util/bipartite.rs b/src/util/bipartite.rs new file mode 100644 index 00000000..aec7b042 --- /dev/null +++ b/src/util/bipartite.rs @@ -0,0 +1,378 @@ +/* + * This module deals with graph algorithm in complete bipartite + * graphs. It is used in layout.rs to build the partition to node + * assignation. + * */ + +use std::cmp::{min,max}; +use std::collections::VecDeque; +use rand::prelude::SliceRandom; + +//Graph data structure for the flow algorithm. +#[derive(Clone,Copy,Debug)] +struct EdgeFlow{ + c : i32, + flow : i32, + v : usize, + rev : usize, +} + +//Graph data structure for the detection of positive cycles. +#[derive(Clone,Copy,Debug)] +struct WeightedEdge{ + w : i32, + u : usize, + v : usize, +} + + +/* This function takes two matchings (old_match and new_match) in a + * complete bipartite graph. It returns a matching that has the + * same degree as new_match at every vertex, and that is as close + * as possible to old_match. + * */ +pub fn optimize_matching( old_match : &Vec> , + new_match : &Vec> , + nb_right : usize ) + -> Vec> { + let nb_left = old_match.len(); + let ed = WeightedEdge{w:-1,u:0,v:0}; + let mut edge_vec = vec![ed ; nb_left*nb_right]; + + //We build the complete bipartite graph structure, represented + //by the list of all edges. + for i in 0..nb_left { + for j in 0..nb_right{ + edge_vec[i*nb_right + j].u = i; + edge_vec[i*nb_right + j].v = nb_left+j; + } + } + + for i in 0..edge_vec.len() { + //We add the old matchings + if old_match[edge_vec[i].u].contains(&(edge_vec[i].v-nb_left)) { + edge_vec[i].w *= -1; + } + //We add the new matchings + if new_match[edge_vec[i].u].contains(&(edge_vec[i].v-nb_left)) { + (edge_vec[i].u,edge_vec[i].v) = + (edge_vec[i].v,edge_vec[i].u); + edge_vec[i].w *= -1; + } + } + //Now edge_vec is a graph where edges are oriented LR if we + //can add them to new_match, and RL otherwise. If + //adding/removing them makes the matching closer to old_match + //they have weight 1; and -1 otherwise. + + //We shuffle the edge list so that there is no bias depending in + //partitions/zone label in the triplet dispersion + let mut rng = rand::thread_rng(); + edge_vec.shuffle(&mut rng); + + //Discovering and flipping a cycle with positive weight in this + //graph will make the matching closer to old_match. + //We use Bellman Ford algorithm to discover positive cycles + loop{ + if let Some(cycle) = positive_cycle(&edge_vec, nb_left, nb_right) { + for i in cycle { + //We flip the edges of the cycle. + (edge_vec[i].u,edge_vec[i].v) = + (edge_vec[i].v,edge_vec[i].u); + edge_vec[i].w *= -1; + } + } + else { + //If there is no cycle, we return the optimal matching. + break; + } + } + + //The optimal matching is build from the graph structure. + let mut matching = vec![Vec::::new() ; nb_left]; + for e in edge_vec { + if e.u > e.v { + matching[e.v].push(e.u-nb_left); + } + } + matching +} + +//This function finds a positive cycle in a bipartite wieghted graph. +fn positive_cycle( edge_vec : &Vec, nb_left : usize, + nb_right : usize) -> Option> { + let nb_side_min = min(nb_left, nb_right); + let nb_vertices = nb_left+nb_right; + let weight_lowerbound = -((nb_left +nb_right) as i32) -1; + let mut accessed = vec![false ; nb_left]; + + //We try to find a positive cycle accessible from the left + //vertex i. + for i in 0..nb_left{ + if accessed[i] { + continue; + } + let mut weight =vec![weight_lowerbound ; nb_vertices]; + let mut prev =vec![ edge_vec.len() ; nb_vertices]; + weight[i] = 0; + //We compute largest weighted paths from i. + //Since the graph is bipartite, any simple cycle has length + //at most 2*nb_side_min. In the general Bellman-Ford + //algorithm, the bound here is the number of vertices. Since + //the number of partitions can be much larger than the + //number of nodes, we optimize that. + for _ in 0..(2*nb_side_min) { + for j in 0..edge_vec.len() { + let e = edge_vec[j]; + if weight[e.v] < weight[e.u]+e.w { + weight[e.v] = weight[e.u]+e.w; + prev[e.v] = j; + } + } + } + //We update the accessed table + for i in 0..nb_left { + if weight[i] > weight_lowerbound { + accessed[i] = true; + } + } + //We detect positive cycle + for e in edge_vec { + if weight[e.v] < weight[e.u]+e.w { + //it means e is on a path branching from a positive cycle + let mut was_seen = vec![false ; nb_vertices]; + let mut curr = e.u; + //We track back with prev until we reach the cycle. + while !was_seen[curr]{ + was_seen[curr] = true; + curr = edge_vec[prev[curr]].u; + } + //Now curr is on the cycle. We collect the edges ids. + let mut cycle = Vec::::new(); + cycle.push(prev[curr]); + let mut cycle_vert = edge_vec[prev[curr]].u; + while cycle_vert != curr { + cycle.push(prev[cycle_vert]); + cycle_vert = edge_vec[prev[cycle_vert]].u; + } + + return Some(cycle); + } + } + } + + None +} + + +// This function takes two arrays of capacity and computes the +// maximal matching in the complete bipartite graph such that the +// left vertex i is matched to left_cap_vec[i] right vertices, and +// the right vertex j is matched to right_cap_vec[j] left vertices. +// To do so, we use Dinic's maximum flow algorithm. +pub fn dinic_compute_matching( left_cap_vec : Vec, + right_cap_vec : Vec) -> Vec< Vec > +{ + let mut graph = Vec:: >::new(); + let ed = EdgeFlow{c:0,flow:0,v:0, rev:0}; + + // 0 will be the source + graph.push(vec![ed ; left_cap_vec.len()]); + for i in 0..left_cap_vec.len() + { + graph[0][i].c = left_cap_vec[i] as i32; + graph[0][i].v = i+2; + graph[0][i].rev = 0; + } + + //1 will be the sink + graph.push(vec![ed ; right_cap_vec.len()]); + for i in 0..right_cap_vec.len() + { + graph[1][i].c = right_cap_vec[i] as i32; + graph[1][i].v = i+2+left_cap_vec.len(); + graph[1][i].rev = 0; + } + + //we add left vertices + for i in 0..left_cap_vec.len() { + graph.push(vec![ed ; 1+right_cap_vec.len()]); + graph[i+2][0].c = 0; //directed + graph[i+2][0].v = 0; + graph[i+2][0].rev = i; + + for j in 0..right_cap_vec.len() { + graph[i+2][j+1].c = 1; + graph[i+2][j+1].v = 2+left_cap_vec.len()+j; + graph[i+2][j+1].rev = i+1; + } + } + + //we add right vertices + for i in 0..right_cap_vec.len() { + let lft_ln = left_cap_vec.len(); + graph.push(vec![ed ; 1+lft_ln]); + graph[i+lft_ln+2][0].c = graph[1][i].c; + graph[i+lft_ln+2][0].v = 1; + graph[i+lft_ln+2][0].rev = i; + + for j in 0..left_cap_vec.len() { + graph[i+2+lft_ln][j+1].c = 0; //directed + graph[i+2+lft_ln][j+1].v = j+2; + graph[i+2+lft_ln][j+1].rev = i+1; + } + } + + //To ensure the dispersion of the triplets generated by the + //assignation, we shuffle the neighbours of the nodes. Hence, + //left vertices do not consider the right ones in the same order. + let mut rng = rand::thread_rng(); + for i in 0..graph.len() { + graph[i].shuffle(&mut rng); + //We need to update the ids of the reverse edges. + for j in 0..graph[i].len() { + let target_v = graph[i][j].v; + let target_rev = graph[i][j].rev; + graph[target_v][target_rev].rev = j; + } + } + + let nb_vertices = graph.len(); + + //We run Dinic's max flow algorithm + loop{ + //We build the level array from Dinic's algorithm. + let mut level = vec![-1; nb_vertices]; + + let mut fifo = VecDeque::new(); + fifo.push_back((0,0)); + while !fifo.is_empty() { + if let Some((id,lvl)) = fifo.pop_front(){ + if level[id] == -1 { + level[id] = lvl; + for e in graph[id].iter(){ + if e.c-e.flow > 0{ + fifo.push_back((e.v,lvl+1)); + } + } + } + } + } + if level[1] == -1 { + //There is no residual flow + break; + } + + //Now we run DFS respecting the level array + let mut next_nbd = vec![0; nb_vertices]; + let mut lifo = VecDeque::new(); + + let flow_upper_bound; + if let Some(x) = left_cap_vec.iter().max() { + flow_upper_bound=*x as i32; + } + else { + flow_upper_bound = 0; + assert!(false); + } + + lifo.push_back((0,flow_upper_bound)); + + loop + { + if let Some((id_tmp, f_tmp)) = lifo.back() { + let id = *id_tmp; + let f = *f_tmp; + if id == 1 { + //The DFS reached the sink, we can add a + //residual flow. + lifo.pop_back(); + while !lifo.is_empty() { + if let Some((id,_)) = lifo.pop_back(){ + let nbd=next_nbd[id]; + graph[id][nbd].flow += f; + let id_v = graph[id][nbd].v; + let nbd_v = graph[id][nbd].rev; + graph[id_v][nbd_v].flow -= f; + } + } + lifo.push_back((0,flow_upper_bound)); + continue; + } + //else we did not reach the sink + let nbd = next_nbd[id]; + if nbd >= graph[id].len() { + //There is nothing to explore from id anymore + lifo.pop_back(); + if let Some((parent, _)) = lifo.back(){ + next_nbd[*parent] +=1; + } + continue; + } + //else we can try to send flow from id to its nbd + let new_flow = min(f,graph[id][nbd].c + - graph[id][nbd].flow); + if level[graph[id][nbd].v] <= level[id] || + new_flow == 0 { + //We cannot send flow to nbd. + next_nbd[id] += 1; + continue; + } + //otherwise, we send flow to nbd. + lifo.push_back((graph[id][nbd].v, new_flow)); + } + else { + break; + } + } + } + + //We return the association + let assoc_table = (0..left_cap_vec.len()).map( + |id| graph[id+2].iter() + .filter(|e| e.flow > 0) + .map( |e| e.v-2-left_cap_vec.len()) + .collect()).collect(); + + //consistency check + + //it is a flow + for i in 3..graph.len(){ + assert!( graph[i].iter().map(|e| e.flow).sum::() == 0); + for e in graph[i].iter(){ + assert!(e.flow + graph[e.v][e.rev].flow == 0); + } + } + + //it solves the matching problem + for i in 0..left_cap_vec.len(){ + assert!(left_cap_vec[i] as i32 == + graph[i+2].iter().map(|e| max(0,e.flow)).sum::()); + } + for i in 0..right_cap_vec.len(){ + assert!(right_cap_vec[i] as i32 == + graph[i+2+left_cap_vec.len()].iter() + .map(|e| max(0,e.flow)).sum::()); + } + + + assoc_table +} + + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_flow() { + let left_vec = vec![3;8]; + let right_vec = vec![0,4,8,4,8]; + //There are asserts in the function that computes the flow + let _ = dinic_compute_matching(left_vec, right_vec); + } + + //maybe add tests relative to the matching optilization ? +} + + diff --git a/src/util/lib.rs b/src/util/lib.rs index e83fc2e6..891549c3 100644 --- a/src/util/lib.rs +++ b/src/util/lib.rs @@ -4,6 +4,7 @@ extern crate tracing; pub mod background; +pub mod bipartite; pub mod config; pub mod crdt; pub mod data; From 2aeaddd5e2e1911b084f6d49ccb2236b7fec31af Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Sun, 1 May 2022 09:57:05 +0200 Subject: [PATCH 02/28] Apply cargo fmt --- src/rpc/layout.rs | 876 ++++++++++++++++++++++-------------------- src/util/bipartite.rs | 664 ++++++++++++++++---------------- 2 files changed, 795 insertions(+), 745 deletions(-) diff --git a/src/rpc/layout.rs b/src/rpc/layout.rs index afd7df17..ac31da72 100644 --- a/src/rpc/layout.rs +++ b/src/rpc/layout.rs @@ -1,12 +1,12 @@ +use std::cmp::min; use std::cmp::Ordering; -use std::cmp::{min}; -use std::collections::{HashMap}; +use std::collections::HashMap; use serde::{Deserialize, Serialize}; +use garage_util::bipartite::*; use garage_util::crdt::{AutoCrdt, Crdt, LwwMap}; use garage_util::data::*; -use garage_util::bipartite::*; use rand::prelude::SliceRandom; @@ -168,454 +168,506 @@ impl ClusterLayout { true } + /// This function calculates a new partition-to-node assignation. + /// The computed assignation maximizes the capacity of a + /// partition (assuming all partitions have the same size). + /// Among such optimal assignation, it minimizes the distance to + /// the former assignation (if any) to minimize the amount of + /// data to be moved. A heuristic ensures node triplets + /// dispersion (in garage_util::bipartite::optimize_matching()). + pub fn calculate_partition_assignation(&mut self) -> bool { + //The nodes might have been updated, some might have been deleted. + //So we need to first update the list of nodes and retrieve the + //assignation. + let old_node_assignation = self.update_nodes_and_ring(); - /// This function calculates a new partition-to-node assignation. - /// The computed assignation maximizes the capacity of a - /// partition (assuming all partitions have the same size). - /// Among such optimal assignation, it minimizes the distance to - /// the former assignation (if any) to minimize the amount of - /// data to be moved. A heuristic ensures node triplets - /// dispersion (in garage_util::bipartite::optimize_matching()). - pub fn calculate_partition_assignation(&mut self) -> bool { - - //The nodes might have been updated, some might have been deleted. - //So we need to first update the list of nodes and retrieve the - //assignation. - let old_node_assignation = self.update_nodes_and_ring(); + let (node_zone, _) = self.get_node_zone_capacity(); - let (node_zone, _) = self.get_node_zone_capacity(); - - //We compute the optimal number of partition to assign to - //every node and zone. - if let Some((part_per_nod, part_per_zone)) = self.optimal_proportions(){ - //We collect part_per_zone in a vec to not rely on the - //arbitrary order in which elements are iterated in - //Hashmap::iter() - let part_per_zone_vec = part_per_zone.iter() - .map(|(x,y)| (x.clone(),*y)) - .collect::>(); - //We create an indexing of the zones - let mut zone_id = HashMap::::new(); - for i in 0..part_per_zone_vec.len(){ - zone_id.insert(part_per_zone_vec[i].0.clone(), i); - } - - //We compute a candidate for the new partition to zone - //assignation. - let nb_zones = part_per_zone.len(); - let nb_nodes = part_per_nod.len(); - let nb_partitions = 1<>(); + //We create an indexing of the zones + let mut zone_id = HashMap::::new(); + for i in 0..part_per_zone_vec.len() { + zone_id.insert(part_per_zone_vec[i].0.clone(), i); + } - - //We create the structure for the partition-to-node assignation. - let mut node_assignation = - vec![vec![None; self.replication_factor ];nb_partitions]; - //We will decrement part_per_nod to keep track of the number - //of partitions that we still have to associate. - let mut part_per_nod = part_per_nod.clone(); - - //We minimize the distance to the former assignation(if any) - - //We get the id of the zones of the former assignation - //(and the id no_zone if there is no node assignated) - let no_zone = part_per_zone_vec.len(); - let old_zone_assignation : Vec> = - old_node_assignation.iter().map(|x| x.iter().map( - |id| match *id { Some(i) => zone_id[&node_zone[i]] , - None => no_zone } - ).collect()).collect(); + //We compute a candidate for the new partition to zone + //assignation. + let nb_zones = part_per_zone.len(); + let nb_nodes = part_per_nod.len(); + let nb_partitions = 1 << PARTITION_BITS; + let left_cap_vec = vec![self.replication_factor as u32; nb_partitions]; + let right_cap_vec = part_per_zone_vec.iter().map(|(_, y)| *y as u32).collect(); + let mut zone_assignation = dinic_compute_matching(left_cap_vec, right_cap_vec); - //We minimize the distance to the former zone assignation - zone_assignation = optimize_matching( - &old_zone_assignation, &zone_assignation, nb_zones+1); //+1 for no_zone + //We create the structure for the partition-to-node assignation. + let mut node_assignation = vec![vec![None; self.replication_factor]; nb_partitions]; + //We will decrement part_per_nod to keep track of the number + //of partitions that we still have to associate. + let mut part_per_nod = part_per_nod.clone(); - //We need to assign partitions to nodes in their zone - //We first put the nodes assignation that can stay the same - for i in 0..nb_partitions{ - for j in 0..self.replication_factor { - if let Some(Some(former_node)) = old_node_assignation[i].iter().find( - |x| if let Some(id) = x { - zone_id[&node_zone[*id]] == zone_assignation[i][j] - } - else {false} - ) - { - if part_per_nod[*former_node] > 0 { - node_assignation[i][j] = Some(*former_node); - part_per_nod[*former_node] -= 1; - } - } - } - } + //We minimize the distance to the former assignation(if any) - - //We complete the assignation of partitions to nodes - let mut rng = rand::thread_rng(); - for i in 0..nb_partitions { - for j in 0..self.replication_factor { - if node_assignation[i][j] == None { - let possible_nodes : Vec = (0..nb_nodes) - .filter( - |id| zone_id[&node_zone[*id]] == zone_assignation[i][j] - && part_per_nod[*id] > 0).collect(); - assert!(possible_nodes.len()>0); - //We randomly pick a node - if let Some(nod) = possible_nodes.choose(&mut rng){ - node_assignation[i][j] = Some(*nod); - part_per_nod[*nod] -= 1; - } - } - } - } + //We get the id of the zones of the former assignation + //(and the id no_zone if there is no node assignated) + let no_zone = part_per_zone_vec.len(); + let old_zone_assignation: Vec> = old_node_assignation + .iter() + .map(|x| { + x.iter() + .map(|id| match *id { + Some(i) => zone_id[&node_zone[i]], + None => no_zone, + }) + .collect() + }) + .collect(); - //We write the assignation in the 1D table - self.ring_assignation_data = Vec::::new(); - for i in 0..nb_partitions{ - for j in 0..self.replication_factor { - if let Some(id) = node_assignation[i][j] { - self.ring_assignation_data.push(id as CompactNodeType); - } - else {assert!(false)} - } - } + //We minimize the distance to the former zone assignation + zone_assignation = + optimize_matching(&old_zone_assignation, &zone_assignation, nb_zones + 1); //+1 for no_zone - true - } - else { false } - } + //We need to assign partitions to nodes in their zone + //We first put the nodes assignation that can stay the same + for i in 0..nb_partitions { + for j in 0..self.replication_factor { + if let Some(Some(former_node)) = old_node_assignation[i].iter().find(|x| { + if let Some(id) = x { + zone_id[&node_zone[*id]] == zone_assignation[i][j] + } else { + false + } + }) { + if part_per_nod[*former_node] > 0 { + node_assignation[i][j] = Some(*former_node); + part_per_nod[*former_node] -= 1; + } + } + } + } - /// The LwwMap of node roles might have changed. This function updates the node_id_vec - /// and returns the assignation given by ring, with the new indices of the nodes, and - /// None of the node is not present anymore. - /// We work with the assumption that only this function and calculate_new_assignation - /// do modify assignation_ring and node_id_vec. - fn update_nodes_and_ring(&mut self) -> Vec>> { - let nb_partitions = 1usize< = self.roles.items().iter() - .map(|(k, _, _)| *k) - .collect(); - - if ring.len() == rf*nb_partitions { - for i in 0..nb_partitions { - for j in 0..self.replication_factor { - node_assignation[i][j] = new_node_id_vec.iter() - .position(|id| *id == self.node_id_vec[ring[i*rf + j] as usize]); - } - } - } + //We complete the assignation of partitions to nodes + let mut rng = rand::thread_rng(); + for i in 0..nb_partitions { + for j in 0..self.replication_factor { + if node_assignation[i][j] == None { + let possible_nodes: Vec = (0..nb_nodes) + .filter(|id| { + zone_id[&node_zone[*id]] == zone_assignation[i][j] + && part_per_nod[*id] > 0 + }) + .collect(); + assert!(possible_nodes.len() > 0); + //We randomly pick a node + if let Some(nod) = possible_nodes.choose(&mut rng) { + node_assignation[i][j] = Some(*nod); + part_per_nod[*nod] -= 1; + } + } + } + } - self.node_id_vec = new_node_id_vec; - self.ring_assignation_data = vec![]; - return node_assignation; - } - - ///This function compute the number of partition to assign to - ///every node and zone, so that every partition is replicated - ///self.replication_factor times and the capacity of a partition - ///is maximized. - fn optimal_proportions(&mut self) -> Option<(Vec, HashMap)> { - - let mut zone_capacity :HashMap= HashMap::new(); - - let (node_zone, node_capacity) = self.get_node_zone_capacity(); - let nb_nodes = self.node_id_vec.len(); + //We write the assignation in the 1D table + self.ring_assignation_data = Vec::::new(); + for i in 0..nb_partitions { + for j in 0..self.replication_factor { + if let Some(id) = node_assignation[i][j] { + self.ring_assignation_data.push(id as CompactNodeType); + } else { + assert!(false) + } + } + } - for i in 0..nb_nodes - { - if zone_capacity.contains_key(&node_zone[i]) { - zone_capacity.insert(node_zone[i].clone(), zone_capacity[&node_zone[i]] + node_capacity[i]); - } - else{ - zone_capacity.insert(node_zone[i].clone(), node_capacity[i]); - } - } + true + } else { + false + } + } - //Compute the optimal number of partitions per zone - let sum_capacities: u32 =zone_capacity.values().sum(); - - if sum_capacities <= 0 { - println!("No storage capacity in the network."); - return None; - } + /// The LwwMap of node roles might have changed. This function updates the node_id_vec + /// and returns the assignation given by ring, with the new indices of the nodes, and + /// None of the node is not present anymore. + /// We work with the assumption that only this function and calculate_new_assignation + /// do modify assignation_ring and node_id_vec. + fn update_nodes_and_ring(&mut self) -> Vec>> { + let nb_partitions = 1usize << PARTITION_BITS; + let mut node_assignation = vec![vec![None; self.replication_factor]; nb_partitions]; + let rf = self.replication_factor; + let ring = &self.ring_assignation_data; - let nb_partitions = 1< = - zone_capacity.iter() - .map(|(k, v)| (k.clone(), min(nb_partitions, - (self.replication_factor*nb_partitions - **v as usize)/sum_capacities as usize) ) ).collect(); + let new_node_id_vec: Vec = self.roles.items().iter().map(|(k, _, _)| *k).collect(); - //The replication_factor-1 upper bounds the number of - //part_per_zones that are greater than nb_partitions - for _ in 1..self.replication_factor { - //The number of partitions that are not assignated to - //a zone that takes nb_partitions. - let sum_capleft : u32 = zone_capacity.keys() - .filter(| k | {part_per_zone[*k] < nb_partitions} ) - .map(|k| zone_capacity[k]).sum(); - - //The number of replication of the data that we need - //to ensure. - let repl_left = self.replication_factor - - part_per_zone.values() - .filter(|x| {**x == nb_partitions}) - .count(); - if repl_left == 0 { - break; - } + if ring.len() == rf * nb_partitions { + for i in 0..nb_partitions { + for j in 0..self.replication_factor { + node_assignation[i][j] = new_node_id_vec + .iter() + .position(|id| *id == self.node_id_vec[ring[i * rf + j] as usize]); + } + } + } - for k in zone_capacity.keys() { - if part_per_zone[k] != nb_partitions - { - part_per_zone.insert(k.to_string() , min(nb_partitions, - (nb_partitions*zone_capacity[k] as usize - *repl_left)/sum_capleft as usize)); - } - } - } + self.node_id_vec = new_node_id_vec; + self.ring_assignation_data = vec![]; + return node_assignation; + } - //Now we divide the zone's partition share proportionally - //between their nodes. - - let mut part_per_nod : Vec = (0..nb_nodes).map( - |i| (part_per_zone[&node_zone[i]]*node_capacity[i] as usize)/zone_capacity[&node_zone[i]] as usize - ) - .collect(); + ///This function compute the number of partition to assign to + ///every node and zone, so that every partition is replicated + ///self.replication_factor times and the capacity of a partition + ///is maximized. + fn optimal_proportions(&mut self) -> Option<(Vec, HashMap)> { + let mut zone_capacity: HashMap = HashMap::new(); - //We must update the part_per_zone to make it correspond to - //part_per_nod (because of integer rounding) - part_per_zone = part_per_zone.iter().map(|(k,_)| - (k.clone(), 0)) - .collect(); - for i in 0..nb_nodes { - part_per_zone.insert( - node_zone[i].clone() , - part_per_zone[&node_zone[i]] + part_per_nod[i]); - } + let (node_zone, node_capacity) = self.get_node_zone_capacity(); + let nb_nodes = self.node_id_vec.len(); - //Because of integer rounding, the total sum of part_per_nod - //might not be replication_factor*nb_partitions. - // We need at most to add 1 to every non maximal value of - // part_per_nod. The capacity of a partition will be bounded - // by the minimal value of - // node_capacity_vec[i]/part_per_nod[i] - // so we try to maximize this minimal value, keeping the - // part_per_zone capped + for i in 0..nb_nodes { + if zone_capacity.contains_key(&node_zone[i]) { + zone_capacity.insert( + node_zone[i].clone(), + zone_capacity[&node_zone[i]] + node_capacity[i], + ); + } else { + zone_capacity.insert(node_zone[i].clone(), node_capacity[i]); + } + } - let discrepancy : usize = - nb_partitions*self.replication_factor - - part_per_nod.iter().sum::(); - - //We use a stupid O(N^2) algorithm. If the number of nodes - //is actually expected to be high, one should optimize this. + //Compute the optimal number of partitions per zone + let sum_capacities: u32 = zone_capacity.values().sum(); - for _ in 0..discrepancy { - if let Some(idmax) = (0..nb_nodes) - .filter(|i| part_per_zone[&node_zone[*i]] < nb_partitions) - .max_by( |i,j| - (node_capacity[*i]*(part_per_nod[*j]+1) as u32) - .cmp(&(node_capacity[*j]*(part_per_nod[*i]+1) as u32)) - ) - { - part_per_nod[idmax] += 1; - part_per_zone.insert(node_zone[idmax].clone(),part_per_zone[&node_zone[idmax]]+1); - } - } + if sum_capacities <= 0 { + println!("No storage capacity in the network."); + return None; + } - //We check the algorithm consistency - - let discrepancy : usize = - nb_partitions*self.replication_factor - - part_per_nod.iter().sum::(); - assert!(discrepancy == 0); - assert!(if let Some(v) = part_per_zone.values().max() - {*v <= nb_partitions} else {false} ); - - Some((part_per_nod, part_per_zone)) - } - - - //Returns vectors of zone and capacity; indexed by the same (temporary) - //indices as node_id_vec. - fn get_node_zone_capacity(& self) -> (Vec , Vec) { - - let node_zone = self.node_id_vec.iter().map( - |id_nod| match self.node_role(id_nod) { - Some(NodeRole{zone,capacity:_,tags:_}) => zone.clone() , - _ => "".to_string() - } - ).collect(); - - let node_capacity = self.node_id_vec.iter().map( - |id_nod| match self.node_role(id_nod) { - Some(NodeRole{zone:_,capacity,tags:_}) => - if let Some(c)=capacity - {*c} - else {0}, - _ => 0 - } - ).collect(); + let nb_partitions = 1 << PARTITION_BITS; - (node_zone,node_capacity) - } + //Initially we would like to use zones porportionally to + //their capacity. + //However, a large zone can be associated to at most + //nb_partitions to ensure replication of the date. + //So we take the min with nb_partitions: + let mut part_per_zone: HashMap = zone_capacity + .iter() + .map(|(k, v)| { + ( + k.clone(), + min( + nb_partitions, + (self.replication_factor * nb_partitions * *v as usize) + / sum_capacities as usize, + ), + ) + }) + .collect(); + //The replication_factor-1 upper bounds the number of + //part_per_zones that are greater than nb_partitions + for _ in 1..self.replication_factor { + //The number of partitions that are not assignated to + //a zone that takes nb_partitions. + let sum_capleft: u32 = zone_capacity + .keys() + .filter(|k| part_per_zone[*k] < nb_partitions) + .map(|k| zone_capacity[k]) + .sum(); + + //The number of replication of the data that we need + //to ensure. + let repl_left = self.replication_factor + - part_per_zone + .values() + .filter(|x| **x == nb_partitions) + .count(); + if repl_left == 0 { + break; + } + + for k in zone_capacity.keys() { + if part_per_zone[k] != nb_partitions { + part_per_zone.insert( + k.to_string(), + min( + nb_partitions, + (nb_partitions * zone_capacity[k] as usize * repl_left) + / sum_capleft as usize, + ), + ); + } + } + } + + //Now we divide the zone's partition share proportionally + //between their nodes. + + let mut part_per_nod: Vec = (0..nb_nodes) + .map(|i| { + (part_per_zone[&node_zone[i]] * node_capacity[i] as usize) + / zone_capacity[&node_zone[i]] as usize + }) + .collect(); + + //We must update the part_per_zone to make it correspond to + //part_per_nod (because of integer rounding) + part_per_zone = part_per_zone.iter().map(|(k, _)| (k.clone(), 0)).collect(); + for i in 0..nb_nodes { + part_per_zone.insert( + node_zone[i].clone(), + part_per_zone[&node_zone[i]] + part_per_nod[i], + ); + } + + //Because of integer rounding, the total sum of part_per_nod + //might not be replication_factor*nb_partitions. + // We need at most to add 1 to every non maximal value of + // part_per_nod. The capacity of a partition will be bounded + // by the minimal value of + // node_capacity_vec[i]/part_per_nod[i] + // so we try to maximize this minimal value, keeping the + // part_per_zone capped + + let discrepancy: usize = + nb_partitions * self.replication_factor - part_per_nod.iter().sum::(); + + //We use a stupid O(N^2) algorithm. If the number of nodes + //is actually expected to be high, one should optimize this. + + for _ in 0..discrepancy { + if let Some(idmax) = (0..nb_nodes) + .filter(|i| part_per_zone[&node_zone[*i]] < nb_partitions) + .max_by(|i, j| { + (node_capacity[*i] * (part_per_nod[*j] + 1) as u32) + .cmp(&(node_capacity[*j] * (part_per_nod[*i] + 1) as u32)) + }) { + part_per_nod[idmax] += 1; + part_per_zone.insert( + node_zone[idmax].clone(), + part_per_zone[&node_zone[idmax]] + 1, + ); + } + } + + //We check the algorithm consistency + + let discrepancy: usize = + nb_partitions * self.replication_factor - part_per_nod.iter().sum::(); + assert!(discrepancy == 0); + assert!(if let Some(v) = part_per_zone.values().max() { + *v <= nb_partitions + } else { + false + }); + + Some((part_per_nod, part_per_zone)) + } + + //Returns vectors of zone and capacity; indexed by the same (temporary) + //indices as node_id_vec. + fn get_node_zone_capacity(&self) -> (Vec, Vec) { + let node_zone = self + .node_id_vec + .iter() + .map(|id_nod| match self.node_role(id_nod) { + Some(NodeRole { + zone, + capacity: _, + tags: _, + }) => zone.clone(), + _ => "".to_string(), + }) + .collect(); + + let node_capacity = self + .node_id_vec + .iter() + .map(|id_nod| match self.node_role(id_nod) { + Some(NodeRole { + zone: _, + capacity, + tags: _, + }) => { + if let Some(c) = capacity { + *c + } else { + 0 + } + } + _ => 0, + }) + .collect(); + + (node_zone, node_capacity) + } } - - #[cfg(test)] mod tests { - use super::*; - use itertools::Itertools; + use super::*; + use itertools::Itertools; - fn check_assignation(cl : &ClusterLayout) { - - //Check that input data has the right format - let nb_partitions = 1usize<>(); + //Check that is is a correct assignation with zone redundancy + let rf = cl.replication_factor; + for i in 0..nb_partitions { + assert!( + rf == cl.ring_assignation_data[rf * i..rf * (i + 1)] + .iter() + .map(|nod| node_zone[*nod as usize].clone()) + .unique() + .count() + ); + } - let zone_vec = node_zone.iter().unique().collect::>(); - let zone_nb_part = zone_vec.iter().map( |z| cl.ring_assignation_data.iter() - .filter(|x| node_zone[**x as usize] == **z) - .count() - ).collect::>(); - - //Check optimality of the zone assignation : would it be better for the - //node_capacity/node_partitions ratio to change the assignation of a partition - - if let Some(idmin) = (0..nb_nodes).min_by( - |i,j| (node_capacity[*i]*node_nb_part[*j] as u32) - .cmp(&(node_capacity[*j]*node_nb_part[*i] as u32)) - ){ - if let Some(idnew) = (0..nb_nodes) - .filter( |i| if let Some(p) = zone_vec.iter().position(|z| **z==node_zone[*i]) - {zone_nb_part[p] < nb_partitions } - else { false }) - .max_by( - |i,j| (node_capacity[*i]*(node_nb_part[*j]as u32+1)) - .cmp(&(node_capacity[*j]*(node_nb_part[*i] as u32+1))) - ){ - assert!(node_capacity[idmin]*(node_nb_part[idnew] as u32+1) >= - node_capacity[idnew]*node_nb_part[idmin] as u32); - } + let nb_nodes = cl.node_id_vec.len(); + //Check optimality + let node_nb_part = (0..nb_nodes) + .map(|i| { + cl.ring_assignation_data + .iter() + .filter(|x| **x == i as u8) + .count() + }) + .collect::>(); - } + let zone_vec = node_zone.iter().unique().collect::>(); + let zone_nb_part = zone_vec + .iter() + .map(|z| { + cl.ring_assignation_data + .iter() + .filter(|x| node_zone[**x as usize] == **z) + .count() + }) + .collect::>(); - //In every zone, check optimality of the nod assignation - for z in zone_vec { - let node_of_z_iter = (0..nb_nodes).filter(|id| node_zone[*id] == *z ); - if let Some(idmin) = node_of_z_iter.clone().min_by( - |i,j| (node_capacity[*i]*node_nb_part[*j] as u32) - .cmp(&(node_capacity[*j]*node_nb_part[*i] as u32)) - ){ - if let Some(idnew) = node_of_z_iter.min_by( - |i,j| (node_capacity[*i]*(node_nb_part[*j] as u32+1)) - .cmp(&(node_capacity[*j]*(node_nb_part[*i] as u32+1))) - ){ - assert!(node_capacity[idmin]*(node_nb_part[idnew] as u32+1) >= - node_capacity[idnew]*node_nb_part[idmin] as u32); - } - } - } - - } + //Check optimality of the zone assignation : would it be better for the + //node_capacity/node_partitions ratio to change the assignation of a partition - fn update_layout(cl : &mut ClusterLayout, node_id_vec : &Vec, - node_capacity_vec : &Vec , node_zone_vec : &Vec) { - for i in 0..node_id_vec.len(){ - if let Some(x) = FixedBytes32::try_from(&[i as u8;32]) { - cl.node_id_vec.push(x); - } - - let update = cl.roles.update_mutator(cl.node_id_vec[i] , - NodeRoleV(Some(NodeRole{ - zone : (node_zone_vec[i].to_string()), - capacity : (Some(node_capacity_vec[i])), - tags : (vec![])}))); - cl.roles.merge(&update); - } - } + if let Some(idmin) = (0..nb_nodes).min_by(|i, j| { + (node_capacity[*i] * node_nb_part[*j] as u32) + .cmp(&(node_capacity[*j] * node_nb_part[*i] as u32)) + }) { + if let Some(idnew) = (0..nb_nodes) + .filter(|i| { + if let Some(p) = zone_vec.iter().position(|z| **z == node_zone[*i]) { + zone_nb_part[p] < nb_partitions + } else { + false + } + }) + .max_by(|i, j| { + (node_capacity[*i] * (node_nb_part[*j] as u32 + 1)) + .cmp(&(node_capacity[*j] * (node_nb_part[*i] as u32 + 1))) + }) { + assert!( + node_capacity[idmin] * (node_nb_part[idnew] as u32 + 1) + >= node_capacity[idnew] * node_nb_part[idmin] as u32 + ); + } + } - #[test] - fn test_assignation() { + //In every zone, check optimality of the nod assignation + for z in zone_vec { + let node_of_z_iter = (0..nb_nodes).filter(|id| node_zone[*id] == *z); + if let Some(idmin) = node_of_z_iter.clone().min_by(|i, j| { + (node_capacity[*i] * node_nb_part[*j] as u32) + .cmp(&(node_capacity[*j] * node_nb_part[*i] as u32)) + }) { + if let Some(idnew) = node_of_z_iter.min_by(|i, j| { + (node_capacity[*i] * (node_nb_part[*j] as u32 + 1)) + .cmp(&(node_capacity[*j] * (node_nb_part[*i] as u32 + 1))) + }) { + assert!( + node_capacity[idmin] * (node_nb_part[idnew] as u32 + 1) + >= node_capacity[idnew] * node_nb_part[idmin] as u32 + ); + } + } + } + } - let mut node_id_vec = vec![1,2,3]; - let mut node_capacity_vec = vec![4000,1000,2000]; - let mut node_zone_vec= vec!["A", "B", "C"].into_iter().map(|x| x.to_string()).collect(); - - let mut cl = ClusterLayout { - node_id_vec: vec![], - - roles : LwwMap::new(), + fn update_layout( + cl: &mut ClusterLayout, + node_id_vec: &Vec, + node_capacity_vec: &Vec, + node_zone_vec: &Vec, + ) { + for i in 0..node_id_vec.len() { + if let Some(x) = FixedBytes32::try_from(&[i as u8; 32]) { + cl.node_id_vec.push(x); + } - replication_factor: 3, - ring_assignation_data : vec![], - version:0, - staging: LwwMap::new(), - staging_hash: sha256sum(&[1;32]), - }; - update_layout(&mut cl, &node_id_vec, &node_capacity_vec, &node_zone_vec); - cl.calculate_partition_assignation(); - check_assignation(&cl); + let update = cl.roles.update_mutator( + cl.node_id_vec[i], + NodeRoleV(Some(NodeRole { + zone: (node_zone_vec[i].to_string()), + capacity: (Some(node_capacity_vec[i])), + tags: (vec![]), + })), + ); + cl.roles.merge(&update); + } + } - node_id_vec = vec![1,2,3, 4, 5, 6, 7, 8, 9]; - node_capacity_vec = vec![4000,1000,1000, 3000, 1000, 1000, 2000, 10000, 2000]; - node_zone_vec= vec!["A", "B", "C", "C", "C", "B", "G", "H", "I"].into_iter().map(|x| x.to_string()).collect(); - update_layout(&mut cl, &node_id_vec, &node_capacity_vec, &node_zone_vec); - cl.calculate_partition_assignation(); - check_assignation(&cl); + #[test] + fn test_assignation() { + let mut node_id_vec = vec![1, 2, 3]; + let mut node_capacity_vec = vec![4000, 1000, 2000]; + let mut node_zone_vec = vec!["A", "B", "C"] + .into_iter() + .map(|x| x.to_string()) + .collect(); - node_capacity_vec = vec![4000,1000,2000, 7000, 1000, 1000, 2000, 10000, 2000]; - update_layout(&mut cl, &node_id_vec, &node_capacity_vec, &node_zone_vec); - cl.calculate_partition_assignation(); - check_assignation(&cl); + let mut cl = ClusterLayout { + node_id_vec: vec![], + roles: LwwMap::new(), - node_capacity_vec = vec![4000,4000,2000, 7000, 1000, 9000, 2000, 10, 2000]; - update_layout(&mut cl, &node_id_vec, &node_capacity_vec, &node_zone_vec); - cl.calculate_partition_assignation(); - check_assignation(&cl); - - } + replication_factor: 3, + ring_assignation_data: vec![], + version: 0, + staging: LwwMap::new(), + staging_hash: sha256sum(&[1; 32]), + }; + update_layout(&mut cl, &node_id_vec, &node_capacity_vec, &node_zone_vec); + cl.calculate_partition_assignation(); + check_assignation(&cl); + + node_id_vec = vec![1, 2, 3, 4, 5, 6, 7, 8, 9]; + node_capacity_vec = vec![4000, 1000, 1000, 3000, 1000, 1000, 2000, 10000, 2000]; + node_zone_vec = vec!["A", "B", "C", "C", "C", "B", "G", "H", "I"] + .into_iter() + .map(|x| x.to_string()) + .collect(); + update_layout(&mut cl, &node_id_vec, &node_capacity_vec, &node_zone_vec); + cl.calculate_partition_assignation(); + check_assignation(&cl); + + node_capacity_vec = vec![4000, 1000, 2000, 7000, 1000, 1000, 2000, 10000, 2000]; + update_layout(&mut cl, &node_id_vec, &node_capacity_vec, &node_zone_vec); + cl.calculate_partition_assignation(); + check_assignation(&cl); + + node_capacity_vec = vec![4000, 4000, 2000, 7000, 1000, 9000, 2000, 10, 2000]; + update_layout(&mut cl, &node_id_vec, &node_capacity_vec, &node_zone_vec); + cl.calculate_partition_assignation(); + check_assignation(&cl); + } } - - - diff --git a/src/util/bipartite.rs b/src/util/bipartite.rs index aec7b042..ade831a4 100644 --- a/src/util/bipartite.rs +++ b/src/util/bipartite.rs @@ -1,378 +1,376 @@ /* - * This module deals with graph algorithm in complete bipartite + * This module deals with graph algorithm in complete bipartite * graphs. It is used in layout.rs to build the partition to node * assignation. * */ -use std::cmp::{min,max}; -use std::collections::VecDeque; use rand::prelude::SliceRandom; +use std::cmp::{max, min}; +use std::collections::VecDeque; //Graph data structure for the flow algorithm. -#[derive(Clone,Copy,Debug)] -struct EdgeFlow{ - c : i32, - flow : i32, - v : usize, - rev : usize, +#[derive(Clone, Copy, Debug)] +struct EdgeFlow { + c: i32, + flow: i32, + v: usize, + rev: usize, } //Graph data structure for the detection of positive cycles. -#[derive(Clone,Copy,Debug)] -struct WeightedEdge{ - w : i32, - u : usize, - v : usize, +#[derive(Clone, Copy, Debug)] +struct WeightedEdge { + w: i32, + u: usize, + v: usize, } - -/* This function takes two matchings (old_match and new_match) in a - * complete bipartite graph. It returns a matching that has the +/* This function takes two matchings (old_match and new_match) in a + * complete bipartite graph. It returns a matching that has the * same degree as new_match at every vertex, and that is as close * as possible to old_match. * */ -pub fn optimize_matching( old_match : &Vec> , - new_match : &Vec> , - nb_right : usize ) - -> Vec> { - let nb_left = old_match.len(); - let ed = WeightedEdge{w:-1,u:0,v:0}; - let mut edge_vec = vec![ed ; nb_left*nb_right]; - - //We build the complete bipartite graph structure, represented - //by the list of all edges. - for i in 0..nb_left { - for j in 0..nb_right{ - edge_vec[i*nb_right + j].u = i; - edge_vec[i*nb_right + j].v = nb_left+j; - } - } +pub fn optimize_matching( + old_match: &Vec>, + new_match: &Vec>, + nb_right: usize, +) -> Vec> { + let nb_left = old_match.len(); + let ed = WeightedEdge { w: -1, u: 0, v: 0 }; + let mut edge_vec = vec![ed; nb_left * nb_right]; - for i in 0..edge_vec.len() { - //We add the old matchings - if old_match[edge_vec[i].u].contains(&(edge_vec[i].v-nb_left)) { - edge_vec[i].w *= -1; - } - //We add the new matchings - if new_match[edge_vec[i].u].contains(&(edge_vec[i].v-nb_left)) { - (edge_vec[i].u,edge_vec[i].v) = - (edge_vec[i].v,edge_vec[i].u); - edge_vec[i].w *= -1; - } - } - //Now edge_vec is a graph where edges are oriented LR if we - //can add them to new_match, and RL otherwise. If - //adding/removing them makes the matching closer to old_match - //they have weight 1; and -1 otherwise. - - //We shuffle the edge list so that there is no bias depending in - //partitions/zone label in the triplet dispersion - let mut rng = rand::thread_rng(); - edge_vec.shuffle(&mut rng); - - //Discovering and flipping a cycle with positive weight in this - //graph will make the matching closer to old_match. - //We use Bellman Ford algorithm to discover positive cycles - loop{ - if let Some(cycle) = positive_cycle(&edge_vec, nb_left, nb_right) { - for i in cycle { - //We flip the edges of the cycle. - (edge_vec[i].u,edge_vec[i].v) = - (edge_vec[i].v,edge_vec[i].u); - edge_vec[i].w *= -1; - } - } - else { - //If there is no cycle, we return the optimal matching. - break; - } - } - - //The optimal matching is build from the graph structure. - let mut matching = vec![Vec::::new() ; nb_left]; - for e in edge_vec { - if e.u > e.v { - matching[e.v].push(e.u-nb_left); - } - } - matching + //We build the complete bipartite graph structure, represented + //by the list of all edges. + for i in 0..nb_left { + for j in 0..nb_right { + edge_vec[i * nb_right + j].u = i; + edge_vec[i * nb_right + j].v = nb_left + j; + } + } + + for i in 0..edge_vec.len() { + //We add the old matchings + if old_match[edge_vec[i].u].contains(&(edge_vec[i].v - nb_left)) { + edge_vec[i].w *= -1; + } + //We add the new matchings + if new_match[edge_vec[i].u].contains(&(edge_vec[i].v - nb_left)) { + (edge_vec[i].u, edge_vec[i].v) = (edge_vec[i].v, edge_vec[i].u); + edge_vec[i].w *= -1; + } + } + //Now edge_vec is a graph where edges are oriented LR if we + //can add them to new_match, and RL otherwise. If + //adding/removing them makes the matching closer to old_match + //they have weight 1; and -1 otherwise. + + //We shuffle the edge list so that there is no bias depending in + //partitions/zone label in the triplet dispersion + let mut rng = rand::thread_rng(); + edge_vec.shuffle(&mut rng); + + //Discovering and flipping a cycle with positive weight in this + //graph will make the matching closer to old_match. + //We use Bellman Ford algorithm to discover positive cycles + loop { + if let Some(cycle) = positive_cycle(&edge_vec, nb_left, nb_right) { + for i in cycle { + //We flip the edges of the cycle. + (edge_vec[i].u, edge_vec[i].v) = (edge_vec[i].v, edge_vec[i].u); + edge_vec[i].w *= -1; + } + } else { + //If there is no cycle, we return the optimal matching. + break; + } + } + + //The optimal matching is build from the graph structure. + let mut matching = vec![Vec::::new(); nb_left]; + for e in edge_vec { + if e.u > e.v { + matching[e.v].push(e.u - nb_left); + } + } + matching } //This function finds a positive cycle in a bipartite wieghted graph. -fn positive_cycle( edge_vec : &Vec, nb_left : usize, - nb_right : usize) -> Option> { - let nb_side_min = min(nb_left, nb_right); - let nb_vertices = nb_left+nb_right; - let weight_lowerbound = -((nb_left +nb_right) as i32) -1; - let mut accessed = vec![false ; nb_left]; - - //We try to find a positive cycle accessible from the left - //vertex i. - for i in 0..nb_left{ - if accessed[i] { - continue; - } - let mut weight =vec![weight_lowerbound ; nb_vertices]; - let mut prev =vec![ edge_vec.len() ; nb_vertices]; - weight[i] = 0; - //We compute largest weighted paths from i. - //Since the graph is bipartite, any simple cycle has length - //at most 2*nb_side_min. In the general Bellman-Ford - //algorithm, the bound here is the number of vertices. Since - //the number of partitions can be much larger than the - //number of nodes, we optimize that. - for _ in 0..(2*nb_side_min) { - for j in 0..edge_vec.len() { - let e = edge_vec[j]; - if weight[e.v] < weight[e.u]+e.w { - weight[e.v] = weight[e.u]+e.w; - prev[e.v] = j; - } - } - } - //We update the accessed table - for i in 0..nb_left { - if weight[i] > weight_lowerbound { - accessed[i] = true; - } - } - //We detect positive cycle - for e in edge_vec { - if weight[e.v] < weight[e.u]+e.w { - //it means e is on a path branching from a positive cycle - let mut was_seen = vec![false ; nb_vertices]; - let mut curr = e.u; - //We track back with prev until we reach the cycle. - while !was_seen[curr]{ - was_seen[curr] = true; - curr = edge_vec[prev[curr]].u; - } - //Now curr is on the cycle. We collect the edges ids. - let mut cycle = Vec::::new(); - cycle.push(prev[curr]); - let mut cycle_vert = edge_vec[prev[curr]].u; - while cycle_vert != curr { - cycle.push(prev[cycle_vert]); - cycle_vert = edge_vec[prev[cycle_vert]].u; - } +fn positive_cycle( + edge_vec: &Vec, + nb_left: usize, + nb_right: usize, +) -> Option> { + let nb_side_min = min(nb_left, nb_right); + let nb_vertices = nb_left + nb_right; + let weight_lowerbound = -((nb_left + nb_right) as i32) - 1; + let mut accessed = vec![false; nb_left]; - return Some(cycle); - } - } - } + //We try to find a positive cycle accessible from the left + //vertex i. + for i in 0..nb_left { + if accessed[i] { + continue; + } + let mut weight = vec![weight_lowerbound; nb_vertices]; + let mut prev = vec![edge_vec.len(); nb_vertices]; + weight[i] = 0; + //We compute largest weighted paths from i. + //Since the graph is bipartite, any simple cycle has length + //at most 2*nb_side_min. In the general Bellman-Ford + //algorithm, the bound here is the number of vertices. Since + //the number of partitions can be much larger than the + //number of nodes, we optimize that. + for _ in 0..(2 * nb_side_min) { + for j in 0..edge_vec.len() { + let e = edge_vec[j]; + if weight[e.v] < weight[e.u] + e.w { + weight[e.v] = weight[e.u] + e.w; + prev[e.v] = j; + } + } + } + //We update the accessed table + for i in 0..nb_left { + if weight[i] > weight_lowerbound { + accessed[i] = true; + } + } + //We detect positive cycle + for e in edge_vec { + if weight[e.v] < weight[e.u] + e.w { + //it means e is on a path branching from a positive cycle + let mut was_seen = vec![false; nb_vertices]; + let mut curr = e.u; + //We track back with prev until we reach the cycle. + while !was_seen[curr] { + was_seen[curr] = true; + curr = edge_vec[prev[curr]].u; + } + //Now curr is on the cycle. We collect the edges ids. + let mut cycle = Vec::::new(); + cycle.push(prev[curr]); + let mut cycle_vert = edge_vec[prev[curr]].u; + while cycle_vert != curr { + cycle.push(prev[cycle_vert]); + cycle_vert = edge_vec[prev[cycle_vert]].u; + } - None + return Some(cycle); + } + } + } + + None } - -// This function takes two arrays of capacity and computes the -// maximal matching in the complete bipartite graph such that the +// This function takes two arrays of capacity and computes the +// maximal matching in the complete bipartite graph such that the // left vertex i is matched to left_cap_vec[i] right vertices, and // the right vertex j is matched to right_cap_vec[j] left vertices. // To do so, we use Dinic's maximum flow algorithm. -pub fn dinic_compute_matching( left_cap_vec : Vec, - right_cap_vec : Vec) -> Vec< Vec > -{ - let mut graph = Vec:: >::new(); - let ed = EdgeFlow{c:0,flow:0,v:0, rev:0}; +pub fn dinic_compute_matching(left_cap_vec: Vec, right_cap_vec: Vec) -> Vec> { + let mut graph = Vec::>::new(); + let ed = EdgeFlow { + c: 0, + flow: 0, + v: 0, + rev: 0, + }; - // 0 will be the source - graph.push(vec![ed ; left_cap_vec.len()]); - for i in 0..left_cap_vec.len() - { - graph[0][i].c = left_cap_vec[i] as i32; - graph[0][i].v = i+2; - graph[0][i].rev = 0; - } + // 0 will be the source + graph.push(vec![ed; left_cap_vec.len()]); + for i in 0..left_cap_vec.len() { + graph[0][i].c = left_cap_vec[i] as i32; + graph[0][i].v = i + 2; + graph[0][i].rev = 0; + } - //1 will be the sink - graph.push(vec![ed ; right_cap_vec.len()]); - for i in 0..right_cap_vec.len() - { - graph[1][i].c = right_cap_vec[i] as i32; - graph[1][i].v = i+2+left_cap_vec.len(); - graph[1][i].rev = 0; - } - - //we add left vertices - for i in 0..left_cap_vec.len() { - graph.push(vec![ed ; 1+right_cap_vec.len()]); - graph[i+2][0].c = 0; //directed - graph[i+2][0].v = 0; - graph[i+2][0].rev = i; + //1 will be the sink + graph.push(vec![ed; right_cap_vec.len()]); + for i in 0..right_cap_vec.len() { + graph[1][i].c = right_cap_vec[i] as i32; + graph[1][i].v = i + 2 + left_cap_vec.len(); + graph[1][i].rev = 0; + } - for j in 0..right_cap_vec.len() { - graph[i+2][j+1].c = 1; - graph[i+2][j+1].v = 2+left_cap_vec.len()+j; - graph[i+2][j+1].rev = i+1; - } - } + //we add left vertices + for i in 0..left_cap_vec.len() { + graph.push(vec![ed; 1 + right_cap_vec.len()]); + graph[i + 2][0].c = 0; //directed + graph[i + 2][0].v = 0; + graph[i + 2][0].rev = i; - //we add right vertices - for i in 0..right_cap_vec.len() { - let lft_ln = left_cap_vec.len(); - graph.push(vec![ed ; 1+lft_ln]); - graph[i+lft_ln+2][0].c = graph[1][i].c; - graph[i+lft_ln+2][0].v = 1; - graph[i+lft_ln+2][0].rev = i; + for j in 0..right_cap_vec.len() { + graph[i + 2][j + 1].c = 1; + graph[i + 2][j + 1].v = 2 + left_cap_vec.len() + j; + graph[i + 2][j + 1].rev = i + 1; + } + } - for j in 0..left_cap_vec.len() { - graph[i+2+lft_ln][j+1].c = 0; //directed - graph[i+2+lft_ln][j+1].v = j+2; - graph[i+2+lft_ln][j+1].rev = i+1; - } - } + //we add right vertices + for i in 0..right_cap_vec.len() { + let lft_ln = left_cap_vec.len(); + graph.push(vec![ed; 1 + lft_ln]); + graph[i + lft_ln + 2][0].c = graph[1][i].c; + graph[i + lft_ln + 2][0].v = 1; + graph[i + lft_ln + 2][0].rev = i; - //To ensure the dispersion of the triplets generated by the - //assignation, we shuffle the neighbours of the nodes. Hence, - //left vertices do not consider the right ones in the same order. - let mut rng = rand::thread_rng(); - for i in 0..graph.len() { - graph[i].shuffle(&mut rng); - //We need to update the ids of the reverse edges. - for j in 0..graph[i].len() { - let target_v = graph[i][j].v; - let target_rev = graph[i][j].rev; - graph[target_v][target_rev].rev = j; - } - } + for j in 0..left_cap_vec.len() { + graph[i + 2 + lft_ln][j + 1].c = 0; //directed + graph[i + 2 + lft_ln][j + 1].v = j + 2; + graph[i + 2 + lft_ln][j + 1].rev = i + 1; + } + } - let nb_vertices = graph.len(); - - //We run Dinic's max flow algorithm - loop{ - //We build the level array from Dinic's algorithm. - let mut level = vec![-1; nb_vertices]; + //To ensure the dispersion of the triplets generated by the + //assignation, we shuffle the neighbours of the nodes. Hence, + //left vertices do not consider the right ones in the same order. + let mut rng = rand::thread_rng(); + for i in 0..graph.len() { + graph[i].shuffle(&mut rng); + //We need to update the ids of the reverse edges. + for j in 0..graph[i].len() { + let target_v = graph[i][j].v; + let target_rev = graph[i][j].rev; + graph[target_v][target_rev].rev = j; + } + } - let mut fifo = VecDeque::new(); - fifo.push_back((0,0)); - while !fifo.is_empty() { - if let Some((id,lvl)) = fifo.pop_front(){ - if level[id] == -1 { - level[id] = lvl; - for e in graph[id].iter(){ - if e.c-e.flow > 0{ - fifo.push_back((e.v,lvl+1)); - } - } - } - } - } - if level[1] == -1 { - //There is no residual flow - break; - } + let nb_vertices = graph.len(); - //Now we run DFS respecting the level array - let mut next_nbd = vec![0; nb_vertices]; - let mut lifo = VecDeque::new(); - - let flow_upper_bound; - if let Some(x) = left_cap_vec.iter().max() { - flow_upper_bound=*x as i32; - } - else { - flow_upper_bound = 0; - assert!(false); - } - - lifo.push_back((0,flow_upper_bound)); - - loop - { - if let Some((id_tmp, f_tmp)) = lifo.back() { - let id = *id_tmp; - let f = *f_tmp; - if id == 1 { - //The DFS reached the sink, we can add a - //residual flow. - lifo.pop_back(); - while !lifo.is_empty() { - if let Some((id,_)) = lifo.pop_back(){ - let nbd=next_nbd[id]; - graph[id][nbd].flow += f; - let id_v = graph[id][nbd].v; - let nbd_v = graph[id][nbd].rev; - graph[id_v][nbd_v].flow -= f; - } - } - lifo.push_back((0,flow_upper_bound)); - continue; - } - //else we did not reach the sink - let nbd = next_nbd[id]; - if nbd >= graph[id].len() { - //There is nothing to explore from id anymore - lifo.pop_back(); - if let Some((parent, _)) = lifo.back(){ - next_nbd[*parent] +=1; - } - continue; - } - //else we can try to send flow from id to its nbd - let new_flow = min(f,graph[id][nbd].c - - graph[id][nbd].flow); - if level[graph[id][nbd].v] <= level[id] || - new_flow == 0 { - //We cannot send flow to nbd. - next_nbd[id] += 1; - continue; - } - //otherwise, we send flow to nbd. - lifo.push_back((graph[id][nbd].v, new_flow)); - } - else { - break; - } - } - } - - //We return the association - let assoc_table = (0..left_cap_vec.len()).map( - |id| graph[id+2].iter() - .filter(|e| e.flow > 0) - .map( |e| e.v-2-left_cap_vec.len()) - .collect()).collect(); + //We run Dinic's max flow algorithm + loop { + //We build the level array from Dinic's algorithm. + let mut level = vec![-1; nb_vertices]; - //consistency check - - //it is a flow - for i in 3..graph.len(){ - assert!( graph[i].iter().map(|e| e.flow).sum::() == 0); - for e in graph[i].iter(){ - assert!(e.flow + graph[e.v][e.rev].flow == 0); - } - } - - //it solves the matching problem - for i in 0..left_cap_vec.len(){ - assert!(left_cap_vec[i] as i32 == - graph[i+2].iter().map(|e| max(0,e.flow)).sum::()); - } - for i in 0..right_cap_vec.len(){ - assert!(right_cap_vec[i] as i32 == - graph[i+2+left_cap_vec.len()].iter() - .map(|e| max(0,e.flow)).sum::()); - } + let mut fifo = VecDeque::new(); + fifo.push_back((0, 0)); + while !fifo.is_empty() { + if let Some((id, lvl)) = fifo.pop_front() { + if level[id] == -1 { + level[id] = lvl; + for e in graph[id].iter() { + if e.c - e.flow > 0 { + fifo.push_back((e.v, lvl + 1)); + } + } + } + } + } + if level[1] == -1 { + //There is no residual flow + break; + } + //Now we run DFS respecting the level array + let mut next_nbd = vec![0; nb_vertices]; + let mut lifo = VecDeque::new(); - assoc_table + let flow_upper_bound; + if let Some(x) = left_cap_vec.iter().max() { + flow_upper_bound = *x as i32; + } else { + flow_upper_bound = 0; + assert!(false); + } + + lifo.push_back((0, flow_upper_bound)); + + loop { + if let Some((id_tmp, f_tmp)) = lifo.back() { + let id = *id_tmp; + let f = *f_tmp; + if id == 1 { + //The DFS reached the sink, we can add a + //residual flow. + lifo.pop_back(); + while !lifo.is_empty() { + if let Some((id, _)) = lifo.pop_back() { + let nbd = next_nbd[id]; + graph[id][nbd].flow += f; + let id_v = graph[id][nbd].v; + let nbd_v = graph[id][nbd].rev; + graph[id_v][nbd_v].flow -= f; + } + } + lifo.push_back((0, flow_upper_bound)); + continue; + } + //else we did not reach the sink + let nbd = next_nbd[id]; + if nbd >= graph[id].len() { + //There is nothing to explore from id anymore + lifo.pop_back(); + if let Some((parent, _)) = lifo.back() { + next_nbd[*parent] += 1; + } + continue; + } + //else we can try to send flow from id to its nbd + let new_flow = min(f, graph[id][nbd].c - graph[id][nbd].flow); + if level[graph[id][nbd].v] <= level[id] || new_flow == 0 { + //We cannot send flow to nbd. + next_nbd[id] += 1; + continue; + } + //otherwise, we send flow to nbd. + lifo.push_back((graph[id][nbd].v, new_flow)); + } else { + break; + } + } + } + + //We return the association + let assoc_table = (0..left_cap_vec.len()) + .map(|id| { + graph[id + 2] + .iter() + .filter(|e| e.flow > 0) + .map(|e| e.v - 2 - left_cap_vec.len()) + .collect() + }) + .collect(); + + //consistency check + + //it is a flow + for i in 3..graph.len() { + assert!(graph[i].iter().map(|e| e.flow).sum::() == 0); + for e in graph[i].iter() { + assert!(e.flow + graph[e.v][e.rev].flow == 0); + } + } + + //it solves the matching problem + for i in 0..left_cap_vec.len() { + assert!(left_cap_vec[i] as i32 == graph[i + 2].iter().map(|e| max(0, e.flow)).sum::()); + } + for i in 0..right_cap_vec.len() { + assert!( + right_cap_vec[i] as i32 + == graph[i + 2 + left_cap_vec.len()] + .iter() + .map(|e| max(0, e.flow)) + .sum::() + ); + } + + assoc_table } - #[cfg(test)] mod tests { - use super::*; - - #[test] - fn test_flow() { - let left_vec = vec![3;8]; - let right_vec = vec![0,4,8,4,8]; - //There are asserts in the function that computes the flow - let _ = dinic_compute_matching(left_vec, right_vec); - } + use super::*; - //maybe add tests relative to the matching optilization ? + #[test] + fn test_flow() { + let left_vec = vec![3; 8]; + let right_vec = vec![0, 4, 8, 4, 8]; + //There are asserts in the function that computes the flow + let _ = dinic_compute_matching(left_vec, right_vec); + } + + //maybe add tests relative to the matching optilization ? } - - From 3ba2c5b4246d1063e433cb349aba2ac40c376654 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Sun, 1 May 2022 10:11:43 +0200 Subject: [PATCH 03/28] updated cargo.lock --- Cargo.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/Cargo.lock b/Cargo.lock index f61e2506..1a9eac10 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1028,6 +1028,7 @@ dependencies = [ "gethostname", "hex", "hyper", + "itertools 0.10.3", "k8s-openapi", "kube", "kuska-sodiumoxide", From 948ff93cf10da1705766c2f0d256c316adcb806b Mon Sep 17 00:00:00 2001 From: Mendes Date: Sun, 1 May 2022 16:05:39 +0200 Subject: [PATCH 04/28] Corrected the warnings and errors issued by cargo clippy --- src/rpc/layout.rs | 26 ++++----- src/util/bipartite.rs | 119 +++++++++++++++++++----------------------- 2 files changed, 64 insertions(+), 81 deletions(-) diff --git a/src/rpc/layout.rs b/src/rpc/layout.rs index ac31da72..d0ee3463 100644 --- a/src/rpc/layout.rs +++ b/src/rpc/layout.rs @@ -195,8 +195,8 @@ impl ClusterLayout { .collect::>(); //We create an indexing of the zones let mut zone_id = HashMap::::new(); - for i in 0..part_per_zone_vec.len() { - zone_id.insert(part_per_zone_vec[i].0.clone(), i); + for (i, ppz) in part_per_zone_vec.iter().enumerate() { + zone_id.insert(ppz.0.clone(), i); } //We compute a candidate for the new partition to zone @@ -212,7 +212,7 @@ impl ClusterLayout { let mut node_assignation = vec![vec![None; self.replication_factor]; nb_partitions]; //We will decrement part_per_nod to keep track of the number //of partitions that we still have to associate. - let mut part_per_nod = part_per_nod.clone(); + let mut part_per_nod = part_per_nod; //We minimize the distance to the former assignation(if any) @@ -265,7 +265,7 @@ impl ClusterLayout { && part_per_nod[*id] > 0 }) .collect(); - assert!(possible_nodes.len() > 0); + assert!(!possible_nodes.is_empty()); //We randomly pick a node if let Some(nod) = possible_nodes.choose(&mut rng) { node_assignation[i][j] = Some(*nod); @@ -277,12 +277,12 @@ impl ClusterLayout { //We write the assignation in the 1D table self.ring_assignation_data = Vec::::new(); - for i in 0..nb_partitions { - for j in 0..self.replication_factor { - if let Some(id) = node_assignation[i][j] { + for ass in node_assignation { + for nod in ass { + if let Some(id) = nod { self.ring_assignation_data.push(id as CompactNodeType); } else { - assert!(false) + panic!() } } } @@ -318,7 +318,7 @@ impl ClusterLayout { self.node_id_vec = new_node_id_vec; self.ring_assignation_data = vec![]; - return node_assignation; + node_assignation } ///This function compute the number of partition to assign to @@ -345,7 +345,7 @@ impl ClusterLayout { //Compute the optimal number of partitions per zone let sum_capacities: u32 = zone_capacity.values().sum(); - if sum_capacities <= 0 { + if sum_capacities == 0 { println!("No storage capacity in the network."); return None; } @@ -493,14 +493,10 @@ impl ClusterLayout { .map(|id_nod| match self.node_role(id_nod) { Some(NodeRole { zone: _, - capacity, + capacity: Some(c), tags: _, }) => { - if let Some(c) = capacity { *c - } else { - 0 - } } _ => 0, }) diff --git a/src/util/bipartite.rs b/src/util/bipartite.rs index ade831a4..1e1e9caa 100644 --- a/src/util/bipartite.rs +++ b/src/util/bipartite.rs @@ -31,8 +31,8 @@ struct WeightedEdge { * as possible to old_match. * */ pub fn optimize_matching( - old_match: &Vec>, - new_match: &Vec>, + old_match: &[Vec], + new_match: &[Vec], nb_right: usize, ) -> Vec> { let nb_left = old_match.len(); @@ -72,16 +72,11 @@ pub fn optimize_matching( //Discovering and flipping a cycle with positive weight in this //graph will make the matching closer to old_match. //We use Bellman Ford algorithm to discover positive cycles - loop { - if let Some(cycle) = positive_cycle(&edge_vec, nb_left, nb_right) { - for i in cycle { - //We flip the edges of the cycle. - (edge_vec[i].u, edge_vec[i].v) = (edge_vec[i].v, edge_vec[i].u); - edge_vec[i].w *= -1; - } - } else { - //If there is no cycle, we return the optimal matching. - break; + while let Some(cycle) = positive_cycle(&edge_vec, nb_left, nb_right) { + for i in cycle { + //We flip the edges of the cycle. + (edge_vec[i].u, edge_vec[i].v) = (edge_vec[i].v, edge_vec[i].u); + edge_vec[i].w *= -1; } } @@ -97,7 +92,7 @@ pub fn optimize_matching( //This function finds a positive cycle in a bipartite wieghted graph. fn positive_cycle( - edge_vec: &Vec, + edge_vec: &[WeightedEdge], nb_left: usize, nb_right: usize, ) -> Option> { @@ -122,8 +117,7 @@ fn positive_cycle( //the number of partitions can be much larger than the //number of nodes, we optimize that. for _ in 0..(2 * nb_side_min) { - for j in 0..edge_vec.len() { - let e = edge_vec[j]; + for (j, e) in edge_vec.iter().enumerate() { if weight[e.v] < weight[e.u] + e.w { weight[e.v] = weight[e.u] + e.w; prev[e.v] = j; @@ -148,8 +142,7 @@ fn positive_cycle( curr = edge_vec[prev[curr]].u; } //Now curr is on the cycle. We collect the edges ids. - let mut cycle = Vec::::new(); - cycle.push(prev[curr]); + let mut cycle = vec![prev[curr]]; let mut cycle_vert = edge_vec[prev[curr]].u; while cycle_vert != curr { cycle.push(prev[cycle_vert]); @@ -180,16 +173,16 @@ pub fn dinic_compute_matching(left_cap_vec: Vec, right_cap_vec: Vec) - // 0 will be the source graph.push(vec![ed; left_cap_vec.len()]); - for i in 0..left_cap_vec.len() { - graph[0][i].c = left_cap_vec[i] as i32; + for (i, c) in left_cap_vec.iter().enumerate() { + graph[0][i].c = *c as i32; graph[0][i].v = i + 2; graph[0][i].rev = 0; } //1 will be the sink graph.push(vec![ed; right_cap_vec.len()]); - for i in 0..right_cap_vec.len() { - graph[1][i].c = right_cap_vec[i] as i32; + for (i, c) in right_cap_vec.iter().enumerate() { + graph[1][i].c = *c as i32; graph[1][i].v = i + 2 + left_cap_vec.len(); graph[1][i].rev = 0; } @@ -267,58 +260,52 @@ pub fn dinic_compute_matching(left_cap_vec: Vec, right_cap_vec: Vec) - let mut next_nbd = vec![0; nb_vertices]; let mut lifo = VecDeque::new(); - let flow_upper_bound; - if let Some(x) = left_cap_vec.iter().max() { - flow_upper_bound = *x as i32; + let flow_upper_bound = if let Some(x) = left_cap_vec.iter().max() { + *x as i32 } else { - flow_upper_bound = 0; - assert!(false); - } + panic!(); + }; lifo.push_back((0, flow_upper_bound)); - loop { - if let Some((id_tmp, f_tmp)) = lifo.back() { - let id = *id_tmp; - let f = *f_tmp; - if id == 1 { - //The DFS reached the sink, we can add a - //residual flow. - lifo.pop_back(); - while !lifo.is_empty() { - if let Some((id, _)) = lifo.pop_back() { - let nbd = next_nbd[id]; - graph[id][nbd].flow += f; - let id_v = graph[id][nbd].v; - let nbd_v = graph[id][nbd].rev; - graph[id_v][nbd_v].flow -= f; - } + while let Some((id_tmp, f_tmp)) = lifo.back() { + let id = *id_tmp; + let f = *f_tmp; + if id == 1 { + //The DFS reached the sink, we can add a + //residual flow. + lifo.pop_back(); + while !lifo.is_empty() { + if let Some((id, _)) = lifo.pop_back() { + let nbd = next_nbd[id]; + graph[id][nbd].flow += f; + let id_v = graph[id][nbd].v; + let nbd_v = graph[id][nbd].rev; + graph[id_v][nbd_v].flow -= f; } - lifo.push_back((0, flow_upper_bound)); - continue; } - //else we did not reach the sink - let nbd = next_nbd[id]; - if nbd >= graph[id].len() { - //There is nothing to explore from id anymore - lifo.pop_back(); - if let Some((parent, _)) = lifo.back() { - next_nbd[*parent] += 1; - } - continue; - } - //else we can try to send flow from id to its nbd - let new_flow = min(f, graph[id][nbd].c - graph[id][nbd].flow); - if level[graph[id][nbd].v] <= level[id] || new_flow == 0 { - //We cannot send flow to nbd. - next_nbd[id] += 1; - continue; - } - //otherwise, we send flow to nbd. - lifo.push_back((graph[id][nbd].v, new_flow)); - } else { - break; + lifo.push_back((0, flow_upper_bound)); + continue; } + //else we did not reach the sink + let nbd = next_nbd[id]; + if nbd >= graph[id].len() { + //There is nothing to explore from id anymore + lifo.pop_back(); + if let Some((parent, _)) = lifo.back() { + next_nbd[*parent] += 1; + } + continue; + } + //else we can try to send flow from id to its nbd + let new_flow = min(f, graph[id][nbd].c - graph[id][nbd].flow); + if level[graph[id][nbd].v] <= level[id] || new_flow == 0 { + //We cannot send flow to nbd. + next_nbd[id] += 1; + continue; + } + //otherwise, we send flow to nbd. + lifo.push_back((graph[id][nbd].v, new_flow)); } } From 617f28bfa466d52fac7244f08b3a036ab4e8c9af Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Thu, 5 May 2022 14:21:57 +0200 Subject: [PATCH 05/28] Correct small formatting issue --- src/rpc/layout.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/rpc/layout.rs b/src/rpc/layout.rs index d0ee3463..40f97368 100644 --- a/src/rpc/layout.rs +++ b/src/rpc/layout.rs @@ -495,9 +495,7 @@ impl ClusterLayout { zone: _, capacity: Some(c), tags: _, - }) => { - *c - } + }) => *c, _ => 0, }) .collect(); From 03e3a1bd153bf7c3bf13216964fb17463a26aaae Mon Sep 17 00:00:00 2001 From: Mendes Date: Mon, 18 Jul 2022 22:35:29 +0200 Subject: [PATCH 06/28] Added the latex report on the optimal layout algorithm --- doc/optimal_layout_report/figures/flow.pdf | Bin 0 -> 12947 bytes doc/optimal_layout_report/figures/flow.svg | 2205 +++++++++ .../figures/mini_node.pdf | Bin 0 -> 18288 bytes .../figures/mini_node.svg | 3962 +++++++++++++++++ .../figures/mini_zone.pdf | Bin 0 -> 7446 bytes .../figures/mini_zone.svg | 1562 +++++++ doc/optimal_layout_report/figures/naive.pdf | Bin 0 -> 18347 bytes doc/optimal_layout_report/figures/naive.svg | 3899 ++++++++++++++++ doc/optimal_layout_report/optimal_layout.aux | 32 + doc/optimal_layout_report/optimal_layout.log | 303 ++ doc/optimal_layout_report/optimal_layout.pdf | Bin 0 -> 279062 bytes .../optimal_layout.synctex.gz | Bin 0 -> 84542 bytes doc/optimal_layout_report/optimal_layout.tex | 394 ++ 13 files changed, 12357 insertions(+) create mode 100644 doc/optimal_layout_report/figures/flow.pdf create mode 100644 doc/optimal_layout_report/figures/flow.svg create mode 100644 doc/optimal_layout_report/figures/mini_node.pdf create mode 100644 doc/optimal_layout_report/figures/mini_node.svg create mode 100644 doc/optimal_layout_report/figures/mini_zone.pdf create mode 100644 doc/optimal_layout_report/figures/mini_zone.svg create mode 100644 doc/optimal_layout_report/figures/naive.pdf create mode 100644 doc/optimal_layout_report/figures/naive.svg create mode 100644 doc/optimal_layout_report/optimal_layout.aux create mode 100644 doc/optimal_layout_report/optimal_layout.log create mode 100644 doc/optimal_layout_report/optimal_layout.pdf create mode 100644 doc/optimal_layout_report/optimal_layout.synctex.gz create mode 100644 doc/optimal_layout_report/optimal_layout.tex diff --git a/doc/optimal_layout_report/figures/flow.pdf b/doc/optimal_layout_report/figures/flow.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3546ad0abf52454dbfb1e942bc2f656baa75a0e5 GIT binary patch literal 12947 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 literal 0 HcmV?d00001 diff --git a/doc/optimal_layout_report/figures/flow.svg b/doc/optimal_layout_report/figures/flow.svg new file mode 100644 index 00000000..e370755e --- /dev/null +++ b/doc/optimal_layout_report/figures/flow.svg @@ -0,0 +1,2205 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/optimal_layout_report/figures/mini_node.pdf b/doc/optimal_layout_report/figures/mini_node.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6df8a5b28bd416780456821056e85d1ea1ded0ee GIT binary patch literal 18288 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 G2LAxiPpiTJ literal 0 HcmV?d00001 diff --git a/doc/optimal_layout_report/figures/mini_node.svg b/doc/optimal_layout_report/figures/mini_node.svg new file mode 100644 index 00000000..b044b0cd --- /dev/null +++ b/doc/optimal_layout_report/figures/mini_node.svg @@ -0,0 +1,3962 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/optimal_layout_report/figures/mini_zone.pdf b/doc/optimal_layout_report/figures/mini_zone.pdf new file mode 100644 index 0000000000000000000000000000000000000000..36085c52dbe534af65a4564d2281cfc29d128ec8 GIT binary patch literal 7446 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 RlOe9OA^>h~WlaR&{{hNloqGTP literal 0 HcmV?d00001 diff --git a/doc/optimal_layout_report/figures/mini_zone.svg b/doc/optimal_layout_report/figures/mini_zone.svg new file mode 100644 index 00000000..5c505539 --- /dev/null +++ b/doc/optimal_layout_report/figures/mini_zone.svg @@ -0,0 +1,1562 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/optimal_layout_report/figures/naive.pdf b/doc/optimal_layout_report/figures/naive.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f32e42732c1a228d19f9150f71c6104dad08b4f3 GIT binary patch literal 18347 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/optimal_layout_report/optimal_layout.aux b/doc/optimal_layout_report/optimal_layout.aux new file mode 100644 index 00000000..fe8b0891 --- /dev/null +++ b/doc/optimal_layout_report/optimal_layout.aux @@ -0,0 +1,32 @@ +\relax +\@writefile{toc}{\contentsline {section}{\numberline {1}Introduction}{1}{}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {1.1}Context}{1}{}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {1.2}Formal description of the problem}{1}{}\protected@file@percent } +\newlabel{eq:optimal}{{{OPT}}{1}} +\@writefile{toc}{\contentsline {section}{\numberline {2}Properties of an optimal 3-strict assignment}{2}{}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Optimal assignment}{2}{}\protected@file@percent } +\newlabel{sec:opt_assign}{{2.1}{2}} +\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces On the left, the creation of a concrete assignment with the naive approach of repeating tokens. On the right, the zones containing the nodes.}}{4}{}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces Flow problem to compute and optimal assignment.}}{4}{}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}Minimal transfer}{5}{}\protected@file@percent } +\newlabel{hyp:A}{{{H3A}}{5}} +\newlabel{hyp:B}{{{H3B}}{5}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {A)}Minimizing the zone discrepancy}{6}{}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces On the left: the graph $G_T$ encoding an assignment to minimize the zone discrepancy. On the right: the graph $G_T$ encoding an assignment to minimize the node discrepancy.}}{7}{}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {B)}Minimizing the node discrepancy}{8}{}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {C)}Linear combination of both criteria}{8}{}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {2.3}Algorithm}{9}{}\protected@file@percent } +\@writefile{loa}{\contentsline {algorithm}{\numberline {1}{\ignorespaces Optimal 3-strict assignment}}{9}{}\protected@file@percent } +\newlabel{alg:total}{{1}{9}} +\@writefile{toc}{\contentsline {section}{\numberline {3}TODO}{9}{}\protected@file@percent } +\@writefile{loa}{\contentsline {algorithm}{\numberline {2}{\ignorespaces Computation of the optimal utilization}}{10}{}\protected@file@percent } +\newlabel{alg:util}{{2}{10}} +\newlabel{lin:subutil}{{2}{10}} +\newlabel{lin:loopsub}{{3}{10}} +\newlabel{lin:findmin}{{4}{10}} +\@writefile{loa}{\contentsline {algorithm}{\numberline {3}{\ignorespaces Computation of a candidate assignment}}{10}{}\protected@file@percent } +\newlabel{alg:opt}{{3}{10}} +\@writefile{loa}{\contentsline {algorithm}{\numberline {4}{\ignorespaces Minimization of the number of transfers}}{11}{}\protected@file@percent } +\newlabel{alg:mini}{{4}{11}} +\newlabel{lin:repeat}{{3}{11}} +\gdef \@abspage@last{11} diff --git a/doc/optimal_layout_report/optimal_layout.log b/doc/optimal_layout_report/optimal_layout.log new file mode 100644 index 00000000..c73818ff --- /dev/null +++ b/doc/optimal_layout_report/optimal_layout.log @@ -0,0 +1,303 @@ +This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020/Debian) (preloaded format=pdflatex 2022.6.23) 18 JUL 2022 22:33 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**optimal_layout.tex +(./optimal_layout.tex +LaTeX2e <2020-10-01> patch level 4 +L3 programming layer <2021-01-09> xparse <2020-03-03> +(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls +Document Class: article 2020/04/10 v1.4m Standard LaTeX document class +(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2020/04/10 v1.4m Standard LaTeX file (size option) +) +\c@part=\count177 +\c@section=\count178 +\c@subsection=\count179 +\c@subsubsection=\count180 +\c@paragraph=\count181 +\c@subparagraph=\count182 +\c@figure=\count183 +\c@table=\count184 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen138 +) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/09/23 v2.17i AMS math features +\@mathmargin=\skip49 + +For additional information on amsmath, use the `?' option. +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks15 +\ex@=\dimen139 +)) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen140 +) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count185 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count186 +\leftroot@=\count187 +LaTeX Info: Redefining \overline on input line 399. +\classnum@=\count188 +\DOTSCASE@=\count189 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box47 +\strutbox@=\box48 +\big@size=\dimen141 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count190 +\c@MaxMatrixCols=\count191 +\dotsspace@=\muskip16 +\c@parentequation=\count192 +\dspbrk@lvl=\count193 +\tag@help=\toks16 +\row@=\count194 +\column@=\count195 +\maxfields@=\count196 +\andhelp@=\toks17 +\eqnshift@=\dimen142 +\alignsep@=\dimen143 +\tagshift@=\dimen144 +\tagwidth@=\dimen145 +\totwidth@=\dimen146 +\lineht@=\dimen147 +\@envbody=\toks18 +\multlinegap=\skip50 +\multlinetaggap=\skip51 +\mathdisplay@stack=\toks19 +LaTeX Info: Redefining \[ on input line 2923. +LaTeX Info: Redefining \] on input line 2924. +) +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks20 +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 105. + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex +)) +\Gin@req@height=\dimen148 +\Gin@req@width=\dimen149 +) +(/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 225. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352. +Package xcolor Info: Model `RGB' extended on input line 1364. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371. +) +(/usr/share/texlive/texmf-dist/tex/latex/algorithms/algorithm.sty +Package: algorithm 2009/08/24 v0.1 Document Style `algorithm' - floating enviro +nment + +(/usr/share/texlive/texmf-dist/tex/latex/float/float.sty +Package: float 2001/11/08 v1.3d Float enhancements (AL) +\c@float@type=\count197 +\float@exts=\toks21 +\float@box=\box49 +\@float@everytoks=\toks22 +\@floatcapt=\box50 +) +(/usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty +Package: ifthen 2014/09/29 v1.1c Standard LaTeX ifthen package (DPC) +) +\@float@every@algorithm=\toks23 +\c@algorithm=\count198 +) +(/usr/share/texlive/texmf-dist/tex/latex/algorithmicx/algpseudocode.sty +Package: algpseudocode + +(/usr/share/texlive/texmf-dist/tex/latex/algorithmicx/algorithmicx.sty +Package: algorithmicx 2005/04/27 v1.2 Algorithmicx + +Document Style algorithmicx 1.2 - a greatly improved `algorithmic' style +\c@ALG@line=\count199 +\c@ALG@rem=\count266 +\c@ALG@nested=\count267 +\ALG@tlm=\skip52 +\ALG@thistlm=\skip53 +\c@ALG@Lnr=\count268 +\c@ALG@blocknr=\count269 +\c@ALG@storecount=\count270 +\c@ALG@tmpcounter=\count271 +\ALG@tmplength=\skip54 +) +Document Style - pseudocode environments for use with the `algorithmicx' style +) (/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2020-01-29 L3 backend support: PDF output (pdfTeX) +\l__color_backend_stack_int=\count272 +\l__pdf_internal_box=\box51 +) +(./optimal_layout.aux) +\openout1 = `optimal_layout.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 15. +LaTeX Font Info: ... okay on input line 15. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 15. +LaTeX Font Info: ... okay on input line 15. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 15. +LaTeX Font Info: ... okay on input line 15. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 15. +LaTeX Font Info: ... okay on input line 15. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 15. +LaTeX Font Info: ... okay on input line 15. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 15. +LaTeX Font Info: ... okay on input line 15. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 15. +LaTeX Font Info: ... okay on input line 15. + +(/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count273 +\scratchdimen=\dimen150 +\scratchbox=\box52 +\nofMPsegments=\count274 +\nofMParguments=\count275 +\everyMPshowfont=\toks24 +\MPscratchCnt=\count276 +\MPscratchDim=\dimen151 +\MPnumerator=\count277 +\makeMPintoPDFobject=\count278 +\everyMPtoPDFconversion=\toks25 +) (/usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. + +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +LaTeX Font Info: Trying to load font information for U+msa on input line 17. + + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 17. + + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) [1 + +{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] [2] + +File: figures/naive.pdf Graphic file (type pdf) + +Package pdftex.def Info: figures/naive.pdf used on input line 117. +(pdftex.def) Requested size: 310.4979pt x 116.6252pt. + [3] + +File: figures/flow.pdf Graphic file (type pdf) + +Package pdftex.def Info: figures/flow.pdf used on input line 136. +(pdftex.def) Requested size: 207.0021pt x 104.94873pt. + [4 <./figures/naive.pdf> <./figures/flow.pdf + +pdfTeX warning: /usr/bin/pdflatex (file ./figures/flow.pdf): PDF inclusion: mul +tiple pdfs with page group included in a single page +>] [5] + +File: figures/mini_zone.pdf Graphic file (type pdf) + +Package pdftex.def Info: figures/mini_zone.pdf used on input line 221. +(pdftex.def) Requested size: 110.39873pt x 138.8974pt. + +File: figures/mini_node.pdf Graphic file (type pdf) + +Package pdftex.def Info: figures/mini_node.pdf used on input line 225. +(pdftex.def) Requested size: 151.8014pt x 157.28752pt. + [6] +Overfull \hbox (6.52959pt too wide) in paragraph at lines 239--240 +[]\OT1/cmr/m/n/10 Assume that their ex-ist some as-sign-ment $\OML/cmm/m/it/10 +T[]$ \OT1/cmr/m/n/10 with the same uti-liza-tion $(\OML/cmm/m/it/10 n[]\OT1/cmr +/m/n/10 )[]$. + [] + +[7 <./figures/mini_zone.pdf> <./figures/mini_node.pdf + +pdfTeX warning: /usr/bin/pdflatex (file ./figures/mini_node.pdf): PDF inclusion +: multiple pdfs with page group included in a single page +>] [8] [9] [10] [11] (./optimal_layout.aux) ) +Here is how much of TeX's memory you used: + 3544 strings out of 481176 + 47263 string characters out of 5914226 + 339215 words of memory out of 5000000 + 20458 multiletter control sequences out of 15000+600000 + 413592 words of font info for 65 fonts, out of 8000000 for 9000 + 59 hyphenation exceptions out of 8191 + 68i,12n,74p,880b,308s stack positions out of 5000i,500n,10000p,200000b,80000s + +Output written on optimal_layout.pdf (11 pages, 279062 bytes). +PDF statistics: + 127 PDF objects out of 1000 (max. 8388607) + 90 compressed objects within 1 object stream + 0 named destinations out of 1000 (max. 500000) + 21 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/doc/optimal_layout_report/optimal_layout.pdf b/doc/optimal_layout_report/optimal_layout.pdf new file mode 100644 index 0000000000000000000000000000000000000000..84265135ebe6663cd8f94c0cc7dbe9b06af35c54 GIT binary patch literal 279062 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

EtsD@#&(MwwA!hGj5dYgXsp z64l5Y6>=W$-6c5Mc#BnJr>c2Zxa!MQ!&95yKYD8#LK|uv#DEQyET>ZKo8Ga|L@d0z zDLgg^q9yVff;D+3g8~bXQAmuj09*cx@T6)wAm)CNvHg@tStXH^FoNAcZn=xW8R-^b zNe0k!G?R+&y=Bbgq23WQC7j1QJoQ+BcItGViE7rPd6|ztQ9KX?M3}lzuyOrc?KDJ1 z!{1o#9MF)E9s}(_MWerOz(Cw^e>5b-c^X48ETq;o!sO;@=wQb9how&Q+!6yMBDHjpGl{DP^II*GaF>BiI8sQPHd6FHxg8VjU(4ne>0t$*pz5Zxq4Y6z z$5rzP2+T<}G+?_|X$&UFn6BNLL^CiZEQ~{Q{)}ngL=g+)hpev`tm~sVh_Y~)2$omX zLY@>3QsKwP7a28^qgz zfML%B+D*}0A(VIqSqmA2hpH4-?H$z&rzYa4tO?_1t51$iu|l0iIp?B69B+QaToX|s z5_p$FtzqI0fDBjCVGFe!8HmqvV2#=$Ef^%KeLTUgCFbH71y|k4*xsw{q;RE)Cg+!U z?NSNVmrLi^wqRFT0H39bJ$ki=;<<&6rr{Umpo^19G=n!=DFET@y%QSb;L+69shO@~ z-C@bjKrOBf(8*1a|7zbPz3@V>kChUDYM|1GiyuE^cIs9T z=>dl7V|t`+vSljhVH6YTT0&-MyHzMvC6=_>$}HJ8-K1u{v(Yj|Ob*N% z5{Rd_%4Vd*c*$3`y-%v5yB7MWIJM$N=QnQYNCxx=>@gYO`K7F4liW1Wp&rR6c=sIG~Nn}#_n(|@#En(K=)Q2;Fp zS21uH;0VdzB!7->zx1hZqsgJ5T(5D!m1J^!GvWCTh8)n4TP z@;Z`?)FZ7ozXi$6KJ6VTz|#sF$#OK3WiBbqF0pnoFFv+YNotZPfgo~5W3b&6y$dPq zP~R8~+{WLP3tv=T#v#L!W%%PEvGt{#mCGXR}i#Z>hsCY!$@}+grS>eegU=G$$))v zNJg`0ix9@-PwMXN@qD}StSmeZ$+sBLRn(U$yuplA%~B*X?ss`$s!De?th|FnYNYVi zVPyC_+k4i9oBB$wbfzpivlzyuxEziy=MO;HbvOXMg{fKtmC7h8duM(N0N-}Ua8Qhn zcRfW|^o@>Pv0+%`Bi;iK4~7IJE;F|{^nK>Vu9As3f;hWP!~$U+X<;&m4g`3epyIO} z+|oj(eG`S=S*kPdc9z^|33E1(FJud4GGwF_)hQ zjpj#ed_hjF>$!BnA;r`+>fMv==D=mnsazptYR0vvYa7fJ9!ZZ12$06Zs;D}vyifZ{ ze8r=BP}#}y0Cd$0(OJiy5GfdhL-urrdh(0|tbuaU<0&QdTMaGUow!a3wu_NpF(cNo$H+~iBP}|;$p#BxE7)mgJ5?!bh zgT(XJEHlFCl8s`LIEl-n2Jz88{j9DS!hd6pu>Pkt!okT%@c&)^M^yaAvbt>CA_GFt ztNL5I)Y6;r*9a^^R4@pVf?R#rLa9wLo9+S%NMCNmwR6(=b!)xQLA`8C4(6=aqZyB( zi718#uhIRx&G7vM1i6lsWix5MKh^2DH}{A4)Hslzw=f3l-+25TXK9jrN;@3(qrWd$=w< z8LGbHlF>JMtL2^2yMulZo!h7KWmo0L8rVfTB5Gu|G;PK?HRBZ^&@9A(<`3Zu-vjJIDG&CrXl0 zm>23ZxqznNKM1I|%x+RMDur1%`jM~v9BhfF2Y8J8y0;m%ypVl{dt#1sX&lcNNFWln z_fJL{0?I*yr9m3B)?xUBFu@;VxM-qhiR55QyU;jyKzpQl=u0ECpa_U|Pi+IfbEI`7 zCjVKM-_l{E1vZ}6hEtjnx?E}&9wQA$2cKcms5G<*}%Ero6uLAO621of+f{>JD$qt_w7Jjxu* z^v&2pwQ}9rk=*wAJj?Xfjc;GD!r}G1>)qQ${y;T~w%i)1DN<_Vod}cs0^9B+viMI` z{ujq&Ah0vCg!+GBK>xpE!N|h-KUQUC#wBJ}B?bisP$6SxP-CYM6yaJSI%8l^1Qs?R zX_8Y%P7lZPFlr2J`*SY<(T*oxA5^JGDdmo*9H4Aen2sl1ltNfk7^4mzT@;KXdP`G*Zmcp01o%mSyu)&U!#O~}V> z>D1+G1?T`qom@=*Q%DYu{}7UqfRU4l>Ayr~B4A`;Wajvy3S(%yG{?~H+ zpZB$x7f=_`X!y6gMWty2SY_< zYYdN#pg-bpBebB8j;ujjPe0Lxw;(~BJ(?r|ba%od4ZQrbt7!dGaQi1m#wKUR27wHW z4fns{5wC{9;{iG~GXPOC02~dx;+c_JIMxOhCng6Mj%{*&d4Mcr&jG5tySHHcLV-oD z1?1F91-$%;=0=cAURw((=g{)u*jj)(+<)Yuv;d{i(ZTu5%-r1E$ntZTk=G`K!easV zY>$l~6@WQ|vbO}x{Q0%OC;+bo{Mtr?MPTRZn;n0q3gFn>9Kg8(0PMiDsg>h<9<{^& zAI9z>$P%E<0%+MrmuvTMj-Ir>j{uXrUoGU=Jt#qMROg11;@$;zR3x6&0BLt2Xvy= zN*K_X0+JjZ4hsroVgCY&Y;g(a7Y*47Tw@bRZXd!g4GB^#q6*yKh5)#kU0)iX7#PVM zU!Qo1$Ik>vJho0Jy_g*saC0a0M6)aqJWFbD2FmQdY$w0p4z)Buc5QkCATzbsvoitn zVVPB+O{G1lMKls>2lg}B(B}l%;A7zZQE*)T%iX7qv z$b-en2^e#oLldaFS_c>CrVVlzFkJ-F{LvNXKQghA9Sq#BTE>nHYI^cP{6KJ=Y(8}KMbJw=nDXsAVD6>MN zBSY(ljoyEq4S57ylg0lkm@>#GnY! zd_r8*kAUr`eL*~cV2lO?djL-*0Yta#WkUVuaFp)}p8l%*FdX+zPp`_&@rRVz8{hKtuVSAU&KN;TCy0`i7WSyq~QNGHYEN}T&_FHYQ{e4^Z%bZ__ zek9!8x+5?C6~_cC+K~XOfae{f~be zrhM`zT*uzrGrXnEKI-4q7}W9a1E%sTsus1^>HT+*?1$b7zD`pSK|BLw5`UfcmwpYb zunp9>tNszWiRm&9T3qVdpmK@XiI(HnC79boJ*Q^jtKr^`AV+XBthSL}(2J%`vC6LJK&!PW9V9VTPSkk%cy(5UZUMRtwoWgedw4bx zT$&W_d%8n%t+=V($b-VwR@JFKP8R>A!aRamgH=MH!6BS$ox~X}4}3Z(5hM`rx*y2r z?8_3H%KIZlj`0dS{z{tlo!xc=p*{6oy=s*Sk?jl#j2=kO2mQphGDaHPwkDW_yVLDH z|61-k@J@R(+W;y(zrh>PAQ+h7fs#SU@1(fw_(gL+Z zv?RK4qEAB!86CqMS@U(9PbIl@=t?-v_jN^j&B3{7Q}!AeKXPguyF<`K(t|v_V>S77 z=+zl+Ob;$6Mbl57C0wmYPes+2jjcNSoT`H35?4!ew{qz_ZTjIiX#sDGck;MBBIh4l z2e}>$DQ|i;FH&-|clmz)*!IGZ7VO1e=}_w!OwJgy;W5-kp|hs9*0BqjN(?>WGX$oFl# z{6n}WE?k=XOX;K*=%}S%N$||2c}oRe0%y{5)$m%4NfN`!ZcpdBTwg@^-7(O(fo9v?3KEKvVVt2C5Bc8JLn zUFge>bRlHB*bL%@vl|=?6q#S9s+;f1&Oua0jnM>%)ysNsI12@hdqZU-&{TrNk6m zS;r_%sqz(y;?)@@d2FbZZ&44d_Lc6UbvzpR>%Zli5hq@H-+^mC!03o@vt2=M3|Fyc z107=fL_TAjWC53p;AmA3yk%%)qy76xWyLte84_-|31|GOS-0}d6zD68UlU^=8M=36 zXorelD_z1n^K0ffl9q6?dz`U2>!tecj&r{8M#b6L!K}@UFmX6`B-@=17LDp4EEZ&0=aBpt z`yb%?nKz(Uhof8;EshFe$8_M?9cywbzS%u-+iPYh6GO;(^u6(8ea{ei_p=K=9(CNd z`<)=r(pr~NayL8=O(LY3SpM2kWH}9g+uMrFRX<^Kt;I7C&_D1}9>w+B(&-w7`~#m$ z6OSLrK!SJG%4z25Lc(VQolW%FUNDtBS8V(em9d5HhMS;{;#mnJ-I6i5RxN`5AZT0$ z+wuJR-!!cjQ^wplR((rGApVCXs{LJ}9l~GBd+fB+Z_lQ=4~RAyH@Rpg6L~nFD!^x+ z7ncl0@kz}`MaG8B`9OzMxxMFHr{DR(=eR^-mJDNgQsMz!_SJfQud}`VYH{8mo#a(J z^TVgWJq2%kqGCMEC%vQi1VIY6+O!O&x|;jO<5XX@+j(%vacnw7lan{&ulz_oUqrgM z(Tzi^xyjxrw67SHtmFzf%1a)pTYJY23HqNl4ND`@Ybtr?fL!vL;|TP`MLL26!Q)D-?z!#F)+fBQ}6(jTkE$;HbUF9b=Z)gy{MkI0zXabktg zCcDlUf2i8n=zt~*Xp$xgJ;=J6f+Xc+3zP$wX03n0Ok0gY+{w@eU3?ZSeVURv>J6|O8D&^L%vet@>_(v*Se7sFM~je z2oWrqLWj-miNi5}3g)&BF{Lx+Zkz3=E!T!%b^jEXs?vn_>d(LrZohqx^oD(yICsN* z8tebL44BOEM>%Jf;lLNyH$G|&APH@a&fxQ}wV21N9#Hn3y+ea*SVlw1hSY2^6MkePe>*SOMNv^EEH5w&OaR70mWF>T=a_%9t85%RT`@; zp9xb#dkYsQ%5%NZ$3*c1dnbz0_lbVpRJx32w=*U5YAuEOsOL~1w?~bwoQQnoG?w^X zKJ4`-$^4Wa39*gkMdpPd>S9qdhxj_A+BUi&OF+#-9#>TNM7%gNI4Pm#zJG{-R%B4 zlkQUbHW{2d@g%Mn=3sKuzlwsZwWCe#G^D>2wD=&yLyM&V^5H8JDK4V@m=#4~CNn+1 zH_apXS!M8RP=dZ10dv)~1#--BjSYcSdPC`hO zS0rh@E>GIzQ+354e++InxFeF2t5J%fP>#RKC8AopXejze|0rI%EFFP)zvyY2A6dzc?n{1qiQCCBfPX|0)(y&rBNkRB3Rv3;~Y;Y%sR;a#j~fk$qkh5 zn)KHn^6Szafc>EpYD(QGyN!Jt`)4JsbQt`B+%JQU`4~rW{~gB`^PYgfVwTJT&ClC8;q3t%H>mRxe5z`R4P^#d zQb2F@B$6ch^PrYq=UtvK?vtSSh5#u}DbDe#+j|pb*`6_lv=g!WcM{}5GeagSxvgg0 zwar)rj2QMsfq%Q(!*gbRX0C@%c?l?uq4wChVYDrnOO5TiU%A2@D%u7dsZ?RS*9ACp z^HWcs{S69?vC4k7Ej~=(v~Gtk-y-o0jkIERDaYi-qxaESqv@eTFj#JS^(eYALi*H-l%7~Hp~Gv$x#{aeRK%c(LZq4+pCkxRK7 zTPVt~JOl6pEU^k-G|I+tMdG6R6tz@~Ll|o0)f4T*DtBNw?<|ckyi4!m9J*6@)Gst; zl^jH#zL*VKsgd0EVSfjfF>|w`Su<#on3kB>#p5foFz4z*o`RZsB_X%KZ0Y1I>^le3 zaTggDRXdC?KK6Q$2Snt6KK^S=zsqBfzj#N)nQ{e9Bw7Vf_2|S$`8*Hl2-K>afLso- zEZ^PtbUO%5KeM2qv7%FZkHU!GNsdJ@*J>s}%U)!JJ7bv2)whE>V|mR1qg_2e+E0UZ z9tj?u?PM>B)ms5^$~(ED?@iiLY0IHpPg;~?FeA^c;+>J0YBj@R3=`bBDc8wb?BRFx zK8V0%xK2q~d>~jnv~BzRi-_)b@B}^$9mRv~!t6Due`?6#`m6a5S_*TLm&Pyi>6-8F z2<9F)YJ59vK1089xB5O!8R@JQ{~;?#d3*6z1#K09;(G&b-TJ6Yv38WtIS>$*C>T{^ ziOx4n8ukRyam~O-FJz-DM!CSN1-2k2h$QQo!Le)e9KFWJV%28LPrv|72m9Np8^ zj8A!56DaWIO+*wqECW0`O8_?stSS)L#iz- z^sPkkJk}FM6g}Y1gP!v9DDLZtTtK4zFygabgagf|nwzr!YKO#(OSJu6Fqfsb0xT{a;d?)@MmvJABlDh(K(bCpw`qc*v*$*MUYWy< zXQSDZkuQ7BpWpfn4!!ViybG++d&64_8l8rs&`Lh9^C9p9=74*SURQa)S zW#Yli`eA+UrW?^o!a$$d`h?rnk#L};U1q*j@-Fw^`;bQX$nx^4&&I1nQ;#8zcy;Nt zT|=U7@$Xf$Y7a;A$1}BwsP|@xEzv=8ZwJdc`%-N8L{=o62D{#xfs;^Dk-mEkDWw}eZbpvIMP3;E+-*1Ff+)Af7K#=98-!QOc%e5<#UUy}g8ca6m&tK}D~OG>+iW>IZ%s9tM4i?} zJIz$CuYpN~iS;#R2pw6@VU&WuklFKC$@@lljT)a|ZHIPiLP&+z){WqzGZWG9reqP$ zVSOh&&j(<`8i;L``V-c1VP-$O!eo>g7xrXFx$VK3Gd)|<1R`O&oxLCa)Stw>CP z58LEKg?dr~q0@1ZPp;@$={b`x-=D$%!E-d9PDH=(fby(5Zzv-*nT9R1yW(p^zkZ9pEq*zG~^bumQ+ByrF zrq6u`+$ezn`MZitSg#XWA<(^tJn5zg*v+e^+lhXnfJ=u=;ML&Uy<%4$!;L(}NwDt@QgNDJMqEX7KCPhaq;2OToxz-!GZ2H9~ zn55>r>x*BCd&m)tER{1Yy?Lid=()Z_MCXx^%7cmf*7`Wp+ti)-UBna1r7Sw}lejD| z9+Kuo5HNrr%`ao#P7Z#%puiB37Me+FG#|bRo4||YyaM(9$vO5^9WPHu*-?*d+=!3@ z+X+Y9ec$X-Y7-SM(P90v_=RDsV%6`B#&Q!hD}oLNm==94wNk>;euc;$(Dv5}PaUyG$wHB{pBgjjSaD26 z&Kk!Ot!hr;ai##7EL)G69RzJDkeuF+G!#ebD$q~8QSYVcZ|HGB!{YYQwf zBDL*&ThEWM3oVE&l|6t%WtccOa~`?Zvmi&mCS+>Wf_W1c_enS^z?baOI}Mpm{ue=h zLwH#lJ-VXX776Z@RY>TP%=eGfN0~l3bEVfY2kJ<1-H`d0`t&!)6!(UxC!n`OC_gYQ`jO*(wF% zpn<3)PLmY`Q*Zicd?v0ok1#LA1NL4`(Jo#>hl@ z(j%|!nL0)GMeO<14a>6h*z0<=queGi?l9Rm)q^^UX;=v&|EqK{3@TwOk7ze(q=e8w z$2eyeq#1fVR5!s$P6*C2TcL+qR)#jA)1?snSL+;%GZXBvY3gqTT&3R&r7=Zrvt#Fa zo-X-P*fTs)PCUYOy}gJRY|pDr?i)t-4+@$iH^>? z9j-qp9k8SSrjIBs^R&&T=`A>leJmep@10YHTc1w-Nez992^?y9>l_bxRaWy`;PCwI z4RPC!4nk#l7(I0y1_=QO+HIBK)bBP(d6mc}bVdPXiv!op7CDI?SrHdUJSWu7CCl@0 zVuqkD`DCIhFYvw<(YE%1?cf>-UM2|plbmH><+q21nFY|>j>VE>_8=2e8{*EZ9XU<6F4!Y(*3eZ1jgw)@)|ha zlw1iOEnw*s>gKToD$ud!p?c^NowDJNGV2uWw&It!^yHrv!5qjTvA^PIfpzecxk5}Q zRLrb>8udha?Vspw3PRWzU(iT5rn_zOnDIU;K{;i`=D)VAJ0H%;6056;Ygc1<4UgPB zg48LhX~_{S@_T*B?*qef9|v=ykibP+97?62pXsSmTM6u;(_Q@D@I{5^r&RlQ2vd?5 zmSy|W)HyHLv}T=3HF7K*i)=&g`Q%@!byxy+cqb{F40p}-!jH?0bF2Q${Bd&!2xz=cj zt5I}IoAMk|^)4L^rGwEF*b4eunerbv`wL8a;MxcaxvlgJuF>!+N#55Fve>X2#i5Aq zxewkmfyQ=ucS~=u$fC)5)xr>4K9*N062w}?+acmHd6egh^~z|2%G?da!9@G5OkUYJ zTwQV}<7+!wVF`88@?IWXC=6wTv@IHJU&OY##igDpcW-L{un-)T>OZ~lpoDWPY%M$` zP$hEjqmFc9L`fHSQE#01Xo zDjH{5PW?lkG%1X~G9`iGdF4p?P(Y*kW9eH9#%ZwU#En1lm7+n%?nY0XGgur;<}oaQe0t%Ew8fSKh=2xDh!aJ-NHcU-B(Q57kHQkf9{c;b4<#70A@+@YTnbh$cuo1Hgg^?C{#fHx-0uz~gtqUp>E8pWGk4TeJW9Onb$st!1UZn9Q#6cB@jkpqjdUko{ zf^R2P<0X_V0flZj@d9b708*oy_Z*p~r=PbNaicRMa{PtVIA7hmOrL}g$zE*)^H@2` zwU`;c39Tes-IwJ4XbS}C$BH{2ep&yg8;8M&0(t1juu4+s0UMQ(-dAde1XBC=@}Y9n z0sOxNVjA6_gWIfP{8?UMVN;aywApL;BKlo zgvb`t##Zqs!$j*~Q{Rt1p!Gf{32 zie*k&cS}GqNCnP5yA;cCQh7Kl4lq_ZzyRZHhR%P_fnVV8x?D+-F;9;T+rcy** z@r!)K8rfB=<cicOtwEY{W)c59l>eA2#v52`3o?D zZX!0~grl*Cm1WbTcWBa=Wgw_alGW{3E2#p5c?GV2q@b+Z%XrOvzF&^9uq-!4P1P3#@PI;4H5MK)(L4LzMVBH0lyiv zONr6x{Z_xT7JG86O{FYGVjkXW6Oyo_hORx^iHsfcJaUpzpiod}nzNd)X1YX%`WFlkd>3mn znjsft&}%F1SU&xGuf=2^R*Lw;;9Nw}LEFg|)Lg-e>*tBop)C}+T!HfnvVxjCq7PV; zaG$m)n!F)odZm7DbzVtGIAUkB)uhiO{M9MxR=3=BFf+D z{y_oD>M{?BtDu&!ZZ1mQ%}n0b^d}Os(3rIt&@#$F~6jv6LRo6^6@5%xF#c~Ik)cB zu(Zcg%l&iLZ}2PG>U%`#F8IsK+84YrG_tuPV6*Je-`rf*@7AVLy;~Y2z$<3Z86tJc zI4mNyM{ZW?DDA_^ub3Bl_qU~-!;i~+epUjCps=j+#%P1P9mBqG*pqVhc8^^k9h5XW z`zr7r-;G7WC;b7itPfY`X-c1(xdotu5KGM6yZihMv9n-%{xC_a`IaOk3TH$(ckqv+ z^;sL9LUFG$zt5H~NjsSurH1#~)iqKAl)8F+oTNJwIq<`f{M>CMVDsEsE5TE;~Gv{CO3GA^YRp?pWZr@C<&rqtRPGMlqvZ6{-Lrho3 z$~j^iKyVzjd+c~j?RA=DvX___S`YLekiRXEnC@{jmED)KZw87T@oJ>SXAg5mZR{nl zP{e(08ri8DSn2vX#sQD^!aATMQnNx%a^3T*ith_FvOqs%pe!6(9XqTFp zXkw|)2cxCu)KOaeYfUujo7;Fi?!SIg+AFay+dprC8C;qILbxG+iMd20^$L3NCNUiw zHzqloIeGEA44)aE&r8%su5fj8d-VjF(NS#y8=K=n{ZU6Xtc9!7@po9J8>3oB8BnT!(HCF6ib@@^zvfBdPV;!(J8>+0Xy-xln4eP-h zN9=G8(~eSz&D`yFb<$k&;j?1@AlF07Q;XDR@RhjYX@#OfaYHD8S9UJm+V zcDab5Jz{+RJlIbhG3F_ET$I5UO77*Ox0{@*eg`{~ljbPZ_rUVu+2+PfyhfmoLbbqJ zBUjgEAY;+>vL6?;IDYrmF5UBa<;ja;Ttn0iak_lR20^T5~=lpx5}45U-7ugb3Fg%y|E{!eCRV{?f0Wvbr&1~N?KY0Sw{mi{>`aBOOoFt zGaFMywikZS9(HpvoJAuu7z>(wR|@iCA?K;@{dqx&N3NBH8T2W6<7Gc@@9cgsGohgK zRt-5N=0sgyQq@SM_Bq0=P&7yD0d(K-rV3Uyv^Ep5!6ZSVBPQtDxFwImA(=TTUGS^f zD`D=Hmx6sSPAZ@1MdK-bV>+I9+gz}skbMvN>SieGz}+E5MvjL%@j+ct9~*&Xkj+_f zl3&v%z_1;}<39=zq4Dj{D z*d0}5rH4?-gLWko`)>g$YG5tY065k#meECWq*L_(OAny2kDEuHK7w~{DPz{_cUTr- zdur33e4_lqLvM)6fA4_zERHs$j+8Ku0O(na!3DU9EJKB(4aN9c%eh)b}EOI~p@D~G9nc`(6LBmnF3Zc_x!?M$2L zVg@#|UvrG}87`I9R0;of>na+yL`UwS^&%NGu8HDD<*yc%aF2K(hff~Szm!{@j(b(` zkd63Tl4}138$_cBOF@2oAfWh!7--R)b34%Jsbzu;Y9=eB+_#)pbnWp3cFqO5X5nXN z63)p>>uS_V#dq%#T@U25dKO(KKJLHzema-NHybEj2OmjcIV#+q{N)Bim{|vNT@5vv z44D>Uq7=^qZqTc&HnZxg-4dFzp(QICT&nNdJEkUk*77NTMIWWQd3c#n&$=#}?(P_k zT)4NH$wgy#LgHd;klXSn=2JR)E{q^zCgGf}uGE#b9OszdBx>~|b#rZ28=;kYccY-~ z!N7E%rH9+Zzh#WpN6BT19?H20;h5KQkkXc*iyf?^`7Vf8+3EN^xgYH9%ZOvid0?%~RaBT0bH4U(p?tLOBgrvFJA(xx0sA z|6K#w9kn_7Y4ByRkngNju7Q=L+&!EsBaolB&AB$Z!dZ$mS@aBJws8RzlW>fhtiIzL& z^3nI1_5bAlp~-S5VWD@i6he~b zsK!Uo{jf}P4+s(S?|IzrCT|gYD@Y3XVp;qk;gT_r%ZwZ}ucAk~hibv6T?&TGDJcMd z5GtOH<~ku<^m>e?T|tE!a?utqFyYtL!#vlnOze15Vc&AFqnX_kE%W;O)>+f?dYisZ zRpzv7^bI39(hdRNHqxR;IKSd#|$m?0lPZmZ}!;b?A&@!zLvGk%BNK2^V@8 z=pg<{?{d3AtuXGd?*qy%m2EY!)fP(~4Jht$6L}y5ErkO+rTxpUQpbz`_Ka$Ii~BsD z$3CFH5N{eCuQw3T=Lv9%JdAFME)126#TO@tS~wV^%sg%Y_e$$D9>A7 zrJuAXVS2#G)pRdh_S&2f9Pj_V&$du8nAPQz@nD1pLs^Y^@z8>O;?4Fi|NctoH&I!6c**51#3!y+~HJuqxXIs@K! zE%Z)v{c1GbP;-o7@dNvOY4vXPC$@;@+>8hMD#n}(w65A*vt&wLMp4RT*-En+CXHwU zOaxm;`vfj&lmdbNPe9x0lYoG+cONb@1aRD)KVdKSBji!VFEofxiFT*+9k+UDE-AC&`R>D1tA zE~6E(xQ}Meanvrb`L@)~N9A7)6xOVQ|AbH&^juI@c|70_j9W5mM}W_owIz-zGRV7` zq)S&t*+hNy&2$#Z1KX?u*!gkMlV}EPClXj^-Kz}T@e?;Asp-ZJDfr!nCj1_I3G*RS zTG=%Puu(kg7l*DkX@BSZX-t+rvZH#a#CHS5Oi<)}7*#$u{eq?!eN$M8HGp8K>4Ohzzsx@S|d?KRx9!PJSl7uw=x?xSVzs?%|QAXl}2&x*ZtTM zC~UqAL9cTd>nZ)7Ox^6v^|KM~yG4~2!OgX3MpN^hdqP|5ZP=lc(#RiW0&8cuL2)$e zpwSSE-?ocrC1LZ&psV@(bZYJ>qQPuhU3za>N*-#AWb(k(uxy90u=)>tbzRkM4} zBDlu_B>OkT_aGTjIi{dq10scq&wr7~v)}8_7RLZUOMjBkP# z2A3~`rN+6rA{Tgenk7_-PPxn_|H{xz#xghU^@t)KLO;m?2T-W#hrF!Lf~_&;ACCKN zCV>qKqK^#kw%^3e#>b!XaK99s=587-WtUrYL2*T&wrno$D9Qwz>T4DiIJ(vCa`&sy z6luw0v+`5G=OJ|;siTmy>&!}ubkI}sq&IdppN(u~7dz-j!&hEP;rUJo)wCFx0_ESY z$1^V#E)Ip(6QLq(Qc6@><6*!x;t0)F61R$SCzqSxeZTNQHxQoIdd8f~cqX8r`ux{} zd6P!SHyJVI!C|+lD%Sjv6Vm~iXFxtGQ55!f|K1UzFoI>Y+esSI^0_ZlMR@SvTIr4x z5=;ezCv!MLM4HmTEn~w(0Hq}1c(M`-4ydEzXZ#)m^SO&9MF|$`osZ$JVdL3-RIo)R zC^Ed{L9~fCX}*#Y50QC9V;xVq^TIsuwCPfnQQD)Y%PBpC_pej5KpXg7k@+VG>(OY) z=hlQ`t7azC8_j13uni)OlbDV3_0{kjF=C0Q&=VJBI0$$O2U7QbRo}Iv2Po~&Gw&v} z-TbgyC=f|SbjL{TRh{jZUmo+n8^iKPY#=$K772e(x7j z76JJzo*oTw5>p;YkX*%W+@0rMJcW+4Mh2WBt~918F%Qj zSs}aW43>sD2bbBy)YnhUoN7!&BsSzi#%I|At(>4w+^Mf3a|=})#IjtDAb|#z_0bNj z(xmMUfR5z5WbUnh5^_j|V(|O+vv8TfN%(!{A7#UF{TP+SZ((?s9l_lTPq*Fo;zy7}lnh1@&Y?#EfOKVSWuu8h3l1 z$HDD;=&6w%`Kq3m?B`BW&+yQmVy?(o#JVP>ht&mM%Et#AQYl#Dd%f@4MdowR64EZ+ z=)ihtUt|0gF7V;#zo)3SxB8`l5ARIicB>nV#6|rL@`wQ8VamZK{eBSPCw%Z*S>oBT zhcA_ZeqaTaKG)_^Hr}wh5E7S;RNW!;nAcXHSvANBw;^o;?G5hvHEY*%Rg3iM=YKUL|Fd+Jy!pjs~=KFyDg0tX4#{$s*hQ%!L4^ z2TVa^_Dx&eyJO@UMZHcldTLgeqgpdlvek|_B7Lv=WOLVlj|S@RD0^q{yQKxnVRZ*G z^BDGmHwm&vs)^80F7l?6eKYj!qRL2Mi+yEAo=9i+EiTZ0y=aPzgF=RD5ru=>sh?VX!dvMz585;A>LW7WUH7^JXnZXPk4Og9Pd)Q7f{_-rv5+`LGv^dWj!=n=<-uK99Lqg^{gh=S)Ubni(WC zgjo%LxIF?2Wwmax4}C*cJ{0X*56*B8oUUl>le)B7WXm0F^SkJuoMh`6=09O{Y4cLz z=eR^WA@-}d+a!(!gZ@l=-BWEmQvZ-!y7{Un9Pj+~zO`U+aVtIS6E0g#R)Y7RQmq_H zL8w;Rr_>!H&PVl^_l7y_v}ONE(evaqfpD~8cr93_vH>|Byb%W2Tt;iqHMYi6`1`wB zZvCMQIpO+U)aS9cru3y$*w2VH-W1VG;@GP==iOYz{=`*Wa^sg5f^C8tIs^ig&clvg zt*jw-BZA^rWq8%u<o*8`T z>_q)y(_tsAfzB!0uY;a!RKy&s6pPE@qc_XlNRBibR*HT{HWg3OuqudjuwVtwE&#VU z>(pLql?~X^>ru!RIU^qU#Wp$xP)gM}A2G|{{VVI`hx4Wi8wn7G+_X88S1rC@On2?} zUF_}|6ee3NQw0t7;760PtFJiLrHT}nFZ>8KtMa*)ZO2@LwhI}e+4MhRkEd5}W$ixY z%n|5x;P&5DwD>&CaHUUu6kE4F3jgX4S9MqA7hcqw@ilOf&`*pxsuL<6r<#p(Xxvex zS!K?RH)qMFJlpb!fZ7PT0|t9^DsmWdA2*uS)Yl|<#^o+Dw;Ebv@Vjt`pV1Z(j|j*? zKahq?+Zgep#pBujn&7R{$`h;6oQv=^7T$`>oVPv-qbqYi?4+n@X;+q%eK{cLb@b^P zt`gNP9ncx~p)2SoF7TAq9zHVHzCb+`=z*!q*a!?u#DWD*4v;G17i}kNV#A4}G%C{M6& z7Oww;V7GhcAxc?UB@R7bV{F?3O(8C1jVtCnjzrBi-?x6UTI^o9^Ge8-i9sUDe~!1p zH^_Ti*LSs5=@4rp-k7m}83skwqjE2qf#A<4Gr_^{UYHA(2a~ART6}uk{MLMe()MXe&beAvf7_}H{ zXGqPP_Fp-U_2WB3AX>}61I)-eFH8?YPr%X}dzi*^|5$_-@>!of+Fo{L4V087Dr95v zjj8XIdF2VCG;0I(A5Q+Gp$;or-xTm}g1v-`n`Dsf`xl79~v=SmZqa&C~V`E?^H8eL> z7KpHrw03d^*uePE#MJmuptNwl*{KB_ARZ@E1n=h7;8c(CmL3|yf_d~ooD9~{i%HG7 z270t@1ALVO|LY0*ITRpW!k828fBfz9|)J48H)(sReAa$AlGh9fTEks=B{c4}cz|H@2|6 ztOx}4ba!U}zTQ#K#i0$w!U)P!twRTVVSrKJ#Jz@lCq4;ent=CqyP}b336zzlM( zic46FPiW4#Cu(4A3eoEB>FC(R4#^Fw*9gjbga%9&ap^~V23jz(0-BQ!_kTS#IKHDO;VdN zXiD$!1_toy;CMqKdglWOBT{=fkK%t%ZQ}-Ny{O6A8E}sG+3Jam^_l)MPzPei!NFlb z7N3eG=mnz_JZ+c?TH3 z6Da=Fi2!z^inncS0ZWSj(>uU?@Kv=<&rhp|VQu#1f3-~js?^MJ8YkFnkU&q>>(f^oYLv!O#g6&DS z%=K;^0(yp=FJ*8)%{+h{m8t!S!Ov)#qr)SRz|0IGgGnm}wWEVGsLz`I$~^AXJ4H0G zfSNbtDh5Wsw6h;jL@>((0mZ}+JW$j((Fg23NB~M7G64|fJK}+IdTp2#5#} z#IUUS1=~y7@&)PC(`<8oZ1L{Y^4;o@_}`FN#poX-R*KrTANx_7==0Hk!8*I+{)oPw zj0G?}OIybEE%Pv(g}xvFE<(Rcc>V$6bS<49aD5&fKp+DSm`jTb1VHX?5U!vqe5ems zFYMw4$Eo{_7Z3sv#bsePKTW@UoL%-aT=u`qcW1-Ag8nW1!*^;xj%lTfv*D*qCw4W^ z$opcJWu{FL8#r>>| z8|?V!4~4|i|8TA9mUzZ|jx5eHKuQKMn5=i!Ww?ySEP`2OVS z@+Lwr+%d3k+>j>^m!B;Nq3K9ezwZK&ikl^jpxP9PgPM+O?`GGoHl8k`@59!xG~cVXz+K9 z;9q6-c{3x0h-x+Y-uEWO9F(XN5*$g+^uy*fcPb4L%JEq!<6_G>1`Z0(G*guIt9=`c zDUnQeyCk>1x^IiM&xah+s}sbEkwi__+0!KzAA-M)Fw0~Wecezl$A&!8xT$bwy^mok z*ecyR{W)!>jn7+XkAhJLT4E8&Mx$aNM|JzT_$N5_0 z?y7VD8FZa#G|N+#2hkEw=w4G0_O^z^v==T#)5dC_$>wJ zaQ#C}Iq?LE7s2o#qu%p{dUh({=dkrr!dhYtPWzwz@-8Oa^If@zWed~uiFJ5SYrV?g z+y|@NPSg^cv-QWE_h8|O=0um|em^21`u_%$BsthrdF5O(!9Bkk+eq-FRxagEJYnXD zgeZ@OQZ5~Kos4Mv$+TV$EOMj-ak_2|IYw^cBl*db($J|1jM08|ejiu-r3;_3)6D2e zv6MQ@y0-V-ul^BbA2WLd9e$X@_<`tefpt@x!lf{PO|IWY*m5q};t6M6B(cxbD$bMT z$+V%RH!un1O0)eYcc>k@A2bf$Y*%FX(Z9MrNY#h>2*ELEv1ZHglH(1b)ry8Gbg>Ssi;Y*Q`8x0izO*E=ax zd{$1mDavk!hb+0Za#96qcO*sz(J!)+Dj`CiMugN4Rc&QG*rJZ!s5~o5Xf9JyRWIZH zZacN!!!%fZk46GGiaz3y{#He@(eTpedoOUOOaSt?Ltt}qbMnEwn)T87B~SrSf9_9T zU?8R$Lc7sA9V@zyP4qcRLY~ql_*_OIniZEDzS8}NB}oQI(+1C?-`GHOyl6&B-Y@j4G-VjZ)Sz7p@rFieN>HJhvyCiZx91$jtjKtEz8Q(S_5|}|og`e>xl~&^hA5ey z2mJ!$gUTXZ8kAg13UMzX6-YD{{iOhlw8%=w5GGvHgj;c3VFr>vlW}8wt4wixH1*Nq zGUYK5x9Bg*yp-cwE?bdq0pDNsBBBg;ostD5cOEZILRZ620Fjcx}ARHvyhW(Nl|y?)9@0=YmD$o}k9 zJ-Grfnep3*UMxjQ?TSf!wLDuqpOzO7=*l#W^dUB44Kcmwc>ZeKkOr zS=L`S;^h#aGm419gKcdgQYdTfZaX{=?!>M#?cE$ue9e(F6IQ&o+DX*P6E1X{ofJ)< zf)>E0EAjcLO9(JHf?nu@(zwUCfjU1UqY&hzIk8kxywQ96F+ri060O_PZk_Oh{Ir*+ zoxkyfj8P_oMiW$i=-#h0@3ekJP9WwcmPrwy=_F{Yyl!T;Qhc0RciT5sSoNOf6M>QWU%mf(JE?c>CM-%P=(bXN~w=9I?J@d12ud}SyMtIKgCOhLUulQ2@zLAh&JkX9u(Cd#2Jztvqt3eHyJ11KUndmgSf@2B|NlSuAZBNh2n$ zJ&V1@N9m%Fga}iCTt^LsYY<$N7=f8MfSp zI5-p8EalXi%CRaE>t78UrzO+;ny?a!>c%LQ%Y^l~%`O>^P%0~DAhneAE0jz@Eif>G zspLt1+25}p%KpzPjj3+8}%uFIDS;)jD6;=&iMxmj*Q>(B1gZT5?W zujTbjr}BS}7mp^3vL!16NI;-nTI$a5zj<_rDY-SBZirEh3h3eR7D&Ygcg;e1=tL&0 zVOv>&h{Dp$AS>`7NByxEz(g^F7;J!9Ul}Iyw~jqE5Z&D?t#}`E>JAKTP{?ln!A#vd z?F{GxuSp+&qau-_neV}@Rzguip3sd^kutNeerZ3kB}r5z?0G6H!RwWQ{pOF^n;o^z z3gvfH+48}D^!Y6y7ghe9&l}baI)6|y_-Ph8WPZ4IT zZ)@dtRrI=-hj-=*pq$Rz5w@0x*4^SMgerw@L){xmKV}9jkc=(ijenvrqVf2KZYYsIwMVPe z<7a1VM5W+$5HjB(E%YEfLoZ;oTh2t4Qvwt`pfDi)S_y$MlCl2Gx9W7kPN_lMnm7p! zUHFqtb1%b`G|yE06t(YjZc8}`+OERN+(eb8Yg);=6kV|GsvQ5qtb9;7;iD+8e{8}P z1e(081pR;s3mx6H!XL|9tf`dd1~w*%Vu}`kjvQPJiazdbGwwA|mORSxlXR5wird?_ zBEB8^oRrh}X;OM2f`giQ_lZNi$UocILUVZ8GP{fNnfckM&^0k2l_Xe6H`2~Px-1gF z8xPD9q33IIqSu)adQ$s^-jaR!LQ$#TzJc3FhD^J;BcS~FCo>kPGr2S)`Ye5MF3ux5 zK#G$$6}o7UY_P9siFSX!F@~>@?WFo%54CpX-OG&fgFOP1 zzd}w!k!c9RoyuyA>aTl(I=0V+9Im(A20#uyzu*Xc3CBKPK|VNDs8`tp7#?0Uer@Eb z9NpDyuf(QW+r>_!#glXd3efKO9Ad#_x761NlBx$KMsakzyp|yHBwR1YX>4DQ^*(I_ z_Smq}C^oTIO1K;Uz4K1K_x+ktPHV-0h~`$nWA~!-u}5b<3EBpW+Q-zTb(!tw1NwEu zYg7%ZIN%SC(53kXzXM9 zuY<4CIH>e_prO!j&;yhby}J|Y_ z`9g?%ezNpKEBsv5Z;PkpZ0PUK;##kCt z)X9v8x+d2s4@5?b4A5a~xba7q92^mK|!pc^t+)EtR*#EN#qA?E{odYn9p?eIi06&mrR^SI4q)3AZ(CxXFH54V(%;&r;3OYatXEL6^dDhBOWK6KSR9HZW;ur!`;?sHaq%|ud-GDq;?Eo+o zK8Jc4#fPG-GLO8WmEs$}&Cr>u@S#XlS#v}D-;8c?J3~zYCYVpRUpf6ciLi~Iy;BGL zOKDD7*E50BmWIoR!Mh8u9~4#D2g`7UzPJe@MYW|u5&84%NQL##T9;fovYjZ-s(v(s zUjaVQ@c|0Xh>xy~6tpNGbKi}F`#sR(gse9dmZtF|=Ls(DXPSUHP(#-y0z z)ztXFQJKK79CmS}!eYy0bgSQVPZV+80|l??1hB*ude75>T2LX%isi!ySBlB(Q-s#m zgHqGa_QIGHDQZ$XDG`e9;pi$PmKA{!?X1n_yN?-!sCFyiGHavt?~8Ls=gv6am2Hb_ zySXWbV2Pp`gmlWyuB{sr9)$f-U;6y0zri9}4tT%3f=;T8$wdrJemF6I*`)L9;pA!W zY15!{c?arD)y(DV_GoodfARdua8hU5wo+t-99`WhU(r zT-x_gjiIb6KH@yc+&IiMvhV2`klV?x=SPMVk7s+05Q&Pd;}8FhqJ>7KD5nJdv|J%p zKDi0fZw)Ryc6|NO1@93ys(_oM&c8QU_`d`!yK}amLEy!JcDE5Sm_#jJlE=eOJq^A# z9v0JNBRyjP+FeAZPiEix-EegKsZ+(*!b_M`s$J|8LQ7L_W&;0UZz-U&WYz54Lk`t^ zQt~xmX2 z9 zhkWSmX@=P|{(ZMG`bbvYM$bV~tvmG?bxZtGOThN%MV2Km)CFx$ca)z`W-DkUwjBVR z9)30BvB4NTP9NCQcC_5a$y6@E5N`vd58CqqHOleS=EsP@E@pv{i|u3N#9xZn>*&^U zJm?}w-A~FH%n;LqoMSPwF4o=zs1+Dn4Tk_&qK`6k^|l0p;_GVfx?U7(%sBDInsq6H zRm)hEW+LV>Tr;Pvt+$h!evdX}`5Y2cPr|)=SUfwyNJR~}wR{IR$e!I!i#~1^-PxFc zXO_N5AA-wP6I43^vEk#2T<9b7VkT$%dG>db`$zWquq-VW%x-ZE?G=24iO~X`WK>aJq=D^GOgi;e1(+! z`uwLKs{a9jK!NpM_ivs-{_Fn$RK&U+^j$5kfY*?Yt#h~f!yEspi0)Bdi=3%(1ILxE zLj3IUl*8E+@p{1Ab1v5qZlraZC9)l|Pt~cu6wfBTuG(_B68W_z#KCn|P$YcoWRJMK z$(^0J;pd@)EdzLH3v?;OvlJ|tKDs$^~n23s&H z5@wT)B%4Xiiy~#M7qY#6xGTM=K<8_GOmZbGWs+5tAbO^5DdaR*F6&&Inf4UJxvS`; zsAXEw1eFRci2DZPL30!5Y0^rR=nkfo>fDJ(oLqtDMkk{_WKA5jGp$18{3W$MZ<*h` z_FZs4DD6^vD({yn+^lV^>c&!*UNS!V1yiRcWj9>gN`7mbM~!#RHT5Z->Rn>%cAw|X zJ{j5^d3b0w8!b_jKHgF2xjS*uv&~3CJp9K@wYCBctuY7=#wjC~6lb8ajz$83-i-Dm8D_u`_%6N#it<%qiDvJn(L;w2c zoLuQHe+{PkVpp4uNYCVyiB#jKD5+hUkg>yK3LKx781}o&SEY{B_fjaD{hR5PW&n}T zztb9QT(H=kMj-AH@6?a@h7_yqvqG~WUmKfS3zA~8Ztn0()`Lw`>E|~MjPwTJUMh1S zIsRRJe)7J@_I&l$+`xo0j+`&7t!J2y*o z7yR4FW7pX4%U!&Pd@F2;FaB)kG`QNCB{RD}jT#;;eT~jaIiFx2JKQ`t+!V@}TdQJXII+iM$yC)&gW0#H`D~uvHX-xrWYY zX~Xbnrba>>t!HPtg^nfs8!YT9+ zx!t;>p01Stt?*raNH4>{_}{&MZ7>9e+1E$@IYX-qH~0{nWtJtFC^9FPAe{O0?0&?f z{L}&4zy#ZcbbqJ&=MFh=wc5CV{UVi+Kc*AXNqo2Y?kLbLS1;wLo$KLKJ9eGszQZ~t%6(=1&S)YE zMKb&*zjx|21kk|$jn9w|Y8|BH!NB z8JlMhpSWn=q>sP@cjACx2bGFtPbW1t!E%VO?EJ2ty<#^vvV2gnMcsjl&kNT!{3(WQu;%%ind0 zPE~KSwU|xQsh54YU>*Wec55D>=-Bu|4$rM+wx6wjbZ)--sAp)Ys~F%68dE{mxAJ=v zF{ob}Zanh{FpN6Kc#NDHdw*4@WQX_I|8BP92uLwr|FkFXpBbV6_zIP zve%-z6yU@kzp9i@5$%HV*Ap@fsZ^cKid$0WwqVBHT^3-vub~z`=~uv6YMNjEMm27_$p5Ka*fxailBv39j;~10q<6e>+z%!I?Xx&aC`&M*8U@9+7p~ zEHU$j16G54&JIOL;P&Ivi}-PHFXvpdRW^wvS1-uP{;oP;8v5BbK8CzOoz-E5!=bNA zTPsfcO%SsU^@25-!Y|e*Yz^~nNn220%t@V~Q(i`wdSku|!$JNV8$t~pdJ9NG;)`3h4y-Ro~AKcx#r zN!GeD8swWX+SM^VVx(ZS^NgBjz5b_G0V_-&W9TV6UX_UksQ(V3Ku|lJg6y^USiGjS zAZoVzwjpj`rA_hX2B1lTN_zHBvz((oJ{!xmjnu1GHM~^-eY-^=g#pABcw z5oW6f6DR_551unv42!$Jg`G$U?oz4>LsS{x-kPtA=nuh zjhJBzYFL<3l5etqf)+HR)|MC|jT;s}9^hvezjR)4K+iVHSc^s%!MI)6L!`BvI|e{t z$C*c9&+VDZR;dr&i;98M^1ozAM7^ZySB&~9D`XtA4|XCA=k>(TB4|0_?kZ4Ci*pK5 z>9n3=fY(FgdhN6d~#yZo<}p&$qFB=M)a4@+E!GS8vwI zOAbqEZE&VqB;F-Ok0=?aPJkd`c?-4Ay*!gowdHPU{_Mjo3(sh>{Mc@bFu!skoDTa zv`YO8S67Gk%TxNFrcxPn!W4yYomz@8x)ggut)C?Cq+amw%fCOI1JWYEcDl`Rh%+;N zs|>^y;358$!$47mNw8KOUq4|OpEEkcUYG#q_1Tu|%V5JoqB3A1wO-eD|uYr+y`Ts$LCa1e&~bXCj0Dlhb0Y3k)(?CLn9hK`-b zuDky-SxY+v?yb-(DX5OjY_a2r3QI^6v_Cg0ZB=|!CFoiNv%6@sO|5rO1f6R;gZrKu z)+8Cl7(g`6!LriA<W?bZPr71n*ivpX_$Na7PFBM7%xG;FJ31x;M zphJjTJw~VkOWCepP)6H5p^@oI`DV&#NXvz-xcO8}`&C>H-xQev;$Z_N@ zkqj}}&DKE~`*DRrp|$(d;ZK+HmYrrm{a{f-rAD=_W%kdtip_gkDRmu2 zD*P6OfM5=(y9?A!{|3s-9Z>}{mZrMw$!OAQgTTmb)8qAa%T4@dc-x;&4A`AD{7aMU z{)1o3@Gcum=2}YodlbePgiTU6bOF7pg^_c$Jqc8v7-D&%dwvA%&au5U2O$Xn0_bJZ z_%0&~1I|*L!@Bdm%FbPjRzb))rHV7VP#2?0oXc93vm9|z+gfgt$@1v1?>mm0w`I)f z<4)JRkI74;K6zut2XWn}OB-9XYc}O;iDotM@vg8Bqt%v(69V}^x5Z#sm?QJv#I$IE ztpBugg=k)g-@)PwdtKZU9@2xNJr7|OT!hLrp*8CC!OO=1gJj5LgqC{!hhtLGn}(C{ z*{O4;V3}}}s3;0PgK3`Lys}M9>WNXPd0MkXjt$fmZf;L33J_bdx?H(p!G#GxaQd>AsF44%^Ii}-P`EKd$2leun&QLL??Ull1*SO zP^*4IH$i`XD{&MU`0?sFjoY2S7Q;PoE%dByTFG<_!J@&E-Z$3-PlM+qd8%~|YSds~ zkTd35&6aPK$vr`b3>I;t&sKs60zrky@H9P9%1GD2QezWxGvC}yht$8=&!lzl+|o^A1wgEADG2TUSp|BMIJnDL&bi|J4SEBkA1y4e7zzvL zv%koTC*N9v^_Wm52tuS_G%JRn{{5Wp9!~JNn)X?^thP3-m6Ff{xk|jKu53(~(0d29 z5|@f05MJ6`W-Xp`KP}M3x?TGx+Qn$P$@`61J$p0EZsiPDuy|oX^P0QbX>waJTC6yw z%ZOj(hf?$@VUI1G8nq@YE`;w#ych<0`plPDDnM+3W{oZ^x!!1P2P0pf-$68QsG311 zMoGONp5mv!7R_*Uwm-+R8up$X7cy`_xM$vGJ#bj9vMPJ_LQ?8ysc$n7DLu{#iz<<) z3=@-?=Fcd?QY^m#W z(kKH>-mgZmBn%JaA@3M<1o8rHqnW=xVx!O0(M@9j`%w1>|8@)|r-cv^P7oLv zdHfM>{#iwV#KLMj@|E;n!m5{d49e1BnULimvTvKUdM!qKB8e*`JN;RG6TWl}lrzAP z^KyG1uwD%m>kG443X460s>&E@*`wDN1fqP!6UI|ns-eKz$r>ty37j@>d2(q^XgwJL zXaYj!2m3KF2PGR&y(cHixcbR_w~nv$#RB?MSZN6|c;d7y{=f!uYXXX#%dYAs(cZ^v zT!~OKv#>L=Ywm&AWrzif=;&Lo5;|Qf6hL*ewj_Feb5U|&ih3zEyxUN$j}N4p61-Em zDN=gSxmP1+Rf3=!CXx!bD95U>8={trYms$5-eVm-xk_qx^GSXVwY;+mFG)GMVfC!1 zo?8i_9vqb0Jj^YOJs7&aKF4vhHRy{#j@O!KM8>L!xV5ry{d+N`VL_%6P}Qq##ZPW> zov7BM=5zfipHQN8Je=F*=n(4qYAAmWYS_pgDyOA1^OugKAlYVv)Q};2Sh!KrCQ zDWO$GA)|y66cPi(Fb#5ja1uc|3pH~GG|gPC2?jXDCku(r8lN#kV*?F(f7Mch>++NkOa>}kQXbaDWH>&Mfb z8m|g%j`S>wlWWLQo2B?7J<;MYuJ#a@2ii^h7CF&!3qxV|khSCS7f;~N^T6>}re9yt zw(JMF$?o6w{^=PZ<@3m-l+~)RAS16@>yyGQDC`OvdsaqsF^~bmq6C zdAj?8sHOUYA=kGbLY}gVXgfQYLTd#xY4e7JQ+Y$ZTTla8@hgD6`7-!*nIDvAQ&pMc z2K+##N3Fwfco4O2S z65RdPH|`t|1n^474+U*(en};#tA;cwI%^(j#$=g+exvf2K`E@QD|zj&_;_&rC17C( z*+t1MKz`kn%zWHb6nc;tR4#N~+BmK}ZquHu9?n=QgjqzY>92@WRCsWQ63KGmqlTCB zpSrL7{KGnmm~uO+#wj!>>2pC9SiGohBQKH#V@IR>_>Ixa!8nMyWXA`6g__z$6wxxY zBJ70!!;6@He*MIxKz~B7S~g<;erW`9m{dteH>G1oe970ViVD- zDVQxriE1#5rP(MjSM_dL-l=rpqZkLd{zh`k;B=zAbiyp{i%B_iqqAGnAJ3})O$`C) zBdE1m#<5WXIETuN_fV<&Az2MBWB-FG#NGtb_<=7`q=!kz7MUH?&$>AoG*EDIX+HUJgk z!I;SRJ7b}0ym0f(5M5};hhzvp<=chk!GF?3Er^2v3tX}~rde)`Ny2B7?Smo{)l?(B zxNynXZ*W}hyVd6e9rsFxPD%m`jR89xp3Utj^k6Xs@e(yHE3IRdQg2c;1(#lC!o$KT zbi)?CcuE-|cOn#jT;+S?4_M`Q;(o=qz}xsY5mGe4j5X*ukBuVyr>oZNum5%jr#;Om z>CFleFM{$oLr$DC!g}l&T{v5h=C1ySuM#Ekk?R~gy=rvGWj3|}g560yh|hzx6xs(c z*}OyLHEeuSWC!N@GiALzSrZ|_k^<}#k9LyA3_%1wjIDbGG!0)|~rXM_Ya9wRf}x-LX>*@0huc1`#F zf!-$H)8bhq+tKuB!Sl|LhVmXSrQtX!Q{qryys6$q0go~CGOD~MEZ60%2t-n)2mPgJ z^uuQ82rNTD0%`qC3W?FPCkMEO%j#h(+9UYZas=>6)-_ir9aRMm4;A+_^^NO26`F$-yk(lStR;g3M z$pCFR(fOw_&MUTgCv75`S6dV|!Wq@n1U)WF<@c@gsj=|#f8TyaKG?^jB7QfCLV!is zb0ZX&UPK>CBJs&Q8m0ME=u@0J%d$s`?q}_HT-@3TOQP<$k*WLz|1cF_{6C0_|6RHM zM^vyevi&zv!NI}G{9kYXBh$t}&&u-u&9pUxDrcSl11dVL>XEA1|B)2iB?#j75FvYt z*$1jyktk_`321I^VFz$DCGuOI=Tq4k9H+ml9d0HyM_w44gTf`9}p^ z-a7k<{K^`ieu>eKO+Z~70Xe?3IJE$(Z*m9%U_Dgg(9>aH102Ep$bfKk2;?0I;Nt(o zE{>7+<8}l9JSb=Y&Mby{!JHc%o1FsM9op78esGcAxTY65COLvk@?~Wa%+j$(Zhwrg zwFy+^z;9u{X1_Vvg?Ms&enVGWXY?<3gZ#I3{5@w}Yqtm_8~hS-r7?cjtnujq@XGQ5 z=*ZXr9-sj38yY}=XbUc{f!+tlpEtjlLwakWmq7KunIVRD|4libg7z=L9{d6H|K1?@ z?fP;3U>n#w0QR}6()*JPjm%&k=3U8|hCk=MNdWzI)dfJFAp>;;WcTy?@n!Tv!o;|^ zI{SwIj?)6es;aW89B=$FJL&CSSdgdlr$eXn&&i5I?i;4S2S9N5y!*Z7&cyHR{diL= zPi$mCx#L>B_05C3;N$W7`sa4&O%2Ap+Z|sjkh=&0NdH0Xq#(m9TV6z8{cSw@g?Rr} z`naY3b*ulilX|#`jrBuF|1tdXgTN=_61(jsmwRvt?B|!GA~?1_e0$Z{XdmD75a`QvrKj5DV|gsoxqa>7*x(RiF0gg&)nfo~rInre zz2~9HNEuwT8oHK9_v_%dmBR-AJVf&|8e5e8c7t}DQI)^DJw7}+1ozk05!k_yWBUz$ z%MHG3D$x&L#ajRa;K(khD?{j8Z2JMQDyJH`)jB~305I{*`r()J1g!iH3I^bh=}nkR zf`5WX0s)};6_Asz>YcxB_uumqpanp9pc{h)(ENpd0Ptt^6Vl}cm|NK#emQq}f?+%Yn3StP_Fr=Otz8ML!xfa@{ z`v+fSf4ql_HqtxM*Jf;*SN91Cc7=@1rYEB~DXF_!k+yeflH_-xM@Z*m+2v+qKyEiD zZs~caEA49O0i1Oy74or{cHboPO_v zVda^c)T;-dG6h{8&Pv7Z_DepqMpBTX_}4}X`(@ox-YxC+3)5&PRmpqIHQK^B)04C& z()<%vG|>!pXQc0L56YKLMa?B*jL% z!bP#a^dAM`ghka#I4oy%e3U|7YP+egJ0$%bA%x}Wz)djIw)kZJIv z`#aYMBL#|gbg%c9X;P0_DI}(Sy-LRuce}6`VX%kSkqIO$$7@W&?~)i+Hcl2AJ) zVILRgelnv~XXyG7{HBR<#;}gb^sSp|*{)A{s=`dW5rSZ{iIm1d2HW{(As)V2VT+jl zf*vfVzR5+zCGs-;IP(OgI%Urenx1TruOMUrdG8Wsv4KX@gVz$Q1eWqN}5TqKi*+5+8GnR;fFfFfK3roCew7m<|y-PrEohY=^-ca z@G=u+pGy`hW8JCly;Xjhv#gO;vxg3 zrleLonNb-VR~-5@QO;9eNi3H2 z@m&m6DnzfD1J?TP8edL>5?8d*5N)V2$T8ZTovlyi`T|!S4_(c^*O$8A53RuyOea~m z=L!wxZZ`q<-yf?ix;A zdeHZhALE@HGshd5v(;IH{?zEZYM9<&ZJPJ^d~xr$?HmmNV>9L6AE+&d=e(k|>? z%Vvster5A-V8$`~YWh#ZFET$)%+uLzI|SA+A%$}X+PAx9Gb^kJ%a zWtJ!0eN~OyKHa502@X2JWE|1J2gl>@5Jozi6&WAV*u5c(IEw5_lv*J|HnThkioKXc zZLz8-6=?J-=k(_lp69LWs5Ya|!Qi4M!TieaxjnZo;r%`xsM=NK&!((Yd-A3Nw2RwV zye$w04s?-;puie@bnl&&vh}}4kw7Mb z@GQswv?sRKe?B^XF5~QJcw4eco zU5sVcRZqnkAtwpZAffp(jW_n;@5eaum0uej14(*zH%6ly`Zt%0ebZXL#l2mJc$@f= zuMFk4C&eZ_24nmA)UMQp#{;jEd>LGhfJ~bxFv{uPO^r2Vyfct~LTvQQFS?un6|`{L zitJTPwuUpJ`Nq*@hf0;%;)){|F>Q~~%-}M6K;04{iR~C|Rf(rq)v0QrDAYr5!{;LC zA8fENtXmPOHPp#y6DLM0tPTzmkB>SkoNHA%L~iA7rfzuX&&-!ebdLaJ|Iptl*@3(e zdOQ`p|5_51>_B;%Z8y`{h*p>N0p%Oc)i)>5$yW^8li6$(7Gq5ojh08RS`^jMWFys* zdf&%jhGYV2C3ro2scv8Oi5T>}pN5f={hpFJZ>uGJpGNiA>AycksKc`NdZRrK4lzn2 ze9yEBbEfWFj7SLxe_l0ct#eDQeek+j)odn%PudYGd(1h$hNQ5jAs`Y??W zYaj7fiC1czY0Q}I8H9_xB#2rBGz}oTvtElE8p%NckkpxmT|gc>6WwR7>Q0P% zN4+g)kQe?=+2x;sY42Fm@uYF?0;w{bBQ%cCdd`|3={A_syNsLm*G5JL=#^7UssHrj zLh9Be&0Q6U4usB`8IACwRuS8E9G~zUD3MvZV|(z7^1IXo(3sL^ygBiu=jJvNh>ve$ zr>@+Vg`g}o;d+r7gvu4Y4G0uXm@M5#ODOuNZi9^=r<)OSKEKoA%t;B?!|^H&5TN|N z8BngI7`O|)KJDLMau7_*Gj~4&YCL_9GTx{;7~Hr8<$iasveYQ!Z6{E4G!@Bfn5yEx zL4KhPp({|Uv)O?y3FYj~6<<O4y&48v~ z_ay-81ew+jI!#Ua)3%wPuc0M9yHU}CpbmLYEu&X2SE-_^ep~d~to+V7y*P6zR}3^dLVEVqu8cO!pc9HH9k3{C z&9fnJF-o5$=tsow|Mrw+!pvi_Aa@B!G-Z*`Me|L_X~e=5CVYz2w5MJp;KsbwzIk93 z^~{D9d+(c2fTrqoRH19)9^z1n6Cjt%g5Dp_P7A@oGF_MirJ$Q`!5j_Jh za5*%g{pSN#WlU)K{+@{(5~?^BxlD#}l0cf2_uCebVlMO;Neqklgm{Lyx3ktf1;?YM z=bjEL69sq2VViVLpAH`?gLuqKQ)3oylIE&201SiQ3EvZ=S?=s*$ruJg)144g>k1py zVOE~OKGJdeV{qNmD{Rld`|{_<0CKi2RK>)X`0>s&VPx^$67kiA{d!VNH9(V0k`C0C z#{7XYlwL+TCiXd`!6ha^%<9f{#0y~&d!vpJdhsTy^e#@)T7kO&nlp+I{pld8!|Ti0 zZFHVf7afKR=gb+?r@0k|5N2EjA?y+ZsQb#LKZk%ssJ@yH2MZB}XvEVQj;uN2%Kd)4 zO|S*V-Umf5>Rbkq--NAHU|Xxwzaz9cp!Ur&q>m`Xs)(LeJ|y*GxLZSRzG8Dq9VbEN zfZ+BNmt}~s{p%k5?B>h#HFmEfxgf*(`Vj7)yZkaTqhWIpyJF?q>tjVyC5bjgN1s z(J*31KNBTB8!Yu~ws=%5V~>~~glhMvF8nl1GP>EW->r(3eNIh-2WJw|o$w0y@l+YKXy|og0flEpv`XuNYzODIahDKSj5hqmi)ENmcg zp<4u*lEJ|yBjHxU>WW~a+V3Ku>VG%-SgK?5bWaMU{ygbEpkDv&`k1J;_^6lhV4QHh zxVHSBRuSf#yJX=83_z7bp@l+xYU7XR|JXohE4s&*DT~2J` z*;KrzaM;>Nc*Jjk&g1oVM7S+h=@|bgY#U5ai0^HGR6NgQ5w2emH3On?pXt5*)Lc8r zS3`|eaC~A#Vq~ydRzrqw*S#ITC($qk8)c;~{5L9z5Lr^7Gf7s}c%|I;_2GmCXa)2s z+gx3Fsw0|)8R&JikTEx98t>ZdCG{^8*+0O{{cWZ*u7b!8oEaNX~c~TFR@k8VNU&c)+O9kwDcb0xU|o(YiP^F z)5gD$qk4dTUtDBVJ*Vvb{>vOp>`j>?8oD~Ef05TZHzOq7W4A=zB=K$wjhjc66T5u< zMy_YTE|AnyEpxQyRlG8~15*24_$+j;!XsJ$+3y|pM(g4yBcKZ?ShfibV_ z>wZdVHdC-^|3x6JbL{^0w`WJugY~y>LPw`UEvZ|I2wu_5X^h1Ruh|vhjS%&%W~vwx zy%velJJPEd+leNGSN<`lv`v>KedRa`_%>5za+LYDVeZ1V7!L!h%!P8~3D?Hy3kgn- zQO3?c1=@cgT(6wi?rJ2H!jqZvss1eW-U#S1lcq#D}&@EYRRr{Ez^*AU)__d6vI9*`EjU z#In2NmpzL8Y$9-}TfUpjafkBMH2+v=dP-Knw#ip3E;7Sr!vMa-5A;+1>h9pb*QPx; zhPmL6S=7^zPym!g%k~L_^1Hf@QTv&>wkpwxT4B{-Q0cxp(BEJf zq_yuC3)v?W<%@1mNeir_v>zHHF$TrYly5CZMUF0m55n!n-S}P1KC0;=HOagAV2CWXKqT~xc@MA4nd*? ziWPZRBK6p(k*9^i+eAb66A@C|8klb z=#3dsUuoXUqTH}`c+u(y8ROkqqe02w?5WGe%3*eJv7BhII0Mz|j>m4W#M}hQK=Lpq zvI|xfhVg`#^z{7!P7r1F=F>KQvKUD#1~y?Oq|!N`wh#}#PE5}JX=c8-+F`bcgt=}% z=ZH&k?}GmC4lwiBOb4HtLKQ;w!h%F#i7)`dDMh2&h z;4_C}mTsRgZBJyTjL;C%gP7GNk`BQJkw9QSX`ZpY-eshTJi%`S-=8VQ7-cV!btUSA z)GQoTTG!3kboP6+#LJ|xRqWOjOZPoiPlJad^VYD8ZrBqJa54-+>d>+1<`K(%5|!wK zKT^EA#$1>+kcz3jleK4KQp;Fh7neBmI4cL1iD8%F$%FJlf11Htdz{B1w@^gyBy=YD z$;I+pd$ZPb|7kC%~c_61?r_x#Mjkanbb(URX#f)77B zwHDXPROSegthLy}ZVKOc_CfxTRb>H*+&a99e<(Fg(qLxn zu)oip`+LH~Lhvi0@*#Ef4cT^BjYPDJkSDfV*pp!Bh}icmtgMDg&o(3)bA_q$Tm(d8 z&CWxedX%^q`~{0pleMxk0>2)S!s0%e#90**vYBnen)Kchs*PHktct}sXgfwkGXR6a zgokd-yN@kpwF^Pao|~z-QvoUJhf2yl05SCf2gLVMRc_)LXPr`Qto;Wdr<5b;WXgb6 zhQkt`8-^dqTI5bH={Ha9Uw19mOhyQSBt#~U4L8j8B9 z60h71Ay8khLU`Z0+H5?R49-&gIRK5m)`YF^iu@kBHVY}gNPIqbz56osf?AiL0VbSz zjd~h*vkWpzky$F%z9!qYW{lsBA(-H@Ck3VpE{{uNUOp=LDxdp03A=GJw}mCPiX7n2J~C;hfI&5VE0 z$4+Z7{l~;TH6Z6WL-D+RBkGb0#UgnF=@BWadQe;Icc=Z(`jhl!YQas0TinB3nbYM7 z7nJa?JMj@^`C~KrC9$x|`}CW()`?J=q`XeF4D(oW;c)Ijx&;{1mq$&S!W=5;){8R+idLwxx6cAnH$yDo~+}q-KpCpKm&`ttK zeoM|=oKs57JmvM}MD4#+?Imw4nrWz%m-5rGR(Y}WN;}yhJ9F3Zn-2VE+>S^jPLZ;I z;T`MW)c>jEEi}GTSH~uYeo*(ptw@2#t0*_do&J;rwIjvOMha@-rdb1JoGHzLU|HGz z<=VW845s1GHZGN^JJfz$4o347FlN;5iR-^Cy6Clp@coqhZcplj4BD45xosLR0h^n} zYXot>KLd=tb|e<-%OntO^=ooOzFK@(I8=N)c5VM?XI(eXdbBb!d#T8Xrzj>)E<6vG zFTLey>BJr3>@^^N`uqLG65rY48=CncQh)n{BX>m#7b*`*jan9HwUwlit-_oC!CBAsJ8XJsyIT`>NkdL1%8KG(gx z1|(8Zt*XS@u7>3nIb6?D4(O2mU^OA6Km7Q%!Yy$JlReRr@@1yjecdj-6|}VF=l+6S zW_}|T8}+s7@N`_{$s#No{banbCx=Pd`i^SG%=&K z-*xVuG5h$##N6KTIZD>#hWw5D_qh7#U1pEof2 zfVhUB8^5g&ThbE$G;33^HR5*D)G0`zYl(kFi&Q`kq3<2bBGUUK7*pUgSa@B{dXAII z&?_>};x?r~%i$-%u~I6l2xcY%bv$1fsiz%T0}JHW;uINpbd`q+y8jE`TH_HXf_G}4 zWvyEEp{ex@XKs-COkkfYP5mQz*;5B;qZagcW3NkTvF0RdW4<7&G^uy;5X{}YF4&Iu+s zMUcL}5(;&BNIRG8JA-AjXUjI$E3&z!TW!mXs@-yf?kf_8LwSVJP2h{2BDKKi$=6X` zjno^HhlJLh3kw9(GK;+L%S=eS3lZK|pHseUA~LG z8o^6qE9dMqWJ?dyY!F)Ga?r)Qs&6*(>b^!{jCyGuNtFoW9fmXX>sn@uKmGszM&bPK403t=%S22{6f05GCj{witP9P)jh9|aGU%d%pD7yvLZcM zVv9sn#HEe8!u(gquTD(W{4yBnf_1Wq{PgaK2`L`9HH*0nsWAXDv(h0T*2t|qrlxGE z4k78g&BP=L>vm|Le#&=5xi`O%E$>OmI*#K|UYWYaL_bCsYqBV`i!#9RMeF#m$-sv@ zN9T2Em13DX!ysfZ=dr(Ddy5FyxhsEPd4k{5azP^VRb*Up(p!uGtfBPT$*FtuaS@g@ z5Pk-ruei1Z1?}hsT2~1LW3!gLBPoR#GPAqlSe7d}c4sS8vBidNEV`ZV0>HjiEneeQ z>ec6DSa-)8oP+C5n4sqhtbG5^IfSzT`M}`a>NWyL&cLtqMkY!NJ(o z#UX8TNk)l!MPlWntC;BD!?^lWgcs=EG+$iFyXB9LLf|qo;Ub%W25dDw2iBQ=!Q~N~ zqxbjiq%2ld+m>yFNSS-I)_ZI@eX6DUGo&1-x!h{X*)9ZfRg*9_9VSl43#)!6B7U$~ zO@ku$k?%KC{&3yxpg57f(A9%d!k&RO4vVFOOu>woB-jDVlp*rPC^eo?Q3*J!dwdv3 z;_FJ(zsCtd(TJ8#D)5N(J45j~09L!Q1NP8xJVGi81Uf{O)7Q-zeHJ^)msUBsN0g%N z;|>ez1Gyc9s;EO*6kn-wv(U)~*}Rq1wZR-w%+F19MP{iV+g^>&=lcpe$Ouci1QV-Y zU+8UHMILBPIhqj?gR8^o9#AO~Jq+cdf#%w1w57I=&*N<)fi&a& zBO22x+Zvk;I|k_?c(Tv}8VaO0#plqCM5vczYSur@(NTH&*VWH=9ggUa)?(s~70C4E z)zf=tHG_-2?h!9@s|~9C!L;)Nn1Zn7yOf{8_*A)|1qt>+H^U+#zhRuYJ$)4VV3p0zZ|W|B)!8fdR^iDgL{6g ztF_yW8UkBn7EdZo0qC&ZRJ8H0P-uLVHF{n-fDhb87KVZQJN8W$L(e`^L}w40p;@j~0kd5M<(B zv1~2I(S!CIxOu5G_YY(%c|v1FZ&L5s7!eS@X_l_t&^8*F50y87S^7oNOOUDDkMENYXIYa1+C@lt%~J6Hl62o4%l{4eU6NClOj`C)9NZ5yV$#i>e99Iyai)3*S`Ji8KN5Z zL_?zJjObFu9x;#5Jszgn!c&TsFM2@vaL2|M7b3qObLXT^>`_k}DuC(v%+03w3q=hE zky1u)7Cq%3g%ZO&w2?B41r0zJ)}~G`oAr&mW5;8=4TX>W2_OhPZ|ZJyAAYfL{cspJn1y;b8GBAazX z$OF}<3}AZFHp~RQbdZ*9Jts6vlqCqwi|0#$Fhdf395Zo|QPmtpnlX;TVLOjxrGF_2u;mK8G`ljwWC*f$1cvP|n@puN5Zasfx zSSQg!NRp|os8P-0GcadxU9mM2#kADX!?iM3Yz^2S4xHrW>GI!da3i-C$cDCM5y;3P zR<iB$Na|1)4KPH{w#a$XSyP>etchZtOxVN-kU^EvU z(NAo@o+RFZmp<7cLQ%)dZZjDU2#kG9ht*l52SNk5(fQk6;n1c%)%N-E9qOZLG5nl&fZK|pqW5LXg zkg4JJ*P?iL@PZQunA4cSA2?yK+Hd2FS@dGh0Yfz)9l`oxgA#0*62l3Rwq7A%1a1^H zU?mP|Wt;-;X|)?ed}((sG{yLkSVNw=h*9Ms?kF~*n^(!YTbvVN4_M!E;e*x)k8Get zEF|64Diqva$QS+wASp!Jo;9f=8us4;2u9;BojKXnJ8(>Jgm<7cJtXvNAs6#4k(AjU z-wYiWs(-4kj$#oRg}@AD7r0Dw^KpVASVw^}L3n^LL7M0LSGs{bk5?!h*2J8g$#NJ3 z^nudi3!vRu-`RRH@R=lQBpn$eb8&gfh8=stU6?sxQKbQP*H-3x5_khvFT(T#IWUux z!dw1>gPdd-T=XM2ZN|m3k>1;9wH(f8P|B(`HyKM~(XkFfm@s`N~@XD+I^5DQ=i)g0_zjjFK6@91c8=g)#dOr~d zy(7@1ms@>Bd!vYs2hz+RA?Y?HvcV~GBh_IB%^xQ42L1)nWY=>SKs9E4qBEpq_y~se z43}`hK9abMvM~$~Zd>G(X9VFagNM?!W9^hiTTf8&+9STubE`wSN!d%&zXBTg!Je4? zsS@ljZ>G(!)YMi+^(V*R&}T2ysUn<{H7ea> z*z%f$@Y2Q3Yg0CJ1ro+5NASSy6T!}6C-W&H*iLDdd1u2+);H17CLV*i=`a9EzCs6_ zZx?So_V9g{mS`W!zR4St`|B-z6wwm;U6izQr*I2_ybCQ+X4W!SJ4VBDpxkHLXmfs{ zUuFb(}nip5}6Y~SQ=~(nPIh6T}q-$YP|7A4xbQKua=2WvVR#h4~iwF3Hh72>lUI|vAMaqKFu{qP4|y29Cd;+vMN1|ap@J9 z7w@y34Im`OnPG?`rB04W+;rb()^Qmojsn@Y6*%|Xfwj>yPtBq(F?PG>AMKf0?W6Uh zi&_lKv2~?GG%XuFNB+P3)*G)Ce~fVR^pe*PT<2rjX|EpIaabF}`~r%^TprxDM&=d` zWu?=RWAPN;4LNk4wa*j&YGYqvtfJ_71Ew!!gv>C&1 z1TM>t*eroC7A(EHHyKF^N#0f@C=P`Sra*t*91HT?t%yd^oM`D7sOWPQTl>s+(wtRb zuQfFOPE2HF@TMjdEDQBr#JOgl;0^93yTWX>@A`xv`kMXLTkJw|NrnV4BIJB*AjGp{ z`DY)QcC(SkdMlLPP6qWW3g*C8e3Yw69eq+BL~V42l=DkceGfvE?2qKp03^NxXa+ty z_mTD7R3po!{1m^7SY{7jMay%fiOU{=ako+1F)d zV`crnbzMA2S`l+ACu0XZS`jOKCu1RFLt7(bNFE+YM<)kkeQQX!jc6Azr9{m|nr`u1 zGO;r}>ik!owg-fYkZ!bADcuXloc*;(db0#3mmn6 z1a}VF>I$3F(L?^@C*&pwH2?eOr<(xC9{^U)lc*2&;7>5ZH}>}kwEdT*x8o0Z8Eqe; z8zC<|z}w|}F6|{|FngcAjgRl5FK+#wHdr13myT zA*DZfG&Fy}zg+RS>7HZ>e(hF**arX;e2+aB%YKidJ_vzsc##Hx-(0D%-=dxH0d9Je zZ9tGgHg>=KetMsOHjjTv9(Cn^awUFmqn5h1w|ow_d=Y-oU|m8x-oN#?#8xrg89_Jh zGWGqwS(lL?RRbm@RGO z(1qY`K)#(j0p9re_I&kOflY2b90T39#~xV!w5R9#+Ll8$hH`#kFyYJ71EBi@d?IXP zJx)s?`+;st6#);uw#ESl0MW5MjDXlF>frSu#Nd56m*C~0^Uck}z>2o?3_~z}7{>+Sz4&;1bB8A(0pG4bdAu*bD3Ss| zcxT7gH$R^ZE`A>FZT{asp#HxA@$kAwwnw_%O|K$bLBc;PpVEcDjX&Oj{CGX^o(1jZ zZQV{mlGZ|(uNK3cJYSZC4Y+J8QjKnJ^NwLGx41=b=UmFO13ZK>D2re_3A43j4!LAr zMnB;@HWj0>Ha=Cm4hVMUk7IgX)xl;iQ7yJjW}5Xiso`<)yJGs>d!?p+;$@UBNG7A+ zF4utr%GN3M?P#z>#NE5GzS!Tu2 zQJ+qXX9)+xr-@YJF*vIi4=JT0`C_WKrdkC}9YY=fbNhA0e8mfX3Li0uSZOR$4?BNk z>S}4QKfdNjZ9iwk+Z$R2fxSeo$YdxT37Ie}vWC0?<|0ZdD0ZrFp4$D=Sf$n)TG<}T z-2&`vVXKi#TV?#47by0D3Ni>6yfroj~lhsoj$5b=pFBUT8fX zWV_a;FpnRbLW%Z|wU%5-XU^Xo4kx)Sbdn(zhYxm&XA_-WUDH)QOP?IPigO*+2p!0f zBU0$@YZD*HAeZhJDN_YpRs*nnx6s1ZQqs6Z3m2A}VxfA$e19J@m^sV7C~YoMW)+p* zQ-8+KC^6&)UzBHCNI*gBKfM`OH-l=}#FrE^y9@9zlDCG^ggo=5C$Mq-kdh zs#{MSA%~y-odw=t!G0j945`zj4-;}kC2K1b!dOnCw!g`2l z-Z7(EYaL-2I>{#DHOlv;apBBAa?OQ$Dqaj{sfIQDo&To5&ybArzBjc} zq218BdUi)kJxG~;{f+oN#J_k)oGp%@cTDz_qR!CpcaP4ATGo}|S%04y%g$zSPXui# zR&ubBh_;&SP?z1_c4vT1_4w}K@u>W#e)0l&TAb9LG#U>5TgWRbZty|P2r|B+1QSxc zi;ZqYB2gOO@DgtS+Ed|aC#sWftR}NDo?hx5p@zNn6fKANFIjNUS0s`0xAEqs2+fR8 zKOr=cGI+@b*dfd5Bk%6XH?zQ>QDug8W#rnvrsZv{HcQ}GWwCLpEzcHUqJ1-jzO+ko zI1M9A)34Os1z1&JJu0N!GTE$VF&l=3eXW>_gQfZR)WOhxUtc-E;Bt>p@?Et5G;q~Fy&reTndkoL zfl$^h0w<;1!httScDaS<6FSYzv(frU&0xJ}+un4{S05>x*B6SvhKpKhUEjy(SGc{k z47atd^~(lirTuV2w!?7=zG}d1c3f=S{3hSfF^I-F-u%5S-voRLm z!Bu9~IfFpaWT96vrB{#VkqU4c0}@&q?SZ5fXm=QNk}9{m$;K;oqB_fEw3Tg>at0S~ zrpBNr&YF?go`v*~sZBt&4jjZc!*+XbV}(DA9%hMXllY_)bv z{o>{Bfkm}c02;U~)M zs!cOMs3?a@AOf=DWtjury#*fk^oL3017axsdUm&CAFV2<0*)>NtnSiNxUljdT4@z`79;O^|T&$6e zb+)=JQcO1k%s_U5hI`lL@^`D$K{KwPlE{l*@3Niq{1qm{)u`~Z3tQAH@gwpDI0bgz z!lstmL-Zd+1&=>6WVT?qB}?&pGDjb#%Rs{$zEP%&XfmT|h&nhnH&-k;D#g*}p4722 z2-v^&Rq_Q}J30NXoLcaag7L)rFCuE2k#}K-R3I~~?sfnuf_r>VRAJG(`VEqIPTE_S zOlukSkWnQA31SAfJFkRg_|G6*%#su6Q_`*gY6=GEAn`v3;W5>i!%xMhCTuz}gw+Nm zVnV0YbZrAkoPFB!6wbJLV*b`-PG>@)c{M}kvZ~62avIjX+0kZsghvy;PAt!-P#D-r z_Ck3WtQURyW$kWd;N7dbG7D!`i39(VWYe8E7Qaq-;l!MAyZd8S3tiQw$*dct=x9p? zr3@*-rr~C15!U&{6j@W}iK`gYKpVL(DE@tb7m^1{%(bMOq&4#uZgoMKdhUIUeq$A9 zHIY7Jd;FrLW1CGBQ+!=8F_-Xl9b!oL{#()a1$B%;#hOzREC<^Iwy0x=GeP%+aCP-l zN7jjp<@U#84|AzViYdrM$XxXL4OQErS}&4z7G`%VvKHGeZQ!_@Z@!($E@W1yaR& znOggyLMzAO72&0$yq5*v+gX@~mP6YfK$y>$K^{d`Mu~KP#?oB~6 z;m}%90b?OWuEwXA_7wNHiVD@V^r=HVOIc&&nnd`^+k?B~*p^afMYPMkq4&FjcxexHgQ zMIQvMGCG9vp*PGP<-V@io9{9@xh5xEnV3yKn<2W}h8^rcFP49nP18My1YNL}ppmw+ zdpRYdNs~w)8)*np7Jkpo)yC|s8cr;Z*v2c1|7HXQF2_H>Nx<+^{H2hH>IL`liIve7wbgGztPJ}>7 zAXjW+{^(0C>P+(Y3J9(;XD)d(v~j5(5_V6D0fk0n4@86}fp}mN*-%*+VbQkKNbm3F zY}KmTcZ`>j3g!my>Yfkx6b9Vo)X)achZ~w+hEqlqLR-y}|f58^WWXSOU ztm?d^9@?38#CpSVKli4xKeFFY41*n1SoPlXO^`uu=-62oGE;lAuq6p*@Jg z>u$+qwt`jXfW^fO;W(Zg9?Vgt1ToUFG4{&D0)I4DetPjC4Q07du1B@)*}++JRomg` z<*CI>(^I1tUcd^m^pq1m7UT_aP(;bP*SMdLcT-c7?7BIlv8uSMcWspK?q>8{e>Wi# z!j8P2d7nB8&8TUOPSQk?HLji>CcovD%n%8>)CE+NdOqb9!t;=okjt*$&!H=x~_lMVUCKoGJFP!=4-dK>peM~AofHc zO+TMT?O2wT(40O+-BiI=lVEb4BoNLXbbybRH-fI1eIzu)!clnsNa~3m%m`%Zasfk@ zILrk{SZthlwLwtd+*q3HX#kizlswxWZrZ?Ne;M}}L7G6P8OKkT<#$cGhSw)U#Z zA;U#a?(0mbWY*Jh@O{e91v>Mx3rzZ3H+>z&Qq%3t4q9$(N4t5fh~%U;Z4i-ZWUvh1 zOZ~eN{FW}Rw`Lv!Ki`2FZ_}NL-I~!pRL3zKJImZjung2q1TUxn6s2*An4YnrWWfpY z^yyC^Y$63Xh@Jo_+WyDww0z~U2dG}EKe!g#e7jqz10xxJ__)9<>*o-G#eqDvo4LT_ zUUN9x0LCclq%zwO4n|HY>_ggp%Y!5Pc98@rMQZ>YtIXNfuV)p?y@@PU9mShCL{ z@r}!?Tv$*PZZ?sDCHSCc5j|&2=|I{^4A_;Z(M2GR-#Yu^BuHk!V2 zkXrV;OpZDB50fLbrn}+?@wmB`NYrIBmYX344yQ+HGc3yMpY}_%CAOXG7X{uqoO;Z| zbp|>#jhpz&CnSfkocD=eYs9mb;1O^$)A3G><(4bJkNyx&MYF7jg)wE6nz^}eey3&~HGflSH! z#!%Lv2-mZgYWAKiQ{=v%ZhdN9!2MPt5#k8{_@4rXte2 zP+%^->q4SE&hF^5y*x9<5R?J$^Jf}dsSDcO8A+@%5|l7L=?gShwACR1w5bV)UC>ep zP59#{x)_S%hXJb%bQd)jj>B*(X3<#`MhLwbD0=_?8l2Dsf#_{x7?Ux`m2NewTyFR5 z$&9O-4v#>lYmA;k!Xg)pdHEDM2I`YF(tK^tdmL;7KF^S;hlRDy>rz!rGRDHHa4h#c z+M5_|t@M+9v=p&NiNm7hxjt)X@;Osr9tq8n z2PeiRYRo@ldp0kb2KmxI?+5#-?bcQ{)&JsUzJdWqnliIr!_zj1k#gzr=~eS&`^$9K zq0(|HnWSmid%9J`OM#4?OBd>7iTnC4nQwC`?D8p}+rq|Tk26hJsrVt7?Xp7`mK}oL z(Z2>&h7O>hU&snpz$O}4*eC5w!Q{Xc^{~b$UMZ1osmIC5^A^D(n(xB-^fH1bFZzbe z*wzZd(01cLXHJw)Izq!g&XtT{5)VO8;*q_2UaH|8Z9Qtetl5lTp&QMjw?_A+;ye(G zZ_U?JBa7C}CGyQ(b5*0+UmwC1CDn!$70o|~1v>3kKq77wcn-jNLjqdv(Muqo0(iD; z2RkOg<{EZ3FXT332F3N-ql}c6%ZN#6K76fRDU@9;Wa6z2W)F}XwJGSBr4#agLt5G(pem%%i{op>p$MHsdtMevFnSpSr5`XF`x%aWvib+p$TD z4Lic6!6R@;&q`Z4N~R%JLp2Z$KsN_L4cH1uJ}P>Ei)M_X>(~`50B{r?4fP~<(Z`il z0Fy2!!nhkPg|ke9ky~JlvVX`vt-b%kx|@~{;6S-+i0!vkEp@F4Wmqh>D)W*h-z1h@ zc;>%FtyzXHJ}yAss4rw09RyUu?fI!dc7~J~)D6nS$egv8bs8fnt=~8!rDvqUw;o&4 zoS#ctErw#%ehsB$YC(n|%7)Kvwj=cvlR1Ry{Hf)}w!%f5YpiAlfsJ*9z!nBvEj^_d zkwfFL0a}T3Yb7<*@9&g4g_7!~Nhram=wMe7_DII8`4O7hJ>+uoCYqUH=X6vkg45dXc+%$nxX2Ij{@46GH zRK<%z2g6h;d|R8vu6%2MQJQ=<3vLS|SFNxR4oCBAgF%y}j^4)>VR838#-o$co&D@46+THB z46oSxza6<$Q<@oP8JBHg4h+^OsqR(7sxQdF=rSqJrBH`!4q3g$<(WZ#>-)`#rcaI7 z=3e|PG91q=PIdiWN6@9}&zi?D%UN?0<)@E~Q>3m0B`w1SMHFfkaEP=6yu>L5n3znp zrJ6Z;VUL9kQM<@>Fw|Si?NER9`MS8Xp8Le&4WO2WmTt2f*I_%|O5J7;4bGgee(UUR>xjbJO? z)K%^K>rv;`UoCR+)aRj`CQ!*W2Hn^Qz9)J%huv;=TD9hEY|Hao=6E!^rCs(lTceng z0Wx*jN|i=mibLdPXWt9SUE0(A>wP6 z8mi~X5^>t#MNH83)2K6w8k#iknl`!BYcBK|NTz=Gbt*~!{fGq2$W%(qqTukcg$9r$ zwqIxtT`4qnroP7b>I^kcSvO4XZzGZ4jEyA=WjFD|!)mwn3#alMCD=o_SAWbF3xB}u zWYXhkoMxrU<{nTEqs%Rj>NXe_PTVao0aRyWhAy4THk|8u2dfs~8vFggt6S|jCCw@T(11Z;%&D5u@U6*@b9EdEuHEzoX+=xVAl1WG z^l0U4r63?nr^Z|JU~ac+b;+DMDXyo(7_N($$YPS$>)}&j&~Ta#i01XWxAP~1Qwq4* zQCThNguS|rpuX@6d>GaVdY_l^aQo!(_er;X+#ZLI+>@n{qn@udsU3wW9u9{&LY#Jy z?4Kg(*RsCL7^|y&s$`U8qc@74HRJniSPhE$^ax-1s$x94SfQ!#Qx|jn4Ri)luAxIl z7h83&2Y66;9pBr0x}~5Ptfda^z2#K&c=$?c+{o4|3CFmrR9abYwVA(13M%-ho@qzVFc~}ToY&r@pvS{FSv)M$q3NrwX zxWb#99v63@r$NRqYxyDQ?mTbUG+wAQ#-xDxDDimO5u1&&u$GaV2(^&y2$;dy&f1<^ zKG&v6a9l58ZOUw`Z5kttI8Zw7g1eW+{%ZA2N5~5cW1r40pHxEIBJLC`C#Blxz0~N| z4Zu9CbT-pLbOxbw`(R=9M-;8B+!9J}0TPQ_^+({g*y44)O#|}< zVR?KVP2eZde+~DawwH~QKT~3u?W%&cmf)N%Yd=GQMpytDWIa~`sv58bz8bcz7(?Yu ze;zAWtM}N3*Rw`^OtB;n#qxU9^92Fw0gV|5@+?3dV-`*tW(n8j#f$dC_@5c#8WL7+ z_o5XK1nBd!6%c-z2rkw7c_j<1kkp_OAtAgqx1ld)!)-)V8>>_B4iJ0undEvWC}!x>!)RR2^@;(A*HuU$pz1~o%mDqX zY-MK0ynNS+FLFCwNYG6g#+vz~E@-+pD;ituw)=p+)I76~03F>V5i@T^me^~3K{uBu z>YKJ@Lu-w8YbyS>5y^>dV=&uAhYR|1s%MZHcM0>ffdw1*zX?1LbXz!?Mi3eIJE<{b zYM*qV<5u6N$&uP-R71|C2)y!Jj+3Xw(u=_EW+ljTr2kznkKOB4f7OM;Lg5;8^I=i2 z%>Da_vKkuqlXmSbM|baLBZ$RK%s8>@y&pvJr8dXu>wF`!EX?m+Q3{x_ip~UA7we(&V2v$UUXkn z+;Er7GLLF?nv?OA(S@ULVgwLdS!1QErK`UI6g)gER8aw-qPm!%qOu@kU?@9^Qr`I< zkuhE9frYhK!|e7_31Ro)jiRNakKGT;?W};}9U6h?8H3e1+}Ari*4F{7sj0dB8k$}9 zfx!c_XJP^$r2{gwu;_t9MweA*X9l*Hryok@{9|36MV$dwb#-k;`L+WKRrSN3h~Q!R zagEJGTYV?YgByX!)iX1Iadv#mf_J!@#KgFG@#RHELNShE3|L+2QHafg+tIr+0h0yd z>w%fp(eJrV0)WIZzvZr^$(sRGn4HA*qENJu#L(b@{f|K0*yc}*e^(pZI(i^B0PQ*; z#exHXFlXJrUb%xWCLPcZI~D*XG@{3?3n&rX^=wbY^=rdEd|$B(z*o zoS}=8v(X!Be|W4k{1cU4 z&p$t~j}B7@EF%RiD=T`KqTmy^A45~veIm4{H=tjpZ7D1*G%Ps3{3ItVBP6|>bS@3R z73*o6oc_hbKlSbi`Cswr0oZ_9R9stETv-5h+yGY=MxbBWe9P0YU#SVtt^fStv~Zl7 zoPOhyn0mC1NOzNP5nz9gph4L<*!;V>eyZPeg9aub=~!4D{-6g)Pg~3V2>BueO8<<| zKDyGmf|xaS&BdbhJ$ydyl5V4g{N3D8YyYPIwH)Ge|I6%5U)}oK^rd_J`Pxzg07v4& z0)T``3gwp^90=C;{jm4kYtQ31^;>?Z+q1wz(&D$<@3Z>pAop9o{*H?{_uYv9&x_uef*nz{@Y3bK}uQK`{d+{`Sp9ozjC5t z^Q+b+w>o}r40B|yo6>*sn_=PiyQA%1SKpra{JSi{8KASmKQ!_bydYJDHARKxJ2{Py zcv7Qx2zL@AV&c1aV%xrP8{Ejy3g}xGoc7yepwp$M_7i(!JQ+o$TZ1qL#rmt_k4H;+ z`nHPaYj`)Q@NJ8Iz#`Hz(%Tvvod^ZsUVD*506Tbg!>t!Ec-Ae^OVBJP@U$h6_;qUiw9_2_+x=#%*d~wOy z>$niNk+u7{-;y$db%(u6w8t3VX!buMw5l_`Ks`|qW?!^#2>|~F#MvV_BQOAI{$H0< zkNM0WAI&cK>)6G~`pjRb9w)u`(L>_gWn08A^K)T?$I_uxpDP`fi5Fer`kp^uhkefq z1VfO2=s#2YC+#_Ypn8Vve$c$mH;#2hpA;HDb?l z^azvQ|7sHc@I_wqrEE$d7@(D0&%54{j<;r5Nfo+#h{bRpAbnigQ=FSaHR%4!&D4pX zs5Ve`Hg`>`rgYq_mg81C?6nx!ts|y>*q+w%&RKM*6*XzgYbe%IF6ZWJ} zLY$rYOoC+85(dyD)?KY#$?R!R&@H_Kza`VQi?a897-oJpOPBg%(hk19i43s9P%b3d zYjGK%vf+C4+|eZrpm5P&ld2X-cT^~|GOe?5&lKjoZ}wOi->eY(JfX-ht%!>MNZ?e?I_Ib-fF=lPYOT z!B9l(a_--y>e$8SRYL|ff{fqf)4P32!U0Qn3$LwVbskYsX-_=j+81BazD}uy^_>`L zNv?!D%2a>YB)$PX?dK7w2`p2k)Ayeem4_5X&8UTee8i@@hB?i_Qm;yegwV`^YR8*5 zpT=`xa;=~3Wp@+HPOEobKj83JaxLW&a1jQqmP<>0bb+&P*L{-w$VL{xd}a#S=}kCo z9m3__R9MJ~-H1<|ogdglS|XMY4Bh?A=PiR=R0dm0n9^(UWCK|m#{>j% zKV;CV{g4Q)HBcjGOP4d`wrpBU$kxV9f+%44*_-ZobktmArI0>J82=SLYX5pC;TTZD zx;}SDYGWQpHoGW%i`Cf)!vIHhni^OIgs?jT-_m(2=}KID>Lr&cgMX?yH5sE8>ICU; zr7FJWlMumQ$iavHcm_>-Te(#g>vk8uR*~9{qS2A&&%-faRIGzuTP+Ux6ekDux3ojT zW=u&eZ&@Z@Rz&E!YIw=t{2sx0eL^`~LfPWp5&tz@k1(Cob|jyv`CwpV){YSPHW{C7 z%PH7N-AyATRb|HY&Pj~5f86;SIw8iAp>H1YTm6YnQ(z(llJZF@3E-2na8w}~i#OJ@ z8fTfwtnkreu7n!MA_o3t_(7tA=d@c?{kd?mO<)NEY1{0tfWQ_S2wQVV_JuPC3hBxN@^>XG{I;=fT$ zZpl&|&TJ&_oG(&E(iT?Z5k4#8k4dr$a-_y)jZI_JLXwB^CiMa4ty|i@J-E-nM^M=* zfr=dkv`Pn)&o)da90ThL#;PWgO)Zi@gCL{nDQWqO=k6kr0OZeeWYz5hB#cW|gVc)I zZ7C1rMDgBW-#^V?8y^lZgv(*yT(@SYl2Jf`h+?1-))y^GlE0 zaGwK8qx(2$9oA)~>Or(mB%c-*D5`_A8(eUGmS#^Z)U|g52dY!J=KPj#D}FJG`a0C< zMbvV{^>HV0zfiVBxYyu|u=T z`MN+5{&JrafzY|7GBbmAKkRRuZt(&o^8=qe=ioMi{?8_jJekfNPIVBAHk-tZ;GFi9 zw*MR%e-ZFfY2i_d$@k;~p3oEok}y$pGA>=FaJsOJE7c@xeSAt^o5Kd=3}uslctK~! zIlECWMTs&y^>eH)3>-Vt|6%MLf;7>hE}N>fZQHhuO53*0FKyelZQHhO+nLobqN6){ z@DF-;hIe@G*=uc<<}l6dP`Z1tkuusUKou3MH}|p8=B0hpm(fZhb)7N?@FS7hTcr}| z4?BvyUB!+;%kJ(Ogk(JAw$diW7NOgtqP(t?V2Iu1s=Uz~d7o*B(YYK}}4JDoqr6^{*CMB@>QhD~vj7KPoB%IMA7&Lc>5) zpOGN7l&qSoIIpP3Bhs~PtCUp}4ZJpPFC3qOQ`i?>zYH(oMxNldS9e4%TQBW6k%XYPg>qrDX+}brbDM_kFUCumq?fU8}7dZRK$=I%_0f>- zG5jF1^#K%kw?0!PXE#&Sp)BJEc4X;amM@R*cB=xoTOs|>lpqi26_N>HibxpOI(_DT4I!-zQ zTHvEx$W%hhY^C?ce%3)+US2+PRzWes{ixK-#gag&&fkk5reXam&fZCNmP1}#BwY;n zx3-&u;dAE{6dX$osb7`5r}ZKQ!A}t^C_)V1WV6Mq&m`Gs`USsr@+vPwa@z$Ts>iE! z4@a;KP^y~-*5Vg zCkFm`MsDxedq=v!W@=`Z0I~=ca&gU^b`2LIa9>KtG^kwt%%h9SdroF`n2T4rJ#_(Q zL#&bK3=4t)D?-$wB>TPZxO%E{v`Qw?njo7%EBs>kt=;cWRlPfAF+x5orSV^9{ zf~ChLMisD`5|0E4d~2k)kE$G2&Lj3ezLPbm_8`Fz?S<@JE2&qc+v38C6M<{J56}Y4 zG)0~2d>_D#;bS_Oc*Ip4$^dY1ZCi97K^07&@;J7I-Z^=zKdi8CI>X$~7%z8zwPOs! zy*S%@zlcJ%5Y~#PTMJ!hizk@RtKAkO-MsRrS1RH|L#X+xbbaRMsEt)C*>*_BDM5u# zJBrdS1P>i{91Jq{9gYV%MT>WJp`?F0U!1`9le`Rcxg9%jsLbJw_zqxSxCvL;zBDCz`P9%hiky<2zfSHQ>wXZtVsCeS*;c6#c5&<$$- zbuod>zAC}w>uY?l90{hbI%y!V10hWl^SaGGMDh*3U6%h95tpE$6-lMeyDroglQW!# z#v?2jswn`!XC`@&Pd%WM9ZEbjQ*Q1OZU+|f*ST(SG71WQmNndUh&0j0Gwkq)w@R#S zB)KH&^!6UXAr76zVf!^8e{d|k$@kc@uMEYRy2;i?gS$bfvB}#4lYuwYz1iq`Tmyf` zgOQq2dNcC%h_#+x3~oGzhxta0L#ws;o%R_lZ97#+noEjhKHGbQ$4%xFeHN z8#|ye<4yz*onIql&h2J^TXvy2`|+~6UPpV?w<@cZV`mUOppwbW`OkG$N1Mx7Kpc|D za+ek=DoKIk>%@#9^uFox75-7OJ{hD{6;i!vT@~X{-yXjPL6VG zi{Gb=Q}K?E=&a-uGi6~W_1@e-h%1_)ao0l@$}2T86nB~g(EIWM4j`FX-l{`oMB|%@ zsCm&w@7&@`ca=DfTV9K?cf1GB0xCYF8T5}uDA&d4(kUF-PApZFop1*o_BnUI`{Pkj zhdB2M4_U5^h23sccl$MiJ6}f$5RB?LOV4vL&aV$56n`tivh00#b;%y7yY~p}qNc zMVVroQJ;OO>I5`qWRHU7h*_d~NZ8JS3kk~oEc$kRP_qs1QhdzU# zta(|(=i+@!bM&=}KU<@y3mpraF=VbE&6q!|R2dp^sPOWEM^~nnuC(;VC20u_b9F!# zc`K&`xnP$TR~eCSD2B>%F&RVzO0LT4BGY#*K7w9CxnXgTlyS{pFq!M29*SkB*QgB1 z8KF;k1CSFgGS!;9Ga-<7VgqjDZgj%~a_BkSSSX(_#q}<}bcYl&9HV7I>}# zM{#+0CV6YIO3Ob3R=wWs$YT2&MW)+@4!PtqQvg_aS+`E!ks#@ux^8bQGH@3K3J1Y> z)`v4#m3k(RAJ(`!e}fQqsppPC8mH!j58VY!Bb1dbt#|c;Pq@z&nuwIG=fr_@&9B$D z^5NN=mm6hnK=-dO4PYB_fkrrp%S|7wczXbRtxT|Ph^&cS>W3d|YN;WigY44w451$> z#w0e(hlA_eqk%N{AZJ%S;KC8v*ZhV>%TTuZwZepjn=6Z}Yg~C?oNyOW8+2$8vOqEZ!HiJnM z5?io#ybn`nO<_Y<^Ojfv%~i?qWkUPiT}cCA9PTUkyP$N8&}> z_Pxb4?Jw)8%H+|>pTrZGahygJhF2k#01>q^-;eLIc+QoK#+hMRkdxm|vK6OO)9iZb z)t)j~>Yt~QWO!UAkXVePGbnR5q6YWpUXcijPS1)s&oQVyxg%)~wO3NVXG6EqArUqo z#gg5W)IL3Tn6S^mpfTWNikE5|i?T^n#(m<;kg$L_SDz5RNneS)^g}H`_A9gY3Pt`AiElgyn*zt(S48{(S+LezPzWW21 zx>M+9zgI}!F=O6d*~)Z<;~jYP2W;~3RUuvXB@uH}hn2WYgrA1J_W>Pxe3M!fUiza?a#f*21?aC54qB(R6Ir?QJ(Z$rQUU2{m1X&^pW|Tw#NJ zlCcLKs#a`xT{tCwb=9Jo7P5x2HLK>T7gHtyQrpXna15coPMBywY6Wdejnd^_5m&h_ z_2zZx|Ao!xCpkLBPOTzN0pjf4TQ;=eK2fxXfiziBPD{{)R8g`bvuJ0V#4U>ske*@v z4=yzSQLn{S*qMhvJA>=pdgE+@HVV&*`?g) zgyFX3c6XMwEc`uH7ZEZ?mx9j`J8n8)2hH^_GX`TSS`g)hQA3DQ9g;G=fjrLfYJyR* zB)A$r%d&9-f3$!a^nW5PEvy~MzMbhAJnYN`RfeX6XMy% z?<6}dOxrT`cPR^o8oba#;dlGhV1>ccBjgVDN%7_yw+cs%oElG+4HYg>id>E>9Zk1F z_ejT`ajwvg4F{@8I_$5f37O+_oTe4!x0wyY4h$=ZTv*uj$0s7I)^6?)*~Dsdv%qxu zV8=D8$hC-y%+~aG2QK>S+{vNk2WvCGYg_R!2)k_G>B zVgFcCPSo2ds$HD{nv|?Xh_AKuM!ebgTA;0Hko{xrK1Hp1)(&9zd15@$k&%*{x|7H=R{S}cp);z*ZUeOJj6^dDI?nL0Ubr{fw|`sIU@Da92f$CzjM zjPF@^UY{4kvRrNYR=lB{nXy!{BzPfmI}g(bMj z`2CKmN=$9G65|xqkZsSk;^6fbxS!wVr;JP;}C+Bc8qR zNn88!tZr+B(FYYw=|GjFyq&N6mu45?wU~U?w1=0_>hQI6dzA0ml>F? z%ms2$L7Ay_$Yu~{lO4ygJPA0(Q0ooz-FFxPk8%X+rOeGUXg(wq13kP{A?(p4K!2}Y``?5x+S`?SiXs71c$T;T=lx!Vbm*uTeNPmi58Z|kLu?SHK^3o-_?Odk>fKo-L z;OJT5dNMzJODHxq-#^Dc_ycEM`(^ugvj%Qov+3hR!E<*O=g-Vk8gIw;a0&4rhr=($ zFx);B? zyevyn&4`$37qU->PQuR&3@Cp2P;Fv1Lv&Ami9hC8sy410(`TjC=Fns|JOqhz%5bxA zxT2gC#AVsA*0iD-7o+@04$DYjAiT|Z$Q5!m2TVT^0a)MXw z6F)|M?TURZ%1h z)eemaYR7Ws_b*LmT!pbHb_g1TK_)D-r@cw8g{?7bQX^Cb1EcW&z zYsEJmK~Q?HxUF*gD1O|n2fU?n^j#-!ldDnfU#RxGi72;g3|1I z&C<69xECJI`x0vkz>AAsOCkP0)Qt56b92Zm&H6fvI!+nb^rEEELTkq^Gt?++c41^P z_~QH*9pSRWwn!MvZx7yRW|^~9ipBmBtwi~lgIH(qB0y9#&_;aRo8Lnw^i5Xa9IahN`Q1NNm zg}@$HSM@ic>fY3lbJ!A9C?`$?&o12Zv@J=5$l;rk=)w3{K1CGNf@;?yRa@Lu_RP2AH4$*; zKxV4FsH6E<)?9il6{_&0G}2I}AVvUGgwNv0}D!LN3=WM+d{4LU>laF!07Hsf)3B#am&*J|%2td9K>R+1+lKZ2xkR=}8 z(K?KEbr!(TaWc{Vd;BqUjZXh4`yK;vg;Bjgc7FesQQ&p8kbc1l{bymd3t$R{VAtY0zO{C`O!s5r_kD8AA{Y%PO3v#?0?bQRE=%j z^sLagOG4|`cO2HXB2Y?@k%kB3x2e`tUg3e^4+6*$Om+8sK+I@5)}pK>EP@GeOc$Ba zR$@cEjG6YbpDPX29{Csi*7Hc8U{%g*L4(NsWA?D04xEe}mth}Zd0y%4%JE&2Su-fA zta7^a7d@+xW8|&v#jS%RITM}IpE~4fzl>F0gM%jm5(;6PbAPyJLJZcnVGC#djOEoU z?~-cFL;l=4kZ4jo{Le|5C^vd&%L=-=qR-6RJyem?=!Z^U{p8J-J1)rTsa}*NwaqQ_ zTzH?Nr2d4%74x{t)om*sE*W#9rE5PPY#;y36f3!Ae@*F6x3eo9FZxM)wlu^|UXw3d zN4|2O>Jg@&c;Ka>^cmDu_lEvUeK!a3;YK%jka zuxm@o9oYF$6UoVS;} zi|-lJ@miF7R(}d3w09$NDzUg#Lgu;_jcvI}7305sZJ%|nz=RXkOHF<6UabTgB?=3wp*rcchmY8J0{*fD5_`WVK5rSm!+=I8*M za^aa`#i)31K6N^piwb&R(ogA^es##IVQy!9?e0gpCar3N_nX8a$f$y_zz`qLkAvEjvC-)kQ(kBcLjJP>q zK^*j&ia`KWx#xX5D1vTwWQOts-piBX8@d+Aaq|Xg1F_QMWwI0TC&^Po}Cft$jr_+nxl+iL7F|t86+udqF?> z^F$iZVOqH$fXkUS@38Oq1w2f_o`kbfJ%%5AGLxF@x(H`h2I*k@N^OLg%=4l}k=Q9H zo0uRqRCQ*5W3fq4z3eQPlRb(ni-b%hLx2)|Ait7^tdDi~`ZxZCd|jkG)S3fLNKJPl z2X%Q*^k{2W0m{@iORA^B(g1=!{+~~hu%q?BbF`jKGf~Sae-P{L>6cZwc9BTuHBHk; z+ooEQ@TA}s2!|VYq%_{An|$+`jEQkPeldFEsdiiWv24Lo@ai6y7@w$6Ism6JJM6*TUut;ty+0aYX^KD$|e#d zxRulHM`l_aeJ!y*mQ~c6w}IR+GT7w0UD;J<*>~Ym_6O46`s;mp0b$r1tBTQ%u=-#A zm||MK=zWA;N+-zIp|MuJW68PMA7x{qg{1cK$@5I~SjMJtjkPQco3BD)2tzUlg&2!g ziV*&k%O=K7N?t2hg}onl=q9l^es_q%o@EA3BVHEK&-7H7!>(dPp2Kk)PV&NI+mLDq z(l7Bit_4X9g|%ce^{FerLUbP`GII>g;Bg;4pt(zzN-9CehlblOOW8+=6C82KsV(;?65Mc-{?zEPNm!F!mEOxs$|$eq zkzBj8>?Rd8_Hv`?Yf0q3?%n8P=tN8`%dc*p>W=hrh%R8+G1QVU|E9gi1RoP&U3(u- zk6frrLlIb)&gJjbsXr8xS;}M^cg-n%;7!k)`At*V0sboj8JA77KbHi2d0vrlH#jM? zzpQe{9TfFyZr5G3+C~;I6kd*ybZ#?7+$`J#4n6ww@jcgVj&+#k>;-e-O}@epjtyOg zwapfVh@|U2V$5D<=0!Nl$K7_g5<^KU$&ZF21sU@v4x`49Uxxl&k6@Ey0fKvgv_Hf< za1|eK4**pWjBS6xHNh(hSYNfIbVMH)ucfq0_gw?-PCibET?*n zLllT_!RCB2I;)?|9aOtHhkQdPw4vcOF$DJZ;_R=x|CwX+|cT zsyXFE`ZyJKf0K-|rr4+5@HKm_T-sN11Fb`#sa6OetzO`{)WGt{Ugq`sBxOjC$6vS{ zvxkR~I-zNkw*N2VF6k5UL*hVLtW=|e1ZKx;QaTiSAhnG42|*xGOwB6QhCyJMltp7r&I+X}aN%evVsT4R`CS!Bw7a6r{-btgnM zU7F(TX8)37nT@3jg3PGYSSgGzz$=%!xJjRTOd4*Bj%7Ns=|7CVE|RowGIleXXQjR~ z8plxQ+EEJ_*=ld@Ob5SGSI)fPp)VCb)*b)tLYDyAcqenm`dqWdvQWVx#l91i|4chH z=2y#sxF8ikXz01b)y?U+Y((GT3k$ohZTuQWXiRONb=oG@klj ztR)x6fo+r733)`~IRTgDzYOb}?4OGZg!U2@{f;u>wlnEGja|7CbOYf8q<0eD>KJ_G zk^Vxj*Y=vYHs2%|UZ_y|TtP~KzH(G~xizL~DLb2_!AcBBRLk3i*y-8wqKv!Gbc~T{ z(y(L@Bsp|C)wWMpc z-yX5oQYmZ@Z7Bll%uqMo7Atw9el!`MP@KH--}QB8qV%kpVu|dlR+A&_WIP*|=n-GJ ztw%M=7Vqo8D@Gau@D}{Z1yff~nz~z{MQ5o=)Ge9!lm}C62EcuYpCfx-f7XAgN9IGF zcR%eAGB|L*s`bb!TH31-bB>Tk7CPBz@HPXD%n_Qpdv}oG8)*YkRPVmY9BQB7LVnJ0 z%wIES=U(^vY%K|Zwa&jB_lFB-LPzr3!g<6<+J^l0clBI;o-;A2Dve}LvB5*6=2N!w zYn-{WY{=%2xu-c1qL(ls$Oz_14wW6P}=b+c7_SYAv&167l50G{svaaD% zkmkF=6(17HLWaWKcT4?Y{FiPzGZ!J?v~!_oBcS=2jMm$9qCu zph4y&t{4W&>im@fYhR=4Q}(LS%qVI<5I6eFV$bA3_)2N{Bg!>PxZd!&3_u2Tgg7U} zX=^t|CpH?SfZU1;ykDa306pWyc{D$*sbg_cTCcUXT4~#O_1gm86>{Oi%JN*JuV5y* zEF`yGGQ_oxW)KZgdb={Xm9L@m*b&sm!t2IkzieVLKb%%~mb^&gS1x8v??y`I3%K4M z`-1Hp%^ED%G`7J1UC3J1H>>yIy5}1jIfGFG9Dq}iN38~kl`9TDC%6W_``kJ@#xZBg zfBNQEEx|I#r*S!E)qG+FOfA^>eI8rF<+u=-v$n2S8;j1e>zcm*wNpmhb6*@Z?IaYHSl5o6J6M z%aj{TRCTTAyr~^K#Oi(tGz!y4OjE}xdq9pX2-@ytKB(K` zP!01S$l3X66G6y*C9enz-^#Q-1uU_>mZ1e)ZlPoFyq@4Kpn=y6v$-_e)EKf26M z3Va=cyNJc8_$%y7i)R?M1J_bKvCFe?wsh)x zi~lOnA6KQf% z>#H+TPBgAtMT<5W9eU)P9MlILIP{e4>SZ;wf=pWVPbnrd`ZNc96NDjN)%?x&8O4U*f8g4j5PaO zI@Rau6(fSa+l|&|rw3w4k0zKK6;i2VeNu<1I=8@Yk?BToj|-Q+j?v2EQ$&lNKyxib z&oPBQUkwXNQIA?!@@#k>a%pXj+{d1iAFS@6G+^PJWzm7oZ+#m>TjC}~eB3NEGs6&V zHA4q3K=zh8{oh2Adfa=`-Lebdu&Ryy=_H~cD7Jm){JOz)B%gq^b3RzIsf6=BjN|-V zb@fd`Af5EEMjaC{==tq-y*{~8=D9Vt8hZ<_SQ{I(jC&?g+XHPy#>>5TjB-#pFO{`H+l` z`+SD_PkK-_`I}Fk@6P~8!PgL<+)2Tggm!I76V$(Qavxi@_3H5H&oQc9Vf(6NA?@IS z@g%U2N|N*~U26+H9Ih5pzIDt5^%>YA&hUxCQZ$Xx&OH5;aBY3v_rNf7-NF8Yhm6;t zE9R;+fhH_=X?>2>B6RH8&7?wK5{G;_chD@zKm^q01^2pRno4tMapCnEnmr81c*X1ye$Ig zMW?^}4^W%-d7Vj~I!J6@>0&tJ50n12*LHOz{3hQbvSOLZtr0 z1!e8ADIJQ3<4-|h*Kr+497L7^779{TH}Ti(h%F7ojYI^lmhZgZ!=#*DLJ`wKrhotO z)|N^`Li-ux<$nJIuC5r>`yU`c&i@GlWMyLgKgwKYLUvZJ|2zG^3?K(9`~OA&|9=F! zDt}axt=md@#Dtv?FR(kix_C_dfyE6%F$D#|F61mxEfI^!#7c0AMX)c#1BiloEsqu+@5`;W4Xe$pIjTZ8kl0D&d!X1qC!wwSXMv*`wIf&6UGz7 zWo#gVxC8$?88v1H_x2DrPiCYIgk(J%76is2jnlWku5KZ3kh}) z8esGfWRQ0lIFisloKG+cA|E~|knbTK&A_e~A5nsW^D*782W0(v9oWanh*+m@3D~LD z03jR?5_%qFAg8}}9OXuk9tboY4-EG0M*@mnih^@nHal%?Y%C1o_;LdD$syV74CGyK zUk(URPq99PV}tO{#wdt$4E@W3g@Dh}KM!^IF=h|s?EmG@+YeMc^v4Jy)Qgy>+$zt=DAi{?w62=dvTd3+ZB^b$PqQ#d~s2qGK? zGry>M0@M%s48%YGwa=drLmrcv;218j-QOm`e=jEpXwu0G2+^s(Z}h48$-jMo&y$yk z{=a+Vk1Dw5l(d5PpY$pkOz5}aua!LFVNjc}Za4j1fh^b1L7)6zKP-5}@}8kOqU)Y* zkC=Q!cZT}RLw&?zm^=GC5=?kRkjO~La1dYvccAx*9F)7d$IxE8{XL;xeY;~Y;9omN z4u4Q5NC%){;OOt6r#CRqAYcas1_%FtehA-7gGWc8>mt|tK-%>rV3BX`uEjXl_haJp zd!Ub~2Ed|DaR@-)FJEt2Xo-5SjO9^xd-r=^Co3!qit$T_-z*P(#*dHnWk7zwNI)EY zh=@|^LQMXUk7WCKsxCtDeVstRIhEk9{=o14ew|`^OMTq0zfnLoei1=<_j5*@jHK2B zK&^dJc2KAwn?wXY|LiOO$$ji${#H%?6MOt;Be^j(a^jwT#iXVKFCipa3`FS>F-NRnt=2rt3p^c3Y782a}?gg1pqe&Dqeu{~#r zVDkF`=O-}}1`K*N#8cQ8pdGLIpFVdu{hX9#Q@=GnjPF$I@b-4tW)w)D z#q7_Zg<7$rVcy1~$WN4@hLdxAN)|DocWT&v-I+G`)aH6eHIF(Nd5teg@|%yh;cGH1 zdp~_EOv_);xy~$<_B_n%awIw-=c#&kuC zElv1VlD^%;GOrcHniqKI+JrZS)^VN%w|L!--;}s=m81(2Rg~enrrq)KE=k&lJ!!6U zdukzn-R63`d@}gp6srK2&o?e}kqJXRSFR+g7_+_!rP7a2)!pv_CL0IEmv>UBOK3>* zC13I%;`|eWVT_n#qji7CBsp5B{ThVG}WmUG*lg4vst-!_;6Xgh(WshnqJ_?jC*~Yc23qst#*#3+EknZ z_L;&@zIW}iZ3+D*rV8X8XeXy(qSKOEgpu6R_VaDbnF%C| zSE|m-d8-<^l*%XWBCJkA2iJ5(OP+*fDpQ*)-Sm1rSdntp(qDb}qsrVvq7Yn_G`oN0 zIAwFGz}m^E&+V&0PM|v#*rixMe`#rVU#TwA=~2<7I<5OWe>hqW-gg{8;?F>QT)(e# z895S1GDt(vFBh?>0$ibzG6Ow4)a2+x&ydeJWrls>Gj6XS^(!NcM5uzUvOg%T$oN;O)RGd~@~Y2(kBFT3&hl8e3dlU@sC zI0B68s~JjJ_RZdvjzmY9eT#!9BZhWr@Ju2*!)Fyrq-7U`KiOwcpxMbF`gyY2=@X8> zj)6dVXjsG$QgEncxi;wjx^z+AB5Bz|3F|B|5b7}H)XLe)t`QTF&!RLzz1mn3q%~Tn z-Tx32h{5S+rf%RJ>35IejU|gWA0RlJh*z~Sb>{hYkr>JQV%t9$zTiLh5<`GuO>(VFMULbDo66 zhO@s`31Is3eZLW}-F03s9=Qgbq7HGWQx4CjeiA4U)I_k0z<@?po+;Kw?!GQzIhOmQ zreJ@V@%b4d_jupCdsTb*xnoB-saYh3&=lAqy8Q5;8b~=<9#IW*4M$3S`rG|lZ#}km z;1RqhxS~mu^7aDr@GBW2C4(DHp!8+f!^SBoT^+(yqcBK=Sv{q+SHruiwJ_>@Ju{1o zK@o2G5kdMQ18#(6E*G=i(Gms2weI-+9bbT^3z5Wg`el-e*MK_i;+sx6Zz2Hl@Y}6v z_UqUz*tNuT!TGaCLPFAdV;b-6W}-xP5#n;*9CVsZWzJ&U&#jj_{1DMF7RMFEIrjOX zxFMc}wP&%EI#I*q!kHdqH==RLRwZo~3Nv4f3LWa8GG)$f{_b_ywoXEW<4pO~CFJ?F z`Wbp@zkUL`G68eosf6+9Dm;e7KoK_vE4q>BM-iR+V1m<(()>!WB+O&ln(^iPsb8Ft zfD6w^X|^@S!r?@?;vz><9kLeZ2TChrVK9m?=|9nln}F5q&J$JY-^OQ2Wo_b{*wk`2 zYtfCc{OtVTEbtVGtIbZ<$#|vXRQmaYQ&OO9j+LbO-&#CnXex zLv>5LC`S;dkt2--9Sgg&{VuEn^wY*m=j0Mc9-Fh6M6(*zkOp(iPWdRQ z;2`^RTe;GA8)k*m^0rslI)>CeL)Oc;v){qCoR^rQx>!_*@O4GhdaYo<^AbFSHTknh zO6dbiT2|bdj_zm^%^t9_YD&{~&X;u%@l7->?{(<8CA!q{@w)?Y8Xbu~_Kuf!;X3Mk zNkKfwhq6L=5lS#*IbzrbhY#-p3WRtnbOz)`oce}u-!UG?nQL&}s%pBB_LPYJMnZG$ zPOhgaM5)4rT>UM|R;YpWlzqic8xPY-NKx*SpPsv)x+jcaDYM7}C%}p%E|sNND+=1= zd#yt5GJ+$u<1;G-SEL1-VzQ&N(*zG5)G?J~+~rO{G0Czfi2N6Xduz(>g|Po(z_a#N zLjOXwAPpP;|VTQk5vU{IaT z#Td8r81l1gk(KB2Eclh5f$Ik7zHyMmZ(E838@eIY$@W>e&}Jx6IC!xhk2ul(PP$Br z>{-(}Fn=LGW8z{mi$&Y8r0%XOh7HtM5;VU$D|L9WWI5~ia?eV!t+Vz)_}U(B_E=gR zS(vqh^?k$P3O16ROzXRkgI*!*rt=_9!lilQx#2;*jk;{N7%UghaAz7ky4|kCWf?co zhPvRY?W;asz*o{DSl+VLN^grl1-))BOoS1?`AOO-oU;6g@^mR1&WeBPCV=8X5g?M^ z9h#sYTxOp;;(wrQ6!=iUfk`>zTE}dW6T|7tY#g%!t*mQmJG+~f?TLto%}aU4Y_ye4 zi%E%?Z%zNTtXoKDIn-}N{i_k)Ym1q?R8Yd7fYT+wvLlgdcO6_7p@&KWL~y~BBiK@* z(n2E{5nJe)_k>iV8WCDr-)hLx8DPh7y{N^^#4~CLH}8XtD=IXVDdQAC(;*mW&Pe8W z%^z$Yi>Q-d^!T?v^OW&%8(y~u=Pa8HDz=mX7Pi!i<4lU+dO#MQ67vxDkjjUp$=v8G zdRhx)3ifG{29QeK=M6bZz-Pxlsv!Eeu8Ar!03l4CWcsBdv5t?qaq>-#vpwR!mZ!NN zZl{{VRD|7MAomDUN$#-7Q$17~%1vLJYWVl^1(3>gT5?9Oe;+sCSBaE6H$ZXDE5f)0 zoj<;O>MMWDGe}bf7&h1YSq3J}VJ78&!qZueTc_5)4U}Zg3)PjsO%vulh)&6?B2d4a zo&mChj#X}Z1rUm?*56l1TjV`N-%WwBQWaIh&%a19mbHIc{z8EpS20^di9^UI%D8xE zKs6?K7>x$JARM~lK&AF;x&(nmVCouM)sy8uk zuxF4XaSZcj;^J-5zynBSV`(x@&#(0FWH$_qJ;GN<9JWk1b{l_Y+cV?!&EjKKA240S z8lWe`<7qq;jH_c72E(&TlcLo6k+pwi-KPtNZ=+>r<~4HIyOFBb0cs81%*LN=+u5(D zkL+%jjZN$SUeAOK5rIK-2S^FZ z=I>PC`uLx5)xM~+(T1My8#LaVA6bRnwU&0X1F1tcP1OiOBFfaC@Xk48ll%NxXYYaB zJn%~`d61?eYW+eoCy1$aTF^9GZm$P|SUX;-uMOHy=KBY#w7H6T7T4N(e;-MwqG$R! zDr&GSf#0eyDkp6`n?1w%U$|$CLRD#-X3$+(aUbn^_|AIdc!LO+9T!-1<I6a?z%cpD1eF&yI>=yh_dg(ex&mUcg+OLEb&I)?6TSj z1SZSC7fo1MO&HG6%9?&HxU8f6&l_r;0C(8oq8=cxOLJDI3<~y~gWc$pk0=TfIC0mn zZ(15Qgr$P63@G1Er?FO?OXH~}2wLhNP3XD@H`ocLB%h%?x=BR+b3mVb=vNSANqZZK z%KlczW?03C5f_0n@pSF7$iIPtu{_D<%3vt&?TNtwblNl&t0tr{S6mshPp8pg<%!E= z=?`9cg}&2z%{3g&R?)8cGY}II7ZL12A{rma)Q0K4XvSU1{HUrOZM$k3&bs zA8WSiGfVketErbHl*7^xW|0Og?w`n)I+0~Zj!mWEIyIrUhXZ+p2*W1~H^k^5So9stEyPoF&H@g`l(J>Fa32q0UOCM4PJDu!t z6W8@2*5Wi*wC>>sXzN*kG%w4PoJM$_ZILhOckT~GO85FID)~8Fwk@yTT~9(I7XHhv z$&sb3XSLYj&@0WeYX;cHwS?5NY@T?5fOKC%lO+F4%wVG1ziiR!o9&KHQ$M4YNe;?48?(C2EXK}oS?ys!kiTFKSs+&P|4XM++Vww=I zJaKt`33b)SfZxJELH6Chl}Qfy%J&9m@vgCbT);sNhP1Ak+nC-+gqd>7|BJD63eF__ z({^mzwmES!v7L!+V`AG*Cbn(cwryu(^L=-|gRge0_J6P^UDXF&)zwwqzv}0{p8LX? z)-0{qD-~4(73?70NM}wiHVuST{t5NN@By)*w!EtAJVip=jeNI>M(9k!!a4Zi#4Vl) zsrJ~X<&m*%am!`nPfI%$BZ3IWa=dX|R-4yL8r=(do+Jg!4 z-j{jE>JjV(c3%8rS=^Wb4(6TSC#=}>yFal%Srv(26EsS9#wOr#y7*8}d!K39(ylue zr(7;k@NIl}#!Y*l)C+S3mwpeE%U!?oOtTwQ;(rn4a0npAMu%P{t?ecufBM!6PjZGZ zw0Sa8GM1UXG9A*S%N`Ot4MFboWwK35aE1BPZ}?I+D`1$Dz&^xva=~{)(CCH4J`7 zRF`B@T6v^!X7pO!-#f@3{-m6?9yMKlQR7cdJ;HXeeWT4V#S?0kZQK~Mz+Ax1X5lCa zJucPw*Gu9@lT?HNh$XTEKlR)xau`?;)zXfiUS8xnMOi}(^h0g`X?kMEEb) zIPvF0{qo=N)`oip9SKSO%_gqnCiKk#aTWP)XZfAXso%Od`+=Cm@w)sE|AtF>C~ONa z1R<4pJnB>~jOTGC`Ks$}WeC zvXBvI6zgD!D}8f!)c$6ByGv5_Cj)EzH9gdoJ8#ol0$*r4%GwjX8w<@M4)MLU1~#ma zAoEyIg$jENeC|ktiYHPCRSIRQ;hMzDM+si6e=FxnaX7mP?GQovF#u4uP=vtwm-v6W zHhbzmn3g*6tvXE6?lO>8O!Xk@QuG~J8#H+*>G%&82P|Pu?LeE!kum}+VWTd2#9Mr! zP!;H0ztKF*VZXH82cC>6$EeQFnu-k_i1e0SjlX@OQY5?>?d|ko`%6|{`NQhAv$5j$ zcwIIc<^IVpcwkDqF0AmqaZxpjySvQ^PY>nSjMAe7<7=xR9TDe=Ft-|ODi4j0 z=-O#oVfoL=eu}BnQR}qyo>35EuF2LTx|m{2t~FZM?(hwsH&qar6*_RHaXS-cZXSNG z){pn*Ko$I^(@FyG9;#$XWF56qna0{F^lh@>VSap2zN@V(1Fygjs%4&aTp-IZkiaFa z*EJS-_&v(1i?F(ThI^O zfY$l}HencPXlMi$1L=rk{?i_Fsl`Lp&@+?0rB@6O(V~2w7X=CN_~3WPh?A7?^S&P~ z82d1y0%DLuPK3;4=|$daAKm!Q0Jg8x?Q@_XOUYMvrY2H+zvgX~Zn|g(%00iC+KR2C zN6K)%kF(UK=}(bKa009Ys~*ctgk>Lv?mS+Bwzo63 zor}scCsqr7kzM3dxkqJs=DACd$IP@F^`n5=eyG}q)1;#UbOiP$d)&xKMXZPwz-p^ zpbAY(mNu~hyN{oIb!@;6hw95POK^sStuTl&kE2;~jT|PH;?z^rvN*C+3fb6f=%H5A z#|ltOy25A``u|2Pu7DGt`}Ew76=yMU0+lEB>NtSWkQSvFJ%7HjR}#G(x7Pkh;$Fnk zkzt6u_JR%5nr%SYJT|>o>@FqqkL`M+cFRTCJ?;j>2k()hY4$G)?*ZAYjRS=rgxwt9 zz$+_DEgu;N%F}jdVsE{5o=Wgw#61Wu&&5s@&1@+d1!XV|VYLJC=R5=`KP~Luef`J9 zo`q(qtMriry5Wb3Q~$F1G~`p^%V?#hf!WgRGC7~|ARaE0LygwNw1rj1Kx;75WdPI! z`g)*atYgWdjdX9QFo}-}Rczh72AXt~wd|FwOm6n`Jm<_$ddo8G6|FUf)`d4 zIp~S@MGcur2z8}FLJ&IS#c=ih-QNRmQ{?gKI8qHVC6#EA=X34xmdwH{=-TOmB#>#rP zl_M(|J6CP>FS)-S>$3S-=9=5#XUp+tzVM8+hlz~+yv}Dm;aN_VxEg<~9EivUm1X;k zpzIF4dXbHUJz*I9E-v}BSF%FiM2eS`zv+gnq*T_MA!Yf#X-X|KY+~KO?NymYRD0tt z$e}#K12Xrqu6frAN-w-2B}F>t9Ec)15j0aT0f2dQCoJxNXS1vX=c?{Jof zg@^6`pZ(8pmX(E-gY*Ad(Axa3p!EWaF$T*06)MQ)2#Wv=!o96DaJ1weByb;vq`j-F z3mP7e!XpR*wsznoF{6Xs{RXJfqoL>eQEg{&`(5+Apj>5LFRjU)8Ei&Km~Z>jO@TDv zPf`-UP(X5WR!(v%h&`hFa3974Ign%#vK>u?R(iY0MRXR&J@8}N!Aqbqk z8wd#($T&5`G4|mxgrn1MH~{thf;bF`-6>K72u%Yx1_5DzZMlm|oPs_R3cbzw@ShV1)`+eC0J8CEr2GSzpnw8>Al(3sF=8k$tdpaM zhev(ZMpq+Wr)DHu0~kMvl1%{bI_A|OQY*+85l+6XIWoYR%}tFrppo`aYaX>E*b(T&gRy+A~U`oGzQUiy8VV40wj2g6cutRfTpT1}LMiUAJ zL3QrLG}N)t+41`ll2b~kM-ZbLsZzpo-kmO=12K(_?NSZHg-_12FJRlEDYtSU z`Yb6{=A{fX#q(-=iSo*}dk&LlhCm%&u2vz5qC}}-3M7V3oWcz`Dm`>10E%!`C#+Ku z{+{URjk56zZh&x7Pk@sWH!9>fXcHR$a$fz>XohhY-Z<F?4^+^JXrXAWoryC*ga2y6XS@x0SmrdQV(XIt{*KOIsM|$6A@*fkn zbn__Y$Q>Et`3=cC}e;I~}BD%3lDtPXVkyg1$@e@Yvc28Zj&mlWsa zswVviitPa?(%vNNcL7t2c#v?0!7+8!n*-+(S19U)`sYV{CYG2nV(;|uLDFk0JLQl| z;caQLgz$igtr421j10UTBp9=t;C|b07`RF@^GYt&f{h&Q)3ruDO&mz$LN)$s^+`*_ z1c9e4In;M8zoN-)i{6%w!Mg7Eh(z=oi_KBX&xK!K)a1Xlt8;ai<`zfmneuj27Kqk1 zLX(1Q2R?2!k|(SYU|oD6N0lv;OJWZYQrdOyX0D1;Uv*GNKz6Cdm?WPdL`Pm>L4;Wdznc|(%pzy}s1L{8~ z5~Pn^2)PdJa9=Yxf>7qdUi4QGb%S~^G|zscBbbKZFw`2e$)R>X_MU5W!j@z zKK)@qArxp|qf%;MHX@K10c07DZDoVvmrt0w%O2{+qS!r^(FxKkNln-4v;~=>9=Nj^ z@Ve7Zj&HQgpsP#TP01aNQsVt&utnPK=A(~8;y#vwBOjyu8G$&c=;Qoa&pdz2+1U28 ziK9H_Gh#4F@J~C1+6L}%o<#sNlyiLY{Yz6%{dgtX*kX3d##pckg5+O>Wi?X5*M_h; zdJaWQS53Jev>i*Hw9e%D=|Kd}q&0N^O1Wu7tF7!mOTxX5QC47|~Z^rc>z3 zhvtlXDfXC+r<3YfV+W$aKZ06vi)$X5yuEw2%XM7$a&{^cHrXA1*X4wL3eXwYcRywZ zv2o!pUorM1&lbMe254-iSRz zo?t&_h*1dP3rz^rqr5COV2*@Sv>8}iD0CT0q@G@~=#Xn=CDuXRX9lih*+HOsW$aA9fXktnZ0on6-YSyUnvwR4ASX1emvqbX2_iM&$d2GH^yhH4ip(rwi0}ip zJ2i2$0N3wPmzww8RIO>vp|4-?x&%hM5(kO|je{?eI_gw`{JNDH1&LNqIZ(*x73N}S zCpZNcb^?8lyzn3h!N-)Vly2jT>QF@W0D--G&y|+_bg!8h&Cvl3cMC3#uQs%q$C_O` z(aEhv&bMv|)6q9d_q3yjnn1@o=S8>F{=CRUAnS6teg`0a z6H$mpE{Ps44XHfaemiNb3h?YN;%mkFKuN}{4H_uD!zX>^DHSqX+FvRM^vl=c(;m-= z%yAu(NMP*aJutTh=}U#rVlg$Y9I3=V^p0g>C+;OF@Roy+u~C1YR}f9qzD1VIF;GZg zuN;bvIBW=URaF1sU$(jpcXUVAz`-lLgWeP7`eTKvo$`}4KeT;-OOhi=!e4A^;*6iMrB=XlgImS}Kzed8fNMW1+}vMA+I zG@S5m?%UYp&G@KWqdYSK9Pxg^)z5bvmBq4GIn>cc2e93Dx_SeD)H0ld`%!H@FgMDt zgi}9Q3)w-ueoqy#`K(0M=pY=d4WGA~oV-GFOj*)p4!G_^94H z0YA+ZQS~6BrpnT|0%lQs=F@$mABL9FbX$DvPz=AP*FR$Op%b@Pe$?%k9nq=;leo@5 z2jTQu%&R?w$(e|dyOjuYU6sYQS5ILYNK2%TAJ)KgNv<`RSqW40l?rbYi_c1z&6Z zwsaqxl#D8!pHqo#aSMp%WQPIkVFb50bCNN60QH)7itW-*FRCH=9tV3h6Y#@iUJJTO z2$=eA2iBtQAth*q!7#xJ3aPFAfcZXpNEm@v{h^UVj7Ti+j*3u5jtfQXE{V)n!DWiy zt5Bl73MbV%t;GcOT8F{THn6Nwwpi|~S;U@)Mor{s9?7n5cbfdxcp>p?^|mVvrI_w1 z6BTsf^gD^5DX0!Nw&G*4TH1{qL z0q2JW5AmCjuCLqRG{z@c)X4ZBat52#t)o_SqHtZeTDSfHhI=a?7Bf{?9wO&EIueyj z(baO3aGH4Tyk%%$TcfKxD_Fge?172EG&M@%b-x4H4i6M-0HPl=ee_I zJGCv++^4$NdbQpBV;PQ*+IU3SnAAbk3upWR)ACt49d_=$bITpl#QOkl@W-3iL z))|;iXB5_#D;@^Yo_MutR0U4EVThwUFPT?izjmym<9Ekn^~gPDbB0V-tVo8>)+UB~ zFHE}}yuIL%-N{pI9d@YgN3|f-=RNr|_-DjAG~EF7P3ZS22~g1ksJOrPo{%dKtfw!h zna?bQF<*ORqj9)>9}3{lZ5zHXZjt7Gm5o}W6mayAJ#Iw8)#yj^1z(NI(3W$RPOV@! z9kT9ek(@$47tdZNrnc%UjZ}g=YwT!O>&_Y`gYg6{8KqiIY8pQ+Cz)51@`8nx z@t-a1mjq7mxGyt&6SgU;pRn``_LVU-Sn~MrygDX*-L)t{QI7YqZC??!6UQ|}{A~hutGNH? z>aWn=rbU(%o#(KqN937MLd!vK6MAT~p>j4FoeCd6IjO^>#XR z!sJm7Eq{rrlR@zC$je1jXfw1rsgF2~tVj%VcXI zNfEk~{>VxvDfF&wxg^Rou_}F$e&I27|ERUm=JrJ{E75X9z{ngdd^HH!V-TlJHa|XN z&rMd9a~|gYbuIHdH&r=($1);iwA$fKMU(3`dVKKy9jX_*GICQ>zx)UTNVak%pt8+F zK%+ls+n@C;>^4%27eL<{8EAC1!^9X*ZGBj{C2&drV@myQd8v6@L=e&MA`K?!)HG=G zA&rC1JW(&~VxvGfOp%0vA;Ty*%>dKRsA(!MF=BkwgDG730{h^0A-&B?iey|&+#2S4 z#)>3{q1Be8$%9w<)y*((UpPZ-Aj}PBzFXA8-J>GlRLNnH9L*I8cgK%!ckVTe4THdE zR3gvC@2$t#3UVxtxTEbUJ{8uXiuo29X>;!?bZ8GBRsgQ_;R{%4kCc=?c51&!1c9@xcN)W7~{O1lPb+>t0WM%C<*&H9pA*C@?d>QCc|?q1_sntHJZ*a=K_SYRRY7_H+7v*vw~x z)!^Ed#A}DAw9BH%JZ6N?N?Pwh-)vjw%cZnqvQfuW zWmJiokb#Xcl~q$_HKGuE@#3!T5vR5fR%BO>4;rmSeTv#W}80mX9in-SdK$$9Mo#3o=fMS!PZbt+H?hfRFEbt`?VnK5TIsozof74WVRISf@Z zky0&vObwYOWy|q#VtS;_j|iQ(UG9;2TRD zo@4t#-a%sRDpUR(+9F&|4-(2xnEEInoD>rZ+KuWHC6O3)AM;UWDeMFg0R?U@CQC98 zrhK7slYaQC&iJmO1&>m7-JPxt5y{5Ky<^_1HQ0;A{IPPhHXe{j&#uJ^vKloO?b` zuWi$sUha#+;>;qlCUd))E!S-6xCG2 zq)BJ!R9)ARY2_{p6Tk!f-6*nt-EdBzoJoVL8zDHlQ=Z{sJ9#f+cVye#{t712`N*)A z7MitLUVO7*DolJ$zopNl+B%h3D#fPnLP&e*5bpd~rHj)op0of#boqJ`FV^$qzEZv7 z((Ua6%^@@bjv0?ZWo>fp&g!D#iw0@$m9bc5U>$kjnK!L7_t(wvZF+ggheO4Tui4IS z3S($ua(t1S7a`rH&=Y%mgz*&&R$dgh=$HHqW7p}Z(m3<=Cc@B=!To_{L~9(kgs^5% z!I;e9u?BT39SyR1H@{h!`rzyhAg9{?Ng3mJDod!ze9;_}zs|5tVilEeniSCu@^AJR zU8p5F%y6(y49>F!DrSdl*3w8yjSjT%xO2TP90+Vs4V{0L-uJiIP=~F->a^e?1da07 zu;U_$fr=FWFo~~jc>p%n5w9F?3?!OFl!`2E)+V-^`Ut9{MOLSh8n;L(e@!R84z`*? z{8xJ6{-3R&!!)ZR3)`=fO81(RM{iHeH9EJVLYRub(%Y9}XB^2Y+^k?hEhLghbVPG- zCm=;X0mV#owr3EN#$K_?H!1bwOy?fJv^STPB-}Oy^ll>lqK@}7Js;@F8z9o(`vWGz3N%@|*3ONuoEVl}tBCK4oAU(+d?d-&;XBcw^mtnWk^!ptl4|Rz}DH>tQ4b-73b`CAp7=T7GF6D(4_N z<;#*vD*x7X^UVO}$UN1 zTr$qaDu%y1r0lQ9@*5Bfli51!nMn_v*preaNnygxdV{wRY6PpXt;u1~-J^Q_TJ~CQ zH`kWnS4G~G)ir1-xEgxt5)NaD@}>#4O0Z;N1yBz^hMu~P>3GL52y@m9*)5b6I^#zR zkk}D>B^4Cs;?JR8-C8=@ z*Ipb;Dp#WGo*ov5=)u!YtqtfC{M3#2e^E8ae80PuM?U`MriUrfVEU2_BE!K}7t(OD zELaKo><=QRk7Dj2Z^2#}OUxdOdnVGplzV#9=H=P&8meJ_%~=N}CG%z+zOhftxi`$( z$*`Nlo~kU<)Qf^1Z(PZX9W>o-9To~9bYjx$rpc>}=asjt!(2VYOohKSC>W}J<{ebY zuO_^zKBApzk`^UBm_Y~zc*?N)ZHsS$n#4HD)9v|S`P;|HVfDGT@8KG|^fIAzpsYYq zG5L5W^ez1Mnv3^~HJl@THWQiJ;@2qsW0B)4?fB1->g=mDyukCJ`+O`2qGrZP>Te<( zik3+*--!2`dM^B(;2>l){~#Y5isf>4C# znuNVhIlyZrMVy)B7L59@Hv40hppd}}YopYlTM~VPSriP56LTUklkTe?6QAc3?E8;Y z>uc1OtxHj_D_h~QG{|1rLMzj`Bv=aJGr{{3L39b*GqujHoz6QTH|=&v!cgy@@RZq8 z{0kS~c6EsVB{3{QiGQ=2mt4DE_{F4ek&VUFfME&kK;ai{x(v(iq8p8m%Bm=7chhh` z)!e7_R!x@ZJH$^~ioBmyrVSc|IiDx*Kcx#X(N318b|D)4nF%agweACjM*5^)x&mk# zrcXYs0{rkqL6~Z%dWM1mKVP?yAz&qtEJMuP(1z@X)|d&(dm}bwTk^_+qOSMvKq6w`w`w8uV$O%chKC1Z=Zod zh7LlzsNmLlBcd^{h5?6X6UBT*1}R-r=fKR*!mrK5-biU*QPy)bt_c+> z(%7skyBsopkDI?i>QKX)pDjT#Y@|3+_|I;wSg+Z7s-J0>Mn!#n$iP{2uYbEFaf=Sb?hzFs2uutuMkjsR zX))sEX&Xzfl#XPpO^rPD7$iX{=U3kl$uuOfN=c_(vk92$9^vkJ??BuDyusiZ>L%`z zg6{j=qPyF0!#qgz1v}*|mN1v--qV>aX&gP#XH7#m8r$BJgpvtbjnZmFzi)N(&MAGb z2xrxbZfu3y`j#Zv6_>ca*9Z-VZd+Jh1)Nj=04|E;rKGcbR+r7xCHc_{P>w|A-fJ0o zLZ0()+LSU{;=LSf37@GKzi_>K&{3@jNcWQr7axl@&(b!^PT`*yv)L!O|hzk0N>Zc68XnHN60JA0CT{D&7_RXUyk zg~m1TF)IbqtT$~Eh2fGj@p_oi^lSl^J+i?Gql&-#YYX8+czXqA5^g)i@v~fz7+Y6~ zHvyMV)ZOEy(SJQ52=5nBMB@={yB~3aaOzzgB2~o(_&2u?yPZ)4Eu8d2JqyCUj-xID zPr3|zpSyRyo74RMRvf%U#ONJ>-1$01BKO)x*9c(LEd53&QCYDTEXPxHPpaN4AHB&( zgUAxmhf=)fs(jiV(LP@*$#(;17tGD(eX5=6UjItF8UFV+W5AaE7twQCrJlIl?%lg< zKB|{f<2QuneL;kza39Oi$_@3bo6+i)cOr+Xg8^|}l!ETQj^d0I*U30ca=@CXomEJI zQGT@FpIk+?MlD+oS$=~K?6h?8%$zu_+BOp}!L&m>)T9RoSqKS>?<=#7v55_$imdmm zp;W)r1%@t;!DUMsq55L|c58tH_e7TvU8n@^udvrhe_8lXx$s{HUJNVIR@-}2$8nO< zo02tS(IWtUf%NIVp+pT^(4OyB9_~? zOkuX;y_ghim!LC?k9FzC*&0>N6juFP(lONp$uA#JjXpMlT!y)qTKtr=^I%F|MhEY+Mg>Xe-~UY0BKKh|GI z8ScPG;nIaquv-4 zsrco-wz>~$P^x?lozha4z8_(!)t*{uSlkZ3);>K!-+gM!K3NOBWVa>$(8oA7Fz&Uk zOt2;n<74{Z&Fj9mMsoA}e2kA$V>7Q_cT7dcN)8eC|TY#+FAX+uy$6*`g zP??Ci?8TVsX#Gg-ikd4Y)ftHjw`czb8?^^CBpt}UrYcX@UW%bmi6Ma_EV(RC0&IoAlg#@_IDl!snUka@2 zpezv3hw`pkj@fIUvq1`$go31_#5cMNBz+QHFfQR;FP2*h$wP5u&?A?z+y%?%`#O^O zoh^zrc5d$fL`EbXIps?&$r8~6)}x;iW+Xn%$0lq+6xIb6qba!en5FQ96WnKMn-I6Mh0eJlFH2F z2-ceeD_9BC{KUp2(eP(lP&xYi`iVT1`PD-ywF5HPc>5-p<~j&Nb~l4=_w+P~y198S zkY zy>yf$pt~WOa{eZEVR;=Z-`c?%(&he(7@OlOm5B+dTTbrg<|by;Z8qjb0V}Ba3B;Wq zTQ&f09{2nhiUa&h0Vm(k7W#{tT>?TTAhRUpQRw$CZ)a?G6Kaxuc|#jBI0&9Tt@fbl z0EGaq-vO1)1V0x*VLl|aZipeh`ul9a4UJ6S>$?1PfNrLcA88E@6%{=>!K~v;aHgOv zZHv`Mt@Ti6=!1yPq#NB)9(H&h!Zx z@3$1wx`gS=!s>CgKdl=4tGXjm0OJe+Odv?+=H^U9KS1VDL7rGzOh2ymXO=+U>LgS5 z4%-lXdI+xwK~5c{L40eb10DQPx^rT80zj~-HS+6T_mF|nD4Loe=IW(PAn5s_m@o(N zuUxG2U&LRlKGgKc0ZfluR}CQP{=l!-WWbh3#zwHM0I(cb)hEYmUC6tLcMF_&>vJF@ zdm#dGfO0bj0jGy%4>);EaO&~B`!?W`8C3@&9Wm=zC3FY`oaI^WO+MvC>;MEnIDq;{ z+Wo)}m3sdyZIXb~xrD#0&MaBI-^TAi{!1X+JCN(3uji`|@g0aLHMp|+Vlc-6^a27s zf3!9=K7X|hZq0Xgb~6Tae{bOh0O~5K?(#}fpfj~PHox~Ytgw&T#8IHM)&XrX>a%F- zL_gUn>9JL({7X-WJ3ek1n_9p?Q?7Dq{PHkChIDKIb6Z>18JpcXNM~({Uu)=hcFuq_ z6#`RhhZpY=O&)I0Q3Zw3To?y=KT!e@htxJb4sfq8n+Q<37!vO^F7$pKuU-&mZ|aae z!joeV7FZzGcQ7}o9GO1~c7XH~@*xyUROmcb@xCwOGgk2e*~>)fJ$M&K4M^e!lDtX$lv?va{4`p7 z58cyX1HiuTCOr~5XT(bWe}|=i*9|OBPAsp?Zoky50#Tj2GtxJ=dY_+#&|dbU9I*e! zZ|xykuzkY!Vj{hb4e59Q<+l8z0iQby&vw!PawBiqmzu8DQ8#~2Px|n8;x}^>0JbR* zu?AomxAzt=nz}dYpUboEC)y??-0+3OV5{mD=)ba94x;!+)Ty5`cNN^>4n@KejcEJ&m!CWznA7MFKGX#=;(3TRePv zX?S{<1lMGNUVp3GQw}o=+ip zbN{ON;F_vO1Hc|doPUr{k-JNaf7egoQRIpH5rFRTw)gvf;NJWgp}FZ}FYxHC2HfSd zYMsDAA-jej@cW;-m^i8Jar)T!0^-XCYOm4NsSP-_UsGQD?|%K-zajSy9f3BfyVXE4 z6JO`scWj@ksC<0Qivx2J-}xNj5#Vp7j8! z14OXztwN!4v{)y?OfTME{gRm47r0$M{0KnE`l*wP)qd$hp3O2J+1X61;LOpocV&QCpMcvG}3)aYDC7Yo-&3*)qCbJnrEq=fFRmQhU6zJT{awSC^Bx|CwAmN z6@Rm&pQal$&@$FvVR|K%Z9R8+ZK@Yum-MHEmNj#>?rH8^93x5U7Q(5^yTxD7%pA>o z;2%@H&iL`(9;Mj!7N{9n^Vx11N>g2|`-bhKJ~sX>A&V7*vd59y;XSrBu^ zF&ZYb5Xf0{={9Tw#Jp=x$);ww@CZ*=r9V^We0S<>i|iX);CU zl7TOokioot%Wgpvt(ksB*JQ_3n|5hckD8%TKb9uLZW~~A-<3=pV`AKB5zzU8Qj2|V zul84;i$A&Y#795PyYx|y(}PSO5&v# zOV9n+xhl%vysOE$vDgtp3~+twg53@K-jErAU!kXm5LKGlKXfYP4M^tmZD_`!blvUt ziN6vAQs;So^E7lbb;J3SUd^q!0;+{{Fm5gT6Bd=yifEVIut+Bmb)YUeW)1GdVboS` z8Yg;I`#a73V{Ma=)qGD-?+(=N$pH3q%63;Rhcv(Ey;!qricD&EboL? zVZ+d?mU#tMNq!G0ksa4F+D@kj6-lZDY?EC!V|H}Erq{9GMs2?6gu;XMJW!a&mqqm_QCy zEYC;@cWq8T7E#7>ATPj$umZ=1opmF)yy&EMoVyFDyOpGPvI>n!8`*-J=Q!v51wL{IfTE=AXFDf8i%Vx`7$8J z)^J{(S6JZk9@ap-%>WBK3lw6*uto7LUl+p+)8c}T6LnwmpKfI`sY?SnYSStJ)1Lo^CopP!uxaz-diwJ;2%$ z43<{>tfttQCJu=Z=H2Fxq>v`P@WUf7Bc#lmNl?%|nHEXHr&Pk-8tB**ttnERWayQZ z)&*~bzRE2k#zyLKxF{54Oi`2 zl#TAgtDhx6UW#1zLvt)vt>5`<;&+stOf(;dTUV{SdE$kN%yWSyyI1w+ zB`QRb+xae9-;&(@j-0S!vmmFti}1a9`*% zXu)JvxQWVXJJL0Scb#|C(dYe^p#S8}VrwKQ!|QX3tGe&!VePM<83&KhR#T)HYds98 zUFfhl1iN@xrtKYK?CphqinCk&FQJ$qiNjrkhPpf`;g_L&zfgw`OvOFJir4f==Rj+J z3b}4$&D=RRJtdb6iay7@rjqf3yyL?cXJ=hB6Jj<0lK12LC6w{C5UAItlymB0No#Lk zv6BQ#`S`_U*$G|rM|AzB`fbI7>hW)_%NCXlrPC^dzA>Va_AgYPQbK_76*^Lk@dCm@ z_R5xvPA}VSftwiK!zd48C4oS*rx$mX|)-4kB)pS$2d$u`DbX41cZP#M5QW~?HHEu&CAZmj410<~4H z4Vnjw=6De`X}Nz1kJXON+E^t;Tn01PE6Z4H+av~O-o3U5PmXae6Rs@6hz?zJb*ljM z0SfXL&zp?rp8{Zx34*f+W}rgj6LV~U0>NF(&o5cW;stLV2cLGG{Dfg$j5`l&dTE{>aNb{isgM8#KD$#RLwBGhleX*Lcz8a} zS~KKE$>X>4Qy93I?5ox1Ssfj+<`Kbhog$(PY>-b7t0ChQt3;-hH_MH3M13Qz)(~P_ zi|g8dT#K30zvyDMscQDkB!m6+Ze;zx%+vh`z90^HcW432W`mzOr4lTp`lLDJ0eHl>V6yMs@JRARt|IOs&nx{R!lJt z(8?_q?9k(2`gipz>DBu+r~Vy-S*H8$QDlyosd6%3PE{ed0%^hewO!Ce zoiAY&K?7{z9vkC}`uteDMx_TTqJ^e2*B=|bLWm74Np^&z!?4i{Xl?XIC4WDYXFMCj zWrcg$y@culFJWaMK1&}~Ziy1Ur}whK7tBBI=Q*_~_(v5=Uy{^8v6$T&lsSp;a@RQF zEzvJbKaTZ@os!`QwwZW$OVC3{srIIyG1zz`?|e%8!B%XdQ==OBUAi!`U=#PSeh0^H z(fDLWCDecb1t-#${8%s@@Ja4}f(LVBS2*J4BG0z9=32Zw6g}SK@YiBITcy4 z`=j+#hcZ_ympq5YB3E&LSt6@s_%<#Zi{sW4v-gznnNLyw)whNmHHZ~iM24MYQ5UJe z*vws$x$#+KyCB_og@5GjqL*ONyLjB>A@jcgH$ce0vrVR$pNTOzqS-|!fv&&IlyBr& z9I0FhA2#q+PdTBJK!UD#$x03TJZjHC0dQkxm?Li#lpCr_saB=XD9aU74)WD2nv_nhRyl)@x!~yKW&ZS2tDb(|5~JP&!g2-o7^V)S_``tyKHQ>l zu6h=DLyz}U7`ofWsod&P<4!hv{1wYL3O@`dJK@(8=LF2o-pdP+&MG8ba+5&O?V$7Z znSCmziI8`!=L{kosi-JPgg1^U9HXY6PVLbt@eVT%2yxBCA;iL2>6;k^!-U>V`RG(C zl^nlA8x(pyiY*3`Ps7L5YVN%U#)0m{+V|$8eO{i0Zb2mLhCfBT$_77WhF-CLaGPp| zgMm1>Y`&iT)TIS(oI}cuH=S#Tkhu5>*TQ|C6cz#Qj%!;2UR%ghRsZ98NG3#b>AkJJ z$jttaczBY;bT?Aw`@OnwiLZf3%c~D3MdGW*x?zFlcS;`Y{!$^|v3w3-HJ_^a7A1*i zFj2KJ$k;@#IOZ>(cJ9`t^vEVlbYbpT5=WDdO*s_qc#0haS-E7IM4m5eoS7g`!fP#P zu8KUcl4DZ)J%{Z@3crG*t!YXk}L^ZrR0xbn} z!o6!%eA;voR)A)Zdk0F4NcsS6xPon97_w-A8CUZ$1G_hdFUp9xV*I#JR^-#l87Hv2 zwquE;JhmP|@avv!o3cY}D1J${-z05&Xl?p^P2L4l6d$ZA9yO9d!!_@g3zSTywa@{k zM@dzXI1RJpAm3;s)}pc_M08Q#R~t3zhO-P*z6|~^js&2&E!O}STRBmdc&%;##|VBB zf@AD#x8tw8fDc;{<6bPHs_)wgbCg)RJ`w{5AXHgL5ZOv(66F^LgA;6N&L?Xq;D{T6 z1IpV>b`A<0vRvSr&%kgW+OEa972|NJ#L_jLhRJev*C=)0ww~_YuB$>AOm)Bn=}@9} z!qEZPJ?Rvyj0!JGRJ0e7g!#{3$b%F*T;Vvy! z5HYZUW66IP(dQX;|*W2fN4_)K|u)|gFF*@A61A5~&GIsfiLO2q~6 z3$6LYmV{TTQC(l%hwM#hQ!pV_DXK*NSLo)r6DXh?2#gyeAYCGmP;XPCvY4&s(zsNZ z)YG$hllOe`J!Xa}X^zJkbYh^%nEcDk=XEA?U$)i6)Wf0tzD+X8qC~XPU21cA=Ly&; z5-m;jXWyrrn!0-J?wTkAME|K-O6!q6QmNL{2t}z^xPg&q62tr22)?~fKSwY8VmD;! z-LjB>2Iw!5BT&r47Naaui&}mN;7H~VR>gfLYC0aO=r|XOFU3uVPci;c?azRjEbM0* z9=dO9uL)i)Pje9i;{;Y$K)z@+I}XzJwq7)1^Rb0+BPug$q?We*{_M9_NxEJAlyyC+ z)H!(M{WTj#y!_j#z^H@qo&jROoaLdS4Wvhz`HtuEhbcdU4&F21)ahIB8|loGqf4J_gbu&ovhOM7>dj(~Lq)O@NQO2kryUn$O5x*Pv+BCpj8xo1~r1V!%+o-Q) z6TmIgI$ZnEY==KYR&u?3GM1<^xc54gV2sr zs4ZzH$5Y`#Hgn;?Rc$mY*B}0!%UfL+Efc3lztFXvQ1^+%u5Wl_q87}EVO8=VmjUs@ zE@()H48>pQF=;m%jf-;!8Z9@*cyy-2C8EQ#AGV!gyRFx1C7zqmJPN4;-({-MJ= zdb-;^mfMrY(sof}>o*Thr zg`VI4E?l>KG#u6FSL?8NMoyxBv?<{|GFn_E|cGwjLWqvi|L z;hViCE-el$MvS+jzqnRQe4j|>@50b}@LaAh{xJ^mK-Ub>Z*lX={y~dXzw--wp;XF9 zcIxa!ib2P?qa4uwXWBRQi}3KCKK84uP;+sC`e=wudE zxsclzw28~%2=|~*try=BQT>`1-jhLkU$PU{*3blpzJM-pov4ttO~L8*Qx#uL8|^ds zB5s*n(kuID!O8B2RIoAXo1@#Vdp`*rGYv_(8T$9T*v?o#BwupZ44CSR9ILya25!JD zBYRMO+~4aE|L_VHD{>J+V!H*Rr=(`?$pCV zZx{dh)?g|gk_aCXkuMp(-RD3BAg0$H_)f}oit|;u=Xv}ab-FTJzX_iQd3`hq+a-zW zFmJK73EJ@@Wxb0`EG(1YV3y+RNg9!p#!5gZo`-%#15C3Z?Z#3a6jaTQ?%^6$sFFl0XIhW&?7wvTpqZk~CkA|rp9Z^A$>KQ%})LL;heV>9Qg;3OI zP&uU$^+=L~cb9GipLho}3?Cr|1gGyyuda+TEO*xx<~PW8FFd0W|`GOCqWqJfU|%9aZ2_#TjH>Gu>%b7JF*@&C6Q`CPkV(a4?HBKj|m{k?t@* z?)GT0!Xx81Lkut#NS#W%w7v59^Fpa`oRav2&7?&MjF`d#d=VI|0pOfodPBAsD8tX; zX|nA2bRz+>40yB4nt7_*N)aPv!o`x*LEYHhOAk0z2rIffjaLS2~wYM|} z7=B6&po`1L&g!T1i+tY5q(BGLKWC-nS8mwZ__zaUX|PVbxj%eV;g{1#zR>4wmha#` z5ljST^t4yDlmrLM&waaSIXL5Fi2=cP9b>i}{jp7-RD8rL9nWp#v z(LJKXND4wJ>(lJBlbY$_i5ry3g)W#xf(W%uA?x~F1|wVLNF{E~HX<0|KDWraZxA|F zbi*wzHTkSb6(<;Fy}P2?Kpv=x1A=s&rk5*~Le|yW5-lsG^arWf2jFGv_G5!v+H$a-`4i64b_0Af#T};Y1oY z8&~3IP&rD#`b=w<<$(gWe%M#?o!PrhPoi{&0{#2&?$%yT4xnH=h-*LGP~!HOkR(p$ zcc7&B&6ksF}_?IqK5HRbtfzA5ec4UL!bIiZUF5 zsgCxw9rO5Uw^k!uN*$8i$TjI3iw3VkjXv9Qv_T2V^$eNjaxF~RDd{y4Jk%0PO`?PRX3)scu3*% zb}~>(TyGKxhSoX$D%|wA@EA`DC z$@NDuQaX>4trz@CI#np&a-7e2I7I})^TYLbxnvh>`#WlAP{FJhd&syrlCk;g1{mKy zHdr&fAlud0IK57C%`hCi?BI$Z3hXky2H_aZQm~_@jq-z=+gSloe-_K=wNK6l*qAo= zYLX2mAT^^_T{TLey;5LDa5;>9pxH84O479OjW1o7c%l(6ir2Wz==wq;F*VQL34sD< z9h+0$zCIfGI4Bjw5Q0uS?u5eb@}l9@8TRDY;1AtK>0lif?}s|kh!=<;Hm%Jan^Wxv zxy=^dO5#M1q;XISnCE_HXna=~FQmFqqEQK};}lL)?M@#qdkDST61{eV(;Cw;s5;t# zouMIjhy2jt^o#Nl;EG5Bb=QS0ZlAXY;fCo=>Nq~*O|EkvdM0j5Ayi+FhEHQI2+cij z{ZmRIiy&#_)UE{rdFvv2D=xSEYN1fj@G`$5i&+&Ea@%zYSACK%g5Rr#(p-%=7SI!q zzbcbF%!D}35&h2cm^SuxhRje9s=A~UUy6e)(;3(pM|u&<3F9EfM%sodKG5J05o+F3 z-47vJL=@fu*_-6kmcI0Q;G?Crr}EW~qM+e_yi3uM;QRmr8Zc@^4qLNxnbvAG8Fc>Bld;sA%+q61cOas)Uu z_`%2rSBpn(J>%D3nz}{h(WlS&7B1*X86OEw8uo)9RU;SbkU+v!d=|w(oOJ}34vX*G zqqt#ds30#@PZN31Vt0X2Z9U-?*pncMO%%%~v`Bnh#wy;myP>G&<-)++k+_G4KAfQ% zDq@5$!CUpW8O|lDK@858A_&gkWDv`KG%9E`mzJgp#3Amr^Qss~_};n5MA+4Qgc?Y_ zy|&-8qkrMw4VrL>^oGALdJha%e+;Mz>D@16-p7o1m;C9xEoRUpzxP&r8-9I!*=A!s zcbXAU+At%zVgye!uDTP9%ycVS-Z6cTpn6)ViH_B51{0AL*yqM(d05|Az+*x%{-iP# zA7#O0B|zb_nHvVw5R-qZmy$1ZsYF;5$tPs=8|Q9+>7sAAtp+0S(LEf?+9+0<0QA7x5- zsXDWYu><63R~_gm-x=mBE~-Mw_vk()AdN+;qmrfOP;93Jp!%KkB4l@#VrO28n9mi^ z$94+CJ)!V%Y=TzOSuPibLTS`uPKWxQ;P0PnPl?(HE?M#-wj30c6=t0ZjCfBEKG8X* z^Q3^pAM>cKlC&Ui-b07j=|9`lN=b??!GQQiPB-JO=bFY9`CZi0x;;&5t|z{7MBi;5 zp}?_Q>YOpNcq{fZUkfYC9KCNTcKkLuq9z;=-4OFMD*EnedLEENCA+u)2{Q?^nI^U= z5g^0g1S6_}ZvI)QFS95XiV0}w`WkneGQ;Ia^3x8!pAXL2Vh*Z4bzZbOrA;kbKdxg2 zi->sMjE3SEcrH0}!BTBpE<&!3ir<~6RmuHh16E-;kPV-K!_~cSj{usOi=gK#t&O zeT>&ftiipWdBiAL-tJ7QTjvRvAoYL@yMk`%Jm~{vvSO+~r!SB`gtr$6RSPG)F& z+qj0scM!{Eu2B=6+uk=zipr4`mER2VJzNOBcIoCsAYXSpn`;~>X~x&*7y#}w&GaA1MFf3$_g(He}%}2MNH3kdW4zeDurW{jh(7teFBeUK7N4? z_#isNGQsOlUstOl`w6s^aaQ#b5{mOqX&(7*c?r>qZjd-2r7ir?L3!(;aLxlrCs(dB zG+;*&%qRC5%)UEEK~%LJ)d7uSh0t*hLuCA9=m09HI7bRp@jFNa8fAtWxpy?vVTC2*I9jV2-vzmO zN^i4#E&@K+i zeMC)M8)FtY6vlZk3Kmx50rDFdF&?+lR)EC#(rh7s>n_!pjYRhSL0_98XfeD3G{64o zeqD?5+LxiW1`Cap85loQn$IEN&p)7CB3EVM6-vh`m`u)8P&};NWfCfvn#|>*cnC(4 zB`9VoAi<;?w{xCyj~!i?F=ZdCs<+C`UXPRhRbsWw;;}wR0XedjU#c)mcB68@fkcxd zKZWew>;(&_?nV!>bEvft5qUgxbfMGjj7a;uR8z}H`d~E|WB}Sw2smG@BYTZ;Qa9S> zo?>8oRh1gbE(K>@3lGNnpz5IBcgb+g=#^qZ@NqML=3=M0zMv~qvC$!#P5jOt)A|I{ z@#zQDdu%pX2h!B4iCI_oxDF0b?P%=>F6()rq%o8RQi_mpmG>EvQ{qGD2%i`1j0Ex4 z^hV3YpcB|d$fReXPveTdIk4%FKJKL+D9nf2!dlBmin8|kG12MS++A-@@VsOC`i0QA z1sMoZMSHD&#d6S8`0;W(sm8N0Uif6K&I&MfT8?g+Rl}4?mg-wH|tVeqjk_k&4icw{{t)Ogh981mg_~CZd zbcF+nx%pL-wSs)|0E0+2q5sKi-M~ggJ-N9;qamLyU03E|y>8A=RK&)N3*9F^cXC|U zwFKjlF{68N;>;zRqeFDvrl>gZ6+}iue}B1l(S!adT`Pv%ip2jcQseg>9yiC-Y&5nQ z;xvdvDY4zEur(&oiJC+?%iamN3G1DhkU($y?v>h)XV*1*hgwh%>D_dwGvY4^8x9B; zb51FuD898Q$76~OG=1!!ThU#FQI*$;nZ5891v>TKpP{_DhZTWYS2$+iYSjg<8) z0~=PMwU|2$LQkk!#pXnp-H8Nj$9>f;0&s~-KR}=oT-SfhKXQK-JYB-tDWlZ=InJ{F zV{k!1$)>g6&!=n3k?AU+k0@YBjvSe???w1anj2-g@I_&8IwV|diBxJ@)T5R@oXAg2rIr<~K6{q#d2y>5<*oE&H3 zI2}$dCv0|IL$x>j+9Drw*<2$o_T{7LW0xfie0=8@+7+J5_+5{vqs6xIAkmMCIkN(< zXI=TcSCBwJTGkWkVBx^LYaA%cjzPw}8h3iQMIf*S} zOl3+!Tp<<8sgmCXj?Y_#n z{4n2bZBC@IY_EpC(h=S>*KN|F>0EYE!HUw-^lXUaKfGy+t^qv)6@u_p`DSc>4=^85y3WXDeK#0*Ztm(-#4Y{o(ql!q>rkc~ROZN! zBeEE6h%UF-hQ6g`zhGJGeiRcnLUK<`{yJ_$Z2OuVcokD%I)-p;-S ze&DVI=~cU7Gj7JS1-cHG55&bQBR0#!?USM*K5ff>^YL9IT~TG$Sr{>XP`P35Au+D@ zkZ)+e`sqn^WB#)LGu|IRN^KzZ+g0nnB5@Fq&}9BtBAK}^gUl3pN@Oe+T;j& zNje=(O;%IK7)>;Vd(86lYK#J@k7!WFZkR=2Me{X1m{^rZ0c{dT0nb#}eK+T(H|rwx z)_LM2(68fD+{riA@CvQGtQnWEj+?uLu;CpOGjb)Y89kz8vG!ihfI&i6?kWuM{d8?0 z-Ia}C6K-rK;hmKxQU=xjFJ>j* z_jR%KFdK)Z-cw%os8M7g;D+csX7rY00cK-OY+_N|*IW@>g4ufZHX;=8?6FpG>l$8g zhwuF!+Yyq{YXzV)aXvr?)o;Yu!CxP1Tfg21>$t<6X*rxGklPVx&c;Il&$7+R*t8FP zBS|1jvPAoS$-LlClN&TXoIroKF+UOv6zn*E&iAe>U#~B5JL||D%%h1whT#jiEY7=z zg~Wi)R)yYN9zw1RO7R!aCrp&{L`s$6>^Ic9o9Yq?HHh!q!)zGv>1&6gr z8{6$O+vM)H-^ff+qhr0A7+R}O+~HWQ?g*j{pnK`evXfncnlc~}QCUk-<_#oklIrU> zF)22DK)doqpPt%6Q+^>WsoZ( zo#|+P3sI?RG^qQ@oBPBDOVSeCSYyNQ`E;7g9i1<|9?lwp#X)o&`SS-s6>Mx{0%zGg zI&cohQj(}&x<5LYQB#)T1)~bq+K)StQ?gI|GJt5k0$jnJdLj;Wj)H5o+?ip~ZrzIV zW4U&7b7@vUM{Ag8t{~9b{e{obCxu^KEI40P{p`nL()@J~mb~S;ykNv8${{%9lS#VCZPrawo_d&$8hewH7;ofrUDE{RnbIR&rAooxj}{y#`zVm zL%KV6@M80WPG2|yyn3{n@7tvIzix*8ShG%S*v%+>J*QtVHbrX5!En}#y2SU$jHv;#2m&)=Ge4&LK# z@Gqo>JRyBq`N{~C^qz9iTs!P(r*MMG?_OvIdu-{cr%F(B28AY7Z+Sf-%h2~fG?0GL z<9|Qkt@afm#I;Az?rij%EWwE^s{V94+j~TR{VF&}GaBvZW`}xIQqoSi!qfxXjlOKE zBslkziHxsJU}w%iT5Jw=)(#aiaXIU>rVHqO4uXsIJ+e*zlK$8Jf(c$K?amUy6L?qK zAVV_JE0Csm)8ZU^dyC^Ud${nkY_()0bs$v;s#Y1 zE*eJv{M01W!zeT}I1Cf~G*ip8<Mnjs~YNpd$}0|81@L5h(wS-WsI;Io{oxrwhNm!l@` z^|g35*wi?=*RO;gu23qzhNN!tx?VM9la#*P;Xdbq1t{=2+3aF67ZOfdrt8%)La{nyg#g3hh@*#3B$4JGj?Lh<);$0pBiznCqT>P$0%>ypPhu;x zL20grn~gR_i=i(&A_EQ>z@UW0uGDjW0!HM^BX5P>_0c-`BVoRVLv}<3d^E({r7*(Ic?Dia*yov)2lFCxDgIq4E6}#N5{17 zm%MEFlw65+Mj{Qb!$b?=6DFjbw)LrN<0%D3Y8Q$ufg6)ocDbX<0fiGI;WV_S5TlFF zVFp=uCzGk+b;{-v65Kdc{pLl>wibfed&8rK7*>@*+~MBp`Pra=zLmN&^kBOr=uf$^2QcYA6&iB zoAxdFt95Bm5_s~X6X7EDzU`J%s5Ij9`AWDHQrfj|L??cufYO|0N9MsU@%B3~PnCQ~ zPj@p3B$p~Vrh6iKPM#K&4)Qo4meauw(`D7Ut4o8-mKnm%kCM!bW$FXpC7XTtB#AUl zAfOdLd(z8$LtAr-77Ipq-TV1zilz0oihl&wwy#kYF-Z*hlP<9sv)e|MD23c8%)Nqd zZpr9HD9k(mNqkSX$}E&H3URM1!-`V4NKFN=yt|YLoJf{Rao}2XqdA9(<{htk3^N+V z`vV=ky#BEt$azV)-&kQ15zw0NR+;NFX`G5(xqYJNgwQRSBE2$y9Ee%{0xJdG&AKxe7ITfi9?NUr&zc#hnQ3*; z8Lc_-+(Qko5KRd^8=AF|6e0uLX9|dHk{4x7C1AVYmUD~xIR{}S_9kGkBtiBn9|3UU z;hT&8beNM!a4Rrebd^#N3e(tjPvG-vbn)v$xa-Y?gv>A&v+WI?V@sfSK1?RcvY?^X zs6%>cHkj0c@=A-seIVtJ?QDO3IP2G<4XXzV%GKV{ zpR&gYrx}X5^!)8GOtq55xly*8UHt-ARDG1fU=h*i#8UHHg z+S#ss$pbZY0C(lFmA#|nIqdi*?^AAYTkWr#@aFKuXmlOiYmR*CE6fx)S*R=B`*S_& zqTPmYafnsW8xmg+^JC22CDvVWKcj7x&WSRKOa*zw|7wd&=SzuxpE1>6e~*NR-JE8B|wzaU? zqP;XFEnm0f{mEcC4BTFF6S;APwo7Fe9JFa7?bAoJ5KV9ef_dA9*!NlHzJRDO;q|9@ z={MObKh$1m7fvoesqNtOk)+Hep>r_1_Go@3S<+oXLNzIFe|D7OuN-{jdazgDfEe0u z`)ZZjCM?zwpr_yE_@J?DoJEv##O)Q#8pz}4(QZxtJUY80Z1;&Zz0#Xs)JmD2&$9v5!<95!`uo z7FUP3*eDRl%x|cryWH#t1~#OHy6gDX4yGtZe11N+`14TGr&s$jYRP2hRCCQ| zMPus*Yg3@QKE+Sm7#tW9yK+Q+m95}I)f{qq*OW?kaQ<^saY^}u85e7lGCQ1Sad;`| zRTt4KI=J+ubNXR+{)manNcq?%G_Q1Z;AmG1P~zwab(gbkUxDZaD% zrCM;wI;=J&a&9aTW-7ohivV|{$mKz0(NAVA)$XEJsKjuuaf|AHKrWf2EuD`2{&In9xD*dLjrTNKSMNGr|>2n=ljM1-9Z=@6e!ZlwEXePQDS zF^a(=EjhKWzQ}FHN0zMLA=Jqzvz&J0ga^sZddJ0JIvhBRq7@@Gnb%`z zj=_lVG;R^KGy;f)j`ph1j!>0da<@#&-MvWI`Bat4TaIO5$^kiN=Btp0?5TecqF+TS zrWVxII8r-mYyVDztS=GLqD8>z#oVp+vC74HNS_+P!IFwN%0W90@*`dC@HF`kNQ&f$ zYSiv;h%<`4USco@1mZqnR;czB0XMVVbqFp6zVFCq0d8wQXzpB8zE~7y_+N&5${<|2 zDFZB6h%9r%kEXsOq^>Y5#OW12vy%4EYDnSc&W{WkCYRcL1L07VzM{z}u z&qKG0d|yN#H}L_0-OH4i4w(7%Q#Jv}nJ&7Oxz2;bIX^jO=!}Ids@^}Em>y6>o<$}j z&CU72_>~ zH0qUVN1EaeYzZ5|O9h6^Fi`Wpj?ou((N({=t%wZ23@zCt#E4d9xzSQqK?{>fyAl`m zX<~-A_jY?scuY_CqYdH4<+LQ>50pMxXa$jPeu$KoCWwYUx#uGg&Gq(ub(}=;Nna)W2@hJp z_0LvDnSqUl3GDox=>1*npC2(0yXvdBlj&r{N7SmR|qY}MnZLw9u0;rrQ8Pvl)pq_-;>LH_xN-oVHUu{M^X-Av#V>#IZeYW=dp51P~2ObUw z*<$eYvE5-pa_GrVNX(EP1K|EMs{VH@x1eC-c8h~vlr0p4gDg2nbxP`#;fe8-x~!Rc zZMW0}+6>1u$UFyiE^j-BNG&OkD>3wSNuz55SDUXJNycjOXfBwOhd(*s9`L?ynKF-{ z6u>zDeyw$@u_Hpg zf~;zNC;FM9U^GT}(;+}C<)%xgqginoUbCB3Sqh-2$kz^yMGNpiJjzDBQV_=21{3E~ zvi!`MYOyG|t6R}Ng!J7mY8RE$FYNS6zj5$~q-{`Ib>;w5bOwu_1YC+bVCM|S6fDo? ze&j5oqCV`f7gFK4r9Oe*$|$q5kpS5(LizgIH=_@0{b4#A3`5kYCTayq`!QT%??B5tV3Vn@C{|<*i?#XN};bCCUf6u&hq-zZNR2o?4pYKo&Wm17~_5ESZJs( zd|%8$M<=_8rE(d#2m8GD`r7IWji8&JFD!+;EWnwfP4uH!flU;1g+#WquGVHGRX>8Ig*H-;T)o~$)&<|Nq!?VwI-F9YGvx@3e(Yl&bbHLloE z9(4QFjQ_GuRw){I<$3BHutX>#%o&z`fAuBZnv~789l(i@aUz+#WxocJQKU11yvL)b zz>4^+tIIaRnS`lge|d9*V2PSxl~`75-M5g&*{!}j-SOkj`o5&+VNVu~NLBGv_MW+G zhcB~B5|#lYT+k=TvSR#LJ600!%O`FH6YUf@VP?0gXo-HJ+a3N?f2-AI@97-LQ{FEK z$-Oekq-1!>C5Ncvr*hbT=9&i!{%BCsdwSIlw-=MP!1JYKNIzL3;#NM%PQOHP(;4J^ z*-@BnsA@@u*A;={kByvzRAFmOD4=oXgrwf)B6fs?2L}4+_4iVvYyo^plK;@l zMtiIM^Pf{2VhKcQ`}PfYh?8TBaeYrQXlv`9<1wMGrzfp+0#C3w2#h}C}TFp z=Y1|}Hn0QN{~f{`pEY2`x%?4aw~`(vkkcpOswbK@(=F@y_6w2-WFU!w5~ z4PN&GaI_8ULAS+LyjBL$CKOb1peAGyhe7g?biC*y|z=&|1 z7NF?eN;!MYth@L$)OU*(fH#0L!Z7c3Wj=+-;LV{26snwLP?89vrP=#k+}j<|;*^C}h$;HzHlkn255zP!g@E!vugb$q)VsD0JDVp-#&b8Fe`oryi_uNSjVB{9IEUS$wIHzQi#2Hc#9; z+?eaFlleDC(jTnOu~Zgf@iFzoE(#f9v4%2YG3gU;VU{CHXYSmj`qaBs`p1Bt(Q`0V zIU+RRDMR~WDX39)>`>g_hxqo>r0Qn#Lgjnp`M6e(f1>YCyeQDnWTqBWju=GNdGooQ%-Lewk~bZgOXH< zVQav~u@X+Gz%^dzZU$9t{|v+QF8~ds1QfzHR$oTNTaSZPC8fmKbb8c(4_`@79T!l^ zT_#|}+d8Aiv5rQ!0i&EQ0d>fQi=bvZy1r`jmc~tqQ?&CGb>xvkfJ%V!V1N{P%{|-P z_7>Z<7QfZnS!3-G{~K5!nsXsJ5+9wuO}?T?ZB`vgy(8&z$3yP^%GB(cu*?SXAkQ=R2SgkmV8BHtyh_hfS5FL+}tC6)e{zI$Y{+OkzVvOu;jMQ~{ydqmng< z1+)YxBhr=@=xNq;lC%4;5!J=^DAN)I1RIqdcaR0h;^Ph!MD){8>HW+Ik^~N4Y^$UH z=Z83asU3!|U*biL+|K9MiQsx#z^_Kf0YH}1P{CN%!Hh-3c!R1_EssMGvlwyR z*w1A%1P6&^DiqGNH;`J$2)Qt5aKSOtWHvA!fC!hceenBpD;;UwoFfHU8z`WJzpwq8 z25d~~c8M@u2~rsw`&f^C9V8tC#WyoKh>!k}nm_lC*H_;78$( zCIl8k&Jds_i#^gQ^_%8a$=$0_J7A1DXH~7J!CvSW2efszIu%`OSr^T26XJlzh!|W# zAmrr0Nc71L-DY)99elm>gP4{{F}^@BNF|~kV1Ma5$g3qm@F2XGIg!Uu|9Fp1VW!Sj zY#A&uaj`3)6oQ~-(Aagl9{=>ozU7IZF40F(<6Yv3P6fdlxVnq)PSwf_9x0u_B9X&C zl-}^Dc$m7%)2?HAAhRPQdo?xK49<>PfY;aE&bjvhq{%O#xyb@wdnf6ai#L+0*N8lE zk?5moKFn}&{_FmGRx<*rCRH2tvpSMa+K>mcOIgm6MTt}qp3DWoi?d5_|9yOVEIdHDxH;hxs-D(g6lG(EG-Bgp~c!a z?z~2$ta<2XKdu-kuqv_Y<$+v(e(Bvc-pqa@+u?~U{Kn_isQB0fV9VBhKMApv_j+}( z8!ym;@7L{G9W{otzIa5BZtY5**|sA=8cb%x8gAsz4oIZLa8yE4rl0L_`wbic*$mG4 z(?b5HUKMPtjaGfkP0#8mW4b!L?$qB{Mxqd<+S7u{wg;`IV)@9x`~LY|tv*inWQ$LE zzV9a4JgYf9sD^C=for&0>lT`8)hi)K2gG`S8X+=KzrFj_0r&;2iLGIO$ky?OK-kAW zrf~niAn=(&>R_4N6F{7uD3UGJqQqwxh}Ick#6aYNfPi_4B=- z&Z2CxiM=8(lJE7AF;4^b*o_yz29qaRTsfr$X0& zM2kcU>M*S030zhW^8&RyP+Q^4Lfqa?!PO+Hwc16Ah>>vchrbv5+euk3A43V2k)UH; zJ5!~fUCU?dse-7SCPPEc%{XZZ(~10Q^+Y zy%tVHV+h2@3?A>s%1=Awh5|%}$JN4#tsL%a;Co>Z36%+V9L-E*E7KSz54!Qb26V+O^q#36Dcq)dhUhhT9QxEa9D`fXA?7-u?Tu$olu^H6M%32=Sp zC+R0`uRMJ_TA`#XeH>`z)eh4wNiFH04v+J`E!>hs6Xh6c0aCTC3|A7ONcuqCg3IiV z^-7~+p-F)$Exc29GfOV|BIz(a{r3ao-fH-XFI#RZKXCH;sPn~DdM1nRr?!A}@kn{J z@?yl?prq|2Xu}&<5vTv&=$Up&Gek6zT>g6SX8@h2$=ImD5i1&^w87!`MU-9X+?*AI z?H!z&%mUfahs@xG^g!!$(tv$wpF#hcs^x8IP;xH_0d+jo4C-oa!-aPK2dXGh990<-sGTx%ol$jJmh5h_MrTn#93&RZ6+@3o{fGs0 zpoT0!T>8xIvswxm;0)3wBaGm5_S`$*C!!fG6RGv*kyyCU{K4KHMk_JWmYZFEQAl&Y zJiJUOZBge&S!@J{uV?1Bi^L-yv?%H&v^y@rSljfatJvN?IVOjkH%Irq&Xc!8ZJUv@ zMRMNV7O}>UW$}0fOkYO^FCR|C8^hIz%91ppUa@s_p}i0xNeN)~J`$g8wR~HBpmT|G z(*lEW#D4^yQu<@syb_llWqrgV(PE-SGGANRJ0aR#KQ2Us*eeB$okNf&z_xDxvbt>B zwryKowr$(CyKLLGZM)01ZpVu_FXBd=!JTDJGj6*ji$F0K-fla)FIoP^f4r_c!cR6c%9pnn!}3<4iP083$;TrC6NI9b|{) z^3hdQh`J#hrwz}I>Y(+=K$PqLZccF}HwBW1tYB<3Uf5nZZ~<*B-j;4|M$BDv2T>cW zY|v3`Lzs8MfOI<+o^`{gf0dAA3l@kte$BDn#iD)krx>Eo9ic=-V(mJkS$FX1y8&8J z-#b-v4)HWWU~ws08}8~p=2c$v%G+ka4`ihv-293&U++uG8+(yxbFTRRPJOV18hxFS zr*)#)Dg9=qm~6G|m?Lq=h<=jM7$eXpO}c*^6!|O^M6__Y(yglfrAOrh@ zV~G2f^oPCU7DlPToD%96lB(K3pRj57D%;!YXjjAlBKFDI02TY%-&#)Dl>yz`F(CyFfSJhum&g=3lkMk6dVC8>kd9zo-046uY zbhHJRM=y?B`;=qS<|omau!z_!G(geR8M_}6IO893gc(oIJmrfxkGs&stZK4Q%K97L z?dU2v_WcL&n$i|V5zh_sQ(lk|7rBBA|n)6OU3q#h?)PEcC zV4k$HzJwUnl6xbZlVyke>@eJQ$|&}zI37NNWx2{!9t0xX$^o>QWfIC{&dcu`REe84 zhU=IzIi^Ygvr$J+amJ*V;x`b^IF`uOHF5a1WQlX4bgO*WnB`>C24;P!Z-plD*H@H# z9w@@8>|nL+#7ik82xOF<;e=l2Lbwrf=)~%6C0X(G@_$H{lUqW~@E4N@=o|B!Ah(`u zjCoi!K{tq4GJ`!GR}*WXnh5e&)7{o(nxzM?*FdJVUPwLpjkF1Ce|h6Bo~gm71PZP$ zHHT=}Q0Dc|7;Htg{cU{xnWE#=?K&)PQX-dE$qO$Kb8BV2p8UJ~&c6W;5Y8X7eS!6s zwR|q)Ft|p;9SB?kOpwj1F{m8vg;gZWBp0Kt!|v8GFipD!*9ceBDu;P}U;GVbU+55f z)XCH<*Zf3u`9e_O!p~+WP!?bmsK!E2*e$nkn)~RH=@{+y(d%brL5uP65ZJ03%S0Jy z8u9hIJbV~0MFZQ-MRP%`p0E?=w!IbS&j=9BO_@APZ!eHJhBX0W0p^7|AcVNU{hEI~ zAMPs~>vEi_5`x?~44>4c#{ya<A5VbAiAbJ)$OHbX}zr_dR!}<-LseMuC zd#W_t6X6QI`7uiJjM{mn&6VG)xTEsdXt4l@Hu|l*7;4CF6z)R_O=NyQfbA_u@=w+k zMHFLf3{&dt3UFQR{>4E<3Y4-oB#NabCAKIJ&FvJ{sMb)dR4oRQ$IiCw-Q@)L0{OOC z4G>9I&SJ<>t}7kk4!iTqf=A$C%K~{rtSjU>iM9UBTI$_IV^$xA043;lgM%~#c(tlH zxTx>S7HGrp=(8OeK!P43jk0oh6-J^P+fxe&YmKHH=!{O#wD5u@Mpz=A#{47o+p~mS zOcKz{tC{nk7CJ%BvKf)9p3>`rB&YqXu7=eqBM{^W>fjhVjsk8d# za=G`^e*CMenGNQc)VB`&F#A=l!gF=pKvgEpTK+;T)& z%xzHK+UJ(6U`0`}eU^bp3jM?bR15LP@c@r=|LT=Haa*kZ8?xx->-S1p{h;UU=5=o_0y|(MMZv}JLC6hco@wttP9hT6-<+5+J3h;nvRQk{zTj54iB}h=BzL{ zx+3LbRF{r=5}vRFC7Gm@lF_Hz5(olCa_zkfZqJCuS)O|4-;hFDb;e`ZO5iRVK|9p~ z=E<*npsaRBb_rD$K@NLuU}D$kaN9q#0<_%w5;mR#Q7t-=i`l$Z>~UdaD9ZQLnp9eH zLr>FF;R8_=*o{o_7Im4(bc+Y7$IppcYJUWvWTCS7Sf0}+wv5a&_>t1DiCu>HTJ+8+ zCf?6_*;)A->KkELZ<^X{w9z22%04x?WZm2N^iUme->qcnO`=>gXL8l*4Qw8%@QMM& zP{=Vvy(G6u!e){}={q5+NJN+e4epXl?lTfZZF|GSo?+3c_l};;1GcWzT0D#e?fiOn z)kk0^M7ljw_4BTpbixkNdVqd9oLLmht2?Fi2yW#ieXlgT`NyI#h3hWUTtCc+p? zC@ZSZA9I#M&$OQVt4<2G`r1j0fY;rUPSBgHo0=Y0o>ai2wAH%UgAKGds-J+qrLilj zu#d_7jA&1&Pgg~GDD~+4&=T5g3G-ZBMGCKa)8bJMJRTTOvB!I&KWg8(@uYFkjL_k! z=(mDNP}1A zy1_#zREXnDH~+#hWj^y-(ee-1%Vyng`b!4jbmNAO%u^Sf3&S=CF5oHtONK(c>p6_t z7=Ac~%QsABdy$#`;%8aL@}=)G8uYh*-Nm*8`e_Dkqh021Z`E@V86(@*oI0K2W-U{>YcN9et1@J8QTeR;_DmVg7(c)Y1?cecPBv z_Gsm-8bcZj9X(Iif^%ILaNz5PBh&&P<)Z{w*T42|wN@%`dGQ!{k`FGi!5`K$txiTA zldo`SePk&uxVauR^}n!mwa)d+Hw4YLnP|4GVYx(1v!7L4`{23@`W`T&z8sl%8GOOj z-D!L$L1)}Bv-`{%fxHT)nwH0{c%f}OYE5I@pkP*B%@j~9 zIxg$1o5{jPHj+OgY7_J&cHf9;0#ndlN27~IrfCDU*~)jog1iQ`%GQTvnUgq#>t}6)SOtZ;MkC+| z*t^Ce3Dkn*VPbYOz5e>CcsW@UDaM-Y#ml%R-xVhaBy9X(zK9*6rA8QEc-ONloJsMzxoqmz)NGndwE*}nqa!XMc zrYW#r6Nh(gFI@(+$H*xleFi454F&zP_&S^mj^p2J3bMC<@W#ERx6=#KzvssxOhbc% zn@wPEhp~mF57rn4ymYK*-|o@w03fiR+zmzWQXduf3x@zTg=h3*c`bB=6wsAI26$NC z);?>~YU|6{)@au-eC*OX{=hwOm~gfgM;8Wxpj@9szIF0xro${9I9%>*`TeQF-I_c4jg@#F#6(cQ{=Z+cOGVi-K!0jUfy?Eaif zSm2|dyYowO~581QITAE*2--;d{) z!#}Cl*$@4CqhT2vR}=!Q@x9-Mr~oj(dp&sbGkwRW`|$()!9D&Nx%;7&*xBCshG(6` zfB%WYIsi1jd{6ErG+x`reX6^7ZvnslWS$HDY-y^Nkxp&z`!!41#*gyG2WoBp@QS5Z z@=U>4mIFC8*1aXs_)WO@(r57gf?KwC4*BX)1!VIG?EU=3W1k$jzB{q^F+Rel`g?fr z=_bY57E*Y81AB;y04kuZO|X;RCr)$+4GHk}z*C<`I)8!)1KQHI7jG3u?=$lH22hKm zPwkRZ4Z-iJebc@pLjkp^{s|S$SN=1+lsNUjy-RU#I^SSmfUTMz60b*>2j|bU_j=bC zKY|-0i=Ce#->N}~^ZU{_KiJiQ?cw7)&$poOxTGKW??bvEq3%4i^eCrTw1WH=mwen+ zR;7Qhr=7XE^32!gCUuVQbREteyL_VZCe<@=x^C^sQn=sYtqruJj)d(Z50fut%|N^b zw3>}yrMo#6MDC9Nve*m)jrF@;B`SJyp@R~YwH#+}(i(GZ<8d9S4bzy6dKx=#m1Bek ztY-PZYTv)_kLPdOb*8&51yQRy?+?b=mPB&P)jj!TGn{u?n~b+j zSbS28oU9iKLq>gbht1Ssy{{bYEeD1;=mzeiqp>q2&RnKEvkVglxi?5yzOxTek6q}C zmGjk{)Zv~;)`B{^6}kZ!Fio3IS?V{9aWg{NrL$;2ErfE_r2#L{A_{~j%gnqnG#kx$ zT~VYu%ventxSFJv)fT`~WpXM$XGA`7teG~FbNzF? zIO6=>z;*8t8irV@|*K$3dwwt{RSI> z;KZM8^5V^gh5m{yn`7#?{vN8M{l*+T=u{Sh6m+~$ovi*;<(-`wbCsd@?<8XmgH#<< ziHUAVry}~YoORuQvL2;in5EznN@#+h9CZc^&p# z^=qA^FNL*ir*QU(?vw+kBTc_H=nbA76N?qDwe!vLq>-9&vGHxwo+ixj-)$&6dL_P; zy4-BEIN3{dsp42)oWw+jCi#9fJ->)#sBkHE&-&$i{)Cevw-LBXaoPf%o@qB{BQe1O zb8kpNAqQqGa?J)jJ`AUc5$@BI~rd$B~EAPcavzOYms;lUrgXM`GMyl9r<7nosk- z0}P>D%^h;}%ZyPipy9*jZlpj@Z9#_KrAY2BXjo&}bN_pBU+E*mf7-a8GD}8qDGj45 z>LLc&18RvS6dRB0G(+nd7t1%gsw0S29yfOLgxawT67mnTivUA!7dfYT?1jrTBx^Ah zR<*Qe&^a!8oy7Gi3>;lF>ZR2fu4I~A9D0Ll2az~DQ4A!`#GWkqk19N2WQW&i_*Xn3 zGg`#%|C!e<_Rl=iw zQpxK`;8_QM%j-Naw)S! zgN-BZdtE4@=BDot8gK79{f08@2I+brWK)gczn_iNrsP|(y0n?U=~&9fah(o9NT~PZ@)bT9hF@Vx4$YDvs@c&|mH@ zAxFoF&R=4-3Qg4$3H3@IN)BBk5W~aXv<|SSk{NSDrHp#bG!L{Jo{E*l?u;m|nBr(f zS62XZ^}RKOiPqd#CNt6IRzgxG%U0al7n`GCFW>ffOUyJ2+Axje_Zt>`21i-FiQ#Y` z7#%%Yw6vM3gDO*tZse&iU(cIY!t)$js2jKC$XLXrG~%5ap4TD>o>GWAxBMb^t&z6U z@*4C;x5Q?Te4Rz|Ch8)!jUtcQkwLk)Gv^(q%dzm~`BGb?n=R)0T1u<3R%TI#hU{gP zuSmT8OU$D1F;$bzSEnPpMn9H3d&_!Z7Ko9`-cQ(#e7)=r%aqM?wAB(S?M03XvriOg zom&pfFXZkz9-J zSnTm>=^k6HlGp2m%=ZbBrpX)et}XfZ_?e)MLP*DSTf@>`*3>(kLy{XPL0s1vs2v-$ zvneS=Yw8&lqBQF}{#m~$C4C9yGl72Xr|w1_xAcY_1Dc_fnt-t>@uno-Z-rGjbNXDB z$_l-e#5vpiG@kM7{1deoV}`D+A=;STT`@prTS*z(*+QvCxynHPPBh(Em*Ty(6V7f= z-5)X@80JSpZP~AQ>xdngK!3)9nw$?2x3tEb;taL+`t{qO)^9E`GsFEkF}JQ zs}z3Xr^$mdexo9ruDsisKF1W&WLc7z4aSuPnua26)^g5DkW976#1c|=#<@uI&pBBrTc`(aT1{2Y)3=g)6J(8pp zPJ5A%QND?V0<18`&HAD{+dh9?G1v)uz9R+joUd3a|`NO5o^;?G2tq-fkYR0f&%l535 zWQaM&ZL>3_Q!Pich@7VB1Rhck%c-8ZNO}sD{qCc^Q3g35(60X&D@^(bs8NJ2ez%DmoDAG>`p+t5W*Ko*1kr*n6S!| z5-&|0?enV`E@=%a&l~Ottf|zGkpRKeYyrypd z%JlGTq#T+Nq!rB(-)mru0R74E%4M+00f2aPgGrsm#Li@KKOxSme@_;-(Y~&x9^}sp zAIXdTi7naQo6~6Z5fB$`T5WfFqdvL9 zc~Mo<^3|Kv{sX3Dn~Msv@79t1RQjTAEe#&#(Dw{LBlLuI8^0-^`7rQT__IkDI8LXO zz9nM-Rib4gCZo6rrn=g)4|gRyVV4!_Fus8k9hgv3*?x3#NU-jFlF=urP;D=ipXE0i zmIgMX3WffQrP@&sv-rwlM2*nWbCDSIaSPI6V+Pt<**M_Xf_62zbOZd1K4U|qQ^#%~ zQr+r0@)3e&Kz?*N_#6nY?P5!+Xh~zG;A31smD+JPq$u~^TLojhp78gdNPBX>_1}B! zkDG-~H&M9ZstywR7A+{b!CNLc=os|!@015z=e7!56~k?@x$hQ~UX^gD!aW61mom0Bq-%8r)S5l@2-h~|ZQ-X3*#LJ^^&&LQ1%sJrTBsRwtn07$~hQz#YgCBbq=#ZF+&T|VGQI@@3p$3X9932v%FB^ zx$lcrCn@AoTGy5fk!@3Yh!=5(5+5#46A?z{Phe(w8ShtSTR`76t2;)V8M_*(|6<}4 zcew(#xoe^@6MW3ouges@PK)#`wIQNV?7N6#A|*}aQV{PogVI+zaa9U2C>2^B#5?Dh zV-$)yJjul5L$Zx`PSLyF#T5!@wxPS)hI+?HxOrzD^V4%b8wztU|ThHSggm-Pt8Zv*6m*Z2JD2w=5DHzAH^c zO8Gr_@YRtqn_iQ90Z|Ux1K;3HJ^p*ah>e4ofM=F6$_NrPf_eVx`zNk%nFCj8iBHHH zsnAh{*0&OWRqgMZUz_92JOoVNYi?x-XVIBribp(8#xge*40B5Sg+K94Yb%D2n$FE_ zJaxit%V3jpV1VfPD(mlXX1k+X4Y9%UOVXpCviL)YAEh*!7Rg*v?#!gY6?yP09vxZk zx-0po1OeHwgzx;c3)dtg;CEfiTgHt)jz>ppjKM?v$CRBEs`uuU1)6ZZVvG(MRa>d& z#cJ-V)z>-8?F3*?_q$=`J9)U?=nlw+Y%KFLrW@y4efH=i^-sIPb6+~3)M>KV)5oj8 zUDL-6t6)GItV+$&NmrG`oOH$(1>4#8+Y=XDcjX1iHf2LTEyxP72rD20X70Xw@wkND zA*g|msP_#+$bj3o6!w7dBR}DDrntl6ZcAgc)@}j!b;L|qp7r;|z+=bi10M%ov!U_kq9jFoQ~ce2gsOmN%PD+Md_g zo6e@Mr~aY=1TjEdBi3EJlr#@IWs(WWTq-|i`}mS(t8WY87Bp(BZHm>BGP;STidkuf zD_W&xN)9+mEF8RGcud`J(dv>dkge8-DlFTZ&*MY+h>WN9^011&!e(Xp_Z4$_JEu>y@!=nsIEYuiCJRM_ky zN{83y2Zh((HoMJ8r6X1qoDRr}%zArS@+{6I+WXw)hb>&g@RP7o65W|nCA98i7i%wp zt18cl!VSj#?XbO6_cg&tXRRuuzeWbeOh#NhA`e$`qAkQ+nNSciI{nrW;7`|^f%XP` z$kOunvSS21Utr@82V?L#k2h#27$r5F!fMa!|AXR%z*Fs^FR=h3QYQ9Jx534Qd1 zAk!RnTN|w%*eqo{Ha4oq&YpWQ(H4=joGH6?GwZQD$mgNo5R}*=-@uxlw<;1KLwqil zbB>?aG)J>paqcW#oAJ;@wQ19p^S9%UU*9wHuNs$UZXzcZvxdagdzCwHYxJVVei#pA zB;W-6tSW7P#}L{b2>Oe&GchNuFg{fjt@Gx7PaZ~dLI9eTh^6F1f*H|WY`bkTS^AUI zArfR1zC$2L{jT(vDc2Z{D7bA8j^&Of@?lQ_t79;Ci|mnajD=`5UCzjCwG>h&e73;~ z&+w)3BV|5Rc*|{MMGJ$xxGN*N4-%quE>Tb#7_gLn`)RP0go^J2@(mVDpNQ-)C2z_A z)N*Kbsfu8>V)MVzeH6eQoFK^+u$^#a=%>$5vY@zFjxfBh=%!S-t!*Op&9l!-`*9{T zk10(gwm3h}{S0rMyi>nJqj%b6|4?K8F5(fwlR>m5Z~wHj$uZTIa7EZ1zyq_ky<$nR zaCahyz6&gQfDQo&xn8A{V~d))O3U~73AgCr>a6}tgjv-OJqQKANAA5PM+UBL+T!{s z*x;+Qqv8EsBcOrHrcSEu5@KVNGRw9GdHNLV#P=H}7a*&1-R&YK8JhoY3UK@ zvSk+0@TH5Q144VEqJjR{i{0mzM$J46HP~_9raMegr&4h& z63jn&{;K-11UFlbl%v_Lhdgf<%I8=-7x{BiwLQ+xmxwiIjRy&nVb9xJ5~($Ngc#WJ zykmI@gM4MV(!yF72llAPK@1vhhlk38GTX)l7|7J0)6n(TMd;0mCUP@{_M7>ceO^7a zQJkPL&>dnFtLw8NJ1Zxc|bk#n=B>6f_Ogh5TxP}{b z!m;KNK8ak&t@EN(TW*=b1n%wLpOI$TiTU;7DrfiLUz=PjQ*S zxTD;0&1LN>2k{66%oXByM}!ymc)SNMmAz)d?B!_-$G~fW-f%tvFzrdcE!HYu9IfsR zTKJ_ISBNC~Zi>fw>+S8nUd@8FcDhQFcu}hD*2b4&gHd_ay;MJ^E4;4<{F(d-{c**l z2r7q<$ypWIOvV{#bon)u?;p!iy&c#O4fuKlcq8%>B!YtQ+a>&1S>A9n0-svpX&H=d zPo(PPV`bwHkqr=LlfmIpF*7=Brkjipn+CNYoGGcrJsjB%ZY`If+I}c9-6J|^qhdi1 zXoQi?Qptu1^!@fsME#~Y_66I}aOIZjWL0F{5_zq=m4lEfa2a#&nWb8E3bDgqknE}9 z;#;2<;%hBcVz9=UF;nSxZERU^UasvX2pO3Z6i^iI(o;qE}gJ`}xwm6$xS#i3gj-@TGJ zWtdgQl#|`X!oBD$rKe-GmuzHxoYkImMf{DX6N3uE-J)7?&Z#08RYl|4g5tOG=2=Dr znn~PV>^TcX4o9GjPM7yUdi63*X;W=o*LTrFTMKJTK_CLjM;BWeJ>PmZhHSe5SMXR^x~5C_9A!scv!DX9f=r% zg0TB4$&$EUL3@EQ&gybj%>mH^n6XOrQqt~E7qk*tk$Ku>5xw%fV!^9T5!(h|V8&Jr#?GtE{7QNfx1>s-z?RN2o`f0v&#{;> z=xY?O+@$|%uTPlK?$xR{;~Pj;^W|?P*lr;3d0fFKVZov-3&d~_L&vJXjL$6DrHT)Z z?bi1_`q82jUZ-c?z?Z%^(wVdP^q)vyIrQcX#+1L!lX0(bK+W@&A8kw|6ma`qOOgnt&*sPri)nT>>G1JR#I6Z=Ptn+y z#F4_znrl5_ULi}KURKK6d8HTdE~0S5!KX$@|Ea@CxN6s;qLB01Xtohqik|M=^oYfI zuOjMUN_^2Y0IBy}XT1rD!#Jtq`j;Cq9bsJ=->>qmF7yIKKSd$DBEAUaW*Xse2IJna zb7zsI_6vd02#={$yeIFVd1E-8+Lj)3fm;-X#rIF$iOL0d-uN;ci?~~}pDiVZiGPA5 zNJrqvJL^h?PIdRfuUtCAv~IbA0=n}~o*1y;&xTC=7Az?)$?_Oa)S_c)+1t8h%hF`x z{QA3ql}1DpRv#HLy=$p7bz~ngagxQ_b5}^-JX= z%Q4s8LtSw7B^W@C4qV7It_Mq2Dg^6GrAH_3YT++2R#Tc(0$z?~M^9AW;;Sw7O>HZT zorXQU;z@@+YKK@EF%~if<0fPP^1AbN5s~DEnT9v_jCkjo!rZ8h2D;GYV2l-%_wj_; z!m8JLB4}pchT0XLTmr6ClpMt15sHQi2U1U3pE;PQ!>+xmy}W}?zWLwm^iw161&;Si z)v$`5#(a6p$ha+6JFO`C=&xaKD-zWZu+7ze+L7(~hvKld+s8I>P){9*PXb(ttc6L8 z{X0^^>pgRVRy;rCH~;)df-H&+0>FHNU#%ySPx(>U5p`})RJ?V7i}Fp>qyrnzOREN7 zaqnYQ0!VTfPRF&QVTJ_dFPi(kH51fEM&^8uEl7{~2{eiQ;xA!~tBL#x%5?XNtuo?w zS61_e5>4=82Q|X2Qbx8FEY>**?nJlR07SCvv1Kitd6^gGKZ*=wi$p&2pdu;UrhJc5 zr)Rm_G(BSLJ5r2-`P7Y}eF!dUC8?J~=!T*DMRuPdrg41x)y0FkmJ4JBjKuOugrwx^ zMA`zAfJTiN&)*`Ma;w@67QT%|b^_^wYXu8x!bd{<(`%J)!=BhdleKev>Z#^Am*K5y zj4}&h5Jf?VE5T{rr;-*c2h;Hwa*PiA>wOMKmmWY@Tmdm8=D>`$X&7Y_@;s3zP<*{) zrK_j$C*d-Y2bXTwVtO@CSMhU(A?g`jDyLmG5Ry&E9=1c+!b)8-cFi_agLPKVe50vX z_{sMi@{bkFx>+sud+B?#MvgtnzeF5U>&OYPTh?hjauqOhG7cMO=21w=ot)t&;I;h_ z4N6_xBC=MqKSd#7k2gNI$^y0%Otz|%NEQl48Tg*|B$QFXmaSSwB+Q7+_K+XI>o!}y zQ&W&Ow3>T*YaIz=kos7^=EX?r9j&fv^y-pdRaxzp+~6qZxy>#Y0deL_bCt$t4L8QK zH$}ZOi@$ilr^a{n8E$M)XURg;I)9MBwwMi{aPTT%^!*fMiQ2kaC2k-1@eng*v(DKO_Bn3VY}S<*8(h6Oq0L& z-;X~|J5Jwz)i+wRzaMy3YrJlJ^t@{GOVyV3Q5*d;f{G0k(AD7B@&E!tk~u->08qzz zpn&Z3$Hz$aMahZfMDdcsbfVli<5ivQqUmaBb_S%jy5266&R-r zSb)GE8S>~Sjc`g5KwxnKUJszC2RbrPsADGU2A%3(gfcX_x_6)I$B_q4T>`Ke5I`>v-t-7Dz^Zk$aX{DBx3{;~r!I5W_2twC zWM}|x;ZdvtxR<|N9YM4JzUaRc*cu^zR57v1cm)=*4nEVgK}^pMY)?SJd7v)|2pE>$ z<_A$Nfn0%k@Zjd+l|jom{PX=VslQG7fL}Y=0dQ=weqkS*A8rJYk8zEdkf4oj3_+ek zd1?UZa9oT$qUy1egZ%+uhM?b{Y%GmVp}g-|?HPiXQ&ae`-^RA!@o35*>AYyKZXPoP zs!aCWEey8M64!}Wpo7dyttJ51o2G{5nkPrM!)O9fa5Rjnv_YZ)+SU?@bSmu|TyR1CKEk5a} z-JKCw&kh^|g#W+7)z=FreZ31gyRtq32XEtO5A^B&DSx#K9`6UL^Y_;Voaj?SqCD`= z;}7dk_TC;Ia|`kS!286n9RU8lxqg0_ybF`S;LQ)8ac{XFCTWYyDRb&RPwK-zD-ltH zJb;}lZEb*>93FvxZWct}1BJi`S0`a*zMHN6xQ1kp#nc~Fgl?}pJma^Tu3F(j;>h4dg zLP$q&(K~jZrhV}ezb=@kubR$$^r8k-=LiV+DfG&wiN88LvG@H);Gw=c*nfXWP*Ome z-gymhc<6#mWoJ+EFb2el931TfxjXU17J#iC!iND}S}UYa7Q*b+^XU1LPC-4q#N0aq z)=Ye(zJ)#kt|@-RzPf70IgW&uD=>f0n{0#V6Mvt#dT0As;9o!l%`GWb;6xOeU zzzA+4X69>{Sq(>4$F6(`S$SoZqY(>#&G{f1U{ah=OtEY_GP)$KZ_ zr5u5o7p?HR`AYR{x?Le@Zqds9C$)Gg&taQ-lRW5;DDbK80D}JIs3tqFlj|jpeLy@$ME|#f0YqVj^8=;KXg&xm=4{cRf*}Y1C}^3na?y>|xqzuZX3L zt_tPv6eu}fTO)cJGpGkLyvjXPErSodVf&8PMXgg$cYs&5in$|~The^OS&|Zg4nnjX zqkEK}bPD;~fzCZ4R&9n&aO0jX-{@ZgBq!ZJne*=Cd9$0Q+W8Q&_j``Kk^LYzD~t_Z zsC!Y7z6Ye+bc%6!-Id4{WOQWjRl9_N$J zBtddUWvu+?wnaK`zt_3$Psfnrad=4O+HPyQ%+McV+t7O8l;L^12&Jw}))oS8bnGE~ zJB^>$n*P}89m3h=#XHHnxW98MGN>ooU5ms?XB}l}oy@5$cjJ(5>iosEb|e+5T#=CM zs7*MwwXrKxEoCNqO%`p0lQZE9w(XesH|<4w8otPVjYi`iKVEu66amYaIJt)Qs}GKM zvl=4N0bA;wXk^0HQ{gX=MB=GWgBmlqC(m6k8}!kgw;~Gl7vtDdqy@`oFivXVdS%q{ zdt|+EDyn!`WtVtXV_m*l4-${UQ^In<96#Oe0drQnD@diCnDfZ4l5K=9@<&7K-m#Wj z8x;V3cRl>$z|}6ho4N1yTlG=|On#%*t-43awG5A;FPpp|>kHUV1j-`?OHq}my6>MO z`xiw0^)5N7yZHDoJ)hW)epE*-ebn#A?fUz9&Tgf=u+#Y!{`~=L;s|-rszs&siXVzieNKEoc80Y&O%*KYIgF6D9vgGN3>p! z+7*BocT6109~bL@SUb*izFDx2n6z9S39pQ?_TCR3J4^!4&Q82NJr8mEbhJ`s+HC_A zvKNN~@4ew^tIzVk4rXrW5yqNIz^JCa#j}en@|O48Lr_L^72s^a88lJK`C>h2$_@z! zQ7*HDy{twi>Y1 zz8pS$pfus;(HE!&G&IaI>0>N2V@m?ciKC)mKhK?l*Rsg;JPVNbm<(~##5vlaLT>n* z|0OV@U;MRru7Lx$1H)-o__@u%ZN>8q8JS{o;h&AGw7MEszJ@<2@Qbs{@pv^%Sq&8( zHX`dfGvw4+WG(QhSI(E0r5%1b&Zx;=@e1aE;7?2}1&VN@Xkq$eKK$r3g zupMumYd98s4Ulth6YV5+;Dx@hmKi1*C#$J68&gmV`H@&S1)xpLr6aY+p@=VcFSOXz z)hy&DA`czlQ?5ro(^-xikbo6DJyEVjgR_L=iG25t~hB-tHYX z*=$;=?9lr(R=wf-x)6U^D%4LQnNTcsCW_;PBWPZXH1}Jo$ zP+8KbWGm!M1*~+~fT7}>)mka{8`FLkNS}Q=_KQn1S+W-5;7#+mj`7slFECf18|-F$ z%ttuhtc$Vif_7g2Q|Op=;hqy7T-J!JU9Waz2dMjU>pq4r0_;-kE!82Md^ax_6gqGN2vBCY`P-CNQiHC3b=X$&Y zEH$=NGNT&9j~RN@69{GpmA?`HIZh(j`R1g=T9^!l0vT_w2BxkIeJHT4daCxgFyApS zZAtX9iayT+d)~ZrdZ(%&BA|sg5tS7FmI8J6)8@N;_IJ`7ddc(7XO8zvZ;UKFPbLV3 zh!d&=@cZc&j-Z%r#5U;Q?Osdx>Vu}n*Vsp$LxagU1o$@bR^2YgF5Tp9E$!?gzuM?Kgw`iOw-03)u0m!T+T1!0niiC!lhW8qQ>A!joiPOmer9`+EV z;xPZnE87=KD+mhGx$PJ%bbwHQ5hP-+)jXrnR(FUh(Q0GyA;pi-!D8at3jZI*&LK#+ zCfc&~m2KO$ZQHhO+qP}nwr$(CUHwm9M-Seh$2qzgkr6k}UT5vn<5{CZHk4!a7Q&daK{@D%NAk;6_m2LH3^!@##}I-}yw35Cqea^w z#CxF{b)(z+`rl;VZ}nbL!&bYKuk$-Y;_iO#E@rHoi15`5&H8PcsIfC#6WzaFk{jo^yLPIXiH8EGfFW6`$#xc2dM)FI z@X^&!=t>L!@iK@3ESLPc0Z6-5Y2FUMmrw(#92Y!#1o#m0xZA$f|tq*M*JSW_BFWds!Wiqx2CDZvr6Tkir9mf;YA>SnZ z{47+IS015R85)Wp|Cavt11c>xC9lNzf)q)R| zMP`{}xc)*s*W{gd#ga5agU|N<8YhPGBXvj@G8yxJq$MzcKY@_z70;D()+XR~{H0)4 zwe=M?oD9E=JYT+WLvUxNZlG!XPY7SXXP_j*dyuU0RkXU&sfPGoDi@Gz`Oil(opO<=A<)P z|4#pDetfHBV2gq0u625G%H@KcKf--X$A=;gH{ya&^Pif1;qGK(W?jh-u%04lN)>x+I zxoF95Gv}EFijoX{oNUIAESN#oLa&n`)>?xr3!j%a=?BBC?2O0mQunDk-as~RTZNO5 z?GS2ylwWLiLQ!*+6}jcoTxNOo7Jw4EPr_VKA62rA9m38&?u+PwWN8ncak6nJ1&iGU z$)Q5%uALa$=p}Oxyy3zChUzw-pffBdl#p75y{kmaxm{^cCs9n1vVrKg^T@a%nP!(S z6Bf>qxr^j(H!WGw&$A4o(O}GV0<9dzTTCkrbH-$%)28V5s-bRReLf=+3mOD2n*+Fc zc>+1Ec{81wFqL90fHxSX5|na6`mR31VD3a>{KG*_=3PiL8t%-1g8Mib0cT;DWDC1aPW4laD8dYQX6#qDY9PrvfB@z$5^ z2Kp`iY8X!X3uVP}xXkh)zKq(0qyVXxuzBE$faKT1wPGO({F8b(S!sK($NpJYR@>yz zJ>xC!~13#0S&96|3M~GvcG#DH^YhoeM2k zTWKxKBPNJeg?1ZOW>CpT1wQ+Xb$S;Ll{9azbXjZB^FE2!82$tUBBGm09%Jq8H_1G97`J$PN$u+ioR-^ob z#xO=ec)vl{geBK)u!NPI)i)2KnR+vXL4Ud=M5gmrnXAZ^9)A4lzwHd9PCxo>O-N96 zSH24e;TxV#WK2+i&cM0yIKhsFS_eJKwHy!Wst1LrDOk|tp}xZD3Gw`mQcn}Hm}Z9- zWoeXYCoB+MbXBks&avrg;MOi!; zXGSN&kULv;7JB8%w4!8w@!gtLtN)dSu z3S}WMAW#wK5(Qx{__NFBG5Ru&Mfp zCDrgKb^|nu;>B=z8VnYHuVUjc%<$`ps??`*3&ktzKOvtZ#hvQ_V0+SaZB{8$fLC+( z%Do}pcBvDdcv2)y6yf4le?yW0`gR}fxcJjnb8Jb(Z>IWIiB1W;HNe`Ur;|eIXC{zQ zRSA9M^v%`h8R@MtbEPa8rW%MSb9sv!KKdPD(!6$U|1-N@ps6~0zWx=b96MRc{>W(M$zXUauKjMK+L`^zhorw9s5n!7Wj3s3db zGl{tn52J_dLMK%RN+o4mfoCJ44MEQy>CIb!`7_xUC0Uq2$YF`k=bYA_DJEQw8Nl=89gLCYV;(E|hc^h?y^r_vnsjhB(!szm&i=fzbQAD9u zRyrS#_ugjFNV6VEQMY=lEI&iv)Oq8|y4lp`Yod_5KANNr6RXpsB{k!SL`k>bPwlr0 z;0LwxVY^>V)_O6U$32Qi&U}jJ5KktLgx4;o?u`ba*fN^ENr;EaeYBk}W3vn=we0MN zuiE>3OChL#dAKnM&O(M#3cjv_tJV}nqtk;hG8(>$Xf#qwi&PLQ9M&P#yXg0L9-kM= zp@WJK$cXg|((%puq%P8Cc|M+?t4xGf2rx=Ud6k^yi>_ubAX%?fV=!g13ns{$g zkD%CL@^YzLnRHl4PAXggi@8H-COshYGq54#5B`@(BP-Ho15olubPJy^>bgXjQqSc|D@r?-(aDUp z?5)R}D4p3kMAv)CMb>6`b*YuoR}3Os0h%c+##Wlph@!end?wrE{@Fv#-SCAoT+z|b ztGqcw$}|Lv;BahhVTr`Ydaat_e|4pV2F)78%L-G6g5@k{eV}Y;(c-s#!BF0!2?s&H z)oISsyW3(tN|eOZSt?xdY-3n+)r_mtnHK%GO%2}+5V|WxUF5g!6As1VQ1pW2=97(5 zs8m%ZJ=qc1Q!^RA-zkLSM1QHmtxp_Kk|uN($Vv)CN4mKInX>uX5^3o^JYG2)G-uVu zg+UiU>cJoFTQ@t1Nfnh-6mWT~6P5264(c(uV19VExZh=2e6?|LJ|C7hGjkADQBDgh zjZ(i=Qa=3i)TyPwyh6iW&58l(^@hLk!9SvR(KY4`uF5c8Ih{Mr07ST%=U!wKZ6P_} zn|aa4QLAMi8$X#lu9^SI3S(-%F>sI{6MQZBI!1_Oal)kZO1w5vH4|az7{PEpPgJ=S zt9ZCv9gd+CZLVB-Mmpp59qi+G_OH%Nce0? zj9^YB^AQ4?SU2^s`f#bDQ;2&KiY*=G$q6N@3_-aU@E zGQso!9b`F6hBkBx5oZo~5<|HQh%Vs1jC0~HHVT`So*??3g?f}Dh9~C}h8|r(V=%A& zefJE`z{7|km|++5WP;so{t&6=xYe0wmDnrPUBmRsk761PjuDn#+zkS+#6;3mn25mT zoRD>n5`WTlm2)O^?9u&5I?nVZWV-akXBB4WX?cs5z`sI0v0vMBH(*m$$G8(0w}B5n zF+XTKESp$l>V&vA>c#;a5IChRH3>&y`GEA7<(;ti6WpKKnLx5UiWxrj>p;=lCj2W+ zUQ)BLy8p8K!J{(9cr7M5E2>{rlCeszU`1Fz#3k-r%A?l13^M>PL#NWuu6wgOrZk2J zFAP|qM6C;y;zrVL|cteZE_p3qRU#E+^!|olnTE=l0fuQ3*>oe)$=jUvj)}0m(S6z;+UiWX z)Fp<`m7>tYRXOctnUDb^2&jGiOheV0$>o?>@H@0Bs_fw zN*dA(SQF#FwT9ud?fX$sSS(b2AA6;vqcthajkRI`D%J}Pz6Jw-T6XC%Sz`if^z~F! z!JbTZvO14^XEJB>e%oAH{d@O32NTK_+_<*LPXd*NcKg$Ud5$=ZIzS;f!c?hc7`x=Z zKqHEB0Gg=ez8c3I2noek=jrs!!ZM%J@m*)=Bk#Z(tT6mFs6Utcwu@H z(s=V2rQcv-Hb5JOQLm|&?=6448>Ab*ezguSeG}2B zxy^7$fB4IbEn*~1N&F8s0rij(`_6;5Y_7n6l31tqKhO{~gbVUOeG?&FkD4{6loui@ zqHD>d+tRZ_3x!Nl(Zj2vyhYrR$PNNSB>m4pTACOqO(1LjL6MN7635JAR3ArW1~m}! z2N!=yQ%@nHF4Nct&Hi#B{@>rFSM?CPSM86s=4X4IryIVhN8p;7T3G@~Nw#n#iK#9j z`bR66kGIwuUiY1Z;8uoLn{y=n8`3#{K+`@BJGrIkUa~&%iW&2Il+EKjO;^2-POoc+ zVR6V?PL+j4PlX#JH_uk!W8+nlgvhhU1Uz^ZQp$Y={zZ_Qxo~HlA@$l2L{vwlL;~>d zw-WTT+9NYR1DIZfbq{u8gF%s6s} z-olN!0C@`;6VBe19RthN6Y<+gZ{U(L8t>LvOdiz2^5Pd}xr62)9j#A?^t_>_bH<@E zT5Y4}EMKW`w-Y>$vuw*Q(;nPLkN?udHKhmeJ0FqhHD0BD^+Nr<3Vdnx?IfT)~faq4G(?YF#CaXBsuT8A)cr{I3ZJ|qhi+O`_NNq2P4<_C3UC6 z`;5FVwxB?!Yg;>t0gmR3q?nM>A0a_l@R3P`s z42;KTyO=Q{ippuX!lsgYt%W#rB*Gx53VYB;Tq&RE<7ma0Pl;*WJ&jsvV(Y66mwrV$NAqC3=d*tJm7T$Og5=lM(%v1 z6Hd|DR|L~#+&g_nb{ZwQ1+A$k`QLf&!zZ`;9^bX#!?o950dA-G(--y*B$LNHM%@hY z+qJ(oK12#8VGc!&`F*=eEa2wQRYL#yDq!XQmHB#VX)ioTO5ZykdCXn};~i%ICu-AtC7&rj|%0A0?2 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 literal 0 HcmV?d00001 diff --git a/doc/optimal_layout_report/optimal_layout.synctex.gz b/doc/optimal_layout_report/optimal_layout.synctex.gz new file mode 100644 index 0000000000000000000000000000000000000000..376399c76a2637b2ecabdc82d6976a2988dc8453 GIT binary patch literal 84542 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