From 469498f00811216ccb3629ac2dc15efa5b598047 Mon Sep 17 00:00:00 2001 From: Matthew Thomas Date: Tue, 29 Oct 2024 22:21:04 +0000 Subject: [PATCH] feat: add failed with folded details --- .github/workflows/failed.yaml | 2 ++ README.md | 16 +++++++++- images/failed-folded.png | Bin 0 -> 55747 bytes src/index.ts | 37 +++++++++++++++++++++- src/views/failed-folded.ts | 58 ++++++++++++++++++++++++++++++++++ 5 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 images/failed-folded.png create mode 100644 src/views/failed-folded.ts diff --git a/.github/workflows/failed.yaml b/.github/workflows/failed.yaml index 27605840..2b25e8db 100644 --- a/.github/workflows/failed.yaml +++ b/.github/workflows/failed.yaml @@ -22,6 +22,8 @@ jobs: run: node dist/index.js failed ctrf-reports/ctrf-report.json --title "Failed With Title" - name: Test failed no title run: node dist/index.js failed ctrf-reports/ctrf-report.json + - name: Test failed folded + run: node dist/index.js failed-folded ctrf-reports/ctrf-report.json --title "Failed Folded" - name: Test failed rate run: node dist/index.js failed-rate ctrf-reports/ctrf-report.json --title "Failed Rate" env: diff --git a/README.md b/README.md index 5004c1f5..77338fde 100644 --- a/README.md +++ b/README.md @@ -123,6 +123,16 @@ For a failed test details table, add the `failed` command to your workflow yaml: if: always() ``` +### Generating Failed Folded Test Details Table + +For a failed test table with details folded, add the `failed-folded` command to your workflow yaml: + +```yaml +- name: Publish CTRF Failed Test Summary Results + run: npx github-actions-ctrf failed-folded path-to-your-ctrf-report.json + if: always() +``` + ### Generating Failed Rate Test Details Table To see the failed test rate over time, add the `failed-rate` command to your workflow yaml: @@ -490,9 +500,13 @@ npm run report ![Failed](images/failed.png) +### Failed Folded details + +![Failed Folded](images/failed-folded.png) + ### Failed rate -![Failed](images/failed-rate.png) +![Failed Rate](images/failed-rate.png) ### AI summary diff --git a/images/failed-folded.png b/images/failed-folded.png new file mode 100644 index 0000000000000000000000000000000000000000..0b4e198f0278ce180049817eadd7528ec44baa0e GIT binary patch literal 55747 zcmeFZby!qg7dK2vh_rwLl1fM^BHi5~-3lTgF?7QaA_5{vN=r*iHv>os(#X)=Ee$iw zd}qAx`+4Mk-s}7G`{TP_u4|ahIcM*^_Nu-1Z>>X^hMGLVO{$w{XlMkA3Np{o&@d5b zXy~Q5*uWLG$XPNpv|AE3($X4=($e%A&Y)K|c9v*p3SsejIQm-ODbkH%q9v>|mGPSK z7@uJ%;AMu)r9?(!;Xde+&?rxoy#eKV_*_~~_I7cAzJ^TsSJu-OeGQHA&L9)7Sd4}} z_W6|k6k+7m`Va6xs<6xcJ+v`3XPGQx?Rxo^W3-GzH#{%_d(5+Ky1PR`z;ECv-F!Hjr4g z#Qn~%7@Uu95ifNtEy{~so3QNRV0!eKdo|*pJOlh`;T9!60*45>04)HS3(c+)#S3eL?(Se znjAVmkQOU`uJfHVv_onA){#5AmGh_DMG`YCDpBu)^vRZpFw%d}n#aXFz*CH#&VD=N zOY!6GP~b#ZHy&>A1o0C63x}6=LF$9VSmg|F*|E}?S)X@H7vuag_xFFE+WsoS)48~v z(lCSJ)njtF;0OIRy{+xQ`z(P4L*TSdEB52ZKeLL@@4sUsHoAS2l!-w%Wa6o3g|dsSYbor8qh#;NuUnduu1z9pO{^(oRGd*bX6Wtc_*iH{(XGjZ%)xf_8ymJ8 z!5)X{^sVUT(Rk;rl5Mvl6=F_s7oQT|4islt3WhH_Au3G8Sl_^*FLeFg(C${uNlm_^ zIk>$fLX7Ra*et`RB(TFtA`;{{!fQS!6y=1d{&E;mQag@8s0ag`ZLZ}$)mWs+K6_T!8yBwsLH`rGyoJ2G}s2Y>g3cT9*ZC9kA@!gQ|(<$if@PR96hH#t$a{(NBCX!i~O%g6OW70 zhss|Slh}5DQ2uqW<;`ehB0Xnr`D;buUYj_aK-9p7`6%sms&`sT5A5doXwJTMYcfYN z7sbn0gZ5v}=^A;#SwU9DKGDA97}DKECSRp0M425wY=*D2uW0Uk#S3k$>h#@0{J zV6%&-;)iLKFIv?@dC=BBI6hdC5)4)5#yU^X2o_eQyMyWS9CLm7)=U890cIfmZJ9vN zXbk4|jmiZf%HV?M%%5<=CE4`R$Ag@|-nGMQY&CU6;|;J_xGjLs71XyNREMvp&hLqS z*(Q8&SCW`iO4jRz-X|krBz?(TfyO4Q%dpy`n?p4j zMI))ku>MhPh3}AfQ`VFzL*tf?WVHs<*v)$(JQ~bYZ@aR|hE!Z{8ouF@NzB|He&|YM z7?m!?odq4{I=&$kfUa_Pv`ytP&ig>Xxp0v8wRTL{6=Sh~EBtC$j3>5Uq)#~>>emq_ zK#;#o=y)S^0Z)K3BWSQIacT9OtBDrWS++#<%O6f1sPyRm1epk)ofHp4?4x)M6;`Gl zdK%``K%at?gAWS#w}?x^_8htMh%3XMyi*RN4s+{>?ND2?SV9Yv8DW`>ZBo>{PgoG3 ztuiGsCHsCQVq+0skNp#uJxMDiuH^Y6c-=gA14}T5qG24B_7JYuO*fb z*SN?I&kIkxschL4E@PS0s}>*ouvTYIqd=RzknU-`p@fNCNnU!M*k^x@+ybG(3LURP z7j1U!ZJn|&E!s>)28EA*G8d8;#24JtZp<0aSJSP1W>w%aW>uv3g-#PvAof{u^iBy$ z?#KLcZHwA2uSiKYbig?cQ;6SHY?Eq}$L*p)+11vqY@-EA zow=Uh4P_rL8f`2+Q_Lu(`;w6jc?OY0wxByaw<5N9^z(Ua+uh(65<{jYIY;@p_X3ZW zJ}|ttwz^|0@XayhMdMYwPj??(*}bw)c+NLpJh0Ou*qQnw{Y6VxQ)knBdk15? zd7f-!=RM_$2j6)5oYO2*R(;rQi|!Z6>JsRRj(d;WZ8L6DZTs+PQ=6r*@#*kE?ZRqq zP18(A)+Fv~2mR9) zBP~qpCmIh-`08hzbL-{mxSZ{suC~_pnB9xqw%uwS)m_S5A>W70Wu7GP40sWXz(v$TtZ?~W!U_0N3s-P~W{J{8|Vrmuca?i9Kka03e`4$BqmH8wL=0*)9i4}R~h zLcA>^cY<^hU!FI_q!blAE6mgH`YrV;VbZhGRv|TS3*K~w#D|LBti`7c<(K_Tl1Wm; zv?psQcaw=aOX9ZhYqzm0>+KD;VR?&pkB1+VKUTMp?;dz>ACcXu8a{pRjB8HZ-wQsA zm4c-xrJQBBbl$Pmai)l_SQOI`BmZDfspXS-G^2uz%7a|yygh|`cPIrMcI)=XwqC#(G#Ca-^$*KODqn_`UM?#h10d2GeJ#3VHa$dSm*7-xWkdd z54cZ51lz~Icg5zb?%ke@2$wa{63H)48{sA-+wYM-WLe>-ux_Kfa1V=Iq5S?$Dx*ET zok)u;pEfn`v8q6cU&HM2gV7A~8{}7fm>F$p!#ty|YfVW+R*$Xh(;|PUWz6z)`wp}V z&bkDz?jyW|+enT|Wrw&>iXk4HCnlT!G( zqV(j8OU;Irr#16;AUgYxCNvwCx78L0 zN=?ce4U1-riaeL_k;Nx|}i zj^{3#N3Dv(-&?ej@@Z>TUf25wT^v`Be;WVrJR`PriD7BsUmdB>QIQ^u2Ug7o64DEB>h3Zu9S zg7|EZGrF)LAY&Sgo+Ia*aUT&J3LGiIE%g;&sj8wq1lqW0Sm;z}H-Hv8@DW3&{!d#D zofQr9_jL?3v``x~tiPX81HMr|(ZC1Q=dW+fn73#+z+a@m$MZABKTl&KK4bpVMlS{K zp-E~8%hTQwH4d7Hrx4Jzw{(3$?`d!6;3DKH%J};UA)t-A%*{yu`w>@LQAT}L z4SH#ivn4$r*CVb+jAA$G>FGtBU%nE0CL{NEci=BkMr&7BM@wBuvkg>4`cm~WN#{1-v z$nWR>=gxm;{G+G-e|tWD#KZGv*FSFkyQ_|irL#219+=Zr?7#B*yYrtn|L!QljavF2 ztoV!1zpny}7P~3J{U4!;-JDg?=>X(NVQ*NyBT>8HFJ;*1(vIAPTPc1yk4bu#7d@F6!yQvj zniR{b`j9;7A%m2nW+C!uXMc9RcCf`K!)Ks*eWr0xaDV;m((Ux?>6C3Vv}HbV&~VT@ z-Ps6aWEJt8H~@^(w0VfE|pm_%Z%swsT&ZrkJEH#D6-Qs4vr|rvK zgeR(OVqJwc=na~^-DXa{q%{foH|IBX<5!@#o)o9$0Ed| zFM;R9QioLPh|}VB86+W?NaWEy9Zj6;))Uyo5OARG{KcsH^@B3iPa0p2D{_@{EkX&) zw{gL5Abz)4GMvL__9iiw{ORS-cGz6jemJRLgj{D%v=as{@-}hQSgU_c=zKL8aUt(b z=jWOlEq%@e--Xqk$0)zlXsvmp>!?mFTwQ*&1&okV* z?pBz0hUdU4{I9&rMHejXFSy{5NLrsgHga}t+Jgma|({L{o=_}gBV>J&rAI!T?+q1B@Am#L)st2H}1#fTB?kXaKbs$UYZb?);r7!U97HW#M)!8{>%6kOmUHwgM#ux z9(x>-DZC`g{Cf4ys}n<@xu!`HC6uk`s{1xlD|flhu$RI;2ycelsMw6ba%Snsli>R{pLNJ9VoMPY4e_t zV2%<0q*M33G^dE!G0Z;Za)s_)h(%Y=#&C9Xt-#ysT1PBTpC1AVn_G8ttC#%t)+vop z`07nS(;y*Z$JdK>v-?Bpc~HmXM3_@8A^dMb(dB_ zdMqc{UdG)s+juc{V2ApPS6=6tp{Yxo#0Wi8xA^1coeC*371`?UAXVDYqQoERqK#j& zW||-dUtJMsW|PP&4Uvu z&?U(tjOYd>ukE1qlJqPg$PUHW9N7qp5V@Y&Y*C+aj>jLzluQcyON4q}*(7EAoW5_2 zS6c+3W3PX)t-(`=Om6MQJWyWAF3`$d91s?U9odc-Z*s4tnt38Fc>Lk#6Qa}9V#uRG zX}vPlFNosOMKJOtacsENO>#d^0yjM@EppEDD|-7&2+?+=2f`uT+oZreiW_peS2^TN%*S5Mt9Zp_jioLfW*u7frk z?M8Y*x`+>%(yOED;_-a;Q}0v*szCEC8n-Zf92Nr5ou-N4Zcc>PVvQBLz@D36<=q^&9>gu?o~@0kgM=1Zy4qc)sAz#OUdR$E}ZEX$_8<*jXnMi%_@4IQL&4hp;}9H7za}zG@R@wI1Jn9 zSiNHcOGi1aqe79rEW}H^2{s_?d})*K72$mA`g#O`^&qvoIvG>>rz|PgNg_@Wd2*22 zcu?8wm(qPu%dfX*&vqteiu(JfY?%>MuZ2X*a<$F}N1KljI=(5X8>N~v5cm@QzO6-f zS%HH6Dp`ShWwoh`R#P)<&S&Ih?X3A=9gZ!uG~TbuSmUAiG{y62%pi`3?c!QZuQuEX z$&O8*=&GJgeDh&*x6_0T9+n#xlBrVA4BK{+ASCCZRW_q5=NQ}=peuLZBhFfdX}`0` zM)+k%SfByM(oH9f>x&@|OeIDzfAY{tJYO>W)abEn;z1rUw`Umrh+Rz^IqN=eGN*aw z2x-nq$MNHC9s>)yo2nnxfkphhcVyYPzk#$tw|X<5^0@=oQTm=nj&ibMZ9$3$<-+bI7dplIZ6dzgQnsG(gFz9!10u_eUUZFjC0RI-WKWVy8sRL)Jz-!3b zuKf;bVY5o}%G;?LRpT)^3xw@jx$Vxg+)oHJI;|R2Pn^aWxg#feZWW$*BFb@tn#^Bx4Ym+%djMPC4sYh9sXzYLvjA`X+YeeInBd=- z1>lhtR|r0m=dq+`wrEljM*-J;3^6VfvB9GFe&yf_(X4IS`>Pzro_$8Me6@Rb&qkCh zl-uTzFSmXrevdl<@BHds)o^Q8PvkUe7*k|}%AWdIUq9-+2oR=JpH*h#!`XnntmswQN+26m{@&w?~=3|SM1+}ypXxuq8at9oq7e}3C zGY?PL@joehx-6Ni6u(3p6?8Con;Rs*n{t=Ww@$mvbk?W7$08!dab+=-GQ7decoD?i zw7HhjS!0@Wc_nsu@Xfi>JNDn_swOOFwe!&WVjp4qf=k4R$muDPqRmf_U}>G`oz*Hz zo1Tqw8dS*CoR8FaP1|?ZM9m*I7||KSWK1r~XazKc-1a!KGyJETX<&ZaCABLm1jLCw z9CK~!5ftPPNq_SyM5u_8a3n4&(ZoGzXEaZBq}^w{*udF!Fx}~Ayv(_gY|XvZ6)iQV znl}>^@h@u_CtN(XRysvJ=Iul8Tn}Q=LnQ|Az+^4V0avfk_ez^j4ZSQz?oU?PXwB?O z>X~sekHHhz7U%UsR)Hw_+>C`K!!t`Ii6?jHoJ8nBG0*z{@wX79XhUGHboXZRmkO&Hd%C%G!Rv9$VG2Mja*}Gp0X9{=EceqHT5CPd;SfJ# zv|t$-Hz%j(c?A$l$6P_@zrj#1JKGdtyGDhG4EKc?@Lr0#PjhlT&4j$~#Qu5*-9O^D ztifgxLh4l^9pW~zYK!}z#4torS-l)r-GLO6)2c5JOq!*^!1d4J^RHu*mn{AI8>HU6 zFH=0b-Un)#=}tm3IM}rlh>6#c;`&7K%w5J#l z+cgXX5M~`#k6ZECp4t_Z1QJ}m8s6}s^Q%HuxU?VLB_C>O0W|e&xj8oIPrs2*pDNZf*X0-{pB=bhOsL8tpK<#5MgUUKKke$&%@7 z38%j;WZqxq@=SV>=FfQCO9i!n_Rff0AkuP@ZUBPiNu!W>53?rnN0K&0S0#qk;q3eA zFO|-Xu3ng8hcUC+g`CYdn6!aRhrJT__Qm$jm#<_~k3Q3b0e>2!{^|#=n+0GxwOv5q zl*nbWQV^hU9yYTIYFVWaT>kL{|5x(?{Kyi1{;Pajx2yMZ7dXenYPs#V%(shhrTd&3 z)E@$Yb!Xa<$2{09nb+poMtaHl^eN`8KZzy|2q5VZT%@bH`Pv7bp+jO>RR2oU`#AcD zt4_jw#z}r%WFtf6CfLXle0s4SY`R@M2gxc}>iTex9kSKy(&)as(pyv-L*cV;@}bU*!Hs7Sw9_ zX?N44(LJ68zooyf-P^nfp)Pt7_r%?OP{fdS1Q#*e;BiJ7|I~I|p)yYu-((%*nq@{q zP;TU`5$-IXnror(gbiNeMD_+dqt;bF(Wu{I#6FKd*Lf@ao89b7YAbQT{F()$V z(6}o__c)5&Ry`{&xOUz><-PAh;E+%q`t=>0E-;l0L9yWQcF*bz=Ukb$sz#~dWZa1I zVT{cpXz3t3N<0CG=_tHCcqrRvx;QW4`N`&`ulkd}YcI!LZ02WloHpqd>2mHRvEm_B z4hl2<5ZZdPWMP{E^etr5q2Pl+oL(Yv_(CJoVPONJ)?v0`$Zh{d*}?u75?DX}{T|FV zn94+XZtzYqEzQ4u7&nTvaY3>cP@!;ReKV!yTJKe6X@luhEhsZ9i2`vdMOK;pbYeR2 zA#H3mr%{c74c;IDuFCrO3&uHP#5NYzrAuEOgaR{DIbZGYv~iz;v{jQ7F+QhqP@$N` zKkxhG5o=Z->jpIFF>NN>X^;#ge*RU8{mVRmvlljKCGYjlr|bQ2C_Fwt%T;nuu1bQo zIr&}QR?a`^wL^h(fx)B#&fC)H%ivZOd7`()A-jm z^Y0CdKVN8-Dx1<_%4_sl-(3Un2y*8$f2SFN`X5hhh$#Zfz995_8~R{piFtUZRw)Y^ z1x2Gk*u+~i->8u-O8EoUW{#QaHEs~1dsy=6Mga9$J3fy@pT0OHhq3;&HeVZa*MBYq{Xe-^40R^4--ko=MB*LA#kxEv*(2YYH$FsK_gU1h`6xZBcLIX|si z$2kJYT{bEuBkHUc)z;oGLEqpAM*?St2f)S`+X-xnwGBNYiEO62AbEmT>$`Mz7@f@F z?;&2;#iq>-`d77z0hcG+!lw8&ozHXqBj#T}hh#AxK%uNx_k>&>MfB}RZ9Bus)zEsr zPf_f5XqQuUO8S!5 z|6pyzxBzTKg#OL)UkDX(fCLvY0F<_~j^O<7EnEQM#J$5MeeJA=qSHALfPX0EK8ju6 zrBJt|0039I)$#6iKME*hG(JFf{iE<>^#8dlF-uY_9i=e*cTvz5&)68nDQ7&FP_-MNbKk?egOGCg%U%dIPK# z>sI3b%AsBY05I{h73lsI(F08Rzam0O@BfMjP<4s_@2u$ak2l~VK3E8E*uPCF2=7Od zpy)Za9s^pS24FZEyffFWBTEi2!D^CB(MbuwS&D<}CJ&N^Gq`PNr2vrLNnKWJfkE)e%Oo8BnC==P3B_C zSN>_P(dvNfx!|2TemV;@HkpWPAQf8!{gB#0e36iR;)d4 z1MACvbhGNZ15;1{W+W!!XNZmldNa^E{Mi`|Llf{|QSGclZ|xocu5A2c_UxZ?_b>s% z5TUYbNOlJrRZO{3f3jSH{vUcTWPnN3vsKNmEh`sTje(FOuP`al_;?4K>U#8apAkqE z$b|Y3E1;5RpNKsE?2H!p52L02VZGy@bFcg(B~@{N;g?Czn67!o=vM%}yqLKSO~53B zMT>cr*OsLQ+})w!H@rsxG_2oamR#31Qb5Km0pB=rZv%2O!=iWiQ;*OvEY*Rlrxp_U z6^Q^#eY!s+{CS@qgwnHDUpB3=fyNWG_=nfmbqr`yej-ctDkVU;eXsNjpysoCmzMam?X=ofIX9f#q6~Sl zp0Sz%Muerg{Jp0-0@`3g3YVgH16DSc^a~5+=oCoKp?9r%IBVyqpn3mfkDx81%ZICd z-2?Jbw4BgeRJVn>i-L3e5|se}#JsFlF~SH`|G<3!{V%?@0_x$Rcz_=`227x3)kTKl z=ga*B&eiH)%Mr5Xz)^bywvioiVmBmR2Kn`t7c?ibH@+Mt%FJ&J_S;D|JCE|Zw7JXc z_0ynUzXUsz_(l~cv?f9ME+lgkr3?@PzT;r9JL?_KVJoT?z1L}-I z>Ab%Hc$m05CuIn7r{2X9$N)v1l-J?7tpE5(+n~z$ux3JsY=VSP7OfcD04$@4f%rbW z)^2hMcR!2%$EU~AAH+{5vchwHApn{+@Prw0l@QU6Y$g(mPV<n&o9m|^qSSuG z)${6jrtvT%{Gj#>NYG3=0|-*Z@&{q1NUEnRgW||I05Is?-U>n?0E)RY(?BxJ^7AV~ z>jER$* zaoESrV-(Coc#lVhgWOzmTtk$^`*erR{%lt7bjC$}(tEqaa#daYdwU4}ZxG#yiq8CG z>!;IC{nWQ6)K6oksA^kVxXU;Vs}x$a-Cv0#&a-D+zYz?SpJn)+O{)_Mt`OTa4~mWC zI9U|v7sSL)wwa6i!hdxiF4Z~BEzzL7K#ve$cg55^R5T1g1D60>70CQngh~j7fSJgB z21Q`SV?}!03~0)O9-pvxkMO%ti8qJ3UtM)pDf`uW#`P~lz-4pItEG+m2}%#CzWp#> z!!h$I(N}7HME&_LCRhFONS(IdT*Z+XOvQVib~AaU*J&l zJH*K~?vOUxPgBWl>eF}*NtWA6;)ri{1V1*bakUw;FGT^K??eDoTnT-LEr;6i+JmJ> z0Uh2TRY*J#KmPh{MN_qTz27q93$*6-oEFm%w?V~yT@I6W z3uNufkFp5&n%8OXirIbADi&ym05)h|PWT$|K4V3xFg_cXUPTr`+WU&45)3FKCIP&E z)X?*xxMC(?8)#t2ZUfZ&Hg1mcxjJlxte}i*)gNXw+sCd~N+ZDVymUIDbgarqqcqr-rSLN?fS3Ag!IMJ+Iw`+;Qx(Dd0GnIho9+bzK)+jQ|2XHpX=v#^ z5AltT8k3!Z)PB2MNTq}7L2{T6kaxJMSO`VbgsK{PZZF(H#c8(z(?;cy*^B@$QfZlE z&4NWw%!UEv-%v?Hz3!-}?Zo=l4A-Tw4=F8pHM9-tzUOHkK;BHpd{sq-?^uN*NBSIG zEVy)KL}2Q(`}D5kPaV_=m*$seF0GmG_Xp+f6Kz1XLr&VBg@^spc3Fffqi6q=@QZdV zFW>-fnH@d?ILrRc#7@!!BLiF{P@fPD)G377_CAX&acsw95%5{rl>w&y7cS37gtLc0L*P9YY-aI-9#_1!A65sQaxwIDg=Cjw# z59ABtLJrJ;%8L*3!P9rBL*09!%py(hReMnoAQ#+}m`V=jkNw7yoL3GYHs!FI{FV|B zd+;p0woCp?SsS&9&t@m(YCr#+qxu8#MTqOgp}_vll;Zl0AbfMT$v`jLnapXtUdkMw zD%-V!=Z~2lp)`3C6=A7n%Nk|>6A1$2?x^17VGYg zDjQ5OKedN5Nkn{z%e+BTh_IY@$Yf3<~@J9pUHlix~Z~Jx9 z9CdWq|1YeSY@a_>ZG<()ZoV%$h|*2m!6X!*Pg-)a9ASg!tE4?_^gL|uZe|UOt#62# zmDaj7C3YCACMLKSrn{vC0U)S4+dah_vo44d?tB!7Kl3&2Dz8B+xOr{HSarv+&Lg;+ zZ&RvpyFXc2_>P3jmyU`eO_gQOr(Kv489saUQl<=ZLbDbru5}CWqt%lzvRP#~>d?_c zh1weLKBS_OL~V_PH&ufGgI1@%*Dh{XeF0?eJ&gOI#iqM5XJyq_ry+onYMsNfhpDd; zb(-Ezeh}WfvwjoA{+%LzE(>8cUS>99L22`~9m-ql7d`3kIZe4=Jwk!F8XH{-XD>VE zlVmQig#(BfxktZffk9>7avo^&;s*e1bd>kez#`&t#{PKcran_90B2`*dRA5oc;ow6y^QiSewP6T(XEz z6;PA+jw8?&7mQSDv?t#vwOMW%V?8q6&fGgB5`%v|duA966U`$zQ~liVs@*a1ErAvx zA!U^ncuY(EJEW|>t3+rIIx=P8EnF5~b5MKhMnXZW?RtiX>1X_wT9v|X<~8n?bMsCA zjm(e=+6i6UY0^bQCxFnVt7Lvzs5Ie6Wv*szLz{=#`G*aXuY5+-mWB^{o1F^TRt?iM&tQqkwsyN@X64ksRN#YJ)2)6tp=*y>DBE@Qvt=tHXil#NrG*v3Ne zYJq0<(wi)Dh5Q44lFN9xfU}0|lru@_K-wx$qV~adFc8>EEO_w)JldC-BUg|c*-=8P zYc>l4E}>^rS+Wr;8YeFg@)CVykNWq?qL*9lV?bd8{{+V-mvS%<4F!%68#=HtE4>+b z7UTIeC6H#v8s$}LshzVK&HMhVo0i>;ce`E1jQAU>+{wTyb+M#f@bt+gP-&H0UE16D ziVFs^X_YOzQ9U0-I^|AMMnEN?(Pe#8vTSmt7d|L{W*WoKtQzAoASS#=#qxWLQvaU`@|`|RLp4MX#@p0Abdx9%w(FqVzzzr zHbOUles;dp;Ql#aPG(}MJhFUS<@PuNby_TqTnZbFSU*6X0}DDQuW=|E}PXxu@3b zOp#t$`q$(@Oza*F0-kkL2+a5ES5x?g-`Om5I(2CIMnmo*?g38cJ=zq z``EFc0|8dh57^F=earQ_6o*L9rSB~GCbjsci=ZMz%}Evziw0U=QBoF$wgOoffk{UA znEq8e2F67jo<;I_&E8{8X%g<9b{nDJW_qSg<)FFRA32B7 z?bUDmgOd?K#IE};cjm~@1F!+c0S;Dyj2jV0*kiD@#{H$4v2R(sDQGRKqoem`i}Yqp z-S-=Jn-gsdg~%W;bb;(vx8Iy`|CJHBojT0&vZ=m~+oVNg4{>!i%Od^rX>(4E<1cf- zj^&DzA2h5(DnThyJ9+C1sX)R7pS$5pbYF{6M^^{4aQm~{hJq;~b>J0+@~Tk(DC|ZM zIuU2x+{Go=v>M4P<~1Bszv`;dF`qe3>}_b7M~$9mhA@z6U459QP#%UR4mx`HRS{eH zu7K~vqkW6N&T0=)8xj>474>7F@s0quA2_QWCI*D95+(=x#g;OrP}k$FR8#?ne5KLm z)0nAh+dklvCc2;SdI-{+_9c>{8DdcRs-m(XFJ<9M26MB-v{`7F>0_N`#^tGP z`^6KJ_>3Y0TvEJ~&u@+Lf=<2!rzEC{eay}qYgW{LSV?3Qgr{T2%kb*=mE zw6LXBe=_-oX7q;F-tQyVLqJ&C@^9TOF@Xl(ds6#96KE3Ys7mq+9Eme!AVf4{^cA_D zc!|RXI@xHf-K$4Ik3~$%kUwG1XlcOC1bIKX=Av*N<$HqMe~yiY^$dW0)Z_20G8}+` z2a(-DOeiz>50*xs1zaV$cPBZX9B3FkR^cW6?@a(hQ3a-)Usm5&27*>I9)A%6z_kC{ zJr0!#VUt)R7etj>S4t~)Un5Nz7_$CJ!g0o8b3G{GVk9DgZOe zJL_9(Cjcm;)pvwT4gL*u{a2XbKyOVN@~JpZpfSnwtcvVU zmU^L3+U{U=s4~znGk>G~H{$p=bow$G2rx$96o@AR(sJ=~-K74LaA#DON*+7LAr3E) zhZ12qVrzQynl8M25GeR0-^#Mlh8L?h24E}4=8?mnjFF&!0I)UAQS%N4A!-Qt;^Bkq zP_`^d>rV)))J&*^0Khr{>b?K){P#>GfSN@0NDRF%1{7zo_eJ*be^!nPPPu{6;Zz{+ z6hLUm#p%@&Zbm zf0y;=^}@4FKv&hpwO;?AL#^Pht@odd4J<~%`cs+NizFzZzm-xGL12dY7&4frW z0=;Ei>j1p)k9Erg0b(QlCc#t@2Q-v%KD_$VPUtgGc&1I&rfmbT>`~RY%RlWGEwBnj z?>#p1HB?T7mVnRXT1KS?umh{@p5Z-KR7T~+ZR_i~&Htn;=ox_CQX(_gRXGbtZqkKl zekPbixwR4|`NnGkkq7wf#XI5p6a``0$SZ~XDeC}HL4wb<;u)b112E}n2@d<)1D~)CA9U^;j%>22BQ&f-Vbt{|fDlM0hTf>SW z-F(^~8xxSmS>9eK)CiTO{w+~WKZgP%gA1o`j1J@3(9X z9+Iybk|RO4wcy<{$Tf`NeO+S&cnL{saxvdz8Q~LehTB0h0TjmMI4yVaSaiLw+fI$+ z3`D&jgTSGo*AhFI-~(Q)sEJ(M{cGMpT$HDC)UbXwj`DQYU$~}hgg5ocb6?Iv zlg?}7k=mVL7LVL{?o0fKrP`T6B26t>Gxg^2u)_BUwIm@ODn7f7rsZ)XhmZ2K{sP(i z>?OTE#~TbpBIlov8UPT-#IVL%b4PCyt7Q9-}^JKOIxp2D!!hTsxNOFZN^A)_XTo!j;9hqPK=8Poszq@5x zJTP-pYz$2_+lis-+Fni^EUHoR*-g+#ddyZ&%x+Fq7l{Bh`$tV- z6KT}EtnMb?f!D$=oaHBsCYL{m>WZcFah^^z-N4TQ3XRH-DhC9lnbp&2gri2v22qE`$TO0uVVFEy)+uP&H+%2rAavAsZUdd8~YF>Ll#cwf2rvMgIFIak9 z=n7cFlb-t3H3FWjw()1`*?VO~PO~O@r7^~5p*<Kq8bgep`8@r*Xh3?*feZ^1cbrN@bR8~h*YAM!ZsobMNvUNP-K%>!76R9Tq4%vpz zj>KVMyX0oa90qYX>%3ekJm4NUGtwQb16Q6R9<>?k+AE(nf4>RT7fYYBNQd$KCAU75 z+(a6VIY+S$)y}CkTqlKAGT}=Gh+XzC=#y|Tp!LOfr+pm`yM9zdMh0fE#beHj_|j+eFaD~mS&_R z#dQV@zK~~%P|pyXRpdO~t(|}Cj0Y6eW<&kgt=Mu}Z2bU{v&;pfXynJ4EUeIsu= zm-oCjBQmd{rMn`q)kL#ie2ea0K%=*~X@%!inb!6Jpm5-#eNa5{0o9_|54)!|Nj0N8 z__OORp2J!C!`ixVc5CJkGBpuR!=2{Zu_7ZVp48cQmW&?iSY|f%@0%H*+Ea-EH_|=mVC9jqc+ZZHdp27APDKv zuXD`wyb*3R;14Y|VV6JINqY3j*e}u(nZc6rKFnkP$lY#^in(b(;Oe*)4=rN#ImYM@ zW*RktJ%M$B4Z7{4z=xmviwDw^F9)iDR2rm@J5d>S8oAr-o>4nr{jdXPlhzxiDzA-H zqk6Y*+MoIyc69Y>X+Nx+E-?kvz?S*@J*iPspE<0t>FUDqp?lEyx5Y>Vb3Y+>z;rdn`=wvZk$v`Qpr}!9Omo*$5I}zm|Z$+NQnS z#eV~_y!q80E6gqdu`jhNW$w2<^o9`aR}ja_QmMZ$uu<_uwZ+r(ud^5H8BCiOI+R$OUzjx-A#T z_mUm`4a8~%anwOJfE9o@tCAdsY_wPsuSR}x$GkXEkKGVIn{iof*e;981>bi!k%m~oHP{k0}%$L$~l5lc?kcks)Q4OM?h@onjon4kG7d=nl{ig<8A z3kO~~$j|t2B3#^mYLawLbl9MHAFjFqDKf=m{uEIWxz+5P%9AAMlBabnmqsJFy;GTH z;R7BOJ$)DU3T#qijx6_XspE5OMe~x&KBlysgG79-uzUcw4+0$;ffW7HKC$)w_?B6u zCNeQk{WoJ+ZGpJ9f);%)qaW~xEyI=CMm3lFlyxoU55(-tFF^8eDB!5JV~jP6^31Jr z^LCyLi?b8>TvG2fRr(6Jy;ixOj9UR;Tw}Hm%8w|uOWv+(On#001!-)U^Wjuj_%xI( z4sQ9O(WWi0r(_S40J7TVQ6>82Qd0%&RnQ-+o_kGR&vJW_xr|lbVtOx-Nv5?r@L4yV zO5knM@@~6gAbeo}+(WntJLe*(bi2lU>*f3Uizin7 z;gP{V*Lh5HXeoB5YCUEU!OS5Xwfr?|%pZ0S#fu1ZLKa4U< z8n(&|t9xPkQhG>yuBJx=A#==eV$hO%HM^NH{!DA%hk-3k-;a-(Gx@2@K)*$M%Twsy z9U*NyOOYN2T`2s?fXHaQ<*r@vG<%EzdM#dD*JZ7F`i;F)oT3inbMWx)-B&dsYneeH zR=dvmnlRVxxmh-FMIMH0w`Z7xPx8NL=iknPb2mL`l zC-cFU&&Kh67w*BdPx6Oh_6<9oi`Q;u9wk+8kW#ZayJ|A^8wbr%PwRK0YW`+K9s3x1(*Iimhn0c90=1_=`QACKzC5Eob_@Ri&9-P zfF7$;uzhl=cdJ$W(4{nP+7(8V5vpzq6z^?*`Xi zUd|&gElOUA+)76nQlihUdub7)LpL3UpEa8FTl439Q@WpccAD%4Z77bm-gOaC;V2n| z?1@7k4gT$jW&_96;75&{Rs`_hIUZ-Q>^5rd-jx(zQ%YVjmZ6z-DR}?EpGS8>MS?Nw z(z)a9iYCc*`!U8Aou(%`4g=6 zB015*x}uNAH~OX$)|Giuok{&=zA7~eMLpx_WLHObFkcA2+=>*73ft%1IQ>nFG8V#l zj`qH482BV6OncTP{)h$XCC`dnekf=EE?OE>Y_8fW4GV<|5ZhKua}etq(XEs^j17qN zC7P$M#+)kiJ*JI5-JCBqdcEU_Qp$zVEa;%!DWp#tk!I^u;YsR@@KPPbxEGbA*~YHFfwaQD}hgAJ=_kn`X3?8g118xv~+`Iu2TtXta&SH zia2#gy*&U0DWO{O5Q|4_n|Z_4jmMRO&KX`hMQ(vGJr50-!>0~Inw4EU211Q=EtPxI z4{q)&#{@wAgGg4tS&qFctgzv?+o-;4b~0bv3K!@9sLp%s|MxsovRD+YSHa=BVPmGj z)&{CY`Au3sY)F-+X;0EfRylj3oT*KghG2ozuQo3Dj^CAdA*IZ)RwT!K3{LZ_{gb2T z4F)-p{@9^zeM7@}n{k|T{hY|XkqhqkjfvMSt-eZs|7cg_j_ADgv5S5XksXVDW zyaH*G^|`OmFJ7JLJn0^}u0#KI*C+S)VAA`sCWHU3hz3T($)ugGVXPyHZ)XX3t^6Z< zc-J|zT;EjJ|M-Kh4nzH5&Vs#>>aF_B+=Qm<)r`s9dYGe#Oy(0hJD3{>&HE$QYHXc~_>PEQhQX_B}UGwy(d(@g%Q zu`>iQ(LR6vy>4|7wug5o#;Z0{IS zalD)AT+qjZE-w2y8G`aw-Qle|gjjoBXrLPRN+iZ)Eqg_&3X62==b@MEKm;qoz z#AOwm7HAAQ0_QEad~e|~;dxhmytw)z+#qm&m0>}q^szjLt###0;_JIv`TBQ%l2+y8IN>j{s*-b1hL7C(PXEbic?Loq%f zw0?b{&amK;=GO3xnXnEHl79SKu%m7Y6xj;tCvG+1u}BWccCHW%F=JtLeQFEascL3t zyGTBAf7|dQUyirwPge7j8iK$5=X)4GO*T;2lokS7t!UwSK#PIyl zsl4eAkk9|U;dW~Nv=ZYqnp+>Aw?#^Z)h^;+=ea?JqB4N$Y5%E7O7wu{`jdW$xI*7h zp@8=0=XUZ06GH9wWs+a!fe0X15^S}o`tC_bWzZc$=#P`JO2pBn=Y0IDw%v1BKGWjf z6=^?9&lH|k7OW>;ZM)iLcEYV6B^fc^{AEmN-Xv-ouClk#n5qN6A8$+);otk=Z)&X9 zcYxZ@mP&M4d5DQooG>=9pXDm0CY2uSypf;3q{2Nc&_+Q$fJy{m=lK`4OVIU)u`9&` zEum=CL@avoK@rkJ^NAwvk;Wt{F)d{O#G5LbEd1{6S>>xm5TAK<-6Lzq``#C$)5f@$ zXUW}sBfB$0Ac=Woh5^B6KQMP_FdpN}-mi-&_7PF3-ga@$o~}GctjqK6_)n_OUYLv= za;pDWp^@(yhcob>+B;IY*!1EvhJ;Fs5Pa`ouKBa{$#?`g{{aw6&_oTeKhzZvZgg_? z%wIEc891?v91Ypo_5OJ3{;(DH9sV5Tb%%zHse39X@^{#LrD9w(rOvSZAzp7}iRQXW zpKJ|)L9Jdw<{$DaHG-tZft!o^WK^g)_20zvOUp{^wX6Q@EOQ<`DD70Z&%7VT=R#ZAdeR$)l z3FXg%+hk}Wi!~4SM3PBM)S&qxP#uy=b(LZ*wX0gk_1+gG7S*{$hkJlet8`ZQ@o=Sl zd`&khRQd(xj7qn{!(4HG)D9JmH@_3skJBHRxBa~!Fk)OZ=8bSCo01?NH0P|H$aO#7 z>biI6kuGoA0Z$Vc@_&W(cvvyUPVLdEBCq*7ICU&oZ1y!wA?SU-#?sP*vT;Wj%C<`$ zEAzjW8K{lf(Fi@vk5fRxTc6tg7nn3v9bN8IwDBuOdp^nrc>?V)?YP+ z_jYFI9nYs4SfhJZ`dJ0ccT+uxC*J?Ej?KSjIhh&lGI^V^DL%TM_YB19B}L#)(YGbs zE40d79W?gp?Z#fLHMnyse5USG@I^Xi+kVDIjFqjL{XT^zKNi}m$;COXj%s*e{Tgol zCU=-iU#n_HBT+pkL&HX37nZcPXn-QfVGw+oF07a&EHtE?_-;ba zWj5IzHI9>zWAU*HeS_RZ|jUru3;b{vN zk0+};afRB6=4oCNzw)W(HSkhg^q(b?O8#L&49?nJp5AtCxxN-IFm!Z+K3gU$ADGa& zT;KmDzLSZF5K97JM|+wYlM5<__NEw{2^WCjwMGjI}9Uy zZ&$dI;zj$lFyf&Gc&4s;bXGw*?I?GlyY{QJ8h95PSUu*v1wGJ!po>Qg_p2K$uQ(3 z4R)P$$m&!eIIQA{uto-)M2$@*rR6NOY&dfah?QF0Cw+!8y^RFFHGcQJrW`#wu3 zrWYBUHQ6RucvlOKOJFDu6d<8 z)AhZllD`(ab?qw*lU|qNFk@*pQ(?K5e4Q9+-YKv+{WArysjcZI-t|FVY!&BRRn5+* zqJ+mzep8}9i_8sg-wU8OwVn8xm=5taeD~WXF-la2o!J|dp#(U7l%+!R_#yo4V3oNI zHh>(bpP;45s4a-F%lE+Rbipd<27~p2D?+h+q?68L-Jd=ADA2(3I5r;;x4GQEL6<6- z3Qu5tQVE5Qm6^(;`72h1b!=95zJ-td!c`ZIi zBVp|OfS~gx-Z@rV7lTKC8#&d@oB!E%ChT*cYoSodU)X)GwJ7q0+aZ(GYN{1`62x(d z@<}3sRs;vQ%)x6g@$Ya+e|c2qMzQMawwuI>cMjUp*QTi}2f_%rD+V|$hzsA%R@n>y zKCb>>`KpRCq!*dBcJn!(b1Sa^V01&U22Pl-sL4lo?ejU=yW@iqS;q6E5hp~b9K6QC zc&y3GBU0Ko1H&YO7l%C^1t=MkY*rJ6Df_T2+~722WIJBMtf?pD(ny=cr-Sv|715T% z8NOOf&LKUt3VH3!Oj`-f`3A72L=e4Ri&mCA;Nl$ZsRyMec!R~4NQGp)@9Neay-VLz2b{>JeSWhJ6u z!j|?SAoulr?$Zu|zYkc=S0IQwGcT<&yw>E=@uhqz=NayY$fq|ChP*6C>%Zwgxn>nm#lLvdWbvzhk%A)T$oiP zIIFuRP%>upa}nKHWVvVdvoSpPjD@2ECrq^c3Zhl)Y9R+v%ysGV@rc zu4CG)Z$p_@EGLrIw^tfj{k8HKlNYU}s<6ksh<|7JWUu7vB-0yzNhZ9O z;%|+?guTJ^bSa%wTR|R|l7i_#x!vCbER{*fQ`38>`rWGJQc~KT<<`vk2TQ)tUc}Js z^SS>j8zyYG05Dqyb-Yh+HprO{ik;Luv8jBK($~^9_P+9cj)Jyt{BC;pEWLO%^Ep1E z`&*>D(h1GgdG0wlZv)pUH}}fV5s1oeF53TY&-+NwUZov2ZpK|O(|8UL@SmUl-U_t`xG#|fYR-p7AHqRv5m@Ux|Fe{T&-o=I z7A5-V(K5Ak^S!4_c3*zS{j&*j-v$}5aFzw#*HvGW zgt~zd@shbW{GUcrFbhkS;1>Nb3=D+2@U0}x-xK|N9C>n>#Shho4Fa#Z zi9Tw8DkFq@mEapP0$B&MZwk<;h~ypTYae~mh0iNc~%-KvDZgs(F^lVb zT)Iz4fmm2&~j?F1h$c||vI&97Of3*i@PkehZBQ!0Nh-=Kk zNZy}2zpwt;%QcFZm=%5#lHfxSfLRhE66ODM26!5Vn)~=+m)p$3O0#a|2o${ zbOPo-JwO>K2ayj^`Pze-x0Np5{%0FcaSw4p>*DzYG~eD}#P>nL=fHnS_&719e|5O$ zj4S9cl2&=`U-BLDlm?>(vGe-NW`Hah*!)N$`jw|Yr_9S2HIbtjz8X$t%gJJy?er55y<_b9a3` zG51pXdwYs~UzbSl|a#XZjMgyhs@1l77a&?A=8(VZVA_2?!*C;fAq2ioqNW2a9e1t&IVz~L&PpvjC?HG%e@jMll@{JssH4qUB8}u;; z;{1{h>m=9mxrPxf5W-tW4Gz?QjVadkO*G!xQENwztIWNP>S}}_T7HZJUH^2bBeW|0yn{BW<+)by1kt0Ljc-TKIC^q|;Yf^o#gdiru? z*z@1Zk>&}21Kahw=zg<*|Ms-w!y>*0#~Fg{x-FiyrBC>YYXixb$02)4T@k4b4N6Zo zqy-F{-EuNAnlV{MW|MmL>~qEo4ayCU1tzW4R+GDHx#`|=qC@oeUf(9~K6cH@x*XGm z*qK`3OFuc4ZdG*BpG>m*2BUYj z%cN;vTq3BcH`Dbi(yLF>u}l4}M@DiHr(+wdqED;KH=JVMdSF^~_1mAUe=!(c+<%}z zI_G^UUEaqdb{Q{uzM{I;fWSMute*c^Fl|$<*LbBYdEUNV4M(9Kqw+*?*M`#9DIhVw zp=hz*2Cy^Knzt4nbK};1oF7m~urJSNrqR&`c`gQHMe`pQGRY)ehXk#sh9O>uJ-JDm z`feR?^me)O72IRHG#5jsedUE>!j8S}s~f>_m9+dMlq*v1QL=`cS z?~F|9;}M+j5NI^JVn3)9jveL!6=WU=K$4wAtM59J?DR@BadB`po-FoNK-*P;UCrW) zQqNoKdtFk7WC@4QM~Ijon4NSSKClJg#S4cZ9Aj(2Jj`vIGHL2bJO(?#mXrW z4?i`B-)2k%6j`%+2v7o)gmKik-j+0Xodwe7BxGgLcqi#Mx+eqvf;l+H!D(jRFUTEX zUHPADwunNJ2nZ^GUtaRzF%J6!&!SGM^U?IRO}FS~{SBq)GtIh(#=Zyw-}ldvjP8H1 z1iX>XYXc%wJ*rh(tzXe3Pf=_s22osbLg;v25)L%e)pMzfd7-Q9#PQhU4B~ihk@c_~ zNc?xk>f#^tnoSf?J%-;4#qfjCIC%Te+v_;W7FU3I-4rB#a_1ns+`VzP6_=P$0FL1Y z4DTmpKjk#;(R>S=TJt+gcO0C?%PEaI)NWD3eR1wO1e~HfTw^8tZign0i-G>zMX;S= zBQXK@Ba5*b2Nnc47s<@egD%$h{o5f}5pwmaYQLVbf5<&sEw-JYtG%PVA`eX}SU;vy zqdu2fGLU)rHByC{K#gw64*vxpa}5x|x@IF+)czHH936!=!dii@-+YC3qkekfYoNYU zbJU#Cz{)|YiY_(o0x3i89*Q)B$g1fay`m($RDEdYAIF_XfD>Kl34qdkNIU zmLhuta9AzSKpc*JIA>$$a(-Uh+3*M_Hd+?}r{Y}vMs7ra^`ii!Ls${(~SlgNby3ffm1;`&?Vtp*6iWg7nhvGu9)OL>3z^ay9V52 z0VwhyIC%~Zw=N%OcUz!YK+V-6`r{3}H_{!UH>oT6?sKewc4)=6u1SzK#&lhng+ zUtdbU0i-y+uXCDK5%+fy1Th#P0rNqAyM{;O0*lp?bvmNAW*vtl#AS_3oLmn&;witH z$RR(4X&3`8%lnXfSQDp^i$C8MB*HpmJBWE3qU<4!T`IWj zgF{MgcUbRws>3`YS25O==Rz_>W<@>cG9X0fYBiawoNk%seX$Y3q2x`pH_M)Ey~LLC z$T+9P151h?^EQN8L7_IGBs#$jAsPFUI+_JWC*`)NH)Wa2^X5b{EmWe(=nPf!b+=j$ zW?aA5RKGFrVaMACaNtktD8$wFVg?zhAoJVkhBi_*1{8R5D|PZK>A{eO*Pp}RE_F3i zTWt$00RnU8>0S+XGZ?ZH58<(flbNkFWn2%NI-QDjp-J7b`fWg5a}qD)y!q?ZrkCAV zg{43->3&25VzB;!IpD6vFDA(vcs@+lh`LbQP=yfm(XG*0<-iv!B*D@2JxORoJM>!wOs-XUT&IbvguvN~#x(+ohpJ$W6S|tUtuL$vF<6o%S$x7)IeHIk zSTnhiZC9X@(XTwK277y3{rxvy!&1SlqS+tDm{O?4b#)GR(}FAU2*yJ>((Z~z1@i`< z?8vvS8fAR^r6OCeb$02x28yM7W@Xdx8C*-CJnBo(i;dhwRb`0|gYsQ-CI}|+R={;X zdqJ407-gQ~Q1=+oFW?mC3)^cvl@xILV~TowW1B;U zZ9F2u^dIwFV2s{pEzMZ7X9vs3`vkU9d?QYC4qdWJA-)N}y|6bNuH(#$?KSj;-+J^0 z&$y@Y!WjEK^33YFgY?;pC^vFl?j*I%B7HZtnt0*$ReRWEf zbAXds!gT=NZr~Ug5K$&CKi_KXc_BhqaSqfUjRlhwkA(qZ4Ix?sPZhshFA?__ zIq-+Nr!!Us5{LDsrI!X?$Fa0ZRF^X_?7Qx^Ft5<#NX3G!`~ANlv&Tk#Umx(CxSvYQ zfR*^JD9ORv5URLjr&3JCp>!1b4SKJGG2Q#gWU=wlgPj?hEw76kApvM;rg>*75wiD^;q@kkpo!l5+tk$C#|@ki1DkABOX^CbO3JN>B92ZCdIRQeHdeIFL!{l z*jDNesl<`JfXnV&fS`kOoVz_mRVO1(0}kmFWDzAL1|SgF-UCRgy?5dbwby9{MRypq z@TJxCYa;DK*4XJ%lDmCQXpog2@@$N7rO5LPf?(TZJsDj&yn zTquZb$Av!PGWiVgfr(2@tLY321fs=0%x0QWg( zLV0Y3g*u`jaDV=ccoEUi%ex1jQ(>P_^T@t=&ct}Bs<*c*Eh~JHt+sjX7;!YF3_KH& zeFxIZgLxNtV&m!V^0BdzWtl@tJA^Kee`wPWh=}SKFk|D*QP4@fL`$;N?Po4J@xXF? zKgo{{47hOQE#lB72-v2({~c;}gZVP!w)goe?UgSP9&5;~q|MB%nLo)yyw=gYIKo71 znQlc*$wjxS;g(6WG`0M7!*>8#I}NZ`XOgMkof&68t>SwCKqeQ;5bQ%=!h@8@%xHMy|!4YX1|qKy6s~McT#m==Z&>1 zCf8XzcxgDh=Tr%2pMnyb33&;XX7WgY47{_6%%TsIuxODlqLh$;RXgpru6N9qW_b#7 zZ@)wht|2yZ5v$YHr~N3s4`B+rOOdBYz!-Cgz#rt3NR#vmn$(c`@FjiFs($CmMIS*B zY2&Z4Ygl`6+&b>(zjY3P?{)6h`o5QkxJ8V}hGoH$vt-GKhF*J2DYYtI$`lcBNx~q` z>Ps-al~tAWbIa*OBEZbEi(V{#q)GDXNFYlJqG@oi?}LU8*&nL2PS2BRPrIz&pG6jK z+We8;tL;S;{!q=0__@W%TKynuZ)*aSqzf-_tMHOZ9F;&l6rPG7cAMD2#P6VW$7OZl z`x&PMJ3GKbI&Pv)2$7*HGdsFQuh+475AA2k6kJq_Ef2n*`()nsq&f@?L zXEPk}+k1Q=P;dP*l0*02wo-s!`)+BM{wtxY6E{RDN;|}mAnT5h$n+>CkNsOw#kB>t8sTHk~ zKX2YlGUX=^`8t#3b)oeV-2vehD&NFSUXj&fblNTJ3%Y2hT=zKLRW+M0Wp94z*u&;e zg@>$LZgq27ny)+Fe}xl~8SQ#9ZSJ|lfhVD3JwlZ0>H9#uJCj=B&Ry>_ijR}F8NKu19}Dsi{KTqr7zSa|)JFdXRF|CdwFLsgkYOK{7J z_U22*;XST|sK?tSUwi0u z7%UnWJRN`71$|o9)PFoDFk5Z8+jwfrEW&10=dk@PGUrpE{JT_^bjz^?u5VI~p=f}J zZxnudA=!Ko!Vp9~>oym3_xg>{bQN0Mb@ zy3pXZRBi~V-?I4>MhSx%^$F`kuhbJ$;LY`Bqu=WXN{lpJVLOZ#*41+#h{0F>`)=E% zvW=%WggFX{@01`{3cNN|o0N%UjNY-efVZ&mvIctO`s|cse}~WgNC+hsPPn7rcry5Q zEQR;VateVRZ+!xU_ZsAh$eewu0XM*x3%Jy`;)c_OEry>W)f+ZpWG};;ZX2)Z5{5#H zqSm~A+yesq>OJ*L=D~6?!YntMb>PpD24`H-;?^(zt%)B-aedb~UcM*XKr6=K-ngio z>i<#u;`P_?hz+6LVQc5@8ZSf1;o;Uy@)Zy+Q)V&%66`~e)W@{`v<8)Et|5lNcDU|a z$?vjz7fN$`@DjLT(<}}r4fCxORDzjI6697Wi=nP@trrwf(dTs_oU+3`05pejgyh97 zr~!Hy$Kx*99l^~bBbe&#yyi?$BIey zFi>%ZY9`LM{JuX!E^geN(yB!s8u6byM9wQtZLYV3au(I_A5By7aLtDn4AcZ%$F<2# z{rKvZ;Pho%=_r-5_%4+}qXsRFaJnb|tcy>`lh#Xe!9?HF&HUW7BZL%+2i!E)$--<~ z+i=%q?!Ew;&IZ|v`WhLcl)VE{!G!VrcpXVy3r#KFV@P71{*I^);cZ$zF!U(Sw623eb?KYVm zFR;M4y$`c>iQ-RbgRi$1#}UNI0|><~PshQhBFNtZG+&yk3sMiXFJs za_ne>@gm8NOJLd#w$emv&EQaZTjG}N0v|Nswn;)by;vvWVs#H=TDSKXXxjJ+Y|Bxy||=R^l2;F_UgTIR7B( zID?aDE5RzR&?xQd%I?(Z#ijecp+K|G*#n2K!fuDgl8II8epPkL?!a1S-JYA4>S-|M zdsMyktCGXLagdy_8U*$HXxazJt;7IV+->x}3@ypwWNRlz0iik4J?Bo<(&U0gj9L}b z(s6EzPB#xj@2|_|;7}*5wiw_%yVuGojF+}wd#y{6yjuJ(T@!W>r41^4n7Ra>R#e@g zVHuvweh5S+z63nRCHx_Z7)|ol*4T7N!o$sK5C4YfP>Sc_tCNyk>h`*2KHum3QBcl& za%csP=rw<`h|bTGUrtIRs@ZSJOECfWTG~+bd6vpsEGg|K@s#j3$BM?>D)*8}SsNj( zt|xy6mz=oeDgvXeN;44Hna^weSqJT?4~K*ghQLJ@`pG+TcvlM9hPxMe?Eh7c&K@z+ z4w0h@+xkgE4;z9&GkjGQ3E~`W$`y6?M4ECFY9c5TMsyswmBD!c7gamsq*dPo1*dnd zR9PJRhINrW;$oS(@te%|2DHp$6HcrOe1Sj+c9q10P)elvKm$nWpPYS%4yHVQ_r^PF z(p+ZsOK&Yu7sm)~VtgIcUt*BK;rAMk>zn8Ks-}%Yul0zm)>0%PhFLoPRdgW^2unVT zJJ-Mm_@HW@DLJ9V<#E3!QM?TMM%70gfs&JVsxBR6-A=nbrb0vme^!tCV<0F8Wz&k{ zN@`oYx9d+lPOJ&PIG5XD|H%p6teLCOUd{=H^m|=~P4nW;5LjIQ8cJ&Larv`Im_~*P zw})=3>CJ=5EzU=`HfB$Kx|iG@7F-M9Q+AgM$;(PsAY-c5RfTxzTLpZ2}>N6B8Tdil`M z?Zw6NEs+Hq@Cjh@`e5PB`pdQgY^b7R-(cA5xD*}wr4vAA@%2@#jl&di z;A8irTYD}t<7~D?T~zu;zZe6yDooXa1uhbKukyVYbji_qr-Yft97+w`EaDC$0P~^l z`>yctIzV%;v*j>jw*Z6_e|d?q5iuxcig#5PBhht1`vUogXw(3BfTnyKya6__m!&t9 z{Bc*H3gIij*D`<^UsZmUI&Ig!01#6}IQ3JtuGKZF7f6b&dY$U8EqXuvMG7eSDG?u9THIF^Hr0=5WV-Ye=jwk-|~NPN~()w!_gbMC{oX`3G8E`^nkuVVN3*CKf~^Un~h-5nF^9{4~OnyGgIS zn1dC9at(q!nya*OL4YD6k4beky`?pG@kQ#+b4L)o3Z-0fUbncY2e8fNdZESAUXYvu z?RXyB!Br^Bdpsnt2 zu4h**vyd~G(x)p^A>x6lTRjjWtTD84#N!wJ)lb5LmyVH@`c*z9*Zz!|8w}l@X85#O zV|}NdgatLT*{oM=Q9M2i-jsDWi$A$laW#DLe3aP%z@x!GSGgaNy-4_mLnc0Dwoy1O zUCUIY#Wx|-%0-%muesps1DSD}Wt+hQPaS9TzaC*v>&Dd{uw%u&*=pz;0-hP(OZ&zU zu-wv)*UqgBE~94EXqNAwXhBB?N0ZW>XTI{Nh9OH)ZN5e6710fo^@|-qDgA1xvhF+2 zwwsGb8_A@+MeclKo4fs14)IJRW}}y?5;HFAf zR&F+cy!TrIkaHI|d^`ZAWn9%Kc)yA){VD|+Yk$nyRv8Op0OKdXuD0lE9eWzV{dQmP zw(=j9$@gWFF1xx~m$M=dYo*aOZ&U2!M8lnC8wWYV&brPEpBeq{5&hQt6zL50`REK{ zOR`nZxnQl|iA<6L@B&yAIl(0Xhu{AUxjXNDr1I*%TEp1BgYSMWfj`m6oew(|ByK$V z4eg(j{G9CHPXU1QY~$76r*W#w#R90SlYy%P32AB4icg0xn~riX+~%A3=&s)Ux(p~K z@08Xk>150dZOeYzDmaOlA&YZtfnd!*c>>xYwD%DV>eN`2&|EXv*^)dna+wV|=Qx;n zxaW67b|0zy5?cCmikH*bYJv~K!!5kd%O%_wxDk2N4xRi{#e(LOEL78w_}U@Vrhf&# zfIrg>LNm!&ID^M+c#Cr@J<+CykGk3A|K!a_^eL-du!Nu08%2DaGLnr9ubG^^BBig2 zJ~ls{)qC`f@%K4fGuFJ;J=-&1{5W!5Na+O@1dB;A$|(e0qY4ovN(_@`=%fAzP!Y8=teOMLPrh6>J)P9D5es5pm~S=_VcVErwC3zz0RYg(S>BaF%iQ09;H zNqUIsH-j+ubaDpDzFUQFi3RJ^m31i5oi%PimwBMaha_D%DaonNS zEsz3jQ#Jj9{U*anw86*e)i0=i!YpYrwe#*gTR>5y- zzBIwmqFR)$P)VnJBQ{n5M)dkB5xtwX6SZu+^yo78Ni;^3s% z)vjs~ZV3NScm&>y(8A>R?z!^ghY>u$-P^~2!=v?U<)-{Dr0wHof<`UeeH1nvWZXflW=JW^uk3FR+0aBl;v`o4J;@Ow8|lyr|gZpx_n7)X+%nV;i* zs_g%AKf>HJ(D_)3%1Yml75bMM^yHo5aP|{^0zqUK{p8RkX&qca0xP77Y>U^^oCyan zg*Q_s{iwV+uTB~Zz(^N5p-%Qlm$OB5+fX>G!Npj~ddG9Hi*hHD(`?K&=rPLPixkJf zj-duB045hu(&SNsjpU6Lay$ISu+b&^hz@%csvnbM(0v@quwh`fHf|a98aE2fnG~`H zQ?e-+Z4M`j#_AAypIFMdne5bqR;5JOOZi_c7_Ls}a0Gq5`ThBvL-)|qF?2oE<=A^! z8CR6CZEIE4Ug`;>{=*6b_$b=y8`6&sE?z=D3w1mAe!s*Jj>W80k7p zmS;Z)@Fyj{d4l1enM#k0#98pLr!=A|66z6eamn!&`BM0`1APZQh$7*U4(a-SBq+a# zW39)WQO_!Ca`be$W|y1n+{bo1m(>8Oh2B0?MqI;RQ>3359%|2{499-Y_^-DzhQg;|F#9Nqr7udHI_0Z z!_HV(@352q#HE0y(k^iC+#S*nF07jHdF41+G~Zya{N(c$Nna`rxA4KoMK-VYkS`}{ zqlN5SFT;VMOJ^}w#6)@~dHK_u%vn_B`#6vb==aZCI)M#kib#h@OaQay&*}Z!D&TI% zkjrYhpolU~OxF4n%hcA%>yt|`E){K%-Djba_KuL_IT=E$2@1w5Osux})d~05+H}HE z*$njUNy-PgcTT<_wsm-~{`Zwn2QfS1fT22$4g0LqB0r?A{i>~#3J?R_>Yyk>qV6Du@JjGvCuYTccaS{J1 z2QV8}Z*ZT(Ym_pz%J@b1;rz_#$(&cHN|AS-DD}{;X@HBdHx&3KKNk72i&% z@)&_Xol5ZJ2`2`<0uNEV9y*$4@Yh1IEQL-fk^inKAena>QyhqSP!MlvNdM$ziLgkg zK#QY;kx}Nr6K++gZh$WXo~H&#BH$)8{upOB^Vt_Xm5}VOZshS9!N}41db;r>?F~7j2SyzC?XmqE zW^I%ISdH0};y~+d=`7zoI)Cwm8~9*~Z>>=lT_CS3LCWi`)cpNIWI)*BVn;?Mi#$z!5vSHGUxt5e8ub#F@xK!s*8`AU%P_R=x7qp6q&s`~-*@EsJH~V55fh%bf^#4%@t&A%+u!xM zPS{>@EXY0c*ef8h{A6bbvc-^+I2+)FSEsYbP?Y&vH%lZ@N<-E8CZGSwtyYyLR-*@% z7IuJ(-m1ksQd3%QX+cH$)}rjA2U(XpCSPuCBWh-WNA@jE1lSK{r-WWqC8d6Z%u&!n z>8Erum(A6Eat{a9ZDvHPSWylc-QqtuvB$rj@#@wLBYvR)z+hInAayZRz-D#P;Q^Iu z{((|^3FFRSM}G=L*86SvygN8aCq0L3mpl&?HAsu1o= zjhC!Z6?qYy%*NB9_fRjzY-W=Azrh6;%K)OTd3TIECSiGtom_(zTPxtfcTQ~`Uq}0j zpxc%S93pm2Qiexa6o zuG=yTrc!>u+VGQkrZSR)x`3uOW6aHyP}s!7sj_ClV-Q&84>66r@O%24Sh0|%Lh7yG zHD%GC<+o-9la6ML^R1UHfM=JHQfF<^HQa4PpUqH{Woio}1 zpdb(4ZaMRnrh(V$;v69L=0APPAk_}n!wGZhCO*cpkw_8KDrN52maMujHabzDImCpU z>BV8s^T%71fi3B0z3c4ha3k4ao5`N@q+WVdEK35-4kx_u942MeEB(nY1dYg$N2AN%GVjZrLkAOgkjRCw%z9K zT-c2howf{H1CkX^cju`L+ouTkvYf0&gA3F7m?IsWa}rYvtr(tBZJg zMu4A0>6x*2?}MwrhT@Z_;mbWwc)ph&t|hBBVnI&)@$TNbC4qs27`k^VcWK(Q?cg}! z6Be_Ad}Dy>-@KQc%Y#8jeCVfExy~bnApf7FjOx|Fw74aZz>OzXzp}77&r{Zjc;8L`oDC>FyM1 ziJ?;j>5vcvl$I`Oq$LGu8CnFSYnZuve7?{3@$q->>vjLWuggCo=gdB9@4fb!bN2eY z*OGiGx=dJs67&QI+9k>^hxG}UQdMu(eKm6(=Kh)vpIzQL&W*-msa8liRfu-&p{esp zz}>0wpxY%W@dj0amT2&pU?>^t<^+e!GhE8%|W^Gkz!1WF^lI z&ngzvOU(Olvc~PSI?HhN>xvFkLQi{+O8d$8h86wL4sJhnSI#RzP}R6L`R?ayQ|lib3j8kO5h`?^nTzczIi9;R5|PM@1Pv>;!{~eA zhjQ^-jd!RtsWiY7if#cE8NaGpkJXPytZ`WLUIn~(^!>VROk7~V`MrUsdOlwqx9|!& zJlSr7+EA-__!X=x!-W)IPLZHTlGbVGSy_JR5tl7643BSLZf?k4`R4SAevVRDI@|x; z_WlkVy6fO{44%5*Sp*|B_k3CvmWqvr;wkJhaQIMrOHZNK&{JLTiNQnBJJf0`rs+|svt_kpQ|*bU z*zUc?S|Y-zPqB2AHn88?jorWJ zjA<_|P=9r_W~(r7Qg?PMsMd4AyQwR5u}_kG^()TW?nd=&&1~%;+I41>luHEXD!Ddo z2#4?E4st!0snbQ@1NF*<<~!8i?k9h>*PJ%%zzm^%!&H+z$b#s_w+*}2&{b9W^Z;u~ zNj&Tt)%O~$6JLpoRYxJY5X|6HAOx*a)BhBJtM|+XKEm38ann9^BWR*=m$f=zJF+f~&L95XXV5KG|H;#QMy(~@HSB;0qGR*B9} zP5!wKkHPaz;wm7+NcQ$;4#7l|((P;3l_;5P^2Qxa7yN@2VT9pr38p5*PzhpDms$I{{W>nn{V$=Llwc!Zd_Pvy|_eH+j z0$U6TD+^fiE3%4LSarX7T7w8Zd?fLF#sSH?H!RvQ*viTDz!7{EbA2cvjxQTPic*&8 z50@~k(1kS1B9g)nXRV+1K?dPl*C+V9pAFmlpG`IER0ZlXT%_ULv&#@IMbUu-lLPVt z4;}_h?|@CszUSYsX0=uO;qS%JsT5DQ-94g} zD}WI3rrKZteG5=4Qcba``OC4(7J(88uLS&4*+W`mK*7JL_lP=6wP?rb4?LW94DM4i zLI>Dq?H20Ztvn$5<@t=Op7K__Ss!UKZ+j3!2I*8CXNKj3Hzj$uF`WeTqN#GpY`}1V zr^Vg|3Uqn-&6HdyVdtv4T0vgYU8RRN*%fn#eV%xrfEk@&%y`c_SnHr-{tDd%gfH4-CB@D~ z_{^9A3p4pp<9$tm+SPCOQSj%pNEDoCDPA=2F*gG0-X1Wlj3RyBIiYZux|{0oq&DfwOE#;?s@i>+@qILJaTJx4Ly7`laJga>KU0I=9u#ou5QDC83V{G^ zL#Z?=at=1s^oupwM-gql?=X|!RH8njYyWZ;url=J#Inp$AcWb@MfQ4);HI04QBrvk zIo3mQ3HO-=AMQK2-m;Fn^@ zF9+>_+4v2YkzEBSRO|i(xoSETMYOD=td5Z#T zZkh;i{N5U>Y4Tujp!?hBCT#-LCGSe_bNprQFX&GeBSIEbS?Ow3dBR7>I{;d?rZTbm z9|+eOpo91zVS{hZQG??LWT*H4O?hz=fDuh9DAE~`0{Eu59Z^FJMBsl8an2m* zL<+UM)q@xmL-i?XSm}>bl2Fi9zor(qwG7H-Vrx1C|BV{~(h=87~EdOA;|!ku{P-Py>g&N6M*^&&YX21do2|bLe}@Bxl~tzLPv6&acEfyeJ$D)R$r{8IpgW_U;+z*^>s&)vK$-pa-{thV=imJB|w2 zk+$@yI06kIX4aB_4i5b;=-BWDry2Ue4bX&C*)58ge{)>Kfuz9VY0?N;6n1L;lBS&b z&-JDR4y@zYEEK4q9G9gyiRcedw1@)bX~i;U!VM^EA8~0A-XjVCC$QGClx6 zA0*?-zq<;!OcYDJ@Pq_EwFh-Mm(>cJKifzI-ZGpliy?@jL|uP)vHaPFIEqA5l06W8 zObR;7saxvH{)ao&fKe*fJL)U!;{hf&bZ2<}34Vf-2KPXD+L#pLKuy%ZT>o>1dwsy4 z4_cyh+N8jmhs1J)EB@I=4sbYVEe2zpIBIsxd$|7erCyZ#h+j#sdmoRQ;y$}og@4a% zU=b?v{G~`kM%@WDgFFk()PMGt3UyOQw`mT+Nd)sUT=1`j1O6ks0M>c-$>XjoYXabM z-Ui~_H~(yd1zf(0g*b2!b&*?5)nz{xo8O;(@Cx<*k+L}6$g2yJQKwE*2Po3s;$=KH z$MC;Np=z3(kO68mhHtj!AI{vnsnUc)RzJ6cd8MNWrx; zVn&K&ucO7wT3{#eDk3U6lzHvBO5F-B`mV4-(vGH*HQ;4o7D%B zd4?`_Tj?^-ThbHjWcYrlRtsG|@7D{6e8`@fxJ^%(6vzuDr6Ecb^iW-ykMF zWFmw}ElVARqLQt8e^0Y+ZjO$Q9&&2hv7_+4D9v7(aakS&r3}7px3aiHyG+B+)=%?b z#Hpaja>4yf2_y9L!yQK}Ke$Ubd6?&Y>cF!3#x&J%LJ{y__{uo;bf?;J{L?@&(zY-S z6fWw$e*JnXN^t)Jq&C1kIsKmDtVWQ=-FC+?<#Xl`Afi&AW=Y=35u}gX+PkB8QrO_X z&_9Bu$-xu}=^xhJDo>808;#nsz>sl=Q1cVqVPn*K^# z!@eAJ0&=O$iQC3|N@J~M^nQ~eYq0of;=0dKnAmXm(Q{D*J2`$&kZoM*>F~#s^!Y}Q zqw?oJMwN!rK#{Xujm8V7@lqd8XK3w&U%B+j;qabPH^a|u&qeRI#4NW@bAksYom&lE zLYFef<#U>vH9Y6sQ45Ugj&wVeIGCZoN)EsFNhAws-BU)DP+a`=+YCPA{7DxL335Z&l7lY*@Wh(WXwXu zzrV|a7xx(Ylv245i6H!MbwN9L>QV{P#ZLBb@g#7Se>^YBhCnUCWO*YX)nn@fH@=bo z#AZlm%XZVW3SE7Si!*q6s5PD=cNO`y9G@~h+aEFQ%cbWVy|?AuY$`hMrUg;=d>;)e zK%AT?!~NJfk7C0JsMDJ)_sNrKiY*!z9wIM{(^%+|&e0RD%RE_*1e=JiN6pG6ljhc@pJ*%}5!EadDh6%(_0QL5s)CimGQ+6q+h=kv{Ok=#Bo5aa~-YN-XSPU;Mo zfCm#&9M4uABf3@mi*GYd!LCQ{MlcOdOd0o}NWx*Cou=Vxr}>$|*W%;1Kp z$qaEohFN@x;bsji(98sHr$b}yV91NVpK{Fd(L_RPNvsf$sRHek;1ARI-&{Rw_4x7i z^_OkYd@JPE6rtEf_!?4E5paaziniyfLl<)Akij?JtyrZ+9tLN3;dH*IrsJS?HPLyR z**+1r6FCDw_5+{q`^2BJ^{~@v-GX-DT5VXScq;~54q5fThGg!?pB4sdBMMkRf|0%9 z6hw8=%k0X_Fc5B_HeEALB6*kGwWz)E#O&D%+<+cBpF!IG?-VQ0*Cl7M%t*|dL0Om6 zC)^2SPs(}h&lPT+O^aMw_uM<5GKTt%yPnLer(}8v4s_>T0HOc7_X{LQfui7oyH)>< zrezm#;j^V#sGeb!<^P@IU|a(dy0)AptNTsbUue`pEa_;w{ul)b#^Rs@Ja}<_1%X(D z3A8>g)&@AChKxWqmyjOh;U>|w%9(rO3(-2~L;R@N?u zU*2o6jjQFN4W`P>1H8?C&0JuKh|CLX5p+d8(7|*wzyJf$RF$gL>;_`i$5B_Rw|rq1w`NsSX*$0He*S@7tg1D!Y?9g`awB%r%3~Q zP$B3X>>OESdBI)y%GHqH{Oo~x$@9$3cGioJo z8tQ3E+3wrg;wMdZVg2?qZSrm`*QS5*p=6lHhvAls=emul{w##&-(<;xMEWG7M9@~) z_P*|h9jb<(S{KVScf5ye!p!&xd}1pG(f#^AliD2ua|PbHR_mYM>3uYkHI?`?GLEu9 zZ4WSm6eXsnHD$gE53#+JMq=|hX9vXUGFD+__G$ayhyjzmj#~fA^M$Wi z=0!jlKTI9&$0?&sTaWZV0KtauZ^bXwVcA;s-c_7ovNf!TTHa9x^DAgw?6X()q1$2d zh^>iu5oG%Uf^v#m_$Sr_sG^IB%lAp{pOc5#RVEL))BTA9E>;v?o{q`|RcPW+QeI~q z+^*;Eo$R{5j?MSwVy8+YNQ={twpHwU?1|@`ccI3@{6WPe+8c@Ejl8Sa`#)FFp5e61 zZa<(h2*J&wy6S_oKc{3ns>On^&USrSw=-R)J9TodbZPi_zL;ib`|kA7Rd7u>rg~Arr2fX-2`s7bT)AJsp;mRS{(NcLiT`m zj>0Uv3R;PKBV}a`=XS15f@y>*lpfq=qC)bFdh`>F7{N!hftWrC<)V-BS~E>C&LZ9G!I+5A%zA$Gy+POe0%y?+)CA8cw3L^NW=%S; zN6;LW1#-9P`(=#9xk*U-oA=@QN_~T}20hS8K80{@EtIE-{6uAZqug2;B637@QyTHJ zMTOD45;1T&2!i5=OkGv3gWVnOJ=71~TA&C@QfoPd;g8oGUc9~J0;$dDtTM)MRWriN z^7yro4pZSgss#XZojBjl1(vX08wnY!M zIXU8w=l}$CeamO0$~r@z$~^rc|sf&h5zQ6F?#&Sv6cDO0PfIpZZ;mRBy7 z?`FO~dqsthd4R~Hv4#~DPlFpeCmYj36?qkB9j|LLuDx_~@bV!n`07B+97CGs( zW_R*yo5aZA?(aBcT-yHRTWo4CdGxA#Y4PUQ%%MeF^O+mHKs=yAljCpXyU9|u6h<9p zW~*UxYf7PHbR>3F6GZPKMRy;60q=mGc0j#ajpS{2k5BTc+wRY&JzJEWgd-_)0`VH< zq(@~g85u5Q&mmE!>JZ^h=cvg+!bkk{a&yOGi@xJR;y-w=uAnj&v%Na4Z@Rzg)?+#F zLJn(?X)z`L%80MYSpeY^OwDSA_sZ2Du~;oZEfE!Zyxw&(hGV(`7n?oP1szbQ)hBXl z+B_#$9S-}>oj?LjT{pXHfRDw`-_+AZ(rXv@ACm83E<<43T%&RV>w@zNk&rVNz5nFl z6am3;W|wF9@xJOPZLP!f*pCnES$}hU7SX2)v&~J!2E8P?tF?|ht^z(il{h#R4J)u{ zKZ1^L3<`tFY}r3DtDrdo!QK!YTD3=p>Zke7)Ejr53>@#0QRo{vY+nS_Hs`51$*Gps zu+xjprs%!@x@9tR`6jh<%S|-fJGXCEPS}9|qVD$0R)u>cWZ|GLF-`C(LS8Kv0{^K{ zUK+H*2+4e6KgvC0iSeYrlGG-^gSc6YOT_R~9ZUvS(h5^s%R?7uVRX835No%ZT*oDc zM&5o#cOU)i%SqD%Ml2gfi}L6hyUMch=@a4=2Q~qG&zf?O3NS>x6bki=#2vuDMCTSt z?!VK%mFphn(Ev27YGK!s`pDJR9herUYWE3(bBuOUA~m>D1H2woH^uGSp!CJ7-Q6;t zBR(O=$1x#dAsiB{juNUqp&ZrZuNQS&8gK$rU)sQ&%d0>PKlf*u*}phFHdRcw3@nar z3zCIQLK?~QMQ4NX{T=4TE0X9haZi)wJN9CF>K5=8I99F(zL%-qvw>vyoy;xZr~6iu z^XT04NY45c0Kb?YqP}TqhBeD~t>T+Q6xgT(NE8hCzNcsoqVj0~;Xj zSrhK@JDe9-al~UtSu%cWwmiGgrLyN!WUbeP$kbOu=VevKy!rBy))oBZrpB4?Bf@*d>-$&wK)2zMz?7N+tV~gBuJqQVzwucO& zSArFl%5q1&tjwtXLmp_DaSZZ~9zNY(Ej7%#F}shhFwz5{*h(CWue7q5yi zULBF_t2fE1A!=k%9NvXPTN_KHlToUL_=6S*?;H6RAajUI@z?>_H`3dYvd3`rt9_8w zxNY&ZsR>0;9=GBxRs&XiXVo0L0UYj%AT(q!9&KcbhrL ztdIQ&&cj-{cF(Y2i{1S>(Y*V~TGM_GaussbrM`>_<~pBpx-Sup?zZDCOqWb>bXk-4 zx518sPycKS`|j%_cXJJlrGt`G`{m03lT3IYTjt8;XKh2qgMn3j&*Jk*Z!zx6ydJVf z=KyEyYV!+1bNQww9YU)j+s`Qo;UC`UN}?!_44})@e>C3){X_^Wmp>`oa9&6{wqC?e zB=>Vo+@*gTsr6SvxW{5(n=E1Clq{E~0|QOCU^=c8UpuvUs@!?9`0+S*3i|!H3DPm- zEXX+qr$Yz`X@9w<5N@e@sYX(@|`Pn@hmw60Mvll(p5voRVKf}6o*uCYM29jNeLCV%TTN!hd95>LYT=q@^0gmjoI122ME6aURlZiS8R#?u_Spp&A4gAV^!0{Z!biw0 zE@?hhbMCz__Uok}=>x{~Ha$`yU9H^~&RiSj1ioeK;C0L7+T!MHT;T0|c`y(=8aqW0c zcsVPg;(8#a?ubvp(AFz`pAYdLeq-t~oEy3id5>6vaS7Bk?e@R>Lpx{Qd}80Asd5j@ zcRx0~R#`pncs0TGc-Ex6M<}rnGP!!ksEi2x)_86YS@LOT!l37l=EzOJ2q5(;Zyw5US(!##uGQfOJX!p>#EP|V5)fB$ZqODm(LdC*645v_5vs> zfp#CYA#KJJn}Ys*<6$1DFgl0P%`}G#k*%~hFlb@g&okl$KAJ4ImRy`B`0ka1$=p+^ z_eP9*K?&XB(Mhh|59d4cX(zWoSm@8Yv^$W{D5m;y6huv0XxitQ`pZ15rqF&Vd8~7g z8yCm#g1tAds9;XR+x?5sOg+`tn7h$zx@|GS9Lj^7%{8pqTCG%uZ(qhco+JmZV^9Ui z&+XS=9Y#S>!4$$K?%6J7sf>C${8#W6lYBpcfGb>NtZ@o-V#zfaUzqh3QXKVj_Qy%-mE^BiFVK z50g}JF1T#Uf@b^1?i-`yWut=@HQ|{W*v>v)CgoskT|#6seIyWW!~YiQqh_2C;y6FY zrOMfMNTjI>aX`|}J&&=sUO%JLyfT+!g{f+$lU zHunz;cMdw9ji`v8=f9I^3lU=V{bAu27aGAsT^kz}dLxk_j=lR;3jG>{86j}B|3?uy zh&k9k5|e*Ga9vA2L?}|>*k-2pn(lb&OtpsUW(~*&_46| ziN$6>5<2W?zAQARxatKXVq`*3WA(k8SKUCH(}`xnXN#)}7iv4AL}!33w_vyJ=MWL)!Ul%C<20mb1T5~@;{97X_SMqS3wsY$&GJ!2JmpkqR<9t zd=OY^cdAY%w26*=Cx8aLB-n}1f*lZYWZxC_xi^}LCka*w<56TK2?YouI$W8-E%7D;vsFfNf7sbzVqI;kZ;nTy zRYvwpCfPhdi1~84rHh5c$x7wTP%DsEcBl#;`Sc$k?)-xdTN#->w*4PKoar%spy(C7 zK#SbvbUiN9k5(D^&|u92Y9Td?#y%q~#A?3BG-s-vYJvKyS@e~)wbYV}vIx{?q8 zcEf|xT=3K4Dp=ExZ+d2MfaOLs=bLvto>?(!Aw9So+LFyGJmPB$VFJVz(Oz10)w|l) zj*im+S&#yp8)!R-^4dRP#^d)M>= zNLo#Du^nR#6>cV{$Yhmw8B20WK55osn$S+P8M11e39p}d!O9Im!mH|9AVq`k_-t;K ze$5w6YbLtMmvXxN5lgx4jzSS?GtyGy$VfDEtGttzXx6SWYj6g~yFQuZxu)tmK%kEf zl1}tP1uZj9xAtKmah=4`n_VrVzetIn+-E4rDUPt^UUB5@<8cN=1P1@x31`gaGA1?4 z&M<Bo%|neD#P_E?$}R?&Uzihgp7Dc`2bLgCkDtVa+L7#T7?LH6pJ1-fJ5<;tT2^ekB}F3zn!; zb3^7q82$67mgVkszlb)cnTkt5C(U$`oyivCUO9<@W0Rorze_1e>qq3>m7?q7iIx00 zv4XS77O7S31k=Hd-_d)%%XpTD!r5M`=czv>$s#g6&t1`Wv8aDiZe&EtP3F>h|E?i5 zY7updun;x2Hceo?+^qOaBha{{b}hdD;v27@OC;pAX<5@wqd&<{TBbybnQnQ3S4czD zKb_lbYuoRj_X+@=NOMLH*GV+l7M|hw8KltPltkq=;eNZY@B9{SQvDO#`re8yUb2`C zmwmtB`fVfBbT7lT-`tvJMKlz}-gX(?eP~IKXoSc%1szMPRKW2PIEh2Bd<}2e>VbRS z!<*3CjhAM#RIM}@4@yNq^t821V4;$_-Z0K2wR-b03B*T_ET zRjeUSX?M5>CPsMsnSKF{?iU>>6nK~Hll-J0##b}I#SMhvet(;FYJK)(hUh!yGJiGF z00-n&d9Ws3#0hSF_lJTef_@e*8_x7Gx>3GG=00ahN04Uvn~gP!*r(E^P-IlKrVzb< zee!&sXWa5;kUf5cv3H`E|AI9J81-6ZnM-WR5H0831{QU%Uuqs_WaJ}Ofu4af+ z#Zvlk>&B7DvFEQ%g_U`|WW77Oco6$bh>ttDd8au0r?y}??dg0 zRd&VFekv>y{zIv4?1f~;1q>7Wl9hhDX!$5b-D_3w>uYR*9c+euP%8ox>aFw1rduy( z`qFnM{&Zc-v4T5^0H{O8ZYr={>4=SW7QK^z$boO+jUsGyKTw@sE?RjENf^cRXahYQ z`5BQQ9Q&+QuNUbmPkwv;*s?agNgoc7r} zlFine=@%A8Sv72@fGPA~4;9?Jm=*lK%{_Xz3?wREU`Vmqa(mdCK=A0>+iiu&O()C` z%Onai_xOvQQG^GjLfs>TC}?{ z?<;ZdwuahU9c7AFZ3P1s#eEVbSl=S)-qNeBMT9@4_L*^Kes=(#m|gsfAAAO;00ikZ zK#<-E5+hBY7?{4?o*K6IunG5y4Q8F}n8}yf@rSy1-OT)qXpvLI3Jjy$m23!2E@ z%iT6NqgkZt)vcT$a$NYe7U@K@Miy1x1~0c>CAy6U5sC+a#Lg^AqNEsqj_C`Fl#p)- z4HfpS@$-|OKdCfK9?^RcnW$;vI0Sy4@TGhil$+(!RYkd#2fG)E6Ni+@JtN}J8$(Gb zkoYj2cY&#PrWIEb=J?}-+#)0iT{=w^-3^YZeu%y}U4|P(CXRprG#>|!3Z<^AO%3_+ zbB85$I;&_8svv#Zk2@s8n2sFP{AKl9(_;*Xop0C3u1WUqH8L$5vcTEnYW*zGTAVd-=7p0ggn+M7a9ndkNP)=5 z+Mv+qiY8qB7=rt+neC0Uxd_~o;`lAt%0%;U@tw%Oyd)tcHDxFrBxOtYN#T9mCJ;li zk1OQte$ZZ%e%kqFQ5VL9PO1neAtfNg(GH4e{fxhx?D5jNyi>cJCQRAY+FMNaP7v6X zR)jeaU)eXMNyN-|kF~9Q>3ZtF+(dFn%Sh<8czJSCHL`TaK47RANU9wvYMQ1kN51bI*_O@+n$M*e)x2AVeg=;s>P`4 z<>`jAdd8Y@!Vmp|p(=q*%Nk_G5AiZL!49kASBdzq41fA_>sEH@FUFqSP{sJ^IHF17 z9(fTS!&cF}>!+I@u&>`Bx3EdV$r&Y`)vtX*CHGR!^-Fe`G+!3OFD__PfZ>9sJN-&f ztxMePv~Feq5VUq7@)sw{Ed)2wj{FEz=+*^Dk+(-JjJ^;A+Ns0$w=dn_=G<`1dDpQI$?A?b1f(N@$mFOs=%e&>=yuEvy0gpf>P41ldWsRw zuOc2g30|jf!e??rJtq9G95F?m=8?%MSz~^vK1tYb>uAFp+|RzwX6X@x)??_nVMU7f z^UIWRU5eM%h+I%jgFqH;);K;s{-xU{@qbCPREaP2Zt)`9pJelaCWfj@W(r2?=*Ror zvoa8`?91BTqKedlG;;`jGNTTG61j)Bocx~%_zw!?o2dIblH7p3eH!Xek zv>9Zy!ZPLErYGz9iI6JhhCbz15!S8S3|df7V>A@DiBpGxJnuoz1?AV1UZCI*`9OdV zp%O^^?OqX(?+^9aP3gL*XEbS&JwSSMQO`x6a=I~!-EV*~yYRy*>kO&&IE}173cpwX zIj7J5ZMY4OV;_m_6Il7x|2zI#`V^0D}2kBFgDbDh@G zF-PG`^WLGRdA6CqP&ZJZ+TBp3PTiCIcc>{xj}&@Mw&%r7%bleAw=)3zYI;eYb%MB} z^^Z-8SK=)88UA?1NswUnAX%L%{jG0x0W zv|Kqg?Rb4p>1JwCr-dQ@@v0|chHsXK*S>r6%StgUvXq!brml)i2$flx4m?uS4wTXbjtBoFve=$Eah1Jjr!rR zL*ppd*8Cu$@3Vg8alkV?rveyh_T~KoxQ$C&SVZ667}JrPhQ?Pv#R(-2InHc5%ek1| z>Hr!2{>I2UEOvF$Hb!y}02%FKXs}phKnzV3qeN|`o=dCTeY78XY92(8{v1V-RsVb% z7nX0NO&z-&=VJ-`A#ZJVqo*bm>zHBVDulfF_H8tGMg5hfTMNqEVr|;dO(8hzZaRjU z6s^lP%bOD{J82G5OJT3C3d~!sXI@5N^fHn60Uww?Xk6S;`y{wIiOy=_Ntqu=!M)wl z6tT;FjxG(zvDpFAa`sj=iSpb238y`Qj0f+^PAa=_GSuB~{9B!PZGl?T{5w$#LnlNT0kmbEqHXDyw7D zcHozIjkxDYBTZu$q_?AOh-i0I-)yL=C(Gw~VMoMir(naxbecg2W|=Xj+BfxAwHxs? zCoNxlx+cm5y{5FqQcQB+v(%iK~sP;o4S+Z5t3U-X%a90pQ{aXta*ACAy-mfO1h zVkJ`i^T;?W-PnvHAW>vifn<-IbZXl=SngFD6Z*+;H|K7_3AL|Cvs4?$`JNq3;a)P1 zG5E!;H1a+Sd-REHgXmkp2p;PrIVr;dCLbA_43K56a((D->-8fUbS^ccdAQi=%{qrAcP|0BCU;d$uA1?nLSrKdh?!zI=;5VT+P-sYUj5J(7Zla;)iTKGjG` z)_Xp>QA>H1>bH5DQ&UTx*UyyL+gRkedwAi)Qne*vDE^CR6Rs4Ab#05tFetSBc1JCP zf0<}ZO`5H`W*qBKK_>;Rxq$w)H1;EbM}yr4fss;bT12D=cc08gR`ajk?Jc*kzxbB3 z!HQda{dzJn?K2IMgT*D-qt9U|`isVEL=LOqRouIuPwC~DSY8m|RB`ESc~^29qoLq0 zf!iPM&&?e^ya4%c<}IfTKQcdj8N*M83~-wPQT?(PxVP`I4r)vp*q4s%)2lIbXz8Np zFaI7ItCO(`+Z~I@kE}^NtOi*9XoUaZUn8t0mP>dzkbZQf=Qf3_uRs!I`i>wusmV`G zdhXX!S@9#oJ`M94;&4g|Pfqn$Ucc5c=Sim5CS)Owd#{cVdShh~-9DTyaf8$gIp9hI;Zky7 zMk3vZE!ORVuF3~tRs;-4`jruQ%D<5>`JlV-pM~BYijGzCtmuLyaT9=~dj1(&&~H-D zDD%B`E_K_9$AZWzo}WpfWM`LxyP{BQA$K|C_z;`w7L-|FD7XYe^D{TIDUd6FuThsWf-s}AOb|rUA~#e>VT<9`6hXYqMZC5n1R_H-k0Ldwd<7`hxEB1)FF`ix{Er zKYbV=I11Ve&e5uHeQ#4wFFf3B8n^FOylec6)2A)*3jdgV`P(Q`TA2zwN zcf~_b=LVViRdhFh7;9BGsdcz>OByuG@oUn&HxhYGS{tPJBivMGM<>1)kn zctE8dUT9q+rbad-B2U77hT4NO*XHZ8W5!xv^|RrG;Iku^y6n-T zkT=7rF>r`=LIPl|5dyOoaRD$oj9F<14&-q9!J3j!{Cw3#)4T>j3*zv5v-q5CdMp%P z0Oc>ZN_>Mp=ai^z7WO6zNnt}PAAlB^1{xKj%ULbNV@JG)ci5x5uPu-rQA5oRv+wETc{Oj_69kak;M^Jqiv?qB0w@-WP_s?hE z>B#Ptd)3!c@aCL`li~ljEqYm#ci>8oMwU~6EqvbR$M^r+BNNsuQAjl`%d~{+58!O# z6w!=-TR<Ydt9Va!z}w zRe!f32iQP7(n-k!Y{By}LC_cLw)Aa|B$(4veRrlD#<-u#$;B`gbEzff0klc_}<`M(~s&=ab*s zJ0v;vJ%2wuKc9jYs4cs9viM&EL6g& @@ -81,6 +82,16 @@ const argv: Arguments = yargs(hideBin(process.argv)) }) } ) + .command( + 'failed-folded ', + 'Generate fail folded test report from a CTRF report', + (yargs) => { + return yargs.positional('file', { + describe: 'Path to the CTRF file', + type: 'string', + }) + } + ) .command( 'failed-rate ', 'Generate a fail rate statistics test report from a CTRF report', @@ -371,7 +382,31 @@ if ((commandUsed === 'all' || commandUsed === '') && argv.file) { } catch (error) { console.error('Failed to read file:', error) } -} else if (argv._.includes('failed-rate') && argv.file) { +} else if (argv._.includes('failed-folded') && argv.file) { + try { + let report = validateCtrfFile(argv.file) + report = stripAnsiFromErrors(report) + if (report !== null) { + if (argv.title) { + addHeading(title) + } + generateFailedFoldedTable(report.results.tests, useSuiteName) + write() + if (argv.prComment) { + postPullRequestComment(report, apiUrl, baseUrl, onFailOnly, title, useSuiteName, prCommentMessage) + } + if (pullRequest) { + postPullRequestComment(report, apiUrl, baseUrl, onFailOnly, title, useSuiteName, core.summary.stringify()) + } + if (exitOnFail) { + exitActionOnFail(report) + } + } + } catch (error) { + console.error('Failed to read file:', error) + } +} +else if (argv._.includes('failed-rate') && argv.file) { try { let report = validateCtrfFile(argv.file) report = stripAnsiFromErrors(report) diff --git a/src/views/failed-folded.ts b/src/views/failed-folded.ts new file mode 100644 index 00000000..1ffbc693 --- /dev/null +++ b/src/views/failed-folded.ts @@ -0,0 +1,58 @@ +import * as core from '@actions/core' +import { getTestName } from "../common" +import Convert from 'ansi-to-html' +import { CtrfTest } from '../../types/ctrf' + +export function generateFailedFoldedTable(tests: CtrfTest[], useSuiteName: boolean): void { + try { + core.summary.addHeading(`Failed Tests`, 3) + const convert = new Convert() + + const failedTests = tests.filter((test) => test.status === 'failed') + + if (failedTests.length > 0) { + let tableHtml = ` + + + + + + + ` + failedTests.forEach((test) => { + const testName = getTestName(test, useSuiteName) + const messageHtml = convert.toHtml(test.message || 'No message available') + const traceHtml = convert.toHtml(test.trace || 'No trace available') + + tableHtml += ` + + + ` + }) + tableHtml += ` +
Failed Tests
+
+ ❌ ${testName} +

Message:

+
${messageHtml}
+

Trace:

+
${traceHtml}
+
+
` + + core.summary.addRaw(tableHtml) + core.summary.addLink( + 'Github Test Reporter', + 'https://github.com/ctrf-io/github-test-reporter' + ) + } else { + core.summary.addRaw('

No failed tests ✨

') + } + } catch (error) { + if (error instanceof Error) { + core.setFailed(`Failed to display failed test details: ${error.message}`) + } else { + core.setFailed('An unknown error occurred') + } + } +}