From 46c77407031d8a9ac69e1b420051835a1fc51e55 Mon Sep 17 00:00:00 2001 From: "navid.sassan" Date: Mon, 21 Sep 2020 19:20:27 +0200 Subject: [PATCH] Initial commit --- .gitignore | 75 +++++ Aufgabenstellung Praktikum 01.pdf | Bin 0 -> 40777 bytes build.gradle | 35 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 58694 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 183 ++++++++++ gradlew.bat | 103 ++++++ settings.gradle | 10 + src/main/java/ch/zhaw/ads/AnyServer.java | 20 ++ .../java/ch/zhaw/ads/CommandExecutor.java | 21 ++ src/main/java/ch/zhaw/ads/ExBox.java | 18 + src/main/java/ch/zhaw/ads/ExBoxFrame.java | 314 ++++++++++++++++++ src/main/java/ch/zhaw/ads/GraphicPanel.java | 88 +++++ src/main/java/ch/zhaw/ads/ServerFactory.java | 68 ++++ .../java/ch/zhaw/ads/BracketServerTest.java | 29 ++ src/test/java/ch/zhaw/ads/KgvServerTest.java | 23 ++ src/test/java/ch/zhaw/ads/StackTest.java | 58 ++++ 17 files changed, 1050 insertions(+) create mode 100644 .gitignore create mode 100644 Aufgabenstellung Praktikum 01.pdf create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/main/java/ch/zhaw/ads/AnyServer.java create mode 100644 src/main/java/ch/zhaw/ads/CommandExecutor.java create mode 100644 src/main/java/ch/zhaw/ads/ExBox.java create mode 100644 src/main/java/ch/zhaw/ads/ExBoxFrame.java create mode 100644 src/main/java/ch/zhaw/ads/GraphicPanel.java create mode 100644 src/main/java/ch/zhaw/ads/ServerFactory.java create mode 100644 src/test/java/ch/zhaw/ads/BracketServerTest.java create mode 100644 src/test/java/ch/zhaw/ads/KgvServerTest.java create mode 100644 src/test/java/ch/zhaw/ads/StackTest.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2765258 --- /dev/null +++ b/.gitignore @@ -0,0 +1,75 @@ +*.db + +# InelliJ IDEA files +*.iml +*.ipr +*.ids +*.iws +.idea/ + +# Eclipse files +.project +.metadata +.classpath +.settings/ +.loadpath +bin/ + +# Netbeans +nbactions.xml + +# Visual Studio Code +.vscode + +# Maven +target/ + +# gradle files +.gradle +build/ + +# ignore logfiles +*.log* + +# OS dependant files +.DS_Store +.Spotlight-V100 +.Trashes +Thumbs.db +Desktop.ini +*~ +# Thumbnails +._* + +# compiled files +*.com +*.class +*.dll +*.exe +*.o +*.so + +# packages +*.7z +#*.jar +*.rar +*.zip +*.gz +*.bzip +*.xz +*.lzma +*~$* + +# package managment formats +*.dmg +*.xpi +*.gem +*.egg +*.deb +*.rpm + +# databases +*.sqlite + +# Ignore Gradle build output directory +build diff --git a/Aufgabenstellung Praktikum 01.pdf b/Aufgabenstellung Praktikum 01.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2eb1b8ea8781b1ddea505ee191be3b5e7ea63869 GIT binary patch literal 40777 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 literal 0 HcmV?d00001 diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..92689d9 --- /dev/null +++ b/build.gradle @@ -0,0 +1,35 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * This generated file contains a sample Java project to get you started. + * For more details take a look at the Java Quickstart chapter in the Gradle + * User Manual available at https://docs.gradle.org/6.3/userguide/tutorial_java_projects.html + */ + +plugins { + // Apply the java plugin to add support for Java + id 'java' + + // Apply the application plugin to add support for building a CLI application. + id 'application' +} + +repositories { + // Use jcenter for resolving dependencies. + // You can declare any Maven/Ivy/file repository here. + jcenter() +} + +dependencies { + // This dependency is used by the application. + implementation 'com.google.guava:guava:28.2-jre' + implementation 'junit:junit:4.12' + + // Use JUnit test framework + testImplementation 'junit:junit:4.12' +} + +application { + // Define the main class for the application. + mainClassName = 'ch.zhaw.ads.ExBox' +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..490fda8577df6c95960ba7077c43220e5bb2c0d9 GIT binary patch literal 58694 zcma&OV~}Oh(k5J8>Mq;1ZQHhO+v>7y+qO>Gc6Hgdjp>5?}0s%q%y~>Cv3(!c&iqe4q$^V<9O+7CU z|6d2bzlQvOI?4#hN{EUmDbvb`-pfo*NK4Vs&cR60P)<+IG%C_BGVL7RP11}?Ovy}9 zNl^cQJPR>SIVjSkXhS0@IVhqGLL)&%E<(L^ymkEXU!M5)A^-c;K>yy`Ihy@nZ}orr zK>gFl%+bKu+T{P~iuCWUZjJ`__9l-1*OFwCg_8CkKtLEEKtOc=d5NH%owJkk-}N#E z7Pd;x29C}qj>HVKM%D&SPSJ`JwhR2oJPU0u3?)GiA|6TndJ+~^eXL<%D)IcZ)QT?t zE7BJP>Ejq;`w$<dd^@|esR(;1Z@9EVR%7cZG`%Xr%6 zLHXY#GmPV!HIO3@j5yf7D{PN5E6tHni4mC;qIq0Fj_fE~F1XBdnzZIRlk<~?V{-Uc zt9ldgjf)@8NoAK$6OR|2is_g&pSrDGlQS);>YwV7C!=#zDSwF}{_1#LA*~RGwALm) zC^N1ir5_}+4!)@;uj92irB5_Ugihk&Uh|VHd924V{MiY7NySDh z|6TZCb1g`c)w{MWlMFM5NK@xF)M33F$ZElj@}kMu$icMyba8UlNQ86~I$sau*1pzZ z4P)NF@3(jN(thO5jwkx(M5HOe)%P1~F!hXMr%Rp$&OY0X{l_froFdbi(jCNHbHj#! z(G`_tuGxu#h@C9HlIQ8BV4>%8eN=MApyiPE0B3dR`bsa1=MM$lp+38RN4~`m>PkE? zARywuzZ#nV|0wt;22|ITkkrt>ahz7`sKXd2!vpFCC4i9VnpNvmqseE%XnxofI*-Mr6tjm7-3$I-v}hr6B($ALZ=#Q4|_2l#i5JyVQCE{hJAnFhZF>vfSZgnw`Vgn zIi{y#1e7`}xydrUAdXQ%e?_V6K(DK89yBJ;6Sf{Viv*GzER9C3Mns=nTFt6`Eu?yu<*Fb}WpP$iO#-y+^H>OQ< zw%DSM@I=@a)183hx!sz(#&cg-6HVfK(UMgo8l2jynx5RWEo8`?+^3x0sEoj9H8%m1 z87?l+w;0=@Dx_J86rA6vesuDQ^nY(n?SUdaY}V)$Tvr%>m9XV>G>6qxKxkH zN6|PyTD(7+fjtb}cgW1rctvZQR!3wX2S|ils!b%(=jj6lLdx#rjQ6XuJE1JhNqzXO zKqFyP8Y1tN91g;ahYsvdGsfyUQz6$HMat!7N1mHzYtN3AcB>par(Q>mP7^`@7@Ox14gD12*4RISSYw-L>xO#HTRgM)eLaOOFuN}_UZymIhu%J?D|k>Y`@ zYxTvA;=QLhu@;%L6;Ir_$g+v3;LSm8e3sB;>pI5QG z{Vl6P-+69G-P$YH-yr^3cFga;`e4NUYzdQy6vd|9${^b#WDUtxoNe;FCcl5J7k*KC z7JS{rQ1%=7o8to#i-`FD3C?X3!60lDq4CqOJ8%iRrg=&2(}Q95QpU_q ziM346!4()C$dHU@LtBmfKr!gZGrZzO{`dm%w_L1DtKvh8UY zTP3-|50~Xjdu9c%Cm!BN^&9r?*Wgd(L@E!}M!#`C&rh&c2fsGJ_f)XcFg~$#3S&Qe z_%R=Gd`59Qicu`W5YXk>vz5!qmn`G>OCg>ZfGGuI5;yQW9Kg*exE+tdArtUQfZ&kO ze{h37fsXuQA2Z(QW|un!G2Xj&Qwsk6FBRWh;mfDsZ-$-!YefG!(+bY#l3gFuj)OHV830Xl*NKp1-L&NPA3a8jx#yEn3>wea~ z9zp8G6apWn$0s)Pa!TJo(?lHBT1U4L>82jifhXlkv^a+p%a{Og8D?k6izWyhv`6prd7Yq5{AqtzA8n{?H|LeQFqn(+fiIbDG zg_E<1t%>753QV!erV^G4^7p1SE7SzIqBwa{%kLHzP{|6_rlM*ae{*y4WO?{%&eQ`| z>&}ZkQ;<)rw;d(Dw*om?J@3<~UrXsvW2*0YOq_-Lfq45PQGUVu?Ws3&6g$q+q{mx4 z$2s@!*|A+74>QNlK!D%R(u22>Jeu}`5dsv9q~VD!>?V86x;Fg4W<^I;;ZEq5z4W5c z#xMX=!iYaaW~O<(q>kvxdjNk15H#p0CSmMaZB$+%v90@w(}o$T7;(B+Zv%msQvjnW z`k7=uf(h=gkivBw?57m%k^SPxZnYu@^F% zKd`b)S#no`JLULZCFuP^y5ViChc;^3Wz#c|ehD+2MHbUuB3IH5+bJ_FChTdARM6Q2 zdyuu9eX{WwRasK!aRXE+0j zbTS8wg@ue{fvJ*=KtlWbrXl8YP88;GXto?_h2t@dY3F?=gX9Frwb8f1n!^xdOFDL7 zbddq6he>%k+5?s}sy?~Ya!=BnwSDWloNT;~UF4|1>rUY!SSl^*F6NRs_DT-rn=t-p z_Ga0p)`@!^cxW_DhPA=0O;88pCT*G9YL29_4fJ(b{| zuR~VCZZCR97e%B(_F5^5Eifes$8!7DCO_4(x)XZDGO%dY9Pkm~-b1-jF#2H4kfl<3 zsBes0sP@Zyon~Q&#<7%gxK{o+vAsIR>gOm$w+{VY8ul7OsSQ>07{|7jB6zyyeu+WU zME>m2s|$xvdsY^K%~nZ^%Y`D7^PCO(&)eV-Qw|2_PnL=Nd=}#4kY)PS=Y62Dzz1e2 z&*)`$OEBuC&M5f`I}A-pEzy^lyEEcd$n1mEgLj}u_b^d!5pg{v+>_FexoDxYj%X_F z5?4eHVXurS%&n2ISv2&Eik?@3ry}0qCwS9}N)`Zc_Q8}^SOViB_AB&o6Eh#bG;NnL zAhP2ZF_la`=dZv6Hs@78DfMjy*KMSExRZfccK=-DPGkqtCK%U1cUXxbTX-I0m~x$3 z&Oc&aIGWtcf|i~=mPvR^u6^&kCj|>axShGlPG}r{DyFp(Fu;SAYJ}9JfF*x0k zA@C(i5ZM*(STcccXkpV$=TznZKQVtec!A24VWu*oS0L(^tkEm2ZIaE4~~?#y9Z4 zlU!AB6?yc(jiB`3+{FC zl|IdP1Fdt#e5DI{W{d8^$EijTU(8FA@8V&_A*tO?!9rI zhoRk`Q*riCozP>F%4pDPmA>R#Zm>_mAHB~Y5$sE4!+|=qK0dhMi4~`<6sFHb=x8Naml}1*8}K_Es3#oh3-7@0W}BJDREnwWmw<{wY9p)3+Mq2CLcX?uAvItguqhk*Po!RoP`kR)!OQy3Ayi zL@ozJ!I_F2!pTC?OBAaOrJmpGX^O(dSR-yu5Wh)f+o5O262f6JOWuXiJS_Jxgl@lS z6A9c*FSHGP4HuwS)6j3~b}t{+B(dqG&)Y}C;wnb!j#S0)CEpARwcF4Q-5J1NVizx7 z(bMG>ipLI1lCq?UH~V#i3HV9|bw%XdZ3Q#c3)GB+{2$zoMAev~Y~(|6Ae z^QU~3v#*S>oV*SKvA0QBA#xmq9=IVdwSO=m=4Krrlw>6t;Szk}sJ+#7=ZtX(gMbrz zNgv}8GoZ&$=ZYiI2d?HnNNGmr)3I);U4ha+6uY%DpeufsPbrea>v!D50Q)k2vM=aF-zUsW*aGLS`^2&YbchmKO=~eX@k9B!r;d{G% zrJU~03(->>utR^5;q!i>dAt)DdR!;<9f{o@y2f}(z(e)jj^*pcd%MN{5{J=K<@T!z zseP#j^E2G31piu$O@3kGQ{9>Qd;$6rr1>t!{2CuT_XWWDRfp7KykI?kXz^{u_T2AZ z-@;kGj8Iy>lOcUyjQqK!1OHkY?0Kz+_`V8$Q-V|8$9jR|%Ng;@c%kF_!rE3w>@FtX zX1w7WkFl%Vg<mE0aAHX==DLjyxlfA}H|LVh;}qcWPd8pSE!_IUJLeGAW#ZJ?W}V7P zpVeo|`)a<#+gd}dH%l)YUA-n_Vq3*FjG1}6mE;@A5ailjH*lJaEJl*51J0)Xecn6X zz zDr~lx5`!ZJ`=>>Xb$}p-!3w;ZHtu zX@xB4PbX!J(Jl((<8K%)inh!-3o2S2sbI4%wu9-4ksI2%e=uS?Wf^Tp%(Xc&wD6lV z*DV()$lAR&##AVg__A=Zlu(o$3KE|N7ZN{X8oJhG+FYyF!(%&R@5lpCP%A|{Q1cdr>x0<+;T`^onat<6tlGfEwRR?ZgMTD-H zjWY?{Fd8=Fa6&d@0+pW9nBt-!muY@I9R>eD5nEDcU~uHUT04gH-zYB>Re+h4EX|IH zp`Ls>YJkwWD3+}DE4rC3kT-xE89^K@HsCt6-d;w*o8xIHua~||4orJ<7@4w_#C6>W z2X$&H38OoW8Y-*i=@j*yn49#_C3?@G2CLiJUDzl(6P&v`lW|=gQ&)DVrrx8Bi8I|$ z7(7`p=^Lvkz`=Cwd<0%_jn&6k_a(+@)G^D04}UylQax*l(bhJ~;SkAR2q*4>ND5nc zq*k9(R}Ijc1J8ab>%Tv{kb-4TouWfA?-r(ns#ghDW^izG3{ts{C7vHc5Mv?G;)|uX zk&Fo*xoN`OG9ZXc>9(`lpHWj~9!hI;2aa_n!Ms1i;BFHx6DS23u^D^e(Esh~H@&f}y z(=+*7I@cUGi`U{tbSUcSLK`S)VzusqEY)E$ZOokTEf2RGchpmTva?Fj! z<7{9Gt=LM|*h&PWv6Q$Td!|H`q-aMIgR&X*;kUHfv^D|AE4OcSZUQ|1imQ!A$W)pJtk z56G;0w?&iaNV@U9;X5?ZW>qP-{h@HJMt;+=PbU7_w`{R_fX>X%vnR&Zy1Q-A=7**t zTve2IO>eEKt(CHjSI7HQ(>L5B5{~lPm91fnR^dEyxsVI-wF@82$~FD@aMT%$`usqNI=ZzH0)u>@_9{U!3CDDC#xA$pYqK4r~9cc_T@$nF1yODjb{=(x^({EuO?djG1Hjb{u zm*mDO(e-o|v2tgXdy87*&xVpO-z_q)f0~-cf!)nb@t_uCict?p-L%v$_mzG`FafIV zPTvXK4l3T8wAde%otZhyiEVVU^5vF zQSR{4him-GCc-(U;tIi;qz1|Az0<4+yh6xFtqB-2%0@ z&=d_5y>5s^NQKAWu@U#IY_*&G73!iPmFkWxxEU7f9<9wnOVvSuOeQ3&&HR<>$!b%J z#8i?CuHx%la$}8}7F5-*m)iU{a7!}-m@#O}ntat&#d4eSrT1%7>Z?A-i^Y!Wi|(we z$PBfV#FtNZG8N-Ot#Y>IW@GtOfzNuAxd1%=it zDRV-dU|LP#v70b5w~fm_gPT6THi zNnEw&|Yc9u5lzTVMAL} zgj|!L&v}W(2*U^u^+-e?Tw#UiCZc2omzhOf{tJX*;i2=i=9!kS&zQN_hKQ|u7_3vo6MU0{U+h~` zckXGO+XK9{1w3Z$U%%Fw`lr7kK8PzU=8%0O8ZkW`aQLFlR4OCb^aQgGCBqu6AymXk zX!p(JDJtR`xB$j48h}&I2FJ*^LFJzJQJ0T>=z{*> zWesZ#%W?fm`?f^B^%o~Jzm|Km5$LP#d7j9a{NCv!j14axHvO<2CpidW=|o4^a|l+- zSQunLj;${`o%xrlcaXzOKp>nU)`m{LuUW!CXzbyvn;MeK#-D{Z4)+>xSC)km=&K%R zsXs3uRkta6-rggb8TyRPnquv1>wDd)C^9iN(5&CEaV9yAt zM+V+%KXhGDc1+N$UNlgofj8+aM*(F7U3=?grj%;Pd+p)U9}P3ZN`}g3`{N`bm;B(n z12q1D7}$``YQC7EOed!n5Dyj4yl~s0lptb+#IEj|!RMbC!khpBx!H-Kul(_&-Z^OS zQTSJA@LK!h^~LG@`D}sMr2VU#6K5Q?wqb7-`ct2(IirhhvXj?(?WhcNjJiPSrwL0} z8LY~0+&7<~&)J!`T>YQgy-rcn_nf+LjKGy+w+`C*L97KMD%0FWRl`y*piJz2=w=pj zxAHHdkk9d1!t#bh8Joi1hTQr#iOmt8v`N--j%JaO`oqV^tdSlzr#3 zw70~p)P8lk<4pH{_x$^i#=~E_ApdX6JpR`h{@<Y;PC#{0uBTe z1Puhl^q=DuaW}Gdak6kV5w);35im0PJ0F)Zur)CI*LXZxZQTh=4dWX}V}7mD#oMAn zbxKB7lai}G8C){LS`hn>?4eZFaEw-JoHI@K3RbP_kR{5eyuwBL_dpWR>#bo!n~DvoXvX`ZK5r|$dBp6%z$H@WZ6Pdp&(zFKGQ z2s6#ReU0WxOLti@WW7auSuyOHvVqjaD?kX;l)J8tj7XM}lmLxLvp5V|CPQrt6ep+t z>7uK|fFYALj>J%ou!I+LR-l9`z3-3+92j2G`ZQPf18rst;qXuDk-J!kLB?0_=O}*XQ5wZMn+?ZaL5MKlZie- z0aZ$*5~FFU*qGs|-}v-t5c_o-ReR@faw^*mjbMK$lzHSheO*VJY)tBVymS^5ol=ea z)W#2z8xCoh1{FGtJA+01Hwg-bx`M$L9Ex-xpy?w-lF8e*xJXS4(I^=k1zFy|V)=ll z#&yez3hRC5?@rPywJo2eOHWezUxZphm#wo`oyA-sP@|^+LV0^nzq|UJEZZM9wqa z5Y}M0Lu@0Qd%+Q=3kCSb6q4J60t_s(V|qRw^LC>UL7I`=EZ zvIO;P2n27=QJ1u;C+X)Si-P#WB#phpY3XOzK(3nEUF7ie$>sBEM3=hq+x<=giJjgS zo;Cr5uINL%4k@)X%+3xvx$Y09(?<6*BFId+399%SC)d# zk;Qp$I}Yiytxm^3rOxjmRZ@ws;VRY?6Bo&oWewe2i9Kqr1zE9AM@6+=Y|L_N^HrlT zAtfnP-P8>AF{f>iYuKV%qL81zOkq3nc!_?K7R3p$fqJ?};QPz6@V8wnGX>3%U%$m2 zdZv|X+%cD<`OLtC<>=ty&o{n-xfXae2~M-euITZY#X@O}bkw#~FMKb5vG?`!j4R_X%$ZSdwW zUA0Gy&Q_mL5zkhAadfCo(yAw1T@}MNo>`3Dwou#CMu#xQKY6Z+9H+P|!nLI;4r9@k zn~I*^*4aA(4y^5tLD+8eX;UJW;>L%RZZUBo(bc{)BDM!>l%t?jm~}eCH?OOF%ak8# z*t$YllfyBeT(9=OcEH(SHw88EOH0L1Ad%-Q`N?nqM)<`&nNrp>iEY_T%M6&U>EAv3 zMsvg1E#a__!V1E|ZuY!oIS2BOo=CCwK1oaCp#1ED_}FGP(~Xp*P5Gu(Pry_U zm{t$qF^G^0JBYrbFzPZkQ;#A63o%iwe;VR?*J^GgWxhdj|tj`^@i@R+vqQWt~^ z-dLl-Ip4D{U<;YiFjr5OUU8X^=i35CYi#j7R! zI*9do!LQrEr^g;nF`us=oR2n9ei?Gf5HRr&(G380EO+L6zJD)+aTh_<9)I^{LjLZ} z{5Jw5vHzucQ*knJ6t}Z6k+!q5a{DB-(bcN*)y?Sfete7Y}R9Lo2M|#nIDsYc({XfB!7_Db0Z99yE8PO6EzLcJGBlHe(7Q{uv zlBy7LR||NEx|QyM9N>>7{Btifb9TAq5pHQpw?LRe+n2FV<(8`=R}8{6YnASBj8x}i zYx*enFXBG6t+tmqHv!u~OC2nNWGK0K3{9zRJ(umqvwQ~VvD;nj;ihior5N$Hf@y0G z$7zrb=CbhyXSy`!vcXK-T}kisTgI$8vjbuCSe7Ev*jOqI&Pt@bOEf>WoQ!A?`UlO5 zSLDKE(-mN4a{PUu$QdGbfiC)pA}phS|A1DE(f<{Dp4kIB_1mKQ5!0fdA-K0h#_ z{qMsj@t^!n0Lq%)h3rJizin0wT_+9K>&u0%?LWm<{e4V8W$zZ1w&-v}y zY<6F2$6Xk>9v{0@K&s(jkU9B=OgZI(LyZSF)*KtvI~a5BKr_FXctaVNLD0NIIokM}S}-mCB^^Sgqo%e{4!Hp)$^S%q@ zU%d&|hkGHUKO2R6V??lfWCWOdWk74WI`xmM5fDh+hy6>+e)rG_w>_P^^G!$hSnRFy z5fMJx^0LAAgO5*2-rsN)qx$MYzi<_A=|xez#rsT9&K*RCblT2FLJvb?Uv3q^@Dg+J zQX_NaZza4dAajS!khuvt_^1dZzOZ@eLg~t02)m2+CSD=}YAaS^Y9S`iR@UcHE%+L0 zOMR~6r?0Xv#X8)cU0tpbe+kQ;ls=ZUIe2NsxqZFJQj87#g@YO%a1*^ zJZ+`ah#*3dVYZdeNNnm8=XOOc<_l-b*uh zJR8{yQJ#-FyZ!7yNxY|?GlLse1ePK!VVPytKmBwlJdG-bgTYW$3T5KinRY#^Cyu@& zd7+|b@-AC67VEHufv=r5(%_#WwEIKjZ<$JD%4!oi1XH65r$LH#nHHab{9}kwrjtf= zD}rEC65~TXt=5bg*UFLw34&*pE_(Cw2EL5Zl2i^!+*Vx+kbkT_&WhOSRB#8RInsh4 z#1MLczJE+GAHR^>8hf#zC{pJfZ>6^uGn6@eIxmZ6g_nHEjMUUfXbTH1ZgT7?La;~e zs3(&$@4FmUVw3n033!1+c9dvs&5g#a;ehO(-Z}aF{HqygqtHf=>raoWK9h7z)|DUJ zlE0#|EkzOcrAqUZF+Wd@4$y>^0eh!m{y@qv6=C zD(){00vE=5FU@Fs_KEpaAU1#$zpPJGyi0!aXI8jWaDeTW=B?*No-vfv=>`L`LDp$C zr4*vgJ5D2Scl{+M;M(#9w_7ep3HY#do?!r0{nHPd3x=;3j^*PQpXv<~Ozd9iWWlY_ zVtFYzhA<4@zzoWV-~in%6$}Hn$N;>o1-pMK+w$LaN1wA95mMI&Q6ayQO9 zTq&j)LJm4xXjRCse?rMnbm%7E#%zk!EQiZwt6gMD=U6A0&qXp%yMa(+C~^(OtJ8dH z%G1mS)K9xV9dlK>%`(o6dKK>DV07o46tBJfVxkIz#%VIv{;|)?#_}Qq(&| zd&;iIJt$|`te=bIHMpF1DJMzXKZp#7Fw5Q0MQe@;_@g$+ELRfh-UWeYy%L*A@SO^J zLlE}MRZt(zOi6yo!);4@-`i~q5OUAsac^;RpULJD(^bTLt9H{0a6nh0<)D6NS7jfB ze{x#X2FLD2deI8!#U@5$i}Wf}MzK&6lSkFy1m2c~J?s=!m}7%3UPXH_+2MnKNY)cI z(bLGQD4ju@^<+%T5O`#77fmRYxbs(7bTrFr=T@hEUIz1t#*ntFLGOz)B`J&3WQa&N zPEYQ;fDRC-nY4KN`8gp*uO@rMqDG6=_hHIX#u{TNpjYRJ9ALCl!f%ew7HeprH_I2L z6;f}G90}1x9QfwY*hxe&*o-^J#qQ6Ry%2rn=9G3*B@86`$Pk1`4Rb~}`P-8^V-x+s zB}Ne8)A3Ex29IIF2G8dGEkK^+^0PK36l3ImaSv1$@e=qklBmy~7>5IxwCD9{RFp%q ziejFT(-C>MdzgQK9#gC?iFYy~bjDcFA^%dwfTyVCk zuralB)EkA)*^8ZQd8T!ofh-tRQ#&mWFo|Y3taDm8(0=KK>xke#KPn8yLCXwq zc*)>?gGKvSK(}m0p4uL8oQ~!xRqzDRo(?wvwk^#Khr&lf9YEPLGwiZjwbu*p+mkWPmhoh0Fb(mhJEKXl+d68b6%U{E994D z3$NC=-avSg7s{si#CmtfGxsijK_oO7^V`s{?x=BsJkUR4=?e@9# z-u?V8GyQp-ANr%JpYO;3gxWS?0}zLmnTgC66NOqtf*p_09~M-|Xk6ss7$w#kdP8`n zH%UdedsMuEeS8Fq0RfN}Wz(IW%D%Tp)9owlGyx#i8YZYsxWimQ>^4ikb-?S+G;HDT zN4q1{0@|^k_h_VFRCBtku@wMa*bIQc%sKe0{X@5LceE`Uqqu7E9i9z-r}N2ypvdX1{P$*-pa$A8*~d0e5AYkh_aF|LHt7qOX>#d3QOp-iEO7Kq;+}w zb)Le}C#pfmSYYGnq$Qi4!R&T{OREvbk_;7 zHP<*B$~Qij1!9Me!@^GJE-icH=set0fF-#u5Z{JmNLny=S*9dbnU@H?OCXAr7nHQH zw?$mVH^W-Y89?MZo5&q{C2*lq}sj&-3@*&EZaAtpxiLU==S@m_PJ6boIC9+8fKz@hUDw==nNm9? z`#!-+AtyCOSDPZA)zYeB|EQ)nBq6!QI66xq*PBI~_;`fHEOor}>5jj^BQ;|-qS5}1 zRezNBpWm1bXrPw3VC_VHd z$B06#uyUhx)%6RkK2r8*_LZ3>-t5tG8Q?LU0Yy+>76dD(m|zCJ>)}9AB>y{*ftDP3 z(u8DDZd(m;TcxW-w$(vq7bL&s#U_bsIm67w{1n|y{k9Ei8Q9*8E^W0Jr@M?kBFJE< zR7Pu}#3rND;*ulO8X%sX>8ei7$^z&ZH45(C#SbEXrr3T~e`uhVobV2-@p5g9Of%!f z6?{|Pt*jW^oV0IV7V76Pd>Pcw5%?;s&<7xelwDKHz(KgGL7GL?IZO%upB+GMgBd3ReR9BS zL_FPE2>LuGcN#%&=eWWe;P=ylS9oIWY)Xu2dhNe6piyHMI#X4BFtk}C9v?B3V+zty zLFqiPB1!E%%mzSFV+n<(Rc*VbvZr)iJHu(HabSA_YxGNzh zN~O(jLq9bX41v{5C8%l%1BRh%NDH7Vx~8nuy;uCeXKo2Do{MzWQyblZsWdk>k0F~t z`~8{PWc86VJ)FDpj!nu))QgHjl7a%ArDrm#3heEHn|;W>xYCocNAqX{J(tD!)~rWu zlRPZ3i5sW;k^^%0SkgV4lypb zqKU2~tqa+!Z<)!?;*50pT&!3xJ7=7^xOO0_FGFw8ZSWlE!BYS2|hqhQT8#x zm2a$OL>CiGV&3;5-sXp>3+g+|p2NdJO>bCRs-qR(EiT&g4v@yhz(N5cU9UibBQ8wM z0gwd4VHEs(Mm@RP(Zi4$LNsH1IhR}R7c9Wd$?_+)r5@aj+!=1-`fU(vr5 z1c+GqAUKulljmu#ig5^SF#{ag10PEzO>6fMjOFM_Le>aUbw>xES_Ow|#~N%FoD{5!xir^;`L1kSb+I^f z?rJ0FZugo~sm)@2rP_8p$_*&{GcA4YyWT=!uriu+ZJ%~_OD4N%!DEtk9SCh+A!w=< z3af%$60rM%vdi%^X2mSb)ae>sk&DI_&+guIC88_Gq|I1_7q#}`9b8X zGj%idjshYiq&AuXp%CXk>zQ3d2Ce9%-?0jr%6-sX3J{*Rgrnj=nJ2`#m`TaW-13kl zS2>w8ehkYEx@ml2JPivxp zIa2l^?)!?Y*=-+jk_t;IMABQ5Uynh&LM^(QB{&VrD7^=pXNowzD9wtMkH_;`H|d0V z*rohM)wDg^EH_&~=1j1*?@~WvMG3lH=m#Btz?6d9$E*V5t~weSf4L%|H?z-^g>Fg` zI_Q+vgHOuz31?mB{v#4(aIP}^+RYU}^%XN}vX_KN=fc{lHc5;0^F2$2A+%}D=gk-) zi1qBh!1%xw*uL=ZzYWm-#W4PV(?-=hNF%1cXpWQ_m=ck1vUdTUs5d@2Jm zV8cXsVsu~*f6=_7@=1 zaV0n2`FeQ{62GMaozYS)v~i10wGoOs+Z8=g$F-6HH1qBbasAkkcZj-}MVz{%xf8`2 z1XJU;&QUY4Hf-I(AG8bX zhu~KqL}TXS6{)DhW=GFkCzMFMSf`Y00e{Gzu2wiS4zB|PczU^tjLhOJUv=i2KuFZHf-&`wi>CU0h_HUxCdaZ`s9J8|7F}9fZXg`UUL}ws7G=*n zImEd-k@tEXU?iKG#2I13*%OX#dXKTUuv1X3{*WEJS41ci+uy=>30LWCv*YfX_A2(M z9lnNAjLIzX=z;g;-=ARa<`z$x)$PYig1|#G;lnOs8-&rB2lT0#e;`EH8qZ_xNvwy7 zo_9>P@SHK(YPu*8r86f==eshYjM3yAPOHDn- zmuW04o02AGMz!S|S32(h560d(IP$;S7LIM(PC7Owwr$&XCbsQNY))+3HYS+ZcHTVq zJm;QsfA`#~_m8fwuI~DFb$@pE-h1t}*HZB7hc-CUM~x6aZ<4v9_Jr-))=El>(rphK z(@wMC$e>^o+cQ(9S+>&JfP;&KM6nff2{RNu;MqE9>L9t^lvzo^*B5>@$TG!gZlh0Z z%us8ys$1~v&&N-gPBvXl5b<#>-@lhAkg_4Ev6#R&r{ObIn=Qki&`wxR_OWj%kU_RW&w#Mxv%x zW|-sJ^jss+;xmxi8?gphNW{^HZ!xF?poe%mgZ>nwlqgvH@TrZ zad5)yJx3T|&$Afl$pkh=7bZAwBdv+tQEP=d3vE#o<&r6h+sTU$64ZZQ0e^Fu9FrnL zN-?**4ta&!+{cP=jt`w)5|dD&CP@-&*BsN#mlbUn!V*(E_gskcQ*%F#Nw#aTkp%x| z8^&g)1d!%Y+`L!Se2s_XzKfonT_BWbn}LQo#YUAx%f7L__h4Xi680GIk)s z8GHm59EYn(@4c&eAO)}0US@((t#0+rNZ680SS<=I^|Y=Yv)b<@n%L20qu7N%V1-k1 z*oxpOj$ZAc>L6T)SZX?Pyr#}Q?B`7ZlBrE1fHHx_Au{q9@ zLxwPOf>*Gtfv6-GYOcT^ZJ7RGEJTVXN=5(;{;{xAV3n`q1Z-USkK626;atcu%dTHU zBewQwrpcZkKoR(iF;fVev&D;m9q)URqvKP*eF9J=A?~0=jn3=_&80vhfBp?6@KUpgyS`kBk(S0@X5Xf%a~?#4Ct5nMB9q~)LP<`G#T-eA z+)6cl1H-2uMP=u<=saDj*;pOggb2(NJO^pW8O<6u^?*eiqn7h)w9{D`TrE1~k?Xuo z(r%NIhw3kcTHS%9nbff>-jK1k^~zr8kypQJ6W+?dkY7YS`Nm z5i;Q23ZpJw(F7|e?)Tm~1bL9IUKx6GC*JpUa_Y00Xs5nyxGmS~b{ zR!(TzwMuC%bB8&O->J82?@C|9V)#i3Aziv7?3Z5}d|0eTTLj*W3?I32?02>Eg=#{> zpAO;KQmA}fx?}j`@@DX-pp6{-YkYY81dkYQ(_B88^-J#rKVh8Wys-;z)LlPu{B)0m zeZr=9{@6=7mrjShh~-=rU}n&B%a7qs1JL_nBa>kJFQ8elV=2!WY1B5t2M5GD5lt|f zSAvTgLUv#8^>CX}cM(i(>(-)dxz;iDvWw5O!)c5)TBoWp3$>3rUI=pH9D1ffeIOUW zDbYx}+)$*+`hT}j226{;=*3(uc*ge(HQpTHM4iD&r<=JVc1(gCy}hK%<(6)^`uY4>Tj6rIHYB zqW5UAzpdS!34#jL;{)Fw{QUgJ~=w`e>PHMsnS1TcIXXHZ&3M~eK5l>Xu zKsoFCd%;X@qk#m-fefH;((&?Y9grF{Al#55A3~L5YF0plJ;G=;Tr^+W-7|6IO;Q+8 z(jAXq$ayf;ZkMZ4(*w?Oh@p8LhC6=8??!%@V(e}%*>fW^Gdn|qZVyvHhcn;7nP7e; z13!D$^-?^#x*6d1)88ft06hVZh%m4w`xR?!cnzuoOj(g9mdE2vbKT@RghJ)XOPj{9 z@)8!#=HRJvG=jDJ77XND;cYsC=CszC!<6GUC=XLuTJ&-QRa~EvJ1rk2+G!*oQJ-rv zDyHVZ{iQN$*5is?dNbqV8|qhc*O15)HGG)f2t9s^Qf|=^iI?0K-Y1iTdr3g=GJp?V z$xZiigo(pndUv;n1xV1r5+5qPf#vQQWw3m&pRT>G&vF( zUfKIQg9%G;R`*OdO#O;nP4o+BElMgmKt<>DmKO1)S$&&!q6#4HnU4||lxfMa-543{ zkyJ+ohEfq{OG3{kZszURE;Rw$%Q;egRKJ%zsVcXx!KIO0*3MFBx83sD=dDVsvc17i zIOZuEaaI~q`@!AR{gEL#Iw}zQpS$K6i&omY2n94@a^sD@tQSO(dA(npgkPs7kGm>;j?$Ia@Q-Xnzz?(tgpkA6VBPNX zE?K%$+e~B{@o>S+P?h6K=XP;caQ=3)I{@ZMNDz)9J2T#5m#h9nXd*33TEH^v7|~i) zeYctF*06eX)*0e{xXaPT!my1$Xq>KPJakJto3xnuT&z zSaL8NwRUFm?&xIMwA~gt4hc3=hAde#vDjQ!I)@;V<9h2YOvi-XzleP!g4blZm|$iV zF%c3G8Cs;FH8|zEczqGSY%F54h`$P_VsmJ6TaXRLc8lSf`Sv%s%6<4+;Wbs-3lya( z=9I>I%97Y~G945O48YaAq6ENPUs%EJvyC! zM4jMgJj}r~@D;cdaQ-j#`5zCRku}42aI<>CgraXuKDr19db~#|@UyM;f-uc!(KDsu z5EA@CsN>^t@oH+0!SALi;ud>`P5mQta+Lh*-#RHJ)Gin%>EaFLSoU`(TG7c|yeFvl zk|Yll%)h-*%WoI6M*j+4xw`OqiDVX{k-^V2{rzCIM9mzNHGP^D={!*P7T)%yDSI5- zkGA4}r3`)#Vl6JFJ3xG)8K;FTtII9o7jNHof_Z_Zc<%@-H4RPpyXudpf)ky zmTH$LFGxaIUGQ;l=>R>?+>ZSCU|@&+Gt@5Bj3w{L{KPpgQ<~)jqx0oNZSv9R&^A42 zzqJr?C#D-n>=9FjM=D=7h_$QO$KQ8*%0%)rI(Npai_JjE9_lBk75BQMI zkk4X5PATWgrub!fb5Hxi8{(Y<(GOO8^HECOA)eanyS{u%leQOkp;1W}_8eH?nPQxW zd#Z+uJfTK>g-TR3WPu~2Ru9A+NkuIICM@PyPmJn(GBZt;xFZNDMbw8`xzl2`(?UC- z#<*=*fo{UOvycb|b&4y0Nm!sHhFMI*Y$Olgh;BG#xBU+yxav82Ejj(ZvQ|64Wwy7I zN=DXx7(V^NTH3YRB4HOu6T5=DW86P`L#Ng!SuT{%&>Cq8>|o8lF^^U%MRU41TT?h& z!uJ$YdbM*2y?#`LJ2)XPoKq`hm$I3R{V5-;@u7!E9tH4sR(`Ab-Qh!|UN-a5fZ?P@2LWRvSv!hOk08;Yy!h&uEI-X}j+&v`X` zkqY%*F@{}DHL*Jgjg2}a54hwEV`63bK4>mL%D^YT|>m1-kX{876BRm&`Y#{$&oz($qWJL}T*tj42k+yu8fa=4b7VUPq()Wb~=L?DU0U-4*Iu^KMZBRByWn-@=_f(4){Or#| zpw}~Ajs6a=z!8_H59lqYlfnS77QY0pHpIz0#)}!EGhypupZeZe@%cv z6Dngnl*SsUy^a`v?>lARi6Yps@%32JpGQvrcd*A8LPLEInBEU2vriGvMqG!jh^=Gj zXvu5zpikqnt*e4&Un_e$2FAB?(yOS0JAzxh@nN?Blqc-)Pv`U}&E5|# z)97-9utpqi*`hR+$;eS)A+KK)CO)V`b?*}z&*+28mDfWI31)sF)tBg6LVlxS z225poL+O|x)5;skkj{rew<}TsDVqFMMLSgd;UK7^clMcObM~IgSq6!eJ($JP!KHPr zBJ&SHi{wLsgMzn1^#kV#_!NO@RG@B5lxBO7WfIAi@o`{_XQg(*{R=@Z(0ij+*i7sK zW5D%_fRN7l6qpytW2K1lUqP&W5jDT!AA9@q<;M!T=CKv*^MP)Er_uLL+Y53>**w7Y zQ!2?^4$wC;Soc!+#~d?Yec;NLdR z{~*hrSQS>UOMBe)1pHe0EsyO@d(IrU4ZiS&jL`wqv6Oqv=HbI^70qu9kn~wGkNL^> z!Pd2)i--+&zp^`#4@*Myg;3r(jt*h@RWgRt70byZr;0Na8n4!bmpuX1&gK=QK!@j< zH2fF7@2s0H0!9%VC-BIp(99@e@<%Ko?BB9uv*xPnZ5dQr z8r7~9cZXv(AZPY^<(X@}GARv&_}mfYA7`vdl=)g2GIyN(<}(b_S_N2--NKp$SgO<3 zRx|EabcjUSB44GaH3Kxmx3SW;E;Eia2Zs5SkbkQ8E%VQqr0J?tQjF~p;nbIXn+D;? zg;t3Jg7A@9U**@aaqs}9;%??Scm{zBIY2ceYAQd*W-hB-!+H&4#yrm*GtT*&#`FXx zGIVm}G<;Pj+h*KQ68S4rcIIGw-mkl039s@O4p9F%TC&&&xRL=N49v2PdBb$MxJoMo zQk8+Sv+F5m{xP1prZvn1=x-Q z&Yox|y&arZrLTm~<%o}VfPV#z+i&{)W5emXhx^g~8>eUe)|Vvwp8-x8d-MOj%@mSk zZ9i{-Hu8m-rfO##y(_Rv;Y@?6%h4Id#6%`7ah+IaQ13o7o>bG&ScMj&KO~QoCmNT6()+oo%B zugV3Da)t>unQq=tbD)FP{JmB~S5QCmb)lq9Fp(*|(UGeXr3kR?k35sKFs{{a*y+h0anA_K@iCi;BR6nFmKHC=@)rMmu=XWS1nVqD*=#${cFJ6<{e=U7!Rbg>Y0b~d#&viX+5m9aNAv=RAMt8=n6a&@t^|2LsKMR7xF z;Cmw>t0<=W2II;doX`p#bcjPV9z&3dhAObzcB9xXMslqr(y!P6+2kG>Eh!rx&ZKmW)Wk~_xh`?neJqVhJk~1eTvRF#ehRwpS>s1{vUx*qf&Jm z$)Wh|lmwYatW@U@*$<14>^|yYwmwFs)C5ke9hG42{gilSU#^ulO`M}`wJ_4*-3 zGb?hfQj_AGQBI?4ghGijqfu>uAYkLK#!^uGUXuctdn8Ae5I7}o+j{9MJiM|sf9Nc{ zuP&Ls@?rMe=IfJo!=iX?9&*4!Yjs5d?0Yx4cIFXrkSHRk17Fc@yM__fyFLLl6O9nT zQqaDXunH;!PpQ7+-&#wJVtJXl8LjIkh)5qmcqhErYrP31w5~#!tS{LYTWGKEtbpE%(hH>qV(!2KMfs#a z?ZzzbDB}(7+NWIiSBQ<_{3>;H;z}uZI;n2PKWJNxM=l;5-^zpu-}+1x|38lS-}6GX z6F=M~bUtHg98X@of>mgCH-&5g6UpXGAla<+g`b&MQANW6D^;zfSzq0mQ)*J%;&tPOYin?J*G7GqmQ=>jvWvOn6E?! z{$(CU7}zChEnl$(>xf`ZdeF2E9Bv=eH&T4HWAOQ!9gBs z{gl^|(78q-ioBS^rR2PEGZLe_4Rl**H(bB?84RHquCEKi8N#29u=Eoh(DV`ZX{+8< z3BIX<`sOFNBziFWS#-X%(e`0C_|Q8;Pw9izjNOF8h|kvmWCmDHM&pANC9MV<wEJ;W{-jXqm!zC+Y@Q1y_lLL zfV^(1{A;L%TWmyI)RPknVUB<4r+d42S(W=%bXd@YB(~d>ABq-E;t)ie6%ouy(Fg`p zuj<=I7^PDs5H+UsG}+GH}zoGt*{yKF&n23C7aW@ z4ydrRtFW-uuAUu@RWe&0c!N4!H;`!n@@t#u zxlGQB4rx(F7#&MKHPy}EI;d+l(G{1KG!ZBE)7)@P!AsUCCCb0IH!P5TW=GoNFcif`NB4en16Cp<7=fhz7^uQAjbJBH>@naf2ueMktmtZ|U|)ICDMN2r`mgMSl=qDwHL;}L-d~El>pf8UJRts_03eTj*hVy6H z5o!>?AcffORZq9!NJNa`-W4wMfe6I{3*rYUhIMA>y|T}KZ56HR5XEs{(|x#SDtP@N z5?12L0W7qfvWl8T-V+u=fkBH8!$}g)7hRs34m7~)^S&Ar zd`Kz7$S2Mz(|5H(Dwn$V7n8K2pqhHQ8!i{G4C~Y6_Ex&Y%EyXdw#Nj}VdG`XCN_1n zFg4;3DGjjUo$%=m@ui%z$JU66QK^qywvLKZpD6ZQ2Ve2VBps8rcvJ6^Cf^#H4?UQ5PW$4;b)55yIY9}@k@48RLtJa>7bofX{EUE7 z?0Cx0PeYbbLAelC-BfqHf_08;{lzC1kwr|a>5{O6*g<~wt6KYPfP5uW0w?VTO!M~Q z6H@n{cONp`{>hVjEIkOV6m^ZP^l;mGz=T&*5&`m84astyZ#XZ6CpH384tt%vSJ zsvYDC5u`D&U_u)1OJ&D2=F*ie-7!%N+V6*qoM6m-zj|}hDZ+@?`mJ10OX3K-`+R0m zNk$^+zBJK7%It=_&sIc}&DT>!LYU{|WPNrp-Nfly8u5&3@(l{!pcPxek3^{L`<9*! zE-0KukkD^^+<&3BNJM$e0=~B$=VQEp@V`L+PsUEL-_%+E_kyR-_mUjr|D1Z2J->y2 zZNHTrzP$=uEKQvy4DG&+4*o5^8Kd?eI>5S#b;NXlSrGVnj3~e^OLe4*Qe7%U#4WiX z)k7h@VHRERR_j{wp8ALHdD6bj&+Dl^?2(MuL9*oTRUI3SQ2jJ4x#!GR~b8F(H6|clt%g_O=v(@*;;5eW{e)CsR{UNDIE{C-1@qe z7NY&S7DeI4?z7tR9LJ$e6za%qLsF(>%M?m1nQQ4htpl?P)yj7_C#Ds5k5F z1h@YlI%a#k9x6}=hs(mkRr-fSrmikEk)Iv6D`S==)-dDVbNK;4F@J7iC(M!K6l<^lm@iXKpYbd7b{_0BDjc9ju~tFH7Qfcgu>A9~3tzmbFnXbS(pWES9955Vbu=iI zX>GH$kbD_?_fRojp{~Mz+%=%RHG!3l(wxQb{zQlW&MTlbr2*9|peUBo#YZ8u!UMPz zJo9lmW3isPrkErmxp&SA4Z4vpe~LLL-w6JUW}f*bf#w6lVyDvUhdK9fX!p#TT3fL+ z7im|;28gcWM)UdfRI;603BWd`d%7#sP0t)qNW*R*WmrD?hg37Zngmu{P;Lm`rlK_> zITGMQH~V(}6l6}TeG5nPEHYI3EHiY}TD%AAQ@%&*Q@w}lLp!VC>E;PCjzgVyNqNmA zYd0t~-pn55?#)1Tc-(xbL07m;Md14bPJOLyoRpLhRx-BtH{Z%<78P>0$olxWy4d9! zncKIDHrWFnBRUUqc`qiz@xrz52u-?2kq~5n$h}&*K?MxJ?xV?vVXvLErROVl7L9s; zedsv`#k1PCWY;`{${N?=R9%uy1P+jKf$&__RLHP zWVH#4;U{}bB4D^B*hm%nhRpQF{4?xW$&|oNp2CUE?Coyj1QI%P|w91%+*lty%ecgZ$I1|mJWq9_c?+4{KElHR%TIU zf+^4^hXY?f0&(|Q5=NG~AhiIVR+(a1gF)Q;L&vH%zPO{yydKt*(f#LehU3CVRIS&* zA1khb+xXe{29|Ggayz;nqv9M8n$JYj?Z!w0Sb}^lq#XQlg~=nkBhYxmlB{huZcL}F zA6sNZgJpJ|laA>P$V#ZhT+&$nvNM2sudEEeUaohc#ab+sC zrj7G)E-#;G-w=I1hTjN@b;lAjX40pR+<>)=n`V_!(JFk*yE zP3nDEs^C9DCSbs8`TV~U17Bmq%9I^$2xWK;N>;W~^^HOu)jQt*LH(-WD@UyR?lk$o z+mZhVgYn<1!ov1;W|rozPKN*0V#Xxdelr-6M$Gf?*Y~BQbHRK-&@B;ni(p_#pe0mg z(1pQKcH#lqe^P^eZVUta>(kWOPSnhH^E-oKtcJzCI^FSuJ zze(PI3_%VP4Fp7k#GyT8c6l?vndL`$$s5Z05+P==upnazJ>&{eIc?MW6fVO34pXfm zmmilQmRYtQ*e*BV>J{aqI%F$j*;=Tdx{msYgM{2Gd`D^TU>~NLKrbqtQDh6KPGcB& zYEY{fj~P1Q zY_vIx8j+W?nOTo{k7|A!vvlK?qYKZnTkm@qV7lWQf#;J@)(qh~m07vHwdQ@701t>}N2> zYt=Q^?p;5oP%enrkvLCarS2rlJ;zjT@1)Ha_28t7T(IMcZi3U?D_dTzMKnR%{b7 zXeWL6f-xfJvhsVNF_?I2^3gmv=2|f7azO~wc+o|=2cR+N_<9sF;vio2z;vtlV7U6o z%q9XNPhjS1Fv)QuRq|0#HVGw&HG!!t0wQo=W>hP)uYZ7o;_qdM=-*`k-Z%4+>VGZ; z{vGL`lv&#q*NFJmy`%{yAIPrAB%*freDk*5cHaNPB~B86YH zIw9gNDz9H+n0&}J-c0V{E(`My-2Nkt0NBY-PjL5r*s48D&j)h7pIpJUb+0ol1F*~` zp1!}vw0*&IA^z*SXZ}pIG9;ySrW01 zpU6d%LB2t@(;)LD!*G(DXK-!R!}Bp1mKS>Uu`^#p z>~WR%dn&;>iuz9Pv3W7EPX~GtnCg$63a-#A$1B7q;ZqH{xws^Pf-V1eO|D zHXE9qC~c)%CS>n>jc?m)ux2hN2UpKIU2hP(X}`Ljjc|CDFH%asVJH&6j5&Rb6aaVeQvSt z6VIX1X(pXAmxL>}wO&QIImzI9LcFhECJ|Mzi1FWhCgS$=^!!D3^vyEEY0HM0>?fsv zz1W(i8*H{v9APY$IW@J9NQ06Y@g$&STTrPC$I1{t0ptDZ=rHjEZnN2BSw{(Pn+6KD zRZ-hjn-KgzRa=ZoUs=W0cAc-}66Rmi)kZgub$G6zPQn>fM&}9X6!J^UsbVFdewj#M zt5erf{g$1$WV`h=0<2Y%iDK|HwH6hSu-8LDPknW`jl$UfmI_z9=GkC(@A$oVsRFl` zMYdksp797E2vzaH-N_%;t@q4}Z;FxZ(y&6&(#;_uzaGV+M%CB= zVNRMN3tj1#%##v%wdYNDfy0)|Q$>JYJ8-6o*K4hcC(;5F=_Mn-l)y@UX$ zt$YU7Q%o3cqwRC6;{vbL1No%d&)=)2$$;SD9a-=PfFh$6P1;*I*d z?C_52JLp$(UF}SCxJXTY+9?uE`@f35}k=i`#4Rk6e@*KDc^(tnQcw(jY^fcG z2hqo(q%7)o0YkX;lCq$o6hgCi3n%i#6vZ7x&_k#aW{QnPk2CWm8yVytzz-Xd_05x& zK3Vo>SFs-R)cf&`{&tL=xJVe`-HvE7&mAL^uj`W z%$d@~HtC6RV)R6}b6PqR$Pa7R8c3d_D4Hqq2NfG(>kTi!rOp%>Lc~n3!5mddW>>pR zt8tmTCxnr(Xk6g2^MqN08AmxcFLP;APA}^V80R_+K#agUx(RR48L2ZQej@XRm?OF3 z&jyIH+L2f<&wdR}X$XB~;2tBIf^AThY(zLA4*i6@9FdbT!Xy~7Ywt-zdi=wCIRuOL z73^T>|0wMU6&500dh%`EqjoMKS;Z+_5iFfnaLNy+B-@vyNWRdcmRaaBUdtQvT_Q17 zTG$aE4SA0iRA}+d@r;k~BwsTn@=r*;LgW8Q~>>Y9oke1Rm(xx!gv){TQFv|25IK_jjLj z_mxH%0-WoyI`)361H|?QVmz7;GfF~EKrTLxMMI`-GF&@Hdq@W!)mBLYniN*qL^iti)BMVHlCJ}6zkOoinJYolUHu!*(WoxKrxmw=1b&YHkFD)8! zM;5~XMl=~kcaLx%$51-XsJ|ZRi6_Vf{D(Kj(u!%R1@wR#`p!%eut#IkZ5eam1QVDF zeNm0!33OmxQ-rjGle>qhyZSvRfes@dC-*e=DD1-j%<$^~4@~AX+5w^Fr{RWL>EbUCcyC%19 z80kOZqZF0@@NNNxjXGN=X>Rfr=1-1OqLD8_LYcQ)$D0 zV4WKz{1eB#jUTU&+IVkxw9Vyx)#iM-{jY_uPY4CEH31MFZZ~+5I%9#6yIyZ(4^4b7 zd{2DvP>-bt9Zlo!MXFM`^@N?@*lM^n=7fmew%Uyz9numNyV{-J;~}``lz9~V9iX8` z1DJAS$ejyK(rPP!r43N(R`R%ay*Te2|MStOXlu&Na7^P-<-+VzRB!bKslVU1OQf;{WQ`}Nd5KDyDEr#7tB zKtpT2-pRh5N~}mdm+@1$<>dYcykdY94tDg4K3xZc?hfwps&VU*3x3>0ejY84MrKTz zQ{<&^lPi{*BCN1_IJ9e@#jCL4n*C;8Tt?+Z>1o$dPh;zywNm4zZ1UtJ&GccwZJcU+H_f@wLdeXfw(8tbE1{K>*X1 ze|9e`K}`)B-$3R$3=j~{{~fvi8H)b}WB$K`vRX}B{oC8@Q;vD8m+>zOv_w97-C}Uj zptN+8q@q-LOlVX|;3^J}OeiCg+1@1BuKe?*R`;8het}DM`|J7FjbK{KPdR!d6w7gD zO|GN!pO4!|Ja2BdXFKwKz}M{Eij2`urapNFP7&kZ!q)E5`811 z_Xf}teCb0lglZkv5g>#=E`*vPgFJd8W}fRPjC0QX=#7PkG2!}>Ei<<9g7{H%jpH%S zJNstSm;lCYoh_D}h>cSujzZYlE0NZj#!l_S$(^EB6S*%@gGHuW z<5$tex}v$HdO|{DmAY=PLn(L+V+MbIN)>nEdB)ISqMDSL{2W?aqO72SCCq${V`~Ze z#PFWr7?X~=08GVa5;MFqMPt$8e*-l$h* zw=_VR1PeIc$LXTeIf3X3_-JoIXLftZMg?JDcnctMTH0aJ`DvU{k}B1JrU(TEqa_F zPLhu~YI`*APCk%*IhBESX!*CLEKTI9vSD9IXLof$a4mLTe?Vowa0cRAGP!J;D)JC( z@n)MB^41Iari`eok4q+2rg;mKqmb)1b@CJ3gf$t{z;o0q4BPVPz_N!Zk0p~iR_&9f ztG4r5U0Fq~2siVlw3h6YEBh_KpiMbas0wAX_B{@z&V@{(7jze4fqf#OP(qSuE|aca zaMu)GD18I+Lq0`_7yC7Vbd44}0`E=pyfUq3poQ-ajw^kZ+BT=gnh{h>him533v+o7 zuI18YU5ZPG>90kTxI(#aFOh~_37&3NK|h?(K7M8_22UIYl$5*-E7X9K++N?J5X3@O z2ym8Yrt5Zekk;S{f3llyqQi)F-ZAq;PkePNF=?`k(ibbbYq)OsFBkC7^H7nb6&bhDx~F#muc#-a(ymv|)2@4)NQw!cgZ|NLJ@N6o#y!T* zi0kdtK#GC8e7m#SA9pSuiE5bOKs^ox%=l6KBL?8Rl;8R~V>7UCaz+Y_hEOZ^fT}$m{$;GJt9$l$m3ax6_ro{OH@r z8LmGIt2C9tM6fNUD<(Y1Q8w(aN2t@VPrjc;dLp9756VNLt9&>pX!L*6kyU=uui9e7 zrQ^&h7Nuk|fa1WH?@{DNg}C&i2BPX$%)+AMi%-ImT2Q_QnRV)3UbO2JW7T-JYoYnU!(}tii1LAN|D(%7cL@IEI0mCT0!t|kd)1KahVC2K z|9L76JA1F#-=|{!eJcN|r2bI={kK#3M*^rokSGIa zWe@gc$gT&!Q!WYqGHNy3PlhBvcjf&X0o_R>a?DGQ`e|uWa)>YuWk(ibM6r_Xpiaq4 zWtcFh6k&ih==f(%+T$`L1EYJ^CeevsviNKGK3iUF&1QI!EZOR4y2d?z{kh!@hfoR4 zR$n!oTq-{w^eSf-ckrX)rp`@DG4(8%e{AtoKlwoHjNIX8hY>P;3y*y_O8XZ8ien=J zQR{%EX3|XA79>Al$+8(rw$Y~9ydiaH!@*{;*H_Weng(B+tJe^@Hh~lm^J?rL_`0$g z%o51AI)M5AP4)R##rWU8U-|zQ>N#rK?x?C*TS+B3tQmUYjh6X32PBq4xJ`|D)tg%M zLwd8z7?Ds5CNhvE8H^bY$XD*~ke$yZo!3P40jio4f0GcqUohXX>C;+gOt>>PizdRd z?{b{G8+tZA!Aj6GmXFD*thAzMDL!h{90}jI=PdjS093DQi3v@l|5~^hKrwR6 zeUbcTjhPDLUg*ao;c>8JN}wB>MOIE^vN22t5147OVW>!BTDvz4xeP$B({i(Po~_BL z9*#5s@;l~%7S3?WkF0}E8>iN+UQZh{-D}3F##`x$+YG@H0vyyD%vY!zsJHcnGrN|& z;j<&E%0i6kwaMT{tjp$m5^V4*+9;13^DDjgaFvvOe3=j2hWU3(PY)kFXvfx#EJF(V zM!l@%;xJuF3pERftbWw~WnR$A&ok4UQ0dISRjNi-j7>!WdGm0^FUmns_uy2DYX1!< zihag3z-a%BI*WE?er9_UTY_Eui-R>cvS1;=N#Bv{mPKKIv5O9iXS- z3|WAAOhFjGB1il&5F9vj6Vm!t99VnZ6v)$mKW$!I)_=41msTtDQ`CAV`azZw#(aSt z5XK052F(2mTOy|hb~KaAM@(Gg9l3=rqXB79Zp!Q>)*)Hhm(8O3s53@BCx_ltYRV=o ztb3!SE4UlbZadeiDcr2NZnT1}MNd0Au}VRHKQ!`nW(2!sPW5ulYI zosR$tFs@ul-q2)^z}}Y;3$Jj4J#kik5ou3xxf)_JL$5C!E%MDFH5fza9unrHXXw5F zHY#AcZSU73&;sy;y;fM_*p0Txd{DmQVYSyT(8Bu@vSLZAPKlVDd&6%bHj%HaV1{=L z91uK99)#H)!*Q6S`Dv))pyUoDkMa0Sllw7Fvb!iKKjbR3>q-@zp>$lcNLt4(&F9yk z!g!~88ulk{z2xgG-3{{il~#8wah-S$PDsv)h$4v?e@iEW{%JRU21>lL%fw8~(DT#^ zywKIPee|O;<3lWQL$hEWAUeA2)~-xA7yV(I(Pe55DMTFD&6fP6bS3JXHE& ze2nS2pMh>pdB%}#XYcS*N|SMQmQ2J&7WZu72OP zj&wXEJHG2^_XZLJUco>yC|q(0L~1fPN+}|}7%$xcp-i$$kXV=D`~$(T`2Y)+8U2yu zvr%Mzd~RzcUfF#X_+uh&RV1fO9P&C;yFTuW5sb%e_xPYEB%AgtaOJ(ztnLEW_Hao2 zZHV-;f-^2epH zxn#@~NOA z11ZBV6tw5T5>Iz^Jb)0%OIlra;qJl^ufG156Ui{A2$qpZ_{^c1^R`+fbi*WT%;He@ zyieltZ{6ivdgz6i=@iEldc;jVS!5E5$rymBrD?v#K?Mr`?ocG-n&lL`@;sMYaM2m6 z)Tt641KSaR_(MIZi0J-0r(53x)8LPvfBwp-{yFxkKiTU)pdB)FGjC~7AfTS_$=v_Y z*Z#MJ`R|V^X!eb+h*>&0yC}OF{rl;vioX)<^+YRtY&IVpwZx%m(G%kbE0AM%G$dMnxO@9U~x`$qY-b?f@fkQ`9pNJeiFRud6ZB~-h_kWX>mCgONAn%y8FDS z1jJ5f3AGpr111cNW(=njoJxN_XIF;t1dO^e0km*ZO?76yVM(*B>Ix?cT=nC+o2XP$ zo!&hK$H9sd8H07(XoY2&7QG(*iL;qrs4U*82`MFg4P0Dzw%rEFXuGLBslk;D|Cf}sL{Bdj9TpChAGEEN*DvCLV(j_N-e zcLNc98=ZJ>3?UluoPSL2QwygpEHOrNp?KEVT77e1i3zzY%Y9lStpis{$m zm(cz{%HDxH)4xj^O$Qy@?AW%`NjkP|cWgVkW81cE+qP}nZ)X0p&N}nVoOeCvGhF+3 z?b@|#SADRMCTILsR4>rrHy4AU0PJ{|)~M^(@q-e3hLdj7_}OdzCb7?6jvhyQy!)3Gv3ELg)6!VjwA<}NC@GK%{NI0 zJT}T#aRk{>TXHs_T?t5eRw>v2ntXC6^p*jkWo`a)WZ0?8&JFWArnx^e@#->FsW0`H zaG;x(iE*;8ugY6Nhw%)c!hpKUyX3jhGA*i6J6@(fUBPL$z{4dz!^d6OL#hN?41I+g z!KjR5!+yZ+z+Y#U0p;s{fV{jmnQyy>%`Eu5GUWo&fsZL97=D~-b_O#00NQ+zO>XS` z6cn1v6jGixMb@=ItgwK*pbiAms3``uBok32wSnIF!(VPSH!Aca2(cTt_k_R zo!iTIMT0nvu%dfM`Tm^UEy_oqiKOy5hANU5*kqB?bbwBoz>e&)X{#5b+bFeY#FB}p zj#JFe|1ix8(itqE%U8Oe9{8p+lmPB#ITX?HhA~WU^`aMeLagZ?{J#$k1(<*Ga=!-# z(r?kozXS&T@4ut}e53yWT>JmB5K8z*I`ZXC(_u$bUyRSI0_sa;;}c3a_~)8{7*#4- z*hR0l-h`v$GUX!Y8S$OAGx`t7Oh5c~5aXowl-+DBh(YT4|& zz2Q~Iz2(b(#FdLc$(X>h-N-=%K&sS{-j3KfIshl~vZ(yd@zZNg`=RANO&IW5GfVZE zs6mU)V!n_RSxggdO;6lhUb4T6hUvzQ$bXz{bZkC4QCxql0E>+~jH^F@J~OC%bQSnw z!dVcM*I_fSE>Yp7Ty9TQ8VjoGh>2rpcziKFwP#ZBOnF7Eb+fb#57*n=S;keHfwc zH49H*3q*cDponQrD`v$M1l5b=n=zY6HiA!3d-3ZhDZ+LzKN9kDW#xrc^yy*`$5>{c zL~=_5`{q}NdlgOp5;!td)>hv&2umQuUJip0G-qJ0O^3tqXGdqmn}Z9DTz4j33Oh6* zRs?8e!2wbIsGfGP{9#WZD|RF{E86KJLEy$vz9KuntCBzNS(>A~j5a$SlK;1USU4_S zB~S;>^=U+8Kqh5?r+Nbfvr>prvVolf25hJ>p9%wx5ew2uyC4l%vXv}jkoT5T@NOml z^@+(g=Fks#f9@XKR3CWI`oEWac$gIO`*&M%ga!iQ{=d%2|J9ZRjEt@AzT>j~_r7Ge zrikzvS+U<-JIh%phK;}dvq;P%#NIq@*-Ro zG795&jLHtK3kt@gsFnVb^geyY&Q#0!O5NK<5l`92U6zg)2z^ixqqM;dD69k{pn5na zjzCXM7%i#qTM&x#D|7;Cs8qI%RB+HS5}ROsznNr@l{c2b$1$=!oSc;%3db4qHN!gG z%>$rEZM~8pIiTEB<|bT*mBLb{tT1uWu6OFJ)KF7(hj^P2rs5QyMx#q_*|BJuoXwJv zyh%!-X{q#YM`heA8Hj!57>5|U9qR_sVak1r z2ZH_d(s!DNqIuDZc5gkw(w^h@n7~LZ82aCz6|aG^n5bXeTCFdW z7m@2Ej5B%8MSD2HAr*BPh~b^9^;NJ~HXJJX7VeGl(#=!DS?r0mNIH^}d}=~&Ui+B^ z_wm)B4@6oIZ9FP|3#qxxW6-_;>b*pN_iexjXi=h}e`(krgGC?N9fbTnyYPYIO6K}B zFA_P-suUrOEb6b`R1i9SkQ*s2Jb7^Y-tOTodB9(}j@~WUg#QJE`jW#~0+;?p-Oyv- zf|?tPS8>)50*6Qh^}EqVu&_nQ+F^C-IvX6tCg-UDYg3UXsv^pjsXxyJD>pVkh$z=?hWh9Cyd8bJRGUUU{A@XK zEFVF%XrUA0yYJ(VcELR{+rh(`Av6SI^lRD?z)AQ$gLvakWpQF`_zp{aqZKUt@U1H2uD*qV*seS(QQ2Dy-oc-O8X zMKUd~h#|T^-6H}`fk?iJx;2kI2$Jj;QIf6%C{vhRVjqTvaHy7Wq*g(r%|c-3w(n|C zr9N;Rs9JfUDeCWJFL}uP;Y0FDf(Wy};!IZ2zFjeU(d+_6MEJlaX*p=3D!D0b>op*k zuYr23N1W0wly8w74c#W1LpXP|?)nWr(3eXs$E(c&PiERe!JWE^z0mm5cg@7F`_!@X za8nQpF$jOM+JDY~nb?BoW=-xIQ22c3TFS?M{R<~rPg$le_1#FXz85*d|IS}UP|x1z z+ey;M%HGW3JB?4_`{vKeW ztvEN4bJui=CcnsQr$FVybke#RDpaIHY{GaczId-A9x@ zD;Gi-lJ9Iau-2o;`eV1*3ztzN3!P`Jxrc)3ocRRAct^jD5E<^lS-Z2}IFL)oUQ<%h z4?B_#BP>07`M}`7ywGkk}UQpFIOvRZx*v_~StXIsHv% zk|F{D@%%dlD`92rZ1oTF`=>D~IOsVT{euA~R8PKHPL!_>)`|SN9}+Q?LbiX7V;y|` zxRlL>%Ik$H(5Pr(Mxx>JnH-I0{je|Ff^ zz-BM|Nl%;W&QA{{-tTu0O+e~5f#GiJBzZraC7MNqDOlr?|LhqN(b;MvwI7GKiU~0K z{eT373oTRU0c$+Rhw4@XlTr&~#ma@bzsx0Wj}{NwfD$q4FH;&|U+$&78LfwdW8CyW z;OP%PLaqA+xw`)8&GY!c(BaeeC9Brzjgx$h5BNTOB+6D5tkg^CsI*KLgPcM%ya0vp zbV@C>a?WQSn!)u=q#cuPB(|i9nbp{($Sdf>!kHiclcaabX4aUu7DhI!LxJ!}0zu6Q zTOuR4jCzAp4HQB~$lx0-I*OxW?+7`C+)yPz2LhTJcEWDtrjrKPGYcx7JOz5>Fq1BbCwdcc~)V(_dWb^W^Cg+d`E znHou4u_BxEZ#{w1)X2Kp1f&31bB$h<4(gDTg@SKrHdbYIH!LCpjoWx$m6H?^Rn_?n zQtIMb-Te>usVOR~oBNm|$%EuM-Al$LI7T(caHlUC_)EwIwb_}nTuQcJOCTkj73b`fRMv9KQcH|un^M#jXkC}A*2{;)>XL4t%9j;TE~jj=;kQxkt|4?2+jG$ zO>MA4Ihwb3fs%0QJ?(xri>|+HFKQwe~VKVDLRp+kcn%p&_N|cAcOg@pMI36hxJ}`pdX&g37 z;cjX3*$bO0ZP)WGjS+*#9BPg-k|%%ld(u(z6#Rs)CdDq3v`;~(3yzuCIThvMSR?)N8k)5*zG&`Z5~4mo5!kDs8X%#wWG=BAOu>f;BBx)i={ZF2%pg&8u9OHu$RwHWi(Zrnb_F!S4}H4Pemup{B?g&x zU#uE<^xzLw!p;7LfV$qJaB~})?F?0goeb3_q^thbL^rZUwm(m}&9u{(G_k#^JTnZ# z?ls#Ol&@v+(`?BLI#?e_JDXMXZ{(A&w5)*9@rU$xbIzoJK{+Kq$9~gGf?d^9H95ge z9~bmk_TQ;pQR=n`mb-!up;6q>rJg5h&~DXGOL10ZCpZElV9+NXAe{ z(U{+>WGl-7n9_cB;esbv`zQd5PGDmtwrS6_?5O|j?f&4!=Swn)P&{DTRm#Q z?lZCaTsQRukADw>9hvymR@=x9j+`A^;gGe7opW<)l3(+nJ@lsz+RXHLf8DN7;}xZk z?qsC(lwIfrLNr`%cX`j&a39Sp*W&E5ABI{ZAa5xsdUx~eii8JeRZF~w%iTbC#CrAF z-f(##d2g%O_TH()d(?*AHm2=rhVJdR;EgIyP9gikuT_JX+bTqZK_f(F?2|1`kjc^R zBzDQ!BZWG%cOfa7HvQaL{Ub@Sf-hnaA$2DxLI5WNxlEM_Y{{$4dSJMYh7u9pnQdxV z4jn2yc%eOWUGmF0IvlC|>3K7RbP86le>*$oQf1o9Hu$U5W?FiyW4x15Ke~2{<~fNTN9&{nZ5ltn)|0&e(%8lU!5}Jn=P4>{Wc_V#@<*& z#iR_5lKis*QVSbHPz*U4gh7_7OW&h{zBrzGiDu1}dlO-OKldzv6xfgM1;iJBv)(xV zL*nOH>}C4e_pM>gMOIgr7fA9zY$T{1XY4SU7$v!*x(F28!b*5-sBQdSve9%p&6M3A zoF)u_&hxDVt(HQi+d30wc#%MI?O*#P7A-(aDiQVoVBc|#+G2bKX3W9;9o8 zD4HbHZV4&TIV&gj0z6v7AXq7b^MENIMn!!BR-tnjn>8c7k|S+hdv8|W%?0CbQ$7B2 z*nZ5BW(Fd9tQJwZVVWzfGE-5!b%f6Gtb7t<-@dIT#=TMz3ERX_;%e*+5i3(E=Fe|ao}{&(4(W{aQ4Aoc)ELdd z5xg&)DFQ19QdauMEM#(&`Aef|XP5yeP7=4gf8P)3_V6z`))+>cj3Zt1W8V+5k z6@?Vs07*I%!{dvD{3k3PvAAMT~6`Iim@M4XaO_%YOCvyx_aZ#OE zEoQCTV=MOnIy3QCDFvy%ko~6YBp3`2U{rdbr*BHVsIz1!_!-at!VxNhO7NC`mw*3v z`Ttu;@xSWcS?XvTO7%Eu&JIN?8S!yGelAjipZZjjL?kL>E`1=KPegVn$cd#Q3 zmrT=BIxi`@g_jH)Xa+_?g2hpyNK%m(2OB8!%k?+{0(O|w)+-aJ*9?afapdUc!Kzrs z{bs76WLj({R!@J8BMHvCo3*s0;2pzhzGX)r8;v!#bHTvh^<3+|+&~E$E|kdCik&Q* zvXm9N43@#(!o=hFvr%fQ&OT-!rqBw$jx?HZJdVPlcdD=K;SDr6uCWgM^>3>bYYyzD zw(m$e)>4rAZ2TKb((Vb1@C$)B zlGwcqUCU-rWbV8uqUIsl`VCcnOj-itFqI_2Vd=!Iq?jNi9x#_YHyx#bWu>p$(+<#3 zm8~w;gB*jg_f08pzm}{qhFqd*D)ma%t4`7=-7rq(#5?lpDE3t^qTn!nJd{~h0E~E- zRQR>Q81&d@rddwej@!YvrbA+RoMKfi;I-d?R$U8^y^k3xwU)Hbm+Y+5OD;`JOia_@ z@eFpvBey;1Twd9l*KHO!*;QK5)5hjZ6$t;DMfiE(0a6m5?s6M|m_vXC)Q4Fs9sn_y zI!or%?trl8Gt;p&}Jf;`yVHP@rsXhgAkueW}cmxLXHXddup{SVk z>^B@F*hxOnbBoJ8BbZ4}yNfh{NlUbMcb;7pL3x^mNLtFPzQXori=YGCNI{)ZAZ2Ki zs3qvR(7N>3nl%-R(nxn9g25ba>ww@!Zk2n&Ba}d16bhv_#ER1_5xYp4v>EZSD=SiN zawHYv%hwEpP%wK16R};MR@m~tu!hMb+v9EDkD&DX5wQI`eh`K1)O`&W>qHzi z!b-DJ&}vPMc~072@*LfJeLTEC`v}F87}68vWOcpLQ|U|l0V(wYixZ*=QHzP%b48F5 zDzkei^(!En6E0%9u}ZGpvth=98Ab7vbAkWtt0*l8ho~bKg&k)N)D{X)Sw;9K%Rymb9ZkXRbICW~F^rHlD@gHfrM)$z@z z$hD#^b4Oa|U>c*}O;;{gCD0tASCj@XM=^K~@*b&A(W9HhBW7}y*>zs`L6&b(Numk+ z?}W2dTTY-k=m`2Mn)4HUL~E6!TYM-44baeHe*R4+@g^O;S2E_999y!?b&i{oCw2p8XKj8~?@*s%WZ!JnBS*(vHBdP{u*jZ;&mPhgW- z$TymUXpLsqmETA3RIEm7PvM~#n2jc{hcz=P?u0)H3}EOmNcTzyZTDabzVJS};Lw~R z^_n%#OhfmE{M47|-{~Pe!$80aEMfivs=~;(cxH+gPUI*ZYK)Fs^CUuPfB%5wwKIf`Er>NFR$wv_^&lqkC2)JPA$tSp%^o25 zAg&XPxP;|y!~aPnY+-Z{-RB5sI)^EdId1W3Ryen*fIbqnZ*#ViWDj((OR4xJM)(;? z@Cf4i$TZxF!ziNG;)MR>mr=gWYsSqO1fHC|%#CXi%S_NF)#i?IVU?g9jGmIR0)3Bq z;tln(pGsuhYpC|QPZ-M*8&b?$?(Qip*nJ?akUU7FF0*UvGnI!R3f3ehEjPhPEH4?iI+hc$O*6CpeI~ z4Sg%6ZtDeiGX3M@Xb0VgXkGxN8nJgs*k=MrN#I7+%!m&e>Y)R!$GXr{Ox1#dMkdI= zlKCh%&BnMT;qlKbqHxO{`^lO_0%GE1Wrg?yydI<3s6he$-Lq$K9S~S3G^v4nX^Z) zB1xZCP}vgY{yApKcg{ysSWd~`b){kFXX{Ue7MRxdIp*Pn%tWiA;G zK}!DfOQSN$&ZWcr5-u-l7x|fv7&wHK*XJt#+uRJnB2FM~@^XCA<8EU7^5gaHgUsjK zVOWSyGNZpfk~vg>rhqFct7@kb;0^O2Xsel9!;mh_$I zaKvjBu*O_)8H>OOS4ydd6g-9Aa_$Ws${Ws6Fz0|USEkulnyRswYM|urnEWUey-5v< zK|YioRQPd{ip*!92N>e3y5>A+Nv3n4toNold<;@)Cpa-}o{A3jKdb?O!_ZABIy-wA ztzaL_l_MAt9Aem+gcuy}HD3IYtK{aB*hzTjXq&0A@uXRXv^;8|0?@Am=!pbiG=C5N zM)McoW~TRnVW3NZq1KJj+xK2C;;K|}6aa~;Hr(bM#K7Rt=}86*!4%lv7!SYq>1?b! zoj=E)44db=!=F?h3B5g#AL`+B*zeH*a^T`<+KZ^BuwjR)kT#^@EDMz<=4WrL{?JQL z(Midu5k`G6nx|MAl2Y&qGSM%%J)+Yw(FWm|z4fu4I z{{3wjNT2C$ql;!i*H5F{3gKU*q?bZrK0;+SlBwYIPElp%gqUQ} zu~PZr#qYvYE(y1#z$@vrcmgY2xRG0o>lUpzY=8Rxlo4QAjRJzT;NnCL<(mUbSdA4= ztVE89jFFMl`L#!Zg%3PXupV$V{iK<4bVwi2|NAg#!f#s}|6Tho-?jh$0}cQ0{CR|dmG3a^sq@LvxXZ)+3$dF}+2P(mIEWS<*7dvo6~{*oVgRl! zQj7D|**X2unoU|<->1K~fm%Nsb}uww1XK5 zPTkQf9B`IX6+xXBtW=vbHP=GNFEGLjjx=4n!T8k>P0Dxgg)8?1odzkeL#&YQ#Ot0b z=PB19V^dl>CF9vFxxuNE`{qHrf083@(u~2?E+QAb|ND4Ak^;V`^p(&%y!)wtA0#DI~1sjPy=Gl=Jk_LKV+s!Y^j?t@%~H!tX2)H zm{hZ!i~RL`v`e690}D)}3FD}V(vmxXyhY%K5Guq{_Mv9?v2lT{bOWg4Zu^7y1ar8n zmAHd)JADf~14}K&Kd>r_R}_x(PBD?%GkD@IDUklYfy|?y1BVdi#9312{)remsr!-H zjW0tu#v*ygyWbLt^s5_5MkpYWOUgiCwk>cCafD`_APTvKBz%WJjzlS-G2A*dS)qkQzz504s~eJE&!(*U_>0mr$HykbwGNoNWwCEjL=c7M*D!Nb`PH zx2NPxryn>XZ%|N7#-LQKLHw1-kG_2=QJ2=JLW=C*nydd_?z&Q5N}%86-u%7SV*Gb- z@Bf(i5)`(qXJx-{k|yJdb?lP{@*FHb*?$CWe>MafB>S6?GqJ~&cUG(*a1pK4j zcf{!2#D*VPQ_jByclkm!s~C_7tTThdil^s=WdwIgp0IA$=lH>9hCTx z5Xr)>@*R|x(DjaQ$DHV74NS`Whn+KWt~fSy84>OBxriMf6kUU4Q-kS1l88`oJ;U37 zBQ0WgFx`l;cSai&{i2YGMjA#*3na}+e^znG8aHDsy4bZf z{#LURLOT3~vp8(Iz0R{4 z(_8XLA)?)amfcWVTsCQ-sSBOwSm)13fLBY`sl!Db%2|ifT=q zA}^pepW;deI;)PQ&|m^3N#3nC$*tDKC&*TfWst8|sxfW&I?b{?nN`JNk9Ca(mhRwR z;e*YDD(uF0O__g-j`;qano_bd|GzAsI+Vubzr}$(&aq;>^uHkxZUTeJ#UKKb;6ZDm zXJ;v)Dg@N3+lUox9T)|rNJr_O>1gvqMG~O-x)ZQ{39k$k* zrcOGGtVyrDyF9^lp_*9wqZg(DHLU6pbt5$?+x}t^@`ZWLSOY9S8qUS0f_DMG--u2U zVVx5|fL}q@Sl3A;632wqbUjvV!&-8wpc7-pG>olAC=&9uR9P+aLa{6Tryv9JHBdyU z`QqpdCu5x$noe5^wes^G-+w6U9@E!NDHQLKi5hO!OIh=Gi{cttNKdQZov`>`$0}qW zwz3-)$gk3`583rGJ_}20tDDcVxc&m|+f<1AbLy?n*OZa;*e5mRaNf1g%?~}~d-9qg z)YnEg7G_l=&u9@fFIBKaalRbC<3=@@*feY>lRsNADQ15TvdRTJZ<)eCYVPqzdL=Ef zN5(>Vd%-(d`|e!KyLWUEG);_E!J-fhAOl=zUcrgVX1&hj`Zz+wvF9Oz%X4gGuONcH z%h?(;os*+5gzz&rd5$4ULvA`P^W&(9fPMjG4QPG?KhaXi@O6O|U0j#gaaIq8)g2TV zw^p{f?V!a@N*#6eiN&o9wm34rAKw#f?N|a+zzc!gN;w?_aaFF$hD3`u9UipKy2=a?eobQF_M*REf$ zj;+{$jx7^GXy!mmwnHMf3B}G*11Dl+ur+U$HV>=|*rWme??d4H)D^+~34-e<&T4fK z9ektGZMEA`+wEVx>}pcQ8=?b3U&4M_&cEw^b7&G~t`IahA*>38X=Dd9PK+d+v5AchxFfgIsaho z3^g-d&4HLt@zfMHx9?onm0BKMiye@&M25!d0|j0nObOP+ni%+TRkv7Sys6+6#71_3 z=3c}|gh*XvU|-!JP`?&KXx|m7=3b=XOQhwATD=v29v@f&3!tGPuaC{Nnek)Hkat;U z8D}L&CC7!O1(_;b_eTUDwOd6z&YPOQpDHX}OEqX&rqBLxbi6Y+6raWRuS~FCMLRMt z&#=5pIeXB!uFvv)dfz7vM;+QgV~i`G1D= z-T1{F=Svc>DCY7thwMnMEmQWBpxlHg7sL~EN*8FEl-J$-QY%K%J<1cYy3$KV zG+EM%8p|KXJPMwGyQmer(9LR9MVP?GkZ=w}PhCJq%Z)LsM&!Gw6`W|6YLt|VXVknn zG+d8xv`&o*XpcrIyO?E>GlQ59W6fo)hgdm&!us+gk&~Z(xzd@ocd|b&VXN{1iqTsr*tppm%|xZev}kgETo?Ip)PrPEKQ`fJY27Z?+iQ zPb+`K9I8RYFXR$~Ml+_RwfhqjPI$G<^2eQukio^mMUAfca=8^`P$}-3av))0#reBX zJO?KRoQN}PfKy6EWE<${E5oA4psTIXI5R3P!`afUEO#@F#cW6?SdJ)pjcBxn{HXms zby#DnxcBA!a)&`0rbZD2SYTN$P0#hKE_J>aS6t>Fk>J=OkHFT(x{~rHi3m`WL<=kn zYqLhsunHC_IFkJ)nD=}RTK!-#DyN3zk?9q}WQ|y1rKvmlPWbjHi7UlXup~E2|PJyPAGVueL7){V%z~!0G zXAH|iVbtT<`S2``Tz}5WNHpQkL-$|7{gJQRQ z{~K-@lS>`6>%9heUPf-y_RL%GwF=+XQ~OK*X5E^AVS9Hz$Yi?j*y$}A5lRJRSrKl( z3QcA!z)W=;sR?}0Mz~&?X z!oKp_GaPNka5j@l=_W8i_Ofa*C=4c}Wn{Tg&f#Kv>KXE-R$KfXiUCcU6VXc% z=8i?pTr4YAqN+|9NHN6(T6PSGByZO+A&`CaMYXfh0S?fVLF)`1*NWI$0?QTU>kd1; zGzWn5_-2B({Gn)x14cpGBq|78lCZr3xPjhMM!`-370O&|EV~3vDVO@igfR9m|9LnF``CmprMnO!UW=7QAFV7bZS z&97u9G63r&&SVh|)l9V;7LLGCY8;X~D^VDNon%jj$@1u7VD2c4OvIF-u>sc%Ihq#3{;M1c1{1p*hfy2MCQDBv0zVR>fl{I|lfOf;-g+=$^M zq0Rs#+yN#^6GhBtw92LZA^WH9cMTdqHT|aKv9`5>skD<(_o8oU-&XLEN{BSkLfhlzuyX9QH{N}qaK6~?EU{Kz zFf*F$WS+nvgybofAOzsSJB2OZAEG_m7vlWn+^D;_jaN7gg(HGtYw~px zw}w`idAI|sf^=i2^*GKT7v~wW-*+2JZJYOB6^uJwuw86RE7aIFD9F(*S)1|L=(x*R zBloIwb9(ht1|YF%8f9femH5?zGAQAwWo zyqo4TV2R=B`U<5m8wAeMHEHpWnOW5wp)I$xr(kkl)R;Oi0isun=y}c-l7LZ7m;lm$ z$q4Iy6Sc&$7dUfcx*n3=`*`*UR zN1JtLOUYS-=7UaFQks;9^B@e^CN+Pz{Jd$gh_F`j>;ZkK-Md1}-@#73aDFjIwBy*d zTlwKK`nqGu3$(>F?Ap8A?q4y9mka`bxGNnAlZNNKWA&(V)8YwF5nmp7j%ul`_QG%4 zaeXBNd7~ytMg3#Xf>6W<>tYbEa%-$6=;P^Sh>aUHZ+e~0RG)Xi3%`rEs8MS8uYqwNdw4SWVkOjZaf` zG5VfUUiPoOG}N6 z<{qp@h!mly6=>7I?*}czyF3Y!CUIt=0}iD^XE&VrDA?Dp@(yuX{qsEJgb&Q}SNvXl zg?HrA?!MH-r4JN!Af3G9!#Qn(6l%OCA`)Ef2g8*M)Z!C4?WMK9NKh2jRTsnTgfut9 zpcZ7xAHd%`iq|80efZ31m3pN9wwBIl#Hqv=X)1r?($L>(#BR+)^)pSgbo+7#q<^S1nr$1&0=q$@M&POX?y?3L&3X z!%^Atu025LgEZ~|-)Cd0=o8K9A{$sT;SHj3M?l{!Er;st5w=T=K2^hJ<$(>&P!j2m zy3~(Qm?r5vh*EGKNLnP31{fhbiIU~c2GX_wqmM}ik7)NF$bEYKH^bK?MD+uJ24Qa=6~Fg-o!gSX*ZYoo{fzTLs$371<;7oLD|PiS3s zz;aIW1HVCV2r*#r`V-0hw_!s4!G4R|L@`u_;)KA?o(p8@$&bkWXV*taO%NC3k? zok=*KA5vswZe|5QOQd*4kD7Db^c|__5C;&|S5MvKdkPtu)vo}DGqDpc097%52V*z( zXp%Esq4?Rzj53SE6hKu;Xc!&LMZPPIj;O-Gnpq&!&u5db7Xi z64ox137#@4w5it68EPn<8RO48KG_2>?+Aa}Qo7fR%&wXJNf2J;Kwm6Opddsyx$gY# zU+b%y*{cBju|sw!wOcY_sMFWX9(C02d(;_YQh1*sH9?j$%`tKJyd(j0PtK#D+KLHI zL;b*n{CZ7IBb}MUGdG3l2vFGJn3TOYJD$Hz2OOy*%!5a{!!0mvok+e+N zaP?Ndm;SO(8-v%yvu#Rr;qFSgZrKJxV^uEnX@L(r4)dZeyh@yRqoi@3M|#Hz`hHN6 zA|8#&oFv8+1F8t(#j1%Ywdn%N2uREt;@bFAF}2zeI2KE&uZr$?-SIwKu<5ThXn_}f z`@RRcJ!3;pKi>mQe)VU5;c)zA@b#dd(J?}$sg0K5L^fIm8%TV4|>Q?qdfMwAh4AM8l8J|tiSF32B4q`!TYj_z!4Lowq99lipY?vlC zJssf0Vy+@In|fg`2sUl$wDGr$XY+4g*%PhDjM^G!Z{H44gwY-ymOqXka)G3ulfWdY ztNvx4oW*}=5^&NGhiS)Vzwb4;K`^*tjj8h$esujKb7&}?V_cU5kQElGgCL<358O^% zcT-EwP>hqb1%_8C_5R4e#7RH zp@tA$bVGG}q@TDR#-_^YT6}Zo5~p_5P%C_pRxwhgkor!;FtNFF#cncoEHm=#?xtY0 z1dHK{(;)5CQJ`0upxdRV?(5PH{JISW%d+@v8FmbTh9n5TXGnM`Cs}{(AbDxaIg&O2 zg<~{fKtj#r91u9PujPqhkFt7tid?IZ={dML<$3sh;A*Hw=VP++12;lVguAyio!na#kaYeX{|8h3_;g*K=UEf zU*{ZR($$Bw*(h;CSO4{alBraU^)52&nxLKUxg=1N5MCBUJ+3a^`9#f?7=4#`&oz?k zoz-#s4C)f8Uk@S*VF!Uc>X}9M`_*gkn0&GI2R*j zUlHUy5b;rLro3?bBLIt%dRd~2lT@kjcfY~OL5ZmTl)ExZyt!)^K#1p>U~rdclk``e z>=zHu6Qp^z%nX2U*RE14f{$U0*Cf)LfBz-c)t%iD%3wxsgHpRPvieqZgEC0IX_Vkd zxh27*KXpXxYD=^PP&EtX{NlX zC%v9)Wz6De((qH}Jqg-g`mwJ!IZ^L?eE2PE9@#9U0T>jD%e^K8-Phz7cZ-bP zU%h91CvGtNYmE{gk=tex+96fK^!I7P7YI3Ma}h)ty%NEN zn}d&kVV1DM4tPht`B!poikUOE396Uy+VE|E*eQuq zoT8M0M&bcREYOX7Q)F5+d!xec;2;H!WO+!r;v#uo402OEt*q%vj)mC@8wg}HO02G( zYG=<5*Vgl3R(5)N@{y+rvBY9CgUHeN`qQLm*3;$@Ez|2z2j3@V_m6j4Kc{5MTf}GG zMS_qp%5n(5$y|Ke#!!7w$4KKAJmhA@sJLcoS}Mv+l^X$2DS9H)ezLP0LfVpNMIPwL2U@Y%%7Q7jPXmGSPlRwa7*y~EkqObIDtyFm)q z-D~m~?At^+db`FvO2uEi2FuK@`RaSN*`T%G!}yA5f-hG1SYtty+Q}}`O^In~cgi>l z=zXVDDNVH?QHtgup3*d46+OEicA^)pIn2`}B}8}{g`msSbzzvq5zHCIjU>OrtmbrG zU26iOxr*A6%_LC(|3nH@ef$16q%glnTl}ob+(w=A9Uk48Pe(F^%ktv(oHC2Ve4|TE zc6J5le1ZqXdLP~+(UY@`Y?r~{B6_Alh8Q{OmhufQSf94*GFtAi(lV<=!6wqxL;jck zOnpR+=HK3Nh}Vv}%LXPzn;0b#^5Afk3y&G)X}NEkE`~TM%tU-P1@^=msCxOyP!IRO zBegW5wZ@10CM!9*_|kF~ZSxrk>r^zyCL|dy9$~*`OX?>1)fL1l(|lW|G!``CEq!N$ zMM)W~G2zDb6wA#)D5OmIMu_&UH_5B%DJ#NKl#R!?QVz>y5jLrK(-JpI6LIGVyD%W9 zg+7;cE40;Rcv9 zkCrUgZ-H}IaC=aY8~7*9+Ny?O=Ep;yso*#-SesEGSa3T&e&DQ`k!p#Zgb<6@KRjgn zG+Z?LoNstww}#+R`Y(?d>>GG^ncorkoKX@REYSTD zQTYHMwNiE~9MM(>u%!3KVR=O=by_thqeFR&Bm;D|lW@>^unOrb^k9yd-=S2LH0S7} z>ae^bwruKEB*7m=)u$5MIo(`)Y+RR5o>9(DDDV623UMVck1##|b`7H%yjK9unoDGkVIKrG*dvN;2S3P_9>ckR6c?7n{s5v!i;dE&<_aDaPA_ zi>Z&SHW^bWYJr-2sb7{WC|0k-a}7>k3)*YgZora(7dVnK7b6?Y7U|>t*u=-aLgC3` zvnz>+QQ_%r^ePEJA5X6^`Ey@^#{dDW(QZr*A_L9Y+QI4?xFXAQ-JDe?&YmeAVN{2b zK0DO+&S-fQWDg`ab0$mQodAEemrA3p{cHbqx{yVqz5Ns6)Rixse^k(i5spvs@22QF zAhsD~>)rC%n(#M+D1!s?DFCBTRfNF~`N7kC8by+1samiHH9dbid%Masz0;p`l^GuF z)taCc0FD9!#^qP3B`G>vZA2db%ma*@6WNWW{*kPq^|f^R%Ee|F-FM69H)u|#Qt{qt zoi{%@b&~<}!vBf99Ef=ih~RNSh2LT6zvdLf+KCi=hu6#d5v7kpppM&Z;F3;`{0FxW z@#nY=LnIjx1?~XD?48~y)>Y&odjWF%6G64~A_3<{rx6>R zqF2ozPyJzzmcF+3AQwJQ@C?KEo|5k3xP%;^ZN*zpQBm5ho(*e)*zn8NzzzG6V?5V0 z2<7tkys|TInay6or7^K(y0ZdwJz|6$blXL}SX7s2es~5{gYwS3d>6k|3V9vz-#G3! zh@|-B?^JP~seJrS$&XAfp`RknZ!pFw@e!a9WgKijDz3K#6@`ifTCWHTa}Tr}n!~;0 zh0~X4_sEKGZZ^}8+X9!T7NazNv{%@nJgpJ8M;Oa zaYo_2Qbk6_j7W15!`+XKC!`+_)IGZ>r6X=buKUkQ*5wXs5}A2D@eYvF0{q(=wm znxEYB{>rdO75{|gy2>`^UB!(y+9acVVRieAMG@Lhf)g>yr+Ccgf8oy1qUO@L$n8@A z;nKV>muW=<*rD@Su=A?nhxTpx>?1>jYOk(ytb|TNwq8q1{;WERaWZi0ov0xFjiIm} z)PkKhn`#2CSuR?p?4)9Vk#`#oL)#q8!B*j3s+x*6kQ~2Pog{K^{k(=xfv{IP9MecW zCB_bMVE;HQS12k5L;tHHjhJ8m%07IN<1N(vQCG+8IilmMo{g$Y5nrPhSx`OH03*55 z;^!ZP!KR|h3~K&8O?uAqKie(}FOYVMt}S-M;FF6%#pX@C<8P!jbk&G&a^_Oj+^2Ys z*1tnnx4eOpd*hgE$xD+(iTw1TaGNs=4*;Pf#P`fd%_%)Jk|eeooma)pR9ka)Ek(PX zq2N$R8sio=D*TQ0BaO+M*8wF-0cR8Bq6vZjr?NAFhjQ!V_)x?Yxmhd9T8#bPWJ^p2 zVbs{=P2C~;GV>Zlkw%u3?OM9&TE|2xMT@t3uSiNEt`MOO*Q>52Wh>pfXJR}YW6XQ{ zJfCN%^ZlJU=RD7Ip3^zMKT-4Q8#0faYOd#r>yK58)sH5XCS>Yj%p1^_p%gSNX4Iai z%;dio52O@`qrWD0>K#6CJvdGFcB%`pA47@W5qIzGe`HRY=O5CK4bZvl6IkJj{#%r? z|A5O4Uo8)Ng;t9f!sRAIsl1a8=TST_Vn(m0i`>XCa0r`>YP-LwxB%^wu8;8+GdQv( zG^usXB?ocI0_)y0MR`T!?Us5ehia8>M~+$sXlUCRovE--QR@;Ys?Ozq9P(Q7ZQ43> zpIo}_{z39UhS{5f8wKSDu+TKfi+#n{O-~4Uk zh*EmSxYYrfwOxCYV}}!zL%2uIc%Oe$XRV@rFeWeka?;Z(XI{}`X?HJGyIgFm@ZX;w zsc2~^A%MTLdqhpoV!jr)}36>dv>Px$jJImpFCzVcs)1b7l%&=qcE;^ zEoSbtk#6sYkpC=iQX(3 z5EUP%LDh0p49U2=$~DIZhi;dDRKwLN8`|PiC-Echa#PXZ|6)S}wWEA@3f!rX>G_!A zphhlmxu@3JVRr3xOWD}*UYv04{*WHt*vT;0@pVLmuu52Mb_Vg9Wg9EUuA2 zl8?Jv5GSU+*{PO$tBpirns`>?!VL-cX@gZO&q)OL%2_8U)8r*4jrGrH`p2zV!T-&| zaf{j)uCI!{A{R9~aJ?$SZ?kk?jfE7FM%1sOCd&S0B(^ckufHtAOetsuspYrqyZ)x8Z8=dG=GG1lcFtKmoxl{>m zAakHGc|f5ZKh>>}F8qu)Y29d2Op+uf?qK|dKPwE!pPkfGl#Sa#?TmJfv}jA5;1`#= zQqplM=!3^!2QZeCx7wu8uWl9!IN85^zrmqGDxsj;TVs=EU)ubiDaD<*@ss- zm%Y-l)9@TN+_0W7Ml5XnEz>_ep>fFIL{5V-n#cCKFhy#0p;!@D!D-=e{(8;*$#2G- z-~F3cHNv>%;D819xg3-F_yHg8bD1W}{1-kQ-da2kMRP?r=@>BD^b5H6=`Lf3y6VPn$`%)-GW}O^kSon7EBP;q9?=n_7O67v9pc>!pQb z)auPuaqG5v3l(E)_GSI_vFY2BtlPgw{(hIMip%d;>9vWnej@q%qMva4iRPI|N7n7w z(!_tL^K*((d428fyiU(eFYzyaICWGnFx_T^a$3(A4p<5kwVtGjOSNa=ey z3;wiIDZDmghb8BsMcSVyT9^W#{YkoGJ9As)0ccff5 zB`U1^TKO@jql!utGX7_6ceT=$mJTWcQ+7_Fk7=jIE7Lu2Ja%~~6K=X$o@5Q7)=`Ao z%Vptz#p~F$l82kO>0*a`LQ8HomkN}$Q0{w8GzfUMX3_$LbiUMT6?eJhshLtmT2m`2 zrK@zuUt8C6$2Zb?u5HM~2xm~H)s1rOJ^3v#{cdG~?xM<+6Lrd(chPMthvmtIcgJoV z-(H!YsUD=t^F)QFU+e|WYBXo`#ht!`&flPI?tga}(nLX13WI~;V?XO(57wx&_pbkw zBgcA$g+wx2w|Xvakrlw=n~x7nWeO7*SwR2(p1`8M*~Ae34SZ&}#$zt|Z%!C%XpOXbpLFv5`sjlu|+#!Pgo9FXG>J~QZn(O%YH zBWQs46dZC)E;!SviJp zefD-koJ?SaKCq_$3t)wALZM_9CQK zGw9iXX^iWLHTQFmME^y==>muB0FYBWAg>aJ#z};63aHSV~ z^&BI1Xx6m%m3k8-P|$7QUIaSpT%uDW?OD?BB+n%~l7+?9t%+Q~hX?=}`?8pcPE~ed z2_t~uEm#W0-QN{N#+ApD+=zZSaBm3ob`3@h+u^Gh4ttNN2s$sX!nzuwp?JOsGoHwj z2@l5>ME8YD3`fUA=$RfY>9hSG4D8@onJ^lTK8T>xz1g7`#v+8NaNr$;IubZHjA0js z2L>_#pi_KLjIjbU(W!eWi-1dyWY}RDad&1C;~9SzVCP+CjBSB%W;hBDGdrDHyErp5 z5X#cSZWs?oRzdJKA&bh!#B=h>1`ELv5fGsjM;8grEB_Ml5nw!Q?T_Fy!`b1Xw-Oi& zJK7`IPZ8{}^QU`YChTvFFb$*GF~83#Ejd(!t%MOOCWZs*(#FDY@nJtyM5ys3r$RH; zGwY5D3&8G^h`_zm90;)SqJ))TM><4FJcR=#j{NChP1sZn(R`H3fhIePF<1&VWkIAq zW^y3K#-asQg8eTLr4LygD9v;SEK4^GSPFI-K%^#fIhF$V7sl;-&O{IvfwyiWBC85G z7MZzT=Na3;D)1g*L}lf9j#XxMO|l*@z#B0U0n~;6Q((CogEzq;QX^ml3_auK-QH(! zYRlFYydetV8<%jvXTLoPZWwqE2_hCzy1W?cwt!a;Ak6maMa=Kjv3M;3Tu%5uArNL? z-SSL!&nS5679sOBE+%t6kqdtVcsdc$>26x21CM6sb)#h-?QyJ literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..a4b4429 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..2fe81a7 --- /dev/null +++ b/gradlew @@ -0,0 +1,183 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..9109989 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,103 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..35c664f --- /dev/null +++ b/settings.gradle @@ -0,0 +1,10 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user manual at https://docs.gradle.org/6.3/userguide/multi_project_builds.html + */ + +rootProject.name = 'praktikum01' diff --git a/src/main/java/ch/zhaw/ads/AnyServer.java b/src/main/java/ch/zhaw/ads/AnyServer.java new file mode 100644 index 0000000..5ded317 --- /dev/null +++ b/src/main/java/ch/zhaw/ads/AnyServer.java @@ -0,0 +1,20 @@ +/** + * AnyServer -- Praktikum Experimentierkasten -- ADS + * + * @author E. Mumprecht + * @version 1.0 -- Geruest fuer irgendeinen Server + */ +package ch.zhaw.ads; + +public class AnyServer implements CommandExecutor { + + //----- Dies implementiert das CommandExecutor Interface. + @Override + public String execute(String command) { + StringBuffer result = new StringBuffer(100); + result.append("Die Eingabe war \""); + result.append(command); + result.append("\"\n"); + return result.toString(); + } +}//AnyServer diff --git a/src/main/java/ch/zhaw/ads/CommandExecutor.java b/src/main/java/ch/zhaw/ads/CommandExecutor.java new file mode 100644 index 0000000..d1ab883 --- /dev/null +++ b/src/main/java/ch/zhaw/ads/CommandExecutor.java @@ -0,0 +1,21 @@ +/** + * CommandExecutor -- Praktikum Experimentierkasten -- SW3 Dieses Interface muss + * von jedem Server implementiert werden. + * + * @author E. Mumprecht + * @version 1.0 -- Geruest fuer irgendeinen Server + * @version 1.1 -- K. Rege Fehlerueckgabe hinzugefuegt + */ +package ch.zhaw.ads; + +public interface CommandExecutor { + + /** + * execute -- nimmt eine Kommandozeile, tut irgendetwas gescheites, und + * berichtet das Resultat. + * + * @param command Kommandozeile + * @return Resultat, ueblicherweise eine oder mehrere Zeilen. + */ + String execute(String command) throws Exception; +}//interface CommandExecutor \ No newline at end of file diff --git a/src/main/java/ch/zhaw/ads/ExBox.java b/src/main/java/ch/zhaw/ads/ExBox.java new file mode 100644 index 0000000..1623b8f --- /dev/null +++ b/src/main/java/ch/zhaw/ads/ExBox.java @@ -0,0 +1,18 @@ +/** + * @author K. Rege + * @version 1.0 -- Experimentierkasten + */ +package ch.zhaw.ads; + +import java.awt.*; +import java.io.*; +import java.awt.event.*; + +public class ExBox { + + public static void main(String[] args) throws Exception { + ExBoxFrame f = new ExBoxFrame(); + f.setLocationRelativeTo(null); + f.setVisible(true); + } +} diff --git a/src/main/java/ch/zhaw/ads/ExBoxFrame.java b/src/main/java/ch/zhaw/ads/ExBoxFrame.java new file mode 100644 index 0000000..972a109 --- /dev/null +++ b/src/main/java/ch/zhaw/ads/ExBoxFrame.java @@ -0,0 +1,314 @@ +/** + * @(#)ExBoxFrame.java + * + * JFC ExBox application + * + * @author K.Rege + * @version 1.00 2014/2/3 + * @version 1.01 2016/8/2 + * @version 2.00 2017/8/30 Test + * @version 2.01 2018/2/5 AutoScale + * @version 2d.02 2018/2/5 Reconnect (inspired by S. Kunz) + */ + +package ch.zhaw.ads; + + +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import java.io.*; +import java.util.*; + +import org.junit.runner.JUnitCore; +import org.junit.runner.Result; +import org.junit.runner.notification.Failure; +import org.junit.runner.notification.RunListener; +import org.junit.runner.Description; + + +public class ExBoxFrame extends JFrame implements ActionListener, ItemListener { + private static double SCALE = 1; + private JMenuItem connect, open, test, textView, graphicView; + private JButton enter; + private JTextField arguments; + private JCheckBox reconnect; + private JComboBox history; + private JTextArea output; + private JScrollPane scrollPane; + private CommandExecutor command; + private boolean graphicOn; + private GraphicPanel graphic; + private String lastServer; + + public static void setFontSize(int size) { + Set keySet = UIManager.getLookAndFeelDefaults().keySet(); + Object[] keys = keySet.toArray(new Object[keySet.size()]); + for (Object key : keys) { + if (key != null && key.toString().toLowerCase().contains("font")) { + Font font = UIManager.getDefaults().getFont(key); + if (font != null) { + font = font.deriveFont((float) size); + UIManager.put(key, font); + } + } + } + } + + private void initMenu() { + JMenuBar menuBar = new JMenuBar(); + JMenu menuFile = new JMenu(); + JMenuItem menuFileExit = new JMenuItem(); + menuFile.setText("File"); + menuFileExit.setText("Exit"); + + // Add action listener.for the menu button + menuFileExit.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ExBoxFrame.this.windowClosed(); + } + }); + + menuFile.add(menuFileExit); + menuBar.add(menuFile); + + JMenu menuServer = new JMenu("Server"); + menuBar.add(menuServer); + connect = new JMenuItem("Connect"); + connect.addActionListener(this); + menuServer.add(connect); + test = new JMenuItem("Test"); + test.addActionListener(this); + menuServer.add(test); + + JMenu menuView = new JMenu("View"); + menuBar.add(menuView); + textView = new JMenuItem("Text"); + textView.addActionListener(this); + menuView.add(textView); + graphicView = new JMenuItem("Graphic"); + graphicView.addActionListener(this); + menuView.add(graphicView); + + open = new JMenuItem("Open..."); + open.addActionListener(this); + menuFile.insert(open, 0); + setJMenuBar(menuBar); + } + + private void initComponents() { + setLayout(new BorderLayout()); + output = new JTextArea(); + scrollPane = new JScrollPane(output); + add(BorderLayout.CENTER, scrollPane); + + Panel panel = new Panel(new BorderLayout()); + arguments = new JTextField(); + arguments.addActionListener(this); + panel.add(BorderLayout.CENTER, arguments); + enter = new JButton("enter"); + enter.addActionListener(this); + panel.add(BorderLayout.EAST, enter); + reconnect = new JCheckBox("reconnect",true); + panel.add(BorderLayout.WEST,reconnect); + history = new JComboBox(); + history.addItemListener(this); + panel.add(BorderLayout.SOUTH, history); + add(BorderLayout.SOUTH, panel); + } + + /** + * get default path for file open dialog + */ + String getPathCompiled() { + String pathtocompiled = getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); + pathtocompiled = pathtocompiled.replace("%20", " ").replace("/", + File.separator); + pathtocompiled += getClass().getPackage().getName().replace(".", + File.separator); + if (System.getProperty("os.name").toLowerCase().indexOf("win") >= 0) { + pathtocompiled = pathtocompiled.substring(1); + } + return pathtocompiled; + } + + /** + * The constructor + */ + public ExBoxFrame() throws Exception { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (Exception ex) { + ex.printStackTrace(); + } + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + if (screenSize.getWidth() > 1920) { + SCALE = 2; + } + setFontSize((int) (11 * SCALE)); + setSize(new Dimension((int) (400 * SCALE), (int) (400 * SCALE))); + setTitle("ExBox"); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + initMenu(); + initComponents(); + } + + private void error(String s) { + output.append("\nERROR:" + s + "\n"); + } + + private void interpret(String args) throws Exception { + if (reconnect.isSelected() && lastServer != null) { + command = ServerFactory.createServer(lastServer); + } + if (!arguments.getText().equals(history.getItemAt(0)) + && !arguments.getText().equals(history.getSelectedItem())) { + history.insertItemAt(arguments.getText(), 0); + } + if (command == null) { + error("no Server connected"); + } else { + String res = command.execute(args); + if (graphicOn) { + graphic.setFigure(res); + } else { + output.append(res); + } + } + } + + private void setGraphicView() { + if (graphicOn) { + return; + } + remove(scrollPane); + graphic = new GraphicPanel(); + output.removeNotify(); + add(BorderLayout.CENTER, graphic); + graphicOn = true; + validate(); + repaint(); + } + + private void setTextView() { + if (!graphicOn) { + return; + } + remove(graphic); + add(BorderLayout.CENTER, scrollPane); + graphicOn = false; + validate(); + repaint(); + } + + private String openFileDialog(String startDirectory, String pattern) { + FileDialog fd = new FileDialog(this, "Open"); + if (pattern != null) { + fd.setFile(pattern); + } + if (startDirectory != null) { + fd.setDirectory(startDirectory); + } + fd.setVisible(true); + return fd.getDirectory() + fd.getFile(); + } + + private void testCommand() throws Exception { + final java.util.List failed = new LinkedList(); + final java.util.List finished = new LinkedList(); + + JUnitCore runner = new JUnitCore(); + + String name = openFileDialog(getPathCompiled(), "*Test.class"); + runner.addListener(new RunListener() { + @Override + public void testFinished(Description description) throws Exception { + finished.add(description.getDisplayName()); + } + + @Override + public void testFailure(Failure failure) throws Exception { + failed.add(failure.getDescription().getDisplayName()); + } + }); + Class testClass = ServerFactory.loadClass(name); + Result result = runner.run(testClass); + + for (String test : finished) { + if (!failed.contains(test)) { + output.append(test + ": OK\n"); + } + } + for (Failure failure : result.getFailures()) { + output.append(failure.toString() + " ERROR\n"); + } + output.append( + "TESTS PASSED: " + + (result.wasSuccessful() + ? "OK \u263a" + : result.getFailures().size() + " ERRORS") + + "\n"); + } + + private void connectCommand() throws Exception { + String name = openFileDialog(getPathCompiled(), "*Server.class"); + command = ServerFactory.createServer(name); + lastServer = name; + String fullClassName = command.getClass().getName(); + String simpleClassName = fullClassName.substring( + fullClassName.lastIndexOf('.') + 1); + setTitle("ExBox connected to " + simpleClassName); + + } + + private void openFile() throws Exception { + String name = openFileDialog(null, null); + + BufferedReader br = new BufferedReader( + new InputStreamReader(new FileInputStream(name), "ISO-8859-1")); + StringBuffer b = new StringBuffer(); + String line; + while ((line = br.readLine()) != null) { + b.append(line); + b.append('\n'); + } + interpret(b.toString()); + } + + public void itemStateChanged(ItemEvent e) { + try { + arguments.setText((String) e.getItem()); + interpret(arguments.getText()); + } catch (Throwable ex) { + error(ex.toString()); + } + } + + public void actionPerformed(ActionEvent e) { + try { + if ((e.getSource() == arguments) || (e.getSource() == enter)) { + interpret(arguments.getText()); + } else if (e.getSource() == connect) { + connectCommand(); + } else if (e.getSource() == test) { + testCommand(); + } else if (e.getSource() == open) { + openFile(); + } else if (e.getSource() == textView) { + setTextView(); + } else if (e.getSource() == graphicView) { + setGraphicView(); + } + } catch (Throwable ex) { + ex.printStackTrace(); + error(ex.toString()); + } + } + + /** + * Shutdown procedure when run as an application. + */ + protected void windowClosed() { + System.exit(0); + } +} \ No newline at end of file diff --git a/src/main/java/ch/zhaw/ads/GraphicPanel.java b/src/main/java/ch/zhaw/ads/GraphicPanel.java new file mode 100644 index 0000000..f1d1895 --- /dev/null +++ b/src/main/java/ch/zhaw/ads/GraphicPanel.java @@ -0,0 +1,88 @@ +package ch.zhaw.ads; + + +import javax.swing.*; +import java.awt.event.*; +import java.awt.*; +import java.util.*; + + +public class GraphicPanel extends JPanel { + + String figure; + + public void setFigure(String figure) { + this.figure = figure; + paint(getGraphics()); + } + + private void drawRect(Graphics g, double x, double y, double width, double height, String style) { + int w = getWidth(); + int h = getHeight(); + int ix0 = (int) (w * x); + int iy0 = (int) (h * y); + int ix1 = (int) (w * (x + width)); + int iy1 = (int) (h * (y + height)); + if (style.equals("draw")) { + g.drawRect(ix0, h - iy1, ix1 - ix0, iy1 - iy0); + } else { + g.fillRect(ix0, h - iy1, ix1 - ix0, iy1 - iy0); + } + } + + private void drawFigure(Graphics g) { + if (figure != null) { + int w = getWidth(); + int h = getHeight(); + g.setColor(Color.black); + StringTokenizer tok = new StringTokenizer(figure, " <>=/,\"\n"); + while (tok.hasMoreTokens()) { + String fig = tok.nextToken(); + if (fig.equals("line")) { + tok.nextToken(); + double x1 = Double.parseDouble(tok.nextToken()); + tok.nextToken(); + double y1 = Double.parseDouble(tok.nextToken()); + tok.nextToken(); + double x2 = Double.parseDouble(tok.nextToken()); + tok.nextToken(); + double y2 = Double.parseDouble(tok.nextToken()); + g.drawLine((int) (x1 * w), h - (int) (y1 * h), + (int) (x2 * w), h - (int) (y2 * h)); + } else if (fig.equals("rect")) { + tok.nextToken(); + double x = Double.parseDouble(tok.nextToken()); + tok.nextToken(); + double y = Double.parseDouble(tok.nextToken()); + tok.nextToken(); + double width = Double.parseDouble(tok.nextToken()); + tok.nextToken(); + double height = Double.parseDouble(tok.nextToken()); + tok.nextToken(); + String style = tok.nextToken(); + drawRect(g, x, y, width, height, style); + } else if (fig.equals("color")) { + tok.nextToken(); + int red = Integer.parseInt(tok.nextToken()); + tok.nextToken(); + int green = Integer.parseInt(tok.nextToken()); + tok.nextToken(); + int blue = Integer.parseInt(tok.nextToken()); + g.setColor(new Color(red, green, blue)); + } + } + } + } + + private void clear(Graphics g) { + int w = getWidth(); + int h = getHeight(); + g.setColor(new Color(240, 240, 240)); + g.fillRect(0, 0, w, h); + } + + public void paint(Graphics g) { + clear(g); + drawFigure(g); + } +} \ No newline at end of file diff --git a/src/main/java/ch/zhaw/ads/ServerFactory.java b/src/main/java/ch/zhaw/ads/ServerFactory.java new file mode 100644 index 0000000..749f7a8 --- /dev/null +++ b/src/main/java/ch/zhaw/ads/ServerFactory.java @@ -0,0 +1,68 @@ +/** + * ServerFactory -- Praktikum Experimentierkasten -- + * + * @author K. Rege + * @version 1.0 -- Factory zur Erstellung von Server Objekten + * @version 2.0 -- Dynamisches Nachladen + */ +package ch.zhaw.ads; + +import java.io.*; + +/* Classloader that handles file path of class + */ +class MyClassLoader extends ClassLoader { + private String path; + + MyClassLoader(ClassLoader parent) { + super(parent); + } + + private byte[] getBytes(String name) { + try { + RandomAccessFile file = new RandomAccessFile(name, "r"); + byte data[] = new byte[(int) file.length()]; + file.readFully(data); + file.close(); + return data; + } catch (IOException e) {} + return null; + } + + /** + * @name filename of class + */ + public Class loadClass(String name, boolean resolve) throws ClassNotFoundException { + // System.out.println("load:" + name + " " + resolve); + Class clazz; + byte[] classData = getBytes(name); + if (classData != null) { + clazz = defineClass(classData, 0, classData.length); + path = name.substring(0, + name.length() - clazz.getName().length() - ".class".length()); + return clazz; + } + if (!resolve) { + classData = getBytes(path + name.replace(".", File.separator) + ".class"); + if (classData != null) { + return defineClass(classData, 0, classData.length); + } + } + return findSystemClass(name); + } +} + + +public class ServerFactory { + + public static Class loadClass(String name) throws Exception { + MyClassLoader myClassLoader = new MyClassLoader( + MyClassLoader.class.getClassLoader()); + Class clazz = myClassLoader.loadClass(name, true); + return clazz; + } + + public static CommandExecutor createServer(String name) throws Exception { + return (CommandExecutor) loadClass(name).newInstance(); + } +} \ No newline at end of file diff --git a/src/test/java/ch/zhaw/ads/BracketServerTest.java b/src/test/java/ch/zhaw/ads/BracketServerTest.java new file mode 100644 index 0000000..be21339 --- /dev/null +++ b/src/test/java/ch/zhaw/ads/BracketServerTest.java @@ -0,0 +1,29 @@ +package Praktikum_01_Code; + +import org.junit.Test; +import org.junit.Before; +import static org.junit.Assert.*; +public class BracketServerTest { + +/* BracketServer bs; + + @Before + public void setUp() throws Exception { + bs = new BracketServer(); + } + private void test(String s, boolean b) { + assertEquals(s,bs.checkBrackets(s),b); + } + + @Test + public void testBracket() { + test("()",true); + test("(()]",false); + test("((([([])])))",true); + test("[(])",false); + test("[(3 +3)* 35 +3]* {3 +2}",true); + test("[({3 +3)* 35} +3]* {3 +2}",false); + } + + */ +} diff --git a/src/test/java/ch/zhaw/ads/KgvServerTest.java b/src/test/java/ch/zhaw/ads/KgvServerTest.java new file mode 100644 index 0000000..b40a6fa --- /dev/null +++ b/src/test/java/ch/zhaw/ads/KgvServerTest.java @@ -0,0 +1,23 @@ +package Praktikum_01_Code; + +import org.junit.Before; +import org.junit.Test; +import static org.junit.Assert.*; + +public class KgvServerTest { + + KGVServer server; + + @Before + public void setUp() throws Exception { + server = new KGVServer(); + } + + @Test + public void testKgv() { + assertEquals(server.kgv(3,4),12); + assertEquals(server.kgv(2,4),4); + assertEquals(server.kgv(5,7),35); + assertEquals(server.kgv(4,6),12); + } +} \ No newline at end of file diff --git a/src/test/java/ch/zhaw/ads/StackTest.java b/src/test/java/ch/zhaw/ads/StackTest.java new file mode 100644 index 0000000..484f67a --- /dev/null +++ b/src/test/java/ch/zhaw/ads/StackTest.java @@ -0,0 +1,58 @@ +/** + * @(#)StackTest.java + * + * + * @author + * @version 1.00 2017/8/30 + */ + +package Praktikum_01_Code; + + +import org.junit.Test; +import org.junit.Before; +import static org.junit.Assert.*; + +public class StackTest { + + ListStack stack; + + @Before + public void setUp() throws Exception { + stack = new ListStack(); + } + + @Test + public void testPush1() { + stack.push("A"); + Object o = stack.pop(); + assertEquals(o, "A"); + } + + @Test + public void testPush2() { + stack.push("A"); + stack.push("B"); + assertEquals(stack.pop(), "B"); + assertEquals(stack.pop(), "A"); + } + + @Test + public void testIsEmpty() { + assertTrue(stack.isEmpty()); + stack.push("A"); + assertFalse(stack.isEmpty()); + stack.pop(); + assertTrue(stack.isEmpty()); + } + + @Test + public void testIsFull() { + assertFalse(stack.isFull()); + } + + @Test + public void testEmptyPop() { + assertEquals(stack.pop(), null); + } +} \ No newline at end of file