From 90d905848b2b25a90fcde8601088eaa14b63153a Mon Sep 17 00:00:00 2001 From: Balachandra Bhat <66437415+bnbhat@users.noreply.github.com> Date: Sun, 12 Oct 2025 19:02:42 +0200 Subject: [PATCH] meta: add snap packaging support --- snap/snapcraft.yaml | 72 +++++++++++++++++++++++++++++++++++++++++ snap/trayscale.desktop | 16 +++++++++ snap/trayscale.png | Bin 0 -> 18990 bytes 3 files changed, 88 insertions(+) create mode 100644 snap/snapcraft.yaml create mode 100644 snap/trayscale.desktop create mode 100644 snap/trayscale.png diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml new file mode 100644 index 00000000..8e5188dd --- /dev/null +++ b/snap/snapcraft.yaml @@ -0,0 +1,72 @@ +name: trayscale +base: core24 +version: '1.8.3' +summary: Trayscale - GUI for Tailscale Client +description: | + Trayscale is an unofficial GUI interface for the Tailscale daemon + particularly for use on Linux, as no official Linux GUI client exists. + It provides a basic system tray icon and a fairly comprehensive UI with + support for many of Tailscale's features. +grade: stable +confinement: strict + +platforms: + amd64: + build-on: [amd64] + build-for: [amd64] + arm64: + build-on: [arm64] + build-for: [arm64] + +plugs: + tailscale-socket: + interface: system-files + read: + - /var/run/tailscale/tailscaled.sock + - /run/tailscale/tailscaled.sock + write: + - /var/run/tailscale/tailscaled.sock + - /run/tailscale/tailscaled.sock + +slots: + trayscale-dbus: + interface: dbus + bus: session + name: dev.deedles.Trayscale + + indicator-dbus: + interface: dbus + bus: session + name: com.canonical.dbusmenu + +apps: + trayscale: + command: bin/trayscale + extensions: [gnome] + desktop: meta/gui/trayscale.desktop + plugs: + - network + - desktop + - desktop-legacy + - tailscale-socket + slots: + - trayscale-dbus + - indicator-dbus + +parts: + trayscale: + plugin: go + source: . + build-snaps: + - go/latest/stable + stage-packages: + - libproxy1v5 + + desktop-files: + plugin: dump + source: . + override-build: | + mkdir -p $CRAFT_PART_INSTALL/meta/gui + mkdir -p $CRAFT_PART_INSTALL/usr/share/applications + cp snap/trayscale.desktop $CRAFT_PART_INSTALL/meta/gui/trayscale.desktop + cp snap/trayscale.png $CRAFT_PART_INSTALL/meta/gui/trayscale.png diff --git a/snap/trayscale.desktop b/snap/trayscale.desktop new file mode 100644 index 00000000..352e6db6 --- /dev/null +++ b/snap/trayscale.desktop @@ -0,0 +1,16 @@ +[Desktop Entry] +Version=1.0 +Type=Application + +Name=Trayscale +GenericName=Tailscale Client +Comment=An unofficial GUI interface for the Tailscale daemon. +Categories=System;GNOME;GTK; +Keywords=tailscale;vpn; + +Icon=${SNAP}/meta/gui/trayscale.png +Exec=trayscale %F +Terminal=false + +SingleMainWindow=true +X-GNOME-UsesNotifications=true diff --git a/snap/trayscale.png b/snap/trayscale.png new file mode 100644 index 0000000000000000000000000000000000000000..82f529da90ec4029cad6f0bc7486733d74b5bbee GIT binary patch literal 18990 zcmeHvby!v1w)fhbMp9Z*K^YDY`Ik|a-Il-?04Hus;J(df zih_=YhK7NGj)_HxjdkrB7TI+ITtdnl)Kru=C@5&?*%@ePS?MS!7zLPEIk|Xwd8rwM z#00rT*?D-mFPXqFFfg#LVUc2ElXBmrxXJx5zb+afeDupXA;D-NI6e#sA9m3UQGo>WiPzfHGpwT)J zatFj@qSM_e{!FCyeUqNY)Hx6XlbD2*?8dFz42(?7ynOrufXo<0kI85Duo=+PW0&O0xf&V1fTF$^I1V?{bYoSV%Cicu4q=1ax#B&iESsKXNfE&?GO5A=uxl%U0{|-8H{;G45`S>wGo2wyyj4MjzY4h@{>`MLHmAP$>Pz2G6VV zy7RYjdIjOy^bT$bPKX}iSF}meM0xGAx7(Yn77VxI>t|U<&tg7(qx`8$V`r3exro$p~?ctZ+u?Z|S%xTWP31HD@{<+DU#0yo*lLvu0-P0YCPu!=3%q|{qXv&B zP}IJ@^-wz7-_)1myQw)s*#-Yo%rv!s*R3DLjh)Dh@6N`}5sXMxmrUQ^s!`}h`}V`& z?)+P{pO1Q8Uqju#w@Ikpx4W=lC?>0sh2Ya17;;VxceB#(Fni(ex@jv1H1+l_Ln4_& z2ZEe+32z~Gk-5~cS`=cg<+7wtja8H+PT2c=6i1z-7o`zrq4Gn^K!~DcI`RE$Y&|BT zpw}k7;d&5Li9&Iq&P?137{lui?dIIoW`~$iT9Hmhyd>3b;I^a}=A&{#ST@m@yRCA& ze0=6`skRk8)w{o%ah*QD#<0!`hmHtlC4#lT)Qcv4Sk12J+vt6$_ksB{;S>g;xiQ{| zh&&{`+lJJ=vg|*KD|g;|=vos_Pi2|nK~X>#oho+$)iS@M9Lc74#FyKgG^6n;oL6B>boo<^gxyn zmTB#R)|;H3RjK^qy_k1$0)n<$u+qD$KvCQGUVT0kAtDqH6-o`{5;n*1v@CafKU~MY)$EU z8+Uzryk7ZI4u1W1?r}KO0mUMCwAR+{OSf??G7oDS)x3U!!ggi-L|QY$#q4Q5;pMWB z`3tGfq`dJTH1+d>_6P%c4WDK&GQywpcirs7;@HWbf*?v1w%-a{xPZw0=U%Kd>~CB^ zIru|uM0*!d%j6Ng@Wxr~1+*mNwvF;9y8QFH+0I~|_%~*3tBCSlK*sq-XM|<2Ua$;c zDa<^BzIt?*E!#5_%44N!Eaqemod8@UV@Jr<4#F4q`(ps^>W*CbbJTPL^9 zVoj3YHcWlyy<>X;MN?5#re&9YtgqD+yl!Hqb!@({14oEyh3{aq%w~iZ6%vz=`E+7W zZV$@hAWq_i&RF_bHy*oP(^>zpPM3~>s-`f^9kWLW6C->ei9)F1(nD0n!MjcGMAIpf z3W;?=in3l6^MIutnI0aX4!O?eLC%pn=Ab*MJ+>}8!Nt_} zH0QdnadomvT@Cz|wy7o-9y$fhD=QU0s2q18bTGKg# zKG#$F{32h^5!Wm;`spm3VJswZ=6z(O_G7~>;>f{a-Mp$QK7yx~VCds6)xa_})gD@6 zv$uOj)oSQu*Vq`VLeIH~p(4=514*jN&7c{SuTeR;VQx&x`XWIUBNHVi{_8uZ47+^0 zD84FKefnJ#-?r!gGHXhpdjI+u&&E`fXM<}-C>Db_Et^+6cV3pL}Rz!&l(hjR*>bC*QV8w%Y1H6Prg8}TGC*R5e>flQV(jAZotMM-|Q zPbI6j?iaB|zA2)LwVTH$ob9HW_3=KzJTQ8y7rR6S4LZ;{zhtG-<6I_dll12=dinm+ zognEq)zkj)<;jkQY8}^UlU0Q|TRQ z)m*=TAUCwwdjnD25T){ zcma(yoX5!<(fr29OPn-vI3ze%TnKGgB?6|9l~7Mp^v|0`lJaULvA1^ax(>K@sdB8( zKW*$<$B{gJRzz9!QB-$2UxnDy?+N>=nMW64+N{&}u%ks~-+~zqtmS%=ABH{Z<<_qV zO77>X!+N$_VYCVt-!E6BAR0d~m;{F+Zl8 z{*^-c#V)~d2&+Dzoh9Q*RbgL@=7T%$VUmqVA9G$~;gT;o6nL^|e~k1{WUD1@&FA>m z@SbR!j!BETF%Sn`EPpNUXlEv|Nu)qPHADYf8aS* zg7S)$3*Pyv2V3+IUuCAR#Aa*Qt(~$pb}k8q<%|6iQ9A8GL`1QdB0TN*~SrPNHgm0$f zD$XQ38$WHexD40vP!XSL4JG=|I@j~05 zHA?ZIWn~xd#Aa%YC2n4iX%Cw(pbEbfnDy@7be4T~c$ouHv3kl#jNrSB$O)Y6M~+JEIqA9a?ND?I_m= z$qv4=S-oW(qe5r#n&GYDazh6~JU9y>1w~0+2J?B^0`xDRI-;qsND?Po_iqRies?0E zK%EN=?$T?5hoD$~1%CoAma=L0ks=UkNc_N_!>Cb%-v_e1V|rLCehL zS3wHnEd{#w1)3sp)DM!|3v^nBe|Uq!)xfU?^716tNo2NE?DC=oylONwW0dFxAlgul zcI>H7=}QO9r333XA4oi%C4#xrRc4@5YovvaKN1-6fme)(`*QTJf6cLA4#mFiaT9vx^6j+0+O?%rPfyo zM}CEJoW<_1T+Pm#2R+l0#Fx;p^BHb56?!nS!dk=)qn1-F8y(ECi2rzGd@5*csE3 zC1U=W!y_nglz?ts!qu-lQvuWsjn#T#x})pSkBb&PybXH4Y2(K+P`mEajZ@tCo`nz> z-XaNe!^K+Ou{jRLC8xuSlJBHl2t}*ni#0O!3~IU|AI>V?ny<&Yi1VOEm|D}Mt%&=F zI5eV2$DdZ943GWNh3D%hqly-+tvr>1W_Z~2Fm#YKRX5-A*A#97-|=xe!e=Od$sfl1 zo?iP$xk$uo;Wv-yuur?ZLu0d-jwu6mZ4zR}^xw%y4UMP2IZ1|!t!%JE;)oO4=mOCP z1$%LbBpWXcACi+};rG0!a^AjZs}vI_JRJ%`=kMBj?TSY_(FHUmd;V>zD6(qbh~yLt z1kLc}NE*E9LTITO7X~wa$3zk*GAsTjn|yC$DO=jhS&Hk~l6G!Bx3_m{p=kCF^h+vw z#Zq>dJ2UKSHQU)G*KKpFe@3RVl!H`y{{7r+;k87Q+EmVNVI20quP)ef;-!aDTQ~Z@ z)>D`D*{_>B;OXjTl(A%I@bfZf8O*&<#7b&Mu9$spTE|_F)mN^+hO1HeW4AMjt%z;X zSM8mqL|Y&?x+tE45NdtKq1#r5>=s*n#+&8RcAFw@dR9wSx|&2}3o<#F9a34y{FlOI zXiw?Cn5biJNklc^7qFJu7NIXCa{E8JznnPsV5mL#y{~;6auqYD0CvvjRzhF7!+QVT)n4>55j@30 z^s(*qJIPSge^UO!mD!AL@h3XeWMdum+@oZlK)!3^oXwmP@TCoPO0wg50z_To2!VRl ze$b|SW-%X8ec#-6P^~g<3aKA=xLGIFJLLCml+i@nUkPC#zd2=}49nQ%ynyE7TLH>v zpOZK=^&FG>Z!3ZDByy+?_yd6co3(ya{=H2g;L@f(wU0hDXuy?NGyy3hOZ2&b5zPZh zYNHG2%i5vW1tg7ouK3V@t43nl{Z#Y<$^?Zl`a+4r3Euz^hWcMX*D9wM&afnoZaIPE zYViUJ8Qa`B52ZeRSp_T|WLW>d&T99(@vqPV@>$&NmLlXLXJa&rB9n0o0H{~s^3 zixJ44DsB`Mu7hl(rBxNBrD+_U9V~6^EFj1;^+}AFLX#xLSEK$%vdlPZs?9g0-AW?D z1qYc4Gw-}7(sSdi_PY}sO8@oi14lN&!(tsbN2kGo&zgA15|XKuse}e^nlEmJ5OYyc z9L!GCwN8jgS`WN>gnAv3rz>|mp3vn;lj|@X3Ph(1_e)ATPNmP87OG#Lo?S6Wwere1 zals-Azm4Qe>lC;YD*H)FwA5xP_23!Z2U?P+JI#TWzPf~=~q=G^<*t26q#kpWZr#!Y@lr-^|$u_P00y9Zk$^EnI0#Ev#(p#b`Hb8)#{4%*AN6`II@8 z9i=U-Z4|tnE!4g5YnXZ4nhBZHN{C~MdI|#uk1bqHXgnX=*}DjPiqT&26$b6gZVpHBst~Qo`SJpqw?efl*IDef8c>GVk|3LjW*{_HJm9nz1jDwlm z<@6L~#Aq+a7dCe=voROGY6=MoaB^Gno3rr?3i7h?n)36p37YY8vRQKTaPpd%n+XY; zTl|HUqP>f&iM^S{B`d(3-3IV6=MezECfsZmX52z-yk?f>Y$ja%W^8;sJm!|X{5&Rt zLY9AFq2g=;%W&V5Tm_k zWAEnqcTx?T#}?|YCYRde65!(I;}Q_$=jRjR7vvNAJCT-!vkTaXmpreIQm^h@E{iY_ z1}N6#a-RYQSN%X1VQFUz6ITak4F?B1G1@;5VgJ0X49v;g#MMN`#MJ^Y{qtB><8Q~Z zY?r6Bzo&o6PT9fS#?tHmMtx~KG@^hWEV+V>3mD()s_VB!sarVx{`C8!oz0ag(a>BO zg|La)ZxLKf+%3$n<_UQHzGY@@VsB*u(BqHo`nP_Y|70uhnDO!on40i_-NYrp#%n3a z&t__7&d$N#>F=4PCnoV+|-Z07uyJU~P)b2dRfZb3FPEHnsPyg(*4PJzGe3I2Z+QIz8n7XP-Wq8$HW*?$xK1xJBue)j=<25`^u zC*J>|vrAiU;7@GlYndw2a?UH_5>{w3mn@2>wb zbz%NJW3;dbfu0A*2hm30J|LS!HN7h@1Gz)V(1n_|Z!PG-a8%HBfuL&ymlq65P9+7M zXs(LNvS^FQXauA;BqG0yLJ$q4C?loeIl7kS^IU77`a)u*Zqm}+l{CzWf>agxlQ9dw zJaR;K)+wP_0%|!Wms)^Xx1v&?QA%w8o7VId(un1{RG!!-_W*b;i%B6pl*K$L4zLn zKlEFX-D3Ilc!1DHDDljZ1Yf&}y$jnw zYJgWT=4{hK-Xc#LU3Wto8=wn%ch=$N41^I}A0eKjA%!f-vEYFG3w9SVg7tVDBQR|a zG1177_`Tfe!T`$GcHC^4yaxHeg($wQd%p#_S`o?hEe{z&Oi%d<6%6P5KM0=_WuVoI7X; zG{i-Gk`ZI6Sb#rD#qz#;lL7vtJJ`Zh`lox4wm5 z*?iKXX%`JHZl7<&?8g%Bkh@;f&JKhyX%SXsH`-IEw@Rt@JGdO(FeOwjm9 z)N{>>6m`ip*;QD~jxk%0Ckd4>;_Fix+EHPJVjcRVdoMfZ&%5#K`xx&@p(DeaXPp8+ zzpm)c=(1G29ouB)#dY>vhPK(1t4Kx+ja6HzPV_c%BkSmv{KM`s2U64#yM%xMSh%bY zH-E^To6OA2=*YW5wdSO#?dC5vnE4(#op8@=32u2lWGQAL#KgkFdeJqyQ(f1yke!tk z=qR`B#5hK6xzc{}$3jU=C>it6{PK;eqN1Kb zvaN@$D;pcsIMQ{rvF*J>LkmxL^m*+4{Uwr~d&s&LSSb7ZH>`C#L|QP%JMRjeBh@d+ z{)8&ueJJA6$nViy=$UseTxFq;Rg}lt$ya#Szk6^X!Y-MB{-)nX#q!*odr5)tz$0S& zVfQuss;|4z+k{Z5%z*%zH_}vx9Tz93WTvWPzCR#VWAadM(r;NVQ-8i{Wn`4`*mmRl z(^T?q|8=UMhzAC@HkJETI=JCgfted;+4iJ1U^c$LB&c&WI?6ePGJ5(aCpQ!Y*WXrI za+AGmf3x!B+q`oW8)c95kKJgN4o&EW(~|z89si2rD`97qMwkf1q9y_kX;%&pJMV@MiIk)4bA~5$MX+#lLVrb)C zT*O_1jf8|`KhjSRCUzIX0w`RHs3N~vm59p2?d$r8pj~gqlgXLxKul?iEGpErcu`A+ z49zm>TulpKlCbJ?WWct!7R5*cnAFo)VoVg3eSvybOvf*Z1+#UA^?G6+OjCW$&PeR5 zvDIu4zHv>zK>Nau-nVl)D^7;d*@5#GiSU|K9l0gWlW0QML>Z5oB@T;Q5FggOf(I`} z*SvFj*w=;bAMV#0r>0)>KZpt;h`C>^^Fs;x5Szf>YkYiH7o!o2;(XiD(NQ(UaqHoO z5`7KV>q75Rr5P5ek5&yn79*}0MulArS``Z4i0mGU^^59md3b$tY5q18JMk*Sl@L+P z$s;`dQFy=qtD>cIHHKu94iUt#54kq4_v%#6r*`5?N`u}4a`1OFR&xmoVL!k7d)l%P~+!3ku=N{X}lf}!({HM{BpQrBUJFJFjIMcaN)0C>Yl=-iBmR|5#Z zc1#v2M@e9ikClSssUxI-Y+NRnE&cvi*_IqFeotD{#sLAiUssP~Mur(urtkg?Iz_tv zEco4{wS$vqUrnPzi~JfU`$vP7n6za8lzK6{YPElK77Nf#fa9SfE6`t0$4UmkkeAot z1S?5^8P>61Lk%iim1WE!6|hfbFw2djjZui3A8q)6(unzaBK>B;$d`ghg?#qRG4c$+ zdO-L4#(}!7?$RR-s{stw*0c+*n~-=$w5RC$C{**LA?ACxMWVqkJ$gJW)auoe&W9O9 zP1BrPp5uJ@=wVG3wOa=QcNSWdv2YuR$}z2hxwneXmsy%}49&SGc8XJHsshlQ9w}*J z-dfji>W$%PNHN{HwWdl7@xN?0r{GGJq-m^jnk^Ib=Pa?$NQ)jH-R!sE`Jltv*WYjE z(}!n^@vbSV0Udz^%uFqp@W}W4Wh4VB)^(h)XL8x2AG;w^l)~Fpa z*4oRl12)U!TfurxWx^pBt zV&|?A6Fs>>O?rIySbn zzWz2pKSKT8{qK{LxRSE6DCOnlKZb_Xjf_;3l_U9e&E)R_BscQiLSaxzpKFVu+uhrX zX*Y-7=jLWsR3zjV)h8bxd*|ilDV0P6pOGr)6c`nSb3a2|*~*IH$&)995wh?A$j!~| zq1%AwkAZ;)Mn)UfChGW57j{lfCH7bp_hf?E${MJu6RP;wEO)N6J697hw_HrOSht^CHx)?kqOvSNSsdN zCW-m*6WqSn+wJM?<74CCV72qB%Wk|X#+=*h!BF)^{fX!9clqk`;}!5gs@4-$;)qmX zxA3!*gVIL>%;HCLu@Uuy{VEb&X9tri($Ycv4+6|lD!dW|pB(dwxUWtLG#qu^BI~Ti z+3uCbj6$QG^u02_x&v~93Jf27KZ?wv|T#e7X?0-M?AK$LqK;sz0V=)n7n`RsqR z>A&s1IxNK;Uo&TWKbiMg&fUbmA3tQk>MT5nMn^>Yo*ylgm6d%23h?&!wyWDe+?qY= z_NZ?%ixz7k(tbE?<63Gv#IC2OH(Y8Jy*8A=XG;tQngvQb&{(aht@S$F8yfj&f|Qn) zR$(X-qwvxAGd$gUnd!DlIxAdt8E#C9>VLkIVPkLaerkA)gnbT8;t-~7;1FDPt@c}l2!V2aVyo%8|$`Wv)03-9{=tHHhqc)?YnocO&+!gh(;j4VMk!wHsgvP zBCIl=491^49w`aovmNZ6m{{``Tus=~hxd+-Dha2#muG;@X5N*|S12gaSlT1rd9u;q z-|mLy_Kp>$krPW;M8s=vK>KL5wC7>11K__hROC@6b5L!2e(=+$hi`$J30~{I=G-Mz zGQvvEZ}&PU=WDsR-~Nczr|k|FS9f={?vR2GHORS|f}`P-d#uvI z{DOi=5+mR5u~y@KeP2EYp&3*U75Sg7Jg93ai=Y&7|LAw-?OdITF3GetsP9m0KOsD1 zITHhdugx#lI2@-MVe%XOV`H6QGY(feWH9u2_N0s1P1MBy{Ann^;R5b!6&ZFlHX=ZT zVOjd=a3x0DdUcSv91` zCnqB%7T17+cFQt)BrZO!IYi4q6nX>>KR=D^xC480-}tHQ<5Nqw(t7Wtz`wj`H!pLI!j(Af9bBn?@?)4K)7I9uzc4xshq7e8QyL#a zYg^bEwS&^h`IkleM?)qui|?=aNA$l_QD-HVg^)LpB^S^?j0^ef+l{25Fp|SIk9;5c z9nD)f1ji_t-$Pddi13Yy79xq7+;~@0qgU(RmBiCJxT2}0_2}r-_R*sbL+I`OG`$i< zlTJg(w3u}0p-ZIuTC(_)nu4JeL8q*Qo`#Bw!NHX$XDdcSh0)qZPuxaijV~T88B_ivv-Ujhfe0;p#jjlK*b-TKsZxmz8e9!mx_9_e=M$2q~ ziV6#(WN2>!vd_jZnAG1|6Vdi0@q}Rz+#dGs3J=Fj;4ms2C^h=zS-kdDrX`xX=gGmu zJ7sEyd#@Vj+GESx&ROA`xL@SbEZclG>V{&-X1hf;=s{G|-_uI%KfZ4(m;J!9D>PERK?^KOi?Q>^Sv^9rO+lFM8=)_M~?Kwv>u2lvt=?ekt*WUx@1^uHIr#=L`$Gj;*$}e>YdgDL zQB0i*JF+1o|2nhko$T+70QPsvrZBN`kV}0y4^^g(F+SR!A9rlR zj{0deUgadZ*@!gmKK3|WbXK?2vKWA7t1aqJaNGCdWb(lLK#T%s=WsUKNb*v81y;2E!vSEm!ARs#?*&?g9MG693E z<_&kf;tJaEJE#TE*&3mqzx4eYnWFGm(kf;YvCpIR2r25>a$^`SHCQ7)yRnL{eK-Nw z9ISd}PaXVE#ws$xsIh_j0caY1357AHH!COH$-BC`zNLvITJtXJN`Q3(*uqj&x1YRr zM4X?O_e#QF91x^u$PmIl3SAfU+NQsBeL0DSCAa(ySc$W9bDxD#c|RSquT_p9Fb%mA zP*K4TK+;nG`-|n}M^t`?CRCnNFklFIU-Lf#U??=G9WJvW0I(3sHuPz$h1_c{M&A0- zqpX^m(VdS*$c?bRC0zGjhNN={PbwtZOA}|7Qa9s>?#IvoNL1ea3_$bG1HmI zu>h>W9L!|Y|H7UW6@)>)r(3Nb3~Cb$YTXTbC;9mK`^Lw=O?XTyKYm;Q+$b%SEQ134 zFNK6(s#$B4)9IlTW(XXVBsw~jmRDAC3k%<7W(KeneNq#Vu2uzZesOhmZt;7ztA_{f z0x>8dXlQA1JI%;Edi3ZOug%MBv{$M089grBbBe%MF0HPL)t6w5 zAA^H^!^7|Q+5t#Pkv3J`f?g78;I(klLV+}JP+Po=J1^T$Ay8`k*E?S02NaJwHF1I@ z+1%0b#Y1*^@r-vM?qww|=6=PLvw3m`vMNwh`D~2WFd40uN1yjq=b2Rh5-)H7Gdn#J z?*M>b#t9&l6c!eSUh!Dr0JvSKSt&H@h-13yJab;0ReTAjEd$Ef=J((Q-P6?77yLpRumL&_V?ZQ z*C#sbpPb0WOZa!E3XKCmd+4)PelJZ}bA>(=>=8TuyZk9Rs*IT0PgGK?dub@mzV^62Z>vnP5)ai;2!|^EP9sD zMm)1u%l+|j)+qeh(U~9611RC7-1`iCQEa>UBB-SdU^!*BsB3EG$U40Mrtnrd#dA7@ zM9}5ew_6dZvdYR`jss?t%rrz1vLIe%BE+mP99r0U@Zf|+g=V|M# zO!fm6Tgj);Ft0ku)cTgnW)HTHe49dNE6^!K+@D_tZGC++hjqy*DPGID?;aKf+Fez_ z%(-oR2tCBJzB7Wvue9wxa${)Hq_bb8{e~>M*ROA6e*2{v)oR>hrqf?SP8a1RoXc;N zsNb#fC&bX9osy-e36ZkX!L407O;`kJ#z@6}{R{Dmii(=$Q%JwUZhCLXh#{q`hPb_Y z>6DHRr}B7_$btz1NOFGe_esZ#G*rsLp=kDioj783v^)a1n66l>PbN*M`>P|fRl{VV zQYtFZ`P~xRKS9~0!ht^=5)`#I6uMA=Ddng|{mceIhH?tO)AA1{mE+-&k)^{k>?WF| zdo{!lp6F^UG{4P5M+Dh^eaQaq>-A=)CO)j7iCT~7WyffO)#2hGkPC?1t_Zm!6@fP{ zY)ub;Ei}j?VUTe1KAEzS5jF5!sS8i;<*0qoD-XYSd-iFYE(4z%V6GM=TiB@t$@vie zSjti0PjP!AM(uyfRaaN1x4Q#!q3N~CN%y%UgH;SU29VY3$t2K1M)-M4w9tJFH4ta5 zjh5?)9juL2j{Q`bptyfoUJz6{+?cogo><;)pDhGX7(~K-c^P9Bk7t{o5ma1DyMMFN zgj7%V6)m*j#7~LVY7YZo@?-l*KZAITOzc@?d^Chr!zEZF3*9FzDTEsztVmKeJtjdh z{y2`@xb-zPekyw$<#lbX{#}@$`|7JT9|%-Z?smR>SdGz$_+6*TZ)h;;^xNOti$C+M z8Gak!On{&YE|F^`s|}WY{qB-YmD`6ow|+jc#EB$VS4x${(E$T{c<*#eqi0g%bmzwt zpY5&LR@)^~kT~w&cpGZAWD5Tt1=uv%V?{;D5n!P{uKO8`K~P2r)e-~`pN%WsgK!d4 zpt8sT^v3nx;Vya#Lpi91eqq=8r45S!>=4Uw*E}qKrw#;2EiG~Y|I1y@LEfrglxwC8 z&yPYh5#IA>Vu1-Rwba}u#d>7HtF?tuYt{1Wmt_Hk+1GF)U=U+g`f11$c^K1yPuyOC z8XWwE6Wxc);=r2)DkkXuH&PJ4RIc4T$l-MODJuVE4HO784>$ViWm2xnU^Y_-@*wkr zd#+5=S?WA;j~}z$O=KU)%21Iw;{|zY4jqrZAjP0uFI~)2{l`L}ymo|+P-8|~MS6LE zlI2F^BNJY&cBXg1>ro=>Q!V5UyJgX_x0PqkPc}SOy+n?%XVFqbvYy0fWP368zcP^08p}+3Lf_y=KC-cQ@ z%s6`ATmMw1yD(KHvPNozxWM|t!HGe^eqJ2y^=DN#ycly{fmo4^jqTejuBLdOZV=Oe zVgblYSC>CfT$R}iCwTDCs|;>@z FVptz}ks`o@MTd1td?;Z*!IRh-bMH1~7l)Nl zgLe5GR?`%4DpLd6MiwXgYf z5c&vvwGh7r5=?NOQvEQ>v{=wik}k6C_)9N$94KYd;B7uisCuuvy*dK^V~%pC!%Y)V zWa$Ra3VH7`f~*sHYP*vIBtXfwh1H=T5(lqW+!mN%4}!Xo%~8nwk<3J1vj!`1SZhD$ zbCZC|=CR|fo*Q?uqoOyEiJ5Y`qi(^_p=cxtG|@D}59V2P*e!qzjoOAcX9~+mjz7i1 z*w|R`xVU8f*jN12?_!hP2UL*~CTF7Mu(~OGV&KM+?{3RK_d!rYD{*QeTy)UeSw1+2 z7a0nAVCyP!0&~u2-6MpRdh*DUW}|K~k_nbGvCe$Xjt?_*+W|h-OdQPB#@~M~_H`$X zwTbgBr>o%N?P3g*=bK#8VSYGX6L>uy<=?_KS$kRBZ$5{42Uxi|`mrH5nqS-GW>1j0 zj*Q!uvVjvEvrSQq1}p@qG;0NO&k^+3kGVaH z(`p_0hI9uPy14e^Sr@v+7pEzsfC59xL#7aP2poVi?TJjaHgYxMjo~YiHkHj%v*h@_ zOWCnyfat7I&QmfemT2L3a)tfFY+4Iy_|@*hI2$7TP!6eie6I(qVVzu{d47%9IKAtP zJ0q5o|2-)mpa6B#;RNJr}ETp#ctSnaJ@8FEzg*=h5dDG<_v}kG~4_OS$WZ7F?f;# z;hv*WtZ}1IX-$zl6d#Egei7g+N$=UyiuI(kMD`tlp9Kp<7i^5VsqUiaSUsFM#ckE~ z;zGjh=%dv=3Bo{Gq(2QJ8&*uT}QYy(^zAE z1_#jhOrC~QUL#RR&eVGXPM}S#gE)+$C^hFr!+$A$DS}O!FH%U+abiRkwR{9$59qr5 zF2K`>$ZHEP%omAVM5HynFTk1hiJ~|@;u--Q<)H~?ql_`JBN8X2wd8%0C|OLbCm;Gz zDWH9r{5_c9tb4p6KIDON)07>9Rua^I34_|-(){4wmAm=5H#AG-G-r;~+C%lcOO=mGnRK1%TgQBuH$zKr>-uA-+|4