From f6e1079ee39ecc65df893a93835546ae2168aa2b Mon Sep 17 00:00:00 2001 From: maryamSoli Date: Fri, 12 May 2023 04:41:55 -0700 Subject: [PATCH 1/2] done --- .../executionHistory/executionHistory.bin | Bin 50075 -> 50075 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/7.5.1/fileHashes/fileHashes.bin | Bin 23947 -> 26197 bytes .gradle/7.5.1/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../7.5.1/fileHashes/resourceHashesCache.bin | Bin 22169 -> 25841 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .gradle/buildOutputCleanup/outputFiles.bin | Bin 19199 -> 19739 bytes .gradle/file-system.probe | Bin 8 -> 8 bytes .idea/.gitignore | 3 + .../java/sbu/cs/CalculatePi/PiCalculator.java | 77 ++++++++++++++++-- .../sbu/cs/PrioritySimulator/BlackThread.java | 12 ++- .../sbu/cs/PrioritySimulator/BlueThread.java | 10 ++- .../java/sbu/cs/PrioritySimulator/Runner.java | 26 +++--- .../sbu/cs/PrioritySimulator/WhiteThread.java | 11 ++- .../java/sbu/cs/Semaphore/Controller.java | 13 +-- src/main/java/sbu/cs/Semaphore/Operator.java | 21 +++-- src/main/java/sbu/cs/Semaphore/Resource.java | 5 +- 17 files changed, 140 insertions(+), 38 deletions(-) create mode 100644 .idea/.gitignore diff --git a/.gradle/7.5.1/executionHistory/executionHistory.bin b/.gradle/7.5.1/executionHistory/executionHistory.bin index 6c54050a9c7d182cbaf6704bfdf262d3d61d879b..40c99dcba839b0c07fbee7c02e7d8f88a0d2a609 100644 GIT binary patch delta 4123 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 diff --git a/.gradle/7.5.1/executionHistory/executionHistory.lock b/.gradle/7.5.1/executionHistory/executionHistory.lock index 1cb4723f3040240d2f94b0fd80a3b78a7d75055f..99beef9a0571690b0ae8de8fc6f197e2cd2bee01 100644 GIT binary patch literal 17 VcmZQ}KkRl+p3$zD0Sp*l0RSgW1Kt1t literal 17 TcmZQ}KkRl+p3$zD0RsF1Ca?oS diff --git a/.gradle/7.5.1/fileHashes/fileHashes.bin b/.gradle/7.5.1/fileHashes/fileHashes.bin index 058c3de1abdcca6307369c7cd02b95c837086de7..8d30f72ccdb7e7092f2796d681b40edcd90b0e85 100644 GIT binary patch delta 3027 zcmZve3p|wh8pmgtA%`_DW)|Z%Ll$XJG)qboXCrcnY_%>UOfDr^N4YjcILk)oufovI zx@;fG9uB$-9iI*gb&xE!S|#&2XmR8cIqy6FceG~C^ZC5*%kTeupXYyh-e=yNyTty- z#9A9Iv*NQY#1`-Ef)fO>`OmH5mfpT%XfRXS4E4a9;43XViqRbFWR#`~)IuJCI4v*a ze5==+@+WcePz;?1OV)37G$0E?LRcKoLn_t!A==@eZB2$t{aPwlm>+2K` zs0Sqgp7wrKg`AHK9FNcOpy0Z88d6pyUtFLQpDodVG2IKfhS&uaCwJr7xuYP89*#8J z$X?lN^WSJZ(>c&ZuSHshdKcbWIz3@wDP26oZ^4 z6ENhOckc4Jt_XEr^O}B>A-ZOx=8WrpV4DGhZ<5Yh8R}lZ_a~@Y;=IXwxuZjo|1)$B z6s_r50_F6XiBPBqD@k823=Ram z1MUV4WXn?CrQ=609LA%_1D-)4!fuRcEm$hs48`E5V9sDaCAMz0Jz+={5BojX$w;H* z3fj%fewu_@5Dhdk7B~S-&pesb_bpK5>PYe*rL_q&nZFuC{Ya%m56cOBG9jGSf_kVW zsASqv3^H%Mo8IaLwLl-x&$LBi^^KLY`ZVhC02DwrWE_f*YOPbaZ-(zq$ciLteB!8g zpkq}CbPi}*(=UuSS8j31hkD31iJnlgcg1@osS4^rBS6oPfh2$bC;J*7l{a|C0kF-` zQBF0jj=7*&XH}?FzuU!?#VZ3~pdSCOUup>iVm8H3%^!xK zZbP3I>xr7McB9lhnw4m@$S6#RpsxrqTjlWa50H?%EK4xV>?iYdkCjf*7pGnL&jqJ& zWCBO9#YrW}7>Pdp{D7z1^!7eF%lz|4D3LW+Z2KD|h#XnMtH-26W2#2fu=#!|!*u!n zdP0sXA^4xxp5j_}=Umiuc1+?aYhq)7yLei>O$soH@^=#C6HyhRo$lE*+Z$m?4Ex>L z30*6?c3(#uNXQ9gi7QSc$8zgm1Qfsjs=9v8L7BkEkTVYW+7;Agk+b8g`A4qiFH zrgAS`m=`BWp6U7mv>6hCz`M3jpDh(O}hq?KY%*HuI9j`B9;DboOP60S%W5~Tlgh}o{M z;=CL57iq4vvr0CCQ85w56=CsEBjutusg+pAz9}Db?3`&2E^!$9TPZ9@XZBVxK#)i4 zK$;+aTi~&Aykv>q@pl@{O`%_$gf3?SJ{+d=Q|3V5%+l?ima6+?EB}}8#jA8?yTNc9 zu*N7gfi$;ptE;?!5=*d~g7zQ6pObrmry>E!&)4;O5K1{%TMMDZX^?_k^t_V>zq#YLy1Qax4l- z45EV&%s|km)COBP4ZdC8@!KyOmWz4(0lfUz>$BG2|}?beSe;%Vtr&xrwo!Y)~& zlXI2%O?m%ggEr@?n3`fh$|8H7E)NL%?nRU@rTts?UAU>3I8+%bCP0%?u^oL0>Sd9}FpV3Hvm%cO?`fTbNxQmmWFLkQNL^UbS^N*MCyj#u delta 159 zcmV;Q0AT;s%mItL0kAX}5p9CN0l-o^n{EIA00000T=kP(7&()!7)O&085xs48IP0w z8A+2~8h4ZJ8c35(8(@>g8>o|o9AK0E9FUWx9T<}Z9vG8N9*~pu9;lPGA25^sA7GPp zAlQ?YAsCZAA{dixB9N06BT18XBY2YrB=3_wB{7qRB`=fBB^Z-MCK!`-COQHNNwFdL N7qKwV4YNT=N)^m0JCFbX diff --git a/.gradle/7.5.1/fileHashes/fileHashes.lock b/.gradle/7.5.1/fileHashes/fileHashes.lock index 1cba1b57cb2e228d85b51ce1e49fd3615583c5fa..5c25d6f2b6736085c718a78bbbb517edf732e42f 100644 GIT binary patch literal 17 VcmZRUz5Vjo472Mk3}C>@4FEhw1mpk! literal 17 VcmZRUz5Vjo472Mk3}C=m2mm~!1x5e> diff --git a/.gradle/7.5.1/fileHashes/resourceHashesCache.bin b/.gradle/7.5.1/fileHashes/resourceHashesCache.bin index d9cd9ab16bb60ccd3ff8daf7790fbaf3b395ee2f..ca438154bc46837afc7b4a80df49aeb1f71d3136 100644 GIT binary patch delta 5705 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 H``o_)f4XI{ delta 271 zcmWN}ze@sP9LI4ka0zs)=lghidFHS4GM|GQ6WZY+d>(DR@ zg>C3Kt2*XY{ZWg?&7BIxZtd9Q?mz-FFD?}CK2;-G@cldl3*?qhM0=sazv1l2xwvaFqf|FAv6*SIj&R>5zCb|hC=*tOn)kQade$-Ghl8nQmS zzI{0{;|A2^T9{(Pdzm*(9VnKh@clt?SIqsHQlDCr>8&_ zZ=T#L72seM&Y7MWv#c2+=yMsS+IroWCOw0%KcV8^Vd8ev7CJY?zI2C*S57`FrJ&(B z>HkjI{m~nsCSQjs_Nu#R&9~wEJgDOJlb=c{2>ACb+I>>d2u>_v=b9s=SIaJ;u{Sn2yS-t*vB+^zX$K+2G6L;2_9yf8$9b70h0eD AYybcN delta 99 zcmbO|i}C+d#tkMCjOvq3B|Ijt1!7)FiOIH-9+T$+>9djslSQQ@CdW!8Ouh=FO{FC! z*GhX#{wi%SIaJ1D@>3a!$-1&YdD(=?Z)H6u*UDKjG4I@{_(Oc7L4wF;M~{6>0H0MN AdH?_b diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe index 0bebf6a4bc8467d7510afdaf9280f89f3665e8c6..10da01057f6dfe97a31c665b91ad3c230a12b501 100644 GIT binary patch literal 8 PcmZQzVC>-c*Z2(p1u6my literal 8 PcmZQzU~GSE$J_=02ZI7L diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/src/main/java/sbu/cs/CalculatePi/PiCalculator.java b/src/main/java/sbu/cs/CalculatePi/PiCalculator.java index 3ebc56c..1ad7817 100644 --- a/src/main/java/sbu/cs/CalculatePi/PiCalculator.java +++ b/src/main/java/sbu/cs/CalculatePi/PiCalculator.java @@ -1,27 +1,86 @@ package sbu.cs.CalculatePi; -public class PiCalculator { + /** * Calculate pi and represent it as a BigDecimal object with the given floating point number (digits after . ) * There are several algorithms designed for calculating pi, it's up to you to decide which one to implement. - Experiment with different algorithms to find accurate results. - + * Experiment with different algorithms to find accurate results. + *

* You must design a multithreaded program to calculate pi. Creating a thread pool is recommended. * Create as many classes and threads as you need. * Your code must pass all of the test cases provided in the test folder. - + * * @param floatingPoint the exact number of digits after the floating point * @return pi in string format (the string representation of the BigDecimal object) */ - public String calculate(int floatingPoint) - { - // TODO +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.concurrent.*; + +public class PiCalculator { + static BigDecimal answer = BigDecimal.ZERO; + + public static class PI implements Runnable { + BigDecimal d; + int floatingPoint; + + + public PI(BigDecimal d, int floatingPoint ) { + this.d = d; + this.floatingPoint = floatingPoint; + } + + public void run() { + BigDecimal factorialD = factorial(d.intValue()); + factorialD = factorialD.pow(2); + BigDecimal powTerm = BigDecimal.valueOf(2).pow(d.intValue() + 1); + BigDecimal numerator = factorialD.multiply(powTerm); + BigDecimal denominator = factorial((2 * d.intValue()) + 1); + BigDecimal result = numerator.divide(denominator, floatingPoint + 2, RoundingMode.DOWN); + sumInc(result); + } + } + + public static BigDecimal factorial(int n) { + if (n == 0) { + return BigDecimal.valueOf(1); + } else { + return BigDecimal.valueOf(n).multiply(factorial(n - 1)); + } + } + + public static synchronized void sumInc(BigDecimal d) { + answer = answer.add(d); + } + + public static String calculate(int floatingPoint) { + answer = BigDecimal.ZERO; + ExecutorService threadPool = Executors.newCachedThreadPool(); + + int i=0; + while (i colorThreads = new ArrayList<>(); - // TODO + CountDownLatch blueLatch = new CountDownLatch(blueCount); + CountDownLatch blackLatch = new CountDownLatch(blackCount); + CountDownLatch whiteLatch = new CountDownLatch(whiteCount); for (int i = 0; i < blackCount; i++) { - BlackThread blackThread = new BlackThread(); + BlackThread blackThread = new BlackThread(blackLatch); colorThreads.add(blackThread); blackThread.start(); } - - // TODO + blackLatch.await(); for (int i = 0; i < blueCount; i++) { - BlueThread blueThread = new BlueThread(); + BlueThread blueThread = new BlueThread(blueLatch); colorThreads.add(blueThread); blueThread.start(); } - - // TODO + blackLatch.await(); for (int i = 0; i < whiteCount; i++) { - WhiteThread whiteThread = new WhiteThread(); - colorThreads.add(whiteThread); - whiteThread.start(); + WhiteThread whitThread = new WhiteThread(whiteLatch); + colorThreads.add(whitThread); + whitThread.start(); } + blackLatch.await(); + - // TODO } synchronized public static void addToList(Message message) { @@ -69,6 +71,6 @@ public List getMessages() { } public static void main(String[] args) { - // Use the main function to test the code yourself + } } diff --git a/src/main/java/sbu/cs/PrioritySimulator/WhiteThread.java b/src/main/java/sbu/cs/PrioritySimulator/WhiteThread.java index 8a8d7f0..9e820d3 100644 --- a/src/main/java/sbu/cs/PrioritySimulator/WhiteThread.java +++ b/src/main/java/sbu/cs/PrioritySimulator/WhiteThread.java @@ -1,9 +1,17 @@ package sbu.cs.PrioritySimulator; +import java.util.concurrent.CountDownLatch; + public class WhiteThread extends ColorThread { private static final String MESSAGE = "hi finished blacks, hi finished blues!"; + private final CountDownLatch whiteLatch; + + public WhiteThread(CountDownLatch whiteLatch) { + this.whiteLatch = whiteLatch; + } + void printMessage() { super.printMessage(new Message(this.getClass().getName(), getMessage())); } @@ -15,6 +23,7 @@ String getMessage() { @Override public void run() { - // TODO call printMessage + printMessage(); + whiteLatch.countDown(); } } diff --git a/src/main/java/sbu/cs/Semaphore/Controller.java b/src/main/java/sbu/cs/Semaphore/Controller.java index 1ca61d4..db578f2 100644 --- a/src/main/java/sbu/cs/Semaphore/Controller.java +++ b/src/main/java/sbu/cs/Semaphore/Controller.java @@ -1,5 +1,7 @@ package sbu.cs.Semaphore; +import java.util.concurrent.Semaphore; + public class Controller { /** @@ -18,11 +20,12 @@ public class Controller { */ public static void main(String[] args) { - Operator operator1 = new Operator("operator1"); - Operator operator2 = new Operator("operator2"); - Operator operator3 = new Operator("operator3"); - Operator operator4 = new Operator("operator4"); - Operator operator5 = new Operator("operator5"); + Semaphore s = new Semaphore(2,true); + Operator operator1 = new Operator(s,"operator1"); + Operator operator2 = new Operator(s,"operator2"); + Operator operator3 = new Operator(s,"operator3"); + Operator operator4 = new Operator(s,"operator4"); + Operator operator5 = new Operator(s,"operator5"); operator1.start(); operator2.start(); diff --git a/src/main/java/sbu/cs/Semaphore/Operator.java b/src/main/java/sbu/cs/Semaphore/Operator.java index 33613e6..8e7176f 100644 --- a/src/main/java/sbu/cs/Semaphore/Operator.java +++ b/src/main/java/sbu/cs/Semaphore/Operator.java @@ -1,21 +1,28 @@ package sbu.cs.Semaphore; +import java.util.concurrent.Semaphore; + public class Operator extends Thread { - public Operator(String name) { + private Semaphore s; + public Operator(Semaphore s ,String name) { + super(name); + this.s=s; } @Override public void run() { - for (int i = 0; i < 10; i++) - { - Resource.accessResource(); // critical section - a Maximum of 2 operators can access the resource concurrently - try { + try { + s.acquire(); + for (int i = 0; i < 10; i++) { + Resource.accessResource(getName());// critical section - a Maximum of 2 operators can access the resource concurrently sleep(500); - } catch (InterruptedException e) { - e.printStackTrace(); } } + catch (InterruptedException e) { + e.printStackTrace(); + } + s.release(); } } diff --git a/src/main/java/sbu/cs/Semaphore/Resource.java b/src/main/java/sbu/cs/Semaphore/Resource.java index 78a8344..8c9d1ce 100644 --- a/src/main/java/sbu/cs/Semaphore/Resource.java +++ b/src/main/java/sbu/cs/Semaphore/Resource.java @@ -2,9 +2,12 @@ public class Resource { - public static void accessResource() { + public static void accessResource(String s) { + String name = s; try { Thread.sleep(100); + System.out.println(name); + System.out.println(System.currentTimeMillis()); } catch (InterruptedException e) { e.printStackTrace(); } From 5e505ec4390d0f5401f30226af64c4c928eb6795 Mon Sep 17 00:00:00 2001 From: maryamSoli <125889257+maryamSoli@users.noreply.github.com> Date: Fri, 12 May 2023 15:16:48 +0330 Subject: [PATCH 2/2] Add files via upload --- 7 report.pdf | Bin 0 -> 30687 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 7 report.pdf diff --git a/7 report.pdf b/7 report.pdf new file mode 100644 index 0000000000000000000000000000000000000000..473a72476cc3bf3997fe8809ef89cb43659e153f GIT binary patch literal 30687 zcmb@t1yo#1w=RkVNN{Ng65NBkyKA6vr-8=Z-QC^YHMn~S5L|+LAOv>}1h}2-fB$mN zx#zw&-lNAFYgSFIIcwD#^XrCENnDbFg^>#dk+K=`hl0pL!c1akWQl^v&(EalVGm{! z1381N?aY{zKxSYk5>^Ns$RrQ4HKPIBGN`H0k}#<_JGvMg`0%?uZWl=?QESPOi30J&Oba!RuZ0nu#_C_ zj8(wSI!us^GO2>yotb28ASo05>n8TsP3CuekQA6$fJE)wbs(zDB%F|paq+O~kwDgC z>kNqul7TC>>=L%l;O{SNrg$(5oGIR|9b_-9!z2?OyXcy3u7=)N)%#O6=dWD z5&5eif34Dqg!$hS^4sv=36Zq0b_P2#Nm@e|EDkodGXXQngKf>6%}Lm}n7MyzIXOFm zK{hCe?%CbCn@+2on7((>F9`gyIq9TOm=t_Df}amu9KVj2)SEp_uLX&IcUrqYpP}E>b}@}e)9G3o76m0@9Lg6D5D0Uf9j1! z!eK2jNRrEPYdGrbf%4+ z)ctvL{e5ciu|&5z)yz@ZM`xX3DiN+zb0~^ISL^L=&XY4N)9z*O@#SV2b+37UZ(c6H zM=<}l0QoY>B?4Tp>bgzpWLj--3ta&#bf6an?O&&TiOlhGy4e!WVBKHq9=UOra(RusSmEyYwKHYNVPB$ppPasHy82?)?s`{-IF? zj>b8G)z*!AFT*)QN^2zG)8e)8q+MDC-f+qrtkKW0wKr*Yazu>ju|yX}K8+#7Y87H~ zPMy&>ZsNvR35c`Srq-&6=nlBy?vm0)dvR>0?HQImIs>0sEIHwHjUMRkaD`wCF=Pt* zU?NHdz&{VZTs9*%kTVDsHT=?qzt}jIrxCfDTCD0QWpyNi^H!u%+uG)zamz~;*{cD? zSK^VPg>Xu^B1uNv{=}wl&QGk~-pk98-7~v`moMt_u%d#4FT5DjGAZpawO{@`k`gOS z@V2o}fG>JLHXMY4zjWhS<;Rt)yIsb0ehJFJO=IH1bub73R`BbH6$MYpql=Z{p~lws zG=IAd7)2vXfCF8QSK-Q_44}#bv&=vmrpBDSC9TnH&G*P>=Z&(p)LcourmhI|cB7@f zvcDQZid5vqr=Ql`q}VdF>Q=Mp8GpEZ%~ER|zs9lM41)i-*4d@&2m;KkTz7LoF-wrW z9lN%rHXV}tF`R*1XbpV*)h!z6n(@-!Rwm0WP7}zUn}Ic7O7EOWeeV#tI`!~rCY0{` zOa@|^EM7{uP30_sXY;Bs0PF_$StD9R2a7+#T0{yq{2=MmNQ-`j(>WfViDZq2U}l!I zEx&q^7*=1ianXlGLRr&p?z-=@+`OxnJ_g2ZQuA4L_NWPdh^_-NKhy45VH z&RLl_AFa1$Hrqot?TbCWt{1l^ZP#p7QR&<1VO|o>aE<@CTsUj7X0-mu9or*D;?LX7 zm8MGkIm-nftcfZ;hbAGBY8&jSBX1fSO|Zqqs?3k1%1=IOl7@d*{D=c%XH~_>9^&R& zJE^Svpv?;=GQm@_X3ZZ-@CrH!$BAsb-|xy*xe#?oRiv;>YehGS3G@pbL=?sI|>rqBn?>G*tULespyqo4Sv(RPQK zqqasEB4m6u-ihNGaZ7F7yHaJ7*^#kd1F7>}Hroz!*3o#U=5@Sbk+xwkq#CI6SfK2h;x;WkyxyLt@W3}I7JNhN^0P+$u*wx zLcQ!B>&jDa$#%6dgN+c}p;TUw?g2$paU=$!W6S|`;x0Z_P%e&Ww#Wx03#D!Y`M?Wq zUpc(c`FKP|3G*-BY7_yoKSBk5wDxiHN{dN4jsB2~~MfnVG)ByNP;~O+qB7@<-_&!9kZr=t<~KFuH?Rfzbo%g+8-ZfQ9ipmN)Af zVSa8QoD8Ayx0$xo8UbIZ%qk(vy!`5mrWB#|n*No& zZIJBgCm9eMMI$wjTK3HspQ6YQNH(T3rxMx1xpRQ ztzyVR8+rf`b|hdrO9NLNql*fENP|m7Lx@O9EIP89A z1Xjv3UaM!A3R;*Bbd)4kh|(x{m?R#kkOrJ2n98==esF{evK~ODv|nXnH|q<0Rx8o| zFv9ZlY6V?wvb09(q1dOy5uJ8|^IjB*8vB~ey?9r3mdqizsfOV+V=W6=F;{o92x8$pVyGTPueM@E|sFC_LAaD z)7N=AeinXT3H54U#S@%3!JHtnJ*dPt9EPn|xV#jdV@Z!QMVTPSN<9ShTW#8Z)zmY1 z8h@Er*qTC@rm~Ww$E0YQ`UXnh<^hYhPb!4p`I**e^M1V`l&MIRGXpL{6^iXU9>Q|< zSKNe2kOi!xS`6+NJ7kZ--p&P?;c`GKhpRP$+Wk1Q2{FD)oaE{>+$^%#D##`y`K)r9 z$3S9`T3p%u^6_mw;?Wq?(_Tpmfn)^BEc;f0hPf1#I-m4mwoL*DHlZ!?EppuGr*?SC z=_zMT{9@tIlEG4@fkComX8JEJ?;FP38&Eu4x*Jlm81qiAj*>p>k7d-l$d?bxlccm? z(QmDB`A~qR{O?8^V$ldp`TT|%7(YLW*T?tWc)-h@WF;K7wfa~*1s)8m3)p1z)ZBl! z>P(sE7^B+{XGDfqiT%k{6LQpGn@(w`fHn2g)y5gEwL@3(Q8F-iK`?H-I-F?Frn<>m zcCoRM@rL1r*1q*@#~&t3CIY)cMUtcT%hkzbf6R}X37FYIJ3{@58ZfB0B!i6vpKskt z?36`AlV#s*rQN>6{nx>UXGz7>61JKYLwS4ap&Pw0cuyXA!A*0Wa)IsxTEMKM3YTJt z-j%@&9@-^e2%p`on&AT#G-xWr#vn-1%ZZw^d{(N!IW^(FG^)W$owHjsa%G@v-=byO zoZMlG_izEwr*${VWGQUlGPz0{esitIF}Ys5()OYA7Ucc9RQ`JMwx!g`nbmB2^1#;# z7vMd{yH-GB?1WGh8K!o?Y(ed2#Vb|*nlxs%&F(?3Y`T#W185fP`6@RcUV#rONcy3; z9c77O+jo@fBU4_p0L{IJPHhOcAuICN8j02tP;pQiWTYYK{lChd;)xdm^sFF|Mx~x(!B##@EUWmx>eE zA=gQHHA&(X-0UM>*Q#9(&UynKQI8aU9HKA*)w0gV-AZWGA(%UvC1x0FL(dKMwW-a{ z-+`_{X4w1mLzmE$ zAdKH~x*&}to7kXMV5~!2t8>7t*-G(f7nka!iU5TG>YdvX_f!<8&awY__~gh%Tqf&T z4t}LhvYxG1g>hJMjnqa>-7u;btJ?yb6uanEU9(>g;qU~5c~@Y5!gNY-bz%tA#}`9i zBlhqCYOhg|@G1WbX}eVxXyUu{7SM{(!WomCPfCiFc@7`H)Z%%fXva~;z=9)|akw7{ zfftF?d74<~zQ^UDV)b1;*PZLs!SY%6ysk^wrp>trk`1)XjV$OIP|DHFED(HBX|&$J zI_cwOa=Q$$Y2RBp`czrMNJTv-C~BG?e!73|veRWdjVIvvl)E~x0tCmJvI$gEbntTo zZ1}{n6Mj(Wu;?7V)NgrHpJM%@0*V)KJblE~zyRqcNQBkh`YUlhh8k~F>7E5XsLX~P zrW^a^DkqTYI6Y61$DB5SUX9dB;R_qLO8C)RM*FL8=HcX}uBhQPvV4NE(I63m!Mr-04^qy$ooA^)piCn=A?sxNxXWV=T7nwXbn3a}&qpj@emVALDD@tVi?{}4nwMc@f zy*=KJ5sZ|_q9dlf3!HwEcHJ=2L`i$kPd^W;F&kY>xV?-%m%6s(e^hk)&J-dDj@z1< zsboAjP`m-m!tzuPGHZ*#vVA|N8$#!!&T zB$qf#kX#5Pdxbv%vLHBol_YoEco9B-s*(t|t4Tm^D5vfB=Xi@S+k;_3l&2V9jH<<1gUFqT}|9u#}`jG4!F) zm)FMcU${{v96L|o#lgQYPZ#1z4n`0qyt!_9fhA^@f&Bvl{N0HDjR*X0%>Qm<|8&Ry z?A)0|6_^z59Bn|>OvWG*mVfVke|PNvq4c|%XHs!7a{di-s6x<*Kc*BxHeg7D&m;E z<{(EBHdY8;@(-GYl@+3H;%pA-@qhRJ|ABJ+R{Spk{>$(m@ZnE%e@6sq-OZeS+n0er zG#17pwr18~5@se5C*$Av1`jg_1ReN`W?*Guh9Eii(qIcSb7vARR&FK{SF=BnK;RY@ z2t?!l*MOCiljDygjlU$>nVFe1|Dnao!3;qNK)-W9!o~)H8NfE`5bZzWqJQ8F28cGv zZ(k&=%*@Qc-TWsW^BYF_j}`uRbrTc$&$|5vSpGxlf2tenzv?C`CN3c%K_>=Djgh0p z|KsvOg8vP1{rB~QHV+L||4D_CK)Rzduhb z{|*(3xHy~JInvmG96dlbBu;kLU<(_Ntpx-g6oX($kjH}N`2|V=$^yz5$`Q&A$_a9r zLODZygd%~`fY6RmCJ>4hiW!Opit}$J3p-nJ2sT9{&dbWo%ErvW!ph9f#>33Rz|2L> z%uEdtQ?N7nzeqq(ITIIS@c%pa|FO#dvi&|7S*keOFe#F-a{aYSNLY9v55fNtP2=GH z1Ht`$hPh|wsP)_Kkf3*K914v)+y#T6R)K02D=mlbEdi7Xp5dPPZ?ZI9~ z?JG*Qd^j~AE&_v7B)nd#|LgW`f6Pc^Xly{FD0?zq2tWx)N?$==mY!`bB4ECyE1SRl zu7Y1`E0GT0T+R%=v?G5o&|0f+9y{xm61)nhF&3xarWWVb3FzR=vJ+ecXLDg@n8aZi z-qF+3bq_BMm5Y{`KZ#)RWeNeqV=suCB|%ui4f_pqNBt|_Kq$=DZ#<>*Dav^z2+5$6 z`U>LTq`#UCQS75wOQcZ*F`uzC=2$!j`2;s&baQNeUZa2NpL2Tr;n(-!bqWh#ua0M- zITydOiQ*>-v|g97fd$UzV%AQ@pjqC5B8(YBc2<1snAp)BbcgW1Q$e z1m)#5vd@&%(}a#y*`x=jOS2Dq=lNXdS9y6k>NlO=uuj7buEpU{1>J@}pML3qJyY3K z`8eb;HUw(3Qa4a+3x9hzWa@gb9K=DlI^@ykJ?_WlGQYGu6pT9XNkI%Rx>on=V@>Td zZl?1_l9ho$w%60PVD&NA!ozg2S)A!|2l>ll=n(l!3v06uF~j(wB{ZYKiNVTWs_}k9(&VcLY6DSgT!nm>dQNmdW`#cUk)Dw5qs64hnI#e4^*0emkz#pDh zHudXyQd`$OQbX~(sQ>n*_~(W4=ls!uY|Y-xk0Tkp@i=P#Y#^N>rAbSm zf+UKS^FLVs{!PRG`H^PfVdLic2U^ZT!VNiX|F=i{*ayK|Rc+;&=T32KoPsUMBvFP6 zWSUO#DilBx@G2g;c$zQh4F_q6KQv4*8H}XzG|jF4OmmGU6|807sgV}aZ4ZvCo`y#K z$>DpLpSez(Jm^dFFRk-8k5gIvSNwYdySWb=NyH;)LwLrn-us$1yXBF1a8K5)Y^NE0 zxPFC>bHSHYnN{0(Q{#s6wAuXKhFi^X3+q8$jY?H5zA}185@-6s4b*ypzt9dfT0PvF zdz8nQT99zR3Qf;-*pCdk&67qm=#6Q58-m706l&E^X^f6>=IVW>*EAQ;Pd+CNm`_FC z!gCE^_?Zp)7SqK~TI$cXxPIo|fi4y@vYsJi7&|<=#DCZrU+NB_5p>Wy3P7x zC+TsPIMmWnrMTIW>0rP*YerwAGwZ${P`k%=OZ%YH*5I-{+G5MKI_^FsqTJ&mVQe+~ zX~QBq#}SL@?hTd`2)D!TcAJBEsukrWvm_(E?omkVrFv^|_+!ServR}NhrCR9a=c-H zWT+>+Yx;%251UP5?mC83m6{TwRM)Wcw#Rx`Q?r2rYv46}DosRvREl?=TJiPAW))~dN6GJ)cGk&0 zbbrVrksM8Qc_ZaDkZ1O?nf1-Zb@;=2*b7~$l?m6cIiGv4al`w&YmN1ntIROJu!Bg= z69_x~>8g}};^VK1$8#s<-8<`XAz+-}fcEpePlVRE5l&xSP$#-B-u)*$^~e4NIYPMk*`w!cUJ#z-GL z?p<|1Zk;jy5BdL)_@|ZsdG=YZ+UxGadJx1UH77@8^!^LQd;lQ1A@g7fSgevxNCd0O ze>6eW0N)a5Ge&SMD(B&3j}iCF#m#envBIOfj$Y!ig-_W_jqOzyGw+^F{xE$e~F=0vEYF|d&{ zZ@I;B@Nxkxm)4Zs1zHWxTf*(2uDN2(!>&neH9+IHM!oYi9& zad=78v(LQTho0P)1Nv>1u?$$Z3zmaj!>P!HCSM&WgH&1Fiz!;Y!WzGMJawn|+TFJ! z_O?b%Won~zH-9qNK{;Ez7FRfOY!c_k6ePBEr_-Cj-e9i1Q4g(B=We;SwVdLD@{LxdijHng&>-fA@vgQG zNX%oYym?oT;$eL9!u8g#cxR1~Pe+NMj`N=2@P}&HJg@4Z5*;6JOE6)8y@8)Z+gS&i zF0P|-TW@b6>$~%!`irlz{QhA#%dWkxJ655Sk9U5a)n$x_EGDbHrlOIgL>W}yvY+a4Pn!*`!XbY~Xz8 z?pVgQHQ1Usid$anX}pN>w$q%b&{Nu^Z~It3V4y5=#aYDruG;_gg2b@)vX-X*rAssJ zXEGKPm8t=_=LP!)KLED>0NsM&%(Z2WY?C&3JO8-lQBm_JxD@O{gN@PH6~x1Q^D&`j z&$k3~Prhaei`~ZPbVeM7#NUz~>17qcQZ8aDODadUeb3gH>YYB{3{gsJhYZ#=$<;^f z(C&PQ!q-ejp>R~uNpU;b^w^3=2e zHy4wEbdKeOq`)*S4nwQ5Tw8GHr0OE!Njhz9M)06dlQh zr~38&7E8=w5n*)8ZR=x2czd`YE{D7k&+r#|4g%`8f^ZY&jP;R>cIgTi>W>6Z9KOc| zTgjFzoGgng53zZt#6m9W%`Gc4daOI?fZa5u_v7AQQs0!k^QwEll{!{gB4u?zKEg5# zj!RkgovDqD4OJ{PjjB05{hm3UmZyT1`>y;V?Cq;xf-_TH&pA}4HxuOy!&)_>ZC4ue zKf7J+)THz@+#UmCCk^Y0nj2a?XeK4X{H(>o{5)^$TNi#>%oD5~eQv~Bb{F&=qG2zo zQ_k`AU6`9B5wd!yKGbs^>N1-skEPM2ttC|Zni0}%O_1#kWYX{%1a5oHR*woaQ7A1g3z1lvRUO|&D;XZ z@tDkvOXahVoJpb!D@(sfqo6tB5L}IHS0F9+$JhLw%AB!{gz7|7>pA95nLkdqPjVbY z?ig!IEM^in|`QzY;czFY-s}Bj)LvNcuB;!&dcTUeo3k2WEl(dQ* z_ug?RW5K=Azu>=d8SPyGVh3?V zT8kFqgrl)kCf2eiGv8-kySlhdmEQ{NZ5ZqfXl25VSE3HXojZOtixX>~foZmnLv3AL zjPR{fYA&}LC(Pww2b7;FWzT`(VI z*>q)z*2wZ)01`uOu9(6=dtZJaeT_C3h&I{5;}w<9eI27vOBF{T!(SarHDWF?b@cS5 zvi4?{C?mE}o(ZWji$5m(XGgXqim4lWQUs`CIn~{Xn~@l0TgP0kC!FWO+E@X_MPJS) z0;jL>1cc<7{MGn<5jHd57ks*hz%z#ZN}7jqb5qN=Sw9S-rfGR=noY!Axdpwf2{&w2 zH(}y>#nm|@NX#Qz>chGuSsdwp5Rw*DJ*vNq^bmzEk#6`Jy|COdzEf5I>d-~b&lkVA z>DupvmuE zw*7L*j}h#|VrW7bKg<{{qv31|AVw@UEx3pIq|0BJN8&V+cbzYpTqT&KKrsd_|8x%P zQxdNp)Ym#jZ8bC-B{P!fBGm8nD>v{qPmw~JGfIekhh*({%j{uqaW+@KAg{+sC4?t!r;h#7+^4Wt+EMQ**JfZ8=(|{^)I+Em_z4=1$cw#~oX~ z;6gs5L{III_cM-JTg6=4fMi#C<{|!*V3)`zGMJg;D8a+R;m~$I-d}{ElQs1M=FF-7 zdIGxFn>EmWdPQxbToDA$Me41H>+_~kO+P+f@6dC7s+pjqLM^ZhxGz6Le|z2D3_TuP zL|#9jvl4*L|JDvoPw{D7yQ}gu!AKQ@OAZ08{3p$XN)a(tW=0)AF*%86BgHh&V!F>< zkq;A+5-4fmy(ec4FTVuN%w!V!7%Ygg`BjF|x%W!7C0?0of&k7}g3livqgFQRSc`Z& z__d$v3oCUPan*vPyu!q%786=yywN5cj1~Q+ya%7lZN2SB3nGRQdhP2UlCJ2Hg$>OHbrWt0WecMZeSJ*P^f?3W zhDT1F$QWA~b{bw6W?%W1^!s`+4$swlv*T!|3kS_<1z645q0CL6V3ELF3ICAyUk*2gbvNIGCMF14w zoLs$dBrmOHNjlRYKkW}$7OBW(;CN!8WTYjnVzN;wfRxr$nnf?t0w|wi6bVQwNv9YT zr=^l+(T{WhMyD7>1Byz@6AOWnh_s_6xRis^w1L2685Yq^W<5dg7b zTzZLmfCLaZ(I_7PTTGK&C>-fcds)2CBq1E>3%pJt(})xVewR*QkVpmi(t65$OZr3? zA{D6*G?7gp4bh2orkyRemq~ap5eZPFO)Qa4BvVEV1Gv&!11Y32m_pPLqX4F~+r`W> zpyW>^A^M0pfJ#6lKo=1QyGti>0QfF(J0Gwq=O7$;R(!7>*(-e!12B-gFr$5@7}NlI z(+<7`dNU510guzRRcHkhw&Q@_^n+5sUm}rcCHLI`V(AM$T3@D_J7O;zS@CevNHCP4gA{!h7c2NvQ0lP>BuYkuX+dQ zBp^TO;12LOVOs;pPc>Ks(0P<4|1_Aj=2A_b(sYYo4J>VMkU^j4$d{B|rRT?9q zP$jYs;3nsg25^&g2m`E^wCP0}$U0;JT4f!g09I(qtVX0B_|S5&&;y9RdJ*at^rwof2-1NT=fc_-$+2$wZ?l zKvoI23Zlo!x674*-R7_{E3~vlBF0()U45^%u3P*63qwPi^h`*1!>_ID#opuP+vW4X z?o-&77$UBa5RIrrUVxq zL7gde^8;v!I%8d^CC(u}FHVg)L4k-dL6WJ+9%KG~22eO6o)k`nsX&7Nft_)i2nk<~ zoobs10bfBC+aV4?O>zxO7+ZW-yokn*Vjc-IMY$V8oEjaaEO8(_6nFzH#4IEg4~mGa zs3$8FnHv=@gcc8((}Y$QoF5}U`~V<1l$uMUNh?R=$Pr6curbB>8R4n&RgjEn{tEqu zY?NY@#1X4RYL+@+He5I1dL&=95a7rgkvNheo-F-6pPw%wCi{)}g}C}?BYH-}HqDf{ z2?eY8Y^ncsLQ@3^VS=n;2rxU`;&W#Ns+Gh&sVpJIL+(D*u8&lOUBt8KHOkB)#v<}` z9{IyuY+6Ec^14Vg^e*4(o*U0XxMz8W@KuAbQQbDNiJOJxOQU8OmfgmS#tcnUG{R z=$W75dl)v9ylJwzVil-`jS-V%E22$2+tsi+cn*wEIU-H8+tx5Siq6`f@nD*zvR@DV znhSSgHYcBfuk6V^%n@y3+_r|wk)L10tRdA_Xo@V4F{k9{4yiHeO}o%1pv4!;}Z%14v@#{|>eziHw3JS5xbuyoPfpO@)LM#~O8u7jV&p)IS4l?^QE zAv;(ZRoV43sVQyLmk&0#rJO!<>1o;*=r@I)8RB^2wuR1xP2oO_U$E<^U`r&AuS96Y z6$?!YDGJ3axAGBP9aq9J!?z=urQ34-^m@fG-Hjh2{eGAOc z4xbTE1mO7*Uv(1q?+x^c^#v{L<|0(n@!#oac)IGW@^|_(ZVBF>!JUe1D1JZjXM%Bt z0d3iijpTOHAMv|sFL<5SS)W_CT3@fB{=#fSX~S-VYg%jx z|0ur}?qfg?zKvc;%SUk?jXpOXdpvtu`#1J1_85nH;kS&;A1<@)a*uhYx~3cFy&Ly* zuWEAH=B=mjEF;XYm@cx3EYWgWx&@pq&Be@jZc#|b;BA+;Hkf?}XbD>E+`Yt@XAJd; zwcqlBA3LT;3OEXyR~Lg_>9Vwv98K-r&2MhiNY^XBtJze|3Ds_|YFtFBb=hNUEWLkx zfA)TU1xFi0yWK}3ye7S&&_}{O#8%UN@R1JC5}4K5LA+f5X}t>Zoo+ALhJG`D6a8F= zkCwT`*TiWfXM5$5PfAy}AqAz0p-MZqp-Mg@fl7KZHs-z~YtvmPPGU~7rXi+wdDxY- z6{tDkmuzyT!J?~X!KG>PCaL)BA~)N|f+Z ztjBm8$n%W6%(SoqAX~x8X+r1Tv*%AW#;0|U7_FJ+a(BgaJ~kFz-j4VNsjikQKP@UJ zZo1^&bUfVFHk1hFJ?J0qRdf^^T5kS&pKA2sqO@F*r6oCnt&*LwiiAk1I%Ym;d#a*= zr+wnU;eART-%rz0N2a~#Rgua!U{}YoGFhMaD1*YUY?DleY%n{W^42T&brz$?%tCb8 z0(#!?Ws`^mlZcJe)ywla*?Ag8Pl}@4TEBo1se(>N>Zv@I-rP=}F5>Gg3{I*O_x7FB z{rRPxA*M7ytn^mL`B7n)^H)FIH!niOTm-HCHa;#{ubCdT(25Z7+R2?$&} zAFEFqqKr~)Id8G&6LMoOy|#v0fGvYM@=pqA?!!0as6#Y|Rfic1P&dS@18BlDK~Y0T z1xN_9)uEfi;0M6x6KO)tK{xk#8xk?UO@|$aH-+X9=CCJY#(E9S=6}$~Zup)VE*)7O zh6)DD|DuoEke(SH7ey61MHo&AH5x_|MkF5@7djgX86gx}EC87Q3Ks?$J~DvJ5SCET+GEAEG7{8#+Qd6uBYPwZE+im!O(3GT> z#>jf-RdZhAo9Hlr5JnjxDt<>@DyX<(9aY&=%>I$QJaLuOU|*(mu>7>?zzSv?~ms|Lf^D!2z8Co&J0QeEuhWCw)u- ztNuCxI{sM!S^fr4TrgZvtNup;NB&j;R{m81RsM7VbpB%jWBzgha{f^PQT|8)Nd8v= zSN=79?R`AL2=<)zICXGK$k`+Kk}Xczez8|m4$nN3Lc>4zxL@Aw z_>;rie};<1?ZbfOHiD8u-unMI`A@$-v5iv>w>*=A!^?ZzkMGR#c8;C0A(JmE!{74S z=YP!+-e(Z#v^NY7%BNdB^ADw8@D8CGc#j)I%Y&kpWfx*=C#>l@(*?#iOp%tT%ITIl zU6CFsks76zYnP8+j`RAin+B+l(wM6}iP`EXhC0xk&xE{@rb|BTe{09Bpvbu^FI(Ms zT6XA}LN!>k5n2OFo0!(vc3on2`E7@Fplzi@Io}y3sJ95OHsKrK*YbJaebb4{3aYTi z$(s04*Iu1E5Bh~tox$*FJo~fu5@w649D~G$s5d7m2XP6yKD$rT9P0vNwV{nQwoXi~ z`hLnx@)w5=x2oJRHKb$EWyEqd`j405^)J*e+t8>2N!g_0nTpSl04otJ$5js5Kp%eO% za^;{9m(i{*_r|5`F6m^zq6w*k;icMmoD!OwS6-MHhZeWUUa108L{gTuw?6?u zrnUQV+`O#tx#pfR|e?$NNjZ^>y0B zyW+DHTe(=S{S;&kqm6Ux$Lrwvu?vE0?&QV8lwr zTiuTBglgkz8qUd@t!Q~PEk3kNxQ>7fJ^pNeo0)!--|Z@X^qR7#j=4F%FZ;}~#LdO8 zX<(8%uy+X*<=8c}d0c1tYX&vSa1i4-g`>}sqf=?kx-|j~z@DW%dMt`@W&3Msu!Hzb zDQSNL{D?KO>T1Bpsku3frAJ;^v@LdTt02%)~ zE_=Q`W9o%n%QxPY*EkG1i~$2vSgHjN_PsmdjndWnOq3~T+nTJTIidcv%Sow+a;&sr z2o*SHrVWi64H7*3nOTY57L0a@^}U_TI_bNSJ66};jg;$2NiCm$C^nR4RZDhnm~$N9 z`1(c6SgX27HbToe?_#_#JT+7ww4Vl1SGHasrkO^_jXE32ZT6*mqT9WQ{{WGjpHY9K zHXoWz`EID2ebgBYf9LiPQf=*r=j!B)q=Tiq*-XK{zrNW_f|S)PzglQy_`Jch(&vpE zQ%^&T8n#q$*k4ch!RASjhmJ0TkC$j&6=M>`#-jZ^uylgs345x2%9beOK*jD7te$&u zK4h`S_|EgZ5jrL-OWu!R6xAQ1|Q}#z|lQjI2?bNAqku zvzPUa zuAp#5g`YC8xBshs>BQmi8y&WBAs53$lKHqpv-`tiow<*TcRt6&B3BVD1Kqqi%c1kV z(&9V*0ZTO$2Y8pK{>C`>yyFvWB-e6jk4lYR=cv}!`&F0mFi(^p#^^{5@GRt==~@n_ z?+nqnBR|)ge@Aw52JKqoK@W!wgqEcG?$}7jOorkl$kvC$8Z3vkyDR97e(qx)4r8D> zV0bE})K-@d!EuxI8kfiu{8{<3B!g~s47eyy%goG7EWFh`wUVDaMsA(5P&Zp?K$OB^ zm}{wJS`NPXP%Gf%3NpP2hCc1G&g&ks{xzq?E$DvWK~9AtFUM+xIoI}TOylW2;w;(+ zK~}t}dse4PoLKryEuLxH3v75NA;k|W8#icZ#e_X{HNwB5p{LtQ4l4A8p~9sOz9oQ*)+lr+Qbl@esx?Dtd1~ztBZuzd)?%K* zvcoMleAZ*M;sxka0TRv#pQ<`F*`LXumV}QG73v#1n@~i(=6e`jzS+x7=d@#V(`Kb$j8Cf;Us%l`|1eI>K+8TLpm)il@#;;B zd47w_gYDs>cCy7ZmeS+W3L{MfjZ&x# z6VZ2Iu(r#4jkm?uj-LkyGZL?;k$C`|TJpSvf^%&0sod7GQ5IjfA_Y0;O*n@s+v<0Q zXyWLOkWo_yBbVt}=n~qRwjVt>IMs-R_{`nhQ;P>H+P@|5!q&F5RL~W96|1h2zn0Y| zk)1^>`5vkROw~cqUoXUtJ`Drf2%Yb*KKnHj!lNlKl>B^0%PA(Zey-do_qCgRFAXI< z)vBq4n!0Qi#cVfra^n5vQgt`{50jV)4Z*shBXoC39AujGE_3(!(UE}cce%A(2dZjj zv&6Z%d1nmo@66P&A7KW`h+1i;&fnhHrVdwr4tKj&G}GM03R-Z!$`u^*TFvg(&Y_F@ zxS!^Q*{nQt$8u)DlljuCIowb7arXV;eN^ORIhU5TVi?1~(TAB;3uX&nzsf3uSRvZ} zG^06(bvaaxKxMmW9o_bfFuQ>|XCv##F+_rs5e1F|`Osk1QhTR6u3uaa9&KW`;ANwC zcl(X&SSM=x_k3P6n_f4|A`FlpQ}s5sN^wQaXYV&r6Z-XfPSc!n;YCOyaPd6h+4g=- zMo&vUy0~`vCb6=(Golc+QzfrnUsX-z(#kPY$)!oSa3<#i-8#69dhhLFfg`7#8-DfJ zd3V+6a@9dP{$W_}dR574>XeSq$y{@dfsidN%uCAq`q^Y{>J0_gBh}gukt@E}EM+}@tB6g<4 zX@lE`Nf{YgrkrKFg;RUw3ZrTdY652SIczI}_>B*1!ZzybA`A?sH|+t#DOV47AUNySbjC%?Caz>zQ#jjYdmP8Af+Ai)^f|L@tVJazClB9_oOD(nT0N`?8t~qXL-_gbO-N%Zu;z+?n-Ylls0Fm(F8%Ff>1uT?*Ijq}lHTH^l>#L;7NW z=WV+c=Vz}>esNYos%ShSw9spa>V#eV(ycd_y1d!hWOu z**H`~M%&B^7Qj{(kB=(%54FbSF}WK`XWfmo8?g95!pId)8hB>6{te2w8sqK+o;7{gD$Xe=sQn(A z`=>3lw;yV~94LzCZC676-RWXJi7mta7C1ivvBC#+<2&dE>NPI$Z4#I=5KLjTI zMZvSB_ana;+b{ov^Jn~TtbdZ<{Gf;+`Y$gq4?0ayl6=w6LMM2W=D`uqwo@24hFJkT z4V*JJR13MyQMQfp_VmnL3)met7Ob`*yAAp?HdfV1gSZ_wK^W?T&a0`)wx3%EfHkSJ zHeS_9^GF>hTjmxv@n12HVD0yN%LZz69%gLbHCjr{+Q6Ics!O+Kq-U*)cTBMM*Y_Q- zr%v0*B{|U1uh}rHw+!j(z|Yzcj4z+SueS_h#oW7UnzfoauM#=goG7#sR;Sl=PTNRT z!}fuUxX0jMFRqD-wbJsb*o;o9W;L+Qn`Ue&xt6Y^Qtc$?RB(dLDixM9EL9*g{}`TZ z?MphBtS09y8onADkdBTD2~dCMDVm0(V$6G<6mZb5`O32a@5Y;r1veom6>-NOPp}k9 z*pQ4lH3A&KLwGpSSB7l37wAUY=iFx`Oh*{~rH|G=Jk1zo^@O}zMC1-JwkZ($Mf{pFx~jQS8};|-VDZHcGHV2bQH z5x$hM9VSKRDwT?1ddue`n;^g(p*$QI!pBA?VB;T3&nSP*#0-~1O-~{5L0Oo9wQ4q} zKroa^n19Wj8#1)bOd9`2TPk*;B3^G`#uM*TJV>?=OIs^){fM%nvcxRgBGWyou#xeVxLYFHaQSHn+MeGL z?vFd2r`1U^n!eyD8QfcU%dY?dY67zn+ZCetGV#UlKTCxDq7c^~fg(4$w&r4(O%TpY zX8JBoJ&MB%z~&WJlOLwLP7fvGvR8)TMKmEsVJJb2roqsNEJf9-)Q9<^9OTTx{}|W6 zK-mc+ff5}|&+AyAdd}l^{xiUHPKDHfU^}w`Z!qMtC~`qA#yTsO`G}Hp{g{nZUd2rP>*S zk)cQ@UI9N}^9M*2l`D~tTtgZ59EQTd#FMRlN*P5f3=QE|!6Z<%a z|A7do>ZL{#7cNvui|w@yuPm_(%kiXWA<^tK?OSk}1ej;x$gF6MLuPP*O0(2SDK9b&E>K4VA_)zESIO5PT%?1~tXw9-y93l{s}M zZ&YDERM&_$WG=|_@Wvb|SKCn%HAU@hW~rWuuS!OX`;q4n1X>Krxa$*H9&r6Bo59Wu0K<)3yBGfF6q z)AN*Iyo`ufz-v^Gg;nsYzWDSx)Tg}f#_zA>65vB47i&at$`p;;%h%^BbV4kH3r5rR z^Y9MERd`Ciy(b*SPOhD`=+64sz8&YTYBi@HR;U_MuF|-7p4$7H9#7+Y?a~+6d4?z1R{ITA$L+Qm@m)L^klV);3 zgiH&T?=ptnun$9;(ux@^7&#bDKiU;Y8ms({_CNznC6^%E(nSl7l_QY*Y6KR2Cma9x zEtnxKRTA^PEd8f0jwb>wVvIu}OIT#|qInTnmP-)<2~Tp6L>i^?29X$_x}il6gqm|CzGY%64j@^jLA$=>04RQtxP^D6{Kjqj#iy?TT_HfuuoB+g1 zsbSl*WJt#K&+1Jq>QAqc8f|oIS4~3^q|B;K%Kci&K~0_RF^CbFBc2rF^(Mr zEf;$V7Lf)MTD92{ubIMY^~Z~501{!g`=MVKGj3Gt+{WvA$ryw=cZ0SS8!enhCJ)uO zvy?QF86rhF`d}dk{@j_1=nm!kM)3huZSLAsw0C2ct%|P|^LqW=0r3y0A@|j_Py%Qz zQtPEzhwKd;X}k=Qgm$QK^Hp*WHQehY$5=p5a^k*nOMjHcLHtiIa3C8}W&l+cN#!PM zAr?nX2qq0uk55xY@oClB}s|?9A$-D{0%R z%lX0G#uzbOQGnv2?@aH z^I2#2d@WJb%;!kKVkr4`Mo25mppoF zv2032iE~ozzOt>I(Wc!T;P+ZR3YHKQec)X^oD9ccAv+)zb}2gG^}A?2rOx%6uW+&1 zAn0Jbx`I*5=Aewdv}&JxUKHlSn*D!9{8KTByC}6B^ex4jK#7OhGSTC z_*ZEqBMBLI0N#+MMzCUAs|)iApxfw>k!EJxG$X>m8|%~yR<&GImb}c)9`;9Peh(GX ze1I7l|5o)XD9nyz(M&~{h?okX;zt^6L`)g|^)`|!MLXc+twZTYn%u5G$MN!yAUpCxM@19_f3qeaDmJ}EDD8X>1o&cq$5M2>^m63&o5(WMCzC$k-eBxV{a0|sT@grDo_#o zm9KR#;K(^9o?r1Wnuck{1K?h z8MRXIMm!2g&~KPzo&Y{qj$BEG#Ck_>rwNuKSt$jz(?rqo_8~zA-PGf+r(|u+Zns9U z8^2M()c6&pE&9PcBh*d+$p+B4i37UV2zwApXlXe$QU1;Z71o<#YyDhPQ$uql-bbyT z_I`ztHscGRC2568nkuDghtZc&f~BRUQO?S;>EvdCmoi8($Pbb944+Tlz(TvnJT+*b z#Gz&Cx4_Ac8SH;MQ{OOT^0S(snnYo+&IepsR6Wa}$)_LGnJedSNsfq1q&`)-?kOeiLP`SlLwkGRpOgO!{ z3z@G%v1xq>JR(K+$0FwLE2Fk%X5r-n6K@d^F_f2XS_OUB`SJve|mNFPTk7 zB3gUOmSoZT^eS&6;d=J~H+)wryUQNUQ9MS^D6K?|V7e33DXXth4N{D%WHo|(E_Ny2 z1dbYas=RhD3tpGyZ5Cl7WQvr{QO?brD$hhGEq1oI-Wz2dgCF?r%Mwm$hiKz&bxHE@kpP*Cr%qK*qd8g}5_NIB4faQL3o%V@6{=GlCgp#u#-}GszgfY_ zdIU=+In%jZu5m+hOfK7Ha2qXLTW-F3Z@Uo2eEamO`s9%bwq$MxVYF68H;R?19!a=t z-WIh0UitdoaG$FM-A&K2stL~_nOW4hOu9UmfbRNcLr?#H61PK#SMKXQHlNfIH%BdG z(8A3r=3&clm6;~mmC>c%TCefdkiw_Xo!6shi_as43Si|7k#$CMpPs{aP~Ntl?~E1P z8W$KTP*raf57CGYki$;0_+X^gMjN|#@ODpd1sKOl&T&=|M?3<{YP>nChEmu7TXY+X zJY?1!C~y60u{yQi-r!AfxF0yp3q-rWkzw3giTK6}brn-~ZMDOq)56~37&7zjUcu0- z(YN958_V?%TI@N8gnuw4kqTNT+ZxB)^fGj;V80#54 z8d)Q*aUXHf?hJ#s=p>E$neu)43UA6+-|u*Fe|s}N4Dm}UFc*Hfe_{z6kx+TTe5L3b zCcKd1NF|ay0B%@Y>3_y=R>xZ4AciA9Jd zNp78Jt?LV%FUIe~6E{7u31v)TW2Y+j?d}^cbg%f$4ik*r3_mTOeaWeFEPkvL*&4_F z$gl!B__=;ES|^lIy7rR%ZL#M&)ek7Iua(%(ky}t{aJl<5s4~NujA3N7< ztsKUvbj45AocXN}^Twl65`JXwT-$lJj>?&7*Iz)q=y6V66_C8XT-tMP+;udFGP)2{ zU7jmO{%Y#kuKkM*@FR=Mov1CohU19{o$_bbm0hn%`m8oQz^Bd~RVk8v z^`DL|>mtXc>P!1ZbRD(`9oKMOKy)szRXPsY11fYqJa^g}a~D#QHRcvMJeSJs^N$jF zYFq9L?QojJc5kGDw~1y#>NevI;I6b}#dCS4i5|yBx2CMkn4H0Ps8=08$P!M6`icn(>h#mb zj_<1lL@n;|$~1S(9o&7*4XCtqw-W{dA2I`&v$27~4+xrj@9x7Wn~0;(7(kM=b;)M- zB`0vzw6x9ghiVjk`aP#GEGw|sdk)?hRFO&_ZZw5k$V6@1pc4XNf3yhwhp53&MLjG` zIVL)WCp$o5qLR6kqJik6Cw6vCd&#YUV#&$Z8a<6{-ElfA=i5;JuhB)Nx>tqHz?rMk zeW$~Wcx%P=D4ebg7P)OchwU!-so(M~OM+!JYf8JS($rKVskVvz$!)NrN4d*!=L!>7 zE$qc@<|Lu1{GaKJwXNX4*Cv`My$sx@xtYz*mOxoDU7|CdyJ-a*n9E zFvDj(o1b(ORv@d|Z}*>fj^%5gZ*KEP@MW(DR^`UW8}%P52~AYY_sNOmW~}Z?XhuzE zWc6#N<*A-toivZF>yZ_=73_WLcfpn}3{|J0(EPNdM!Rcsv3krg*;W0yc74X6zm~u< zho02)Nv)~1^f^Wa3){jzJ*l^wfkOXiLs^28<3v>65v|6&B@SMjYpwYv8I#-jp<02x zh^Ary{l&z}dC}@N4Hv!l@B;GhZHtvp!WqVM_Z0^7`h7=gS(Z?Y?)P1$r6u%RTAbtFC% zY=F(w`zeKIX8_e4rPmo#tf^v;B{9@yli|Cp`Wtkv;Fw!cvqdOYHu&0l$JvwUAqw5ZKvyam4=pr zv1suRHL6+BE0tI>lLyIl`ZIbZ3p~u{qbq#d&=Lptt&TUxc7qCq)FPYotnL?5@6gYC zSGZ*Ox2HmNRg2r{S9eO)d<{9<18n%~-*Z{6cE<)6g1ryV1sKhTUM!4VrgPV?)6rxG zZWOYO7fSUcKF*;Nd`wMP_rUR8-dddNcmg54RBui`wzJkrQAXKpqzqooU(W}$k7co1A9Fj+s6iVFgYvg+;+GA#M_1-&Md3plu zmf4$wys-=ENRWr^D_n zd2(wX>bj=t0fTO_peong9VWuCP}$62--w&e+5G8=LTM{mDIu?hc1XfOu^GM*R*H8G zIv#=tGXXCyV_ud2oTQDcZ*N3XI;`Hal@+ICVwpJGuXC>orT(wy%S6}>Qi^AE;rV_lDO&Pgy*KOhpC$1$>8f^|HRGvBs{L>9u{X>wel6 zI$_1WAh~_b{^q843#oAmZ#Pru=4Xa?mqpKA6)Ey+xxGKl+pHx?)Vp_^96Q#z0-0wP z;1}9Ufm_jx4z05}j9RK&S9E9kj)#+-{H@EbWtTW|hdeRGj*%-Z%Zif6KCjFn<=Xr8 z^~OW`ofW5@1X(AEEzWP@s*8pBj4AMitI3TZR-R2{x7>V{CBJtrpS7>_ru4TVu9I}6 zPwjMJt30eq@+BmmPrP>g*ZOiwQmU@D$&T+l@Zc7*a8c~g@L#6zk-Udq&4lhL&ormid z<3R-T$Zo0g5v98L2vi)+Gv$9kH@(yt;cD%(ZxZ6avhg{Nnz80Jo+VE>>E-MOxyJ1T z04+BrbufCbicd9a0`#A)Xxi|8K4hQqojhNp2|!+LVSD>=l8KX*z{``*@@vq<%g1o* zaSjr1%^|ms58`0*`hl{c21#@o26g<;O9uuw;<&TPrf-L45M?HU@Oy~OHPBV8i|^DNsJHZ81F zZg`tf8vn+1l9ANCynxkU^z*FX?8WH|&W6M6MBc^G%op}s;Y`Rw1--ZKe7?)BcRfnJ z4WrLZm}cU#O(f%7Zb=tC8af%)n4u)IsLsjMrMuiI8#)^mTnM|^MR9B{UHM2(PPm!; zl-FLWtfKxSh^t{c?Ck8NbHZ4ee7vEqa^K9{{09qYn?UhcV7FJZ#7F4@CnATz8rwUc z>RB$Im75A)7!Rj54hgDph$Ws$EUDBrvTm!lKO}dlpD431g)1?5+PdW1Rc}&H&6l(6 zVK2>Lg!_gZINu+v356J{+a}a^iZusb>G;f_#L*^1`IZ^Z*O`+0o5oG1HT?_*_0e z5M#LCt-w7}{+3?NEn-1ak?*m6<(g((730R88>e+EVS);JLXP29L;=$a60eR3mp;4JxX+Xbkk<3L_m- zimJxkj(i2@ahFy$=+ZbJ*G;tBUf*5(Fry^i&Q;f2Kk+empTI?4*8cN*k!=^XMHRX91R6aV^?AduY z_WKcdGi_L$XKc<;jM-M!pH}P_&|cm|X@*gIPB-LTd^~QIaN!aav~`@wWR7(oQT2oZ zvAbho^bO>#0@`1|8#%dOl68`I-v&%Lm+Gl(9qJ?*bzArc4$=?9q^o0~*#gIltqXDZ z*dD;^()5j!OUip!BOUzoKj5H%n>G z3enx@o0+KC=$cOSIDY0TxXAp?+1EYFXN=MWM-;CgP*7)Yd79~O0VbOhHY!kM zjy9ATrAY6sYLQCPUbV28SW|^)tP^p|5%ivBVXF-_;N&&%DC(5np`+jpv`)}^HpB-M z4n9jJ8;fL5a;EiMBP^)|l-04k(&D(>&45VsT3)&`nueWk6`V^bT9mXT!=>rsT^SE7 z_i}4GDFmT!(+%~{!?!k!7IblOUs*tMiQ1#mvkFPirwtB;b-VYc($X6@RW9?~9moWv ztUE&F$ZPr7KQj!U8YxPi<8?cxYZO#0vzRfA;TYIvSGVoDZp{%HpFb6}cPahSK0a8# zax7;uVj?gncXIfpB4DgP2VPz>8^3nJ!EM<-Nv7E#1gqKFybAhU1)n5*9G`?Cl*$d- zINTf)sw4+uD-AoBdt3nA4L)2fByXPwTss*HPY!FMOXtD2wcjUPA0Cd4T$K=}c(!Q~ z?pyO+J=|8|vnl1~g?u?o<#fiZvbnIGDG0KELz-M--7O+YN~G~*fg!KvN?7P znseD!$yclJZfE(L3T(L>5%PsK-r0V%nNT*>lv{4NH(tLXG84@dOzbrW8?2v^ikmX< zXCkuj7j--na-p0#NaBo6AQi2C?VqWANhU@L;_6ekOBw)%)!2!_v`!wJh=@y0krUQ) zf7))G4pY)r$;$b_Pw1tFc-jlI4U21LNv19HN;bSy(DD_D8dpx0K7E6n_T?MGW@E${idv*%EW z?bh(~(2J62vpIvp^U$0d`sSI(@6Umoc`dF=SZ(Trp$tQnx0vE@?|sy;BH+E-51CCTxDqt@e#L?Qh(U zf5@2pNg%2YmHksc1H{SsjYIGc%0GS~n4P|%rLhyhz}VE>Mu2L&rhy7zZX`gZ#sLLE z?Zk}D%pbWs7%REUDI2<58uA!X2?_GUcwyFd)(Eu}0L9Dg$d zsQ}+yoGb;XAgpXGTp%_oK`ed;BNJXlamn8sA>Ij4nK?Px@dAOauCA=E5LR0UQy?1; z4-XIo27kV~^&dU_L0gI7U<7>YQQyGU*-3zk3h;Zsc7N&D#*y`V zV629=)tmLH~;_g;Rk*@ z*I&;4JD$H-ei@CC;h!MwoE@ybLo_l38e17#f74Sz1jP0|AR|Lw!{6vA1;6J>$=Lq4 z11odEAE_&Uiv{t)ZwKF9fq(7bKa3SIsDB3gx6Hxx?GS;2z6XkM;{BaCQ`y$m>c30g zk8b>b8jQd3VhVoa&13;_u&{xZLF~K`9^UWdnYD665-_j#uLgV`5orp+kOLzuspUwJe7b@8~RUr`%BwjfCu~!Y*_yT=K%bBl7E!t zf7A7Ey8clH{*m*)v+Lh<{i6*0BjUm5nG4|18r5|EtVL=oAQ0xgv`A zU*AmpRfSL7+|kZT-wjdSD4RPW==*WaoDKqYf`V*on`P)!rShL8*V zrXKj4`Xb^!MG^Q-coFcOb{TOjuF20PA<2WNmPENEc_3ghcJXh8(qHQ&!T+m0DO0^+T43RP5|BS_$o%Z~m7koW| ziR-#k1Xf&{6+jW9Rv)KXxuQ1f};6eq3BXx8;E#80-J;$HB(+lMMu7gZu(7 z`!8%9zp!!s!p8Lr8-fh{r=0TqYy%@?Fn{y|BSbcTvi)L=z`wu&{sj*3FK~c=fdl*t z9N=Hz0RI99f7dRllzybLM4#a%FbDTfe+yt9&^J2xzs*yGjr%Y2)X6~~p*-R6U5WO$<&N|J z`5O1zw>J6?PQNV>U>