From 6da322539bbf40ddae6a43c80aa788ce3d7cb9ad Mon Sep 17 00:00:00 2001 From: tcsenpai Date: Sun, 17 Mar 2024 01:00:35 +0100 Subject: [PATCH 1/2] https relay --- documentation/schemas/dahr.drawio | 105 ++++++++++++++++++ documentation/schemas/dahr.drawio.png | Bin 0 -> 78318 bytes package.json | 2 + src/features/web2/routines/httpsRelayer.ts | 30 +++++ .../routines/operations/httpsPlainRelay.ts | 28 +++++ .../web2/routines/types/proxyManager.ts | 105 ++++++++++++++++++ yarn.lock | 28 ++++- 7 files changed, 297 insertions(+), 1 deletion(-) create mode 100644 documentation/schemas/dahr.drawio create mode 100644 documentation/schemas/dahr.drawio.png create mode 100644 src/features/web2/routines/httpsRelayer.ts create mode 100644 src/features/web2/routines/operations/httpsPlainRelay.ts create mode 100644 src/features/web2/routines/types/proxyManager.ts diff --git a/documentation/schemas/dahr.drawio b/documentation/schemas/dahr.drawio new file mode 100644 index 000000000..ae36968a6 --- /dev/null +++ b/documentation/schemas/dahr.drawio @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/schemas/dahr.drawio.png b/documentation/schemas/dahr.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..ae640d633ce11db63c3fc585860088c898c89081 GIT binary patch literal 78318 zcmeFY1zeR|x<3wx3KkLqDxn|&D#yQTZT zHesD}XXehGxifQre?RB2_g?R+_gPOr-}O*NO8D}H8y64|5H5>~2*@EIAeDpv2~f^~ z7R~5O(clBoPEME);Y|zP3<3gcCR9)bYUyNTYGH^#!oYw0jf9@o1Y!pzVGtmprx&y^ z)Q8$atiV^$ZV53kH8M3cIDSS?OV3C}%RoiPtU$*~!obTw2meD$&B98jcHCdr*wE@^ zB1wpgsfC3u3B3>#H7%HmOoa|~=L6p)Os(vlz^4-{vo1p{*Y$2AQ zmk=EtBQ-5G6AJ?qH9adEc=F?|gy@;5*{E4To4l@(uC3`$>%m{x5UOi@{IV_z=H@cm zc1jHVQp`?*`nG1whJwd0>0oGUX9_5EM6d6w!$(7%tqqTx4GbMj^}$x?Nf-o4XnDai z_d_Q3y2hqfx>Vo|;B%Os5L+DLVkRmeDy=HRs^CoLEXHeM zr1JZGr?Xl*3ES#gn@BTZrSY-Had>CvSJMsx@Gk zUk1S&=lTB8H~MCZ{XYF@w{FZ`@M%wDZZE*qP`WKpc<9 zA2t1aF2{5{rKT+e0_OYa*nWO|+R4(1-_Qb1>{B|PtONMzzd!anHEh3&&;MjPDHU|-98G>A-G8m;AC$nKa?c5u{Umvcc7{Nj z;CkvO(E%Fj$a>gYTJY*afmAZ^0ZRil1=>(TSI^Kw24ZJ=By$V`dJrfSV);`CUJFxW zxIu!#W$0&Nf!ISWOsx$0zw2kX&>b%gpWN`&QXDr~>;6zcN4x&Z1o&~x-)Z}uk>JnZ zFL=sG3@5)Gf2i@(CX=5uIP*!jQ|A6zNZ?ccb>(_=)$LJj4ub&t%vBXEL$RevY4`_I*Mr#AA08(2=5;U`VUcGC2-rlUJGwf{b< z?!>G9=>!A>C8gmW;cp(Gyny&0&gIm6>Fe48AOGLsV3<$E^5kGnZOcywLkE{cxOV>K zWKNIk-{)jbqMDyhM%d8G&{h{X;$ZV|<0HT;A_xC!WdQ!#86JJ;>FUEhe5eULay9^= zt*OP4pZJU0@xNe+>A3Ou)c$%9@b6-e{-EQ3XHMX0Q?oH1zt$<=9mg*x#sSWy|2_NiCzgeQ zfu5S}M9fd5f{uZWn(gO*zir~!?*AQ|IB}%EyM}-HDE{)P-u?@L`WI)DfbiQwK`!AaH>hu+Yi9=nI0n9> zW+9Nk2KEN-X99zI+Q|xH1rj>&mXqf{LhAoud&G32Eq`$8Kid}3|K>OU!6E*;rQtZd zV&MN@&6J(G^Zz{?eY({@_y?!c{eB+*z3KnMLO@`zeowZXZK-xa`#G{^Q;3-<|uTRexB0+TVBZcWb(TwT}%dz`qOZal=n}ZDWwJu|Dbc$3)CY z@!r_1S1pcmJydw{tYL zw9q|rQjWy@q>=`AQ+`dJ{g;RGGx7g4DSmwJe>tN2VcNcjfb_I~jpYA^6#rx4^uL?$ zH?=$}bMxuiSsxe4jZB^370{mxHP**fJW#7-;v-=a01tIfYC8HLqJ!r>_>3S{(37*I z10_SglW7G^EscR!U}35U{_47bz!RuEAqWU^ZNVq6jHtGZEyT&0+RgzW8~(Q1&!3+8 zG3)&uXAX}v0jn{e5b{I{Pjl!$aRl=TbN?)Z3@2^>J|cLkJ$}k791GGqNijZvfl>Tu=R>>)@L2A5kdyQ?WQ^hrdHC z{@O8|hDZNKr|@US=h)qb>!x4G&un84N6{Q9Eh@VsU=bVzMMrB5)Bzk+a`OBXR3bw! z10M53EG_M=K*{?UTyi`&&|=5aAHz@nAZ$Ml`X5yh`o|vhiT?XF?Rpw-|HK8XCkpas z_4jYc1b?hWoW@-LVgx3?{9AIY+u{z4%|6k^U|6H~3H$;N}US83OTK+D0{|CIJlWN0Hk|?Qb z1!51NLjOh1(Ggetzu_GH5x?>evx|aG){x`UCEV*Zg%?%+y_DeJd(8jGT%$jx3QiB| zf9x6^3o<;9&1(;!?f;k0|GP&1k8_1i?jwdR)9(q|6QGGB#P$d`tOv)5=-V2C7}p9U?r0%a zR0f8Y$MvjJ+^{vMLqoxBCVOKb>a^CUN*^Fsbm8HV{t++f!7(fLc1P8(qe+i(E&4~X z6L>_XXL!5<{8rTwNbDF;NqchR!x?IF{M_E|`11tqM+@M6@GDkFa2WmX5jlLd)BV{R z+Sr3TAaHebym1p6Sv4INL4AH(s(~d-BeBe_I*jsi%sYF z`o$)y3I@CbyU9VjtU%ViA=l+9J@-{B%+m!&YVUexaRHud%U^q!P_4+OJkE;m>AtT7LxpU$F#bm4AgVh`t~ zrs^Kf`O2izx2#0Q5(E9Wai9BUZ})l$SAX9R*&~D?tyOxmi`uL2&WHM;rlNMHs^W8Z zzwv!H(NLYU74f#9z&|g~{yE9o;uj81mo*gSY>he^V-H>lDBhJi!cXrwokjsEBe}so zCyj}*%O{O731qSFwk0Ip8!UFHesA1rz089p6~`L<;ln+rt>N1udxl-!0v-p_t7942 zfk|=`7gCigs4Xllb6_)KnOb?w8G0km42YyUDR7d!)>YYxdadcCp!%36?ema+XC%7Q z&Kfy3&4s!Z{k!jOovlfkS4gHWExrGQ1)?Rfv07I&1?KK$@)ka1;Gn5*fX#Q7(?DEccM0*JX76ALoHhdB3 zn{C(^B%E;ziDOehZ!q#<%%~1>v|K|Caz&0wf1xkB+7#&#pAn+Goz5%e@bt}|=zAob ziGY;LCV1%S*7n9;_-xZh&ew0P#wdJ{TPG!{n>si-DM)ozzg6^`+Lz5m7!Rdg+$40bm-HJAi4hO_}LTu*;vDa}X4r#e6Af z$>3#V8|95|DKc~A%(?Y3K`SAHCP@a*OcD6@)nmc-2SSA*3CLFngM?O7vaAokx?PO* z+(s*Tz>jD#P=v~q-pPDe^$i8Q#9I__epJ;GX;+?tw-|VAtmBF7emF)c7LobDap|k- z@HCZveRp^F)1Emd+UI_E72Sqqj*^0{{ zM=}iIfZZFM1G|60+s@gqGh$BQFf408heTOFPRDBZ+@E2y8aYe?Z1`PfW3{sC#(19! z3L>__H{3wB#+nzdx=3OqKs`7=Hyp{}jQ;kB@&Up{dgn(UVkSnK%4iWuFaR$IWZ1GX z7^;OE8*U)0JpQClG)akOyy%Nc77QddS#@m;#yXmzG4QRaDe`D=&FNrtF!+vnO3cNJ z+J*xW#>PO5z;N8t;SVd{g^!?I)byI>rxT09Zk^ypqJ(WL=^&Bbs`Qc|m~K)fXc@eS zDT9HyaZ~IasW2?uQZg>K_Nq=DMQB>&d(N059MYF}kmgy!3?#A38}dn8Tl7%g>W9}U z{5BFSul~%~m=3u&r$L|M`|=38mq}Eg`DVY%`t<%iF4DZp1l_e$iU~Z}_j{W8sambkSI=Kr_&EQ<4!xL`Q;~TSD~(b^!1h1RQ9FZx$Jg4x&< zz0Ca`a5=42qM9)y7C2avqB_vjrs7JR&PiP}(;58GPNtrJ>D^R)NGsPpuelzpfYs`n z=ZWv+1!IQ<@i|{jN=_L!KF7zQ(fAPAj=4O(g4vm&jdS0{Wn_PMb8GyWwDrN>SqVIr z>#gzJ%Ax!nMx*@q?%g3F(RJaudZq5}bd0*tQY~Y`^%3MyE6p6M=5txw<_`Lz?lmY* zSVMP|?PW?II(touJiyQ3RLZ&2@|8=AOr;Hx$-IlF<0I80QrLULMnC=6qp~>`ib>aR z7gaXKa)2302oMYOovjn{j^6-`2H^jCcbpXjf_DK>g8A4MfoNMMR+XSLlF z@q&o4UurFUBo`uD*Zk&?m6=KFGKf+t>f(K!mjNB$5urIczxqpwuLs!&nmQXdhm57|Xt_d>x66b?ZQ6>U}}YPTtKN zmkBkKz+hm8bgEzFOm}yw2i!e*3=h-Y0px7>@iU1>vFHjiumOrgS3L zjrjl+Z9n`0hm=pgQZj-t2JtPq=*u@*c;>pPaoL@a6UWf1i*y+V%iV;hXyT}4-RC=X zS8h2h#k;=rf0W*pj^GsPaZu!+lSCRI!dT|^(*4z9P~J@?B5O0+5JGP99W5+o!h6b@ zLeQ`ovvG%Y>zW6=ZnaLCnVIP2P7j|Wss5Ci34^#-dpaAb*x}fv&4upMz4nSdI!dv--l$Yj~~$jpeXB zZ51Zj&t^9%pizCBRWUV$LNS)sX&M1)(sLa$RL(C`&v*xq&F@3wLzS!SIL)z|a@WK= z7mI^4XpK6ZG)k9+)7$xXY`bH0J_yw5*6c{Cu{=l*e$^w2632#5-8}HBkoVP2du^6g z89QHLNr`h+cQNPKXPk^a<*8?m(+Q|w3~*F5mk{-#(2>%)EzDOyxAq8LXRg_F7Z@9 zWbGZ8!u(PO+m;hYi06!c@N_8bi8P&35`83rN;%{g$?8F@(Yw4JI^+%F zPdbv(8)YjK5F8dBehAH*O|l-TM!6gx`s}XMZR!o$jfK9@o^0)lBLff~!rrNZx@q(= z>%Cr7x@NtQ+B>a1B(O5K;;L?D8m}|_AIO21lc)h~n(Z}@`*;J`tx-xG7s4&ZHnKR(c+;f0iwlcfq3G??K$CtbP1WxA z4f0U~4#7xwyC#gwc8yk}JSG6PJ%5MIhf0g+lf2kg9J})c=WpXxk6x;>L)i3F*kz>F z<2^Jm+_>F#F6GeW=xx#|1|m&tD5XvML@{L~sRpG)GSczfBg$%6QOsL$Zf~{OXi^2v z)m;JlFZV1p2Zpn65(@5Coslhs&Ahu>zVCt-mOInOP!V_@%>~8Usvno6{GMl;e9A>a zli4w#wuol4*|jR9s>{oESL7LtvCC7KL(q4PN6ZBZ2N^Nj1RwZjb8h;PSf>PxCltCB zI;Hxt3j~{KiN+0)bz|3VYjT# z?c7vRdlMnpOc&F7Hbyy?EVb%8v#mk+LhHXg51QS(cP2MdIMV zC?{u=>G#Ky4y?W#3MZ>t#^p4Q!N_W5v-TLXOGUO*)r}t7>HZ3@wJg_`S3Wl+OL67* z+j|JamzNFqrzAPuY%BA>i-(6N_bM-y==S#P%-mlcva!=SG zq^&)*Cc@s>*ciPOvK2Lm_wEWHQD$Kg1L?Bo0}>Q^lHLXk)@Qw$vPm~~HV9IMq_$tg zvKQ1fTr*#u9wA0=PcBsylQog4yFSqnAzPspSE7R*f+tlOXqX|O^}2IADr1w$H=9C{ zCw!Ln8PPjgx3NFWz~65r-VPVntr&4NR3%mB7!v?0f*$xvnP~0#BBSo`|y5 zlykWWzDZTM*^@m~8RLB0WO7h$iY?t;ZcNCzEo&g(%dsG?-Z)GU%3SsEHETkZO>8VcID#C6JD%nt_-&g{Gt zzl+A{{7nHi*impk&|@MX!CUARJG0o?1Pwc}v6uA+VF=uXjF8|68tsP#SkcTD=$j;h zFww2KVj42E!q?eo7M81(d6IXZm0*kYy{xYYzcvM^h)ar#a8VnRXNvm85e-#7VX(@7 z2-6C!tHW0!e(kH{ueYgNKa4&-F>ppy6!MtC_=*7jBkUk+Mw|lKPP6^VuIVrD<5g;< zO;J9z_T(m~EGM@r1{F_-vzBedbG8#s+zacuzOp~R+DZ#z5zfLxgq}B=b+H4EZH1!5 zP`f2h;ZTByZ*s--RaGCRl2aKa*3&*D)wGluXV-HkBm2hTGG3^#D;li+Iz*GsWEnx0 z#9OP`xG_%hmCD}!rsSu9r6|R@J8Z1%>|)>U_(c=-Jhbui^)sik+RbsGQW;RuUk}Vv zsjy1w&VG_cRK7@HWzyF#71X^| zmeliNs4ub3SD-!<42$qt^09d)m)EoCHjraBaU;w3Y05V`jjk$%@#Z9L5LN1)ClJIY z)Kqb{}5qq0BV)ruF_vw&Z5N4h9Lou9tN;K%<^zLltJEd|p#`@dJupLwPOpW&v zuOw3wTT)`e{f(6~)f??$lBQ?mH$dEc6l94%IQxP##kl30HFJTM?L@;vQ_q8!8m4NM z(D`1}CX^UctC}W^u>`W5RcXnqoNlCg`dleBk*ni>$J>Nf5f5lq?81%?7QYx;L2`H^t~X5J3hF6r_Mi7r8~c9w*(sw+<~TPZIJ-O z!|Q1OIS%yqkmGn&gOLmi^KbK%eh3^&&JwjhqK1luJLd0}74w;#9kBV~PG^c9pv$CI zwdon(&84BSXVP3%+p9RVHiHJ79tRrvMK?=` z9Wp9IHH!DE8!LQO zURP38GtNaZTRqVoiKbF##^bma3M@@S3nSIY?r7~rx|Hm4ijZ3Li!#{`V_5oOJJil4 zN=iz&_pOk>-YElK$%}vxjt7&H>LZI^O0EtC<9lAjIj97ohk>z9=9Rvj8$p>4CBMp~ z5h==0@w%D*c;v{|dc@FM%Q=S_HaBcELN308y$v$$1iYxj!Aph>&p%>SAOIz<#C-o@ z-@-4!4i@YJ))rQW7m|*pWiV{RL8ZchSSefMVsikb&(@Gu_p=IgZZ;S=wdv|{tj>69 z1*Q*sBb_c0&|X@M)0D|_xmN1Ddd}m}9&@a2CqZr^aC)}=`q>Lul^d2EIToKTtgo-h zVBm6IV`lEIe?olTo!gP%;Mwb{G%-Ub7yDZ8T{PLI6>&Od8Z^Sx50p%|B9@cOZ!lXu z=+4rlg)XBA)DimF)fg4J?S|+r5yHdo=fCQ#rkBf>D|QTzZg3#g_&<_R?0m|4C6epx zv%5RQwsQ`Kn4OXM4?o?mIhUw87cxDVOk7U2!u<%J2@#*YDACDASmFiawZ8Yp!n+|0 zZ$Y*%4_Gqe7F4fnY3{+j-4yKX7&bd1>XEB46bi!O=~B3yPz3hexkm+%q1$8zH!wo* z_(vxMC{bdACR?aY18ePXD(g0-uDs35tKAc{^QkQLI7BpRy;v0jNa5O}Wq)`Fray`{ zoLzCyeWN2n`yf7m$5`nDi^suUBpxkdU1+R;K(8FsX6aJA)>l@$ol7C4cy;Av=jE(( z)}jM}0>n1>RRJ>Gf>lthP!Ty=2>3f#vAWGlL@7`xP=*=E*N^i^|lof+D`m& zWGe@goYv%mHYDEaZC-QGaOG8-ICKAeGR0X}i!bjMxOwMEo%fw8=;|Sm&>m6IRFyO& zzbiLFl(V&x4lB#8=ccLOTxWB^rPh}E(BCze=L0cgE5D9j9yYc+MHnHVEgjFrZy`Zh z%@;8YBKA>+hJ`G-W>h9~CE@qjl60ne53Wv%vB7gSqQA-GnQF($7@gZr5k52>(I{ol z?;;LnZ}OC7=X7F{d%2KV5x&tZdlScZ>^RE^l#zd)Q^=!_VrAi*`JCL=Uwf^~TtU#f z9{MCsW-X|-y`x0>Ms<(4fSF=-1W_G{`18vAdi?1x1vs3=PRWIFiOq@`ioAzh-X9!q zGH0XrJX`K6_49$~jb6)C&6C0&xkr+!h(Fa3dy(eQEsa36kTA+(<&?Jn7Me`#mlp-NgCVqv*}mtaGI*0)S#;5ScG@yG7*=jD_l@auW15tQea?J z@Ei;Dg0`B4a-qoWt>Abs+lfZKPv2R7E;}1M zE7^E-&^8qDViGz0dvH_y=~q*nBEKbPMT7d(bKehFg4k&iipP$dwWXmQ_^JgZ%6F@< z#!N`z$%xE6*QM*6NM$hBTjVpBZ6}*c|%vJUL!|F>KY02 z>wxSM|C?(04!m-57@3xtPn>2hkV>xAB?*UKDnFF4_Y^LmRw*z_YQeAoxxAc5w_`Nb z@++S=Ke>KGg=-gv%WiSitTR1CnMQkLp`@Vqt<^Ipd7+8zFj!j@g5nFlo6#0;KN)#@ z?Aa6LIBVZy{o1a1IR1t`qj2&(*65AcW7XRiQKATlD6(bVc+_X| zP{vf?+T^UvSh1Ah$dN>VES!NTrWm!B-Be4ktiFGeNqeH2sfrv4;W~Qxr;a4C2y)-I z0lulSdHF7uJT7deS`pV1C5LPx)wayO653wS=3f-&KU-QpuexP)j=a&r8)U)zgM}?8 zk&9glbt_+%>xFeIb)%@43Wy`TCaG_NxnMJJYR1f<(V%M4K%}2|93Jd*G{u%7BwVcd ze4j;(Bno>RZOX5C1r&8+7alJsmAVe!KiHm%OWot^nWdm1v*)6c>!Q>Zd199K&i9~$ zG(k6Mr}w=%p-?dH#kBlylX>Bk1*vR^nuh31txqtr*SgJ5(rE5%yBVyS>Erq?J~Vmu zAc-YQv;UQQvy-1L*Jmt4nTC$75=|Q>i&X&m;%TX+KHpcSd~Y-(;|__vS-}1EnIIo6 zX>G#6GQ0DFAm<9=tU#t4O5NR0nN#T27KYR_uP3;&5y4)lpkzuHNi^^3gG}f&%S#rk zFU6NZf^JloPjOVvEF_ml-CpKGJhh)(kKBw@mm3??Eg4&_^c5QQcNzjP;md^2Cf%YI zwZ9tRyz^+Gd^*_|qE#IskKfec#7VJA`q-N2%Erd_hg&nD5h(~<&di7;73BI~F=Z;J zpB^GM>PMgdQaU)&-i+Vftu!i$jSobcH?M*F6@^Mib$hX;IJ|=9y@S@}JnJ7dU^P9* z!4ty(8^4+}Hc}hpA@UsOj&A1MUZ)stdIL6TnG{lTbP*$DRl95{%&nr%^^J@f#DO$b6vA4SWq_W%^fT(K8nB-l&45Q*mOU4nC%geKYMv@wGlEk7JK4Xo_ z**r6fi&k2R-P;>q)M-5y`KU$!Ws?&&I$zUZ!0aYl1!{_0586h5e9}Wr<1pXv<+mP{$X9F2N1LKV{frs+b1C;EP0Zyfq2@d>joIS!%2^so z1Xq&z#OPkRs?Q!svf3(qfqdJQV4`v9eYuk116fPJ^bv&FZ0Q! z!zox_9FQNs_Q?&8!$qUBwmH*VP{Qa*XEuJZ4b{lYdctJR)R3O+XKx`(?t7h0FMP8v zos&2?Z?U+ix&`9QoaX%5mtn~7IyzoUuPiQbtSl8Qecj(&D!6f&vh+3ZMn5!!b!kC; zy&{cWeEmjO=QV}YL7jp{0zL^%(NYSnO?lDk{5O`%J;9-QIcNj{7=~Aq8!k>Z8oyrM zLt`rAR$#x4NTZnlm?)A$Hz@;xkt{cX&D5Nf;nuvTrdiG6gFQmPdZ&SUmSS6^%S`TG zY$`}lh4bu{PEWDAPEvjhUU`=3W+j3uoK76a;Ygh$i+i)tfl(edYfbBd z##!PL)NBt8hjGGKZ%dA3kUui-*++NV+3+%t4jJVYSfw45JRg3F1<3Uw{(>1clm$l9 zV-R|<){Zih3u%2NaOo2^1Oz3j5}QH9@=W1Z%--MIzW6kmTs(q2OL0<8ek(;0PRno# zo3uHCPJ=fMPo!JgsuCXDA#8TH@4HvDygsvd&pH0U<$!TUkxF(~7k|ceg_LLAqZB9J z1Sa%4K>A?!k^8HQLl@)ln&`_8nY&Teu**w5eRCu#7bu<}lzmM?Az(9TSz(IxwJ&=| zsZiMF-`^IiQENmGZ6l?}%4@DiFK1K;!-<*4xz(Q>)ma8}8=l@uCbJhQDw0Rq8~$9% zq*V?hNeqIgkoZ)^pnEne(q(YcE$^(~jAWoeZjMo(osYKFOKzYtqpt7l;t~u}6#f=K z(;SOTXqmh?*P%SGl9n+(Htbn*8Kb=O?gF!@dbPi=kjaatHjI$Xr7yxDgyJ*#>{S}; zN=$dpAmsUS^5-zQM`B@nN;JEvKG|GuPnIvgxaPBCeY3wV8itL2H zWK+AgFZmdKa2)e%e#-okk^Z(F6DZ)iKSZ=n=Rb!SwLRf-Q9J59MAc%loAKMS!i3>D zG(4m6ILZp=H?ukf%o1~Gy*P);SodMYNs8t;obKOnK{>ajt+b9D3aylk_#2XsW7~O#G^SIMpjj8=~j_fr9E^2FnD~ z1;3T!j_dzm^5@`CfR)f~p`ECN?1&o^t1A8}m|FH9v%0 zDO)9IeU5onliE&xoZZHwDf&H+v87`go0(9*rG*8QKCGBoJ%3(i9VF{mKRHuH;#_Em zR-V|Bn<>s+?6|c5%}gWa`A~hP`z1?%){Z4)s>xToVFb{YxNXH=sXQkI`xX$5%Vnxg zPjuiIx9$=3_m-O86S{<-#e|$rPxO^GjEv@U;k4v);et0N18RRVC@>l! zw^Y~oqt)hx`SF`7$Gb-n_Pw714-aeSA3MLqqPDw#38S3x;cr3l%7^{s5#n(W*nGRz zkg(m_j2uAjj+m%LMfgIR=RMY=+lIPNLj~f^*V*o_8k=lWxi~r07U$h849R{dnYKho z>#{C(5n7EyL$?x8+aF2z$-hjxsc$k(I6U`G!4buu)0S#$+2s%5VDKS)9|o|e$H=D zru0{$>VIesg2b2F@w|G*+U#UJ`D7O5PWmguRp)Iito*C0m6;G-vf5wjx~;JLYK6CV z)E3!I<#-GsW@?o84^Ems8EaR3F8m((^8Jz51sYF`IEuv@Oyb__?@Fy_FmwssSYw}E zs<6`AQ{i42PRh9ROz=i!fH$*po!JNS=vStb78vt`ydVRU?Vc~%rV`A39`fk`llzq+Roq=U{HTLYfmcFI zkbVkZ)7`bz+MXd82}Q4rS_p)YQ1%@yHL2EKMB=AO7=T9U&rQoGipZDVPh@=?E$iUBbhgI2jB z0Tfs#g2!Hmz7$K2aypnVx>_D)^s?y5m4~uo(lV&pfwPO;x$2!&Dbti)*#~JWt#A;? zZPx{=IGc_wLc@O=R(eRtT4>&)%FLK_LQ%!Bv&jbR3%7# zA>^^oPfPcX)zn(M*(=kQL=3uh|@)l}XSdYWyJQ`LgYhw4}@e5Crh0#EOU^8-F zwf@jU*<9@{$Bt-cpD8xh5)*DD8;6ET%Y|sSelyA*W~y$#^MV;SVV${R-$m+yXjaHl z^>%_vJ~UZnPzYU{-7grIGGB2snpSWxlN=_B>$vz?Hgn8|OonG1iLjT@7eFso#y`p1 zxPNi6AMVKDFmW|YA9CAl(L`^06co%-p76Qv%*7$7*H~jDj}Ulg{pR|ZrWLhGix8y| zIy%Hv(n|N5(uHU3?K#WMWW42ZsIR;cIJ%)c;&miVZ1`f@-&i-1sA{>x)KFROu4qlFt?0 zXZ|2PW}9eb3|>aq^8Td9kdE3gRw-;7qXWsydU8!QC^v=8CST+MrwQrfv+ynDx5JAJ z<(wQ0Bsykw{Yl1-xfbgTAU*3}*jr=L^-=KNC88*9dtRZ|37tXFF3Bz;pcFbL+McT)(ynUgaKGo`QN*Gm@7^hGzI&HFk zvfCHsOjWOsm!n2LjosA?b$Fc~-c{Z6@#Br%D~o&?@tP}>%{S+J-(R~t#~vide8-E$ zLe(1-C-n}?z4f>^-OsoL<;(51D4b&?F_v$Bv1^DVaZ4XLY?!4Xj4HT_|NL-=^eVCI z2Hw`@L`5V%J=%FRfi&^BFS}E5z1^&?A@d-7PzJ^xp(18qvGQ3z`d*Z@ zDV83Q^f7>>E#Cy-h_>w3TR9|j__^W(iEp=4wO{A-rb*hV>-RUMgYrBsvmOepcz3k( zQwO;ZByU!cj>-DMAiK-(PTt&gBa4P}0Id0xYctjmzE`=ZGnV%E^`=d#;)%}i-tOqE zW-)NM+MrD4?+6(RT*}JKvKiSs+eYnv2R7A&#=Flh*_qF=KW76ftlrYLQ{CHN@-liP z^vvaLnLqgy$%8Ybm#F-_e@@W6bqa@i(_#<*T%*Q(pfI{yrp#e z5KS%)A3vH0+0xqULf5bRSyaO}_MM0h)8iD0rRf1QmUL`pP1d(zrs55;u0*mWN@v=h zheO-)BV}`T+uk|f#G=-~ZB!DhOyjd(iKQ4-2Oc5ppwF1S!gX&tNA!`USPSV3TE_ai!0z^2)~9z>DCfJAe_Ak4CUwHQ$u;yE3x`b7Kh%)OrA&AnGjcO z{27|M@ooT7xuP^oXTXM(0?j0;xaUdIh@B)_GwHOqMVE5^>`RMndcLivWN#GGh=9MG zV)%?4(Vf-f07(ju<6*FRPhgMkxX4YA#dqI#Yi}w_4mdZr16Y#z7nU4l;o99}=uB5U z6P}@fF=OfKu;e?mMNSl%@M895VmM1SRY*LS7e%<)==S@m(U`d&NI-$J{Qj97DqG=? zl~JF%C}GVXu5v!g6s+tF3CDhww^eizu2SD@) zp~*0zp|W+uMBCr%N0kw8PK9@#=Zqu$}hzVL3eKS49_o!pD= zDv!&G=^E%|yBl7@I5ghTq}T(FR_D5`yEskqQssToN<71<)P*ekxB83)t@ryc+o(D9 z$^n*0T`fuV_Rq!r2}=0^yJUT~M=&%_i>NL@t4s#z@Po~>mA!2{?LM6n9*kqA(u;pJQ|oQgJUD8-YAWxmbeSN03q=I6bdR@UZzh^1|15P{GJv$UtQE zW^E7-(wT4(RlFRYutqU=5x0n#obd2#LZLT3SwtbU#3rPPV^>}}cPJ&|7HnC~qi7T^ zpYP88qSMlw_wggV0{(*7ShE5RwNAf1(^PyAsC3y8gEdF3^ zv1EGxQU;8#itnt=aGOr;eofU%qIhTA8WON<*qdYdx{}16OHklb0vjt<<*SDWpwN}c%A(h&C*VVc z9(`U!Q}}G^>$7JAZUE@k!dv$Rp-inJrAEr1a=y%#gGlK!E_2p8 zoxLMuYPqRS=C87)Zw>JUS(%*Y{T59z61{g>&glF#Mz(sp^X}8ND*Fw$VGNC->T(D* zc>8`an;D;X8)VXJK8TJX$LA#7q_8ZD>n_QXJ7KOyWjdJYC|;D+umx)!?b5PKCOamKZVZ{sOOM!M{NbDVWulXC{IfUbhaLRNKrC zxFP^xrKxNIJ}3t@8HU7wyxG!FS;zLWSqNH5uI2jIGaPLdOFDz4&iA_3?uJYEzW3lL zcHQ{USxK%ZOy=^o=WgoDVsiyA8cIf_I4#YU;RAjwyFEG1K06a;9g)GB2?dYhSa(=ze!rPKXpm!G-jK%wFDo_@9zrcs;+|IU>9xv49LQchCNC0 ze~98<4s&?A+J@D>Bjos*7&c>{9!PhsF(mk*pvp9cJq79?u!;D*ES)JStnr{a+}ZrZ zPOUoP>qn9MrJwoJJ8M!0(Msfq9)A8(zlq0=^=z_+7PaxWQuvAzW!6hCqc1Yy%a=8A z{kDT916X*X&=$A3n`u7DbZnAToawRD@TE)oSOba+?S}2~(x}xMtNQs{0{E;xTU*4Y zLNEY^ZCC8S0l(&PQdGxT?S>6Y5-7Bl>NEO6PN1lBRk1#=u=pj1A{dON9&O(A-rLx4 ziVeH-wfizYBOVZZKZR(lOSE^K60YBAn~#_`F^^W>FR0ApR|h%HGAFxqc9CiKt967h zH8sSiz|$9NnV5f}onsDpipp5$9 z=j`!X6=~R1xfc5jAaJ;>*2W9)eQjN6mWo>dSBb~%z*kxwB+lw{&ORoOf`Ap9#*b~4 zudS)bFtFAVME13r$sg?*Ml_=gCLUbd0hE@nZ0|$m+%>@^{kkV zZdBm0;ZP``lxzql$`zTJp{%9vchU&g8Uxxqg*mN%+i2USHEZzK6tic=Eju5lS++90 zGN#~5lT3scIN%RbpBYnHg(A8Vt7soaYEadBNYN;!G0Nr87R{Bio*9TdfhtBR`%Asi zqY?sDe1Q&l6<;sRCtD%f!NK9&SsKQ=3@TWj_pLS3Y=ci2L|=I2x6DFrXCa7!%F(AH zndIAtY3>1BSV7p-%~vrv)h!eNNF}cmZV@j#a~gF|*XoR9NK zl5>-an7{)D|CNZYMW6;vTnijz7}qk#lIjnNN<8EjL2fw6gm%JzU!?>aRIzhhYSl8e z3uN~h|6&+bFJl_aESstl<*0n5p`$mD)!FS4Z)?#xhW0071? zi~EI!aGD^J#+tV5O#}e6;`@A8t31p^W|@ycnPit#Iea6zTuzE}>dcm1YHnfyHPBk-Rjx)_!%mZLt1i+Bf{{)*nmy56FM!N6_9J=hAvN8n}!m-6CK#gUGC)_*Kx*KXth7kZc5P%~1%HK4Y~%wONOv$lNIs;fUbBYR_ zGT-ck?GnE@=~P9pg6Ig2uVo(on@gULhgFGi9-$rGlme&-(xV$rdgaKeH`*GQ8b7dO zDY`^%hbWal0g!s$LtZx>Lqn=`b4o2-zuE-!QAwiR%iHrhfpMVhH1lwH_U3IVYA3si z1`?IFXJ&Z~{Uu&6kT5nsA=5{L#7+|_#TSC(`Qwnu#OC+pF_ER?0cebM74H?Qu>H6b z<+rH<9O9RQR)GleW;#O$nk@FTDdef67J9L^50ydO5X`sq55#27SR$(y#RvcyhM12#gJ;;$?>v+iV_&2!cd?j7-$=|& zti@YVT)g~|VNB!|`4Xb7HFtOB;Rss7)^6HL9qo4O;lA$PR^7KTLb2j4{+sFCsf34x zfzO!^dQ-NxE6NoY;<)TThKUqHNOiiAP0(NOc&=2Om+InAn&n-q*(4;O%qxEed%3?f zB0pB8X#XW8Yi_x3Djt=9M!Ot&;z7qb!q_kDAmW@WxufqbuDF$QS6bPObtnIs27vqlJd#n-7_b&K+IDTW@&FV2@=B6JR ztxMA`4CNB#`K=j>j7Mg$pgW}l=>hlQB0R_W=jDDY4t`|6VWf9e0D1z;vGP{nl@%W9TRNBbw8F`6P?ud zEYqQ-iS~|0Mk|}&M&pz>@df%X$b07{NZStW8LA+ZEir6C%{RHbUrBNyxwX)JOby;1 zepA$uLih1aUrO5632)hEh?)8}EF)-btZ7z4P7)tx9;B98Cl%XXU=D7_# zRK1=AP-&{_$hb!^=nvFPKdW08L-*=2%X~xVOwWPj?B2CEH86 z>_{F`c9hG-uhf%oeIAY2c=X88F9z=s%f%}axX-fKa%1_nW}`!+zgFEW*)ya(ji z#P3&rUeqflpfuI@1^37Thn7H8H@f*oZ9N?TKUL?`^W6rd0AAv{r@Xh#-j*n$hioq_ z=ke4+bivDM9I8bdYqAHgrQ;Jl;;V3(9Gs%iy1?zMs&NEv*ovTR4(6-x5FBx|MY$=w zUc&Inn*2BCZJSG8ccU?p)MlKmbr>OIi(fo)RXz*h$}QZe<|ROTT&_jg1$hO@SM{iTv~Y?ASW3sLRt^cs zq$6$+qraU+n~WdxZD3%`UJk=#pdrEAFNm8qeSb1<^TE<-s8A#Za;={ES(kpfEQMwZ zi|U!}h&aBSl%MZhYb6OSbTA2$OD?bLrW$DT(9tfmhvLL{gb3%}L$_>f@Mnf&_Xp9R z*Q@rNnTI2IxKuv#lUh0t{xPsTfu;iZ?3Mm}b8vUDQKzYX1>6V>%Hm*7;Eg3s{r}i| z%c!inwq00}2I)>I0cq(5>5>jXTIp^{>5}e{4iV|@?vj>H=?-bw^V0iy?&p5rvBw_Y z7<-TJ&-?cR7VDa8t~t;1sHr)GP_Z#A1hCE{U_XJDP5*S-qAO(KkUBfEMKC_3Rnv*H z3M4$MMHBy)@W{-K=Q*M*JXJ!St0(DY(zz75!@i;_IDYuG%UyI;csu-@?y1<^T2cQ=PAn)G39!XyzHx=is~oM$Qc>0;28ekGaQwfMp`#=7|U`Lrce#^R<( zcQ?ow9Y27z2`#1G&-#KS&Bn$CZ5yo*H3XVlwdm9H;V^}I2ii)ft7RHhD9!X{0mP;8 zXVgH@fkj61$0rpzzm`^gy$;AL+Jnb3w@<`VP$cO7p2QGbDPMD3wALC`HYww}Q%VE2l9$SMj^|Eq!Qr4W=9 zP)-l@(k5cmt*7@p%(xe!!Z)84Qx~lC_KEd4-5g1Oz6MeD_!8E4%W%Zh8#_Q;KxT_F zNo{Rd_d-ho45QXtyqp5^BA37R`Ino_Z>nFR^*Q#UYsZ^2c5emhP+>DF!F#Udf7G#O z{LAh1?)FbfPelYY77r=p?SBhJV6G`DO*?SD7gkB2l0sy{ZKubxx*9av?aUSrZfHIgWU=pyQk}u+&&rB2R3)pFD^FJ zf*cIb;5R*Qh_Cr>cULoJs<8}*<}}m=Dcy7TWZF3yx+j`dY&r(!L|)>(YGm`p{d%l8 z3m+yQw<9$A&|xbf)UIxCk<>=!+cGQOG>>r?py*BW&DOEgd90K6FdIc23GUgn@Kv+p z?qqlBo70~=V_Dak?X&;AE_?+l?H~=37vwEXu4iqaj9*;>HKDNlD!{5ccBiE>X#AG^ z`fMB=u%hB}ayWaFSmAnyD;X%nNK~ekuqca~|Dqz*U1EosKV%64DgzjNMtDE{V|bCI za{Wes$^`!pL?(4F}d9V9krkkjY|rr-rsOZTbnU z)B5EPqGgfs(BF0*Yi){DY3n%H?LHH=KbWs8v$v)+@*f<#Kc&oz%5UsjETi_6|eHTj@a(!FwCr&<-xZr!1EZ{^e&fF zD>BuHw&<%oLp0}`nsggPPf*>Zv zr6y}$fQvoR%*X*!u5cmLX|Yfo?5l?-H&4;IOHBDy#^W8weV+)>TQzvVQGPKnTrIV| zGph0i!WYVs%rBOjzZbrSx{FqzIaVTma9&E7pmnF6#V2kd4aM=(U%6En4Hxi+)oz0c zd0XgL0w!03wz^=&tBv-B3Ym}~0o4_$&|_fwrNW=Te72`Ujn zSx3sI559gK61HpIy0j!&IkW73zI-IlJeoAVE=ev~R4l5}yH}(Qedsn4g7~7u^@e9t zO*=d%)L)qh`-xQD;k$iKR7f7Jn z0sRuV`ORS;?|k64zlRSYcYs8Z9GxYRzbNDxl;hel)vO?DVeAeV?i(Aaae(~w9g3{S zEyP=;oAx;g1EO%(|7QlnP^`T^aCF_A>)OSy@XAo>s-htY0kH_;{b|@quWEupYIF_y3lS{GXE_l7ib4e!-*@F{3Zt9-6-! ziGP~FNM*2I%5r(JW#9FEa!8`G;1tj4z2jb3e$8BxSY;ve^lGu3=f&ief9mZ zQEHg~>lOUP(T=~h%q^-p=ePEpVCBl{N)--+G-Ax}ccDENpJYBhe8f*+su_lkl>~G* zM$xtH>u5*!^S)ySU;#23`RomH2*An+4Ll08nvSM3P;#k+Z9NS&msb!Q)bV(rVzJ75 ztcQMd0FDTEm8%N5`Jc8ym%o6N8XEtF+?ZfpO&Jj&4NnUa0c7s+-VE!xs^wgjxZ!5N z(a8~dy5dAlj22w%i#vWuYC$l-Ip9m=M-FN~oW`qJFYvj3{B?i=k{U?Or_?!A!B>z3 zY5=tlR_OnHF3R#N=D?7o+(IM*LKAFOZpF@3MFLTMK!FJSJHmxj82xQz<7l{Uco1>n zxY6*@_CZQk&4b6yQyd9;QA^-tY%X+hG6i!q`FWNsw>P&jqPUeG!aG_>REVWjp9);^ z35b}Xd7Hxwajj6xr?vMLU~DiZ`X8hTaJl_bS1_%x;Fu}(To4xy8g2nr1PGr++)$mN zo$|WYbD!s{iX+BV3#A`W2;3O0&TPwrck%w)OS|Xx!|?pg@d)qae*Y)u&+VM*#i@8) zwSuWB9I&c3wI6nIi~OGc| zmTm_&)T5iaQ}E7tFdgq9KWh!2e58TT6~}G-h(xy^x|{~&qV#h#f*xzn^mH%rqbbC@ z87TPA2$Li`#(%!F^xhRB!f>KJ`#o`;bfsl|uqhTC;0_VNB4xIpnxtqDTf8xwNetNC z_|d$x=4OboYoR8g&-o@trIFQm*x4cjmN) z&l0o4YxjEzNR*4!?3#ZZkc+j4W3hh$eQp@}P3D#() zp@L}fPl)9D|FR)|A`pNDW;mfqx09JU{kz#PjV3!wL|>O1mrS#&7mpU#Ksy+0CIDRK z62~Q>pVcprOAk{Q-u5jhj18h6L`S+6a&>uincAG?L{M4u+DOW@+L(Cq{#LzOdL1cOB_V@W zB{tHuh!NaM*C{R@w>$Ed&L@p}$$4Fe5S%D=#&q#HjO-*gF4Jx1{c9@sY}BrdKUO@|AQcSi zfrR1-Ghb+PbyUu?bK++Lqyl#E#kvjN?1j_%+aWfC@X55I-$7Yr3sNN_^>Wi298N@a z8XB|8)2(G<5|!L2>nnVH@XDC`bWM>Emk@!XgzG zgJam>RvUb}t*?J`z>p~DtpBwD<%Lmw_tD8@p+il9X(8}$7FVY*4j&%tjEO_Qig_u& zgC%FQQAHMbt#ZkEI4k0X(X;&LG|I)u2HA%GN1r!Hzp$&(Y6-X;q4@@)2n9NQ?&?+n z+LK6|bv&!3dInl|ubcDK;TtuQl1L|}_+`$qG??_vP~gvR=1lyE00}aJtEaM=qH?Fj zz;#@XL<{~qAS2Tt7cpy)QtYK_JE!q*YV;;ixV$8pJ8d%VA7dXz)ih9QMu0dDbNtRZ zAS0-+ZqwzwSM%~b5{gCZ)y28Npi>hIvW;@d^Bo?Ep++@=9+D=@_!lE}3K*%Clb@m% zGg!3TIvBNgaKEt0Wl!B_ckH zKZ`dumzP(>)>X(jeAY_wp2DMe()fVVW;>G-I5Wv!@9*#X_wJ8YG@x}JF15q}Hl}(o zVFU$~q3A?-gOLFszL~n&IB4tennX>$g37%hk4NnCi}tKev%|I$xwdz|(%0|< ze!i9E3o6J{_=E0W^26g!K?j3gi?*lQ)QZR1c_=TCD8>27l1T10?w)n zWG?f%-}H-P6{z#?{eClJzJIQe>4 zqdOBfj4|LxM1xAkD^wze%9HP2sijyBDk*3pzZhvxI0SieP>_+3{YW+5PzgQU=Wks+ zUnlymQpg+X6`KNz`F}^?-?n%@vET5|NV1ptys5CR;0Vxn4yzxZKqD871=CL${)f~N zODo>V_;T`hyo5J-9`FXVfncOEqYgymEnbcFGbK@1t#y>B9U)$~YU?@t8T)s*1t^dp ziy=;38N@djGD`NY_qQU=Ux5CC1uO2z1BC7URp|)x`YYWCdy_#TPS&~h_fE1v$pEet z3gdhbhBaz1^cAJPc8B1}zI5^;*a3cOG$zhk)pIG|m&Jx5;@C;vX!38owwSik2nJaa zhG)IDz3EFN9@kePG~7Q`3J>Bw(vDBuZMz25xznP9CR8P#XE28oTag6vmC$)(+wjVKf`70A*BGn9o>-E4iXiN@$_HE;ZP27~n;KPx-uQ47hF` zy-qjiBi(7<0O78yEg^$Wj!JwV=AAGT+E!W)CtPKy`B)04B$qo@gVVuivM;UYHcfdG zBw8$xf5>)gjZ>Dz>VVZA9*j0o_&g#ea}XGAUz^;U^$D(+<^6+w+N@j^{tQ6lXqMcJ zFVN~HZbNUWy7nD5cLlHI`$=k*xgz9U!>uM%v>3VS&S#t;r1Cqzx*cZH!6GBMW?ORl zzBeOCcLSD?|7=Mpy53N^G&S<;8(R80A1?ilBG7FVO%t|dg2l|3*X*Zbe4A4mv`E71 z1jPzvOfZk4+X@}@NEHg7c}paTosQ1@xS@phBjm~g|7>=$`?%|thmz>>@t_%Y3N#CF zB;0)&ycTk{ST}gq|tHLp?KZ7{T z=7rY3e?SGrWK=j-%|1}HK0!Qx!wl!@WWN8H^szlt~=A1&P%)R zhl0SmhSG1mRO2k@X|^%g&PkyMY-2ziZuN{L?Ii+;0PQJGPAzyBlTZ_=!6!zD_+8qb z=Zk^RJ}H4a-uIpmofBjhL;>=XwTE+vvr~?=N1yy!FE@%kpF)CORI1ml|jQ z*`0p{G19yLWXZzXT!%`mwEBLA5Ah`P`L61K7*S^0$Nk5-VM;W5gWS!}+5M$>K-dwm z7?`S21Fdfw?=$w{J{X&;m#j#qf~E{2n!_bft1P)klOiD zbozTU>qJs`=;zcIZB-(?$Ru2YctiFnk7~b)Of^3RMWE%)>7JY@Bt&WXd_@+jR{MrS zgG*2a@?4YtGoEfzHq#8S)N?FMfO>F}TkE)l=HqKHSkNq9Gj|``0BUC4(@LZW=@sZR z^mm97&j!vCD~_4Rtt|gT#6pjerQM>_=t5>jG0rg%%XT*+c){#60Ub3!e||MrW6jLn zde~uvS#!|JQNr+RZ!t7cqzsZLH#=l(4L2)faNb{~iJAP5Kn2-#YxP1M80*Exwk5BH z&dV}S1I(~ulFwbQUH($HOjv#&c2x2hN3pKo5F&I`DN$6VkN)&0$1Mv$@R}aqSHH9t zv~hXf=4_cmkayw!IZo@Y>eg6g={W`vbA<&U((W&19bHBkZch6h;rqN@PHmM{Z2JZY z?gAjVXS{F0WolTHp#o^1oBpkRh6Jp1FdMJgJ{RWp8YSZ5vy7!v#g0(OaNFTeXi_r$<>SB(&)^iD?gXRCa>`5 zanfjZ$er>tp=O=6n*owmm4Y2VAW{BOGo1T^1VJJ^xX2#YZ&=LU7`H4mWkV5UN%b|G zHY(Zw-lc)bw*F7$XRx~tJff>NN=v5aqt)8xu?)JfKxzVKncnEw^PKI=IJ9aZxBk>T zJ`fKhkO;bd`nVlqdw+ox6c#S>ryLb;GAEdfpJXScJpc|9_O!AJjR8oLX!BpeyUc4^|Ee<^Sa2_ACF($4pvx(_I6txkiIRW1hFXm0|@-ONP7gmJbNMv8K=v zc=#r-D9UljyStE}(9E-Q)mQTFJKR4JXJ*HK2Qo9avpvR>sO=1_l$Y;iC=8Cru-Y#s z`jmM#DY`uNch0+6op8*PK>W|s;s2tqCyZbX=6A(D9PN@}aL2?fd1kGn#l^+d>UF|a zG~94;6nop4Z;kqW*y05XKIos0j{||{G31QrKe2S%$ypOotxH$$Y7RBvVnIuwe*-l~ z?rajKY_Cv%oyP`Uz^!oYYebsdt{wy9aUeK}3bKkv+jH?>`53Q7gnEG;%TmEX3s^&S zWZDy?;Frc-hXP5sf^I;{(t$A6?NP_dyhv`;~j!rIm8=8lvpqHaGo$xDk2 zo=N=;pzjguTJAn4z$mmHHHHESq?$$8{ZkA;LJVVWiAvkgmOr9~&RH!z4jurE zdMdXg4rmC1w9i4*g7+8SQ4n_d*8Ej+dqT4U1FYN4uOi6?pe^_v$wli90WfbCfy{WA z`}=A&srj@|RT%qUR=*G!hdzpCHedy)Hk|Bd-+^(Ybf;}vovqr1C?q8p@P1gsn>0ew zwz@p@GgoMFYH~S9!LH>MQL)tPp0_bUj-+c}4jVx=@F$t|ckV?(EVRHKo1j|p8`xvu~S{O%sVNG37{4m<|%`C_()5G8NHUwkDovytI#xfJq(3DbXp0A~9{AG!GUTQB-*&UYDyNx1Vik{0YdqfzT7p8@m z>1YKBEvCW*RoA;+aC^VeVtmZ4@1xj`JCow5B|1iY(gQ@Z?OmrfTY7A2C7R|*n9GWg zjO~};*X06q;=|uu_WLC9>O+k|n?%h`F+^!Jxbjo^ zfE8MVR)C-|j}J~puQOD(56e8q%^ddU!<0#0wyDLgmO6;x%~tPxv~RgfLtwDOgk&YN z|Gq8TzZQ5Xc&>*DXw2L0*6DoG&?V#_p`wTLFsv+ApGYC;+ure)kRa{ym*A21R}1_l zQzwI#yoDV~3_)0XZaXW&Vg4cDUG7(Te|mII^gyDC%MS_Hw6i^@~a!)XroHl9rYh zNJ@<^VC4^7jvu>c>FK-`zw?lJ)T`(?U}7osDAr~3+F*;@0Iu}Qy~fE zwP{TQfFjpGS^exePdI0O?^n(zBPj@YQ6Q}OVPx?`kC?5c?QOo2oGg}`)LtGPI!l=t zh0hOcbm(to`oe4+Xz0*g0U<$6DJFX`UB#j>a#@O)F<+!~45U;(VYBNAFKxap-`y)` zr7xv_l6tlFvu|+T?chT8YCp;T@Qrr>Dffl}>b!#v#^u3W%+}9S{16qI)9%nlHou#{ zqv*jX0ejao016Pr)}eyu^ZNtvaGAaNKy}GEqTLGncMv`JJkb}7slCF6z`uVH5?g+f z`Uq)>&-pRoe_Q}eL=^DkhJ=%D{*J5%f7NRbK0Td>v3PVW&$0F|EdaO;$bbEvod1y< z^fK&l?+<+c`rvl}|FaQLbr0F&mOlRXFaG~|^Z#?h|F5UV|BUeejPRdxH2%F}{Lhs5 zzd0o`6wov(oL~q%*EMLm`+eU*y`ef64?2Ls?`ImmICD9i;;4N%CYl;9}b46^0I*o zGwI^|Uh6T@mvI|{h3r^iq8}}h!i*JNSt)=$fX!a})weQ86o z0N6t_?C%ZgIe9CS6Q=jN5h5kHE@F<>=|YCao`&ID8 z{Q-;9?EdukE+i`ouKFCRZwN~gTop^QW}`tEc(0uq4SgY%DcxhwvXp67Ftni?7dPpVcGtLkUS}mAo-(dC z9p5STGChhzPWLa7CTcSR|26Uf;V5*0PoUB@n_T*Q=aae?$EzrVE(abtZZ{IIh{SKF zH7DN9G^6!N!%I3jxhpGeYqd8&QTXay7x)5jPjoKtY1VN+N(TS|3stxtD`c~MfWGWX zYY?EnmbQ&OKMccQl*8t&U*{$oiMBG2C@6E|4#BC3;@@n$hrVSsrb^4t**JKF_+b}( z;}awyst)6oLJWygd@xq)UQo9NBmAVZjp~Hh&ry8Eu3jcNofs#ONjA9Yy1kt&${wKN!7t5rpaQHNmzoHxQ#`2ql|=hPjOEcEHu*XO9_+ zN)Tow;&|E5lC^M|_N9bPV+OKZ8(mF!$CI*xB(p!_>mBGO1l$hAJ>r|Y{y zuJs%1lg)_40Fz^zSa)mz`+dN9tmWmKF$O*^2O`vnw9YjoFB$^9JEy0O*HR*}HfA|^ z-1o)@FXoq=TF-oG*BMU!H;D?#o6}cZf%pDOm%hzRVqQp0jsly8V3=~ z>*R7YR20fYCn5hvb}+H7U^1dtK>Zv{@dFuB4+%o1$8g|ORbghoj{;U%<>2?N4vHl* zS_3j2KF{cEK;CO*-qs4cRQ>G1pZ#!rMq7-6*c~HSyzvE9;ED?Jf|w~h0WXNz5!4)5 z1ckhxfr&g`SGI#2RqCE?5CD5fzvRcOYr&~4@o4Yb$zR*L2HA3~zE#~djKx&fzm5gm zRK>+4KrNbgj$yPw9W5k44Y>qYX{@tEEXh`q;#u*m4{u>L!L(Eqd21+cH!)Jipq_Q? znMK0Nr54ik%3=Ul_T0*op9n{HZR&vp;6+x2ydmK0Awq+%w>clywI`i5t8Oo33O}|# zdOTh$;2CcLSNZyoj)AakYDHT^t>}|M2~JO_@kpm@bAjMPxEH4U+VRx`ErEvZiDctg zrS~uklM?A#`N*b=(~ZtBoO-X;@=bQ6?xPp@phJk`@)-hU;j;(GY#H{@Fe*ircCDT? zrP>TZ{*+Lilb6JI8 z!)+&LZF(!FnaI;N>=T^--HReZibLzOGl!F*A*H=?HL{0YOX}9Ew?^gW)LvK=M^`5$ zp96oi&rNrHRzm5!-?Z2zrV=>Ly}4oe_T+3tX-5=A3afYg>YgUjYRK6aoHcd$wi_07 zWEpCZcPGg>gxB+qHau%ryZgBBQM$RHL0l^rzWWeK1Xjg;q#y}rST2fFy?Bg zED`x;QR$4%T-11RDS6gL{%pSVO8~3Xa-r~3aI(Nx$TA0(Wf&i@ggGvlXg%=9lKdc! zkL%Brj3U3hSdYkfy8s6lL3mb^iD0A>yq{iI$Vz1WrV67!02xL>v^?T@Meak&{RNE9 zJ?~vc!h@&77W6^Mg6a40au6Ol&C9dBmmNoGB8DJBs2WdqAH^TS`7N~a1~t-dhkAYv zFED@lffjALssOg_BCtTxj+dJZtl-pVmv6!RNc`vr?n<|vIre47%+1jeXDvDhQ%9BZ zhhHv{8u3=szD6sGtJ}yu@jKJl)nR*880r*`6(>tMEUb}EoZKRFC7!E6i24)`_xD?! z_-|1^4cb`vqX{ZVy%U)mN*ahH!X3Hj^@5Cr%zqz?@dXprs+Wsz`9((aAJTXNC(=E~ zx%1v}s$+TN)($V-o6Mn(JjhL27D}S41SNeW@1kFaYToV{fOGFUSU+z#rn#R(c8Y$= zz8b%C%g=B{c3{0wa>|*4x|31caTBuEIOay5_V&I(= zg#r*OjIz^6xdQK+BQ9?1=>u4sMJV7YZarnkDYM*_#r1m?z3 zd2+d-AQ|AS^pFlCq$V3`vRV2Qa_S71?}Pmt?B_w5%^i-V*1%*BGzk)f2`IBIGB;9g z_iu0Szz3Hboi&MkrY}eY*cu(e3U054d94i(Zf9&v3mTv!SoSy9-x|(xcCi2*lYf2# z>f*yP|6m#~tJWHuKk+;)rUEZ``}5ttT!)L%{BjK@YS`V@<+Q2m`GUN!G3|y#b>n=) zlv6nKIc@UBZs2xF-m}54VN{o(vSLSFvGkh;M~|V4(=H=p9qNEBFH9z6TlT>{eZU(e zcW2L ziI?^rA$m;y=GS~Xavgg+t6~)Cu}eMr_rs!Klt)|d4Ri7Y#Fs`~GwtH~6Nxym zi!I*@Rp;gAl2K8?WVWqbu0;qQAGjSpGtlH>)VamBZd8O>$wZ$GD)IM+0hnM2g)V8w zPMoe@e9+g#XgauDe0>APy1?>2ZXX0Ng1 z>2<=N+@OSXXjNK-uTTWE7i9+y$8GMd`el0h>c4;QkA%x;;4Z`rY-+`Z*)_&YY!7Fc zmrqH_vkv?E`rt`OLm*)i)j_HeI*XESX#sG3sLW0(8G3RSJPsCt!2N76>XVy@hCxH# zY~6B-lQ*0Q5PKB(*CkDAP?*$yWGfn3Cf2>B!dnw{z9xp#!wW~me2*AXYKCokdRd0Q z-Q9Za9>XJ&|DI`8{kIA~8r6Aw81twG?>E0S7Vk*qJ*}_%gy=0Pv`LX1;At{im{Nr&}!hxHs|C--s99bdwBC806}Xmx93NA+MQ2- zo#O!yG$6jH{c0b2^-UJO^1J@}CF~K1%3^nEV(b1R77aw?!9dhLX}SP@vY0DF|IF*u zv9DEw&h3_r)4|cEyBsk^tS05x6z{>iHz^d16t#+YjZ9elNw11Ov}x0dyEUnIF=nUdI>Zt4BPwJCi%kYWUCwDF`^2WPP)eSU1FsEKs1juz^1 zy}ypi9WHOvNRjQl zN4Gg}Eig zIG35l-h6I$(4bkj$cHiN5h97E3xXh0jIkm>(LNKuyGB;RYTo7aKnQf*9=MDw)vl$4 zWe~I#cD6=kvl@f%2n@%%ksOS`W9Rcday;C~>(wasa9otOz{Xq-ia#Ux!rVt%!eMQ4 zRGy)Va!-IkKK3X_tBW>$E$%rAkC#kx`6E=6951P8E2_r1wrgLWH*cEgMa()ElIS9x zZallIwKzqtgmgc*2=ci@akd*c+>47be(m%NQl&?>L`5N%P`Y$)X1}LsZBJl=VMpu5 zT#-p%sX3gb7gZn45(^8t6dy{V@>@TxWNRyu9L=h=xrc&9JsUtf_Gnt)CHI*r>@fzP z8Nd!>Jx${jL~L?%51<;rT|GrNM8_bYwDYFel*LulmbU$(Siu9;4Q)CiXn&9s^ay~r z`d9s3mpM|`P@4qD(xy<9-L!H-6^awn`S}TGv#~g69Ht@RkMis{nZj{=6e|=3Kl9eE z0lrA1(c*D6$TMzvXb!OT&K7eGa@gg}C^fKe%hTO->*f?;m<}e5gJvZpEJT7$fRuFa~ePhWN7PXboTCL5m6-|F9@O)ob z(dn+wD~ToEJpH)<3ZZ~#B{61`P)_VoH#F$0b@%FZXjUfha$TJQRI3u&BcHoz6LUQ_ zbv}4+^M*D(oQA(udGqkXnW$6HUdQw2*j^44PRY}~JmuzBEyB4fffI*b-5o{Srthw` z>PGL5HE-k{@7?J(kmlzaIXlW?;cmNEZLlin3KlLvcUpVXg%Wx6bN^qhhc_R3v&fzM zaU0xW=vFpMA&m4cxbJ^FcGzAHzqyEE4cY{ZbEbFplk0PQlgQI% z-v(x0JH|b!Sg}D-i+Qzg8qEYCExseQw+?Mo5|^3n{< z%w_U%$oW@{#sq=?x@p*jW_2#l(mbmC*+R~%*!#sYWw)rqZ}<^s8vQF&EP$j0Y5CYu zj{PG;#UL$q1*Rv0K+jM2+QOpTdfmjU16`K_e>XznDJLrExXvJ*_z}Bs*7x#P_>o(= z2#{K=jmPS(!u9SkPPrG0A~It=(0K#*5dY z-f+k;2$Ol~Y&fI#{TE>&Y5uESmZMEts0y0>ocS1{0vx%lCh@G}#?S6J#lmqJ)8N!M zQC!ZpqPPOd7q8KmzA+oE6o$jWYGulP^tT=^iTrAA+)-}#;d8)xR*}PZy3bne^^0@e zw2Qc{pRxn{P5ja~uG_a)$0Z3ij>`ijUfiVbS1h~_Bigr}tHNgK z+Y_dabI%>6*6&@9IS0c(jlDj4DSkP|Q+~$n=A3$9{5)SR-Jq9QH!4}r#OG~^0Ke#Z z{1_~ams-7|XpBG$r};d_!~Cs8kWjM9RH-K>pXaRxku-U%z?^a{H}}=!SH2yh>#9KP z@Zs@VPli%%NFs*7Q}l7_j$#Mevf`s$K_&_sy{zG{D3tK|Ly4aZB`{Zhls*P$=63GD zS5BlDrSR|*QQF*GOb&66?>XB#b~CrMWnfd?-=1PXb$`PB(5qzox+fa#f;1|vLN;na ziY(@MU}RH_rz0zu1!TdrRhdtt5m!AzN*L^@XKHDW78@vYpTtlp{PjF*qZ3~7HI$mv zrP57o{L1<~1~>q?YsFW$W4tisk|m=Be*l~)J4-@r5kUs&T(2DUrz=?Zu15))m})@R z?M+^6dhs$IH!s^Fc`DEnsYjOA>$*oZXHSMLaax92E0!^sb6PZOi>{i-av}MF>cDa~ z#`MPh<4XvxfvEVz`z>~}8J?bJjW_vpVY5cS7w%IVz7^4CJd~nLS#(#;=&R#n-Q>E6#S>oG3p&ePEfL3iC+vJzS6(jHyHsLN=p^Jm7TxjUi*n{_Zpn8JTuCD7A_1&R zAidDGliq!DEAGJ}tICFU=~rPDp~H!fszo_-SbQ4NQ^-+~u;h~~!=HKK5#ifFgwCWD z&s-0*9RwxhZqMhR`A*3>`@vd-$co`@!Ut-x(5#>^?8sm9dRC>GuqIdRngMcN%F-3R z^JoIEq#?*D$$vvm7uc-m4c-TT-Q9pRgUC-8wQDeI61HBS44Ia^hjq)&F>XK}`Yu{E zu$aDC`9a`85TId4xf!sa&YE0?srCk(9h5M*ojiLARnI~`&L4W`m4OoSt45u#_~hl% zBcc|<`d_HSxZH;YD?alcO4$Y%(dUVuSNesJD0V5GaMRyh zkSC}-%xI{VobhvnfWzY1r!1;g68>vk(+5={UXN?~o#`6R+6ZZMuNx1jN;+*Uh7he9 zE5nVm8A(}5-M!TKCxrY?lzV&9ZDV7Iv<0+@xK)opa&ZcYPZYygKSA1o0KS?%^NB+Y zad#naA~F?cED}IGtz5s9RGE9*8N&8*$eKS99(P-K~_E9w9OI6HS*5$A^v8 zp}Tc?$ooXx(sUh6@xm{xxAJ%s^`UG3Cm}#TAAdG99ZS~My+9s_#Wy>0)uSZ&>{6Hd zF7NZnV{y#on+_8dcRfaoUiKB4-6bd6T|Y2T!DjD4#aaawGZk|V>W6PdDXFQSmX9;D zBs=F08~qDdpHtj_N3X4PYCqj%Vz!cv)X=SQ+E3=PTgPjEHCA}7ARJ86)F}Mkhm=wf z?Y&P-w3XRh#z`xr2~}M((Vq7++^$-T+ZzK%sU78d)^uBS-fsC{^4!x5-#aLMn~@pt zHszqBqf>mXQ9nx1I&S=0_;w{b>ydv|9Q!NkfVBqealw&3maH8ceq76xR(DeC}pE!;-6ENCBUSqzz?rkh3HjP_@^ zO!pz2i(jCuM|9fZRFV^?UcHu*5;n2ny1!hLpQtDaHD%4q2$O-+FT8It6+;4A2={tm zAXc=hdw)9h%7saXXG!m&&L!PuT(*@4JOWNcsTNjo0tjv@)}G~1 z31T&vST34rZ5YpP#uQFRVG)G&JTydam$?i50<$}c-^xAS6k$E&sOU`vZ1dX|#IrYo zSDr8PWS?SESri-zCzZc1HNW6+us_Ay9Cjp4a;4Y(j_#q>n~86lV+-7 zwAx>Zb98?~#KNAbci4wUm3JNuh}Ks6 z_JPdZd4C~%8$F84iS6+n>={g)W1h4Xf&^xl*HZ=<@dARBnv%eW(h=LER{cuL%@>}O zXwK3tk%ppT6!lK_9j%_eU8MysaKS(Oe>z1S;r3v*B8QrO!{+wR-9p34zZP+It) zF;d3TAa3z8H~HXUn}8OOYo}@Y5v1V6HCGRj->HlWs;HY-&}xYx@$yZV469uw8PZ0RzgO`<5h@(36*lOyLB5T zYITxEQQN?X0|=qbRsw-Z4X~@=$%I4<$U)VSyVHKo0FqdEB3|JiuVbo=#D>t?{j);P zX0Cyzjc09V+Bq_DP%OP{JBGuuBLKCHt^}*+tRQN2$?ex+XQJZcSC`>W@fc=vM;<7{ zf%p!jeg9|hS2PunMQG8c&SKS zcGG|IQ4UQAEl%flR*E&b-`!DtBR=s+%)`Ug)f?2j43rjQSY#ic-YraZt4Ul+%aF;~ zTWvou>DJ+;v)N*BD20fGB~PL=Z@dq4D~}*=&6SRe#cp2D=Un{egW$c*RD!xY7kV<* z9VP+-lNhq}|!cqstnZjII4~^ZG73njNk36uNI; zRndEH-L8#u()iQYetwtbP4-zL0PN&a&y~I(7`i5RKCxJJ%;Q{@fQ;owWN&$#%$Uei zo1eU7RLt&M8kD_ME75rhk~Oimksy7^6X zT69ecO=39h`PfU7?A`b6okCH~tK%IqIo+R* z2&sNmna&YVNZeE$4WY`%zOtfd`GIr=)7qg<*?Iw|`^@ZFBwc&L^MWGH3R(C17Ow{Z zqv7O$`d_5*D@ygUrk(pUD5%b)Z|mG)o(kH@MnIwBef?Y;n{-s9UQ(Pm$nKJn-uwPP zdVsE=l4xx+aGY6lsp~!>5The6rSmWhW|5*O+Ea{HRpck)<$*?pftLf`DHd*Tz8?El z0$J>aL)*_K)=;#r8mEiC)N~DJbRy>{xYqqDL^6W;>_U!^V=YA)q10B^ym`z6 zG(!@g5k+6g?F(g_DOOHE*;<)|1B)PL0bQ(*-Qgm?s4Qw=lLtRAenq#~9P`=UDfF$) z*c*rRvPrm49`))G#sX^la|tSh!Un|~&xFu3bw8%3pHA#)>)kF6`1eA>L_mX3NsCOm zek+l)d8yRtq}2QF_T=LAp8T}T4q$RRCYe-z#PNXS1k3f6g^oS=e@ZC$WUj457o`5>o{!xTH$Oit1APIi{ zxdiU-$Myd~rO=Ab0Mr9QP7vh+3cEnh1fbiJlWA%oI)zNCR;FLCc3nwo(ZLNfLt&6c z??S6Exi0~Zq%54SXvHkVvSXv_$l;=|lwM73cB(Qe&fd<>!ZWe+xp6kF1*iXrU3>b- zd#G*<=AKaPig|KXFZcUfZu%nn&yL$Uv(jOJn-&OGmvh#;nY z5v!@GNk+vEbDD*-e3a=z9INz@$M41XYqUIODfJR3hFWeizA9nOI>gw@>S~JULc(fh zcprxd>ML%uU$W6ver~SdBfEMJ`xCq`#Z0GMLDL1WqrB ze8X8+u50F|w)nIgUbmo40s~e5@_W?f%3cJ1cV^3o!dw`Em*3WvqK%_f#9WQln#n5J z-g@>bPl)ICqYF0vwzf~T1W})#eIfyBLkwbKLs;4*Y;M)|xb(lBtCXX~+ zk-@IY8%g!K?2r)4Wj3cX_j`@pKq88)Uiy>=){d$Ku#7Zr~InLR{pteI`T# z1%1Eo%QlK(pQg+lEw(NzVKY(bPo!0prodzaB=_g1<}aV zG?;e0U7^rPPD4{;`C{pz_0qO23w4OYa7x8t>&I(8m#pj!3Ik0%j&DoI)76YFMWP7M z@`-+H2-KY`D(}BZFj?pD%Xj#$!{PD1K$DWaVsY#LVpUy_?aoCwK0#UlNXQ<`$^z~`+#(8Qg`&gnl zlt!8v^M(?$!X_jiiaK8xSiX=Q?JB|qAq-T~Bn@@W!)QtBn+IycrECC!%e9!pdK6h;!OeIZ|CiLM5p25SwM`G~ zCyWtr-noPBIICpEQ+y7|*s%ONU}g(ATz;ITr)V_7Rd?Y%&uTih9z1J&nFS-mLPn`@ zGZ^J|Z)U;v-y08%yPIpX^tsCPMQm_P+o&*uF?CbSAC~Q!PT=C)zhu5)Fmbb_z?#{9 zo;0sIX^zeX+K%3R`}tg>2mfuLN4PH>O134hx?)wBz}>`$LJkfKoxnbQ^dIG>gfG;- z2JM%nh$74paz+c~+5?N*%IKt)s3WJPcElUjY&}CmhR!m;fsm!K7odPsVcUuq=DrUN z$*4SlOj}0LB@iqm>R(#CFwb1Nq_;x#!dG_nCf{Dryh(g=@GoLTv@=0q4%j%ve=Ph} zY_FyY*b;M9Y6Xd2Q<31Ysky&KMgj>US*Ej*Iw&GZy5$IkV8oxV<}Ev<-rM}?nl&+}V8$)y91qWAG0M)ZL`&Pb<06QYp! zm|I`;;@#dsQC4NGrL9(Wn!fZ153RbZ0O=pt*B<#MCQ`~|61%KoZSfJ*V%#(_tMJ5>uD`AxFz3FD46^Xi<{ zeQd_t*`(_qpeB;TdT9D^`hHndDnq?k2}EoSqCvTi`cNsjE=u{AM0d@Qo>sq%G3|DsyfHiptEve1Hq zsYP>Cy~c5ybuDjS{g5N%|ANaHEIc6p_GRjHu?Hdg(B8Chird30P;&)i*yzq7tRrEr`bq~&toGC%fhYN&xD;54Ni zgEGlp?g>)tsA^X~z|TJu04Fl%wHZgB;TNA;F|S?~uKYS$5drBeb`GE~S`Cf6ui&LF zKsmF@-rCz@p#ZRma7u!VL5t~lx5@YK!hC`k`wJ0A-{FrBCM^CdVd8mV)YzYN zxN9-bUmK8$*_s36#YYxlo*pIW%l@BqtJahjY5X!GAR20QX)KUX%yt`dmOYp`%kcUf zuyWt9sE)R`VWe9!&b&*dlpUZ;n~$`s?O2i@j8oV)6S4>ak006xk2P9aQPHtK=iEvC zye^38E;*kg$B<$!c6MxpHGY8i`3kR>ZDlykG_#Z0c>y`5p&t{mVGyy{#7~!TnZm!i zCI{hfplM>JasO%2;=cV7he_+>zLxXyVM~er+hvn|W6iLI?rZuA^X%n?dOmXY-$lXe z%c(Dl#B`7B9wAGfH>BX$0XitI z01m*99Z%X`S4t8E3nmL+R-4R9yW{_+++3IbP;OaVueU#_7hAk3IvN^mN#X}jCgLAY zrom`I8oer44s<#Q??6rMf0jw@xzfNDjDT0EDBUrW{yI2_Ixa7_(*OR6fNxb5wm}wd zki4+c${gTlj_EY*n^SqWgoQC5Z>irx8kazPx-1&hTCf|F|6JZ4&nE}AU32O7gmBaG z>MF^GNGoZ}_W)bOHz#lI1bH|{;w)tP(%ZPP$wGu;Ce*UXgUq~I{o$Uny~n>!jF#dW7x(S^Joodx@A2*9*!$1^X{@#8 zyyi8pF~&L0^BhSl9Sl^9o2=JxBu$Kv5WJfgDm?OS@$1C9zj4CASn*Hwc-2_+nwUpj z$eA*5F4bl`v?FQaml5bUo7`OX)joNxoM7qme70E4ZYJJ>AKkyQuwE)gE54qj$R$)Q zQ$+w~T|?6~hG)vV^HnGWlQs!hkZPmDAz{8&@&Y57tF1gVWM3eRh(C?+3K~v>uHT3aqPzR$WLpq5oDnrD zEQgUO^=o(=`8m!Y#vnAJ{!rSB>uqrvMcO~{=_{xnEi#tkzT_o8yu7%LhzwQ2jH{0Q zNO;P?{JzNlo?Xh&@oWYQm(La#BIu;Ko2M^4HYe%0w@X9mYQZ5QXh~gqAaqL{PQb4# z>#hD*q#AM3@B8mhQi-{$9r49!*x1B`c!{i#%r@?|qe6CsK!nmN>7V9Nb(Da^C{p>m zqW8yRQm&VaSxGNn>vSa&W8agHI0Q(!$|EL+>v;=A9k2DiG`u#Rif4FroXc?Mh9?Y# z;iT@A>0nwDVm|)6y$`Pn4VP^|zX(PQ4~IU&FCqe|Os6quv*795@5aOvURQt(q*-Rw zX0s_dTxa6&cc+PL`)(s65tYfL>8+n|St-brjXUa2m2(n*RpZ6l?V6Gi5^xL|l(_lg z8)o~|qpxu6X-7MfBk&rn2*na;^46#rQ+1`zC=H(7ij!PSXH!BOC zt9nQ4$=Zk<4w8-Izmg4UkNVP&QXtvTV2Fn3ldUKv$2<{ZQTM8Rq2#b`mKekO{$>sv zgNe$o_0lk(-GqirwwG>1R9Q3Sn|!(^JRy#y{OOzq2Yk}al@{(nl;!t8h3@x{r7Ip2 zC!>Pz#QoQ~rt%5vq3#Y76Is$0bn0+M=M*6psHc;T8Vxk(_7M9&^PkuCY z(dF}bzH+C8TAqF@kVp7@;TG9<@55sWoD>Q;m~vtQ zo)!d1&v{h{6yMgoFLnaDOi}A8Ryl6B@Ik}E-v#R#% zOihdGLnmjuRz=WB#b5nXIjNSb z%h3s)k=s^xW-c7QG;IF4x@rs?g@PqUS8(`q3@=tp%3zX%A+t!RdY_TLhaVJgN_Lxl zTUFVVp2{O~^cPoQ*_Aef-tGHSPtgOFPRQ&w_4!h~Mnp^E33!;bU+0UYYA+}g#Dl?j z)D5!ZGryi`$|Ol&Y?mw1St)co(~b@2Bm&E#{3YRIm~bMj0#=TGQZug=2J3X&oe6p+ zr-ABP!Y)-*Gf!Y>zM5%0<_pUb+zBHZy-14UzY{$!cuO9-;0_> zti{Cvrebhd;P`^q0nw1**+2RxJo!Bl3ZIVhO7#r7m)E!|4l+%P#d_Cq1q`XZANG7^ zEJ%6G1<3LO4ce~zZLM}bPD;lK9R^4lPP3}qe9Qd3_&-0soB&2FoT*wPavqmmO4?|p zEiLpG1c@jDOvpb7FEd?BB*xLGnu{y*a{jpi`Yg=(cc{#>2SYJuJ`6i)G$R`v1Gk)$OnE} zR0@^qCUX!X+xu!H;5?AMwj{Xg07kC84Gs>9&+<}+`LD82jlT#*!Tad=JU~Lj=08iv z)W~`16%|9-4%Tg6PipVQA#9FUu!)R1KPUQUYhFohc}nkH&iRDnYHTnNEe+4>z}x(9 z7PPd6mJ9-jyj;K5E@OnUHeZg1=SSEpD}3RObU$Dh0wb|2yhjsl3oa_BBtF_N#o#JQ zYsmABP~EQ;V_OuLD7EZxl=%7Ib&+LT0wjXO=ZYBgAS6z(`;Bk%;J@Y}5`LoP2D4^7 z9*uTz1suOtL3T+>&C9b$!^-m zj@rZv6e~YoRw}nxx5=u!`wG@eyP=xsoH$&hsxxERZrg}ZiVJ?wn*Vc3OcA+f%gkjU zZsL7SHlwG*cJD`b|C8^1k2HYwwf^QcMu7aSGWuYtT122jKr;+0dIr=0;s^_a*B5Ao zP?KdkliU!!1>uS+x>s6x8uFLQ#-GVP?&k-noe>33)EHUae$@gq)*JW=j zKSqK&;5auaVLev4=jR`$*6=N0YBBS(kZH9hlGT9HV8y=yaH2}m(}}GAZfWdPWC;|j zm52VQ#AsjGx_qa^TI~hsY)@}cc9z^UQ>OI3nks2?`9S%@T_X@PKhIelYh{OtTCT1A zb_2YKOZdMi6N08r*@}^&G@8DJ1>NhvyB9sSB-9ZKf)W}J3t@@$Kh8^e4=)xbMY~lp z_M4r&Z>iJE|F^4xX=eGDG^>5Kwntld9E4_d!vT2JY%rX!m}BEZ4pN-x#Moju-A}2$c*wnsF%(_ZmpyX zKBz46@gt0AMjTwThu-THPODePHfD61)zr&TL_&$k`_y_6zOQ_2XnM;^g@$6&UchK_ z@>)XFQzxxjpsKR6^RYbm<(b=q<>Xx=nO?*O=?h>K3)bSPLEU2FjJ^NaP_rY);2ClD zUby+EoAx?@U!6~m*MA@504m9GVhdtXjW~i{&(Sa0p7*`T5JV1#`pl~2FxPYksO}%@+_=TBr|>C4d2uUr zA9xWMQ*6bf-}MClqrs7G5jw)8Uiyymy6NA&k`MtYOkS?BuFb)&tuzsgfq{$`UzG)~ z^0u~mC%VfhTw2%7s+j#)4sjZ^N;@qvkdVI|38<0R;mHiv$aoYCRG^?jYOz#uMS<_`Ty@y;Wvd9vj$xuVPEC=+`Az_8Fl7J$J2%u^IS$r4j#Qi z2=d2(g`wzW*Zx}5EzjLgvtghzMMUGV>NF|FInc zxNG(D9&Ex<*=ykFXe*oII^7->DWMSFnJLq~dg|P@H_rWKgeU052^I|=$e(R5_4)9* zcs37F>GXf?j>YFNQ3r_t8J#w}mqI!*^0mQuOL_SOAyQW| zs|h)iX&OhJmU(cY*E>ZUTjE5wN77$YQ+?g7nD0TWzjh0^!s+$ z`;Zh?h1W_61X|uF@2!~@Ir=4hb$1^n38V^(Ku*a-O!+w<_Bi73l{6q+b|9hwBFTW7 zDVqTuntdI$c8~Szin3Gk7;1tO=*^h|= zKOkOVclEOZXwgof4J^M`*5xLWtu*X7Jn5+Vel}Qo%F?c$01$od z*CFo$NPHwSXiB*$ue`r;i8mk}5k-;=+*8j?)j9>YJe^DbFD^hWbjo^?)DlKVjPXJ9 zdq(xZOlZ_ zQ0(qZ`fEv`*zNy=PUH;eL>0zYZ@6kq=|kxyIdhE;KvMLPkIv}k`>;f|ti8ekBpV(+ z!m6vRA0C$%N-+I~8)p46dsZ{2d#we;7OkDd71}s%{PNhEZhKJk_tPZ1C{7^Aj0p+B zFSwsOFCXp+~+7JvZH=4b`Q5HQ!#A-nhi;>Py{6I=?EqCj^96zq9c?8!kA&R0i$~ zBIk~M>|w2<*AfKr0LPH)c)1PP@wH#;HF(J4ax|TNnt0z-!tS5_1I(Ai&UN6ln)+BJ zn2s5UWy-JDZvx~fz*^Y2LT78LBr<}wiC(7?Uc@VSCuEL6hc_#}D)zF`F_qbZw!o1I z;WWBUVx{f+oYb1)P(@i86`wFt@cxpu?QH#TZHur`gY6PoCmbv}`zy7}p`j~$!7dUW z=)?(m*ZbS2oe>DoSicK&8Yv?Qxr2ZlVrJ)M)k<6$Z?1*3;4&R2a_IWS=2}GchMDW< z+b2d6PeUyfGbU#bAV@7sBJCOhe=3LZ9akfurvCAUuDIR)!u4EY|G3|LXE&+@ePzYL zUns9NvB=G7Z#~HG?pfG<;prg&yD%U0$UO_QC;pulKS4Jo{<6P}!M~>kRN6CKE|}Sd z)_s;uXU^#_)_m654FIT*+UQYCZ6w<&iqAa`_r~fLa6}%ViG~Ijv|-H|KuT)6_kyc% zoraFy9;!{Jdv<*;5?tF5KehQ*@FDBXSkxgwpf}8QXpMj2Yx~w=(IdV38qfI1{+=nm zMt385N8sv8`I33*`v9s;!s}0$IX7a)8W{a~Fa_>2fH(AJOrt~*<)eDx!q7?SD&8$BN?8O$aVn48u8}~=&y7;x>>1)hO!Wd`8_ED7!mNyA{iei&JTfk)xK~o zzr)VU(#0H|Cx7pmPBvh8H`t29FYN0Qo31Sf0LIIQL#SyPv_S#>(TnKMmNV7N_-u|s zqb70{f0Kn4fg%rYAf7itH0$M0Yg0>L@Fr%br6rqz|0%uF4)2=F`IhPW9N%}r=OM#6 zL-kj^i-QQ=M#3Rck}g9^cKxZ*50F*69xi5`6VejDB+GRlHp)GrQ!VjjoG2U1Q&s#r zIWU0y@~1)eyjSotNbA_X@Ozk#*#YQ26rhtSF}fc1D?@OPor~}FF5)c${*D1Qph5|3 zVQ(rB>gi_fQaWgUmTgXABTGsL`_}Y*p!z;Z@BJ^Y&UagWchOjyo|e{Vzf>=kyD-nr zwzdKoK$l<+{>On}mu>c0T;UwMQox z6Jd)I2dh*mho=^(K>|Y3e8;MD&>$4nB5fZ#@*i%xyG^&opfUU@{j7OrBt8z>v@5<0 zI^ztz1apG0z=)y#iouBqY^_?GAAd+g!&DdnL!Lo9GJ{2d_f=p zTi&Fs9pX51zPs>=IR{#lZ6;~um!3Th$B2dGLrM&yUcH?n@*$9bWJ(2}t^~tgKQ<0P z&zhOiNVU>pdbnW{H*7g6thRs~i{PJi70LZlbqsDp=Jl3Df@ zaH_K&*F6>CuEd~xX71q4p5CH+?9>;T;um1lWp~`D0#e=#VqM$Y0zXNj%u>1830&@( z1=A&&!e=C&hmeq8c&zmi*{KxPW@IxTV6J^B6ZWRC!!Wv9#u4?dF?}eGP#YX~gBHB+ zbb4!nSa|B25zK`55f<{UU_ehi?b7YlbDmv|65Y^dk8^{S>;9P*75TD}N-$ZDmD)4D zQ#@nN!)F3xKb_x+tVUc6Wb*9+LNk_@C3ffeDrEQyYl-XxV$$6>*BPf`?HcR1((!co zuS_GbAnjWF4XmI^72$9H#p7a+W`yaBfER5KxyqM%2$))VP`fv4>b5o!(Yc3>{0L4Z zX8cFAvR~`@G&mNQ0;Wa(gRUbnmYwtz46`NM&3*rqK@UQ9?3v3Au}9NG9|sVxf3XAH z%cf1jP{I$`N4cATwpW&fiyolMFVGfvf>TA|DW$qM*Q{2;voukddRb1nEE5YceHx6N z!O^xk2-9AK%=U8d!9j4$;S^$}5H5%#rM_fm_v%2Lp?<#%s7Yif4UT5OLDmWj zO*bV|45Nw1Y0H;b*UPbtvnS#or3~2{c^V4PB8cJ7XfI%n);0<}=>O_tT+V9*dOTdz znzN^|osUhR(>98Kqw$We!;tU%vr9|+xa<iZsJI%$(ClKM3?UP9nEs_R-(Oj z8FwmLTwz4j;1HFpd%A8;Qoo(AHx7EEPAaUF2A0{(Q7@UR)*z_wI-u< z&vLFoEQI+hBz@hvREE&xs)M107(kARCivz>>9&ybYrPuS@uFsgmMrq4P69O{8cK>o zv)5Ta4GfnP?$?*M!wrC-)xf|{@S!Qdmw83ZF~&;7(0VEzZZq2UAB&exBoTsP0l+TrhLwKCbU)pL{Fz25zKcEejtjP2R-`$Qf_C1=3 zVWBgro4&tf)~+u2wU@!|ZbF{|*!PYv^j)aAgDh>!Mn- z9rwNzyjSXWS+5Yx*fBIe#!&7kvrGJg50NXpB=a#n@vfz%rsnC z7$02ZY;EWI_wV7A_rJDY>02Is)zI~Nr4`O%M5jR^T_~iGUT3}oF7Um6AGp9^=GsH% zz(nAe*1F?C%nd9YC@J-K!*uj6M<}#4)oo6b&GLz=z1wfDEbo$17-3ZJ}JI5`5`(sXI?+l~%k@EB08J&arbMtp?5@=QrO ztn>3>yoFX7d<0EsFYZoMn(nhsY=!KQa!1yLXmqVyG9~F3#ghej4gfOtV}5+tol~t{ zn7Ys)#ME!Xmc~l=3M!qIZ(cbJRT#hs$9Sg;JkrkYi#?sLPv4D|XFx_i-V12*Ud|q1 z*zRO#p%!!FCans~WJeJ5qB}e1>YJGb#*Jb2g=zY>1uvgOY#bXx!_!xBxZLl)km=eg zPx`D9GV&3f+e*d(5|mhI#UAf9hm64_`nW&uS8G2gWGvS$+*7H?zZ{mHygQB$JL>ik z^9!euJsIz0JluVU@9y5B-SD}m+Ge2v#^=FHt|W7LwAtlZ72xJjc&;VnevN&B#qzDD za$MXqKD3j%bc9SJpcC`YjxsR{qk>{Ie!fG^tZZ1UN+JE}WwS!=TnF%i8HCe& z$}YXqXIUyH5za*K5KOxpUKCMp7)+8PmcT&yxnL7ltBHq||A%{qZ85kWOwUN^nudNz|uFA8{ zW#0mw;&5py)o9Uk+nE@@l!A9a{;qoi#}c{-6B3}!+P$)KnZtE6Ds_6WLzf^rYI$n* zdE$4xbx_P%Jf*}Cm0D?&0quc8Qpz`?xyE7}PD zd9rfFfi-dZGy*t-28#|$6|M1pWP>jmRMOf#DohQzi6YR+hFHwAjR@#=5bx-rcNea5FIcb^K*X29_%yeFZuE zw4vy-dKqbya&*DSd+A;l@${d7D1q0RJiP^Y+$uNKiWwKwr z_cw^Lq0b-E6zsQrDz_3z3HFweY#w#SQ&JcX|D``BP^C!e=0 zuXZ0e6e&^EN7%X ztWJ6)?y0|oG73~z4`f7AE30^s%cST5%ru^p#pcUDt{5}Dp~t<5JUVxZDyitgVfk%77(iP6JtOil_}ma$<;Zf!95^#)6{1rr zH^q$V;ga<{Fcwf)1dh#W0`}&7U&7Tipnx)en$1vx^`$6H<-&ZMT(yW2`po8oLK(Of1Z(w%bnq&8it<~BzM7{o1jyoyhpdguy zb816wFHMTbc9L;4$cV95Zo79+axoY!1KlN$x-q(u4O$K?Sde77@4qae;m_W0;zmg3 z-A$)cyfH(zH;S?E+owP@H<}%ggGWNf84e$mxCw(Va*-$OI64$L0bmsPmDu3KCVh{^JT+kQj7phBdr@L8e0dUe%SP@DLH zi9qm;RR1Q@>~Y0WvQUeuo^`P~Ot6jBJdnzO1Kft?Gg%M7M^@rBbcHj%+UQuC_aP0HW5>(Rg~}f0xAoZ5e?NU!Z%5{#8M% z*7x8u6t!0E3+nn)lM%UgQAW|$N>QSqzmIvv-&A5q2lI_lULGjE$KLE1KTW?0{hjp( z0F=S7BX~l7Pt?c$@fIkI4Y{tpCkP((1h=by^aSZ@MBoODIiy5c^BP?a3^XhW-OskN z?&iw|~dMk+*`Z*!$^l|PtM_VuMP6Zi?Q4BfVz$(~th zq=1K_ffSY0`X1&vz0+0d-OqbP9H?4xB-n6th&dBmoz-Wp6OOtYdfB~=d@0<(Zbm-! zQ8fLm_dE%Crl0N%5JU4U{Qpa4T5)(6Mf7}OS5LI_OL7LK0WL44K;&Qae;u7kn18R* zf0&nHYi`?<|KI=HYQy1tg&RHJyjT0%+y_Bk|G|N)`sBu98eZuR&M$&K$TD;?x3=em z*zK=dqXg41M8*h3UIlF7ZgI4`aCvjxkb6U1v1e=dhpFMR- zX7+$qqQT8kEcsh*^sx=%@=BDxyfNGU?`AsroL6n)QA7y5jmj0()o-ND5!c1&e=La{ zy%T59DHYysnWJ^0+0g4>a424Q?Z1SPWc1GbfwUh$^E_Osqw%P6r%Q5aw-S!0 zRa^W&2ec!2T}C?W)HzZaKfcxsmy1Uc``DU&F20vE`VJOGUvqrUMSa)9T37Y4b`=v z#?#QyWMeX7wP(ITRrw&>3E_upXa3`5^!_d9Ta5m3oSHEc&|6;|ZLU*lz38hysGxJM z1M^P+Xff;~`;Lz-qZj0L7bhF$OUu-%%pmtg0ch@B;=M@ggIC}#uiYmRdUW4(3 zG*ePuctq?Zpbo1rxHI`)>-5v&l{BeqD+Qqf*URhAE1G|E{mBshhA8jqs=baGbp)&5 z=jv&WP7bl>1`$M9Q4<1yudsLUADts0m3S41LO4U;{z42B2ABjX+#9@95$Zq%RCdf( zx$B4CIC_7b#=5N3RGc#1yXU_J=EamkgzthgYl>O_XilGIfR6mnM|lMhoQ~G!I(q-f zjI!sLa&csn@t*-F4r5dZ7M)uA`IOw|7=+GxP7+#8=j3ldSy9yCr1lJ#l@|5pf*AFN zk8gfyZCIu2gMDkFWypLp*7*T1qJcu;3u&|kKyuJk&D+`jEhcJVM&5XF!0X%5iyfj0 zhn^4Pb(1BcRrg{tBI7}EtV9il{8l{cZ@PIHX!3rxWmCFM%G0&LLx#c&UaWP)h}ZdvkNj0ei$sDE_Z~j ztR}A%T%tnp>}(1lB0~R{xY=TMUT`QsfZ>G`?kOgJ60Ae`}=!Z_Izpb^ev`p6SN3d_L z6OY)Qf>>0c9><01%eE)BTbaJCkbGL7krtjHPtU|`ioW?%?uJ^f{a>i`NRmVZZmK~B zFp>`$kk7#WM1CYub3><57~po2Gt}7ifeh~QZ_}cHknT}5?v01NbQe$6j_Xd6Hwe&Z zU;TZhF;u_4B4x*<$qGb;hJ~hZ#4OATh=GOn6Ow!rq6{nQ{`?hNA-brl=un3AnY2=2 zs8C5_@x?{*5~X#_eEMIt73u)_dXabgfKhF?`Oz~ulwuSk_#eAo6{e0UxHFlTwNJccQVL)#Is=@gr z&}MQ#J)(T7ZYC=>$`h(@My>j-Qv0jE_#4MM8@X;K$izO%?x;%HabEdlC_Sc1o*YZd z@@%b>IP%ly4J#+*@;z$5j};OfeqDx^KC3ZrrqGC`Pc~9Hd9CglSdYb+jf6`W4y2U5 zrO!x+9w^!_vFX%R%i6D<5Poz#Uoh711+(>HTrAsX#&_)WA71k5K==l}@Fybdgt{zr zdU#wIj0VvsdqWNu8QMD-gwoxeP%-#XXd3GbJC0qBwAVhMku(Z*gZf49xpoI5ex;qm zDhH+=LV8|MaJLmpB)*>323QHlzMoDA@Hrh}u#!Jm{P5K*&`=Qgl%bIc76gR-OlO*y zgHYUH3|nm8EPGW=a`ahQr!ju_H(4MVm%xvZ@&WdQrh1-jc@jG?sr#dx)pFA z0-jbL9?YmfzJG8R8~pU9LmI2neO$9X@!js;+2P@jkq#S~QLBb!i=y1OI<@Ux_>&{K zGDZto^Y*>J<{Mqmh%f>HyeYF{fv-sz_fuX&DeW%j#$R04CFb4&+5Nw(R#PRD+ z9~jl_Ncdm>7Z;!bQ#``^dzS`o`W70i-TF=ywMrgawvkD;>!vO*@WB(OQQ0|1&lXkFt**CI%d!v^i!`9H$wv?=der1s;@&PhBs=mz z&*y<&ZXYxS&~Q?H%OSU#=O0QV4`Re@jK&)+z~Waf)0KTP$U?n|$jOuF6->p~GYA(u zd!aO2XZ#7>-l99p|A5^49y+<@yJoGqpFug2c%kwuKR!3xoppMOR}4Ms(Qm4;=uVbj z)tN+SEuELn9w(ywEE8^~{Klp^!2{X4-RO@HnTq>_UH9?ra*BXJM&zE|NvGVd>~sX= z?yrd=EG{Zu9omvDmU|jWo(>K@@FZ;OpLyXQ-`fxWd~YY={q>P4grF((VWHVH#TAz_ z2n*oOn6RNtjKE(LxKR-eE4hw}(Z`3WxUl3dg&qP3unt8pxM5GKn4zKO!w)*?ErzQ+Ncy|pR+%8Zc4cMI($Veb zReoU_cRO$S+735r(pdd5p3CWJQh$FE@fkFV&;@b=YcN-+}<_vnjSPoG5{ zqP|K##_5s{Yhxn5=q0Xo?{Dc!e|a*Q=vyk@+bHI6>2iQL`0NX{?k$a1tbNv|%l>V6 zER{T&Td(t1;;RjKXBm;N#MhzaiNx0?{hRgazG^FU^1`Y7E|lkc{J!S`R%=oQODZ3X z34=(HU$`2rT3p^7wAek|d&#B}(kKY0^7?SJD|O~8ctwU{(Pb)>-+y;M;{_^D-TU+p z=^BS!BtB%uLV|ocOJ<-R(&{8(vHZ*@`-V^*jhkNj3)^{X82d|kT;TNeF&qmEFTHX( zl~GTiscPE_T-=l1gtA{>b93ivEoYzD*#>a^*3d4mH46l`Ydzy;G8e}ESuTU#$=B$? z`j<{89Z`b!)KMDy6U`RD(=j)ROenRs^yr$PZOspBV<5e2RcchR{@5Y8GgZ*X`?bzD zLb!9HIImjMwTS2(y~Glu_5RkI;HaM1ley>L$yxXisRXXrFdjN=nj;F)3|KONbj+$< z(XF7PKees`boD`Rlxy}UNorjgXR1OS1OIFDw~Yh6Nvtjjd|7hZc|OhorCe4Dgquf` z3qCLRyzwc+pU2jx4zw_niww^-CQm!p-?a@MSt$I#&Uq!DQ?l_6hfbrUb$HC^_z+jO z77Y~+hyB7jbP?*#c6-%KR5sP%OnlpbKx16peKRZN`2jhU7Q$P0$TBRe0cKa!^H_}RjJ*XDkP|R=ryws%{QkpopzgVH=0r2>*D!mrgEo>pguPcqohY8((56RkT~D^tfE00DG&F>q`lD(z#l$ z^!t+O3iLhQy#OFZGMd=MJ2c;#AbONMc}|e_@zfGXd>Fz!{%+V zXL}NDd>Ybs8`e7<7ZiP*6Z*)2p^vP%mrB>q4i?T*lQaZ-{uDs$&M(X`U1E z*2%E;)Of8$b3lN}qFRQYsyks%2U1H8%XeWW5t^YGUPnJABo+^5VUYC9^zHZt)x0@W zkn_CGw&(xyj0suFS&d3%vkDKvQ^_@`PLRlFAR;NdL?%e4xo~ty5%`V%Ds-jUzj3(4 zPUiNiD?^gs8I>RAqhg7vlG%6u9kv(=-mvil#=$RdR-XN4(dBt4>70!DVn`T~%GUa8 zvg_APU^FqmwK2zv1x*H}9R9np3gGCAt>IY}IjLUzPOzGY_v%;tx!+F_Ry;k6J^K^5 z45P_lU-q0=wVVO+g#H5p-q(&_p6Be(H6m3qA7R(=E23=3BTAgwTIcQ3b7K4&zGU$D zfY6j$oe&-%CG~LPEBy1g_z*x|AC@_pjH&PMcMe{xoH+&_gVAWv*KkNbM%KcZoKImz zMdgK0`*7PkyMC$ZRCWNL;SDCU+qm$z`7O7qWltI#aef@TBxGJa*rRs3%y+6C@9Y7u z&|l?sRbYWJii>BRtrN6p0)7$`@JN^GYc)#j{$%a{SuI%Ezcjt^MR+Qp@VKi+*Bjvk zV_mwX(Zoi*PmvCb-;&CDXoRA_N1q;&!4aS~vQ< z=(cgb-;VZ{XAy{auJorCC#%-0i9mQN1W!Ks(I6I42^u%7SaQ5n*64x3C_h#a1gT|Pz2B=}h8l~|bfgQhf zD~SxZmg|m&j}#t_P0WHiM1-3NsdP1u&vwEye=J&d{&I{epSqz{R|3ow$_uwVJ+Sqx z+7YcRwO;^(gYZQN%-VCMiTz5Gf%Y$J@x=*QUa14$0r(0e+5U+;V=+O)nzBbI?E~{# zxqdC)dpzyl@0o*|J%0BZpNc`2ar~O$oR<=-*-laLsb>+8yLmaJe=k2x=GfEiC>So! ziH*{uyf^fap8M#=l2Nk4bXWD3Tc_GMi?FM_<(~EcO-r?}^zYTpl}YS`h%~NYCj$_a zjE52tSQHKnUuqiBg*Uhs+FX9-Bt1W(q!^IMdZUo3A*7gh6vn@mFmpum6n!YgmwhF5 z)LW(0p_~3lHCYA4%Os?T_}aLwfZ}sH*pXOS?c3`G!zdS*i2l6%hLi)IUh4O5S3S9| z=hM=zD`(6gc`v%1X?nM!ZeJsUYkWke?(Z&lxRK%0bG|oI=Xcqlvpd=RC$GgCC^4b8 zkSdmn?aJ}IvY&=*e@jT+w7D6e2QJlmU+d*tUe6o#Uxs>gylvm!9~4~ZD2tol#377R zLi(vmY&Bc=GlVm!cYH=Bk-=!>vfEyvYRfs`bk3wpR5)o(_+{H_6l`$7*DEg1LoZkN z@kF|*?B&kFLHQ5M8K@ZnoZ`(1IY(HWpR6!TXRBLXG+Nr0{3V81nS}0@4fcCdqS%o} zjcyz*qf$Ao4L|f)ha|4f)a;u&bxh)G9hJ5&*TpJU=nHE%IwO5TurU}O34B{;!VjXv z7v_h&fIy?Z?@HLSL^qcqp2CM!vH6z=FbG_-z9?S7Xfs4Y@!S#R^95E7!fGg~AFI$1 zOofE%cp&(zov07wq`HLK_3n7+%Q!ve$XlHnz5aZN0!pZ7JCkixBpE+^?oUVpUhGDJ z1{;~>a@#geUSho`H8#TMCqIHACm;N19q{$Ms+Gq@GAwc9VZUL3l=-p*wZ^IAe*DaW zb2)wOz{J>M&;Ysig;EnNHXar-Bcnq7U!IXkEHuz{*7H4%jk%tdTmDv(KgJObvkp81 z)sjaqw{znEYy+W{UT%=M3qd!aFueBbq1v3nB4TI9pLrCEs8D5>JONRhu}=^_{}6-? zzaPS(!`#Ob z|GMWml|T3VefggkC|LXni`2Qfj_9Ws+)~%9powjvYN4Tcx|7zyFp@d4-`_Wv^grI* z!dQDleSJ4e9B4K6sWywH4J1`CAvU zjf1x>_DARVE&8}jpaFcB#Tb4tgH(KYrttyDV|-SE4}3m%b@>2z*Pdxv@uiZBm$)(8 zz!$f-DJ=OO#Akep@8wsDqwI^^H)D}Ggb!b%EpLW}!srq0%WMqcTr;y1qA z87A*q3O*=*&-BeX%9?Z!zN9Cua}xQNGn?9YTO`9&94sN(4=lal!y^-PPyk&9`wo*_ zPsr~6`1$f!AJ5KL?wZ|kXvekT&6O-;9iE)cqrjv zmbEGUGj(9(C~y?^^IERhZt1o|_6})N5Et~I4&#(^wB6&9EkMuG9HIyVN&!XUydvTr zqGNINidb+1d$67Bf7N@Ro{(G*WDpef(c|fjj#v$lMC|e7*Yu?o5!Xhg(M$bc2IXJm z(aQYefBq~CUYHGqXKL%`_L8A`}Sf) z&xB-T6vV|!%B!Jl3=*CvX(0?&!88$& z-CR99#~$eVq#)l~CF~WBhZpL+H=F4rsdu_RjdFFo)|NHqWjb2~)8KRv3e?iQZ9)NA z^Dd^GGu5ZUiVH%Rj7reYmob#KlBI2XSAwo}&p?=ZM?py;)z)OB!QwgNEZlPM^{wV^ zvIW9!;aQcC>`@~}_jpuf{?I?&o^P{cSUyB^SV8N&7|HFG<{rLW=hB(}@dVVzNTkpz zkM%JUbP;7AyZD2tcvjEcZ!A6L1~7|2e|DgMbM7Y!4x=Y|M0r6VAv?b&vbRMKWfR9L z(&=;Ln45q)8=3CQtHYn`Z_$*J(_;<+n?!EfbSxK7x-G3JQQI+X6eu1);e#=G7 z=lZ$S%6*!9ct|su+rYEKdmaEKYunZJ+Sb3D-aGTPUfy4{JgD`2>bw~Cd^T0=1uk%J zrDNi+-4pFwgg~zB1YOj(#}08jS??HGvoW}viGbf7eJ=70xvkhrlRPtD@LAxCSULz? zR1=kk=iRNB(*4$PNR-YK7Z;aZ{tA_{OAgb`PhcRy;`JH9;ob}$BN!my@PSb%Esjb( zSgu?=g22Rr0PAW3nZf9dL^6@WHNfD~Og){_w_lW@LE-B~ z2(i2X!2zKlg(*gbDzisBj0a*^?9UX+TxB#4w`k~6w7q1A%S8zD7%3{aWFufD7mvsm zH$_^c!K@EdY(%@zl(&VvKKo6cm9+GGI3m8b)dR&j7peZ4;H=TepvnDnS{PG-$nZ}1 z@yNqRvt7;7`)+G+wLEsojB(U~qt_E2^n!q*7@Fc0Bv&bD0EJxIH&8C!_fuA^)0TF8 zJ$9!?A{76+u-chxUvU2^2{||gqN3l*#sjEl3YO4q^TyFMn6e+=$o#Ent*~a%^G6T$ z%WJ3TGvi|Q;*ax<=RI|IdPQes=*!sILie}o4-m0r2+Zcx>^2t-Uh6bzt23kO?Jmcd+uxaO}Xyfz_M%KnaoP@Y}`0s1$hQkf2@HJI+KVm9V89=@jc2!gOVV=PH%7& zs#=%pw??Q?4Xc^xW$fnpW=K+TSx%jU#bHpSeMH3Kn8`=qH?wfyao{VqlB$a=lgXXd zpil-2UJRv;@oJ6|)016?!Cxxf-c5Hod?8tHIuJLfo1@;Xq@H;zJ*bb>W34bxGDeh( zV~imf5MI6DddcrB44rwjMgdlc6ev#yKYdmjvnlj?xlY&4z-Y3m+cHIKM-b9Af z(vF#L@pU4dE?wv8ru*|R&_+!%#rrpoCYD9bY~^--q_9E^J2VJ~33x9uW~z)tBv#fV zQr|Y3G_(C$&J6Ok_CxL3INu@&vCE+{)@0_;*ia7-?$pTXz6@#QI>vJqrKy_L7WeJs zOhg!1ig|*tDe+@C*!ygw*kEK8fm-uaDunz!qxScZ`YNNN10O*qEgW@RRS9*^eECo9 z->|}7%EMyNeK#DhSGg(U2H~m8<$Ug)tqY?s)fegjFeGMqA|f@3Pykq|==@03^9=m$ z{|M_Qs(-w`#`t^va`8giIM27745-o*13vU$(!QOE z4j&)mFB=(%zv3Xg=k%m8)=fiAN9Gl|PYpj!jqw!$rz25oSE>{U)Qcq0o|^#SD`3e# z8ke9`<3H^VQj#L&1*gCO;$K@b1O#7vziRUE$Bc=Wbaq%(4TZNsUj^MZ1OTWam#(aj zN5xd_vd3+^(xvlp7Z}p=NtPTsS30pZQm5N=F0+0*WI`7AY)BF|mML;G%Znpi5_%nk zKYJ7K!Oyg9RpuJH zJcgpyj?TYAQL-<+xXc_q#N^`OH`W&^FQxWVh|KCE#@%6|Heh`A4sr~UuL_($USK_g@x3EbOXz)Xq_`*-u!4b2F z4r^K+{)+rxZ50qB;c1!R!1^bW>K6|$cUzg;?>H&ro-rj5n@=AypjSkIJ!q9S75cd4 z?J4xbj?#&-BHh0@RoZvZ63X!h0Y}9R+(aZ|bZWH*%oGn!u|r>PE~jHQvb_F^&>;6s zUWd~mk%e%)bl4|g$3y?U0O1r9P%`|JomKSv8k;PKQ1j4NZ3`j0!k7RHS> z5h1%FTZ|=JlC6-jWS4!(PK4|d$u3&#dzLa}k0!h96N6-J6vo=`bJsbibH2~Hp6hz9 z-yhH8n*UrgbI*N$me=-vf8cH1)K+VfsA0tZ6KoW0!nQ5yoOw2w0Jfyi1h7*E6F@F# zjyFJN*F&dVwM2!fvdgop?6$ab|CBRUQ%;<2E;x^E0I~1Hlmy1$A8f#gXf)R4>b|y@ z_WS!`#iB1@ds-)dPx>;vyWt;m67)YfUchdl4|v?f|7`Jqb`0X5I|eJE{C6*eqe#U+ z3FcoH11Iv6{SGx4@M1N>PK|pIY=Q=2KUxPndU3OrSi9fEpg%y%ph&+nyyBYdZUNcU z^t9X2l&^AMtRj{t?%E6IJ8b)(>YW28#h4&6vVHAUQz@VZJ1wc_J~0tGd%4DPZ16yH z=M?mP_i?8aGVh_95VsXTQ?HJP)-D#y^T!V`jL1vM&44W&&$vWLi#Tr^tp~t}(_{lP zwo9v>@yCi4IMfS*{uj;adE;E(uikiu65J}JI~4-`ID@&-jep^i{n)&m5q$K#jQ4s- z#ObE_qH^K97dpYAz;pqE5TCMER_NI_j&yy>1kSM<5$1i2ObF27sM*Ez%4QfY=pT19 zDo3msnY0$?F+y6hHtVa~uDCD#6x!($ox>GTP9+nyE?oNu2j3Ytn{nT0sp;9Dlr~G= zG06vz1yYfU42q)>WR$%r%i|)tHv9VYDv*kB!41&;ZjqwuUOE^MaEaZ}AX)03eimENd;0)`2S6!6 z#Or3MfZ6`{tJ!A3TtsDk`eLA9)nUYhti<^EwQE5<&g?YkV?41HTcOw5Dsr%u2hLC8 zdmyuUElv<5&BcuzKiBqiM!+Z!OZZXTnknr)1};{E z;e~hizHBn{qrUKn<=Xn_7wJ=f``lqmQ($XOaKW%7WUS%G!5g!~#-$-R6;@TJd)Uw^ z>B@MuHVcL}C*Z=54|R^V!*}yYrU9q5SW; z`FleSfl&qy6;b$Z&MO`r>{i|$5CzA61$8bL-@s`DBf@3lpMd|0hUvLF=%7RL_4Q*w zxV>Lt{mszc;iHRj-02lb>*7! zA(Z+;UPh3XzBy!7;SJeqpLIpxL~YG`p@#Y}jI-2w{p%xF>%CS|(M{He&pH-a*7*3PHZ}VEi%2B zl!&qG(siQN8X0$xzrrHP3mDMyawd7#QcQ0jpfQ4J%DQ*ip+F=$ONxT@Wv^!S#f=NVOM+ z<-cGVu(j~9K5#`6)Ijo5Qr)bx36pL3;Mq~va> zg95JqX%;^VvnjT_aQiq|Q)7l8<44d^;6Jp4;KP;4*sq)kVf&P``Pdxu&EW^&@D1L0 zj{WYZI0-?q^X?my%?WIgW2_g=Je?+s!nF5_mM!#L0g5>dc6=_QNU0IWNs8e)WQ{n1ndJ;e5EQk_poam&(uqeyZ?xxEsv%|s_k=e07T=&@lFl_p6n;UJ$- z$8f%S9ZBgFo1fS)yk; zbGq=^re`Z#0+TeGPcSNm6Q*+eUE|OT`Nu3yQ&pgc_SN1R&{wxYQS=2Ghz(91mJOE# zD8#8FQ#>6o^x!JN1aOk{`R^~Z*ATl>qId#(v&m1wmj&72Ze4kXj{>;QGR6MrJ>3yR zH3?G`i93i{^zteF(gpfg@`Oi{6N1$^bB!=9SHplpriT7OkEc`suE^72?`rFcs zy7@0|pt-~Aae^;utX=Qp(GA38#xF(T={P~tdSOfK=QBDmxGYXtQNYiGPyT3$maJPg z-2{jS;^S2xr>;PdtmuOXfMiQbmlGmUcddeh0%E7&7s_5_`<=|A?KIc8QGd}&m{EMC z^4-(8mn^QhR`}*H+=DT$d}v-oU(GLo^pwP9o^N9Si3hH7&l7;*9sBd6q;8n+mkFkc zIbM{P+RH1MOb@zQgqwI3$Xc^w9|KZHiY4dbVa(C|kIQr27e3!UJ@E+@_I@-%qDg0! zx(Q@0#tjUy{O;*F!i!OW)$BW|pVLm>#I6V$)e!gW>S4??sWw;6rU^ zue+dXKSsjLq}Dk!G4zm{jwyCs?m!o~S^}nDd6ZQ`fnjns_~^jKu`PY(JcZ1a=5XAt z*B11sqvcamQ=7ToSrf-|XdXObe=V?hhQjrwUY(>?-KDhA(zX6dIpwt*ZkNWo2e=B} z&7iy@r&|lb{#MIcs|{V&9JDbAWn1HyEOl^3D2i@_H)O;2%|Htp%{L;BL#To0aEpGGRc2u#8d@ zehr^ztK-q@xBM;EB76p3+ai50q&NNa0{qn{N6ic`%+$A++7< z>KUX>j#n@C$hXguwziP&ut(X_8~lE>l)h3$x=hr%_fs7*xR)uXNlzVuA58^! z9LtL$?+lDbldu7CY()y8`cw6ojx8Tc6&4Yo6B_ZOZa&+xb;bQ%C#rueG>sW+*tk~m`GretgPbdEd74OG&$X67#t4Tbt#TM0x%(x66NyB zx%8z5lqGo+?5PkSvxl8@5#mF08sw{Bi^FBQGQch`BFqXgbh`ivqIbg3E)P_NK#$yC zI$v~Nm|69PYVs(A<5H4Lnsf~)1FJ0bX}ZA;d|drohgdt)LER*1;%lXGBfLZ^&kuV1 ze}^}aYVn`00pw;F{^@4?Mf+7-CJ;aH5AwgR%_jhEw=x>+OfC?=OE0u10eH`9e_^DD zZ8(>o6kKmRHRFV9F~Zp}$Lc&#)*gXG!XG|*;v3(L=Yflh=0}7njlDIl2AWL{# ztczN%rZ0k8y+sz%KTiE(gTUQfnSLs*bUt3umO~-V&noRVvHSJDZ-2h;_wV3N96}9z z(VhJYqK0DwST8geoFqXrEwZLY9E$q5)epD%iYb!IWj+@4??IE)&t+tcd>#YrU7R~H zd4MMC#5a?^>avnxfAKA*or8(IkTJx>)N8(bWZ&BglV6mkn^C9wjS(8<6~g>@3*MSs zX}Jj0Pw!bvE9jalw4ltwL|93Wwvo@(EOGW`Z{~-CwOx5(0>yR|21S(CuVa`^*^lZ3IfnkBj5@oSWVybg?Ees*0ClZF9eDyqh2K|>)C z_%f@V=~TbtYyZC-|8l;y0CVC0Zm6$f#11zvDbcWXi7(cVNt3eH=`Q1mF`)T{bm7)XbW;ZB-OCD@mwZ`({&+(L zA@@B?8l<{hI%BUAK@6Vo7lZ#5M~aLj>x_q$>n1e7wM<)OK^*R;L^Bv3-w=Nd54!-5 z>OD3Yz|)=su}l!><+s!>vb2hQVV~0=J@%n#l8Ti!VVFw|ZJ7)Eki{OqG&`j=ZsN>y z8T)%!nWOEvc{|ySx@{=>d#N;*a?4e_`H#4 zvGuJ1lnLOu|A*S0m<5@W{6Enj7f>G^Ne1JEp%r8;#7RxhKyG#Ep0;|+Suma{X0d2! zpnatTLPC}TD@Nppg`6u&AY#z3K zU1PZX#MEtajYqtpKB>(yZILs5p25Ho48O`0le01PHiaLPSB$hR!!Ne#yv;v4HLofg3$OMVb=ewSUrp=k$4`x{Wp!o|KAwNRpC6&wA|HTGY^7z8u8Zkq>_93!=I zxXT3UO^*BQ5H0n;Bf|vm5E}}ZJh0vnP~FHr6pb*gb)eUZ$&5WxB*r;p7&7ndtYOG> z|7 zHUgZxX)M$n4vsyu0t_E2h&4OCoPRA(X{_FYyiJMe;tYzV#g{No!8v8*sHR zyWNkb?+001`+%X194TMf4_VTYpoJf&iy53vV>$tlfsv?^g`Wd!>#xfJE&|)H{q(r( zawLiyJ1Hhiu#j^x0Y7%k)yJo6hFE4H+NIZU#tyi5$||Z{0P)n?t62UEG6CGqvk7!2+*)jlDyG5~rEK^7*6V?M)aH!FZREZxQH%4MM6{qCFC4tnJD z^K=Vhh2_2wi?_leZB(D4%Pk7bIl<6Qkb#CKFn#ZjXG!>zZZ7nZ0ol=M{823EQDZGy zb}z6MeB;(*qzJbF8_0Pob>|)pp7Hk`>6-tlE)~2^ggThx|Gqv+{s57B5@0C60%ah@S;BP+M5^IJB4%KrR9UfZGx%kHrtIPsD6R z?zk7Qh1{6U2K3ypOt=asVL4OeCl$O{(KQ8Z3V7XxJ~v1Jy$bw#bkZWzwUmZJ9Q*bJ z)gvL~)%80^*aQU;k8RJX`XFM+=-#Vk1)2Pm(nlsB^gHm((RS*!59LUaK}TL#B$Tj! z#HTmmwEwgtn)9MXwo~x#Aid}6Dp%dTs0*yXv)^on!Bi^jtwgt*eF#Q!%6X8y2U{PJ z;Cyo3aGkjJXD&jvpxGj7bTf$G{=s-Xrwc%9^*%c=P}2h$g-Y#yg`+Wp^TC?~=cQ9o zv?jK#JXhP`jNmwG+Y1)XPU4_o;@uR0OS*QFkV6IdEy+U*XoZ8q2z`VGi_bfK@GA)1 z$YUfHWaOnPe&hy-xJ;*?ez~g@r^S!Dso8LBYb6c<|J&TL?5~p-g6xKRYXW~HqN=8W zl9sE85PBbz!G%0p87P(kZeC1#__>=RRsi_oYu4@sfgt@|a6~dy4lnwd2@HO)g2dQ} zf?tF3UTYk$FEy^aoM1-CBr(W-7J5EqEVXMVD=#pA#e9@Gb(uxv4op3L=q{Dao*Qa)bY zs_+uav$5s8gtmo`O#D>HlLGhDy?(Lur&AfiA1yHzH$>=bAE`9JbsawZY3?h&F~xs+ zOMFupnxzjR|r`_?ws+x&59L_cDA@pViD4S+M$lutH~pXJDEM0stOv0*w?p zDZYkS8Smk{ZyKa@%X%W>pAhJj?+xM`8y3)&k21jUW4#0hQD_+A%qc8Tp$pE&#U&*1 zqX^|*=YwO8H(jZRigmFO?wajeEAUT~wPI#vdYY+On$7LoB$acHd>b4=_0E!Iyo$DH zd=P$C4H_!av4BoPt)g9;k0Jnru$c$ucUf}yTlE&8LkYbAl?0HO55`H{_BUPJ2kdOtV)|=A=re-}Ap#klp((z1rI)lXzWmuCUPdt`PT z#bzKw6NgjFkxjLXy2Cm*+{|Y|y;(ssq-l`QMMIJtBmgORsZ}EO0QYjy^zY}ntlxfR zpOowd*!ft6b24?(Qg-qM4_j8`v?5ahv4PyFhw?++$G|q}5!%hh2@sXX@ukE5K8Ju9 zdj5#r6CRZ|BbRpR8%wv$9Y;$-|7%p}dg@Sg{F4W7oSk{+W<%L0uP0VnF$#>7NEkV8 zgH+XcW~BWsV}tt;R4JmV3(ENodI0V__UmC^-iSmAqa5KStsjwDp&2Hy;W9neSv}5Y z(zP#OB~ta5hf~(3t8=CAbDm$uv|$KGN4YUtj^OB!>?5FLX_et&vYXkaIQmHDN5PG< zb5@Mq2!?Ig7@rOot&r#wG1Q_1I$Os7?V_yK%HTv#2>7l?9_vHWBlaiyEKG1hTE}dN18G(y6v8t*Km`vQwP|Y7StR4(}M?U%s(TH zEPs#K)kYrSXw_yX-*JEvPae^@<55;2KC2q4SW+}vwE)Hv`bs30%WrJ#SVmGv8+aJ( zs@()Xk#XWbXf3Ooy>g2}3+2oVTG+k)#_Kqt|JHR!ZZM#!FS(t%w2!wRW^G&jmC(N; z=ROP>h&4G1{}tAUW^Ts;>hsvT72+(8u!ggDe{q(xmJ_F9+Mp_m6Mt1vw9sRwO60q) zg764mD5xx5(n`YsZ`OKxI=`^1{_{tQW9_iP#TjjC*<6mRS+aLVzDHLKw^7ue)ZXex zoIMS;9B+t{k~6Y`)hIEtrf#rmiv6 z!P6q1!X&`~=g%L*qQ88Vq^WoS_Al+Uu_)+?xbpxTxksAD#7;59&rVVIHPbLcCN;JI z=oLm;>>KAGmr#oYZw?;~&;1|z)BhK^>wgra{f&;d6xH(ggSt&k07pro;x5_U`Q$QT zy2ngyAVQKL~d=zuGOjdzlh|KXsL>%4JIC G_x>OD1J = new Map() + + // Properties + public proxid: string + public port: number + public is_secure: boolean + public target: string + public isOn: boolean = false + + // State + private internal_proxy: httpProxy = null + + // Constructor for instances + constructor( + port: number, + target: string, + is_secure: boolean = true, + proxid: string = null, + ) { + if (proxid) { + this.proxid = proxid + } else { + this.proxid = Math.random().toString(36).substring(7) + } + proxyManager._proxies.set(this.proxid, this) + } + + // Singleton logic + static getProxy(id: string): proxyManager { + if (this._proxies.has(id)) { + return this._proxies.get(id) + } else { + throw new Error("Proxy not found") + } + } + + // Methods + + // NOTE Get the proxy instance and connection status + public state(): { proxy: httpProxy; isOn: boolean } { + return { proxy: this.internal_proxy, isOn: this.isOn } + } + + // NOTE Run the proxy with the specified properties + public run( + certs: IHTTPSCerts = { + key: "src/features/web2/routines/certs/key.pem", + cert: "src/features/web2/routines/certs/cert.pem", + }, + ): httpProxy { + this.internal_proxy = httpProxy + .createServer({ + ssl: { + key: fs.readFileSync(certs.key, "utf8"), + cert: fs.readFileSync(certs.cert, "utf8"), + }, + target: this.target, + secure: this.is_secure, // Depends on the target + }) + .listen(this.port) + console.log( + "Proxy server listening on port " + + this.port.toString() + + " with id " + + this.proxid, + ) + // Informing everyone that we are listening + this.isOn = true + return this.internal_proxy + } + + // NOTE Stop the proxy + public stop() { + if (this.isOn) { + this.isOn = false + console.log("Stopping proxy server with id " + this.proxid) + this.internal_proxy.close() + proxyManager._proxies.delete(this.proxid) + } + } + + // TODO Add methods to manage a chain of communication as comlink + + // SECTION Static security methods + // TODO Signing, hashing, etc. +} diff --git a/yarn.lock b/yarn.lock index aa5928bb3..537ababfc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1721,6 +1721,13 @@ resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz" integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== +"@types/http-proxy@^1.17.14": + version "1.17.14" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.14.tgz#57f8ccaa1c1c3780644f8a94f9c6b5000b5e2eec" + integrity sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w== + dependencies: + "@types/node" "*" + "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" @@ -3736,7 +3743,7 @@ eventemitter3@^3.1.0: resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz" integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== -eventemitter3@^4.0.7: +eventemitter3@^4.0.0, eventemitter3@^4.0.7: version "4.0.7" resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== @@ -3923,6 +3930,11 @@ flatted@^3.2.9: resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz" integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== +follow-redirects@^1.0.0: + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + follow-redirects@^1.14.8, follow-redirects@^1.15.4: version "1.15.4" resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz" @@ -4284,6 +4296,15 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz" @@ -5988,6 +6009,11 @@ require-main-filename@^2.0.0: resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" From fba6c9ae5e630c75d03b61fdd20186effdf272d6 Mon Sep 17 00:00:00 2001 From: tcsenpai Date: Wed, 20 Mar 2024 14:29:49 +0100 Subject: [PATCH 2/2] added a possible relay for https --- src/features/web2/routines/types/proxyManager.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/features/web2/routines/types/proxyManager.ts b/src/features/web2/routines/types/proxyManager.ts index 964b5ab1d..0d234e5fa 100644 --- a/src/features/web2/routines/types/proxyManager.ts +++ b/src/features/web2/routines/types/proxyManager.ts @@ -1,5 +1,3 @@ -import https from "https" - // LINK https://stackoverflow.com/questions/46412934/forward-https-traffic-thru-nginx-without-ssl-certificate // LINK https://github.com/http-party/node-http-proxy // LINK https://github.com/http-party/node-http-proxy?tab=readme-ov-file#https---https @@ -8,6 +6,7 @@ import fs from "fs" import Cryptography from "src/libs/crypto/cryptography" import Hashing from "src/libs/crypto/hashing" import sharedState from "src/utilities/sharedState" +import required from "src/utilities/required" export interface IHTTPSCerts { key: string @@ -85,9 +84,22 @@ export default class proxyManager { ) // Informing everyone that we are listening this.isOn = true + // Activate listeners + this.listenersForProxy() return this.internal_proxy } + private listenersForProxy() { + required(this.isOn, "Proxy is not running") + // TODO Add listeners for the proxy based on this blurbprint + this.internal_proxy.on("error", (err) => { + console.log("Proxy server error: " + err) + }) + this.internal_proxy.on("proxyReq", (proxyReq, req, res, options) => { + console.log("Proxy request") + }) + } + // NOTE Stop the proxy public stop() { if (this.isOn) {