From d3e0a061d93bb8d9f80385bd95fb0c352618aad0 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Sat, 8 Nov 2014 09:37:55 -0500 Subject: [PATCH] Switch to SSL. --- .gitignore | 2 ++ Makefile | 17 +++++++++++++++++ src/entrypoint.rkt | 6 +++++- src/main.rkt | 5 ++--- static/logo-and-text.png | Bin 0 -> 18844 bytes static/style.css | 4 ++-- 6 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 static/logo-and-text.png diff --git a/.gitignore b/.gitignore index 1f29a45..2a5e9bb 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ run-prelude *~ compiled/ *.[0-9]* +server-cert.pem +private-key.pem diff --git a/Makefile b/Makefile index 7aa379b..8b52707 100644 --- a/Makefile +++ b/Makefile @@ -19,3 +19,20 @@ clean: find . -depth -type d -iname compiled -exec rm -rf {} \; .PHONY: run bounce + +########################################################################### + +keys: private-key.pem server-cert.pem + +private-key.pem: + openssl genrsa -des3 -passout pass:a -out $@ 1024 + openssl rsa -passin pass:a -in $@ -out $@ + +server-cert.pem: private-key.pem + openssl req -new -x509 -nodes -sha1 -days 365 \ + -subj /CN=beta.package.database.site \ + -passin pass:a \ + -key private-key.pem > $@ + +clean-keys: + rm -f private-key.pem server-cert.pem diff --git a/src/entrypoint.rkt b/src/entrypoint.rkt index fef2c0c..a1d1202 100644 --- a/src/entrypoint.rkt +++ b/src/entrypoint.rkt @@ -5,7 +5,8 @@ (require web-server/servlet-env) (require "signals.rkt") -(define (start-service #:port [port 8000] +(define (start-service #:port [port 8443] + #:ssl? [ssl? #t] request-handler-function) (start-restart-signal-watcher) (serve/servlet request-handler-function @@ -15,4 +16,7 @@ #:port port #:extra-files-paths (list (build-path (current-directory) "../static")) + #:ssl? ssl? + #:ssl-cert (and ssl? (build-path (current-directory) "../server-cert.pem")) + #:ssl-key (and ssl? (build-path (current-directory) "../private-key.pem")) #:servlet-regexp #rx"")) diff --git a/src/main.rkt b/src/main.rkt index 84ec431..d76ae23 100644 --- a/src/main.rkt +++ b/src/main.rkt @@ -21,7 +21,7 @@ (bootstrap-project-name `(a ((class "four columns logo") (href "http://www.racket-lang.org/")) - (img ((src "http://pkgs.racket-lang.org/logo-and-text.png") + (img ((src "/logo-and-text.png") (height "50") (alt "Racket Package Index"))))) @@ -96,8 +96,7 @@ (bootstrap-cookies (if session (list (make-cookie COOKIE session-key - ;; TODO #:secure? #t - )) + #:secure? #t)) (list (make-cookie COOKIE "" #:expires "Thu, 01 Jan 1970 00:00:00 GMT"))))) (body)))))) diff --git a/static/logo-and-text.png b/static/logo-and-text.png new file mode 100644 index 0000000000000000000000000000000000000000..117886d387760c8e14ef8fd4a93a180f9fe05414 GIT binary patch literal 18844 zcmXtAWmJ@1yQW0C!2w0OYe+#tKtMVMkP@Vk?(US%p}V`KOF}?Ixw*rLvgXPeJ$B^q1 zxFI;t(i|2H#bvUP=%8{$BbBXe$5zg16Z)rA{9Vh_%e>Q~!X1exw|63!ql)gDu4(DF zS6tZQoBbd0slPT_mzP#hKol7n$->TFl9w0X*(n*qEH!@~A=7_x z5n^eLJuz1@IY|>fBq5Ip35bPrQ%AzP#JMCdkXA7!aa~aL#hGAkbY^Jbr}c+d8~q>S zL}R*gpeTXV`3`CK_ddVRv6)#}ONxrJe*czd9jRpIsx7Lj3Q9~Q!orHgK*I|E5_EBa zW@$ga(57Bz`_yKYb+JotYLO*E2KTc#24y%?I9(!jG-n8@_`k0&H zdGv(7_^YH~FxL=2j4P)H1xps0RcLpH76s zMP>IDD8Z*(_XKt+^brIZ3MxvQkP6Zdn+{2>(hvJ(sEJ730V4>^<-I8 zaibsW5)_crP!Jk3!A>Mc+~6}{KJlsk3D;{8gpuLEv{l7*9Jw`%i=%66j9|7LNtG34 z-@X+}QjiFo(h|f_RrK6t;rz|EhIeX|+Cb?!Gq`d8;@(cLzL7eYJp{r|teu|yabY2xsy&>}N zi|LK{*YUm7JS925aQnsQFU9(xnQ-*!l6`mzg^SBicD<5D%cNM{6@C)Sw1I>P`%8}d zk_(yuks=%#Gjb@h*`I|l0&7BJ+&bL;@VZp%JD=-c8~wyr5F-qlGLj&*)S zt;54|gQm#D5Ab{05JMIGK-my+z9kj10CUL1B=Tt|Y61oiiR4&TL{-`6@Gnpz)BHm( zD#x_b;+gXDNue{T>=V1}u`xjlSQV80jxP@h5(EG8SukWFvSb!@nLC=y zXA^w<&_8q>VI#CaV;Tq>ntF&~3S9B@*z8k{`tvA4J8L?UC_*@ok+iJA2tU#I-+GA6 zTI`H#S$Qur`#@PmA2Ta#n;@?6@a5S+<;@SMOJtO5iBc4=ceBjv;K7qsN1T2?G&aZh z1@ly~#2T#OHzS1NLXvP)QjGdXEbfIx1Z(0a;Dq@;L0)I-cda8(qVKt;bNL6-X8Jo%%%`2CH2F52`wS0$ra*#qsXT~rhYY@I z3@IpM5Qj$aErxPxVsNo(6&#MjAWnEd-bElyU^L_G9S}Gr4ND>-jA4}={zm8Ut2f+` z;JYN=6*_e>H5WcDp>`v>mp2WClKZ2%d5ybc3{<)RtUQQPR3Xl0cM+n3_~O4-hImS< zR$D$}MSFvKUSygAk477jQy~f>p*OM*L+%Zzp=c=UtA z(uU+yi{AJO90E%SqwGV|d`I;JniJ_!{;{Oga`0K2n$O;*n zf23%3@@AeDKnh`H>Q))eR1l z^5^b*^V=*U80)6sI?_O^qx>d8fy$IaP>F;kOO@^;VK?SkxS8a)N|%L{D^r`=5)qAP zcrk`rNaSMpdMV@#@#XOdsh*2^FNB*`g6us>&{naj zKTEj`!yL0XN3z^WJ*KuTk@C0NRY^lCI;8x=@G<3q?XOTbcH_}BxQsn<2Kq)_QMFRS zmkfSJHQD9KPT8l*zSVaq5glq-g6GT+lN;Uoh~nkVcTziwLF9y<>0{Z>gaDb9xQC+)uTKsQ$B&dk5oY;P#y@(;iW>Um=S#0 zmM~*3mKJyIa_)ccDgz;vgbEX^)3c-}QAau5#w@u-^s%i(AM0fVOF;OscE79Bh6G31 zzS2nSGgO^esiKcQv6B#6&r&cXEq+Jl6a+_?ZpT^T{FH_RmB536AhTP(kAI=_6G!UJ5fTwSF}`a5O3O-XYGY;m`L#K(Y>C?SP_~Ie1c1-h+>Z) zhjVqIXx!FzWXE!vv16GyFYyU_u!LkjLB49ZAyn4DAfUaS`Z3kBydwI50-;8sP~4>! zBk!g^O(%`x#Tc(gnHBF#K{_w9_Yhtyn1 z!sBS7ATE@T3Sa%i$s^e%1r^9@aOW+XOAnJS+PWy`YC><$?`$A$Xefc*?c^{DIQ*w# z8iChg^z^y?S(d-=N*3&xun+gBr4IR- z#Dfxu^yra@VVlVkeOq+Gh1gyqpv`{h{tObRWGJL97 zC}ux)dwYA>x}pybzeueV3WhaBW8fngkAys{YNB*}uczb=$?9sISyUq5W_j>t2mxlF zD#tTChxI`DkqJH~;jnDJBQ*v$(%AsIrNO1IgDVEHiF}NVvY;?_5ib&iaTy(D{!)b8 zV8)fb4n!>~A}W^pN_T$l%1TwBc-N2~_ru_WO~`5osi)xQixi$?@(eO+0##FPGx>l7 zI(|tSrUuzmq6CuK^ysa*adWu^EO?PxM5O5%*rl%pqI&*&chi21f|MG%V$)`LbW$SG z46J$2x@(CbMp6NrkH6f71~1H>n9;I~EU!d{aB!v^d1=YTxE_ghEy?m*oji*9@6Q@h z{)``unL5JAaScM?bc6-u$<9{SyerS$7K}c%v`kM-hC=bOF<+AIkTd_sIdeCJpGge6ji8ujjm%ds zzdH0nHR_|lc#TX0& zc}Ofn`3=j>d7FG;aeU8xFVxIO(~!maD2h8eGIMgCdwF|Dd@%+a_NwXrzE@5{*!{$G zYcR%Ur8VKtnt$$Iu78f};oQz9j}H!w&(pzwl&uDbsGp^1(y*gHRvnS;-I z4jElqv&=ECDj!#xg5tz1>BgYqlSDtSo?K-4dE&+cD^-{CY-3YqWs&RI(;!#HK9Xr$ z!h3&9a7ZQm438M^BMTeb(?pZmnHg1e_5Lg&XTiNJ=hnlT4(&E427Iw=>YkhL_Ti=V z(l-mvzZjzb2|JkePpBHGO$P)MpOIArHMJBw#!(ZgUH0&Pu1G#H%lz_+C<3Q9{kpE8pdcvsew!)F{fDPe=Jf0cF-i$$FR~;w!LI>h=ZG(ifU{7g z8r^}0ug@rEL_S8ynQt(*DKSXTRfAP%7~4`Cvw{Q?kth(xh2^6{92W8LXDzqq?`7>f zpR+ICw;DbR1W{imTiM<-a#F{mGQ`Fb*w+WIhrFe?_%u8Gjrf^I-g+=TpV*Dm#3D=llpIPO zMR#?r!3KS3+Oi~b#q*dED`64;RvXMM@EN^OoZr8HGcz;im6U{yjL6UL(`6B0pm}U3 zyeX@y+OFw18S#2f)%He31^>&JFEw{}Aqn1!Y0$vK+MXN*&bE-w&d%;*TwGisVHue| zW^_i3UYCBuPjHfn+zOxCFap*>LmhIDYnnfm#b~{GgA4T(>LnP1aZjoYIKqdf$y;c; zK5ZNfP-a-Va3NU*nCB&L$UaTvFv{}WO}ANX=eN{@LQL5oavH7C98;3! zg~i_6N6C2QC-MZO6BdKB_+6LGdVLNswSg_ix!U*Ri3|#@*PBu4JZ4xbB4<)>&tF|k zyw=dvG~=IpbFwiTOBi!2G=(1A*(t)={*(4?m3D7~**C$vqejZFD2DSj`a;5Xx_ua^ zg#p1h!A>MPN4ycNSXdfL(HRu;M1$hLC!jdJ3-v+4ctr5z^r8($2YaX$%i%LOmVTU{ zmF9xo5jLw-t3N-r*sYG-?B$Nz``_t}pU=F?Y5S3qvvxEjH$Srsjhq#Z0nk z@#>CTui0k9z2}bd<1;7OLGBLs)3L>~=^DY=&(~77_`Dgy(dSNSBa-VHntheu`;S|T zOyF?pKg;+!2C+CF6JS^TL-i@g4O}v{ zi&;Y}bGle}rg~ZSd=X1H!VKn3TF}R=0I_=C^sb@^2KKgH*X7&sA&igxS>7jYIYT$Y zqMh`E zM7Bg1Yh^XYrhGgipsG2VmLwV9Hnx0&8YjRa$1|+CSzvtVYjIp#+|fod^qzY3Xyfu# zI!kff6G0*wNZAbEAj&L^NGc&z$7(j@X<^gTLbsPijRZwDp`qakbcA=OwK!{dVYW=D z9&6kj%b^6a<*Z$?R9tBy zZ(YVse72t(V18zbMtrF@fM&6;S<|AUJzE;PH38aS~A-jTH zR^=|q5>vf!K1o@f=mv{zWfe>5W}+~y{%5AO)|3^d;bJTOho|(JkFlt*3{EfO!CDrF zQDn-Z5*78R?i<+u!V85bc;C7tUdT{V*4a^ZUen%hQOUP|_zK+&wUnPn_6IvyC1$b%=Wn2fX5#yhQDfMPm1`p zL-Y}Sv`rEAa88yJd79}PD5MB9g7)^8V2KynoS7~!FLjcZa{@{%H8eCXisSIngFiJl zUo|y1H%mO8GTYj&t2G`7C!7I&TVG$v(GgKpO3KS4N=izM%f!8vL7%oeTeSE!r4a8ybo}(sxIZl*b&HM3PvHXbWXA*f zhpgc~2O4G7$u`T3`zOk8Fv^Ebpc~P19Z$o$ao!W&64UIWFS64w{uOUj<8XC%-_z)W z@S5X9k#TGe5UXsL6~-2nlnhR$%q}g-gLVprW3%)rqUDEIRL}hmm$$S}FQ5*B`$b9G zpFR*ie(ph?oSck?Qr_4@9@cA->pS>+=bKKqkB~wtrx`#+IkEf6NKO)v+1XjkX#Q$w1eh%uNwB!xPu?jDZlIBIz8gMTY{dMiZV_c?ZN2sV#oBh$yusG2*883F@mJ%w z3+3yVUQTjjs0ixC8W<1vb;Ew4_E`Cwal4qZ^W|~Ny#!^dnsd+WkN8}ClflnwZ)mKo zHL3aoIP})H;xrpexfbe>+l(LCEaXKKMUc?C35O-~;k+ioQ#d%F-x`!VIIO-*U%B>Z z3w(ltS+GKc6(HEg7_A|Y?E+Em^VrLFZ+Q8J4WQ7r``_Q%E~XUjDzMEZb#%zh%*>v- zOh_Qz-}U?x28*~G!IZN;r)OVWU+<{8w@pgSq`bXkUAyyXTG`}ip+0BODr2xpr!kG+ znk@CbpAbym!0*QFr2Ee9hsPGKmb1qL9{Syk_eSWG-#-iErY0vP!0cC7S6^IR!E|-y z0W&I;iP=0GqS|}9b}jSvTuV#K`QdW@{JXth5)pp=J35)@^^0khJ@9&LxY%H};&c9; zUB7+iT!`JEGwt_pC%`)rGqjlE5V#ByHmQXKcm*+5C@A$+dM&X4p8U9c_Z6skW|FGN zA7EE3qG7Dg(&lnqj&uG|xZAiNQ=KXZRd^6r!fs9>)KPs}VMo zG0RczRHeXzWR3Dof17^c*K5Yv%t%_7UV`={BaLw6BWVuuw+MMPc)t946)|`y`S=%@ zEHhX3fQky%n)UUQFbDWhWktrThl=#^{$P z?-iNhPyblapfTn8@E~4PKEIIN*L+{7h+b+eG3nLL3#FC*SZuU7uYCW26#$AKp5S@_ zvTu&}iBLBH#a=lb0G>XzYYja0*%Kxq#r+|09m?es_+rf`N$b6DGQb7PIr4bpY23kF zerHj^VjtORJ9&1xLE{>newXp^8nZ%Uye{dBA-8kMZy#39w+GDq0Y3~p{^)Brv0k=j z3nz2?9KPk3!6<@5!Zu`|TjdTw4evd^F4QL)LX#p{vUOS2b6uc4*#sl833o;3i}&@7 zzFs1~hv`J)JWty8MB*^fP*yy)VrJ&&&kLy@nD=hVMn*=i!Akcdo=sx*pX^5m!O>Os zweRh&hpk{=I?Ir`J#!kSxj&2ZH|-C@^*QxkQz(xm=fo`R?92kkG6j$)xUYfd4(XWK zoz3`=;Lp6^>tFr&ZGUeMc@w3rt=YhV-2wAk^mX58CX85FFmUHvDzE(yk@>wwlOeo$ z-^S2+lM6Wr1p!$QQQq*?jsKcBh zxV}&~yHIwuv$g%z`#4gAQAv_9dPlhk`Qd;?KUG7EjYC^0rl?$wvF~M(nVaREO%L6o zk6Yw-sI}R)7|gs?1C~+Z$rz1T7XOFC_c?<{Eo*)vw?7MW{LvHF!KI8--NsomR)DHl6j{^<+~DW>$1KYkeaUH4Nt0TJUu z-x+|zNVb~wG2v51>$S3qip^91f5M0jI}Rpy(3v83AY+G9R7#1SP)0109gFCFiF!sH z4RM`%@%}I$Czndw#B-0l1}WJZZv}U{Jq%&Bw+JQu)T&j zZYW*AmV)kf+T3CQ9IYUNzR9o+O%!F?=pZy5ZS}O%OV;u!n0Bk`BbhW7S{HqCG6TQG zMYoL*d@*t5%rI^Xyf7o252y@yNOGFV+X1NbhjSACD>^SpH5td5y?b2hmbgb7-nJEA zZX`lG=P3OyCf|7OBx{Mpw5S(DcN-l}9{@>p_1UAG2 z^+t+c#{T+d+y8v>DIURf1L(VUh3=Xzw^7<=>+Fb(IexZ*4Tf(ESr@s0@wQ{AsWX8F_eaJ8J}G{TZ|dIn}>3>9Bw-D=}qvkiHi z$Zy$^2f&5UK%aSDn&l+Fu1FpeaM6uSpF2{6xiXFE<%>r0Dl|9hQDjU5b)yBm*gFzH|t| zS8vYuI!=1rj&%_=y0$c#M{5@Jim~~gzphr+)#(`{Ev)}HHuk3D{WWoiQ>ZTr=S zEwmX0Z>;m>bMp;U;Hp`cmoX15|VLL8s zzJH22Dqq4`%lD^C8%@6^!lQ15PdoeNn6kHp&=G>dtA97+mb0>q#`Tc3``s73Ie%McDW2V^g$wS2=^6q8hxxm?U_zS<%bX z+@vw~e!rjN9LZ5=oWUPcseS^*#RClb-JkdEE-c`LmG&2yyI^|@tY}ugt#{avBxBe9 z4EQb&r{HP#9p}gAUS)^Uy^*y(J8U^aX~6Z|1QgU=KXDFOF0XbgL-f=X3^c7acun=c`@L5>pFXI)?fD4aD*S9~sN>)c)bB>8ossB=AD(-Z z^MOSO>L@}g$&*k)Qc3KjgN@R6K%y(me;3ZL!p@8SCj&%hcJ zU_hN+EkllvA>_k-a44S=O#1`WHp6s#SmS`cr5W=M^5WsUm^s<9Xsx)*Ye;Bl=skE4 z3ji-HMGdMD;}`sUz13KwW|RD15yBJsC2rt*sj1=&4!hs4V5(nWpUh6T_T#_G%E+Kl zF;PT-5wQO!T>q8k`epb7_^(4*+0o%0aIgnNo^eb44-QNT7&IP7^+Ra_wi#Q0@n7A? z6RU`Dvl)wAuLu8EncI7oPxa*Ymu7{zxZ=KX^{iY9rTvnGv?*sMNkKd_!WajT8Ybkf z-a0i{3;HV0A32B`$YY>u%E$HNsqc&aK9|6dvgb1XMyB0HBw#!8?nVC;J+=FBpT|Gn z=xV)Wcmj2l%N0(4JO&NRm;ZUKUBzB7{i&VALj z#_v8sHUx20Dr?%URMk3`n{7?NYsKrZ8qvjrGY{@t;?|8k?krzgo8HJF8`YgS(8);MrZmqfY#myD?dyK%#ET9&I?sz}be zpJ_gd>+Adfi^aSCNjDINJ5oLOXw;eqsjG|9{HTUlY(@D?2 zzg1R#!W-dqv4$PrzrTEHv)mj51~D>CY%E~8;D0-v>-F1Ir{4I{w^Xh_KF`>emX|#b zt6Od{?3gj=h`VoRYkxnS`mZ^z0l`YA&Jg+g_wPF2MO_axR9O4|!vW!6v5lfZ!xwVi zt+QF=nK$W_h3rQkEK)~6QNjY_c`PHQgj3( z_1Z4OOX17?3DjRckaV??o6NFCV-iDw>=_@DKyM_=LYyu~e|P*C7k5e$vP;-W5U$q| zMmneZO*9HX=qeaZnl|7!0G1LU@a9-j+fER>qR;il$DCVlO*u-hpZQsigXB4bouCZn z+?Mt!aCHrE4?TNrZEgKFnShrjJA~W&%Ek{Abz!0%fZw#i7=^PN{o4DIwG8&ZE`PW6 zA|a;oy&!C_=}1A_9m_t9fP$Xz?$70caTcbpyOOq;pd7^Uib#0y=cL0?J!?ZpLxaCJ zeZj%I&huDrttGTX`f`tF57R1>FKoo)WO!TWbaB_wcXkpVu9Dy>^0!ndS?uEb^bs1e zX6!02_PRqs#o`7aY4>~P5M7)I4}1En$EdX-8?&E1kDKPb4)6sB^-P079r`FvEpBF3 z%$BK9L%Rfqa|0UT=Fh*Kz@3T}K53Om`U~jEX?c&Z))*D{ca zS|XlQS~i`5{Zs)Mhmw$HWZH8Tb5yfRz{u-A5E_p{LM{i7mx?J)j+x~7*U(~$GZz~0&X;ZkT>?@)VF+~|3K`gx{YT~t)`*wVvQ z=!ysm!9Wu{8z2__zP7k1L_Zbq)RZ{a_>F(WjSrpCBI7a`ZR;}3{^3|oW$1XI9WsDAE~?=^cNVI&u=e0o|!BQkS0w|Cr$mbZ88b)!bN9LFDVlj+qqw# zlSvp+-k8H{_#^nLrMcPZa#qV?XUP)?+veGcUV_|qD}sKA(@U`>O$&Na!o0fi!|i3x z&^DF0LSXuJy1Xv)#>NMJ$U@dRN|T;on$(5XAN{1mL6yc~ zG}3-D1tDP28G+0dm**i3#(m`Sksxn>o$qJj&R&9YF;}H_!2CqTv3$nXS4sY2P{!=r z2g}}YnMrk7$iYW@kV*PhRsnmi&d*;GWy`8kswm^Y)Zjp2VGtvC>HWB-`}Uy934PV? z?pQZ(D7HNwW%2!EMs5Awk|4OyeRbl+lICK4I!#h&Z=FF8>*`2VVJB4ejUq} zp?IR_Q1U}#+wk8}k;sa05l#SbZUO-1aF~>S;z^;Uqw|&0eWiY0mO>K4d_3oSYR|pd znCPE(j4C-ikCbolu(*{ti`pFB1Hk)TiS?iY)Qqz25*XyX` zL*znEMWui3FzL9s#;3c+nj(3=rj}}9Fqp}vUkunL^Awcb+L@1Z(7b_`{g&4E$WP=s zs{&lsi`uwEvz+qHM^!Xjp zV4r4Hd2vvralm$H(LXn8`!;m*M=)SVcRrVu?~4W1zE5y)wrvw3ScAk6iD^^>F_RP6 z)1ZtEH2}~A5anah(kGa7nQ%e?um88VKng8@t){h4bF=5v?@tH2PD4nX*zE^sDTap% zd5xv+d(AKTAw6F@k+?%6j`{t=p!|76dbc2Xh1<}W&T4HX845x0a970+b>1RO6bis7qE43+aCFOJs6@%=`Y ztY`JdE_y`X<*C|2M86dV7juB+v|&HGoJk@5a}|qBB#VZ+%E~Nb;VMq-wq$67XGLQi zh!$)NKD8g!em97T08sva&vTs(YJS7jl{dioVIXEybeQew>dO8|<(CFn>noPb%2YmF zJIunmx{1rI#nD$JznrKVz8tr#jrl*!`%f+`q|IL24AWA?IDJNbY?{2ghP|?s+bItT zF3&y*>9*H->{V2RElnW}?2kz)i^lX2Zqxk}R#pwEKgf^EG^pJm=r#*Tr(KW97le|d z92i+%rxMYTsdF|z6)=P+7c*dX4CGs)laitrzNsXt5q2|8BvUj^6gVo%pRQ#d<#3`g zLb~5q@!zbdtoi+{NJCc_p5yycQQRbEh~^~8v|z_cL&n)NpxCjVa%&zS-BZl#K+Ysqmp-J-#1 zM}FS)3@k4c02aW?-xpQ2tec%VDnJ%Fm5Ymubz;6f0&oyP?Ey*20`_N)KR$w6W0SG} z^70DsS{e(BZj_@C()h({gu`Mq5U89N71-|AflFs>$!NJfied1!%c5w!EP zsM$(Q(GwD{mz6Kz{IT?;mh_8URknM|(hyr)$m9oDb@T<%N1lNBSr!($X99BlmEZdg zaLs(}WBN~x>=U4{gi*xtO4h|f*yR^l=u461>ZQLs)*i-Oy<+DLyknA7#DuE#KUY!= zR*SWDb&0aAp6AfxaIM9V``+Ik)}9}}|F?8rPsU}C<%*SVW6U}jO`bGcABJL3D?DHE z3As{&X+q|ov9&LXdm@jb99=2JMLO?BnhA-c-~$02p?3GXM~6Zy@fuf=8qHCPiD5rx zi{IHC9&)$0-@-zFVp{eK-7bsEH`Ue=SXt4V3`zQRTb%nB#AUOORz^?$v)wl68P-g$IQRZKkBEcT&j4<-as*u72c@NxV-}DoDz(uq3OI zmEF0v>H56H5|%{4pVXSC1$jt(O2}PvL zUyB=ujCExq^c|TN56QM)b1VRO``6j3Mq zSlIT0OXZ9HXbvv$ErYHUYv~%BnpnOX@5t{^ngzD`=*oRpCfhH;UC6e4FPh=#05+gZ0Sxz$FW)|k=3YU0gJ2bU&e3YOhBF>oDwiPSf zAg`vctv$@;f1{vcA`|!gyQY@@PW!(Meru1r;}-qPOL>R^eY9^36upoW#3-J4?iZ(u z#C#ne-$U$7ANH2DYEo~QQ=>_360|*ljOJ(2T9-gFWq$;FRWokKK!T$X8z&HkRh!z? zIW+WI`lgCO*pVkePJmKPFd^*e*S?$(wKyqwl&uM!%$tuU=z1MW{q%VHS}+;uMD)S^Fot?t%A{!n-w)CI<8DiqK1|N`cmSmEUEGjwcS-J z3R60x)*Cf007yXc=T)Zq=HI(h_v6_8*^Utfb6D-ZFepW*J^#dxkB@V9A3N>(9gzm( zhTj3vwJ{L_l>X-`mKI`nN4(=gEsRPT1Hc{X%vp;6%x2`F^fd_+HKn>0?t+3VIT74Q z*>BZfM;xYaX2yhj7qr?!JwIps%m+F+nqI+IA?igj;eIUnz9Z$@BA4*+z5fw5yJ>3sxeAm)X_3Ql=S_7`Yr_B^S zyR)M&d{#5een8Cerbvo`Zxo|ntI}pLhJ40si~a6+k$#krXj?XHU;4q`I%=I=X`$s0 zk7{VL6pwldf#_ckB6_kIqNp$7GKErGjs@+?+tVr$K#=RIu9n(7LmnEXH(Q7p z=dh&L+_C;3zSgc;j5~RWTn|xxuKs}Tz|5I4GxK>kVQLd8WyH^@rAWIa{eYPlbzy>f znd!|7)<}eViBJ!9zWdMVSezAe`LdY2s&)O;C6eID|JmC$`TO9G3pmePGwLdrB6fAZ zehbSLYuVe{UUpsw%PapZj{JcrcQ+6%;GjImjpm!2o7*k-uhFm0#zb9UWT?Inwr)R5 zX{aoQHPQ1-@_D_9DR3Xeq2)CvNJx}b!B3Das=d6rAh5J&YA}A309p!FR>X+iknEGm z<52e78I9xPk=S}`t@nyD4I~moIty~B@S&LyOjT9G@7z1^P=RC%IQgP2qw`nWZU|cg zspV>H$41!Ga8udCM69SMTw`fuONT24vW82aEOU0RD5Nd{5w}RL{sZ>o_*dedCmuou zFPlc}{m!4ht=8SyU&vP-ZW_R39oz+u&xK1gh%td?Yo%fW+R7{(_>3d_XOx(9SbPd{ z#H^fjh$4XDMc(Ql%yHs-8Z1G3cdBA~>q4ukc`>*J{K>194{+Hxj}yLUM)>^3Ot`&; z3naS0WZGS*_ff9V<7Mn?N7$NdpMrmN$J7_NVT%GF`Udof&Q3)umX4PrR?-KiWh<6S zrgs`UZYzT^Pa9eHuqr;8mDK0@UZs}`ty08bV_~%(HGC8Ko*gqZ0v`HE=-R3;1arl0 z*)}IG88k-zUc-qbJ5l{L50Np~dHp>vPGUsp)FRt8Y|2X(V*DopbWT)D3<=?(oeMyKrrsS+hRV~7+jVL?}y z@02v(b0%PlgUnk*)q54wKXzL53Cg0$vGiF-Y;r_l@ZmA#XxGDdef`*)rv31KsK$W1 zbg29j7;KZoWP{#On<1K69?wSM-Qf#vpev6o&K{}PLrVs0cJFvm-p&! zuBCfNsIqGLvjm%g|HEZfbnn{3iTllDoZq%*7G>%?CrseWTPkFFY3i9f6?uS4?g6A4 zk?$b9*Rbq;4~(f_pvZV<^wibG17GS#W5zV*`@5z2g$6Th;4(y(Is#mOv7IOeqK#P< z#Z$Y!9|(eEXl}Cvj>AmuHf`LSzMH~hV<8e?nG2>%2szm3re>3iA|s_}rM$c&Y}S-7 zzQ2eN;3rfnD?Fm#{-VyRU-SpbUH4fEhzXhcipnTp%g`63+>ux@S7wa(B*Tbs`qH=~ z1w$NY(MxT2^-rbMyzpO_#|CZCL|MCgfz&xO{SFi(uZ!3CqI{K1 zGdAjqh_$QI@0dGp)w6301&~UZO;`hjCxHI?1R=$FdU}EYCb!x9+5@f^`yAbWx=uaE zKD{&_h1h|XKL5~jw|eS@xBc{m-7{cxeqXY-8cpN=4^`v)U!&5!i5+Eq6rG9{kWs?z z|JP@HNLJ{5dv=E!Oor{NUA+O$`c>&)vD9}o;d3(tLPyX7x;I3aq2X6oL@`p~QiUT6 zlu?AX)^xh>Rb0McF<3(5>5qz%Bj`tMmEEFU6x`lNNx^Xo%P|)h7vDhkXH+jPY1G_S zz;zp#j-`yh@J^JIQ(;WL%@h5IO3Ih6Bslm+NFu=f(b3X)D(uD%B9x_D-N23Qh+Jyk z9OWGc-Uvf%*j*H7d$`%R6f;f2Q=rFQiJ)s_Mga+AY+GwHy%?p3?+;d>MGq1*d1kO@(J2yY?ykuGG zsjP``#1J^BrfrvEUgZ=K`veY_InaH4>*+FI*zW>EI7wDfH30ZhSe3J%} z7+0vfNL$54X@6&S=d`?+oEt-lmp@4<$Ui2+quU*S^UjCcc!Y$RT}nG9NU|&gvfM)V z@2|VZI`So7uE&Awo{QBVuEZjy;7{A}6_|k{2h7`5I*_eF8WV2P%7j3{#Nb={O07em z`}*EyTM(l>*v>S&3_p;ZyjIqrOsDtn!y|LiDj)3f(gR<^P;k@EFbOyq6tLOEK z?Amn!AY9=4`Re_{ftC*Gnx&16>CNvQu*Fi+c`clPn#)A^C6biwgPooEMqg;no(RHe zt&~(8%@NH6U4Y>bMZwnA7DN`<5M&lr1H8rtq&U;SxXG6S>n*+!u{=buQ9e_jYA!ZH^0?;HJ9#k2Nw*lvI zynhuYNyEy6EeYY{ zgH-8Pp4a-5OVO75d{RuWc*=0fkEDcCEL0q8?ml$8T?d$;%DHo@o4^m zt92da@A<2Lyllei0^qV6CNZOjfN|zE;M50lF>J-A;9wxKfmQF?5<$K)1d~|s_|x?D z;<(@L(l>UKlLKYLO85~`5a$fhE_`6T2EE~F>)jQm1UrGM8;He(hxSXkW`CfUWG6ec zPr#^;#VfF$C(>_;O*0a#$gEmEs^DqiY$CTM6O4ak$oGQI{TSw1@{AtqJgOlvG+EJQ z73d^+4O4lo+Ds5dv+ZUt8P~jUlMl8}7{e48%r@H(YreHRt$=I-Wmj-Bh_23eUo~ZE zQdwJBZLa-2Uiap!f0d^ApC%h%y+usk-~GN-KlJ>Y=YbWI z2rz5O^^>|PiaI@h01d&{W}&Wk`X1@e5AWJijdg!eg$0l5`me#!5v5{#dJp)~a0WZl z->p}F`;#=7LJR@-L?p0RfcAjsya@MuW_H%|rJYP)xa?QXenYl{MS<+I<*%!50itve z`j^IN_50HiF;7cTE~+HF%<~NFxh4l?j1T9Dmm3(qzD;0N0ZAU6mbStvxhKBM%S$Ad zpPFg6&gk{Rl1z=(Y7P^@_16K6;NMOl6RZ(tS1DhCYIgBlcR4g-gE6|vdfrPJ`r!-0 zHuxsS#VWn2>m53G;GI|ivTwkAn&Dk2zk0)%S z%G&Aj^Wti{lIPm6LkYpQ6ur8EF$R{+<4Nc%^b4oH)?gzE@+=l>z)F2OuR( zEiUfgq}fd@EDVErc=4e_l8<5sad=nTUE74XQ-@_CL`_ip#Khx^j}eP<{Skski846h z$#8;P{;2Egvw^6nWO}1yc4KbicIB$Zq=gF2fo5B}x!GjyEt?AG25<4jHH*lex*io+ z;Fqn6vZ<@%VQm{EqcoLI<*XMhnW40iK%6X~W$J^T8sm?cPxd;L6)57kJ_{p8gm*JC zGaD%?Eh#{>AiS{mHuQJGcF(`N9?|h-0N_EG0Xz2PK^d}27@$||?^@&et>;>E z#;XW(l=xaA5CSxaZsa5>zl``VU}YwinVE?om}z3ZFG0UeW#h`R>8$H4n?W3}9KT!3 z@uAlJl1vec48U`CfM#KF@pJN>@8xXO`<@@?j@jTEQLZyE6L^7#mjj{=S)*+T$LQq& zvr5GaHZLzP4^Y!YMO{ok8Kq@o1?+#8_$&*jq!V|twVzHQbod~lktc6BMUPUN6_h6W zw4#E5j9(&mQf@jgAKAc<{ANtJ&b89yH_myZk@xB4tXzgeL!97AWt9}T&M2~pu^mo0 z%;$z9tdl04LQ9yvYo4tlHo4fjNKeGJ>Xz>_=QjDi+SCK;xG4qJ91Ot4)wNhN7!3tk zUS6J=gQK{m7KYr6!-n_j z-T}zID6vAj5JcwaO>k+=A)s|(2-6+`;mE&vgDYI!;3|Xjw9*S9bfgo|IY`;w{u+Aq zHvy3#s+5H7gX;u>AU}Z!SOT_d3JM>Hk{00-@Zx~$$PaJ?n<-XE{oRMn<#ENz2A;8@ zArYV`V7sVSkOcQq105_H!W{%Id#Owr7#Yz3cvDnZ7z}{=r@ge))Hk4AFfcHDYHBjm zr=y%XJwRBsCo65E*}|!w=euncag#GM1Ky`yLx>mfMtTu<2FD7;QyY5S;&o$8l^!VDLx58C3>#@mWxH$=z}1^8%vfz5cAA( zf3E8(MEeY#CFx&P2Kpp(mEPkxQS{48!}c1+_Ewr`MQndoI?sx3mOV~p@wqwLIAJ^; z_23!4c~hfik9SN&Y9aN0UCQn)vlF)HKlvGSYg21SKVrjEQ+b`XWkCj)nT^fl&&jF{ zka;M9mb$})FW;BJXGsKDjWKZL!JZW32*f1~AppMuSgtf6y5JAE0yZ%CxcJ`vR$F`FjVag|i22f7ZLt4cxA&mMLH(JM z=taYf9*HzP-`gIJE^A~21!o-nSg;TKF{|_irD=4~bq1QO=u% z*udjiTjye9S{*OBCQ-{1k7q!!Zm7X4EMc_G#u4_sSmtr*Gs^DkgY+8W01h$23D=nX z;;_W=-_>u-9JY|5K>aX@t`aq7G-=GjCSMxdJTh%u=&6TPB|r^C)a<~_YAi`K)(a33!?sIFjr4%-2RD4 z*KBcWWdnog&Q4|^)c*8(JTff$iQE!#`MDog1YA?f#&p#nR7EA>o#4zv<{=PI`R_7F zbt{B}tUta%g|yg`;>_b+d6hBuz+g-`i2g;4z}%eby4}5&KF$yYJvcK;I;`TnHmk9< z)wFB=@*pu4>pQVcQjwO3Ndz^V&^KBsYyK-ke}$rKo|Xb3XG%pu_^WDG{1KG8FN z9DH4ZZBc`z_L>E4fJOyNsnC>{RyxqGg4I+fn2dl{S#u~w%%TR$J-F+MNp(Wj-mV)l zbOpUB-Zh10!Bj8(j&K_e?C4xK@|8q(B5hub~&k&eo5ChCz?f&#Dgz%U`i9 zmI7a)V7rPn`4dSKekqD~s#K(|UhH-HCCo@m0ymz|m>XyMIy*I$-YhL7A7{m}V3HZA zPI2tO*Riy>FYV}9{@?l~4`Uhy&_=ywxp{{{D+y)b`o93z1StED5p{LQq9XKYR7HFT z0!gG{8oNa-hG=faXlUqDTfso7B2{^lbm}Vms~1VbNllef9R;escPxgndpAZ&i6V`J z`l;U=D&A+eFx614t*x}Qv=EK@l7$Z+KK5SZj4(j?^R!9H7EMDJg7LaeMJz@^G>V~V z=!T(4BM=}E2=v8ih?W*ab2Fl=3liQ@UP;4>RB9^o)vdwXuA)jMStJoiJdV-Qf?idH zQBr~)k2`onMd<12p}nn5NfsR)M5EE1)obwK!-tQdKu!q*66z@_iRe1AsflQQK2=hZ zpPx@q(^Q%eArx5%fo2$Jn>Qnxnjju`BnT&!R5~~jhV{KybyOy!chWXp$7pLq@9ad6 zM9>YRk0?wvRCjkboe4EmM`tI!y}iC<;lqcIy&gFy41l;{(AL$(>NRWV?CvHyZXBa3 zD##N8BOXVK#n5|u3H0_7={OCPOA8%cUBn%t*?su%;bU*akPrrdl#*yP%8ng7=F%bxql31#Hafey=Znl+_zWw@Zn=0gQt2JgGC`K8hkuZg~~$}q@N(HGvkin5k=HA}sk$;o>)jqbcWIy8-TU8keB7d^!}`taey$KH-%B@7J}1zrf$qLLO? z1Nromg-H~4sl$u$+kQcAR8#5Ff;g$A>_lOi zRZ@1CsYD{E#kCt%8mJ7FQpB#NvXY0BiYim&xBatQ8%8GAS(7lFh@v-fU0sRRV;IEn zlau@K;bY&&uu2$q1W<_!t5GVd3Y7E_Cb>4amgsL)QMpl9Igy7O3B&wsS3TL)P&9dDIsZ>&_>Sowo zW=(>ylZ9DzyN7;~=t=Ce&h5j84cfW*A34TeLl{<=#_?j5q+t?A9?9w|lRT{I zDK{6BF22HiZ?#XDL||7x_0Ufgd)-a+;lqcI9AmE}3=<|11W}$;rsPqKl0?kHO+lRV zO-YB(=}5wCCP`Qc!rG$H=N`M)-aH>ZeE7&Q_G-c~VM-ApTMLscb(qZ_&tWz@G1xtx zOqG*K7Uui7WxuJa+Uswc4<9~!