From b0d462b5d6a31c1fa2a2ed3aacef79e384860de3 Mon Sep 17 00:00:00 2001 From: Moven T <60170228+moven0831@users.noreply.github.com> Date: Tue, 29 Jul 2025 20:44:53 +0800 Subject: [PATCH] docs: add mopro-metal-msm-v2 blog post (#526) --- content/articles/mopro-metal-msm-v2.md | 262 ++++++++++++++++++ public/articles/mopro-metal-msm-v2/cover.webp | Bin 0 -> 26158 bytes .../metal-msm-v2-benchmark.webp | Bin 0 -> 117508 bytes 3 files changed, 262 insertions(+) create mode 100644 content/articles/mopro-metal-msm-v2.md create mode 100644 public/articles/mopro-metal-msm-v2/cover.webp create mode 100644 public/articles/mopro-metal-msm-v2/metal-msm-v2-benchmark.webp diff --git a/content/articles/mopro-metal-msm-v2.md b/content/articles/mopro-metal-msm-v2.md new file mode 100644 index 0000000..1035725 --- /dev/null +++ b/content/articles/mopro-metal-msm-v2.md @@ -0,0 +1,262 @@ +--- +authors: ["Moven Tsai"] +title: "Metal MSM v2: Exploring MSM Acceleration on Apple GPUs" +image: "/articles/mopro-metal-msm-v2/cover.webp" +tldr: "Metal MSM v2 delivers GPU acceleration improvements for Multi-Scalar Multiplication on Apple devices, laying groundwork for efficient mobile proving in privacy-preserving applications." +date: "2025-07-28" +tags: ["metal", "msm", "gpu", "client-side proving", "zkp"] +projects: ["mopro"] +--- + +## Key Takeaways + +- Hybrid CPU-GPU approaches are essential for fully exploiting limited hardware such as mobile devices, improving MSM computation and accelerating proof generation. +- To unify GPU acceleration efforts, [WebGPU's](https://www.w3.org/TR/webgpu/) vendor-agnostic API and [WGSL](https://www.w3.org/TR/WGSL/) offer promising solutions that compile to native formats like [SPIR-V](https://registry.khronos.org/SPIR-V/) (for Vulkan on Android) and [MSL](https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf) (for Metal on Apple devices). +- GPU acceleration for post-quantum proving systems could enable their widespread adoption. + +## Introduction + +GPU acceleration harnesses the massive parallelism of Graphics Processing Units (GPUs) to dramatically speed up tasks that would otherwise overwhelm traditional CPUs. Because GPUs can execute thousands of threads simultaneously, they have become indispensable for compute-intensive workloads such as machine-learning model training and modern cryptographic algorithms. + +This technology plays a crucial role in advancing privacy-preserving applications, as zero-knowledge proofs (ZKPs) currently face a significant bottleneck due to the high computational cost of their core operations. By accelerating these operations, we can generate proofs more quickly and cost-effectively, which is essential for the broader adoption of privacy-focused solutions across Ethereum and other blockchain platforms. + +Currently, research on GPU acceleration for cryptography remains fragmented, with each platform relying on its own framework: [Metal](https://developer.apple.com/metal/) on Apple devices, [Vulkan](https://developer.nvidia.com/vulkan) on Android, and [CUDA](https://en.wikipedia.org/wiki/CUDA) on NVIDIA hardware. Aside from CUDA, most GPU frameworks lack mature ecosystems of cryptographic libraries (e.g., NVIDIA's [cuPQC](https://github.com/NVIDIA/CUDALibrarySamples/tree/master/cuPQC) and [cuFFT](https://github.com/NVIDIA/CUDALibrarySamples/tree/master/cuFFT)). + +Therefore, [Mopro](https://github.com/zkmopro/mopro) is investing in GPU acceleration through related grants ([Issue #21](https://github.com/zkmopro/mopro/issues/21), [Issue #22](https://github.com/zkmopro/mopro/issues/22), and [Issue #153](https://github.com/zkmopro/mopro/issues/153)), as it advances our mission to make mobile proving both accessible and practical. + +## A Primer on Multi-Scalar Multiplication + +[Multi-Scalar Multiplication (MSM)](https://hackmd.io/@drouyang/SyYwhWIso) is an essential primitive in elliptic curve cryptography, particularly in pairing-based proving systems widely used for privacy-preserving applications. MSM involves computing a sum of the form $Q = \sum_{i=1}^{n}(k_i \cdot P_i)$, where $k_i$ are scalars and $P_i$ are points on an elliptic curve, such as [BN254](https://hackmd.io/@jpw/bn254). This computationally intensive operation is ideal for GPU acceleration. + +[Metal MSM v2](https://github.com/zkmopro/gpu-acceleration/tree/v0.2.0) is an open-source implementation, licensed under MIT and Apache 2.0, that optimizes MSM on Apple GPUs using the Metal Shading Language (MSL). Building on its predecessor, Metal MSM v2 offers significant performance improvements through algorithmic and GPU-specific optimizations, laying the foundation for further research into mobile proving acceleration with GPUs. + +## Recap on Metal MSM v1 + +[The first version of Metal MSM](https://github.com/zkmopro/gpu-acceleration/releases/tag/v0.1.0) (v1) was an initial attempt to bring MSM computations on the BN254 curve to Apple GPUs, leveraging parallelism and optimizations like precomputation from the EdMSM paper by Bootle et al.[^1]. While it showed the potential for GPU acceleration, profiling result revealed key limitations: + +- **Low GPU Occupancy:** At only 32%, the GPU was underutilized, leading to inefficient computation. +- **High Memory Footprint:** Peak VRAM usage was excessive, causing GPU hang errors on real mobile devices for instance sizes ≥ 2^14. +- **Performance Bottlenecks:** For an input size of 2^20 points, v1 took 41 seconds on an M1 Pro MacBook, indicating substantial room for improvement. + +These challenges drove the development of a newer version, which introduces targeted optimizations to address these issues. For full context, refer to the detailed [Metal MSM v1 Summary Report](https://hackmd.io/Q6c2LUxzTzGlEcZF1NBRpA) and [Metal MSM v1 Profiling Report](https://hackmd.io/@moven0831/profiling-metal-msm). + +## Metal MSM v2: What's New + +Metal MSM v2 introduces key enhancements over v1, significantly improving performance and resource efficiency. It adopts the sparse matrix approach from the cuZK paper by Lu et al.[^2], treating MSM elements as sparse matrices to reduce memory usage and convert operations described in [Pippenger's algorithm](https://dl.acm.org/doi/10.1109/SFCS.1976.21) into efficient sparse matrix algorithms. + +The implementation draws inspiration from [Derei and Koh's WebGPU MSM implementation](https://github.com/z-prize/2023-entries/tree/main/prize-2-msm-wasm/webgpu-only/tal-derei-koh-wei-jie) for [ZPrize 2023](https://www.zprize.io/#2023). However, targeting the BN254 curve (unlike the BLS12-377 curve used by Zprize 2023) required different optimization strategies, particularly for Montgomery multiplications and for using Jacobian coordinates instead of projective or extended twisted Edwards coordinates. + +Due to differences between shading languages (CUDA for cuZK, WGSL for WebGPU, and MSL for Metal), additional GPU programming efforts were necessary. For instance, dynamic kernel dispatching, which is straightforward in CUDA, required workarounds in Metal through host-side dispatching at runtime. + +Key improvements include: +- **Dynamic Workgroup Sizing**: Workgroup sizes are adjusted based on input size and GPU architecture using a `scale_factor` and `thread_execution_width`. These parameters were optimized through experimentation to maximize GPU utilization as mentioned in [PR #86](https://github.com/zkmopro/gpu-acceleration/pull/86). +- **Dynamic Window Sizes**: A [window_size_optimizer](https://github.com/zkmopro/gpu-acceleration/commit/f5c3fcd2dd1e32766e5713a5d8e6e19ebe00f6f6) calculates optimal window sizes using a cost function from the cuZK paper, with empirical adjustments for real devices, as detailed in [PR #87](https://github.com/zkmopro/gpu-acceleration/pull/87). +- **MSL-Level Optimizations**: Loop unrolling and explicit access qualifiers, implemented in [PR #88](https://github.com/zkmopro/gpu-acceleration/pull/88), enhance kernel efficiency, with potential for further gains via SIMD refactoring. + +Benchmarks on an M3 MacBook Air with 24GB memory show 40x–100x improvements over v1 and ~10x improvement over [ICME Labs' WebGPU MSM](https://github.com/ICME-Lab/msm-webgpu) on BN254, adapted from Derei and Koh's BLS12-377 work. While still slower than CPU-only [Arkworks MSM](https://github.com/arkworks-rs) on small & medium input sizes, v2 lays the groundwork for a future CPU+GPU hybrid approach. + +## How Metal MSM v2 Works + +The general flow follows [Koh's technical writeup](https://hackmd.io/HNH0DcSqSka4hAaIfJNHEA). We pack affine points and scalars on the CPU into a locality-optimized byte format, upload them to the GPU, and encode points into Montgomery form for faster modular multiplications. Scalars are split into [signed chunks](https://hackmd.io/@drouyang/signed-bucket-index) to enable the [Non-Adjacent Form (NAF)](https://hackmd.io/HkVWGwsRTM2HeBL1VN0lAw) method, halving both bucket count and memory during accumulation. + +Next, we apply a parallel sparse-matrix transposition (adapted from Wang et al.'s work[^3]) to identify matching scalar chunks and group points into buckets. Then, using a sparse-matrix–vector product (SMVP) and the `pBucketPointsReduction` algorithm (Algorithm 4 in the cuZK paper[^2]), we split buckets among GPU threads, compute each thread's running sum, and scale it by the required factor. + +After GPU processing, we transfer each thread's partial sums back to the CPU for final aggregation. Since the remaining point count is small and [Horner's Method](https://en.wikipedia.org/wiki/Horner%27s_method) is sequential and efficient on the CPU, we perform the final sum there. + +The use of sparse matrices is a key innovation in Metal MSM v2, reducing memory requirements and boosting parallelism compared to previous approaches. + +## Understanding the Theoretical Acceleration Upper Bound + +In the Groth16 proving system, Number Theoretic Transform (NTT) and MSM account for 70–80% of the proving time. According to [Amdahl's Law](https://en.wikipedia.org/wiki/Amdahl%27s_law), the maximum speedup is limited by unoptimized components: + +$$ +\text{Speedup}_{\text{overall}} = \dfrac{1}{(1 - \text{time}_{\text{optimized}}) + \dfrac{\text{time}_{\text{optimized}}}{\text{speedup}_{\text{optimized}}}} +$$ + +If 80% of the prover time is optimized with infinite speedup, the theoretical maximum is 5x. However, data I/O overhead reduces practical gains. For more details, see [Ingonyama's blog post on Hardware Acceleration for ZKP](https://medium.com/@ingonyama/revisiting-paradigms-hardware-acceleration-for-zero-knowledge-proofs-5dffacdc24b4). + +## Benchmark Results + +Benchmarks conducted on an M3 MacBook Air compare Metal MSM v2 with the Arkworks v0.4.x CPU implementation across various input sizes. + + + +
| Scheme | +Input Size (ms) | +||||||
|---|---|---|---|---|---|---|---|
| 212 | +214 | +216 | +218 | +220 | +222 | +224 | +|
| Arkworks v0.4.x (CPU, Baseline) |
+ 6 | +19 | +69 | +245 | +942 | +3,319 | +14,061 | +
| Metal MSM v0.1.0 (GPU) |
+ 143 (-23.8x) |
+ 273 (-14.4x) |
+ 1,730 (-25.1x) |
+ 10,277 (-41.9x) |
+ 41,019 (-43.5x) |
+ 555,877 (-167.5x) |
+ N/A | +
| Metal MSM v0.2.0 (GPU) |
+ 134 (-22.3x) |
+ 124 (-6.5x) |
+ 253 (-3.7x) |
+ 678 (-2.8x) |
+ 1,702 (-1.8x) |
+ 5,390 (-1.6x) |
+ 22,241 (-1.6x) |
+
| ICME WebGPU MSM (GPU) |
+ N/A | +N/A | +2,719 (-39.4x) |
+ 5,418 (-22.1x) |
+ 17,475 (-18.6x) |
+ N/A | +N/A | +
| ICICLE-Metal v3.8.0 (GPU) |
+ 59 (-9.8x) |
+ 54 (-2.8x) |
+ 89 (-1.3x) |
+ 149 (+1.6x) |
+ 421 (+2.2x) |
+ 1,288 (+2.6x) |
+ 4,945 (+2.8x) |
+
|
+ ElusAegis' Metal MSM (GPU) + |
+ 58 (-9.7x) |
+ 69 (-3.6x) |
+ 100 (-1.4x) |
+ 207 (+1.2x) |
+ 646 (+1.5x) |
+ 2,457 (+1.4x) |
+ 11,353 (+1.2x) |
+
|
+ ElusAegis' Metal MSM (CPU+GPU) + |
+ 13 (-2.2x) |
+ 19 (-1.0x) |
+ 53 (+1.3x) |
+ 126 (+1.9x) |
+ 436 (+2.2x) |
+ 1,636 (+2.0x) |
+ 9,199 (+1.5x) |
+
2jFEvU85gH&<94bU1#65Myv0dRMSRHsY$^yWlkkdB~Lqcw4KFn zgMB$d&_n{@7S2y#q|L)29LH(f8>+dFOGzN&+|m(HW%JVh5S|zu&Kw>V-E24fQQ5=+tXpR>gb(cLQy}j@vakZq%a2VL=q#oA*-&0)aoJ@fqVV_%P zc92RvI_Rv3f7aFfV2^az*t5zx0%HmDoBzC8z}I>u6_iMOyWRgnq&p-s@w=|>yT%Y! zClNuMvQ3UX_@zO%hMRiT9F8gCL?xVHdGc|IUzEAsP!g;OxfTJyb1v=KrHj1DH#AKk ztD|PyEKZ#Iv;2-!lFOJ?98tkeMP-S8-RDuET;Y*!H`U$4b$89SoRO$3YN69uqZ-cz zNphRRTUh>NsgE=tfWd6O28Z%IFqz7asF=Gfa!Tt?>swp1l#bVUWj%`$X=honhtrW6 zXg2=Z-a#BTN`+O!=OZEMrF?Zz+}pD5;O>y%3~s^Q-Q5BN0t_&?4(=Y@-Q9wO;0__U z6Fj(EuwcO-$= `LTvLD9H;qE?-WXZAV~C>x!*J@phq7qv_a)Nan+%41+t z9b1|CEDUTA*ji}b%oyT^rT>iSn|?HX^J-KR^jyltDDbNIM5r1kr mL7=!XN|^5LF_ASC74Y>_zVPNQMa%q9wEJf-P!Uqe|jJzdn_5E9pE(-sZoxydcI zawja{e_ne3`eb|V;BqhHfw2BQqC!&*^w<~3mA`WL8AAfL@tuS7isqGy`r@~-DWPiA zjivr{5!+4`CgEl6sfiXrA)iaDMrHiKq@Ye{l`v;b?eK0~y2$Z|UmnM#nL(ntkS~v_ zOhP5Zhb6uTO040nhU4eUmLN3_Dq 8Bm0;j|8MKD=ilS-GXaIVNsn?eI&J zlk>=RW-1tyJ}yPb17Y@$X!$I&S6|}8S1~6vH*NL1rQN+et&e|jucWE5m8aRAD`p&` zB<18@g0l%}*55GU;M@Fm>8hJ&pb5pGwLW~`$&abr0!^WT2^Sjp>MIQPI72M;R9Ve( z=4FmG1=+yT6={HcLrAxfEEEH-nTC_1jgY&o7@DV^0Cx9&;$T~ ? lw$KY4Y3#a4Gmb2s5Yy_rS(*2VZ5 zzLeSWO@}n}rrF79DrZ!Hxd-A#UggmC$Hu}@wkY0Wj~l_A)OJmN-q-dQPSWYSmpik_ zoBoQV6|n3QK6|GW2c$hhK@!)i3?YsjnQ H1?aujULyB zyE3paCM%`aYbP|Hmo%)3KZc&Z;h$-Ysw!V|s;jyJ-9Gl!eYtv1tDu3yji~JA43CAg z+?|b$iOw4+|#GbmvK)>}U; zYDvf2JaE}0qMGLH(1C{a+wQ<;+lz}YueSnHIoU>B p&Y4Kd+2J0z$TadZ-~a zG&z%nB297eb!$fBV4Bs{=m`z)wRAV-F(J7klJu70xm4#;Cdp68R?NRl=ghRj1CENw zEb79~GvxEjp(taI5x{pjsPqQ7E6M4}m_7pP%v*gT-ylus*R*5{^Ue3`*CVPim2`{- zcUSdOtxU0)GMVjYUsKP%1{@)OIbP##k2ot~$H_u-Gp!2fk&9wCF&N7S&%1ru$2KEj zr`<$2Zo@E3=WEY3hdHE9Ggm!Q1usZMOJ@Mn-@h)|VP&K0A*y07yi(%htB!d;D4?h5 zbw9$%A9Yo#A?;XZa4lQB$(5}|mCEQkg*w*_P=%==st}P|&<%X3QF- d-k>fKCK_1NO{{%>*smI!cOAEV;IflP=&2?Y_h4 z2n*$Pd8l402_;fkaz*}*uwWDnV&YxLLOm4y_hpig#g(?eCtpTMZaIcYMI3FK5d`4l zRl_Mw5^P!s))E~F>YZ}q)dKG7xCrx(nqcI?!f}xf(U@VU4(R^N8TA3l$Foh;&rp>t z2-Xs!h$8B@^+yrt%wFeoaB3&Bq}W~1?wVScGHcq92s?MfwYkD8v72xlUsucZ;QC(t zz-Q(Xy~0;3qYBf@$nDtJ#eoJ=r#)$wBkHQ80eAj1BCj>3sLR1%BB=AnPcTKLHT|A> z0D!ac=zSNjT#BMV+eZKl`44zj1Z35isXFGce(5)h3~ezQBoTUzbdIUNaJfBwkv>b< z->bv=v!pS9 nsM_}Lu z`hM9p&So?iXmQ%>UW>Usl19; 31|F@{?4Pf)6nuOll*w*pKvX*=J2%l^kZ5WQE6fsJW$PB!Ip9iZMtZLr~H+|C0pj z+iA~RP^_m&XLDF8`S+1{F{PH*!<8cE2k!mf6Q#ZtkA`UHaACu{L{pX}yiCCHx*0Ex za*86)MNM;ixO1H)?R_P8FH2jRk1?bC6Pi@H(E~G<{@tLiaL&o5P%68(MKea)BjpHo z@<9*DT_YFHVCKC&u{cbie)#$k#gbe&Mm=U$v8@v(!ZVHm`x8EUt9;~|msSQ1jZB9t z>vQNe1(fl#8)Iy6>G``XNVx4`A;UN0j<*Gap9aqBJY0fqoYFZ0VbMd_QSzH{n{Y zI>7O1={=2priVkRAJXivN12j1jf{B3#2*<;eA;{MF(=#Zr}m5wHI=R^OZf@?c5w1| zyW#$5Kd+0$_N)>k;b$ tiV+?fY9YHVI4PAE9Bo4;8J_9D33sHw}f7w)>)r_GfJRzU8|w}9?1 zj_w0$WE(Pvs1!U KQYRkLq=oz_jMGRLHH1GT;R%FCYgc^z&Q zcaa8-VA(5A$kFf8KxVWN|AVf#M1Xh(d2w%FREto^=&C5eu0;C)&G8O0At$Ry{%yPN zEi*|otJ<;aO!qX?ttShQzMb>Ba-84NTQe2uTRcI{%J3m!&n8EcL6nyD}`MjKIQ> zy`Gs+STg1+tag0IH5J62g2UzSSHzwSu-=9H-Y 0lZ~tv(eAs(B12B5VPppoVmfZN}#O# z-hmz)g;B99BB@%#Q&^wSXz^`iyVX#n4)dMIYx%xU1a;42_cXJe8088nu?7O~%@MgP zVA$}li|`2 A4H9sG#Mx7t5PNrb9!Q9%~LA2j5r)*QL`a42E3Nm^up7 z#j4%|=g?R2xVHg5C47(PsVsG^gTs`nRCL|E+2Z+t*0S(+zI{^{tl*1mcXsZpXc+s! zOSFeVVGkmQ0py=#^KUne;|+9ItK>&(AOy|W=!zeU)$$KrJ;Bl&q0x%vtT*P>p;CP+ z@MH8M{__4OY^5QYY%);9N#qK;LeyGz>H>Nz@M{maG>chf#R>3S7^MMc_Yn0pJ}4Xc zhE|~biIQy#ou+7|3POIbFFL0{Vw3eo1@d9F`w5cl%(2I_wfpDolf2Q(hiU?sU^mSa zhoU-K4Ihs&CE{Lwr^4NG_p0Gef1JC|{g{kjs%P5t=fv~8Q+D{(TFaWFIA;?}Of#9w z^*=4=jA|nHFOkoAW=_+7wS`-GXYd&%oLFilA8|fkzZ%c !dAD2%O*5sYzk%XX)Dl9AHVbofzS8tt134}!aqwAgqBBAA4tR7lCZ0lKuqSv}? z&ECEzQW4?PyhgDRCJW2UU((|$EA;gELGXlj;WL0D9H|*VCAb>uywptWQ`NHdqr_rF z>R?d7B=d|}XV$hRsOp1uu+>s8mzJ2U*RgA?+eYWn=jgj3$_`N_ai@xibx^#snqT{a zb))1=v5joD0OCq71%K*K;-Y7!YNFY B&0pK(+Ab2j_IJ8D*8uGl zDm76-OU>hPNxHs>n0&=%YT~~j4c(M&m%|oMVI}r-=|2EyamY&DJlQTFxe=hc{A+N* z;*xa)*RN9iFlF3@FP9tOX<~po9VKF1L3OtYABt2J!_mF^UXI27d4oLK9Nd9^6q8yQ z{ZC1P2n%M!qVhAg_xp)Q%v~}M$*)ba{OH}D;ySW~57Z-e=aDFiQ6T+NDkw;})eW=R z10kzJPB+^Pvz#PV9wXHe58%QJ?dPHxa*Zw1RJ^X8`#@oF1B{p|qv9dyH}(dzvALo~ zlYsA8>;)Um@7YdM_&ct3ZU~QqFDqjmaamYhw9%xyJ{IBppmN+nPbwXF)Q)l?m^0|W z(5k6Yh3e$)B-ywMI0|Ti*^lM_D(r$jn}Xq)g0X0nO`_t%Iet{c@t!4`JY*29k!*MD zewnVqc3nKHzF1Mw;-DUd?HP9vRP_u^<)_vYQBC&VpXSCjJSDC|ZT1|4ab4)_B6%I* zvqu;)N_nn(FcRBWj6w<)_4{LZtSnp=MM=4eu&gk5rA-m6x2)28Te~#O$)r&QXE0-( zsuf+ch@mSYK;AGD8 2@8y=7Z3zF8#+_W2-C)gkYBqBy3x(?LSgliZ+@DBE89s$mF0Bs<-6yDxKolj0 zo`M#H(ZoYLNxz^;$L8-I@)DFx+dh9Y%rU a;UVXkv`L*;qH_kD*LDfo)Rq*>1ttYnVHgR<6T7PjHFi@pbn<-Tp4qKq}% z-?j#pFfe42IvN>Z4{RYsp-XT-P7R05l-8sBHvNn(3h_wENX+VdsH01(sziv<9czhd zF)9{i&`l-CxG11eLnm?7Fqf!V15$X5l`4Te-KQ#4KHVA=IrAx2ci&R%KFIUu!luqd zeEC9NyOUG97P9 ~Tq-C`FNou|7tgu14N^LEvKdw|+u=N)A{*8bTZ zlH*NsF(KYgO01(4${W+rbk;X>(OtW5%Mn?Gr2T_e+8Q56avvs^j6YgY_Z3#Wqs+(g z-mn~4%55HcM>H$KYKZizB0W3Jg)Di7m+Vg7*gPOHTp@JM?})>5uMC&*8hP3ZL)~Ve zpSS?BGTP~3ne-%q<5H~_hnBB^?)ZwLBYazL4sX>ZWYigzf+ol+p09f=pfBcW>X_;v zDThh|ZfEk9FsmHp!C1pAmXZj88lGp4K!b=jp6(!O@xI0OFuNwa8=|SatN4LhYW*T5 zrwKZqdTeyn>G)51wg =&3aN?4T+7b-eIUvW*uON1S18UMKgd~HA^8V+i!Np* z9e-n%qVB+WV2b;p14p!5u`vmb@JZAWthBHR8(LyO>)MbwKaaOjqr(F8ukQ)a2E3O1 zRWw~loMy{GCggs>r7BZeaff1@pwd@Qjwx~8VP^8dJLZhXdXFhj8AM-SO jERw)!gvCw^ zE&f$v!%b6fwS?fk6^U5Imocqf-O-sJVH{1*wPdH$az@s?94@hy$P@Kc=f1_~Y2$|I zLMt9Z2m3L7SvvBDWQg}l{8ANhxR{{E5hqB-qYOqbewHLAPVc=pSMS@@R0oRh2WJJZ zd1=WesO~)jC6apIB|3Jc*ncb9Q$c$oYPtCphFib2re&tJh0;DgYBMRJ($Ru@uOKqk z97;q3Vfu*l+@~zaM=j=kCiDq<$;{d705U85HN|=K7qT{aX7)*S@tu)7U7l#vyP$hK zSODkuX#T@n9W3Hzv`G^&*=5j3;g_}h87+ Mh&=&46@GdJw^Da?C6THRQ@OPcG*ILP) $Y@hX8#iR(lU~JW5vOC_!#zq!t72c ztAR9Xez$L&d*GS$?gpu3TI}RSH+5B$@TvI>q6lBbF5A73=JT=318BYPoqI6sR{N1c zjS?c%riz7bN(A;#03P8}BNvLZK qqQoo*Ri_|d{ zeZVZ`V~z3-D&g~OTu6NR`b4(mpoXS{wxPLx8t00>b2+B><#S2R?(Jgg?KWt>BA(j% zLHG<+Rp=)w?G6W0pw1`%Qv<^A_QW{MS3lORATFMd6$ 70=;#->UT#BvE@pIaQXdmLyGvj{xI;O0B0$Sn4bZ#?5UEW*jFFaws%^1 z$e)O-b_#@lSQk6>$|}CIfidJrytMPD5o$+zS90E&9TJWOY~ASIZkZ+Ys{a99`w2T( z|BXh{29rHhv5iXf*AS&JMM^r8yp|)BN*c}?sqc)*OoqIDcMDMb$;W3@I8y>DK@%`p zmHrdeM|FrEO0r^YUYet01@^X}W3#8;=8d|jhYcH;TPKi2$;dn zB1Dm|qHvn#W4H+%hRbtTUA9HOoF>c_e6RhGr^yEUNPs?CsDFPAdzqVL=39dSa|j`i zh7$=ZSvDtzAv}z6qr0H=DApFxf4!Hu9I=IeeqG$}+y?FMwqOzT1pC=v3XgR?rpD}t z2m^YlsJGUpeGw@-#2y1#w#oC&WZGm7eMNZmm(sKZY{3GcMx{a#DzbQTD!|w+ii%hg zKG?C$5S5j$plxP>nYVg-;%7yc{L;%bu~2cbKFRLP? j*I*#y58Q6-<-XvsMIg zBLJ3L24l{yhH*M_DU=R?r$@PhuzWob2%wIF!Yf4Tk0eSFENfMJc?=?otfNv(loecq zcwkhd1CX|W#|vtvC7%uOz!X!DxplA?g;pGlh=WxFXdE+UDqrN Bc-=3$YXnb#7>q1Vmp~%i-=~2!=Vw)0Ti|nLS}ts+4laJO)W- zKIw;%qC~LLgaI06)<+%embY;{V4|9`u59H>eyEF%omIzIlR1GH$k%879Aj&d%>V%M z9Y+vKV_3(8q5(s{CaO|LpUBYm$iOW$)3uI9Zf}BEErlB@mUR~>KW63KHpW}5 w7HHd3t)fm69<4(gnoERvMENA-3Ms-12}6;m?afm z2puLfnZxsxkTHGHtZOd2)vFQ4O6=pyV_?+2eal!7ng=jXYvcQr%|IzV(M)Qe!GWGI zXG%GNal3B_(1m5bh#WddLyR~r r8xb^`C{MdKi`!B2x1a o<*Spm)f zfKQ30#WGYo$0eiwEKtfZIQPxwKmb5y> W9hq9Or~;rkr`lxIt@&3%j6_NhrN6t^(zWb6&2uh(OV6 zT6d_##?59gpRyR@o0xnEd43Nrb&-h)5`!S4a-Fe5f3v0JI? oIZVERYzBe` z0AQr%WII{IG?s*D{rEUIj^n(%wFjx_3dCJ#q01`E5cgkbSxx2N)M;t ^n%y<&5+@c#{Eu kdNNWSvq`Dau!U6q0&BXuv&|C z%ds6ynR3Ok;tHSVDxCPI)G1l7!Bhh&*(Eb+1z`aNHO*Ml)#{bm3oX*P0P`h(0OAka z%ohJ8p3krk^w?oSQ $=lK)ggkHie$ zf{(Rw{cOPkr=^$387M6j5JX99B_)^p-C06UP_kyvW&=0btPKsaQ14MfIKr2Kqs}WI z84dx5y{YDDECyC-H{yK1J~|`TpWg`&q){>%Se@)kN2xy#>Nn*m$7|k)bO<)t1O~gL zE|mGRN-z2LUxw2&cH7H!?|&8^ZV!nLzdZU)D#7Dd_emB(x2Qx)uxsvD`C1<^f7(3S z?Z}228!*5J^))Ob=%pf(dLkg)NB#I^eyRVtwXey^O3+(=1+}%3lSje!8~aZ!HKQ%d zn~?fF-n^cwP_x4u^N$(G&M>3#u4i8so3CIwpJbHB=|6cnDJBk&VX|vFP=5up$R0ZN zYH~;Kx~GT7ZRg@?(~1 fu);fVHUVuSRS?P6q{> zwq`CPY%C;M_n$jOt$B6iznmW^iY@V3lUKysOoA+xC$^17N6chie~pmR0htTQ>h%Wa z2U%139lg|!j*==c749W!5qAfWi8a_6Xbd*Dv=gE|ZR?^1TAB*cYI7;EDmh4iEi7d{ zAz%$pWla-LYZE?GS`lGnL3e(4TL)XPGYIHzYh&lc?=D0OGPO4b^S`|Rz05-Uq69HD z<5!oI{#)fm5~8(mc6Q)rVR3VFV|L?UwuhLru<`Nnv9PkUu(LD0XfQc>*g1pTne3b> zUpycK|M-vuJDET%9h@!g?SQ|1f{g85oP}s E8w+XX} zy)6sK)QN?Snf3RzfIz{&^!de1oqmgd9ijnt{3HA&*;xKL$pHj$0&99WfQ4w)!A|xr z5EJkp55JB6b|L`*gPg&p!tAW )e|EaHO?_y%{I}~B|f7Jf9_D5Hc@UTCOUwUzswC`R z@@r}5BxWfCwgW?cL-%_LZ1 -mVc#DN{=echHTj2*4lWRzKU6n0VFBBKZC_&jO-8oA$!KcA?`-L81O68k z#cZ7alZr1j#%}|%GZ&(DXEFtwfn01}Fj0CbGaI0ih7!<~9cW_j3WflgfNcLw4*zy1 z$ntL|{VyVO__sR#U1`6|{!g-AHeSNw_&cl@iC@gc*}@(oyq}c6n-;O(StH2uZ>#?+ zcwf5DKluK~CEP&{|5oTPYW#l+)E=T~Z*L S!N)A2&C!mB4$jJ%l47PQ!d10`S mAj^L}=)Vo_FVJ5);!AI2`KN=v2> &jt2w-o{lneyixdL-fM 5y=mpYJ X6+!QJ10TS%$8XRB z>;tgY)BRMTdAafN_JsNR)HUSt7WNo-1>6ev`@Dj1Yqvsyio=!jt?~CgpCSMXpnbP| zj`Pp$2jv6B;JJ@N;OWh=mUJ65B>V@E{kI6kJH_|ucf}i$%bskY9SHb{`p^V`c+el= zCSV)D1U~`5yJIy-JomZl8|VZy1^^epDLxQ34>j)c#0W@@rQQS2xh-2Cep13opg7 )QL=3+PGldaDjt1T%afJ{mse?g-oWw7%BtuPx+u0@*;s#|V&H ztr>Co7f1qU&R-pqh5@o4drzeAQdg*dK(D}%-ziXX&vMJM-*e+T=eO(|2o`xydWU^9 zydk{@b%5_aoWY>?>3hRN{u@`87sFR!&Ta@_^EZ|c;rpIL;2FsLSbAM~1Kk*|gW5qi zz`w}>z-;aks0lFq7{7Hqhk9`TFnmVcbi5}8fCsQVcmObb0&W1{1E(heyai5uGW1tG zGF XRw%ma>l>^TS73a)>+0W}|rZ=iM5I>Y0hb a#(;)zCjsSp% zaQnYOS3!p_wjaa)WSYS9hx-3FsFkD$DPM@e1fuLS&s>HPsV$8Nt)F_7uqLB0vv##< z&>1Ia_Ooj37d;(RYL7A%?XsNc7pNN!n*1e@NbuM##kbQ<*WURR#B<^`mhyRMs7|vg zcM|VqPLBQ+4XhNs>y+YNOPuapWf~JkcOkSI*Y$d|+rDCrSnlA~fcVCNg+-<0+PQ-E z85yeF*unux_cSaqd^UDO#CZw3 zY{$jmjTf=(?<9? g$V^^!=F9cwK7aQqg!eiGZg3&A?= zkf8_yx^N+#xVK0#Q|NiStgWJhVG;NuEK&wVqQ!@Ro0G3qr>-CTBuYnUmsqxC7TqXH zG)rP^H;q@1J2*d~PdK0-MsV{+#N#-waFeob;uyEJzzp}NQFf~ b_Uat&ZUB-Tf0=L&Tc5NXCx<}TUgIRCYEoxl-l+4e?tytwA-k) z;EJRv1V2`(1qt-d3$<^%+xAm_%6{OPm*2NGHKV}dCxg`HqJ%cW+|OWtuKn6RX$+@3 zsWFsL@C=pj6oxD8&K<}7XHs12i;ci6y-Z8`F5b{)NYtxd$y$19^-^6}Bk5^m6I#C0 zq#;i}zlCbqkMFELO{<+GhWt8KU&F~(QHrAXwBoi5vaj4nxg+R$e(F^qY<9&`hhHCZ z;N?e^Ce7%jM2X%*;V=ZkR9Ka0m0r{uT5sg(9@*ok{|}toEKJ(UeZHY4DS274cMtWy z&^i{E2~xw)2CXGHbPr$mLPgegqV2RE1>&NbnkdZBD7F<^`6P^l*)kKHjKNAVEl;$# zIA~y-|K3HP!bCOyc1gs^YphR98C9EDp~8Y$(+(e?X&XR*29K;qJ%J>a{^jv!I~(Fe zVII`{s)fk7CXs6oC#5zo1UGTm9u+1^R= 5&YLKi&EM(v2x zo)S5Xg%j~@Q(gY|b<}@G;$`}mDg-0Vu)xplF4W7QV~*+blaDZ?5ksX&Z-KK)VNp&B zT#68Gs3VeT6x&Y|`1wmofi9!5pydpX?4BjUH#n>`S$7zZD3!Fl(dIv0C-7f0iwxDm zP;VwO=5Y={5~ChjH*~mbuz06R@YVH}#<`X8_Y=N6Ty7&ik=@Q~u=a-P2qvK8=*eyF zKe0B%bDu|P;BS7TM&}G^%JLY~wY*wJ6knCqkBr0Gjct`Hx?CQhkWdE_bU9R_z8=o^ z0|%X$EW`xQP}N@)rL1?>J4!QAYXe@^&a7|MQdVw?=bB>$BukpGPh0N4Z`SW7QWJ4O z$JW%CH|g>xI`R<0vpA5ikmO3#?MgjhH$5Ui$W?7aleVIR2%W#Ja2dG_8(O8IRz}>* z7+av-P}iAI&_ig2_>e@N-S=e$Z4)Q1)B4%B%h^iMzV*qSVh7&7YL=OJc?G$ + zGR-24ZJE(6*{ k?P4`ONXZT7;>-uSdpc{25L4&@6e8~@asYVy$k)a %B~c<-*1dVM8pwX@gttb0rDLo?U6e-V#`Lqe4XPp9~6f=Ze?Dd9sY@PJ(jF zWaByTstO*)ypN*L5IBmN+2J96`~u-%xB%5aRY`(;`9Lv__AtM6Nt`*oMr2_QVtW5J zCw*OSjH57d>iItD8=YY3gF$x7*eVCn)JFfZPf(5j&nmQET|T8m^GtQNWhe(5yf4Sx zxn~a|knl!-=iG)0ULA+MzDVEVo;cuB{&R+&jXrIUzy9`(77}*OMp~?g(4%PP@Z~qo z7d>)fO-;)EX(a0k(Cp BB$S8OY(2cZzSRe#XP#ifFZZ${*Cxgi7eI) z?rrb%jThT%^U8uj_UPU0&9t7(o^Mu&*;9YA(1XHccWZYVICHw_gi7F&T4AzO17kWp z6q?2jGsLV#O?#V^eY{eCXUrY`@|z_LTh$C3{>o9Mu9&%$N~3T_s$GgC5m{c2Yr3Yu z#fi`rjkV_fQQ0CUfn$8OiMy+^#2))0h8rPdNM9gmFT+6m*J<_!miFbse**Od$t>}c zI4PyJWXHVp4DZz3uq?-C{|4dA^TlV$<%7?a!5I=Cq--yyo@p#xUty7W{bV=xdD7=T z4%sf?nAca4jqIahG%t@<9XpvB3wFgW;0CD@!$KWaUkmG29JR7n0^&rLsg~|>@R5Fs z1sQf_Irf`DWFXzqQ+Sz)Sho?^d-GBO#~h8Pu_L8HEv&=~9uCTCqPZB%kz5d$zry~r zUIt=XE*6sd`v3zsDgBnR&KO$#;sp*?O+cy@k7@`Daf E%w0b5f2jIE^Q|c913|?o%XqBuE$QPN8(ic-f5l zZt1`a0!w&aSpG4WA-)q6go3~b%`4TM5`S!BtomYS-_Pg|M%%`PgUIM_K;54Vp0(cS znntx2>|rls(Tab+N>s!Ch34DFjPVg3%F51IDn+}OWZg2gV~>y$?1R$D{D8Y?*BCLo zhX>?maa1}t-pFMtL|Uy*dV#~c-vIvZol*QM?v1=grv#adn&;VKi(3a|_QpS~)fQ0v z1Nr4CPtOM(wEl-0ntlQC25w<$@>uyl6q4t=x6$eU>o|ogJHfon2tVC8P!9=jsBV#o z75si*2)ahQUe^ARtBmuTf2L}~LC?5V0aLBY@3R5TW`*m|TDCZuvF~e>r0j@Orhj@K z#h+X~yzmS%kK-^t`n!L!%U;Dr!LF97*@WOznjA)J>NmE&$lRNj1&mI=i7k%sn7Fp$ zU-1g(#QhhT3UP=0Pb|^i2G{%>lKD%*Ng@03tArNue=GS*`Bmh 8> zCDzH|q(AHEcbkq1v2}v7jd} zKSoK*V}==^`pVCQK6%x_-geXWyr$WRL{A6QBpzgjmo5K+JHUf3Kx`WG>pkP3Eo_(4 z>iYA?|vaO|4MP^X U5amC6c>df=W@by@_WrzclNDdQ3ou@4p@opgLu2q8gs!K=J}x z;uC2L>=wMiBX7kdtQ}G_=6T!sDlLa)gctm%gR|2|ROQd *T`nz~F & z`pw+igV^K#A(SFq$aOw%#Lrc18dr!C5(Z`qMEePciUw z25rCZuj;y>YYiC7VMi@6t#7st9B8DDSTZ^nb%88_fvb3Yn=_;U;~F*4e$11IW@^M2 zHsr$*u^~J$-syW-_H7gH#Ue`P>vV$^mvg4{COzEopPvIJC2CRUb9!>i^Yj` hqZ%efq4%vVFEV $$3-gN7ED;@YGCOZRNcGr*> zGgtpqMCwIEIu?#wKQXSIt{@0PK`rB^(+v=ADsf^O!Kkv1(<>X=DElu~URIAPZl(W7 zC5+H6id3BKajSA3XH~CJc)KtBfG1kJ8;@nV?o3oKNxdgAoO+5YzuO&Vi|WZF*N>lS zaP#Fa|H1g4GN6n$otF4m`}H$^$EVI;!aqc2kG?Fr*lib 4XzF7n0!h?C7AD z(=a>?s3!=o#~f7Uw@JMg@UGGl{!z=Ms^vZmn`b2aF;@x0pZ<)yastumBcT2$l~t5O z#lhVlF (8Rz z9!le%5^>0sO^Ya4+}(ew>n7007A9Y-+g*5o?rTR~gS(yX%O0`B#U*KLk)Z;+x)juB zr&3kW?`a-KzU_~J@3kQ3pDt~YW<>j_Fm8ADYe{B>x);ZzBNNK0KAAo8dkJHOgo%xy zGUty!AAUL~u@HkmJ)s%4ph$0E48+k4ZZkp})ZCin#Qy!W3F39d^3MV5*N$lx`Zgwa z`JSs|_I)BQY7>#hH0bdg9^vf_>4PscoT}IyW`gi`a?$sKxv5`5;~=Tw7L79+c57uw zlWcPE _i>ZJR1bob5DHI>8u``t{-)h&qp?+FaD zDt8;_mD=S=7_5cFN=TRjSd?rFoOcW8^E-P!><_;I3$0(Fr&l#HKL(fI2RXj@v6bGy zd|NTA!bp$Zg7|tAK0635Ip5lFP1#yOwfxG`&vCLn*CR=Unm8N~mXV5o@_@G{tlxf% zKI3bsO@o`*RN1;Gy@u3{%pHk}fa+?55RT)(W0j-V?cQwLWWD9e=A mrd0uyQAQU zBjE|LXB3%gz4u(-=x2+4Bu4$szo~r`{2{UB(Tw(df|xP`fyBT>i_{=2>~Z)MnS@Bf zB=8y`y*o~WP$Cml%Z00WvpwE*1fHAx>j=>J(%0-*jEQ=gz7S^*uLkbBbp2RBj)e8N zRRrsK(g#9=;ve@J-{(Ffksa0WpAZu )DjLRT2=@xtcSx=q&wofHu$|?V;{iuVWd@^h6BRW<1<4rin2#|h}y-q#U z73U6ISx2Lhv-P8z3ADIn65G=B);e41f*F$f$;aRd4z70^=g)+qJ4_D(h>|;D`GZQT zq~GM7gNUEuKd^qN0~Nppu`vJD{#c=aL7QPN7A=+f7aeHCKT?V`15xi=B5C=TM@v2t z-CN9$)%s9s;ykbi#OmL^w&tDY+Nb+sj_-PHb}Dc2-0_g{r>a7~(j=UN>8rm%{D4mM z!l;o^Nm6sB6&7Eo|MaS2>J?v+NQFY$VH&~Th{0U{3%0E@x-J_1vR0ioLbPn>@A(OD z5GH2MZ)GQn+A>2@alUemU>54Fpg$|kN!Tp6vctrt6hCB5<~;!*;aH=LUrvT_vH TCVl3YSybTbK7qnt+;fStC54%{opaFgb5&aru<3%QS{E&n- z%x41(HknA+j$gYOYL~>*&gWZWFa2{sUznLD_-cRG+a}aLakKsYCA$kwHboN#HzIy5 zm>Pee 9f(T!)TanHgMTl#Q{d8;6lcgnLs|42qBL`L$$HPg8VL{0t=kb#{W! {CjtDpgU1#csI0Br-zO73Il?lU<24U|MX?*IMuUpX2!A^WSFqB5fx` zCk1MBTLGt!5dY2jUeuT#@t#jSoMBp1dX5p;$>yn*Xj6{wGL+M_g3nIBDsr7`CiAKZ zgVZufl4|olp8Z5t8vvi{#iI_WIp5z8MxH>-pPADElKG;MRm!mS1PD+BsC4=G$w UnILv>R{^GUACG7ndLwR}0 z0(qTf?dak+s~ vd&&T|>y ;B8!Dej z5z5P1QGbq7>2%5D+KaZRtHcZ~B_euIXWutf+3GAnnbFl97W}DJN%p>!i(*q8xWPHw z<)o`BjKllRoElM7m=i#xQDssHFWCD}2ST);6~6^Bg0FZY?A ObGKd*c zwWpUNQPJr1ST|KC%KPhYukzeLo#f-We+uQuCW_V7K%16Mth`7fXO2MhY@n`GQJfZ) z)R1?KN@CKV1`C}ds(h-|HVu(HDRB;3nP=-T^5vi4;KR`Qq+X9=jvI|x6e4FDg ^B+pU;&F*g5Or?mnogC%zoBnkqTdKS@Lr| z5x>t~VnLnt sS$NgDnBziDr7 7s0#z96WU%-_;-PI${wPFcG_$ bn1;T~43hRKsL E27Q(B4KG4BN9fCyweQ)f>HxO5*sLfqnbZr5_(9 z#Ku8l+x7Q)cC2=GL{BR6rJstcs}|uS9Y`z mw0|LmIU8nz9K}`c z1)C%NvQs!#n1_$}a-Vcd B{huA5QaD>`&4p>cJWN{A zmM5SET0@p>p6AyclY>+C)uW%Yl(J!OJim^E$NpY`m|6p#c9@qjtY+NZr}3L7euL`0 z!NiP4z=1Hs&X??iVzRPUNlo^>)i1boo*W5B=d^SI#NuL8K}!o&J-HNr{VMFX>tzvD zX+SR?0pEf%pe*QQSgep|%E 8=E@YT7Jv|=8sBBj2<~snF|6DkEVxMW1@c;*XmmA?6 z&i))h_wzhg=!AxsYgrq|0h2Aj!Rl9274O=g+6sN=$*pR=0^J7Z+3aWA-+=Uwv?0wq zch@Rft=vGZlDKHG8zPBmdjj&z$KE5sumz(Z3)vTh^6}&}E8cT7--EW-NQdkz_Ft&( zTQ(0K-M?h5Fo57!tDTArET!N`8M9?w20(Aa@P^aO0cAqd9-L1-+5W%8YM%4qbM(=3 zd$3Ww!7{N1&p97obML-oSSCcoKgf@->pfKQ)*B0US#sYq$E_neEN~(#IjC3bPwT;* zHh82DWRl=jC`*Djmv=&|`qm|nCYhZUE%Yc(Ca+Q@^TaJ~a`A&@kLuD6nv$PiSK+Bb zf2Vft7#Z)9?6z%u_tRJNznkctH@4+*I&OGtt`FB@JPBuK^Sdwf{Jk3PZaB#Be)nGL zi=u~va;x=uf65BXKz`O5JqhQ=4fXds8#{Sp?n}7?_;42mG+-igbi!mBu(z8OUv@n4 z?9TplMJ*=`OV~a^VUGaZ#^JQnkF}Q=)!1&GIAZlf{S5AaZiQ9G5RUSdSAlmz5^4o6 zg=jbAhzEUDHg?j4C2R{@WH9V^Rf(kzfHUWSdv%s?%MMn9dZmNIr66}s#^6S$$`R%D z#SR~LL6NRTz?7bahlYBzzUDHHuT&oHX&p3`=^H4+Oe|m~Vb2?B%DlGmsOg+{qci9% zcV8k^M;y{+gc-&n<0IkqEY|)Esy7JGI5~nmLz1Hhv8QD2`84mk_J*H*PO(xf=K_bl zeHl^#1z)yzt65ZJva^X~ef|R6zMmRcF#@x^alDV`3&~*bfSl&Dd=$CVN=TVGhufUN z1hBzuOB9w3H}*F*0b4Z! Y(~ur1~BB@~Z*)JL-y zI3BLa-p|JGh;JHxWDRtw-*E9LgkwXP>8*IVPqYbFjTQoFO#6}YPlKY-+2f=dfu%(# zSf{;MaZEkkIK(tY1 OL!io|BZoke^2_%CJM~j3@WzQrX!QL=}EEyM+9l*;R zI J&Ks|Z+hth`)+^X-3XoJx^2Q0?vi zg+Z5NDiQvdwG ?7`+!Q+wawG-=Cl)T{> zZ;+wUit%%MCx+g@pFJ{4!&!c#olsoR~! z^(wz1h$m%xschWzNGQ}jYk@VtZXS}*Y*#C5sx@JE^z0QSH{Gnp`S44ws`jc}Hu{+u zb?_o$ ffxpl*nyb!Vx3&rxz5akJb3I{YfBDiEb@$^&m74Dr3q4Djq731OUFb z!H+H69cezTbW<2`QWJ=hz8F5AsK(b$tQCSKYRatShq#T))jHptv3n3dyjR5}^gw== znQ0RONP?L|o-Cbmlp@yxFU=n@m VYqM*3NyxH@9_9sQ2oVqfzFx89ho~MmU>HVo~`|X4`ktqcU zVc7Yj96N@D{kup(m(-V*&Mn4pVJqRxE;mCOZNK_06!dYGAhECPHqEH!v&|w=HV&34 zO^p}9JJDyr*s+lzA)1{Y{Caleq;G=yRu8daVfP}~RCo!U;a`~vRss%v6(@u{s{@Nz ztHo&2tl0`Dn!l?o4O&QXSr`Oj4_J)gT}g2dZYBGcFY8Z<$Q9%hPf*Y>l_c3bAFTrq z<+6NCtM7|fem$j~_h&pU@3Mwjwx0+iimQi+GxO#Bhrk|NjH&GxxAv8PAu5pZ>cZQ( zPsH@{_7yr>Sm!8CX=^=)2pNcdP>Ue4 RcDOZGFM^ zEA}a75aN*96Va|P3;HD=REK-FrU-tfCqR{M0`|iuslYv* iF3%N18ahUAel&AIVy3D>YN1P>niS3UL)DXXO-A zHzG-T_u7# z^_042Z1UVXs~;5=ERLD90#QxsH?`FoXg!N@$zc$7e&`;KQhg;yr&b|_2-|Lz@^sGd zChPg9!zU1h9HgIqvq#X@TZpgwBp1xT`Q)*4BpwD-in5RAdB(Kc?M|72fm>jAyTIYL zMWQf(tgtH4rUKoM{9>>c^vYv~;O1VZJOv1v@3Ch!5Pl`h>d1aPd-1;GjW3JHv?vw`HLYeIw00s+FhLT{ z%GZd&CPQ1BF1Ly%B6Y=;{&(O7G1)-nGR)B`TtMYu`++}%+$OsT7Boum?$5S QZKPYMfk|ACuP%7_{tpq0u{j(i zmE#OXC4e{E6IJ&~JbO)i4`9(^*jcl!eO~r!Az8Fli_%?|DDIJgH^Lw z{u8Kf4eyKpgXo?{fcbv{wJEk0tzQ-vCMV_0JZnXY!kEyEadp3LoQ~37YYXg5!#s)1 z4i#%pG5&2odqv;?xB{-ZS#a D_8EU|urFPQn{*=32>$ir?xCcm?j6T3Xjs+#0d&zs6*4c}r@9!w4=iWZF17E$=N zE`O1o8@92*gdCk%`3JOv; XQNh&V(!!!qbr*vmAhf z#zaMKaYZ^WfkPgAUmu|bVNQFH=(OkWi7n0e9R)0Nu*F`zyZS-9MmeEjlh#gVJn_N_ zPVdGX`H!aA1h0j6jL;uDr4|fe2{c2!K3t|^GD#iX232l7HXpw22;D!fB%Clyce48p zd?n_%F{Ct*ZX$WUPAIhflsq)ezhmO%l&eV@T0_h5PX(V7Ss#5zgK4ma=Cb@HzQo 8Tqi5jgLKYW@>ny9cMwT$C0{UZP>4-{BHHM2F5?uF8=SZq(vf#OE$ zeixeZ=#7MPMkgB2&Ix{!Lu$E6eYND`ubAmSe6=cx$#Z;B78+ry?)=eC|L?=T@|J2A zmaz*~omnkTLIVR`^1rcsQi?j;Eat~`B>(*VveL`;1*h-t3&C;@d&ttM8tSVQQuYA< zRW3x >64a){FQVzoigO3c6rBR`ScFqNWn8VGw!9`2>LK(v`KLpovdCH z{WKp>$mzc$!Ya0X1{Mo8y2e(%5J_GT(P$OQMvd*a|G5)|0P_YdQ|c)F4~>Y7bT3UD zP8)%D(%SFkAFb%W_K!PO;w9UYn*V4<|Jv#7zWDm^yYc^b|7O3@{gWyr6^EIT|IWgH zpb8RwR%}=0-!ClBK-`!V5Nlj%!Dx}l4mO3wcZAQ}9=5O`i21rYF8U$dR{>$mfl+Zo zvkckm>^C?`f7?$%UZ7XdM#^v2L<6Pc^fhu7J}^tjQpd=%t0U|*&|J!v7J4IGb zD#FG@AKRy1k5gt6yNFS#mUJSuSu+g|M`5t~f{aQsvftX*557{>UouEvQd#)Se;1OD z;rIFPh_0_3b-@o7iQh3&Z*25*a%u=UZ_YAX`s6&m>NXX+iohn4>yz+S$D%F#{XGiv zFRPP{xJxTZalfYSdj_$%R)=SsSFYw0av<3(x{ts6T>i83|Gb6+T|Xl$?38tb*62dt z9nS)q21*1ewS>BoSwOLFu}8}B(M X2tvbMc?CpArz68l`NrpYu_oj|z}s)z!uI gpOmg&BX> zKjG$QjG_Nb(EkOSmDq-V#j*bvFr&BDaB*b-$0htwd5WBwLD5ZucizQjDVMcMd?(@G zqDCLt9r$api`7`!^tAQA1WzPsZRGspas3~{6%$_5JjIE^9}t5)^0mIAh1T~RqVfIa z&eG7hcgtzMDro9DF2ZLpUrnRvN(|IH{vVF}ubcCTyAS{Wq!9mqFP}bv-)hJ{{XgJF zEZbg1Vfzlvq({VY)}g*dua!45>U)d#qlcReF{jhes$DMq1k1}KmW_ZEu{p}5-3^0k zuRb49>8M?pl1^deN}6V6z!#$EVDb0C-92CQaD96y!)MH0OvT2E(nT72B@IA_dnFbH zwe Hv%6W*QUkzLwD*6N% zxqpZ`s7aFu{r*z>OW>sGEsZr}#bFyOPJE%e*UCbkKa!jM`5yIzxnB76h8;>W@(xm- zo2BNX7xMZ!=^Fwg?v&(R@kval>8pb5S%rQ>1|ObVKWVPjUz4L-hA>-r4Yl=DlY;Q^ z-w}7WvU$iQC5>Bq=6K6-EgBjudkg%vGVwTcE?JvdPTmptztc22j@jv9x%NbcV#Fn< zaOcwRyL%R`WndjA&hEe2g`mJjwht$sP2WX4CPfM+@nKUmUJ{=V9Y?2YF&|Ux*ve75 ze-H(FU-b!lv0q}elM=54?xr3%bQ;en9YO5(qDOQ^Q;O6Z1+%(SUS0+~sJPT0v(Wa# zhc3 (`HsaGIA|*!En6IJzv$){NicOvu zqer(PikpZKx{~77r}Gx89W_53^yOSs*^*B4-O`c26GIe*ta>UUxVpqqyC-rWsm5U0 z3n-(M6fQ$-U-7@88c+y_*(dCRy pGKlAFei&3j$M_ZIS_gmmq= z&6(#zC~|ej3xpD*tqgyQkx_6*f#+ #)ihj8 zHpbT$Gd-O~{L&Pjc-vd}xICfZtzdm `C3*mE5$ z#kj(GX;At3OPlTx0M^ihHc}HJGV5^ql*{v|bnbQPTkiY KnLfiCR+Rz}QEB z_{@T%{L7P~7@xY8TW7;M$ljL(E-hwkVRsgySe|&XmUsajyw}sT7hm;O28PYdc$|)x z@NZ0!dTtrIXCZO<*qDD+6Qo;Z; B)T>>bjNvFKVOR@<(~0i!AU8x;snY?U#^L zd)mL|9j0RDHZ qIo_q{(1v?^P|c~|F%7)x>)s1LjFZWxG5Qr_cj4Uk@NQ~ zf3B2C=fNuucZr2FS4b3I_#t9&vsFf!7lgnBjHz97Q;+lgW2@Kp zs;R-^B*d>J3q~)sZo@;`9T_ZdtQGz&xPortFjhzSX#R3Ny!XGW?v~}7`N_dLBw?>Q<+F#Qe+mY3V;w|C2zooR5Ej*4=|fjh(|bcZzmR`> zv4b8{8g~37xW#H1Pq`N6|9#-D3$M8uy-&GORu`%}r!BN-A%c;A9M4uWIUp1ib3tzp zoj?<>^3K8-wC?%pJ+<2PsbZ$mB(U0RSj@c7|FfX+=9ElBGe61o0qVNlX=qO>_2Jh5 zlG$Zpk5ZoD+ody4w3drFM62)FJLoQ31m}n}x|&z_CHwtqyabb3eH%NGu4PCz&ud zf0|RN+^#HW@m_Z#2l&v$0Lzn4yDtg7?5NRZ`+s-##zqPrx>c_heqB;;6`d{VUA< zGZ!Aq{}b%}Ep&N X(nRWA*Cc3SI81MI$V{1gLvt-t0gvK0S^Cwc#(dr7wO~vWCs9;_2O`TYI z#mtds)(SFkwghUo96=#%$x%u8Nxh?y+R=^)T_*HjcWNb$C{kLi+V{oeVf;TDtfj@_ z-$imRjYRZ+dx}fcW4#GFR{u@-<8?@h{!%Ylf1XOwFfi-- }2p>B}6E zb0VEcE4`W&k^R9=>V{blWHY@BIy=nejygT+^fAvz R4pT_KfSW zKf`0m)va-J%%L!jd=U}YD@*!NKRRZ{phxX=x>Js`)ZsP7LPaFpG<0N!BTrI-KEGL> z=4{J3Gt*%cMSCUQL}rlHpqL4K$+sdATT KIMtVr0t5=dKS zQFG)=Qb 104yhr@dKO*JC*_o!tPZBLF2h-@L7R(y4;P2BVOP`-7r za!D|m9XWmHI{iO-b{AJCv5JO=1H KH%PgoS)8{z;X5k4%DNsW>`(ijN93}b`j0=sm@P 0?Oge52L) Wz|pF42ye!jhV$}()RiW}aG=k8YCgQPa_XrO&1GnIDNsR+ESigEZl0Z)DTF7=5} z?yL`sdS7KI&5fha^=iZrmsd-FQFiGCZtHs>>UA_OzZ+K4C&WgI=nyHGRRK7qdR_#r zfFcuiKLblwq-GKfpQn<#h>`wJHU?Ux8;~_6B85GZ2io!eY0I (Quk z(`9m6F^EkD37Oqef7&i(%pIJJU*9mcZjQpg3?MHw(v$@iKw_%RE%IRV7k2RpK{xj~ zm*m5+4c+I{*dKR&>Tt)C3d_$k=arZFu4K>21lFZy?(Qtg)guKDDGqJ$2;Gn4vL{yN zatT|*bC<>26K@b0Vzb+iTC}a*4Z(Enn`|D1DZXAUe_RUwjlfXoh_r6T*N-BD{8mP< z5*`7W&z>=XzVxpY7ZJtokQU<;oHkqSN_z{1+|4D(oJ`D^zgVW`R@lvVzYs)GFif0M zk$P}6k6sy-> jNc^3& zwb)}~rErNSEW2bkr_jlyozq#WFE+WSzSr=-P?1WG!#-*k;@DRDc{vuDo#JnAER-Ww z-HzXchTiu*#EC!?72!HDQVfzkIy&5aL8ef`oRvtkLrUs`{I9F-R8)O&AN=9pyd0iy zZ6!ArGm{zZfsDwme0>=+_7ll5is2EF4@aQw%`KZv8@p0U#Ww39=8BHp9NJ)h h@(G HJt04a40XEYZc4Cw$rotq$+N#O*eAB0<4S;+XjdV8^zp=3*T6YKRJuz%)C%c zOLh_zhKfG3HK`n~JK#gpZ?~^~q7&@E;fQzMbN7wQFwrZt6t(bfbh&y$;8PwodI}u1 z;)p!dQQCa)3+X;1h?4vD_D{zpkJ$Jag{u=P$i76*cz zdgKphg8N%e7ZV=2I5hVM@g)hn9|l}@u9-s-rDe#l+1+W$f$zfKlTn;}@%Ad_^WB{b z{zmrtX-b%VnB=vcIyps`M+rTBLl;eRe$;?|@ghe#)oAD4@`!};gk92m_$)`RLWn2% zHBG*)8xPP{KFMp)K>D^1-fItXie{eDw|4VRups;}8ltq1r8Lr_W!My`K_I@jhOk^_ zaA`X$gP}SjG);d+fbdt_Ge+(kep*(${71s&yDf>DJ$dOPa1g5|j*IuEH}21%k-IDR zlihVlf7~|F?ljCx^tzY*Q39`AVyz|jq&UpyK|o96fiw~0gx#uWgZRm2^XacKWpbl_ zjbX0F?+56PA+X{$kYn#QtUFq2{(Hv1Onwe~iG4IqC6%|9&ww#cX{h>Hm>AZ7i`I9? zhoW^}m)^Q=zoxxBn9#{*5~}FXG9{4&+c8 wXbqHyiP?GVRwQhGKBm`Jur~4*- zx9%Q$HI%;B-Roz%Yj^%2_OTNRfu0%_HiF(X7ak*}E?0G46rGOQ$#!ULD?LVJqDTHz zQu_?Qb$E@L#`dHzWG-C)mr6Tsa@(?8=#L`xbBq;yEGI9E2x6y`+Xh$I9UB8*P-tnS zxJVs_#=CSXRS?v63QJ7~pkaGd=tT7LLHk`GWb8*a5v+;4&A_OO8zK_(^L5O4zh6$= z733fIiY1IVj9xq5QI|5 5&NCsxL1Z8TJa7mCxH>$#jcv &uK6wdZP9LCuP9Xuj}Ki}M;csa@;f zMFxq!o3VT0{v0dWoI(Ae2jdXN?L(H%GT)95(=f#wXuZW;H!0xr7D$uJJ5i&gH^6fu zR9BFXeHvb{u$ErnAt{w>B!*M%fR2t5w@?#ya|iweG8+KA EEH; z+ft{|7(GxL@@ThcgU`Zu+NJ5}33K&TWsgviq6E6pRSfIi(q84prh)$pV?dn0W7Hp9 z8T8)#Mb5Sb-J&1>0O>N7EUk)HTHd 9X@!0LUU5#9EaSOtJkI>|r&r|hOMD2a4-tMfSIu%+Sz%Km4 z)V}J{$@Ga@^W~jUFYnMXr(UF)vb)Y89EMV*m9a|eU|O|y{PI`+BIEeEMe=TBg>M+T zIny2=wnou3PlRW_1aBJ;@SW|{&E#ISha5}~G35A~KV3?ST5@>4{UzUZO7M==4Mp27 zEpCs( %O+&Q{5E?86oC=Tw&A;hH%Z-I-pu zl6w2o`!-z1?>NQ5$Qw^^2oo(Tgfk6q@tJ6gfRulIi0928yQTgoE{u*;T*{SDZW6C0 zF;9p*WfXk7s_kH@NjQDQ>f5p_%CNf?Jd_nmC4-g<0HvwGQo;U)3!odC*sU5HflnD; zN2mqmaA!7?5)&nVpO kvc;zxPJt7tv<=qp!<=?B2H zG|=uw0sC*1&=Kw4WH}6XDd+{u@uUymjfccb@?L9j89MG^SVk5LPhjQ0<>`P4cc#UF zOWwCgfk*{3GpYN7HzD}0z2Tzl37>Eg{eypYPK=$|5fvl4F+bYU?C4+ z$0Svw1Z;f=i8VyV7kC4fQ)H{fmGfr1LP$7#a4ajs`18R?0PKoFNP~ O82;N zYj)s{tP4_9J>n`vJ)nSMwYDhp0KHQ#5;=W%EjwusbB6E&!&i!WqF5`L(}d4rVY;7P zHwJ@Lkk2IEG+~xbHjEj|zOzeb3eBR3P;dt5f%}F%oHmORrvWcIYowzz-p6-=!x*VC zTeA$$Ii!o#g63hV5KspR%mU4l;qCHGr!MT%(A&zcCa*AJ$L6mlh)&c&{HW=&S(1uv zli;V5_k3uQ=}sMZR_e^qexse%!j*Dx?A-k+)fSD9O6k?AZPjcmMA=W#bUV7WQb?45 z;<=^+Rme9VP(d`io6f*M?}uLsC3SvF`i3vndkMe78_o O z@y!ms2)o%WxWfn^ML53;daCY>it5_=KD-NdR&1H5LrdQJpH2J+zP%iYd;Od^PZclm z#AmEoz-_8i;RMSVgW!evzL8U}bzDdSvOis%M$C*RA_Gm9yg-m@=#_qk;w~1t0OBoD zR;_OA=T9- $l#6;5;0=NN$`GRFSN{n?+Lm&;x;ir`Ng=>8IM*L)^i zaFf=&1~@z_*OQ-}rX+Wa1D$o4Mw$0Jcs;*tdsYk HfvJcAUnB9#Hk| z(aiS4Z6F!=e@@2^vd%2w;B>~7TlrD`%O>E}9W3d!vlVm$oIDITRJh7kW14w+ll+iX z_v*OIq-FSlo_N*3un_|2<#v|RA VcRJ{HznMVFx_ zoo4&f6r1BLZ=casQ+5CjYSg^k=BaPlsad*!N8Tjo_8Hj^XFatuxqnz%2kR)vJYcl? zm^oU!xoJiX&h4c~BUAJOGip%47x*=OF>2;`2Hj!JsbN$2WAPmP8||Nu@*!Hz796 Ph P0rrgej-j9u zdY?U4sYhi?k63p@Vv4S>T$*%SioH rAVlI@uC z4|Kzi$yDu_BInD54|1X~!2z{A_uo02Wn-oeP4PSfEN9Om^mmsnoRyBq;##>KH;f*- z4H2Oc4bdP0rZdg~1>cM;`d0!OLdjthNeZ5rwBx)$ADaq^Te3O7Z9%mxBg2kTrp_Sx z9`1R1BKu^x=VAWkX!hMza0xKpt7E`62Fjly+z~~~xiEWLj@N*TgyE*ytZV6OoTtoo zg$`%91it@E 87*Z8h7JbsXoIYHX=#(oi$$?09TI2qA>cowzL17l ziyTM(aEbEv$0QZZ^cNhXVbd#_2xqmzDP{O0`F{T9)20# t5t>KkiZ8M~S-2juS6M}u;) zKQH*0xX+0@d8;0-Lc0 zIa?Qs65UhhpI|DMsak6E$9;#^1_h{6LZ3-p0Cupycip|agxi0D%~3lzMEiiLc!edq zupW?b-KvMn()e2s8w`!~mPCi&t*QjQ-ITGel6_9a+5H?_?^T7qS)E%FI3wTO+cMI8 zL7YF(kF}tvBlP^g+O;$RtV}{^AQ`z-Y^7MLl1sN88Hk+;!H1%pthz!qvh`BGo)LZZ zZ16N)TbqM@lqX)5_sm+6p*-#bF_VGBQSv#1=CTqRYPL$WfWF_l6ZO|Y(4+&p@a8+E z35CSX+rYT*bVc^N?{{S_W&JuqI}im8c=>-eUfh6~MNL>XTwOd27Lz71A>5axA#bBSy}gWgCyeN1qM|0uMOH3=T7#CODDs(6DSX5O}wT>C7pJ* zHec;8TH%_z@4t^C!2IoTF6=Mvv7-_n8kQ~cPlZDlep=TFn8yR5cw$0;N|mmI(zuxq z+&4yauS9};yGuKm=;76t$8aS~!Nx+e;z8~O8s6o$ZF{61pe1;I+^rY89IX-(epuU< zDpcQ{?H2PH)&%HiCb-31;Qz_-75jT7vflVhcocfbh|HpV*8zQxoG;u;eNqKfTEy{V zzeCP+d%v&$QhshIcikVV!sx`UHAZj|D(`?`<@`kj$B`rY6Yk>sq95W8-x7!%wC$)4 zY4Srkii0l6uOCq;ibfX6N_Lw$9LX_pD9%}hs1A-PE#}cw=y)b{v=0Y(7|Bv);Ou;w zjl?-Hju`6;KV)aub~EM;Op@p7|ES25TCl$@w4TF;M4ui=A6P+wHokE!b6*idjDdss z9D^mE48 MYcT&hfueT3kKfW3NeYxgqe4lU1tgYOi zE0vO^Gaf@ufD}Cyx;vx!erX)3ee#4Dq}QFRbTSI~ArdhvLd`dCm~wK{=CRlET|s_d ztJ9qxoGNH8<#QIr>U*l}`|JRYp^~N(^>UUwC^rlFU}vewvkd2xbi(doD$D^dU5N9) z@WqIdoeg^2^=r1*-k$bgLQ+*a067j>-qt)_dqFV{d%jC?hBnma>3!`k5Detgxh!|4 z42Y}s>$H*q^NyQl3TJ+7zu%ME 5JU9eB 67be=tlKnHrD)1X36X`wX#m z&_!7z<{af(a! _PapPX$|Q17uqWMf(Xj4$3J`3bU41?*v8^%TH^1nH}g+?Ps)5OHcG1-Rn9$)?6rp>^2DKztm^ zDYaRJ{Xk;1Ud$UfCQLP*zNI4!1DsFA#Crqv?_nq`9nlm93i3p@Lu34(Ex|HP&TSY1 z27$)xNs)#6zULf70Zj%X2K&~deZ7L*rK|lRJ3VPG`nFPg Alx89Efk$tOPbT zngl2#BBcVL+jquQ#K~4@EwWtDu2{xCAkveB7xUPa4D3t44V@&8KB+?;C%yVs;B&Y- zgbk%8IFn%yt1HW@VgFB2B@mp~M+g;+*24u*K3*!45avskg%HJE#{(9RHyS{^)6=bH z?3!UTNh2k>o!?B@My<|h{S&CsxGmS2kqOaQ_<&rsI9p!SY*D-7nZx#>QeUrlbglz} zgZ<{XK8J#@OeAp3T@m4l^&5?#ZlZClBOF@^aS|*#{)KvI8{tv`(aBFJyI|Q!#V}V6 z5w}Gk_`84_Bs2e8YLQ!9wKo$lMNE@p=Ih GK@k01HQ4Dx%DZb0ndf)3)dDRjY??z#rKIRd(z*uVo!Rq# z( laW#Xd6|ix#tAmht!aJsvgdQ%OOfn(>`kL}ouoHIA_^ zcgsOmVSz1ca;;32h72wTtfs)UmMKTeDLLXwps}l!JW-B%h%t7=a{5UA#7y+gYZB)$ zRtG$Dg_!xr{Q_nTe^U(^5HQDy_%#1Y=KR?~BDa>_es`DQRvFVMserj@l!=;^{oz?m z4%|gKkl809*+EnE-dvWJH^y24RdsSdRGF<=?$3e#NMH%dzk-fi$nQmL){6)Xc^qSH zEFK&Q!GpJ1(*Ds(Z$itZz6!U 4oPBh|R;RMhBh3@XG|H*UH{Uxu?C>A$?QrT&yP z_b$tnuqxy(<#KS;Nvk%1CRtzvsteh}FQ?s!8e}&m(xF5gT8RN}IH055w1$-%!5%8I zzfF_^@079nMIvI8V@OhL69E;BJNPqu%IdUxUU+y#J5j17v*DfXKozt&E+*SouqZer zJXyC9A60Me4TCLyMz4vI@eAt?^+=cHRO4P~jpg^CT1iS0n;&DUmL|J@M8oL{^phsT z1W}j3!8{drv~;nDzAX4@(+ydrV##dN-_lwv;5hpP{(H^VXW`%^=|IbtUC^#v#_eX& zr}XuMjKj3kx*;A(R}+G*bt9w6SeQh7?x|Ba2RYfIwNje%TVOxrBTV0sQ7FlGxyzZ% zZ+AWXXSxjN^44Rz*^k5&{#bTjqry$# e5&8X;1%hH#*xc(Jxi4p)dv3HWe8`g`K>L3ts%~kHXxTStR$aD!#7+V@ zYs9n;ErQZ&uJDENj-r{N3vo5mi*yr}G_v5yfHNL?VbvKMH6ahyB%QS7uR>nuEKtv5 z?W6k}c{V*7YvAZq@Q!xB2fS*2i;5{R6-jAi!j*d*_aL~Z?Ync=RQ#EtEZUqG8n8+{ zW?x#QJ?lL$Z)t{Xar9_Bzr>EsCOl+ULE%K>4C)GQgvfhk4Nh4ZZc7C~UFczk2R3Tf zANnNmr8ntu8BkshmYHi^Co$WW#&JGyeT>=o0Sf5vACZbU%vZWL9=E;2p$1QDtY-0l z#SsD-xCOnYPLQ?IDKM@jG46shh(QP3O%D}s5PKtbJFhiu#gIpv(x2Yf{RV$9xq~`6 zT->xOrej4jqc=SfEHOaK<%_4n93{p!vzUnyjZMr6^C4{8TFBTN749dc-zl!+@3Zs^gt-Wq;@75`t? Mnun*~&ipeZT??qt8D7CA F#c+1pcHFfW>t8-*v6K zcUL0Of|G4R+CuLwaQ95-^;=Yg4ks6)2C=@o-jKPGkSjxyBETSgqmw`U-k*+LqAJCR zaIY)1YBZF#H6Kkk5j66KKRkw9^M20sNpWH-@#K}+N#N0btq5QFP7EXHZUb9INX$8U zdJuG3-(^I U$O7yprB3K_V8`0l B9*kPP_fEQ&-~@;(TD=E`P3EsxbmO2qBbe=XuX$7}T&!SEqM+ i(br;yU&wOaW4Gm>gz8lEfCOWbonh=H!w4a@68zm1$D+&G^mAJ( z#iN4BPO`m6^1Bn|Pu4QU74bmtzYJ7r9G~DcY!{|(JwN2|Q^ULK)aZtpxY=X4BgGm) z36D2F?{2E7b$Xg@1%pSRhE!hH>6bLbd5}7J8~O a5+`oS6G^cub8?yC7l5t}G0>J %f^P0s55(v`4dKH+J}S}2^wA&TJ oNA%r<}y#gw?jMk zj9`A?>oad?DT^=B+*Y!l?C7HAZB4Zm8q`b8Y5&(KbJ((5ZanhaTI$E+sCz=ekX`Y1 zvMBU~)@8mOuY^T_DDg;LkzooI>zivzFm>F?O-Q-bPT+wZs(BtI<4fb!J6u770FDYT z!7J?BpBJ1OEB=ybUZ=U T^o>nXm9 cMW^u^k+oaTm;MOg`b(p&|E wzb>l8q( zK%6^X6D}k8F2*2;ImkC)I9=$qWrkNC+r3fE&db5vapfSpiTG_gmJxsLpa-lo(Ja8G z_`*xUXB60%v!;>id3IV801}Y|!d__anVCCs+gQP?fo;KWo3m1-aU{**cLh1r4yo{> zQnw$eZc(_H?{1fkD`}T$DA$k5|FwS{^ctAJBdXBPt=|~v+Lcxe0!WA8xMwS}PnF#* z98qYlIIuZZo6*{=C*|^=YNY_GKoxwCnGjHh;{9PkkX`RORiL35PWmcRpGOZMZ_ZLr zM4nnaS1>Ar2@ghnC$1foxdufP;nNd9ARLzCeY^bmjl1920hOX!OF5)bT**yHxz$eJ z<$wk}rR#EE)?hQ?S}u0{4$+C-#P9={l?kMCmiIDGVLpVF9oJ8lVIZavOaicQ2;&Jk z`l^?Z&s5`K_LmIr2WxBmm1~ua&aY_QMye$|4?v!3Q$#~cr$rrmxrN7Ofx-P8j*W1b zRB*E~D@sN98Go| Ybp&9P}W@(kJ| zN|BZZVVP)S=ps4Wp+wx}8!MHO=pAnk6v^ZInC;T)gl*ExpnLh%{EH%_+vLuq$20B@ z8e-#N>O#NB^D9Z)gI?W@n*6 GLyPv^aCM3fd9<%k!! vMBXQ+78yNTo?cR%! pUi&b&z~nu z)YEh)$}24p5+2DMCh23;){$&*+XW;%=;JccnC!qm;DMm#VJ#T{>jyt#MCcsf^^RN^ zi;si}fXpvStBS2^vDbFKs&YA~F&|`9?w&ME3 btfI7-2v+Y`2Vnn9(S$T zm}gWyulv* xYI{N&0m6H(eOj4LhZ&L;v`N zHA&u$0=ytRjztfIz96?#1nwJ-KGb=Xhjdg_nG83JfmIcK8{_PlC;>?|tw^o^%E&J4 zrv3J+$GF;?oz=0T7yNa;|Jr}~Ki4f}Z7pgef?aiyggd35^}=iTG5ML_som3!DDBdI zOO!y|ER52M(DXbZ@5q+z8+l@C<-n_WEiT!;4Qy-scp|j46`y|1E>tdo05NgnDl1m3 zzsv^(^zNZPY0XlTfB5rNIF{(q;m}HeLqz%-YCls6oQAD^O$G2Cez4?5I(Il*1i