From 783a1aba192f8a842d98596b6ee63136dfda894d Mon Sep 17 00:00:00 2001 From: Zac Spitzer Date: Tue, 30 Mar 2021 21:33:01 +0200 Subject: [PATCH] 2.1.0.3 Standalone and Analysis Report --- box.json | 2 +- build.number | 4 +- build.properties | 2 +- .../extension-PerformanceAnalyzer-2.0.0.3.lex | Bin 25774 -> 0 bytes .../extension-PerformanceAnalyzer-2.1.0.4.lex | Bin 0 -> 54060 bytes index.cfm | 6 +- login.cfm | 32 ++- source/cfml/plugins/Action.cfc | 14 +- source/cfml/plugins/aborts.cfm | 2 +- source/cfml/plugins/analysis.cfm | 4 + source/cfml/plugins/css/style.css | 44 +++- source/cfml/plugins/detail.cfm | 225 ------------------ source/cfml/plugins/dumps.cfm | 2 +- source/cfml/plugins/exceptions.cfm | 4 +- source/cfml/plugins/footer.cfm | 4 + source/cfml/plugins/memory.cfm | 5 +- source/cfml/plugins/perf.cfc | 84 +++---- source/cfml/plugins/related.cfm | 4 +- source/cfml/plugins/renderUtils.cfc | 7 +- .../cfml/plugins/{logs.cfm => requests.cfm} | 8 +- source/cfml/plugins/timers.cfm | 3 +- source/cfml/plugins/toolbar.cfm | 31 ++- source/cfml/plugins/traces.cfm | 5 +- 23 files changed, 171 insertions(+), 321 deletions(-) delete mode 100644 dist/modern/extension-PerformanceAnalyzer-2.0.0.3.lex create mode 100644 dist/modern/extension-PerformanceAnalyzer-2.1.0.4.lex create mode 100644 source/cfml/plugins/analysis.cfm delete mode 100644 source/cfml/plugins/detail.cfm rename source/cfml/plugins/{logs.cfm => requests.cfm} (92%) diff --git a/box.json b/box.json index 931c9ea..0322b5b 100644 --- a/box.json +++ b/box.json @@ -1,7 +1,7 @@ { "name":"Lucee Performance Analyzer", "author":"Zac Spitzer", - "version":"2.0.0.3", + "version":"2.1.0.3", "bugs":"https://github.com/zspitzer/lucee-performance-analyzer/issues", "thumbnail": "https://raw.githubusercontent.com/zspitzer/lucee-performance-analyzer/master/build/images/logo.png", "changelog":"", diff --git a/build.number b/build.number index 8cca15c..f9ec5e0 100644 --- a/build.number +++ b/build.number @@ -1,3 +1,3 @@ #Build Number for ANT. Do not edit! -#Thu Mar 25 03:33:05 CET 2021 -build.number=4 +#Tue Mar 30 21:31:50 CEST 2021 +build.number=5 diff --git a/build.properties b/build.properties index 2af8e52..b1f2050 100644 --- a/build.properties +++ b/build.properties @@ -1,5 +1,5 @@ bundlename: PerformanceAnalyzer.extension -bundleversion: 2.0.0. +bundleversion: 2.1.0. codename: PerformanceAnalyzer camelname: performanceAnalyzer category: admin plugin logs performance diff --git a/dist/modern/extension-PerformanceAnalyzer-2.0.0.3.lex b/dist/modern/extension-PerformanceAnalyzer-2.0.0.3.lex deleted file mode 100644 index d1977cf60fa95af3ec93ea6484b930705c276fe3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25774 zcmagF18}Tex3(Ls*mknAV%xTDuGqG*V%xTDCo8sX+xAKJ`SU%&jH2Z*m{DIrBZDlutc8rlC$BlsWFz`v&1SU4J+ zTG{_Ev#|favkdKwtnDmyt@I7~taL40-3;yi7bW4pD5;(7^{ovI|Cbeh{>uvb_W#>E z$NLwx+5Z)T1AGUE+@3rP4-f!g?`t4`{ro3}Qhd^4!a@p))KbEL0Pz3y`q$b3-*dkS zh?cVM{Rtg-`36aG7#j^&Pu;}KW;H{-nt@1SNZ{k6Xy*Mcx>{0Ha??|L|Ke)d1(hcZ z9pjY)HyY0Oyu{yM8e5yHjIFx9;5f?4_8wA4ZcKI(UW~8Q*1EmkxT>(= zfMfY$CiD9=v+kha%yrnMOG=#Jz<->3Dr#Z!uc&_p!ixuARt%uu-AF&y`$kZm7H2yZ zA_6EUC6WmT2rC)jb#h^l8U{)(+O!+%z!AR&a$M-(ezXJ!TGE!HJXk{2k%%7r*(Q_{}NwmHpvlP$+Zh!fDwJM7^t+AssNdA_P5fa9GOI|eEZti;mNuMd-l8l{{ z$gqFD4UCGYVS-62NBd(JHf3lVKYJ}4545{|j1tq=-S8iN4s~JI{SqnQdVIWXI`y{B zs2Ee9q_Ak+n;3Y#IB-n7?X3##k5~K6e577|b>UZ^>t4R1GMcH1);Zm(ZNs$HbI0$x zv0q#6R`>i^#X6?-L_Ah`ytVga+-AMr!R*WgwS?C2 z`(VAK5)=jmjz(;~t08of)F{%m>(KUA>H+$67HN(6vb~*huc$U*vcrQ0X_9<5{PH~0 zlBCJ}bE5-s5{>?wt>I0+Usvbm zm1vWyBD&|+)Q`=`RABj0W77%d7z>^l8?z?n$4!dK({vD`Dq6~|`pacntJ_m5hNc1lVHicro_GM=*< z$uKHpH6M#5>p%P5;*uqxgC?XJ4NJ>x(>NL8pMBn6fj)tMd!HG)Bd9fPFOImEVLqpL zdOJ+EeHb10Jux7F0UK*cswF-XeDV$M%m?snR25rsehm0oKH!w~3%?~Hnz=CmW7_8V zndf(Qe0VV)?{>N;ecpUb#j%}lHmKyVmhl;EzMK{@>{}eT|E8AZb{3sj+Oe`ffSu;> z0`2D+E8}K;DYyHWcAY+6l5b?GRDmU4NAvdF+iHiKv3PR%qpiA z#+Xr)=Rn()IUtE@CaN1_R@T~w_j`{3MBgwDMv!l1oviv<&=LPzSFr5dt ztB>UCLo#`cNeZE5xF3h^71je-rOi{mRb5YQf0XO1o~mdg02N!CUs}rT#Z7;L&tS2 zvNrx|Am81TVhIA~ASYDd@9mWS7NjE>bx(;6x>RH6)AJ|310uJVY&WNUskkR2)OJ#v z$?U9xFzi#4Gwg=)j7it_u>|&N+Lmv->vDHV9X~NGsgf22LUnl0ZUU?*in?{X=Wz_F z5m{fOTK`+z9xjrE_s<9p$D8^AetB`tSIt2DFA?O^cQCcKqSiOk{|?)?;+t>vHx){& zR;$ABo{fN?y*@MrKq>XHg>X(vypHFB!Fo`wKd<6yeg*9`j%qp4=q3OB%v>%Y9BshK z76ODoHg=xKWHUBO=wxRLyb6#|YD%q=fU;fiTQv6j{X%Of-3`{W|C>~$c+pc;Jwna& zwVD*cYAUf9B(6maXn+dPX4u~(XL?ONzS?XX#|&yQb(qF8nPtuE*se7`1|B|=DSJA5 zL#GKI^-~9R5;$qLZn4M@5PBp1^X=j7%u+RDI}odq@LY6*&=1zSbUrItZL3!HP*zRf16~$cvhZAZ=+i z%&ZGwgBIsUs8+@sL)mY;F8Dpim?)fPPNB zMb|s;=XQX3X&g_CspG;dVQo+=mJ&i`%{{PTDh*pdq~_%gmlBV_f}>RGMjzuDUOYK5 zXf8ZZ7I*u{=RIH-n;6i092hmiX_Dfmp$kWs@0`360LBoU?VSH|lRRr*{Nbe#Dm^eM z5gGFXcQ$Cj&;1n?YZ+ZW8Lco1FoEc$sr(B9 zx><7-1hF`WV9In1k?_4*xhlMR(N@wsYFvTMS8O0pXhdeY#{GKH2S&EawbYdoCnt0S zx$w6{YZ?^~nRQL51@6+7Jhgo8d|wy!=P)-;n3-4Q{8UqAUjr0af+C@tmN^7RHNHnm zI;vz^oOuE`Uk90Wl{NHVwG?lsO(LU-8otPpg~d?lmNeC{f6(Axng5*gap8Gv6#9=! zHe=Hq-m=m+qM$pD82397Z9wq3krOFPzEU`}jW%OC)-Ku@OBecgXJ6V}E{;}XzBBOn zcxIAof#2wpjQBH#WGR(C_FZ<&=S=R15aYTzn=Ci_{h^Y1&!ZAstoOA{<-f>RoQkLF zDTbt~nsUg?pkTZq;YoHdf8ha#G@nO*fhcbHY&wFz^>Re!)^Xo=PIIXez{>?D%Ef)_ zp7}JsfelzR$wbqI1(!4F{7+-C`7z(K00aO44+a20 z^DoAtZ*ApZ=;EMYXkn=DU~Tv1FqYpA^DX`6dzo(nl;q4;Y2m#dbUwF;z>hU!e0@5JRos|n3j&5F($R>mY#&Je2XdeM z{8T>quW8h-PN#l?(hJN;i$TAdk{ouCC4FM*nzT)6)tk^m*{gKXJlwy3ke^a9c2fBy zME@caS^ltEmQY&}LlSRzk)l%#nA?xK^m9(3t9i2pcP;YsP^zAtL!3e)&HHmECD#j{_wETzXmyDh)lPrq;^ql!!0 z>5HRI*;D$EeurdvyE<4M!>wB-yptF=l*CwL7i166vq{D`_vd3a@XguYLAc2tjaqp3 zX7Jvt?O2eHYQm9)J*q4GwV%x_O1B(AayDAS+Od&41ctfNsZJcfL{%gLuLl*d`w&3NRZveA%8Tctqw@n zZuK$_wA<^_xa#w{Ayj9cU(BrYtQ1`z_GLCtE}#96e7q}&a1QrXklcI?vVZ&9d~K5L z9b7F8slT?%-(Q$-(Kp`HVY|h>SQaENT5l7BHD^*(j=nLbq8j=~X#20DW{$kU*nHK! zS;tB$IEbuwh(U3l%%9RwP4@^#{Q!=$8Ot6qGiyEG3U{8UJE0|yC?qU@JHHfWaDQsD z$SsumNVeXKyIZs1*<7j(m0$~B;pV6WCJ+Z=dsn0sxzRV+$kpD}h4PEpN zZN7^i`~UW)Z`C*7D|{27vTC)<4Da~>^a`f{VR>G;OUU~h@;9oG6Iw?;;7YS6#2=r; zfm(R+crkLP>Y*-Y(a_cSP0qJ<49!ZUcFvWOJsN<_rT1nto{z_}$b5&0fyt_U2~rp$YX`RtbBZ7-=DHIK;U< zww|Xrh?@{o)OK%{sY#G$m|?9DahdYr*aQALRoVh4{(*YF9QnNi>MQ#mI1%Q@1<_n; z!wtWHig+F$jI0{gSK) zy>jS2sB>!o@dJ8ZP7tQJyBqpxn5@{T$939h%XfDpv(^n!YiVs~NBOjSJxJ@7+@ zu7(oiSt>1bC?TQf9t#@hmZI$hy}f4)7v8wuU>Jo7{qg1E#!C-%W2YOhL7U{B%>ui_ z<-%bi=~-`OH)>@;u*{)8RA{8d4#))UoKAj-ZU#X5M>d2C@L`P2zF_Xy{Z$bHttoCfqkhjw}vxwNW=l9bCmxhcdfCLvFq94&?mtknYDEwneZgx%GVD6%{X3*ma^bE zk`>zH{Oz?qmOR1GTA%q_tWg4}Shx6rT(Zc<;vql_dkt*S76FyvqaIBek{?54s}5?H zmuKtpx(ES{N7AQUaOx%lcB`e8yz{8YmySLS)kXy?od>Ndzab9acGonveccVOe$tzq+)53l)5Ts->yZoJ8Z|Z zl?68&}ER^ehx7%AL$@$#4khcqv10Yp6aui>T;W%nQn<+Zg7*V-s^7c+MIAU za3xz;;$Ng$$FI-VJ6(@!uR<%%TS6cd9fqk%OsG>xy<*A!>QU+ePqgWc57L4W!SfZ%ON>8Pb74fq$Q}ZWx*|Z8@yR z5e=IV(LpzvZh@Xs5NaYx$3nvLwtw_`k|~qed!Go~2j=h*A&;rvh&w0MD0uIb-k%WT zZ33#?5D$LM8DX>49PR zBBjh4gp21U-dPA+N`4kL$cUqkQfJ)U=RbW{EGAv9_scOMzmgQmzxb}Pp@XEZmGOU@ z?ziNdZ}~TtQ9Wk-bnrrp!z$3WIsDTdlPb~V1ve*^<`}!^1g1AblJ$*Gmxai!q*|N3 z+iNXc)#IH>A{7(KIdJ{YOS%pqIDAmQ)yWdi@^&$Foc1$vuLu=)a-{Lqpc#RQjk0#~ z-QCqI8pHNaM~zmgm?zcOF)NYw4ajvB;>kf<9_BD};8HTL z!g(w~>6L`cEBiKSm-YWlUu|vxDm0b9}WizEl6V;+t>vHyNsG)~l@WUQWIrV9HdO7`BRSo=X88 zrZrMB+2Em4p`Ntie-ce4A|xRQ6Bxm7Hl2-Jj;b>*DiMb0p2t0Hiu2T=3L{1o>>1tP zj#4R_^BNYlgY7_I7xT>nSpjHLtZ-?3cpZ z^HNjp^Fk<43_supzh#C1jWur7$G1`n+Vv)c=UG-V9gRhoA7GtgwWQR#{s7I99;8&S zb}UhqD{P0i8XU<*2?EGlhVvSCEWH^KRJNVrToR+u*61>`E!Hu{64Y4VwvEEIfKIFB zXxl*!^$#B!TrE{BJUlKfW@&lb8LNX8FxP|TLLarW(FBXr)cm-Ae%lRDYPy_T0%Zf8 z(PfeE1?jWqDPzmFBwg`Z^rh8h80)4=P5!SjPQiV+As8hA5ML2K2W%KXE$_8hI zK4Ui|mLRY6XS{@}38+$A60!o9)#8Pl&~C4u3bawHv|^Iqv8zSEE!*7Cz8PoR3}yWl z9ma!T_@~NC%s(47hTPhrpD4CJ(W)P&d702Eh>MNOa5`0B13rZ&jzp&+D0NkQiSz;0 z*L>93zyt!bI1PKGFF4BxuSuy=v%?Y1SM7%y-gzRX-H|?EJED(M{}n))vea2_un1{1 zaUR1G_T<(nT)0*0em^9CDl)&7B7``)m%w(Q*rE}-8y zs7J2s!aYigkMM6%rR5aea*zS-bwn=8RyD}cVF)XNV$RPn&E=@s7D>trs|B*ZTV{at z3HxDQDWzi4XJ5b+2m3_$GdD7vBd~MjLAH!5Sw+9QJGwqu4Mp zMZ`BM%?-y`9BVXTdStYSF*%~1+U*|AKVN-ae`}BEwG#qcI?oLWdsPc4OL7Ye*L$N= z@}n!&QHKiYr&%28QxYod-@|I7i!p1((_))V{izeV9)aZGbE7@`*zQH_nmI^2vVc~9 z<%`E*hzxcs?6ch|9*zr4iKzkvTo}2$x9$%2u2gqD0V=G}?>kon?vMZ>#in3*!+gJJcsZz_$ zLF)a$!*ezmV8`>x9+>Xc2$U=F+T3JD&lAnf*oi63VRVk5qCpE4SM2kQS}VHM(Ui4N zT0-*V=8~m?*mYMNXMPY(ab&TbMbQV@a$v%?-5*S`j-}t;>hd(KRh!E7YB@LBeYTx1 zUs)Kp=gzv1W%3wD1Tsc9)Ca8_#kqME^f|(6+r1zC`i<&R7h{vx;~J4HoRqck`AmIM z>lNJUe8R|`SIHk?0BaPr^oGw&z-UWX8#J4HE%quoxa;clbKl7yzb!Dz+4NQMx)<1s zYmMA#)t_TSjJy;*C=CLS$`6WG5zH;F4et8cWg16dhln!b=%)8VQz9jIpCHj%=LzAr zocy@lQoN=e59c0od=#P%KX0WJF8guC1VVPzqX1UE209D>qepsHhfzi2^l3tQn`p#M zS99~eh!cP5T`;hxM)9V@(7)Z<1$B&nX&x@sNJ?3 zov6SZD4AtmKf#Hg8ieho{+b!Oru{HInq*ls7qaUu>2DJ2slJ1@kDkCph&OgtA zrlG@t-961u#dzlsX9hRuYY5(fK4$c%&l(k3-s$0P?b@U>Sc}}2-L=@CI#1`aDO=(h zW!G`1D+)eQM!A$9{f;RLHeY;IdYLr#EGfD}--f3O;B0H!L#y5fTnVJl}1e$uNnt&Ex+%UP8L5 zPHAhd*8i&9J_n;DF|D`)=_gXb(iN7n|7n;ViT`U(>;v$h*%01OQpxcyclwtK?OnjoGZ9kk5XhGXMNIJO#F1r(aF;K&-C|`~UWF ztiLW${GT@1_xx|Zwck{zxm&NcqI_}yKj5%Ji0<{*WWWMn9EczgVq6eN*{3;l%OV3( zO*blwDT zQ^)gZibx|)ZXyktT4&1JUpu0fv&UQA#wU#j;vEerw)96i<=5<%3nL~7%{9?mDWb%| zEtLuJa#%PW4dLXHT0+t!T@lnw3AFN~j#>y)q>X4CClz>v(ny%8?5}AItIyC|O5Rki z2I?Mv_xshGJaXYgz{yIh)+-t z!S2MM7?p53{sRFW!!}k4uxaW&!9P62FG`XF7uut%2V+r(72T5z942ayd#su|pvp_Y zjEV%T%bs-Gqw*X8fjxDkTqO#Bz9mvl(@z%X9-U@@T|ejp5cen&g?cN*%(#NqHvRRE z&Ned64Hr^3Q{i(E@@`Si4V|~P@cc*?C(1itJC5V6i^Dz6!D=-S@bY|SC+@{Jy-eP7 zkP7$BFRq0)=+9XbZ9W z-$_c`#yh_?_Y{S)`9@t%=y6Cltz2h+M&*cXn59*XtC{W+%EbNBssvaZD$!A-1BbA= z^+rcQXxW295LC+Y*a}d0-86R4^7a*kE>}vW&2`~ljOFF5F2qw-{1Cr91}jwN3<1yj zY^uUXTk1;7-X}^XJ92BKLoEh{uPVaGSDEY0*$#s1CQfYQ904Zyp@|iPeN4^A2rq>d zWHqM-#wSmAUQIG-j_F?R4bOZcIp}!4Wl$dMrVF6$GlC3XqRPg_4!S3~ zlvl?DV_~{v(82}bqs{71-SeCBbkP=vhf3B&5#Q%W3M$=f@|GsBrb}ZHXHe)Myl^6L zNwF+@S<^_e5!eOLuk)q81KfCl1k}t`OzOXIcT*Nnz2WBo=uN8aS<5-L>&?U}n$u^A zi3LJ_19v#N@{4~y&eexlrCJXRUw9VS@NR4E0nHTcSFl$ei^jv(iDv2rL}%Ost$y$j zP%@SFq?4EB%$lsSw&L+_r48U;UDf`y@w&YoWS~UrnIAk&>s~S2 zKW0PJ&RBcHZVk=5pND`C|AP}GmJQ&m`I5RTfO5 zLirIVOBLwd;I2Hl69!I2{}*W^_6=FmtXx(%!YQ5txNhBWtPAl;==_;S!?SyOQsX8xo`PQ>Jx|gQQYmgs27J7$7VO!ku&x&n0 zh$)mQ?jW3Cy6UFLRdEB|DUxj_znNHH0`G)mG#tu&w3SRW%LkN&MIv-^K0S-h?1w2y z&p%#O18bQb+CXyjX|lD57IZKht6@qzsUCCWkK<D+b4Zus&rO)V&r@6+-nPFC15W--W zF7O7G9nE4mFdU1@t3X8tA3W;q80VN)*D*8r%Yh?r8#L39md#%PCR`wzRDF$dlG@#4 zBdk~t7VC7_@Bc2&ra`+y1x*yI&>d04N!5V*ao1&-4CCr6>viKBw5Er47#B&=fDOC< zNs5G85RHrQkMPL|>?AaBhtftqdRs1kHttZ^zhyn9@bfLk6JeI!V>%VpdzFIGPJ?xP z&>JnqA+wxS*9Td$+p9S8?Bk3h3dm@OTFcan9ulN&o6g4yYx-&LEZA`U2D9C)CGHh{ zKW;izN>?=*?DYOjrw#pqHy2vail95*J#)PfNr)qXtHsvVvnbFbPL0g{Yof#eVtXpe z5JQea_ykiAmuOcU96q7qnuy+*4J=Eftx~Xq`-cIhckfc!&7X2~spM!IxnGD5(t!mX zdVraXStN;)T6~9gp#wbRw>JQIVGgDP2M}Qp9)96&OIaz8hJGk<^*&OFx52Dc@jF6W z^7@%b3<3sBlL{zH&WGuR{UOw`fOJe$w3jt65t3Q(G*w}S)Agps?8_>*ng2G&blg?CWGy2hUg zBCo+C856w3R9x8IenO{~OZu{C_vwQhWeI_9H`Jaoj1d(lxGpF6q2H58j|{YSsy!j0 zMSFidHb|FJxFcPuOqg?8PwBG@c8$9`%@Fy(Qd|lFToe;vSue=s^bA#RvrpzUNHAju z&uZM6^|Y+~uv6H*Hi44oaC8$g-YE@$TmCfRYxE6ov6(UN*9s}dqktJDYWnN}cr4lD zdKPjMn}CE4-0SE?Ui4E>w+$FGDa(q>Y%Gj`!{1EHCS{@=IDfioC=_vyNof;51GD8dPzv>xB8okuWtQU zcjUji^>vK0OTkneLYrn-q;{@L+VXv-kNDs~>X^%BgmOeBgd4e^odWW;R!%2c7Pxw; zoc2R03=H|k-r3;Hj+#@}S0=|>nN+-t5}&p?_-7V-Mj zd$7IUJXSLvfhyUkHa4a);bKWaE>1=B?Hh%qf|)=MK|Q2dg_AQkj9865LpJRdSL&Eq z7#Ew$FjP*&hJ4^56Mp4tC{NU=;N)=_6UiOYzmFL9snFG2auAkDSIKhcYQFpuU}w*` zW%#|DBFe;l+B2nKqzlj~Sb1%B597%N@DRac#|(se$el}at0)5DHh^WkrN#{^VD0L3 z|GeYnYWse_gBjSSju z^>527w92{e71BADn8;z<2LvSiCLJ94F?qzFV+v)I2FO+&@9`wSqKC5xeVUcFm4=bD zZ@PQI{OABu2M~qou4H3}v<)$&1waGXCB4EWR+!L$U6+#CRT;V9V#zxmX=e}Ad1upb-Tor#R0uHXZCTrbM-YsWFJTwD@TgjILU$5Yr znKVOzj^fB$Li)pmh3K0jhV0zHx3Fpv>C)y#R#9K+_FwcGK8p0XN|nzMv_y8Ij?yTJ zWpFiwDG)4R>P1*%PAQu*%2;M+yk>r?Hv2obaHdW5SruHvxL{Y1LDH*RGiuzKvvsP7 zqCZ46@{pc^^GmZW<*H*p2?HOZxne=Z$O#S7p`P5E_iq@(n@Wz5w*39DNil8YXdX((rj)GqcQT5OOPT2?1eUXSxXt|VYOx( zQDmrSpt^W z!d_>KWybau1!iT`R`m2~_cd)!5%IG1{u1E@7uDQ0^2V7n5URA}W|8@gZL5yiM()?z z4D%h!6pqzPQFgu0(T}+;D*bi&3(|S4NasHKBT=>uy?^rGDAv5n!%9vRJd)c2Yf zy@58Y9^w2}Vbrd6m2!ZQbxQR=c(WNs3k$m|p%H-hFbTGyf6bK#dP#)iEo}93lpd`# zEF{w2uVPe4ftl`%zdH#H5cutt? zX8i8XIh3cCctJGl<9&z_&+|ypgCTF)&;v0@tUW++p{`h7h!W$ta#pDXrImci6l{nh zmNRltZ@-UTan7_FI&2N(I+tEkuo=Sz&@m0;vrN?ketjsn$TV2V4Qp6Ev(9-NsK-K= zuF^?40!0`}1W=8$2oR*+3`-1;Re5u`jfOze+m?A}km<|0G%95Ql^2T*Gb#;+`9?}x z1{`^8NWTd(>7t6%757N(_n#m*5#c|>lrir|QL{P4q2)iqBK7u#O7IQ=y|&2S$xlBK zA4%Q?9V(o=>ErPkm?H?@f&b}@qJw+r!e73o{Wbn=r)=$HXy;^V==|T__^tWoTmMa+ znDpqdj5Ou&*rWm})kuv}t&Ak7twlnZJknz%JQO; zVi3cV(&KeX;u2$I(n__!|KmPAUg1TIlP~WDhxzxOzpbO8ovGn}cE8_}Z@%T<6ewF- zuQJ1boB_SVu|TZm|E-CO60krMn$=ye1<$&+YO^+lcuYG z-U=4kShaVCV;faY#e%2T*NeS1)X*H|@5S!qq|)w6H7pAxQ|22d=Z;DyUkP0lmO=h4 zL*A%hS4J@O9NO@=o3oXbhbKyQ(yX?f+*~Jx%#bSz(rU`C=a$0Gt{*x~y9+bL)6Yqt zana6_Sa~1Tkj|1>^0Y#c4R=b@oY5W+MD1>tA!AZm%yzc)1+P%N5!vLG^efbv0>SJG zhWa*47Eg?4e%QBuZ4SGq>2wQ6y*O88Dyc=+Gg^Ggr&k@-N8{u_Clf&#(d! z)NCRA8c2Iy28nl^a0a}L{fP?$|6l^4rqfykz3DzbiCj!IbS_5+`W{p;WtgG6af~Kk zjcF3pm4w1fH8_KUWSLBlDv8cqr4)c{))@$;F^2F;alGTC;N5d{VpP#(w6;hy&aUqAF8=>j2;P%2GTJuFfl{ogS zjs4k^GNO*5cJ=b+jiyBko~EtO+N|Fon?A6|F1A4&Uy*gg^kj_-L=qH601DEd+nbex z!%xNzrezP6RF2!OS_`Uqf2l8UYq_sY@I#dyvpTKOmJyAU0btSyFd4MBOjsx5)n0dh zhISe++KO@N7Zc;w<_d_VRzT!uVm5D+5`RoV#wo|Dk*F{j8(mynt(MG)lk^C4KVK*m zMS~6AzDY(*lphOg%JC9lW_u0TbEGlVbQSI|UcV42F+a}q&@JW$;I@WyY=g>7Kx$_y zi)53KE*XswZ$T$js2~D*nTPK9-2k%ZqALF3M&JDn6}RYns06{A!%#)`DO*@a=JL}s z&r9{*&gUen(n#k8bfZ8gO65u@Xc#5~psFNS#hO}X3BV&pcg+zTPxF$o6fPmMF`GFx zE1q~`_T|(nC;a5iJI!ns@bW6o)| z@pm0YoI&s23?xu?*%f|vi|!qO{Ax!$b+I#(@h2XJ@<)L=O}}%uSbCYaBmIFOI-mLg zJuuT(aCV9J{wBHA|Otmv`XQ$;TeX`mUS6GQe{-+w^1zo^drau1;jfkcr{&x$tGqlikFf{mYhyRv*^DY0zQb8_kl@{7dI_Hy* zl~&#=A55R7Eq}0i(H%YSvez-bZ!APhqq8CW{c%`qwsH{K7F+G*PAp5lgqgGo=X`-; zYd=2;INYvVU39Y_Pz17IP+yFdl>h>SacRT^+zdZ+p-i$#)~Bb&=M$_O^a?zxT6Ys# zCRK;`#8M&b&Ne_wc7WV;1Rl;^3N#0FAOxK>g)}8orwxWsz}u0SE8BPy*0gGV5)Dg) zoSB6-3Zg?dYS5s)h;=BgsSD`0SEf}F>1i`O&1Az+M*c^Th%r}yrjJo=gQ`uO(wnr9 z6izY>tzE^V*qZs--IG#GBY{PskA;!t9-x#bL^@6F&&{j;$iD3>;*LZxKZ%J!_?zmF3l1g=ccOVm)0bGkcvJQz>nT(Ud$aKY72iYxAt?%_Yr(rKe>{l)(g^ zBlrXgTB<3q)e`!P88Cn?_+9^4hT72i@|GMq_ zTlUTO65mv)np>|5qrRU3Ji|GYSrCCR8?wMro)rfy)aW%uT8fT1{;$W08V7fQHMMdalmJmal0 zb}C;)#TFT0Hs)>Die`3?f3lo4lnu1$m~ z4~Tu`9g>jR_|g&tBe5rREVAK~B`qidIFk~nP(j!Z;}Q0}!hpDZ?4HKV2h#ZCl+Yv( z)jbAN@Q+_4QbuBfAET#rO%CK#&_QW-rh?*V{ftU6#ymF$@o+_ONOx zwgq3F{sSEB>+F&uHY%JA5sW)H>`EDta`I|EjHACk1@tjUom0+BtUT-bT>5s$gz74% zUmcf2E*dQjASraGa`2g=ysn{U{wgl;+}(wNoyUh0zhB+sofR!6%mncz9Pc?|goZ1T z1Z4u1Jcx;E(3q`6@g@ESb_8rx55v>p@bT~-mj)eYN;*!&AR{NTFLi z^+qK1#GnZNwCc#pdV&6>-Sfyg9WMh+)kMBP~Z zCPbb?k7IvJ(a%v)*o$zz1aYjl=cnmi5sk2!2Z{ZllR#S?tEF~iZg|9NRh6(Q!MdJk=*inHQl}#(6 zD#__j`D1`2B$%G{NQ~}MQaeX$MET}X!K#AVc%1IweE+G|rp z4KE^Es?tLEi!$&ee34dZ11PY$#y3|+Q2YGOEUEqXdr7LG7EOYZ%MJE$=c*lmEk-5K zDN$t$?a|Jd8#IU{lEqk=&2YvbXR9WsR6(TkBVPDC6T>7M|2QS&6@YpCxbT5f=*y9? z7ir_fZf;~#qux3c$l!SHcWlLnjg&h+D^+ZbsV_F9u+2HknV`=sWbkn)StQub!0xwI zU-HkV^IBu{LZnGn9rluS^Da^(^O>9hDyjhFFwAZ7zpxee@t(5;*$l23$*WHu?!A7B ze2YKYO`lVu5!Fnrwd+%UT%~bs+G?DGE7!<_$Otmka_WI?h$$J{IG8gru>prMu}_5LSaibK|mtNwx4)Yg=Gxx_N+{m>4_Ic74Ln6FzU zy?z#Vy%$E*`(X}qice?K)fmZHG`qmQk!hQ|tTZcX?`kb4%~~#i?p3YRv2ciTZlmeG z2|(rAZ>iC$Mm?vH$(+@cGyCe}(}BBN6!j?rvv==iB zV9`F{?5VVrN4RK3uFIt~y4XO5uNg1_%IsvYyao2c)-woS#`ml&$oq$SkCKOOQY!F5 z-5FCnUx)gVcTw*Oye0-e6s@RN(eJj)+d?O)N$yF-xw6D)QZork*=STycVuGQ`cXD? zQ7FnFl%8}?{@H@wE{QpfR}0Dx_x)_Bu@MBqI)!zH&YPY88xumq(XPh5*)Idp*we3E z&RL_aKz>+5GU~PR90+zY@%QGLZf^?Br>+v%0O_*?@PO(X@+K;0p3B>mnzMt%Mayz~ z8Z}2Yz24=h#`vVMg+(vC+mT?399@;;kc3r^|tQT*=skA!fUa%P;v*s{giv% zgHO`u!V*L>Pm00(xlCe3MV1Fubx?(dvVCyZg_1x!W)Wky@%&sE&(OzmZjH$~(oadQ zT=n-%*t#3|oWzG{?xx_($PA{L(#O%UCh+NKXo}j2!++AW1sj5T}<4jJsYteQuv|f z??_HSj;-EkCV-+|otr*CjHg#&7OH_TmD$A5X*HrOEQ~Q$8l$++nd#G$+VrcN>c(Vb zrW@oRps2}(V4^qi&xe%@N(4$!a1(-CWMieyps`h|KR+d|}yhAm0 zaYO2lo5;8VrKkkag^L;63^C(7+q;7f4qnlJH2_fgzZwAYu@PW}x>D@FHRe{K*1~_* zsWQc?rHjh#_SwvD`Ij{|BB}ha^AdJbtTWdoiuD*lsT5V5Bl4II)uxDZ6+6WLQ93*c zfioWEO#jF#T7ao)s)R5X6q_nmF0!i&sw@}5K#Q8ze}^onwWa@8l~omtOOb$IK4I@A zdONMy?erIn&{7rPU23Gbj^Oz8B0wiwMYizMj);<66C&}RjS=PSLMSAOClo`K%m`EE z_S~W^?N(`HuGMtV_1=dZ;BaNOJUI0k*hC31U-AnYlqyFv)CjHzGjIP-%SF5gSf;>PYiWcb!`GNg5>2Q`j&feOJ}79oWoc% z%h|vdL98I*q|V5eH@;lPO})R9b_NEn(rOb?$N25;(lWsEsCbr*lDCg-{7DEzJo(N- zNsF-AF1$SKZw@_&rAwf={?&*zZ69G8PePWv&$M&XCqLGs#ZHeiqa)`!9Ok~xyj{Wn zc%(V7k-u!6*cHhP-M`AMu$${5)1rGl8@h)QlXL2?MUqOYwAOApaa5H7O-3g2)HIRX zKp3ief}wgkYZh=VnsZ2uZloyCyLUVcrZB}6uG}yjCL^Jwog$pRo1cfMH5;O>Xwl#IA|K~+Sb<)10y;T7V49V8NPy)E> z&J+7h>J8nlj?{AecmvcW;5wEj;p$w^ti2(uVaL>%#H6I?4RD}8NOt+`gNR*5%u4X^*9(>+I;Wd z|I-5f7Jc)*z&91D>v5}$@ZQV}Z*XD2TworH{$=z*1$A?*32Dic{ zHU8?9`-G^iCP}r8M)~_@^~hKi3&eq%6G9ql$$f{$#@B;O<(kY1)wPo%l4Ha-hH8F8 z79}TQnxbJV$n@UApfS&T5L_ z>wLE1U32wor`K7UqI5X}1;TX6E_%qo9W|6lcco2K@h2}U<{qo|*xAT#85Jxo6&NY{ zoAY-nMTKVb6A)cnf3?n$QDmQy zpzUT}|38hKWmr_(`>+vd5R{e~>Fyr7LqfW{YZw|)KoEwKmTpBrkQhmk?rv11ySoG= z5zci?Ymk)aFj3o-4u-fm*v$MKvCk3q<`qir%C!YJ6W_+cLpboUoRHxXo{H zUbU>*B^DKpNvahM0;!0hTVG@

Si;bm&bFeJB6zQ@(D8tU$jvp?HiOF-w-u;8z-a zvnSTE86));aL2?Wv>fYVHmG1pGY*;2pu^F-sha%>Qn-Y)ga;7q^t6YIyxH(?lPnv) z1`Sf#C+BwePiEq9ny`s0)C@h2biuJ{MH=T=yW5VYSPg9J(2EwNi@1xph*07t)6kZH zXdu;`t+;!NRVJ0CDjkL{duT+pmwDDg3odK5B3)F%ICI5P=$JlF1!f_B5PxHsl9txE zWrJ7|1&qn{WN3Jf76G&>A}1~#?_rSmka!m;G_S{19F^#glE>_X?dJo6!TIc<$E&^4 zssfbPMq^|(;+Sr!8%@;MAaBe-S#WL8UIsaF_{^8=mXf6{h3DaxVhunQxEwGm zr;!LwaPAl$pgiRD6WZ$PkhMaT-0d z57G*CoBiXWZ>BZ?UeQzsb+V=qcbHgZB~ON4h*yG$Ls;}kdQFwS%AUk8Inj8#EeaJz zSY2zzXQ;BU5#=_}!x`R@d&@?lQbic6R4;GSL!fueJo+s^wIH-8?}LSt*P_)Y!mmG^ zmhiK|1o6qgW@xd9q0+-lKT^L^P|&qGM94VQDJpVdmUDjM^C(PABq=;Mj(H?jj^q)< zFX!{j%VF+|!PpMczU1NSR^GQ$8;8LD#F9C`7Y>!rMgf%%9H#n#6BU-(VO5@=Vjz*~ zJnagzS+rpOJW}2E^$mH*@)#{dF)?__9>^fkOEQXev4i$xEr1~<#qrl58Q5D&1vu#W z&~8NurH>*TW>7Fb{Oov~X1ryXSzus4$>xET+3FTM;}4KQ9KRk*%lkS{CruZ*)o-P3 zcV_j!rzdV>ff@mdVZx(lF4TQ$oBZh<)Gqa~yGMatW)Ay;91ftB=}n&;#wYY-JVGQ6 z=rm)dm^F-R6WKJLF4lo~tMyE^5bMn7&=OxW8u9uEx z4ndT%+0NDP&Gdrps|*(;Fgb)5jqcPuMKY`+N%??uu1wr^T<37&bu7Fxd$N5_*>kuR z@z}ZI*!Z>JtCYblf|b3~DTWHjvS2}F(sC@vrhjFjbC#$7+U6&D_4f~+O&vOZ=51P! zg^5!1bbqPTo~elt^m@t@r)hJNnVB7XM=iV8+mE2N28!lxebhD(VZbBEU5SoK!YNHz zqO`dAKFF#M$6yW98Xa9)PFQRBZr60i3z{b#WSZz@)PVaQD4R2aF9%h*Lz%~9LVa+s ziI>t*rc@@$@W9 zS>06`%vDv3ZjsfsixdiAOy)(_nx{uwV5nf*4B)I_o!owowXe!`G5zg#;E7da#j;~; zDiXUY$Fp>$K7DcTJ0d%*?~#E-qvSb97upm%u4>$4>a6u#?l($4OpSxU?3 z&*l&wk6}wPBiL!0X-+6_ZQ)iw^8I9ZkltDj*Dp+BYe>~w^%0_-sH|&qGWrXK^y6OmJ;&lIyhoc{dAu_+5yhM(ERnn(3w{qwg{DHkgzb7QmL?+lkAm+dnA zvZZS1UL2d^dL6txLym)oM~z%S@X%d{ONGKcjDjUk7>g+5;<~Qqq)P;5MiEK=I_V{& z(pE^J8kTELSvyQcUsNM&h9la(EbZpsS9rU-NAUI4J9;p6CWEWs9N59CC}1`vv~M6hqo*ALVx4>K zQ-ze@Ro#be{`$L}Um4aYu9b0v4#s|>8@tzj_ln#$`!td2Ig>n{lm7sg&%EEHuWp=z zX!p_9tU=*I*d1l9UhJ<5G*EaWwn?!i;gM4ocKcZ|IA`b2mQ#_#WjQTG^f?oVv)?U3 zn4%tkYasavip2aG{ZO$9r25XlQhh5%a1RU5hJ(kjY|Y#2uCnPg6qO_YyOR+?v^R+; zEnZCg5~ohn%lV^PO@bl*aO&vEg-CI*{zsSYfFe~aJ7z{UW^kaNw=pWXNS<0!6*8+o zFBmF%5Z8#GNxE}n7Mu?-Ngt2KR=@*W+*xC&7-#!C#&uU zJRpmcJH+?pndl!wk#Kk(GiAvvyw{Gy+m4w+r?B^vdE>SA9$rXd+mQS>v3$;CV>noz!%?|v7GKh9#(_jS&-mazfbypgadb>s!Y zkZ6dpgipA|GFo=iId6eP&@Y~Lv_*qE#=5btK2)k<2<ViUe0Ts zrv{sKBjz~|Lg)To2Hn~$9;FR0;Fj?f%+uEfrQ>?5&;s*$Y4J*gw1|)pA69fLVsPYB z9Tc}2_*OE;#O`!3Dc)uvnRl8Y+otIZg z=)n8?X(Bf`Z=30Z2%7Sh>fw){RuFo{`EX6y|?KlnNPhdWM)X9W7AJTdq{QTz6cN1i|Y8M zi%R*wnT1@eA?8lM=dR0$%XS%k*Wt^%@&Q4CE(-3Qs ztqn@(OpemL$oQCgB72ZIZy+7Ha}VsNEuk47AO9d%TQV+I5|NS1KObMY_a0I2^MgcB zPm2J_t*NkX=P(P?(jkY7j1O~vOE&!>`L!CghiFzXuB3{vQ|YQfqo$#GHYO=hXgeYLT8_hIz&2nko1*8wU7F zca*nz;i?!?_>@Z#Sd}~WW(%@w+n~~chiSFRJp!MxKd2_6aYT?ZnUZ*W?;`<$CZSR5 z8vzKq$to?WjT|4DGh=h)%$UXxyCE`{#c-Q^46PbmX~I5x7f z0vCO=k?MQy^$(NI^WJ&?S})*LER!}pVE$L4;ARirHq>9|-U`}LiF2lS{;N#mf|_S0 z9iPk9cP&YSkuimw%6W(rt*n}{bYIm;FK+qCp|;6Yns+*S$^KfQ(=7gAe73%~))M0J zlA&^SP=aXXE19*a7ID~f1Uexu?Bzv zkktO8qI7^oM9L_V@;hY!V_{jhUfEIr@mLWlKo!)AQ$F{&DuG~Ux;7lLuqY);?~tql z@hi$dK>ZZj!cmWE-l8m|+iFlBN1mp*(`_&d-&S;ycx4R>S)DO!e>M@$D6@X=E{2lBzgOnl(NsI>y(x!-yFtEM9g^NFSqhiGx zs9@O(o&wZV|oeJD}61!e-{#^vq=DA-65z@eY3*ywMnWY9Dk;;XYCLN)HlDJMi ztq<*;_Pkx|P^W&o4Vy{_obGKJj2}srclGU{%w@)pxH|2vY;8}bX$`)XX^pv#BsL1a zv05!f*4NNiva=wu(6GBd${IWzD~t(z`h~l2fh)*Yde?#?OPhE|VtRKs2nc2N!13A~ zgDJMY;oHp8qKA>&mpX$uOE=0>GWx@8>*x^9grVVi>lCN33FB~*hrib5Ou-50J^XVG zF<1qoTadS52HQi0mMLA9^V-YE!6B7nd?*9cM#Rf>SUqgqT|af0>TDO%cI%^Nkn(3@ z9jE+P2^Ngcbln?;TCf-s(B^bS~K zA^hh#%OSFdnH}G(Hy@W~a{Fc&Y0k~}%;jB^73GV`mKOW}<2}>f-qytUx1;GY5A4aK!wglZpVl{Pd|M?4Pl_;tf zjj=%29&!2CZ6`Y~+@zfzQt_!&v(7{ahoa?LA@TMM2P>5^al`>$z=i{zn~KGhnoyb< z)3aC$$<2Ipg;ZKrq*y0{>d`Q_HiGA54F}Os9xD5g_^U}})W0!fDo;vzT_uYi?lUe` zTu8Ai-GS?t!Jo!vj?6+ru0hD`e6o{duClT2luH=K^%HEL`Ih>u3i82xR*tFkD{Ah& znP;~jiaD*J#SJofoMHWTT)vmP9)b)1B@S{ zwi8>K*>p}ld&ow}Z?Vqt+1C%Phxrby!U)e%yy&@F;Cgu5wl4$zL-}ugbS_6&$TO#V zZ>i0RMO%Ut|$!H86|4&TC{51J4zTI zc>u6ENyOLw}Cx)XZJ>GuxVr1_niLi=Dd*$)3%cSjWbLA049 zET^g5P}Pf@kl@|;E=``-CxaJWO5z?&JdW?BO?e)IxbOw&3Y&7|?-oyO%34Ue&~J$@ znjrf}1&O?W@hUL}JY0T^qMKy!fFf&HiA(M?tCp5=WRiSgLUJa(t#l8kR zmYTd*`)O2WV60-;*h1!?l*k{l-8?f+Pc1*rHS~i^lW3>7iK{F_v-?zs9^sv-346=r zxt&7&ue9i=gHL<=6rzSz*d7_Rv!7AfX2m+AX*Z7OSWd{gR(z#dAOg`$DrCI&3F}Ci7FD4kjR+2^4d=*#wq(sA%%=jn#64| zJaI*8mfz0jMaY#&q--Bv)duI*f3c@x6mBc{I$v7;oa&K%0ZB2ZgL&C#)seO|Opnz7M1h#E&E*X8Md+(=71pgx^h z^=kEEnXYF**Y{T&e9Xb;M>=Ab8$(KIC#U4?r3kD_5NgT^dszYbyoQAJQU=ex$vC71 zQ!~RrG`w;FIs02#-ji^_0v7yO7yYW5jJjk6NbKfnVGc(gc-(6&bjNVcGb04i)090t zEkF7(YwmllaF}}4r`d7+_uPH9a8GotjarSng@@ch)NdfMjOg&PI#OqW_UR{SY6Mv7 z!J8VQODlLTvaO28dPgkvyT?#RC1ILyQ?+C1PW!r535G^6!7r*)JA23^MVdX^Mmf=` zDQn@D$cdETcx6o_)`>@l+ZsA4S>kC>gaC+l!$`N(xti~nZr?g^glw}yTqO5n>pqhl z?iado=XLK*zLXLV<$=!j+z5D;xf&Vk@-iO-|y}bG@w!RwnUwZIAVKf()zrCqf zZgw;3QWySDyS&+xi_70p|6yCb?f#Vif-dT`H$(&fLi*R+dK;1S8nNRq#DC=Ce;(`2 zkzVS>|7n-~L%ztGyltfala2oi`!C)2zp#t*YafXV*zeEiihTUf;Qq^{eUYWU@7u6uE>h669okZv2zzfb#`CHE%&x-|AG-ryoD@HYG(h3rk{bzkIFW;w>~ z%>S@Q-h^Mb>Rp9zUQ~wN*5S+V%5TTsP3(1r+*PdBgWIv!g>pB!*A+=ux&0SMfwy({ ziZJOW^txNx#Yp3xyvDY`~ zuVPQ+{(}9pU4IjLedFvZ^s~}mpue}#ZZfa0@UAjVHU7f{=-9UHbkMP_j_r!sVaK*@+a24sZ9BQ0@BZif_k82t@0~SvRgJNq zxyBxA&zftkXP3MbC>RXT7hcM|760qY|Mv#{_ftkxS%^+TR*XUZ|G5n6?=m|pCsT79 z$Nym!?*F;U*ulis!CK$O&{)Vu-^$J1*x`R*lKume-r3R6*2wsOh(P!c5eyywrzC1|2qFSHqh7FF9b$+ z*z_{O1-S5m=Wx~T3$WfNE*ZiC%w0qa@fvDLe>nK=9n(-yF{7tIp$uNSdSZx0U=qIy z6U4L8pA4j;=&kJ293rJ}Iq+o;XUG@U<$FX{}Q zbgtDcmfE_$E8fX;r+I5B81$uA-+{iHz0-z^EMetLV%){UVdksRZyY^xrJwI?TgUun z+|o}GT&4OW0sVWho^NcV7^&m;LNAjT#tLtiGB16w^a@uOSdl@`p}Q#Kqn*jlMLRHC zC42TfB6%sy)*Uldodmk5Ae6#WS%$bN)wL^LovX7Yb`BdEM|(Z~^6qyTRg=~7?RZYx zE`52lD@!WGh=!TY5Vi z)2|GFo&3Vr!Y`b{T{#}^$L<*X{JC|1X9o>3BO`b=+zm#0`o??-LN%~M=t2?XbZDdt z!bN)=*%=83hx6Li?oDPm3(+>yd87!21?fMalmW@p$hcOr(+T1kjb*qa7#j2k9 zo4yS{!y%)^cioDj&b>#dSEsUw*A_QAgQBN|ij*|oNBW}CeskXoMD|SemSXIrM2`FO zZD3Sf0~=CWH97#duqi{=^x1pic%a?=W0ah^?ne0VbEpfqj##{a@A2`r>D0$Iqhd^R zlE$iaZ(`u};=n2Kwzukcf4qhs`;lh#)rEh3u1EQb+GwUaM(1>^t{vM}_nolY#(r(N zd)@P673Y}F6Zu%>@z&mxX`AhO2fGU!;-bVLLCEv@WFafp?ZYWpLm0#uVyBnTA0L~_ z`ukMclI94W2JjS~PTBUkJd^fT>t3dQ<+%2%VT&6bgo!#E5pjZc78+N?s;8O8KL_h2 zl@RdYhzt_zT@9g=lqQjGU5EC!G7oU4v#4w2m+kGedquSglO3K6sFT#Y;g{!`))Y;a zpHtN<_qyhJCMWL5v)|e_+r<;I(s>r{3G27)u6M*YM(GfYRTvE4?2T{o{ku9huYNSC zD`R?XO@VDjrh+Ptnwn3r$5;u(*jY5OKW@@Yo~DD7RWZ_T)n6_%ntletQeYW^_`p;e z%K6l;Ja+Rx(g|dyoBC*V35j}p?Y0IN$|$`@5^QZ*^HO3x-JWM;ae?TuCqS2;X6iaa z7^S-`G3YMF`yL>ws&vb^1-a1Vch+%XPI9w|Q&UwEUcxRO?39!Y6rrD?XFO*$Qejod zYd;oC*MIiA$0bX_1y9H{8kd&Yr}47HKl{GFf_#GN`J5ShAZs*jFOGPWVLzvM`2Z%{ zK1`1Lo>-6}K}~g}H4>jmK7|H%<^u&bs)}uRKL-4*AMnch#om%oEZkW@vF-ExE%Q4& zKD=3vcRM|jK5ssz;<(N?8`N?*%Y=+JUrviy_N@*)^yuaJU4Bd~?btXTAWZXkL-Y%b zmGN`FlskM(yGIcsv(fCWB7ROZM8$|Afv94%Hf$u^Td$M_r2U?mv(0q$T_o* zLnSG3B;Tw(Tx_fNyB8?UAWE0rwx8|mkx$;4@E2{fyjtmbycS$lPI9Xv!6KL))^ShR~3rWlJYuqV3TWN@E;esD1}7{BnQnHP9Lv?o;UqwcwCu@qs*ut+4& zx6*9_23x@md}KQ%Z_u>r%l4i`4)lV|F&M@e?$vpVSYx>^T8f+pg6n4GR(W->#!Q;L z2HLJHfhp88zqzw!WvzYqymx=6y(BB2ly%=`r6BG+J9^tJ%imLXSzw+B`}yF0^^tsi zNTrB1Nh7+92zKaEVLO0R+C25Es_UuEPqn`4sfsZISh=_j_PK!i!Cz93} zhtu60CW74p^QIn#m@8svZN;^8Ewh1-sU|-}5(jYbLWCyI!?--Dc`-(Zj{mgE+UU_j zySpjH5dqFYOQ;~)+bPu(VImpzNQn);)L`i|2q3=$p>~vRw`6>&xThl3b=H{4?5u(| z?$b~({sZe3ldkJ)4eH&rt=M+g<>8t-eqvryCHn*98{j>=3Amyt>el^Uz$v6ge0_~> zy{EW6Ts(>3KQlNiBy>;r*Nc_@wie|7kU=3sfVr&=y`hQWSK7W9U-)8wp+d#lc9k9J z;|%B-5z;G#ms4@Q@-=!4w4K&GqA+9|1ML}YYG!yxEQVS_LnZ9v5l>>(J{99PW zP+RaM-{TtB`|}gj8$)_o>#V1a=I=WGc5k*fCm^K-s3*eaH=KQ#dv_qIGA5dHpl@V7 zY%3@YKbbi~2Ahe1=u?pJ>QlACP*m~SzgurBvOGHh-6pP95mDra2LgST14lsIL-YoA zy~Szp-fPS1cJN~%=sz9YB{daQZM>{v*)(rUDvI2YV?nf+sQT!e{2CR`5H`2=N-eZr zCC?p3LZzC~#7Z*~O|TdUVR&W6It74tSn;H}*@ly!2P8nc1 zQU=9}>*F~bu;{d)1!)p&C>Y5TEO5{TTvW$!SrB&o$*qJd?)kjEaEDeiE4GW3$Ta~e z9GAQrE7H4$D-ik#Vc}vSIhK)2e>)SCVmth&AQv*3jBNs_#WDdiTfS1{m=szs23|&$~j*?pwLDbo~H2_|4PeUo9umnbbx&B^gu7rFrwa z1!Fr=)8=>aP>vB!{(|YyaP1$$yyxd69dyY`ul;xc1O0Rc8X-D-3eidzo~tWen#i#e zHHe>t&!&=8R1~wyykssZde_v^z6l!mtVb9{gP9p;T*)VDchhd(Zk{e4^(JNJ_vxXr zW#5%y>+);I-r*HNYa6p{Gb8g4A6{dpbr<=LjUe+0RS=onX*Vx(2`4jHR4J3&SiLpoXBX;O%=qP;B?=evkAw)bl%Dn_lJuvxh{lBj8P zVWl18o*9flK=m37KtX8^JiO_ZnYS1AcZQ|DRN*B;ma}M&F?lNPsujy_M)I6)L0_nO(=^`*i~VEdGF}G~F1qA2%9`PWyZH-%tUhyZF#8mJ z7+ZkK`P1#uZE+CM({Aabx6=0gjOTR;}9s5QT3eqn*n|7PRHs5L{!e_golua*3h3F#ZyIshF1nvnIE z34JlX@WuW@grbb?DkB`9>7NgOLLFRy)2!n;P_M6kumNV!8my*?RbDN+6d>*6Rl)fU znFPleE#PSMlIL@IP>XHnDW`d9GVBHnvluVVAmAhF39onH~!X>JJF#WT^rM&#BQm| z=KXkaZe=4zl$%puB;Z(HTD0pVpR1r1_CC5oWJRtkWA@KzA$Q^J<*vJFXTZsidc4-C zn%aaN1L0B|_dJkfxAZB9cDVwO?_K8}0IZG(r$gL4PV&am%hqMe$h{*3^(;6fezkE+ zQq{RnLv$8@bl%+wXIb%>dx!&VvThgzSj7g~wh-p+HQRQdbt=E- zQ2yY(P*p0{r?IdWB0QGCM5iU(=BxzP{ziKF-vyK~DVW9n_x20^Jt+U7is^sNw~prj zme3dH3t#*%?C#e}$kNEtkI+)q?C$SK%Z`poO;E{5%u`B?(+x?`N;IfYOM*{RxeuGS zNTx2dYqP)n;Qnud4pXMOn)xeDYd9bv+JCwpJ3A|LL;bJP`tNJ{;(g&O#uo}yH@|AD zxAU(LL=LQ_{GOV)L88X6++*Jg4PW|YUB92%`E}9(#Ky6q)@bjWE~I1{4(UJ5Zjr+F z-rp|TNDc|qAn2eHn3%?yD#9#PFxCGo+Kx8a9xRs{q$Ut*goORrHPNiiP}M>eilkA6 zg$+B}d3)m}HfNZ;iT%4yjJ8gDSk%bkJwO|ZoF&|B^MaM$AU<5|w#Tj>DB6#wuQJBnR-S8~f2rZ&Gb6pM1 zh$k3>5?ai%(=qRX_aZ!wg+B2kX~K~dV};o0iK8RClSrtp*I=pS@oYh=$$mj+nBY)xm_+!r!g-csI9C3upko~(!tG>P?E8^z9VM?Wjdep<7Vog)d5_lTB z*cz({gdED2J1Foi=?qO9@Yv%c)ndAHHv(K4!15FPwxxP{TZUD?G5HCuVVE&lGMQ(E zBC)Z1YK5e&H~*>r0WzATO7%=>K6j>{A+`L#FegaaZ#v}du=$-ckmfP_#c$DVrGI-2 zvugCxY&co0PFrOH?XynLCh-Ci%3|#x9#zs|HHw4%A2}r*xdCtwadK-#csVRtU*S?=zlpMx<%Hd7@Dt1kSG07EI2m?@{M*X zeMMLqK+3_Yy)GiSd1GjZpi=9~w-s-2&1S+HU>~=rP|!R%Amz%4(`trVJCrjuHN6tG zCR8)qV~D5p5xMdN4(7S*qKo8`Ja1E+s(+IwT-NHxy65404ZdVnpX)rM6T~_q!wzOIXj1!BmG-QI zYEy{KQoEaHNu<_LaWVxxe`7Na&!#BK3-KbE(v2GrMh>>raQnkr+fE}|wABWiI+QO0 zjIu^qx&5g@Ar^_%&ol}wx>yR@(kMOw6cz3{eX=yDQ%BkH)CP7Y_tY3UAzUgAhETnB zQ2BhVNs0GXF(%1{{XO_WVwtTOXaXdd_QI;Z-7;v;(_}GX>L#`NvLcIST|Pk}J6`0K_KqeAwm1Xb*BN73P019c`Rmc``JdACd ztFtFONgDV0>`5SO9rhsOHHmanzZeTzz>0hE^+5?q$4qR^jzoirJh*iXm!#n1>(0J0Y|MW^%RzuS7Ds|W|=n}Tbr<&qhCW5_kj;^Sz!`6que@-EGVDsGzAV5G!kU&5T|KOK~ zwl)A`SAdeSm9Zhf*5O~Bz!&ukUtzuwsG?xG%82Cs@bhzdkUcx` zPXSn+*pdNE3N;)*7Caii$2;{zqC1UrBZMb4&75X2vA%a;6q^O=jVL`#9nG{U+L;1i zfUPHJ6dP5{b-V_HqaW7TH>m&(OOC7&yq(iQ!ukUwsXeifr$*cWTKqoykND3=b?a&e zwsuz{_GpPpHkAVvqEMCB0e{Yn@%8B>PDxXSEogX#NGB7nvV9OmFtk3!`Kf$r;^}W) zozDFvr5D(dR)hXEB{|&UONQk1HEEl&>NlZ>@>l6U^6-27(4JDUc2b3;e)OP`S%cXu zOKGe~ph`Bp$S|n~&h1BC`UBMN2Zl!pPvlv#XUbAe3TOF&ds_A(nmjQor^a4gX0zo~ z8mKH;!jeiyesR3d*fa+p2l%e$4`WGh+_R8wx(_=&*SHVZ7NmP z@!O*s2^fbgJSlzL|MjhMg>8Ht7s3s);@Ll2p4RiA-Co$8&_5j2q~g+k`r@cl{**bS zACRo*P>1l-cg$F%j06xD4U+DBvB>VRzRRxj&7yQ4mX zo1u_9a&_kU#mu_EO40RUUuN^<^4WhI-T^pH8)$#^{`$8~p!%nu&EFk$M}V7^G5z1Y z^{>|Xi}Z!B0AI*ZUbXq#I(zB*zJdN~w-Svnyymu=P--$5f;@vX3Tq6Ui6vr^sWtfI zr|Rr$0U-MS{8KpO7>Ph7M-irJ(TfFK#+A-b?V2XbkG4>~ltWJ=+pVr9r5Vh)08bzi zDZ&q~x2ywavOoo(;$`)?O04(OP(af^oCGju7^&hNh(|I3h%9A-?}p7K9G3_?h)=aA zx}|ml#fwM;(@yVg1Aw|L9+(ofYUwk`BxaPV$Dp>YX)lW5HI0dtqpf%gr@AV>um4aa zNth{=-gayw9;az7{vAN7lNxV5JJTQg%0u|>R}B?uEl=It7R5jGRse9ej6Y)Y9$iF= z&FcI#Q)=b>R(xgewS7BmGQj839srJbST2Zv-^iFPgC4$BLvPp1M#{8 zt|gTM$erpt5+0od#RHfI+F74^%vN1RbihY&TwiCA4*NL#A$JQlxwYFXDWGuz((JAs zELnS=@Re&sv(ktS)|*^(A*@4#)e+?{ILcIe;BP}MGQ7;W6lG&h{u z&q08X0`gBM2mD-ao$cS@y^Czv(yF^J1`EEX7{+o0JodMv#O3s<1EX5-acP>e8h0=j_>3`@1u`&73i!s7Z=- zhVw4x8-|}in0PsZ<>2=P73VnInGcZvbm?+wwY#^!gVx?(<&gb@+>D&8?f%`)ei6R# zMgBsB;^<$gA@LRoe*Pk4U`C-qh}NRjQ$*tfvsQS*FQ?K(5e`9Vkv!|VjEyZ9U(cnW z>rc^`IJ4QGme87OetkPGgn%V0%T|VlOlv48o$6O*vxlaz3d4@HO;K<$V$#3$=K47P$D|kd!cAo;z_<6>o}!*VOG8|(=69Ak|{fL6J$@n z|3I~8`?futZ`!Ut7RD?`ne<-P>G*)(Fb(&5_-<}4%g&&RZ{Dr zvVbk$fi|zz_e~$(=u9a8y{ML+nr*s(2cmVTG+>o@H0HAJv5}YZb$$uO&eMUTY5qq+ zk8?l3)TWZ|k2Q0W+sTtsrhrpn+bm;%FZSSrKpb3#j=<bDuT$+8eA;OHA8Ymf& zgWdNTdd+oym`*5jg7^H$ZYm>lkDL!W?+IgYNxaf8Rs7=yWrg|~HG5An1TF`^g#w8qvS zh*ID2LU)a+Xx-{d?gSHwJeFv6iCViujHPu+!PuJ9<=;NWpuuiy&b&eYQ&RglIbIll z4JZ*D2#ES0BxUSsXl(Z%W6~Gv3tthw@UQ9L;qb+Aos zIE05w*g+pB#NVRW;`coK$*gZV*J)r#vx^F26Q8_My}Pia3B^V#P1@l1d-$< zuxQ*H)mS_Y`e_*E3^|Ll`<9_ta4KO87@-W4pHco9c+Je{e>I@DF5u>wv)pL>B0ql< zTAK7Smap?8+jd>Fr%RVyxC-8 zYYQ;`cZ>PO_`(RuVY*h~J5cfoQl_Usfz}@%}omR?)Ju^b}c(Ijv;n0zTJH3NgSPu+UGeKl71Y zHRrHrgc)a|4>gvt>eEPua6y!&#pS=jVPQnde|HKN+Rmn8&+Jh?^6Ac6wCQwME_Bzc z7&on&_o98`FtQ<;P^NwaQlxpt%b#7YJ_{fTgc=qyiq$zyaoeV+VC!HEyhea?+_%cr zGoMXkh)Zp{eOZ#;-b$~0G$r&zV1Zu3U~W_s{!zYJ>9aenwnRnco1)4r8^^V>5!SyoHWM(t9Q#PJg4L56s%*yxGMX9W$r z)u?J+TLFI zueI=1k9Q`CS4<@5Aof2m=>x#=gkbeFsS?lfcCmgs?`Py*kt*-x$P#J5v4WDDWbNd8 zcxYBMhV7q@nyk{XPin4XS0sy+0zW0wd#s=*h2Dv3I{x`%M6ItBPYu!XFo&Ikn38!F zE?^D8tRiYz*|*8KZ0I+AwYdST^nm$BQNh(et@o4HENHj%kIu-<(evHoC*FVNM$7in zoAxIVP(3y<5XV2{=I`G*EbN_(9o*#N`)XvrLVV#X+!xk6 z%sp1cX6WDE-(Zk;gF%yJBmv}Hrh-K6xLUHjaqAQ8XmPN_X(%W#KmTsqiA>lEIH@t1 z(Z*-EW!`$b@}VM2h^ zDd?pA=2lB}KQ5C#+a{__u5rRESqC7>czttW%_UgV**9>-D;hRwJ3x%`iQ%|@Y4fBD zl4={niZ4shj-T(pUe%(SJxMHWA1JcjOTDOjGjrKv@XM=W zXMP_{%Trrs*KzO=w{PVg8KFrbpsTGPiwmPmpf7%^TANfz)Wffe3zUX+ySsbxxmR5U z{6h4i8rkYzo!Rx{*NWfh8>ROy7-*-YzT{xm!qYJwJ=c7Ah13n-TPGhKHPGye*fUF^ zYg}YqF_##>ll7~%U~~PU>Rm;R60hdw>=8e*npej=>99FlmOQ%IBtajR_jJTAk)(XU zPE~a@;du-mr=7UU%a^O_=QZTx6=fn;8LLd+k$GJC;$7<9b3;uPa6VNK9buj=%1@oQ zti3m_#(ObcK-)D@$Nb$%uR;VlArHin+UCeY6js1#(3HF1RxHf5<1y_X4H_G7>$h?Yv-*C7O4}=pr))qw;E;}mrMd>L$9Ainso4L?Glsi8^%5O1aCD9llBwDeSwhhO0-rS)v+Ut+%W*_myZ`ugO5ABQJ3b( zK(-WjN;7?@c!p|)XOD8S$8ub_phISkc~aBMW`@-gciB^bW|ROJC{Syr(ktm=`T&aD zvCO;z7_TLwZx-XfCZH^lqMdUvLFH|>;YB~1Iihh;T1M0$55Gi=pKa!!pbW7Gb65oXpF#I@oY;C%meABv(HoH z-hXp=s7!pGA`zyFA(z$oE z#LZHkKhDlNa2x)SJiN7I7r#H=p3p2N5?KRb1W(>pMH4X%06@(~QL?v}0|qfXgth=` zia5xZK3?bb!P{5eL{DScO0)DgX8~6f8L^_Qg@#M~?7h0;9oJx{K`t@ImRLMLILXrm zDQqfgh1J+G!Eysfch@g^qWsqr@iiasz6v=8<==<$3r9)@W!SrTx3J~P=7D^GH zfN0QdhDo?+4trkrF$UooMj za`15d^DobcBJwD1X@RMvcMu;ISEAaw5e~ea5B|Og^W)sQKR%z{_OA=B+677bn*a!# z{#Mb1l$P0Rr0l1kY{25VM(rAlC*wm|9pzDL-=^tY;2#(zttL<&-zu9`g3 zM$oYW@`H(=_s{LL^Ne_kHK8^mvj2(5DwamY4eS(H$L1k z6bwbb67U4=2b;U(y*kRKu#-p|clpr+6xr8uoo0obsPbtiIC&69&L{akA1$?>nOaAO zuG_6#FJ(MEj5$KMb|RXsM218~C%j^#lpg`woQ^Q4Z?K?oBkiCRQE9MO+U7s=6E9VL zMYf_PzRrj-nPuAIP%tS3MQ9e-X!9h&oDkAKPJTS4BE?RPA%nDNIe;3$ot306U<3?o zB4FKN;OuS8W})3)wQ1-YwKR@=-50#dk}dX(HOpu&e!yD9SLq&$2)8sKCqs*LW(7pF z(03<;;OJu=$*;g|iG0+KHuN0g%-mIGsL?;v+tJ4>rUFZ-aweq}R6K65{*iHfT>RG* zAnY-O8!ocb=;rdrwVrqtT*L5|{ax(PLZ0pZ{_?sQ2~40LpckJ&udf6b8K$gPgu4!N z04E;Q_Cmqs_v9;YTf%c#b2NYvVywZ2ILS)!a7}D&`i*o)vb?XL8C|R98$+KKau|y} z2}}*rxEe0JwvQX@4xH^k}-5geA0Kdt~Dreof5Vt=Ripp|`Gc+|JKu zNq&3}ieH3%w_JFxG7AY<7kb^#COFq^+rC}Q7MB|V(6l!yQ# zMjl1~LA!R0DiT|JGK{X_{mP$-e)Ky#{5oel)+rTcci?){M2=mCz*3F$&QdM0&o(J& z*Zryd&60^yDHpMR?7cQJMZ*{FZS-;Dnipn(Pw$9$( zk7s*t?Ysh$lasTzxASYLSt6MN@RP>`9l8U(^S9e&&%NrN^^Xvn2<^v_dhgm^wRsLr z-(Q}e-;92+eO%7-V!G~x4dpq!jVo>9crsssl&Wn`W`4XGExtZ_VuQa7v%Zy8t>WcS zzdSCwU9mo$UaVPmaz0)itgRlq`)5?{zokQ5ecuaI@jpE5y!?DF_1C$LAeiDjyv^Wv z^0V;9J`+>Ez?BJ8Lk3c_X3TmK%6p_YXW+BX@(^$&fYiR8Y@KoYshNX4|4Q+)E5Oa~ zO+AO$@lkNvAn@vXWebS00nxf^6MJ+fnC-n>4;BF188q=?^^q%H*9L7*jF3Jm>b5(>iB4% zPMI>jGI=nAgfL4=RC}`ho%ZvHf$(n0xQr;eA_$64Yb(&XuX8GP3<9kCmmJb3>kk)n z`4fznOkG5?e!BYW6A$PJFcCMye4vL#R(Lr;jPi)_wci6%O!9b54tImI{yfd|>qYE9 zzL+w6H9tgaj!Y9=;hIyC;RkE#yR?^2Zd)^kfaqXW$NSDL#bC%2E4LVA9H5Sl?O{1b zk7+w>y}yyRj#aS5N3o^smW=*WD5)-s;K2Vj_;%;`nKoi{PYgd}6F#HZabL3 z(?~iV5v(vt>GBP%7Ec0W zb>5=kPM9SZRfzV@mmJPt`{;s?LRch=_ikb2=liv|^4$=uioL;X!RYT!AaR`0BiR@0 zk{_1=WCaJ&zlPXiPK}AAE-*(8y27iB{gIFmM@bPoB+rhfxsl5~EZrn{6U5_%Q#J)W zjg4@p7egs^B3+|)!ibUX+Z+xyaLi*8ATBZNC5({n-^z}DmBGWGb63b+Ubd=G0m_W! zQNz^)N%3}E9HgwJaCcKT3J7wc;VZ%%J@q7%%)cf7Ayn51?_(LDQod1!sT_OXPAphSga@@so?DA`Vf5AAd8Z{T`8YCebJW{$ zyS%DYq-pvs`6mj9Clvf`Lb-AE-QW}+-;cs4@>cy9ed0 ztxuT|>j&mE!yK_1HaLR@iUb>7Zja>OXGc%eK=>Bl&_wUj#WF=j4D@nPgP>G#C~y$` z*=i(W^rSnwT>Xjfgl(1$_gI^w`E?=VMC!vY0-&zyne{It@O9B@6k> zDF^;xtDT2hxWU~SZK*QT;@nxH@>4)$vuD9tu^oVqbm5SR)N>}(8BRBK-!RKPaMtNK z;6-xm%e1S@6EAO)Wim~OdQp}-$7Iscl7mqzNUERxuI8YZvJD+RuYjN=d7YK(JXFo=por zN%d$kYy)Nc`)D#x8o%vB=rR1Kb$rtc%|x#5P8S(KEUS6%rV&y8)qOkUHdnL&f5$mirFciqP5P0>mA& zY0+SUezpXDnJ$mjp6AiMAOxFfc;@lCIA`0}oGQ6P5=T#5`wZ;-$0Hjngy|i@tPmC^ z5d{&?q9e9p*w@rQAZ*USx81F6JZlg$X#;nw))qx;cHI;-QPSg0gPj18_}YYVw;(O>K{ z#vS08jJOq!R^izs>$p{(KvostFFQc4+zY$M#B` zsQ}%{=z^d z?$*ftQ{BU);Ox*vr)BVyc?;E0w$gp9(FAT)#X{bp$ka2M?LZUy;=*s()hr7C*yhpsKBphvGL@;SnCFc`7v??*? zH{NqbiB~w5=j%Z2U5b3%F;?g2Or3N_>&`^l`LcCXhV2Q(K4KD^6^7)2&n z$;w)6>}-KM#gj~NDBbj~uwG;@sxY!`NP8T_ppzvEEC63o^S%gfO^$ZJiVpNNLNhtR zY$8b3pV6|)&IucyP8_JEZUyDrd4jYVYP3tX%l8y zq5P(^tA^`s9u(F&u@ls#wE0f6XWfpLqJkElo!A|-v;&72ox))P2RG77_7+;07iQiY zh}IG7RHT|K2$Tr~ja-LZkc};CnWuoCvWZ}}3{8v+S1czz(a zU+F;@SgZFiD+WaYXQ9`Dy#kHETfbm%p1_yL^mrAs_bmw@Cf<`X#*7gn6%6~p24`0S zyJm`dLcCxJQK`_!7qqQ!&QB)WqLVB$;~OWDH1bH$xmWNRY3WFeS4Tj{xuSA)gR0TQ zBILqZ6-=LaXQzIol{KjFz2i^ij;P!YfIwB|m5T^@Y;RJvRQE88-fbO?^dQOwVOg)?;AO1#bSf@c6TX!^`3A*kV!^f7SiE1iN|wH4*{>F;pFH)=@MF`pTKaA<;;8 zcV)Tx@hYG5t~-^dMmqyTu+&;21;T;z{YfB`qfbkCf zqsfi+>Y7C~$^ID`9S3r|uBa0-j9g_I@{FWWJGBjH)4RCyebe#eU#E)Lu(C( zrlzuD_WNypnz=Jvxfjb0m;4~=B2&LCoSUFheE5kHJ_`GXF1nn3d%|==)=stpM~QvZ zU5NfSv2HF}|C|;CSAALeO9{5%pDWYqC%pD*r=Y}Iz*8^*KLs9b%x#OX<-_WzXBuiR zjsZ{=^`YemCv%JzTs5^XmXD|IeBSG-rERyFex#zj@RNUaX zuU2~4wyHVmoiEWKIKaC#skXt}7a!{NPdt(enxf2%*d&15%YkT(gkEqx2Ab z7y0hZLLEt=WkSrCcUQCSt!FOlT(Sb|Nuh|Um>7b0XJ6VV=6S4Z&k#{TBT7qrPKod6 z&N?6ywtH!|L>fn+ED|o}FyQXOuccti3NN~oEeTw|N98pAvaSRhN|3V8D?H^l*b_GF zaLCrx7RN8gSwHOU>Rwr$ZA^okFmblu(kXpzIll6}xYxGP_gRwpvt%mzICpVB=P1it zwTq-a*AlG)uy?KdZ9GSUJJW`Q^JLQ<8Z39@@m&^42U%-?IC5t>RrC&H_UYZ~2yMZQy6bO*NvQM)`2{BEvPW?Ef5tir(34G~d*@T(&%jaOF1!U@atB_ae4b*0f0G#l=CXMX?s z7{y4(pdvkEwy@L1(B9|N5ZJ1SmER*lf0ni_pEQ2JiPsy!9j;Pc&PM5SsT<34nm)k4 zkRe3owQ7`-`xk|MJy+-2B@cp5Oo|}~`G-kw05-0hOB>H`4s<#ZMC`T5@4`r}3yCly z$7L{R3AXPyW=6A1lYVxd*f^)MJz^{pzXPky*)eRi;2#mX%;h<}`qIDiTl8IHbp#WM z|CHf;vLOIu6cxh-^K?WAVU(so6U>yuEn2IDEhvr?_NzbFnn#&Xf|=&F!<`yo&?7@1AQPb|^F!**?@P6%^0i3ie!;LX-Y3^@Bzp zXV-8+G)O-wQ7%|pukIMq;@4fJ5KU_H|V1n_=k| zQs2!ZSd}>;;e%T^Gb-JPe(jh#HP$b_!_?G(;q`m&K3G8Zvn(HCxRmoO3ymEy*pg6@ zr{pC%CF9~DRB0-Nvk)0XK??P5`|)wr5J9f1Q#3?z^f=qYwu(%R&Dl*$gptIXW}=fA zf-fZ_IW;D~eDFpWUO()Wd&0QfC0(j#f22~|$qJB!<5aVtvixlwKXA6 zP#pqsd%U-;v}x0V#ML`AaK56Q6UuIs<}TNO>k;_bL&79R4HwQigqbcDI%yxyNoktA zi}jTSgwp{Fe*Bcln@R-=ep>_eX4q}8)q-E&vAE7hdnqDb$N4ggeqTkM0d}{f(FR+i zkHyE>1Ql-t(=VMsfpg08a=g#9(Y+;U>}>mS%11vP*Oj#A_i=u{Ir(`+Efy0DLTYm> z2Xe1vpH}Nx zs)@1?{^_mr8n8s-u={;0A_!xj^!PWfDMnDxe|SEL+j`lUo^W-{zFQqyCo6 zu~=97J#^&gS{(*$BtTDkvz8iX> z#2hKc9L>ZY)e7Z~a);0_ynnnPgP|0Q9n+>^9%34p#4ZchsM3q0a7_p?fyr&P$LqnN zN9_Pju7H+Lc(rXb**P#ZyLhGoo;8+BB4Zne1!xXTp4+FB9U}vvuM(`U16k+j@);mZ z+@OWXvwmBHx1RoRJ4j-8fS&Z|W~E=cnwxCKua>kxH07Nf8C_)n;XwL*-lKJF+lL;2 zv7@UjJ_)bl`n^oTX;Vb`fE=oikFQN_^5Xg|Gmn*5tn~YnZ;sWqDc*81EUc?F-hc!J zZpL_!(GN~iP|H`O=x%hO^LH9G^M;4&PU#dDbFEOV*Q3EBPV*89g<3B7|As@^^#K2%U!Ssx6R{BUb_vE+y&ACm&W(gS*5C786lrJ)v})romI{S5j3p9)J zLa^ph4#XVr36*{pcnx89dyngrAoNJa&VWvMgOzJ3`Z6#WFFEJfPx)pAY>V^4!gbBx z7%P*zv$>mU>swOk`KrDee;!pumG21RTjLW05-|I(Qc4{pd6@3nJ5afYT+xv6zOXTJG7=-sSqLO42U3~UcnH3cix7Hx z!7Zl>b+YE%9Ftu=H?R}{C;c@nbVpITjiCkl>ZWeXlY<$Uo ziDwKFF#&mW$Pqx1UI`La0=xwy_QQ_bM{PG{N)Y=165BX0QF)N6mc=SSU!S*P&QQoz zNJ<6F`67hxH;gf=oqN4=P2251`Wn1jY(VM$LRSQ%Lx zn~-z@CdCFLiyA8RZBS~VVVoFVM*56K3g&QBb2cOgI@1a-rx3Uq3{bW>tUC4P zrBagG(Iay!Iu33&#=Ez11;VM#P+4Uz17yrj!%s=2u%m|6h=CpEmE>Q*2pHO@8MAwHZ9_f zEgtjQLWl2?)8h|Qd|c}m)Ay+hj@`ni2`D+a6tO?-fvJ+_OT{YOUTJ>F58vwrgV|1ZMM zAxIP^$kuJ!=55=yZQHhO+tzK{wr$(C-97hz@iw!XT32o=DkG{g^L(d7o_-`y`nV%E3#x1l82X*=x`_(Gf<49G0ny7 zMUiXNEEGg)h#i4Pb8@Q&Bqvb=wISb;bQTep|1yMG{$2QVffpf)fIvUg2Q>icfF^wh z=K_?dzTH%K-s$lB3Unk~JnOija@lE~RV320yV-po{I6}LN8h;hSNQ%Vam^ks+G8r{ zEo1g?R72ux@GCk=WyMf1EFtQ|;ZPCg5>X{Cv_`G5qle0kZIX${aRe!DIb5@CZp<(|PgI5YWaXI$>qp$o9+71_3b>xP^B^?*I1o?iBV!tI( zv>4^406`CKea8_k-VJ-@ zX&G7Y%I3#~I8$NxO7fhnt;8a;8k4;Cg1E|3<={bcyXfz1cBPr=Cd@NJy#->c%l7&- z^RyWB>hDWYK7Hir%Cf9wgXQez8fmhWmtayF`2uyEY6&T{A$fkWEle+YRDuH*w*q49 z4JZ2Ds8jI5sp%8kg?CeNkaEG=k`mL=wHqm>x$>*GL)-&7m2S`T%Qnsq zJ@oLGiXf=Tnec&bT^cB+D#KU%nU*h$(Nz{%j^(_jfxDtOAI@OoDbe#Km28Vtz*&MQ z`d9G2>LR0ATI^ti1oRTj0!Iv)ejcfi?m86JX?)*`7M(@^tXO8w5i<^LyFpJx%dKFu zo6IOqe}{NevX1)SzLB);oiE$1li*v@*a%CLY?F);(K&N#bRMTz(;%TqBpxj!a6L-6 zo{cNtz_xxItFA;-FiGEB(HJlSP$w(JN5RMb6y?CCdkbEdc_cu+bWN&m+QMc}E;<)~ z2U0SxLx195*NcCJ^myV}5*@60UAZ*ttnuehJxxkDWULKcm<*jLV$$mmNqu50zm%%ZMfi zWu`h8OyzZ=iM_zhK(8@ny*CoBs5|*JI0iEbdm8o*LdT@Dmh(Wk82<)K5tpImKLhJ+ zi1SObpt6*)<=^}(eDa&{j^X;6Ihn*mMBRB8dZEI9B3qPHV9INWJ>~A)7XqQ#- zwr{_l?$$BBRP~Hf?i=aq^WII^t(Vb5r*ze+W?Dt5%eeGa-TbB0p1CkMIGDY%Hkn2;$d(l;?NI|Tu z_3<#SfM56u$7IvWShmGaJ8Tx5SP}>WBi(?i5IL``0M9~U$6*X@=3D_-qqOK`maYFz zwA0fQG)zM*2xo1f>k@vwl7;WE@6=+^Q3!qHrdDGT%qxT#F2yDj?6Si`0UoZP@MAO* z-+X`D$aQmHps?gMy`rR^iI-+c=Cp(R)oLF!!Jf#z&18j8gL~_}ds4fwPGAXqZCkep z=dEl?>XJenVcomT+t4ab5Z^mSZQ^p8leT!Yqq~AL{Od|#hM_x~py(>zz;j5@Ja#d6 zmdj|4v)v$(k}78O@wR@qk=6EBo+A;U9ie_vn2*GYhWfDYgNcFHC7vDiEwWLRgr zla!P_ADX6ON~4Pa%lr>4%<-#+voucTWE5;HU1idJa}+t%^l@tndfwwxQYcL7AUu+5 z@7;P3+iXoz;8@_$pK=VEMrFo%R5Eco#EpjI6zR%9$rSU26p9L56=wlrw`@KqRvM&cxyrxUQ|j=VUj6;JtAV& zd7-V0w^9J**U#=ERW?{BE9R6G+$+Red#2`?^*@|!=_gn%pWmo3oE!%h29%1Bf>m?d zNKEruaDGrx21GGmlyQl3xLWDg0BHh4%~u#`=V zQX7S>ms7<=nWzFxqI-WYn5GYtW-dG#w5TWW6B{yShLtDl*pk8%2iujJSe-1b!!6EF zQTZV)w=@)&w&z!u$Cx*yYmdEG*LSUZTMI_Fa0KWQq6ly6phzD)PY}cMs&062s@6%i z(s=gw2zHe^r=a1ueOS?%;&>-l*y6>2WmqWzeAzE*ihnMI(<4)JD^d#KpyAnH`Kq0% zoq5Vo9u(jK4b$zz3&9POCu>Cf-^V{#d+0j$)N(+VJIa^}nq~2bJ!==w1La_Cz5yr5 z)|Wi{)!QbFSn9pDsf%y%V6i}rb+q_8{EIAJS~)iH$}1%pfD>~*W6(&*h%aTYS@$1j zI54kC8X=(^y~AGtWIo!a#5{SPQTB6@Z9?B++I;r_r@GrMsgIuoRFcBkDU)Gi51Lf0 zyaL)QO(!{qTZdvav%6oK4V$l*3R z9<(}O1pT-$!bhRkOEYx2t0esG640($7Tq!h#}Rw}Aov1i0d_ZOYs!Gm=b0!=Tg6Wq zr`#g&pu!;gYKp(myirg30vm0AgUv|~0odHMdUO$RI(uP}0GlqC2kp8#(=XbOh%39< zBuYz}M`o*r!pCdm~W^BRRBbBrv_G)9Q333cu%e{PfGuoO2<^O>)2Y`8W=c*yBJmnY0l` z22;`81DNR%K#kx%mI1T1-b0B?)9gTZ!Y_S@F=IFZ3{H&8QlqNjZLLXxvcmazdXa4E z;#hFe7-9-^6_3;Ev*cJWolBkcWy3#KxV0AtM5=vZ*Nl`-iW za&rXhVr|`%NUbvoYt*L|ZnBpaCgAxP_;~D%E>asJIc=uKT1#C~O5#W<45cACp!h4W z%g$yXG3R9@HWN^>XdnJnnVtpn%1y<$tW(Mfs4Y9Ij*Zw22m5}gq-*NkKh@|G4(?Rr zx5+V4AvjYDIIpa2c&f;%(O%&zOG)jQMizL)619fIj5KM)q-t0;EysbT{SnGeF6gPb z=Fr0glMWNoVMq&h4W#n7DeM*qY{olHW#_0)*}e8HyN=Xi;L5T>BtkzR6tOfG7xMVG z0fhgzn(_`z%YVjZD%JFEi*0COo0WKe{yR$~w|aGPL+}#qys6_l{Ln}Lcms60p}hLB zXiydrBym6^#}=xN(4S~Yk!+~GL~=%#e;hb9k9~|xn-I~y5om+2#@VoI&8l4bJqS8Q zp5;W_%__C+GgWw8W(ExFi<44B%cWGn`dYkODYmg}S#G5s=w1m5<9*b5<%E=jl!qeN z24J{OY%DP)t3=4DJ za8IqqH-=XOU$B@9*S?c4;x5HyFn(u?+G5b@ZOrFRpF*&j&Q~ZRcp`OWQT@aekXn$P z=%z6T#??C;R+Qb=*Cx(onUpiHla*DllE+#U{yNIE!$dY~Pxyp9^tB2>@&vkW+i@_f z5G|pH4oTW(_AzJ`J$yV%XS|7&aTQCKWX=#V{e6-a(G)?3j~qBc&R3GBt;#bg`~`(@ zk}0W!**0oZNetK}@sALiuuYeprEGH_Aoo z1xm_9Qur97`DD6fMf-{2Y748A=nEQ=Xj}NoBVkayNyg*rnN;vS7^EO15+Fhvjf!qg%t*2hP(IL*3$1zKnyC7c}b$C9Up=$=46PUQEuMcO#$u zo*Bv)awn}fG4FEk?@}lX{6ysb`Ma+hFVm`%ap9+!Gq)G-*Xq_V^X~<{VVP?8F*f|A z|CrW-eW)!?jvs{GThT3x&TkgMFh!(Qix<6%X$x&k7vt^&qb@zONH%E4Zc@-i^i z=%#Q;o#5Dn0OMWPIRRudxC@f>@BK+7T?!A-!P_6W%C_GnK(*s}WA^R|&8sOD+g7yc z4*knCUTFhA$D0>Jjo*@%U0&SsZ}X4**0ISGvi`x+OviX=Mt1i#|#5MzJz5MX0IQ~qf)@IN@T*VogbQr2Ka`+26RruTtSJyLxyY3*C%{LOmmBBW|L(}o z#^k|zitgMA9qVG*ZOXWtCo^+IumMW19y-kErO@6zYT@|a;bKCSQac$9?Cw}sCwYnrDDx6EZ zZ!xbzNa)@&R4p2v!X_{n;l_#{bp|3K3R_;!t|NmMUI>6^!mzr{G}B~TD$Mb0<7dxV zji@QuZ+_!!-FgU&X1BkrRr}}QNr(HSi{nJSfhDS9byrl_9dlY328#n83tCw?!bKI~ zNuWQ00KqayygbUkHIB@u{O1)G;6U5E5NXA*itA>9Gs{0TSZ<~9 zdU4aTNj~8eE#0cl+maBFGiE1eb2%%8@L*4itSInFN5qiP_QaF)cP9LF^@pn+!?GsS z03TKPKgo}_+33D2yT^N??lP`C)(@GoY0zxmm2b~X>SnWd0~cROhi{DCL5{Zes6hQ# zl8i^T^a{Tilq5`i_r#$TSemD1&nB?N`*$@LaN)fCD=?=@eYjF1kdC}sy z{Ij9XEH|*uZZnkdi=oUNdNm?n8ZAZ&;veQ4Ykhg-E*R8~SQk>4uTi(s(U*-v)`e(n z_X6IaB%{XS3ftAo>UDn^m|{Bl)(&Nt4b5b1^nxBFfsuiAb@^L@Bw2%l2!@`u*$IoWPuwM7MOc;4^U1{POPVT@XzwM>PnFYS z2C`?!*!e>Hq97*-JI9=z;j42>9#@%_GwBWQv=A?9jzdm3`-UQ;%(PP-4=z=Er;(_? z_lkF*yR;RLAW;Me|-TAA9M#31~XL>~72ZM_3r>NL>P8e`xtz)&^Q*mVv&}ljbU9{d57~E zmOPH?J;NH&gRr&PZAKbFH@4E38TX;P`#OS6RqGlJWyV1B@*DHSoQVR@@ZSps_)&a8 z^W7F;@$B$-IpapB%XC=OCPKF(Bb1fm_Rh!1UhOHLd18Od8P!&a962mmLy#>>m!2(D zf$#O5Ep6yz(V`LUQX`idv`qSz(Y1XbRa8&rl;(~aUuf0t`3M3+gnFN_lq{4~cR6|H0E?0cB5aF8B6U*?20Q*3GC65y3(K?Ud_g0Uu0sWqAi8blUI)#S zEGaVl+Uqm-@Ezg{;)_eqoiro<)+?6~N50CLH!P?sQ#Et1FRemk-x$bT`No;SvpzDT zEU0BK65CNhtmP>edbLdJ=O6 z7djQy7Syc)^bSkN@GglUT*UqwADKaNv9B2H$qw8FmIWxNt`n z&nbLNNi#WrL8z<&10gcWGh9ltGr~?GC-e=B7(WG3Kg2&Wf6yp4$}NoW0!Dche(3p6 zR^1R)hpCu>7smO|=3sAw7uU17;eNJ7F>_Ux$k*m-zev-smwSNL#N&R;9C3{5OOQ>8 zV6guy!gCU7>k!JGcPs!R2C&YPI09*(5$h1WBtY>p2PS6-ifUZz0 zQ;|WiY&KvJhd|_9-o9;hqPjNdt(^zGJ;Y8eTZ2X8t}6I7SUL3Z zPqj4fvw1JwOAQYf${&rwet$pApNt@iuTN@ZVR_ik&Wi)G(P_KiB5D~O7U?dw0VVb@|=Q;RmxU?Ju$zVIQVQ+%ccu1RbzEz=kQ#Mc|es9 zbUl5Uq5F+pge|7rL@H(SpaDvqU$dRF?X(T(c{V&h1wRCDIG#s&ssEnIRNWD`(^pCB zlu+i6g|KoP=#VDp$=uExB+AyFRs0HAKO!aPA?!Rpc9~&d*tL26G-2*Cu9WD~yj6ng zGr^x~3)@sqR96LhmFZ0dTenECN$VqC2WX6u$!#rWiwX_R7II|fkl>RtxG&`s!7;H# zB2}i&JeK7O%E0P+Jc;~SH=eD)MO=TLd{rk61RIR{JMYaBj8>aWwz@6CYF*W2(|7is zd?!6ESp!W&WPFz1Z7gO5XfN%R1W<5zH4RdXg^%xMD}sQ3Siu7}HtQdZeST$gUz?(E z_b?ngW87-1nQ`fci!o{2<`PvYKEyjimKD}fm;Aw`igd`}XO-|z8mUrhAM9DADgv?I zrnfm`sTf2)_Syu*tE1COdF&0#K|OFz<~ZLPr}UcZa?w(N(wr%4l#i(c*=w|S0CI@c zWlm$S&LXR3jn>j*u3pAmSFQMW(8UA)BrG00Zf7mb7I$zW06b$!^C1ijR#>?8yST%U zHd?q1PcUo(3BnC0CUw{D&9K`~k5AZw){_3if_saWS6rcv>7)g1s((2LvMC#qN+Q7sM* zN$Ee;f+9-M9}sq~Y6E{~4s>3}GI;-6f@*nStT#TuH3b6e`<4`QrnJ=3xOxAXE_VYh z@u_92#8OY2TKU>XU|C*|8w|#RVR$*Vk(6*jM#XaFwsfNVPNu$4Y!XA$$qhEApGF+e z;JVniAbY-L6kZ)drzleCUO-#b?;Hk7R1Eu|gr6MoI;c8Tk?t9f@?rh1nZxXexo#f% zGHUu~g?dkqHj@eRLZ(dTAs>G@s62`Km|t)fhZYW%H>x*uNR zXc4t^(~P7f1Nb#T18)hVxAb|W*+X%7DN|&+v~}Y;bl#W#w6c2e*YcJ)m|yD$h!_mJ zm~yFB#A}2>MF%C(^9Q1!5UNX}rj=V-{O|%qXfZ)m)MhRnCoqT$lCCz_*G6j}L=?6m zSY9WG@|_8`b@W+%k>)|Hd7DMbuLL=6>Y>xqiGQn<`Mi2(qYVZAzT>O3YgEIje-ucp zQ&YdQ_8QOyG_K}&(|WRgkwnh} z!|v&48&R>@p8bpUKexx+mbn`#0K4gp5$ItvJFe?OWMzeYh%5>s=b}y>Gc6%Qp~Vb$ zEVwM~WN(f%hu9W)i*r-jmj@rRKKXV}WG5<4yoopOWiE7xqKSfOk(}4k?_2z{RpKq& zY1qxkQdPOP zBB?DTW?_-UwcM@)g!s6uRJKOy-1SOEU4~Yr%P_EA32gSdAu~tE zspv?qXsDc*OKa!aekKr;>*)FrRw&-mI^^_i z%LdzUmTi_NTgu$LMZLIW2U4EJ*Tx7EPFOR(u_vA3H8Jl~ z5UFBz`L4xbr99+1W^}r||0HeRE&miWxOh{ur)@v!lH3kC%D$CWYAVW9`tI`Wc3-aU z%?q&O$0;01TM%8wf==&v*pluL1ae1S#Y0{cR=h4S2R)1eT*<|@d$@zRX%vE`C9^r1 zYpuuX>pZF(7FpuQLc)Fa5K@;d2v`fP%N3gowGB#J^z+ev8t~)V=p3IR3W}hrOV$DN z6F(EFS8^zvG}^A-QUy|Uxoy?E<)la0dqAlfsY95h`+Qx zmC&<=*m|RxK%{k!uB=y0uAh_UEPpm=4S9A|ocHb2Cw%{nI>@Qv&e+Mzx1AV%|Drlnxxy-Js-V`nfd+F1Ps!oJNdk;+2&fpUSJ5gN;@APB+5K)xb zJ+?ygC|O7ULcL(2Qw}*G3;`AnXAH-w+hnZ+#yHKu4)h@=%GOjBk(Z6jsXw1Oz2c@zbm2w>|M4pss zj%0R>Xb>jl_9vPlTAf(24tmTtO|Tw>A)L*C8w-x6lrM;oJ5k(h4^cvz0pyUeh;e49uQnmqt?n7vEVbvkZupvy1*B zO>}Sfe#vHi*^Wr*j)9>276XsjZ9aMt1_!Hhcz76Ha9@WjU4o}S$WGg$T6%nBem+9 zR0*xJW3P_MHu)t7cPwcE7kg1xnPu$l-oWdSL0eYqih&xEYzwSZ5s`R7$xb6oNb9E+ zlMor6m4EM4R|CQzyx523gU$_m(05l#h*CDNtiq`EnLi}I9wM%a24u{fQz#e5&7|=M z2mCQBF;ra}m^F<_#W`{r21FO(k*};_JxeH+48B0`ce0LTYxu@*+#8_sF1|F0v(jsN zSvciUFAM$wfLLNf+;WQe?qou<-ek9xXLCwVI?2(_&Z}w5bB}M>BJ6tt^SVg{4=uRw zy5`37zC~oTpXH-&3!RfxPMER=0W5+$gNiMaXqDp0$8xv`3?CBoR}dol<=gBD8N28rH*pUX5upNxSD-Ys*sLqWl57XR^KTBf9pY~i^EY$Ew_os zKK6)plJSH58sys2mfcKUiDsvG3)B~vJd2V!Vbn(PK``Pc#q5A_d8QG4Q)b?49otQ{ zIQ!WzrYl|0oIVnLCjY4(!^dwVmHl3$#y2?mvI+?121#0940EiBm`-hIytdtMp9kkv0K{0EOr)JytZ~tCkNo8BZbgtUOrEvnOO< zt8ow^;sAlZn<0kn%s^wAbWs?qiw6o8W$qDlHdj>8_z0_zOjd+Xq)B)=2+1e2;{9y< zn0KF~7bl=h7%rNJZ?MhJp?q`-oWkGh z<0J>R?Z>LWejiJN68RW+tt~1&rv9xYWA9u%#2J5eXL#z$^*QkPxSsW+| zlCw)BY8PLDWC++%Y0#cnLOy|6=xaddn;&&fMB@20MW(YaA&7g4w4a6V;x2e?O+uc{ z7?HblmQ%)(@{}??Q4;MF#&{btoX(vN+0^bM<%-$(2N# zEchAOkB|psmQ(&GW*?V*{<#+nqUNa#Wj9!`L(2QHL4yBl7Emfnhn!}}RkzQ$AV7)8 zTkHlDN1Y(&qm@O$U1ex>mb6;wXKZ=f%r~c_e2fT~fxK67%kKGh=%Oaa5uLB~m5@1j z@I8^iBII3^q~uCmgqD4LI2j_1u)3(Uxq_W+vqndAH5;~W&qW`avLz+KQE z;$f1>T#Z+5v~KE1~t0!98#H?bxOcwc*oo`av~jzw$G zn+n}zU#-D}FJi~5$J-Dz*)^wIjDsG^t7!Qnm<1;tR#o2&zkn|1bHNak?W+IU)PDSYuiMFl?h;# z9P69RgTR`B$loaeUh^~GAGt$aC0gg&N>9MNUGbkcn+UGkJSSWEIlZQMIvdT=Ey zd)-(DDtt}E%$$CaS^JTrMOKN-LGq=d;?30&j2BtjeF;6+WROnBZ)Z`%BPRFCEe zij%`Q78jTD93|fVka$cK1vq3IsSsSzCa25G2l&d8|-@HPHFM8VDOlXigNgkEwtndInxJ1}8r)FC%^RSvLJ672zz(-JR+>j&s2!`5 zBp~E0gOi!(D3k{gSJ48c$sqt7@f)+h`zM^uz2ee8xR-nhAkD>r)+YH7BFCh;E|j97 zpA+s{gnN{kL6ZQ(v_UF1zilBQu$2_aG%w`}-VAp2;}sMpGmMooEXv21EvRB_-mnTDGzRGqa6l7l+NF7|wQ*m3Dg-KjMx%vEFIavE{0=M_qKGAZ(~N8W$ny zo=UiUj0Kk8>K_oIg_ga^P$T3I!ES6~3X!K-2X*9?mUP9k2fov;P?}4YObPr-8|*(H za>Kn%R;YcAopYm9N1NHvYf>mRJ9zRS1=?1#7%HVt(Wm1;^^y|ViJv^d-^r^tm@EP-aQ`6>&%G}NH{e%Z zsq`bNv3Z^^s9UJ^U2YW%3&*E?FOHWv zHPrpgQidJYUur?p zGk-W!fpK!5ceiC+wd2)qyo}|HQl1Zce^9xxC2{Oq3tuVH8q4DNXeks2HCX-i{q4)u z-W$_de}p};xFq_zLFR3qnDP|tY=bG*Ae(pQB=ENaK^KO;zQ!aoWWqmimu#-vJjY9; z!oIkxg)3y;btKfGlxH2Wi+LIJ5O-%!fh2kww^@yt*dd=~)!APSsBK6k>0d^bcyF)$ zy=>bMK!29MUYTqqfmyvw48NxBVpS{B!Kc!UGv*v`59mwI3wLjN@=u z7w0LWCOBwT=6hcsR$Pe)>piySpz%>K&ZDYI9SfUi)uPBW>~wu69mB0foo5~fcUIP^ zJWg+g-)l!D5M#kg6++O@sOy_jlVJYF+4Gsr22mnWv#Qxzc-yn`k8kv+vsjHH*UZYN znI_yykpD$R*6Aa{^eDRO)wkXJdQ_9^e7&Pm;zS8uSARR39*Gs$OGaQ8 zgeTD%EUc9oY3F=xu0%KKRvH_IbiuJ-p5jLI_0%1#X{)JL zc}npw9qDZO2kzslm4RU^;0ScdFFoA%uknZt)Jsh{`~!I_9?47nn_X2>21RY)B&wc;Oc;wE4mWyXb4ixf7Bc3W? zLP6XNfV?;72!?e*gOig8IAzi@28g&zE$UUV=OC=CN=e3;?LwS=rw5?Tg zB^t-dBX8Kq`j+1l8wx-Oswc0lHqtsd8A_>vCCU5x@bZTzUqb&*k$TG33eB9-K^>bTxi zeL$tKSwOEnYUa6iOy;1pU}f`;wv-PxLr?`WM|vXIrTcxRv7HO`8U~4b-sqH?*j6lS z5Q4#R!pfWBu2+x;g5`+Va@-T8vjgzKOwb9)XKA@=0{FzGb5DFQcNHR{q^5;0*(?f` z%Em~jk(97F|8&IJVJyZ3XA*OWze-_MD*f8eSDXAfA3csl^JUPahRRzYS%q0#uGA`U zPf?mnS|Apzm)bC_l-r3}j1=j{Nh3+c;}ZUNElKIkXD+2kK(zn{Chgi+9qCuD^)(mZ zKmpM=bU{7`qMzC`NVrEzc#&8gk&MVaCf=FSQT7HxuZG+`F@2fcOkWihrnZ68CZzHp zWF}gd<wKdP=wYMF6DKWx=MB={{4(BwFnv!^c zAXW!2PbW%ih&Qd#Mg7ur%XHZ|Eq&yk2WK@iP_kjtG9mTF+^rUtYM4yytX`XdK|jra z^;E)?uDcrFBxbRf3P^?Zcwibh!L7!qZzHpgLrp3R5qw*!wvnJ*7Tg6@BCi($hfvNj zW#exOD5(%Uzy4rEua9brl>Xpfj@okzxI&b&9AVtXeyY37fR)Su8#`Z4 zRYW`Cuil#A$7Fv(;3`N(6#6F9{KuGu69Ac=$qi)Ue(YYQP|#^|vLGjP80Tfa+XGV~n~*{`Qg>3_!5$v- zkR+= zWyKn2>EfI8n#KsL4LgG>NIphM>bu^e7e6*Rq*YyhN!HafH%jfW2${D+Xo=&_l$qy> zhEoXS-`fnHX>YW0iZQS4~D%v=K0lwUhUzZWyD=BbpLRo;hUf>WYj}DvqWM6mB&Bqc9_yw)p@~S zLp`H}TH7!&jATnI*LcOHE31jrI`T2Z`c6!*3Syu-y8oI`bd}F3Yf=}mn)eTm7m8_$ z5|FO}kd2EmF904azedvNC+g5aiGgJ7ORMjMw|H`Ik zimb!R;H=9{2C87d#XPDo!#&kKH$lZ28zErO`K7iS5$O`g3dmHH^943N;1bz?cIzR_ zfW=LARR?Dc0#_Op-5DqrixeM=*T&D5KzE!@d?DLudSZoKklq$2*Q>}`QDR=uulCAZ z(l9&kS^^THNiZ4as(AOZVp^c`vqlE28?uV+=+XtIBH2F7m&9+HjI?W~FakI>s7S#xHE`IhR6gEtCeu|R-yh;oF? z&HCLsfXO&@M78}JXy0(JFwUV_I&BjhBg3S#V)f%F+McJ$Vk-US#eMKa`Zfj116kBy zV*2CF7|5Zxt5aE&PhyB|I%c6CT|XO+$cjQ!B2R{pLmaCMnh~HFPCRH>@!}W4LI&2ebXt8Y|HM;Jf#MLbAiMou2p|e%+5_1#ML*t&qD;Q$W1%PT0}y^r z84;OR;S^#PT&+(IB=BfU3|sScHKkv?M$ON;IY%zT#Mfqi>50`49};fxR32RHK(Ojut1~wd@nRV~ z^yNr?r`e9%4vJGR4|sqHLY>T$1eo8Q;D9bk*#I6a=QbK7)^rjl*1{|RrgVe1b!Im< ztMo|g%+U7EW?-9&R`8i~h(;Br7a-;`rNR^3lof5hh4zPl^5Glys~<;YO0`;M1U;?R z28tjbmpTGtz%Qi%M|^hZavs&{OEh5jGTgRol|rS|VehX57c+y*3G5-k#U;Y}9NjaM z%|v{z-P4KA5LLD;H%Yk6$559-rzS?cdPSP-SYd{GEi5zl1LA?Vir^8aair5Ypjg_$ zzCnrRN+!)1qV$OjTrz=h5mlKgmPchzU|Q9%{&JvxPY;8fClcbpj8cEN-KZ{CGboHa zT9tfXHI^Gw%MkzRwpLPmdxtL_f)fGHqjCm(`Tmv6Dk^1i@aSHb3lcDWv~Z`JOq-35 zqI*C_OfAF?83TKE)gBAc)0kscIB%2Qeu=q;aEDAWUg2rR0|CfKLheICZNkV!V&XDK zD*YrC3RD8=)SK8>0!cnYiH`)dT71m*4+Yw&BY2M@w2$ycOk5hem5V^C5N1ss8@3Dd z;HLzcQ+s1Zb{rKR&WaAFqJ?0b^P?BZ509s;u2au*Hz6Hzdx2#-Wm=}p+UnD{*ycJE zoBgKt5SzIzU?#ZX05~D@#%uF!VbsAJq{P*A4~HHfmzRs>_wC1|cm35izkwHpEbe~} zW@s`M(vURRuEX~A?#L8zYgs^nsgx#yOjJ$oXiJF>Tn*;9v(l4aP7o;JjSpHL#lTr9 zS{;1xVU@;%;fcFPv~Q~C+J#(iMv4V2(P@8g&tse8?A|{&$Ba1+;4+R`>E3mD;}CM0G0%lAIN@l;U#&ZSlnQ5SHSbIDf2rn%Pc#=|nwQ9a+%Ho|%( z@eKg^IfS1-FWgY{=%$-*DeCLVOdsKDXPIDg*i4)`KAy3YQC{184QJq{W}>Kd=3B0r z#R~osv_Swlxafh2V;NsG*gajtF6A%>(xTJ0;#6=7&Feq({?PqzQv$jlM5Gol0Du$Z z|JxempDBU;KbP_U??Lci#DD9*=>JxZx`y2*`~NfS1XrcO!gNsX^jQn(wy2kp%ZG@R ziS(h54otO>ijju=lfn$~uo9+eNhC{m_}+;6kI6l*ZVD z)Jpu~L$cCEJB1(uuMgSeZ)P|_cN`;crXA(ZKG^L&ZK%vd(YDo9eO!Uy#7|3o%nzwV zHU2^v{*@a6G}W@#l-xlr>^PVbU1(FoayAuTb%K3~-Ja3l0RmPaJ4&rt=Tfe&P|}59 zJ38?fH4LC|9o~1^rQ%^iSk+;Hdrg8$SF6|3p-kTlTUcv*-ysgq8YZiOtMdRQGB|o{ zbhARaIFUK>0~Tl?qv{p&D9<$oA^2k6SWbPF_2#T7fL z*tTukwo|cf+jhlHDo(|=ZQFiH_wBy#?{Q!MZ;r8Zax%`GS$pqw*4p2Z=B#hI^KTVRvW%*oNTa)OQI`_SuoNqstMsovoT9AZ9jRx64zd^+~Sk^|r{AyxCdj-3^j_kCI<*8||J zdRpjh*fyX{p=0pPJ&SG6E3UAByandqm z>kuE&hOV%s8m2_Plp5fY)X;QoNz*hlrByUD5`*LEmu=^QsC>}4&WEXfTRT+g-c zFObeOM_nq!ALj8WkI5*oe-5gR&qr+(PfBbz3?`4|x&=}~&Wv~MB$# zfY$qei^yGPfE_C!yJxynBT%lyZFQ3wIZLuIXD6nxfYCjKiUBK9T(-|QZmH-}M^)BB z{vDbxH=80A%&xcWI1NHH$&t-=8ciSklLG^`^=^NXbu{DVMvtdqwc1RsN6WdC)1qEpNtsG>gY1GKevzp+0!cINr^xu-6e*+wScUUkAmdF4i``+ch#pI5~U$cfak3FXVyw;#-XR{Z@s~%u4 zu2piUl>m-)G4fKh;B*LFDt{NASx_!xg_@<`o^qcTU2>CwGJsGZhp z-RPiPD48W*f5Gt|8iZ}70h*b5W_>W-nq=A2=dx?RGhQXu(tHPgK6nCaU6Z?f`uUv! zO+kkPyL(!ki1E%MOb@Kn*ATn`y-yoVoi-}6ywStm*tJS$vKG57xofdMcAU)SQ2tI} zlwHG_swn(G9^q1c@IRs`+=$(Dl~D;cky=+!B_(jL;)yAL0V;vgJ@=dp*>bNfo-9}4 z_hfL*)yokNcO&|a4wtiK5-M210}W0CO3@dDCK zby8b%r5?X>>kOQd#H`{Hw2w#yQ%_jR{)bUc6dwMp*gN1~d&BSkl1h$Wec9*ncc$8w zpWa1|dL~BHE>@Obo;+WiFMRR8AQjmP3xxMw$l?)_zCAA!bku2HqZyZXG4}gXH$d9m zMIRdO9vchW0`y7TY^Hc*D%EKdhiotRM67?{k;5vMF0WbKj;*~fx%d^RV{S00{-Jyd ziUvN`uMB%NEO+|n3hf=qxnvisH_*uU;`N#AACOP}VKRR`9ojR?KLDRbga@DA+J9#< zZ)Id`hMz0lzB+fVR^E@Ea%f7+M*_2|22iA>+gekF-tKceQlPXv zOQwVpqF;pPRXVW0;N+7OP!Icx22(}G(^&*6-&HA5WNDMCLFDoHpt_p`sm;>-)xtJ9 z)TR{WQWKXWHagIM@x#B=qCqtNkD^x{V`rRbEYv?_x>uGG*~FUct~#rF}bV zg?Ts9V5;E`J8G4*M|8PO-Q&mU0xQ7BmB+}DxKQ9ExNWr-hLU;&CK~}yeB*Vxx*+cR z#y(ywa36i@qbfcUmezyr<-M(Fzs(Fefs7#wVnL~l>WeRnyBjLEJA}pspBhVLaxw^L zC1e*8u{F3DDxQq&7AZ_Yb=HYaSd%|n)6hbTcqV=c8er0@k3D4Bv>?YxO*Hd-SvXA6 zgVpWe(fA=Yz8`~7sR~EVePskjO^rx}n#Y*7wOXI-Z9y zx3lO02C93#iMJ+j0KLI|J33X6NF8>Mn7b@GlNb_NLzUCD@U3*7lREE8WSl37Xo9rc zHlyBMxe|?AM z9>5d`vvPO|gMUzAzLD6ZJrCNcl-04iFLmpKx#-3J=mX)8YsoJj@9CC!1TEe2Zb7||DNI|_}Ok=F#roM)I z++HT6%8&!;ly_aESi>mY)BFC@wU6(GpLMwdlr64@#;F>hX{#mqcb(lu@Zq(00-bS= z=V)`M7_D!tkr}~tkxq*y{hFu;bNGs}&zz3)!a4B3nWz5JF?H@^aZ{XBl-+~8iizea z%6iz|fCIJ?LeJz&$yOMKAaVZVc$!l?PxIzDKFcXN@ZO!pk44KMc~5Tf9}646Ojv3$ z9l~G(X7!=Br^7D(prrDX?qKI@wBQ%&K=OpL8%(-7iIAp5g}yuBgOGz~BbL_kSyLjT z)`_UqCWLzOsS7lucz4Hn8tt4&*BW z{ETXw_RiQ_b7+10My;zab)g z!2Pvd5gph?6aH)-v_Fr(YbI@+jO?7ujGX_~vV3vA@WuZ^otX53t(CCB$Db;X| zQmu?6*iXyEaCxY^AC^W9ei_rZk|k&XFo^a6CF4UfG|KX#l41};6VhXKO5zfuWYS8t zz@MgOz#x#HYTp2!%e>^1+JCBT!vFxl@&W)5{*BYxKO!0fV}q|I{Oj{y_~L$HPvgX9 zl^Nlq4Se;Z%N*{?x}yAS60I7-c&0b3)Uovp%a}OtLVh4B{rSkcQ$faE>GJsoCYkrotzr(6 z%}@ZvsBf@TGhJH7+-K1oOM{GRN$bWY#4mpz97q1?8NE_B#)m+mPjz3BwDy;TJSK*U z5*ACd?)&tJq5VCgn>09P$bK&vJKhc~vm3ZNj*IK_tULKTxj-*wRDa9_iKb7`!%@-D zNcB}lyR#+i20!~-@`0GgF%%8lOvP=lqNM9#2_GXtoLY03UZhJAq1M*J)_N8ISFg9p z$NF0P%jlI&lN2-(?E(Dj#hKmoVKxrrcV2C)J>qB{F&)8Q05+m5xk&Msn!`F(xiH{9 zi<|ML=OdKVgw(NV4ShT^X@0#^WP|WCiQ@vX->ye!IA`i?Q_Pz{vIYTh(f&*d72<=EWpEA|P zITvqZQ%*}t6)JWfX)bxB_x24?rjl~>R9P~`!2IFT?HQLD%GBfg4(sULqPbt|^Zq8V zmVk=x;htp{BA+6QL&WD5MGBch3%|aeb>KfxHO%zGfxD~-WhP9aO^pfMDdHy6)u|6L zd`d_=@}tp!Q^8aBGM0TB2k4~vRM$Y$H3VOPp!funJw9e4{ znP|Lz7sbFM-Ax6{mZsFNdbPA%75Q_6M-*cJ%p6Z0mPi*exoIc9RDZa8&+?S3*~)%_ zroz=vA^rFa(@DK&2JU^=^q$xDeVQQEa! zvqs62+f}qs^54+)E%W*~R?nID$6m2@>%C4F7O$aQw7HV~TDMlh_L!ioZ})dN@4Fxq zTf>EeQtm=PjstLJ+Khgg3L?;$Da758pMoK1 z7GThOa!}Omt`sx#3!Kzw+QjF?NFDRvDGHQ?$OnQ>&>=_Tn8EjAP3cf|)&|*8S9l>J zJC;~DIn{GGk`_eR%DecPebh&%q zDa+rfi^kOsr(HwhYa0@3z}Dr1c2V`2@9M>YsGye~0k-&PUk-_Z+hpC)X5P3X(hMH% z;dna|u!T77kQkAo``Pv&lmxm^rN?ES_jA$VIzMbTQqz0XKQUvmIW8SxE0-BQ?ZSG^ zgCs2G6Lu4V< z0y;YiGn{q)ct4pAxqi$@85S9AQxm6VqPLOL2RpRt~>p|ZA(l$yJ z{kFFEee1NO)0b71AM-gN{fhTmhskd}+NyViGne-{Re_ORZI2 zR56hcMa`7=Sf$v}o9ukr4t9|$_!WvfMiiQGym44 zEBJ^X)^$MApTo@}fSJW_{>vfzjR|Um5*T^vXF#aDdL)6G2T3kYd5T-olBdM$ytz1{ zVV*K$YKqbT+Qe<_39+g~JC2+D;v>~#NvJ6&H^7h)ey;BRrJvt#O_>-Ea-hqD`fmsh zEIP8~G95+6BZ-1?M9vPxg}3bMikg?IVJ_wV6lF}!+w+?2d2H_*8HiZ~V{ZWu|{zi-BeD-rP`@me349;uTLar1ia3OAj znl^9O{@vZtIj0JJhQ7KH65{mc6LKV;O``<56R3Qdtgho@Hmgp1l$Lmt9;28&KAI6s zD=vd-cecO=Q(->4FbFq6#QG_ww46w8eg8%<@6&uSM-p_ufgFaT{e@lC1l!57V{~wi zMV&I7<%knkbz!GHvYjvjBOI3G`jj0gdNFrux*5j;goc|^75g>=`!cpBYXZnb!%4t* z$UrQl%I|h`A?U$BukZubpwQ(pa%x!03Y+SlOuPiLucy!h?r-PD_Fr%btO!)!=*n^{Mo?M` zdFdMLlro`rPEjb44_ePW)72k*kg~Jyw-Gy!A6p3!a0OYqLej9Y@{-QY16l^CbPX<2 zPc)1zN}@oYtE0=_F>;GWXHkuYv(@Px9g{sDzO`na^av))Pr;I13fN-scC~$*R8XpJ zwZa>$7yk*Tln**<*=UBndVlOv$!(Bx?`=&1!f-~OHkR#IU|EmqV6FoE&Cz=*{Ch!_ zTnwY#6n`kVz*T3qnH~Go`$~663yt~ax2D$O&DmLdNa;5nFe1)*EbYk!9XQGQ8aEaM zB#Tdr0M0o%-T`p899nA9LGTL*PB`)|0X-y*N|K8*_wo1YcXtzy77A-&awZO6^>)P* zX#TU0rfe?6x_OKiI_0^m`(`)LkLoQBM(a7M7i>6ybL4PK^&ilG>_bssl}}T9pNqkB-MFu-Mf{y!j~>Vx5c%dTwG@6O zolE}uX5C(DK9Oi%{~K$2LT{<|!2BqB1&gOEHeWk@J!W4$UIF8|2|#J>gy{M{)_wmF zYUC>L>dCksj?=TvzeEdl@1gy9z6sMB$g1+q#s(v zF#CXu)qi^av|Gt$l&v^*3>0ukwXN++B$N_g>hZ)Q?*{$cE#tA1cP3Lj!$+iSP;=1r zm0@um3%OHx6H3^JB4NZGY<%X07*!#HU_>`yy?kD>9)5IHzPUOCpnbsUv3Urvmk3+a zioBeI^2DNVAiKJl%y=H?LQvT9+crl}!_fW37t7+mx0E|?W9vlFYof%y!U_w$C(Pioe+)37s{0Xa7{=_0~VG01Luh`-0r zHH)}W4N}cMbK(IHw;=g;r`WDN20e+E75Du~Vq(W?jQ4aNr}4n9LKv2N zqiX&v0BPN1kO(fXL3EMoWSMm$=9+xg#M$vn7cl(&EV-|L4rV66g!5xU-ty6kdM0(s- zlHSh(Fu*8SEd6Q~8Ix+4AO6C90f${O#N({LV0QdN069smpffSrA^J0Z&2m~IC8Ksg zX6EKkCfa`Q97Sga(?kj`LFMvS_J40&RJmkzNZ2dq4t$vO)zNNLUmrV4{kTQ*1CANn z4v2K$*7f%OsAdxsx=)2LDo(Z#I&He_%B7{XH{J>p$o1VS=Lb?T6$cmP?QD=${TXSf zyDFei%z=zNbFzZBYtE)b>`8UNst|?z$?v?aQWgc^3ayX$Tj2d7Kr$$7obJ%Y?zoPkm|~Cy z?;5ED?D{;Y1&)o6&KL5e!vR1Cc9ne0isZyjq*>xK;4A17&cI=)fSm#*U_C+m3;Gu9 z=B<38>4W+TxobJr$ltwgCRsy)C^fb{;v5*wx&eG$N;ZGOH zrmc9wD$xR?8)CB@?{G%jk`J1(Ip57Tmx*212Nbx$fugsOpyZkk5O2 z4fOX_!_LT3&%wy>UsdCa@`W$@7aZlKEOuzWb5X>6&<@JVLrUu%5k+c$(}hEEHzy2wn~dL61!td? zY-brH)DxkC4a$wZcH&0-fJ66t>SvbD{k2oQX37i#L%7Ww%g~G761YcC-+%5u+EN^o z;=UcJ?2WUg>-y6b0V=`s3}J`e{{Y9$1LE99GMnYe8QKnq7R1BKa4)uX!?z6zivogO zX=zZ5IsaM*622u66bXP5dy_NxgYC4zQ?@)aaD7=edQSiYG=vGC`#ZC_hhM=jPOwuf`Wv7B8y8%#eO38yWX~ zTO~0q<(|Lw3u76;@GgW{^I!ES-+(mikBih~;Z$X;k{fva*`etg-*$7e0P08p02F_dGqN+XHZ-zRaxk;}`u_hTb@WC1!k5GsDpW0OR)kUBP63|a zoXISSK$(qL;3zH20_SV=o1&~lufdiGNrh)+GXi!?7z8-XTR%J}u;UQ+L~z2HEPXM? zxgOr^E{1kQc0Ue9X_AD;5JfUeBzVrx+ZT%@^x`biHArDurR3;zZR)*Hq|j2 zzeCrn*q75biD4dp8&F4^h9W-Wza=W9ZTUsk10Gp3?+Rw%eke$jqYWfW>XE;>^sC^{ zaIFCOFFoKpg3@z=5Xo0+%gofV|J?kdd ziN6hej4_lm#e&glEC|{HN2oxgOcFvYAQnXA@eIXe174q`tBTk^eKz^(nW=lZBFPp+ z>7i=iFzGla!e!H4X{g{WFNzaQ+XtfYGpQV??L|U|wRoCQgpd4g!VF}5lVeX;(fh~~ znICVi@&}?DQ3}r&)VJCO31C536@SB4erS^lvUJaY+Ci#?BTRA{P4*5p{~X366i=Y` z?VCp#!7JKCgVjZF_IpVN5`WNxI0+h7y+kn9HjG&dBGSIJ=Uwv$AByCKO$0F6)_c|f zC8DCF&lI0cM7B*BJd6+SFz^_NQM6N}b3C;1xX`h6Zlhdcy1h)+OM?O2ETmSj z`Q3YnIsCm*pZdi&1fLTh)UH5pGm=n&;%!cxMKG||^)X=0~AI|_LJfJ2I$m~`vBR0MTWFjvsl-Uq)x{5Guj%T|}uXLoO1 zQ+`>QeHPM$!bESd-6;B80G`y~M1-w|_!hnF@ft=S+#c8GY~dL6XW@za*9iGyE;D}O z&z6uY|05$OO=0LyjYiB~$Cb`_> zX>H(j6>e@TYWh-@2(|M#6PY` z7WaXRL^JW6>+09IO58IR#z}V3lTR_~G*D@?iuQ!IP(XG4dX{%F$u!}uW`^N)o9tw& zD;0Gr7c5zDO`Utzz|CjyB2kWXy6MqU>?HWmz{V;OO0bN;BZl3fDJ$~lf8rda26#$; z_a9SMsv)4=T-}?@`BYE}+tAlpS$nr~mHrrn5-8a{*LStL;dSNql7>#pN@WfLSIq7+N zR`lv92M;T3=|hTL*E88=^rcdh0o{PaAyIbycc!DR62ahic^vPc@X0+)yQ;k3$I|l< zDypzPUYC{+YJFA=vs`!&BPpmE9Dp-|Hgk9#L`BQZ4YDT^#j23Go7HZXy+YV@+P*b3 z44uP96}@G(EYZW&eahsM$?;0*oRQAjH+jK)W+o9p6#fmBL{P{dNlGkUbsoU-IUyQD znA9zmuk_K*XB?EvxaL;vgAq6KeRPt>Q;jT2`+&lBEwkV60$cSRkLGq$%1p`LJS*KG zRg}Ox^gs@5Wg<0$N0&hh;a&&&6%imJ8aOoRBBWIm#E7{sE+3yfPU1QE1b9tLd3$>G|b~jcp35g<+ zP&M*3N@_7HaVx+(+2f$Oe1NxT>2_p`I}^~gXX~_G8Ek1@U5~_FBS$Z4EFA5p(E+wB zAk#+Dj}`2RB-c;mcu~^URn5~F*8#3j3GeK_T8YsK+e`Mbpu;uYKS_*b8LSmvKi_s7 zv?>2Z@H@^F8)8mMvDx`z?B%t`{iQ&G`|a+1V=X6xk=9}R&*mxR74~^cj5EJN!HL_~Lxwi~og8WeuAZW+bnBpEqznAWig;vjX=M zN*JxRyu(_2iRECf>FFuZLc!F6IG0YZ16fpw#=0dsU4PDp5og%;Fa*S-w%V-;9x3u% zp>At;`iGDo^CLiBVGMl;?+Mg{sIG6&t1FnnD+ zd((c#>Da9{i>EJdRtLu0xhH52BQ0YixZE5*#;7JlmO=21SE05Iy=V_pPPfeausJ_j z{H$?`VD6~mDhBr$qk(AW*f0sRAT>|ON1sKj;0*~cK@F8UCq zp3KSql$rgeQ(8a*p-CDj-{*I)Z;&3^2N%aFSTULsfbBH1-;Fp|Lw`RHM0ATrGnO9^}AN0>nc9 zI53^*>qRn-X1VlQ1P<{_0d<*B=J{j|kosEtMzW&2L=slq$3Gvvwxsc+E~8>9dvc! zpU9I+O$6$E-*mrst_buxS3b7;T3+82L$fO% zSX$8Cbz##28s&ogn~%fToux|IQ@4HQ>kR>+8@XV33kVj^bFzacEh=n=J)Wuzh zU$J8Q3);xfEIg*?c=1M2FIcJ2+cgE?SM|YAvD^X7$LQx^r7hBjAoH4Vv&0UpKI|LAWH?9PQ;Kl=;NY%e-rLH7+KkVWi(k}dno=lRFeO@Y&6S&rm!kVd?A22- z^#-)LD;MTrlHttB?s#xFiH99wR!X46oyc?27jE@0sSwfw6^fd%S($bt^F+?Y& zT2ag=oxlr-o5RbfL=?PyW@^I-7-wdj;~s-ktorec3KPj#l@bs~t%ly|Izc4S5VHcR z!fq)`4lB*^t=}iFLXomRWf4t$_OW7INHPK=blr#PB5v5#3~|{RV7|u;{KLT8GBSFy zvj5UxaD{zNb2d{dS>qxrRXWEPlu6qeHj>imylN@I$13AVtVl!6z>~%`Gmv*WBcgjH z)Td&r4b`hQ+uG=3!dOj%32&YY$B-M0D(%r@9U_UJ5iOu#1?PvB=Ope*uVIr=3!|Ip zDs1l-Y=c%>h5j+sD2$@~)I5fIV93dMziz<>EaTbx3Rk+cx>-r71|i|EKNOQHvG0ueTx~@yGTASJ*Dq0?Hh7o4{5bu z9hX==2>P5uUK5OThcTv9oJ6p1c&fJRuU%nNbw9qR_4|n;Np}tv51p$p>-%{gE~M7G zvLQo#<`2u%)n%*ILm{48$MEvJHcl_87UQKo@7!ekm1Tl#l=4WjjaMeX0i9sr!$#l( z$>(G6`dQpQgTvcmRt{CkI%LpYLr2uM4xUZ8=o`G)#q0cHN{H934XdLf60 z-}49~BsW~LbdNtL1_4sJ$_)r!>jzpvy_=R1#V7MCD_)$M&NO45VvgFP#I_t<3Ot0; zmQ*pBzPu|PBUg1AF)j|+m_>0T(a(8iv#Q&Yvb^;a8`2@wZ)6(}nL-uWBSs3LJ^Fi7OybGJ7(om^PHjDTH0 z?&afDZ(TV&rtkCK-mBhPo2z1skGpMi@s*fyw?&KD*yuxKvi5hGwyIL4MQ`_(K*HQq z)|cTT@?2gHq4{3=D%jroMCTi66tkn0GaB;8`wM7x=PK#RTTx>28z-XPBJ z>z<^2*pnKa+cYDfPq2+Rnc(o`WB1@_QE?1oFEMxkx3nxxZ)>q{V5{d8!33o#$*G)K|32h!+Toee$H_GB2i zJzBQ+j%>8$^5X`%!U(n(qe|C=dks?1$c;ZK>WRpdu;t9@Uz3{ohlQU!r2N{d^QDJ0 z+js^(@cfWzx<9qFU1Z7S=;32??IiZ+rzXmO;LvI0f+eqmrQm{gkHGFwaf4hzr}aLq zC;9k~6yC027X|BQleGLf6YTHO_YS6ZMtX+-ZqdFdU-+VbAyespAEA?gfFNS_K-@Jx zHzV~2Ku>E-Z`b3MLqc*qEy)!O<`g$adb;2sBvO;kU|I|p%079>gktk#z=>9ak>%~4 zU#6W^-}_@|r$r|}=KXF)zM!0D7w&*VMin>=Iha1i(OzTO-@%i`lWY>m%Qq~OEk+Vn zTAmuCdhFKE;$v9jyZr}UCkC4&9sazLb|==i6^zn&-9)H%(4y(jGPo6FZM7~H=yNXz zI*;rAEt?B^SO2UxltP%M+^xZn-vTy(Dn#TV=pS0EP>n5gKOjfc_?M3iWdX?hEe>Bv z(m#aul{B%sR;wN77OzVZLcX=|~~XM#S&+PFXd<2Ep5INge6Z(4EE z5Vb_>blgo9;21H25qe2OsYjJGRA5?a)fVmHLpP|c(5&k!n};w&H>klcfpqO;6abQ! zu=d9qLNpkm`y08cNIY3Z6BQ2!ul)n4`#mFz@dFOdH%TgTQU4%>9|iM;Vtb8hiO81; z8&Cu`0bZ)HeACl zcH|>chy)o-KmkpWPN$--+Mrsgi%*OT8_?YB%F(P#!3JCX!C@cRTCwHBSeWu~YO78U+?smtRm`0%;cIQ>slZbkCU?qIVmQsUKhPqW;fSa;` z+UGns?`By>RVZ0MO z;y6mDw4MFMxSOcTp76Id!H!D3V)SerTwHfNp06T0NB(0+#`EUtRn@ym`jd07!?r(Fn~EYuR?dtk;3%lOAM z>RR|`@J&G29gb_Gwbi~1SERrfY`wu&05ur`hDNOgl%-8os@#h_xG~Dlfnlx&bzD~*eW%jvMW}Q^$Wcw}O+R?F(gfukP_ZhUz z@N*}%h-I{+B$@jsp`=O)A*FYfM)TVP(|1CyQAHYhh;cEbn!tjRy!M9rL$d=~0o0WF z?+hmWEkrzUU3H?jL?v6&CWjo|{&R6%RWebE{paWpHu&E^SUZ?m8QJ~2J^EsN;fwu+ z3Pq{t<3Gp2&V3ueu@pHZaGQ~+Z`Bjc&aD8-C5O_7aZf@gk6m*rC42A z(JVdbELlVr$*M}zuV?A$2$Z{dK3E12%w=|zgF+}xa& z>IJf=NG;C0085KbQPa^deWzBuLJDI@YBe^D=1L&>f z8hIJzV9-k@&l7-q>3(*D?_HDpgBk_3enSW1Jn^_Nqx`{YkB`sWDnJX$YnrSBmg8*D zV!r77PeZtULM!u9^8p)`d=uI)(Fi9Z+Qe=!&0;gusB>xez0$l0AMXS=haNs=3* z->~dYqz6@`e+YQWetNE=60Rhp5zCm0Xu+1|B%%y~#TO?oz0@%z^*bgM+Y4g`)PL^# zD1;dc)SUuLBokyiaYp_6(rv`DKx})T;*Kz2WxbZib82Tcz(3 z_NDu6h8lB~C%rUhe3}ZJrF32dPs4b)C=?C}{pxl6U2?L7l9gn|f7ZcS^G?2PF&F}C ze`s&!Kh}w!D6VKye^$z5jQ<~ftBsANzMkE`#y`I(U-+Vbp-=VSeQPiSr0pqDRJ^rJ z=vkg>JZMU*<8RK2K3<6gs!wb1f;d)-j~7^)I3hLWxZJbr?-ILPzda5(f(wYfNIl_= z%3{&C%*K%=A=u6|PrB;dSlm}Eb#3vmx=AT; z_75{an_X&0Kr*qshT&8Z-|cvgte7|_aIljF28tXcy+TI^lJWx+HSUiPk=MYgmxO}} zQX27O;J#B2;JWTDU`kAi_MFujl!E9uPVJQeM#(6~FEVeMrk+7&KdlX;k)bzLRHEpE zi^bNriU-=EE6?-cBb`Po*a8=a9LW(tCaXl0Sf__Kzhegs@`sa*VFw+dv@uUwQ_w+% z_OLK=A(>R&6}d#vHJ31}a_XS3L&4BN@0|#HPmENJ9i(s_hasD$WFpe;)qi7D&txGIzNAut zQEI=Q6`BL*UWCzBA#WOOau{oui}#o?sN@E2_Gcj`6sZnJLgTwRve@FO2X`X}8xgtG zlV6w|+Rs2E+8br^eaaBUL-I*o_FG~D_7(evhu@Kufg(zcn>+%wuz9Sp)KQA!rSYVt zqgP4K#qfnl=T7>#+N^mg@^86iZI-)9a)x<+scWb2DpBZhiIE-QX0S1Fh8s~vn4|re zliWQ0?NFTU(3HC}qGSD#r&6{*a>Al!*?SI=T2%~{L-OIuma@j44up#}<n1)LPw4LLf{CtAPsdrV$F4IT^$!JPxAYmd#hnA*|8<%dupNFwg=2qkRgwNbu ze~1IEtA8!EXQPXgSzwh@m$WSVx0J!0^?PW!a)q&r4~WosQ8%jGKAMd{qOA^D@)5Om zw`0JWY!vAncaiK2XCmmlefM2-44GUQ7rTQ!=7d9w-oBPS0-K@j)gPG3AJz>bG4-sS z-CHvU8FAH2$kLdW_2obCqaGvASWal=e#9A$5P_7#vNUUCAJ_q)k?^-tGHwY9f@K<0 zN?MU6q0bkS7%(wfVUb^C-`uzJ(kJ!7a7i=XEY4s^|GsUta{tXk_k`>x1Bm}N8^yX! zh4HMiWwCZ7t+r89>r#t;%FX-a%Fk0E69l4fq7C!zxa{d+@u0=;!3z3R537wX*7$*a z7^_=L0gzcrVeB-vI}}|)iQ`vU1Li>E$5iT$v0MG7fS4M+ry4wJgQrMNeeD(>pa*9} z>#sJcPVnPeVPM=QiqKH*MKdelnOezwboPp*byYff)vf%@A|*5m#534JwQS(aFx3@` z9RSf%DcI?4BMZka_aN%rZ>48j-vETJB=;qGv1e>zj>f$HLFBH9r@DXh=d!c90a+#S9L&$x$Kb@beK*9Wm7$ zi0&$kea=^4)XOy1Z|pxTUNQTwNWX1vZ|{z!$Cpvidjxo`zm`HcGARSo0jOH0Om^Z88Z@VV*2->v9$u+ua6-<;hS;|pKxFGT*oC#Y#;wJC#@UTXXEcvIXeuC7)skMjMe*-VQMf|ltP z8p^fdSnv*|uYWm{@axaIrArbZv-|>BovEDJDmxoWc9fbiG=2(XmyOo?->Vk3TQ=3f zw4ff$zo3jWJLuQ5AfkH;>2(bUjuI(ZVfNl3-57YhPn0kj1J)69~3d zG_ee&zRWcpO4+Qz_s*)$4Ms67+Go4%mK)$9s0_iwq>-x?)jLpc^P9gKaQj(58kCq@ zKnQa;BD9TlBJPTJo#&L)3%ZPtH2F}89zp3Q3tpnM^%0_YDjpDpoTX{1_ z-}uw}l*59Y?O6+P($k@ET|vb(=waesGo3;E!FjbHGWml?-;~%k6Dx>dp4c-*P}ueM zAdA+hzKoELfd1&2!>RlDUG5UpthH!5AW1@fgra_YDfQB=rlY-q<5}sY5HdBnc|p=B zXZ?PE*Gi-TH;uCM5QQN|Y@n~954HA9Y>BUI_(?KgLLY%?(spTcF&5(hR(^BzszPpU z^sZfD8A}u+jZM2CGhb2*w*8smba!?wg{agr&jVi~HlSHmwI2LOlBKi!Ri8#J@ptcF zdw@b$r=3n&2|yqu;D2USzLw!KuX=26_K!5ef2xKnl3h-J zmeT68T$F!Nt^Ye!TU$#r1HG?H@P8`Xg3NW#f8O8kpErr-FUq^0)#$%n0|Ogt2O}2; z1tUu%0|%RbM2!DgYzIuob)--6m(QY;{Y4xT?Qg_Czc2OxueV(j-s-0P?>`{y&A>u}T9$5C-72u+h#k zok^=lKrn5ZfTBgLZG>=2)Z_%ONE+d=(?TV!NRX@2gos!KQiTw~%Em6@8(8E8oC{v| zpFwA@x$aw7*oEEwXC|}>X{6t%_-Fr4@6+ekbcNiv+4HQ0FFj*21u4a$01vIaj^DrPNMuu y9nsgm1D#*6OOxMiqS+caOncKQQGQZGG&6Fb^K)ByXK{9F%bA=hEgSPbPMjacB1-%K literal 0 HcmV?d00001 diff --git a/index.cfm b/index.cfm index 566df8e..1a1aaa5 100644 --- a/index.cfm +++ b/index.cfm @@ -5,7 +5,7 @@ request.version = DeserializeJson(FileRead("box.json")).version; request.subtitle = ""; request.title = "Lucee Performance Analyzer - #request.version#"; - param name="url.pluginAction" default="logs"; + param name="url.pluginAction" default="analysis"; param name="url.xhr" default="false"; variables.plugin = new source.cfml.plugins.Action(lang={},app={}); @@ -28,7 +28,7 @@ } } - + @@ -47,7 +47,7 @@

diff --git a/login.cfm b/login.cfm index 6d30c43..b7dcf99 100644 --- a/login.cfm +++ b/login.cfm @@ -21,18 +21,24 @@ variables.login_error = cfcatch.message; } } - variables.plugin.getRenderUtils().includeCSS("style"); + variables.style=FileRead("source\cfml\plugins\css\style.css"); // assets require a login - + + + \ No newline at end of file diff --git a/source/cfml/plugins/Action.cfc b/source/cfml/plugins/Action.cfc index c5d4909..cfb6991 100644 --- a/source/cfml/plugins/Action.cfc +++ b/source/cfml/plugins/Action.cfc @@ -30,6 +30,10 @@ component extends="lucee.admin.plugin.Plugin" { setting showdebugoutput="true"; } + public function getRenderUtils(){ + return variables.renderUtils; + } + public void function _display(required string template, required struct lang, required struct app, required struct req) { param name="url.xhr" default="false"; request._missing_lang = {}; @@ -40,18 +44,18 @@ component extends="lucee.admin.plugin.Plugin" { variables.perf = new Perf(); cfinclude(template="toolbar.cfm"); - super._display(argumentcollection=arguments); - cfinclude(template="related.cfm"); + cfinclude(template=arguments.template); + cfinclude(template="footer.cfm"); - variables.renderUtils.warnMissingLang(request._missing_lang); + //variables.renderUtils.warnMissingLang(request._missing_lang); } public function asset(struct lang, struct app, struct req) output=false { - param name="req.asset"; + param name="arguments.req.asset"; // dunno why, sometimes this doesn't exist and throws an error if (not structKeyExists(variables, "renderUtils") ) variables.renderUtils = new RenderUtils(arguments.lang, action("asset"), this.action ); - renderUtils.returnAsset(url.asset); + variables.renderUtils.returnAsset(url.asset); } public function getLang(struct lang, struct app, struct req) output=false { diff --git a/source/cfml/plugins/aborts.cfm b/source/cfml/plugins/aborts.cfm index 8d17e99..715c577 100644 --- a/source/cfml/plugins/aborts.cfm +++ b/source/cfml/plugins/aborts.cfm @@ -9,7 +9,7 @@ - + #renderTemplateLink( arguments.req, local.q.template )# #local.q.line# #NumberFormat( local.q.executions )# diff --git a/source/cfml/plugins/analysis.cfm b/source/cfml/plugins/analysis.cfm new file mode 100644 index 0000000..8c357e4 --- /dev/null +++ b/source/cfml/plugins/analysis.cfm @@ -0,0 +1,4 @@ + + + cfinclude(template="related.cfm"); + diff --git a/source/cfml/plugins/css/style.css b/source/cfml/plugins/css/style.css index ac497d7..215be60 100644 --- a/source/cfml/plugins/css/style.css +++ b/source/cfml/plugins/css/style.css @@ -1,3 +1,28 @@ + +.maintbl td, .maintbl th { + font-weight: normal; + empty-cells: show; + border: 1px solid #fff; +} + +body, td, th { + font-family:Arial, Helvetica, sans-serif; + font-size : 12px; + color:#333; +} + +table {empty-cells:show; border-collapse: collapse;} +td, th { + padding: 4 4 4 4; + vertical-align:top; +} +th {/* like .tblHead */ + background-color:#39c; /* ABC */ + color:#efede5; + font-weight:normal; + text-align:left; +} + th a { color: inherit; text-decoration: underline; @@ -13,6 +38,14 @@ th a { text-decoration: none; } +.toolbar-file-filter H3, .toolbar-file-filter H1 { + margin: 2 0; +} + +hr { + margin: 2; +} + .log-totals TD { font-weight: bolder; } @@ -46,4 +79,13 @@ a { .alt-row { background-color: #DFDFDF; -} \ No newline at end of file +} + +.header H1 { + margin-bottom:2px; + font-size: 1.5em; +} + +.header { + padding-bottom:12px; +} diff --git a/source/cfml/plugins/detail.cfm b/source/cfml/plugins/detail.cfm deleted file mode 100644 index 45c2b3e..0000000 --- a/source/cfml/plugins/detail.cfm +++ /dev/null @@ -1,225 +0,0 @@ - - - - - - - - - - Sorry, Purge logs failed, it was added in Lucee 5.3.8.80 (this is #server.lucee.version#) - - - - - - - - - - if (!StructKeyExists( local.debugLogs, "data" ) ) - local.debugLogs.data = []; // getLoggedDebugData may return null - var q = QueryNew( "name,time,sql,src,line,count,datasource,usage,cacheType" ); - setTitle( "Debugging Logs" ); - var local.r = 0; - - function prettyTime( n ){ - if ( arguments.n == 0 ) - return ""; - var s = arguments.n / ( 1000 * 1000 ); - if ( Int(s) eq 0 ) - return ""; - return NumberFormat( s ); - } - - function prettyNum( n ){ - if ( arguments.n == 0 ) - return ""; - - if ( Int(arguments.n) eq 0 ) - return ""; - return NumberFormat( arguments.n ); - } - local.midnight = CreateDate( Year( Now() ), Month( Now() ), Day( Now() ) ); // hide todays date - - function hasJavaMethod( obj, name ) { - loop array=arguments.obj.getClass().getMethods() item="local.m" { - if( m.getName() == arguments.name ) return true; - } - return false; - } - - - - - local.log = local.debugLogs.data[local.i]; - if ( StructKeyExists( arguments.req, "since" ) ){ - if ( DateCompare( log.starttime, arguments.req.since ) neq 1) - continue; - } - - - - local.src_rows = local.debugLogs.data.len(); - local.total_app = 0; - local.total_query = 0; - local.total_total = 0; - local.total_load = 0; - local.total_size = 0; - local.total_scope = 0; - local.total_exp = 0; - local.log = {}; - local.rows = 0; - - - - - - - local.log = local.debugLogs.data[local.i]; - if ( StructKeyExists(arguments.req, "since") ){ - if ( DateCompare( log.starttime, arguments.req.since ) neq 1) - continue; - } - if ( local.i gt arguments.req.maxrows ) - break; - local.rows++; - //dump(local.log); - if ( !StructKeyExists(local.log, "scope") ) - local.cgi = local.log.cgi; - else - local.cgi = local.log.scope.cgi; // 5.3++ - var path = local.cgi.REQUEST_URL - - if (local.cgi.REQUEST_METHOD eq "POST") - path = "POST #PATH#"; - - var _scope = "0"; - if ( StructKeyExists( local.log, "implicitAccess" ) and local.log.implicitAccess.recordcount ){ - _scope = QueryReduce( local.log.implicitAccess, - function( problems=0, row, rowNumber, recordset ){ - return arguments.problems + arguments.row.count; - }); - } - var _total=0; - var _query=0; - var _app=0; - var _load=0 - if ( StructKeyExists( local.log, "pages" ) ){ - loop query="local.log.pages"{ - _total += local.log.pages.total; - _query+= local.log.pages.query; - _app += local.log.pages.app; - _load += local.log.pages.load; - } - } - local.total_size += + SizeOf( local.log ) / 1000; - local.total_app += _app; - local.total_query += _query; - local.total_total += _total; - local.total_load += _load; - local.total_scope += _scope; - - - - - - - #path# - - - #DateTimeFormat( local.log.starttime )# - - #TimeFormat( local.log.starttime )# - - - #prettyTime( _total )# - #prettyTime( _app )# - #prettyTime( _query )# - #prettyTime( _load )# - #prettyNum( _scope )# - - - #prettyNum( ArrayLen( local.log.exceptions ) )# - - - - #prettyNum( SizeOf( local.log ) / 1000 )# - - - - - - - - Totals - - #prettyTime( local.total_total )# - #prettyTime( local.total_app )# - #prettyTime( local.total_query )# - #prettyTime( local.total_load )# - #prettyNum( local.total_scope )# - #prettyNum( local.total_exp )# - #prettyNum( local.total_size )# - - - - - -

This report is based on all the debugging logs currently in memory (#local.debugLogs.data.len()#), click column headers to sort

- - - -
- - - - - - - - - - - - - - - - #totals# - - -#body# - - - #totals# - - - - - - - - - - - -
UrlTimestampTotalAppQueryLoadScope ProblemsExceptionsSize (Kb)
-
- - No logs found? Is debugging enabled? - -

Showing the top #arguments.req.maxrows# logs(from #src_rows#) -
- - #variables.renderUtils.includeLang()# - #variables.renderUtils.includeJavascript( "perf" )# - diff --git a/source/cfml/plugins/dumps.cfm b/source/cfml/plugins/dumps.cfm index d94561f..0fffc7c 100644 --- a/source/cfml/plugins/dumps.cfm +++ b/source/cfml/plugins/dumps.cfm @@ -9,7 +9,7 @@ - + #local.q.output# #renderTemplateLink( arguments.req, local.q.template )# #local.q.line# diff --git a/source/cfml/plugins/exceptions.cfm b/source/cfml/plugins/exceptions.cfm index 98c3426..d0386b8 100644 --- a/source/cfml/plugins/exceptions.cfm +++ b/source/cfml/plugins/exceptions.cfm @@ -8,8 +8,8 @@ - - + + #local.q._type# #local.q.message# #local.q.detail# diff --git a/source/cfml/plugins/footer.cfm b/source/cfml/plugins/footer.cfm index fee2148..c2ba7ca 100644 --- a/source/cfml/plugins/footer.cfm +++ b/source/cfml/plugins/footer.cfm @@ -17,4 +17,8 @@ #variables.renderUtils.includeLang()# #variables.renderUtils.includeJavascript( "perf" )# + +

+ Lucee Performance Analyzer +

diff --git a/source/cfml/plugins/memory.cfm b/source/cfml/plugins/memory.cfm index 682f2ee..c88cd32 100644 --- a/source/cfml/plugins/memory.cfm +++ b/source/cfml/plugins/memory.cfm @@ -5,7 +5,7 @@ local.configServer= getPageContext().getConfig().getConfigServer( session[ "password" & request.adminType ] ); local.webContexts = configServer.getConfigWebs(); setTitle( "Memory Scopes" ); - + local.r = 0; local.rows = 1; local.total_app_size = sizeOf( serverScope ); local.total_app_keys = structCount( serverScope ); @@ -38,7 +38,7 @@ local.total_app_size += local.app_size; local.total_app_keys += structCount( apps[ app ] ); - + #config.getRootDirectory()# #app# #prettyNum( local.app_size, true )# @@ -56,6 +56,7 @@ + diff --git a/source/cfml/plugins/perf.cfc b/source/cfml/plugins/perf.cfc index ccfa244..70cfb31 100644 --- a/source/cfml/plugins/perf.cfc +++ b/source/cfml/plugins/perf.cfc @@ -2,6 +2,7 @@ component { this.debugLogs = []; this.debugLogsIndex = {}; this.filtered = false; + variables.cfquery =""; public function init (){ admin action="getLoggedDebugData" @@ -10,10 +11,11 @@ component { returnVariable="this.debugLogs"; timer label="prepare Logs" { loop from="#this.debugLogs.len()#" to="1" step=-1 index="local.i" { - if ( !StructKeyExists(this.debugLogs[i], "scope") ) + if ( !StructKeyExists( this.debugLogs[i], "scope" ) ) this.debugLogs[i].scope.cgi = local.log.cgi;// pre 5.3++ - this.debugLogs[i].size = SizeOf(this.debugLogs[i]); // expensive, do it once - this.debugLogsIndex[this.debugLogs[i].id]=i; + if ( !StructKeyExists( this.debugLogs[i], "size" ) ) + this.debugLogs[i].size = SizeOf(this.debugLogs[i]); // expensive, do it once (cheeky, debug logs are writeable) + this.debugLogsIndex[this.debugLogs[i].id] = i; } } if (IsNull(this.debugLogs)) @@ -101,7 +103,7 @@ component { if (len(reqUrl) gt 0){ timer label="logs filter reqUrl(#reqUrl#)" { local.logs = this.debugLogs.filter(function(row){ - return arguments.row.scope.cgi.REQUEST_URL contains reqUrl; + return arguments.row.scope.cgi.REQUEST_URL contains variables.reqUrl; }); } } else { @@ -164,7 +166,7 @@ component { this.reqTemplate = arguments.reqTemplate; timer label="query.filter reqTemplate(#arguments.reqTemplate#)"{ local.result.q = local.result.q.filter(function(row){ - return arguments.row.template contains reqTemplate; + return arguments.row.template contains this.reqTemplate; }); } } @@ -175,28 +177,28 @@ component { // TODO since function getTimers(logs){ - var q = QueryNew( "label,time,executions,template,line,requestUrl" ); + var q_timers = QueryNew( "label,time,executions,template,line,requestUrl" ); loop from="#arguments.logs.len()#" to="1" step=-1 index="local.i" { local.log = arguments.logs[local.i]; if ( structKeyExists( local.log, "timers") ){ local.timers = local.log.timers; loop query="#local.timers#" { - local.r = queryAddRow( q, queryRowData( local.timers, local.timers.currentrow) ); - QuerySetCell(q, "requestUrl", local.log.scope.cgi.REQUEST_URL, local.r ); + local.r = queryAddRow( q_timers, queryRowData( local.timers, local.timers.currentrow) ); + QuerySetCell(q_timers, "requestUrl", local.log.scope.cgi.REQUEST_URL, local.r ); } } } ``` - + select label, sum(time) as totalTime, count(*) as executions, template, line, min(time) as minTime, max(time) as maxTime, avg(time) as avgTime - from q - group by label, template + from q_timers + group by label, template, line order by totalTime desc ``` return { - q: q + q: q_timers }; } @@ -215,64 +217,64 @@ component { } ``` - + select id, count as _count, min as _min, max as _max, avg as _avg, app, load, query, total, src, '' as template, '' as _function from q - loop query="q" { - local.tmp = ListToArray( local.q.src, "$" ); + loop query="q_pages" { + local.tmp = ListToArray( local.q_pages.src, "$" ); if ( ArrayLen( local.tmp ) eq 2 ){ - QuerySetCell( q, "_function", local.tmp[2], q.currentrow ); + QuerySetCell( q_pages, "_function", local.tmp[2], q_pages.currentrow ); } - QuerySetCell( q, "template", local.tmp[1], q.currentrow ); + QuerySetCell( q_pages, "template", local.tmp[1], q_pages.currentrow ); } - + select template, _function, min(_min) as minTime, max(_max) as maxTime, avg(_avg) as avgTime, avg(query) as avgQuery, avg(load) as avgLoad, sum(total) as totalTime, sum(_count) as totalCount, sum(total) as total, count(*) as executions - from q + from q_pages group by template, _function order by totalTime desc ``` return { - q: q + q: q_pages }; } function getScopes(logs){ - var q = QueryNew( "template,line,scope,count,name,requestUrl" ); + var q_scopes = QueryNew( "template,line,scope,count,name,requestUrl" ); loop from="#arguments.logs.len()#" to="1" step=-1 index="local.i" { local.log = arguments.logs[local.i]; // if implicitAccess isn't enabled in debug settings, there won't be data if (structKeyExists( local.log, "implicitAccess" )){ local.implicitAccess = local.log.implicitAccess; loop query="#local.implicitAccess#" { - QueryAddRow( q, QueryRowData( local.implicitAccess, local.implicitAccess.currentrow ) ); + QueryAddRow( q_scopes, QueryRowData( local.implicitAccess, local.implicitAccess.currentrow ) ); } } } ``` - + select template, line, scope as resolvedScope, count as total ,name - from q + from q_scopes - + select template, line, resolvedScope, sum(total) total ,name - from q - group by template, line, resolvedScope, name - order by total desc + from q_scopes + group by template, line, resolvedScope, name + order by total desc ``` return { - q: q + q: q_scopes }; } @@ -296,7 +298,7 @@ component { } } ``` - + select _type, template, message, detail, line, count(*) as executions from q group by _type, template, message, detail, line @@ -304,7 +306,7 @@ component { ``` return { - q: q + q: local.q_exceptions }; } @@ -323,7 +325,7 @@ component { } } ``` - + select output, template, line, requestUrl, count(*) as executions from q group by output, template, line, requestUrl @@ -331,7 +333,7 @@ component { ``` return { - q: q + q: q_dumps }; } //KeyConstants._type, KeyConstants._category, KeyConstants._text, KeyConstants._template, KeyConstants._line, @@ -352,7 +354,7 @@ component { } } ``` - + select type, category, text, template, line, action, var, varValue, time, requestUrl, count(*) as executions from q group by type, category, text, template, line, action, var, varValue, time, requestUrl @@ -360,7 +362,7 @@ component { ``` return { - q: q + q: q_traces }; } @@ -379,7 +381,7 @@ component { } } ``` - + select template, line, requestUrl, count(*) as executions from q group by template, line, requestUrl @@ -387,7 +389,7 @@ component { ``` return { - q: q + q: q_aborts }; } @@ -408,22 +410,22 @@ component { } ``` - + select name, time, sql, src as template, line, count as total, datasource, cacheType from q - + select name, sum(time) as totalTime, min(time) as minTime, max(time) as maxTime, avg(time) as avgTime, template,line, sum(total) as total, datasource, cacheType, count(*) as executions - from q + from local.q_queries group by name, template, line, datasource, cacheType order by totalTime desc ``` return { - q: q + q: q_queries }; } diff --git a/source/cfml/plugins/related.cfm b/source/cfml/plugins/related.cfm index fe28105..e838eba 100644 --- a/source/cfml/plugins/related.cfm +++ b/source/cfml/plugins/related.cfm @@ -1,8 +1,6 @@ param name="arguments.req.template" default =""; param name="arguments.req.url" default =""; - if ( len( arguments.req.template ) eq 0 && len( arguments.req.url ) eq 0) - cfexit(method="exittemplate"); local.subTitle = request.subtitle; //stash local.timer = getTickCount(); local.related = 0; @@ -22,5 +20,5 @@ } } - request.subtitle = ( related gt 0 ) ? ( variables.exactTemplatePath? "Template" : "Path" ) & " Report" : local.subTitle; //pop + request.subtitle = ( related gt 0 ) ? ( variables.exactTemplatePath? "Template" : "Path" ) & " Analysis" : local.subTitle; //pop diff --git a/source/cfml/plugins/renderUtils.cfc b/source/cfml/plugins/renderUtils.cfc index 72d951e..cb9780a 100644 --- a/source/cfml/plugins/renderUtils.cfc +++ b/source/cfml/plugins/renderUtils.cfc @@ -68,10 +68,11 @@ component hint="various rendering related files"{ if ( structCount( warnMissingLang ) eq 0 ) return; var missing = []; - for (var k in arguments.missingLang) + for ( var k in arguments.missingLang ) missing.append( "console.warn('missing language string: [#JSStringFormat( k )#] from cfml');" ); - - writeOutput( "" ); + if ( ArrayLen( missing ) ){ + writeOutput( "" ); + } } public void function returnAsset( required string asset ) { diff --git a/source/cfml/plugins/logs.cfm b/source/cfml/plugins/requests.cfm similarity index 92% rename from source/cfml/plugins/logs.cfm rename to source/cfml/plugins/requests.cfm index 2bfced0..d7ab409 100644 --- a/source/cfml/plugins/logs.cfm +++ b/source/cfml/plugins/requests.cfm @@ -15,7 +15,7 @@ - + - #path# + + #renderRequestLink( arguments.req, local.q.path )# + Raw Log,  - + By Host diff --git a/source/cfml/plugins/timers.cfm b/source/cfml/plugins/timers.cfm index 149fffb..a80dac5 100644 --- a/source/cfml/plugins/timers.cfm +++ b/source/cfml/plugins/timers.cfm @@ -30,9 +30,10 @@ - Totals + Totals #prettyTime( local._total_time * 1000 * 1000 )# + #prettyNum( local._total_executions )# diff --git a/source/cfml/plugins/toolbar.cfm b/source/cfml/plugins/toolbar.cfm index b37cb94..fe1ee94 100644 --- a/source/cfml/plugins/toolbar.cfm +++ b/source/cfml/plugins/toolbar.cfm @@ -3,8 +3,11 @@ param name="arguments.req.url" default =""; variables.template = arguments.req.template; variables.req = arguments.req; - local.reports = ["Logs", "Templates", "Scopes", "Queries", "Timers", "Exceptions", "Dumps", "Aborts", "Traces", "Memory", "Threads"]; - local.path_reports = ["Templates", "Scopes", "Queries", "Timers", "Exceptions", "Dumps"]; + + local.reports = ["Requests", "Templates", "Scopes", "Queries", "Timers", "Exceptions", "Dumps", "Aborts", "Traces", "Memory", "Threads"]; + if ( Len( arguments.req.template ) || Len( arguments.req.url ) ) + ArrayPrepend(local.reports, "Analysis"); + local.path_reports = ["Requests", "Templates", "Scopes", "Queries", "Timers", "Exceptions", "Dumps", "Aborts", "Traces"]; local.lastLogDate = now(); local.urlExtra = ""; if ( StructKeyExists(arguments.req, "since") and arguments.req.since and isDate(arguments.req.since)) @@ -21,15 +24,25 @@ if ( variables.exactTemplatePath && DirectoryExists( arguments.req.template )) variables.exactTemplatePath = false; - function renderTemplateLink ( req, linkTemplate ){ + function renderRequestLink ( req, linkTemplate ){ var temp = arguments.linkTemplate; - if (len( arguments.req.template ) gt 0 and find( arguments.req.template, arguments.linkTemplate, 1 ) eq 1) - temp = mid( arguments.linkTemplate, len( arguments.req.template ) + 2 ); + if (len( arguments.req.url ) gt 0 and find( arguments.req.url, arguments.linkTemplate, 1 ) eq 1) + temp = mid( arguments.linkTemplate, len( arguments.req.url ) + 1 ); + echo('#htmleditformat( temp )#'); + + } + + function renderTemplateLink ( req, reqPath ){ + var temp = arguments.reqPath; + if (len( arguments.req.template ) gt 0 and find( arguments.req.template, arguments.reqPath, 1 ) eq 1) + temp = mid( arguments.reqPath, len( arguments.req.template ) + 2 ); if ( !variables.exactTemplatePath ){ echo(""); echo('#htmleditformat( temp )#') + & '&template=#urlEncodedFormat(arguments.reqPath)#"' + & 'title="show only problems from this template" class="toolbar-filter">#htmleditformat( temp )#'); echo(""); } } @@ -51,7 +64,7 @@ } function altRow(currentrow){ - if ( arguments.currentRow mod 2 eq 0 ) + if ( arguments.currentRow mod 2 eq 1 ) return "alt-row"; return "zzz"; } @@ -99,7 +112,6 @@   (clear) -


@@ -142,7 +154,6 @@
  (clear) -


diff --git a/source/cfml/plugins/traces.cfm b/source/cfml/plugins/traces.cfm index 1790095..9ec7ff2 100644 --- a/source/cfml/plugins/traces.cfm +++ b/source/cfml/plugins/traces.cfm @@ -9,8 +9,7 @@ - - + #renderTemplateLink( arguments.req, local.q.template )# #local.q.line# #local.q.text# @@ -47,9 +46,9 @@ #renderTemplateHead()# + Line Text Type - Line Action Category Time