From 76aa222e1236dfb13c589620c15e11d7574ed86c Mon Sep 17 00:00:00 2001 From: sokari Date: Fri, 6 Dec 2024 20:33:42 +0100 Subject: [PATCH] chore: decoupling --- .github/workflows/deploy.yaml | 2 +- README.md | 18 ++++++++++++++++-- assets/allure-logo.png | Bin 0 -> 11263 bytes assets/docker-logo.png | Bin 0 -> 63380 bytes assets/firebase-logo.png | Bin 0 -> 12151 bytes worker/app/cloud-storage.ts | 2 +- worker/app/counter.ts | 18 ++++++++++++++---- worker/app/report-builder.ts | 28 +++++++++++++++------------- worker/app/site-builder.ts | 12 +++--------- worker/app/util.ts | 7 +++++-- worker/index.ts | 3 ++- 11 files changed, 57 insertions(+), 33 deletions(-) create mode 100644 assets/allure-logo.png create mode 100644 assets/docker-logo.png create mode 100644 assets/firebase-logo.png diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index 549bf81..f92e6ec 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -1,4 +1,4 @@ -name: Docker hub +name: Build & deploy on: push: tags: diff --git a/README.md b/README.md index 49cbb0d..3085305 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,21 @@ + +Allure Logo + + +Docker Logo + + +Firebase Logo + + +# Allure Docker Deploy + +--- + ![Deployment](https://github.com/cybersokari/allure-docker-deploy/actions/workflows/deploy.yaml/badge.svg?branch=main) ![](https://img.shields.io/docker/pulls/sokari/allure-docker-deploy) -# Allure Docker Deploy -_An easy-to-use Docker solution for sharing and backing up Allure test reports_ + +_An easy-to-use serverless Docker solution for sharing and backing up Allure test reports_ This [Docker image](https://hub.docker.com/r/sokari/allure-docker-deploy) lets you share [Allure test reports](https://allurereport.org/) seamlessly via an ephemeral URL. It also backs up all report history and retries to Firebase Cloud Storage, enabling unique URLs for each test run and previewing previous reports. diff --git a/assets/allure-logo.png b/assets/allure-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0e420e2c4a0027433aaaebe881084917caf6ff22 GIT binary patch literal 11263 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%0DZSO(oei&L=Jed5SlrEIbl`Fr2hafcWd;^8; zMBzx6Y^Ok+*KYBf;}EL+%8yMW>}9KcDpuZk%v6(y8H*8%6%pfAb?kq-Rtst$5z!g_o~3zq84Cuu zL3Odw#{_XkVI3B$P$JsWX4s($%c$*ZCer>>py-n==Z}plDg7qZ&)&Jo?5(c~GuHd9 z?e~=8jnXUjiiJ^Zk*H88SmnX*GQuFdDTi2k3X1%I^zl1`}6DZ_7QyKw5({jzQ5cOgt7e0vRC6 zfn@dZco)^3D);bw@Z}Ilc+w4WDk@tdlAu z>~Ipc+9*&oAa+-dh%ud%9zw~Qn{;W+^*`xly}6MJMmA*3-AHW6>*4nYpf3eS#8HVW zz@f8{16oBF#({BUUUBOa(HL&I#H5xGQrj#0Bp%;|y|_mBP`PwmF~6_)%fq9~-xW@- zNBby+)g^I<>Dyb)d2#BVOoP11t0P3@I8!0a!Hj>o3TWEes{ghhT3Yd3Rx-I3Qep15)QDHO8|P2`pfI13|1^LJ*A*rH?5q#Qja7kM9c z`ZIX){$&g2k1%wC1qJV5MXis?aWhs(jQe>^Orf$5Y;&XfPpGGt+e|@vXgYQp73Xk>H#E$hG91s&rn~>rcU7Bj)x6>-R zXJzQW6oCu0`9~fj^ylMYT1x(*8;5z11Adf?V}s6MJ>YsymA%bK-T>0CoN9WR^-kt4 z+yQ+c-ckbtIxUgMujqyREL2<-=vlmR2b^I@x50k&Wq@H0?Vs?G#r3! zyL$Y4o`Gf5-bXlQ(S<1H%Ymi(VMZ9kJRK)&P}>v zp58tIj~L1<;z{j4zBl|FG50iAM^;bpsD7!acr#SzVtCmz5I(@5h_4}!%P2Iw_sW0N zMYqRj3T(d>$-A2HptY2F`oJl=bII0vo?sM}xTMJd&OMDYK6x_%rDxZ?X3%145kiFqTH!3_^~y2O@a{(74*&cduf{Adw8vcW9SNtvA} zfL1ctCF z=o|4Er^xWtV-!gz8_e=IFTzIXYvv5{$02L_iVOegRjn)8aBS7eaNM|{6JJ~1;X4;- zcVY5$*VuRLULp7)y<$Irc$gw51@@}TJ*V#DyMoBCtMxilMsEqD&NPOrrJ3$-b6sPH zAA_j<*u|#OUz2R>{RikbDC?I6$T zNDA$XZOxCC;|aUjNWlW{j6SE+OX%db$)u9GD`hjI@8Bz z_H6y*AJ=t5Hm=n-6LsaAE{fglD8ZUNuLcGJv&U(n)+3l~Tsg2Wf6b}an{cJl6B+!i z=MOF&I%lf{-+@^pd=JICS(*>ZtO|)tmJIajYF2=B0u0B*fAvl2#{oI_znU9QBh7xD zt+)U2#nK~~I+Jtf_XDT*n=$O=2k|Ek*fCFp=h22mFq!N={od3Y|lL4{DW%L<(-X0bJ$if3!B@B-Qxx? za4?7+7HkeLDS&5lAzaA{Cn$vCf&v3bNfM*SXJu5*|X#Fa5>`A(1{;uL?=Ie-!o-s_=K-{ph$N!!N&{fVe698 z5j@1+&Mq>wFc|!365Al^9H#o!rY+pjmV~W+Od~jSlLnR{W6v_`c%i`N*sFut116wU z4gz(hf$WQf5Zju62+{^yVOgZSK_E)f8=;fWMi<+6wquKNWev6R`mE4I_@>9~{IhlC zkG7Cp*B$#(aS}k%YYYZR$3zJj!q89p0nut>bz^4u}oEiMyxcuqD>tTW{0wC zUb(0!*DB6(07&Yh0q_3AchPz9xUYBwDPAhfwctHE{t9 zn>ab-=Y?(?pVwNidwg;IVlh0(3V ze9e`0Y#k`n!HvflYgos&w1Qum2I6{w0^WvQ&S8(4vniOKJ>#s#q56v#s%*t^L zhIc(h0nI6DQcoy@``*uLn&Z9>H?H*gIG;nku_s{XY%hQHY^tR==A(l%(#1gonG?tZ z-g<0b+F&q`Swj)@(H4(ZFz_Tr?>d`-EHPLUvS10wclRIh z!Wrd{5lt)w=jGz=1JB{vwOT9)t_PZa6e(mpVOs#rp}^n#jQc}x(Wwm=#M#yM%G&p% z_Q~jZJ|#h`JeT2T_S$`?Qq~o{|2A@G2Xjc}pCzMMXKiUH7o$F={Z|C*ng?Y+-h~7y zql(;&nE9qhO8&sn?uoz&gc~HtPAssmFFQg%z%*7VD?AoV9SKf9OS=`N7wQ2{X$pVU zJ#DDFWe1wZ()B|glT5kK)NOtfrw#?%|4$($>zsBzoRHLvpKdX!nV)Vl2@$@X6WCXZ zq=d1%`L8xc$W$910Bzey{xQmlh!w#FqI|2_$y!Lb0@k4B2pZaB^`%nyY*1A6r>U+` zb2qaH68nwEn3bL%;h5e})>_$LA=npOL!1M}lG|waa#ZOHf#FrBoMezd8aA~F5`W|N zok4I^ii=PNW=2Bk6WZgLJ+^Hfz=RwgB@NS0zsN^M&|kqrCX)PaGLlzk6dv>XCe=p2 z>ifJMOVFy0pR`h#^?XamG30WW4eB3C-CLY&$KUgpj0#>M8{1$4j3@=6-h~MVD-E_S zt{?m@f7bv7Q62yjG4spc1L|sq=i<)dLewyoioG8K7z9xSgQB4TkbE}q6PZ}1-8(1N zw~HYa{%4@OrQN!kI=ioPbVVF%t~)e)g>V)gI`9LP8d zO`Cpk4h=Vh^JL*>#=&q*eTpGq^{tGba!C;dN{>3soiY$}TWb*f6tmgB2HVsq|AoU2 z|HLSGSuo=7%K3#btc=6A`8Hx8J?Z=9PyO~o2WRo{V4+2qw$KyO(m8@DeLo($tx<;0 zGvkKxeHC5_U>_^wOqQm%u0Im zo&;RivH%mN4|ZC>ttI8XEu?bi4^r_cHJmhz0_a3xrXM-cAOSe%3%@6bl?2JQ);RUh{^K6 z!r@<)o-okVOJe?!Iz(-yGrzZ8srMXj$QOQ`4IbB|68ARef zh+nXMvQc>#$c=DbZB*U?QWj`7K)cX+{4p?jutyLmx|O-OG%;?^DEffq=0Pi+png~p3 z=O5D(o546Wppjk3zq)MZ>kYN8dAmIAM-y8<8kT3b!aZHDXMDd%a6W6b>Zo(kcTE|r zizv1*OCUKdgwO7}rw0m|9ReLNKt!wam75zqjJHD|&IEQ+WtjR;ZzIHojBlEZ%ZQo) znyp7o0LSHkqv8H4EP6zRGZYXC;5p%2nfcK5>z{b1z>O3lr<8HSH)3DYg{WaXEuJzw zQ&GVhv$OT$_zW)y} zA{~=)NFj$h&X&c#6rw*0o6MX~WpOoJDQ&w~H73gj>2Zp**1NBfiDLSC_Q|>{Ckk8I zA^fD7`lMUh%59Do#`zxpERA5*aZi5$Wdtmr-k%E(Q~7mf6B)=foZ06VP;TC>NLMMX z%M;a&_2ebeE%M|B>{(9u4RM@7bjs(_bTOI2gX#Bg+|;3>{}6UY@(SSVdJHx_{D6q! zQgd8y#JZe|x6SL09EzZQ_tLaULjtOMiK{!1Of)_f-njmk-_@^%A}ugD0@_lCofQg& zAhiVnR@dV|vBWDa@MvQMF|3P)tM8&w*}t#v6_{WmAxqH3!ax%F6oj}C(RJK3yrc&d zcYE+M>b(~tp}CdT*F_s;Y3iPg1YC~?z;(mb`3Pj;9a`Y}eXd0ABSdHpFz^J53VYs8v!Iwunjqcbd!eiTQ>+4%reBOqMJ3=eBqgR zi5dEW-*o?n_&3z3!6H3sl((G>x~Ov`K%$J6(DbgNsnm>&UJ0q;y0En3__r=N>lUj& zxK?6Bz-5(W1ihcCD-Tx7r`RV*xJTor>FzKFlWl5S8=2B;BRX-eI>hrBr|RfexCVr~ zS4V{HV2vwR5brJRb~mH{K~qrw_h3<^5i{)kWL>Y)s*Sk=C{noZ&R>`X2+8gDg&xX={q3mLl_~ z^r*QewBHOCRc-?vhKh*P`8wmGIl5vj?3;+d%iEPxb)Bg^Re2&*kL(A&CIX6=P+Bw3 z%P@yLFf6_JnE3MF?e*`B4400-IcZTQx#TK@sh z^b2m*vv)&9!0k&cbSIK>4>;2p;nQy&2c#s(&bemoTY0~;E?4Qgu&`VI!Xn-tX{ds7 zj_UDkUS9Vh^zEo>Yzbzx=-AYzr%tHF&^Q89+}y$}P!OnOgQf@h7s&U9FJ_uhUwdH` zMjBhQJ3fEfNSb6@H`U@E-pTBk#VMqD@sUtl05{#PCAd~W4?A)_Rew=mkcaM;8b>mAJ+SjxvTBGbG9VgEWyZXC^Lufn9u| zuXk$AY21#oV|sov6i|co+U+( zJQ~#5#qF)H=!jN^Kbf6+p1nC7+t_pZ``?DN{We$28-=d-GyiRAKc(Q}ohF0e=}=I@ zf@vj3GUsPC<}5Yn4V?D#tq;)`Pkl;EjOnVFl}htlWrljBIhhhkj+E>hS*hX64_0|g z#WH~LqgyoYU1LOD;=fS5twU7kDHWX+L3H zaN-p0{T1I^;-0fb!5H!!J$rL{Lv{6^wGrH|vol%vm1=VHRiMCkX^QMscg*Rnskmvg zWy1+#u(o17HZz}h?c8W$vC~!2ttb;GBZu}LiPORh?AqS%@)D_0b$$Q&{eJ&^zdhIW?!2w_4EOlD@8@1?J^PUD zN~_Vojr)xth|x=zSga-pd0T=QnLA=QTxr>#Zx8<&>9b^=A3^A8q5sJQUo;COh>65f zi$#A0C$!eejNZp0h`X~#j^IBovwl@%J!(jX?O(c6l8lD!5acXqf(ZyBIJ41j;DK8E z%L&A=rl5Lz1L`XOxAd1X)c+Ix^V6M&|M^8;8T*r+xOWKl=fgQbDBX4qM?8qz#Bw%1 z@w>4);ydtP(pYvF_U91~9`+aUYf(xXzr;(4;g=y%V)*4ULWuYU4!^)bXbI@wU*JH= z;ukmwP2v|gP;&T{IZ$Hw1rEQ!L5K^~zrVnN62mWWpv3SC94ImT${Z*${Hi$!#qfVC zIJ|Csb9a@~+HnWomg}|WmCC3;BxWDc9&%hp_o;>(?t*^y+9sOEuL`3BF z4K!)~oEI{5X-nhWM<3sfC8qQbevQe=GVn?N?wh#TC`67uY_O1efRSMjK>X^n@uT!C zD?+(5W^zuJ)se}!mVNQ=8bLA(;!Q}iH{4@qdV(CHzSFu<`1a zMz5B}oL40+)sFC5#X$zW!8HC8a9r5YC$f8< z&V!As!$f+Y$XC5#nszjQ_q%lA5GFmOXZ*n#zZ^_<- z&YIp;cZ|IjW3W^&vAK~V`VdB0_}eiHT9e+McShWd#BX>3qt;1n<6!HW&%y}%xg{)r z>CVm}F}=Zu8~TSO!u=F%tK3ucmRU47Omo-Kcjhgdy8kX8N{}xx5%=c+!~2^GwuR*) zS(IDQWcpO}1|NI3v0;Cf@YbL7ts@t{Uw<<2{m>Mj!?1TwjH7qZ0^r%bi)%v-u~|Y7 zNp)#yTyZqA+Q^iWNAM83Ho$qgUbFVKYm&okq$$C8TEFDY+NsrL8l7xPwrhWDP54tzY|#LS8+e9(|o{TK7}~mRmlVzW>TScJrK&qB+%*e_Z+QTia`R#spq_ zI*AD~b#Y5$z|od!BNu+kaEhQF0Z>j22GZ+o@SnR+xh6RYAux_YRFPrGsi)c zXWs4Ziv9#kJp z*&TZ=CeJ(yggyn6+3fY2>BpSP>sA%5J6f+0zJ?$ScVn#XzkhQ-OkBMEXn##_uu;ee zf(V^~ON53K;+^xkrIT~6#XPSz2cz7EEq*>Q zHzFhH&Za3~5jRbrdML^eWCJ~0_Maqd zAE(7;=-yW?YyUa(yKiN06=iI$7}!LwZrK$3ZhM!)&Xeyx`;3N}RhDBjpSfS!+wR^j zu$j8l+fj3E)bxjm;K#$AthGK6QUnM%}%3L_tBe4yFnx$v9YVRgthMcx!Sa3 z(=ouIM$fJ>V9>NTM+W6??C|bVD5&W(Cu9lYIZm_BoDibE)wyL;y-*TeDQOJ9}DI_LwakoXU+XouskN_HVs2=-N7>TL-gZmde1XvSPHgSZb!mghj0Q>V~? zqjLUx=lt$j&$7Tu3oRy{1M6IhON4?G_jV3r{!&wjTJB(;JOylKWrJJcz8a>x!*iE` zSJh*I$+{9D!OkuPm5-NRmF(#Pw~0=|DE>RXTGrtP;s#!P6mPStjU4hL zC+9E$mkLhOW8*$_%_RX=`J@NQ3OIhVfr+JyYmn#0dZO6_Q{B?3z ztIR2zL(C-&bzz#@4$te+9>TovbyN90D=pw}o!1rE&$wDat{ z{v!LSf(*fNl7}EEY~-TjHMhCBk3Vx5fsD>-E}(b)9BlN?G6l}6DCpiJD+}}r8!zZ$ zb}2Xa;b)F74BB+XD`~e@-4HLshWw4-h% zVz=T~*DiEQ;;5tbRG!l8H9rq{ZRT`PzsJqO_aR~+csSU)u(4-pq}e!m1o4wnnGNTG zd;S+S8WqBBjjWuiHVZ^e{(}kSY1)hI!`zfsh2X!@h`;d>hVF9wLlgz~XbKExR8EbX zh^86F;)$0gp0>?5B3uNUuC!?zf#3$QX*||=wlEu*d9p6e2Upj61p-tK;3GfAO(4?! z-M|c4HZ(K*b-AW@qmW$6j?i-P(JN^s47Jeer!Xd5o_rta{ungIS&Zq^59nvxAo|@g z`h)+doa#WJ8OCB%xU>KjvMg}_I73;9b_K{K_0PG32q)O#f!Ho9h zUI&rA7nEan(twz#3gkkhFJ`VQ?LBJ`v?z6`p&JbBMq(pys^x*iy&4nuQe-=BLHwae z4@*`%#!djF*n!bI^+e69x4lD+D=)3CHAQLZzULCc30YF1O83OuuaL;T$P#y z3Dt*(*nN}AsS{(7plmR%xLlo^URuZtxy}}$kI`D=v9(metpsaTg?LIXz+CGbLgLa^ z1%YDPGOrS_KJpgkHq6f@N-3=)B&JC&z;80a_W9>cPuAQ<xEsj=S^dGf~j8 z204IteWZOa*c+%P8 z^=2!Au>P0Uo^CCgG8^z#AF11u77XX?GOt+1bs)v%ok)AEDKse=P6t6ScECaxa>+HA z%18a>S-ZF>4jI3XB`jkAsg*4F_J1Ak{AB(MVUo0V|0x|P{L8DA?#&4y)O z&d8q0tleupjog8as8bjl<-kUBaUX;Y#6~JMaM3ca78JXP-F|C4Ydz3Foc~g{K%yeW z&LVWT+Hx79!w4fr7l>iE&lma0c5Kc`%e?xyRc=AVzN!;7-dT{2Jt(5>>}2DS355Ko zt1ki{f;Fj)qOHjx+B}e8<;EyhdO+~Puu6sZB5*7NV$H5|tU@b=;(R6$$|2}devjIX263WC#dcv~$0H9-> z!Nu$_2s-THG=*{3kv9icPvCC>6=e%^0kzZE&|08{wJ?vH`vfs3bq7tltbLi6sU|^M z(w;(|ntroQYvZvuGEuM0G)$)g>vu6KTR>V-bpVuzZO#Z<0W4Q!D$QOZYryZAU(D9~ zthrd$_&oqs9PnLXfbnn%NqJhk=7F^Yk%gs4U;R%_AgrH?mg3FAmYRc-6$jAhv8)I# zN}b38I#Bcb0r~P@_$&B4sK#U+P!>JgJs+Cho zzbcC&6!rNFFqP)Rx=mlwgvMj2iVZomy4KAi6$WhZVdCal(%!}%CjgV`;4+*0l8aEH)O~WaP=nZuAbVN>*e;l&` z^VkVQS)DeMGJTiFv@*3JXNu`N_=E@xS?lT7Ih=@_j4@CEddbkqxtL8c?T0b_?Z>=e z&XN?NQ3dN^V=^FsB24EuI32G^Lrf>$r`JoqR;oa#v}h`7=@H~o8ez$;Mw{h`$iVms zkl;_prn@XQ?{jS;&|ZV-**~CKhG29S2xCrg1kJK_C73;bUu`SY%P!#~?f?P788dE9 zK%^C5(MbF9ix0g+S@R(^=|lEZf{mIBtZ(v1#C51)#3kz)L0KyBV)iCv6gk*{qT@AP z6cz^;^&KpqMv$v8_xkuTQm`>jz2PO zxff;buGnff{9)kK^_D{8oQ0Xhdc7=I>MelH8F0EWjLu3B$dax#7X2nhLpa)d9xDje zCP5dTT+Uk~1;~N-JadyHjGteB5!mf0lkGg7=2+ z`O)!e*aTwYOIP4Y)W~BJH>E?`0LV>9$}d7CWsuanqjC%MrX^fhBUvjL%l zZY-ur_LXa;-h|;kO#pFF4CfTa-#EnI(|6iNP?pukG;;uH##(QgS0(rm|4aU@ygZmg z+zQU4R3O|Vh)8%A&fF;B^t})L5#WP#FciZqJ7EYe-AF5=F$hqpVqc0djnq9zlN#j; zepaEhR)-+(V(Q_ZsL7^`q4^QO1X6_VK5P(VqeMj(Y`D;!vZVjzj);V>m_0PU0xii4 zU~h?Xtq)jwy%???=B@xsVLP2Ah}{@^G`>WGn!y%OnEQYU|3M1ys#b+|lIRW=l0H7&(eiUL8(rZ}^#@%yM zBVyt+JJ2p#w3r5o2UmccC4prMaQXd{H*cH+C8pJ3bTK=?qTeV_mNRs)uk>IJim>D^ zTyK{UFNfm6&JmD`>EMKRflX>%pLWw3q2pH$rqAafm#Bv#?vt@7|DcI!L~tzZ8E=0Z zMs#>$uF3@X&6DBm7kMM623yIATIogv?D~fiEH7-794gP%KOxOm9^n|Lv=dRor2Qh=1NV1nL387Im;iiLfzpmxIfjF`kecTk|c2 z!cE3t?!oG#hN z!tf9+sdu#=z}9Qnp%7|jw7Wk9*XUT725FWJ1~#D}`Sc((^#ja7zO;cox^vce=9NWD z*IRxUE;{zsQ#1r~kDYBGE%$f#Sfh#HD2y0b%P<|blmu%ft>h!y0M}V_5Ha4y zWt(BcNd1o3C?%sc(xfE%wOe_J<E%} zXZRw(+evf6?*P&s`ket~yu&Q_EkyZu)yHe}5Z0kTM2$}(vQV?_gc?@fk}v%} zk_?3$8U1)lCEg5LEF1?w2N-aDy3nWIV)SOb z0$ucfg2bDU$9(y~O~5*8vx^cmmOREf*XlNL-k(|;wsp8b)hE7%c6& z?nI3OgiH2Mj3~nv=v(j+t^5r`#sdg5J66Cp8?9V13tKrFz^pL<(1hs4g3tYGG~hBM zl+wM~SG?li5d0u7*u0{(!?Cs1Q1+IHoM_GhJ8fNp5S|Nwk_u6~k1Vg_0_=v-UZfcd z#qyiL4f#u*&Vo~5n6Lr)l;I=T_z)E_g^9g#nk!egg>08`IGR)t8r-)gaA-k2@wByM zmS){x!h}T@5Z?xs6a>2H=7PMvA+Q0nNX;@LKJdG1gQ3U@Aa$ze2gD&WcPsv(Y|v7| z=Cz)+yX$3%uYO-h=4Z{=K^xae#Hg>`Ttj!OF$^^Q#~o;k`Zt$rXi)?i4S6c~*aUvM zH&hl;P8M2t_+WVaP{Wv?hq;jAue^a&w)tR3fgIu9Gz(S`wTv++#;puQl75P*W;c|} z+zp5hT`0VwQkEg6oaTD)2+{-P+C&qkoq<{;$L+{21o^ZEc;S==yzGQv`4ls~-W)(0 zfhF|C3zfX^KA6Go+29ByA|o^_HN8SxB36uwn$!fvT2L9aq6_ z4QwPOb(z;=esk<9f?q`Yx2Qm=jTNVR zQLf~pf@bigmxK7?h=RljLhv4wk}HzZ(+7V5*({8|O2|sdEQqn>$T>W*)?iop1k&Gf z03^KNv%BHnnS5Q87%1UtSqI_H2i03xt8gkV)j~#z65Fpd6YOx5c6>Vrh(IJ_=Fpo3 zisGrFtp(m4crMRF>i&T-VulcC075>Z1H)IMBNW}~Fvf`}Z-Oku8jFYDJd!35>>cxk znBcPz6Gi!S5QPghEtW_V9kbE2Qau+z8vKS}w?i}|1pf4T6)^~+?uf-dm%alwR0+x= zF45Tx90_u(6itA26Hb8YKd+GFo?~olYCIpJYXw=jRH2#>1W-h5#g|G)xJTH`k?51$ z(+Y^9RtEcMlsn_~?B2JNX7V#pp2Y8_^#nU}7qnC;7C;Gp3)(T^-PmRb^5s3(dVZ}| zB(yNh8>j*jSh=vlA%d|-Fa&=WwNxX`7#QVwWDXiwP$qmdD78yjwa04D7Kp;+4veok zUxQUR&nOAhN==FKYoY+ls0aa-Tk~^pCKJl9zHo;+wicEH5k4*;OV*#bK%0=G5w6(6 zUlA4^c|7blLTwUlLWYINd9MT_F;z;@lL`rj0YQXIEwl&WkRV2?BXWwxSdoWm?{LDA_Y?FZ%|_ir z3Y4DF21=%|)$zf+m*ANpa1me`2gFF^>3kDfIKrn?{3Ue8AS$#k#-0|zRH8UZr#uAF z91kfuYY48A0f?6*L#k6HgbhOKN<2h)dKmv_R#1?E?_>wfgXPg5G*X7>9NRmvm@_+L z4r|8CfeePV&Cq@A%TEUmjnsJ+WGQrZ-sQ%0Gw4_NKo~ z8=l@<2^K+m!*g5?K|ksxh&MGeQo1bR;d7i3u7_?Xi1C~0N5%yC8HP?g1=>{b-mVZU-GPf&Jx5I+-9UOjQ4uf$9Itz}>d?ZF{<)QZ@&t!mJCuhMz#M!0Db} z4Zv`r68_~prTNGRiEjnR{x1^#WqIIa?@`~ZNRSJ#SJi<2V^euzE;%rRSvn%ei6#doAs^vWe`}f;0#79IQSc-Md%3!`ZXtBo7eI+=87-!~pnpMd z02cVuuv%JH4EiLj3nlx{g7_CzVSXPwjT&VA|C z+coRAeA@UuVHMw4iuRlE^2-~Yl&-*LA0zMFfxZE5aP>guqUuPlfnv|?oR}ZUZZGS; ze|+v(=vrcz;M>%0sm3ys(p;N|qQE;RZBc)7rTMMT{2cFt$Ry|I#Bl7j3W9&(gk4C+!22g-8hZWu^b1qQgtohd_SNq*nzivYSI>L6s=+MB z)ND!?`Gxu+DclMY&6@?@NaVW@%`#i zP@f*|tCel|W>3Dt%=xtkBULJ-jJB{VQ!c9bFuNfwCjIwIcQ@tV`ra97#Eg8|)flk- zy7#9BCV2*XV}dx6oLW=6p=i;F$#F?ZmMR{;fBco2o#gV*D3y*aG;IW#2y9inD4rf- z<@)&Qn;7mu&-|lRG2Ga7@tnF3){zACPb5dlvB{LwNv_0Mp+Kjb_i6V|p5HQVC$ zvVfa%O|ElZ+?Zwjx%oAwbuQrzi5VN)HV#`ei6=5P_)l{^tdR5O_H^Hjf!tWbkq>=c z9el^tAN(UNO@BHqiRK5$D_(nyU;a8Y|B>_1D1Llfaa-M7N>4|A&qTSLdy zFa9I`f|oV+o*FzBo~7}{((R>2QKdsezzA(}YhJib72 z5oVdHj2$_Oi-yH$W9nG~T`Wgv6N!yhi;9=7QH@XCAb*TToZEhYVB{ht8>02q6JA4k zre}F$E$?1=)12<*T@oe7Wdxu<;;sWprp&RTxQEK<(h0 zVg2^@ZEo9Vt+6P&3MSd0x0@*;iTn%&(C$`voWl?5Vm7pOA(0oqEN?GO)^j=zFSldwNRO<1r#QFtTRr@P^iPHGK2-&iz4_JSfwQ~2H5uWtc6rk%F{xJXOU6+8jZrE3;!VD$)aS%Gze3Tc%5a4ooBI&m ziF(k-4R!@OEYz)vz}f~^UYEtB*KJQp?-`=RvIr0qx%Z=x#n}6RZ@zk82h&*7W?9tE z=&aB5j0GTisxcRRo+oO}R5T`7Bipqa%s>MGArCd?%*Q)W3Sdp!!E9*H^fUkmbdMQ3 z3R3_C&=n9s3C>ZM#YL`vMqqE$v(27Do&zQ`6G2}1%I&3I=D}~+OUeW5JkY9DHIdx<(yMPE8PW@}*2G3@qNP}K zXK6LmQ)Zc$WRkob6I(eYHoi&S;-cHBHRoF=Inx-+4yPVu9N0dKIS6z)1Msx!=g~+* z4x)ETN&VnI7(b__1paHXITl;_ShAiTv%xq71k0BlFuk}<8C$kexU81-hjIU4lDhdA zNvdP$`NG9?ydn2^QQ9$nb~$|&{T3_FwS^K)`P|1+Q?FX1iWcJh=3-fNm10S83J+$b z8aa5zjS|@2JKUbE)EYZ5#_COb7GruuMRy|Zr~%`;M(;daQ^lIHZJ#!txC6e-GvAkwbE57+`RKy=mvNFG3Js)U-(9Ekn4Lva08DCJbd|blhhUjZ zyy${o{X1FD9{DnH)XDXHaAni6-z1NICYGkw-f(s5*#3XSpwLb?9Cdn_Z|Op1b|^8&6vtpkEtJI$on-eC9ynJZkDQt}1| z%EaQhMmT#MHR0;o@A7cntC3>OX*ZYR<|bdVl~UVCM9?USHaUi(X+E8&{pP@?6DYWF z&Z*EYrpBcw-n2$_JPkSWrNWsHt+TM8-HGEMrVo0@kHES=5$a{Xy6aEO#%2FQ87>4y zzD2_Pfa?W=hcSAZ)(B~Lc-@a*_7IZ!ZsiWw9(psz??|QmJL+{q7xtA0iv?Dt)i9d^ zkR@S3VN7gw^MIoi#}`zB!dBDHd;bOnAgn({x8TQVP#Q+jFl(MjqUAomSHDG{`M15`Sfi{+D^N^eLsX5Pt>DJ6i7cx^p_IVrUrPVOt6AVFF8qxBaVtF zw?h7tp5;N8v%Q%cqIAiZ>sKP5togZtHqfX@sNukFe`exWMa)s0g!cTqaZ9hoewyvY zZhe2B&1#(hbD20AcaO(BAoL`K&bz<0wkR<$Pda~$;=yEnYePKNeRFnu{_c}^zy)}6 zM$%fkzMjgHn(uC0TaRhA(Vwzf-X^0wDW$HeDd0BGMTX8ksFK(3j;)>UMtM?n>o+Mb z9<)xTK-=nM-rxbO`xPqauIYjrB{{*!>(j=YEjy<3fLE%KzQW*k+ETUtFWR0P1Ak}4 zqK`C)zzfHuS-%PM-Gj|&+lGhWEmI`k@*B-x;xUDc z6N)$S>~pC#;v$4BdN}wG45e9#17L*LZ7KN*MlLLr64L8N&l$L-b#@gueU_8~xk3#dxb^G^w5hk&;M#@eNLbrd~c?9{z_0O}*PzW2t2;VG?OBW#MMRC6(Me?Mj^)~Ut>#=B4w!MCI7v;~a1tqm9LHj22pdZ!9UF#{p z*M4uzjLx#^=hAlKei^m`76}y0X>ZbhC%snIqCz8GfXs0oE1Y#nkuUmZecuyk~PMF(0zNzKSKLvtv^^TtAW)x)u~Oz;*aK#3A8e>^qGjhkHA3S ztEaW`Uy}xXOtOAZq}xvcaieZ_c&yrJ+M36p_lF=OYg*wPrFW0cxd=)bF}`sof@$tc%U8ZakkTG2$k zFIu^(_dMELa`8Le)SVA)#@fpEGzOAJUg@^FnJ7Wn8l4?JD{d$)C7<+Uz39eI&K~ex z+b+cXQkaq6_!DMX)OP!ujpbiq1R;DE;L~hobf#77Y1$TgU{`;VVx#QQIU!ZFHxY^; zYgoIvc-M*ZDkk~kk6Q$!*4ChUaMm& z9ObK_6q7tmQefe4(xsAxGltutlp11zZ4UYS0A3Dp%_vD2efJIV_5KgDfK3yuirnBy z2f>-Dr`4bnVu9^w`RAc9#F(>d?;o(G=D+Ro=*R2&F|S?}&t^WQ<}Lqnq=V!=ltU1oIZqafTd`5+kcX6gIUmQHt2`H7{G1TpTB#xnz2 zbsd|j?T8^Ym=ntYDKq!cItf0Rtf#{8O+=|e@R9ozW^Tr;D9?w|O3xLW70wBpV;<5G zjYzzPv=aIl1%lTtv)wgJF=KLG5Rszl26yiJ0iIcQajj{Uai*TW4XM>TD|^ij3$&>asI6HnpM!LgiUNvs~R`~ISzTK2k^tLi+dd->P}4o zzr`HoacZ}ogZWfzJ+Pp|_GSl*qIJkY)UK3rgJVrLZl}G6-Hu6lb$hniny=Wm{u3>s zrp@hHOU-;L9CY+pLw_+%*2EQn3=H4X$W|9OJn!<@lE}u^4N(>6X#r7nw`dgvDlx+SZ^&}I?W<*b zHYyDc49}PWh0stSj36dB90)IwVVMjTE+yZf3R~c%E0O0jJr$V^c3moH;{v7);n4c7 znQ8c70;;(P8@ypgJ$nhTXq{pMh&sv8>r=zTkfOi(sT5q;Nw6LQ9M{k~5r&!jXfWC{ zt*j5xeyb+T0Vypk@gK`Tf_d?i$|szHx8bq zitnG@t-7{7e-xCqzbrC-HX6Hg7b?^6KJQc{lyC3WtWiZ2oSi~^nJxwaP)nNaM(dNK47FdYq7-EM6?=cyy11SWz3ghrL3%R&K{VNQ-#Rb>Ev8{AqBrtM)mKfw36$;Op? zsB(yKUZ12)&w9%uUyJ;*ItY-#RK~KC*xI-5E1M zpm0IKLhe5m-oMiYc@7Mg%EY}lJc7O(&oN>yK2+~CWlnRGEWs`u&`Nwbg(oJISS^2` zG?J@kRTTSr3Z(7+KmT&mf2!g833JW!^WPQ$dQzMm&Slu#z@o&KB2KPx%)*2oqagT9 zdhUnh>5(a|j2DBsg@xsHl108%L9a;esu5G+RjQfKuj)en-SLnXmp})WhQw zZO|48pYJPO!vad(3PbQBMyHxhS?0kGY`2tQ@D}Fjw=#Z)?Ws8)``&(GG8Z#C=j{Sj z-zYv2d~Q4~D1JO9sB2$r>{N29wW_dEQt&fGB?yZma(z?MRow^B;|%S*J%@e3TwJCk zHe=`2bZ8=4@|PMvTSdDF8xfwzui%!GSjpgmVX`xCa&9Qp-5B1lN)~j{Voe9%P`*tzfWp#e}1Qh z4R-%N+_!x3wx}MtD^ImZ$%NJ$sW47HcI_(H_@2|okQw#7%= z!Yi8r^60gih0L_8nYm9i?)hRXyq8)b2=?u(P892gj3}8ZaSu`j7V_u}_7d?hrL*V| zCW1(Co*k>KlmN{r)BScLxM3*0!o=ziHAQZ~L*=^#0AxWy4BvGpij6}?JfSmW_V1P2 zz@Kl>D%V6P!JfsA+1*kB!|h;r?CW{pnyZVHrebftj0VNUu5vxyV-x})oxqE~s+*Q+ zbp%WQt&j@N7tHk?o3;WJq|!MQugUF0oH2ZF?kY%*22&cm@_1u{$=`vPX~+O~rI*hi zDm;1#Jb7N{&_e8{5okXWZh{3QEQF{MoDt29ysGP7ZN3FN`J#0L%V|$!$rhpb1g9)5 zoFb-HVP>*p3?gmnYs;`*8&8<*52OXdR{>`;{={jR&JR-}}VjUFGrTuF7( zX>e@4AFg&PW|>wM*yGKWHQJ|hBYJCu^5Z9pSoEg3@Y!jh1d7=O->zPMyz!*T{?FLG z-@!cGUfeBmvj|<82#H00J;0B>n|`^*pE-2?*L)Ef8$)%KoKpBjBuIt#9u`h^2&Mk) z#=0H8>+@r#M!I$A3N)Act3tbVP98D5JQ_ayUm@=;nW3c0=$zuG2pU%gJOh(73>oo; zwte23`D?ZH&P8h%G^N3E(c2k}Si5xqUln1r3#|9@b8C2ekD`47fX7_7aRJ7NBr}?% zEoXqFG1g8NMU^k~K?w(b+PQUVg$x~FO3Z)a8vrbB38x|C1EehzUy9x6&!5;duQ|E> zDlvD9T(4{bMP%njE=-IALr$VOQ-AZ}UeWU{4So%PO1v<5Y1+z8C8c%Jw^$O;j%wt- z+M!B{<=thlSz)&ftU+849iSaiU=G??XZ+yz`afB~b*sCWYoBrSI<0P$wK+5}nFX6a zL$`$=#k#onk=AU-xv7;?G&YW`gn&oJ^cG&#T@0s{n9$N2oTH{Ut3f}mMA=EZU^oIb{cA^FH@JGaE9eNABtxgY9jQY2zQ@8)~P zWJn^t+6_t(g$I96TLwgX-QaRluIg%6n+q05HXQ8b+ec1;gk>8wN7!qNqL{0?_SNPb z`auhOpHR>Y2nq~_$E4#h*X?Z+zP~(F+d8R(-q`RN+tZdNSWZ}yP}1mjsC?^r=%>)` z@uG8oiqZ}G5LLmMM9bf8W-SkWYO?WR|U zn%}J~ES$Ex6j~NFJ+Ok|-(pgfz8#QEz2yY*-$FTtO?X?#u@E3&WmP%1=k2GVVUu|9 z7uBL63?^EJ{lRRgRBLz}VX>bDI_J%Vh+%i4*sE)d;be)3JM;jyw)S`YS9uP0I;8il zL%pAhriYABrzsBBFgL!V0$-VQzH5Q63T~ZU2aC-0U;x`oVJ;QPT;Cpo+JnEumYZ`g z{cEwmWeoItF?j89!@`iE>h!bv^$pd3aJlueT&`>SA`9+B=oMVJ^~Kt$AF9oH^lLjk zq=%}ehOy!#<{m}Or_6>HhBkElP_8{x(wOacu~%J;%i+x`Ci z)>jZ98wS+k(IDO0c`Z)j)D+ zi9e*4_#C$w`5=T%-ZmP@V39V1!@UhflS4-Mzq|w%dJ?_zBW~n170_8DOcs#DY;Z(d zYDwEODS?#jJB}(L;zs^V)!O*iiQ<5+G0n82!(DbkfJM}~=&APAn|Lu&tMA&cRDqpQ z2VK9y6_&&@(O|#*N=LBWJz!Vpy^%|_dE#Z^zlIubhu*-_NlcedG}wDOvLS-dGel7|OKK!2wpPDqqNaz|g~A2=g#2Q7RSb#AQ4sJPG8o^kF@gap?rUKMP~$qd(I|BzMunjty)eOH$_^O?> ziqJp2@HFI?L)2-|Lj2pc1n1A!FF!K`b60eI-gB-R;2<0cH`j_TR6rUxq*7Z@B!MsJ zN}Bq44dG(NaWFKq$jj*~qMYLi4LX*fo(@(;UN4>%P2M%C;!oVlc%{jZE9YK&yzxZ- zur2zy7Axijb*il>^SeYi({KmN-sUhEISlG}mosyjDw z#at@cm*+d;8s_V1q*+@-a^-Z2SZIlBCV%s|_$~KNjO4XQ_1~8loX^sKbY_ST_R=FL z*je#z(d17vlu};IBdjL#BxDif^GR{UO6(nJNFJ86WHNB+lY?;&HnH@TtO;Wrc-RIr zH!3Z&2y@z56J?GUbtKW}t;|@9u;jL1XDMo3O0>lVWBQb`~29}-q{tl5K1zFC%s^4F7e|*@LJ8{wx zLO`c(z)q&ge#XyXjQC1Bi`1)`ad*BM4B<q188WDk@;;wNeX+q6tGo|&3n_vm?T;1N3ZS7wN>!ig^HC|rY6egx$?^)%RK-Q7TV`5JP~v3t zs9Mx|H=u{w9Ng0N5bP|f{ewC zlQf4s1k#@;&&dWoFIq(v0n|h7^j+g@Q~$FU69tcOyRt;y$wV&Qv8J&kJho@irJN(gV?S#ehyQ9x|L>e zhfoLUX7ziZ5F%=93k%A)@}=f3F2Ab#0TEY+l}U(JFeAuJv=Zf%gQj6i&UgIFjq)7o zR?2Zq+VPaMLtlKw(h0#W%EDuC$WFfnWt9`iNYBIUU!!P8XK$mXP{+r67<6N+T$^Y;KV~V*+}*LV$6&4h@v~MFZn)_;H|~&c|K*02fyKS_E425 z@Uuy{PMQ`YKT~Mi#nvxZqeXnuTeVME5NG6Z8e;QL3~T3A5RcIa3UV0UO=9B2Z8z;dga)yg9n3< ziq>Y68|%K&S@pyxI^c6`B}}G1w-GR+-g7rNVtGQs0m=xHw~x}XKb$V6fgnz2LxBmQ z6>nPMFy)oL64~;XQs%qmzif;`_D{+<=3?(m6PKExwvHg1)V`x^`+DAO+Ud3&h4V!C zk9JMt*`APGWt*)K`PY`3<(Q-@Y$$6O>++k<@rx1yA*ZB@(F8F&U)eTwoU?>LU=X>- z#8RnAX2D(u`R>CntJ(THcEZkE)O`HKV%$s@N(uf}3Pg^4ya*0ssIjO7CM1?xEc#14 ztT|>Y+8%*%oO0rcFT!^wE^xi(pnI1&+-USaJ zgH3o2bF(GlAPf({W(UFPjl0`qiu13~uE<{%l>+$;aIBJyaPGK37sn2W19IWW^3b#@11^4VU){kgPTWotk(5bD|?@DA3$^0t8*XPQwfT zY-&oTng=2%UW%X)AwkW>B=X07MiN<&_faCZ9f#a+C4l^tyLo-HXJ7Z;Eb%MCXGEF} zgcZRx;OimA*Lkq%p4XZLe^ed)rZvn2cu zxOMHMxWf176*F77NHQE7tcXjnL!wY}3`3hw!;+7#gT;xP(Rh?CG&5Co#8(KOkvF6+ zNY%~fpnEk=VV)W?{^qL&vJntdSIA4ujBuHE?eRU$2zjDoWu6m{%XQEUpk>!_lKRBJ zIeQ!Xtb^n-X)HFw+uJL#s0AmgAa%6_j@HpGQKy&4-$L!u;UvCF>Romb#clJ^1MUjB zJje#mr%Bi#ve%)FuV5lfV{e6l$96x*6aSQV$PnuMG@0W5IB)||Bd<}$|E+kXj3ww) zt6h8p&NB;W{0iznnAI{Yg3JB>4709sDsB1p$W*4dbqf}&FM;V=BREF4Buo<(QB>Yh zP(76wr@oCwsg5LA6Q0h&<_mjjOKgdyL>G3$hOKW@Lwm+V=0>qJG~1MHQ=>6l;Q|mM zHO;`aI^h-C&l#RRgH(qDTH~$n>)<=K#_FaamKH?~Iv5MWrL%Xi_01m8vB%KYK$L-h z!@rLHB9w#Z(cxgyoxBC!TBSAfZo4hAQkV6AfA@~|4Y{OI@Vk+xkGz-h+%x=w+y%Lj zifl!46FDSK8i1XKzI^A5 zroV`XpSq`Dww48qiW+H*j)vf`4_%m4-rlQd8a~if@KbyfrO9VsewhNNn{Z~6+57mc>Q!!iW@ozHe+$ShHcNj@sdfMypBzP?AN{$`I({o zdfG!ubG&Z0W`YU5`cxxRyyqdUGl#vDw4S6*uyx=|u#R6Vmh5R~Bc7oGK2;Ywt0yB6 z10#N}!nKp=xMlJt_UZ)jfTCT1L1ok<6zvY>da|E+;@>y!*?|b>2UWTN;Z+Lu7~y^q zT;V~^eGf_MT|*JKJ-1e*6c^rd-y+CJabj&vgc}ZPwM7&4g zMo%4WLezP4Ws1E?0|`l-l`By=FDpGLr+n>XUxLngpLlNykFob8N!-}kb|fkzmt7kvxDBI#vLuO zFQv}*ZW+CR*DM!GD=_&2CF@NG)Irwx^?S%4hN;0!a@E!NbL~<{Vq`GgA-?f*CyU0m602XE+yBp~2p}RlKLUcv7u6Ks`aBI!C1w?+Nk`wQV4jkIs_IYU?S_>%k1k zVNT^#_>G&5sWO&k|K&+~vMx~4uEmaoByUprndRcKpqwsHPNSEkyV??J;+2XZIpxgIBrtV>C!3~E$LcG&HoPuXB;oe^S!a7T*!I8$igo!7MX}z zOPFMW+&>W&>}dU2fLpCrdo(3?>K;?_7$3rZ7SnGkxtwoD4M@B$r=0h1J&0Y{$Q&w* zeE&ehR(cldSg47Wm%jcm{v-#%bpB__7(!49))nqyMG!}}wIc7HWzYj}VTfA4HMLTK zBcM2bJ>R|7^CKLTM?4IQlqnt@UN0U1kLJ)pM1=MInZuO_Mi)pdjQELMmiSo@*Yn1Q zN^BC|7on_S;bKjp^QiTKdx=_y0n$RpK1a$@>YM31W8l1gn9V0e#xneTySP6=q8QyD z>o^+7?FAzfH6cmZ$&18tIEEjN1H1i*JohrQusBHElW@30SGd|@QE&eXmmnvh?IAxN19g@M<=gntrhF%1uQ&eSfggALpl4M< z2QkA5sor4-Kc~Enmr$-7i6of6`~kT!wqu3l^2tVJMmLIbWsz7??3cCmraH2MIPBnS z;=?;-Mm*x@L(>P@2>a#XEjuJ3H$x36)aOJLWob+6C21R{00EG|bDeC2^M64StBIS1 z+&mXMx18|v8G)|#5ZDPwA9x6W$(SC0)1)<~{XbfA5)>sC#xf8`+7B~Z5b!N;$e|aA zp|tX&RNc1q_d>5o2fN5Z;13`M%q zV+$cVwrVvTua?~6Uw|BmN?>$tx?t%M;S~}=3(P2NI=S^Xn2z=*a%u4Po2^Kf_({q{ zvOpOrjCF1r008o9QM*t}`9j=(C{x&Ep$;dBirW%M3Rj?LReI8tm)i{Iqlw#+tXutR zv*7y!_vxTzM7*d?Q=q)r06WBwo%|G_kMMpA$;;$5B-P_;WDRMrnnd#VkT;& zK`rEI$h$jEUs2TQMYS56TUsHO0@&rIQVdH1N z{L+p9ujj-SSCrCVy6RXiB>AcOaOE(}W7djQZEEG}9eNUPq=(6R{awu$_g@8pzKrPiu)+A~oV4(GtmSSGs{S_q|6 zcOU94qDFRqqOiu>^h|kE>j8rw{oiZ#n1eg$b@-3(+*m*8N-b3B1RJefbliZjv4(Xc zd-oZQslU!sXM|A# zElfE*XGHEmXksUc^3&CY8%;uUUW!by+ui=7ZzPmvFwdYcr+YVbxRj{)%eFfTVV^Y= zV`5J-3YX+rEZlaSZn9sF_W6YQsW;%dJEOR$ba(6(TGV;yrntNt6OOSI*Y|11=l>w)>DGM13Tdy8j-ygW^~mm<$T*~#|BvCbjRJf#>RrOMW)Qh?6c z@EI8uM;8;jg$1xjtsdo;EgMm)`N9VC_fftm*CRHaZX+AcA@W7dffS(>@nAEZwq$sV z@QJ*Rm3LBWMY}%odKlDhsz+;nfnXeF(Vv6~XY4`|cJpVJ4GgiQKARM+Re76|njKyhp#1L3kI_mdZIp8LFMTnK1fI$&+{xXE7vHdB`7gFIFq+=wa?no-+IgDLxhZ zT`2x-e+Xg7pkLQOhMe$*g<{Rj#&Ain;TVe(h=&=+sSPluwnKT8ZRjo^XKRcS15vZC z%6|DD@>cfADWh>eCPxYfSVyA$NFc)(L&G?pnJ5)}cq0xVYYhz;{GtTrISLTBFPDxh zN`Cd83*6C4*%wFaV7ri>QZY^^b5?=2m-XU80!KpTF=e<>f1w*7 z6~!h)`K6zj2~f82UxW{)QuyHAN~JByo^US`%U}ct1|fr?mb!Y|p21ie@-F7>5GJvl$0|nBvRK?DN*Ks1j=f~VG&+KCHd9c?l3T7R6;HKx zZx=>8mRzI;7414P*kS#>2Bl5Jj_l_Dq1_R;0S1wcf56V{0#xtg(1aMGy6BZc@^g=R6n16?LJ@8gzoo zUgGxPE<0nw`kAhjY|~!tlqzI!>V!D+^wnG`_2&L3CS!r)6O`M)34j;|1OeJnNL2O) zPHM)(72n89&uk);XF~Zk!<7}W465B{%S}p;8ADUXA?N8FNRXH(U;Q<5KmO`ePqr^^ zwjIOEubo7dAL1k~+ubV}z7&2h&wLLgM-lul&w79$!3Lw#ObDdQZ@iM8I6@pUmfv^`2=AuJz|*a8$eXEcpu<%=$hb7H zlwi=^?}x7g_|VX88d50Z1iKVx1YNq-o^r~u7rQ3WFgTGZRLn8$uVaiHt9 zNXl*UI(x9VDgRL)>_5v8s! zICa&#yl?i%tcBhFMA?X>ud(o{m9Pm+#J-gOlx%3ibk!|pNDwew*^J6raSBJx65(5i z-*Dx^4>W}xDipTy)5qHOV|)J&BMD3B&Yvmo)fnZX45p{74mQA&cLDgDCkW#uv8SAD zK&J$Y+nx`DU(Bz8jNuIUe(Yprl+i_oyMi;pf%Ki@V*`3{Ql~+-gTgOS2P}G}7Ku%b zENsy;dkPQu%J$0?*J26c&+A@7pCG&SdBOWiSNAWVeKT%9wNVlb$m`U7Mn5VcYD>DU zQrytbQ^Gew!dzrLJT@>|TvSLW$fUA38xbtjv&}EZl7u54(2kVIO_V9_qey z?pz6x2`>SV&(1I#(C?EGY6oPB19TsYg~jjO)_PXfW zhnaJuyw_JSN{B7SwkL*dbgbAuYIp=Gb6k!m_o8nXVZt+>XhN6}F)}0ge<#SD+kN}0 z|M?M|CbyZR3Mz+wDTj(t0x(&dih{HMT06jpS`; zA{)`@fa0L26~4PI+(#2D!42T>G_fk+2NlA$-lQ@DqG3MPvTMRpHRxON68!f08NC}Lfz->82T1g zTNN22#vg8C`-b9E?l>uemLpB)T5h)XHj6~tFu3cs@|YKG~s2}8fO0zaTKT=~-bN%G=5Pq&FQ#e-i@ zS$X+oW;C~nwvD(WZYgf)c`JObBvbqm3$RU{Ri2#%5dAysV8R@nNHO!xvt%Qbwjp1{ zDh*MuGhb#tLQvRSN;Vi{CdK-Hy1Mp&nzAl_(iej!Qk1Vo*noO||Odp&;Z zx7K-V?<1E_v>>MuwJ96ch>)AI@C-laFJK+uUr?$wCeZXE_zS9Cs&T8P%SJJ_KS*~x zyST&Mxee{t;blJwY~zr_fmFhW=F0N|xfL8+H^q7@gpYLf>}y%o z+mjNSz2V{TJu(7EkyeGUJ06PBpM&0YjoN9NGEM)isR!q&*xGdN+LEpEq z3EoPMk~z8Z9oDBb^)(EGoICrKdvBkYyD*)tV~(!cB06jq?4U_06Ej!XUMQ*=k~{2n|)BY-So9R zRxJaQ!9qYr%reks#uEzMUHXE(IfW1AKWC!!>Cd*u0*-S+5>|5q=<E1XRVCyS;8@VtO8DzQBg}MMhW~ZnjFZO_( zE_o#^j0TyCx{kES0AtD9`&->m$xA$iT1H1MJeSNx{R6b+*I5JiS;_Dgzsy}mTNk)L z!1}s6+4*fXY)Zl&H7H<{@dDBm?2lY=e>J^bE?d`ZVj@iNUuelyonr65k{7OSXL9@& zzNjm0t;{wlHxgZ71_<9IfUVRmD2C*Ke#I~Bi0&}r3psRM(e+Y#W+k{KY#q~e#-(~b z&}mLk$$zYi+^3*24DH_5W$bFmu0S*S`GIv%BJbKahBkj&`nO+h)PV!zWRWS= z0Jy{YAp?T;dWXwlh*aYvY+{Tjg&X1{e<^H&SCu!&U_yJiq#+nrpHeGWXT6;ERIIh& zh6}M!U~A%7)E7L!MW!i~pg3Ded^MewoilwjR9!yOYbS_J$vThGr;xgU06cM*^`H4$ z(%fmIlW9J-CeDx)?IOjm*vkY$Xq6SAm>{x$wl(pa!ZmX(plL^2xAcTUC0XD;MOO}8 zNQdIBG#C(`)ui{Jj5JC-taYqEfH(0iXzMQm>#M=1WjH6+EXZ)F4#0Dk-&TqZlA|m9 ztt|AG{;p7I@#t3dLL*kxl)oYEU^|A7Rg6^y>Lhp1WyMoyb)ikD2?9713J!KQR0D4o9( zlvi|zg9cF|3$?^^Z(EaK?7sQAp~$#8u;4J zGUFZmAImsI0Wek}Y<$cfi{ELhy5c~K>KIX3A>)30qw*p;6%uepNiKgLZjZ;4z-~@~ zT2NyEU!jl39c+Y&YLyN3vl{Z^5>>g5!p*mAl$Fg9O_c>EIjv-VB>FN2`I;}HI1WNS z`M{#9@?Hg{J+khUVBIVCS=OfjKcw->h6m7&q|7n0a|YgqmLUG9AoqQiH4AJ%!*1of z2LDhT+RGd}yDv1DqT5e|ChSCA zhW2%%4{|pY8+4Q$o$L%xrZ_Vvh_^MR3?tSwg-h_a67e~5_u!+g#q?mXAzImO*Jw3>@5%?o>q++QIUP27SlyF53_T%5lu?T`Wd|B7n(e>shu+Xd^!MCIV= zvFfD{Ou4)uu!D!Qjw2GrSDNiC-TF0aSR{E5bO>R*V2p=I;_4x5>K&vOBLYMA!wMVV zxee7mS(U&SaNw4p=`78Zizvl+?CMvCVA7=c!+Jj*-S&lCqNYfAu%ZanCJ=e>9EM0T zOaA&0A4?GT=uL8;*MqGQ2jtihxp(l_aP-n5`Ja*Mr44ecB!K&D$0|#|L+&%5my+-+ z`iLezBrU1B-l~(77w|=r z@a-~YM1I~;&p4q3JZf=}#he$MQ&DkH4B#9_e6A(;ZM=2}ibpo+$xTkGCfIu=5c3wN zZcdE#;Z$RLHp=eKxYxk*h`Q-G)$>iiPW2NwnnSe}+uoRQN0#a)Jkmro=WXIx^%S6a zUotD-H-9w*V^^Sx;JOPlW!Keo%wQ4(+CtCZ9#XrpjFTC_-sG&3(1v<}OB-bfYGB5y zXwXD)%!+hGXyt;z;LQbwlu@8?3DaWVGVH)Vn~Eee-DhQn&+`I* z#s`0m4ufIDZg?L3Io{QkJ|&HNrJ@60$shzGoc06@Ann1u*6+D0P%;ttT_X0O(nFwW zwA~whP)DI>gwc!$@U^|+R^V<1pPrIkXaJ56i>yZPAxofz{ZG!pL>;c<`@!!q!;S-? z^iFAglBrxRTk7kpY-cIZlJ<<1Uwg)<_ACZvC09K}Q|m*ytVMZQ{vHNj`63pHmBy^P zJE^Lgd0OCsLhu-2W8Q3v*K-nRw_k38#$4~q&v z0;?g9nTkZ?vYtNsp0y1z8Okc$V2YT3y9k_ zM3;t!p=NA1$F&9HQ*~)BMSe073C1J%50bU{-aeG&G2-8iwl|J?R8^1T*q>KOGvmm0 zP9xQoZ$0TAFLPv|vHwLNCAGp{Ol3m;3xy9cat7S_6fgucJW-p6NN@n{YE2*H}qcbFGYbmcng`P~N zsgSD=dy4v@i#Ftj^7#-(fR%aL8* zKGsTtBxOU*{XTX*I8mV`k@45I6+FU;8#SqvJ&{tpa}JNcDqaOD^eKTm-g*Zc|NzIg|m>&%v|eb`{IHG!v+P3+N-E-GE^=aLrdh zLYfcxG7qDXeSv%TnVgcbf`B*okguW=Oz^9UjYzHnDenNoVShxOC(X?615KEVp_LNZ z!HrCJ3GM8D5E;ODI?DnD=xJTt7)P7L@4GiYr9V;@(Yw2Vq~;+$q-m}==GJ!HTfl=x zHUc)GE;ot^Xix21xeaw9WI;V>gfak8(}^R%qWJ3wNE>D$m;dc-XZ}Q4UZc_?=VD(= zQ8rBa4HYnvHJpp;w)?>6+783W0%$cQ34QD=xs_5Ct&@>|AH6~D6XSak^Er&s?_mL2 za0(|EG9UWf?^XMX+ zpYK%7xv1guStSuR!5EL<-uBCd@72m~?r4&5;}JdAvJh4#S?nPq%ab`5r-+{E-rLdW zl(VKY<#omVfof1ZCzMs;k;H1XZtQY{ZWzOCjRA|~F^rt@p%p9p47~DH<}VZ5>Mb2T z(@aHVfW>fAh}^hu;0ZnKQ>0fAE%w8 lH0Tncwo325?+8O)84!;-1@PNO1|SO~YC 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 JYk^?j{{egwM0@}M literal 0 HcmV?d00001 diff --git a/assets/firebase-logo.png b/assets/firebase-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4cfb7da30d9caf83f3fbe6d23e0dfab50c8be818 GIT binary patch literal 12151 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 jd;kA>%Kr~L { + await this.mutex.runExclusive(() => { + this.processed++; + }); } - incrementFilesUploaded() { - this.uploaded++ + + async incrementFilesUploaded(): Promise { + await this.mutex.runExclusive(() => { + this.uploaded++; + }); } + get filesUploaded(){ return this.uploaded } diff --git a/worker/app/report-builder.ts b/worker/app/report-builder.ts index a35adde..661bc8a 100644 --- a/worker/app/report-builder.ts +++ b/worker/app/report-builder.ts @@ -1,7 +1,7 @@ import {REPORTS_DIR, STAGING_PATH} from "../index"; const allure = require('allure-commandline') -import {deploy} from "./site-builder"; +import {changePermissionsRecursively, createFirebaseJson, publishToFireBaseHosting} from "./site-builder"; import * as path from "node:path"; import * as fs from 'fs/promises' import counter from "./counter"; @@ -17,10 +17,13 @@ class ReportBuilder { public setTtl() { clearTimeout(this.timeOut) - this.timeOut = setTimeout(this.generateAndHost, this.ttl * 1000) + this.timeOut = setTimeout(async () => { + await this.generate() + return await this.host() + }, this.ttl * 1000) } - public async generateAndHost() { + public async generate() { // History files can exist in reports directory in WATCH_MODE // due to multiple call to generateAndHost, so we try to move @@ -53,7 +56,7 @@ class ReportBuilder { let success = false await new Promise((resolve, reject) => { generation.on('exit', async function (exitCode: number) { - success = exitCode == 0 + success = exitCode === 0 if (success) { resolve('success') } else { @@ -62,14 +65,6 @@ class ReportBuilder { } }) }) - if (success){ - try { - return await deploy() - } catch (e) { - console.log(`Hosting deployment failed: ${e}`) - } - } - return null } // Move from '/allure-results' mount to staging @@ -79,7 +74,7 @@ class ReportBuilder { const destinationFilePath = path.join(STAGING_PATH, path.basename(file)); await fs.mkdir(path.dirname(destinationFilePath), {recursive: true});// recursive, don't throw await fs.copyFile(file, destinationFilePath); - counter.incrementFilesProcessed() + await counter.incrementFilesProcessed() } catch (e) { console.warn(`Failed to move ${path.basename(file)} to staging area: ${e}`) } @@ -88,6 +83,13 @@ class ReportBuilder { return this } + public async host() { + await createFirebaseJson() + // Grant execution permission to website files + await changePermissionsRecursively(REPORTS_DIR, 0o755) + return await publishToFireBaseHosting() + } + } export default new ReportBuilder() \ No newline at end of file diff --git a/worker/app/site-builder.ts b/worker/app/site-builder.ts index 5fae8bd..3cb392f 100644 --- a/worker/app/site-builder.ts +++ b/worker/app/site-builder.ts @@ -10,7 +10,7 @@ import counter from "./counter"; const exec = util.promisify(require('child_process').exec) -async function createFirebaseJson() { +export async function createFirebaseJson() { const hosting = { "hosting": { "public": ".", @@ -30,7 +30,7 @@ async function createFirebaseJson() { } } -async function changePermissionsRecursively(dirPath: string, mode: fsSync.Mode) { +export async function changePermissionsRecursively(dirPath: string, mode: fsSync.Mode) { await fs.chmod(dirPath, mode); const files = await fs.readdir(dirPath); @@ -47,7 +47,7 @@ async function changePermissionsRecursively(dirPath: string, mode: fsSync.Mode) } } -async function publishToFireBaseHosting() { +export async function publishToFireBaseHosting() { if (process.env.DEBUG === 'true') { console.warn('DEBUG=true: Skipping live deployment') return @@ -118,12 +118,6 @@ export function writeGitHubSummary({summaryPath = '', url = ''}) { } } -export async function deploy() { - await createFirebaseJson() - // Grant execution permission to website files - await changePermissionsRecursively(REPORTS_DIR, 0o755) - return await publishToFireBaseHosting() -} diff --git a/worker/app/util.ts b/worker/app/util.ts index 79bd164..97db4fe 100644 --- a/worker/app/util.ts +++ b/worker/app/util.ts @@ -46,16 +46,19 @@ export async function getAllFiles(dirPath: string): Promise { export function validateWebsiteExpires(expires: string): boolean { // Check if input is empty if (!expires) { - console.error('Error: WEBSITE_EXPIRES cannot be empty'); return false; } + if(expires.trim().length > 3){ + return false; + } + + // Regex to validate format: number followed by h/d/w const validFormatRegex = /^(\d+)([hdw])$/; const match = expires.match(validFormatRegex); if (!match) { - console.error('Error: Invalid WEBSITE_EXPIRES format. Use format like 12h, 7d, or 2w'); return false; } diff --git a/worker/index.ts b/worker/index.ts index 26c0674..3b0fb08 100644 --- a/worker/index.ts +++ b/worker/index.ts @@ -73,7 +73,8 @@ function main(): void { ReportBuilder.stageFiles(await getAllFiles(MOUNTED_PATH)), cloudStorage?.stageRemoteFiles() ]) - const url = await ReportBuilder.generateAndHost() + await ReportBuilder.generate() + const url = await ReportBuilder.host() if(keepHistory){ await cloudStorage?.uploadHistory() }