From 4d0d04669a80675536a22c98225e8390e6f8d7fa Mon Sep 17 00:00:00 2001 From: ToTu-Dev <75479355+ToTu-Dev@users.noreply.github.com> Date: Wed, 9 Feb 2022 09:21:20 +0530 Subject: [PATCH 1/2] feat: Done cors package --- .gitignore | 3 +- _example/main.go | 17 ++++++++++++ cors.go | 71 ++++++++++++++++++++++++++++++++++++++++++++---- go.mod | 5 +++- go.sum | 4 +++ 5 files changed, 93 insertions(+), 7 deletions(-) create mode 100644 _example/main.go diff --git a/.gitignore b/.gitignore index 612aa72..c5148da 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *idea .env -examples \ No newline at end of file +examples +.vscode \ No newline at end of file diff --git a/_example/main.go b/_example/main.go new file mode 100644 index 0000000..89eb6a9 --- /dev/null +++ b/_example/main.go @@ -0,0 +1,17 @@ +package main + +import ( + "github.com/gominima/cors" + "github.com/gominima/minima" +) + +func main() { + app := minima.New() + crs := cors.New() + app.Get("/", func(res *minima.Response, req *minima.Request) { + res.OK().Send("Hello World") + res.CloseConn() + }) + app.Use(crs.AllowAll()) + app.Listen(":3000") +} diff --git a/cors.go b/cors.go index 5ad3648..31d4f5b 100644 --- a/cors.go +++ b/cors.go @@ -1,8 +1,69 @@ package cors -import "github.com/gominima/minima" +import ( + "github.com/gominima/minima" + "github.com/rs/cors" + "net/http" +) -type cors struct { - res *minima.Response - req *minima.Request -} \ No newline at end of file +type Options = cors.Options + +/** +@info The CorsWrapper for minima's instancr +@property {*cors.Cors} [raw] The raw cors instance around which wrapper build +@property {bool} [optionPassthrough] The bool value of options +*/ +type corsWrapper struct { + *cors.Cors + optionPassthrough bool +} + +/** +@info Creates a corsWrapper instance +@return {corsWrapper} +*/ +func New() *corsWrapper { + return &corsWrapper{} +} + +/** +@info Builds the raw cors to minima handler +@return {minima.Handler} +*/ +func (c *corsWrapper) Build() minima.Handler { + return func(res *minima.Response, req *minima.Request) { + c.HandlerFunc(res.Raw(), req.Raw()) + if !c.optionPassthrough && req.Method() == http.MethodOptions && req.Header().Get("Access-Control-Request-Method") != "" { + res.OK() + res.CloseConn() + } + + } +} + +/** +@info Sets headers to allow all origins to make a request +@return {minima.Handler} +*/ +func (c *corsWrapper) AllowAll() minima.Handler { + crs := &corsWrapper{Cors: cors.AllowAll()} + return crs.Build() +} + +/** +@info Sets headers based on default cors setup +@return {minima.Handler} +*/ +func (c *corsWrapper) Default() minima.Handler { + crs := &corsWrapper{Cors: cors.Default()} + return crs.Build() +} + +/** +@info Sets headers based on the options given +@return {minima.Handler} +*/ +func (c *corsWrapper) NewCors(options Options) minima.Handler { + crs := &corsWrapper{Cors: cors.New(options), optionPassthrough: options.OptionsPassthrough} + return crs.Build() +} diff --git a/go.mod b/go.mod index 84a1e10..d56153e 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,7 @@ module github.com/gominima/cors go 1.17 -require github.com/gominima/minima v0.1.2-alpha // indirect +require ( + github.com/gominima/minima v0.1.2-alpha.0.20220207142511-7e3d93afcb00 // indirect + github.com/rs/cors v1.8.2 // indirect +) diff --git a/go.sum b/go.sum index 2487be6..7209748 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,6 @@ github.com/gominima/minima v0.1.2-alpha h1:bkF+6ov/RrSebS6UQlO2FZqwzUVLcqFbxoC2Rcii/K8= github.com/gominima/minima v0.1.2-alpha/go.mod h1:cK4qIs4pa3puqyRlWrHS5ThQpPUDFz4p+u5WuEEC7HQ= +github.com/gominima/minima v0.1.2-alpha.0.20220207142511-7e3d93afcb00 h1:3w3bNtI97sLyT5kx856NHVE2EYsRCL2eNTAbrnQ7Yd4= +github.com/gominima/minima v0.1.2-alpha.0.20220207142511-7e3d93afcb00/go.mod h1:P5UfLGNw2HbXoGrP0MOavT5mxfpMfZZHbhwCsTy257c= +github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= +github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= From 2a175aca57abc1b01c4106793b503ff3a79af0f5 Mon Sep 17 00:00:00 2001 From: ToTu-Dev <75479355+ToTu-Dev@users.noreply.github.com> Date: Wed, 9 Feb 2022 09:35:54 +0530 Subject: [PATCH 2/2] feat:readme done --- README.MD | 63 +++++++++++++++++++++++++++++++++++++++++++++++- assets/logo.png | Bin 0 -> 32140 bytes 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 assets/logo.png diff --git a/README.MD b/README.MD index d0d524d..f950615 100644 --- a/README.MD +++ b/README.MD @@ -1 +1,62 @@ -# Cors \ No newline at end of file +
+
+
+
+
?HAjd@{Ya z8kE^$v#r+B^(@T-5npV1-dL*PcmOJOjAS|vtM{7&L!=2X1W42e4tnOEmn zTi0f-7XfUm JFS?fWfAP=+@K$sx#ibgi+&yqi^`ZX&FuoUK{4K4KdlP8JYUCk4xTF!+;4`x{Q7 zoXHM#rJQSDR;RQEdjyN@eZ16SN;)2k1-qVW^B-Q{`aVa7+kdWaZFNc80~gkPtv{yP zGkUlY+A`~S+F&`KYnHL5uW$l~#;qx4w?ZVs?yHu7TXII68q1OF;)2|O-xo*IPmX*I zQS<^v@N6BtgId9o1ehI!>I;t7!^O_~C$YAR#pv4hKXsL}$5B2DS^O0enqZvc+c7w( z3l1|s!7%XyyfIN^uzdI=qkJ<6 de>_$~n0p3jYUb3?>#4~tO^Qz4CSNkLs z61Eh u**Zt8(LqK}k?>`mo610qDXLR0r zdFSVTA7!SD?kr2f9B;y{aU!5r5^W{>; Uo;XRdeOFV7CwA&o5xeds3Z} z9;b;6oD2-B>eBIqT&D;z&kKkUU&o}k4Wi+-)jEjTFK34}x2{qGJtSeOZSWYe1)G|# zf4i>w{J7pnbiM8vtBUk%mq+Ydve$_fi#53sU!*r@*Iu7wClQH1ul17SN6MNG_TaXS zprtbNauRn0Q(-PsWTMz}N3NB+RVM +hY@h{xG0%vP`XMYr>CpeMTxe$}u2orC!CCpVf z{$zYgkkjNOEnOXKE%x)irP|{M-8m3X35q49Z?WD0)ucf}r&%pI!bjCGFs_a}^NGpq z7MInIH~Lpampq&WKE&elsi7BvM~y(&AYuZpe6B8ODE!=86pr2(a*-0BmA-C+Bd#ZAb0H$%C9 z+-}Oq27Jg Fv+N^{&vsS|7T>w3QUga z{*;02zdMKz%ptoqwXN8}iw;|yPKA}NFDJ=&kNz+Gw*jI(Q>pkP%@r%(JiSD1@$X3R zS1G;&xJ>VkKU~N`%_Q9ZR=yZU5za%7WfqGTL(E+_w9|r8e1DRlAS_?fVvAL^uZ0CG zpWHhyL|U(u9lJySR?NZr`2lX`dXXf@RdtOqLf8s_RM6L?|JgSpcQ9FF7s~TTBrNw} z$9nI>NWs?8qp$|r@{t7QSU9UW47tTi4_)nH-HDk#o)uJoFNkS8J~kza@87K?buS zQHhjj3Q$AzckT^t9A_}smj_}pK5&c)_S{UudBs@^n=j~LJR6jy_(AojN5yjsU5T{& zKzfk a)$YG6Ndt? ?X%!}@Ju>-z&RV^! z22YDKOw?UhSYT?m6c^rJ;IM5Zv@)~Iws3vcn>N$wP3?3b33|Jz2^PEH?(YX}r0? zv!{V5pLhLI%cs|VfHm&vHLl8F)RdJ_x#8gkO4~jXqEByz_8?bvf{7nAzRt~JpRE$> zvJ$%o$A0Idrsn_HO(<(7NKu?={pad9XtwffwpKFOfyU;=v|B}>M=KmkZCQq;L}h)x zcJ$MrpzS$ScxS{)_UV)6t|mi29Iq0Bl3W1WR`ig=U4_#zMW>gy8WM|qNMGqBu%=j9 zpJSf;*9h^;Z?ALaiN>hIs+wgT<@1~yA*EE@{lCI(+S6HxDO}uqfh+CNzGWkToNo79CAwp%i`muS=7k&71Gk^KaDS+maOU5sdF4s zcu~81vE_it9b_@KFJ^^a&4z*()yO=#^^PxphGau#amiBx>er>m7XkKcN8Oq9hlXPE zZaMwtchU yj>QmI&@FWFNrde_@;CVifXP$23#b>b8cr#WWG~*#w zM#XH_C>319&}Q*%%#fdJ*SwWF+MO@hG;95kf_|{W-{n{J#&GAi>XOT)9kRGJ1IB;L z`Q=nQrKAC?`-hhfgyw`+<6oHumPTu%R;v_64u=qg>ZHA|NGtn6$AR6_P|yk1+qs&7 z?FWWXzr}DNyN@Cw{$?Zv3lZr;c7I{)U7R$v>mQX MpZQjURXK=t0 zQ#k`G(#t)~$)!0Y$8T}|3dm%z*eddm@S1L8-{>^E6SfBK{R)?_By5fLTR*rU2!YU; z9h!{JQ|``Z?O3N+F()jSvj?xw6TAQR`Z8NVTGFU>9~-Ap2G6}9!q=60>XWj03E*Ae z>1q%SPhh`IpK%=_oq2?kirFC^Vj;!mn8*7PB1NZmuP~Z#9c%E_-m qh!=E1DRL{G0gI+a_tvwRR#Iou`&U>+{8_rh3ya9g z3ol^5vW#Qst{fHl^*`1g6-DJ(tj_{sBfS0*p!xH@`0~6QZ`;;W=^W!s*XbBH-)7E& zCBpH+M+Ug49~zR-OoDGN3}3XHV+@1$-J 1-jLjlh4*DljsPlO{-g}f>@nq?Hu_{e;+dCdXf;sM zwvf(Ed9_j#8{dT#ZRgf>KXbCgOt~;pn>{nw=KJWc=+5^4*5cE;i91G>%4stv8<0PA z4(efC+T0$&ms|Knv(f>zRX~$b`NHjrz`m%t<|s_YSh71u?obro*?VOR%|_!d+6o~c zX*zzxenL40$^50)e8>`qFP>`~X5nCRLqr9u^Og;y6b;04ch>I tz-A;g_u0zn+5QkOVw@%mB| zIMZnTHk)}W)Am JZr+VH0!dj*^F)t z1>Z|PDGkb 8TIiT04mA};x}I7A)4wz@|2c|Z<{yG@d|8^Sh{o1pZ@M27jU z=tYq2-!;dCWqx7*#u?Q>^ak=5ZhxRcWCnvD7m$|?Y_eJ=#?|xlw@Ym)OstmMmS(kz zb7Z7Ljr;62!M*$afxS`tGHJ!DZ>wvqSBFVpJ2X(!#wnQ^YWd$556P}ZK&Q=l(IlZ7 z6sAjiR;| Z4ylBj@fsRX@ zWjQR_2^?}+w-FC`eO|i84K!QnHmE-_V^QVjl%BvOCTnuusVg&u)5%S|h^9r3StOz8 z7#j;Qc>d!Cn5>a%kH4P1hJ)y7_ZKa7;HBO`kg ODF pS zw$N&!J? zgqF|Jum%&@JtUM;llw&Q=LH;!ock$_$c)YT;=$EEAW}j_?kjxC-k`l5wBJjAk>75L z5-sZ!_DQKkL3^X?zSJ;A00X^4yicFOU6~h3#GK1MX_JCtkhV=#Pg ci8BgpIG`7m1X?VY3= z7+#*$%u7}pEKVKMROCa0mb!R}mV$0Q?8Gk!hN%!klEaaEF4=RAcJ$$ 2B+q3?_e z%iW$Lo(O>@-a=(k)nBH0_IHa3)ZWvn>{M2)g~{G#geQd!l>6kS6ZMlFAnz}l?cW^c zJ5)Bb_CO5pa!AC9gtyeHTFs42&Ej?P=FfZ!&tkCSYsYoH91#4A$l~i(3x4{JIl`Qs zl&@+ dPSAx142q`?<>;4%+_1K7Mlcg+32$LN>zG z4O6m=WW6OGau#Lz*?K|ESqXJ6%>j~BT+OYNs>Psip=mH%i+q9_<2aD}B9h5OW|VIx zpeK_B)Jn(jC3ZW1zvdU@BfgK$uWm_U_4rV>qn!StJLx9$h U= wUx++ zd@B9t7UHc~Pj5TRYE?{(U^vE)y+B)}A07rx L?F_t*z}2Y`nIJ_4#< M(!#^HAG4(vMIUJqk|r zSXF<&)QPI%$VBCCdpyE4Odu6kmTuzvfc;%sWmwznt7;|}xo08QhQn2wrkyDA$ jn7Z0KxO$PmzvVm z<)@a}U*=FBv+On$223u96l6@lJfe9=Qvk@zuXvKhY{x!Wwq@dQ;V<`m(Bj4u42U8f zNKe{MNXC#xO$F$WRz!wT Nr;+F3Rt~vUO_;fTP`i(W+vogy+-nhvy5Sd}m`~?c)f*_UM=%Vmv7t=ZFmJPXEoG zlnRmO7GSNH8MW81cVxVkpLX@*q=a+@t7k{#wT{Tcz{JA741QQ=hNkLwdms9Paq I~`TNAmKy|s1 zvW&l_&c>5~gl2c=>*v-JPa^YWBjX~RHUr{hD;k%*Fm4!b+)iFg5Z3Bg346cok#ikC z!__qpwsUI&UeX#dh8E}&;p; LiLGZ2 z3X-xob2rsbFA2B8&(Ef9UsGX+5+gf<$ht#cg4oFrd8O>F7wH)z*E9NnGfq #ob8`0p<8WluOW~2 zj*UhT&!fP>tsi$r{NJwCa<0uz2(Iv0zBDMMHPbE=N2YLQ!t(RR!#u&9#ekQtnj)w* z0c={(6Kh9@YvKS=P3b^ptWJ(2(#r(*Vi`Gw-^(Kqwtuk`EAJQ74jyXntsbq*QW^?H zs#I2wd7k_l`%6-m2>M)fK70vyAqSOB=LUUK6;akVDBYxy sgHB|h zYc7Q6iFypz7q}Yq4pQ>@wt`hgr0r5#`w9NMGxm3UVBuitY=TN}@C(3w9b;2+gck zUDhvs$db5PrvTg{SVuB?u$WXOL$`S4SAi%InUy`Y9bWTq`|47DW2ljvlUF#plq}sK z%+WC>yamJ@8_hnKl`OJSBK`>4 y=k=CV0_xDJu^hxYA38_PyOFLb`iWsOAiYN+iq&y0ue=n#vdc?cEBC)nOig z^`>DYn%-HEzOI3}wT?Nl {EvGZV+ZQEKN5{2UQfnLa&1?qQ)=V}$KPL=W^&+}r@BWh>9r;! zGvRVG;U>HP*t#@>`%q8Y`Ym%7A`ttyWM*IW fmclBX*8Nf7Z3)o0hoBY?NH0X#U{ew#v}! zrTK}}vMT Va2mfhVjoXu1LR0>q~}VT9_j>j$n8$BN_mW?>b|-SBd6V$S?M(w`&jcQ zWi?NdBtFEXKmUk0nd!cAowSpbdufp>V9frt9$2Hly16F-9{tv_#8 C1VNfY=Q$l~uu;xKbL9pl)MFdZL@vDz1KDg8J+{1G9!1`2QU0X<0SlLiyU zU*b=F^~u{K Z4u44 zhAQ;#8g~FD{5n8TI{{IR*1C`o t7EPE5>e>GO;U{rvrVu*AUH~UYKBJ znU*e9M*S)pm1it_i!;)eOgv6@y<1ulVH?sBasOtShvzp{YWB-A_x{i2w!0^xT&~&A z)&2N*en!6HQZc7$V4=%Jf`_a;1?WF{xg?=!&(_5`M}7%u5kvmGD09IvjKfESMqC!< zkQw)A8Fk3Er_!fY!~pNq;2@@LctD8C*qqJ;qa3)|`F_2q-r8&e(cGh=GPB~q0<*_M zP14HP_6(_;;$EiiCg8Sc;9jP^(0xT0aVQ?lOH=B}62ZP_L559M{M2spp_IWM9;m?Y zntayfRJHb2*Sl#HjqW=lEgbnN_m`2cQ&z%4R7MAu5_UAbHU&HT-GZ>Y_{#HDC7A8` z TtAH(pzj zeTI?J;9Ddmb)4Fr@|=q<-xFLN*AlQk+f-S}E1awav)$7h0c+QQ(?(h`XAgfCH1B%H z_=ICpFt_`dG?U=4q^%;q 3Bu#Kjs zyO~R0$<7JT#MzwZ@-}Ky$81#!1*8hAr-{_0YE@<{jo^wb6i%R?#GNdPBJ~%72Hw!{ z#zO)Q!zDTP_3)b=vpzVa#x!HyCu|?-KhoJ}q3dK(47qZ7GfyBfbLgWSj|Orw3E$gOZj3_a=JmNpx +FUqmA7BURY_!sD~WL$j0CjNmrsQS{rRdF;v=bLMP4o=NwM{ zrs#La4&GiMeglxoyGv`bUMNyApz)GnP9y6`h+Azoo;D^7Z6LKd^X#(xo56kw%c$zf zJSx3F&FX`Sp&K5PgG%MruouHH6(>*Nc;N?M^WmN)J8bWNnEO6OJbYP5Iv*I-0Rd?N zyqSDkkhHL*=(-nfKK|ENr{M__{1poHuS(UI4Og8#cYb -2b0y9l>zEA>1xg6f}*#!rsGbe3ntwi?qNIVrLQRnc@4Dqsym&4e!IZeqR zfagafhO4qg V5|x#RbinC<1!))~w56rWmG%+R0di$!qn-{dm3bce>AamV>1 z!s(k0(TuiXu3JGGf!LpK|438^sBu#ihmMneO&=fio1~3KIO&$z@)D=Wy_NjZFFJR` zIF|u&?P-P!iqX^O%UbLy#R&LMYNB{n7WtefS0C%PtaT}M>t=YQd_4|jw0JM t1Co_im_K>Y;>f5XMKPK0MB;V- $?TxDH_&HvlQL`)RrC-U)Cek<;^F;3ibz c2wIPmkvXS+hVlb+CI8q_Ng^OfE6eHZ)l#G?tFJID9;8 zPJ(gH9JLfK7j@-4oY0llihThZmp|OrJNU-iTA6B!lL1jY1dFZj84QAY+?;6c=(5v4 z%{OSt-|D7as~pR_bPhBpD`^smn(cLJ**)4Nu=xeg|E-F50xyUHsAt|7)=ks7saIS? ziK@T8q%~TBx>Gp(7E96~?o}?EQ9G>VFh{ig1Ij?eN*Xn`&6akVWckv)hoM1JnPT(| z KSJM3)l$dQ!qRLeB8s&VDqV zIe05wj>!pmHBN4Wb}wAyxSE+d^`{=3J(Uc_64raaeaM}w5HE)_JR_w+GACk)BJLrQ zR7wc0P68U`VHN1B%jmcI?zMk^DwrWUId{b*DL)wqDn;-uFyqYWR|l+xC5tIyREl!M zk#&-sXWE!kUF)Ot8CTn*Eev#F-ke?f_!svH@|0(oTNiS*CxWKgQ5NY>q3Pg4$#eVs zN9Qf2RTR))vUFJ{o(p|`_HKQW&FLR6T(xy;*-t>z@O%ASbnN5=ZaQh0G=c7k$Jv8_ zw-me_V`y7WeZ(U$2R7SuJx(odS4|)6c6@omcoaMa)mNggoSRHmgegjOcS!{-73r#? ze|7YGA{SB8>=Rq57jIk7Y(Tdy1;U%_tg>;HD45$Yxfg3U;M=llFb&9{cT-^f-r{9| zFbT%A6jF54%Q)eZkd~Qw?*#vMU!jP~LUrR}Z&o?;e%MXU`YiTd(O^>k>PI)DBOFae zBxXhGM|K32={oF%hY}?!AI!8b5ki_GV&lo8liEre*@>@Pe{`%lDMO{xb~tSgpOrU0 z_)S>D)ct-WNnQ(?bC02Y2PbPMlOfwR8)&&j-)hdo)oHx=hzH8O7^@3||Ia#M`kyvQ zKNP|uampKIwYLIuP7&6P3{NJWv!9nSJ>NW9;bk4-bRX-dH@nAIBo)2rNU=&x?XI6X z2(|V7b#=T=<&Tu9e%_!%&vBtIX8PB)>a&t@-)St57Lnw_jW(2OuqM1JEa$j&a5S~I z)^Eca%y; T z3}XyGN=_Ur7xWvjwHiL%r*+>RUyapLd2^v=i7-0+)p_+Ns>u}I(hX5Nc^Ty2deCy& zr)xf>{Uz_UkY#Dn`GzeqcIK@GbJ3q)IX=DgZKbE0%78jO88VmJjJJ^qxlSA~Nhf4_ z?wUq@oLef&Q=t1cBzPs2+8&YH&p16fzDH=Z*>d!7_p|4cj&s(J{IhH=&h2` zZ8vrT&YUbI3v`XdjhJx!avZ;V%#!pxsXJ@teC$lPTl4WI@V|?T-sXHlu)keG4Eb3I zK!C}Vf~gmhAru yLLb4*TBiNv1&-z*IZ-UL{Wu*>A zO?AguEaSC~c;9;C=?B?WyKtXt=+J4(H!%R+ySzdIZ;P#sSgDFFLKz_B-X|ygzA83w zBHGe!L5m0xG;~^;-th+EEuyidZhKR8r>HsHJI5j3aX2LbFZ_*-te4O><#xDGIY6x& zKaI6eza)?)?92l}k7%=Ky5uVfm7&%gmd6TO+y;5fV@TM7Qrxvu=MTp12HX>$|JUAI zHO0|z;o1R$ClEY1!JPoXEx5zr?(P=cg6rS|!6EqI?jGENJA)J48JusPZ`a QbB^mxnG2smLIq-jFZk#x; zWtRB+kId;9CMck4tQG7UGr;pM^rsZJj6we|;#39E+sLH&rDkgeCx7EXUzUb_!}M^X zzjIMu`b1Q4XpqYGqnbW_%awT7*x@L?wK*~L7;6U4rxPQ{@)g>my=2F=WREa`-Ej_^ zQn5U}lCI0JP`$!3f(f%*>E;|`59@a6oOAwcWKeY#PGshLRYJEjA}sdT>Y_W}OIC2H zWf$O9HVUd9##RSOUf(F7lKL_RTujLsE^zd#5bI#P{DXvEQmD%6{z@w*?0~5xN;1q? zFba?9$vGSQrOc?;p|H047OZO>DS&64y9I-lGLo{WoQiLzb61XwXh%FJTN9|b3Saw7 zt3uVT;0%^Iwuc2uvF1>;8LNsvxE&r{xv$M)@69%!u5a4!S66WR4XL(&3 @)dZcrtT$_Xp7mwb(ed+Rm3zFP zw8%4h+g5t%7m;GesZJ;V^bI=*7?wgDY5(;wNMujBH58MtZc8Q`pHvHwK*8f$2oj(= z_M!HE+RfZYxqs{@DyqaLRgxVoWl>6W`o4?(el)MaMC=0``N{iqt}j$_qY3Hkohlyz zqw|WE7+emX6&?+@i ~2P+q5$*Q5|t&yAW z=)=Gs(Wa~}YYYM<-FHz|b2> sX~FeVyQp)`RpB^$+TeT7zbU`uig@dccVJu zgodRjo`5? 3!eU5J%dH4;4)bud5fzcsv?sHqQJfk7U0ZbDZpFF7KirNW=_Ind`7YbEm~B? z8?D w$kW@NE>g%eQjSCESe3d-@1=A_8k2+q{vm#cycLAW%`}i8?x}Om_ zEG+tw&ZmYpfIbQ>bGvEEc?X^J#ngV2{v%A=Hos$#Cc#)ow|z@4Ro4YuI9nJE4=_)G z i~G5YqF&@xz+6kn93kTIHzENtM_iClL?JP`cNWO;{bt1|^rrc8hNG-0N!^yJcJl8+MIhRGsB&ye1AM(5Kfohl|B z9pNE5zgk=?8bBYOoSjee7c60nHFy4&aoi-00P`3g6h2tv{L~HjPC{d7OQsVC=E4vn z-hy6`KNsTp8!c9?i!Zb;wcL**`#HyyXD1!!)GLPhgnyKK+6*m+;rC?lH>?`x$q%Jv zKT!!#=evTe;# -SPR)M{M|M@UK8c~O+Hw!-dI;`X~^ZjDbU`1n4S6%^hjAH#XqK! z$8OQx4Sk42-I`8Y_goSF^s2LpTmcK~3_G%Mc>90*=H6ARP-^+%GaOo{ht|wKlwAHr zSCCkkD2d++HX1c5C6t%Vg)jd=71hKoUoK&zLX(HkIGrI2pUzgOMvR!mZ~(12DdR^P zBkRW|OQq#B%4@pV0o^4gF`y;51yGBpu?B1@zru)ZO9IwYfsE%RrH4(vLV;wAyZ7RJ zi-^o BK{fy3odiYHwaPj&tehGwXX3hT+ zK7#Ak^`<##Dm~<=ZoEgtka52^bw8?4e`alNAEKz}OyJ$FJUZpfKGN#K&X!|J97bUB z_l$rh)?#Ju*w`?7Q@HFXd}B}=HXDLv{#VAvvyE2!oHShaQ?u;81L#RQ=KM1t7B7A` z@wLr)n=x&0SEY+WY@zXYsd6mP8x-nWy(Ip*ZOX4cb`b$vTK8un_qw|P^JtaM<$?XS z4e*qG!0d##UK$_|68O#Hu(!MF8}{ofuyd+5d(tQ0SS0~uqS(V~Au`;LiKbiHWR6PS zWV#289*YL+Xj*2d!y#~~$=n9H8Y+Mhh^Qc?j9MS*`(5hX9&9lshXaQGMlQYpBm96f ztzWhvto|Gcshf$KSBW&@pv?E5!F43wJ9Aqm#}TjhQOFEeV)9O@9l+(b=G$w^qK^S? zJXFq7wmToYZ^bzX$!hR5YBA~O!MqM2ZGnYpcsbyW030D4HTI)HG4ongF@}smbnI6x z1_(Wlp4X!8gRN!nBM^y5x<&5Ck<)w@zg*4hX4D+pB&o{V2`06jp}$id__|=QEVK9o znHOs{QZ3nUPXrbiRZ_(Gy*U9-vzTvzd3-ROfHQYfAh(a_uvvW)@DDgl=hoaDdTgLP z8F>~0U7)e6&6t9!aSTSbprv;i#VTcnzq74g?%B*;SF~g m4nCvT}6$-4yhp?U{7yJY!j>jUK=e9F2MCd9%7o{E7S4tBSjN>XVPjPTImQ zM*Y-x+-b5i@}fjDwb>UR8^h08ZGu>5&0pVFWV)b4CS64gqN{?F2=!A6Ib9;rA_3b) z6=_dAd;+Bp{+oX!`A3!y*h;3BA}G|1u0>^2!S|(7jx7G0{G6m^SQ< Qq z3?g(nF7ifZELX_wYyoND;7aVNk@ohz6w)&Q=<-b6!XP}@N*up985Zs3HgUV2?{|{w zyuZS%B~4&Ax2w5t@csLkC}Omgbsf2O!*brv9VWSnacKjzw5+buv#`tXSQnP4a#o&n zyDgSByEuWU}}#x;tC?fp=Kz2|X!2IAv1L7-S--P~ kt?5wf7Nuo lxo!1QZCUQoY65%9Y1mrFI zJ~gnYZ@UgCE@MW|%M?+M3%zcLWHpbDGsy8PuN(4uoVA*o)W;J5y?ouaT-p3^7N56x z3Z5v<#;NH;%ReGLK;n1^V~4$hz!AB_!;8N5yVt+1V-?6N9b!_Zb35KZ!&|R|qWcAx z)}H#O`o!JMBEJjI$ sPE >Jl` zVA5G5kw)R5Wi!eQf!#Q$WeltM*b3$gOD@sqs^4$y#a-bMrY$)N2R^ZP+3LF-`_aDb zPNQrxqME8>EA>x(x0Xhy3;SHJgI8X4eM;mBYWtf*Ocs}2UVR!SuDK~ilp;kZ$e3Q; z(bi{|P1Q}F=`Z%Se_e;0j%+^Oy9O0;)5}Rl1S~+|FGX=%e`rYQvkkz$-vac&&nk6X zx@@<;l3ab*Pj5GwqmxW%S-8|AEq)chve|#Yz)(1JC5jN~9E&T|A3%Tqz(r21omwoE z=xz8AnaWFp c*$Vi$yAWL 29 )dBqr+Z}#eeY|WmTe1f;v-+TK~Q49b(@pXI538P AbQwz({(kRn+PK=Oy|NbSzKcz) p!o)sBpqF{iaB_qFzy~5r1~lrUetb5xWUj(K^*ae7PS_? zS*_&Wv(YnTC)FmtI3P?|ba})q+sdwy 5=8|R8cBKWilSyLY-W~hxZVZv7bShVX20`eu|)AwuB+QP)5feaGk^i z8&Lzf tN%#(M!)!KMc)aJIFKx~vjiq$Fuj+(G*|hGrV5lmU9^FX@cDK!# zGKK~#_o|jaI~YWqdUJI_4$5eD6sS+4;2Jnb4XkT!g*+x^G-^~>tvrs_Ev3qAHLEHH zrVD2yg$8O@XG^L$EETU;8l{!99BhMF(AReRl+N51FKJdqm`)5Jfr9Q>Ypd{%645EB zjuXN5>1c% jr}|^fOSz3bTcd&I$U!!_?JQNYdx{V% zxzla8IG20!g9)57nT>Y@@beX)z82H}n@l~5%9-Ku9#9$4?|!|{lS^wK=nRS<2gu6s zvr)zU!K0}nz~5SgapoV>@e9|!x>liUMB(a;NTvvKATkG;l9%jtjVwd=1(?w#g(tu7 zh?bRpE>+AsPeii`N)p4i!t^aXm&PRmG}JzOTMk~pSnOiNx)d+HnAs}9Y%HajKFx{S z(}II|ytB^2@5}?xz&HEz*GsiBHxT0*h ZJ&}F-d|U+32zU;W4ZH>E;dqKbm@oeYFLKgu;>zFFOAH5Dse~b9l2* w7(aUDyB$sa45?R4o*v`LV^|3mJ7R=zZ8minjBetq={ z5$)f-|DYaK{|_YDDVsvG^#x!1(D?1Y8#GRD&Mimkc3tp6ixbU4f|Y@zFck#{g5>~` z)PN0x#XYhGGBu}(VFOU4=+r{HxQ%_+5t)y#$4a45KH@X-P!+QH1YWAiYQoAT;l)b| zM%!qr!)y6rbw9+DFV4I$jxSFF8t{^{tNh8LY9#*RSw*=AnI{EhY!#FGEp)ARW`Q?w zG0%f()`w*3VO%3~odEO0A=uf`(>TU+#@lmbv5oGH5nicbjp-m>eOHv)15PgX;v>=x{|(z$kQ1M9xYXG8wBjtQ}ndCKc8303tR7B2YN_?{$V z*_?wrH5m>-1SEYb*PXn@X ta_dx7w~Ej>_V7~nQngYbK#h@d=%%K14dqA7F9$Gc zWF_h|$inP8PM|_Hbn3vyOhvKF_QL0Efg{F`X0q8Z9IR-dUL)%@Pi8P`d+%d={JBTt zf4oB0_Z^EsOrF9&z2uV6zHlQ(l!j@CeW!!CIYkwI #x(!-a^ZZ5tg+=;sPQFC=z1mqF`A5ZvqmZDo>qf>tQ(^T*u*uZLz2LqyO~r88 zi(2ZAc3UI%gZaw0)_zZhNhZT!t3Chq9p!syVyAPT2G-~y|9cQv36jRL6EwlvZNDk9 z^!(;i!hC(VnY;yRXQ?O~@nWyg;s{@{)m}C$_^x1jYgzmgpL$w&tK!*-V5mI+6m29@ z`| xo_Fdd0YGHk7LP{*~p1UU;O#%;w+v$dq?t+O$@}8k+^H@ A zakR;WVx5$`4hWNH`5yJtsp5Yu!^yorI+Z03^x`q2hL;roje<_t% Ip5kG?z)x?4jmrBmf{)h`nVB;LHvxz5=BlGq_+ TVFv$dChD1c~#hlFLf^mgk_8s&Mn$I^TND zFD%ISs`)m` ce4NFavrXs zHr Ujv9hV{DnM-J9$Ok<3)>l8c82R#*YqHvXFc6{{4_G#`MDYLbIn24*Mox4;# z-Dg5+y3M9g41<6td_+IKy#;?~k^B;f!aKX`v|L*6-I|p5)xLr`UMpIwV%MVD;utN0 zp3hH1l2IiGdVG1PCQO{Z&smu;?&Q=@=_}FzCBES}2i=qbS_%z>>h``bU+4nP#=fx3 z;fZE#dy&&b7^SoGy2r+<##798W+PEJUxH&xIGCoMnjCy0re5|N8#3gJSERyBJqkr* zUr+6P*)EY|@*H8FpiaDFVxInp>+>XySYH?BK-}Kgk_7f4r)W--58uJ%+o&b$Ai!A% zni5Spm1PkIyr>-}7~2TX1<(5}DEgb3%uz*wK$gK4+cA$(8_JDex%3r>%DAW$z&!kc zlqMVxkG3v6Le^q`gax^300xhJu)(T0;k)emKs?KEC>_QB?hMwa8{+C-C90v!Ve1;M zaogQSjrc+4nT2B1#siBjTMIO)%`g{sgZP2L<--r{(h{-LonPGcK+P-(qcs^FS WKeVxyLEtoGE1dxOZv=(gfqP z3E#>pcrF*{!T!_govPCc48`_SDDAq(Q~0~mKyc&k03^F;ksE({t2a0cwtt&5sg`yB zNNWCgZx&QW5Q9YDr|blL9NJg(XcM%7xdJsl3`T s1O1NT5i*lPdA@1plJ#CA3n9(Lm(Q|tl$L0!~rBY;Rxee^*v(Xjqe#I z6gNt&_~%cXdl;TcXZJ_`q5EJn8&6Flkh@r0o5OFJiI=1Cq5r8Z4)9g^3(bu6{ntrx zpF;W9pdnAbV>Uldvn!EqUjFjV*Vd=44S8wJOdJ$L=5R`s8Sg}uyA^g*L;FSk=3iQf z^2K)SaW#>Fg3Py^+It!=;niW|4-S*tpbyecZ4=KpXr?3*T(USh)AO({u}3(b-n );K0;r=C+yKxF=wwQ)F zU43^k#5S5oru|?8^ZNV>Ib QfZ@b z;P-Xi+|J2>U6EtE50^cE8AE1XO`F^8r3R6WI+I?DXM`Ub4XzNCqju5Tu)V(+!K7Od z`fOyC-T*h_M`GzhA@Lv0bJNMHt**@>10&ICDVF5sG}k-4UL~rM+Ofz33XRG-jm5+>2O25O65Xsroai90Z_Otusr=8|ic&moAKPlFu zVKJ)UZTgV!wGD;^R1uh}yDWa*0iWdxubK`z9GCoxdr8gI3=QO4h}6|N(B}?i>CI zx8iMy>t!h#m%R|uA&a8Fs#C@*5bJjnh*hGXdk62wGt{>Ln&({=bSr)f@ACP&RgrfI zXE^r#-rJMUx7~uA!5x2-s9~IB0b5iB|0PJgl>YQ1uSHC&Ch4Bwy~na$>EdLEzNHW^ zt){u?9k=Dn-9CBBq{UB6&gUidsiGe_#tk@oWr?zdB*8HuRVa3#>M58XS#QHmV^^)( zy{hA1{8Jy7m(LA?99VHbOpxb_M947O3-wID#Nu<$ftCx|#oErcxwrV&IvIML>Cs{49OH`MRVP(H3dOvL`0zgUo)bXd^n0K2yX z=;|LopKLnRv59kC@1BHE&&b*i^~89=yfC_tQDzjp4bV`Is{4DRF~5yRO E59`RG1YAQwTq%u9(7Uqj+;QMEs?@C!u};;z?m+< z+*Ir@0ypGfVFY|f75?Hhk1Bx(X$3Lwh56y{wao+msZ(6Bd-Y84rfZm;WPH0-R%lI> zSs(MvEq3y!MFtziD0VI`{?%OP8)p~|{t?*P&Q_LI@OhdNlaywSc6iT2sljK{Sb>Z; z+O*xez%2kuJJCk!faEF2FA{xEzrA;DQ~+0w*11OC{nfhbx=>VTc5MXeUFL4{*+?5- z=R`naeXb6b&DwqgVw8E%{`l?6`bCYm<+am%$Ru6g*&v`C8o5E2T7@tB(68$w_c4nR z2#mh^1SVY7B7gp={zNx#>!7NxCiv^hGCu5alP-KB>MZQvlc2nKnh+EQR*1yu;;#M% zp!PpxwrO`&Z>UeY()S~b%o2#9wzitkT{EW#{AO`gbc|y(PnhKXTih(^J|a)U5v}m) zWh0ho%~xTL9t#kZcEhQwr1m@!_0*5_HuB^|{Fxm!lSfjL(=~3fhEo+R8(=KE5!y#M zBWD((R0^PZ5S_dC*&Y07lLe>GjuB@-wAdjkJ*KKIfRiawHW4&K^CdXYCSE0Rr+yXc zO>^}Cv(e=-axQ%;!i0tToerd_sKqi;swm!?aDv L2ruCB`{F*O8y$4S$9N^FzN*keyZL7}R}vCqSH(}S?XfNvN6-~_`qOVL!|!41 ziOGSY=USYxNz}ukYXv5$?s#aN4|9AqR^FmiYbIb7@>bhg$$pGb##C=36aD+Z7$l}6 zC~c&Jzxcc_P@(GR(z~rq0osCfh``u}Q~+t03xyiicOD*Zk=C}$@w{?FV|GFI-NsGT z)8ieE_g3ss3Is9LuS2(7_;Des#wH}MH&(UlE;rXkpgd%w7(aM9EdY7Tu#EBfgX*6c z<%y`%plF`6N78W!J%doD+MT6mW;dW8@iikCRDqq*$41Hfo-L+|^eG}Ri$(8&znC LZ%TO-zydAuRF>%)R>>Prpar7mkU}0R!fEh9h({RS8LPv_WY9+#p7S63x z>$a`N=6w~+hgFH2V18oT6J-}5EMGuEaJ{}ZQTK`UL-iO3>KqvqI;9*yvMyjHfa?+! z5q7xz-5(Udb|z$Ry2^cKJ92$cp-L#e&f4^AtFOm~JwEP@uS#d9YJb2h&M1b1Kvaiz zjY5ga=~SS)Dz;q2MI+zG;VFEI;{c3-B 95yJ|%p)~)m^VYg) $4`f &o- zuU9cL1teysU~=|+q@}Mf2cxrXCGMJDu~%G;M 1{p73aud>)jzeEZfYKJ?F$Xq6$VSdflc4i*`TeKC9c{bcf_=M i#h4OkWnV=q4j4>H$$%7Y2SuL)hN>gmTSpaNnPL%>O#;ZuO%Y}nwsHqIt_PjM zY~B4i{IF-d_l}n$ ih>Kg<`-i0?)No^E1z@Od 1o?#x#(d$3;7pP#6?u!Ren9d zG+POp7*{l7 IhlFk?ym!Dz?%{mPYYhSIo7y%U0_7eGl254EPah_bC z{saR4QX029ZTb8(oA#U^PF%M-;P)MZb&a~k9y?8S2YcnMVJt0GZrSwOiPmysk@s&A zl9V=QSeR$vGl0xvCmLsgun9%HlxUU|0Hzu zVqrO$P)%p9;Ji|=zJ6XaOkKdSC__>
Q@yudINT{Jw7xpNW;Xj5qJk@ zM-x}YeZUib0I2*g8>hom9`#`XfJj4wHUzY>QJA?G5%*F#Yuohojg|`GXqD&j=Aj`T z^KHjAHX!=U$wh&RTO1Gy!44RH-4}rQS&u4n7~~Vi_$Rg6kzj%{p%?G*Y|2mKQXWpQ zl%d;v4m 4UE~ z;<)0PK5HdnQpD}AE1ownA93+-duOpS#OeI3Td=v~EF&MvMe868ZDj4-p<0M{e&&Ol znx{_pg-SUwr3{J(@?|>d9scWb%dS7Z%&yWM#&JO7BG@tnbj6uCg|!V%3@f&i$z2ew z#fVNZ RBWzM)tOUR`9lsua5N`!T};`lR73vee6zo2tv`@fE}p#e`Y|nh zZ?(?-^|=$7Rze8p=olyZ@=ZHonfN@-JLm?Z$PGPh>i^f;_)!x=XT7m-!amNEwNyD) z&J4FOv_*b_2&3aNpv#HwHhaJj-{JqZv!K~cywG{H+xCFJkkN}Rf52f2b#09Gt*w6s z@4P#1h_vnmf57e4t@lb4n-o6o8ui=WwA3;?kz!fqp?Cc1DU0i5Ju}~Nu@JO%j?!Ik zJV6Y02`$=zY3I1x1Kd1>uj0!eqJ*k+OCL4gD?L#nH?*ABop&;8@6U{?^N>^lrs(5} z7hoD$U9>m4`2Zsw<5t-6gc6a!8tBG#`!&AAgl12_!np6@%FdKpY2ho$45@?E-+s(e z8WHluA;Z}zuN?%$Le>iNWEIK=gbLR*Lsd#iGD;s$$jlH&y?FP<;RPE;23sEB$fLsJ z$7;u)X*;NobY{%&XP1SdM)PVqbTogY-;weC9POlVVRng{R<-!@C9usS^)9uY=a4Z{ zDB1IvH% jW!!9tYa!$44(r?S-CVRz(-)XC)0Fi~H?od?k{!hK5kWZKi4ujC z_w36XEA?Sk`|hLD>5KD3+s;OHa(X}+rR7~CHZ+ *s;-SfD#f?`+(=Ll$Q(pX!J874B2rz1fww_K`!j z0B9iL&eyo&4CJN1xjrYIrEn-WFOua7i@yVdG{fEC-B*N)Q(|<&E-&If?diH~vHt46 z1-qh#KZ>D_eIG?sHW4uVEhYbps#r!F-hAS^;$yF2$yg#@_|+`Cseu?@Sl_=-YykS- zUpg_Aq*LMWBY(HtX Y#I@D}X zn_f^8i#hy |nuNgE9opJ4Y2L+IzDTqi+m`a~dY9((+ zN{>8c%eqs^)$Qy1@^A=>F~_1=@KaI97vYn!%&)P1p;Jb3Pw$8;>gr+#WY1XqD|34c zEO2ABW$Rw9<)2`drAf9P2IT*iCj6gcmkxd@Qlj#O(yhnI$V%7+)}W#_zdoo-51S2r z;l