From d86caa0b1e1ff3722a0d1b4d1534f020a47e842d Mon Sep 17 00:00:00 2001 From: Sucukdeluxe <259325684+Sucukdeluxe@users.noreply.github.com> Date: Mon, 10 Aug 2026 09:27:23 +0200 Subject: [PATCH] release: v2.0.6 Redesign the desktop workspace with task sidebars, live filters, clearer settings, and an accessible update dialog. Harden encrypted backup imports, configuration persistence, history retention, queue snapshots, shutdown recovery, and update installation ordering. Publish verified Windows artifacts and refreshed English documentation. --- .gitignore | 2 +- README.md | 8 +- assets/product-overview.png | Bin 291162 -> 51766 bytes lib/config-store.js | 144 ++- lib/updater.js | 69 +- main.js | 466 +++++-- package-lock.json | 4 +- package.json | 6 +- preload.js | 11 +- renderer/app.js | 1073 ++++++++++++++-- renderer/drop-target.html | 46 +- renderer/index.html | 347 ++++-- renderer/styles.css | 1651 ++++++++++++++++++++++++- scripts/release-plan.mjs | 47 + scripts/verify-public-release.mjs | 297 +++-- tests/config-store.test.js | 327 +++++ tests/history-retention.test.js | 15 +- tests/package-build-files.test.js | 47 + tests/public-release-verifier.test.js | 75 ++ tests/ui-smoke.js | 986 ++++++++++++++- tests/updater-version.test.js | 135 +- 21 files changed, 5193 insertions(+), 563 deletions(-) create mode 100644 scripts/release-plan.mjs create mode 100644 tests/public-release-verifier.test.js diff --git a/.gitignore b/.gitignore index 42a6a46..d45a107 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ node_modules/ release/ -.worktrees/ +.artifacts/ __pycache__/ *.pyc diff --git a/README.md b/README.md index c5c790d..f2142db 100644 --- a/README.md +++ b/README.md @@ -9,11 +9,13 @@ Multi-Hoster-Upload is a Windows desktop app for managing large file batches acr ## Capabilities - Upload one batch to several supported hosters in parallel. -- Manage multiple accounts per hoster with validation, health checks, and automatic rotation. +- Manage multiple accounts per hoster with validation, health checks, automatic rotation, and inline OTP completion. +- Filter uploads, accounts, and history from task-focused sidebars without changing the underlying queue. - Add files by drag and drop or file selection and monitor live queue progress. -- Control per-hoster concurrency, bandwidth limits, retries, and folder monitoring. +- Control per-hoster concurrency, bandwidth limits, retries, folder monitoring, notifications, and completed-item cleanup. - Keep local upload history and copy completed links in bulk. - Transfer accounts and settings with a 75-character encrypted online key while encryption and decryption stay on the client. +- Check for updates from the header and install available releases from an accessible update dialog. ## Supported hosters @@ -29,7 +31,7 @@ Multi-Hoster-Upload is a Windows desktop app for managing large file batches acr 1. Download the Setup or portable executable from the [latest GitHub release](https://github.com/Sucukdeluxe/Multi-Hoster-Upload/releases/latest). 2. Run the installer, or launch the portable executable directly. -3. Add and validate at least one hoster account in Settings, then select files and start the queue. +3. Add and validate at least one hoster account in Accounts, then select files and start the queue. ## Local data and credentials diff --git a/assets/product-overview.png b/assets/product-overview.png index e719b86d2d4cc9024cd412fd639e7b3ec5c12e28..4e7db08e409023950339f4f181d317aaffac02dc 100644 GIT binary patch literal 51766 zcma&N2UJtr);1il-~k0a(xiLPgGh-ey#?h+6;Ke6j-Wye5a~4u>ao!UDNw2*_jf>`FI~oeUA`IOyvz)LA@oqv>YXsmO3dgU!;*VSx)79T#l zRwYhjm8MP^Cr*$0w;ac3h7&>lsR&&Pc4JumN18tw%w7jiM;_pP-pU8jrhI*U5-$=CxgIxCeui-N+~ z%Td?tM*r zDWJRa{jsSG*UuM);j%|H7V?tF$KWCQhNn9sL3zRvRR+ksN4S$5Ki{}k#sBE2%I|md zK$b^!6RRkO>9o!czMsExJ#Qp^xj*0*G%McbNI&K(X@>-=YcKTYjV zo{8nuAU~JBNHuu0$A|kSz51h-uUAkTY;*MIKo{&RJABu_$nYJ}TR+{Az|oPZ;ZIJ` z=asc~+-x{dfG>6-31A2ijX#{X8l>G?M!KIfor6P~)~mm4hRnivqivfg-$HQ3N&4g= zjFvjDrgH$Mh^lQ{5TsQm^~-)5y1Zpfd`yeToN9DT8)%*mLaqT+kUw zWD_N_%&X0?5sK;Wh_`JDvu~noT}q$AUtY82JpS`b;qN_Kt1;}oUUp1TP8B#=Rzhto zn>hrY9>3dVLUicIy0F(trbNT@W)D@o302q9f0r{}O1H?-)wy(-qvHf(z&ZbhS|9@uM8&w_8qyJB)RSI;~TgteGFOSg9pnR>FbV1cqHWbZB7wsi8>3QYu#I3)+> zQ6CSzq@ky^O5yMFYf$8qIl>>PTBKd`f?GB32mG?qO}6(<7xZSu@}n;SipG`LRT501 zQRs`f=|3H~)sbw*9O0?dW2$K3tJ`_(j>{r49OFh z%u#SLB%MJPz+_4Ik7$eFNt;U{-6weHpW|C1W;ycd_LiVTWQwAbrfYauCh{;3*nVAn zLsou%CM{*{h+e;n0LCNlpwv&Hg`+o<9>tMqZm-ETg>Rg`_4yEQ32%e)1dw@9OkC4U zocdG>sogh&t-}lPFv|>N^pZ=!d-4TfCjmTS<+b|lE;#u)U&LEL5xQ)fus2;yVF!)M zb9Hqj?r$1IgYufqy8`c5{j>K-WFW6zV#IeP=PARB92`c{d!D7czBhYo-Rbo?QMr={ z?abY#}Lx=+9a55 zx{TUsG61cYXC3$)pL*;>WFGH!gds|Z2YzJB8cX%sm6?qLVaPZe>!7)ZC$ z_PLlZ$AEf`$oGeIV&uIjo0cPKHq<6dE^Z8hslbdfXaGM)t(HfEr3LvVx zC}x8tLZS47l%!)7QB{z`NO!p-cwI<8#_h=UaT530e%hwh(R1q@M#a}yXo2VafWSPX zgYG7}0iG(P-@?}g=3uIn_Jv(l)~udvyQc9|MO@x=S z`=r0$3!FKSQ1tDMQ{9chmAzeWY8ghr>!?6v)ru9Cx=W)RNF@K`3JlOa97c^Fb0=!b zFRTE2+4nW#iJ`m2ym9*R5FJJO`m}E!f-N=>r&X%FF8xFjwYJ{FnJ{RVgS3CEr~B2Y zWln2mfEL7IFl~nSIbCVmC*7q@ z%ijv)Hj`@NRYAt~pRO&*puCpQ>WgPu6oyjSU!MK0e@F_j3CN$+u3GmGKhS|L{T3|x zI(}{ymdJ)?6_5TSsi&)e>-)+X_bjrbNRO%12nw#a)+7XEfbPvny! zAjV=QZ%j+r?8E#+z0p&6mp$u1(C2x6ecqqPEo>osP}WD(LYiBzpW}-XUd*cK!#ofq zLjIb;LOhuQra3Vi)FO4Nt&hL{^&SuVCSdk^c9ilM<0l%Xh)it-MGtW-A<*D;x@a~l1>Lf+01sbV)d7~c^|qHcEy{q%R({LTvE;(0tFN`4 zbO&He-_TI9N*JLE`X67(WCd8#)UZ3jk|0oIp+%1P1?$)vHuN)R!ed^|b8))#`Tj$o z55Z|#!9HRk-yi0;uz?w_InkFRHBb4l2mU@NC7Wz~Oioo$IK0xM_eGLm)9J}g$`fD0 z=SwnwY1(Sem5lkDP;ZkGS;Ks4F93Mr>Nj6`V9`^ZX)!GknHO5$f4sp>`eAwS-fuGP z#ysXdtnjbpc-*)<#q4=NS$jR{I6mh>%b+4n0jf?mqTD$Mj6gm*4iOtcu`Z~zzx6j;^j;2AjOyiEUectZM7BXQ-}L#qDRbvlj|)2h5X>?&r2k9)1Gjh8 zoM~>1(cmf;MF_HwdeSs4b0%IIO4!lWCYnw*O#27xS}w+T_~p-?(NV+A@zAWZXpq=& z&_$1)Os|)TZU-Kg52VwIgbl8x9D-^Banh7}hm^pgpj()@-hDMGh%3@-%a4IKp>`j3!< zQe2YS3eLeFft9kH%wj=#kiE1UCy>eq5^QA#=$r{NfNv7Rgi$~Fe!I+-+QSuiaWs6P z>WN3nmFHhl{#lW^ZX~dtG;J#V6qeqxYAXJZWOU)XsA!?ua zMuLAYpS`3S*w22&r$=}qby6fU@1-Q}N3J@3+8U#!&8vRLTw@z}!()@V$C`j}&VX(gEzBGM!g1u6fwG*pqhmdTHzOw3*@9pn z_tl`CsY{yNx>5Z~m+pz(D8l$?E}+saIgC`P)^dBo$0PEnmjIj=fV=!mVn~git3n+@ zVluLyoW^{WP~%MCkGMnAI=3-`(fkmg`#$N@q$%g|g7p8`Ym_+kni+0Rfel|HtJ2J$ ziTN3+Cc2-QGMqeN7?8YJmSj%PDYyyhuca8?CKQiIUeuyNJnuEFym_5G;M}}k{R{`= zRsUlj&xUNV2Dtu~gdXg0!LCR4@4hiV91i|XuOO}q+@fuRan7=0YX0iB66}=^2lpobI*P>R{ z(Fid2t`vo}v0kLAB6f$Iri%!x0UzRphjuxb;IBR1yj&Z&G+bgPc=%K^cFkFTT$uFBW6sGJG0j zmw4_Q$3xa%#j?vy~5=h34Hqe|rw2+s*M+-$U(}rmdez z2yx{E*)7+iY)MtNvU?qm;%#=;(p$+N)v#ci*78os){@oriwZ(WG1r4fs?|orq4Jyw zp&RDUyMuKT5edkZp4GeY(RZJ^mjDm~%HHio>GD9z>c~;I>izC+(rE2KqMJlTZ8ws{ zYbV2CO>E{WSX}Fbx#mKi`sO$NN>Z=(#@FRm#cB;5>}J2IJC#rk!~|jUG+nVIH}UC( zK`V=H!e)V5vn-EJ|7y-on+$o}zqh+a!J$T;$IGW~>gmo79wK2VrleYk`X4e37$HGU zf{CjMb>VYhQ--kPT4)#Bp{dRrPJ74~A+^+X&PNgsM=Uv1>ZUA}H7ZW7#RcC%=r8cR zUuZE+RqVzd&!CsL)4K{3D(`j6ZnehR6jg>~Yt93{!{m_EE)-+Av(`BxksW*FweOUf z@3==!+yM*S7Vuuk#7iDG_G_8#c)I$ExDtGzr9EbQBK^r97y|nP$J8^>-wmS6&B_GO zoyj$s_HGyYR3zWPrn)ycg*tfakQ6+eNUShtY;G4+D&!sn!EdO!gU?+q343C;?Y_`d#iwp!Et3PQr#c?vg(>C&#l^{ zBO!sCd}k4Bn{YM_Zc4;kElK42*WQycW@;}?*3!fKY0A6yw{QXU9ZiZY3cS zux$OD4hb|>`q<_6^B`ksZB=iAva5qgeuC~_f{Ko5I_A<~%bjoZ@2`(QUm2P(AUmJ< z?hTma%Ql#6ueDj$pNTa$ZvA6G?O?we=uf{Y6WGBHA?%MQ%NZw17e4bs_I`N%WyZ?R z_g=_2nL{5$8!+FFeBs(ppOer|5dHF8gtplPXlBG0H?B{<%W#qqHDwe${S}gk5Awif z&JR8vvV$0+Eq9B+4spYF9$D7h4pD$5rqBL?*uCU!%KQu0(0(O-c#)C;m$)zyy2xX4 zDJgHG09&}HOf7VzTYA9?63Q=3KQFVC9KU58DAcPq1OyOe9A`p%m2K&d>7ju+{CG9{ zxJ(4AULK^uN@0r_HnD5e_hO>m`h-vt(W~^4wB0y9e9VTL$0tK>J@dLPwm9Bv2OTo| z7Qb~!QUSM79qgjLhKArJlY~&etIg6B7zB(6k-a$=vciC+6Gz&ld(qyg=Z3m{F0^bJ zE*}Rb6LJTy;|pJL+}0hkb-7XOSe{Kw_eQe%ZeOyo(G9ZfaSzCwgWvPR3K>U}5W6gJy49^N&5Na%TF9>d32rAo#PA+Uk~}xTd%j z!&bUv^Pv1j@hGgqR(v9fX6g;Ujc}H@jUPv^zYk?$!cmgMV#1Y0I1KlW9j7E;K)o0BP?o2FHzYp(399xnp*kX4wkP z<2D`(rWxo=Ka>1Hd>^+Suh#O1kXF&j1aCsVELvPb=CM+gnW5Z|*Dt-w z^II@&E{uPFYs9EK+y7=EpHC!}ow8-BTi=W#+UA%blG%bT3MmR{D&aeqZMLt%+)XdV z5Ssjaze;>S1<5Cj~z*1 z@WdyqS;uB z3zG~j@Wrrqh|joc3i%@gf*=p z@(h$v;P&mpWPhz#zvTQTX}D%(WyQ+@wzjcJ+N|3e&u@7>;(|g1DFBSFS7FbKK_G*C zbQ_0&-ZAnW?0yjVUuZ|tVvA2tQ$dXu)$70_k#XMPl`k?m!xI4j8isUUBOIwAnq- zdeqmqV9@<%&SQMkNoJTKeZg0TK*W$Jd;7T-k^cq&fnoikkixe|7 zx53Z3(m$COTeWO^#9seC#s$VK*TJ1E*a**}qoRamn2usqql?FO&CON2ZI51S5>tK! zzPO3Jb2lS5FdO;6V`FRWL4-PKSanVv)@qTSdj%=L$8Q)D^U-xRAIOpa>}#e*C7k4mhKUqbeY2(?hbj1F8$973`D1r{PIp92 z`6A+6!S%c$+KUUpE93n&c>puR+L|IaKFLGmGP=wkRP+^)z!?I z__o*euG6cl&1WgS=}FY^G2|t3WGzAiJ1T_S)Y_ok9Fd%kUQ&$HcNrO_MV-`@Si%wu zx^w@PABe`iHE_In3Ufk8-+0b^;Eq6T{4-@9<3&T`+-p&c#7jNu(iu0TAv!jRgtRzO zGfC6Qge6qWpP<(cE7FU>_KwwsGJ)ClY3GuNP*n_{uTMh^A6i?t z6&GWeLEb_@U(CXj0d|VnaBVGus?z$mjAYz1Byst#)oejIY|^867u*3pRn5=nJD_zm zq-~(|h7fe7J(^0qepI2sL0UIGYkQ(rXHx8CVxH_H%~+MsP2Nkm zuEaSr#x*dXNLD$UH9>T1Mo8;rH(``2^32qgMpgJ%4cYTKoA&c@S|}SID~A83GLdb$ zTwfpJ-MSBh;e2`pMVnJ8x^4FHwq=g5pIq9#D9QTqj8Twfvh+Hy?>sK7y$h(bWSZ3` z57W-An35cgPUD~HZoc(0OD3}d#zjdx?fo?K|6$*-ZT1hG`eI&f`)Mbc_I7XtnCCa$ z=B<~@YkfSE>1KUS+V_lFkLWoE{W#>yn!^g%Hc{&g^wuU(&!4e&=X_Zu{I|q}Ho$Cy z671fi5HrF1%7#JO^oct1IvnRs3R7gQ_^0CKXj*3|@V&r@wX(+PudP<~mD5cQSbq&g*zTdIBgJ_>4z(rx64H42&H-n3p;;x zz^bY`2NELJC**8!QCM(RFh0tx*bPcz<(J>@Y9IYjza~Pcn0nUlNSCvP~lEH?reH=3@E&8p%j)M?O>GOlbArr$B{~AU_w< z&FdB@Z!_tm##SmShMY$wA_LU4zIIKudLBqCr6(Ug=r!uAk&5j7v(ws%yQ~Zy=84Gkk|yWBc@a zAri!vAe0yThCBZ^9!O{4omw43Inb%|9~Zv@p62C2DbvYatol;v9Pg-2CTH<%No`hY z>2H=L?ibtzBJr`07P{ z>fXZBO91rWJa**ei~BH`N!ccej6HL#?^?8P{tcDg5nBX;sONEM_(PNxJoKv)Ku;{=i>D-*5~kI+=?vhd!TcELCBWr`Y# zAsq#gcf6fh6E#+@-r64D-zPjR&-tVH7nD&I3l!!^>>2UVTwP1K$9}&kXZ+S^k?+1x zTpk!*Fik-02ArXYsniZ~sp$b>!*qG)?qZIZCg`>Q;PIuQp2jn(W%eQi=JkIF1$~X4 zEmp-5OwFO@Pln*%k0cC`i(+kYPy{2jy=bz!JiX$MwjQvhs4s!OU>hJelWsue(-*k_hTU}y(XRiHq`)?CFkL{pu z{=5|}1B|sPuT2YGS7_LpjPHQdoO&_*O!u^}2lQpm)P8E12%7N^MuLY)n_C>jBF==H zE0r#LK810gVy=SLfg=a|v@mJ?YCM2u-15jl1lg#To=of%S`r4YhW3V6sOGV2YN~Yy zEjwO5)h<}T^pkIu%2xCT+$>em>pv3XmgTOX;F(QGDp)+f0y92sMt^!mq`RL`0~C&L zpwxr^8*+g6Gp(pY=oT%WBa51!qwEPVey@uCcMwNM@ARJ69YbzKmT)mC$f#*KFcrTDZ$6G<>lH7%a&%-&H#KHQ zgHg4!PYgucum3wm_or5mw4Y6Nv?S=Bu!QvX=bM@mxsnWq_|c}4v38Y|SM=|PJr7HP z_Xa4G8Z9!u5WI!U!Fl5<4i&DDcMqonKE_eN*0K6@nR_-RnaYpyjJwsqg}2*Ty#TsBU*jgN!0Wc-leJOZ3vd;$I($W9AMb} z;EzDJRL+F)cT?T6@9Bd5Jqjxm+((^vyxIKL2rK<#(jX|N5|oGf>uSc;7XQMj8~l(!|XhlbV2dsd=Wu6G}H#J32b@6D2cm$plHI@ZK7+kTsi#wRn>|C?0#X@d}#Xprcn#!6VjIbM2H+ms0H%E-begCrE&#t0Z;$<=ri7lavB=Q$FVLmrv%7vxaa~?>seA_1y#EQ%_Ss1^83;D8XLGAQP`jYpd z!=baXCGA=uV{l3KD65h*OQ1gsp?PfM@pM9%&$PY0l}o-_$A$&&fT-Xx^|=HNBj;kL z{5NFj?m(OVjx@@AQsUcHAnHB(L{J`N*6qr~g63=a)UIR}VEd#?N3Lf0=P_vCyoY$c z@Qnb04gk?{8nn7w^fJCzo#qCh#7FT%#kQ$6bNPj6%OfuzJ>A@ik}I2cfV(&4zdTvG zD?Y&G%6+s)yE391+EBdD{FY(qi}IPqQ-;OOCr=+z1PH{XH<+BJ;VNfz4l)c%dhl;5 zczdhLDQK&*Vv0Ri)mV3w&U zHP$mD{mY_jDF#7#h*-UREpx=`Z2bu-_9>SZ=5*}KKN;Q6tsvW1v^RUfZ607qZM{OQ ziH2HF<7~ZOxMAVH10M9x7d(n}QcH95H_twaV9vw5)@~580sc6v0h^p%a8MK z-D}DWU#TDCg4yfubFgEpyL_Lf;~}~X*J}g*)iiVk?uPWV!jntTh7Tvr)!$Zu!4oa~ z-}0`b>)`*BN=(jJ+4WT=d7<>b<$UK<~h>eC@xBDJU zh5+;{{ZYK*&YCSlTo@C+ zCh)PTv1?m~F3)>O+ta5f*nHr&WSty^A*Hmw!&1<-_sU^!>zdCYzDF#(OLieGW@Rpd zjK74~Z|5c_fF0{DFo^2mK_Zk9Bf8bjH*W2IwLkhLC){+V6|x{^Uy?t^Rvi!b^^R9I znN5e4eIc-3SVX+5LY?^^RBLj)Q>_9eC(H*QrprtQ1oQ`J43>973U@;Iq=MN{Hr6w} z;GRV#B5&cF70I-LT?jvKrjSjGx4rPn;Gvk#_Nb-HxKVxsug>O&{?NrY05HCBNXljB zvyh2^;IX+_Tam3BKPwtvIMz}X0Opk45g+vv?y#4@F4mfogJ1qZp)!FjvbqmuWu_Oa zoAn!ZI;(xjkE~1rkM8S9`XgDhOV;DguMF%0g4KrIjAsqC0tY_WjgHoi^%jN|dpuCoXj+%T52}Jw^WP=1eTOEQx`BvcLCL{oSCDnq^^`8#AyE zaE#9nBy1{7mGkO3uPr_%nuiZbBE?2^_dK=exk^-PZb)J(v-*V8An~8gO?v~oaLVUv z;g_$fauB+6F&};=@8$Ug(chriJypkT=?0%~#n3yJ{)@W%kJ{N@K6s`eJO?Z6Fs_!} z5SMAU7%y6O)3AKP`i7$4pMExSG4@zBA z`S1O|PXCu7EKd|jB6pq_w3^_*3QvPu&7c0#aX4>$AjogOgj(zz{y;FS>KG(S8uB!a zR;02u702&k2Z0h`;(t^`BlY=WUsv8srBetRi}UW}4r!0}x6g+B zyW`*enz4QcuL&{+njgMpkGD0_-d;&V~&d2T@M}ANfUTy|zFyI*XIGwUh zL+^^bnmknjpfH@9#3u#N;D1^)BA@n7>>3reW)+^*G5mK;P<#L_nQaDDfzdM4{0IB& zMtwK?@NLT)hWM|qD=QJtB*Huw>V6huftCgiF0tdaBxHEu=XZdMIqmQoJF4!wEI*Ib z7ejr1kuT*2Oe=ru$5TtKF}1vw-32&mZ3CD*vM|>vXJTv)`DSqHpPjd~-gW_MQTrN` z2lNeu}^I&|&31#8uEPAdt9&t^;DC4wy%b{`?E(M*e6Zav+N*S)XK z%ZH71ISa~U&2;~E@^nU65hHdCCF5t7@Uz_@;gAw8s2pyL+KA5C@65QSBa+W1wlFBf*DS5tK_l1Y zeZpAque_@r77ihlzm4Wh<}y`a=7l=T4*euLbDPw%x!=R|aWJ=+_kHfvCL|Ups&EO( zmG}XDpZ8{?V-LBmCa~JkEnB!>y%!54-z&%8C_V)mJZ^IsC0foZE1&J|O%{|jma7&5 zgCfI>P^|-`^-VP$ruV9H=zh<|{XP$_Yu33`RQfm28DrR^Je+YqH+8=cLH^bUP^5^- z&o9gcGxw`h_XmKNukOG60|eB5fj_QIzv=z_Ph@l4uScUxNB;Gw=ly{Ma?$e77eGm7 zAWoHPpf#ai_2&bTgHqS6{%L55yw7?3y)4JiZZjm#AO4Os0>`s3^4s$(`NHs2Z^!UTG&&}eeDDg!^99x}5VPzIE8a+)yRtQUQV zZsuCs23Q5d=v~_!QB+J`XbblVSC?Rn0Yw>BRod{xNg`_VrZz1L+!juFwXbGrirPK>_;N*B@xs?p)so4~DS0r7}9 zfi4<_{CHtFU4PGmYZk*~okP}a*S=YI zBRrgrFRg~DuZ(@8)FrZDUsiUVEL4{EoKQb|V^#c?YEbfrKzknJeyi~&+eMx$$0f@2H9ORF2%lf!+qDbM|vyhpSyNFgky?vda2^L^Q92+3G@ZrSa79%S?fya@E zA)v>&BHXgcBI|cRVa)D;68ThX;34YSKH`jh-jZZDp!Vb@12psK7W=!^nj`7v4cUkt zCv94FHpO?MoJ`4D8-=rvgR5x!Dc#DKta4U~V`C5diuU@oVipANZ^1f~{l4L;iR24_ z9z}U?YmaHOYWeU{j`i535TFz{L2y2zMUNBzURa05I665#4LCrje$Kz_R$xmTfl+z ze@QJma@7=uJbHE_I=~`oyAZIf_k~}6(@S@bfa={^Yio`@!9NR{8LylB!iw8ju5*+@ zm9yrMjGNkPGZ=bL4xvVVXdnx=n!^$UA5}+Xz}{C($#hRUN9m|pMBn9O71`lGR;z0M zrnj;;_7MhkBu@LzImLTWMeCS=;;4A9xEE8qR-$DroxrTq*~s<65OQtlG{Z0@U@kkg zJxsdZe}*&RE>NEghG&QWX*&{afzy%BTI2z?;wl^^&Uz)VYG=B*A@>x-Xz1H~%ncZ_ z!A85J8E74_6VF##ODkAtHf!f=kNo>{hole>^>fSGJ)iRUMJGT6wgb?S)8n^NM5%qu zYMTpv?>+2D)8o6nEiEX8c(TgPTkKpL;U7tLvff>#T zXSign7N%a?CbQ)nF?hJb-#=GpJ^I}?zn~A>+RI|;@4S~1^^AUX3$`zFWB{@_JGScR z+#s{BYVM_@V-|L6+0{q%It>Q+G>bqp0OpjnK5{LluW3!|n4Ue%{new`0xa}R`sK^z zj_f1RkT&U&nVuU*d3)$a4iC--1F&MoLc$fO(cu zf$En(aTYP9r@Ji72HpAoJSjk-OV<~*9J(I7=6E~6RQhki@8R~_XW0>f+t2jILQQy@ z_>{+0oc0%J@b14Bcz)kAbc;e_&xO1Zkf<`yR}Lg?g}6KmE#ANid%aqGe?-rwN>EHv z8T91|U}fjCcgAwpKE~VQRTdYRcEu;zYxCa0EbR5~DAwYJEPrN3?V@aD+QI2n0YY6 zQai}jy|ZA2k76LItTk&YzE>~%A)9Fq>)Y7lzZGu?Cp}Lh;SP)qnos11(I3A`C6^P^ z=Xx|$%$=YVEL}v0$L1NxyeePV|mPze)$j( z)^bCqJ?welwZC!Ni?5cd$gbZu9=-u_H8$haSs6$`-U}asBxINjrIRH%NI& z1ND8-9CzsBv!i+`v%@^06juA^MMT+Bj&qU5=R4m$U%F)g#HNJ}#oHR$9PgJwH%yPH1Iyn}hD{Wwl3z6TD3U~h#YHOFEH9%=LVE2FO5M#};1U3Q zUo0h-G`9zC)3;#V)_ca_0gjnAJ|t4w_l@MsE)JQ8S!~5Og|G@kT=m`mYX9h0&&%5H zAkebF`PcI@gtAfRB^s#f6pe;y_XCR&+A9$s1mrhI2AD7Q<^e%3td2{D7Y!@P&bvgP zIdo_upSk<(dwF9&i{~BCgs|8M25WD4Zqlj?lR$Uuo91c^rxzTLRLqq{F_JRbPeNv1 zv)=sStQik$UVwsF!>)Y_8FlGG4kCoKMvt5kw4^gN-sn!!r=mZvb($Ujo&C zr#*A;&DLSAI5?cQT6jd9p3(^?W2?Psv6X-eGT#N=S?in}Z3u*I(&Q!TFyU9d2n{O4 z)P)ItIiX&kmDMlgp66qw?x|&+RHBH3t%CUVxuSgPqVTOC+9^3VYRYiE znqhB0r9PTUs8F@ZyfIW}h7eCQwVkcqZl_cWZ3XKIEsa;b!%V9eV}@8?$8Y%!wU3Sy zNi}ljU0J!SqvS11H9({IZ13WAl9nhe*>->q??&z)ukrQeWl7Ok(9H9pmK9>nS|-rz zpnpiT^_<#Ez@Y9naV8k-tUVYGr%yW`G%K(+m@M+c>DF{WM#D6FPwh0`N7 z9Uki064bV1>hAj&m)VTr$}d*KTCe(cj_>*s)@RG>ik%u2U&PA(JsNW3t3q|L?@AeE z>&{dgrI;L3zu~^tX=WGFSD9y)HRkKo&A5J4?;gJ2I`*UIMv*{y#8^e$Oi?uX)t<&d zsqk39mp(HET@;Xy+Rh|F2>0xREqt63a@y#Yq5D$!a$|XU^`_uWfM)EcJ@o^vf1{>) zNME+kRjrtI$kk7Oh$ofm7Aw1*aVf)KKOafpz*iFn&-`b+vdnrHf>C;t13U)z(`nmO2x~MJ8M-S&ZH@Or`L6oUyTt2I9 zfX$dB>fP9z7U!TEF5< znB|A^dKpE#2$Qeb*>a>mL1R_#RA$YUK(ECIGVsX<5?Fnw^MRWzqx{5S`P#d)r|N5H zT|MP@tsN`8?Bq=q?UE;KIgE4wTZTAtCdj_2eiKm>XM)U1fV5?2bPa^^}5~97_bJvUOZ+Sxwy+OI1}Ly)s8niM-#pjI*FZ zk>;1ANp8KU%LbJ_!<%-ypuB3Z)^;|-&3ojKFQb(is2pcZa04v5uzMBRt|EqJ;Mb+wp*Mx@r zFzym%m685X0qUaU&_!47l1VdP9JDkc*DMR+En8I@>SX<}{Ufx7Zk_CLU$k2kRd-M- z2|m`%hdnUp{{VeSh7R4})kBKg zepSeklk~}RC)CJ1k?=Nram@$Re?*d70;{9gktzzDmTf`EHJ0yf7ng5++y;j|V`%3r zJ`L6HZ*c;Y2eT_N6W<*3d=cu~_jJ&%<#bBzsnR~gRS~6fjk5b?fj5pGrZ`ufUYcLc zusqMh?I$g7|MWy;RY13c1kCDqe>&y9p16Mob>+ob{lOtMouTFYSh}kGs!L^_cOzji z*xo(wE2Y?6ZV2*SOn=x^Jcbhc^V;2X{^%H~@MRpx_~Bo$&Z2(LIN(l*tmCPWYqK43 zvci#7M>RR`2wS;UAJdMCe|AKVZuoNZWF&up0{m~mtD@j^;<=>Nrd4~9;=_L*-YqP! zw=&sk@5FV}qk&I`2R%iPRPiVPmM37_mT2X-6klb4omM7Mpk7!Dmos;e;|Rk;N$s2Qr)s2?4_?) zsH&hacR`7~iZ<%16qRA>ypw<_&_`f@8sBazVr3_wxoT1G=C7!H&Riv#^C6BYeV*IO zb?XVI_ko9Q9TyY|x}ATQQ&SNXwFpxyjlorBFro&m^JPB>s-f}ctBcu=2R^?To=>%T zV^vZKUn~jo){?dFYhE6Pl+!IW58okS=h4!$m%cWwwt>oseD$IfA! z;BQzX25Z_IcE>%P zoOi0PGaEw|CWVBEf0VWzyRA#H6s}TDNvW~O9y7JYJ(cUsTJtum2k!B8&iQw8N#!nl zwYdGU=r*>-;CCth-b+82I`{hhtApOp-9PhlQn=OsHYo}FSQ+7u@|IsR$yyY`5xSdW z;mz=c7x|T<;%x}h-*5>cqK`0|=)DvhTiP=n@r<^NEB71t7$zc~m*GzBJl5?_3{ENF z-8g3JbV4-T>a{{&WkAqdR#6ytu0xH_^Jt2oR)xbz&SFP=-MN4>=m&4Rt2cd?UsPu> zmWrGBM8n)>DF#f3u$1=Y&nh)4;m{JogR3O}OH%4ay{5EddxK9Y8){NO;E1;MiJB}? zs1Hv`A~a|;qU%*>G5&hrk{5~Nb&%!^a?z!@xLHv;CVb_pC_}%}M%>$3t8__tZ&z%F zu8N6G78S`2u*Wn%9I<9L-JPS_oysuXJ`;=yQ#0r#bOYTk_wc9W?0a{IM=NOWIJ~LG zm_lozS!V}mz>VMlm%*@7010)?sV$~A=CO4WCsCE699Mb;icMDIm+ft~+EOSr?J#M! zi1}Q-=f@?K-h2STx;&IxfnAtxNP$1^w#~HMZ8-G+Tj`(ss$%X9S%RN4fwkS9GH+LX z`xcOM%pY^`&2T*%QY*333DC9ti>DSL^(+ZZU}b<@!~>kjj7z}-F~XzI|O}vP-?@rt>9Q!Wx^eL(@NUN&=DO~=U3SS^}c-sh4Q=Z z)1k&hHF=Ar8&xRkQDy|MAHqQmCxFgxm}_4@Mm0#h34xD=jwr^5mTpj1hK9{-+hhw% zozOUeh3Y|7;CAN88dVpWQg;i}+f!BbE6d2F&@mc1P4%dVd zB%|TJvtvcMnvFt6s*cQnM{nFh=}6#4=vU{F?i)gO4nQc&AQZ8yZ`84BR##_$(yITZ z880kk09LUWXr=9$H$~ghctdmvBMuQ0%6Sa!@Ab>r zKUCqjB%E*~-y?&%- z(7Fh{EAQNJepqp}v*3n(<0g`GR<0#>X~c@#Qbs{ zS%?)blPuPz={6bwxt3_uVlenH2cyV6UPqMyU(*c)SYZ_vpiyQs4bfRKKbEQ4EIM#i zVPPRQ`z%x>r+rWrK*2-M^uWA=8z;tUS!jHd6-CX!VKdOL0P52ppo&(;QYVMRC&sEE zS%H2wfsVnyM*=OF*X`MVAf{XTQWkuH7G6J?F>ujanY%!3SP^z@Z4gD>rT%R5?aRpE zg#BQATM3Kmv~o#~H=VjFQvJ=dbu$#*w#WZtrY!tpmAP!)ykfz$={t0-OiCWpf4~3g z-URf_6?@blPWs63Fz>HE*XERU%#sF|0etP}4qSn%Q6jsqTrCf3eLDKhktc7l`qJix z#^zQ&HQ#*e+R%m#V$zG5I6Qc_8>Toy)CI{}u&d6hIxAxahudKR?v9DgE9k2u%amt< zm;Rn_q)_;8#WII5OJta*E2tlpy{s7?UU8u^L?_n2EVddp(!O2-{5pfYyN+4t3{QZw z$;o}hqTsM}a*4_xo&l(RO5#0Nt{#E0=}l6cD1Harg3+Y(WI1pjpsC2B_U}=dYB!sbhxWChL)}c86XsJ0Z)&`F_`f8OB z-{hwZxVtre3+R|wbo9BDWnu3cu3z&p2=3KHE{ZxK1=V>}Oc(s>9C+1&-SK>!bHX9a zrmb_l{#g^>?vh>8#igBY7nrT!d;Wrh_suO-zU$5qJ_L3V>drNm?J>K+_a-u8+dLIQ zCi-jBn3Uwcf!b^XTX}3z{pfCrweM96|GeJuyX8fz5%nij76|m7P(Z=YlG(H>i|2;@3O3KTMNJ-ZDZ{*E&3QB} ze1cLIy3u)S+m7f-lEs-E6R><{dv1iv;L#swq(SftihD zmg!79CL>NM?lW-noW~8&S`0x%D0j}=K$r6U2CgP?S{P8>r+gMs14dqE_JprKo2K`o zE@Ah6teQOhh?Q~*ZeRsSMs43aCwtsz$tCaVM=O`_z++egC4h=!DE-cv5S|kSVJ-9? zvzWAc>n0=(-N+_*u9yfu6#%NXSHTR_^Y7n2$ zhT|kb-e4g`HDw~82t@b|eduX^-xEQLiSY6EFNjyWAtxtbXGw)u!ow4(Ad8=>?B~X)0r`gk&U9RW_$W$*&(vRRg zVbT2V!~r3qPGC?TmP+P$W*`l*q#0AfuVR zCA$KeTXZJVjHZ_L9sK&cYB45@Uoua{jlBxA7r&D0l+ zrpHQuI=T0u3pzG&Lmrpnm!OONvNvrNY`T4nhhVU#aLMUv_VluRL9RJw1}1N#3yrJ`*d>{Y^-)~e1N3`8LP&xuBB#@7>f#uZ3Agm zf;APJR*Z*ROT(6JV(LpO+&;dD|LH0&u7sY%9X58p`E`PtcVSHmFr0&$>i zx^%m`<@f#3h0k!thHO%-1m!IoriMZuf2e0AgC-_oq}GeiWbEL}_dC=NS{8TgLrBQ= z2Y!A}8`i2jw-+%-3|laMxA>W~T5zThX!DTz*dp*ZPjj|Dog!lQ&dA7ul=I&OCSRh6tq|5jb)O4Kk!GdGm)7+j#DE+j~{l zlIg!mZT}Bv&i`+GUIiq;s)z;BevO>GYd{%i-OV@}BKW0Gr4+wYaP6KxOwO1M9FfYd zPd3&PrTjFxm}*O%T(k=@-g1Y{A1^p#+fU!{TP4psFzyX{4Up$Y9y`QDR^pm(A&v&4 zvwP_GBvW>>sy!yr?d-aNvXejQUi_?I=?9+stG;Jr-=oN02_YBaF3~5VPd3kkOXxRNE=YZG_El|HK>inosDedF4P9b5r@vb7g;OtPoJU>{FhOdhEinZT{`LTdr+MfB`L!eQP11WKl2x=oMX z_t_pS*W(X6y})+?*G7s)r3HA&AbK{QicSg$$DyrfWv- zl#S!gn%LyD4hOybamMb1s^Dow^i{z9qtY{(~)eamwd z+ErJ^J?>Mx^x9n}kh?vGs+7w;(8}6~v5pSLbKdbZGj(JB@3Q!H?@MDyaV`S#fSMKV zDTIfNQqt}Kgb+mxSc2x(^hrWZ-DXvTSsC(Do1CYS)Otb(l{m` z!kE2)nD-;!P$CEpI@|6fdZOjDzmD4{-7wPhIx?wwo_(TnRX7Ynx5iSfSKBe?V6r64 z7YPLMMg~(L28Kb^YB9me=Ft<5OvLyNo&{3wW?cbJixT5E;Ip2^yl4pXRId&g_ z7+9~8b7&=VFapDqOoJv%9JdWo!6b7@P;n0t>3WQ(@n_suKT5RKbGNw5ug=lPIWjL! zIx=N3{du$wIC2NpQVJ_18 z$j2WJ~)VevSrr=0{<7 zlbu2xu&^3=uKjh2E%N|mj(`~+L7aS2@KW&7ma~E!#nYaicd=TiGnG3{FMUG`I-Lr5 zomYd)+<`oAa{a5koyTbx&{?!xy)>ayCPF^Y>)!A7#pci6F9>3 zQSo-rz5C$gF1^qz?~##&)h1ODV&E0pJa;k^wKSn08YjXrm$3AaC#@+O{yA;-ZY9oI zEP(L}xnn_xfnzP{x&(I9ij{rKI%YTcC9=)wvcbzj!9YG3$@R7vS4ZVYbei2u`c)V+pJ4rU&7s4x+&3%;|4 z5hZAKp2I+TeUc(a15Ib)UN7+W^ht?KDQzSn2EVeBE?@gZWL8>~J7wz1fxI_c0;X~W zew9vVAP+L)L`i`?8|_`fRcl;E{f^l_+2(rqh`|AkrzhGXf0Zug9GgyO9C{#;Kc>K} z=3|7ZH&G?awUVw@yf+i`Ax%*lQS2zk>m_WAfp_tNI=Y>o62kM2-lV@|rQJO^dp zBt3Qr`a7koM$ULxaw0u4<@KvV_1Pufk=lnN~$qd{R@oB>j zq855qq>vdG4!g%TN;0^_-vh|1;z?u&=Lb*iMc-b@j2?LKVD{vv2-3aJYYQ?<{s>tw zsKz$GK}ooXirfC*n?sI?Hs({0xc1#ux1gZlv9haqbCQyCSgGuc zp`%IPFnI)&WwN-QRi5d-)2nue0-Q2!^5xv#_%k>@qL4A0#%0@dSr93X5%|j)9R|_h z8ws4zMwt$h*AB65;){Uis8}Yw2vjvTpMct!_47!yd%Vp3e9DiHD9ZEem$vA(>M&QA zKJy@Zp&T@M-!RSNb=M|a-bM8H6+Y@K=K`gI&Xt4l*jD&7ywc`x~!!*(uF=g6E ziqT%V3V>YHGUrC@gFL7EyF{8I@sR~J68G()E6gSlc z#l1CA%X$K+Xma=5A*74(K!u;H+hDMvb-?6XU@VZuxY!5Qyc)8Hv_dQ-aqHICMQGUf zM9&mCPzT$Uq)})^h@}|1+W!P;ZrDGo>KRm9MR7c)P>-?YVd zG)_OERViVO1H0CX$2*;98>}9lO|5MAq0aVVJdQ9i)(}PF+o9e{xcRQQ#SP7mbeHO_c*TE(PcLlr=7UI5FMoA#BF_ta zzqlz5fHIx>rayfgf&Sz!Ty@K{9LlmbV!`|r?fEWFUYI8Xg9+~$gQ^*mT~|KV19AD* zI~Ol2rekgBF_dIQlZg7%%O7ApFpzdLYEZ*rVm7564-MVZ1=|1is^VJ5N!$g5bG8J{r8gCcrh0Gj^-XRXPzJ8?q zY%qE0vx`jVkZQ{L&e>|Xy?K8cmk8bg-#S?2KKQ)8yjdKKbHeLgG~e?K=6Loy`vV5t z3D9--ZzR;eEdAE#C}L69VUl!1=H@r3!h=D;M$Q1J#bGj*#e0S*<*2Q_361wvAW2<5 z)Ynpl4-VaQXro*}i9_9FtVQwuq-ghCs7jOax>#-z(*yiaL%UZV@ag_?S${V>D0lzU z#P>d5p5572xvgP!EO$5|-^zj5Et2j$x!S>~F|+tRDKiE)#roIVuWzWDf!j~C7;eTx zui#7SKFq(V58Hml+&XZ+wf<_HhWR7TSeFuWT)CEjPTI?Fib_by>CqI-^;d5ENw?gs z?`Jd`?X}ot!E+$Ka(O)25O+)xxL1~&m2OLSoy!Z*WQ!A)WdJfec^8VF^9AzR`1d(_ zz5Pk@QS==nUq$}zOZ)79)knHzzV=@La?T;yn_jS`Q#}Eq*7=V*wCY z&TnKbK!%jIDBufwz31<|^7p#+sKXF7>VOZI_`!Q@eg(6ZxmXI;{E)qFchH={ppoPu zH%_vdLS-1TM|2P5#``rq$QLaCyEBd9n`0{QSdhI(!0qhLxB7=U8ix$?W*S*uvS;tk z_x=J6#~b%{tuftyQD^@L)j~cna4+8x6<{Hy?W5Zc@T3DBq5lmU?U{bOnTn`sp0g%< z*R~3U@u?d5L%e}-twU3XL|6z>_B6^&5(&wqku&8HQbWtF0SS%ou4lvnE#E4`wKL@u z&gkRS?QEU)hBNjG@T~Pk{mfX1++;KfA^%PBh_>V-CaEm_LT-?VsZEfzDlV=YdB!`F zRVDnbqlmobrn4kX1`4H$VJsFpr(p8krIs2t?s6f3hKw{IZFr8I1Q@LE?#Dg3JNb&e zS=V-iS%;A8`W{&K=tUedaWn?(4kja{$>5e^xGBJ z&68;tB!Ej>_O)?o`pFm~CXq7mvz8(LQPW93fwsRZVzBPwEAJmHfm3PGpIS2_N@}}Am^3$TZl+fksbExocnLZ#wX%x$3 z_*h@rr*=`ouAl}U(4Bh1QbR6!h;I~tb6Q#qiB|g$Y;Q_-KZ%>ExO@&!0S0jT4sZbl zd!;3w-f1gaGgngN6tw2r|7uC~1K3RyNpE4t>%;dX6DWJ<$6F%to>;BU{_erS6w!xS z$_EliALoW_igE*jB=+=r9h14{(WJgoSfk-js?Zk5CFlN>Ns7ZlKfMqAV z9!&yJ)N?JKp-Se3Vl}tupd)9NhG==BOn$u%bXspQRN7K8cU!b*etd6~yYwu8bWGLo z$3+uGB$SGO8J+F&`uv<#E6caj>~GxRkSkx6kB`?&L2ZRpJ@Nc-e`{D|@rho20FE+H zkHJOF+hBiTT9TXcK3h^zUNvXg-tlDgWuuYtRmR-u*J6e4&qQg6#>ePtki}E)y zuJC~x`y;2VdU*q~U+uzUq|5VNqqURZUIPQD{mZGnUhn2W8YLRwCO-AV70h@Y^JH#{ zb?FqSj~HT{_&}W=5Xde0nlkbH!MKRq;0JBC&^O)6rG{wOKJ+MJz^GmAk!f z6o_&5?RaEU9V{>7PQYjQIYeBpzaHf@lk}@gnR^D(@l7RaQ3rTgDzUii2!=l6iDPLq zH#`99Z#4vx8pL_>xm&6qS_I;mVKiJzjaqj&%dq$e@X( zm06xldUZAYt@=~y-U(~0mcMd#OMi*8vm2K2*3IUDeI@!lI|MKknF?hqY7j`eK~A_? zwq}D}|J4RlJbHL-r~axoJ`m`(_Uk(T8$;zs>+UZy=KhGs4eY3nH+4T+On-hN2X+R3 zc?Qrt?tht@im)tkssn9l8@}1E`&h2b5ZeS;FaDu^2f$DU(Ajd~V&_fzd`}mplG%12 zu*;qvdcZ>N&J0U8o$S3Qyp`=cmiKUp=gbEkD31*OH7*~$kou6kZAgo(hx4&R0{wS6V|`zn{iIv3y=q_rDV7dSgra!fO}Q62 z1B=5yE8~xw8vy0={3b<5&e+^SOcmet((YA*&$uM#R7-WIQGo1Y>GgRl-oe7htf62= zwKlv&m}c&Y=hY~8Z=z@|QF$ixVh&B6q|x-^WTx*`2dGd<{bIm4U^%fUmyNuR4U>fe zwnAw(B{d{+N2=9xXP4iryNkfBWTD#v)F9GgxcCV0OzWgx3Gb@UlO{#mXn5Qm^U1C& zwd5Wi*6^>377-=}XM{PlwGLGro-yqxs+UlQ-xi^kw0PJodfELYCS7F!6Kzhv71_2;|TaLySrBMzP z(l^EO2TY5-k~7E>@&=>Ps;ut>oQEj7+PD!A0oF-C?-uS5e<*v#;{29_5g?_ozQM{o zRNWkt`MWUl$<0SpJcpig@wgmn=#5#u>H-V14hj&iY!@V-J9H@`H{$@r()ZYOFG4@B zK@|QBa-}1at0|JBUf0m!{P#F=6u=wHY1S1u!m5J?5Z+}hUR zt9^qYex*LDE#=ZbzcNLZnrd+lHx75B?|UuNvqBidTs zi-J!&*hxVwE7Yy%@z z%vu9T@m|?%VCuT{g3jMgD*22zn><#q&WW~1j~w~ck5&9hKn{Db)iRbd#koX`dGhV(xA5%g+K(2p?Cs->{V5>CItbU=JNQJ;wI{kF-T88|_vx%dqTSbT#+v!p zK(*w5a4o~X#b;T#{<2PXTeLdL!JRTmFV4Y&e*NBG-*NrFD2o5Oe(^u($FiJnXMhrL z0XTO#rvAHAuD|`stK+0(eEGYpqW?PV2~>tQwX!W<-BGe55xY88LBh~Z{p%2DKfp@B zE+=D?K0-!U=i6em;FK#v^x1$!$~%M7{z7iy4cCiY}_p#ZNWsl&>-ue zv3LN^9wLD^m)ZC(?jPkk2s2n#`A&jJHVZAP1TxCHmMMc^0dmp+;EpBm@aBmqKrq#{{5>HeR2@ zq4g*%edaJ|oHrcPcM4jVy>_~=t3!L>izFlm^@m(iFoItpd=Omr(_`&(hUE}92|U37 z!)e$wZN-cN?=SZrYcyGoJIT>d@WsYda z(_Puvi-C?I{w;GDoFUxf9)PX>y+8(M!vu0}`jM!y)N}<<4J%?3>tgrJfXIQ(WW{G` zqZ?hDjyc%`ftWIIebO{QXUoOyP(qQk|G=yL8vD4!;r^8RI-oT2P7v*Bv*uwSL1+d` zYn;B9f`;M-OspPn`eS|=sI~y5n+fWUIK!!FItZ%^W~T;UBa|D5&OKb$e|=>#8>h4S zPN(*sWatCP?CVh>e@MrHrx~{*Q;J7Eg9CY&b+TD74IFsFVnIM%&_s&rC95eu zqjcRli4(UA5fH^(5DGxUt@5lCRjt|_-hkkIIJYnjbl1L&frgzf2REttHvAD+Bm~kS zw?64-jt1niJTr5~mvxWG(VfUuGAJ|s`;^l}T*~TbW357%Y-GV{zAKZa7JU}3MX7<69VD!J*TBM#m^zx(e-x|xB5TE|5(fFS{jbMj2S#Fb|v za+;4vtu*k4u}BR0mjE08M~eGj;X(eu?E3*{u%xlnkLkNV3q$e;#`z;CCnD!rEph%o zlvVwQCh|udrN2%)|C#OjBV_!4|Li5U=@wMaR$Zv}cmI77;2X%1`VZlKmJ$cpf7}0c zRw4)}M!DZ69Ik*HEJ14jINOi}1KQI1djQhT&uss3t2E?2^z@G@7vMc8u zEpV}n&F}LkG04@C-?;pLDmU@}pPGM_xB+Bb{%}Xz>_>Y4hxi7hs`iLlPybK_@gJJV zzoONj5AOWiSXF;QNxZ%)8uImx7s&P2FHCl_ZaM`{o^p4X+vI#z7h6@t*`O9I5 zl)x!gV-0(w!{WfDdbfsw!7tCX-So^ghik4ybO_|by+@b%e71sy4_0+fSlr>!*kf6> zS7VGa%d=FVg`l+I108;bWVH1z8#4(N zW2stXRV3V@hWznFrbGSFfAaqII_0z|Px?X|;u$W{p8*dcix}6UkQ8Q9d09EQn@h=y zRoxK{i~7fDr!U^XS|)Ps#0TiWpms$nPA#dODAJ4cn0tFkA)X6v73uO@`j(bG6Q%_J z+1q4Lo7!?Ss!)55=C(O+m{C*bi8KzOZ$vg6jg8c{@Yt+sxzDOM0$YB%f?hSe$Fs{HgI z#t|1f8%cv7Es-{Wqe-x)Fo2#!G6XW zYu&H9Gy7@z;R4(FWz30oxXQq}1D!eFcM2#=R;dT5fcvH_zmIP<+xL)5AX{ELyVP^f zc-lgJ#RMK3!P^)5egEoU!RKNdSt)WCD4~ z(R_lxC#1ZzkoQ-**NiI{?pV|DA9C!&4(_yiBB3i#^SQJG6Q@3(KjGw8Q280tfiYSm zwio2VCf)BvVBcrxsydVs&JU}Ydzguk@S_w*>XmIX_;zknK!uxYPk}7kL}qc=+v}xo zBWV6~|K_YWE4@|nSNu}vXPZvZ)X#n6C}&Xbj?-a~O|oSUDzF@K78`BBflC(qP}>Yh ziO8QlHT}-zG+(b7so|+@#WB*BhE+p%0B2TihIIVbQDL-R9Ox-{UCXMx`?f6WK~HNz zBr}F-A#ih#9b=X>-0jX3L=BWUUjX%w#>FF8G7nR~hTP&D-^$*Q-^TR6t@a+cIRRYr z*a5wH|M+I@?$B9j1=7;PQ;R(M|H!HB08ev3W{c%2g<5Mx@CwBlX^l*~sps1xB)%{9 z-w_{G(zf8v%~G~}Wv%UOz(2^g?SG|g)8FZJT*~9TW_Ilgh8J@AUm}q|A1UR+-j6 z{3(+eBeQ|qFRtIV2HZ9&c%S`_K?XDNDNFKSdi=7ZfrkkC_zwQe)*=$|Sr1;mdm^3_ zm4)VnTmm7a?-f6K(&5}LzI7n=rLtEqJma-Q*8+2==5QNInNt*W_4OI5EtBb@hFM=7OB=-!^r z6I7R&&;UBe;SkTdHh)Vw7dfj3L{lxps9WQJ(Q>#q0xR?fse)X(upoV0U4|;X3(OX ztiHTViCIicLt6T`U8H7`#71qADb{UNv1pnY@6J4P_)FqeN9hW#nvvELIN^r|FI%j*~Zvt}i=!5mU`5iA5tFO~V~y*%Rui zNFj}G8vzR>8D}{`;)bh?PI>t4N2zDoMP$QzKiDCC7Eb1hB10HBFI;2O@I#(Mx5Cqg z%&+-i23;-|hAcxV10VOBZqgm{Yr{Ix((pbO)`-d5y>a0xQLe6_#RX2ut{#@Qvlca^ zb)S(cRkcB?JKgMgM0}wXyr!8r;pR6#%+e1gEmvgCugEA{lcG7 z^R@XF`MsfzK){tYQ{?r7U&<_OCrHEi!~_zY>BFdA8iIBbN3)jv%?Y4ecfxeZ$KGwI zGjMg`n5yFh%|u#vin~R-86;-_j zm@51uE1zmM`bm<2y9FnAz7ajg9oAa&f?1ZC%sd!R1fIx)R}hQ7h_IltyA+;F&{d^Bn1l z<5VnW95riLfLX^=BNh7i?X7WQVF~d)NuDUO*JR6qQ-#(3R7GahWRLo6(O}E#s{zdY zk6Zh#L$~##Cm@h1qctm@VsxIPL5&>mJV&4)148C*z;K;ySU&mEta#x)kRZ~!9Mg*P za)sxdboCc#V)va5$AnGv;YFS5AfstjmAb8wXOpf+ByOd^`4=~&OI2P3Jb`N`K+9tt z2WOGW$z;sODNT9be!@y8fa%+C)z;N3BKw9rY`FhURqIi>NLvsCBUuSYP8LjKw$#kt za1GnS3~pS}ySE1$bWpBkMjE5iNG(PT<{vx=`i{I@Jyu?RMpd>TxFEfTe`gbfvzzO+ zj6>IUBO=l59IMq!wof>v&v+?++!X7izwD4EpDJ&M@e3*0ddtW~+29w2fw^^@cgInS z$P!mw{h+k+%O{fID&m5ItHJ#}mXGWTpCkFsJRqILRxQ_*raZXT&`RA^fM_7fe8DHW zdV*^jF&KvOk=bkaH@l=dEcKXnA1FyzM)%BaEqYa1xYWO&(DX(>EW{H&QVIVIwTm%K z-qr9GKQNBrgiP=KyNI2>Pj87Ck;Y@i?D{a$p-ZRd@v|gwT8MrVDgah(y-N_VEZMH<@%TUsMVZjtBhR(~ln@Wa1)er6*j z?9!#LEDqK+OirQ7uPzi+Jg*dJ$V|j&5F210o`pI(n1SBBWv`H&GLJfWMw$E}p_lWB z53aB|b?$N1?2=$|B6-Fw|1m>ZH#E@Unz5_dIiE9e7-fC$2|>!@qs2s*a09xjIlrCA z%&a59)gP!)3T4hK|N1M>i^Z4!aYy@vlBvV6;R#R|)s;QbXj3U0ni?+FvTb&7Sy{g0 zB7cDLvAFsdan!8E-R7ZMp^Ombg06f_u0<4@3mrn_y-Z!8+>*mbt?h|@avykDXP`Q;l#)rHVPMnY?JW=7LYLX-_~rn z|7CmVABv^_MBwKVK|!mvX8K9Rbn~P;1vJ=|O0GpeOk3|I)@6ZmdskD^IB_I>Vkh(t zU(?ouT1J|*=EFs$h+itX+wO(?G~p$??|JoQo$>0sS2we<{>GiBJ11 zV1wT7Pqh#p)-^7s)&ta`WHHa>FA3Ain91T1`;~j(<`v$4IS_(bi*$rZNdn|#QOup= zJ?|%Km6K8Ri=-4QIlQFbYywpc>logkd79pcoiwMR>P&v@$c=ibsXn?4Xwad6V? z@5yRK>p*fI*yg&f*yc`ZTf_Z}wg7bcUB40{43gn8Tjxa|=c#+2Q?h_|wfFIK_*-p) zYio3Y)AbL+3LRh0&PFKd^b4OX+FPJjEuA|t?TVrVl%_5XT`0*^>lj{X5>D6es8lVy z7gOLFqJbc0jZ-)_UpBOZcT!r4#?y%ohW99(x@&XO}i$$H`w62WqWG-Z1UlyYTec)QspZ6 zkH{feua+_*O=EGR24)c5jB;;LQ$Q~Vt^^Ss=IF<;R|+Hg5pnGRMo-(QQTIB6kxOL0xvv|-_#7Aie+gypD;HM?~+;!Ak zsSB!z7c(!S8`~i{j5CRKUM&<)8>H<>Rfn?MY?NzT>R`offDSYS(xuh=T9e@hI|Ccu zE?vzXp^fs?WigR(DpYtPNivu*wPoSFUGqTcZ4MsUi|e=qlgHY$qhT7gISD!ZO)hY^@-Rf>XA!{(bYdqFr)8nxB;XXy$GJ%)Wb_yiCyX;Bv z_SiPzbYa8zI7-tKeI9fJ1dq<8H3X-$)n(&f2Io#82*HNYX`WgnIPq4XM9abDW$Tc@ z+!`%eEK)kuu0HA+9TT7x`jD}jOl!|nSO`)m9Ukz8y*f} zdeIDX5_+XezbJVKyRfR078#&DV@^54Ag9xct30sLF#$TDEx98N-uAG3FPaK&%^mKk zn<*hz8&^9D=H#1p`4rj(8zaR$Z3t0x#)z}dU8_OwwDVfZVbeU(eQ9lUZEaElUM0|) zd3b8(p=k*=(zv>s++Nt>L)UbQn9<_bK@x+f2UifyrvnH0y^4IahJw4@+wxt<4hzF{ z8+9ypKN1p$ygn%zrhDus@XNjVQivk8x+2tBmC|S_j=s_PdA}FqAw#v92kVl$!G0sh zXw+xoeZCIYgra9m*#+{s;TI4Sp|7Hv7LJ1(V_>3p#h4ez<_DI45p)xK@0a!C5h8R}XL-CNTlAJ4mzmkEILSr&;iUxT zXO&iPCu|^oL!oNl2$5t+DAXC6$!9iekb~6V`_R;5wqlc zF5XDiZ{ilA7Uq#D1Oq$oiQx03GtAY#YOC)jDAhzs(8za>(7j?{gWV=iD#??i=Zmcq zUK8(zl24aD zz{c3MwAME(iLEWM1}&`X6beJF-wyfZ*{=(|&Dn6e8OUTWaKU11u(tMO=+6_KQcojH zA?MdMq%2)8pzfr1iql_KJYG7zI+uukLw;s@X{!+|-e_b#H&DWcaOpWjQ3N(HSwBI_ zz)_5fK8h@~Z0)BeU>Dzr)aBfD>U6u|mA(6bn9l6(F9E~1ysK|>8j!a#8B!6UV%U`z z-tLicH@?hyb(v~qPB6Pf(4V}IL!^u*eJ6|t4mclP9bcL7B6jD`T@-(pZK6olOU{kJNx=P?5f$LO-48@q7UB zo>C>h|3p898_*!TppeZ8B*e11j&b$@VrYj(RQD&ekk95k^iWaU+wK$|!ePyAsbdw= z<>=MC(={{3Ry{*L%<rY<2TRcUL+7KK1`cxtQ0KpIv_V6g=#_gYVAz{3dTm3DJ zsyk;wekSqtOnn(l+h7<;^Do3n#=H8i&b=F&L4~Ht1=^xF1*7h6cKL8PV8;R--8ORT z&_T^}kdr;fmJa(zP7FmF>#U4QWxo~<%|{zEw)gm~BiEfM2xwXq8>D=OcptbpS+%n+ z=XFOoN++T%O+dFpWvg7EO{MPAIgX5-UuSi+TQ&(*U0D3URna;9^pH}9n8*Q=ew6`L zKMjT%+7r{ZA=Z?f8{_YQ^;TGjqcT>O=blI{`n?Q(vzWX;>}f=|74op=cvZ^MXaM~P zbK!C0i7wOq%V*T1T}fx$Z3@yzb&pK*3H(qoW86qSF%37XBpT3GGQ*qay1ar~f!=0* z8JXS^Yl>ZcMNPsk(w1NyWM!v)e2~|-<{Y`&8^-z&WE6cC(l;=$Q|J*_^qsYVs7E;f7?if)@1E64z53L(L-*Tjb88$3 z{vmF>ws!FQpL}e)KMbV%HcH$oeofxK_F?eM&BG&lOCu-l*!RMr22fNBkeR989rpSsHmQCR|8Vx7Q1JipkN?A4T*GA0e!s;bbMGa8|LicAK#ltU ziS+%?9)KaAjj?UoG#QVf8a2iJ+&g)I1pt1;N#UFg`Bo^s4URWPc7?GXK}NL#07eRy zropk^cGuc}`;mK7HNs?MWq%U?x*3>Jte>DZQC$HjlxurnI7?`OIDO5;HgO$VU)%cM zKAJoN#0z`#hPb&{Gjh9fR^YJM+J>^88EY?J`Ta9uPhrgOc>RHxHS7mz^zVzkf1C6F zPaP5n?kn!@?myD_M^XR3bWT}Yz3^$}7n$ptYllXYW4-XHHDS)XrU1cN`u88h3m^}~ z#KT_avPJXax`v8xvU*<_>zG1D|CiSKA0Y3)7;?yTodI2sW4+Oaf5O;*iMIZ$KSHWp z*8uL=6=r_rVIKUwI84E=eiIkL z(OO{;dA9xgFT_8Pu6wj9w0}^sKkCl^o;ye{Aaf7XR>5(5_?HSpUfl!Z0`j$$%ae~& zb)ZlIyF&MoMTxL)3j=a+olj8}8a5c^YqLc`}Os1|Q|y7QmdSt%bNiZBa*iUX2# z@#zeq{FOioo!(oiXt!E3Fcd?lADbETt{kI$m>C?*zhLu4hjcX0?_~_J_M#WTyR@@y zX6%hRUmL+PGW?BtOMRvE%okr;%uM}I>qQy!M3|l^>On6dn8h|8w%HHvpcCns-3bX zP1t`zQZGJDPL}R=@XrcyQ}~J%>1l1LOEwfaaj1__b5`3^h_~E40=FlBn3BCQ);6#= z20gQQq0(1M&ZbfTPoz)e7qlgNUG_oU>Ok$U9HO8O5Oqh`-iV}1*y*sSN_%bP{nzz{>T_ihj8U!fGnQ4YsTmUlMC^xRr=$O63A87K#rn%irns9#(Bx_H}|ZYJ~vrk-M^s!nv? z7-tW_GG{Kxc_2?gq?~OR-X2->HKF5rdYpAAj42FN6nUmQ^<8#Uf1((vI#_~N# zUbnU@glI(_Gc1ZTI#bq#McvyVZKpd6&cRy>b|_A&wdKhLchK3!W$wpMt*O}sPTyZc?J zTVd(#+1xbmYX@KG9QsP&5upq5R|0BumKYYbPo9Y8lk`WKyOtancL;Kj^zS?!S9&@? z{@bbcN4$)&i)dL1Z=*q#2r}|cj4edX>YA=dB}efjH=Tu_#0z=ZX8GSXZWm{(n;%5p zkLv8de_WH!Y4AVknhwRtg*~lYaSWl4bsbh3*S`8Qd;05vw=qnVG#)-VN%Ld~lF|y~ z=ckRZKFXMi6{Dv{>l#SN9m&$^O`0u}ErrA6hn~ZcO6gS5LM1W-np~vltx;HiG=%bn z8O3DCGliK1?5gW(Cz5f1fs1pr6=RQbWn(O<8vTaeiH*`AXx}T;$(5hCH?JZ9XynxB zmO@OVCuUg=vpn4Vm=@D{$`{L2*A}Tvv9PBxWro2mwIj9zbR5(Ccr0^)B%qfFKgsr9 zoYu!y@{D|{CJi@vm)B2HnSz86yVh;XvrR+IvGE=uOu8z0F~E5EeNP(yvthbUC@&#V z$pAx}quY1m7M$&%)a<49G@H4Mz?9}WKWEHcPmIo89{CU<0)mEHn)!t3B;&!ds~J9_ zK9WO?1C&;fvKgWbS`;mtlhm|nE3_}$oHESHb@Jy?c6AnGDmsjnlEB=%uy`TG!FYRY z2(3cLVLUo%7jC+Q`S>{w8Ofw0Q==!188J)Q$mO0T60<_Jc%W(bns`r{hM1^vbq8!r zCgVYjMCx{k2-5mwp%xU%SaMfbvRfZ3Nx)gSj;SL8&#sS%ujD%`R|~_+jvN)z?NB_X zr0d<((@kuK5^AX%Vf70O;Y*4qlDNkZQg<~O>X?cTR)uwSm1Gnma67@mgZ7GMqq#gD zIs9ag{)Si_p*CgVab?-k6pi8iPD!_81ba~f+{N8iOOuA`b*I3(u}t~Nj}}a227)|~ zyvx)`*-XT)-iaHt75HJ7-vB7h+B+Kw)VJ?6?8I7AzZf1#f6QSbr=ulG3Rxcfs%YG3 zdexEBz<>FfpE_^Afy<*P`jX<(JndLhOtmc9h^Y|XX;-Tn!(%_=0>sY5Xh|WBsIpUc zXl0tX#GrYOy@c=% z+?RC5(8imVULmVq#=nbvjO@{Rd}%|2Z{DNq z*%eBw75b`)wkKux>}nVzdx^mC*$kTmm(}iMwxzc@T)vW&$d-W`Z#dQ;j`$(;7%7kW zP3ZAom}CEwkN+)G&o%~9{7N{PXxRRezWhnu>!d|J@RNLano;4w% zEFRWeKR51gt&u3Qg#1Zw!;s|NpL8xkgox6*6Qj|B|r6>yrj{(NX z!s@~3mO09iO9xQZ>Pq7$MmmYQY)i9`Ytwr`u%egPkSKC$?=I z>+~U&$=8K=F_XOl)tnkAHQ$)94!Q z(e_zAW>CLtBGo0n$1o|fYi8(v1exQCTEB*cJqB1&Av^p#yi*qIhASg`X>RyWag&~tC1QEo_czmz(BoXMZE?E&sAB{*$C06q|1?nV?+L*u zN?+c-?WK~GQ(Iksx5sq6lI#lcoQ?nW&3Sy5jebM|q3V?oe(}13)4tlzl${0hy$CZz z>hf6c^mIJY-wcuzy*w7x+cy|Fm_Kwn?lT1J_RK_OXvkR9%P~`!J_0K}??B&OxgRLJC_w9;aH}Rn<4Tp)9QXQfXg@OjP*t zifg9nAwPS%TkcZO?0}wH$urfZp}~ujEnf{vR4C=cCh9h({u>%R6kcOrmGjOR`m{fB zsWVY~ciF>FvTAHgY|?UkZ(|E2$tJp`CH}~Qkf74K(f_NqE00PtfA^TBznL;?(kvHr zrpBhxB(vNRYbvb_TTCq#OA2!rcSXe+r_2@0F*UbxiOenc70n7TH*!Z=G!b_}Q$RuR zzST76o^$U#=bpQ84u8D7F9+WD`+Yvo=lML(^Zoi_NEFcih5U|{f(Nf6gY;3TDb{%- z>4T*-4yhqMBPZ6Nd?Dd<3X#WfQF*N2SmDp^o@nSVsy^!)WksgH$z(U;`<-g?2@OA# zR!7cK7Cq3lAwFjXl-p9bA^JUuBd)M-8U;dni>1(Cd53lMWEHXNcV4!)&+|5>Emx>y z{hdaC|4Kz4$GJ0a4`8)QHn~ot58y^Bx0ae`Ti8Jhi=Jd}-KtxVQLU9|nnk%(rIJH2 zyCkt{o{bDbV(_Zt<&Lm?+Q@_M3SfOvqF)oeMVJuR=8;6p>8QogEK-Nlt$Ux>` zDGHYx#oHTkG}s=1WL;QvVFcTD3O-s`eY3DOsmVWI010M`@)JrcL}FKG2C$`WwQu-8 zBH^Ul*5n^c+1-A%oogdMtE&G^6aI@R`~NST{+gltUkQ}|4F<1%4fKzXC~s1q4{GIn zW2t*o%^&9zTGd5`-gq^;p6;aUWj>lyN>lkK{4m6ghWb|_1OBElpM3=B-97pu?CHIl zo|{-+0CMHjd=ZU6=e!$zGqXrRnUyVgl7PY&PYxoUI8l4ge!d#n(6XRKHIVLHybHlK z5PtvmlPPNEqn+$r2i?|yBgP_=3S(#IvdVDRBYV$!Z~o4fS@Ew^PrFw`W!ftfA`;T} zn3Hy!M_T?JK_PzIVoBLZ&7LVC?C)Pm%OlwJ_)!UaFO(ktz|7@c+BpR&Aq6#baY$FX zo=?Bn(M-|tdgooSf$&tq$DF71#x5=rm@5gfhfAyGEBY6q(@efQR{~6EZ?DI7!ALyp z6?W1?uH4zxU#m9BKB$49WI}5q@J49~>=9whONR$F-5o;M9jBer?Waokby&bX-A7D& zI?j8(yRtl8NL}zIpVtzH8jXI|K0f9A1=PDF@ljs6W`Pk&Oy=?aJG*rE4&_}1A8H_X z>-dlm>&lsnUSH?lxW&`UQj@;p&5ETN0W_;D8dXcSx>(PAFOpEDsI{V}3xz7B)dq!0 zZ-~itIz(GnXwUPL!i;LqCxyu}^G&@7IPJKS7L7r*e_7gZRcuNeaxC#q>%G~aCNi;` z=&m*+`Y*nlqaQ3EjO7ulBlRlknMN)n$6vLo0~ntUtiNv%WQ${Rw|iv1)iX|VOnVD@ zG=%iHV}^Q;M{@dxZgm|#;uSD4Ix?G%7=6GG+W*62{SG#Xa3~`}IKVRs!>j-vl-1|4 zP=hog9P0P4pu^|&8Yxe{X`~)DpzDrfiHoVWR+OChnopnYae{U0+LHv$k=njp+exqy}72FcB;4ugvu6eb0aiOy2stuIAdbxCa zW`$GhW_zGfxI|&sOOa?FS+s0X(k}P z^*go2Qfse{7m33}Io>UlTFSob{3L$JO6&1UJ#)VPgkwc`Aiy`fjx-yEe_t}!6+N2~ z;(yBwX779*fBbdJH<-R7V;Su6^Hl#rOhfff2lQbm_hEUBf(j$M{uAm(t8JE=f%NTH zo~WDH+t|W?Rj2}z62Ys~*v|<-{EV;Or6v^~Jeb6vI$zx6I0j?9;o`)gbqATvZ~NHM648}a@` zw}j_N;X+s_;{k)poRzPo5DSAEhfZ@(%~nnSIy_G`Zbn#Ok48imIw6$uRI(?Of6QnT zb{Ka%kIq3+pCLL%>UMdRUOnkFrqJL4cGW}9S(F#yedBAEruU;wKZ^V$?8zQ%S9+Fw%0H0<4 zJybm30fa*Mls2rl@lN-61)MGOU$&VwR-FyF z$)m0JeoN(VO}5KZ?97a*Iw7NHlhf9f>56=27^ncV{ZGWl|FO8sd@rZ5-J{nHV&@GY z0o>&AeCM?zb@^4bN5e#V_TDh|3B>)OQ_V)ODSm|}m2*mKFEdNs-=tjYAMa9Rlmrm> zp;-Q>nMKycSB&@Vl8L}W-?+10ly)65*h4R>jSO23sA0`&^R*-d0J zkJjIo(|P* zJ*y{xt%b0EU@WKrbP1+5IIdt{H9c{@X%7aIO|@6nW8J!SL|=CPQugoYHTv862GvDC zo=*5qBc`*9)KF7OWz2(ncI{U&e~yd{JrEQma0&LP3F&#}1;>JKz)Nm7HqN-uz+kh=V)njcnx$ofeQV0meM zo-qedQ43`d(wk9uHKhBD$8*IC0PO@&WahD+Icmzzr8rCKm_07zcxIm2I97kiz&1<| z^8Mg`jegy_r77T!SZ_|o?WAelu_@9?fj14dDEOCV+&!XpLVEJU1R(Q1FPN!tD!Upe zV>v3h7l2-EuxE@UCi(-;Y6ayuGJEF9+>Yb`(J3^V4^;J86$_Y4?%#w9AVS^YOh#gT zikr=dGc_khwcMhxAx~R`Kn^CNng}WK8l{EQU(!sPAHR1g zDWo;3RQxrBEmXr0g@O535h=HWLaUlf8^r+MZRJ?j!Dx4Y8aVwjAizA|SbIK@VW|I2 zy^Y<@3`jQ>jK?7G@`zK?7Q_p&p|iiWs-9@CJ!Aj_+Dda?%U)N1B-0| zDUvMT|4XF$FA}%^^N$I>KrZVQ=*#QS`|Ut-Q?iQx`|xi;1=Jk$mEnQLYyM6Nfy&js zLLVq(@$Yee?eVu5145Wk6wQUZPk-g?Ab1|&huzh`J_XPRLs%Su8T438c4x1$KhVYt z0$m)A>&(XVHqe3NtV`2%6XQ3vdWLe^cWJ#XbY-g8q7Rd8H4Sfukwm&pr-ybEmCN_A;pTqM4=Xjzxl0A92Ps z{0CekH_6QIx9VE(J63e(+q$~iiMD+2W)sx(#zBrbndG|5ctrO7fw47}+fb%Le^5+THoOPV zDvQip|7EOoZtNV6lcRq9IRw+y`e7NW=;OoN%$!D>)<;zAn^t%7Zcb4$7s_@FWKhGB zM{YrGZpeP#(?NN%YcV8QCWvXGc-0knASqQ=uSp( z6D}z*Ib!b9Nz=#>116N$Z^-jD07K0lbn@7J{8d?NI6+A^LyCNA9z}1(Rt0H3D5?)% zG6XXt4B+Bbn~KB(K+)*<#m!LsMAuNX(!N(2=7E`WBt{)IR#u*44c-pVTV)O~#}v+J znlUS-CPOD>%bZhV&9*~2ZInYIRpmK|#5xCpZ-DzUAw=LN-3z&PN87jkcJ6Q*i!oys zwyTa}sTgPo4)k57@z|Jyon4%y>6W?ETm@U{fxpesT=ngeg zo8lZ12w0pXO1OIwC{DjV(( z&-9yfS2c~KWxF)AxS>z@Jc8*P@OE!6#H=Si|6KVIFudxV6!8tfcHM! z1XHo1v9oN*bqio5WC06>wY{J_|Fl(JUQH(X_>0w};Gj=q0nm$qEm^iDu zH(*yVHx+4`dfhli+J}wY3I0n@1$-6{OTi13<+(($9WojHn1D68Rg6K{n7Q@5V0`@M(vd02;LhB<8SALe$ z8EYMRvXHKgHLIs>-WTTAJ4gOTFy3bxgtd)E=)T6*rLzYerj{JU>twU}iqIKgexRji z)>+Rh%fw^R#4*>HPUbw!yUX)W7QGDJipQzuM*2cHQ26{t>p+s&{dBRJ|C~hZ7~aNh8ycs*C%R?MNgou0K9Le#Ub8^o;a@kZI}lszFgOoJvvYW- zK2$)sI;r>x4$rUg`54zb#CsYsj%%plM;a@ZRwoL)-`VK?!aoRBYaYh5ijXIXes~x3e59!k zZuldp&*YlD$DFSw#b#M~wko;h1XQs!xL<>@Rci9w_s2`qm9t6@F17|3S9XNao0V{# ztixVoZ=*Yj=|eVJ+oCaOvPjoTtJUl2uMcvGy%Z?Wj4g(Tyh@ch zZcUsZ)?r$spWo;`k3`Q3PRISq5Zq@*ugdWRJHfo4fCd1L!YSccM>$qUG*^e)Y&PpY zD0-HR`hEvII?!k*7%%XAgY;YS=R#pM^@@W2@qpq+9GOdb2zt~qlJhvj{TgaQZJAm@ zMhTsk4LJ-|sD3dmJc~R^U8XLe^)#ajVDjA>?G%tv&!V!(WaGv1>>+s2_h&|%$Y6HbeT`Sly(Me_ zwe8QqAJtvVF9?@`OskX983?(?>|-oVf&=W1Q^q>AUvsYOI;BVayF ze8ej!d!EbN{cHJI8S!)5t`_6ySeTIIkF*Ev9&PAH-6HBEz_;EemY zT*UO3Qy;cAkqBY9b#1Ggj|46O5x*k6Gb-wf;)7Wq0lu)w=?z+yY)e4cn{!~3j}_M$Q!LXVQW6=3%e=oWd6c_!j)cdMWRq7-(06^YlV~3KF$@=q z%SGjRbv0ut8yN3bYAKOrpUSZ=((Sjey1V-zj301(h>$+n2s-4guGH-X(sm8NXpg`9 z0{I7l7Lb=>O#KcGL0_GPI#Vr6xzJ$kl8P#4)6}nJwdk%>^X}mI_=C8Hp7yPpBRR}j z)JwefIi-fuBX;U{&r1&-7*4bt)9!YvH}TRTjvaEh*(c=P{MUw-#NRzYgSulnz9j?rJT?P^rXBMo16n>EUXBR1LM#_ zgd4LNGGkTfZ+g_WvVR|iVs#JtH5|u#fnM2#C&$NUXfD1oB-y;v1>KEf+9Av2^ zqg~w~HSnU+3oHrbmqk0l30^zM>W8wV+uO$_?W{*Ead-k|GiO~uzXZ%G<{-=>ChYQy zuM+0LEZ9W^ygb!!N*}*BLKzVET zA4Ns#sK!IUkZp|j9X=L!HFp*A2Lkcivqmf3^la33j@mLrdDq`-ure&s!v0CSPy~uatCb=^iZGUBD$nXbM^Q(meLXrbV#O1I!55rB&pWwH-dwr0&#EmbPu z$ruHJHzL7yld7EX><(!HE)LuXM33fOMXyBqs59yXh8(Aht%rJS;KM6Bqzcx=dWu(n z(|e)`aABKS!CbTm4a<&vQSbEzS-H0E+b|KKg~fwgrZdFXjI{ByO>4VV*oNgvs54we^t;a5Hejq_%^%|n_>g*&YAaZj!sc_1Q}SxtqAp%J zEC9x75s;RMl+Ni8jK|s-HKxiEQOmqXi07S~e$91$)%cQ{^Ogt1HGz|3JZ_MB!u_W& zJGN!@8+DMqC?DLQzba8BCkJZX?j~0rdo|RAItyJWINAGA;PC@&^2~?abLeJhtgJ)o zgKLDNoRpYeLKa6wNsmJ&=qklUhJlKlRfXQFJ08!UsbTsv6FL2;sDg-4-c4WkyqN4J zGGp~r!ibm@exYV7o0h5u;q*+%o*xPKmd33pn^ z&6~Zfs=5lHn!1796s14THk!GS-hB{WTnde7=sOI`{cAYy7oW^YfINX6m&ES@Hy##p zaz=tN^Ts9tUh3h3WO+S-m6xKHd5s)gQW&VBie!6MFO$2i^8*_&AyP};T;VR_%D|R4 z>z{0{5$@k4JN#Uqw5Cvtzd{S?y(Q5N(&6ZqIeGXUwdI$AnU@6&wF*28=E{I}s-C zhpB~L0VV+`BqBRjCAGiRv~g@Udpq{FQIxCi)LHiGCEP?LKDadDAv@jDU8(4nDbQ^} zghYOHnfUxIpfB~&=o$BYK!E+IbuGU2LF-0mt7@prmvd2eKi9+$9G!DQPJkZeO!`Qs zd?qN81kCm2N6!fT2_CB~vPRV8PnJ)NKTTsL)5~^Pp4|b+m#aX&^ea`C zixV&Uoq^`s)dTHaT~^C~qW<`Lviy|0LeaGX)WdjnimJI#?_}R!j{*>-0qBPT_jtm1 zAmRXC&Duq03N#;%o_1FdXQ)#Y%>8y3Y@R+BRuORdVZa?;Ki-;5r_((ki^VIzK@yYbxz^UbNT4He+xD0Q0%(=Fqn15NKP zFS80|cJ1C8;xxFKF9)21R|;D_q!6+^@NzZi%A(oL)3A=$C@&VmWkHA}A*@m=YS>QP3aovV zmT#6LMqc9XZCKOQk5W}UIR{xqUV=RZ{?N3Yy22fsh+HX+MU8|eEdd3QE}(RR z2+~RDp@$|Rgr0;F2)uD-o-*_NKfWLM<=&fFKfZ%n-%5cTxvw2L`})d9Y33MT z`Tf*?e|&MJ$!uTz`?WvLZe3yO`=8dotDgJ8p!&b9+u!qQ#Qaa^OZR_gT>9q?e?KJ< z@4z7Nw?X{Tp=1Ad<~}vGV8YCXgR1X#so&anb}qqrHpSr3e~g*l9FcCh#K5ohNKh3w z@!`DR>rmVOqYcz@l!3a`GmQSWHwHsp0&WzytKw@$KBvA^hr>^TU?&2XM40TplXixJ7XrQf+xOUwH&Om zPlg|PWs&9wCK+8<{LxrXYt*(ewC%D{ZoMZ!9=J-7xnmT*AW8^UKiKqJkHE-lEuA0E z>N_HZA7aSN;Tz0ZzDt!z+O zN8DEY9sSiBW&W{VeU~DSk?4J__|1MlX~7BFy=dcz3@nN|Mmi!Lg)|FjV%^&FYMJ{W z)V;j2P2 zvSpvOsT%<{wY@oD;chLC_dvWqJ_q#p-fgFUfpuy^JUIJ5%fGZ68GhZh3ct-C9H7>5 zULn{;Nz0cr8lL!UbL2`L zS*JaOk^;kI_H+cp??D%CmA!9Y-z!JnvD;Zt%CiWYuRiOp{6zh1^jF@`FZNUpJ7YQn zcGH4GUlB>+PeBTi0`kw=NTl$s*$N<5Tj{VL>uHw?;_+Ygu+s`N@L(u`k@lB~m3H+z zk8p9(uP`G#uy=LjY5?cyaN4D5uNJ#%(sP83HrlJ-3{pYy28D^D^IILW8c zv?Fv>NnXY6G(Bp;&mL1?LhNPVV{SKN?hAUt-52nidlVjWw9rVJt>H+d)K1SR8)*=Y zRl`x+ZNv+D?l3-$d1S~^F_1*`8!Z8D@Hg1|9NLb%yY1I${liqsk4EuRdb3Dg4NMu` zBKA&ktOTQu(qJEjsJl&ioWT8Cy?Z|-ck%;i9Wgx{kf4*y(fNBbqiR;I45~sm@LJ|- z+ErTjt*|-Q(VH-V(|AVLMzJFu=7E5kCxdO%if;upCXT5cmMa3y#+ri;VPUHQ$+0xS z$bYyDJHmH$yH3WX{GL;94zzw#-`i`_^9sZ6585ap(oiIw!^coO^C1|z@jyn;Zok!i zps0zkO16(wr%g0XSgVtTBUKk#9oba;pEWEU`y%f34e*FzwWOe<=}id3l+qVUbhr65 zjU>NL9Bkg|W3a^KAAH4^DG3=*SpLI%kni@ zt2Gvfpc#HI<*cT%ZIv1$w(Nf_oslTr2hnVx8_mpW_(CGKY*2Cgz`W>&Yw7SCefq1F z12|ctN!>f^b&x`iu5OfRBxD`rMAo_yTslf2pIfE@y~SY1gG5eC4>=y-1}7RXprNJ8 ziw)nxFRS11&qC(d9U6gt7v$Fn-oYRvEDu%PS^`7uHjEA_KQS1b#g!wSb!R)ff6iZW zA(C2ve1FUrr~YY{f4{-1proXPTzhngD`b2$blC246pTNp`SSLdf}h`_n@h)mKivUA z$v?~1Gv_V$5BeOOV|xB!qQ*-FGHf}kV8U@52>R~= zH}6bdZnC9!i{F2V1I$ntZ(3U7WN6VrDqgfCYR(Yn;6U3=mSr<$*&>1WKCsJ=#7 z>7=vvo7M5(AjkgS#**}y{V13(!aC+nN^k?FxD6N0kW;Y|`uz3$h@{>8*cbm#n> zuY+zqN{##8NHv~!W{u+OxytEY*&ci?Qh5EqvOJ8nb!PkNJ1hS}y>JDC3GUeE%jKsS zrz+_MY&_+1mg#GyTiJr;+RlvZLSxW1>xp`8Mn^Un zp?ufY@b~C$N2fo=yENEMY_zl-TgtrkAETS7{FezL>-<4>miF8bU^=C;vwV#*v5=ZD?Ex_D5tY5LjgB)gO^aE% zW~eDyJ8kQwSZF(G0gRocNGCL0HUI_Bi71F?C0zR0>U&er)NJbkKs?XNp>I;99T>$c zSc&@}uV<))h#8`e4nE9+ql1$S*WNN=Gp*MKp9*w314fA7%+vimwP}`aTWP=gyL@W} zoY)(>T&C}k&ea{0w3SzxX{BSG+K#C6r`*Ynw8EVosQtl5aUUC+1-r0bYMh{!)=UFs zh!4UiWiE?mo`(_T9hBdw4h+so)%#O)wUPRgy2{;-Mv}pqA+{e+_@~~*p^=xdtO=JE z+ficJVQ!h+vtWfH@kj6LR3wSIV)Ny;sb*a0Endwom3*;`J&EZirY78uGqhwxSabAxNd5S5rw=XnmE(0tVZZc_#Pks znfd)Gdmbeu=NA{-hZ+{C?awRibzbU;d>~U1i#16qOb4Kldig4V@y1B*s zHR5Mf9BA_NLbFeEhA`FmyZM2A+-fcK5~!okl&Qt>9cRkw=h`zR2M-5MKVWK;#-HO% zEPBr=exXxyU!JAK5u-GD0-_Ai<+~(#ZzRd11=IpldaFE&s+b<0_y>IL28U>^D z`F0JRZ(JD>37Gea_A}08e;ce)q^dP{<~^t4fsbVbGboXAz)~x6Ex3nKyZ_ zb9T~g>hFQBujl*B*Z^B@%+e{wMUY`CN3oG&1hFKn%NTO)ULL-+(uj|Pv-~ojU*gb& z`=jAEli1lz)mxLI2(Chxt?P9&&?vbe^X1d&Kyie=v0)SgR(w);FXAO^NP#gU!pv4fDk{E z6;`B(Q<1(Uo*;$OEmj!!3WyrXpi71H36J9YE#CDTk^QaCNMP$=sMG08_E(T+84$kR z8=a2|Qo$}|(u^~&ZoO9_oeb<27!t^_&9o27z`ho;!lII{pqbm##O>dy&6Q{OXlVg%8eWK!InFTgF|}BlzYP7Q^KaBeE5N|wlm|O-ufBOe!hNT zC#1Uto}r?mIAv`5t5u$|{i<)|m7FQ90lpZs#uoYQ{|y`<6GMK852V0ku9_&KU7w zY-`zO_Ko~PmDJoX6$Kfj+GV1YcXX1k?;B3Zo=ims?tY zw_lGVrp4b-(ed<(Nh113E%nKcudj5R`=bnKo5tw;J5_k!o(jB=_w?nG;!YPzN*$4p z(Ghl)lKFW=+dl(p?p4s~vc;k1uV?KdsieIum5)`CEg2H|0`yu|eVd&7HBT&O%(1Tv z?3yQrT!onAACnR4_FKDY-jFGPD7O^qD$i;;E%U zG3k+Q4DXn0GvAuKZH*ydB}LaSesofd{Ze6^*tgwK5WfWCXjCnke#sH3H%?FK-X=rDN5~~PG3W-P zw}EOUCb7qCObl@^{b@k5XjajaRz?pb>sz+Zp?Xlr$JWZ1%tLx?8CID6kMWU}d2CUM18?d8E<`1C+X6?x#vqzLLAO;WseL4Ita=LQ^*(KU|I?vB z)AkQ?Uen$@dA1*ObhV_3R6XEwwAfA1M;`L-aUSK%^2{cq@x3w)AvhyyxkYm08Dwy2~W_( zB)_(c!$ap`3vx__tKZ(iTWW<0i?G^?Tt5~dvHC)&RQAB~`PvO`;%J_AP{AOUrAb)O z&Lsc{5y>)1<-ESIP)X4h>1MuY>N6IU``n;$qpDPp@Z@xy1K$N-A3ny(9<$?+5moVI z(sNnR#kb6@a|z1mM%yx>N4jwfJ%bw60@r;n)e7)Bw#)05T`p3Z9;t3MtFSD?E+_f3+Cq7ODdf zEfy`HJ30yb%wWAM`aYJ#+Vv9Bj0HEkA->K)0S`Lb&|GmSUCX@<+)28NCbk)stT(#| zIq0%DZdP2j6vF&;)+lCiIV<{308>V?wjAp|cr)~qk-hT+BA9=2kustM$pWmtlO{&t zl++3(X0Hjdtc1=>bUs{{5xPgJXP}_y}??W+?&}G(bz>-uG%IGNmtKVGO`dh3?c-V0G zeEUE?Xa_rqDdIs1XtdC2k|Sz93WJMiKx;kPgVf=B3HxDN+=Lj^PpJ8R30c607Nbu4 zNzRiwxJm7sm`<1$!F8kdqd0{?A-fy1Eis%zhege0@m`62C3s;{++c|9?lqRFpneu| zC%kVZ;b9fR{{{6GS#nPHzIc-a%0Lr&|7xHH@;VE_n|@Mck#%31yI*|v@zZI%(#zi! zY}Gh(_v%KvDPtNTeS_cB!+{e%M>klepoWTr=;doatx39S$Zx<3fxeXqCqJSJOQ=KM z6wB+I@_^AzxmeKiVCOj3Z4WNX#^n=~$G{x{0(NI~@M306m$*f@w!&(X;OfqgYL=yu zO2dIr=t1-!V+Dhd+Bo{4p(9|ZZN}5>5X3X-gT= zbmk^R6m~q!Fi|)z*fH{3@vK>aApW(&yRPr)xV!#fLS?SjHn|EFc(MudGRhOhc zW;Hzp$X{r=P=ak%+`D$Hx9r0dEdW2=T39vKwQW#4&DUuxmq;F2HuBJ@IOcw zGl6FJNW60Os0UI$D0!nQ{tFuTCTku^K8>S(nLKRRe8!+VZo8S>Z@2Gjm~}WTl+W2T zYKu!Y$eT8t6UHO+k?mM9%TZNkFy4V-s=)uQkVd#-;X3dW4KT*PcSJ5n`~Mp{E){8y z&D5AIDvmv&1$7m&#iaW!-t;DtPWah)z#;Z<5kJs%&mh)ZuxoCHZ&@6k!`T=ReU)ef zKAsNmN`F?BY4yk^S{w|5IphR91l&pwsX_^h=1iRMORjTN)mIKi72VhbTmggX@18{o z{4QfF*Sb3Y+vBY3*hYjt%<56Ab`(ESq=8=?lj*MMA@Gg(0}L zT*2OxzfdAQ^Puuf{U9|0o}~yQ5O#V;c%aC9C#5X@Sed@F~rSZF)(8Js^}~rDgg0BQTbV$%srY>EO{`DAX8I|ERbe# z<=4PdI6vZAjkjQ+gi>jB@kYEI&78UvjFPr_01beyi_6aJhfsegmE_0RZZ48Z;gLBr z;dj)p5$4QrU4oVYMm3apZv2C?2$KW z8>=Ekdt--xzU-n-V^2zbXRVY0NX11O#> zkF&@Z7#wkY7_5PL9H@EuaSy_@=X;w`p}r}fT2>VK*z-Ss3;v_P$*RJbuts^00=WV`8Wg#8(IS3vE(=$Xb|!ctp&O5j5I=gpchD}W&Dc_XlM zkQh^a6!I&Ib-C-+6J|xx)F1QX5TIzf>}O|(Y}V3Gsnk=e#cgY@^Ad5_5CQtqCQZ}x_EmF2%|-tH+(XWih)kg0D?1^#JU z1%5~yf>q$}x&=>Jh5w8v=-W|gWUU{R@T@S>{sjIKWHMAL-Xf5h%rn>&th3`kS~mOj zXpy8)b65~;KDZx#UaJ?Ak2~nx$xj8y6LEW%%C!e{U}(^*IJ9FFF43srrn^;D7SG)$ z4*JgM3blEF+_DUlx_i`*!xM3h>4pa)2+4IR;0|>2>#IH6kVQxA&sy~a5G8LL)n2l; zBW6Zwyn#z+#n#K$ zp2C&+R_WBF!Wg7t*hBf*qWwZDs29(PTID7v9g*V+tah#zCS-Q6Rm(SXRCM2V&^HfkuDGha64Pmi4qIva@hk&T7#CZOaxtU|$F}~e=r#Zo(p1z;5vF1_A2=fqQ zxq8hpohhAUO6I7bgkFf+^kuO6XX^yEpy!M!2l8r8+N$~^13O9 z{%`Za0)k^jp$ z*hP?yH~pO-PMwNy?&cF=bUPdUBV=vmRZ7lQvC~(u3q{JA7m)Ir%7sah|BZ2JdZAJz zOM(kC=H z;wMO2lbZ{3l_)M@q-?ddp<*Ntqp!!4Tkf`ZZ!1(PspF%Mw35U6n{*_k%S0) zNE%suAb5ILY&_$j{%Dq)AX*a+B440T7mJA0m&ow>j9p^ze8zyJP`yb5hcza`AfzS> zpnhIMeUrN>IgDf%dcBeIdVS#-IrZ=va~;NQjE%Fzr_tLLrhscDtCSq-j#yPChbqr~2TurnRIUa>euGj$HsC zd{+I)4XPfXaU^*--T(HSU3(xN7q66GeK;eNXEeCupqSOM{gAZ3gYsbj&e6kHsaL?B`&P4QNe^EaSK-pk z-(Tm`N0NzVZdq0-$lOCwqYH{~GxyGqs`SRWu=)QOT5oDJCdvi2Dy zrB+}>@N}aMU5w{s&wXC9lDl|Jj?<^pC1R=#R!HJl4mmv; zbSA(wF?DKaN?>^I=D4DiBL6^DeLf^RWA6b`ZCUn1OsyF_TIG8;0>An`d)d_e15fc@>BaP&BKuP7G-UYu?ziH+=yK8>f51 z83roaOtSI2j7{(jlym_$#JL$y&qgWzfw|1-`0!AwtlptR-@y-Zf!$#!-?R^Ht3F&Y zlu0O3CypRKNMFZ%@uSZ5d`uS~g5>hcE=vN-a@8`L*GI8RcC=N6g=Lp2V^?%Cy^f%Uv4HHEyokg)DQItM_t>Yd*8$FthbNJPb0%NjV6M_ zW_`nx!ZsQ0kZS-+|09MeRH?e2(0gn+u#sl**_VI)ta(UC1z2O=QgCSNtDhZ75Vg=A z-UJD?+a0tsIO5P6U39NS*zOy}pm?ZIUUH^m#U-WEsx$6~TVZDyvp{!8I zI9vg2Dcr$XekyL~Qvy_MfS!Mcj#7EQXJ?@cU^#4azD6`Thx;YA{w|1)kJ?|S%xnsZ zup-;zhV>uD&kSdg4(p&}28~q{fbB?oMc_wJw1O@!vAv!{g|7tG=>ijG`#|#5XR8|P z_J;x!n6VedKR*z!X#a#)lw?Eh{qaB(dvDz6Cxmj5O4fmyePcmKp0A>uC`x&L#q@T` z&U!E?|En*|J}}HPF0^-rqIy~@SPW~0>q4qzgWLCkP~%P`ml2Rnu3gVDjKv|>OC zkqo`Wi7F67&3qjCS)T7{10<10RCY4s>{aP)xc>!hK}7nIia~abIdUkl@%g63Ag*ZCo}+h_Ty@f}O7K*He99 zPV^b5i$=#)2AgAfVAYuJG+m%+pB7?acTqN&9(3u%z(mt>v}SQ?t`Ie~DLrhZ5%&%e zGQU3<6GkEtSi?zJLZJEq7k>Od#PU6E- zlY7(~gh^*3cnvJ7Yr(fu<;&b8b{aS!&f6y~tae*s*`(U#zX~e0ul+&LHbIwxaZ6@Jgg1$4f$+Y& z>moT5+GK$x3$QlsW@sG&Z$c3*7<@Rj5}We%V&F_zTDA6+noFs^0Qj+ir98O%Q|dHV z8NSsA+2@s9#^ZHs#}}Oe4Le%&fA|@_u)iaoD{*WZ4AS?2T%LMfR_ns7&_VIpsXV2% zsPfX^W@u@HqS5eamdqcqmBYwp`r>UOb~yZZZ(|#kUC$ z9F%s}U|U{$OzajIHqVT-eV2c;oGl{0xkO;0@cKL8ZCLJ&1R5Aq_AI2$f7+#YL7U8r zS*C8wa)u>5YkT%C4PujQ-}s>1WJm5dPlcI`=JI(kFLe>-fBFe?>pZ{|jd1CjNm<%` z5*3YqV1tvhN-j6Hir?7##$DgOPc=xW+C=tw0>Aj?XItBzNwoHODR89u+pooSOI}wp$*3 zKmUtZ`iozB`1CfSbmQ*pA`TS^Ag9r_xcmkAklSE6j2?eBo=yltbbI6G&LkaE;*N7O zRNWa2o@TIE37u&5jY*G1d;=U~cNi^>bJ3HwdK9;KbKsd(T&`Rt1@IXGgFg-EWL(>; zF%yoSkJik=MfE})gwQFgU zrrh16K5~9!B|K1*&U7VqkJVC5o+SR_sHW&(UPe-u2-ALJ7LWxPs-pXq=3@$B59WA;g5JlN>|p+?S~`UMS-&);{)_K8JbT|x(}7Pd zCvC*)O~HriwRcPjFF|omvP?Cal$1=3bL(%3?gWv6Zyd7EC}=hRF;NdN%e*M~cggq@ zJ_M=uk;gp#0n_+6$&aPeT#tXAHIzoa&y_O+=B2%^E*{QUkViw6gKfCccPQ)`k-h{e zTAfJpb<(IFDZYi#JT#aAEkEX@~bOx5*%>~y4dy)1ZTq}&l&Eu0rGk9!+n(jD{L zBSg&zeEBs_KmSU?B%G@az4y>2Ku^hkYil-?&)@&#>YJ3CPkOCVC=ncVQ3L7qk_RD& zsOg6E>VwBcw~d1bEbFVG6+J|IpG$Qjrh|Msr{eJRS7)8t+FJYpH??)bHXsp>Iyp zo9NCtDVT(|JV@H9qHSL(ne@TAi0R!`L*=c+26VQNLGUXk9sx$~>_lUqUunMYnK>sv zEwG+EY#DIQ+q8~o^$Y689wWmKURb|xYK#6a;o}blWY(GC)jj_Ek8=)(DvE2Cpt&F0 zA$xr{LxO}wOM(H>wLk>-M0#dRMYz>-p9TxoH(@T$~?u4-aFb_@!g zN*Zl@i`^Y05?UXN1t`NP;!wb7P>AwHM15=S@VVv3$!+Jn1Dd2@-qJ;~Zh}HoX4q^g zC1`ak=Y{I&#pH9V8bKYGLs#~=OK~6X%6^i(aSFDe0LZJYN5F^QvTd54 zmtFWO2zCz|x9g2~$RGJAVz!oc`^M?EE;csZ{gA3TO`z#_ME+TU*Z3qw_y~o2fKM8oy)-MXQt^a{%wxG*E&+-nFmFK>Gc%%HZ|%N{QAE& zY#e&JzR!5LmS0E)yxUfRy(wri(CEHczp(QCH1*9LUQl(b@xOf!%y%%TV1GNgp)DwW&0&Tr@&D4)jvv#LKhG6 z{MP1v`Yj$f+yAA2{aXqX1cVdxRDJD12!Gn}D~shr2Uyd65?0POYfUCz+%jA$t0^Qk zGlI0w3Ph;P$iy`*?E6MFsb$p%rJlyelU!t`lhJl4@vKI_>Zb{Z(6->Z!~+kKl-CC>-Xr7cub zYf{Z`1PZKKT)_yntWbWRRDD{5nY_^MOkUpTo4pxRG=U1NO(u2B+TSFTL$X}nsR_dL zJTc!Z&mssu)$PHP$1wMTs#?AZ;<_72XAzRIh=r(SV#C|bgX=rN4eh`Uhc;Guxpfx_ z3S%v*jmG-e#x+!3=3Y>_UPBc{Ycpof8L{kUe;DfNqbqdS3I+<_LQow`^5J%VI}R{!|T~-M(epZ zeWaz6oNu;W7RsM?tf%{8<^?xq)*e8vWiDZ%2mBDWM;O__s9N0WCY=TcB6JbV)d%;L z7j}9fYyIa1Ti@PgDzdiv($wL?{5`b2`(f4m%}w4OXjm42DgS%<;b&lb8a|GhH+}13 zYR%K|Gz^FMX-rm+q>s$(-Eb%LYg`9yHu;OUUozwh;C7R2W&6B)NPu6-pAzJ}Ox3?t z!(T-eZgUHj7!N(k9iJp+78{=c`wjz`2N!>?@b1dpa(r_TSV!UEy1hl&Wzy@>xI zRC#a3=eF={vE|sp2?f*cT9-?TQn|TghJ*@q$J_~pn$sRu7_jT2NoQJXrwj7U6$v0* z#1JGYAu$ys_yY3-v7k^>7cr|0@V()^HI{!_PY)&%m)HryCy-MYe0@J6Vw-EMIR~;s zu8In;8b@jSuCaDLo60*C&gP0}q0`Ro7xf;&a=WOGDRi5C&970`Wf#!=r;h#aw;0qA z1io74v8BiM)H_VP#N<6hro>}YkIfip8$(q3;WY$cDy-KQNfh7r*h~tk5@dO3d+#QT zquvR}Pj$*oo-~f&r+r@WI3Iv$DrX!oKNf&mvxT+F9~cs4@7jLIC7mhXoS2i40K(Mo zxF0Ue%&Z)~ zASO6XE7NI(N2kjY4{pM6F*>GuT;4f{^i;AfHI7^d48MY~#a;*#D!aUnqZ$xlqY)8@ zbdk5_b-NpDkfAmfz}4vpn66HvrP+J^S;zD@J81hPe$3;iXiia_t4PXz4FmZ2xO0kY zRT#iI=8Kkrsv|SGMq2@nHisg7nSPe#)OaBxQ|?y!dsjc#+y;&!| z0X-L{L;cd8PmSOgQ&faT&+20PJ12%2&`zINeMI|J%r|_ za>`o|aw;kyxTohNAidiB{6OV|UbO*_S`U0;~5f;(ANhcIy7f7d_`=+=e$o#96%duz0;T?44;r*6Z@DN1IM2Zd{Tz&t#eg zzaLWcQdDNJ*m@))z8=rNH3QgzhnNR&^|xzSK9GYe=&IWZGtH7VuCb#?C|<#8Jm5F4 zD-oNI8~XJ5UnRN}%ETs%o5i;J$%sB~)D^VmlDWGMXU4HRpPt@i{rG1vBgoW}Q>Xrw z{rnNrR1^yUoEcdIZDqylrdw%r!8#!~a_cnYYimz#uJ7xH_b(DVNr?f*YV_iVjNqE# z`KYC_AiZlsJw|$fzyk2kdExbl05A()aNuH<;kc{;qlK+=Gs~iiuG&Z6OPjAmD#TJC z$+y<-^aeIxpSh6J$pE_oN%7wF$mD_}nG9{j6ZyL%NdKB@AXz=xIn|K9mHag(mH zrNzMqFB4uS_V=9Bh4)K48<7Y2)jbbHd^E>DxJd-RQt*+HEne5f01fXRs-|Pq<#I zTQwB&FI|ljd%kPhmHv`P=`kHhgEL=ktHf_jSK%J$Nmc_a#G}dIg<-I!reV1SITOVeTYv{?bc58KjQDXAZxs4G(7f?YymN z4E#N;c^ZZLqe|)D-u+MvI(M$@%eQa5f@<#{|F}g=aNTYw9o-16mtzDkfsDW_2AjNf zFPSs42ESY$r*5|}B|JfNJ4W4_g*g9^vuRh$IWMF3o-jVYH8JP>m5B?D$R9qRF_*xR zPZbnRyP5kj2Ec_wFrRPgMS!$VcRnqy`1Wm-qzfG^jDG+WFM(W~oDXdEf^F#fx6Icr zX$dmYD+F2GFoSxWyEZ}7D(si|rij%)T+|AI$o0>Qk^WT?(2n)Ed=O(8v!J9Dy5r(b z&m52`oA>l!ZSm(N(%4H@imn`IFyG|b)|(~pp+xdlS&4$z!ppy7BxU?QtBnc0%*XaqbU{jC>N^cv$KxE0EgnvC{DS9g?AiF!?02-< z#rDJgBdQrMna45@f`Z|_H)fxN3e!P$rnI2n<=JA?g&^)J5z^hR>fg3_K&Ph44oGzerk#^uD>|jf3ZHMH0W(foGV-6 zgr6VL<>Lxs@%fGDA^59kyV#)XQ{WpraZF>tyJta0S7bC7ZRK_!RYg1@#@%`kxz@NK zZ+1^4vqXVl{Xr}n{F9+!!Qd@h6*10*NQ_&2BlPxHjOW#u*W%vgnY}hSsdC3EX_Q@% zd39glzo?B2UA`I9OVsHG=U5&JHb|!@eM2{j zr0RJ4KGPL38%P7!7Yo=qqZrjLhw9ESf#@`T=qOIs4Bq=ex6=u>Ypfx-Vrlw)e6ulE z`>W`BW>u?kYC~lPlz&2CM4(H0*<^CFgK;wI3=8pvu4?zQVbcH|e1sJxK6~wb6@37+ z;er!c!>st{P{9uK+9utt?10$JnnmD1ZJcd%!7gbLiKag&acNV|44(r zP3-%%S0ywwMu_OIB6_9-CcK<#LfmdBS$~NoT54LS0tf5dRWHLk_c+}2JYC+a0!J(j z=><`fr7xj}s$`0A$(@uRSY)bg{@xLO@cRdG}F>(nHFL$=hh z_54A2p}7y7pE6>VB!3gZHyl{x2?tpdu(QM2z zZ&FI;^4GSDVU;{n32pL?gho4(40`IO4yIyA8$ z&-DFusz5(vD{cAKCCg=a(8sVW5xo2Ey)ksj-S4tP{WyOmFGjbJU@pxO}=xQc*c)sy*!%D|UB!ymxGR&drqNCWSzs&jK2MruNp!MISCz=&vdw#XXE-4QP0Wl;nHqxA znaY|w8uJYlgGR8nFP*UBy_gz@uRznb=oFTf-HE~qo4T-6z zA2biVFJ5NtboogARZ6h^-En5BB}$jOUq$klTJq+X7=rM44-teboOyk>A~6VIN8c|L zd1tORyHM#^qb`Idnv*pJqX8D4E9b%05MMKaYr0JPA9P`&$5u_9X_umo1urHT3L1dr zF?tDqIy4gV)ft`(M?Wmy?OBF8W~g8D(t_7-wD#zPZvWp#w^%2VCj0FxLb<%O)3vl3 z>|$Vv2N`K9QT%-odlhJwM{KuLW+yrHhId9P=_%9Z&1YHE+ra|E^6FJ6x8>zHxb-42 zPa0%&Ly2PGi+~KJ&Pwzbv$*DnHOb?w@>?sflMX0PeIP7q6*s|h^A`#hCymNT45{20 zO|TrPkgXsd?^IdfXy+e>fLJCAcRI5LN$h0?n~6gyVw>0eHw`q?xiIi&DI)Ud0>s{9 z%C^>VmCb8OBJ#tE_EIQ=8!i+9-{~MjE#HCr+}(it_tfng1wNZzf@E-`U+Y{_EmO

_ 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 diff --git a/lib/config-store.js b/lib/config-store.js index c24bbf8..99df744 100644 --- a/lib/config-store.js +++ b/lib/config-store.js @@ -137,10 +137,7 @@ function batchRowCount(batch) { let n = 0; const files = (batch && batch.files) || []; for (const file of files) { - for (const result of (file.results || [])) { - if (result.status === 'aborted' || result.status === 'error') continue; - n++; - } + n += (file.results || []).length; } return n; } @@ -180,13 +177,19 @@ function applyHistoryRetention(history, retention, nowMs) { class ConfigStore { constructor(app) { - const dir = app && app.isPackaged + const useUserDataDir = app && ( + app.isPackaged || + (app.commandLine && typeof app.commandLine.hasSwitch === 'function' && app.commandLine.hasSwitch('user-data-dir')) + ); + const dir = useUserDataDir ? app.getPath('userData') : path.join(__dirname, '..'); this.filePath = path.join(dir, 'electron-config.json'); this.historyPath = path.join(dir, 'electron-history.json'); this._writeQueue = Promise.resolve(); // Serializes all writes to prevent race conditions this._historyWriteQueue = Promise.resolve(); + this._pendingWriteOperations = new Set(); + this._writesQuiesced = false; this._historyMigrated = false; this._cache = null; this._cacheKey = ''; @@ -238,9 +241,26 @@ class ConfigStore { }); } - _enqueueHistoryWrite(fn) { - this._historyWriteQueue = this._historyWriteQueue.then(fn, fn); - return this._historyWriteQueue; + _quiescedWriteError() { + const error = new Error('Die Anwendung wird gerade beendet'); + error.code = 'CONFIG_WRITES_QUIESCED'; + return error; + } + + setWritesQuiesced(quiesced) { + this._writesQuiesced = !!quiesced; + } + + _enqueueHistoryWrite(fn, options = {}) { + if (this._writesQuiesced && !options.allowDuringQuiesce) return Promise.reject(this._quiescedWriteError()); + const operation = this._historyWriteQueue.then(fn, fn); + this._pendingWriteOperations.add(operation); + this._historyWriteQueue = operation.then(() => undefined, () => undefined); + operation.then( + () => this._pendingWriteOperations.delete(operation), + () => this._pendingWriteOperations.delete(operation) + ); + return operation; } _migrateHistory() { @@ -476,11 +496,31 @@ class ConfigStore { return this._atomicWrite(data); } - _enqueueWrite(fn) { + _enqueueWrite(fn, options = {}) { + if (this._writesQuiesced && !options.allowDuringQuiesce) return Promise.reject(this._quiescedWriteError()); this._wqDepth++; - const done = () => { this._wqDepth--; }; - this._writeQueue = this._writeQueue.then(fn, fn).then(done, done); - return this._writeQueue; + const operation = this._writeQueue.then(fn, fn); + this._pendingWriteOperations.add(operation); + this._writeQueue = operation.then( + () => { this._wqDepth--; }, + () => { + this._wqDepth--; + } + ); + operation.then( + () => this._pendingWriteOperations.delete(operation), + () => this._pendingWriteOperations.delete(operation) + ); + return operation; + } + + async drainWrites() { + while (this._pendingWriteOperations.size > 0) { + const pending = Array.from(this._pendingWriteOperations); + const results = await Promise.allSettled(pending); + const failed = results.find(result => result.status === 'rejected'); + if (failed) throw failed.reason; + } } _anyHosters(cfg) { @@ -522,6 +562,56 @@ class ConfigStore { }); } + savePendingQueue(pendingQueue, options = {}) { + const snapshot = pendingQueue === null || pendingQueue === undefined ? null : this._clone(pendingQueue); + return this._enqueueWrite(() => { + const current = this.load(); + current.globalSettings = { + ...(current.globalSettings || {}), + pendingQueue: snapshot + }; + this._guardHosters(current, false); + return this._commit(current); + }, options); + } + + saveRendererGlobalSettings(globalSettings) { + const snapshot = this._clone(globalSettings || {}); + return this._enqueueWrite(() => { + const current = this.load(); + const currentGlobalSettings = current.globalSettings || {}; + const currentRemote = currentGlobalSettings.remote || {}; + const incomingRemote = snapshot.remote || {}; + current.globalSettings = { + ...snapshot, + pendingQueue: currentGlobalSettings.pendingQueue ?? null, + diagnostics: this._clone(currentGlobalSettings.diagnostics || {}), + historyRetention: currentGlobalSettings.historyRetention || 'all', + remote: { + ...incomingRemote, + token: incomingRemote.token || currentRemote.token || '' + } + }; + this._guardHosters(current, false); + return this._commit(current); + }); + } + + saveRemoteSettings(remoteSettings, createToken) { + const incoming = this._clone(remoteSettings || {}); + return this._enqueueWrite(async () => { + const current = this.load(); + const currentGlobalSettings = current.globalSettings || {}; + const currentRemote = currentGlobalSettings.remote || {}; + const token = incoming.token || currentRemote.token || (incoming.enabled && typeof createToken === 'function' ? createToken() : ''); + const canonical = { ...incoming, token }; + current.globalSettings = { ...currentGlobalSettings, remote: canonical }; + this._guardHosters(current, false); + await this._commit(current); + return this._clone(canonical); + }); + } + replaceSettings(config) { return this._enqueueWrite(() => { const current = this.load(); @@ -604,8 +694,12 @@ class ConfigStore { pruneHistory(retention, opts = {}) { const dryRun = !!opts.dryRun; if (this._historyMigrated) { - return this._enqueueHistoryWrite(() => { - const current = this._readHistoryFile() || []; + return this._enqueueHistoryWrite(async () => { + const storedHistory = this._readHistoryFile(); + if (storedHistory === null && fs.existsSync(this.historyPath)) { + throw new Error('Die Verlaufsdatei ist beschädigt und wurde nicht verändert'); + } + const current = storedHistory || []; const beforeBatches = current.length; const beforeRows = countHistoryRows(current); const pruned = applyHistoryRetention(current, retention, Date.now()); @@ -616,9 +710,25 @@ class ConfigStore { keptRows: countHistoryRows(pruned) }; if (dryRun) return result; - return this._writeHistoryFileAtomic(pruned) - .then(() => this.save({ globalSettings: { ...this.load().globalSettings, historyRetention: String(retention || 'all') } })) - .then(() => result); + return this._enqueueWrite(async () => { + const config = this.load(); + const previousGlobalSettings = this._clone(config.globalSettings || {}); + config.globalSettings = { ...previousGlobalSettings, historyRetention: String(retention || 'all') }; + this._guardHosters(config, false); + await this._commit(config); + try { + await this._writeHistoryFileAtomic(pruned); + } catch (historyError) { + config.globalSettings = previousGlobalSettings; + try { + await this._commit(config); + } catch (rollbackError) { + throw new AggregateError([historyError, rollbackError], 'Verlauf und Aufbewahrung konnten nicht konsistent gespeichert werden'); + } + throw historyError; + } + return result; + }); }); } return this._enqueueWrite(() => { diff --git a/lib/updater.js b/lib/updater.js index 722f5f6..62745c9 100644 --- a/lib/updater.js +++ b/lib/updater.js @@ -14,6 +14,7 @@ let cachedCheckTs = 0; const CACHE_TTL = 10 * 60 * 1000; // 10 min let activeAbort = null; +const launchedInstallerPaths = new Set(); function getCurrentVersion() { return app.getVersion(); @@ -131,10 +132,10 @@ async function checkForUpdate() { return cachedCheck; } -async function parseLatestYml(url) { +async function parseLatestYml(url, fetchImpl = fetch) { if (!url) return null; try { - const res = await fetch(url, { redirect: 'follow' }); + const res = await fetchImpl(url, { redirect: 'follow' }); const text = await res.text(); // Extract sha512 from latest.yml const match = text.match(/sha512:\s*([A-Za-z0-9+/=]+)/); @@ -150,17 +151,18 @@ function verifyExeHeader(buf) { return buf[0] === 0x4D && buf[1] === 0x5A; // 'MZ' } -async function installUpdate(onProgress) { +async function prepareUpdate(onProgress, options = {}) { if (activeAbort) activeAbort.abort(); activeAbort = new AbortController(); const signal = activeAbort.signal; + const fetchImpl = options.fetchImpl || fetch; try { // Stage: starting if (onProgress) onProgress({ stage: 'starting', percent: 0 }); // Check or use cached - let check = cachedCheck; + let check = options.checkResult || cachedCheck; if (!check || !check.available) { check = await checkForUpdate(); } @@ -172,10 +174,10 @@ async function installUpdate(onProgress) { } // Stage: downloading - const tmpDir = app.getPath('temp'); + const tmpDir = options.tempDir || app.getPath('temp'); const installerPath = path.join(tmpDir, check.assetName); - const res = await fetch(check.assetUrl, { + const res = await fetchImpl(check.assetUrl, { method: 'GET', signal, redirect: 'follow' @@ -233,7 +235,7 @@ async function installUpdate(onProgress) { } // Optional SHA-512 verification from latest.yml - const expectedSha = await parseLatestYml(check.latestYmlUrl); + const expectedSha = await parseLatestYml(check.latestYmlUrl, fetchImpl); if (expectedSha) { const actualSha = crypto.createHash('sha512').update(fileBuffer).digest('base64'); if (actualSha !== expectedSha) { @@ -248,32 +250,14 @@ async function installUpdate(onProgress) { // Write to disk fs.writeFileSync(installerPath, fileBuffer); - // Stage: launching - if (onProgress) onProgress({ stage: 'launching', percent: 100 }); - - const { spawn } = require('child_process'); - spawn(installerPath, ['/S', '--updated', '--force-run'], { - detached: true, - stdio: 'ignore' - }).unref(); - - // Stage: done - if (onProgress) onProgress({ stage: 'done', percent: 100 }); - - const _doQuit = () => setTimeout(() => app.quit(), 900); - const _getActive = () => { - try { return globalThis._mhuUploadManagerRef && globalThis._mhuUploadManagerRef.getActiveJobCount ? globalThis._mhuUploadManagerRef.getActiveJobCount() : 0; } - catch { return 0; } + const prepared = { + installerPath, + assetName: check.assetName, + remoteVersion: check.remoteVersion || '', + transportTag: check.transportTag || '' }; - if (_getActive() > 0) { - const POLL_MS = 3000; - const poller = setInterval(() => { - if (_getActive() === 0) { clearInterval(poller); _doQuit(); } - }, POLL_MS); - setTimeout(() => { try { clearInterval(poller); } catch {} _doQuit(); }, 30 * 60 * 1000); - } else { - _doQuit(); - } + if (onProgress) onProgress({ stage: 'prepared', percent: 100 }); + return prepared; } catch (err) { if (onProgress) onProgress({ stage: 'error', error: err.message }); @@ -283,6 +267,25 @@ async function installUpdate(onProgress) { } } +function launchPreparedUpdate(prepared, options = {}) { + const installerPath = prepared && typeof prepared.installerPath === 'string' ? prepared.installerPath : ''; + if (!installerPath) throw new Error('Vorbereitetes Update ist unvollständig'); + const key = path.resolve(installerPath).toLowerCase(); + if (launchedInstallerPaths.has(key)) return false; + const spawnImpl = options.spawnImpl || require('child_process').spawn; + launchedInstallerPaths.add(key); + try { + spawnImpl(installerPath, ['/S', '--updated', '--force-run'], { + detached: true, + stdio: 'ignore' + }).unref(); + return true; + } catch (error) { + launchedInstallerPaths.delete(key); + throw error; + } +} + function abortUpdate() { if (activeAbort) { activeAbort.abort(); @@ -290,4 +293,4 @@ function abortUpdate() { } } -module.exports = { checkForUpdate, installUpdate, abortUpdate, isNewer, resolveReleaseVersion }; +module.exports = { checkForUpdate, prepareUpdate, launchPreparedUpdate, abortUpdate, isNewer, resolveReleaseVersion }; diff --git a/main.js b/main.js index 227bddd..c2c63ba 100644 --- a/main.js +++ b/main.js @@ -15,7 +15,7 @@ const DoodstreamUploader = require('./lib/doodstream-upload'); const { selectUploadAuth } = require('./lib/account-auth'); const { createAccountPicker } = require('./lib/account-rotation'); const ClouddropUploader = require('./lib/clouddrop-upload'); -const { checkForUpdate, installUpdate, abortUpdate } = require('./lib/updater'); +const { checkForUpdate, prepareUpdate, launchPreparedUpdate, abortUpdate } = require('./lib/updater'); const backupCrypto = require('./lib/backup-crypto'); const { createOnlineBackup, downloadOnlineBackup, uploadOnlineBackup } = require('./lib/online-backup'); const { createPortableSettingsSnapshot, prepareImportedSettings } = require('./lib/settings-backup'); @@ -93,16 +93,146 @@ if (_perfOn) { } let mainWindow; +let closeFlushApproved = false; +let closeFlushRequested = false; +let closeHandshakeReady = false; +let closeFlushTimer = null; +let restartAfterClosePreparation = false; +let quitTeardownStarted = false; +let closePreparationAttempt = 0; +let closeQuiesceOwnerAttempt = null; +let lastRestoredCloseAttempt = null; +let closeFolderMonitorWasRunning = false; +let preparedUpdate = null; +let updatePreparationPromise = null; +let updateQuitPending = false; +let preparedUpdateLaunchStarted = false; let _lastImportPath = null; let dropTargetWindow = null; let tray = null; const configStore = new ConfigStore(app); configStore.setPerfLog((m) => { try { logInfo(m); } catch {} }); let uploadManager = null; +const activeUploadProducerTrackers = new Set(); const settingsImportGate = createSettingsImportGate(() => !!(uploadManager && uploadManager.running)); let diagnosticAgent = null; let _diagHandler = null; +function assertConfigWriteAllowed() { + if (!settingsImportGate.canStartUpload()) throw new Error('Einstellungen werden gerade importiert'); +} + +async function waitForConfigStoreWrites() { + await configStore.drainWrites(); +} + +function clearCloseFlushTimer() { + if (closeFlushTimer) clearTimeout(closeFlushTimer); + closeFlushTimer = null; +} + +function waitForCloseOperation(promise, timeoutMs) { + return Promise.race([ + Promise.resolve(promise), + new Promise((_, reject) => setTimeout(() => reject(new Error('Speichern vor dem Beenden hat zu lange gedauert')), timeoutMs)) + ]); +} + +function trackUploadProducer(manager) { + let settled = false; + let resolveProducer; + const promise = new Promise(resolve => { resolveProducer = resolve; }); + const tracker = { + manager, + promise, + finish() { + if (settled) return; + settled = true; + activeUploadProducerTrackers.delete(tracker); + resolveProducer(); + } + }; + activeUploadProducerTrackers.add(tracker); + return tracker; +} + +function isClosePreparationActive(attempt) { + return closeFlushRequested && !closeFlushApproved && attempt === closePreparationAttempt; +} + +function acquireCloseQuiesce(attempt) { + if (!isClosePreparationActive(attempt)) return false; + if (closeQuiesceOwnerAttempt !== null && closeQuiesceOwnerAttempt !== attempt) return false; + closeQuiesceOwnerAttempt = attempt; + configStore.setWritesQuiesced(true); + return true; +} + +function releaseCloseQuiesce(attempt) { + if (closeQuiesceOwnerAttempt !== attempt) return false; + closeQuiesceOwnerAttempt = null; + configStore.setWritesQuiesced(false); + return true; +} + +function rejectPendingUpdate(error) { + if (!preparedUpdate && !updateQuitPending) return false; + preparedUpdate = null; + updateQuitPending = false; + preparedUpdateLaunchStarted = false; + safeSend('app:update-progress', { + stage: 'error', + error: error && error.message ? error.message : String(error || 'Einstellungen konnten vor dem Update nicht gespeichert werden') + }); + return true; +} + +function restoreClosePreparation(attempt, clearRestart = true) { + if (!isClosePreparationActive(attempt)) return lastRestoredCloseAttempt === attempt; + closeFlushApproved = false; + closeFlushRequested = false; + clearCloseFlushTimer(); + releaseCloseQuiesce(attempt); + lastRestoredCloseAttempt = attempt; + if (clearRestart) restartAfterClosePreparation = false; + if (closeFolderMonitorWasRunning) { + closeFolderMonitorWasRunning = false; + const settings = configStore.load().globalSettings?.folderMonitor; + if (settings?.enabled && settings.folderPath) startFolderMonitor(settings); + } + rejectPendingUpdate(new Error('Das Update wurde nicht gestartet, weil die Einstellungen vor dem Beenden nicht gespeichert werden konnten')); + return true; +} + +function armCloseFlushTimer(attempt, timeoutMs) { + clearCloseFlushTimer(); + closeFlushTimer = setTimeout(() => { + closeFlushTimer = null; + restoreClosePreparation(attempt); + }, timeoutMs); +} + +function requestClosePreparation() { + if (!mainWindow || mainWindow.isDestroyed() || mainWindow.webContents.isDestroyed() || !closeHandshakeReady) return false; + if (closeFlushRequested) return true; + const attempt = ++closePreparationAttempt; + closeFlushRequested = true; + closeFolderMonitorWasRunning = !!folderMonitor.running; + try { folderMonitor.stop(); } catch {} + try { if (uploadManager) uploadManager.cancel(); } catch {} + (async () => { + try { + await waitForCloseOperation(Promise.all(Array.from(activeUploadProducerTrackers, tracker => tracker.promise)), 2500); + if (attempt !== closePreparationAttempt || !closeFlushRequested) return; + safeSend('app:prepare-close', attempt); + armCloseFlushTimer(attempt, 1500); + } catch { + restoreClosePreparation(attempt); + } + })(); + return true; +} + const _hasSingleInstanceLock = app.requestSingleInstanceLock(); if (!_hasSingleInstanceLock) { app.quit(); @@ -708,6 +838,7 @@ function _flushUploadLog() { function _persistFallbackLogPath(workingPath) { try { + if (!settingsImportGate.canStartUpload()) return; const cfg = configStore.load(); const gs = cfg.globalSettings || {}; const mode = gs.logMode || 'single'; @@ -913,7 +1044,7 @@ function makeAccountPicker(config) { function persistRotation(pick) { if (!pick.dirty()) return; _rotationCursors = { ...rotationCursors(), ...pick.indices() }; - configStore.saveRotationCursors(_rotationCursors); + configStore.saveRotationCursors(_rotationCursors).catch(error => debugLog(`rotation cursor save failed: ${error.message}`)); } function buildUploadTasks(config, files, hosters, pick) { @@ -1231,7 +1362,7 @@ function createWindow() { height: 750, minWidth: 800, minHeight: 550, - backgroundColor: '#16181c', + backgroundColor: '#0f0f0f', autoHideMenuBar: true, webPreferences: { contextIsolation: true, @@ -1240,9 +1371,28 @@ function createWindow() { } }); mainWindow = startupWindow.window; + closePreparationAttempt++; + closeFlushApproved = false; + closeFlushRequested = false; + closeHandshakeReady = false; + closeQuiesceOwnerAttempt = null; + lastRestoredCloseAttempt = null; + configStore.setWritesQuiesced(false); + clearCloseFlushTimer(); + + mainWindow.on('close', (event) => { + if (closeFlushApproved || !closeHandshakeReady || mainWindow.webContents.isDestroyed()) return; + event.preventDefault(); + requestClosePreparation(); + }); mainWindow.webContents.setBackgroundThrottling(false); + mainWindow.webContents.on('did-start-loading', () => { + closeHandshakeReady = false; + restoreClosePreparation(closePreparationAttempt); + }); + mainWindow.webContents.on('render-process-gone', (_event, details) => { _writeCrashLog('RENDER PROCESS GONE', new Error(details.reason || 'unknown'), details); debugLog(`RENDER PROCESS GONE: reason=${details.reason} exitCode=${details.exitCode}`); @@ -1422,7 +1572,27 @@ app.on('window-all-closed', () => { app.quit(); }); -app.on('before-quit', () => { +app.on('before-quit', (event) => { + if (!closeFlushApproved && mainWindow && !mainWindow.isDestroyed() && closeHandshakeReady) { + event.preventDefault(); + requestClosePreparation(); + } +}); + +app.on('will-quit', () => { + if (quitTeardownStarted) return; + quitTeardownStarted = true; + if (preparedUpdate && updateQuitPending && closeFlushApproved && !preparedUpdateLaunchStarted) { + preparedUpdateLaunchStarted = true; + try { + launchPreparedUpdate(preparedUpdate); + } catch (error) { + logError('prepared update launch failed', error); + } + } + preparedUpdate = null; + updateQuitPending = false; + if (restartAfterClosePreparation) app.relaunch(); if (uploadManager) try { uploadManager.cancel(); } catch {} try { folderMonitor.stop(); } catch {} try { @@ -1467,6 +1637,7 @@ ipcMain.handle('get-config', () => { }); ipcMain.handle('save-config', async (_event, config) => { + assertConfigWriteAllowed(); await configStore.save(config); if (config && config.globalSettings) _invalidateLogSettings(); try { @@ -1519,6 +1690,7 @@ ipcMain.handle('get-history', () => { ipcMain.handle('prune-history', async (_event, payload) => { const retention = payload && payload.retention; const dryRun = !!(payload && payload.dryRun); + if (!dryRun) assertConfigWriteAllowed(); return configStore.pruneHistory(retention, { dryRun }); }); @@ -1725,6 +1897,7 @@ ipcMain.handle('get-file-sizes', async (_event, paths) => { }); ipcMain.handle('start-upload', (_event, payload) => { + if (closeFlushRequested) return { error: 'Die Anwendung wird gerade beendet' }; if (!settingsImportGate.canStartUpload()) return { error: 'Einstellungen werden gerade importiert' }; const config = configStore.load(); const files = payload && Array.isArray(payload.files) ? payload.files : []; @@ -1784,6 +1957,8 @@ ipcMain.handle('start-upload', (_event, payload) => { // Pass hoster settings to the upload manager uploadManager = new UploadManager(config.hosterSettings || {}, config.globalSettings || {}, buildAccountPools(config)); globalThis._mhuUploadManagerRef = uploadManager; + const _thisManager = uploadManager; + const _producerTracker = trackUploadProducer(_thisManager); const _progressByJob = new Map(); const _progressTerminalQueue = []; @@ -1907,7 +2082,6 @@ ipcMain.handle('start-upload', (_event, payload) => { // fires start-upload while we're still awaiting appendHistory would // create a fresh manager which the trailing `uploadManager = null` then // orphans (cancel/addJobs see null, the new batch keeps running invisibly). - const _thisManager = uploadManager; uploadManager.on('batch-done', async (summary) => { debugLog(`batch-done: total=${summary.total} ok=${summary.succeeded} fail=${summary.failed}`); logMarker('BATCH END', { total: summary.total, ok: summary.succeeded, fail: summary.failed }); @@ -1918,7 +2092,16 @@ ipcMain.handle('start-upload', (_event, payload) => { try { await configStore.appendHistory(summary); } catch (err) { debugLog(`appendHistory failed: ${err.message}`); } + if (_progressFlushTimer) { + clearTimeout(_progressFlushTimer); + _progressFlushTimer = null; + } + const finalProgressBatch = _progressTerminalQueue.splice(0); + for (const value of _progressByJob.values()) finalProgressBatch.push(value); + _progressByJob.clear(); + if (finalProgressBatch.length) safeSend('upload-progress-batch', finalProgressBatch); safeSend('upload-batch-done', summary); + _producerTracker.finish(); const fullyAborted = isAllAborted(summary); if (isAutoRetry) { @@ -1939,9 +2122,19 @@ ipcMain.handle('start-upload', (_event, payload) => { // This ensures webContents.send() calls from upload events // are not interleaved with the handle() response. process.nextTick(() => { - if (!uploadManager) { debugLog('nextTick: uploadManager was nulled before startBatch'); return; } + if (uploadManager !== _thisManager) { + debugLog('nextTick: uploadManager was replaced before startBatch'); + _producerTracker.finish(); + return; + } + if (closeFlushRequested) { + try { _thisManager.cancel(); } catch {} + if (uploadManager === _thisManager) { uploadManager = null; globalThis._mhuUploadManagerRef = null; } + _producerTracker.finish(); + return; + } debugLog(`nextTick: calling startBatch now (priming ${_sessionFailedAccounts.size} failed accounts, ${_sessionAccountOverrides.size} overrides from session)`); - uploadManager.startBatch(tasks, { + _thisManager.startBatch(tasks, { primeFailedAccounts: Array.from(_sessionFailedAccounts.keys()), primeOverrides: Array.from(_sessionAccountOverrides.entries()) }).catch((err) => { @@ -1956,6 +2149,7 @@ ipcMain.handle('start-upload', (_event, payload) => { error: err ? err.message : 'Unbekannter Fehler' }; safeSend('upload-batch-done', errorSummary); + _producerTracker.finish(); if (!isAutoRetry) sendBatchWebhook(errorSummary, 0); if (uploadManager === _thisManager) { uploadManager = null; globalThis._mhuUploadManagerRef = null; } }); @@ -1992,6 +2186,7 @@ ipcMain.handle('cancel-selected-jobs', (_event, jobIds) => { }); ipcMain.handle('add-jobs-to-batch', (_event, payload) => { + if (closeFlushRequested) return { error: 'Die Anwendung wird gerade beendet' }; if (!uploadManager || !uploadManager.running) { return { error: 'Kein Upload aktiv' }; } @@ -2208,6 +2403,7 @@ ipcMain.handle('open-log-folder', async () => { }); ipcMain.handle('clear-history', async () => { + assertConfigWriteAllowed(); await configStore.clearHistory(); return true; }); @@ -2266,6 +2462,7 @@ async function syncImportedRuntime(config) { async function applyImportedSettings(imported) { settingsImportGate.begin(); try { + await waitForConfigStoreWrites(); const prepared = prepareImportedSettings(imported); const ts = new Date().toISOString().replace(/[:.]/g, '-'); const preImportPath = configStore.filePath.replace('.json', `.pre-import-${ts}.json`); @@ -2302,6 +2499,7 @@ ipcMain.handle('export-backup', async () => { ] }); if (canceled || !filePath) return { ok: false, canceled: true }; + await waitForConfigStoreWrites(); const config = createPortableSettingsSnapshot(configStore.load()); if (filePath.toLowerCase().endsWith('.json')) { fs.writeFileSync(filePath, JSON.stringify(config, null, 2), 'utf-8'); @@ -2363,6 +2561,7 @@ ipcMain.handle('import-backup', async (_event, legacyPassword) => { ipcMain.handle('online-backup:create', async () => { try { + await waitForConfigStoreWrites(); const snapshot = createPortableSettingsSnapshot(configStore.load()); const created = createOnlineBackup(snapshot, app.getVersion()); await uploadOnlineBackup(created.record); @@ -2455,18 +2654,37 @@ ipcMain.handle('app:check-updates', async () => { } }); -ipcMain.handle('app:install-update', () => { - try { if (uploadManager) uploadManager.cancel(); } catch {} - installUpdate((progress) => { - safeSend('app:update-progress', progress); - }).catch((err) => { - safeSend('app:update-progress', { stage: 'error', error: err.message }); - }); - return { started: true }; +ipcMain.handle('app:install-update', async () => { + if (updatePreparationPromise || preparedUpdate || updateQuitPending) { + return { started: false, error: 'Ein Update wird bereits vorbereitet' }; + } + updatePreparationPromise = (async () => { + const prepared = await prepareUpdate((progress) => { + safeSend('app:update-progress', progress); + }); + if (!mainWindow || mainWindow.isDestroyed() || mainWindow.webContents.isDestroyed() || !closeHandshakeReady) { + throw new Error('Die Anwendung ist noch nicht bereit, das Update sicher zu installieren'); + } + preparedUpdate = prepared; + updateQuitPending = true; + preparedUpdateLaunchStarted = false; + setImmediate(() => app.quit()); + return { started: true }; + })(); + try { + return await updatePreparationPromise; + } catch (error) { + rejectPendingUpdate(error); + safeSend('app:update-progress', { stage: 'error', error: error.message }); + return { started: false, error: error.message }; + } finally { + updatePreparationPromise = null; + } }); ipcMain.handle('app:abort-update', () => { abortUpdate(); + rejectPendingUpdate(new Error('Update abgebrochen')); return true; }); @@ -2475,7 +2693,7 @@ ipcMain.handle('app:get-version', () => { }); ipcMain.handle('app:restart', () => { - app.relaunch(); + restartAfterClosePreparation = true; app.quit(); }); @@ -2483,6 +2701,53 @@ ipcMain.handle('app:quit', () => { app.quit(); }); +ipcMain.on('app:close-handshake-ready', (event) => { + if (mainWindow && !mainWindow.isDestroyed() && event.sender === mainWindow.webContents) closeHandshakeReady = true; +}); + +ipcMain.on('app:close-preparation-started', (event, attempt) => { + if (mainWindow && !mainWindow.isDestroyed() && event.sender === mainWindow.webContents && isClosePreparationActive(attempt)) { + armCloseFlushTimer(attempt, 3000); + } +}); + +ipcMain.handle('app:finish-close', async (event, payload = true) => { + if (!mainWindow || mainWindow.isDestroyed() || event.sender !== mainWindow.webContents) return false; + const attempt = payload && typeof payload === 'object' && Number.isInteger(payload.attempt) ? payload.attempt : null; + if (attempt === null) return false; + const ready = payload && typeof payload === 'object' ? payload.ready !== false : payload !== false; + if (!ready) { + if (isClosePreparationActive(attempt)) { + clearCloseFlushTimer(); + return restoreClosePreparation(attempt); + } + return lastRestoredCloseAttempt === attempt; + } + if (!isClosePreparationActive(attempt)) return false; + clearCloseFlushTimer(); + let approved = false; + try { + if (!acquireCloseQuiesce(attempt)) return false; + await waitForCloseOperation(waitForConfigStoreWrites(), 1000); + if (!isClosePreparationActive(attempt)) return false; + if (payload && typeof payload === 'object' && Object.prototype.hasOwnProperty.call(payload, 'pendingQueue')) { + await waitForCloseOperation(configStore.savePendingQueue(payload.pendingQueue, { allowDuringQuiesce: true }), 1000); + } + if (!isClosePreparationActive(attempt)) return false; + closeFlushApproved = true; + approved = true; + setImmediate(() => { + app.quit(); + }); + return true; + } catch { + restoreClosePreparation(attempt); + return false; + } finally { + if (!approved) releaseCloseQuiesce(attempt); + } +}); + // --- Hoster settings --- ipcMain.handle('get-hoster-settings', () => { const config = configStore.load(); @@ -2490,8 +2755,11 @@ ipcMain.handle('get-hoster-settings', () => { }); ipcMain.handle('save-hoster-settings', async (_event, hosterSettings) => { + assertConfigWriteAllowed(); await configStore.save({ hosterSettings }); - if (uploadManager) uploadManager.updateSettings(hosterSettings, null); + if (uploadManager) { + try { uploadManager.updateSettings(hosterSettings, null); } catch (error) { debugLog(`hoster settings runtime update failed: ${error.message}`); } + } return true; }); @@ -2501,22 +2769,19 @@ ipcMain.handle('get-global-settings', () => { return config.globalSettings || {}; }); -function _preserveDiagSubtree(globalSettings) { - if (!globalSettings || typeof globalSettings !== 'object') return globalSettings; - try { - const cur = configStore.load(); - if (cur.globalSettings && cur.globalSettings.diagnostics) { - globalSettings.diagnostics = cur.globalSettings.diagnostics; - } - } catch {} - return globalSettings; -} +ipcMain.handle('save-pending-queue', async (_event, pendingQueue) => { + await configStore.savePendingQueue(pendingQueue); + return true; +}); ipcMain.handle('save-global-settings', async (_event, globalSettings) => { - globalSettings = _preserveDiagSubtree(globalSettings); - await configStore.save({ globalSettings }); + assertConfigWriteAllowed(); + await configStore.saveRendererGlobalSettings(globalSettings); + globalSettings = configStore.load().globalSettings; _invalidateLogSettings(); - if (uploadManager) uploadManager.updateSettings(null, globalSettings); + if (uploadManager) { + try { uploadManager.updateSettings(null, globalSettings); } catch (error) { debugLog(`global settings runtime update failed: ${error.message}`); } + } return true; }); @@ -2546,62 +2811,6 @@ function _sweepOrphanConfigTmps() { } catch {} } -// Synchronous save for beforeunload — blocks renderer until write completes -// Uses atomic write pattern (tmp + backup + rename) to prevent corruption. -// Returns false on any failure so the renderer (which surfaces this via the -// beforeunload chain) doesn't quietly think queue + settings persisted when -// they didn't. Errors are logged for diagnostics regardless. -ipcMain.on('save-global-settings-sync', (event, globalSettings) => { - const tmpPath = configStore.filePath + '.' + process.pid + '.tmp'; - try { - const current = configStore.load(); - const _diskDiag = current.globalSettings && current.globalSettings.diagnostics; - current.globalSettings = globalSettings; - if (_diskDiag) current.globalSettings.diagnostics = _diskDiag; - try { configStore._guardHosters(current, false); } catch {} - _invalidateLogSettings(); - const data = configStore._serializeForDisk(current); - const backupPath = configStore.filePath + '.bak'; - const _fd = fs.openSync(tmpPath, 'w'); - try { fs.writeSync(_fd, data); fs.fsyncSync(_fd); } finally { fs.closeSync(_fd); } - if (fs.existsSync(configStore.filePath)) { - // Use try/catch around the read so an AV/lock race doesn't fail the - // whole save just because we couldn't refresh the .bak — the write to - // the live file via rename is what matters. - try { - const existing = fs.readFileSync(configStore.filePath, 'utf-8'); - if (existing && existing.trim().length > 2) { - fs.writeFileSync(backupPath, existing, 'utf-8'); - } - } catch (bakErr) { - debugLog(`save-global-settings-sync: backup read/write skipped: ${bakErr.message}`); - } - } - let renamed = false; - let lastErr = null; - for (let attempt = 0; attempt < 5 && !renamed; attempt++) { - try { - fs.renameSync(tmpPath, configStore.filePath); - renamed = true; - } catch (renameErr) { - lastErr = renameErr; - const code = renameErr && renameErr.code; - if (code === 'EBUSY' || code === 'EPERM' || code === 'EACCES') { - _sleepSyncMs(40); - } else { - throw renameErr; - } - } - } - if (!renamed) throw lastErr || new Error('renameSync failed'); - event.returnValue = true; - } catch (err) { - try { if (fs.existsSync(tmpPath)) fs.unlinkSync(tmpPath); } catch {} - debugLog(`save-global-settings-sync FAILED: ${err && err.message ? err.message : err}`); - event.returnValue = false; - } -}); - // --- Folder Monitor --- function startFolderMonitor(settings) { try { @@ -2809,6 +3018,7 @@ ipcMain.handle('diagnostics:get-settings', () => { }); ipcMain.handle('diagnostics:save-settings', async (_e, incoming) => { + assertConfigWriteAllowed(); const cfg = configStore.load(); const cur = (cfg.globalSettings && cfg.globalSettings.diagnostics) || {}; const next = { @@ -2830,6 +3040,7 @@ ipcMain.handle('diagnostics:save-settings', async (_e, incoming) => { }); ipcMain.handle('diagnostics:regenerate', async () => { + assertConfigWriteAllowed(); const cfg = configStore.load(); const cur = (cfg.globalSettings && cfg.globalSettings.diagnostics) || {}; const next = { ...cur, token: generateToken(), codeIssuedAt: Date.now() }; @@ -2908,32 +3119,38 @@ async function startRemoteServer() { let token = remote.token; if (!token) { - token = generateToken(); - const gs = { ...config.globalSettings, remote: { ...remote, token } }; - await configStore.save({ globalSettings: gs }); + const canonical = await configStore.saveRemoteSettings(remote, generateToken); + token = canonical.token; } remoteServer = new RemoteServer(); - await remoteServer.start({ - port: remote.port || 9100, - token, - allowInput: remote.allowInput !== false, - mainWindow, - onSignalingToCapture: (data) => { - if (!captureWindow || captureWindow.isDestroyed()) { - debugLog('remote: signaling dropped, no capture window'); - return; - } - if (captureWindowReady) { - captureWindow.webContents.send('remote:signaling-to-capture', data); - } else { - debugLog('remote: capture window not ready, queuing', data.type, 'message'); - signalingQueue.push(data); - } - }, - onCreateCaptureWindow: () => createCaptureWindow(), - onDestroyCaptureWindow: () => destroyCaptureWindow() - }); + try { + await remoteServer.start({ + port: remote.port || 9100, + token, + allowInput: remote.allowInput !== false, + mainWindow, + onSignalingToCapture: (data) => { + if (!captureWindow || captureWindow.isDestroyed()) { + debugLog('remote: signaling dropped, no capture window'); + return; + } + if (captureWindowReady) { + captureWindow.webContents.send('remote:signaling-to-capture', data); + } else { + debugLog('remote: capture window not ready, queuing', data.type, 'message'); + signalingQueue.push(data); + } + }, + onCreateCaptureWindow: () => createCaptureWindow(), + onDestroyCaptureWindow: () => destroyCaptureWindow() + }); + } catch (error) { + try { remoteServer.stop(); } catch {} + remoteServer = null; + destroyCaptureWindow(); + throw error; + } debugLog(`remote-server started on port ${remoteServer.getPort()}`); } @@ -3066,19 +3283,27 @@ ipcMain.handle('remote:get-settings', () => { }); ipcMain.handle('remote:save-settings', async (_event, remoteSettings) => { - const config = configStore.load(); - const gs = { ...config.globalSettings, remote: remoteSettings }; - await configStore.save({ globalSettings: gs }); + assertConfigWriteAllowed(); + const canonicalSettings = await configStore.saveRemoteSettings(remoteSettings, generateToken); - if (remoteSettings.enabled) { - await startRemoteServer(); - } else if (remoteServer) { - remoteServer.stop(); - remoteServer = null; - destroyCaptureWindow(); - debugLog('remote-server stopped'); + let runtimeError = ''; + try { + if (canonicalSettings.enabled) { + await startRemoteServer(); + } else if (remoteServer) { + remoteServer.stop(); + remoteServer = null; + destroyCaptureWindow(); + debugLog('remote-server stopped'); + } + } catch (error) { + runtimeError = error && error.message ? error.message : String(error); } - return true; + return { + saved: true, + runtimeError, + settings: canonicalSettings + }; }); ipcMain.handle('remote:generate-token', () => { @@ -3095,6 +3320,7 @@ ipcMain.handle('remote:status', () => { // --- Always on top --- ipcMain.handle('set-always-on-top', async (_event, value) => { + assertConfigWriteAllowed(); if (mainWindow && !mainWindow.isDestroyed()) { mainWindow.setAlwaysOnTop(!!value); } diff --git a/package-lock.json b/package-lock.json index 5f88ad2..e77fd5a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "multi-hoster-uploader", - "version": "2.0.5", + "version": "2.0.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "multi-hoster-uploader", - "version": "2.0.5", + "version": "2.0.6", "dependencies": { "chokidar": "^3.6.0", "undici": "^7.29.0", diff --git a/package.json b/package.json index 7565aa1..36ca3d8 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,15 @@ { "name": "multi-hoster-uploader", - "version": "2.0.5", + "version": "2.0.6", "description": "Upload files to doodstream, voe, vidmoly, byse simultaneously", "main": "main.js", "scripts": { "start": "electron .", "test": "node --test tests/*.test.js tests/ui-smoke.js", "test:backup-api": "npm --prefix services/backup-api test", + "lint": "eslint .", "dist": "electron-builder --win", - "release:win": "electron-builder --publish never --win nsis portable", - "release:gitea": "node scripts/release_gitea.mjs" + "release:win": "electron-builder --publish never --win nsis portable" }, "dependencies": { "chokidar": "^3.6.0", diff --git a/preload.js b/preload.js index 2557a48..39c2349 100644 --- a/preload.js +++ b/preload.js @@ -17,7 +17,15 @@ contextBridge.exposeInMainWorld('api', { // Global settings getGlobalSettings: () => ipcRenderer.invoke('get-global-settings'), saveGlobalSettings: (settings) => ipcRenderer.invoke('save-global-settings', settings), - saveGlobalSettingsSync: (settings) => ipcRenderer.sendSync('save-global-settings-sync', settings), + savePendingQueue: (pendingQueue) => ipcRenderer.invoke('save-pending-queue', pendingQueue), + finishClosePreparation: (payload = true) => ipcRenderer.invoke('app:finish-close', payload), + onPrepareClose: (callback) => { + ipcRenderer.on('app:prepare-close', (_event, attempt) => { + ipcRenderer.send('app:close-preparation-started', attempt); + callback(attempt); + }); + }, + signalCloseHandshakeReady: () => ipcRenderer.send('app:close-handshake-ready'), // Always on top setAlwaysOnTop: (value) => ipcRenderer.invoke('set-always-on-top', value), @@ -155,6 +163,7 @@ contextBridge.exposeInMainWorld('api', { ipcRenderer.removeAllListeners('upload-stats'); ipcRenderer.removeAllListeners('app:update-available'); ipcRenderer.removeAllListeners('app:update-progress'); + ipcRenderer.removeAllListeners('app:prepare-close'); ipcRenderer.removeAllListeners('shutdown-countdown'); ipcRenderer.removeAllListeners('folder-monitor:new-files'); ipcRenderer.removeAllListeners('drop-target:files'); diff --git a/renderer/app.js b/renderer/app.js index 75cf869..5b63296 100644 --- a/renderer/app.js +++ b/renderer/app.js @@ -102,6 +102,161 @@ const queuePersistThrottle = (window.ThrottleTimer && window.ThrottleTimer.makeT isPending() { return h !== null; } }; })(); +let configWriteQueue = Promise.resolve(); +const failedConfigWriteOperations = []; +let configFlushPromise = null; +let configWriteEpoch = 0; +let configImportInProgress = false; +let closePreparationState = 'open'; +let closeWriteAccessDepth = 0; + +function createSupersededConfigWriteError() { + const error = new Error('Einstellungen wurden durch einen Import ersetzt'); + error.code = 'CONFIG_WRITE_SUPERSEDED'; + return error; +} + +function createClosedConfigWriteError() { + const error = new Error('Die Anwendung wird gerade beendet'); + error.code = 'CONFIG_WRITE_CLOSED'; + return error; +} + +function beginConfigImport() { + if (configImportInProgress) throw new Error('Ein Einstellungsimport läuft bereits'); + configImportInProgress = true; + configWriteEpoch++; +} + +function endConfigImport() { + configImportInProgress = false; +} + +function isConfigWriteImportGateError(error) { + return String(error && error.message ? error.message : error).includes('Einstellungen werden gerade importiert'); +} + +function retainFailedConfigWrite(operation, epoch, preserveAcrossImport) { + if (!failedConfigWriteOperations.some(entry => entry.operation === operation)) { + failedConfigWriteOperations.push({ operation, epoch, preserveAcrossImport }); + } +} + +async function retryFailedConfigWrites() { + while (failedConfigWriteOperations.length > 0) { + const entry = failedConfigWriteOperations[0]; + if (entry.epoch !== configWriteEpoch && !entry.preserveAcrossImport) { + failedConfigWriteOperations.shift(); + continue; + } + try { + await entry.operation(); + failedConfigWriteOperations.shift(); + } catch (error) { + if (isConfigWriteImportGateError(error)) { + failedConfigWriteOperations.shift(); + continue; + } + throw error; + } + } +} + +function enqueueConfigWriteOperation(operation) { + const promise = configWriteQueue.then(operation, operation); + const tail = promise.then(() => undefined, () => undefined); + configWriteQueue = tail; + return { promise, tail }; +} + +function runConfigWrite(operation, options = {}) { + const epoch = configWriteEpoch; + const preserveAcrossImport = options.preserveAcrossImport === true; + const allowedDuringClose = options.allowDuringClose === true || closeWriteAccessDepth > 0; + const blockedByImport = configImportInProgress && !preserveAcrossImport; + const blockedByClose = closePreparationState !== 'open' && !allowedDuringClose; + return enqueueConfigWriteOperation(async () => { + if (blockedByClose || (closePreparationState === 'sealed' && !allowedDuringClose)) throw createClosedConfigWriteError(); + if (!preserveAcrossImport && (blockedByImport || configImportInProgress || epoch !== configWriteEpoch)) throw createSupersededConfigWriteError(); + try { + await retryFailedConfigWrites(); + } catch (error) { + retainFailedConfigWrite(operation, epoch, preserveAcrossImport); + throw error; + } + try { + return await operation(); + } catch (error) { + if (!isConfigWriteImportGateError(error)) retainFailedConfigWrite(operation, epoch, preserveAcrossImport); + throw error; + } + }).promise; +} + +async function withCloseWriteAccess(operation) { + closeWriteAccessDepth++; + try { + return await operation(); + } finally { + closeWriteAccessDepth--; + } +} + +function snapshotConfigWritePayload(payload) { + return structuredClone(payload); +} + +function saveConfigTracked(configPatch) { + const payload = snapshotConfigWritePayload(configPatch); + return runConfigWrite(() => window.api.saveConfig(payload)); +} + +function saveHosterSettingsTracked(settings) { + const payload = snapshotConfigWritePayload(settings); + return runConfigWrite(() => window.api.saveHosterSettings(payload)); +} + +function saveGlobalSettingsTracked(settings) { + const payload = snapshotConfigWritePayload(settings); + return runConfigWrite(() => window.api.saveGlobalSettings(payload)); +} + +function savePendingQueueTracked(pendingQueue) { + const payload = snapshotConfigWritePayload(pendingQueue); + return runConfigWrite(() => window.api.savePendingQueue(payload), { preserveAcrossImport: true }); +} + +function setAlwaysOnTopTracked(value) { + const enabled = !!value; + return runConfigWrite(() => window.api.setAlwaysOnTop(enabled)); +} + +function saveDiagnosticsSettingsTracked(settings) { + const payload = snapshotConfigWritePayload(settings); + return runConfigWrite(() => window.api.diagnosticsSaveSettings(payload)); +} + +function saveRemoteSettingsTracked(settings) { + const payload = snapshotConfigWritePayload(settings); + return runConfigWrite(() => window.api.remoteSaveSettings(payload)); +} + +function flushConfigWrites() { + if (configFlushPromise) return configFlushPromise; + configFlushPromise = (async () => { + while (true) { + const { promise, tail } = enqueueConfigWriteOperation(retryFailedConfigWrites); + await promise; + if (configWriteQueue === tail && failedConfigWriteOperations.length === 0) return; + } + })(); + configFlushPromise.then( + () => { configFlushPromise = null; }, + () => { configFlushPromise = null; } + ); + return configFlushPromise; +} + let _restoredSnapshotSavedAt = null; let settingsSaveTimer = null; const settingsSaveCoordinator = window.SerializedRunner.createSerializedRunner(performSaveSettings); @@ -142,11 +297,21 @@ const _doneRemovalCoalescer = window.CoalescedSet }) : null; const queueSortState = { key: 'filename', direction: 'asc' }; +let uploadSidebarFilter = 'all'; +let _queueFilterCache = { filter: '', source: null, result: [] }; // History state let historyRowsData = []; let historySortState = { key: 'date', direction: 'desc' }; let _historySortClicked = false; +let historySidebarCounts = { total: 0, success: 0, error: 0 }; +let accountSidebarFilter = 'all'; +let historySidebarFilter = 'all'; +let _knownUpdateInfo = null; +let _updateCheckBusy = false; +let _updateInstallBusy = false; +let _updateDialogReturnFocus = null; +let _updateDialogInertState = []; // Session-specific files for the "Files" panel (resets each session) let sessionFilesData = []; @@ -471,17 +636,76 @@ async function _handleMenuAction(action) { break; } case 'check-updates': { - showCopyToast('Suche nach Updates…'); - try { - const result = await window.api.checkForUpdate(); - if (result && result.available) { showUpdateBanner(result); showCopyToast('Update gefunden!'); } - else showCopyToast('Kein Update verfügbar'); - } catch { showCopyToast('Fehler beim Prüfen'); } + await requestUpdateCheck(); break; } } } +function _setHeaderUpdateLabel(text) { + const button = document.getElementById('headerUpdateBtn'); + if (!button) return; + const label = button.querySelector('[data-update-label], .header-update-label'); + if (label) label.textContent = text; + else button.textContent = text; +} + +function _syncHeaderUpdateState() { + const button = document.getElementById('headerUpdateBtn'); + const available = !!(_knownUpdateInfo && _knownUpdateInfo.available); + const version = available ? String(_knownUpdateInfo.remoteVersion || '').replace(/^v/i, '') : ''; + const hint = _updateCheckBusy + ? 'Suche nach Aktualisierungen…' + : available + ? `Update v${version || 'unbekannt'} verfügbar. Klicken zum Installieren.` + : 'Nach Aktualisierungen suchen'; + if (button) { + button.classList.toggle('update-available', available); + button.classList.toggle('is-checking', _updateCheckBusy); + button.disabled = _updateCheckBusy; + button.setAttribute('aria-busy', _updateCheckBusy ? 'true' : 'false'); + button.setAttribute('aria-label', hint); + button.title = hint; + button.dataset.tooltip = hint; + _setHeaderUpdateLabel(_updateCheckBusy ? 'Prüfen…' : (available ? 'Update verfügbar' : 'Update')); + } + const manualButton = document.getElementById('manualUpdateCheckBtn'); + if (manualButton) { + manualButton.disabled = _updateCheckBusy; + manualButton.setAttribute('aria-busy', _updateCheckBusy ? 'true' : 'false'); + manualButton.textContent = _updateCheckBusy ? 'Prüfe…' : (available ? 'Update verfügbar' : 'Nach Updates suchen'); + } +} + +async function requestUpdateCheck() { + if (_knownUpdateInfo && _knownUpdateInfo.available) { + showUpdateBanner(_knownUpdateInfo); + return _knownUpdateInfo; + } + if (_updateCheckBusy) return null; + _updateCheckBusy = true; + _syncHeaderUpdateState(); + showCopyToast('Suche nach Updates…'); + try { + const result = await window.api.checkForUpdate(); + if (result && result.available) { + showUpdateBanner(result); + showCopyToast('Update gefunden!'); + } else if (result && result.error) { + showCopyToast('Updateprüfung fehlgeschlagen'); + } else { + showCopyToast('Kein Update verfügbar'); + } + return result; + } catch { + showCopyToast('Updateprüfung fehlgeschlagen'); + return null; + } finally { + _updateCheckBusy = false; + _syncHeaderUpdateState(); + } +} + function _syncMenuSettings() { const gs = config.globalSettings || {}; const pInput = document.getElementById('menuParallelInput'); @@ -500,7 +724,7 @@ function _menuSaveParallel(v) { const n = Math.max(0, Math.min(100, parseInt(v, 10) || 0)); const gs = { ...(config.globalSettings || {}), parallelUploadCount: n }; config.globalSettings = gs; - window.api.saveGlobalSettings(gs).catch(() => {}); + saveGlobalSettingsTracked(gs).catch(() => {}); const mirror = document.getElementById('parallelUploadCountInput'); if (mirror) mirror.value = String(n); return n; @@ -510,7 +734,7 @@ function _menuSaveSpeedMbs(mbs, enabled) { const kbs = enabled ? Math.max(0, Math.round((parseFloat(mbs) || 0) * 1024)) : 0; const gs = { ...(config.globalSettings || {}), globalMaxSpeedKbs: kbs }; config.globalSettings = gs; - window.api.saveGlobalSettings(gs).catch(() => {}); + saveGlobalSettingsTracked(gs).catch(() => {}); const mirror = document.getElementById('globalMaxSpeedMbsInput'); if (mirror) mirror.value = kbs > 0 ? String(+(kbs / 1024).toFixed(2)) : '0'; } @@ -909,15 +1133,18 @@ function buildPersistedQueueState() { } async function persistQueueStateNow() { + const pendingQueue = buildPersistedQueueState(); const globalSettings = { ...(config.globalSettings || {}), - pendingQueue: buildPersistedQueueState() + pendingQueue }; config.globalSettings = globalSettings; - await window.api.saveGlobalSettings(globalSettings); + await savePendingQueueTracked(pendingQueue); + return pendingQueue; } function persistQueueStateSoon(immediate) { + if (closePreparationState !== 'open') return; if (immediate) { queuePersistThrottle.cancel(); persistQueueStateNow().catch(() => {}); @@ -930,13 +1157,10 @@ function persistQueueStateSoon(immediate) { } function clearPersistedQueueStateSoon() { + if (closePreparationState !== 'open') return; queuePersistThrottle.request(() => { - const globalSettings = { - ...(config.globalSettings || {}), - pendingQueue: null - }; - config.globalSettings = globalSettings; - window.api.saveGlobalSettings(globalSettings).catch(() => {}); + config.globalSettings = { ...(config.globalSettings || {}), pendingQueue: null }; + savePendingQueueTracked(null).catch(() => {}); }, 0); } @@ -1108,6 +1332,7 @@ const _ABORT_SELECTION_STATUSES = new Set(['preview', 'queued', 'getting-server' function updateQueueActionButtons() { updateStartButton(); + _normalizeQueueSelectionToVisible(); const hasSelection = selectedJobIds.size > 0; // Single pass over the (usually small) selection set instead of three O(n) @@ -1435,11 +1660,58 @@ function _updateRowInPlace(tr, job) { return true; } +function _matchesUploadSidebarFilter(job, filter = uploadSidebarFilter) { + if (filter === 'active') return job.status === 'uploading' || job.status === 'getting-server' || job.status === 'retrying'; + if (filter === 'waiting') return job.status === 'preview' || job.status === 'queued'; + if (filter === 'done') return job.status === 'done'; + if (filter === 'error') return job.status === 'error'; + return true; +} + +function _getVisibleQueueJobs() { + if (uploadSidebarFilter === 'all') return queueJobs; + const filtered = queueJobs.filter(job => _matchesUploadSidebarFilter(job)); + if (_queueFilterCache.filter === uploadSidebarFilter && _queueFilterCache.source === queueJobs && _queueFilterCache.result.length === filtered.length) { + let unchanged = true; + for (let index = 0; index < filtered.length; index++) { + if (_queueFilterCache.result[index] !== filtered[index]) { + unchanged = false; + break; + } + } + if (unchanged) return _queueFilterCache.result; + } + _queueFilterCache = { filter: uploadSidebarFilter, source: queueJobs, result: filtered }; + return filtered; +} + +function _normalizeQueueSelectionToVisible(visibleJobs = _getVisibleQueueJobs()) { + if (selectedJobIds.size === 0) return false; + const visibleIds = new Set(visibleJobs.map(job => job.id)); + let changed = false; + for (const id of selectedJobIds) { + if (!visibleIds.has(id)) { + selectedJobIds.delete(id); + changed = true; + } + } + return changed; +} + +function _getVisibleSelectedQueueJobs(predicate) { + const visibleJobs = _getVisibleQueueJobs(); + _normalizeQueueSelectionToVisible(visibleJobs); + return visibleJobs.filter(job => selectedJobIds.has(job.id) && (!predicate || predicate(job))); +} + function renderQueueTable() { const tbody = document.getElementById('queueBody'); if (!tbody) return; - _sortedJobsCache = sortQueueJobs(queueJobs); + const visibleJobs = _getVisibleQueueJobs(); + const selectionChanged = _normalizeQueueSelectionToVisible(visibleJobs); + _sortedJobsCache = sortQueueJobs(visibleJobs); + if (selectionChanged) updateQueueActionButtons(); const totalRows = _sortedJobsCache.length; if (totalRows < 200) { @@ -1841,12 +2113,18 @@ async function doBackupExport() { } function applyImportedConfig(importedConfig, message) { - config = importedConfig; + const pendingQueue = buildPersistedQueueState(); + config = { + ...importedConfig, + globalSettings: { + ...(importedConfig.globalSettings || {}), + pendingQueue + } + }; hosterSettings = config.hosterSettings || {}; ensureAccountStatusEntries(); syncSelectedUploadHosters(); alwaysOnTopState = !!(config.globalSettings && config.globalSettings.alwaysOnTop); - window.api.setAlwaysOnTop(alwaysOnTopState); renderSettings(); renderAccounts(); renderHosterSummary(); @@ -1855,6 +2133,25 @@ function applyImportedConfig(importedConfig, message) { showCopyToast(message); } +async function persistImportedQueueState() { + let persistenceError = null; + try { + await persistQueueStateNow(); + } catch (error) { + persistenceError = error; + } + try { + await flushConfigWrites(); + } catch (error) { + if (!persistenceError) persistenceError = error; + } + return persistenceError; +} + +function showImportQueuePersistenceError(error) { + showCopyToast(`Import übernommen. Warteschlange konnte nicht vollständig gespeichert werden: ${error.message || error}`, 8000); +} + function setOnlineBackupStatus(message, state = '') { const status = document.getElementById('onlineBackupStatus'); if (!status) return; @@ -1928,12 +2225,21 @@ async function doOnlineBackupRestore() { try { await flushPendingSettingsSaves(); setOnlineBackupStatus('Lade und entschlüssele Einstellungen…', 'busy'); - const result = await window.api.restoreOnlineBackup(key); + beginConfigImport(); + let result; + let queuePersistenceError = null; + try { + result = await window.api.restoreOnlineBackup(key); + if (result && result.ok) applyImportedConfig(result.config, 'Online-Backup importiert'); + } finally { + queuePersistenceError = await persistImportedQueueState(); + endConfigImport(); + } if (!result || !result.ok) throw new Error(result?.error || 'Online-Sicherung konnte nicht importiert werden'); - applyImportedConfig(result.config, 'Online-Backup importiert'); const warnings = Array.isArray(result.warnings) ? result.warnings : []; if (warnings.length) setOnlineBackupStatus(`Einstellungen übernommen. Bitte prüfen: ${warnings.join(', ')}.`, 'warning'); else setOnlineBackupStatus('Alle Accounts und Einstellungen wurden übernommen.', 'success'); + if (queuePersistenceError) showImportQueuePersistenceError(queuePersistenceError); } catch (error) { setOnlineBackupStatus(error.message || String(error), 'error'); } finally { @@ -2012,7 +2318,16 @@ async function doBackupImport(legacyPassword) { const pw = typeof legacyPassword === 'string' ? legacyPassword : undefined; try { await flushPendingSettingsSaves(); - const result = await window.api.importBackup(pw); + beginConfigImport(); + let result; + let queuePersistenceError = null; + try { + result = await window.api.importBackup(pw); + if (result && result.ok) applyImportedConfig(result.config, 'Backup importiert'); + } finally { + queuePersistenceError = await persistImportedQueueState(); + endConfigImport(); + } if (!result || result.canceled) return; if (result.needsPassword) { const entered = await askLegacyBackupPassword(result.hint); @@ -2020,10 +2335,10 @@ async function doBackupImport(legacyPassword) { return; } if (result.ok) { - applyImportedConfig(result.config, 'Backup importiert'); if (Array.isArray(result.warnings) && result.warnings.length) { alert(`Backup importiert. Bitte prüfen: ${result.warnings.join(', ')}.`); } + if (queuePersistenceError) showImportQueuePersistenceError(queuePersistenceError); } else if (result.error) { alert('Import fehlgeschlagen: ' + result.error); } @@ -2036,6 +2351,7 @@ document.addEventListener('click', (e) => { if (!e.target.closest('.context-menu')) hideContextMenu(); }); document.addEventListener('keydown', (e) => { + if (_isUpdateDialogVisible()) return; const accountModal = document.getElementById('accountModal'); if (e.key === 'Tab' && accountModal && accountModal.style.display !== 'none') { const focusable = Array.from(accountModal.querySelectorAll('button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')); @@ -2061,8 +2377,10 @@ document.addEventListener('keydown', (e) => { if (selectedRecentIds.size > 0 && selectedJobIds.size === 0) { sessionFilesData.forEach(r => selectedRecentIds.add(r.order)); renderRecentUploadsPanel(); - } else if (queueJobs.length > 0) { - queueJobs.forEach(j => selectedJobIds.add(j.id)); + } else { + const visibleJobs = _getVisibleQueueJobs(); + selectedJobIds.clear(); + visibleJobs.forEach(j => selectedJobIds.add(j.id)); renderQueueTable(); } } @@ -2071,6 +2389,7 @@ document.addEventListener('keydown', (e) => { if (e.key === 'Delete') { if (activeView && activeView.id === 'upload-view') { e.preventDefault(); + _normalizeQueueSelectionToVisible(); if (selectedRecentIds.size > 0) { deleteSelectedRecentFiles(); } else if (selectedJobIds.size > 0) { @@ -2112,6 +2431,7 @@ document.getElementById('contextMenu').addEventListener('click', (e) => { }); async function handleContextAction(action) { + _normalizeQueueSelectionToVisible(); if (action === 'start-selected') { startSelectedUpload(); } else if (action === 'copy-links') { @@ -2163,7 +2483,8 @@ async function handleContextAction(action) { persistQueueStateSoon(true); } else if (action === 'always-on-top') { alwaysOnTopState = !alwaysOnTopState; - await window.api.setAlwaysOnTop(alwaysOnTopState); + await setAlwaysOnTopTracked(alwaysOnTopState); + config.globalSettings = { ...(config.globalSettings || {}), alwaysOnTop: alwaysOnTopState }; } else if (action.startsWith('delete-hoster:')) { const hoster = action.replace('delete-hoster:', ''); // Cancel active uploads for this hoster @@ -2190,8 +2511,7 @@ async function handleContextAction(action) { } function getSelectedJobLinks() { - return queueJobs - .filter(j => selectedJobIds.has(j.id) && j.status === 'done' && j.result) + return _getVisibleSelectedQueueJobs(j => j.status === 'done' && j.result) .map(j => j.result.download_url || j.result.embed_url || '') .filter(Boolean); } @@ -2275,10 +2595,11 @@ function _markSkippedJobs(result) { renderQueueTable(); } -async function startSelectedUpload() { +async function startSelectedUpload(explicitJobs) { + const scopedJobs = Array.isArray(explicitJobs) ? explicitJobs : _getVisibleSelectedQueueJobs(); if (uploading) { _hydrateMissingJobSizes(); - const addable = queueJobs.filter(j => selectedJobIds.has(j.id) && isStartableQueueStatus(j.status)); + const addable = scopedJobs.filter(j => isStartableQueueStatus(j.status)); if (addable.length === 0) { if (selectedJobIds.size > 0) showCopyToast('Keine startbaren Jobs ausgewählt (alle laufen schon oder sind fertig).'); return; @@ -2304,7 +2625,7 @@ async function startSelectedUpload() { uploading = false; updateQueueActionButtons(); updateStatusBar(); - await startSelectedUpload(); + await startSelectedUpload(addable); return; } _markSkippedJobs(result); @@ -2333,7 +2654,7 @@ async function startSelectedUpload() { updateQueueActionButtons(); const hosters = getSelectedHosters(); - const jobsToStart = queueJobs.filter((job) => selectedJobIds.has(job.id) && isStartableQueueStatus(job.status)); + const jobsToStart = scopedJobs.filter(job => isStartableQueueStatus(job.status)); if (jobsToStart.length === 0) { uploading = false; updateQueueActionButtons(); return; } try { @@ -2745,11 +3066,12 @@ function _handleStatsImpl(data) { // --- Per-job log modal --- async function showJobLogModal() { - if (selectedJobIds.size === 0) return; + const selectedJobs = _getVisibleSelectedQueueJobs(); + if (selectedJobs.length === 0) return; // Use the first selected job — log view is per-file, multi-select doesn't // make sense here. - const jobId = [...selectedJobIds][0]; - const job = _jobIndexById.get(jobId); + const job = selectedJobs[0]; + const jobId = job.id; const modal = document.getElementById('jobLogModal'); const titleEl = document.getElementById('jobLogTitle'); const bodyEl = document.getElementById('jobLogBody'); @@ -2799,6 +3121,7 @@ async function copyJobLogToClipboard() { // --- Retry --- async function retrySelectedJobs() { + _normalizeQueueSelectionToVisible(); const retryJobs = []; // Build a Set for O(1) selectedFiles dedup below. const existingFilePaths = new Set(); @@ -2844,10 +3167,11 @@ async function retrySelectedJobs() { selectedJobIds.clear(); retryJobs.forEach(j => selectedJobIds.add(j.id)); persistQueueStateSoon(); - await startSelectedUpload(); + await startSelectedUpload(retryJobs); } async function abortSelectedJobs() { + _normalizeQueueSelectionToVisible(); const activeJobIds = []; queueJobs.forEach((job) => { @@ -2887,6 +3211,7 @@ async function abortAllUploads() { } function moveSelectedJobs(direction) { + _normalizeQueueSelectionToVisible(); if (uploading || selectedJobIds.size === 0) return; const jobs = queueJobs.slice(); @@ -3057,6 +3382,134 @@ function _computeQueueStats() { return _queueStatsCache; } +function _setSidebarCount(id, value) { + const element = document.getElementById(id); + if (element) element.textContent = Number(value || 0).toLocaleString('de-DE'); +} + +function _syncSidebarFilterButtons(selector, datasetKey, value) { + document.querySelectorAll(selector).forEach(button => { + const active = button.dataset[datasetKey] === value; + button.classList.toggle('active', active); + button.setAttribute('aria-pressed', active ? 'true' : 'false'); + }); +} + +function setUploadSidebarFilter(value) { + if (!['all', 'active', 'waiting', 'done', 'error'].includes(value)) return; + uploadSidebarFilter = value; + _syncSidebarFilterButtons('[data-upload-sidebar-target]', 'uploadSidebarTarget', value); + _queueFilterCache = { filter: '', source: null, result: [] }; + _normalizeQueueSelectionToVisible(); + _lastVisibleRange = { start: -1, end: -1 }; + const container = document.getElementById('queueContainer'); + if (container) container.scrollTop = 0; + renderQueueTable(); +} + +function updateUploadSidebarSummary(stats = _computeQueueStats()) { + let waiting = 0; + let active = 0; + for (const job of queueJobs) { + if (job.status === 'preview' || job.status === 'queued') waiting++; + else if (job.status === 'uploading' || job.status === 'getting-server' || job.status === 'retrying') active++; + } + const accountCount = getAccountsWithCredsFlat().filter(({ account }) => account.enabled !== false).length; + _setSidebarCount('uploadSidebarAllCount', stats.total); + _setSidebarCount('uploadSidebarActiveCount', active); + _setSidebarCount('uploadSidebarWaitingCount', waiting); + _setSidebarCount('uploadSidebarDoneCount', stats.done); + _setSidebarCount('uploadSidebarErrorCount', stats.errors); + _setSidebarCount('uploadSidebarAccountsCount', accountCount); +} + +function updateAccountSidebarSummary(allAccounts = getAllAccountsFlat()) { + let ready = 0; + let warning = 0; + let error = 0; + let availableAccounts = 0; + const hosterCounts = new Map(); + for (const { name, account } of allAccounts) { + hosterCounts.set(name, (hosterCounts.get(name) || 0) + 1); + if (account.enabled !== false && accountHasCreds(name, account)) availableAccounts++; + const category = _getAccountSidebarCategory(name, account); + if (category === 'ready') ready++; + else if (category === 'error') error++; + else warning++; + } + _setSidebarCount('accountsSidebarAllCount', allAccounts.length); + _setSidebarCount('accountsSidebarReadyCount', ready); + _setSidebarCount('accountsSidebarWarningCount', warning); + _setSidebarCount('accountsSidebarErrorCount', error); + _setSidebarCount('uploadSidebarAccountsCount', availableAccounts); + const container = document.getElementById('accountsSidebarHosters'); + if (container) { + container.replaceChildren(...HOSTERS.filter(name => hosterCounts.has(name)).map(name => { + const row = document.createElement('div'); + row.className = 'view-sidebar-hoster'; + const dot = document.createElement('span'); + dot.className = 'view-sidebar-hoster-dot'; + const label = document.createElement('span'); + label.className = 'view-sidebar-copy'; + label.textContent = getHosterLabel(name); + const count = document.createElement('span'); + count.className = 'view-sidebar-badge'; + count.textContent = hosterCounts.get(name).toLocaleString('de-DE'); + row.append(dot, label, count); + return row; + })); + } +} + +function _getAccountSidebarCategory(name, account) { + if (account.enabled === false || !accountHasCreds(name, account)) return 'warning'; + const status = (accountStatuses[account.id] && accountStatuses[account.id].status) || 'unchecked'; + if (status === 'ok') return 'ready'; + if (status === 'error') return 'error'; + return 'warning'; +} + +function _applyAccountSidebarFilter() { + const entries = new Map(getAllAccountsFlat().map(entry => [entry.account.id, entry])); + document.querySelectorAll('#accountsList .account-hoster-group').forEach(group => { + let matches = 0; + group.querySelectorAll('.account-card').forEach(card => { + const entry = entries.get(card.dataset.accountId); + const visible = !!entry && (accountSidebarFilter === 'all' || _getAccountSidebarCategory(entry.name, entry.account) === accountSidebarFilter); + card.hidden = !visible; + if (visible) matches++; + }); + group.hidden = matches === 0; + }); +} + +function setAccountSidebarFilter(value) { + if (!['all', 'ready', 'warning', 'error'].includes(value)) return; + accountSidebarFilter = value; + _syncSidebarFilterButtons('[data-accounts-sidebar-filter]', 'accountsSidebarFilter', value); + _applyAccountSidebarFilter(); +} + +function setHistorySidebarFilter(value) { + if (!['all', 'success', 'error'].includes(value)) return; + historySidebarFilter = value; + _syncSidebarFilterButtons('[data-history-filter]', 'historyFilter', value); + const container = document.getElementById('historyContainer'); + if (container) { + container.scrollTop = 0; + renderHistoryTable(container); + } +} + +function updateHistorySidebarSummary() { + _setSidebarCount('historySidebarAllCount', historySidebarCounts.total); + _setSidebarCount('historySidebarSuccessCount', historySidebarCounts.success); + _setSidebarCount('historySidebarErrorCount', historySidebarCounts.error); + const retention = document.getElementById('historySidebarRetention'); + const select = document.getElementById('historyRetentionSelect'); + if (retention && select) retention.textContent = select.selectedOptions[0]?.textContent || 'Alles behalten'; +} + function updateStatusBar() { const stats = _computeQueueStats(); @@ -3084,6 +3537,7 @@ function updateStatusBar() { document.getElementById('sbInProgressCount').textContent = `Läuft ${stats.inProgress}`; document.getElementById('sbDoneCount').textContent = `Fertig ${_sessionDoneCount}`; document.getElementById('sbErrorCount').textContent = `Fehler ${_sessionErrorCount}`; + updateUploadSidebarSummary(stats); } // --- Health Check --- @@ -3219,6 +3673,10 @@ function renderSettings() { ${pageDefinitions.map((definition, index) => ``).join('')}

+
+ +
Automatisch gespeichert
+
`; container.appendChild(layout); @@ -3755,13 +4213,14 @@ function renderSettings() { if (bindHintEl) { bindHintEl.innerHTML = 'Netzwerkmodus braucht mindestens eine IP/CIDR in der Allowlist — sonst bleibt es fail-closed auf Loopback.'; } return; } - await window.api.diagnosticsSaveSettings({ + const diagnosticsSettings = { enabled: enabledEl.checked, port: parseInt(portEl.value, 10) || 9110, bindMode: modeEl.value, publicHost: publicHostEl.value.trim(), allowlist - }); + }; + await saveDiagnosticsSettingsTracked(diagnosticsSettings); applySettings(await window.api.diagnosticsGetSettings()); refreshStatus(); }; @@ -3782,7 +4241,7 @@ function renderSettings() { setTimeout(() => { b.textContent = 'Kopieren'; }, 1500); }); document.getElementById('diagRegenerateBtn').addEventListener('click', async () => { - const r = await window.api.diagnosticsRegenerate(); + const r = await runConfigWrite(() => window.api.diagnosticsRegenerate()); if (r && r.code) { codeEl.value = r.code; issuedEl.textContent = fmtIssued(r.codeIssuedAt); } refreshStatus(); }); @@ -3807,23 +4266,8 @@ function renderSettings() { document.getElementById('chooseLogFilePathBtn')?.addEventListener('click', chooseLogFilePath); document.getElementById('openLogFolderBtn')?.addEventListener('click', () => window.api.openLogFolder()); - document.getElementById('manualUpdateCheckBtn')?.addEventListener('click', async (e) => { - const btn = e.target; - btn.disabled = true; - btn.textContent = 'Prüfe...'; - try { - const result = await window.api.checkForUpdate(); - if (result && result.available) { - showUpdateBanner(result); - btn.textContent = 'Update gefunden!'; - } else { - btn.textContent = 'Kein Update verfügbar'; - } - } catch { - btn.textContent = 'Fehler beim Prüfen'; - } - setTimeout(() => { btn.disabled = false; btn.textContent = 'Nach Updates suchen'; }, 3000); - }); + document.getElementById('manualUpdateCheckBtn')?.addEventListener('click', requestUpdateCheck); + _syncHeaderUpdateState(); container.querySelectorAll('.settings-autosave').forEach((input) => { const eventName = input.type === 'checkbox' ? 'change' : 'input'; input.addEventListener(eventName, scheduleSettingsSave); @@ -3839,6 +4283,7 @@ async function chooseLogFilePath() { } function scheduleSettingsSave() { + if (closePreparationState !== 'open') return; const feedback = document.getElementById('saveFeedback'); if (feedback) feedback.textContent = 'Speichert...'; clearTimeout(settingsSaveTimer); @@ -3922,7 +4367,7 @@ async function performSaveSettings(options = {}) { const newAot = !!aotCheckbox.checked; if (newAot !== alwaysOnTopState) { alwaysOnTopState = newAot; - await window.api.setAlwaysOnTop(alwaysOnTopState); + await setAlwaysOnTopTracked(newAot); } } @@ -3944,13 +4389,9 @@ async function performSaveSettings(options = {}) { newHosterSettings[name] = hs; } - // Fire both saves in parallel instead of serializing the two IPC round-trips. - // Skip the getConfig refetch — we just wrote it, we know the new state, and - // the round-trip added 100–200ms of UI stall per keystroke (autosave fires - // on every input change). await Promise.all([ - window.api.saveHosterSettings(newHosterSettings), - window.api.saveGlobalSettings(globalSettings) + saveHosterSettingsTracked(newHosterSettings), + saveGlobalSettingsTracked(globalSettings) ]); config.hosterSettings = newHosterSettings; config.globalSettings = globalSettings; @@ -3978,7 +4419,14 @@ async function performSaveSettings(options = {}) { const remoteBadge = document.getElementById('remoteStatusBadge'); if (remoteSettings) { try { - await window.api.remoteSaveSettings(remoteSettings); + const remoteSaveResult = await saveRemoteSettingsTracked(remoteSettings); + if (remoteSaveResult && remoteSaveResult.settings) { + globalSettings.remote = { ...remoteSaveResult.settings }; + config.globalSettings = { ...(config.globalSettings || {}), remote: { ...remoteSaveResult.settings } }; + const tokenInput = document.getElementById('remoteTokenInput'); + if (tokenInput) tokenInput.value = remoteSaveResult.settings.token || ''; + } + if (remoteSaveResult && remoteSaveResult.runtimeError) throw new Error(remoteSaveResult.runtimeError); if (remoteBadge) { remoteBadge.textContent = remoteSettings.enabled ? 'Aktiv' : 'Inaktiv'; remoteBadge.className = `panel-status${remoteSettings.enabled ? ' active' : ''}`; @@ -3995,7 +4443,12 @@ async function performSaveSettings(options = {}) { statusEl.style.color = '#94a3b8'; } } - } catch {} + } catch { + if (remoteBadge) { + remoteBadge.textContent = 'Fehler'; + remoteBadge.className = 'panel-status'; + } + } } const feedback = document.getElementById('saveFeedback'); @@ -4082,6 +4535,8 @@ function updateAccountCard(accountId) { tmp.innerHTML = _buildAccountCardHtml(found.name, found.account, idx); card.replaceWith(tmp.firstElementChild); _refreshHosterGroupHeader(found.name); + updateAccountSidebarSummary(); + _applyAccountSidebarFilter(); } function _refreshHosterGroupHeader(name) { @@ -4122,6 +4577,7 @@ function renderAccounts() { ensureAccountStatusEntries(); const allAccounts = getAllAccountsFlat(); + updateAccountSidebarSummary(allAccounts); const runCheckBtn = document.getElementById('accountsRunHealthCheckBtn'); if (runCheckBtn) runCheckBtn.disabled = healthCheckRunning; @@ -4133,10 +4589,10 @@ function renderAccounts() {

Noch keine Accounts

Füge deinen ersten Hoster-Account hinzu. Die Zugangsdaten werden vor dem Speichern geprüft.

- `; if (footer) footer.style.display = 'none'; if (!_accountListenersBound) bindAccountListeners(container); + _applyAccountSidebarFilter(); return; } @@ -4158,6 +4614,7 @@ function renderAccounts() { _updateToggleAllAccountsBtn(); if (!_accountListenersBound) bindAccountListeners(container); + _applyAccountSidebarFilter(); } function _summarizeHosterGroup(accounts) { @@ -4191,6 +4648,7 @@ const _hosterGroupOpenMemory = new Map(); let _hosterSettingsSaveTimer = null; const hosterSettingsSaveCoordinator = window.SerializedRunner.createSerializedRunner(performHosterSettingsSave); function scheduleHosterSettingsSave() { + if (closePreparationState !== 'open') return; clearTimeout(_hosterSettingsSaveTimer); _hosterSettingsSaveTimer = setTimeout(() => { _hosterSettingsSaveTimer = null; @@ -4216,22 +4674,46 @@ async function performHosterSettingsSave() { }); newHosterSettings[name] = hs; } - await window.api.saveHosterSettings(newHosterSettings); + await saveHosterSettingsTracked(newHosterSettings); config.hosterSettings = newHosterSettings; hosterSettings = newHosterSettings; } +async function recoverSerializedSave(coordinator, retry) { + try { + await coordinator.flush(); + return false; + } catch { + await flushConfigWrites(); + await retry(); + return true; + } +} + async function flushPendingSettingsSaves() { - await Promise.all([settingsSaveCoordinator.flush(), hosterSettingsSaveCoordinator.flush()]); const flushSettings = settingsSaveTimer !== null; const flushHosters = _hosterSettingsSaveTimer !== null; clearTimeout(settingsSaveTimer); clearTimeout(_hosterSettingsSaveTimer); settingsSaveTimer = null; _hosterSettingsSaveTimer = null; - if (flushSettings) await saveSettings({ feedbackText: 'Automatisch gespeichert' }); - if (flushHosters) await saveHosterSettingsFromDom(); + queuePersistThrottle.flushSync(); + const settingsRecovered = await recoverSerializedSave( + settingsSaveCoordinator, + () => saveSettings({ feedbackText: 'Automatisch gespeichert' }) + ); + const hostersRecovered = await recoverSerializedSave( + hosterSettingsSaveCoordinator, + saveHosterSettingsFromDom + ); + if (flushSettings && !settingsRecovered) await saveSettings({ feedbackText: 'Automatisch gespeichert' }); + if (flushHosters && !hostersRecovered) await saveHosterSettingsFromDom(); await Promise.all([settingsSaveCoordinator.flush(), hosterSettingsSaveCoordinator.flush()]); + await flushConfigWrites(); + const persistedConfig = await window.api.getConfig(); + config = persistedConfig; + hosterSettings = config.hosterSettings || {}; + alwaysOnTopState = !!(config.globalSettings && config.globalSettings.alwaysOnTop); } function _buildHosterSettingsHtml(name) { @@ -4476,7 +4958,7 @@ function bindAccountListeners(container) { // Persist in the background. saveConfig is idempotent; we don't need to // await here or re-fetch — our in-memory config is already the truth. - window.api.saveConfig({ hosters: config.hosters }).catch(() => {}); + saveConfigTracked({ hosters: config.hosters }).catch(() => {}); }); } @@ -4490,7 +4972,7 @@ async function toggleAccount(accountId) { // accounts in the list. updateAccountCard(accountId); renderHosterSummary(); - window.api.saveConfig({ hosters: config.hosters }).catch(() => {}); + saveConfigTracked({ hosters: config.hosters }).catch(() => {}); } async function checkSingleAccount(accountId) { @@ -4705,7 +5187,7 @@ async function deleteAccount(accountId) { // Fire-and-forget the persist. The earlier `await getConfig()` round-trip // was redundant (we already have the truth in memory) and was the main // source of perceived lag on add/delete. - window.api.saveConfig({ hosters: config.hosters }).catch((err) => { + saveConfigTracked({ hosters: config.hosters }).catch((err) => { if (window.api && window.api.debugLog) window.api.debugLog(`deleteAccount saveConfig failed: ${err && err.message ? err.message : err}`); showCopyToast('Account-Löschung konnte nicht persistiert werden — bitte erneut versuchen.'); }); @@ -4903,7 +5385,7 @@ async function _persistAccount(ctx, creds) { accountId = `${ctx.hosterName}-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`; candidateHosters[ctx.hosterName].push({ id: accountId, ...creds }); } - await window.api.saveConfig({ hosters: candidateHosters }); + await saveConfigTracked({ hosters: candidateHosters }); return { accountId, candidateHosters, isEdit: ctx.isEdit }; } @@ -4952,29 +5434,39 @@ async function loadHistory() { if (!history || history.length === 0) { historyRowsData = []; + historySidebarCounts = { total: 0, success: 0, error: 0 }; + updateHistorySidebarSummary(); container.innerHTML = '

Noch keine Uploads.

'; return; } historySortState = { key: 'date', direction: 'desc' }; historyRowsData = []; + historySidebarCounts = { total: 0, success: 0, error: 0 }; let order = 0; for (const batch of history) { const dt = formatDateTime(batch.timestamp || new Date()); for (const file of (batch.files || [])) { for (const result of (file.results || [])) { - if (result.status === 'aborted' || result.status === 'error') continue; + historySidebarCounts.total++; + const isError = result.status === 'aborted' || result.status === 'error'; + if (isError) historySidebarCounts.error++; + else historySidebarCounts.success++; + const detail = isError + ? String(result.error || result.message || (result.status === 'aborted' ? 'Abgebrochen' : 'Fehlgeschlagen')) + : (result.download_url || result.embed_url || ''); historyRowsData.push({ date: dt.text, dateTs: dt.ts, filename: file.name || '', host: result.hoster || '', - link: result.download_url || result.embed_url || '', - isError: false, order: order++ + link: detail, + isError, order: order++ }); } } } + updateHistorySidebarSummary(); renderHistoryTable(container); } @@ -5201,8 +5693,15 @@ function _renderHistoryVirtualRows() { tbody.innerHTML = parts.join(''); } +function _getVisibleHistoryRows() { + if (historySidebarFilter === 'success') return historyRowsData.filter(row => !row.isError); + if (historySidebarFilter === 'error') return historyRowsData.filter(row => row.isError); + return historyRowsData; +} + function renderHistoryTable(container) { - if (!container || !historyRowsData.length) { + const visibleRows = _getVisibleHistoryRows(); + if (!container || !visibleRows.length) { if (container) container.innerHTML = '

Noch keine Uploads.

'; const emptyNotice = document.getElementById('historyCapNotice'); if (emptyNotice) emptyNotice.style.display = 'none'; @@ -5210,8 +5709,8 @@ function renderHistoryTable(container) { return; } - const total = historyRowsData.length; - const working = total > HISTORY_RENDER_CAP ? historyRowsData.slice(-HISTORY_RENDER_CAP) : historyRowsData; + const total = visibleRows.length; + const working = total > HISTORY_RENDER_CAP ? visibleRows.slice(-HISTORY_RENDER_CAP) : visibleRows; const notice = document.getElementById('historyCapNotice'); if (notice) { if (total > HISTORY_RENDER_CAP) { @@ -5274,30 +5773,127 @@ function sortHistoryRows(rows) { }); } -// Flush pending queue state on window close (sync IPC — blocks until save completes) -window.addEventListener('beforeunload', () => { - // Flush pending settings save if user changed settings right before closing - if (settingsSaveTimer) { - clearTimeout(settingsSaveTimer); - settingsSaveTimer = null; - try { saveSettings(); } catch {} +let closePreparationPromise = null; +let closePreparationInertState = []; +let closePreparationOverlayState = null; +let closePreparationGeneration = 0; +let activeClosePreparationAttempt = null; +const CLOSE_PREPARATION_TIMEOUT_MS = 1200; + +function waitForClosePreparationStep(promise) { + return Promise.race([ + Promise.resolve(promise), + new Promise((_, reject) => setTimeout(() => reject(new Error('Speichern vor dem Beenden hat zu lange gedauert')), CLOSE_PREPARATION_TIMEOUT_MS)) + ]); +} + +function setClosePreparationUi(active) { + const overlay = document.getElementById('shutdownOverlay'); + const message = document.getElementById('shutdownMessage'); + const cancelButton = document.getElementById('cancelShutdownBtn'); + if (!overlay || !message || !cancelButton) return; + if (active) { + if (closePreparationOverlayState) return; + closePreparationOverlayState = { + display: overlay.style.display, + message: message.innerHTML, + cancelDisplay: cancelButton.style.display + }; + closePreparationInertState = Array.from(document.body.children) + .filter(element => element !== overlay && 'inert' in element) + .map(element => ({ element, inert: element.inert })); + closePreparationInertState.forEach(({ element }) => { element.inert = true; }); + message.textContent = 'Einstellungen werden gespeichert…'; + cancelButton.style.display = 'none'; + overlay.style.display = 'flex'; + return; } - queuePersistThrottle.cancel(); - // Drain pending done-removals synchronously before persisting so jobs the - // user expected to disappear (removeFromQueueOnDone=true) don't reappear - // on next launch. Microtask wouldn't run before the sync IPC below. - if (_doneRemovalCoalescer) _doneRemovalCoalescer.drainSync(); - const globalSettings = { - ...(config.globalSettings || {}), - pendingQueue: buildPersistedQueueState() - }; - config.globalSettings = globalSettings; - window.api.saveGlobalSettingsSync(globalSettings); -}); + closePreparationInertState.forEach(({ element, inert }) => { + if (element.isConnected) element.inert = inert; + }); + closePreparationInertState = []; + overlay.style.display = closePreparationOverlayState ? closePreparationOverlayState.display : 'none'; + message.innerHTML = closePreparationOverlayState ? closePreparationOverlayState.message : ''; + cancelButton.style.display = closePreparationOverlayState ? closePreparationOverlayState.cancelDisplay : ''; + closePreparationOverlayState = null; +} + +function isCurrentClosePreparation(generation, attempt) { + return generation === closePreparationGeneration && attempt === activeClosePreparationAttempt; +} + +async function recoverWindowClose(generation, attempt, originalError) { + if (!isCurrentClosePreparation(generation, attempt)) return; + closePreparationState = 'recovering'; + let restored = false; + try { + restored = await waitForClosePreparationStep(window.api.finishClosePreparation({ ready: false, attempt })); + } catch (error) { + if (isCurrentClosePreparation(generation, attempt)) showCopyToast(error.message || String(error), 8000); + return; + } + if (!isCurrentClosePreparation(generation, attempt)) return; + if (restored !== true) { + showCopyToast('Die Anwendung konnte nach dem fehlgeschlagenen Speichern nicht entsperrt werden', 8000); + return; + } + try { + await waitForClosePreparationStep(withCloseWriteAccess(async () => { + await flushConfigWrites(); + if (!isCurrentClosePreparation(generation, attempt)) return; + await persistQueueStateNow(); + await flushConfigWrites(); + if (failedConfigWriteOperations.length !== 0) throw new Error('Nicht alle Einstellungen konnten gespeichert werden'); + })); + } catch (error) { + if (isCurrentClosePreparation(generation, attempt)) showCopyToast(error.message || String(error), 8000); + return; + } + if (!isCurrentClosePreparation(generation, attempt)) return; + closePreparationPromise = null; + activeClosePreparationAttempt = null; + closePreparationState = 'open'; + setClosePreparationUi(false); + showCopyToast(originalError.message || String(originalError), 8000); +} + +function prepareForWindowClose(attempt) { + if (!Number.isInteger(attempt)) return Promise.resolve(false); + if (closePreparationPromise && activeClosePreparationAttempt === attempt) return closePreparationPromise; + const generation = ++closePreparationGeneration; + activeClosePreparationAttempt = attempt; + closePreparationState = 'preparing'; + setClosePreparationUi(true); + closePreparationPromise = (async () => { + if (_doneRemovalCoalescer) _doneRemovalCoalescer.drainSync(); + await waitForClosePreparationStep(withCloseWriteAccess(flushPendingSettingsSaves)); + if (!isCurrentClosePreparation(generation, attempt)) return; + const pendingQueue = buildPersistedQueueState(); + closePreparationState = 'sealed'; + await waitForClosePreparationStep(flushConfigWrites()); + if (!isCurrentClosePreparation(generation, attempt)) return; + const accepted = await waitForClosePreparationStep(window.api.finishClosePreparation({ ready: true, attempt, pendingQueue })); + if (!accepted) throw new Error('Einstellungen konnten vor dem Beenden nicht gespeichert werden'); + })(); + closePreparationPromise.catch(error => recoverWindowClose(generation, attempt, error)); + return closePreparationPromise; +} // --- Setup Listeners --- function setupListeners() { try { initMenuBar(); } catch (err) { console.error('menu bar init failed', err); } + document.querySelectorAll('[data-upload-sidebar-target]').forEach(button => { + button.addEventListener('click', () => setUploadSidebarFilter(button.dataset.uploadSidebarTarget)); + }); + document.querySelectorAll('[data-accounts-sidebar-filter]').forEach(button => { + button.addEventListener('click', () => setAccountSidebarFilter(button.dataset.accountsSidebarFilter)); + }); + document.querySelectorAll('[data-history-filter]').forEach(button => { + button.addEventListener('click', () => setHistorySidebarFilter(button.dataset.historyFilter)); + }); + _syncSidebarFilterButtons('[data-upload-sidebar-target]', 'uploadSidebarTarget', uploadSidebarFilter); + _syncSidebarFilterButtons('[data-accounts-sidebar-filter]', 'accountsSidebarFilter', accountSidebarFilter); + _syncSidebarFilterButtons('[data-history-filter]', 'historyFilter', historySidebarFilter); document.getElementById('addFilesBtn').addEventListener('click', pickFiles); document.getElementById('addFolderBtn').addEventListener('click', pickFolder); document.getElementById('startUploadBtn').addEventListener('click', startUpload); @@ -5381,8 +5977,12 @@ function setupListeners() { document.getElementById('clearHistoryBtn').addEventListener('click', async () => { if (!confirm('Verlauf wirklich löschen?')) return; - await window.api.clearHistory(); - loadHistory(); + try { + await runConfigWrite(() => window.api.clearHistory()); + loadHistory(); + } catch (error) { + showCopyToast(error.message || String(error)); + } }); document.getElementById('exportHistoryBtn').addEventListener('click', exportHistory); @@ -5398,14 +5998,15 @@ function setupListeners() { if (!ok) { historyRetentionSelect.value = prev; return; } } } - const globalSettings = { ...(config.globalSettings || {}), historyRetention: value }; - config.globalSettings = globalSettings; - await window.api.saveGlobalSettings(globalSettings).catch(() => {}); - if (value !== 'all') { - const res = await window.api.pruneHistory(value); + try { + const res = await runConfigWrite(() => window.api.pruneHistory(value)); + config.globalSettings = { ...(config.globalSettings || {}), historyRetention: value }; if (res && res.removedRows > 0) showCopyToast(`Verlauf gekürzt: ${res.removedRows.toLocaleString('de-DE')} entfernt`); + loadHistory(); + } catch (error) { + historyRetentionSelect.value = prev; + showCopyToast(error.message || String(error)); } - loadHistory(); }); } @@ -5451,7 +6052,7 @@ function setupListeners() { // Click on empty area in queue → deselect all document.getElementById('upload-view').addEventListener('click', (e) => { - if (!e.target.closest('.queue-row') && !e.target.closest('.btn') && !e.target.closest('.context-menu') && !e.target.closest('.recent-files-panel')) { + if (e.target.closest('.view-main') && !e.target.closest('.queue-row') && !e.target.closest('.btn') && !e.target.closest('.context-menu') && !e.target.closest('.recent-files-panel')) { if (selectedJobIds.size > 0) { selectedJobIds.clear(); renderQueueTable(); @@ -5511,35 +6112,242 @@ function setupListeners() { document.getElementById('jobLogModal')?.addEventListener('click', (e) => { if (e.target.id === 'jobLogModal') hideJobLogModal(); }); + + document.getElementById('headerUpdateBtn')?.addEventListener('click', requestUpdateCheck); + document.getElementById('installUpdateBtn')?.addEventListener('click', installKnownUpdate); + document.getElementById('dismissUpdateBtn')?.addEventListener('click', closeUpdateDialog); + document.getElementById('updateCloseBtn')?.addEventListener('click', closeUpdateDialog); + document.getElementById('updateBanner')?.addEventListener('click', (event) => { + if (event.target.id === 'updateBanner') closeUpdateDialog(); + }); + document.addEventListener('keydown', _handleUpdateDialogKeydown, true); + _syncHeaderUpdateState(); } // --- Update UI --- function showUpdateBanner(info) { - const banner = document.getElementById('updateBanner'); - const msg = document.getElementById('updateMessage'); - if (!banner || !msg) return; - msg.textContent = `Update v${info.remoteVersion} verfügbar`; - banner.style.display = 'flex'; - document.getElementById('installUpdateBtn').onclick = async () => { - msg.textContent = 'Update wird heruntergeladen...'; - document.getElementById('installUpdateBtn').disabled = true; - await persistQueueStateNow().catch(() => {}); // Save queue before update restart - await window.api.installUpdate(); - }; - document.getElementById('dismissUpdateBtn').onclick = () => { banner.style.display = 'none'; }; + if (!info) return; + _knownUpdateInfo = { ...info, available: true }; + if (_updateInstallBusy) { + _syncHeaderUpdateState(); + _setUpdateDialogVisible(true); + return; + } + _updateInstallBusy = false; + const version = String(info.remoteVersion || '').replace(/^v/i, '') || 'unbekannt'; + const title = document.getElementById('updateDialogTitle'); + const message = document.getElementById('updateMessage'); + const notes = document.getElementById('updateReleaseNotes'); + const installButton = document.getElementById('installUpdateBtn'); + if (title) title.textContent = 'Eine neue Version ist verfügbar'; + if (message) message.textContent = `Update v${version} verfügbar`; + if (notes) { + const releaseNotes = String(info.releaseNotes || '').trim(); + notes.textContent = releaseNotes.length > 2400 ? `${releaseNotes.slice(0, 2399)}…` : releaseNotes; + notes.hidden = !releaseNotes; + } + if (installButton) { + installButton.disabled = false; + installButton.textContent = 'Jetzt updaten'; + } + _setUpdateProgress(0, 'Bereit zum Download'); + _setUpdateDialogBusy(false); + _syncHeaderUpdateState(); + _setUpdateDialogVisible(true); } function handleUpdateProgress(data) { - const msg = document.getElementById('updateMessage'); - if (!msg) return; - if (data.stage === 'downloading') msg.textContent = `Wird heruntergeladen… ${data.percent || 0}%`; - else if (data.stage === 'verifying') msg.textContent = 'Verifiziere...'; - else if (data.stage === 'launching') msg.textContent = 'Setup wird gestartet...'; - else if (data.stage === 'done') msg.textContent = 'Update installiert. App wird neu gestartet...'; - else if (data.stage === 'error') { - msg.textContent = `Update fehlgeschlagen: ${data.error}`; - const btn = document.getElementById('installUpdateBtn'); - if (btn) { btn.disabled = false; btn.textContent = 'Erneut versuchen'; } + const progress = data || {}; + const message = document.getElementById('updateMessage'); + const button = document.getElementById('installUpdateBtn'); + if (progress.stage === 'starting') { + _updateInstallBusy = true; + _setUpdateDialogBusy(true); + _setUpdateProgress(0, 'Download 0%'); + if (message) message.textContent = 'Download wird vorbereitet…'; + if (button) button.textContent = 'Download 0%'; + } else if (progress.stage === 'downloading') { + const percent = Math.max(0, Math.min(100, Math.round(Number(progress.percent) || 0))); + _updateInstallBusy = true; + _setUpdateDialogBusy(true); + _setUpdateProgress(percent, `Download ${percent}%`); + if (message) message.textContent = `Update wird heruntergeladen… ${percent}%`; + if (button) button.textContent = `Download ${percent}%`; + } else if (progress.stage === 'verifying') { + _updateInstallBusy = true; + _setUpdateDialogBusy(true); + _setUpdateProgress(100, 'Prüfen…'); + if (message) message.textContent = 'Download wird geprüft…'; + if (button) button.textContent = 'Prüfen…'; + } else if (progress.stage === 'prepared') { + _updateInstallBusy = true; + _setUpdateDialogBusy(true); + _setUpdateProgress(100, 'Neustart…'); + if (message) message.textContent = 'Update ist bereit. Einstellungen werden gespeichert…'; + if (button) button.textContent = 'Neustart…'; + } else if (progress.stage === 'launching' || progress.stage === 'done') { + _updateInstallBusy = true; + _setUpdateDialogBusy(true); + _setUpdateProgress(100, 'Neustart…'); + if (message) message.textContent = progress.stage === 'done' ? 'Update installiert. Die Anwendung startet neu…' : 'Update wird installiert. Die Anwendung startet neu…'; + if (button) button.textContent = 'Neustart…'; + } else if (progress.stage === 'error') { + _updateInstallBusy = false; + _setUpdateDialogBusy(false); + _setUpdateProgress(0, 'Update fehlgeschlagen'); + if (message) message.textContent = `Update fehlgeschlagen: ${String(progress.error || 'Unbekannter Fehler').slice(0, 400)}`; + if (button) { + button.disabled = false; + button.textContent = 'Wiederholen'; + } + _setUpdateDialogVisible(true); + } +} + +function _isUpdateDialogVisible() { + const overlay = document.getElementById('updateBanner'); + return Boolean(overlay && overlay.style.display !== 'none' && overlay.getAttribute('aria-hidden') !== 'true'); +} + +function _setUpdateBackgroundInert(active) { + const overlay = document.getElementById('updateBanner'); + if (!overlay) return; + if (active) { + if (_updateDialogInertState.length > 0) return; + _updateDialogInertState = Array.from(document.body.children) + .filter(element => element !== overlay && 'inert' in element) + .map(element => ({ element, inert: element.inert })); + _updateDialogInertState.forEach(({ element }) => { element.inert = true; }); + return; + } + _updateDialogInertState.forEach(({ element, inert }) => { + if (element.isConnected) element.inert = inert; + }); + _updateDialogInertState = []; +} + +function _getUpdateDialogFocusable() { + const dialog = document.querySelector('#updateBanner .update-dialog'); + if (!dialog) return []; + return Array.from(dialog.querySelectorAll('button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [href], [tabindex]:not([tabindex="-1"])')) + .filter(element => !element.hidden && element.getClientRects().length > 0 && window.getComputedStyle(element).visibility !== 'hidden'); +} + +function _focusUpdateDialog() { + const dialog = document.querySelector('#updateBanner .update-dialog'); + if (!dialog) return; + const target = _getUpdateDialogFocusable()[0] || dialog; + target.focus(); +} + +function _handleUpdateDialogKeydown(event) { + if (!_isUpdateDialogVisible()) return; + const dialog = document.querySelector('#updateBanner .update-dialog'); + if (!dialog) return; + if (event.key === 'Escape') { + event.preventDefault(); + event.stopImmediatePropagation(); + if (!_updateInstallBusy) closeUpdateDialog(); + return; + } + if (event.key !== 'Tab') { + if (!dialog.contains(event.target)) { + event.preventDefault(); + event.stopImmediatePropagation(); + _focusUpdateDialog(); + } + return; + } + const focusable = _getUpdateDialogFocusable(); + if (focusable.length === 0) { + event.preventDefault(); + event.stopImmediatePropagation(); + dialog.focus(); + return; + } + const first = focusable[0]; + const last = focusable[focusable.length - 1]; + const activeElement = document.activeElement; + if (!dialog.contains(activeElement) || (!event.shiftKey && activeElement === last) || (event.shiftKey && activeElement === first)) { + event.preventDefault(); + event.stopImmediatePropagation(); + (event.shiftKey ? last : first).focus(); + } +} + +function _setUpdateDialogVisible(visible) { + const overlay = document.getElementById('updateBanner'); + if (!overlay) return; + if (visible) { + const wasVisible = _isUpdateDialogVisible(); + if (!wasVisible) { + _updateDialogReturnFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null; + _setUpdateBackgroundInert(true); + } + overlay.style.display = 'flex'; + overlay.setAttribute('aria-hidden', 'false'); + requestAnimationFrame(() => { + const dialog = overlay.querySelector('.update-dialog'); + if (_isUpdateDialogVisible() && dialog && !dialog.contains(document.activeElement)) _focusUpdateDialog(); + }); + } else { + overlay.style.display = 'none'; + overlay.setAttribute('aria-hidden', 'true'); + _setUpdateBackgroundInert(false); + const returnFocus = _updateDialogReturnFocus; + _updateDialogReturnFocus = null; + if (returnFocus && returnFocus.isConnected && typeof returnFocus.focus === 'function') returnFocus.focus(); + } +} + +function closeUpdateDialog() { + if (_updateInstallBusy) return false; + _setUpdateDialogVisible(false); + return true; +} + +function _setUpdateDialogBusy(busy) { + const dialog = document.querySelector('#updateBanner .update-dialog'); + if (dialog) dialog.setAttribute('aria-busy', busy ? 'true' : 'false'); + ['installUpdateBtn', 'dismissUpdateBtn', 'updateCloseBtn'].forEach(id => { + const button = document.getElementById(id); + if (button) button.disabled = busy; + }); + if (busy && dialog && (!dialog.contains(document.activeElement) || document.activeElement.matches?.(':disabled'))) dialog.focus(); +} + +function _setUpdateProgress(percent, text) { + const value = Math.max(0, Math.min(100, Math.round(Number(percent) || 0))); + const progressText = document.getElementById('updateProgressText'); + const progressBar = document.getElementById('updateProgressBar'); + if (progressText) progressText.textContent = text; + if (progressBar) { + progressBar.setAttribute('aria-valuenow', String(value)); + progressBar.setAttribute('aria-valuetext', String(text || `${value}%`)); + if ('value' in progressBar) progressBar.value = value; + progressBar.style.width = `${value}%`; + } +} + +async function installKnownUpdate() { + if (_updateInstallBusy) return; + if (!_knownUpdateInfo || !_knownUpdateInfo.available) { + await requestUpdateCheck(); + return; + } + _updateInstallBusy = true; + _setUpdateDialogBusy(true); + _setUpdateProgress(0, 'Download 0%'); + const message = document.getElementById('updateMessage'); + const button = document.getElementById('installUpdateBtn'); + if (message) message.textContent = 'Download wird vorbereitet…'; + if (button) button.textContent = 'Download 0%'; + try { + await persistQueueStateNow(); + const result = await window.api.installUpdate(); + if (result && result.started === false) throw new Error(result.error || 'Update konnte nicht gestartet werden'); + } catch (error) { + handleUpdateProgress({ stage: 'error', error: error && error.message ? error.message : String(error) }); } } @@ -5926,7 +6734,10 @@ function updateStatsPanel() { } // --- Start --- -init().catch((err) => { +window.api.onPrepareClose(prepareForWindowClose); +init().then(() => { + window.api.signalCloseHandshakeReady(); +}).catch((err) => { try { if (window.api && window.api.debugLog) window.api.debugLog(`init failed: ${err && err.stack ? err.stack : err}`); const root = document.getElementById('app') || document.body; diff --git a/renderer/drop-target.html b/renderer/drop-target.html index 5c8216e..399dfd1 100644 --- a/renderer/drop-target.html +++ b/renderer/drop-target.html @@ -18,27 +18,51 @@ display: flex; align-items: center; justify-content: center; - border: 2px dashed rgba(126, 220, 255, 0.5); - border-radius: 10px; - background: rgba(22, 24, 28, 0.85); - transition: border-color 0.15s, background 0.15s; + border: 1px dashed rgba(186, 208, 252, 0.62); + border-radius: 8px; + background: rgba(35, 35, 35, 0.94); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.025); + transition: border-color 0.15s, background-color 0.15s, transform 0.15s; } .target.drag-over { - border-color: rgba(126, 220, 255, 0.9); - background: rgba(62, 167, 255, 0.15); + border-color: #bad0fc; + background: rgba(51, 52, 54, 0.98); + transform: scale(0.98); } .icon { - font-size: 64px; - font-weight: 200; - color: rgba(126, 220, 255, 0.7); - line-height: 1; + width: 54px; + height: 54px; + display: grid; + place-items: center; + border-radius: 8px; + background: #2b2b2b; + color: #bad0fc; -webkit-app-region: no-drag; } + .icon svg { + width: 30px; + height: 30px; + fill: none; + stroke: currentColor; + stroke-width: 1.65; + stroke-linecap: round; + stroke-linejoin: round; + } + @media (prefers-reduced-motion: reduce) { + .target { + transition: none; + } + .target.drag-over { + transform: none; + } + }
-
+
+