From bba7212c561429909e22267f43ebabfab866ba62 Mon Sep 17 00:00:00 2001 From: ms Date: Sun, 19 Aug 2007 21:21:25 +0000 Subject: [PATCH] Rudimentaere ISDN-Erkennung erstellt. ProbeHW optimiert weges des via-rhine-Problem. Grubs gfx-Menue entfernt wegen der Kompatibilitaet. git-svn-id: http://svn.ipfire.org/svn/ipfire/trunk@785 ea5c0bd1-69bd-2848-81d8-4f18e57aeed8 --- config/grub/grub.conf | 3 +- config/grub/message | Bin 169472 -> 0 bytes config/rootfiles/common/grub | 1 - doc/packages-list.txt | 1 - html/cgi-bin/remote.cgi | 7 +- langs/de/install/lang_de.c | 12 +- langs/en/install/lang_en.c | 12 +- lfs/grub | 5 +- src/install+setup/install/main.c | 32 +- src/install+setup/install/probehw.sh | 2 + src/install+setup/libsmooth/netstuff.c | 106 +-- src/install+setup/setup/main.c | 17 +- src/install+setup/setup/misc.c | 290 +++--- src/install+setup/setup/setup.h | 1 + src/patches/grub-0.97-disk_geometry-1.patch | 892 ++++++++++++++++++ src/patches/grub-gfxmenu-v8.diff | 994 -------------------- 16 files changed, 1111 insertions(+), 1264 deletions(-) delete mode 100644 config/grub/message create mode 100644 src/patches/grub-0.97-disk_geometry-1.patch delete mode 100644 src/patches/grub-gfxmenu-v8.diff diff --git a/config/grub/grub.conf b/config/grub/grub.conf index 6f8651457..4400edcda 100644 --- a/config/grub/grub.conf +++ b/config/grub/grub.conf @@ -2,7 +2,8 @@ timeout 10 default saved foreground = 16064e background = ffffff -gfxmenu /grub/message +#hiddenmenu +splashimage (hd0,0)/grub/ipfire.xpm.gz title IPFire (1024x768) root (hd0,0) kernel /vmlinuz-ipfire root=ROOT panic=10 vga=791 MOUNT diff --git a/config/grub/message b/config/grub/message deleted file mode 100644 index 3e6694a59df7687ce6e15cd898d476ce4e0da71e..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 169472 zc-ri}3v?7k_Bh-u`F@&XeQU@{Pan1KWcNgxR!0Y#VqCIK|SI&_lA*30(^5K;>0Bk(fpo3Qu z{2kuL&|eq4FTvl?XBg&pp(D8hZj63GM0do@$eodWk-r~eA9863^Z(ahp_yUsG7r2J z#s7~&H zkwUl5cv@-R!)MX|FgL>ExzD8ce|#nZ|07p=KPMyo2XkwD&^y>{T~Seyv^;6mipP^| zk0jmy$iudk4+|?&Q&X8F{QZ8#?~|5WS1eCTwoFY*TbrCVWo^=UIS|YwPZXvmEw@;# z6f$Y;xTK1ee_SC)#wH8nl2$%SW9g8TToKGX^2nnVQ#&Ff*vkV1~D@SiuMtD=f_Yg4Md>VOx@A<^8smk378G`gkx@ zBY6UFX?y(96-mg^n&qo8C*;Fl@NBRRS1w<@@{cPYejw=qel3W=g4GXZ-UHr~(}BCB z51ZaF{eIk=V^57;Fs^ajYvbZfqfL`c7skbopD}*% z_$SAE#&?X@rJ7O;QkSGYp89F(xzz7de@?yaj%jxsN&7PGeA<yh*bjF2@F_SEl8Zth~cz4p#NtY(|Oj1l2%aO7{ve>wl3`4{r9w~>?`Oj@D}`B;44^`F+caw+&6QZ zv)P=uoYb6xoDIIrmIEFzxcRBhw0V!zT}&JZf_4EBfd3BTh(z=$gou% zFNMZzRVPWIaa+{}DU`NVJqAP0LJc3}vZ?DEQ72?z>Q;3+4UeJWDe!bAU{MFM;jvF8 z6*?mha*Y$4?43WlJN1qZ&fO8kwuyzRtY|D%&^V*9OfkmMtaEr2vxTE%GqgIfFJ_oV zbfoInLbAi9ByR`Px1-~xFgypfoHdsBWo!q3i{Gk#6lrwSuZEX*nAim6DAkyeLfjWs zycmrr#I%HAZji!73S*_~M?n}W8M)wq9w~N3FwBw}jvH$0#|M4_?#M|1kR>tj7=0(haGQs) zST#_{hk(~8H7WKc>HjJ^eynHn+EU@HKK&55kMvIGq<@JYqdp(bU(o0 z6%7Wlk?XL1#b%?jFs^=s)P(W%n-S;3g^2TXptyxnan|+q4>Eq%a%I@c`em5qKVVWJ zbMkK$P83-QZ6a0j8X~NTW*C#J{t$BAhS|7ShOx$&4wHL9Mn6}?+xwJ41dz2wdV|Tk z;P;XlkcFTF+)Ea~1V$#S3C?4r5F@I&3}eq}VrfU=8Mh-e^C@`}GFk7k_o;e?nTwW|76o`t_to#jwV<5Pw9P{+z*vP>+!&QC{&thi+#*Dle0;35By#^i| zbnfp|Y>Tm3sWOUBunvzJQ-ax+&hHmF6UN<|Arv!&|5gS)X21aAZBQXfPkkEXmTLGs z*6<+|vS2Yw;zjeM4jF0)mL#?knze461fZG95P&oqRL}}{s(-5$URGn(Js|mt5b^|$ zrm!K{VMYRZqEVXn`Ka!}&Kq=HP|ols8Fw11l{26Pu0wM~iv2;?ZJ~L04M2^}GoW24 zM`zU74yBasVwr7B;P!ZE$Jh()QHP`(R1(LptA2~epH#?WqQv8uI2cw&B99wzF#S%k z4<$jYP?mKnEh=3u3V;7f?R84+_z+4>L~6HDYH3IOjuVmGhU`W0;ni3QT-)|r&{ zbn`&x7JsCIy`ucBVy4q#9+HX~iN)-Wz+w)gR(OluM@QmEs{bX^SVkF%m#BTtK~|np zdjhE~Wmz@yyH7*A0n%JVX)YKf^E$+!QqKcgb#@w)q@MPh71%(F{97a~aycjKpxvyxKs9pqeEZoP-{FmDhKlE6yIL5M6Bd;G1wOYvLf_bagc z6si2P;eb~`%df^PtC@W|+BQ!pv2AXx?x420=Ql~$Q_`P;1g%kkbejS-Dd^8$K@SSl z8$zsDoQf7V6!N8R)fja0^iNjICtVA8U$OyJa}KC`^3eQ5EmwEck%RL$W7Ct-03Gfd z-pC}90}H&0T|Un~bRNj3ir;LSeUhfEqpG%^rF^n=sA$Ox>~HaZjz#{%BdBPa!*HlW z`}BJDp-pEd4=8Zh{cC?kvf@dS_nS1gQkwhql%^GFswmACwF_BS;-H}Yv#}a=^*V(# zhuvQPA?>iA1d!SWkV<7Fb$u(qJfJV8ICBuc4k@LyT2maotj)l-xH}YV%WSa~-)^Hb z(O6Tes(nmty!M(=Of*)Ps(LVU&Y;Yht=3e`oFZqQSNqtF0RrW$v8F`*3*^6P6d_Vw zqVDmST-8mPVOSe$L~XpNO!$yaw?mB18ElW|UsI}w7)4B>#b${Iwep>+i#Z9_FH98K@h_@>gW7qMO^5T0&5YJ4&SD)db>61lmyn(BX?C!( z(lXUZ!kXetzzo|cJd479wno)v+l@Od)v7GxTNbe(i=8cej4pA;!{%?Z;aTS(gekeF-9v#3Lz9j=rGBG)AUG2eYK8VLgybj4`!C_tP205|uZY zJ(`t(rCZ;5!E+01(48YQ+bY5bv*-;8aP)*!l(ohM~FwouV5b5F%Zq7#46&A*Yg1<+USflvO~OK;whu@Hkq4uJJ?5@<{u zkEXt(E6B+0DbyJ@rntofH2B4^QFPuNjaWPI2{yH=ek=qIOhnWFGEA7uXLf&_h_-3? zGQxwd1EwDZj+P&=phevqwB|OyfNchD^9mR&&M=G}cmdKy>STyvSlT`0uR!iTXl0Yn z(W9;y#jiT4`!DOQCa5Uo${L*^P?B{xmA()rwnD40A7}Ph6=F-EdB5^dySqY9CgCfH zVDGO`K)-TEqrZ^ZW=&K^Z>Av_T4Iao@a&Xc@rcQF^=(0wazt$F@%+!-LvDwYz23XB z)ROT7;tnA%RE}KyjlGdPH9GdQ&!6#Y#hG-&?4L^fmySW zcg~0+S!nC+Z7s`lob9ijGjteKV~iP8VGJF-ZkL|Uu3}S}cw&a*Tt9o1J)U{8;-wV# zHYzK74lTo`c(TJIHt%Ab<0)g8xJo-_^Zqsu56C4j&6T2MlVOdlRRy(LZ zkB6@-fWA?AURZui&$p=OU`KfsI{RDkg98t1|2vY#zTU;3HOh49oht7pNBC9lG>r|VBF8sX@n8Xcn;@uZum`1&1SfQa8XzT@~tX5NBh`X#)h zXC7B&0bIV3oyR-FuwY17Dka>-(p7^Zef=dWHQ!^A;FW(Xhod0;9bH%0Q2ZmN($kqtq#+t_xjf%%cz~3luaJFip!W+Kr#A-2x+AX zep9DbYwy$Artm?hxynsclO$j|FCK?PwUXb|r&ijA@|(^o)%>PjrCM0Z*GmWqbL4U~ zActIQ5h!FRPX&~0S$y|3KB!%oi0dz@JIt)V(R_TP0wkD#5`>lo`3c-EhP2&*4ic2! z<3$CBsbC^;duhYFJ5>CET!uV43wwPS7VbW)vMIz?{=gK5ESiOO(iM51fU&H!qifHh-NCk23h0G&iN?GDje7z#?hnvd8K9v78s01^bCNJY%Dgy`d1)Z? zbAik+2Qr5gQ?<8@HiILJ5mq^)rA|1K5!(hj;g|kSIRBV_@e=VHDz8-NRaWd_UTL+; z8V-+qJxGadrd}o5EPv;7d_G&yY~iYrZ_)aEQZXvXs_`_dm*HeU;#gb*;wm{DM#)^& zFLY=vhqNSe6T)+|(**SnjFWr?YWO7>>|~@|Xazy8$`*Vt5Q3W3_d_!4Rb^KQDJA4E zUC1Frf%aIMvHR4nB$5izatV{^dID5Hwjj*n_XmT+flC~^>o%^+^>|44N%OAp1owOsGx|i0tyeo{LYgb0lHChgJnn~BFM)MzN85z?SwL6#xuj!b6xAK_2ziGGP znBF^UcQ`!r{lrEBF+J$Oc+>%G*hqMJle5EwU>LVaNYNYHJM^?XydKlkB)HM9jnAO< z-OZ96AYPrz7CA1>8lD~WSTMK8wd!y%>-K&-x9xk+!EW%il{wh5=HhCyZxj%`_U588 zZqH$E&sSqS^p2{~9vB83r+n%G zbEXa|ec*0fr0u`y^HGPom^^XK=d&h?VbpR;9z|D7qwz(TN)Mz0x>tQ58*{Znu0_S< zt^a+F7a_-iJs5f#^Uhws^}wST+W@h;7yaw8b$|A+#`1MLm_ha&?O_Md@#J$D)~Y}7 zPbsLdst@!bok>Us?PQ8s_m==gN_%vGHd=bGzQzRj-GR>odLWUl6VwNWfSpG!-thUL zGp@So^Hr!C7?aC6p0>cQq}q>As{0aYGZ?G6GJBs&FpA9*eAhc~8h1ithQDdFZ)6!z zHuhVxIDcf|IZS@eW z$+Np7j>QP2_MA5CQD7+kK=oQ3UGdJME8d_YwV1@4T;5c&5>37)TdSFvfAsklQzsvK zMWZhaL)+(*6F&g>72!Vtd+c^c4qa`9ZXzwalJ_C?6(J1TK#TK@ez(u7CilYFY*rsf zbHRiB*fhwo_a{&Be3R?gFus_dU$%IWXMS~)i>U0K-0tA(=b5&}o}S&RW5X&`rgqce zYC^sSDqsa$s#{4r23e2$oWA-;@-alJTdLd0hZ0mg>DkNRfRl%jXPGnS5Nc?jZLKe3 zK906Jv?=)UIt726@bwbtI|}-qp`e9SKOUzt8&(RlaV-4JQ#e{wKw*n8I%76<;$bLzuhOQ3SZ~Bp@f&3hQn`Le zXH&2zG7|gY?0dF48V5{0_CztE zhOWZvghbIzRzT|mh&FhV^-{gb{87K)5=`6SRF}6|mKGrte-lwn)wf8A)Q7{y3 z94JCtu)QzTrndJ53mK3qC>mHNoqV$B(hL8Qis2kPK>_;ciWLm>mo9_BzWL7p>M8|w z3L)$)tx!Q~jfuw~gDp5;GWS2DOm$l$uH=2Sue5o^*z_(IP*g zWHeA@CM~i}DzcguIT|UP$GZ1vxGIH$CY3=_MKJ%78pNtmVD4bt_TVbpu{-xgbCri_ z0E~@h8pz-(D`;RQSJ^~c=N_)=D2v+)SejZQ^#SW&Pk*=%EuNYVOxg^v4jKAt%%`}tS1B^TAhLMsk z*G9?EMZ#M4$Dr%xwd}Uc*0OckQpHFxGI}dlc>KZ7RRc>Zzem2Fl9+6Ui1$9aN>BDf z*fE~6=e<+nQ;B?9%gvH>{{#q2plED1Vb&~LI0Y{tF9N*G8!Oes7NDZ=(T+m3N!O_x zSV0{q2Zb%n-WP&e0#y1(3Z|DA$D@7$OU#i&7h3s`l#DfYKCtKUVu?3kTunKF*gEhP zOfJ)5@r0>eLRL`Z@eA_EOMpAy44Jk-V9}E5GfV6~Mo?6DLwfN;IpZ8-eK6VU}F!>Jo&RVyjEp5)+}TdMrQ%5lov5`Gu8f)W*tJe5*xIQ zN=cSuy=YDzE+%2f0OjkRJREVC96d^b%&sjE6~&|qjhmll(@i@4Edtd2E`MXaMm?Y&U8D229XLohZNBzyS%Y%uu=hGzu_UK^{j>F@?coWydMs#=i6QKgn1QHKmVmy^@5Mvv% z?N8mkgYX^<;Gt1#P4MG+5%1YSh|`HAnOTSy)O`{JFir+#ASf)z^|*q9qXQ&oU_xYO z>jrjPpnrCM=TA+RQ`ZklJrzjRLTbfWl!Ve22`?pU3&EGtrs^&8Mm8v6_Ikku9!Ah% z?gcma5FT;}M#6}Igh(yYBJTh&sMXs=UWb6G)!Tu(`8yN|PPs4@D5-`J!qVC9w(d6E z{|fMcMy)k=+ldZGZ<1AEas^0F2%s#JP$HL30c?O>fE59^@Q zHszCFZ2Mo7x=t=tY!*K=9R|(aUVW(gn6XA}@VvsDPMZmYiH)seTM?YwN6r;$3L&=L*GfS_Oh76knsOLn1| z>bCvUdln+~G$MTF{ro*}*Jxy8leYyTB8{wn-@6|o>u6-%8{W4d@(7J=_z&-^lE^ll zm(+tt-YoY=X}dqz3-Zi|rkEB`5}8M&nF$7tzopu3iEG2>7n2IeyJ+#9!cShV`zweW z{qY`;Y&A+oBHORN2CrLz44q=azokNbA$`%TS z6t?R3x{SRjtGB44j%viL)EP<<{TJz5lmZ)KC`hl2}w1my|;NsZI3+kSqg+X~_@E5!#=Y z%Mn_Yh36>uGbQc|&q-nmCi-qvd(z3EkJ0{x(I1a`AQp52z~05uB_Z~7p?PjDe)0=` z{xH%a8<@Pku z^AuOkN(vO(6ycH8O$KgY7C3>alJzy%{2C*fUo5wmuE0w?{3qa2(08)^^M51nDu3QC zDescs&O4drUm<=!+5UH zilmEqGk1{Yt>@tZVa!zj5LV*xIC}OG0lc(K;h!hDSGhOH{#ab<8wD;-G%mt(f8*+U zq?A`N$U@vO6d+{KV}@z| z4CHU|@}Z1d#5$acb-vi@A7O{j(4h#zJb30;c76JQUBBfFDmbt%lVI{@L&?#rIC&4* z25MFd6Y)33Yp?n3^Fb=ox>g#~<}(B8QLxbFkn|&&1SwQI3U||%p>6pv5Vz(?^im;GK-Gvr>;9)5oeGqWc+`hqOuRGt5kS z0I#eeG{_~;#ZzdANniVWwFOI?DEG}xy;!FTgLtGid$uxXD(;_E7b%R@53p{cH&$z< z20b&J_6L?Qn0f3rlS|GRTN^rC8Ah|!uN6zCSGu_nTo#QR^NXIYO zc&cDB2HBb*ep+HC`(cJGE9XDrz?hQ8N(m^4G=P>%~Q3bmcU{O_hSjkP{MG3332i$ zF4X%+@gVecKl%^)U!m{eevM97GH%BV*|hc_>I1bOTO#E$lZ_lbVGI48{3Af2oUGCh z$blaG?y}=CmynSRGt`yawLS=^B=Y(tARaC@nOxt~9#M75-xqLA&l)Tqxf~E?C|QfJ zFeA4|I_Oy@BZrbFDYCJe9fW)r!a|Ks33procd>*k4&bUtBEm+S$(l20a^GNWKhg0R zzKy&z0{E22CXo5|q%|);Br6Q{+G5(_nMhKNgqgRcM(~Dzr4$>PgHtkZA85GZ^!Q#9sC^{4mg`Sia1Pp+O zt_SFiMJAW%_Ris-QWwyc^?_O_s|b_h10Iq9U+aJYNKG}EB=-4=hv8nhlCKr2BDLD(`T#5%x zB4yX1lzi$3MaiakDfxhcYD#Z2);u=U-lq|U*!z=g(YKr@(c&)NkUctXPqW{MsDy0Z z3~IL1iPiRnY{W~8f?o_a>C2=T_OH9YkXp0kBDDHYDv=5;Igt!q!ao<@jwsw7HJ(c8 z>Q_@4k4E&U>L$LCDLgg=*N(V7hX{k109s%=eJt9V$~UTL2!tg;;`zpK2=V(AEX2b3 zM(qL~xaB`!nPbsC9wXnPwt{n#9!dJaj<|@sQsl+aJ*Z4o93(bjz;6C+!i^GP^0`F#3IW1HB*JF$hheDyuHA-2 zhy@o?F;GS0{QgjubRqgsS=($g7gM`-X_-|`jPVi@sJlbAAlY-?ryHX>@hAz4|CQZk zokOQT+C6eVm+UTKioBn4$LG>6K(An=3pQr*5KvyS*cvNafzSGBYe=)i^LS{h`o+|0 z#%EV2ei{*n!0i->&#q$#R3h*V3dCm@uC0UWI*UtmQ)PK*hHFi(eRzQFAR5)z{=N^t z|fQ}2dqxR3BT1jkvxP5)qc~n6d4{a3xv$Yv}aJAw32)bKRw_`f#Ef% zODvYVL>*$2tPt8O+S^g**I_0yCdBVweJDYz=@xE?ek1w7AWXY#l<>q^NWnMza=65%x%WKT6c${_QPD1u*|b^5YG=tJgXW% z#}gfDJWn8%It+PHIg3;hYa#8DLs+DfDsbbt9LIf)%Mfu+K8Pgt(a-#LW)HCi!JMM5 z))sYMY1V?gK*dKPzj(mE?lsi?DtfMu9K$9tuL6Ujl|5`~@4h0si%Bl{n~PWoOvXTF z>zbcE&1(EGi-jIJ3SeDJFz*x$6-(_FO8)vSSfg6rfo-}%9xL{KMi}0#rUw-2=tjNE zHj8Y8ws#~SqDzod#W37wum6Oeexv6I9CS;c5#sjgpz@9Q^%JQEzqei{pp^(BFL?TC zM-w&V2P{x-a|1oef!|2TO}nQJdn6;MP(P!=9Agi|WEPiigK0r5vrUyh)JH8 zjCC|+z!2~THm3*M>tUjQRp*z_P}PMJ4Vc9h!>Dx-DI5IWAn1*k&jDOf=8<5F9(=73 zwEWo~57r_K_iZ^`q}KO(6G=NXg*O%^N5&iRA}%u1S%b$y?P}VKD>i$L;Y@&!5|SNnX_G z{+8QImqyrD?j3sC6bAEkHEk0?!8S`l1q3}{Veda#G{A*=KPf_zv^DH!mA>?vt?JK< zsIil(qbnlLXe`?ojZkFZr0TuDjrcM9kEMZgFmr4YINl;#u078C zATV|oIC}864*vcOf4kxDIQ(_Yq6a&b^b13nnQ09HpdkkVunj_5^1ep?h?9O%2ri-4 zL$kaxD2p>Jjee&G=!is?B6{f{bPahpK+u91If#+r#~75q5K|K|H8zmnsSNN2eGZWD zh5+NODKZI2>h}#9!@_&iLqrI6%|NXmw1WaIf3Zlf-S_iic##&!Ol9FPF}m z7cVFwPs4mvzNC!X8~rjK*K0~SVto)at@VBoI_BnC%4G@LEOxV>{j(*4!4gCvpt?60Llo&{Act=LWuN7e@y@Lv-I)r$m+3C?uV z+V3LXN0T});xey?dWwIciyYXf^!#Gjn|XXz76SvkDvC-;Smu2iySt3@I*F@4{kHA=fkjOxvFE*=K*V2U>qxB zv~N%Yc#jO$0Jug12ZwT1f0Zsa2-&KBMgnp$Q`JZx$m{E$mtaw>@JGxW4S8RdKtoyK z0R#;L(4QsHa8_7|phN&|mq4RfArC{bIq@!!PM`f2aL-+rSb`5+Z|Kr(SO_MWjpX)lZ>AOTtELT->9Ak-kc+6u5`$A z*^FcQH`At?y9MY06gHMjdsf+6l?L{PYsAEvLf3UByv3OY_9$IoV7UN;FQng_*< zH5k9#eWnf*Qq**n`XO9U`;4Va*0uuna>b>w6p#JVdoJjbZGt$S=DO7VHC^XUp)1@3 z?~7o+WD_uA3uk|ZTojM}%zKXFN!%;dSkg=M_5(Vz=%69uT((oNst(Ozi?F7>>M z?X#j9CRe(`x&r5KDJ1$~jvO`Z2j|FQ$X~q8g46yy2yP>zaTt@~5FW_rM?X+(adMP{ zMM%qiSnqC?zJGGNb#9lAgbxJK{}5X}=3;J-i`#QJ#SLl-sknP}tlQDctXI9uc!QF z3`949#p>H=+?1u=vbkNj1HYJ38EY13j5Xj-X$qY z9854pH{logd3eaP@*ni@;bJPuq8uiTF5e_Tl8{*<_LDkXQiYkBnzP5V!VqyyBDo1K zAqpt1MM~Y+fh+MeqW4>|->Y`?1Pe>~x~PHOLB0$|E7jIM^-j9af^K{r2BGq*%(e=% zTq&*+PhIEO=@G?Z2-4a~6%f;_u)bYW0bJtfNd!)lvCwcSFDt0YajbRMP}B-#z6^AC zx2maTaP;VfI9YyX$qzmZioC4r05x4A1|?G0c_&S*qluA1q_ld#iW%4zT{RRuL|7~5 zaVDVP-RBg}=a-y>K9>1~nR@Crwd9>IMPmL|GdmNotsFOUD`xtrHw_tUw=Y3A+DGYc zRf-iVxwZJMGjz^qti9tRi&{@y5bOJ~*pN%01#Bf) zWrgW9R!*^(#cC+tW07suUiLi(NdQ=PTHwqJ=9iFi{N8`@k}~!P8ICk|k?r(jMM3ND z74++mzlg`n%0Ze*Hl?E{2)~}yWU1+L4R~1X#q$Z?qqA)>IM!B$=*}mlR8+x&28~%; zIPO77_%?<2_?@!r-rWgZERycL0U794Bc$!BVKQnY)+emEgrLV;UdFn;r^S8`I&|4~ z>%8Lm^rU@Lw#zy_&)%7s-C<3FH<$gRH4fg|>>jHg-pcHoRvoanlmEXRS{;G z?(Wp+nq~{%KZ}dNix+tgOrYz@rgqv3E7aARLhoaFISdT-ig0&Fbc05kSJd9S^XM@} zgz6i@0jdIB;GK-nBnk~_7%ojMO794SGAe{>8m39JjKUj|cf6xv1H@R?B_6GgDQr+k zvy}$IcL`UTHB26zZJ@ggid{(r&3tZi4<2oo2Tax1OkixoOSY=UNMGm7m$r6pr?F^E zBd_*=>2h9$vpgyoWrl&e!Q)tZAIoNXq&t=BgU5MOJ8!zgn+_X!u0FM51YalZ__y*| z)c#w~K>+Q+bs9;}^D}wL53Nv>%iS;t(X2ws!bd!v{lLh>Xuu#%Imxpvfb2%(d_F50 zOBQNx-PnifqzzPu&NI|gGCOiY>4$<`r>yY86a#cywS9qG}aCJ$~7J z0ety|6BT#}B@sW6AF?i(y>{KrLTC2qj&})P^?FN<+}@~(VzhzI_X{Vg+!xi=$L(hm ztEo%}Vz=KC8+S`A^_Cbi-vf@HzYV8@dZPFIShc_$rk2q*_GQ@FUpJ+gAj6W_!8>;& z*?`4MKD!PLIz)*LijxpbZP$}=9%7qK?es$@BUc|zr%ZZ0F&aNl9B8H@$UXbP5jIVR zu{|Ey%z3PQQy<+jC=uJ(*6|ozqeyWF9k$J^9XDS*QS8i^NW}F?%j7QWj4qKn67^o#CNN>whr{GlB6-1* z9~6y!dL4N060#!)U(Ci(zJ=o99ZGX0yA+HQr!Vi4Vb(jtx`pM_BI5oVZSp~6sA?D~)S#^JRTvXX& zyx-E3Tq(!-lux;5KYkMl2)&DGM@VVo+2)EM-6hDD{1bk@CREWTmij4`ml!QekJe6> zGp#zQ!ZX}!WrvvWKFLdG3b?%lyiF>c?o+g$r@42IvR$?5983TulKWOhk0@P(K0O^Z zl2q;a#+_h1@R(Q{El$#`=51|7&_lUe`~rA2W1qGM7)fc??9s9}>RPp9HHWknN;Q*| z^D5pNwmg(%pk=o=lwlBu3R9cNFaJ#5#Nnz?CD5-bxy=!HHyqv&FG> zP+YBhhn4TdBRl+wXED)*i(E~Pjvw6}p)h`Vv910?Exn0N583Ju;Ww47@Yt~zAHV{0 z@Dr{7)6jjn^n1kZedm|&*a^^3<&L*-)#up@Gj^q2n8BM|7jiG;8bNE)YyRHQQl&{A zgx7vz!wj0XCA+h0##2C^#i zClLZRsT_?Uy*d;ciT?n5F0{FjUL=68dfYJF*7(o#Nc>3lid2fZJDD;b zr}N*)w#ucV*JL3EazK~#xA#dM<`oYZ23TTKG_LSS;r>D4U!sw>y|j`tsQX_)B_uco zY&By|jH8*gUu5^?(wi1sblnBp^`>#Bt__zEi#GYNdqBs9k#kX`i2>o=E>Yw5w3%Gs zDR8`lu)O0dhX23!N=3;H0kCqa-wSt(h)XdLc?PgJtZfdwFDeIQ%YAQoMH6f8{Wh~56p=)?j7prVb+83 zka>KALOh=7-k{BFTd(Z#g24O-P_<;H0(~(lt^h@iJE|TsQqqzmFk-rHa+R3LH&C&% z^2~1V5c+c+J!-4haaqM}?xqF^T{=m4XyC{lUAd@3W!ruB#qR5wC)X&%ll5!ly9=7= z$>>vfjEt*%AKCsRqFV!p^|&oBAYHn8kx77k!iyg(Y0^__L^Ic6j(Y~`v7WuP9w(t* z_c?R^C~bjA-^%itU2BxQ*d>8~bx`UgSlE;U(LFZoA^(Y0Fkf-zE2BqSyB0(DqXm<@ z_u{!bGOeu6)N0U*sP}Y5OY444#%9NFWSN-WEw78JL$PYx;tJB9S0BJ9GUmawYP6_FSt^U zq%=JXW}}j72WpVP>|KvXi?OxKJau17u9=#=um>-Fp~sQIlOc!Rr$_nfG2NCewm378 zflbZmL!p0W6eok2!0&QdwT_PIg{*rvItR#}wX0VMM&lo8SwHvq=!%*zgPyw_j|6Mi zs%RHZq3cbwr>4-x!)wVtHaZ39ESTPXiaLcZ>ntcjY%=a-kFWh*g+e?c9vz#2SvM$B zz5+cm_fG#hTa=k3d=Ha-lNTC8hxace`muw_kAO#B2p~&nS+u9F zb2vU$`RIV*svZQ4t(3*BlxL44=PcDG!x|IE;{9{Gskm$*4i^WLU_B;!%x3Zr$X6!g z+H%Y!Y%jeg2ZnwcbP?Z4UxzT7u6kHU@bxG>H_`L;U(xA;cGxm={pXCowYXQ!{DCy4 z?kv4V78-TS1@iuQ=^8J#S2E}JL>JPnBRzfsk|bo$mjv(2c!)lwrr@PrOtX)+>Hy8J z6_n=oc(iX1#RJ7~?FV;T8nsQwqOBo~Ow(RGsiUawkT)G4;0_cRG^wm+wuJ_D5G=Ah z;4Cl%r`F$PIZB?PoKk}_U56`bczWKh=wSK3DSyB_CUWp2+-cTeDJ4l+rr`g^a6$;b ziKZ|Le-fi&l#s;Q{BboS&3Xqg#)DPtEKz{}iZN>p^gcY4Zw=$?X|hP8U^jRE!y^|8 z-Z6e6ZMq~K)uKmDOs>*vZ!X1E&%tNAqUXKGf^q=&`JQ9?`|ymHO*hl=i^BS`w@g0g z#XE~e@%30mYJ}H5W;{4mN6$B~Yf`yA#PM;W`&*^4M&lwHTLQP|BsgUv>8`&MkhP`zIj5S5Eh93okv1Vzs{oIc(uab8<9zqFF=DZ<}7ClVRjGkHZmPg{u%CS)rx5aW%?R$^e7HzZqyf#F_-caqUDow22Zt3Db2<|*7~RqUtIjjA~odQ9X^ zoy(@3EnLUFoH`3Vh$0lg}#n3dsMG*;;rc>tUF z2gJ&^buh{vsIJ_ld!YKY_jF|*-i$yVpa?`5kHGm23|_m#F>5rC7TRDJD|b??n%5e1 z_VbVG4(UFxhTvkve!8`uJjmnSM)hy#_y=mA*-86d%*(n1aSYk+JCKAQr5zZuUCe0T}cCLi9A^n?$5aQv|2&Rx{jhI#&JJfM+*&)UB*^kS<< zK-fYL*Biy*MzLIF6blvfCTm^irAG6gwGZxRm^kKr)+lO?VyVi}qU-$0Qzkhx3-}L` zm@TLAM!+qeCH(e)Sv}*yv1%;kI2o@};bv7D4C>)T0688d5wZhe{%f_x5LMkz6Ouf*L9&RpUSZ@FY53$yhg{3bX|Pz!8ma4 zfrpb%x8cWk()#-$z7ZH|+v3{N0e&9;3h&{!o9EL4Y)}BlCOm`E-4FTNw|upwX-nsp zix)e9@iB~{AIV;Xa4OI3)oj;oX``)@awv5Rva|(R+JY=?0hV}ZJD?7|PV1zeDfdpB z7>zywfJznl-JQpYYgwR{YA*sq`6M z_E7N=&3MJP zQ7p-JH0O49m+z-1vz$*&fz+HCv*xDTVsq|Jy(`tG&$-)p*9cosPT`z|={7}!-qCWq zQQTl~{E)ut$Z+;EBW~Om>WYd07;idF)e69hrg+vXsy&@Q^?PteQli};Zb)*U3ubQ^ zn+tI^eihSGw2qkd>4E zO|FG>5VXa0r!0LTIjz z&pc|?VS;Aqay;5nf}cs0MDdQk+zOI!@5{AvY3(x*OJO>V*)T64aeIM)vOL~cbDRB! z-Kt1C&FwkuK8IIe&y8Y_y3eT~H3@5Z3(Ga5?C15yni&cgQRzCs9^0sup&US2dhZ%? zV>H$*Q1mz1k6g9)UANtaAeB@BEWZ#x)+mg^P^1K%3iwK-Yv6QEwun+FI2%D}*Xcgb zQi4a)KsXMMYBpCTfVoosYf(l*;X<&nrI7wl2;LHesgNPOhkJO?Y1?`6YI%wKoPs@L zbe4~K>MFEdFiK3rv+cGayfb>w?{SH!lRw_Ui*0;_ix)k7TDw=oq zDZqYrUq1!Uxw_77T6%p2FTxp*82 zy91SGxKRPE$qy+6HW30PTJgJ>!Wcw}qdkTXIxXn@5~7U()d6|p(y*gNvFS3Z=Q8N3 zV*s$}GGY8(c$RI{U}-xGgF)7Ml*KhbV`rApILq_hUwKt9%X7MRn;OT$a7%+&W;IBlDr*ux(y^XutT8P{hc%On2}Qz)1{fNw z)-Wjp@1$ayLb;E@R4uX`hBf2fDTSg^N<+a9*l{KD{LC-YjvhX!e*d3u&a9jA@>^TC zKgHOOuMM*9SjBVuJCqevx!w*Xm+Qvqpsq=%Cda{ia6^e25(d^d29&6?U^rEBR0>$# z!r_nyqe{Fck@iz3DDljb6+@sM3&%jn3V!=ZDHFCe1zqx9hAxJC^W`G}uRO_dZaR+B zk-W3=w(39NsN&u!H1O^o9g;E1WvT^W(FgOL;_<6k8cMD({nr{*(zDnoF%-!bj+rJ2 z^5_E5YK0pCI^;bc-quLzpf-jaQy`=P!A)Q+%nQsR<_Z(f&SW2ApJv}=53#4%i|lo_ zpJf#N@V*G~LjZpo(r2>q>=nR&0rE`%ZSk4!72j%Kj!*CVw*SNam->bN(*B(OG5xXq zA^pmJ7XCsYJO*H;koFSbeA}-F{MC@}GoN_@jwBS30z_tuu82WVs9=-~$W*hWj0#m{ z{Q;pDy zcqm;Dh8a&uvDxGrtbF|hQTtvkTU74h_F#)5AFEu$7l@c!mH1=_&(emD!v3153dFHD zEKJlqc@<_o95``2+lI4X6xM^!Y+D1v{`kW&^30(`{ghP_<5$WtpeZVpvQ~|wRli`Y zDM(bn+^E5T5>2Zm9muDs^pNkNUlQ-n_{G3kyu0@#nT=@pZ3;xhqvCP$5CwP;(L;lc7(9T% z65t}Ae(tI%?Cc}&{36*6KcYv{y$>%OlTyk{C~KzEQt<)1O;09V$8q7LF~xhV%=ejc z&v3fXNX@)Mu9ejQ`k_Q9b-50*84=>tXr{0gRO?`~r=i8{>k1u<(eSzt8 z^|hMkdTb1{#8_Rz7S8B&d2$24>4SdL0>2#pFFWwd3jC%9ewl&a6!|w9f0N*s0l)P0 z^obKEOfZ?!((XtdKW^;pDPu+(lMSOrjz~%zo)CZAu%U6WG0{;&A|oR7dX5VZ4+{$m zg^aL0xvQ*L5g(*Faa7=uABPCWAq zb{&+v=b2}o`5fBsd;BH`{uaO=#_{$yJWA6_|JygUCY-x1UZK*4>4zoUuGED_3>}^_ zHYg-AE^*AbjNl=$Nu$T7Pl}2eVN9JkIXik}@*NYVWaW%9q?t0OPMgjsltIB!(WAok zLlZ}*PRLYiLnC8HB&Xe$kTNcPa@I6%*zhsqCr+8ls&pYkVn!O`Zy%d6DLZGnCM+T@ z$#{p!;*1U*P0c}tqe=1PA&W@ko_k7578HyB5LE_~uXg+Nf;He|8{m=3?Fn(J3^Od; zo+w?aQv>cqD)-J)nB?vWfgZJ~A8{?>!dgaX2mi$3OA-#0Eh%4mAEmkJdpuzzE;Q)G z0z;@c$DndPZ@`bT9UmID)1yk`El$=s#}I1a-eGG)75nLbtZLop%rDd5Bmr6T(LK8sWJ9ONGZDXNzMvfu_#3bi=1Ujj(>HYmgb0Hm#i!Cb6EB7AS3& zv%oL~c$uOsFj&UUF<5}NIY8MAWtvmG>_y1(Xze&fN>i_(#2GgsJcsQ`IS%1?2tUdqD`gPNPFZMp z6d*Pzvn*wf!N#@%WDeBJma^I~3o!0=K%?mgajx4R~VB-$9DSq0M~B8 zr7|6c3XIzXV*g|fE+fZ*?u1rH2b-y_G~hxSkV%5lk|sIV>GYGF_v%!@OO*K8BxjUj zlGCOOg@h?_(EfUW$3bC$xlpH@nXBo7>YDj=+wtJmnbqG9i@sW+Vy4r#SEH&k8 zh=f9|a^1gRTd#%+Wn08Y^Z<^sh^28BacMlXT~ZRXMiN68_5XX4G?iMu1j z-KlnW>DV^5)w8NyyXvrZL9HtHR>Tg?5prV@c%TM4Z?UmP!R`4`OgHqqYOSnbG}h#^wN`-jRJv?XxeUx^5!dS+H}o45 zrHtNK_gP#93<))eR~SN^G$>ABB-W20DNW#5hh2HQ+$6 zY8N6woGR$GxO2-uztDM;#5QLrG@j1Uv5{>SPq=UB#5P9iR~#*d<;S zd&n>!o>{p=Y@RC;@d{AZo#=6NuiATNF6>R8=mn>O%~6YCgb26`PupV(9->z~))175R4wKRJHLb2R5Ue2R@9bmgNx z_f8K|&Y_eG4C!6?|9e3Ot>`X7(VpdMqw;293vqvKn$7*yr2|%1DCBPs_e=l9;vQ{Y zkysfu1*gO&m7_O8@H$o-(j&0fpsxD}aStFaNHo;BJ$(v2lUch^mF*3t*(X&iit;m0 zt-Cstg;q}i6@hDhzeEV1u7n;}smA>({eDIg`V>oxy^@u-pd2pMox%^$O{Ua>f`ASI z^N@qsVKUJ}=>|rcXXE8J)x2OI(AjF70hO=gW9Tt=7T{!ziCyRrK(c;PjUwMtJrk#W zJ#1_k3q$og*hn^HAdJZ5*&=pT~p11&+#&ta<)z`qD1fJs@J=%?P z#Z%(d?o*%z4Gy>VL|@fu+fe9vv{ORoYZ~Z$3l%K%@|n<(`s5$!c8V&f36Fy?V}Vvs zll_R@8%Ht3uOx&{J;ezD#SVpz!&x-wM~nFUCY01%PPF2n0!hq-N0LuvfY%u04$X?J z=PR>OB|fdhLsD}LX+BHM3s!GK89P!M{q>LVCXC~`|nelGssTmVj2a9i;+ z8jDD~Qr9IgEy)5r%QzPvmipFM0G>qPG>pr7PLV&$(WBVdD=Vh1y*H5p9Y`PvZ-`9I zdlg)@L+kvSS{i{^YvL{(eJ8o9bbvO}|Ey~Ql!hZF1t7aZEsh*y z5+;Tc+;e#ed?QPpL{^{c&#!Bw|1n?HL`1RSIX{@)$SNr?MaJj$q}7(Opch=R$Xfye z8#VL>HWjzEhhvz7&%_S&NAE1ip@fMLUJF>U4W=s<3_XagQaC(HM~{;Gs~ZM7OlLYA z>@Wu1T-9a{Hzh(Hzrg6PgfKR1rp=JFuAve4kL6;?+#6CIXX3?H9(sUKmK9rD%*t}l zR&slw*yuxec~;d3K(*8%?+&*TyY9iHSX!%<{WznFMv(Q#m2<-!Cv z3+$^onV+r4p*zk}HwB8^A8MfcvTB?Y$Y)ove=m%sp#7oAAV><|OW}|D;YL6FuK?da z9>mayxa3n9#rr3RVAP051?iv;!wzI>Z^Zs$X;G`>|ECdx%s@~l2faa-mfZ6g%6GWp zGmotM5h{!45MfYLnMf6e+M)z%D;YgB4)_aE(j;I*+Z0qDxMG+o#f@ep#G!<7vC@AS znBqZ8UxLkwmHr>UlxFku;v}U7N~R+1RESR-@W#aMlOWOu#q9?4cg5WXdWGAE z22>l+*>_13K{}l<+#rPgpTy$1NDW?{V`(Fe{)|+A&}gcz!SuC<6KXfk^_*#J_<6&(bYkt(*M6W8nue|?H%&UU;n3bgoOZ`sbEX3| zUr-6Lwd=@mEnN5Vs=^I>q;PUf%%&}Hvtppe>M=0<4%DNiga#x zbJO`b-_r+pNrh0EpS}U*&uw3mIUuR?k=#wAy{;Xj2v~!`0*4Anff^(N@3xW3OK{eu z%OBR|UILF-=Ul7~)TNhI7qT-uROrA^n|6=`Y@N<35P(AGY}nPl3bVmp>;@C~FXUN} zPjN_-NTFW9p0jH=1i-jJCT;jMPo`|DKXT5OsTbfb&bBf+{9pr`pMt3jEph%Ua>Soq zJFGILEn)30oL)^oB3l{gyGhCbes9(Vvzpm!@zwl=nm%+4ZH0b(b1cEuYO7%nPk$ZEHhzGE%*SkC(==8mS8z^<3 zmVABW2qgf}J~ZA^dMlu9&jlb|ccgzo=|MX^6Tj>HRXqI=rHAbFEJ%L|($_v7gw&6S z1Wu_4*9S?+29P@dWZQE+3B^GI>SqJ>#Rmw!qE=WZB>_7k^buSjz`hS&TsFZ9?Uthf zB3}D=8nE^{X_BpkUb`B)@E)0S9i1D3l=(TUf$@#16K0V3%_j?y>{FUBPJn6V&)V93 zZV(E(__wJi$i;VZnFk|+sq1cc+o8nNb8hkCr>lI>B5Ac7N7in<12xRj-K7n$;=P+q z_omSbh$r*WeHxI6G(CD4myi-`H+r;9DaWn(86|%?%$Ixr^wOI5kI+Zn%x~BHqN0E4 z{nN{9KEMF`bOgmEKYFP5PkUsCnGciXx1g6@Edxz%>4g|vgs4A4&pv&FU3a}3DwybA zM0n&UI@yRtEp;s$G$T%PH{+;VH@`Gd{iHpsLMu zET;C_@S)1JRb5fwzF}oSp;n!{!*KYX#s2%y&k^?bW zej=0v7W4mML(2MGC|mJ<=;L#-39&-|cg?sE&@O;VU@26A&$?)ib}X#j_%OC(!)|QE zrLUH5kSmWHaYgZ7?WiW*Z~$lbwHs5k_49MW8&Jciu&03RCO6Em)=$VughsDj?^&?P zV@iq=i6WS0Z#W1h<>K?8eR9FAU0=aAJY^n~KuHRyf}JN9MFD%=dBAfG+}ibXHMJnR z$up!w1`U^50cqI%5D{3rak7U!wfnhUqO9%=WC`Tf3fZ^5nL!Ftf@khq1Y1S>;TYHAl0{%IW|CqBbiB3s}E*({OFW zA&BzWh1gJbjmo{9l%i@h$M=V&_+Wz6xE2(?2Y%AN)oU;F{4nE77`Kdm9ZpXRTSCvl7Rl)N|Sp&1x9Qr6mF* z^T1ZE^!mWX> zwZa&}VK<;ADK!+<9_uEi@c>*U^;*N z_mnbltu*G-pmp-GWmbDi9yu@vTBq10O^Dm9*^2rQ!H8}60KtL5+vxjFMYJTNW|{{= z)?6Q_I0w?VCA;jUi38qk_)Xw7kE7Kimzzy5V8GV_N>odHWTZ~JL z)!<$i*uo4GJl6-d=+bus_%!m}Xk4PZjVuDZ3H)B=zZv|R^4|jf4Dg=;{#yaVCGZC+ z5EnB1fUx_yM!KHlGkivWfVi#uHITDEK&1c_(M)TOpef^YY^3R=SLgz+HwvaEDQf>38#Vrk4?bKX5zz4vHo6 zl|u;<>Jf0l-owiolrsqH%yU`bPNOT*h%p|B8O{I@V*+<0^tF5<1B!{jd-)s&Fy#LS z_iA>YUl<_Ez)Gj;1rT13p>$*iR3rm%>B-FK&cA_j^=c!ZU(NKOkxixQvjP5oW~Adk zJ&ozb2wrStLsF8F$Dd_-f&yhmfnh*-0VChY;U8h16imnfz6Ok*MwZX$g5?@LeO%Kd zR}+xdySM?gf*9zKJOyL6^8OmNR!QJq4By9xU~Muf&Wkbk^9fqa&0AcEJa89AZQ~~+ zkdAB)+>bF2@K((*Fb$vCg#U=q zH**J2X$qzzX_vME*;G~8vxSc1v!S6;cr6Oy5JkyOt0$Y-inw`ADO|6&$C`P#h zx0j>NHgaT(`w-+2J_|v{0AG7EW2ThHNBMGh;4yue(G%J;s~q3_fXX}uyddU1X0*cZ zF8&-=HBnX->4uOS8p;5k9s?n4xSl1+E^HQoqyrZXg7tw9II5=^0%Rz`=!IAx=Wn|$ zY#4rmGmjB7{4SvVpj*o9twsqD+Z_nejf)ZJNxsDs*o`3bJh7Cz#VZ#@qpgKCi|bs* z*_bt#S9%}^HlZIH7NkV?09ieZi-D+8AD`ec(qqg8EX&*tNRtCk8D8v1KBHD2Vbr(+ zyZK)LL0}uy%?n~^@=YGX2DwR^vPdLTeEd?6QL1>4Vp>D(0Tcpp-pr@?ArDBh2k{~WH2Mm$KUhH zs-qMuj(Rhn=k?e{j1Bx`pRry_1;C`se?C6X2T~Ov^@HC&*=2ADycqy<43F2oZKpDvA?1XgY<3$+MjO+jc5{Cf?p9}EN_Is#6Bp#X@#N32B0ECf) z4FHahFGv8Tg23I8Ufz;G&>-cfC&;3aBEBI3*yC*Rm-)^FY|_AsvVm?(uz1KHN}%r2 z9fBEw7gdG!^4^IOHkbEI1g1R$f6o$=vjG(Qc{VW90M!d2-aU~71{EXxhl5ZWPf3)b z=TEc zkfKek4be!8O~6jV{iMR3`G%!f-{kueGv8#!r9je~81WYWJ~8txsNtocB)oyQFz#)h zn3VZ8FiFO}jdAbro=KVSfUL>5cQEcR2t zNGg_nyg7+fhXI50;v^&0$D>KA8xRxT=cgv2`vE_j+z!72HgON z0-vDP-jBh1l1M*gej4};z&=A|YxMO0*~s$W2cv~I^Yg&R2I_!pqjz9Gj3ODvF_|CJ z@cA)>^Z5@+fdhdre7t{h08!*}Uvl8Hz?X<0v*z-gmhT%wGcE0)r<4#ILsRH{16yqpE%7 z#0jJed7UzOaid{{XM=g6YDaJb4 zd~c?h2`uEoQ4kt5=4}{o++de63&%1emay`;!3zctRN)-{NQwi5H>8*hb&1!c3aSJ< zQ{V+3KR*T12!t`HzMZCE0R-ydkEQXJqK1}eV?(5ECD|Y%fd%e@A7d@j_>UA|FW-@3 z*$Mn*D%qftl~P4uFiZBOSOZ@Yzc@_}pueSvL?)6LFcz6ClF?Yt=Y6|^xJ(dTm@zW+ zJ&FXV(0gL;V9*t~hwSP;E;PB)fN^Ae8Giphz*gCnln+>9W(pOK##o;tXtX|vL6HLH zD6j7tc!-dc9yvmJ`KevW;y2Q*@~>-GJ~U7V0z_BFecjA%Omt&LZ$gY#Xr*B)UpWpr z{N=8Jk9^$SO+^kf@|ABi*~_kOW-1Fjs+Rx}z4Z^I887>`Poyyc9Y0<88I6GX-Aq3d z>CnHxveS>~QYbMMMY7FK6&Vc1XcHYD(a_M%5~qdTjB|W^aW~ZpK8eU}BXR?xTjPkj zGyb=3@GE+NMZ{2PUfWGtmF;rjT*^$da+wBmg9^Bw_e>Q57C6L=KHw_rErdgJECt4t z!etGSdA#K$7Yt2zshE~J8S^?wmzNp+cxI}|WJIK_tdb8ma4`$I6WTt%rP}0@7@65p zqO+valZj(64cuNVmN7ou90@lDYog1RRYz)rAktx%k%p7Zo%yuXg4dKXkU zkPtY81eP%1G)Uc9x){LFfX6N~RR^^OMz9VFkaQVxb_H1O&>?bpM91FHsw=g1x^8ug zzzzHY9WXPp+ppJ2j*ZlqhqnY>SmIr1MPAQy{pLVMD;!=ih>5{iuA1F4P$6IHWURsz z7KllWb<5|)18ecGu%)TdB?clM{+%opLS#s;l{9Ag1GiF#$%47zG3K#SkMjP0sPRBa z7g1^+$K*^NnmeDD{C#2idSv;ytKZ-}E~6tCnf+Y`Y5kq$C!^1IW)%nGk;T^6kkk0|LtBx-Cil=1!P@Edc7BS_yz z6i8~Uj?|4fs#-p!&4w|)ECYT~Vo{ABn<0i1fqvOyg&8ruwi)dF=C-EV>eld4nE1d9 zCBI8D#0Vx)#q(EZ9L-Z+ml2;1`ou`aug?&p7Jb9uGmkg)054M_M=Om!6+?5|ELtcjMeq#jPDZ+(hbts` zK*mT5QYXl*F)a`HC*v&FnHPCAM2)t%7_qnqrGZMV00;S>PyCmY2kU1u{wj6R9X;&jj6_J``+GnU$S|7;BmxgeMqqy5w%#(AL63V8^Igpp(d9&1cC#v$F6Eb|afC(O}um>(mZ06C%xYK0?f z9)n(gjv+i~OPp;Or}2mpI0F8qhS4I9XH@!`5XDzx#8_tAUUIT)j!_dUSVdgzh!D2iU6F^0RuNM;&rH=;vNi^tdYS0H`Fd$(jJ7D^^hr!VWk!xh) zOp_U6$>WM92gfuwN1M@5If2E}s~Q@^!3fON7f0J7wL^obhR1aq>i{b#rnb-qNSg)j9D# z!hh8t;RpCw!IZYvU~7FC?747c+Kg#qEZmE#YnBEZBCSzMrQ!?Kih>`EMWBsZkE9Gm zWjf=%z)tL=*BYUix1_k3yNod~Hun}YkP9B8*IGn(X1=3l_ zuwd+69{!hXvs&g)WPEv+F$4O)(^g)@LMJH0wFXVYG-*JKT4q_xq8fTSSnaLhmR3~N z4`qokm|DBC#9}hF+F7^wTZeWXxb;|@Vd!g6F-vgp!xe^^CXkvAHC#$L8Zmx2u0@z9 zBM}r2|DViYxL-yyO!W7Jsqt`HG|r|q`fOZ2fQcJ`;-(i?-vdsBnJ3BqJ6}387%~rl zIIVYk&6&tb05?X1?!>izjGPCG$IHZYQcGU`XtszlVKDx1ww&moRo;ZwKMkGJ)hd~f zi=LJ_l7XvwAQnBz4(wwb1IPrB-xGdRF)9J4N{|o&xtfOqN8g^ZO|z(W89dli%wey&JV0D#0^i%yJcTM{q+6|Mc1IpsGau2+{_QkJ?+v2pnCFNV*2&z)|CD2D6WDpw z>YT8 zkL?B7e6$*Yf;S65V!iF|TT)zD8k_*VwQ_V&gd=s04K4MiOKld$k``AtG`3VP4r9&@ znA1?O1;J?$9h??!ZEc9uwb(flsGw4WfAn9JR2yz&`B+B_K<&2lqP*Wdn4hP3H zL|R(Ijg4)QIy4zoPS4U>BCl63$kf%&G=B6L8^l)^i7q3cF$k1u106qU@o|`h(dwF}287;?h*mLYN>f7(ro4|S zr`jork!Yip^cyCfW+!>A_>A5VzdDW#=Im|NjhIr1DW}I%n!_zMZA9)^OgST7O#KSr zb8nD_St=OU#=%%Zlh~FXWmL#v6miaC41RPG?JJEhF8KE!NP)#$0EG&z9kH zB-pu9m!HkVS{w@?I1&SpX@pp(+;cE;9YKsxkR!0*KQVr1P+3~H1jTwr3<#R*nH);R z1_qJ1iDz^-PJn0#SsTtixv=^Te+3_q>A$^B4O%Sy&q_aRem zxHyj)V{sMjhhX4CTx;;+Oo{e4`NEL7k*O`eEYOjC$iUu+I&ds#N7~iFg?3aC$AxG! zCPi)%N-J1yE_Q(&x`vu-BN~L~<67D#AZ}#{8!#MMFk_m_5f2vVW@c2F7s#>ZLR8M) z%%5R2@FSU5gmew&KllqBL=FxY!B`IpXk1+};9%*8f$y zfOM_%^matecM`QI#~A2LJP8_NZH}4DB&Aujvg`zy4ghcFnAb9KErVX1jaG`++=7}x zY=OyheRb2SmbR8~;j(BgHsHy6sWC@j`T~Fg5A|O>BGImS&XGhhB5Dpt-?6v_#iuEM zI-kU$GeccLE%ld)#xdm2P%-J$1&@Wl;qaHOVzU4WOe)$I$O2B3slE1OXYuDcc`~RU zlz5?e9W(w6m70J`@;Z{xzw^*TT4=Ne;*u1J2A4&lo-U)x$BX*${C)sroPovAVUJ_+ z=n4{KMGK?1q*@tx!@$D#7?U9xZBYP8z+DHDj-NP{DvuRu5RuqVTyIBsAR@D$xIsoB zD`}D5>_-ZZRznh;bz2XKv-{aCmId=yuqPGwv3uXh`1SqJLZk`ZO>!0k=KRe^%|;nm za^e;yZp9U0Wz{)nJhw6aKtFLibH*Ld`1t-7_E?X~Xp|P)o7!5#&H2GaZLNicFpH8! z#zxJFwgqt{u3i+ySy(iP_E2?WV{kxe!J>xNU`upyD-G4rNU%CMcpybu=oB6zcq|F9!P7T%*MDxY58&=Q3It1S}j(t=2AO?3ok+aL)RHBJ&6TAeh>X@3`NfSgX~ z%4EDy*mQN97Hw``)sddSYaQC8^D5rO_~|w(akt&1_q1=)TVXWj(7PDN$kDtlunXqx1^iZ_r~3F^LZ{8nw!q^ctSK-cXV9U<9R89}WA`yA zo4qiy4Ma4M@@fL~JENSjetv;X=+&l#ge;+;J2YF<(*n;M=NkR^3#N()s)%RJ z&{-M`r#8e>R)hudgz4@QU)=&C&SU%y(>NA+`!~{VkO7Zt;?Vq?8B1=$wFcU|_wg>d zv7~qqID57hvJ#d(bKQXfl!@W)PUC;bi zqdS3>x?GQ-?*`V#bs>80W2Hd}bQvrC^4-_bcRwqA{=u8kw~dwl`0dx|dw`YXT(=T^ z3t7q5DQW22&Pu*nGYWm2#ga<~uPhl{xHuxmadR_me0gCI$KPZcFuF1@Ka8BfHPB99 z=VpGuzd-i;_z$^(_tB>DG4nwXRdY2n&t&F9%-q4uDa?GBnLC;J2s0mL=HHolCo}J0 z=0s-R%*>mZ`4}^IG4pX|KEccK?zRJvhGV?WNzRt`ynE56%-(u$5*pa;EJGk@K4Lt8s)vZm@_b9ZF@o)3QdoluC z`{1VeJ`?+xSx3M1^xH_kAJFe2`mLegIrKZ5em|t&kLdSf`t3!(pV04k`rS{zz3I1s zewWa1Kl=TYem|q%9QqB?Zx8wn(QjY+?L)tx)9(TL{ephesb9JW9&f{l^!2Ya~V%6q&nNhJX-)0if^p>9~JX1Mty5XVKLue)OU6imf4*MdEI^@LuGvn73ig%fKhjwlG8i0@|U1rJE zwRae#!n7|9q#1m1as7qyLzoj+zwaxQ6ImN3+s>IPU0iFO#T595g`noXE0ihnv>t6$ zBHAe9i;7k2EkIAa>R8WUk@%IxD^ye@eq*vZ{Nf`3!)%cv5;xia&Nd8MZY1w81q2h6 zNw|v)0T=C;fcImS`Q9QG;8%l>Zz_UGq&&fh*(o3Glt>`L@^Ku?X9~*)MJhm>zojam zJT`R5iVG4^Jh_-B6srwmS&WaT71Pd$1%&(Ezc4wZr^;QK*~PfkhKq$W$cI%$u6E}q z7OOLbrPhHlpTtXI`z7Ny43GzK+KOfK{m!tv5NfXpgUIjH41X;K50&8KR~5^XO+aN= zu%Qp5`Fa@B#Sx~?ye1fU9)p%5fkNTZO0GVa8O_3vJ1GGEbuoAa)A$#~Lepq@oSa4Q8B*~aT+YnZaZuD}d zTKHC$`1qM6^5CMxLdP}JY*^&vbf={~7E4A?DiuDo^bZTqb`+i=kIEXocvh)o|Mw+w zhqDu+QcLk{DxJvARvT^qhBRX6u2N_k{zxg^MNmXeB%{f&SeC<2FNH=U&S3KbQ{0-f zcBxjz@$rmfDdP^zNSWm3d&m50HykJ^1OXEsO>VRE0SK7!ABstj0ZL5L2Uud#dw^3+ zc-{bOBU&C?-ZH@Eho4_gfgFeAp!+!{nmjxpuoJUY#P?R>@`WcnaH3>!gTISarh2A=m7L079blcKe`|o_27~F*_^|^`uSO@- zjtH-Yl5ltcb;NcE2M&xQ^g%Vect{{`poO($pcAWG9UIPmmIbS%j$i5C{f)VQ>sI>e0Y}qmLvcBpdXUK`K*UY|EoEfR$lo;*mkd z7)e=z_OA$%;G||(43Znr0MtX4cjX|E=_a}-)zgX0$G1pW)Rq9Qv}KY8>2%x5tJLO! zLDYu)(?O6OyjZpyNKeuvwe}1pS(6I|h^+>(^#o2HgT>Jv6a@O%Nb3emq_uNK=psYc~U{5w?+Wo%D(FHFbVy1wa^76}u$aw53B1NOb z4MV_8N-$=cT{XjP47Vi97)_j-NRO4`^hk8o08kEJ;Pn{Y>3&-pW(Z1r5DzUls`D*f zg_p37#tsKuH-_oI%f5-8^P0u;_5VsJ>Il|n9xvTl?-)319+%$stn!Cc0|^=$VN`;^jlrrSZAL|C2gr z$T|bj*q?!L)vckt1X&)6`9w*IoRuIfldz;VWM}C}AX3poi+Pt-H$+@`I7pLQPXUc~ zqB1qPW|O7K4XSJz-BZKWXPDt@xGe28d#PN#RXC{WQ@{ynIv$7XgG*uH_SHfaxae~p zGtxsrT(Uki96?t~(76({Sd*Z2a>dTf0WF}>h~+goXdWDe(BBVws0KY8kAn0E6#$fC zl|nd}dMH*v|At;BM|{(PCYR8-$)Bfcn6K$+v_?~)iF^(85Bduo{vu5eVjeo*T&(dM zM}i5|ExKTNq^7C5rDa7F4=kGe{t>v5NYO5}4;)=kA8l!EXu{;zF*z|3ZUy+I3LrVU z03w!E%YEiwI)|vMZVj)fUWE`nM;;9UB{tR2Zu<~SO^7a_-FG@7Ve|{U0!I3ENU%G) zz-7$R(K@~c!`}LEW0Q-njwH6URyVh{QK&D3la_{8wN@``3|kS2P0i884Jyp9!g4&( zrdF3@Vbg1tXngxfQLKSfNvpzZmTLT#QFtJRw7GpS#vBmu%LC(md63UA&(Ug1ttPw2}!os0F5c=iKEbDMRS_iAd0lWUC?2mSy3ln zHwsLI0h+Ry03IkBL9?54M>%$rAs3A_88p5ZNim|!oM28BX;|OE8vlJ1O}yQ7&vk3e z>*p;QF12a^I*{Bc;#f3z@J8d8qtKrrCr>{9<0$KB zDMR?&G9(ZyC(mBu?KE?U#vdp%hf*t;!=y7@qa~c}xT6)6>LH}m19m2~ge8!Q48IqMnG@M#ne+^Sk2Rn3V^7B-x{Nl-%}=_&}GiGO;*5< zDaWh%C;(-$V#jH6T4M6!AqhaSGVw$uq9ZlFzuagl(ZD^BeLKFvfy9-lY+-+e0rs*Qu?`oPpt$W zhKHktUqIer=q)7gP_*}}&}$!4p{+@cZ$|PrRw6`Hwb2+&47LU7%t~y6^_7f?AzFN% zKUU+@kY=OmVIlOvXuYjfu*|Ytk6z6+KWVscL!69~lpf6+ctWeq}s& zEHkQ^Q3FFY#@x>MjIoY=x3Jo71A45r5nupKx{lTOy<^2x4K>{zW6h}=UQbHkErs>S z+Y>dp(R|t1_~AHbDm4iL+&GqAr4!e6f zwr>s-m#UfLcZ_?+Nv)p`bsZg+yzqZ0-s49K}Al2Q(4$LoI0W8t33- zXv>Fv_^cDGahTrzC=I-!BhLO{)vv&O$d@i|d2tA+SbKt)rzz6rYkc_l_KV~>7Ec{# z-e*WZp0m7)@gd_84fJlw&7V%7XKLhP3$Ff8l}pKAoB%3envZ{bg52Sn;p4xbV4NtK z-5$S0ls(>{#YvhtnN|b>KZuL)ASy&$fU4nS4G(mZUO=;JAvSKRXk|tvgz$VQ8oz)N00Tcu z^CFo}UIILSWjsRSh;ac^E7O?25AGS#^k}BW-=APsOACFGv{e`4BMUzpJ%Pw9pqFG) zRBOC&g7_<1;hXWCNY(^>rH=k0CJlq4u?8~{#ncJn61@L9 z0r)|-C=e+YX-8KGf#01VW{`5&Izi0U+{ojrCP*F|xWk@maD1Vl3%_N8n599_M3I@V z(a~L6QV=DYg&%tLU`-lTuS`HOd}{)v#!af97(Z(gC^d5-DZT|7T^try&|$UALrgZ8 zb#0sz9|<{Y`S zeI-82m5q#EJ5e9*;~OUGQ;=b}v;h5EE@OJlCfp*$Ed^${aW?5D>JlayZp0vuA<(2s zK7a$Nfi?wtD&0Q}bO5T0iF9QUei)Ot2V-3)Mw`RI$?827w;LDMl4-$I_Ru8rA?#l? zug1=v7VmS@u_=^lM5fhfifK)g(2uM6Qi}k;X7Rd7X04p8^JSAPzKO6FZ$fOIc^c1} ztgaOo^1n>7rcHFe7#sE0_EBsIx&(Xvt%WT|icc0%l+jcRdnnT(DosHj%b*w`rkgh$Ny z_^D=-ruRS@pGn@HG`BQQ(fDF2R>LDFUb9)_%PH)Z;T9N*DeRHqRr6%{jFmjc~Kbh(b` z$T$&7Vd7Mr(?;71Z}Ew!yuLuY15z?Oiri$%sdkc1(>h9cB%YkzAsJ=i3M&~mR_x}X zcRM;jqx3x-hsGIU2MC-tymBJz5Q|fXA5UzDy8{GHB}Pt@n1NeOxCe@rS*;npFof6Y z!0GkxD8%W-#`bs+2fYvWKSqYrkgKPO+gSYE*XbG`G2J{v6H9SPY_w?8tXm-FYR$%m z*kzGTv~g;l*)9zTkykbW;0z?kOXAipdq}3Fkzg{F#EYjx3Tb`kwL7 z46`0ozc@hq3*vN*4k}@_yO}G<>M+u9tdPa?Pp6wJsWYpCO(?u>_z^8~-qKT?VpXGA z&2PX&fgZZV0s&yFl}x^Sx;PU$^9$2Ot0tc-QBxne7>ZjZbjg|au$_G8Y=$@s_s7gr zHPv!nIh#2Jy8_H*n$=w9H^!&VFxO~ejYiKqnP+R_Y~@|6iM7hR!rEXv#P~@w)FkRG zji=0#%|>$3ix`Zkv&?lC8?d>MDQKXz z@pos4YZ-ra1{pvz@C~a3AD=gq78k5s-_Hv5fQ_1IA^}x1O(MX~BN0xNH-~_rXJCH_QR z(FYU2bRZ*J_AnKf3ZeA`yFueS2ywDh`X;}37ASmKk}4tdTu-b`Z_WTqb3s#&xrKub$sBFt#1pKR7>!xqd; zI>jDxc|tCC$mInOomRd8I5Arcvd@kHU1@a5MxEO5nip#P;n~1M1!H-@QO`XhX9qF0 z-$8|5r173}+y=g1AU0dps4<6hfZXToPR-OEQxU025m{ESJ6+q)n1jb+Xg6G5bxD@& zy;$R~%rgfwn3v#IUA-m-qXhtDxed2|gw7eb^}{-P%u8^m&&xlWBj4D3XpZ&9X49Pb z8=DWz!RLwS$xI!e!|V}qmEpZbaS6S@U>NwGQ$8eu!HRpCcx~vGIbfpm`{o?|x+bkO z95zhI4efxtXK&3h$q)9(`*ZB)96j`C5N#ag@ey-T7g7+KlMkIMUk0(_kb#5d0`o7> zv`I&0D#PHMSs?(u9oUVGX zWZcn>X%gKxlBQH?u-rKpYi+&^v&*mMswX;kQ(VkDbIi1ImyaKqtK=vnmdI;^D}%h& zMUN$^O)>Sl554~6ks}`yP+D5xM!NRYbspX%O`m5BrOh$qd>?S2E&3pB>aeRNw;^ofb;jReltYi}1GAqw}bv%43a;#$djCo@(VTw8yZC6v?F;|9YM+uJk~cSLv8P zYrNn5Sn~3Q+He%#7owT;Djc*A;Cn^1NcIH-4DB!KT&D4%^DT^G1EKnh#wW$&&ZW3o z9KXCKOa|RB32SPsZmAzp?24r-@A7c-qG(Il73-!VS{fR|c##7Y#9uZ3+I;hJE#BKM z*Ql+Ss8z}apF~TTRNadA#bb#xEo=$XY&2<#1%K1{xAQF=?OAYz#`~WX-jyVtGQ=;6K+P(`k-F-}1}mz?6-%m!wp2%2mfCT3u2}k>i(Wc!&x3pJ z*|YVfvtC-WXZxOQGSyd8yTHUzoYL%x3@FYKee)x%NS{owO7U-%4$5$Ze zs%6d9;W`CcTkVSZMq_~rEF2-QuBt9UF=M;_apk~RRTz35@SKRjLEmv9D5#QK` zNUeaX;vN+lf!cMM6s`?7H&#b#E!IR90k%oeW{d6aCICyA5^c1p@HMqA zm@*ymPKko_*0t@rr6rzFaiS}h5l;w;isowQVODE2LDdtdv_+OwFS6>?4Adr_7+tpO z+Q{Q;tvIM>>Yl4#TKm!(DO7tNP$@uGEM;0_ba^=P_$FI~+$}(4HyQoJHSH3Biz$^a zowaADQ##!(%Ylw*0Nt|Gf?N&_kUG8L{p~v=b-|ep??3pbR+Z9|%x@^x5p!9qwV5?%qsr3sgCxJxnzvHZrc3kq&w%b4X^Pl2L(`UJ2 zJ@!Aa=CfO4GASrNzF_PAHCu>J*hjC``0>@^8jX*xmSe0&@0Jg%*5%PUIuBi5?Od?m zqVdK>=5@FX5=+L{1=_0XK&t79fu?HndbJR?vRW=?C73s8;(FX;_L?`M4>vf(4YWIY zd9_?@g7_P(Qz^-~4kF{hUqfofyonYxZ>E!yeHJ17O&UG%<(C&V(g4DG*?^J^_276e zl#;v%qk&>^vnH+Xo3K1EZnGB2(=RvEQADyH^dOXp%1r!SVrN7n!#@H2kfoIk(UZOk8Ivd2zM!C7VxUEvSZA^7D(t zP~^}Pizvg*sG}XEc2Ts?E|hK2{4aNn-+ z6KWg>m7GJwt@aRcTZbXy4vn82FIEl_cWS&j9wjcwZYTIf@l(=HdC5MHr8h@t7 z9Of`JhcP+$VMD614{rlLix&}Tpd$u7%IqQUE{z|qapoj@1!u`$)`+`dI&`Q;4TL!P zl4IdL8b7YK!^?Ee+77cVg1b7@_Fj!osI^Ozwf%?27slgcZSU6j-@?xKo~&nqoCKa2 z7Q<-;|C(BJIKB^bCcO_tO(dUFJ^ID2qn;H46poiuPnjMKHb$#!+dt>k60B`#4%f6c zt_m)0jxJL#aOEe1^#CyT^IP`oUyJG0v+8A#QM81cs+%FQHhIx1`K)V8uz!AkGl&oD z43)35%6EM`Jkgqe)Vr+mHgv}u?;YMTGVcR}C@gwta!nJs^HNxpYNA+kY;dgdW zSv%t@Yi9?QwPP`>J%?;DAg+b$K;!?t32K(l+>V;Y}UXF;|%Fn4KueO>%mqq9GawENRz9s1Mb8o$EE zr~1-a=!1czw(>dgf@zGOj+BAo~wO$2`*} zOmW3LRny_uJ9auco=H_;7#y_sN2)48Vb6o3xs~+gJ*5={_ zZi>Ixn@@F*OtHFj}(9&Gfu2stHR(YyJt30dm(gvGI*(%Rzyeb|i zTjgnu|8wcT(sFpB{;>w}JS}-`Y%rgP-k^^PY&}ZTi6@w?+%$)BdtP%qm-ZwRJDH_# zqzbKAB3>Zm2OG>69LVvhHTB$@qmW(kLOhN_UT_xjA{HX{GRNa=jz^|H$5%~M`FQ5~ z?@PpsRDS&u^Tj``+*6%b?!}|ZjaLqz{Qhl;*h9#lSYqz^L*&nNj(pF*K#o@*&RZ&8 zBIKn@&6h0Xz1wr|Xb!#VWqR@-3>}4x zuZ-9-8fA{26z?PLgmZo)ikQ9ZlByR$WdBB~D}8tr*%3d=ijSpReXzcEXi*VwDZ+O_ z%jpqLOEQ0N1i6Z(T7ZjNn*dS*$vepMn8w?UD&&?Ztap9ofes1tOrr{UhPDSnQna!T zF{(C5ddz2&)*b*ww`v&*V27&rS>~*Ith-&$R-*r?nxdF)UWUTf0nyU-h%zihk;N^Y z;X#RPiGUo%Io7glk&|OKH(p<6af7!EJGyEf3vO^kg^uQ|*MiB3sL+4PSQIvjnH0-r*UioF0U@68iUFUJS`S7ACB zwF+)O;Qv$O%cC(bU~OqPt_-lpl~+5AE3aw%JR6xBS6jaN6>PX}2^>d~JMwT|yNC3Nz}&xabnvI%};$@KP8Ve86P`^#dN zHmT3W;a9u5%Pk*z>JM;Z-j6hXdlOyk(E}L%7-mTn##^i(X*3nj#9Fq40E(r^E2Sl$GAuG5$#`@z%MuL$Fi8as>B7x zIM~!+MoV%0yhG}{8gLbOC{y3UnKINne2VxSERn`jfcx?p|35beUg6K2A~O%i%%v{# z&zgCeX8uJpFV=980+U8y(g2rvg=Suo~n#x?#EMAfK??uc1MP1tQE|%0}&uef^ zrgw|^klcW6SIJ!(7~)`e!;Ao#%3G}M7TPv=3+B8nv}Gs13eaL?f*EYVbbyt* z;Qb@f`A_Thh6bG*`m?np^~F(GztqgHH1q5K3M(j(dXrTt0O<37`jNvQYgHS-`%D&N%jzE)_Y*IMb4 z`9ab%bdM`j?dsui1UgiWiCK_M?xoWOFKCl@TJ4X0ke*zu@xnGlo7V zNmaBTtNZZNJu~S61dS&w$Ln)^U7LJu_!YjnO&!Xyj)44KMu_jxGR31;X1lXf)WJN< z&F|G|Zb!uQ;)ARHaxvl9AWi!20`aPj)rVo&QZ>THN2TH#$G>7Sf zq(32a2Ga*if1>|){aEQu^1rViC%wu3FZChP+r|HxUM#&S`Usut1?2C_m_CAh-St!T zx%w*dXZe58i}ZQq&(=*{=qHiCe<;fIKKd{U2>*?GNbgU6Q(veLli2h1Rr(zLRPq<< zHF~9t9smiWq<0|150&0QdV#(G3>x&$)K@coxRT)?C3oCu&IqRXFkBz0 z&sU82$-xN!-4-MKH~R1SzpT6eJ$)1v36%$`7fLi~`YHNU#eKgX*2e(PT>>X z{4Xg+0)Q;W^l$gyqEO`d_xpD%)c<2KV~QicSRCnRDRs@{+MMf!4RF4@P6^+kGx65|p*qEAvnN5hmF;Eo!na%GGAzw|$E4^+Q7 z^fR;7#}@YQv@>()i_;wX;&g|;IK!bY7OM9A0#xXiO7ngSV|r&A<6HlJRZZdF=ijPW zVe0c?gjG7@XBa_#`R{bb??=`AkE`3?QC$|VEwd|ohNTJ$^bwXSIN6HL0$s7t>htsT z)2x0zOwY6W`A}=5H31~s>gOlvr*}RSNbelrh^pCqklvv5o*ehCwpfPsJ?t1Y{MU3g zYBi7Q|h#Q73h`CphQ{<{===36{*bZi=>{hyIPU2oP;^xr}L482vK?mw(L zIdm2O5%TxY+w>X!-yA*uYw`#5s6N^ME%`I`CVh(kzPK@@sL9sP&`)Mc`+}XxgDbVfGw(JaRU-W^`5w> zDzTM=(6yGJGG*YT#1#OI&x#LD`J!%VH!c_?R%h&Q=?3bI{_RH(weeOP1RYxGoM}wY zx9VtXtvS$HMyWA!6_dj<)|R>d-CUuww)?N93Qh~|R{w*Rn#!{THXBT}{vEj?&}w5x z>0$sq<9|6xu*?q4-O={ND)oyi-Q2j+6>+6&vX1TB(MAXj@x+aUP?g6a>Xn|j6oiI) z;%X)|$P?Eyp%I?Aq6rP~#5GN5tS8=ALgPGfT@yOiqxcCz6&mAF5(e_4+C_G$(H=*a z8t-wKAf=wT#t9XB;x-DjrGEdwh361nPOp;+9M+Y6~v4@+Xp}`(C;DBI< zCVCuQce2OPb&vNrx^B5AZhnM@d*b#-=s1s~Q&)K6Jt8#0W6QztP>IKugpr|1o=yb7 z?db4&UcAGHMzVN+fZ3~Kbn5CDvqRx{pE%jlnnmd%Dj?W7i zOhP_pnbiJm{+le5`V1C2y`4#Y6z~5NBU&o;8~+zJrT5>eaxiUk{%>dFdA2ThF7-GU zdOBUo00Vlff5(5n&|`_NFJATj@lJcPV;v&z|9HJC*Rkef6XjgfP?VcKn#O_(5}?&W<0-7C&nCA!_lHW}lQ6hcxFo z?RF=#<7ceJ&zgOHI(|Z1{G!>1sN+YS#jl!uh+6!n*@vga@0xwkIex%7etuaT*6b6` z@pH%V?TZ+I3|d}8+{3Ge)T5Wgg_XRU$zOi6EYvR-Wj-ZlXKG{ z$<1pvn_b*c`cQ@^849tE)+;J+Z*sh%5>KSZblr6SlEA*(gm0-_OK+)|DUd*~p?b}( zM3LFeO{e)7U$|Lxa|?*ojVu9h1$_Kw3?d}D@-9pkWH1bXq!W7dTJcGnW66`E!Rg_Z ztt}y9hedxIscz&NUOFn^r*BrzPir#nu+f(;9_`qSVZ+{=xpy-i1Wa_(Wi55^ zdi!SQL)58me)$F1DlbW#&=!W9cI$@HuHvUM8abEN+FTuJX{@G~4+`;I0`ibwbb)yT z9Xh15*hYrqC^o;K^P|`!E{LCN#PZ}(Z2qSU{-Z;X+_e20r1pKtAF3>jm;jTY5xLeHhe{%f~&G z!=;`x%Ao9}>S4exyH8>6^KQOwjSK!`@YiL`x}M44`dsm|?cqprZ8#YrTiZdd>FER4 z?F~mz6vxR!EX4GJf^n0}r;Mu%j)~y8>RMMt6hA182XXOJiNVqMO+<>bo~Nj+j?{p9 ztE`7o!$C?Spvq{ZwIR|Lc8#XvywT=W$*$2+d{+WoI>GBYKHM5y6>V$oc%rv4+SIfv z*c`5|T~+9ce}t)ZMYN!$p*9Ru%p5I0!Bk(pJRDpEWkMtoiRXh`!Zp!IZ4f~Vlar^n zHAg5KG6kc{Ln@qQqEFk|p za&oe3nqn_<&w{bP3yS~~={un9YdkT$3-I56f_CY)`E@Er>+gy+{c+b2Xs$)TPyVT)`lAD4yX2}*8= zIv485jqP;gTGFPc#^T?yO4xk%%fEZl{0I97U1cs;%EA62S6SLMiQo0_<0@NU(e20n zeO+Z2Zt)-Kp9AsNWh4nsZo244?lGdjt1PiRv6m38vXsYCa)e24uE=$j1zIyoL>{@v ziF{Yt*7D?`qQF&lUAljmD1>k*dAKMd{9{BhxsyZ*;N6loQlKZh3P3~7>47opvDso-s@#H3%W6AZK1nZ$E?u}HRFLQ5l zm7Ue6+t;}_Q}|HsEr7oz?Qrg`0Dp=q(+ePkQ z^ByPnhP)@py(jNUs_%}x-H?Bm|EavEDE`&Fr^)>w?-_Ex&U=>J-}0V=`h1v{kpDcn z{`?onJtqG}az*|gqN61LC4wKB|1!Db^Y@ZFJO34O!}+gDI`jW2>CAtP^vAjRuT%Xm z%7266ugZUu+*|YCB6nN<+vGlx{|=P*QO4fy>?;4UrrhTN+Qz9sk8g73(^ui$%fA1(NS+~*2@B=@y~ zpP>8}|GNc;pk254_ZR$3@!uBwLhkPczml6+_#3(Dg};OQp+8u77}{@Fnpt>+!h;Jn zhWx24bTh2q*ZT`~3hyd32=0Z#07H3sqcD>p-##eJqI_Q$W>fkvg}o@8P}Cdf_|D(G zsE{F@y^4w$>I+d+%urqi6qNv7Ytx1l4I%idqM;N&wP*yxcAZx=lH71nInfa*s$i%e zmKRkL{Mw??RNm&I<0<^NqOladp=b(2`M9@eD$)H&(TNP@{F$O@4BPwVqUi+xUeOGK z|Ga26g?}oVLt(9WE`?Kz=TSJT_++XtFJ3_PEi7J0>BEYvDZQ$A5%KxN;u@;wyy99a zzo9rx>8-^}sUBw(M=0OM;wZ)cxwwhot}8x;=-gV|LhZD@cqPR@RlJJeUoAeB;P(}u zM&U1uS5x><@#z%ymYhN1w36Lg+4+6C`Ac5c%FY_#?_TnTR^|#N_9%HvLp@@YyaVB! zjLedA-I%Xm$$D}Jl$=j)S;<9irp3DES+~T~cxdg|8^NlHBV{{!Z>4C0A4WwvuZo{AkG*a-S)=j^bY_xt`p2OKzn2 z{Ux`#QI5YWxt-i2C3m<{p1PLa=`QoUoRU#`mmBqecIn-2Y@dFm_qefr3rp{%{KuC5 zgVINq-si@4IllCMH@4rD(ruJJr}P1UKRe~5((P`P!M^Q}1^a5hxd7LTsvZdcg`5DV>yRQ3%uv%LZX( z*LU~bU9B4IYehvmHEYKCE~5l|3JLgIbl4J%N5RvNS8Tt#}ocmJ0~Gs=j0F@ zofd3or*ksWzi?U+f913x{=qo~@pWe&;yccK#6LQxB6c~iLhNx)!}{aSA0dA3yn1{I z``;73bzXz{Dd&%|KbOz`3DW;D`=?lL%Iu$E`p;%xi?nn0bj)|pwjo6go0aQ zQ(wV^sl@O3xWG2G$-hAe13mg{eO(x#B(cD&eXhl~C`oKM|;FN^BD*{8SisO$lZA zfn8v)DcSd|X_jyWqDz=?O-W#jX`a9#-XPcj$C>XEu0~ue*x~tI6IKbc;rYiWlnZXa z@e?-)_g+)N&7Sa>umI?BIa`GLt|A!`g@O;x1Zwt!+pSz+{SdQsOgcX?HB|L!Xe-~C_e@+OifTn-=xga7A z30_R63Rfe|7Wxpm!UwM*@-VHi4EsO5(2sOMVL9aQnowN$5RT`T!iSN*r*I99YgJ(d zVs)W}C>I8>+}6U!uOa%TrSM5i-(MKSasRIHX>9*M;WL1PS9TOWdkvYNV};LQxf6xI zx~62pqZ2+YH1H+-4eXi1aePVZ4W`cvS-ym7yJD~~hcB7Xc15!A2B6PRo#eWSFJa%D zI^A^(UlRCsa*69Uz@faQt~&tFPh0Q0lP?*6W@?M;E-e3&>u$gyTc_(Dp0wZXx)-1O zr)vS`Yp#WS$z@U759i#^mptB+_meq`FyB3A3Dol`H-AnkqBv(Mls8^gKW90V`*7ON z=R5$|pVvBP71ncPj)?fl9541~WR8z7nYxY}KleetB>1~&lji#IIeuKVTJPIn8o`;hxt>_?OPIi!E({xx4>dxCq({UXfAk*OW-|Kv+{ z{U-OQ`!_hQlkWe5{`A|vasLkaaKZh1zU1j&Of${<1I*`dIqSTau$@`+UdD2_&U*#$ z{M6O+UPF4ryfC)2Yu@YF|JUZVK|Ad>W!@V|_s(m_{(U#^O&DiSp1JrS*7xJ$x3E7& z#cyM|#l`PHeIHJ(EPfaG*<))g?!a=PVg>7eqqr0KcC0wUmvBGlJ}Ukr)|V)bVm(=& zBbcA(`4iwb6J~h+4EQZq;`sp6mwJxExVBDv$kV0s$8!w(AM$j=yuUf^70+LA-lLws zLVIVXo$~w-%Gr6(-?3k&l7B$CXx_Av9(;aY$%okQ(vld~TV8S;`t!SKkCl7`>2FSJ zDe1*_e_zsvv0wh{{};zyfBon1{6BMp*MEWa{_gq#l>fJ`{}TEC!S!DOMs0o94`RO) z*C*lmpG^JcdTM?N_tUF~ufKdgnU~xfvgenKAHI6_4LOMS-C%Ag;LO0%H9wlkXw8@0O|ekaBO|G8Zv+iyPC2Z@C4LyY+5F*RAsr zOK)9>Sa<6p#L%rP5D(s3i_iDmDkD8~Ycpc*ZQC(@_HBESzW=sgB0hRs2jZ^VK1TfS z+fE_={kF4+-`tjcFM00D+pk3AZ@1h_((k?9jda!R_aFvuUxE12?dvfAgWLBYet!G= zh?n2djd<-H*DfG<#~rf}*W7XA0>Y;!@3;-=-`{aN;-Bug8}YL{$`CKRvwQ)O&%8Sy zT0rK_edojY+_F2@V*X=y)-E9JhwfaD^uaqfV1Cb?Pb?tv^YxuOkiO!sJqw7u%($x! z%iVp~8<<{k*E{(9Q+GwN{@>lzkNHRL`qu)~>vu8tp*-AeypNQddiNy6;=3*Pk@}b2 zJq78yyRSjqefM-sfBkMA>A&19AfCPZZmh>N{}H6^^Y>!8+ve{_+CTqSh>y?zHR6l& ze~+ll{{!NQ`EMa6=l=t7@;#qmeRJ>0T1e>9dvX_|T--BvAz5F~-Q!tE^hN7EB@2nY z_|rZ2V7dN#?#FV>y^D~(`d%;6H{Dyakn~5qw{{`n)8>2kFC_fgd+&Rg|IWP;#NK;9 z!2IERRm{&_(1kdA!C$ey`xf*dU9;drq<1ceVZARcIK7a}qq5+i3kjc3Ea=Dde=YbN z();s%c;8nGOD_BD>KXSX7Ls**$9;o{<@b%hpOk;%zRM8*^FH=|VlNKgmvcYK@4e52 z>EGS=!~02n6BqvYellLi!s(cP&%&AalYUe#3?gn{*m*zU%WoETA^qOM>lTrEPA z5gAu<;i^T1f0OQibrBgy!TrY&7v4W_spX0OGv%1E;@<%#}@r-3F-I1 zB1b8q*~POh9$ExUtF>o>A;dLOG*2`T(Sr0cbEJY@#7`GN4&7)=u*-jYw5Gg2whZq?{d^-O~MtcP)Jp%Rjud9qFx0 zqe%Z|>32xKw={_uUz)=Dsb%9=5S+Sj zvLCJ>^$ahYjP!)%Q;?pu+=1opTRsn;t65&Wg3SMpJi6*h#4lC_5wpeT5T}d3K)h3Y0kJ~-gZ{i2Sw;Bs2l0KR|18E3 z|5xlo{DJoxk>Jm~KS8|RTaEaz_xFfTdEZC;gLe?|&t9_^pZDI0_=DB$h(BBXXT;lA zU$GjWU!9Bi)M{Zh@rPerUAP+c>FT1@gdZnXmtcNs^__@$zJ-Xzz6vb2!qhGsS0n!I!75Du z`oTvKuPkfAbiVAjNZ(ubJH(o@KOjC`){Pi0`wQY<%KnC!DCJ z%ZR_3`|z2vk^qy>Km5O#KL6pNGSW}!VUwTe)2$Cr^^@m+_wY1&6eL_Wk zIqHduYcc)43OnK>6>|}vtyqQldW9G9Zxv;TUspVhc%`(joal?0(qE9iNBXp!^iz_I z50QGeNri~Nms}4aKcqQ`pGj`S%PMa}{AuM~h__WLSl(Z0dzjG8m6eG9Re2OKT4`BB zu)p#uM5byL;*YC#A>LB;BBH-)Y6U)Dbrs@&RZXiP_5QKSi}XLMR#y;yjH~ul5IdJw z{UGMMs};;&QT=zs`sy1bTo=`kAs(v!HDX_NCt|YtABeV^qDu6CYwoNh^S7kto=T#B zYHOaXMEh5hRYmd-)Le%6*BW~jN&l+Gg|vC?(@4))yBq1d*DBQnE7zK9(4MdL)u4V_ z`xerFUi&uE|GW08wWuE+5fFd&NcmbaueUyO>m#IG*(0|-LeigjWFz8lA8AK?{}Bc8 z(?=euC74ya74e$d*J{agH`ay`y|t-YQlDJQJWBYqw>JDJq2H>VypHhi!`ghrZ)<&SEBqj#+%&ow++hUND?T7mfXqcxZwdvyIeA~)YY z`q+BXkBRFxtta`;b@fOuT(@~WiQ^wy_xO6k*T>g=fcY=3`|Eo0T*tZ?V&A&cnEtPI z|3u{0pIuMlb^H3^^<+GEtp8*KuJ`qyZXooN>%ZJUj-`;lJ0;q5w7|Hci6F#Q)BIx+pt4W^9*Kin{PBk}VFH#8#sA9e2_ zI_tU+7uIDzMzFRn2l2VO>k!-O9(#<8<1ckbA0zdjtvim$Zu|=K?Hlcz2;Q~vc0_68 zV#MIaz$T1OHvR(X4>tZ9@$-$ZAYT619}%y8?5cXydyj3ZC*>b{Yy`3SvB{fpojf)b zG5XlF%_RMwkMW4(Hr;^f(>C3Nc*CZ95m#^WBW~HW7V*VR>k;4E^c>Pkk{6Cn!cyk}( zqnl46KD+r0=D)W2OQgFt=gI`X*gRK8JKnHBCUW}YhKFS`Z#Okm$ta%&j|0~teM`WO=ns6lh4jBEKsOQkKLc+zk$O4+{1~yX@d9G9vGFM~{>fXmBf7Ti zehTC6E$<@MZRvapfa_eroY(aNBX^{M-V@0szn_4_zRey_xNw{Irrl)Z6kinqQ_e?f8FD+ApZREj%|eR zuRnei>AyX`Z9Dek@n3I8zx#<7w`1J<#BY$k^NBxf$9=sgUd8k$o_Gz@|MQ9PcH*xd ze&R6FeNS{^x$mC%2hx+8KS3;L{uFUx^OuNgo4-PAY5oT5Yi&M{^ast}Ag;6KUj>Oh zAHVevK{AeMTU#;xhOI|}7>8{A2I;`o{2ip+^ILzkgQOqax)`x%>xLa@m$!a}nET{| zJJHX2@@2%uPo6|v|0Lale%6yeKx}_d!K4Tta|Dh z#NboUA-?p~@A0`0o;uV*`u*8cM_LF!vbG(=^lP^L1?d~M{T=hgZLt=@zfIeYV|r*? zFX9{9`VjxNErHK{z3l?xmD{PO$#eYnA3Tlz+V(3ErR^3>-?n`+;_tUleH#6P?LR{N zZ2K(4%YwIJ{*QxqBHk37kGMLx5c9VLMZ_0_Rfz8e>o7kal#!-(e1lLS@(iIHcBsz~`Fnmx*E3{29^BE5`8_*6#{8ijgkAf9cxcQ?t;e!6Tou}?pFdIRE(Pw(7~cKYe)Zj7g%?m_(Z)5j4zpZ)~# z)YBuo$+)zqsb7$KY|pIx1^O$`to{WVf9W$C(sj=mLL~p^&t!#2`L<^+3z78ydFBeF z&ppE-{ljNxV7cp_y$jRtdUhqIOV3s#z3tg`A@uv6-G~@{b`#=1pM4y0+;h($PJJ$f zSp3}XJ%pdjpS$^a^8Ci<);>?tfAQSkpGUj;TnzEU=VC7qJpUZ^Dv`r0cdhsb>Hl@R zo=H(pZ@JvL>(vxFk8|%j3iN|l-ni@QRLRw4+?~5F(@MqE6aCH)=G9YUcP2mzDD+kHII4IS2>a}Qr&i;aBmLR&}+@Bi}f~e$CfX@j^m`B zo?5rx?{}YQ^VOcvB*E$QMSW3Kl?1MLv3qeZ2OkZ-ZyIHf$g@pe_!?}zb?&^DBZ4W| z#i*>_VG^w9S#nPoKMR_~V^W`1Ih$cTZHE8FWBBqzPX>woYm;_TgvwhT=F$>s9@y zNvXKf2&D)M_0Q?dgONxC7;m>@(xHz}dWC1j4-8nRNbq8-WkL}=uFs*)cy@k zh7;exP4~MZ4=IFkhtDaEbjxOT&`Ihu;n2I^J$)|bZ(Hk%=v7snKCmNlV8;=X*%n<>$g7|WEEX#V}+i=9Ux7$B>JQ@LxX(+4E zY+>Gr;>+IzVl&iGeDY0Se%?TLae|iGyV?&Nk4eB)Rz7_0e1o>~D-g)`inNqd+6i`3 zBtgS(V!)832HoA~=d!7<&X0V%`ar2Y*X*euII6NI+}(Kzdhd>|X!~)&+TYf-+Pk)^ zZ63!`O>2WNwI&;-95^05t-*L{m+>OPX1$0wJLMumuwGKkI7TFMtyawnpOH}kj~bwf zL_W)OfP@Z{CdLS8VvGKFm7juG(87$IDoLng`YkAVCg{`l1o%Ll6{sFKgSsLC+{svIMPiwT#B zqQ;g;Q)ju5*InGyNxg7fYKNx2n1cOmx^VhjUpDqqzr{Z4x7b7dR!(oXG4mKo*qsD5WmX%)xXpx%q*-!xhl zx{ZxrsB@nmN5(L8%DotAXbZ5~%(O!8zAnE5)AMTz z_r6c;MHG~(e=XV#Q{<6j??EBL;?YF}L}s?3dt>Q9WYW(%DJpGGe7@p~sN%E0mQ92= zXRCU9M?gTU$l?bn=;)G!ymZ}!!xZ7eXu4iErl%*zWE)+>X4^p!p;22EHKg@6mzglV ztUh5jR|5DxYR))QTD$L@BiJZvETe|s`~EQD3~el?L}D$#4#5Juczqi)B1lH)yJWoj zZSBeo@^L}9c+rzl8=Jgf9Mk&GNaiDM2H_Y>M?z00+!#$qLQn4{vTZ(n)(PrkOvHg0 zlOZ53(sTdjb!cfP!N75LJ6QBcL>m>$Q77ZDe&fp@^({tANB%#Y3(cSTjJg?GBe($I zgn7nTJ;s$$2Ljkm)l`?a9hbgf$bG`h9PSk3MsgqfC5{E^a?;@LI8A52l!U#NAA|NB zf)SnhSfq~imhv3OvhJo%1#C0%(3C=0U6HsW3T+!Vr5yl~2Y$f7Dg_f%bb7GecI5Rg zhHh%aPCzU59o0vg3~(d#+D%Q3)qEm{Ddthwi02^h?eaq(ks=O6eMIE>gd*mpti;`M z=E=C=YILV*bA#?OG+Z>$Oad?xy$KvFs*(Yk+;c7ZJu&W7rqCr;(LIQh<Os!FOG`t&KseFW?-&z?i$o_a4Ejx4^fJyY`UBsS1rP?-L|mosb8B>s zL2n69U)TiW=*@hzu{%XEgKt$&oXmRClM_{M_7*l}*zkgdBmTP6{LZ(JU0C_rhhIzq zV=z#@w+ni!`=TA4@xr_ox#Qe0fi$=3CBi6ZJFTmMO~56>q?i%Z&ER+I-&wi8o2cfH z&LC#6>yvOyjS}t%dykwR+5FBFGM~eqG3PVQl~ErwZLc#N!J&f>O{dv`+(3u(Qcj%T z()m3u=sc*`IWYY0$5khr^g+E~iJ6&h_dDPI3j&c1`pA!5Wc=NO@j@=NanzsgW&X{v z&Ict9O>6``E(302B1gpVTU~yqM-M`Hts5dRTpY5THaiWlP#~%N*mAT6GEMu6FY-R( zRKDDQe89A!Z6o7qKUF?#VI|v`{_rRyY=G5ODCF8~99L8*o?&W^HPXhU!D!l7OC=45 zamkS>S2toj?!MYAAQ}P zt%YX-937XhH|9Bt$)2R1OX|+g$FwB=nmy3oxg+@`_h^dzj=bl=QusWU8PMy{%a7oV z{tzjL$%jYt;c;yLb#2siY4-F-qrOVtjgBFcqr+F3XSC6QURogY`D(N#?f>`360kgN z2pQ6_hy}SA=l0m$H$J?VYP*oa$-bo@!dfmQ##kNEk#M4nscBlt|HPxT`e6is=r~e8508H$np( zlS(>7mZPJA1B7A}XwOYGQ2K|5q7I67#En&n}K!ig-;gbXaS zmoy9;u{SiI()p?&!;Iu-O47hlv=VoiSyBr}MHC*47GyO)pdA1%{#zD|N(pE*VzCsY zouqBbR8I}hgN_Coo9KYC?wFCZ%s|b+2vgiZ)g_L!U?njAfI$K7lZ#};%^pA18#oYf zD3pEyhiNL0fev$lwF8O)Spxk|(TplOOPQv%VcMpUR_5Dhb9`nP#?h{62nFYKr+rYMGf zx$z&$ns}Rs)d@RxHj6_*&cT!IB8OUz(Cd)a6%)3 z*gp&cK>I|NjVLVihNft6tQrl4PB;zox3t+;y)ggj#MZ8k;#yF&qD{MT- zRJBWGd5LBlc1r|=SIjj=9Di?CKZh^c|rJQT~)K7|d#Dxt|EbPW|C-tTFK<#=d= z!F5+xbDAh993v`?ghsm+_=oC%iwEdbC$8FrCz(&$&h(ttWHDffYBgeKv&E+v2=AIT zGZ&yssqC=9$u~zRPNDTGMK%imK=*K}!U!(Xo&JFNFjS_}`8A#8WX0;M3CbtT5iTk+ zPQ6dGtp?N$FL1f3aWGJxC9a!-nv{-%PNF!7wwYY5$suwilcseJfx4qKv%Ze-UlPQN z*Twssw$-cfq&!FKiyw5g$oKIe%RH;ee0sikhIA`nh{NikLBZ7rES#=t0<;Z;ic-D4 zQYc{NXWow!2{BST<_NCp{LliORUl?9m`8G!rot5ynA+GMpGRgYxEh zTA$o}%B?V}0-Qs&%!&cp1S4YuG8gRRV!t$8m+4Agnn6jLxcmHBR@a%x12^=Njdy~o zfFzh(X0&T2ic_VwP7rFAb5Xp=?)5q)g^0W^%`RYI(u|5-^XRpa^%Vz>2f8}O!8)YA zS09ZZbCEBCH%&X{4ZvU$ipj@1QO8s1Zl&u>KUxFaPv%o&pOl94JM1AEkTl6$cb=tb zebUpj$z-^K0>T3?b-kpB#5jncfH=Z&H8(mAbQy8oI35fLvCs_6ia=TYMqdD=fG43E z(J~U12P2R~bIjm$^>-5Wf!zaZP4@-niRPN7h&w@6lY)yNY1Hyb5e5}Cu#Hm;Cc>N? zCFP+qi%wT9U?gB%E^0`#28{aSX?bS@Fn%gd#i(eY6Z)>(2MxUhmG;Z~qhbjH9rV6Bk|v;)E|@Ix9%5+ho}mKf(}ohm1w^WlQ55zY92 zWP#3Lkl{zDNxFXFQQ%0DNT~q_$21-2$j>A&qKz(8#=(l0M3&4#(yULaqM4aM+8j1O zCkIY-we`YW5j_KHovgywh~o}CPT=e;5UU*m(cWPi21EiXsXF*&O@~uXf%Lu z;j@0q8L%jvB|JlR4r_F#Qz^OG+g_<( zL)C)Bh;Y?VVa=mb{vmDuo-Wnzced?0zPNJFhGvklFas-sCyR(l$)vE~FZm^*R4C0Q zlwPkg4m26Vvmr~+(d=#Nym-KAsf;9eH*1bW5@6iZvQF3#rK(`{aU&W{)+Hb2)SO5Z zrZK0K$g|$#OifA8#caf-VTOKzUM6asDA7Qc!T`LR$MjKALvvz%G?1#lX`%ZFdgj*=e|Z1FLNfMrt@e z^K4qCAcf;dDyUAh#+j$TpRdWZ=<|tSZ}^BUYD~iLxuN}rC|lb+!}q)+Xo)hBEuBhO zRQbqpQJ-8gwH!B42yrnupvWyoU#(;LHdo=msG(#*C$V6CLB|i9CC1sb$E))FQzF~F zQQoIBvrTci#>(qg4O?o9<;HS@PS)A%1rHq3!a1SJ(B^&BeU-Z__g2FFyiiW4Gt|jN zxD>caaPeFiBF0j#kK1k8YYACK17{nb%L}}p1M#q>`i!}Z75fD_F)qx-IpyNspZ^MN z4a^u`Q%Ig(T;fzNXbD=7vZ;2-Z}V;Kj4Lc9aBU|AKm86k%Mz$jYbZx$U}TNQ!xGOk zVYp&UOqReCzK+Re1~ir#yTHYQVIf6a#Y`yR$g zu4ZSmBkJns*5~~neV1WD5b>Xsa!@>a%FP#!@HL??H7l)BL-};`p3YL>myILy;vr`4 zLK&>JU!FWF`32|R@49pi8t3^iTro#%mMW;iG5#p8l54KIbU<=PNf;dVKt5c3e4nR> z@5TF=hxB_`153-0i;TnugY4nStiY8M%HbHyhp~svF*e4ktg0PjkFqN8ShY$p-2-2- zN`@1_F*9r4IdS_$@RI$l9izMh?UB%6;`xC>NvIMk1W6bu92Fy1*g&q37GwID6^zi3 z=50f!USj$O%%E`Me5p2rwSx8-A|z-E&4Im#+DZGe){VA(O@3!&B4r}IZpy^=yk&I4y-{yu-7+~e={ z$K+5JcmT#wPR!+skIjwhVHp$i1@JJ4{If?1?>H)!PiBdw20SM4(!TJJJBcUP0NfL8 z!^7xe7Af0qdbQ|_0efNV6nlBA!){}Z0|p{F`z%L;Wqz$~&&O)Ts&@PG-CrIha<5q^ z82e0N_tK+M**kA<*!<4+r9;zwyB$Yk{=BwEOB~zg?A(CXYIxP~s{Asni~-GVvS+ti zR9=dMK<1=cyh?bj_KNo-kHig`t<4uApb8RDH_9wEvNa3ry4FX1A-5OwK7XP64gd1C zSB{fs4XOPGCFO{OWD_+cXNSN25X~THA|rA&1rq52iRF7dAh8}@WMSFv2}pz?3KCAlI-*FTqD`s&P1esYOC#uiFH$y&|pD69eyX?>ur&dZEj@ zsnZlUxZ{RPG}Otoz0JSWOCs(_#vxg}Xz`+BwS;b7tFHo{NqI7N#D?*iHeph2rhT-k zpifKD;F%c0R3GIJ)Fx{35=054FlImjfDW%qr0>mIFA&~Ku|K^ zp`7I6oUjCqY<6=_vn9g&M3>T!i%`T1#4;xcS94BOji^4AAEufbcYN34P&n|Gdczvq z9NFT1Kj!zhJFL0jWm}rTsH$?Djk94^kx{YAQ5JMH8v*sg6?4L{5EF=VMD*CX-}tG z)$j12U1yxVp~~PShG`<3m2u4p!wY(&g-%e2J^gdQlLBRn4qjYI$Zn~+w|A)h-O3C^ z?7US{O+Mn34Qbu1zu6Ia{y`CDz&-ZSSb``g*m3_8pbZUNt{%#N4%uR4)PTi>-qfk?09b1>9uk9{2>I%H z=vYK?5neRsN0O_ecA`r|INCO~)IVTlq6XXsYKn-39HZnMw3XMTCJ|Lgyy;vU)En&V zrbK2$+e_+YoO_R#4$KrtaJ*E6@C+wUOr0mwqc(u!e>}EADjZ_-pQ!3^R(Jq zr>BIr8Hu+~9#G<`e2B(57iThI#B8RU4W~OSF-D?NopYKih9+sG;H>fm}ny43*MwgHz!LFAy1$YTK9gwie(iO(a$dVvfs}1)sFT zq1q(y2a}rAOD=n_{b=7haCB)ks+E(Y96UJDS{xKNq#4sbGF~1X(_xEI$x~cRR3lA2K&spgoF0Rly;FkX`vhsbzHi?H_WqyDyT zHEC`(I3XUSVu8~|q9%j#Hn;=E1eK@IbwFsIe~-9GjFkC+#bvc4xWlMLn1EOFa7;5f zdi6)cHZIj2u<*2BVMB&NnWB6m$M^$A9;6SH?XZ+Ni)R+JFBIUj;!7-mG8DMTmH%`J&V8i;*Bi2squiqa}4-P`@L~(IY(UnB+R9@ zH8Ux)cHrDeS#k@h5i^Wv@Qh_JxH0OM^C&Y!<; zR2V!SDb}t{ZbqB+nzx6qC@qk{<<=OH23af(5Eyg0RKS7#ZAjfayZbA4!dLL1ga?T82E;@uj>(`INYW zbb2y*lhi-bLEcQ2__jVVpn({JKWBhS?W{zq*D54(O&=(dilp3q@0@9M^;40I*GRlY z^3}9(4#Wd9NmQ32F}a*t&H1<@ZJb}0%I)RabZ$ClO-+X1axN0|1RdlnlXyxC8iI1` zvK7mNl}9AePZd#moWKMpE5Cz%8uJ?!y_}nQE1Y@G4Llm9H-YUGE%MtakfytT#TD} zrj$Nr08MH#55wX!_(Zm~a}Fga$$jS>%!f5L+{dq{zQ3<^Y3yK(>$|qsiMerBWGJ5| z6E_JrziZ+qk?@>s@MvI1Bo-nwu-?V&dN#(Q>uJ)Do=$5s{noY}$D@AV-gDh`{@}Oe z3^@qWcW%62h;NYyh6?|qQvACBwOoMOA74zxM z7)_=na(TeAIz7%>XQ?CTIKqpzbp3+nmweL5K(}8hrkrw(uhhr-j50Vb&X~qIwPFd3 zBs|UbYo5HC>q@5wE6=DPkNKH{vwz?8OK;lA#0vr)$pq+2ODKlXH3oxd^*~ox4D>Ub zOGeO$3eh5l6BI2KWEv2_F^-R_ciXH@8BVk{Zs-|pIQJlB&=||mEzlPza95%!# ziE>6cXUIH!aV|U^qXx_ZWmPU0jhvB5iI_{Ni9%k{U$Oyxjv}%(OWW#|_*P3WC)%79fvDm#k+S0sdkZX#Q(#{#3Y2E3 zUM*h{_x(8B1o{)p%>&Q;Ae(c9l zX3eahJ0$m~j~_%@4V?49RD|%*Vo3{HX(-sbi(6u z+CkSjoxGE`lEW$p(2i>6-azHBW^QWoCe6e=khpO%Zw){I8q_*i-(X>c)3#fNm?m#P z>*ml;8w?m!P~5_4=-dgpI_%(vVbN<_aZ7+N0#BDES{HmHt;gTAgma*7 zUe-YU3*2?`j2N$ZST31Qz6zD{MER(juw+=)IXB|r^dOPekJ!kihwK+`B4xIwIr3@> zLp+hH!qORGOX-ZddB>^)7AQg2IAgh7Rd9KKja~~xS`--c^re!`Sl;g$@`4AP&V|^E zRUya$L2|NI7GhE|lNg1Cw3C#`wgrzzC4rbJ7`sE{Lf>kJ^uyq{4;Urf36)r|au$JO z!h>gEMu^(q4}6YmPG=~erH0JT<^!EIyggLAK29+m9$w&t0gVw3!vNbn0%HSb%gzii z5K5>1eb78OW8}2Kq&ri<2lDMA#stxVnqjxDiGmiveRG#ecoWv?VTFgW}QQ@!<7Q!BK4#PLZ zA|^#tf(IP-rUFHQ2oB_VL?&lv3C&1e`+*^MYOo%{DNW)0%zDG(K&9A!@;!wtU}ubj zON#k5XN-@Vg6-#yny-6?6w>z9x7t2wh{GcUx zy#09F@mQji8u09NY`3u4WDicABay9X;&k!to;KVTR{h6>qc)st+;#`KvIZ>!YNst1@cCG3F?slqDJMCfjhjeos5!h6g1Bnu+^D z8$DREkxf@vk+tp1+Iq;ILojD&&i2j09QAV5B-!i<+}hPzsdi7TgJ^|)9`LCFK~h<+ zFm_5zze)ycm;z^smqhS8WB!y_&fU*A1{Kb+UGG+84aN; z8J>zma11^Vl!O{$O1>_tK?6&J3!4+nX?3)ETRYo3cX#e~WIL&1g^C+-`#2xtU-%^( zz2Nuw{JrFPh|{yk6_eYU9%eB_1HgmKaTmk{7{Qspza`u55PSkYFM$VgRu+6lCqw(K z>x+ciW}2efYlSm~v0B?{bNbkfIp|r;^k})%ZqHuiQb^yV+huu21Hv(Sc-oeE7V+MWk{&bIxjc z)XScuyzauo>{qrPXEE+gYLZowTXQ7Op`2DvYfh`yIFC>~#`- zhe_3{@x_Rw3{FdWLmEuPI4T9hO?t?}hhG>1ZYj~tSy8r@v(->yY7PZUGC5AwW6W7( z4~!U&C@f~07$eg#oq4U``+F&h0XGda4qW)mr;Z!jV6oYV5gyrZ7@~cF1Ij_!6wbmk zONatyDBze`Noy=9bLbh|xvl10SZsc_LR~7=n83ja%0X|?E5jG=vVvKMa$0i8Ihn-U z#XN=O`tykis_^>5;|_X`g+684wj5Vl#bYxgAjnj|r)|&iWQ9M4Tc7?DS`+>;D9>{? z7FBK2frJy>y;%o`UVZHeLxdcqikuyShm5evy6_TjMceNn4nMiKxyU4{9uKPobE zwF8yILe<_kaY|2bE)@R3TUpoH!uE=(3^x z>_e9BnbH6lKQmFDJHfH)H`C4M2AjMoh~u>S{`2{I+e5t7#>IP5!|R!^;EZ<32F%E(x+|N9TQbyKyGb^v3t7pk%Kd7N)lxXvA3ne z0x`6#`VaZL{VJZw!6hFfGJ|n<2T`>cr@NVMP}OP{C~DJn!@$`*)kwA;Fjmh>uCMk> z{(*Jm%x^$8k(u#8?JVgdx#~B5MRGK9GOW6);;d`Htj_8{4w0F2(=8s=ArT`1Mh5b! zp?qsFX9&E|uoe@O9fjOTOHMT9Q^S#Zg#>QuI@RCdC%@2p*$mtWI$$Lb?!?Kf8H4+O zd2Yn#CkM2Lz+{eW^+v+wth4Fk8l5*mizj;k&nS~J^nI1I6s}d0SXF~FTS;b4-#s|Q zwd9Z;g#kG&HB{8>YjzBdcu%&ya=a%wVx&j*pXx02wjbCth0I(7c}iYBUYuf^VEIHouZE4;)Lh0H@zy9|CY%MH%mrR(D`=n9KC7;vF1OXz%C=8* zI>X+BN;s=MtCeX@X$5u8)`Io|r(K&8<5XLNy+-I;y|ojb&Eiujq5ay_j5@CMx;K5i zLf*Q;bqEntGN(018)+>_LX4E0-Z~>Wh37PD%w8{qSHI9XY93jAWct{~M#qaz*PEu7 z$5qfyT1z>do1E{=dU;l%v(3@wAT|~3tV=WbX^FOL8qpI@ZI;Wq!rAB8?dS!a5fdx; ziYdKJMb^j#TF?r5g$n$R6aeK6I4%tvlzfF#(r>=-ph;OXZkVxJE}P3b>kFl_0Tnz+ zT4Km)hmUh{Y3`<2aAA^mVhqbVT7fwuyv> zOg_`==@oi~lkgqUtc*1~KYOo5;YHDuw3*e(e)g3avdczEA9*BqrwKl%Z(cwTp$;BS*F#42PL+6i3$pVNX zz@}+iu`aT6#*11JZ%SpgUr2#WY7kI`9r}A%`qn%-4<|Y+^BXpZ#5&WiJadA?^$=Ei zc2>Upic~;$^)gSAU)-x~&`-5XbJbbR-jVK$U8k{D$bePcIZo!Pwxn>xr=;I|!rf!7 zb;hN&<2F2QEs;Y97f8=Qz5pVtGmscKkOwbZa~ceOgJ1TSH5B+~_^0?S@LN_Jfe=*F z_8eEGemqo6`u(1^?=;o#&$Vthp1$-&K9J~3-kiB4M1~xaM_wr$s?NMp2tGwVXVoT? z!xgu61zfpSvZDflL98_9O8k4EoAi9Y4JBV>4>CLHICF4H%ejBg2Vce#!gnP|P2YRB z2i${@Q3Gc@1a^4^T)Qpl_PJ7+nIs-iXe7Q($Yc*MLA6r7iaG~EG72Y6yZE&P9B7u9 zb8t?}DRj(YT0RMR{KML$QkG2_Q81|hNFqoUGqTl?pvAyj+B{}@Q`yaJ&6P)H`8YnC zqa}!ze2o{*JH^sEc?FZ*^u$tP)%BO!(~h=A-f7D1v$`u*2)RP8wKs>$<(wgJOoZSF z9A%BT%AP}x6^<41;%n?zWvvBducK9C@dR^gdg*Kv*W*qK7|n3SxO31))W;!+nKrf1kE{25`?B>xs3N_PZkB zA*@#+(v}pd;|0g7p6jTi@=R}y_3IA97wX)e*WXZE9h-Wde*>~4 zWiq(Pc4xaKER;G@mPo)G^GKXC_#L=_%{h_gwJe4v6r*^sQ7ZGoS=0lK@(~w{XK)JF zl*1UCvlZ8HES3*$QohPXIbaLNh(iTOC;R8MwXf=J_4W)@>@GO^QA1@|;d z5V_&=3JZQgL(~_W6`Lh#l9QZ_Se=nMP^ zDQF4h^veBAzXzN-PmEESsC=;t5G9*mIpGV58Epka1<`AVr%Sd0i)3k^(LSTspB;&c z?K8Je?7954Uw%2cqN_E$JZc~LN4q2lMdqz%;(l;;4~50*w(wBOUlBV|D#k(44CMPE z(4%=ePY-(&W(a)avi?$F%19{z?_SH^tzAJBS@L>{!p1#hTOY(lY3-`&?d^$0xf(nN zm-{C7P41bj$+5}gB6|f8(F;)!AkgOa;mS~@sIa8N#=jf( zHO%R!{AfNKya5Oe@o6<3_6Bh8n!GU$>z72MJO~lRNfhuH&!CbrTh5l(S4h+0vPwn7 z;GTYuX9c!h7T6Tv5cn81{2{H-$qQt&A3iRg;RV4j`0e1n<0fFX9jSTXTB=BaUloOivtQ}T79prcgB)9{2=OA>+c4u$RQPdjMHmt}RDo_lW z0AXz~eKOhHOlV5xpcH~UPv$_iyzkoTBI-0ngTp`idSK?|Ku|1BcQH#5^P#J-VVUgr zHXE7@7dyyF4>>D|UJA_zyzY?xX8?RcJCfk?BAU#$oN~CEk0dlB*>H&_WhgqR1sy(B zb4FpAgY%k9|6#^Zb>>epGRT0?=sry5mw0R|+~ouM`}M#)P$C}B%Z`^VFJE3^@>tPLH%V>a@5Q~37cQFLoO?xKdJlOBCD_plhTGKE6b!Rm)+*t za8k62z4e1Zk24m(M%<(FBw7Jq3<;kB; zaX|>l$RA*Y%Z8m*OW%;Kp&ebRGJ3G_c$oYJU+`Qx->bGCsI1Vmg63B$D|$a_Z-1?F zgpPp2$cE%lWw5edmMW_%D`Y8KV(J+xTbWZ6hk)J_gaN2puff3C>{g;@cDax_ue~v`ePVmT z;q~!;Vm37>tGbCt{CLXS8U-V{?0Gw+tI$V{|D3yZno1D#uHmEPvJ0<5?twNG=q|No& zfgHsqCNh7fLzX6l0T$ew_cnW*$RFdNu5jhmUDtYTd!+|k7j-0#MnZjpD{P8xAzlF>Xd0o`TduFCq` zH~Lw*-|cJ$iQr%^Q|9!a@PfQ%;vWiMZP5SZ72h=nO@q+`i6THT`5Cf1XlGhIt&W)E zprZx!4aMrO@`PlK3TsYApnK$=WwB)kmvt{wmMOSDmAoKi`z-q3*nsWM?P8=l9ZQeySdiyaDIvSfBI0}G zNf6x3R}}_agfmIap6$0dsnllPpDb%FgKt4Hi;t$>=aZvjZ-}nezu;<>3x55})TB?% z2Q`{eE)P#p+5gAco4`Z$z47CB3}YKhVj9L)_O%(y*bRzMAt6g;n2dcdg_mK}1|2s` zq)WCy5_bo|W%W+y06l1;zMt6?+)*DqSP|S?9}o)iEvVf=roP(hpk&x68H8{0W;COu zU9f#XpCCpbGEzW8v}vn@tUw87rjP)wx&gW4Dz6x;;%&w7{(%%$0-1;b>oP*7cgP&IWmkbbcsHSpPi%*X{C zawz0q`WUQGq&mn5^+6!k)XeBbpt{S2slyel4j_N*KXLn4UE0%sjO)dd5l zOJE?G0EEQ&NU&Sp#;-}$qnR3s zQ=^CzAaiDUZoFGGp5e~G-*vBSU;vG*8Ia{N-0Sgu?tKk?z((u9@{yrbbs&e;cpq$? zH-myAxlqBUPr*bnS|HCr935TTxlG2crjS~4Lj@Qd9klz6ok0`L;GhKOjxMzJg%vs$ z#D6V0o*nbt=#~ox^bSZ}0XY@M;U<>*iS+(vMBLcOB~T6}=~s8MV350JLMI5Fma#;T z3`F$^0i5U(`C}8sS#i(`Mch~yx;|^g6+}p=mX$dfuzS!2j1mRdsfqE;bY_G2GP&Ao zhT2je+ENW;(0oj_yXJ8K5&`1I=AnA$)tGAW4k{_}Zo8|%5Zy<=HWj1^o_Kbpomh=q zX5j{rYNW(a49K2ok@`W%2^tYBICZ59S$lScSq`8dkq6q?{BcLlL%1o z$7Ap;JosQ)E`s2Wa=}0fY#NQlN--gIG43wXA4kp&d3<$$gqCU9u(O50KU+>FY#76C z9DfBLCV{LCazysGB_R;P|L1^IMUd0&hQ5r&8bz7n*{k_M^BSOBSJgN{1cq2w`d@aC zn8znv9#r&AHa&9g9SQcS*ILc({05c|@ltV6Qie2HkhwMbgy0;AQbE*@W&17vNoSkv z!bS-vfKX5lCT`gK3bNB>pxkkANcTJ{6NWyBo|1ty&!aLdDkQ5QM_C)|XKbJ04z?Si zIAmJ~A}Yw2p2Y-bCl_584RFW(-RTCj>ZZcZXNb|&S{wr%6vU)rKo~|IYiR7GjgNsS zngW^Wv&hgVf$e00BBRJivLG2l#x0DpnNC!PG?go^jY+4k(Ltz2kD^P1XKbYc1WB1iKMY=9J-PPxjH5_d)L&^I$T@&iO|%_wtJLZ(_>pg^8Z!6LaNcf_BkMnqnd(! zo&t_l76nZ*rXD1@kRbNF(W%!!1eoGGBc1}zSTiP-xT=Rrh@1*+M8u0a49#0$_mh9nw=#{6e__`j>l8}9)m1gDSL&JTGb&Ff2#ZkS(E zsl?!FjcNf`!eeb0-9fP&DTX8i?@D4cV?p#jLsbVKj4`5tP`yzC1}s4k%x@q)3ayQR z4--iR=bs=ddE-6f!Y~AOy6LDoc1;(LXXA>DnwK{b?LT%UhCSpTxV;3(Mt;Y9eF z3@C_WHnf?Lwe2!T9QUZCDfaJj!#~e#k2<|5-#tk6QOEMTl z&_YA=Ky~mC-Xp)B-{Wiz4IG=b-`xOE9%4*V2dmo{#Ca+j&34&Jc+lJzClHw^#DrF( zgFqpMMeZ}~6JYZ7QNT0U{UBE|I&uQZ76#eg%t4={@iU66tGg$zdq7S&T&~aeD z1<*7Z$_7ndf6^El}gRP=&+!se> z*T-f}|ExQXK*0le3Z4e}hEd5RXs1vqCULqf-8fzF6YO1J8?h8Dm=g`MGg6$_Qz3vJ ziqM~Aadj+{0RrJdZd=eqgGm=W4rdJ6dZ55UL6}T|pf!rk|1ji1N z4Qr0;{crl{JcUYIqGIOf-XntG%=Kq+hngzfdMg73m$(y}VNm8cDvR9`Hnq^RhFB~C z@?-;ykk}6GEeB`xP_9j@>ea8+h68Rl1Yze12a)aE^MW$V02Gld4hlSx^Mob-CpJ_t zO=}d51>pc3yV?{F;mH#l8a8(Hi8c`9LzcEcLVWy2Rp_BmMA(J+PFfs`8!L&P5uzhVi6H**dJ^TE?*$_g z<8V2vMO+AY3&o^1$E{;K8Kr$;z3t_A91fJYX>rXt>oSn(Ex7$fHPs>%nv?Z?bRkIRD)X> zIcLm^NQPPfTZ1P?w^T!#VKF)fDZaNOm^{$}4%YmYqGs9}9NWmk5Id-3^ui@^`WoqM zcuS5O4NYVla1}th7WPUckyx!Yj0xi!76>ya8Uw{%fJsEsM_DK|e1eKhVd1a{I*TaC zZA7E6$Z#?^LdjIJFWHw82#zfy3Z_ycNP|vpdA6Z>S|)77p!lz86G`(rUrXasVQDpsa0NqRDSK$$c`~6 z7?4b&7h{P4Cy_f+a&g*Z1fD3#O`w7AEs@2I2D^CTI*2#dWDx95K?g9S`jS{A0@X5d z3Agadef2Kg#iL1sp6%Otzuw!Afu(~p2RKlfUK^gcEGib1b7#2J>Bb%E%TWLw4rfCA zhz(0H6fp)8g+ggZdG$R-fig*ywlri+7yLB1KB&Gv3jY+7BhEngp_ZchP|#j4@miwg zJ0x-a$Iz`~ITWpqmRuH+5sc#>MVdmAE+l1hp%F|XF0z;b}Pl#O>h1y4RIY4oCafZ%0&a4AD&N)6g$Jk?Y@|Q2R zIwu&EmUCb;GD4H5Yx-&WkVOKN`f7B}7hOvaLNnPzd3c;u15H*fHAFPLvaJd1&L9NW zMl!h&mQBr z)x?4I;utbPNahr#Hno{WB4V+S8>r9N6|cmiQyRd4ucz8l*86}{ZS~&yHJywoG$@_1 zn3LqnfJ#*sldT&B&yY!HiZ~rjLML)V0Dr^9NQNKH556}j8Usxom;@4709y;Z4!Knr zL;OboVr*W`#Ok;%uvdd$I!<*2(b)S)5F>~YzzAj-gW@cb&d&V(5{RyWxOkQcg6&iZ z$0V$`#MMBV>8uV=u4k`~YK>?yPz*^|r0bSOoH`Mz7viVQ05J?&#NEM4-kf6%iL zu>_N!n%d5>(HIm0kHjMp^K84|5flRt?qpZ8J~#^4PXcPJOa~gWK%vQu0Dqz=U>gY= zPl_%BEfH;4sEl}mc~J}`1G9|XXb+H36F&$NjgQL(XAf`+pmRV{1HA#(L2IUBQ*am7 zyFkF&%sPlr*Ipt_q`1-Rz588}N9bczI$M1-=D54L?F)x0(Pc%)nM75?KFr zudhbZ2*XIQO#~=f(Ah$Rj8WN?oF=lhw(i1dv$~ zJi&5Z*=5gAgAjl6VmnNsyrWc4qN}H?8@PMA64k>X%4pa`amZ2*b#S$MwK_|Ny+qbo(7Du^{~;%MSpW+1 za z07ybn_x|ZU^Ph-J;IDtt^ahgsuZ!kJ>PBcrSMW(N1!}=>ECDRC9vsZ-$a$nOk{gMH zOB3p~8w?U;2NA8UfgnPlz%b>tKqcQnLA_-J5|jO&+JUWJ4(ea;M0+B& zvsXrv$LQ5QBqop|0D_GKmM;ip)>#;AM-!NwxY7b9W2tdC1Tr?UAv8y9iRInDHX}Y_ zN=nptH51wv=Hprq0}(I?q2Q!AaZnDSF;*-=n;i4P{>$4nk-KGeZfxH51pcwO zw4e|T_Agi1Un8W6n(wURLB`s{=>JWe>e8NE`G=qEpTxCaGQeC>L+9#L@B%X$ZH$yg z2(|n-u?Tl5_18$tsMkF6xT`Vws#hqKvx&u6o+F$b4)5~x?O2$qnRku)Wdd;jBUk7h z-wuzjAHFh91V8#!C?47YLtwuV5J6bH>mXHto(Rq={S0yt4v)rM5U7QmAfQwLPaLEM zGw?x}dV#^jU{<}?Mxe8eR9Za?6r8}+)dncFr5==)pwy9~;0`=_B@*OHpnT+0o9*^W zgOrb}6u;OR4+C1-tG@@6FLdH+iIwXf3w@6lLpwtk7{*JNU~$d9)hnU&SM#{XbPZ&F zbA1z6=&#Uuv@uf%WYyaTmwaDUll8Ul{`!R&Y+_gZ3kjk;5d1-2K+9A~_!jB@x9sjOmjI!BD7>Y1JU*w#0};i$n`^f`hG?q9%C7dM0?CWCs`9FjiX|iE9Q} zOaj~Q?(tVC#6k?@DoBiDb^TQVZN#XdQ2zOO0ujpGaKAw!Hmn(mz{b+}r0>Q7ZA@y% z@dlT^10DFs2O0(#?`NVC#aF3pP5qw*TS)f=j;naKbKu`NcPtp0Hl|MlAn}lj_-js` z8#7 z`rs9~Q$djCJJbvc?ksgA$hax7B!CK#s3ed*lE9s+jz^L@nn6JkPNU8Ff_Oi7ea)Ll zs6_{+EG9KXr^F|~n22CK-y5aNMVZ;^M>d1t|6EEVC+S`k>_Ss+b0~R9@50J`z=NgHk>}hwOswfo32p(!2=G0mjIqN3&Ql?X z0|i82{qenLGVyS{5mObf#xw-4s7#k?mv59ljy{eSW*C45iNX^->NN)IgFNcRn~<*j zm1hq`Ve+}EnK%%{fI_%)6cq%nR2I;}Vgh6WMVoz~CRtIy-;j74oe2t@h9E+*5b;6K zvO5ASp6OQKU*BIP9>uB`XNqI>nfh4ud5tFZ5FZy(e)F2l9|yY?78C|{Z6nlA3)u5u zYv7c~!T{(s^lS0NmDl2H=s$kQ;9WcxJOo*@IA}B5Ds6m*N7!sx=vk8Ruo;sEVCiTm zATAO5A0Ob$KqFhQkhK@k#LXfQfVGn;0@B6|NY8==WqugEJsbv4DKCkKv@lS>1AfZ{ zNl?TF8W2bQgMA`Ay)*;Dd;u1NH3|sZTG?0uFc@?rcw!9#I{-Kb2lNMSoZuf94;L3F zCl?<#H-ZPrheY!8@$(A^iUPEsGJs7y& zaDp2b9L~i~gK+?G&P`khk z!J(#+2c@qEC`B^LVHw3IvaZAyH9l0r=YP1-(0lCUQ;*2*2X`&+E-lo>JX$-=tY!hj zhVA=Vz@-mEUs%BM?>tz=$Ep+moK)hRmN|dPP>z(dPk5bfBLEGwHHpo zTPxcJrP|&aH1vO)eR})$WTX+Lurp>Zw5f3HnO*$2%b{%8Y)WEE?@A zG>$OXol!#S=?}3q&)TJ=BVW>b^DLm%qkh*cZ0u}O_sV0=XL5Uv?R4y*H=8|B8c_NA z|AijkGl!!t&e5-mfA7Aqc7pz+Ue4yc zH#*BFEc$5HG0}TIT@_a>6m4xLck_|XVhkp`42A-LzX9!^QEj$gkgR z7eVND(QfB$KDtgx{`-%-wz#Cx)1Q^Oa+*grK}=Hqv$TTG@YFZW^PRVT`OPjK^4y+1 z^z&Qb+rah5v#^TVvn#iSo_8;#x^O%1&HhLdxH9?P4#xS|+$ZF|k&0o$8P5Dm9lP6O z*WH&($4$v|Rd-%2su(?5H9FX(ns5AGW4+1bmEQ*zaA?uZG_SM8bAdn2j8KXQ>73{;L$0$P6PtW7w__wM(3fNt?w zx!)aUzFpYO3c;_qY1p^n#YQwTaYm{fm0%ywSlveq~ow@A$mX?s(w6 zr{esNl6d8wT-$4tu!ztpzo{_se~mg5U;YIbnY7X=iAuqWe2wRH%=XTz0uJ62r(b>u zh;lr}&BLoFlT&b`vM8zddBx2lt-OjImHqom9_-4V4ymj(Zsz3Rxgf0=UTW~2in`qz zX{To-T-(uK&XYZA`Y}$D$K*bqxosR9}XmF~VR` zd@-+;$(1|g>|gY{esZ?+C`!Q-^LOYcZN?$8>Uxo_0h$h%L#VjzJZ3&pHy=L4x$F<4 zF%sr5YHCX3Vv*Aor5)uJS7-4-UtS-YG{V$s%V^oir+e`TIIy45|NIeH{Qxw(rT)+C z#tVKn*LZu80@+jBzvng>U=8j7Yitw6@`OJb0QT+$RKW~905?p89jl!^_rW9pu0KV3 z!!ZB34uC2DxrYNh;h-}h3LX(Kt^ZsnCiw%Lf9}r%k5=%o{_~yvX?`Ts+eg;HFZ5_= zq+e*5tez$o(86NzhFAkboUW{vwxO1mAADG5nQS$Rz**=_1_l9I}LD(YCAj*gCul7Wf7ma(R`jusmm@bdB^ z`H^S=0kqau$*o%d$J+)r$N*aZg$+On1jYqpZ+~ZO7zc=75Fiua;|FiJ58?wD9L~WB zhY$^zdJ0SjKztyw6=#mvyw8h!TezrJeA+c0Ig6TRF~_&_^4i`Jr+N8MThQVX3W`d~ zDyllVcs+ds!yP*?T!zNCytvG~;`95y1 z@Xgz_;(0_Z(yrAs^U7&E&Wm|RyyZj5>x?OUhnmK2+5fkOo&NvTvi~&fzwP=LmReeh zIiHu;xv$m{=2n3U5U=1>a3aQ9$xRw|#Z?Po;BK3u0sss+7_htad$v8K#*v6#obIHs@yQOt8N+&Rbj ziWpqbkK=Y#q;r2vZ#ko#v#JzX)+%|t&4>P8kGJ&tUe)O8=yV;gh*s6#3DbVC*H6AX z7aH{@inLIwA9recYdSA|v)};=V9hT^f6Lh35PjwJd5ZYCaSTYtRASn|C2@ zKb*KqHGHIf-T2do`ZkGLfgAh<6VgwA_9dE@c8GgdJhGZ>-=8vXT5?RP6WI5h1t=!R z0I<6#OH<_VJ-SUOQ&Pn z>T?sq#>^c@vLc2R-=A%J>_GddX#9e&!1rxn(PkH&FE$NtzO;BvxmS9LJH#}LMmEp2v(%_-yUh3FDy;%@eb23w$?oDjJ59M&&yPGX;3KB8 zTkx9A@Zj&Onu?iUx<)+C(XW#_4f3ulKG|OoC~>}gCO}aKpzHEGrOv1->WjiQFF5Fz zcbZM)0e2#J8*-g@<5J_`588bAx3Pf!uO<&4wuCsh%x?AIGd%t|(Ep*6Kr&GNv7K*| zsCC@O*;F&mUJt)vBYnB>``Nl&5&E)`@9s9-w^;XsYfY<2dIqNy;kG$_6kvQEzWS-H zCt@p+bO?PMe)_APo`fbpG|5k=3DUkP((`9Klpq#H*WD`e9tIHK&_?$)7d|} z*lSt^wne&Ue?1ETv4HgG;XL;n+xKjb-y;YgS9^Y?uj_S}n#{$(v@JjEIR?+ZN(b6w zrcZ|79vt?#c~9?kI#%vW^1|o4w-Q_%5 z^2GHkYIbUH?UMI=TLJ#^)}E^4FL%8X%B|bJ#(8Wl(0#%7t!B={XK4@6Lq#fUZTq@U za^Ko}Evu(WGj*bBveBmgtm(BFO7!pdG9@0%Rj0^bciMR68QJix#@2J5i#`k(kEZmt zt2}EzfNAKPdgnvna{g! zMoJrYFR}n3Kl{j&vJdZ3Ghe~eg)`{pz(q>aS(o|jDyEZ5jpoX&WBZtM2bs=iCAas~ zs5($)>U_)PYb7}=JbqnXd&E3$w4^JpQ+`uW|ds{|_+@HBO|C1AO9VqIwcr{Aj1 z;Uwm7T@6v#mj3I^FHouybg|aC*Am#Vg_NprZ6v2PcA+{8qoa1nFB<)Y*6(qpDg zwhONcZH_jf{I6Wf-t9k;755DeUsrp3Z1t4~XJfXTi<-hgSwf73kE1Kx>DDHuS;HJoejP8bj=6TKgzPAQ)C(oDUzIDWVj!AxF zX3ah|oJU=muorseql0UYO5S_txo4hUyX3F^LkBvBC9*ZN-5$JI>=(GvI*X3_oDNTs z3FzJ|u3X-H==zTWOU`MBsv$4kz`IJ3AI2MZpL1~?RBqXpsB6Es`=vX5>4!K6z&G`& znYs0=%lXoTw)V}4ceU=ilhKXIwpqK-kE&8$ec!|a&Wm-eakBsmG5P_o@y&%I6HGV@ zxW+f}wQ`D2`Fh;{9*PaCvp>s|7t8KY`($p~(c>>~nzJ-s{Awv{f;lC>H8TJvH~fQs z4fff(i*rc~pcuZJt2%iYg|4v6T#8zgdU<9@q2rRlcbPLsE)K`e+Ws6Ku}=E5@7%cb zg+oa#{Fu(|W1sR|uZbMYoys}$+T(iUPmU^k-}Ta1v0E?!(KA!??O)vwqY95ckv7q< z?^4c!T@>2ic4GPQUPJBjB)b8{J1Z3KyLNU}(z+6luYXvVSm&kI-2K!uQzh~J`U9hk zqX8IiVr0Td@`H%&lwOnG{O1`qhOKSQMwyC+QBwtcrMJIsakpOGLonX^>q*6vrc_Gz zDar7Ry7ntex-ZV8O8hjqw*Sh{cOTXdt-UUl+%sOGe5;ZL7%>LYS6%KsQpp??hdJL+ z>XdqJF#gzMd`lAP!E)J**RzrK&5bg{N`aKqPs)$ADvOu!FX~rOg14D?w53hkC;qqr zNPn=A>H2vm(0eT5hC#*S7c-Ae&M~df&f+ePcleb{sU|vWd$tSsH9Xyt9f%IOx@wba z$2dZiZwP6#8NC$He>phfQGC0&Sg2$7WPN65pB7d1wNmoWdli|t-~DdWJFe#0yS-Hn=&UXvz$IerBOllk$NoV`|H$j76@p8H)kWVrgP4U?la^1p97^q=+l#F*@_H-NZ%l`Y8YAe*1yx%wObmqS(t^UFAB}WL|_fag= zc#Ny#bFq0ektH*6AgFG+attS5QWcqy_oR`F=F?Rr5Z%;&Vt_IuckG9eSD|C6v~_8y z)}6F&9oJWfEyX&!i}GJ%<_Qw-YQLLiD#3%IZuBC0*OJ7#4*KDL?XP>+G1K`ifUs=! zlLd?qjkxIc{D|pQUNuY`%AIsIymHK-YMszAr+dh*?~uvK^N!}SFS87)f{NVla#iA6 zf}&}&j@e>gKlaDc#?~|DBB!Q1Z4X!q9G%)#v@z5^-M)7f{mtuykGR#e8etXH#mu9Q zIDgG8m=$|dDDg&S#eb!nS~DBNTv#Z!;u3p&^n&LS3z)0$e|INo?dRHOxM1>t;h}0m zJ9t~I#wrTr^JQ@9`zbT=qb_OplGg9O&I`KUj%hLk?gWI(olorMNJyvNF>IaypnqS_V9wfJGIFm*9uRI? z_sq^u>0;fp_FI0i-TQ5H&P?W;@x-h;N)q2qNqs5#ZYCgqF|(ypLr)IGb7lfcw|0p> z)9y65=wI?Z5Af2zH6?{xc~@`$F26m-40|=Y{gdTZddyohl*pb%T|=8rU-{fGE}IsH z9Jtg5FVr_>Ier;W#fmuynMFh{mOcLZmIZ8IU;z_NV+Zm&<+E-M(V9G8iQceJVF9nK z*2>Ran;K>TU2800d2ZQp{rW2N^k(+m?(n@SMT@C+%vYC~F%6&0#GCw{vVh_<>>Kwj zU6}jLbC3$%x5E~^LGRP<^(^V|N$AF+f8O|y(p|2-Bgy>eZBn(L$zcIgw<%7r+<#Uc z{i_Kil)yA%ij}Ts$*e7gzPz%kYJBA7NEYC;^8RlkIJva^r%moj8@2CRa-uHuHrWEN z7Bs=Ke^a~Hlovt?;KkbUH8uNHEn{kB=*x^%UBc82sNTs#V7*|ME?wUD@GFyAx=wgj z*HoK9I8{!l?bctAh|@lPh}t#7zJZwmR$NOd8grK++Rx>gK6^0M1vYc!3t?fE@P#Sr zJ;9_ZLIs$%J}F>2b(5Qhbzo9ync8X{?~q4A+GVobOzWPHZ`yp?MrZs)39e+Jd*OO| zGEjEuqH0Hk#LWUhgYr#XF~FMxgOV+;cY>XhbL23pvAku9e3hA*^(2jyW$3 z7e0(r8de@MQI$1cy7{5V9k^T+qbGT^>{s|eYO4cheyW~{|AP`G!g>r46O~%%L;@xE)J3B2dY|*>SZhJeP zVz}tOm1LE8b2Afvo`Io#ma_5|G33%63*O1f9A01T?fkCCNta9(rN_Rt#7gfnH~X5b zTnxEvjKCp(LafWF#m{ zx~!a{l8UN|xQqr?Lm8`}tfI`;A8>PX^YQR)=HuI}EP;|x{y*N>`U4JExa`052U6^R z{P<7x0VGCqAvi%f8%%Z;24HX)7Z;qDlaq&^n-jbf5??tXtTP!%6?sM5(+*lCnIa{{ypFa$ z@*D|9Z+0mlj>{fNbs8(S=aR30tJ;`HtvH%F#DSUPO48bRwmHg&SkK#9o1Mp`XU-d( zRTP7%+UzNBiFP#SlajdQlrCa{EBU3O{d2RUEf@DW>x9R}uaoGT-u$YNf4wN5b!uAj zqsYOMMk%o}{W9ETy^@^)WjU@dl;OrA+RdAr)ka61MGh?{=eIai=KNmkN!PRGm9^qB zm#7HCWELPCgv|?I+HdM}em-0hpL21vI33$sreScV<27uX-SX%3O@)yT(a##-g`duM zckbIRA84Fu-nZ2)d?;HsY&=0~=;-$q`EL=Xjf&O<)^lfw2*FHrM}*@KIi$1x>2T}1 zU7YCMi8D?jysccBb$-S1&76Q7=efe^!pvP^`((Q3%`VvAbI}v|AeYxrH%+Q&$8?lm zFZ3z-Le=YEmiZme zt&Ni{OU8~aWFfW*`f_oVn%O>|EIjp9{DV@td1_}=al0;8@mDT4e{T4Miue%U4XO76 zSl7-kZDdUYizI=0Q8cgdYG(7&saHl-Rww3V(%V12Xg$7Dwsq?0=bCiAUkN|lLUMbB zBTknsWPgp9+SR;!;HZe6?axNxqp2%vs4Y6169bTn%L^gxT50k~_h&A?I&@Wj>zA_M zMe@Eq$ z-9P}+pUuL~J&)WY6$#R6aV#R&T-CJ0o-YxD(irzEv#HR3NkepFZ`iWbIo;eL0@>ugrIoR?V zmRs|-*@VAQ+{KwleIUD~@PWC){?Z+bLnXsb+a?}5<@5jrV)Ao*oMvyzwVxP_-m;e$ zacqwWIsX3be(oLfPP@;Emp|6=bMkmB68&b_Duj-1(NitQ&0#1yT{Hu;SWQ*4BFWu^Vcts;lhLebxBgh_cBr(bX7h>vQbVhzBd90_Hx2@!;R{Ui>;|M^uerciO z%%^_+i#CSbH) zutpq6zhf_V9(OCzDfi8nMgw&VX9S1v2t zDB$=wnRm1#^JR`%%1s_s;=F@#<`uQ*_ zB@|8+zg|=rdl(YfzqNyqf*a06v+^jUjDFTwlnEIHNAApw4wYu|W@+@8kUV*-iGxoUPz>M}!`B)v;u(`ADSoST9K_ z+Jxi!p80)(;$qPs?IWxl>5(kzq^ibANa|?)oG@*5*8|c6 zOi}_PBddXMt;dVAE{Iut(DbpE*{YK1VQb_Ln20?E(-%-8b*YY<1^7)L=rR&{M(K^Z zaN$BhkY?MvQ)hP_lYRR6Q}Qo-r+IO-d$ExNXY)|l;efqib$GL%SKv#{0r&eYE8R47 zmGL)SbjS10J=R1DpOWvNNm~0Z8NZ^8->vj}Ji2b}eOFR{$SYK!iS46Ef6sE8yJ4Gv z%e>O6)C*E+YpZol_s)F_c8OI`)O}sQ|CZzq%N2hmv&Vh;3ho+D^zuzFA5EFied#=- z*mDo-0-|ZZ+wPv$yVbK3X<>x|ubAIi=u`=6Fvc_Y|) zPiA4N@#eBmj<*JPV-@Fm?hM`SvuRcTfaRjf{cjvI9A@$-%4Nud$}HekRL;~ffkzXy zew$4XQ!8Aq_I%xZXX%1ic4N8!wLMN1eF>8sVcZwRHHqs5L1|Y92X;INiZ$u~x`lk( zecE;Q{vFLaERJ4h4UBOie)-N!y1O5oIw)b&@eOu@zcOojV6b-jUekvFzGJ(|@ax{r z!T5pMNAhm-esmbuVezDNKa51;lDpe_e_sd#Lx$;$wH;5wrB@xuunIM3%un zP$%eGc?|Xn?RN9+`AvHK#bm2;*+*&zg7Ci0tY@SV1YL%$+$EP30{4 z>*B_a#&1=3r`b7X>C4-TvSFvCu()-Od6w3`o!`xk_sIs7m7%bMQl;pVy?RA~O(1@QA@s`uhJ@~q}O28&CXPX&^)osn^ z_cuGhVR>Bf%Q@{C^@pG2SAEDD^)Q*1^xekoEE=HOA@~HIUW&JVloIBFUcj8FaXN}5 zzMxfF_4GZLm%=_*I@q#zTu>i*x@SPr6}c%U{4HgB$h)o8_{q3~Gr+J5YF05rU$=Cd zeazIXU3B>NaQ#t^-uLB>KM!j+`WaO2DVQcLt+y#2>NN6DJ-uVBm^NN}pLV`yym39t zu{!q1WdxvEapC6an5@}^tUYg6d^FtdHeBEL{)t(btU35jR}e>kmC?hcRWFJwD4lTH zocOImNN314R~g=EznFEnP_%JOmDAkOdN^x*KbC_h{(+M4>2JJSIMU_m<5#H80aEao zYx+O;Dee5o{E?bSG``+oi3<|5H&cQ*32H*b#!k?VJqpX1pS zHF>%?&i)495H*Hwr!VPrSr}n%Ubw8P5iNd}t2+F=HBY*hipVMNT|0-YO1NNy1!6pP zv4`i2<4i)u-F9En6_Lu3D|h4^9#angkhJp^!mIU|YDAy2@c4+Ex%ykTi!z5q!d1l&#NT&lZk2^-CUtKD%!e>5N((R+W5nbk6*k z*_w=>57YYY)g@JGs>wA3q4m(5_iq8Kw3?+v!esKwoOcuR-GI!D=C2yw<2@e-xC<** zMg|Et{8+$iUlvfg{n|UFIgXv@4=N3OxOl&Ez{A&PT&+9jd2}4F#i1wutM@N;a<8DM zN4Mkrj8Wr-*;zMy85Q^^Mz=1&w9zy!v;NA+1P{Mbd0MONd)H>4n`cWpJ~v*vAE=Pw zi|=>8bM?l^;dcY6N{AOCGX^hzr(!gceDOCcMgp(DJZhq~07R;NJXJQ(MBfz@l)v3O zuj!1#vEPft_{~#Bk6?xi7M^C;1A4F3dLCH2@p*q_Jg4|W-h$Ni_B6k`Q89m^kujV14%MlTVe|9%fsNpC~$Oyq=v**xYMAd$0SR zLoMIZ#IcKd?q-{?c1qXZ&UD^6GAp2V>QuhX&(CfZ$r{Hj6mM3{Ht^PX@0>AI>C)c>IrWA)Y-@yh$2 zvuK-p3GiLyP&Utf7NAt)r++?~*1l*v7As>hIN)w%l^SbP6BSYD80b*DL*Tg0)-&H) zWCYrYYvcE`!XwpkaT8fQYf z_TTszv?|hy#&UH$o*hn;U#`l_s>v7f9>Cu&>xnJjADMrYgOe8+PY`@Zem2uqnDuB! zNU7zwR!8B(R`c2iOTXv$Utic;AGj|lJ4s@j;KUaV&m;JKv;1F|YVQl+2kuv7_xm|* zwu8y0>jI;Qd7CT-!QUmAAU|N{@ahHPLfXS^nF?cbnjHf&e$|8c z;Ol#L^WVz9SodNZZ1g0bW{=-+{(Ye^>$eFB^BuMfu?SOl$39xIX57)uFFt;W7t&lBE3v%ioL! zWiHtYaaDVHYwIiy1to9X=QQgK9%IyCrPuZaa>QJ-zlPX1qs~ob-A{t?)!Q-(Y~;Ok4Z zrNh(HhjYR$OJB9vKJBgoP6?0i$q=s37RYyIp7J{1T9uqC-1pqiO+x;|i*Pr?BDwsK zfm%7S@RdL}pC3oe+G7SC{E;F~7mUtx^{dbNpDWnnInR`A{7S$jJ+HGbmXb%xl5@Ap zomt){c=PCtx2yuEq8EtUx0PhR7Js=j;j*&)gUxLSB?Zm1a7_ott?I`sI0P&9C|Wy= z$FB#Zg>uC8j|``6y3TdcQ#j3E;u+4U=flU7qH*E|2Il@F-&WKv^)8nkjre9(5^(d) z{zqlUAE;aTa2A-J&K(;qi+^BqxeO^KcRd~P^ZZcS@$C_uCv2~5t~_RE(`Q(&VYEJ? zAZs4BlqAp1`68wJvC!n@t#6L2A4#Ri=w6;!QGTc=&m$Z1-R8|bL&OR7BMDDrNg9U4 zlIOHX*Gtj8dootvagN@k#d=4pbzxof+QlqnWe!>ta98r!A;Kol+TKw3pOS`xIe51HSb0Ba>T+pqiTeAQ$S)QE zkKO0^!Z-2}c}e$Y-Y7kZzc?Ols><#4Xt#(_-~kp8Ir%82=9h;wVN(22KmY3~|L+7H zoryzBAsWZvtCj`faB)^f0y1yEpC-arMob~)vcG0RyJz;>JF@1JlUoh{QVCHE; zR^O@g2Qsz1Ou^X{GnrU%7O+$Ekso|nOk?-}R9;bkC<|y`YCa8?=lPaLFV%lL`s*#V zuEF2Wx@u+x${la3)q)n@r)p9ek%L~M@o9G1EnQ0m_6()ub;bwCAc zcoT1&-dys{vU|_c{Vshgqs(l&?a;Fk&yp-*UoBx$nC!$*NycqrsGB4&?P~SSjwrKq zJu%M1;!^t`zo1E{7e3SW`)2uOLU7XqjuR;)LDf*<6X9_ie4_o>=gXWkX` zlPo!SVMsLn-0}3n7q$xcha#uVZMHdZ*(fX6D2uDwjHapB0=aKBgl*H0+X@^WQK*-= zqDV?#>CNl$Td{hCwRiq`=T^IO@zQxTS=&>$-c_x;u4lW%Ckc%M&bhZtKa<05Z)pm; zxmb9xBWJYMjh`{^{_EmxDLjJ5&0k-arYWaqxL_(}DqXl)I{&v=g~{pfIUc*=kBd*E zZastNO1Vss>-qYQA-@-GIl3A+dphi6PK>8dVBKLOyY_3Y(H)zggd{jUX|#Py`gl0w z;meMl548J}t?rD=Yjj>9JKn213vrLh%{cttE>RQ3dn!D%4=a(F$N8j>yEGQxQ z=)YUDoSqxpDcv(Z5Mfy{-!-ng{gB?}=lTnF(JG6A!aA5fzGLxe+pM@x|8BrA3xaPo zG+ehU7valquUg!hYVD?+!+lUBt{|bzkz^rkESfWP3weVRN&iuNu9q|Q3$fVJM!{*0 z@1WIqyp7?Bl3hKvmd$%orxVRmmA)pMdByQnjg~w&6H`2DIbO2R#u2U}a?JXLLGfw* zat@nuM_khrgpz246G<-IOmok3$3u&G2)i|umQ`bg=BU&7v90EcI=gw=hr|qSY5!7w zF4qLS;|jSV~*Z-DARme=#r${63%IUI94~o*G*L-Ti{AY#1DZL*OM?aCdiyVQ>fmg1gQj!67h%GdSG5_tfv)x>fhf zt#kfW>qB>~XYIAt-rc>QwYsaih9u8)v60`ibn3cGza}wj4MC?8kxWrV(YUl8cZU18 z|4A`>_~dh?AR*?|Lh!$DS*8FD(d~Ef?|_Kp)OurM zQG0oQ3{^29U^g7!`Fs_w_xC{(9jtu(m0cisF#Z!8%nMjrb!Z5cABPxHlU2?)HXM5q zzDr<@(8D`0|WqA!I&}qpb*UM6)sR&Hlv3x z?D)l3;VzjU6y)#8?AUcb!kd z79+=0KNF_*6JTMM1HkIzb2)z4zK*8|^|x_g>6XuUffA%wNC|++&*p4c4iga`fo2vY zFB_1F(C@~#nKh0CqrQMrk5?QE!(hZt)eT6leG+Kl8jbo!LAhy= z*`-W6Dp=s$G~KL4!QF%&EYcrVRRQZB)vMTHb<`)zRsuWZYp_jy%Z;6SC_q%PM4Ks?F2WkIs$jw z{`))J_7~JM8H`0|aZvEp- z8?Pl~vv6wr_r|4)xl&vog+!co>D7l~q?C$nG|5}^gLK!iUj_bGwy;mX#g=}_$W{y#f@17m4k?w9h;&jfQrI1%aOkpODok)U82u)ZPR$^K3LgH+6WnAYH9_e6ssq$*<+eD`Nn)F!DOgEb z8~L_TNMUio+EPPt(_Mf5iE4D5*x>Yy%H1rdu4Zc4^h8`Vx6RHhBgh=fH1EF9k z2_09zsHwKfbXj})6R{sa`OwX+O1WS5##{%lM&wpJMro!Ouu;oK$IYaVL-!5+jZGJG znH}lt!Y^SM8S9C!Q{JV>^|HL6 zSJKuKjLUDxmUjq|PE_6f&Mfr)hy8lUyU9#f#pZhw;yD);YDSDW|ZIrx1yqh~g4H!ElMFfr=~wa;dG z;*2}sLK624pyDS={Wvc(tBx{G7Cm@Mx&NNqNlaf+IQX?t{_*X8{x4&<(U4FcE^1P5 zfYWXRY2;6l5kST-tHJ>fBGa7Fz$HeRLHg+>Nt~ zby#JlENj;#qc-#l)|P+I^EF|BTOe4^s!fRln_(pckBj>`m3YYWpW@FsIxVfz!x(>< zE2{k?wdNO+Bt%ZNwOid>>?>G7*P=*8k3~$JMWCnV2z3$dacewt>9oz;E_FDKSyv{Q z6NtA^qGx$gKS>vdQNp5xul=rAIpbeWrCNY7lGciqsE(d#owD1~y_2yQf)}8ochFlS zl%5fmTGO7xFEq>UL`22K76C;@r(VS?WcAQN?))GeWmZx0s_E(6`eIG8s>mdDzPeZC zUlxpfphi?v>(9n;&6QEhNXMob7yAxC_ND>)Qb4g9L(nX@Qc9XL5_FLZcjAb*&beWs ziW>KWwh1nj+%bu^O-wJx^f1Cd$BkX5U+;-eS@870AjR%0NB5V*ADe z`3*kub0u~2=PX@zG7Pc#jNb1LUrjI>XBx+flmF`2_D$8e9evHa>Umn%Mu>>zs#jL1 z@@ZeJGgyWei)9!r)9YBvYPe1ng=*+FH(pJh4V+Wr270_cjLsN=Z5MCN$$*CX_#&#t z9f1Zz_Vf-QMA-t5*3Js)K}ku0<=yyZqy5;V;=HY@;)d)^x}8aVIu}FKY*z# zn}4jhb~}Jsba=)1ZJX$i(BPtOz5`kjwwZ6pY%xs)MMSUEw$7mD>-d-Pui`2+B@F*~C5bP}hRVB1>AH<* zTCs~fb|iN4six*qqsfKycdP`zqa9a5_i*bKWZ*f{Twit3#dsbmrYmc^o)Gz?4DF*7 zzPqi@W@OGwsu^DDVPeYU;NjhZ{xWYnzXFwrx!jX@`XdGjw_h)W0F4C42 z`%d(B{7Ca!a8-PJwELgJE8=+!c|pmIOkmli*od)!rM5tKNP$rPA66%bos?eeC1#m# zB5|e%b7fYU*2_M{{xA;LA*iO6Ak~OE-5=KI9^KflGJSlUM^fKIJ2n$?c6}?qmNF!M zkqICnYFjhB~Ipdwl48LYTr{1E$|uD5r3 z?43RIop<2&ipzv_yu1#&Zg8}<+!mF2@$UC^ny&)9xH+4F4sYF=yLcJ6DgJm?8Er1whUG1J8pXLwk|3Et4PIxLBX;3ymp zVr2G;XB;F-sEsI*F-E;))l^Q@6q2nNpw`4lj%0CTwWXT1m?Wu0QU}pDRko)8=-r2= z9~;-fNz9lVsL;c+ExA>EKV1mxKR0?A>uD(^l+o)3samPTt^GD=4@!UeqlbY> zc#Ow4T&8%9Tc4&8ll2ovkezOq=8=(~p1GlHt?$yG3N~U4)#Y}h*qp)duBE@N66osk z5f0-(EFwk)tHACJ$pol?O8><}{9#FEFLbTx z%*gDrek^eIF>y`7V9RE4e4q{#}bkqykz-vDY0fJ4~!gMNea#Zl?6ciP>%&1(j7ex^DE1lwL2aJalQC1xOlz zSY8OTFpo@gP%XY2uOHRIxv1daC5Lf zqCz6z)0#BNXMV)o=5aDZLzx`UtN2d|Kx*xE#vA1?iGyBLBri`_QZ~v}ixnlw(5qP( zqO2dJ6Pe}c$XVX)>q)MZ9toO%rC7_KxRmuY#cOd02)9~B>JH{fhaR+K87f}Ai~Z6} z-342IIptVmg-q=Yt(c|5a&d1t8I0Nshv&#dEGay4qR3t}I?B&#%~ug!38o26^d|`> zwjdg2?4m1+yaVSd^DZc!0MQTs^u)aE84Ef$tB3S>l^}|a=DLz8^R~q6&S~!#5p)k_ z^N&`4>DWV9>0L7?koGSmeD%c4(utt{hB9@bXR*bZ(L! zZBaxLcE=L?GEV@KI~=2bRpLk$m{j8<*TG+-C&1X_&m>fg?h~M(XE(?K^!Qh)uv+2w zUhE0*i`{wG`6h2k<+{J-ej;d7;{m7dzXv#e0qP{clKQly=w0uzZK&0>lNDTU;aB^FBF7*V6 zd+Am=Iqq+cnl_Kr`j7Tcfb@rC{MGqIAn_Am zJMicK6J9)Ox8eyP`!_$@TkS_m-T%U-(Ei6g$vuBn=?KFUVCW$^4qTay`uqe~d`Ry8 zPx@@vV10&@q9?$sJ5~)aYu?3Y+9yEIf7$*U#8-US0)=DW6QJ(y{TIiB4zaYq>N}Q) z|HP+o@~iv_Aom0~&im`1TyNGU=F6x~BYDf$zj=8ny( z2{lh?)tU9@jb5ypYy6Sizhkgb8<7aSunWhPdh?pnZL8?{@3dhC)ehoK=JhBIrYx0G z6{&Z!)|DrM=&?z`TAz-d9n_zuE6!q5F^4oR9wvP1dlNvv=ax*qwo1QO84tTuTsNQ~tqhU0L@**oJf^B3jT0U!ZD_Xv!)wA@(6h}{M(e0-L;Tp?Qx$vSr?ku-A=eX;D ze`jIJAoa`@LM`>7NkDfQ44DmAwR*3EYyKT@Rij|TZ;ofzfk%P)d+B{+ zDAqII#WJ%Lk)CT~PSe8#(rnMvJs@P-oPxcB4Zvea3eTJdgqitmLhl2Ue)S!6n@No4 z!objbL#&G&V`}~IV}GryZZ-?@hJFY7jh)sC*PEZ`dWC(-oY-sEMaTXIx$68M5~^fo z+MLa_^`k!$=gy#hP%uBa!r zG}#c67fDI%&=%uLQ0gKq$gXe7d-m3KC&pB~=gV{}%=OaW1o{M^3J5%|(JhAuPpFvb z+z6*-nmbL~qfD28wPQ56BFuP$ZkNI{H2NKQZl`We-Ar%pS0&n+X%xNuUY6VvIgqKV ztw38^IgFY-@9#>c$W*UPTmj^3-Elv*ADJ=C4sKdRVniJmeiiDbJ?npPQ55;A;5K2A zKvy9~%zpcV(2eFj&g$#dSi5$4mk@z4w00hPLS8!-iYdmuXHf+bcn4DJI{ihog@hPM zg>$I-y!Gy-K7zJ|#|Qb{WE?$XAQIDN}z)p)M0Bp5=# zhvtHDbFn0U|N4zb6CwV_i$tU(Lx^PLg`}vIWI@bOMdyp&-zEpS5(bsO>_-Tu&%Us5 zN3sxoVWq;;LYFN*3`yMRq%WyR5tV%2sT)6<7$3Pw^e!K#!PF>#)X=e+MT9xz<=7q} zLMr0Zflxuc;>LS%9r(oL4J&6k<|4n1Y9iVAA@p#_Oyf?rMXtMs)C>>IMF;%YZEHU; zV<0xyu#oZA>fko5m#R90%ZR#522GpcHA%?KT|TdkKCb+p`Z42XLYuXFzVd+|tz~zw zUf&GQv?~e7@|QY?3k_SVh@xXohJ4N|-x<_5i0k(SGg@rV&Nj0MVTgGjU-eBI5RAl& zwwT717%`+0g{$@_HpjwEO5sH#TyxNX^lekuu%AYLQotqVQG>r%9(>-7qIU|=EuxpE{UMFTc)p6B~^~ep#}$gR;?r5EHWjULQ3Q$~V^)LlKsw8(+cK4&`b=bw) zPp^g4wT2bk3FHIfp~1oc-KE;CiRzy*gI{0g;L5k2Duy4v41SfFh`Sz< zj_$@KR50kz(skRbDVQQy$-(;Kc0dsys8Xi8eRQhW_Kpr~-Ji6sS?8W?nOxyI2W&gX z=AgRWELO#Q&DFg11i&^7T49ZgbCj4KWc<&qZTI!L^t1o55P<3A_z7Q}%U-c2y0j~} zc~}kA1KBAij_lkep8$eriPg?_-y>rb!=ClFMI3+blT};y4t_28tS;h)F3QPj7|mto z{6|e8gh9mK=tup~vA8Gfalb;qpvt4+8hk*+ifly}K~<tlGE!|iI3rSFXLew<=`1_5!^ zlFwpn_4;qlaG8!*L8{=$`AS_M&T?nL34oL7o7zs&@CsA*)VJbsCH`as!_lv|A>OHI zoup+dD__jJCO*C}9M$^PT5YV==6QeU5TgcN+(z=MuG73Y#`ywTCS#dznd3HGhWtX1 zQ9@_~7ZxU}0<7yhoWLeYjh`7)90*uwCY(-;Rs=Vj!-v`zIbcny0eMn)Gzh<%I%hl7 zfCwt;*JVZ=@%D02k5qk3b31@J zhII!HBi+JxQnfE#5YqJ7!UB7+jj4Ui`Yy4jG@oIn2JZ^h%3}RIzGI9*>6)*97IG1> z)(1yM8qV94sHe^p&g_a6a@{x|o5lO_*fk?)rc-r674yY={8jjFJUF-55Z35eY(m*r zy@Aqq_J~WdjO7I*#CV7L!YmywPVjYzNZO{YDQ){;g*&ARl))apdNtBaVQukk%6eR; z|H!1p=7Shy8ReyoI2z#xiQ=^MmOlR-oYH#7ddF1&Y=fX`Ug@tq0mQz0Cn(x~ySxfW zX`;4mKafMX%om5<%xRPzw_7c54kC(>rd6E$r4#lKpwHOt2PcLd)TjnnJ!k=lqsA2p zWG$HyhG5>N*@9nQ`~a5U$nQT$FW*S+4sp-Uk=!BTiY9lB4(>I~AYLYQpAe6;pBx;K z#UDYVDvBb#h8=-$2*L~QMTQ%iIRlUkgr&tSlGrL0-0O!yB@p~1GfuG3va?)9yh5!Un$ivY>2qwktL zTtHBI-H*?Vo~RQk64Y4anm) zF$=)+9+{qMSt$ebhh^D>FSF0VR8_Lq(FQioI737j4rVUJ!;E3fV)wG*HLyK01S-)j ztlmY~?+L)@CGxx;5#>l{$|d;0py-ODgY=HUIej-hI~94^5L+}Lv|oDj`&h9xJLVA%j@Ag==!}Uam?p&8*gD9CWBVt$<{ZK>aTyk;&qysOM2o*6_ zc$jFpdI=|FCTh;9h+FSod;(b2Jp2sZx+A!79d=x3vUrRYV$Y=eU!fYmW#iuc=64~V z#8*m<7+lZ!D2Mfmd7RusvGtTnOYs>6;~TX#vo1~NLmFkZb!#H|B20kc%4T3&MY}-4 zQ1WQz)*jkxQ5_0e45D?Vi><>fa?XMEvD!;~Ou?0a z5f^3e{7z36C2i%zFLaH%;tZ8s+9!(r5o-9v$XCsB$^6m4Nx=*X&eZ4t-`5UWow7r8 zoXuXfBey92R4I3LfreL!*R}A*_ED$GL90F0@9pfi;tR!c2M3Sj192&dEB<-cwxLJiaqz;nq&1+22YP>!3w^n%aBM%1?nC#SsO$ zkBdAzQ)`+$dawtYgEhYdw|IQ#bFh!&i(CC_^hW($?;CHIKw2n-(jtr4!pJMkOeob? zZrxcJ|BS5kY*%~+4)S8K=Y0{!v?=)VJM#|`8;=CawBE<@$63d$FD(nv5>AL_utY$m zJ5n--QfN=0;|YBwVNw#g5aw)jRPn?sYO;gx`x21H7`oA&nN1$bK+Ayq z^R<)mT_DDawDPtw#**aIYspb5dHj9 zD8#OyRa?_CCyqP18sY%cN+Tqj4;y|lh+htRp<4xVLMp=JwljgFM=5G- zcqx$g5Z-S;Vz5+3%UlD2kH9X4OK*Rxg>E$o%;=T7hg@)x;e%0(xRuL6r*~3@t}QoE zDrH*S64t^)IAOwna#Zym#KdOC{U%2gZOFpw-RB681&Eo z=feLw;&sNut2#{CEi7f-Tuf4Qnuy87!gp#L)UUPQS)+w4{X(O{USPpWN|P>^`^j_q z(nYxbQlFv|lfy1OU6XKCa=#(d(tj2^6Ie#|Y?mk)<0nC9VsT;_-u{4=CcgDQM@IvS zIg+vg82EluK&5TJsdsztsd7dfe3=6;;{%^FawIc5+dtod?4+=Bdm#@Jv^_uRJIIjfinBmOVEbCtU~{$@WZbfywu!yrn%S|MG))*O zATca@gwH^8Z9JbpE*C+B`+ZU6)s4sXHzVhFu!k40)Nh84b8E97{G@P})doucjB!Ri zgn1q1!j`IGsF8f5>UF-}K{7n*#kKB!)^LawJ_X5k)0JPH>nHY@GSf-z7@P2!@|i{6 zZ7D+O1+Z9+g3YG`ID1^1e3p{yMz4SO;&O-SaHgDzk{^JO&O={z$n6mw%DJ6rFv1b5k+3vg^m-I1{7?(y zs@mAUt@C=J$E2yrV@%Y09%-L9^H!p|TcOF1%N!Zs2xp&n^vrzoqQ@3(2D?#70uvRJ zw(ZC-%y0O5fc14c`LAaHz{h7cUo7re90#(vQVsJCKQvRT#(t_JscX1%w&q;PeP;et{z=t7d=en}o(U$an?F#}Z}JYb4giZd z%mP?IalPR_nE@{X8s+q%O1k0M#R@)MSQ%0R&S{H6Cs;!!XP&*|D^}X>I`oFfRsI}~ zT0-)6I#^60MWoKu-N%1@eV1}$gj{aEKtZRShU@=Q6WFS6Ri-uB4mDXBk`kE;gTl0j z8{Qm>We@Si;xl|Z0&UeY9&xxb_75|2_juOjjE*dvmOJvR)Gj*nU6`aF&S5j2i{R8Q z{5=y3*S{nUt2xj+Z3#Nj4=}X5!(N)NNq)Q?jHg+QVD{h``3+~IT|3}gNHxVmD4M-q z(m#N{yc{Q6;WNaj3NVbV@{d>IR!Z3#*weuiVHAD>^sVG-aKkEg8Lx2I8^a2kl#6H| zh`KN$hW)e5m+xb|+WH}1@c#=8fjymD7WQ^yh{jFNR0-|jOhR$!Fm^;Ni&$V~jiowRYHiTMj5 zDRxLac7$ooi4B+$3=wxw$oa;Qo^-5hg@-NhYFM1b#Vt0t}&D~`M zafOpLX5LCYYWqiDr35N>$gg) z^5=Kx$uhA1y&ka`|Sf z_iWRD^wT*9D`9sYiV|f3x|2tegEeoBh(^{AO1*@?=Gh{a`9#DL z!?@IQ_@Cq1kz?*b9ie&|cBWp{lW8T+uQpC@OJOx-+AMQm1+MY8Cs>Ncq%-x6 z(G~FOZqL}B>=|zRIg(o*M=ysQeUb6WkQ*{P6sFo&{iYZO9qR=i!z|fMg=Oaf``frT z3r~Oy{Mn7%8e^?%qwAF;36lqjpq4W?eKs`^Pha(=@gRY9e1}-rGAkr|!RVis2N2Hz z87;U$d_b#MP`5y5qD-$%kj0|cPNXK*UxezK%MEl>V~p_4V00{Q0- zHIz~l^dWK%>_MUVYPa*b-`^5y7D_V?%pCj0SC9_?paF2);F5OjxPl^VuP$BhYc(cD z1s00_&=z~godt=B&jpS`2QAo{YV^ft8`t)M#RAhJxxC_-{>UIrueD$G$gVuYL5SnU zA?yIsjPR4f;OxtDmavBAH9b^I*uY`*FkO)Da+#*;vKhhPoAdfvOxDt?%hh}z znxC)FEBAL&s%sT;ItujAoUPo)6-D-=rGvD3Jn>s@sChJ z9Xk6cEiJ!yhUK(4)ndOtu79@9)@Wme;SSEkkM#N14&jhiBBO2><8Lc1aL{6bZ4*Do zkSkj;%pCgbS6hEuzGvH?z8HM22sbWKXjpKwG?Qu z;qDy>5)*Cv#$yH3aLw*Ig~@Z<-K2V%&nu^5fs!&V-acFu^n<+)=*RnJVZL&SB3PfM zAMwgGze=kWou{*|aK3bu9VcHF^V~V&7TIW>E6#GVeByoD3V|3&CGTso2X|Y+iNwz~ zXDbmMDiHKHXU6FA#p|v5uo@AY0`E+HpCpf?n1g{s$y1`~nP9X>Xm zWJ~;3_r>N1MI2JjT;{{0!z9Ilx(8yGkjqW_KCe0lA0wdV>^~`g38h~o8)Ioxl`e;C zqH3Km(#7JtUR2-igG#wsR;shJ+Od_05C~~zhsa{Kg=99bJ@Zhs@^oECdyELk^-}I# zniz%gtB)6xkAN|c=8xwGqpl~fS-oC#Fk1>Z8~u@kuAsxbEk{ht4>KRg)o~U?C*U`y zZv?dsU&g&>;?sZ5fN5!|qrC{WE0b*Ha9cJnfjHKJ(qGUGu@x>K<2Dd&ViQ4(Sm)K| z)jpnVwG!$VC8XMqM*NQPwY3;n{RXC0_|>6QZvs0=VM?fKaA-IE@eVe2D-+)4wyXl| z9>O#d>1@vUX^7eidEjg2S7Xy-#;zBtC6pq1zG5(5^8~QrHRSJ(CU1gJZ_ynXo1j(Ge9L9XV*UrT|R;vMFui*|ct zy+q74VGF{#<+Hd}k^ujOqQ>QyVP9hkfMsr3s!3I`X9iQ%y6_Q8UegCQYBrMxV8!98 z`u$46tIdQ1iG?7u{fk*UkmSpsXr#!A%vn^O`6oZM`Winr2Q4s&uOO_L8vh^m{^FMe zyMu5utD1laB(TofurEg~woAH#kX1*B_UmSwmtgacu)FYkW)ZZtIWPIrsfKB6`=w_! zst`-mVD?)6m%6?v1-MzAPOE2E61+65J!UIxy+_f}k0c3%fZG(wWN6h(-^a)oRfr0e zK4&}ZvCXp^ujkH5vsWw%CNYYcc;{ruQ863zs>-0hU7hUnsIjZsP5AVoBN;+1AI{(D zsHdt4*(Ydx6g9AF;@4XUmdB*zv0p+phwR8G&jPDg*PHvi*~SgKrx0ymdF={_7e3MM zmf?tC+~;n3w*Z+kx6+QXjJT`&W#b$#ACd(P(#M_$aL)=1hDp z9DX%&AtUOlX^i!cr~3Zt+TRiYQ#v6#x5@w>`UJ3nw%jo~ACWYXr}I$u8m`SkMfjTY z^QI0qn3vv*tNkCTeLW)2csB_$dDk1U$#32l!wOVa^LYJI6@N02ypECP!IX0G0*mbk z;5(?)4?NrcX3_7?sFLa7ksLPTcFdB#5^xZSM`tNq;dR5h)Bh{dDp{6=0U;SNbuJmk z!$N3_RzB?E{7-v%pRvxzkjUUx(|Kb1We@vA4juE49WL(IwG#H)xzlZv!q2HmC0J*T z`P1({_ywRhLP=pLPeDh;lxWC8l$Q#l;rtqh^VqNq3sX-$p2CrHmqyI|CX zGT7v|>YofBVzS}Q9>pg>(EQZSf!5g_QaG+ym}U<33)YgSJqgStl}h2yHhW+=F%xgm zs-#l+YNB9`V((tGBMHmQFBILpiXemr6u~}#IJxrGcV=ff#5oiPJ~`O;4bO8Kz0;^G z+U+Ma&_P+j2ED4F%RInuNlKUKhp$TbH+S+|w9oVu%?h3Xy~Ir$sF<=A5D(?gQQ2IB zYz34w{EJgZIH$jR?D^+g30;H;I~&#{kW~#A$p4KOHyE9+s|FH+&!*tCoFzU$3X*G_ zRIaz<0OdX-VrJYBQO?P-?VdI5;-3|djt<6ln?DoI6{QF?o}399PKt~4TVUrpUOa%o zq0vTQTu{TjaEC(-b=j5le!2b2d}>#ESN?!13;u9}D(8ZC>v)o#)UA*#6E>RprPL_T z8d5apD5ngI$ds`sz~FJ}Rh0Mn26S*{^M);UIU;@GG3z!cFPse30?#Rdil`Xaz#Qhv ztn%gfXD!~|H8cCJp#%^Izoq7C_yd}?CqaaJ{K#G6)~%=wXp9bMSsjj+^K&mM%{`<$ zc@iQbKH2ous!6=r@)^%=aAyw*$fl&x_X*H(<$1s2pDRI3M)p-Pj>cc1XVJM1#?l5= z2G@AZ<2@T_Q?+Z$T|%;PjQ%yQ%m?y+R~kDp4Qe`q2|y-lq-)TnXBAE9DDWwNu0O&Y zjdbk52Oj%VRoeXv(cP-V93})JIVvZI4(f%r>O5s0!?^|5fx4)}zX_i%qrTWZT-koE znzl^>T6m*pbIeR|Xkz4$jXPc-sdEvg6a1-p?8@mJcH@O^MkaCaP)KzRX^`l);FI^`tMV(80f5hxZsC8-(o~I8JYgPa*8>7>WFS6!?^no zHuF0*R?P)r^_!H&*ovAf2fq6y(hZQIM`4EtYx>I30x!)A1mu#-k3jW_F5zePx1}AQ2HRT?qxr&ds5_O_oQ5!qgUuv6lJJM z`o1;iJ}8&Ucz8_uzWI@4HIFnW%zF7X?7k+dq412Sbt^o==s867+WYWVUg|ftWy`{| zKNJr2pILsFqaBnlEvt_#QPhdvSmsiiX3QdoS0Cd8Qjn=Lh??qv)kpmy6V9g2b?=yg zz!(I!6N0*+5qs&-2T41k>5tu%KIdwd$)9G+ANm0afsSikn7$JWk!5EOS#^Ywq6{7R zDnBE6$HG7M;!N&rP3kk*K`9;9^4j?ICxEF-hfaf!>Nz^TUCF)#;M z2CjRH6r=kw-*8T6D0h?Li1{~M_2>b>w(9wNNP_az0oNYyRNjBP?a$pwZSP z*G6Uf+#gMan$6Pl7RHc7taMImy{&fbj{!_!ALYCL5dYNF<+awYf~*H&p<3>!|J@WY zoNzwFy&v(wV1iY)Aea0b`Mw7#HzU64rJ$l%6`Kgc|F2&@{QnjBwCfpf@H?DPI{e60 z;z!L`%U7}zL)u(n(^!J;20mLn41;Thh0ia`+GH}-i~4pO$eJ%#ZfJiz>g=DBf(S$I`YQ$NO#9HNNvq zr@P6l^%!bT!tcrCTT-aJ{Wt~fgPKnIIsSOFQ@<+nh1`fe8e#@)$Rv5M=bp(}@}2V) z1v!pdGrwmKc;W4&%n_1_+P;}L;lRbjX zYrbW!8LYe;$||lD$XV`hrVT`|ZKmgy0xP!~~x@ zu-}dM80i(_^e*fVcX4fY`RO>UHqG<9M%ah=a8_FO+Ewe%mh#>3IBTSWbH_iS^rB{! zQb*OG(@Nj&R^<56DX<74+4fBGtzo|?FfSIm7MA&HY8fZoX*P{*R7uW}&GMJuQ0=u= z?7N+#3$}AlfTFHz{ZmK&x;0w*WpLDyS;OD`VG9_OhVp61q$Ggoc$V~i_PLS1Pl7nw z%r<{Ox#k$g*!rMv_PBU)L_1Ql*?wN4hd7SeQ3c~v41i~-zUU0_Zm&_b!1>Y*kl>OZ ziqG=DV74HQq!2k#V_0AdhQf2CBs=Q1`JAzzea{X7yyNbF5KU4Dx!E<&6X0a{5VYKL zo+c;M!4RhswEP&q0i_v)HCIE+z;8;kG9{9}@7N;vQZD?IY``Cl2eay4(Lwo4XnGNs z)P-!B^Hh_}uK*O2+wH624IhkHb}pnmE#KZXJ@fOZr3qB~lPb~Mb&Se;q*|*nG++`N z8yl=E_Vz!7c4anx2F=x20(<>Paf40OhrNVy@+<5tAkjj_&n`Gk$xm^rkQSuT0m_ct zQ|9NU$4$#@0fgeZFk9HA%r}lQ)OQlhtW9((K z{k*4q3A-?aJoI^@cJ| znoi%f)cYrZ+3dBSZJ@-5oouga|DNULe8dr~22`(A=fI`8?wv92_8XMN*J0bxRnSN} z?1|l#{i9QC)T-grE$Wu{6MdWH2N|dvB(cq~& zwE{KQ_I>tG*+}sEriPO$FD`~pi706dBZcMD z^EkLE&#&3RUZk(QrPv5;5vxVeKFU!zR5-fB99&tS>PQohI>x%PT^^9mPKSwGh*f zW6W60y>xH4l36&|Cpl|b62B;Cn`HTGE6k4;Davi;)38RqA(0~Oa7$C`fCsZcEoP(`A;HDMP%JeZq>o4RYjLH1b6-P21Xg`#R9z`(TJ z`uvkAdgi(-X2T1`83Nr+kC%3Cqza_VIf}EbqdR4(^sdXMKkcXMRKHVdjUTk%+57RY zN(BQ?6uKzAe&98%N0d2~QV|?t_FqQ($2vWpK2WFqyw6JuP}x9c0xDnR^p- ziS`iFkd0Xztx*&lOU^lp)qlwB=w)(>l>?3Lxq6mz>kM3oy2xt{X}K4dHEbXl?7w$T z8#<2D*_jiuL=1{e+|^@b{i2f0)owDZMma2aX;!G)H*!P@T6F8aS+*H^XT;atiP0qDNbZKlMH0G{n9CQ2AWwIB$QWk+p8(~Q zQ5X${jJ_lU`cfuv^%W$1;&_e08+duzabfx7f9PFl|?Q_DiH zM<;$#-{x+v`up5JcN3RAO@m27b+jA-{0n#NIAEfY@gEThnNuQ7$7ij&Wp3^~;ycYn zAh7Z?~x>&Zmn!Am`=q|)?zB#1>X zP0*$>rj%25vr89g@q^G{FJ;Etzhjok@TM-}{35RCQnl?wcEENS2n37pkBvofsnnIJK zQ=J<|$oiB(qCTZ(*h1|xxK~lB0>X|#-8UjQa@@h*h^f|KRY_)&%(U++Y60R*`ZWQ zbZ%v6d3+x$5sA8#Bcnc@WAr}8u4E2mq1i#_z@FDO7LYc`-%W6xC6O_lm=$@P0Gpwd zf3L6sne}VT>~o#~w)}OO60$WBk6(4Hb~^rFAO4j8uMppr&tK18PhgMJ9698DVU}dI z`}p$pIAZBzQX9A8_%D&U6uNP#zRENKDuDW(R5-fG#@lE8O4}hXItoM9-LI?sY<<&5 z(W&BzFJ7m`RTy|sg-8cR=mrQsn-+{!A@{H@7dd$O62s|KmwU8>gshDBtH{`w{1L#L zLiK3sb)QSgoc#}I?pOJe^J<%dMQBV`=~BQS@2J~;cxul`jY-q&n((ZLM#J$vO{eDU zA~0Sgwy)Nidj^E7H*@jX$qc?KH~u!+142^UQnWjmcemLzezn47KwF~sU))?X7~Rn^ zlRqp0X7iAR_d_4YfHf#TJwi-FXRti=iBufsC0?8zN7Iz+N0n!y8*Uwzy;pc8`a>J9 z^EeAVHc9t@b8iO}yvdZa#R~*?bNz$9=*`~by zch$HJ9b`NLMTK5&W*TW<2+cHS=_gbvCj7xX#_zSPhB<6mq6P!^Z7o~C&`nmOJez7m zC4hA~veD>|WusT-4~u!0SaS}ddAka!ol@x|Uo-ve4ngp3$;C0h|`dj(HiX zogO&pLKNnY{cf>F{sgf3CelCw;wiQi5hz>Pm_tE<^-ui51f(gIv&ozl36QK;p;QxGKe_yLI)CBxnmFizS}hi ze)l!%^a&8Lz`kpIWcsdO;I}vBEXmI~Xd4@YL&|lFb~OAgW1Jupebd<{kMTogfv0lp zrt;-nt<1|sLq@1W?ZTh1o%!};^WO42?#qq!g?mbUkEWO^@Xg$Qfaxy)=!Fdv>|5?MVZCN%mf0_4K z?0c|R=bwKmLGjZ6iVyaD-9cSeZR3KXENRf4=}d-U_cDkuDLh?HbfTHJdf9Sqmhb37 z6YQE=M%C28N`<*0lBH3t{4KawgJ`>|-t<8>O-cF;|BVk(U8z)Eb@PZuiAOFsfK$LL z0QURgLwBM2mrV9-;kOxY0Mze=627{ayUGcthNZd8I+=88i8TW|Yy`!pM_ji03F^g_ z=S2(;X%#5z9YIn}ymR)ZwPEtzE?KO=-H`HUmP;trj#Uq8B>fAazSyy9FU?5-E{-ew z>TLSN`ynn>8ozbsYu{sD?Ccw}?`~}#pMguUHOS{xXm z@0zSb?8k}ccEXk;U*`rIXV`7EA<7apsmQ+Hb?X>9U7-5c8{NL&MVbx5s9R6TcR$;P z4GQ;hCQW@(zxui6kL)%ltg%VO?G*=8l$qhZBw&80I2?%$1n3rnfF-_=%W4TRH! z$QGWd>}PZH`L-Gt3YN#szj5SE=c$obnXj$e>GykZ5niyRU}wW0y!rBJ6wiNoW(m-- zP_20??wJ6R3+$->q#(y~bZ*UFK(S+|xAgVMt*bts?Rb%tCo zRdRmA)_wE!l~>RBh1|YbtSNko&3ylC`%9zdh2L7)nC~-<_1No%zcMe?jg^0?z4Ypf z+quxz(27spszz%vz4?Pa`4SJtm+Ta?cO%o9&gJh40ImviWOTLqid>Bwcp>!tbzHS8 zJ#VO{Ho#5t)tjY?buPhY<$LG)`ME2HUp}?dFs&UYJfQI;uH_tkAN?lv=Ci3f@296L zEWV|4gM|B5`t4p?*NhXDklm=T9Wwvx<=$HnX?vZ+62tWG6KkR~M!~mU-8AI2^LQqB zsus8^#4I=(>|+tr7pnEn}j$WfRE#z9#5uA?Nc;1L1L!)R|#eo$tq2kATW&`FcMqG*LFk!@u9A z+av|WO;%*AUJ~m{>{bdJ7^Tpgy01*$dt2<^M(PGUHSxTXbE@&`7lrW>_$X=d)p!PL ztuUslyNz+++k<#(lI`By#Lu1X42Z=sC^bl63t-q44jk&cEPTfzxh+qHCfXwoGOtOI)>$Q~|w|w`_^;`M_jKuHH>aOjroY$U@|LounDw|vQaN4;yJoT}O z!NbrW)wv(^Zy~;28vG03(HdzCzg%~0?An#HRCe=F^Zfo@kq2ozIit6ZIf%CkBOyG{ zmr9LYdtQjz2r7h`|5?JWON*D^IGL84gafe z2CvMxe$JHs3wTtHgo+1^oh{O3q;%77yn3=$(Az6;?#q?!9jlVwa}e8S(U(tOLU~u% zd0p-I8WE6pMteA1^0Yhq*v$tpzbSsx;|iFacVRJUV%e-A0@EPz^616pyGd_qg@Nur5b$sqp#B=a{43GbM9h^N&0fwo$0;c%PuxykB0%Jtm?& z3p@=!yMMO(HBsvIefmPzN&Izw+OJgCOO=Gx+7=St?nbhFP@aEt)7bkICbYNmW4K=` z?9fS|XR)!slspb)VCE6cgD>P^SIu-^{~^+0Fr%By4u8n$!BYa$*EbKyFZ-fOIT z6!++y+lyt!OAbzFvOgHH^A|Nn9coQmv=elh~@WkR|YMNNKh& zoy|9!@LNCCUk3cnI=IVZF}BKtHj|BHNJC1t=D(%WE`P*6k8~zz)m#p?Akllj-!dm zN8B+MSFCkwnRjBIr81qeY6Ib6$J!AET_f4Olr1 zEBjm}tYd|NNVJx;ke1f)0M0*EBX(oYjX>lx5<6gg_E+Ue1Rd6qZ^jq1*x0!hFxi zTKfHpTdmF0b<=Yth^=wIDV?L*z7K-v@!N8}p5Ggj0qdrB99oG@c6Dz<%9p42j7GlQ zpuw2JAdBnD>*$R@wk0}{ugj+^~+-a zlFrO=ufgG&fPk{!g?nb3A6oOYVXri64t-8WqL#ma-s``Mf4(k=`0aA{=fQ)7p_i$9 z5#o|Y6Mvo_#;R*u?a(=YjsNlcJ$0_&rjQ&opqlOEWwqO~2$`c@Ka0Ml+wHVvH$8Z% zZuse!J_Yp;D5d*$BktaE*CI|C{jq;Jvn4ilAhZcK+8zhalB!4QtSfXw8_)VE8}_I@ zWAyv}!?RdR_Ag*YY=FzHI=W8a`)ip)xd*Yp#m~-qr7y@DUyTlG9}%KVK0Nvvvb?U` ztMyysi&u|>_sxVopD5Y0AI$M-uNdy*W1<~Q8yMbdUkDF(T1zdr_2kR`@Q{%1S#vY! zS@VM+;ZkNZk1wJfun$X5V_Uy{xmEfk;igHz6%E4KrB_SeI(tdqr%fng9ikgSlgiV2 ztCI3`rs>=MD-MK_71Orqa;ul&-~$H{`S+3*=e}#XGt@kP^q)%m3yApbdV1=(*KqNc z`>#)1%s-n?qTrF{Ttw5oOJxfoVnPB^+k1@_J9@}-uuBq=6P80 z_LqRvBe_Fx?(Nt24SjqWoc}z#_dRuUwIZmo8K$xOrl2(yb$AQ2 zK7Vk__zD;#p4?%^-Du=piSNJJkf+Xc*S31$_%A@|ez$Vxi)KSB`?rd27(Rha#4&rS0WWM_>c zENku%yYqCDeL!Q)B3|tdH)7Ssp^XvTQ5aU(EjUlIekiptY#JXja8UJ49QC5f3Uqw# z`X*mB*#GjkAh)YuZ-3p=a=q%7E#Z%d-oowP{m+`^&2E=k+fU<_SI(K7ePYs@n=q8Z z_M!5BMn7S5;UQhQAwyVJY4Idy({=B5X|i6_m388{d08YH3$*Z|{miiC9?`^P)C@74 z(y>=cm_H>khtW(Bgre9n2oe)&qd}hF&xy?48sE%dgLi9>!?IQ4nk^rFX`M-;NNU_M z4+_pJqyHLb8c-Ge3rK1o(a#&H+U{}Ov3BLji0+ex$LqyGkFWu+X*~`p*C30LhFvL3 z;_Ys(^0Rj>BLk2Nl-Zg$_w50>z;~{$Z-o%5B`e@H>Rz+Nkb>I4kX*IXn^QbDZYI8i zz$fZ4oL3g&nBVlT(9ho7Uh^$JnB0zlL!%5oJwu)M|D@bz_lNbl)!@-da`tRw?fgVI zA;?ipTK%k#-G|1Ed$}5OHtUk=f7m+0^jx+A;$7>GD+%4AJ!@`>UDldi3{ibHc|^7y zO;P@3)#zG-+NzZPU7xhchj_h$lZ>bmHq$h#oq@6k{CNJpQEtJYKg2`+W#N-^qYdHb z%>_&evk@}U?%DJ|mkj!y?B<$#5BKu*>yl5oVPZ41qA(2$vBP`T90f)(+fjShthPHQ zR*HKvlMf89v=)k{|BUZH^WmOX+0R1!5BsBU4wa8886<2=t9s5W+MOx?3*c{`DZf|A zTOj@yFr~@R|9(gk9uk3)o2>r0@X7iD=KCchtu4_^!w&$$*|w{BZOhFI#i+gjXO~o0 z7oToH2fKyCyBdX?*xTZ1_ej4D45F9O(XMqK&zj_Y?EH`IDnlfD6y-TL*$zb{s`I|x z3<_Y1a=DcljS;!jxCf09`2o&dc9q+{Hog`Z-Mn%uyZC(0+tYS1ze(Vw&@vg8>yr!p zt_$-Y@(Z%-$f3-^YG*omI6N1?L{59~_ErwB}M=f0xu)iWb+Ue`o zf!LSees8imDtNHpbb_6>kDFEJabI&U*l1cV-Ztj^Blgqh=vls6YS?9hHm}fDYfw;~ z!kYQU!R=HP|w}Ux#)6vDiiak=IB{ur-T|e`8Jrgokwv7{YudO5ZsUZ zWUE0Zi>-;}d^|--xh8WhMHajLhtuUR;L`8nJ%hOmxID3M1v%emAS4%f>uULgNV?0& z!|$p6Rzap|sk_>rgZsnreqDS}IgfT;QH$EAA%6jq^IJLTwO_6N;Qs>X2Jgd4xN<|v zPAj2G5IcVaZ~O(=x*zNQvd(*SqsWLdHL$*FDY`CZXrQiRB!`pJZZeahALv z_e2U@K))zk+RCY$7q0AUnDvLtYmskT&gwe`pYD9LdBI-eof$)fr!ZrI(cMjLXhF{YbApxea1a3#H;kXkm&w%q9)7*EDP>rOxd0cAAy3`RcT$0t}^iqT3$*$=E$urF|;5~ z2tWx+yTcG^vN5gYbw5E24M2$8;YquDosmCL6)duB?gAjwlHV)50dHT9PEUKku{@f)uF&D zmzZk<-TQszumV|trwm)Sw1h~%!Hr|9qBnj}cJPs-(W%W>D(HL|b@`pKN)$)ep8I(| zy-1gNRcg(H9Zg<#(!DTpidQs&YGxyM^QFj=g{7pj9Kyx*4EZ2Vx^Z~5oNpf8%HOx> zB*39tv^_J=#}`70NvSkWt>aXT#Eo(FGeIN$j#=@EYLsEge8_tXsm27W@T5Yvy%d=T zE#1HlzbqVar4@%vY`IZVC(6>$_nkA0l3F}pUj9y80y{M(b1o>&9P~1k4@@;|i6Q(2 zkcuX?&-XKImbF?SV@d-IThl96^SSODZd)?+T6L>}?~Kj3*M^T#N7E2H?=9R6N2$7i zK(G68E|?g@u6n);(v9q#s(K5m;NAonVyD$C@9W`dlArMGfvg{DblX;hY;bSuVvMt< zI1oAw$2>hxWI8WT#DzA4CTp4IPKSZH&XKc10TD9S0D@fg39S7SPE7jyc#o;EUqiYi zl>=E84%P7SMzP%dgqzrzi9^JypJ-y{MRoK=oeo+ECA@l2~y|< z)GEJo$zCKaQhtsCQj1FJ;l=Oy<7gpwhAa@XK00w!x_;5P9LO4uEY^TDt> zrGBr~bXHk6Jp)14*HPuYuAcO0fMwcm3_;U(pU#_CY!A3>IL+{?Q86XS!)89fLsxzk zXlXb#`|!l)^T4P3R_9RY#5vg;)FW8^$1`804$ z;~;}63`y9|hleMz@Fd_g!zo?)2iM&8$+{#dhKHQfxlM{r5)1E5=bks1-Un|Heqdlm z2?|koZm42;8OFydgkw&TaDd_EHHQ9K*fs7Sozy}4u-b2mGBWampM#Dn=uk0v(h#YH z^C|{>|55wCHWKZVQeOrKE|OftrdS+!5-uhRg@{qH1A=)UX+YEekUTA;hR#^Zaib)g$V!TGwVq8a zu|kS!P#YaKu#@KIm>a9`4CqEJ1|8B4}iA$!u_V#;Mbql5jtq$Ec{bp7SkvKRHC@IY}$waqc5HuW@&a zQ~wnZCWAo|1PPMGcPevM%;&zf7;11>_~txr=+_l#bwgoh(+0ubWeg*Nnk9gP(CZCI z_0h`o!HovP&LO|`$ZM0`8j045E3erB^Slp1`SjFxrTQX|C(_~qssZI~TE#p^h80OYk7R#rN_q`8n;mqw*YKdY}WHosv%#Cu) zIx6Klui(}1?KsVz=!EXP-I@flPH9I>iXId8u)sRFfLaJqNLA+Pe0wMpKfne53y^{o z>H2IOl}Q%x#a2bsKY2U)-U9a}PlOK;(0oQ@K2V8%TC9cEjc|hyk7!Ihr-5^trL3I;^7GDj%Y^HZ2*m1qE2*{VxB?(yGCE`^w%=vrbFLi!~@Nlr=C! zH>`3iy`8p{i`dOv5IjT_>8ETNANTn3tW(R;TdPql->Vn1^WX`J6k!q*T)*~y%kg7F zq+8_I8|D)1%Q~e^>_12R=1VtjGb=&}dJ=y9dLP0{c^KB-nI zBzO1vWBun!9=F$VR(bfL&W1^$Y~Rt4J|eAWR)``z0Cwk%W@rd2*f_-uLb1C2>7f`W zHMpZFH0FL*NFX!c3I~pv&RGJ{wa>l!7XV1l!FKXSnk>a5S;n$wNS!>9gf))>5<5k! zZjY7CUa=d`sRmQ&A$Y@gur22>oo6jVOdQ(6EZ#wnaMAg)Q3F2IG?iNLfj;Og4_#3{ zveAGMnWEGUq;)evl=ko~2Xt3P2uVS}{})v%=QLc!2p$})Lt=~HG};!2c4CY+Y?y@U z+UTm}tEotl1cedvt3p2OG&X%l!AaUCm8VG{(ekTV(VuOqAlNw(>o@)wSnpz>NP$Oa zgMk5q#c6X#<>ycsO>Jd!cfh?Vah1da+D<`E(bW&21W=KWM_-6e!ReiZ=%HVu(dD2b zDowWJ9>W6x|}}GR+-q;$AYbryR-tDp|G#Y>%b@o<_B7;?h)eqGq4kO9+dy z0cMA%ZEYWR7D-kXBRnR{F|VaJWaTBrz*U<&xLnmvi(v_)D1{_ojG)jS1?X#K=-4-bDQQODbQ`%4ha^VWw7XyB9sZY z#EguJgHxd>Mbc(Rd80BOujp@WuL7Em1aN5fM6HcGBXa?WZRQR?Z~z0$#ZS1#k|noV zmnh1dVllBudd}V=(#k)uJspE&vm>YM^C$1k)1G4%j}{HOr6pCu-{9%WqAc8_F`fQJ z(UJX%e;^H5&;F|X#YOTC?wa`yzJ7It*3gMfR3njE!Hyq~mrLqTPl$98^I&I>kXY6P z$uKI@d?dZAJ<>w*qDIm+56nw#B@@`WyFAmCOtcDUble#PlB~nrR4#yY=vLvXOj8Cm z07HISw94z()AVVmxGcnZbOc_GCkl5wu4@M7Wtq;Fa&8hTLs^lS?0G3|4NQUQBNkkV zy;opSJT3X<2+C?o1q8Q;-DG{9z9Am~Mx>2uC2Yyw#}5UgP7^V~C4_z0Ebe^;UWn1s zzYEds#>*34Hi3lX>6X|7hb3l%D~0p4Dse*!utdRy*;Hwj9|$Xy(y$U&qNe2@JQ&f^ zRn9jz8lo$LdWtj@=sD?-oSV(bsfNSTne+M(s8?0))=9nfIr?E^7PFIy_`Z1!%jOh3 zR|EY}rqQsar@^xyGerfD=;uqT5SVa(DEL9JQ+)t7R9*p!2#{`JU#WaVgVQYoMONXU z23+1B83#4dr08H#4M$J1vb!ABWZ7DFM-^w=ta0c`v>mMCs7hx_$>2zW-8I$(S%g+msd2 z8gXs+ocftTbx5ABOjN0RFTdh)l{G*}Mh?OmNGo^R&w{|Y8%)Ab4JKUq;tE`mB3;NS z!KOmpWM*cGz*sG_q?6I$ZL4$OYIr8I0DqujsWLzZn>G(tpWDUqP=3(JZaj#NP2wZw zx~U!mc3!5$4g;$_Yozm8O$%U$aU{;QNaZk-+>*71;7q!KVw!tnzO`m>y`M?JqF4bE zi35JpQY{0pFaGwk#HxiDyk}|ymCL-=Xe7}v?4xp&C|Pn*1w=xpOV-3WIO;Me-UioZ zHP0(pvbxxoTLa;cENc1-FfZ?ef9sCd4ty%Uux?YA%pNFxwtiiMk3l6w=IwiVAh-W) zG=eDD?jsY=vWK0o7LG@0x_AQIW!Yay!nvDM4pi#r26y!}%nYp^cA?z44IjJKd4Xb$ zeB4a_;Tim3cHL6;6>(?il*oG2H1#~ZJ*`~hr`A%^_qlm)a5S}8!Eb6C&k%6<#|xEs z@tPuvS5QJRI6^k&PvQ3E9aU9HNt+AjCYv6gSx8uoFocM#KPM+hna8O$D+%|Qv*gwz z@}z*8VMV_@EU6fp7EIL>L$+~L+_4JN?exbj9@n3YZKdixlz}i*h==-+vnsYvADJ?n zk%Bz@#XFtO{S+uVjDrkJjh%50{~;ZaFxv7fO{_yT_QKhE5D&!PF^_X1tYbCkEu)IF zjUK-$L*W>A8P}fPEbU3Z>MU7hZb*i%tR>DP2{Dk!0iF~35p%z$1wYS+=5Wx^NhELJgE1MgNLurA7_M4VRMo5_G3kXe4(il+ki1Q#Qj6%t#q#^PcoSoPRD%lPwGdj~ z8Wwm~k`yVmxH6k{^CeF=KpR*-y=wudgbbFn_0j67ifRZpTo>@58#jqxuEmi%#gp1+^<8e`c~{^7C0h5z z+--93p$?!;Q3tP6F<#buaS|%V=-L)(1t{o;l-o#hCcPR1FFIS1_FlQ)^Y4PYbHSaM zoWLuZ2Hg%*2*$)XO;6e0#J)~Nn2YDad=(+S=-r57ODP=K0_;aCDJ=UPo_&}wHA$bZ z7Qp81K2_7rvUc4~oi&hZ{odyLdHu_}_qW_V!;HC?*ZSB}TtGC3wp_)*<~#G5u-|X% z?7!aYki8dDc%DNf>A2`X$2i4h-qyE;-vq$Gzy%+iW&Q;W?85c^0i>SLV*Y=^{};k5 zVfil?Y;c@+ja9X7qXfC=K6WlJW>R#Z_%}{(fNpeKgQ1@QkLF*1@`cb-UOGf};nx8d zX>K~y3Ix1;KZ7lD7O@o@=DTPq2bg!<5oZusoZjDDP|@r$QTJQcaRkz~GPqZB0q{A% zZ-#8d@*UQW%PTIreyvQl7_{fYuFVqrET@hwY$1d120CCRNLuMtAvtl2HD@-k)9*4c z6)##_j`1Y1FA^k#vQDN+(`p65{qn1r`rt|>h`x!_{IjYBIPhBdyyMStezddb5?Yg+ zaPev8-cOak0Q=9{-;}lKmx3m^HHI#+xD|9>h*>#|FZjl1=mU$9_@AH=h(o(&{LgPQsCXDK(c6r}lP zg(()d2lpMJviG9~7xoNW^!-|q98NwiqDJ;3gwqCG%#n(zRf!9^EVu*>Uoi(;w=~_@ z6{tcmL*z$QN(*9OZPLp7-|}l5l?i;n^6J;Dfj|3KV(;*r7`00lUe=yUYKL#R5RPI^ zCH#2~TA9q(1ad=)u9T7s;GLr%7M4lGPNX!iS7lM+HOxm-biM*5wK*rViOeag zY|rH&8rB1fkTAJiD!(Jk82B0pC@SkcnyRy5OkNB##Mc+t-r++p4mH-Yhp8BZ;fnmC zhdETOxaZ2Eu6UVT>?l6QjRs;x zrzF=Lovch5_;HIf-v<3H1al+m3rnNeXz6dkSPV9A)pM}WxBJ`#BmbM2!qQ~6Aioa$ zMf`MWKRUs#frqThv`Jzu&C$zA=C>xMU7a%eJjlWd|J?^~y@;&`0<$=JF1{wImcpS& zt9h$4lQinAKdK0!k32BQ`ntVMSoP6kQfNupp|ST-LU3 z+?vR$vR&tUiv`Y*-bTJxPvRi3YLfds_6OJ>ebSn|lLPjrE(!tY{ejDTaiqH}%t{au zyLiDXLRSPG)@@HQ>FW}0fDjtSO;nPC3(%}KQ`o!QBHAUHdj`PnnDSx=+uEGwv~FvA z;jS(82{0Tt+U!zhzPbbd3qXJD146D>RX!In2xWsur`&Z#EGPsXa#D-cuR;}4(L7`x zHomsOENv;L;*SstPABjr6K9uvPvDqVOU=1v(MZuaQ6lKe;iL+f%V`(?IOs>%2rXAM z%%$zfeqQn6>UWCLN{G#T$TZi+sBgX?z$Z13XJ7;M$mUkPkrfcxau~x4pDRexC|Q{; z;m<{Kb;Gc|jpkQ~+U5_0=T6hpA<%;>bCUHL0AKE~N&&Hcf&u2w^X1%R_IzDLEv_$W zG9yw+p`29_6PYdfX%pM~sI&eTl}^xwI&pCOucrTJO_QC>gx1tXZ$m7)oo~Lqs!A%) z?iFK1OK1NYiEeA!H9t?#;g*xc=5Vxyrc?|FI5(TlhX%w%jhP8pJIpm|HIyohub(Gs zT7-a4&1x1EK@(S~3OJo$P(Qx`G>I)?Ae_oiNFS0ZBrKX)=U}+Tr9DRYUbegN@xrkk zk~!%;cWk%`+cgh?k;gmOogjhKD#N%)1;Z+#0#Z3dk{LmTawlqVCb`yZNPNv5M6<5u z+D(?%d1}e1DOyFnQ}4#52^Ygc9l7bB+S7{9c3y6qBtf0pT1}(gmq~70I(o4BD|hA_ zGN?oigVOY&DF;Zp7k<-vg_03+)~#Z^?f2*&4x3&mVx|3*HOgG%4l_>t^AB#SAQ2=f z{8#}poK{ljlOHRuZwf1CBgBOkt&JfsMrCL4JIQSxvjSe0anJHnvb?#PnFt7{HZhW3 z2^<{2f?#*AQY#f|y{~jUpOvOS1W_NJ3diO<0p_M+yJLs5sKIhMM(k1!g2Qn)HHmSpCloRM@?$Gk=jz$Rm@tC|C(m@S5gm$HI{KT@d5jyMps&(6($7fvTgqZ| zqJWHgpAp+b*XVe?z~0xOw~Pta9D~sP_fF}qrkwiDT$544WSj zQ01iobDG-S(}#$L$XQlzH>fa;*4^8F_EyN~dx>BEj24;CzMr^D1ilL;unBv;wh-ZS z+`59ZWQyLX#0{_31%qj>1vXd!f_dYJ=JciAkM%h){Wy1YMQjNr7?&1%f*}Cmk1V>ap>e3F-J(R0bY7AF`q7L3Pjq$Wq>b+>T$VwOfpcok7g!dHW8RhLQ;L@BkjfxMMwd(Cc4JJ#j ziPjNK=pC^jWp@TC1a2s$66dFtuxcfDZq|l-1rWF;rfgas7@$7-Ha?G0rqr5aD3DPf z(GJt9KWz_LOe4;Sbn)$KT871h4z#CM9q4kqmWCjBC|n2K7To&$21&uG)mn{6A>4k# zaz#sSLca4N$+)ZiP-1^k?OnXWDAEiSVe}{tU|Z65(B@!f%pa382)?jH-+9;yx zI&0nwOZaXdp5}TEJg+4NrY}T=Zi*qJBvn9LgjLM+mP}zePa^m*hW$2jw}3=ZiV3t{ zad>BTPIL8Kdi{Z?NtgPA)6^|}Nc?+O4%8?oadr)NIjr-Ime*(D;-*48gQmbA>Z=Ev z(XCAS81jzr?v?X{gA6tD3mD3<3nVJVmGNa~$Q4lH)WNVLU6?G!ccWxhNc}GW8I_^0 z8zUeveMV%$4SQJWUH2P&3RD*)JZJ9bN!s!!naqY65&Q%&qK}z~D{hEN=R8#zM~W(n z9m4|&@&w7C0)r))+my+t$VpCnt4*S;N!$w2lU3W}HNA&V^#;F_eWZ7bN$jz07iY8X zjY)$kDhacE$|b4zf-1Z~$Z;mFO?CT>$Sk`9IM%6Ul_6SchY|yT8WeQ~i%b?u6ET9g ztVr&bwYj6Gj_FZ>d}+#`)vTQ2$eRmALMvn?;SAi^ZPsYwxOrE4Bq@uokWrH*xQV-Y z$On>I2~N7>?z1EiU;=7B~gyFN|Suvh;wU&3F2?qRH{w=*~(hS#`kOoR8~ z7Emi+EQdO;1cS-rdO=M{p5y157D|zc1h_IQuqaRyZ}`!x9J85kSf96u=v*OM163dR zTiW|WHkyGgD^Z))7L+s*?(|$}g<-0Z0lW1>jt*5u#<==TaS412Ne!GcZ!psydE!T1e6q6W^rtaP4r3v=9TtCC)hvxrGdUOANN z6{|8tQ<()qiU)-9=lNI$h#i~_+_ym$7w`Wr7EZEsc$5L%7NcYcrDti{03>?jpx?;VVp01-N4{H=^0^i!D;|JoIj&goN z=SHkSiV!A|;$Q*-%satVmZaBtNd^ki_D?tWl`JB)lgazInb|a{cRo~T1JeCo=WH5a z8P2k-K=``!P?_IQm8VaP%BH`%Weo-US;*x!kxvV#q~%QwnBxOdoato=qwN{V-~1N2 z)4%4=^6@R9E>358^sV%p_(IBAR9hS&A+Z+(J8j5WsxkMY_Nx~ohwg^Vffgg_Gna1* zJh}Nrz-jE)2tq|+ip4Q-+cf4-V_t-Wg}8%%6E8+hY4%)1jXa0}<$P-IL@GZOT5oxAT;Rtgq};C&xV*(B)I^>t38GgcKe zupNQwT~Lh2PgF(&j)q99T?}PC`i_Ct_Q`NQrlt$6mJ`Y!fvLPZ0@or-V*xw4z;0~C zX-I=bfmevsl1K~GurM>)3RMK3drLp-)Uxbn1D*$ngE&Mh)?{4P@6?Nb9u19@iHwquB1rl>!2m8j#d9-?H? z3hdCKq23TwYhFtlgklz1y@|T;Vx#EcspJ_48-<^_>O=C*2wUu-zD19g5lg;CQmWmM z#vc-U%AlZhRF-cTd&f0K(}fJPFzl1jm`;FY=ci1C6!8m`!nPbHH~|c0rZW+>8cKH2 z0woFpWb?~`ixEwu7~?s54kH&E7)6F%<*XU|V_2te>ZHNSET<%JTmED! z+m+8~72_tE)5(#yIm~1rsxYn_QA-FI`W)kklaYufERvIr&Z}wiF)qR*t<8ZQ%A?k& z9;^c_q*ib(l^kR?fjhjch9hB&n7Tf}$=Xw5ZW@-2b4Rn0yHxRh&9%_%z5skZNOYbn zM8qJ(`n<|#P433vK^rUwRyw?D@e>5cj7(31OjkUfG$2Lp`ZHEO=UU^AXh68+t;#8^ zNriZY51++Q!vM5PDc?oQ&#M7K9*4eIP9M|JI~Ge~_?3kb6(|c+LhP|HNZ>Q76`8nm zc$1pa~f8ScI6t}z@xbQ{WPXl27L`ahk!t^pQVHO zakDEReeL>RKq#o8N`$xGlT*{GzO8T_h_6#Ygfah+<*`EzhpcOPk&_(*ex=_`Az1~G z4JqSHGz_QmCl0*Pp5Yz=u3LWA%_rc9-3F~FUTYv|4h9vjGMIu61~Jwq#3dQ-(TpAt zR~k>ZmHn3cbj{0lxO=lzWm6#3Ln$7Z%aFI){i6N6x>x)~{Cjr}1p6GLA*Qog!QA(- zoQVYqt<1S>kPEs=eu)ezM-4YV!% z8(uProvNSk1_g&$KT?V@m;lcc_W45Kht#ZqsJ%q7aYplNVoiLww!@g`W>uWb zq%4TN8qJ4D7RR4f+LT<*_1l($0XwITXxD=IOmn*>X}T{iPO|FFuHJ!J9M{2gd@qdO>nS4$>zXFo#r>O6Wa$*Es*WJg*cU_X+yHmJqIl-pK<+-No59X``4 zlV{|TI$hcVS4nwn4p>0!zQ=K>M@_>#lTG$B*wdi+^df3UvRafFqsnbaGg`4x?ikC5 zz>r;1pm=_s6mfxM$;!eh(ca@28V3(uKOwt63QUDYEVgs%^Q!iH0`Rknmi7x|ZkVgw zH0t4|3gau&?q)7>?ECb^gCwprGG zCk@^j!!sY{ph^h|kY#aB0YnejOr?vLKyikYG|f2xP$-7swqi+RX)>jsgB~D7myhAS z3YQ1?;Ta|qH%+Ljz6yKhCh$)O;~>A#iPj4*7vO5hA+zc*6jTrp%6kevufWyy)F;r* zO!DVQ$NmH7R>l@5g;sFma>+g`K`T1dMql-?yg6`b5~dm=Kn>+CxrQ3Pr;)A<%@{;) zX^^{^1)IebYpCv8ThrzBJDH~)>i49jF;NT#sqY!vk4+&d*ZF{Ct+ZGi`9Lz`j|cC+ z@2)gBOFN_j&2opHGU+nsCnYu*;~^xC4~rHM#o;L#uH$BNuM#XBC}i?DQ2kVv4lggz zqfay;z@0mcb2!&msgK$i2xl!H}3aZe7DF`*{e>JKAI8N`2Bkb%Y zhi~|^v=|`88I|MZ@wO=Y&=_%q`Q1rlT_Shw%f28*1NO8S_Rc3WIhWG`DO>%_cs?R0 zK21HH-=Et&29)?K6HOtDCg@Z@wVvpa>ROP_8%RcTNXp&e0W&s9U{b9*fYM@J(5|M(m&7qQWBS-w>tnKU@vW z*3jVf8(BoMiMzw$@<7g?bT%*%$xJ7bZf4Gi#d1GPEqs$tV{ENH#NDD?zSUUX{SD#vpFBxP>}q?u#>CgZ9%N z2T_JVE#l0eH{apuE2&{H68iuH16#2+6;=|7aRmey4-U2Ha0Bl|LE2^L?o5X|Fsh)W zZQ^p|oN!vKj-(*nD()uux1SDgnxjgJF6}SC_>C4`hlTT;Le#v%5AgwTn9_-LXGJIo z>eZVtcK8RcLq#;~6}*@KW=!5;)?uZaJ=N^xnOzP~i;03Ul|7~D?kvY3xgWE7Wm(HZhb4ReBB#xb{V+suhPZhyaIn=l z0R;ci1B?Fq3DD^W1ld)TL;+3?;K|9RM}k96uBz;=K5`!3L;wKH?cwT813EW*BYCu#$IPkiyciMUPtf3Wah zkP{{%*u&G=<3BX#+x`K*{{K8C`u=m&*T>aGj+K?*6y)jtUwC8J&;V9e1cJ+kh`{;# z`v$|*5FVcH9^NNsAcE-c8szDFI{gwvMufD1-{r-83-q8miFU?KRliYlArR}_;B5hMT zeNt+dsw;iN@Qno=SaLLS#(VYA#aBnvI9*_sQF(XmvRRwQwP6pbl{bF)KC@P?oMo`; zbWxVxs8Rgd?*6sx9wDo=s-=hOZ)N3_mkd$s3@)A2E(5NsHjj`Tvus|u2rv&| z5Qep?_Zf&spYV}t9(`Q?-LG=(7Z2jcks1t`2zh1f)I=|s1#k_xm$R61BFN|)V-Y;4 z(5vDBeq?bd=kpw3DA({>p)DMY+zhqgbd^2eFA>%0YmHsfy`wQ4ad}3x&H&W7I!nz1 z{K#5T1>h$ZU7npQUrnM1KWLBi$+yN?lQ(C5Tw5+Av~vh1GW8&3;5@us5YlPo==wS? z5|2T(f{QK#<&*IAe@aIA7R8>$zKPoZxZRDft!<%n@usMp5bs4@q0l{O2d z^NNfzQy$r)4DuBYpOR=gJ7UcQz&h$31JD-r$8jicdf((2kDq?(z4FtGO&1izsGyaa&lNX1I=W`~f;e<9s zVKvf!UAiSzoLoL1!|5}4j@0D7vK$>S!W6R3|swLRWb}1&%bh z!x!u^sHg=(3ja!bBj({jbQ`|e=*k;|H2mt(qepd&W4Z$mPUnn6QMRej23DG$E`N3z zo_>5Rp>BUv_pfgNlL^raN^a)Y(0X$M&2at^@^i9o0oj&TH#|Dq}D_hka8-fb88>F zfV#f4Ac`1)k-$h==>34;kpz>vQpX0q_seb=CUUp<_s-qo$4@`R=dTlXYDtosp2)Zz znSXuy8+`u!VQPlKB`j2kR!rA{x_o{-x;#~S2@GY%h2$k3Ul<<{wGd*5XKX@CVxNyM zFO5Tv&FaUj3WlO=BH#h>;-1ryrtIO5+F5lYm%ek9#fQQ<%h`$n39i%Lu`V4 z%aV&1qd_-p$u>TnKkcr}C_bDUw|NuP!}=?lFdTuEa|TJ2cw^ibz2s?@&rI_4#r{S# zIkxw^q5eZfpXX+dJMA_Mdm_W$6$M(K9?;NPyp$mB$VlK(FzopI@wxirqv2Owl?T=B zSU+Al4aX-}n*K!otE<_gq?M;CT{NUIY zCQqS!56fHG&*v4w^Enf8EjhI(`HjZmL&<>#6V!39%EMtbgEKjQIDa<4gCH{uwXB;R zxE)8@eYcIsomcOCk;UW6t1tDI|4cXaVjk=+w5Hlw+`_augw%l_4$Pr`{vGN-cMkQk z@s4DOFhO10j*y({xeTBN@?0dghSiB1M^ep1Dzff8n*?M`J1&Cu+o}NJt~YNM!ur=_ z!c}FLz+&ZvXb~r0O&0+KpB3r^joT!$HIuSif%&1>rph`BL zmH9j_I?2$5bx$PB8!KY_xSn0@uV_xSzeJwztf^;Q42_ViuPbhC`8m8UuZyV05`vxA zGVY3?YwKyR_d`5CokPI3O;Q7l?%*r3|3HxSLbKzmfG5-}P{z@j=&37-OucBy=0_Oe zVy93S4_QvwH!22kbmq5h$u=Q|_p-2=fyLpMl8nHMJ(IqUCcTPp#o@l5m+>CIaP`C( z9VsqnxbuqDY$s4r@wnDL$JM+kRaSkwb6LYXDSzR9b~mH3_R+!7*u)r_j(N7+=zl;j zvABpA$09fw%P7d-osG#Iba1`BMOH;qoDR*$NL?&^K-SLDd<=WkHfH-7g4Ch|bFy(T zRSddkGd>tMb25KtP&R1FYda}B6Qp#`B$UW=3x~xJiI){8s_2F1u$B3=J0?4FL_(kc~t9+Bq_Aiy^ud>M}+6E|dIf!3ZpP5p7O*XoR+>xevllOPCt_zEx)Rw!Lo&D~E-_D4w6Upt2t+_}y=F61{W-hvAC_V#dte}J44I6)hWuB zyp`1M)F_}r9G$jKpk3SJBVVUrh^M?~$&5zsH+Su%R~DN$b{+&bbWXwXpjakFOz4lZ z0X+dH)yS6zshOE&=ttXRN>_VMQWjTcThYsND7h8C1L@M3)~G6DwQl{0tNC2Jc6VRd z8JIDfBO#y@#-16E(@x@sOcY^6@ZdYAb+l?3Cn8L>mS=isTnR79Ff>}GwPCsW$x5Ls z`05$kOldP@qbBrD;MbYjsoRWY?cN~WPVl-Y{a;6T;#?+`O!4}H?g(q4$UWNZKz)Zc z(R!?CSIMG{eMWqQVY_d!d9(Qsq9wSm2YXE4hTZyzyA|Eyac626 z>D&vZUYCXX1~`?W6KJ1N4x&vmK-x{VkJCkF;99xbNFdOQN`SXPNC6r0IUv^SofuzQ zxe|~C8Nv<&;<2Q*iLsQT)v5b~aWe(HSAJ|qft~bdW`RURpQ%7oggIp*2o|dV^Jdyo zfPomdvp5nQyy}buyWIMHK}3=Zp4KzL!6?oI4Q;Fn=~rXigi2!rA;%GBsLO7D3x_xj zVJjAoF#4r&;o0?Z!~@kf)2}X5z29RpHB8!nzp6ifE5BcScYJwu{@rJveU|(m{{0tm Cyu70T diff --git a/config/rootfiles/common/grub b/config/rootfiles/common/grub index 597bbdcbe..2c62e20d0 100644 --- a/config/rootfiles/common/grub +++ b/config/rootfiles/common/grub @@ -3,7 +3,6 @@ boot/grub/default boot/grub/grub.conf boot/grub/grubbatch boot/grub/ipfire.xpm.gz -boot/grub/message boot/grub/stage1 boot/grub/stage2 #usr/bin/mbchk diff --git a/doc/packages-list.txt b/doc/packages-list.txt index a90f58711..f245a4f9a 100644 --- a/doc/packages-list.txt +++ b/doc/packages-list.txt @@ -107,7 +107,6 @@ * httpd-2.2.2 * hwdata * iana-etc-2.10 -* ibod-1.4 * icecast-2.3.1 * ices-2.0.1 * iftop-0.17 diff --git a/html/cgi-bin/remote.cgi b/html/cgi-bin/remote.cgi index 90ce3060f..3b5916d99 100644 --- a/html/cgi-bin/remote.cgi +++ b/html/cgi-bin/remote.cgi @@ -141,9 +141,10 @@ print <$Lang::tr{'ssh keys'} -
-
-
+
+ + + END diff --git a/langs/de/install/lang_de.c b/langs/de/install/lang_de.c index 56379792a..a24110084 100644 --- a/langs/de/install/lang_de.c +++ b/langs/de/install/lang_de.c @@ -29,13 +29,21 @@ char *de_tr[] = { +/* TR_ISDN */ +"ISDN", +/* TR_ERROR_PROBING_ISDN */ +"Konnte ISDN Scan nicht durchführen.", +/* TR_PROBING_ISDN */ +"Suche und konfiguriere ISDN Geräte.", +/* TR_MISSING_GREEN_IP */ +"Fehlende IP auf der grünen Schnittstelle!", /* TR_CHOOSE_FILESYSTEM */ "Bitte wählen Sie ihr Dateisystem aus:", /* TR_NOT_ENOUGH_INTERFACES */ "Nicht genügend Netzwerkkarten für diese Auswahl gefunden.\n\nBenötigt: %d - Gefunden: %d\n", /* TR_INTERFACE_CHANGE */ "Bitte wählen Sie das Interface aus das geändert werden soll.\n\n", -/* TR_METCARD_COLOR */ +/* TR_NETCARD_COLOR */ "Zugewiesene Karten", /* TR_REMOVE */ "Entfernen", @@ -52,7 +60,7 @@ char *de_tr[] = { /* TR_ERROR_INTERFACES */ "Es wurden leider keine freien Netzwerkkarten für die Schnittstelle in ihrem System gefunden.", /* TR_REMOVE_CARD */ -"Soll die Zuordnung der folgende Netzwerkkarte entfernt werden?", +"Soll die Zuordnung der folgende Netzwerkkarte entfernt werden? - %s", /* TR_JOURNAL_ERROR */ "Konnte das Journal nicht erstelle, verwende ext2 Fallback.", /* TR_FILESYSTEM */ diff --git a/langs/en/install/lang_en.c b/langs/en/install/lang_en.c index bb76aae4c..f4c7311ee 100644 --- a/langs/en/install/lang_en.c +++ b/langs/en/install/lang_en.c @@ -25,13 +25,21 @@ char *en_tr[] = { +/* TR_ISDN */ +"ISDN", +/* TR_ERROR_PROBING_ISDN */ +"Unable to scan for ISDN devices.", +/* TR_PROBING_ISDN */ +"Scanning and configuring ISDN devices.", +/* TR_MISSING_GREEN_IP */ +"Missing Green IP!", /* TR_CHOOSE_FILESYSTEM */ "Please choose your filesystem:", /* TR_NOT_ENOUGH_INTERFACES */ "Not enough netcards for your choice.\n\nNeeded: %d - Available: %d\n", /* TR_INTERFACE_CHANGE */ "Please choose the interface you wish to change.\n\n", -/* TR_METCARD_COLOR */ +/* TR_NETCARD_COLOR */ "Assigned Cards", /* TR_REMOVE */ "Remove", @@ -48,7 +56,7 @@ char *en_tr[] = { /* TR_ERROR_INTERFACES */ "There are no free interfaces on your system.", /* TR_REMOVE_CARD */ -"Should the allocation for the networkcard be deleted?", +"Should the allocation for the networkcard be deleted? - %s", /* TR_JOURNAL_ERROR */ "Could not create the journal, using fallback to ext2.", /* TR_FILESYSTEM */ diff --git a/lfs/grub b/lfs/grub index 9f1130f10..f60c3b4f4 100644 --- a/lfs/grub +++ b/lfs/grub @@ -74,10 +74,7 @@ $(subst %,%_MD5,$(objects)) : $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects)) @$(PREBUILD) @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE) - - # This fails, but doesn't matter - -cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.97-disk_geometry-1.patch - cd $(DIR_APP) && patch -Np0 < $(DIR_SRC)/src/patches/grub-gfxmenu-v8.diff + cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.97-disk_geometry-1.patch cd $(DIR_APP) && perl -pi -e 's,/usr/lib/grub/i386-pc,/usr/share/grub/i386-pc,' docs/grub.texi cd $(DIR_APP) && sed -i 's/AM_INIT_AUTOMAKE/&\nAM_PROG_AS/' configure.ac diff --git a/src/install+setup/install/main.c b/src/install+setup/install/main.c index bbda982cf..4d9538ad2 100644 --- a/src/install+setup/install/main.c +++ b/src/install+setup/install/main.c @@ -142,28 +142,27 @@ int main(int argc, char *argv[]) { fprintf(flog, "Couldn't open commandline: /proc/cmdline\n"); } else { - mysystem("/sbin/modprobe ide-generic"); - mysystem("/sbin/modprobe generic"); - mysystem("/sbin/modprobe ide-cd"); - mysystem("/sbin/modprobe ide-disk"); - mysystem("/sbin/modprobe sd_mod"); - mysystem("/sbin/modprobe sr_mod"); - mysystem("/sbin/modprobe usb-storage"); - fgets(line, STRING_SIZE, cmdfile); // check if we have to make an unattended install if (strstr (line, "unattended") != NULL) { unattended = 1; - } - mysystem("/sbin/modprobe iso9660"); // CDROM - mysystem("/sbin/modprobe ext2"); // Boot patition - mysystem("/sbin/modprobe vfat"); // USB key + runcommandwithstatus("/bin/sleep 10", "WARNING: Unattended installation will start in 10 seconds..."); + } } - - if (unattended) { - runcommandwithstatus("/bin/sleep 10", "WARNING: Unattended installation will start in 10 seconds..."); - } + + mysystem("/sbin/modprobe ide-generic"); + mysystem("/sbin/modprobe generic"); + mysystem("/sbin/modprobe ide-cd"); + mysystem("/sbin/modprobe ide-disk"); + mysystem("/sbin/modprobe sd_mod"); + mysystem("/sbin/modprobe sr_mod"); + mysystem("/sbin/modprobe usb-storage"); + mysystem("/sbin/modprobe usbhid"); + + mysystem("/sbin/modprobe iso9660"); // CDROM + mysystem("/sbin/modprobe ext2"); // Boot patition + mysystem("/sbin/modprobe vfat"); // USB key /* German is the default */ for (choice = 0; langnames[choice]; choice++) @@ -181,7 +180,6 @@ int main(int argc, char *argv[]) ctr = langtrs[choice]; strcpy(shortlangname, shortlangnames[choice]); - fprintf(flog, "Selected language: %s\n", shortlangname); newtDrawRootText(14, 0, NAME " " VERSION " - " SLOGAN ); newtPushHelpLine(ctr[TR_HELPLINE]); diff --git a/src/install+setup/install/probehw.sh b/src/install+setup/install/probehw.sh index b56cde02b..ff4320aff 100644 --- a/src/install+setup/install/probehw.sh +++ b/src/install+setup/install/probehw.sh @@ -6,6 +6,8 @@ for MODULE in $(kudzu -qps -t 30 | grep driver: | cut -d ' ' -f 2 | sort | uniq [ "${MODULE}" = "ignore" ]; then continue fi + MODULE=$(basename $(find /lib/modules -name $(echo $MODULE | sed -e 's/[_-]/*/g')* ) | cut -d. -f1 | head -1) + if grep -Eqe "^${MODULE} " /proc/modules; then continue fi diff --git a/src/install+setup/libsmooth/netstuff.c b/src/install+setup/libsmooth/netstuff.c index dd17bf68c..cecfb2009 100644 --- a/src/install+setup/libsmooth/netstuff.c +++ b/src/install+setup/libsmooth/netstuff.c @@ -335,37 +335,6 @@ int probecards(char *driver, char *driveroptions ) return 0; } -/* ### alter strupper ### -char *strupper(char *s) -{ - int n; - for (n=0;s[n];n++) s[n]=toupper(s[n]); - return s; -} -*/ - -/* neuer StringUpper, wird zur Zeit nicht benutzt da UTF-8 nicht geht. -void strupper(unsigned char *string) -{ - unsigned char *str; - for (str = string; *str != '\0'; str++) - if (!(*str & 0x80) && islower(*str)) - *str = toupper(*str); -} -*/ - -/* int ismacaddr(char *ismac) -{ - char *a; - fprintf(flog,"Check is MAC true\n"); // #### Debug #### - for (a = ismac; *a; a++) { - sprintf(flog,"%c\n", *a); // #### Debug #### - if (*a != ':' && !isxdigit(*a)) return 0; // is int != ':' or not hexdigit then exit - } - return 1; -} -*/ - int get_knic(int card) //returns "0" for zero cards or error and "1" card is found. { struct keyvalue *kv = initkeyvalues(); @@ -412,13 +381,13 @@ int init_knics(void) return found; } -int fmt_exists(const char *fname) { /* Check it's any File or Directory */ +int fmt_exists(const char *fname) { /* Check if it is any file or directory */ struct stat st; if (stat(fname, &st) == -1) return 0; else return 1; } -int is_interface_up(char *card) { /* Check is interface UP */ +int is_interface_up(char *card) { /* Check if the interface is UP */ char temp[STRING_SIZE]; sprintf(temp,"ip link show dev %s | grep -q UP", card); @@ -433,7 +402,6 @@ int rename_device(char *old_name, char *new_name) { fprintf(flog,"Device not found: %s\n",old_name); return 0; } -// fprintf(flog,"NIC: %s wurde in %s umbenannt.\n", old_name, new_name); // #### Debug #### sprintf(temp,"/sbin/ip link set dev %s name %s",old_name ,new_name ); mysystem(temp); @@ -442,7 +410,6 @@ int rename_device(char *old_name, char *new_name) { char g_temp[STRING_SIZE]=""; char* readmac(char *card) { -// fprintf(flog,"Enter readmac... NIC: %s\n", card); // #### Debug #### FILE *fp; char temp[STRING_SIZE], mac[20]; @@ -459,8 +426,6 @@ char* readmac(char *card) { } char* find_nic4mac(char *findmac) { - fprintf(flog,"Enter find_name4nic... Search for %s\n", findmac); // #### Debug #### - DIR *dir; struct dirent *dirzeiger; char temp[STRING_SIZE], temp2[STRING_SIZE]; @@ -476,7 +441,6 @@ char* find_nic4mac(char *findmac) { sprintf(temp2, "%s", readmac((*dirzeiger).d_name) ); if (strcmp(findmac, temp2) == 0) { sprintf(temp,"%s", (*dirzeiger).d_name); -// fprintf(flog,"MAC: %s is NIC: %s\n", findmac, temp); // #### Debug #### break; } } @@ -507,43 +471,27 @@ int rename_nics(void) { int fnics = scan_network_cards(); char nic2find[STRING_SIZE], temp[STRING_SIZE]; - fprintf(flog,"Renaming Nics\n"); // #### Debug #### - for(i=0; i<4; i++) - if (strcmp(knics[i].macaddr, "")) // Wird das Interface benutzt ? + if (strcmp(knics[i].macaddr, "")) for(j=0; j %s\n", temp); // #### Debug #### - if(fmt_exists(temp)) { // Ist der Name schon in Benutzung ? -// fprintf(flog,"is exists %s\n", nic2find); // #### Debug #### - for(k=0; k kcount) { @@ -673,12 +609,10 @@ int nicmenu(int colour) for (j=0 ; j <= kcount ; j++) { if (strcmp(nics[ i ].macaddr, knics[ j ].macaddr) == 0 ) { nic_in_use = 1; - fprintf(flog,"NIC \"%s\" is in use.\n", nics[ i ].macaddr); // #### Debug #### break; } } if (!(nic_in_use)) { - fprintf(flog,"NIC \"%s\" is free.\n", nics[ i ].macaddr); // #### Debug #### if ( strlen(nics[i].description) < 55 ) sprintf(MenuInhalt[mcount], "%.*s", strlen(nics[i].description)-2, nics[i].description+1); else { @@ -700,17 +634,12 @@ int nicmenu(int colour) pMenuInhalt[mcount] = NULL; -// sprintf(message, "Es wurde(n) %d freie Netzwerkkarte(n) in Ihrem System gefunden.\nBitte waehlen Sie im naechsten Dialog eine davon aus.\n", count); -// newtWinMessage("NetcardMenu", ctr[TR_OK], message); - sprintf(message, ctr[TR_CHOOSE_NETCARD], ucolourcard[colour]); rc = newtWinMenu( ctr[TR_NETCARDMENU2], message, 50, 5, 5, 6, pMenuInhalt, &choise, ctr[TR_OK], ctr[TR_SELECT], ctr[TR_CANCEL], NULL); if ( rc == 0 || rc == 1) { write_configs_netudev(found_NIC_as_Card[choise], colour); - } else if (rc == 2) { -// manualdriver("pcnet32",""); - } + } return 0; } else { // We have to add here that you can manually add a device @@ -747,7 +676,6 @@ int clear_card_entry(int card) writekeyvalues(kv, CONFIG_ROOT "/ethernet/settings"); freekeyvalues(kv); - fprintf(flog,"Card \"%s\" cleared\n",ucolourcard[card]); // #### Debug #### return 0; } @@ -756,19 +684,11 @@ int ask_clear_card_entry(int card) char message[STRING_SIZE]; int rc; - sprintf(message, ctr[TR_REMOVE_CARD] "%s \n", ucolourcard[card]); + sprintf(message, ctr[TR_REMOVE_CARD], ucolourcard[card]); rc = newtWinChoice(ctr[TR_WARNING], ctr[TR_OK], ctr[TR_CANCEL], message); if ( rc = 0 || rc == 1) { clear_card_entry(card); -// sprintf(temp1, "%s_DEV", ucolour); -// sprintf(temp2, "%s_MACADDR", ucolour); -// replacekeyvalue(kv, temp1, ""); -// replacekeyvalue(kv, temp2, ""); -// sprintf(temp1, "%s_DESCRIPTION", ucolour); -// replacekeyvalue(kv, temp1, ""); - -// writekeyvalues(kv, CONFIG_ROOT "/ethernet/settings"); } else return 1; return 0; diff --git a/src/install+setup/setup/main.c b/src/install+setup/setup/main.c index 3fc800e13..0595468ac 100644 --- a/src/install+setup/setup/main.c +++ b/src/install+setup/setup/main.c @@ -95,9 +95,10 @@ int main(int argc, char *argv[]) sections[2] = ctr[TR_HOSTNAME]; sections[3] = ctr[TR_DOMAINNAME]; sections[4] = ctr[TR_NETWORKING]; - sections[5] = ctr[TR_ROOT_PASSWORD]; - sections[6] = ctr[TR_ADMIN_PASSWORD]; - sections[7] = NULL; + sections[5] = ctr[TR_ISDN]; + sections[6] = ctr[TR_ROOT_PASSWORD]; + sections[7] = ctr[TR_ADMIN_PASSWORD]; + sections[8] = NULL; newtInit(); newtCls(); @@ -147,12 +148,16 @@ int main(int argc, char *argv[]) case 4: handlenetworking(); break; - + case 5: + handleisdn(); + break; + + case 6: handlerootpassword(); break; - case 6: + case 7: handleadminpassword(); break; @@ -173,6 +178,8 @@ int main(int argc, char *argv[]) goto EXIT; if (!(handlenetworking())) goto EXIT; + if (!(handleisdn())) + goto EXIT; if (!(handledhcp())) goto EXIT; if (!(handlerootpassword())) diff --git a/src/install+setup/setup/misc.c b/src/install+setup/setup/misc.c index 3d645d39c..10f43a285 100644 --- a/src/install+setup/setup/misc.c +++ b/src/install+setup/setup/misc.c @@ -1,141 +1,149 @@ -/* SmoothWall setup program. - * - * This program is distributed under the terms of the GNU General Public - * Licence. See the file COPYING for details. - * - * (c) Lawrence Manning, 2001 - * Misc. stuff for the lib. - * - * $Id: misc.c,v 1.5.2.3 2005/08/25 17:51:42 gespinasse Exp $ - * - */ - -#include "setup.h" - -extern FILE *flog; -extern char *mylog; - -extern char **ctr; - -extern int automode; - -/* This will rewrite /etc/hosts, /etc/hosts.*, and the apache ServerName file. */ -int writehostsfiles(void) -{ - char address[STRING_SIZE] = ""; - char netaddress[STRING_SIZE] = ""; - char netmask[STRING_SIZE] = ""; - char message[1000]; - FILE *file, *hosts; - struct keyvalue *kv; - char hostname[STRING_SIZE]; - char domainname[STRING_SIZE] = ""; - char commandstring[STRING_SIZE]; - char buffer[STRING_SIZE]; - - kv = initkeyvalues(); - if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings"))) - { - freekeyvalues(kv); - errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]); - return 0; - } - findkey(kv, "GREEN_ADDRESS", address); - findkey(kv, "GREEN_NETADDRESS", netaddress); - findkey(kv, "GREEN_NETMASK", netmask); - freekeyvalues(kv); - - kv = initkeyvalues(); - if (!(readkeyvalues(kv, CONFIG_ROOT "/main/settings"))) - { - freekeyvalues(kv); - errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]); - return 0; - } - strcpy(hostname, SNAME ); - findkey(kv, "HOSTNAME", hostname); - findkey(kv, "DOMAINNAME", domainname); - freekeyvalues(kv); - - if (!(file = fopen(CONFIG_ROOT "/main/hostname.conf", "w"))) - { - sprintf (message, ctr[TR_UNABLE_TO_WRITE_VAR_SMOOTHWALL_MAIN_HOSTNAMECONF], CONFIG_ROOT); - errorbox(message); - return 0; - } - fprintf(file, "ServerName %s.%s\n", hostname,domainname); - fclose(file); - - if (!(file = fopen(CONFIG_ROOT "/main/hosts", "r"))) - { - errorbox(ctr[TR_UNABLE_TO_OPEN_HOSTS_FILE]); - return 0; - } - if (!(hosts = fopen("/etc/hosts", "w"))) - { - errorbox(ctr[TR_UNABLE_TO_WRITE_ETC_HOSTS]); - return 0; - } - fprintf(hosts, "127.0.0.1\tlocalhost\n"); - if (strlen(domainname)) - fprintf(hosts, "%s\t%s.%s\t%s\n",address,hostname,domainname,hostname); - else - fprintf(hosts, "%s\t%s\n",address,hostname); - while (fgets(buffer, STRING_SIZE, file)) - { - char *token, *ip, *host, *domain; - - buffer[strlen(buffer) - 1] = 0; - - token = strtok(buffer, ","); - - ip = strtok(NULL, ","); - host = strtok(NULL, ","); - domain = strtok(NULL, ","); - - if (!(ip && host)) - break; - - if (strlen(ip) < 7 || strlen(ip) > 15 - || strspn(ip, "0123456789.") != strlen(ip)) - break; - - if (strspn(host, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-") != strlen(host)) - break; - - if (domain) - fprintf(hosts, "%s\t%s.%s\t%s\n",ip,host,domain,host); - else - fprintf(hosts, "%s\t%s\n",ip,host); - } - fclose(file); - fclose(hosts); - - /* TCP wrappers stuff. */ - if (!(file = fopen("/etc/hosts.deny", "w"))) - { - errorbox(ctr[TR_UNABLE_TO_WRITE_ETC_HOSTS_DENY]); - return 0; - } - fprintf(file, "ALL : ALL\n"); - fclose(file); - - if (!(file = fopen("/etc/hosts.allow", "w"))) - { - errorbox(ctr[TR_UNABLE_TO_WRITE_ETC_HOSTS_ALLOW]); - return 0; - } - fprintf(file, "sshd : ALL\n"); - fprintf(file, "ALL : localhost\n"); - fprintf(file, "ALL : %s/%s\n", netaddress, netmask); - fclose(file); - - sprintf(commandstring, "/bin/hostname %s.%s", hostname, domainname); - if (mysystem(commandstring)) - { - errorbox(ctr[TR_UNABLE_TO_SET_HOSTNAME]); - return 0; - } - - return 1; -} +/* SmoothWall setup program. + * + * This program is distributed under the terms of the GNU General Public + * Licence. See the file COPYING for details. + * + * (c) Lawrence Manning, 2001 + * Misc. stuff for the lib. + * + */ + +#include "setup.h" + +extern FILE *flog; +extern char *mylog; + +extern char **ctr; + +extern int automode; + +/* This will rewrite /etc/hosts, /etc/hosts.*, and the apache ServerName file. */ +int writehostsfiles(void) +{ + char address[STRING_SIZE] = ""; + char netaddress[STRING_SIZE] = ""; + char netmask[STRING_SIZE] = ""; + char message[1000]; + FILE *file, *hosts; + struct keyvalue *kv; + char hostname[STRING_SIZE]; + char domainname[STRING_SIZE] = ""; + char commandstring[STRING_SIZE]; + char buffer[STRING_SIZE]; + + kv = initkeyvalues(); + if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings"))) + { + freekeyvalues(kv); + errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]); + return 0; + } + findkey(kv, "GREEN_ADDRESS", address); + findkey(kv, "GREEN_NETADDRESS", netaddress); + findkey(kv, "GREEN_NETMASK", netmask); + freekeyvalues(kv); + + kv = initkeyvalues(); + if (!(readkeyvalues(kv, CONFIG_ROOT "/main/settings"))) + { + freekeyvalues(kv); + errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]); + return 0; + } + strcpy(hostname, SNAME ); + findkey(kv, "HOSTNAME", hostname); + findkey(kv, "DOMAINNAME", domainname); + freekeyvalues(kv); + + if (!(file = fopen(CONFIG_ROOT "/main/hostname.conf", "w"))) + { + sprintf (message, ctr[TR_UNABLE_TO_WRITE_VAR_SMOOTHWALL_MAIN_HOSTNAMECONF], CONFIG_ROOT); + errorbox(message); + return 0; + } + fprintf(file, "ServerName %s.%s\n", hostname,domainname); + fclose(file); + + if (!(file = fopen(CONFIG_ROOT "/main/hosts", "r"))) + { + errorbox(ctr[TR_UNABLE_TO_OPEN_HOSTS_FILE]); + return 0; + } + if (!(hosts = fopen("/etc/hosts", "w"))) + { + errorbox(ctr[TR_UNABLE_TO_WRITE_ETC_HOSTS]); + return 0; + } + fprintf(hosts, "127.0.0.1\tlocalhost\n"); + if (strlen(domainname)) + fprintf(hosts, "%s\t%s.%s\t%s\n",address,hostname,domainname,hostname); + else + fprintf(hosts, "%s\t%s\n",address,hostname); + while (fgets(buffer, STRING_SIZE, file)) + { + char *token, *ip, *host, *domain; + + buffer[strlen(buffer) - 1] = 0; + + token = strtok(buffer, ","); + + ip = strtok(NULL, ","); + host = strtok(NULL, ","); + domain = strtok(NULL, ","); + + if (!(ip && host)) + break; + + if (strlen(ip) < 7 || strlen(ip) > 15 + || strspn(ip, "0123456789.") != strlen(ip)) + break; + + if (strspn(host, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-") != strlen(host)) + break; + + if (domain) + fprintf(hosts, "%s\t%s.%s\t%s\n",ip,host,domain,host); + else + fprintf(hosts, "%s\t%s\n",ip,host); + } + fclose(file); + fclose(hosts); + + /* TCP wrappers stuff. */ + if (!(file = fopen("/etc/hosts.deny", "w"))) + { + errorbox(ctr[TR_UNABLE_TO_WRITE_ETC_HOSTS_DENY]); + return 0; + } + fprintf(file, "ALL : ALL\n"); + fclose(file); + + if (!(file = fopen("/etc/hosts.allow", "w"))) + { + errorbox(ctr[TR_UNABLE_TO_WRITE_ETC_HOSTS_ALLOW]); + return 0; + } + fprintf(file, "sshd : ALL\n"); + fprintf(file, "ALL : localhost\n"); + fprintf(file, "ALL : %s/%s\n", netaddress, netmask); + fclose(file); + + sprintf(commandstring, "/bin/hostname %s.%s", hostname, domainname); + if (mysystem(commandstring)) + { + errorbox(ctr[TR_UNABLE_TO_SET_HOSTNAME]); + return 0; + } + + return 1; +} + +int handleisdn(void) +{ + char command[STRING_SIZE]; + sprintf(command, "/etc/rc.d/init.d/mISDN config"); + if (!runcommandwithstatus(command, ctr[TR_PROBING_ISDN])) + errorbox(ctr[TR_ERROR_PROBING_ISDN]); + // Need to write some lines that count the cards and say the names... + return 0; +} diff --git a/src/install+setup/setup/setup.h b/src/install+setup/setup/setup.h index f1b9129ed..e6a32a6a6 100644 --- a/src/install+setup/setup/setup.h +++ b/src/install+setup/setup/setup.h @@ -31,6 +31,7 @@ int handleadminpassword(void); /* misc.c */ int writehostsfiles(void); +int handleisdn(void); /* keymap.c */ int handlekeymap(void); diff --git a/src/patches/grub-0.97-disk_geometry-1.patch b/src/patches/grub-0.97-disk_geometry-1.patch new file mode 100644 index 000000000..e09686dd7 --- /dev/null +++ b/src/patches/grub-0.97-disk_geometry-1.patch @@ -0,0 +1,892 @@ +Submitted By: Jim Gifford +Date: 05-28-2006 +Initial Package Version: 0.97 +Upstream Status: Unknown +Origin: Fedora and Mandriva +Description: This patch fixes issues with disk geometry not being + detected properly. Part of this patch also fixes + gcc 4 compile errors, which are a part of the issue. + +diff -Naur grub-0.97.orig/configure grub-0.97/configure +--- grub-0.97.orig/configure 2005-05-07 19:48:12.000000000 -0700 ++++ grub-0.97/configure 2006-05-28 20:29:36.025466751 -0700 +@@ -3485,9 +3485,9 @@ + echo "$as_me:$LINENO: result: $size_flag" >&5 + echo "${ECHO_T}$size_flag" >&6 + if test "x$size_flag" = xyes; then +- STAGE2_CFLAGS="-Os" ++ STAGE2_CFLAGS="-Os -fno-strict-aliasing" + else +- STAGE2_CFLAGS="-O2 -fno-strength-reduce -fno-unroll-loops" ++ STAGE2_CFLAGS="-O2 -fno-strict-aliasing -fno-strength-reduce -fno-unroll-loops" + fi + # OpenBSD has a GCC extension for protecting applications from + # stack smashing attacks, but GRUB doesn't want this feature. +diff -Naur grub-0.97.orig/configure.ac grub-0.97/configure.ac +--- grub-0.97.orig/configure.ac 2005-05-07 19:36:03.000000000 -0700 ++++ grub-0.97/configure.ac 2006-05-28 20:28:41.538819726 -0700 +@@ -93,9 +93,9 @@ + CFLAGS=$saved_CFLAGS + ]) + if test "x$size_flag" = xyes; then +- STAGE2_CFLAGS="-Os" ++ STAGE2_CFLAGS="-Os -fno-strict-aliasing" + else +- STAGE2_CFLAGS="-O2 -fno-strength-reduce -fno-unroll-loops" ++ STAGE2_CFLAGS="-O2 -fno-strict-aliasing -fno-strength-reduce -fno-unroll-loops" + fi + # OpenBSD has a GCC extension for protecting applications from + # stack smashing attacks, but GRUB doesn't want this feature. +diff -Naur grub-0.97.orig/lib/device.c grub-0.97/lib/device.c +--- grub-0.97.orig/lib/device.c 2005-03-27 15:14:25.000000000 -0800 ++++ grub-0.97/lib/device.c 2006-05-28 20:34:03.546804777 -0700 +@@ -131,6 +131,152 @@ + #include + #include + ++#if defined(__linux__) ++/* The 2.6 kernel has removed all of the geometry handling for IDE drives ++ * that did fixups for LBA, etc. This means that the geometry we get ++ * with the ioctl has a good chance of being wrong. So, we get to ++ * also know about partition tables and try to read what the geometry ++ * is there. *grumble* Very closely based on code from cfdisk ++ */ ++static void get_kernel_geometry(int fd, long long *cyl, int *heads, int *sectors) { ++ struct hd_geometry hdg; ++ ++ if (ioctl (fd, HDIO_GETGEO, &hdg)) ++ return; ++ ++ *cyl = hdg.cylinders; ++ *heads = hdg.heads; ++ *sectors = hdg.sectors; ++} ++ ++struct partition { ++ unsigned char boot_ind; /* 0x80 - active */ ++ unsigned char head; /* starting head */ ++ unsigned char sector; /* starting sector */ ++ unsigned char cyl; /* starting cylinder */ ++ unsigned char sys_ind; /* What partition type */ ++ unsigned char end_head; /* end head */ ++ unsigned char end_sector; /* end sector */ ++ unsigned char end_cyl; /* end cylinder */ ++ unsigned char start4[4]; /* starting sector counting from 0 */ ++ unsigned char size4[4]; /* nr of sectors in partition */ ++}; ++ ++#define ALIGNMENT 2 ++typedef union { ++ struct { ++ unsigned char align[ALIGNMENT]; ++ unsigned char b[SECTOR_SIZE]; ++ } c; ++ struct { ++ unsigned char align[ALIGNMENT]; ++ unsigned char buffer[0x1BE]; ++ struct partition part[4]; ++ unsigned char magicflag[2]; ++ } p; ++} partition_table; ++ ++#define PART_TABLE_FLAG0 0x55 ++#define PART_TABLE_FLAG1 0xAA ++ ++static void ++get_partition_table_geometry(partition_table *bufp, long long *cyl, int *heads, ++ int *sectors) { ++ struct partition *p; ++ int i,h,s,hh,ss; ++ int first = 1; ++ int bad = 0; ++ ++ if (bufp->p.magicflag[0] != PART_TABLE_FLAG0 || ++ bufp->p.magicflag[1] != PART_TABLE_FLAG1) { ++ /* Matthew Wilcox: slightly friendlier version of ++ fatal(_("Bad signature on partition table"), 3); ++ */ ++ fprintf(stderr, "Unknown partition table signature\n"); ++ return; ++ } ++ ++ hh = ss = 0; ++ for (i=0; i<4; i++) { ++ p = &(bufp->p.part[i]); ++ if (p->sys_ind != 0) { ++ h = p->end_head + 1; ++ s = (p->end_sector & 077); ++ if (first) { ++ hh = h; ++ ss = s; ++ first = 0; ++ } else if (hh != h || ss != s) ++ bad = 1; ++ } ++ } ++ ++ if (!first && !bad) { ++ *heads = hh; ++ *sectors = ss; ++ } ++} ++ ++static long long my_lseek (unsigned int fd, long long offset, ++ unsigned int origin) ++{ ++#if defined(__linux__) && (!defined(__GLIBC__) || \ ++ ((__GLIBC__ < 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ < 1)))) ++ /* Maybe libc doesn't have large file support. */ ++ loff_t offset, result; ++ static int _llseek (uint filedes, ulong hi, ulong lo, ++ loff_t *res, uint wh); ++ _syscall5 (int, _llseek, uint, filedes, ulong, hi, ulong, lo, ++ loff_t *, res, uint, wh); ++ ++ if (_llseek (fd, offset >> 32, offset & 0xffffffff, &result, SEEK_SET) < 0) ++ return (long long) -1; ++ return result; ++#else ++ return lseek(fd, offset, SEEK_SET); ++#endif ++} ++ ++static void get_linux_geometry (int fd, struct geometry *geom) { ++ long long kern_cyl = 0; int kern_head = 0, kern_sectors = 0; ++ long long pt_cyl = 0; int pt_head = 0, pt_sectors = 0; ++ partition_table bufp; ++ char *buff, *buf_unaligned; ++ ++ buf_unaligned = malloc(sizeof(partition_table) + 4095); ++ buff = (char *) (((unsigned long)buf_unaligned + 4096 - 1) & ++ (~(4096-1))); ++ ++ get_kernel_geometry(fd, &kern_cyl, &kern_head, &kern_sectors); ++ ++ if (my_lseek (fd, 0*SECTOR_SIZE, SEEK_SET) < 0) { ++ fprintf(stderr, "Unable to seek"); ++ } ++ ++ if (read(fd, buff, SECTOR_SIZE) == SECTOR_SIZE) { ++ memcpy(bufp.c.b, buff, SECTOR_SIZE); ++ get_partition_table_geometry(&bufp, &pt_cyl, &pt_head, &pt_sectors); ++ } else { ++ fprintf(stderr, "Unable to read partition table: %s\n", strerror(errno)); ++ } ++ ++ if (pt_head && pt_sectors) { ++ int cyl_size; ++ ++ geom->heads = pt_head; ++ geom->sectors = pt_sectors; ++ cyl_size = pt_head * pt_sectors; ++ geom->cylinders = geom->total_sectors/cyl_size; ++ } else { ++ geom->heads = kern_head; ++ geom->sectors = kern_sectors; ++ geom->cylinders = kern_cyl; ++ } ++ ++ return; ++} ++#endif ++ + /* Get the geometry of a drive DRIVE. */ + void + get_drive_geometry (struct geometry *geom, char **map, int drive) +@@ -151,21 +297,16 @@ + #if defined(__linux__) + /* Linux */ + { +- struct hd_geometry hdg; + unsigned long nr; +- +- if (ioctl (fd, HDIO_GETGEO, &hdg)) +- goto fail; + + if (ioctl (fd, BLKGETSIZE, &nr)) + goto fail; + + /* Got the geometry, so save it. */ +- geom->cylinders = hdg.cylinders; +- geom->heads = hdg.heads; +- geom->sectors = hdg.sectors; + geom->total_sectors = nr; +- ++ get_linux_geometry(fd, geom); ++ if (!geom->heads && !geom->cylinders && !geom->sectors) ++ goto fail; + goto success; + } + +@@ -844,6 +985,7 @@ + { + char dev[PATH_MAX]; /* XXX */ + int fd; ++ off_t offset = (off_t) sector * (off_t) SECTOR_SIZE; + + if ((partition & 0x00FF00) != 0x00FF00) + { +@@ -870,35 +1012,13 @@ + errnum = ERR_NO_PART; + return 0; + } +- +-#if defined(__linux__) && (!defined(__GLIBC__) || \ +- ((__GLIBC__ < 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ < 1)))) +- /* Maybe libc doesn't have large file support. */ +- { +- loff_t offset, result; +- static int _llseek (uint filedes, ulong hi, ulong lo, +- loff_t *res, uint wh); +- _syscall5 (int, _llseek, uint, filedes, ulong, hi, ulong, lo, +- loff_t *, res, uint, wh); + +- offset = (loff_t) sector * (loff_t) SECTOR_SIZE; +- if (_llseek (fd, offset >> 32, offset & 0xffffffff, &result, SEEK_SET)) +- { +- errnum = ERR_DEV_VALUES; +- return 0; +- } +- } +-#else +- { +- off_t offset = (off_t) sector * (off_t) SECTOR_SIZE; + +- if (lseek (fd, offset, SEEK_SET) != offset) +- { +- errnum = ERR_DEV_VALUES; +- return 0; +- } +- } +-#endif ++ if (my_lseek(fd, offset, SEEK_SET) != offset) ++ { ++ errnum = ERR_DEV_VALUES; ++ return 0; ++ } + + if (write (fd, buf, size * SECTOR_SIZE) != (size * SECTOR_SIZE)) + { +diff -Naur grub-0.97.orig/stage2/Makefile.am grub-0.97/stage2/Makefile.am +--- grub-0.97.orig/stage2/Makefile.am 2005-02-02 12:37:35.000000000 -0800 ++++ grub-0.97/stage2/Makefile.am 2006-05-28 20:28:41.590818435 -0700 +@@ -24,7 +24,8 @@ + -DGRUB_UTIL=1 -DFSYS_EXT2FS=1 -DFSYS_FAT=1 -DFSYS_FFS=1 \ + -DFSYS_ISO9660=1 -DFSYS_JFS=1 -DFSYS_MINIX=1 -DFSYS_REISERFS=1 \ + -DFSYS_UFS2=1 -DFSYS_VSTAFS=1 -DFSYS_XFS=1 \ +- -DUSE_MD5_PASSWORDS=1 -DSUPPORT_SERIAL=1 -DSUPPORT_HERCULES=1 ++ -DUSE_MD5_PASSWORDS=1 -DSUPPORT_SERIAL=1 -DSUPPORT_HERCULES=1 \ ++ -fno-strict-aliasing + + # Stage 2 and Stage 1.5's. + pkglibdir = $(libdir)/$(PACKAGE)/$(host_cpu)-$(host_vendor) +diff -Naur grub-0.97.orig/stage2/boot.c grub-0.97/stage2/boot.c +--- grub-0.97.orig/stage2/boot.c 2004-03-30 03:44:08.000000000 -0800 ++++ grub-0.97/stage2/boot.c 2006-05-28 20:33:30.123638792 -0700 +@@ -55,7 +55,7 @@ + pu; + /* presuming that MULTIBOOT_SEARCH is large enough to encompass an + executable header */ +- unsigned char buffer[MULTIBOOT_SEARCH]; ++ char buffer[MULTIBOOT_SEARCH]; + + /* sets the header pointer to point to the beginning of the + buffer by default */ +@@ -98,7 +98,7 @@ + /* ELF loading supported if multiboot, FreeBSD and NetBSD. */ + if ((type == KERNEL_TYPE_MULTIBOOT + || pu.elf->e_ident[EI_OSABI] == ELFOSABI_FREEBSD +- || grub_strcmp (pu.elf->e_ident + EI_BRAND, "FreeBSD") == 0 ++ || grub_strcmp ((char *) pu.elf->e_ident + EI_BRAND, "FreeBSD") == 0 + || suggested_type == KERNEL_TYPE_NETBSD) + && len > sizeof (Elf32_Ehdr) + && BOOTABLE_I386_ELF ((*((Elf32_Ehdr *) buffer)))) +@@ -824,8 +824,12 @@ + moveto = (mbi.mem_upper + 0x400) << 10; + + moveto = (moveto - len) & 0xfffff000; ++#if 0 + max_addr = (lh->header == LINUX_MAGIC_SIGNATURE && lh->version >= 0x0203 + ? lh->initrd_addr_max : LINUX_INITRD_MAX_ADDRESS); ++#else ++ max_addr = LINUX_INITRD_MAX_ADDRESS; ++#endif + if (moveto + len >= max_addr) + moveto = (max_addr - len) & 0xfffff000; + +diff -Naur grub-0.97.orig/stage2/disk_io.c grub-0.97/stage2/disk_io.c +--- grub-0.97.orig/stage2/disk_io.c 2004-05-23 09:35:24.000000000 -0700 ++++ grub-0.97/stage2/disk_io.c 2006-05-28 20:28:41.582818634 -0700 +@@ -127,12 +127,19 @@ + int filepos; + int filemax; + +-static inline unsigned long +-log2 (unsigned long word) ++#define log2(n) ffz(~(n)) ++ ++/* include/asm-i386/bitops.h */ ++/* ++ * ffz = Find First Zero in word. Undefined if no zero exists, ++ * so code should check against ~0UL first.. ++ */ ++static __inline__ unsigned long ++ffz (unsigned long word) + { +- asm volatile ("bsfl %1,%0" +- : "=r" (word) +- : "r" (word)); ++ __asm__ ("bsfl %1,%0" ++: "=r" (word) ++: "r" (~word)); + return word; + } + +diff -Naur grub-0.97.orig/stage2/freebsd.h grub-0.97/stage2/freebsd.h +--- grub-0.97.orig/stage2/freebsd.h 2003-07-09 04:45:52.000000000 -0700 ++++ grub-0.97/stage2/freebsd.h 2006-05-28 20:28:41.582818634 -0700 +@@ -78,7 +78,7 @@ + struct bootinfo + { + unsigned int bi_version; +- unsigned char *bi_kernelname; ++ char *bi_kernelname; + struct nfs_diskless *bi_nfs_diskless; + /* End of fields that are always present. */ + #define bi_endcommon bi_n_bios_used +diff -Naur grub-0.97.orig/stage2/fsys_fat.c grub-0.97/stage2/fsys_fat.c +--- grub-0.97.orig/stage2/fsys_fat.c 2005-03-15 08:52:00.000000000 -0800 ++++ grub-0.97/stage2/fsys_fat.c 2006-05-28 20:28:41.582818634 -0700 +@@ -54,12 +54,19 @@ + + #define FAT_CACHE_SIZE 2048 + ++#define log2(n) ffz(~(n)) ++ ++/* include/asm-i386/bitops.h */ ++/* ++ * ffz = Find First Zero in word. Undefined if no zero exists, ++ * so code should check against ~0UL first.. ++ */ + static __inline__ unsigned long +-log2 (unsigned long word) ++ffz (unsigned long word) + { + __asm__ ("bsfl %1,%0" +- : "=r" (word) +- : "r" (word)); ++: "=r" (word) ++: "r" (~word)); + return word; + } + +diff -Naur grub-0.97.orig/stage2/fsys_iso9660.c grub-0.97/stage2/fsys_iso9660.c +--- grub-0.97.orig/stage2/fsys_iso9660.c 2004-05-11 05:11:19.000000000 -0700 ++++ grub-0.97/stage2/fsys_iso9660.c 2006-05-28 20:28:41.582818634 -0700 +@@ -55,13 +55,19 @@ + #define RRCONT_BUF ((unsigned char *)(FSYS_BUF + 6144)) + #define NAME_BUF ((unsigned char *)(FSYS_BUF + 8192)) + ++#define log2(n) ffz(~(n)) + +-static inline unsigned long +-log2 (unsigned long word) ++/* include/asm-i386/bitops.h */ ++/* ++ * ffz = Find First Zero in word. Undefined if no zero exists, ++ * so code should check against ~0UL first.. ++ */ ++static __inline__ unsigned long ++ffz (unsigned long word) + { +- asm volatile ("bsfl %1,%0" +- : "=r" (word) +- : "r" (word)); ++ __asm__ ("bsfl %1,%0" ++: "=r" (word) ++: "r" (~word)); + return word; + } + +@@ -120,7 +126,7 @@ + break; + /* check ISO_VD_PRIMARY and ISO_STANDARD_ID */ + if (PRIMDESC->type.l == ISO_VD_PRIMARY +- && !memcmp(PRIMDESC->id, ISO_STANDARD_ID, sizeof(PRIMDESC->id))) ++ && !memcmp((char *) PRIMDESC->id, ISO_STANDARD_ID, sizeof(PRIMDESC->id))) + { + ISO_SUPER->vol_sector = sector; + INODE->file_start = 0; +@@ -175,7 +181,7 @@ + for (; idr->length.l > 0; + idr = (struct iso_directory_record *)((char *)idr + idr->length.l) ) + { +- const char *name = idr->name; ++ const u_int8_t *name = idr->name; + unsigned int name_len = idr->name_len.l; + + file_type = (idr->flags.l & 2) ? ISO_DIRECTORY : ISO_REGULAR; +@@ -198,7 +204,7 @@ + rr_len = (idr->length.l - idr->name_len.l + - sizeof(struct iso_directory_record) + + sizeof(idr->name)); +- rr_ptr.ptr = ((unsigned char *)idr + idr->name_len.l ++ rr_ptr.ptr = ((char *)idr + idr->name_len.l + + sizeof(struct iso_directory_record) + - sizeof(idr->name)); + if (rr_ptr.i & 1) +@@ -331,9 +337,9 @@ + memcpy(NAME_BUF, name, name_len); + name = NAME_BUF; + } +- rr_ptr.ptr = RRCONT_BUF + ce_ptr->u.ce.offset.l; ++ rr_ptr.ptr = (char *) RRCONT_BUF + ce_ptr->u.ce.offset.l; + rr_len = ce_ptr->u.ce.size.l; +- if (!iso9660_devread(ce_ptr->u.ce.extent.l, 0, ISO_SECTOR_SIZE, RRCONT_BUF)) ++ if (!iso9660_devread(ce_ptr->u.ce.extent.l, 0, ISO_SECTOR_SIZE, (char *) RRCONT_BUF)) + { + errnum = 0; /* this is not fatal. */ + break; +@@ -344,7 +350,7 @@ + + filemax = MAXINT; + if (name_len >= pathlen +- && !memcmp(name, dirname, pathlen)) ++ && !memcmp((char *) name, dirname, pathlen)) + { + if (dirname[pathlen] == '/' || !print_possibilities) + { +@@ -381,7 +387,7 @@ + print_possibilities = -print_possibilities; + memcpy(NAME_BUF, name, name_len); + NAME_BUF[name_len] = '\0'; +- print_a_completion (NAME_BUF); ++ print_a_completion ((char *) NAME_BUF); + #endif + } + } +diff -Naur grub-0.97.orig/stage2/fsys_reiserfs.c grub-0.97/stage2/fsys_reiserfs.c +--- grub-0.97.orig/stage2/fsys_reiserfs.c 2004-02-18 14:09:10.000000000 -0800 ++++ grub-0.97/stage2/fsys_reiserfs.c 2006-05-28 20:28:41.586818535 -0700 +@@ -365,13 +365,19 @@ + #define JOURNAL_START ((__u32 *) (INFO + 1)) + #define JOURNAL_END ((__u32 *) (FSYS_BUF + FSYS_BUFLEN)) + ++#define log2(n) ffz(~(n)) + ++/* include/asm-i386/bitops.h */ ++/* ++ * ffz = Find First Zero in word. Undefined if no zero exists, ++ * so code should check against ~0UL first.. ++ */ + static __inline__ unsigned long +-log2 (unsigned long word) ++ffz (unsigned long word) + { + __asm__ ("bsfl %1,%0" +- : "=r" (word) +- : "r" (word)); ++: "=r" (word) ++: "r" (~word)); + return word; + } + +diff -Naur grub-0.97.orig/stage2/fsys_vstafs.c grub-0.97/stage2/fsys_vstafs.c +--- grub-0.97.orig/stage2/fsys_vstafs.c 2003-07-09 04:45:53.000000000 -0700 ++++ grub-0.97/stage2/fsys_vstafs.c 2006-05-28 20:28:41.586818535 -0700 +@@ -186,35 +186,35 @@ + int + vstafs_read (char *addr, int len) + { +- struct alloc *a; ++ struct alloc *b; + int size, ret = 0, offset, curr_len = 0; +- int curr_ext; ++ int curr_exten; + char extent; + int ext_size; + char *curr_pos; + + get_file_info (f_sector); + size = FILE_INFO->len-VSTAFS_START_DATA; +- a = FILE_INFO->blocks; ++ b = FILE_INFO->blocks; + + if (filepos > 0) + { +- if (filepos < a[0].a_len * 512 - VSTAFS_START_DATA) ++ if (filepos < b[0].a_len * 512 - VSTAFS_START_DATA) + { + offset = filepos + VSTAFS_START_DATA; + extent = 0; +- curr_len = a[0].a_len * 512 - offset - filepos; ++ curr_len = b[0].a_len * 512 - offset - filepos; + } + else + { +- ext_size = a[0].a_len * 512 - VSTAFS_START_DATA; ++ ext_size = b[0].a_len * 512 - VSTAFS_START_DATA; + offset = filepos - ext_size; + extent = 1; + do + { + curr_len -= ext_size; + offset -= ext_size; +- ext_size = a[extent+1].a_len * 512; ++ ext_size = b[extent+1].a_len * 512; + } + while (extent < FILE_INFO->extents && offset>ext_size); + } +@@ -223,16 +223,16 @@ + { + offset = VSTAFS_START_DATA; + extent = 0; +- curr_len = a[0].a_len * 512 - offset; ++ curr_len = b[0].a_len * 512 - offset; + } + + curr_pos = addr; + if (curr_len > len) + curr_len = len; + +- for (curr_ext=extent; +- curr_ext < FILE_INFO->extents; +- curr_len = a[curr_ext].a_len * 512, curr_pos += curr_len, curr_ext++) ++ for (curr_exten = extent; ++ curr_exten < FILE_INFO->extents; ++ curr_len = b[curr_exten].a_len * 512, curr_pos += curr_len, curr_exten++) + { + ret += curr_len; + size -= curr_len; +@@ -242,7 +242,7 @@ + curr_len += size; + } + +- devread (a[curr_ext].a_start,offset, curr_len, curr_pos); ++ devread (b[curr_exten].a_start, offset, curr_len, curr_pos); + offset = 0; + } + +diff -Naur grub-0.97.orig/stage2/fsys_xfs.c grub-0.97/stage2/fsys_xfs.c +--- grub-0.97.orig/stage2/fsys_xfs.c 2005-05-07 19:15:55.000000000 -0700 ++++ grub-0.97/stage2/fsys_xfs.c 2006-05-28 20:28:41.586818535 -0700 +@@ -97,7 +97,7 @@ + return ino & XFS_INO_MASK(XFS_INO_OFFSET_BITS); + } + +-static inline __const__ xfs_uint16_t ++static inline __attribute__((const)) xfs_uint16_t + le16 (xfs_uint16_t x) + { + __asm__("xchgb %b0,%h0" \ +@@ -106,7 +106,7 @@ + return x; + } + +-static inline __const__ xfs_uint32_t ++static inline __attribute__((const)) xfs_uint32_t + le32 (xfs_uint32_t x) + { + #if 0 +@@ -122,7 +122,7 @@ + return x; + } + +-static inline __const__ xfs_uint64_t ++static inline __attribute__((const)) xfs_uint64_t + le64 (xfs_uint64_t x) + { + xfs_uint32_t h = x >> 32; +@@ -368,7 +368,7 @@ + default: + namelen = sfe->namelen; + *ino = sf_ino ((char *)sfe, namelen); +- name = sfe->name; ++ name = (char *) sfe->name; + sfe = (xfs_dir2_sf_entry_t *) + ((char *)sfe + namelen + 11 - xfs.i8param); + } +diff -Naur grub-0.97.orig/stage2/gunzip.c grub-0.97/stage2/gunzip.c +--- grub-0.97.orig/stage2/gunzip.c 2003-07-09 04:45:53.000000000 -0700 ++++ grub-0.97/stage2/gunzip.c 2006-05-28 20:28:41.586818535 -0700 +@@ -277,7 +277,7 @@ + * is a compressed file, and simply mark it as such. + */ + if (no_decompression +- || grub_read (buf, 10) != 10 ++ || grub_read ((char *) buf, 10) != 10 + || ((*((unsigned short *) buf) != GZIP_HDR_LE) + && (*((unsigned short *) buf) != OLD_GZIP_HDR_LE))) + { +@@ -293,7 +293,7 @@ + if (buf[2] != DEFLATED + || (buf[3] & UNSUPP_FLAGS) + || ((buf[3] & EXTRA_FIELD) +- && (grub_read (buf, 2) != 2 ++ && (grub_read ((char *) buf, 2) != 2 + || bad_field (*((unsigned short *) buf)))) + || ((buf[3] & ORIG_NAME) && bad_field (-1)) + || ((buf[3] & COMMENT) && bad_field (-1))) +@@ -308,7 +308,7 @@ + + filepos = filemax - 8; + +- if (grub_read (buf, 8) != 8) ++ if (grub_read ((char *) buf, 8) != 8) + { + if (! errnum) + errnum = ERR_BAD_GZIP_HEADER; +@@ -485,8 +485,8 @@ + + #define INBUFSIZ 0x2000 + +-static uch inbuf[INBUFSIZ]; +-static int bufloc; ++static unsigned char inbuf[INBUFSIZ]; ++static int bufloc; + + static int + get_byte (void) +@@ -494,7 +494,7 @@ + if (filepos == gzip_data_offset || bufloc == INBUFSIZ) + { + bufloc = 0; +- grub_read (inbuf, INBUFSIZ); ++ grub_read ((char *) inbuf, INBUFSIZ); + } + + return inbuf[bufloc++]; +@@ -925,7 +925,7 @@ + unsigned m; /* mask for bit lengths table */ + unsigned n; /* number of lengths to get */ + unsigned nb; /* number of bit length codes */ +- unsigned nl; /* number of literal/length codes */ ++ unsigned nc; /* number of literal/length codes */ + unsigned nd; /* number of distance codes */ + unsigned ll[286 + 30]; /* literal/length and distance code lengths */ + register ulg b; /* bit buffer */ +@@ -937,7 +937,7 @@ + + /* read in table lengths */ + NEEDBITS (5); +- nl = 257 + ((unsigned) b & 0x1f); /* number of literal/length codes */ ++ nc = 257 + ((unsigned) b & 0x1f); /* number of literal/length codes */ + DUMPBITS (5); + NEEDBITS (5); + nd = 1 + ((unsigned) b & 0x1f); /* number of distance codes */ +@@ -945,7 +945,7 @@ + NEEDBITS (4); + nb = 4 + ((unsigned) b & 0xf); /* number of bit length codes */ + DUMPBITS (4); +- if (nl > 286 || nd > 30) ++ if (nc > 286 || nd > 30) + { + errnum = ERR_BAD_GZIP_DATA; + return; +@@ -970,7 +970,7 @@ + } + + /* read in literal and distance code lengths */ +- n = nl + nd; ++ n = nc + nd; + m = mask_bits[bl]; + i = l = 0; + while ((unsigned) i < n) +@@ -1034,7 +1034,7 @@ + + /* build the decoding tables for literal/length and distance codes */ + bl = lbits; +- if ((i = huft_build (ll, nl, 257, cplens, cplext, &tl, &bl)) != 0) ++ if ((i = huft_build (ll, nc, 257, cplens, cplext, &tl, &bl)) != 0) + { + #if 0 + if (i == 1) +@@ -1045,7 +1045,7 @@ + return; + } + bd = dbits; +- if ((i = huft_build (ll + nl, nd, 0, cpdist, cpdext, &td, &bd)) != 0) ++ if ((i = huft_build (ll + nc, nd, 0, cpdist, cpdext, &td, &bd)) != 0) + { + #if 0 + if (i == 1) +diff -Naur grub-0.97.orig/stage2/md5.c grub-0.97/stage2/md5.c +--- grub-0.97.orig/stage2/md5.c 2003-07-09 04:45:53.000000000 -0700 ++++ grub-0.97/stage2/md5.c 2006-05-28 20:28:41.590818435 -0700 +@@ -166,7 +166,7 @@ + inputlen -= 64 - buflen; + while (inputlen >= 64) + { +- md5_transform (input); ++ md5_transform ((unsigned char *) input); + input += 64; + inputlen -= 64; + } +@@ -211,7 +211,7 @@ + char *p; + int saltlen; + int i, n; +- unsigned char alt_result[16]; ++ char alt_result[16]; + unsigned char *digest; + + if (check) +diff -Naur grub-0.97.orig/stage2/start_eltorito.S grub-0.97/stage2/start_eltorito.S +--- grub-0.97.orig/stage2/start_eltorito.S 2004-03-27 08:14:20.000000000 -0800 ++++ grub-0.97/stage2/start_eltorito.S 2006-05-28 20:31:17.770936712 -0700 +@@ -40,9 +40,9 @@ + #define ABS(x) (x-_start+BOOTSEC_LOCATION) + + #ifdef STAGE1_5 +-# define STAGE_ADDR 0x2000 ++# define STAGE_ADDR 0x2200 + #else +-# define STAGE_ADDR 0x8000 ++# define STAGE_ADDR 0x8200 + #endif /* STAGE1_5 */ + + /* Print message string */ +@@ -71,12 +71,14 @@ + . = _start + 8 /* Pad to file offset 8 */ + + /* This table gets filled in by mkisofs using the +- -boot-info-table option */ +-bi_pvd: .long 0xDEADBEEF /* LBA of primary volume descript */ +-bi_file: .long 0xDEADBEEF /* LBA of boot file */ +-bi_length: .long 0xDEADBEEF /* Length of boot file */ +-bi_csum: .long 0xDEADBEEF /* Checksum of boot file */ +-bi_reserved: .space (10*4) /* Reserved */ ++ -boot-info-table option If not, the values in this ++ table are default values that we can use to get us ++ what we need, at least under a certain set of assumptions. */ ++bi_pvd: .long 16 /* LBA of primary volume descript */ ++bi_file: .long 0 /* LBA of boot file */ ++bi_length: .long 0xDEADBEEF /* Length of boot file */ ++bi_csum: .long 0xDEADBEEF /* Checksum of boot file */ ++bi_reserved: .space (10*4) /* Reserved */ + + real_start: + xor %ax, %ax +@@ -92,10 +94,28 @@ + /* save drive reference first thing! */ + mov %dl, ABS(BootDrive) + +- /* print a notification message on the screen */ +- MSG(notification_string) ++ /* check if machine support IBM/MS int 13h extensions */ ++ mov $0x41, %ah ++ mov $0x55AA, %bx ++ int $0x13 ++ jnc load_image ++ ++ /* bios doesn't support int 13h extensions, print error messages */ ++ MSG(int13_error_string1) ++ MSG(notification_done) ++ MSG(int13_error_string2) ++ MSG(notification_done) ++ MSG(int13_error_string3) ++ MSG(notification_done) ++ /* even when bios says that it doesn't support int 13h ++ extensions, do not stop here and try to load image anyway, ++ because some bioses says that there isn't support for ++ extended functions but have the needed extended read function ++ (int 13h, function AH=42h) */ + + load_image: ++ /* print a notification message on the screen */ ++ MSG(notification_string) + /* Set up boot file sector, size, load address */ + mov ABS(bi_length), %eax + add $(ISO_SECTOR_SIZE-1), %eax +@@ -105,6 +125,8 @@ + mov %bx, %es + xor %bx, %bx + mov ABS(bi_file), %eax ++ inc %eax /* do not reload the first sector (this code) */ ++ dec %bp /* this way we have more room for code in stage1 */ + call getlinsec + mov %ds, %ax + mov %ax, %es +@@ -115,7 +137,7 @@ + mov $ABS(firstlist - BOOTSEC_LISTSIZE), %si + mov (%si), %ebp + mov ABS(BootDrive), %dl /* this makes sure %dl is our "boot" drive */ +- ljmp $0, $(STAGE_ADDR+SECTOR_SIZE) /* jump to main() in asm.S */ ++ ljmp $0, $(STAGE_ADDR) /* jump to main() in asm.S */ + + /* go here when you need to stop the machine hard after an error condition */ + stop: jmp stop +@@ -171,11 +193,11 @@ + */ + xint13: + movb $6, ABS(RetryCount) +- pushal + .try: ++ pushal + int $0x13 + jc 1f +- add $(8*4), %sp /* Clean up stack */ ++ popal /* Clean up stack */ + ret + 1: + mov %ah, %dl /* Save error code */ +@@ -276,6 +298,10 @@ + + read_error_string: .string "Read error 0x" + ++int13_error_string1: .string "Support for IBM/MS INT 13h extensions not found" ++int13_error_string2: .string "GRUB cannot be loaded if int 13h/function AH=42h isn't present" ++int13_error_string3: .string "Trying to load stage 2 anyway..." ++ + /* + * EBIOS disk address packet + */ +@@ -306,7 +332,8 @@ + .word 0 + .word 0 + +- . = _start + SECTOR_SIZE - BOOTSEC_LISTSIZE ++ /* size of the code we can place between main body and fixed top location */ ++ . = _start + 1536 - BOOTSEC_LISTSIZE + + /* fill the first data listing with the default */ + blocklist_default_start:/* this is the sector start parameter, in logical +@@ -321,6 +348,12 @@ + #endif + blocklist_default_seg: /* this is the segment of the starting address + to load the data into */ +- .word (STAGE_ADDR + SECTOR_SIZE) >> 4 ++ .word (STAGE_ADDR) >> 4 + + firstlist: /* this label has to be after the list data!!! */ ++ ++ /* this is a workaround to allow more code to be added in stage1, ++ it allows more code to be added for this stage, but for this ++ we can't reload the first sector. So we have to align the code ++ to ISO_SECTOR_SIZE. */ ++ . = _start + ISO_SECTOR_SIZE +diff -Naur grub-0.97.orig/util/grub-install.in grub-0.97/util/grub-install.in +--- grub-0.97.orig/util/grub-install.in 2004-07-24 11:57:31.000000000 -0700 ++++ grub-0.97/util/grub-install.in 2006-05-28 20:30:31.484088268 -0700 +@@ -336,6 +336,10 @@ + # Create a safe temporary file. + test -n "$mklog" && log_file=`$mklog` + ++ # Before all invocations of the grub shell, call sync to make sure ++ # the raw device is in sync with any bufferring in filesystems. ++ sync ++ + $grub_shell --batch $no_floppy --device-map=$device_map <$log_file + quit + EOF +@@ -450,6 +454,10 @@ + # Create a safe temporary file. + test -n "$mklog" && log_file=`$mklog` + ++# Before all invocations of the grub shell, call sync to make sure ++# the raw device is in sync with any bufferring in filesystems. ++sync ++ + # Now perform the installation. + $grub_shell --batch $no_floppy --device-map=$device_map <$log_file + root $root_drive diff --git a/src/patches/grub-gfxmenu-v8.diff b/src/patches/grub-gfxmenu-v8.diff deleted file mode 100644 index 6c4a429dc..000000000 --- a/src/patches/grub-gfxmenu-v8.diff +++ /dev/null @@ -1,994 +0,0 @@ ---- docs/grub.texi -+++ docs/grub.texi -@@ -2118,6 +2118,7 @@ - * default:: Set the default entry - * fallback:: Set the fallback entry - * hiddenmenu:: Hide the menu interface -+* gfxmenu:: Use graphical menu interface - * timeout:: Set the timeout - * title:: Start a menu entry - @end menu -@@ -2150,6 +2151,15 @@ - @end deffn - - -+@node gfxmenu -+@subsection gfxmenu -+ -+@deffn Command gfxmenu file -+Use the graphical menu interface. The graphics data are taken from -+@var{file} and must be created using 'mkbootmsg' from the gfxboot package. -+@end deffn -+ -+ - @node hiddenmenu - @subsection hiddenmenu - ---- grub/asmstub.c -+++ grub/asmstub.c -@@ -498,6 +498,32 @@ - return 0; - } - -+/* graphical menu functions . */ -+int -+gfx_init (gfx_data_t *gfx_data) -+{ -+ return 0; -+} -+ -+int -+gfx_done (gfx_data_t *gfx_data) -+{ -+ return 0; -+} -+ -+int -+gfx_input (gfx_data_t *gfx_data, int *menu_entry) -+{ -+ return 0; -+} -+ -+int -+gfx_setup_menu (gfx_data_t *gfx_data) -+{ -+ return 0; -+} -+ -+ - /* low-level timing info */ - int - getrtsecs (void) ---- stage2/asm.S -+++ stage2/asm.S -@@ -1614,6 +1614,286 @@ - popl %ebp - ret - -+ -+/* -+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ * -+ * graphical menu functions -+ * -+ */ -+ -+/* -+ * int gfx_init (gfx_data_t *gfx_data) -+ * -+ * init gfx things -+ * -+ * return vales: -+ * 0: ok -+ * 1: failed -+ * sets gfx_data->ok -+ */ -+ -+ENTRY(gfx_init) -+ pushl %ebp -+ movl %esp, %ebp -+ -+ pushl %edi -+ pushl %esi -+ pushl %ebx -+ -+ movl 8(%ebp),%edx -+ movl %edx,%edi -+ leal gfx_ofs_sys_cfg(%edx),%esi -+ andl $0xf,%edi -+ shrl $4,%edx -+ -+ pushl %ebp -+ -+ call EXT_C(prot_to_real) -+ .code16 -+ -+ pushw %ds -+ movw %dx,%ds -+ -+ lcall *gfx_ofs_jmp_table + 4 * 0 (%di) -+ -+ sbbl %ebx,%ebx -+ negl %ebx -+ -+ popw %ds -+ -+ DATA32 call EXT_C(real_to_prot) -+ .code32 -+ -+ popl %ebp -+ -+ movl %ebx,%eax -+ xorl $1,%ebx -+ movl 8(%ebp),%edx -+ movl %ebx,gfx_ofs_ok(%edx) -+ -+ popl %ebx -+ popl %esi -+ popl %edi -+ -+ popl %ebp -+ ret -+ -+ -+/* -+ * int gfx_done (gfx_data_t *gfx_data) -+ * -+ * shut down gfx things -+ * -+ * return vales: -+ * always 0 -+ * sets gfx_data->ok -+ */ -+ -+ENTRY(gfx_done) -+ pushl %ebp -+ movl %esp, %ebp -+ -+ pushl %edi -+ pushl %esi -+ pushl %ebx -+ -+ movl 8(%ebp),%edx -+ movl %edx,%ebx -+ andl $0xf,%ebx -+ shrl $4,%edx -+ -+ pushl %ebp -+ -+ call EXT_C(prot_to_real) -+ .code16 -+ -+ pushw %ds -+ -+ movw %dx,%ds -+ -+ lcall *gfx_ofs_jmp_table + 4 * 1 (%bx) -+ -+ popw %ds -+ -+ DATA32 call EXT_C(real_to_prot) -+ .code32 -+ -+ popl %ebp -+ -+ xorl %eax,%eax -+ movl 8(%ebp),%edx -+ movl %eax,gfx_ofs_ok(%edx) -+ -+ popl %ebx -+ popl %esi -+ popl %edi -+ -+ popl %ebp -+ ret -+ -+ -+/* -+ * int gfx_input (gfx_data_t *gfx_data, int *menu_entry) -+ * -+ * let user enter a command line -+ * -+ * uses gfx_data->cmdline as buffer -+ * -+ * return values: -+ * 1: abort -+ * 2: boot -+ * menu_entry: selected entry -+ */ -+ -+ENTRY(gfx_input) -+ pushl %ebp -+ movl %esp, %ebp -+ -+ pushl %edi -+ pushl %esi -+ pushl %ebx -+ -+ movl 8(%ebp),%edx -+ movl %edx,%ebx -+ leal gfx_ofs_sys_cfg(%edx),%esi -+ andl $0xf,%ebx -+ shrl $4,%edx -+ -+ pushl %ebp -+ -+ call EXT_C(prot_to_real) -+ .code16 -+ -+ pushw %ds -+ -+ movw %dx,%ds -+ -+ movl gfx_ofs_cmdline(%bx),%edi -+ movl gfx_ofs_cmdline_len(%bx),%ecx -+ movl gfx_ofs_timeout(%bx),%eax -+ imull $18,%eax -+ -+ lcall *gfx_ofs_jmp_table + 4 * 2 (%bx) -+ -+ movl %eax,%ecx -+ -+ popw %ds -+ -+ DATA32 call EXT_C(real_to_prot) -+ .code32 -+ -+ popl %ebp -+ -+ movl 12(%ebp),%edx -+ movl %ebx,(%edx) -+ -+ movl %ecx,%eax -+ -+ popl %ebx -+ popl %esi -+ popl %edi -+ -+ popl %ebp -+ ret -+ -+ -+/* -+ * int gfx_setup_menu (gfx_data_t *gfx_data) -+ * -+ * draw boot menu -+ * -+ * return values: -+ * always 0 -+ */ -+ -+/* menu entry descriptor */ -+#define menu_entries 0 -+#define menu_default 2 /* seg:ofs */ -+#define menu_ent_list 6 /* seg:ofs */ -+#define menu_ent_size 10 -+#define menu_arg_list 12 /* seg:ofs */ -+#define menu_arg_size 16 -+#define sizeof_menu_desc 18 -+ -+ENTRY(gfx_setup_menu) -+ pushl %ebp -+ movl %esp, %ebp -+ -+ pushl %edi -+ pushl %esi -+ pushl %ebx -+ -+ movl 8(%ebp),%edx -+ movl %edx,%ebx -+ andl $0xf,%ebx -+ shrl $4,%edx -+ -+ call EXT_C(prot_to_real) -+ .code16 -+ -+ pushw %ds -+ -+ movw %dx,%ds -+ shll $4,%edx -+ -+ subw $sizeof_menu_desc,%sp -+ movw %esp,%ebp -+ -+ movl gfx_ofs_menu_entries(%bx),%eax -+ movw %ax,menu_entries(%bp) -+ -+ movl gfx_ofs_menu_default_entry(%bx),%eax -+ subl %edx,%eax -+ movw %ax,menu_default(%bp) -+ movw %ds,menu_default+2(%bp) -+ -+ movl gfx_ofs_menu_list(%bx),%eax -+ subl %edx,%eax -+ movw %ax,menu_ent_list(%bp) -+ movw %ds,menu_ent_list+2(%bp) -+ -+ movl gfx_ofs_menu_entry_len(%bx),%eax -+ movw %ax,menu_ent_size(%bp) -+ -+ movl gfx_ofs_args_list(%bx),%eax -+ subl %edx,%eax -+ movw %ax,menu_arg_list(%bp) -+ movw %ds,menu_arg_list+2(%bp) -+ -+ movl gfx_ofs_args_entry_len(%bx),%eax -+ movw %ax,menu_arg_size(%bp) -+ -+ movl %ss,%esi -+ shll $4,%esi -+ addl %ebp,%esi -+ -+ lcall %ds: *gfx_ofs_jmp_table + 4 * 3 (%bx) -+ -+ addw $sizeof_menu_desc,%sp -+ -+ popw %ds -+ -+ DATA32 call EXT_C(real_to_prot) -+ .code32 -+ -+ xorl %eax,%eax -+ -+ popl %ebx -+ popl %esi -+ popl %edi -+ -+ popl %ebp -+ ret -+ -+ -+/* -+ * -+ * end graphics stuff -+ * -+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ */ -+ - - /* - * gateA20(int linear) ---- stage2/builtins.c -+++ stage2/builtins.c -@@ -63,6 +63,8 @@ - int fallback_entries[MAX_FALLBACK_ENTRIES]; - /* The number of current entry. */ - int current_entryno; -+/* graphics file */ -+char graphics_file[64]; - /* The address for Multiboot command-line buffer. */ - static char *mb_cmdline; - /* The password. */ -@@ -1351,6 +1353,26 @@ - }; - - -+/* graphics */ -+static int -+gfxmenu_func (char *arg, int flags) -+{ -+ memmove(graphics_file, arg, sizeof graphics_file - 1); -+ graphics_file[sizeof graphics_file - 1] = 0; -+ -+ return 0; -+} -+ -+static struct builtin builtin_gfxmenu = -+{ -+ "gfxmenu", -+ gfxmenu_func, -+ BUILTIN_MENU | BUILTIN_HELP_LIST, -+ "gfxmenu FILE", -+ "Use the graphical menu from FILE." -+}; -+ -+ - /* geometry */ - static int - geometry_func (char *arg, int flags) -@@ -4874,6 +4896,7 @@ - &builtin_find, - &builtin_fstest, - &builtin_geometry, -+ &builtin_gfxmenu, - &builtin_halt, - &builtin_help, - &builtin_hiddenmenu, ---- stage2/shared.h -+++ stage2/shared.h -@@ -374,6 +374,22 @@ - #endif /* WITHOUT_LIBC_STUBS */ - - -+/* see typedef gfx_data_t below */ -+#define gfx_ofs_ok 0x00 -+#define gfx_ofs_code_seg 0x04 -+#define gfx_ofs_jmp_table 0x08 -+#define gfx_ofs_sys_cfg 0x38 -+#define gfx_ofs_cmdline 0x6c -+#define gfx_ofs_cmdline_len 0x70 -+#define gfx_ofs_menu_list 0x74 -+#define gfx_ofs_menu_default_entry 0x78 -+#define gfx_ofs_menu_entries 0x7c -+#define gfx_ofs_menu_entry_len 0x80 -+#define gfx_ofs_args_list 0x84 -+#define gfx_ofs_args_entry_len 0x88 -+#define gfx_ofs_timeout 0x8c -+ -+ - #ifndef ASM_FILE - /* - * Below this should be ONLY defines and other constructs for C code. -@@ -595,6 +611,38 @@ - extern int default_entry; - extern int current_entryno; - -+ -+/* -+ * graphics menu stuff -+ * -+ * Note: gfx_data and all data referred to in it must lie within a 64k area. -+ */ -+typedef struct { -+ unsigned ok; /* set while we're in graphics mode */ -+ unsigned code_seg; /* code segment of binary graphics code */ -+ unsigned jmp_table[12]; /* link to graphics functions */ -+ unsigned char sys_cfg[52]; /* sys_cfg[0]: identifies boot loader (grub == 2) */ -+ char *cmdline; /* command line returned by gfx_input() */ -+ unsigned cmdline_len; /* length of the above */ -+ char *menu_list; /* list of menu entries, each of fixed length (menu_entry_len) */ -+ char *menu_default_entry; /* the default entry */ -+ unsigned menu_entries; /* number of entries in menu_list */ -+ unsigned menu_entry_len; /* one entry */ -+ char *args_list; /* same structure as menu_list, menu_entries entries */ -+ unsigned args_entry_len; /* one entry */ -+ unsigned timeout; /* in seconds (0: no timeout) */ -+} __attribute__ ((packed)) gfx_data_t; -+ -+extern gfx_data_t *graphics_data; -+ -+/* pointer to graphics image data */ -+extern char graphics_file[64]; -+ -+int gfx_init(gfx_data_t *gfx_data); -+int gfx_done(gfx_data_t *gfx_data); -+int gfx_input(gfx_data_t *gfx_data, int *menu_entry); -+int gfx_setup_menu(gfx_data_t *gfx_data); -+ - /* The constants for password types. */ - typedef enum - { ---- stage2/stage2.c -+++ stage2/stage2.c -@@ -22,6 +22,8 @@ - - grub_jmp_buf restart_env; - -+gfx_data_t *graphics_data; -+ - #if defined(PRESET_MENU_STRING) || defined(SUPPORT_DISKLESS) - - # if defined(PRESET_MENU_STRING) -@@ -310,6 +312,12 @@ - - if (! auth && password) - { -+ if (*graphics_file) -+ { -+ printf ("\ -+ WARNING: graphical menu doesn\'t work\ -+ in conjunction with the password feature\n" ); -+ } - printf ("\ - Press enter to boot the selected OS or \'p\' to enter a\n\ - password to unlock the next set of features."); -@@ -753,6 +761,493 @@ - } - - -+ -+#if 0 -+/* for debugging */ -+static void hexdump(unsigned char *buf, unsigned len) -+{ -+ int i, j = 0; -+ char s[17]; -+ unsigned addr = (unsigned) buf; -+ -+ s[16] = 0; -+ while(len--) { -+ i = buf[j]; -+ i = i & 0xff; -+ s[j & 15] = (i >= 0x20 && i <= 0x7e) ? i : '.'; -+ if(!(j & 15)) { -+ printf("%x ", j + addr); -+ } -+ if(!(j & 7) && (j & 15)) printf(" "); -+ /* stupid grub_printf */ -+ printf("%x", (i >> 4) & 0x0f); -+ printf("%x ", i & 0x0f); -+ if(!(++j & 15)) { -+ printf(" %s\n", s); -+ } -+ } -+ -+ if(j & 15) { -+ s[j & 15] = 0; -+ if(!(j & 8)) printf(" "); -+ i = 1 + 3 * (16 - (j & 15)); -+ while(i--) printf(" "); -+ printf("%s\n", s); -+ } -+} -+#endif -+ -+ -+/* kernel + (grub-)module options */ -+#define GFX_CMD_BUF_SIZE 512 -+ -+/* command line separator char */ -+#define GFX_CMD_SEP 1 -+ -+/* -+ * Go through config entry and find kernel args, if any. -+ * Put things into buf and return it. -+ */ -+static char *get_kernel_args(char *cfg, char *buf) -+{ -+ int i, j; -+ char *s, *t = "", *p, *t2; -+ -+ *(p = buf) = 0; -+ -+ for(j = 0; ; j++) { -+ s = get_entry(cfg, j, 0); -+ if(!*s) break; -+ if( -+ (!memcmp(s, "kernel", 6) || !memcmp(s, "module", 6)) && -+ (s[6] == ' ' || s[6] == '\t') -+ ) { -+ t = skip_to(0, s); -+ t2 = s[0] == 'm' ? strstr(t, "initrd") : NULL; -+ if(*t) t = skip_to(0, t); -+ if(t2 && t2 < t) break; /* module is likely a normal initrd -> skip */ -+ i = strlen(t); -+ if(p - buf + i > GFX_CMD_BUF_SIZE - 2) break; -+ *p++ = GFX_CMD_SEP; -+ strcpy(p, t); -+ p += i; -+ -+ continue; -+ } -+ } -+ -+ if(*buf) buf++; /* skip initial separator char */ -+ -+ return buf; -+} -+ -+ -+/* -+ * Check header and return code start offset. -+ */ -+static unsigned magic_ok(unsigned char *buf) -+{ -+ if( -+ *(unsigned *) buf == 0x0b2d97f00 && /* magic id */ -+ (buf[4] == 8) /* version 8 */ -+ ) { -+ return *(unsigned *) (buf + 8); -+ } -+ -+ return 0; -+} -+ -+ -+/* -+ * Search cpio archive for gfx file. -+ */ -+static unsigned find_file(unsigned char *buf, unsigned len, unsigned *gfx_file_start, unsigned *file_len) -+{ -+ unsigned i, fname_len, code_start = 0; -+ -+ *gfx_file_start = 0; -+ -+ for(i = 0; i < len;) { -+ if((len - i) >= 0x1a && (buf[i] + (buf[i + 1] << 8)) == 0x71c7) { -+ fname_len = *(unsigned short *) (buf + i + 20); -+ *file_len = *(unsigned short *) (buf + i + 24) + (*(unsigned short *) (buf + i + 22) << 16); -+ i += 26 + fname_len; -+ i = ((i + 1) & ~1); -+ if((code_start = magic_ok(buf + i))) { -+ *gfx_file_start = i; -+ return code_start; -+ } -+ i += *file_len; -+ i = ((i + 1) & ~1); -+ } -+ else { -+ break; -+ } -+ } -+ -+ return code_start; -+} -+ -+static inline unsigned char * stack_ptr(void) -+{ -+ unsigned char * u; -+ -+ asm("movl %%esp, %0" : "=r" (u)); -+ -+ return u; -+} -+ -+static void sleep(int delay) -+{ -+ int tick, last_tick = currticks(); -+ -+ delay *= 18; -+ -+ while(delay--) { -+ while((tick = currticks()) == last_tick) { } -+ last_tick = tick; -+ } -+} -+ -+static void wait_for_key() -+{ -+ printf("Press a key to continue..."); -+ getkey(); -+ printf("\r \r"); -+} -+ -+ -+/* -+ * Leave that much space on the heap. Everything else goes to the graphics -+ * functions. -+ * -+ * 0x2000 is _not_ enough -+ */ -+#define MIN_HEAP_SIZE 0x4000 -+#define MIN_GFX_FREE 0x1000 -+ -+#define SC_BOOTLOADER 0 -+#define SC_FAILSAFE 3 -+#define SC_SYSCONFIG_SIZE 4 -+#define SC_BOOTLOADER_SEG 8 -+#define SC_XMEM_0 24 -+#define SC_XMEM_1 26 -+#define SC_XMEM_2 28 -+#define SC_XMEM_3 30 -+#define SC_FILE 32 -+#define SC_ARCHIVE_START 36 -+#define SC_ARCHIVE_END 40 -+#define SC_MEM0_START 44 -+#define SC_MEM0_END 48 -+ -+/* -+ * Does normally not return. -+ */ -+static void -+run_graphics_menu (char *menu_entries, char *config_entries, int num_entries, -+ char *heap, int entryno) -+{ -+ unsigned char *buf, *buf_ext; -+ unsigned buf_size, buf_ext_size, code_start, file_start; -+ char *s, *t, *t2, *cfg, *new_config, *p; -+ char *saved_heap; -+ int i, j, max_len, gfx_file_size, verbose; -+ int selected_entry; -+ gfx_data_t *gfx_data; -+ char *cmd_buf; -+ unsigned mem0_start, mem0_end, file_len; -+ -+ /* -+ * check gfx_data_t struct offsets for consistency; gcc will optimize away -+ * the whole block -+ */ -+ -+ /* dummy function to make ld fail */ -+ { -+ extern void wrong_struct_size(void); -+ #define gfx_ofs_check(a) if(gfx_ofs_##a != (char *) &gfx_data->a - (char *) gfx_data) wrong_struct_size(); -+ gfx_ofs_check(ok); -+ gfx_ofs_check(code_seg); -+ gfx_ofs_check(jmp_table); -+ gfx_ofs_check(sys_cfg); -+ gfx_ofs_check(cmdline); -+ gfx_ofs_check(cmdline_len); -+ gfx_ofs_check(menu_list); -+ gfx_ofs_check(menu_default_entry); -+ gfx_ofs_check(menu_entries); -+ gfx_ofs_check(menu_entry_len); -+ gfx_ofs_check(args_list); -+ gfx_ofs_check(args_entry_len); -+ gfx_ofs_check(timeout); -+ #undef gfx_ofs_check -+ } -+ -+ if(!num_entries) return; -+ -+ graphics_data = gfx_data = (gfx_data_t *) heap; -+ heap += sizeof *gfx_data; -+ memset(gfx_data, 0, sizeof *gfx_data); -+ -+ gfx_data->sys_cfg[SC_BOOTLOADER] = 2; /* bootloader: grub */ -+ gfx_data->sys_cfg[SC_SYSCONFIG_SIZE] = 52; /* config data size */ -+ *(unsigned short *) (gfx_data->sys_cfg + SC_BOOTLOADER_SEG) = (unsigned) gfx_data >> 4; /* segment */ -+ gfx_data->sys_cfg[SC_XMEM_0] = 0x21; /* 1MB @ 2MB */ -+ gfx_data->sys_cfg[SC_XMEM_1] = 0x41; /* 1MB @ 4MB */ -+ verbose = (*(unsigned char *) 0x417) & 3 ? 1 : 0; /* SHIFT pressed */ -+ gfx_data->sys_cfg[SC_FAILSAFE] = verbose; -+ -+ gfx_data->timeout = grub_timeout >= 0 ? grub_timeout : 0; -+ -+ -+ /* setup command line edit buffer */ -+ -+ gfx_data->cmdline_len = 256; -+ -+ gfx_data->cmdline = heap; -+ heap += gfx_data->cmdline_len; -+ memset(gfx_data->cmdline, 0, gfx_data->cmdline_len); -+ -+ cmd_buf = heap; -+ heap += GFX_CMD_BUF_SIZE; -+ -+ /* setup menu entries */ -+ -+ for(i = max_len = 0; i < num_entries; i++) { -+ j = strlen(get_entry(menu_entries, i, 0)); -+ if(j > max_len) max_len = j; -+ } -+ -+ if(!max_len) return; -+ -+ gfx_data->menu_entry_len = max_len + 1; -+ gfx_data->menu_entries = num_entries; -+ -+ gfx_data->menu_list = heap; -+ heap += gfx_data->menu_entry_len * gfx_data->menu_entries; -+ -+ memset(gfx_data->menu_list, 0, gfx_data->menu_entry_len * gfx_data->menu_entries); -+ -+ for(i = 0; i < (int) gfx_data->menu_entries; i++) { -+ strcpy(gfx_data->menu_list + i * gfx_data->menu_entry_len, get_entry(menu_entries, i, 0)); -+ } -+ -+ gfx_data->menu_default_entry = gfx_data->menu_list + entryno * gfx_data->menu_entry_len; -+ -+ -+ /* setup list of kernel args */ -+ -+ for(i = max_len = 0; i < num_entries; i++) { -+ s = get_kernel_args(get_entry(config_entries, i, 1), cmd_buf); -+ j = strlen(s); -+ if(j > max_len) max_len = j; -+ } -+ -+ gfx_data->args_entry_len = max_len + 1; -+ -+ gfx_data->args_list = heap; -+ heap += gfx_data->args_entry_len * gfx_data->menu_entries; -+ -+ memset(gfx_data->args_list, 0, gfx_data->args_entry_len * gfx_data->menu_entries); -+ -+ for(i = 0; i < (int) gfx_data->menu_entries; i++) { -+ strcpy(gfx_data->args_list + i* gfx_data->args_entry_len, get_kernel_args(get_entry(config_entries, i, 1), cmd_buf)); -+ } -+ -+ -+ /* go back here when we no longer need the graphics data */ -+ saved_heap = heap; -+ -+ -+ /* get memory area to be used by graphics functions */ -+ -+ /* use 1MB starting at 2MB as file buffer */ -+ buf_ext = (unsigned char *) (2 << 20); -+ buf_ext_size = 1 << 20; -+ -+ /* must be 16-byte aligned */ -+ buf = (unsigned char *) (((unsigned) heap + 0xf) & ~0xf); -+ -+ buf_size = stack_ptr() - buf - MIN_HEAP_SIZE; -+ buf_size &= ~0xf; -+ -+ mem0_start = (unsigned) buf; -+ mem0_end = mem0_start + buf_size; -+ -+ if(verbose) { -+ printf("low memory 0x%x - 0x%x (%d bytes)\n", mem0_start, mem0_end, buf_size); -+ wait_for_key(); -+ } -+ -+ heap += buf_size; -+ -+ /* read the file */ -+ -+ if(!grub_open(graphics_file)) { -+ printf("%s: file not found\n", graphics_file); -+ sleep(5); -+ heap = saved_heap; -+ return; -+ } -+ -+ gfx_file_size = grub_read(buf_ext, buf_ext_size); -+ -+ grub_close(); -+ -+ if(gfx_file_size <= 0) { -+ printf("%s: read error\n", graphics_file); -+ sleep(5); -+ heap = saved_heap; -+ return; -+ } -+ -+ if(verbose) { -+ printf("%s: %d bytes (%d bytes left)\n", graphics_file, gfx_file_size, buf_ext_size - gfx_file_size); -+ wait_for_key(); -+ } -+ -+ /* locate file inside cpio archive */ -+ if(!(code_start = find_file(buf_ext, gfx_file_size, &file_start, &file_len))) { -+ printf("%s: invalid file format\n", graphics_file); -+ sleep(5); -+ heap = saved_heap; -+ return; -+ } -+ -+ if(verbose) { -+ printf("init: start 0x%x, len %d; code offset 0x%x\n", file_start, file_len, code_start); -+ wait_for_key(); -+ } -+ -+ if(file_len - code_start + MIN_GFX_FREE > buf_size) { -+ printf("not enough free memory: %d extra bytes need\n", file_len - code_start + MIN_GFX_FREE - buf_size); -+ sleep(5); -+ heap = saved_heap; -+ return; -+ } -+ -+ memcpy((void *) buf, (void *) (buf_ext + file_start + code_start), file_len - code_start); -+ -+ mem0_start += file_len - code_start; -+ mem0_start = (mem0_start + 3) & ~3; /* align */ -+ -+ /* init interface to graphics functions */ -+ -+ *(unsigned *) (gfx_data->sys_cfg + SC_FILE) = (unsigned) buf_ext + file_start; -+ *(unsigned *) (gfx_data->sys_cfg + SC_ARCHIVE_START) = (unsigned) buf_ext; -+ *(unsigned *) (gfx_data->sys_cfg + SC_ARCHIVE_END) = (unsigned) buf_ext + gfx_file_size; -+ *(unsigned *) (gfx_data->sys_cfg + SC_MEM0_START) = mem0_start; -+ *(unsigned *) (gfx_data->sys_cfg + SC_MEM0_END) = mem0_end; -+ -+ gfx_data->code_seg = (unsigned) buf >> 4; -+ -+ if(verbose) { -+ printf("init 0x%x, archive 0x%x - 0x%x, low mem 0x%x - 0x%x\ncode seg 0x%x\n", -+ (unsigned) buf_ext + file_start, -+ (unsigned) buf_ext, (unsigned) buf_ext + gfx_file_size, -+ mem0_start, mem0_end, gfx_data->code_seg -+ ); -+ wait_for_key(); -+ } -+ -+ for(i = 0; (unsigned) i < sizeof gfx_data->jmp_table / sizeof *gfx_data->jmp_table; i++) { -+ gfx_data->jmp_table[i] = (gfx_data->code_seg << 16) + ((unsigned short *) buf)[i]; -+ } -+ -+ if(verbose) { -+ for(i = 0; i < 12; i++) { -+ printf("%d: 0x%x\n", i, gfx_data->jmp_table[i]); -+ } -+ -+ for(i = 0; i < gfx_data->menu_entries; i++) { -+ printf("\"%s\" -- \"%s\"\n", -+ gfx_data->menu_list + i * gfx_data->menu_entry_len, -+ gfx_data->args_list + i * gfx_data->args_entry_len -+ ); -+ } -+ -+ printf("default: \"%s\"\n", gfx_data->menu_default_entry); -+ wait_for_key(); -+ } -+ -+ /* switch to graphics mode */ -+ -+ if(gfx_init(gfx_data)) { -+ printf("graphics initialization failed\n"); -+ sleep(5); -+ heap = saved_heap; -+ return; -+ } -+ -+ gfx_setup_menu(gfx_data); -+ -+ i = gfx_input(gfx_data, &selected_entry); -+ -+ /* ESC -> show text menu */ -+ if(i == 1) { -+ gfx_done(gfx_data); -+ grub_timeout = -1; -+ -+ heap = saved_heap; -+ return; -+ } -+ -+ gfx_done(gfx_data); -+ -+ heap = saved_heap; /* free most of the graphics data */ -+ -+ // printf("cmdline: >%s<, entry = %d\n", gfx_data->cmdline, selected_entry); -+ -+ if(selected_entry < 0 || selected_entry > num_entries) return; -+ -+ -+ /* create new config with modified kernel option */ -+ -+ cfg = get_entry(config_entries, selected_entry, 1); -+ -+ new_config = heap; -+ -+ for(p = gfx_data->cmdline, i = 0; ; i++) { -+ s = get_entry(cfg, i, 0); -+ if(!*s) { -+ if(!i) *heap++ = 0; -+ *heap++ = 0; -+ break; -+ } -+ /* note: must match get_kernel_args() */ -+ if( -+ (!memcmp(s, "kernel", 6) || !memcmp(s, "module", 6)) && -+ (s[6] == ' ' || s[6] == '\t') -+ ) { -+ t = skip_to(0, s); -+ t2 = s[0] == 'm' ? strstr(t, "initrd") : NULL; -+ if(*t) t = skip_to(0, t); -+ if(t2 && t2 < t) { /* module is likely a normal initrd -> skip */ -+ strcpy(heap, s); -+ heap += strlen(s) + 1; -+ continue; -+ } -+ memmove(heap, s, t - s); -+ heap += t - s; -+ *heap++ = ' '; -+ while(*p && *p != GFX_CMD_SEP) *heap++ = *p++; -+ *heap++ = 0; -+ if(*p == GFX_CMD_SEP) p++; -+ } -+ else { -+ strcpy(heap, s); -+ heap += strlen(s) + 1; -+ } -+ } -+ -+ *heap++ = 0; -+ -+ // hexdump(new_config, heap - new_config); -+ // getkey(); -+ -+ run_script(new_config, heap); -+} -+ -+ - static int - get_line_from_config (char *cmdline, int maxlen, int read_from_file) - { -@@ -1062,9 +1557,12 @@ - } - else - { -- /* Run menu interface. */ -- run_menu (menu_entries, config_entries, num_entries, -- menu_entries + menu_len, default_entry); -+ if (*graphics_file && !password && show_menu && grub_timeout) -+ { -+ run_graphics_menu(menu_entries, config_entries, num_entries,menu_entries + menu_len, default_entry); -+ } -+ /* Run menu interface. */ -+ run_menu (menu_entries, config_entries, num_entries, menu_entries + menu_len, default_entry); - } - } - } -- 2.39.2