From 679488dd49f31a11efdb653beb62ffdb8e2c1ea8 Mon Sep 17 00:00:00 2001 From: Zallom Date: Wed, 16 Sep 2026 14:07:08 +0200 Subject: [PATCH] =?UTF-8?q?feat(seo):=20g=C3=A9n=C3=A8re=20les=20images=20?= =?UTF-8?q?Open=20Graph=20au=20build=20(Satori=20+=20resvg)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nouveau plugin `plugins/og-images` : au postBuild, une image 1200x630 par page de doc, de glossaire, d'article de blog et pour les pages marketing, à partir du titre localisé et de l'icône de la fonctionnalité (chiffre clé sur l'accueil, points mis en avant sur premium et business). Injecte og:image, og:image:width/height, og:image:alt, twitter:image et twitter:card dans le HTML, et tourne par locale (fr/en/de/es/pt). Ajoute aussi twitter:site et twitter:creator dans les métas globales. Rendu Satori (HTML/CSS vers SVG) puis resvg (SVG vers PNG) puis sharp pour la compression, avec un cache persistant dans node_modules/.cache pour des rebuilds rapides. Les polices TTF/OTF vivent dans le dossier du plugin (build-time uniquement, non servies). Vérifié sur un build FR : 43 images, ~26 ko chacune. --- docusaurus.config.ts | 3 + package.json | 3 + plugins/og-images/fonts/nohemi-700.ttf | Bin 0 -> 40780 bytes .../og-images/fonts/objectivity-regular.otf | Bin 0 -> 41704 bytes plugins/og-images/index.js | 376 +++++++++++ pnpm-lock.yaml | 588 ++++++++++++++++++ 6 files changed, 970 insertions(+) create mode 100644 plugins/og-images/fonts/nohemi-700.ttf create mode 100644 plugins/og-images/fonts/objectivity-regular.otf create mode 100644 plugins/og-images/index.js diff --git a/docusaurus.config.ts b/docusaurus.config.ts index 6cc6acfb..0b0b6db1 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -106,6 +106,7 @@ export default async function createConfigAsync() { }, plugins: [ require.resolve('./plugins/llms-txt'), + require.resolve('./plugins/og-images'), [ 'docusaurus-plugin-github-editor', { @@ -235,6 +236,8 @@ export default async function createConfigAsync() { { name: 'theme-color', content: '#D35F5F' }, { property: 'og:site_name', content: 'RaidProtect' }, { property: 'og:type', content: 'website' }, + { name: 'twitter:site', content: '@raidprotect' }, + { name: 'twitter:creator', content: '@raidprotect' }, ], docs: { versionPersistence: 'localStorage', diff --git a/package.json b/package.json index 0c8c3fb0..edaffc89 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,9 @@ "@docusaurus/module-type-aliases": "^3.10.2", "@docusaurus/tsconfig": "^3.10.2", "@docusaurus/types": "^3.10.2", + "@resvg/resvg-js": "^2.6.2", + "satori": "^0.33.4", + "sharp": "^0.35.4", "typescript": "~5.6.2" }, "browserslist": { diff --git a/plugins/og-images/fonts/nohemi-700.ttf b/plugins/og-images/fonts/nohemi-700.ttf new file mode 100644 index 0000000000000000000000000000000000000000..56caded5a1f0e1aa900ec9bd70bed78ef67515dd GIT binary patch literal 40780 zcmd442V7J~*FQdU?>2T3qzHIBxj3p*&G%+SI-Izp;G0hkY?B4x-XYMXwd7d}VTmGN_>SgXd_sp3yXU@zy)9w&T z2x&oP6Op9$NgX`Q<%P(8giKvTh<8|@Vd*`F7WNeg*>HpqarEF}ox{eQ=wCw!9f??( z!_tz{rqz}oC*=9ocn-@c$twSF`MFVqsJ9WKB>BbD@;)m+;7f?(MnZ;H7Z|g0V~*;x zf%`SCr~&{w6txThJy$&Y6qHm=&FEQDj^~4jf2+7GC#xa7pmYcOS*i~a`Z(i@Rj8n3{WC5*V5d57^)MOH3 zKKv6QO@*CGI07Lkv;lURzzvo|rn?*8ouagYzM}U1r z;u((il=WIgsu>MknB_0+8OvWzZlt?*6W;wo)Y>;JKRe{%{RqVS8}wHrEGEg~T2gMe zf?vr9*;Q^AN|H6#NEf>ZJP#)k9NrahTn^Pd%u{V3<%nA>uC;ioRujEy3enpo6SYGP zakt9?&NswcGlTSGFyzUi3ndxq1d^bQ0zVtUV+q0~xGs#bl)MpA*9+>Luyz$_Q9ZwGEvt;Hfun8Ai`4cTuS2Y^?0u*@yaBm z;|Q9$q(;0!YLv@C7ngXBJgq<;*rkL_6%I(J6ZDB)&>3Fl*AYS=9A;boa`=;EI0ljk z$HgR>=@Wx9oqFO0eN_DjdIv2_*~N6X`6Yg48O(GU;U-)&HG?ekRo|gppod&nnZ7o= zSlKb%e&~X1nS7bva(!ev`RIjmV0x-rOKP~@GTpUa;yFt{CIf_PaZQ8HJ_EVbFnwlu zd-USE-<9OyebWU!X1dIDn#qBs|5ylFFnwTk^hqJBtBgk`AI95%6|#EH@c&iF>2uT8m`M!+&ZAZ8t;U0vi5WWNXm!Yn9W986dAM_@a6tlJia%j)m2VP%MXIWdr z+5>AC|HyMWZ#y8fM?WfWptRZWoSes!D;~Sq*-b~)C+?$82z2j}lBO!11 zP%i&8L>riZHpz|a4=Y3H5O0^PA>&yL!?l55HM~7LgL@O|9qJ3}Qw_@##h_Fuqxuwu|YF`Ww(fowT<8%mTENEs+=ndjJcBXN3rRM~0F_*cxZj znZ%HpWH&iLEYy)Y(NNljCej{s2pvYp(=0lL&Y~-*MQAHT3#Wx|#3P>bJ^#|X>OJ(H zdM~}7K2#s8Pu5rIcN@ICoErp-1+?`fl*E!3$R6?rCA1}V2F);vA`Y&sP* zO+stXd{4LxnzKD`>s|D%_3dEF7|obwG%2TP2fF-cxkZTOrX}C9|lQL3{+)pG^$kSv4DIqh+a#BQ!Ng@1`Dl(hQA?wIuGL38`v!ET%k$Gf3SpdD- zNp_K!p)IeVY`2nE$$sd~>*NjcCOJqBk;7ykd7B(1@4y>*mmG(mvxA%@r^tKcH2Hu$ z4~;lW&XEtvd2)e#L|!BxlS|}N@)`M@Tqa+TFUeP=j(khLBUi}xhWG66cV0rJ_3QYFw5_M6E6+WyRdt`L;#OVE^R=o29o z{MB-3&{W**gyy`<%PyZ3aLKbWn2a|!$@}Cfl1`S9XUQhA8Kp4|Ws^%5Lfc-4&b48XtHptBoV`6anUHM9d=M!y#lg{i{J z!gVoTTp%7%cq-x*>5A!!jf!^_SCpc%gECf`qO4VJQ{GecS3R$~t&Uf}sBX}V)V!y8 zU>9sR!)~wLCw4z;U9^eX3EHQ$yR>Jtzw5NRZn}QDI^Ah|Py6}y+w4s(id(F4aB-OH zu-sw0!&eTs9U~okIi@;hI9546?YPQuPfKM>*OvO0eVhcRxlTVg7dU_JqH<~JlIc?F zGS%f-mvt^%U0!iH^D}<<_)yQtO=7ueQ;(32GD5CZ)}YHu)a@9-Tc#wNcW!X2UMS8;0YC^M-E?Hw|~a z1TP0K4=+EjFs}r!eqO`9vb{>Zs=XF?t?=6Hwae=buj5|ly}tCi=5@!Lc-woo_V)1( z^^WsS@lNy3^e*?F?!Cx+mG>6!-QEYiPkMjk{k8WE?>j!k$KI#4kB?8NPn=JRPnu7r zPqEKbpLssZeKz{MV1QKyZR>krut_17Wh{A&h}m6 zyViG`?_S>{zVG{9^1b4F%lE#Y!mp)YJHG(GaK8k_xsiFfxpt<$-ljSpns%)lK(*eQT|!}h5i%$XZSDnU+w>b|1187{7?CR?Ej7b z4gWh(J^O&x0X_kt0dWB-0cio50mT7R1Lg%R57-#+Qow>8LHm>QT7SP)nhI6H7rU~S;Gz}EsV1zrtu3~C?LF(^8yXVBoF{GiI9SwYVP ztqIy1^lH#sL8pU03HmPRm!Nwc#g0xL<6%vz(ZgG(3x=&xbNfPu8JrB%$>8K`pazQn z)w&LMzNhb~U%2}%{Xz4N)Sh0u7bmsXoYV#1xn%dky_*`h6L)j%HnIzrD8q76m#Hg& zRf;BLn5&1NP=ts1_;?7B5n92=$J8Cro&AWyJvh=J(3lt5TKpy3}wWGxGpd(*AVG z)vI&~LM4Mp4R}{|_1Qm;ugne$%U*f>k7t|RTktb$#qOG&uHLY@MEPe+0rnSWo5@8} z1i7H+JPgt>xI3wBf2-Ah)E^HGRqSdQ9vZ4_$K)X7h6z)`gxD~lCQQh+#uqcVTuBll ziWz24;VMIwX=@W?+ISZY+Q0yPeQL-wP(8|?Q;qLCK zM9~T;S|QTl>P!>{y^oJ`WJHMQ*i+nG>lkte(KUI8;6+_chLd#XE>Q1>31~sK;FwgG)Sf?M&tH*IZ1lo9%IXA^qh9` z>Hfm8m!y+Ytgawx!sZJWvi7CFUM}k$=;+d-wP!%g;HV)r!-8T;HydwBizUR;*D zt9wlQC-v{-2i?n-1%LS~q}evz5zk;4;2B zmwtkupRKkrKHXR?jB<|l=Bj4!x79q(@T%8~tKNTpVte6h&slH%DqWXOylmrm(DDz> zG+^5sG|qfD!b{j&zd-mSEF^tu?cQu~J#m1ajqCWDgVT4@pnJ#W^#a!>=>Tfo6=^cU z`q#6nzMv8Bn(CGHQe2|L=uLBty?n!SSD(5A?yI3e!=Y~m)>=3_yUEQ(l(TarIJGtp zxUEj#bcMF2{SO^N&2D{VQ@Yu+L$^^?%hS`BSB>h{!R)E1dRICq-97hA@7~XxqgtBs zuIk`}rzakIwkX+PNG^Kz&_op+2TI~CC+)J39%?(%bF-xvWlc}kStmpM;1wTJ1r6J^ z3q29V$14V#J-e1{DafxY>xQ&cyQD8}ADP{==jM5H^Cx z(p`jf-Qnj)^40-KvxNP8yjz7Opb=(mu$(@sDyk@2dDgUrdGg0<<&nE|E%kn3`j^t@ zudFg1E__BZOG|$?N81bU=B_bDL>SlPn!5`#&2#PTg&FDd$A*TDo5$LnqW7rh>(5j5 z+XdS3uijhpGS$72dDkQ?u=gEUH6(TN0AEFsy-;EA+qa}||H{FERv9hSbwWvC#4$_e z!5s!CLy;N7Ns`Eavd_`ZB+MT{`FQf5Q_P9!`ndt*u0 zn37Go=Bbh5wV}%>q4}3DQzNBI%?Bc~pB*!Ld3HpySca0ykVZDz$!<&+|Cyy^7Wu!n zmY)TsPF{Ox!h}QXCJhM;95QJgyI(swHAvVgj1zt|JN%EVrYX_vBz7l)xXc5>|#zYHHAaV@_0>W;a|Gjw!_>BGS1Z zAgDjPb4gP|@2!&K+0|I%A&McIvcGCO_j{|A6^ir=SidqkRt0d;$Nlv(+NVrpwlTq9OBQeg^X)1^AG1D+Wg+ zdBC!>W*W482MsizT{d9AvNMwO+4k+yXVRHv1B9co<#h#xb!D-!Wp#xGb>*>&!F#0- zBuKyN^av@$8a*{g#|Xn|EgK;)~Dr?fdM-#fvX4@7wR$i{KmcMq+?& zc_ZHe<`m(eZuy;Z@LdkR2jQJ3#!Y08%ij&=B^-^e-13LOw197Qw3E&Ikv$}Z$jJ!$ z>HBXinf=qd>nFsC!FHs^534aOlWI4hTRCDGBv zTN}BopP)EET{w@DB%R;ATRJb9Igix!fWkahxBUJ)85?CjKV7=?lFa7@#-~|l=LId0 zrTKr$r)HCR+`r?qzCgF4;k768Sq?r2HS)=7&Hr7gYc|~}Rj&QdOP#V(*W3b^ouHZ4 zTH|i;lY3*VDzUPMC&c<`&e5_bD~JNCF~jGMi*poS_jpaZAwBbrwK7>N+BdX{wt3CN z+}|;7+}z=Eonmz+EMso!r*wS%Vp~PBRkXzoblj(@b2Gx^+SCPHy$Y`SfGhaZ;NtO~ zgF?Z4Cz#+6g|*`#*LmJ?Q1t&*dK%9BkokL#98O);r`k9us$Ep>vm*;O$&JXUGz?6((>jrVi# zXyM-0D%G6{abqIT-)e_yZLwOAK5-|P(|N^ z)c0&LS_dZOKaihra*4EO2zZicT&-V2U4!|W!+X9M7NmE(Hz?PWM}hC&(y*>1FGJf-BZ!JV#(!|0|syT z?RlTUL9|Mm7nl}6RdhG)yyGR*wRHI5CTW;-erNe7G~{USg5KT(S6yQ5eT0?Q1hlaR zTSIDfx8*7irdd1N%9Sfdf`T^+%zI>gA7PU4dZ&zMv$JdSBYl#_Rm|@@Xj)pw;PhF; z1f_Y?6{+s8Sp`R_ZfoJu9m~p7-9_Qx3hAa)B3VrMbA636D}CX(u-Nh!@+7CooU~qD z+IEN?9u+yPYdbo1%q#VqSNytjtbf1aXSQci^Lb^vA8791b84rRh6s#| zlO!j1c#B>RB2!^c(bjr3bv->rCTaL^PiW6X!}J3`FPrt_v30D)U3cuqS<8OjKf@q0 z$8p%AtO#@eUi04mjkc?kXf5@q<&9jN#>k;+Tb_gN1`5UzJRI z)|-yb?jSI0q^KPJ+$3~}y3c-RPQwgko8M@`pVKnmmTnvpg;($8u(F30(_G{>;Qt~O zWgX0+oQi`h@)FV1=J32&jkcUE*dAsQt!7BJjy#8aYJMt!2`ttq+Oj zAs{WwL6wDDIE}pRg?rY#D7#EOw~+>{*mQH7u?^3Rcxvsp%XDJ( z=|l|Xo(KF+HZJ4B#l%b8oG2XAY`T|&#T++)i}fbwIj#$Ofee@B&D#mp0G>#sEuPB7 zH*R!7;_#QL^Cz`gofK9gZwC(_*dw&9`J>SME#Fb^H?*H{nru`^m16IVxurJn^pOWR zF=&b1+?|;Jpun(?5)9EO;h?_bh=mz(O9xE2IR10#_3tZ{&JQlD0@QUhazI&MpB60y zm5Xc91?j@+Wb+l4Gri@cDoDEy^H<>3=%iBdL8GQ}aKWuAsAzpmpS+|F=9H{=ss3oW zW#xmrPJ+tABVfqPk?Q>W>%WrT{JP9fwNlVCs@yxbi-**iw5)v#RjEYEC5_o2yeHNP z=QW$|r>kGSmm`-F(sszjEk^rn_{@uDj=ge`bXXy+F~&4#!9{GFIX%bWzNDmDLFYyR785WDvd4$P^k&4`&bF#qVN z^K=l^e9%wyljVE&%e%R~a+BKYbmp&|oik3*;PaZ-(dXf#uC^Y42qNY|%jo;U!TO<0 zCot}&z4RZCA&=hiJM8566DKgQ7xep%(RhaQ|H6qA(hJgOcouGW_cG4gnwhzEp0SsA z^ZWl%Zy54|6;++o6=IGS^-ZpB7&wiFq#2C-g_V&_Pm7_GyUROAz zdUTw(qxn7i`Xxc;I$>N8D|z%v?T#Slv8ZK;%LYoLqZ1VJ7=%F&@1a#ILz8pipirwF z;5j+j?SIg!y3^pInt44|WPkbD@zo~VMhN5T(t6|%j_d5}=c%4kgiC1mZX?zhiCMN&YVA} zXJJ}W*Dh_^>jzF)aaQ_kpVS@PvT{lUx6ra-&AGy;l9M6Kt#JrA(g5?^I0%e^Nj|_6 z#RqugOl1fslWO)?Onhs8zs?!+hfB%yo1ec-t36*m^X&4$=D3}-7yTSd4LZ<^wEzA| zUr47Tt_{f85TNXTECc4@p|+5s_8=(=XC8>vTmHG zQo>l|?Ikro(C();HS8Iu&U)pyXZKUTk0#ESEYjjXp>>eG_Am5hMK)#*={r&MWN}f} zkq%XKy;smuxku91WAqRM{@sP4Ce>&f|KMFSbQUFNIi{lejXbJgNKjhm zI@sW%B9ckNQ@}VU8#va6Morjo=HBwMle?Ccrn-qL`+GjZM~)H6!?R0c2Q4Ze8K)oc z^gETwGfPG#dYgTRthr2`XsM@rB%}BKW!Mi1GWDy9Zdb`1)BKMjK8I| zH&;J6x1k`?G5z`LD{^;D?<1TXxcmYpW!`@+ePzw~9^R?Xou4)B(2T^SSy2122c)~w zc4=gNTWN>+u2i>gegiGOeu{>ESQL~tz3zi4^s5sz{L}LAjG6tsBbU~HyrVMV?&;Q{ z$s>#6$JQ2hjWDjx%37TVmxI?yyC9SY8q_Qg1&QXZA0|w+f~YKW?UBFyG!?hqb5(zy z{;RZ5`s&h(VNRGmIzVe^DovybyD`MM@vD;vY)bqxVVo_pG_TDRsAW zTuPFD#lP;-yL(dC|G4U9>HcdO`yt!!Y1EqUYy0(C`NM_{KdkK2ulD;jPn~=!srys! zEtr3DZucHfor;_G1MU6c(jRsfw^6v~tv@&8E!yRa$&C0spdB40*wJzO=9#3`H%>_(pD*f|RBCPa zhL4@Wl;y!iD2rW;tSlL|g)vN7vRCJYv$`v0s^?<8qsZECRQkF1@2fS+-R1+VRiGyI zdAn4+W4?skDmW>-nlCGk-rtRPY4>*vI|P-v9xHMRl_jb#tzH^is{`Fja-pIxyfqgW zUkvHl3I3FdRb$L4dxRY{V1fDE%`u{GkNL*$SeNpF`P?7obM$?+g?i93^NrS`#ym&5 zHc@CTjoo8Tz`V!wJ?5{a{k*kN)~nK>-P{|5ZvgK=@fJIm za|@SNcHS-Y?Oc+VeT&7};KHm`eZ-{$ufjk@5Ah9imZ_gv>#*R@YOL9^zIW|OQn0p` z9HWT@P_)XT2j*wJ*o;j}QJ$q`Wkx>MMB6#Y9v+%%+KOtT@Ap){{a~4@!p^~DHlHz> zghh0R7h9}_aui#r&uh9rT#oAV_jj`rRK>6oG+knUd77NItB&;7?6dps7)AU!;KRVJ zgB_#@Eul^*RVUHF#xBjpkwUv@)+5jbOHTD;lrPfX5eGAJb|cYRL}JYx_x@qaG5N_l z(ae-PJ!Z<4uI{QdXT+pD> zinn{7nef4~)kgz+xWDx_%&wX(N-5HB==CZZy|?^Zwh~{eKUnALA*<{EN8zo-WS*ywkDq`R)7d%7$0s~Yp>T6{wy80j zCX8m9jNT(_hv1;Hz8fYu`Mr-k_)56QA#*nR0wbru@MdF+#EhHz&|LHN_XljsKYrv; z#&Kzz^wlrhMvkcanflVvCyruuWBaR{)4X~W_73eG;%+|S*lO&OLzOH4-kX)R@6M{} z?>#%RMZ2umq)n%2&+9X5ev;n8IESB957)#~Dv%CctEstxN$jokHoXxru%dszvi`ol z{mc6GuNW9$ey2_6o*n7gp!h)7^esP8Jxzb-9W18w{Ao-2(DmQKf!lj@^1F)%`1UF8 zqwq1;DPFk$Qu@;mq!%xKByFpI+IW(7cuVx%EB$sPdo5;2m;Qa5?#IYn$BPwHzLic$ zlcW%sTay$fO_SdLqDpnT=!Md*QKfYgiZP_zwPY)^YEhC-o6|zi>&7sq-Oy|}muqwro;ahgFwzV0=7Vu@LQ34-|INvL?I7XeU#HDJ!q?h4|69}i$TgeizlnOv z+IZAdwgM)SY4AUr^UqMNc~HnM@y-AK}Pl zy(n*Esce|#$y9mfQw#If=5V-pQ`zXhJ|#cfpgR(}55(%rgk(%(n(WxUw2O?b?cMjNo`W$EV0 z2}P%<+wNCr+xJULKahUfn>uqu=guQ%rVgAk1ash1RLXyVgjS4|r3gt3gak13A-mkn z_d8W(sA$9PSNlpp)9I&%C#)`pzv$kL!>y{f(*0>klkd zuTF~9cS|px*~j?u+~F;SbFQbPqf)B*Wy~f0eR1ORKiFE4(0$5F7w;_=46KdLFmF<3+mFUL3`z3Eb|SesbNBVrqIvWX zl-bh9e@V;l&6shQPW+2@Uh?VEl$52HbY;K1FZGnXB@HIF%<#Ed6W#LR zhiI3!(k-xiLFUcMQ2Q~kdn1)g?C!(vAw{X5@<-iCZo%Y{9xhcjpoFEKr-?Yrmp4h!p*ljvFcHBI^Ar_nruESPcW`7 z?CIy=J8<&Q(Ylj`A4{h$NneEP5SX8K#Hg-aOm`5w})+6UOg&I6F$0T z*~Y=QhtEn20)N%gGU2ZMX4GBooe6i%^Q2`CE&u!j`H2AUM|3BVpV6w;S_fNx6ibjF zSn;NHT^Wi{X|}yRovk~0djU1s+pV{!CT8_OL6OTTj8z<&w~Ap!Mt>M(7Nhf%iM9Kauq8jhLxZ zH~F_Z_1~4+rQE;e?;LM8y>q<%$0En6ws&?_iksRijj7#iSgt77UXfNYDZuVy-5@w- zKUi+1y2Uv70gh~hFi8v-!2+L&W-G`H_%E*{)1H!4CUYv?D#Fn1pxz>V<9>_!Kk4bV z^v$;PG#r78ijW6iDRwucDR$F_VJcr~xd)r?_JFT3R$AjQ(tZVBTbPd3zP#UxN&s8W zY&sj7B8~Q5wD}2wpi-be-rR=}oz%P$fR_W;L0%Yx`B`-Nn=kTE7fLXmWzym6GpGMV zd(x%!T!R@s+h=L7Ycp!DO7CDuA<}Y^X3^k3ca0wV>OJX#wDHt&3^#pp`{gkiuiQni zF3-8k9`Epu{;f|4?T)qYH@Yxx;^Fyy)9Zd&W!gyJq(iz6kM;EImL4r_?QXwf#x*R2 zn<#ZLH%Q@F)Oh5l=`*j>KJ+q6xD?msWTJjjTu~=OXxY18M`AO&g(O3evppA zSBaD!7UzbOOq`c)@8;s{Li3&t9W#GKO2yDfdwSh@;pftoU5BOjzn?MVd)oEzF52Pp zLT9OsedN%Jlo9jCgmQ_#1&M}1q7hgf^!86PtP=g$@{mODLZa(WpOv1IPFePIiAK?) z4?bWLt=~Joe(B@`)4B%_ojPDUbviy_)-Tfj4?mRl-<&<+ICa`SV9K!I?$ZuDRwqP~ zEa^12w9i4#YPK57=2yY5;Io*GHV94@*Wt(JU@y=Mapr^Z@j^;BbIyN0AFEy?)Zd+H zGKmT?@t@Dk$|GS}u%QXqrNHJg*`N>Fe(SgfI*Hu*=1U3rut$i%I+M0uWUE$el0n;Z z&~upWmp5$?5^LxHDWh8d>30dex!f*F>&q9$Am`wQ4H9VWNuF?327LM zR=ZkoQ17%$;2KJj>{RM)_5G#g%Gc>6X?cATEf=3szAimi-(Pu%POMLop5;A38g180 z+sZYYRNf#1K1?JnJCgQdPxaQA^(}Smjz-6qGUMYj5%wI< zEUt2n${%UQvEGC&2|g2N8~TF=SUpb04qulW!A8c}r295{p19kxGWPcN?#;qpKAK6pr5mRvOgKebV|9`{ zyOVz2J$&BiPMt>28$M#*sF09R^SG?mh#z1bD4QY0?1_NMN;Z4Knip?(Q6cSW6`Gbf zhU&B`EGRsy(sk;b=ZgCQUHX zqU>Z^kr0wHDxfOJm^Z#(@X$41EL`^Emf>`cN7T^h@WIjTL;H;hst(G@8QUjFxrX*H z?AW<`P&@k$_MV-4-Qx!7D$W>(xGPcuYIDj&c4GeZmY5{tn&|DS3-V{UGx- zM>zw0^ht?-sB4VdD_Hd|hBdU@KR@C@+lL*-K}1 z9)a!scS-K#sF?Hq!am(A>T*(NjqEIT896N_V|8I{&!>*Uu|wU(o~AeXs1E#2 zNR-WmxYI}sdMQO|su0(3z+HG(x^7MdUTu95e7U4rF=mD7dub;t4Ggo7kVpEmFbpJw zYkZ_W_r7M!)>s|I+n>2#Jd0RR*XLrOvIwhVp331h9e$;ezkO;PYYAqn!ui`-ayx*x zm+=;{R0hDk*ti^g>!&DM0a#h|gI(D8yolLkxgVU*cDE*hi+|G3{olf|>u2jP8xK)6 zs*37RuJMpmzvTt#!QnjmnIV2uO!UYELkEQ2M#Xoydza(AK-CA0c?X;D^xa2x?JDEN z#sW{bFZVF$y+BombB%|k21f5KBmGRDFsf_xD9}q76~pmDc)xl9y3D7FicZS?>JNCo z`qjZt=vV(&Nc9{30VP}MHSZNvo3*;vxE{H%+Ra7<*%Bx?hgbp?jxK@jH8vS;@-^Lg zAQejAKL0%RqH7*x+GAa1@Sop0c&)$?+M;XMq(#zSE9@VfW4hTzx~X{;WgO2-*6Nlt z?m1DrMEPK~)e{$tQF%t@@!_l|EHjIK;_5P=9^+$w*iChBj{A2D%A~?G(uuDs|KoLO zzR6kG$iWw*%{sa`BcX9IT7Z92n3r1W+^%BRH;bNn7t7EB9G|!h%{0%U@Ri?I&UyRk zjCems5Bt__4QwgfpeQV5n=+6uWgGVfRloEUma-)TwDi!nYNPKI>+jzq+<>_;)O%DS zY-qCj1FYVo%!JXx)rJIB-2?RRm|ivH3tC_>-1b&n>-qwQ&Hf?A4-N6Etq;bst0~rl zzYvqP)nnI%zISHLjidMnn|mjt?5$W$NN} zLza9nH-Rp23G5jfGW!YMhUCT*8~q;qWKe)UybITc+-B2&6fXrU#BLisxC9LuBt~5IZUD+ z?m;m=-Z6ph?t!shJ~2V=+MPLDCMG0I+>&DpgL{U!yNC1)4({2hb?Z(&nf%P6SYr7V zy>imaTEXCAMMc}z@-X*D9J*1ud!lr})9+4>nA|OBSV%%nZ{Pma8&X|_q_VZ6`c50( zS*@Y7V3^zaxA7a05FkrS>86{ER-L!s1{ZG^rJHold`>z?*B@zdNOMn^Wu8M5q~lyF zntP4d1~&Xa4ZzMj)Z&PgMe%Wt%Ln&) z>QH41UybyMt5--HcVCZ|T6^h%R@Zs>w7$J24(jN065Q)C@lm0V!|?)W^6q+ zZU2wnCk4Tvr&`DYc?k z_pBb?=JP&qtNYFv6W+3=`4vx(=)%=+eKWm|($~hRbN1d{xsQ5Xn7CNFCrvZ65kRa( zwhOSIk6m?q?s1rPVFz(`f}=%zMK^_~;OuT)cZt0+wjl{yV@$D9HMx!k(mK{|(d{(& z#RJk3^9Rz*ANEkUFSkzY-BK_-bE#Ww8onL&`$M zLB%*^W}tL#`*s=vB7{y8rU+WPeTVeIgbSCj+4JTW;T78YRM94^FRzjA&pZ1}pFYo= zoj30s3(slt%D+lu-lj}Hl0t3Um~Gpf8BE^F%-0fO^RSHx)A{*VUSBk(vrv@r zN<9{V%=_XCX`Xbv{*?@&sPmXbuU}#97gldO{D`%+SZMoidY63lN#p8mH>^XE*X~(| zgf3(iK_&wTc=j2b`tgYzpsER#BThIaTu&->moC;+t)$^)T zCLWmHBVo!be0{s1z<}C5)heZ8v-B<2x0jwfxHY+D&zDaBH0K{I4c~o#^NK%qj_ovj z#+G+V>5J0cL%AjAsPCb~@kt#9uDZ0aaW%XzR>Mzfz8c;qIlFsePEYT~RpgeFj=dnk zf%vKf+XpIde_;J^wgRHrHi&;9B{q8Z=rDq9Gt$f(=lAz(*>~T$>oY&ZXKY%Z3^C90 z98$oR@6Sr+LV2aKn?j_1^{=V6+JrLw$1|^{wCuP4!|OBu!SUOi}Vby~1(bH<~)oRoY9jqTu|3m-bPDSx6 zSS&A&=>?r*Zyg8zK8Ki#j^eS7~~b3Z}(zN(dQTxxG}YTO$A zpKt$XpAh6NB{ad7TkOS5qDnh~wJunBWK#_^?DEWlZH(seGFJ_2_=XZirv@TXw3}m< z`!Mi%m}(!m{%1SW)T8S!oK<#j*lM0f_o;KGqPNW-*tXF8!@X*lK|*_}>+X;QPXMb@ z;g_x#o)XSJ0lrSr^NH|U;p1lT#6~)OgzuWcb&c>1!fQ=%N54k+DlwnINrve*+e;5P z`U>D@qhc=Mej9y9RU|HzJu4@Js;IuD@(*#T6b4?GVx$1Os1XN_I^yiLxCmIE(+C&v z{UB?vQ&Z%?cvQ%Fr9*@>%$H-|aA*c!Cpte7UQ3^E2G=&y*+6GAxMeU5PzIN!Ql>9` z%JT&JiiOSK>&R*@gH3?PG=tY#yg7U(;3FNF%w#$nED8=^06y_O2f*P!BA-VrI!g@N z`5IAD88um4Hq?o#jP-8Ho0=?hn$%a=E$2`BjY9z9!S_bIKEiEbKa(~41_w_c#vbtX z_!1W{gGb=&6bqjSuN7N0gEP6xboz)s&EPB_GJFH}`!f3cYY;qLY=TF+YlI0L&iD9p zIA%aOKSQ4gU#D<>BD@y6Lm7RU4og?2vq6}{;PPlcmn+8lL4Si#)eO$+fDB&;yUppq z8?NE}w6pRV$l-iflAqxpm9&Ci;*XXG^4POxV1b>e_0!fWXl&EPB#GMx?dFoRqAu|5^2vsR`r zeZ=w6*HX-F249CShcSF$DI%J|Yb~A}J`M0;I!0fnvq7?O_%nd}@jQ3n^uMvR6#DQy zYn5(_)3!RIbZamwHYiS;Z%HGBR>(JeB7ysc%X-Tb;p@cA zC&Fv#Z_VJ0zD%bN77j3-k?FI1$nXvH0*CWmk33ypp6(i~#%B0@Hxh>jTltyuMEE)} z>51@KD}9*`OIN0|f$rt_d{2jNJ>b!t{yK3W@j<#WJhu_PfxgAzu=<)>1CgW?0S}Xv4+13@(*M;qXGyebJ@|WvnA?QQ?RvS2` z5q||e&21gW*D?9a_$vg;^+dLrO*U{P>^-xkGCtEQ8GohNM#e|El=1SC`B|+Lc)28- z+p^uTHhgMSEN;e6ldWDuw=|>A+FqId8u}%t&&sPCFJF7EhmGaM_JQ*H5+K7dvdHR@ zjL-B<#$O@E%kt;=EWa}T3L&f+J}X}tzp;EdKFhC+zf$Zcut=B;rKL5+%31s z4BuX`;nQp}M)QR%e{BNiUuETU730S;gSATzF9JVEhFe6jGvHg`x3%W-4~Q)W&Ou|o!YGJJuo zzQby7H$XdaZ4Qy4#~2j42EU5QUZ%a0n*k{FLz^I6% zGrkMU;P|GGHi^sFL6)VmBj*u2Ar*S2BQ!^bTVx%nHr-<1{s0~9`)etp457QAQ*OG& z_U!?VEhG#sWE1A2!iLzTV!RMuM^f`|g}6VypO5kled5Y{IkpXbay~U4oIf?^!|Eq8 zx{5-s1F}t9hao}e0LBP!HTMU>2dpd0r|A~^{sj1A_yWy3!Jw?h$}J|RPBWEDbcuk2 zy7GrcY>{S)9UEJaX5J>vR}MAJu;NS2@bkr@`aLpzc$tAnRrWI1DTZ?|Q?{(E#>$p; zo!Fmi0Fy4hC1S&ebhS3=vfa%#eB=uL{S)Y~!Iw&y7yBrETZ@4FHmy99D&oy4gUm>{3Edry@OPAx*38H~( zF{jU4D2|V{MD? zjK6~3YogEl*E0SpF{%ll_aS8bRf4ezpUa2i(+R@vCVZ}K93R>#+uLe$0{b4DEx)u{ zJjCsJ9_;*wT-#*&tCg7?-W|EW%;~#vIn*joaQb{lHK!jg!xfVlKi0llQ=hC>Sjq7p z^-pWT5A#n^+aKzytrItJ{73!Mb;3{0@R?1K`*thE!e;o)&z1ezmBM}-epBm#w!Yeg zP3-t)w20X(18VX?$!RdHbv5L&(d31hRNjuz#XP zNX(N4ye!Ow{g8L$!+y9h`@vTMHSWh3gUu-_SKs(C-4loJrY@hX$qKoPnjrLdQw)8PDW?*xt-n^RaCn>s%;LY{(i_3P@>F()^Z&%x0zb+^R|TdKO-cNXcU ziWO1;OZBmNNb5`&N=NMDakL24qu#NcT}~T&IrYrT-{=y>e1BIMWtcdp9VzG5BLz zx?bqT;TTnO=)tvptDG}d}q6}Ac<+ZQL2D~K0MY%WG1s1+p>jzu7&?blG ztsKpwCpi4k+O$r2gVTQ$zFy(q49>h)x%O>P4CnAiYuS3b1pOnXUE%5+k*x^kbIR(R z2kxq$#WPZ&RlEN8=XX)O#FLhSzWhV$WWA@DiEm-O7ce5`V!apPiF;V@75Msj59_@W z*s0cg72sp7_iDtQV7+JSKr5{G@B#6aayealK*6k27z?6zjc$w1dAY<0ujLfc0Jl_<8HS8gXx0 z@9ltd-+HelQx(qEdwY_ic-ng3LNQ!%(R%OD1P8PBb^$URJZtPCc2;B+87m9$w|r97 zpt1sEN#Rgq{-olpis8nJ%EGczeV35X(9mw(hJ|(PRDPjuu$Yhd49a)SD1DefxNS4}H7=4Is=LxT1CTw`TneyKjIG*_QnSXot3m_4b=n5)m8 zrXR|AWdWECDX6L{uZ->7dCHV2A=$=)tWrcTHCA<&DdR8l)nl4Iw`@vjaamSwVQGHn z!qUpBtm0za>aE=9^D2zS#^m+W$|mWv@;RtXUsX_8sV^?fF_u;uL$qn^$;PK1_bld= ztO{c=kCl^Es-IM8)E8Fq7sb=`d1V#)atN`kG^?2BCa0{V#8{D2h{y7ZvLa(nRb_}i zt)N-*d4#l|eKR#{$w z!=AvNQ9q@u0u(FCCY9y}>kIREyyC(MkT+i1%HPIT$Ot22xkp)XF1{~cf%(58e6zk1 z-p-e?HcTCjiJ@UMBi zPLIUwhLaUS`RNMXa3;e5jKi_#<}vh-#Q4`~HIMaZI)iXtL<&}%4kUdIUJvC^|KvOZ zs}MPH>@H=pM>3x9Jtv=GoLP%Ol5T_!Ulhi8Kd%SV%3 zZBMdfLm<~G{3}Q7SgZi+j58(JzYtI{@~`}tT2n8@a~0k zfrCQa=OY#i8Gl)L!_KK-P(7sGTsC^-wF0Ra@#fLo>p{H?`OORD~y7jAEYSJn&TkC@U+b ziA)b!E*YnC+2jCLf`9CN4rs`4%kfmkwLJ$^E5WUvbNl4n=OJD(D6m|XfC4MkQp9Kc zu##fXGA?h1DVO~e&Tj$WOds?p7p5Jow3&o#9J4xAiGQ{l#B#^@wdsjm8*NXr*63mT z|CJt$$7oFizS^D$9K{+5+pC30Gf{Mq!YDKAyvgwe2-WErS2E&Es6!AheSPQ75-R1UnR)MedZCC;SD zPQqYstH4_m^?yy5X_s6F^oSvI^)M}#e_0b52CGYQY1*`j<&)JTmdAfu$K`s!C`pVe$xdJH;+<1+~3n`s- z>;xS@jMjF=_>4bBIU?bUN5HRSXTgN<(_lhjJ>oH{GZd{-FMJ0x4g0ox!@{Ismrg%? zU#34l6)2sb0n`_qjlzjMgK#F#SgccGUl(!ZXZ^VI(|*`FK<)6oaR+$1NjR&;8GWJl z7$?+Y4VZ$k(HABBYHy;Z0#;DjVRphEX9KbGR1#2g*oi#sWFB_<&O&(Bui^ZZFLCn9 z60DVc2B*TX^L%P?hR*LeALkF8ta1bAten8fE_FDCg`L0hC%H}jqL{fRf8+GTyW~Bp zAd7GU&|I7+lf_T?VJ887g_C%`Ay;sY%=b7?W+_&dEW>Fs$H=?nSMnRqjk$@r!M$V) zX7!&VFW^j?4{#RE9@Ivh>_U~~XR5-vG)A2Ka)w;6o(psp-fbTFgr8IMD(c3MIH`u6 z5mW%L{ui81Q^Yl(1f_@?PAS#k1RADMOz*1jjfpAb2Wp2}R}CGl!Kp^mah?r3!HAt` zbPFfJT*o(NbU5>=1$Cf~#Eg|4Ein=AOkHsL6~UL3T2VKAWwbSIgHN`!rR`{Y>WPn3 z>8XL-Cl9C>^`<^pHRDJ9X#f_}1>p#TVA=_5;X1Q(vq(KQh=$V$eBCVyJ2<=IXnU!oBR^&`7$tyNa)#WtZYkTIFRb}PCi?7n= zG~R*>c!s5_Tpp-j%bLDX4pqHmibfvj`ZRH%%Wt~Z z_Gu)b&2PNrBI*(rW(~u2DNQkS1x@#g6bMYgrP#NsusGMKD&&E>ua*BoEB}3E{tIPE z^|f+ZD2GDdenMf9u3r;fT~X7$%tLsTHH@~O!1_a_#c<6Fb5sMea?l%774yJ~(!(0| zR1J_tP|O3x0OU_mj6bSDa;(y3u_7YnSP@aGL2|58S#YIU>@?Mivho6>*sC;OG?wP8 z2V1jOX3gGUIeTS1Xfe28QfYox#iWwrtVvZZ%9=l^hRP{dG)p^n{y2_?|nd>NPQALHT(&WfhJW!;u0;*zao-P;AB)NdntvQ%v%|W`HgGoG4 zrdObgrJTh6wn%Tze~U@YpVaBrf}A9Wx)Du$>83QhAJy!BTGPF1w4B3g9%x55>Yui{ z@m5(}R+?X_Wqnn-(&(CQ!}I8 zXH^#PgyooBx>~~|)d-ob5&0EalZ|#Gatn>cp znu|42=dAxOW9{7$;dtXSgI^Rb3zv~XFj8v)Z$Lg3upM&1`k-u8_~R$irNI9f$?aoJ z<2ih1NCT`_3hd56*c^7sV>)cj7&;c5w}L#qESEvAHzmSUln;T5e*5GzR>{!mEw9tcNG4h1ci_e{eK>z&J>^m2?S|-5}HRpjm{p1_`lb zFujeuVc9%;25+O_2U3)41ONLc|0@xp%}`Jv9=+SMFQG+3`w1}k&jJ}*E?XoH`^|Dy zGFi4;8Z5glTP*kS=9cA8;7)}c@N0~71MqTa4F5rratMlS4TSaSD)jG>A7b5Y1fjml zKa?D%&8_z*tw3u4{j|P$82-?c<{#kLB47o{fB3^%pvQlZ%y}7#l56~dTl_4)H3Bf( z-1Gyyb<@+McgLt<0I%y-`2yfIC+Z#^F7E1;;YJ_Ex zrH2f%VD?g$pXGq%vcy*4?3KO*Y`S!f^tNoX?6PRE&V~TKoqbo&Qe+um87E!A-7=Yi zmCkmwMU6ki{l`C)({xa~!6Gy-C(B8c)1D`hu^euKS{5|j|5tZN=^)bh<8eH^IsQ2G zVF-)+_)jh|25+u~EKimzkLw=Vkbjk@W~~C^wthUN<`C&NPmyai+IjwK;>3oD+PMAk z)&`vRZp1j*T;h#TUKX||TZlZZuv~jQPoQ@L_TdS?hw9S`iyudE0Jc?gQ0Ad>D+$;g zDI1jTNL%oCH!wUo>`O~a*t&rK*W3Ar=6O|d{CScljc?zkO`4`jOw*92Yd5>BtHWt| z2L)#-QbyISj5({tp%`L^EX?9B#3_U#GK%=es1-zl?2kERjIz}!V+@p1vXMXbM<=C> zQc4h4g7go0uAlF@_rA}4-{ftQI=m0}*SY81d!O^1bMAegd!7VLY=)cQ`h`j7<#IST z2WDqdFXgh&Yms}K*1l42oYu06yCfUVilk6;XDkPg6^4M#>fnB7Jv7>KTC>P+S~>!C z)K=e@(R;cyb-!Z{i-M#)N6K$3FMH|pbT3IqZWq|A5WI}CdRl1K4O`Kk_ie3GXoGDk zju!u+$4P8LR-9yI-Ba9jKPrAjZL~Pa^SO#d%wkCvix)$072tb(*}bg1cm)oQU^8a* zeFVMCW~b=!x|d9-Cj++UbIsRcT8yexyef{ds*bS!XQ`F(cSW=+1Nj`jI zs#jhbrQhtgHIiR_{1`#5p{hv^Ed)(xCz}LXJ@;l3AVr59$56K?vNuR>x?74kFwYkd%4IHD_nqN_33;B_xk2y4-USg1C z_T^MUBMe$=E$fjk&;;5DO?!^Cu`SKL-E|kyoW#PqhlS&xNZ?iAB=dw{}szi^G2$r?ShogDQ(BvydXq=aS*yT868s`}pJjwaOJ3>G$MtcTLydqF10SgW+YTCmY3ZFRcJK0qg6wX(mm z6lM|0Zj+-sFZi8h@ne<4j`82_O?M2vy(qb3lzzJC1M@61J5PM6-lbYr8Qd7}dkFT6 ztDCnO8M`L*8OS_)zC`=oSm?6S2oKN|Gq*R9DYMaxbk;0s&3#Se*nOna{oV9H>vjzr zQLz?VPgGh>@b3fY$?hytu#bF2Wp|#v!a`hA8?BDDzZWUimX|i7{B6x>-bQ$>OKb!! z*XvTant|Tt2=>!>1S>4$x0aId^;nj|)ACa6JAx$Aa7XkX4bdBG?}m4Xgs^Wo6L${U z(YgL$GyD^>)bHk(uIH;6w`nb24T<5n)2l{}h!>HFW8o=Z36hcJpR#78Me-6+eV&`v zHNyV4S}W^+r@gk=r>@u?yU@uMkyedRuH+)&eR2rEuf_7}bF7@Ldf8Fdd1+9WXnEuN zBmKx_kKG=E~$}48+dpDZjSYP4#99}?A@y0@)Wk>LD`?mR{KFt~0cesw?EAuSW zr??)&Pv-mhC!OYc9KWAmbMo^WJawMH6X*~0^hdmICh-<}2k)ABynRk*|G;PGOx}gx z&Fgs5R5Jd1L|)DQoNvOL<_$b)hO)olH8Ym|4L_OjYz|MEJ=r_>$?VJK@r*f6ADo!x zU*^;bcN@+z@8ZpWH}}68U#9JNKn?Q?e>e5@aApTQxf^dPVfJ(4DOvdhu>%jNDsRa2 zm!tTY$gU2){1hke!)xjQzF9-~V-0dr(hJAtk>~ z!^cZ=Qh0zks)D6E@%B>eIrb)CcFuMR_0NbNtZnvT7oAj$++`j(sr(O zTsr^OR}t|N#uhHM>k{WYpZ#gI+7-Itw!eDdZ$Er2FaH}tz3UQBy@ZO>mHM^G-sb9! z?f};yGw7;Ey{Sv%7S60S-{z=wB#jzDQGesPG0IMC!ZZx8kEchT< z@v#rdh_M@~iE%5EvK3!G<(=Hea&ZTe)WiMtbBBt|igWUIC?aQb+N(hH*M_#$q3!fG z2A%%%XSYFn8M)0kI*bf=P~J%F;{H2;b};V_=DVFywjiJK@cSe)>x1e6bl`rZcQ?8+ zf%NV|GbCGscBA)^ew^s#cP~1#gW9;w$*+U=7~T-6;;6+<^s5l%chK%YT$XHjxNp0? zZ2A%OJXQ|<+*{6F=16cS-pl%%8~_1eFbhm$~BGm z?lpW(kKyt8(|{>?AI>)9U&YH+KCVB(clLdJLZ1O=8k`N-i|7~hGOKm)K24~*S&t(= zat+2I8&_lNxplIikh~vY*Wo>>JpA)OD_Ey>_N<4HhMzIl!>qgbW05~(_2)wUIqH&& zZhVM+t8zi5N%ES}{j0}u;PP_Hks!?>t_a!}sHK;vHPE+cW}m^gMRn=+NZ_evu5Sy) zpH3w99Qh9RH*MHZad{uHeuw!1gYBxrG>g$L`{;o`!Q#!M($R4W)=Ehz%9&T~w@~qM|fGioM4K(P*MEv4XK+ zi5h!Fj0L-ZB47cmF=|vq^Xxfi{6D*g#^m??zVG`N_hxo?+Ri-l%=3JnXQt1yd)s%o3JM6Z8>Psq)2CnYs3Xff>3hf9AwVOQy2 z;jNzN)Tj6l^XQ5{IFZ)u#SfQ09AQ^!CE4ED5)31xFJbVP*y#pi>sVq(uHYYG%(hT} znvDBcoGoJ-As*ET>2A9t#0CG6EJFS~ZL3T7g1mDf9e(iX2eSg*IP4e=(|F~m5zitmo$^GBo$ zvxGF%g_BOYDfn&#sjr(wI_kz?+>RJ^8%Y;6uBKP>GI^K>%fYa%E`+qTV=&AjGG3$f zKBTR_3K^wah*u!qkHvRS$Vlc3GKwk0Iws=tj`(~phR-mJ#rHo|gtzb+wp|xYB;6k* zM0beDb}fjz?g-{vgynxt+?ijo9Bea&b#!fsm)Z}EFSc_XUaLtT-DoZJ)=kIuO(S0T zO#PldjE?joe|@;5(~~~rchXy*hH3G+ZZ>JI<->GL3f{Yr*31H|Zv+X{wIFr$F~m*h zhL<1K*A&ylV_$OEhIqVRjQxTAuGKjL>-ht}WhdqxM>;XbvH!Q>{VZ(5JX@Se!~B5h zT4AWR`2y0UItCpuK7+JT`?8`R)xP}4rQbnhwQse4Rr|K$VvHZ2GS$go3?Je3Uf?j*rl|EYcWuglIKpQ(L{{rUMte*bWl{6V^rCm*hpmme-` zeK`ly{QGKz&lcjP_UGr9+MnvBey3XJ$M6;2=U`jaZ^e55YpBu~#rJJ6{UxoAQCj=d zeo@={UqX!@ajgGa$jBe=BAr}i_z#cCgAX^5ZmW=2AKqg)kUS>6bVqUQuVARsG18Js z%giX!Lk&qe>8{-m#OH*_%rB&-Iv!fz{43Px9{cJaA=08h4Hsg$ zYM4U&wfTWG`d>qwI~x6};Y_4Ob*$BX|DVF3iuWr?pgP|)npf#U9iNJMr_#PU|NaqH zjG0QCDxGNbrH-{aht+wMfwZk&Q5C#qppDjHE}g{BF>~X_KS&_aXqL* z>XLe-K5-=tNJG+yG$u`m8)-_K5qIK2Jc$=_8gJ|^AJUSvBEH0rv?l(f4QWf-k@lnm z2_PMDt>{bwNf7Bmy5hXc9LCWH_N~VtSKt|Di8elN}_1 zj3$%RcT5lbnMkHEoiI!!Q%MT>lK|72@n_mI9hf#uTe2PB{K7b4+OA9>6NGo_zc{8H z6ToyP$z%>mB6GrLe@)m@xiOfGd@8n}46w07C#va?Rzx(;=_)(x#2{^#irAFyP#Y!~d!t@z!$ zuQ_O>85Mz3YKv?!`36F>Jy3 zU|;)UZ>#i$w1s1;QdxjXR~o(Ir`zcW!!XtRjGh=iW=ce2#FVMc`iGBChzyHUpSvlW ziL#|KQMT%o482m*j($;DKZx$E&8~X4fURA1Z`In>%D(uyc8?$jvJ^`~>f(_vNXP-| z;9U2>S?!PWwja*OaQyPgNV_wUa=*qNT!l05C!Ar2NG5WY@G^U}4_wbgai4bTnKjnT#Ert9YF7U`DgzSFJNrR%ope%9^P9nziAefACVvo;CnDkk^r`B(g+HcR#o=1Kb@2P!7r1sleOBt>G z_WmqQ^k?zjTFPkcw~wu9F}9$O_O&tEZ=VSX(c{D75~3o*5~jp_e$!toJx=@W|5>?l zpT+xYrN?Q%1GJR!+V6nBJ2?LD=zuZdVa(+VN136XH{$UxQ_{ox6Lpurj3Iw_Gw;gw;x+!yZJb~wL7gHTI};7 z&>log)GARsNxRpER*MY^kBg6piFWaF_w@Aa6cal&E@J$IDK5hsjTzq9rMah9E0@tz zT>_A+;3tR2xeSPm89i-6cyvT`OrkqJk95(}$Gc!3g~ug^k9GfSm2jz8B|dvZmZ>X1 zUzDcGa2<+dGLSd_hHJdHZh~&6ZhzO_4Kcgyac-S2kqSe~uSe!)7iby!!nEjx$} zV|%C3yOZ6+9%s+77ul=qZT24fn0>~UaU55RGjsL1##}S51J{}B$_?X2bK|&V zE`|G+`<`3P?cnxuN4QMxDp$lk;a+nJ&+r^yg|E&#@n*gr-;np=JM!K5L3}75&PVW* z`2>C%KZ{S{zvtKT8~F@=C%=b3#{bHn<1g~L{7wEgU&24&|KR_$C-$tpXm7N4w0E+v zXW!J`$KKyQ0BXQd>FJL*uKeNrGQXSKk7jGg1c~|pODlmV*p**@vE9^R729n}z_7N? z4cp&%JKL-bO<_~NU%YaK6L?TPrgW#C)Q)0k67@>YI0@pQIcA;=lWBACqH*}=g@2Rj zWW4i)IJ2d#9RxsCYNUa*GgZR?GwqN{tAPV_c7i~t21e*$5|;_bCE5WWSBFjzgijry z1BgKUsXoJeYc&h5lW3hcw52nRrQY}#L!$vhh=r-(4jo~^G_%z%2!7$PiB)MO+QKBJ zfE^Xn+}GH9tPWd!*y%*p?#p+x!}_I~ZlGi z?P))xe|TFFt}5vgZA$f&r_J%(bd-Z;AigemyV2ZXCEF>f%OF2z7yo->$^MyKzla)~MTg79ol2BycLGa{PrU`>^9aG*R4~2$LJMnamgaNfw&p^VxGgqdz6b?MxU_lGm-9B7X+LWfHh53O zr9vmDR`L);leMi~Qu2~z)6CFY;n_psTlxh$(WKQm`pTj;X!a}r zM5gSlzHGKMA#rR};s*J^)@>IrI2}mXIw3kCDJn88DZ^y2QQvU6B^5-ei2yN`5GY{H!Q>9Ha4XS+BL4~rc;)oduBE)pz(Q@Jz?=E9Sk z*2%n;*)BZcZbCg4R?>P(I~?9&LMKktKXojI-#NHIe`kT==ySy$?!!HnV*DgM#lk6H z9w|o&m4?eLXcbzml`my*dfdkWsdD>1ux9v?c9X=#iI#~;41VI(L2#8bBnaCx64N82 z5|C=r6StYg6;tAuB|7&SHgRB-S-jO=C=dq-w>c49S)6`Vx5;K}tevYMrge}-Y4e)& zbz6?CSt_hEhh?ynXT>MSge097K`g#IR`xBXA{Bjosc3>C$BrQ(9Yu(b%ZHzGU_-w6 z>SW%n4H=7OZ#IeLanodR)uf2!lTjJZ(Yy3>XEGnHApH|M@Uz{YSjS)mkup~lF4u(KYN@#nt z$k8g31koX9Ax<>>6Qc!~?HDB+vT(<(WJEU6_q8DcufzYa!~?v7i#9eO&3mKchzSN4w(g_sVhH! zRd?CWzTf-9JTG5aqNV(;ZDZ+>a0u6;_tN|H9 zge+1oWZpcuiED+soH*pfjT@OKM9Q^pMUlNOY~P9(3*c;l$UH3;bCf1x*@_$aWzIl~ z0$jgQr;Q<9$m75ny0W5#0$Uq%cL9y@OEkiFr*n#IV(#3 zA{~My55}pqX~(i}H<~ZB;TOoBiIq74WbA%cWp7$P%d2SfG{RKQhyD+MtpLJknJS4WNz za!^N(64cAdF$S?4g66CYqQYEf2sx!gZ5<&r)Y!>+MztSZ)NEnP2x62ZkC1CRgfz%? z9l{!jXplk%^?C$15MfgdMfV6P){*-R^K}zM;+XxFNGd@vg~=2VRzX~jxhRq>f-nek z(@4${=Bb`!6U0H77d#?X2zHUV3<6(>cOjgIcpigdRt!-gumCjg5k%S$WI>bx!8J04 zkf{ur#4sNiMEVfc(=k<4s2Ks3W)u-GsivEMbwbT-Yfb6K)8KSV=UAp5i<)Mf^$J zBR&_cl|3r=s+?H)>&ojZzo??CQmxA1D$A>EuX3ZxD}$Y(p25v9!Z5)QV>o5FQMEzU z;Z;{uwNx8aE&q#pUtIsa*$d} z!=&X>nqy^0XGeF(4vs?|lO2~k?s2?ULsz3}4O5M#H3Dmd)kv-JQ;p0T*K543S*d32 znx>lVY7VJ6x90Jhzt!@qHMZ7~T6wh|Ir*=+5ofbIlaJu4j*Qw08rSl5s9nROB zf3GdnZdN-g3gQ0J>UYwMh-^SrKW-N3rT>c-SvRCj;fzv{{L zn$-)bx3S)ddJpQoukTd9RsE>?yX#+b)wwov?d&?~^!a?)L6=-8;K)@Mz!>+KJ%*P)!A#9SCrQrua#cAyv}=-dfoRbZ|>i`Z}YLuzihsv z`OnRNYyOwFkN05jIPVuNNDEVo?|mBhO!SHLiSfzsDQHPrR&Uv;W#^WoTPC+$)^bfCBlt2NZsaBuMirSKy2G)HNWtG84Om94+L4_1ERtdSQarBG>LE#wVWYM_q{ z*7~zwEANsVa?9OIjHO_hE%lO(IR`CaQY+evTT3sn$GLTIfi=(@iX&WKoWx{ayB{e- zOXym$-h8L7HwHMHmIz;+1^2T|rsW~Zu*z@=I&-6`J4-ur$}C5^nA;ETEUY+77knqv zPIxWu2QzFb7WRWgt{eS|y~bUJuUO33UAwuY-mK;fXJ{2@*YSo@e!Ua;YT`OHDT1b| z#6E70aS~B##!KL~;@J~0I=Krb;~Ii8{2eX@zG(V8mDk!oY0De8%<UgJ^QT83m0RFB^etlBrPse{jp@SgoU+gok4sL2xcrzzOYMAz zt9QS=W89-m1*0@{Xy53r&hA}K-Mn>d|BbEY9nsK~*4Z9yk5c{y$(S+ZNc8dJPFGGG zx^ngS(5~N^idM5_GktHkI8%K}tM>Jsy8k?2Z>Y(*$1l7~Fx5HHN`JHh=LdK9Ub$v6 z#y<3C!H!E_OLZ?3*B?5wJ7;r|eH$*R&*VW9M@4L-{?IIPtG&S*yHH>0=HUg;`k4^7QE? z=mFg@OAqMY^eJX3cfCS8sabk;qn+wC!YsA0Hb_3LSHhI~sI!$q)6(b@v~lw#(2?!O zEukH029;MS75waf^C#t*)x0qj}sYg9}dd$Wd)urrszanM82BMJJ$kX$+hy0)cV z>5xDeLi_WEPI9g5hfc?xO;7>Mwt`fP+)-{8_`ZHZqe}tOOS86%Li+ zE>Hy(k7$TNBJ-wQXb=joHkB1a2-1{d$NRK8Y7d=SVBkm{eKf_l^F0h4%?6s0mzHg{ZlV1FAEw9-5-i7YX+YS%zGr&xD z&^7E3Wn?}r;2{{gu}>c!`SrCE)NJyMI@2nyZnS2S$uJGI3AL1%yLzPwYF;#$Ms4cN zez#`p@{P`aT<_}c(WzS_j}8TIW}5?MvDD>z(7A%MGq}Ea4o*>cTP!rlSgD<@o?R8dMBH5Awa05GwNYlr@SC<_!x_axTe- zKy1XUyL!k}s!1T;=-jwjr!I|}wl8=y|6|3(6->@h|IJGjw9IwOsE^r|TMvOO96^bh z8&8W^Lj;!f@*I;{49~Fgi^nC`fc&x-`Pa+L&re$D%K|pp%aenqIGu*IyaA`>APCW*D zd-phbJ?~QH1M^KgDmQ9Fb!|>`$(w3!p47|V!-*Qet_8vv9-zMuhTnSL_TFGJDtYTp zT)X82`bI@mHW?yd={b0j|M3$~VYA9o^8;L+8U}Q7O*J(My#C@ zvz)+%k}}$eHmp;Rx>A?lU7<$CPs^9DGtnV*Df@~us5A|~*vJ|!EZfr4o5=~=%?4FX zgnh3aGRp^@HI}|sDoY<<8FNysH6>$dh3;s~`A^y-?J_`ScAnKgR%zfWbYb&(t38cm z19-)rPGWEHIOUqtQ@ zFlyFoQHZX1bHvbBsz*x8!`RUz_KcC%e$~|&=-!mtu>iU@0 zpiWJi(wfsvMKjpv-(Sjm;#_*Uw||cj6GI}*-A05Dr*=*Tr5f#U<;8_rSK;gxXne)t z{7rB#fFlLqe$#kzj-?^|AbI!d*~+K)#Rm`1U%q!QyN8#FHc(gzr+ahiK_{AxC8+aH zYSC|e?9Z8|6sXQZRgZ@_#ieE*w7Llkq1Empl2lyyOV%b6CiY1^6`bq*@*=_&9%fjU zO8Y|(y4snpq5WtNx{NNt+a9p+(3utK`^`E0)W|;5hd9$wv;h*#1el08hX=%%4d-zF z`CV2PBrzVc4R~oJ$$3sVZ}%7z!1vOFJ7B{9DjD^56>104Y)w7A$3?2D|!2~h!5kquV+9`aMH zaD-r>0ZI85a}onbF!>P}FEvi>)3>E_%*b!QA7}2w&;BJ|h*cAJlMP)L=Uc?2FXdsf z0Z!qw66GG|2~wU)@T2u9dzFLL$}`sb3@f8J;a6E7(v`|X#L^HBGnA=?D9**+GV07D zh2lD>K4EK7nJrd7Qz2N?Jr%?GO>A-_X{xS>JCsW_m>J**`ccpltN}l{3IV zEhj@Mwi8*_A$6E)KW{7>&LG2VuoKo~K<#|yaV;+~iWvvUCZDi*uSRwZ~;yTb(f_?82l9N)qoH(t^IQDj>FDFHh(q|;#%G7ScJ>gLmVO!rU|TxO$%6R29iBEd95HmFcwmn-0t!?>W-wPA6hGUftwxWWLo3C1cfq?6mW zA4*%l=*zXHEBtp;;+DlYw;j~qJH=erujgHB??Roicc=lpR(dnMp;M0X_gB@G_Mg{+#qkBv;U5e>)z}LC^pvb|K%ohW!OHh#6B_!KE zxQ~n<>nY^%hK1@FGbaiZ#{wU96p}s;?+)2En4rJwM=Q;jaZq8XI;c2sv`LFjqq~Kg z?gyydb`1wLZ|ps1aKjm?4Qd*lmWVK}QYU|tjOA3idl&Q?tza=!EoP2fnz#4LK@+`J zV2KZC!CwjOwBILLM)B|)?BUQ{{AxY6aW_9$&gFaKWoVF;^Kd&1Us968oXv+#H}%Ra zaFy!G-w37-9A$p@2S=#%`4|$P-&2n;8A6>P1f$S~E<&+*HEU>3<8v$xlb9y5VHNgqOTn;M1}B`e zJE=hmjox<13^Vyt6ZQ^SYMPt6GL_BzX4l?RP7uc*%Gh?$boQJl*LB43ATyo8kDVMl z&NR2}N^Z~Q*s*5%CEw-9@T;cBXHm{E((pv)>2>|n<-%Vf*WZQkY9+0(l4{5pt{yph z%?w}idpB+Q#k8_$E*BoRWv>}#@Hr!nb~SnSJuv0ma%EdyVs~LH!Csb+@{l{66nQEgY)cAZYn*`9#Aq+-ik^{ zjEq7sJ3-jCJuxlPY?wd^cyzx!Dlt7#iMiARnncUcq|oROe@>IiRu|`P_`So*n#RTd z*-ka>sqgiAt7{n--D}4id-(9Q)--oSl3kss>k}-u)-;oGu@@@zV;1K?N)GI}>Hyw_ z9d5z=eB*QFgtAtGDsuuK(kjlhav%cpW@>5}#2eq>q7yW1T%S3n=E~POR)0Qw%YjqN zz|S7O%i)aA={I2F?(RExz3@;s&*dgV`TUC$6P4f#4sVJSsla$x5r35^+vYA#4*pKD zIu(48ZSt-CCd<%PX)Ns=*>8O}=WhLzCyq2X`EA(Hr=IM@(B$BrPQBI-+=&WnvYY3z zp@00w8V^rAd?xvd^Odt3b{;nW;ePal+aq@8!F9i0aJo44)Wn0Pr;kRQU=4d0L*2mK zq8z0~k^`J7F&@5vB4-fHZ%gO%#^gZ2-@~0sFnS&4<@P0-W1hd0vCvuxR!H6V4$i`^f6{5@&_O+&>XgU7m|?m$$A!+Q$K)cLw8cH-TIZJ=t%K+4wO3$IPsYSkRv?X^qyITCDL~ zbHnN6sXYZZ&JFMJo$1yJwrr|rJ|)gn^y<_IImig5w2aBzAn0E!rQvcb6ypxlCRw*m zD;-YX%3{u+eRxqhd{(bSD1S&02Ck?@45y)}MKqvc_~!}@AQXn9>eL9r%-^<=(B_Ma z8(K=eKu=k;2;09Z{Bxsu*bl5ji78h?NhbQ$}YqoWYqH%?G` zz;ek$dofG?3ie-Nly%v9WnHe64STFxx+xP8Lpn?wXTh0cF#PzlQ}|WTI~%^s2J=}o zZ@{+_46}Vf#TO1!zYPCuU+4;9CdCOxN>>h#@7-(E=w4>p7>0ANt!3ES_H^17;URpG z@_#sf`i9fJt{2@+bdq&mHiUp9hlb}61fC3Zs`Bm>lL=S#3S;rikZE0b`77-BmC4M8 zpR@J&l`kcze7gwjp^|?QS`w@Hw?*5v{q43;#SHiDN=^@GZ{85lm>Uk zrw~l5W6M5DGVmjcGA&YR)rn{lGhDOO%4T454t$ZLx7b^1N!b+Fv6{`>Q!d3!*_4Ov z!O7WrB*&t_7w;7ea82$3v&()KV0JVL;zhB@{-aOop?;VUA3rW8KwepZd~60~Si?MR zXgkPEwz5eNZ&5d-BVak}!NDlHoQ_%`C|y5$7K+b87YK$?bY?yTBr0Cz4(E|6lzSGU zvYiHbl3)CUe&MFT;RDAsb)wZ?d7*cM)AOfLW38#}YPQMj9)TXtKHbmXx_o5EiCyNa zM}9eqrrdDU3XMu+Vgg!I61JmGyIoF?G8?)t1J_vvY`S%R9t z6%)*PN2FGAq5AI0$!|_-mhR(d>7G$x=|0{_Mte-Aw0ZT$b(@c@ZH*akmpMRiIq>Di zeN<7jyk~inWZO;nI1B#iKWi6d?{t^-E%T? z>@TZjL!9iO3@tDY`bsb!?Sh(2=UCwYLYetd0xZkS&P4Tjt1vz~KwfqLnydihtDWFf ztMzKuC8lm0DmqhN)D4W#ImL|b7i!E8D!=iiy3MA$D_Lk1L0y2M-YBM_D}{<$je|PW z9fr*|&+Wh(+Nyn}>2ymi_kx7KZz0ZdPonzfGCoR|Ri!WA(ocHus+Ej+ZkJ(}RJ9u# z30an5Hk0yX!C>Xq%4%^X`lq7=M7nq+iHQ<$Qv|AylC7-v_8EFO+TO0kmsHnWRHRTFu4E zOa3!Y0xP4uWcR-rC0txJGHF%SB(C~GAc+rAyYON0ezm>(>j?Dn z?Lc{nHXg96q?z!C#Z~)y55Y$@DMrhv{TO$-2*#0J1iBzwx~-Px*CK^AsPBFM`F=_E zPQi!M-uR6?Yh?W>sZ-pOTIwsgBO-6*Uh*XE9} z>G+2JH=IxI|LBe|7u^wtsO|_OLbY!95uTSt%d6giQ~8bpMB3Hdb1?hOLTR=fnSgfH z^o;_{Q~eu!gxn(_AB~nTWrCbpf~m8b$|%^Q69lc~=R@`8d6vL&GP0`z=~`&V11+4X z8~P)t{y|&GPJvF{4w+^{7LI882!>(oqxt- zJV`c&q;(UF-=+Q5n>S2|6^^Jz^e+Y2nyH67TLqPSE3Oz_1rS$jMMa4cGIwxlBuJ7g9apJVEu zl=hPG4UWML^excFpq+dM1%{#xC^F#tCQztO;`wU7Sv?2HNCM2QLOnWH6r#RIN5d4G zevIaMYg2svqkN}8f5)Z`?t>{EWmH6bS%cL}%Zl|D78sut+TK%#Y{^*oFi|i*`P2Y| zwaEbac^NafJfkq9yn1acN~@@Op@bswHWZ1s$S~ha_-FxF>BRw+R%5ZMJs#sc1!HDj zd;Up~ycD|tb#=!E0`<4FnSuAqWYp^#2t}4Q*sL0Av(z*iT{;#T@2IXzu7VP)N;fFm z&=$xAR2c{T-O#_t=3#^(^)jbI3(5HW0j=CwCE9iJ5p0B7RUsPU|F31xYF9Nkn@uOy zt8|TSHfzmc|8TRh(e*kUjxUAu4MG}zh^TB+c^iJe`-b1ZAs5j35t5(kA!CCSFDrHI z;$@mZ8AMqJp_2Hc;E%XA;2<7x@D^a z$rWEAH2{m$*hGG18UKkGTgxxA+~nJq7b&uj0J;jM@sTlEpMX&nqzQ$WqypImUkKhk5ySg0fI|K5c+XiLgyWVitX05O#FOZ#iX`*VSG|w_TKl|B(-sB zM1)T~$2D$Jd0k<;B}SSf^blg@+}Fs{oXfF>T)SQ}ra1z>YT?)4Rh7JH9r{Ls6ogvqz<8KIF{CKDPC~pI)>zI;pK1$0WvM-6mvK9EPawp1^8n`O-W z8&xyT8X;R8l`q`owNt+ppa(+f$8up{J_B`%)#{;+(gPi50>RG81`2Qt!g3KgABfm@ zZbi9;XRuhueB*IH0R}`$GtmjdY@E>|UwQHLOw)q)?dkabFrG*8=w+5BQNaz%rk-*; zIXA0!6<5Sf@9 z9larGhZz@z+}GF?a4A=L{ziC&*3ZQny;ry(syPRuygAs>M(pUY1xA(FHF`X&H4Utv zx0f@_r8`eUXocsZTDl{ycmH-xMhNzb6gg$;q;RJuk8BfY*M^f>h&is%uN=WRKfL-t(U*Cyj2NrsGt%R_7xIck@2I)o8|r1B$E;au-Yhk9mYZ<-oe6WR4Cc42uqYg>J|D+w zkZpQ>RSwhZ%9a>Ab$)e1CifaSg-bcO6rk?+5{oLql3uzA3oUDLyda(?Cl)2|u9+?$p@H>ykHV4a3O*jZQ+(g3k+EVkt!5$nEKArr0!g zT+HObL!HK_#c$iPcHNfE)7DQ$K+!r%)}(4pnpe%%tvK&DHdW~8n%08Vd4R00%1mLQ zzR(dD?{=I|kZg6pT$Qt!N5%R_BLswgn)Q^eEeFWRxtW`V`kS_89<`Ku_}pG4y|2ay z%nv8G73-hbXl|<9cxm8~)Eo9T2D=QcM5=Mh+E^vCuRCCyUNeg_Lo(CLy$d=N=W#+E!UBDT@M6fq$v;MLcv=k4ON_~w9-dq0p^)CV zPv2ImMJgPTs!oV4&E6X?(4I6Q7dmT=bSNzMDuC+vV|-fyn?qe|p$#36Tl#HMj7+;e zk&N#?nqnc^@nh5wtB&#GS7QXU^EEixO@^s|5h-qZ2jN>(Lud?+{}c2MUM_=umWGhe z=YtVG=V2giX=86TyBO*as%Z>#@7!>0KyPa{N~TBC5-l6k*tM|6erUou2F>gF=Us1EQ0Zqi3UnV--DhNMme6<<{y70ehWAFVSBn-hD)%8*H z07n;C^Z;L*ygAjRTIiIEkK&RJC#iktnq@q$?9P`eJY$u$EY*5|ezY76s4vCM=pZ18(^{GlkO6bCJ_Ej& z(8R3EW9fHFUvwvc**rXjcr;nlr|7E*`M%c5X!x0smdHR*fnI5*L`(S2qah3X+S7+T zb#J8FsNG+%w5UKq8-=P}YW;}1rMFC-anVs#)}Lf_Gg1Z8MWZe+#Rou;J_?spynM$w@8y`43)9XVvn_jQtCG74Y9sd9@?OWhI}kd$ghm*@j@^{z#tdCBLIpw4i5xAi zouDeZleal|c)^^lX6r1vO~Rce9@GscnT(11kAJ)JXR|Ua-&z@c+Hd93TQE=2q0yQ% z?)rXQ*z%FibP^i<-6$I1(esPY{+q`~(w1kDf#=>7<;jgi9H7pzdzLjKrjZ+&8lfZvcnD zG|e=(9cyS1D;&M1G|6>1d$UJ=dFHvy@A8c>2X?EFAJ#R`9IEdAI2?g>9je&V z7r}3w022JFHnzPyQPUto1iCiKRs_h8)KVVf+M$**14}uMrT8O9(N-RH$*}D_`bJil zoFNs0O9dWQS|PQl0B%R2^yKm^RAw`kjg#c|^f-rF>a5NMJbkM?l+sqEug3i_{j~is z`*1%@`p5k+=hXc$G3tI8EF9$SDgB%lKqXPc7_VcoyK%|sq6a=QRGOgYa2Ao>K2T0RpuKuP4z~BrkOAjKUE(m#ZH+XH9^(Gzt=>?8&2ETY&(>0 z0;esH(F)}4gnM4p@BV*#q6_e}I<#73GOVH7PQwVbMfm*?ow>UJ31ZMU(!eQ`Mu*rW z(Cbe7x9llMH?2TH63N6^Tu(5JR8iI=?(l-*#D#tK)-x!KEPWvITT5D!N`YWnL{^$#|cV?yeIt^$9{wV3|V zYX%bWmEelN7OL)8>>R?rYP``>n2Fm=|EatiLeLWO0~$J3qBUgY z$v!=SHpk1HudR{|BNIZ}Fb2h@+2-)5F({*J(H>AxV8Z!ON!rnS@J%yFqxr^Y#} z+lV%)+lZhK{rP{va!V2O>65KB!kn2h_LpF1bzjcledA7{56d`g1WLm7)n>%uxYpO~ zGK0}BbF7POl`LJ*o}|4;ds2*03ce~Hyhp`@_o#SqPG7`>b8L8Uj*188sCaM=;=xld zBZ961YAsS#%zqb_Y=ixeBkVszgZ+>D3eftU{8S?1 z9DI>%Ta}l~ti2nDh#b~H(7&Ea#%S}u6g zD$Nll?8HIki3t4w(hl9J}X);p~!oV56d${4?ElTxES0XxAo)pIJ97DYGWei z)kDWsQu}Gchxh&jK^(|XRYe2sujHLveiH39f9iizp5QXDarLJExD5QgEs_Q*S5Z*S zRCIcTGUt6QtDGxUMh<~?8ykzT8ZG5P!W4ONl8UAyd(bx&&RU{o{38+dwUlcX94+0C zvMm{$wnTlDXhy1r8>LlwM!Cv%4kA2@My6USP_JfDQPVU;O&bbtm0J~{v4`-PVTamV zT!Vy`TV-aelB&es$VaqK+E?CN?U`J6|bJ6ZyTEC8O0*4 z6UJ>}!=?%u>1i3;lQu-*NC#P%GTbeqZeF!8QbgjIs3g;#O@g*@H4!%mC*sD{PBQ(; zR#4Wt7w7cgqnwj4d$eht5U!QCEiEm>1m2F@6Sap}N$6Aoorf_m-D1&~G39E$Q*bj}`TV~_avoFu;PwkT;HzaN|MI@+I|B@m^B_>9jFqQ48twAY5bOJs#Sp8rr zR7M)9iZVPbm3D95v}@PoP2sf;4&M*wek!2S3UMMZY+S-j$X3%W3Uv> zlnWshH;CYG(Rp>R2r{*bT_Sh=#>&OR1$8TkwnqfaDU!NB1fSl;1+B90U2T`DAFYhL zR8ysZkf9v|LXPKOKarV#z?HI)4h*TxG!L7A!!ws<)OV(#=EN zy}mQ&uVTS4r~Lz3$(dHd%?{`+WN_tEg4x$x;^M@wlT8h{)WPT`Hk0bYqDC&TZ>fBp zZEeFJN!xdD^;>&beTsg|Em^;KLu$G`d~*tYhz#7_l!NE;oDHx6U0BDRxpf-C5R+|+ zYyE0GLZDXt5^$JchU_ymmrGfdvTBvn>eL@oe>6evX?m7}s=LbWLQUrii?{io7Vj=p zMgvc4bRM%C@S6L2=Hi(%oMtbcojTj(+8=ZrZTkzD5KipojJrF`t;Q9Ng2gK zFY72ai!+1^^cS0Re3un6xbhuoFq_9+hhP@I%cWB})tMgmd(+z71w_mPxn2WM>J5Z> zTvzmuH|&%TwUUA8hXgQY>#KIenzJYgAJ09@t1U8qayV3Br8zlBRkIA#(jXo;} zy`J9W@R+W$6o~1dC0nT8wPZW-u$xL~r5hOkC@7Kn{iOc)c+?1o%A0YrJex1T2y|gt zE_kAuS%riQ^k?Pa>BYhjJUk^ddUq!BY2U+r?%z9{jesYei0RQk`s{L{xvO^>+YW~! zK}OH$YATLY@itSrFBNhR${xD*7JRY1$;#n&+m)TEIK2}_qJnEHO)1AXdD ziCMYRj;9VV4Fyxp4yKwm!7cTpSxmEZQVT9h!y#z6x-6BRs9p-LxGbqI9Vf@`S&eo_ zyG?7Sqw8*e<YLVw7MUC8yjoekA6mVOo&k(6XG^0OEy5)P3S?r zfzQF6?K#UTS1$NAt#XxjcGb~;=Vv4NM%{MW91o=1jT>jJjEIMK1v9Zs7L$tyR#nw` z=mPN|s;jy@-Az1(>XGi1p2tI|dg;gG;V29A-|N%#oAlfC`}Ak@m-L1D2X-PJGv$n1 zQ@h#qwi{|U5)Vp=v72JI!fub%+EY+q1p#$dnOy zXi5?unUcnCV|TL$*dy!-HkZxEt*y`5a`ppPg_F6uTm!BN*AkCR>CT1VX4hygk(~D{J>HnwCO$@l>p(7J2_{=Wz-`+c-NBb_`UPCTFL|^On^jDrrx0->Jo3rcm z&n7%90evX-e#O9bmT`-_?__xyog;a-J9}rEx#L`x^6P-{g&L}7Ir9u!emrah6IW{O zGg%f@OEn&y@h`(R9-RSsj!;Eu0aei1v7Cbr=mqT0(Yn@-w1(1=ZO&06M(bnLpM&=3 z5R7MVbVf_nKW#snt%?&%@Z^|(?soXE$HKhF(_{X(6K2E;2LKylub%gCF*Imz3p_&r zr4)2r(&70ZZl$@uTsma-=c(8>kP?%Kf+ZgNQt2i2!2=pxJm?qb!lCWoR8J4t1&_5AYu`V%?@O=D0w1 z^08A%+0IbqaS2p1r~Vmmr``|t#u+&)k6pOy1dQ8VMDgo3#64Ul>y%>N@TBnSgNK=) zIpDYXol59{KVX7MbZj9T{DnlZVmF6LY%fz^R{RO|X&ZnnW}c8jl%YBF36C3V9N81r zpg_3Jdmen6|!=WGo6UQ zr|KT&dX3^K1U=2Z6Y)F-^|+3T9S`$mq{O@E+GyMDATAZqlR-UFV@h)L(4^CWA049- z(gxy@1}Y-;xr4f>Y;@E#XAMyMoi5*KXVx@em-`k!dtC(py~1RXVBfU0aqZiG84s)HRB znJB_EIv<5Bx(4mG%V9QKpTm=rLRlrKy{KwiTDP3$8*2^(qIw(&i_Z?a*RSHhlOcHE$tVH$M)4vVL?4Qw^7~*>_0iEfTAZl5y)=>zXT*k$7xPu; zm3?C3LOekRtsLzTPnv@pdfGv2I-ky?ZADs3)dDgVcRUFLwE)E(wEzZzLp`i?EdCod zt$0IE;XWsBPy7Gc zI~U+8sx$$g&I`zm0Rkc*k3bLuBTMfdLaclRat<^@QsEoe#2X=r zCHN+2dHM2e_d3ez5eA@si94o=nZ?zP;+WS)w7u)nHo^qH&ouRL7oQ-JvbvXH0r*+ zN5rY!8~SSA)ghug<}KuW^uVDnGp!Iom?@LU8vZpkv~ccReId*3@N5XvNPluZCB*nZ zXl2EIOiSs0nwl~ z+pO)*Vjuqg>8vQbKG@FS^Uc9_CsrJOH`vZ%#o;5e@^M-x&huN=5%sq<)kFK6U^_)+ zYfFReRMzfY8*Hbk!P>XMHml>NE#z+@nU+x zT6#(A^%b$$er{31@_O-gS&L-lzM?ztoqYGO(Kp?cutR)FzNEt>d>=nR%Pam>R8$nq zm^piTY4Oa0(wXyboR_c~APX=*!2-AoSwd!xw~+08mCF(;#VqEWOH?b1IFDg#27BbP z5K9S*y)Izkuo-1a>xW#XOpKBTfsrq3^B73nnDnKhr~`^Ife zr93{ftW;%t|Fhn5&_ZP|S$QXgWqLH>*3I6p4r-fH{-AA2ErGJMiD{K-U(#WzPT!aQ zDe~(M-|&Ay$4Ti0ovK4+=>=K;mR^uOsk7>QPuIGf?Cx`W)b?C`?RfchT4f(YUVSqd z7M}s*L>2mVW5R?pRWm3fugra`%bemQu4`qvj; z1^IuQ|MHNhh8S|*_^WH3|Ke9!Lu&o=a3=2z@pl708t_qYl!89|x{Bjh zoR`(dkpJVvkKd_!*e9W~VV?{w6mCk97uT01M-eIe-!!h@tn5iXomKzYaZ>&;ymrKG zQXY-3?sNNQ^jtmQqn@ir9vi*p+VNv5N3R)MC|6W8xw9HxE8oYF{V0W8ZIiaCNSFV| zl?}=rM_IGp`XK(6!Z0*rV$4!^!k@xja1T5H55eS^t%{N5>{|f~U?Eh(B3KM-_q8Xy*9eJV(WbQr+jTo@R$v^?Y>o`P(|rvuy;r3$#!ojN(DfgIg?N@lsgE(V3RKNmQ2$ir17Q;5! z0lT=%0g%V`K=jMzE^D~Udal=|PMqLwE%YnO9ZL(eIjYT3ZH{VlRGXvP992p~T93_< zZH_D@Q%}j%Q|=C>V^KO5dKE>lqUcqWGuxcmrVbp+-=XXsO3y-E%7h2jC%?!tbWSwAgV^M~nGv7QdZ?EP+yvu>`pk zmcepZ0V`n@{0^Rh)$lA-@!K`XweTD~4==!runyLP4llt5*a)vc7+!_Vum!e4T>rPT zy%TmrHM|2g@Gk6uy|547gZJSB_z?EP0r(gWf(eJejkXX?0_N4tiSrOgJOP1?D5Hoq?Okt1Lv zjE1o=J{G3+hH1TF0?H0tVHYe>H%eM;(_k11BVZ(8p)XSER?tGtz>64aI>(cepTqA< zpp5rRkV|11EQb}a5>~+)_FW5C-Wm;R!62qcY>h_H8jYYe8bNC`E?N^N$MRdF5wu1l zXpKhD8jYYe8bNC`g4SqwHO1d|qPAExlN!;GDacf08ZsRz9|rc+Jr=tj z4K%RW1~HXEOl1&L8T9ZB^>dDSKRm$pgUE-Fe~z3C4};(K&A@k>>M=eO8&J%Cb2x4Z zJi)oe2Fyp6bN&ig01KfK7Qtdz!oEvk87zktuo9l;cdL+VIObY-4xWb>;6+#m>p_Q? zU;}J~O`P);WEftB&9DVt<9J(@FDDn1Mo2%1e1LZArB*uAZw9PWF7J-vYzvQ2A{(haDvZI^7$#` zY2+E?S>!on1M(~OIS=1L3>&0DDiBv|At0{Sh`u$VZ~pS4sa*}e=P+vQAp2Y8WHF^>gPvYCV@qB+fNK}6Zk~mzu7ba1z*=V1QmPt*w-V@oz zcROGgzY2O8{57@?XuasMufq|qJvY~3IeG*g_WKEvnHa(LNWeA+dTgS{CVFh5$0mAg zqQ^FREd2u$J(fO#i5}a59!u0l)ttfUiYn1hvc0xRjDVGbH5zFK12E7dRu z%jjSk9W>0Lt+b_K4pz~@Dmqw22dn5{6&rFseXoa z4zdKwUEkLTqWDO8~j{_71$Oluq{?#TiVXNO6(-rSBamFAZwA5 zg{?zMCRSpplgLv@$;h5TN>Htk<@OycO*Vd{FxQl1}mt! zroAHzpJo%o+xRkK0%}h@Pz{lkjTfrHm+91`g^jSV5f(PW!bVuw2n!n##tT{42n!pr z3@>D1Bdov+)lkb}yigb~6vhjMgA7#|Ph{YU3_MX7Ph{YU!gwMBPZak0#1FGQ6{f)> z@F+Y6z6ONxP8J$qVLL2O3+5xs`E3O(fQ3*Ai(oM<;rpeq43@(RSP4(VDp3+pvxAw!;qC3AW4&;6vCC2jF8k2qya+LLNpQLDnLp$U5XvWIgBo3_gc1 z-~^wanV;OiX1CJ#++%Os$#$$!i$}n0fV+diiQao0eUZz10)1Y@LS#9aF`&v1k ze*5iS-`ytCs=?M+*cuC4gGE4F#m+?0#weN?MH8cFVH7QlqJ=gZn4BX`%zI7cyJ-;5 zcg^89C9njR!ZKJ6D_|w8f;H^lJ{cE3@3o!d?F7knRdf7zkTpojdF?^&MeajhEca!y z&ms0bj68y@MMjZz$fL*;$dkxZ$kWI($g{|ENXd;g%^AdVV~rV>XpmuPmKWo%A7gdM zrdVWCEHcxQ4RO3^@=;_d?<2^!@ejRVEYRmCTVRnbu*eqhyM&0u@S=;!TvH4U&>$6L z1WIypi5c`xoL90qHs`fDuVl1sj%{;nn`7G?+vcw)izRDI59D0FW$}GVd)0Ab-AcVm zol1RPtS+Sp9sPcTr=|^szvW zg#4oASsodWt-{L3N1%JqbBK?#4rlvj7zHw>dTld5ayO&pQ(!7(H4W*vQHNO2P4X+( zFoNC--Rpzw2f4r~KJkQ0JmI$JbB53|6Xz|oJ+3VC7UW*a(bWoA01KfK7QtfRKHFn# znby-dXCX&*=ge1g^xl-}Fk&((Mzy5JE~8o(>#@tImh{+VR7-m7GO8s# zb{W-@e5H(PNe^8{wWNnGqgv8Kmr*T~7|SJ+c8Q|nb3P)B%S5zH-iPoTSxCwIWFsZ_ z(*@ZTnS<N?g}#w{fWB%@%`Lzj6lG8S#nzGN)gppD5`w1Fn* zXaZR#Pa7^}_JKbO=EoTb7mM2bUi}Yi20};l*F|?-^i?dVi!Qn7l8YXR)pS)M7QiK5 zafw%4;uV*8#U);Gu>dadl8Ya6X}K=(ic7rW60f+#D=zVhOT6L|ueii3F7b*>yy6nC zxWp?i@rp~l;u5d8#49fGic8$(5_h@8EiNtArNz3mR+pCQ(n?)gs7u`961TX-EiQ43 zOWfiTx46VDF0Iq0Wx5yc>LlCT8LiNz1-5*LU9RX3IVv+pr5q?lDLvJz-M!dYJX_Nq zQyJc?iu_C!c^QMej6q(;ATJ{^W)*j&Q)fDLrc-A+b*3leT=XF4q9^2BY%ICtTx7P8 zg`c&!C(FyZ6!Y6B_-;Nt4QqJ67M_FW;RSdR*1>wv;U(Ar8^O<&=+w7Pee2Y>PJQd- zN(|~;Zy{F_&$j94fQ}C6=zxw6=;(ls4(RBBjt=PPfQ}C6=zxw6=;(ls4(RBBjt=P5 ziQX*#agxtY!&zv6#C%7LJcQ&qQXw5$&u>_?7Aq;gF%U~U2nK_n&#(`)NX%rN1vP)>2P^9X;72mOJxkuz>hYqNq_9mA6sdx$yK!c_M2JK)b9Ej@$eluXCC;44x!IaX&yu7g) z$@V0U&xl2u0*T`^(|PaDkoCuE%6R`rI$q;hE1Bo1QA;UEv0Q0Lv0i@W+NMVmpQGM5 zev{Al$r)|QS-Xq@yNm&o|7o*F6!#PD6(c0t`gZK=d8H#I6SwDazb!pmO2C_^V3W6( zoYBhJ<2{y<`4iv&^N-1S z|L;~>=eW+q5=-Omzt2)jQMameUW%0(Ixwo9$?6R$%v-pMr?)$^8biA3$t#oR!F%&f zA6{81PhHRVLwG_qheyzFM}sQS5@ zqJE;L^7O>b>MwYWVU|lVdDvOJig=`djvB{9>?K@JDX;P5kII2+M*s~Zr4_h6j9q)NMHxAzf!w+%~sXwLyo#%@!YaH%c7?hsJ~aA@mkIb6Q8RU>I*GHt<*Yd9o6r(Of6Gw z(z3KH^@^6QWvj5(MeCwo)pE2PwOQ+~byr)o9$H`Zn$}+%pti9DSiah+4cA7i8m&;f aL;aI>mv)!>gff=r?X#Fo9sehvsQ&|WynRRj literal 0 HcmV?d00001 diff --git a/plugins/og-images/index.js b/plugins/og-images/index.js new file mode 100644 index 00000000..c8894839 --- /dev/null +++ b/plugins/og-images/index.js @@ -0,0 +1,376 @@ +/* Plugin Docusaurus : génère au build une image Open Graph (1200x630) par page + * de doc, de glossaire, d'article de blog et pour les pages marketing, à partir + * du titre + l'icône de la fonctionnalité (et un chiffre clé sur l'accueil), + * puis injecte og:image / twitter:image / og:type / og:image:alt dans le HTML. + * Rendu via Satori (HTML/CSS -> SVG) + resvg (SVG -> PNG) + sharp (compression). + * Tourne par locale (titres localisés). Cache persistant pour des rebuilds rapides. + * + * Build-time only : les polices TTF/OTF vivent dans ce dossier (non servies). */ + +const fs = require('fs'); +const path = require('path'); +const crypto = require('crypto'); + +const TEMPLATE_VERSION = '3'; // bump pour invalider le cache +const LOCALES = ['en', 'de', 'es', 'pt']; + +const FEATURE_ICON = { + 'raid-mode': 'iconAntiraidWhite.svg', + 'anti-spam': 'iconAntispamWhite.svg', + captcha: 'iconCaptchaWhite.svg', + 'authentication-manager': 'iconAuthManagerWhite.svg', + honeypot: 'iconHoneyPotWhite.svg', + reports: 'iconReportWhite.svg', + 'scam-images': 'iconScamLens.svg', + display: 'iconDisplayWhite.svg', + 'dm-lock': 'iconDmlockWhite.svg', + 'tag-role': 'iconTagWhite.svg', + moderation: 'iconModView.svg', + sanctions: 'iconSanctions.svg', +}; + +const CATEGORY = { + fr: {docs: 'Documentation', learn: 'Glossaire', blog: 'Blog'}, + en: {docs: 'Documentation', learn: 'Glossary', blog: 'Blog'}, + de: {docs: 'Dokumentation', learn: 'Glossar', blog: 'Blog'}, + es: {docs: 'Documentación', learn: 'Glosario', blog: 'Blog'}, + pt: {docs: 'Documentação', learn: 'Glossário', blog: 'Blog'}, +}; + +const TAGLINE = { + fr: 'Bot Discord de modération et de protection', + en: 'Discord moderation & protection bot', + de: 'Discord-Bot für Moderation und Schutz', + es: 'Bot de moderación y protección para Discord', + pt: 'Bot de moderação e proteção para Discord', +}; + +// Chiffre clé de l'accueil (aligné sur le count par défaut du site). +const STAT = { + fr: '400 000+ serveurs · 55M+ membres protégés', + en: '400,000+ servers · 55M+ protected members', + de: '400.000+ Server · 55M+ geschützte Mitglieder', + es: '400 000+ servidores · 55M+ miembros protegidos', + pt: '400.000+ servidores · 55M+ membros protegidos', +}; + +// Pages marketing (chemins relatifs à l'outDir de la locale). +const MARKETING = [ + 'premium.html', + 'business.html', + 'communities/games.html', + 'communities/creators.html', +]; + +// Pages commerciales : titre + points mis en avant (au lieu du simple titre). +const HIGHLIGHTS = { + 'premium.html': { + pill: 'Premium', + title: { + fr: 'Poussez RaidProtect plus loin', + en: 'Push RaidProtect further', + de: 'Holen Sie mehr aus RaidProtect', + es: 'Lleva RaidProtect más lejos', + pt: 'Leve o RaidProtect além', + }, + points: { + fr: ['Sanctions à votre vocabulaire', 'Anti-raid en mode expulsion', 'Limites étendues sur vos modules', 'Accès anticipé aux nouveautés'], + en: ['Sanctions in your own words', 'Kick-mode anti-raid', 'Higher limits on your modules', 'Early access to new features'], + de: ['Sanktionen in Ihren Worten', 'Anti-Raid im Kick-Modus', 'Höhere Limits für Ihre Module', 'Früher Zugang zu Neuheiten'], + es: ['Sanciones a tu medida', 'Anti-raid en modo expulsión', 'Límites ampliados en tus módulos', 'Acceso anticipado a novedades'], + pt: ['Sanções no seu vocabulário', 'Anti-raid em modo expulsão', 'Limites ampliados nos seus módulos', 'Acesso antecipado às novidades'], + }, + }, + 'business.html': { + pill: 'Business', + title: { + fr: 'RaidProtect pour les entreprises', + en: 'RaidProtect for companies', + de: 'RaidProtect für Unternehmen', + es: 'RaidProtect para empresas', + pt: 'RaidProtect para empresas', + }, + points: { + fr: ['Modérateurs professionnels', 'Instance dédiée et isolée', 'Conformité RGPD assumée', 'Audit et suivi humain'], + en: ['Professional moderators', 'Dedicated, isolated instance', 'GDPR compliant', 'Expert audit & human follow-up'], + de: ['Professionelle Moderatoren', 'Dedizierte, isolierte Instanz', 'DSGVO-konform', 'Experten-Audit & menschliche Betreuung'], + es: ['Moderadores profesionales', 'Instancia dedicada y aislada', 'Cumplimiento del RGPD', 'Auditoría y seguimiento humano'], + pt: ['Moderadores profissionais', 'Instância dedicada e isolada', 'Conformidade com o RGPD', 'Auditoria e acompanhamento humano'], + }, + }, +}; + +function walk(dir) { + const out = []; + if (!fs.existsSync(dir)) return out; + for (const e of fs.readdirSync(dir, {withFileTypes: true})) { + const full = path.join(dir, e.name); + if (e.isDirectory()) out.push(...walk(full)); + else if (e.name.endsWith('.html')) out.push(full); + } + return out; +} + +const isVersionSegment = (seg) => seg === 'beta' || /^\d+\.\d+/.test(seg); + +const decode = (s) => + s + .replace(/&/g, '&') + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/'/g, "'"); + +function extractTitle(html) { + const m = html.match(/]*>([^<]*)<\/title>/i); + if (!m) return null; + return decode(m[1]).replace(/\s*\|\s*RaidProtect\s*$/, '').trim(); +} + +const el = (type, style, children) => ({type, props: {style, ...(children !== undefined ? {children} : {})}}); + +module.exports = function ogImagesPlugin(context) { + const {currentLocale, defaultLocale} = context.i18n; + const localePrefix = currentLocale === defaultLocale ? '' : `/${currentLocale}`; + const cat = CATEGORY[currentLocale] || CATEGORY[defaultLocale] || CATEGORY.fr; + const tagline = TAGLINE[currentLocale] || TAGLINE[defaultLocale] || TAGLINE.fr; + const stat = STAT[currentLocale] || STAT[defaultLocale] || STAT.fr; + const iconsDir = path.join(context.siteDir, 'static/img/icons'); + const cacheDir = path.join(context.siteDir, 'node_modules/.cache/og-images'); + + return { + name: 'og-images', + async postBuild({siteConfig, outDir}) { + const satori = (await import('satori')).default; + const {Resvg} = require('@resvg/resvg-js'); + const sharp = require('sharp'); + + const fonts = [ + {name: 'Nohemi', data: fs.readFileSync(path.join(__dirname, 'fonts/nohemi-700.ttf')), weight: 700, style: 'normal'}, + {name: 'Objectivity', data: fs.readFileSync(path.join(__dirname, 'fonts/objectivity-regular.otf')), weight: 400, style: 'normal'}, + ]; + + const iconCache = {}; + const iconDataUri = (file) => { + if (!file) return null; + if (file in iconCache) return iconCache[file]; + try { + const svg = fs.readFileSync(path.join(iconsDir, file), 'utf8'); + const png = new Resvg(svg, {fitTo: {mode: 'width', value: 180}}).render().asPng(); + iconCache[file] = `data:image/png;base64,${Buffer.from(png).toString('base64')}`; + } catch { + iconCache[file] = null; + } + return iconCache[file]; + }; + + let logoUri = null; + try { + const logoSvg = fs.readFileSync(path.join(iconsDir, 'extend_logo.svg'), 'utf8'); + const logoPng = new Resvg(logoSvg, {fitTo: {mode: 'width', value: 660}}).render().asPng(); + logoUri = `data:image/png;base64,${Buffer.from(logoPng).toString('base64')}`; + } catch { + logoUri = null; + } + + // Coche rouge pour les points mis en avant (premium/business). + const checkSvg = + ''; + const checkUri = `data:image/png;base64,${Buffer.from( + new Resvg(checkSvg, {fitTo: {mode: 'width', value: 56}}).render().asPng(), + ).toString('base64')}`; + + // Collecte des pages + leur type. + const pages = []; + const add = (file, kind) => { + const rel = path.relative(outDir, file).split(path.sep).join('/'); + pages.push({file, rel, kind}); + }; + for (const file of walk(path.join(outDir, 'docs'))) { + const rel = path.relative(outDir, file).split(path.sep).join('/'); + const segs = rel.split('/'); + if (LOCALES.includes(segs[0])) continue; + if (isVersionSegment((segs[1] || '').replace(/\.html$/, ''))) continue; + if (/^docs\/edit(\.html)?$/.test(rel) || /\/tags\//.test(rel) || /(^|\/)404/.test(rel)) continue; + add(file, 'docs'); + } + for (const file of walk(path.join(outDir, 'learn'))) { + const rel = path.relative(outDir, file).split(path.sep).join('/'); + if (LOCALES.includes(rel.split('/')[0])) continue; + if (/\/tags\//.test(rel)) continue; + add(file, 'learn'); + } + // Le blog est volontairement exclu : chaque article a sa propre image + // (frontmatter `image:`), qu'on ne doit pas écraser. + add(path.join(outDir, 'index.html'), 'home'); + for (const rel of MARKETING) { + const file = path.join(outDir, rel); + if (fs.existsSync(file)) add(file, 'marketing'); + } + + const ogDir = path.join(outDir, 'img', 'og'); + fs.mkdirSync(ogDir, {recursive: true}); + fs.mkdirSync(cacheDir, {recursive: true}); + const base = (siteConfig.url || 'https://raidprotect.bot').replace(/\/$/, '') + localePrefix; + let count = 0; + + for (const p of pages) { + if (!fs.existsSync(p.file)) continue; + const html = fs.readFileSync(p.file, 'utf8'); + let title = extractTitle(html); + if (!title) continue; + + let category = null; + let iconFile = null; + let footer = 'raidprotect.bot'; + let ogType = 'website'; + if (p.kind === 'docs') { + category = cat.docs; + ogType = 'article'; + const fm = p.rel.match(/^docs\/features\/([a-z-]+)\.html$/); + if (fm) iconFile = FEATURE_ICON[fm[1]] || null; + } else if (p.kind === 'learn') { + category = cat.learn; + ogType = 'article'; + } else if (p.kind === 'blog') { + category = cat.blog; + ogType = 'article'; + } else if (p.kind === 'home') { + title = title.replace(/^RaidProtect\s*[•·—-]\s*/, ''); + footer = stat; + } + + // Pages commerciales : titre + points mis en avant. + const hl = p.kind === 'marketing' ? HIGHLIGHTS[p.rel] : null; + const hlTitle = hl ? hl.title[currentLocale] || hl.title[defaultLocale] : null; + const hlPoints = hl ? hl.points[currentLocale] || hl.points[defaultLocale] : null; + if (hl) category = hl.pill; + + // Cache : clé sur les entrées qui influent le rendu. + const key = crypto + .createHash('sha1') + .update( + [TEMPLATE_VERSION, currentLocale, p.kind, title, iconFile || '', category || '', footer, hlTitle || '', hlPoints ? hlPoints.join('¦') : ''].join('|'), + ) + .digest('hex'); + const cachePath = path.join(cacheDir, `${key}.png`); + + let png; + if (fs.existsSync(cachePath)) { + png = fs.readFileSync(cachePath); + } else { + const icon = iconFile ? iconDataUri(iconFile) : null; + const svg = await satori( + el('div', { + display: 'flex', + flexDirection: 'column', + justifyContent: 'space-between', + width: '100%', + height: '100%', + padding: 72, + backgroundColor: '#111019', + backgroundImage: 'radial-gradient(1200px 630px at 100% 0%, rgba(211,95,95,0.28), rgba(17,16,25,0) 60%)', + color: '#ffffff', + fontFamily: 'Objectivity', + }, [ + el('div', {display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between'}, [ + el('div', {display: 'flex', flexDirection: 'column'}, [ + logoUri + ? {type: 'img', props: {src: logoUri, width: 330, height: 42, style: {width: 330, height: 42}}} + : el('div', {display: 'flex', fontFamily: 'Nohemi', fontSize: 34, fontWeight: 700}, 'RaidProtect'), + el('div', {display: 'flex', fontSize: 23, color: '#8f8ea0', marginTop: 16}, tagline), + ]), + ...(category + ? [el('div', { + display: 'flex', + fontSize: 22, + padding: '8px 20px', + borderRadius: 999, + color: '#cbcad6', + border: '1px solid rgba(255,255,255,0.22)', + }, category)] + : []), + ]), + el( + 'div', + {display: 'flex', flexDirection: 'column'}, + hlTitle + ? [ + el('div', { + display: 'flex', + fontFamily: 'Nohemi', + fontSize: 50, + fontWeight: 700, + lineHeight: 1.1, + marginBottom: 30, + maxWidth: 1000, + }, hlTitle), + el('div', {display: 'flex', flexDirection: 'column'}, + hlPoints.map((pt) => + el('div', {display: 'flex', alignItems: 'center', marginTop: 16, fontSize: 29, color: '#e1e0e9'}, [ + {type: 'img', props: {src: checkUri, width: 30, height: 30, style: {width: 30, height: 30, marginRight: 18}}}, + pt, + ]), + ), + ), + ] + : [ + ...(icon + ? [el('div', { + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + width: 116, + height: 116, + borderRadius: 26, + backgroundColor: 'rgba(255,255,255,0.08)', + marginBottom: 30, + }, [{type: 'img', props: {src: icon, width: 68, height: 68, style: {width: 68, height: 68}}}])] + : []), + el('div', { + display: 'flex', + fontFamily: 'Nohemi', + fontSize: title.length > 48 ? 56 : 68, + fontWeight: 700, + lineHeight: 1.1, + maxWidth: 1000, + }, title), + ], + ), + el('div', {display: 'flex', fontSize: 26, color: '#8f8ea0'}, footer), + ]), + {width: 1200, height: 630, fonts}, + ); + const raw = new Resvg(svg).render().asPng(); + png = await sharp(raw).png({palette: true, compressionLevel: 9, effort: 8}).toBuffer(); + fs.writeFileSync(cachePath, png); + } + + const name = (p.rel === 'index.html' ? 'home' : p.rel.replace(/\.html$/, '').replace(/\//g, '-')) + '.png'; + fs.writeFileSync(path.join(ogDir, name), png); + + const url = `${base}/img/og/${name}`; + const alt = title.replace(/"/g, '"'); + let head = html + .replace(/]+property="og:image(:width|:height|:alt)?"[^>]*>/gi, '') + .replace(/]+name="twitter:image"[^>]*>/gi, '') + .replace(/]+name="twitter:card"[^>]*>/gi, '') + .replace(/]+property="og:type"[^>]*>/gi, ''); + const tags = + `` + + `` + + `` + + `` + + `` + + `` + + ``; + head = head.replace('', `${tags}`); + fs.writeFileSync(p.file, head); + count++; + } + + console.log(`[og-images] (${currentLocale}) ${count} images OG (docs, learn, marketing, accueil).`); + }, + }; +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1e2d6fed..ddadbfcb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,6 +48,15 @@ importers: '@docusaurus/types': specifier: ^3.10.2 version: 3.10.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@resvg/resvg-js': + specifier: ^2.6.2 + version: 2.6.2 + satori: + specifier: ^0.33.4 + version: 0.33.4 + sharp: + specifier: ^0.35.4 + version: 0.35.4 typescript: specifier: ~5.6.2 version: 5.6.3 @@ -1303,12 +1312,161 @@ packages: resolution: {integrity: sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw==} engines: {node: '>=20.0'} + '@emnapi/runtime@1.11.3': + resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} + '@hapi/hoek@9.3.0': resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.35.4': + resolution: {integrity: sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.35.4': + resolution: {integrity: sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [darwin] + + '@img/sharp-freebsd-wasm32@0.35.4': + resolution: {integrity: sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==} + engines: {node: '>=20.9.0'} + os: [freebsd] + + '@img/sharp-libvips-darwin-arm64@1.3.3': + resolution: {integrity: sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.3.3': + resolution: {integrity: sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.3.3': + resolution: {integrity: sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.3.3': + resolution: {integrity: sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.3.3': + resolution: {integrity: sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-riscv64@1.3.3': + resolution: {integrity: sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==} + cpu: [riscv64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.3.3': + resolution: {integrity: sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.3.3': + resolution: {integrity: sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.3.3': + resolution: {integrity: sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.3.3': + resolution: {integrity: sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.35.4': + resolution: {integrity: sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.35.4': + resolution: {integrity: sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==} + engines: {node: '>=20.9.0'} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.35.4': + resolution: {integrity: sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==} + engines: {node: '>=20.9.0'} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-riscv64@0.35.4': + resolution: {integrity: sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==} + engines: {node: '>=20.9.0'} + cpu: [riscv64] + os: [linux] + + '@img/sharp-linux-s390x@0.35.4': + resolution: {integrity: sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==} + engines: {node: '>=20.9.0'} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.35.4': + resolution: {integrity: sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.35.4': + resolution: {integrity: sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.35.4': + resolution: {integrity: sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.35.4': + resolution: {integrity: sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==} + engines: {node: '>=20.9.0'} + + '@img/sharp-webcontainers-wasm32@0.35.4': + resolution: {integrity: sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==} + engines: {node: '>=20.9.0'} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.35.4': + resolution: {integrity: sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.35.4': + resolution: {integrity: sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==} + engines: {node: ^20.9.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.35.4': + resolution: {integrity: sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [win32] + '@jest/schemas@29.6.3': resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1587,6 +1745,87 @@ packages: '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + '@resvg/resvg-js-android-arm-eabi@2.6.2': + resolution: {integrity: sha512-FrJibrAk6v29eabIPgcTUMPXiEz8ssrAk7TXxsiZzww9UTQ1Z5KAbFJs+Z0Ez+VZTYgnE5IQJqBcoSiMebtPHA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@resvg/resvg-js-android-arm64@2.6.2': + resolution: {integrity: sha512-VcOKezEhm2VqzXpcIJoITuvUS/fcjIw5NA/w3tjzWyzmvoCdd+QXIqy3FBGulWdClvp4g+IfUemigrkLThSjAQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@resvg/resvg-js-darwin-arm64@2.6.2': + resolution: {integrity: sha512-nmok2LnAd6nLUKI16aEB9ydMC6Lidiiq2m1nEBDR1LaaP7FGs4AJ90qDraxX+CWlVuRlvNjyYJTNv8qFjtL9+A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@resvg/resvg-js-darwin-x64@2.6.2': + resolution: {integrity: sha512-GInyZLjgWDfsVT6+SHxQVRwNzV0AuA1uqGsOAW+0th56J7Nh6bHHKXHBWzUrihxMetcFDmQMAX1tZ1fZDYSRsw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@resvg/resvg-js-linux-arm-gnueabihf@2.6.2': + resolution: {integrity: sha512-YIV3u/R9zJbpqTTNwTZM5/ocWetDKGsro0SWp70eGEM9eV2MerWyBRZnQIgzU3YBnSBQ1RcxRZvY/UxwESfZIw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@resvg/resvg-js-linux-arm64-gnu@2.6.2': + resolution: {integrity: sha512-zc2BlJSim7YR4FZDQ8OUoJg5holYzdiYMeobb9pJuGDidGL9KZUv7SbiD4E8oZogtYY42UZEap7dqkkYuA91pg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@resvg/resvg-js-linux-arm64-musl@2.6.2': + resolution: {integrity: sha512-3h3dLPWNgSsD4lQBJPb4f+kvdOSJHa5PjTYVsWHxLUzH4IFTJUAnmuWpw4KqyQ3NA5QCyhw4TWgxk3jRkQxEKg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@resvg/resvg-js-linux-x64-gnu@2.6.2': + resolution: {integrity: sha512-IVUe+ckIerA7xMZ50duAZzwf1U7khQe2E0QpUxu5MBJNao5RqC0zwV/Zm965vw6D3gGFUl7j4m+oJjubBVoftw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@resvg/resvg-js-linux-x64-musl@2.6.2': + resolution: {integrity: sha512-UOf83vqTzoYQO9SZ0fPl2ZIFtNIz/Rr/y+7X8XRX1ZnBYsQ/tTb+cj9TE+KHOdmlTFBxhYzVkP2lRByCzqi4jQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@resvg/resvg-js-win32-arm64-msvc@2.6.2': + resolution: {integrity: sha512-7C/RSgCa+7vqZ7qAbItfiaAWhyRSoD4l4BQAbVDqRRsRgY+S+hgS3in0Rxr7IorKUpGE69X48q6/nOAuTJQxeQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@resvg/resvg-js-win32-ia32-msvc@2.6.2': + resolution: {integrity: sha512-har4aPAlvjnLcil40AC77YDIk6loMawuJwFINEM7n0pZviwMkMvjb2W5ZirsNOZY4aDbo5tLx0wNMREp5Brk+w==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@resvg/resvg-js-win32-x64-msvc@2.6.2': + resolution: {integrity: sha512-ZXtYhtUr5SSaBrUDq7DiyjOFJqBVL/dOBN7N/qmi/pO0IgiWW/f/ue3nbvu9joWE5aAKDoIzy/CxsY0suwGosQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@resvg/resvg-js@2.6.2': + resolution: {integrity: sha512-xBaJish5OeGmniDj9cW5PRa/PtmuVU3ziqrbr5xJj901ZDN4TosrVaNZpEiLZAxdfnhAe7uQ7QFWfjPe9d9K2Q==} + engines: {node: '>= 10'} + + '@shuding/opentype.js@1.4.0-beta.0': + resolution: {integrity: sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==} + engines: {node: '>= 8.0.0'} + hasBin: true + '@sideway/address@4.1.5': resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} @@ -2051,6 +2290,10 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + base64-js@0.0.8: + resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} + engines: {node: '>= 0.4'} + baseline-browser-mapping@2.10.0: resolution: {integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==} engines: {node: '>=6.0.0'} @@ -2150,6 +2393,9 @@ packages: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} + camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} @@ -2361,18 +2607,32 @@ packages: resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} engines: {node: '>=12'} + css-background-parser@0.1.0: + resolution: {integrity: sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==} + css-blank-pseudo@7.0.1: resolution: {integrity: sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==} engines: {node: '>=18'} peerDependencies: postcss: ^8.4 + css-box-shadow@1.0.0-3: + resolution: {integrity: sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==} + + css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + css-declaration-sorter@7.3.1: resolution: {integrity: sha512-gz6x+KkgNCjxq3Var03pRYLhyNfwhkKF1g/yoLgDNtFvVu0/fOLV9C8fFEZRjACp/XQLumjAYo7JVjzH3wLbxA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.0.9 + css-gradient-parser@0.0.17: + resolution: {integrity: sha512-w2Xy9UMMwlKtou0vlRnXvWglPAceXCTtcmVSo8ZBUvqCV5aXEFP/PC6d+I464810I9FT++UACwTD5511bmGPUg==} + engines: {node: '>=16'} + css-has-pseudo@7.0.3: resolution: {integrity: sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==} engines: {node: '>=18'} @@ -2428,6 +2688,9 @@ packages: css-select@5.2.2: resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + css-tree@2.2.1: resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} @@ -2558,6 +2821,10 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} @@ -2634,6 +2901,10 @@ packages: electron-to-chromium@1.5.307: resolution: {integrity: sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==} + emoji-regex-xs@2.0.1: + resolution: {integrity: sha512-1QFuh8l7LqUcKe24LsPUNzjrzJQ7pgRwp1QMcZ5MX6mFplk2zQ08NVCM84++1cveaUUYtcCYHmeFEuNg16sU4g==} + engines: {node: '>=10.0.0'} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2817,6 +3088,9 @@ packages: resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} engines: {node: '>=0.4.0'} + fflate@0.7.3: + resolution: {integrity: sha512-0Zz1jOzJWERhyhsimS54VTqOteCNwRtIlh8isdL0AXLo0g7xNTfTL7oWrkmCnPhZGocKIkWHBistBrrpoNH3aw==} + file-loader@6.2.0: resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} engines: {node: '>= 10.13.0'} @@ -2955,6 +3229,9 @@ packages: handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + harfbuzzjs@0.10.0: + resolution: {integrity: sha512-SN8LVwCOzvTq3OPNd0+EAghgXugItz56wst567D1vs7LnnKGWprhi3EG58aVOBwhN8HEbQxL4I9NDWkcXUutRw==} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -3002,6 +3279,10 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + hex-rgb@4.3.0: + resolution: {integrity: sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==} + engines: {node: '>=6'} + history@4.10.1: resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} @@ -3365,6 +3646,9 @@ packages: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} + linebreak@1.1.0: + resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -3832,6 +4116,9 @@ packages: resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} engines: {node: '>=14.16'} + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + param-case@3.0.4: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} @@ -3839,6 +4126,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-css-color@0.2.1: + resolution: {integrity: sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==} + parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} @@ -4573,6 +4863,10 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + satori@0.33.4: + resolution: {integrity: sha512-dCnaW6D/tkCJxG5UvpZPWnnvfTdGTVVSAq1tzH6xC5MeOhAeeswRcSq5zT7C6lRCdTGow9PRGus7PCzdp5JJYw==} + engines: {node: '>=16'} + sax@1.5.0: resolution: {integrity: sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==} engines: {node: '>=11.0.0'} @@ -4618,6 +4912,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + send@0.19.2: resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} engines: {node: '>= 0.8.0'} @@ -4650,6 +4949,15 @@ packages: shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + sharp@0.35.4: + resolution: {integrity: sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==} + engines: {node: '>=20.9.0'} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -4763,6 +5071,9 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string.prototype.codepointat@0.2.1: + resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==} + string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -4869,6 +5180,9 @@ packages: thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} @@ -4956,6 +5270,9 @@ packages: resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} engines: {node: '>=4'} + unicode-trie@2.0.0: + resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} + unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} @@ -5191,6 +5508,9 @@ packages: resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} + yoga-layout@3.2.1: + resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -7395,12 +7715,123 @@ snapshots: - uglify-js - webpack-cli + '@emnapi/runtime@1.11.3': + dependencies: + tslib: 2.8.1 + optional: true + '@hapi/hoek@9.3.0': {} '@hapi/topo@5.1.0': dependencies: '@hapi/hoek': 9.3.0 + '@img/colour@1.1.0': {} + + '@img/sharp-darwin-arm64@0.35.4': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.3.3 + optional: true + + '@img/sharp-darwin-x64@0.35.4': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.3.3 + optional: true + + '@img/sharp-freebsd-wasm32@0.35.4': + dependencies: + '@img/sharp-wasm32': 0.35.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.3.3': + optional: true + + '@img/sharp-libvips-darwin-x64@1.3.3': + optional: true + + '@img/sharp-libvips-linux-arm64@1.3.3': + optional: true + + '@img/sharp-libvips-linux-arm@1.3.3': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.3.3': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.3.3': + optional: true + + '@img/sharp-libvips-linux-s390x@1.3.3': + optional: true + + '@img/sharp-libvips-linux-x64@1.3.3': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.3.3': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.3.3': + optional: true + + '@img/sharp-linux-arm64@0.35.4': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.3.3 + optional: true + + '@img/sharp-linux-arm@0.35.4': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.3.3 + optional: true + + '@img/sharp-linux-ppc64@0.35.4': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.3.3 + optional: true + + '@img/sharp-linux-riscv64@0.35.4': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.3.3 + optional: true + + '@img/sharp-linux-s390x@0.35.4': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.3.3 + optional: true + + '@img/sharp-linux-x64@0.35.4': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.3.3 + optional: true + + '@img/sharp-linuxmusl-arm64@0.35.4': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.3.3 + optional: true + + '@img/sharp-linuxmusl-x64@0.35.4': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.3.3 + optional: true + + '@img/sharp-wasm32@0.35.4': + dependencies: + '@emnapi/runtime': 1.11.3 + optional: true + + '@img/sharp-webcontainers-wasm32@0.35.4': + dependencies: + '@img/sharp-wasm32': 0.35.4 + optional: true + + '@img/sharp-win32-arm64@0.35.4': + optional: true + + '@img/sharp-win32-ia32@0.35.4': + optional: true + + '@img/sharp-win32-x64@0.35.4': + optional: true + '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.10 @@ -7816,6 +8247,62 @@ snapshots: '@polka/url@1.0.0-next.29': {} + '@resvg/resvg-js-android-arm-eabi@2.6.2': + optional: true + + '@resvg/resvg-js-android-arm64@2.6.2': + optional: true + + '@resvg/resvg-js-darwin-arm64@2.6.2': + optional: true + + '@resvg/resvg-js-darwin-x64@2.6.2': + optional: true + + '@resvg/resvg-js-linux-arm-gnueabihf@2.6.2': + optional: true + + '@resvg/resvg-js-linux-arm64-gnu@2.6.2': + optional: true + + '@resvg/resvg-js-linux-arm64-musl@2.6.2': + optional: true + + '@resvg/resvg-js-linux-x64-gnu@2.6.2': + optional: true + + '@resvg/resvg-js-linux-x64-musl@2.6.2': + optional: true + + '@resvg/resvg-js-win32-arm64-msvc@2.6.2': + optional: true + + '@resvg/resvg-js-win32-ia32-msvc@2.6.2': + optional: true + + '@resvg/resvg-js-win32-x64-msvc@2.6.2': + optional: true + + '@resvg/resvg-js@2.6.2': + optionalDependencies: + '@resvg/resvg-js-android-arm-eabi': 2.6.2 + '@resvg/resvg-js-android-arm64': 2.6.2 + '@resvg/resvg-js-darwin-arm64': 2.6.2 + '@resvg/resvg-js-darwin-x64': 2.6.2 + '@resvg/resvg-js-linux-arm-gnueabihf': 2.6.2 + '@resvg/resvg-js-linux-arm64-gnu': 2.6.2 + '@resvg/resvg-js-linux-arm64-musl': 2.6.2 + '@resvg/resvg-js-linux-x64-gnu': 2.6.2 + '@resvg/resvg-js-linux-x64-musl': 2.6.2 + '@resvg/resvg-js-win32-arm64-msvc': 2.6.2 + '@resvg/resvg-js-win32-ia32-msvc': 2.6.2 + '@resvg/resvg-js-win32-x64-msvc': 2.6.2 + + '@shuding/opentype.js@1.4.0-beta.0': + dependencies: + fflate: 0.7.3 + string.prototype.codepointat: 0.2.1 + '@sideway/address@4.1.5': dependencies: '@hapi/hoek': 9.3.0 @@ -8361,6 +8848,8 @@ snapshots: balanced-match@1.0.2: {} + base64-js@0.0.8: {} + baseline-browser-mapping@2.10.0: {} batch@0.6.1: {} @@ -8484,6 +8973,8 @@ snapshots: camelcase@7.0.1: {} + camelize@1.0.1: {} + caniuse-api@3.0.0: dependencies: browserslist: 4.28.1 @@ -8697,15 +9188,23 @@ snapshots: dependencies: type-fest: 1.4.0 + css-background-parser@0.1.0: {} + css-blank-pseudo@7.0.1(postcss@8.5.8): dependencies: postcss: 8.5.8 postcss-selector-parser: 7.1.1 + css-box-shadow@1.0.0-3: {} + + css-color-keywords@1.0.0: {} + css-declaration-sorter@7.3.1(postcss@8.5.8): dependencies: postcss: 8.5.8 + css-gradient-parser@0.0.17: {} + css-has-pseudo@7.0.3(postcss@8.5.8): dependencies: '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.1) @@ -8758,6 +9257,12 @@ snapshots: domutils: 3.2.2 nth-check: 2.1.1 + css-to-react-native@3.2.0: + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + css-tree@2.2.1: dependencies: mdn-data: 2.0.28 @@ -8890,6 +9395,8 @@ snapshots: destroy@1.2.0: {} + detect-libc@2.1.2: {} + detect-node@2.1.0: {} detect-port@2.1.0: @@ -8990,6 +9497,8 @@ snapshots: electron-to-chromium@1.5.307: {} + emoji-regex-xs@2.0.1: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -9200,6 +9709,8 @@ snapshots: dependencies: xml-js: 1.6.11 + fflate@0.7.3: {} + file-loader@6.2.0(webpack@5.105.4): dependencies: loader-utils: 2.0.4 @@ -9344,6 +9855,8 @@ snapshots: handle-thing@2.0.1: {} + harfbuzzjs@0.10.0: {} + has-flag@4.0.0: {} has-property-descriptors@1.0.2: @@ -9454,6 +9967,8 @@ snapshots: he@1.2.0: {} + hex-rgb@4.3.0: {} + history@4.10.1: dependencies: '@babel/runtime': 7.28.6 @@ -9785,6 +10300,11 @@ snapshots: lilconfig@3.1.3: {} + linebreak@1.1.0: + dependencies: + base64-js: 0.0.8 + unicode-trie: 2.0.0 + lines-and-columns@1.2.4: {} loader-runner@4.3.1: {} @@ -10531,6 +11051,8 @@ snapshots: registry-url: 6.0.1 semver: 7.7.4 + pako@0.2.9: {} + param-case@3.0.4: dependencies: dot-case: 3.0.4 @@ -10540,6 +11062,11 @@ snapshots: dependencies: callsites: 3.1.0 + parse-css-color@0.2.1: + dependencies: + color-name: 1.1.4 + hex-rgb: 4.3.0 + parse-entities@4.0.2: dependencies: '@types/unist': 2.0.11 @@ -11409,6 +11936,22 @@ snapshots: safer-buffer@2.1.2: {} + satori@0.33.4: + dependencies: + '@shuding/opentype.js': 1.4.0-beta.0 + css-background-parser: 0.1.0 + css-box-shadow: 1.0.0-3 + css-gradient-parser: 0.0.17 + css-to-react-native: 3.2.0 + emoji-regex-xs: 2.0.1 + escape-html: 1.0.3 + fflate: 0.7.3 + harfbuzzjs: 0.10.0 + linebreak: 1.1.0 + parse-css-color: 0.2.1 + postcss-value-parser: 4.2.0 + yoga-layout: 3.2.1 + sax@1.5.0: {} scheduler@0.23.2: @@ -11452,6 +11995,8 @@ snapshots: semver@7.7.4: {} + semver@7.8.5: {} + send@0.19.2: dependencies: debug: 2.6.9 @@ -11522,6 +12067,38 @@ snapshots: shallowequal@1.1.0: {} + sharp@0.35.4: + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.8.5 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.35.4 + '@img/sharp-darwin-x64': 0.35.4 + '@img/sharp-freebsd-wasm32': 0.35.4 + '@img/sharp-libvips-darwin-arm64': 1.3.3 + '@img/sharp-libvips-darwin-x64': 1.3.3 + '@img/sharp-libvips-linux-arm': 1.3.3 + '@img/sharp-libvips-linux-arm64': 1.3.3 + '@img/sharp-libvips-linux-ppc64': 1.3.3 + '@img/sharp-libvips-linux-riscv64': 1.3.3 + '@img/sharp-libvips-linux-s390x': 1.3.3 + '@img/sharp-libvips-linux-x64': 1.3.3 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.3 + '@img/sharp-libvips-linuxmusl-x64': 1.3.3 + '@img/sharp-linux-arm': 0.35.4 + '@img/sharp-linux-arm64': 0.35.4 + '@img/sharp-linux-ppc64': 0.35.4 + '@img/sharp-linux-riscv64': 0.35.4 + '@img/sharp-linux-s390x': 0.35.4 + '@img/sharp-linux-x64': 0.35.4 + '@img/sharp-linuxmusl-arm64': 0.35.4 + '@img/sharp-linuxmusl-x64': 0.35.4 + '@img/sharp-webcontainers-wasm32': 0.35.4 + '@img/sharp-win32-arm64': 0.35.4 + '@img/sharp-win32-ia32': 0.35.4 + '@img/sharp-win32-x64': 0.35.4 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -11650,6 +12227,8 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.2.0 + string.prototype.codepointat@0.2.1: {} + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 @@ -11746,6 +12325,8 @@ snapshots: thunky@1.1.0: {} + tiny-inflate@1.0.3: {} + tiny-invariant@1.3.3: {} tiny-warning@1.0.3: {} @@ -11806,6 +12387,11 @@ snapshots: unicode-property-aliases-ecmascript@2.2.0: {} + unicode-trie@2.0.0: + dependencies: + pako: 0.2.9 + tiny-inflate: 1.0.3 + unified@11.0.5: dependencies: '@types/unist': 3.0.3 @@ -12103,4 +12689,6 @@ snapshots: yocto-queue@1.2.2: {} + yoga-layout@3.2.1: {} + zwitch@2.0.4: {}