From 9a627df1adf4687d249fb9200dc220a25bb01bf1 Mon Sep 17 00:00:00 2001 From: Alexandre Touret Date: Tue, 24 Oct 2023 11:04:28 +0200 Subject: [PATCH 01/14] feat: Article initialization & DoIt upgrade --- ...ibuted-tracing-docker-container-java.en.md | 41 ++++++++++++++++++ .../claudio-schwarz-q8kR_ie6WnI-unsplash.webp | Bin 0 -> 90612 bytes themes/DoIt | 2 +- 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 content/posts/agent-distributed-tracing-docker-container-java.en.md create mode 100644 static/assets/images/2023/10/claudio-schwarz-q8kR_ie6WnI-unsplash.webp diff --git a/content/posts/agent-distributed-tracing-docker-container-java.en.md b/content/posts/agent-distributed-tracing-docker-container-java.en.md new file mode 100644 index 000000000..b8f88e171 --- /dev/null +++ b/content/posts/agent-distributed-tracing-docker-container-java.en.md @@ -0,0 +1,41 @@ +--- +title: "Deploy your Elastic APM Agent to Kubernetes and instrument your Java applications in a smart way" +date: 2023-10-24T10:28:11+02:00 +draft: true + +images: ["/assets/images/2023/10/claudio-schwarz-q8kR_ie6WnI-unsplash.webp"] +featuredImagePreview: /assets/images/2023/10/claudio-schwarz-q8kR_ie6WnI-unsplash.webp +featuredImage: /assets/images/2023/10/claudio-schwarz-q8kR_ie6WnI-unsplash.webp +og_image: /assets/images/2023/10/claudio-schwarz-q8kR_ie6WnI-unsplash.webp + +tags: + - Distributed_Tracing + - Java + - APM + - Docker + - Elastic +--- + +In [my last article](https://blog.touret.info/2023/09/05/distributed-tracing-opentelemetry-camel-artemis/), I dug into enabling distributed tracing and exposed how to enable it on Java applications. +Now, we must deploy it on Kubernetes and get distributed tracing insights. +The main point is how to minimize the impact of deploying APM agents on the delivery of our applications. + +In this article, I will expose how to ship APM agents for instrumenting Java applications deployed on top of Kubernetes through Docker containers. + +We can basically achieve that in two ways: + +1. Deploy the agent in all Docker images +2. Deploy the agent asides from the Docker images and use initContainers to bring the agent at the startup of our applications + +## Why not bringing APM agents in all of our Docker images? + +It could be really easy to put the APM agents in the application's Docker images. +Nonetheless, if you want to upgrade your agent, you will have to repackage and redeploy all your Docker images. +For regular upgrades, it won't bother you, but, if you encounter a bug, it could be tricky and annoying to do that. + +What's why I prefer loose coupling the Docker images from _"business"_ applications to technical tools such as APM agents. + +## Deploy an APM agent through initContainers + +While looking around how to achieve this, I came across to [Kubernetes initContainers](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/). + diff --git a/static/assets/images/2023/10/claudio-schwarz-q8kR_ie6WnI-unsplash.webp b/static/assets/images/2023/10/claudio-schwarz-q8kR_ie6WnI-unsplash.webp new file mode 100644 index 0000000000000000000000000000000000000000..62b7affcf23c4b203863f5e3594128f8d0b58691 GIT binary patch literal 90612 zcmbTc1#BJ75~h88%#1NJGgHjW7_(z$X0~HyrkI&2W@d~rW@ct)KAUf^bno4jcK=`7 z(zKqgu2xsSRU^%e=9{#H#JM3DKto(aNnMFs6Al0X(Eq*azya<+fV8Nnk`%(I#CC*~Z<);UD|;U&b)9{)d4O z|FF~F0RJ-fKWzRl{^wvAM*m`=f7ry<&g8GpKQTL)*qZ#qgMT^P&DHcTgUkKpP&Z3c z_rE;Hu^7i zG4=QxCjcO7@8IcVX>Q>{Ol?d<%<}asH?fqdyN#)f3xkrOv9+O-39+cXt%ISRCjjuT zGyk&+fcB5J#D7KRWckX;$-v6^SN?yu|Lf$xz5eg;Pj3I^ai{!0a|VVv@gLiN*8az4 zUjP7bKm64u{y#RObO4|w1OUKZ{f~`24*)<81^}9;{_8xL|I~|xi;Dvf6O+5UJENtk zG2=gi{=5BuI{e%7{|x`NALBp!{aZU?F;g=`R~r}Ne?&F5x3PD1B6fB#G&Ut>_}`28 z|9Rnmh4o)?(0?;EGj%ex`@5C;-zu}TGyj`zI}=M6OM5$FOS}J5hW{Uz{Z|bC;J@nn zFQ6BF0x+HP2MK@!AOkP}H~>Nb8GstV0AK}h0eAsI0C9i} zKoOt{&;sZIi~$w^TYwY59pD290E7af0P%pIfDAw`pa@V7s0P#nS^%AZKEQ9lIA9vE z09XTT0}cRZfNQ`b;0+863>pj(3>^#yj0lVZj1G(yj2lb>HRCm;snMm>rla zm=9PGSQJiRD4EO*J0EY+11SbJ!0Otl51y=;u1~&tD z0`~=v1Wy4k0Ivpb2OkEX1K$Qe2Y-Qpf@gJ^~r zgqVZafw+eFghYhIhopn#fs}^SgfxeAhYW>Gfh>V+f*gWefINVFgo1*?grb7tf|7#L zg0h10hKh#DhN^+;g_?odgL;65hQ@)WgXV`;gf@hBfewXEhpvL|fu4mvfPRL7harMt zg^_^KhOvVQgh_#^fa!*rg*k$GgGGU*faQTzgf)TngpGqOf^CPLf<1tJgF}U*g5!r% zg|mVSfJ=j`h8u!ghr5G^hbM*q3a<=r3GWY|244$50>1>|nh-!-(jaq>^ih7I&jYf$kj%I=u zj8=#?fVPJYj!uRyif)V^gkFR`gnoblg+YZOjbVimh4Bkx665*{+86dO>R&v*WPa)T zvW*FjNr@?qX@ePuS&zAh`HDq=C5&Z?6@gWaHH-CxjfX9SZHgUyDd)JA`|Vhk?h7XN(t#SC6-f55%X%|Az04Ux+_}|3E-UAW7gr zkWMf_a88IxC`4#Qm`vDBctV6uBtT?IluXn^bV~e%SeV#`IE{Fa_?iTtM2f_fB%frG zM1P3( zih+wsibaY|ild3EiD!s!N{~vJOH@i+OL9nhOZG}ZO36wkNG(YdNE=I+OJB=y$^4KR zltqwLktb(qhuTr7%s4Aiwr@E#_t>&uMua2y)qh7B5q#>q}sIjfdr1?X0TnksrQma)P zT3cPaMEl{p`1haR4|F(mLUk5(sdPPbNA+;^Z1lSHk@XGr8w?-~Gz=;X-VGHE3k)BO zq>ZwSu8l>FQ;p9|giMl6PE7et6HSlI_{|c{j?MYalgv*n1T9i5&MiePGc0ecq^xqS zo~#wEORYgR8a6eyFt!G^ZFXpO)^>yTg!UfxGY)hPp$^-QJdQsdubpI_N}R!*b)8#X zF#bMFO}J9KhPdvy3AkmtJ-e&BH+Z0W*m+EN(t1XC9(hT46?;Q?8+-TrkoW}n?EDb^ zk?#xUYvkMSN9Gsoci=DSUlsrtU>)!$kU20h@IFW*s6Ch<*gtqLL^7l@6e-jxbSaEC zEH@k?+%kMJf-NFF;xp1Dax98DDkbVY+BkYFh9xE~1{7-+I~m6rmlF>aZx_FqAec~= zh??k?xR)fK)SOJ59GQIoQ~&2^3VTX!DqN~->UNr3T5CFadVKnOhDF9grbuQ@7JgPl z)>F1g_H2$&PIWFpZdC4To@L&0zGQxL0cAl-AylDT;bD<_(Qq+$ad`=DNmR*4sa@%I z*|)O6a<2073jB(=N?@gHIZ%c}Zt!d)Z|9c*SPr zX4P%=ZOwljay@bbWg}%1f3skVW~*kKbGvItY-eIuWp{1Qc<*fAdH?+&_z>|h<%sC0 z{FwE)^F-og`tP6Ni^=0Fg(AC7X=Jmmi(+%i0`VQx=^q&2`|3T?t z^U?P4?J4pZ=eg{K`(^l5{pZ$ut;SDd3!Jmhp1mG`&Iwr)!_Z$eeFdmTB zp@~(EL8Y0@QxAnN_WO@i6Fr=tHLpw?S9YJex24BDu^`c_%uj&_U$)PhwA6YK5y<*| z>+4=_u|(|v@IagQv~t`4POL+T0o#q$tR+B5D0Yhj^@V)QUrCZT7wiXsop_p zJ(r;S9((>u!FN#S695FdD1QeBffPUvC{2JpO^~ChrbLjWOZ`msa)c2YDl(bE>2%7X;1}VS% zc!dAJdVP8a-Si|0O8T|m{(4vZP+aZtzd8mTfNnvBAj>z;`-RUikl^Fi1%I+{z~>Pt z?6oF9|A=T?@X{|5q&RqMxx2c;Z){v^i-9+d_~nflp*NMMd z^hwTZ{=rI#|1;1GRjQE7*dcq4@IdEihTa{h5IQF*!`XN7348Ni_65ri2PMFE%_|pc z;_l4MzA;1xNjArPE`Xe^CYF}E%s?R^G?W6PmH*9V+jRG|X~7C(*jPZqZYbBwTyd(l zY1|%ltB6)$ta`ip=NfDs;k#0*d|_S9K^89>QMR31fo8PDu|l?lZn<{V*9h>MliZI{ zFGB%Z#o=Mx$8YF!4+4u*-(gS%{8p$gm zG)>l@tt{sTbi&_QDMPu zS1Nytm$s_Ch&(0C3i;S%5t=oKdoEx3C=jfAggTE6K^@#4cjbSrtP*)}$=c!rv+b7K zOLNG+7Q**wlQs$P9gu%k+W)2WiKAmw42cwZPc1l;N4b{|%tb`v0oUxsS6bKTzv4G9 zMLOA$VU{l3mPGvO#EVaP36tHlWZY8msnZavQAPK)gwMlf2Y38QDm7?fO1gCQW*2vE zH%yUeX7NCaFcfO=df>SwJ$CF#d)WR4L7;qV&39Ef>G^vF&ZpN{7lzw~%H7$j^%-cjVRZPVky-LvTP|Q`uSHq}lFJ{aZ>>#;OI8ElY=;$XN%%q+9pPcdy4ERdqMdBuEvTUinZfY(i%- zwTMXaFGP;&X*pHpVrLos{k?Cg9v^~tZ_b*>p63I%W*CA^i|F*(!G0JiGX4t27wRwM zHvzCiE34uNU$Vk1w+oO-S*W%x0dS^gT`Q4=b|@2FbY9NH)nC4PM&cUd+=oFPny6-G}4BqT8)vaM`Th+XN84 zp70_*sr~)>pf;tTSR1LUFdSH6(s;Wiw~Ze z=$D66dzv(?@!C<2GlZC7(%TJOH4H?NI!A*mnV{9Un|OZANh8@tr#ksX1Sea>!1pfp zgaLBH^}80H$^3dgZr|OAlfT+|oj0ajoLQRu4mUYhX(gedM5=yXJjAXlm-$Yu@-Qi< z5?6lAQs#1t55vZ+Tx}N|bo~tJ{l(m-QIqfL3bN;AmIuLC8mGwZu$>Yh=9!%|)$o9) zs=g0}XpiiRgAqPd#h=|{b7fvNqD>mYyV#A7co{?derF7NDgeU`GSl9ioOWo4(kMCk zQcY8Dl_x=>S!BddAy&y!W)EVt3bpgwhxtwEBzM|xreUurGdrSG9dMQCs$;oKG!e&5 z$b{iJO&@~F1)Wrp1QqU=Vz!R{iP`kqBYtw>cVE2PA8d=N=OSD$FtOOj6UD@?&inJ`Ra1oU&*d32dDovl|^F9N)m#-Q-t3rlTj z_^Mo1gxb*Tov%6t;_E@^>-(^>JyRwERQg$>@2f$)ObM{b>Pw4`J{O|$!aldtLJ;c_)w?WGlj28 zkmGU}RS!M-+Z)fGeJ;3#i7pFabd{{oX&ax66V{M^itCQcadih06|lXZXW;mg{mLq? zEM!J%nH$phbv(%Mq)K~yuC6hB7f#YTP2=Hmo4!GV3Wy5KV z=nQa&SmlFW5|meRNmx;c<@)d?EgkS+WYmd~Cu@27JpH54jOx@xm_8`FC_9s3`Zazr zWQavtlkYtoY|B9c!}8~lKaF!Psy=g~+F@DTj&HzdN~9>~x}PzA7^9SrTl3Ky{J_mp z=p>@_T3EG`ut@|;g1@F^SlbKnrHGNFy)xqA65UjT7rN%BW;6YX6Us9tBmVCN%w_SP zhCkXr^_cmsK}2@ezbZE@$Q@{snYiOlgRC`>VS}~Yo)7U88n^p6A9cj*lH9Le(rRj| zgA`$RFZ68t!8NOLVYBiro_5=bMQY9b7p=NXYtNi+KMxm^K)uAq6G1k|*D%=|o zK*6g{at-Qgp-;3pWDkk@TxGaW-ofqT&|_Gm|DwYy1f^15QVr4*xYc~F@cwZh72RmN zY%R2!DOVc=qgNG38Qc=T=3s%^mnWG-BO{DX~vDNN+@MsdVUlpK2*i6cyXUjp0MrV~LXZ-!q+wtaMIT^F% zEOiX^vq&)<1(o1v-8A2jdWl?cS6858bbp4{KJQ-Rd?sX1lx~C#57KyhS$OIIX2RK4KANe!h!x=>FPF^))dgU%7I$M)^cE2&R6RwP>jMgf$;gx#9EzA}Y{)Dd< zyz|KQq_}!R<7L%I6%4-pgU!X@ls;m+NB^D>++Nm=DLC%_<&GnNlo}>bdDn#OJfNrS zq(-Xk*rhn`#{9sdh|r;SFkMzu3T#P72PT;93IU#*rynD;=cDBp#(ZsS>Ub;+EW)oah8JT2O6C|0{PJG6=rTo@y?XpJY~KMUxhF93HA)^ND)ExKcL zX&8g%ZyVX4;0_eBBU`*u%S;+obzndSz6Y-U7YjQN>}#I{+Xz}1`+-nO*KZ2rWAM~| zFeq?i>8`!$wGC-%I=Znr?bBa+X3|^pK?Or%*&yxI;%U9m5 zE2SVA^7tlh*;x7jonu5)*lu34s^>{NH zf~2&l_96vyOjZ#T3-1{h45(73umb#Cd)3hyP#Y}gcszI?qmz5gJKYr1S3yG2-rTn4 z-#O$AA8LNk3rj;HeI|W-Y^9)|w}Yg(%dO)v)52&LH%^R8_zb+xwW^4S&X>l0d=hcD z8@GMm&)LM9KMb!RqBiLB%8|wPWOcVpc6OZ9n)YQmteuEJaU#lw9Dw8$Zg87mEuZ6> zGm32qLk~f-uKFSAn9z9T{+)28psMhtu2Gd{Kp~1vyOidL zYiF~8Uk`afq)jouzF#01Do;X}3`2B19IC}iYY1Tv?=W1V=?Zckho_MZx@c5$GKLH+ z^vY4V({F&oAQ;1PDl{J4UCu7e9UX^X7)wJxL4mjk19k{X)NaY|N0roH;6cugaMF2O z4#*M-Z0*M$=LM^%co7 zoX*H^C3Si$fp5!~gi*(aQsX7v6cMh3vsa!cq@4$R(`nL3*nqT`FHkfbOPE!tH3`D; zNzYMl54?L(iN?^Pv#xFjS}RAr)LuDKFQJd8c45a0ldIbM5Q~TFbF!{PU`<5xU_EG* zW{elojlElCjz{$2ki0r&s!xAwoMrLVHj^JUA6mBVgWY5;@@aXT3DnNv(XPw<*Rxi30m*D98 zV@h{6BcOj#MIS6!0(dwwq=T#5aEHS(SehHuG2Kd$dB;F4{A{elvrO)tY0nxnS82kvp>^;Ub>x~>!T$oONkKPO63J2^2A#R22U2l#FF*_v7@-8Kp7 zK$Ht)rgEZTh2!el$!-s}YgxW+4+%q;^I<|YlfzcBH_@*;AJM<71zLR}PuevOFmCzP zWF};eUPwgV4k|+_caxS8KS;imRm$m~PO+UHyofDTnX#(Q(FZj050DlD(fd;P8cVO$ zlF=8(*N1*Lv;@MgBkjX-KqUS7K@|WM__ZnDz@xJHMCdVYBt_1MVx{NRN9m?wXDydH zJ&_+l$_@c8tb-*T&(BGgpHoJ^Xm&-!{Bl`Uza;4)$6Z?}T>AUn2}!Hplkqlv4%KctHS=ebY>U?e~OIh8ooeZ=7_0q9x|`37rsUY4OSt- zH9rdm$y8rz$hUKd#?-kZ%wJ2pOodpo6hBDx3`QxLd{~uhEpaV~k?a|YB1l_unzH*$ zfuqvqX#!>_ESnUoReSk~F{y1$gK{u;d8h1YH+k>3dZRPkQ6qk+MBH(d@E5^Kci*>OoFFhADRN-WEg{!iYBa3!U-$5ZQzjb)lqMhmO_v zu7Z%{d30OnNdastkBBWg!eS+2h5H9uB5d9pIWgN*1u*toP6Kb$gXx8?a!Q&M40gDu z+cPnQJYx*oDL(SloE%`5_KfLC__7LBLJ!=5rAo>Cr@iPO3bLCcgDTk)g=O(ZvYL=p z=!8MBuUjx*ttSUS9BhZ# zGIdONb!p4e&fBRW!NZkLjnkswDhaIom2A2HgZ8rqMRi6aqZPr=Dt+vvp@O)JSc71E(5`Y-qm`5&O zU{B?}Am%@}CMZVsA4~!q*qqAxbc7u=4|#^Y=h0a?4)pitDQnfV4dTn!1jN1!+rhU~ zqsP}*SaK-d{?sGkNMd_QKE`iq!}MX3$<)k_ysta0XRbYJ=Ln??e(m)Q<+4CgtNu(C z{(fj~QR3bNz7jIBMxXQo74oQqfUY9`Rok5)slPBZH#siB;6qcI+*m7HM8^LHCE=z+ z)<`F?VB7i9|Dd_P3CcsOFiVx7A(D^`Ghy@>dp{h@lk*VY0KTk7fIyBmK4Ee{jisb~ zEupDICEQdt{C3DVC(jVDX1+I~QbNE-;8Auuh=5?AnagCB`wLV~!Z!GA0-8O+P;QLy zT9;(*$q5MbDKeb;iKkOtU+t{3x7#lRp-=0b{(jB(l)Y*%u2BEg%Jzm*${1*&*>+7@ zxVWEEiq9X>&V)V;sH+V_NMz?NmvUK40H? zU_75`T(aZ`D7_cEiHP0C-m&i= z6vpA$&}%r!HuZv|FAjD2gk23Xh3*2#98@rqdw(qFe$K-u@CEvolW!D1a-$DLlM@RV zOSFc@1bSxpK!G1GVkH8(O}C7UuGg2Os??_IgLzI)gKaYQs(y1z#t%fl>E(6OcYYnK z#N@W_dXa>E#FvNS(KL4I*O0Z**AyfMt;VKlG=;TH58edyT_@l5$KVrsI!SM6(Mgw6 z`HWll_Nga9i|}w&rmc<`rLmQx`2T=;>-Q_0-7d_R5tz7GQ#jpMNYa03QAZ?lGA%|S zX%RjpnfO`ZNqAHKK1MKD8S-6a48|iaq)syq4 zNvfTEv(;eLLfrH0?|*!2J&fl2IX;7JbOwv$mmm1zyPr?99A~NG(8=3IPV1T~^Yfr< zsA6b1g1zrrDA6Mv*=cGtOd$b<`rW@F2wRc|jd-EVvvP9x3fX~tpf;|U6!D83Zit@W z?R$CK%_=R+ZSNq{n1*H~1_jSvB4WKd|*OtunCUN7*Bc%&}6TFAE)GxT3@%68VUhhr`j(qg9;!y+R}p_ean~1~TCdF9dUE%W@gB-;2Hz2r(zT<) zDI{*+`Cr#7N}P|E7O+s!YEevKw-Bk^**%(6e;O`3b}w3?Cv!H#?Fi&e8Hxn~1y+l8 znu{#H{r9wKR^nBC> zoIJ_?#e&*QM#)0`E(lnih;e-cIqgft@`bTFVB1~{VHl;W-32OG!>$C%;Fj<%Zu_6Y zj-RbHu5pp<8#q4~Dese8EfJ0#x0_*h*`42*0j=KRq*SOJP^o)N><_c3j&~VFoj;Zr z_gyDqEWf-$P&~1LG$tpgW{|YEwmq;7qqW`s@Um#OYwTA*(C}WEs?ToeJY*AIKWATTKv|PKn+OYdGuJ9UwNByBy9jcGb5^gIJ zp9->ZYYe?E8{M24^a+aAWCKCm>MsS1Ii%1~NIN;U?HFi{{X*wwpr=-jMCYkJSeTfw zH1)b$B`=cn;x~pon@8l4pICcZPiea=L#*0(<1j{FKg8cn3kVQCS{#(@xK8>p=Aa|= zlv>6?F(!-mI+yUW2jQ`jID17n^kZ3>QHL|)d%#Syy9A-yAHwK>o|}>$>06G_>`UcT zhLsZTgpypAdaS`2x+G1oljUX#$Z}IzWoqGC**dZNR12MQH2TU(1auQ}zEiM-Z0U8Owz;)JR%jFA@`I2>eM( z(q=0Q(U66Q))H9l!x!qi6BbX``4sflKD2y^y{m+NQ6|SNOI2-)O~I_NZxoTk7y^t} zpGZOXrOzl-s(nRO3o(`qj;mgr5S@!Z+6IY~*@*N`^LMi8XN4PXK0uB@euN^1lnk7i zeX^}hyC;%42NeD3J|Z2rKx{8yKe~Qy@1oG>1;vGGFdv{1rV=`Kon6%So(KQ=G8wFI zgE1Y5I+iS(aiaX*DB>tQyZ6YNfFCP<#@mB(kHf9&)Vzk`+ah>dTvX_fDY2q;V6+>C z$jTC^jC*NP>D@C)ILK*6J)TKA_r85dr@|Vj!x)gxUUmm9pEwaFfj}E=_#TUgVOcfX z)3nvHD~pgL>h8TuXlBvQW3%z4YeBfF%IAF?bcZlEKOK@$cEtiYj$w7?Nm-Xdz?l)$O%C75Xy+ zzD4qIkyr@ZxbPQ=L`DHKSv8no3un)l>G>X7@m?mZAIg&l5~fXW6X~8lRVNO4+(>Xf zJa&J;jPfG(mHFSoxN}#b$HEF=0K9k{V?VM~(O8uD?#Tf^2d2TfMUJB32<@NH93+N6 zE9S2ynssu^Xua0?z>c+zKd2+`NqGkE1M`c+CZ;_c_5^o^mlLS47Ik@v@>w}MmihgK zJ`!|0kcq()q{_~aT}{$WQeTo>wYQP9ey3c^NTA?Ty275@TC|69CG$5muP7^3rFg;o zd@;hflx|bz#Tu&^`HBHYxXJ!W2;q&1uD7rC40A_Xz(^WUab#h`a?!Drt@oXfNP?#+ zx^7fS6IGbu8Dskw+c?_e#OitV!w{!!x{~bYuSRdv)ip)vARPf`dIzaWg=MGBzH$mg z<7c{FIT5dKOhbiZb}ZyMd5CU3?1Gy8Tr)9JPA#@OVSd z1yFI6gPvebM}*7_{orG~mccmUaa+b0p&cLh znO%WliW&V%>S?*shn!9=->47lYnC@HB0QeC`82ayFVf8foJx3 zZ$e^YF4R}(S!@>H>_NUr`;1h5d843MjqBMue-C>9N^q@Ui7l*(_a6}YH`qxV@8;Ue zZ`eo~XBbiB1lYxLtE-&9aF-F8lEh88%j$!Zu{wGg@}SIq5@acIad53w7E_cMnxJN< zYB`GKowx7fG%s9&-IHSxrYptlflaowTbVC?&wBoh_zHzZ>#>JgFrYwUN7+T@a);&9a!@Ht+t6ucwvLi4kUoci% zvp`?8ZF5T{2$eYlF^bl?UqyUo-9H zlGkZyAapezcH9*}-XT&}Co3;Trf(j=G>9D1x9-PHBxW+tk63*T(;b__`;(Tnth;3_ zJU9s^SkN5HADm0;3;UKeHB1oJbY4Sz^J@Rn(jVl~r@Kj|=1RpufjVcti3Fs^B$Q_d zr*Mz+IXF}2sj#;6^a3Zss6Eedjhar%_7lC(?BMZP7=1xzC9ZwVYpV`x@3!qHiZ|Ho zbf&s|{~{JLsK@G@7tm7F5p9cz(twqlSMxrE>MO=oT2bT+o+p+j`!GRj>28$oQwvr7 zdAZlL2h-m<`F)#cn)KZM%de18R^*v5h_~$3K$h;MLwcDY1QCaag-gGheG+;K#>hYV zK}N|NyU`3I9N@um=#R27F@a50@=S5fzgYuja7ybf1mnjY%NtZHaYvf-v0JQr2KnQ> zv791^iJA2FdpWkClgU=pC&$qX*+;V-&8^ntkYx2Sq3=QJi=ImPSs=eMU$A z5gH_ZPVE`_CTDp`j(BCWfYF_{vo!$ld7=9HKCPzB-C8i>8LE(_+Tw1PlPFIhbn{k4 zAxvY~abncpUIUe>?0NjBAG??zhxdC+3K)TC{?-`as(=WiYrWr0nEyiP7cF_<`?UIM zM^N&pTSkHl>$RAfLJFJt41@F^+!D_w_fU?Sh$JQIy-(1x^N0ANIZ($?61oA*RqGRgW@m98qT&V{C>4}Gl^LU2z0V*i(24cr8B4( z&BJn*FLFb_cV$y|t?A0(@Qfl$Bsdmz9bBGv&pAsUK?zDZdO0+(bGhUEdZUB4S$YTN z@g`D}Rsy=8mZ9vfn5;~`QkKrc3Z}?-?nypArw_RcsV_k^URvgqd4-h;mo66{_=H}k z&G6W6C(G06Ib5o)hv%8$R-oX~kcK)A=4j?h(7cCOukY(RUl=c_V<*eTI2~PvMroIb zvjkPus_@n;uU*-b07(E@9f47mE7q*fw42RK-(_z9N9 z?cPMh&kk+k19RPr%wA(aKU(P2j-3Jw?tr+)<5h>$8~$f@2@hbN2DV5cRGi3%{BeQl zMbpeEpLO@Nu%27dUTHZO&opwz&9PXo!L6B8as53<-`PJ42!XG#~lwK~5}Cq^Y$f6cjM!8Tb2Z zZ52Ln-|Rl4GNQI3p8qCyONfgIkBW zZFO_3UF%J@@H#*y(q^Y>jOTPdEP`r3oF@siRn5!V#eL}S>9)f zbbeMw`3HA`=~bbW1Y`VhH!Ac4M_#_MfUarw`|Cepehx})ZAFnW^35FkF{X1RJiyZl z^LOjRV|XGrPuhEVOna+pb%&+>xKG?z^Cg{H^!n%qT4fnHbr8I~%5KbK$ql< zFo(G;_c?YLbD7(qb%F)2*i5FIA@ zI$rE^HhPP0Y=f`YpwZ?R47?rcB8eOwknL#fc=!!1_l?+Y>CH8swed3`Mtel?d-Qz) z!*>z=Q6o8ZOcmOkhWtPCJ~!VoERNK20a02}%-MZ$_1Tlx{_2XUuAlp^%eTTuw0_WI zz9q!tFQrrU_xr?Lp+o5(k^7ck!-(u_T4|6UAOr}}KD@nMw+=;`YC9pLS2Dd2-r$f$ zM?02Q(ZK-Nht+1`jQUnSjPX4@Z7%-(DwAG+|76>`9c;@T34&O97vCUp@6s>7?<_wJ z#^cC1<5>@&E3a${R*pzhct@NCV!0zqXjelrE8`cof)DwP`As#rDf&R^6;w^ za79dkd{aZ2oP%>^btthWk4LC)UWfoykw_yYE?Y5w-6`0mim#Zqj=#4O0_1AjP=)M{ ztvdmCGD20M`V7wxZ3(kQ^4)c$yEGw$gOg`gY?*UWPC6TpA07O=d&}%X{LiFHRb^r{ z?JnllT?;`e&TR+shS!*Zp}jz8-yE)Nvm&&Rs1!fY$X*n&@XvR0f4mg<=thd#s@Qk} zF&fhEWq}{b96f?S(9GJ^@-xA-=a&vHk&hnqIHu%GA;!&sCau?j2xth(s!-&do}Z8l zxr|d5P$&XAebE{wmG6|f&%Vf#ngZMET~*$){pUVAd5W+1#8hVwZ7Q^eyPez-L&h%R z;e-3XKTvu6GSe0v2eD<(Fpj0(^&@>8C{ z?Z|EXcef#OTA4drxuyv*=1Trdcep9;S=8}dguFnGWeh=J8d!4DGq-}f*ym&hz67Kf zR*H^4BR&Ea+T>GXMcdD`_?q5Q46Tp6C^q$oGrWl;uShbibxXz*o}Y8t(|cM6+|p_& z<&|m((uh$U!OJRmMg1pFt(n$&<_+4PQm5A_nT5LWJj^#xGS-L!YXxkK^`-r(l{%Xy zl48y<)=FbTxPl@|M9B#XCW-em>zl(+a&kH6D##?v;PbR4Q|~CS;#Bj9o_%kB&iZ=z z5nV54I0g3V&S=VG<;QFgCKn{$QGu6%ZqO$}_!^~q%PIb~EQ6x`eBL_3N~rM9Y96NM zP{~6nH+)LY&>V>1r`lh5Y22$!Ll~{MMtF(0%-5ZC3O*_>`u~8dX-=8+cd)5kM__Xt zWpU}!so5^aa4d3QFN|#R z=2J(j*XO4|>&d_v)$&S}&^@*-H1aeV(VTZRAT9fK6u4VhZei2Z+VH2$id%~x|SZ0|DvgTv)H>0+mEqdq+F!4>jm0&dV`nPUD!}5+(o)qxT&@wDJ1G7o3p)Sw4kn(>>t&qKUw`0JaRo6Lt*p+0ZMZHV`|uiHi4zA%2!6% z)lvOX%fLtihy@2U8x(y@^R>%qhEDWxpz8ufYSoS~ncH}yPXKFhB{!9xv_^-fp~&4p zOFnnX0s?3z{t=?dh9&bOLWg4~OX+luf)F$UDq={djQDfx`UxIQB&FR-WmLC2zcfj$ z>POMk%8=O4t;yPR;P1t*66QoR{Y!VO7BgU@lq`RXXiAV6v1|ud338YKT)#PgyTd{B z7M_aG#~F>5?d;D)lEydUeu|xL8FPcc4FO*1n=y+{eeLSvbU7p~CN(dLjSXi}F{^zp z=mv*ETpLK`FB^E{oi@8q)~+=C z!D6}q*K$ale003njz;VQZ{=avgjovEmg_OO9g`s=dq-`PDozh!+YKo<4lmv3ygca^ zNXdz8v?TP5E8Pg9KB6~_8=t?iIT|aaCADMqZUFzuzO%f>a@MHaiHDL_ZQ##_3t2xi zB|aq4F_>~N>#*Tq&>v03@vcfNe9#nr4V#b~tBcCjLDw}cp!FTr$EzJ7ABW^xIeXGq z07_Z#wYjsD=JSMf2>s;8=)(jHj*UaW}aCV;s}^R!?)uPbGvZ6@R_~nnaudi z;pjOlTgtnBA;}qR7heTEfUIZKwKMHvJD4cP^r9uXk>`;kKRdD1BTl8D&!>dN5LLfo6Cq?E)lX11y-$W(a5gCQ zQ%&_G4%^^mC;W|h&eiw!da&kH|Ft1~SBa~Q`Wgc?N(@0B0J3ge4V^BTcj2n%xvs)l z;#Y2CqNjzSMSs`>#vCRwW|KP@mS&?%E~8+hJOy`4)E?W>g4-pD+ZD-aK`wMopV$@D zLR$Yrkq{cv8Kn$?=|q-`XBQp=vjwigl}>isiKgVpg6LY;ZvDeRh+UgrYCqmjX>L-Z zf?lmN2L&?6Mcd}hOn01((u~sl`yu(k+v>OTP5i`p4+tBze%#_)!HD+aPnPyl)%p|J ztI-wQ(-4VBeZAmkzft%ccWeOJu`h)NUT^!($@WTkq!l#O!_e7|rdU(j%?WFd0O`m+ z_vV37TDohdTnm*TnrP4ox?5f`O#F3o;DaKL>QUasZ7uET2Q;JbNNV$);I2NA(Hd3D zoC4{o zFkp)4JkUY}L&{LY_mU|1f2($NQ*j)Srn!H|U<0b#q;o1*I>$(IVE$pc+8~!fALFw&P2! zt{C$Eo6LI1qRsnV(PU~ovTVKwtJNF~O^vwNIQA^7D5nv{kP*yih&+}RN{G1T1lvx4 z7aX**Vj~sKQztA2f3T_)O7u?vc7$&j9!tEk*x>ItN$nv znj@>LcGdump0DR&)h=meYOi!H? z%D8%dDP7X_`QKz&<{SUb`D{s1hO6X=1Tg(AqN#oI(m-s2=isA)03c?&h4euK9EEJm zV3%7PUwBh+AiGPKtl_5+bOyW5~DHnz|@j!Nk-_PUH=$h)ZGANGiSDRK5EiRV| z)N{X~vEj>_2y8NF>*y5c3;#32yrVBf0 z2e1mY=&s21a>Ev?>187zF|(Zt6iY50pZD3M9ugt=hK>KW4Voi#q76*Wl;&0`h4 zJI&gmv%O^;GG7kOTNtamX2cJAM*VixjY*!^b?w%7y5xTTQUv5bf6chJk#fXKGh`o# zevO9ZA5cWg>xB&Qf;u`?3cwI*f2tMyRfocsi`!#N@hRUNA6(pbRD+te!9^3+h-&Yw zFMo#48}uf1ILIV;>_qAB5r3nBH1?!m9b1uA3vwOq`n7_VOFMkiK07rb|4}K;(b(|E zWacpX&C<|K=XO*le0VDBEfRP3gz*WANjXvA_Xy%~b>?RdXt~p+XqU~9YA=KluYxj| zmJgsrVk??L#RY;7{DkaYqyL7xdJ%j>heIx@^+}))Nb7_*)*^c%iuDhvltq+mot6g% z<{)*)7R$R08j2p*X^uPTv+f*CLF6RUdY-OHNwx?)Gf)xV69HE?o>4-;Hho_&bJ8gsQ}f0T0Pwv7qYma* z&sr%$If-BD*UZawG>Qff|AO89qM*X`BCotuD zzHTlZB*3zpuegJ9XPkHhn@_eDW)Bau?W0!j7_wi@0;l}rju-Ts@d@3LZ1&TA}#sx}0%j`FJWtZe@1-M62nUh_HE zt%xbRLg|ePM>3geiR7e?ToJ%@=cnomy=NFJnRg~~Fo~-|(m%~xE1cY5=DmPUlfJmZ zI)X*@YWzrWKO%-#DFUE_&5+=S*RsVMK+lP=zEs^h_;=dI_Qa=JgW>*D`fEs`l@rn$ zq@OXe`x$lD2^)FL3r@+O95|;6T~d3~(Zs&z5S|;_H_)Yl*3m#Tx=zr^Mw+gBX5mYB z(JGm1?)!nL)pRYzsF*KPdaY2T8SUygg)uqdN>Lx))uBT0Mj!!lPagz7@c+}f^Ut#MrijNX9y?uoG%Oa z`z03V#n&!jNpoFq2GIQ5*u8Bnnh;Nk$N(Cp(26*G4^g^+Ze|iXVMCq_49CWH4S<#v zyWh?GG=MQs&k|8{e`vPo&#?YK(eU%H2g7D zCjvIu&U|1iG9N)dS_4Kz0I9nT?XXqiTf?*h_RTrex_W?Ec%C&^^zsRZedc6=kt&6m zMfOa#Z(6V@`(Kmm+P|sZ`_-1SPi96A>x0~g-JMQQrrw1`#&1)GyLC|;mN!RDVoNfL zqUU0s57=MadK@;%GCS|U{c*`S` z>ytEIOht6DX>aYYeb=69?7Ut&5KwRhw!~Q6>xahv>IUq0l%MB9-n>c;L{nmCwKdrSL#6`+UjDRmq!*NxoV*NPy7RU5Y^yvF#hv&e* zW-p)csTkv2N;D#V5lTb4KUNJxJiqr+2%%1ajv9jQ-fkwA6FJ$)X-V#gwz;$;X4gaFVG)rI4qK(q`jHPa(Iq21#SK5nvdhToEZ9I@o ztz&Pnptwaupj%fqyT~EBdi3!Gifg^CjT# z?!m_1|A6|F7&Q$ex6P5CDWv*sFUxemntZaTf{sd|VVkL_9vEdv_Vz13uvIR9MDC0^ z@`P=L8hl^?2yYEbjesm&6*f=^vgJ5Y%}?H}g6jY)7Fu+7gQ#m6w}B5Us9*=YU!xW< z^Da?T;4Z;vs2=X_<}#o+ef9ynTZe#C(1Bq_L?15A3^|J)=PXjcVQRPDRUmUZ<#6<6 zvp}`gXRmQ{JX?`8e0W#MHk;E8>tKCYm=rIZVFVfrP| z4w+>2yg|2|5N7p%#5SG(_W6(eZvGQe+Mdh z5pCrjx_kg&-+MHIwC{e!rQtOf?5F`=X$u~`Q+HegkprS)gWSebZ|p8p%G#~|GF}pYDN`frGhIQy-T@+81^Qb!yO{{)FgwvoOs0T+>+TVXrUj zlMB&HX$)llQ3ZQl1iV+ucPv^)PXK!wT_wl-plx%SwC~3MOo>}B?lU?(QF0zvPW0Wgeg8Q{Cv(Jx z0J$hJFt7Tg8aM_ZoNIGeAFKjCxgjb!0*_lHPeRR81z{9AazbU0E7!`pr zrJ^2`h@QWNbGS;|9sntyiP9+vvk2%&nxStWYvbL%KRx>Oy3Z**2V3xW3A}5?-1qTN zvytSJv#&Z(hyKUv$eqK1e^<4p!`-(~RPpwFg*~GiIntb4TRDJ(d=;FPj5c(OhDx1k zqAZelx)%JuPGF*~g4QddFJj>S!iw+#my?13=Jtdv!O3;ni`;qaVMrQomx{P&LA4sS z-+^ksrzfl_Mcx98tG0x*qB;nDqQMZOAqY2a-^6=(OIwOQET-bq3PBnx=$$WyK;iAk z=2sYE)T2+3In?os`IUIB^Fq=PWFymdMq4353cT0JHTi9q%!O*cjEyy^4nuyC_q7#8 zu-#I#1y4#C>ZMK#nL(^aTSgHt(lIRr0Apk?`=h5oRN#)GwImH|m zzMPC|^*Kz$DRMcN8Tz-Fqrt6h(YkrLoh7n!De^^8?8W^pHP4Y zTbS7ZadX=EG|!OO$4E`=-w2L&Bl#pRjVy1Q;~Y~pArNlYy-)(9j!$)spJ53olcppg z%9AUkxH3&GaGBc0TUGyV!2j=4*_|8DCK#;gF+&Jgl%JUG<$`IN#~4xhu6Mt&bmgbp z`Bbxj9JPDkilh#GL8d>W{;4&^)^^?M?p~_+z+t~cDu;$A0%DV1 z{w~-L^RHeHL|1pyM$~AHB9>P1>o*P6JKkk#?f~~*lm{(7canW;jZJ>#nSWQ*BvbzW^?0G{QO7(jW|FRqh>LMZ9L%mpVjkA{N@O`aV!cjwu-x{MP}m_hcVau3T8sx+%Q;xjOTc$XAfCoDzbRa?YY6EhR#09`K2qrf3f%>|ol#1=mE+ ziwchi&N)eTNm zzVQAk2Kw=dqNYwbvU&9K6vqk|4_ro)igWxvuE{7Gz(|$wpDSg}*GrX@KV*0Dwwvts5?5Z1mw8;q| z+%9V=C#?p&Wgz1`^$e4AD)^~5P_#fYU7-NRn3o&Oev)6xoGsna0)orQ^&sW+?V-U= zh}BBYZsN2l8|yU0L32AXPKw!r+js?7Ca9RxUM&wz8eu*Tv z_R*;YRc(@?%hbZb5qkVBF~ipMOf4^xssyWD3*Gux4)fGCEz24bK>lJ|k5(3i+aH3Q z@vt13=6d z>|`E^D)8Lm={^{ZOo!#(;Bm`WVo`-D;}{|k=F2{ zUD4?m5R||S^A>~9VD*$!OOdo|bBGm9LREd)%0L^iW{n6Jy4fPZ6OD39p^y}Yf~DwC z<{L>WJzj6X@3cY=~<kqey?-WE%MDqD7ptTf^>+XxRY1Mp^1H~9 z`8~|`@r&jW%}s3~KIrVxgRo`}-tHDt@!hE7yJ%&xTfm3qD1#^mmd5JjWtj*zTw!?| z5pp~#FF)EEh zQ{wBncMC&dQzdsP1VgoL`Q+4nz1`Ejt+aIK3mMB1K^)# z-byg(yT4$yH|$>>*NaV5RwsWQ3arNPWN8`}>-lM-%jq+-l#-(61o9JP5ju$;4G4s$ zOa98yqntafqO`y+?7raQu|fss&*y+nEo8&W`cDHfG;Wh<^*$(Tb?fxvzQUqdV|D-m z?iJlEV0aHc2hJt_Ye(I>gEHH7l$vZOn`(;-sx@(CAH~3!YG|~NW;Q&gA4>GKIHer!Rq(pV07U?!5u*u$r^-bvTI?`i3TXxd>+BIo(;#fbF52UcRz_6YhpP0p z&jY~qq%PM(tOHyJ+dzQInxKcJuZaz;YkvRDVs>(^#omUBMehfkotD}jO#?R$(DV-_ zy$W{=Fw^&QVFbfMS*(fNF2Lrd}S zrF8I)#;G&!eY#|nb=NwMrHCNhP=@qt(-6H)amFRW4D|NiMCbCxZRD=z64U+DD&`s; zeDe3#3Or^a~=wd;yy`L zGTH|ZJ^O>6flLEFM>Ox8iu-xg1LkMjCdwc9Tjy)YNU@&mAMA^yR@8ba{l)nvr*tzr zV@!0{|9y2Y+uQT*HF$qQ>6&sL9>S3=^uL7))fn}B%VR5;PZ;I-&&t*mrXF3r`nv&C z&52eIjx}YX8RImb7p%WaZu67dXGFMsvu2F$zA)>Tu_% zpzodMyZxM$J`95H+ztVhv2#(Q$w`H<^nvQ`>-SDWtqU6LH9W`e{D{Lc>toxRX#53Q5mk1E zLi5>m98p2i$owps-7Rw42RD9`%XN`6*^f|N9yr)M9IRUk_o9OU|I(Jq3D^$(E8P7v zUA}@J4f?<<$S2M<$h z_hP2S!rYL>>;xJYcnm0x+8UvDaU1~rQBL-~B_IH_Qq&4{6BGtr{M~j=gM4Swf-&iT zTc`>f*f-Ab9%`9P_P|S57-~_lQk9VZT)NhimLMWwK>?qH;NI9NRAApk2-=+^om(zK z>HrrU_RN&nQE4lwv2mm%@5U_X{YYRF8>5^m7B6cOz8yH3+}^QYjy&gkOGPA6(FYY& zpCjgSDIKwRhDtfPjk6k5CobwD0~JQ^YV7z@5G5O@`{@|)H*@zyg(I0r<@y{r+d-mD zYV7)=K**-oM9b;|0K#)*8A1}@248tZ5lSUqx1{YLiSh*o*9d{_M&@p4zy{zA!EM2X zsIB>hnjShC)@tOm(NUdzcU*#uqJA@_Z4ra)YUuCZZ?JJ?sKSvO+MG_T7Yhb&N4m^^ zJp|R$P15hH>KDbSt9Y#909h=4{A)dT{&8{JVm{K5KD;61c|&>4p-!NQ;Yh)eqLKNj zA793rs=?uUZ|dJcO*)-OMRI@nti%=O%bXCJ#D4Xgo@>`}Hbblv=Iz1dz8M%PCa@6z75G=@YNtX==mM>vZb?=3#mraf39!8rrk zhvz-~0}4Q*k;Sji{8=M<*XTG&vc&-hQF9i#wU$bwghpd`^Fbgoir*HvTq*2kU>x3f zwW;*TX-q>EdxKVv40i^EZLcVUwH)7?S_yA>y{#`X!zY(mxeI+p8m-oxQ2jM2Tl{1zHdH`OU-1sVPIEB209XODp5*6r+3WOzyt_pZEs_@ zXIH4F4)t9UUof%m2v2UkS6RC^mr+rz4Or+bwl4~jRlbip7$mWty;T%Z2+DLzO3#z_ zA-Wvr!lMGRx^5k?OuQQwAFJ@~1~k>;eL?v8x+paK64Hq!NZcT9= z{qFM!u2`2;6m}$e1Sc$l9SCYVg;af}Yh_a;_2{b)JcHtBJ}CAjv!`=@o&8-Rrc%^) z$|@0ccN~*jrE)I!^78PDqN69MX(QMt-BMN|5}=31{OG{e=1T1O(8j+hk;8Y25Klwj zc(b=>pb;GZnQM5%h0un6aq%hSVE9OFNr}mKr1QpZA~&3s^oXS_LwXr^tbkqpEhz^~aBkwBJ{c!lqU)dmMYr2>Qg6IGSP;vm z*|O;^nA5?F)odtyy7QchM@il0P|7ERQ*ut?-W%Jb45q>~ia_N~x44Gt{YCw^R30)1 zoYQO}T~{oWNqqGc^jJ4&NS}06Qm*3~=EH(M(7o>oVhpuepyRidK(KeY^TxmGE zgvt*K>BJ(zAliVh2&q#{yTJfSEzJ;obF6pimT)XM5r%E1wK^`V^7|Jp=3?y;#a;oX z1z%R$MVSnJ5X&S{2amS6krjIldh;G)CVEHdv`3-Q4MRd9L(uarNpDp+%#ncdu7iw1 zc-P0Hz(H3vahwnaM;Lv6Hg`1llh`G6ldt1|k+KNZvA><(TI>d#Wrd;^6UFm6{>qmPe%I0dQehBC+Ky@6o^7(9*_0YJopf@925bhfHsp zV>OsWM<@#3t#MAIZ69(S`{GC8Qhfc;@pFfA08j9FC$T|GDlJ?;^y666y4g;XN+({= z&rf7)$*JgL+1W6x0VzXTD#u*W3^?YAqgpwrHdLE)dF%F9q2<88yBf17CT_i}H}EuO z8W+h>=Mnbf&&r;gq}b$SK9UtEI$myzC*Kd0tRr`-@6D1R3_KEp%Oa$5-wvJg4Z{j0 zUdhJoo6bXPBNKo>J$R#ypF74!-@xHTDMKodU(cvZ4WFxSG&^7d4DCo=_K~C6vshUD z6nto3Q%9{^-YI!)%NiJ}qZTK!li3g_`3}T5iCCS;#~@YxGJqqszf~VsY5OEX0+kMi=G4!%DFl5!A_=|E_k~rNPCr{biwYjWTXJSxZ-{5_IN zfAPG=7sFq`%GUZJi^bPmzn*CNnx*rEGRYM50F_Z`vh>M9W6kCk*ZmiNYt0y z)=K2caJ#>chqNsv@3+TT{vAbOXnwCedDQkm4br+02{NPFaPq@&_hA+>7mZwYma<;j z5p5+cbnLxK;$CV+Ny8!P0WnPkHbsi~H=b%hw><EV{@Ux{VGx398PSHj$U>5h{PG*e zYl;ax$H4pmNrUlYe2j~iLj_O=%^*$sHo!G2FePLdWmbGMumeJ*{iZz9$ma%tgc-dI$N73lzc_&U1jD&sQp9m z3PpQq8!x_g*s0fHXa;Gm$IXPTI9BM?0Y_f_KV`#nz{E3IF8GDU_!;f&&}Xz7{bTT9|5n>Vhx*9ukYv` z^I*Nw@AZm=S(G>mJ5>qv`4RO+{JVA?CXKxm{=>spk_XXC)iyuH^jze>oUzEXV7 zdv6Eq%}rsvL;sa#0f&Lj`j737S7tScl<)P_0*$Fjb=ivkon(Vde^i1*16--HY4mBT z)PR5+Ict@wMCVimC%=z2d6jof8OnYlI0py*Pi*x1-p3p)*py%&8F5;i5H;lXNNd!8G8pLK zr8U9PzdaxRr9UJ)ae;fn(@#${tZA#d3CFc{u@%+f5w|E&ck(Py-QX2t0})B&Jy072 z!YFSaE(wyQF;xI!QNW31uzuUESRi!i1s)<<*rNd1qN%h*{-YW7r@+&G4 zfEcASKX4h(Jt$7lT%->AmDAp&{-01Duma(}Oprqg9WrA^$Z|8fug?2Gt*6pvHuGP z0rz$|pi9Y!Cgwi+eQg(p_`6&21aSO$`wU!GrQ3O>$vZjOyUIrer{x9LwdbUKi`@xh zuQ=8hTWznT?hHPrTeq`MjcQMU986P;~j!>0$l%1 z^=G?MBrdZ9R{%YwM;)rN@HJK>4$MotLgdP<$jWRaGW>R)kIg1l1AOy$$`v|e3|ifz zi5yWpG|4Gg1(-?1)yInky2!kgZlb2WC_ApXuPduJv%YV!-&Fj?tti#T*g|OU!O5K4 zliJ_dj~Rh%F2J*Ev4;q)#ny`T*<+ltY8NQ+j3`ItD_F<^!g>)%_PS{Z-AaxpmYr0X z+7G*i8FA;8)l@dDS}E7wsanW(qvb{ugvZivwS#d?8B(VPEkLB03P2ocHNC(}GSF%Y zS2-;>xX`r-U4jW5+jOe&T!;fW)$V%$l0Zx0KZk+{WQFlAr`_0{IASNsW;ND%r5Jt<*GQ=i8qA$rSIlp01vH;BT8C z&iQKkAaB*bhL2TL0fqzq!v+TE;g3V|>a9>jcx~f@ki?bT8sRn&4a+9a6NGBYdR;PP zKG_DS<0w_j?!JgQ@Ie7$v#y3)^G`jG(QyK9NX{;%b1O90-3$qV1fTZ5&&FdQ)|YRQ z{|-8S5TlGXGyDj2-=h`u^_monPCeZQRnu-MUlQ=|`$#%57AExho_4u2e6Y_Fu{~Ku zj47K_!Fstoltf7i+Ul@X^A5#(HM>ZVb6C3Xf1V;Ylz?p1CLvOWsL}A7<-;hdGrMid z=J5nJi6(FN94U2zrPW0#Px95wlMz3Vk5l@Jd2HlVnc%PT#dskYZ)28jo7ujQ2eC^^!9%SN#1Qmf?Lz0J%rdF|o$mL=1Xb(A2S>0X+6 zQQL;M#I41eFT4D-Ur3l_L3BpnHSiDxRW0sVx}pui zLDC9YEDiX&7Oh4#{5J~)(PS&?M3myN&;VS$+zEOk%GzP&B{Q7sV&%eYGzp65Y8Cy=v=*vgA7tSYR zH+V}1n7T91BoPIiBd+)U?J(nb1ejjKoEh@$T}8L%w)%eoDQ~(nZ4-;c`m1xyJO7UG zDCR=5JPb)ix3O7Lii0hWJY3>#DCHqFhY_jMv_)i&!`rpA-H~XUzbNDjqQFAdY)-m! z2nb=ggv*pmLAwi&A|k*X0F|8!hD)bwyIRiwI1qc;~O}lfB{S@p0tTnCq^9?Tx_%I!8k?$kT_Qn-Rfl>W} zbZ5H@4C^{u>x{TsfXWJVkcdgY8@xGau7rwzv?Epn(9b0GsADW1&0gp-_(c;|{BMa< z`*MH>_<|*<u8viy=Ahi zCDQmxILigz5Y?EDS|Zx;O+Rlp42z3kWL)#mSPK^Etc44m^t@i5N^wTbC@!0@FWstZ z#dwcecYDw(T-7iP{t_3(d`g?-8Stoy-O$<_w@G%ymHNU)EP?CjIsdYdBwCaGUQ`%; z6X|oH#uC7n1}o%cHv;w=yzO2_TBc?G6mXk0$R8AXY{U2*X7kUx3gEzy2j^xmlehXC zfv5naj4a%58Zef*!meR5oylo2PJ{a2Y15*5Gg@^Lsv^X%6SsYEUy#oQO$TZ+gCT&Q z`-9Gy*Yi?50@h*^H++D;w-wvf!E3*GTvh4Q2bllhpA7lq*{Hcw-UswmIm8-!gV*gv z;vQ8bH)E#&3_a14H4VaFdD%M$_hdSe*fiK~`J({_FA_9Umqid2+PR$Uw?S;kA9?A# zu?YEP0w?Sj#lu6z@TS@m8ryj57zlyKsg9!8Jz8*ClQ#@NLn0SFn={3e%?BS+FYN|f zMg{W>fq09pWGCiK$z8GleW%^XU>1+S2W$blbsg-qE-N)o%4)iuK1A@h2Bm;9eDriI zZmp*U%;cP$ff?Ka)7tWQA>Bd6+=~#{I-be7J#CV8y616qUu|PHCE{W@ZXKPx0xJJB z*QLewD>u5`6PN?%ujbK-7f&g5$?%Ss{zSM-2OcPI|01XfY&qQe!~h@3{uTI zC5>NyKAOiPr$=CIbTs|@TVTB0%{0gPhRs(()@PsiahXlprB{hfRu5~?)*V28I7%cR zWy5SV_{{ht z2N!8`f%TjHXAId5Zh2;Q<3-E1au?>=W%!--eJd^^_3$P_g z>rBwv@|qCwFlPAinxpwUuF-R}E3ilS6Y&_A1!BS^Ma>rvMmij5I~V!FpQ*&EYhqT* zQ|^WlwpS{)KaicIOV zEvonuEbATP47h4KK|LIPrg08D`LP|$=ktlGgjM1;VfVfKDal`?Vn57}AZ}|S)KmRs z7KG98QvLf*S7IeaIt41WhR~$5Mt_O@Kp2(OeFC}E_C4c}Uu2s%CIpD0!XQ)R{U)@j z5}YPBV*6fV^x0x!0L+GtyvwV3@OSarEDE9+KMzAt`Qs)*u_mpM7=9y-6n%t9a5&P@ zQ&T9D!Fodz;s<-G_CqCcdEvvpe`=e}g1~M!g&+ReO|SIoQCTeb;+h!-BYF=}kgIlo zAgw%fKKTCqHKgl_49yBY6rPR5SGJLIMff0GUZRBsuuXP^1#j`hq$$Qfn@P(X^L7P& zB#+}d7mNed{|nO{hK1fqgYO16)s;=yzjZ%I&>0Y<-X*^w$BkgrnMiP|K;8aNfVbpW zHBg9qxfd|Xuw^uBuF0ywWU%A3o2>=|tX{FVQ&y`^G4X&FaPa@W^U9SAm^Wo6ArU_> zbC9w2oGbqxvkv)bK==9H);7%T1jBr|R8X%tdbJkz@XxT)(r<<)LHw?$WrB>`1 zpMvn39HD{_&UX~}njh2JQaJX++W}$$(rHV%C36Daut1b$3%6E0ZGE%YE@VAClaBld z8Ht($`=9=ot?FA2NB2(<1$Hs-Za7PPGaZU0*Vxa~G+@tn;f5&K;5WC~VX%y@E9~$M zF>nO-M{8dg#pGta#yp^pV5NU{!8+QHwbUJ(7m31-g!as22_Qb!vXr#;EEewcOM&@C z&}V^hhE$NJ2Lkvr9Iq(A?P;^m4r^ore0fDdY4@V0N-8CQ1yP^@%vc!0;@^*z1d(Gj z{aMTJzsX8Zcik$kJ;dfn@0}!0DGNbGkLrl}MF$1_%?6T5WibeC!~U7n$3rsOK}6L7 za3{*X=ra5OZyjUFuXvhbL1ZkNQ{h;!8{iL!DXl#<3@tww^HZr=G%noK`5&ZPb>x7l zt+H3&>xNw%ep~{fer~cRQ|N6Xl589=`JJ=x{p)$X-rver@S?niZ){D8%VLYJGt3}k zbr+KI{4|kFqXoOt_-SxLbWvaZIftOI^VAASQ^Mn+vdA}b%M8p&(XijYiM5Y7Fp_EZ z&$-1DjXdv;^+o?WQPba^XbT_1#G+@4`X7wG*?O_EQvUds4+CffuSJJ%s1&CAoxI;22uAN*{&F>~vU|;b|C$Zg-c0&7 zL@F18wb$fyIGj_6jZTYFBdXqGb7_Kv7+blrD$*`-nysCz`fSK~c|PBNe8UjLH*|oT zzkLa%BvKxzfUm4FCUQ{?L36-?FS53iINH3Qp{;?`RMSAEccnmkxi6l>D|xaU;ojvM zTsFma=^3ui`9dIHx(Hsuo*kE?aQ-7Q={}R~<4H7Dx2uje3{GkhL!h*o?Y@U}JgBd& zWEqBzqnYH3m@Wt`>oct1oLtn&GPh@TuFkGBShTuf1I`pTihkS#uHAW9$ zA^Bnstd1Ks5=fDWv*}%@Wjis0`xbkpktFVi`#ytN9MF;D4?jx%D59OU_&(C{%4J)6 z*IwW;X21t&fW>RWM5J4*FTym!;o0a*4+|a_+^|mug!QfiT>tF>9-1L95bza|Xla3+ zpf~qwr&Lk2r+124UZnjvKd>v97o#4Y1n<}lAo|HIo`lRZdbKs9hK3l-5&rS&A8boO z&rLw=TEl_S<(-fY(aVIto?3V9>u9&K>{jaiR^aTG$?nNudOKqMp!7_#nDX=Qf9-mH z2Wv+suK=E#?c*Tx+Sgtm6({G1U0xD@l!FbP`!{7uRYkh-D;J!pr8g)jrc-`i0*%x$ z^vgRJIfBG);$4WvNHfjLGLChR`y-YD>6cb9XL0HXr_Y1ry>Z`!QaHSK2|Sox7){?Z z>?UH5vidZG{SjDO4*ui}h%&bbBr8(a9g9ea+SH1}urA<|5)NgnLo`>HSilu<9{hTb zT5j|035#}4=dG=Poe_>i9(uz2n26J5wUb~C$T)+cR?U#0J&HLOfx2{U8sl&Ev~)U+ z)GKd?N-aIrPfo-#+)ZSl_`)annc43;+jE&+*ir(W+HflR=z5O~fGt_#e@`!)l3}{# zC7~FaR$r_l39PE{Hk;RM_HBIHZLX-PmRk4t3V7z6(v85C@Dch%+lMa_bA3p+T7fOx zSL(?9Y0<8}@StRt_l%R$Gl&CP)pZK}N(^$Iq6)_I6rjIn+V5z!-1>D*R(mTwhP=@l)w+=^#3P&(pV`Ohg+B zHVJ?nQV$XP&>Z8HYAnRBulF=vRWTJ$#S#0}&FfJyOSF9X`BR`Do02$%CRwodY^wsx z<`zrCc(kNfrSRVDJ^?~c%=>{2`IZLaMX8IZ0L0d!Vzncpnj~+OyT=3 zx&0BtmRLtyavkm^DOwY9J5YJGel4OMcz~zdU*h%Ei4F{a&=Z_|%rV8a$=;XWw-uU* zA=MfXX$EWc$#DAh>{icC`aME?E|G)f0!D=_EXJiOClqM_<4~FAn zNlp;h`qf!3aW-pto=n(3#wwz{2|z~cxq=|loAL0O1Zg4khF9YqDXV|w)xaNoH=2jy zf!dLGc`z30ebzDU9IBMmaKXf83-+BS(hB&8lX>e zi<;nX$%u=6rKCbg;$?=%b{n-dP%yNhBkoIii@0I(khMq&7j#%K$tyUm|9DZ`SW(22 z;V!E6QvjHfMk_9>u4#z9HO|A%1>c%@!)exUO$4KNsy(#F0R6)zHp<+z3#@AI#OM)| zC}=a~LJDtCPCX)=d}}K$8SH`9I))6D-NisCN1c!xxjBiuZdc28@cms)BCG$&6>qrn zHGYG>k4(O*9KRG?{AE<*zl6l2$;EwJUo&bZcUCBt1d)niaDgSXcB~p}2j-t^cp*;h zUiHca$9U#<^(sgMO|b;;!G5_8W>}!0Zoc|U(`ozKU4Axd^2PG(pY028`{YRY2}6Q5 zS#KT77r^L1LO0?zq3}!PX&*t zQn0T#TXI+qyh=L1SD`Y=rJIr>5ee7H(8cCYE!ia%nez zo9BXkYXjKH7HvhmRb-htajvB&C<2?_UjBvRlI#eYYr>0!L1omzcaz|5Nmz3%qP)5M ztTd=dk~s}M?$!-I)ep_oZ_4{JkEE3x>{&FkcgsyUa+%K;_2nk)#G`&F=39@K3{|YvA3^$nE zL`&H$8W#;TCi}fFY*>z9^b8~WeH;^yq`BTim=&3BoKsh&tP@fRBv}JJ+Rlzl*xm<}WIX@;|6HpEtRiELcHt8tUV&>3 zkx5y+YVX6_jz*<`N(JBW3kA%;Z|%?@=WmqZ2#O#l0XYbB;jju1mU9$+0HaY`3j` zQuv_G0KskmOB>5^wVezn!nGLEaryxsn-{UPAsOQ6J8L|ml7=+K2|R|dtvJ%8b|J9r z(sdfD2eoR0WXA;2Gz&6KGUK7==#L!YyeN#*o>i2D3%!8LS*@|@8~%7LdlMXr(=!KP zfD*j6iSkZzVd^l!8F|6E#9GVN(U)pl^xHY#r>m#NKm%P5hV@XdMGeDP3OlZaHO-6Myuj|0oVQX7^?DHiI;U`?fpaP2( z&-Am!TRzlpV#VDh=0anZi)95VI{U4a*Q0hY3~}Kl1-|Wrg8;Ntvsx+Yx&-#KqS}s+ z%{u*jSZjza78Gi(HkdW+?ko)LMQ1 zmR&ygr0a7Eu1h*|S60gXp8a{$>a7=#@ai&f_mJD?pW;KUD@rOow@vEKpx`H4*U*@W zlZJmFo*J;%qGhPyk++wNf)MSH+6~d^Dsrt5bxz@Z0sK zDax%|3-dq(FQ70u)=a~K!=2(-I;NzMq4q+MLTI66he;t0=DQJWgq}bQ(QmAI7JU%F zX<4D^0=){L60Qq~*9^>zW6HAB@26@g+ zQ9>B!$cSh7rjoc#^fypfg)Skh7{6u)SF3~v?O9DBIIV%hqLpS2px#&p63S6ty}hhb zRXG-t=b#7V6;)4WoB)D}ZSVPLW*ESF`|n{!g9{`!sg)&xs6P4PeAjla5N@XA2N-sI zWFE%lWqM%PyzdETSwC8Y^-=hjeWe+hPOfNgH2*&3OiFzm{(_sQ@4pyz5NUEHPT8{h z%Mq(V6`DP--a2phWt+rj&*NA;Ch<4zyKW_Eed0GzT4_l-en*mQU(c9K$oMRKPXg>D zLz+u306V+)p@IYB)~)e-`AMCKCUI7>1DdpdhQsW1FP@;*2Z501l5A6e44nz zUUG(B#lAhL1h^e_d~^_OVc4!ITgG1{IcwBX?bv)0m~_a>l`U(qd1#6gb83BBEu7V26{Hcq2Mwd*oR!Qw_#}rv1 zuYhkfnO>)5#Yv8w*%C$^*XsjotvNagXXuoCE48gofwg{bn3Ieb-K&B%VJ35^=~9q? z6Rq{<#9Y{S7w)`B>{0GQpb2Tc{-`k+53zzpC@uGdzV{fO0+ZX>vNPw=6G&zBU=w-~ z=ZVDYyJ^$UdpLF+Ye2|j!vi$}%6N|%_Llkr6MCx~t3(kY@^GSOz&)P&%rLm@DIg65t8PLTIqFsYWU*Ih0F z9-GJO@5nod8^+EZGwVWq*`O2y8>u6_6~g4js>{`L)ay^#n zsF7KGIIS2oobYV#8zI>8$j+#c)|txxAedQ5x-_--Gt@lHhlaf1Dukpy8W|UqqBPe+ z>8X`wp?|G|-QdGM*&8!0h>DH*r}#e(JP;}V3{-p-8@VLeu$T@cxKsEBFdG;-l?{Z< zOn9tk<$rLb%w1eZP_QuT&#T-5dZ_Q<2%VAWoIDJCnZ%Lh%7B=SWi zwhx`$fKC$NIwk-=4V6}X?#DC^imAEPF`b~6K%t2(oN^H=$KjWG6_i|#l1Cw3;O}}* z*wk1#6|m)e^>=H7@PcRgF$18hJ&GnFz?oPo=u!f__sbC|h8s=vJvuL?U8WeB?JCTK z3DbVG;Kcy<#75t=qKC+7b+TT7exg9~I~8lhtb-0(`GN^#9G+ zW9U67#g%8G$keSa4&kNmRaHBYoP#*ewK8 zCrk!wG0BH+>bGI6wzQlrxdMVHz*F%WnFB$Z{A=1n%olAg4z@NuNx{Fl$CMT@-R}Xs(V5%;pxol-TK?gLr6AdFOWqU2mg(Xu~H8pLPL=l z^=uch_@b$`bnNNTLYETIdXp$%(#M5;SzigV%CYicalqzXVVz^LjXj_He1RiYqpW@b zd%0K@`)Tze``__D(H0xn8T*SpU=kBuwl0hy{jfP&FEUAWw=>c`-H_L|zURwE4N8cDP#{u2|%?%1Q*VSW8gGvbNoedpsJU z!>~+d5{2nf#)2y<36LOGj=viu_fYVTuX>9Y43!3ZY>34ktwy74N}-Y-`cF!??fA6X)4q)Qu^rl~629S#LRGeoJF{aoAY?WwI ze#)@^>%C*KwPfzNVcN7gGVcit0)!qoah#oi?AZg20tSboe{Ee~bDG<6)n^W{70{-p zXrTR06DS{3J#dmwO1K6Vos`Kl+0;uh)+DR zUySseriM<*UpmM)V*8w;U7Z;akzpn~AoXTFA4sx4wyVDA`1^gOK0i3cF&i7%H@e{~ zo8a8hP03SLhe*3m|KvDfnssdaExb}m>33Yuk;q?VY%?a#Wj|M61l8H+?up$MG zJMJht*u)u;VlC@57ee8~ZLTUdTPKy2$}NU|q;@dLW0srb%D4qFoOIW@rVMK}x&KmE z-CtvU`EAldA~u}l5gtPp*ld!~`qH_BOmmRV!sDgG?$Bf$C$b2-l$;-qNOGCya(Pg3QH@~$)e!9RR+veCA2f$z0eYp_L) z2URDxqy?H(Yc`1u!9%d@0Wka z=0!^Oct<5NiV|e;>1RiEItf#Q9*jV=2fM$yR$7GviT2H3jX*Fq1L^zaJ}_owYL5wV z-K&-R^StJG6(6l2h1I}fq-0N+0o~MaECM^Ywm-j@(`{N<6kxnlPy!eC0^oAm?p3Mk znx67i)%Aq%S&4hV*DKM!>O-Gzhrr(j&smCl2%=m}C4Ffum}f^FiEHkmPyID@{SrT& z0wGabTr&(5Lo(G;5R5GA!yc2PBdNUei?z{=@?H{LaVHx1$Bq4g({4Ucj10!x^>Syb zP3wk!S<{}Za%G>?s0UJfr*4G3@AW!sK1D<8`?k6n;OATQvY3E+BCF6(mB6!ly*$IY z*%ug?;muUACl(N1xX<7ECjBjhwn)9qWO# z`nhPYm0kxp6BJ2);U)bjQ1rtU$mbo>#8(2n=ux8U^dtVcxsGF^?=AxsN2X^$thCr+ zul>QEUY&mxP5Rk;f7~v!;I4iz|LWU#s&esj{5m&a_b@kC&#?2%j}%K;_ki2gbCz^r zcOOYFyc#swFuNJF1=|3!eL5RH`bK-g@M03w2hhTIIq*FpbU=w>Q~7#rsnhssM&Jev zB?Jhjv_&47^$e$!f9q;003AT9gOFA##?w!KVuLP_z9vSzXMmHE@%5Gq9VQ!37V@B% z?|Aaz(*QN1|3G7=;uHJRQcW$VMa%@3G)jhC*iTLOlO`K^A$Qw~WVZ=pzM%hq-qvj$ zDHc0+E7yR$_@Cc;4&}A{JzKOo!U}C>W#i$AyDKT-&jag)c5K4Ed+nqga}{sq4^w+V zjg?yf*B#DokR3@XG|ol^kd5leF$geu6;u%e3`$O#F9jS*;@`S^qyouJ5IU;6$mv`- zY%mvJmmk#PTfod3gw)yv0bqy&mB`n!$j^??Zcw1BZ#=2?{~3;8G5*$%|FZDKZySDk z1(M6*CC&@BtPK{%b?`yie*Uj)3*tg{0I=EO=~d=;m0`Brc6%T9l^Z$3 z^#H2l4I-C96j)nipH4K6|2bip3(9;JkUnHLN6LinlAONNL=AYr zDpXZf*N_Ys!;RuuWic8IRmL*U=OdNXD}vTzgbRG5fH$ZB73a4yNTCXP@HP-H_+kri z_sa_5D*H>TZvPVQrZWH6A~v(dI@>>j*eWv2{IVh9<}aYa59=a$AOwf?(_UGX)^93> z{VcHWw#wiT;#G1Or3pZ7s5{2CZ5g!T!x%a8F+O5k`3v0duKay*(|*gnlc+}jM10m* zA?!gtqPuX7t}*!KceQMGQllIQ6pk32paqnnEp1+Q$Np|F5|E-wy1rW(F8xbO7aE~I zs9#_gZguaOMSl`Y;;_F14N#M79r3=AmZ1Ws5Z%hCOrwDTmy_-fI}iFiB>NBw+5DQY zXPKSv{u=})C9^Mz2f5xczM*ONN~Gw|>~&dHo`F$3W;@7m%!;r^*|^4OW`7wmX%lF2 z{C5SfgSU2J|Ip`R(!el73#HDtIJAd5@n3DgFIAAMOsL`CD1fB+>?-ZXSj8 zzktRb4kR{==Wn4gRbI;_f|ExsO33##1qb9U?(!NSk@Zstw~{>H0x+>qP!K8C!dJJ$UT@VWYp-|P@&TN{+O5XsQ(W@97NWoYjQ z1#w|0=#I-Q>o+^ri*fDR`r$}rQ+(KKOjLVkB*_YyPIvp$XM#2I`w7nGU=d~|7*7!s zQFhJGwu*iKryGo> zADPf2yJ6`ZtQ~iD5z!LuSHpsaBby^1uYyuR1RUu0_F4Du!`s?)Jbd`j%@3^P~ zaH-sn)yGDn3hn6dVpLtEBb)dMGK(l9?mS^^zTHXFh|W@vw+Pn%lv>bZiAJccK}=L8ajDWMF~>v~(&qqC5)Ee0X!beva9QSNZ<7uaFKchZC? z>4fRE9o@gGK(N4^vU`Dec%N+50Z8YI8n0t`7wI0nFNn4+MKmPGmXp@7ba+f~_gs4# zS8rHWO3H9+m^-?eX2|}MxAv%FfT&qq^}K*1PUu_bkd#s_#-9b)_cjIF>X??}a%+sN zS9A#%#U{$DsC-}6d7Fp*#r4PVjEZGZ&+hfXKWO0!jRNXkvs^ATW7|e|-(G{Xj&%PHc3T_|)3$K8k@MLUUV zag>gz`Jtw|e4krO{`Y3HQjTR-&F%XcvglgW*(MFdDGQg>kCJ>mu-;98=(vbAgGf;i z2pjoiW^lAwcpe7(+&j{0q7{McbbTK?<_SqMo8W2~Yc;Bw zq99z!k+(U*pY^&5b*lJ*lFsjN7=IkF1{Jl`2x?|wx6;CL6n|;C-3X0N+C!M2tUm1Q z{gXzfi2Afo5QE}W{E_&WScmx8(UmZ!^9&4}^=)y*3HiPe;XJP@%Kf0=2v1+#p4d#i&+Lqgx<5g$@(QNE=d>+tm%| z&GXYia<=h9F9Y(E)L)K(4<;x9@0IRl4^KR$VUQSo;GkAi*rm)e0)KGsmF=)fWoMJA3c*n7*N=r*ZBFx)mlgr8VGet7l>gv1kfq+$1#N z-B{0SeVt$6$zfLu^oyHJrRN zL?xIcf}agoYleUKPlMPqiCo&Q5Mwvr!dgrU4}5J*xaf^OR)L9ElTX$p??T?YkFIo{ zZZn(wR&JnC>x*9nU90t>fk}&*W%g0$jyWl=lQWp3A_KLxA)gj+0nFD_tT(ey`6q=w zt+1b~0Pt1V%v`wXi*ew2$zuc(y=C+Hk9j~6ks(4no1Hik9F&#zyuH>g$k0luO@3G~ zANn>|q+0i{MC=exE7d2Zuhr@>OMrH9(Ie*9dj5bxo2rZhVK5ZjUFJn}M1%ny+czMu zSH~8z*w-BuZ4D<~tOVO5^E>{C93Wj4OD-Bco?QV6`G^yGGq!=dkeoNXDj0>&y19JG z`N__1#h1eLUD^RU2v0~HlE7%F>t z1?EK~c>>QZOy>3)=oWK2VPJm*cK>xep*X?L6|0NoRI#yB;FROcVbjtd#5<=%l0yNm z1saE#nv1C`_Pv;j@wluhKApnPE@-r1Rw1Oxj0-w?Ewk^RY5PAUpx6>>p32aPkmtm@ zP$cEB2DuClsJnR8S|Ckv7j9A~x{!eVWy0_!<)Xdmm*ukk@>yh6je_=`jLW~Ax{{ZV zS_t|a#4Td$r$rsVnvu<~SF^IUCo-2VmLBE0ds%O=Y4gh|6JLD|qrXHne`SSQ+R1l0 z-g)&-1(1uR(QfDD{5yM8h;Zj4qWAB+egd46lb+ua|MTC(zuW(+ajgCS=nlAd<^T+W zw0F3!0B61*u;}X9PWSS|hygL_ zIINy(<>FUXpxZJY7X9C)WbtjV!zDP=7VD#W#|6My7SPBGjr69reKAvF+xjhjg+l|Q z#*6usgGnascKC(9S@`G8ucq}1potLUT`yP{3ziqos$W9*MzCjLMTyUf1!;B178zlb z%3Kk}vs#?3?vmmfk1Vb^5Kdk#%rjhX0qJdN>mM~woOz_-CNgmRrkVIUyDUmg5&w{X zrfMgiJS?%W_s+6r5h5*rdXF?+F)<&2{}?Ijg%sb z%1M_y&1%91d+J?M{B=0frn#QHWe0GyH?L;O@AWbQJO0=(%7s78Jt4r)-=p{3{b()D)x3ntzMvHX@K3f3((61W&JXmCIOk5(3+55tcm2n*QelNn;;0 zK4S;L_?DvP#)Y-NkGO~L_NjyZ#PZ4TuA#J+>OY6LO&Ec6Si1Woc^@K6y zrC45+Yhm;=2Y#9>A$jN7OE_x+IWBm3ORl_dAvN94(?=U-2geA4G;ZPi+{bK{n zO;}>LvFYd?0)U^n#cNYESHqM5wAe8n; zG>&_4)KrGKC~|=K1N^D{tT&g`AFC=4sazw!58o7}nwvk<#AsFH!S(AFi1OIrN@67g zN#_eDs2{6D*tzPQt}b}t!O}JL=P2_Co>yRMx%x}v$K+8gYd2$q3sa!gY3(?#1sW~+ z2x3>B0{T}NQCiL77R8b2_5#S1;~VT_vrP%Y0E^_UpsNy;fO=XLozk#Ex))p~ zu$J=uIR9mQpY+j%H9y8kQk{hjlY=RNMImBACrGyf1t!WA>m_8So9-AFM5eGw=2LIG=hU}oW6F!}7W2tc)4G_A zN(ja1C&pVLr^{h|tD@B}0`p%UlHq4z7wltwPr_VKZqlnesXK{K+Iw%C!zNsz<#07@ z8>Wa3j}HEez0oygdjEwWa_X^R+7AeNb7qgT&-=teBP577A`wGfT#x^ikK0WPq>!-* z%7Xs;n7Uyiz`oY|c4%dV9I*I5#Womp>9tM3nOgosl^J+Y54i8vj}Xf+B`#i;(QiD0 zm-~jGHQn$7R9vrK@|^xp@)r2(Uk!8OQr4?AdGut^2FbI-q0Ikd-(|mCLIoFYIDm`| z2e%Lu>b#eYsZV}E_(AfeR00IPZW)&63*%5aWY7=S{xvz)G<8(Su5 zw}yQ4fgN}#)^7O5lE35Kf}U>zR4a;`JXmKvLMu}PBma}=f#0rA?b~ZdWhwf0Wm|$i zbf)hRAM-Sb`xTSDl?w+lgBrZJ3dodob~$0m_sZK8MKEEF>+I#So+1lk;+M3g-pqny z832h9p?|FkKB+Y>U1S_w7EvY0L1c}b1+HVlkZxlY@|EJ@E7UV}R~>YPU#k)cds0sa=#i&V|S0uZmVGw2HPETlz;D*j7M1k_R z0p|oimxk!NbGiq&`4z(ot&1;vEvJ{}sJ)|}ILAxnze$&(>LuJ75;=Z~>6L7>GpYQa z;T1O6#f8Y`+vdho(C%l@Hfrn441FrJ)EJK^A5u^(KLoVW*~Ml#oV~HE-y?i9MTLH= z1at`T>4wTZJrWE9o)EmiC%G$I%HX-CVWf+)QtNOOz!bz!&FS?Kf2K^DN&$}`Wfh@; z+WW|gnIG5a=&;)}xV+T1J_@4}k=r>}sr}xevk+3{bZd2mgc_m7H{Zo#Q*R>-Vu#~0 z!u=bbr4vk|_?a05rblnq;>Z_@!0g!{fF0A^Q&Cwe7dj=x>dNtlsMCs%>bzFC!0noZ z2BNEc9(s3x6AP|a(ed&l9*NG@mWJGEML@DU+l#1{QqPdlDWC7NUH9fJeQG=vq@7eX zwFm*vlXZPoAxko8Wls%hu6`jTeKN@-Na9w$hqGwI!or!Z{W-25Ece?0B|D`7?Ktg( z8D>x($xB0>6LvDQ_m0;Qs36^g@YFXD0fL9dW51KVf^C#;=IDyxIc2tAi?3J?$+7<6) zRPUmc_tYh;?)bM!RPjY#?(CFJ-dY^nZ(ieFk6@^vjLy9|f2uwF5|{p#DY*+X{LLO_ zkNX_2A^7O?rpng3PFI7{v3E%IQ*!2q=*5Rl0%|L7GJ}V#8TVwDpg}^pOQe?Bb0>G`=kE?zd%00XGPCbV^tx^D_3IqTE0XS53F|=k!Es&> ziTj#yM8UwkfsnQm32!>mMcY)ysvIX-G*97>knPoq@Q@S02z=nkSJm z4COJA0sBoiNJjtKcB%|T&B!r=a-#In1IKVPj!MpJIs4YPqmF)yMN)uNwK2u~V##7>!{c2(7NpIbnjnIqfbB9WHTT_NtNCA`z;3TRp zAg%!MP7>xDVY`1;>^rY9%AnGd1!218q8E>T1{H zc+b)&{IS(XNGuuZ^-+I2^8XHz-)3Ym+xb3D;GWm%g^nOQ!aSD^*99np>?H+_cVWu|Qzibh%-h0pu8A<3ZmLC4tgRc6H#IQY zPa<-5guj91K7}6Ed2~)QRr~l7er_qOFcyV~vM`l6Jf}1hP#l+``guulviDgTyG*lh zXK66($(72@B*-SN=mK@ItM!qIzoi$7`zQ_No?No^_vRUFQpY6QKp{33c4_AB>4#-UE^`MY{#tJI_CsUpXl?z; zLKdQtwu=?J)<`k&Bd%mf&HaXtK=vZN!*%nz=DEXu4v-~-Ge77VRe1!4hgOwZgxea} z)rH-ss7&{N|1zCSfSr2VSYE`GC6(Y?i*cz$`=2j3V=lwmt{(JPX9h*An4TF^T@opa z3-?wHHKusF!g{~OX5Kx$ts-V{S3%kBLQ>j1Qdk{sy4NI`kV2LYo%hGtj7NlOW0>_Z&Pa z)(;Of$>hth(C_A%l9mOsK6I#uB>@oR6jr%kZJDs};ZeNmv;oPzOAa5o zgKyTMggyP}!d^A#(B(D&V$cT`n$y{F(b`xEDaeEkOLSt?&YZYj%eZBCIhvMXO0q$*$s z=zh)-dSCzq$i4#ip@7yqAfR>g|ENj0l1v+9M)s;Yq>Zz%vToBX$o?m*)tPZ*1> zWy%l4V0Y#fUi(wGe=6h01YObd$?I7ItG6Ey0MPNr-Ec?Nz7+&pSvn)`dI&s4vjz9! z|7AU%K_f0UO3by6_YXho*2vo*{-UmZ6&`&dsZ>ER#5Jf=yuZKm^nunI&6EWu+xQI0 zYr)pNhDjdch5rZE@;%Czcnkk@L7gp^$hjMF1(qkbeH@ZlFRH^mz7CFBB0XjE5hXT- z05m>IgESvtKrF^xZfyE|&Jkd5TBTQ}zI_vUQon7d<-VLT^$8j+37MP7pz49W$m3bB z{p^t=oG$YXlr=jKXOBf@iqz&+VaGqyq*>aLed5=!G=-%>RIB?id-4er)no*=BaG(# zv<&268ZLN9$DVQ~8zCnbR}I(7Qz$6Pe;QB}4K=7x0-QM5kZ7E!{T&*l7)6E91lI36CC807_f0S3%lI?7>40`N+ z0LeASeYfCN3(X^&(d8UjaO~IH03WI33N$dgTc<9h&Q*R7)~4&g?tG-sc}ZcE!Ak`u zZTWcp1mx_WOH!7Qj6^w!WcakI+T*bac6j2t~ssM7j?~4s)a7NVucGd23X@X@T+D5=j$z zZdhUglVC>pq;h1suHGO>0I6nL(sa~cv5+gIS}B0u3J7fXjgPO~d%ik|Db;9UqWYxi zXr^U5rzKBRbwqCzivuO1t@(=IXypgVH==Pc-DpMlxGt|auYJSX96STfZ=7d1{smL8 zn7|>8E~Y!3A4dV)1T#69|BiZ;?Y`U{Vp5iT?O=;#P8^Rm?_U}bbOe&f-4i&P*+kdg zWzWCjBAip?Avg<0Nf=wrq!f7^xi*~}Rce|qt4a(Z*90^wRB&2tMY|i0EyJ(dQI3&n zTiLbC^2bx3m##Ax8v;_=O&28_(MzxIgtA7-&KgM)ZHXM3TX;8*PUXLLH-|I??bHiJ zr2D=9bOa@qV1k|9)wmL0Pe5;;vR%Mf-sz2}xc=V7k!fz- zLl8?{<`SLNu(pmhMkye52L^>VS1fu#Hcw3NQ8Q0w*BC3*PF7&Yg-+Y2SBO%OfkcO# z_I>f8YA>1Et{GbHkraNhm1N@Wj}7d7GnSO+Dy2wqFzdXCo~^|*g@-ruRYxi# zkOr?;x@10}61`sl4~pUC*1Ul;2K^d+eld;?-C9(n#h*XTDERFmrFlA7 zsenB#c$QSyH5w0bI{1J9X-64|ZRoJvh#w}&-7=v2dg!k$JfQ0xNV*0G(h`TDz_fI5 z(6Z5J9cWHgy<|gyf=L^tRY|u|>c?0G(Z|5#y5T^7Qi?T*dI7HhGMU~m1p*h+UQ!E% zTTn~#z`UJ|JL~P;UhLnc-M{47fcCnX&Zeccwu){3<~J2!xrpgwCb9^**AAAiH3Rk< zh(mCP=+SQ$Z46S!un~|5-#fUx!-|mAFW{P&@KWq^sniCmZ7+Jt5dbLmOg5}32P}J^ z7?dHnUsm8=C;`=y1Bp&Vj?g5Jn`q*9oZ%EQVcXf&4joi{@F8j|lO9U>B0?WJHU^1W zNR}0gU5LyMp-%A#;}~?85>R`Z57plgWiYE$3ZYMsyYDarq$%X=1lOurE(xK zi43XBy3U(Sy7Rp?lh}XlTreQ+td6F3&!pC8 zG3@w{gz$%(OCO5PA;V{Kjf-$YER)VS$os7Zaly&{=7$^A zEBxKk@t+QrM7NB@Z#T7HlKUHk`U$F2Jk593n@gF>j^Xmk4v|_(xn2o&Y5{XW0?@r< z^L;Sf2e{zfH`76|9F&6=ExE@qG&OS27~!$EX^#3MS1~7|N0R(5T z@~lg#)aZO?C9VAQMz6u>38}nztJ{n1t4oTm;AMtin~v+eqiqdcng$I1KnJVi)BiiV zU9JQ_b-SrNi7L?sV!nMRpIXX?|1>3QT?{EG=yJNR13si&HNzv%;Y2W4VOCLBNjP59 zK(p!b-g{8fiZ#=vwK^MN%PzHEll%3U+)a0Z ztp%trnXmy)ron31bD0{@&Al{V3S;_)GGn(d@*-cqT49X9eODx+M%#3yL+p6=x&!*0 zz*5v?fZ^dxC&bAMD;G+W8HgtheO*q2QZ4Wlo|6XvW2`FE!4k)4iaLq3s~^c_#I{X` zy=eBfU`4pgK!$Ig$VG|k&C4^~A@;bzoq&%ynLccFmo3W1F`2qi98uCrM4yl+~EDaWdUS~0=m4%*(t2oxAF zqjsjps;a4r%|0zhe-M$_*)9GlI;V8rtzPiA>6>e#It^>mtSi1ns6Bb4h z6RK6}Eer{BN{snZVH~`1)4Uq4DZAReE5~DH$`c1udc^VbD8K+L5rq2(y|cS!8m!1?q1pINKwI~sYJ39K znpXDIZ_G;fAjVtQ6`WgN;b5dP%bVPDHW@Fqk3Qq9;VE5rZs|2xCO#uGPT3_FP0kVg zyL0A((R9drB!?b<8KYOPezWF`6E7-b>C34Ts~BI>b-?-L_&7BOB|G7+3(qNrY#%Ck zpVnvmOj!KfKpa9ki(R_oX*UBnu+C!Wsrks4wnQYt#V@BOdt$RI1c)I-F9lBcI}iMF19y&QqOQ zbU?6p$qbjz1=?KK%DUh^3osEd0FuXQp`*_5uz~=F6FKe4j&`GP7L6=^acj@FK$TW4 zNuN8;kQIZP0Ff(GXR(Tp4tWc{tpECIe}oL1jOA8V7Dd70&aU$b*c4W*z;U>DZj z-JG-Y4Em9kC6Sli1}w_Kfw}U(?I-ZzWhs!F7n%eLb@M={Cf5UynGwLLu2CcB#MKw#w)~7Y+O{>y zQ_vLu5X;Ws*;&c8o0oO;nN9!uFo%}F!BK1h!dW2N1?_L9wM5&cwt8afsTHot6o@_< z^ajzkiqgYjCW)bOiRQ4^ej+J4`?AYYio)E+^%y9psVI11s6P&OA_i>3pw-IC|0p~H zsXbH{9tvRx3$TnM@{8lVDWMc0p7W%CJCy2Xv)u5^eR8(GVBA(#`@u;*=yVyYw>do@ zr_rBQCQBl}`OEYEvbI%ebKwC0c}@)`==zsGpyVGPDe^lEI@yG-@1 zQI=B#Z8@J$K>W&ajebvIAyh%&P*+F z5fdT4keB$*@)(Q!lxK5T+BfUCf10cH6dPsG?}tTHki;}-dR1X^twAY-eno_8+YA*Q+XHeL$>~rw2*RC>r-=c^{v^r@5Txfn=grd?m$L&_56wsC8@f9W*b5OFnG6u z{3np{GV}Zd;F!AB2+Ze{5T7yV*v2)m;t$Jag|XVeq5#mgSFPoiB|Ham2J>!(n3sWkAOX6XJowMTmO+Df z6h;tW3t`5V{kMx*W-oED3E~1?e#wYqJ~*`$Yi&9hE+8Yg;AERkmpnCw9q=3qnfM|B zSip&?gjqOMp2QPjsMI+LXU0aNDq1*+*1e(RNrG>&!t2Nlf{^pGn?ott7`yr+$i!-w zW4ogHpXC0TfvXo*DO1AHgIubc7-o~$F2Aq zm}ZgjiRVtOO7ahB{av0fIaAfYb2lIQ95<((h02eOWpH@a3gC=+44M-%TlPR#9tw49 zyL(`w7#HQaecHI*jgF|QHu==6;r53`KzGHvY97N&s17J-m-)|IB(?T#n`80d54~>1 zbMvG^;R$lA#gFj(AIhJsBD@V`H2=FEP%M2JVcT5gqic-Pz2k3cy8NG~K$2k^yKf;vxZF8Ybd|mH?$d(31n#sc zlXkSii}FL8Z;!EA=9;TIP_I@iz-U>I141pMC!t;J`Yj%j*ySZPJ zJ`KRmlh2N{8g9tQ3R9}WekWRyQrHA5Ee{p$D@V_Kym`{bHBnJ*mR3_A?;xNGWqH`& z$E`K*E)_0WK95ZOQui<$-B3S|@_0iF2V6>F%2d^p{}_B$=AjhvX8wkzGRGO(Tv*0Q z+_fn3xPnocH>;dHl8nZ~ixJ5gQ=I;QSL9bKS$gd*O84)Q{$DaUz{}v`+ao|D*qS`? z;x(d1;(>wwmwfOt#`O(Aoxfd)i6UpwUz{wY2pi-!q-CGF&FB5QXq{^luFu{C1TT z;Kv@yX0-u!XDd9Y^j#R77QpV%*HYJBf6tG4JOjAIbHCiIO!Q4Uoea*Y6B|6apCmHj z82}dUxB8T@W=t;9buym`%O~D6jW$RSsA3gtbMsH<%DKZvf5pytTe9GpimstdIY0s~ zUt1i+xsytM=0K8A%+_}I+&O6*3zSG>{WdSVuYl~o|_V_V!+yAm5yeiWwW z5t-F&;6-iaxy5ZxKoo8QW_su|t<&YX$nlkBm$XfR{bGe$a{Fv3xm2tBO-HUmc)8iR zBmUS4We0zGqI|RDG=MH+Hg$^4P6cQZ@>5r(;0l__0~A1}c+oT>=Qc1JOL(Yv?wkX? z08EbFPYhLne$)?Vj$1|)h&6!RKH8nd>`j+PQ;@Suhe5%-Nvf?m#?lr#q>n$oBkZ9|!1>y!@_OzWb6ED>@Y4 zFc0tS8*KQioibM?d%VOyCR6po4pC}`yHbQ$+=lJ1!oXj@jWyuKblA6Vs>yP5~rvJkZS^)biL5FuBYOYN_^%|oY@9G@g9F? z)L%Mr)(L;>$O6MynZjAJiUS(|3m2iCFtP^i3AjnGobq$02UmbM+^c{;pYbF~Pd;u5 zdQAnqf4&cDC#rYQNfGZ>^t4xh%T+R2WU6V3qdLlZ!U4qgjiWMT@k5&k z{54S{3i@5Y`jCF{-gMmE99RRRc!5p}`|9BVMUdL}c%Wh0MdGx*5sBqvj1muxBdyiI z>Z*7sgLfCDFs-!HwLK@x^YMpO%eh7gGf7WJsCz{1FYG(6%2W|qf(=(3r#hwODG`(* zhq<|AB@JC0(*9-sU`!WIi9a;UY+ya2G|jG=9Q2GPuOvG@?(y|JRcF@_Kt5%}2`ao1 zXZ832x8>AsvzM2TlZUFCF1fS|QdaZ%wUWkUzMBDcJ92Wzc0@0U4^Vi$HY1m?0Cb&g zfPLmzF%^S}@S$Bk{0`b=e=NzFS~>pRdB+4yYoU*|5NplPJ4ph?8{bOqw6aBhAX_P2+=m2NSMSxxpHF8`uPoG&*WwPo8ogK`Ns->_6ag@3K*aXN4} zCepp*D`V=y!^cdkc`c5`2~Mw`(iXliBoP|rr2OFv;*$`_8kQ7OphBTp0LdW~;d!DE zb7B7HIh|EOY)nJ=j~X5noBVB340qzb%%8BuzVfDf=5fC0i6TIcj26f1O1r)@Z?GV( zumr6Qo$peM7}mc4YP4t5%He_b?aUsYq79zL4|{ktjN*rUO7#{W`M}M{gGgtk9^7Ut z6r0Rr`?4d^6vZte9u{I4oxh)b0685rMI}-}A*qo3;hxOxv|xMjWwB6YY2T4MKne{q zWLzQ>d}O-3@3TKoXM^89{nha@4D{a8$V6Fl#p^8=vzc+v%X>+jl3z*J*8&ZK8O>|IS+=;YqVqx|d|{T3 za|5Ske)GEd=wC&@%yGzt5vGu&9IqdCcOf9idzX1q<~e2!esaqAU5Cg(UI6I}y^18i8IWp$V*n{A zFV8DM_u>ch2r6^jat}zdrMaQzM%qu^l^97whnK|e6kN&8Bd+um%ad43jC|1C&ad2T zquzBDi;W*c6W=!=9|(-o1g1{ z%iUcK5cp6tZ)cJ(mwFigh^e^KT*{br_x~yL2|f~3X4N(Z^ZQZ%jQ;}3XNC20vlXIF zx6`{6$UDvyy10voPIeMeyw71PH%v%Py*sKW4RB1qG3hO8Yopkza@~L^%ePjzK$PK2 z{g5DOYzqBn95IL(P%I9zS0K_phYGtls9)@ZVx|b{qJ4@UMh9c(EoX{}H8EPQnMH4M zZ`#=-oNYPl~7Ww&HQ z!J{^w=sO>V26G;?k`gA?o5jXY_BYx7JMl{S7hT3H^FoAiEAeY9?0`#CYog-=kKpHA z?o3Dr6&b92KlQFB)t{!_Xr&DY`tG`CkJueI*iOnh4i!OiN!GF7`zu~F1PXZkJI01D zLQB$@#mjol$!xNZ4}Q^!W{vtfztNsRwPr?+;kIo-IKJhAbv?r-KrP9mA`e1-(v%(l zY;WmEj}=RaRo_$KLANZtSor_~df8hE_2@d9{H6_K4A?j!&L zGypB^itVgS*IG{{oN)}&-qAe4M^J#Cwi-QV3@#+iPz58aUKl{corRMe{J_4eNVvkO#w53d zbCcrmt2NH?%sfO2yWEPResvx5)ayr;WQXA>QHJvE)_-O2gB+^kAfc?~ile<#`4BF1 zQ0ei+==j^I$+H0N=gkWq7qsFSV@{X#>>Ut~$6obr!0k4q5FaT1rqWfycph3zc%7}E zmtQ+1%1Z_Mk7m|>*9#ur;zckj-RTJf<-KQyw{MT>>iHTOOCSUlo|)u13*~!guY`qj z?h5*Tv@j|{uGjoF+gIz>1IWgk&3gFy)}3XI3*b*s1z87c)(0~t zwYxIRl_wX3i%B!}#=`xTpgSUz5R%z-7+O^k#f z=j+9uzIh0Ugi>|~h$?v5O-N(&dkP0OA{R{FnNUr%`f6qBv5Y*SN-hPMLiIm_4b!{s z42{uSF@W;H)6*r89h7brLOHmje;h5EtU}enGz>j$%No}DG4IPAB$H9 z5aaDeDVSm8pxB9$u~Wl%PpB7D3~J5v{F|#P#B)syz!%Ef+GK*}mYg(3D$BfX50*KM z(RLTaKN{#XpcP&Z)jom5KxtIPwVv=DW&{fRH-Cic|B2r&3}jb&Kpop9{@p{n)LBC< zbKKNcElG8oeOpl+Z-ySgSb9G^-CZ69+M!}N|5>Dk;GS{*tzdXm$0i)9;9YZ6=%Fzk zWZF-qj*3b3@LaYk;P~+gxWTQ;TX;n`rK4;R)ciC^3C;5N)?J;Y<5`3h@xWS?c#Q|I z9FC_PVCglY;|lHy{3h$(qYgt5z?gAR`NPWHgng`Qgw-<$rH%J0_& zLoMUtaBJq|u;ndF;(4|Hu|U6X*#->p3dLiQEQ5hT!uQ(H2byZDManFdAth(?>MaWK&zR1IwY z+7*lBZ#x92{7vrkE#AeIjZfCnj$jdjpL|J{eU?)6-d1?$DDlegX9&fgI>y3P%z<^I zpu70K9{X$*vKX3q;UeF2|GZ(`dR4swx9nq z1T{8^X)G=$(-RF7P9hdBo$V`BN+fcV`|g%a{m-@GUoKW9qu78IC(Dsn4h)_BbS$=y z`%pT285ncul8uasco4L90~L+VB&!vNOqImaX#epPT8!K)iNlEWZJUaa zg2dKZKHKqKrK?b{`Z~0p{UX`9<>P+LR0vL-DezQTu`ho3;2vuvXE3!?-*i5O@77&@ z2oA;jJ8>X}kxR%yQU5ZlqK^sg`bS&`vuz2mX8lPMJF3(pRQ{Dd6O4+)V;Q!p;06yx z{eJuLgxk-{mPekOI9F!ZVjm<1Kh)>GsJ4$7Nq^lHNqv@N^^U1Di2y;|^Pw?=2qE>s z|GU3-cSbRj39(IW^sesUntA3XpnbEXEcttL>r41+Do@ZMR<$i6LaCX)-#1VR6p{Ke zaFnb;3)CVC&iy3drb=&WJkf8U{}v6OzIsN*e#bi(XI&EVQItti-t0RBiWOli7+V`1 z1-bO(bCZPX;PP$1k+HGcQ1r|7!Zi<({izqzu~!;O(W{2uLTV8tEMQdkAEuwkJiOTh z?La@#9RK}+4z%K$VpJgLO2TuoSc{Rr%uE%{SO5`*P_>_^Ij`>}9-(B(|MUtFy!+lw zFgSZ=Zf<>94EuO+XRat>hVX_7*ec5?X;DSqe0R2mq~&q_2+To1iETleq*>#xAUy+2 zdop&&8C>zK4labmoMDW0jNfJ7yeBWi%(U|%XV@KKgbHM5p_8{Au7pXKCP%j#X}sG` zE3%~bHS5DloUY%srdgPjua9L@<$Dk!FDA2T^zy48DwirUN`zN#5h4NM;IJeiH}=+R z$0Vb1jK5*ri#`NFP5@(Pw%aLF#`Fd8Yq%gB%67ADW_R4xsvq?E>}W&$4#j~xnC--q zu)>6Z@%ANTLkQ3fir9#4$LKHcIMo1=2S^ah8p@^7p;*b+kk_SPcXmC0E{=sHwaARP zsfj$nJdtM{Z8%lMcoF@3x!Y5|j^&G@sl0NLuI->snn-0YeQE?g$f&tf>alO*r*`ym zmzweo59-z188M&tDY_ePhvQ|W_s$T(8U-+FUmF}K)xeQ-#4I_>;RLnyCO=LJ7-o(Al%zYn+aTyo3wCP)AQS581SB)Aw6H~|wBfAvDt?u@6s+!wNt^0B?ARLk^gZ3= z<-=B;6q1M<=c0vp9o?1}O2=JCx>v|C=nn$AgJPbDx$Y8fKgzQ zO+fBKzdmHStDEHw)9D$ofLQ+KRm-$fDhL#<60ww1$S+Wa|NPWCS|4jG=N1EFZ5u#F`5 z${ei0j`-Dz7m*%T7<>v05cP|mAKHaX##1Z@fBe-|e9Je}nM#!`q9~^alRIZChvO#D zly}NCOw*u$)r|Ko#Qf0ZqEytv!=Gp#3JWf1xxiyIE|^rwiW&mMYe;DBI(5ZrLzcwY zn^W8+i8zh9T9Y>m!4T``G(0>XK1bPMaSZ`ior*t-m1dlFXlxr-w-KZt?Ln^?FDXvj z4#%1Z<0edM?hrn>sxG_3Wp4jx~r9NGjU;KO$$ zmEjXf>=&Jm5EYQ*l<5R5&CbDFqHJ2;E?0X`LLVfcd4!#mY`}J)Q6+ zQu0RthOrvZM8a@lt9TF^taO`#;2MPSmP645QHM^u%K|U`vhm{d1>#3el3zu&i`s%Y zIdL0c03Gh&gl`eJy!L@>Yui6rm{b+Qj!biovC*0vw+o!yC9uZMX&xZqmemKNelrT4F@ebhb$tCQDD>IVhU8?(> zE*O?MH5F&tf1MQ*Q;81vV>QSki?fB%{$mQ}U4bh|VZH02sd6(UPy1_zp}T`ZHb5y2 zD1wma>A*fIOz;VBKDs8)+Com(3o40m7#vWg#H?)ODqLpScLcov>;mDUBq7IKNM*5U$CjC3;l0m05=bMR83n9ouj4?;br zVEg>X87|u9e$NZ$s9YTTr6o-04t$b(-_unj4{E$~&0Jx!ib@twxciuTlP{ z!v=$8HX1uPunC5)u+8z7nYcII@dO~#7{uCK0nVYeJ4A!k=;XYp%9uBp5u=#h$hC0G zW#E~w96D;yAAZsOQaGW$vZLF@{Y><1=Qv_rSD&*wG)617K0ua?NV4WTVRREb=EleR zEY*gc2NC$~r38h5uBwLiY0yfyWfj;9MC;DAMIOX6G_!VO(IZ+#_`}?OE_&qlrGCaWH|?t`q^yIi@u;82+~2`?h5 z0`ApLrZKDlWUyMdh>5*IT{|S9*2#}bV9(fhvejZeFHjNBZPbl}4?BNCSJ}n+@&HJ| zh*{&t#4o<%-0P2+1$MP%?W2tyyZK79`y7paI49EIx`#NH9~WQ(tTp)XOf^5MvXH>p zDz_MSu*f7jkkya{a8Ro10==N50!HR|a%8+p$l`2tH0YWQLORjKO$f`47nz~|8N+Wj z!O>^YqD>G7qSL0g9*gd`&hhA);zg$naF z1Ket%0H;cdhoU0t*IE3iE8zA-D$kJ|*9Vm6aXwa`T84|NCFh9_f}+<8R|pUz2x%XSB+1E*UAoxCnF!T0*n6pZWN4)!a+`%c^cO%fM8Yo_odNNVM66b6oCI*t z)WJ(9m0Dg#7{V4Q)%yWbZfw;UVy7aU?k|_erU6Di2(gr_rVZ3_6noiwGl70nK?SKb z0K0p-8m|+!`?xjLBqg+M^Y453H!$@(P`>64WfyqU%xk%>o|a)NOT0syrMUFKSl}Qa z?Y^sF48jg?#(x5b@0eg^duD~+y~xeI3=b=GLJu$}L1uuW>X?m*uwPp#FR`C!VbuRV+tGRtiGBXs7Pk(3RGQmwWRy+G5)DasnJ|Ddud}y!aI?(BW}^o) zx_fnnM$Pi}U5Bx34t+MS;X^g}tlvk&KMRVcXh=cw>Y9c4toi1pfemVEp2NtVF5p@L zxI)GF1y@*r!iSMl)s-v5%elAKJf%}Z_HriLypsv8X@MHk|Nr;*h|p#1G>2sA-{smN z#g0jz`8iR>A3+rV@t^%>lzm<2xbjeFK&_;2FS>3WHV7I)y}_dq(u4h-5N!Ws88dj#U7IfY6Bc6^l1QrE^GK2qqJ-X5?H{Kcru zQ9s9s48n9Fy4h3$tB&Kkb++e%t94r17 zdVh6uwk-UF(BG~&Xlx;s!X~}$y?dgf`VZ)SuoKGisUGXceNfpSCwfuyr_tX&u^|1fily40@N)CX3- zW%H`Nmt`eqX)psyhfp8lGHQ9npdCzhWbV(NJC8h5J0x>nK4mL^tC9<_t|hM#j$k1U zhpT}U@3J2_MWrgy)4Ribv9UuO=uF|ukwjHEnm_f*izM2f2(S0;Ko^pN!~>YWQmAP` zE2=%X`6U(b7SFLwAl>}9=1g{0fPPh@+n01*AyGNvFZ@-H^LPSg4YV2GBZUoI@m5D* zz%tcInOd zr(QKy8rZ0}lFY50m~-?DSHQ$?UdN$~4r0!nr?S0f1(ZVh!6)1sv8|-|tkq6)N$z-h2Hj_BKSWlB6rl{2-i;hWOQbAcQ;q^fz1pRjnK9?AAAzkLi z6eR$W?f}ajDRdb$A2rG-NN5T2uEuD_lM(%7UBSem>wZ;zBg8qwxm0)3-l!_;K`sgv zA6?44hokwpdh>>Y9l5DGVKsm~HSrkALw3cT!h&!A1t3mjZSAW?eRN_SLf_y4Yv%E6 z>cUp>IaTo1ozK~Dm;AB?#|yuLMLZ6v!aooh1Qhh}*=b4k+;+MuV(Am>{EG5aszYv> zZCyVXj#J_`;z-IfZ^s#R}YDe1JhHb_48dkqj>1FEMUD?|fagUDh45`uZJ zG&~!x2M&gzbA7uh3vgY8ODJ0=`XeoGlYaWT0Lg`a2!#|NZUOifnuaXA?(!i1DsM&K zHz~-;_2#UKc12I=AfWx?a`cJEh44iG=chuTioq>xs&e?udm^LK;CxKmIGnjo{kA5y zI2^)2hTU=z{!!*Yb?8rmN{xgPvDZZ1h!#l!c3dXJOOi1F2RJI04RyWeYQ7uqbrI?z zVNEK7aOAkV;2Eu5IUf{dqE23)m1@ETSFC_@mxk}~fCdpsVt2(RCwG*8z56qUXWb?F z8f3m$K5xEiP*}{IxVu&`qOT&Hk$}%`a$^1Q8^JVt8RPB>7!Q~+xeMvtr=kO7`-M(x zS|ESZ+y@yHZK}wC!D_Yh4?vJaRd)!GR!)JqfyID9?&UE!nJhwvf$} zXmRq}-xJrkxwva|;H1I>h!YS>L_b)OS+X074s5Ad$E|hQ9XECwX%Qu|&TgoI@i^$3J;E^zsb9JxWM zis|QMiGasg;MzYNd*;R5yc^}u(wF%%dig#cmKxU572?8rea7$UBD#4Ix5bkvn7Jak zVw0$f)6*?bp#+E;FkQd-SlMO&7?gKiJ;Wl0VS^;7DrenPnv}2guQ9^um~1Ltl#yTgR-&#W2~HHwFHCLvuvZ$r=*fn!6mk!Xj$b=kUtQjz;iapIF- zmU9}%NDy?x{E~>?OQK*4N*nSS+?jP&#&scY$)+G{E}Uz#km_acs3~w>#B=Z=!|>Lr zZPTyNd%qwU&%S;Xr#pZkf)}4s>#J~8BBZMcpPsD(-(^e{U&=PP;Gx~U`r%;sD>^#` zMR_(z3FN-Mzuu^`T4Hk36_wQ3k$33{X&t`ED&6}M9eQ0iwhm%M4+Ee zJPgw%g1}BR!4Uh$LzC$V{u=Ss6GF6q4TL>(_Syd)Qp?lC7!2v76RSqG&zwH5r**K$ zu4K1UBpY=_e5kew(NzgdZ@$DT)kLvjCV`${b|c1moUri;{3;!5>HeXseta=qHb%gF70d}#U=$t$i^ z>w+4j4%2xmqRCoVhf*)Szez+hN7@#ox)v85ql6<2o2O5c$54IyN)#Ptq9lZhNPMoe z|C2(rS9jMugwR?#x@$V7v*{c53$Y6rRLe9~fa&PP-Kw{Tk-$CvsNWIAA0ZmX45br7 z>FpB6b84G(rGNtTANd#D*$RIDn`|RN!mU^nMJ5?2suwW^S!EPVtuA2ybl{{M}^FE@o;-XYv1LHj$ zKEa3_H#oN)P2{dg3hF#>v;^33O^v^9p4+lQWMLfIWiE3P!rp(_5zg-NEW63r%`)^$S+IiTyV4iei0S-Hw>5I_SQ+Yb9@UKYUPHVD@;4fs zA80BYGFjlTnE>F0+1L28Ky9j3wrxXy4NrM2dn^w;Y>kj$_=7_#u!a=GJUEalFSMK( z^wr$8t{et{<{O5s17<}45mymX8eGl#VA$z6Y7gidr3`Q^ba1F@(4C44%8y7UDieFC zLig3N)GXA2TeD`7be}t%*WEwN3Qql&rbcj71CRyQwA!x=iqy5lNS+iq#=wde%I1l?{ARf%zUe$WBtV79 z$Az)PpDz87R~0(MfK6z@02W>d$VS4uQn`R}z4iLFmM`=BRn?k7gl5(U3VUC6&-~df z>ZOaZw>X4Nd14<@zl5OBHLA}Yy~F&qhFQv=D2g!tl#49s`J!)KCD_WtiA7LTHpI1B zFUEFpRDsJx_Ue4 zMm>1f@R5xBTvF$G#Pzeb433OOm*6+J6?t-klJL0@2bQWCddy7tnj{L)u-r9;L`N!)?*Jy!~@lLnUkE0JU(bU9LbpMU81a@r+q2P zBU215t%qE>L-4(ZJ`Akw>bx?N<^F^}u1L*3>}0q-E(VpQF6N*SKV}Hr-MYz&HjguT z_}PyI{PDv2bSTd?1NLpprgaKs^T}TLJ6fzKB{KYpNg#eR^vIJpD>>*Lg&U)fLAK#D z59}PL`cy*-je^l!vKsg!y{ukyNz_@*dSgPUl_lyVaNNMoq@ch!i27l^$T6~C=t1@5 z!bGR{ChXa|VxHtAyX01moRfT`DV2qt!J+}rp*=~3zj?KQytQ7Qzt{x>P52;T>$6sUp^YvIS+Z6rkLqJ66+tC zA4-0MtBe&2?>MXySjXF)K=uf?}b@ID`V9vlHvCuP5Xz~lz@LVJDL_iSP6 ziPd}I3^&2oDEli+1SL?geIGrLT!bh=x-hJ!9=;9H|t2Ve{_C9;~xsR2jqH3Lb!XTM#)8870b4adsyXuW(nf{mng zX#kL+isP_9uI=(>ANs49I>s|hBKzERxHOpWD;^}DZFKN8;{JJgM64*Tg>Kei4fqG> zO6K;JWsCk9HjBM_U_vyTaGnXqS-7E6aJuZaaE84OrtGkpbBq-AXkYnaeY&?FmPvpz zie9ngGH{LAXNK)tkIdc)zeGC2<-Q#iT7RF)$ZusBR6KO1=-Nwuw73N7JPTa)Y&TLR zs0v}UFbv-OKV^(>RM;Jk0|C`bM`FftzaYjP+dc7+6qAjzi%MexuUJ11bsW>+y*5D% z^k!sJzeB_3)~vU@O<^V_e5c+lN-ofQJ33jnbvYXzBqcN z{qzhWTljsI2I(O6DhTw%S;7Y9$@)Q7}mH)%y+!yGk`*3|M zxkU#zX1^Fl^sDcNjfX5@Z@C^TsTWDa^uG@nb}6R4@OLY1I1pV{3tHjuIMD#=PxYu0 zhNq0EJh3BAeqxcZ~;I=O%xX-<|(<$`m-r-I2~lIg(h z#EpSv5=lsFgV^*>L_sN?-nt>aA$ahUJvB-DEtYU8wnan84H^}bGH@BZyc*6*GDj1~ z>YbWq*BRQyqx%5igirmXffo$yr+K1hQf4ykf5yHiw<+nc0-!`_cv9AlQW1Z8 z^c+njlq4Qe2DMvya%bOTa?Bjvg%F3CRCxbntr0xpE4K;byGPB}CsB~lYpwR&_!;MG zdS|V1aGnf3jE!^Q|A3d7kDOn>?xt_6{xxp>9GN*1t4S%jf_J|ado)1NK){t;k?x4z z6|qbo^Z8Ca2HMZ6Kg~cHxBabE?vZ|6kBrM&Fpn#916Of1n1*~0W0dJ}mpY)(tj>k; zqhCy!j>_%nRP%%KpSUQ&7P0-_+nah0np}~l*wdynK9$j2Ac+{5{KC9}HVacWWw4d{ zm^>vQ3LFOt27-kKmI^bn)0_(rA~wW5iu(s(_UpSZSz!N!)a4umh~JaPx)m_^_@x;Y z`PSV4{}pu4w!dd8&9fMSm9FjP11jJd%vz$A3*VYQBj*?-vG?o%r^u&vtGiVtd`hPa zpyc^AqVs7@`0kWW@ySSSL{IrH?!Tcbn%yr?j7+!OKB3GuJB&@MNxPJ;WwOtLZFY-YkM~fo;K$~bv2*C>WmyMQ*+4wlteMZOuFm>zuhiRm*tL&{4k{L z8a11my-UQzv40|??Gj*+c=@NV@^&CAJX&E>O>r!*4AP+0;lN-3v{?*S^6+$@3|%Ow z&m)W-{QB2B^lpewKEAkk+%$23(EY3AJX8g2+IZkEnWpb@D}8febavT6Q2Ya#DZ!l+ zi^@a9ERpL{G)_e~3iq>aeW$b4THJR;9Uxn)H4CWP>==&#Jz%YM33(9fm(iZdP!4Ox z3NoJT{%BJ5atn+y(TLzNb3h>sp$1Diesy4eU$e9ag>hK7&6Yr+t)XLoe96MJ(OI8_ zzWu(zx$~o44R7!-4q1p-po8y-83Xj&{p~4_m#-Xb#TQ94yq=sq1Yl1(>SWolX}FGQ z6Ph>At=}Zhq4d{3Z*ZhVY@&hx*}d1!a@|(=0~auoXPZo{s#dZc z48s*CM>XK&&IZ$!KZ9ThHF^B`CZ|AIX0Y9mGGMG=v^9FVuh|$Q_v!R`5mgs?8vTYe z)l6Vb^gy$xvbKVZn^EBE8_U-{WamU_et~hF`FrJ9UjIJ|PFea+xb43tK;v0_eH#ML3-v+({sK=u&uRrs(_wefHP%BH=iIV%jK{A_bP?#b z5q9;RIgaWRm=r~o%j84?39x{aiBHAs%764pB}>fPAu*e_2w%E`Ui#s*>DDH=-5Lh} zGcGMP2M14Kv+udGhv)QbR|^9$664ulZLXEFsITbEn5Hm0;bCarJy=v#C}Vmnkj_%S zb2`=~TnJ$0ASOkmUz`kpNblQ}Yc5*44Kk~Ab;Z{w(d9igVn9E%XDgayu@{$sf)v~M zf7h-F<*d~98l>7k5#LVFKCGcyK>YYn=jPw%&svI-6c1FH=7C<1S3#+AWPuTy#LO@L~!#^{BBX;=r-uwxx4>mOZX|-LFxLDw9YE}-7yn2>aZN~duLUX z;J_4`*V41)!^$0jJ4dl3SJfD_T~buddeaCF3A|#OY0_hX7xY+G?XA~9nb{1q7z@!) zV(N@JkyGsIKuybMV;lK;QvQpb7+CWmr@u+h?h#f+VTFv!QI)@&-(LA0jVAL6JMG(@ zZO+-X;*ID+ien@zq!6eN2OeU>9(;`=p1VPks3}7OMg;AJc83t=8GL9l#S9=08EK9^ zy+tZThU#QuXYkPfsV_a{S^sxAutvp2Ufz+^igc~>7@*%nB9NrVs}o?4$Cq5}?)q90 z&mEJGrVGPDTafILNcMLHsO@fEqZz!42$mAGM1E$hhJ9vKL>S0lC1eGTeOqV0 zu&L7XgiigPy=b}Z#_~tuec>-RQ0DM|ultfRE0oFfn$|Jpsca2_A@-BrNtnNAiroA5 zk_O6J0;(QFIY$w7N>pZ|V2;q}S^|!apl2*$%-d%UVu> z-7k)Guxozpjq9t`l=Fn`o#g|au;c4%tLy!B$g zS;l297V*+hWXuUfbN$OIzJ_NW_a~qgZmRCO90^Lwvhtp-8m?sipq|juikLKN(1R&# z+^5rCZFQwB)n4}#)sRcdt;UEvG6SI(Q0;;f9tg~Z&8|62vB`6Eh;N1CJYxS>%Lf_> z7T${1ZTBi`njBg9EOi4N>=X>p8(7#9Mv0&d1n<)d13gG<($F-#n{L?j7v+i!i35In zCBnId+b!??h9PGDdKtALPEukU8NjFN27j5ILZJ;SZSlTa0sxvgVG`&NIZI=x00Zam zJV*$E#^D_Qc_8M-BVi2K*@>wcAFhVO|2E-zY|SNhfhN2LqW*#9(c1zE7XwaVJn~on zG@DnlNcxuM8#ne)f5t$N)5G}eceud##}5vDpT5(dRE*Pewfsp3xR~1li716NIMTR* zEY69?a-ZClkYYcH5o*Ii(}rc8_t)6QQy)C1A{kQP4%>vAD__`7|4&v*GARgW+F`65Nb zZQ*}oExYw?yJl(j@*c#gyVqPYtjXBu*!;Vrs&W*MIl&CGS6@C&*VIDX)}*N;I-YbZ zw+nb>fbps3c^(JBMZf=o+gp!PY`J$!I3k8}aHcYVHX*a%(=ncj>MEvHm;&7pyjPVP zp=Q?x;WAZt03HydlawYsVC}{sXViZ%r%EN@sKkDiZCj`-0i9y*T8J>93$utfSYu6j zE%^g9%9v?QB5f?04{h83+>gVr&LC?ps+aF!3X67qv||o=5IlbNr$nQQnE17@LX;S8 z9iIvVxj^ZEb2JpR{{F$#{hj`7oui*7Q16KxQDpaoaKwW31!q>kR9&XJSS*6nN0GCO zS<8#i|32jb7b5bZej?3ZzHs+Lh=m#Qdd!Gw6E{#EQs2uL5gg|rxFMjn?<4&o%Ewoq zH)G0{R6hBbUxPZ{zmiexroGmx@WJu_&3$Lv{eC=+>0;8&SYEj+Ln4hpvmKN3_oiBG zuDwf2*l1#+rf3vt6xaD8>~d=%mlQ%BI!=a zN@^@5)ycLiRLtW`9X1?&c^+O=$$y_lBEkD6@@yqb`M|FheVB<~*9d07-C3$W4T({^ z9UPxo9ys7J zp=C_0(H^d&c(p~$iX_Ra#*IGVIE3olfJLc(wH=?t8!SOllAl#WcXzJ|7!|*RyoolV zLhc)IJrLxKGQ}gih_FwF>(AR*tu?;~Lv^X4z+pLy>Vt@hr4q}hd^eDtSUs#iL?$oX zai3C{Dp%1Al@cyXx6n#Y#inTOE`IMUUh|*$>r}xx6vr{{lW09vVDO{cEqkOe4c7Ft z&=VCvk5&Pn1#8(_X!2;F-N^=iG@Gh zKtXtZ+WHTr*g?M}13W2ikW_A*<|u}-3zr+e^(qev6v9eLXgU`td=#Du{rEPnEFa`C zBXDEN?YduXC;at9mwv?5EVLY3om)A)|iDBSO?xlxQ%Q(nHR8{kgAU z`m^N9AvPJDJj7ATk;^vlNNgkJuK4N-EDJa#7CbiV&%5eIfbu?d1p|Ol5GdQ0@3x3{ zI)CrAj;%yKrr%JXbLvJW2(>ps_uhsVDM5Pw&qz(e8s3*Aa;|7F78$ZtVd z2V4kLo-GH32yBN-CU!XGSAHpvmylNyJi7~om2+p|#ll+&{c^W7KBsL99a17j$~nND zAH;0MMvn6>+hcf#0w!&KJ?+|wjAEDYIKCzC8lv`ZOSEx0Qtn1=e@J{D!Zt(4_vB{N zBQGj(7ZW;Rp>6q>ETFm&M#5G1^PO@r1-+WN4gMu48u^nj-a$e05q0!@==kz?aD%l` zV7(LWy`}NG@#ykyS~bX^h}A*+SY_zdK^;QtI|EG}yjiiH-{8UOQQVKl{aYBEeaGMo zVhVrvMqTh}`OFY}jR7f)DMtguiu})Y(#hS)eHm0!)jxSjGE%3KlCqdf^(cHVpwsu#(WV^REh=s)VoPS3` zNRlf2V6mK#!>RSEN%DGKUx`bh6oW=0f?-(mdY)VLkq;BAIKdOUE1BO+Wf~HDieV8I zGq`%mK5Vu_FK+tu?{%}@y9<}frbVs|M9z(x@>wVUo9`_W>Z&0(Q+WQ2TJ(KYYQQjP z{^-4xguu#Xf6|1RIn+NdY-HTvH|a$)`2_?Zrejix%eWd7{BirMPIPq-B8&rhR8?l8 zx75#_c;8oPv)`a{*cB&Jv3Dm&L$$-K)Yr!GIQscgIlk6M^yJA(AT*IR_6$K!0`X4x zrY57Rs63|n=Lc0%t=<_-wsz7qKy1-6^a|fW)8sU|PT-h}xE+FGZueEIa3;m0bgphg zRU4^u&B1WAw;x@Pcn#dNFDM!yySttTE)^&va4Tw z>O2v^en#I~|F(a)!b_1NOrW3As0`kdGK-2ANcft@K{NKlU*-irAl}lZWQB{V4OH|P zH5p~&LX@p4%Fel`WS-Vq`DjlklT1+vYiEAxX)o{?X3RFT%$z(gWibZ%MBBANx?QVu zK|4|9Qn(dZ{pdcqj`1wv{#{ z*wlpy`<5-0gbyykD(D)+_T@Q#_KYrL0OhF~@!#Oh1OnS2R*Day-3nVvy#1&>QG->{ z1S+5Lw{cX7E0b)WcBzC@qD*Sa#kWqf;k>L0#HmpjN1q-#HqsrY*(xQ{q3!H z0B~rDn-a5$+VG`*WJIy<0n^GaefrQ)J^bUz>{(Y5rp&AdD3c4-K^%>%e+T2W(GFMk zUQz5)H}9*04tpI`M`zu%U+RRT|6S!l6(QLKFHp|tRYl@!#y*O4#LN?yWzUbrm}|eG zgV?w+dq{({^}Cfa4-3%Lz37h8#Yhtkz$!VPQYh7;hTc0re*O zD#+2-t#g6CGE6Sc{9TB$Fio((?^=6*Gr{&v6Sd(tNjFs9pONgJ5NmsM`_XmLeQah|@GRb#!@!EAQxi z_B$u$tr%^8MnniHKLKXndUxSAwhs;Q3D5w?A!jKMpq3zz?OaT6PUsiN&oUf1vf^Rl zpzHd$f$F(HLY;*prr&hWNnP@;&X{~@T5 zo3MfqA6!f~F6iARb#Zj0sToj}WVm3&MOvtXHJqwO!FNKxk}o6Ppy_GoSXul>al+Mg z=bcKFVy>M-op8kiEa?9L-AYQe-6^)r?Kz70o{mS2-NP%AuEQcGCbzVyFX6(3wTS{p zLubse98q<0Uzi4-G`a%i8pSfAyxl^!M)FhVcQWDc_O%FyG%J>ykm+!3#QK+Q8&HkZ zju>%^e+O5F&;Auhmue_r;UV#dCF*4`L4$CPOld&1CAf7cg@M44JPi&0+l!LW4$Pw~ zErpRjoal-YVVy#Ri4q0v=I>n?so^r&SdFiBdKgjOJ^J+{EdwwCM%pFPtg@i7zr~kQ zW{sDme9<-)7}{hW@*OO!7%aq)FY_3yv(fDcZ78eFOv)B-vH)E5uGfY|iXd9?3>%_z z^@!3slW3PsfnKJaB^SClXS|S3{v93?)r8W`+dL{fZMw^x@bwO%0t?=2R?C)g-~j3wg1ef2 zt$#@7n}+xL3S6^Jw~faJXf7$4WQP+pQs$`m!(!1j!#z8?XkxjG=XG(IHN*33h{Nds zDL~f0AD_Jed0SgjkREMY+m7uE*fWwHaiIE7-#N=CHF6wnI%vt3^DAPX#fh+xIhnl~ z*3+Sj@@O{k7d;>72P_xv$u-E42-0_#y7Dnu8smJ35ypZOP6iM8FuSt?QLCNc7O4KTN_ZqwNf+g zGO^Z~I-|t>QwGU+FhJAP%^$K8y>Ba6<|8GaE$D|;E?;+U%b++^d0gom+rcv>$OyKU zVcEW=5JNO)d0LZ%EFOXX65&yE&U{`na=VvNos0ZLb%iG5RJ!^claCy+SUdSIbfr=> z6COQs{l1CcsQn0jWD?9$g$EyNON+RYXa} zcC#4nKSKk4+|4LHk{T|#(@(}f8SmM_KgZWEu%+t(i#gNtHn7bPcG%Sxwqy;@Ao2r` z6&C;>Tj%W!NAN~r+-FLaB5#Tc!YQAvX-BjmE4bt-ERy4x-4fA+3W&u}y-XDby z7)%wp^KBqP7Ly|=fn~N|EW)AI^i?`;F(Y)P$YQ$YT=}@V)npQthWdiXC29Z}DvYPl zR}U@wX%9s~@`J-MNu29a+r9r(9glRbEeM61Yh%4_O5GVMxNO(id~xy4ov|1Ogm5J> z6Qf7YBKj7=u|deIQVfu$?3f9^{&V< z6Bn6vvD3G?|JI97iOY7~i!)jg@iNykAdVr4?iTx%AX4yjnu`k-CKjSGRQJ2Scf?wV zbc?NW!~q6nBewflOfciUtP7wY)}~Bj5)$|NE1Xeqcs&_LCA?_%NADp(s3LwBl12f9 zFR)+BT~h$RmO^ohnpARqE?Zs%n=QvHe)V=;0(%k~_5Q)zc*xEoSG@WF3*nE$$M^MF zpk)aWlpkEo1?JZba>JKp>m-VF4!W}u|ABCFl#!On8s;`S#oaS`3R;TVR$|@dbq8@# z5ljK|L&*Fni8k)S1h&3+(ou6VxfA5-I~uVwuX9iO{pm(+^DR;=`31ZkNd z7tA2?2)QX#zJ%j0_fHb07nD+dC+aS#R%bzxR7Ir}KblD$9?d9@X!F}+1HmF9`MWKC z9l_MU%-q_&BB4T^e?g ziBB;SwAOmPIR#2cBJcSf^P%%d`h6gw?~m&@2ZSzNkOC6+z@Aq?(Ce4#qpY-CF;-v>yMN%zkeG$#F8l67usvX+7LZ6kpbGP2)S+VR>XdMuH_`8haAuAL@`c>%I z^nmQ11LM7NPtFAHo}8Hh8df=6whT%w3=j-FJFHU_L;CI6xXxr4CQ7veMt3W3OX z$+L?$ySWJ^ez^Ax+T)+KB6iCyekq+nh2zFJ7N&AmnYb1ejd^T$-k-Thd+g{m&dW?I z*v1RN9VP(WY{E^6)vmuliyjFjr#gokEi*-cRpt|j z$iW{iJ{80+-y+iEj5c!k-Usf}q<69Ocma2!XM4$7f2zv*@_}sYf(JhQz(6Y~%u9PH z!A9I+>g&FrKLx)Nm0B?R8QO_*ccnLPfB79Q(6yD<701EQ9uYJ0Q53&NlK2(wII5Ee z4^D(6Am+!?iMg(fuc1a&slFyg2>~V?Ropm48w(Hg>1*yTm568WPzqywZkFe+T7U>0~t$sVubASz2Co8kMg( zSc9-2uU6XCaR@NH_8cy7t>=Wz4#w*H^q*>Ar)1dglTq?B+_+bGoGdm`i1!BX%(rpS zGGuZ^P{WPP+RKmH&_!aD#U?@|+4CJ^k+&t1hO3U*OT+LwF4>Yov%mF{Vl%v!Za1u9 z^?+zWgrtzXRYo*hb}7v~4hk+T7ginFvs@<#1sJAw**HKj@eSDU44UPUhs!a>y!Fex z@^DmuBa(9IC^XNm_CT}ghUd2GxRg=xF8*WEhwD|z778Rq?GGs1t-iVEw8 zspN^d)+T-BdfOxUpnb!uv*i$Tc*$3nS5o>5c+LgA=XN^>7Edof#;k~i5lb>GNCg}f zwC`Q=LEPL>{n1+3CcY-NZ8dPDjPA(gn#?29^T|kPJVo}lknj|e9>GA^t9i|I+?ev{fDSi!znR`!-n>}O9Tqc=ZoVjY=2GW>mo|C0*N}aZuEi4I4!0#@=wSXfTSz0}TNI2%;XNUv1!5OHhTX5&fGO}@s*`~V z_)k^aKb&kbH_52Y1-h*U!|f_1q$;~^UOnH2mb{gSO^zH? zGVf@hZpPesK@dD&%gG|TSI!!mF`&wSErO{W71Z#X>)pyq;jYrAXJF7V{b=mo zE-F)l_sc5LY|uMy$qxBYhs{|z8@mP} zVtg1L%K&bjYaZClr^KE$M}{l_)1`qygr(8g1`5`MBNi~Kw+mSsVJJv)HoTeHP(tC5 z#YU{7uR5-96ac}s-`vpW*p1=x>orm9-XJR84h-OJb^F3w#{dBk;8|Dy^+y)q|vS*P9VAy+EmN$6;vlcL_%$%Tydz1V%3L!mB4Y{d7BM_<$f-qORe zFg(OTWyCm%ZvS3Ns3()Z!Ix`pmT8y@FgeDSkUo>8*B^l1LCzVV(fES*>erzZI(M0(S5jk@!Dgz@M!u zC^0mt3;Qp~djW-v7M+5s9KFy4AyBZ$M-w^B6QeApx)q?g_Ka02O$%%0P1*pRR<*j_qet@R zuNx@s&s=tiJs&yN8SacvYU1cj`)6}Ho?xL-^rc`pv=(0veo#0QI&bD6?IxvFrYS#r z#WX%JA=vH{W)M}<`r1AJP*H_p7yygkG1>VesU0qUH#ychAGhNBBg>oZNVLdL&g^|a z)-F}j{|5bOf}u0f?TsWYezC5v)^-jOi;Ag~0FHLMESi%YYkr-}WR3yn@2J7K-`*>8z z)%2PgMl6BaF~_P3ZF7*g3Id~+;{*v>l2)e}Lpr?7blw_j5?@<=07kp38du9`78Y?2 z-OUafmLq0})TYI|isvt3k&q7lAP<>sMZvzq5mgG-?-`luQRj(FA z*!jr7umN14UKDZ+X3DR{1qx98C$Y%vGD1>dBPpICOW zld*py?Pp8e(f~~Bq#_GBTm68yp?FjJkXLGEb~^phA=U_Kj;?#j!Yc3{>!u(&{N?}^Lf0UaOBm_g9@!T2q1y;l6oL4WlMKv z*M9w7%f{=PYzj!XKk@_kcQDJQQcAc`-P zeHL#rdRMzS>#v03G1y5pskSTgTzM(N@omnKR}3~R3! zu8lCd-*mUn^e&CD+!2}PF10M&Ch`5J+T0IuQQS%MTlRAwv3pi1`^w$3u{#@zb-L4~ zfH!K2+&V~GA{(H4eL{b7)=({s6Osy^T3?3M&aS05ZRR&@f|wtP0~n(1O;x!?(2Z|- z*Xb3H zUI`AMh*h{v<=++%wCVd35dI1UDeM(`O-7JGc6r}Be>P;FnR6YnN9muf)ZDC?5D8<_ ze01k5P)<7d-~a)am>+((WNV_QH*aIjIE-N*_~eJ;`mtx}|7HcJS$TvM{ekJ24V}py zrgA;`DeTjiht^Q;d)Zi1$AT6QpyT0}f)8KI6-yW~I&DDpUOfKh$YxZu{OI6Lsb65cG->lEs}|ev#Y73s3cWMoi|RhD$PU z8cF9(?TwSe&#@9$>UYDVpS%g@{S`HjMF-~d300%94`RMBOUJT8qnaYIib?A?Mx}Db z#~ZNS`C5pVeIBWdJQ6`g9W}+dc32>__)Bp=hWDMkx>eb&yie8hSw_X5ol+p$U`4_4 zifyK2o|$`63uy!a@G4bc-<}UIpY_^yr!Um)oTG~^+TEy0n{Xw`>DsHKec$Qy z&%OWphz}x!hvo(&HMCq{b;QO}HhjdhU!?XW5-T57ifwl6i-=wdw7-Ran^CRSx+d(C z^Uz#2KP;uBG>rb7H^p$HUwFVxZ(kJX&i#S_pW+a%M7D6wl^;pdQ3(LOwBwi>X}I<~ zxsa?DyW}cjSYV=wzKsB?7*^9eRa>l3bfjJIhZ?rVi_={Ko5TvNf#p3L}1X!c+aRNw%?jt&MxuwWE_3avJS7vPD z7qNhi`g;4{juDpM?L$DKX1B)W(64X?@KKGPPdU^woZ;REB#>^cO+0@Ou>Y zFMoWZHA6THK?tbFa;=j$7#*|ifU!!qQW=IccsP@;@~2ue&)Ll3>i%XDMg6XB>@ONc zk?zqhI&Iq|t&I9bv%O7ZouzU+gbFmR+^(rhL$n&vBH42jlCFZ?&uLre-)**g26ujZ z7$Gll_5&5Cr?pfRJC33GYg+F$=su=!FH3p?xTBRW$*IoRJl)A% zcPY%423LeC=L8%-d(KuDb4G#@F;8@$MCD_^%|@V3r(q||^eI%~s|YtIK{xkI?fH0l zh@^(eRJ8h{rsV2JU;oO~RE>5AuBX_c2Iemhm)dTU+Z3y>LLN%5E2~Jt@k%<+>onuBtaaHQUVbT{MTm?`gV&?D{9j%?8 zrTF3j&LY0sNbOW!zcevvELK}2%T*|0li{KebnM2mW)~w^?J@NVF4rzFw6tmT64sea zAYU+aeh5>egNp3gBS#i*gczXP3$V%6LZ9${p&O%6rYT&Xjj=)lKV#$kt!gZzu<;oR zwcAHxR#0@t14b{1duJJ3r@;JvcVXH48h|w0u%J$eA^Yn2UC(@1D!ZD1L>7u7kn3y& zw=Cf@bgs&P*q={^#xs9AsHAHy#IW}2MYtz6{Ux92vi%%T8)l^*|sb@x#%i5g85Rg zl)5dru*ZhBj4kvD#$E%S>W$NM1PHv5s0UV_I_D`0-U7yyDa>V}t8L1e5+~e(=kqGQ98 z*J347%tJKe6Hj*xh9nQMpclAWw&~2CWI=kH zey6y+sOTTzjP(N-4!Io^`@7WMA|jU-V0BYIXWYblscD{{5c9s2HxQFlB!Lw zA+D+Tt1=z@&8uFVfE(sVjrX=L5om%K-}Pa2mDC(dbRC?mOmOr^U~-brhk|@*V>!9E z6{R(jhfh^e)_Ro%e9MbiCHpk_k|V%dn36>ZvW5BJVp@Bfq5)HW-ab;53!DMVJf)*O zdE@(36dB=4GGb{rWW(@q-#$wsDxlDzr8=UhDl9nY==(wv_n5F=d`bZCCUoVI>1~7x z`}r|_4{;9CbU1&L_@%)3^l}1BykFOmM}#_%8gsS>h+v+#;&S=-E{d>Ct9}Pb!+Tuv z|9ZV|yfwOPT}DEecKP`>RUF#hpc{8D)KR}je|fGsQEp!;cE~`X#?4r{q|^B$_qsS? zEA%!cHg>cTDjdQpT4c!JV<5`zRBpBRXtvxrvdBAhXD2O$XK`HE2bwkRbJLnHiULWbJ7&gD2)n& zS1KE3tcuz)#vUs04m>t-l%5nln;xb2HiA10Q>lY6chn3N0*xBtVS3RZ82l0?N&p%p*Z zZ@Pzx{iG3G|G{v`J&P*aH_UOa2y&K(CX2JH)F-5qJTI5em+?Y{;ceImrt^~j$q-a_ZMh-tm_}y@4?}_ainnr z)CB9d;ZFsRT{bkNqFOb;f;0{=QYCP{Fe|h@)TThcO3`tgfO>W^VaQi~gz`bdaPk}^ zK|F?MA$`#z+7uA3A8zNh>VhWmPO-{pjl0{o*!%0$+~0}sJG>w~9o9(d_g}_Y`Ft<$ zr`=i0UBE#2hbPoYN$kR=V-fXX9#N!b>>}&o;$Xm7OejC>_Prdtj-Q9PrtMI&mAC^9_X4nOR{75>*-)c81y@p!&^b z=QJriC?L_sHgwb?)ZRe)=H_AGa+|5LE~Tg(-88{edf`^!0S^jJN6Y*kfXKGtJzB|0 z>NLD#w2ztT?j;_G=(T$ivEW556N6lGHlBXnOje8d~YBFjmIdAvqj` zL`TOKUg@*l?JB1yi{qGoHY8s{QRB+pEaO^rH_xy7Kmd)qaTk_3n}5#;{6C`0SFSsi zp5o_<;sE89R8xb-S@}f+NCg-LEjp#oy`hg#s32R{`ChaKs7#yRY3i^1`l z)ig~To8L)W;e6RyAq0fn3O$9lo8Gn1TL)-+>}SxwsI*)k=uIAk4%DJ*Hx^cY$YOP{ z_W}=s^DrV`4Y8fUGKT8!dj6<~Tce7vz7Ldzia*m;qgJE6j6kb;ZGipe?Jb3ti66)U zqXD@{RM)Fe(Q4hQvDSkzdZG0G=%n z@_|^@IvdrTs3uHHS(5!(-5XBtxB8#i#}h$?R%(_-<#$eL`t zu1IwUmCj-r(p0y78+g59WIX!Kd+@bjgTaNCwI-g!)P%+U@p#Ml%h`ZY=z>zD&VRM0 zAhc_^JF^H8svnbQu4jup2JJ8Gl7)BT5xwLuSTIZ1+ZD$khI0&VqXSlZ+_RZ)E1c26 z)#!F_EHYLe0{u6+Lv#&hsSA=P$l}>Hut2?2R2EACY@;4Y-L9eYD=4|H1}6M9fm05j zT#Ligd9cGQV2M`o*XgVb=E5kgyBZ0=Bj##%Vew?W$ZAc>s(`K~DIx-Euo<16keib# zC}nMEy50?DIPVOX3_|0slB|N;iY=3BGW6qbxSCmP-iXdSfWLqVc3;=NG$i!a2sy;^uHpvKcJc_PjT`<6N6L|ECJiMLlc}R#SJ1_YW1E{~wBf1K||trW0iMfZw4_HANB- z#ZlkQ2JMOZBl-2DdNhYEkW*aoh8Orfn=W!hTh3Pt3x;KJZ16;F42H@6vtV!>Ls>TG zu&fLsh?9?g!8nAaHDu7vc@+zTU=3=emyIa4KhjK%Mym}24~A>Ib_j#UB!%%R$N!z% zA9MS?cPoVABzce)I{5??O6U75SA{|}ak!S*(VA;?pxnmQx`@E;**f}oosQkaU7<7X zBCStN^rP7=Eh&VruNgpW=MgqgvjIhw?OePB0z)KDyEgnbrw|97hesC?CBXTkx$g8q zUzX%$tj(l`IQ3mOGN5QA1A8%Z2HOB(I_+*Pc6u$_pXPf%D^zqn103@uL>rUFi4+>7 z6J-&OMB!|x@K2vz)QJo>=O!KaRaom;)%x~W!zcgM$beUrv?E#MyQbCBj|?Tgz!L{p z6Z&i3!hKd!LwDB9B(5~wz4`(j|2r@Da0~8X`?fN!YNsdPKN#VZTR)hUM)pG?@Zw(t zAe-btm$g3t^`!?&j+n9H?iA8EWe|U$g5W#_U+K#(Y=1-~Jn7<2KqKB%<@e-RS>^rY z&;#rQ>AS12D{f~l%bsc9{UQTF7OI)9 z0=y-Osh;{$R>m{A7TLnEcZwFQr?_v<16bOq^#40{tP^G2OGrZYnvt#-cuWY~Z@i6NMd z*aesTmvzVB)Rn^Mmm6znWuciD1wWyJDbow#IWf@IrJHN^K|8CZ0rX4K`fOXg>gGLKcqQT~UyY`&AYb%ugA z*7KvVH>JXRqGf#HsCP4t@6T4FI&ns`gBX4p0xAcp7;V1h{3VLdPU6N)f4GYX(6F5e zF{UrwWdEnlLT+f}OnX8{Fe;C`X;gEGUjszSd_Gta*T12lKWA)eiW~#3fdqrvD6I@* z(j+MY8eJ)6wwJ{nBUAPzc7mg7Lj@jUJUhdhuw?xJ8g#w}QJE49vDmsZgLd+|*6~zQ z#nIEL;DRCPrNKYXjxfu=;(r{b`6&s5L(yx*WQo7rrG}%r*z&94RxDfuX)(*0O;{3j zTEUsn<=ttm-#ypQaPeW^?BnaPFA=Kg<%WY!s) zT%hYMYCd$)9N+eQeD9lZWgmNZEJ;pm5GL1InmW;tXTO0%hff&11|H)Hp_xP8KeVmG zjts(;OeUN`_LsWjTb$aC=-S*(=rTQXC7%&P#McGb|0GhDf90nE;tWeFQMz*qH*(UB zd0(~uqOGWWaR=^7FlI37YyB|9kT|}$WQ5IL72;VWT$z@cy1$ugXIC*m4jF!s%(>~I zrWK0NtZILA))Pw>F_57xZ4!&573H_#)t@M&5%UG7t{-QJ@#7uz2hQSBFJ~PU<_OoL zjmDPYcR7rE*J_ti&B=wjnFJJC8$O%-}i0efg zLL?rw;i!s?y?FUA%6UF~N@M4#oWVP^y}IHuAxFfZ#KWnR1i;g20vVz6b(`B<;nl~0 z>5po>e2GW+6hTwqc~Viy8QM&RiuxML_$r)m3}G&7lXj5i`Xc;{w>MHQL`_K@Q*sut z|5f-bkHqIYeV#nG!uf37vpnkO`w)9d0umn6t)L^*E+NRfEMiCKNT7 zZU^Br?IkZzsa~4a(e2JO%L=Ka`<%!h9YtQ2YeU$z7k!3(xUHk=Y?7ir8hd9W*MzlG zfM^?mPw#?031!{%0i@CFtDDd@U1ohvUeHkkXPE%xfg2a7@UY*?nK#l^Nj11^Q>)B$ zy|eB&D@8&y^!|3a$W2W1*wHr~!@kQnx~RaTF`|H>|4ez6bsO;rN)6r~f9l@O)T2VV zT{-<-^p8F2fJ&V;-Fvw(wH@|0b(PXDNlhyfz7URWzGSYSrfN7qhS=EOR+ojuT_}{* zI-oqV_{0p9*Yrgq>bYdURPyQ>-NjGp&Ds0qm@5DzFiA6Pk>qHq`}y`DfKPg%{70=FNx$$6sRFIBM)N!30Mgzf=W#o=syB8f{v_+Yhi{Uue9U8yhd?VCzOt zJl?iBg&&MgYfEr#fY=M}?9r3U?yTGZeyy0Q3o_PAW|vVDrG~KWW*YkvAs3h&G4Awt zyuYzlBs-?K2M13_uTj|9UcCNwKgh=Rp(tb+E8Z+uxEs3`Hz@2oZz!SK4sNTlP}x{k zK`kAw-qu1-B9@lV=7DqLJgCXj%w{3+%JqaZb(_4YCw~17e|nSX<~NO8hP|J9ydgi{ zB<;BaF{07oo(Q_@#d8Sb$wyYbJGlc_T29`0Doms8IIwb>d;R=hQyEoMgBM`3}+A#c?vA7x~>6EM;Y{Gn+|fvTH*rL{l;1o)-g0Q zWn2DP2FBiN{MX=J%j=m{<=i>s1UG*lhJ%oEx%t0PBFxTSJ8lpGysYEKCh9}--+vVO z8C2`Fw|_gVqvql(t!6QGkm)n_r!4fU63cT2xXND3SAX+_sXhJ<>!Kdj>+es_I@5v1 zomLNBT5isG#jn!HBHv!j<)}fY7EC9Yz&M+`s7~%p;|$E?H@z0do0Tw{a7-bqtav?s zi+n=O!H@C`m!rW$Xe)^9MVAIB+%L5(^H~ml>g|*$f7x#JIh4B*OLu~1f>rgSm;Nn4^Lb*H%+Hvox? z;vrHKJs8Bj6NX%Z)pEMV=%ovdcf3a{$$RX&V%gEn56n=8jK+3mE}25d3y09KlitgE zQ3)mx)1fBAWE)2PJk!!uZjIG1l&9JOF^Qyz#=e*OlI1GvFweQ!0q*OZ>l6n|4GT&T z)|CnM2fhZE<%sHuxLB){UKjgZS~RkXGLwJbf2+vU7+aI18^lCYPDI+}`o>Ilid{#b zo}Bx?0;~Hj!Ih%(Eue$!^H%=#xwYeC(^k9UHw7)MKrpB5sQrNgLrvC?pv|k`R==l0 zo#X0%($#LXANNjz#Egp5=VdlBEXR}NfxHUMx^XJwfm+Q4G-(_w?2I~UxarDTM*TV~} zc80*uUb5jh*kH-$PSjW85}M{rl&u|oJg$h5JW?)t#Q5m^_$b*kgV{fAW zforu8)tkX?ZDc0a%Wh4aiib!>3KNM9>sYLOA<~|FU^>r^eJ*E42_sdoV33VFagSEt zUZCWXh+Rp5d$awS98Cj!ZSS_BLzvH3{fRFTVkxf`)>0j+bVysh&kae0D^SfzO%>vS8A1 zW8W>^cnsX=N6=5P*z5C)4CxnZo;<2<#iu8$E)@=bQqSmQ|0f6t>%}@UV36wc-mz$X zfToJDraO>CVFZDA_vYcc?{+`@4obHLN1vJkw1^KcCU>QF#P+F3+ITDet<0ts1jc!w z?~9xqwkJt1?`k48Frqc;FpKKt(7Qjd6m=1Zr3S!%0JB-F^;Rg64}eSd+{>>OZ`Hg) zF>g3Ubqa(bCTl}GZdbvQfABjS7>HVY1+#5$<{NYfySbwbyF0&p&!@s=vs{Ux$yvao zq~>I-465^k`OU(UY01ew2_`XThx0a>M!q4jZP2Qa;GR*TwpEP4W-%0%1~J|5-gq7b z*s1;2jclyIYOf~fkjiJI&!PK2zPDJLNC9do`CfEG5;gT`Iv8Jj6HI#Zb~?<0 zzHznIAlYgybU#q#p$k|~Jx4#_N&d@mv&tu+kQAEZU3e*9o~wKVW)06;VCz!5K>_`4 zgz|?n=;;C=LcqTI(fYc>PWqN`@-PjO1b~l_?z>OyNm_W8lK{WfYd0Ir9_L*>nR=L^ zOa67mB6hLGi~(Ivu*GR@8!>eM-#Sa(lR*Nw75o}o&ym&u! zi4eBLc*1%+ZLzwTIMeA*Hu?8$o;F1umP0>%&x^%=hlV6r0GcY=GY!EQ8P(flHQ#Ot z)L|}mXxWP2oYnuR*1C@hH?w$1Go(2or$PnjEIs#=>xGJY>{ImDpd`&w6H9mWTFQFN zrIQVgl&nhjPK|R4lP@?>Q63<&-Sq&BI;Nc$yTNC#Geok<$FXS&hr)4K(+*w4{Lw~(gq}HZDESRLCR77sZvnPNnS*1j&Xm%G@ zo_8wcFE4@(5e{X4jtcDQKs=4Y{2m6RB;Gw}*sky+Ado>^2QW9*DAFr3X2@gX7HN)l zKPG)S#uzr4an9&byvKL8EAZ~weSS7!e6+WQ{rF-0Z1T`xB5Gz;I9uu_$HfgAZYh%= z#W+UV`~YA_ehu@?q4NuF+sA{j?tX`~E+dF#e!=BHyZj|W<6%ZPc$JZg3f3MU}?;lU1Zdho23-J@A4H$~;D@_(sQBu7`rPddb@5GX~ zZ_>*!(Sxltff_J6>oRna@~zMy1Ja`WRkLnrC4kXC`0X74DbR)t=8!n-(#EhJCnsd` zT)IP`7T%$w)F#{K+lcouR}1k;L)D0}Y^(D8 z`ERUN>fm_u0XCA^sR7s!*q93B`vZ(cnv;T2PPTF1q-Kb)&M?x?iboQ#DZ-q|C%16U z$X_@2Z)`WHYp9G65ai^BPZsRh0E94x6dt~8 z37+r(>YL+&GwY`vmA~Qdbk|kqn>VI!MEG=jN+L&+lX@Oh123w}TBH11Uay+W(*T-f z8C3|vSn1=lj9p=sYM_NrvZ3cIm$EX|;8zvM!3Dk0>C@8t@LwGPAYTMhh&D}6Q82LZ z>mtNdsHptAfFaMdn!5)&I5Hj&UK|>*7Zc>S)o90iba+Cik+19KU9bvhQ}SL_)f%!{ zVhv@g^B)PxoixI6#LZjfap!1%#4Ic!#*5%V-M+LdVmI2~-XboziAsp*7c!XAKpsvt zemt^9B~WGw4MTdCi`vGSA7Q$s6FdWU_k`JwK;TmXnxZ8pvri4&n83i7Jb`Jc7H6c^ zMJx1t*tQ1?EUzZzKE(9grZgjbgYcz4JbsgrPFk;vQEAJ*sC4YHq@1)8o2PUuw~f0ERX>ea9;Ewkd`iTx ztj;N#;4Xn`zM0A8hJ7rH(Fo_)Fab9l{-}2c zjw3Xo3h(~r*~E&Gt_F*;CgPU~bx)NYVjC$T9? zK}Xbx5)psD2y%%RssE&UJWaa0h&zvVW+n8pX>fBvxrvUz2ceEZLhE?FR?{LaDW4@K zaeofb-f38tM?>!*R5dH4xl<&2ukAk4GNb3Q_GSnAjAl$nv*$ex8JnOUpwqegNok8| zSksPI~5-wD@L@$IQet4j&JZ?Rya8sKNd2c;HPm+S>Gt0JH z#7f_%gP(?%odc2|KWrE#~ zGVf6EOn)kkR2i04&Ej7RhDUIsEa|eoQs0hQ?+pozYPwbQ?>O1^5FA_Ha<$K$gcu5< Ai`@1AjQn2*r~zwL+c>?A^M^R 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 literal 0 HcmV?d00001 diff --git a/themes/DoIt b/themes/DoIt index ac6270f67..79024fbc8 160000 --- a/themes/DoIt +++ b/themes/DoIt @@ -1 +1 @@ -Subproject commit ac6270f67bf856b860a46ebc4d20a98dea763bff +Subproject commit 79024fbc81e0360f887b26ae8b3d9d6908da465a From 81217523e16f543948d0c660d21586b321982811 Mon Sep 17 00:00:00 2001 From: Alexandre Touret Date: Tue, 24 Oct 2023 14:43:22 +0200 Subject: [PATCH 02/14] feat: improve introduction --- ...ibuted-tracing-docker-container-java.en.md | 24 +++++++++++++++---- .../images/2023/10/architecture_container.svg | 1 + .../images/2023/10/architecture_system.svg | 1 + 3 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 static/assets/images/2023/10/architecture_container.svg create mode 100644 static/assets/images/2023/10/architecture_system.svg diff --git a/content/posts/agent-distributed-tracing-docker-container-java.en.md b/content/posts/agent-distributed-tracing-docker-container-java.en.md index b8f88e171..1aff845de 100644 --- a/content/posts/agent-distributed-tracing-docker-container-java.en.md +++ b/content/posts/agent-distributed-tracing-docker-container-java.en.md @@ -22,20 +22,36 @@ The main point is how to minimize the impact of deploying APM agents on the deli In this article, I will expose how to ship APM agents for instrumenting Java applications deployed on top of Kubernetes through Docker containers. -We can basically achieve that in two ways: +In addition, to make it easy, I will illustrate this setup by this use case: +We have an API _"My wonderful API"_ which is instrumented through an Elastic APM agent. +The data is then sent to the Elastic APM. + + +{{< style "text-align:center" >}} +![c4 context diagram](/assets/images/2023/10/architecture_system.svg ) +{{}} + +Now, if we dive into the "Wonderful System", we can see the Java application and the agent: + +{{< style "text-align:center" >}} +![c4 context diagram](/assets/images/2023/10/architecture_container.svg ) +{{}} + +We can basically implement this architecture in two ways: 1. Deploy the agent in all Docker images 2. Deploy the agent asides from the Docker images and use initContainers to bring the agent at the startup of our applications - ## Why not bringing APM agents in all of our Docker images? It could be really easy to put the APM agents in the application's Docker images. Nonetheless, if you want to upgrade your agent, you will have to repackage and redeploy all your Docker images. For regular upgrades, it won't bother you, but, if you encounter a bug, it could be tricky and annoying to do that. -What's why I prefer loose coupling the Docker images from _"business"_ applications to technical tools such as APM agents. +What's why I prefer loose coupling the _"business"_ applications Docker images to technical tools such as APM agents. ## Deploy an APM agent through initContainers -While looking around how to achieve this, I came across to [Kubernetes initContainers](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/). +While looking around how to achieve this, I came across to the [Kubernetes initContainers](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/). + +The only constraint is to declare a volume in your function diff --git a/static/assets/images/2023/10/architecture_container.svg b/static/assets/images/2023/10/architecture_container.svg new file mode 100644 index 000000000..78adb9915 --- /dev/null +++ b/static/assets/images/2023/10/architecture_container.svg @@ -0,0 +1 @@ +My wonderful System[System]Kubernetes[Container]Docker Container[Container]Java ApplicationJavaAgentUserElastic APMUsesUsesSends traces \ No newline at end of file diff --git a/static/assets/images/2023/10/architecture_system.svg b/static/assets/images/2023/10/architecture_system.svg new file mode 100644 index 000000000..f9eb7c6f4 --- /dev/null +++ b/static/assets/images/2023/10/architecture_system.svg @@ -0,0 +1 @@ +UserMy Wonderful SystemElastic APMUsesSends traces \ No newline at end of file From 33ae5a3d6b37b2d2f497b01c28e9861196000261 Mon Sep 17 00:00:00 2001 From: Alexandre Touret Date: Wed, 25 Oct 2023 10:19:08 +0200 Subject: [PATCH 03/14] feat: improvements --- ...ibuted-tracing-docker-container-java.en.md | 63 +++++++++++++++++-- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/content/posts/agent-distributed-tracing-docker-container-java.en.md b/content/posts/agent-distributed-tracing-docker-container-java.en.md index 1aff845de..eef3e1e68 100644 --- a/content/posts/agent-distributed-tracing-docker-container-java.en.md +++ b/content/posts/agent-distributed-tracing-docker-container-java.en.md @@ -31,7 +31,7 @@ The data is then sent to the Elastic APM. ![c4 context diagram](/assets/images/2023/10/architecture_system.svg ) {{}} -Now, if we dive into the "Wonderful System", we can see the Java application and the agent: +Now, if we dive into the _"Wonderful System"_, we can see the _Wonderful Java application_ and the agent: {{< style "text-align:center" >}} ![c4 context diagram](/assets/images/2023/10/architecture_container.svg ) @@ -39,7 +39,7 @@ Now, if we dive into the "Wonderful System", we can see the Java application and We can basically implement this architecture in two ways: -1. Deploy the agent in all Docker images +1. Deploy the agent in all of our Docker images 2. Deploy the agent asides from the Docker images and use initContainers to bring the agent at the startup of our applications ## Why not bringing APM agents in all of our Docker images? @@ -53,5 +53,60 @@ What's why I prefer loose coupling the _"business"_ applications Docker images t While looking around how to achieve this, I came across to the [Kubernetes initContainers](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/). -The only constraint is to declare a volume in your function - +This kind of container is run only once during the startup of every pod. +A bunch of commands is ran then on top of it. +For our current use case, it will copy the javaagent into a volume such as an [empty directory volume](https://kubernetes.io/docs/concepts/storage/volumes/#emptydir). + +### Impacts in the "_Wonderful Java Application_ Docker image +The main impact is to declare a volume in your Docker image: + +```dockerfile +VOLUME /opt/agent +``` +It will be used by both the Docker container and the initContainer. + +Now, let's build our initContainer Docker image. + +### InitContainer Docker Image creation +It's really straightforward: + +```dockerfile +FROM alpine:latest +RUN mkdir -p /opt/agent_setup +RUN mkdir /opt/agent +COPY ./javaagent.jar /opt/agent_setup/javaagent.jar +VOLUME /opt/agent +``` + +### Kubernetes configuration +We can now set up our Kubernetes Deployment to start the corresponding container and copy the Java agent. + +```yaml +kind: Deployment +spec: + containers: + - name: java-app + image: repo/my-wonderful-java-app:v1 + volumeMounts: + - mountPath: /opt/agent + name: apm-agent-volume + initContainers: + - command: + - cp + - /opt/agent_setup/javaagent.jar + - /opt/agent + name: apm-agent-init + image: repo/apm-agent:v1 + volumeMounts: + - mountPath: /opt/agent + name: appd-agent-volume + volumes: + - name: appd-agent-volume + emptyDir: {} +``` + +{{< admonition tip "Why not copying the java agent directly in the initContainer Docker image execution?" >}} +The copy must be run with a command specified in the initContainer declaration and cannot be done during the initContainer execution (i.e., specified in its Docker file). +Why? +The volume is mounted just after the initContainer execution and drops the JAR file copied earlier. +{{}} From d9c88264f1743a9091f86ac970ca36639e1b84e5 Mon Sep 17 00:00:00 2001 From: Alexandre Touret Date: Wed, 25 Oct 2023 14:41:21 +0200 Subject: [PATCH 04/14] feat: improvements --- ...ibuted-tracing-docker-container-java.en.md | 62 ++++++++++++++----- 1 file changed, 48 insertions(+), 14 deletions(-) diff --git a/content/posts/agent-distributed-tracing-docker-container-java.en.md b/content/posts/agent-distributed-tracing-docker-container-java.en.md index eef3e1e68..da07c77f2 100644 --- a/content/posts/agent-distributed-tracing-docker-container-java.en.md +++ b/content/posts/agent-distributed-tracing-docker-container-java.en.md @@ -16,16 +16,15 @@ tags: - Elastic --- -In [my last article](https://blog.touret.info/2023/09/05/distributed-tracing-opentelemetry-camel-artemis/), I dug into enabling distributed tracing and exposed how to enable it on Java applications. -Now, we must deploy it on Kubernetes and get distributed tracing insights. -The main point is how to minimize the impact of deploying APM agents on the delivery of our applications. +In [my last article](https://blog.touret.info/2023/09/05/distributed-tracing-opentelemetry-camel-artemis/), I dug into enabling distributed tracing and exposed how to enable it in Java applications. +We didn't see how to deploy an application on Kubernetes and get distributed tracing insights. +The are several strategies to achieve that, but the main point is how to minimize the impact of deploying APM agents on the whole delivery process. In this article, I will expose how to ship APM agents for instrumenting Java applications deployed on top of Kubernetes through Docker containers. -In addition, to make it easy, I will illustrate this setup by this use case: -We have an API _"My wonderful API"_ which is instrumented through an Elastic APM agent. -The data is then sent to the Elastic APM. - +In addition, to make it easy, I will illustrate this setup by the following use case: +We have an API _"My wonderful API"_ which is instrumented through an [Elastic APM agent](https://www.elastic.co/guide/en/apm/agent/index.html). +The data is then sent to the [Elastic APM](https://www.elastic.co/guide/en/apm). {{< style "text-align:center" >}} ![c4 context diagram](/assets/images/2023/10/architecture_system.svg ) @@ -37,20 +36,19 @@ Now, if we dive into the _"Wonderful System"_, we can see the _Wonderful Java ap ![c4 context diagram](/assets/images/2023/10/architecture_container.svg ) {{}} -We can basically implement this architecture in two ways: +We can basically implement this architecture in two different ways: -1. Deploy the agent in all of our Docker images -2. Deploy the agent asides from the Docker images and use initContainers to bring the agent at the startup of our applications -## Why not bringing APM agents in all of our Docker images? +1. Deploying the agent in all of our Docker images +2. Deploying the agent asides from the Docker images and using initContainers to bring the agent at the startup of our applications +## Why not bringing APM agents in all of our Docker images? It could be really easy to put the APM agents in the application's Docker images. -Nonetheless, if you want to upgrade your agent, you will have to repackage and redeploy all your Docker images. +Nonetheless, if you want to upgrade your agent, you will have to repackage it and redeploy all your Docker images. For regular upgrades, it won't bother you, but, if you encounter a bug, it could be tricky and annoying to do that. What's why I prefer loose coupling the _"business"_ applications Docker images to technical tools such as APM agents. ## Deploy an APM agent through initContainers - While looking around how to achieve this, I came across to the [Kubernetes initContainers](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/). This kind of container is run only once during the startup of every pod. @@ -64,11 +62,23 @@ The main impact is to declare a volume in your Docker image: VOLUME /opt/agent ``` It will be used by both the Docker container and the initContainer. +We can consider it as a "bridge" between these two containers. + +We also have to declare one environment variable: ``JAVA_OPTS``. + +```dockerfile +ENV JAVA_OPTS=$JAVA_OPTS +[...] +ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} org.springframework.boot.loader.JarLauncher"] +``` + +Il will be used during the deployment to set up our _Wonderful Java Application_. Now, let's build our initContainer Docker image. ### InitContainer Docker Image creation -It's really straightforward: +It's really straightforward. +We can use such a configuration: ```dockerfile FROM alpine:latest @@ -110,3 +120,27 @@ The copy must be run with a command specified in the initContainer declaration a Why? The volume is mounted just after the initContainer execution and drops the JAR file copied earlier. {{}} + + +## Start the Java Application with the agent +Last but not least, we can now configure our pods which run our Java applications. +We will use the ``JAVA_OPTS`` environment variable to configure the location of the Java agent, and [the Elastic APM Java system properties](https://www.elastic.co/guide/en/apm/agent/java/current/configuration.html). + +For instance: + +```jshelllanguage +JAVA_OPTS=-javaagent:/opt/agent/javaagent.jar -Delastic.apm.service_name=my-wonderful-application -Delastic.apm.application_packages=org.mywonderfulapp -Delastic.apm.server_url=http://apm:8200 +``` + +You can then configure your Kubernetes deployment as: + +```yaml +spec: + containers: + - name: java-app + env: + - name: JAVA_OPTS + value: -javaagent:/opt/agent/javaagent.jar -Delastic.apm.service_name=my-wonderful-application -Delastic.apm.application_packages=org.mywonderfulapp -Delastic.apm.server_url=http://apm:8200 +``` + +## Conclusion From d449ea9f88004d88312adcbb0a711f31a637746c Mon Sep 17 00:00:00 2001 From: Alexandre Touret Date: Wed, 25 Oct 2023 16:15:22 +0200 Subject: [PATCH 05/14] feat: conflusion & typos --- ...ibuted-tracing-docker-container-java.en.md | 36 +++++++++++++------ 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/content/posts/agent-distributed-tracing-docker-container-java.en.md b/content/posts/agent-distributed-tracing-docker-container-java.en.md index da07c77f2..24f55a9a9 100644 --- a/content/posts/agent-distributed-tracing-docker-container-java.en.md +++ b/content/posts/agent-distributed-tracing-docker-container-java.en.md @@ -16,15 +16,16 @@ tags: - Elastic --- -In [my last article](https://blog.touret.info/2023/09/05/distributed-tracing-opentelemetry-camel-artemis/), I dug into enabling distributed tracing and exposed how to enable it in Java applications. +In [my last article](https://blog.touret.info/2023/09/05/distributed-tracing-opentelemetry-camel-artemis/), I dug into distributed tracing and exposed how to enable it in Java applications. We didn't see how to deploy an application on Kubernetes and get distributed tracing insights. -The are several strategies to achieve that, but the main point is how to minimize the impact of deploying APM agents on the whole delivery process. +Several strategies can be considered, but the main point is how to minimize the impact of deploying APM agents on the whole delivery process. -In this article, I will expose how to ship APM agents for instrumenting Java applications deployed on top of Kubernetes through Docker containers. +In this article, I will expose how to ship APM agents for instrumenting Java applications deployed on top of [Kubernetes](https://kubernetes.io/) through [Docker containers](https://www.docker.com/resources/what-container/). In addition, to make it easy, I will illustrate this setup by the following use case: -We have an API _"My wonderful API"_ which is instrumented through an [Elastic APM agent](https://www.elastic.co/guide/en/apm/agent/index.html). -The data is then sent to the [Elastic APM](https://www.elastic.co/guide/en/apm). + +* We have an API _"My wonderful API"_ which is instrumented through an [Elastic APM agent](https://www.elastic.co/guide/en/apm/agent/index.html). +* The data is then sent to the [Elastic APM](https://www.elastic.co/guide/en/apm). {{< style "text-align:center" >}} ![c4 context diagram](/assets/images/2023/10/architecture_system.svg ) @@ -41,12 +42,12 @@ We can basically implement this architecture in two different ways: 1. Deploying the agent in all of our Docker images 2. Deploying the agent asides from the Docker images and using initContainers to bring the agent at the startup of our applications -## Why not bringing APM agents in all of our Docker images? -It could be really easy to put the APM agents in the application's Docker images. +## Why not bringing APM agents in our Docker images? +It could be really tempting to put the APM agents in the application's Docker image. Nonetheless, if you want to upgrade your agent, you will have to repackage it and redeploy all your Docker images. -For regular upgrades, it won't bother you, but, if you encounter a bug, it could be tricky and annoying to do that. +For regular upgrades, it will not bother you, but, if you encounter a bug, it will be tricky and annoying to do that. -What's why I prefer loose coupling the _"business"_ applications Docker images to technical tools such as APM agents. +What is why I prefer loose coupling the _"business"_ applications Docker images to technical tools such as APM agents. ## Deploy an APM agent through initContainers While looking around how to achieve this, I came across to the [Kubernetes initContainers](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/). @@ -66,6 +67,8 @@ We can consider it as a "bridge" between these two containers. We also have to declare one environment variable: ``JAVA_OPTS``. +For instance: + ```dockerfile ENV JAVA_OPTS=$JAVA_OPTS [...] @@ -77,7 +80,7 @@ Il will be used during the deployment to set up our _Wonderful Java Application_ Now, let's build our initContainer Docker image. ### InitContainer Docker Image creation -It's really straightforward. +It is really straightforward. We can use such a configuration: ```dockerfile @@ -115,7 +118,7 @@ spec: emptyDir: {} ``` -{{< admonition tip "Why not copying the java agent directly in the initContainer Docker image execution?" >}} +{{< admonition tip "Why not copying the Java agent directly in the initContainer Docker image execution?" >}} The copy must be run with a command specified in the initContainer declaration and cannot be done during the initContainer execution (i.e., specified in its Docker file). Why? The volume is mounted just after the initContainer execution and drops the JAR file copied earlier. @@ -143,4 +146,15 @@ spec: value: -javaagent:/opt/agent/javaagent.jar -Delastic.apm.service_name=my-wonderful-application -Delastic.apm.application_packages=org.mywonderfulapp -Delastic.apm.server_url=http://apm:8200 ``` +_Et voila!_ + ## Conclusion + +We have seen how to enable Java APM configuration on Java Applications deployed on top of Docker images. +Obviously, my technical choice of using an InitContainer can be challenged regarding the technical context and how you are confortable with your delivery practices. +You probably noticed I use an emptyDir to deploy the Java agent. +_Normally_ it will not be a big deal, but I advise you to check this usage with your Kubernetes SRE/Ops/Administrator first. + +Anyway, I think it is worth it and the tradeoffs are more than acceptable because this approach are, in my opinion, more flexible than the first one. + +Hope this helps! From 85e2c60a51f45825622d1b4b70f3cf187384c132 Mon Sep 17 00:00:00 2001 From: Alexandre Touret Date: Wed, 25 Oct 2023 16:29:33 +0200 Subject: [PATCH 06/14] feat: improve title --- .../agent-distributed-tracing-docker-container-java.en.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/posts/agent-distributed-tracing-docker-container-java.en.md b/content/posts/agent-distributed-tracing-docker-container-java.en.md index 24f55a9a9..9f7862487 100644 --- a/content/posts/agent-distributed-tracing-docker-container-java.en.md +++ b/content/posts/agent-distributed-tracing-docker-container-java.en.md @@ -1,6 +1,6 @@ --- -title: "Deploy your Elastic APM Agent to Kubernetes and instrument your Java applications in a smart way" -date: 2023-10-24T10:28:11+02:00 +title: "Deploy your Java Application to Kubernetes and get your traces through Elastic APM Agent in a smart way" +date: 2023-11-06T08:00:00+02:00 draft: true images: ["/assets/images/2023/10/claudio-schwarz-q8kR_ie6WnI-unsplash.webp"] From 89567c19354dc9b7b941e0ae466bf15fbd7a39ab Mon Sep 17 00:00:00 2001 From: Alexandre Touret Date: Wed, 25 Oct 2023 18:00:06 +0200 Subject: [PATCH 07/14] feat: improve title --- ...k-ship-java-deployment-distributed-tracing-elasticapm.en.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename content/posts/{agent-distributed-tracing-docker-container-java.en.md => pack-ship-java-deployment-distributed-tracing-elasticapm.en.md} (98%) diff --git a/content/posts/agent-distributed-tracing-docker-container-java.en.md b/content/posts/pack-ship-java-deployment-distributed-tracing-elasticapm.en.md similarity index 98% rename from content/posts/agent-distributed-tracing-docker-container-java.en.md rename to content/posts/pack-ship-java-deployment-distributed-tracing-elasticapm.en.md index 9f7862487..486ccfad0 100644 --- a/content/posts/agent-distributed-tracing-docker-container-java.en.md +++ b/content/posts/pack-ship-java-deployment-distributed-tracing-elasticapm.en.md @@ -1,5 +1,5 @@ --- -title: "Deploy your Java Application to Kubernetes and get your traces through Elastic APM Agent in a smart way" +title: "Streamline Java Application Deployment: Pack, Ship, and Unlock Distributed Tracing with Elastic APM on Kubernetes" date: 2023-11-06T08:00:00+02:00 draft: true From 0e84b78db8121b977c5f78ad5fb4e667a586639d Mon Sep 17 00:00:00 2001 From: Alexandre Touret Date: Thu, 26 Oct 2023 16:35:53 +0200 Subject: [PATCH 08/14] chore: Typos --- ...yment-distributed-tracing-elasticapm.en.md | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/content/posts/pack-ship-java-deployment-distributed-tracing-elasticapm.en.md b/content/posts/pack-ship-java-deployment-distributed-tracing-elasticapm.en.md index 486ccfad0..9e00a6568 100644 --- a/content/posts/pack-ship-java-deployment-distributed-tracing-elasticapm.en.md +++ b/content/posts/pack-ship-java-deployment-distributed-tracing-elasticapm.en.md @@ -16,8 +16,8 @@ tags: - Elastic --- -In [my last article](https://blog.touret.info/2023/09/05/distributed-tracing-opentelemetry-camel-artemis/), I dug into distributed tracing and exposed how to enable it in Java applications. -We didn't see how to deploy an application on Kubernetes and get distributed tracing insights. +In [my last article](https://blog.touret.info/2023/09/05/distributed-tracing-opentelemetry-camel-artemis/), I dug into [Distributed Tracing](https://www.w3.org/TR/trace-context/) and exposed how to enable it in Java applications. +We didn't see yet how to deploy an application on Kubernetes and get distributed tracing insights. Several strategies can be considered, but the main point is how to minimize the impact of deploying APM agents on the whole delivery process. In this article, I will expose how to ship APM agents for instrumenting Java applications deployed on top of [Kubernetes](https://kubernetes.io/) through [Docker containers](https://www.docker.com/resources/what-container/). @@ -37,6 +37,13 @@ Now, if we dive into the _"Wonderful System"_, we can see the _Wonderful Java ap ![c4 context diagram](/assets/images/2023/10/architecture_container.svg ) {{}} +{{< admonition tip "Elastic APM vs Grafana/OpenTelemetry" >}} +In this article I delve into how to package an [Elastic APM agent](https://www.elastic.co/guide/en/apm/agent/java/current/configuration.html) and enable Distributed Tracing with the [Elastic APM suite](https://www.elastic.co/guide/en/apm/index.html). + +You can do that in the same way with an OpenTelemetry Agent. +Furthermore, [Elastic APM is compatible with OpenTelemetry](https://www.elastic.co/fr/blog/native-opentelemetry-support-in-elastic-observability). +{{}} + We can basically implement this architecture in two different ways: 1. Deploying the agent in all of our Docker images @@ -44,8 +51,16 @@ We can basically implement this architecture in two different ways: ## Why not bringing APM agents in our Docker images? It could be really tempting to put the APM agents in the application's Docker image. + +As an example, we can add the following lines of code in our Docker images definition: + +```dockerfile +RUN mkdir /opt/agent +COPY ./javaagent.jar /opt/agent/javaagent.jar +``` + Nonetheless, if you want to upgrade your agent, you will have to repackage it and redeploy all your Docker images. -For regular upgrades, it will not bother you, but, if you encounter a bug, it will be tricky and annoying to do that. +For regular upgrades, it will not bother you, but, if you encounter a bug or a vulnerability, it will be tricky and annoying to do that. What is why I prefer loose coupling the _"business"_ applications Docker images to technical tools such as APM agents. @@ -81,7 +96,7 @@ Now, let's build our initContainer Docker image. ### InitContainer Docker Image creation It is really straightforward. -We can use such a configuration: +We can use for example, the following configuration: ```dockerfile FROM alpine:latest @@ -119,14 +134,15 @@ spec: ``` {{< admonition tip "Why not copying the Java agent directly in the initContainer Docker image execution?" >}} -The copy must be run with a command specified in the initContainer declaration and cannot be done during the initContainer execution (i.e., specified in its Docker file). +The copy must be run with a command specified in the initContainer declaration and cannot be done during the initContainer execution (i.e., specified in its Dockerfile). Why? The volume is mounted just after the initContainer execution and drops the JAR file copied earlier. {{}} ## Start the Java Application with the agent -Last but not least, we can now configure our pods which run our Java applications. +Last but not least, we can now configure the [pods](https://kubernetes.io/docs/concepts/workloads/pods/) where we run our Java applications. + We will use the ``JAVA_OPTS`` environment variable to configure the location of the Java agent, and [the Elastic APM Java system properties](https://www.elastic.co/guide/en/apm/agent/java/current/configuration.html). For instance: @@ -150,7 +166,7 @@ _Et voila!_ ## Conclusion -We have seen how to enable Java APM configuration on Java Applications deployed on top of Docker images. +We have seen how to pack and deploy Distributed Tracing java agents and Java Applications deployed on top of Docker images. Obviously, my technical choice of using an InitContainer can be challenged regarding the technical context and how you are confortable with your delivery practices. You probably noticed I use an emptyDir to deploy the Java agent. _Normally_ it will not be a big deal, but I advise you to check this usage with your Kubernetes SRE/Ops/Administrator first. From 97a9b110dd8b30cdc6c729dcd76a6d2be4bdeaa5 Mon Sep 17 00:00:00 2001 From: Alexandre Touret Date: Thu, 26 Oct 2023 18:32:11 +0200 Subject: [PATCH 09/14] chore: Typos --- ...-ship-java-deployment-distributed-tracing-elasticapm.en.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/content/posts/pack-ship-java-deployment-distributed-tracing-elasticapm.en.md b/content/posts/pack-ship-java-deployment-distributed-tracing-elasticapm.en.md index 9e00a6568..577c8468c 100644 --- a/content/posts/pack-ship-java-deployment-distributed-tracing-elasticapm.en.md +++ b/content/posts/pack-ship-java-deployment-distributed-tracing-elasticapm.en.md @@ -49,10 +49,12 @@ We can basically implement this architecture in two different ways: 1. Deploying the agent in all of our Docker images 2. Deploying the agent asides from the Docker images and using initContainers to bring the agent at the startup of our applications +We will then see how to lose couple application docker images to the apm agent one. + ## Why not bringing APM agents in our Docker images? It could be really tempting to put the APM agents in the application's Docker image. -As an example, we can add the following lines of code in our Docker images definition: +We can illustrate it adding the following lines of code in our Docker images definition: ```dockerfile RUN mkdir /opt/agent From dad54104ebd0d3c3b24b236d0280831663094e3c Mon Sep 17 00:00:00 2001 From: Alexandre Touret Date: Mon, 30 Oct 2023 10:21:53 +0100 Subject: [PATCH 10/14] chore: Typos --- ...oyment-distributed-tracing-elasticapm.en.md | 18 ++++++++++-------- content/talks.en.md | 2 +- themes/DoIt | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/content/posts/pack-ship-java-deployment-distributed-tracing-elasticapm.en.md b/content/posts/pack-ship-java-deployment-distributed-tracing-elasticapm.en.md index 577c8468c..50dbc16a2 100644 --- a/content/posts/pack-ship-java-deployment-distributed-tracing-elasticapm.en.md +++ b/content/posts/pack-ship-java-deployment-distributed-tracing-elasticapm.en.md @@ -1,7 +1,7 @@ --- title: "Streamline Java Application Deployment: Pack, Ship, and Unlock Distributed Tracing with Elastic APM on Kubernetes" -date: 2023-11-06T08:00:00+02:00 -draft: true +date: 2023-11-02T08:00:00+02:00 +draft: false images: ["/assets/images/2023/10/claudio-schwarz-q8kR_ie6WnI-unsplash.webp"] featuredImagePreview: /assets/images/2023/10/claudio-schwarz-q8kR_ie6WnI-unsplash.webp @@ -22,7 +22,7 @@ Several strategies can be considered, but the main point is how to minimize the In this article, I will expose how to ship APM agents for instrumenting Java applications deployed on top of [Kubernetes](https://kubernetes.io/) through [Docker containers](https://www.docker.com/resources/what-container/). -In addition, to make it easy, I will illustrate this setup by the following use case: +To make it clearer, I will illustrate this setup by the following use case: * We have an API _"My wonderful API"_ which is instrumented through an [Elastic APM agent](https://www.elastic.co/guide/en/apm/agent/index.html). * The data is then sent to the [Elastic APM](https://www.elastic.co/guide/en/apm). @@ -54,7 +54,8 @@ We will then see how to lose couple application docker images to the apm agent o ## Why not bringing APM agents in our Docker images? It could be really tempting to put the APM agents in the application's Docker image. -We can illustrate it adding the following lines of code in our Docker images definition: +Why? +Because you just have to add the following lines of code in our Docker images definition: ```dockerfile RUN mkdir /opt/agent @@ -62,6 +63,7 @@ COPY ./javaagent.jar /opt/agent/javaagent.jar ``` Nonetheless, if you want to upgrade your agent, you will have to repackage it and redeploy all your Docker images. + For regular upgrades, it will not bother you, but, if you encounter a bug or a vulnerability, it will be tricky and annoying to do that. What is why I prefer loose coupling the _"business"_ applications Docker images to technical tools such as APM agents. @@ -80,7 +82,7 @@ The main impact is to declare a volume in your Docker image: VOLUME /opt/agent ``` It will be used by both the Docker container and the initContainer. -We can consider it as a "bridge" between these two containers. +We can consider it as a "bridge" between these two ones. We also have to declare one environment variable: ``JAVA_OPTS``. @@ -94,7 +96,7 @@ ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} org.springframework.boot.loader.JarLa Il will be used during the deployment to set up our _Wonderful Java Application_. -Now, let's build our initContainer Docker image. +Now, let's build our initContainer's Docker image. ### InitContainer Docker Image creation It is really straightforward. @@ -168,8 +170,8 @@ _Et voila!_ ## Conclusion -We have seen how to pack and deploy Distributed Tracing java agents and Java Applications deployed on top of Docker images. -Obviously, my technical choice of using an InitContainer can be challenged regarding the technical context and how you are confortable with your delivery practices. +We have seen how to pack and deploy Distributed Tracing java agents and Java Applications built on top of Docker images. +Obviously, my technical choice of using an InitContainer can be challenged regarding your technical context and how you are confortable with your delivery practices. You probably noticed I use an emptyDir to deploy the Java agent. _Normally_ it will not be a big deal, but I advise you to check this usage with your Kubernetes SRE/Ops/Administrator first. diff --git a/content/talks.en.md b/content/talks.en.md index b38658378..5d50bf6b5 100644 --- a/content/talks.en.md +++ b/content/talks.en.md @@ -93,7 +93,7 @@ A l’issue de cet atelier, nous aurons une vue complète et mis en pratique dif How to learn architecture ? How to improve in this field ? How do we recognize a good or a bad architecture ? Plenty of books and training sessions address this subject. The best thing is to practice! In the same way as CodingDojos, I will present to you architecture katas. -Ted NEWARD (http://blogs.tedneward.com/) created them. His idea came from the following observation : +[Ted NEWARD](http://blogs.tedneward.com/) created them. His idea came from the following observation : "How are we supposed to get great architects, if they only get the chance to architect fewer than a half-dozen times in their career?" One solution to this issue could be to practice regularly on several topics to gain experience. After a brief introduction of how to start designing an architecture, I will present architecture katas, and the conduct. diff --git a/themes/DoIt b/themes/DoIt index 79024fbc8..ac6270f67 160000 --- a/themes/DoIt +++ b/themes/DoIt @@ -1 +1 @@ -Subproject commit 79024fbc81e0360f887b26ae8b3d9d6908da465a +Subproject commit ac6270f67bf856b860a46ebc4d20a98dea763bff From c05ae893ed3651531d8c6c370c61359afd9953d3 Mon Sep 17 00:00:00 2001 From: Alexandre Touret Date: Mon, 30 Oct 2023 18:03:25 +0100 Subject: [PATCH 11/14] chore: Typos --- ...-ship-java-deployment-distributed-tracing-elasticapm.en.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/posts/pack-ship-java-deployment-distributed-tracing-elasticapm.en.md b/content/posts/pack-ship-java-deployment-distributed-tracing-elasticapm.en.md index 50dbc16a2..e11d19b02 100644 --- a/content/posts/pack-ship-java-deployment-distributed-tracing-elasticapm.en.md +++ b/content/posts/pack-ship-java-deployment-distributed-tracing-elasticapm.en.md @@ -40,7 +40,7 @@ Now, if we dive into the _"Wonderful System"_, we can see the _Wonderful Java ap {{< admonition tip "Elastic APM vs Grafana/OpenTelemetry" >}} In this article I delve into how to package an [Elastic APM agent](https://www.elastic.co/guide/en/apm/agent/java/current/configuration.html) and enable Distributed Tracing with the [Elastic APM suite](https://www.elastic.co/guide/en/apm/index.html). -You can do that in the same way with an OpenTelemetry Agent. +You can do that in the same way with an [OpenTelemetry Agent](https://github.com/open-telemetry/opentelemetry-java-instrumentation). Furthermore, [Elastic APM is compatible with OpenTelemetry](https://www.elastic.co/fr/blog/native-opentelemetry-support-in-elastic-observability). {{}} @@ -137,7 +137,7 @@ spec: emptyDir: {} ``` -{{< admonition tip "Why not copying the Java agent directly in the initContainer Docker image execution?" >}} +{{< admonition tip "Why not just copying the Java agent directly in the initContainer Docker image execution?" >}} The copy must be run with a command specified in the initContainer declaration and cannot be done during the initContainer execution (i.e., specified in its Dockerfile). Why? The volume is mounted just after the initContainer execution and drops the JAR file copied earlier. From 3f0fa631a7757bd50e19e8ced4624a97f6bd6fac Mon Sep 17 00:00:00 2001 From: Alexandre Touret Date: Mon, 30 Oct 2023 18:14:28 +0100 Subject: [PATCH 12/14] chore: Theme update --- themes/DoIt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/DoIt b/themes/DoIt index ac6270f67..686aa5b01 160000 --- a/themes/DoIt +++ b/themes/DoIt @@ -1 +1 @@ -Subproject commit ac6270f67bf856b860a46ebc4d20a98dea763bff +Subproject commit 686aa5b011d34926865b73d900cce20b3b7b6a03 From feeef5ca550a2a2ea6bc3d6c7c73eb8369678213 Mon Sep 17 00:00:00 2001 From: Alexandre Touret Date: Wed, 1 Nov 2023 09:41:49 +0100 Subject: [PATCH 13/14] chore: linter --- README.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 011f0902e..d8a481413 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ + +## Status + [![Build and deploy to GitHub Pages](https://github.com/alexandre-touret/alexandre-touret.github.io/actions/workflows/gh-pages.yml/badge.svg?branch=main)](https://github.com/alexandre-touret/alexandre-touret.github.io/actions/workflows/gh-pages.yml) ## Setup @@ -14,9 +17,20 @@ sudo apt install ./hugo_extended_0.110.0_linux-amd64.deb hugo serve -D -F ``` - ## Update the theme ```bash git submodule update --remote --merge -``` \ No newline at end of file +``` + +## Run Markdown Linter + +```bash +docker run -v $PWD:/workdir ghcr.io/igorshubovych/markdownlint-cli:latest "*.md" --disable MD041 +``` + +## Run Vale + +```bash +. ./run-vale.sh +``` From 5ceed1c06054586840751056a94f1b0f23d0cb01 Mon Sep 17 00:00:00 2001 From: Alexandre Touret Date: Wed, 1 Nov 2023 19:01:19 +0100 Subject: [PATCH 14/14] chore: Change release date --- ...ck-ship-java-deployment-distributed-tracing-elasticapm.en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/posts/pack-ship-java-deployment-distributed-tracing-elasticapm.en.md b/content/posts/pack-ship-java-deployment-distributed-tracing-elasticapm.en.md index e11d19b02..37ed7489e 100644 --- a/content/posts/pack-ship-java-deployment-distributed-tracing-elasticapm.en.md +++ b/content/posts/pack-ship-java-deployment-distributed-tracing-elasticapm.en.md @@ -1,6 +1,6 @@ --- title: "Streamline Java Application Deployment: Pack, Ship, and Unlock Distributed Tracing with Elastic APM on Kubernetes" -date: 2023-11-02T08:00:00+02:00 +date: 2023-11-01T08:00:00+02:00 draft: false images: ["/assets/images/2023/10/claudio-schwarz-q8kR_ie6WnI-unsplash.webp"]