From e0642702f388ea16089a1d4a929728fa69457d60 Mon Sep 17 00:00:00 2001 From: Henry Ruhs Date: Thu, 27 Jul 2023 10:38:59 +0200 Subject: [PATCH] Next (#778) * [Bugfix] Add back the support for --many-faces (#771) * Cleanup many-faces vs reference face, Fix float on reference frame, Introduce globals typing * Fix headless * Fix attribute typing error * Bump version --------- Co-authored-by: Barak Segal --- gui-demo.png | Bin 26952 -> 26718 bytes roop/core.py | 6 ++-- roop/globals.py | 38 +++++++++++++------------- roop/metadata.py | 2 +- roop/processors/frame/face_swapper.py | 6 ++-- roop/ui.py | 10 +++---- 6 files changed, 31 insertions(+), 31 deletions(-) diff --git a/gui-demo.png b/gui-demo.png index 38f1c633873ea7fc89b03b11af74306c0abc99ac..59b24c592fc13feef1439f61e739b14206a9c57b 100644 GIT binary patch literal 26718 zcmeFacT`hr*Ds3OUVv>uL_|~sqy)AgMOt(#B3+8K06`%jB!JRuq9RxjkQ(V00#ZXu zAfZG==|yQF2@nwiLIOxjfFy8&?ESv`9p87yxc}Vo-E)qAFfvB6*7MByduCsAO`hH` z(c|BDd>zY}XnkDI; zg2n&7XYV!DPXSaU(Q8JRy%@ZqPV7q_5_(pcWtp&hPj~nvtC@8|^JacX0=pm`oK;|; z;XmCsMetn@okZMSZ(SA7%+BGMb^-G^-7*{BILM@pPpe>yb+t)E;CkGFjl6lpHa@JCC_$_+bA2^a?2;(OC{KHC>f#h{!4%6)In z0F*z&UT~pN8xmNS;v#!ienV6B?DRI<~Qsk5Bz744DH_HNr!c-YO`6QyS~c3Wh2SDRpB>ccAA7()MHCT{qlq z=lT+|Yw(tdV-&~r2oK>(Wr~D*>P*6HYRCKb1GtX+(a);h-G$1K%Wne~Wj?>NiQb3l z*t}1pLuq@_=c$a>hRV-)_mORpt}a+ZyqnT?MKPb$ZOB;OZS6vysiyI{ngF?hH(9@R zY89pkU^*(?Q{z)a+)^*+QXiF=lvyOa7Uko+^uYydfCu+zCyE43y)e|XcddnF`5Qh4 zO^~qmyd~ZO=px^p1cHc4?Uk6OBUHvH+mDaWNAS2iQL*G z^Hg(ZSm*1be0--~!>U}$>)!I`0G8NEg%-Q~JzyxmYE-r?#*G52BvrtQpJA3n_w~5- z_n3xfy}gxZ1P@8OG^J(Lw`&y+NYY{v>ywBQ1qFq5 zOTiLrw4=G5o$N5)Ke5E2<~Ke*KlOYCk2|N6_o+=$s?czboM*13rtv-gAuLxz$+V0-Z1Mix4$kOM#>~2fVet!=w zN-hBMwzEDLAm%wmtWe2x=-t0`A*0^;v=}s`KtXw6>64%D@{w$-w^ljY=XmGu((5L% zf8V~5>Aqv0YXZF;cMJ)+#-c_bd9EC=$BmTMRRXE^0xa_HnzHE))Erv%-e7uzR0bHA zdH0@D)28Hhn+JG=g;-K##XM8Jua=_Sdaa-uHAk26D&c1K8Usg*q)lPdc+_t6nbgAb?GCtjvLBTLerDmdW7ntEUH_F?C} zd-uK9B!;kdMbr>vnBHEW1>p9*!`h9Lc#`mXjcLK9c{fj!RJ3E<=6>hnd!$FD4d$6< zM}cpicY1$+*BW*0Jh%9F=GtzlD%0r_|Lr|_-^VK_@Y zjaVLgoQwT7rqu&I6Kz`UxyC6v?YYI+Zp|w*Bo(g8$u+fdM}VyCnm03+cgPzT{#ZH? z9}_pwleZfrDueTTKepnX-xTs`lY>56>{9O=V{g?`v;%MJvXv#ljQT9R^N83!zDxJN zW$2eLsWN7;H}y0HJmoy)iFRggq{_}7Z=J!(sn1KAS9;M7z2ADNO*Q=^d-?c&WY^EO zHC?l3FHU@n4LT8W)I_xXCr%jHRN!-09l-HbzjyVZ)8PTd)&|9Ohxz!v61c(B-941@ zDyp46F!pVnjt1Qs;4qLj_PNQYIGM*6|Iy{jI~AsnQ*xHBPYpkH+Wr+|eldg-VZQuH zaDgQ_(S}1Y7p_SHH9=nRrJJOMuE~W-!urj1&L?q5dppgibsoU&93L3gd2wN_P!i_C zKvxsKeHbwz1J~!{G8oH(P517+xOwwtt3%*$vVSVvND-<)w$l*UWR`4Cb|gEQnMSK} zXEE>cu7u_;8Ru67^6|A=%h#E5P(#ZfR96?~fU2-r+`|Hw??*^0dE(>VRJfFQ*pK`$ z%8!e{HWr4}(ke+JdedjN>%T>K^z3R{@1YvH&gDtsVkNATXn4jY@#f6H5g8!oM}$$j zDqym?C?)pF7IJ;PZ>FfN*ls%UO_sn6k;ne$goM*RGzmpR8k0q92X5S4Uq^b6kKuPi zV1ae87a5_%#q#+~MOqDkW2=LJW@`DjpSxJAzPJdgHmN$ObZ=B6Ka?%8D(lZiu-8Rb zohUxROJoa__rwgt*XRmu7Jx_=xA?M5oU2C?HU`aaB)1)GJ_)E3{Z?eN=CJ-IY`qaU z{#fy7i{di9l<2)Uv%U2VVWpqP)HIcV7~oc(CEgo9`b$iXw^3jB+1Mj!_QG=V5DC%ViC53BycM2_UvWv7g5#M+ys(95@npKxD0@-8avS;(_Kk16%aGJ7aQ2avYj zzB?7|4Be;7UQ-Eg{xdsin+$~^#`j*Q=khWO*yij;hpIk9g|f_LF1jWZZI}SpU(44| z4_ewJw|>?aT1d{qt$CE$e?dbFOA`IrpSZLPTmOY{Su%VD_JC9F_VGOAyAB*q=SkHg zPRY8rF*k2er|sKO-qv8^Yh%x(ayb6?O|h=ElN?;yRQiDRej+JI(ZtUKTrSQ zWmJgKor_I&zM1bRitD7#a;9Rw6Pq1?+vtn<-BPlVRmM>9? zWCj_E9sP1VB0d9YZa=|zx<~e=Pe<{@RM$y<(?EFUvvhF++_nT3WKcN2i=QCqu&gD^lQ->1b+C12d{_JKvz5a>D?oI-A2`dAEXxMfcTn*FY>P&nzq`qlz#@ zed;<8o+Q33_D($fG?n|qxpA4*p>4W0ICj1~q98qE{xfJHaCm70dlMdNu6A)cWqAQ9 zj(9OgSih>XwgO#s^adk}o0+>IeyMfq^`;H3RGk-LY_^(m@c`$|;5nTWdcK!=nlNzU zv1$qw;Hlt=o*0oK|3EOn>Mdc9zsLWC(p_QDvg$2_Qx^?s52dz%*O{4Nt6kTEz1oh6 zybMk$K+!MM87_4%G|Xx*tOg>I=jwwD2f9`<8J0)yXWCDnIsp@uhBQ(&s0Ji20&A?!Yw9 zL&wnU$t-)-0W%aFnjEU5K;`)PL*p{vkB;`i6q)L;m}__o#k-)pPx+ zuWPbEYbQS!no=Ok-c@FhPFVAuIPdhYVxJw8eJ?G| z-F=-D$v^9UfY@5+JQu;kUo-Q~KLZq@^#_kK20)PasP??;i`eGT95|Lfj|$`ZTw{`fLARz4wm>lWe9KQz9=QCsC33Fs5PIMV7h z8%D@>or*;EXMI@F zWpul5j^RiDQe>w0qfaG)KMvs)N8gwJQ$jda3S2Ko$vErqGt1&|xtfiY)S^%>f9guQ zE#Pt2gTZ6X+7hgRxk*okb8g1!P;ci?8AIAPQLW))-N82$?ADXDfX)H! z&2hT|c-l}iqO->fOr}yqK?=G|XU{SMEBn+xtCTOg@s1Ua1GQkq!|<$dTf2Ew^muIY zoMC4TwI#NSiVTheyns8;c9V~#*JU{dkfMEvZ7g$SI6!k`^=it-C`9DK#I}opqtfML zW8M%pD7z(BOuTh&F8plhm6OV#uGAU_N6LI8W92I}zmTF3IK;g3aoM$15xjPNT4yDZ z0iU!WElrrCsh@l3#ePJ@~ z*|ujRx=guCVI#1M^G(ty@5Tx8vuuvJD5a$aoRlb~bxzm$WI{tP-DM1f@o89jLeE-! zVPE@AE_gj~_5i4)yEEASVtrN-dnx^=@Kg!^NkP8xQY217OJ_J%9w`J_y=;03V*NK9 zdR;k~`9K;4Gr}#^xo6gLW)aE$Q%>!xm}^6Xy#EjiYO-V5buY(ihm?NA=^EgwooY$A zLlbxwu2DDYpFdQm+munoT6>I~OYlT1q|AzlI+xIw@$PSHOOTn_;na9hTf-(DfCXJA zDb(xv+KIz3tES1LljWd`W>UbQI* z43|w02$SOJl$7Am@#Txm1E9t1!sel&d$hHXwcX6hcU!2&)l#=mRnwAO%Q9Mxt0Q_3 zq6@5A&l@*uT3pj%oAp|};SsuS#+sASq`uyK5T;xD>DKOZ7bFAw+S0u}Qz|TgttuIj z1=MqSYFta?=|ySM2_m!_Myv;}&eX-Yjc2V1`g)ypKs(CG1rlVe!77FGeH(*$<6UG| z)oX`gI2|?OCRKkrPm10uqtD2pS*RzJ_SMyc4FlgquqVLKJ}$ehEAac)W3YRJ+ZJrU z2r0JC_@=aoSnJ4YcW25#kboEI)(8a(Q9k(rKbjU~;6>%6)-HWqTu=_5c4BPrnIm?$ zR?`_!T_1-z_f+%6Ncr%P*Bp7w#ej=}*o>fv(BhUs>G70l#qp;#;<503%BYnlBIHUq z=DAnUHXqzlx+Q=PT-OS5zR-}e=<6$HU4oXT>u_DSXpZ>G{1?ruoJp6a^ceIl`oY!X zo8*7|FXSV^I?`%@5t%}sc6lS-5azx++pbO9iTLU_nLb3yCsB|Dx%7<{3?qo;n?Gc! zSY;aGLXA03TsB7vf!E&*)lF~D4=2nI+q63x5kxEOW7Di8&@=0@%NM~d70PEuAS%rB zA{#@L{LUF|+j2Nki_6hSty}K>9`i*dHHc7hDL z>DFzBG2j*fmco~(is5I4Om+H~6uwLl2A;6HHLd~wLtO87Gr}a~1L_Vwv-SD1pa_|d zhzk}4-}`T`87=e?2^!n))26Fz@j%r=fPgViAynvj)t761!;hB#(=GfRI5b+*e1@K@ zxpacS23&DM0)A~+$(d|FmEvDlO8TeT{7uI;Uc~VaZTj^!?`;0>!zA`$ubT`1!LKM~ z#s4Ohtv$_h5j^zutwnd&e~EKbdZH_K@BPtrKt_w%!r;XigXrHM#p3=7u)oQqa1vMY zg|bBbGsgovqhJ0Elehgl#KwMji~8C(MY^(c7jQO)A@P8l;`PD4&t4rd4y5mIP(FYxg z@r2g6mWo0;ty6oheKt_%#c=+{hU?6(V6TB0pV1det#K<_e0RJV*7t#1Apu(wZ5d^+ zVr?~0V~oBS%4~_sLnk*lNO*1MBX4I5eHGhENMXTsE`8cU=2g7_mJ4QNcz6!#E-MrLTiYY)&# zY03|;6*3=3yc?dQ?x3uP&E5UHRa*F_K0C0Fbg--pL(cM4VwYD`s8$aggNKRBJXg=X z&fWp4U($BN%NIIIv9fye!oilc1W|MN`ns5R;Vhxh{*OGX39wyLs>+T}NUkh;$v(Im zZ!qDYX}=~UY+&Y&5Yd`8$KADYZ*RZ??J&Uc&kF3`2QCl!pXP3r7{;PdbFSVVo(uJT zT?EIjCxc(@RLx^$TXk};8#fF%2msOcR#uAf`EE?I^!0u0xDyEOOlqM6Yc%YF&$i$iREOo#L2w+ zJP;}X8e@4=OHqv<@O)+M!IgF-x8UoFe)(<62@!Bcxb0?ZnyJC#;dA>3a+#H8`OUr) zy&Ol67lekY{`iCT)*OvCKca!D4sRxRcF($#DeG0IcxHU=s^#|xTV6!hUldaywy z{ruta`bc_?D@8Tmw(7d8k-8P0Ja)O}%T`c7zhYAJ8Z%syCOy7T!I&7(Xxv?stq$t> z9k#qMJ%lqitF!R}c4lbHo{(1qkj^TOsG6_&btS&p=IpYzU=Tdc>09=3Od*%5GLnpa z6%rbkW#S&LFGM%1wk%Mhu5MfqTR!aKv0a14Df0=NJJZ@NmvUKHTb^Fv+FI=u5?;p@ zGgonYcz{tvH1)iyD=}Url%HLX*0M5KSU@q7K#(s3Y7j_oZX!KMVissv_Ix9}SS$P~ z`y}Rv%F!&Xo3d6W$cm6@&!g8{@4xo3FLZpxU#aNLEKD%-K|qS-)BWq71IMn43=VVn z`i{UNdlr{u%7cdg#6hkGvVv3^QpU>C{Rw95D?Q9S`{rKrQdI2B>@#Dfjp>GbXSo+y z5_v6#{;AC=^L26>y0dl|+bn|n%cXPYUd&1lpX>>FFG1Bz;_c@v!S?sV3^%vWSl>a;bSChehjdnb7Mp z<}Q&r5C{K8JA#>O1}S*XGbTep)G=ND${WW!Luvf^PEU*+%j{+~aG$x4>}7iOW`|4n z>lr2bLlJTkX^w|2&P)RBdMl^K*X;1viS@S+0nJ34KU~U-iZY~$F=H}y*L>~@gZ-lO=*hH$f>knTeBHcjm5pzsi( z^AM5qKwKxUC((oK_FxtA>$Hev5cu2@-rvyc#oM%!bVWVKjf6h!066pfYlqFQ&ohJH zUYZMSh*`VW1OVbe%~xSw#doJmAM{{UM4g(_1r|awWD~(9@yl_>FS2pQg+G$=%X4oR z9EcnI=;JU@eb1`>iZfm{yy!b4)f`j4n(Z{FBx>GpFQ4CU%pUjcWlxjw+pjxPE5G@# zIw*_Yjs`YNXpJz~-A50?iaE#kx5pyEox|snS+UQn9ln0%iNLeZ!5#7>JOAvA*KyD) zMI#O9^P!qr^DM%xcS$+k#9bgc@tTk{j_Fi52I#^(Jj;A%8hy-)h>tQP8+YM| zo|PXtc5$`k$}ZD|D&@@4d8JpkwrgFMQpisb_R_wxCX71CSk>)W{2s65@ua@w3=xvg z4{Z#{55D#006j}F7;@`_5Tt*@!pzE?MG z>&j3l46szGIepT~FU<&KA!)ikeM}}cEarObSWNW>>>y9Hq4HYO@)tM8x0%1$;5))h zUOZ_pP0x*a@)INop-p_nH#KNc(dFYSot|Rf*GVUI{wxVCFz}cJ%W`|%28ZfjPy>rP zf{M+v>XFGiE_T{lapkL?xr7s!pz9;}U;x$&2wHoMChE?=Kv z7#A;(B&t-DB=uIPR#_bjPFSLo+ww-r;esGpa!8yB*AIWws$0u+jSekai%EDIrx@Rs z=4oE#pJ*wcC2@FIQ$M|~=vJehR4*FmkmYDA34#`mC+}A5p3j3V(4NfG7TTJM&8Q3ulH!K>T6W_cic{;Kr%qd*A}uUdfOv$T6M`I*iRSJH&s)b_3|7Mc;j?? z`pDkov7ooJK>9I>pB6}c$u5;O9YT787Bmv;F2^0F`DGo_{cW`zOiRv`BBpdBQOO_( zyDQTiTw!t)=u?r=-#xS46@2bHBCEsxri>|A#pW5TlorHrjUE(FzyfI+C&Pum>l53C zgm_w+0BqUs>xBflp*ySR`e;|s33^~#$@cXh54C`S1xE0*Ycgha=x<{R@gmU!YW0SG z+-RQ-RD|f;V~-zgRo}9_e7Y<&oj3aMh46f%dM7{T#6Uu?X`=Jm5eV=l1vDPjKZ0-F z8Rs28iDm@etrvf~a{R&e*AX+;PlFgI$GLmOqP7;ozA;<4Vf>sJ#UM!<=7PU8QQiGg zGJJZRrl@s>N+&swU9NN_!lkn%rJ1ru;ez{6tf|13cF_7MB7a+4_3XC0*Xyr+JvDWm z-G4fmfn8jGB(VAB(otS)v=CzY0;e(u@%HH?Re(~4eX&ch&i!{6Yp&mO7o7U?_HojY zDXHJ@WnQ7ZfIV4N`re}l(Y+bd*9S|Uem3bsUb);ONe|iGa(eangNVFFhV|p|GD;Ww zu*QL(0VoA7ck&ETr{d-aY*bKgF2pxND`Z)pT`wfYM?TDpqlLDvdSG@6az(nOxB{H; z3?Jx%q#OvG3D#4!=3G9R;S-tB<2I*wZ^!*ByoXOeB7Xw%zg-ji?mus3AM|M**BdAG zFE31Fu^=o>@s`=X4Masigq9jT0C)F#>bPFmNxn)orrdk+tp{k_1Z&wVC24YU^x<4$ zhIXh+V=uAoYstZ?ZG1BicwlUG^aHT9j!M&6`|>G=%SKh4CsXoV!m?`_l(q!vow~z0 zm3pauihz`^Ri+Q$o$b8E4Yw8#+6Vc3Gup*aRFzQa;2%AnR-xDG?pE2*VnJKE9FD4f ze{y%2Wze|p!q*W53JU730A z0YFQAQKQU1(~S2ICW&y&l>l#qS&7I?0&6UI`*@r1NYbz-IFVuk>(+kMEGwY>SDMp2 zY2Dt&@m;H&i+&cq56j_T z!@bEN+(vxcPG1kmItuaySX{Nryg$Stqo*OA)BOuQ#?2SB1s39JO&skj3}mOtnuB&h zMZe8l`YR&iH>7rs^pVHI^D_~383)T6FtD5xHxt5*;?o`$*PMVm;);qK&scObFx?Xt zgNRC_v>N*Y59$lNaXX}oUm`~y9ofE_&-u%ZH-LCCgJSJDL#vX6PlEQc%|~@lG~UXD zEG;dYS2;iKvnoa|)8$;4ilJ&Ju5?kr>HFFXrP>nZ)Y`Fl1KXhHJ5y>-8Ajpon7&#w zY5D~9Y@^{Y9cp(^%ONiH6boQ4twO=-cj9%GoIjNHsBm#m>+7q=fh~ulk!=Mi3y90) zzY`M$e{jFtL~BmP+66eZyaZ@mQa!Jm4-c#L3#6)X)ATq2F_uHxe`>hF6&L=yJmmSk z4bPR4@im>vt!!lCc441aaeTqENm}mf$b-;5*{c|Ee{06ms@4Ql;`pPeJj+GeAXPpd z6=;-10$E+y1#&cui)(7`ofEE;ZyzX1LV4GLhT6;wcjf z$uSs8j#qm~@aj6x-J|M~norri`YXko&kVQ%t#ME>ZK1i5I*a|I1Qk4oO~YoT2dpQ% zlAld~@?pDANPqg!;M1F6yztFa0%ba>C3F0bYq^T(B)u+E2gON9zVW?A6ViprGZ*c% z7tVcGBm}`C|iAS)t6+tYWZCqJ-MW zZIKPOUGUnWs-p+1hzr~*T4*nah5Ip{Z(inu&*--xqAnTiI*>eOw|vHT zLme0JWgpJjW_sR2{i>8ALf=aRo}u;fAPgriu9>qix<7|7yE8IkJT0tw4iMbmj4msBE2^SxfaC5fY~bXP!1zUV@h?p`KIj zV$`y**G!Q7XycUAW{MYLc>y+S_%55S+EORcn|?>%V{AyOUFzhdV<1xcF?ji5pOzMO zKJVMn*u1+RFW6ddrVn`ZztV@C($RWZNJwwE?z!vSw`I36L;mIK+YjC2){ZFM8j%WK z>uJiyMt5h)pcU(Mcj<*IGJwCCRk=Zi5p;qYuD*LX$|xl{d2t*cuV=u*)(-4(oQDz& zc2aPvA&?!A|OBCIF1W?%r_syN}MJ6*M{>Ehw>AHL~?BJ0N7YI~{7(!fRe zV_Ie@Ub09tvviZIr8N9p6a`#k=_Qg;4|fw$3oX=Q6~ev7`uOK;^TQdOCd3{)^(=*a zG|H=$pSKBGv;`@FM(9s3Emq9RNusZs)cWB&5dJZiR$ecb^N$s6(()=6P4 zshj)ZlHA3bR-B-9tD)M7{toDuGY>mQ9MflkESA(H>mvGsKd^VaRWjKeRCD=gcfHv) z=0qO*^9ly+Uh1DxTaRq*6{;97*)2DoDra6Xd{JVMytLASeCus@Cb`!%&~1Y?R+csf z_m9gTc8eoLH=knueBbdQAXet)JoR2O7D_yX^EcvQw=YjX^qd2zZkuZT)G2gxzS1h~ zxb4Q^j@8uYf~f3$a=C3kp0u?2+m4A8dj#JxBId>kq2T7lb|j7nwuT{sP4Ob|oAva} z=X96Gz=GP!=9$ckjjj*#zgAl^JTv61PgszH1`7U8jmCj{Oj?fx|5(=b>HG|C$(WAx zSw7h5i3jWkQU2!r$}Q6TLLp8RwJ;KIi)`?Q&sfJa1lTy5uF{6=NH^6?rIrk|Q$8p{?shK6;>q{J6ROeiSh<hC{E}8k&hz7M&=T$b zwjLHkr4AmBFV8jNCk-8^Zs6QUkJ_FOzOw`!T!>2%MOwDM1$L{?ZlO`CKdF)RW>m@F zA0uB4f08sYX*l(Q4!P_fIi&reE~;~f#b|3_+w`+gh|9gP@Z`*k4puYoJSM~+Ri3%H z7)XaKFA!bYAIjx`D>g1+PQW~CHd5-}^9X=W?HcK`o71*crW;(;hWbJycV0SK1lQ@c*R@x*O{Y%kZ}dr- zefCZ=3e&>8?uRAfi_>#%&!0&BKB7-%K={+YDW$?YXBL*)WJz`)Nwii_a4Zm#sHpc` z5oxXJm5e8Q1ozaz&$4E!Bn|9zvi?hMfU2JIHNH<{ZRI_a|B?47Z=7QE2d@m52TZD_ z2HqR1ahjpU*a={bRT!oi5#GcQdcVtGq~$d95JHhIF!Gr-%Mhb+L0nknl@4OntQ82eBUkO?I zep*sDvX#7Y=-_n`f%*CI2jKz@l1uC;!6terbJos49?8{n#Ly54}}25qSQajHt$CuS{-&WnY~{&5&y~v|FBGlR)1yC?+xC({z^wW^P_#_Q{E+a-%S=oY}IB~&(00XkOWWea4IK8^an_r#5n1b4=g{V+ zt+>5e*Pej+Ej1ZiN*{J)+&lYclYJdBtx$UoE{g_$CEiLWxq$-_&x5a;q%+GiLcVOP zAKp<$kBQhSu}mCh-=DvX+%MdoQ3XugS&^Om0GKU<64sHD9E6(0f7rOBkF%iqfVLNF>${-*Sex$f}<2ii(TF|sdZ{n zfpaw=j8hCl&<~R;$0Sy{b#d2`=PPI#I0_9T25yNJtWUw?XMCDHBe zf3RzBXnB3E-7NRYM^Bew>jlzJu{hMgZCqQ@7Mxj}{|2^h=@HaPppJY#X8#GPkf3Q* zuc$Hym(U!6gD14Hm)6`nVuCH3v@sR~b=+haf@Mgu+ejG-;a>T&n4)4K3R$XVqu4jm zE!&gD4Y_QvAvd;)*1*n6nw?B)KVQMRKD>ZL1zKFtIprq5Vk0Xo|Kbqa|LlE-Ip*y+ ziG$@61-$+xj9!4Xb<5YqHEJis5q< z1&USuneZjmCLPH@PqtM+j#tI$lNLbxA&ZUrA%D+UaRq_X{|Tp}ed!I?8IFOKqAfs} zx|Vbz{52`;O;=FPL(lPH#WwxJCzIZs7i|4HoFg)&9FV(I|N77M(#b2S@Wt&tv>sad_n8?V zlI|2;M^TV*eU|h0d3D@GE@r==6T@V@Ywg)E}p56-BJ3V z!mm3e6g@r>NrBjMh0EEAXvi3u2;tCX#jD;SE)|!Vw)f$euDv8%25xpXx~xY~o>6}M zeU@qavFGDj(8MqaAyX|$lv=Gqat({Sd*;W2L-|a9AF!TyvkmV+p-q6`ign81#iJ^6 z2bFJf(q;3>wt%u`t8j(x?mJp^inC7)EZBB9% zcBr8)YNj}l@Pb@LcrhammjJ1HC4i^lM^tuSbS+}PY^IUx#{z z=(Ug?pf1YiiaXw6r!3IvGTL(^QppG#g(|CcGp`zt+$E?w8+&%_fMfaKa#O?WnB|SC zz&WZ}GV5gXBr?meyKY7!uRZnA%e(s>_xLD&!vtNvhmk#XYTxY~$5%dI3Qh$cy8h>H zPw$h*JZd~pGwy}S&LC~ffL$3m$oAs zX(eBx==EOhh_FF{F!n*{bq%XSvH23pu=PHh(F5u0^&~e)X1t!Q&P8WE95@ zW(d_3kEVE2mJ7v8uXVoYBtiF!hZEtrInclhzoN5Z7DO%HtfYo*$>>9*ROx( z95)kw@LTMiEpU0D}pj*BA7uFOsO4vt{BaX?RN#d+WnO;3aNXyzCdg1A(-{93z+ z{?L``P1Nx@C+g`YoHxQ{_eRiQ*4ljU zYz6jEZ1P8EkH;~NSSlVdpH*YH#2V!Rw_KmG- zW;Ncsc4mlr?6}9~=pT^eUg{t36t);qSM@i{W`rW0a<)|RhQoj27cqV4r&K&}{^E%Y zUo;K)8oF1!`grPH1kzAlz!LeNn)V9+h+Sj<;ohrCd}JK?3Sy2c=%=yT+;Gzt{PXjl2ly`n{w9R?>3x7-Wpl<+al#|-W1BSmP0Qb( z|J43}(eyWMyw88@j|wvINS*r)$r2lzNvpaZ2643WoNte%ROE zmv@*Mh`VclQ!-ZWKx7=ZS_8Lbu7vUe3i|Ewbt}e?+WcrCg(4K2+U)k2u>$;E9$6oK z>@%-!E%(f_*Co}x3N#~pc;v>r-)B@A39juIV&z8&;=-|ovhVLjzW#mmo`1rPpPd7; zcAe)8 z{I9W4zf1fCeDitSwVy(?IX~+8Pf|9!Kab`AJ!tB@`QJ08Zs+`3@E3-^#O9Z#{J$~| zvZi&$X%~qlxZ4FW*B{4;ML$r8JDiZ}Li8T?AR2cZ0jj#}!lQTNweCOIvT66*lsdZb zYhH91*p1~yFZbUsMakFgmZ7O5P1Q)XF`5_`aW!+vyq5EZk)0`NcOe;p+zI5!?Y?#WrTrYxj*LBa6&n3HX` z$gyXMJGMKl2cddX1PE$_vBBvkPGG_51-@MoTjtd=sxn4vPKr`F<(hszmnBYLYVnxotDtQ)Z^vh_~KdRE0$b(ZJa5lTi?!`EdgrFHH2P<*j(y9elQ*E@!d2V-bL zl|E9@958dI0*kc*1x&SYplVsr{Z?LBv6_&g8sCax9k&90!DffstMKOIJ%d%=WuT+- zWj9$xm}L+MHVi<5dP^TR4`Yk%s#@(-0a$kx$pP_qQvrERZBIrAq@ zkcS-r*dPN>9S<_ohV3bA>nv4c-zgH%pQZo`C+(@?F$Zbd88FatE5(FJN<}JE%xHR5 z>^ISt3|5sKu5UehtkU_@Cpu@aVNE~2l}Q7@9!0wCP)2C6?2~L`jN1gaZ9ZKz2`NB;6M{JcEg{0@&=>a3hcn$=NP0A;xqsXpmM)MEi z%kC|zk+Gt=c2Z%0R-@8LkR9xci>~p#3>PUt`9Lg6mD>W%ye;7t{t2G~w$U<7sSL|6 zI|@LbqL-q2p|N3TSGx*~r|q4?KHKsru5z>La{BKvQultoUw)jpr=ml z&(qyRHLb`(#>=ZBB^^OE0lv-gPM{-QFWi~={$<7&Q#36TQxsJO-q2JU2Ow2hKt>BI zDl@QRX3*}B#sN1j@aFl06D4v>gscwnK zds0fW?+}Zo$^rYOnU0M|cYs=#g&iBMJTyI|1|P;aU}y2ZMP^^Dl!wx!aL~a7?A}ZL zn?!3&IJH;rUe38z^*ir;YaVsqf;v>Sd2zl~>SQ-ssm&^Z@K^xC&4pse?xBqpnZya{ z8s9azFnmW?!8S1l8-r!e*1%{9s{xC-%&<~Ob}0Fi8YL>$VW6(C-O52nwko#cyDw~H zMzkp0&6LSL-aVu0jVC;PePdyP8>=#I608cwe4ZV|HwMg*Z;5(kLdMpHB#-X^{=2;f**g_;PADC}i9S z)bEdUIPbwnnBse{ugkl^u#*;H49JzTNYDRbu!|xh^N|0EK}d%@=u3enV0*C~Y~a|L z(Q5wNr4T8FNaI+l;Z8|2 zoI&j}Jb>-4CgfB^K~$=xv$NV1wa)*18R&qK@wR!W5QMhS=2+H0S~g?t zK6?*Em6vu##<{ARhhW(Oh`kZTKN@|1PKv#p%cGSByr3pC*yn*$+{lt$_uL&B`0VG@ z*$5*Z67AH}$JbM~tJod@BBS4MH`CT57S2Ja8TJTl(D-^@T(MFsZF{l46gYt{<%M(*BNi9d;RVpmyGHFXn9oFz6V$nHwzL1GoewHp#oGUJ3I#REa3&6RKW4B@+q%KFls^0a_6*t z;rEhV;e+Ylg^~5swN_u9zWVd>8`*;aCbzb)Dws>GI+|;)#+qB?7x&qC6yFW#q>2?> zv*1yBzF)IFH(w3dJ~4N!*pQYt#aV`}W&A!2F94etfKji&HX4$2Ut2e~%tU{$fmK^! z7l)V2t3@JRy0*f*6?lw2u^a?=h)`8LPGDlw^k&}fGT)#7wC|e7SxiEj{!C7kxnYb6 zjbadU6FFU{+}B;Qn$Eu|Q+>dk1UJ$?)0hF&v$w{CKQD_f1z5>$7#d2W79!HpQ~=51 z-wlYM+UInN^VN z1^0kWXk7~C;Npu49H^M zwdK7vI%E&?x-YrWV}5!O`^>V%-dtW0QR6p~%zscIt8z#D-hZqfHu>%^y0gtJB=VE{ zj69@OlHyb_$#E(wNTAU1t`eSj%?*oN-fceQi9cr&sC4IecQJ^kP|Oyc2}i(VRVIp1pGwUv6|1lpFaIG~f-rpD9g^(JmZ_HpB9st%k9 zHws5AC*(YEEZ4p6Ly(28#|xcrVJ*Sr|1}AqU%f(ZnCvUA`Tk?3iF{_33NU)gf}B?_ z{j+A4)av~apEqX%QFVdQ I&MBb@0Q0uX3;+NC literal 26952 zcmeFacT|(z_bc(nFVSs8Rz7feGUG_xt|t+?iRk*4%Yx=K6=Y*7KZa?|t^!d!PL|W#{!{EmfA| zmyRux9?5uh)korcV(tgYTLLqklwD*EDE?imb_QLtt7bvYD67oVtRCENIU@= zvy|+)=Wqg3{fJX=1URTQ_?Vp1Rj%%1SXJG{jb1AD%#xx%@F>cZMu(SueH+(=CIj| zSaan-cD~tTXJYz(xyT|KJ#dp;(DJ70>nq|LY4}V&?kQ1z$SysC+(^zw?l$8 zn!_si4vb?pNr$1}Z;gpw@ZTk zkh_9%Vt9F8);-Dn{+8JHbbUZ8#-KSI86vzX>WVGUlFrKG7-48>@as<%zg+`I#2@14=G#cJlvHO4-y^anAEFn zZvfC+oKQ`ySxFHZ*_Ie4h2W{!0qstM%Gc+5=as6x7Zbe-83W+ZlW!)?Qn9B|re_h{ zSOOi?1q?1Y4|a8;kqTzr15&kjwd=`p7rKfvv*sjhG(j3h1zB6Am&&d#-eYL~a*`sa z$>YaARe~EGx_#c-shClvpo3O}PskBFk5a+TveoGAs(TgT+dQ4{&XEaMbj*wykOch-?y&pMmFZ$DM_X0RlzAsdydOo z3~}?j(^Vt(JY7}pv`eAO(EuY4tbMoPFFyJXR4-?$)-i;zQ&wz~tk>N7KiUBd6J1D3 zOG}H8yNz5A2JC+lk5Dk9X6r!9noFF?S@$;W|&LPFPuebJq}b6 zGrdA`cKP}MLsOR=$X;{bwz4kpXpj7q-VA4q^u=|4Z7MDY@X$03RH6hD>rDwy*UQpE z0j2tE3d%}x5*@{kF&M_5+{Kml$8c{=rN#$)Dt$y{W#v8V<-eJjwzLmF=r}d7&<01MYvF)?SQBy#Vzqd5%~#&0-B}$U=Qz@9p7UTYAh0zvpH(qA?ZL zu0F116_ek}yBgi|&wHUYheYTz0SYOsngq$)^g$_6Mf&a0woNU@pzf`E836zjgYnV= zM6p7+({x68RXInhI|1ciACx^!(G&cT^{ zr?kl2+0nxh?iiq~AUe1{;H;w^?5#~s*0o<|Vv5EZ`|(gXade#M>NcB_6l6&z0NQM8 zve(Z$O~WchQATOTc$clj)TyCCx#^eD3-dl=iuy=N3Uqrn3)QSWwr7B+&Qn(P=BP?F zlst1!<6O(9C%N>gS=XUf3&M1B3AmDIix(FzO{5=8qup_-UIc8fH1UGxda`Bq+MNC+ z9z(RmU5#=DOTvW>Plr_2Bb?9Bu_w_)9zPwS3cPUY-lE+0_%f&^*h|t@!>AVW?41{_ zq*ejr>Tgr36poLeX8GQvuGFmmjw! zC&T36T-~Q|Hr+lfr#D8V$6DExrda_BXMIRIs_GppW1{nhn4^`Iwt9~>;^&4cT>I#y z*ZSS2LW<4f7ndg=Cp_;ETyfWoyg-~ zT+y15__n}nk*BCDX8|`i<3=-UQ_)kh;pRH%`C>YP%aMBSV^CsOoUclIv2O4P9l<*|8_zU2`UMqEMgCqo1?bPpeNgtHrHa%#Gp4-i7pj%+h&& z#8LD8LO%Kszk0!B^La2%Y-p@0%A4s0G}KuXDh3s&$(CnY5&i3*@2=?3sAcuCryxwG zPXb!$@QM>DG1yCKbAlZ4NYkQ@BPN^qmOk-cFAZP}`d?Skqn}HwP5WdQQt_5cirLp_ zZzW1)Ntez69Xsm5q~)2`O@cjFJx~7?(sw09RXf9Oy0XqM{#UbcOF08QaFBuiBF7jo ze&xL&smt}wH|;@DFHlBD_U7{4!oM8U9zM=?nKTP8>N6LZ+YCj)YV&sCLL?+fh>`*c zaMFgeL$q4d+$qj}<%`S3tAq6!z7fRG>2LpFE3+Oh$Lo#grSaLV#@^WJWK30gpB@qY z1?7{5(TV4!ivT(02k+?~5dwA5ehhQSg&6t!9R0Azs2Pu35?2qkpoF8VLla-pe zQ~b-APv66+9~*T@Sz74(={Xyp?Mo#S*{6$xvL2e@+n0t=My(xPZ0RC#_xiriL*m)S;1+_ez#e^|BK%0gF;_W~RbmyBGN$ZoJ#QsiTq0 z!<@(QyQ|I=6pGI*Ga|CM&r$$E+k1308h>~rpkpeD7v)sBTd-P!iC5s^lOt6%JF@*4 zDD0v86HIoW`m@VS1eL8)QjxK)gq=rtCwJ&Ws8U{#053-D&m@{xQBk z!-zVHk@VyFz{3_Nz}<47mNCMfiXzInR$dZTy58X*W(4ea^o##7HdUKkJ=N`sk8xFm zKQQdrP38h!aFbW@E<6uR^{`WK%K{Nqv05=YBS714{3W(-8(Q1nb6ux{dGT>rMUqhN z?C4b+w*D-$#f=dt<<7l=oo*-CWVh>7wX0&Bv|&6kPGGaS3UxVqy+dH&+bf`wZ{H}= zxvYQk8)G7l+t$*dv9oRd4WO~Jb}gUc{`TDJ@YBNS;7;td%SBz9A==JP2 z1TY+L=Om!^8#05r?%4P5e57ZGRZ@>b+Eh(%XJLHqmm9+6e@(eU{j|2^dC_X+P43cW`a`5H@Y6~n;5PhE#TZLf&@z~S zL^+E8YAQ@OVa(uzPX=vG>d@OptPHYDgSQl_doaNGpbq}-EXq3h9%ip%_xUFhqEkv9H21?Yce!!^N1G zp5EP`O}b_VDOR)wapV;SK@w`8#A2$I+*IU)Ba8>Mh<#t(=YIM1{;SjbY}GOtbVK)9 zKDxS}u?(=zI{Fbq>I?fEA|LLjLi^o+c5Oe8QZ8g9!Plbxko=>||9M7q zK~+cR^r@3_V}FNQxPG$t#y`mVWzM1Xtf#(9{(1aICw~kg)as8n{0Rkr!sDO0fsyC^ z2?c*b!Jkm@Clve%1%Cj-AJFs%G5(K-%YRmu{wFM{m2a(1M;3QutVrBlD_`M%DZNP) z2|OIEZuvaf{$&{bIL{NpRnn#ferf~v@Oa0oi#IDc9uBvkK{P&p2VA~GB=Xzw|snTw``mbfd3#y|!F(twO{A@ob_#--AYV7Y5wDX_8 zDN=-gEhU<9Z3~Q@y`}Li_!y-l(e-5@{dk>2FfH!anxSa;i_@nAj%@wtDKc3LD=Y+E zxw!b0aImu25GD2SS<`|)pNMzuU#SDztjPzTu*%(i*74`@|Ic-@*hj*x28%AYa2t)q zBL?p2?+nFHeMr>K*j?+dZi3!aQBzRr2z;g9Y}9!oyP~?M4N0 z2FrcKEf5%lHuUd2g!9_2)?M2)Dqd{!0k`w5Wpw<2mjD{=uvzgIJ2k`jo#Y-csI|O8 zF&cwH>KuE62el{eML}pkod>9ms>Rkr%&S?|JguXVsvXgi#EMqoA;lQzGD6VH%WS$Y zi6^{rRAamC1n;8}I4UmL6(PcDIVRS>v-IH|h!bHh>OZ!LRIs1rv@V)o40ykZkxatX znuC~`UdIQvWZQI_}UU&Lu3V7qJw)*Tl zr5L*z%OuB$GXs(via7WI?N3cOjXZtt5e* zY&elkYwkN+9J;rue{tN-*Xkqa2+xLxRxTy5H6JD7BklKov=>fO2j4ZtP10JbvnYXHF$B*{sN3oCXE*D?t zhR6{5U(qPB|78HHyMXM?8*3G<(bNvxSyfOgwHMo32^@CK>aP)slap@wQQ`yI`$m?t zB@$0yoEsb8&ig48n2BTOz_YevK2s`v(YLf)W2-3B?at}=#v@5_D`gEb;lllt?%vVN z*@JM0INgKqNgN{X__35jd5P|E4TtZ? z>rj>j<;Fhj?}RBAHdr&?xXoYD*E;VCiIvnPv`D=R%mImK0qBPDSJtElxcZ$dAx$ZS z?L~Z8)>J!{;^A^F8EY&`^udc6nJbp8^z6MAm?|H%1E`#Z;P8O{eW~u-92l}NmV$XT zMBLsuUDr3kQO-5y+(W0ew)^}znC09^f32EyV#J%o=dKV+(EG)4k9BWbcT<-ZMf@>uZf z6OmcEL@|xJ716@do7!UIBY%;8&Q5)$4BJ{ob>is#d1#8$|=Op=tsM=vhwrHT4O*P7yJv=%%Fb>LjI%QXnW35Iha^b0Yb1V5a-AuR#o zv3w?Z>oc?N%GO!UA7W?`K`|@A00Ak$UXMiNlJ29`A1rn{jzR`(IcmN3%v_7U&` zoLcx_?*zyqTVQQaOJIfkHEnEOe7{evu-urRws+<(Wxi~FDj`9d2n!%yQ<|7(dY@ke z`fGRpWQ}s+VoZ%Lhd&G_g7rzV^zdGc_R`jhyqC=9a+qoG5bgYT?gPL9fhpKdC7;)= z5Pnkc+_oom*FGLn^~kY8f^2Fk!o9XQ%~Z%v!ZL~fPW%O9|B4rn)Pxsp zV-`P}T{cR&rK=?a6+fwD63+3>Eab$3n-xk(e#bwds8ZbtU_{i5--xMsHP5vBk1aun z>$;wiIGXd=`G@A-HN#c@I1QdNZX9p!bNJ04hfSmFbl>kODOErGomWNm&)*lsI*&UB za+TNIR8tw$EI1#;qHtgRL`g)J$+l|CGP`Tk>YDm6VOlNXwB8hEZd!uA@PLyy5BlNf zkpx}0Q_?RDM^GP5CRM4RM`ZOwip37^Ot&H922)#uG$WbW3!)PHE7TBexyAlEq=!Jno+>-6Trk&h39+${*xqeGed@&O&IbCG~&(UUr)N!6|HO_NB4Usk*#5 zFSMh1@Vn_`hK-+^^_N@9gM6e_3?-r4R&C=9ZvLw!l$JJu7>Qh6qb&NGdF>@n4-b?{ zP|_sY^RC>$FBriv_ALRu1`_t4)w;4OABU*ZTHi;px4<3%%~;D3ojLR?!GM9(O@XtJ zN4I}t#eNZ_99(Zmcv*dMICr}A6-xoQe)?7Pf=x)zIf%vdw~{R4>YTC!_+f;?i;TkM z8wvV&{TwGyOce_dyeU@#XD-^W@W00EDnZGI+(iaG^}c=rfR0jh5jZtttjSK&C1C2Zszm0Ookq}x}J zC~U-~AWxyZ?Ke{ym5|<$91$r?a?Z$^Fu}Pzvi?G0<1%L`>1dNiG}z3JSUIskytHr{ z0@IaUH%+LJEz1hiP)LzX?K=TQ>Egn(CXHc*GbXq^ZR$yr5AW_^?xQti`$l}`Na58Q zcA}$~y^?Zm2W)0YU-iZ&MfGRU&gs~9)s;>j(6qSq@3H}6zxVE zwmz86D2QJx?g=V$sfN5o;JI?NVdvK4KuX10=+WDEs1@XoW0&BJ{=={oA;Bl;#{Ku0$^UK}hidgBCuAVy3A zB%3#Jy6u^SfQM6^rdv*obbJh4F8cXWP`AiG@!hC}Ysp=8Doa$l*~TI0dnl{~6!#_; zF6<0$`I-wJc5G7HE0|$_pJ^o=yOgDc4s@O&veZ{qHRb+O&J{6|M++O|jV@Q3mQ6vw z5cPui=tClLMkm#|&7OPmDwbts|s!(y2{5|SC*2{O5}4#@W1 z;Nj>Lq`Shp)}pg)Cm+~jkZ|a3aeI|@zJ)mD&5uf2d60ID7k2n+K)R*Fa3V{#RpD?k z1T&1h|AEGW)6HZVtF>llO%if8+`AVfReL@2VLPlc)3Li{qt?@ZfRN zjeEGc)Xr0Kl@Yf4uR*jl%|KmePshD?B!YP2JST%~avqWj;DEm!VjfN?A)j52Ysj5# zjcbZqV7RP{RHTzq-MO?+)b%}uI4?)*U7FC1Ypone;tR+huZruQ>dBm3xKY1s zDloq!&riGfpXwM8=d_xuKzr~3D*7&ZXL!14o6W=`)z>Tdrh{gs)xg^g?hm^Uubd*^ z-n;_K$D8)$8DA0Z>dTAY$R6WjQ^?&W`rU>Y1HoNI)zWWY+&c?i2_j2K2wA29GHTAq zETuV0P^JxZO>kO$nE+B^f9}*$_i&JdWo{QaFBs!JeqhqJGeHS&SuXF9unr`gvstvu zE+~kZM%__XmvrquW>(NtP>cOYzv4*KE0}b=LXyR7u9`QYw@bR``$Vf$!X2ty@Lb4^ z6S|aUnSrL4fc*oljE#L8cY_@tbIc;C=#dK-cM-1abISu7aJCQfjKfv7dEUEtc=btG z9>TU}rweKtD4-Q(a9(dJr77d^lgNBHNv`!oIYKEiCbNedXRAqQ4JuOZj+!pgA2cU**;0WqrNm&c(>q= z2seZqJhd)lf`$b_8}i-#yAkXyZxc8@Qmi>gJptj85ay)caV2IcH=g@+(%>iwPrWCj z)aQI(EB?db;dy}R6U9D0?85DYRrjzweGaMP^spMYy zhAR)7+w5iHRBu{g;FOYd<3aTd(2{%#=dyd<#G4rTqyN z`=+hFuEZ2rJH5c+Y}?jjeY)bruV}nYNAaJg^h{vcfUn1dFnK zLDD4<$mj|srL(f){3gM81~PbE`09(r$g~*S)>fwkpA9R)wvPC&IwNAu+;N=EMXa^l zucOANA#Ufmyn^!(l5joeS|8iquf(aIyte%FLA>G!*^1Tdio6bMpt4zqPWG6VG_jS| zj>c0>^A!2O6X~HD#de`R(9z51PuLS5Qnb44#GOfn=;l&kSF}L9QOnGr5X`ZWUuHK} z6VC;3sj4YOmh|)*5+~U=)S?_dnrcEU70@jr|*n@q;<$PzOo{&C|qDoxa?tRDV(&v@jQFdL|0KqYg$m} zTBJD5z;ZxP!kTJsVvaK@cNr7gkaD&if6z}PBZd{NHUnSa?TH9sq3ISPvsx6(ex!z+ zrakD|%rb9EUp}OOd=V>d#z$nQo1`QmN`~(^do?1m#CY9t@;hC}O;%@Trv_F9-H8u6 zwO`L6&hsKZ43}6zC#xU!D~eMrZ-2ZM;`Vs|MD|tE1o^7HVv)k8YrfnZJ5h8tymfTg z)O}7+qR>cZGXR&b>|zYf4}C}baUHfLa`02%kHY3Z-g)Nd{agq{dr z5@hT7;tOpq;4XF;#K5-`RI-S#o7kf97IOTPb*RUHFY;uM&t!M=h|fJ8?;rc6_~q7A zk~`dcpY6PwUt(sSh96;#+$;rg$2PfeE^9kTA51H>tJqmzK`cxF9^>3zkX$^~E|~#$ zwtSW}rWOLMR;zFs$;fyl{ruHDmk2ZX!Poe|*cC*GIZhdwb|v~o@_c$tERk9!{X^QU zt(3pH?kw67WN$=_0RB_(O_LR?gr7Zju-ZVSyqd`kuhpODo0hi?J((PU3r5e3eoLYH zJeGw+T)N%wp3vNAG`EZ7aM8Tzfboib!mVvxnWFwBHn$_s0)pwse+K>v0so&n$4+}- zjkR_k7iDYd7M`Epuvl(wuNaL<&fcT@Ey}{|X4>3Gze}`4Y{@b?I5YI3^jk02u=>Y9 zmSV*Dk<9*g7S*;RF=uTb&%PRBdRG1kdDK_+V42sf0{mF+ieL!I?BymXpXag6RW2+ zbfR7xZF6iLJ#h%m^;2hje3tm8!9ceJXPQ!#mpY|v&P+m)uoDwSApx4d_W>=jConYy zfm!F>Nvof)aX3oj3@-xK{}vSes+eLo&C5>!)hM@i2)pf}1r$^?qT+MniR&e7afjga z!vJKK*e)AV*hSQad#5@=&<)E00@t(aT| z;i@!uKN|jbgaMcT@7;xPe9`@KWe6m{+&T1X)z+IlmI5g)+06KJDqMOQjEfi`zf>7b zw7z&$b^AhZxwz1#Ac=t`mh4L^`js+D-pN%P&RFVSpbt?k$9N)>Ks1BeJX4&mWu=Q% z_vGchpSe@p2ErL>1^EH_flWf+j{Q!_%uBWw7c`;R8sRbzEV}zDpc2gz&!=7-A*icY z=oR;%BSnmu%ia=uT49sqf1DN`tu_tBElo>w=5#3rzmdsghv+<2 zZ@SAlHGWRDNzI7j(Y*{K@fxZ%aMx$p%yeAE>bK(v_jBfb9?=`sO{$#=%-z<1UZfD% zm6FVrW@|!^5Zw1KnjN&q|YlU7*82Js)-Ph*8*)ip|zE@@c9(OML9av zNaS!k>T#cbTWpa<7o}`=V~x6tlE6}L$q=eTGt#=Jmdc3J=;p8r<3@V6VM@)neC02T zW&V5cwGzkOS##gd=dz6zHMN!t=5;Ug(}S8j^ZlY^{3rU61_ErU9;F(_g&Hp0iGDlh zSkY!^{N;XbNkco^BW6oYO@M6wpXTIT_`Pu^oIA4YEAIUYdoRK-Z>DB!aw@1HX{uqU zBNC~ct?)t5M`rG2`mp$W`D3S3e`jbgxf1Ep+Ra8?91OBK(lARkf zI9m{%-o{b*`9pAj+jZUYK2+>7Mv*&=bTB-m;jt9ZAl5 zWL=LiXf4g8g*=X=Ml=@3xzqlk@P zJhz#bM{}ijT<`C|5x<++!lt=!PFv$$UapqTN3dIEAk2%!ysKnNwY_aaPYi~rrf0kD zu_s0kZ6D@_Y|a<+@a9g3$8<$R9OCe-e`2x`Y#m0ZStQ!@wpNaPKAY8?(=)lS{>q-i z_v91M@2uf%2?+2hPGWlaRa?GP5VxR3q852J^1sD4nQpH(ZKK!uGB>jQh%B@bOj3{mrK}d8H%8gF*BcJ>-7-5hHcW*IYiGw-acq zLfLud0?vB3jMx0)h7pN0wimU?Ip3;e+AIAwTK;<5@>P2UV}5aSkB5?2<{ERMZAdzRef~Y$}fBp^6uPe6P%c{e7b=s+nc4~bywx=G5uV$G%9G( z8y=L885#?{;YjxFvL^*e%TJSh;qZ6Xl64GlB(&KVPsAJsa(0-W=Ms)V*9xKD?6AGi zlQ6Zbsk&Rhwd$N;p#UnllZVr+n6?_KrghLuTDCpf9~*nW*(vw0)gP6TpO@Hb!_sqZ zkyu;i#R!7fIBqWwTmOh28$mwO=F*CFz+xmRqSu@<^z%+`jjGDSWb4UWuMqDKAm3yL zZ4RvZC9_<*9E*J19zyUE z3rajK!#bwjOI}%^B{r^CVtKAkH!)Ql6M#j-de6Hz-K1OsoYe>v7``qnyc9j&5JoWo zJW0$W8TNifo$3m){leSd+KRz8XTsvuQ|?FHStOR7Z z_G`6}cFvr6qWaHcJ;e5n-_P;8zM+F23p)9>1FCQ!I^} zSr`-qF3CTrlBOlTKDnKoQCXVgIp3$L9&$XUY=!@7qy*R0WQ#Dj0Gn%GOc-!E#*Hqq zo531+dC{BD`pM=zzVl!Ozht6LVm!NT)$at#7}hjDKQ%5K9^cgmK{7qPTnPHh@^>@d zqq+dwn&CV1N3%b|f!>vEPn!xVY;77+!HrYE=`WV2#WRjR12iFzZr%SS>YvN7{|ny& z-kTy`0cQd03gt2;6DXgJ(ys%@KYfTcvg)T;Sr@$cWIlfP(Xe?L?=Q~)5T<~Zslbe% zZ(cE<+wok*Uc-JX@G!F}cu~LK?u&Vu_(41D!7)quSKlib$1Jg4W={$}e_=GaL-Oct zKgbCDqkVd&7MR%%-BdnaH3iQ1F|#hX->~1N(xZ3uUu{sU3a8n4j#xk4%iC}f{%Y{) ztuWW$%x(pPoWJtnB<*9e%Q%THkcr$^i z^G40-2E1x?8i?3V@W1M8iO{^hi_G-wA~q@V`}8hPHkK>7@cnhrrPnuS+;G`5&al}S zLdy{Ep24U;MG{u#m#dMwowv@*=|=B6Zfm$1^h+;%rzK|Ql6%Y-{b)8YFjuTE=>f>eN;e zJMn1$LY5V$q(#W)2H?!+0w1%Yrl`MJ_N?i;Gow;^vJsB&l0L*3J=%5#sc#U)AMJIX z26bP`PdJ|}NOR>WnIAD+aJ%**A-5Qq5+euj7c3JOi7d{W50YZ0CH+^Wu*rgOhK99f z;*+R2gh`X+a(u}Q>e`Uvj%hi5B?>~?e7-|22+rvKVd8GLZ3qJo*%vR?iem~~a)&1S~wD2-Y@JR9^3{nPvhUevHqpNqh+&E1rasJ-5Lm>*`51;N?BUam)H@7GgV+PF= z6vap-^X`l04eX+kX7L1JDOVK#(5S!BjJ$+4)!}Ox(zsEv$fB=iI}n1Pc?_8E1r7Ud z9PV60OXU6*2> z5$yaiRB7ZlR%=i$f>QG%L*KyeyNs=tL4YH659BkExXO}U3moEpI7p23>VF+k@pp0{ zJD0uthGM3I?893xxnL;+{%P&L884t)+#SS~N&82gKbUR5mCBmzspP+t)54|>>Q|sd zrGOwbUq`DOCr|Og;N9;-8F%mPz8x-H5jMH);Vo1;^M80Ma;s`X7l$!bNySQju-8qA ztz*}SNQwKHAWL(^t(A4yj;Cv@VQ*2?I-G^3I;uzG9s9?`lf_JhPK*uf7|g_b1&K1TR6Yo+0{YD5k+_p*VNmhG+;b2&0@p74m;x2fmB%j*r5ta#S_^5q&Vlg$LWyGXu648e9h#o- z-o)Ri^?Yuwgvu4k-qY|#uJ2X&%#P{Ak`Fb};&H@bgk5{B$3pv)L(ea(U!^gn-TeEi zueq`9*;9vIE+Obf#XgnVi@V|KQS1Tt*vhKiTh(1dTT^NKMKswW8k zvx_m(igH&&d3^P&n6a=Ea)$TAvnObyQ9gjQFxJ)c)yY3TT)f7XBd&%-A9#USB$Kozp9EH&%q?p{s~kJ5SD4di5FkJlrwT zx{TSji8e-j-l5f8t*YJH)TG_o$lS)(%Qx1#Ds#jP?$$IO*!M#8X1!tYT%^DEPV9n` zzxils_`BEuY|S;W&86wNL7!nq|;l zO7b%2^V)cI60+lpvu<*O)i{N| z@m&=!PG35W+YXE=_E_T^wHzH^a`ik373pT2V*|K>ZVu#hhpyl_p4~g!JAXU8 zV(X~sZJO71_iSqOLN#ZM(oUn|6=5X}UdWPcaa1)yvVl98-SnUGG&xFZ!E!j!G#OXv zL#UyzAUV8(s#QW=VfSZh{B&96t1Uw6!{Z`tavX!&QZAinFC@>#?5dU{kQx`-#{?sI z<*uKwqr#=%|BIwd!I{tD0g_xcffY+=ZV*DqXM{tE2fw9){t9Ti_cUnnmU1 z6@jz+`P-HMU<36j>Ro3EoqaM`MOA#~id$8!)k1plkCCm8*4pZ5ANlIZ^_SIz&ReBL8jRvU z178qzmn$lNdEEDfbM1rOt77-G4?J-HIVU$G=PSKXht?csKj|L&%UGG)RRYXuJ)o&i zYgb$==Qw;&_91etQy2cLp6|K1QG7BhC-3?N>RHA%;bldG74O{W7T&2H_~d@@hS5S= zHVA-r6n!C@R4IOOpTxgN{p$cNY*b;S5(X>$*oR)$}M=W;c=1&05WY0T`en`gNPedbtA~MK z)PcH`<&MBfA?By%ANYKI%`Gk;jJSy?HuPcjdb~pg{*0)Q7J>`ef~LobPCnEvU%)~* z1foeG%Y!h&DDAYxsQknjeFoV5&iAW-jKWaQA`S>K3PUM&{p!!3hJV!a$0+`|!vB~^ zVVioDEa_e|>~Dc0b9wQ~aY8M4X8HS6GYc$)E7rp?ihb6DRoI~_`Df+7Vd_0}Q@GqbR5k)JQovxqHfWs5D6)51?jdHXHKEw4ms=vwY)yRL zp~Z@EEzk)EHzspD8JCZ*r~}j#HuT#lG`1AC8Az0AyIULu^MPk3Hj0aibN~e)krEZO z+H*zeK9F6WnP^2ss?gd6@pyyzK4NRND$oRPVI;tD+wFOtF-V*xj77J??t?~E8qi+^ zCQ+GYda2wcPLneSQ&pvI2hxk)8N~#EyLNhut@YAx_vE8-lT@I9&#)uf)hkbon^DTu zeKv!m_WZHwLa|**$3nt{;waf32YK&V^oQ1+3tPDS#(h{Y(@W)yWqk>K%~wg7aqR zH@HIRp~#Zo(`1)}C`oKiB%K|~pduE(vny$f&$2H#&(6O1_8q3`#}l$l&ixDd<^obueu-E^fXl#TN#>crMm6LPT*{>& zej_eU*D)U(Hwfdyl*nxw?%RtX(K#|7-J)=~&PY+muy^E&(T_K#PlgPSmNQTe+Yz&> z#T#@w*Fet`?z&qTm$T1?F%0YqOacxuYE+&|i?a%~02rbHhOPR^q7o(QessfCH~Sz_ z&BBIOf#%l1ZFdV39rqyNKE3PM0_gE_$EA}A?TQAP@ko1*U? z*zh%gnxR{As_xiSRV2ka*R=euOSSdgP>Qv%2*J=!G+S$w!=(113$KA#Ak|pC=T6qc zbc}>&&V*IS8n)k8#c{JWXTJ=BwnQyj9g9vKqJrlgrQe2_`H^_L%YzIEYcWC z#txmrfyXapJ3kubuY&aTc8R)$-1bjmn!3Ip0sy4aI!K{oQs6PO53n2=@%?_#hhlXLeXzxk8V(i zUKWEt<5`)^AMd-QqsM?%_l553-GFWtASWbVX$PK0yiJFD}cp$heDJ$|&7m9uIh1{uYo>o&ZQJH=U?QC5R7N z%|E#y6nf3by_wF)wV50k3-t$V2CeF>x>XoJjlE&I>3l=n7mG8FyKDNtc*^}J&rH!w z%}i+DIS2ueT3L6&f6aWq!t48FM+WRIc1`5G02y?8&9=v(Mt5eelT-dxJk~pt;Z(%Y zD|5SXhoPkp3+b)?XBZ#Cvp&|YeCMMuGJU4^(0zpsaI(Jec{OO&Z3y)L8(*gSv+*#T zn{yu&d}}{Y=uy`@f8#N#S4q2kU8`E1h4cG`cbT3YaHvI!`UZbw^faJ0TvOboq`&B> zb|~@(l2H?csq`1Hg3I<;5;8Rzm5+f(h6qX8FZzoHy3@STVfz(n9qjjK!&2OftOo(o zTn@R)yP{pIvH-Yg&!}il1LZl5(NU&vfc-`bBOf+B9ey%?zM-s{pkkVGfh7sdw_m_^ zFo9ty`F(c%rJbd{XLvnx^2|*@7Kv$o; zeLq8#L5D%7C{+0Ej$(38QZl&2=gkF`=x)zVKL8^2R4rY9?@{)y;8A)2hCYF0m%h0a zQd#F_)WGtZ^Ad$tY2DcCR?p4HkX?S-JGA`G;w2~-lpD$e<%M2`UV&bP@*6^aldEa1{M3NMwa+V97(?!L*xS)P+??yY{2Yy`UP75fMbdkL&s>c1%5W_mC z@{UD@(}N-Yz!z_Zs)l3+hW3zLG1!G(H~Ef|)j zl!$VuOV%tUE4%p#1ZYhT3;;M?WZUfRM<6u=1JWZ*obF;Hj~G;WaU)OaH3m#>b2@qh zG?SWx5|a(O8NYkdg_cb+F4-3~iXgrB?L|qJN`2a5MbuQoQ$OYa1!brDw)V;a-)=#I z)u;b0EdkR0*%>&c8{*Op1ONc=k=rfGc8%>E8)(`Qo4tcn zznPtJ(`mh6ylF-1AZ^6ikh64S00028QLt%j=h*JCGif%`w2|zLnzoZRl(v+eRnx|5 zE!OPpnzmZx7v>*f(Ppn{(>oPxxM>O6aI>dMZM@l;Hydy^;;h0Dx?unS06r@W5o{dW zJvPv^iGq=4XVkQzw54pQX=7 None: roop.globals.source_path = args.source_path roop.globals.target_path = args.target_path - roop.globals.output_path = normalize_output_path(roop.globals.source_path, roop.globals.target_path, args.output_path) # type: ignore - roop.globals.headless = roop.globals.source_path and roop.globals.target_path and roop.globals.output_path + roop.globals.output_path = normalize_output_path(roop.globals.source_path, roop.globals.target_path, args.output_path) + roop.globals.headless = roop.globals.source_path is not None and roop.globals.target_path is not None and roop.globals.output_path is not None roop.globals.frame_processors = args.frame_processor roop.globals.keep_fps = args.keep_fps roop.globals.keep_frames = args.keep_frames @@ -109,7 +109,7 @@ def limit_resources() -> None: memory = roop.globals.max_memory * 1024 ** 6 if platform.system().lower() == 'windows': import ctypes - kernel32 = ctypes.windll.kernel32 + kernel32 = ctypes.windll.kernel32 # type: ignore[attr-defined] kernel32.SetProcessWorkingSetSize(-1, ctypes.c_size_t(memory), ctypes.c_size_t(memory)) else: import resource diff --git a/roop/globals.py b/roop/globals.py index f7c68e650..3eca8d0d0 100644 --- a/roop/globals.py +++ b/roop/globals.py @@ -1,22 +1,22 @@ -from typing import List +from typing import List, Optional -source_path = None -target_path = None -output_path = None -headless = None +source_path: Optional[str] = None +target_path: Optional[str] = None +output_path: Optional[str] = None +headless: Optional[bool] = None frame_processors: List[str] = [] -keep_fps = None -keep_frames = None -skip_audio = None -many_faces = None -reference_face_position = None -reference_frame_number = None -similar_face_distance = None -temp_frame_format = None -temp_frame_quality = None -output_video_encoder = None -output_video_quality = None -max_memory = None +keep_fps: Optional[bool] = None +keep_frames: Optional[bool] = None +skip_audio: Optional[bool] = None +many_faces: Optional[bool] = None +reference_face_position: Optional[int] = None +reference_frame_number: Optional[int] = None +similar_face_distance: Optional[float] = None +temp_frame_format: Optional[str] = None +temp_frame_quality: Optional[int] = None +output_video_encoder: Optional[str] = None +output_video_quality: Optional[int] = None +max_memory: Optional[int] = None execution_providers: List[str] = [] -execution_threads = None -log_level = 'error' +execution_threads: Optional[int] = None +log_level: str = 'error' diff --git a/roop/metadata.py b/roop/metadata.py index 1de4d8409..03f321bc2 100644 --- a/roop/metadata.py +++ b/roop/metadata.py @@ -1,2 +1,2 @@ name = 'roop' -version = '1.3.0' +version = '1.3.1' diff --git a/roop/processors/frame/face_swapper.py b/roop/processors/frame/face_swapper.py index 3aa5257db..b8072076f 100644 --- a/roop/processors/frame/face_swapper.py +++ b/roop/processors/frame/face_swapper.py @@ -75,7 +75,7 @@ def process_frame(source_face: Face, reference_face: Face, temp_frame: Frame) -> def process_frames(source_path: str, temp_frame_paths: List[str], update: Callable[[], None]) -> None: source_face = get_one_face(cv2.imread(source_path)) - reference_face = get_face_reference() + reference_face = None if roop.globals.many_faces else get_face_reference() for temp_frame_path in temp_frame_paths: temp_frame = cv2.imread(temp_frame_path) result = process_frame(source_face, reference_face, temp_frame) @@ -87,13 +87,13 @@ def process_frames(source_path: str, temp_frame_paths: List[str], update: Callab def process_image(source_path: str, target_path: str, output_path: str) -> None: source_face = get_one_face(cv2.imread(source_path)) target_frame = cv2.imread(target_path) - reference_face = get_one_face(target_frame, roop.globals.reference_face_position) + reference_face = None if roop.globals.many_faces else get_one_face(target_frame, roop.globals.reference_face_position) result = process_frame(source_face, reference_face, target_frame) cv2.imwrite(output_path, result) def process_video(source_path: str, temp_frame_paths: List[str]) -> None: - if not get_face_reference(): + if not roop.globals.many_faces and not get_face_reference(): reference_frame = cv2.imread(temp_frame_paths[roop.globals.reference_frame_number]) reference_face = get_one_face(reference_frame, roop.globals.reference_face_position) set_face_reference(reference_face) diff --git a/roop/ui.py b/roop/ui.py index 67ec32a52..cebe6a20c 100644 --- a/roop/ui.py +++ b/roop/ui.py @@ -152,7 +152,7 @@ def select_source_path(source_path: Optional[str] = None) -> None: if source_path is None: source_path = ctk.filedialog.askopenfilename(title='select an source image', initialdir=RECENT_DIRECTORY_SOURCE) if is_image(source_path): - roop.globals.source_path = source_path # type: ignore + roop.globals.source_path = source_path RECENT_DIRECTORY_SOURCE = os.path.dirname(roop.globals.source_path) image = render_image_preview(roop.globals.source_path, (200, 200)) source_label.configure(image=image) @@ -170,12 +170,12 @@ def select_target_path(target_path: Optional[str] = None) -> None: if target_path is None: target_path = ctk.filedialog.askopenfilename(title='select an target image or video', initialdir=RECENT_DIRECTORY_TARGET) if is_image(target_path): - roop.globals.target_path = target_path # type: ignore + roop.globals.target_path = target_path RECENT_DIRECTORY_TARGET = os.path.dirname(roop.globals.target_path) image = render_image_preview(roop.globals.target_path, (200, 200)) target_label.configure(image=image) elif is_video(target_path): - roop.globals.target_path = target_path # type: ignore + roop.globals.target_path = target_path RECENT_DIRECTORY_TARGET = os.path.dirname(roop.globals.target_path) video_frame = render_video_preview(target_path, (200, 200)) target_label.configure(image=video_frame) @@ -273,8 +273,8 @@ def update_preview(frame_number: int = 0) -> None: def update_face_reference(steps: int) -> None: clear_face_reference() - reference_frame_number = preview_slider.get() - roop.globals.reference_face_position += steps # type: ignore + reference_frame_number = int(preview_slider.get()) + roop.globals.reference_face_position += steps roop.globals.reference_frame_number = reference_frame_number update_preview(reference_frame_number)