From c27a161920a2227cd04f8338a75732920694b1db Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Sat, 10 Aug 2013 10:06:58 -0400 Subject: [PATCH] update metrics-core to 3.0.1 patch by dbrosius reviewed by jbellis for cassandra-5838 --- build.xml | 4 +- lib/metrics-core-2.0.3.jar | Bin 80800 -> 0 bytes lib/metrics-core-3.0.1.jar | Bin 0 -> 85449 bytes .../JMXEnabledThreadPoolExecutor.java | 4 +- .../cassandra/db/ColumnFamilyStore.java | 55 +++---- .../cassandra/db/commitlog/CommitLog.java | 6 +- .../db/compaction/CompactionManager.java | 8 +- .../locator/DynamicEndpointSnitch.java | 19 ++- .../cassandra/metrics/CacheMetrics.java | 42 +++--- .../metrics/CassandraMetricRegistry.java | 46 ++++++ .../metrics/ClientRequestMetrics.java | 24 ++- .../metrics/ColumnFamilyMetrics.java | 142 ++++++++++-------- .../cassandra/metrics/CommitLogMetrics.java | 17 +-- .../cassandra/metrics/CompactionMetrics.java | 22 ++- .../cassandra/metrics/ConnectionMetrics.java | 48 +++--- .../metrics/DroppedMessageMetrics.java | 11 +- .../metrics/HintedHandoffMetrics.java | 13 +- .../cassandra/metrics/LatencyMetrics.java | 23 ++- .../cassandra/metrics/MetricNameFactory.java | 4 +- .../cassandra/metrics/ReadRepairMetrics.java | 14 +- .../cassandra/metrics/StorageMetrics.java | 7 +- .../cassandra/metrics/StreamingMetrics.java | 15 +- .../cassandra/metrics/ThreadPoolMetrics.java | 34 ++--- .../cassandra/net/MessagingService.java | 6 +- .../net/OutboundTcpConnectionPool.java | 2 +- .../cassandra/scheduler/WeightedQueue.java | 4 +- .../cassandra/service/CacheService.java | 16 +- .../cassandra/service/StorageProxy.java | 18 +-- .../org/apache/cassandra/db/KeyspaceTest.java | 16 +- .../org/apache/cassandra/stress/Session.java | 33 ++-- .../apache/cassandra/stress/StressAction.java | 2 +- .../cassandra/stress/StressStatistics.java | 2 +- .../stress/operations/CounterAdder.java | 4 +- .../stress/operations/CounterGetter.java | 23 +-- .../stress/operations/CqlCounterAdder.java | 4 +- .../stress/operations/CqlCounterGetter.java | 4 +- .../operations/CqlIndexedRangeSlicer.java | 4 +- .../stress/operations/CqlInserter.java | 4 +- .../stress/operations/CqlRangeSlicer.java | 4 +- .../stress/operations/CqlReader.java | 4 +- .../stress/operations/IndexedRangeSlicer.java | 4 +- .../cassandra/stress/operations/Inserter.java | 4 +- .../stress/operations/MultiGetter.java | 6 +- .../stress/operations/RangeSlicer.java | 6 +- .../cassandra/stress/operations/Reader.java | 6 +- 45 files changed, 397 insertions(+), 337 deletions(-) delete mode 100644 lib/metrics-core-2.0.3.jar create mode 100644 lib/metrics-core-3.0.1.jar create mode 100644 src/java/org/apache/cassandra/metrics/CassandraMetricRegistry.java diff --git a/build.xml b/build.xml index a72adf4980..17b3705328 100644 --- a/build.xml +++ b/build.xml @@ -371,7 +371,7 @@ - + @@ -450,7 +450,7 @@ - + diff --git a/lib/metrics-core-2.0.3.jar b/lib/metrics-core-2.0.3.jar deleted file mode 100644 index 729e6e8e52715db9309f9bc2a50117278edf9ed8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80800 zcmbTd19WBGmNpz$?4)Abc2YrwC$??dsMxk`+qP|^VjGp@OZUCE|L?tjkGFe#=bU}C z*BX26`ApBbWC5UH&_Mt3;51U@|IaV~e1rP>loD1HpcR)Ep_l#VFi0SduVDr~)6gbg zr@g-p)c<>!lz_Cjh_Hepos`I()Woj(QjcW+2L6 z2U;09+M5|T{LKW6|9*mjjlI#|%)-rc&H0U?8AR5Fj9i|NdhCd3QpVHU<_XLbgtdW>!Z3`Gd~DQqRF5G7cbv zDu6ir+1P%54ogfyK`>(A1`cV59Dx&%(gOrsH!i>)fNd5uHOGZ8$8FIUy!Q(S4Bi{) zM?$W9$~Ckc-9wd*lgd+ew@NoKjqaQP<~th~!%S#1h9g6O3wjW31Y#Rjy3Ufy(&L%O zTlpC^cR=VG`;CxmZb-T|iT-RtY=lC!T|ps7#Z{#Q5lcM_#N(c4Lh1f{4iyJy>k~j zNvsP|o|rj(T&c3aI1DmvXNC8z_g$PG73l81B?{HJKuY%XOIm{y0eb@Gx#8l~B)Ha! zt)^;;DuxqdkT#6c_x%)t30@y2z31$~fK#7k@nf5@1sjXW)byWxehlx1F7HblhyrQH zDB8Tlc!I^o#@ROsCAZxacRvVW)2wQg4AYbQ>*9H%S!*v--oUvG@_~|#IAOd8V3IDS zfZMLAKp%40Z9aMy$xJ?f?jj5Koe=jFdjN5NQ@nn4el<-3u7F9HlH(YEcDV?L^@t~Y zyN+u#V_rT9@`C%9RQ&^c<%@e7sxR!%zYfO#5ql*EBl~{?KT)<_8k7++LyE5Tpd|)z z3mhC791#i7K#(RTmJ>o2v&BinkYP3IA}}T@C+kb`48#YmmyXKs8xXE`aXxWAc7Px_O1A3%H@n9555Dn z*AMdiTV?csC8b?Q`A`AtIuAkjqQ)BkjPHTA`~G^ysOffv0Y(xD%EsX15ok2WF5WHC zo@MuxmpKlCOiT*tp$aEYqylr@`v^S3a1R(~lx#C(_aC)>H4nvUGdI|(Qx9<1lVS1{ zf-o&*#a_p8@8$lh6qx@C&@ri>Q%_-vsvkHgs>sn zvTlEVU-;aKIM{$^{sKe=?^ED3{yHT8E8#cx?1H+!h>ipb1VsEl5&j=?7AUVFv%rt~ zVcgtcNog+!mMpBP2B#~C5+Q?(QpXRX_TUTX+dpSG-DzN*UkboC>iZ3xANr#Q--w5~ zy*DuU!D#A&d;3LN#^>|p2BwEAD;RPHvi8?7>$58CHAz6Q$S>nx#lT4zd5_7r{G@f2 z%r~ihn=FY%m2O$%8G3&hl8tk4EUm6A@tol?(7A~Kd(2rRa|59?5y);dOvDD?ye4;S zN)*v-Fv`ZMMPaqMxnp5ba1+N|jOIwSw-yspFAe?9h^-SM-^8n*3+yctZ~?F$bYdl_ znIi}t3&J|`4sO4@gOO^^Uo7zfS06SRPc83$Uqv1c={y+AopSEgKnEH zJ<|hoO@qX_$(DHDF}km^B;*(>;PGwWSU}(3Oxy@jf+*#%i0AwAwx}wVE?G~efN`^P zt&<6C0zB6ux5UG=vjGg-8@9rn{Utg z5zOsIrG;zWEA0-&%qCMAsh8E;+dd$weNiB2>Zk~)jyrm=o2v51t^>QzPU&Z{g96;ETUOM2=Aag4O{ zn~0F4CJ11C8qRXi_lJ^zOQmt}lYt^Bn+6`i>;i z`=AFb+A(bZ%$QSs=r_N9V_Wx>oIUy($dAAaT0!OI+jg8A>xvf>lW7S2UJ4VkfZ*5> ztwnH;wmW@r-b0XS7jS$og29uCw~>>6O1?`LbWCfiocwDXb+TJnevFf=TK3rkqK=F5 z6Pi#ym_bu$g#@gsq@as{$1ZB5T_iznfZ;F~*3G3bsBg(?gAhl6dp<#~0qG2nQG&&Y z1({*32*bF5DSsuva>y(TRlQ`t03u`ImqJF$TL=KPf3XeY21hF!q#@);r_^8pjR6bB zUA^)F^$sJGcu9<0$n4CCpccpw2PI*G06vms0@LBHG|)!2Pd7mpS0d?_jW;0yUyb~p z#47o^qMan~M-bSh!iVFgE*YajxCDWC_hcL{nGCc8-o9JicOHuyguhA=my$m{s6EUeP! zzRfo$^$tVx1IOa_py<-?8AFA)S0`QS6z5?AgoULH;K}LkJJH z0^uEHm+ZdHZU+t|s{l#BJV;y^c2W+tjVS7e`zWK(_H*@&N9)S;tlmN@$i{xxafA&K zb2VcdfgS_(S!^V*U6R{PGL!#dkO0wC+wSIG1%>|Bx4O$rN>lw331TsCWJ{*~l zE`AqA@s)BDqe-nD0rRJh0)>w_&EK88`tl%IzpVS@q)zIy>jeLFCnd~uF&UWA>L?98T z&_0}cXTb=?(%N=U*Vr-~))^BgLgtV%Jb%1#&!k1F8h;@Sm_tIVR4Zl~p-v4y59a&# zI3>zcjrEJns}woA!dw(A*PnMrrSnsKDJLS)<60k-+9AgMtYWxrb4DhUp}$C zk%N<^<3AWIQCUktLkU%jT!&rUMjjHs5gdG7LI`AFO}U&OknWe0tD8$uVnx3z0g@cB zMY0&Rk1$KF)4+E-jDb!$**#_l!CQA<2SbFdtCLnXq?`9Bk}ooU%vv{ z@4QFWWd9)u-+W-J(T@vkW&cOQ+S^{7z_Gt#p`z>;pAuE7^AZykT0Id%%y=?8^Hb!c z)cllXno@g8wc)MN`h;X!kP@vSjIsBAg8>f>Vn!z;D=!^E5t#m}eW^UF#3FcqS*rKY zvQRX*k#jcH_=Z(lVpy#)G>QG$5HGO-W?|z5PG`arNt)TZkw#AbiEWo|ayOGQP5hD2 z=tuu7jNy2>qce*NP3p2mI&~2*eJ_atNO^XGW8bIum@Y$~j`*z-e4ZM@FFTHhlidPlKd z>dN{S>-xhN>*cA{%gNMmw})TL99SlTawf&L>}?_mP=6kcv2xo;qZ&o2r(L>`K#AC^X26YLqI#r)E2z8;IX-eY_oPRI_-QFzCi+VCW)t|X-k%U zq1(*`pn_dq%E`<6%iB|eVrmX`$syP*6 zp~36~(IHgGuer8<@gpqr-4hWqPdW*bX-rPAo8Tg4W#k&iwOdc!qPW7|#MJZu7>6XasaZ+{^O{&tsKoINXEJuj-(T>00rwcn7a8jR9`ffYUVw-C;z0LJqF<%#o7un zGWYM5eJiIYd#9vk+69Ta$I`_6^Wu9NA7R|-INt^6B5z?+4}^LW`J3`>tg zJZEN}z*p`V!B1H9Zdi9}wvnHCO@C?|GCO*)4hw4DtIA{M8U>s#YYl$)EU?gN~g(2ON)JC%JiF1qbD{&PJf$ z3jG}yy)F0okt+jByylv3p464EKfx*f4zjQ^#MJHv*@Pt`C@S!e!7bkNTx%|GQQE|k z(dY;F@{<@qMx~b!6F}+LhPquk-XE1=H;Ci5tlb1YAZrL*QE$qIx-LB&InFi|hoKBd z%?VHBXejxoKj|)(6v`gX0`) z>^x^OG~a4AS4OX$*bosn{3OZ7Wu|q+6VGEMY5IbbnsIkN9z+6k=JalI*dHM1`ft7Gsah-5g!0i!?SZob|_q(pfYfjYVNQi+a zn|Ua0>pCrXnRJL$4qcs6WffxgD(`qK|pzojqGQuiKb5n%b)T zU@XTsYX!+)@Sz%8u43#ut-fWsnYv}cO35HkMoDr*7P`r(TW{Dr7Ium{carZ*p=}5j za?y2Aa@V4o%JKpqsDG^vUE^ERMs#LRw4)|*JWtFc0a^S`7WS@rpdR8}J`d6QWpHmi z3GrAlcdgMCZ_T4pnAz{pZ77IbTJ{W*v(;EcET}MFWGo0+NoklP)y3=g zgCL0_Bq0Tttm=wAwF4N}!8=yYZP~k|-EM`B@rKb^2dJY^^_)p$x)N0hQA#aEaU*rE zq^nca+zZmgUMgt{slCEGx<4R)<+@?i=@*qRjx+qS(0`Y+_`kSL-pItv!O`CBAKX`| ztf7Lfg!&m(t8-ab$*sOgfznp z5$SgK`^q5AcA_-Yc6*gnE!d*4<9-hGzBo(BBL-SD_|z+6Ip4v-(*+;8I4ntPB4zen ze+5JHDO_{Dr8C@EVWw^EhPT{937I4#aNHk`_`-;yf>@IoX34U6{1k>jeALQ!6$OU+@(v0day)#W#7+v;zs#9^!C z3UW~kjo%I(rRW)H5Ofb<;Sti|T|eV~(=09$bIQ6b;x{KPu(t9#yI%<37#}yriy-!RQk&Ezl716h(YjdqE5C4r@N~<{67U z6%MH;$X?pH!{|xSPUg17R#>GOuGY{pW_y-fUSWCI!?G^8Q>{ANHfHy?i0ND*z0S>J zBjE~vB^U#*q1!@=q6!|I_GpMCQD>6fp_AN$X8emGe+V3SP`*P{?je92&*KT;Z;?pA z9gOyohWcRcD^;NNL5o-5BZ_C|QELgXL|h!zia=RO>cf4zRiY8l>IKVXoV`?9NGBmK zPz+V~MK%}i2mvEpKw8Ag3llFW3o-GgQ$jMJ+&!Rd%MJ$QVxK^?sKU`HJ1|62wxQT| zE39ZWRR0i)sQW$*B}y&EpqRr{A*D3ae+^d@$}xNm<9;`fb`Mqdi3-Y2WX6?cf;>CSWew!wAA8Ytv#jRX`|Pp1(0BSif+!U=Fz{?+^vz+Kr`6;NySb-|p6?k<;z~`5uY{j!&Wb$DhRS>5lN7FKz*O ztH|qD3Fhlla_++Y9?FD>!RLR~EB=vL&GU^ID*CdCdtb-j+Qu)%WMg8lXGOyJ5A75f zApqUSfGGTF+Nd7>2pLud=MFCCNJz&c5Fun`hAdXLv#99`gg{yZX`MO!XF53b$^Azb zP?DIz03))XeS=D|tAe5=hBb`N`i3|!{ckB`5sQ4PGnn|R)~*$Y2w=Uk3UrrJR_@$Z z=fGP*wc))dUJXQkF_)nl4W&7c$AAjGFo`rx9BI<>G=`V(u_54vK9@BCNLoR1!vO1R z?-h~_+4;JyZ+}(Ew#E2lMPJ!W#jlhW)89D)|8=th_V#*iLV5kPDl;f8%-#vCh{VmMN)!kiFUK!Y8p z#SE+N&mmqwyLw(wGZV&ps&0*Y&0w7@pf`Yc3zzp?*wM~*4;*JeE!(~0KzCHJa+BMM zaz%vv4M8L~7p_Gw-`5#qhx~ww0H1xrx@Yl29`GVWyQ^rO23sy&$hx!LdUjWHkz1Lao5i`11}Yh+cbURtaj7cP-} zs&H#;ZeF7-O@SXz8F-vReZ}DUKFy0Ep=gW=XMzEwf6GU1rLdat+j|N_gOd6&Pp0Nr zgVq7xR`0WLpf7mXOM@Foy1pK44^fglS7b_TIp*rbrp6B)TMHCThY4D?(6>kYU5$xO z5*Z}A)Aq#(Pl?qL&H9t7<)L2_ja3p0`S?I*l-{7}X5PW<2`VK_a%AG^r%a=hKmN@S z3(_ipM|`1<@`XCf{|a>lJu6#FBSkk`qknOGqWr4F00Sy-YUw-|^J&Xf`$&tf(se13 z9}ILpJ>8DM`2gb_S)B4<_Z+!EFT!>H!1`1UQ5cq3e1^xRne~*Ho0lgvmi=!(9S8QEvO~N9k+QUAZifk7tK%|V({eG=$Lc->J@^+h zelbzuHy(~d5war))4?Mq{So}@>$skEKwnt91XMlJH3c#%Xutm8a<0dCzbpnj>OK1p zdoQbicH(^1Wmtq_KGdQlo*-jV>r=#jL$^b2Uy4J!gC%io`)^)Gp0%{`2}>@!fd!If zCV&^;sFDd@r0g?uBu-dH$!MwTxpsUM7?H+P0&B zcj{ucsL!!tmv{feS0Wno0z*U7L*4jn=`}s{x(2R#2cdJ|b3P-MVjL#i{E_+QluKOH znV=&$vRm5tF?nt#5X}nUD%dxoMXnea~!1K<+M-=>1V{=b( zg2yz(xTgh|2(r=1R!CQ>S@M#Xc!YsqDCX29pWt5^faWp$UDtp62-7_zR>i)s>8c5h zXcIl%`AYoGk|-^Y8uvSM=95KR zhCu!;ooX8t-Cq4MbcqTmnBJ;Tq2dFOIT4=U2JLA`In~3f8waeXPVVDOHr3X ziM#6M*XR^67F>AaaZHWFhvURaJRo2!BA*J(YYbOjjmOs(Gij}s3ovI5Xnk~5r4k++ zK&4n&+pCmA=BiBMJ6}T+uvjNIW^w%IT|6P1j88l-=)L6=nJxRZj6H zdx`odB70!vtBjos4yyxXYc!OrnrY}w+$!1BrKPqRTApVD)zVO?Q~DbG+W)}9QmYQ8 zL6&vCXlGDh2=x-@*Syc%ZI}xt5JAkxKEU&m zlAFeV!RV^K&K7zG@otZBPx7P{c{FI*uGR6IPQU1mRrr^pV9+^}n6lWMPt;qe*XbNZV$eQHL2?Y(Km0kTKSX>A zsc;Nx>_N6?g`tJA=Imf&x-mLGq7q==NnAf6k!(=F)|yOO8tGzf-EWbFXD{PfqHFH| z&F5img>v451Of{GY9S&2-&ntY3WTbMBdQAKr)2#8f3VMVD@0RM4Z zfC&f-R5Xwvc{(ADp~?KFICO}7qoQQ2dSMemA)oqwxxD!*e|W>=Z_Wp&sH@@Ge9`Ft zcz&Li?p>v)o?8=;m=U;ic^tKOUp?_&x_sMu-40&{+6ZMAQVk0hRP~byKdM_s$I4o~riJ_d)dSGARX3q%P#r6sZU&xfN@av&&7%J%1vhQC zWli$xJ{i^TRpfUfHEEHjp~3aoB&yNez;b1!(_OFTTc_QdFjSD(1UJ5AeE*ov$FJ1N zk%wosT1O`_SkzOdkbL#>cGH@S1~vy@aYe;0jB1STyNTRn^>Pmx4n3NgS(sYLQ zjBE!GP#Om|=n1)Bzu6L_F&lhUpq#HG4$71qFo-R=GZk0oor2g$9Cq{(6xjV08-}eM z(PU2UJ7avw+=_+L-uvhpZM5=Ed0FW}?xAvSZocE~L$hkL8j%+pS>{J-z=;DWniy$w zU6Xz+h#2V8L=Qn$MQYx22BlP#(zl?~dstjYEr}ep#>!knZk~{O52a&X)N>Ty0BFQ9 z=DVa11UcBqH9ifify0nBDbSBeD@hJz^TN6E5c!S&n#WbY%rBuJvjlK7(W=r71Ph_FV|bGQYpoE zZdP9AXCjPubT4|@q95cr45bwMX*sftJj4d(bty6#7tOElKYD{}HCH7mo74?1N*A4y z%WfEwOt?4y@qjBQuWLQ~g;}3T0{$k#j~ap5&v+5aJzz*FIaCJ{`E7~~VO747eO8vi zz>%_ktfOMPjm1W{Aum5)8@?i1#<=`NcH+E#|J)3Vj;co4k*0gqy1!umEKg=giAq9I z=wkFkaY7U2J9$|BuxY66%neUhr2$IQ_)O`}cmX4y?*`9z38R`Cw24 zb7@Z-PQ}Ud+p?o$e}W7BnJf5q;;s^0^@%I4&9!=JOpc!!`=Mg*#!Y;I?p7sg#uQq! zyXr!-;)x82YJup+o+g7GwlvmJ6pnY?q1% zUA`Zn#MisLCHu`5h|IOH<1bn&)79f36+51!Sao+w6p1Ket%_^Dcb1P?79HdWoDa*~ zuh<;h$CY=_x15pP={2cX8Wh5%3Oyzan(@9&5q{xQO&%FG`fj!0ff7-WDN?9!I>?NK=h3s!VS0_seH3gUU`4?UZ{Djxht zL$8&6uy~hFN0#Z}Z%DQs>bTy(g(|W|zXa_V{MVls#u)k&L5wI|3I(q=6XdE48JLG1 z=vbm443+|s2N=RDZIC1v>NG@V_ig93%JJ9(D_qLAaizvkVyxcC$ z)Sg(*oz2DV1b6&4Wf;7-^F=zwbRXgE>TjVBpAoBYhBPs$2Fu4_4=-X?|6sp!4A9^k z3*h#)UlUFY$-Um{9qtjkk(k$!n2YI03;BKjCAuel8qyp{7wYmOy>VygBex?2)tGoL z!lUy&J=M-lWyoF?k;eVIj#XYpcx^?fR95H- zF5cO{=`lY6}bQlx92+%1=_q^uT?=GXzw%- zb1yiDsk}Ann8H)o#@l;N$#~8|*s^JUh2Wf5te~pTSN)|^Nt3(s0ME#|GfR4#94s4s z#;zjG!o(8l%0pQLXeE)jiKZnhu%)1M=3ujJ14KlU*`{7{~$@rJfDRxXTpD-DMw zZn5BPm-X4!A&RLdhrAL5f6m0_70fRI&DCJ;w?-KKAnhKY#J-5vrl;xA)ovKyF#Y`Q zVpg)ZUHB=|dOr+YtOjr^2%&I;S)_qq))uG?%jmu&y+)|}W5TxFnomAQ=xp)CftMQ$ z9_5&TyFMJnJ6A1ymQw75ig3LtN(mr-NqM5YvHRdV78}0dD?aperT?MLP#M$M2zC|x zr+XdQGpF?W^RHp#{yyJl?N=Ci_7z6_U8j?j(N~|-zp?^>@=`V^jEG*=bJlfQ1T5fV zq9?)bkOCKT&~{L#q*TarAjp)RHW_kz&dW(1TV* z(Kn+R#2<;hs6EjrOkDrIa=xMewkMXe#ZHXel1w3mKkg~^$bf4cK|?B1v?^zw*e%oB zCL;s{GV4(}`dHsU5fU4jE@X9Kug|Jso`j3fhLbWU;a<#Rp}KmGQ(R1GVxMDV3|%-J zAw5CSqaHxEL=0x?T8XO%YE?Briv+Ho#W*F;8}$P&TAb@+5%yKn-0Puy5jz#E%PDTG z(vfQa8!f;>yxo<6oP~-R3pXQ{CbJf_u2@2zK2;c#ArtTEL&mnm{G!wyMfw_dUq`6c_g|{RNm;Md!hy9;xr32Ol z{W9cU86((e-8Kkj*Mw#K{o#GAtRBpzDWEHfF#6;3?9$u;H*-f@`en|-%PS?!YE za1I^+R%x5G5e6!>{f^NM8!F;GqQD8$F|eIKnisPtg6orJm+tM zCmppZO2!;iiJ;qH5iNp@Ls0)Dp;sV zYl*m!2WL80j*{9Nw`PSr)d4%4)`faC`#As#N`7s#(^hm`xkK$rttK6JaP^@vHGm{9 z>4DE`vkT`|Vb$O=CQL^_)0;&V8S!b2OCqFaP43$=oyx4V{`SK`?YgEAn{2KeJqRG5 zNbr09j8Nz;N+Pw_aeR*aT&3Z;rMRjfm?O#`Pr-xBqkZR*$KjMA?RKBQy9>01up++- z&#^T#>h^16^pHT6Q85WP2@s~6GiD>F$Xg4rQIGdGW}5(1p3&Hrk&Y?!-38nCa;(*5 z_Znz!hz79#hj%llwb~L8GjC7;JBovhGTkdH4%+%Z2ai0L1 z&8aKQcSp;9XIz{5rJ*(Mibex&r_x*Xq9_jM<9o8TQiJc#^In>dT-KL6@7qc@Sy4~5 z3WLJ9_&Y+l9=7FCoyUqdu~F@eIr*TK6}Ss_kndc4L*!h1MiIWwO9iBMlEcZ* zKL=H~x`x=Px)yJ6yHslQ)Tp4V)I9O1Ymd&F%qYXbHnS~dnc?nw0+}eJOg`Y0J?;D% z*|QS0-Gyn1Y}Hq!{8|r<$|KxKmdAsPJa9I%f9hQA=DtILTYZ-M%d^?<%18V3WTBVl zz-?~JJK{zi;sz@$uWok>R?}YbuCz|l@1&Wp{h9W}x9Tq6yTtSc;Yskhlqd!fJ<(&v>LwwqK zVa9=% za~$`d<~W84OEv;J82T9`>ng~FY1uG_Wd{d%t)X}r0qGQAo;d;aT`R5i0n9C_K~tc) z4k(WWxoFZY=G>i z>6?MU2nOgY()ltfBkzj=_viB1UN&JktRS}AA|*Qg2z-#v6F+Bm-TgCkcS*X@vlE+V zkX3MBSo#OIB2YtYQ~eeHMmv?k53ZSqiZ>A}O)}vCU(L^_3+xlx+dmlNP4MGY86qcs z#ns!MaY%Bu^fXXm@nk{tpcIdOVQ-5_1TJ>Gr51!Zocb0P+_TA0S!PBmS_~(8t{-Zy z$%=iA&OiaR8&&>$4v$o+he#fVuaR%E2>WNk&n4R*cri;@cmqNQHt2i0<+C%V0;&y3 zM49b@kn0B+?~wp2zgN`t*>C->*?j*;O%te#g4?|lL{$wxd zDkbz@H%^jb(sA1F6yLqu_kFd0u9+QiPz>+&b%eb1l*J;E{h+(TYqlKN82up>cMlnm zl+om=I!EX@10KLj!m4m@0dFhouwuJl+fh7$KepL-fbv%tao8FMVfBl2g^HGUFIT#Ali)y56gpagZ!mm!aF zq0={}p06zxexeS~*>a8jE=CQcIofkds=qb6ik!jprqp(|8mAg!&E;LZlYcEV5L}(k zlGcHn8ag#m!|7H91gxYt(NRjIi^4M*O1PNz}ARIuJ zw?pR_F1RI#qX?QT&}^}|`fpWak2S22kS|Xv2LT9(;(sKKw4T*J%c+&hX9|i&7@wJ) z^*CV4{IwGgel_1UNvXjHz^|ZSp!KnogMYWsTuyEd)`S~9o$nPQc$uY@Vm87gPJyv- zDtOJMe)xU_e1wvDWIc7@B>m=)+lS@3a>#mW-QIeCzsmLjo(YoaFzum)n0CA2(Z1%t z(?_-Yz_{ao+G9cXkXrP;ta4{Mc ztLtRLls`;1pYQH1hAnk+F2Gh*7}V$)*G)Prha-cIYIz!IG9P=V&Q*CtY?j$D2ovkd zRxSEE@QqvOgKN4*54;iJDK}H2$_q{=wUEf{0?{7Qt^Hq5hhb783_ zp#vXiDx_g5wS0ErO z;G*N{hF0R>)}d5L3*lrCA4zuEct~k32}aPPW2@o0s7LgvQyVtXC1J?kNxHOCV6h^K zMxl}Nh-!@W;uzVizmqwS<#Z*GrTOKmtz7l)J8T3b->7k%*uHG=4b$-KDw}P|>GSyArG4D$s8=c{`Rkr8EP-htMuwlMFyq!T>Phx-Z#=T*Te`B|^pxKkp7 z`oUyXM6DWGuJ~v{icO{4B>QWvDtV%kl>IftINo<BX;eB08bmT zmRr?9A3nN)8w)pKNi>?B%hMu~c|i0`>pA2;MZo+wF;BQtHcZ)ePEe!)`k75)Qj_N=OpO#CCL)7V8E8e04niov9PgTWzQ2+E8te?)iVR}T{nLGi6jf{XynIV z4gG-`zN*@nkuU$s1=0VH)=bvk$k5C{&+)%{MIz;-Wcv6Ky&4%RW}2eQXz9^&ao$R2&+K}6fBOKo^%X*J zJ8xTYsJ+_zm1|qtFjj?e8)+QfYc>ozDtk&n+a6y+AOC#|0jktdzqcPxCSlYhCq7bf z3<%;=+ak3=D61$gCO#@8eY?2N&T0axx;&yjqymjvV>FEi~F%%X2Kn95o zw=i>8bD|ec;JZU4wHk$zc$9%sRxI}u<0lvMZa7nrm1#>&?UYca8azGVXzi9}sceU^ zm$__4Cdy;$Gnh>-DEM;$_8S72PeD9KWH<`a0{#Y)`M%{)fHZ0`k6H@lx(2Hh$y~=M zy7HacdBzsLQ?SEBg<(2r^6C%hnn-6Le7L^eI2ys_NGOyA%JTAaPH;64G8J!9RN^21 zw(I`KikrOB7lqNj_OAVJsBB|kY6}Jzz+3*METWzSG^vL$VJk zfU)W^4!J5=)JM!DI;PL6-1U9C&W$jFmDJrg)|jjK{A}FLHS_WA?gGx(>*=ZT<@LLj z6(8cQ9`~w(%)-Vc3w#j|+!;gNP=UXbBtv6w*RvA^x1m$-NAt08e!b6313g_ke7DGE z?smHulWlv}^*rXDdw@MhLG_5bkpCf@vBQR~Hx8XhC0FKv*`jt3=89}zc+W=|-JwE! zwH$Q>(2x_jj+53MOW5g7NApV1wJ)X-jhOnN#Pu49+xbHVbBejF!cyaAzDx-4JClZ3 zsN8=XaLqT$oP=pS(s%`bG|a*1c7)*4^P+iVh@xE_H3jY6)wh}d{aQ3dg}CscF+Z$L zK%m-pJbnb36g#h^t-`rU-!oHBT47ocA`e?v7R$7x9}_0BBo`^b#!?rm4lBQGz_Z@x z{Ji}F`d3|*EbR*M9SI1CjQf9skHcR(%qKNqTos3%KBAoq+t)fFece)OO%%C&0O21f{`E&X+@u-c{eW7w*T;KVN$QXqUK)3_q7G>Z|q zrA|4d@I$f5YjKC2&YNt-yAFrL|5*#ib#0EZxEkH}k+|q)`P2M8?W+(4chq^EhVV)3wUxZ*hl(#|Cr9kP zDL^8eB|=AEw5#Q23y7r`_7zblbSsgCuKrGX5O1s%CeBBdH;RR3!6KYh?9P}?M_pjX zq7{ZY$EFZA&PsKY7h&vn0-dHMR>&fnc4W>n9ZuCjZGZS?3QT)HOQcRSn242V*02zs z_y>!+L^B_nzN%2dI+qH8Ha^(g?K!4H`_dp+MSLBaQu(z;IYx`NdpTsuVwJ`*6LmTK z6pKKq-l@T)AFfr-Ix3nVVghh)|@R zV?XB6klhy>`f)I#2I)8BAbg9|#zghmTv}c3#k!@VU9+iAJgKq(bqQRMf9)ce%IaJt zn2T0Hd?j-$B?g=N9KBM ziA%jdm8(vb9+)I6KA+C_?Eg^qjzP9X*|zRZ+qP}nwr$(Cz0c)#$+gW^x~vDKBWB@J78%o%Su-SYhn5g_u{74i@9fHm zF~;@ltpKs(g1Wl5F7fW{ros>xjs}XReJR)}>uH4#PVr4X){oO7kJAiJ%xGs9PWL9X z3C^zbpfLyW)qi@-*e_s%?8Qv`n#m&yy#l{^3lkRtae_;*ui^_Y^N**-nmHtQcuY@@ z{^$?9ss<@7P95mN$y#ucdWx`z?07;f2P=IKXQ_(B&}J;6K7c(t_5X2oPJUB0U$i`C zpq33>S8o|HXjpvKkF5(?XhtBdSd>Jxz&=Dsu(c;eI$=nt_)VQ;Z+_Wv?0&b+hsz~H zo)9){5exz1MBjqrv5$g=5tepFUA{K%d}6|Nd%L${+-+`fyb??2PeF0a%R0TA9Oo=| zjXYuA%CNx#Ab9gz?5j?nxKpG`0*(*e^y&1EyW1JOZT9JF4*aGAgrS$vX$0bEdrr2ga+vzBcaf?FV(! zqc{fr(6WN-fLo$w+=G)%H>xBg7TC5<7_59vd-t@ z=g(}$QtG^x0NArKYQzTaK$mZ6D9yv}SaCGi8Y>n?JussReZ&vK6m}kK;B$<#tX~^q zO9Qno` zQpuAT5s5xt^tC$}nki=W58w`m_4dT5n;UlLYn7`Lu9^GRDhuOJjC2(=9`POn> z>S)Tj`17g@jOhWQHk?fhs5l??{E=UrwgXq3zJY2kuXSOy^kHxsoY0p?{HX!nU0+pu zHgo!u>PXS=ON`5NA+|UQo5crucXo;$S|f6InEB3w6UI1VcmBw52*;*v(~Ean?&^_p z5_cQHZyI!-%$7?QR5lA1TxhFeIGo?V^pf_aFt27U$gT({G1i`mCI#jsMlRfif_KX2 zY_n|#PF&ivp|D3FC}d;s`AHTSQ*>IyN`JZBqgE#dn7Kgf$6+Kt3V1EjyLVkQrnWPm zFH?wrxSy<8@P#;^=huoNkRH=Rz>$rf^;y|)qn{fuElPD>(2h>aXT!p~-4O9!&ogH4 z-#g1ka*)h!`A8y;jHE?3qyL&Yco`?Z&_vaf&e1iOlbKI$&fuMg zs#j*ro0rJyVshrov$Spn4{oS(EySbG4X^lR?_H`Pm7u zm5dTnS&PMh7MaZqPoX}Ug!E!&`>zPZ{o^dWq(duq*|U>kK4i-GOTbUA21Hmtk`4S z)s%ihpEBR)D0g|bKHk&O17VsHPO@xWhJky&sTpI}8b9_Izo#VUhE{a$BX1rZ0gdv7 z1l~8ya>@=kL565QIWD%Zf>N-Pd*A zrDid$l;P5GMBkG39%H|uuxWO-G0m^rG%0XZfK1z}&P| z)5xQ5v0>GwEw}3RE4A1PnzOTd1JgyT&{j*Ur80Z5s`S)X{>*oj(2GYZNnz*+#f%{u zgGXo0Z5<+WvE-WVj6qd8c-H66;@yLUHKXpB!DkwMwEbCZSXirX&vlnvvhOau|E^;oZiK~uVgbS1HS6$=r}!#yAgyDZ<#!t% zUP#+QdZOj^j#?z23Bw6frFw}xsC)-*-0 z^b|^|lRbrMz1YsEN&3`KIV<*It|*N={23y<`vklDY&&LAQSZ<%p$UEjRhsGNGJnea zN@koTC|KE7Yh~UI;eULdbH*U>c*AB&?fX*=E9uDL^&0s%hw7mg85@KwCBAOC2@K&MAMaUA zRyd@#<_Z}^d{|8K5maaI^nL6Gj#FMA@kWP?*E}S)mQqgH88YS~mhRDP1MRq~I~DVU zB{#>aQFeNile+70yE1&E`}HT_s#ur4Fh~ugw!Jub57qD5Hb-bi?GGoaJ0nJc*_*U~ z(Xzj?%%4v;CiIj$e_M#27f}^S6y{AES=K9hc?+L=%LKeKK?$>2Icg!*j59lAT&W+m zg)~W%x(izHF)%u$7G3DElJ4`CT;ey4h!I~WLN1JHM`)FVYo!Qo7Du+4SPT|xN|#{K zN2?m4ZY3qR2CfiaA83SsoV>Q1^i?c=lWzbN@&w&CW+$`4CdOnm@DAAkvD-{Y6g876 zF!+xDeSFoM_OXOp?&IPSHY&pya_ph|_9j<^({vOJ z`=C;_T`ZAY3uqI`tibNJ18DO#g+iGfQ2OHX+sOEe)T>ysiQ8=Bt9Gd08k~e<#pW{- z@c6OEvuO}Q#RyT2)lmGQHmJ24Jg~BAM7+W_)qMCf_o@=X8qSHvs0)4?dr(!mlsmU4iwe#KmZU^)R~yUv4>qPGO!`1d&@F0~qe8%wTN&>tmYKnx-I~_e%76#f zndt)z?unfHT^#NaqbYon{K+KOnBsKC95W2lnx5w7aVvRy04A2syge?oTMQV#!acj4 zRG5T`p-o?eg{rTIn@QaQy7-T89xIS z4j`qM7xQbL%tGDYaOd>oEKIua-C;LcRQhU`s@>lbUNo7bxTeOjznR+J#ftAtqz=0C z)89g!t8znPdD#rs-r$nH)u_36$u(dP$t^|OMN!T&sB#C6l6U%tjb^EGhld3=rO9j9 zqf3ZcU670E3d3WJD1AUk9#yFGMrwn*k89%|$UWsn+6Zwy!ih4*Dg+O^VnMLy4*iVZ z3BJbypP=DV%2*kxvkh2I474nfEvg#}#5GI^BO8^KNmN}_7zrC&?LYTlavRkSp(DDT zLv1+2DLo-!oKdk(v6_7#wYy{c=7gyuBImVrF+Z zX6V9G4Gcw}s72dGG8Cw0$g^K(=>M4EjNq3R$`sqabsH&+)c!f(in8KL<1VeE@R{+R z>&vii6XLW|WD3P=_?^3}BK5SinJB%~;w0cjH^r(}GaC9l*u@8wGn(goS&78}F zlY<$n%Zfv+TR9_AyG@7lEJ%q^gJWwA>btyf9CkV*mT@VJO~6hXAk>LkM* z=xg9lfc9vHar5Jq3pbA`i*s$_c>DPd`26+G{>4oISqJWbWGE3X{Wd&(e9j@mLDE_6 zI&MBES+xearIjo{T#xSPRmSm6gjB-^-h$@Xzs`*Fai@1#-QmvGr1F`7Chd+sNx4T| zlV#)P>on%-loU-Iele-X(yycT;~6tKymHq&27l<5>*$8t3>0?+mjd^X&aC>`BEthp z|MDvZ?-ERN;XF3`pXyVRb%tZY&oycJS)~8r+Wc4C>W3ftPw~}ek_WP%9~pSpgMsuL z-yIlB01Iz*T?+!0qtD4>FxZ;)vN}+$;r17fsZZ8X{hMM%1V%ty9$axS!o07+=LPT@+W)M|8?}%x;HR3npY@+2GfK{O_Vxyb z*8eiIxt{D+ctJryi9lstL0w%zVMRex_7gq%eQhlz6iglKd>wri%6YX3h=P8Jm-)&X>b7_L zDXLmJLSPXA5dk3qfz#Ljx-!rQs6$r|AVvbh`ZrJBB##0m;43v46)3a=eyO;4uj0VThllOralp1)k9eO%Ey}S z0dOa^1|Z8a>>%S!o_u%$u^VLL%hVE1V($puz^%2~$jHmG7NW*k!81(ES209{MG3NAH30Kfe$) zFmks0Z`ek*%D-S6;L?mZkkO9`x=Ff=oA{b26%06Y>B*l2pt{X!>opvwbYvpuiUYnzu(_r{uQ?}MGB1eTf)!_ z5?OsPNNjiU5g3yh>;W8Iljl)dpthOx3X=M|H*Scn6)*MOoo2g6IEDgNlfTd{7mp7M&TdGa_WxA>PTBj?jmawHR*ZQKW!7@EAouwnLHy-ZBaY~;<)Tsf7uAjfSb$_q zT`OxU0k2tl$$&&q)d@E6RL`P1=l0!3D{5E0OO9d~aBN$kH>l|?>!gf!T={sHaS|F7 z7?Vp^qC)e>>wyPeLpU1`#`2HEOq?)^kjACIq`LL&w9jCKXB}ju`02;nY!?%b><6+V zt1emp?j6m#;;LL;f$J*2r~u_+ylUf@9ll)k0;b#E!(~WXJSaAoQb1Fz2G{v6cS6FU zwH*w2=#!;+*dqWL# zg*{}IpKx(*IA5snh(^fvkx^Us=5x>CGL5Ty3BKT0d=XHo>9 zz2}K4q`mN)H&8*+NH~!sXG8db({6Y};|{bbT$bZ}mF%15NCAHw!tx=UXQ>2~6b2cl z6Qu7z3EH*7aPH2AQ*Ve1N0YBV98sFDFQRGFPW+hbj|VP^w(T9NB2A~@?ikN+704vH zgp0C4IdNn}nk?E+$KGRPrt@+WjTQ;gw1Q^g%b7H3Jo@zE4)<94`a{N$7cOZ;_`jz; z>sCp8;qA8sjGHo=IekE#5D))m+%{*FT~z)cce)^c{YRL^|M5cj=Py#W%7!D77(5SA zRbz9b{{a=?$etm#MzaDS1UoA$yg?As8b7i1q4uaJOC73eNA*&q)OYabFFFr@O2u7y z6vh0=uut*t07wF}H}*)ge)sjuxYY8 z4o6N};?}fThID=;T2gxmCCig2V$Hi^%zI0Y>_KQ+G6xW~rQ76~z;&wfE-Ow`mr01m z=`7y)vcFe zEMq4ahjndC6m#0usA`NwABx&ms8l8@)|fL|Q>XyDj;KN|FOJ=P~oK~tTP9R$G zzs)vda}L{>d`2Cv^tA9YFEfzl95s_4FGn_N(~A{Q^K=XlgRL%v3ApXH-dy>MWsqQ`h!6;W{f8lHD--D(xV&#pP_k7XHSV13#`ulE?X& z?EpKW9a5H5Y-XmQtM+}z7o-tNr&6dPTSvv0+*j*BkwaZl0GGH#r9-S4%+=}km$y|H z3d>%tSDvj#cYwSvaD}z8w12s+NJ7+{949*Li`gv$4y9%(GeWln0fP zLF#U`92Qm8uh$b;jU{9T? zTodxvx9KvcqS;DPtrlsP5d}26pmcR{RmimP=v59sCY>)5+4&KyE=DE1JQY7^1*unTX>ztJllkxA{JKO`?5{?_)ahl58M0k%DtN45 z#naL_hH~F%mB@(F}hOs3trO9ZvTVp8`vocA#NzG0ovO&LL2=q~H^HL^F>S z{1C!kvV%7-F#!#uz@Wlq4=j||ql>A^A_cWr5S|h|W@zj)86fbt6rY`PscfZBRkPMQW{X~w4cQ?<7q$9!@(x$A27IluH_~IxSWc=;1 z{fr^G#~q8chYeH68$&#zv>LT=Xo#+ZUOJ)y4gVmKRjLMy#t=YAdgekQ%o@Y)VsknW zmIN9nlA$O~V40`G&*uT3&+ISY*pO-lJx4pvB@lbMb2=aI6FtDmTW}kCH|Xq5?VPon zASur+q5H;Lb-YJu=3?r0Orn@>f)2=+AJUIYa=H#=K9`HNx}Sgb7;5c|ban>Mf^K)% z%TbJNTl7XUpiEE7SnQqVZ*qyEKFk|naa%gag8NtTwhoStve2*K_Cuo7v}(c2pZ zCLPXtOIXa~H#orjTmLs$O#E1#s5Z|m2Wp#FH1>2tHix5oc0iJS0Cj~s++1@kxN@h0 zj^T*GUIX6hOlMZ2KYFZ~gA|xVr z=sf+7N~-FC-LG#kQA$U`-6Am`Gx%T=kq_=OwYDW zU6Yxe8IjBMy4m!ae(9X)`dH7T(*>Lj@}qo(=B>y>iX}hoFJ$CJ8-VcE6#&)?pL<60 zctwPZ9eZ^|)>Fvat@!+6!IfpaSV_+awcE}7d}BBAt$^4WMq=zP)Mx3Q0G4Asd2xT` zh2z`ZL&p1zOZOeDz$rakP5 z2{+k+2Zj^lu?h94yFg$D1!soU`Z7++nWQ?Gw{Yg1qR7f*$q%+HD#l3N)^c(ZLwc5s zK=LqDY%`8Yd%%EnYq~hbsx51;$b5$33DAK{)G`<%oPyN`RoiQP&JmGSwRl^NkT3?6 z$Ld1N%HV|wK!Np|ULrFa@jk--XyLsvp29SGaLu+E%TuAzLQK91anW|Z z3L@^uUrxga@VeY(vh`GH>d4l71=c09w8FZy8TkT*cH+EXl z#Aekyv7VGEN8@+zqxuY%WKMdA!PyYrVQ2&unh5{&`i@=87%o!dCS9D@gEz%nwx!TD z2G-@4#M+F7>JmJhx%)sF2uK>8R}7W;(QCI@%haHq1Bcv^o?&lG_4;5=>n+L0H zbIf*dwb3r91X7LR@+aeo)gB|u(Sm!j3)w03@qd=k&kkH;*Imn3;>6g?k0ezzaSfKK zQ|JQ3|KJWtdKA?a9|>#H3e^K^yzI|p(-f&TQ>)oiOkId9Yb@PA%b1HgS&oYB0`NN~^?ns`NF`qUiqnyZ-4G^mKws#6iv znv#mY2tTjw?d(yw!?jkr-KVHP1@Yz`|7YBMUDZ0FA5+;{K`n6lm zY{l>V>lW(q%t}>q`&8@AEVuz&=_t)&Xqq@anr{J+=vire{rUs@#G?WMpM z-?hDz8!iLg(4ZsKK*UJmzT-@AixaT^~EV&MM!y-@=dxT#TTX~E(?=DziIYY4t1oO^lt>qZ46d@LY^LtN}_y= ztpy-&MA{Tuz; zogOv9vY9EFfozy}f;Y^QAI0wgE&&HE+1??-)u=mVE7iTb;2C$JJRlh(06Y_+{>af1 z{><-yfilku%DT)FVqRkjL%*Urz_}}_W{C&+<76&d9WiMj;)qM5#=P!N9t|;1B>Q)L zEREP!7_6-zvB)*POe?sg#q%Ce#tZ1bKOt6x&f7r(dMC(J(mQe9xN{8wfYF9dneYXk zz}@f>yZvcK$&)_$lg@f?lN;X0KYiaTZdEMjK9tO>)<|oejC(>8Wj_FEKeU~ zfDBS8gdz-t^J|cK=K*&s(g(vq8i)K@6+%>qnV%e;iJy-CEX--tVu)4g;H2HvgxDaG z@H5I5m|qs2wzX^ZEZt)qi#8+~GfKxA#74lZg2(*5aAv^S(;;1v!(V}m-FsCekwo}S zFkb@;1_XDjk)dkTs0(sNW18X+_FD*9Dc$jtmOzpa0T0!dom%=m{Dyi)7{57u=^&|~ zDj6Y@^1+q*mX!y}+aI@pHfq(SlX0{hUBj_`Cnm{ zZ!F3;KGg9VwF5sjlD|RupXvU7nRvfg&Nyy|K^j#Iv&aYJfuIX1hh+%R$%Gh4D-0`P z`rH|jjmjy9+u?tk2{N3{of>7`XF9fk)%oILg>upAB#E87HM?kYhNxuQjKwtD3i7_% zcRfC8{nZ>CzMBTI-XE+&3$%q7@yuAiYfx4+v*(#s9LvsM_TV)?a%kKKkBJn#cwRE^ zr%9^jP&6jlVnD4r7uIOXyOtR=S$))dXH!K2=u!`Ql{&iXX{+}|72MYwiFM5VtE(8A zY_5aF^#;6e&GOR>#N9Y`0$8};PZbsH8SgnPRWxK0ut~|OX*Elw`31{L%3i$WEM4QQ zr_NW`P@6J!5-;D{F;n;ztbe3SD5L7SuJ%W-2U8QEf&JP| zrF5}|i!)INZ5E*qrGh7ErRI4Eu*>($!CO$C%KcX^@pn)FjPz5U+|w^! z5wm2OJA(I*Ms=RwdXStE<+Oo%(87QJtv#)JYG}LjM>xg&k!k*u2=!mb6Ct~wArkKY z0+dH5=*ex+BM-%HBsCIXHOjB{D1I-5TEsuMTOgh{gDE#D}^fr!ckVuSUK00Lw_ z*TU7pv0SZJHC`284z=-eytq{v{r!CU0`qTizsmn@hSKVOy$7P3ajpUaQ|V!DxHS|S zB@>#EQYQ~RWt%j-#}aFSHY`YmVPcR(iGYhS!1Y6gZJRe8>4n8O-kuOXhl9?n67$>; z0xeCx3*xdU7)mZ_;7FIHLyx3k z8pkSXiySnw5MS!awwrz{iQO7v;0_*zTRVv;2 zV5eVUT98FxHqA+?rs`qe%NVw6g2fAH3R}%vQ7my&=AR-KQJD%hMv?cI6L6DQLPM@n zgy{|h`FJ4*-jVMNb26%mYM#q?Nnhs7R~6S1Nlr?ZAo|h+v^D{q+aR>_iR9ytpwy>m z6$TSpa4OpgL&25zK`wfb5a&GrOkEmf(BMg;4@*L>@LqJ!xaCCMt zu$K9uEn3)`{4+)6^xskYYNVfmaqQtigFe4u8`867Oj8DH zI9`9@k!Wh`IG0u^C69Y`U&H-!dQ>W+U=(bwpzXUI=Ol%GVO>PKVqMRwI)Pc~%V4K@ zR6zojveQPX;*;>Lj-l`bHYr!!a@KH^KWd>>(0@u~&OzWmt?4?cwdWL#3H}^Vll@3s z$Ax5NF}O!##e--JxM4OSpcRnv4Qw`7qfLbM(cbp>w@1KI&XZXFr;~j1N0^ZK4=UyV zy?ikPM?(WM6CpcmYmx9_va!8Te2)h{q1weu<w{0~;+lWDRfZg=)r|S{5>A?&8Z(DcpJ z!k1a%3rkt)BBZ$`OPLgw7bqHq8BhLria1s7$1GC`#lz5i2x%&0z5N?gkN7n7SIy6# zN|7H>D%1bpZTrs++N1^Ht^9PCyLNHa?ZaUbe*`UvPY}#cDKL;9XAhj{PaFs^N82G) zA9p#t1%v2mPP2qs(QL_MDOYX?M`Z~S(Kx63Sg)#OV?`I+ygspAC8qM8z2mh;w1)l3 z_w^v*d*e1anVG(mMfbkdf{ROBV7cK9hqIf`Id!bTNEL6;3~e?>FBaOynB?h!JG0XE zd%~od-xP(BIw@cAK!g+JmYPoO&XA67&k|$1D>e6B1x)#DADSM5Yo zmzGX%ucXGJQ?WF?Q}X2D)jL{k!YO*##g?;d0lRv|z3O6IP2y|8J$v|Kt5e_vbo=xe zihFZZM%VUOhSM~&%bUP1K40WOHG6xwfw_BBN~%rtpz3~;bYO^+=71GoqxuduTQ&R_ z+C2&8&Egq%PVqyrcY5XyZIu6X2RnH~T;_mdy;i6z2B$ICAE)3KcMm$ZNOc`XVVCu3 zhWs^}fg?a{v@s-1G7%W~a0mhZG_yc4<6TL}zal7UhacIp8$XY?T*%$+G=X;C3&%$OAy zP{auPz_Auy_#G5;xRoJJu7N&d>g@z*Vv`<=r=irQ#_H;h-TGykii>4k)gD);3sBNc zf}^FOf(T>$j7`kbONb4J5du;-A*SBUi)BU?7EmJ{m9Bv5YWvP|s;u8)ff42U)VS5_ zm=R=NfY~wu`eMYGwv4eUOl|G`I(6=J3t7WF0X_lc)BKHHMml@u_2m*cY&xB! z*x`ViR)KagL!5n<`4J0=znxWCL=h!^xoZ+$&GFZh;hJ)~t=>h}=@JlEtyBWyXhA=s z9gD6m;>3U@#G89b*%4w~OEQ#_aP9B$lQWdlSDkZ%=q>VIg8F-G54z*}x?yBl-Q}1w z&V#(291m|9=9Idu^6x2xINWekRUOBvM*tWgMiu#5F zl-uO}>&N2M&dR1B;+arqoYw$=+Gk8hRfD(QMvjm|UvMlF@Fo3bsfl)R9!Z>dUP**~ z%8IbGI5=xu4u5Z)0&v3+&>LVDSx1hiE{`m};R2Iuu&8X+RyrWY&Ul1S#5SZ}BX9?9`1t-+Gg!tkVh{GUERC5_ir)$!HfH{o+;=hq%<&Rx z1Zj2P3igauDV;vqoZqmqqI3g#**-ive8?2C&bS{p!B&C%*FZ$GY0m0;(As45O)34K z;PgGN;hu|y@n23(s)*y<&(edn-)eMJkOBhPb-Ua4e_Y6s%s#B7)GdK&Hp`fYn2DmW zUPZ0A;h}3-VviC4@7S@Ok7Mq3IR_Ma&mtBve!B!0S$Ps>=hwD26CrNlOt3B>)U^TN z8yzmEkxpM{>BsDa<|VQ)fm-kOPt-nq6DVNKufZ zsk?O+eGZ|K)8K9YGKrr-*=F`kwm4EJ<)($OH?=J8F0H`Y*Dw(vR&6RHTiZ$ue(w*U zO~z$m_W%av@hoSYsp2}}d5zvhgD_LI1x66Wq%r_jGuJ0uBu4DO4)Efk*u^-G?!@!Q(9yJdsn9oq@aEVU^6>58{| zaAW?i?%O#SiDOt8$#lIEuxEb#_+%e1yA-y(g#*Xgt8`E#wl?hq9#eL}JVPjx&qLGr z8Y8300J;duTUb^e97D>Ql2`$gvFJ<|z>*GV{`kRzH_i6_EH!Fwr746Y^nZz2L znA09Y13NksDgFE#tZigh57Mir|JQ}*^6ts&8$u_6CFUpK-;A?Kg?T{0>b{=6o&F$h zk^tj~K03yN+Y^}YZ1th2PcP!%^THA7yOM@;h}7eTYQlA^OHm>oRl1O--}tkBNqcgS z!NYV|pJv}shV6ZRM?DyyZr@>je~a`mKk2?(`f6?;`d2DIdxmSUKJk2sCSoSpLmBC4 zrq12DXQ^xg`|JXtg?*(Cl4S)$82-&i0+2YbYt8!cpNFpfhFVtXON} z=%KZ6c>JLI;`c(D#g`17N|Jt=~TBrJIVV=MwqLe!{S|YWh^n)*_DdWkt}> zI4F?u<`T%hwRF(_hB={`sccEcn`soywyV?rt<4gwcm?VHyU$Wc?WUR5tJBC_bgJPN z#}4MJC99v|wDmjY*QB0>eKG8YcL40FHWKppdSl~=oxfa;;6Xw-Ra(oqX%<$j7oazs zH=qYt7g#51lUGf#nj5U0pf|KNQr3_67|#-=RZ36frDl_iNz}l(>M_Ov1IbK4YO+`m zuDvFmN0@DXM@~m74Vsh_w^)vr!7ZX9`A`$79#5*MG1X&lLla+SLPBTnsonQGPRV4^pT+S*Na0-3iM z5)R2VSh_a)+^^X$*xu@@>hacV1D@HIp-od@NjM(LPQSd*cWNoDQ=>t77Uu)YqXAC>Mx)jw34Bl+(HI8T+uWVuXhYnZ6ry_E;OcbQ%HMk~Sg8+$POU z?}A6z&rkLvJa8$mxl#mbBN%UW-A^%vox4iQyKTp{gFe}?Q9-5cBu>(WWFDN(9*pS< zPhtliTf3MQJw-zDt|G-!nTf#I$1@rimgU#g<(t@Sl^nmPC^K+jc0LLp_}L30;iHyiZW=pxL|}_S6Lu=jNi?!Ugxj zm46|lRlDRVHx+3#plfW0R(*Vwz^c}1e+852_{vl)yU|&{*}rE8q(t!8U%~YLSJn%l>D3Ec@>eYCeGpA!^g~_(0 zQ`?N2B>@Vz$DVMRyxjYFAfX`IfFcvRF+hpNW{lYUoT~MveII^=8!tQ|&qBEq9kOJg z%5|7CPcMcDGiR!j9!LYSX#vuaq!s}hRS8qnyh!FhUq5$E@j=u}9wLo7tQ;hv3zF{1 z9DxJR(Uqw&O?Vvpehf{*<>vNG%>M(XS}85L0G#i7%BW7(=}wN(DJ$kJk(D$k>2R;r z$Wr0e@Jq@v^o7NH8^I_MDeSUs53HxeO;2l4?4ni`O#!2Bni56x1pyOiB zgxyUYl~FpwY)?tsj!ll{^?xF0hkY=7+bzgpn~i4w8^`&Vewl4<%JMJjd${LzhJ!EG za?1ivnj8U~Ptx_^*hp9Vv$f;rn$*Tw+pmo3}Xbxu111dJzMqs3o zv0m*hItQvUF3|~K&jETH>TC9hxYn*44$%vcexzKwJBk-(3G%jX+}gaE$8nyW2kRX^I=ng zEl_eLtXzPtj#FDHFe?GEZ6=$()KOl3+!EgTsW!DKps;H-bBm=*Woj(aj3LGa9-{)APxy%R*`#b{s|4=5?V2N4?EE0 zPvqp8Xo(?ofur^;WnMngEaht{1%wYYuB@zrd36Ft6>zCK zW)>ZRt&o$g$O4OzM4Cv>?OTy{Jm&P67|{(b)~k;@Zcf-Muv3AB3ymOe+ALC8d4UZF zO6x%`Y#`;q#YTJoNDSB(ltiX9++vBTWS~PO%^cxGyEk$a*s2FOoczwky?iGe6m@BV zIV&5Cuo8B|uS2}NGS_w2!^QYW-we{d(R}pWa&>fmd=K=!ePCeRqOM19kvm0%Lu+q{b!S6*pW=-$~iS=Oz)s_ zX3wI&Z%n~@40c?QMYS;G8L2x~2<|KS$cESww3%AJ5Yy-UvvT`K1&I)ABQsaL>?iUm z3(UX_D*+ZYNM#dNoj8h5y@3{3-v0m>;+TzlHHzUY-xg^9Eegu)moNiIQF!zT) zmd`676@$lcGhR-ODqgSusQ05*#)pLHe!EuVR)Qqsp!Lr@dGP}REjpr-yZWLc9gd)4VIRu%%-oZyj#T81d#fh{z8qyQ@dSO5I#3zMH1>iT z!Bcl}^C%gHhhAU`A8w#ILnt`q1pG*|8)#^W&00atBZOnEAxjy_PbnbzaH9pEz#%WE zCH9sH_=bGElv%BL1?+-yb7*|aO+L;N2>5i?sjt-rYTrz3(y|M&@3d>}vn<23Z|khl zvZzC+MGlV*DUX=UapX!sd6gWR_&K($SLfuC7igq7bezV|mgkrTvSeL-O*wRU*A!)6 zI4f73n{y8y(H^C!5P864&{z3v&&}I}+Y+5`AT$9y)FPeQC?SP_8pma)l7m=ay`mRR z9ywqaRFZkkT&gaBv%z{FtXO&~VpUh#zpnc*W4lCO&Uj}G+_N@H)mA*eH19Ha%OAWx z{@~6CcEv8+a{YOTSK`xB@01P7Y+eiLeNSNx<7R7YzWYjD>BoMu(E*Y8Iu!6h-E?0<*zsw1XzJx-h&G2$m`PU;Tx1-iBayqGan_t zjjcW8^oUq(&Z`eR5KzJOhd!%yH@2|oJ-fa6pe)HA?zgC4I`^>1 z%&oMBe%Tn2U+(i-BK4=#(4?e0HeWSWL-u?c!#{9TPffZGXxrfQ)89$9u2W`=ohX3h zNV&sMcf;DM!L?{fb-3d+J$OdmgK`eSIP*N)9*c7J$vi@{Ezr3))Ta-Ct24zTe~Z-Y z#=x|mIn8!QL&~Q_frNKVE28f5vt}3Xa*IQujGGQNFH>bY6qxH3(rc5i%_yN`?vF@^ z>483EWcb&!I-`Z&s7?4<$_GT%q zf$#TgmF!J&lfVqk9#0r*rOahNP;%_#6;y&dM%okd8A?5u_B!$^e1F1~H9yTI5 zOK620uwPm0vY&!SsBDeJW{9e2c$ZB$yO$o_y6Y~>*`ei*I7><4fi#a#5^x~ ze&+Pa&4MHksj2to2q4HX9F#46z3WG>=o-C3=f2Pg((#OK z-4;xoX~@n?Z3@vn_`YMk%v*W;&m6klN&B*;-m7$`?F>x3TI$Z+9MO2kZM^zmA6l^o zxX?}4915lRz#lw)5_AXL>|=SrH;mkQN80V@-jjS%btmiXZoGv&k>0sc_7Ot3ck zZbXxaVcjEAQ~UlB-(P5lh94xk&jcxt(ysd9?nGhVVn+gJ-v~MT2^e6DAfxiJ;9me; z2JmqaTnQ`}|2av2r1#pZz^tDVvbM+FpCYh4_Lje!b^gXgBfkmmfNnbcL_{k9)=&6r zy^HEz2ea;-5TyXSnmj}LXO|`e)^E`ru}5M>eAZ0QL|6AsOF4YC=FZr9W;t)Ler5En zy(o4liEMjPiJBQ{1bBHh7H{G1B&%O4OCv9VB}?CnQm*0rPw}}H(A;k%=e(-i?K!!d z%Tl+eg^rK2ao_fH_O26xeK7J5CNYLJ_x50@oB(U`tIpzfG$F}hNu`T{TK!N|qXJd)=Uk25)EIeTi&U*Bj5@4Fj?*K9jW@^R3r7O@;O{?E ze$nl8u3;)+J#ImtJiKk9-!8ny_4PUr8sE0SK%@;6#HM)YZuvTYdBZ`#i4{<)>cn*tMeBDlY&jbxCAOQb{&<>LN>S{h4(}@5B2W!s6Mv_W*#cev~XPS%lH#SCCtI68%Gn z-=PHI@7(aoQT(Tw5eFx`+>&%{hE_FBwgC2c5hlC-o6TD;S=1O6_zUIoAFvlJPNjQV z;FbQ85ESdcyB`xerU)M2vE|_l5s~}o?7LRq>~{$BzG~)g?pL$10h4raq3wC{89|?# zm_e4A1L%%F^QKWs`BJnNB(PuJk(K<-xqUg3?V>e0flO&7D_Cf~#ht5%m#M8v$No=& z<1NcHVv82~2VvV8rxk<9$uN`2<_(qP%8d{6`d9ykw2U&pQJ?8*}lePt> zeq$X{)29(9#5W!jv7>UMRe~BG2s5Ruc1#@8r@5?lj300_Uxb*|VEObP2r{XxY8u){ zPB=5MtZW+I$b(|-se=c=z-I#G=E<#Xw^g>j_KxHV!c!hM#*9@cu)Enr6_Ot;+%tayYK;umO}D$@xv z;HzED;x4Tmw9kq$%JWHQNhIS)Z{XFxp{6(|#{eBi;^L2zGL}R~2TF?7)y)7WNsH9! zIk8h`js+DDPpoXL2)>tt5i*J5NnN0xM?w`V(iyCojpoXMFNLBgzeYnM!RlSG>$GO$>6&>UuwI3oh=L5)4 z^5Lz&csxjrEkgJ+b0zOVTkOG`7ftU!^>NZQ-T(UYvL0hT1@8QzO7)3DmQ)1WW_=_O zl8Hgvwnv6_13JxrmBxvxG^ZiO2L`?kVlnchoLhAaiD{<#@?Lb$;s~h~$(78?W-Y^#XRzo*C z(y=m`&YxrU&f|=PVCE(}pI~|l?nH@j^i_W11XEKHZ{EYY4_1e7a^`n0H_P0mUjnPj z;8bEwZkbu`DyVNoh3anxJnm0*|73NLJm6++tfk6hWrfbT8ijGcHgn_>Re7$;JBT46 z4g;WdMt6Gx)&v!5Fo$hn>$u9OE;k40VsLpZkD!DR=gUTL?mUG)|2kDd>ejAX#umVa zR+!qcZ=tmqoS>G(cc`-FE|+!P&3WO~jN%G46358ts>B>c3o4ou7>%Tka#zU<(McLP zo%GV0AbzF1dz^;1 zrupL*;>ftn+h^j5=yD*~iwT7#TgeMtF6COzhhFwbN!O}Bp2!%9;1J7~3X&0?Fuk(n zNrVYSvz18|ThzTM8j_z0H+49_PRNQHJ#l9tY(9qP*yS#hpPmCl zut!Lq(6%VzSN0O#10}q2uZ?BZ4drObCJdW0U$Mly791zzmG?&~Zxs~@jDQWJjFLEv z6{6$p6vkN%hpYQDtJtp4-#E#&+Wx`Bxyd*uR0PT%4!2R4+N%q~>p}L>lInkkAxBga zmr8jmymB(#c9JT*#1o*=#C4-H&8CSH(2}W+bgT654-`i*YNuIus|~c`Gq0*|%B~zmt-Z3s>c>5DZ$=ySWm$aVIn}a@(Cmrjk zatdkV+?CBhRLb)8XigT9P*dmKF@S*R#-AXllh088wN=f^F^^{UXFDSPlMgxn@43*y z*v{6$>4(QkCt&!a)BVFAl>h0=`FU3S#~1(EV4tmQDTnkU5-Ws;Dp?$+DH4CLC~2<2 zk81%l4^A9s5vM91<)hw$#A(vGDQ)WhL5-BW2j=U?H{oX5nJ-L_%y%`lHOg^1v)%dk z@+CI+*NH+{Az18Tns5o&cG`sq>Y~T^IZ16H2NDx0HBuw=_D2|(|2;{d%7+!+nrdE< zB}dOGu%d&U21)4zmH#A_rGiQLB+&jXpwKGRK1B0CT>=HC&opO?B@1merkWx<3}O71 z$0BpfTaOvJyS75y>ZmO~8EXgeYysMS#Xo}!w z{GzA659~x*{kw{WB|a zEy|F)sgq-C>PSpqxoybWO_fu{R}|0|i6(${j0Ls5vMW&*d6e(D-}ET$pMLsx%|xNA z$+z7h;T$3AqEJId{2F%&c;cb8P}@!UzK_2}CrRyq9!PVD>->g+J>u!>llmBQNa>^M zfphjb1_!<$GYNK4tCIQVE^b`*+^1c6w;XKTl1KwP7ML(}atKzxpf6x$TGFTD?qB!U z#pG)wZPZ%4c8%4it+W}ZSHB|eR{`aDqRE@6l$~|3?CKMb#}bJxL#xoQKiAKZ z>aLpN|Hj1FhItd{fxVkwLmj?=vx$fOZIf6LM-s|v^}BV#at%|+RcwZA#0zwTp~kjW~P%bB-a2P5!C6mk<+$dD|!0YB$MY%h^Be^+v1 zJPTAkXPl{IrZZF!GAUncca$t=Dn?$2SEN+L%x@IPnU{B@?pTo8a8}imdH_Dz)r>4^ z7M|9HZAO$4R+`LX6SuQln{usx@*v^v*pGaGgo5)+c3Ip!!5`700hC?)Q0M9{1YnNx|UGDXCr5UOB z4uZtk#{I`&xaXxNy?k?=nE(Es-W^6oxIdF~x%;_HTkWHc2S>JU!U9=}lavLJh@hmh zbKX3_)C!Y&>@nx;92OWJS6uSGL%0stN&! ziz1Ze{1mklroO2l84KWjwV2t9)IqoHffuPs5~YE)*S`?KIXpDLEq<&e`*V{2Z}gA< zkHvm^a2;)}jQ`VM|8M(cqW8b)qmJZuMmuAHkQU$v;3KmVDhl+YK|`#Is&8=$fsNe8 z>bL?8*O0W*T#(({vM`LG^ZM!a-xzYcW~`v=87}b7K3LAo@LYHQ{dhX$@MEz;rH{6B zFH0L&%1Cz8>CXysr^rYGp@>wJRGffJL8fL(VtEKg+8C9&ROYImp{9YvQET*`jS1S* zEo;uk-F?Z5BXCwX9ph=z3AKwP(9z}8A5;FIHAOdP$7L(f4UKGBwm%;?8*HU{=|hY; z!h=)#_~CI0)f9E6xE5jcV62aF!Mb*`5O~#((;J1Pd}e`Oe244=sjm29$Y}i>DK%fXX(?+^fVuU_ zNh@19$+k*tJ3shzFiQU79I2j<|J!9eOU;%bHJzLai{(pG0>^7+g+Jv9z`jUk)_C1XRTU?%CiZqQ#8F32f1d$pZ z)wcpS>7)At2Kk5~#2#87@IjrJZhqG$+Y4y3EMfH)ozxv`RzK0zKEjVXI+EF?h3^CH z0^mxq72;m1O6!Y!RrdXFefQswtkawjZpzEcr$#9+jP7yt)C2}ljAQVK zfZ&3N{0smR-~bSj2J^Bex(WUo2UD5g7CQMVn-$KsRLu*Ne?*fY#C0xIE7vTjES5VS z^{x(jA9pWzEoR$qrZe5gGlAo8zQ1mdcmDq2c*$~{b(!tnKc3BTgZy=}Z_9H_cUy~V z*OyED+A8?!`Wh?vD)&m4^JZ)FH45Y#BFA&vdyDqIm1M!`Q9?Wz?onoIF zPSt>Ab~dGcB+${W2JCd-T!bADjed90SbGf5(O7%PyBh4WE=MfVSbN}85o31mOBy59 z-Zupdt4?9$c&j$<&gzfa#M+Q|V^n3EZM=Omn3jEXlw~`g*ogC1>v&tvUl>N4BcH^m zQ-|G|2CL^i)U64a_}vknc)nOqLSNn&;V-H!q&L4P97a%M=<%|NH4Sjjy2-$8^c4Hf zC@!O@G4x~x(%;%6xDa%4^!xr$3>1YU-VvF)HnflYbbpfU(4g!Q*w7puA=vbiZxtcv z5^o)V`QKKN}7n!M5;5btIOHjvb1iHYt{Z%l)&!Z!MQNI!~JSQ1LiVg;))XrFY7 zKWJ|U+buHfcNr#>6TMSLF9#TI)M!Atuwb-#z*301dSz}qLjO8E9D;+r6njZaNdb<9 zVRz3K6}b&G@xX_*bcg4XFgq^c6U*WPGQvI$%rr>;Fke(j!sSwpoubrL1s`sFWZ{a) zpcbK2?qjCB=K+L_4E|J$R!QJseGTSwjGM5I>0YA^TBt-=G5FzU%NGH1g>&fmZVTRb zjcotdS@VdWtMbFAMhMX`EGWVeqx6F3=GV=ngYM8srBD{BfoJpD( z;89``yn{?Yp@k&=uSr+XWn3EU*kvXKsk1*9<3Ts5T=8gdh1)CqPT<2A>`zkR*EXIP zfkCqZmWN}I2=@|*0mJC?B_IJ@VI^x#L27gM)ceU!>`HI^Vzf9gJmGHgGNiMxMIGu? zgYKtuQy?gwy(n+^sQN_jF`-}_;;FPsUyg#NVzf!f-0-p(n9lYjRK;~PTPRRw<-qg2 zH^f(|-4B+5-y|7+)!m@3kfXNpo%dQ9Qh5}ZLK>iuwf!u<0 zB~`}Rn4a8G{?17-s2>70)pR&wo3$L8>Dekq;f;rsoJA)qrxFv2R|AR@87(2(fx}9 zf;)Ia`O4E3nAr{KgLk8R3wG-l;JS|s@j~$`^bsH6ddP#AkoR)n?eszA#)mi(_!<`k zM-i1jhJL zg_09s-j-P-fbzIF$+j9ng0h&18+p{BCAn6+N8lyiKlmC{FNmGoMR*i{8y3JfvPt5l z*k5{U4w0*HOZHj?h&LeSG+sXTIj$jQn$Cfv0#pwvSs)nZ-gxSqK+ZxO9WcB9fY{R) zq^Epa+GXp#ymev5o>BnPQmH#|$`l3_BK(ma&hBb9l&TS#1t|E* zv4|anxRxGx4~2!CA4ol687QBiNnZ4PlGnuxP9mw6hE0k1rP!~>up&%V8w^zfib5#q9i=sb{V#VwHoVHWMBIH4Z!yv-4LQ<~++atLHv^uK*nw;)ZYVx6^xwiU z;z1ar?xKWKUxZ?rv5*xEE@*a?^`N`E2ou&}Sa9e`Izkqv_$c!Yvx`4g#-H^2~l=3}PtHJ;82(X-`3W9jZGQ}d%95B>{_#TL<=6hZc1 z>CZRGBtUxV;^(N^57!RoXx?NKG=1&BSkr(QaAYzE)@1eX)FAT3~ zH&h8KSe5#VofmJ=O#J>0a7Qny!aO&3c$J6<^<4dvx*oC$ubJ|`iMQy3i!POV1Q zTg|4v0V#i(Z*3av#vw8q+x=^c!8pwl_1hp&EZsq8&MJJgLws4VjfHsG3^E#(%8h(s zgd|e$Vtn^8^G!K2a_u`=;ABESI|t^I35y1znIQ)eF7NkebbG+Rh`bBQNWd!EvX*MOk0Tp_t?Q~{e<;wjrM2*%C3?EF`{Rf{hTrIB7law?lMwTzh5EVCaX+5r;XyI0&k z?*4AjLRYJ2b3Ii+@#Etd^UD&|$Js}4Xc^H)qGVpmR} zZ$kC?<{Q<&XKc%QODD8kZ zZ_o$tAR>jE%B*9Yc{$H&PVoR`yr6^$#!~@w6^#>4@SO?97XkF_WU~hKMWJhuq7LAw z0AdXJK#8~j^Es*_?eayI;>UEwcWDamk|bUw$y@@G*fp)~rV}4G{?yhz!~l35?F$zb zUf4po{C9MdE@*uR&rG}6MJ+I zbQ7+Ac<=91*Nj3(#!UpBX&?EZ3N!8(g%+Th;WuO_S%Z0W>AYvd`(`N$E^W}oeTT9T zsy(MR#1y3-^I{*KD}S0>7K_>vyWSAMFHN`Lh8ZlQ+1+@NZ{Sq}2JP6xJy7aE+utBt zVT*gDRY95dv|FNEHvJ%WRI~(A4WU-WP4(cU1A)Sm0!ga#(n2>FfQQH)Nnz+L|EQiGgJOh%l3*FG7OFZ;WUTn3fhz;VA|BoW$r~P zsMT3Hl^)nOCCqJUHUx@PZ*MkqOnMOE6$XT~#Z&b6lRl8~Nz-9L=g9Bx*qv_va#j1= z`0={U+2{PnL_fdtH2~Hpz49=f<=P<s(-)r=KOLyAT$Ggg4g zDnC@Dx(!G(768jCzh=(7sq_%XsyJs2@l2EkUZ{2bV5=!XRtUASw)OnY>a((hY_?rBsYX@Wb6_Na%GsrxiNZ( z=$(MpbzTJgf?%q%x!ulO5 zYy9z42Uw=eC2Qu2b;xet-+_+l5N9z18ZUgn8e};n7Z-#Nq1Q3-bUKVWIM<@&*$-;KXEcXn;$N*gI~yt);V`0=aDSr!vp(&Ahf1H{g#gc>YkE ze+^1q)i7xZE6_^!6MSAT7EcuHD6`%8cUW_ebj0tM z1<%?m!M}Fc10%%Ce2M${N*KV#u??SSaUS2)b$ke`c4j9p(9a3+Dyd|HmN(rsx*>hX zCNCzC44yP~RcjNSAL=(eetuPFN&-n)@(l5jc=nCa1M781mB$zc`3DihiyZ*h1?}r! z*p+_U6W>NZm>l?ztPcJERBRA(bop02u3CB1W|1GB2aC)eNjh@}-c?b&-(Ds=g^R*F zJYtE`S|Rej$62+!axG>>mLfM`=opRP0_wmYZm$r&Q5IYrc^ppt{%YzftFe*kx9|7e z6PBMbHRfHnQmp*LN{5_(nRp5mh*hNr-&xo{{~I013|ky=+@ zq#B0H)MFjD zy^CbNEBfD`&o-bXNpK`$%yuV9l?U;@{CJN4(!HBF` zD`=9=J89?gQ1g=|D^z|}FI5{Af6d3@3*8WxkXvLlshItcg@4mz`Dr{uFs^JtFkdn? z?`ANy+4I69clMgQw&_=IVt}rOz5H;R{w98~NUn9GB8s!SM z^2Lak#*w_GEO?3y-GrYAIqwY1~gK98LcmzA3|Paa-*f z_GjcNKx5yBX-=W|{$<#vDxy#1){mzu{b2vB{~M3}=cx{|lRrwb(AcRB2C0C_uOP73 z!T2>iHD$^WbZ@Gq`xdR;lY6(MT7On|J z&@|N#avA@FT+;q8-q(LL+Gs#{B`r7ek)@BbrN8+Zse@?%8bBll!2>fu6fpQ9Ce{J> zw>2k@i!m~$hc^P-nbYXl^{+&?SZG;lNoh3)BttN$R;|$XtZsO_d+vH#>+M?py}EQP zS2_RQx|w8SG9ZNjc=$X0`N!e;-)bs5U5_)1vxxJOUmcm)kGnSSc<yCpC-cNHWiV4mhHW&bZO}aV6P(RS&ABxWDQq-{NNgxi6{EXpb1q7X z@y8b3IE@Z4Y#vPn>2r=v@MfQHIk-m$9o=(6PaV^lp_p~g@*Uf?4@K^Es_qcsKEqQj zwD(Imbx-nHu2$O?WGve!hL>?6?;PM(Zz1RNR5Owpxz#)>i&`}^9*Q)G60+%JvYDS~ zZR{R2`>9W%w7X`e(e6bSm?a(SnPqHrXR(S}6+BYK9m|>hmx(; zrc%}t{-h@`m?^SOgS#{FU}TU9y*Z4$S?t6px{X6Y3@vdU;K zGcP`{mZ`t+Bc>!;MS&eQ8qJQxfbudNRU=OyN1v9`3|!dF@)z(&)S{|nReVUW-%W-d zlgUDJS$~q=4CuCCTv(5>o)`Id#+HLl9-ll?#EKPk@UkH{0ux|&wLfnO#fc#!0_3W` zpz5a3c04~J2GHcm)pGN1@j28p7ECJ}EyH~AA99z4I@rLBK0D^tG&3JvGARH(2=ox* zrcgILz;h`f5#ky2Z+WfwYN-;hely~+u~~ zqLyvq6YFqLpnV*Fb@7oEBZXW9D3MOT6kq@Z7bjS0HPtACq6ej65;2nUj2`^e4wYj;=;CRkbtm^~_Dh&wT>=x{@ZnH-wGOFqp0u*un)O1?Q0> zfuh_oDiE-2QIh~-fedzL4uDaA$S9?SlTJB3Wi(Ku#zAL{N$EXDdv@ z<_eeuVC<8q8Sbgrru@r?5Zc+mgpL2Oij2`U zN@SbwpTS#xA|~5#LuG&$Lr@k*@UhDdyFn7Gb&;i?Mf{2H3eHgbon({P87(Zzt#5&o zD|mhdARLy)c8vOj?oVrvcvH@Pv0}7WQ+P*PLNybiRFrP@r)vg0BLnS9hd`#9nW|Bw zK5r(i+d0Oeq4&LNxG3vrw5nnhqiz@Gz@=wWVhaacQdzyp5aiiZPFA-4@=xPs;Y-X+ zTRjp7GrY7_c*r1ntXde2$ynrwgDOcOo(%-epJy{hROYFTMq(g~cC-9NxwBGC*UPOz zf^3_7t#rzfNwHF{^Fq#UX+Hk(>Idhfr1VaC_sg!#LB=*L0WS2L+L&U6Hnmf5G3P&r zIn_UCr@#0ypGJyPM=nU*`WhcZA!7?4_q7WWUhQ zVNd2q!*5nT@W%UE!0PE|B!_os@Ia?Y1$YE9vzg@CY-HtIo*!SF=%j?Dq^G7bM%ymD znQ-PU7Jl$%@6NWKeE`7jmlQtueC3VcExZkWARuRQ;_YcE*k5>MqQAQI{7#c{@vnRk z(9mRW`FrVA%0GjJqj(y7KWcY~(;B!E0r6+y&8Ejxec*~KXy#=>NcuE2Rl;7rc%r>x zqhUwB2>J!CuwoTly?gn5e8Wla^zUoj2;S-&l40ZJTjIi2?E}z9-Xm}ELuv5~hB+?d zDR1S&;DKx|(u@bGX*6Ff%NL+hGz$#x&!C2GNmynb0D_dH}h;>33=PFT!b>85|mOb8mD*K?xMxWN1ANeIY&;Ic_vOCk%>#UM6@3iZmG^pN5EsXfl6fBTY>-(AKQ_jIX8 zmn(;prE}!HKJB`O4fASe!}18LYR2L#}MLnBYU6&FtJ=Z$Qi;b23hLlWOUv4I= zWZDA+d4TqH>YIv*G)lV@yiknxe*xox;#dsI?V?)B70Gi_ zGgBL&Cro!_NsnNA0yexJd6FPPociXiq!0>Gkmhg=PQ1%efHve)8z&gVrAB{v240QR zsn^p&J&kEE?P^6XFp6WXLz@}`ZcjHpOsAczxPW>BUv1vux1k$0+P)B;MFmRsCN>Bm zNw1vDd8lYdNOXTFctT8a-S%*{f6f$h_oxA$602XFiTjF$BvT4Bl3T;^-F}`HKc0OeDNKHtQ()5&)s6jjD{!21LCR;1jR|;rAAd zG9DU;SE&+%jSSweA)hEs{(k@3zw9Wlr)qem1BH;!fsCPa^MZY;i=lH=g@P=W_whTS z0`V$0L{7gd1>aO79e|x8Z?jp2V_V#i>dPLtLJ$P%mZ{8b_Bu#1|Hj(S{~CIKdJFbXfFS17qw_caocQYdPgry z(}d9bDT2x;-87KjG+iCvsj2pB4g($GN^~IY<`G`A30N=SW;TggYx-Y6Bnl26*+h=l z`jL^YUDQ5$fQr}3&KLbPXW&i5%X1fEF8&=R$q8D9%%pp>ge)U9{|Jy_KcMFwW%6Db zGf({u|MrXFFM9SN9j~b42k$6D22}wnr9vvdZvZ&vnq25Fsy(L4eWs_|G??2olh-L! zH)#*PmJJK5=H)eu%KBwRA&&!F*bcByjUh6Djq>?!%)zS;z=BBk+tM&p`Dv)Wqa!X(pIHc>!fVeu{ejrecg5p8aJJny9 z`ntjOS3%YFYStsxx2K!t7+xi?pmI0gE?S+}kH2`puTd8y-;*|c=Z8c-P?rU~e#pDH z&OAQ3`Jq!Zhgy4=hVw#l33!xKG72QTj#0=eI!AH{tQK$h%k<4Ea0`$n9-*@g;?2-l z+9ch{(zEmJ4*a0z$&YHQXcFJt=e6al{FW)TW2G<)Z^3;U%)-t%K6>*X02Q^aZ_K`! zv!|FvpkO$>Z?^^xP?^X&cF2M$0@qyTG{R`Vv&0hTb^?i9=~Q9oImuU|qSyVc*Fiw- z-??K}iTd6U>w3Tsu}l7*O-|^m3C**^?wOt&q!p*r%7an?+R%8zx?z@C7tsBhlt5vJ z2^AOwfRx?y6|o*5m|Rmb=nzu@rwGL25sm##)f4fCLEj;92%-Noy{nECiy<-VMm|`m zun?2yO|9cuhO$k)uolH1+{PzG%zKcNzu)4fL!hIMe|^&-u0o(Aj6x)uGK%Wf82s=0LT3?`wrz}Pe9)5KB z4uaAW6|glB^xRy2!ij0il4kfQ41z_k`Grx7L3}l#U?uAS+W&}&{&CeFHFp|*)HL$2 zarh44LW3k`7S&V|*4}QlWypOp;ts5`+d73E-h}C6t;HpxWert&ekJOwWxr=Oz2G@2 z_&Oab)fCpn2-YQLEAoe-qc#4_-Q?ykd6qfmzALukhGF^*Hi394y>2aq-9%##kNeow zFeI>v_?Jd13BRZNm&FWqW|#PGgVnw1Bq>;fm4ir&3@77KH)El%3U8)1k3gnT+V7B! z*IfSOT*2_%e(Y~h#}CRuWH2iw>^d2HzaK)cLJ7Nm=7Gs3vZq7ZLFXf4-gBkC7X4NA zs*%TKGlfSijkbx?7faYT=+3*A+of;xd9|;YZ|w$7e?aPMi%8w4gF1$R2WH8HJ6-T_pYJlDq5^|qW5X$WU&qsxR8gd%VaT>o$PTQ z5WSjD(^G#B3Tq3#F(rS-LuTy!8mcU_*8R~r$Oe2w+kBS#^+vST^sAFmE7(DmC2oqN zJpM#uUuOb$5fZT|RdHU683o{7=AMA_`;}N*B;uE#!z)8c_)bx~t)H@g*NGO`DM}dm zi8-=0*9Fe(B-#l*q;Pl3h3%phpJaf}1ZMJB;dXFSBc|%b9fvNvG%kk$-D?(EMXX;Q z)Iu#lJ&U-zrPVc>Va^#&6PY<^i#aRNlO2GHJ;Bv^5mY;Qp`B&ZOY?jMM9~Y=JIC2< zp5(EmiK3=Vu&q+HXz$!vDwzRV1DCl>Cz8uo)==CWp;2SO+>Ugh==G??90B|F!9 zYK)QtUU~Y^fLZW8Hd*0HSd}w9c|q|$+f_w~WZ=vVM}$%oqQ&{ul6ph(cWE$%N+mhVZBXd|di1&9n4=3XiW22{=Tz)dhG-qkDM8OzH zj-)3t)b#2Com5+ANmBjtRxWQiy{^PB?qcHmVl(UX-IMxP?mcMNOi7fzoRu`7-MHEa zjH{1c_8wH5f;#suv4p`Ud-uALRCFtWdAK^B1cBajutdY#XYzKrNAWjMDmQoZ$VuDg z9sW+ZZApS0ioz3)LSo^W{31EK_A$qw?u0>*%8iFhC{Y#v#|f%K}?z$B*pk@1aaq(NUZd4P@SmC!vxm2WYiX5erg}5Ki<_3UouQ z1#krlM%d;N>P47EEE&}sRO;5BAR9^t<8x`n+kKR8lSg`iG8Qd2Bf$6k4H4y08UEt{ zixSNAs-7Xw>_Zq5bs73sJqCXBWo>R*f-xt6)rwB?s;y%Tks?H&ApdOF-z`4PRX=w1 z`I#X5KjM!6)vo`9J0>e?S^l)-f0?)@vTR-tH?4S-SIZMe4^wzIzamnQn?q58;E`Q2 zY-g;;k1HSaDw-j9-GaRq4l#8S07H;4+WpyerJcIrhu$*|NkR@TS8ZT8p|9 z$Dcp4%E=~|0p!}AGJ8`omr+#>&!37Sapx}gm_c9c%$rh4oBk90ULdMiDflFzw10F? zJU#q0*fq8d<)2#ZzGiE*$%7Qec>>g`^XCL4Tl)fc-L-;kPrT8Rk%e7}_2r8lz5T(9 z9NtxW-|Pr@K}|%Ug-L#p!2UpgMLLBS>+-&UPVaI)bAh0fsbnu1_3u$k>CAIcGuQ4u z_pQ@~ixza(o5#48qd61j#3v(_(joUl8!|+T;u1n>Td-)9wg2b0PMAASDmM9y+BC>O zO0Tn}F74GrZpED#)ZF7?-SQ(+J#4?0zQ6Irj%N+H23@N!e^ah5k=cz7(TA=env^;) zxF9ia0l~XE;;H(9YDm%` z*E(Jx>@O%*rapi_DGorb8f00KxA0VJuTcMN|6b`nX}F)5e*fuS{$JYP`DdK)e`p>Q zE9uxS(j)WOY;;TmQUQg$qF;_cT5G1%Aj%1e7a}4SRz<~jclJ}JX8?0hQ1V5DN_dHL z-vYfVgjuptLKAF+hpzFizGQiNU3>kbS^~Sl3R$*6ZdfQ?DTCEoH*BAI2rCwtk3OLc z!aFEB8!L3v4K7sPWln$hp)OI26gxo$*%7$H^n8d@PyK45gCKCd?tF*J9gsU5CZ zyz+LuIHCkrb}xqFy>-!;h9#`p2hr||Km&Z8+v+Q6wG9QH4WI8;Mj?&~^m)2%6FxHgEIR|;c^uwA!>naB~ z=Q^u;-yE(Pf2_pO&s-qQ^X$gjutCA8`& z%FhB359O>L6mO76IIXdB%lt5*v$!~shlI`dfUM0A;L9L=*i$oZ+m?6Y`zZ3zAb|u@ zoJnHv#)XEdD%t}?1`OKYEQvSh&`Dddb-YC11|>SocWR=G=_k@GRC$_eOg_04$L1$C zi68Zed}ngd+u0>k)b`qwKQ~*-;|1u-)VeKZw6k`edtw^MQdvnf6?35?;W6fgdnP(d z+wi^IKf4&b;l|C>Ps&jLS!VuMsYA&2A1)^Ie^N(u+^od_|Bue!JaeXSsCb`78DFWWTmAwVI2Q^BTF z7Y#gVsk2f#41)C)u*`>wvNZbfNAp3wX6yByl#4RpksuLW%eU$#6DpS0mN6{z?h1O( zH+segqn1lo)e!m*H6Qdr7mf0g{gLbU<4H-5q0^e9Egj~YF0<=S*V{e0WS8I|V8L09 zUGH!}K|iw8CwLD!`X8Po3PJ+CO9yx%eb2wte-NGwi6wvHu;Qm;`9HD<{_8p{X5ei4 z9}0QJKg6g-d32u{T5Gk7w6LGn|Ew}CwpEy;z!?4@;llK|u=STl55`DKsg9T^Uy|_D zA-I1G2e>{L?Mu@+2<>U@NiCgq_w@Pvx5S{i@WtH7C?&Sf;07a0yhRV<&*3*8?5 z5m|w;dOPI#l@YY1EhG$rrBeD_2cgx&j^8^?>ICEVh5Z1|DT|6awEpX(Ue>Ivf>41Z z^kux6uwh_6ryS3`=MfyBR+kfDibLwo3Skr|w05NMwqHn8M2J9ScZFeMKI^Umqt&$b zZNVZOkWHv(fM=7C+V=F@Nl$d;<75m6mk4z5!qV`V9JkFomh53Q#WW`xNC!Q#CP{Km zahS&f=Qbq-HNHebOt4W3A?rEuIY{F>4n*TU%DAILqB?PUa&3-6qAR?MY3 zXc02_<6>Rq3#Ilba^( z{X^lq&_Fz4bq0#y%*;3CZo;uimIHw5a5sWFiY20z5sIB&gJKd7?jGnlp-PDY>9f-o zNpzNI_GDR!Qw4cpiP6`;ump6uf5|NT1hDZ>0CW6r_J05H&3_8tNs9q__>k}Vj6^qc zk#}&Nvl6fhE>{|5%80zVPX=g$gv2ok!t2WRGoV-b1N07gHQJLAuZLOs(8DjdKCBK% ze?hH$p<5!_9vMZ({dT@I>#3Qup`v)*DmHA?--3?G$+Sna>tSuI*^?2`=@Wok(@B03}`QEp$;#E4tt`7cQ&7rgLs#~I_e9EnD!+vRq55DaDfwlh_i%$!Iy{=O5zpdh`o$qg3fEgK6?uhtE=BO zMn7p6p5ISzs=w1`45S7uxwC+?44Jv002qqtdepI1hkZVQa!k(Fbiy^b2r+_R0y zzGCJc^VIBweXPZRp-wZawgSQh-i@Ni$^991y|J(1@8OR2&{?CSfjqX{Z7kW)YtUKI zenL(0ouO@k#I$y++0aeyo%xN#h*q=V&tKo@=jT4}oUCU%i7(IWL`g%TxBc`n=b~1n zVR~rsSoo1&-N~t4!+o0eTwP{o$gJI6^??erktN%rosK|0C%&!aI2e{zOhjln5NzizT0NSQh_p$Qo+)`KTWY7Y+1?+vIQG$DReLvnG?ARi1d0lbzt??x zeEpR*S`ay76~!3E5CygLTu>UJd%I#LcUnjTV}*gUk1f*`vWiiY?gmnu!5)?h<7Hup zunOa4asV14?G=MWYUAJ(xz9R?20aMP5|Ri_1dTeFiq3SK-1oX;8PRYwRn=02aaRu^ z{b$?skG3+aH>bk(=bebL1e@JsI~(oXb>hK5 zuF@nc+3up`#_&GvIOi522ib-iuXsk_DIICC*3PwweNfKAr}8dXTz=SuAMTbw4aEC1 zl9;n#q3zr*%=;vxmbag@vm4U7g*8&Ur?By@3GpPt7ym1~$VV9ON087EcDS({l$bxc zp(lb!mww1Wpc|LQNC92!lX9=vpUxO}UP9k+=xH}WL-8B>5X3uSBhbeLc27K>m-uhh z##iS^5!=xNc3EQ7!*CIT7W$s~$JmxLD4b8OY-DC{0ln{5Wp8&fZ-v$GoQm43BD(W; zKEe^qEEk5Bz3zPfc^{*gIq1XmvjkfH zq-mc2U(x+vm%{i-SwIHlkZ-^ldOvXTo$YqN=-*Mm>yQkRg3Jw0Dx;vGQ^QW2z)m%`N`pQ+RVz|*W{hzO0=8L6{Yq1#}p!n8tLhBz~i5rkUv-00`7&CSSMX~4d* z*&A{EKa{;=bS2Q1E?P+{so1t{+qQO`ifuco*tTukwr$%^#dzsHx9>Q8UU$FOKlT`F z?0|Aj3HQc6ey@WWq7f~?V?zx?8}$^{wX?6v%l~^t9jw-)0B9uPzW?whAJ3A2j-duN0?aXO z&VQt@o_<|bZ}WKrqYu=xBhv59%;M#*^84uv%|S~s5l-TmT}e8~rM+PeF-KUqj=A(GFiAq)tYd^qKQ(d(NoLW5)FINKEI-qM6Xv}DlH1X4qRL$wHjPuMxCamZ|qjt zP*+*mjqA|k@Gf$N;i&oc_MwelUJXlLir zZt}>zDd`#q->Ez{m3FagR)ULe6~JLwh|7@sH&897GcC8YdX43IfwJo(J(8SE^TojS^#QcvK^lAD|Q(`&@;X)S5B{8 z_*vK**6AkyF#AJynv@oAQG1B!-KuLk^SYTf%4I2tAx_RopO^~A2T9;4na(pro^u+{ zD-FC28;U6-+Z?hmXY+&CtiCxs4Qor( zeilva?_!I1W;Oztyp;GOdN-VTDRb)7`$cNrC{Wsd=2)pjVnahgZqF2n{W4dWR#FbA z5ChwOkh)vGd`K;Ci*HH!_DqAS72aGPs#UWZ}prA zt3R{;*EN1+{g`L4SfE$PE$xEND-N}xumeqi6%9VfD`Tp-4hVXkw z{y)7k{uvDZ!_@1awj(l1ChQw92kMwfGjs01Y_!Zo!t70Lg8S{koj{Dqiwm|9Wk#GV zYE1wg$?KE#<#1Uj@GU(3Uflk8gwl3jFNqo=l6Zpm_uLeiwFG;*l>u{b?U`+c-e#C!qNb<5I}-{LgWhK1Hg@f+G0ZW{ zvD5|NUzYSVQvrh%h8?R7&)Fr|u*9*H@4bwzHBhif6+T%l!yf&_J>ZqsTuTnV8?i5- za!JhJ=+W3*RZY|t;WTIMriszGDU-}8Hf%R9yt*LwQM$sGC)K>8ywlZuWu5Lfq+F@D z0JhT5>haub8`EKrX-vy|Fx=4d{5y6JvcB1vl#%bmqwqO$nrzr{WcTw`GfO4MMiq2E zzIQ9_j;g`*J~XcNJ&&KQGQlusW9$}nGonYHwtBFFGjTSsC9&RPtDo#xnh&;Ci@p6U9ijuTCy2<}iIla3*AyjzR;M)?PD z_h<1_=d;7cQfCZ%nqkYNJTiJWbas|~fBF0q_gwb8hq062wCNruudy1N9SR=C3Vm%T z4ahoamfp&MLqv*e?<^cN9fr5z2oo~;5c&{?HN*SQ@t$d5q~!CqariMxT|rHDS#9g$ zyN;{EiB*Z+Jr~NIjIZ}s;j-5+R(_vxW26&9)s{Pe)ihCbWZbYmcq2a;%XvctrooB7 z2uyb(VDX5GvD`@qtm&AwBExYdUm_SL&HjO;$Rd{|wFw84%w;xu5dXu;WK>)AB>B*~ z;Oo(vxJ8KK9%7O;Mlf!us&A#m)n8ceLXKFDJhrE}Ed^DC3|g-bS^GJ{-X8|IY9ESU zjGEe!nZFz&ESMhKn!fUw-((k#Scm8@rd2n~;d}@2YeU5L|8bFZ7nu> zJNX2(wF+IbA}&yo8S|ix4W104E%!7~RASx)tVl2$qb1*KXqLH)u=eMbd8Eflv0X}v zm)g+r0&F~UUUTL}cLa*zNwqG9#c7n!zhLFsRV(Dz?;1Dtza1+4`$7Jv5|^kTBQ-z| z@1<^Gu-sVXeoyMEMhEt=)0^(sGEVD<$A=%3YiOpJTD14c^6%rW6x7~5Gb7zCX~yeL z-bVwWR@ zJvX`LD>IQa61vhWXl?Y6Z|Ogw3|D09)r?jmQ-n99>TUjWWi(M(YH5Y~{zpmwe=wr| z>C*Ve$e~jm!c_}^@+sGpoa!bq&#XNc#3~~sP9{-IQwWMEx#pP5EWtn#s0^=T{5zha zet?b13NoYu7}$>xGAvBFvLvLCnLruUNI`ye<4N0Yn@#w3<87tr z)7;M--n+fy&xOzLk`Esm5uZc;+j}l~FCGeS{(gK(dvbn(d{ocjEoLqF^1@>o2+a^{18w9QJU z7@dGjWLuvAF=T>fEViny7r!9h>W(ZI!rWr3+Suaf4I%}}o?!5;EuBUOdHrgj55I3IZ(magQ(@_gI1#wr49`NFNeLDMW!Pc7oLBg=PQj8Ta7+)+&;eNClcvO&$z?I#l1m0+u(|}f*FnSb0FIu&UdJf@|$)NG806;8qsTiEt6GX1;m;`xm1DE+a z>TUpqOf(Os=1>g6-}BlO?$7|KC{2$&^1{rRCDwBq7eY5W*mP;?Ny+TaK)%ypm1DRe z^E$S8nUak;-$REeO(@h%Gjm^(`jwH2U}E6hzP-)Ix`6ShXpi(c<`);3A~p3S5Xmtx zBV+<-JiM>CF-IDD>$)0ZsK3b5jF>oV)8F5?;nJ&*OnlRZ>1{gNdFc}zSDlpTtnS0e zolc=c$jN2o#^wxN@sWR?Lja=qJ0i&}ZcAp%B_XOD z>?2~totdWYbo?HCyY+o%CWebp^CT>enD~AQT$d7PA z*elY$t&EyRNg^>%r1Y~sA z0yl@Jyw7I|`CqyshaE!LF|t$B;1$CmPA^!Qjf^hb$LV7fFSt=1vx?OWFF73Bmf#je z@hEnj^c)}uSTBaxYz65<7!E6L3j3@GBbbU&lV(fKPEhygD0CS2U=Pn61Ty0JmWee9u}+-Yq%6&L_SG>4O4hTynq4if=7c|^5BH~`hJHbO ztjb^ZC(?u!ucRkfB$x^bxfAzP5oTV*w^fWRaO!!-?I7Pv?JLxW-~S1v3$&zvWAVQn zN)Lh%o1PLNYSY;$B|bOW--1*}7V0{#SvAs|l(ilY0I*jSyS zQWUjG7Ert~q0E>PDtL9eOj(*iaWiDp#1x1&8No)NkWDcV&P2p%jq~-3c^Ji_Xok|N zzd?wW3|zf({$(efgr4gpDgBrfWq$eK-P=lssDNs5mCd^L8SLBM5(uQovWZxpAM z!w>wX)owv22;bA-08U^?{g!?Xgpnb({~&QBP;LX)yD~ui*%>mqXq{C2XFPDLNFl*B zTHv%CJRXTCoi!}5!4VXcYxqV(A&)aU|E z)g;&qcsB`GOIViIcc7?m>{*kg>{3C0L%O5fqjaQ-J)`z_0(-$R0f^a3 zjee40_wRKXS5fCGEQHx3ODUxvpr#8n-yUsPhx2(m#0k<3ptQ`bwUyhl+`GUmhr3q9 zeZ3GS0(DM_>LdYu$clDTQN22~@Dg!uA2Q}Fub+?^^LMAu!WoNnBd{3>AD@5E&B3rf z3ZPGd(Lc5-PMUX?B2GN>4{?2Yxq&)oMRl(D=^S&mhfkhNM7m+FF@wF^FO3IQ+TExJ zqfa-s`u}oS4&Mu$GdH-2?HqoQ+EEV8NTUlu<;KH}K=x&(jHBR<#uLho<}UwcHK`&l zU}uB7K}eYMznN3`&EU64Z9v6in2k*rmg-|Cd1Qc~^@eDvG{1Lyq>NwIo6?RE!yY^QbdtpJ6-w=?{nQNAQgq?DoyUyuIr1^ zUi2r^$RoL5y-J2-{D`4~3VDk8{@JWA6;+%jVHa7wiN2(j%;_SOf4WD8E-xa>$mS9I zdNRDDefoZ>>reeDiDr%csTSWvgUZO781dp|Q_cF}RBWSEpf)70d#s-j3kufC0-rHO zOELrmj$4P!Bu%ssPVXs2Vv;xjz^;5+Tk2t3T__31YrWd|E4zm*vp6i*ddLeSSECrj z$wIUQ>!vh9-fG^rje=;Qv4xLl0pokkOSEwK>?m6D_j}FAgRHrw_ja?SP7&n+yMmSB z_S4}fB1g>8jmEqf&mW>XPx$m!<`r75frv0gx2k5_0jnK*s(HTfaVrwq1qV0Q^$%xS zuGY?!aawB^hgSb};16u;?x=BGYc~7U@ykrDtno{2tt{1pp%<;k#Fo#0q4RiHL}EyO zQ+XD@r{YBa^&5r5zeOC=iKxm5{G;=a1ZXP}0pNLrx>EGOe^NLDsk1J$r9(^p)OG?= z1(sORMN~uV3vS<|$LQl{6bghW{QSA)`7o%8=d=u?W}TQ&{YggCZX?JqHKSZ+Nl>k(l~z=KaO6Vy9HF3h;QWj*JX#5ZOo={`Utfa*51zk>GK& z+FQgR)0XShp2L@$fy_Iym#(svlpDc;AzgzAQ z-4#!j2~sDtU7wZV0MoM8!%S3idlkGL@`o3On%8xfMN>K7cj}f$&5rZ_k%GiS2fIia*wc5 z^0&)0XB_=&wpt+x=CDY6M!df@tt9+;FiCGcTipOWaXOX8knc~q036=lF7%id`tm(T zm#xJ}{|fIFU=HU=Q`&W@8EV%&8Qsi!(Za#VIF~b)erfd#v7_Il?1=%fSXe3uBJ6)~ zP{59qx%(O*Vf0Y;sc{KP_pCbd^}hwPPhZ=e3JCq}l#=uScSDLv;&5%&ae9z%_Pd^r zV70jF?4`Y>o5?nFNp39GdNRBzk7hxutZZ{;KItJdlR91Ep0n9(fr0(1qr`MQZbwDj z;wBGf$jc#t7)c&Pz^NH_QE)kykSh|A;U+;jNWS4VO1q3l#D$0I<2K>jC*Krbi@w+h zslEiBKIb4O?ULJ(QUy}ql|kJA=W1Q?z#0U`^{&_0b4&#}@ZKhZJB-;q3Fqss8^kuo zJ6{;u*e~Lb20#9h=bN^go<_ZRCnF34PFytCFzO$f-!?HS0Ql{WAwuEK?uZ*zhVjJ&>*Ie%7op_k`JkQ zQE!+9Qi&TVxP!z@vvpy4?}kG6NUPk|c6mfR0(VX*URi0+DI5HFAsDm5FhTlM)>x3K z<&E8QV(}d(J-27gK0l=$cwdlhCL*(9*3PM8mAeLGnqI=zyaVMEgjHX9@KL+Ono*5d zI|iVZpR`UrG8wJ$17tRaP_;u$n8S_-E}D8ARdcef_2Np;6MB#djZs5^;BNcTiuU0K zI&eQLWbilp#LWhzmay zlL7>VfDyq5jMc)H)`kyaxf$=bo{wY%FZL9h!*Q zTt;uK&8}jPet%2tz2+`Z6X7t~VelAhemp^)fXrRY-s+`#%Y(s5+#}R_s-=lJdMX>^ zvd9My3$BEF)!lmg&+XT3=H$ShqN7$KfH>TwFv|tp62pq$GvMGQ&+{1V;KNGXLtuE% z^~@9UL<;%6QUJX-L`|Q#iVmBwNMC5-TA5kvc+a*aCa5?!G@H+;n312?@0oEG?oK>b zs$?(5z-G7#O*j~sZ8vY`jgrFTmdsyj2&^@;WISO?qnSAFC#`SJ zoE5SSUlw(wI!|9(YY0BawV<6Z+REw~s!Ovtt|fSl!*E)aTjXE=bmlrX(=s27=Rutw zW>R@}9(#P_9**Wro>8rgJZGT01j8f@oUQDUVy_J{UZjY2-B8wj>E$F72!UMQLKQYp z*_etLN9C$Qq9(8|sBE+b$+Wp`WB1W&-(Rzs51nl4p4t;&k8+fh3LG)RjUl*0;32s-b})ioW-HS%{ya0TmdwE8Kn_Q>`zu4x}H>> z%TDN_DhxukG|o@uh?Bh!M&V>%b$?-WYM6{N(i98G(#81$XlD1OgjbCoi4VFf zxORnp_#v`ORVr+ORA=b93>w_DkUd}+CY?pj_Mc6bklxHr1Dv7eVC=RZ?Dpn7U{I z^F2j{XGCrs9oAbE&&7dt1SY#yX)?RosOr>b&Mv*Z^yj2doA6DS8*Q^LlfAcR-%z|g zv5CcJ?zHDx^mk!q@38FD7D0HW5VMp|K6M&_=T_lcG)`}`J=N#N&||~%?HxCy?!jy6 zcU&LcM=1HR0lZr>B%dK2aY7`Y!EI?v6g0Ak!>-WoeNdb)##@`)3YoO89TFV6bk{&E z^PYRmqs}Z&CQ@vi^yW2&t-iJVY)%Vhw-r?Sar+8JYIQ!y^dSeKa z^@1n?)H1^y))UQ00~XHhQz$x4fZtqAH^5>V=a7pFk}8eBEYzt*fBVGWo=ezpIFwut zkn@Yqp3O@G;)y_6`n1OaVNzf5j)JT-)7XlY>Bn3ltE1Ce4H0B?h`C@>w_T2%5DYo<)Fgf_(Q z+b*JacKi~%u2r;ygeX>x?#Dz8Xmy5kE>`-F3N zQL|;*);m;x4PQw`O75V261_at-al_PPEv8MxF#lh=+PX9jO}yu)?pLsXH3W!%>w=$ zrkB{loywGI1*hUTiqAWGDJ#i>3qN~lsMR684#jjSyZyN)S{rrg9(5%`A-Te~3@231 z_a{##R}UF3k64bjP^-xd{S|+V;@dC5AADI1Om8WhJtXXvKzgNoW3|Vbw0qNc9zxT9 z-wyH1cn|t>QY7F@c|nii%&kIwMZD6CJZbV4)e<;?c*;UDZXa3U2r2d065%b-@v-G~ zSb;ZSe>E{6h`u(K%<(s#|2zb}>Vr{t1nEj1BPHvJ;%Ch6d$VMwP6 zgMhswcvkuqrt>M5bj6p_W}9!>QeBko4w(UR&!CfM9p+X@(zXk+(o>0IT~ z+Su@7-%07Nq8oh-ZY#9gKCN}RhP2nyhl)Aep->`rGjKAGa7m`BtUCVcxx{m>t04%) zi_!=St4r`A7`@ja9<@}7p3-1j4TF+2iWG*%ho*LVlZ>;|=^f-$#K_cXUB#}&EY+-h zIFk$CRnri8D{R9v)R13=(5O7*m2)l|5@n(E5#pr2s`^};+fi7`*%CXHcUT3|5D<>Q z6wHwq*&5j@ zyntA!#53-aZS6yANT$3PC0s%YB(g~*IRCWCq_)^GOO1FARSYkQyBrCi#7ZhFHK&~{ zwuVT{KfRf?m?;>3+L)To^X9A- zUkRK@Ed6+g*OOtHa|FAeA=;^d*Vi$0cXmg10~X0)hGNzQHrRzt1*Zq}l8iG6pZo^e zRJNd!b+4*vMLyTf7)L>FY@il!Rzpb`kjN`ydx$=7&(G`Tn+R)m%ue2p~@DSDh z{+q!&UK`)kJ~Fg!+8WN}apMg+Fut)Z`j)GGJnq|4IWUE2c-}kHR%mGIQdb88kC$t|ukPHdS3XSI&GN@6M1;IDgNy zokIVztz!^i2Rar(7rKEnrP2C_-!zAj;5`?f_f`kL#2~~OhwH?>@A|&W_w!$VIgsMP z`u=w!3J1)OA7uX%URSc#vvn}Far{4+T}9g#OBLmF=~Z1qoh#IUOLioBpSjU+RRuc@ zZ;^B;DqclEc4Lj5Mb?b%PGd`W4WL?149iy-123Kn3Q5dtr4;A<+PB~chAq@%fuJdtTO!eb&_Y$2`uc}`?BYaN} zSsB>?yf3U*lp^SOr-Z!R)*z%0Ia~7Q@t~`KC+!e?uOM{tP3q0eHGz*l^Zn}0Om+vr z^<>)Nj*R;udH%Nh^X_myqhsCv6fU}Re01CUe!Zz&V)xvEk{7REmK(1ZO}PWUAMKW; zwu_oqRoPQr!0_V4)cARTNse4z6onbLwz95V^D5zY2|A?U{;#L-&KXyCCvIh&d3|Vy z2hwBEoQfR1Amcv&BBQoo6w6SP>9ga%%7ZLWr9{rTx(8bGO<;&hkbYtp>TPP-EHwMV zg|0)kq<@(}CDZDiW$C0(qbQaDx%zi>LJ3?pbCXw=Q?x~>5BjsViX#0^6IvW1N7fuH zdZ&eV9hb1=ruR>>R2=OMIlA)^#qu+io@WQC^&810ET3qS<=F537!~!gjg{{`dTXW` zwtqKT89Iq`r5nS_DZx;L$tF4q+fjlacFKdz%pHCyt=Ye`; zIuwj#EZ2~%J|)b(f=zcsDE0If?3i8t*Ni+k#;yHzo3Qg|DXZ(t%U=yEEmgZNMV7m^Adai?aAf&*t)R z;R9icRO?agq#L1ubr#4F%Yk7o2#&*ejxo0gMnCIormE_UQ7jGKjK2DJV|8raeJ6dt zity~LR$!HkF#KkK3B9I}^LToX)LGQ8&k0Mb-JTkH9<=%60BpVC|({wgcndAuy36oSrJ) zr9T*eef!rvRICl8o}%Gbw(7mM>EN{lPuAj-LB_c7-W9}?5xk>!@NsvW%cnThK0$S6PgniU5>88AQ}Vkv2+C7`HX?W+sF=8jTOCS2Pd)ARAHbwBhk+ixN1x(gj?@t4JO zwpxJ+?#k6q5eA8l0d>v;nYVd!5As;Gp&(B#lNX0p5k!cQnnwn7`a{f77luv>(w6K~ z>;Zbw=XAX>QjDM}b)aE|UNXax=n+S)(m+qp=)KN_3m`D8mGS>aJkSl~u| z76sRqPWWm$YEoa-BLL9@Qs`f9@xJdlNzXM2vXa$XxxwYXQ8Ic)Dc$jS!aBuWpjc`3 z=J&jwi_dRjF}*j?w)gzA?+5vI!)@++*Sns{ylyXfpToPJA#~nV@ZO=io+WhNS@GUk zbl%Ar0E2i1O)C}^iF=IB?>D?e)e9JA6&M_W#T^!65H-TW(T3N0$BuWjoI?SHNS#!_ z{Cq)jm*g#OSUEj3g+5Mg8^nn8>qzcC zJsNO~^rC03z-@eEHBLR)=Fc}e2Vc?;oWtE+)Cz1A&S9kdp>2Stb!-^FzJ9 zC{Qi_sG0yXL2GSj!tFDgGGb@*oW)*ldz`H=bTB|(mBN~+q4ipc5- zen#;OD^G~(j+86u4N{DZ|D5{5`p?6p&xkS<=WnLazcIcU|EGIW+0@=h&rsUNK+jT9 z&)U$&>i-(jF6Wq2Wz)+htOK3{JtGdSu zBmG-m7&{F%xNQt6SG^b4b?0Vk_V%>R52uVX@tlHPd9j})ICj`(>`S(NF{a`qAEZJJ zTBl3{8dLK0hMbC_!KFO#*3od(g7!GW2P)a^jL$lM7<{OCz~~FE6A-P(_p->qOP!>L zS%0@$K`qw=UQ5n1ac93}&0@9t!3i~zRRu+PIXlU`@1Qc$*Ax+JQK>e`<9la;BYpP4 zgqO$OvZsL0ld&%*5)FQoN~K*E`jLbVv5LyfEwoQ9unbm0bINO#mx9tR^focl49A;0 z(!JL*NecZlb@200&UiaIakKXAnAs8%OZGf>SIfK9_8Tk5PIK8d-BNxWhJXbIWS=cB(qezM^eZp7?2$U8Z$9RFu7#W?e zLlEbkzi{Ft!j+1zPpbMIh|_=1Vaj?wM5|}&pyT+1{rcWJGoI_~{aYKQx1#W%TLmG2 z9Y20c{<}Yv{x{ryB)MP;)EwpWI$k$gYilvD*<%s%xQz@tS-xqnR)QjtUxlH)q=#>l zVp?)|%(y3dAbA@D+K?ZZX-J`!CVPC6LTN}?kZG-XtMMvhV7@^5+zhvR9aWWHdwmc9 z1yfLzm+qn?h<~<(+T7HUxPGWXW|^7#z5>4(r?}1XpxNCpT`Y*FZj)%*-7r|p+1)T8 zt3q+A1{TA)OL<|2!)r{9F^IaK78>WbZ9r^x(wPE`3`V^!mi3~Zv&WZB=Iwk#n@g_wrZ7N;FJ{5oj zQXk=5mq2De-e49EvZ$}Z9voRAB9U&-X)%M~rh{&aCjE-;nec}>zyUCf&{VD`rN4s^ ztrC!qP>1F_kPz0K*K!nLae(@Sb(q*=X}6Xrdg{w8vE+zRG-RblIfuxVB2HyAgD5I; zx2gze;wGdil5+0t-zoWt3T=@Erl>a$Yf<*ZRoG9Dty#J&&m|n!E3-`e$Dw=FsN&MLoG0@p$l7!sQeT>hmRK*loE?|K0U02YqAghY5pr00 zqna~uzUihdxfjlM+To&A?eIMgrhWHXz9}X$)(H)v$2vDWR?3)XT|)bez}@)IGzaMv zJb?+;e&_7JA1;s88BV`$58zB&B3Sqc94}D&n&aKM2(O!n+;>U!8B;_L^CI7 zg?s+MqR$5oV^ZV11&M3lq}=2=D_H6?z{bP7Cub;Z%_269U^nJUgTa#u(`bG?nAYz2 zO(me5iYLg$=w#{+BO?asajLZs-mNTEp+K^f&Bq=g;F`d>c%ot*A$r&no(>hI; zW1UWWFv`#t<2F-($JUy70RcLz+fSU^5k`*(7m+A7O7~BkX*O;&xB(&Vs@LUKwU@*P zp^*3Va~bL#{jVQ2p(=t@Wfx>wY3gP$88YT5TaXd6E2$vQ4D<>@a*%HEq3bV}JeKgG=D21ro|iGQ=*F8M?c zVLfeL2&7GvNjW5-$^XWRJcBk2w74th>=8 z49pPGj2|cmbAS|LpeS2}Xjydl;AhDjufSACF=DK8^;=pOHrepr?R_cyRjz6pt0kky zSbA)L4)GaLr*Y3hi{VBFcwHAmjb0av9I_!3H=9PQ)zCY_b|{w zrS!;@*h3ND`i+GSdE}s4eO#pqwXHDY(!-es9Gh-JJy*y1awFvIuB(}ye5Qf=z8v^% zo56$_yaFYa{lMLtojS*4=N7Ehv?dUO1ZLQ=V$$rU?`Qg+jf(rgUZgBTSG~( zlr;dc@x$JFkTN+FU)8yJCruMj*v*Ud}q9GN9 z0&a>CN~s2_w(E9Tza^shPN^DBwF6qyJ+*TZ$J)fX z*al!1k4eTgCrZz;aG85rgnO$&n;fP9_T8i#K&g8AaQ46+TbF(^7X!b5J-&i*h1Bkl5gB zWRU>!_g!DeT6Lwh8!q*z)dz)T^H9s!>G-G3{=yQM)jBYd0Q-(X+fdO`&Ws_Z{V|=j zyo_0YN2TENRbQo|D5BqX(p4tgVNC7F>?#Tz219pY-s(Lev;sRl-7i;>6TPo&oVBuT zyLh;z8GK%eZ2bK;4QOtfB3*o%j4zRhFpoN@E01SfOlQfG8@66HH9oLjp1aQcIaruY z`M=DfJYK{HTjoh%hU}7=q2EZaX8A0cGEj1vAWtT%1PrtBS-Zh55gcLn?@L*jdHiCv zMec>1H2Btu@#J->?m1_Biw$MC6ddk+szhb1SlwGeIZdU^5V}T}Jj0 zl5Cc`77*kmM);r%H;)756CI}HWZUo5B*$yaEv8?SE|7umnjpvtXW`B3Y(yHwRsI(<`YqG?g=wmJT4VF~~eab!?h( zIv3@tkc~65Fxxz~G0sj#-EZeodfOZo_Ouce~aWS%~+ z>dan${K{N=+>im+{}VepvFS0*G41gCii2(X>*Esc2a}rIo)C_IOPU}U-f7ApOQy4f z`I8;y{j>0}o7VD;86ulwfh_<6%4}o6PXm?3vuHrdoTBW|0kowsw;*={-b2}hUMfk4 zjm@o-7Py|)a7QiI?8TRUIfI|IRr5$?@>aODux)6D>)16a!z5)C7m2HOD2DvGNtYc! z_+nrG8>N@Bx{Vlv`~}rz*>$JHK{F+W6(Wymt+a32(w{@e-6Sl;*@b4Vmg_KR1D2%bi2Sq)LdjkE zjG^ePiGs-<-VPRID=IYDL)j%Crw3xuA{GVh8Ttl>`=`v|DCQkq)P)Daqe8o!K~r2$ zLT~yEtgCMsxysiDdAa#HD)$;d3$pEBUTEIqXT`tsD`?b!84l&1<<*zq=~Y`OaodGw zfol_{&(@tTb;^q#+PIxg>96yrTKsU#Z?w9Tz&H<7?XyFowa=Q`>t?Ry`nL7akAeBc zaoHAmn~_OVNW7U=R6xL#L~;DZ4DZgklH&euovXBnr0XnMy#)qf$N4Y8U;i|rEmQF5 zBYGcs-zfCFSj$~S9H~;_y!>gaSA6Tf=t+1(o-;HEpw~owgtaBvp?S)%%MQI*guHv3;f*D zu|d#Gam4s&74y^~E&M(|?bQZ|!&1WhJhOpQ3+3td5DDlI_HgQy3)RhjWf8AK2r~3d z!`p|&jWo|&oEDjx#1Z>H^Pw-?TtPjUwN&UG*@W$Pl9P&N=|AIBE}`7zjSZea{u(9x z`!5<=Qs{Ap`tSKfBaB;PFf1_E@9iSz|lU`SB$}3V^ICYM3iV?Dzz*}_E10O|LCHs`C zpdbv;CnRLfa$VV8V4;SNuBN88-WWUhzlPBUiv#^#(0&6OF0 zqlK7@OzUGLf&x=I^u38fbAXu{l@?kfj5c_9wKx597Cp{ep|vWtoR-Zv>w`)oX_P1Q zi)Cw7_dJVKbNQOe)TyriybvStw=_7_Xt|%NJ2i3 z%rWqzJB#`!dsXKxzNil%Q&zpX_;M0#0sB`>1La!SiqY8x4`ZTt(=8jLJGZ(CxG}gh zk;351M)|W$@o}4CU-YYQ4E+1}m68GAvwX39KgQ)eMNWt+1<~_rgKK)22_Low82t4# zV4P=KL_2Pb;}Wl6t#^v1)r;9NQb&CRN+NH_guV05CxP-P3L{s9v2Ixrqb_s?t^|KW^KK~2#OBnwtcl-M!ynmmBZ#CL~WfuAGC*fO#_D}Xz-+)2x+eDCOUND(9 zP%t;7Lm*HQw|r+k4A?J}A|xT^#;z^GD7RfIiKegn4oHAx_WF~2Khw-iO2guPCY8%! z`a2_d;_~zL|gJsa;Hss9Le8bXu3tG0=_B_3g`_9lzr#M)UW<&(1+v|pFz)rv!A zhyKZHdJNUGZwPs5#DUDj&~$ke0Y9M*dt661MSP*i!iBUMBQ0rDJ1@M5MyvwuqT;5> zm9_e(R{U{utI4R7S^emCeH8l8T#*G<@kUdi$%@~~1X2EurrUm`*IgQ#eVvBa;Q(@Q z*CD4ErYTRdscE&h+vG5}4*u@dfFVkbYXmz+;T|Bgj`(nmk(Ui_={dJ7Gb=2Y#OO$h z4Ov?J)plr%V}s6hfJtXM;nclPK1#9i6>83Ch{m-@t?}S*gZ656qFT@=SP)SN5lJus zM}*i+sM=5MlPLT!SeR)dwH~OTD$XnPSIYKu(BWoF1zE|qWK2{dwLZrFk?yRp*Q#8* zpwuDlkm;3?6SQ*r#88*NB(?15Fui+_d&^Ex-XaRh4YxLGmWN4?kE2XFu;^6 ziQVKHpk+*E`>!m9dr3_s_fz4a1xj>6+g-JfZNyx2UM4Svz{99XAvr0Y#^l2iGux~Q zX%y~HTYnX-2H3fctd5`SscrnaufV->4M_ZSk(`tKe6_GUq#{Hj%(YJ-lxM^$MTDbx z_*x1E|4(OU0uNR9K5*WWUG^;s5vF9X$nqj0k$vec8ccSh8HA)JOGKfC(t;XgvV{EK zroE6PrA0-gqAaCFl-Ae(nV7D*W(L30=YD4Lne%;~^PF>@d(OGfJ;$L>;J#X9l-m3? zR{Nv^R@omtVPLRzkAtO})z0m0dL3rcT`QJ4sz___TOE);dHlFSjaI=f9qvRou5HQL zM)R|D6R#Agq-6Bj_CD}_yC#yF5Kukyz3Tzn)WD~Q6k%KBg&$O{QXJFO8Cs$r8sBNxL-Kb#6>yui`8+l}w>?Lda zIjL87@GA(#U5gVx-v4U5PP(3nOQiAD*!7>kH{FE&Q#DF(_cJKUtNpbTJc%Fv>dSE< zdJbWqR$ofuGB0y8zVvgemqwmkHgCiV>18|#*^;C(e$8x|_d%kK^DqvvIhpFEPk8Ih zTJ|T#S#nj%{t%QonwosGK3pXt$z3XI)f=IJ-Z_tyN?hCTZJwL>;dcE%;hz0%1fNo) z9uKQBfgw#1@7wa`AGQ*73q01IY2UTwWwa7CssY;=wES6k>86G2?}UHROZV(PwW>_+ zJLdeM@=yUKysx;gq-5wKY-=5#8}GsqT?uTTca>OyYm1`9g`2p9!+ixEUa9YV50^$< ze=32ka`|uLO5d!!qP(N3s|OChUe>nm^9BwXlR+gp{`6%>Qi&hx_cPH zdC~3~&n}9>oO^*C$yxv1CK8);bu6VfpV69k(U0Km_bK#HwaM-D5&at7lK0&o{0~}t z?#p9*N@1P)HS`BmDh_4=YHTVMZvKJzaaEe+GxZ9K$yLcmNE6z0_TCaoc=WzsyCtLf z$_BO1IOSP^%R~okO>!MhK5*yE>mTrV6P;DH?+KydUOzWx==q?Qc*VS3%GuYO*N7Pm zcz;}RTGdECja#6@L%G?x*2u9!v0qzUy;UrW52v@rKjW)%VaKDWQ`_n@sHQLPw|t=N zm!|Nxoyz+nk<2^0!>9)@b>gSzmF0%wX6CQI705Yv>7CsBV?*eWUC%dgU?&3%5$HHY~To=2W-kJtKsdq<$6Uz+&0SBLIK znI>#KZaGV((qP}B{MC;SOTG9DvpqDpusSa>}Y)WSiMB1;Z?uP zr_#=wGVPekQ{j7fO`kZ$T0Y9gmfZ8ow>J_jc`#UdBCy3hK z?2@(TKUrWdULg0*{ML0=LL~l9i~hQ$@#sL9GIi^QU(kR~Km$@|(|}y?{{A7jaV=;! z(tky5O8T*Hs#>an~^+IvooF!pvJ&^gwX{>U-Og3`f|uwP%6=uc#qKuZ(eJ&wFI0$L$;^;hwcJduX#K1ct%iPDc?(w7 zRy6bb3@GhRHW&J;MXo1k4n#-SM!7eVsHB|1>#-fJ_=WVs> z%URg9b7K;Z)%z!EAPN4 z`hVZfdz8pxp4(kE<^q52tV9)UVWU*2Omlxb{B( zl~v2Sy({<*Wj zv;*hyH#D0+X*PVbvve`ju(7w&48=y_!Zhg~YvPZUCjQtLAG$aO8yX5TlTcg)A<&n| zCcoyC@{e&eeDMU_9~cjZ5NLjOPm)tPwEn)ay@*koGf{>C77ofrhlV7%*x{?S1TGJ| zyF4nhlMX-V&?~fWf!$xB4@|0ptp)jm_F{Nv=)JqDsjN|zRN3*f<7}|$MU~;@jFg`?Z?eT6Z|ke1bw@X=W`!kd}WemO?f1HaQD%*xq+W>p$6AI?%^|2viEQ0bc#*# zKGqYRK5Hk&%b-;z-UWZ|pDOv7XW?4Z8+n7R#kS&luOE0|WT=a3RO=FSZxnsD`}L!e zx~4)mhQs-c#bWzPwW!%5n4O*T8;{0hzmSyVT5qFoJ!h{``GX*5lh-oNf4!p!=Vx&g z8|cn_(r#n-f3IyDN@gr{mBom*=i7e|5^KE|si#C0ve2Z4EqGIWXMgfw!wM(PR-=GU z?o+A$aRrnPv3|Z-Dq_eVzd5G3Lorx zRJ3c`^7xr+E)RTsS zF~3YAgnSZ{r39AoVYx$yUpF)wv`Vh)u1Vh|Y5YyYZsYZq8sV^BixzJYZ*`lG2ad`5 zZMLLdJRz(7nb)N_D*7uPcYhweLGt`=y^a@x^+TW`5#ge3viCosV+0*#d*J9=&Tf3D4Y03jV%OW^cW|cPA2&m4*l zFB(WZ1U*mjtKyNbQQOLgyaEzRDcO$eKI|E){2t?-t^K$^>W)mePHrJ}?^@e6yWgGL zW>_1P4^5f#FYy_Cpz_3?1&_POk}$_RGuqcb#X_?2a4ds9;Cro!&mVpe4;Q>R^Cyu> zwD7<`+3d{hZLBPvT^8F}Ap{N%X;lA*jx?5Ng0I1M=tK;vqI1wT5E)Ih9G&o$mSfZh zu+1n&&&NT_$Pe9kTt>usAVxwN*H9e6@lF)3}(_M);!X)_i&P~Zz04)MTnfY`!e3D5Suqwb7 z&s^W$1nWyP0Hy@X>naSuJ@6Nnz|lR#nIjD&?G?npl-i&XqmIqcky#L zs{^ce46-xUm>LB5vI35K5TNXYBSwadMfsxXJzdmSnxL*SNT7`l>4{8o5uFm9xfO1T zH+^#lq#r2F*bo}P15H6`C!9a*UrdN$jz3OHuR95=X zk3I@_i3!KCD#2i=YhooxSUf?3_S|Vo&|z-+pU*GaG(v;<2O`WFZKSU-JqgVDy61VL zIw3S54V*vi_C!x)k|T7dNvoDQw5!Wxqyo(H78Gaf=g|;?zzS+d+trnor5n0;2Al;O z2nwV7c?g^x%ofR9N2zA1?_Z&`TR=}n9XIGt0>t?-N8SvRo81b?LO?3h4GEuQ(qTB4 zgN=?bDrZjI@>Dh@1xlR{vjEy^1U->S|1O=3XpaqL(Jx*F&hzjD9gCrQXd`}lB9jtL zCZjqKaDIWl*a((gV&lw>`{n?=8!inx89vD*%->UnGq;9mON^5%U?srUGomxiCP(9a zaYQ1Xz#N@pA3aM-1eUttbPGnbmc?XfB75iQv-_OREik}3&>ULUpF}3@b(u1HHTY6o z82#xI+R^O~$tCOsFzp4L1%Cw4Y+mNdTEuVn2JdMzw@94i2~!fVGT~x$42f=Rm=XB! zaI6pgwQsbdxO{bqTmaUaEkdk@WDASj4+}@;gd{S z)dR@wzEVVs35ax>aYq zzzyG$K)W|BEE_Bg4_P$mvO70AEFV@J#8I=m8%b06RYe1uBjc&Y{O8Q4`5o!%8fD?u@X!0!TRGY z@F5{MTCFo_8aZ;0*3K%!2 zWTA6}PzQM>)PxXVl^AsH*~t_+iRse$Tg%#T*1C6%3&|SAl8#72;lZm zbEtvjfk^~FXCmT5aCAPaHXru(+W8b1+I)fW5#um#_QB~%U~Z!A&l*PjpaeW{>(pYX zik_m$_{6Bmw09GYPiqINGgJcY1TuOelMWS6gU;6RB%e&Yvk)wl1r~x4-=9P#-2#8a zwlP^CC17qH^pTKsIGObKh5xT*ZY0&9i0y#(_a z3_{nO$;qtgjW!P^FV3Ltf{rUk$m@8SlIc;V%%jZFcy!q6IJ_WRJo_M4v>0?uAR=a? zFl#Z45rSwYI*1Bkri!s~)P!9w<@j)Z3 z^o=E9j**cr8BXMhA^qt;^5_g5ETBZs3s3MyMucT2WCs5^F&cn14_O_g@f@ba3mu)^ z)1w3EaOUv=bbZOBqtl0vMGGL-Wd8gakx?Kw6@xGofF=WZ8tq`q1#?*r4mbFx1S|Xj J@-XA!_mMt2`%osB>Gc!8|nVCsuW@ct)W@ct)wqwWam>FY=>HFNi?{)Y6rOM`-;eSw04`jX`SDE#HWJkY*?eF2Cm3(-l+iZcL&WF^JL zl$7ZK;_nk*zBnrZY}Xm#x*^AW2_0~dXl6K43PRZ?iNqAq%;qN%K#iE{H8q$?SIytw zC_C*|niq!|pNAgtsV?WsNS@<(-q8pifCeHTG zWzJL7ByYVX(^Zf7{b;-eA>!buA!I@};!DCtCNOR)o19P8Te_osDC92KHjFJ)87SiF z?^x4-D_cR1h@m9}lyWL#JMlsM9>A=decQLKj}=8!pj|{9m%=~=YFp~0s;WVXhDS7N zF`P^)cDRr;jz0eT-zr-wQ&Bw zdg^9v6|4k^&16LCzM~P}FrwJRuL!FPl}gsMUXpr~uSI16agC0)0v+$Y@&jE}X|7-x zv)!8VWC@HMmA2F;Bxq_3^`dCuic_gsXyM-%@by~r8Y7sjI_`QAq5j%v&AAVV+SHvu zhiv%DqYMvyWchq?rqF}2UOq9kp%aY~`)@T& zoNDZ{dqI$zn$WEVd)5#*mA>_5XVhmLJQgNdG(=vRfC>AMmP)V>SCv|Fjrs{Db~E;& zf^3}eTu;z>uDdFdHkK$ic(2eD#@{)F>|hiYc5^dw_Ln3U!6rX;04_7P>J$h22lSJ* z26J1hDSNvuL283L8pW*&Ccgimil?rrftpXM0Q_630Q-@A_o4SHvcEC|5wJ} z{?+(@LJEohf@Jc)t3<@W$P8#KVc={Eq&KoMaCD4T1~{ThAbFEitDAT0i{PR{sW-qs zSU{^93iDh2ngt6Wh7%nqxBLFXtvMb;wX^1)Uga5<>u7*XjUG3lLR~hv;?-~CnF$x= z7~dKV=e1vmWwScRr&e$FeEZ}58N(0D%W?s)rBstp>;;_DN znb?%>reW$5CigYqu4n(CBL;`NXTe^H@aQT3PJTyw6Po86h1EFxNoR5ljzmtQipDSB zBe2`}v(ScSG+6a}$lLfT()uGMpB++#eF%H85ra`jYH5qgP@zoOZ-%vdA(CBdNJwm7 zJxSk&zH$Db`8AoR)875w=WHlz<8~o9A}I>JYLZAiTA{l$eD@Vq)!KKC{70_@m*W8& zh&7qj{Azy(Mq8z%>1K3>!={>DKFJ#!miu|B5Z%^w3)l$au@*Ou%~^=d8a?v-B0m^} zVx$mwghU+*<|^#l-l6ZclEkj6WS~2By*?g$Mk{hjU!m5Sq<~fOBdUODa`OIj3r=bJ zC{Dc-{#HUJm64GpiOj2Nw#B?()vfn(oc{M5G?g8bX08{L=VuO)m)53I+d^dW_&wc6 zOfR!k#zk#_#PrZgSte&JGefIPSD=Cacxz|2m+_CGPRx1x^&z|sHhb)=^s*fhRCfAw z&cH_U9-%?e#8gj0DrpHobXm_V0O)+HkI&E67T@d@4^S#$bVlqzi7 zBgAfOuj)Y+tRSs!(BJ&d89s|fgcTw_DPA2=L2Xndu2g1hKW836qn!wfzsD1A(-1J83lK)6y2d?6chO4W7JAK{ ze9a~xsT8%3i81;rzYH#nG|>?z`NuWFiX}Q~upqmBf@)bVD0z?j0iofc*xKxYWxt2! zeCH>-(@T`2l+ z17PpvhuQ&X1ASty0x#J`7LN>X^eATC1wBNI!CLR&tIGY*hAbtUN!}g|guROWsR3MR zR>^~?dbIhEbjdtjf6#cH2QH2LG$q;$;+-Py1vi0?7Z`YyE4i)BSC%TiF^}l8V?lE1O#b zMgBVZXUHo~%B~Bd@g)XvvLC`1&!IzI)%7X*i>U;GL5M0Oh*=W3nAwSsH~Hj+2M$R% zgXqjP97A3!gz=2*l2tUcUpZbH9sW5yW$=qlYnC4>3#ae87{MH&>l*X~C4iG*{O#eX z=gQt1YY{4;#gpkAl78yyGm-5l0if7NwvCV%4c}`{+KFEKm9jH$8nW9FW!%sor&oo` zh_=y2g!!j}8RcHqjW%gC7Bm7*)hHJdQd{!Ev|o53!5U(n@5GH6%?9a3VC)S=Ot>Ay zwiO&mqauKSCt!1pju?a*Au8E>Q8e5b8_ya&j}}hB1|8ivE3f$&XvKe~wV}}SGr6Na z`D@C30K1GjJ6sZ+%v#z&oPR^K`4l5D>dv>rfhdY9~c!%W)%6V24u2sS? zYg+_y+WP|mL-mH@d}sHv#DpkFVSiRKWDK84q??RQBZ zAU)#7Bvc1DzY~`kyJZQcwEjZD!sysS(G=c)C_+q;MFgMI*YGlTp&loD%Az!P+uzEHtQk;F5K8oJRn^SWdAOjBaQDGS}$4nb81MKlvxTG zU(Oku^>iG1pR_XzWKv}hM(iL4BWav6bk9HU=_~)!x~m&hmUn8zF@&EHG~=s=gz%n% zqRGx96_g`U7}^y_m0uFfz8ou(^!#y7n0!$(&6wPNd9DbI+ZwA7D z+YJ8^f8Gf?a;QRRA=~DucpbF2`C%y$#NZJaRs~y|Npqa*Y(fykSu$YT;!y6T0$6l(K*y1 zr#d=wV##|udS1U!6p~AAuEE#Yz+ZfNkC1+3Azy_F$%-Ug?=v`x4F=o}tn5M%z3h7o z1ZtN6$l{ij(XhpQS8Y_<^o)d4O_jwi?bJyI8jgF?c>A&X9fW?28=8|oKxHUgs8tD? z=myhv0hKD8f!_pL?BO-&J&Q4s-=VqdQJst)_KI&p`IGLq{<;IEfqUj3JDXpD?8#w)9-m^0;u%TkZDE`UMfh1&nCs)m-dJ|0e$H{K|DM3r^@Ls0VtXHUP< zvI{G(G-0qUn^);CPyaNU$Eu7YeCQ48G+8!FZlKY2*_f4zM-6bfp;F2Q!UXoKLg^*m zGN1p=z~^&JQ`Tj$*{b%qeW9#DXqYLSFzy!qG)H9|eF<|~TqeVZ-i~cUC&qM~_E1CR zd8!_oWjSCKMtpUEjrVz|g)#w$4!y)E(|IMir8H{QFY4YQdx~!K0YlWaI)XySzr2yX zyDG{}B3HfXJYSG|Qz^lu1w6z-Ha&oVO1(w9QcZeclUd3~mGj$rh~)aLpyb<%WB-qT}UCROG4l)OZSQYQ?sWE zKbv>}3?@04nB zwk}3(7msM6+)kCFVIgGxa6zqTm<-$AS`3TrgXGsIZkxQV#d}vF0^!p>TI(KBvI6`X zUZCU(kbF7H{FO9}OAr;K)izyA;H=#z1}|{JXeT+k-d2=fG$^Vu3e=t_bUrtf8&%O> ztea&?i8*V_|0Ou;D0AF4UJKJp&Xk{DF*wo`LnQ+%^N7Lf_tzTDt5R!sy#|Ld5F2J z?JjQk9Uv<1J3G@K#s0q@6-S!RWw9<9AN`6!}3!r2bGk#tX2L@>j-l{KG+gO&qIu{dNRKS?0mZ zMFe5}8}^^n{ma~aPerd|Td;xft^GMDR;8d(v6%)}dx4BU+u743>l`34SKtQmg9gRd z^x6Bf5bDOiu!~8ceZ{d3#6vz`L13)W4e=H|*c*(%B!^FX#wpL136yFT`nEvm7C2KV zWNtNgiG$_@TDXg8`*uWMf&N~ieZoKFn!Nw#jnyuW;!LPzW(r@Vi?{htgr@gmDhUt3TnuX*6*pdTI=&dl*;coC#{ANWm7UMm*L!PC zSJ*;3co5IYB}WQK$ccoV8gtARn&ob^n+rsWA>fb& zDXYmc(codCco3txsmuxBQY{0nXa<-(373JBFS7VMw_GPDbw}l_&a;w>msOcbHSNa;D=dkvvwDkDTl~H{Tc0m{T()ZWTJt}lFDo6g&oHB(FsqMa5y=Wv$$=<%cN?rT zJcJDLth#mbU4-^-LIH$YKs%Wk(c+ZZ!1P(ABTj09=6IGQ685-Q_~IY-_y!t*D<~>3 zk8Tm~K~MYSg)*7~}k+^8*zGjM-6&+m|lyqkF zEO@~a^mM79PGA|GMrex21d^DBWy0@g0L=N&T0Y?w8?*Qpu#Yv zbKh-)NTH$O_XMjQ#%0U&g)?>M0gJ5<#AV-+)o+l}*E?~Va)00cUTjtwHROTjXWxpp zs!atg0r_0Yw4)xQ(djhc_3hc>ahni@*-)N>;hbjcT^SZ&Nh+NIhP`H+Q{6JgaiCP| zbnzZKFoD%%j)t;WLGw>z16;J}i>(=cGzIg9^Wl4KQ9Z54UHd$R&hHS7JUQr&k|kY% zO{G1DRdk^FO;T&4N)FaK0wM@s&OGp0UIZlia-LhZU7Wa4UO!))c zyEDZ2iLK$`()OOyIM58lr~TdXb2wm3#D1w)XP%u|wjTM{+<$2XKz5JAHaTM-b2G@V zv(DX%<+ZfjFACYB%X{bh!UW88zJ}r5(a!MPMA&ahDhFi}t=`&KmPl}2a`!IJjI_#6 z2RO2WP5uIi;aDErBfo)S>e}z-Il2<4YT7eC%tCJ+MS9wb|+nCq9F3l zdXCy7-^xtax79w7^hg_9plwpbBG}F6*e}4DAc?q6>uhHN%l4y`A|2C^XKB9OHcqGC z=aLF-5;e^MGxCw$P5D?19hWXgWDm}EE7?kg!8XntSNPyq_RxMgCX;IN@EM0YI9=_@ ziJawB!HP-Rqoffp+xv3SBwu=Ss?21rCup@&7Q(X#eCjkJ7ULS7YAX+z5$@FjH-DwO zpvp0I&6?v1&{9Cr4^5J=3pWXhC~nCyEP`rS>+mHd^Vl+se?4gPV}QSJ3gRUpNFts!fy z*lbv_>mcV;HNSs_tpluL@cIO7f09Zv9PN>Gzm2dHg?D9aQIj_a$Cc*Ov&Vw$9d5&@NyiL3<^ ziIe>AX32_c=jBd=?Mbrvsy@{@Ly%8L~u0WW9wJDbr8X(w`MrZy%Mi;&Vr+y&x=~-&X@>^S^xrk+h*wJng=~$Xugj z?N4<^vfSIuwD_9r^YM-x-H3UC=oy@X=#nGeh`k|i$oY81qwh&KLFknckZw;9 zQ+JyOW6$azc^`Zq1EZ%8vYzN?PxZ4N@7I*>YdO@n9eRjni!FeN%?FL$q)yE5i@+8-a?VtOWA_*T&~hBsrl&hGzErDc4~%;qHT?1AF^ z(cH!q1esjxNvr`qTUycdr1X%CU zJ>$pBTfp3vyn^HRQ^*CnEO|ZNSeSIxMv^!JYbA~m(A_`eZJc#f43Y6?`eTy(@TU7~ z=s`Tq5gr;)>MU{7ik9F}-P$7~(RX7G?6QmP>Tzo-!K?@&*LA*{9O`>Y^+7n+<)GB% z<67B5|FlDB=>?BCB6ybrf;>Hidy>`^ ztLDgy87BNjO(|?$xABofH#>QJ>&i>WNdXFo3jf;!%gvbG!s4^4e@i47!Ft z;zt_b$bJ!o+IIMSvu5J_uS1u=K9|^p4DvwwsEK*Ls<`P5P2#4TWE_!zuQ(WzCY%lf zb_u;%=k3P+H7yNTNed7_`0}Nk^1n_?6aHmQm-z3erOq~=D&jxI<#>SYq99Vpb~Nfb zQ%F!PdP0-=gxYC=W`zeRQFA<}G6+JR6fT};a)*@Fc>S{)ZX98<;4b8E38F3MXdIQ2 z&?r;!##!FX?x(vu4nOa%CjER{{Yhc?H}VWjb-48kuY!hBYEP4$c7F_r5C|7AY@aN# z^1kJtu}3uokXz*(iI>_XlE(}i_P7AVKtb|au-_{NXeG8_O}}Qs1-;QA74z5-NS^sK z<&1B~GpByGbHsSty6lqWS45id@xfz!&HQ00E=8RoDAiV^xsM*x({u}CRvgyart?{r-DWQ)nyqTxPWia3E;2{(iX7nIqPaWM zWp?V5mL-`hwK;)$bz9pv^5Jg4dJx=2sIP782=}CTns3t&@gZ|CcJw3tPBzL_15d~Z zqAA-E>IlOkcQ*e`@D0b4EeB-QEDEqRZV~UCo9yilfp{IK*B|+@hlj?yS)XF2t&jxC zIj`?5Hm3%42L3B9$gA)U@BSU-kMnm(@(wOzy4p-|QDE$K8fJgG6ww~HrC|PrRK6^g zlQNV>yS%EwzTMqrM7#>NMzI1$cR=ebR`aBC7ui%T8DRDWl7`>pq%mI3`u!g(f)eX_ z4r`yfbJ2g(o&OanB>xsE<~FAP0TrHm+ZBEY2nZ4gSr-Tw7YGD#h?w6?C`YdgT`1xZ zCh!0Tafq6o*M)+8<<_YzWpN1II%N~x4qa744Puf&D+iw%9|s>PLvcgd3LhH_Nd*&! zdVU#XlE5$D(|u$Obvt@|6;&-9pm9h*NkCCSp%@#!RO{=5)MKjqlcIv+e5%HfP}Tg7 zqQ0NMHukgpy^8!97XQe>_`mrS|0g9v#L?wnHT2*pz+W1AuwD~(HMnOGaSgmjaKVl+ z7@v?#=zAP_!V>;WFyyto;ZQWs5!2O;{-I~jCE^zxQrs*Old#!`L$nJE0G#>d3#v}_ z*;qC9s&vTnGNrY*^#rJMG99N094t^P--?K)T(W7YUDN&Mu1lN6k7yM~gnnhg^A_Yo z2!;+o6_XmGJR0{#QmnB9cb#p3Bpk^IgJpp0h0Tt@alW`Pj`Nr68&23e#h;Gt{#)1o zep&Coxc)EVxwR6G3fkxg#`lz<;1YGZmZmv0Rx8aGMtjBvQ(z&B&zIhCy@4BFcAj{4Xz0Q7?xRb-M_2r-klv5CJ%%rlPwdff{D3{; z6vd>=;v1|Kv5wq5$3!@72oxWuAwZ6y~}^uV;j}6R$2a($3)l=sYQnn zpqkQ*(PP5vH6~aEu2i)d>~OI;@@2FdHj@P#uez4yG1_!D#acJwdjJ2QA-O8mMM{1dnCbZlTq&eH8i*ZzGSnU!6Fr4w;H74zc`lQl$Smeft)6D7#87+D9vbQigNd}4 z<=rMN$%T_nm(tzg&S&5-J-@%hX8)F_f4^eet)m;};jlBx!%Ry#_1jUDsQY3Cbo5&; z8gr@3(XbBQik(hKty9z<9lYMz&w-X0X*aFGm>7z-sy#d`7hqZ+5MIuicQ7Z$)n07S z5s!hfe2<#^TZv~oX-Us7vh!9!C$0&L)f)Va%om1qt6;0EzHbnY2{luh9HG!$PJ;!W z`YV&7Iup~*e|&U!?mVs&Yz1hoY|vWW$5&QpEvuWm7P{vTL{?aF7;29??$uwzJLemJ zU>$-^Dn6CYl6zK*tb<*b9(PYe>CAR@h^WkM$KLT;=j`{3x7D9}!V`ffjna#^65M0m5R710gpaZ-=3x9o zJpgc=LV@gxCEAZ0z|CehW0iZQo7!a`b?<=bK*P#^r$v(7ZQ9-TH^+*G{+zD4$@IL1#=xJj08c={yP zb*4cV&i;}_;4aC}XJ0;rYObK|C^5Wd6ca zFpT%s#C?rE0U*hGL;Nrvtst<^=Y_CEp=c&Ai{+L=zIJOzMl9>3L_9KaC{&>_>^Jg@ zpl}aP_A3}m)+iP5DRu+UvO{cY9P$DB7bz?Y_6W6qayvQ9zvIKd&+ht9QuwDht>Ny4 z`y>8cDkD9o5Ewmr1f}OEX6$bK+(OGmN;obq-cUCpVcaL{Swa?_E|Mxw)@sNQxNpB>EwKnjk_TEZ{+4Qz(pDO;hphj^LRT z`aOPi*Qa3Gr277;=pN?r1kP58{kR}^U{e@<3wOiK!@8QpWs}kvo+l^*hcF)HsVNYQ znHW;{*gA)!svbF%)<{1yFji>we1%4F8aB;?QCZFD{9-nr^SovsQSqXG_Ou%&7S3ha@kE9g>=|DVqb)=q)Ml) zJQv0erf`Ki8{)o?Ow;x+Zgv8tO$msWvd0nFj}kyF5m{YLAt0x%aQeF)M-RQ}f;uii zN5bZ_WQ{Y7M8w%m4>Q-RN$(x!)Un zeuckd3iSBbi>}w-k8|D8Q#=h9k*s{;)?k~*E+nSBhF6LH2vEI&-Ao( zA9mD0i8y;qPxfhdsVf(Aw9!ayARM?*FU)RPayQL`Lgh%Y&ULlt81$ljSrSViBe+I)xQxXw+39pQDz27m+oLjnkH)qH{=f~D)WXv zVh&n=5XeA>W~vcA?_4&GaFHd@HY(Sz_Eroj4xA^1>YTUshe~)6u)+j7@E#?x4cbQm zVa!uZkp(0Kasd^Sr-DQ z6%cGa>V#FTkVDt$O;=j9<8oXqb)=M5z|A`|I^k8}?HI^CPE2|tYf3D2u`&>^nlMPCr!-xSYa3@CU5(hN1Z?s2U}99a?M zBm&%IT?9`J`zl5w#MC$IoIRwL0Ez61d+?$sGW4zP()Pg+1BwH|EUD}vjv`pjAj!#5 zYhSHnCaKXD9adp-I^Y$T_hD=_0yb>aQ?fQms&YG;Z}>1Gd-Cncq-Qw%V?%(evH}BZ zQ>a^8uaZ{2i^KD_uW8F3poyPi2U% zHpVyNbp{8XH&=t2=`kKD&KG5{YQCEQNPODvkR&n~4Auq(8l5cEY>)EOxM(+{Hy%Z3 z>G~bX+AoYfhQ6ckzvrrqpx*QM*FtNxpQQ$|xA91Aj5X3*a(a?YPGl$Ry@5LA99^BL zmGf0{H!1c}gH(c7A=jz)af6(JTM^P`M+hT4mZ&dWZdc-n_6lTB854~Rh;#7-WY=@i!uh3v&v6r_U*{)BTli;!Dw2fj#JZdGkq-f~CpRJ?63$+D+jA$X9$0Fd z-@LY*JlcbH(K`U8>j!gP0X1|vY2nQ|i*;icbo-&O?#njV<-3E=#kxr_VYh0hWBTfK zYS3+ge6tcx9&DTAu4S}bYO_3!LAr&DmM6~K-T1L7oC*$>$KQ#jW4RkwWn9LETBc#O z6J}}KPfVh>@)mJU0Jzh4Kk%Zrsup#Aqo0AwDMgA)ID61+PNzyfA5yX#kHAW@=qmSJ zy&ctNZZu@SWoT)qtmWc~tWF7?@iloyq%NYJeRwanpOq}FCT|E~IDtgC!p>3+U~Mk` z*xdYfVRf~+j9jh!zE&+~x|UboVd>0boy_qevt(Rt&yQ6TQawOj{vpdU>zeV$5SeXt zYbpd-4Bz{wLXE}0e;3*m@<i8u2XzY^NY|p1nq*BLibpTE7-EipD zHHce(jn9&URG%JYtDZ{GF|t2HlHIx{duUBNYDqP?&KZxP*d;mTccDUn;aPI-tf?HA zdtU-@X^7*XOF7=m!c6bWtabx+UzAC05Od7E!?QD#<>a%VgLRg9eK&j^TOSIYi9-W2dL)WgqFAIWy|oS)4wx;M zpJ-p;g}cS!C)pBZq#Km4tqBtWShz8jIMmMjN1lmP7&fuYQ%45t;1zsl&EI>@k4R0) zKUDlI`BJ017hC^Dg<>O$kFJbFDeuymuCba&TYYUAC9u{2Qo$p_(Tv=7D` z4WP(l3*n>K@gAG!PW1-o2xfC*dvT&T`~`)+%QhjETMW%GI0+IQ&Zn4GRU&23kYf?N z8M40W+ppW7re)9|6+56Ct|qj%>RMM!ebanuo^k`a;V}fk$`Cws|Uq1uS zV~p{(oDr_t20c3mJ*R$o*Nz$Cu*afvIb`;@6UHOa@P%Q)O?%OcntiC`D7I5ycR zFu+o=&l9M_E-++}8qln^yNR-f`J3~`hHfPDrlla%M$Cr#^M~>Gez%C|>iX{S!-BkO zpf=(N!=8_TTSKUjI?FR#v9q=9>&W>x#s?;^tb>Yu*oceAD_Sy!qe4Av-lyz!JG&QAXgZ4^?L0PzD3>U?+tU6TTgTQP!YK(JHd3Qp$bifP7 zR+H~u@SCyMqFekh8G&<(*OJDq0&kSuSjmk$t<4&A)LJCL&TwQ5w}!K4+28?fhtje# z`Hp}DW-leQTeea6Oug=rdhH;lY=vL$07(lVku7|>?&k*XnqreXj2iMp`YW5>YA+QN zmWxaXUZTOMF=pwFWJ)KXXYnW5uR`sFudnA*=1!m8@(EXT^_x*!NBpeOBc+G%I%ZUX zE8I$xg@HBN`ikd~+m)E$b&sb!XSCUe`T5TF%zND-_F&E4PreY0==|Ov6bY~c{92}F zh-V2<5d#X^I4O}DiF(J}t(vF1hWui3yMO9T(L7y4y$gT3!m(BR1P8z6@`uP*y5NeN z`6{XN1gAwRwP5qKKWxpywi6(hDa33Bx-kjF+ci6+d>3XIzN*Ld6@+~sV|fqadt!OS z^gU>gbtLl%Fy)`Q%Q;M!yY+XA7`%^ysa^V${d%SJ#0qIe<%*O0E26f(M(aj{9!)o; zrvK;${Lr2;+nRIFY7om5XXbkT)o-na<%wcs1LnolD;zO%=}+X2I}9CmkBnS_%Ai^T zcF!MZ4^7umPgWuX`<$E&84*s@!HYYviXPg5ycf~>a zd$->cS)B~z)Nw%hSQSVDr1qRsstTFHY*ztVNZT!$ErbMOmFBR!dKV>hV-kxNYXMKL zouB7C73Qetoll4lgOMLYg)MqCNvbwLQz9Rf!@;giPzt6eMwduaWd{g^MmY}V2fc~C zj}iD&I~9`t3+4db!{K=2bVAz~j8VpF(%s=M47m<-WhozY+yHn7bG_ znY#f0>jox8fZVzul6PjB7bpE3Df~fUaFby6=TfRfm;;p*8Co-B)rN<9rnUP1&#`)v zd%b29f`ZU@zxT2T4IWV#NfLyIshJ*c+by&A_m?-wJ_)b6_(2zB>7P_Yu^qCjoxEE| z^_ipifrr=m`ae%Q`uiLL9ew)w4B$o4q+HFs5AF4ESYPaFd4)s9Kv`e9DO0(Erh4+>OF83XG#?8iU_Bf)=7h<| zxRFZi*59nLj>lF?6bza&Q3|wVtFP(olipXKqx~U1wPzp?uUI|Sy+v;2y?m^$ohh~> zA=YHZ5tU?#7QRI6h5Y6Bn$|eh9t%rOReaUk%q`J~c?-@@GS|iF+0+rByxdl|gosd}3x&u9GU&j3}|d`reS#&Frj} zy^%~lQAiz_MWj3N~B$+ z4${7SN*;(Jq$XxZ7H7d`5Mjy*(9h)B+>9mVM1|w2^|9bg$ij zhs+fv1SpPFtKk)~rOu`%O>C!${rN-sc(uLT&16qOyX>)cN#3QV&^0sVB+cW;Yf37V zQ)<7~3Z86cMv4IkokSZ2ONdS+mWyQVu?l{reW?w0wE9TP#EoM33I>*!$9-D?YLq0^ zJ!-d9;~M&GhU((4@e5j^Xt9D1J&B<5AlD!C$ac0PO>Q+B>qqwiJ$htvPkp@4YQ^uM zcYVJ$Ixg=R!X@z;H=;?GnM41C<6Cl@B+t~5B85&x|hO?Ap7(*+T?W{IClTDvut;b)p6$P!HgAt%b|m0;~ocpG3f zvB~Ey!4cE&$G)>)Fuj#zF@6O;J#P`o^rQt-o4LX|B&ln&3WpaM5kbWCql$8v(QEG~ zbwL_TpS;3ALj<^2h45ff1Qro`obnC*mJ(AWRmjb{ZDa)ImRi4k-U6)DiKB2*eL=xj z7C(`15_vC+6i1b(s$4BSzGLv%hUd%i;W-bPq8Ua+e)>Y7IQ(KPh8#x_`JSrJ z!!XANH4FPhzw@EtBg9X9Qu=L46pCOw3B8TUI%a{tor=!QXpLC1gYKe9$!#3bYzqat6OIXDaG_6#m2u^8{w{W_Mmc35#4KEdJY(aKqMGPBBs1qHH2w`xt+;lo$W5-47F?&y7Mjlc=Rd_p6qq$yZDT7g_UjrpK`f$MghP zL;bPG^92F04E4l2d@CheC{FUd&qln7{{*<$Hd4?og23BVGt9S{m{x%RQVR?$! zCrG=*8``PGr2Yt?SG;Po@LMuagXh26NUS^ef!btUN7^E_Roy-MkAD|PZ7oO?`^+C6 z`nMbMxc-)r-0W;^fHqF%23A(?qCg`9_s_LBMd0VwEEikzf3DvatGRoj{lNQ>ZO9zA z3Hc%!7DOW&PhQFPO%4ScPSS5DL7&|(Pc?K?lDRHDy0H;j!SiQ|RCTgub%Yw9yak_7 zL%3ppPRqm6^46od<<;UE@!Puz#Uwec*V23a)!UY5@Al){CCAH#r5xUuy6@=j3IGMc9b$2KDGe;*Cvo*rl^39>%2m4oH}GZ; zW3d+uVMy7Lc9RWZsCXfv7NZp66&H{igXjQ`O~6(i}!6? z<%aLuwpw0u3!SYl&SeklLQg%wf1yTSN_s$wyW^m0agVAH>H4{iYi0#kx3M8Tsv4%m zwOLFvW6(O)rIxh0fn|yhm>f_bge*hN$=0Pouym#rgH;<#US&4X0zX-9JDw0vcPRK% zhP(3KUmV;&Y}N8ac7h$P${n;onz_q<^R(I)P{ckQJ(87eH*jigMcl=Z6K11eC+=g+ zC9~{`Rb;)k1w5|5Z#lsK9mv!yR<;d+)G>%3fE+SX{}AD_YcX|skNvK)m1vvBit*~EZ> zwGQW{Vlw2y>!mt#EWGk}K*(nGq8m6+Su?hF(OPMFt7P_s1uL=fR&Tz=nb1JNSt)ij zR4clS-%7JvM|`0U619X5q0HJgS=y45Ku-EszQ;B=IO2e7!qHvrlaG9?p z+evi2aG*5Lt&bh`_XnfoB&Nl98_&+1&TpfSFW#8;zmL&Fwwq(`OLifhLaa%LYcKfl zLXcSul}DuD6d-Tf0upow!`1%?HZc4OqjP=+V43CS{wCfz=kq)>0()fbZHHv0Ik~P!jL=v#a=$1i!|BzFQ~GY+j>1FfRje=i8cF?b z)GpP3`qUN{la?>pe{R!m#8NHX8FMjTurElha2v5*u%~xP^*ry;1Qx4Wz7M5Yp-)&X zf4f+~8Opf^`xQpD?5PEyyOoS7)z4gDmkKyFZic#4x~78d8nk6<58SkP%7o~O*c`h8 zhxP5xW_rc&)gLDfR_fCg-m>kzc6}A>`^N9Zx&w89%epe4`hmRgQMiKw`!QIK`A)R- zjuy<+4(P)~(we!_59N2yx|>Y^E|gRB3d@Epq!11((-(81&Qt^6nc`bk8Q&LX<5ZY*NamNDGKQx?$jmIvWZ`*km zR20_bGw0=Sd>r<(`Lc-b8AGszo>>x4!71iVFLU6Bt3WOyi+J!g!2&1=a~*C?h^!C8 zcWlPf^b~@5%pN4lZlzu=P2$@ffORJo3m=Y0zCEfNd%(ARr>OSJy~dUBctg;zY@+V7 z2|XPt@WP_a{PE1ucH_S$TRZq6sMRU+Q%W1vvy{$AHOb0D@g#Cgu?@gVH=$N>rnNfY zC6_4_Y(o-PvVHglMXnZ#I4;1c63dhA8x943;K9sMYdNTli!p0_^I(r-|Jc@Y5PxuS ztL$jXV|6he9Cpj#UbJ>UaM3EY!8JJ-(&L((Ke=G=BnCv1d(5K?njnvSVNbW*Pd|)N zvWqQ{kdUM=35$Kt8z}_IJL=_)`(1?jT{|~-JzU``TS6hdBaHGY-ej4=9z#aPu3%(rAe3S?*yems zaoD^OPc^d!xK*jrPZp&o`2`YiYT@xem-MR#GrFELH=A#&j zygL)#YX+%H<$_Mxyl46u^zEo%`%P+Izi8eC(+fwHlWh}f%vlymdt-#-=#Yc&*oPRM zpO@YMJttquUUJc$llu_TnY~nCxxlpB7lJ0J^CM42_y%QMqq3KxXtdNS*P5hY?^+A< zlda>1dx(VoX1u`6x<2VtS&1QRCc9WBk^I|1!>G<6UW+p&peF-3?eth_d=*?fvq&F` zcY4rSAs4$BJDYe-1v7i5cPAHODjEH9hyshjhSwR{7B;+C*4?W?su;K6f+rzAtX-Kp zxa_AvVdX0dS4Y_4<><)V?<@fq(s0&kP@!$`I@iaR1mw=y4mO(Iz-Ok7hv9;8U)^s8 zrNL_Wy3@F$3L9ESEI++d6ui%q=ri7zi9;+MW;=e9_?U315_8OU?SkwTs`qhQL z!C;Sm3)(fQyj>!dT*;9;BsVe=_K9_XZBhz_6l87RvBpGW9cgEv^dm7Z9 z?gYL5WI7CEFMB51!LwlxQ*n(I!+3l~_9%4SF57pSc>SycFMK#DdY-r-_K^yptaD+i z+v0Obr3?G)5F+L8@p`Py(|F1S4au<{xcnr;!=1zKn85$SAXJbvPWXJ{48{-rhJEj#wDM-Dk7;G~ZTRpph>daWO^rVpT2U(;2YZZRjSP!U~s1;itP z-5^L!>S)4XDl_?J-vN}8W0_~1XPqZl4Xk};tYsmviDOOZ9!r>Hj_(pIR&F3t-SJ(_ zSpEQ;el7O0t|{YX?(%GB^;Zcs0ww2Yd_;qoQ*7`Fbt8&n^scdS_Lp$+tZ;L^m*9i41V9rQn?z5dYH35v6}ot689WF-R!DXbXT@NDT>wF1p; z+ofYh4pP(G^rTv~_9rJheAPCSlo(^Z+D$R54VFUU{ed^?X0r-JpJVHB`FqpR=P>v1 zPs;!NwNyY<0}}&zd5M{vKz`YbsdgG1gB$t=%U(s%PHdPoiZe>IvK4)S_6*uZH@!BX z5U{Pr+-H9M?J_KlglmcExuK6L`Va=P@7mh7%(Aa$wMvtQKs%mJYV}Ts;b+3fPz5$) zziVcaUW$22BimI)ksa@qNpgZ#AHCaSN?TDq5&ebp`1?G=Mw<7OdD~i?@lyxtqmh`q z?14Cp+Y(v)xwyHmgjF`d0_uj%a=JogObo&H@Ii;q5J81frId{GzCda{(U2?b^lC!eE_<%^jvPm7MbVpx8Ft-{FXffl1S)Sp`*WZ>rea?C!RR(% zJ=aH^!AwDt-82fQy?SedIQY#YMt7&?ldk#5Re8u3%pbq8M-Y^t_k@Y%(E~~aQzUGI zAXFmsz(Ev^C>9inCqv!C)UFXJK#6QvuG9*jm??|61}9-x*bV4F&k&P{Tr$1TGfQJK z-x-KWzj`y`ALq&n88~?7JyrY=^&ZKi&87Ex3$JDrnFa*D_${6MDLt^arT{GdDFx#5 zS%?0&d;WV@>~Ez9B&^-|ojz6O44j?*+C|M&viw7nf_pBBmU^r_0SZEGPk#kfZ2QDkIzZWzH2pZs0aCRm^*o$F;YH{3> zaIkNPE}+Jc`c1Pn+BSZNXG3=FM7Gvf`${Wxp!|+bcsV8H*s=+@89`O?_vx8QBn%?Rk`@$wgh4Jt%B|PzA|wxlFdWWr45rwK=X{P z)~!X&dvT8h77ph51{ZT!PvToN3_3c)_Xvcq`RH?3%iTy^#wjf$hX8_K%DF3Uk>II8uZCoB`fjWhc+IyUlt=q=L(6uf0;aykg#M91w)o)YT zUhT3e#mN-`It+12-jv*LNJd8Y3sSH-?Ba(Q5pyYp$`};CfShiT)M}hU`$aWKz7sr} zf!QD&5<4L8uZsOj1yLeSO${S<6`+@OPSMsVHk(XK7E2pIRWKc4nn)oT@J7SEI}<_k#b7f#hC z_otVr&(>oI(l;I}$Rrd`PH>8X7(8YTP!GyJBBmGZVp_(6bvf075pb2dKOpJijdbTp@2kD6ukE zIvj4dU?_sFmt%0IzTV@Xh+yb{A%deHc91Kmq+yO5TX2r7v?Xm+#>$P*t0HC>Rg0G8 zHGgFo_J5aeL>N7&O-K_GtSC=Fs!DC zo$;-64pzVn!GnP4E?a2w#Q!Qu8N`cIQYNU7*Er~ES{nDOtj&R_pKzk#EZgTA4Y zfU&;Kzmia5+?YfkA2Q&>e6D}c%(7#%8XC>I17wZT9~DaCXU^;!)3>y^aH+f}!js-) zIXMtCo*!@|S>gfnk;1)FlfDPMo9r!KJ{`VamV0Xfh~$L$8?dE+<*aqVhn zGoX+;v}|tADso6#j1;0Vs(G%n#jZ&|fWnF62Ij^{XAjlnD6ZP)ce~^}`iyw%gMapk zu~vh7&O@8Sj0pEm^tfT$70Th#mg*VLiCgpwb8i_o$U;yBXu(T|nAJ`QL$P|VO^Mn-)CcCgd zYaYVZ98WL`y)(-EI0@I{KY&n6Q#-K?$-kNxltj?tAYshOFw2>><3HX7%+2i?hSfX+ zVB+()=XpXA*Qt>AOJ|x*;tau{J+A-6dlTvTPkMb`C)z)a`|soS-{QUh`f&dT-n&r6 zS`|we*(WKPT0Kbsp<3CULJoo-E2k4x2s!~3GY3(k;@2VxwLX1Yc)B#)ld`X0myqXh z?oie)+*P{o@UA1PBm@Y=One=qtI36T7N_e)=7{dc>owUA$USB!eg3{xwfQUf5%OS3 zd1^!90?}D7lmSWw!ivy4wSs$6uGn`=SlR1Hu}z8FOqlFax5```Iwh~F+^>KzSQK+m z>8#Wmht8&|Efa?GU!nDF=2lqhjQZ)FriG57g*m#g3#2GatBgh41yYxV#}r567wB}6 z9f8(tB7^nPL$cI3RkBb4+v(9bW2)0wN2E8Mi6qhSlb%^eRq8G|e8%34vd&}9VPLT| zRHx8m-NKy{;1cywR;`Wt>`=eLh1B~-h!vFV8MMyF&(q8;$0Vi_?e~!DliVAO&J-Ba zY8j%o54jb4#zz)PCH5%O(@3`#h)x#1qZUL;sUsJm^cy5Yy$-kf1JqsTkfUjav?f=v zikeKUjHFkp(^+ay0j48t8CF+KG>D~)?o@3Q^7CleLw6>1BDAIs1U@X6c^yp_7p=I4 z9O!AIBgjYtcUfxhjs6461BW~c&<`ksks_T!WK9Q@Zs_HR^J!bFf=~I5aO5hq5gsWD z%ri{tlUgahb2Xz(rI3~kE|e6OwHF+zurF<*7~B2tzAQ_7;=6zlC@{l?iGr)w7}3#M zH$=-JMx=#Q*%hfWe0F4FI#t63$iV=PpQ~8$CK*_55uv~|`v)EMBlSBJ^@$Z5adxL6 z`a+nB14&UZjn3@>uF7g0F4M*Ns%e(Zl{?@#>Q1L_vY47_xK4G0f(AIO(^b7Q+Xkvb zU%;GUByWk-J`5WMWxWixUdmQNajQ<3jTr;z*<{)iBXJm|Pv1{smE`c^pWtvblQ(%u z>^H<-D%;JqG3I;|m|tm@>XJvZD|kqa5`#}g7GC@=)}%>MoOIO~xiaTFRucDHkZorQ zgNz(L`9RH#Nj45-JmxlZH{UCjJHF%RRiywvYNYa~r4CD@H zI#T!JpW4}-aAb@LeuB+Lx3p5f&j@uqP>niS-VDXdqkYG`2W9Hl&8_(%=2ibC(LoVN z-bDjw;@YL-2Wpu%MNY$V!yE2aRBa>@mKz@Io+YUzC(jnH&CC?Y%1{a8ByTFx6HHSn z=*4%vqD6Fgv0B9--WjUrN8zJv$_=J|U#eL1o;zgBYj=zk4PeCpJIG~gFE>=Rdf+pj z9^8ztr1WUj(UV}7m0vVT)K0Lgv*3TC;bnuOmVWURsXjdXF>(yOO!jm~U7Z9~4eMVx z1r(2rSPg`$p#7y0)!+PjW~rHSh}P}i*o`HAo}zC~!c8M3%$5A~ESyoW&?uvT$%|G| z6LgLz)rTY4yxHIU33(2gu@F56XD8&XAFG}>67M_8H#dK9BQCyEf(?mI{@`)eE6eTT zoA3zA;3F=avFy~^t^{``1P`ak71l_)+0!(Q&YthXRYB-*O5b41_W1a(|Xo3zd`>|fO!#$Z_j?-aF;)| zRR2C&{-J&R|5||kHCldt7PS2fL#|M9)#j5S$Boryzk?ZVbJkjby#{FJ3iI1wKa zQQ1tH&s(>xd{NnoXqEpr1umt1EZ@#eH#A;Qiniuyogohn>13D83wzdZtbty00;cpHX9J!?-~f96pojR(yLi++>rANf&iY7C=fyGqhJGD>}Eor!F2>< z)Zo}5(O|9z;|#Lq0=oi$Ds(PQh z0L&Zp^tUrvqEeP%sx{exs=``*zni2N#q`v__huD0yeNbNfjeIGfn}YVIkN{VeTy|m zl?}|Dq40{AtfP%b5BrtF@2i@+5yZclhfV$FgDK&#oKQo~kt3GxyrJV69=GlZdmhn? zNE_2p(#V52Lgw#Pgf3J%Do-RpE<4Mxuia}bz~Ju4?yWn(H{b($4ttlZcu_m*E1#jF z5^ulA-%)w^jI|p|HZKbs#*)nnfHIqi<>9x_}O18lb6fA_67?Mv89&27n}jCi)8fl`3YSzZ;Bn1*6%o9$pO;{3{w3nH&!I zS3E4TPcH+Yg|w#6;elUVNkj^eC^aUsh7OtS85X5EM0GS7!~LWeg7f8q?M*G3tGa zfp;eqPtbLF=YL`o7uL&>h-`y_i5M_^JS}&x)nH!D<_we5f7zFzF_fGjORA2p%>U&%VoIT z(EeLzPW-RU5xEa4d+fki2&!H6X9Nv95rDokp(7-P23wmlsZ9`?{j5;2Y1D)QR}gkD_wkvP=}OncK}w871xU6WY{5!HbT1Z@;c zdToqEJI=*IY{Ru4;~V3&j3EAJ^JaeB0c-*+wJ8fG{hZ1@-#-f|7TEMs!B2Ho$){}XqPtM1R3{p80Yz)ENT;j(WT{q0WP9|b?>_Yf`r!lA{^!ThUxbH^C`>D(QE z>)ef=2Id}RRf-k{xI|y+Ftdjk>F64U*~w~}*&5Kzpj#QyF`OVYwxLl2Foz?174ZvF zBV+wy{UAe9{eb$1dxyJwyP=He>8t(3UBGPcX+TtZdb$S&A(e)Dx`zfK|8!~Aj?|l( z&jV5XN0a+N_8JGnvEn4u1r%$2$@(GrmP|{)u8N>*HKRNbZ8Kg@tmX`o(=n% z@_Lp^Z@T^y>gaaA;u-VKZLC(wxQMu1SvX(BPCmg=mAi>5s_gE3ycq37!W7d=b~Vjm z5RiFKqD(QJGcq7Fm#Xdu5;?w%m9&d_ThD1kosxt$Oam18m1IOhq5cfnbioAHUEhi| zt|JuRma98``MjYmYbwHabQa83f;!Wkp-Nx<3-G`PXVc&d=T4Tjk!6Z;ps`ZUrR`0L zb@Dl^haY>>`yx)hpjLd8A={*b><|L>f;~hq^V(94KR71tiCZ8KPO-hnka`l6B%p&@ zl6UOO82%W1c+U+w5oQ(y%)8>HoS#;LeB5GMlOS;ZN1$4Y3uit}_o;ciuFc$xiYp+y zn2*slizHih$(r&Snb}KkFq^{Z8%{2gMMry1*g^s_BNv`mVK?DQOwM_6sTcd%IF2Tk6JUsFg2DV2Y`jYh;B<1rfXHOk91EY6Cz#*9+kLUm$Sg)8RaH?&Co~6A9Ss zB6BP|blxF&obVIQAk3w~==boUm;#>LV;?OaGx^j@m@ItfEW>7*# z0xX34s}QlDp9JA2e1s(N^LRmWUl72*B77wX@%HJj;p^9fFzCXY!3aTz;;(-~=rBn))YUQw%~|x-~1ZHTm7aPOZFY?k9-U+YU-%< ziH@}TTxjz5x8y(8TKp%ssFm1o z#fK4Wnmu4pBL?uL`A=b-2@^EW<8Xro4+=7$ghuofwt5$m$`W1&De;s0tU14Qo&I!S zrP4B8S*U*@s)z_?jAcN^oIvAnF-M;=dytV;d6{`tZyyLn9NAAWT^ocH9E&EJiWc?i z72FmUAo0ug=+c-f?SxZ6iAKVOwYev2qte>vmxy%|%qj{;QbL2&8Qx#^^vZ$r^!?rZaR>6MH!C${`0{oL|RWWenwRFe{A;rtvc?%l`m4C<0NC7|E2ITk>>7& zHGneYTNl@Hn&{OZ2p_y`?;pP$hqDq2c`YAsK3Jo@D(*#$4pE)N(&+ztMAV0$z3E!Jhqe7*|XbkUFlo!v}Wn*%3vi-5s zcBB1X6t2U5%KOV=odHV4Q*)T~lMt?W)6E#!?|sGB8*_|od4i#A??u0HU7 zwW=*3&`pIaYm80#8Yno*r!4<8@GWGWX4V(^2IpXcu7?6b zWxz~T$qPh(ebrzpn>&BLt8)P-d%3^13nZ;zGl$X;iag4HC+D8?t`}Mx4o%_R!k9MH z3I_Tx6APCX8U{U8$Yz;hay=c!UB@~l3TAGw^GtuMmw@i`8(q<6oNH2NGkafDImgd9 z*Uz4$xevbU4BZOB#h4cX2DV!+2X!$+;O%1NIIp4SbzkJKd$6MmV(V~rtg^z8^|1p8 zYSxF!cPt$4>Qt7GFX~(;$!Wr-R~nONF5JRI41S71&7p)1*2k#Y!U{P}H2K~Vo1?FD z9WM+SzT1^hSbuSS)BxX$a0o(Anku60i&Ij)z>{ru9H72rZgU&ngX?FyB=wWP zP67>h{_P$iJCLcO_tc>a2Y7Ut%1$%E<*DYVt9$OPiMkRRHgy)12AEx-X;S1}>yKO~ ztdZA2TK_U9g@Pmc#$sfhc%3z^{4i+CR;dooh@485hMQ9{l|9WM>G@fBbGC8 zHk0}oo%3sLmM+VcB)6b23nToX-<42*d3;u2&G3yAPSaed56smVKN(AYU#Ls_LMY9V zQyz2&Orp4}M<2nZ5OMGN0xs@m7jr%1PV{j_Y)E7Fq&nGiwelcurW@GQY%ZmP-F&F! z6)naTy^^sbrgbQp4GDq6KvwcK9hpvdID?MEj&ZvH0@IXWU#RM}Euc`4AgglBaQjB+ zDFK?<_;o1sV+Z{_b|ngxENV9escPGqY-7u#xpry@W-P9ptgmT}t!(X9Y+(c;=#}0^kJb)Z@S+=}tRI z1!wGsR;*FJI+&&{7ZDZY%m{jXGil>pu7T0j9d=}J3*nMUd5<0!{U1M_*~2=_TIvzs z++m`_$!3#$y)AWwTxh?kiXV{@ubSFdoy8+bH0q7$lEn(zkIfo+_kqIba#olXa%KQ` zRIqWW^-|d~3i=r`KeeZQlO0df%TF0_ptxl6i{RSI>a6N*WTxSEVwd7zXbQTF&;(Zi zru;x=35M#B%c7(a%7Xqfalu^)bfOTvZy>QQak38gW(C)hkqchMS7uKha0n^q^j_%yS=fpEE~f~ zD45IA<@H^lsA#0dLjezEm)G+!$Uvaw1C)gwHR8sQAn*HIlWcg*LeL1e-cv4@^tC}l z+Qvj=2vn3l@z(*N;|_dmZwyp%)CK6;2&r_j%dJ)N^+z#f*D^BI|&k67P4}W$ei^friNbmJEFoZ+ObaX?};r zE5S^Uv!fBKBG>6FF5PjqaVq6~y(#20eq!=*<#>^n^k= zGe66rzrPNxLF)Sv)9f!Lre!QHrlp=9)77i)#eOph)nwj*SM*tIr!dO&9o-%}ZV zRiKQPfEG;;Ep<+eQ7a@|>;!Rkptql34n?pRNJB>#2U@X9mA?OXhfAhCnux)X&qupwM3S&S5TDnT$(+BQ1-Z@g6U(tU>w`2jO*<&->;IH8WUIxdrsc?8#^M#aD^&Wh9_=ykXQU%#;W4KdCl2pRsA zDP6~mrM;WRx!a{C0v`j@K~5EY7vMLS<0bUDTKBZB0%9fJ;F~CL0mF}AT8?drbRrtIF5EItlkL| z*_!>@4 zVAm}1PcG2c+C^wCsr|0o4qCCq8wMmk#vD7A2c#D=Bo~uWPb!3+ks-EZJDeeIya;&s zpYKoj2zZ1$oM=f;tM-ZfT-l_1{rAW_(v>?F(ASvI_W9bPd)%obOGR;24RMz_>&;^I zhgm}Jz=U1l!@6Rqx`E%si#sZEH8FeOM-C-)U?h2-3f56?8o++r#J^StwcB_IvW}d( zfmgB&qjmdWh zXp21{eu$RqZ{_dt=|H;R3_R;IjOeuIdSKo+J*r<^4vK6nm>r5_CVJAbz^<-+?Rz-! z+s;6I=|*5$wnL8WBY7}qTBoZg=OdUDLO5;?`_;EWt4?1ZT$hWO}{Y_5n_$qM0uVNBU%!)}d_0WKrQZk=o&5P>zY3H03u z$flQ{Xx=z2I@p7^*cD^~hWmoZ4LaX#Q%C^1@2i@vUq;A&ouc9IGdF5Hj%z)yEXR}_ zt+0mvdZBt)(tS5AT|uX+0gYpk=7Q5B?6$1Q8mwb%PQJrsSf{9Up~GeVQ47}ePCG0w zBvZ8?1q!1M=l-1%HNK1+G+r~dPr)w+%nmvMl)FhtYC!2%gER~qebQ)8(LMGsN@z2Z zmy8B_tTZBKIjw68%-DpIK9YMkpvy!DCi(KDFesO-oft}9-A^WR*ZjNb`~$)LtY4FP zq~0fT5AjfLePFof8|BGe4WVqme#8zSlK`V!7NQD6-ITr|K1Guj+2K9ek`!HOU+IcU zZ4+E=3QBFG$-RUBQO{|fyu~d+fBCXX@K5#Jf7)M_HvZqLfDOu)imNK{+)H#T0u%s+ zHBtP8+4+=UxBFNEX)G~wDJwDe2Dw?KWmb{?q)!}O=YwYPN8uc);&^@LG2C$UsFSJ# zHn`Pza+IlxYMbYz_Byxc+v~vQ2XIOc5())%nH!cXV*Rtk0AlCCf;Ol+3O)6ZeRMXv z%=oQEP+z%rbF}U9&l+{px*n5w402=W&9bL&t5z<{UR7Iu{&>i*UsHW37zemAzSgDbCXZ}zL z{Zf-o3Tg|1V7KcM2+O9e1#p1#4;Y%b^m&l z#Ah@^E8%yMVLpOVRZEr$Ygk3yLfxj9&;&EI_t?s~bCIrG=F{SEhK8SGOe4t=Zk(@? zh>T&WO|xG$BDhL0JS<6#7rtJithd!Gi_pBdZCUa&&I!$WDo+r$STq^5bvQN|&>#|g z{&KVzzo*$?v{BEc3g(CFK$9w3_50atlSoyfd}SiSGIH_0P*jt-D)?LFR$}BA(H6xw{lBb5R00q@*FVakmNTZokeAq%fY4FhF*EwUmP*P z?4^4QVRuueze7r-7%)zlfVKM90-&ft8v%l^1wH)A0noBNvE4_7_tf8K=pP?+7MzbT z)$rwK&)VNP+>a}6fVM_cAGasD;n5{@OAu_Xx`Q|n#F`&k3&di#Sk2)%VC4ncKn@nvc0pK1Nd(T>xFZp&Cc{0VV_SeCGw%oO$BjUDEqn7S)7>$0aK zjg=rhxV>=~9pDX(%@fzWKLqQXfR&>)4;ded>sFFda%Il(w~LPGB)4z^XU5`+dFymk z+CGT4XBqwAqd|>f=T_-Lrr}aXBeDq-FgW?y7;_ilf8T@5jPr(AXA2xhF2xK>W%vV! zVz$cUaFa+u;KiJaCeX&Ug@jQn)kN^v!?h0U2O6aQz``SheWI!qe=3&`1H3Na50>ck zd{wTph$74=GYw zULq1OBpfEaywh=h0i1%|Osp~j$+EI29D5EkpdBzX?ALytQbkRjK8NilRnh5q`_YB6 z2Cnj~0`ue@es@<`9&j#u0^^R2n1ear(HAOY{}qHF`TA#U!eg3;B$r1?X?Xg>rDX81yu^ds2XqfgtcT&?3iToQvfzn(Gy=r!PDS z_N^=k?RLv=CO({-<2DbcFS|(H%#+qIRvF7zAioff)m12Irm>YbcrDaA7becF%EdVLWGqEYMVO%8%p+xCXFfaakOw-h|4Abx*leW+M4aGZWp# zZrSvQ^kO@!j%dc1_vgx%2UEM5#ua$Sv-ZoShGj!5^tUe)bR4kZ!Fy>&Dk+QO6F?9J_}Eo z)9zp-CW?W2AvCLsy3N|tp<345x)j)~d5OdJ!P?y6^}6F_hT~zhug^P5H@r=`*-(Ah zt{c1XFDgn}LqLP7db+g!w_D1}Ey`6LMSECiO4OQugVcdj>J7bX((ooVEz@h3a96eV zu^nzufWI;*sGpE{Yg8&48+&?_q{jv=`l*QgNoUJXx-^nwDF`MM%BbzMMrP|h?NtPL zMc`jq_9G11evK=zhGWy=fQBMExz+}e&`?up2OZ?*%+OywlIx3-0OOw{arIhnqbGpz zwp$VLXPJ(jG+~LR8LPJ5G)Yl0P#WIgb}GOC~|_Sk9Cw)Ts`_>gOGvm;Rt?N`S2zDsAo{?i}kMRG|U@5m9l*lPBm(C(|$6br2A7$n6i|1ObOeRC1%S4*#Mul*_=A`ttoy~L27_{L^Zmx zebfNUAhH*J47Wo*9=(f9D|Wh9&I6u%c#EXY2Mg}g1&i^@$m;xr9w6AP1_Cg%|@eu7cIX3rwr43QOv z%L3wxEJw&n;!lG3xj!wLSeryjBlBK&1Wnnt<^7eW1y8;SnzGoh{yBY9}Z=eH! zkc}ocBU^yI41Bi_N8OiJtdoBcq=ItFL-duWzvF9Q zGMP%%R3@|-%kSvfXHpp*; zS62INV3r7a0*N&W`dBfhJStV^c0U3}oH>d>Q^)PEPjZ6{EC?||Xy>k%$LHLv=R=39 zoIjATmzV2n3=NZePU26V{Ry=z8E8(zl?&l@b2VqEXSfdxVq6$O>egk=1 z7Ef$ySf;u(3RzBA?h9$cSJ1NpC5bK|oSdoDw3V=NTq@VOF< zTMyq8zJYeX(13_b28!N24jIU%x5*CPEA`cI5}!~XKM3|^u0}^!@F=`TJ7jpytp+yJ z05oowU-%#XtAe|K;ffMM+x#^M9%@V=y9#g4*Ulqd^%2teznQODIhvC0K96&8_E} zB2Og=f7{CK$3>v0vXuArx>U}j>+<~qRxYdzj34`9>sS zS!)8X+q66RVynUHeD((`=|O!A-l605n*dtA$dS2ef{W#b1LdgLg)4`mteL0Bs&sH~ zlH42X!r)>UUSWoDTo80nxx|Xig)O{B)fo|RZXjWal$#*C6G{7~Lm=@y2q;oMqH^UQ zHJA@aSX|fV#0>Et^X-2G3i{Xa{9(b$Hs(%_|H5Hcd_rCRU|Q5^w>D~bH~Qxhsv)f2 z$b-BFUf~A{fr^vgY=vVq8mg~d#GTW|X8Y%b!VRiQTSf4o>v~;_Vq98DT0_@7T{|3Z zv@kw?axN~sKCXX5{}5k`A`GKK5Q<46C6ZQ2i$xcqC!J^pWB|%BNihsSuLEC_nnt;M zzE{@|xVlX~N>Q1zHEy?6R(GtWsUyN!&!y`hRc7j5XDfh}MC6hCGM3>~weL}e%4 zY4(nD1aMp;2U^Y74}9&aCs-}9Wh$f|^M7Xire`MFWx3j$ z+2qzjjg_Lskby`~c_nQVszt%3Gr3O1t%vRQ?pAGCBN9FeC{_*CK=?_gGOdEQs*W;tm$tn{Smd3zs z`oLL*nn}`iaem^h$Ng+zL6*u_|Yik9Fv!MD2@$9 zmOveMFn!7zaAo(XkQ-p_QJ%O_$vcWFyR@6R1qrqQN4_m_6Y48sR+1~?Hn}Zv9m>i0 zP0gu+(-yY-k2yVokkz>sop~dfuTawWa1~o;xvig z2lz2@Tw0A`_LDT<@^sLQ!iDvmrF^zmw1%?+Bfz+olR?*3$fgBh%4q*s*m>dWZf2&U6-uDfwSr!VaJR@BmHN)Tb9i92T7r6b#8V1?1Gw_g!-P+BBmCSWfYP)r$9%DNUZR76!ZcVNF`KA!MaJvsIG@^MsN z(P@zVUR%0P&wQrX*Npj4t}g%!4gwb6T|L~qU;A?joNN%Hk%ISbI^VbCEPdT}DrlmF zIu%R&{PfFeIfPR+-0rt;+roZcv-u@wyz+e!0dIOwM3xjN7Td+&zHO;PXR|+H>#{v5 z!0J-8$EP4Hw_s)kRpDs$u#T5>z)p_SjWRUNfpPB#4Nx@1?-+cq=4b#mw0ye)78GY# zdIO*^*Hlp4g?2kvNkD8|SOVvZqt<(1%RZ%@MaFLvhf4)Z^?ro;q{R@f>wd1-xfl>9 zKRKHhkLuZccB4=am(tMcd{Koy@YR8KB^%Cso2XEdsNft?BOKIlMcgl9jcc$IZ=_#j z4tUZb&L`rjN=#Qxn%aHM%Du@f9~I#mfL7`Z;PD2^^b*@1pxw}Zag$%~KD|&;)^JC; zP-Rw-OyU}~*}KBdDqet|CyhBk(%TeW8t`upzhkzbz}`z)ux-?j%SY10_?b|)47N>) zP?xX@?HWrFu_4lEhqpMe9ZPdeg8}TaDRSWfU6=hH(+Y4p;czI$T25*$y@ne?PoM*O zJ~qal;c40>FKX7{rnuC8K1RV-6!YSUGB+}F2WBMA3#eD2%Iu{9bA)c;tX@S}hN8MB z@=$o>U~r5u&E@#f!){{7(rE8tuwB3Hq0CpB4fzQDtk~tkXJf_R`Rh{~p>)F-%C*|Y zSgI>F5gg}BDtZo_QJc{h!W*OGHGrrHN}p@2#ja7LVURsxqb2>xR)YR~k9l8703$#i zyb41ECu1R^tXO@VV09_dk%E>M$4>_Ly!7A^5_ld)K)-CSO0^? z&`o>j9gIa@N5AZi82RoAeScSu*QjGz>Nm(f>W*#UTG9l4ln&R(Z=3{K`AzYb@aHf4 zHYWiIo+Z4}zhUmV_Tle=_rKpGjLy_Yb|eU&XeSsBzd`FHQQxkdGSl75H^V%V5yf&GHz64sy)3CR3%{ilQK z?3HKCwM%cbG0nVJKwiiOXP6Wc;bvCubVH1$pNRJN=eJ$5AEMReC0j|~V4IwO8s-By z&5i=s7pCW{OSf?ag{9k@TPCKD+4c1}w^L-B>CX5{h8+!F_Qk8K%-AIo+$ND!VFG^< zG-=CvSVZTpru9{E8>0c)}$jx7rpIJZbPFIue+KYkXrF+z7?;y{y4)N@>EjVL3= z9`>jQ+!`C@x=x9#5D9q0lg1KdxtsfxA3|Of`6%TT&tCVXygmy^_tpSjz%*>a2LKQ|{icw*bKU7%dvuq!KdzJ~+ zB(elf;)wRo2dvHqRUKLsmjZ)pIjDjNP`*eLCZdJBw|(s)2{M1(4C5!N5#@qk&VkO8 z@1psUYNBD@Dk=PI@g1UK?t~ud4!CvUH;jq5@HWvoRI`v_kkt<`RCA`ul5{5$DVoUtG1 z4B{0Z$mi*XxcLtgsG0c}mQzspO0yWMS-@GqWl7S&)l1-Y2iKmd8x$Z?6Np|q$>Qlg zde!mzdcOeaeZz9U)6)`0MRM2byQf7)Mpllu>UQ@S_s28FdB*v(&))N_z0X>6&Dn!A{WX|+ zB@3IHehf(lUbURTXyLV0?}&0WYbks^4NT`IO)$y7*4Dmw1W@xt+EAqD6M2ot?gVO% zZfFp-QrYcik62$WEWVYDWTrU4poH&hcT7TudP4US*;ds|+4!ieA}5_O*{(pxh}!eT zmSw^W_KHc+x~Qn<1(hBT`V+HQEpJZQ`W=VPYY@elay5~k17R}V)fSE0|-lkO!fw?rENqu)k~ zH%5DZ06+^Tl@WH#MJ&bgpu78Ek7TRG&hL3B8Fb>m5&f`~0TWbKsFD)TzK3SFv{5G@ z@|i^F&CU)l6@{7H$FT)db&I_wxF=XePFySt@Kn+}`_O?}kMp!qc5~*%6ChqeaRqN# zSOXVWB^}gJ80Xe+fb!rBJUaOK3ov=MJqv|{^TKE?U1kL5)2Vfa6JN5a993$Oxbx^d zuE>`cWXK~#L?Dsl9w3r^QbAI=az-!Q-cMo)X2u}t&T&{V zSfhl?A)8`J+-{ifFA%}qYZLWzG(Su0h_a#`@ zOiGYQt|%MP6x#Sj>Bi=?$#sN%H19TU8b#wGesvw_L_BCY<3K1v-~ggUCM$$*R1Us) z^T*BK7LQjUZj}@Epga&HmdKUkUVUleqQNf15evP$B@KEx2h=a)aFkw*<%;y!d$_Cb zUdG$$)7)imB+uA@%FCk8YAbCFuIo}sKy5IUUD26xEu4kZXFW0_Lnqtq_=2qn0#%Mt z(lsN;d<9^Mu>ftQH`_(5RirL6g$d%=P8HJcyVx(sFfiJ$g7m{#0e^I5Ke&`P6a4YF<-2RTQj0)cdWs+ zTsGAZdn%1Y8tv!svF2N{Z+CD)5UPe{z*GaL%vv#plFj}tXjH#IuWx^^mn_$hLD7Dq zG3;N%@IUA6|A!6#4=iRXpDN7C!M)F*#D(C=0RbcN!+Xdp@WD|VeAzddp5`Fqm7O&N zpCyq>qq`yC0i8JVW7z%7gGGDBecfk}vE<}lK3jgfU#)8^?)-Rt1=d4oAu~Wz%_Xde zW6I6LjAtlPs@GHKCPbg5KpLyxrZ++6ioI3}4nYS-M|Y&)pv&JuKQQJ>j!mq=`+`u< zJi0TXkg8nPPQmZOHOfq>)gxvTdQSgytUOLfABFN7qDkvbySnq*K9-S^FxPpaUdmNR zfGuk&0ZzR(Vs9;$k@|h545|4x3wfjUnlIaMG}5+CyEZyXb!=Z^(!5?_O;N~VT+0Sre0fsmw1;7 z@MeVO&%>vS%PhNzEY{32!uVo26>>*smM^hmT>7H7Cc_4mhj4238>;t0sQd`=T%%Z#QACU1J2(gN-UwPvh-8L7btA@~u1*e` zs3Y`IT-pZt0rDX)ziE0mQfrkFK00P+ZJOQnV{lSA!fO{=#ku{5Os>BL@8S=p+cq5g z%nIBgyxuWm>77~$fl2hOIBlBvnR;sam@MU*hyzmJ$5%PQYe+&5`!sr~WCPZ9v&Can zL~gMrlOUrLZVk{QYY_Z60Alx`Df}K?ahPqC3JPxiECvs|bRz2NUc3tco&h;%!&Iu^ ziZm`EqSR-YW2k+Mp89*mxi3QEgx@^?Pch=Y12Kkm^fpU+e!YcU-|C_8j7+K!tUpko ze?l8U3I6u(hcOVURDO<@CRd+LR{7auK*nJiPUwUUC$eNZBl!()0;2y&@T<5KVPFe~ z$T9{Ya9wjK{ElO1l4}k+vH92})y9uUF#h+}No+H5pFk(OG>@_>t18ZRl!8|Pe6Fj- zP$V@hnUwc$0Wm6`6y3YOr!y7IiqarIIq=8-nvo#-Cl0)nt&J(akGZR5=WsjMk`)bU`+0ed*{IHZwCP8q@dn(_0)5*FFV&);8G>H_oa)Hk!e6pf5{H z26Mqqt`g9)RM@!)O+uBA#K`FgZu(V|P(!Xv}wmkfqV z(R%B?Qjwat14jo01Q;Ti98_p&OrF&_JUK1k9Qg;ytn`Ksi7O^ z-Vv0zo<_z()mKZ61gcnVtk5zQnLMO^R##b;<<&JzO4VvoQUf<#`#wjFuTdRUey-MN zJ{{rYHwpH@X&?r6Id@Cg|Fdxo(pe#KNSUKo&F6||x8%arY4?c6d#q5Bzb&2EBc{Nb z&@@V;vA4zi>6Wj9?nI$iO3d7Z*mR$Ign8s4TJ1h-$8>2JLifHpsAZh`r|6xb2SNU7 zZ&+SJ79qOBB}v+fIqe}0gSmVtgSvNkNrY7D@>fBsVKt`d-IjX8a~bR!sAnq+nrCrS zMB(X+07ezNqv;vZ)%CmBv?o`^yhBl0w1t%3TBGh-45g8AaahO^Zl~2*?6J1d)`0k+ z(@7MEkoiQE2KC+KO$+^^Ty$y-nOyB&$CTo2_l$+BuM=c!W!qR2l4|zZ&Npv5*TlPF z!;$I4B|2B{j}`kDv>b4WDfA}_>>q4+na>Utgj;?tCOfy*0B+mD6~5zW)_?g9$mZ%GR&6zTNm!HwP0v8!fQ-jXcK zG-fOW2YT=30@fr!^DELT8*7nMy`l>v@JH+ePe368;Ykg327*Tl-8o^azY)5NeO^~Y zfWJYkSr--a0NZ}lQc~?g)5Cfx(hKs2%1Xu=uq6`T_WUWf%@RA!b3ne~!AK4o*R4iJ z;v4i-QKPq7Bqw;pk|zy~e;~f;f=}knacw%Q%u8#}0Sv=vm05>mp{K_ph0@Uf3;%{y zsza*QyARr&vZ+308J-;+e}KRz=oQqwu5Ub=D&XcTjKa+JO_f4tpD*=SL?&ntAjlrf z_oBuiQOYSS^ub7na4ZW{ikY>2#k*utdC{;uw>^%pd*?7RzE4HAUAW+fYh%X+9lg5p+8<6LyY8Qr9Xlhjk z-(+eRw(A=EO|1plEu&`DEGcRm1GN>_95I*4lNQ)ad?M6!ld!oim8r^Xvg?9Oagpx# zix)tVVN-Cp4$!NvBL#aNcT9~JvX!J%X*F8{eicrRmRG6NUl>*?SNr^mU^ulzE-$-c z%i1CBaYHM^U8?U8$9Ixj1y7AL%f|EaV`nHgpS&Kh6J+Hq=B>Y{Y z4)32fzW;?C7^PyVh-ixBgMyGm6rm+V@ePjx&4Brr1ocYz7oa@_;9QLgZ5B)|aToe! zz4JGp+;djm`b?S5d&R-&q$zXLXTWFN=TCv{d-gWT0+}5q#xwRq?nCd1H|+PXD5Ba# z%1%aUrQxP2}PJ3ea zrXP(@5+9tZyY<*WU}uABVXY8QMpZ02-Jiks)d0&{%*Zk=$$bnG3m*s2I^fJoWr41f zo4R#%x2VB(zjc`&NjLuig59)okZGT;qw?#lT$fH<-MRMIFW-N1{zMY0*^`CFKt(#zRI$hg^qi&cS)yBt z(O`vDp4ISUu>HM07TN+Q(>dI|7ptKlMZQWWw6L2(g?X(T6Jv2d!7KX5=U1w9d*L>~ z4#oybrEarpkR)DZ&grpW;Wl2@{1sNTnH%aMGnPPhK*tBGEJANiNUxZM8-Ft+ThTW6 z_D1p~=+~tP9%$ShLTKEGd&CUY>mMPLS1lp5)kXSBWj4%*gUe@yw3n42C|qAx8TQq$X_-tL zWs-c097I?`nZ~V7!YR#t_eyePIn<_a558w+A+uv;ryO-sj2>>1BRN797~t-|HIK>X z$1KOrjon>QHPzf8)|zu14erLAY*1WEFRQ5tIA@x#yFk3Z%jAU8p74+@#dtUk$z4fX z$JYEZ^W{VQvM=XxC#N?Ee@k|lz$Aht!`nGXo+$*)p2KrZnE*Yc_$ngqFH^E4 zP04qAPUm+h4!o=6cMaW>b#7+>*w6=FK`5or1d~|cgB{y<`Auh;&k9>(XNv;^Axw8l zuBXwNNnze8*kBhVZE^Z$$rqR4^+FUZDzYW)nl&GL)qQ3(^5y6WKw(VH!1DGDv<95C z<)&rJ#M;CIt3e0EIm`@vHGAxq&QZ)}xUMpT)RmEM2tGHdKH0sI!Kk7w2)jUkhDCun z2R=6j+X)UT2ohe-a9RU=S$yh^?I-c$hQrlQuFL#U40m|1#Ss|;Cb=e|$0UR-c1)xz zE!ie^I2%abz6np>ErFQ9brw*ino}D^NwW`>!Jo5hd_)XzmJtoY7v3>A;B7%LVJoEY zagAz9xZmC$k7&U=79igX4)2NY->5w4g0R^_X{s)I=VIvk3QZ`BlZmzAuzsU4XVv%Tc|P(5{h$<&g`7nto9EhLR_+%Y zdimm8rxMQP&mS0_6q-6tuD>X|k2B|fh)M}_gVuY0nGJry3IZL?C1eWTcF9Xmd26-b zgHkfUFeju;*1#~wETCNl=9~+qtoOy}3?U4mmEfU6&~5cC=dG6YU?qiY0fx<~d-_60 zvqRTL7xLO)7-d}#Qi?{dh|BR@t3u?=l_N?hq!0)~0mg%?qyrwf(ujRdeS)Y4P7o7Z_H59Nw65S5f=Gzl5#P+{ zI|7z>RcK-B*G@jq!aA3&n%5!^+C(Hua(0nCRR7(`gG|MfDMXd^yN9(_9 z7OXwy$Ao>@I#@{Ch|6eBPleO~4{QOs<#l;0g#RcS366G(J=Qf+aX{{LjuEZh& za{L#i2CZtP8Xh6=-we-V|5wBFDY{Qp6%a5zBR!BfDJZJnhb#}wBWmXXs`pR!MsytHKRr}5G3LQ&G3&tnBxI79_#{!bMlG6;b=!9q~m)$^GG zB1|y_-$Yc|08n2)UWp7V$Z&yQ)tsETm*eS~4>60Z0M=H?v4gF_(2(gUjbQzZx-ZA< z_?uS0z=Lg=l!8i6EuA^RK`A;=1N{i0S>p(fB9RCWpvf2*;~YsPrrSxoN>om})+TLmwO0_C~V>+>t z=@w+;6O^Lcvwu0--USn@*+2Dl=wvEb0Is-ond zlp^xvfOGB9g@gEs>X^PSYf%NO@RyEo#R}Ug9+n9uQ^11TP)M|tHxBfg5oZbK1girv z;xI&9@rK*o30;vWkdlzosyVZH;4RHsRf4UP(Vw_v4p4NW)|eD9k1n(*QH@D|R7KQD zB)!?xdwN{#!eQg$qy@!CeG1iFMqKP9#u0a?&iPC{e@flY;KJ}B)<-Th8(E(dI%LH(TT_J4ho|Itw8 z4}z6~vFT@nyn{Q@AAkQ;NBqxglBu+A@yWM(H)$IuIb8_po9kRq!eln@Za}U=fWSb4 zkk3sF*pOxsWH4rgtZNIG#dq74bjxL>Ci{(N?q*V_l)j+%GbNMp&})<3(Z|I1_4OIM z3x!3Ct%Os}SwHt;hs36ZOmCdOx7!-j6&(Wmhf(b~-J;bwm0us!+xmN3KzbHW=yFA#n({q#7afCZ|@k>txDdQ$Vi9?fE-FWqfF_?Id3o+u{k)XK}wiu`;Z_aa$b3>9sDQM`q9%B~h6N)9b^fL8t z*E-08H?wME4N910QJ3l+&vDy#dAI>WMQX)p`-+5r<;()dd99dh(0BR(-3J3f;&?-f z3~w0v8`*yC5?0bXNP|d-ZvwNn>bI@d!PdXHMf&K)echq&3@Oam#IHBDQdYwZt>%@! z<~4aO1SdJfJZ7l$OT?X)uFR6yg}a?yWTS+}Tx6JYrZRnjurbn5%w?#6I1X

<@Ty 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

P#F+l- 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 az(-XP4b1q!n=J5WkP>9*;sgOM%Kre=kCM6o literal 0 HcmV?d00001 diff --git a/src/java/org/apache/cassandra/concurrent/JMXEnabledThreadPoolExecutor.java b/src/java/org/apache/cassandra/concurrent/JMXEnabledThreadPoolExecutor.java index de448b5a71..db75e8fb5e 100644 --- a/src/java/org/apache/cassandra/concurrent/JMXEnabledThreadPoolExecutor.java +++ b/src/java/org/apache/cassandra/concurrent/JMXEnabledThreadPoolExecutor.java @@ -151,12 +151,12 @@ public class JMXEnabledThreadPoolExecutor extends DebuggableThreadPoolExecutor i public int getTotalBlockedTasks() { - return (int) metrics.totalBlocked.count(); + return (int) metrics.totalBlocked.getCount(); } public int getCurrentlyBlockedTasks() { - return (int) metrics.currentBlocked.count(); + return (int) metrics.currentBlocked.getCount(); } public int getCoreThreads() diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java index 7b11672469..ec127365c8 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@ -26,6 +26,7 @@ import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.regex.Pattern; + import javax.management.*; import com.google.common.annotations.VisibleForTesting; @@ -33,9 +34,9 @@ import com.google.common.base.Function; import com.google.common.collect.*; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Uninterruptibles; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import org.apache.cassandra.cache.IRowCacheEntry; import org.apache.cassandra.cache.RowCacheKey; import org.apache.cassandra.cache.RowCacheSentinel; @@ -66,6 +67,7 @@ import org.apache.cassandra.io.compress.CompressionParameters; import org.apache.cassandra.io.sstable.*; import org.apache.cassandra.io.sstable.Descriptor; import org.apache.cassandra.io.util.FileUtils; +import org.apache.cassandra.metrics.CassandraMetricRegistry; import org.apache.cassandra.metrics.ColumnFamilyMetrics; import org.apache.cassandra.service.CacheService; import org.apache.cassandra.service.StorageService; @@ -303,7 +305,6 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean { case PERCENTILE: // get percentile in nanos - assert metric.readLatency.latency.durationUnit() == TimeUnit.MICROSECONDS; sampleLatency = (long) (metric.readLatency.latency.getSnapshot().getValue(retryPolicy.value) * 1000d); break; case CUSTOM: @@ -359,17 +360,17 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean public long getMinRowSize() { - return metric.minRowSize.value(); + return metric.minRowSize.getValue(); } public long getMaxRowSize() { - return metric.maxRowSize.value(); + return metric.maxRowSize.getValue(); } public long getMeanRowSize() { - return metric.meanRowSize.value(); + return metric.meanRowSize.getValue(); } public int getMeanColumns() @@ -737,8 +738,8 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean } } - if (metric.memtableSwitchCount.count() == Long.MAX_VALUE) - metric.memtableSwitchCount.clear(); + if (metric.memtableSwitchCount.getCount() == Long.MAX_VALUE) + metric.resetMemTableSwitchCount(); metric.memtableSwitchCount.inc(); // when all the memtables have been written, including for indexes, mark the flush in the commitlog header. @@ -837,7 +838,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean while (true) { long last = liveRatioComputedAt.get(); - long operations = metric.writeLatency.latency.count(); + long operations = metric.writeLatency.latency.getCount(); if (operations < 2 * last) break; if (liveRatioComputedAt.compareAndSet(last, operations)) @@ -1074,12 +1075,12 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean public long getMemtableColumnsCount() { - return metric.memtableColumnsCount.value(); + return metric.memtableColumnsCount.getValue(); } public long getMemtableDataSize() { - return metric.memtableDataSize.value(); + return metric.memtableDataSize.getValue(); } public long getTotalMemtableLiveSize() @@ -1089,7 +1090,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean public int getMemtableSwitchCount() { - return (int) metric.memtableSwitchCount.count(); + return (int) metric.memtableSwitchCount.getCount(); } private Memtable getMemtableThreadSafe() @@ -1127,7 +1128,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean public long getReadCount() { - return metric.readLatency.latency.count(); + return metric.readLatency.latency.getCount(); } public double getRecentReadLatencyMicros() @@ -1147,22 +1148,22 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean public long getTotalReadLatencyMicros() { - return metric.readLatency.totalLatency.count(); + return metric.readLatency.totalLatency.getCount(); } public int getPendingTasks() { - return metric.pendingTasks.value(); + return metric.pendingTasks.getValue(); } public long getWriteCount() { - return metric.writeLatency.latency.count(); + return metric.writeLatency.latency.getCount(); } public long getTotalWriteLatencyMicros() { - return metric.writeLatency.totalLatency.count(); + return metric.writeLatency.totalLatency.getCount(); } public double getRecentWriteLatencyMicros() @@ -1766,17 +1767,17 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean public long getTotalDiskSpaceUsed() { - return metric.totalDiskSpaceUsed.count(); + return metric.totalDiskSpaceUsed.getCount(); } public long getLiveDiskSpaceUsed() { - return metric.liveDiskSpaceUsed.count(); + return metric.liveDiskSpaceUsed.getCount(); } public int getLiveSSTableCount() { - return metric.liveSSTableCount.value(); + return metric.liveSSTableCount.getValue(); } /** @@ -2028,27 +2029,27 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean public long getBloomFilterFalsePositives() { - return metric.bloomFilterFalsePositives.value(); + return metric.bloomFilterFalsePositives.getValue(); } public long getRecentBloomFilterFalsePositives() { - return metric.recentBloomFilterFalsePositives.value(); + return metric.recentBloomFilterFalsePositives.getValue(); } public double getBloomFilterFalseRatio() { - return metric.bloomFilterFalseRatio.value(); + return metric.bloomFilterFalseRatio.getValue(); } public double getRecentBloomFilterFalseRatio() { - return metric.recentBloomFilterFalseRatio.value(); + return metric.recentBloomFilterFalseRatio.getValue(); } public long getBloomFilterDiskSpaceUsed() { - return metric.bloomFilterDiskSpaceUsed.value(); + return metric.bloomFilterDiskSpaceUsed.getValue(); } @Override @@ -2159,17 +2160,17 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean public long[] getEstimatedRowSizeHistogram() { - return metric.estimatedRowSizeHistogram.value(); + return metric.estimatedRowSizeHistogram.getValue(); } public long[] getEstimatedColumnCountHistogram() { - return metric.estimatedColumnCountHistogram.value(); + return metric.estimatedColumnCountHistogram.getValue(); } public double getCompressionRatio() { - return metric.compressionRatio.value(); + return metric.compressionRatio.getValue(); } /** true if this CFS contains secondary index data */ diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLog.java b/src/java/org/apache/cassandra/db/commitlog/CommitLog.java index 78b43d30a5..33f23a557b 100644 --- a/src/java/org/apache/cassandra/db/commitlog/CommitLog.java +++ b/src/java/org/apache/cassandra/db/commitlog/CommitLog.java @@ -265,7 +265,7 @@ public class CommitLog implements CommitLogMBean */ public long getCompletedTasks() { - return metrics.completedTasks.value(); + return metrics.completedTasks.getValue(); } /** @@ -273,7 +273,7 @@ public class CommitLog implements CommitLogMBean */ public long getPendingTasks() { - return metrics.pendingTasks.value(); + return metrics.pendingTasks.getValue(); } /** @@ -281,7 +281,7 @@ public class CommitLog implements CommitLogMBean */ public long getTotalCommitlogSize() { - return metrics.totalCommitLogSize.value(); + return metrics.totalCommitLogSize.getValue(); } /** diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java index 35354c8975..4e0b4929be 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java @@ -874,22 +874,22 @@ public class CompactionManager implements CompactionManagerMBean public long getTotalBytesCompacted() { - return metrics.bytesCompacted.count(); + return metrics.bytesCompacted.getCount(); } public long getTotalCompactionsCompleted() { - return metrics.totalCompactionsCompleted.count(); + return metrics.totalCompactionsCompleted.getCount(); } public int getPendingTasks() { - return metrics.pendingTasks.value(); + return metrics.pendingTasks.getValue(); } public long getCompletedTasks() { - return metrics.completedTasks.value(); + return metrics.completedTasks.getValue(); } private static class CleanupInfo extends CompactionInfo.Holder diff --git a/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java b/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java index ff8c70a82d..6b04b92063 100644 --- a/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java +++ b/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java @@ -27,13 +27,13 @@ import java.util.concurrent.TimeUnit; import javax.management.MBeanServer; import javax.management.ObjectName; +import com.codahale.metrics.ExponentiallyDecayingReservoir; + import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.FBUtilities; -import com.yammer.metrics.stats.ExponentiallyDecayingSample; - /** * A dynamic snitch that sorts endpoints by latency with an adapted phi failure detector */ @@ -50,7 +50,7 @@ public class DynamicEndpointSnitch extends AbstractEndpointSnitch implements ILa private final ConcurrentHashMap scores = new ConcurrentHashMap(); private final ConcurrentHashMap lastReceived = new ConcurrentHashMap(); - private final ConcurrentHashMap samples = new ConcurrentHashMap(); + private final ConcurrentHashMap samples = new ConcurrentHashMap(); public final IEndpointSnitch subsnitch; @@ -203,10 +203,10 @@ public class DynamicEndpointSnitch extends AbstractEndpointSnitch implements ILa { lastReceived.put(host, System.nanoTime()); - ExponentiallyDecayingSample sample = samples.get(host); + ExponentiallyDecayingReservoir sample = samples.get(host); if (sample == null) { - ExponentiallyDecayingSample maybeNewSample = new ExponentiallyDecayingSample(WINDOW_SIZE, ALPHA); + ExponentiallyDecayingReservoir maybeNewSample = new ExponentiallyDecayingReservoir(WINDOW_SIZE, ALPHA); sample = samples.putIfAbsent(host, maybeNewSample); if (sample == null) sample = maybeNewSample; @@ -232,7 +232,7 @@ public class DynamicEndpointSnitch extends AbstractEndpointSnitch implements ILa HashMap penalties = new HashMap(samples.size()); // We're going to weight the latency and time since last reply for each host against the worst one we see, to arrive at sort of a 'badness percentage' for both of them. // first, find the worst for each. - for (Map.Entry entry : samples.entrySet()) + for (Map.Entry entry : samples.entrySet()) { double mean = entry.getValue().getSnapshot().getMedian(); if (mean > maxLatency) @@ -246,7 +246,7 @@ public class DynamicEndpointSnitch extends AbstractEndpointSnitch implements ILa maxPenalty = timePenalty; } // now make another pass to do the weighting based on the maximums we found before - for (Map.Entry entry: samples.entrySet()) + for (Map.Entry entry: samples.entrySet()) { double score = entry.getValue().getSnapshot().getMedian() / maxLatency; if (penalties.containsKey(entry.getKey())) @@ -265,8 +265,7 @@ public class DynamicEndpointSnitch extends AbstractEndpointSnitch implements ILa private void reset() { - for (ExponentiallyDecayingSample sample : samples.values()) - sample.clear(); + samples.clear(); } public Map getScores() @@ -295,7 +294,7 @@ public class DynamicEndpointSnitch extends AbstractEndpointSnitch implements ILa { InetAddress host = InetAddress.getByName(hostname); ArrayList timings = new ArrayList(); - ExponentiallyDecayingSample sample = samples.get(host); + ExponentiallyDecayingReservoir sample = samples.get(host); if (sample != null) { for (double time: sample.getSnapshot().getValues()) diff --git a/src/java/org/apache/cassandra/metrics/CacheMetrics.java b/src/java/org/apache/cassandra/metrics/CacheMetrics.java index 31575113df..ba98ab3184 100644 --- a/src/java/org/apache/cassandra/metrics/CacheMetrics.java +++ b/src/java/org/apache/cassandra/metrics/CacheMetrics.java @@ -17,14 +17,12 @@ */ package org.apache.cassandra.metrics; -import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Gauge; -import com.yammer.metrics.core.Meter; -import com.yammer.metrics.core.MetricName; -import com.yammer.metrics.util.RatioGauge; +import com.codahale.metrics.Gauge; +import com.codahale.metrics.Meter; +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.RatioGauge; import org.apache.cassandra.cache.ICache; @@ -60,37 +58,43 @@ public class CacheMetrics */ public CacheMetrics(String type, final ICache cache) { - capacity = Metrics.newGauge(new MetricName(GROUP_NAME, TYPE_NAME, "Capacity", type), new Gauge() + capacity = CassandraMetricRegistry.register(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "Capacity", type), new Gauge() { - public Long value() + public Long getValue() { return cache.capacity(); } }); - hits = Metrics.newMeter(new MetricName(GROUP_NAME, TYPE_NAME, "Hits", type), "hits", TimeUnit.SECONDS); - requests = Metrics.newMeter(new MetricName(GROUP_NAME, TYPE_NAME, "Requests", type), "requests", TimeUnit.SECONDS); - hitRate = Metrics.newGauge(new MetricName(GROUP_NAME, TYPE_NAME, "HitRate", type), new RatioGauge() + hits = CassandraMetricRegistry.get().meter(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "Hits", type)); + + requests = CassandraMetricRegistry.get().meter(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "Requests", type)); + hitRate = CassandraMetricRegistry.register(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "HitRate", type), new RatioGauge() { protected double getNumerator() { - return hits.count(); + return hits.getCount(); } protected double getDenominator() { - return requests.count(); + return requests.getCount(); + } + + public Ratio getRatio() + { + return Ratio.of(getNumerator(), getDenominator()); } }); - size = Metrics.newGauge(new MetricName(GROUP_NAME, TYPE_NAME, "Size", type), new Gauge() + size = CassandraMetricRegistry.register(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "Size", type), new Gauge() { - public Long value() + public Long getValue() { return cache.weightedSize(); } }); - entries = Metrics.newGauge(new MetricName(GROUP_NAME, TYPE_NAME, "Entries", type), new Gauge() + entries = CassandraMetricRegistry.register(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "Entries", type), new Gauge() { - public Integer value() + public Integer getValue() { return cache.size(); } @@ -101,8 +105,8 @@ public class CacheMetrics @Deprecated public double getRecentHitRate() { - long r = requests.count(); - long h = hits.count(); + long r = requests.getCount(); + long h = hits.getCount(); try { return ((double)(h - lastHits.get())) / (r - lastRequests.get()); diff --git a/src/java/org/apache/cassandra/metrics/CassandraMetricRegistry.java b/src/java/org/apache/cassandra/metrics/CassandraMetricRegistry.java new file mode 100644 index 0000000000..2f2a855ef9 --- /dev/null +++ b/src/java/org/apache/cassandra/metrics/CassandraMetricRegistry.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.cassandra.metrics; + +import com.codahale.metrics.Metric; +import com.codahale.metrics.MetricRegistry; + +public class CassandraMetricRegistry +{ + private static MetricRegistry defaultRegistry = new MetricRegistry(); + + private CassandraMetricRegistry() + { + } + + public static MetricRegistry get() + { + return defaultRegistry; + } + + public static T register(String name, T metric) + { + defaultRegistry.remove(name); + return defaultRegistry.register(name, metric); + } + + public static void unregister(String name) + { + defaultRegistry.remove(name); + } +} diff --git a/src/java/org/apache/cassandra/metrics/ClientRequestMetrics.java b/src/java/org/apache/cassandra/metrics/ClientRequestMetrics.java index d6ff01bfea..89a5c73ceb 100644 --- a/src/java/org/apache/cassandra/metrics/ClientRequestMetrics.java +++ b/src/java/org/apache/cassandra/metrics/ClientRequestMetrics.java @@ -20,18 +20,16 @@ */ package org.apache.cassandra.metrics; -import java.util.concurrent.TimeUnit; - -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Counter; -import com.yammer.metrics.core.Meter; +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.Counter; +import com.codahale.metrics.Meter; public class ClientRequestMetrics extends LatencyMetrics { - @Deprecated public static final Counter readTimeouts = Metrics.newCounter(ClientRequestMetrics.class, "ReadTimeouts"); - @Deprecated public static final Counter writeTimeouts = Metrics.newCounter(ClientRequestMetrics.class, "WriteTimeouts"); - @Deprecated public static final Counter readUnavailables = Metrics.newCounter(ClientRequestMetrics.class, "ReadUnavailables"); - @Deprecated public static final Counter writeUnavailables = Metrics.newCounter(ClientRequestMetrics.class, "WriteUnavailables"); + @Deprecated public static final Counter readTimeouts = CassandraMetricRegistry.get().counter(MetricRegistry.name(ClientRequestMetrics.class, "ReadTimeouts")); + @Deprecated public static final Counter writeTimeouts = CassandraMetricRegistry.get().counter(MetricRegistry.name(ClientRequestMetrics.class, "WriteTimeouts")); + @Deprecated public static final Counter readUnavailables = CassandraMetricRegistry.get().counter(MetricRegistry.name(ClientRequestMetrics.class, "ReadUnavailables")); + @Deprecated public static final Counter writeUnavailables = CassandraMetricRegistry.get().counter(MetricRegistry.name(ClientRequestMetrics.class, "WriteUnavailables")); public final Meter timeouts; public final Meter unavailables; @@ -40,14 +38,14 @@ public class ClientRequestMetrics extends LatencyMetrics { super("org.apache.cassandra.metrics", "ClientRequest", scope); - timeouts = Metrics.newMeter(factory.createMetricName("Timeouts"), "timeouts", TimeUnit.SECONDS); - unavailables = Metrics.newMeter(factory.createMetricName("Unavailables"), "unavailables", TimeUnit.SECONDS); + timeouts = CassandraMetricRegistry.get().meter(factory.createMetricName("Timeouts")); + unavailables = CassandraMetricRegistry.get().meter(factory.createMetricName("Unavailables")); } public void release() { super.release(); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("Timeouts")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("Unavailables")); + CassandraMetricRegistry.unregister(factory.createMetricName("Timeouts")); + CassandraMetricRegistry.unregister(factory.createMetricName("Unavailables")); } } diff --git a/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java b/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java index 96ab5386cd..0b1e5dedb8 100644 --- a/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java +++ b/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java @@ -17,19 +17,21 @@ */ package org.apache.cassandra.metrics; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Counter; -import com.yammer.metrics.core.Gauge; -import com.yammer.metrics.core.Histogram; -import com.yammer.metrics.core.MetricName; -import com.yammer.metrics.util.RatioGauge; + +import com.codahale.metrics.Counter; +import com.codahale.metrics.Gauge; +import com.codahale.metrics.Histogram; +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.RatioGauge; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.Keyspace; +import org.apache.cassandra.metrics.CassandraMetricRegistry; import org.apache.cassandra.io.sstable.SSTableMetadata; import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.utils.EstimatedHistogram; + /** * Metrics for {@link ColumnFamilyStore}. */ @@ -40,7 +42,7 @@ public class ColumnFamilyMetrics /** Total number of columns present in the memtable. */ public final Gauge memtableColumnsCount; /** Number of times flush has resulted in the memtable being switched out. */ - public final Counter memtableSwitchCount; + public Counter memtableSwitchCount; /** Current compression ratio for all SSTables */ public final Gauge compressionRatio; /** Histogram of estimated row size (in bytes). */ @@ -97,24 +99,24 @@ public class ColumnFamilyMetrics { factory = new ColumnFamilyMetricNameFactory(cfs); - memtableColumnsCount = Metrics.newGauge(factory.createMetricName("MemtableColumnsCount"), new Gauge() + memtableColumnsCount = CassandraMetricRegistry.register(factory.createMetricName("MemtableColumnsCount"), new Gauge() { - public Long value() + public Long getValue() { return cfs.getDataTracker().getMemtable().getOperations(); } }); - memtableDataSize = Metrics.newGauge(factory.createMetricName("MemtableDataSize"), new Gauge() + memtableDataSize = CassandraMetricRegistry.register(factory.createMetricName("MemtableDataSize"), new Gauge() { - public Long value() + public Long getValue() { return cfs.getDataTracker().getMemtable().getLiveSize(); } }); - memtableSwitchCount = Metrics.newCounter(factory.createMetricName("MemtableSwitchCount")); - estimatedRowSizeHistogram = Metrics.newGauge(factory.createMetricName("EstimatedRowSizeHistogram"), new Gauge() + memtableSwitchCount = CassandraMetricRegistry.get().counter(factory.createMetricName("MemtableSwitchCount")); + estimatedRowSizeHistogram = CassandraMetricRegistry.register(factory.createMetricName("EstimatedRowSizeHistogram"), new Gauge() { - public long[] value() + public long[] getValue() { long[] histogram = new long[90]; for (SSTableReader sstable : cfs.getSSTables()) @@ -126,9 +128,9 @@ public class ColumnFamilyMetrics return histogram; } }); - estimatedColumnCountHistogram = Metrics.newGauge(factory.createMetricName("EstimatedColumnCountHistogram"), new Gauge() + estimatedColumnCountHistogram = CassandraMetricRegistry.register(factory.createMetricName("EstimatedColumnCountHistogram"), new Gauge() { - public long[] value() + public long[] getValue() { long[] histogram = new long[90]; for (SSTableReader sstable : cfs.getSSTables()) @@ -140,10 +142,10 @@ public class ColumnFamilyMetrics return histogram; } }); - sstablesPerReadHistogram = Metrics.newHistogram(factory.createMetricName("SSTablesPerReadHistogram")); - compressionRatio = Metrics.newGauge(factory.createMetricName("CompressionRatio"), new Gauge() + sstablesPerReadHistogram = CassandraMetricRegistry.get().histogram(factory.createMetricName("SSTablesPerReadHistogram")); + compressionRatio = CassandraMetricRegistry.register(factory.createMetricName("CompressionRatio"), new Gauge() { - public Double value() + public Double getValue() { double sum = 0; int total = 0; @@ -160,26 +162,26 @@ public class ColumnFamilyMetrics }); readLatency = new LatencyMetrics(factory, "Read"); writeLatency = new LatencyMetrics(factory, "Write"); - pendingTasks = Metrics.newGauge(factory.createMetricName("PendingTasks"), new Gauge() + pendingTasks = CassandraMetricRegistry.register(factory.createMetricName("PendingTasks"), new Gauge() { - public Integer value() + public Integer getValue() { // TODO this actually isn't a good measure of pending tasks return Keyspace.switchLock.getQueueLength(); } }); - liveSSTableCount = Metrics.newGauge(factory.createMetricName("LiveSSTableCount"), new Gauge() + liveSSTableCount = CassandraMetricRegistry.register(factory.createMetricName("LiveSSTableCount"), new Gauge() { - public Integer value() + public Integer getValue() { return cfs.getDataTracker().getSSTables().size(); } }); - liveDiskSpaceUsed = Metrics.newCounter(factory.createMetricName("LiveDiskSpaceUsed")); - totalDiskSpaceUsed = Metrics.newCounter(factory.createMetricName("TotalDiskSpaceUsed")); - minRowSize = Metrics.newGauge(factory.createMetricName("MinRowSize"), new Gauge() + liveDiskSpaceUsed = CassandraMetricRegistry.get().counter(factory.createMetricName("LiveDiskSpaceUsed")); + totalDiskSpaceUsed = CassandraMetricRegistry.get().counter(factory.createMetricName("TotalDiskSpaceUsed")); + minRowSize = CassandraMetricRegistry.register(factory.createMetricName("MinRowSize"), new Gauge() { - public Long value() + public Long getValue() { long min = 0; for (SSTableReader sstable : cfs.getSSTables()) @@ -190,9 +192,9 @@ public class ColumnFamilyMetrics return min; } }); - maxRowSize = Metrics.newGauge(factory.createMetricName("MaxRowSize"), new Gauge() + maxRowSize = CassandraMetricRegistry.register(factory.createMetricName("MaxRowSize"), new Gauge() { - public Long value() + public Long getValue() { long max = 0; for (SSTableReader sstable : cfs.getSSTables()) @@ -203,9 +205,9 @@ public class ColumnFamilyMetrics return max; } }); - meanRowSize = Metrics.newGauge(factory.createMetricName("MeanRowSize"), new Gauge() + meanRowSize = CassandraMetricRegistry.register(factory.createMetricName("MeanRowSize"), new Gauge() { - public Long value() + public Long getValue() { long sum = 0; long count = 0; @@ -217,9 +219,9 @@ public class ColumnFamilyMetrics return count > 0 ? sum / count : 0; } }); - bloomFilterFalsePositives = Metrics.newGauge(factory.createMetricName("BloomFilterFalsePositives"), new Gauge() + bloomFilterFalsePositives = CassandraMetricRegistry.register(factory.createMetricName("BloomFilterFalsePositives"), new Gauge() { - public Long value() + public Long getValue() { long count = 0L; for (SSTableReader sstable: cfs.getSSTables()) @@ -227,9 +229,9 @@ public class ColumnFamilyMetrics return count; } }); - recentBloomFilterFalsePositives = Metrics.newGauge(factory.createMetricName("RecentBloomFilterFalsePositives"), new Gauge() + recentBloomFilterFalsePositives = CassandraMetricRegistry.register(factory.createMetricName("RecentBloomFilterFalsePositives"), new Gauge() { - public Long value() + public Long getValue() { long count = 0L; for (SSTableReader sstable: cfs.getSSTables()) @@ -237,9 +239,9 @@ public class ColumnFamilyMetrics return count; } }); - bloomFilterFalseRatio = Metrics.newGauge(factory.createMetricName("BloomFilterFalseRatio"), new Gauge() + bloomFilterFalseRatio = CassandraMetricRegistry.register(factory.createMetricName("BloomFilterFalseRatio"), new Gauge() { - public Double value() + public Double getValue() { long falseCount = 0L; long trueCount = 0L; @@ -253,9 +255,9 @@ public class ColumnFamilyMetrics return (double) falseCount / (trueCount + falseCount); } }); - recentBloomFilterFalseRatio = Metrics.newGauge(factory.createMetricName("RecentBloomFilterFalseRatio"), new Gauge() + recentBloomFilterFalseRatio = CassandraMetricRegistry.register(factory.createMetricName("RecentBloomFilterFalseRatio"), new Gauge() { - public Double value() + public Double getValue() { long falseCount = 0L; long trueCount = 0L; @@ -269,9 +271,9 @@ public class ColumnFamilyMetrics return (double) falseCount / (trueCount + falseCount); } }); - bloomFilterDiskSpaceUsed = Metrics.newGauge(factory.createMetricName("BloomFilterDiskSpaceUsed"), new Gauge() + bloomFilterDiskSpaceUsed = CassandraMetricRegistry.register(factory.createMetricName("BloomFilterDiskSpaceUsed"), new Gauge() { - public Long value() + public Long getValue() { long total = 0; for (SSTableReader sst : cfs.getSSTables()) @@ -279,8 +281,9 @@ public class ColumnFamilyMetrics return total; } }); - speculativeRetry = Metrics.newCounter(factory.createMetricName("SpeculativeRetry")); - keyCacheHitRate = Metrics.newGauge(factory.createMetricName("KeyCacheHitRate"), new RatioGauge() + + speculativeRetry = CassandraMetricRegistry.get().counter(factory.createMetricName("SpeculativeRetry")); + keyCacheHitRate = CassandraMetricRegistry.register(factory.createMetricName("KeyCacheHitRate"), new RatioGauge() { protected double getNumerator() { @@ -297,8 +300,19 @@ public class ColumnFamilyMetrics requests += sstable.getKeyCacheRequest(); return Math.max(requests, 1); // to avoid NaN. } + + @Override + protected Ratio getRatio() + { + return Ratio.of(getNumerator(), getDenominator()); + } }); } + + public void resetMemTableSwitchCount() + { + memtableSwitchCount = CassandraMetricRegistry.get().counter(factory.createMetricName("MemtableSwitchCount")); + } public void updateSSTableIterated(int count) { @@ -314,25 +328,25 @@ public class ColumnFamilyMetrics { readLatency.release(); writeLatency.release(); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("MemtableColumnsCount")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("MemtableDataSize")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("MemtableSwitchCount")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("CompressionRatio")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("EstimatedRowSizeHistogram")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("EstimatedColumnCountHistogram")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("SSTablesPerReadHistogram")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("PendingTasks")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("LiveSSTableCount")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("LiveDiskSpaceUsed")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("TotalDiskSpaceUsed")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("MinRowSize")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("MaxRowSize")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("MeanRowSize")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("BloomFilterFalsePositives")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("RecentBloomFilterFalsePositives")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("BloomFilterFalseRatio")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("RecentBloomFilterFalseRatio")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("BloomFilterDiskSpaceUsed")); + CassandraMetricRegistry.unregister(factory.createMetricName("MemtableColumnsCount")); + CassandraMetricRegistry.unregister(factory.createMetricName("MemtableDataSize")); + CassandraMetricRegistry.unregister(factory.createMetricName("MemtableSwitchCount")); + CassandraMetricRegistry.unregister(factory.createMetricName("CompressionRatio")); + CassandraMetricRegistry.unregister(factory.createMetricName("EstimatedRowSizeHistogram")); + CassandraMetricRegistry.unregister(factory.createMetricName("EstimatedColumnCountHistogram")); + CassandraMetricRegistry.unregister(factory.createMetricName("SSTablesPerReadHistogram")); + CassandraMetricRegistry.unregister(factory.createMetricName("PendingTasks")); + CassandraMetricRegistry.unregister(factory.createMetricName("LiveSSTableCount")); + CassandraMetricRegistry.unregister(factory.createMetricName("LiveDiskSpaceUsed")); + CassandraMetricRegistry.unregister(factory.createMetricName("TotalDiskSpaceUsed")); + CassandraMetricRegistry.unregister(factory.createMetricName("MinRowSize")); + CassandraMetricRegistry.unregister(factory.createMetricName("MaxRowSize")); + CassandraMetricRegistry.unregister(factory.createMetricName("MeanRowSize")); + CassandraMetricRegistry.unregister(factory.createMetricName("BloomFilterFalsePositives")); + CassandraMetricRegistry.unregister(factory.createMetricName("RecentBloomFilterFalsePositives")); + CassandraMetricRegistry.unregister(factory.createMetricName("BloomFilterFalseRatio")); + CassandraMetricRegistry.unregister(factory.createMetricName("RecentBloomFilterFalseRatio")); + CassandraMetricRegistry.unregister(factory.createMetricName("BloomFilterDiskSpaceUsed")); } class ColumnFamilyMetricNameFactory implements MetricNameFactory @@ -348,7 +362,7 @@ public class ColumnFamilyMetrics isIndex = cfs.isIndex(); } - public MetricName createMetricName(String metricName) + public String createMetricName(String metricName) { String groupName = ColumnFamilyMetrics.class.getPackage().getName(); String type = isIndex ? "IndexColumnFamily" : "ColumnFamily"; @@ -360,7 +374,7 @@ public class ColumnFamilyMetrics mbeanName.append(",scope=").append(columnFamilyName); mbeanName.append(",name=").append(metricName); - return new MetricName(groupName, type, metricName, keyspaceName + "." + columnFamilyName, mbeanName.toString()); + return MetricRegistry.name(groupName, type, metricName, keyspaceName + "." + columnFamilyName, mbeanName.toString()); } } } diff --git a/src/java/org/apache/cassandra/metrics/CommitLogMetrics.java b/src/java/org/apache/cassandra/metrics/CommitLogMetrics.java index 598d2955e3..4b87038f2d 100644 --- a/src/java/org/apache/cassandra/metrics/CommitLogMetrics.java +++ b/src/java/org/apache/cassandra/metrics/CommitLogMetrics.java @@ -17,9 +17,8 @@ */ package org.apache.cassandra.metrics; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Gauge; -import com.yammer.metrics.core.MetricName; +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.Gauge; import org.apache.cassandra.db.commitlog.CommitLogAllocator; import org.apache.cassandra.db.commitlog.ICommitLogExecutorService; @@ -41,23 +40,23 @@ public class CommitLogMetrics public CommitLogMetrics(final ICommitLogExecutorService executor, final CommitLogAllocator allocator) { - completedTasks = Metrics.newGauge(new MetricName(GROUP_NAME, TYPE_NAME, "CompletedTasks"), new Gauge() + completedTasks = CassandraMetricRegistry.register(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "CompletedTasks"), new Gauge() { - public Long value() + public Long getValue() { return executor.getCompletedTasks(); } }); - pendingTasks = Metrics.newGauge(new MetricName(GROUP_NAME, TYPE_NAME, "PendingTasks"), new Gauge() + pendingTasks = CassandraMetricRegistry.register(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "PendingTasks"), new Gauge() { - public Long value() + public Long getValue() { return executor.getPendingTasks(); } }); - totalCommitLogSize = Metrics.newGauge(new MetricName(GROUP_NAME, TYPE_NAME, "TotalCommitLogSize"), new Gauge() + totalCommitLogSize = CassandraMetricRegistry.register(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "TotalCommitLogSize"), new Gauge() { - public Long value() + public Long getValue() { return allocator.bytesUsed(); } diff --git a/src/java/org/apache/cassandra/metrics/CompactionMetrics.java b/src/java/org/apache/cassandra/metrics/CompactionMetrics.java index dd3803fca3..267d2922f8 100644 --- a/src/java/org/apache/cassandra/metrics/CompactionMetrics.java +++ b/src/java/org/apache/cassandra/metrics/CompactionMetrics.java @@ -19,13 +19,11 @@ package org.apache.cassandra.metrics; import java.util.*; import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Counter; -import com.yammer.metrics.core.Gauge; -import com.yammer.metrics.core.Meter; -import com.yammer.metrics.core.MetricName; +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.Counter; +import com.codahale.metrics.Gauge; +import com.codahale.metrics.Meter; import org.apache.cassandra.config.Schema; import org.apache.cassandra.db.ColumnFamilyStore; @@ -55,9 +53,9 @@ public class CompactionMetrics implements CompactionManager.CompactionExecutorSt public CompactionMetrics(final ThreadPoolExecutor... collectors) { - pendingTasks = Metrics.newGauge(new MetricName(GROUP_NAME, TYPE_NAME, "PendingTasks"), new Gauge() + pendingTasks = CassandraMetricRegistry.register(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "PendingTasks"), new Gauge() { - public Integer value() + public Integer getValue() { int n = 0; for (String keyspaceName : Schema.instance.getKeyspaces()) @@ -70,9 +68,9 @@ public class CompactionMetrics implements CompactionManager.CompactionExecutorSt return n; } }); - completedTasks = Metrics.newGauge(new MetricName(GROUP_NAME, TYPE_NAME, "CompletedTasks"), new Gauge() + completedTasks = CassandraMetricRegistry.register(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "CompletedTasks"), new Gauge() { - public Long value() + public Long getValue() { long completedTasks = 0; for (ThreadPoolExecutor collector : collectors) @@ -80,8 +78,8 @@ public class CompactionMetrics implements CompactionManager.CompactionExecutorSt return completedTasks; } }); - totalCompactionsCompleted = Metrics.newMeter(new MetricName(GROUP_NAME, TYPE_NAME, "TotalCompactionsCompleted"), "compaction completed", TimeUnit.SECONDS); - bytesCompacted = Metrics.newCounter(new MetricName(GROUP_NAME, TYPE_NAME, "BytesCompacted")); + totalCompactionsCompleted = CassandraMetricRegistry.get().meter(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "TotalCompactionsCompleted")); + bytesCompacted = CassandraMetricRegistry.get().counter(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "BytesCompacted")); } public void beginCompaction(CompactionInfo.Holder ci) diff --git a/src/java/org/apache/cassandra/metrics/ConnectionMetrics.java b/src/java/org/apache/cassandra/metrics/ConnectionMetrics.java index 5493505c95..24d3bbd42d 100644 --- a/src/java/org/apache/cassandra/metrics/ConnectionMetrics.java +++ b/src/java/org/apache/cassandra/metrics/ConnectionMetrics.java @@ -18,12 +18,10 @@ package org.apache.cassandra.metrics; import java.net.InetAddress; -import java.util.concurrent.TimeUnit; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Gauge; -import com.yammer.metrics.core.Meter; -import com.yammer.metrics.core.MetricName; +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.Gauge; +import com.codahale.metrics.Meter; import org.apache.cassandra.net.OutboundTcpConnectionPool; @@ -36,7 +34,7 @@ public class ConnectionMetrics public static final String TYPE_NAME = "Connection"; /** Total number of timeouts happened on this node */ - public static final Meter totalTimeouts = Metrics.newMeter(new MetricName(GROUP_NAME, TYPE_NAME, "TotalTimeouts"), "total timeouts", TimeUnit.SECONDS); + public static final Meter totalTimeouts = CassandraMetricRegistry.get().meter(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "TotalTimeouts")); private static long recentTimeouts; public final String address; @@ -66,58 +64,58 @@ public class ConnectionMetrics // ipv6 addresses will contain colons, which are invalid in a JMX ObjectName address = ip.getHostAddress().replaceAll(":", "."); - commandPendingTasks = Metrics.newGauge(new MetricName(GROUP_NAME, TYPE_NAME, "CommandPendingTasks", address), new Gauge() + commandPendingTasks = CassandraMetricRegistry.register(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "CommandPendingTasks", address), new Gauge() { - public Integer value() + public Integer getValue() { return connectionPool.cmdCon.getPendingMessages(); } }); - commandCompletedTasks = Metrics.newGauge(new MetricName(GROUP_NAME, TYPE_NAME, "CommandCompletedTasks", address), new Gauge() + commandCompletedTasks = CassandraMetricRegistry.register(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "CommandCompletedTasks", address), new Gauge() { - public Long value() + public Long getValue() { return connectionPool.cmdCon.getCompletedMesssages(); } }); - commandDroppedTasks = Metrics.newGauge(new MetricName(GROUP_NAME, TYPE_NAME, "CommandDroppedTasks", address), new Gauge() + commandDroppedTasks = CassandraMetricRegistry.register(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "CommandDroppedTasks", address), new Gauge() { - public Long value() + public Long getValue() { return connectionPool.cmdCon.getDroppedMessages(); } }); - responsePendingTasks = Metrics.newGauge(new MetricName(GROUP_NAME, TYPE_NAME, "ResponsePendingTasks", address), new Gauge() + responsePendingTasks = CassandraMetricRegistry.register(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "ResponsePendingTasks", address), new Gauge() { - public Integer value() + public Integer getValue() { return connectionPool.ackCon.getPendingMessages(); } }); - responseCompletedTasks = Metrics.newGauge(new MetricName(GROUP_NAME, TYPE_NAME, "ResponseCompletedTasks", address), new Gauge() + responseCompletedTasks = CassandraMetricRegistry.register(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "ResponseCompletedTasks", address), new Gauge() { - public Long value() + public Long getValue() { return connectionPool.ackCon.getCompletedMesssages(); } }); - timeouts = Metrics.newMeter(new MetricName(GROUP_NAME, TYPE_NAME, "Timeouts", address), "timeouts", TimeUnit.SECONDS); + timeouts = CassandraMetricRegistry.get().meter(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "Timeouts", address)); } public void release() { - Metrics.defaultRegistry().removeMetric(new MetricName(GROUP_NAME, TYPE_NAME, "CommandPendingTasks", address)); - Metrics.defaultRegistry().removeMetric(new MetricName(GROUP_NAME, TYPE_NAME, "CommandCompletedTasks", address)); - Metrics.defaultRegistry().removeMetric(new MetricName(GROUP_NAME, TYPE_NAME, "CommandDroppedTasks", address)); - Metrics.defaultRegistry().removeMetric(new MetricName(GROUP_NAME, TYPE_NAME, "ResponsePendingTasks", address)); - Metrics.defaultRegistry().removeMetric(new MetricName(GROUP_NAME, TYPE_NAME, "ResponseCompletedTasks", address)); - Metrics.defaultRegistry().removeMetric(new MetricName(GROUP_NAME, TYPE_NAME, "Timeouts", address)); + CassandraMetricRegistry.unregister(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "CommandPendingTasks", address)); + CassandraMetricRegistry.unregister(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "CommandCompletedTasks", address)); + CassandraMetricRegistry.unregister(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "CommandDroppedTasks", address)); + CassandraMetricRegistry.unregister(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "ResponsePendingTasks", address)); + CassandraMetricRegistry.unregister(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "ResponseCompletedTasks", address)); + CassandraMetricRegistry.unregister(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "Timeouts", address)); } @Deprecated public static long getRecentTotalTimeout() { - long total = totalTimeouts.count(); + long total = totalTimeouts.getCount(); long recent = total - recentTimeouts; recentTimeouts = total; return recent; @@ -126,7 +124,7 @@ public class ConnectionMetrics @Deprecated public long getRecentTimeout() { - long timeoutCount = timeouts.count(); + long timeoutCount = timeouts.getCount(); long recent = timeoutCount - recentTimeoutCount; recentTimeoutCount = timeoutCount; return recent; diff --git a/src/java/org/apache/cassandra/metrics/DroppedMessageMetrics.java b/src/java/org/apache/cassandra/metrics/DroppedMessageMetrics.java index e0b12bb489..9e77f24305 100644 --- a/src/java/org/apache/cassandra/metrics/DroppedMessageMetrics.java +++ b/src/java/org/apache/cassandra/metrics/DroppedMessageMetrics.java @@ -17,11 +17,8 @@ */ package org.apache.cassandra.metrics; -import java.util.concurrent.TimeUnit; - -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Meter; -import com.yammer.metrics.core.MetricName; +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.Meter; import org.apache.cassandra.net.MessagingService; @@ -40,13 +37,13 @@ public class DroppedMessageMetrics public DroppedMessageMetrics(MessagingService.Verb verb) { - dropped = Metrics.newMeter(new MetricName(GROUP_NAME, TYPE_NAME, "Dropped", verb.toString()), "dropped", TimeUnit.SECONDS); + dropped = CassandraMetricRegistry.get().meter(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "Dropped", verb.toString())); } @Deprecated public int getRecentlyDropped() { - long currentDropped = dropped.count(); + long currentDropped = dropped.getCount(); long recentlyDropped = currentDropped - lastDropped; lastDropped = currentDropped; return (int)recentlyDropped; diff --git a/src/java/org/apache/cassandra/metrics/HintedHandoffMetrics.java b/src/java/org/apache/cassandra/metrics/HintedHandoffMetrics.java index 0f3992fa23..a4cf004617 100644 --- a/src/java/org/apache/cassandra/metrics/HintedHandoffMetrics.java +++ b/src/java/org/apache/cassandra/metrics/HintedHandoffMetrics.java @@ -29,9 +29,8 @@ import org.slf4j.LoggerFactory; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Counter; -import com.yammer.metrics.core.MetricName; +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.Counter; /** * Metrics for {@link HintedHandOffManager}. @@ -57,7 +56,7 @@ public class HintedHandoffMetrics { public Counter load(InetAddress address) { - return Metrics.newCounter(new MetricName(GROUP_NAME, TYPE_NAME, "Hints_created-" + address.getHostAddress())); + return CassandraMetricRegistry.get().counter(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "Hints_created-" + address.getHostAddress())); } }); @@ -90,12 +89,12 @@ public class HintedHandoffMetrics public DifferencingCounter(InetAddress address) { - this.meter = Metrics.newCounter(new MetricName(GROUP_NAME, TYPE_NAME, "Hints_not_stored-" + address.getHostAddress())); + this.meter = CassandraMetricRegistry.get().counter(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "Hints_not_stored-" + address.getHostAddress())); } public long diffrence() { - long current = meter.count(); + long current = meter.getCount(); long diffrence = current - reported; this.reported = current; return diffrence; @@ -103,7 +102,7 @@ public class HintedHandoffMetrics public long count() { - return meter.count(); + return meter.getCount(); } public void mark() diff --git a/src/java/org/apache/cassandra/metrics/LatencyMetrics.java b/src/java/org/apache/cassandra/metrics/LatencyMetrics.java index d17761324d..76a1f26e24 100644 --- a/src/java/org/apache/cassandra/metrics/LatencyMetrics.java +++ b/src/java/org/apache/cassandra/metrics/LatencyMetrics.java @@ -19,10 +19,9 @@ package org.apache.cassandra.metrics; import java.util.concurrent.TimeUnit; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Counter; -import com.yammer.metrics.core.MetricName; -import com.yammer.metrics.core.Timer; +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.Counter; +import com.codahale.metrics.Timer; import org.apache.cassandra.utils.EstimatedHistogram; @@ -80,8 +79,8 @@ public class LatencyMetrics this.factory = factory; this.namePrefix = namePrefix; - latency = Metrics.newTimer(factory.createMetricName(namePrefix + "Latency"), TimeUnit.MICROSECONDS, TimeUnit.SECONDS); - totalLatency = Metrics.newCounter(factory.createMetricName(namePrefix + "TotalLatency")); + latency = CassandraMetricRegistry.get().timer(factory.createMetricName(namePrefix + "Latency")); + totalLatency = CassandraMetricRegistry.get().counter(factory.createMetricName(namePrefix + "TotalLatency")); } /** takes nanoseconds **/ @@ -101,15 +100,15 @@ public class LatencyMetrics public void release() { - Metrics.defaultRegistry().removeMetric(factory.createMetricName(namePrefix + "Latency")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName(namePrefix + "TotalLatency")); + CassandraMetricRegistry.unregister(factory.createMetricName(namePrefix + "Latency")); + CassandraMetricRegistry.unregister(factory.createMetricName(namePrefix + "TotalLatency")); } @Deprecated public double getRecentLatency() { - long ops = latency.count(); - long n = totalLatency.count(); + long ops = latency.getCount(); + long n = totalLatency.getCount(); try { return ((double) n - lastLatency) / (ops - lastOpCount); @@ -134,9 +133,9 @@ public class LatencyMetrics this.scope = scope; } - public MetricName createMetricName(String metricName) + public String createMetricName(String metricName) { - return new MetricName(group, type, metricName, scope); + return MetricRegistry.name(group, type, metricName, scope); } } } diff --git a/src/java/org/apache/cassandra/metrics/MetricNameFactory.java b/src/java/org/apache/cassandra/metrics/MetricNameFactory.java index 5c1a5c23db..d728e40d18 100644 --- a/src/java/org/apache/cassandra/metrics/MetricNameFactory.java +++ b/src/java/org/apache/cassandra/metrics/MetricNameFactory.java @@ -17,8 +17,6 @@ */ package org.apache.cassandra.metrics; -import com.yammer.metrics.core.MetricName; - public interface MetricNameFactory { /** @@ -27,5 +25,5 @@ public interface MetricNameFactory * @param metricName Name part of {@link MetricName}. * @return new MetricName with given metric name. */ - MetricName createMetricName(String metricName); + String createMetricName(String metricName); } diff --git a/src/java/org/apache/cassandra/metrics/ReadRepairMetrics.java b/src/java/org/apache/cassandra/metrics/ReadRepairMetrics.java index c67ed90288..605876c486 100644 --- a/src/java/org/apache/cassandra/metrics/ReadRepairMetrics.java +++ b/src/java/org/apache/cassandra/metrics/ReadRepairMetrics.java @@ -20,12 +20,8 @@ package org.apache.cassandra.metrics; * */ - -import java.util.concurrent.TimeUnit; - -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Meter; -import com.yammer.metrics.core.MetricName; +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.Meter; /** * Metrics related to Read Repair. @@ -35,9 +31,9 @@ public class ReadRepairMetrics { public static final String TYPE_NAME = "ReadRepair"; public static final Meter repairedBlocking = - Metrics.newMeter(new MetricName(GROUP_NAME, TYPE_NAME, "RepairedBlocking"), "RepairedBlocking", TimeUnit.SECONDS); + CassandraMetricRegistry.get().meter(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "RepairedBlocking")); public static final Meter repairedBackground = - Metrics.newMeter(new MetricName(GROUP_NAME, TYPE_NAME, "RepairedBackground"), "RepairedBackground", TimeUnit.SECONDS); + CassandraMetricRegistry.get().meter(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "RepairedBackground")); public static final Meter attempted = - Metrics.newMeter(new MetricName(GROUP_NAME, TYPE_NAME, "Attempted"), "Attempted", TimeUnit.SECONDS); + CassandraMetricRegistry.get().meter(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "Attempted")); } diff --git a/src/java/org/apache/cassandra/metrics/StorageMetrics.java b/src/java/org/apache/cassandra/metrics/StorageMetrics.java index 3cda71e61f..02e8e122b8 100644 --- a/src/java/org/apache/cassandra/metrics/StorageMetrics.java +++ b/src/java/org/apache/cassandra/metrics/StorageMetrics.java @@ -17,14 +17,13 @@ */ package org.apache.cassandra.metrics; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Counter; -import com.yammer.metrics.core.MetricName; +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.Counter; /** * Metrics related to Storage. */ public class StorageMetrics { - public static final Counter load = Metrics.newCounter(new MetricName("org.apache.cassandra.metrics", "Storage", "Load")); + public static final Counter load = CassandraMetricRegistry.get().counter(MetricRegistry.name("org.apache.cassandra.metrics", "Storage", "Load")); } diff --git a/src/java/org/apache/cassandra/metrics/StreamingMetrics.java b/src/java/org/apache/cassandra/metrics/StreamingMetrics.java index 96c79c9719..bca50d8598 100644 --- a/src/java/org/apache/cassandra/metrics/StreamingMetrics.java +++ b/src/java/org/apache/cassandra/metrics/StreamingMetrics.java @@ -20,9 +20,8 @@ package org.apache.cassandra.metrics; import java.net.InetAddress; import java.util.concurrent.ConcurrentMap; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.Counter; -import com.yammer.metrics.core.MetricName; +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.Counter; import org.cliffc.high_scale_lib.NonBlockingHashMap; /** @@ -35,9 +34,9 @@ public class StreamingMetrics private static final ConcurrentMap instances = new NonBlockingHashMap(); - public static final Counter activeStreamsOutbound = Metrics.newCounter(new MetricName(GROUP_NAME, TYPE_NAME, "ActiveOutboundStreams")); - public static final Counter totalIncomingBytes = Metrics.newCounter(new MetricName(GROUP_NAME, TYPE_NAME, "TotalIncomingBytes")); - public static final Counter totalOutgoingBytes = Metrics.newCounter(new MetricName(GROUP_NAME, TYPE_NAME, "TotalOutgoingBytes")); + public static final Counter activeStreamsOutbound = CassandraMetricRegistry.get().counter(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "ActiveOutboundStreams")); + public static final Counter totalIncomingBytes = CassandraMetricRegistry.get().counter(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "TotalIncomingBytes")); + public static final Counter totalOutgoingBytes = CassandraMetricRegistry.get().counter(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "TotalOutgoingBytes")); public final Counter incomingBytes; public final Counter outgoingBytes; @@ -54,7 +53,7 @@ public class StreamingMetrics public StreamingMetrics(final InetAddress peer) { - incomingBytes = Metrics.newCounter(new MetricName(GROUP_NAME, TYPE_NAME, "IncomingBytes", peer.getHostAddress().replaceAll(":", "."))); - outgoingBytes= Metrics.newCounter(new MetricName(GROUP_NAME, TYPE_NAME, "OutgoingBytes", peer.getHostAddress().replaceAll(":", "."))); + incomingBytes = CassandraMetricRegistry.get().counter(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "IncomingBytes", peer.getHostAddress().replaceAll(":", "."))); + outgoingBytes= CassandraMetricRegistry.get().counter(MetricRegistry.name(GROUP_NAME, TYPE_NAME, "OutgoingBytes", peer.getHostAddress().replaceAll(":", "."))); } } diff --git a/src/java/org/apache/cassandra/metrics/ThreadPoolMetrics.java b/src/java/org/apache/cassandra/metrics/ThreadPoolMetrics.java index af54cdb835..2a3776ed18 100644 --- a/src/java/org/apache/cassandra/metrics/ThreadPoolMetrics.java +++ b/src/java/org/apache/cassandra/metrics/ThreadPoolMetrics.java @@ -19,8 +19,8 @@ package org.apache.cassandra.metrics; import java.util.concurrent.ThreadPoolExecutor; -import com.yammer.metrics.Metrics; -import com.yammer.metrics.core.*; +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.*; /** * Metrics for {@link ThreadPoolExecutor}. @@ -54,25 +54,25 @@ public class ThreadPoolMetrics { this.factory = new ThreadPoolMetricNameFactory(path, poolName); - activeTasks = Metrics.newGauge(factory.createMetricName("ActiveTasks"), new Gauge() + activeTasks = CassandraMetricRegistry.register(factory.createMetricName("ActiveTasks"), new Gauge() { - public Integer value() + public Integer getValue() { return executor.getActiveCount(); } }); - totalBlocked = Metrics.newCounter(factory.createMetricName("TotalBlockedTasks")); - currentBlocked = Metrics.newCounter(factory.createMetricName("CurrentlyBlockedTasks")); - completedTasks = Metrics.newGauge(factory.createMetricName("CompletedTasks"), new Gauge() + totalBlocked = CassandraMetricRegistry.get().counter(factory.createMetricName("TotalBlockedTasks")); + currentBlocked = CassandraMetricRegistry.get().counter(factory.createMetricName("CurrentlyBlockedTasks")); + completedTasks = CassandraMetricRegistry.register(factory.createMetricName("CompletedTasks"), new Gauge() { - public Long value() + public Long getValue() { return executor.getCompletedTaskCount(); } }); - pendingTasks = Metrics.newGauge(factory.createMetricName("PendingTasks"), new Gauge() + pendingTasks = CassandraMetricRegistry.register(factory.createMetricName("PendingTasks"), new Gauge() { - public Long value() + public Long getValue() { return executor.getTaskCount() - executor.getCompletedTaskCount(); } @@ -81,11 +81,11 @@ public class ThreadPoolMetrics public void release() { - Metrics.defaultRegistry().removeMetric(factory.createMetricName("ActiveTasks")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("PendingTasks")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("CompletedTasks")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("TotalBlockedTasks")); - Metrics.defaultRegistry().removeMetric(factory.createMetricName("CurrentlyBlockedTasks")); + CassandraMetricRegistry.unregister(factory.createMetricName("ActiveTasks")); + CassandraMetricRegistry.unregister(factory.createMetricName("PendingTasks")); + CassandraMetricRegistry.unregister(factory.createMetricName("CompletedTasks")); + CassandraMetricRegistry.unregister(factory.createMetricName("TotalBlockedTasks")); + CassandraMetricRegistry.unregister(factory.createMetricName("CurrentlyBlockedTasks")); } class ThreadPoolMetricNameFactory implements MetricNameFactory @@ -99,7 +99,7 @@ public class ThreadPoolMetrics this.poolName = poolName; } - public MetricName createMetricName(String metricName) + public String createMetricName(String metricName) { String groupName = ThreadPoolMetrics.class.getPackage().getName(); String type = "ThreadPools"; @@ -110,7 +110,7 @@ public class ThreadPoolMetrics mbeanName.append(",scope=").append(poolName); mbeanName.append(",name=").append(metricName); - return new MetricName(groupName, type, metricName, path + "." + poolName, mbeanName.toString()); + return MetricRegistry.name(groupName, type, metricName, path + "." + poolName, mbeanName.toString()); } } } diff --git a/src/java/org/apache/cassandra/net/MessagingService.java b/src/java/org/apache/cassandra/net/MessagingService.java index 40b9f0ef3f..ac89e71e1e 100644 --- a/src/java/org/apache/cassandra/net/MessagingService.java +++ b/src/java/org/apache/cassandra/net/MessagingService.java @@ -782,7 +782,7 @@ public final class MessagingService implements MessagingServiceMBean boolean logTpstats = false; for (Map.Entry entry : droppedMessages.entrySet()) { - int dropped = (int) entry.getValue().dropped.count(); + int dropped = (int) entry.getValue().dropped.getCount(); Verb verb = entry.getKey(); int recent = dropped - lastDroppedInternal.get(verb); if (recent > 0) @@ -919,7 +919,7 @@ public final class MessagingService implements MessagingServiceMBean { Map map = new HashMap(); for (Map.Entry entry : droppedMessages.entrySet()) - map.put(entry.getKey().toString(), (int) entry.getValue().dropped.count()); + map.put(entry.getKey().toString(), (int) entry.getValue().dropped.getCount()); return map; } @@ -933,7 +933,7 @@ public final class MessagingService implements MessagingServiceMBean public long getTotalTimeouts() { - return ConnectionMetrics.totalTimeouts.count(); + return ConnectionMetrics.totalTimeouts.getCount(); } public long getRecentTotalTimouts() diff --git a/src/java/org/apache/cassandra/net/OutboundTcpConnectionPool.java b/src/java/org/apache/cassandra/net/OutboundTcpConnectionPool.java index 81168c6873..87312e45e0 100644 --- a/src/java/org/apache/cassandra/net/OutboundTcpConnectionPool.java +++ b/src/java/org/apache/cassandra/net/OutboundTcpConnectionPool.java @@ -101,7 +101,7 @@ public class OutboundTcpConnectionPool public long getTimeouts() { - return metrics.timeouts.count(); + return metrics.timeouts.getCount(); } public long getRecentTimeouts() diff --git a/src/java/org/apache/cassandra/scheduler/WeightedQueue.java b/src/java/org/apache/cassandra/scheduler/WeightedQueue.java index 2d2e0bd192..b3ea53d9bd 100644 --- a/src/java/org/apache/cassandra/scheduler/WeightedQueue.java +++ b/src/java/org/apache/cassandra/scheduler/WeightedQueue.java @@ -90,12 +90,12 @@ class WeightedQueue implements WeightedQueueMBean public long getOperations() { - return metric.latency.count(); + return metric.latency.getCount(); } public long getTotalLatencyMicros() { - return metric.totalLatency.count(); + return metric.totalLatency.getCount(); } public double getRecentLatencyMicros() diff --git a/src/java/org/apache/cassandra/service/CacheService.java b/src/java/org/apache/cassandra/service/CacheService.java index b787b75fa3..16afc5aaf2 100644 --- a/src/java/org/apache/cassandra/service/CacheService.java +++ b/src/java/org/apache/cassandra/service/CacheService.java @@ -151,22 +151,22 @@ public class CacheService implements CacheServiceMBean public long getKeyCacheHits() { - return keyCache.getMetrics().hits.count(); + return keyCache.getMetrics().hits.getCount(); } public long getRowCacheHits() { - return rowCache.getMetrics().hits.count(); + return rowCache.getMetrics().hits.getCount(); } public long getKeyCacheRequests() { - return keyCache.getMetrics().requests.count(); + return keyCache.getMetrics().requests.getCount(); } public long getRowCacheRequests() { - return rowCache.getMetrics().requests.count(); + return rowCache.getMetrics().requests.getCount(); } public double getKeyCacheRecentHitRate() @@ -219,7 +219,7 @@ public class CacheService implements CacheServiceMBean public long getRowCacheCapacityInBytes() { - return rowCache.getMetrics().capacity.value(); + return rowCache.getMetrics().capacity.getValue(); } public long getRowCacheCapacityInMB() @@ -237,7 +237,7 @@ public class CacheService implements CacheServiceMBean public long getKeyCacheCapacityInBytes() { - return keyCache.getMetrics().capacity.value(); + return keyCache.getMetrics().capacity.getValue(); } public long getKeyCacheCapacityInMB() @@ -255,7 +255,7 @@ public class CacheService implements CacheServiceMBean public long getRowCacheSize() { - return rowCache.getMetrics().size.value(); + return rowCache.getMetrics().size.getValue(); } public long getRowCacheEntries() @@ -265,7 +265,7 @@ public class CacheService implements CacheServiceMBean public long getKeyCacheSize() { - return keyCache.getMetrics().size.value(); + return keyCache.getMetrics().size.getValue(); } public long getKeyCacheEntries() diff --git a/src/java/org/apache/cassandra/service/StorageProxy.java b/src/java/org/apache/cassandra/service/StorageProxy.java index fb5cbe4f85..2056b497b2 100644 --- a/src/java/org/apache/cassandra/service/StorageProxy.java +++ b/src/java/org/apache/cassandra/service/StorageProxy.java @@ -1668,12 +1668,12 @@ public class StorageProxy implements StorageProxyMBean public long getReadOperations() { - return readMetrics.latency.count(); + return readMetrics.latency.getCount(); } public long getTotalReadLatencyMicros() { - return readMetrics.totalLatency.count(); + return readMetrics.totalLatency.getCount(); } public double getRecentReadLatencyMicros() @@ -1693,12 +1693,12 @@ public class StorageProxy implements StorageProxyMBean public long getRangeOperations() { - return rangeMetrics.latency.count(); + return rangeMetrics.latency.getCount(); } public long getTotalRangeLatencyMicros() { - return rangeMetrics.totalLatency.count(); + return rangeMetrics.totalLatency.getCount(); } public double getRecentRangeLatencyMicros() @@ -1718,12 +1718,12 @@ public class StorageProxy implements StorageProxyMBean public long getWriteOperations() { - return writeMetrics.latency.count(); + return writeMetrics.latency.getCount(); } public long getTotalWriteLatencyMicros() { - return writeMetrics.totalLatency.count(); + return writeMetrics.totalLatency.getCount(); } public double getRecentWriteLatencyMicros() @@ -1988,14 +1988,14 @@ public class StorageProxy implements StorageProxyMBean public long getReadRepairAttempted() { - return ReadRepairMetrics.attempted.count(); + return ReadRepairMetrics.attempted.getCount(); } public long getReadRepairRepairedBlocking() { - return ReadRepairMetrics.repairedBlocking.count(); + return ReadRepairMetrics.repairedBlocking.getCount(); } public long getReadRepairRepairedBackground() { - return ReadRepairMetrics.repairedBackground.count(); + return ReadRepairMetrics.repairedBackground.getCount(); } } diff --git a/test/unit/org/apache/cassandra/db/KeyspaceTest.java b/test/unit/org/apache/cassandra/db/KeyspaceTest.java index faee4e714f..9b5b6dd734 100644 --- a/test/unit/org/apache/cassandra/db/KeyspaceTest.java +++ b/test/unit/org/apache/cassandra/db/KeyspaceTest.java @@ -467,18 +467,18 @@ public class KeyspaceTest extends SchemaLoader rm.apply(); cfStore.forceBlockingFlush(); } - cfStore.metric.sstablesPerReadHistogram.clear(); + //cfStore.metric.sstablesPerReadHistogram.clear(); ColumnFamily cf = cfStore.getColumnFamily(key, ByteBufferUtil.bytes(""), ByteBufferUtil.bytes("col1499"), false, 1000, System.currentTimeMillis()); - assertEquals(cfStore.metric.sstablesPerReadHistogram.max(), 5, 0.1); + assertEquals(cfStore.metric.sstablesPerReadHistogram.getSnapshot().getMax(), 5, 0.1); int i = 0; for (Column c : cf.getSortedColumns()) { assertEquals(ByteBufferUtil.string(c.name), "col" + (1000 + i++)); } assertEquals(i, 500); - cfStore.metric.sstablesPerReadHistogram.clear(); + //cfStore.metric.sstablesPerReadHistogram.clear(); cf = cfStore.getColumnFamily(key, ByteBufferUtil.bytes("col1500"), ByteBufferUtil.bytes("col2000"), false, 1000, System.currentTimeMillis()); - assertEquals(cfStore.metric.sstablesPerReadHistogram.max(), 5, 0.1); + assertEquals(cfStore.metric.sstablesPerReadHistogram.getSnapshot().getMax(), 5, 0.1); for (Column c : cf.getSortedColumns()) { @@ -487,9 +487,9 @@ public class KeyspaceTest extends SchemaLoader assertEquals(i, 1000); // reverse - cfStore.metric.sstablesPerReadHistogram.clear(); + //cfStore.metric.sstablesPerReadHistogram.clear(); cf = cfStore.getColumnFamily(key, ByteBufferUtil.bytes("col2000"), ByteBufferUtil.bytes("col1500"), true, 1000, System.currentTimeMillis()); - assertEquals(cfStore.metric.sstablesPerReadHistogram.max(), 5, 0.1); + assertEquals(cfStore.metric.sstablesPerReadHistogram.getSnapshot().getMax(), 5, 0.1); i = 500; for (Column c : cf.getSortedColumns()) { @@ -536,13 +536,13 @@ public class KeyspaceTest extends SchemaLoader } ByteBuffer start = ct.builder().add(ByteBufferUtil.bytes("a5")).add(ByteBufferUtil.bytes(85)).build(); ByteBuffer finish = ct.builder().add(ByteBufferUtil.bytes("a5")).buildAsEndOfRange(); - cfs.metric.sstablesPerReadHistogram.clear(); + //cfs.metric.sstablesPerReadHistogram.clear(); ColumnFamily cf = cfs.getColumnFamily(key, start, finish, false, 1000, System.currentTimeMillis()); int colCount = 0; for (Column c : cf) colCount++; assertEquals(2, colCount); - assertEquals(2, cfs.metric.sstablesPerReadHistogram.max(), 0.1); + assertEquals(2, cfs.metric.sstablesPerReadHistogram.getSnapshot().getMax(), 0.1); } private void validateSliceLarge(ColumnFamilyStore cfStore) throws IOException diff --git a/tools/stress/src/org/apache/cassandra/stress/Session.java b/tools/stress/src/org/apache/cassandra/stress/Session.java index f19d61e4a9..d51ea206f3 100644 --- a/tools/stress/src/org/apache/cassandra/stress/Session.java +++ b/tools/stress/src/org/apache/cassandra/stress/Session.java @@ -17,30 +17,41 @@ */ package org.apache.cassandra.stress; -import java.io.*; +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintStream; +import java.io.Serializable; import java.net.InetAddress; import java.net.UnknownHostException; import java.nio.ByteBuffer; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; -import com.yammer.metrics.Metrics; +import com.codahale.metrics.MetricRegistry; + import org.apache.cassandra.cli.transport.FramedTransportFactory; import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.EncryptionOptions; import org.apache.cassandra.config.EncryptionOptions.ClientEncryptionOptions; +import org.apache.cassandra.db.ColumnFamilyType; +import org.apache.cassandra.db.marshal.*; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.SyntaxException; -import org.apache.cassandra.db.marshal.*; -import org.apache.commons.cli.*; - -import org.apache.cassandra.db.ColumnFamilyType; +import org.apache.cassandra.metrics.CassandraMetricRegistry; import org.apache.cassandra.stress.util.CassandraClient; -import org.apache.cassandra.transport.SimpleClient; import org.apache.cassandra.thrift.*; -import org.apache.commons.lang.StringUtils; - +import org.apache.cassandra.transport.SimpleClient; import org.apache.cassandra.utils.ByteBufferUtil; +import org.apache.commons.cli.*; +import org.apache.commons.lang.StringUtils; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransport; @@ -59,7 +70,7 @@ public class Session implements Serializable public final AtomicInteger operations = new AtomicInteger(); public final AtomicInteger keys = new AtomicInteger(); - public final com.yammer.metrics.core.Timer latency = Metrics.newTimer(Session.class, "latency"); + public final com.codahale.metrics.Timer latency = CassandraMetricRegistry.get().timer(MetricRegistry.name(Session.class, "latency")); private static final String SSL_TRUSTSTORE = "truststore"; private static final String SSL_TRUSTSTORE_PW = "truststore-password"; diff --git a/tools/stress/src/org/apache/cassandra/stress/StressAction.java b/tools/stress/src/org/apache/cassandra/stress/StressAction.java index ea84647a77..1ad49f3999 100644 --- a/tools/stress/src/org/apache/cassandra/stress/StressAction.java +++ b/tools/stress/src/org/apache/cassandra/stress/StressAction.java @@ -24,7 +24,7 @@ import java.util.concurrent.TimeUnit; import com.google.common.util.concurrent.Uninterruptibles; import com.google.common.util.concurrent.RateLimiter; -import com.yammer.metrics.stats.Snapshot; +import com.codahale.metrics.Snapshot; import org.apache.cassandra.stress.operations.*; import org.apache.cassandra.stress.util.CassandraClient; import org.apache.cassandra.stress.util.Operation; diff --git a/tools/stress/src/org/apache/cassandra/stress/StressStatistics.java b/tools/stress/src/org/apache/cassandra/stress/StressStatistics.java index 4afac5ada6..d448de729e 100644 --- a/tools/stress/src/org/apache/cassandra/stress/StressStatistics.java +++ b/tools/stress/src/org/apache/cassandra/stress/StressStatistics.java @@ -18,7 +18,7 @@ package org.apache.cassandra.stress; -import com.yammer.metrics.stats.Snapshot; +import com.codahale.metrics.Snapshot; import java.io.PrintStream; import org.apache.commons.lang.time.DurationFormatUtils; diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/CounterAdder.java b/tools/stress/src/org/apache/cassandra/stress/operations/CounterAdder.java index ab6ae9ded8..39c258661f 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/CounterAdder.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/CounterAdder.java @@ -17,7 +17,7 @@ */ package org.apache.cassandra.stress.operations; -import com.yammer.metrics.core.TimerContext; +import com.codahale.metrics.Timer.Context; import org.apache.cassandra.stress.Session; import org.apache.cassandra.stress.util.CassandraClient; import org.apache.cassandra.stress.util.Operation; @@ -71,7 +71,7 @@ public class CounterAdder extends Operation ? getSuperColumnsMutationMap(superColumns) : getColumnsMutationMap(columns)); - TimerContext context = session.latency.time(); + Context context = session.latency.time(); boolean success = false; String exceptionMessage = null; diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/CounterGetter.java b/tools/stress/src/org/apache/cassandra/stress/operations/CounterGetter.java index 56ef2434c8..2980df9228 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/CounterGetter.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/CounterGetter.java @@ -17,17 +17,22 @@ */ package org.apache.cassandra.stress.operations; -import com.yammer.metrics.core.TimerContext; -import org.apache.cassandra.stress.Session; -import org.apache.cassandra.stress.util.CassandraClient; -import org.apache.cassandra.stress.util.Operation; -import org.apache.cassandra.db.ColumnFamilyType; -import org.apache.cassandra.thrift.*; - import java.io.IOException; import java.nio.ByteBuffer; import java.util.List; +import com.codahale.metrics.Timer.Context; + +import org.apache.cassandra.db.ColumnFamilyType; +import org.apache.cassandra.stress.Session; +import org.apache.cassandra.stress.util.CassandraClient; +import org.apache.cassandra.stress.util.Operation; +import org.apache.cassandra.thrift.Cassandra; +import org.apache.cassandra.thrift.ColumnOrSuperColumn; +import org.apache.cassandra.thrift.ColumnParent; +import org.apache.cassandra.thrift.SlicePredicate; +import org.apache.cassandra.thrift.SliceRange; + public class CounterGetter extends Operation { public CounterGetter(Session client, int index) @@ -68,7 +73,7 @@ public class CounterGetter extends Operation String superColumn = 'S' + Integer.toString(j); ColumnParent parent = new ColumnParent("SuperCounter1").setSuper_column(superColumn.getBytes()); - TimerContext context = session.latency.time(); + Context context = session.latency.time(); boolean success = false; String exceptionMessage = null; @@ -113,7 +118,7 @@ public class CounterGetter extends Operation byte[] key = generateKey(); ByteBuffer keyBuffer = ByteBuffer.wrap(key); - TimerContext context = session.latency.time(); + Context context = session.latency.time(); boolean success = false; String exceptionMessage = null; diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/CqlCounterAdder.java b/tools/stress/src/org/apache/cassandra/stress/operations/CqlCounterAdder.java index 31e8371dd5..3569af5aee 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/CqlCounterAdder.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/CqlCounterAdder.java @@ -26,7 +26,7 @@ import java.nio.ByteBuffer; import java.util.Collections; import java.util.List; -import com.yammer.metrics.core.TimerContext; +import com.codahale.metrics.Timer.Context; import org.apache.cassandra.db.ColumnFamilyType; import org.apache.cassandra.stress.Session; import org.apache.cassandra.stress.util.CassandraClient; @@ -75,7 +75,7 @@ public class CqlCounterAdder extends CQLOperation String key = String.format("%0" + session.getTotalKeysLength() + "d", index); List queryParams = Collections.singletonList(getUnQuotedCqlBlob(key, session.cqlVersion.startsWith("3"))); - TimerContext context = session.latency.time(); + Context context = session.latency.time(); boolean success = false; String exceptionMessage = null; diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/CqlCounterGetter.java b/tools/stress/src/org/apache/cassandra/stress/operations/CqlCounterGetter.java index a4d037a97e..0a1dfdf944 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/CqlCounterGetter.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/CqlCounterGetter.java @@ -26,7 +26,7 @@ import java.nio.ByteBuffer; import java.util.Collections; import java.util.List; -import com.yammer.metrics.core.TimerContext; +import com.codahale.metrics.Timer.Context; import org.apache.cassandra.db.ColumnFamilyType; import org.apache.cassandra.stress.Session; import org.apache.cassandra.stress.util.CassandraClient; @@ -73,7 +73,7 @@ public class CqlCounterGetter extends CQLOperation byte[] key = generateKey(); List queryParams = Collections.singletonList(getUnQuotedCqlBlob(key, session.cqlVersion.startsWith("3"))); - TimerContext context = session.latency.time(); + Context context = session.latency.time(); boolean success = false; String exceptionMessage = null; diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/CqlIndexedRangeSlicer.java b/tools/stress/src/org/apache/cassandra/stress/operations/CqlIndexedRangeSlicer.java index bf416cc952..52fe73f08f 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/CqlIndexedRangeSlicer.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/CqlIndexedRangeSlicer.java @@ -26,7 +26,7 @@ import java.nio.ByteBuffer; import java.util.Collections; import java.util.List; -import com.yammer.metrics.core.TimerContext; +import com.codahale.metrics.Timer.Context; import org.apache.cassandra.cql3.ResultSet; import org.apache.cassandra.db.ColumnFamilyType; import org.apache.cassandra.stress.Session; @@ -86,7 +86,7 @@ public class CqlIndexedRangeSlicer extends CQLOperation while (received < expectedPerValue) { - TimerContext context = session.latency.time(); + Context context = session.latency.time(); boolean success = false; String exceptionMessage = null; diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/CqlInserter.java b/tools/stress/src/org/apache/cassandra/stress/operations/CqlInserter.java index 3572c36bf2..10d060ee3b 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/CqlInserter.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/CqlInserter.java @@ -26,7 +26,7 @@ import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; -import com.yammer.metrics.core.TimerContext; +import com.codahale.metrics.Timer.Context; import org.apache.cassandra.db.ColumnFamilyType; import org.apache.cassandra.stress.Session; import org.apache.cassandra.stress.util.CassandraClient; @@ -98,7 +98,7 @@ public class CqlInserter extends CQLOperation String key = String.format("%0" + session.getTotalKeysLength() + "d", index); queryParms.add(getUnQuotedCqlBlob(key, session.cqlVersion.startsWith("3"))); - TimerContext context = session.latency.time(); + Context context = session.latency.time(); boolean success = false; String exceptionMessage = null; diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/CqlRangeSlicer.java b/tools/stress/src/org/apache/cassandra/stress/operations/CqlRangeSlicer.java index c01767bc56..d1329bfeb2 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/CqlRangeSlicer.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/CqlRangeSlicer.java @@ -26,7 +26,7 @@ import java.nio.ByteBuffer; import java.util.Collections; import java.util.List; -import com.yammer.metrics.core.TimerContext; +import com.codahale.metrics.Timer.Context; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.db.ColumnFamilyType; @@ -67,7 +67,7 @@ public class CqlRangeSlicer extends CQLOperation String key = String.format("%0" + session.getTotalKeysLength() + "d", index); List queryParams = Collections.singletonList(getUnQuotedCqlBlob(key, session.cqlVersion.startsWith("3"))); - TimerContext context = session.latency.time(); + Context context = session.latency.time(); boolean success = false; String exceptionMessage = null; diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/CqlReader.java b/tools/stress/src/org/apache/cassandra/stress/operations/CqlReader.java index 70273c1d1b..c53535c2bf 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/CqlReader.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/CqlReader.java @@ -26,7 +26,7 @@ import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; -import com.yammer.metrics.core.TimerContext; +import com.codahale.metrics.Timer.Context; import org.apache.cassandra.db.ColumnFamilyType; import org.apache.cassandra.stress.Session; import org.apache.cassandra.stress.util.CassandraClient; @@ -88,7 +88,7 @@ public class CqlReader extends CQLOperation byte[] key = generateKey(); queryParams.add(getUnQuotedCqlBlob(key, session.cqlVersion.startsWith("3"))); - TimerContext context = session.latency.time(); + Context context = session.latency.time(); boolean success = false; String exceptionMessage = null; diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/IndexedRangeSlicer.java b/tools/stress/src/org/apache/cassandra/stress/operations/IndexedRangeSlicer.java index b7c72a27e7..44e915c2b4 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/IndexedRangeSlicer.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/IndexedRangeSlicer.java @@ -17,7 +17,7 @@ */ package org.apache.cassandra.stress.operations; -import com.yammer.metrics.core.TimerContext; +import com.codahale.metrics.Timer.Context; import org.apache.cassandra.stress.Session; import org.apache.cassandra.stress.util.CassandraClient; import org.apache.cassandra.stress.util.Operation; @@ -67,7 +67,7 @@ public class IndexedRangeSlicer extends Operation session.getKeysPerCall()); List results = null; - TimerContext context = session.latency.time(); + Context context = session.latency.time(); boolean success = false; String exceptionMessage = null; diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/Inserter.java b/tools/stress/src/org/apache/cassandra/stress/operations/Inserter.java index cbf6b984a3..35c74716b5 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/Inserter.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/Inserter.java @@ -17,7 +17,7 @@ */ package org.apache.cassandra.stress.operations; -import com.yammer.metrics.core.TimerContext; +import com.codahale.metrics.Timer.Context; import org.apache.cassandra.stress.Session; import org.apache.cassandra.stress.util.CassandraClient; import org.apache.cassandra.stress.util.Operation; @@ -74,7 +74,7 @@ public class Inserter extends Operation : getColumnsMutationMap(columns); Map>> record = Collections.singletonMap(ByteBufferUtil.bytes(rawKey), row); - TimerContext context = session.latency.time(); + Context context = session.latency.time(); boolean success = false; String exceptionMessage = null; diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/MultiGetter.java b/tools/stress/src/org/apache/cassandra/stress/operations/MultiGetter.java index 12a39fb3c9..b0657f0def 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/MultiGetter.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/MultiGetter.java @@ -17,7 +17,7 @@ */ package org.apache.cassandra.stress.operations; -import com.yammer.metrics.core.TimerContext; +import com.codahale.metrics.Timer.Context; import org.apache.cassandra.stress.Session; import org.apache.cassandra.stress.util.CassandraClient; import org.apache.cassandra.stress.util.Operation; @@ -56,7 +56,7 @@ public class MultiGetter extends Operation { ColumnParent parent = new ColumnParent("Super1").setSuper_column(ByteBufferUtil.bytes("S" + j)); - TimerContext context = session.latency.time(); + Context context = session.latency.time(); boolean success = false; String exceptionMessage = null; @@ -99,7 +99,7 @@ public class MultiGetter extends Operation List keys = generateKeys(offset, offset + session.getKeysPerCall()); - TimerContext context = session.latency.time(); + Context context = session.latency.time(); boolean success = false; String exceptionMessage = null; diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/RangeSlicer.java b/tools/stress/src/org/apache/cassandra/stress/operations/RangeSlicer.java index f9ba1154d6..d1b52b49f9 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/RangeSlicer.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/RangeSlicer.java @@ -17,7 +17,7 @@ */ package org.apache.cassandra.stress.operations; -import com.yammer.metrics.core.TimerContext; +import com.codahale.metrics.Timer.Context; import org.apache.cassandra.stress.Session; import org.apache.cassandra.stress.util.CassandraClient; import org.apache.cassandra.stress.util.Operation; @@ -62,7 +62,7 @@ public class RangeSlicer extends Operation String superColumnName = "S" + Integer.toString(i); ColumnParent parent = new ColumnParent("Super1").setSuper_column(ByteBufferUtil.bytes(superColumnName)); - TimerContext context = session.latency.time(); + Context context = session.latency.time(); boolean success = false; String exceptionMessage = null; @@ -105,7 +105,7 @@ public class RangeSlicer extends Operation List slices = new ArrayList(); KeyRange range = new KeyRange(count).setStart_key(start).setEnd_key(ByteBufferUtil.EMPTY_BYTE_BUFFER); - TimerContext context = session.latency.time(); + Context context = session.latency.time(); boolean success = false; String exceptionMessage = null; diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/Reader.java b/tools/stress/src/org/apache/cassandra/stress/operations/Reader.java index f75502a54b..e15241fb44 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/Reader.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/Reader.java @@ -17,7 +17,7 @@ */ package org.apache.cassandra.stress.operations; -import com.yammer.metrics.core.TimerContext; +import com.codahale.metrics.Timer.Context; import org.apache.cassandra.stress.Session; import org.apache.cassandra.stress.util.CassandraClient; import org.apache.cassandra.stress.util.Operation; @@ -67,7 +67,7 @@ public class Reader extends Operation String superColumn = 'S' + Integer.toString(j); ColumnParent parent = new ColumnParent("Super1").setSuper_column(superColumn.getBytes(UTF_8)); - TimerContext context = session.latency.time(); + Context context = session.latency.time(); boolean success = false; String exceptionMessage = null; @@ -112,7 +112,7 @@ public class Reader extends Operation byte[] key = generateKey(); ByteBuffer keyBuffer = ByteBuffer.wrap(key); - TimerContext context = session.latency.time(); + Context context = session.latency.time(); boolean success = false; String exceptionMessage = null;