From a0971e1ea5dd4963e51a5dd0c24d90c443c1dc84 Mon Sep 17 00:00:00 2001 From: Ralph Ronnquist Date: Wed, 5 Jan 2022 17:12:59 +1100 Subject: [PATCH] debugging galore --- Makefile | 10 +++++----- hourglass-operator.png | Bin 28935 -> 28839 bytes listener.lsp | 6 +++--- manager/Makefile | 3 +++ manager/basic_login.lsp | 17 ++++++++++------- manager/controls-update.lsp | 2 -- manager/controls.lsp | 31 ++++++++++++++++--------------- manager/index.lsp | 2 -- manager/tmpl/unauthorized.http | 2 ++ manager/www/hourglass.css | 4 ++-- setup.sh | 25 ++++++++++++++----------- siteconfig.lsp | 14 +++++++++----- 12 files changed, 64 insertions(+), 52 deletions(-) diff --git a/Makefile b/Makefile index 17745a1..7c058ba 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,7 @@ MAIN = command.lsp LSP = $(filter-out $(MAIN),$(wildcard *.lsp)) BIN = hourglass hourglass-web DOCS = hourglass-guide.html hourglass-guide.pdf +IMGS = $(wildcard *.png) OTHER = setup.sh hourglass.conf VERSION = 0.1 @@ -10,20 +11,19 @@ dist: hourglass-$(VERSION).tgz hourglass: $(MAIN) $(LSP) packnl -w $@ $^ -hourglass-web: +hourglass-web: manager siteconfig.lsp $(MAKE) -C manager mv manager/$@ $@ -hourglass-$(VERSION).tgz: $(BIN) $(OTHER) $(DOCS) +hourglass-$(VERSION).tgz: $(BIN) $(OTHER) $(DOCS) $(IMGS) tar czf $@ $^ %.html: %.adoc asciidoctor $< > $@ -hourglass-guide.pdf: $(wildcard *.png) - -%.pdf: %.adoc +%.pdf: %.adoc | $(IMGS) asciidoctor-pdf $< > $@ clean: + $(MAKE) -C manager clean rm -f $(BIN) hourglass-$(VERSION).tgz diff --git a/hourglass-operator.png b/hourglass-operator.png index 355bf5a2fbc59befdf305a1782a69816e39a3f1a..8d7580623a6a0eba1923f17f331225b089c9b7b2 100644 GIT binary patch literal 28839 zcmd3NQ*weH)Undf<_T4&cPorkL0 zr}hbxmlZ>R#eoF?00LnM*XY6O$1~F0D!s}xDP#ue>TuS zTu}x9a3=={^4005ln0sx$;005S4X1fCSzXni!DKTNdcSy`+&p!*w zQ9?!p>Ieh^5`uk%p;!a}u&I#{7WnPDewpRu`CDvd#K+|5%9`7cR2+44YpaWXQL0S7 zw8iGLtYbr|sJc-cf?D2mZeJz5Llbn+>F;#rbIcYgu3w>C1DX2O^S#;HW)|1;W?N5I z8kfTnJR>b_Ie}d}LM^l`t)4nKxRe?uNFQpl2!Cy$5eo8u14S-a^_m5O_{z3m2#lxE z(2`$UV%8N^0r;2Ps$&Jn!D9Vkq%}Z*>QRZi4Pz#Hr+hP}~hu_IV2V(B&R3uMjDpzn53Ct+v6{migpE(W!U|176~aHIU8LzvCrn zm*{vBe+?+BR0Tm4r}2TEZ0CRsf6V|K+iJ$`k;pPAE(m#i=$gGD0ihm0bWINyVgP^u zj}zukr;hd=pUAyh+`R1>=K*L&^Y?Du+U0Zw1*Iz)s3&jTZ!{K*<)ARNl$T`>jX4w@ z|M+7t{!+b$A8ZDS!2q>lImU}%6!Sn|S@-B?+r2t_)Fjr%)!um3=iak=wU5(rrST_6-hdz?RUg`#$}EC6`eoo`G+| zTBjfb)cVoloBf_h3C1C!T~5z+szX=P{cOpIX%jqi>a3?rZG5rF_wBCk30{4P_U+EA zi67CPW}NJ1uY5JN5RLiyL;nk_WAhPm8}m*${dd*1l8BtpM54MTVv(`OMH~X;AA%~F z$^Dl?WwE}sqww1CcB5@kFBv& zH$2ph5C6Tv!QVH6;lJq!#lLJ{!(vs~pXb2onkTp1SXkw_%-K2KKLoX^-drsNJg+s+ z`5eT{1517sLSV}6#2vxduzZvwlZlUAd#8+lnfAZ;5IlAAG-|-Y{fU|jAK^zPcl-VW zj*VTZMkCuZcGa+BXH&gQE(hWJyvp(l1$gn@>XZRsvr~ZcQ#_rFbPnx2w!8t_>&5I; zu}{(m=)YQ9e`(Me4uxZ}&~ncA84l%$V19aWcsSj+fGMq6 z-K~j~%%1$NLN8eXnKdypsM%6ds|%^2>wdTq`nQ6wnwDa7-VQKdaFxoJUXl5f(gReL z^&xh!-p&btE_Fu9J4ce3({(2p0P$+8-fH8>tD~!dp)$^8Nz6I`0DbCy067$iJfO$k z4+0#t{S_$>sE^)bSl-$NM@BrTI@ZMoENe}OhN5WRjX?0PTKW<>|7p!aFVgau1&ZSW zOqcZ!WH=yoUBBtAvU+#(a(7xrwHAU1xceVwl-I#^b>E!e`3G^G4@M#0L5M7?xtxT083sG0?n0YV-D5@=02c%adcPun@h^O#@KJ-+g6JQViU^|RN6HsW2kd|#H!plT zj+a2P1VxGwK7MBav%jZ|(-jO*pM5UT?>cy&Q)i2VTdHW^28+vFd1hIhUD%v?$aM2Z z)ZLFD`7Ig-AtptSS><3=#f(2eN#2{}q(}S*1cP?gM&cT5CO|2Ads5lt=Cv+GhO_CI zvyABA+nmzl?w2MAv9R4eqieEAleP}G2=qeDvKKsv*tACTZ=e@(LyiEc15$iG2} zZXi0`#PCApeTKs>glJwN#QhxZQkfz7q2X^WU@-{!&N_D8YLzxDm3l-V-`tV#wf5#b zaXD;Lp0Blh>gm_e*KexV@J#C)AZABB2@Q3rJDPZ7uVoT7;Mg{6wlddXNf}On_gp|f zMh!FG*vkoO6gHd+o{t~kc`i5(Un0nX%@;?nv7j>y%s&zQ20b`)u7g1OTf5eN;3Cym zw~~H)ne#_MoS;s{VBR+nEv5DmU}9yxqrKdu6K&g!H=YmP-7D}LqRv2BaHAawPacp+ zJ$8j1*tw2fHG;-i@k#T>ZKBpynjLt7;j$w(EY-|t4Au=l+wtJAI$}>n7}rGDjn&ER z??!bLwyU&zro~%_I#nPVbu>;P41>f2_}6bG!BP&+z7Nr&QN-B?lQE!}wAQcu_q~ey z9AE}xR-B0+PIH=ceO>9r<1UpFcEjvpd7jxodj*l+(fK1;H*b0tx){+?qv=2Z49!Bw zZ|19s1TP7?+ng_?Ml_QILKx7r&!FO#`InWNgGI@mW^_t~8JS8iPtP%E-6f4gsk zNjism8-h_6N=gD6A8lxNo$UUHab1!FiL%L!nkeQYq5GJDxVn8sL zOcl3daDcS?P(Q%{l~;d1?G)JpMZr<{83A^f7~ke=J2v>I0+MHeR(Kz74$MKo);u%^oZ5P+bkoMirx(oxt2n#0ayv);6pVy?-I|HB0d zGp`-4`O|DYX1m9urfw>j$65a^`KgA`Bu@zre=xO~{OuCNPok-)o(Ra@C$BYgh=>oF zDH*nALQ=?FBPHmmX9`S{y;~e@x?|{wt4l}R8@^O&AuIV8`<|^@t2dDJ{C8gqkY3Ar z+A zd;qVuY>sFI7lPTQDGknWt|vQMJ_3NSFd{+R_g98rttlXf@HSoM7!Wz~^h5LxZ2Qzm zCZM;!bH`=c4{8NtUB|0}W-%70g0wJQ=eB7|n&Z7Y@bl+!?A{N;<2tgTVz8bZcJuSX z&U!N0!2%uWWOMbHyeo*2@n5=R0tx4HAqFj96a(*$Lq`)KnOmgOd)htVx#GCr-q%ZD zILr0NQ#+u!1gA_fzwd&e(#~x4f*|nmvx*t6AMY0@N9>pgaf%1KBCBGwjWllvFS{BE z)|@MTYkDBDW8#COK`X|bHTDfFU9ywf4QF%knP|(OD0#IL4wi9j9pIM;(h$&C2ESy= z7$ePK^wS4ZTb&J5c`ek&qHZxanw3}Rk%0QH3$6~PTpVRNiG*U$SWiuo%lTg?8pAMj z9;opI3OUZ`X~V?_&XNLU#Zl^_AN676|LAiA$#@OFKz-?W%P@g{MeDS99CtT{L_&ib z+Yt;6W7jYPM8$OpgaI;u+goTPEH=jR#mqI))ggJ6aAr-|4(w3^Z$dVKQe`A2QS5vn zdJos;J!Y0NM$+|qCO0$mLh!Q{I1t~Wi^KOIA>pd3>;w+&au21{8lK{(Cq7;C%jGs; zUl{Wnjm?ZmS%Y_|p2YsCD1kBHxT~^BtOMl4@^W$8#SQZ<9jPD@l)=*e*Y0KfU(=Ln zBbBXelOf7qktWm2lE>8iRK7|vnSjJ}+X8=>UWa{K$lSq-&()gitGV$qE&e!{RH+R5 zOOVqJD0ddyec`GZk|wcZkX^jXWjD%?M7X?~uEl~MKd6Xu$jp_FnF={AB=L&?j_-K{ z(9Zm4-aU@;u;Q|IprN7qx%?fD&E?V{+4TQ*v09v=TMY#W)Yt+ln*an`ve^$RwAKhT z9nW#6*&B89GJbm6s~0P{Om5+}!<@JS1D~cE-85cBDRXVk-lxn>1{~;lys;zI04D_2 zsa0fg?uBa^?^}6M!#g+n>;v#&0GFIbTL+D7+^5uL_RNvUdvf}<u1U=-v}`)$(az?}?N6zX~y9@w4Ip zZ|UpHuR*BLoE#+Y=jGkh{AQp+%EXrLAPDVZFWExL)!5_cY-%$J6nmiXy>;*p%-0sF zd!0g2`eNOA&`}w?;AJElM}v9LA7Vo3p-NdG0M}1%kk2{wxssZZczLAmLI`mQ;IXS8 ziqf?smRC{PcEA2Syl>}3Pp3gn|H{N;G&B{oZ!d5PRhKT;%fxmM3Xsm$X>XO%&i@wk zokD|LUzbL%D6(dT>TBG0!IcjelHU31u(wm$wL()r^G!Si2}jKW9X@K(Y;&Q)H2R(J zpgoi#zVIdX^E3aZ>+y<)K9q#;)Av7(lv{q2h-`+B6OQinkFX{?Q>OSxsah$nBLTc+VsB@23_OT9{LiNuq4wDL;)%10;&^9i(_E z*Y=(B$ydsGj<$Ju?H9R5<)wn>08;1vid?z2X&{b^k(Z>oMN?an}X|h1qDmqc!l_86W*B z5@{1WW6afASz!_|f5j5cgRhs+Vy=z-DQPB0j%SVvj^2$a_iRsrfq@9~hgsRPCUsjGlrlDc9)$s zwE6qgyB>{XtQB)dG`ifO{qJDz1>ysh6&aI-%p67Hba+Bvbtxo_#UC6v8hD-_-=Tg# z54V|-U(B9v2Wj3ihSO7S{@~K(M!xohvk%W;H=Kpkxy2B0df;gb92-UN-RpFp^@{B$ zKRY9GeOzf$r$!J6Y@#zU(|m!Z4ty9<0vtCh61V`SDo{1|^tcy*?RkT_^`aI)!b|fl zxef%tRl6fq<_lh}Ps}%Et>asmeacA}&?;5tB?H0&$@{mn4&d98+5>jfFt%Pm7;sSg z?uynfYO*+_ww(~lrQQ=d+r{k1K|mm>HT56&v>=V?vNb_+yRURXe6GkvZ@&<}=_Xtb zIYmVWAm1K*@p#zuZoDFeTx7=N2v1DBZXx{*dmScqSueaI{lOoKVh|9@B6w5K$;;(( zOP9{K+IHQ0@UTsAd!{||USXb~r#oMm8dQyB`Mnk$`to9n3_PLKw`>lD=9SDBvGn3i z4pNI+rxcffGMB&~;!r0x)yV*WJ1B_*V}ZUyIJHa1M9Z8mdBWufY6k>E`?x5HZ_U^2X$@fjdZEo-ni z_HfzVqlqt3{l;JEkiP7*zB0pxyw`zo|5D7UX07PSuSj_EC>o@KqJioN7ck>Y* zc9VfG-a>N7>VguQBNnk=Zt?GKITw*cq-pzcU8J>^ z8fqY~%|Q3kN;~g327E24YI5BqjNpLIQi%3qL&g(o(l z?x3Y2j@!!}2YYrA#!b`8BcYAG!fnTze?hoT0Owp-aDkjiKZ@=exW4LS3rDkRL8}+w z=SSzld$q}{nS;UjF;dm?=oV!a2+hk&_O6F35#8~S6x2GZhXcrLX*xgE#Rdmekb2^7 zctHTenK6zGg#r@qzBMl!#7pBe>91W*Y3oz|;dDEnz&ef6k*?@CQl!0_5mwAu@_hbm zk(rL}ir;jxX}h-?d32fapuF?&auR<>>FGpi^Tf5@)7@deckJN-M`xD1LWym}AC#yTQsLbi9V)J#o7h|@qdhbMs-#mEpc{g>UtbN4JU6dN9W z=+#nR#{h0y3E}D5vDWiV^(pSN@w#RdKz4EzfA&y{wVi|Ees>n^xcpTpX|su&u23Wg z`Xbw}BEEA&HDYmRK0kzldheC9YQmPT)-u4F86Mt#iUWDR#VZym2J-$-9^ZBvhZdgT z;7<)?LJr&eg7romJE8DhphjP(vMG@t(yXg@o{*{rwic z*Rinf-@&_>mViiIS{nvL;LkL>`MY^m_Dw9US7Op}+^`^fs z`9S~WdI>1)-dArxWJO=9X?3uiX*}(y_o`9bQ&yqh`Ch1zxF?N;i6%{VxU-bhVg)7v z?v?SxXI~6ALCl{CLUN5+0`@t!g0#-LpNEq_hojFhK-yQy`5bjlLv zm3K-EZbq+>AN;C-3QTQnfCXzDMnrt$H$%G@K9 zN(-@2fNSl;dwo^*liS&`e+HrHhAt;@7ScXjZC6W7rxkwWrBTVk8t-z;2_s0>jZ8yI zdDj_+QU;Pnd=-u~w-H^k*4Z>cf-)IYUbl}Hf~FQo$BO%p$d19r=SG1Vud;@E%KENr z<}txx_bobuC)M&3M)ka8(syiJRMq%==NBB@dNjARC5kv5+&LE`&z{@4m= zc#6DqJ#e7=cDKA0Y&T?S*lgC_I-{6xuv0Byt$X%qemk0D@yUPphxx)SLq!QC!5h0;nl4vV+!4qgI|5oi4! zMzlPKnB}_FuJiP0a%8O@{>2WU$Yw**sOr>}+(=D;Ga=cG)%Q3;izMWM$=CRNxz5dK~6t z)YMMPZjVrlxH-W_`Qabj;=)t$S?X|xr-hu>)3MxgxO`)gwQ6@bGAz4&f^mkHCSuKzi%SjQ^qb5`{kH*K{M;BzQW$WWSICUls1p~OhIXpnOR>^uwVzr z6He62C50(*{R(x)wwq=VB7t;uxbtD4MngLp$+xKm8E=+avM!K%HG8{&T~I1gDYj!9 zgRhaGzR^o1JuNj>z+&E8X6-rWNHschiPpfBdFJb{`s=On);9jSvrQU~K?LsVcR?p7 z=Qx3x)Eb+M-1H;ihkelwTq{GCzYW9w2rVAU(?aUi<4V)h0i`U^By`#yq%SfTvUn{3`PoM2UMd03;zly4yM5`JXMuH`xxxnY0tk?N_f0~dIe)P?lUwZXh^r&7+XA_(sxpe z@jA8Bl`@5L5oWvI^hj{$c@%i}$XY*S792<0U~bxy!6BZ%P8Y68r1f;|Sl{~*Ww$&% zYxu;?nSQ@RojY4k_{SGdU3AwdN4yT4T~J~Bk!iJy^?ZDeH%lOiIo?$->2qdptdemj z90mVb_FmRtbXAdMSDj$Jzt50!ldLvnClPp<&=Sbp8rhs>vEHb)`seb^;xMV7s~yA@ z$|W%&B62%xUJHeZ4eQj+*QS`|Elom4T3pLPY_1N@D-%F|l5-jfF%HI3!Ef*d0F~0- zIwUzIOmRP7sxFQ^s)i}CYbQzKRX+%1E5f%)IfV2#y??O`Re-}NG6xZx>mL*x`iy2f z?Z9{qclZ<*X|ZhRiGY5KMW?V4oP*qVXQvsa z0Es}lWd(Np#sf8JW!5!!_gPvDIOAAOj z@F)5ZwxC6CgL{o$`a)fdG7Q63P(d|QVd_44MJ_cd7w8T=_~6<2K3#DHjN(4X&ArOs zl-!`P&Qt4DAYh36fo>kesIkZpe*y*q6SHEdiD(6*a+GgAPek^z;wV2dVEIDxe;4)8 zQWwWVfuklcPf;_-;=x4(b-m9#G4bixhdiRNwvo{mWT46rC2V7PZjJgN8oYn`Q>O)5 z=k$^)O+4|5hlu8Vw1snHizjZvJiDXKfoWRgj^)PO7;`l(lsm)d0`D zd(>b0|GswvC0`5}>#Fk+1S%+17z)CdUFvPl_Hs;AoLn$TYh;s3>!3+1^iktLj6d%8 zj35KBmE+LduCH@6{%TQu#$4WRt0|)^u;!xn>l;o6Jw49{smOmtcTjNTC;1SeG$8wq z6s)nxAQ;!`tB_6W4_VsRB|tDs8~@c=2N#g6Wx}9|F=I;2a~xxVFQQ>Wkp_aMk$Nf> z8%5Dyi<=en4U&c?m94VK4E0eb3DZ*xr0_5f9R?E&MT|{OF~sSYayE?haOXW zQC|Oxr$?kN{!&xB@Nf=Io*@&fhwUGhN-CcGD}ppm;0w-B7da^urM%9hzo|idom3)2 z4>=SFAz4Ty-lup|CT)143S~3gXkonySu-N3UNFI>xNeF}QgThs1TPV+CoZpE5C()P zib-VBAo=XB%V}VN|HgfPC)1)U{jFpw3?`qRhY^r8M&nboMzi+7#}wkN)mN-vJFjb{ zf9%p|T)cx)MP*QoD@M@iG80De^}cDZNIu_POrq1D5}b#@t@D?YPv53GJTGZjtU9x1 zQywQMyFCjeRWV3gC=MU>a^l_Dvk)`l!nlPb3b>`9L`y}=&9*u!D`I|#}9rr(ZDCc7cLdrdjNP<4u4YrdnK&aAN!qUFm?vU&RkQs!_*{=9qt@oX`1Y+rx;N3 zKl`nWY^6Nh{h%rSDan;yN2Dp~cZu7Q$gsX^5D`5ELs4)NdMM;mI1_%$ydJH0cG_*H z(^UFAuvvur@qf7Se(XeSQbxj)>vpR@1^YADo`lxx*SC~OeZ>x?~A&2@Hp{$b&O znf)8H?YNfF#W?(AwH|42zz$ci{pXG&hzx!UPTBzh>+M3ToBn7qnaSLt-9((*1Q@yZ zj}~MTx^0%VK5b8HtuL_|@6;j}BwOMUAH`&V zJifF#esEYbX|=k!#mq(>koP|>PL15GwEjHl*Xlv4x1wfybF-9}xnEd+By8U~*{W+2 z+j;Wg7XDc7)?RO=fQ#zp>rvYG*VtO>YB4rAZN1)g^Ztlioz^Zu(j98O*5h?hVk+;8 zC;Z0GU^z!Zs-pVJ|4ShiU$7k z4ycQ{s|(Ph4@;zsH8%q9vSZ>)dZPy{vdHD)_x3gOuca}1<$lwK)f2oJ?S)$>mDe@$ zjJ4Ov|IFRG!$TJ7e2ztE{n*Dxp6J)xtB^aQN&zBW#;JT%s2a<>+Iq1NHFJu zw0ddd$ky`!9<%N~b#blzdVOru^O`h0etYBKb$lLA_UZKeb1gx$y>P12a>0dE?6#+^ zDfP%dvL35)vt1C>kQ5LCmJ4l4@M7RY&q++2+qM%aKuZExwFCtDl}RP^(e?wd;{ZV* zQ#$;Ir7t%39>Nq$)f?zUM6(i89_z~D&_K_$vQor6#%&T5z=d;ZD&pGQxHS~zX3AQD z%_R0p*UVrkIfMddaWe{njMsfe{S+h+-8VAusL#iVq#$rEK=KE|?RuS@X4R-q z*+urAA0JV}Q#FxYg-(;tcSWypjGXcLxvsm(+YFM4jytCT>VfYmjw{6houXJqK5rTQ ziq&Hux9SK^Wk+#lGnzIuds5Ov2CmyhP-HQQ(gQ<2jJ?GSzr&o)2Y+V{yO;-wNn&Y) zu?&&RyFn%~wErr}w@6}a&)lH2AeLUenJ7R0TEV^lamaj}{I2oBgZ$P(re#zxk`y#{ z8d)~V+U9xo2ksiK`kJrj#HfT@F#iM^+BYj{5din^`C$@F+?SirGFb?eA`mzwDFi`I zu!;0dO=W>gWKnPsA@|PHd@wXSRq`T)ME50IFN1H~9E3UHl6|CqPH^6^lU$C0W|JQ}$39>NEM%Ke#US6%w(i z4>{P6V_`Cu&BSP>7fe_7cmR$~0Bo%k}L{pyRm9wOOxTJsdlk%bD9y|Z5?RrlZ z?REhn1NHBA)-sk(f!Pg0_(LV*t~vP}?n zwt@`ruY<|GBMj|Ku-Qfm3MqR)dGlz41*cr;v1-iK5%uxN_{#bB@)(u4&mG6PbUAEP z@{SVOf2E z=W|seavDVY16iC(@8NJHmuJNW;^>nQ-C7gcQ)l@Ex3BeD?AGu2k}o;zm=`KqD+{Fa z7P0n`bIA1!7ieUOb2EL;TfpZ9B8h?91^M#v!_)+(0Bie*+5JAMxZhw0&@s~Pi^U7} z)rmr${Wfg!AQdF)^M<ZV#<;)Ty%rvs>NK&S3i z2~4Xr=?yo6XIhcyi8dSWS)#xh*&x}oRe)JFLbc(LzTJtNg41y!x8acSJ9yx3KH>yS zJt4a8XZZi?p)1-9iP0Dq{9_K%wgoQW#~SSK*>=py+Ggo#%(_`o4`P!xQD&D1oGK?M zT<%*L5Y=~vRs&5ywKEC>iADgd#&EwUhx>xR4SRxZb50U>yv&PNo5S(Hf5(*#SW;{n=L;9VO&woXIKt-Eg+*Ev64P`PGM#1jV}^M7 z#LiXC6i|F70usZwcT18^?=o5y`xRyI(~_%czX)h22xyx8eA$YcH3TDi zpc48@Hl;@T^UEo>M#|%*t2k@O@8q(*)+h*kaUvwBq%>IJ6%A|V_W%buCJH#kRuLC( zIy9&e<-S5ttY!1?U_jble7odFSosEBVP&ge5EM+j$FHFJ+EU3s)8$h?8T#kfak^{t zT+3hlAVk%W*VDJEB^Z>QM09z4{+}zsOQ|a9Uqnx3_v-exKHmzdQdhwv_iG}CKP5|^ zt@1B7WHwy#(M`-vm_vhx260dU(zkqkI-qNv-*5H5|0$FNvYDjl-S*SOZeSzAngUN1 zL__@&B6?e@-p0Ulhq_Bxv}+22*rnKZS;lNfnM~yMthbS*UtQd6bw-#U>Bvq04N9u| zQF|yZAf2I?!m`^xMgt0)K?eYrp~w~=5YlP_eyddfy1lLOr8s+G3VOLccT#7nmI$F~ zH&w`t^jlFmySI^#Kiv|+cE`o8mh+p#Z#&T#N}+d3%B@`XS5}jTf1Kr_2b_AC;JYfp zEQ9+JjlOfU0?7Lkd0638ogSBHCxrnP$N)_6)r)RO3?N;$4?IBD@_p$-e|?ne&j@KR z%eBkkPHtgxMDakY44QC$0!b%@`vOXU8X6}V9k~;1}0+!7cVd{N_u>!o;nNW zP$>j8s0tInKuJmsrDu3gaLa3^b<#Er@Cc{=LD$SHv}qp8<291Q<{O^QAp;r*igM^% z2<-GtL`_=(6mH~lQr}H6#VjnrZ5O&ReH|1)`U2)UL*qX6e4TA zQGN2mcA@yWhUP zv0w4cespxnGCe#kNtSQsT_`-Qe|-xJI~E!+kmXrzLwo(l8^P2K(Rb~m%|_JO(HKUr z?NN+>-gv544K4(^x9|^XB=PS4z~x zhVgS?*5FlER0cu#CR6mB-QnD|t9#b-=Y8Vh21Crl#X^(NzYuKYbtVm(O;~!P`@mGs zljqIx<%ylO^?|nBM=b#YGdQ5~O@aJF zXA6xhIS{e{*Ji1r$9++alMb&{v@I=d?a*ouRgQ_!n$!-L3o78O@~8_TEL%@j4jhw# zxd#C(1&=A_P#bBECFvC(cB=;sCi&_us8)45LG|D`KiMPo{EU)1|KIq3<; zke$Xsg8q`^#vPbCe3hL$!72w>+8N-+6s~X!CJJ^><)BD%nq5-s;~E!4Wq|10*tD5Z zLQyUK7$kzVXasjPMKU=!n&gl#!x?4Dq6ctZ1d);k*7$V;oB6f$R@TmUkLyPZ2{XC! zy1<#byBH$aU4gva))zwSvAB&R2%%W zUWs}K4}Yf_G|6UEC#svj>um1ifyK6_-bU?7KP_sTjz`ZL4LArXLRk@Dl#(dvNTU`U zdm1!18Z{IGIQvj#@`TR=+j%qH#Cej4(bzvv1lF?3=IH~GO8O^yUHVmB!q}9lG&v8j z3X3m-4G1)Y1=LD_{1Wsf5%qKY>nr)9%mjM@sjsh*owbW9){0rtibXaGk6<&5K2;aT<;=fBf$8;?5591iC%vJ^2$fQ_=jQ?mK8Q0=k*QvQX3xaOUg+E7<;tc8qSCdL^B+1ykx z8R;%?JdR)4uV2>D>BeOeX@hyr8PAD1HQYnLv!&=_2dh8ASQvOCDcKttL;Sj0v%gM6 zO9VjP;h?%c*##Lnl5%oD4Seu0VOFgSm4%(zAXe_$-h54$+e*<|U2eOa2{`90ptt1H zGWz%T$m&JCJ(-v)W}fUH@+T!_6QlxcrTrEe!OxwN*lw_I=1d+NyA8X1Ng1JlIvbH$pJX zOko)Xb~-FAAi{5zOFMKDE{&~*K=k}KM!_yO*oTc;=bRYEenq8_) z*t&cL&{&sSZh~5Qc{}Z2Q&vPu+2Q3^a4HorgQP40Aa}Cslnnf&scOuDx{B~b*xPw- zM2(Oz`udpZUdN1epro&x*r{CuO2UJ?{oDfJ|1`Dn@Ks%e=s=iofp`gv*x83M)vkoQ z71DvP#@~Wi#~6;RDmSndH*Q!8f4toA@u9nYV0%#dT{K{9z?eMC#*a>NOy*4dZ3_E5 z^!G#p0odp@$)L4O-bSG=cyy*P`g+Pj&@nOV*?VDTe53LuT{XyRw0fTr$jH2g&;b6i zg{>-BhUD5WnN&3kfM6)l6NT1~tkMVVF8V$P2HZ``#;*N;O5OQyvU$uu5)siXP({Au zcJyp4S#eygW^O6GUI{0#Cg0wt>vDniA2bHmVCG678* zYg!GDr;>BYQvqSsR)b#|ZY8gtYDzD6YD%XGM%En?Jez7}la$iyZ)o$5*T?ivLf4S! z1Bb-t7L~?Z`jdb>D`_sSNXrsAWlGa18U{#^re%JL;B?~15eky`MYe>k9fxE6&`53GYht?g3sWsIn96b1Sz0`6XJgzsvqd8X<5UdS%qw{I&t+ld zGuw<*g{OJhAxoQBLJdul-^*@ZN}Y)?H?X;Z0&-PvsYIx7DB3zXUVr{!e7sxcpVaSm zZq?zP+*qHc)r(!uB;`q0I-sZKP1Zig%U9G9L3{tfWZIUcu zDLe?KXLs4t?c?N7yimvB<;Kf?rD$(@6b=cSI)|d5DwE?PV2fKO>^Mn-d}*i(nD#j2-dal=9}Ml(vVSI*9-`BYWD%oGKliGxAo zK(1bC3tt9(HkFmAjg~z~-m)i^j8w68<%mNR;wHP>~D|7@9{9>;4#u z#Mz`v@sCU0UW73}Y7ycA1v90KP z%I{k@9jVM&7bzNuImCqiWk0AoeGwGNnn2RiG#fLWQU!%xT8Qd^+wW)<s+7Oak5)m*OpR88)L+kNJ?T}7OLvo5kNv1A7iwc{*v7(JT?=R`B8qmEh{o<+Ph?%X z^`j1=o{65WM`Uc+Y%*-qv|Zv$!BvJ4jWF1PRC=66fim@nw6Z#!X1|Y(<5^B>1-3j}wxNR5Z%RcQbT34EPo;n8YeLH=L zMzgq`5Wnzc56Gvge3iQRvD#3ez~#_QfbDnawAomcr&2iV9Id8{>uPAVfM}7>@wHUA z6}MF7zy$R#PbhZ(%gWZBMAvGCR$Wz23?GV~SIyw{9+pcc`PX7#DMeAXQbX|=;M*;VLO zu%qvBqZ4xWOsh^0ui=uI2HCFiT>2h@BPeyh{=Jkp*TWaB{3vx{(Oui=3OB^Xrj4CU zC{2c>*H5wH-ACrZx!omg|6X|L_)$9HU*U9g@@x*Xvv+r0{qpUtT3r~15ft@Hi=-gA zcAN?=c9~RN0M&C33mq6Jp=d#b4kx2%;m`JD(vmQA`z~QY)Man z6%Px>fvz)xbq7)j6c;cR2q#V0?_Wg>dP)TVF(lA}^CLy z-+Xoy&Ir--|6PCnHnQpC-@~d1jQ+M@@!_@kQy*xlED?9V2f(L*AjZMJz??7u)1-O| z5+mT>KRwU4#%xmXBYcEyVIsnklH;3D?+!7L2KZdx%TTtr1%pn*_;qcAcp}D))fOzK zcTq9@;C+cEo=d4EAD@YplsS2n>+35FgIU#81;}a1@4LE8V)`fBs;n`!cW4uO6%*ml zplK)BsBf1AjURMmD+&HN5>0G-#v60cr97BtU?~>6f>piRlDMKwUM%D`En+VKDjc zM0sY$(Y3;Syn*KIVZ};Ne;GC667?<@tu95TsPAnq%D?$*bUtrpo10n|LQ<3wK_OJk z#i%aPZ_6GZhvd1k+?)rCJvYEzF(kj>-wFsSJ z$=Yx*L)`QD6%K(|1!uIu7s+HPE`?0aE^y`;0gDb<2WG=4Cwk4f(lA0!cim}5pym8z zS*EQbI^sh_vv9TfDZ*(`SQxyOmxKDSb8S$1`*6R(h>mc|a%GFPN4Mj+Z}2k5#-n4R zL<&ZXmmE{a@~3QRPF!_L{69^qgZcQLRgL4Tt#$5usI^mIG-U6aqx0@4< z7jwnZ!ickxPg~(qL)lO973RXn70tju?{s;=*Lv8F{Y>?u8~vgt8%Z>v3eA5mC0GQE zL_x5{*s@bSF4mW9xa&{n4rVShJ1r*;G@He+thXn#V?qpn64W)noZb;0&_`;o`24<- zN|R#$RgK+pkRnhZI!R)<%_hL@JaD@oC>FitdCc~VD|Ei zulgfa@46>;pK}DHej)c1Hx#@MWkK5Nz-VQ$TsVv#?IU>0zBWBf1NHNNa$VFU%RG7 z3Y*qFk~4h};7AGTP4eaxM*OgeS$A71y1RO{IswG?o z-5f3K9<*+b*YDb^x8Mo0UM(S*F>uId&)qXl-h%~O&f49i=l)RIn{V^ma>vV;zj$^_(~azr}upvE8Tn>ttY)+)o_AIi_vSsN!dS2o55FpslYG;$D^e| z0Ewv^opGDG!b_anlv|Y@HE|AZ!t5i(m4WLbLLAZ>=79HS#1+u&98n=_j`f{A-gMm= z-bIz4(dU7QPFZN^AR5$pgZaTzKN{b6b?H*pJoZj>V6+fj(+PDps8BSc5o?+Kh!SU6 zK0&z}Q+HY=`pgHC7LB#W<=>mz?KGpG5dQvs`mgrB@+*$u?GgecXmAJ`+%>oi1Pd;~ z-5myZ4;tLvf(CbYcXxLfe30NWJHOri@}AxI>_4!drl(KU^mJGCed^w)>Xtq-89379 z`39xZvBDZ2A3)HHN^$@0CNtF@FQA%_9e_9hH;KWH^*tEA-@nrt$Kfd(LoFBJ|6nSCh&>dUm~3GYjN=4Uf1n}+RKcu0&7of9 zo*=pBUgp1Az-QKU%n~9)=--t@HFW*gjq;EN2FPg45iOHe=|AzelVWR%SEkI6RV$X^ z&0rXIGs9>eN>~TRjOb90zEHylrGcFBgEb+aVur|DsH{=&A(RqA3LpPnVQHles|qt;28 zN22EsbMaWt0N}XLAV*3!SKDecr~MXtR?jLmL{unokQqLUtX@~6(2LFq7QzmZU~-|} z){EO~C{AgKDU!lNu=&gy8koO@2o?e zGqC?xL4jeY7oJ9=SkRSd*tJKM0L~OxK2)Y)>A9X-lkT(H8~|^FbUeouUM%K+DuX7( zFv~2BebyMpa6=Y-ii_ZIKXx7=C`IH#%SNKF^9!~@fJ@*lXaW*oh@H}N7o^ec|FpWY z_MzQ+Ihi)WhKmmHY0}ttI%0bZ1}1EoXNF4GyQ+$AH}K#KTD+~U`p>@6Y?29Mv4=wB zxx-0o^#T%N>zmko!QY<@{7Ih;x?48G58M>zlD2%?I`xNaLP-?NpbK0M9laqI8FtO< zs&=W8o*TvLGPR{i%44{FFp2W%Z1sQYzSYUi11Z+gqEWxo50aYI>D2bZ5GmOm;0DC! z?Od~c>wy+Znp;yPy{8jcv4Ck%pGj9D#Wu&2JHY*OHKu(Smi0e7mrnGc!?+J`G8TNq z7)kEGeSh%RxgyneF{VPitEoQ@*X~$`;oV){y(Wx^YJnSWbNUd#sJA}5w*f?^Zv3tC z7b}GA()Mm4d_|H%WC|m8lDVk*_A|Z3`}h4e;cTqu+#e(U>_tl|^sMDMJXXr4X-$Dj zY#p6GqqkputJi-mJFRb;^j~VIrLOxw|I`)!E^YBU)Pc|XSPUBc-hJ0tJWth!{9f9Gcr4{;2zk-0-<@vWS`Gyza(ve+*h+R8P4pAn1*5&V z+*g5wiM+0BV`Ja1uFVqt9sSPJL>r1<44MD{KSsHck=N71zgx0)ubyvTQ(oUC*M{?i z{kZ-m@~y*na@6&t@sqXk4u6PG`-RT$-{rW;(=J4EKbld*q3?CmP3lqQr}A2n$=y)xJ855{I-*E1tiF7L9{KtUDjoFx3t9v-oKJT2Jw z{C8#}lVID98i{rwKn+A3 zwXdxIbaRXD>r-?nqK!s>bzrnYn{AyLcDBV{3)gC~K))Z*x3X1rIr24eDgxMidc43i zx@pZdxuqUwBdp45bgYW8iS4FxzIX4}EnvKhdDD(b!SLJ?h8UWXAtmw3dH-7PSBH-x z3&UO1IvKyH(W|N~8+i3)0H}f1_8bzH>@N!Z`?BSs5W;QLjKL6Pl*WB^7!zrESwjek zL>Dqba`AQiQsrVx(oqNK=CF1>4p2AC#mal?%aV{k{F-Vj2s!2|BLhU%7ib4ZuVQcr zIQ#K`KRvqQz5q1sVQWuDZ@l{-t)cLNG{boAr>nVk&QL(;Mss_S`pc_tSWEc+=90zo zK7MCo^}2wr7SpYe^&<&zM`n>sMyE%I!GZMgMwAN(x{jpTZF{lsdSirnx}%MI7_U0S zb9b7&|Mgo%-pJoFLD}Mig_ysENAB}=VoNU5@BMR(+gj)0u~wQ_@*^aS zD%_kMwNo1YuF)f4U%}I{r|z||-SV^)fM&vF)*ouKLLL)}#!eFV9D&>CDo@Fmu&)_h zRM!9y@FGzd%$XupbAC8ObuTgejSkRWT6sb%Kx$jJYw|E}BZQ=LFTGmuQ1Y~S<`a-VHy!!cE>WNh zl(~p=KMG2vH(({;qA*i2hSHJfi-or`6V<|8Y3^SiGN+isC{d-|UtD{|>5qNbLijD$ zMHX-%J0g>ifI{Q}kP2hy-%jcq(ShFXNIwI0=g2&d(K3lv$+Xg^2x&UIpG7~$)r62Qn;haPdM4f z>(8Tb#&MtEYqnG0TM1!AJQUnT-us6!pc>^MTOA%hHB`O_(W_(_1r@*!#RxN|l{#{t zpODqq-1WvGANjR4eT3DDyit5hTynbVZq-P{WvG)eG?qZkGOd-s97yO$oH;5T4`1oo zmObX!IXD^U)(%it(ZpqASG(^@Py5ZtLbDy`DQgwN3fd#Q7DlrQ?--^CmEZGN_;C({-~KpQH}`@x6=pl zfwdt&FS_TVuKE|*(M(?$G4D;A$2iM=<5pXt6wigUbd!03F78(g+DfBuzeIY7!x$i4 zyS<~lYz*p^7yb4uCAbQ}v3+0+iqVk*(1Gyx=$6xqP%}~JUR@Wj zSc0DYhO3d^ZZ{7YtB1ouxBROze3L)*>jz|xS_TEaua)EnzibSUDQfOVU{x6#E9n=6 z;uemtdbY{bS|c(T{b~ua$d*O~r1=FPz zAE!yQT;ft96>AzG%@&#dBDtKMWLM3jy)*FO%F4FHe6l%CG-#*F1POQ266-=BoF`{CKhy?0!wYG`YJegn) za=qJlPN1!K5AU#YP_De4Zt>wWwNy?deNMX<^59%fZ?Z_W5es#wUZXtRlFzMTLB>7F z@ev&4POr`*zz3wT+A8Ewe7u)|G1bFRz-{R>W5>CDrbsM`Cy+v;? z+IW?XM#m-4<-%+5-TCLsbJu+$u6oNkD|p{nqN_;B$@&uan}fn$~!}B&Oc4@bPr< zsuphQ83rxE@cVwJRh-GYq|pICVWelsH3QJI~14z!1UDy_9bK zITn)XX*sSbuNgB~c@(TKmPV%F4oc}2;fLa2 z(C3`_hj&PocU1U7jo$2g9tC!r&^a-#({xWXhSvDPJ|cJQr-Yh0t{8w$Jsu|AH=-ayV7=f848#yoi9l6n0xll*>a z19#gX{HHCog=^(O3aun}RsnpgxvtjFzK}Z|o8KgoVX8?Er-PrDoZN;ZKF-~k8(4eB zsedh5smBgc33-Qj>^^1>OJn~=sGosH6G2urPo$apZ4n?b;3a|_xYGWDWP>=TE2uQh zz?y|bob!+x{2(iZmX{8nWFRoXFUr>A*sd%MM}-4#bz@%jhJCbHy1H3GhOJ%{w{cs| zq!nJ4p(UMZWv;UyARMf4kon z$^=zS&Av4}Yc7Uiy?4-V+HN4@5_km4Y09m^At3deeIYXj>r+yH#jG81)?iUB1Z=Di zj+Kz{NfOE#esgA!(HtjYs1t<~Pf{~cqfEMfS^d4>dA+Ucx_NfREw9>kX-uqVrfyg7 zSl|x$c-DQddLW|R?hfC>S3U>jP{5@S7^>=u9+)H2=(1ZBr4ab^8hGt)BOzT-`bZ0B zdg>a+319e)p}6j7liawlxBA>HcqSJ_Pp&HfjdOeuDIzpSRaM>u{??$NM&0F35rh*b zf1v9BCQcjcRzA~kc}NcmB|wAO&g+7I9*O;}@|Tk7O7V6@hInaE(zJh17du{=w2oFn z;gd(P2?e>`V5cL2ybWZQ&>yfq@g(vW>U5uRtr*ylVdnekVBi$&OQeb>poqz0_MrlX zwqZDvPY_uKKQw}=MpQzbHjT4glb){iuwTQ#O9%)4r@49Xm$^oto}^oAPsIcnvTO78 z_^zd}QO+bX>PRsOQlD1CD>X&hOs~3uhHYZV^6P3)I0OlfzMr!pIzmihDx1RY^xxil zNf_3S576LkSfS&9*dv<;L$1H!DI`MoW<@7Ewku`pjhpCmhxUxcYnJ_Bu)a)2C`Dc& zba10BLPictZrWRvdS{l{liz_SVRAPaX?8D}3lN4Bfh|{qs@oSCA$ofZuPOD@?{agR z5T$tVzcjqW9@>~BR}Jouq?cbCjw;v1w%^Slxas+Hku|+M ze$Ka1n1iEFmhRS_5?^%%mu7)Fw=-^2jhn8qz7?60=vurRtEDaI?i)D^Ut%CHE-#+Z z8TKay-nM|PXlpNWhWDT)2_*P_R9~H| zG7m@$s-%a9nG%FeGY_4(IY9TT)c|tT+Y$y+vM?Y6*X*LC%i8aHG{O?x{wW^sGCivc z5_-umeBFE%lL*8aXdwULGAxXPn1Fy?dd#PRO2Wz5G4O*i;a5xWWWjEzp$HkZl&e0# zW2j)-s#_`kJl+LtGtEcB+!!f^61srplfBO{A=o?w*$YzA98#(Mej(|#p8(J2beiFu z(!^*lF7-FV)4XYFa=*eWnwBbTa{F9=ab81_O=Od3t1A-<)#j0VO`BCqf`gt`7u!-# zlw}b2RMzwH!st=^4dTnx8qy}yu&l>}@B)+{E$s@e*1IJa{tKIqpJeM-t5M#ky9wv` zS-0i*+EHlqHd}a7{94x_>1CMbl=&6)@r=}~R7E+j94&E%N9^SjsQoPY6D{YM)mOz);ca(N0s8|L zu(h(k2xA~7?5E(4`0vN==0PzuN8mq>@p_hZKb!UXmyXw+;2#;Nn|VRG1|>h17>B!@ z?%#Sm)e@V30InwBQk!$Hny#tX2~LqqG9a3PQ|-UP67b3YG+K7h=-Mp?IM3{ zX#tpb>`Nh;X*{Zh_Vw4YntenHvM6*&1}jqbrjjDsOgAAB#QC=GO*o+u@GwhQa`V&8 zVv$es88}>SGT&gkbUW1%$u^O3wK~b-&|p?!>0u29MwG2K>Uf0;Agq5TEKcsLg7GB6 zg6$<8e)Z8?z#>{openbCcQhpAQFMY@J2Rv4tJ}h+?c3-yzz|fM`fI|l9ihlnjWTXF zv5$2DO|Fl{`AYFfXj~#Za_?=>LlR&H{DXE!exOpk@%PEg?oWCungnTrWlo7Rq3(7B zQxQigVpk7X8Aqkqbv2N7YGbYt2r*5Q+I{6XK11E!6K?LhTnLhH9z`@ViayFXus9TR zL@7RbbQXFO97f870XV3}iBWaJuiZop31#0@3wd_rsG%S>w%E0X72HQ5b@I|<%4mU6 zZXO&_5w&j3MS~bpG&m+KSW#_RMO6-J)6=C%6JTeqRxOeGR`A01i{3^{BF2wd#}by= zP2&qgodG8{d*#S~c!zEEN!^D-5`?M^+g%0fsSQ#?M5(!hMa1BiN~wruo9tPgR<{JVeDB}jGLmiqX6{u7=KJKCh-7ZfC3L%(`0OJDOLh6d zXK7!OHmgL@=Ky~T4$5Nw;G~?S*OBr-_?yiVC+s(xQ|3K+bhU}Pv~VOs5;>V*p~g#p zP*4JwJ~oVBg+?r3+&<)febFnf+*%Ff@Q)FewbfdxuMZ8NNSWDEiWjwUd$ZNGTyHH| zB!gMUe>e{G{4`x&Ak~8-KG8?SFjtvpaaT>90tA%91|YmlDU4)W=~5w!NmyH;`F~sV zB);_zy&fO8FB%Aw%bXV#PrU`OBlR~v1y4+^WK$0|`OalG3Turdp^=_!+zhviW(u1l z?@u3Y@o;=VVZRXY;^kp7p2okVeD3Y=+&=ead5snhS9qms%xW}%X7EL4>R+1Q9v%}h z4PLX-n?T`L%gt|(B&1`w4SuB}mnSSgzc475OoO-R{9dz26@;~~E;z5n?;~HDyO}tr zh3F2eTJwtqOc$@VC7z_@1itcOE{aI&y?X;FFIKf*NcFGI_-t|^^;cKe9523$VZW+%H$}M%jv+ufQB2hPbfo>( zt+xrw#KXvzRm;B{{EYK4eFKMz;V%yr1w5`gwQg*9knPtzeEU-a!TtSKr}FS^)~`>? zbrV&xb{8G4KTdC3=mh3`+=nv)MS>*%gkl$Rr63`gQ$JD(`-C7okD?U+d8oYWem0Ye z)Bx0)cvn1eIz4V!ttw_;1V+3bYUYw_BqQPy9F_S`WF>ENzTacJZgTVg9M@VOH3ywk z=ic@FrHmM_?J3SOGLpB`2AE#0(z|9i)@|ffd0E+Rc|s82G~Tp_p%E~6UNxvIyBlC( ztJ1uw_G0;);rA$&iA=V>FTaoaJY&TUP6{V{5YUZ+|70PY<3l_tE>alw%Rscb9=4m} zWfi-06e3ZubqnXk`E;;B$;b@xa9-OG7*vPmnt1V~D-2yxm?fphY4S9@|GMWJmN}P` z+j>^OsE?4ZA{sLsdcgmAk-E2ftHIgq6Ev*js7dO(nE5ID1~a7YdlY;)8ToBS!X;2Q z8cWXg-V1M}Lg#qq8c$_e_6;L_kB*2ME1)OfDG@JvoxAh>*&-R|y2_=1>|t*Z(^IeO z%{H7Uj{mwE5n|-hc3fcAB;@&tXs;*V#>8Md?->O1ulDpsD#t@ zMzO~7Wx^ada3d~7FR|KgR#1HtuL{;dGh8V?=j{!9@7ZArXoSG7XFQon;eE*6u8u7x zfGS}d62a7e;+AP-zXLGtc_>x=0Ob``nX`Khmc#-;*j5b40cL@YFuy%(Bw?ZmAq0=kN8ZHfb>A0mHKI3?d0x-@u7Od zBhADz&XGnE+kY_eu+%U)2DQ<;!Ww}R@)WBpuP+pdU`V*0+uiDKg|9qxU6eEC8MpQ_ z$dSflSH5F5t<~)QrN@&oR;{6`1}F)`+cly0>l6Jml@^z}t0;kreoO6o)SCl-i)g`} zfk876n^gG*)2g-1LSjEr=yMgH2GZ`Dwo%E5XBd>|^?y-;re1)=6^9vBxEJ5D0iYYg z3lZ&TNrZQvFE8u|N89$hf3Y(gpXv6kuch{?=4^~tc4v``OE*ZHPwp+}57pN$KDv<0 zWNOnF0oq_~`XF1bidq99TEmp zCG^cGulSJuLN$6Zd6hq##J6vOv>18llR%hUBQ`^x`ldzd+Oi6*NESar>~HE_*v154PVsnp<#!F|^$I zo84zgC+ZtKKeIL*#k=ElzfJY^ReEz-{b5C#F?_3w>e*{ic?*S*zm7zlwMw-z=7x7wA*x5K{P zqTqUpk`8+#fmt^m`@3TK(;>~nM>BYBzs zBI=7KgjX4qz0bHg>bAgfZ=(__%Wv+)ojf+To~0oQ%)vDZ8gCxcAm50@+q^FFN^a+y zgzLJ+6mxdH8;v`0u-;5GAV?#cf1~&j?J})W%jV*7Itfs4N)0@n?&P6<_-xgP&^BCQ z1B$lB+Q(n`a z(5&ZXAC4-Zwt^qf^T$z%Fhx(7W5hG31dKBm*Be0VZ?0KE8UOx4AE3|ipb^S*^7E!u z27ixw`7p)DCz@91Bmn$}%T~If>BR*Bit)z#Y!nMl+@WuC01dRKqf5whScED|uY32i zZcJyV8*Yy5jt&XW-uk%pE343Pu-OcWyaxWi_POgf?>l`1o$_5C=ltj!{dF~dP`P0C z{=qpvn!Oa#i!W{UnI18NvM}CKX)csy42@$qZxm_(rk+-T+asC;TMrb(IIuwr z;}ENnUZ=pio6lU3Cr6kEzkIjd=pPbBLc4Z^Ia`6VX34j5a_)_YIu>9a+GHg*KJrw<>==RHB z7MV+opK+0V?Ms#7S(!=KIoq{}NuI8IGr`dve`iClnORLl_+Ou(3K*rme>kb_H=ym~ zd}KY#rjtp%^Gip=zcm^tyXf?WLVbGm`3qb5a^{i5%aa>vragqaL%phLzTjf2{X(3K*j$-zN?1v!Bp*!sUXI~edp zkt!Wtmq($;Z7?9Y8%?{9hN1<9S{>7q&J2~SiYIYB--okh@O-(8cS##2J@Yybp znaIU18$eqq)zECJ%csxo;%bMGy2u-u89HSo%UT6{Kob%xp>ZxP_E`LiS#96>=FUzu z@?a^>x0x}^>0d!?Co=Yxht8Sd72?IH#y^cj?Mp^vz8Ho?R5)UY7oAzzi+7I&NBnEc zP~SV1Oa9gaZPrRd<4Td6Bz-5{C%}3~?;9f~!<=_3v{XeQY>JIjW8jWAyFgKu^^cMf zLirk`Na@$sIm_AUOUzJZZV#$@rutRh%Bj+%2IN%#!>STGRnys0WYQ~^}G&%2Xk>|RE$NbF-DZdeURU%KsF zRC_qRrxforgl~loYS;7cDo~j5|2&!Ib}S8wBnqDc$pD!Ib<;3JyITAP1xnHRXs4z| z*C4-dL-gu}6un!%&nz{5{70!19gKU9H?nBZ|Ak!z*!pGz`rKItZQ#A*Eg?o z1L1B!+2f}SdzGBuHA6fk?+q-SSvygiU}Sgd97EUTD(7b=J*EE$bZNs2ofhKf$KJkO z0t>kAbgHc;-zcK1CI2~dKeiOda>MII4=$XCVa7(aW#??Vi@<+@$=e7(X2JeUQmtmf z(b4nDVe4YeWQ||tVViz>HP5|=~+E4Js0&(0YE|1y>$V-jHPfxA7JAD5_ z`3aj!=z$r@<8d7iyhIM7bfhB=Z_E&Oc(_KD=2kzeDiwKtOv_&2!9W`#2Oy?F{4eTg z#U#I7m4KJIYP3IFueu46pqD$#GG+_V#d4*#jTa|cG5hc?$j1Jqz9;dcMRELGn*~5e zv^(7O{fqYFiqtd*ZmZeR-gLtDw-q^N$4UOMb z3xBE7RqisGr0;inI&5eRTLZMB9e#$dMZ;=c=`M>UzoFuCWd8bjYZ*4S)Nm3qZhC@; zukP6^GoJU>*dQ-=ku831#N(6y?y24t>&BuP3Y%F z#=Sr>^^y_gEcIpra4~b&wDoVN zA6pj#Fp?y0@gIVfn52=Encx{8sVBmJMAQ6dLKxM9L05T#bI6-!;Ds3DmU>k!-c0m{ z0AmItv9Sfz2y^f<;s`lx`TX6xhASkw7mEE;gB8VBxnfZ=VG%gVXt>f_B%X`}40Tu^ zHQzP4(EGMe@vs?oV-ICDOI4FO|InP3nK$p_E#m*jJ#jb678&l7M&C)N`KQWCrj(j8 zj4IW%i|$)xZD+oM;K7|6{*`lK-syp|S1uvB3RD=>IloaOPYIF#j3v8p6LkJxC-WIP8wY{SiXu5ybrXxeo?WP8o%{>0Fk9x5yUJA2pH} zJIR#>DKcpTWLps46Co{Hi(!f-RwmCZDjgI&N41y~?<>C$is$-fz{EU`>mq~qZmn3T9S!>X0DMEXAT8T(CnF{Ehm8f>q=v%J`3 zdToa`Q*d*)*!Sl0pdAZuOQ8GLbiBRgH|ceEwQj*VlCEb(mCp(L96vDUbfR;Dnz>yo zV)yNf8#*m+`wB=5_+GtE)9SBYQhklj4YeS*jSoBv3BTd#7&Q2G^AhS!D{kLz30L@* zU29qi^6C-gC@|(N7h^fBh$C-RP8;|V5SE&OoyDX%Iv$J7)%%@h%}h^il6zdK7yfOl zjbOP}v^YT5?uv%n zMJHHy+CGm=A>20Axeug~XP#Lqt1yxAP5!|Db&}#?OGAjme5>nWhH)OXx_p_SH(k{P z=@h3R18Jl`6Yob4m%s6PoCVm1KW}pNZ1{(3>3Dy2k9};EwUbS;o5A?z2x$)7Oq>=V?9s4pkN8&HC_b?u|$rA-UG~CVkBO8M)QlG z#0Buf4p9zk^Q`FEPh$ckTsEWJgXVNQBi#EN@v|OgVC+m`L*Qv()+nE2kbk*-e%FUc znkuha36Al`)t@Mxp-1n>J}kTV{5CpUIloBsY+ee_vy`6Lc(}4TN}#SNB$$=yE)Is1l?2NMvSszt13eGrA8j9z!UN9%EMmI zPB9Adh_kLsRQA-~uu=lXk%B~Y!h!;mQbVqevS9AW7qR)M>F{%c5qEZ9 zOQ$d%vXL7L_G^_kt>mA_#siVAdQRbxnw9VVl7J{!<^GECGn^YP5c?gw2$#iuGW)sk zOuIM;X?PEz-S%7gA5s_^A?+~W^iAibCXFlSFSG+QnzoA(h7wtX^jRZ0$%6i*U7~B% zn^Zis4GbSaCb#z}kX|isjAg&CAUV&#!YiQ>qZPrcA3B*jo@ipALm@x?_^n2BI!c6V#UBqhZ{LIZn|0)7fAv0jJ|B$*QK zx}KS3mJCOb$Zs~f&`r>+QGTCuH0KPn_*2s%pWj@EXNVEhA*-Y1;7G#qy=x}6IS{2^ z)@xZ6n|&lT>;V$ueKkQYvo1Y|1|#Jjl8eN_Z;@Z4WXw=w$&Nne z6_DWmVHPx@FleD1uIPsyrkBdd&hgYm|i944V=6zrg;{t*@Uu6e@&!?Q^Gn=x%=0E)tq9rbaGi{3cFj z&<~hzY~Q{yv#~R?ajCL#^Rs>9=j3E$W8-II(=lG=`Y#oL_NG?mp8tIX24VYfXayK) M2?g;gQNzIh0jO*dSO5S3 literal 28935 zcmV)uK$gFWP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 zVoOIv0RM-N%)bBt00(qQO+^Rh0Rs&s4^xPWL;wJA4@pEpRCwC$U3Yj?#n*n%+%4&i z&_nONcMuCr#e(f;FIYZ%?_KN-D>jM>ih@c}P-)V842;2AmBv&|WXmKzqGJ1MT$^ z4Yb!wG|*lzVL96ksBti{0gweuXS*r27qw&EZc+scF+c_bnmF^MF-Zlp736LZYubPE z%R{w;_L_tenGZ-u|5r|Tv@<|pV*D5RcB7Wiu0+O5#qfQlxgyYO`}~R@9H~xs)}h3q zjzW!CPk)zosV$r7$41E80Sr*d%gHv8ck?7E{)6;W?f7kH-oZT-|?U>0EEOruB3kVE9SYQP)Lm3KCh5|FgaOt`NL%DR91jEpE z9ZH&=EES|AL)Uc$z%U>Iuwf_$D_w!vQyfd3Q7)ml?0sj4#bU!Z&;U$_&0>K7$X$%| zv_sc*X33C}m>H}~23Q&Z0}S^iL)XoUAPojf2{40oT{lQdfY0h{wswqmfDLA8c7y=~ z3QR18g$bGxIQk3*o-3STIPz!tk^OAO%fO*<~veD~&;Ccf8jY z+5vzi41&co3Y3<)XlDi*_q)8g6ih!y`l?$Zq_%rOK=DOGm6#iA=ZA~G+Fkrn7s$EG z3R+GYyJ)wsV{&UxX_Wt0Y;vZ<7T)X9R*Jyl$bzUG71*-l;66|y^_R$O>EEK`fPob! z0YVtFMksvk)HIh_%&}DmQ?gz5rUNc*qy*!aeRg?A@YfrP+uS%<5wL&Lk<@(U-+J^I z3lo$m`EE@~oBs{}KHe_xX#@qaW9h*npN^LfQp}VwU32ujdd>W}0dM{7xkn9mb}fM9 zxL_bSo~2TJ4y^cwb;+~C%@&5vU}^B>(6FAJ{5kA+iw!;(@cFefG_2vA@gM-tT>~rr zVm@LajAosedVazJzh!CgPXPb`LKg?~$}kWBLX!ekW+Qa|5LQfVfsiAd+6qCJz=D^! zgg=937Smz{8u;0bWQGDaU|DLHj82*6uopdpHN&b`sy&v%xv&f8(Z z6;mNFRQFVSHc+cZyJKcc7eOS00Z7a2TcAlRxwPCn^t)Y}1r}iipuy_2g5d)j-E$NS z#{J7IEN%Mh!4?5)x$Jyrk~n*PMt5Cg>sY3fs&;Igc} z`&W>fyv?el&Gl@6CfEYaarH`}LfWSs)20{ACD=%a%}ar^zkWK~Bi%dN%iehc-!LC* z2@MY)PI?j=nj|q#g1}aG@)xkszXzqviX{Ajo1osB^E{6WAkGhxR|?BHcnQw^o~ z8QAeQJNXJ|p!>H@4}rjMtn){|@(e7lJDxOJ%LbX!XRrBId)FYGJ?04U@D2Ou#Tth)8sC6q!^ z65yO<2qr-)*{}elI{Y6irn9^2TZ?E%z|4+{K%>_Q37`N#AOs=Qop7UUbSm_Ql>jFg zfe->=70bJGo={pdyDOC;fzZ!yKT3s#3EQThw;;sw#Z3oMTzq8bHv<<&RM-#{_}|-^ znhdy=ko8waBN^Gk?dsZL1ZOx{b)Pn`~9aE<&Dn|ez;<}H0iZAKm z9@v%z8*HvVUq<-tJ+J)a!~2f@vdG7A+w+!YQ(o63fFNi_4s@H50tVpcSHR7_V*(W0 z1AIUL>>&3l;_RU|(M}pH1P=#;ps@To8{>B{`U5`D)WKms1q-1n-8Xa|WBzS6v0-}! z+7IbA*M#vd+rA>904OxM`f3(i&vjxCgbKaCB7TnpL!edbbjl7IBsDPQkPQI9wZJ4?J2q#l!uZy@ zW!-)8haXv~xtfg!+5&j>mp`wJp^CH%Tpprp%PyYv`t>@M5lHX@V`Holc`pc1NV$<|cqw5}Sv+QhlX?dLO#hbZ+i*F=EXbelGcr^Slo1Hut z(4bkM0W;Xe+XXBHAl%}E_gUu&uvrhYWM%OCAPqoh2WVK!e8ks=3lwL!g$<#-?EwK+ z^ep0-AlTdX>8z2!H=NNF*4DkdTFHVBSXb@^+{f_8OYBmLmD2em_+tullpm~U)Nw+VLJc_(=#2K$F%W#IST+2#vH(y_-VdC+5B6 zgDY8`#kCtVGuM*Q&d?o7ISnuf#n7QcsO#o6myiZz<2ko0iyHVc3L^jL1;KS>Z=7U)>=xJpVI)Py=xp41 zKQzxfw-lxgM;a1<0|q3V-QO2FGNO7+GhA?jPy%T+!7wgmWhVU5<)%ZpWAKDR@l8>N{6Z$ad$c~ugJPvF>b})NvqDt&q;ZtaNN+1pGJi|A!B`P8U=|G|DrWX{%{-7Y=rE*!PQ&7ul0u@c1O{exLBK#D4_ ze3XbkdM<;-rw>?+{yWMpDA~O zt_y!xL<+)dmOsnZmon5AH;dza>A=v~AOf?{n28An5wpeyAT%a}O}95N;x8UCFxNzLOzDI^O>K{`MhF)I*(l@P?F%mkAt{}qsC(G^k- zO^F@1U(h$Cbp3jZOFRY^Oi-rTR|v0n=UE@^wPXQDAglWicn#}j2Z79GE}7j`W+N}l z27yf*0RY-t*D1lCvRGq4BX%cAFaR?5MTMCtZ}%pT>AX^kH3q?5Oj*62%cKEB(A@jN z0&7+QfZ_Yu1yV4;VocTWe-Zd*$7 zoa7T`JNs>^9<_H$cj{nL%EAE1ptIf6Oo}xoCYGetg59`k@L!-EOr}2~)q<%q6T7{A z&wg8~$A5zM2K-$#M6;-$XrR4bqJj2$i3Zy1B^qe2m#F2tbk&2)Tq-=S+d20Cw-=5rGKA3a0WHFmDDF2v7=8ikOH% zfTF000TC}c+{X03M)-98k|eDg?bGoSs=b@9Cq|TK5|R*rrl?-!3NI@c$9Ox^~m8jJBGKvU*%rhwo#YYor=Hj(eA^s?P56d zsWy$SKEV8p|95OCoj=7yj%3iZlmqe0$h!zg%<-M~ZX6AnZq1v}&83fTZj~M4~%7 z_{641p+CBd!^w4YUW7WlZuj>1SNz11MfRT)f5WpYKY?Zhd@$a(9ai80%*SH;B^cKW zMd)?e;xC{PV1X4Ni!~2z$G*MRujP!s{vELv3vkD(pELwUE^Bea)guls#vSjS4*@~} zd|}n#z~dhbKnZ+cvzF$&V1s7U3+gWIb@sR2?YBZm!yq(|ICLljebL>==^H;RyL~X6 zg%>sX^SAiR+DR}T+55~h)+b(P01N_@$eVQKf}e2y(lrxhSAk+2MSrwyeb{msxmP>F z!t-#>`G8u z99G-1?CTFrgJ#%oOMVGAfQ5y7N9Jzyotk7uo;ixY96rkaWA2f$e{Eha-#YL(G_=7^ z#2>cl?a?HTQ~&%Q*1Qo31x7zaBH>W;&RG2JA@s!_L_51T?uRYd$(8)w2SeK9C06I)7v2|+;bEA=@!=TN z7_-@^vs1ddP5ZcJtC-hb(z4InMa-Xc9XMmi@N9mq{eU@r1{5$~jeA*VW$-V<+P1i4 z3rkj#zw9<>-k{#a2QTT|Z1A^Scwfs2U$(#2;3b3me$~zv!`ZL&Xx8`HEPg(8E*pv^ zC*9tr&!;ZtTUxAR-Z`n|@L$;A-B-69_QToNG@Ul;{^l&3yJ^b3F84$YWzsSEyN$y= zOKVe|fJ!k%-6^Jmo&7?-y|wpFixL&L^v$g}MdZ~$m~smyW~#fpbai%02f!U4Rzk26 z#7Zy=07@_m!@BHJzG^rNFi3$Qp)mj`0t*l;B4z<;a)?`#d>oCYS`;LKmFC`@B_^eW zVqtpg2??QCfXsjEEbDdM6vN&JD7UR{ZqA9gdF?L?a1VX=qXLyeM0uZ{wr?wmIIo!! zT=seSSfUlGI%!PQT8}zwia7=RP1PA!BXj#NqK?1hs|S;kq@5z`Oso`0i2v*msEq&c zXm3EZsLO`e2An<`Xs?%OpuJwAf%bZd|LRQs#3<)>dpb9h>7rE;b!yM9F44}!40k*l zcRZ5vU0rdV&Yrk6RdGT8WUqz5#8j~WCay!I*D2afe^muy^Ix#0%J0XxBa(2LDIQcc zzYIDOub*Z!$kwwdjKoUivex!&_s`!!9ip9>#i7Dpg2CcQZf~NzxGo_Kumov_AgMWp z1qwo$frxZzFHP%U5EGOpSVDM1R*@0YPxHQ~E4(o(R9R-YDZ3zw_BF*W*pw7PvO6XX zYegkJ>(F?wL$tHfe*HSIQSRrVil7m*MX{i_uIaAK2Vz#*>evU4 z{q(dDZr@l7xa=ogS3wTJk_0Q#G+nS_jR9D7C7?){4%M)c6A((1!eX!zBuNm0T|m}Y zdj*o2jz#vYLmOXph<0fB{LQ}SUDqkS*;kK`8lV0{hc};|@q`lkSJC4y`}F*7AC6yi z;CBB#g%?Nd?|QueeqE=XAAz}!=xg$p-rhI!%VXCK^M(*7C82BqRAjds`N!Iqia@Q% z?y?z2+WNT2ZWJpm01Rzk(Fm6)^(hT-9%*Bw18v&B)1k0?`zy!2y>fa`w*S|z z$%fX;dFz3nZ=BtK;%$$d^U~ty243^@N3Fc(bb_)U`pbG%kHUg*{~003c=Yi0iWi}3B+2x$j(bz5E%<(mK?w27Zj z0GeKNe(y^r*$+qMZcIN|?#CMJyCkV&!n6TjCJzYqTePd`Ywh1((YvjE%CP za>9G>iNnZd1%to1$+{+Io3$iThVKRpmvjQm&eA60tCS|u#-Pleamgaj9c)sGol6!U z`t^;t^IvOQ)+PsQBv3x>4hCZMM-V_n3!^s!tCwj&^FUxX=!HaZOts2@1BR9P3!p z*iq^-0)z8XTNJl&IQ@zOiY+Yt9Tp=kJUA^ti*Fkgz*TR;p3fla-#$A=bGg}*RAF(Vs5bNTm0)*elj z+Y$t^8024zw`(drQ$^a9h}vVV7heP6N_CwkN$e9rY&rgBB~PQUe;sbWQTxd73ba>P zw==SWhLzOjU#OY_ll`=ZrgBwfc&TihsU;|t1b}V+6+f;(JAuN&Rehkno`A`zz#uXz zU8uZEr%>g{m~$tW3M-RD=fn7r;dD%`9qPTKNa4PVLDz;BSMqjJ3sj zdsn588)*Np!_h-ySp%c}?4N7YfKvv^R)SG^u%8a?r%yVQq|=j`F-R)yH18!CuqY`` zN21Cg<5V?O$JNUcr+IJ9L6xEk%gbrdUalLMSZPv}3;KG3B$!wbOK6HA1QWA3!MzIQ zt`ZKxf3F4R31H;DN=oy*vpmVN!{Ev%0b-4mA|V0I)X`U)nMo1KoHhxt zFwA>N5R(+;u2#xiDOqFC5(_kDYv)QI|J`Xj10T4|_>Bw(lW>c_Po88bS{6ydLYl=Q z7)-=k#mpKpz-CgI_qyv+*!p2A2@RTN5eyatQ9d(qwMho%FGSLZf0FmA`PgMi&1{7? z2~U#2^izh=1S}Sf7%XsH=CULR5L|YznmbntO~9fFnD5@tyP{~%>lSS|(bN0~IqOxS}ZrWDhNfL{^*LUOlpVa1`7o`%@v3<0q zv@CO0ByBAwnDIeDN26(*lVH}xBISo(AL&2-!s{0;OedxzakNdAWloBrtwvcgC7QPC z-XvfwKz^@fYe*4@DIo!y0ryp=1L^u!VsA3`sNCYcN{aSP$w-{L$ym7LcS%h9vPyT7 zJBTTm_8)WZC`)2bUhZB`k|cgURx~ep?k3kyOP5Ik?JiB<@2Lo&J;lfNdFuu3Da_sr zPqOB={D`QE(oTbR4bY1f9HrnAmwkTj_mCxwQU_Ft)V|N1XVXgSFc4O_=ohL?5+|+Y&{E<}7A-jXi?!GZRqTRMVqjczqvr(y z{wQ(5C`R_eL%*Zg0afgRUW~-0yVs%E300&+FGk9ey{o;+B2gN1gXO!NJ@dBw@mCBA z5ck)X%_wq07U?jGaA?K$4JdZNC^n!MVfWUJyHMzYQEb3fiXNGV27Xnrd(oP8OA?Te z4ZBvyp~!$yEa57`=I!gEQKZ8tmT(qf`<4y+P^3dIQgD>;ziT2p4ceKp?#*0${{{4S z7imMj=oG&29UWhMhuk+;1$X;mfNjZ}PE4PTg146k^!lQ&?;o$1VAj`2e>o<4LBiIw zw4&tpJ%@_?H`X26PYF}A<>aV)->g`#(t;qVJly?nkOgW1zj^8QjJzqq$+;Oq9eFOHtas0hJZtyS3e`mvGOD=)++^N{)CcImBi9CZ0W6CYRezn9N?LFDUmdF(BU4jzB!$lz9%xgo(k>HyyT-`o>0vY9Np1gF6oNvF3KhK*lwC) zK?;JE0OdQI?BJGmr$$XAiPE^<CQwqJ-Y=P+Ec&iG-+;p*s+v8L);+ zK?SK@nLU{W6{d76pDar1?)j6I;LW-1f}r(Ds zP+H^9Y~x#G3l0dBB#xGLEW1h~t*DbHsaQ}7w<@39T8nrRiiDHm1pIzSCkEuTjn#d66NfZo>={-lJv$Gt0-}+ zP*(NH%Fj?aYo&@RBo&kRp`Z7d-U?TbPgZOrNQv)FI2 zb2EwZNmZ64KvRGO5yNzRs`M4BoGfQHVp2*#n&*2HgIJZRnao8$s!1}jVgcpZIx)X~ zUWaQYg|hW>XZLAPGh@9m3slXk1xk5 zB|#AI#P0{;Z`@1fLmH@Zv#1t6#lMVyGQX~!y;a>y-rPU0oozk?U}7cI zY1)nI0IC`73`Og|q?+3ru45oTWAUG0ovQkosfu>fGT?gi+gkdDIs;&+C1P_t)qTf8 zsq4CN+@4=mFL?q%Vfx4vm#vDU&ddY!$g3pydr9w~RVGg{^FM3CsZ;`~9h#B&fEmHK z=IcC_7S#+m%ug_mJGiXs(eBLTgq)iSY{$`51PyaCLf3%s}=*-w^Y&#S=P*}&6BkoYw4 z=O@7DOMzz(BIQYiRUZP=7Xi=5ApHp)KhFT(+yedSG$cF&Ecya?X9MIj$w+#Nv2+?R zbv1IHC_&^D;Ky%(DZ7#XL?NPI27aCayuJ-ZPvjx)1z^TP;Q44|JfUO#yTCW|ftMnY z{kQ|0-vYj$3%s%m$xkW#@d@z3D&V;Uq&=Zy#RtI0tMJ9tjP1_Homl-I@WvJtKaq?0 z7l2s?weJF7{06)ng}ld$vFS}<#sXl<9vpdAVcAEhDQOi^)jJ2}ju4T&c0Eha zNi1n^^YOTK?N13Aw*%2ib?bo>=hWY3b=GYw8_q(|8fVWh~e#u$!%t=Sh7VS4UJB~Ry znK>rcEcFoc!DGzPMO?aH^09-=hcX?9I4fQ5lbjjvF4f6}2bj|mnB%h8h;ndow0Up5 z*`l1XQeFFX&W&Y0n&@p&UJP?WI`e@-cJ4PgGoJZy8gonmyY}mx9cQ*TCXb7w6=xi( znFA#i7v<&W=jY|;mQ*OPO2aD?1FT5Yo3Q#-42C*=7EIYw6q`b9Wv^(8scK3`AR@Ae zs%&u#Rt#3|vycCF5@wRC%Y33@*mLhcYeLn@N-YAjV8-!v@;_-2pD~H>80B2GIw$4Nzr==(yZEnliCKSo7KFP|4i4! zWr;`c{Af1@%?|1WR)M=Rlm73c{dp4=YsY41-Mk<%`JRuWT;0DCL*22&gXZjEA)zIG zlXCa0M84&5#RYB>q@bbI?ptvmkj)!^=g}6<%6C0>OV^UyPLCBZNxFQ-u?CUeWrvo zJ^o8aAVDCHHO-xL+mS@YWK~yDUFM2O^G~ZRY@8+BR==p8`;pT$Co4oEw(DUebvg(= zu)sngSZ4(XUuP3z1 zz=2*-$ZDQ00POFOYMR`tY<`swcH*o5DEaRW_i8L~^KUD@;+o*|j=x;B1@3KNRuvYw zsFPXXo;uzFH?zzF_cUhqn*0&o-2nM?{=WTRE}7Q-?$1BJqx%~hKif9b@x~7yoOjhU zycAQg`13up3f}t)3uofP7ec;T`DxUw%&9-VarN+-crF?lkJGQ#=cZxyFZlQ!F=NM9 z>t@(qnEm0HiJ#1RHQ=qoUo4&0<^B)x!8*+NC~)cd8Jx1OkPk&W^#cdFXy-9b-sg~Ud@#E-fisU8`y^)^ zWImMPeVXzXxacwq-2US&aIwc(;8GHqW3x|Wfjf|2yDV_@@5poh-Z#>W7i>yd6v4EL zv0x@r1TdKjDKly6rOID*H{WedbKmaGQFdRstN*P9+~2jpfmlgZ#cs_RwZOTFbX%l| zmHD4y!6s{_x2Gq`=1E~?R~4DXCjrk9w8VekOEMU|EGhDS`lI09?N z0_P5G0X{)e0aYeFX1!y?fCHa7r$s-D|u%Yo0Yoibd{}X<2~q;o9Z01MT%jo z?2TG(9?u{s5tlW5mDWj%HHIB3EWKcZ(1xtCwDXNNh9u@WF4zPbw!#?bI;dZ;!*GpW zW4HHSt#zRoV`AKEqk+r+FEi=tY#W#Rj6%Kp*c z9C9`LWq-#b+qPZs>ygOwzey-=H9xvd>gFB87bhkRnsd-@Te_>??mgSb{g@m#Y<7YO z_-%LZsGZx#{*)9ma`qwc+HE7(9@sU0c2a8Z@8W}9f9)8$asQ49bCQz#&q?53iinAf zZx0u?{V}?A`o`_&{+Y06%(sVgJN|H>dCs~WqgEW;Id=Au+-AS+=@q?W``Dio4~+cw zupYi(Z?}V6wqLO5NYv>B@W;S*+!Ye5D!-Tvm~iH|*wTXYj|bvVNKt zIQdU4a1|@5d{yVCZec!W79Z)klb7@_;TNuBT}nuk4-AZ%kso@B=>9XAQ6GmCf%@ z^qTp87~$Z@Ze>2_8$Q}OntvKv%+FlUe8HET(It`>4=UgrpJd0-pE&?r{)_9g~Xv1Y+B!V_%;rq_jR-Vz(l$btWQvMU0{;?mPkNI2s;SGCB*K<7sHqRZ2 zSqFRI`Ih0wUKy?J_+}JlNB6>uO`2rCJkq*n`e@AE-3L#13`u-z4F3FM2tGg78PB!} zOL_eQTJ`HtOi%8L=UarQPdQind2@ffX^qgI>k*jn&KN9SI}q=3Yx!K4;G{P%prtDY zW2&QF&PyY#kzbtqQU3u8w>+E}x%>4+M{*vUy|3rcd81zq4gTQ$B}dYqp0#OW<8_0d z?O6Q72j3-#TfW;hs_h>epN`uX{pOE{?N?gXZ+dad z!T8tb#5KC|`yH1Atls$CuGpA2zmE^RVfvN_GI#EH?T^E$&&-Z)KW5(6+Y7gCo3i3? z^7G%tL`?kpg7;kQvY(%@?CAZo_YCOy+ong8_w0S^=flPK&)M5+z@p9fAKSV6?L~+4 z9{GCHq@Y!sp4k%{{np%remBk8HKytEjZa1&*!Rwl2Q7DeGGXSCZkQ6>?8v+4(X!u% z)XWi*f9EC7%!>1$xa`K={MrA0sAz^$Z0vV%K{Rv9k<+ulr5|EWNMnvF^jhE!SG2&z zW>?U_#bvRID&gY&iqp#MU3oDaU#boq;=IT-PLIst#QhEx&oKpsNnQ(F0!Ni(ALZnI zMSSppOFwXs3-(rJfm5+@s(Akq&W+6AlzpWf8>>p94s%{)IvD7S;z^#QlA7;krefXd1Kr8?lZPWD5EHW` z0abY)k39{B@~k@lR#JdjKoM1w`9#IIKk_D-%%v}c@{+*B>`f}6+)1I}w!E3~Mm>f& zDM+!mW>!Rs$$h^tt$ifSV1{Ltn02!9)(K)3fFMUu$VS z`DEw7l`&7=_T@Rf~dBVQ%q8YXRWCfob%j`NA5Y!1G?d4sQ)%d`94$JqUhv7Od2dN|0$5e=2Ijp zyZ=|Boz*`Ix!8c(1qL9L5;)0dw^(Iq1MUAI=!zI1Wv%#eg#{c_zE&H}E)6(sxW_PC zt<@hR(13b^itF}&R|}U@G~?Wz^U%9V^t6kN{^Nu7Av0&27#SM8jx5 z6W|)yP-|eSUZU=rVwl`#XIH&)taOfFg$o92TA3IYl?w6RY5oH;l+gZT%hNhbJCjnH zU}9M{C2rFtRdvDYzQ7dg-HQOjyY;TgC7}I-oZn6JZE8 z+*=Gv{G26Tp6p6r5eUIr>dF-Bz;lH5?Gj-2I{#q{i*fMvqR|t4gZvd%uJpgNXt8TT ze??Hg?Txr;^|FxvYa&usri$>60|V;ZZ$M2r=Cb4sYdpt|oCz5G7Z8!mQn8_P&Lsdq zPZ)eK3$!B?!;h=cPfL2;h*ANo_* z)!%l7^}v-8POw1&5B!Ep-|Nrseh9MBj-&Ut#Gk)~z1ENIPrUO4e4%DFzpzKa4g2hO zyc$t-=c=;UUjic`FB$*L_o*bs>N^XD|1>4wx5x0-1&n*9K6~j)!RY+;pFwQaBpL@Ylc;=Gzf`ke&Q2Fj3ceK5!@V65uA@@9Q4zO7Zhn00^1R{67S2VE!M1 z4)eRfI(Bh(Yh27qa&Po1;wOOz+0h>@(zqY|cXD1gSoZNm4BV4thNC=V&t8v5I}iXA zKmk%BxfCOS?t=D!3vfZ{FhIa976XTY^P&1Q!GZG6%&+dBc3W@CyEhW? zaGXox7Zk*z1TY|BDCo*4vowr@y%n6IAR8U}mj(}orf@ZO_HEYc&J0p@>$km*PU!>& z0l&ZC!_WW=;DiPjgfM_m&(V|uLW2OHH3q=~I3Sc>{)q`d=T0o{`9j~>Tfjb=rRJ}N zK?5}N7EP4#X$=AZux5ryZ~+=_Zu{M#gru42OHjAwbaiyJ3yklDJ$EK6SM(d{-NLXU z)4DAhT^qT`+^{wCICS$*2B8PAh_NCU1K?#+;+x0zhmSa2~v3R=O209w!0?BcZpECBrOmz;kdH1uNr-Ufkhxf^;E@I%o4V!jALiOeq( z;ienm8_O>N0QJ~bMReYO@!9|Rl&*$+>6F-Lj6Q?jH4IWjM-m+N4s97MQezx}Jwv5d zvaYE0U}SG__3S3K+#OEYs(+oL~4A;~7X1vC_;#gesU%6;({K#&G|?>_Z49^P0yP=Z-r}<~OS< zQ%=@(y@wWk_ZMD#MGA6@Y|r3~t|n-&qrdGSu*OOOf{39h1tN_B1Ehf^gkYg0K$=qK z`9Ok|0tvyy21sKvqlzhJ_oo_51`!bx8vto$2|^ekK}ta*NQQtld8JVBzwbo|cyB-3 z9rE{3S7|TPVgm%XKNq>b#$-X6lb0|R#op}XxeSkN8=efB_iwj}-7LZ4Ee0CE9Q@aw z45QJ&){2RR=a#yKx=Z`n0s$>rfI;$%#*M65G|>Kc!62m=Bt#wCqA8CC+W#)RKPhz? zb^ZYwa5`w9ylsxahg6f<+5^xOzs_fQDFn0swx_G>r`cEK&(+E6Qz2l114*Ix(qaYHBe6jTJOu z0AQd@H^-D$5FwDJx7LXTl!X$48tFuqa;iHfnc-wD0*cr|29@Ns(CWmVZH;(*{HxwI zIzQB$KgNbU%wgU1PS*LgFc&MO^DN&CmaLS=YgtL21dAQ7vP&uR_zlI%#h>}+visN( zPm>ES5AeH;-!FoKYnveFYdv;dd2G#NExNV(a{W^`J*3LVlh6w9eJ?M3W@&-; zkk3!iY^?*o>~-TMPw0W=ITNA|Hx3%sEMR!blk@*~`HCR>D{pUDd;R5c7E1O@9KUP1 z^Q{-=10Znornb@zj(nVQg}FPWxM;L2mLL! zKqQ8*UT|pfva9-8;a`z+1#HPFc)x?~{fVnHzWc3tANcuHY@PD`BPC+mqNR6#-lW&{ zm&aS`1nqTUCNI#o`<$bX|FvvPbc`r1T(;itm}P@4?d1ji7q(n@cZqD2u8LBhS@vPu ziy^=aC}};i{o|!UKP|m{=1BX#v^k%_!nTw({+VKoL5;>W{;ZQ3gGUr^8`=^V{jgxL?ELBPH2sVfi@} z@rea3!;*>;DG+gcL68BW+viKK@y^DSh~78#>D){$7rP$2bfVJqMu47O$*DB?h(QuY zsDThegJR`6Rw?$naE$rnQ5gPU5t8FbsSDG&x=g9l#wI{whIy-iZuYniEyTa@>kEljmVSUDxHt242A zPP=q!0d>ULMU*Yza*n}h%FdRDT2M;Itdh2e1H(%aLLw?gJV|yat-~?2IO5YRH?wh0 z8_U1EfU8dq(`+7s$-?c&YH)e;jxNaKQW0rPl|q(zwpG2`spKi2DpU)=BY}l550jz_ zP4nC=JTs*_FsrK*w3mU+F<)`S!Q;|S?&yNv+znmJof9A!~-C^67bBownIAXx~> zLYUJ&;mGO7gx%7rq(({!0amO*LL;*XOP*?>M9Ho|rC5-JMo@}0rATvEB94swhm)>< z8Fh?y09g2ci=lAn6UV*%zREF5o+-DRN-F1)6L+@~f0P6*gMHUe+HgH(oe+;r^?;8X6g}fNcO^liH!h zcl+=BWAHe3ewTNf-*oNfKq*Mq0AT?jEO5+Ey&>!y*G)}v@Zl{W@?pF97Y ze(}CBgL*YT*uGQq6$83klhJ$m9oO#b>e-Z+7j-b=GLmBb8z&4oCo}f^A!)#XN8h=+ zsXLw_q2G=19Y#bfoqbhMT|w97#oZFz-QD%#?j*qp?jBq&?(XhR@Zjzt1i!e40Kr`@ z&fIUN=HZ`zUS?iSSDiY$t50>+>b3V?dpF@~&u0p5_g?22b}nShp1*elNcrH_;@`*pR4gq_%J-X2JnU2ryPzk!CU8D3t;^6>(O zEw6Ax)m5kSl(2(S9Z|TcFG*b-KVitjA@1mpd!b#@)`hs5?&QyFCzii$=^8Uu+WCIF^4!vOcAB+C4fP8*xdZ!bZ30gZw=1 zW@am7^|Ief#jUvzVMvOzgqZ($A$+Ch5?4Me371;Vt_2@omYLlL6-2l#w~g<=T)@=u zg|sC3EtJBxswJNNdnd$a@Uebc^-;_ZLs>fN`;;m}<3IA15>g2?V>QQYtnn`zYzC_Z zHmjntWJiNaO@xVk%=Az@g}p42?3?Fb=>?WO83`QXkRmx5&D+C!3*Ew*^3h3|30uTh z_4yagHS}=yj%UN|`L6y0Z}+pZW`+UP>Irm&)fx1Lb4`vHos&}Y(b1b$T2m(orSQ6s zbq@HHtwvMAX-`U<@~K^6m#zvmtqZ+GCQNJm2`D1+b`E@5{`n~@^rWY7k$_N2xcl>q zx)yVy-PqF%t(9>}6XRhze?xHIBg=dGREYhZL0`h0TA1HC#jMSFxpE){kIR!7$)XWf z_4RN}I7Mm=?}~_McAoakPytM1BPZa#6~1D1SSuE8$X_#O1FZF}rTiaoadBgx;4Oz0 zg>pIhAB@Us{l8x+s#6d+GztPhTTD@iIol}LYF>0AB7&=uLJ@mx8YIQx{yDkhT{(PidqlPzRqCv?)fWu-v`A0iuS6+F*@Q*2()tb?i@bnA?1 zq4IosmrZf{W_fj63+dl7M~I5r={kl3TKBDAGB>`2&-H)x*pEt%U0$i!Q?nPa^g^VL z9C0R0w&1C&kitAG!E`!Wpt0P%j-@cVx;aZFfGac#t31EtA3eCTZ{r31Q2%{DwQfuz zO7qrg#ZqhxL7dK=H}QTYFu^UIKR&<`p1B*xa(mM0JND8%K|jbkcbqovta5xIy^|0j z00e#hqdxyK<2UWtL518up!Kq{e(;S3+mvYPk4~Ix1A518^Vf4Xn&eVp%;M69PvKm_JY`_f70FB)_&oQO>Y#e zX_433V(tRZwj1h`IQM8hdVo&MhgT!C$b zf!=Ea8jY|67U<-59lb2kt`GrLdh5cI16|L>s&;nai*>AvM&h9kg03%}cbGqyf5wfm z`XY5HWeU*mi`IE|4R0MNOdSdgB((-` zE_RCfAQCk)DzfrcQ!WMli+ zb8N(ziG}LO*|S88+~_^?ZFZy3+fN4m6ffmZdT%l;Gdz{a)L%HM(y|W((h{~BWfD>$ zqA>MJ!vIP~a0xDo6?J0qvJtic&w2>938@P=4imQMcM)|=)rW$!0AW3jrKY(6DNZ~F z8-__qUm3zs?2FpIru;A3w>-dDOUp4fvlRtXy|;S5E?6dwXV#GfnD? zvBiIYc*pLsf=%R4h2rMDe&e~YeDn?K7`aH^>GQpLyjfvBaVyb3vKdgSKjKTO9McL- zds^osd&GLqYifVSAp(Q)^+c*~lcS5_^HrW0)i~EwH+wu`k9M;~u`YQv+HI_veTC@Po^qT48sy)AIaU-^5OyF;*JB?LBu>VZ9j*Hl^MlQ>f+v4b19#rT_38s!V0?ms7UcCm+PAI6dpWQGTXeV!yvO+l0RGjXeY#E z&4;-4!*dA1;KN0)r=#p}o2n~2CKfXT$Z)mBHXS@R**R7J#BARzVusn&q6fLNsdNI}+fIJUDP%7n=X4-|7N}LX7!Al@zaLrER8L0-a7r=5Jz5OEZ19 zN)+N}*-e)z6N#5ghvAtoE&eADi5L^c>IR3!3W15YuG`$DCfdeo8|{Mq!+94kaMnrp z_o4<1a9@vhfn!DLUhR(0KA-;*gko}Ji&<@YD({Fz*6{#s8wVCyaeq3^^!)1U^K$cp zaAX=EWrmukkEPG0ln|uLTzE`AH%`5b_IqS%-?(A2b^U#{_VX?ju|6Hh`m70qET8BhzP{`qm%QvZ zpBy6xk^}=cylh!EJT>)G@dY&qwS9>2yuB&XkJ*QjNserU{+3c(2k1$6@h`c-+t<#Jj3EdOTiuOGZ{c-xV5+Wz(5E~YY`f28DNZ?et4 zy_%Uh-*RVV7Bq3Yk#x4+Y`*P{8>4); zgO?_#8>eP#a%48mM4|n*$(4r_5^9G+j<_!plAQ%_53Vi4FHM+pLX4oDqA{)_yieA3 z*E9RVS+3xOAS;`SdQ=yxTQrjary*m)E!$GoGgqf@4+pdP-l8BOf#L;kurKDT@Q5BN z(Y#llQ{9E9qG9oNP)}PT`Q(l0szfZvgSxLMyg!1_8M<0fn-X|Jb+W1aW|8Qo6d7*8%bqMFYz2xI=Mmz*=AWxtm1CgLEvEC~CyYXLjFpK?-{9=Tg;n zHCh-E%ftwso7F3J-T90<~*JT?W>VOzN#^$T^SaN6fa3aN$ zAyjryL%ODE*%wsVv*V2d$tV2COC<^xWD*#1(vhOc&7A6D5nv=bxeB^)l1&XQ=$8G_ zh)iV3sqzTw%~Qrp=SK1hJv{Wh*(8P0>C;r|ZV_3&e`SJnVBA7+M&H{v*7tQhV|wayu8EATd><^psZm zr5lV%E?-Ma5!e227kZ1Qa2Knh2EEh;yJuS$C=;eH!bOxhdN{ujzxY-p(~wv0ee_4# zJcf4%RckB+lz)59mp>KVdE#RIo893g8OW~Ju-PYOIp1qedXe7J^~kn*#Q&SwF`Q$i1Eti5jD1LvPyN4?K zFqd)3F%mZRq~_hNo-F@FxKm?klm8DsaU2a}|8E5hs<$|&`wj%!&~7dE;yg|vZ`oW1 zX-S_HO+o<&w(p&_Wj9TKyRNktG!{JjH|1y4gR#UxO&x{Tb$_q)J`oRv8`;{#IDB`K`x{t9bk+S=^tzrJx+3ij&Cm+7(zP6Nnud8*Z=aorf=G$p0Pa z`rrK_V2I1T`dQ~GO_(@*S+E7=vU&F-D@g2D&v$KDG#8i;3f*Y5AaM=`P@E^*7SAck z-DL$nB=Cdl{67KT1nnFyi!4)K!mswkDoXkaifGDc%4VuiI`ZavHEzh5i6KIFvU1Ta4oUVifL(4ZW}2p0Up{(bOC@%x9F=k=x>8$yw**9i zO#sMIZH#mZFeTqG?X_93U*fzgty#ucK<+wbR1^z#3!VRy>*enOJizO`X4qzVi&&ZU z{D|ozUm(1+aKhYN<>g;EKn{x?o(6y33|e+Sv$|B$gZ4h^{UI((v?e{@#h0~QEq&Hk zRiv1s1VI%n5wEoM*k3kYs-VcIROQ#gGfq05A(tZKD(R+a+tU3_jdU;bb0Y;D^$on| z<4*u(^LLi0G_kno>Z+Ri|y(23EwLi>%AXKKJm{nN*q4vuHTN#HL+=$=A+9J#bC+`6rQrcVaXGvYLp;Wha}(< zZ`uWT#cinI6y&z_cjhd;qlsy6V&n}yiFOcmZS6c>3@l&G>U30!@vC6l0o=nIcM&{A zG6vD_d;iTJAt#)k3M4lQs58E$2$gSop@Rr-UyQWgD}m)froUSU#RVJCB%fZEG8tHp z{rafFK4%~v?e@bB@BaWVC$6%N@fk-ibeA-jWWKb4`h@x2YT7&oCmj-RuaeD|oUO8X z+-0+t{{8yPwOdNsZ5BxSI(*zZ4AjVI{ZzX)|NN>-k{>~a7FR;FNjg5)PwsgAiiORi znA^324}l)dgxQN{srm6a0r;ucdhLgn##mqbCbVu3HBUA;pnBPN*p`&%z<^m(d+pZs zW)>Cl2PXUFw!B9Q-sdX_f}`QrBlF*Q#-b}r&l_X(n9+85Vh%xUU9Uy-{TRd%GA+-? z)gl3oXWy)oGrf4sK52m++g9cX$l`k*UWO%N4XljMp(m2xwh=b)$Hj5*+iJPFe0@v8 zX&V+aA8EC*`Q!kZRn#P~)iDGxG8KOp_L>0mlkS9e-5+LT=r1s{nMj}|-X;eg`_2@a zPZa196K5pI%>a-{-$s)>TUOtO&+8;D!Sbf^HQh@G9$*ZH+VT_=LxJZE#rd8al)};Q zL<^+Ejrs2&rWla>p*Epg#Kz+ZU2C7g$(FN7@#7Z$z-V{QPFpM}aa$QpA?ojk%wbNc z2;#Gd9x;w38jywmwbV2Bk@-8;k9xLg`vwk*mSdjXgqd%-?HU{Y&3uh2PaVF?J&M7F zvV`mGhAnm`zXaSd6^w`}cCyi!S>F%e$P|%6TOFsKR8;$46V*RZ!0c>}2`>a3nH!aD zE|EwmAkUVKyC#f>43mE#IFzibV+HXG*gksy9mADbJZWH$eN3Qp0G6;8L`&R(ym20D%BPxE3dj3!P9v!>#5ZH|nJ$ zhB6i}8IsdFCiW}<@dQvLO(JLV3|~Qc3*+6W2jE4p1ZaGiq5+`8t-&4y!?6S4k)cra zhUTJ7sldZPzpuxDpP!+h2Kgi_#q|YOn2;?*x9FgaknzK0NH18vfyCb#d$um`R+EvP zzzzR5KRWDGN&vxrd16R9g9BTf6$W^W2bmst1dfK^9T{Xs;8HV8`Z-djHtY6Y!Bi2T z|3~dXkfAX#%Y~wI@^2VezDUdDcsG`^zF_S?#4%Zs(#RP#2tac|NH$PaqG(Os{}0AWatifr%|Er_D{;oQQh}J^0oKB85Q|En zr|mFhXKRbfllMk-A`JTP)$(-ESG^~}D3}-#vzq&bF|{)&F!G^5E1`MnpW7zButzqK zd0{?nHGW9~o|D4jm%QZmP1aAtTNPsLylJfyZLFJSg5{LBP28FqJ5&<%Sk|~BP}UK3 z(<%VD(;C`;Dy!MFq1gv-W zk+CexW0_Rhj7vlUsik8G8HocxH&0{2F5Cj7Q`ha@FS3QY-u0^^fiyU zWEEU!E^1LfKilz2aUuAWCBCr(!2eEm-T9@O97c*@DJa;H8-2?YTQ~4OA=w5#{`+|r zK_L0h-D@xkEqF??w2_ z9Qq-!%L^L`0=-|>PUL=j@JriOxm+$VzntuA^zU|# z3M`M;kUL%gt?~eKxNoN5l>4$ZU*_Zu!VI2txlIw-vyRe%>;bMTAtcUZ(0q&j!MeP- zd3+o3E z2-6GnBr`jZ*9Li6#tQLl`ia5jzZ`5V(YtzX*={g`*4d`r4WGPwece?y4z_ZquYWN z%leF`cz!Lx$%>6QRTiqb8a>EiIZHC?+h>l_LtAr=E0{X{D`^dD`ifHdnoMAut$sI~ z%RAeey~L9)es>Rav3`HrVzuY1p+NUZ#;BC+{Nd`0mtE-X6|Uy84Fi7t2k~5@5gD!y zsb8k_V(+xQQ^7#=sEv<#PlTud?uIpV2Q(`)W~OSOe2_CVZCXD!&8oebPlF$4M!mD? za`P2|`iAX$$!!yOZqk8_9hWTrnyWnVUvfM#Q@Ib^&$iR)u-8@Xa^6N<*d&MG+n;jO zI{hwmhU+ln#ENau?vy;uIqA9)_N_S(sGAs6ndA6Wqd3?iLMkrWC^ViT(%Dm%^?9vY zk>aCpp~O>1n@CU^G}e_mM6`Mxa=d&Nh`-=;w7Xj9|1QSa<>b#_G%;wMYF@ys8?b(X zrCxoAVf)E2sTpZ9=(CBmnHzsunwAnmHIIp#GQ~~B`%m#eZZ^b~$19lHY)@Q7X#wPa zIqUSvTZzm+GZj0%~RDf)5H zWuy4t-JeHOAPt_gu>M%wKp|nV(x5)ug3G>|$T<5NcDgFU)}7&>eUt&j7tM8ib!~fO z(+smUol}m8-}s8{3@JIBqftHAKb}v!T)0&l3HduufN??>`#ejB2rz}! z=}Sia8aBkcJ4L*?##wxSWtFw~$HoX>{3tWZOpHZ>t$()E%F%gRxsk*Zv>RyyF5Q+W zPd`e>9kn4zy6U`o+pnyiSEQCe6YSy6>wM##>Fn`rza1y&Xp3SKkb@_Cl?_TV<@(=k&edotN7pjrm;dBtE0N#m=7zI z$?yq2#u@Z?*`2Cf(1I@@absvNPa`d78mN&*Qu-z@3$I;;^|g1K`ePOD@ctyZ>ur1) z3@u7%KDVC!w3@bG_q`b9@VZHTZD#@J+<(r(xhjO>6z2{&+;6Hr(D??Y1XwC+%fB`N zS*(Sfpz@@S^1uAKwWeQ>a2vL}FH3^-rtXZ)Gipyha_2?_FYt-2L1T0}z3-QO9cd9u1eKl(#)pk;sKNO7a^X zN<&4g%vEU>^RfPLwx`&BZj(5oPBpIx58Jz2pfEIm;jG-pKYl{k zA(8+&7+CCC+%gymBAZ40fldkeKT?zy)J4Gn<42DVb)fqBwKGf z#eKNJ9KE;-N!D3&KUP{4Mi@Gkt6DFfpNBB8T`#uj=6wDRUkF33&~c#ij1g@gnBC24u$;sJwmH)GClV;s@nDRkRm?5%jp31 z6I=2oaX*0?nG%`gY@pDl4+~qkcQ;DuMe738jQH4#sIDJY8MhYuPIy+ivC1&zbsb{I z*T68S_b%i#uqyGt`{XZt-}d}@g=r_X;8gCtDN|QMR`yFvh&lR$3BJnY=Q+59=w6D? zqKY9qLaXV~j}{zIWgipwE^hS44(lAQ>bH+oMlH>PEe6_$dW#Kcp}$0Vq-r>!wE9$Z z2!YwFOkglIT@Al}WO8@)jK>R5<2oaHUK=AEr!U(LZZje{w@%Ukz=viT+HMzwZVbO- zD4W_vt~i+_nWO*|^pqf2DS%{fmXNqEql5$wGVbD%x@`=Vg(R}BLcApEEN*BRRTg|I zY^nx&oy5)da!2-uls1T)E~uQ62|0$U2%s7gmCZIMiGwJaO1VTEWd})^R2<-g87En4 ze5ow&cz7dO)v%;s487=%7TRH1^4UJ?)DhBa`ev*X(=4v(P=RYLws-yYb4-KCq!v>~ z-V0$f_h4In$hLk@18`9i18I{Qv z0S-n6n;XQ4L%kg~)+6VB!CO^@7pLBn0#mZe^(AxDZF}Hidx_1b{^AB)(1T?6k@8LD zJrWhm-cI5VXOut0$@6W#<@Sc~#dsYLECrh2T1RwLk2s*d#=%{t_M9w>%u^0C1 z?-|i2sEw!-)Y|Y^1^%|bGiu`<>41c{W|0E0z;~e2PgSgkey=SzRemcF{a1gMK*vAk z+hw4D88KoF9?#n5pf$N}iCwo-#7 z69%!rT9fHP!E5&q7Q&puMTR|z=@-!WF4>GFEOJ+^&N^PWy>^-)97s5VtkhnTCz2CJS;W5%3fyFBju!Vm)-n3ska3M*lHMork1(aqH*|m0%lw1M^tAQ zIT){K0G{>}IEg|zN$Qy-m52#;Q^;+$REMLeZRWF3M5&$xW--y8R$49Q{Elurf|Ie6;>&g zgMx0zk6(P<BzbR$7h#BMDRERzRU{>!Mc*v#p!JFJ+rRJ?O+!+vxjH4itRx~62IgA* zs%^8kB0!AsWY8-yx=a94g^;JI2)W4+Nx^dsoeqJ&gcY&0a3d=4R>e`#8?MqY5INFR z`OfLGuuidqFD;>2xFZ+i?+0&TFwF|sSqQkv)R6l^VS|(V_dKuoKP-*hHB!%UUJaHQ zDkk$jgK=yQKTh8YeUh`pB15y3Z0K)XJnr{OQ4zeU^RtXmZ@Sgd=`Up+y2dzv^{lh% zal-T9bWaq;m?oUy+AZ3M15ssGI{~!Q8WcQ=OLjMihN^M*Yi&U_8^ENB|47=d8LqgQ zg?PErzF$9|^#17$C;Fk}%&4v%V#VcLRo@ol^~Ec>c#=AsDqH>EsfU$j&DZOoxX+7K zu^_(;kKFauI`omxtv5N#0e^eTCsjTfE&awL)iD_D{@$%nVIYP)fWj(jjno?BS#j1^ z9PwC#GH|QT_uf)|c2b@d{y}3zzpbzVH|7^q)cN~cOIfOEGCXzT2c@9F95b6Eg#2>o z2gx`kSrSF@AlNdEA@>kmcdGG^OlFo`qh{wDKrDe-p`_m5|9A)nM*c!dHe&4Hxk$ z_2l&|Q}}0Z?pP_9$5R35shWHsxDrXh`{P(m)xOcEq?D8M@%2jInfw<0#}nd_#Lwl z?r%XS3DfXVYkxHiYHS#6&_Q;WVo3csSU=xMuYO&y_^RNS=g85)%of$@JE3`h->X}h zsDGom?n)aoCgnBRqA7GbeBZ-b7hVZjNKJG$2H!?wpJtI&d{ukwve{TMhvq4Fb{Pu& zEnZ918tU{9ymk(bQt6q&uLtCeXMUv%*Zsc_1I1Er_@;XTn(iEra$mmg{uR)v+~RD% z$=E**P87iKh7GD{F#06;RNiC2kwjc^PJBJkBkQ=efg5=8LQl2*Xi#X}DZe%Ra`v_a z!2@Lpo(m8EFe{&_JL8{3?)8}88asU%AMvD!M^(|ycb7iRA8gp%dO5XM2wH1rP-nbS z923Y)$Zh*W_dMBp!QeR1o!Yv%t5k~`l?b|%*i+&1x=L>HGV12AdM$ALcJTd3MEfWH zHbvI`P?c5T1|%v!x%0%bV9VF#x!us2->))PCGb9^#W-NLFV|%}|0X^WDYWs6+=(-r z+T4osY!Fd5O3P(QaH4o>6VnyG$o4B z3{mNIe?Lv!w=PF=<)opzP9JeJZ|IVjx+QA;JChy>6vBcfn;Cyr=<{C&<@<@dyk&ei z@NF&GHI7FT{iZn7msRyI#%^@7{(g>}djrwBJ0a3ha`QesHlw=3e7j@a>2ehujH7(ghT zx5Urp@w~Q zf~)txpMIf+4-~zZ1t6B8VFFJ4wn|O_B6`+>s~V?a6PM~^Y9+8OSe^I#HTk0>*x?#} zF}rIpsyc&n+~guT{Az>1%5Q@x$yh%Jdyu4VTD+XSLIlrAA zBwPSPhem{MzCK)KoERu<)Yred|GKQ9cD^`y*3vZhBMh+}srRZo+7f*2J7v@tm|rle?l3lWs<{JZSjYqD!fXl~b2lTT3WkE@2Rn!#`a)I~G;1seoZs zqh4#8!_4!at0@eNrLUagXpFL(9v91a1ws0e%ILIV^-A&>b3;<4lXZ1RRS=nMt!~qA zFK&XatawB9d$6ds!ye3BG zmRc}B5lgoZ1WjpJEKXJRHBz`@rsa$|uJ+QXp*ME=3t(`MnBWw8Cg3{MAE}0-`Z(}a zWdFPYd0iaqyfj&wLF3O+dO_uKPLXyUY@!bAt9l(+Dcrl5xqLz6j(l1cT`rl;m#m!i z)yc-t6BZ$1yy?rAsIya$@V>~1IoeHF41`!KY61xHY!Qe(K)etqCrLQqNbBBw)_GJH zMaW>u)c}h4U`4R$^g!SmP-b7=#m`UvGtVEMr?5;-*ZG#ekp=NzczR^YS*tp(j{64v z@_!#NcTZb>POr&h#@DYeLmky|;7heouETj)U|v&q$AnaOl`mJt?1Zgf1-3KR{ad?B z)U2@)A0O}GyYBwQ@T6I@9uwIgtS|daBzf1&?EI4Q4m>71<8G>2vtL?*xeJ5%%8AVP z4N>+E&23-S6Z~pD>+!wLXs~X9(|ZlU4JAaUrgKn3#0jM;a;Q;yo%Vd5Mu*yi^_ase z4AQMU4q@u0*;NPr#PNp_)Q;uVhse_&eT~%vAL9u#Y`1;R-IO}rF%)v00Y_- z#^++4-dm$yt04v%Wf(`zlgDulrCk;CQlK&;1go={`49YEPmV^(0+qiqGTa)wL6;iV zy*{JMW0|6<%~P@>&RnN{Z_5|YwIm^42}~Fw!amu^Vzx8VzC&cIIHc^)v)j& z&b@~{uH?2kMh7;VvkO0&Ad=`U-Q=LzkYJC!ulq>#L$VCnq_`;fx;mq<-^jemy5-}O zTm=sxYF7|NYF;&4s0uiUd@sn!zK(#d{TFAVe^I`#kS z#dQDern>)+7n-R7*M{n8GVd@8q-Vz#ze5oh(Cw&0Y^Ua&f=hP@cH{mC&i%8+)#Smc z$WA~hjPQEN4%rqL{nSwb8!J$xRtz27&IB*3w*C|{yOGHGfn*%T*V&_WxF6 z`2YL@k+-Pt&pS+&X1w&c->*#QZGm*|vbydTrtX%)=HD!#12lcY&CSNi#m33=nTto5 zn^TyRi-i;VGng&F`9Wz}TrrA$Kp2UV)n A6#xJL diff --git a/listener.lsp b/listener.lsp index 6652ed4..388486f 100644 --- a/listener.lsp +++ b/listener.lsp @@ -33,7 +33,7 @@ # default. Then make a TUNSETIFF call to initialize it (as # IFF_TAP|IFF_NO_PI). (constant - 'listener-log-ip SITE:listener.ip + 'listener-log-ip SITE:listener.log.ip 'IFNAME SITE:listener.tap 'PORTS SITE:listener.ports 'IFD (open SITE:tundev "u") @@ -116,8 +116,8 @@ (define (udp-handler) ; buffer ihl (let ((ports (map ntohs (unpack "uu" ((+ ihl 14) buffer))))) - (when (intersect ports PORTS) (mark-active (date-value))))) - + (when PORTS (intersect ports PORTS) (mark-active (date-value))))) + # Handle an IPv4 packet. It recognises the IPv4 protocol concerned, # and dispatches to the associated handler, if any. (define (ipv4-handler) ; buffer diff --git a/manager/Makefile b/manager/Makefile index 7589bac..638eb47 100644 --- a/manager/Makefile +++ b/manager/Makefile @@ -14,3 +14,6 @@ siteconfig.lsp: ../siteconfig.lsp hourglass-web: $(MAIN) $(LSP) $(TMPL) $(OTHER) packnl -w $@ $^ + +clean: + rm -f hourglass-web siteconfig.lsp diff --git a/manager/basic_login.lsp b/manager/basic_login.lsp index 38b7ac4..c4488d3 100644 --- a/manager/basic_login.lsp +++ b/manager/basic_login.lsp @@ -7,27 +7,29 @@ ;; this file as a packnl embedding that will use that X part of its ;; name to determine th actual script. -(load "siteconfig.lsp") - -(write-line 2 (string (date-value) " " (main-args))) +;(write-line 2 (string (date-value) " " (main-args))) (unless (ends-with (main-args 0) ".cgi") + (load "siteconfig.lsp") (if (exists file? (list (main-args 1) (string (main-args 1) ".lsp"))) (load $it) (write-line 2 (string "Unknown command " (main-args 1)))) (exit 0)) - ;; This script is executed in (protected) subdirectory www (change-dir "..") +(load "siteconfig.lsp") + ;; Needs an HTTP_AUTHORIZATION environment variable (when (empty? (setf AUTH (env "HTTP_AUTHORIZATION"))) + ;(write-line 2 "needs auth") (write-line 1 (read-file "tmpl/unauthorized.http")) (exit 0)) -;; Must find that value in .htpasswd -(unless (ref (6 AUTH) (parse (read-file ".htpasswd") "\n")) +;; Must find that value in wui.passwd +(constant 'PASSWD SITE:wui.passwd) +(unless (ref (6 AUTH) (parse (read-file PASSWD) "\n")) (write-line 1 (read-file "tmpl/unauthorized.http")) (exit 0)) @@ -41,11 +43,12 @@ SCRIPT (role-script) ) (env "REMOTE_USER" REMOTE_USER) -(env "ROLE" ROLE) +;(env "ROLE" ROLE) (unless (file? SCRIPT) (write 1 "\nBroken.\n") (exit 0)) +;(write-line 2 (string (list "script" SCRIPT))) (load SCRIPT) (exit 0) diff --git a/manager/controls-update.lsp b/manager/controls-update.lsp index 2085462..bddef91 100644 --- a/manager/controls-update.lsp +++ b/manager/controls-update.lsp @@ -17,8 +17,6 @@ (let ((data "")(b "") (c '()) (v nil)) (while (read 0 b 1000) (extend data b)) (setf v (map (fn (x) (parse x "=")) (parse data "&"))) - (push (list 'gap (int-parse (lookup "gap" v))) c -1) - (push (list 'clip (int-parse (lookup "clip" v))) c -1) (for (i 1 7) (push (list i (mode-parse (lookup (string "mode" i) v)) diff --git a/manager/controls.lsp b/manager/controls.lsp index 10153df..555e49b 100644 --- a/manager/controls.lsp +++ b/manager/controls.lsp @@ -4,6 +4,8 @@ (constant 'CONTROLFILE SITE:control.dat + 'GAP SITE:control.activity.gap + 'CLIP control.activity.clip ) (setf UPDATE "") @@ -12,29 +14,28 @@ (load "controls-update.lsp") ) -(constant - 'CONTROL (read-expr (read-file CONTROLFILE)) - 'GAP (or (lookup 'gap CONTROL) 5) - 'CLIP (or (lookup 'clip CONTROL) 5) - 'TIMES (map (fn (n) (or (assoc n CONTROL) '(1 timed (7 0) (3 0) (19 0)))) - (sequence 1 7)) - ) +(define (time-row n) + (or (assoc n CONTROL) (cons n (copy '(timed (7 0) (3 0) (19 0)))))) (setf DAYS '(0 "Mon" "Tue" "Wed" "Thu" "Fri" "Sat" "Sun") - gap-options '(0 1 2 5 10 15 30) - clip-options '(0 200 500 800 1000 1200 1500 2000) + CONTROL (read-expr (read-file CONTROLFILE)) + TIMES (map time-row (sequence 1 7)) mode-options '("opened" "timed" "closed") start-options '() end-options '() limit-options '() ) -(dotimes (h 24) (dolist (m '(0 30)) - (push (format "%02d:%02d" h m) start-options -1))) -(dotimes (h 24) (dolist (m '(0 30)) - (push (format "%02d:%02d" h m) end-options -1))) -(for (h 1 8) (dolist (m '(0 30)) - (push (format "%02d:%02d" h m) limit-options -1))) + +(dotimes (h 24) + (dolist (m '(0 30)) + (push (format "%02d:%02d" h m) start-options -1))) +(dotimes (h 24) + (dolist (m '(0 30)) + (push (format "%02d:%02d" h m) end-options -1))) +(for (h 1 8) + (dolist (m '(0 30)) + (push (format "%02d:%02d" h m) limit-options -1))) (println "Status 200 OK\nContent-Type: text/html\n\n") (println (expand-file "tmpl/controls-form.html" )) diff --git a/manager/index.lsp b/manager/index.lsp index 16003fb..3ad8090 100644 --- a/manager/index.lsp +++ b/manager/index.lsp @@ -1,6 +1,4 @@ (load "expand-string.lsp") -(write-line 2 (string "index.lsp")) -(write-line 2 (string (expand-file "tmpl/index-page.html"))) (println "Status 200 OK\nContent-Type: text/html\n\n") (println (expand-file "tmpl/index-page.html")) (exit 0) diff --git a/manager/tmpl/unauthorized.http b/manager/tmpl/unauthorized.http index c549985..a4d664d 100644 --- a/manager/tmpl/unauthorized.http +++ b/manager/tmpl/unauthorized.http @@ -1,2 +1,4 @@ Status: 401 Unauthorized WWW-Authenticate: Basic realm="Hourglass" + +This site needs authentication. diff --git a/manager/www/hourglass.css b/manager/www/hourglass.css index 1a378de..ce8b0e1 100644 --- a/manager/www/hourglass.css +++ b/manager/www/hourglass.css @@ -29,11 +29,11 @@ p { } #history { width: 80%; - height: 120px; + height: 220px; } #controls { width: 60%; - height: 430px; + height: 330px; // border: none; } #form_submit { diff --git a/setup.sh b/setup.sh index 4cf7a80..951d3ac 100755 --- a/setup.sh +++ b/setup.sh @@ -5,12 +5,19 @@ CONF="hourglass.conf" function getcfg() { - grep -E "\\s*[^;#]$1]\\s*=" $CONF | sed 's/.*=\s*(.*)/\1/;s/\s*$//' + awk -v K="$1" '$1==K {print;exit;}' $CONF | + sed 's/^[^=]*=\s*//;s/\s*$//' } - -NET="$(getcfg listener.ip)" +NET="$(getcfg listener.net)" TAP="$(getcfg listener.tap)" SET="$(getcfg ipset.table)" +CMD="${1-start}" + +cat <> /tmp/hourglass-listener.log - newlisp listener.lsp >> /tmp/hourglass-listener.log 2>&1 & + ./hourglass listener >> /tmp/hourglass-listener.log 2>&1 & while sleep 1 ; do ifconfig $TAP >& /dev/null && break - echo $TAP not up yet + echo $TAP not up yet >&2 done ifconfig $TAP $NET.1 up - iptables -t mangle -A FORWARD -p tcp --dport 53 -j RETURN - iptables -t mangle -A FORWARD -p udp --dport 53 -j RETURN iptables -t mangle -A FORWARD ${RULE[@]} fi ;; stop) - iptables -t mangle -F FORWARD if ifconfig $TAP >& /dev/null ; then - pkill -2 -f listener.lsp + pkill -2 -f "hourglass listener" else echo "Already stopped" fi ipset flush $SET + iptables -t mangle -D FORWARD ${RULE[@]} ;; *) echo "Unknown: $CMD" diff --git a/siteconfig.lsp b/siteconfig.lsp index 1050918..69f0fbb 100644 --- a/siteconfig.lsp +++ b/siteconfig.lsp @@ -3,16 +3,17 @@ (define (set-int K V) (set K (int V 0 10))) (define (set-ints K V) - (map (curry set-int K) (clean empty? (parse V "\\s*,?\\s*" 0)))) + (set K (map int (clean empty? (parse V "(\\s+|\\s*,\\s*)" 0))))) (define (set-list K V) - (map (curry set K) (clean empty? (parse V "\\s*,?\\s*" 0)))) + (set K (clean empty? (parse V "(\\s+|\\s*,\\s*)" 0)))) (constant 'FILE "hourglass.conf" 'KEYS '( ("listener.ports" set-ints) - ("listener.ip" set) + ("listener.net" set) + ("listener.log.ip" set) ("listener.activity.dir" set) ("listener.tap" set) @@ -37,9 +38,12 @@ ) (define (setting LINE) - (when (regex "^\\s([^;#][^=]*)=(.*)" LINE 0) + (when (regex "^\\s*([^;#][^=]*)=(.*)" LINE 0) (let ((KV (map trim (list $1 $2)))) - (if (lookup (KV 0) KEYS) (apply $it (list (sym (KV 0)) (KV 1))))))) + (if (lookup (KV 0) KEYS) + (let ((SET $it) (K (sym (KV 0))) (V (KV 1))) + ;(write-line 2 (string (list K V))) + (apply SET (list K V))))))) (map setting (parse (or (read-file FILE) "") "\n")) -- 2.39.2