YewE`uu7ABCkB2` zKQ~E_FRf}q{|L3qdz495y%$qW!`<=deRggB~7o` zq}FFL^)dE5kcp;L`$lG3+YC4p_4%uYn@3qutT03nwp$`|e~P*Gi~HZypdSJnd(%2c z^Z6&7O|l9ZD;9 N`0Vw|vz_?lg zAh+N&jA0&r;TxGDMg)%HyEj@!n%m KHVO>-}%C`;sAcFyJeSJdxUPa=Cd8ydbqI;^99%gX=-RgSQsi z>=?mf&RMRWWAP7p!v~4Mk2ejU)t7)IgCjLX%D!D$^#q#Bb=wFt`tlA%teL}Cbgbrb zxnp;!%4=gGjtWrHx>cMx6H;Jie9z3#g*GvA^4U3!8jXcre2`$JK+I~{GnvfG(d5%& zR6el$kSV 6y|$p##;KaiEO_Fzg*3wg zh2A-AF-?{uHqNbMwsepSl6A;hG<*Nf3?)vMw_(o!)lO`5a1tSD^CWXYwKDk-BMxb= zb*Xz@KWfH<|5Gh{E${#Qa|0y<@?X6F&>7cK^R{%^%Bg|GrxzG&}zi_`FTF5-lme zWqaPT7TA!SQ{LgJ#B7*1@9PhfPm#{?#6ESk3PujL3UYsJVl`ZA2e$?b{CJCVU^k?p zi=rx+v2QVcM|O=VhlxA4OQH7RhHit!<5e6(cEaI9oPwvtzf+?;cApq<2az>nIo6BB zHGGWMFj?rpd5eIFd_wl~Z2Q3%1MgnWXBG!-2PO1!!3 Mj1~ zF{GW4`9KF}T~>q)J2?x*7(yZtYZp;WB4`32hsBGfK>Df` +pTW8|fg zkuS2hWF*fxU729$o>8q42t&i1v5MYOAlEz4nwRdzSeZeOmM9dvGuNs%)3OjwAK 7j4<{RkrDtC7hu{^us?&4 z!GMIP->LpIRy}(z@oxurFzJ#o-&p^!9b%fOBG|kzQ$Xq3xzMe0ILP*T--6^x=YB*d zP+AB-@Z38O_O;f#R583sAaK5}dxvQ&lHv`6bP4T?*dBbPz%M>5s6OrmrMmClTw3HK zCpfwA0>~!d+mIceRDyv;w3N1onN|pXn3t6(uYLM^C hJz6SbbO6__p>1_82{Er z8XPSSF#RGiJzJJxa#?7Uf??4JXg_kUMKxQ!=B7Rr_`6?;%Kv4CPFu^jz|xbo)*i@j zKFsve(9W*bo&PpeqJxh~0}LtvxovCq3w7B2s;tLJo-KF{(0ahx6TlYn)*PBk*t}K7 zg?K@%$QsjiuWBMzo!)J-emu&v+OF;o+tFieAFjhSlhc?Fp++Td L_vjrbi?^ z2Cd(X<8wF@P+Lsrfb@s6t{H*mb83419LqDmxc2}CYU?{}7|p@wRvrSk;N@WP&!x0w zP50hFQD5j{J6zQ;o`ck1_UU=6*{Lfu;wAnz|MEvGb1zHH;nzX1FG~~bKe`GK)jDMGx zldCzirIVw(#&=VD3np&|`y;I_$3+%Euk=0<`HquIle=uS$D$VYz%-Ldq#d`1e#~mT zeOu{lKbF`&E80tB8#v{5h*_8LMOGSi>-KJis;?;t5%5p%&Fkep5pyW3W|r){)I6&c zI9B*2D=W~tc%|)+>JJEq$kQY>gmo$Ps`-&Wi_}&iEn|dYNF8SP7#s% <1gkM!Gg36r@LZo68<$-d-E9Yx31nrg{O0>gcp{p&z9mmS9N%8!+ z0Oaq&DDC15sfUPVSK?xnR_ZDY3vE*8q%QhsbaXogjwrC^jE+jM>Sq`iuYnoGy5qE= z`(prej4WyIlPcoaB3D^shE-BXL{Qt#&Cy-l5Yk5#qwY6ng5eG`Yh68l =ykL==D&qYh`Uu?n-$2A5g z!JtN?Pxc0}6!8Hb!)&gMFQp>wf=GLx{b5SMkcc8nbPsIf(54;28tnV&JIB7S7SvjT zm;wX-HW=b4_V1&0Ivcb0x;8zt 0&6B;ZL35#}HwsL=&d z`MHEl5^L_0$s|n$m{rC}la5r=-c0zqa1>}ufQf{ulS(0dsrA*r8x}8 a${|lNW)l_JR1p|=1wlKt#4yaa}4FXRWw5QDjt`5T2;ers> z1Cgl%Kv{YyAa@;n2nRh-qK^DO-K+u@=uU?oTmv+qh!5h{mHuCL5-38K6Z$_~9MFI+ z7I-&kMOO&i0)(w60^bGoKM@HE)+Pk`>7hVa=!0VPxFO>8LCzY)^eXb;5CE|MW%T?% zYoz~S^!y8GFmN!^f07@BtWQb!|3~}(>iac8iuyv};h =*P>tC-JJr(io3hJdx2ubPTzCSUB7$J{E^9; zJXu*u_9S~IpOX>r+IH|nPWVTH?4K6kU|>E;f>h+|VIi%OUwh$2N@0A()0!O^FgBWy zi+V;1E5hj8a=-X-Y$ru%12MZ+!ds@ Ke^9v(ZrWc79(aqPp*|d_e*MUiahL#6lv|2%4$&PnV9G`kRY7DhA7I{+g|8F{u)g z6CF7V(4`XH5NsYH+Sf2gooai%w28FeC%$P+_JAqNK|*1Hfq}t+MJnzKAAOjqdjA`p z1_&@P^nXvyoy?R$+u%e1k&9^gK588nloXa1S$ljR6{C!MPU$n0U=+WWU;^B)aGCO2 zikOLPziY1<8P!X{Q@VE83w4LGsCYQp-Y8u<_WYvzHI =NAD+(>5Bj>2x-2nd*2D=kZ#k@M4l%fJw0KIAmq+AzLA z`lcIUunjw!N@R+uFqc=WEx4+2g>dLC$^!b(jxMTZrx5J=be1Z8kG*Kw^fjMejE0-C z5DzCDZtReCQX5wY5W}n#KeJv@$#z=@RnU}JWH1s2eJw%--m7`>cUmIQnTKE0Lh{s8 z)+Q^?%6#$;p5hRw>g}$|PUyw1Zaq3#m>9V@c-?SIK`y_Qp}T&Q@$R;Rb_H~ lRj?^@k>P&W zJw`Hm p4uw2H0=8o%Gsa=Tz=&}FpBeIUay4gm zvv7B}akO${@^-Lq!5eejkbV^GeG4t@JXnv#TDNhowod~^=irTfrBV4B%ZeLZQp01k zlaPHh$ShI}8=!i2<%hjP0tC|Ef%vt!bu{v3PTAS`T`Y8Ko9~YOANR&{e49aKEl2Ce z8o=4K)l*&O`^#I;=gR?$ll}&TjvEB|xTRsqNwdSo^|6(eLWf7VL!Jh|7KE$XQn R- `ME1$r4oR_?F3Y z-c#(g`@P!T=x5UvXWkMMEJ0P%nq{YDGNAdUX0yBRiQ)RhPkkNZU&OC`$3H%|C8kkN z!t)XDLo`rVr@F$CSU^s)$!M=B7*)6*T@a}(6snw$+%dza(yJ%~@ab+JDm^FJqv~{x zYPQrya)^NoG?}i5zn0a;thPRiZ0|XHd#-ZM%)4^zt1Qz9K`tiQc&e7%YjIm>02>-8 zM?M9nkA$}Oej3=+kuTFrv?Z_p$DlPGSfgNm Ul`+hFFVGmGYzs=l*4ZxE!MAJEeT%!e%!Fl2gOdSKSaioiEy=9oTu%2 zT=%~&4=oY1ZRFN9dvsn!FB|-2%IS71RB+1P ? zW;?7u)rG?^EUZ6hRrJKxxHB7gHai%lCg#1NZ+JL(X v?)z$jQw zG r`dm{f>@$>|A;pw7A| zGgY-@gWDQep>DBFts8kd0VA_oTtu<3TIwQ=x^QRxZpHFrBC$~*VMy QDl5BIoWu&%g0cM&@|FL*1Vi*JdA}Lp&?XN 7Mgg@= za*t=P M(A&111FASZ%KIIb%Zb;#%P0BLbgybJmGgEdC{TBG znywAbP;N}#LW)de0n93$-ap3Tk>5<=jtYrS7L@Qr)KdxsL}?{ezB9-5Jy7a~vkr>| zI8ata!k>L1IWP%MfochIt22+fbsq8vI^Qcqa^CPB^gk|~H^q*D8-S}M$0)!vN`{JS zp`<%JAo^p5Ls{OKa6d@7Xf2Mt#3t&XmV-tTM{tUo>~j2W4Ht}1npHQS&jPx`Vj|Tg zGZcj*CSsm530jBA&@TA!jzAl3JO!g7@9DKpF2Dl`V-o{{&{pIjo@VmqVM;L>Hb#ZM zrXqMmMutL~rZt($5V6+wKWAp&D8pb_*WIG`O`?WL;c0@U+&-aR=0Yfo1PyN^T#9Bh ztvh6bho|r|u(Ur}j9A53ze`uJz^AEw8KS#wl>PIT=o;|?3X5=#kYT4& QaaXmL8b_tM_Ug0)0As-+d;Wq5K?GvqaGIv7%P1=0^}1DvrmmccRt zqR6T%IdCi@6gs=2h~RsHww$=E4CDUT!;LT?UGg dc-m${|dDJ0@VO)l>LifFdQx;`MT@?F6= zz-lui?c{;@=mu$+=}lNw e*wybO{9x z#}`m1u8Sw*s$=iho~~@%*IWj)%ng}4mumG^w;WgbYaLHt7;Zc%ewf+q?ci(ve9vD( zCUB`4>FYsR`E0Z~VNgzpj5p?iSn}rSe}+1c!egL;<#P!egQrSh;p{UG_s?)L@lrm~ z@j*mPK3nbM*2vR>Z42ZDpRrOB4uC^Q@Vhzz!2jFUL4~IH&Bb_SScqr2XkHp5U|#%H>{=WVIB zRhKUbS#7RGx4r3yD$|&*m=oQ)O6}X bZ2_ ze2{Eow9|xFEX>sFRxH+Z)X}uE^I5b1aoB3k)RG!enEkh~WpQ?6;_qJJd}6v^$DDp$ zox0|#6OowHXc_!Y8-)#ZvQDeg3b8=;b`s}vo!FMOTv~exfz*V<7|*pQQ{NhYa_J(r z2GHm@(5}VAUp{AdR9EP*hU-4oP5L&9(?j|ic@J;4%S8Sw9k`S5gIeWgB4|QbDX_DY zJM(T!dbD?rWjsk%jMy5K(ev0|xlmt*`8CshL^-o7A$HzZ{9BR7xg)C2`VO^4LlEWJ zzq=e?&@34fW@b01jgdCX&*aQ;ky|}A6)*|4ok8kCyP;o!tqV9^)m(df46uNex5a?; z8Jq1SdUE9(H@E66B 3e zTz7o?;_PMkpjANXl7;u!t8)9Iqx}}oyt`OcwX;+AxNfDE4s&5}N}I`5)y32X@Z3D` z;WO1s;>0Q2U5hDGn@Z47H74ovB?13U;-I5WhpMZv)LOHaL9WbWNxg)PFljOZVrF01 zX2Q}&={nW%+yUN_uIs7FQnF{?|Ci=9@YJ_3LUMmo)$GKflzUN8cYAPrh7!ox$#s%J zXCpPus?+)BuV7%I*ZRV8Y3{c-;7?Nk;_v3rwh$re_WLq_8V?P-TSvlSk&=_Ojiy!r zxlTC^zji*C|Fa?^#)C9-q%+3m{ju#igYn}xwa?*w#`+$7_QlDuK12Lt^UgQgR9Rf$ zuhR3=+LPDbPIV|IZfj#bB<$6uSjS9zoKAWxU zAk=dXhF@6&1di4UA8B$I+XPu{luyW=^A6p1?fKu-9mf=&hKO`DjFMJuEzgJo$$PJ+ zaobN+j>H6@^<^xejo*4N0FNyQYJyK6F R^v*;V=@dI%9bX>8monJ3 zRweG|oMHO*Q4y`CTl5|&U13ooSOKNEU-AU+yEF#hpyZ(vk_yrMfE?dxksPzsr7G^R zt~JLlhK>8E09S`_g_q?iCJ6Sib&1IkR1~Sn55DTY;R+L_vIqyIr6uJ2_MbaJxNSR0 z94G6S)OMVPV1H1O81p7_&oA*=*44osA6xM|s>FJ!Js62TIh6Wr*O-Ya!PDFJ^)tMf zy5wK`-*y|zIUcrA0Aq16tuHb6vy@q6`I&RtY{7=;Tou(#d+h>`TG2x6DMpI~ZP zt2cQ~v|uDhQ4HFfaL)||8=D69ICvF5z*R#desgHGn0)uw*e%#(11lLXaXN-8dija> z$J5?W`O{x3q2!f40fSlr;izC b@g+N8E3#%{O@hugCd$f-e&<{5!DzU*aVo zGV~1|SR)%#VicaBXi~pV>ZqwJiX09rQbX?!-tCG{0?}lOK0~+i&h*9sgV(#xKW|6F zcwXNYUb(X2>xLAoVB>v!oNie3Ld@WmNIKicR!D?8by|22alC=3VI7>X-~>atMsxq3 z&udQ$btQ#AZ`~8qQ$%GHc4^`SFrT4;8X%p#Ts(fg4>rZi!QW9AxG;BLP3n0$DfuiC zlxbGHfR7I#KR-8j=k?+R*9dcoL!pW`5~aU~EgA7oZ~Q5fbNN^9c#$lbKPIw&(Ly4u zgT+caGAV5|Dy;oczWiXp+DkS{wy|&L*h>+gRT JtLJHNMSxOfOJaex))q{h^jF2`g2 z<<4B(Z@Ld|=)mT`1S=u5-pHRxkVr))#odL*W-gah;?O3yfGFtzwQ98Qno_YjEF%WU z0cn{Zj5_F;j?Qk(G<0Ihi){%R4#}4tahZ)jcLyS?lYkuTnkyEEC(q6DfS29 ZHF*r2Jvw|jZz8s+v2-#3NX=Ce1l56`&SX=^A-nT-iuSNm0 zLa!$$Hy_B8Nl*inc#@l~aj|TWPHzB79xPrh=LA_}DpN9JnDKLjXT^=4WG^^>!nZR_ zql^~jErBTYt%7hQ2X|1k#YsL`D&hkEH z%&F2dvhD`dx8V!SIF!tarG4dU)9QdPjk2>8xw~GJe@I&}Lz_RSq;%LR!dQWv2vqdl zog{(wDaYt-=k9jSO&pmk{iwV z38k_-5_55XpXuMN%rxg9I)(w**8OQXy D-5wfb@-`IfDdC}x7&evF3kPGjv=f7D} zE>ln*J+UsyrVmA$3>kIWQPfB7M0U K^>;!>ZkZdbBy1$RbS31jkWQ6yh};A%SIaoGYX*8et!H;~KL(mTMHxM((ZnB7 zNSb#CnqY1bTordaYJVJlpWv)Li$}m*VtzxLoV`kB$&?wgmpO`Yhz&*qP!Q ag|@*TFdb@Y1RcCTaZe)XUTjz+_n~# zc4t2aN$BX{yw{A7x>Xh@@Z88FrOHXn5OrNoRo>)ilLq)HiVbi5sV_kUUq+bTa;Im# z>eQydd1d%7L>F092ITz|!H@e RMiZKHj>i>jf _lxUdZ (JULdPCLEa}K|#EsRJ}_m z)IHXOBO?fxJZtMA7kC~Je1gvmA0siv71^yDP1Y(Nmcnnd_`bO4zKR3pW!d8z1#mJx zcpyK9=mRQB%vL|K90p~&DAX_yE%)RoJtH}sWos5?yMOfoP99cLRFnwgoWo*ZP$ffb zqxfY%n$N8LJbVq+j;bw|_~|9xsGTpbJVB_#`^}*Dz?hPSPfV#FwGU!qA8$QH3yY&M z`q8DNdyKXf Ou(S$LI 6fOmpmrsH=I$H?_4(3@IL~R4g&C0mY_J~m2A$t zi42;N3@pCiaRiuW5a-Z^$GwSVAz}GU5aKdFe}lZrP#+`$?R$Qd5`kKc0XXM5g4*oT zX-!DSZ D87-?ru2|)&k#=)@`k^PKAIpZhlr3c;*4$P@Cx@bA;m2)v zc_CV3KkBk#)amnEnXp;CORoZ1MRUL3|GV?%2C(g+z#Y<$X(iV~&AA5sPB*|kA|lQ! z%W&6fa3{hESB#yn>j~WjXf%Gxusz6FoTrdjL>Ww`Sq{!)$kF4=$z^~3l|>RJV0S0! z*ET^ wkljY97_zRb z@7>bWgnrvWKN0uRMbQ<<3vO6^WBQzbZNVqddfRlla?^BSzjawvAd^;OV4m{ZbnTsw zAN!V#^rW8q8CjF=V)7#5a1z{y`3juDgYg>yjDLhh{qG=HJ_S}?m-Y8D MAMl!50Tc4}5`A>}L1sEssR-gN zureGTWt$A_LR@S|1QyG;L$4=KAD8Q+GYNu-8Dl?N!qKaP $H6xFJ3$*V@w05FbdHC+8Yoz^b9JR)(mHs9<+ z@YC$siBTj(`59icS?8W6DJu#Md;>_ {IP@vE08mCYP@Bv=hW;I_U6ZC{b| ztp$^qSn%vizfw^INUHp9h{*Wf&+?_;X;&JI0x}5vSIAwx0KEB$k=9C8H9GHMW0Sza zJ{`BnH{j-%iW{j%@{y6*SK&2&`|;8B_X*8aKpm(G90 zEqI5H>Fxn5s5xcoOPw0GxJ6t11KDbh63U|a3vh$L^Op~6_WT}pU)dpp_ z5fPDnA_NRtX)GFP_bw_21K!FNO6;%9QNVbX^%UEd0yq^Q`R_+XYpt0?szxWaBx2T| zst?KT?zDb_r4mFgn%)vHkQj7l>ZeD*tuE4YD6Q2-?f z#mlS@T36bc%LDy5G5`BG(x36dGK}*LGF0)$3FU*pm4iah#)vRlUd=o|PPDnvcIL%; zHgxBfyN|iH5A}Ep<0|P3*~C4-+~Z0xpc=X;Tzn>@K{bYx72*=KmOajpg%I$e_PN#k zv6c|50WnE47T7xXRglsnKADf2J@d=oV_GGq9MM*H=zExGou#24 Mq?`(<;s0q2hf_LSk!Wd;;Equm^Y57&)!6r#|8#Z!XNi7GANU?et0EilF|;uw zRH$eqri>T8wm)b;mIFb?IG6OVZtkQg92dGh`Koxs7{k@rFBNBVqn4&EW`YfctZO6o zF?0&?Hwpik&=P`0(g)}*>+y(a!s9 {qY zgppOR%Jyk5o{N_-0r1@TQm-6I3PjO8r78vlW(;UEgD{=Hqg&xtt_=L-lkB+bTfDW~ z6*04OuBBH-m{(8IoOq@949n!ABIKOX2D_eCXLKA0dz_VDrb-M!_$8{L>c+Nx5^VCq zb; K)0Nc=AoV0aa{~Fx-OT)KYT)$s+3i z$YMTagw|3D!Jnp423hrfo_C8RLb 4@_?2?iH=O>3T JA%N4g(h8d-G?swQHKv_)0N=)U4yaX@x%ctHIJg~o7mLvCtUT;t?| zZe}j9bt#S9u4%YOU4M~Q+D4>v`!k>G&5tnt$;AIH?nQHrvieWF1o>LJ*Kx {QV-}+NU5$gs#0+g9F2LC>)~NV7}g;k+ai@ zHlJ9aQeN}lVx10CPd{#RF>gE`ojAPj;FXVIL-@yijwOBP8s3JI NR #{(jtXVLMra(bzD8HTY*51sMe%xNqPLFK{`;haI- z`%ro*K1;|-P`(uvi5|%vY13bf=e?7LV>t|$HPn)9Eylan?|wCM1oFB!p0ONZSQxf< zfZ!Ivj^(A5m5)>55aupNNUHzk*y>Y!h*FLj8!h3%6Ugx7M3QTfDD@gr0M+BvDua`s z<@!yNc4_V8{Mo(Lx|OXhZ5| T7ma*ZT3W?#o!v56=|2j*!mA=q zj0AU=4%G4OFdSmoAy)K>pQIEXv@H^Ne%SP$@tB$DeM-}@Mh@(H)g=}j5urJaTWYmX zbu7W{NeEido}Jz+2YPNsCyt#?&JG2ir8~APF?MDvjwC9q@gz-b0Hu^5^TKbtT8B`T zwhKjfh}!#vqVDj75*VFElsvmnp?-Yredb&wuAzAFWK4&jzt7lak#hQF4<#fQh a+zmH0VGv?s5A|Mo}2s}9)O1(xs!}M$4*FkXz%I0S@V=|`AFToX9Yx}Nytnfi6 zMi^pw%B)g#N&04@bN w0G;ov=go(q_b23!Ap+P@AWPLl_WszK~ z4%LU8tNz6e&Ls(YP>Lyjt)_gR?w}OWhZ1%7V!Mmom2%mQ1Wpwqqkk(}-jluU&33nH z+i`(^iSAL*G#h&i@UUB8W8|Xj-^jn$`l`7&f~Kx|7n?)DJK~%~9o;_>!tP4;B%Q*o zvOTGRT7OBc!gG}nsi&b_iam(g+To@5<|!xcYbESU@igU1`u`eGDy;fy{-&y5 mwquD`x zW{vx-<7R9VVsJ^Qw9<9f-mcX{F4aZpv%c}1 4!piyhVF6^^WKjrku!{#TRdHT&^q+ZnV|})ZgxwZJ~avna{`F zj-5;ddkMzfusg%8OeE(p6;;|(NS_C`EAv;}t0Sdia$Ijck=y-)+z5c$f${ldAT=mv z|K`#{2{ys05gRM1srKJVSRYKBPG>{|Sg2gZOV4)M y@3s#a+KMwa4&;2u?V)Odjr CA@Lsvsr@kD+{7q~T zs`PhMKShSY4@Kw@DIDT4U3M%o3wvSXi$GcO6M0CEVr%pTmN393DvJoxef}+jfJ6cm zrS&CUZcG4?wGW#AG1fh2(Ha^8;)FHRbzoonP EIA!LU>n?60sdI4EtxC;r%ZNXle=y(MDg;2za=+BLB zx#llb3(7);3kRU4IZJ-~W+)(O0eG}y)CqCqXmRxj^$7@^YPmbd=buqoY0{B+g$S+^ z03!r9@>-3Mvl&M&Wn7cENE{SKS-4hf)-)K2UG8wGL9!rmI*&_7Dve$lZ-|N!r~L&F z_$V~uJGWJ1YyMrbmKhdAEBO8phB|P{2Z`9T{BZ2xi3B&j>M&4X|0$G+-(0Fj3jtIn zQ<6>mV<49iz`!v6aghI;va@t@bXPYqwYT^Wv)j_xa$I1+`X#kbM84zX(&R2vZLy$< z6HUNm9A(Gtp&Ppzf9YO0(~B*-&x-aG)do(v9b(ogbdi;!x$YTUtT{HuEA^Ou^E$mY z1Z(Kqrfx$e5ffteU4YJ&*U}V7E^6amQwb3;z+|N=#o~}~tC|~nxwo>KDo89^CSFAR zw(Ap9=3#*BZ*-zI9xa%Ljs3eRF$RQByfk ;5Q^sI0;S1B*Xra8f1Vee(DdNvw{S*ht_41V|#<`(6y3`X@W^d zUQz~rxS7l*!4r0YmA^|Izl+;%5az!?n~zay(=9v5q>nZ|{=!yeZ z%&Jwq24y(;2d*4W5I!DY2H~|!Cl*1GTQZW9*^e_8MAq`@NZ2bnzOJT_PROH(7t9om zUoUuJt&1M6tRx5l{?}mSV5BTyXbkn5q{$0hq@y)yOuvE$GH}c_mp52ery$nt@cJpo z &cKt!TO4F28p5-I`spR&;8>~-N?(j{Lp z_c6S6TZ_>4>37A oWp72LTA$?a3GE*4Sd$W^ynv2tr6!QSX?o_G_g$ z&Dhf{{LZa; aOKP=#D9FsKe7M2{&B!b$jHs8I;qeQ85*E6Lm`Mx70`(x z8^n$Zh`@*kSso0`%)`yy$wAw}o*Cp~ObGHfLV + + ++ 非靶病灶信息 + ++ ++ 非靶病灶信息 + ++ ++ 有明确新病灶 + ++ ++ 有触发iRECST后的新病灶 + ++ ++ 新靶病灶结果 + ++ ++ 新非靶病灶结果 + ++ ++ 其他既往新病灶结果 + ++ ++ 存在触发iRECIST后新病灶结果 + ++ ++ 新病灶整体评估 + ++ ++ 有明确新病灶 + ++ ++ 有触发iRECST后的新病灶 + ++ ++ 新靶病灶结果 + ++ ++ 新非靶病灶结果 + ++ ++ 其他既往新病灶结果 + ++ ++ 存在触发iRECIST后新病灶结果 + ++ ++ 新病灶整体评估 + ++ ++ 有明确新病灶 + ++ ++ 有触发iRECST后的新病灶 + ++ ++ 新靶病灶结果 + ++ ++ 新非靶病灶结果 + ++ ++ 其他既往新病灶结果 + ++ ++ 存在触发iRECIST后新病灶结果 + ++ + 新病灶整体评估 + ++ 访视名称 @@ -7150,6 +7265,16 @@ 是否有新病灶 + ++ 是否有明确既往新病灶 + ++ + 是否有触发iRECIST后新病灶 + ++ 靶病灶结果 @@ -7160,6 +7285,31 @@ 非靶病灶结果 + ++ 新靶病灶结果 + ++ ++ 新非靶病灶结果 + ++ ++ 其他既往新病灶结果 + ++ ++ 存在触发iRECIST后新病灶结果 + ++ + 新病灶整体评估 + ++ 总体结果 @@ -7195,6 +7345,16 @@ 非靶病灶信息 + ++ 新靶病灶信息 + ++ + 新非靶病灶信息 + +- 序号 @@ -7210,7 +7370,7 @@ 部位 + 检查号 diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ExportTumorEvaluationDto.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ExportTumorEvaluationDto.cs index 15799f085..a275d7557 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ExportTumorEvaluationDto.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ExportTumorEvaluationDto.cs @@ -141,6 +141,66 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto } } + + ///+ /// 非靶病灶信息 + /// + public ListNewTargetInfoList + { + get + { + List targets = new List (); + + var index = 0; + foreach (var item in VisitList.Last().NewVisitTargetInfoList) + { + TargetInfo targetInfo = new TargetInfo() + { + Title = item.Title, + VisitOneImgNum = item.VisitImgNum, + VisitOneLength = item.VisitLength != null ? item.VisitLength.Value.ToString() : string.Empty, + VisitTwoImgNum = VisitList.Count >= 2 ? VisitTwo.NewVisitTargetInfoList[index].VisitImgNum : string.Empty, + VisitTwoLength = VisitList.Count >= 2 && VisitTwo.NewVisitTargetInfoList[index].VisitLength != null ? VisitTwo.NewVisitTargetInfoList[index].VisitLength.Value.ToString() : string.Empty, + VisitThreeImgNum = VisitList.Count >= 3 ? VisitThree.NewVisitTargetInfoList[index].VisitImgNum : string.Empty, + VisitThreeLength = VisitList.Count >= 3 && VisitThree.NewVisitTargetInfoList[index].VisitLength != null ? VisitThree.NewVisitTargetInfoList[index].VisitLength.Value.ToString() : string.Empty + }; + targets.Add(targetInfo); + index++; + } + return targets; + + } + } + + /// + /// 非靶病灶信息 + /// + public ListNewNoTargetInfoList + { + get + { + List targets = new List (); + + var index = 0; + foreach (var item in VisitList.Last().NewVisitNoTargetInfoList) + { + TargetInfo targetInfo = new TargetInfo() + { + Title = item.Title, + VisitOneImgNum = item.VisitImgNum, + VisitOneLength = item.VisitLength != null ? item.VisitLength.Value.ToString() : string.Empty, + VisitTwoImgNum = VisitList.Count >= 2 ? VisitTwo.NewVisitNoTargetInfoList[index].VisitImgNum : string.Empty, + VisitTwoLength = VisitList.Count >= 2 && VisitTwo.NewVisitNoTargetInfoList[index].VisitLength != null ? VisitTwo.NewVisitNoTargetInfoList[index].VisitLength.Value.ToString() : string.Empty, + VisitThreeImgNum = VisitList.Count >= 3 ? VisitThree.NewVisitNoTargetInfoList[index].VisitImgNum : string.Empty, + VisitThreeLength = VisitList.Count >= 3 && VisitThree.NewVisitNoTargetInfoList[index].VisitLength != null ? VisitThree.NewVisitNoTargetInfoList[index].VisitLength.Value.ToString() : string.Empty + }; + targets.Add(targetInfo); + index++; + } + return targets; + + } + } } @@ -174,10 +234,47 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public string OneHaveNewLesion { get; set; } = string.Empty; + /// + /// 有明确新病灶 + /// + public string OneHavePreviousNewLesions { get; set; } = string.Empty; + + ///+ /// 有触发iRECST后的新病灶 + /// + public string OneHaveTriggeringIRECSITNewLesions { get; set; } = string.Empty; + + ///+ /// 新靶病灶结果 + /// + public string OneNewTargetResult { get; set; } = string.Empty; + + ///+ /// 新非靶病灶结果 + /// + public string OneNewNoTargetResult { get; set; } = string.Empty; + + ///+ /// 其他既往新病灶结果 + /// + public string OneOtherPreviousNewLesionResult { get; set; } = string.Empty; + + ///+ /// 存在触发iRECIST后新病灶结果 + /// + public string OneTriggeringIRECSITResult { get; set; } = string.Empty; + + ///+ /// 新病灶整体评估 + /// + public string OneNewLesionEvaluationResult { get; set; } = string.Empty; + + public string OneTargetResult { get; set; } = string.Empty; public string OneNoTargetResult { get; set; } = string.Empty; + public string OneOverallResult { get; set; } = string.Empty; public string OneDoctorSignTime { get; set; } = string.Empty; @@ -195,6 +292,41 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public string TwoHaveNewLesion { get; set; } = string.Empty; + ///+ /// 有明确新病灶 + /// + public string TwoHavePreviousNewLesions { get; set; } = string.Empty; + + ///+ /// 有触发iRECST后的新病灶 + /// + public string TwoHaveTriggeringIRECSITNewLesions { get; set; } = string.Empty; + + ///+ /// 新靶病灶结果 + /// + public string TwoNewTargetResult { get; set; } = string.Empty; + + ///+ /// 新非靶病灶结果 + /// + public string TwoNewNoTargetResult { get; set; } = string.Empty; + + ///+ /// 其他既往新病灶结果 + /// + public string TwoOtherPreviousNewLesionResult { get; set; } = string.Empty; + + ///+ /// 存在触发iRECIST后新病灶结果 + /// + public string TwoTriggeringIRECSITResult { get; set; } = string.Empty; + + ///+ /// 新病灶整体评估 + /// + public string TwoNewLesionEvaluationResult { get; set; } = string.Empty; + public string TwoTargetResult { get; set; } = string.Empty; public string TwoNoTargetResult { get; set; } = string.Empty; @@ -215,6 +347,41 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public string ThreeHaveNewLesion { get; set; } = string.Empty; + ///+ /// 有明确新病灶 + /// + public string ThreeHavePreviousNewLesions { get; set; } = string.Empty; + + ///+ /// 有触发iRECST后的新病灶 + /// + public string ThreeHaveTriggeringIRECSITNewLesions { get; set; } = string.Empty; + + ///+ /// 新靶病灶结果 + /// + public string ThreeNewTargetResult { get; set; } = string.Empty; + + ///+ /// 新非靶病灶结果 + /// + public string ThreeNewNoTargetResult { get; set; } = string.Empty; + + ///+ /// 其他既往新病灶结果 + /// + public string ThreeOtherPreviousNewLesionResult { get; set; } = string.Empty; + + ///+ /// 存在触发iRECIST后新病灶结果 + /// + public string ThreeTriggeringIRECSITResult { get; set; } = string.Empty; + + ///+ /// 新病灶整体评估 + /// + public string ThreeNewLesionEvaluationResult { get; set; } = string.Empty; + public string ThreeTargetResult { get; set; } = string.Empty; public string ThreeNoTargetResult { get; set; } = string.Empty; @@ -258,6 +425,16 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// public string HaveNewLesion { get; set; } = string.Empty; + ///+ /// 是否有明确既往新病灶 + /// + public string HavePreviousNewLesions { get; set; } = string.Empty; + + ///+ /// 是否有触发iRECIST后新病灶 + /// + public string HaveTriggeringIRECSITNewLesions { get; set; } = string.Empty; + ////// 靶病灶结果 /// @@ -268,6 +445,32 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// public string NoTargetResult { get; set; } = string.Empty; + + ///+ /// 新靶病灶结果 + /// + public string NewTargetResult { get; set; } = string.Empty; + + ///+ /// 新非靶病灶结果 + /// + public string NewNoTargetResult { get; set; } = string.Empty; + + ///+ /// 其他既往新病灶结果 + /// + public string OtherPreviousNewLesionResult { get; set; } = string.Empty; + + ///+ /// 存在触发iRECIST后新病灶结果 + /// + public string TriggeringIRECSITResult { get; set; } = string.Empty; + + ///+ /// 新病灶整体评估 + /// + public string NewLesionEvaluationResult { get; set; } = string.Empty; + ////// 总体结果 /// @@ -316,6 +519,17 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// public ListVisitNoTargetInfoList { get; set; } = new List (); + + /// + /// 新靶病灶信息 + /// + public ListNewVisitTargetInfoList { get; set; } = new List (); + + /// + /// 新非靶病灶信息 + /// + public ListNewVisitNoTargetInfoList { get; set; } = new List (); + } public class VisitLesionInfo diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs index e57f54617..3da75228e 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs @@ -23,6 +23,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate [ApiExplorerSettings(GroupName = "Reading")] public class IRECIST1Point1CalculateService(IRepository _readingTableQuestionAnswerRepository, IRepository _visitTaskRepository, + IRepository _dicomInstanceRepository, IRepository _hIRHospitalRepository, IRepository _readingQuestionCriterionTrialRepository, IRepository _readingTableQuestionTrialRepository, @@ -65,7 +66,280 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate /// public async Task DownLoadTumorEvaluationStream(DownLoadReadReportInDto inDto) { - throw new BusinessValidationFailedException(_localizer["ReadingCalculate_DownLoadReadReport"]); + var downFile = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $@"wwwroot/ReadReoprtTemplate/downLoad/{inDto.DownLoadGuid}"); + Directory.CreateDirectory(downFile); + + var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId && x.ReadingCategory == ReadingCategory.Visit) + .Include(x => x.TrialReadingCriterion).FirstNotNullAsync(); + var visitInfo = await _subjectVisitRepository.Where(x => x.Id == taskinfo.SourceSubjectVisitId).Include(x => x.StudyList).FirstNotNullAsync(); + var subjectInfo = await _subjectRepository.Where(x => x.Id == taskinfo.SubjectId).Include(x => x.Trial).Include(x => x.SubjectPatientList).FirstNotNullAsync(); + var subjectPatientList = await _subjectPatientRepository.Where(x => x.SubjectId == subjectInfo.Id).Include(x => x.Patient).ToListAsync(); + var patientIdStrList = await _dicomStudyRepository.Where(x => x.SubjectVisitId == taskinfo.SourceSubjectVisitId).Select(x => x.PatientIdStr).Distinct().ToListAsync(); + var trialQuestion = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == taskinfo.TrialReadingCriterionId).ToListAsync(); + var tableQuestion = await _readingTableQuestionTrialRepository.Where(x => x.ReadingQuestionTrial.ReadingQuestionCriterionTrialId == taskinfo.TrialReadingCriterionId).ToListAsync(); + var dicotionCode = trialQuestion.Where(x => x.DictionaryCode != string.Empty).Select(x => x.DictionaryCode).Distinct().ToList(); + dicotionCode.AddRange(tableQuestion.Where(x => x.DictionaryCode != string.Empty).Select(x => x.DictionaryCode).Distinct()); + var dictionList = await _dictionaryRepository.Where(x => dicotionCode.Contains(x.Code)).Include(x => x.ChildList).ToListAsync(); + var unitDictionary = await _dictionaryRepository.Where(x => x.Code == "ValueUnit").Include(x => x.ChildList).ToListAsync(); + + var relatedVisitTask = await ServiceProvider.GetService ().GetRelatedVisitTask(new GetRelatedVisitTaskInDto() + { + VisitTaskId = inDto.VisitTaskId + }); + + var relatedTaskIds = relatedVisitTask.Item1.Select(x => x.VisitTaskId).ToList(); + + var answerList = await _readingTaskQuestionAnswerRepository.Where(x => relatedTaskIds.Contains(x.VisitTaskId)).Include(x => x.ReadingQuestionTrial).ToListAsync(); + + var rowinfoList = await _readingTableAnswerRowInfoRepository.Where(x => relatedTaskIds.Contains(x.VisitTaskId)).Include(x => x.VisitTask).Include(x => x.ReadingQuestionTrial).ToListAsync(); + + var instanceIdList = rowinfoList.Select(x => x.InstanceId).ToList(); + var instanceList = await _dicomInstanceRepository.Where(x => instanceIdList.Contains(x.Id)).Include(x => x.DicomSerie.DicomStudy).ToListAsync(); + + var tableAnswerList = await _readingTableQuestionAnswerRepository.Where(x => relatedTaskIds.Contains(x.VisitTaskId)).Include(x => x.ReadingQuestionTrial).Include(x => x.ReadingTableQuestionTrial).ToListAsync(); + var taskinfoList = await _visitTaskRepository.Where(x => relatedTaskIds.Contains(x.Id)) + .Include(x => x.SourceSubjectVisit).Include(x => x.SourceSubjectVisit.StudyList) + .Include(x => x.DoctorUser).ToListAsync(); + + + + string getHavePreviousNewLesions(Guid visitId) + { + var answer = answerList.Where(x => x.ReadingQuestionTrial.QuestionType == QuestionType.OtherNewTargetLesion && x.Id == visitId).Select(x => x.Answer).FirstIsNullReturnEmpty(); + if (answer == ((int)(OtherPreviousNewLesionAssessment.iUPD)).ToString()) + { + return _localizer["CriterionCalculateExport_Yes"]; + } + else + { + return _localizer["CriterionCalculateExport_No"]; + } + } + + List exportVisitDatas = taskinfoList + .Select(x => new ExportVisitData() + { + VisitName = x.SourceSubjectVisit.VisitName, + VisitNum = x.VisitTaskNum, + CheckDate = string.Join(",", x.SourceSubjectVisit.StudyList.Where(x => x.StudyTime != null).Select(x => x.StudyTime.Value.ToString("yyyy-MM-dd"))), + CheckInfoList = x.SourceSubjectVisit.StudyList.Select(x => new DicomStudyInfo() + { + BodyPartExamined = x.BodyPartExamined, + Modalities = x.Modalities + }).ToList(), + HaveNewLesion = _generalCalculateService.GetTaskanswer(answerList, dictionList, unitDictionary, x.Id, QuestionType.NewLesions), + // 是否有明确既往新病灶 // 结果为IPUD就是有 其他的是无 + HavePreviousNewLesions = getHavePreviousNewLesions(x.Id), + + // 是否有明确既往新病灶 + HaveTriggeringIRECSITNewLesions = _generalCalculateService.GetTaskanswer(answerList, dictionList, unitDictionary, x.Id, QuestionType.IRECISTNewTargetLesion), + + NewTargetResult = _generalCalculateService.GetTaskanswer(answerList, dictionList, unitDictionary, x.Id, QuestionType.NewTargetLesion), + NewNoTargetResult = _generalCalculateService.GetTaskanswer(answerList, dictionList, unitDictionary, x.Id, QuestionType.NewNoTargetLesion), + OtherPreviousNewLesionResult = _generalCalculateService.GetTaskanswer(answerList, dictionList, unitDictionary, x.Id, QuestionType.OtherNewTargetLesion), + TriggeringIRECSITResult = _generalCalculateService.GetTaskanswer(answerList, dictionList, unitDictionary, x.Id, QuestionType.IRECISTNewTargetLesion), + NewLesionEvaluationResult = _generalCalculateService.GetTaskanswer(answerList, dictionList, unitDictionary, x.Id, QuestionType.NewLesionEvaluation), + + TargetResult = _generalCalculateService.GetTaskanswer(answerList, dictionList, unitDictionary, x.Id, QuestionType.TargetLesion), + NoTargetResult = _generalCalculateService.GetTaskanswer(answerList, dictionList, unitDictionary, x.Id, QuestionType.NoTargetLesion), + OverallResult = _generalCalculateService.GetTaskanswer(answerList, dictionList, unitDictionary, x.Id, QuestionType.Tumor), + DoctorName = x.DoctorUser.LastName + x.DoctorUser.FirstName, + SignTime = x.SignTime?.ToString("yyyy-MM-dd HH:mm:ss"), + VisitTargetInfoList = getLesionInfo(LesionType.TargetLesion, x.Id,5), + VisitNoTargetInfoList = getLesionInfo(LesionType.NonTargetLesions, x.Id), + NewVisitTargetInfoList = getLesionInfo(LesionType.NewTargetLesion, x.Id,5), + NewVisitNoTargetInfoList = getLesionInfo(LesionType.NewNonTargetLesion, x.Id), + }).OrderBy(x => x.VisitNum).ToList(); + + + #region 两个函数 + List getLesionInfo(LesionType lesionType, Guid Visittaskid, int? minNum = null) + { + var targetFocus = rowinfoList.Where(x => x.VisitTaskId == Visittaskid && x.ReadingQuestionTrial.LesionType == lesionType).OrderBy(x => x.RowIndex).ToList(); + + + var targetInfo = new List (); + + int num = 1; + foreach (var item in targetFocus) + { + + VisitLesionInfo target = new VisitLesionInfo + { + RowMark = rowinfoList.Where(x => x.VisitTaskId == Visittaskid && x.RowIndex == item.RowIndex && x.ReadingQuestionTrial.LesionType == lesionType).Select(x => x.RowMark).FirstIsNullReturnEmpty(), + Organ = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, Visittaskid, lesionType, QuestionMark.Organ, item.RowIndex), + Part = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, Visittaskid, lesionType, QuestionMark.Part, item.RowIndex), + Number = num, + StudyIdStr = instanceList.Where(x => x.Id == item.InstanceId).Select(x => x.DicomSerie.DicomStudy.StudyId).FirstIsNullReturnEmpty(), + RowId = item.Id, + SeriesNumber = instanceList.Where(x => x.Id == item.InstanceId).Select(x => x.DicomSerie.SeriesNumber).FirstOrDefault(), + InstanceNumber = instanceList.Where(x => x.Id == item.InstanceId).Select(x => x.InstanceNumber).FirstOrDefault(), + VisitLength = getStateInfo(item.VisitTaskId, item.RowIndex, lesionType), + }; + targetInfo.Add(target); + num++; + + } + if (minNum != null) + { + for (int i = num; i <= minNum.Value; i++) + { + VisitLesionInfo target = new VisitLesionInfo + { + Number = i, + }; + targetInfo.Add(target); + + } + + } + + return targetInfo; + } + + decimal getStateInfo(Guid visitTaskid, decimal item, LesionType lesionType) + { + // 非淋巴结取长径 淋巴结取长短径 + var state = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, visitTaskid, lesionType, QuestionMark.State, item); + var majorAxis = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, visitTaskid, lesionType, QuestionMark.MajorAxis, item, false); + + var isLymph = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, visitTaskid, lesionType, QuestionMark.IsLymph, item); + var shortAxis = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, visitTaskid, lesionType, QuestionMark.ShortAxis, item, false); + + var result = string.Empty; + + if (!majorAxis.IsNullOrEmpty()) + { + result = majorAxis; + + } + + if (isLymph.EqEnum(YesOrNoOrNa.Yes) && !shortAxis.IsNullOrEmpty()) + { + result = shortAxis; + } + + return result.IsNullOrEmptyReturn0(); + + } + #endregion + + var researchProgramNo = subjectInfo.Trial.ResearchProgramNo; + var subjectName = subjectInfo.ShortName; + var subjectCode = string.Join(",", patientIdStrList); //患者编号; + + + + List resultdata = new List (); + List times = new List () { "One", "Two", "Three" }; + List columns = new List () { + "VisitName", + "CheckDate", + "CheckInfoStr", + "HaveNewLesion", + "TargetResult", + "NoTargetResult", + "OverallResult", + "DoctorSignTime", + "HavePreviousNewLesions", + "HaveTriggeringIRECSITNewLesions", + "NewTargetResult", + "NewNoTargetResult", + "OtherPreviousNewLesionResult", + "TriggeringIRECSITResult", + "NewLesionEvaluationResult", + }; + + var forCount = (int)Math.Ceiling((double)exportVisitDatas.Count() / 3); + for (int i = 0; i < forCount; i++) + { + ExportTumorEvaluationInfo export = new ExportTumorEvaluationInfo + { + ResearchProgramNo = researchProgramNo, + SubjectName = subjectName, + SubjectCode = subjectCode, + VisitList = exportVisitDatas.Skip(i * 3).Take(3).ToList(), + }; + + export.Lesion = new ExportData() + { + OneTargetSum = export.VisitOne.TargetSum.ToString(), + TwoTargetSum = export.VisitTwo.VisitTargetInfoList.Count() > 0 ? export.VisitTwo.TargetSum.ToString() : string.Empty, + ThreeTargetSum = export.VisitThree.VisitTargetInfoList.Count() > 0 ? export.VisitThree.TargetSum.ToString() : string.Empty, + + + }; + foreach (var time in times) + { + foreach (var column in columns) + { + _generalCalculateService.SetPropertyDynamically(export.Lesion, column, export, time); + } + + } + + if (i >= forCount - 1) + { + export.IsLastPage = true; + // 之后最后一个任务需要签名 + var thisVisitListNum = export.VisitList.Count(); + switch (thisVisitListNum) + { + case 1: + export.Lesion.OneDoctorSign = _localizer["CriterionCalculateExport_Sign"]; + break; + case 2: + export.Lesion.TwoDoctorSign = _localizer["CriterionCalculateExport_Sign"]; + break; + case 3: + export.Lesion.ThreeDoctorSign = _localizer["CriterionCalculateExport_Sign"]; + break; + } + + } + resultdata.Add(export); + } + + + + + + var value = new + { + VisitTaskList = resultdata, + IsLastPage = false, + }; + + + var templatePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $@"wwwroot/ReadReoprtTemplate/TumorEvaluation_RECIST1.1_{(_userInfo.IsEn_Us ? "EN" : "CN")}_V1.docx"); + var isConvertedTask = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Select(x => x.IsConvertedTask).FirstOrDefaultAsync(); + if (isConvertedTask) + { + templatePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $@"wwwroot/ReadReoprtTemplate/TumorEvaluation_IRECIST1.1_{(_userInfo.IsEn_Us ? "EN" : "CN")}_V1.docx"); + + } + var outputFilePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $@"wwwroot/ReadReoprtTemplate/downLoad/{inDto.DownLoadGuid}.docx"); + + + MiniWord.SaveAsByTemplate(outputFilePath, templatePath, value); + + + //// 获取文件夹中的所有文件路径 + Directory.Delete(downFile, true); + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + Stream stream = _generalCalculateService.ReadAndReturnStream(outputFilePath); + return stream; + } + else + { + + var pdfurl = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"wwwroot/ReadReoprtTemplate/downLoad"); + FileConvertHelper.ConvertWordToPdf(outputFilePath, pdfurl); + Stream stream = _generalCalculateService.ReadAndReturnStream(pdfurl + $"/{inDto.DownLoadGuid}.pdf"); + return stream; + } } /// diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/MRECISTHCCCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/MRECISTHCCCalculateService.cs index 2834e3aa3..97275b3ef 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/MRECISTHCCCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/MRECISTHCCCalculateService.cs @@ -124,7 +124,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate Organ = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, Visittaskid, lesionType, QuestionMark.Organ, item.RowIndex), Part = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, Visittaskid, lesionType, QuestionMark.Part, item.RowIndex), Number = num, - StudyIdStr = instanceList.Where(x => x.Id == item.InstanceId).Select(x => x.DicomSerie.DicomStudy.StudyId).FirstOrDefault(), + StudyIdStr = instanceList.Where(x => x.Id == item.InstanceId).Select(x => x.DicomSerie.DicomStudy.StudyId).FirstIsNullReturnEmpty(), RowId = item.Id, SeriesNumber = instanceList.Where(x => x.Id == item.InstanceId).Select(x => x.DicomSerie.SeriesNumber).FirstOrDefault(), InstanceNumber = instanceList.Where(x => x.Id == item.InstanceId).Select(x => x.InstanceNumber).FirstOrDefault(), diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs index 6e8304586..2bb142b3e 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1CalculateService.cs @@ -139,7 +139,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate Organ = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, Visittaskid, lesionType, QuestionMark.Organ, item.RowIndex), Part = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, Visittaskid, lesionType, QuestionMark.Part, item.RowIndex), Number = num, - StudyIdStr = instanceList.Where(x => x.Id == item.InstanceId).Select(x => x.DicomSerie.DicomStudy.StudyId).FirstOrDefault(), + StudyIdStr = instanceList.Where(x => x.Id == item.InstanceId).Select(x => x.DicomSerie.DicomStudy.StudyId).FirstIsNullReturnEmpty(), RowId = item.Id, SeriesNumber = instanceList.Where(x => x.Id == item.InstanceId).Select(x => x.DicomSerie.SeriesNumber).FirstOrDefault(), InstanceNumber = instanceList.Where(x => x.Id == item.InstanceId).Select(x => x.InstanceNumber).FirstOrDefault(), diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1_BMCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1_BMCalculateService.cs index 7f4ec06f6..f3eff861c 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1_BMCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/RECIST1Point1_BMCalculateService.cs @@ -112,13 +112,13 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate OverallResult = _generalCalculateService.GetTaskanswer(answerList, dictionList, unitDictionary, x.Id, QuestionType.Tumor), DoctorName = x.DoctorUser.LastName + x.DoctorUser.FirstName, SignTime = x.SignTime?.ToString("yyyy-MM-dd HH:mm:ss"), - VisitTargetInfoList = getLesionInfo(LesionType.TargetLesion, x.Id), + VisitTargetInfoList = getLesionInfo(LesionType.TargetLesion, x.Id,5), VisitNoTargetInfoList = getLesionInfo(LesionType.NonTargetLesions, x.Id), }).OrderBy(x => x.VisitNum).ToList(); #region 两个函数 - List getLesionInfo(LesionType lesionType, Guid Visittaskid) + List getLesionInfo(LesionType lesionType, Guid Visittaskid,int? minNum=null) { var targetFocus = rowinfoList.Where(x => x.VisitTaskId == Visittaskid && x.ReadingQuestionTrial.LesionType == lesionType).OrderBy(x => x.RowIndex).ToList(); @@ -135,7 +135,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate Organ = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, Visittaskid, lesionType, QuestionMark.Organ, item.RowIndex), Part = _generalCalculateService.GetTaskTableAnswer(tableAnswerList, dictionList, unitDictionary, Visittaskid, lesionType, QuestionMark.Part, item.RowIndex), Number = num, - StudyIdStr = instanceList.Where(x => x.Id == item.InstanceId).Select(x => x.DicomSerie.DicomStudy.StudyId).FirstOrDefault(), + StudyIdStr = instanceList.Where(x => x.Id == item.InstanceId).Select(x => x.DicomSerie.DicomStudy.StudyId).FirstIsNullReturnEmpty(), RowId = item.Id, SeriesNumber = instanceList.Where(x => x.Id == item.InstanceId).Select(x => x.DicomSerie.SeriesNumber).FirstOrDefault(), InstanceNumber = instanceList.Where(x => x.Id == item.InstanceId).Select(x => x.InstanceNumber).FirstOrDefault(), @@ -145,9 +145,9 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate num++; } - if (lesionType == LesionType.TargetLesion) + if (minNum!=null) { - for (int i = num; i <= 5; i++) + for (int i = num; i <= minNum.Value; i++) { VisitLesionInfo target = new VisitLesionInfo { From 5ade2135ee752eca4e9a125e5024f6bcb492cced Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Wed, 10 Sep 2025 15:11:34 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IRaCIS.Core.Application.xml | 12 ++++- .../Reading/Dto/ExportTumorEvaluationDto.cs | 44 +++++++++++++++++-- 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index d6394366c..6332842f8 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -7087,7 +7087,7 @@ - 所有访视的靶病灶列表 + 所有访视的靶病灶列表 最多有三个 @@ -7115,6 +7115,16 @@ 靶病灶信息 ++ + + + + + + ++ + 非靶病灶信息 diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ExportTumorEvaluationDto.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ExportTumorEvaluationDto.cs index a275d7557..b7f5f02d0 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ExportTumorEvaluationDto.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ExportTumorEvaluationDto.cs @@ -1,6 +1,10 @@ -using System; +using DocumentFormat.OpenXml.Wordprocessing; +using MassTransit.Caching.Internals; +using System; +using System.Collections; using System.Collections.Generic; using System.Linq; +using System.Reflection; using System.Text; using System.Threading.Tasks; @@ -17,7 +21,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public class ExportTumorEvaluationInfo { /// - /// 所有访视的靶病灶列表 + /// 所有访视的靶病灶列表 最多有三个 /// public ListVisitList { get; set; } @@ -97,8 +101,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto TargetInfo targetInfo = new TargetInfo() { Title = item.Title, - VisitOneImgNum = item.VisitImgNum, - VisitOneLength = item.VisitLength.ToString(), + VisitOneImgNum = GetVisitAnswer(0, "VisitTargetInfoList", index, "VisitImgNum"), + VisitOneLength = GetVisitAnswer(0, "VisitTargetInfoList", index, "VisitLength"), VisitTwoImgNum = VisitList.Count >= 2 ? VisitTwo.VisitTargetInfoList[index].VisitImgNum : string.Empty, VisitTwoLength = VisitList.Count >= 2 ? VisitTwo.VisitTargetInfoList[index].VisitLength.ToString() : string.Empty, VisitThreeImgNum = VisitList.Count >= 3 ? VisitThree.VisitTargetInfoList[index].VisitImgNum : string.Empty, @@ -112,6 +116,38 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto } } + /// + /// 获取访视答案 + /// + /// 访视Index 第几个访视 + /// 病灶字段名 数组 + /// 第几个病灶 + /// 要取的字段名 + ///+ private string GetVisitAnswer(int visitIndex, string lesionName , int num, string fieldName) + { + var result= string.Empty; + try + { + PropertyInfo listProp = VisitList[visitIndex].GetType().GetProperty(lesionName); + IList list = listProp.GetValue(VisitList[visitIndex]) as IList; + object listItem = list[num]; + FieldInfo field = listItem.GetType().GetField(fieldName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); + if (field != null) + return field.GetValue(listItem).ToString(); + PropertyInfo prop = listItem.GetType().GetProperty(fieldName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); + if (prop != null) + return prop.GetValue(listItem).ToString(); + } + catch (Exception) + { + + + } + + return result; + } + /// /// 非靶病灶信息 /// From 87709f01221abdbbe2c166dfc196cca09415f2b7 Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Wed, 10 Sep 2025 15:25:03 +0800 Subject: [PATCH 3/7] =?UTF-8?q?Ires=E8=82=BF=E7=98=A4=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IRaCIS.Core.Application.xml | 21 ++- .../Reading/Dto/ExportTumorEvaluationDto.cs | 134 +++++++----------- .../IRECIST1Point1CalculateService.cs | 4 + 3 files changed, 68 insertions(+), 91 deletions(-) diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 6332842f8..09e3a70f2 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -7115,14 +7115,21 @@ 靶病灶信息+ + 病灶名称 + + ++ - + 获取访视答案 - - - - + 访视Index 第几个访视 + 病灶字段名 数组 + 第几个病灶 + 要取的字段名@@ -7132,12 +7139,12 @@ - 非靶病灶信息 + 新靶病灶信息 - 非靶病灶信息 + 新非靶病灶信息 diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ExportTumorEvaluationDto.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ExportTumorEvaluationDto.cs index b7f5f02d0..ab01bd991 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ExportTumorEvaluationDto.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ExportTumorEvaluationDto.cs @@ -93,29 +93,51 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto { get { - List targets=new List (); - - var index = 0; - foreach (var item in VisitList.Last().VisitTargetInfoList) - { - TargetInfo targetInfo = new TargetInfo() - { - Title = item.Title, - VisitOneImgNum = GetVisitAnswer(0, "VisitTargetInfoList", index, "VisitImgNum"), - VisitOneLength = GetVisitAnswer(0, "VisitTargetInfoList", index, "VisitLength"), - VisitTwoImgNum = VisitList.Count >= 2 ? VisitTwo.VisitTargetInfoList[index].VisitImgNum : string.Empty, - VisitTwoLength = VisitList.Count >= 2 ? VisitTwo.VisitTargetInfoList[index].VisitLength.ToString() : string.Empty, - VisitThreeImgNum = VisitList.Count >= 3 ? VisitThree.VisitTargetInfoList[index].VisitImgNum : string.Empty, - VisitThreeLength = VisitList.Count >= 3 ? VisitThree.VisitTargetInfoList[index].VisitLength.ToString() : string.Empty - }; - targets.Add(targetInfo); - index++; - } - return targets; - + return GetTargetInfoList("VisitTargetInfoList"); } } + /// + /// 病灶名称 + /// + /// + ///+ public List GetTargetInfoList(string lesionName) + { + List targets = new List (); + var index = 0; + + PropertyInfo? listProp = VisitList.Last().GetType().GetProperty(lesionName); + + if (listProp != null) + { + List ? lesionList = listProp.GetValue(VisitList.Last()) as List ; + + if (lesionList != null) + { + foreach (var item in lesionList) + { + TargetInfo targetInfo = new TargetInfo() + { + Title = item.Title, + VisitOneImgNum = GetVisitAnswer(0, lesionName, index, "VisitImgNum"), + VisitOneLength = GetVisitAnswer(0, lesionName, index, "VisitLength"), + VisitTwoImgNum = GetVisitAnswer(1, lesionName, index, "VisitImgNum"), + VisitTwoLength = GetVisitAnswer(1, lesionName, index, "VisitLength"), + VisitThreeImgNum = GetVisitAnswer(2, lesionName, index, "VisitImgNum"), + VisitThreeLength = GetVisitAnswer(2, lesionName, index, "VisitLength"), + }; + targets.Add(targetInfo); + index++; + } + } + + } + + + return targets; + } + /// /// 获取访视答案 /// @@ -129,9 +151,9 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto var result= string.Empty; try { - PropertyInfo listProp = VisitList[visitIndex].GetType().GetProperty(lesionName); - IList list = listProp.GetValue(VisitList[visitIndex]) as IList; - object listItem = list[num]; + PropertyInfo? listProp = VisitList[visitIndex].GetType().GetProperty(lesionName); + IList? list = listProp.GetValue(VisitList[visitIndex]) as IList; + object? listItem = list[num]; FieldInfo field = listItem.GetType().GetField(fieldName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); if (field != null) return field.GetValue(listItem).ToString(); @@ -155,86 +177,30 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto { get { - Listtargets = new List (); - - var index = 0; - foreach (var item in VisitList.Last().VisitNoTargetInfoList) - { - TargetInfo targetInfo = new TargetInfo() - { - Title = item.Title, - VisitOneImgNum = item.VisitImgNum, - VisitOneLength = item.VisitLength!=null? item.VisitLength.Value.ToString():string.Empty, - VisitTwoImgNum = VisitList.Count >= 2 ? VisitTwo.VisitNoTargetInfoList[index].VisitImgNum : string.Empty, - VisitTwoLength = VisitList.Count >= 2&& VisitTwo.VisitNoTargetInfoList[index].VisitLength!=null ? VisitTwo.VisitNoTargetInfoList[index].VisitLength.Value.ToString() : string.Empty, - VisitThreeImgNum = VisitList.Count >= 3 ? VisitThree.VisitNoTargetInfoList[index].VisitImgNum : string.Empty, - VisitThreeLength = VisitList.Count >= 3&& VisitThree.VisitNoTargetInfoList[index].VisitLength!=null ? VisitThree.VisitNoTargetInfoList[index].VisitLength.Value.ToString() : string.Empty - }; - targets.Add(targetInfo); - index++; - } - return targets; + return GetTargetInfoList("VisitNoTargetInfoList"); ; } } /// - /// 非靶病灶信息 + /// 新靶病灶信息 /// public ListNewTargetInfoList { get { - List targets = new List (); - - var index = 0; - foreach (var item in VisitList.Last().NewVisitTargetInfoList) - { - TargetInfo targetInfo = new TargetInfo() - { - Title = item.Title, - VisitOneImgNum = item.VisitImgNum, - VisitOneLength = item.VisitLength != null ? item.VisitLength.Value.ToString() : string.Empty, - VisitTwoImgNum = VisitList.Count >= 2 ? VisitTwo.NewVisitTargetInfoList[index].VisitImgNum : string.Empty, - VisitTwoLength = VisitList.Count >= 2 && VisitTwo.NewVisitTargetInfoList[index].VisitLength != null ? VisitTwo.NewVisitTargetInfoList[index].VisitLength.Value.ToString() : string.Empty, - VisitThreeImgNum = VisitList.Count >= 3 ? VisitThree.NewVisitTargetInfoList[index].VisitImgNum : string.Empty, - VisitThreeLength = VisitList.Count >= 3 && VisitThree.NewVisitTargetInfoList[index].VisitLength != null ? VisitThree.NewVisitTargetInfoList[index].VisitLength.Value.ToString() : string.Empty - }; - targets.Add(targetInfo); - index++; - } - return targets; - + return GetTargetInfoList("NewVisitTargetInfoList"); ; } } /// - /// 非靶病灶信息 + /// 新非靶病灶信息 /// public ListNewNoTargetInfoList { get { - List targets = new List (); - - var index = 0; - foreach (var item in VisitList.Last().NewVisitNoTargetInfoList) - { - TargetInfo targetInfo = new TargetInfo() - { - Title = item.Title, - VisitOneImgNum = item.VisitImgNum, - VisitOneLength = item.VisitLength != null ? item.VisitLength.Value.ToString() : string.Empty, - VisitTwoImgNum = VisitList.Count >= 2 ? VisitTwo.NewVisitNoTargetInfoList[index].VisitImgNum : string.Empty, - VisitTwoLength = VisitList.Count >= 2 && VisitTwo.NewVisitNoTargetInfoList[index].VisitLength != null ? VisitTwo.NewVisitNoTargetInfoList[index].VisitLength.Value.ToString() : string.Empty, - VisitThreeImgNum = VisitList.Count >= 3 ? VisitThree.NewVisitNoTargetInfoList[index].VisitImgNum : string.Empty, - VisitThreeLength = VisitList.Count >= 3 && VisitThree.NewVisitNoTargetInfoList[index].VisitLength != null ? VisitThree.NewVisitNoTargetInfoList[index].VisitLength.Value.ToString() : string.Empty - }; - targets.Add(targetInfo); - index++; - } - return targets; - + return GetTargetInfoList("NewVisitTargetInfoList"); ; } } } diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs index 3da75228e..ea9053b45 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs @@ -106,6 +106,10 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate string getHavePreviousNewLesions(Guid visitId) { var answer = answerList.Where(x => x.ReadingQuestionTrial.QuestionType == QuestionType.OtherNewTargetLesion && x.Id == visitId).Select(x => x.Answer).FirstIsNullReturnEmpty(); + if(answer==string.Empty) + { + return string.Empty; + } if (answer == ((int)(OtherPreviousNewLesionAssessment.iUPD)).ToString()) { return _localizer["CriterionCalculateExport_Yes"]; From ad62ad7ae0642287272990c8e42ad6ccf904f68c Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Wed, 10 Sep 2025 15:48:35 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TumorEvaluation_IRECIST1.1_EN_V1.docx | Bin 22435 -> 25937 bytes .../MRECISTHCCCalculateService.cs | 10 +++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/IRaCIS.Core.API/wwwroot/ReadReoprtTemplate/TumorEvaluation_IRECIST1.1_EN_V1.docx b/IRaCIS.Core.API/wwwroot/ReadReoprtTemplate/TumorEvaluation_IRECIST1.1_EN_V1.docx index 31f5388c9e244cb20a3371ecd5adb5b1163a7c6e..8852ba1b6a3403091a177d3cf58b646c07439e02 100644 GIT binary patch delta 14145 zcmZ9zQ+Oav)GiuNY}>YN+t$S9#OT ZYsurm9!J zTE%ss^An&69FUdS-%m^vc?kd!hXH2fZmn~oqAfJ4!oq+w;;h!6l@g>WWQ{qY+6s1) z?p62i4h2Dv8=EsR{8`&9^u1l2uc8+vnh(se$;`qOKNyz36FO9$SfN7AxN1CT(&dCp z{n#&R?+Hv@hN?+F1#47xAmrT1#xYf7UvtJvu9jZ6-E>x(Bh1*jDeVKK7zFv$^UP&f zEncrwmbImhO|bI_ERDW?m9=2{3BDK-AV4w}49qldnci)TS|94ZBdpVh9z`u^OL% zwr;G1B-7MCK${OTVC6ANJd%TQ67NaSdgp=hA(>ge^}8(QjDZHp`s`>n4hGTJf~*9! zX{#Qa%<6^r)r#MI?Q;TU3-O;&zy27xAUo3eHF4@czLy-1GoK0vm9o^JZ>il3ySE_j zC~jXau$L(z|9oWM75J%CeEC%v(|Fe$b1msbz_7?4ozy*ba|$h^$ry-`8!%x|{Mx)g z^o|go5a(0T{tBur2M&P_0s;aJ60Ue4EYz=9?F|Y7QV#|Kf&!Af42lH|F{6jR1l=e% z-jG`p0HQw+kZRE(=%Tt3wlZNjt!0W1>4&LqMYcNby~J-B k5F?vdm zu*e*SV3M2bb oei9o;eKuD#YD0l$Q~4Ut2-Ms|!B|^*S6J=&|WFQq=n?wyr7k zSNjX{|2>!{EATIP7*WEjK5S?Z5W{3gWE?<8$8l2{)!)eYZ*ZZ 1dk^S>oEN&U%KAYR6ePz1^$U#b(;p*6B2zycVRB7-SBf@(M=EuFf0+ zb@^!enyND0w%oC5-MXeFg0C3VC!+>F=@E@iI{o!$%vsy?U?h!oyGDC98@jJrPH1N~ z+K#^($S)Ft_g6G;7$+oKej0Uz6kkA;Pi|jpt?DYfasesP0E3;TU}fP!X3?nnuK@LY zq}EwJ4Pr%^zds(k$MeU@mI*68GZ}34kj$Y#ay%RCiwqVuCG7Ox%N>91{#tX)# SkK;Uth{3V=6PL_(G6kuRb6>tC$!ng8|q>t@5{<_Gm{P=BL)c6 z)>gVVR9)C;)f)1_S@!ukl9U@UXI0wdv(zFc{80vHx!Qxs(uc`VGWgaa6-(FF+ST3D zIw_%NFXb9U0AFj<6>ic~*|dC7IpeQsZu>C2Qs%_Xszw^lte7Fx)j7RzQmsm$-DHuy z8D2c|YDFD50(h!_g#haBLhZoh`CzU5ropb%jlMyiHy^b;S8FQ``8BdUMB=iBVAd6- z2!gP{ylcXRl(<$iRO6n!2GEIbW96z><^Wpef+g6@SnIC*aeYRq*OHxQy{z%Nu =XozekKVoN&&7&-_L?vo-i9z`hQ#}-XigHGkg(|xtXW`dAZf>@L%ISq*sU8 zkphIajBqYkzTeyN%^E8%iGBZa9BF*oSXO?UYIQ&~C9SIR%Rl+f`>ED-^1iOTSetKb z=GW@x>dPOhs?y)p+Y+DPgydLNS9jmVwOe%=<@fgX``DH<{sg%EoK7ctxXF)xSvC4K zYh+;laG`WC`O?wesrY;Kf>`hG$$^RVjq&yTNZ0VYBNq|o?s5O9$Lq|- zs#;A&Hf)=rf Oabz;qlCcQuJt|9B>(gIj7}Pu!a0f z@TJg2MG!x!hp7SCyHb|+T=6RA5wr5TSn(@n5`jZgR{Dgb0z#*mRCpGg+IB=`KK>NY zYrOc3S$=iBYEhK$=p-8AU?~T3Nd+Bg;-Me6S>C!t R6|k^ zP|v|f%ny0q1)>!rZC6CpVUR493TQaU!M}yoM8MhkvRnb0dCz9j4KcsPz!;b;0s ^3;Lm z?3`PcR(=4gXfXCwhxi?{xN8DLN?%XsuOR*>;>hxNvK?kcbY3(CE}FS+9PnhY3!-B> z3u;Le7!1mO8`@%R3c)b(StJ@uZGL}zr<(d5MNu*C!Aoq(%$WKK91I# Ryv?ppm zC|rfAI%!in#gHWmXQDQ$6m5a@EXyEAH1% MhyZ_o!A=DKvTuVvKoax}<%QCUF1sP=F47n2caR)*BaeawLE)ct`98R?=E zY>lj-i1@d%WMoO6AQcSc>12>I`c!G9chvE6R# UQo3fV==1 8W^D}pcVTN)@xr0q^PVME2m Yp+u3%WJ2VTbLi>66x8fpY<;rBj;f=^erI^E9toe@NS| zD`R`4$@Kk6Uv{Zb?$b$G?M?JUuO>i`QL+NHHIa&Z4Yc=H9bf3l=;Ng&1AW6g!f2^L z?Vdi*XY;9`&i3~PSC+SqOi8U=c3;zzr=m^2u8wVoaE-P5G(-7&2Ul^v22B4N<8M2E zwRal9W1rYxm*@Wwab5*MUJr_mGV_D2?(ch!jI#Oj2P53{QN>xh@F$P5apckUBl-(% z_F0t9G~FYvNFADb^w!>YZ*(nR+})boUzRKF-w}Z`{e}AvK_nY!;x@Hnm!ShOo)ZPU zR3IQ5bKw7=9SDerql+1nnWL$jy}82=Mo)XYD}!m5P3fdw$Dv;E;Gf&UW-3YcIxI&q zy6zryk~Qwq=Vyly(4wRp#C;&bDru(IZ1baWYlHmaqk;kN_MI>1T5D5(Kw-(HK_OMa zV9$bS0?8rJD`|gyus%!*eZB$y2X5Cn%r4-+cCW6k-T2}hzmcu}y7B UNJNpZ}at `wJIk-|BmMS9IsNsWs#3jZ*<54mE2G$& zie&v6cHUeGXJ#+kVNI8vH{V{qe95j>CQelIrzb?iKE1Q_&RihU&)5CpTOr5e-p+B) z;7s>RV=!C^UqFv7c8uV`Mat)k;81%0<;=(H%>5q&Ja-PN%ig|X5`gW4_x2E4klFpS zeb=p;S};<-3Qnqe%za-+zYC4(T%Y@4#+ 4W+&!P}?*OS}>A_1R|hx{KTR z3tM39Vom61v=|6i`&hi(IAWQ-cl^yVy8E^d``6feBm8dW4ATESv>nnj_n>CaHkFTv zhihdjI@{xr8Ie+8_RX396)r<`v~e_7DgWzO(!tkWf@o%&`fF6^mSyx~U(4%gmZb%Y z%C06qyIULo>SCQ7nvY5a!U@WGK7ID@6n~iR?$}5BWf&0D_HnjYipHa96~7zaZ*Qf* z7!=x}b&;)^zw>Y51V4jk{8jSZ+@L+UVLM3xQSCu|9@&dwgT&xI(f(Zbu7EE%CzOAT zkYfM6{8h%y{%s%|FeKFY!1~#Dx+5#- tD_| z@7I@C=`qlVx8MPthigOm0<$?|=!+MKVRP7SAUODk3ph12A;}=Y!OF=!@l4%LHrE-1 zoTc|`4cRgB`|& A4>nuV!Zbfj5yOEb`(-j;TIP+OM9RHwkd zw)O>k%lq2sS! G)D6-_f|0N559M%Xg&JME3xpxodfS^k0oo4B-0sx* zB&BjuwVL*o;t1L-1x^)WA@yUsXh-pZ0hi;A*`0noNE=GbKh{@N*y}7{MivqFNL!)! ze7=X?!rjbOQ GQuL8&~*yG$jo4udu z@~l5y-nS`c(49AaDqUrx4v^ VtA~(XOk6TFrsU`rn#bDR9MPs&=QoI>3R}|14l$ zQ$UCu(>`#w;bd;dYJ6SH1klW?%|)2Z|F(#l)jg_0fOo_q40;GCdM;Z~m7o7bzKcLh z^v$(H6>d~zt7^uWI&|i9&_NmpG=I2!-2h)&Lxg>cSTanRrq+hC-WfOzsrxV#n0FRD zm<>#%f~En6eP|7y6k`4l4S0O7UfLfpXTI0Q?xv+D`G)TH*UC3CH(8wU=fPh)9@vN^ zj5;MhYxdY(2(%=rsVH4(Iy<1LIg@Z7Lxu`+s78vxyo!x4SW^FR9|T?j*3g-}`?-q* z`s>I%b SDqYcRbgB| z!}lU*y-T#GGpKre1ZKm4oQb4$4tyAl47B{v@gN!?C%ah87n77hjO|a#vaoNOW-8&G zj){G}2I+!PoBphUPf{{5stCCQ3!woFN4WHm<(X)S)LV7%;Hu|!sOmB4Z!)}zqmm(d z0iHzNY@!VJlnjYT9ex&n<=946esl%u8Ubp1eBNbI7miVDaq~0afL(Taqv(DEO_ZXj zQQ1IAOBw>)Q`{USH8qiANJfM>Qdrf0COihOa32F^lH;3 @jRncTc-e(H1*AinQOb#Uxo3X-_Hdtl2P8==$Tj6Y8T^cdVy52o?`9 z;?om;-#u+bcbDw|W8`T4)#`eaDlrH)5zO`9;l~VX-w!&Mv+UfYAMclE^muKdv@_Ss zd{(mw{g-%<>{j$i*|giynp9V%8W&^?3rWd6n{ks=r{MUEvqz=$WLbcv&hI3pNCN|I zY)*Q(NIgAO4gpqj!4Icqpd6lARJO3SimYihJ?qtTWCa8OSz%l55(14Qz=s2UB=xke zo*&Dc2I`;Jp+lSB5jNDegE<%V$1Y`|D@u$NvW0$LaY0pMdH%@QUL1nMrjCo6s`C^j z$s}P(a?&}_oS5Y7K((zI-Q~xkREl1RbR1)PI;oUL&nqrZr*B?Dao0*diImpr{CGnx z1@4_-;r24%3Q%v>2&_9;*y`2mbGiI@I%3ckM}r~8c{i}ih1upTcSn @Q${&^_WbkTEV1KoW$miF+w_;li5p5IF$DlqTj&BtptT~go zK3cp+*L~ -4!ApPrps0s46B5$>s?4bHlhr(^ zL;&cX6VilQOr5YBJmj=QgPX9Q{YZ4pA3vvU4|v(xQ)ZyPvo|f}ToJS~Ghf;v-G?SNm|CcaPB@Kd&$-FAroLVBQ>>@m|07kDckq1~Xfzo&2k( zij+ozf9co)VReH)4Pk5($jd4ngk9=6U-O R1ddm)0@ek<$lO78us-%4UM zADyDktuDnru%}4Ue4<@t%5&2z(TRy$DQkf*o4*<}3wkNy{zJ*Km_#*WD$GKV2c+=) z$DC+I=dH6Gq~fWoKhu$y)krJ3ydrFz^@NCn zcuaUoD&)A6oyCcG{!kYlFv}h_6IN4h&u2rt82kjP zE{z$pg}>( >K{raBobki#a9CDT-knFCN17&cM-AxP`(SH_)vvIcEeox&64qNk3i ziaiuqljZz=#Be58zi++tx^i~(WGDdg*&9mMOf+bBEbnjd`1ZYUa+EJvzM3xBf40$` zm=)&`yNOep3$nb56G9!y7qiONFNy9=O;1%0EBtJZO}Q|iu<{^rf=C%g@1ik=GYp`m z^3GglPc$>OTt|P!j+(j5>#e$~&}=8$uWBqljZ1%h;ju-CA~CdtnUMpZIx)cXVlbo( z4>M={#{%Y`($$B6kA;%-oZ7^xNdn!ez2YG|P3i>qR `TE==W6hS_l+T&Vf+S11-eV9Pyc)0p+zpr>5Ezuk?)jxv<-%}@G6mS93xPY# zHMtaHGRLOM;SyPls341|rz#)}zLZK#G95LZS>?{TpWf71Q!a+FqhdIQvD2jT>t_Ms z;jNyOLaT99*x_X6H|uIm-#BMH`AOs5G@jlLoL_WH>})jkQI{mCt2x3+a-`yFdA$CH z3h}8tf@S3wc7LFr@PAg_>}pQjuC<@em4! 3& zOGh{_X>6?P5>ptn))ZEvGwg|to1>`N)pXquU_wpUTs3;?j~z1ZE-tC9VR{73b R&qq@Eg`u0$r*8F&XIYLM!3JAX3_hP!sCBB&Atgmd|B7(eZUMs+a^e zuQ1p$lQQ>Y#$_V@6AysSLW7arn*J`;RjmkCAU%`RS*LsyjMEYG8#I)oK2k~Tnj_x$ zUoM}h7R{aDTW#A$HsbYJ_GVHBNE74%Q|l0Eym%ExGI^SVlen~t)`v|p^bm`b+eK~v z+6qN*5?=N=dYrJ&RpT<1miwXlQceGtjmNmYkh6uKpU`DuTSWln7ktmlewWWk3Ve^+ z=tFPQ>t;Xt8t7?s6*~vPw%*oWbQ hE;3(Lpq z5i5;`3?dO78v~VSjA=z!s-Bc6BF-cSe{5bzQc77%xyEvg1#B7y=79;dYge0|U_H#D zqmxRcq1764e-Mz2w?cgDvGL==yXmk~L9Apd?!y9FzOuxD0Hw7v^n5z&A#Em0
a*YAl};oQ1J^V? z{WhU(p6szYE>f3~!tfH|Gi*kMX)eq_ZX3oFxI7i$oA+4ExBKbGLzv|5m6f2O?@gTb zI9Wo*h(-Xu$xk8L1;v!)*N^5!v|7D;r&LYFj*G~E4_acQHtwsm%h xMkA1-A#d6mMf^ImDW59D02pqO4a0Txkd?B z5A-P|ku)KAeoX20vRHky<~G!h#Ea-^3Z2O!3K%nnf5oIr7aX(hn{rAOj(bP{Kd&ZM z#6BuZu>@Ll)=o8R|KXv>% J8n#k($mA`Ybc5IbL}>5y6#iV-wyr(iuZf0 z>D!3! -#$PQz%V|ibq#p9CZ~>V>*q`!IdJZ7L!ilCTWFxku0QS> zo7aPS
l5jc6haq=WB?_E}~IL5}U87zF}S&ChVX}{Un{_G=x3vtxT7RR!tXMF_;5(h-B zX834?wwV(hEO$s$wlgkr8?fyvgzaYJnH}TAGw<>B746y&+^)EM-s@81Q0c_dzip+D z%_UF68LVU~Yw$I#xc#j8zCt(UB7z`F2EIlnK-ssQ8K!vjdiRgN&Q!y^I#t*ghjCS( z%qjnxTX}@zupg+R!>6_BZMnwRJ_VMP>9=2+VQszN!)2?e2NC|VHEZa?YumG0M%D*u zP9$|E)0>9Mz8@cdMl(c0R+uVd5O5rq!LZ%s2t4g4gDN1L*6s_eaD`{W8{K d~U_ICBfRV}9$h7ASV@Iwm>gNrJ~n*o2cz?L|S zKtl4=AI-dlTnCgOCw*4-sp^R`$zf$S!*_XY0#TwRW0@@Tzz?$Sct&hlo`-s;9}>*? z<-RD }|u>Rl(G1ns* zm&f7Cy>!vb $_bb@m#E9jBFScm4c>9T^vjVSB@n{q$*pom9wE5ci3NInzfR2Ve?R!nN9%Ntc583cOg>WW6gZv0*5(th}*6#qF2ZI6TYKiPs& zZNO1he<6W%v_aiRSP)!^IM3*nqd7^u|AOjh6+uR&^1HNFJfQo{K*KVxa1KEkI)H+* zt-POOlCFqz`aI(j_p`4;p=k_`uv$)1l5U7OyeC0Io<_J&PiW)Dxpcg`&^$qo$WVc1 znAEf_#Q_X1D`tD xlecq3{eQitcuPVx>B}XMT9;FiDR*FofW ^UgdL{f12C#qH+C+Ucq74U_+x~S%_k;Q zQ|c%*W|?t(hscN?PsSyhb*gg?p?G4iP-EHLO3Jx*E1^HGzlBEln_p=wjrp39dbXBl z8j3yB5?mwcL6;WiU`RWXkd+;V5F?9i(iRcjx4S<~or_>~!ez(YjDKKJ?z3d)Mq)z@ zs(p``4xED<3$aolcC@#6FWr0QsJ#g@#1qjt))qeeG^d`fbuLUB^@{e%MT%KL(m~dl zLfI@5gQrmg*A)v3sMKG96Iybz)OUQO(`a_w$=pcdt>T4R@{8}h+1DJYP?7ZJ%6(gb z5L)VLH^%ihedg(jEcg~#zG7Wv*A6p`Qa{}q4DgbmYjFD8y{5^ctJ+eR*q(paXSW`@ zm8gp@zE47BlksLzV>j=A6>sj@k-c`qJgH`pTEy*BPYtQqXIpycfu?STqE>f7wc*~^ zP)#*az>DTkvCoI*P)QXn!!GAoD_9U*$Ho%d7N{yJ9NA+3Uc%i}#sc3GSh9i}1l~i{ z1IUrkz{>0w%@wJZ=VOsj&EeTOLNSq0!HVtUOT&Ie7}y|miGMF2z(EV^lDnu!vqMz> zJ*n0$VZ){ICTO2}!&bYHrGbwtetPEhE)VmEv^+%DR@$!|B&PF}K@R-pzdIaF=r(VP zmZRR QUfHS(1zQJ{wP!*rIc;lhM^C8~%JkPI{Z6B%exd(wSc`iTbC8S&)B=D58i0(q15o zA}A#2@vbf9uwzmsmXsWmQ_sB?INA#NI rpm@3mlXs( z{z&LQTLh2~i+%BfeWq}|P7G!U$@{;{RPzN=yhkJCD+He7Z(4|Qm`O|kh(J^UX^S$C zAt7{u9LeZW{>fjd|75|FaJsGC)iu?l6={be4i~h{>6v M~RkmE8CO1q+zWicIrl;wwa$6roH*6qtjsrNb7epUlDh%r&e#Nw$XciLPm zX0JnqK0X&A33|KEOuM;x1_q`JN=L8Glo6q(5@!OL3lOq5g^zi_%;yjvra6_}dWeT2 zma9K&^k{v3+cTxAJO0@BR^J%!c%={MjFOyv=?A;7*C$K%=38sNbB|$1y%xIP2#h>a zH7*$nJKz%Mvu;6oGa&p1xdv*8%84IBHGS~EK_JPWq*Q^bD)qi@R6>KBB~4Ztp4Y0p zG5M!g8h^1nybL6O L LF4V2*O!_wr>@MWa2(Yb>Qi6sID z3AewgJ5i3AMm|?3!jkDFRi8kM>}4j0aX;Ck59GEWXFpKv+U *>J }|{s*tdxDu4m;$#X6Ii4ENpztPR3)B=|`0yt$P0^#v(9AXWG z!X_+Pv`>2@d5i`L^d0FoIlSnCeH&~o+CZFVyX_qObh3NA08_cmoE?7ch!KIwQ~nx+ zv2dOcr#`=^Z&;L$aDl%}H?GbYyzfmma DG7K?1NZ@%+LjS> z@V1fWTm^##tp1T4PE*a7ARnkfNEFgHqWE>yDY8_VT`W;&Q|MPun^PY_cheRA3V!1e zmJ_mRk>c043n*2I%w?zp2;UyJ_PADSJ-Pc5irCc~!6Ocx>MUl Oda7^Ej7o9u?&EXh*a!yqD5%xd0q+)u7%m8Z%kIe-YQ8S*7 zIy4+xA_6?5zQzI4C4taHq`p(czH5Y3ZSCS14&dv+NJ7`p7xH`XsVu4is*A=b7EQsa zQ{qK4d1j=3up(J#8gc@QP+RT{BME{it_5-I4_7qYW(ZbtFD$hPn9X(N2x~dwK~s#V z+`SnXhS`gdqO80=NFWey@D$&-Ks3SJm|IJWajqGkorQsOfXIUuS@f3F05*1y8CMq{ zNiQx?r}nKSZx;^YJG~2aONHS-y}$B_J`e@3(}^WPgX3iE7T3chKf;eS*bg<$7QA5Y zmLeYxV_r_buG*tq+6}k1`USo*?Fr?O&GQ)#;^?VSB{rIq7VzZU%_oWMO(A18+A2z@ z2IpZ*IQGPmFE722InsT?tXF&HGU>uN-hCw0#iN^N$DStXYTBC|lP@abg}}qf9g%+I zSiSvi%C|s4ZZNQdj+%6_a!juBV8FFVYVQq!z*B$0F~SA5_OEuG>;mthmhVWmrQ8bh z?JMGkwI_krfL@-grd@s9_ASS+y#bS$ATxNc=`KT1O|QvlQ$^M=gdK005vPBD1G7dV z9OwZoguJ6tRxAaovBE}oQ+ytbMl~#HRq-^9n@Id0P%~m<8D{V};5q`OYZ;$mdl3CF zY)RpuigpPN%oc%YTp|(|n<^tDzXcMQG*C2`c_~bv0emnF2-+zSjFRpbY$BQ0pxa^h zTS%Il4onU=RE2Xbc!>WwO$61QLDf8r$?kRH!M#hY;6+C1`1rBd?yxKf9%z>gP@cYi zQi0yE;J7eMh^$Dwds}>&cqN3S1VSRNd<28`l2Iv~PKUj0%@@_)JrJy*Gn~$n(Gx7W z31Ig3&%X1T)k8jR-&mNxccV1Tu?7{R9%EJbrtek6_&nc3QvX@VsU3N}7k5aWGYIa* z<}}CS{oj#C`^5?4^#887-a0n+rhL|NM1y~D{DTHa>qu&oVbLfIh@vm Fd*U zTD~4&XC1xW$eVYjR6`dQ`G=u=-4;=Q`GNms{-uBp^qDG{ C#6+YvPET-^M_XuQ) zV{-G%&nW62N7E;CgN(yrFK=PdW4Z;e>o{cg`UoHrjIv9~`EB4;eX()(ML8S?d5FMz zxj@`AD~dVu@t^oUb5|vV-}Z_uph7WCt?=n$QD&F*?Xp}wkL9{U?33?Xe1*vYE)TGT zT=ppCx5-a>9RH*cO`b$paa!aGC;tDe?Nl&%Y$TMO5SG-;<78O8B@pH{pYcKr++$tb z266-!QVp}vRG*x!3+$a;y^SagH@Xt&zM#arfTZKiWOhgIH8A(KSP90MdJ_mr@ePcX z{+r0Hic=9vzC;LCvuX*XpNRl|f?whSXV_z-@4p-mvq)#?KpbiTv2cG;o>5zwttuQf zoGRlKU9*9-53zp`F{GTs>Yy5J3Gr`HRmMxfqbr^vHDo1{1@Hk%(dtrzYroU2j(&Ps zn@^@(tK(txXUc^jX*lX1o5ZHYwE{5#w{udXoq?)tinKS&|DgiITmVPwXNp;#vV4j5 zJoR^k0o*d<*dIQ8hh2F6G3?Qe>*8VkI?U2EI2-IqOK|hUiJ3d#QQ68{AqSKXhu@KX zGqm@^tJYvu)&~imx&-8ZJk`LQ`hR?8@6kbK?aX-~zf2)|4M(b(N$j;uvuW(4>*Xo&WL!#7h5a06mfY?dwqdmOt0% zzAR0PkpJh~%dUUF(x%EUI)775FHhVCEy^p%n UFE`&lKVXt zTIxiIj5j|G@u;^}^Mzi^HS?Zb+CUX1#>U)c=x^@!A7vug!Q?h4_Qs uL;{!ZIn@S27aww-{Et7G>#xdOhlVxRhFKR@c=1S-?y*>0pD5 zA=M$Rz<3(0&s0=4lgkZV3p6e##v|sG9^H&A(fud(ml0D%&tKiZSUQRpB<`#&s0CIf zFQ577&7&fI7z4SnbjRr402(#6fF^q~g9%m?rA6GlV;`Ze(zIb>j%tmxXuN&?Z+8*R zbD}H2)X<8}^vMEyd^@ihWJHY-jErqB8+NUT+QiOH>j-QDB=!2nz4OVr^8VI%hp6{0 z&Z~9fkXht7>H|JBiq806d`ht*Qk_za=bujRM=g0rLg_E<`BRWLQ)8J)3Jk|Qh`Q8p z#cF+9?T!mC<#9EcSo{)(r9r~uCYRLfh1(|}&lZ&MX_Rw8sMXFTK1)-)zm|2p6aDfZ zCWlj9Udp+wtPSs6MxD+~W5{H}mA=O4(4w>DJZc50;}}0De}O$aNNwRU`{pUTVk2YK z!{5lc4(d|>2xfR{3HlzwB<9F+@*aFB&y?d+ooeZ Te7xAdUZZ^;KKK+rsZilHe$(G- z&Nelj;>(`z=(TZ-ofV&H7HapP1aqCfSZk>{Ex|rWcj=-ige(Vhy>8qWU517A{vrLN zACw%j09`sAzle@y7}nvEhal!Dx0D_XnhKKMzg0ReS&P`gn-P(ym%L#EK>xuSC1UX8 z^XhU7g@l+?FU7K%!42Ra%IMl=*KxU0*}2qi{5?B5K>b6GB(8*>iS%l5#Htt;YpNVp z` 5QCe7@tZ9R=h7-M^)-haqu}e7OlUW?`1a;N4h-l4RU0?kbC$basys zE{t_?h}!-i*rf(LmpucH07M}iDd{I8`~!7k4GmjA$fJYE6_gUT{QLImd(15w`u4nB z+2}Zib`lp)D%B1i-^v&$WXdO58PQ-}$F2ak*-1z4uoE22DpwEW#@(O8r9dGMwm>-? zo>sm@jW*;2VL? MvFr&TVzAwrjDj}h}-QguvwEob5=gkP`)|H4O zQT&=IUH1W%$rM3MExz`v^S=ld>lUbGj)Ji=)L*2gKq)aW*qe4zZhmkO5Cp{J85wNg zw`RY?A~SX`*&U+FwO$Up!Gg{9QksO*K8RS(_L4or0e9nKnji?3B6K9&4Rd?(9XotO z+g{st^F`JVh98Fk#gb=4@9Cev-+$c*3HnW<+KPsh@Y}CnlQc3UjdUw5exLMrBP0lE zrEtx8b{ H{M4*%no_D+e1U*&QHMX0_-}Bq@#>Gg5eD@k-OB$F2#ezS% z)q*Do8_sriM|Mry&v~{IeaJi{`C&G@7-8Rd+aEA;1QS0RQ_^901Dzx+nKywlZI)=? zsnAM;^(lXwAq`_`5jj4}tbk>$4=|t b)n!Zm! zUQ+~YFFjo)^Ej 1+nFv!{8`(kTXtY?v VyF~8oWJ2rAF80_8;dNDOySCe- KPeBr!6` z9;Oxz^1ccVvS*Gfno)nD5|n4o(FODAG}wk5b~kg3`VRys<6B8=U+tr7s6pF;Vp=hs zC~*Tvhu@k}5ckhvL-$);LM1#eNyw0#r6KJy#aA%%P v@gXR<8CGKP9)XW zPzQS3Lqh30ml5yoZtinn4}%e8uLvY!zyDWX&PA(jimZ65t(~Tv#P?!oq-qp{oVmOL zjF^aKdmBFx2lYzv3cu@GROOuu+WoiwINCyePYnun;aCOQyNAV9K7{5wBkWVPBzb8? z(`uQ( xtAunVA&DiehtC7rWtO1st{PZsZ2EnO-#dQ8%dPAT>u%RN<}c`tbP zM_f$}@^z44{D#RUszP8!y2-_=tYE>q$*ZbdV7= WyHt`pJPBTwt&I$( j0o_J6O|NCwv=$N%4-IS2^qe-HnS|9RVkX0n*3AZUJakS5vxuK}o5GZxf2nO}<= VEQ>O^juI<5Rtp*G$mqX){|`&1DwqHO delta 10595 zcmY* 1znHdGos{)T@fmWM7*EEXb#0U1s_AwxJklrAxTv@N$;6u6# vQ7kkA7}w@Z9rg6Lkr>0=b5kgJU1=CY81dBg(7QWNI(qjSH(pFhTr96 z)0xcuyLWmMx7-POK1V~6ZP~lNqV|T01Y=ue{7Jr5ys<8(gsSR6LQ*VX0d091{8QdUlwJ2fv;ksZ{A9M3ENek7(Af@;;OYeXi&7iG;zrkU)C@DYz%Pui z7!Iznv6c%i?w14hZIDY^3 65UTj_8Ue00oaSR80D%cX~mvHN2;ULkkEV;i8f`QOMRqw!gI z(tXapj?(lhKiabTm!r9{p|icWHAmVXvS$=j&38pR4>lOXea=2a4NN$n8^;Z%s;S#_ zZsLQC5_^G@5~D7Un#dd4^tenXHho<=7TaV$iIqoZ8P_CO1s{CdANBQ1POp;Z22bQ! z7pC} =dD{MFzJybcN`-xnc`u=&l_4R7aXQ{mgq2&leGHRllj|Gwe zuGyF#9m%xX2U+VXYpFrl>nsFW@7Q{K>Mp<9G-VX3)HGN(j^CDhvzrDMj|fORGp;Ng zoD&&n8ky^`EVN!kkC#4hN^R_zaw~iRI{HSMC0&DP)^zvWFC40KsMBQ{twqfTwi03J zY($Blx*T>phs8R1$h&sAo7<{R7xuz{T?V?YdRl5Fmbl{bambgLtTcoJ@;B1chQ)vQ zi>F{Wjxs3OWhJ^eH8=OCCP`NaYTZ(4Ewzx%VZi>X*I4K3%&Cf4X}wX}c5QVn+oofg zyEE*PStevbp17GgsOHzPH5sd{8GpZCS7LOBUw+q68CdaYbaqBK=}dVxa@f28()Zwl zd1~vZTo|Y=EmUfExL`i|zHRy|b?GsyEbtm?;}bpPz! ~G0F=VxVw}?Sgv$1w{ z_q0xqXk3jxh2o;rUT{Gk@lY`>TT;pRC?8!sjHr;&cQh{%-S^0qEkKUNEImz*%iF z!P +9fZ9=%hBbbw+Qtv~oANprqJXSu4S<_oTvcmz8-b zuQ~hU`g)KY*;U%2>dfMX`u|q>IB^)xnXpc6g)Sb|d7f@ SJ?2^Fz(2IRJm3=nJyH`d8^&zd zF4EDMQnK*cN-iE(Kg?`vUFNv#=f6tq!>m`cN33ubCpW#<4=Qn_&HhTzT?jQ;W?gqt zsez?sx2yuB)B+-4+wY}?mb8()u^`k}AsG112|P~PHCy0gU7R1) #CNII8+fb2s%me%lR~bqMIKX6b;LzF zJOX2{R%eIJ+(C*8Jvv*fV&csqO$$qEFB|DsDlP+^@9z$GEa^i)$H&jZv6z>qse!k% zs;#4{%G#F)ikpKsZEc;R+cW3biZ4fd#z0s3r{cYh-H)bp Os& zWELSR|6DoI9QxT2RiQYFO5-?`D7uTx?k@QjumWD!64kVKa7}ACzyzHcTq!EsopYNF(pjj~IhFjp|G*Zci z#teSDhaJf|;%VRyQjBW4Afyb2W~7!u$3Y1g;8zlWWadl*I#MYB>q%CHtmph9;c@Zt z9SEmNipb%o|9a$L@P?z%6GO#BCm%ELTSH3zk_U1N!R@I#`J%<~<(S21V`SO+i_M#I z4&Ln{P5{!Nx0d`uPT}E{(4w@kX?mwQp-oBrRSl($0$syX%>U$g7zkkVaHD0BFfK|{ z`iU^JuA7 RHi9>K6rK&)vL0CLhOC_*rKVC)#Eq-DqIo_NojFn zp{ak#ie5PM0e>_lp8(TxREAR7Uzq^_uO7949Hb3&JSBd~;arp)5HBx5Zs^7?q=*fs z3>OX&&6$QdGl(>obH}Ukwf_? E}VJ`_rw^;0PujQAUvE)L5b4Xz7uyt z>j6hBQB)@BNG9($MO} %OX z^AAQvgB ph{$}0#GM%{TS*KykBCy{my6AaJs^dl z?yFwmeQE9%M}jGQUCxAbBPJ$Mo}(D|JIprahLJ}C?T(@Qoe?TCZ~0B;#~~x;BW5=+ zM8TD(Z%Ll )iQ zR~A-KX_=diVF?G`+Z?M7Af0Z|bUAS7sI^6KK)`O{gcWRPOK9v&%B9xjzq9T#-57#8 zcKyLqnkR_2Z%mG48gAdULW{Lmf@T7YrXWkX@93)H@;e&3J~yR}EPdk`Ea3URs?G6H zf6Obrq3`9$_|lRps `}Ms&0=~;0JlAdXAs&v)k-bdZC%xIuENeX?AH^dL zcUYlZ`<08TGVZEJn+K2e_7v{5Qz19Juda9cx-9H|48;4Ud1)wIFfbAU2#^geHgLmc zPqem^uiG6~KT(1)) +7ND