From 80f7ae99b9b3316a305d2281625b0ac30783c652 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Thu, 16 May 2024 12:28:50 +0200 Subject: [PATCH] Website: add Cycles/OPTIX/GPU job type Add the latest version of the Blender Studio custom job type to the website, as it does a few things others may find interesting. --- .../content/third-party-jobs/_index.md | 16 +- .../cycles-optix-gpu/cycles-optix-gpu.webp | Bin 0 -> 41740 bytes .../cycles-optix-gpu/cycles_optix_gpu.js | 317 ++++++++++++++++++ .../cycles-optix-gpu/index.md | 36 ++ web/project-website/static/custom.css | 6 +- 5 files changed, 370 insertions(+), 5 deletions(-) create mode 100644 web/project-website/content/third-party-jobs/cycles-optix-gpu/cycles-optix-gpu.webp create mode 100644 web/project-website/content/third-party-jobs/cycles-optix-gpu/cycles_optix_gpu.js create mode 100644 web/project-website/content/third-party-jobs/cycles-optix-gpu/index.md diff --git a/web/project-website/content/third-party-jobs/_index.md b/web/project-website/content/third-party-jobs/_index.md index 6fc4cbff..0c2824f8 100644 --- a/web/project-website/content/third-party-jobs/_index.md +++ b/web/project-website/content/third-party-jobs/_index.md @@ -4,14 +4,25 @@ weight: 30 --- This section contains third-party job types for Flamenco. These have been -submitted by the community. If you wish to contribute, consider joining the -[Blender Chat channel][flamencochannel] and chime-in there. +submitted by the community. If you wish to contribute your custom job type, +either + +- join the [#flamenco Blender Chat channel][flamencochannel] and poke `@dr.sybren`, or +- write an [issue in the tracker][tracker] with your proposal. + ## How can I create my own Job Type? This is described [Job Types][jobtypes]. It is recommended to use the [built-in scripts][built-in-scripts] as examples and adjust them from there. +## Installation + +Each job type consists of a `.js` file. After downloading, place those in the +`scripts` directory next to the Flamenco Manager executable. Create the +directory if necessary. Then restart Flamenco Manager and in Blender press the +"Refresh from Manager" button. + ## Third-Party Job Types {{< flamenco/toc-children >}} @@ -19,3 +30,4 @@ This is described [Job Types][jobtypes]. It is recommended to use the [jobtypes]: {{< ref "usage/job-types" >}} [built-in-scripts]: https://projects.blender.org/studio/flamenco/src/branch/main/internal/manager/job_compilers/scripts [flamencochannel]: https://blender.chat/channel/flamenco +[tracker]: https://projects.blender.org/studio/flamenco/issues diff --git a/web/project-website/content/third-party-jobs/cycles-optix-gpu/cycles-optix-gpu.webp b/web/project-website/content/third-party-jobs/cycles-optix-gpu/cycles-optix-gpu.webp new file mode 100644 index 0000000000000000000000000000000000000000..aae940fe9f1df1444cedda158415d39515c5ee8c GIT binary patch literal 41740 zcmaI7V{~M}76uyI#>BQYv2Al=n-d!o+qR8~opfv`6T4&k<=*@F=hf=ftGia6y?1>Z zXP>UGRiq^(Ac{ahG{r@fG?cjIo(e%gn1V&OK{(yjA+Eiysk8h zB2^b1A_O^t1_Pln(`3Lu-@ROYrD52-%u0v2G#l+r?3iCbf&vIQ>eFh}IJd{dlMpfV zDQ!%hdc8b>)#m+{5AUcQ9osYR;gx zJOF_QR%BLchktjxB7zg9pHkRrx0BuS<%lr6<_{Zh*Jka)$j$vAb5aK8=S7Rsar0Hx zm^FW|QUOyD%B6$G_Wz7rmrLK{OW@>3UZ-&e%iv@aq^;?QT|W>iITIIdb#g5$4Zny% zgl%*Zn4FPuG0EdCNs!(KWn>zioIUktOYn5{LgV;)qwVmxuL+Gz0y zxFnTs`1H$4ZDSWMRGTycSp&TJX#CqG%W0}Cx9tTFrx-zbxH{VkB#!pY0=bcEGfh3Y z=`)qz?|5rWPY)O!4FY*8UnZ0?A8{Fgr^CZF?ktemUR=lbxYgWVuU{E1Uz~+6GZO2R zW)w*yX%qmc>Q6WR&|YU&-Z#xtd^UykyIyzft(VK7GD?f22rr2rbN(Ph`D*rQX_UXQ zFT>vkYI>)B{bG2>{0ayDvN^+VTD^RQ=0jlNr&m;r_XTH_9)=!@M7GaLBmE6+pPJRr z@bYV&;r)$BTA&C<;s>_#yb>s~pfLF}xP%4tS)$lEnB( zSAZJj34rC9H$^!w9l;i&gM2IOlWY&?*!y(O-DDTHB0z6(y!d!Wl?Wdo5xqe&DupIB z|KajEG4@sU&+Mz9w+cyxKL4vb(!bw-l;FNBXL9kw_cQ4$`0McNUGr0U)g|(h=;>Fr z^WU=Uk1ViH!n7+N%`@+AIAmy`%`@x%6(K?7?uJWK8qN7ulw2(^K7R}RS62S#T)XEw z1vXLEgO{V&7btW158$b~Cr{WG!}W0I!Kd~`A@6XYEy_LD8rZm*m=gO!3%+5M;(RsB z-WTb-=vwa+(VbwCemAuXg81Z%&DUE4X?7gf=(9J}ndHuuGyn$Ow)aPiDV_r5AbK?Va*;fIh*A6t;b$`Eq=KR;Y z;B(!=$4rDN5jd6GOsP}B7gi^mFGPvH|Lyj9Fww^#=^9l86H(c{V9SNWvqx9nxVfD3 z+xhFB+<2S!k0T3B3t#>FIqnhg1;3=VELo7zDmAPZrW$*_*3d?HK5GF#7C;ZgM`cxF zEAr^zje6@Rp!(4%hbS(Bzov7?%F_*LX|%TjmK{sN=F9n|67mP9NA zVA|zneB@nm>&rx0=*u%;zgH&dE7jRhVVw-`>FH>)$kC6}d+yk1sabwG@;J-RcU`AW z@wfq8uXk52@AC7+e*j&8Y9i1A`h@7P?F>SX|4xo!I`#E6HC5@62?Hh1zIhq{{6C-( z(dnp-6ze5?B!N6qzsiBX&~k(aagAO$vf zc1h%^}gy zz{6m{7`?k!)~ym<=l6+Q+o|rY+6ouQrAAO)MP!ks>yQ7?4>GPct)|En5jgs3(Rx7u zu#3x~A2LgeSoD`@KtZ@rKwyn0cZJbSj9`d#vd?yDN#qgb9+t^lPJeb=i9fMz zeUZKj?$X~kNCKjwc1P}dJA3!Otf*bUUCFM3LSt4KL1lT}@0Uc8sGT=J+W#@2+&}jU z?^02IrFk{2@uTEP=>3B*4e7E@7>0(30*I+pQr^H)65}8IbPz>shF)~vAbX{U)j!Yt z%qWx`&JewP?Mg+?Or3v+D-bkhO@HB89WdBjXEwbSpZ?-rhbor?tL@gWewufw11iX~ zGM-dKIIX(5D}o0pg!j_u9D{jr=aWNl_Sk%r4Md6%)NURe*DYjTCV@f>EF}8x1Pp&=sE@|xJltqCC2T-R1qDd2iw2K;N)@s2=IA%lC=HwQ zDrZbh^YONUX#;<1EYyMj+iEvJ7|5hu?JaVM@bbDK%8NoPuY0J&YOHs1wBn0+UY4zt zock(W)6H11%9b-rdPV(kz_pXY^W#E^|63v;-=vhcEWgfSpkzg0%iodo!sTFSA)T0< zY&Y~MKoxjP+Bqx8c>|8+Zn^S$Ehi94&!;y0i3r-?8txv`42rFH`zuL4=rkl;zkC+< zXHIL%)EsQK$lq2{y&F=SG}{M!%UeW(gLI+&<{Stc`Kj*JWM%@nFJjD%ltq6XLnHs0 z&b9YQt=}hPI{1XO9VdnkXuk;l2~tdxWC2l`#5s%Km$r1(<>)bg19DxZOv_j`HghmW z|NWJx%JuCY|tNy|F*7S4!Q~+xBn$6MOI`=R|#43|Jk# z?9wG%H4pHrWd~69ud+&u;bG6_Kc<2pgVy50V3$b3=`JRAn}vc6V_;kANZAcs1R^g# zNd%r$V=AP~{^FEAY%YriT6>OM7$`JR3pGN#04RhS$&yP57xw4#yJG%%nysLE3w}%6lL^GVuST+HdVtY6Gmt^7;b2? z8fPm56^fr^_^=`COnAk?%YkEh8L=O~%LM&Xv2ezog~?C}L#0*M5#yDtQ2BJ0fbX4% zyA{Uars36}HcPbz1pA{{zrtH%pF9Egw`QrrkCAmt(O zvt_%U1if?1j?F3IuN~*kQX-xYXqyh}+NOI5(iSr$4t41|R=~d~P%ylm1~CB`sUtWP zy)D9kbZbH+#talckkww!m*6;?%vT~d3sFXcPfiAmidhy0gGMm7ia zh0MI8g^J0pr9aE>?0Kx{*flRDk0sdnBgn@*-PP#NV37QjC^`Iq+T(Vwd?(Rpcd7{n zHhWn`iNTot5>Af_r^!Q7<%hW-iZpJ-_bVhCw@*~4!C!pBrU&d*t&g_h!`pXE z)8m=jS?QjwA!=i}%^g`jg!dZ&m}u4vI7wf)$^rc5`=ERE0L$f4YYyt#1lS_fIeqHY zr30B8b|>LZu*nbcQAmhDDijkBR^8MD-s5ybi|!?mmJ*X3Tr0X(K@D452J zxXTo*G|s^J#q*LZnO??1+f|CfK(fv&`-gf9JkhLndvZB-TYJWLuz^^DM+!2gNZ>_c zLI;6z6rr*rXD0jxjqexq)65(mK2i3xA&?1#_~Fpd4t*$%wd)f;AfUu4Hp!@gFD=Ph9HUPhs4ab28}42IL_{T>ak-6u;Darf!H6*^;fojskhhcSZiO)~ zexi#lBYkm;i=MlS;l8e+)x1>TZrxv1{m?&eA12xooxd zwxlJ1=|$TcZM4;85uvhiU$@3zD;(ce#|3A#HAmxu*%09_Pzn&C^em2FUO8Y0LU&$d z=(~B9YB{Aic91*r>iX~xb|*Dr+7kt3LANoF)R+3Vn&~k}G`>}aSxMeA&08!NiTA)N za(rueAta9^T;R&`XVYnSMPVo0>Z_@ETKYBx>w^B!+F=rNkMQXahZ-Q#n7)Tx{t-12 zc+tQ4zv4J42&~Nv(q^4-i(|GjlSrb1dW9T5y! zD;UhACl3F+x0)K`CX{LTWj-km(z z;j*Yggb&B>G*z2~N6vzHb8Y!u9qC(!9#5L5?S=p3`@>-T2A{urEBJdZR{Vh$i_3W^mViu%&=q{Lfv}a}I_9~c zJ<3=9wdkS&a3=NnL!F^fQ`r<8{;>hEzpy+ghaK1SE<#7N_rHML5#+=@o>m^gpT%OL zbYJV-osnhd-`a73qF=OewqOE(Psw#Aq-$$biaBbU$|5MQoYuY9mov~-+RYKZP6kK? zo%az$od%1yfYgPDBgV0c`N~fi6!}P6p`Ln^8qvfC{T+uetKL{w0*5#3Xil6z?RVrd zr3L+fSjPhuDEq}YmzfvT(AFp&snD`jTMNArb_nKrV}Oc!nd_c3hd)M%%G}UX)WoAX zCtsWCPQubut@g(-3qV^~c*$aB*G~}-=N^?StJIyaHQvhON;9BE*SKXDR{jE{KTA{2 zAbiAmQX<6rQ>E$Q<>fVSd7RA1Y1lemP7SYSkyViQU*#2!^(xhhnq-x$(y$%Rl9oiN z(m7=()FK~(l-?hMmB4{^M$_+LphiW&)HYiz;Wh-%3_!FmH{eB~CmurGKq<*s^+agr zjA}vGYj)29!2KzW!CZr*?t=V*DS1y0)EO^Lw?Jst^V8`AeF)~`!%5W5Q_ z>c0!;5`ev zf*X)Lu%}hY)Iut?KSvjz_IVORr*(ISLc|4sO^rEa9vhvSf79Vf!p83m^6}JK0tCFm zICyJzcpFCB3u3CJLZdkbgfSbv!R!`JA%CfPF` z?Nq;kVU_Yu|FKj_M~k{G<6N`4>oV!RXpb=c%aN`ze~}z5aH`aoj-#H;;D7N%Q8@TI zv2b9nXj?y{iEJc4*gvx4D%MS>6d$e+ge8*BiP>sm`}q?vNl(`x0>O-uOt&QB(WTM} zF5S|?yN>Ygu->GW#m1XoE}uGMo}d{aJd9bR5;LDAWMlj3XKm4d(e5H+5mcx z8MQt|%4^;M5i`f1?@F;_;tA5)t6LGJ1-& z?`%zO1lMRYR1EU%(dl@)302E1k!=*k?p?F_tO*2nn6k(XEGDF&prv=d9X}J%G1smj zO3HL7gF0k{s4FWJ1SxYp?x?XT0 z0>4UJQ-^IZ@}qh?!{X;=RoE)NOvijDGU;MC1EQS2i#S8;3=k4Kh~JGFStsqZ25$v}T$t4GMyb{s1ZYb_MDyyc&Ebpg>ORnm9+ z0|$#UMJF*8r`pYvar}<*yOqDtt?sY4uJ5f(VOHW> zYKznC>jR{3&P-~uwnhVj5FK08MnsX@n9}ORgdtM)fnu5~DfPSbO4*r=k}4?&YN{{p5n{ERY}ECDQIio%U&K1}tOw5fJRrW3Gw)Rq zt;6{I@_k^)bFhwFzZv8Tc&~B*{b|3$)zxzamVRx=kPG=+ev*r~5X<*&35E|lU`z16 zlViT%+iRpSl$i6QRo`9lxbVq>dU5vRYQ=1ong-Q6Y_*tPY>(O0l7dGJLU{FLql!2g zEu5PFbwy=_byX;=+ch;p9|%Z2=6&osHR&&148bU3RH(?gI~PL`!r=@^UJyh41Xj58 zH3!ck3GO#X%za0bAMTwSc8QDjmj?QWK;31%oQ=QPlZ}Zfrv7rnGqq~wdxadmi(mI| zR62LEEDEu=2*uFL$X4HcHW3s=nC4ZnE3aw!-!wJU;wEK>7~- zKCSDG3bp2n5JP5(ox-;D+uB9cpx^5yV2^1 z;XA90S&bC8Pe+^#N}?v&Y_HKP0K1X0;}#t9oqMy6`&rLa^(R0|oa$?Pn`uhvf^?)< zqg4`4KvX@_hRlrVv2bi9Cf+vxe(SQKjY*YrtW0e#g@_s@_QuXhhu5r)J6@(tAxB@X zB?^a4y@914XSZ6Wp}MS@u?;5CbVl^eYz{N14Sia1-anMbVY?>2AVJxMk&&@zHLczbD7*s1D&;5R z$Uovud^XrnoB}1FAV@N%47~FLdzy@*41Z7J3AjHtL@=zpwATWe;oPy`Lfc(JA~jk; z-xhC@8N?aNRkUTcU7rUAVTpIefwqkF7|xjX`Ko>t|CLLq6w>Ew%?j6Q+S(NunX5kB zp22wC&=ef-^KTwX$Nf#o|5Ss4fm-38S$|Bzu6c?NT7A(pK|ooMSRyL2Rr!L_cdn;~1@P zTJ3wjh|cKIB0OqBHT7l%%Xw9LJoQaC)hie8jtxA`zSvOJ18!e!q zYp67|2fk`H)0VUcvas*zjyeP8en)656(C*xq;J%oB6EwZecurdFTO~oMa^;7IahB* z0RM)SC02R0R`^gum|0q7#iD`f%+5Z^a8u5EFx{-=>Qq4-vn8LF;!SF$y1$MV&D?`U z5ot$iO=hA{nLJI=l&EH&DW6WzQYy!1Z|Kk5aZj16UKHG!Dg3Q2a0_K*`X6S4nVnNa zFs!36e7xn;A_dYi(m(mDsgXNDr8c`HJ@W~ghg&@qcN z9k;(xP7b(011IK1A5)fX>P;~OGzflSw_BkI@wzY3mxrna_Djj%Me zMj6JDI(+7AELm$?Nb$2wL7*gX)7)g%jBDG-xa_5deyoQyG(nTL9+35?l8uzW&trM1 zUr}PKRqRNg-_{rD{2B*4>udGaU!c(?YrmfE-lJsaNm>N6$~RyR=QIKW15fgQk0q~V zU94E`uL|Sht5^cXOGr^OiQ@3KQs`c$$K{VO=CwhMkyn`kuO<#12(dSQ-#bX@uq)~@bFv?1#)KlH z)47xGwn;0#O0LCm`J-mIUKDT?wtQx|Fo8D6CEyFbsrRbQm}cu(L(4#^lBcZikaXP9 z(sYI=;`PQOYN`RfZvk7gOR((>-ikLnNuf?YD$}>!UUj^dhW2hiMIQ7KunPm^zJZJ_ z=-_d=s}w7JTV1_lVxee)iP$ap0U?&~(?SWFjV_uMr&6i;6kg2zO1jHg3sp7;VWqV; zSv~oJufypPRR)`{%kckou{bu!MnF9TRAh8c%BgM*M&yjj(|q7(sQQIp1V&F72XX<% z3;z4MLHT0m^+E~}efDFrQ-uuQpFgluXav08X#_**{9}!kbe2wvphkbkOs$A4YSd|Z z>L~`(g8uTX@Y9R|CHVRIn|#a06TUvIy_-2zD!!`+7I)lWH%dX=jqyXGoMkFtbxqVg z0)kUqP7ZyUdit55Mt#+kMXlm_pwJC8i-GuHWY4UQqTRi1uC$hV@im$DKXvnR-;v4n zh=(o#pO{_N6bQuSEoU()S*VsI=&2PheRNvZY1wOHALZn9FAHy%B0t>{3-bg|peWC0{bikD&l?NKPx6%wU0_5Rgx&qn^OBUDj$o#0EHI;+5A zBIGC-6l}IExELl$&hitR>eW`&K_;h~sA(04c&y2sc+ zNTStIGQqQo>!J?o0ka=sP%ABCYG_;DhOUD23{xzI*Yt)?8U9$9j{~l-;HD+-!8m2y6%Eu);ut)0!zTjVtcpf>a<;D}6Y5_(L z`G5Zc)I)vxkDn}0ir>4egoW!irI}1xF4BjRA#q?6;4vR-D&$OL(Cu-%8wd{lPwVZ> z3JkSuKf+G3Ct`l@RG#(ge)vegCAhM2*$y|qOL##0`XO9L@K$_LmoJ2f+UR1VWJX|` z2@Z|Fbg|lPbR^p|67{0&O{Pk`C&CLZ{QC1?9&`o|FZPEw`_5sgsBSOOBD2lPI6C!w z1W*5Xf*|SXrlp|L;`LD{ll`_n>SfhG_WLn*my^Auy8+Nd2Z`s^hnCoPtHU}e@~q2k zpg!l0gvjrMteg9Bvn0>{$umbZnSp=7qaCDWQxmc8tdBkZ8tnFWlMqOv1EW1eDcSxz z>ku)d?@K$pqbvS815Cer%`Yd+u(pqD$kXPEHo5Y$cZ|jtPRs7_C2~xI2;*ZPs5;2L zZbQd>=JXD0qURNZ*h~*cd|Jbp%${lCl@0>ht zeXItpYKlI&L~G`^muZWjaGD7QWJ($|ip||GlPt!7#~oX*)r1*?+k1%>yzwK4)ryOv z+R816+$tng&7Hc<=op!&hkeS5uCM7E^Ph?)jf!#;dB3x5kmo>uQqER(6C-B(tqQv+dg5^?KS9_F%`%U>uUkR}NG8d_#o;9GVTHWSu5&KrA{^ z_t?IIoMC}u%j+rMq9)I*r0!R_ZcgodcvmfYtQt<=F)Xj7nGw^!=kym_yRtCI3c4tv zROIB2{b5v=WNV?TAt3@;ib@4Qj8CzHTUD&57m4Gz%i}q$_u&r?%gmcyI>{oI^bIYwv$I7=pC`ZKyl@Ar>vEB`6DWp9uuERiy~ zC4&-V8I<_IaHtY5(y|mV=Gf{vkg*_9$*JV@uqzIg?;Ig4ytKTAL`&V%ZxEO}jv_1r zW2{oC7zrPaEl_vajRMcK*fqX;@tNR9iD(4e2@nD0Z%BB0G%nI)>M-+?^juWO}&(*4p|9JcJ0@1>oaV^uNFw{_#Zon||8lcaC zu`hUjBQ~OZ^hg$Q9)&ahfFy3uBm&=`N|ax=gVkAu;Y}l!yDyLzm(77kJj3E=LC4~I zTrc%PI_?~u3ffMn?6uQncJZiIx_TZ}+f-9#UsN+Xm^eVSxZCbEV6a+#XnfcH&s*!_ zG67SxX%#;TxpLCgx75as!OR7gZYI&bpeZtkW8Di&q;dA3ZR;^nBF_f91fQ}4iczWI zAW(panUV2cDVzcHxAV%>F6e&0DQDha_-IQId5Nh8gnaSP{eXDAqS5KJ=XEme46MUA z?*nJ}Kl*Z@+g@O*yVI*&TL!{=1lrVMl@6v-lird9gu&~ z@y+~ka?otPy`p_N`<{?NFh{0HK9d0qwkP|SDzO|hnLVHbn-z~G>m^C2Yp}9P05ul5 ze0HXSm!*$Oc+i4yWR9e022DR}u|`1BRzIjRB$q@~ioqydY>Ru!SdMK&U`s1fkTcV2 zj)zi{j_$>$q^zmgkkF`tJ@BQcqoVbUf$!sqqOXq#G{YGU6pTf^<0quU2=duEOixX@_Kc*J3l7hD!y+j?4n^Dc>H7R#lTWcrNy?~K^02)CDJZ}C*AS8!{$(H}ZdU5_0f z$+_jC2lMW($0DEgBix+a2)lV}s7JSvZB92<7bh|PF7%a6fxH-$9 za~;ba^`7^Beh$mY{FwL_MxHOtL zrh=yy_G>y`S8cf2 zJ*pZcm2yiO9KHi#RK7ZX-CitRJtSd0&W6Luzb&DRX&0> z^Mju4eStNhkUY4zIpZmHw89~kCaUg|sFzk6nlI>_^Ey7AV=8;Qi z3cE&eBj{8=oux=BJjbrh86yoWreFaP#^ZM0W~nPnOTm)&{@6=w99vjNmV9Cy z>eo(YIO28a+rXehKqX>YT;A_`@kUt2fL&dN#-xUR`U_#?jkDm%wy4!|igm*zIx_;c z0Ju?0?9vm^?>M*(4YydiO`@PrmX`@Xit%91PaJV$KNsVc!e%0~zWgVmdmJj-c)pml zdzPj)`}aMpYU6kBg`XlF<{3oKYErVk$RjDW5!)CiL z<$eMg<~U~S&scT-_EzslV)WZsS?|A5hrgJ7eJ%+~_6r$463@K8^hH-v?UvpVtk({Y zB|c^kzVCEn^ZFwl1}{GA$#pjhDtVb1m-|%qoKYpIg*cUWvI9Zd5a`q#iU#vPq8mfX zSUF3l_XgGGe`B44KNjip2_B^2PGw{Pwgfbd6i}@%r4JT-dM?@SXk?7*UGG(Czb=Pr z#`HDoZoG9(?yo6kJRYT9&VFAi8$u?X?i1`0T+>V;OZsabxu@B6Q)7T_&of>Z8{d`} zqKXjOp07=^2-HG))?dlP5VrZc*Rd$YkTI=OoNE6t~xB>+d=99?J)x)_tFMH(H~U z>jo@a@RI0C$`GyQ(UuF~SEKoXWcV#8Wpji=UDT~8;MX@sbYm%-oVr3H28fEIXl+P0 z8k!x`ts$$NeTnDGp#B46FqAL=y3-0-57d~ZMMz)_iV!c_0TihIhMo~VEacx!S!R#| z{9#E0KgD}dLv)s;fCiE3nd3;`@>blf`9wVgDc$r6s3Y^`oWfBRl)lRZN~zj&OZQ#v zBKXAEIN8|q4-EAIEqJ-CyC3kckQQdiblY+8BCc840*0s>W;X+fL zAAO_YQx-IVb-q-b2*&JOCht2nEIFIg2;c(%Zn+bM6=z)R7+{!(3-Xhu!gu!7JQ z7M%Q4Q?Eae>tfTz%#$O`)AZ| zu~&TCm^u(6Qwz zdHypIfDq%v4?aQQD*Cez_)Lz$iV~;A=}LGl(Kg4ix#s5{#{#xkSY2Xd zF!WLQ2u0q{%$NG1mAa&2=hg`yaMAMIww<%X7ySYxMJ4Nl{Nb`EMTLmyUsLrsI5d6? zPA{)+iE8U{7nyQ}TKHeLTRp-}%Q;@IHrg$9y+V!2L!5=fbsqxKw2Hs<$x|OgG_SsM z_F{dkjxkmq=IJAZLb@+)ey?+{Ncw6l>#yY$(}Up0=l40J%GbhGp5>H-6Ct-aE)T(l z$+K%$YMMjjklJAG(T*qkSlz6eJhR|uS1r712cLe+Mv-zXkz0f%1fo7yU3gLJWXaPc zcj=2Cv$eGWzPOE_SD1H1#7K5Ps3lKNT#N@iE9%6JQ@+vqr?4YmX6EC9n&-8^do?!9 zzTCcmaT*Wym)U#Y;)j8d3Saa;vQ=XN+-SUv6^ZXt!Q2}o9A}+=hI}CAJ6I3JnZU5( zuvftRV%<06Fgsapjm&|WFEdhe-k|?H6ZMK(ouI?_X+1}2JavEzadr_S{_&Ej$d#0t z;|Pg?Y!%Gyp^G!}n;a42<$^ACOr5lYJ*x)wiXoW7l5DTkf~nVWA6^x!+{%hWDBsUy zxU%GBs42V%$VuLE{)sx=8~f*vr@o=ysDRVYw4A+@WDzkZu6#oRsL@S*Lbno=y zH=E~ zMu|~^=KkX1uUs(ZhaojU>^iPSA3b)Q0W&(H)|`Lx>ER0VC2vZaV0&r9gOq@E+6aB!HC#z%i zqx7?-!^Zff&1YcvIQb&{2bYNUQp$B=0hc`28VlDN4{VdHXvjuj*ep37fAEeTGb zS}QI!MIOa3={g)Fcd~77=?1NppqcqA3mFO^0 zA}=k4-a@2bV4lxGgUnF(so8ONEza#-G&QLL0rX{-rqx{)6@QO0MmWm>)6$j(5%j5A zgEwUDBS3n;!Q4TQsWx$zk})d*p(J?3Iul0UdM!N*N=tE+ZewbYL!NcgRze~BvV`fN z^k&)A<*E$wPC|6x?Z5%M&EJ2XOpTf!5kKFDxInpm`{VyiO4}sZzRI-=RIn-fr}`CQ zg_IdGlr~T8~zDNH}y_xwlzfAiW;mxs?de2k4_eCscaR09JHwo++Vr%6a82c+d0Ul zs=aE>Z~IG^gKFQIZ^I{qA05P={&SH5;JEah&+(T-&Gf-s0mr2_I3c{Y=tEn zanwg4IS;7`EBJ<|Hk(rx%~iRZ31@-o{WZ)9IaL3Cch9(wF!!&jvy7VUDg#dHU()oiKUj)%Kn>ckU)DNjVoQqD&?NL`!1|xW?q$ zlr!iEfGmF1PacasP{7+2yN1tp?PPwXcpxj)zPnXqRMdibLwk8xVV81ULd|(PyxNkO zAwLGf9Q*C4lftUD&6u3oHcvvW`ZmH+d&c9kk*it1Pn)(taA_$@tBym2Eyw1j-MV<0 zmGh8K)8?rhFBKG|68&HI5sDe(^Qbw9@xa4)nFS1&Q)H%9xi#xT{Xu{`0agZ@FO>iy z#d10cGG98+E_aTn1#`2i!NNgyebX{nD?QcE8q^0OygE`Yn?S_^hdWE=2`l?p6H!{0 z2tr;fQ;1~qX3I045F{z^+%>ghqYLVlgZ)wU5af1I!2ylUy2k-b`}sbkzePGe(!)K( zzWKP#{rHI?!eYSU?hES~n{u-t=J;Ns;Y6qz)sbv=~5(RU!Q!ndZ8Pe^zSCpO-OnC&(JRR}ptM-Lw z7dZut`pgX~(1OHh0*p0t6h3?&If4?1gVy~D^(VwzAzSF~2udVP*t?3YbY#{-`9dzm zSZxM`VmfCQoxV4YmM%mPKF!DPznKhI(ux>uqTR$LPv}p6X;435`;Vfru;v0<^PiRB z{cq5-)?3lVAt-&3A8P1Z!?zZiW!c-(!&`>JMg3v7Xk>efnlq#3bb>~Ed^@w@Vy_Pd zIcENJ6PoB|kAx`NCq*e$DZjuwDKRj3J;y4Pi3))GRHDe2f=5Qi8&w_?Hbvi5Cv0U8 zWRapfo?D0>vWIG)xKI|)djdpzp2OR>0>r>;at8Ii59BN0DEo1l7RkdUv2+~25dC-#)6QDs z&dsc!ZyqVa*f(vW;+R<=U4&h949_ITzPlXl9o1m%+-~udpIS)2N0IQ=)LiepWQ1AX z6Zzp5UEe3Rd@b=SGOo%K^$Nma z=7Cr+#0P*BjzxpUJANN-F$L@YRh@|PeBm+=)!Sc``R+ufNmjQwIsSn04{yuiL<_#y z;D}f2<_K$7BwXt01>bn(IMCPE*@@i_5`ACob=2BSxpVFi>Hy>}pO*J>M%k_r`sg2~y;%x4J za?t%9aed9-YxdwCp|Z-nBkhcZY_xb!KRoBI#+nT#h8R+G^pHp0s9i+1le6)Qlz5I- zI6hg3a~-xJ@@MW08{MV>b0@jPbqSwll9QI6%k?C0bdpw(SFweYnyUe_4@qk$ram%L z9EJgw%Zd+5GfYxdX2jV=Q&qjP_Ob7yPJ~e`qzr}Nlkv>JzloUm4QxMiiWCLsF-Lvh zLEUi~F~us{lsNI@iFd(%1=Zagt0WWI=VeX}2aq1k`*7}XKtv==99q>Ci9Zq=0&+4Z zO&^shAf{tYT;RB)vF3vFKS@ca{tKp*X7=~?ZPQ*b5ba!lqLz@<-AMY4^&NrqhM<`9 zD4~mhtWIWXCCI0dAu#W`lVgpc2JpuG&`ypggn00e&&SPCI9otAszjw|TBEVKgv6Zk zvg!|a>TrLNPbqsiv(G^|8nq(w=LSY1nqg-vIInKrvNXeah$EsnVWYxD74RS7$jdur zqKk8;lPMqy^TV8N6Zhce#1b`1b@e@~ku_2@Jw#O$wQ!l;aTN?%RMsOS)8Za1Vw5%>PgA_u<}{_hm*sz(Xc6Csn?r~WCa@H7My6f$ zn`FV(fIm+?MJN|jzuDUN_wEaWp+)r9SM-d)r{h`)D1H;B0#bLedOwN94Q4`&pO|=T zyqx$0F?GoD#o#*#9@y2lpTYC2#ZVKXeL?s0ts>PM_T!(uy_hf!G077HYU}Vv||`IwOss4K0K&|rO4>#^X;bzMi+L#FGSi!-4#_Y{J~^-h4z^t zt>T1zmymB8ix*G+pa(9XQYrjk-8d8yMByn~FcIl1!$bYSBlU_b52C=KZ8`|Ki)E*N zP(cBL!xCBpTk$_@*VSRj!&S5mB|m$h-BMeeZF6XgCKU_3ocZKo&xMtwDts*d(>ii` z=*}WTOrE$7(ftR~9f09j6Parez#hKzJedbZKg2K7M>pshxR0Esf7C+C8x7+hBe=I0 zi34mGmN-R3Q2RvQ2M`+Z!@#i&=f*er5gSUBkr}YeR!Bg&E=F8SRT3}TdkB(xpuT#z zE$)q45c&TFvIff=gThUf{`KB=Skxo^TVk6jf67tc*fTNbC#8fOB%;JZbx=(Jlk*K? zf#ElZmOMv06r|pDP(`UH@<~wg!*x>!AVK?0ae{j88QXJlCbP)G={6g1#xMpnSkkG*3j1 z*|sKv!^AFpht29?q={l=PJ}@bz0qJBMeY)e$ zx3R;eB$Utmww@udu{wp7m_K0}v%RL1&Pfd3o<$q!yjV&cOxULl6IbBPBp#!R@K+Bh zL1>ZVOpv)h9lo=Wl`5oB@zD=t*K4xG)iZkjHF_48*9HX5!qrQT8=yu8)*m=ET?mW`*xKKLQ?6XfIkJ4i-AYT1=>|wUE+x z6G3D1`+q7xDlP1SxTs6=?Ow9~?4%z4;L>ZT)-WOa{^Jerm?J@cAU7;gz#P%-M>}OH zwD3{-(~DMVgf6e>DoDT8lwyt4e^Rae?H(LV@f-a9={89b)s-AIoA?fetd)=D_#eq% z#L5mwf>5q|f8zva86{Vm-ZGTS^;t&wiSCj_x?*|k)acyDs+#r*t%}J>tG1?2x(9TVLS5+d)xKhreKn#y zx+3->2A7qTX>`Y7R?H7risTYpl1X>v?}~d=n`}OQG5AfJ7-J~-zRwuqo-QE&T#C?Z z(xP3#p;LjnUDF!HpX~Tr7$q{TM3vr140_KK_#{@1k;3ayB=Y~x-bH)8ejMCq0pEAw zGQ0#EP77&frfbCS^=ug5WDLY_VR*E6O9p#jF(`|pkLs`k_NO!hF{k2_KM_=MO0&7itgih&^D0wl=R+Sy6{pKEv& zBQD0%_ScNLsoy$K`$^WgDE#xl(rFJ;%7UP8=ydiuxr0RAsx@e$4r(@o^v|<}WT3$1 zn+b!xk>|4z7e_lc?bRA~|NPpz6BY8apUD7y=r*F5*=0$NG||EAXqwGOECtu zkx_^Y)!y0sD<}pM#Z@&aDsPX|U$U{N$8`8?@DQ2WTjQpJm0Ayno}Qp$%$pW-7tO1K z|7jmB30uTZxi8`|;itpZ++36tdBk(g+S_PWwu;baIP(7l^?>x3GsR)HabGZ)(Fv+U znL$}>9G9gnp1tB*bc>cM^Z}$7UW(n{zG3^EK(d^YK&M6exh*Vrv6#V5janow{h(r{gl2=r3wpjP*IO?Am zpFukNoh%%>b{V;7C*AZ9lkiZ#L#-!zGpA8rY=crT46!@*`zhoi0lobjK+|U)$92tSH^}FihIq9+|iM zhmpk9hQrVYw&-4*7G$t7+#HG*%n4pTSMhnzxsgOYH;-eGHm8aB{2ORbCI~Ce z`Lru*qj#M$E%KPJ?s??)?8iuHZDshMh|780DG*~ngiPEWq3OjrkPsAr z!%hA;w0EjqwT6B@nc3XvRF2aq#ZCvj^Int1cyFeaeM@;Lk zo)(>xC;D@=xreNH&a~x(#iar%8IT2m%WvDql}&HE#IxR08jMDlQ%UNasS-Nvmdt$^ zSJpd9c}t-yqCWrE$CCgbbFoh{+L%%#a|5g(ax(FROf7^k1<~P*=lgMg8d@2eXbV)y#vKPkp$9md|04h?&iRgOvbCO~;5Y(LftxDHO^m>hgg_=Z@G8GpJaB9(?UjUQ zOXrKVGNv5X!!i(WQZRIP#Tb(_r`~#{doq7DL3Myws#uws%{w_bH%(V&lfbJlr8oWm z0ol(eUvq!>29*jl2EpTjcc@NDnQt1Fqs&u@ytb%fUURoYS0>sB)YWB4&fGiq{6KZb zZld>ru@rbU$HZA+Yvr^ot@{vL8orl)?ce8K)4=ApK;)dBJysKW&8}CL;5NOcApba~ zJni%kS4z)cPW7%Cy0f4LB;vVAUzCd0{XxDZk1{BC9t(A$h4?tz=WM^yc0ayM@2VClD_zZ@dJq5q5zRc=9XMqOZi zb)+~tr=WNvFdEb-c_gj1UeiTPu zNH!JvE$gNSI`*K(YXopgyGfX_VyjlPCD;8Xtb!!b3~!m}gx}2M^nU{`c9l_T6p+LM z6aa2UgIY79Sd4WF(ectv;LmP7@i4BcYJ4@XerJg+1y8RT>mY7ky>%c3WXttm%Iz*q zW;>W)B+J(;hkEY??5}(d+t)+G7imJXk?1*pW9b|aOAC8Nhxlq}coMI!ZOa zL%I6wZ19V77d&V1M6gNdZ>mjx>T9Oca_lNSuZX9(F*uUU$qX~#l|hjHU{OzDw*TQHzA!jT8$sjci#%qmrs*#APY{HoNFB1B9?|!1HzKgnRsAkq&O0x5p zfSnw}(t8L|IC3M|#t*7pVU^oR(}dP=u`$b?MV5Mf*OvVj&EGW^F$v%Bzu5+0q1f7! zScd=PqyWu8@HpTdT4h~q15f=GlT5NXzhH3jK8G`cm?RmzFQ$wdbzcx149gv{uxk+v zaI}PLF8(!l4YPb-yPHV}$UJc4BGf+|ccxSlaquihi#jZzw;gVnD!^T) zYO%(F*p*l>(awhq*0U_V`Li-k@GCGt{(SGe%D4`a-*X{dCj@u_u!YQI%Bsm+;1V*n z6vy*Z_V1$PWRuQh5TJ5`Zb7FH!iaNz4agCsfOW4L4;=beQ)a&Hxa_4F9X*kX8pI!e zctK+dT~crcFDhQ1^KsO*#fZj&;YtNt*E<6-);J)aCq{patzeX3h3Ofk=bbepjoi`F z+{6Y8K-F+X;9tLaKswU_^#@sBU}RCbcgidGLI&*88-HT&f{m*;cDc$(pB7)p^Eh#JwLyngCV8fs(R zmX`yu7Destln3|^VEgmgw1Z)=|AJ#Vhy&OcoB}N<1-=TH#b`E3m#)bcM@|dxfnO{ zwMFtI?Gl5t0%_oz!!U-g``Ok8wjW3_s>_XGq{S z_Mw&(^Pa6W9*vQZh*OtMO1xgoJx-^3iSCKkitC?uPF8{iVhQ%St!pzlK;lPS{F0|F zT+r@p#?F`hi_xs7^rz_Fo3dW1*&|dElI&lg>62KfSQ;HcS%XFzS@G_FI1}zx<`|f- z=@A_P&>S!1OGXm22frwl)R`q)c;inA=JLDrQ_yskq^UPH_r+4j^wgj_fa~Th8a8Yx zMBS8jD4cc@pjNKw*~^ml1!Te-65-WEgZg}H%3Mmgr0Bpjk`u?-bt*>H9R_-Pi4zaHF2B%q6Kgbt3T(OGg&TR&Hzj&IT7Yp7jcK&!R*Ow3owOkyl^H} zgN7Ua9uzOip`jsOM{|lsszn+2MDR4_~hhM zKY}g6QCt_fF=y?4MWh9w8`DtisG5Ye+r6^nx0g! z#1Ev$J*=I}rrOz)yNH%)02BZ#k2P&vRL5yZz_kGweG^P)5G>(`JZFZ7zXpT&uTRRE zX%SBbQFej3=9AcclTQ#c5%yYTQ`7*Rwgf;FdT7F4;&i{Qd&kp504yoZ;hpQ}jr-d& z8TP;{t5+lk*&qsPHSn$TcOMt&Qk;2sHTauWF(nN)N(4jBty!HIRfP-cBHhrIH+>m* z`=egC?JdX=2{;DTluJ0KT>k8GHS4{6&Mm{IVGBi+#!doO7$1XWNZFZbz94{cTLrS~ zGhC9cgcBFSjAB$&N2!#YvCt&tNt2dLl2>=*4|P@vSRo~IxGI(?q^q;!rBWu3+)KOnNYQMd-A<@4sJ>TbPRGROf ztr@Pz(l<+?!GYDl#SENm2_PJ93S>`KmC@)TPrauySjsf`F8beZ_~8t?K8UK-w=E@< zs?`~9BqXA-=2|ds_U8HF_BntY7ME-J#n2{+k+7J;o`2B1F;+w4H;cG!qcJJ1Q_#Tj zqvC=#3xvp^{b6YKP87GnDLxD-;?&f)xms&c;Si|%{t^H5goK0m6P`K+g|d)&3)9wCp>Eb4M#1O>u`M#bsLx};uT;TvZ{ z`1qvd5H+fs=j!~9{3GZ^M6!LHF+NuB(IweJ?$QhTllWk$x zjU2VRvA#y-)~LJf8!L1mXj8Nv1|kbs?=dCK#HVM*@+&vicqMiZ0zkcFO!)Bw4MrV;YjRhEt7E^}E`_aP zT~2Qk)NT^n_N?)X<`MN-2GCPXL$xr3lWxJ7T3oTa?@KzkLMPPVqu+K8tXQ;xq2?A? zjt&mrN=cn7Sh`rsoQ8t zy{)dpd(B)pR|L@0aJCY6`5JU^9xQlT_jSOS(Ltsp6ovTZG%{=*cP8@_y6tM~fB=477q0qs|{aiSntpkSXn^E482M(|#!T9M;ELCL-B`x-U!X_ax zb%Rb=RO$Xe%{~uC@hGUpr0fTiqw%PN6+1c|e8zp_O_1@W$S(&RQceSdk%(SkzAn(m z8IL_9)JJX^&>ZYW3c0E`nCC$R7x0GxQ{y`DCGXv99EGy-K{WN7V+4WJB!mKq^G9Kb z?}LN{c%agvY0G5e1{zs962mHRVX_kh*!pM|S28#vTza--tEz#wLPB4ClwYI~+0Ch? zVwc4u1Ui&H@-mJ?g-zYqy&mTE@K6293@8svT)CKgMK8XETP@QN>VS1KTH_75 z|3wuBK$RfMm%q=L$I?W%K4%{Ojj|yN9LR!C4;|dnRPj))2`Pe1V}f0zF~QA=y<~(* zK-ILuo2$)M#CFbnAv8P zHKk^z8LnImHp|WjH$k-Zvp?8Zai^Dx&(@c1w24T|%6|}{ct52&dm#vLH|1GFoHhnp ziVfOB>@LLv5p6NGESL>P8h^+$`z^I}1a1ws zsn@`}AYM+FJ+|E&lifV zsc-(hqGW`?eq`yme$D(yLuG(tECaLAZFv zrc8U(FkV^7NyzAQ5|1ivirj_Kxl7B!Zx6_d`bvbxHCl#l`7JuSG%*qw1~(l-A50w~Cicr;@dsjG6wfKHu>>*{^;)9VF{t@;e(w2`%@l#TnwM2iFW}v`!dyAeQ{v>@GyvuSC<3t~chi`ukBm3Pnhh{?(3M70 zxlN8bRmy|AbiWaDUvdUl1NS~!2}?CF{z3!<_w&wdC zp9eZsK&!PMz^Fu?Qjyxlg68@yYTJ|FQ&Sqg;SK{IRMQw-H##wAvN!B*aI5D zDbI5Z5LB_c7Oqf&4fOC~CY(p$b46}TaS^a?+L9B-pY#aG)uPcLPam1P~;EZI-}m(OtnCU)VBF&e{~`WYY!9b6GYAul~^XAlBT$0`zK%q0h{cGV+e&X^oQgKSj-=i^e*cV}=nwfPc zPYGxaaX zdQG_J^5OVf(O_U;7zxVp>ciBRP!iTt7kD5*H8y|>5&31!D+~-|-2EQZie>j!$JQ7H zVx&R+hX%iAi*1~6Z_=PzG9%duNc9=Yz>TG%D>4UyEFv3-jUY}G+Q=BZ3Z#ge>FeuH zB+@^Us~`pKZ|6p-cdk&Btf7Tlpm8y_?Kfp(kI<8@#hh8Bq?dG=#rfD966f#XkJTYf@OC4upelA-+h_I29%NhzbaNcc@0;4cz+$ zQy?}Ab*SF>7Ce&n)j!>LpeYc0;&$HXS=&TVeb@Fg;H$SefetkiXJpXg&<=x^FZU#o zlXO_@b>FgK9XrYl5w_^(&2!`h(SE@(W5gC!7$^=JA(I7Ya%!3eyZV%(!uRh4H*Q3P zD&A{V)4rlGKQ)j=o|9fT2g%vHQmS4sap&g!Y19#Hv=jl$r;WGIXN~|EndF&jCo^Pn z$HraAQcy?d0(d<$$YHvqK*q}Pjf*s&Hi_??))@9#mM}xmz`y?|iJ(!wXh%z)>SJdL z@y1Wopj`kL!X=1#*nNjy7Vr;3&C$Zp$_~ds9iwwY54$g?hm!f*aZ))g{E$v(YkAL; zoyrk{My8~@80~M{sFGXK79F)n30t?GG)+13PDFzlpLfmynK-e$B^W=|%lBzDaNk|o ztGGLLRvbZCuVA6@*94-$R&Y!YSJa19A2RpI59mPl5 z$|)qZgc75fFHn~)>q5a}C4q3Z5a_PS&u&p{A@5R1P6$%+an657Cv%4)a? z`V?})Fs>zY1`LN@$-&+&G5bmFR+7zIX_f1asKg$XM*yrRgyZMz$gv0?L~6D$0Ue6= z%-2B^vmk-Y$Q&Z(Vz_{OfH^C)8Zp_@^5ijKpL2I&56Tlqm%Yu;coK*2F|28k6}{U% zM&yxvbe0sI3;@47y!kl%XA=s0xO!)AAK*60SIfPt#yH3q>k z010l3(=zgT?%qHucH*_YaGD6j5$nf~5zDo++uLMg(oWv7#d+U$wx16jR^Nl4F)oqT ziGSlmOUFo%{;D32oACN2^|N-b0csCv#%S)cxf5A!_h0#T-3R&WucuJ1|LA|^Q~$JH zE}Gj8cy+Cg!5wch;qOpFBIDx48CyqY*}yHk7N`66)=5qO(i>@C$$KIA{@sH8Resvs zqT{^H0Jf(W5i>2*o8x>^s4S|p9FK0_Kl>ctMfdF@ma_1}aATuU0LBM$aOB%PR-4Rx>M`~^y2=puwNXju z!i+BaruijQ5M1%gUhr^ri360x_>S7bSJ4qv%KpdR@4}ZZ1TG4nY!ZG6N!Pb)&+#krXH0V$E+ASQpWnB6!~5>qb6rejc<6gMC^J`NK$6yJgZr`2V0h1S9wi8k0A4U&N~EY~~&TCkx|8F0W-Y(vdSt`2N~ z;-BEAF@_QlTR&_=;E=U21Uri4AQTbuyPtTX&4>kW;1Xq|y@6mYl|${a55hfAeCTi- zNE(!a>Nx2@$s>XXYf={n!)a|bOJGKffRE~+l7T?`8%9cp*GA7rcY;CrkFUb*Q&5;uYUSst@?ceT>f<$w5#Ok$fRE84C1TeBYJ|XCS@=&k^erpH@doH=5XGb}$aU zhXe}(29QQ*rG4udMwjiaH?DsCbxiQ7-;7on?-QZL;lOF8o1%YQYVKkwK_^+qop(e z?br`O)4-hk7ScpX@>1PysIZ`=guM|YoL{EH>YF&G1Oq6rh~4wf}cVG857JGc?5qFN75d<-YD zFl0`IaV5I&Fm_aKvTwbp23f8}0_K`^upBe@ANImU{i>`Qkyy7-mhcrbd=`MQFd1sm z4Q#yl_nMQbn`&Rz${Q>PjIfYsbjT?KK<@X4V^5*W~~441UsSDvq4^i?Z=6W zr>S7l6n0cp-{zG;H`O3TgM!IHi9EW$rNPb5MU^wRmJvOKlw%NmEWY{_u~1E4uEbgq zkIXK6UQgUqYH}a-c@;w4$dfphH@movTU7>u0?Y_Z0=DU>h=G~1^4&XRnHY2(K2#ps zY?H67Z=uO0>8%^=j4h>ocIR@uj=e~kKjWK=9BTjI%fa5Ey{ z6KSACw}uP?&ax(NSq~fkC)|}0jY|CboZ`uD2{YME!?@>YHuu-lrbjcOLtMVJ4zrG; zSkhK9o2;J%UJb%H1_LlJ@2~_JZYY@}R_9CMl;|lmHjRTXp$!FJXl~Bh&wh1w4$)jp zP~PaKB)eJnQpkb@+PYqn1L;91Y;t^T8^MmgSt=t|A+0o-4h@^jsYqQA=nuTEb23~Y zGgq0U1Bt(ilSOI#{UQ{^fkZ~Q-`R8K{SP70=&j<4 zLkK1LP=>bGG(@*jeOE^6oU0e4uD>z3A&~*bMkaCT9(h?wjmA>@Pwh0TAvY?kynbmh*1%tx$q$H4=bWXaEJg04L85>uXk6TE*NeZ5Cq1qB5 zq53mb{O&l)T(z9XZ2G=6M%@5kh!cC=s{R2#cXR!XF&)Ul&*^@)HPMRZ@+fppSd8ntz+`YQ z@oE}Ne_3$Q4JbniOw3cXibp7NjwKO$)FKERBKNMITVv2vQm z3l#1OMUbX~9ZIKUU>M;|!*beU+ejix3nwlhaXVDdIa*YKUK90h#~ESA3G#s>&*g&y z|Ns1Tf9Lm^s<8noty8&I?I}(@0QK+H$?~f~^$5`&0|hH!V@x6&7m0$i-~dL4=?Lsr zL7u&fRpw4rJz;!3FvR;S0*?Z+IY{I$=TSn*a=~RTEm(~HQK2^o-w@E8V|SKt0a@!fGU*`1FA9@xT`tV!oP4Jo4o(voZM`;P`zix0rD^N>ZzO zYjxE}j-pvop!hTnF*`_dVkY;FfiS1fNNx5joslllse#QDvP14->XrXlCFJ2-Wx!?} z5$HM{jLruMwfqRq3TfmyEE_=4mnZ;w((|7-Sh#cM^Mb=Lx;S+Kuhosmn@Ws#|f?EI|7g4#@ch&={9B}Epc3~y{BnBDD2p_08ZB}I$({}!jEuCg- za_9JG0tZ2?Svx`(X>8Ip5{Spb^FI?QZwB8etu+gd(0R%1ZvZ?GVWf3@E}8;6g~p?C zu~^d&!9ISgm%I5O@arLiWWB z6|^b%;{h~~Vgg~T+<7vp0|ZQAHR+J+%d~Rf{T0X94;3Dqh|Hb8C7GO3+)A%A&x*S(W}|VEWgKrvmz9ldmktRC(!CrFstQ&n zIt#&~AvwX$5eYJ+P%<;DPEUZb&Y*Dsd;!Ygfr+-G;@}J67d!2W(8Jp$wcE=`oQw}* zIgrjwNRQ{F+!BUp!a>MMM3akOJUNUGQieGY(iD{8glNR=Q$gXbRd&*u)0if$K!Yjj zb@x&2|CjAHV8Ypx;2%%`oUG|R>L*VMihrdYdLmCm+rg6dC#MybijAj<5a0Y61&w-x z2=Fkii?ow&njL=4^!X;_W)_WyG^#mReJzau4Pr+3XEU{<74vM#+ka z1`Cf3y!^Z$+nIJRK@6t2(>od18S~M2W%OX)PT_~s{E3%EES~4RU-7`w$Hc4aXMMCA zA`5km9Y2&i>TXsjOod&0FBp;$aBM+~*r)CO;`7dr@3`uddF`vOe<2 zH@!#Q!vSl0;rO%5my=Y zQ`s&gBfcDJWjIepl{$s%q9cYh?@nK3*f>txRlX2K;bwYV`ein|>~*}GtZn>i3PkI! zA?(e$;U&G4K|yvtm~80C#n_LR{X3n5p|$I@Ah-Z4w7%u&w7Xf*|LPqdj%A-mW6*Ih zAUMwJKMhOM$HuRz;|J<(2#GR5_mHDGud0r*{TSv=^Oic8yqyF-KLJbsN^$C$zRYsu zi#qD(K0QoMyRAUV&eNA@PE9B8XMxgLxOBYcqd^X&ns_6PD4Gr(8R}{q+fzsgpYBFg z&8sBiWqofTf`>br_nUMi@mB*wQq{XYUGeXiI^N%7wwY|~j#&^5r2NZt7p$1emC76vY>+zgpVp_Dl+Gr*P<(= z_~sZNKG`J5N|z*Uu%4+L(y(YMw>ULmlg*91(V!bj{YsI7=>{lEjFNFRE*h=PtWU++ zFB^-Rp!}r?-@g1IXm$?9ZyTdm073YB?$cp3SXzjfjN0aY7WeBOCw!kWw4>Bd< z3fOLFt03aj43E=tH)CG(>-5wsTOq-ZpTzO_8irZp<@6K^j>I8(%tV884Du_%B#=tr zh-uSUz-KBCtEU6I&)K}`ZL#+}+OvIpJY?x}a9#tMQ{i`2OvL9Cjg7jlA9$K29o@2A zgf@ldyle?9Ep%eJbLm81qD@4JlQk>@fH4VHr~nKh(G!8(|DmYQe(LEZh|+KS1A1-X z?M-zJ_OWp534^`VhC?UHt$~oUnU%xoYt!Lh#C){5YhgA$>tQA@-;VBBo^cV+aI-lK z6V1@6*H*8aQ6#&2Ak0F}?Z@}DEq77Y{*787ta?g18kI^PoJGeWEAF*07c>FCANXC8F#Kw)N?-VZMb?hy5{~fS=Yl zjKE0#?zN{iwG-<4vM`RVhnXy!RQTOiVxI36}E6X^o9H`B`JLaD24`7TR= z*mR=YncDk64#*$SIOu>Vb_>Y>T*{?SrO4Istw-2qzN<{NZL**aOtMp5)`GSYLREVB z&a94BJa%YFGJ)!hoJVhfOu{iiWB9Fyx|#MH9%*=2SNyavIV%|Y8Ei<|m4T7i#+I%}LWgJ6ltvysm^m~@)M zUv~j(LkcX()-)`s>fz7(^C=v7{SZGu&F$PNfV;~L_57eNrqVy8*|n5gBukLNfUU~h)oy>* zm+=xzf_?a-ve`WOLnS7+31YxIXF`Q~I+CqVL_=#dI zLpI0S)h6Oux_ZLOpcG5*#*MCCrO~MKqKKf55|`5UtxRPGQZ81bbuamGN;UpQx&ql8 zrbL;c2hF3sLpNjLQ@B!8xBp~G1mE_>lcCf}V4an)KCxK3Yr*nI)qzFN_K{eNZB&5_ zRqD%k;u0D8k{%tU3I?@MOG1MvwwBGfYqR14F~*g5ldihShHrXACx=XOFutzFq5To5 zr<>Ob_bBISCsXG&VCL9IFZL$QrRFrfC)aPFl8?Hy{(-mEL+4eL8tSUV^alEV17>7d z<~8ClvNh1-10Hjyie_NiP3vPga*-OYdzH0=x&QL76w=2|LK(VhD(~YF99x2;jh{co zGsr;;Fg2Ibj?vrw7i(6(3XaNW#4(4R0^FGS(ro*1A+gv0X4+|O#FPUcN;M&#IN~)T=%UBk!xyRuUSfIh05T=z3g# z+LgH{<0^v6k?<6sjru`mD1~ba+9|q(hr6Adl&E{pK03QE@W*QM{ zsx1@s(8;_4o7yD1wkt->LXCq;khLo=zGo+A2K#rhREs2L);|e^VnIf>wCua0{H>!e zt|U@cXuB_mYwgW%k`NM_x@sJU8qO}_H? z>Q_1@AkL`8(6MXL03l{m-DaY($_OFm;Tak_nY@>GS#!`sI5d>)u~E`Q9;1cIkcC$A z=`i26kiSDTB>p8fN!_Yab@RePTz8a4&X)qR^=nkWHh%=9j^SxIrbWaG#Z5 zfgBM*m1dj`ws0@9|1o~6tmv8moaVA|hAZ>)cPrkPY9DBgV&sa@sVMgUXmVeFwBFoW zYp?P%m4rXsQFWMx4Eta+xs`URdRC_f5!FnrB~{7)MmUN5n{(9e_dMjZ-7cdeWj zrykfL)?u1Pw$_jLue4@~*dF;y@W-=XRAy?Pq3{#igVv*;1ypl+#W$zWrCM2V!Y})j z!9>z}-L&J1gznr15>s~?f{7iUWDp|JX^`3xf9(VPUj+uDD4I;oajLDIKcI0$S;gk? za6cX^>`Cy3THUF7TKlMO_4q1NFw-KMou;&$fIW^r`a7M@@7;nwNS6aC_WseC%&Q9( zt?D%Xd!8-VjX1^Fr?j=9SVVIJiv6HQgrO$-;b+;Xvy4rlf%(f3k-i4V9p<``!adIe zu9nT?3k3&Pj(N?OII4CR(e`oNEN9N`iC@a_$h^W$KIIz>SYZpb*jK+#SK=I5MUvljJJEy99Y>u(wsQG3qRU%xFV{iMnh|*PQo^dL>KPs@TfHBjm$t=Bv>l8eO$`iD!;YS zo&~(7vfiGj=|T!*CTVRrZ}!#rvjjYLZ8Ek|>8gEc+OOy7&bS_52gCakV|%i7afCPH zKQZGLRs1^)3`7$rQ~G#4fIf69wqAKk+`Ns3UJ#Yaszog3h03WMUb~o-smnj{zx8<8 zQ(T*cATIR55ss=cT^qh%m>CU?o-SK0TT9qS8~CoeNEK168?2eGakek$SPn6Z#~G`7 zq3<4rnOFa04>Pj~p`PkJV32UFf9Gw`dyubTciYpT zjcysr+Hn6`DiaC;!%T}EiIlrS94gC39bsW&u42f1dG(3d64jS7;AQ^ z`emMsrO?3{m5|nh?y2z6GG!rfv{dV`oaz?D=4|OS+Vf&CH6-9#Fliq>q4HMGQZ3=1 z+Aux7vG`o*X`RoHgf=8$o}SJxunZo~P8jvQTuUNY z*mO(PP7A0)$O`Vg<`b!DJoCqHA|=&cel}T+d6YmBPlBn@=`K$@^;F(A68ch~AKj=x zZbs}ohgROG7x}tkRM7wmG^q%pjaZcR5{^>A&$a7)IRW%X=W(mM9s&yz+l{9wt@9}# zjZCr>n6kp#Mj~IB^CKeP`d#Jvq=O4zM+|R3iT7=Q`{53iiAYL#+;WT%rcC2zt@#Pf^juL6vqVGMp3@8iOUFB#Z`hub8j!ty2G@;OzB$$9$V_AE~Dd zAwzujU;tZ46AQ)Bo0%wlOJZ)H5=If1!u8#$3~It8zd8U3g`9oEYo(*iY_bmcTrO|X4S`_AgL{P zKW~))nsEQ1tR%%%Ol6$ifHdH=b0>ehcyN!&<|v{hgkG6Ta6rg4)?0MLMUY@@d;K0% z){K2^s|3ERRKSY`l;??BuRLI|TwY7_Ob`i^<@&Q&=a>Np?ztw}w|VXY|>eoN|`$sBYS2v&wy{9N~$Pn2N--JFU@=t=f#Y?;~*%KNxmG&`wq+B6{;d!HK&xvI)L!KGjDgHJrn=J80#UiS+$?To^AH|hr<>v)1o#r38J;!r zg3orIxM~H-=sB2R`|}WrybDW94=^64Tz;9S=O6*Ci!%WRNi$_@>W|@Q0LwK$g)QOs zjBVB!n{aoCtbr%HqMAwjWId_zvoMUoQq8atk(qP81?MnQ) zd(u?rAg!{?*V6EzDhlhR*Fzyp=V4Z|sHg+pk{C8H&^=BM;Ce(Wfj`stocd0@#%C(W z5j=kt>K-z4IW%4fo_rm(JUGEUln{u=@3nv9(>4?U}=H=pPUSGPcLJWt)u8Z|F`E#kf zm}IjeyI9e2;#E165uOOfTe$`A1fneXM{gVJTs$&uL9ONa6e=P!9wBq#a$1E@!qQ|( zb}26jcw})YK|588IHAjenqE|21a|H*+lGy;9|hH_!tHM;d~5cS(h~A9S&mH@Tx@pp zVvoNO+;ObuDDlo9XD6&eYTFmU9Bd2DF}U!>D#p8leGON?RvIEvQc= za-SZrxmQPtFJL~wC0yD78Eu7S>+{O9J_{`?@#7tYV1BFRhPWyoX%gZ-!&+BC)EmKm zz3F8AR-L>X$Q%-4RzVg7PU9yWB8y;TjXsl?0x7z42oe($YNu^L3AUDq)Psm1(R5XiTX>JG_nBL_q+d`>mWU}iL zY$v8^M@-mUMXYETv{+3H%dMQ|m4yIp!-%1j+Bq~4m}E0G!&v(P_C*5}k&!WZNDFX| zX7zTF7zRcDA#I)edRGCL~GlGkU4~8FiTjh2_8@V~)#n z0^TGo>z$HWWC+;5=)GG_U zWv;keb0rTED+<%#2uX1p`I>@ z?Fdim)$bUD;oPV4MpvvU(-ZfRJzCo=HB4@g%sC(Q*lG!|;i#~|bc)<8?~a#B^g@%9 zBTTNKFS6-LP*{u!s3i@@s~-J+F*@DQ^tNskt!A5#8Z8W!t{GDs7&E^z&+$Avc2Ohd zP+Y}IQ&Bc`)JH<~Q<42FWGBhcOO(N+q#|y{6eb8RNN1wz4AiQFv}+$_Wul_K7T&ll z)ewmUei3ggSfR-=h_E$oPD#Ylg8a7o4cKm}9FkaCQ!(`vqu$Zw$U`TpPvu#)(@4E&tEYdZRHB>fM zoAzK}WO4g4x4=9=M{sLVc4FMI+PW($z6{enDwVd?hgiQbH$K}V@Pu5EMh{H%Dq8@) zbg88(IZbUMDCG*t5sHc!Yl~x3mj|zm*w(JS$pB7u^9JA<7q+^C#yfT0x7hg{YHvmu z$0d^+Oa<8~<2@_3+T4)rb0ZyQJJ>`o5LelC^)4H6Me0IQ(3*!AkER6F^FYh|NvnSI zuSE&H=BhrJn+4CiTXF*gOBYlm z6eZw%OfN5TT{o32lRX~(lx(&5=_%HpxD|xiy|w=?2p+!AK9z!KSj*dl9UnimA%RpO z>~}KC8%Oi>j9Z4udd*L;cbedzA(F482*FH8`}#>O&vtx<{)%*q!@e3`zaaBXDA7x& z*W8u321M{YW|~)pF?(%u@Fz>-(Zh{(I4Ez3__WFaM29-pjs-~=nJ`qG1vpd>VDS~I z(~1al)`2-V$q9cL{xsZXA-lZUJa^-81e3}nggD)ol#qZJ$e5D5S+t z=v4KD>u)dd^tZhGQH(Oooa|RRj1sX=Z(Lft52;ui^bgFn=-I52-o53#W2gttLyft@ zqc0%wrq%~%y?H;hpoG`F849X@B_rV7$N1|6*Pm$0pA+_U2P9{D#BGc+h*KkHL^^FD zyS5q_=Ent39uXnMct^Cps#iC;zjW7IeT>}jz2a!PNVP{94HiFio<56-%w;}47+S!^ z-(UQJiE2(8nRHS=J=rSq=F{o6V>0K6`rs9fCVF^8{H!D_f&H*?U{Vv1DJ|;O(F)>LN4YS%~R+Yd1oJ%!t!pDKyW* zR)Ae(j#AIROdhs@Wnz3e%_k~4h9B3`>7L$Sz6`pVbo6Wflu3rJ!elXCh5ZiB)Gq+) zu>(jA%qMnFi}O3J_?@uYZ~N6T6PZpoV)`{diWm-B+Aj?`rQ2P~(5G>m7+Myz?Vyv} zUq)#zQ=t&_9cCxgz~1P#??AI*tJ_*UjMvX30d4Joh)jau>h>2?nP4pDjo@Qi98ti% zo6#c(Dy`5OpbyS_<6j64dH$PEQ7(yzN)dGF%eaL+1Hc zm!;dv*U?P04*iMzyY%IZzrvaT24wfgpRen?JXgHaWoVG`rDliD&>b;G-CBUGht&5u4|)s#AE^?@BY&p2!l=a~KQ z`kKzO2z8~OV_!!M{(myul%R+b9pk&J9qpG^;pmqPG^#6tfc!z#RZ5wmA9|b7VST>< zPghpIT-YAB-@MzKejh+dXHYl;0}jIbs`+8yr?oKv26&S>=*{f$im&_n>xsv}e5E?` z^Go~r>)999+RqQ+|21`$L2)&~7I!B=aF+xpxI?hTE$HIzz62*gf-ml_K@vRJ;_f6Q z$l|VxC%C*#zE}0$zgu(foIcaj-7{5prh6mk25;xijJ163ptkPzx?MX;)ZUwQ zGHfTu;PcouA>!7xC$rj7(;H?wsv=^JfbXQ-hFU+Rnwqe3n#QxsC^@0EkB|8zOWa(x z&g&<9(~Ti|Q9VnatpnmfMFDz(rA7vqvElS`JOSl0-q>d~EB!?%rM#$u!G>PC1f`15 zZq@y!w+XlL+0ItCCIKv?+pC(vG8%V3(U`|{ zWbWyZ2XgE7$IhDj;p=Kn$8LDHaetz~aup1gw+FdazxzW`uPJ?7?jy#y7^20qE`lwG5*%5|3duqX@tEFe0 zV*wwLCvuWADN50Hh5)i|@^22Y`-|K5WcF^IEev``O`LFPOWH(p`|FJGvD4#T!p5CS z*qZ$d(?^Z~zht9O8Xd0+q9Nz3vm*gwgp5axvGRJQiFEvil4mrGg=sxHUSlHN%Z{>D zgMy0y$6zB|t7h?*I$L6d;PXouHrC6=o%n)T;5>bxaiI*MBH0`;oY&ZO`iYsMamRn! z?TI=ulaulJAz>Ci3ie?$^QTZzZ2bknnmY5|u*t72a)YntUQHSluX(STeHHe7>+5X=FM)#w8cqNY8a;_y_}MQG(vDGyORu3GmX+_zve}MB|$dY zgBg9)tE*@2M&0(@yaMY~lnGkj+ z+wpDK97YS%!Z))yw&SoMbx zE1Wb6nyhQ#b@c}Fn(59({E3TwHThy8s~*mpqVa4xVu=Lgb=Ap~VqRP8K3{#D40x;- zV14@uBU}xEqz%IG_{+i?ZIX*n2oT2OAqwBowb@Uk>ySBWa6KGY@Y|}aFWPgETn%G8 z(Y)2a&12%Q9bXkFNnC*-+B-9%JQBhA1z!m>adBN|2;9$x9n3pUS@Ig6nB6cJ7g+Hc z#|Rj&AOU!6RR$XB#-ZJ_4sgB+(3y7@UoAbKCR*e1=zp9Vxo~SX%9*&pUfRNlmjUaq zVA!F=Pd~H&yaq@IzmkGkZX8I}`jPWJG>8xvp3|3n3fWRkmA)PAh2*LYeGCV=N(+-V z?i5N%L2O@AeE7Q?w_?Z$G)%GbJsqpL^{PuXc{31SvqMJ)=thr+^05a{QKVoJ(A_)W z;yu`?O|HcZux4&LDnL<+BPQCPB@|`>PU|{blwN+;g$#_A+zHh~)-TY79 zZhOcv@iOL#5Y&c6#y{(^5vzqRbY+o}yT!WREG+GQJaI#S_9a4q-?Tg|@%j5eqaJEk z_*mnh!=s?@MEWV&+(Q=0zB0*s92#!R_0Iy~vsEJIUlo;NprD;nq8F^!w6 z3~BfRQwh$774dx^NjchPuUse74FQ5VlMCb)r&YJO(X?)AAkgG6Z+D8%5^F25>M?c@ zd_7HjM1W4cCu}3o47!Dc%y8dR9w2m|H43kqdOXCrweWo&rf#$$chAxSMIgSPaF{sn zc`B9qeoH&8?n7kNjHB?CayCxhvUywDC@pVAU@KeRjfN4TsSY6&H|$&=&XF)*ybw^u z>t4CSJV61()U?r=JT&ZP6H0g7$xlx2e(9zcp6rG`E1?TZPrf5_<;l{=)oMlRp$3i_H`m(bSXH#Hi3sJnrXeBY--MgP-)-yRpzCY$?51PWA0kM}! zCh>LGmp04ILE~y3aJBHD9<@_w&~hFf%BqcGRrl0WCr<_apJiBqx?T?rSog8(39yOU zZa|lL~vI6a7VyHHw)gt05@^p&nK%ke>R(IDq(Mm)ZrARzp;K3S!IuO z3Hd>iL1E8{u6@&&jRSYBajHJJ5;80T$mW*u&NfX-8U)r9Cc#s9%en}!NWz1DXJ8jx zjY;BO$GCVkK#bxXQ~T@*GsvUa zT&^B~Whn_}2Fb*f0o&czVD?rlQ+#!loZV^JyPkglW)HwVLP-%=0NqAjinxerQi|i= zo`~q{_e)dnu|31gK4FSAK2Mw=;G34FR#hF7I_+LJ#|3@Sbw#nVpA50s=z|fxRgWUrhw|t@9qQoYhS7T4x%iGb_ z!A6(eN#+yjv)%8AgB~8X;|8%CtK+WBQ#qd-cbtMxsuh8t2eP@Qy8%nAnR0F?$<+{b z*2)5#XAu=MSZDL$=Wg(OJMFh1Cm(@sK~MWnCdQg+c|qS+2PR{`y2tuARow!|7ZsHU z3uzFr%u_Q?yqM7Sc{08imZWCgMZ6?Xix$*tAgS48t| zESS-_(l1h)IVRGKQbZimKt|!L;A$!xWV=&c7dScNFeJGNmce@VQ=0^phAFrNL|dz0 zW#oiZhoszO0b@kWl4oADILu~9QAZ6pXKmekift}BF*K7sUd+eN>8|q{gT*OtAySW% z4J802#&&M!Z+zifJr>{e$lTwQ%)VRBEuPhfz{wsJ9ddgY-8rdNaN(Ogy_D@1kB3Kd z8sfX3W*SY{Cy~Pe&lmdCULRS_o>=0b+U=K1Qjg#8;3w}3aPEEDZvZ!0ld)&__8X-p`*r%s~ennC#ttkFC*_^$~6F1}}jm-4@ zi9a#X5j-wE^FIp51uavjTd7YlfoZ_7=bw^$yoAgyD3 zX_lzwC!Lpx=)>m-*Ww$uD0@XNifnC2Vl(hObMw@&5>-Tr2uSY(+w^ZtbpzHBdIyJK zv7M&~>+*w*wO&goAmE;(i@9K^U^ki;-+dhGxj@dL15B13*-TxujkSVOH2w10O6<1C&whzexxKKbcrBH+aYyzH zOU!f?sR-T)XVkS?V^JRcTcGG354~lAy@K%Cj3&*~@mDz4TO^vt-4|Ei^4Mw`7jovA z$h~ip`d+lVf8;@%t#CpoLK;&t%3h1$7X*O*c!??vlFPDLY~drdpcL8R=8u?cXw)as z_3$FR_GuXwXP!x!mdlH0pd4ka?Qu~Y@f82F%wU@WD8%^Dxv-0%RSK7I%0#}+Evuq; zSMdFVeJb=r!~)+;`mPXjny$nL;jIN`=LeY{&9Li}@N9oKVm=}iVRUJm%8{`fnmttq z{Nus@fG^;{pQ51KM51{o!nh5sn47|}owxDIV}2}xAvQN_Urzb5e3_1<-;BYeWmO3s zR4$EQM8r!)Q7fM{rA(A#_Uk;+yrFVqTS6ItQ!nFYi=`Y@5nb6v6aA7e_K*5s3A;Rv zqYMp!?0R1^bL&5frurARPFcFqlq72lfv3=cYK+yZ5uvRBG#Rl(0v)-TnFmr-hb?@| zPeg&HGN1%BirN9NsPHgC1x~5d(W3L#%(`>p=+Y3s=383{U(*ju;KUuj!?sBa+Z6fr zZ|7T80)#BUWxINz1TBDwp>@mTT*n>gr{W6&p;0<}bRx?bCFAV1Fglk9nF-CXXG5Nn z8K`!FT^hGS!t2*?A>P&ewL5vhKJDdQ($7i%1`%~sxhFUPvF|_0c~bTbg7UFXI|KQ7`Xt6 z>Q%2`hdk$_?BiVgr1_uojl-Z!gx874R(Zz$@ceCfWY_RNKoYNC%_8rMcB+NBYB!Y? zY7j!%-dpn^KXIaZ|LW>3LP6gJmif103`!upo)v7#Q&G+w&C|daS?Cg#^h52r{N<&> zlf!`|A-mx4=icBQ3yUON8P`nY{4tW_Zy&2}j>0A7sT2@@r0=%yj8KLUv@T&luNjhk z5Oj(B!?adk=qN*-{{o%Ef!Y+3<=E=>h4Rd)n{kK>;C2^~j3X+CZXuZ?^1>qpr?1gW z4zAAPLbnH*4YFT$+~8RcXW}IMB$t0^KPswP#uUHn5G8aVt-n8PD+4l)GMw!TxzLmk z&};|7t>6T}x6j5LXEY`$f0Eij^BDV8PV5S__!JRQUI@B7IL|;CjRau zZ;dHph0D9AATV4*pX8BSBC?G>aYZ>H=w3K6DvoS@`a!$UdWjXbSGkw2*$berJ4ydt zx*G6QJnHlUsVWvV^hHG$r>$=AnUyu=bF7qYs8TQnFflrs?bk5CxRlstUN+F4uZ+*?aZPE`h z2MPR%L|V4Pdu?;!Cj85{_}P6ebRi8=sC>%bz4-weMi!dcUFu$I<5a6*+&1U*4M*rsV4-*(%WCH;0{B$~h?eU)%qXoZ#%lP(-eH-bP5e`DiqLq2CRi*Z;n8w`#I> zVgOzj0E@{PSVgAybhzMr@(?$g!bc3x1oMhuNti9@xx^IwOQxS_du}>=WZ3P+-#3+s zzLs&=GuP8~;f%;Gw=o8P z#+;&;>aMUS<)dd8VF_pcN*9c?AiM0q*69cIs^T*Ch&EQTns*` zXLr-b23v{@Ti5-L?;+j9;|J{wu19>?&csRY`XRP2yKFIJPv#+AfRnzRe8aPj?GcIQ z!)M_6VlWcXEJ}>OBBeLEgzX6%E~iK~A19sa!mNjE6U;0F?;lJY@v+qkK)@1SwuWLu ze-et&SWN^63MNkd*oxdYQKQ@ktN)!>$T2`oU=Dg$oYFhv76vEgiC*J|p#q z&hf|?h3&zrk1c0E3h!|NtKUwXM)IIPiFn8CcSWXeE~}^Q*?d6TS;RF!Ei9`-N1Rid z>*6_L*V|~6t94~&yULfCTOXm2FGh`=wUwlh|CR}vUfl*Sme55|5jUW>b@R)G{Ik;D3IFet+^-GzX_g6_K%IcLe7H*nwuGV zI_3@&>!+GEpZ1Kt=_>eAn!maJUTR|~?Wdc+4uz=Ae9>D77nzn3|IUvzO3b7JhFfuo zM)D_aUiYhLX1X7L>uy_W zvR!JY&ma2!pS48y-sWnJwcAKO88>%3DZnaPss3sAy&5MCt@O|6m%OQJc#obEZCO40 zKJVSII3y>qRUpxPHfQ{U2{eiaV>|`Z0$W-Pw{1v_Nw`_>le%OM#)-^eFO6Ot9c5^E zX5FGL?`;PN^))z_(zo*#h=9^+sDoWmY-rDof<7VQy5Nx_7rWtP8fhU(GeUhXyigSw zDEUB1T_0FfI6xkY-?U0$}|yFJh+j@5Z9zdSwoeerlaUy?fLS%xaQ z?C8TZjYDML+>dJbUuZo_QezLf+@AhX-oM3^BgTzVcP|Y4n)c<-hQ^a4+>!7<$e~%n z7=n;BYNmZDB#>dwHT}jr1JqeO<~^6Ms5pJ}94H+kv#S^4?6G6q&(8)8EJfm)qvA2& z`gk~$GX5EPX)wUqPXhY{BJzO%PwTbw2yeiwWPqD;#Bgo3ca*MPFB5=gG6W(Ro9*Q* z_7iqy%MyvO1JUM*odCYFkrW>)PJ?wH2gv#1k3gOMNnTQh`3jLdNL_a~f@!jweN1UG zuN*(;6H@aSG;mDL=qQ_XZP-xK)wz@!Ye{kbw(gykzoPe>daClaC>L&-ZK*I)(qplW z%Tae!$OnYT;~{Y9K4J$)WGoXSQ2;*p{!zh&Wgz&PH z4lWm={L~-Cfk_P_l5w#`z#Q;9-izeGw;D`omEpohJHpGOqw;v*bWs&5;Tb#!q1Xv` z9x7;;kB3VLQeK=qze-?}npj}XNPb%&AF$VzuE&Cz1g>W^i$&C3I&zbNWFcA*wYWUg zXOoND&BN@ctGKFdm0<$%hcpk4HLs$nxtpkl$2!SEjWO`KA(iRz_32IG;!)dLufld;2s41>}hi*;dYD;ue}1=H&Nia>0eU3E2>MPobPpo*k`6AuYf;usr;BERT))U51V|bH5bC@fnT}9S1e=r zFd#7957wibFQi;V1LbO}$#zLEm`|IaEQ!=Q2o-8b)kb~0$xcgkiJL>JG4WQWpH^9l zcgR{HEvOE_Ra0my*W(xMVtL%(n0_Juzhv?U;AF@Jp?d*;1Qb>BY69Z<bm2V%Kti^m%Z{C~rx}wBp53j?kOn05^{bs?eu|leJ>6s%6JI{Qut5}^| zjb0!rA^f4F41B4eXbm_W(RD(nWQ*-M+Nz9mec{e#<7CnSS3;QliWeqau*H%Ca?xCP ziA!j0j=k8hz%klJvJdhhm$&ILk7&i)a+M|AaV_Pe!nSZ8FLdBp;Uptmm_jLi@|bN6 zq*`4gw>52e#h*dN%lY?PA3rv+!ktPdX0}zwF$LrICY6RLImHFUT*^YB`u>ORT;OKJ zSCf)qnA=W^xT=Y3+UijE^@&XD)}|Hd)FYJ-yF|`R9dH{f$ zNV}{AJQB>!CAxhgLu~7_RKzP8T@g=Phzm97d0I1dp`GOsWk;2-7casEGBn}REl&oi zL3+*jfQzo?NI+Xl2kwpkSSvpeRq-^h_D^B>x-B}9hPxcMJZHHGQ*rPq-I4U~_qLF$+9 z4R#{=40gXah?;GYjHyfG%)eKz$dD5vhi3rF71giXXU6Z8JE7S(H!D=AIkrr}SSsrn z{6C_HH2W4yCQ5oVyTZdFSWj@rS2@XLCIN%0whOG@8W1~;9P6qyFdEMBnF#}VkBgku zBDq01BkApZK^wKML~^VjBjFV~BiYnc&r!oq>P_mm1;3&s@1Ah-)4n{w_H`-raH7OC z7e{GE)DB#R+t&kgf7vlwIZw~*AEfMnk3}-q;Y9F|Cr80hc~kSXzgsALc)DK3ApL;I zA+m|tO=67Q?Q+Qj=4B6-pXoh-~m`=eb|0#K6285iV67Y7g9qqTo(H(Yp;U8WM z?olCcInOLVGv=*p&gO+6_;Tc}%B+gJur;*%=@w|QM8P(ow4!#CxUt2C)ZALyPlPig zsfRcwVv%V<#k69#Yc(wAEpl#o5*<0yXpFeJ%kx**>cyzL1LVWl-XYCO4E00@>4Ayd zf9?vbn*PUHy|Tw zgmKDAyfn(`<+UL3d#q>n1zeLhP)8WbF%7ahBpW+>GMrrF`mX39N=D z<`UoXc2)r|Q+T{}CegBaFQ+>!p&0tt>g&Gv3Wp+OfbLVHP0*jAZl5~Qfg?E{()jd?HF5EBI=zIZMCm5^@MiL?Ikth`8n(y zosjx^-sXX@aQ264SeBK$P(X!IMoO8do(8`T3>Gg3$F)1(*(`gug zDYAJiix=4;O~>2sWUT)@z^MK4KG#}#e1t6Ny?sdT8tBOH_>0oJiecg^<@`U+ed{ig zYel_(`t2UxB{Y*H;TPxkVfxB7bz5G;6uoe4Z0?)mL~kv*nV^mC>b19&w(2`#`h_C$cB=vc= 0) { + throw `This job type only renders images, and not "${settings.format}"`; + } + + const renderOutput = renderOutputPath(job); + + // Make sure that when the job is investigated later, it shows the + // actually-used render output: + settings.render_output_path = renderOutput; + + const renderDir = path.dirname(renderOutput); + const renderTasks = authorRenderTasks(settings, renderDir, renderOutput); + const videoTask = authorCreateVideoTask(settings, renderDir); + + for (const rt of renderTasks) { + job.addTask(rt); + } + if (videoTask) { + // If there is a video task, all other tasks have to be done first. + for (const rt of renderTasks) { + videoTask.addDependency(rt); + } + job.addTask(videoTask); + } + + cleanupJobSettings(job.settings); +} + +// Do field replacement on the render output path. +function renderOutputPath(job) { + let path = job.settings.render_output_path; + if (!path) { + throw 'no render_output_path setting!'; + } + return path.replace(/{([^}]+)}/g, (match, group0) => { + switch (group0) { + case 'timestamp': + return formatTimestampLocal(job.created); + default: + return match; + } + }); +} + +const enable_all_optix = ` +import bpy + +cycles_prefs = bpy.context.preferences.addons['cycles'].preferences +cycles_prefs.compute_device_type = 'OPTIX' +for dev in cycles_prefs.get_devices_for_type('OPTIX'): + dev.use = (dev.type != 'CPU') +`; + +const enable_experimental_common = ` +import bpy + +exp_prefs = bpy.context.preferences.experimental +`; + +function authorRenderTasks(settings, renderDir, renderOutput) { + print('authorRenderTasks(', renderDir, renderOutput, ')'); + + // Extra arguments for Blender. + const blender_args_before = shellSplit(settings.blender_args_before); + const blender_args_after = shellSplit(settings.blender_args_after); + + // More arguments for Blender, which will be the same for each task. + const task_invariant_args = [ + '--python-expr', + enable_all_optix, + '--python-expr', + "import bpy; bpy.context.scene.cycles.device = 'GPU'", + '--render-output', + path.join(renderDir, path.basename(renderOutput)), + '--render-format', + settings.format, + ].concat(blender_args_after); + + // Add any experimental flags. + { + let py_code_to_join = [enable_experimental_common]; + if (settings.experimental_gp3) { + py_code_to_join.push('exp_prefs.use_grease_pencil_version3 = True'); + } + if (settings.experimental_new_anim) { + py_code_to_join.push('exp_prefs.use_animation_baklava = True'); + } + + // If it's not just the common code, at least one flag was enabled. + if (py_code_to_join.length > 1) { + task_invariant_args.push('--python-expr'); + task_invariant_args.push(py_code_to_join.join('\n')); + } + } + + // Construct a task for each chunk. + let renderTasks = []; + let chunks = frameChunker(settings.frames, settings.chunk_size); + for (let chunk of chunks) { + const task = author.Task(`render-${chunk}`, 'blender'); + const command = author.Command('blender-render', { + exe: '{blender}', + exeArgs: '{blenderArgs}', + argsBefore: blender_args_before, + blendfile: settings.blendfile, + args: task_invariant_args.concat([ + '--render-frame', + chunk.replaceAll('-', '..'), // Convert to Blender frame range notation. + ]), + }); + task.addCommand(command); + renderTasks.push(task); + } + return renderTasks; +} + +function authorCreateVideoTask(settings, renderDir) { + const needsPreviews = ffmpegIncompatibleImageFormats.has(settings.format); + if (needsPreviews && !settings.has_previews) { + print('Not authoring video task, FFmpeg-incompatible render output'); + return; + } + if (!settings.fps) { + print('Not authoring video task, no FPS known:', settings); + return; + } + + const stem = path.stem(settings.blendfile).replace('.flamenco', ''); + const outfile = path.join(renderDir, `${stem}-${settings.frames}.mp4`); + const outfileExt = needsPreviews ? '.jpg' : settings.image_file_extension; + + const task = author.Task('preview-video', 'ffmpeg'); + const command = author.Command('frames-to-video', { + exe: 'ffmpeg', + fps: settings.fps, + inputGlob: path.join(renderDir, `*${outfileExt}`), + outputFile: outfile, + args: [ + '-c:v', + 'h264', + '-crf', + '20', + '-g', + '18', + '-vf', + 'pad=ceil(iw/2)*2:ceil(ih/2)*2', + '-pix_fmt', + 'yuv420p', + '-r', + settings.fps, + '-y', // Be sure to always pass either "-n" or "-y". + ], + }); + task.addCommand(command); + + print(`Creating output video for ${settings.format}`); + return task; +} + +// Clean up empty job settings so that they're no longer shown in the web UI. +function cleanupJobSettings(settings) { + const settings_to_check = [ + 'blender_args_before', + 'blender_args_after', + 'experimental_gp3', + 'experimental_new_anim', + ]; + + for (let setting_name of settings_to_check) { + if (!settings[setting_name]) delete settings[setting_name]; + } +} diff --git a/web/project-website/content/third-party-jobs/cycles-optix-gpu/index.md b/web/project-website/content/third-party-jobs/cycles-optix-gpu/index.md new file mode 100644 index 00000000..eae3d475 --- /dev/null +++ b/web/project-website/content/third-party-jobs/cycles-optix-gpu/index.md @@ -0,0 +1,36 @@ +--- +title: Cycles/OPTIX + Experimental +weight: 20 + +resources: + - name: screenshot + src: cycles-optix-gpu.webp + title: Screenshot of the Flamenco job submission panel in Blender +--- + +{{< flamenco/thirdPartyCompatibility blender="v4.2-alpha+" flamenco="v3.5+" >}} +Documented and maintained by [Sybren Stüvel][author]. +Please report any issues at [Flamenco's tracker][tracker]. + +[author]: https://projects.blender.org/dr.sybren +[tracker]: https://projects.blender.org/studio/flamenco/issues +{{< /flamenco/thirdPartyCompatibility >}} + +This job type is the most-used one at [Blender Studio](https://studio.blender.org/). It includes a few features: + +- Always enable GPU rendering with OPTIX. +- Checkboxes to enable specific experimental flags. +- Extra input fields for arbitrary commandline arguments for Blender. + +To use, download [cycles_optix_gpu.js](cycles_optix_gpu.js) and place it in the +`scripts` directory next to the Flamenco Manager executable. Create the +directory if necessary. Then restart Flamenco Manager and in Blender press the +"Refresh from Manager" button. + + + +{{< img name="screenshot" size="medium" >}} diff --git a/web/project-website/static/custom.css b/web/project-website/static/custom.css index 5d37395f..b7213283 100644 --- a/web/project-website/static/custom.css +++ b/web/project-website/static/custom.css @@ -224,13 +224,13 @@ table tbody td { margin: 0.6ex; } .compatibility-box dl { - flex-basis: 20%; + flex-basis: 30%; display: flex; flex-flow: row wrap; } .compatibility-box dl dt { margin: 0; - flex-basis: 66%; + flex-basis: 55%; padding: 0.2em 0.4em; text-align: right; } @@ -238,7 +238,7 @@ table tbody td { content: ":"; } .compatibility-box dl dd { - flex-basis: 33%; + flex-basis: 45%; flex-grow: 1; margin: 0; padding: 0.2em 0.4em;