From 39bd5f669146cd469c979c3e13e37dbabe0ca903 Mon Sep 17 00:00:00 2001
From: jacob Copies this tensor and sets the specified {@code index} to {@code value}. Note: unlike with dense tensors, this method returns a copy of this
+ * tensor with the specified value updated and does NOT return a reference to this tensor. Because of this, it may be
+ * expensive to make frequent updates to a sparse tensor. Copies this tensor and sets the specified {@code index} to {@code value}. Note: unlike with dense tensors, this method returns a copy of this
+ * tensor with the specified value updated and does NOT return a reference to this tensor. Because of this, it may be
+ * expensive to make frequent updates to a sparse tensor. Formats this sparse COO tensor as a human-readable string specificing the full shape,
+ * non-zero entries, and non-zero indices. Copies this tensor and sets the specified {@code index} to {@code value}. Note: unlike with dense tensors, this method returns a copy of this
+ * tensor with the specified value updated and does NOT return a reference to this tensor. Because of this, it may be
+ * expensive to make frequent updates to a sparse tensor. Formats this sparse COO tensor as a human-readable string specificing the full shape,
+ * non-zero entries, and non-zero indices.
Assumes indices of both tensors are sorted lexicographically.
+ * + * @param src1 First tensor in the element-wise multiplication. + * @param src2 Second tensor in the element-wise multiplication. + * @return The element-wise product of {@code src1} and {@code src2}. + */ + public static CooCTensor elemMult(CooCTensor src1, CooCTensor src2) { + ParameterChecks.assertEqualShape(src1.shape, src2.shape); + + // Swap src1 and src2 if src2 has fewer non-zero entries for possibly better performance. + if (src2.nnz < src1.nnz) { + CooCTensor temp = src1; + src1 = src2; + src2 = temp; + } + + CNumber[] productEntries = new CNumber[Math.min(src1.nnz, src2.nnz)]; + int[][] productIndices = new int[Math.min(src1.nnz, src2.nnz)][src1.indices[0].length]; + int count = 0; + + int src2Idx = 0; + for(int i = 0; i < src1.nnz && src2Idx < src2.nnz; i++) { + int cmp = -1; + + while(src2Idx < src2.nnz && (cmp = Arrays.compare(src2.indices[src2Idx], src1.indices[i])) < 0) { + src2Idx++; + } + + if(src2Idx < src2.nnz && cmp == 0) { + productEntries[count] = src1.entries[i].mult(src2.entries[src2Idx]); + productIndices[count] = src1.indices[i]; + count++; + } + } + + // Truncate arrays if necessary. + return new CooCTensor(src1.shape, Arrays.copyOf(productEntries, count), Arrays.copyOf(productIndices, count)); + } + + + /** + *Computes the element-wise division between two complex sparse COO tensors.
+ * + *Assumes indices of both tensors are sorted lexicographically.
+ * + * @param src1 First tensor in the element-wise division. + * @param src2 Second tensor in the element-wise division. + * @return The element-wise quotient of {@code src1} and {@code src2}. + */ + public static CooCTensor elemdiv(CooCTensor src1, CooCTensor src2) { + ParameterChecks.assertEqualShape(src1.shape, src2.shape); + + CNumber[] productEntries = new CNumber[Math.min(src1.nnz, src2.nnz)]; + int[][] productIndices = new int[Math.min(src1.nnz, src2.nnz)][src1.indices[0].length]; + int count = 0; + + int src2Idx = 0; + for(int i = 0; i < src1.nnz && src2Idx < src2.nnz; i++) { + int cmp = -1; + + while(src2Idx < src2.nnz && (cmp = Arrays.compare(src2.indices[src2Idx], src1.indices[i])) < 0) { + src2Idx++; + } + + if(src2Idx < src2.nnz && cmp == 0) { + productEntries[count] = src1.entries[i].div(src2.entries[src2Idx]); + productIndices[count] = src1.indices[i]; + count++; + } + } + + // Truncate arrays if necessary. + return new CooCTensor(src1.shape, Arrays.copyOf(productEntries, count), Arrays.copyOf(productIndices, count)); + } } diff --git a/src/main/java/org/flag4j/operations/sparse/coo/real/RealCooTensorOperations.java b/src/main/java/org/flag4j/operations/sparse/coo/real/RealCooTensorOperations.java index ead498382..eb16b494e 100644 --- a/src/main/java/org/flag4j/operations/sparse/coo/real/RealCooTensorOperations.java +++ b/src/main/java/org/flag4j/operations/sparse/coo/real/RealCooTensorOperations.java @@ -140,4 +140,83 @@ public static CooTensor sub(CooTensor src1, CooTensor src2) { return new CooTensor(src1.shape, sumEntries, sumIndices); } + + + /** + *Computes the element-wise multiplication between two sparse COO tensors.
+ * + *Assumes indices of both tensors are sorted lexicographically.
+ * + * @param src1 First tensor in the element-wise multiplication. + * @param src2 Second tensor in the element-wise multiplication. + * @return The element-wise product of {@code src1} and {@code src2}. + */ + public static CooTensor elemMult(CooTensor src1, CooTensor src2) { + ParameterChecks.assertEqualShape(src1.shape, src2.shape); + + // Swap src1 and src2 if src2 has fewer non-zero entries for possibly better performance. + if (src2.nnz < src1.nnz) { + CooTensor temp = src1; + src1 = src2; + src2 = temp; + } + + double[] productEntries = new double[Math.min(src1.nnz, src2.nnz)]; + int[][] productIndices = new int[Math.min(src1.nnz, src2.nnz)][src1.indices[0].length]; + int count = 0; + + int src2Idx = 0; + for(int i = 0; i < src1.nnz && src2Idx < src2.nnz; i++) { + int cmp = -1; + + while(src2Idx < src2.nnz && (cmp = Arrays.compare(src2.indices[src2Idx], src1.indices[i])) < 0) { + src2Idx++; + } + + if(src2Idx < src2.nnz && cmp == 0) { + productEntries[count] = src1.entries[i] * src2.entries[src2Idx]; + productIndices[count] = src1.indices[i]; + count++; + } + } + + // Truncate arrays if necessary. + return new CooTensor(src1.shape, Arrays.copyOf(productEntries, count), Arrays.copyOf(productIndices, count)); + } + + + /** + *Computes the element-wise division between two sparse COO tensors.
+ * + *Assumes indices of both tensors are sorted lexicographically.
+ * + * @param src1 First tensor in the element-wise division. + * @param src2 Second tensor in the element-wise division. + * @return The element-wise quotient of {@code src1} and {@code src2}. + */ + public static CooTensor elemdiv(CooTensor src1, CooTensor src2) { + ParameterChecks.assertEqualShape(src1.shape, src2.shape); + + double[] productEntries = new double[Math.min(src1.nnz, src2.nnz)]; + int[][] productIndices = new int[Math.min(src1.nnz, src2.nnz)][src1.indices[0].length]; + int count = 0; + + int src2Idx = 0; + for(int i = 0; i < src1.nnz && src2Idx < src2.nnz; i++) { + int cmp = -1; + + while(src2Idx < src2.nnz && (cmp = Arrays.compare(src2.indices[src2Idx], src1.indices[i])) < 0) { + src2Idx++; + } + + if(src2Idx < src2.nnz && cmp == 0) { + productEntries[count] = src1.entries[i] / src2.entries[src2Idx]; + productIndices[count] = src1.indices[i]; + count++; + } + } + + // Truncate arrays if necessary. + return new CooTensor(src1.shape, Arrays.copyOf(productEntries, count), Arrays.copyOf(productIndices, count)); + } } diff --git a/src/main/java/org/flag4j/operations/sparse/coo/real_complex/RealComplexCooTensorOperations.java b/src/main/java/org/flag4j/operations/sparse/coo/real_complex/RealComplexCooTensorOperations.java index b26305bbf..b02c28b54 100644 --- a/src/main/java/org/flag4j/operations/sparse/coo/real_complex/RealComplexCooTensorOperations.java +++ b/src/main/java/org/flag4j/operations/sparse/coo/real_complex/RealComplexCooTensorOperations.java @@ -191,4 +191,146 @@ public static CooCTensor sub(CooTensor src1, CooCTensor src2) { return new CooCTensor(src1.shape, sumEntries, sumIndices); } + + + /** + *Computes the element-wise multiplication between two sparse COO tensors.
+ * + *Assumes indices of both tensors are sorted lexicographically.
+ * + * @param src1 First tensor in the element-wise multiplication. + * @param src2 Second tensor in the element-wise multiplication. + * @return The element-wise product of {@code src1} and {@code src2}. + */ + public static CooCTensor elemMult(CooCTensor src1, CooTensor src2) { + ParameterChecks.assertEqualShape(src1.shape, src2.shape); + CNumber[] productEntries = new CNumber[Math.min(src1.nnz, src2.nnz)]; + int[][] productIndices = new int[Math.min(src1.nnz, src2.nnz)][src1.indices[0].length]; + int count = 0; + + int src2Idx = 0; + for(int i = 0; i < src1.nnz && src2Idx < src2.nnz; i++) { + int cmp = -1; + + while(src2Idx < src2.nnz && (cmp = Arrays.compare(src2.indices[src2Idx], src1.indices[i])) < 0) { + src2Idx++; + } + + if(src2Idx < src2.nnz && cmp == 0) { + productEntries[count] = src1.entries[i].mult(src2.entries[src2Idx]); + productIndices[count] = src1.indices[i]; + count++; + } + } + + // Truncate arrays if necessary. + return new CooCTensor(src1.shape, Arrays.copyOf(productEntries, count), Arrays.copyOf(productIndices, count)); + } + + + /** + *Computes the element-wise multiplication between two sparse COO tensors.
+ * + *Assumes indices of both tensors are sorted lexicographically.
+ * + * @param src1 First tensor in the element-wise multiplication. + * @param src2 Second tensor in the element-wise multiplication. + * @return The element-wise product of {@code src1} and {@code src2}. + */ + public static CooCTensor elemMult(CooTensor src1, CooCTensor src2) { + ParameterChecks.assertEqualShape(src1.shape, src2.shape); + CNumber[] productEntries = new CNumber[Math.min(src1.nnz, src2.nnz)]; + int[][] productIndices = new int[Math.min(src1.nnz, src2.nnz)][src1.indices[0].length]; + int count = 0; + + int src2Idx = 0; + for(int i = 0; i < src1.nnz && src2Idx < src2.nnz; i++) { + int cmp = -1; + + while(src2Idx < src2.nnz && (cmp = Arrays.compare(src2.indices[src2Idx], src1.indices[i])) < 0) { + src2Idx++; + } + + if(src2Idx < src2.nnz && cmp == 0) { + productEntries[count] = src2.entries[src2Idx].mult(src1.entries[i]); + productIndices[count] = src1.indices[i]; + count++; + } + } + + // Truncate arrays if necessary. + return new CooCTensor(src1.shape, Arrays.copyOf(productEntries, count), Arrays.copyOf(productIndices, count)); + } + + + /** + *Computes the element-wise division between two sparse COO tensors.
+ * + *Assumes indices of both tensors are sorted lexicographically.
+ * + * @param src1 First tensor in the element-wise division. + * @param src2 Second tensor in the element-wise division. + * @return The element-wise quotient of {@code src1} and {@code src2}. + */ + public static CooCTensor elemdiv(CooCTensor src1, CooTensor src2) { + ParameterChecks.assertEqualShape(src1.shape, src2.shape); + + CNumber[] productEntries = new CNumber[Math.min(src1.nnz, src2.nnz)]; + int[][] productIndices = new int[Math.min(src1.nnz, src2.nnz)][src1.indices[0].length]; + int count = 0; + + int src2Idx = 0; + for(int i = 0; i < src1.nnz && src2Idx < src2.nnz; i++) { + int cmp = -1; + + while(src2Idx < src2.nnz && (cmp = Arrays.compare(src2.indices[src2Idx], src1.indices[i])) < 0) { + src2Idx++; + } + + if(src2Idx < src2.nnz && cmp == 0) { + productEntries[count] = src1.entries[i].div(src2.entries[src2Idx]); + productIndices[count] = src1.indices[i]; + count++; + } + } + + // Truncate arrays if necessary. + return new CooCTensor(src1.shape, Arrays.copyOf(productEntries, count), Arrays.copyOf(productIndices, count)); + } + + + /** + *Computes the element-wise division between two sparse COO tensors.
+ * + *Assumes indices of both tensors are sorted lexicographically.
+ * + * @param src1 First tensor in the element-wise division. + * @param src2 Second tensor in the element-wise division. + * @return The element-wise quotient of {@code src1} and {@code src2}. + */ + public static CooCTensor elemdiv(CooTensor src1, CooCTensor src2) { + ParameterChecks.assertEqualShape(src1.shape, src2.shape); + + CNumber[] productEntries = new CNumber[Math.min(src1.nnz, src2.nnz)]; + int[][] productIndices = new int[Math.min(src1.nnz, src2.nnz)][src1.indices[0].length]; + int count = 0; + + int src2Idx = 0; + for(int i = 0; i < src1.nnz && src2Idx < src2.nnz; i++) { + int cmp = -1; + + while(src2Idx < src2.nnz && (cmp = Arrays.compare(src2.indices[src2Idx], src1.indices[i])) < 0) { + src2Idx++; + } + + if(src2Idx < src2.nnz && cmp == 0) { + productEntries[count] = new CNumber(src1.entries[i]).div(src2.entries[src2Idx]); + productIndices[count] = src1.indices[i]; + count++; + } + } + + // Truncate arrays if necessary. + return new CooCTensor(src1.shape, Arrays.copyOf(productEntries, count), Arrays.copyOf(productIndices, count)); + } } diff --git a/src/main/java/org/flag4j/operations/sparse/csr/real/RealCsrOperations.java b/src/main/java/org/flag4j/operations/sparse/csr/real/RealCsrOperations.java index b0079e86f..7af2154ed 100644 --- a/src/main/java/org/flag4j/operations/sparse/csr/real/RealCsrOperations.java +++ b/src/main/java/org/flag4j/operations/sparse/csr/real/RealCsrOperations.java @@ -137,6 +137,9 @@ public static CsrMatrix applyBinOpp(CsrMatrix src1, CsrMatrix src2, } + + + /** * Transposes a sparse CSR matrix. * @param src The matrix to transpose. diff --git a/src/main/java/org/flag4j/util/ArrayUtils.java b/src/main/java/org/flag4j/util/ArrayUtils.java index 5b1f2d32c..24afac953 100644 --- a/src/main/java/org/flag4j/util/ArrayUtils.java +++ b/src/main/java/org/flag4j/util/ArrayUtils.java @@ -54,7 +54,7 @@ private ArrayUtils() { public static int[][] deepCopy(final int[][] src, int[][] dest) { if(dest == null) dest = new int[src.length][src[0].length]; if(src == dest) return dest; - else ParameterChecks.assertArrayLengthsEq(src.length, dest.length); + else ParameterChecks.assertGreaterEq(src.length, dest.length); for(int i = 0; i < src.length; i++) { dest[i] = new int[src[i].length]; diff --git a/src/main/java/org/flag4j/util/ParameterChecks.java b/src/main/java/org/flag4j/util/ParameterChecks.java index adeadc2cc..ecc04b8a9 100644 --- a/src/main/java/org/flag4j/util/ParameterChecks.java +++ b/src/main/java/org/flag4j/util/ParameterChecks.java @@ -384,6 +384,19 @@ public static void assertNonNegative(int value) { } + /** + * Checks if values are all non-negative according to {@link #assertNonNegative(int)}. + * @param values Values of interest. + * @throws IllegalArgumentException If any element of {@code values} is negative. + * @see #assertPositive(int) + */ + public static void assertNonNegative(int... values) { + for(int value : values) { + assertNonNegative(); + } + } + + /** * Checks if a shape represents a square matrix. * @param shape Shape to check. diff --git a/target/flag4j-v0.1.0-beta.jar b/target/flag4j-v0.1.0-beta.jar index 37658b10c1c992ca6d7bddff8f366bc4c6d77bb8..24705ef7e7d8a5c0d58d9b82d12f03a67246b50d 100644 GIT binary patch delta 75423 zcmZ6y1yCJN^d$_z-QC^YJ-AzN4ek$kxIf(8-QC>@!QI{6T|yw(mtS_bzW?sjRGsPD zcTV5#>F%1jr)FT4IwzI}Nktw45*`c;77R?M1t9^665>DLd_~i4LC^vF9|vxl>K|~d zq@T;sNqXS$5Pz$atiU<{VIDa5KU@W8|A$Cl7$CI%*5`o}r?IHPA^(py{xiFL;rZuQ z`-Scwu76?r=WdKZn8X5!og@eW|F0Ya!Jgy|f%3nvMgRHEL5Tb-&q1)G0i9U>|KR@; z>m*IU68vKbgGBx3l?nOvALb(vrina25dS}cP(rc&tJa3%`bQoQCGZcYp``xV$%^dieoeE_@7i!G4$^;bxGV1=;4f@-K!ze zB|Qke#wMInt(z5(kEi-nT@8YtUS-UsbRR*|Fu1XC3A$v?sJh0+dO~M!d2!Pz%Tib! zP2U8QKXzHQrZsBFw5mVi*(Au8%+UpWcwd`{D}5}{A!gXL`#rqze%qhjyET^21n@(K z5z`tAlEnhYh(DI;=NH10fjfR|6SM+aZ$1!N9aDB?40ICX<$(8YRT$$Be#WOgNTTmQ zBZ58g(Bs^LG5XXgiJK-%xQLZ63d*QhwrBC8?~%Ra@YMdaHiR*qu=jMtQm53Rf9owj zpyaHV37WG4aOMh&2bbg>Xu7&KX2eqQr$&DGF!q-k+4Tqt=tyH^u9a$QADRF9brcIi zMR0`Ie0HpiU8qlFB{Pj_>^JX|s29qHr?FWH(OYRcjMV1Yldyrx3s>=F#N3vkojSrj z9Kf)T}n;u3Du-ADwA;YIcz|Tg95jr%^scLK9^^K zV|x+zb{|baeY8QeN5)cULfhDyp0qY7IZ1HDUOt^ye#EPO; )V!?o4eNzadXRg&h^b=;j-4i3i*)!=!d=)1!x$oDAaAXDPE)9at z58Wz$Wft(G-=TVww1zo_ZbmZ+>sOjGFcSom7 !>9LZ0FBW6)meM)y{NT2l;QF30)GOCXk2zZZ5BmVXUq+#-1eDUBlqE >-M&5HqF^06CKB_|N=SoJ}sxPQXt z7eeiNx1Ylh9 8oR5%;*~CW!G|Pf!oQqK%D0pUX!b zSqiq-YF(%8E?)yX<4}osSvtN{a#VSU1wYrbK8X{(-cd{o_s= g1aHv& z-tdsKdS)wl|GYC>y{ZNs(D3J~W*p!9Fa!Nc4^BK%O{Xe{6y@Qh`59td-o!>8o=fP> z7c)+5X1V*#FZQ6iPY2}r4TtNzkE`4sYW%;GY>YOi@P*F_ch5JCPosT@za{9VraQh+ zkebG9QaXwgeoKY$(>!N@G6YB7MFPjmn2C-_O}qn)CGYI9w@!jeYxSrkcS#Pxx+xGs zWw@U#i9mhdW9%js7^!kss$4EH-wZ~&o?&{q_dAjif*Z_#`I>p~e^ea!zD1=Z!DbEp z4%BDlZ^;53hzP%Fjf6dyTQU^p4LW*~ Vd#4l;|FDXINc>^S(LsB z`)qy}@6%TE|J(zqCA{ b;(s3MA7`XsDBUt$jR$5`yE-JAl*VAtu zvk1ZN<5#4GbMA{{35 QAGVfuXG8oXL)x zmL@XkWc2gaxJX(NmY0nEi@780CmE$^>X$_c{4waM>{XyvnQj}MKu?`@ Mk6$cP}8@ )5)%;$EuGEAJ zzmD7h*+n~l6Jc?;^|CczPXE1JTLG+J*jn10UZI*RzhZq!+ah6XZHi@;i>_kX0|&G$ z@GB^#^#BZ3Bq)s_IIn_2RJ5SNo;17d9J8>#*^+OkGRl!wq~WuAgwKbd>|1jzgRW(w z6S7aL(uM5$Bw&7%j$vZIBknQWB+-m6!}YXT6f-ezT-_xxN!4VQh4&nnPqx}+oi^Q4 zKKGCoYvqhkr(Q|w`*C*gH+KH-QkD~^VtAm6Hk_uTd8$hDWBm&c)l@_J%AL%qvIY1h zL#7Rh9l1!YQ7ZwQDqmZ_p91=H?Rw@eE#X#O(Ld;mh}QT ~y;onen~|6SWhMRgco);^{gePZ~ccv_?ck`iL}hDS?b1tQt_9)_{9jTb?~ z;y%?Vw&8>Qp(V^be-Z}>_G|i1BaO((e; P*>rY#?+!ZY%i?>!=3 zJZE!MQdC6+@f*F?1Fg0&$5X@Lt9Sbq&(}>1gR;oSil!JAzMFa4+Kv@SW2b LwbTLFVaPKr$Rx6U#;}M)B#VYaaqbzKC#6$#YltKg<#M`T?}|FC z^*;GLKO2;$yO3U*2&sj* dbNx68%TP^EeXV@Aa9L)KUjcQ%*uL?jkG}Ikwy3!t@*zKBpXzA3D3CnDZEBPR3U% z<~4o>+{KHLH^kiiGF|}f;1i`{1lCk|>=X9KWDxgfTgAJYuwqAsCJ`DPTnGppKiLx> z>eA|DPPufEY(9pTAHjF?C8C=yU6?jFioI7;Wj}U=IwD_$tLI&?_CNn9b5b%>7^Y;- z=qByN`k7G(^9Oq8>agqRZF6X4?!&*-m!#NQS <;6Fnic$ zK`X{2RS^4Q%$*{pr8&wz?9HM1%`NIq)@$b&Iqm_O_{a1e4E>YF<$(}AN}ny)wTb)D z4+Gp86e*#AhN0`8{1mLA>!ROA`VZJVTfVnQ1)^%4(Z-BMaG^$YQoCl+(ipLO7j}$V zkCVGOQpW6C0TjESR3WDE >mze|-TDE%wLFRx9QkGxO`LC>-((bR%P`7AN zN`oyMX2)UF91qUy0|yaZtYld^XK6ZbgrmnNh{u*l4;X_I&H15q52)k2mXSj >+> z>Z%-*`BD)#deKxHTVrqI<8s^AXoRxms9D~SemL6NDLx!q-E&@viFCEjI{M#_?>y5d z59oMFu-Zw3s^y~ootl4yBCF-NBfW8NHd0^4yS!`Mf8TZ8&>r7t6^j^UG$_NFbcp;k zgX(m|1bvS)uIyqB`n;d2_Pv*`+Fp5pw0@9(zjwkJzIU~+P@u25?(e2y?eUC?LfW6Q zLuL`@Yu%&O59nBpmHNSbAUCupQCfhXlq?E6G{Iz;wh$ypUh*~|`LZ;deD7NF6frr8 z=P_btfx&`p5qk@B9XR6auuF$%o_hTHvXgWBSAT@g_1`|NJC(ZX!3GSZxHy>cZ4Sb` zV@D6vU@Ib;t2#jnNuWHq9qg9e+;gNAjtv|l9+7|L52wb$8ds|?e@D??KGsma*8JId zw+u;rW|+yKeC$bH?gPrVYwjZW_1gk`GtC&~1>5}PQ79n+-*t|ds?X>AI3X)QxfQl5 z0pv~gv#vn`f2)9*af13T0TKNdXT*Fk5!i4NH!jYE!w*En(us+A=v*u{6LUuQrS=wl z<%SVXT3}{Vq|nlv&5|N5?bBlWjnoHr9B+n6+XeFE8iH>L M@yyHAP+SxhK69erpul7W}z!f((_p zu<-y9w_byAm4c#;-4e`% S)zIbxP&Z|U~7d+w;fYY%EhDD$|{1N^z&y?n& zz`5-TlN=1NFMftac_0wB^3!EN03q@;TgM8Jf`ks_QlxrxW9n9U>~S=0xIA?g{eXUS z8*0GZM%wSLz>i0Co=+Wj3&rhJpF7nvKIvqSrPuv#bQI-qW-b__ BUT|mlklIYYO7Y-AW#*P^j&=W-?gN3B7?bT6pZxC2uBJ^u8OM{o^XrTp&}CB z!93?G_Z#vf>b;DtZh7dHHMX2J_nVJU x6Us2%G?-H+22nAmX7P~-k{00xyx}2xgvPL# zjZ3O-4B{~1o_JOpm2kVA$+@4++uIT7c@a2lgwzR=>a6gZuhN4b6r03KSKVQI$GF%* zXO*vDsx-89W&k#-7`L*J2k(o$?5ufe*Y?f#J_hggbJ2OCzWLz4)}r5#Wh^`5e-S<+ zwlOY3G8U|n (SF3K!7vvhwI?Ua;VasOjyN@vvE%SGPbE%p z|J^?m@ZTk@2ZN@@Nx78ZmuETT)|a$JMa*%I`y?4#kh+&`q5ZB*sSnknA7vj&CdM g<**s^booig@0Y5JTH%3u*LyKWYjW#8W-CQpgRIBczKj_$aravO5D>>s?sP z&+L!zO$knZrBQtS-lx!sPBW{)n^N1C@u)%h;)N{I8(%xJ (^tTJ3%JviSSzoU=0bbQB*jmj}4KHs=fiaZhLQ0quES8dDzJn}FLF($ihu z4^+GcI=sw}6Dw=jv89AvD +rb*I+Mk36 zKjC0*uTN3#>1e-8%ifYY{2$I0OKZ3pQ&4FkdyOtFdHrt9f*COjn{l;ndY$OHoO-&` zlcFGbUF9w&p`+t6A)L?xikHy5E*lSi0zeYr=x)-Vm3u>j_&x{{!?euF-ye;fSFqXz zAyop7f^E-;bxua+OXV}JiB!n^IgGlS(=OTDV?2+RdCdhrqWjg?iVNN3uG#@M!Q89P zxp7gcblI+RGqXoN${Q}H_%9Lm6r(QnS~`FCpR6Nw&pbR;sih>Qm<^6%ReM>NURNh4 z+o!(l)Jmn8H_npp(Id_#f(|BjS2zb9*|@_M-gv#-Y{ywN)Oo*N2yudY$3w?m+A~TX z>eLOz?rrn@#yojo_*iHW+uk(C=W|qvuqp#Z`Bi$FA7rJz=vW0{>GtG^C8sl$i8XQ814<9{)$CH_lT@GO`PpcxRL<$-xSY12xXeL!6Mks z$iHX~45@TPxZ?&$ATktNBXbqGsQ{q1!gZFRVs2v3bx2I>B$Yy Dm1h@tA6h$iH8<=8LTUKH0#hVS{yh6>_ZdOb)>#Y z_Nq#K3#T~4I&%fW8_LyXO5F?kS);pTohirtc1P #k$Fj_;pz;k zyBR_luY!7t&()a!tB||W6l#O2q^Z8g&EYe;^9M8RGz$oA7q`Wm(^yg!6%&}K!>Os? z&>OfcWoYz2&8WLfUFx{F&KbY27%1~qcQtcpbJ? ;VD+W?rbtpM7kHR4g& zqRBTHx&qv`Y<3I$?B}&Fnp-Vf-wxfXuGj6C4D@O`tA;AOG&5aSjz2)>wVwL!Tsp2= zgUP2;K~-I;kJVig$w5p#*Y28L);LZ6EXLpt!&X<{o*?wlW|>D6uHYAKHyY%+&}-H; zR!3JJo?oceTUHAU!U&o#m_$KzMUT4nFQHjX2|IQvhTogy>J&B4uz2L_h>+#$&NR;? z>s0@2EHpUfU->)`;emr986# PYC3AC-rcUkeITQJTQ- zunF>4ee`&UgzK`TW^PIw5IU`WV!T-t4LibOG1X89PD| Atmj}oxjt3-h2JZqu!-+W)DmWbf55gqp^t!4(+X^Rhgq+%qUQ|7 zL!S7RW|2wD-=`z#6bi?}32GkoTp1tgL;cF^Bt~q!#EB-1wfmO#^aO1Y@y`HWFu8^N zv2VRRBHS95+@+mXK)2t%7E(Uk1Zs~k#3;tn2EmUap@I<~Rwz0mGNU0fvv~@mMN{;1 zBk?`2{X(d|c;TRzTEu4RNzN2~sDq@)umc6t@7lx=RaRs u@vTaPFL z*ys=z#ymZi;5t)P%;$uVD$G~*`1Nk?>(1`i{t@feGh3cPVB Xysp~$jZkXQ;TYm>-!Cb 4(A9Btd?%jZ7&;@pK~MUf8bUo zf5O&!mpBU0f((j3Y-+`1CerjfZOf}*sXk%;FO8|~mmat??LU#pHW-{<;Gf9!5crE= z`me|Yr;rxM{)H6e;Gk}9@9f~jY-(rh?A)S<@K +=v+Ji?m`RCBx}gOsnuT=wD_^r#Zr(n z^IvIEtEAF(_45QfJ*(!-HJ4hJ=M|_38v79V@K5=p{S#mpFuVv7!W#tWEg9SKn)tBcnzQCQnQXg)M0NduW6&(oL3j8H zvt%UH *n*tg=C4{0adTuoP{0 z0*JO|zNGl#j*<}G3Tzrg%3KCvc&tf(01?3gOst@)?}k9%&jJm|+CE0el9pH+y5$1M zH&|UpMl&&5X8V?5$QTuA&x2!t1wot~-~s*0*@YJ4OK5*Vj0I&ky@Y at7+@`I5u zS(YY2KQ96WDzgJO1vmxns%d<_20o(^(56QPJj$g!7(qq|(C0X6_9Fj{#^P~^pV3%v z;R~qX=_|p^Y2c6{ZJ?xKd1w@;cI^PXc0_!ZV7B%(t0|W#g&cXzRTvAtwLwe0T+kA~ zK4KcFI`t{@rnywKHYs7FVkHwHb6os8HSS%dZ70%l6){FD_NSM%2#1nsx< =ur5*rniZ~>Utd$ov84rk>)}; z$WU;BpNKh#n!J6Bv&+VcJ2>0KN%iR)8pgSi5KQm{nr5l ky>b{)a lq^~UuGvL?al1&w;ypek2ZBWIDKh_2Gs0a&-J7(H5S%oPwd ze#}xqWKM+v3`TjFO>>*G2#m=3DEX123*2cvQY(eW82$w#1$7q-b?NzP6Tc@oSumY- zL}OrH+HGh14Hs<4*{jnC?I7prvN6mh<>q00^K>|Fj>Tm3q8-;pYZ7C}A)*CkYXD(O z4kV{L5@$fX8PDb1?x%|f$z_c5Y8ePm>@j^FhcnjMm5RW#VCDQ49GMLNZq_Wgm17dd zwVn8B4vbspI2(Eqoufr?SDgRyBt2W)D~e+z>NOmhr(b%ElCeWes$a@G3oQmu4D_%N zkz1Ovl7zr>=E&i*`7IIg0n;ZcB-UvUn@AY0Ezxoel}5*D;hdKlgpX|Hm<2*^8|Who zLEBic9l)$ qHW08%wVt|fU@lULqgAxaj zn(}F2%4mON?*iW^XzZ1`{|{Mwo2
g*aaMvGFrm z*7J&XAj#cU+=8~$v4tTA<-{|c@}DNrU+EF}Fqx}5aWm(R*nXlq`FNZH1f4<64uID@ zD4Y?}7Y4%*_l)=N4_lyxZlQOnu$}%JD{q|{Dy5u*;}fta*6yDZXq9giJMVC0&%Mr0 zG*Wr~y|;rRrf7!qd*;s!I2wZhfRQx5@pPO4U)66c?7byUejyg%hA5KZa~E>mfQUo^ zy$Q?GODvw$H`r&K?t;Ev*JqUOwO&|QXfdgJakpxOt9*$7w_?!OaM~KYMO_Zr9Gg8R zqU})ka$fGhzDy(D9~b1D*=^kgt*J>?%-m=R $G}4 zan>Ua)XUqfvq1!7o&}OI7vjBCS5p((aF}R8n&_RyY7j+H2aF{k8&TpL<{yN#r^BNZ zRZSqOrhp7m=d?R`1IznM@R=7H@L9x0m6rqXqOPzrjq0`t;VxNCEV=}7vqrhB47Q|3 z%*mOJmbK2cF;>ve>gc*T#?@-~Uo@THH^*HS_)$Yd-?YmP@Vk>Ig|TB7wmu0bkBd+V zT=b)2C;^MP@zGM475&Z5ckIH19zUCWUJ z zsDVaML&vyr`H(X|2&>&x8ZheX=GX#Ng&ASx&rvN ^;Hp$l;KsBMQ`3=WRJm{ z2v;1`D0sOs{s1{$l+m3GL5#UBc2!t*dkB~kOQfr2XVidFUw1~`^NQdRQEs APn8O*wKWCi7jJE^Ws-j_sa#9LL_8YhJ(mxCh@nJ#1-tuz^s% zCFJO6WWSi9u%V#bZ)tf(N+%BVv7+#IuMYf-yES0JLlCClJ~zAOq;Y8{Qns+!!y}@y z@xV8>a4K&iu3cZkzKn%-OGgSY2tajcwqDR&U$N=G!pxCcf)Oh<@4u*l*k=2+$4$}R z7Y_N{W#=-~3Qfy6J!wV+k<${Tg$v?*O>8b3m91O*X4o~iyLl+(N42bcx@7?Dv!woI zkcp2_Y3*a^)V9oTKW&ff5*)4V9vq*^j=2VertvTwznnB7`85dkt|y8IaGtc<*fw$* zgYxRX2W+M<2K&ePQUI`;k?({T=znkSLm>t%-7BFM=$oD!NrkB-s|J33XaQxtbuJRH zyRYAvJVzP8wL>hg{lK>>Q @tw)Ds&&D7Dsr_&ategwS61H^|s;*91Ux2-Suh!Mwen?O@+SzW~0&*N$ z=8iA> UIeajC47pp|$Pw)yjIlxh2${eFm F=L<&xqLyWwoBh(8YX{LR@@2a+0~3J|=>zhhsA}lyt66(WTM&mu0H*Gb0@rjypGx zZTaVmZ6``}Tc3ve1=XNP3`z&*c7b_|T4YCh_Ic>^3HU K#@0Iz!MNOW-7_*9=4dsKhxyTmowqgk>v-4i`k v6oWqLTrL#v8mc=xCKx7cqKJl-94bLDtgyC8J_qDg|KU- z-dDMha<;&} UP4si=@7PtOlD|a8?G=wTD&N2MQ*;L-+zPh1AdxaCzJ-hxPgrolyMw1dniVo6! zgZ3q`L>h9~Z}SIz^5lYqWNt@$yAm*PcS|e4rC#MvvUAl^iM^Q2#3>H@`N6N+px0)L zs5p00`o6H;S$(|Y#~l3 >&y_XT0?|d49@ r z;CI&{)^I)uveTIO(w}}64#@=&x@8igCL0Q$9;!UhBewtRNq6M{ 8CuX`Gd!rwEs1n*_N# ;tgk2~$zdGU3vRa(_Vn)>GS+%M>$} zQvMm5YI>XN cu?Sn#2LrVv-~hwfm|8gK<-bThpRR8xG9<~{fXs# z>KO)_S%A>1xp@^V?zqVYW0Buhl{*$F>wSUNu}_QNP%ePnMK$Z&qI~T!Yx_Om@{B$i zGEfg2`xD*+jJc?lVVA5S*Cx@6IeAz4&a!!5tQ`Fhc4~mgh~-%(lxVuNn?e?JGeVRm zYztPYO0V!nt5;5gw-A*p8_c3JWR>-7r6?Kb9nJUA9T_{YtWL3{^wZI5_rX-)QKx`B z499T1fNr&nSUxL`s@)_OfXUa&a2#)}*FY-`4UI$MI|0XB0JKxu#+a4EAPjP3|M-m_ zJ#Bm74e+TObieEHt6X(WU7Z@M@5R-(6Wma~ym <#T#cUaA}dty3^51E zuH;Q><&^~z|9=2!K$gGlItX5$r_y~NWD6Vmwa=~G1Iwf(#eKkvDt%rMT;j@iS&w|~ z*-d >pTrf^+NzWaWTJWIr!`5qc}MZQNqENhmy@ Vb>cK@{$Rsde2Wxhfbyh;xE8h-`&zY}GzQ>cHHIDZ2clfkr7wCRBV zLKNPiU~vv^CiV`Z3J; 4}?!vb1=V%!EDlFf&0e{b7oUqx@D-UlwPs+KTHRTjDC^Pxquki*>b9^Jx@F zTGYxcwKCh6T}W#8WeLS=6~64b`7Zj{dUa*izHAQq@jf&1J>t19E8k5Wf{pT~OLly2 zpGKee35V-v970ij`dI_~)^h^!kPkW*Kz|+TniZ zMb~yLfll Qv6oRhB7wFDSF=wZxYoV_)@SG#yEPt_e z n4IZ4h++RrhfdXoF3w?!>zY;hGf_QGch3h$(8d*Jg&Y3+w531fEg?MZEk9m5VC zf`w$29!U>vk`#ih=tfaZCNtbpQBc?mUlf7uj2% 3ayf$!2!IKHMe9Xd(+-NSj)GYus jUDY3c=U*z2Z=EDYji6V;|t|iiLrLi8FJgIMyAn$;W6s1u%@+O6~ z>-cqsWYd&v9$+??2{H?b%zx6;#O9YNYJ7$H5 +boA3Zc=(>yA-;bZAfPDuAfq&22B)3oqeqNAV z2A2uC-Mo66?gRKTSsYU9Ez;qqQ=amo*dzTA6ePPS1Xv_nVR;(3&atlxH!niTG{9R> zN_ C^H 2l z>uGRa6MHe^9B|_2d&xNG(&GGG^6aShA0*)@`XG8gmC7^YJd=!5FbL15Qh8>apCse> z2jTf_ye#Rjub(I5EFRPj9rg9gWSmul= ;swbU9#L$G>Bc7 VGR{+j$n$clCo<08l5u`MuqX15NF>fOiIYus_F6$N z{4*Kq#RRBq8!8)L7pV&JPnK*4K+#LVWQ;cwFccd@!GC`U3>W_tN@C0r%jB4pgrO=4 z1{23X{uP!Sc^UQdh=r6E^YO=jk0b$PC8VN>3;Cx^MYHi=6kn`mz99}U5dTg2x&?nd zrA|Du+)aF+^OyFZ+AxRAyBD>!CvXH6=ZS`2rdE`>Dvsf(q%$CO47k;?kfY|oSan>2 zK;^bT<$sh%a2b+AS^0nY6p9kNLVQb}M7|FHkOF-{hKh^)JvgQZ$DP#b?GQ1ov|p)U z$A~5oAfDqR3Q;M_Q;LK#L7hfL<_ySFXTlu1R;aV>AfZzw6%P^@NpZcfNSs LM7e zUH}u-#k9aBuv)ExdUYwhm#&6dZJ%P1sB(!eXv4RKon}$S`Hmn!hgLi%((=);LE-;j zwSSA^Y=fdGDv_A2xD>a{xqY;7&N>fky;y$&a$7VG>>i5iT4ReltFgu7YCMMP>a~+v zi#n>Q#g&ImO)c&`T;J5<$-@mz4caLvYEi{7m4>-!7+pPTV>4lJE48@X39W9?N-Zv$ z#_g7^o_?*Gn7Dau-)Yzq*TeXpd{+-%)qi(zKAFn}wT8%B4O7&MVX=A%98lN5A+?_N zqXt3NLTh=7N8!?93Vci+JS~QZJkL5{AEX~5&w7o|I&y1qi;^Xe)GHE8$R2D@KH$0_ z!SQ7Ysbtgr2(tcMi2ozVZHiYy&X?(hMvy(Ybs$770Wn)iKnp23&H|2SCHpB42IV-8jL#>T`s0lhDqJeN97bLdoXrn01SN~#`icb zXjf)3?NvrdndaGhSwRo}-$0{13DUSx(z@4Cifc2I!mW% ^iOZgm`dOJ-hpN*Uv{gyeIt!IyAK8EXUCwNMY zYt9i`ndk&`Y#2ZVDM?*HVd~LJX4~rRN})tsBsb|C5l%R-J3bI%PTDkx%2)BT3uTfr zSzM cUu7!}jP&kpY8<)vVUY z_N9@A=C*LFtTDuZp_Ct}i!|1nl}L!gNe&|zc#31>jxu006k|@*lwp4tCaG+R0i{re zWQ3cMb|RzS!mXigp>cl=k#Q@+tqq~ZhO fOmydO@tM_O^z`akC{0D7RwNlp3?-A}Y36=G9_fVBS(#ro(arR=`RIBU~k5 zYUnD&MMQt~isf@Hsum>Zr;EN#&!h}dvl`auaEbwI;Zz2*<0?g3!mXjUhDftru`b#= zt`*0Q96&b8qV|8rwuY9*hB{do TQHP?q)>t{zz78o=iKZ-Lc6oB<`nhvKEQ)e(( znh{fH)J2+F8pAtG=FGG!k1fZ}P<2KeRog60fsg?kp$-RFTLhml7*(91G{Ue+hs{)b z3xnaQhFo>bSdC7D9iuB3?e)8y({^hLZZ}u4C(&>Xcn$Gjc55QXSVXU#EV#fWgAlRCjMc=i+>`BLEk{ z#X4L dB = orv5 l|)D%Xqzj{l!?o1rx+32-~TicdK zq78p-4co%za%gn`_QAb6+-E>vxSzqG)XK!*1h=(LMl;rf20R20qi@?5k)20tr;I8- zVn7ERK$@GdqtWp7c&>9G?}JBjafPv!oQp#S9EKmEw;$&etc=85(p{=16DR&mIzPR0 zkfDzjghvfHO4iI5ZVWfk0LTR&nXhx;C&WC-PZ?b1PIL7!6K$LHOdZl7JWdo}K$F-L zlzK9)U)&ukGo3g5ri^|`GWwN^jE=i&k*SRK!EX$B8h(qH@izh-fA{db4lfw+2Y3;! zK^H0(KsR4&YG|hAKf=}0GW3rI{0Uyh5x1$K5q)(pu25^pT)YZ@*5NM({1skfFwkjr z Sk6e=OubrSb)g!=|Q#pNyjN032yi=q#2qd$)2WX#0Mf5(7#X$8Yp z(%pMx1l~v2KkZP=e`w@?V8Fjf(!8ye&_6WbBlr&rVpGFL2GcUMFv`yPgb4kV!Tg>( zfKIRSbNE7sFNxx>5{ b6uz8jsn{OY0ECB#-3h5$*l{H(p&_vjeEv{Qrg171wA1 zHCp(;a=PLg9%Qh=q##}0ygag<9t@=i{U|k@Qu&k`NvT2_6{8JS%*L3(m`EgDFeVnv zq&N;MHCP$he?1R+?{#NVPC4eVacS24Hb%w`O(0lKsY#TYoMs7Yhkw$v&?UVJHdSZS zND?Qc3@q8!Azff84jieTZm=p6lpbo|+!StZqr91z$Hq}=7NsP2b0{^LQZ>ZqTo;Ej z?Eq8?@g#zrpSEwh3wtubE^wJs(hnfDz!nkc;`H6ze?4Hflr7WQa)Yg4D-%NND|SZP z!c7ePvTj|ZWha9YMaaBXk%b cR z0NcpIe?-+L^f8KQzS+VWbhg!CXR^iwF`1qOs`0i^V|#eXCfZl1QMejeteHi0) v-1u1HTHG1Nttbtwov2T*e20{n0MQRE-1Roo4Y8u zkbOgE7a8ng!tARm#Gn^Cn5#)db9aR5 V#a?fVm^*dp?W|c&TK3Bfb~%?& zI|3Jf(qLDy@1VX!EhS9pC)o;^Mor^ZSs#$DUTv^z*tHCDO 93=xX+T1FmB~I1a8xcUJ4`+0E4Kp5rj oLib!)+Lr_07*g 5HDA5&b@jp6+x8s0}3R2HvGw%C~t;wkJX!92!bdIC($K4y;d6T D^IDHn zt)I(U>E_3{T2C76e<@;}EF1a6nDtA_dW=%PrqoX<^)#h^PO0A+>>2hf1;uTHo5mBd z4Q|Fn{hr!*KBeE(eb7G;=!*=hir1-nIdh;t640L*%t!>X`#E!@R|x4<2BnCUMqd-^ z{e|lN)vTA+8M5omXRjOVZ;awNTS8G>=+=j=vm+GbVQ ?-=Y|_78OZ zTEk6|ZDCXovJ9D%`M$ya$v&VX9I^UQ3VyB29O2&v`!EiHPS6C{f7r)5`@~?Mvd?hH zcFW)`3N<&hv^U09{l4h-P>V^{m<*i;GDZJkUl{C5YFz?IsvyY0;EZz|N)6GKtqlvM zX*!i22!ngNe;%x&EZyKf%JMZt&1pUW`*^_MS(J&UcwT#B oN+4u?jvCClNl1LAC27k_l2QfH{Rd6yRfciOx%rOJ2rcQnyqr zc7SKmadWb2 e4@c8QG`Rs0&Q*K zX41_me+IAMQ!%eKY#k$;(VY#XB>HuJ0xkjL3}s_ucyp+6cI)PLTJX=^Q5S9@kp}p5 zUZwLH2A|1KWKiUcQ_pQ}jkGQbN28(5(qTc5fA)@sC}uP0FBfug)_4Ur-Mo2vfKTJI zNk8T|4tiP7WeAbi7;qM!%i!VT)@T2<10@Rof2En9MD)*RaCt`b*ZglzyW~PZ?%MDL zL>-#LechI>+gSY{oC(Q=EZCY023(p8z35LiGJ~qJ+~6x{1JB>q8fuQVknO`Evx-z~ zb;f@4>Rjke=t0`V+{aI)+Urue%Qf Lr_*Utt-1MZoo_(3cPjLp_J+p#aI24R ze?&`9lgJQ>P&s5|G!WqRJgoCg2H(uLB*u7TU7VmcMOtw-kvqmoLuFlZfJZst&fv3s z{7f`cizCfr&knanhFAwoD~GJ3r%eWL<`HZx)Y1}eu4gb-H7=8~EY7fjvv{k{qXuuI z*)M)Kt06LODHd&8(qc^~z0gD~3hlrNf4aS?IZ8FR8GJicGw{jM)^J@zR2rV09OZeA z!O!LAF(_~v9+LoThs;=Q26&cJ2#LZmHEO$a7XO;Tzb+?eYAaM b(oI*%CbB8w+wzM|2CGbletpClG;+Wp9?wsa)a;Ue^;QA zG= {Ir0NU(FyJ{iGqWL&=px z&|~D+8vHtby^P$%G^k&((hU3f4Gb6peIGjoyJLuTq8D*cBW@y`o1Gh{F-fA{-(v8+ z92fFACMVJ;#9~F8j&0UY?TjXDe}(hg41PPm0|yq7A J)7YH*TW5 z4s;>-fwU`w1e$(`b)b$?hj7`>56cC6H+VW?@JIPkI=kK&ZmMb6mU1(oe> 1;aN&Oiwh<*g{$ii`Sa;lVhKX|gTY^ J|8qu*(}WiOO7&jLe`qnBQ15S4?~NWV#}km=BBZx_79oi9cHcourUIZQ{y|N= zcYH!73AF!{fIm3)kVyjQzX|liw1;B55Bwj4J;guHAXb%7>r<-rSq5>jgj!!vtuK2N zm5ayG0C6 Q0c+e-VBY#*MNYoY_mu->+ zqKgb|kT#e>)@B*4oV`gpMd{8{B@jE*(1yhz(2C6oH&WCysEsh#<=RNv+w8{9P*59f zXvHKr^nt96Ow24Xf7p7hG=pGS99?4#t(@w3H(P<&pf=uMRoaB(veTR3$Y_%Yc=9pt zODBR>5a`t7v4@@@;1dY8@>qBK6CkS$R;Ep$)J#fErqnD-O{LTvN>x&-hMJyxTn noFr=bSy=-f4qWHvgK9ubRiWkrQ1^s zHdtGm=Dcn<4jUolI)YrE@(^Hm;7&JKuC|s^8z{A&QX37ePQ&$>9*w<#nd+2s+_>9h zXq#gdtw^rcV8BP()-(qS 3ReL0))lsu2fw5y4%Y zmcq=puY=k*(G53+bt$E!h%Td7Pu{20E_Aicr&m%+KK%|I?vPKvXJ}W`+AE9V+OgG_ zcCB`uu3b;XcPE~Waak|WM3T4!a1Dne_KgPg(!Nixe+tmqU(C44&~DcD(CK7aD4pE> z6-uhs_L5BYQ0o7Pp*^~GdtwAdu3JrUE^64((5!2BCLV^B1t@qPR|u&$x2Jk9Y-kRf z&8;-!+_?)Qb)m-9q1Fbvw=zZBmIfU1BQmjy)`98Ov{l?%mnLS{r7BpSHKcCBF3h0U z3Oe?;e<;)vBM_UKNW>?_&=7Vbx)1b@#Kh_q%kg#&gOM2x<<#Z6CME_$(kVKFp=s?) zI_9lmnEF(5#_!6cq{uFl^0an$Ud>4>OS_yF-qAuYaO`M_G>4n%69v(Rv%}7%e|ih; zHmcHk&D}&}Tjk4hO{uiNW=?O7Y+un9X*t$Tf3#KR*gL3e*hbqzv^$tpAC9)!=h5U{ zZR|@5A}WdZ(uWf2cVIV3eq=Q-Cg)PfHt0MIM_)cjFe*D+Vuodeqij|3R6SGbj(f4# zN|Va@k%lFkHpwF@qD>yR^C77*3Na}u)avMr84)a*&}5igYo+~nuRLEEHJ>hR!?}Ug zf8evmNL_kaXMBzc0UM&V3 ^7@Jo-(Q wOY)1P1%_Vd9cuj3F`wWS&_zid{~XrB&|1##@%6g>(0|)!imrhng;2->xj&Z z!^n)H #tU+#RKw8|cIQCGzV)_g&3S)oNFO9uB8I?Oqf9~OU z1w>`$k#_m8>x(keY3n%|lH%n_+bec+rS9A5iqief$hhLkDAkusR0W-ZYr9*gW#|kl zFdfI6 BwM(nKx~_TxU#oZaUf{ zV`B0cjjyL}ZKyL4sc3J26<<_TAC~lHgQEVB; I@nl{#lMpzruBPL9eoseW6lXDbNKy>BMZDKpo?}~$^&jyT`fIe(5 zD>K@@al{1lZ`Z5ZIbOjYM|0yH?nf#njJS#?B;HQzx((IWkC=+?oI`*Wi87VUPe}xs zoOnAa@pfWj6B80|kq`fhe}>J?p| lOz1tQ&A;zK#Tssib#8FU3gvt1r)MvfO29E^?gnx z(iUxN4Yio-m}pR(<}ewSjm*f|@9h<51lSg_!O)%%A&Pb4TBIf@f9B$Y`Tzt)*buA5 z$w6^4W^AF121Bf(jC{ qLoAVZfArxf@ohsamIAq)?sgesk>vGCy1U8{3*_B*>F#@msFn4up}T7h zF<;iZp6+%VqDIX1i5qd T;wEvkF7_DW7O^+s&~rocw#b>`aSNs8!JZCn z3Xw9RY0qkkzx!o;$6J+5#h4#zu5S!SabX`hv%Mu=KGs6qf2|^gvwHT>Y%+D-G09J> zLye6q8rs6t8UGg$w~5 6L}>i z`(c1K@ewGLDS@fM4 @*Y4-yC zS504{MY51E?LLdJJCQIAud7QA0blDm99XLrELkfGXO|p+VMJ*`GL=Zl$QYrN?gp(p zU<{lMQ{Wt!4d=oFI1g6A`I6QlCKWcVtED)ZOp!pj6z9Vh)z>1`9=wh(DJ?rvHrAvs zUr6%C5(W7JTThm!lb%Z<7rUlETn 4QX91j$&NiTHeXm& zdnDCFFp}*dvRwr1B>qMi0Y88exCxuT8LD6p%!gYf@iWbaZQ^TfVb)s0q!h8C$Pcr6iLB h(U<>w94#+y|$?{ZJ1N#OZk0W;Lwck112fA23;9wU& 4O6WG*7Hs{X_xj)0xN$a4(C7OsCXIG ?cJ%Zd7!D(6t=5Z;BZ1C#Y>~mO)qL_t(VA=uLW^rGM+>;EwC8eFP>H%AEy>guW zD^5ARb}L@3(^O8xxj==p&Vj?g73YU0j<(RknPK7JEYblRl1XB{;-LIClplYg9 R1I{6Iw*%;JL-lBH4Al*N*N`k2XUqX)(K5cw9#>BhK*(*+94Cog~twvI-x33 z^9b#Xs|edJ2|L?~R_#jIVT&-e#5&+>PN=16C3b;|unQ$&-*BR>cO^_}1s#O3&}uBS zpe6r<@GUYYNqx`|hZwXGgLZ!(>~igc%bZX<)AYeEyAKkGyMl z)(=-Xp}v= =HTO7QRgMV^^O1$&`)8Qyd*x=6zr^Mf*KHf}0le*wW>10Q=Gg6waQ z$KHT}>}?pr-ht8VT^NhkN$fp)dK?Bha#GZAV#w2ej3Os;r`Y69(SAY>lr<@cp#KZd zb=ZefVi1`)%44E95fOi=W>#s*L3997Uk*Cu@kN|Gvg`)3?0!D#I?|3fpm-q7NIR;X zrK0OGqU*;_u>P)e9k#&S2HDS?P$SX|vZKk9Uuj7v{M?B%KK0~Br!bxT(O`Xw`1^$u zY-Sq%o`&CAU=!s%m@3x+zjh)ml1PSG#zOK#Uq02UKMjeYXW4%x jkdD{I1931tH>2>dzIbf! zPIze`Ik}ZWL(l4!N{^`U=6MTmg@Mh@EBhZhxKoM_+Q9KG`@j8ibgA@4 =i% zrTWXYi5KS6o3zMv0Bx_iHtC15G}k6YFu`1#$RU^y{40dh8Dlz()oCp1(odx??ti2; z*;6UErqT}hJL>8`I^ds9L0+83`S?iN>M|Vv?S%Snn&E%=5%!9ju>A_cZgM5eT;6=d zJT7P-cfe;(w7b)I3?FGfQ=`!YmV|a7jbrqY_PE+sFwF_|)6}+t4uV@yf5aNJCSQ4o zdDr69(E9-MEu@9Q5m7%wn^{!27b@wtsJuet37HZb%J;(H()}!eD~qD_6Rf31o|sU# z{33z6{-S@JJ$_!=rPy-a$)5&;{|*P^Gf=>vh4K73n1|Pec)y(g!Hy3MhcVjEQDp_v zUuDf7NT0=p0rRydv?q~^zA#IBid0)FFP8rj`svKeaAiSn02Y5rOKv(VZ*jUGIi-nk zuElAd#i?9BS*#AXxT3XDQMt`p5phO5y-amW53ql%F4kn!fWMBcy#aarO(^7VK?Po` z_&fGQ*dJH5F-GRvjGSOGl82%=-Dad0@GqgiWaLvAfeXZ3ZN0)JVA;+-|HRcLphgI1 ztqP~F14r|wc6AWv7b=|oPMkieT^+>vr3z=D6K6 P~j9gamJ>R&tSEDhB$F5 z)5w2kuv$LDoH!??k S6KbQY**IiE* GQBIoQ`)wUFOQ^VT;qbE}Tw8 zi|a(&?aJvvi_;5SIGv&fyxo;kIkC`(WL 2k|<=UqwI-&lQrcbL}`*gOV3;v#_PpeY(sS5DpG<{m8Rl1N@oh&!ub0IHg&C0Z? zE@<- jY5s6d XzJ2Nh5!^ zs&2_`OB%UVbxUqLQp=5A!nJp+Jkkf8L+)Kc`3!kMFR!qk7C1*}X+w@s;aF|#kxsUR zoTI{gVcr~KtE4l9i jwj!oAb=^!y& z&`j5UB^NAxp %SmDdlEBtx>Jl|e8fdrT5FE7{w#rY!UHTx%YvduqaO&r$bd-A-U>@0ut<__>* z B5)wMLS;z&I5} z2I2|uh^L^B_yr6Szk=c7H!w~-4b#MLp<4V77K&$Kjd%{ics&!JwTVB#PVo|4CSHc? z#4E5zybAY-zd(ohD;x{P>yI)23Gt@v{EL^IRRSV^ANt4|I_!aAR*ie0zg6Q3sI Hy=vxU^{q>fa43rcU7UhXf_H74( zhsT+JwtziK0&;9HnR><=B?0Y4YdsjyUXp@h^tA@7rCPk#q-iTGP@6VSPTYoDylIOy zWg0p1od(5V*&1uy>@fF5XIlHDxU#oRSuEi#lIkk 3i{&z^RGMW05 Dnt~kYG5Py@8nW+NQ~T_Ivx;^Z1N(vj8;GO&{qT1;|Vr1#p6?WmjnhR^Kharl?bY zddaD|u!CKZ>^FE$jO)E#Hub% lC)CZCv(n2l zC~|N#>Oq&iGW&Kd_U$_GdrpHsp3|X!z;gzS^n_r%XCqAa)WLjAFUDspJzMOf6=Pte z CD*%33=-yi^;Y{l(frz*1kJ+FSF+AbZ~E8=E)Sbi5}a z?6kCep> #JNB9E(d))!6gE{-wAa%O$55b zUZN(Dbc++`Nmr5%TO_^avKRER6YBSA_JTUJ3sofjpA+Y=sbgZ=>zpTbc_+JLp9AJy zRhQFO>Me)u1}tY_);zL4(w{Cue;S>jPIhmJeaxxSt5x`Th2I>5U7_ZG@z$UW*n=`l z4$44Y7R|!fk$-)ob%KRvsogLs!6&TrpkwVHy*$3968kV!rG5w8oab*7^|EE@Jc $^ zFU<7nFyHHkHQoT!d3(VYZ#HcA_J;GkLAcbL1J`@|z|G#iaIZHH4tWQ_6W)CIwRa%A z=`Df}y@TL$?_k!?JB*F=4rk?fo$NJFlw1MXXs$;}D?~q;S0Jr_P!?>5q1xZju6f`Z zr0xy0EjlZJd})tp>vFy)gAA8Eu(*#k5wK`lGaJ_rh)qWiT79y@e=VI0ToOcrc8O z(B9Vmj_HwXsI+;0X|F25`xR_}ES#L_!)3HdXS#{A*eAdye+3spz iva99jwzaV!TuApnjs?^``cY<#)Yexp-NUB~3a9%*{DCoa`KU zt6iM~&2kRjHJt #Y>~jD= z m>lXZVK} z@LJS=8UZ=6;4Y1o-zvZl#0{4m8$1Waajyi=vEv3g){2Ol`M_#swbe|vNk6vnoT7~< z )_8)B(EJ5|`pUbAlo$KS{^wd~CeRRvwH&>&h{=p~@(Wzb6>3;p$S7@?1Y3Ho@L ztxr(AJD}kj_5&*v`L2CLB_Xz3(82z$U_buYO?+&B_dSVr0e!31B~tvJ0_|iq8dOOO z!03Cp7TP?VAgNR?p;=+l4)!kv=IS`iTpKf2+H0clLstq_Xd7K99BNWXAN;k@PPR;* zucQFG@1wXa&H&ZcBjD9r;w+xeM)PU^vSJ55?cbKg`_cvX^CaB!5chl++z)NskF0kt z`q-*}*yUHF4m$j5{Zi#ps=u;wp0o1R%F3g)|0pVtbPD`tRb~1m7h4g`b5uF8CGMWs z5psw*rzX(daX{7tAYC@pqu#S<%Kq5KTxenTBTR9#JgJx`+<+g61MU|G>;)~T5i o&B6Zy=R ze9~|6SOE^QoD`uy4FSDX1-oIDHlxstY%EBM`Q-^*@_6z*MYlk)T$^~x3vUIlDGnKb z-tbJwzHT>l|3#j!?)d5j`4+{)aYCtpUP$2U;L+azzy2ol(cglB`r9a+cVN8!E=| z0W k_fjXvMwf(6(S~)+9Zh-kvJ&kY0KjlH+i5W zo|p1?#3>J-0FTcLexD9~d_EZH^TP;V7L@x8IKkHos(jh7z}FiVVcrTXv(}eq%VRW@ z+44BSmd7}`z#@4pw&k(Tmd9$PJPJ@AeQkMYpW2#N8?Sl0X_9r-Jl}8^&BLL8n=2JB z%Z5!n+{yh8TjVQOh1TiEp49aXXZ=cL{TzFMJL)?PsjpU9zppB~!E>FJS1N5`e`RH- z751H>s;qrxS6*Woy (#KuYGkEZ z1xgOF3K>g?xiEZCS5TxYByxZdI}aK8w#7A8V$0yZ l(~E&6liS0vUfgPA|0n%ZC-(7dYE+G#K->FYPV0q4d_-Xt`Auf2Q{f zC}ivtYm1D2AHx#zGHjB}rN5-Kc!22S#ZGm8IL_~m4?Ny)t>^sOSK439u%rM?33T-i z^24@oZyv$yOM)6p!N1XCweqo|JR#5`9V*{Z@cAB#bEx{-t@Vw?k5GRaa`O;bsEC~t z=fprZK6^@bMklAUobsK*8S=f=newGowDmHoC!_mxz`?6k=rVX%xEI#p-z{bsGS62Y zi_GQuWH54Cp5F{UmT#!Yq5x!Lg+Z5=ieCBNJUy=$#RiSoi-|guF}$O45BWCPK+#?p zfJJ;%gs%1uGsXEz6I6fH+%}7g_sOkb-)~Ve&p?jvS?KS34hH#NfRVmG-~{s$Oz`~) zDt#}*EZ?iBQ-6j!-(O*??=?8f_cz$#dlSCldkZeXXP0BS@B01$H~QX#yYc#f?*l36 z>!CM}x8Z`xh~8Ex6m$&3fV0pe(lFHv=Z|WsnE`a$7s^dxKTLl{EqqXJ%3T8mRtn{B z_t#TG$d`O`;D^E^C$RqTu<*+1Z4m4ey0z7Fn~e8)P@lgq<9%M30K0{cHu Tfy-0sW+adFxi9JS9Mosp0{#^Bg3%AJSb8_bvK?7+=a)}NUSasYh%+Ktwt<^u zuYB&tVM%JezTkfb7~1vju~@P;c9P==y@K4qC(9RW;)>Xh*9s9Ua)?h`TOglmGP{#k z9^kVcg#>rg?+4+}f?<9GM*Fj2u0JQv-CS>rcfIi2?xp}fY#7jsZ?R)|$*&6XY6tKB z!D$Y~xAR}xXdXEjjgrwZw0TanQZ -aOGT%e0m3-cqf6MyZfK@nF+Ej(Nv&`xB?e8|9ME zI`2>WzS(~Xo4@kdm%j~s{&q0@+aT!Q4#obRFx`K4+}Vg(HcPXl1!qX(WGiqU#Fdm8 zI4_0)GR7~gl@$85( IU z5Bh~B`%GHb8)5tu)thSmTT;HMCg|s}EU;71 58@H;kDHU@ zl*RtELeT!SLJ*~0fFug~c`vJ#`PNyJz#-U&tsLNMo%o02X5qL~EjE6@!WZ=0Wl6N7 zKWNjQ 95m5@=`e5X3%M@ebA_eX8#|Jat%KXs&tb1(v-qt56>AG8cLFD=dX_ zDj$DTY94M7 `P}J)eq+a(%4=uKktG9UW1#3)CF7`6Z7tk9WHueSN)5JE~bkwfn zH(OrLRpy&$Y*opAzP{=ZKVxkl9uhx-nR0)=8M&g9*B#&ui^}@&tsT5^O($;=^#!87 z6P}wHn~!dS*EH+k;_|oy4ZOXR@2K>2^7HdO9sGg~73c SS%uY##>-T|I`Po<|U zPaNcz;e;cb%=b`()R6Ru?<*=G*-u9dFV^qFuOz(8K`d$z D)8&8H zV5$$_ZROu+<_|XW*OYbeA9Qu~Mi_uy{U&()Z^0n{+c3)i4ovjF4>SB9z&!uI;1vJA zq0avyZ1;ZzS7P2Z{!ifh{!ign|7UQg|8qF({{o&3FnA-t;e&w2yaB-m1#~tl;Ab-f z0k$+?NL6V;cdHI2ie6GxPJtQPn<9T3yL=X`vW{Ke3KOiScS4!<^aCif^4@@{RvxNE zEH=QF%2yZ}3}REY4@7TNxQT4I2$B*?HCsUE?Pie^6=XU;gOO!~uW&JK=ir}u%$tpu zk74i^FpM(j?i0xW0@btYE?C3&iX0r<=5pMO;rmK(=y&ivj!_Q_l9%HmmqveqM&ms8 z4 K<+zF*1ELz&SuN%XU58gCyvDd^yj zq^j+WqsGH5u})G_;oOXOp`w>NWW-iUGFvnfjvRg0+J?=k!dpZ#I8a Pm!c@i#1|BH z@Za`ikg-o)(4OfL+J|D0O7hQj+n&9sHjFQH+a&!{P0>r;26|Ub(Vw~v^o$ssJgF8I zb?{euI;kS$5H;jqjsbG08uImHfE=cVeDfF}hg* S*@Rc?I<(=LGMgjf zwZ =RT# z&MlNofGSl$&b_uwfTpW}=Jx=oN(JQHtIGsvh6-p=4|+{0?8Q9*QVM%%4}g@yUfu&B zrLdjbd6@tyg}u7lK!ep|ZA}k=lw&RBY@!6pRa10-S`UDf6rIuS>8MUQ&xSJdlQt_W zhcolgJ`yukENtm^DC;9}q6+BDZUa57bo-h!3t2xZW~r!%bUV=Ws8an?N0^oD997$z z)*b*US!?S7kkUkK>j99`MC|Cc`k$+ep=r)9EvKibL(EoDbY2gD=BR+a-UA?&VNZHD zIujs&Wv@9u_?!ulTg*8nQObyVhp1Lyu~lhA?t-P#Ciq7WwhWXb&iR>=On_9gd(v0C zGXYX6LCPHr7a*k)e5(gQ%AxE0T)hQQ98J_N3@bPUcMI+iEVu;M;0{58yF(ysaJK+K zg1bv_C&Aq%xCD21xV-Fl|GM8_wN?96cORLanV!>6pXouDqv6MwHTncS+>GK;kTm^4 zJP`wn$V=h)e|^wgCN)1jAfhO_77z1y5wGr9=c-nM*P5yi@q4D28Rw|qP;c!LI3$5d z<_ldOm29}}cK}Jmm@}-FD}F=nTCG7tF4su4fmHt%xZ7l I<41;d311B+}})ojDv?AI`8CbRV`IYp9N z&X(>TwE6ZBGG80uCejR>Fmapp)yJ6Fc#MXn&{ZpBuqh87aV1gnv`K)(ccj9X>gkWK zUkA=Ey1grf!FM=E)1JHEbqtp#>OCX_m I5y2$ a>%ud(;xez)6g zPgkR{Y@Hq1v!vmV-3Gr~V~K6cKAS5eo1;Iu5s1yTevbCY|Kb1L8B(hjIT70$(D1r3 z H;tc)gf{PU_$z@w$>iF4g2cvi_UzE|6X)l zI4NTN2Ll762MYs3ohZ5lz)HMRN5o0w0RoR+71D!%h)^|LU||2NntE7tU<4G!5CWH= z$blLt0)F+SngO`{DjLrS%zrJa7kmeN3;Sx%W=3Yk0|Wyjg#rV^0JUfE4hWYR!VbiP zI4_7}Kh1onSa4+xn5Qn%$F%S-8*4(NuW__G$)g6)`bx^s`KZ`n#5cLc9Lf)%y!pE7 z-htd{oq<1LbOZZ9i$7A1P3?xQ>2s3qe5KcRo~AGJ{BV6|4}-(G9wMUhmNwJS&!}nt zV5{BwXLGpMt=VkVS 9;dPTh1*{n zNvzy5d+)>#(V`dgsIav4N4YML8v+Iy%BfCpX$b7#X1}`3*}VC3 K>@h;udaBD%0r@gJ(oa 7( zH-<-cLF^4{8`J#oDE&6* (ack4; zFXjJTW+(Z%pRRlav7fZq8Y$wC7aU!7PC-W5b!_Mx6sVzNoFu>w9zl{2r>|7P-I5k_ zzXWT3L fYfS8n6*x<>j=~Do!+Ki6fhMqdI#H*N+FNi(gF-2^1 zCaHBZkvXNulekBQ2N?8#G`p0s_Li!^fJtPhMLB8@$L?^Vuhq9U(~H+TA!mGcky;rR zhllRBfok%8Y9|`TI-Bs?N||S>3{?F#wfGETeeynBUbo9_yBDS2wF|Dw5ZvB$>ma=b zs_X;f82fO6C}+4y$Nga=KXB3eIitd~V|`RB`Z52t-#2Z=8!*;yO?JOc;Fr~1db^J0 z-|Hj&9-T7^FbaFK?$g%~e}U_^tozT4b%+jNH53?vwK(00MjwHvk1iCJqA Hr4IfQN)4 z=5oQa3=*tR-beq@7!d*)HODw6>h~CSMvB-e-SB-X?^rf7l|{jpLy$NsWj#!?b#7DH z@7}>wV9zu8*u sRi9_1P81PPhyXcT zk~jFOLOs|=h!J{sT809@ v>1uWF0^@UkTb5yK% 1r@;nq#lxy00 z#CDDBvC?GvLZPNDxo49Gw_G~BSB2b=0Cx)W;%AED=0}OgJ!J@=L%rp5u9-`rnS@V& z`@%yC&L1U-;aM`o$Epg5;@v=qL7<|^`aWLUqukp2RP*k0U4qjRlj+&nfVQLkPl%7! zpCA+$sIk5HRYV2nG4a3id-WqV#+xNIZ|(?==6 0UZ!u z21y6#*o?#vym=k_zyiRg*Qbw&wOmQ<%eaaL`zpSqgGicqunIs*L>2_rzK)Kaf 7X%U{M(HBr)cXhn>!AAIe*iANj@!6mz--9NGf3N;sNoh4 z0R~0^0|tid#g4s`IjfnCkvXRotED}wl9Q>6i>H#4rJW0OALQ;tT?Zmfg5GCqndXwq zEwf_ourkiETxEIV-Yi#4UYVbLZaJ&E>r=nqSWcfBZ@=5Pu?Uo-kKs>fnoZ<#D;Y*mmswymC8o zw ~%~&s;;u<}rbF`bF9Y=iu!|gL-`y zUC-uH@*nk&@PChPs(1a=S*n|xQ#BoQoup>{3Vc?a!*02OgfroW?;VVtJfEXrfn xxqG#$z-`GB%hLMN`Hp zzBTva+ry!Qh{16ixB3n@sCMFFk@ZMnPqAJS$YcM^6?X1mke_d*q+RScR{VX~e i%;s>L2qT5Rgv(H_O(eGQGT{_?X3d&Rl;~ss6twY@3SjnO1FkeIMdN%?`HQ zXiFXW4{@u1Kn6~wEEB$#>>#IoXY6k5?do-SLlWJv3<;1hyV7(Nn5vC0t1BL~6)y>G zo$K8!Rq4m2pI2AdF;&3PpLfYkip$TZ0m3^db-u;A4#l?9$qn1!zIKdSVf4kxM*kx; zI>Kj)cmhkz?J2-Bh)$xxA_bq_xFinG$LsUUroc2M4>x|bCMpNC{ z5QV-;X2{M?Y`-?P%uE^`&Ovf;cpO$|ou-}QwRBFgBHtbM6pHP*qhESm$W#XBX=aSV z<-vE`TR6ovEJ8Si)Sei>n+fKHHets1<%VTk2fV5R^^KkB=EF{G$)leYH8;gX<4&&V zvECrtQf_^mCXWK5Z%8cM5Yuzm>6W==jmZ@*ZN11IILqvBDT>1er4Wwco4}Q4+~V z9Xzjz5CE_G1$R($Kh@1?U4)L{iC3-rOdz(>ZGgvU*ae$cNsYJ+8=;t7rzwlK8?%=t zMwOSDLnobyP5Bf@Mzu01ft7#RHsK!}7dAGrJX)FTN`hO1t@ gNbquj(=ev+(> zJBctZ#8Df*^(LRc*QF};htW-qzoJ;#18keIbw-tlj0pDCy!$(xJq$XLvsb;ff6oN= zrLD*F+i7y6Ph~1H?l+U}db>KJ7NVdCkkmrL8vXQ_=Qo=+;_~V?leH|@`~QB|H@#`6 zS4*It(8wA)zTrN%F$ EWs=>0t&gI2l#Vfwgh@SaJzE(f zQlz}X2`6^h>c1AW{98KPozyk4(y`KR63m%Pk) t;Kus($dJ)qKl zzRLI~r%VKqiZQQSsDjUNxKXJF1Mze6oCDJmmYwJHck^iQr9=xqTKn0C)r8eRta3Le zkYq{%qzYXDkf308(MCTP)7FwXP3_U`5Bebn1q+2iGJ(Q`$IMlGu0b`03Y{8(Wx= toA-(z6F)gPGPMnwRs}^r~_wL%AYNVW|E=3(&f<}$3;%KFEay#C_n*6g! zE#6EPP9#n!yr<0Vpp-Io;* s{IPo+GJh>1h3{KZsb$x%on3GZ9YqP1x;B&pW=wzQ#% zI91VR^<3NUoVeSA)O|zZM{30>_?$YmYmoRHiPUsq;|5MB+TQ73{RzOJlj!E E85fU?G7$SJo^llzoc);(3u--QqesKTo1??FU88 zp&15JRZG}xL4ikh2g>vb3f+yLx6m+CNFoFH( XWbm?$&V}Yn zi1XUCR2TRiDlTdORDjOBV?P6Zp|e69D 3zEHD}cVq{nzgKZb!gP#4Olft66FjTV5jP<{OCKy)Zw zptuX1fNG{Z2TnmH?(Tt iDO?7u@e#e5Yg&IslWsOb2Ri|IH+1YCU6<_Ecc3lvyfknTFZlBp J; z-$Bh;LcpSMuOelE;05R@4G#k^Ly=81xER`wAP!s&b!)T${0yaP#(#mypdEVN0Oo`u zhIVi%v uFo$c1RG}JxHKGd;%W#YVIm~x ?;{C{n*6E8y%aUr#d$M&k~#6204WX+{6Y`xt0c08sZ7RpLU zLOSpf_LHVv{ZWHW5SD9$U*;D4cKpCD3u6!42%5H&G~w*y2nu!zI7G=$7TM#5>ltg- zIjhb`t=5BeX5q<$GhSXkLZjRFf-7;49?$y=Fj1N4-{1{U+sGdZF$yzgK24kO3PLg> zBjptaU6eDozQw)|g9o={oiqfw0-_V(shxR~r=3kCTIt|f@-}V8+0J1>l?GyLA$&II z793?Z2YQO5N9j?+IFWib9lzumsgc2gjK}~5ZEf$^L&;Moh$1WYTpGh?FrnC5)|sM- z#9*Jf7jR6eqD$ycXjb0i+NqAs2S`p(K6y%&wxMqKQIqLzB63y45Z>nlkg$SW$0weO zQCZ(%F&xUtd}
aV*Np`y& zzv#-I&e^~EZtYuY>2&*sJLm2oga#MW6-^M6z8O2iLK<-MJ$y54&{Gvz2!?!ws{-7t|KpI hNRA*H;na{ANHr zHip+FN{l(zlyqRUsg{RPPzo88=3THKF~HR#%NBVGx-F>VEoCDy`dloUE?+pl!L{;) zcrR5YNZ3W5j&(9TwCO?N7Kph rNDMi_*C5h^(9@?QrCQ_IuRHe1hr*Pwn4HOKXrFeEQ++I3JEq z3mangGbax_Gg%#4wMsBy&`?b}(QGoz!x8sg*fy%7ENWR+kb%<}2Z66MBh3N(WB91P zy+@ve8XB$4Qf8W8LKJdMg@8ol0mhD2Bp_;}4=|Y%HO=<*ZQf|p#Y}%{s?6VHj>mRS zeaWa5hmpB2)Fm#d2lkNuz>N}mTf~iNhKV1gO~$s`X`J>(cEz&)W ^n?sOvlSM|3f8A^|WEiH0LY42M#yC(a79FbhorbEeAnxJi58EpICJpA{|; z19Bc_;8|C`MaFuD=#J6YWxJ6QwVTGln;bcuu%EmQ!16}s>pX=}^xT$q%e4Gsx#YmR zJoglEB0)`?t=gm^Z4Few(z`u1Iwt)T7ad9Bj^6b6w&|A8^6WA -r?Tu!Qh-wt?;t_wsRvUFo*%Sjg9%4j%*FR_U{^0eQ~>OZ(;vZchqI zcV-9O^eD F6M_fvC{T#WMX=>ZCBmiUnisTG1?L zht|_yk<@JH6K^@AA1BD$6tTrJb<^(l6nGYeGMi#eMzol$e?7|8*eMC|udkTyCZngX zKdl!EXjiAdrrZ1!AMk!*_Y5`=5 H_1T)a4@euDYIG*0FBs$hJBIU>he+#~ zaWYG99a2Vj8nwtD@0v)x%`e+J_$&^g+x#H-MHVcmJP-&Pt(DPtEnTS2^RwIj&>DyA z$e%T< ^gJz10A zGnbF&C8M&C?2-aoz`Y}%pJr(`pPLA|`$&6u@mx2#AfK;r=e aIZ$b_rKf3D<3m5s(2n;!68=@HLwPm6*$95)jtP_aQz%MTvJU_4)Wy%xgW@)+SR zfDz^Kn1VaWH|3#6ps@j;q>3i~M$@IR7t^Q>zt4sn z{q92_s?NM7{9chDQogPUQl0yK)5+By)_HODkE9Kz2RUJQx>9YDu&hLGTWY- &;A`qGS^Qqgg~{b0*U;$kn{EuP|!DA zzhG(?$#Nix<*Zt;D~tLjz+{ A*Qk7I;x@*wCJ95}-89qxhYW4>G>m(_P zk~?iS9domZsaiVAfheE34d#0F$&DEh$h6Pze;|u;J`-D$0--fK%LquNF*tsJE0}}z z7Dw~>-krcM5+plqYY-}mr?_uPpA{oO=Jd8OqqjHsvw(V!mzJUGl}B6rH%j(Qp=0yU zg) Mt_PGd zVzNl_w9=T>O7x`D(Ror____0~!t?}(v j}|y(QsgOf{7F1$a$KP*>b-B~EfU#xL{PAlke^ z*g90E>{sc>D%+sQEBZgV5!Rwt2d?MTh6387%gGz$fp59eD`yBFOTT_u()#mN^u#8Z z-Awi{UZrNh?Yna5Mg9+&$Qq=Pcl`>D5j2%P%dp$Si|;={_KrEuWADwAUD$Pb#H;5v zQAT)=h(oG5hfVe1`5T{8MHT?4e;Kb`HpJNf5reNq>7CL`107wPEY49bMQxIVrv6?l zBurkB4_X-0mFZQ3Cleo(eXkbdEru-}j_#1Y7;oq(3F7}CDRF9pd(K?^YRo9qzoL9L zs^W8=hz(+aoR<=Clfp`*%Y^VdT&+kxQH33ysgR~mUE`nCTFoi@e?09o6^Qz{!SOKC zt9nz4A&b3l++1+v$acE*!OO$2@`(QZK;#gz;Nt`*PLz}#1(Mw#lqhee*CzOHgLDe=xTZ; zbMt9!j9YMXSRQ#U^utkC_;}aXNm7q-Kgk0LqAR12UdqK~=~UeO#UR%k;&o8jcK$O` zG%+SHqj$2&c>5GAAl7Fba3Z1q?nwHS+JkODefd*h%k|A31#MW`Vku8mZzy5$1sY*e zfA!5T2>lpC6g9X>{0BG96FT@zK2sH`OHN<)tP@i@Jr{9`?$h^Kb5N82z)O^pEyof1 z<~%ef$PkOiZ0CYQwIG;%e@Y^)seeYSIA^LTk?&GDZUf<*C&-s7t(Yk-g*lByxxl(f zF|lycxk=HSIqi;PuWQB1_jB6S4xj$0A=Pd$#5728Um>kHS5dv6&y; nhE=X u9t9)S z?1r>RV||{)!YvY(FMMRO>y ns~yc>XXX zx3Rcl*z>su6To?PvX6|0J_0!L0< jJawHc-Zv^3Iy6G!91_BO&IE6ibPgL zxb;nK3YmN%NFa(X=QDAvoYd1JuABNXr;u)`l@eJq=|Jsf5^Y4g^mA)sOhY&E7rRY| zvCmU-A;dK2iHLjc*kxY0arXvK@suCZl`eSL!TivY%^$<7o0)>B6CwJQxz8j*@pdJJ zc&)gtbHEEvcZhnG#Aed^;AcLl{hf6wt0k>+HL*D@+m|=6+NLe >VU9J0cDd&OhBcWR4mOjQytwRQc4oUN7kng=v!-pBr=Sv{7Abi~Q% z!T{ME-*jW~2>ahE1D*5CNAfy2o@Hq@u&M!@#?0K|t`_L~p$)h| 27L5&hM;An+FfqkKHYWCmt8#C|x5Y^BFNX$$k x- z@l&kL6F^RCPdLp0(biM-g1ELeS7 WIl8X7~g!-v7WMvjiD`;saz z%n27d42(>oqcl86;z%4K0c2S7W$D-)=gDVDLxnq$J682)0FQ!-TpgAXHQjH;MVc_V z_&ztxJWG=IRMwVQ6_l0<3IAv;ePLL{76{TkGO5RqC(Y)aEahk&7c7Gbf_BmK(d_~g z* ?UF;R zf8?c=bupR_7w??LTjrzf=7m`z-Y{ 8xq z8XqnB1d<(&mL2U)N^*p9QBW1`J~a#x$a~ynsTK`KxoaoIpctYP Pu%EC#sSW)$8sZ+xYf%7;iaCT7B5~ zLjs+@Oz%W^C4nxsx1I#1F8GJuWNbMHA9Ds?h&ac2@+2NV#qoVWn88J?WRrNwI^otD z+67~SK4F{K>I{VFp0)D*ynIsCmJ>!7OY%j$$g$tQWTHdY{W&9o?r&lIr!ql(YPoW8 zfO?6aE=KSZ3|9jutqJp5FB#Ab_$u!r9u ;Q{Ksbc^nY?g$=SB zN#ZSY&@%CKSem;~??q)m{VWvFEc0*DS*2QOcHdf-ZYCaEENKdfY3_2EDg#HO%1Lnd zfdF>YA| 2si>Ka!@EgnN~ZPubL{ z{@2~l#_g8ZwY-^W%={hH+sSjw@;8qy7Tw<6<28#0sbyA;s{T5E>naTW4s}^~x |*KR=~vGpZ9g&h=~LLYOhre9eYa5+;v1KVw_tnoZK| z(tL4`m6e`#{Q<@z!k;%N3Z; z