From 41c8d88b800c603b44db91e6efffa9b98914449e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Hatcher?= Date: Mon, 17 Nov 2025 00:08:45 +0100 Subject: [PATCH] UPDATE: Adds the rest of the DATABASE functions --- .../src/expressions/parser/static_analysis.rs | 12 + base/src/functions/database.rs | 268 +++++++++++++++++- base/src/functions/mod.rs | 32 ++- ...DMIN_DMAX_DAVERAGE_DSUM_DCOUNT_DGET 1.xlsx | Bin 0 -> 39989 bytes 4 files changed, 302 insertions(+), 10 deletions(-) create mode 100644 xlsx/tests/calc_tests/DMIN_DMAX_DAVERAGE_DSUM_DCOUNT_DGET 1.xlsx diff --git a/base/src/expressions/parser/static_analysis.rs b/base/src/expressions/parser/static_analysis.rs index 9dd2fb9..1e9aeb7 100644 --- a/base/src/expressions/parser/static_analysis.rs +++ b/base/src/expressions/parser/static_analysis.rs @@ -883,6 +883,12 @@ fn get_function_args_signature(kind: &Function, arg_count: usize) -> Vec vec![Signature::Vector, Signature::Scalar, Signature::Vector], Function::Dmin => vec![Signature::Vector, Signature::Scalar, Signature::Vector], Function::Dsum => vec![Signature::Vector, Signature::Scalar, Signature::Vector], + Function::Dcounta => vec![Signature::Vector, Signature::Scalar, Signature::Vector], + Function::Dproduct => vec![Signature::Vector, Signature::Scalar, Signature::Vector], + Function::Dstdev => vec![Signature::Vector, Signature::Scalar, Signature::Vector], + Function::Dvar => vec![Signature::Vector, Signature::Scalar, Signature::Vector], + Function::Dvarp => vec![Signature::Vector, Signature::Scalar, Signature::Vector], + Function::Dstdevp => vec![Signature::Vector, Signature::Scalar, Signature::Vector], } } @@ -1153,5 +1159,11 @@ fn static_analysis_on_function(kind: &Function, args: &[Node]) -> StaticResult { Function::Dcount => not_implemented(args), Function::Daverage => not_implemented(args), Function::Dsum => not_implemented(args), + Function::Dcounta => not_implemented(args), + Function::Dproduct => not_implemented(args), + Function::Dstdev => not_implemented(args), + Function::Dvar => not_implemented(args), + Function::Dvarp => not_implemented(args), + Function::Dstdevp => not_implemented(args), } } diff --git a/base/src/functions/database.rs b/base/src/functions/database.rs index 8930eac..99596d0 100644 --- a/base/src/functions/database.rs +++ b/base/src/functions/database.rs @@ -249,6 +249,264 @@ impl Model { CalcResult::Number(sum) } + // =DCOUNTA(database, field, criteria) + // Counts non-empty entries (any type) in the field for rows that match criteria + pub(crate) fn fn_dcounta(&mut self, args: &[Node], cell: CellReferenceIndex) -> CalcResult { + if args.len() != 3 { + return CalcResult::new_args_number_error(cell); + } + + let (db_left, db_right) = match self.get_reference(&args[0], cell) { + Ok(r) => (r.left, r.right), + Err(e) => return e, + }; + + let field_col = match self.resolve_db_field_column(db_left, db_right, &args[1], cell) { + Ok(c) => c, + Err(e) => return e, + }; + + let criteria = match self.get_reference(&args[2], cell) { + Ok(r) => (r.left, r.right), + Err(e) => return e, + }; + + if db_right.row <= db_left.row { + // no data rows + return CalcResult::Error { + error: Error::VALUE, + origin: cell, + message: "No data rows in database".to_string(), + }; + } + + let mut count = 0; + for row in (db_left.row + 1)..=db_right.row { + if self.db_row_matches_criteria(db_left, db_right, row, criteria) { + let v = self.evaluate_cell(CellReferenceIndex { + sheet: db_left.sheet, + row, + column: field_col, + }); + if !matches!(v, CalcResult::EmptyCell | CalcResult::EmptyArg) { + count += 1; + } + } + } + + CalcResult::Number(count as f64) + } + + // =DPRODUCT(database, field, criteria) + pub(crate) fn fn_dproduct(&mut self, args: &[Node], cell: CellReferenceIndex) -> CalcResult { + if args.len() != 3 { + return CalcResult::new_args_number_error(cell); + } + + let (db_left, db_right) = match self.get_reference(&args[0], cell) { + Ok(r) => (r.left, r.right), + Err(e) => return e, + }; + + let field_col = match self.resolve_db_field_column(db_left, db_right, &args[1], cell) { + Ok(c) => c, + Err(e) => return e, + }; + + let criteria = match self.get_reference(&args[2], cell) { + Ok(r) => (r.left, r.right), + Err(e) => return e, + }; + + if db_right.row <= db_left.row { + // no data rows + return CalcResult::Error { + error: Error::VALUE, + origin: cell, + message: "No data rows in database".to_string(), + }; + } + + let mut product = 1.0f64; + let mut has_numeric = false; + + let mut row = db_left.row + 1; // skip header + while row <= db_right.row { + if self.db_row_matches_criteria(db_left, db_right, row, criteria) { + let v = self.evaluate_cell(CellReferenceIndex { + sheet: db_left.sheet, + row, + column: field_col, + }); + if let CalcResult::Number(n) = v { + if n.is_finite() { + product *= n; + has_numeric = true; + } + } + } + row += 1; + } + + // Excel returns 0 when no rows / no numeric values match for DPRODUCT + if has_numeric { + CalcResult::Number(product) + } else { + CalcResult::Number(0.0) + } + } + + // Small internal helper for DSTDEV / DVAR + // Collects sum, sum of squares, and count of numeric values in the field + // for rows that match the criteria. + fn db_numeric_stats( + &mut self, + args: &[Node], + cell: CellReferenceIndex, + ) -> Result<(f64, f64, usize), CalcResult> { + if args.len() != 3 { + return Err(CalcResult::new_args_number_error(cell)); + } + + let (db_left, db_right) = match self.get_reference(&args[0], cell) { + Ok(r) => (r.left, r.right), + Err(e) => return Err(e), + }; + + let field_col = self.resolve_db_field_column(db_left, db_right, &args[1], cell)?; + + let criteria = match self.get_reference(&args[2], cell) { + Ok(r) => (r.left, r.right), + Err(e) => return Err(e), + }; + + if db_right.row <= db_left.row { + // no data rows + return Err(CalcResult::Error { + error: Error::VALUE, + origin: cell, + message: "No data rows in database".to_string(), + }); + } + + let mut sum = 0.0f64; + let mut sumsq = 0.0f64; + let mut count = 0usize; + + let mut row = db_left.row + 1; // skip header + while row <= db_right.row { + if self.db_row_matches_criteria(db_left, db_right, row, criteria) { + let v = self.evaluate_cell(CellReferenceIndex { + sheet: db_left.sheet, + row, + column: field_col, + }); + if let CalcResult::Number(n) = v { + if n.is_finite() { + sum += n; + sumsq += n * n; + count += 1; + } + } + } + row += 1; + } + + Ok((sum, sumsq, count)) + } + + // =DSTDEV(database, field, criteria) + // Sample standard deviation of matching numeric values + pub(crate) fn fn_dstdev(&mut self, args: &[Node], cell: CellReferenceIndex) -> CalcResult { + let (sum, sumsq, count) = match self.db_numeric_stats(args, cell) { + Ok(stats) => stats, + Err(e) => return e, + }; + + // Excel behaviour: #DIV/0! if 0 or 1 numeric values match + if count < 2 { + return CalcResult::Error { + error: Error::DIV, + origin: cell, + message: "Not enough numeric values matched criteria".to_string(), + }; + } + + let n = count as f64; + let var = (sumsq - (sum * sum) / n) / (n - 1.0); + let var = if var < 0.0 { 0.0 } else { var }; + CalcResult::Number(var.sqrt()) + } + + // =DVAR(database, field, criteria) + // Sample variance of matching numeric values + pub(crate) fn fn_dvar(&mut self, args: &[Node], cell: CellReferenceIndex) -> CalcResult { + let (sum, sumsq, count) = match self.db_numeric_stats(args, cell) { + Ok(stats) => stats, + Err(e) => return e, + }; + + // Excel behaviour: #DIV/0! if 0 or 1 numeric values match + if count < 2 { + return CalcResult::Error { + error: Error::DIV, + origin: cell, + message: "Not enough numeric values matched criteria".to_string(), + }; + } + + let n = count as f64; + let var = (sumsq - (sum * sum) / n) / (n - 1.0); + let var = if var < 0.0 { 0.0 } else { var }; + CalcResult::Number(var) + } + + // =DSTDEVP(database, field, criteria) + // Population standard deviation of matching numeric values + pub(crate) fn fn_dstdevp(&mut self, args: &[Node], cell: CellReferenceIndex) -> CalcResult { + let (sum, sumsq, count) = match self.db_numeric_stats(args, cell) { + Ok(stats) => stats, + Err(e) => return e, + }; + + // Excel behaviour: #DIV/0! if no numeric values match + if count == 0 { + return CalcResult::Error { + error: Error::DIV, + origin: cell, + message: "No numeric values matched criteria".to_string(), + }; + } + + let n = count as f64; + let var = (sumsq - (sum * sum) / n) / n; + let var = if var < 0.0 { 0.0 } else { var }; + CalcResult::Number(var.sqrt()) + } + + // =DVARP(database, field, criteria) + // Population variance of matching numeric values + pub(crate) fn fn_dvarp(&mut self, args: &[Node], cell: CellReferenceIndex) -> CalcResult { + let (sum, sumsq, count) = match self.db_numeric_stats(args, cell) { + Ok(stats) => stats, + Err(e) => return e, + }; + + // Excel behaviour: #DIV/0! if no numeric values match + if count == 0 { + return CalcResult::Error { + error: Error::DIV, + origin: cell, + message: "No numeric values matched criteria".to_string(), + }; + } + + let n = count as f64; + let var = (sumsq - (sum * sum) / n) / n; + let var = if var < 0.0 { 0.0 } else { var }; + CalcResult::Number(var) + } + /// Resolve the "field" (2nd arg) to an absolute column index (i32) within the sheet. /// Field can be a number (1-based index) or a header name (case-insensitive). /// Returns the absolute column index, not a 1-based offset within the database range. @@ -544,15 +802,7 @@ impl Model { _ => false, } } else { - let rhs = CalcResult::Number(t); - let c = compare_values(db_val, &rhs); - match op { - ">" => c > 0, - ">=" => c >= 0, - "<" => c < 0, - "<=" => c <= 0, - _ => false, - } + false } } else { // string comparison (case-insensitive) using compare_values semantics diff --git a/base/src/functions/mod.rs b/base/src/functions/mod.rs index b3b321b..7b84410 100644 --- a/base/src/functions/mod.rs +++ b/base/src/functions/mod.rs @@ -319,10 +319,16 @@ pub enum Function { Dmax, Dmin, Dsum, + Dcounta, + Dproduct, + Dstdev, + Dvar, + Dvarp, + Dstdevp, } impl Function { - pub fn into_iter() -> IntoIter { + pub fn into_iter() -> IntoIter { [ Function::And, Function::False, @@ -586,6 +592,12 @@ impl Function { Function::Dmax, Function::Dmin, Function::Dsum, + Function::Dcounta, + Function::Dproduct, + Function::Dstdev, + Function::Dvar, + Function::Dvarp, + Function::Dstdevp, ] .into_iter() } @@ -938,6 +950,12 @@ impl Function { "DMAX" => Some(Function::Dmax), "DMIN" => Some(Function::Dmin), "DSUM" => Some(Function::Dsum), + "DCOUNTA" => Some(Function::Dcounta), + "DPRODUCT" => Some(Function::Dproduct), + "DSTDEV" => Some(Function::Dstdev), + "DVAR" => Some(Function::Dvar), + "DVARP" => Some(Function::Dvarp), + "DSTDEVP" => Some(Function::Dstdevp), _ => None, } @@ -1210,6 +1228,12 @@ impl fmt::Display for Function { Function::Dmax => write!(f, "DMAX"), Function::Dmin => write!(f, "DMIN"), Function::Dsum => write!(f, "DSUM"), + Function::Dcounta => write!(f, "DCOUNTA"), + Function::Dproduct => write!(f, "DPRODUCT"), + Function::Dstdev => write!(f, "DSTDEV"), + Function::Dvar => write!(f, "DVAR"), + Function::Dvarp => write!(f, "DVARP"), + Function::Dstdevp => write!(f, "DSTDEVP"), } } } @@ -1500,6 +1524,12 @@ impl Model { Function::Dmax => self.fn_dmax(args, cell), Function::Dmin => self.fn_dmin(args, cell), Function::Dsum => self.fn_dsum(args, cell), + Function::Dcounta => self.fn_dcounta(args, cell), + Function::Dproduct => self.fn_dproduct(args, cell), + Function::Dstdev => self.fn_dstdev(args, cell), + Function::Dvar => self.fn_dvar(args, cell), + Function::Dvarp => self.fn_dvarp(args, cell), + Function::Dstdevp => self.fn_dstdevp(args, cell), } } } diff --git a/xlsx/tests/calc_tests/DMIN_DMAX_DAVERAGE_DSUM_DCOUNT_DGET 1.xlsx b/xlsx/tests/calc_tests/DMIN_DMAX_DAVERAGE_DSUM_DCOUNT_DGET 1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..20d7133b25ced0b80139a653f01f129026b09cff GIT binary patch literal 39989 zcmeFZRa{)#@+}Mz2u^|px8M#zf(D1+9z4O_-I@e$4eciVcn z(e7c23VQKBD!b&II$psylcyDaNi2kzvaoO*N-4nk#5V?It?0eD_fA-ukB0sSB77g} z_yo~lVTu*ms<`-b!3U6$*Cdv3V*QamFM6Ocg(YAzUI0~`jj9im&E?+2|nc{ zN%=%r#o{j|Z@mb#TumqQ;ou>H5dQPl64qKwuk)<=<{=K0;BBU*s!Ouq_v+9Nb$Fn+ z>Ahb(+&^bQO5Gj`5ApYB9i(b_wM6hV&h$?X<;f3IXs-HI4U08K<^ZzAycz7yXWjzjCT*3zFU za_KZ7JiWwHkTZB^_+2a6ik-+&Q^%y~SRkPh<<^BpGO<&Z=O4-}P zo+QUsR+yIj&V#P60rD)DCV*OPhUJ}s5gWY) z^>ZcX)A!BD>^C}_=>%Dm?iS(NkSE*k3b)V;MWnt^(SwxbRl5CQ2}s}OESEznL=l}9 z>65HDg!4}t>rfdZ@<88py8krc`m)ujz$@2p#Db;|QD`oL-xdOoo92O95MphC6`o~X znt23oUr=={sMwF#a|yxU&XYk%UYM=ODKd{Sw1dkkSI?F*oXBbRLFuQ0Z2+93Y<1ph z6}pVj^R6o+41o$FXgC*{=Wy{J<2zHG@}~jn??TvK81I!|;=mL&UE4Z5jXigO!6OJZ zQFWhySmJI(fI1_v5YM!|MK)B_sZklQ)GqXZXDvmTIHx(sP2UKPVXQ+wrZM)LQld$9 z$i!N<&FA&5Or7$%XVtzou)5PWu-#`QcjUpRP#(iS6qQlt8DiAVCykt_KUes1Bf!L9 zZi9X4KRAWsz&Fc=W+VEFb2A@TbUL#4Y6~*MqJ`XBIHCoT*fm6U1jb#3iAvYnDJ|vV z3kaWgB+Qj>9fKC@JQKq$i4b$_%WVkx)Q{(~95d@5d0N~W#EQ}n=V^`2l{PwC3|ug{ z;m_(PozJ4nCT65%6LW}*Iz?rLxpZQS$_R`tKPqG196)tHDim7?}>LmsD*d#tw8mOk82k*Ku z{FnYV-~HRPgr_mua@kI*q!^9=WkH!-D~n?Rch;XlKwv?OzVB_LKlgfqg)V;AOeG)i9f zYZ58gqdKBV;6z%_5o^CetN5xll6Dp~JgLZrKkaYJry<})Ef$XZ1H?>_VkngJ)q@Ld z{(jbe{t{#=7hT?}Pt2n-y668qB0Ws%!{~GXtZLc{eYTbq><)XYo~SRKHeDw2+%tx3 zUxX-$7wexzU&}UY9j+JPvq`-FVe^7iwVFx!1*tkFDZ_*3x{47GmsRcU2 z{TuF;Rc=ocHV>M~BF>OqbNaL-PR5DS?hKE$L(Ee8qrP2U~ZUQ5_5)|Dyai?(R>JNjWKAL1EXUuIF)!JP4pn6LGXuOmKf z?@N0M53<)tk^2cYRM=swr%1cJvi$;u*%S0)$8NA1B-TN`VUA4^>`Y?0sXV6Js^H8( z{|yIr=+}Y4sd<#oE4t6@iL)fc$?5JRs{wN$FWN40F&6HRBdS{ThRo|m#3GNbRf6e-JZrwQjVd_?gTYIQrmeQy7;$_ z5!<6Wvw>NC2{-}~wB}aC@h6TEtm$2$td0rHm)5hidm#-H5~L&zC=~6SZF9q`r2Z(L8&Ogi02h*#{# z;uvdpT=`ILxjvcC(vLeKmf$F-RDSJ&BwAFEeR^4KY!QJqTEaWSyfLpThIEWb5_HUB ztaYunR#UA$T_;|<#DTV^<{X2>bKZK(G|Y`^h_4W7eRLfGvR)4ts@1uhs%=$vBAdQA zQvc>wCnnEhhE%ID-AjvEFB)z{8h6!9EUL*VTT57{%>I#U*{ZHD{!K`g(E@iyU#)&w zb*Goi1!%k6e`y>PeD+h5*z)d;$|B~nAXU0ccj z0dl>%xLnCe;YqHSG(D238@Pfi+O)^d@2KtC|B1^T#?C_NR5qPK$Bm##T-!9RU+F)J?rp7f+R0 ztXOkv<(6-WX!W^?Qc_Ovj#>KcHMu$*G~aEQc7!QYsgY9|_wjHTGv5*9Oka2;8m$zP zOv}%!h$T3LQWZq4+JxqRFwTM!Hn!a`!*>A49Qio@Ofn~irH7X`z{#6%zqGNfPv%_k z9;uBkL@P0fr@@b9m;F>9F|Lds47}HmrLcoLJ&31$M}c-fG^=kXw8BCpd}Ng=8WBj5 zj{{tTvePFY9nl+-=G}DK`Occr;F_MR6SB^9k8%8Q`B$KCSyz_Mo!7euOdj%(y&}|X z_jjX*6i~H7g$aa3I>h?!^+xj75ozTzbq$n~KEX~kO|aZYWC9)N0WwgaNR{iw7Ww3y z-J7*2Y@htLT23$SrG}pCgAK9sqL4N6( zx8u%Ijmp<-OO>NyN4Ci;cDtYB;*TVEs}$&RkMMM}fslKatpa-AmXvj-F?LVd9?o9d^UU5~No(TdZ8^Yd1gTs8s*>PcQNGAO zqGocH6?#jlQ0~9ApC@kn<8&+!uX2eSiQLTLqrIigVc=P4rM>m0L=n4Oqv+Q3%uHRq zaBub2S%!VJ%4}^Xizn5dE8g}#B`4cd-_H=qv&rulOd!>pBlW|ceSggcI=9QTi?xpB zm<5c+8(aoqSs%AOQ3*x}y>~vGh z5FYE?CD@lsuob>HJ?yb>qidvcyKJ~v^I49;572beyg33^Jm`%#hSy>Z(7jcXyO7?8 zc@|qW$#EAPKF4K$!vUZ zu->7VM8d9r$1=San}j_wqn$yW^y6~3WXKNd*KE@QE;hpPPe#1pz3~*57V5f`yT#qv z!Rn;Lw4ECnJ48-Ua+9an+2Og8{;3^@;+}<#t4Y~ha2r?ks7NA3@6DRQ;2@=G!c2En z;EPzg!5;UXZra(FWMp37{GtA?Hd}c-^$XURx%Ec7q*{;LpIv(fpcNfZ1Yyjr#8joE zU2St=L{j6zyD8Ih4zk)pyM3L?F}%bby27NLifL!EVpW=y#q|JlUFcf!0mMVRkv^0e z&PLNDRkZ_O7QB&fZnI$67M1sEg)Iv}`nb-dku{rPuOKitS_GsZn4<`S=dt)AvanNRJO zubl1o7a5*Rw_SP~CKFXm2$_|-#!TBBQ%HTJ+AyVZI>33aOJU${vKr@Z^z58-YxjAZ z-4EZ9QLCvWgVAf0wOGPL8?#+aG_gYgDT&W0%%mZc@-_2GU7Xzvke&!Vpfya>8}+^L zE7S|C`6oXGPn}3=IPS{oiMHo1o1#osSr#=|tY+3#Sgcq$bA>!O7H6}Cw4A<-TplRp z@M!Gd)n>9RK_Dx_?(8pc-&}3?6z2yNn>Q5YVQAtv6ltg_?zZWU(cF}(nL4dGSKqYA z)%!XhJ5Thig-k4{&#Uo_$*Fri7rvAP?K;I1?x29iJ{F0+tI{aK136sWeRI1p+^9L7 zpppZzZm=-FV)n8=nwC80Q>$x>yg#kYl$9vvm#|OEhGa7_+8QXJZW$KV7}`$vS*~cA z58{*mv6FSQp)^s1q109CldVRXbWb9P*0!*07E++cWa)MRcc6VC^c;Z%KSV zeHy0JcMr41^bQ(hKVaSIKtF-Pi91EjYy!S*g{>k^V5pR8SYl{+EG5abMl3-cFgIN* zU1rg;EXR~eX!8sfx?2zo|cp^@#`Mu+iPp{c}dS$?^@L*MK8aBG-mKohNA?$k7Ve1UF2Bi&%;kugg6j$P$Wt!dol$Q-;7xqaBfR5X6LjDHG<9i%v3GN)H#eI= z6(Dz2QyVOh+OTlLL zyTYqAQgtrbj>41hI)2{XHt6JJn9JH|FiMHY63Z|WyfGCLxxsB!57%FNEz7OQn4$SKdzp`(P2$!=B~_0C`U|qH|h~NDk6{Z z{zJkSRFIN=j85L3u6pAOxNo%0r7>jPwFFUxV$nz3l_~W&QW^^zXSOugDsVTmZiuBR zrd}yCBYi4?5`J8EqCoOr zJ{%ksSmMks>~GADfZF~djP!rtmY^fe0ghxCS(Mb->at?hD<^$DW3bD2WAFdXk$56_>^U9e*8gcpdtM(@$|JnhaI3r z{(wP`^p5M;GFPiysR`^l$hcy01`3Zrda2P_o8(z?3 zhtZ859Xk@$81hibjqS;tS(f#`r8SwEGhC znKaatPzBjNA0?DabV+=)n8yOFHCg+NWYO(uYxisiw)N<0Ep1&ilqO2^`|i%`%n(Zx zOq5(SgjtPoS;kHaNSR-aJy#sjEyyk?(xIl}OG;Lri^$D(I;=B0GyGmHs%D!qF;>1~ zBsaHVYaKeLGv@l&(b$Kh;wTy?CCZwb&f*a|uI}(sL+YM6k&=n=R|h+%)_1M03sW*T|^3RfCE80%rz&}I4S~?sDaFf8Gtk0UVqYyR7wl#mk+&h&-8LDy40vBq=uWv zm1Z9*63_-ZwRA&7zwM&&ubP8%P{`2K3~8N|nH-gj00g5tl+F!PK<%4aBJXqNzH_za z6}KhXgViE3jJ{tMj^6$OdN%k9nzT=CL40}GH!y4AyB?3Y?CN)~2DWBLVn(ZTF$QC3 zGwAL%o7BT?>-YHT_arC8hGR}*YAmWp2wjIU%GYMCV@4g7>n@XQwy&|rRnHI4Pu~$Y>X3HTIGm?BoEslfmdMX{%tXeqLtauzE`t*jODld@6!&tX#uKI5c;ymq-fu3Te5?w7je-Un5pZ zHF-_X(NL_x>G_q*1a>`n>$pUb8h1Oz+O{NtZ_}YNu1MX5GCbIp%pMw}7F9&}I?KTN zL@(sXg~XN?_L)mo<@p%2Jji}Sp6D9 zVPr`?KVBKoN4mf3Na1n2azVE%+~Mm(Ij+v=YvN=OacpgR%fNPW89_Zmg9gpAzdhxC zLozb^Q}6v95$h=(RGG%=8OD;rw@u4@{*;AWIw(}`nKhqPO%fLS63p;MH!;lC(DCg` z7m>@LUs@syp!1f~fb&zqNm+{%L(b(_Svm9=v$}KBqXDENpro=vobVT%+#z%tKxo`2yIBwtPrgJ8kg(Y z{blCNF+thGU68}1{QgE=_w{&-A>MmB3(WCNE~M{PH#3F%iRjccLT1oa7xi4l1hSZ60zA22+)efQ-j7~VdW zKYTvP4&{ohiCLg+fS$X|p=%3&_37G7xe~#EG#L&$w=Z4Qpd)aG1RjhG ze{TZp)S)_<7r%8Q0f0xqt(p(`J^U#N7@Ooij=P3Pp)XkWFkwXEUPjk27vOHvFUY%a z3GN4cA-Vi|4Mec~9>BC5ZVz^EoC`KWJ3R*2t@;Q(_<)rvsSpI$?}T4ykxHA4o<4Pj zPbM>SNDbk|hj*BJjpn$=xM-^_Zv(HvN`zHF^fYn?Yx7h2PY*ZjR3svpQGlnHP=J%4 z-Y7LCgcJqHXz@gqr@kA|GD85U7q7qo(*?j_>18?yczoF&Uf+XXUk^e1BIf6Ia=t*K z%Je~7<_83G0{N;H_GLN+kVgm#Ew9%@s7cVS?r%!?A`ScjHs8m8B$RwBxCRp-y2v?? zip$T*Q0MpDK_Q3}*yywFf#s<6FUyZszB57nNLwNZV=kutc-WVz!I?50$WjGiWaFJE z5@C*^WaFD2AtcVQJ?#dyOB2|}tA5$PN`_pdS30_ysJZys&tf6o{qX z3U2V?XYTj=UJ*#a=bIQV2qk|^x!8lgf_U^?jR3Yug<=G-Gwg#Q58n@cllFYoj~SE# z>~L_T83)4IS1kst5>+xEwf+SdIt1>5at_P!F>*~}l?PWpFCi8(KmPW*NVVFmruN536enE-(RZfSXd6F-liuKF$U(^VlH+(2Lu0`85~ybb*CoGtz`y3YGAbhx;4 zmVko>E9SS)pDR!P4&X6YQDmILPp`jHuzNdbd2p8Sf)DU_ctJS=?;hp!XBiBKP$Xqy z;R=o)7Xxe658*c}2uH0@kE{>?A@U#d{xJkB7YfWDkMu!HTn##QRbi>6JZ8d08@UJ@ z8>}`?8#RMaGM3+bcA~V1kr+q{Bu_403CNvHg2S660CV>9(!FuPm$T&O>4WdpN#GD! zLoh%%C?3vHD}o!Jg=0+utH*kGjn9>9eUoQm|X&>xTg0%xkP+Qy{y zUyxojIeTn_B?F`nALBPG$z((ipa9J|5_RVqa^fs^juDJ zJ~W9x$+&_@`D_Lz8GQ1Nd!(*+GXnh=@QT^aK_}J?7&o3T-5ylcfQ|J3IH1gYx0=)_Y$0iKgN$+ z(H*q{9+VmkM{@+c`(2%66@Qba>M}ot8V3#D_-G7V5tGZu{XovanWA|J=mhfb$ zB>O%rvqc&SrA!W;(P+5$O~B>YWWQbc7-c{7h2kN4iaiTh+Yp+WvtUr2oSk3`kEl3l z0iFF#&YuziHv9{EaBupT=zmiJblHCm_#rb7y8Ydo0J{}`^)T*|wuc({^%Mwk8K^sO zWdI7Zd?@!Th>1r+A6R^h>VM`AJh2{~ccW-HBW(a^UoZRN9<;3Ckep1e-!i>9(WQyMEAhLLvRn81IGpy{9#8*7@6J8>1W_5=pK-8ho%C+|D2z>?eZlg zi0st_a5st%d>0i7y#CArtc#@JHKQ`Nfk_JXm$_i!3OISB4ro$;QQHsw0O_HhJp%s+ zhd?{{>kPOG9@zfR2*C_`ODzw9dlDi509;I5EOi=9r(hW1R=o10NNVS?vum&}Ux9al zXPGTA@aMns1_t=h@dlwU5Ta>i`O6W9AJVk&d6S5F)NwtI4|tMTto&Fbf?%8Mm<@j5 zyx@w)10+Hzh5s!LD*>2G!Eml`g4n%X28pG19tt58$!XP(>w)nj-Vn|b;Ro$-{|X~J z`<;8>>ikD0k2}HD4Ymt@rgGE@0W0qzH{iqIjv|~q`DZNe9Ns<_m&<&0$41h_kO$Nh zGQg1l*1&<|2G|m~+2SpvOs@RyBmeE@gEq^mBH+^k5b1IMQvO*a&{n_z-mw6s_E%7Y zw%UI}nF!+gcd+2P`|G~PhTlKpd&tK_3jg$pKSbR40Yq?tY;hg62JkP0k|&QVD}m^^ zKzP`WTA=0Yv0qQ`n%*9@CO6&(E@*FF=Jx`oZ|JST_%?A@{ak@(Ua+7Z>0|>}!atmV zpN{|)fvE%Q`mbnGk$}{P{7yYEaytI*Eh~R|%MQ4=Jg_+NkhzCvssCv&ICsESuok2A z-vfyYPCNB`S|o+@C_{Bt#7-3G$LEPTHUcS}hngL_bcWV;(#-p8hF$u)zme{hK{NR)F3A&LBA2zu^95 z58TF|a_@8g#sJ9WX#>xrQU^GYeh)^76nne_NBxHe{d+G!J=@|{D=@GBENV zpG~&Mx7gV*D}pv~~0 z?emXNH+TULOf+^dE}nlB2U`Wo`48a}WQczcW$4F;E8yuGoWcjr|1AU{Ie_fJq5SWA z{|;9G$aFW;!vur3Tzfe|7956^XB!Go&>Gbtf@KST`AHy|?O_%Y;s+p_0NZ}(I1i@5()bI- zgVz3G@G%?zv^-D6j0}wMzcL7(@BeNOO!xmu#DCiZ&p!a@ z{~qz*0KpO>lKLlwe;a&!s`#fpaF6(%p1&#l+u&oh{$WrO2w29E6r5Jzi38=R73Luc zhro3i^;_CGNBp-vumTAGjl%yKAXouF`u<7b-v%EP z@OMfSH(sDdWHLVY!*i5;CGb)nUgpO$866*FW-(;JPYeQmuLQzK_(rLDQGd1}3!0C? zznUTv4GqBaM3Ont>mvwb4v$=Oy1XpL=W&|?T^uc)0zcsazW4g@1;$be5pk(g3F;36 zy;O>wq7qak3XIaS3q)ArwQxL=EO#*=5N za46)LVW^k;Oa#CCiiXWJv&uWt;5>kAkYyk%|70`wKt?$@E13NS zOX-6)^ZA8gWiKmG=p}o+HpAjylOf{NRV)(_v~#y+B@Y9ot()ARJ)tKVb7>WQvZ+kfOjc`{ZS~ za>}vpC0xZPwZP1ttK#N2OnRT`T98}>v-ZU(x`Y(3U=tcpSnxl8uH7k(5|q4e-!T5F z{YvBTO}oY~y_RX78Vy_5Bb^DV5hoI3htk$^EYRd8V&uD3RMk@xhv=DZ=%=d1letuH zDnusHwbFVwH*_w!5};%HS7JOpoSDex-!7z{oTtiLXh^?OanbIjt>V_&vh0LK^&K?v zT>0)Ze@oi}JC{N$85`pGY%_FZ#usU>q$wPh+%f;AUZzoZiHh^9VWg{nj%fVQ=ff$S z20l%#uZlzL<|hU)KRsnW!Zr9sI|MRd_Jzzju*vDmFa~TuPWSj2=-U>H9elTMrpJsN zA+PTW-{Dai_i}sqGXH~M5>=JWaadp7QFRL-DL1*datpKI8!lZ} zpoDGnr4Vrqs*FJ^sbC~liLL7qDiPTH6Aht~306a?}ter8D<$l?WHch&` zkD{p_(S$nwslw8HF<;!#SukJZe%>Y=kIja#-ixiV$tK-;H+U}IXmOH9J0RnASBJL3 zx*o1XIAs+LOM@q0^+ZWWq<{~#Sd0)#A$I8rUi~R@ezVvp0gAFmzHa(^(sNkq#VZdU zJk-~;(%d5RZ^gc#^DKM7%fJfY_r90@LeZLvNH%VE10TYzed|xeKe(3tjE|ILZpoU+3g8E8%f{fA5oEQ4-Rl98-U-mhr8Xr0C z&7}+)t$yC%vT$=OVF|1lG63tfa02|ZmP!5sSQG@tFlG^%K<-YR;--SpsiMsIQ+BzdRuN6z9nR01}Xp?>y1)iusi6!NarV5yPZlaH!%%;?2Mx z3Cj@3ge?CVR+KT#r;1)uzEd7XJ0dT1Q^V`@UF_xJK#0?lQ8p}%+nYelSNY$Y`{}(t z;h4&br1K$_P!_yGV^pX+U{oL+aYiFL2W;o@S#!(z>@|sy!wDI_tSjjGOd!jODgI^i zdq-7X;u`@%F=bLg?GLE$i@V|Aee)ysNp#^^G8?*xQg*tkq zfn0lftlV;Ra)hP2#q^qk(@*sye-{*J^y=(LGiN_ij%Ro)lx^M#%aw0j4_7O%?`}3S zlAe34!_c1g|qS9qBz3uIn2{t}HB+PRW{|-yIWh>>K8)3u#wm zc$A@Dkm8M&*jpnBG_bl)IRvUuy&fE6@o5&C)Lx##j;u*(+Mxe3Q1}U6VJ`GjSxUp{ z>!=~-^`s8zr=!PTP;Fvr;p*yOF%rxeuH-?!HwA)#DIWPUrk3aY&i2(l3@v6|bcJ*wUv(yzK zbj9f`za&)H? z(2Q(ik3Pd_*hbr});q5E#^w8COmWxT;D_}p{%o?)$ZWjHcK6IQv1 zy8bw`*uFS}wH00`6d6`FZ-g*hIDq zrMvn}Y>;02W%ueaQ6}zGX)jsG)gvge5A4l@oJ3r)i&}V@Uw9#4cVS8#$OR7UhW>({ zLGLhQgEuTSGoZwT=T}ziaH?*CR4?)$9+kY!ocmI0DZi|d0`?TkvS^q2Z+?Q=HUq6HhX`j~2dI5g^h0xe$K@wt|F}o$+ zLH?fVAYYEbo@au2Xhzf{({G(AUvV6JvydZ5q-ex5s&Cp`X^5dTzfa(I?Ph4hx$*Ld zCBA(2<(uIV%#*>b?6jYga0k{bIny-Qr^V8^1PyjyyI19F)wk;dkB%qpxe=w#5A&uL zHKaOw9IBX}H^`reFQa+=#Q33Fe!=uSGbf3@s|&S~SWahn?nPO&DMf8}E-s8v`kXR< ztsl4E@U9ElMtKbGrADV&nOL}kU6(~+%*GJ{mD-71+$&zyR} zICNE(W;!NPw=oTG@^ZB_QQk6uUXXH(aB;e*JfZXDH-n{_K_}Be**J7a)tn@?s0fNZ z=lPZMz>JrZk zMBQ0l5vZzohJ1jGxnS0HKrcA8`^havnH-v>fwiNFQ>zBCWFTUkl8qfD(QY|bi2v>8 zjHHR0SAMC(Xt@fZJ1oiKcuX_a5CvCsc&zus{=v_lMU)R|h=@|=Vu>RmB7`ZT?d=~) zg3-+xPtJpwdR()5xLBh2lIhXIGfahWgXl)kVU>({_0aD>>=LApLDBv4pMo8qI_(YHQ^A5U}Tq22S(6gyYe zQ`N2buY1$Bi0UF46bVNR81$lVK18{w4V3ZWVR%%`A(*N`w{@c4{UTPU5mH;Dzz9U3 zJflI4vZNrp*h)t`s(M`(YHl#aK`xX%UK~8?WL(-1D~{Z<o|jGEH$>3+w?0?s_F;0n?d3RhIJF3mI{z7jrjq6RjPR&Riygx#B|T+dm4`Rk zR(`E)*gxl2FOAbj(0v8Fk@a_yjsB-!ODQOm@?&1BDq4w}rWzN0${rMwg-+26F*RlD zs}(G5mU-R(J(Djj`TN^*dK;M+?M!`GT~XVF-b$liK&t-J!Ed|veu^3)O6)Sx7{A{U zAepW9Ad)Iw>(Maew?`XwC1TK>?`lH($%Q#$bC@75OP^6ls|KMn>)b#C`hpQ#3b$Et zS4;n<-5ca<_moFwXo5Oy(+kbDnN-uWkM{eSeVi`w5$bJ{>5skBrXC)b>wR@M%hzj447`JcZR9 zUwfjGc}tVLBneo_y0Ny)>I78i#FZAGBqyUUx1~jZ~2QB&Q-H^tIzty_cbECYY}M8WT=iUi7a$br>n3YbP)* z^w0nK!@P)DAuHgAd7Sw^ww|0OvtMBRUM6mC5+<||Dp47lHVzpV*%Q0K$wuEEC%sRH zlpnuzia%}&wa8=44}(_l@+ipLZ@f7j$HlXZK0HJKTFxDHS(!o~QWf$md7nyU(Io%8VMp)G(0^ zXu4V#dyz?cKLakpNL=4^1+t5Jv#fLm(&13>qiE1UDF#2oHxDOb66Pxl!H9Hp z=8fxEJ#X#TgOn0*ktKcVx)8vq>#)OnQj+Lh{64EULuCA^F!;H#LpO zuD2Efn0HKHRc*%OE(Vibz<3smkF&yYdEWNJA!7+nnn zOa~hB=Uh6KGzE(KLuf}c_87b|(!CK$z!%DZgXh#WTgY$sUbumrCA~3V=4tO42;xr{ zM|)yV*4@hcskpn<(tv{Lh&ZDoke$oqwf}8bV9KP7k|mA``~h1e>X&MNayc)}BNjvB zL`d#zgHQg9_)hIPS-ry%ndNS`CMXq+b#+(kXCoV+`x%hNrP_7E{dEYav7|Dc2XwWx z)d;*EZ62Ga6lwJ94lBBd>?l+GI6K)o2k}TvgU(Nu$7BgV$JZ-=J1+uQ)Q%ySYbz0p z^5Y7lL~%~f>g_C}#0E(Grf1P!UftAO&W*fys`bS=J+t#tm9xGMF9KGwpAu0=w1+gDz8fO{BQ7k%WBL&M)Io)M~oNfUlKSsgK zaaldARYs$}1I|vgcjfC($c&h458&%Gs4ZBdQNL`S$m(IPhO1y8A2D3gq=h)eOo6(K z>M(W-mM=)VM~x>^=ye9+G3j_%d;J(~BV7gJ*xGlZiaSFA+@b8+o$v!mQYlP2wBPC9 z$Q}T&F~iyXieGd*SFZ|-9Sw96H))3{rI+sbEb-2-SfyLifsflHAq6>;{U&fJBeaBa~zj`~$`{;4T5dFt5!vb;+l!?fyIC zyS15Ia!SnUsCEIe-uYfwnOsETnI!7SLy3>w?S&CpM#EP}=a(qlA!;7B;xhipbBPz@ zLXwRdrin{4Cc5jkTPsy6A8WElb3;_y;EZQ8>F&+$*JChh8w0dXmREJw)s5QyRD496 z<@WCC3oxKdGBrMg$w>54Sdpvgn#3FK-FBob+}=sg%&ZO~EFq4Qa}sT9lW0LGsa8AoW{b#l7R1_y6;J^A(( z(hl5RVtWdZuJB8#c=VL+V%0AxYLBe#)?#+LQ%b4sf%iE(-8|;SnNm&U6W_?1bnBY4 zi?(~;xV^(k2??9ufSv2}>R!dxVIj5<(`9@KySFD5ZSqECCek%MnMN6@8r6vJ1-@i- zpxeh^r{4z8ewy$l%qPN<>^EzZONBuIIa7`Xd91y~;VOz@>FcfHxnDG081(cx zq+q?%z=Gxi?KC|TI~zI0FY4ZPrEa#c0a2FKhfJ|nSBJ(@1YY&{r79XVuy!=tV#<7W z;T@o=qr7RGOZF6f0mD#(U~z^QHQs-b(7bfE0KM}0JI^z=z%wMsV0=tjHn&Jul*I#b zoToS!w=7LdMO;v9v*q@Xi1xb_O^0Lbz+YTn95_u3BbvEfD%u>x9O?LmFwRYu1l`U= zS5Lu(kfZ3b>yia>o*T!FtbnA)N?)p14IG&Y#9jPUy)=6AG6dr$xDxnpiE|enQuk+- z_v|qDbhr1*9D~EXr?|f^qj}T^bI%Rq4x@G|V;Zm5##RQ-mjrh_N-MY-4ZHgk>y(|d zl~zP5gZ&wy*X(GRY=t(Hs>En6@-MO6WT`YXD z9Z!lE_^dHc>z|mI`8g{v$uH3($ zfxWwT(0wX#a%Mx}N*rK~u1c2(_M@b&)waO(gHf`0=J7Q>Vm8DMa9LQg3Ll4WqgG1l+8-zDfyd)HE(WC{cp6j z44=sZ^RGW`hVbm}gB<(iCq`RrHOFknBIk+%H1{LB^b;mn6hP`@uIg_UWOn>7WX_R+ z|7XGdFSB1~#bo}H7 z^LJ*N)y>{iXPn0c5sC57L1QcDS`$k+&y|s8#GFba>5lF54cHfpbB}!Q%Q1|p@(AMm z?pVuLdHEgc6Uw;sFE)(s7Nf8*I-QZzZ>$McpZGrN+hC6?we@*$b@(iEj7Xb{>wV-A z?95?f4V$fX#gaGV>jt=RY1BEP;s+t7$}$u`w~CG8Y|`11qaRGltE zsWCiDSdh`Unuvhn0JEk7_e3K8uLK(HQ zlRgW@oG|0l4W+p!ZMLdW(50z^LRcZ zKe5JOw#6{@hSYwYwBnq8dNQcqnFSsio8kLU5oY;Q+qvoY%B=M?DqUB)x_jaod8OpV z+x=HpNeE51w3OLCpXlIBOf+BHO(2^*!5(?D&PVjU>w1>W{wT{Rs_}c@7lhe{BpKX~ z*BUn3A1+@_s+*3YhuI=wW6vbK4xIGN&HX{we?1udda8g#S4ItEuBbF*LY=ksyw@4* z%sV}==>Kc)Er9CSwsuhn0TP0{yC)DJSkT}EcZcBa?gR+#K|*i~?(Tu0NpP3omf-Gk zyBFDKpPhUDy7gDx`(C|z7rNH!**(UXL%uQQT)o!p4ztr3ukF%xD9%5I^H4Vwx)K~B zp1`#vC*W`H4-htt<(QB*ywSFgw8Rv6D&}Mug{^+oTp?Ub?`*Ivd)jBrUdzFZi+8EO za|Y>V3Y|jC#p-BnCabB)vM`yC^6cA>22pj>ve`#b+Avg}N^fFL>y@`pV2h@yh$S#vE5W9MH^nax>cv)p57ts+-52Zb;lti4+ zd08sPJHRJwh%s)CF|AaCKtE-*R=%6S5V6+Xy8dRK!K51ij#{?$%NjI;B(`54t<}}I zM{_rt*2Z*B_XF40<_^&#q{FjWUiJuga-tQmGs_4UTK0Rbl}A<>kOcdMi;I287E zo-)D_Wb=KR_g5fbu51?{O%imHNk{lhPhjWY!Xt8x`pmE$5u4>kzhNs`P1MNzG^VFg zCa!=jVe~}gBfb85FJh3IhV=ohbPIhT!4FmaXr4Oa*TFE9Mg(MmthlNv)+;aPwo*!&qL!Dt3Zc z+a>LR>j9HL*q$ZpidC31Qu?I^D<|vH=qqcfcxrM#3z}<~uEVy!YV+|H6mhOSJ3<%o zFr$ULM3+3X{AEGlq$VApr@D~Exjir*`&gMIzMvsG*fLAXiaeQC(XOT4YG=QpcV69) z;pNK5Ucb~G>E_NM9d=sL)4%zD^#-0A#%Sx8yBTM*vR$FZz?v1xI_X3~=oD1Sj^ z8U*F*DIe|*%tckBi`2ErIW_jN7ic=HDaTe9j@-}Lsy`sj1fDDWwjnzAJ?Wd7!XP%{ zWLmKrzz11~=E|x0$|7+^#^+k_R&=o(zq3Tjz-(6Fjs9kN z(g=|w(|e~ONw6A{k8cYJV+$8@p%pBjMb6^!;Y`DaZFc~0tg-OG0P&0z8q?A_!mD{X zBTA&A$W@uit8VxK%zWj->7d|e`ASY%3SFy5vv}As3_FSo$N4R_y{+E0CdTobMTk2_ z{_DNo@t-_u4P$QT72(Y`$6olv7XZpz#09+y023MyvxrN+c$sBp7H`6)&E{Ea0&H_W z9`{uW?{2y4<@@LsXp1g$W65%r-OW}B9pBLponEFIo`L=iSr*^s71#<#_!?%nEQr#g zJdCWbNX0yyjMCkAzUxmXG?i9zY(-b0Z5x%f9jte$>Sk&q$u}i=1)KUiE9X5{u^XR6 z+%lcT_a%_rXyuvF=t{~aD&{4z8mg*p*vMw+v&tq)Qsp7o8PmbuaXr$n4rs*UDBvC# z{+d1awvkQy%~(nON%syY0$95vSta(r{gX+it3J=+^QZ6G1s>D80w`-r2%aY3Na&T887jtIk~?$z!|oI?%&Hm_WrUe)*6*CqtJl#4kR` z@oV@u{*@?$Sw=V&M(d{J7Q?}7`xnovsy;ZsM}1@bGY!ehC>D7{0e|NE%yD_3{!yPO zEMUR|L zk|-9m?9h?R68xAW;Nu1OUpRj%0FKzW+zbm1t0=D5p&*v*eAXWb_gi`m}gXz(+| zuQ&KNp8}=&cw6j7_j$5>z`7C1$)u^JKA}-DkiE>kYPHxl1S|V2F5Det-8S0mu8JDS zmJQxxWs((qKN&fg=R~XwJjIAq@d8xmbqzv_*+-70&7S%OW}0nhmwn>s(dLM2coAW4 z`LV-kT2)&aOZ!dNS%?r*ou~@O^Yzzhg*F@rAvWXS!2K*=Z3UXJ_5Hxv8>9x67sW6h z)osL+Z5rOLs$i$bW5)faFh{ReibrGz}FN<>x|H4c;aNLjcY(6Gak#UM?M?nK!;{ARGB3FJrr-D z?ggQ~Ra0R^dYh$uY0F;euK^K`+zgXn0}Tn3l_={`|UvV#`Ecte8HK98?C*SgI-zy5OevZK1DXS(qby|{`r zxq4SXYu$@t|4UN=FD-xbr`8&hD{o-G)w{C;!)Z)=(x+BOCo`YP75-Bk?@d0nFuTb0 z8Eu2tgV@HJcSBecdOe)6hHO1lGga@ro>X^DtMDUEIQ57nVm`HEEZ^0;w%byXZb}Sc zyF2CSTM>=h%4M)X=yCMYroeqsVXPK(ks5F@w?1uklbF6%pI*NrYi&ueZrcCQAm$B@ zW#=LsMGb>WeXS*(WJH;Srg%ch3vj~q?Q*qVlu50Zcy=ml|1g=D5)%iB#AJ&+EknL0 zL==nTd28wt>LAJljt_0CN2M#D)iNFqUF>W!rvZ;_j4@Yl3vnq%RdO`q6d*C0(Aw|IHXd7aJc8+%ak zQ1GugzwavFaY91^?w5x@(@RbKUAp6z>;=tu?A1`Qn|<8%7rkHx50wZ6m5nLu5@UXL zzBuPuj-?2VvF%syR4wF#*tG*cRR8R#cla_sdUxIP+4J&x?Hh5&Y8P866A^=z2DV7t zbd2doYH$Eu|z@jF$j=YQm;dtYDNHleIV%oUGjCobgg7zc=GnR;2y z1(}XrhQ_ngdnuxEY)%f|9ev#$f6>qKVyh*zgs*m2gw?`}Ks>p|(`w!k&244dvu%iF zT8yXqYjbVz(F|Hb6JyO*v-528ilg?<~K<>&nU6KWok=ZlW44plRW!vl&vT%V)HA zBlu%6#{}wRB?4%B9DBuPNInhU%(yLeeBR?@Wa#tB_0hbV$Vf!NJo44&gC2qJ@`N-V zNAuCH!+;Ihx5om^B#_2~I23L-6R!JlM*F2Ga^dL*|U4BZt;yBORGFYKo;_N?3tqdP9mYc?Wmv(LnH^+tr5XoJbdKH1)c z@29}H0P%hS(x~X=49cPIjJwvP0I`&Z;ucr0{|@o^5-}-Cu5?Zf$>v>{*{q&6yc^RF zebE+hP@B&v)$L9eZPZLvRvZ4xe0TV0CoAC6iYP{@TS8& z2FN8q*{mf)$@SWDBwB5+rb{aI=fUOwl3qP@d?pnfK3HuLd+dMp5^FT@RU>l$BPr@0 zkXl-*ngpPJ8VFD)vTF@FMZ=FOc!R1iAWeb|bVINw?bMV*sL6WlQT*4x;8kU@M>n}4 zG(Sf`nnO}ZgJ&3QyoUoDRK1{)bp0Bj#a|m6kq>o~dy)^K6otd+y5ug~SB0*E#Ru7q z>!yvf)Bt*;nV+CKeMk^y*q;FNua!zrsaEYxupyKPG^V^MB;DSo>xI7F{NTM$@rwCZ zPb2avd~7A?HR@l=U}q!wAXl6uDClb_*zw3E=n+x4XM$2O@B~y$V*(6Ad=jG$Tx9k# z6~i#ufCEI)!vWoiS~+BbtqEE=vRKum@H4_u3jMo8iNikwlIVQF2vVSn0^X01!QISI zFm19&MUi{@OzxSZa5wzg7kxpn7fLEn+t*TKPICN-tHRpwC;qSHAPq_pNJA;kNsi~4 z9PcwZK1boJ_6unGU|5OZNK^h^7$r2TE$L;p&ET#aoNpVL@xrq%s5iPkOlE;ID5vnW zG}!qx8WY&n{b){Q-(RySSvd$#k`c$nj^u9*@l*)&4o}=J?PXpFyetU3JR7>sNKq2f z4qAs#I1I6(0LaYqZ%|PzpU4~wtq6v=XHl^5<l2@x-n z1yOB=01B}(#<{9!gQPPk5l_}U+tf>s;`3>^$Zs;z)Uwh{r$aGEUu?jWp~%TTlb3ZA zz9U|3_tc1}w*l0=BtF1D5thvE=9(heN2AH7N$?be+YF&1{w$Z3_A|J75;y|cxUy~* z>)$48d;kPz-2hs5-nc+C@s5VCH_K18d^JdDEvODMSrPyOARD0E6v-mrn|nQhT~Xot zT~5Zub-MfAUYH+4?Z}a2yNk6@33XCVzm>cthFEHa2U8ny?2mpTEao^{&fmtSUwe)) z8@TddGo<$C+irA#NQ+7yqAL8qsjBPq_G95+z3RTtOMM{3+(p@UFUD4@?V%_)Gt6w@ z-V?yJ0&txiV;DP3u*LpI!uRftIYT-T)@1Yryqu9{nmjSmBFYN}4(-Mx8a~k$aO%(C zQ~#9*xkNK~gpPmtwHE25(;fg9AEwL#tfS%&vpx?tyKj02=tRKQn~QbLZx3ozRt zJu}uY+AsK%PIPb+7ON%!nIO@*5&-)A-NO;gy*|T$lM_=-ucC*m-nwTIal$(h%3Br5 z0kH&trIb&j0)VEP6_Bzl5O5LVEKE2Lvx!0v!AZ7VW>TD}c95%_p0|DgfRPatz;$t$ zm%`jHBX)sE)!GqHWbQ>^0Z{t6;Lr1lcUVQuU>4{vT`e=sl$$n##QjY^6aO%p7fL>V zKJ_R02?5?=>~IXgifW33a^yp(6X97Wzuj5ST9;BJmBjR)K*8+=6yM2zZAs9=F=MV< z42rD~(eDzO*Dbd^>m~$Xl_TodtC3 z{IIQdslF{}25`#K5*?_fI2aU~rR9dU<0vXt99Q6+7A2`Ak%6K-d)Dd;te-6 z+E%o;?(73SBGB*EJCA5{0e>Z?n+9bn&dSLagHG&*KN04Bf$0MzFK`Y7_-x>BjRA3P zZ#7*3AK#}F=)?;!=>P;LIdan{od>!@+}dabz&mLR;Rr}hZvd#u-yo{;Lj*#+athqx zEr%7TIuP}UmZ3L8AWjF$DHDIimunCOtI(x-rJ%C`YzWW(47`*d!+6?vuVo#Q8xZ_d zR7sw;YvEa?CtHgi6c7>4yR4V(Zsd%XwMVwhe4LEB_kjlMhDv>FLz0qE!DAqlCU+xV z9c%;RIr!%Mocw^dz5wn6)jb0QTciTr0Cf%opXt?ldyBL1MFChWCNu5YWw;;e0EGa^ zdpRH7S@%qmO%!vjJ~aSnQ3YU-ue-c z>I7niyE}II1sPDJp-wu1(gPTs1Tq6e_t^Z+2v!at``(aNb3j1N|E&QVis0sY|K6Y%yrY0?g{YQjpLAg2C=)P$Hjr z;=TZKV2#lZkd-7GCc;~>?jQ~@4H8;~+(47W1-t9_i|sGDZzQ3(09~wSe*r*q(MAVg zHHRUT4q|0(5Iyf~KFtIO61NC<{RnvBF^Ic>G6ZP+E9?xa2ewbPy5$QH9{#rLPJF=a zF=wCyjxa31H1!5*(*0o&JV0zjfnozf4-odZ=k(J!LoYzjLfmTVVTw`4%ny>D>f|l> z-;-XR0i6Ow>tMJRuc3ereg_tS1t<&5|9|-y#NxdIkc9us+b08HC*V+be>%n+F#5MA z@9WcV%Kt*s*)8Hr9kIA{I50Jdl1NzdY1knS0mcmh-imez){{u4Uh^@r|8=5GCQ^XE z(;x1n6XY@ka?=t>3!v7Z?F3!=8!O;D5rH8@`j=t^5XVIWDGQ1K2fHcA2A1ZVe^Bla zl5S$i%UXiDUKi0F0Cd1@N-!G;p(=H;29JZ|4IptRh4PXYs16$$21FWzV;KPaZh1jB z{IfU6VCb&z|J$E{Qvasc4=Q|nBFA*k?#5(VwTxyQ~OK(fa;!HOq(Ij zoD}^rfWZSPdZ9dvFPH&c&+A2iPWft4j(}GzWWX!H4q$PNCxAkr@Bz*HLi5)yFbvN( zw4V&zkGbw9+_Q1rqW5~oSpDXKD3Jo>m1&Rp2rm#k(7ki)pkJLO$ZL@n2mm|*0Rj)- zctA=jxC;(czvBYh@DF1lL4ZIO5-JE}|Fc{E5w5HoQpf-zTd)A=j8y94EL>9}0`#RF z)XH7wN-P<+QNfu7OoTLk@Ksm{3tR#~OGp^Hj?@VM+J!`<7e;IE$FjSLSPlt5N@|Kv08ta7 zDWtCd?luybkkmpl1(3=1SjJ@-Y8(xA@mT?vnM@J3>nrTDv*Q42Q(2 zTSst^yw~wR9E7A{RvN@dr;uU)f32-JFh~Ld?`49p__qMw&$Ph7_%AsZAw)n}X!(gi zy|#ut41$0o5FP)qf1S~B-H8kd+Rv5>aQ_TI1?a(!lL1fySlxi2ECE3QLA_4n431!c z&Ojl)=L1WN^IxSUGi?f-w%pq!^sfj6{VT(f{}lmHI%pHX3$ouseH$z?_n`c*EdQI8^4{(shZ8M- zMbC97F$4qRs=GjG>w(mZk$4Zl2xibpL5^#{d7ufzhD^HwB>!#azepf{Pj32Der>@zrd0Mf~)69?GpINcQpqIJD?^pXb7mL`v&nOH#Z0d+ZKnYt<=A2 zh1l-`3!FXsE3#L>66Jpd*#itR7{ikRUa(I77WUuJ^KW4PcdYyGaQ!ZFf4TMEXTQ_n z6hPelZ0iu1jokZMfEWNz)Nk{4^+;HNiJwgd#RUxiCXx$Xl>pjp!ru zm@&&5QQCqN;O1-mUYAaH2a{3H?@0b1_`UYgjis9ounu(Xzg`E*3i-Wu+-xN92rS_D z+9yQOd+oT0>RHjs>}Z?wR;s*O+}#hK;!@07qAPoyB^i)^Dp7fAM>u%bZ{wkR;))%A z)E&28DFc1zxmcd`EoCwY)AKH&0i|s?aO`D)VZVZ{9zIVgzmG<04%g;;<`p%;5=A-u z(Pw01)rNkivh2mR6ah+pxL1Y9avY&C%{Udp80qmy2KsMY{i0#=eK(MEb@BO$Kago9ueYUoX6EokutZWhRF_ z=%VJ@s@U9xn)>@M18a@#RibNIG}Uib8|Zd=FkFYfpva^8n(Zs6wU)ONR?5$qQ*;sj zYL-)1$2r}6WX=DoNzO0j>dGufA4QLUH^bkvki8I|h}enQR#cniYaqGMjJ{OW*;8-d zYf7!_bep>eEzcd5Z)>2EFm^hW$dCPk9*Nu~!fbz71fPcXdogl~=Bzy-2l5TpPBF3b zcSeh;55s+NIfcK{k}anz6%Sf1TI{!jIyK)6vx7egiZ=YoWZR+ zxIj$urWWNn3WusJ|1FOPaQpq~=_4PKTi4vr6YKWQr#k_+g(fC%ZqKd{SI$;e&K7<= zuSza@j@??}dWN}__G>bob6dQ_NZ6Dg~_i z>E!0%g3tg_Ld8y_pn6giXKP9anug)!G85%(%6)+jRIboPFV*q|8Y!%so%$|tH}o&L{udDPl2#qM19b=6*pkadkxqG(*d!ekM4L(OJ_5kSdB zRn*6H4?iIdz%zUyIUT_Mh#5hB{=yb^ChGR0ot9FO=3;2M1|>|6LaW~rH_NmB-TOqr z_q2Vl&`I3GzpvtZ^(uT_tY7RDS5%-3hQYoftb>_N~^Yw@Hs(72{Pku#PC-!!e%zP7_lEt6#1Fb1`C>XGsj_dJ>?!s{&z~nU zl+kikIK((f=*@+Z+ZB-3qi}z1LPEEZSb9&`&9HdeGrEUTOGh|Nz#`9vRqkmlV2wA@ zp|EIDk|5YVV@~(*QYNR`#Kk1L%vF^q{id-GSvQj&E6ODtvp!t3J^!AZ2gfl34Dln>yfYqVIX+P?el-jxSsKy2cnk}!3 z>Lo%k{lA^#M!XJ<&kyb36xg};%X6;5iPk}FYV}wBM2;shJzSK9O^HwI8&IdC+)qXL zJgrWL*rI^Ue%?)v@DtqCG_yXc(8hT_5E*VY z(|P?Z(U8M0RC1O)C!#f8X@TAN$&da=WlVD3^O_vfAvMwOQTN@I$A2M~H8S_zwPz~eanxM>e9 zkv-_O=(4jzIkv*L6k^U!FJ#3Ibs~GxN5d4lI%)am-Yp+*4$o(SB_w^NjIA0P-|s$M zw3YabjPuaJ>0L|dAYHTy|ywI%1n-?`z_D*ua~2GZX<#^<_iN9ax~IY zi3{8LZN^qENtIpL*GU@|=)QPOVIIa7j&LfP@zOT}%R@!J4Iqs3gim9SzMfH`cE-<( zJSS?17xcM0_;9teaXRUfVl&WxdF^W5w{>*W;MT%C?ryN@BO#OMcsd@Mt5LH^{Vu?{ zbUD$WSl60Hg|ck>9SO49a5R>*VOR2Z{RR&s+hw_OcB|J)12t5kdEpiB@ch&s5Z2PY zD?wBnc~50k{*Zuc_yP7S;=PAm&_xkR;$rNu7)Z=CXjM>`p808FMsR_x2?se50<`({q;R)v68(yi5q&Eba`NL`=c^9IPtwxd%4cmS zQc@y~lp|z{X6zNYwR>>|S+74avs+x1f9xzRP|8^iQ`~+aIv$LnStBinS!M{wWOJgUje66z$x< zKbbi+s$1g_QGdQUZeOD{bDfwxSA@``orNjL5T}$%%?yoa@NSuev)$?&5A|hr(<9eM^ln1u%8rYJ&OFSgC^Qy$7n4jgxL+(AZr?poTI{9Xzw=sMoRdW&bh3-uqI2XYqip(Sbt$aiVhQbVNRGc!9qCY@vDkFGLIx( z6djSn=6NpfK)lnp95F<_vX!F44=g|6=UFFqjRc#{rIo)+q6rZFZ+<`*8 z65`tXmI&`vY<=sNShXpP`}(tSVf)2>ZP%qlk(`VD8O(#WN1_b8OYxboMRME6@=~i% z@yk%0;WolNj+m?#I-|{_BqDn6YCbIt)?~>OeWxG8x9Sr{kfTF*yO6>P^j!KCH|cvM z3$??YSo*2C!SeSs^L9A{g9Y_rE5>o$H;w=eOJLxc1wJCYN^JUC2)h?OZ(TF2)8w~D zLWF#{e%U-|C~jcQeVRZ!mV2zVGu9yc;!~5DgTH&8)ll5{ zLq&TR57}(39-NEBHU%8FOYK(ASk^thMe{iX)*V~^Um1~mi_8{V9I)c#o4d-sdrO)Z zbal?2UdUy06ZV-O_xscn$7M!2_j~Y2@n`eVDazY}A8=;)S((pnw&_mJ1jjyhdgEYjyM<$m9 z%c7rfdZuuA3X!DGZ}c^N5;TT=bJ;Gxa7K#~M!WKLz}e zmd~4$`bqpqiaS&KcUbky0)@4#$yhQ(3^%2?xQ@Dd)R*%6^zU^jdx<*x)oq6MWZhqW zt>3c)o~kP?QSkouHIZ`{DZ8oy$~!4bN4c3U(MexX@ffYN7fW;KwZ~WIM;sM;vVT|!Wb+CNly9!4|0({`Lh7F{{9lq<3F?K9vwHD@P6hJm-~B5~$~ zuljnSySj*GxE$5!p*5(AV*npT>QCabZ*tSVaWT|R(Yr`PbZzRyPE<_D)TglvI(f6SE5SYyeD!aiSOi+O+L}*oTWaJ z|6!(JDDX8qUFf3MBx9{O!Q|S9ajq0jcqUHQ&z^&yf0^?MUD{Vp1Iuh;+#7mkkxE_l z>Og@pWE2yJ+i#e}PY(#S$R7^$i$J9D z>u0Q(mj?nFQOz-;=;M)RJ^h^Gg^2DfC2(ZW(ypvw4|j5@GdB1F-qj>Z>eu^sRul8Q zdf;+O|7@LGtLx?HjCzD@^j{=V5#jXBay4=Q4q>q*nQmZywmZ9I&Nm0lfjtY=#uRFAYS` znp*k2yp1?TzY2x4>P(OunXZBbv`NJ1YvbxWuPCI)#^`O7(T>&qLhZf|eCbU)v0sCn zFwJd(sS`UD=Neg@kh+Ku?3xodeOftNVoIs{BD^>#nUgjN;(n4Cf4*aXJw+}2Mh8tF zKRP(J;P%_p;RF-<9+rr;y+{IWpv?n8iVy7!+PGielTXT?OUj!bOFNhfGe(}oeX&|C zKn>BlJTsp@60df|OIty$ipcn65#w@Yhla5^AoRAe7Opg}q=an8!lKcLT=eW*cq*Hc z47%w-Bi!Q$+nHYV1_qY(Ix>%GNyNTZB2~RfyhI>bR=h_oBtICiz^bUpCZ z*X1Y=N=hYz495&AQGE`-4CH5r?oMk-*&>VwX$h<=5 z_Tw%{JU=7CX!qqcu5h|=MCE>MSeJ0O72?TDM1iw@*CAcl)cUR;H34d2h3SX-hkm37 zaK;$6!hxpSZ4n9DpDhz~k(oQghs2oxTk1@@M*D`Cb;W&3hrtv~utH+D0fSsiT}^AJZBFPXC9qm-7kXS{{( z;nSe7b=h~`9SuSaHlrb>67=eYYRb1mBA4zljzxtMT_;&ZAa#f!yTp%$;+H;#x zd^<3u;}q#aTAV1FDwoS6fc7&I*2e_O16yiX;?O!<9=I)cxdRwL0|Tt48HS$4VdvH5_fu8-0T|PCF$t>7*^5wBlXyE zAdSXH4GB$h?o}gqhsGJM-ui~`M)h`3kDjly*}32>ix6fyK0=L)+1n^zVhKWWEbKk1 zWHxbr9vXwbUiEmakPdq%UhbO6_AvfYozK#vt&EpEZI^d}H2MN1=dZ#vv!9vbsKhda zlzplGmgt|C|DvpVW$VXH+(+KBte07lQ%k)JwLf`8wo2bcm-LO|+R~va;Jznq%O?yR z>*#t-tV!*^L?ykuPS|&WEu8?3Ffc*n0DHAyF#qHBY4+9NZP_Zy1{~EzP)^SG^Po7} zCs5|-)-H4j1jCtMV7rUH9IM-V3kdEZ51lKZ(?2<6W3J_nk9Wf&6ehG1GLIK&7c~Et zB>j2Cm!KQbw8TfVG|i;VYkI>;(bGcGHwg&lh-Gr5AF!f` zi$&z!ot0`9VbW)eDPB>Oh&8E4duQ(+!UF5zKbDOaWyF{5OMZDfQ`z(y%huP(1zJbC zyNR_q31LZVAD=*?(P&h6oQ^7w#hC4Df$uZ=zWVSBb!-o#J`42MbuVlvl-TF+EGnbT zCVOW_k6wEq8zsnnaClCHI#9_lEWx^I{mZs^H?qVz3Q^svYAb(+S3AjrfGg`L|1#WQ zVNl8W;|#W$^v@R4A2uFV&Lf*^IciTC1Qr$C{4Z9U9eAolD?ijK#lz%5z(-^&k`Nt~pS#f-;s{8TO)97n zbw@HMCf=At61E#p2?am@^j$~G_*Hh~j5&#odwSCV1#h#! zLYRr#qp5AhMj7Szez8^`y;}uC^j0x)+6Qt`^3M?lzujqL5P06a8*t4M^Y;j2s%LLx zsOV^KW^Do)Xu?(J6t>t=Tlb_E^m=fDj->>b+m@uq)s+5#A%_ z?2YC940BqeG|ANna(?@SujKShbEom>hIeo=-hv`-8*a(&DHNkY{G*0VxUdV6l}V^@ zBNn}n@0$rM>mRqCdEXWogu^yJmF5sH(N5<`rj~IV=&R6h2%(Xc*yvmS>^{zF(XXzr zFkqF&Hd`{G{=!5M4z);d#@hB2b_ZLb8Pl^~imy)UQbF@qQAFZ+Pmk)n zLXd=gfo^cL6pXj*!;ir{?1poxN+MFZyvlOamB7ce$b~_96_vupBDZ>&sEkL%(uYIQ z{&K3$d-61f&n}ut2#ftwJOwji*7V6*Tn^{=U>twn=Uu^l0mg?P>wT6f3=T|6#Yfa@ zWkR|OMpz>&qQ_b)g@w21zRvAoF`kAr!f!vrd*b(|6+LM_^)gdRi^DeI;vCC^n$n0h zEYiy7PDCPLhxW;vwY>Nn>{^Y71KS*)`t-O56WJxDIXzhDA7=B1L*ow<^3X+tl7QTZosHSpyi`7i7GurwQOUETT<*vvI$CEF* zI3mkvHly_N57|Z^h&@C^nG%lq6wTu+`SlHg;~;`{#zcB#u*%tatk`$Eht?mv-cr6y z33f?i-8Swg8__T`6^tv}S3(m`efC%D1m_VVF; zXT8M2O@~L(+{fqv7*)-LrNd~fmj{mNemVL|2A2w2!u8Ifav8_H98U7<$gujgxi8Gc zDDpBk315EsF)f)%-&@JxZS+>ND3PG{JM-9pxE=jFjXSZQbzF;5tmI1>X;ARvp|KVo z`lQc$r_1|T`%J>}k-rmRnQL?Eiv=0Z?JD++S3J|Sx+C?n)%*S|Kfsz!_^`5%R?Xfv zls;S>S*%`?NT5Gg%R%?tWFamL#W&?gVjeEHjync>z-Fp(oddLWlbYra8||FxCHa{4 z?gz!=0~@HZ3R6TR0=R0{(J+sF%KVjTE0Mml;e@3caZ^q4^yXWo*_in(C3%WBRzF;o zzZ()negF74v$=?8%sIX+zZ-rRw)Ac1jJO>|)U#%~n{5`lXKFuCnMAMSXSXlZ6HCOa zK0H;(Hh=0IySpmcg>5U6_i2{mi*YaswN>Td!@1E=J6?P-!`gt^yy>&X9}2Z%j_%tF z4lKL}2VW>Hg9M5V{R~39Hyl$5YP?#CR> z;D4B6zhDjd76IJB6C3#Kj0W`x+R(;8&fdn>;kkj0y%9LgCe3;XO`8D)-Vyfy*MH#( z?ZDLo#1@<>e%wax$`rP_cb%}cnR!^aLzqO)qqOYf=8}G$WBm)VwOTZI?o-lHdk4Or z%a@lm7GXGu!<IM!%XgcVeZCe(kF!-zW1dDg4>e^`8Q`)I&` z)W1SphFxNx;8b{(Y6C5;T+uEDlRYMi(J>Sqk$V@5r-UBO9qPAz9o}o-!YNo#|xAaPyyG8G6v3GBMnio#x^)wtW5%C} zi7(>ZSw$apD_%DLa8VK8R1s;E{(NC7=kwAq$j9O}_I?*4PBg4oj$Yrh!N5jwy55v& zf}`^5ODm6#q{hPMl4KGUKSG~gR3waVPL^M&-$hF>I*v-+t<=v<)L_;$UwbZ}8xMsC zLv`!zwE(x*m}K!#>P!zD z7@|IP)+kJq=-D>t3YOU7Ngpb`bx^pzw@$0+w`BBsj z3O`cV(d?3=i>oIekxR$to}>NS^{c&78}^23kpKS$!J%1y}q*ytL36huK7Y0LR#=}`~{ zp^PnO`x2|@AO?@@K2Q76LE?*=au&yk1S5s>DIbB zCWSye`v>~|DsZz(S2nvUmY6kBo{>=YH8Bv<4@Xj7oSquOb!BH~g-eS-iU5xqln-_X zcH$Bg>ZSun+W7$a{$BHKM{rj_cUBY<#tZuCb^Fa-d^SsNPX;wz=f51WyO)wS`|Trq zDOzi6E#>M~9%C-einPNTuS}1`P?cx6GDB2>{_^xuS;CDWA*v48=FvPI#dWRS&ST!U zoR-yp8uNelOz!vG=~hCj>wba z>KNw}v>EhN_29;9?;nvNh=n|IFPI}aWDzIo$>Z_r-KxgS_8?T<4QL(cnhOafQky2+ z$`2pWw18`>tlQ3nn=OdRd)8DqQjgWO`$&1lZ7dJpPx}B_R<*e!Tf+0(UhwqBkKnk0 z%sJ{!veHQ#stB_Nk@y5nr6u>JZ`PV_->eOl7khTyBSNb7cG48K4fu{5we`Z8y%)YV z)iw&cGV$a4pP4#Ex_1LFxcs6l{D~?jr78{(4uks`J-eu0) zuACo2Pr|`RTYTPLYuqHqkB0a_9ydf>=2mMg6SQ)QK(QuK50% zQ-^QM5sYlGaw9vGJGZ_y2_43za(;aBZGIqwFJSYFjBmHDwo07^;sU9)XOU7o$&d5k z0$2Ze=x96C6?J(RVjNoW{k_)PxXD%R1LA;z$S~w4LS;NArp!+Ffovit}jW%EDRAu^Ha4a=jjJZquTo zDcZI+SCKh*ttj~krAX|3{KVbB*vZf{U1N@%Lg=8iZW~U&`3+^0uZ`#(k=Q)9e)HY5L9^r#)*gDW zzV?HUbB(k|npcI!rP_C!s;+xX-|?Tvd{}5#R@b=|TwLb|YW)3F0r~+0@Yx;?>Je~+ z3@SFBI>Zy0DC7gzmBBBH{`sdVWMl1UWbODy$<5ZtK^q(xC{$8tpiwXdK(f3;k2U8;> zM~CN-H^^6Kf12{=lOX<<(#P>1r9hqw@u!qO@B8|<6iVU$C