From c06264e33062e9889a07b8dc2c28d2286a21b7b4 Mon Sep 17 00:00:00 2001 From: Eric Edgar Date: Mon, 4 Apr 2005 17:48:33 +0000 Subject: [PATCH] Initial import of Catalyst 2.0.0 git-svn-id: svn+ssh://svn.gentoo.org/var/svnroot/catalyst/trunk@573 d1e1f19c-881f-0410-ab34-b69fee027534 --- ChangeLog | 61 +- arch/arm.py | 5 +- catalyst | 16 +- livecd/cdtar/grub-memtest86+-cdtar.tar.bz2 | Bin 0 -> 105622 bytes livecd/cdtar/isolinux-2.11-cdtar.tar.bz2 | Bin 0 -> 8499 bytes .../isolinux-2.11-memtest86+-cdtar.tar.bz2 | Bin 0 -> 48346 bytes modules/catalyst_support.py | 47 +- modules/embedded_target.py | 154 +----- modules/generic_stage_target.py | 521 ++++++++++++++---- modules/grp_target.py | 12 +- modules/livecd_stage1_target.py | 21 +- modules/livecd_stage2_target.py | 326 ++--------- modules/netboot.py | 151 ----- modules/netboot_target.py | 140 +++++ modules/snapshot_target.py | 2 +- modules/stage1_target.py | 13 +- modules/stage4_target.py | 32 ++ modules/tinderbox_target.py | 8 +- targets/embedded/embedded-chroot.sh | 58 +- targets/embedded/embedded-controller.sh | 49 ++ targets/embedded/embedded-preclean-chroot.sh | 7 +- targets/embedded/embedded.sh | 67 --- targets/embedded/kmerge.sh | 84 --- targets/grp/grp-chroot.sh | 32 +- targets/grp/grp-controller.sh | 36 ++ targets/grp/grp-preclean-chroot.sh | 9 +- targets/grp/grp.sh | 42 -- targets/livecd-stage1/livecd-stage1-chroot.sh | 62 +-- .../livecd-stage1/livecd-stage1-controller.sh | 75 +++ .../livecd-stage1-preclean-chroot.sh | 8 +- targets/livecd-stage1/livecd-stage1.sh | 40 -- .../livecd-stage2/livecd-stage2-bootloader.sh | 189 +++++++ targets/livecd-stage2/livecd-stage2-cdfs.sh | 34 ++ .../livecd-stage2/livecd-stage2-controller.sh | 101 ++++ targets/livecd-stage2/livecd-stage2-iso.sh | 93 ++++ targets/livecd-stage2/unmerge.sh | 3 +- targets/netboot/netboot-busybox.sh | 28 - targets/netboot/netboot-combine.sh | 141 +++-- targets/netboot/netboot-image.sh | 125 +---- targets/netboot/netboot-kernel.sh | 76 --- targets/netboot/netboot-packages.sh | 43 -- targets/netboot/netboot-setup.sh | 21 - targets/netboot/netboot.sh | 93 ---- targets/stage1/build.py | 6 +- targets/stage1/stage1-chroot.sh | 76 +-- targets/stage1/stage1-controller.sh | 45 ++ ...n2-chroot.sh => stage1-preclean-chroot.sh} | 10 +- targets/stage1/stage1.sh | 72 --- targets/stage2/stage2-chroot.sh | 35 +- targets/stage2/stage2-controller.sh | 35 ++ targets/stage2/stage2-preclean-chroot.sh | 6 +- targets/stage2/stage2.sh | 32 -- targets/stage3/stage3-chroot.sh | 60 +- targets/stage3/stage3-controller.sh | 35 ++ targets/stage3/stage3-preclean-chroot.sh | 6 +- targets/stage3/stage3.sh | 32 -- targets/stage4/stage4-chroot.sh | 22 + targets/stage4/stage4-controller.sh | 35 ++ targets/stage4/stage4-preclean-chroot.sh | 6 + targets/support/chroot-functions.sh | 201 +++++++ targets/support/filesystem-functions.sh | 63 +++ targets/support/functions.sh | 147 +++++ targets/support/gamecdfs-update.sh | 16 + targets/support/kmerge.sh | 237 ++++++++ targets/support/livecdfs-update.sh | 211 +++++++ .../post-kmerge.sh} | 4 +- targets/support/pre-kmerge.sh | 27 + targets/tinderbox/tinderbox-chroot.sh | 25 +- targets/tinderbox/tinderbox-controller.sh | 30 + .../tinderbox/tinderbox-preclean-chroot.sh | 6 +- targets/tinderbox/tinderbox.sh | 31 -- 71 files changed, 2668 insertions(+), 1868 deletions(-) create mode 100644 livecd/cdtar/grub-memtest86+-cdtar.tar.bz2 create mode 100644 livecd/cdtar/isolinux-2.11-cdtar.tar.bz2 create mode 100644 livecd/cdtar/isolinux-2.11-memtest86+-cdtar.tar.bz2 delete mode 100644 modules/netboot.py create mode 100644 modules/netboot_target.py create mode 100644 modules/stage4_target.py create mode 100755 targets/embedded/embedded-controller.sh delete mode 100644 targets/embedded/embedded.sh delete mode 100644 targets/embedded/kmerge.sh create mode 100755 targets/grp/grp-controller.sh delete mode 100755 targets/grp/grp.sh create mode 100755 targets/livecd-stage1/livecd-stage1-controller.sh delete mode 100755 targets/livecd-stage1/livecd-stage1.sh create mode 100755 targets/livecd-stage2/livecd-stage2-bootloader.sh create mode 100755 targets/livecd-stage2/livecd-stage2-cdfs.sh create mode 100755 targets/livecd-stage2/livecd-stage2-controller.sh create mode 100755 targets/livecd-stage2/livecd-stage2-iso.sh delete mode 100644 targets/netboot/netboot-busybox.sh delete mode 100644 targets/netboot/netboot-kernel.sh delete mode 100644 targets/netboot/netboot-packages.sh delete mode 100644 targets/netboot/netboot-setup.sh delete mode 100644 targets/netboot/netboot.sh create mode 100755 targets/stage1/stage1-controller.sh rename targets/stage1/{stage1-preclean2-chroot.sh => stage1-preclean-chroot.sh} (66%) delete mode 100755 targets/stage1/stage1.sh create mode 100755 targets/stage2/stage2-controller.sh delete mode 100755 targets/stage2/stage2.sh create mode 100755 targets/stage3/stage3-controller.sh delete mode 100755 targets/stage3/stage3.sh create mode 100755 targets/stage4/stage4-chroot.sh create mode 100755 targets/stage4/stage4-controller.sh create mode 100755 targets/stage4/stage4-preclean-chroot.sh create mode 100755 targets/support/chroot-functions.sh create mode 100755 targets/support/filesystem-functions.sh create mode 100755 targets/support/functions.sh create mode 100755 targets/support/gamecdfs-update.sh create mode 100755 targets/support/kmerge.sh create mode 100755 targets/support/livecdfs-update.sh rename targets/{stage1/stage1-preclean1-chroot.sh => support/post-kmerge.sh} (55%) create mode 100755 targets/support/pre-kmerge.sh create mode 100755 targets/tinderbox/tinderbox-controller.sh delete mode 100755 targets/tinderbox/tinderbox.sh diff --git a/ChangeLog b/ChangeLog index 95b3786f..37332802 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,65 @@ # ChangeLog for gentoo/src/catalyst # Copyright 2002-2005 Gentoo Foundation; Distributed under the GPL v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/ChangeLog,v 1.198 2005/03/30 17:29:13 wolf31o2 Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/ChangeLog,v 1.199 2005/04/04 17:48:32 rocket Exp $ + + 04 Apr 2005; Eric Edgar catalyst, arch/arm.py, + +livecd/cdtar/grub-memtest86+-cdtar.tar.bz2, + +livecd/cdtar/isolinux-2.11-cdtar.tar.bz2, + +livecd/cdtar/isolinux-2.11-memtest86+-cdtar.tar.bz2, + -livecd/isogen/alpha-isogen.sh, -livecd/isogen/hppa-isogen.sh, + -livecd/isogen/ppc-isogen.sh, -livecd/isogen/sparc-isogen.sh, + -livecd/isogen/sparc64-isogen.sh, -livecd/isogen/x86-isogen.sh, + -livecd/runscript/alpha-archscript.sh, + -livecd/runscript/default-runscript.sh, + -livecd/runscript/hppa-archscript.sh, -livecd/runscript/ppc-archscript.sh, + -livecd/runscript/sparc-archscript.sh, -livecd/runscript/x86-archscript.sh, + -livecd/runscript-support/gamecdfs-update.sh, + -livecd/runscript-support/kmerge.sh, + -livecd/runscript-support/livecdfs-update.sh, + -livecd/runscript-support/post-kmerge.sh, + -livecd/runscript-support/pre-kmerge.sh, modules/catalyst_support.py, + modules/embedded_target.py, modules/generic_stage_target.py, + modules/grp_target.py, modules/livecd_stage1_target.py, + modules/livecd_stage2_target.py, -modules/netboot.py, + +modules/netboot_target.py, modules/snapshot_target.py, + modules/stage1_target.py, +modules/stage4_target.py, + modules/tinderbox_target.py, targets/embedded/embedded-chroot.sh, + +targets/embedded/embedded-controller.sh, + targets/embedded/embedded-preclean-chroot.sh, -targets/embedded/embedded.sh, + -targets/embedded/kmerge.sh, targets/grp/grp-chroot.sh, + +targets/grp/grp-controller.sh, targets/grp/grp-preclean-chroot.sh, + -targets/grp/grp.sh, targets/livecd-stage1/livecd-stage1-chroot.sh, + +targets/livecd-stage1/livecd-stage1-controller.sh, + targets/livecd-stage1/livecd-stage1-preclean-chroot.sh, + -targets/livecd-stage1/livecd-stage1.sh, + +targets/livecd-stage2/livecd-stage2-bootloader.sh, + +targets/livecd-stage2/livecd-stage2-cdfs.sh, + +targets/livecd-stage2/livecd-stage2-controller.sh, + +targets/livecd-stage2/livecd-stage2-iso.sh, + targets/livecd-stage2/unmerge.sh, -targets/netboot/netboot-busybox.sh, + targets/netboot/netboot-combine.sh, targets/netboot/netboot-image.sh, + -targets/netboot/netboot-kernel.sh, -targets/netboot/netboot-packages.sh, + -targets/netboot/netboot-setup.sh, -targets/netboot/netboot.sh, + targets/stage1/build.py, targets/stage1/stage1-chroot.sh, + +targets/stage1/stage1-controller.sh, + +targets/stage1/stage1-preclean-chroot.sh, + -targets/stage1/stage1-preclean1-chroot.sh, + -targets/stage1/stage1-preclean2-chroot.sh, -targets/stage1/stage1.sh, + targets/stage2/stage2-chroot.sh, +targets/stage2/stage2-controller.sh, + targets/stage2/stage2-preclean-chroot.sh, -targets/stage2/stage2.sh, + targets/stage3/stage3-chroot.sh, +targets/stage3/stage3-controller.sh, + targets/stage3/stage3-preclean-chroot.sh, -targets/stage3/stage3.sh, + +targets/stage4/stage4-chroot.sh, +targets/stage4/stage4-controller.sh, + +targets/stage4/stage4-preclean-chroot.sh, + +targets/support/chroot-functions.sh, + +targets/support/filesystem-functions.sh, +targets/support/functions.sh, + +targets/support/gamecdfs-update.sh, +targets/support/kmerge.sh, + +targets/support/livecdfs-update.sh, +targets/support/post-kmerge.sh, + +targets/support/pre-kmerge.sh, targets/tinderbox/tinderbox-chroot.sh, + +targets/tinderbox/tinderbox-controller.sh, + targets/tinderbox/tinderbox-preclean-chroot.sh, + -targets/tinderbox/tinderbox.sh: + Initial Import of Catalyst 2.0.0 30 Mar 2005; Chris Gianelloni livecd/runscript-support/livecdfs-update.sh: diff --git a/arch/arm.py b/arch/arm.py index 76b5fda2..a09a2065 100644 --- a/arch/arm.py +++ b/arch/arm.py @@ -1,6 +1,6 @@ # Copyright 1999-2005 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/arch/arm.py,v 1.4 2005/03/24 15:37:55 wolf31o2 Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/arch/arm.py,v 1.5 2005/04/04 17:48:32 rocket Exp $ import builder,os from catalyst_support import * @@ -13,7 +13,7 @@ class generic_arm(builder.generic): self.settings["CHROOT"]="chroot" self.settings["CFLAGS"]="-O2 -pipe" self.settings["CXXFLAGS"]="-O1 -pipe" - + class generic_armeb(builder.generic): "Abstract base class for all arm (big endian) builders" def __init__(self,myspec): @@ -56,4 +56,5 @@ def register(foo): "armv4l" : arch_armv4l, "armeb" : arch_armeb, "armv5b" : arch_armv5b + }) diff --git a/catalyst b/catalyst index 2afed1f5..ea5609db 100755 --- a/catalyst +++ b/catalyst @@ -1,14 +1,14 @@ #!/usr/bin/python # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/catalyst,v 1.68 2005/03/24 15:37:54 wolf31o2 Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/catalyst,v 1.69 2005/04/04 17:48:32 rocket Exp $ # Maintained in full by John Davis import os,sys,imp,string,getopt __maintainer__="Chris Gianelloni " -__version__="1.1.8" +__version__="2.0.0" conf_values={} @@ -109,6 +109,10 @@ def parse_config(myconfig): print "Autoresuming support enabled." conf_values["AUTORESUME"]="1" + if "purge" in string.split(conf_values["options"]): + print "Purge support enabled." + conf_values["PURGE"]="1" + if myconf.has_key("envscript"): print "Envscript support enabled." conf_values["ENVSCRIPT"]=myconf["envscript"] @@ -168,6 +172,8 @@ def build_target(addlargs, targetmap): raise CatalystError,"Target \""+addlargs["target"]+"\" not available." mytarget=targetmap[addlargs["target"]](conf_values, addlargs) + if conf_values.has_key("PURGE"): + mytarget.purge() mytarget.run() except CatalystError: @@ -189,7 +195,7 @@ if __name__ == "__main__": # parse out the command line arguments try: - opts,args = getopt.getopt(sys.argv[1:], "hvdc:C:f:FVs:", ["help", "version", "debug",\ + opts,args = getopt.getopt(sys.argv[1:], "xhvdc:C:f:FVs:", ["purge","help", "version", "debug",\ "config=", "cli=", "file=", "fetch", "verbose","snapshot="]) except getopt.GetoptError: @@ -269,7 +275,9 @@ if __name__ == "__main__": else: mycmdline.append("target=snapshot") mycmdline.append("version_stamp="+a) - + if o in ("--purge"): + conf_values["PURGE"]="1" + # import configuration file and import our main module using those settings parse_config(myconfig) sys.path.append(conf_values["sharedir"]+"/modules") diff --git a/livecd/cdtar/grub-memtest86+-cdtar.tar.bz2 b/livecd/cdtar/grub-memtest86+-cdtar.tar.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..2f44963e002db8e65248d7fa2a7fc9f2f326039f GIT binary patch literal 105622 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%0DSi`Uq)%%-Ix4|HS-8NcvWQku zD;6<~VAHdd_+s zwRIYqw0c3PwrE3IswMsItoxMhirFAWWQGWzL-fobLI*`C8sSCu{G@A8X`!03(2xw!rJ{ z+>OTW6{~vo!x5w9I1$ySC!+G%FiH#%Gg<)fh-5=a=hJdF(CIduXlu-6{)Xin(v#>}mU25WgeL~;oP`4*5s z^#`AEal&yx$SHnbH~zXuUj`|aKxYkT>DF9PGNmP`9WxA=>t@_OpT>^?WB>@og(+wC zlrBiYl8mhoutgO0-uUldk9PF;ABFFhi#uXLRolk&fx{b@Tc2f5zG%r*jXhKfIh`Dv z8OrBiR;CJ(_xk-6PI%-=skFx0G13*X(pCy>S57S&w5ma8E*t(-MR{xPOG6cD1iblDv!ff z>0$32`PH z8oegAn`1u+L&v2E8pME~_Cwh#>;~G!`RUh*{p&u7?xznK1KoaMwMX(~btLEzU9 z|JnAa_sv~hVOcO}l^6M3gQgSk$Lha+pDXTQ_nCcvc^4VnJ}hc^zZ!)RVo~C(p222I zZMh|9daoQmbB*e)di0WZTb3pt36%b znpXSIjRPjB*_E}F8YqpGE>clfrKJ@Cu9{V|HN?<+TU$|cu#U$@(bZCi%;Scr6d$7w_uTcj4-F+W9; z@vcw&VA}Qvfo%z+ge>sE2S^wSH7s}YfZ_~o=V{M7XS3Pt>oh$_l<+0d{O8C2`YqZe?8OUCBJ2MF)Oi>uq;Z69dL_CV(<`-psh-Y~Ph=gkxpw zJ!=5{_8bNY`VZXavnh!GOGysG0of@fb)-{_5ttP9C>#t9D}tH=uHO01%iOlly~g&? zVjYb>pCacBxa{%gZ|L$=L~#mk$a`R&ztXF`N* zq}zQPNzu012wVln^qj{p9h(8v#uAr#lr<(bG&(XSya4iD=NM za}S+r6NyFu@}`11O%n5N$E?89-3os4(!gQ($9!a5piG7YGJz-(_d45}@fS;_CDHAB z`E;$)JN!Cw+0E*JVhi!mew(s*?%eY+X^?&#A54D@1=Wtc=R?IPy734wBtpmqSV+b9 zSu6utdr3r#C$ohJ_N?|+K_1p80lvQV{OxHyQDuG9O2t+x2=Cp)1@EGh`r{>MeDc{ZnnTqmS1Yl}Jdk*7 zlCeL84i&Vb;brD-1;%+t)B)T7gabr1 z4P=Uz&5x_Xc5?-`MWqGeo%fucyRaema7lt_-1jgPX=PobxZVuyhj-u~kgPS{ding`jg@PRm z2`CmA-7ZF2m~Yf*pg8)DGXaG?Bw!3pQXXcb=_Q@EM5n0HG&Wa}fYoUb#;1=j@Ou8R z)H_gFgNIL;c->t$lE|PeRf>Wv|DBXYHQ~r+-hZde&j~jSGg74Fhgs5>>s<(JYr!vt z45}pt;=4@Ts?|*hxX!ml?Q@Y7mk7)@%LL9bmya;22JB$i4HPYrYi3^?dqZ+f0=!>{{9sV{r_oXq;SU z>kl5@Fc{cLLQQJgi-60gNq4~sj@<$Y8`Qfh&V=0JU0!D8F;v7{lGD)H#q1{@but;0 z84V`jVW@4o4jx{InoESY^K?o54&I*m;o!LWv0HOfbxq!BnNwG&)#~TBpz?gZtt$QU z2NRn8kNwX?{gls3oaY-jrw}xT#>_h1cKc(U4QKqXjT#P#5T1_GmhS-AvD9O2U(K?f zle3`xwD!zXVhDs&qM>*YG+_d+X}++j&K7X`E`V2qZv0Ya%w2ez8(`WUEIJBMHtF6~ z5#?0l+#OS64_Itb1rK^aW>f1vXO4T$h)5;mU@L19NjfUL{+<<9U3_$X=TPY&kP@n) z29XnWuxq$=Cu&e`Lvl>`Je}_Qi6kB-F01~3HWMBFKYxe$F)^XIJ|aD^*_{6r^fmSj zvDHIKgNUtJs4&_n*#A_Q1W=rS8G{*s(8|EN)!ueR`d{YTMOlLS`>(ypCOgVPOgXl@ zUa|s0u?`*X3vC*4!|Qa8X=pol<>5EA2B}~Xc6f;hA z#e*RW6%mg*!nq$WWvX!r*tk_-F(f=Llc%Ax4`|Q4Jb9y${|$z6gX}+M#8}l{c2qAt7j3Puu@0T&z4PYwjDOBDrIpBP!N8y>N4k3psuVp2~k7UT#c88bzbSlEj~BH9ue_UokI<~DFkhk^bnzKO_~kV#Dx+KFJ)=7zT)TiG!|H) z>_#^$Ep?T<&A+&@iJ6rze2FPt810GPsMy`?vQ{8BR`$A|PTH-(kPt4AB{$mxV33=A z;6(MI^y0I$*ijo$+$c8=q&h1**(l0YxFX3^ltUquTy4@qp}S%r?{$XxX5(7HtDb{c zv3OmxHW_87EovNE>Sh*i6Hlpil}8Z8Y*dm8Oh_^A*1F~}orwn5N6fphVTf2*igi;i zv|iN>G8+NgFfv7f)PYk$qIvMw zW-HI4Fk=`r(@Qj(r!Z`1x(_g&0z$B$h$|5-2zfBjW?UnYV0!MtrG}`?tkb;QIU=ma z&W?jcK<%;%HS2cU<9e_e@NFs~tOf$+5?sRz*IaWe ziqi?~(8fnJ-PPV%ymP+OQzZ7~*Q=(f3~ythEuibZv^UnN;y+F|I>tW#F`2A-ZOV_D$+&{-SPnamu#cD~7FEo{kF-uK1WO=cJ~>Bhd};`!5~Krz zsGR0Q1+i>U7J^2YJCwM9Znm|plaiI9)L!zDOUqbA(6Gjw>)p=HYkS8ovkX|rYOpGB z!Q)w^B?H#Dm`Fgm?U|6IkqIP}6W`d*T-}XoQXIm{URxt^6q{ynmy*oE<)!7tqfMDu zMg%~esw7b?1YjnlnMJOb+dG6SF$zRhs+Pi_1C{M3ES%Yir)F?GUYwQE6^6PT;7xAK z)|Rr%EGsI}@8jPo$Xac|A#gAf=WBzBQmtFpD&m4>JgBl%hG{UaHiecM9L{!uN?@TL zCm_zuf#&mP#SY3RDLRSHLC0kmV2FxPckIYeU@n-GS(6QE8JaB2CZ&-DaLkl^jRPLj zY-l+nAWO28mk~YvRN;#$2?#Do996Oxu0J4g_x| z7kfFbsV`SFZ39(+t#n9DDAaTmP-cw^$XI})YAo7SNT&FJR|;iIM46geP`$vwHHGRJ zi{#834dDls4)};EdwW`S-jk$Gy@nrvhU+>?d9$98I>Fpy%nbzQx-6A#@NFt8Z-iSd zNzIavOI=VbJgvhNSD5bB&s(eWOdxC+Sk*ITOPH2MlqQx*gwYRkI>ZFQuW16k8at+$ zqNce4^qcql^L9N3h;89_aC-XNp@_hII zN^ukKJy-4=ldHzCCO6HI%lEYH(x<0v}Ym ztP6(Kis><)`3mZP$9u;(Q)Gu@1yETy?jT-LY(dhN!b}D)l=Ca!TBwhGUjHAm@97nq zSMhY!ZKZ9uUa8B75(#Z6|l}uoq zcEBK!tvF|P1mFYTNzEz?-_Me|JcS%kIBfosZ%wsa8kYsb#_D-Ba;s2u$0)8ko&4j! zU=RF-E9T&gyRrB<%-sp#b!YKowA##Hj=o&6H;Fw4fyNPs+*dQMn}D$-fUtWQSGk9` zo-s~H`<`DLjq}3AzNHVc?|ygC7?4s*2q`C1pCM-H_0FC7e7Dyc7ryi*OR4UmAcjNh zq#-0WFAk5Ge24)evI@vDEQ*py5sU<35m^)}K@EiHWX{~`J>L5FY1oWs=&++E|098j!QOW) zA_uWIJ>b13a#|ar`=-8jaea52$74MS zhce4x&KjV`G{)Levub7#j@iCymoO-Z0NbRTI7*=@x4rqAeP6SBziKa-yZe{-x3a2P z-{&}LeyYeKt+m=Bzy^A6KUSWb6Skf}4QrtW$w&;@v`RXPZ{cQ$KO&I% z-&lZ>dFAJxFn#oP9)I#$SQ7?15NC93A-kgIo;gmYo?bgIh<;vRy+i`!Yz)KYRdAZR zu2h7pnmn9JjP_nwS=eO-o12*-dP~bRRk{cah0sulgqS}5?2I$ov@;sHV!@j!fM8b_ zsV@T!<_C+QL%~hJrtfE;Mp!)- ziX&Fa7@(4Z(4|_?WGxOQIcQy&14>jvCV(vGWOV>!OnOz!xO4DoW?7D6p#vI_VF?DZ zky51y5y3eD0||04LV$e2!d?x(7Ch6{xv|9jHOllr%G-VuQx+(yq&z+$^w zZPlyWY}LHk{#Ww<&vro&MQ4HIDypTWSN1<`e_`-?FYJ1Y_?fGQoxBVOstO*<+!}*s zqUB;Lb(?L3)dwG%fR?vkHZ?VAS|LN|*lRsjciH)Vm79_?4t@@qETp1HaxW8wzpaUE zHDN#qDyUDrW+HsgVb(|<2nbFvH;1jcY`OE(zGQQfCrH19lOFn$kArFYw#O*Xrt%GI z!a4V?ymKRCnUyRJLtY9rkm{&Ty#ju=@zWLAiVRcBpwFn$&nPeFK*V;xyx14yG73N9 zn^b+ec9QA4cW*avuc%`R zRIUsa>`^C@?)Kep7JY=QYKL1U?Im+35{EsPXJ+SeK?am5%@$Rf%S#A#2H9ki-|{P? zxlYv@+E%qMd66bklR@F)0~tWloZ55~m=7r|q$MOki6@3}sx--9pq|aya;jpoRjWcJ z3I-ua3!tiDrA!t5J<6r~{&}X`CBsZ?Wx$93AI1wWVFcNKcXOejM z<8M8iOi_@_r_R}76mH@x(8(!3#{PegwD4um;Yp#!@)vte{K(AGu|DM zwDdec_ndos#S}E1y}olbuwfUdKeyfPI?T(xXzy|C{Fx=1Uw=a_%ja9C>!`1%u)`k7 z)7-?$fwsviDI!6_xahLWuJ5_B8<@eBF29h4l)b-=w*YO35C^*UvNn+zAc_ZvIuqpP zLOpSg!ohR8b`sW{!JSAKvd-&t7OGRVC0Davbi?GePOX{fmyg+4%f$2fzH9J!zL)Oz zem}i~Dl578nfdvXz8r{`Cg{7vc5qPNJ1vJ$ z-AhK>;Q3zm>vz~g!cNg)hb_qK9a^Z~6h^JZ)&X&tYDS)NXzTB}w%cvE3D(vqzbNZr z1h&T6n~ydaQwF3yy6?&_YO3&fk%-9RnQmnJ2&Xr9-{b16mE6|u zdi2h^@O=1wgmwQ_+R?Yl0uU(#kc#igD6fm0f3&oEw6nXjGGD*Lm-^mU`dDtx3wNf! z2%bgN?(CCC-CeEDq*u3_!qE?PzpaAQF-SH>NQe-~#=S^JVAN=4r#mWT&agmoptsTQ z`m6=AMP$qS??A*hLg_W^dmtmj;0Z`CIt3AMirUllN zGAvhUh9RqnghPnFWwC@~Fl5GEfnW+bN&0xqcXikWHq3i=7{!c+t;iWwYmp)lV==l( zVrir-P)1w4!FAeMZ~$hIGJ|u{J+zP)f@U_enRaDlv1lx!&P^4~Xoj2f&#v)(MvW1( z{CpU*@?#oA>Ki|wqD=~a+p?Me;J2pcVKc>4-%0(PTkpZcdR|Qbzw3Ehufqd;sN8Gm zu7PLBoAlNC{eHETX8{XuzP@^EPx$SVHIqsMf&o_Bva>EHZ%TRn-ka-YiMGm;$)uJhRWbG)$HY;05HIcb>6>TVwezUPyNOV_Yq@OJyT z)pkYMx@5-@5@TWlg2=>}kogB0GecT9DCX!+p>aTBXc+IlCmBc4g8;sTM%3fuYL_nA zptR|rh9DHmj7%3azVgha^DRq=X2qsDIi$k95e5PX8q&avD@#F*8B1{^Fm3L0!9@Pe zu;1PdoyIDWVb7$!;hzK!so(CKoyp&1j?{>E*$un9hrQ7;z@uKQ%#yK73Q<7qWf%x@ zyrBcRlUi0q&~KLx-ln#bP?joEc&rUGNDQ5+ChZ_`1w=OpmLecb3#E8ui(wES*HkI$ zN_~FdoikLg}P}sM&Y@-E&?K?;~{aa{b=P`B?vt+WfKHn#yb~`gVUi z_zFZzC1nK(AS42qC5Z|U1r$(P!mu_}lj(h1Pu*?p1SeM0>3a6&@_y{ShxUPsAS%v} z#V@xB{n0NQ*n8bV$Z;4Qw~L@gUQQFz^28DTQ(VDN&NfF`RDqES>g8i?<#aXT z2^>>OHPKrqSnT<`Hg&7~iHakGyD1e^Ml4vxsbIm8V#6MJIzpn>rhy_h!1%v_ zU^XKL*EF+7Wt7xnlxJsYu|#DtBxy&o+-J9sAV|#nnS?Gd#_Ss4YoZ9>lWPJ)CjmAX zX1ztk&0b^Iac$RKq1zWvfAE*ek=^_4{kOb(tjFig)nq=t;y*+W!sny#epwxc{+9|c z5DnyUH+-&FD!hpy9=96&DR%1&v2ykw7Oh%gNvL`g>8PW2yC`+-aef!hU*VJUKdEiM zYaes3qj=h=UpZ!_lA*?*s( z@#0%+X{Pt#DIyu(80%w`^ex&e-fXq@iN1=oi}hg9vre%PRlDG{)u_ttm|$@7$xfd{ z%H*;TjK1ex2N3nU&hXl2cUZOd23QnfP%BTmPu>`mpJsTFFAnyBX@ql%&?zxxoS^_H z$H_BQKKp*U70M9qy}2vmq=4=ffB3UzQO>Vt-rXsFkt-q@9s# z!USMJkn!_AFJ79wJY#ZwR(SBffRrN063o=d)r(N3B7>6ImwP1oh%7(&lJoT6JV#FI z^|rX_Ti|d*?8;`oXS8;8Av%&tBU2eEslIA;I-N@rgF(1&2CHrlmf@!Kr18#^Rb4mS zTzh}a3x2Tnt%3>RG;&PAK*y*=bAuQyRCBKjJ?#B35H(SEA!&~EPq2_*>}k@gf9GRj1v zN+^J+%(N;?)k-mjsbJ55l|jZ7Xi|c%<&;J%vF>sG`{GlXA^0|k5Flk`Iyh31^|hJ1 zL3GCaZ#O_}WkK>3Nc3nV%$Q zcwlX?VaZu-%?u~N%01Y2PQ($(-qXws>WFv`=pZE3kVP=&@MSZ(+?mrSp5O~1$B3f$ z?Yh*}Y@I5}6q3@-2AHSJVEy1;A|PduIQI{?fDVxp*-Q-(^65sYN-2@Qk3 z2j7~TA_^Vzdj%#%fC_B<9}iR~5bqr!&Kbu!L|C@TiE*^XsGwm2Rm?bru74^!B^W7k z^Xy4Lsz|)@LP!u0o?f@Z*?2q57ApIc)NdZTeEP3H?7mIvRQ1*Ja2J?~Ts-z44~M!i zHJKI@DQz=$yid+BhXE>2D5AGiA&|gzJ#gif6F`v5b?8Eg7d9T4a_NTz9L3FW6NCOh z9{J=ZahXnLZo%8MVF?u2F4hw6`&D_FTP`yH>^dSrAQ1pW1d?@FpWHp-u^7ifi@@h( zL8#9@cay2gZ^pCUdyc^|vFH-`aXct3;!n9$ynyvpnkiC*%c)-O$C6q*W*m|(de4-$ zIV3%=J0&2KATU1F-ISpiid4*s;*b(`1mH!sZ7#>lOND7A3W;$+b>O^+XKYFIG83Ugum zjL!ce+ya=b1p`#$WmsYk$**2;$%A6y++ZM?z~(1IhPK`lt@&{b(s&%cequM>w^--C z0x*-Fe9q+PAvOjGrUJQ4h@9Ka29X2?DhD%Q0`1c;F7!vDZN-EbKgi6l^?CtclNN+1 zV{PWQkj7pquHq~=LZh9T*@W_0UI6l}+g#&2x}N_g-YcqMp}Nv^h>EbAQ2_e*-?Ht- zX>o!fl~*_#{dcidxLl@jD!OCXD+w@=)`WzyS)8=4RxE5A5y8so8V%CzTFSj^N-+i? zw)_r#TR(E7OLAJ8!!8FYc8Mu?E zd!F%iIhq0>jNpo)Kv2MoVc2Y<`(V;ZV^(Gx2&kSDBzv!a7#)|a)dzh0_d1Umg z*?My=^vA;L-j+&E;p?FtwN`6u9-!e<1V>RC$Jqck7?7=sM{h4P>V0dz`<4x#)N-B2 z+Wy`rm+S2@tL!#D^OyH|Pm_N8|HiG5K(K@gU$99ZLv)O~_*Mkc_@)wDSq0O;Rb|3O zu_t7JI&q(A)us{fIu4tF10wpwk%vt03>TX#fn74tr+=2H2A+@Fww?A%ZFfPtb_uUp z;O0`)I<|g%LfHsgX>tcx;P1}s7fqdZr1YWlA(942)7jC>T2BTidn@}AjEor)=RH#C zPM^(J$bCZ#w%O#8FmEI3W(^9&>>O^GYH$c0ftkK7xqde_Hc#QlBmx6{Z{r|Z_|qg6 z(I5TjN-#qh$VZn{atE0sd;e?qz8p;nIEsRVoshDYt71RmQz=PmC|%(~#>_40XzcnD zzocz)skY@8upc%WfhGS-D7 zIgVqRUSr_{hIFuR0+ucV)|l011SI6HjS7v0G|j9dm}sERQTi>{5)MN*u|i?{X%tA) z`3?m?{xymSATyIhALeto$98GWwP)PxTDsftF~buORh6APQ%F|E-tMcHfb>s%KZif6 zbB9)@1xn8qCo`rE>~tM#yoPJF=!tCy9@8efQiSv(f}p0cg0ZB509#R*mo*R_xYcY8pYw4& zN+c!_!d{TbJ9^8(Lk+DkD+8)y^Gv~eb_x*YajE7LIPh{tN%<(Awx+sB|J5(siWX&yOE?+1+1CoMeV(WB}!Cwbj1 zzVi;RhYNYp7;W*WK>mvFUvO0$e3R2_*o; zkfcKJe%jc5EmmPvf( zZpo)%j!~*7yY^p;y>t~LiSFo~5zX{*a_ImP2%w1~#Yn%-@nIaIlkvOfgz@|voBkeL z@;+8QcNbq{&Rnc~7L*if7d;R*n?`IxN%>rT#H_nrzR$0|M_mvYT#^38E+BU4(Y&jt z5y0r90u2;tlNKIQ`K%qz6OHOl7e%SQGR$la2B*oqzqG%7z>HWdQ*OM5qn|J|p&Z+d-jr$ZxM}R9 zBD=k93{I}=4^3^QQ-?yZG`k(6yA|kdJke*TL6~VQH&rM99J}V^6#9QBO3pt1+3@7W zgr3>0tL_shHqO%DPbcD5Jc#9{`G#mcroR!-3T)mr)7Bp&7Q474f?KjTzUJQwX?Q4` z$!+Sh)6$;qTz_#Bmy`VU9Ep6-;L5n3?oNv*aF=upSX^*ZO6gh!yz%F*-pa6H0~mIg zktk@(=R(t*a8zlLjgs+cbgS|;^Rt9N#{01!|1%gi-^9i+BzeV%Yly@#l{;Z{T~=Jp zJnZby3khuagmqH})vu~M1TyGV*A@+)*WiHro&5Zw_-n_@)7^s7d_-df+H+Q&}e1GLjpsGsASU4 zLBtw3G#x*_dXL%fr=Gz=w)GN6`^r90)%sm^ke(g>?Y%a4R95U3PK0;z2qfbtEO!hY z?dfCH5umI?j=Gu#&X)8RgwZDNcKyB<#4bOadUxj;w5aqU{ z`s}P9k5ldX3e$5k9Z+*;qd9I00EDEG8{|`qQLmu8uU&X#6#PGoJSN+Y^OrsAdpbS) zb^5YqZnnm6eNz5a}c&2z)WuHKQ;|^y||0@1dFjCRd;$$S-A&xY|bc{9h}`FvUoN78;QQp$h`Fy z{X;_&&rhW&)n5z@Lo?VS5Hl7SEtyi>Zd3Frx&gUzL(gaReZWq8SUFd+CNDrg|9ra=pPYuG#Gv z3Q(8Me4ZG0lX*BP=wu|fCv}G5FwB*#9{xYW;5K0OJFkC<7Ud~3jiF;|O665yO%7le z*c?P8msaXqVc~uiGK^mYWm>tReNNt=c+()*>l}VREujW*ThTK|_5;K9mzCE2Rc=q? zGXko-Jzu%G_EqK)WLVPo4G=Uy&YLGq({$XgO|kE~PQvq}LO-j1A_y1*H%S6uEk2ry zC`1S`p9{#PUt5jGy*YWyQ^MiTY*Y01npdQ5c<_rms7s!q0lIL}teA|b%nehEBt-cS zJ3^OXvvnQ=<)G8!MU?N+Km(Gyi@MEs3ysvU8^io1eQc^pAmt1kc8=Q}b zpq7ct1_urGJjYy^h}EPx*bSIaeg#POkiih@lsNC)C{eed1VAA?FH|1x$MO{=y!?A zQXedA`yEdEyKF0p%vOkQ0PBarmxB>b4osX6$Z+e2(dJ!-wg|v`4{!QwHfU8TpTd|1 z4n}_Ll1fk|fc(>AFk!QhZ$S}u>4=T%KHQ#K>bKRlo+a2 zK#NFfTT4mzR*Q`FnE85MM8EI{n9Xtnl%PMTlA`Fk_5Yc>9?179*urh9V9Pj8m;4N=1xc`-oVSQaBfr| zaM%vH0HATGAxJU@qXtBw6x^bFNk&yQ=~QY71hkT%Cxx&>ERwPUQprBYB|TeD*Z0_T zabO!VgHk|bLV#Kj7|2D70B7YSt0VN=A3dWpSWyao|Y1?eSd{No5ilj@|lDvEa-*Xq1X4F6`R194T+6E?4G-$;2-hx*cY z=#^e$>W5DChdCa-F~&W~R#JMM7HZ_QgPA=y-0&>j>A{;v-5ME>hWQPH&SGTZ5u-x8 zon6O^|Hcb0=B~*?K3k0JHW_2fD&5ggkHVIu5980sry0Npn1#oysXjnj>o4S5Qo@DO z`mx|A-uJ&h!Gl%nw|5Zh({}2OKRiz@&-X3M^`O2-2_%Gsq_4Zb>lMR#dUy1*17|lc zXJIh7@e$#e`X`cMd#5~$FhtshKN!$WF57b&^)3=*p6usL!cZodobqXLV}0?=`HjDW z=}k&yef%rldR61)N>;9-PyzCGq+z8S`5lihEn|eb$~^|?Z)JTRMiS1$ct4@)@7fn1 z(ZKTZ56E9#%yG3YcCQ-jI9Z9kC3({(%?9`BY5>AB$wrgO)kHDnotw^ey~ z-#eA_A6(Pl803E{a;w+vN|ldp<@UiYtMKAmQz*SN3vxI*$4Dn^X}*5Tfjfpl4`kOOE`N(nP$#=+;vKW=+)@K@!d6FcpPDzUM&8nqdgCAq0yd|B|0>spEw`9C8vcB>ilWnR-Dgt@wJOc1xRLOZB@wC;g)A zh{%M#0z`}{Bq%GBdjB2Zj)_ze-baYa2uE;;h z($HFP>LN$~^_DyAKjXlmCmE^jpxSsRY|D{AMu#Z;y>9&P6TR_x?85Xin0H^S|G#`t{`^6)Pi2D1Uq7eAE5tcd&XO3r2v~Or zghV1X|M($J_60^yHJ4}jtj8EsJjB1gq^a@$rV08`{WH*%sjBNgt1?gEmFC|iiF3^_ zN1edfHOlr|^+6Wke>uauam}et{hbmT3@b#^ll-q*Qk=awwXY)h8{u^lXL`S5Ve*sxei;|C=gRHIbtL}JESGz|q;SAe=d_0> z4em}^u31))Jb7M*ds@)pdIcQFxsXWuZ=)HIeCwm+WP?GasQAxGT?p0myRR3Ys{Owg z-J;7Zunkrootcek7w~z$hyTOezuK_5Wo7I+3^UqWkk^BvrwV&J;Li*P>q_3bHJ)s!@wTX`c^YuPwU)j_Yx0Ja5e+=z`N@OM2{4KA zCRuT*fOAa-+-gW}Qw${P08T)$zi=Y-kqY79_G;OCdbP#nF;0Fw+ib2> zBP@)z{cyALv?u@P#3-nMd7fhAzB?1~s#@aO-#F_i&(1O+UTXP6Gd*H2P)jpSQ6_J; z^((x_pEQVN-vQnt0}{ZIEZT@?dCyv3AKhZV2Q39H4=lJ3(2__|N4T6-i56Sv{w_{A zgRVjgi(yg4O~yqW8PG{a8HAA-Mg&ojk|oqcKOJ6bAjB1GAvyn*EPn=D{oiws{$8)w zhCFRub35idVNH)9wuzM0U8nq^Etibp7PN}S$9mpW)Wb(I4PiWD1wG>AFFhdWlm)a> zl%a_Dtm3dGDWw0i0|P>on5zr(^R6D+BDUKS%!0J+rCzf~Qi3(7z&GMQI+FdD9xq`!AZZ%?e-WhD^vs82c!kwA9hlaqll(#P>0Z%+6Fs zpgs)bh}H}k*>L~1$I=bss(#S+Pizoxj;9*&-`yTo44#XOKhk2K^-ZVROIB}`D1tJe zW3mx^oE%0I`-~;ns@$Cp9GL9%y4Ys-b%Fhd1sKYeWrM1)2y?pdzXUZ#Q}yWNiF5d5 zMHY$~aU0O-miu@JAsXg8NB9HckCo|g`A>=2f@8&{(PPad%JVzVh%Nw4=z1OAAjZzr z3lp2O7)N7kqhG?ou z;6L1q8~HRTO(AmFJ%HL7IIxmF317rnd3AChtyVKIT;w_m)|l3trXv_hA13O*6e+#; zb`=2pzwocY;pZyDi4ox$amJV6y5Dx zS{J8ZmfeL{%Hv!*;3Hr)$`%_q)rg%HE(0I`dA|YB!PDs_DRz&UoySz@SW%EL`f$96 zTCaT_%!la=xwHDZSm_!0akA!V&$ZIL?Zj=I>A}CFiZgK0QK`C?EB|@{*BbA6MEf|5 z&4B|ulhypi_SmW6yp90$s1t*o;Y@>NYXc%;UT)b)Q`t4Lv0DG*V&HfF=BaL3>0S?g z<25_98)4xHU`QRiBKyxdlZt2FOTushr81B^4-wptr|d_EoF9Iao#t?SGWK-SV|oG+ zgx;30*#jPHM%kjQL+mrW!O8q%EvwL&aY&5zCD!FI36Ufj8R(^XJqKM=hwiNRopsw_ z(DS?B-MIBTYw6d_v5v~ZFlFLuj-j}{{Ku3oK|gf)v&HKaNQ(SbP9=P?#!rs` zH`@IfKcjwBl*aT$5FL=$YI@w`wCexU-E^NW&R+z1wLCrLYsqdoe1#4F zygP{7?{&-Me63B4A-u|ZW)t)fJKA>Ov!-*n8E#=jIodH#8cWbtMH`_CK>ZN+UbIrl z3us0yh7w}wl&0RH%<^a|A+t%rxYn1 zpOc5wx@)#SZJuJ{9f%5g9WvB}++Qyl_6W%8NAwL6aiI0} zjIqkGR*EOUgAT*6&$W}Xn);0AaAIpPc0SF+62VxO4g721Kgq3&Du2ombLbcvB(Bdo ziDpJ8CC{z_SmTX%FgWGnw^My{hF(VClTLMhbfvhyl_LjrY15oG0c2Zu2)$q`Fez z8AM+dSuhYawC=xUnNkl3Bz>Ek$jfpSWXT|@ayTK?*_&>V_~qTxHjMm8QC{P+#ou@X z>8)GyZK+ z+zMkdoXgu-5Xmlia(vc$^>*iNT+9!dR=VU;LkR^L3WwAgSTG%q$a|BiBa3n8=?+vr z*Tu{C|Hfpya`-1Yi^)XhIJkwcHETCKv?oD+jLJhdB%$Z<^QXQpW!w;IcpAH|kPhT+ zzH9fQwVpKd3s3>-^{}`;jluN{S0Uw0z);TPhBnItmyps4gME}r%~LFKdB7sx=+tm6 zMYJiB@Dy&0q$2`JA>|6El1G(o76V_8kaRlEU&?vn3s1$8eER`O`J(~_M3`EnSt5** z3m^!c>jPOqMnPb(iy0CsV@Zq^NKl+(;o+b8zsLNnC)M9n#vJ4=1b}TmRKX0*0c<~6 z@r%XnQwG}~k(J+kY*vcNLGBbe`K~S5c9{Oz%g>bvp*B(7c=R`;q3tI7uylDn=dz)f zIC^d&)d^h1C83$izO0TTlnvm{Y*EDZqtX~{)sOB$ZMxk#xAuAmO7|YmC!!ngs3+@t zE#E^3A%8XgllOGxv#aIsFBe2lu^8%j09?I^g@ayqQ%APyy=Ht|FM9wL{t|nwPl)VQ zJoh(U(px+1bYS0a3_c2w?P3-)JfDr8xP8~b^ffEDm$4@& z{mNox+)Tqdo1KqPEXOV*bSI!Gzuot(j%Lmo)N*89%uGJbLd!w8p?YrS%}hO2bWI#B zJM?wYHRR~4a@mic0*huStKT&mcFchrmci>d9%r1h?s&c>CDcyUV5?<6Je368rGMNy z1cC$r)DREw&_8d5tgx?&q_=GVRKkM-L{ow(V2ULNmm|HCT|fwtHjqge-%Zc#Znr6A z=m)Ew89`D`5K*Rpwl5|sbUx# zhbA69C?n~aL|*}$jARe5{vSsrT2%~q?Cx|$V@|-mo__!2bft42!x9YEc;s+f>Jczq9 zdihKljQQ!HatP||6$h;)!ZI-;^njd)a$t!C8N|}*&V1SEmvjc3ehrcqOi%L_Y*Xt^ z-JKgwMy8FO7*8T$y>9xKVwBQ|BZ_4@oE7X{Q$O9o_y>Ex1{=-#IbqDUXyg}RFw;X{ z&=X&lZ{8wtH24lh?WnVr+GuVX=7fFj1(xT#l#zxZN|+QP3u3B-HZNJ5vYlI1mz}(Y zGM8osS0+iA^}5tGJISM~Qs&c=dI_CrvjO1PnWsvbKl^gRX>?@69ok`nIpjMJM()@w zFw08oeM8CTw-MA4lE~elTfd=y{4(}V?r*@H&Qwo3b(e}>jZ+RLWSBNZkY`hiv1zL= zKs?7F%rz!4tf}B7Co!iwt;X?bfj3sMnpt=-IrrkBT5yDkXX*UW7T7pOouLfW|lD$GBFvwlvm2N z7n@JU_1&EHIdNp;@aRx>Z|nCy%U<70^t36jcr%{+dItR$em80hhtUIOP96%$nZQS4 z#z$UyqUzW1G7~O$g9e9j)7y{cVDGF~;JyT#VS+k2ma1~RvgPL0P`TPR!Uq#{%-2C} zAKcsN&lC7F$f&FTOTz($YU2#9jHC?asVGxPV|HoTRY9ayVG_YlKLv`+e_Ze};J`74 z2*O^oYsUfnnuJ>IYSZ+1^SlA2W3>>-&VuPs=v=K?ryyZczGBNoVO3gje}{R&_Z7dQ zF<>0V2q04=B3U)Le+N^x_gvn@{t68DUw&)=c`!ZBgNKnpIROCQ`AODOY8}P^WUxJA;Vds(AkQ>Zo2AGa;=823e5U zGfjofccAlf_agL1;}7uQ31$zGaQ4to8RL@ASLZzC7xd5T?z3x%M)wzO=1LRz*~=&f zfH3};1hh?75R(B=FX?6Qn?I*|ge{Ck0^Kj-v5}rn7o##D;2>w_XSHIk(%v_;J;>no zktHRRYEAi6_x|H~wLWqlTZ{M9rPs%nCW`2T3KenRM`cHdt6#WzjcCwAC2SaIh47^K%eTbDSe)j^Ji>B5;sq|)9R_l}RK zyBRoh)eAVvF>e+^ZtW2`uimjFp``Rx_ZfA_a%;n8<7*0cQLTmtTzeHvRIn6L^-t1V z)+>%%3G7lXvi~sg$Yx#iXmm6;6|)PQIl2;m9LgZdO2Js|&r-=Bti%*qX}oh_{%vN- zB&df%bHfzfYFdHCr{8}E-A<%#IQi?bu|t&f5sBR23d?kcwycDlYL&F&mX6iwW;f7( zUDr=v%`DE_iJ!m1E%wSUw;os2=TVAkE{QU(g8K&Nl~lE@NcI*v(}MA_OumL}Hk^FqwEL@+;X4i^`$g3vZg61uECL8Q zmZdGdWB<3`FvW>?)AOWcv!a%XOx9*?8=0){<*jdHqbA`k49Gv!a7mC-k z_nF&HUeK^QN}2W*#oBA5mIizx^0r|mFm?HBG3d2bj#b9i?Oyy@H&cr0Z{+t0NaK61 zQ9O29^(N|6xUm5slbJ&7s!mGx9mBpW6h;QqgQz+dFv0FDNUaw~M_r}RD>DpAlQEfd z7b9*~(y}U0s@~30hOM91&e_f!F68i>Uv}PlO{+~@&!MYIoY7+pYi?(pm5%7%MbNNC zGwN&74A*n6tTVyVaKZDoBKShh)GoGYfy>V^JiC{Wofl4nHW`~s_a--*nXdlBl0v#9 zD4N{LgvhF>eala6@g^piVY(rKT<3!g_)OyoXV+keQDFgiONtQ2gb+Cy|1oDfsS? zkyXr6fPx8->eV~G<|toK=x_0Sg#RCj>&|zhlQgnYPX>R;({3wZJn5L$2VbkmW4!8a zI$lfW+1QxsF7k6!h1a+a!Ieoj<)0Oyl-Z)Qg}&xznPqmZXE4V=&8BE%^pSE2ruDkq zVM3LCjC_o7WyCoO!;~0_5`v=t*=dX7fwODaMXrxL6K{UoWr$? zUba%i&#ENEkzv-*V8@W70ED48CbHdFX1wi5wZg^*=Xa|TRE9_8p1E8$OmIsXg`h!b zE~&z4 zIKn}u=xe;!r`K6Jw1E3*h2CMq$3;3(zhuT*>pkW=Y+~1ZwF($iscD^p!ik8CtOx%? zS5sqfH%fCJmXMi$W(6ZcoG~kf1>z7>@ZP1M>QP-O+*jno#GghWv~cO_>1(s;@U=)7otU?kgWl*$$RfRdjrSx&9`6j>7sCp#JIql{8E;pMk_rAUCJBt$g6ony|vuHbRkO$}LzZYs)= zs7ZBFNy93`-L;fgTdvlAlSZF{Vza^P>6p z(G(te0|dw3$o?&vYPyWxj&#-3#wCr>PK(PY*lVqxSK?Dr*-VL9hKrBIGM6-L-veNQ zq;q_LDX5xC zBf!J75!pa*?W19!IC9%dc+~+s17k_3xj353HY;qD@c9+1XQO30TzcPGvm73$ZCU~l zETbn-8MuWtO!t!oh3LkF?%G*QTGzL7uuOq`(#N^pW)(VfQflox#G6wM;Ja!Cf>o^kari@|48&L|0hvp{2D5JVdLAYxP9S(^xj zjs!Ior&U$-P&A6g8$u;hwBEnfBQhCFXE!?u0k_3Qz1f3fPYG)5-mX)s)U6t9nz#xpy ziY*tAqjc!HYcr;@VFHIE;Q@Aw0BI;vQk(dsp-9poKH?Lm`)K84KG6q=o*{~42y?Q)FUqaGY9&ZE>XL z7OP`=#z1=2@-BtTsBKcyg;F)B=8}d{LdH59?f>d}U}O+ab9&n9c?WRIw>m^&xGNJ> zTQakER`qYYtxhWzdAYaX)J4h(_{|f{O!y126^j3BWLbO<*YU4pRgJ*C$SA*nJu% z_FCS?fah8|{)rVd@&Ht(GSB8c?Kvq?nqUk}XsT8g#cWi}%*@M~lVU8Ko9@_W=a|Lv zxus3D|Jl={olPDyOBDLu{KIJ$e>JQn5K{KuI0R%?F&LMDiDp-qOH?jY&@(J1CqiH< z%Skxq_}bNO%kOO>qPC`_f%v$448Wfj)j8goG`4?m#r^tofES`Kqq<5XO! z?!yI3$JLOu1TGjUObN!+LBMg(jvqzNLTJc%P0ZvO!u}tYFut+?`|BaA;upGUPQ2e{ zJQ&6!gL*bqmZ}{g^?7z4auM#|MRz!A_--o0dRC#$y85~vyL6z<{kT1-%f*SuOlRZu zf%Eg>FdVkH@?@A*)cYt4X$wXNmNE3Biz5Em3ed0tC?9@lB5^ml^yu>!P0_N>AZ9=) z3d=g0Wc`K#42H=Qjw}xlW~2^l|QpUlkU^N$4=XE0?l{ZR%0o3a~=zL z$4L0r`qrHe7l1oLM}&vwE3hDn`e#2LtCBv^6x9^mT=lfSQGp@tOmW6OzQ_8h?qDR& z2B+`o=QM;yW;Gk?R=6NAus^?FMQ?Oo$2Rc@P6rV~%rXQ(h&#~5ycVCxk#sKWtvPNEmJ{ zS_gmEoovYI>eHB>wo&FoA>`_`89lQ+^5*73o#26+&NiZU_3SBELlPh<(**cHr1Nmz zzlyT$uduxhy@-;4;bdM>VEg&p*y{M4&LYOT<_yDaLGv)^OsN6orE$*o@2I{Ol`_Cw z%)Cp?yN&R&|7$&V7TRZuc9PgmtXy>AV!mJ1y-4LoH{9=VcwOcN>1& zFD-(M9M^1$0^(HKCQNV4ccq(b|H1GfiCS~+3}ID1SwJHzQMOFEby;+b7DL;Rrrp&k zy0YdU(9mpIP-tVqKgfCm>Z{tsg7AXNY;<3JnHkEexzv z!e%V!C{ygtYXfVo3dVh^kQ+L47$}F#G0&Lw`rI$W-RZ;9JCQL2ye|kSoHM-){p%q+ zB{KORdEhM0%mzUfVK*i|2D42f;tdJom|V$t+xI$m3(G#`JN0LDa=;h9KMVMvS%I2i z2pPg)uQJe9=s1fTDsPkkKAylZG4;zF-)6}84Dc2uuz(?-y+AsBIuy9+UixJDHq@^J zqM3)}bAUA>GFae|w^k-O0#zJ8G*${C2MfC@C%@%17(?J!%FqYCPZlJpzXh_^=aNDZ zkTwl(4pVR_$DkFSRZY7=O(3x+3=Q6N?X8nxXob}Z;FG41?>>8u?i~6$A;jb&#J;$j zol!V%ANGEhv~rxpPGn0{n#E&dY;LJI8yLs?8=7Uv9$IYtp#1;d2A* z&J;%Tz|VNMm|Qjx3_UoY?)%8hK>pB4trtXmoh=D}wRn?z$YVh<4Xc0fzPV{h(Ivgx z3Ynkq;STC=#_?~k=NCAT7Wm4rY2RRXk1+fp71q^YgpaHv!t^`HEK8bC2x`Zi(GH{H zck1-OH^)bip`<(ikDj1zEEC=P2Q+(GQc03}U0pVhq=O%+$7NUes?))AkCR*rFoWA)hrqf8_Yw*>-QCmbb|yXULnX=SNC6LPloKSAV*L)ZBb72w(?_zjNdzwKZ&p z2vc5kDvXlUf_YsdBPYC6Uowe+eiWdvYJfwO!dAft9t>uG!#~&P@;%b}s**p+^#P+w z!4pEv!Pmt_45cRhVIpm1Eh*`_T!Z$us-nJwdVifY=B+v@M{DUE*Nu18i2Khfp1sh_ zYOCx-EO}C;`TLtbdBI|#__n%f(N4ch{%pZy7l{%|;`RJR!!3o1N67lL)g7`}v+~^v=^iH@K zgc##bj6N;SgJrF$GCU(x+ZUaDUs7h)k6e|0X%%L^a{4`&4r`j3UqUokryBq%5xd2t)$*RC#tG&%=cJG_o6Z;-bJe<)zs7Z^U}_kupo2{6XM6Z5 z;#J|flj?LFrKWMUlfa$V8nC+y!rDJot{p;}FXjXJtj{stuLp_VvFK}}1puQweAg`3 z?A3I!Sbnfn<1(n3s(g`x7xx^-1&n%Rc&|kv~ zbu1LSHvgWg90&wK$NB(fuj+L`ckniBrs6V%^7qgS$Ao~EZjs-QhT8yQeLmBT{IHL+ zf|+#FzB*@N5-Cee^q~WAAr^die?z%JK^^|!?>-kt> zG1K02R=3X$gY_-outsKN7=E93`Gy`tCY$Jh&#y5d-)P6nxW!1D%rEENt;}GW{F|z& zPNNn)l!!jC88}@~ZQ>4m{{3WbN;e&>bQgjPBy4rBsxKs;x39fZozCF&`1Si{G-V+t z1q`eDB18)h%PdIG_1vr2S+8Qk^>-mSybEf1%RRh`d1i;%CqEKGYz77p%}&6@2~tO`S<=sqQXuo-f(7=)gV+_B*wx z;Q-GN1138}s96d$jxY||Q}96^Z8I%V~) zqm!(jOI|MnzTEwOZ{99?%e6Q2x!q*UEj8S-$^;P1)kAGF!g16DE0hVb2m1Fs&Oe)$ zOkE6l@VK~k$VM-usbN7V0QDdW*WY)ISvUCO2^GDovu%-2p*N zSTJV*N*_^~GR$aR5?{UZ@I5vNMj$JoD1>8kiX)!QS(LA!_0L53aSAG$twMm?d7GwH z*ekEc$j)*53(w5EU}EW6)51XFr@Jaj9)gcJSaAqjN=$|+XPOPKe8(TFD)3yaqy}fw zV#iNQ;AtGa4~%OI3J2|ydW7TdOn%dh*UQ6Z`xJZ4ctxyjVPvNk6NZD)fmDvw@P8MW z-C@4;NSHY`qSp1_0en-{`&_KMDg`^}Ve$9s+N;JWa9U%^nOkbGOO+wWRrPA_CFSRD z4apZskz#YpS{!Zy6yU$tql-ZkfBrHT4@;ojQ^sZ>p1nAwucjQ)Xw$0yJp(^nx_uf= zBE$lKO+-3%M{Tb!NTwsp;|QP$;Ft|?>`-0xz=cP3o2X?BXCXWD8P*f$u6+ZTljS!! zr6(qz0YzlTGw>0DU(l)hNy@_Q5^iE)H4DyOv3!@yGn5P(I{JFpW2}C9YB|_op+TE0 zfeh`Mt11x$x55u4QO}P3l)o~NPLe&KLMQ%6e~?@$DnLBJ(t(YhuED_A_F9bj>xhj8 zjBqk+&p}vPaJ6}+Capf%mpL>#rgP{&0pfN3PcPB2hxL!Z?|3xU9GH`EYF|wo_TrdP{Jw)S{~HCHH`;LjSI~4B=A*SS zrZZy@gGs1ugK4ptGZ*##hii8-@{N9HlY_BjBwN2wFuiVPBrEfvqNJXNDx%avM?5_| z|3}%?ty%{4>?ha!hTVh6-UaAWmtOh=u6AI&>Fdj06ByfKoPq+>&#{TDWhmxtmN0id zHxwE^Lv>vZZfRnv{a|;j*?H{~=~mZ{Ygx+p9t>u7xZ2!=%h_C)Bp!-}+|#a{^Umpn zxQ&spxMVMnGfaXZsmASm7`PgYs5_Fus#r3p(_@X;8@<$TCYEI5exk2~7L?2ocg21G zu%Pm>l+I?gje?dr+ZL%rwSKVpUHvXAo!rGuijORx0<+*IL}FNt3j> z4BO0m5rds;`vlrE#B_vIPy*2*Iblzcy6va=)jMsLCN06ftRG1GLT6)w??y4^JMXu;xkJ*Yu^y1dWaxRF8M@kytUn zB2F_=Mc#BNHlF{DS1}gr9O^MWbt>02p#`HA$) zt&3HVat|ieBz}n4xEoI%5ya8h*P8y;6eO2Z4h%ThNq4N@M~1^}M24!V?9E15XIoAw zsaVY40}KyqJ*2+lxl@xZC_b}M@zqB%&@Xzmkgaj_4VC3+q+wiFwqQ0^&$8thdt$hV z5D@{-KBo>J)q@-yg-`27rmX)-J3k45wcCM;DJHb&G(EQi)Rc-dI!^ON{D~8Qc>L= zDZ>A+zw0Hq8hm-ERDkOK7H_iPODORbvoux-QzQp)D`YCy^PvjUn4_!e4(<9 z{FxTj$>34>PksS@xyrr4;jykV{$ta-JMbxBhyj>)XTmu*K4F%%)m8xlacmoR|@ag5UV0HkexbNso8rzQ{^vy?wv?0Ydp2E#}C<~mJbO`q15UcCf5^c1yB?T z5Vv)4i+p4z`-v4Sq+WhqVCXjoYV1X+|Lc_p00bty=x2V@?5PKyHa`Q#8Q7%Ide)*-Xc?u9FOL22vXjh}aG@whbO8!7vAzB7-|jPhJ}A zZdtGN)tJ7-+G<)OMu(oIgRP%puhrfYibC`bhNs)W=UwNbi(64T-2Md>);w=579{Bv zeszvM#L%ydlL-4`A6-5g2?Yw82SZ=b$+smlXQ!gVp?9#_M>y-BVuoc^min zE+5Qg4a;5|1^BDK&ts!8PmeLCF$R7rrms}R?Aag%vG~hT53t{xA_t7UX|XBe_|dD` zYne~lbPp`_64IuJ=yq#q&9CSzss;ox{qfb{f%vv{F}tPd>HC*2D_qZn=gV*VD+ks> zS5YA&^`((tUB!IoOFv8Q{g?b~%sm|h8mkqGt5a!Pd~`dKF&TSv%gOBN)k4;57hQQG*1Ex>3#1_Uu*vTk1O2%>wR|VJY(oB zTJYfA0|QT2Dd@=5D15~8ECvpPe1Lcy31wdIuk8H1u;?5k7+O&Aap%Ym0p=ML$EXzv z;5r&Zs??V^=dLxIvJf#^F_`KUW6SfY%y7<0Z;2-M!)?^+Rx0^&nK8eoj0*?mOM7d3 zVITKD1q?D0Qo_fSrTQuD&j5NE`a`8x4P$H949DS)*g+UGi)o+j^`Q z)8ltp{@PK>E>X+T-0tCCP^ezn(^|+K@1Ax9%2!-bz7jsX(K56h+`ts3g$xt|HK5g+ zLk*`gnnhg14Hs0%cS+wt*qa`5@b~2J#sjci&16mSq5ji5;Pb{i&!&ONhMp@IF<`;t z<84)hW3re903i{u2yGz(b%!%_CfgLfml6!;!FU5qF%3J}PU@>5dO;t>>R$o{_C`{={S0*h z9nqz#ptp|^p_$NEfo1rvPknJ8FSWrh8LX8E>sgIrhO%Yi#fec#zJbK26=NT6zU~1m z%ZQ;~Tz-=HFnY6}P`VxyjS$6(3ZF5<1goSJ9%j0x@_a)xKx?0|1d1MbItMh;ryW+2 zGuxG=1yu0%sd#IUPpy$AC}T;NqVY=yX3dyfnY6Izg@|nO6+B2`hK8aq8c@oPq#);p zS0_M{jYU#?AizQ30b(NL+64f-bMUDCS3RxtP{ofn(yW_IO6h zDrn;wwuoP+>i<>c{da@037wc!`wM2if(|4VwOKCV zV_RQyh9Ck`1h|m!7-GgU8aifeup^fMS}}8O9{WAACxol#%9JSTq-bs%p5hw?Tg#d& zvXrtIu=dTa!ke%8FoJZ;6-ES{V#i3OXmUwe^!uaSdWv1idWkakdY-MmLPBW1~ zCLNW0FQWYjUElodpu<;m8_8Di523YKsUY_GHxT5dGWv(|81axAiCLs&{M71dbt`-_ zg=ioQ1$c8mJFM{0gMhY&;GGMXDyP0xAeJb)Eo9!ql5{AyobLD zJVygvPoBd6fA{iOvo@F8kxMwN@Wtg;=pE2|;|1r@L0sVJ&~rbXIeF=S%%CAS?U?2} zDS1ZmEfbYk_}R-~Jb#$210QA-XguZ*x%9?u=fLMmgcR2!bVgI$eYL=paJt4!zhlnm z=5Zc>yJjPd^PXeIquyXtUl+l=otrT)6>8UCK>oz9@SlA**vcH|KCmi4twakB8K^@zyUvf z+h#7xW)@X&<71z*;cRNZ*e( z_Hq6gkEzgb|Am&kaf$-o0SEY2eeOmuj85iVXC;)ST37sf=%9bl$_z10EhT>bCb&p({6ox;Xz zN(l6F+&BN*F)z=d>aoVG5QJ2y?n~MqGQPx4;|>tiXRpftE>BTnEv}6_x;s|?t@guc zU~PxF1Ngb^%)C?ohYC4nNY*HTN_WTw=>m+z&r7jd!E4JNqOFN-mFqd`Xz`j_&q4n8 zr1AcUH^^Bic_@h`+>{A%_Ylq1$9&jgkMp(zJ0>k_)=NB2O)VI359($2AosiX6y$Sd zsZyr2IAi;!dG~e;nEcE+IXJJ-9ou6cEnQ_|1K)L0OLh>L+zmn1!2$g7+O_cf>{Sff zIKu=V*B0`Yle`_4nO{=MoQ(%k+ULD}+`L6n*Q#9dyu}fF(CpDN;A5jL`%fUPkx#4PI?sH`GpwCJn z6NPVo_|`0CB4{)klL-Gmq4)Za-Mt(zF(Jgf#KgYDb-{lqPBM2|J}w6)>#c%K2q}db zL@;X-G-s$6&ov3>zpH7v>J7A}x@`2~7kX*7{A-$MHnBG9ZHbO`~osSg;iM8gDE9d6gPS}@$#R`g{}Ov?9jr(vu_It(r{TTW}4~9?chF?f}rZZtMCrm)TJx> zpBp!{^568|Z!F1jkO(2IA(-c|3Ftbw=xiUh(nq7X`PMB4CdR{Z*J$4ioHo>iy5cfe zs?gVnIK>4J4uz!E?35ZVZvDSqulb(O?t81>?d4-nzQ&Uq8yfE=Mxk-X0RO!2B|&Fn zeh?-Zjv+;a3lqm5Bfk&fL&Q%utW|-++3uqdqJ&Blo!AYxPJMz-0bd4t zGpw2WGuiBE?_QtFD=RB2D)G4(!iX@W|6oH8=u~OUQVn=@O79ORD=52sH>0 zlxjGBXOZ``)cZ^sIjB!BXM#y6*fgL)$m5p^ z6XRsaSx?o_Vz%4MJTHk5!<-0?evXcgj%^*KoVF&^^ghVecyud3cL75AyO=3%Ple0IXR_!lyHijgzHLj6zi*$$HueObgK}e`!|rqm3}*=-f;KZ(_Cn93 zxQuhP8xM#mO0wNl2p&J_g2#IqjAJ52#EguLjEswI5Y|`i_?CA%$q7b$b(j}yeZ8-@ zpM{X;$-JqlkxUszGX7}#+|F+R;^mKYiQzbev~`{S8-5c7*JcIx6FIqxEMoK$YSq) zx7_>N&a}qiJv*wsB_GP~jQ`xgt}AL){5ESrmf+Oo>FnXy6c31v&?)@m`aj+IV{Kou zn?a~QwxDZ|r||jyBf+u$Y=3=r5&BgW~za;w*{Ld!sCy*bB@3zyhg33>oK}7&YDbn{J z@uAqywswDK)+>N zj;0+lw1fE{M}&itIYm^=|t;XC5OhX2swb6#uumQ?GISylsTeeK1I?b;PnE(M$5tto+xjFU{Dqg*I; zL0ejt9cRsRAnwwP;hx(mDn0b*nMB!y} zp6O6a>;GA6i1ICy#sP**2x=-siFn`x#t!#sdKA&H(J^HA)ULpgnYys<-R=QiZdNl0=S z)SPSl3dyQ&;BFM*H-&>+U8d1%i?IfK7#PPXGSHJHp<{>m2e`tM&lUx!L(iC_YO;VI z`q}C_N)tF<(^tFHy_$Q&mb!jSp4mk{bBe$*wK?{Zx!d~s+HNuZ-THu4nJ7yY246@y zoea+H?afA~Q-{#jZ_2@s_k%!LwAOO8^qU8c`w<(svgToVx%o4Wd`R^9FrZH?>}(Kv`0 z-5C(mK$5X0dp8v6#9(cjg(j^^+n!9Q9fb!=B}`R-A-tXyDS;c|64EYNu(t&b8tpSv z&LB!EtS4fC#O7aPW0qW4ZI|lAfJEBr5iUuqq(;Ld7mSW$2z9fiP?=%HN~&7^G6sNV zJj;DxMNC8;B0hJCED4QS2UHeAM|hZSUPXt8YS#(Qpvv&8 zetAj(;*SI!s@AjGXE|!0`g0Lf>sf1EBvw1OMi+li{rxxZbh_B}rq!!ftytZvW4qog z1r*Z&|Lo9=x(7cn!xfo*$O0AothSR&5)=`R)5QFHyjgk=x#@W@T#Dt(mo8jxyDor5 z;r*^Ngwe$6{J#b+QYpB_5FhEiLot z$y|SSv;bP0J5FzJ7dP3g9jB2suEikpk$aJtru-O9j5lk4rG0vpij|d>k+7|05)#0* z*fGv>5UC>J1b{=4uxt^JC}2n-0!fY~B$2FxCFWOeBY;^NQd`eRr5}a!l^d(<>pFbQ zN1ogN_mr4p*ZmWy65Oa(>Gy0{tCGQ(5WI^t8KIZ=GIO##&s&jvahFJD1JFz!-dIZk%7<+u%7L zQ_Ao*IWmeIoap;)<)dO#a0%SpePT<1R3B>F&@_vxR%k)Qh!4{8wo_=w!e?pr3|Mei ziBH~UpYML3tBw1=zjj06gsFE@E1)q1IDyd9oxz5TyzPe-Q}p6RudbebC-dpQdAv3&Q;^B2|Je zS;YbA{=ak6dRQB7<=cIs^?6aR@e*=zl5w!?2{{C4@mZO#+8x3XrSkj)@pm~L2A`b& z#8I+a!Xf-Yg%F>JL`Wx^xP$4 zcfMa?t-iH9onvz*UDt+V+qUgYZ0m|Ov2EM7HL)?VZBA_4w%^>(hxe$i{smpVcI|b- z@tp^eX3JTl`?yK?S_3-`DHL+OkpxSkfdv7JC@%=dGZZiHR8N8Sn;}M#^*ffwBt5or z`rBc9+An;${>x_F?A5Pj=pm;xWL@W$jY9_!dB*zHUSr9j)>3~Y$akmOcG@F-lGV}| zr?ZLQor@QYki!F$nacd4n~%!%f^aX_le3AO0BQ(2r>D6gNO>84k@I;BoDj9#6ZvkJ z4A}AfTQIoy)3M_O%z8FBW#kDeb68VMYP z5m!qF)lIwnZ?qXBix}-o^UpO~ZhIV1R-zXsbe)6*Zv*##=LL@xCk8Dt85PZ|rOwHL zkLAkn>ewd_ACaZAV=lp-yTN(kAe0NK&0>3NZ=Pj9=QQaSO4Q@z(05+chh-S3f9`Uc zz9n0$D{iO${7Og&O)&T(pP?J%Zj&w4 zYis1il_}%H=Dk|RDX48oMEv)T!TCjM6#7qGNj1zKmX>AnoRAV(F|e|B(E z_b94Oa}s>;Bw4MXP+FupPIBZa=FjdrUeJ>6m&EE#9A4tvyzMNY-z*?yKD@MZ%CAF6 zj3xNxXKV#DmobY2ZRhJr5nf5J%7x$nQ>$Q(?T(`8-MyKI)m&ZT9Vp^7tkuSca6|64 z1u{4$DrChV3mGW$B==S|Muop8Jd9#r+sg00UW1=MS$sdwMRd1XfG57%eS+qx^ymjF z2<(}flo1fTl~C}q9^+1Fdfwhl;oP!`=i~Wu&GNYbu)Y^V$GH=99T2hs7SV1(Iue$c z=`y`2j;JU{0vQ-BW{&V1T$Us--L{IB=nyiVC`i}w+v)EdNcGQLneHAVhT;Dh+Lno5 zH9QnZczdt$lZ8YZl;8*XgI1!5R9}$dj|h^*6&@TcL!|`FIGrwU9lO3~>i2QwgQ?M> zaOy9CHiUVilMvjTy8CmIZ=M@3)HKStL16*oe3VJi^p5yrR&`bAxTAO}J}~`)`F(Yi z(F2+F{Oy~eFm>$C4P{J5GR?{u5;;7_tnd9sEGTF=1_cu@%n*@$vw-{-8xhO>bJ0N}+hBIG^=uIIbOwkREBmL#P`%-Kb%!7eerxwFi^~41 z*rLo_Gkeei4rv;JxYB2K_QgEI5tS<{VqgKuWHik^sU>RUq1R(a5WS=2m%ExqDoy)S z^*N1;Z)P(*SiN|lIC-OCo5%LT*Ei+$r>!zW=<`2n%D_H>MHM^S0kGAfl6l?Eql23D z3&Ca}-ZqE>LUc(oB(NAMd$qX_93O7)Hmyr(+ZRxLfyC=5lTZo>wa8lZ3nOy1y>R$Q z``=<933T|~xnY!-)%D|Kr!J_pzQ&T&K<3&&N)1eXW?x&=EZsVxn;|&jSx9Al5(zg- z>yQ}xNnI#)NVFiq@<|Bq9xZcIbPbD_h;v(h6IYik@A$N{eqP*>S9juJV?+e#e7hA9 zT?WQ9^U`R`j)m%>P@*4PGL>qV%k=2PmR;naT)i_Z zyV9=M5L~DPq?UyvrxKbKD9BUz3zE5YdL7R=YavZ`6M#mVm;vMn#k~E1eHfQh_^nMR zU$&H2Tz}`XA^fR%m)~5vy$zraZ)VlEQ4p|B9P4Kq)*4EIj?Nn88f6eD{;BO){h(a#&7L&2kNt@iC+IJ$Y2 zw!OHby>m)QvnCdV>m=gSwRiO~Mu+I$ZBufQffgN=L@v7>{VWPh)d_*o2;cIHqKQA; zTE1yWRpl9>IXXA8@isQ75g7stO}^e+awF@uUk|QmNcOg|(z7Hr!H5$RI605XSah}Y z!=9%Lo#lj6aTW56ff&o4a#aV)RF4!}1Agwm!>BP_^dl6w&VsU_X*#R^Lz#&A-PKNJ zpxfbs;Y@<_1qBtpbji0fPIJMo=J$A`IMFNCBi!1;g9jjrwzUEl2P8~Y3Mdti0wfj& zhDI;*_4`B_^fk18jg2txR&VG#@w)HBH(gC)v>yDqEr~vbB;g^Xw4X<48g;^ zX^naLk}C(fX!ZK;uFS;voDOOV96yHCwB{jtXW`7IAexE`phNpMhV9^&=vFrPQEI|y z$q6*~Be9u-o_c&8Ib*29EMbktsHrGty5SS$KW9zJO}N}v!SjpkmpwR`YE0)#xd}H> z)W13Z;*%9n7R&?`nW{ns$$%3Jx@79Uw}^3zi>~qy1Tu+i?aTiZLszZBh47=o|-jxu=tBSrSsu z?Hq`pGdT?^;@aA*up3Y?>^n|?py@iTFVz_nBb&cMS$Lq0^|IpSiE)49x(o%liX%1< z-EW(c6;7;;(@t_G^}0{+Vd1<+hu%M8!3pk`U;uy>4Yd`1#ncP|j`O+Wwb%MBQ@zsf zvfMqIqTX-YNEqf$C}AjMVkktT&YT;aISj&?NpLWRc|+sf9ZqfU3@W~9#n76&*3b8sSNhi8+#a%^FGzmNZah&@T>M~8>Ae(O5G!FA(@VUGGy3%9BnwuDQ*rI z^~tm9OIDP&tND*{hV@h1XsOy{B{>@m`ooioJ?V5$`si;z_(;wuH39!(B%NCh{)q^G zUZL7tUKXDoRf^!v?U^bZLqVsQx%~LRV3%5bm+s`5*wv_3HC%cxQN)jYaLqrg21V0eJh`0x z)X_c#7K0(A&m)7ivgf3fMbr^y$b?DW2)}VUFi5I&th_^;zf*tN$BQI(z|jBr2!ELb zdy{>aA?{K4c|--=#VOz|Z|e7NS+QY{Aotki;Q?LPdr zIOlH|N6c5QM_H*+Rn<8$tnA`4IkecROGZOKk?07fGtMm3*Zvu(p^gduQ2-!%2QVNM z1|rBg6$MJ`=2+e_TLUs8^_EMobuBR?(sw)7jiWiE? zmD1p+c+yAw3vB}}!S#Uxth}oe$tcB?hAVuGGN%~lRwoUh#6SujZD~85RH#n_AO>Nx z{cuho!YSnaB$lg<8iV-u+j)nvXa9wV00|n&5FhE8%a4*49#Xu}q|3#E5@T>wU53h}lAl~G#1gF9hZ<=;s1+ zuozZ#u-#O8!+hVyD#7V7@hr_Q!RNO~*B#ratcH-PG%LcN z_$6bwi)(;)C)wP?Dj?NWQ$E%QV?Ck5)X3?uy|gpNQ3xy)CcKdg6_8J|48ZaqPS{zQ zJZ-PN2aq!VYo=eg)r<%eu>?3)EB<+Vf$M)4Oi_hHA`v8#BwpEk*^1@tJ|CLri7hGl zQu3t8}g`9t@Df*gLOo{Wsu!g~Hh7IBH06iPsoW>p!8cRZG13|Ax9?VQaM7wE$ zRugTGMG67+x-ZDGJ25daI6kory*^2EkL`vmMK>%D+Un1PvEA&uw!1pZ1=4XcH-M@& zMX+rbXdtUZX1Gl^xuC#0d9zG>Mubcxcpq@DpRRvgs^Oa3B>Z#R)18_p;)gILUATY$ zTWDmHiNSR3J@&`Vv-WtiI>XBi&dVLf-yhV?=^)x}U|FA+gBh7u9;m9zQps4t)Yp4( z*au9P;V=)?La@XZAURYvMZKm8)YqSG^QB?W4Wf=j@C4bkYcyZ`IK98+*Zh?tpWUJpSo3~hyGfxM+D|eUe-glnU&^ULC z%S}JLdI!RD3|l}Ha#Ex!*-l?I+-=XHx%nwykF(r!z;1%MZ{@o&l4O+?0)mXS7fDhq zTX? zbRrVO3&{YDK&%r$hp1r6vmG*qH=!Zy3ce)2DkH$4Oa)Jv3)lqQR#vi)Scm7X?X3$3 z;o|Ze1B1%C`;{&!uKX=un~dVMg~_vxDIM}`>K5H<)^IMxNSLiJ~Oo&{~Uyq;-DfK*#vIN=EFK>dlXCQG;`s3h=5ynW!m9e5^ zAtCnqk(Dcj6_d&}*`xaZAnC|OtWu$hVL30gWN)&NIg1n2%)L|49G_)fI>ElF+pk3A@| zcGYhfG9HFkl}d;)!cX>^3aqf@HF||In4eAh)a)y`YxEe0vi*+*EoQ#aDw}&{G665wmFLG37s2xH2{kb^&wxxql z3t!@dAy1tfH9x&@SG=|@K^!fjM!`h}Q6zYg;zq%FLx$z*c4#bjGnAomtpWS@qObzg z`u*?y{pQj58#EPJe-PI^ayfh7@HfHhL3>YLm48Rq3!E!3Ez*u1pU#k-=YXE(WyE;g zk#)sz3<+=uB>IYlE=)%B!9;y*fga8l4ME`=N{i5d$W}gg5bO!dFJov^wmRcm z@gRJx11tE&bi!A2A7i&LhvT>k-)9DsV)3lTbnE&^RCF)B%j9oVM-}yNLmvBR{#g6C zz>(}Fm%$Q3vT}7F5!xaDE-eq$?RG%N_S zpw({>{qw;PK%wpU3bm!u%jjlwia`-~_H&q-pzmf(9bk`?EZ@`$uPI7!!TzFYv7wR) z$KQSC_>PNTdq!Z>n77oh*xfPLyU(T;gvws!YH6w4B#Kj3bw4XbUBdKLjm&OSm2{WX zU@dljYspC_6`5?spqyt=B#OYlu9LTPj;$Ey>?bm$UP`4tckNQ|J;DC?=R-I1+kgv( zZCnNfbNl9P+6JaVhLsiQ;(KJ}C41t!`~Ap;(enl=y3*P~QW}mP&(SZWUuXpfNkc3- zD$T~kAV3lf%HdK#XZ;0t(Az10sZ|6;VF%E!F8)~XU5H5QNsV^4?#*wIv9~aQ|I(E4 z5W_ZLyb74?jGyOj@Mf=+sk-7Z;Xs$6AZIeNPUo0s%P(0%nM051fHYE`y?FBC`!h{J zr-1<}6|fg>%i*2A8ZIDNz>TeqEdj<|#v}{-q;*C*dvci~3d_xa7^E?H?i+(yCTYu5 zCd`{1{}(K*7P+(?5ep62^J`n?+Gp&rBZ~iUnEYYqieP?Q%*(HC3Pm$3+Y(ddC29Jl zc}n;sS-M}LZ?V`s0&BB|0?v2wALCmU2bwbi^0rX~tE_7bZ`IW4PHDCmL`)&FI7j@* zGeiQUVf0v`7UD%i>ln<+)EjJOO>E!ilx$Lk6{T9#hMEF41U0KL&NPL|O(QR^$;pC*e76>uyWLr~MODT9g=*<}1RY|g zA`Lv9-PeBXpPa;{YTYz;a%h2lh%mU0i17X-ac}EGM{Z_eT6m~qs$@u#M174dCvG)5 z6B=KU>N>ttnBxF)4_~x&t|uD)*tL^HA#!;}iro(`sXm9-Nh}Oi*$EHF%Z!9!_oRwB zh=!^D>~ow@Tz2dp!3G@3Gz93yKVS8@7Gm|#wDD#K;e=9L>qpAW{JJbSn@XmcFkkL59p$Wn+WsxWv zxT3-=l+PMDsn4TbzEA)0>_EC5$E3IRMtD5AR>eDCHmv2gx(pTM8Tmi-SgY>a75x+j+^fYolV8(jO?k!HI(&qvh1euYDkIznJ|XZi4lh__EQ4jUurmIgN}HZaG=fnfSqnkC=v;FZ zV(I1ZGX2+;jQvGD+@u;KsYJzwO76!%JPBcM0;U*OSGusnu(~&e@T#_FF-v#{_?{Gb z)76sOS@?O^Aub{UC+^$z^-p~v@^aQ>+U1o8h|zq~g@#?T(ATy;A?=I1b|<{378snL zUDm~CmKNNv3`cpWCX`W(17<^=D;G6oK1W4xzD7lR(1M(u?=~2|%VyB(;5;WGQXya= zq0#P>d|RzQV)vAUOp1PTaXE3=26(;H8axO7Qa%XP~y`ymTK;_XhY7zVQgP!QEG{ z;Br(6;_2}I-ey2(J4+O6qMxb2*oOles85oP*ex4%eHoHoUwf!(*$4(@hnLmX1Z18( zK2D9GoA2%MO^qLcN1=9032B7k)!QadnTkU8&9Y6_8D7rD3hB2qA1`H?d@%`_MH3ug zfIgV*@)Iy$+tR9YQ%PW@mR$IaQJfjC#`m7a%GtUIBb-W>NUyD#&4Z~7Tt)+ByN#>npDU=!|u|9)jTUG}_}&NqTT#2vdnOx2%LICP(MqMQKv=xguQP|hN@JP!+uBR&1Ls#ag>KY4 zFCNs$G{S)6T^~_6jikuIhPx+_Bl{EP_xa&ES9`yXZHsmaJ8@A;YkTa=|2=t&n>^Nh6|e0Z8=MsE`rJl3P`0S=aKa>f=NmGhT0k2qKl}o7MMM) zp+e4?B+lPoXl5uQ+_vU*FMa;Qd$HCXDoR}ls2c5%O%=4=@Q%$T>|G4dDgwBDB0R|< z!|R!6Bch>#+aV_`;ZL{l1BGGr3S{OFBptN6TfvASYAg~JSh$l#w(T=PjBopU+;e>p z8lj9Wht**Ds{yhsU(P;*g$?z%+mF<%=cT*p6b|$5e{2$hY!#%M8JI0j5fKCr{w)|8 zTVmE(RiU?&lM6vt7E4YvnIm=!K?rP;yn5MhHo?CK?fhBQ&1ybSZql&K>4>gylwC17 z*UE#=%*7P*@N>UmpkmRf0te=&hB?%L3%G?6F|m#p%$yl$6F|K8j(hz%%qLIGXGTz4 z0lTg)1sijPfz3Z>I|k> zh`3Q)N`40BqKe0O3XMuRWM|p!EHhSWZo)3t<65#LWaB9E9*sWLfQXvqXep^Qzuw=k zoCTiWd}hm6jlJ4gwwpit#dhsFUR#%NA_(l~I;i*#BUmPyAh6Z_Xp+vNEG>zVl%F1D zBF{Sf*u7Wzg)Usg6?a6=*+G0W&Eip}LY6x&@!HoUj&TBcXHuenHb>nKHMGcHf|*u| zMOv1YW)CYD1F>ci)!>uN-0TtIVi)20(v&2v5YkdTNwCaBru^I!oR;eY&>|eBbbgeW~Ka=={K@n-7L&{W45I zc)erw!YPpS0WSRuaZF(En6DwPNbLXLtu%4x3H$1>4WlV!1SMv|{3H7#O` z)B}66(O+oCB2SG3I0k+t)Z(e(fy!moLM`Qzf3%W=K6~tLGmbsh-2OVh`S9n$GQKNJ zEhzO@>x$oD_&Kf6UIYQv&>=w)K-GYRvPA!Q3 z979nUbQ;bfiXm-3O?2xC8W?a_^}@d{<{%e|>nb(S9hWW#cpaWFF8L}!6TSKDiP6A; zv0z|uI|cX8Y_jkHOnC=qu&s6cK`4+J z@qVu{GC#^&styWAH)%9UR}&~lLgJ9sL8}G)19b`gD#ui_^ z4x+wmLMdEY$09*86;^eHT|{{*EhETnwouDHX2T)`N`!Co%zIwIv2t#MverC=`+75u z)3Q|1Tb5+G>I|Am;x8yhZu$WP@g6sQeE(Q?c|v)_HJ*#-yekTpQw-X0f-4NOZq&O+ zgH5j#h%xl=x0WXVg_}zURnkUEF<6BJglXI2ZjCH-e61Xfz9onmKIocghA{@?`qq1O zm*Ba0v6U~{hb2A!9Cw8+-WT(?ZDpwrmsM>E^ ze&brNcm4Q0|Ef=PAMRBa%wsA_nflo%T(CgR2JLv+whfs`DL;zsp)7O=FTTw=ouc{J?glkal zMq$HR{P^2c^`sYg@S_1Mc05d=#DG)^%*Vr_p-lEKX%D^Qsf3}0|BDz=H&@QU1938{EE)(n}cC=aVV=diIpdYXH@qT~?$O8_c zb;y+I2I1G&R@!N0*Tdx;5d4h z!m4#3SrMKUZ9WQ+s$TFfDK?o1S5Ud0gw3_{k}rz^$mYuG)lP4F&X2I1M}5A`^ZOTc zab$6EaZa&|7(61gtCyNCJ*^%R$*oK`Sc#CZp!-5F$y*W?XtE&?f~X*z*~|d6B!pSw z%*js|35?!XLC@+AV0vLa^1o3zM2EOu$>Fh~h*C`)FW~!x^a|ZwW=H;}rR_p8sBLSC zGJqTI{^tKa*MoR0H}_(oy$)4OA#hARsI&Cc>eJS>z#ud0x%96*aXZ-`VC)o?Q+TzhTs^%v{sr@NMlGn2Gb>m{4A%+_Ku-q5LUt?|RUt!O&yu&om z_!~e|KI6szz$f6)-9j8X{g&RD+373$-{ez_{baz+HWu;01DPLE1oOIsodBt1R0{B3Wn}YOJGRy!=!a9RN73!Y~v!20(Zo4|m zxUt8vtD9e(PFX;i^=&IF*iz8#aiIdS(L&FJ4@KA<*kX)Hk`Gq z-h>1x)`kUSY#c2YQ%qFu@)aMwf{wwpMG!=O(OO%l$!bUByN%dRqldIvf4-6BYvOWqt#h(O{1K@$Rc2IorKX4CnAH1 z$W}8dqwT~ru?i=qQR!M98`wDGQgNH=XIS{bS|Hop%ei5fwdGOci7AN(P9>vcXEfH0 zwWxpD6ENXmj3ykT>9cJ{1Fr-PdgZ&Yt7@`KQdUssm$V(TKHxcU{bEDtx2gt#c|TrW z__*i96=81slevo8B*GHp*?s*_7;YN+cEeBWfA%6TN%h0h>#RkY&M4lI6tqTS^!M=Wti0Uob`F1=Ebg zQ)@8FfCZy(BM9750h_`q((ORl+`Jm6m>N(c84T)%-g~_qP4g zA@z)yMW*d2&yFjTQ9^1YaO$(}yiN1Om7Tn!>tljoWd9Nml0w7c*YY-RC9n)5q5Fjp z#3#Uoqw(+WMl>S4Uzh5ALA8K0nhD3N8sDO@*|v6_xhlov7(cqnERlkhU;-xf&Vpn_ zfLV#)$S|)=MT=@>wduYl(@gd(+dqDnSaA5mwr7MM7dLoOTLYM2)QZpZfX(#1M>;+( z1d77m)F;rK?DIbR!p6M@uGv{`CfZsjcDaQT%K9u-D_W~kx!R71uD_H$L&jr?Y>me& znYs2ivI6YXzXC}y37lP;-Rf zqERJFmkIMD3upUisRWwxRRx|C!&hZ&QrGd&sjL;_kUAAJr2a*kQ+6BGoW!KzF1nY7 zjP*3}E@-&2;)q9;0Y=LJa<)z(`j8O#PqHoHz5?gf09MOMqv=&`9<>gO2S?$;&})0P zi#_RtnkzVMYxcsy2d$iJs)>hAEVLB;Ej%T#^votr6`%v=OSxc741(%tQt#gMJcUXZ zY3`hDRB}@4-<-}~AJ|D_cTcOA66ZifY4Bb#W(ZjRjgFC}o#4Rs9u&IU-h8R3x%>XfBU4 zk&OzoCCw8X(GBaAfI>=y4|V;w^b9P}=$mv#lr@AzqId+C*)aIV<&p7zVNsh(n%)>C zP)>)wrWPx@p>g7UbX=v(A*_;lECWb3bIYkb6iJiGb?fo>xIar>3Wsw*HXxmMohYTE zWn&2%2?lxOp@j@%A9Cl%1tWwmMnWH~4NUFY6-;JwUzZnT2sl;N^q}!yKmWtMojD7V z3Kej}4qb#oo3ny2%{BikQsi6-FWDGe%}|m8*7e?Px-zqscr-x4MMW~X>`~s;b9Yd{ zSj|yH`2m;V^0YwTC}5u;q?m5fAm^?^eX4#*Fvr9h)_KnlS!^Z#0LVeE-f&RLAmDF7 zM~&kegj8)cR}ArH+0p5=mT1!7KB!nTR`UrM-amFdu>QRppPNP3>tHX;3aQ*spQb(C zx@cC}6mDMQzhU-p*ch29U2H3oFSy}GJF3) zR8_{#C!BO$N3jy{>{JiTMoAPn5cF1O%(f@fSo0(tlVjq4A1i%fHx!^q)+iiVoWFL` zyp#Ic>R8)4;!!q;%Se`aOdxE4eZEoBY`QV-cTR!!HtRY)rTxV7y1LGuab|W{W#(Jb zoT5IycugL;`fkZMT3P=Wv(7$JgnL9)1nUqAPVkRr#Mu)#%PmWGf|^ltFn&~St%2k^ zRU)ocXSXiJ6eBEK_)wiX=lVe6{eZ(j`D;G^N-GWn)Vk`P-X|p&nmN3Rqu5KXVv@g) zFr{0!7P&Zh#e|yDH|65)?B)Vtp%VRJX7B^vJyr2N$wcfPqI^NW@lPg=4K->phIhrN zd7f&bb}X;LmIw%xQANA$i4crNKB-Bv1)Z+mEQ2TQcI0z_b!Q)hG)=yJucx#cDC~D~ zstTmSBTvV)0(N=h-h=v$+bezP>x0YkBDm=RF zme_V)hbSHzEJ+6)Zb+UQ(c`~@qbZw;zN_Vi?_a&v{1`8DN(o^w#9K68FemM(2=3~P zNL_%MhD-PR;Bj#)1B;!0o0zI8nCI5KE9N>4A%dX4n^=Kk@Ux@IpN2}Lcd?wb#CcSJ zUi~|9B#ufA*^)vUI1!v)d!imvvv@HChk!1*!&(>U8t(AYus$4y&@?OnJ^TopdA)r4 z!`D5aen+rL*C|^U*?YbR!y|Y|r6vY09S9TnJLG~;z1+(z!uNc_MXI_>CT(#lU~cy3Rta=&_X_Z76V->Akp7Q|sqSiG}{W*HL=g$=2V^s!`| zRJbfOywo!#pF7k^PiHWnC$wW^Mas`r4SBHz{yEt!(__H^xXB^KGQK5XbbC4e`HYbk z!g=}>itB3LVl6I6k6y8ZctXLI0epr;!`n1o`5|squ8PPkQ1b$5V=C)dx5fR3f&!m&}t+{IsYH>g073T%^>HSHgJ#V*!*Vm` zmHO8Gp9`jkg0o_WLc4^YAoWa~?nM5)hWu4kzJH#2r zAoh;+)}!E4a#z%0C>N%71oL&`M{ zCUIo=%NoXk*rTA~3t#h}fA=y0;SOT)POK+7kuli3!l@(lRB4+se>&p2)X9DU1>qLe z`-8EL%RH`mX$LM_Y-e3Vk0Z+g%gM=}Wm+bi=PCo2^a=AAvf87jv84SYAz0<_iwZrl z7~aA9-6{;999NBtqr&RhQ0Im_(R+yYOY>6eyGcNie|L@JOGHLmVTny?E zlsppTQ%R+FOeccC5$w1rDpw6DL^#?+tS%1z^4XI$<6>TGy(kllTi~vC&)Aa^JlYE| zb@K?JNy^>=@KZ4QhkMcIM`I^!-`qaK(G!fjr!yM6i}b)U-)&B76~-Hj#^p5&T!O4q z-%5i_g;0&55)RTSF_S#Q<#FJcq6+S~($FKR!t2Z&Z>5HPwKpDPuv@73<4mE`HGEQc z5g-z!s78*S<;ceZu~Ld9ov+nTKuf}$WJuAiS4?VuGqlymZTm4k!iZ8NACxd*k-53K z(T`;V$OMY@Pt?9&QrQ=-ObXZiOV_%nkBK=ptVTd0teu+z=!UzGUD)o6>pQLW{(dhk z@d^Xoav{EUD)TFvXw@iP#XEtB_g8oc#@o6%Mp-2+KAnvoMf+5lB zXG1cS@7rPD(=R-zreX ziS$&u`?vpF$l&iPHP~N>ZHg*lLxUiOpcT&gdf%gql3*R#(CUJ19@}(&P9HtyUe15( zz4hokZfzo5cjZ5IcZLeceLHf`)hgB3*DKYxkdeSTCxa1l(-z<%y^VrP2}8nOO8^&E zn(eVUX7eM0_z#1ZcY0vBgduFf)d(pCu|V3sm2yhCK9u%f`e-HLXjj)~0-z0HlH7O}6@f3J9V^e+S zUUw~dSPsm+$LJRiJtwSfZ-zY4v; zBpTjJGV0TClY~VgMqJSUFBpaiEfi%;dM=g6c!)`cCKXsU0V5;8h({|~P{>u@@8M%u za6M|n_~Jb^n5*8l0Jk;;{^mF)aV%@K0kL{p^0TwY!GI4{+;|I!E-CI=@6}-Qt?m1X z1e8)_YSx~Wx0`UnpxCc-&CfTkmS7sUhP3$=T!$a2V(x+Y8zv+K{AFBKzc6F08YS(vqC6)$HhW|mp9L?Kq zoPTXxmE{bLfx`S+J&2^5@T(UfpTEX$0qh9YXzOS8rXx1icNpMv|8mTeD!Jy6o&*4R zPaBu_;)W*1spT%7embJG2x`#n zyYKy;JfoNIq8ooJSBtwX>#S-_x-?sGeW9|}UD{{!J1hMq5#Sen-9788`s?t+4Jr%W zB?p-@E0BU5Idu3PS~v+AG7)5bKk=8YH3%8xo_}f2d-jPBhTUPqgAai~w(j)KH0Jp? zLq;z5K||#CkpnMYb}@U{NYIX>OXF&{Tk-mu+(Ep5Oau_)xZ>ImOZEOc9~Mja$x9RV zp53onFq(XoJU9d{=Idm}26UF%gDMa+6vIJ>g33KF;CBE$G)8i2@aLUyH%}PQFfHRq zSp)7>G=x3-XL=7jAINP$wQ9b*NK&2exsLc(SCU_$Bb*0?Vf^5x#@=9;h_g% zh<9=1EA}Iu22PJK3axpKevzz+IC{2ZytNHQSpEHR5N!p1N?^6yf+&S?+*6XYgNz}D zP{d^;hP*X8{oxvqyH$%MU4R+5zb#YlP0?z0bybmwBay9Ux|D42i~%T6KVUPJmI6xc zCkqQ+NTI!Pg~CUA_@w$%p}%P)WJ*{yz+3))>|bXs<9xxJ&h&V8G)p776`TrV!z|Qt7z&f^xGis3H1B3@3Y-bSzWQ~ z)RWIPE}(9ENO0Yc(;WV2T-Qr%Ij`ZpEw}XAPUKa#Kv?*H{>N|KNG_GrhWKROl_8vN zaiE*2Vk{He%BM^{k*cm|-^wAYY8o%2Gq9nnB1y?)60u8g&&F5X1c4=AGB8gXrKu;c zv{bdX8U~Emvo?dnWBQ7LYM!{#OA8t%wu}9>1Ki~}Bx3LLX%JSIXD4j4pRyQbR^=b! zU(MrbJj#IwGZg_+WPu{R5`u9cP5UZYeyFq0y4I&6&*|DRPd!i?%#42N3?s!n)HmE$ z4VW!QdMXr)l;6=Vlx>7kG?V<=U2g=1GIFXpdXVs0(VUNCYO8K_wM}k6OolVBBX39LOf&Xz! z;l-_sl#chl5tnAQ-E0X1 z``-QeMbOR(ec+JQLP8=NdVHCYoR-l&kU+EbaTsza+G0~bkRNtat}8Fs7T@-3tIw71 z>dN!0aX3s2>;y_Y*8#4xgz`bW=A-ucfQge`O~PoPlUsw+@pWtS^{y60X=P$r;o+0k zH`UK(pNq?rcAbE8csNL{{fPtv1EkM9;s!{g@R7zo5&=6M+(iJpB!!-+MH;bjh^qN&&>oM747Y!^KeCbOO8~$-hJv4_7xOE|^hd z;VwrSGOr{9M! zR(UuN@yQiqlK0e)* zvqRQb?&?olU5)q()2$Y73JE58QHV2tJ<<~no6oyWu=+Sn8mj0J_fhp0N2bqzWoO`N zSLk`x_&QZiME1QgW&Qc<$kX@k<(=x8f%{aSW`?;kWMEKJ|J;*E@_M5(qWMzCkbd*R z0;8tJ8`P`ePlz@pa+G&3mxhrMJ*q&ecN^5iuWN?+@PUU;Gms}obh?7gQ(HkIKCtH$ z_Rv#KgePZ9pR>IlOk*gv@7C?w*IVT${arCIIk{!O?6*q9TmligAFW|eGx`%YmrpsU z+lkFu%kY~e+^K$Zsy;+8&vQKC2g z`G1}Z8=|#`b1WVR!XAE}&h>l6R_!(&Z(a2r@;|<}q3p`=x$~vOX}7|exZ_!=%H%Zo zudVnDjo`x&kGzD@3ljmls0tUFx)&v4Zb@)TjpSD6-qztgTcrL6Ijp;Of9g6#U|^qd z#4318cC~T1>B(t7A^+34Ut=Xc|4EID=!mX@#9!(@3mxUQBkYQ`qw}A1zPCpSNktpK zsJ5xPK!J2DGlJC5&wmO($52hSgyL`RVg^LDf3C)6H*3Sda_=xMEd%W9{5%9PBsn1N z{U4vt=je0nXS4W5$w_<~IqD4r$Zt*L1%fwgB?#>Y0fhhq)W693_kXv|Qi-U4h2QRe z#Z_1N^*+AVm{i>=#rOLdv@4|UYy?Svn;R??qj<37SR}W~&Oo;#7nU?K<#n)=&`)oF6rxo7^mTF(}ArmLeS6laGf_Wh?G{GgVYQTL%AU zee!5tvd}rMXJ@;6sf7=I7mfz@qG+uvb+KL+0Cf^X)24&!_*nr6BBvZ?4# zWwnLtHm-b3g)sOiD0z?~qh~(i;9)OO2toh}q41qy{GHuk|jw<(52*+h-8&Dfn>!VMk5cn<3#J|j~`O?2|Ob< z6^DThaV)=?*?>&td!1AX;<&I1MDra65-1*0YY2RL7~a{dnu=p(u4ao>s3R1hiYn+X zGTJt^*&VGlHm$9wP&u>o)k><82_%9+If|V_L78ct-R%KOyyWY!xb!Otw9ks?Oxid` z7d7)sY_j^@UkcFSgko8mD!tZBIb16Gk9$c8LP=$uC=5-x_+4k7)UuS_3y=f?oSr8& zzgJSr9-NcE@zh*)SSdPRd?AQ@Vj|icuNhsS$gr>bGdaD**v%dW%9own5Ezis7B;`D z=u%JoSfI_ILNi#K&mNJGR()FcpM$oGkY~|lG2%O`CFl|rDm!WM*GB4d*3S91(fOfV(G7^eC1Rz2k-%M}^bd-R1U-3~g0c+^6`z8bpIf|kSlTLvu*bex zRtq*Cpr)SJ@i)V>IqERiuns&!@Xu8R^&~EU^DIpablpWmt$-zsBO;_@%KWXE z`BUFT<)u3+1<)~Dcae(Te%c=<@|z*u=Af|Zp2Zi|yJJ05?3i6>PUu09@;`sp**ioquAV?hIz<_#1<#+F%4FBug zXi}Xwbzrv(PwAbQqOGGKLCF*HBf5uK6&)xGr4)L&s83=s${4~!OaXuXG6u&O8N)G$c!02>Sr~%H+&VDl4RG9lL=^Qusce`ug^Yg| zmiv{Muu$InC(t>-#8i5bdXiLu;6kZ~gIW&xwFGo!nYAul8H0|gd{nT6>R=Lo?B9H& z!eUq_E6O3t^f-8ui>%B-r5Gud*Rk~2kqQP>njiBL58#5y+ovL?1P0~Ycv(aPLzq$xbEVHrV?xvl z5_Bzk*9__uNJ^-qNP&xb9zuJoWPe@MhSCkTwNkg(7@L()w+6ZA!=C=4gcenB9mE~J~T47sq=3M%w zGy9Mn5B79=bK=wfQ|hLVwJI(!!!9NUTMK#SWei6$+iO#eFx=w?jT=i#YN3I{1&Kc^ zQ=%NcTc1O5y69VRdSTx0&k_`xm0D2_>%w-XXfY}lKXtF{zwh8-xZnF8U&8!`aLs@; zAEtQNXj^3cit};PDCP-{D;pj+AAzF*03f1RACTk5*tdd{+?RH>N55W4}G=gN{k2UQ!wKCJp*^T%YYB}t`S zetQoBXD1AsU2pBTqaMY`)fN`ZC#&TsPnd~dcn++vLCEHmbeoScxLY1>x5>#$#CMFA zdD}EGW=Z?Vn@8F9Vs>bG0*Yw6JQj zKYn_0wx#~G^lG_4a@qPeeR^8ewptq4uW8(!A^Q-KQKJ(kyCPJ=<9{z4XNe{4 z{%A9bkNQObghk47iMz9*wXbgb4OyBGPq1+6)!Emm6(xZ0v1Z-e3Ow!>?+^dNAk137M(Esq?Qi_z;dZOeawu+n4Nfc>O6oPSf) zc^yfM{=NX{FeoOZvdM#rj=bVq&D?tZ75~|Z0=`kpaJ4$=hu!QS$gwTji}k1Qt9$xL z-_*|&}?fDIT;&&meJIUmtqlFubNHb z)ZcgQz`Q1@6ssLVd+es-L)J^Xo$|eC{!CANrOfSK8xAK;`Lcr{~rbRmnfYe z<>L;HAS#{1jUJ6d{wJtD^`~+yl=G~$)ROJkZ}0HNj!bp@ownK7%($Y3Fw8QRxwYZo zO<#Y9@IIS=q2KPVi@KH>KwQ(J=a@9SK0n&@St5{z6r&W#oRj>>#+#NLe|m#UuX*ux5O5+drBCV5)A z&bdsd=`GIKXO*>ly=E1&9PzU1G}cccYYaE!67xe#sIj zk9-)=*7x_vRfO%Kgo2FF5HcWTJKl9n)gkt3bi?0`O&$L@_loFj%4&W$_TB$}sXynp z$egJ>TQSj*3R*}=K+FqSbDXJvx5FNjU9TCJA?vI^7`6Rb%gsQ|}%&>%DT)Vsl0A=AT@He|geC2)T zf;~M-pqMoRM23?OUaot`Ti>`KW&fCw$Fp?|I2j22OK&Kv?xw>W>}vFZf0d!CJux5j z(6yptgjkRGD2QLN9>;Ba4_WeE+`o_f@c9q$K1-1C5ESt|yTuC)=u}EmSL9UPysErM zfwOr1{t%6NoP3t6WvfgC>6AJC>9B5{<3PuEMg$rEAbH*_U30>GiWOkT6EB)02EZ$* zENc%tzn~iMeW^ViD)Z*5zTjJ(k(WliXn_XoB;P}j9>pgSTU69W~-G|ZQBadVB zgJ5*utuHsR_~wRZ(9`GCwi}(R&-ynuTI~;)?=hI-`FV_PuFP7xHnaB(dohgof2HSK z+$%qHdOX)m<0Y3r-LX$8{cuX0iJI99IU_S~r%F~b3zzY=Z{^`_6KONMzF2pmW2~hd zDKku=#SLCknT#&{gqXM`4yjqwSpvbB`j>GVF~`ZnM{*_qjUMOWY4Ah+6g`s?69JDw z?Xy?Sb|1ZNg)|+<-O=kU#9%Buo8OpGS^y=}Y8c{_P2qyi6_{zSY?eOy=+DRFP74{1 zL9-$B?>Tv^HK%ibzp0N7}<37i&^fr5#1?@?D<-sqRTbaU{yI%3`h5bk5 z$x~}mOVupzh`pxAYyWX1I{PlySq#xh_T(9b+l;3+@g`$d>zWJGdn-wDI z63oCrJkKn$CD@vvP?Xx4ANNV?yMhwsl{xG_>oJEOP9 z;KT|yi_w0q#v%NbtQg}jJpa)DT4U^Dyjyw-Qk~($e5z0DR#WpaH|;eim%4pc?l;mN zmfatW>2^S;R>l(UX#={*ZkK*veLuVI>FCgTo1!WTCcJk1x5{98bm=SWq&ROIr-h*s ze0K~zJv1cn-t)(T--+#FaxlIeWQe0WUrikI@876pjQa1=yiS`~S?`AE{j_>#CSJE_ zdr9KdKKpaI?G&w|XP-%Y=KBESIp=<08+lc%L+7S!JnQadx;CAMjJUz+aifrLO7toKQ5%;@cDXH#a_Cg2BeZ^KAuQj|4)+Z z+e)pQV|`P4-!SW0!#6DTs!s{S16kt#Y$TC>I0gwCrK6bO#&3$Y4JVtx} zYCIA%B*4z&Y_qhBU<*H2GFB>lFRh+wb)AlKyg_%l^AfaiP90lFqd%%I^tWW2FeR~U zdlpY~2^_cPKrHbxyJ&1Biln`Y=)oI^1<=~ZRsvU}t}?kwM!EZajzdh)w*#WF+Kjel zTb-v+?Xf>$^1bHT)U=b^P!>EJ@S~(1{3r2fjealbvi>yJ;LJtz@f3(%@_8??B|0$G zLSa>ct-w+;Ma2J) z1@k5B1#!t;@%CvXk5_H}dlrzCUtBocM(O_E54m#pA%&I)Wpn;tw4YrIAErCyiNPWM zMeP&zB20_>NB~E@{*cdb+FWmMT-g;rRV*nA8_ag&iGX#Lj)LpPV$nxK{a`Qf5ke}B zMT? z#-o_yyZ06m!mt;YFc-bNtwiPWJ?9eZ;CeyL+sDPbv67X-z!eqN%O9jwh1sRU=qm3q zaub(aAtrAB%v63=edP!DtB+UtXvjT{kK!K2qOichbpajiKCYYzSH7Dp~$)ca8DYZRJ z(N88Yr>W^So}zggXli8gH{1k!mh)SiZhnKd4o zX{hxu$uxSNrZqHV^qW&pQ%#|y^qBzBlR=R5Kn9yhrhsH=qeDYY0E%G=iKdzch9*6G<7Pf>1dYMd{LnQS_=uI}7nqZnWH1zdHsj_;b z)Y(SUYERT)rcDi?11G3@r|OSMwFjUynV@AdH1!9h15KbndV!NoF+Wt$ifsf15F@= z&>@Ivp`$725r(5ll zaKZ72tbHlcKk8hvFYO@%q*0gh*ZZ47{~o4mvC9no7fi$hswgBL_uBBis+q_LdTw8qlHW1Bz82b8eZF9S+ha2)obA*+Lz) zD{_8B!Kh8vr3z|>?N{BHmiB5TRFE-BOS;j&g>LkUwJM!F|Iy@f*#w!BuBUi%L&(q_ zK@ft{6iroRFq1bQ&U2lTVS{QOjO$yW{sD2j9P!590+(kJ6>{! zvV`A6R&M%gxB`vaA%iP!&7tnK0!INt0Fni+;t}YdHJp_Lk1s(~!sy}OvJ<*6s0>#3 zoYo=%0PV3>xU>&0?3y^+U_XTr;)b^Y)xsqlSV&E+HT?Eg-po6{&9B!)}FLoZ{W`dQ_n~VRq)vlwLdxou&zp&4lALzZq6hun3fiP zlW#=o$r|b^7Ipi*CaSyLb&;7;P3%NPxSN+xLKc`EUKf`rgM%O_m*A#;rYOsuV6A(M zK15WqN6VWj?sG!l@|M`EQwT6vBvAlEG%M}F-5Bixwop(MEAZ1EWl~0;x`E6WK-pvj72cpD0p^0xUxlsn|VMfws_ZE@jo57ziSWtAY=jHIUwBp_8Vw99q0SVU&o+v+&1-S!|bk?)q zcX+W8#4I3nRIyi$%KP{joulrIh9A$FUL&K@Y+F*WXB!gYzkhsR1hLOtDQx^?ZAOvj z#KQq(n%uv9!+6u$r#=0gxi7hi-s5AXTi(mA;nxGgud8EhJ%JN1P?83dw7S#rq}TeF z9#5L6F%On_L=-;A7JHHt}3H+p{n|Rq=C6=G_VdfKvbcHzT011a8KYjOcHUdB=0x3(@lzwrFzy0Q??X_ zo8PD5BY;6|pZXaRdN!ka7_W5FE>g-a91Zmm<<`DUfON?(iS`PP7g40a)Zrr0clXf{ zi;8rK9?Y>40oud?i%(SZ8xl%saB<1tYkRDtv*Dvs#6-+DP(y^68a~1ivpU*2F7wS( z) zqsFiyWeLk$(bd7sEjHCbMc|eg3lxcRZIWqP2Wy(7a;TnpRrc_Mp(uPruBGB`pfD<9?9T*{3>8D7bqAivKyEsn zKjn&sh|sw6glO|J4rtn!|bYh)%qyB#$8dc!f6FOV3b1AWdA zJMJ}?Vy~;cV`iBMda)Bs61OP2tjwSPBS(fiu16l2I~}=>Whm1{o1nvz0o*9>Yl=hF?z33*E#3 z;J<}_Irj6`gA!APs~E`H*+n9xA`&VoO;Ie-uhnmRc;EqAQ{RC8sBp!G#=_W;vjYL8lYPsv2Q>2wlhj^A0q$5fJBpTI1 zq9!RsMyBg|=P(YE6b?uNryz1eQ9yuIJcV%O0nG$aOod4H?@f#Fg>@FQ2O$sk1x1aW zRJ29ko6uojxR3*~#uZJ0KLV=@kklfy#X(lmms*^Pz65U0@*{SvI zALE7pcl*n7N0IXT_QCvJclG_8bU4l52Rqr8of{(3 zEv+{#&7q}_yj0&vP6 zYs3Pp+ZehruCJ{qE+12Gi8!dPI+sH!G`Hj>Qu_1i8?et(!!p}7GuIq-u&hsmj7VOF zn9#@1#py75TH|$3Doi6W-jDP*Aj;}ba|7lo+$_O^##UbJt`NqhESBJ z&?6$~c;87oaz19IEne&^7Hi>&p5W=`_j~+45OOF3_pVD5CBSTTx)|ZQ(E2Uot-lka zz(IfnT_P)IHU_{}RB-P7RxCbbdkdjFrX(_m(@lqTbeYk#kE<3J~wwXrwfs(2NoY9nPWnbW8 z5b4wx2MKd84H{E@>G&EsQcQu9fmASjlk(^FdS2z!O;Zq@8-p5iVF0V$huK#KTcWGW zqF55@;K6fnor$2T2lPhjI@#?p@1IpmT$+wAvgxTNpW^=n$^6`~gquFAM5zN*m@=V~ zL?|)BS13V5Kcss!Z7<@PhXKXcjfPmU zfRrz zzdy&XXd7d@8POqpZ>kew@CSr5NKQy#8CxFk72qU#f+6@JteBnj3EfT2n;-2&)~Kg0 zH#AKyOPjPcc5ege#G=(`!in`#IQ4>%PkB*q68Ym=diq7#heP)6%A14q7vzG4~W!odv8Hbfk!*Z?%VJu{8?b1YsfuYB=?*ZuFi3-pTxN0ZJ_j0t5Mi zRlWOEC^7B_yCoO}YV#Hc&Yp4=y@h}z1qW?J4cc0}j|kP^gikGH<~Q`T#0>B}hDPeb z@;lV@-1Gg6rb0bZ=)=A5A1%PiywoN6PRlTdyGg|$n^O{EQL`4kBUJUg)Hm^%V0T4n z&?5ZZaN!Lq=q!^ZRR;_C4#*}W3z8r)k zGALBshcjIT#f0@p#iPT5H@>b&dUG#H2QXweh8Yd-Wgn*xa9K^kc>Jy#^u`$c9&=IB z#E~^t1(0QLt;ia8+KXjFapgwR2B<;>7`h9&aYS?`CV=r9N8bh1f*L(2n|5Y3h%O9B zn$hv2EJE=Px;Yn7?H&H0w<_&o-4au_V3!!^#0Sk04tvqE$6-MwO@E25ki-}T2N~!! z_TR+h7Ud-|o%9{=oH37I$M{-{iGBK6u|&|b1u+(O?^=faPB*p%8<7AY##io_!W5GRiDCF0`TD38mE3kg5s*NG?t zxzs*h1O*8|Xn|M}E_~-;HtY(nE6iD&6$)geoIKJ1CPXq95g=f<7cwPVOOBr!#5oXz z71m&v^k8tH{6BwM%5a%9U-}Bll^$h_5_bsE`DeVOoQrkSZu8k#bqZ@Z7g^JXM&i*^ zx_L)D^)G8lB>G`UAOclejrr+)>$rrt;uo$E+`tTy+NG|*WC;0zFz|DUa@3FtNK|Qo zeIfmi{5!CGmgVLKVp?VvKZQ^{)5!K(y&@HptHyIH+mVx1up4pAC22}|f+7Ne45Ex` zK?+okD1^REgN_&1pJhk4cUi*Qt3K9iq9RGx^;xyFXBN+g!KkkK6Si6&s<^>Ei0DIF z*~qVj6OI&ak;GPq?Q2t(jDn0{h+W54fxyDjT9g`AD6U#vUHTX~@o*?<_!jy%+tOPr z8v{*HVf*e6+-PbqhLvbNI|JsvzGiR)IUt`qTV4pX1M@>$#k82VR1_n&Q60NH!6PNz7sREy=*;pGXwEhme zentVn?jKT4ZU4jS;RjjV5S})-;?M3W!_;V)H;M$5>NJkL@kH%a%8c&`v{LgE9IQ&y zC_esmeR9xU1(TqN^q~+iJC@KOfdmN$-0WibK+pUo9SZ{y4GYD({&!nJ!9IcZwsy6N z@|5JK4NH(*q}NE>U({@|xDlme>UGvLjjz441Dd^}yUk>k#(eAe=_v;EHZ`Fn z55xzNq=XU*fJq}ZtBj%bVSOy=cw+JZ%EXPJ1923uU1#s|?)W&lpL?*A_IzGI5nF6o z@-ibnF3#G}3dcy_PE%6x=Y!j%_#1fHBeYoIf&p{mrdPg2_Pq*d52xRi*HUDtZod(20iR``pSDe_1mc=%F!(h z2lEck9SlWQUwOV&2>qR{d17S^0tM+-d!_^SYjxp&YZ<`I>Vb0eOmrlp)69iqlZ~2g*^Hq& z)2rXE8Fb^%KMSJPKr;CSBk z>O)b8*9N%$ipV00y0}#J_Q7x-9sH?Qup}cA7u>4s zge4oz&atECkeafOGQd?(NF69qpMzFA`txEyvdVf7r4V0JR`%hz5-el~$$=NmF|+ z9*522k3Os7$=iC;q5BfJILa!PHv=-RwA+@iC3ohlBwC>KDZqVDwshc(?l1?F2tAIw zKJ`gUlaq`V?G%j->an!qF93XfiM z!7*tfNo1;^FQNXmW!FO+^8{vrtm+!0DC~Vq9UAYAb{*QZp?X&gROhnZe+qrnWJu<; zedbk764GlCQc`uA%Yoh1&t=Y$c7 z=fUCDIvJTYP)#Y|?D`es!x3CVWvYUVel`uIUCIJfWURI*ZJ%ChYiMFIV3RA{mV4CB z6TUfFB!2{d@3oAy6uf>nGMYl>GU#k=oPUdeBAuH}fU1djBZ9>1nv1HEir}xB%S+4IRj=q_}9ZdMm4>gIl{caE&I=Io{QtIk1EpELVisz*4bF`Z}zwi z#wZ3Mqk9K`o?A;EOqhjP$y8PV-IXZ;dsRdR5zU22SO^vRE5LjqcS!)JsRI&>M^y~R zhu+mNiGXGFz)AcyRj~PYI&e^Eh#1M_PiPhIhgWV8nX^{N*y73>l9_hn-vX9U-1gHj zq+b_|H;Vd3_=jP~tVZKj-3+q9rQ}A+>{+_V$6gg*HQt>VNTRKQKvi{@6kGs34bjWV zJaq!tCf;IlNEut2a7*v`{1n^$c^w4ja~k|srNQt{xxG@#iQ9$9(sD;_V&ziI$z;SX z?eU&9d3*6%#a9p5G25=!`q*dp)h#qhe{Y7j?Yc_3?1}1RS5d>w{H?bO4LV+&oW$Zm z!Zu86Xh8>dT`;tYxo2+=Oq$wqb&tIa2!uB#!zGBL1z(4YqN2(r94;`P^vqPV0!n!I znXyu}-9yG`*y-$}FdCTkbc&}=v~+Qq0}se9im;&CU{tu&*^r^51!mWsVQjB5v(rl* zoP5K$V!@}{-mJSLKIP-g4wbyA9TM+&&NxwHoa4O(#0w*#okQW_CCFK}@^uB9aWszj z=T@x8>EuJ0lp0CKXtdzF>$VV({)uhHM{|%PEs_n!)$%KlPhneEaQ0vwaih;ovJN2VmM2Je^}YO|DZwMFyO1 zKn1Ku+uYfr12_na^K33a?HSNOO)tgj`jFcYk6$@$(=M#TB@QANn3!(|N z8ApEPwFBy?|GMKt1|^8NWWkp9{|wv~6}Q!R)isvkKD4`${9EO83Az`tqiIVc#q|`LfN%!b$AUd=WO59quqxn$+ z00nCBx>A+oS$spV$%^k{PGjqKiM=Bc*w4$n(87I8s~x&m0})hYcWu8H>6}pBb|Yba zT<0fGQ)m|Rd0I!KS#gJn;)HniUVk5_9<3Ah^R-a`whrdR#X56Y2l3aas>RBdPUX2o z0;iVGMNN|gmFG+I?D@Cf3il4B0r#^drhcQx)DV<^?wD?-=_i6-1kl^H`hiZD+049ZqUk+VY-MIha?ntK!5)8*-?||917w`Z8 literal 0 HcmV?d00001 diff --git a/livecd/cdtar/isolinux-2.11-memtest86+-cdtar.tar.bz2 b/livecd/cdtar/isolinux-2.11-memtest86+-cdtar.tar.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..ada41e2e07cc73f8c5039ba8a7254317e036007f GIT binary patch literal 48346 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

R9538ZH>mCGCRH+pI&^{*X ziwgT*!>}k7tFK)S-rvw`rLS+~t}cjH&B*v5^*&I{lKZNv^lit)9Y2f z6qT~PQ&iRP{@t0I<24>b=Cz|W=>DFq7^%vzx>591rXF8&H3{6W~s$FL%6tB!@@&C_G$ys@_IX+X5m33zyVyNi>P zf|FB{nv@1kikZ#~ztY!HsAxLpijg*2qn!HY+>UYcKil$`Ew}zaUj>s&G`c17(Z+@pYZqjzoR52&R^rkzC8Zc$U-a#SuR&qd0hevdvC!@%t7V zkmx#C=6Mh6ClP1+b@$87U&x0^9B~l4E*+1&>lAIxva+$E_|mFIBtPE062)${7U1e0 zN)iLvJ3*}X;QiaMImxCK27iL1dvP>oovJ%u>15N^SESKEW(_vaiCysFU+)UoNEd?5RA zh3W2|P4g@p#wNa~Yi#M^9yD04RrCBNfO)v47^S-Qkl^Rc$)kG@w%yw{w|aMKFL$Y< z4RiJW>`k7`RhFR^B(P*Mqbp&j!_%Q5y2?~ik~w__{N+FttOdc51{p(^p{LNPQG$Cn zih2U|!mWu+{eMYUVqo;jnj;IN zkNiRs${uMbys0T?ZyysCceh;HH>HEO01##m8sO7A@<79sEmLX1h(s-oLX1u;0J~)$eR>1Aq)F+&D&s%0LiHCexZBslI3Kb}ct0RG+~89U}J6Gp!+Evaw$xuFrd8cge~$e*vJFq+ zF8WwO^rRv$4JIt(#4zvDn>COxk6HH9=6s8Kr|t=5WuL=4fM%;LW%S=>TvLCu{jy%j zf{}H{hJ^SvU!jBd=xJI(HOCTgiU?f4GOsWOIFJFpQ@XvI`>XO-NeWK+fJb5nDZnIc z5cTlD+WGsuRmh#N%1{ZLWPfh<#;wIKwMm0EN|O4 ze6QGEy^8Y9{3=EV*A>Bo(Kkg}T2N4Y%UL|f1J%3d2h*k?X z^CE8Yf5woCK@zjIL+g|&@AbLiNuTU`Vk?{53$8&P0V$WmAGxjnzjz?;{VxqaZF4y^ zj$c@gNDGkzJ!k_bQUc#1xMk#>P%y0h02^!p7|_fLTeTGN5z?u0G**XPpy#C;=f5M0 zr!Rwd$I7x;djHpW$&E9GnTgE(lL@i$h%dkA7#;G;(aamJ?_YnSYu?m|<3|o0rNUa& z6l`m1YKs4pv`w8Kgxde3=702mq$%sC5uCYt+-+lzWpi45-M>0qQqz>O7FC`2Lm8R%xEI_HFtXx44swVblyZX?TV zP$--H(%Tj>ayR8RC}tKvnCG48GSqt*8Nm+?4GzZqFVQgASk&167XXVY8)y4?rblU} z_Dt>g>)u!@8wJpL$j&s`XpIdd8HtrO3F&TYwC;H;e4960c=y!sLNQkJMFFVJ_2)bfLtx(YA3hrym3#zpPz5{*VpI&@UHd#!|VBf`v39z z6TC^kzjJ%^FoJHSi%0BC>`^8aRi0tMIvMvSm7=QmX8%k3xe->oMf<061apWomxF1z zrWb40+79xfYmty|?M;`OejV}h4DRZgph4*lmUMxUF1d?^e>XclX16gN0u8~F9eQS; z((FAq`oqKa>a$vEPba1fq%{LSqOnbqb@wmfse-c#Ny!Ww@SD3CbCSMiMnmzOZhbs` z%rnD9vheCo($FiQnyhKi+b@wyr*C#0cOid1BdkhrmzMx1Cu z^*M87cK2^R_s#x!nsD;H_!$=cE^3~V)tTlDPdJ|xXBi1};a?`q0zHGnBZ};_#L6#r zU%1P~<0|bMqgO4QgNBdt&apJ7F9Wf1m9Y_XXJSMWbrl8R;8atE1R{awdSS%cE8F2sj66X+QSek{LStq31y9W;D!uf5$E&G1yHDc%L^41 zUR`O`L9w$eEAZm1MW0S;i|}!e^q0RLw6ZCsNaYJ>E?n8NRLbRw#Zpr#p2;{*LP^YP zx(b#A;XjG@*Q<*0qPNa%{pcW=;_9#!;Vm&P&w zP<-YTub2%xoegI+S7L@y+o^{}-{hjQ=9q z$H!-ofBZ=-BLsHpJs^yGah%mBE%8I14V)F?*_Q~^ZIQk(PaSw%Gf{bKMpnt;7Uu=1 zVT9*h!9@L;oG>C6pcZ^5J3=7Rs|G`aE@G0BID2)XP31NbCF>RtxxYZpw0XDHu8w5c z(vT2;2?SuZY5kp(yih1ffr%<_vtK*<;ZU&C9kPv!eEofSxz^6kK@mIM=4@NT~a-sQsWkwi%lU!N6OjQ*4%xMz(53WW+(ee zV%?Qi4FG8qJlxI!8~OTrTG>S~#hL$2$2t@S)3c4iGE*K|n}h$$z~JCO$j>JoVHFj< zSow}Wj)|tM`ZERVmn?*v6_0&}}PQw6^lT!c6mB&Kruk{S) z@3cBJbBm~E^W^FuDnb{=k6)`7C*xsRlM9ksqFY)V*m-+G931TLP(OK+MF%8li#9(O z78e&v{P;b>!%VH1h*CJqAf+Bwdl!pq`s`-HGuIzf&)Nty2yZ=+$NS_i_vMzTaNC9y+6vTc z5sS9SkBU^e#l>a$W$8L9F69xXQ)>HU=)b(u?a#=VWw!hG(P$0ks4XgLZ&A>84kbe= zG6D63$_rmgQS3B>*}DZK@1Of_3y;i45lc)3SOM0}t-+V!@4U_kV^=dhvPOlJj8$h9#zA4Hm^f2EQcjG0N@wh98EhIqbEEfreuFp`$CnPFDt$NrH-1Gb&`>;3*!-So!w7&s?w=m0wNcOX%;r?Y`HZODGM+CWjwQNgc$w=<9!L~ zyh7^~0&Pn9HPUBQE=V6NwRt&OSuQuzlmi!0Oqq%_PesxnT$YDjC|3Qp{QP{^ zyuI)j2*yzD9lZ70eHIwY{v?h%_1kj%4IL%!0w>2T772SMz_ybGObu>8O4P!GW>YlE zO&EO@CIqf3Qb-Zl41quZ2uSGSK`yfdz}rg+DT(GzQR&ghVCb5EKIVo+bX*;Ig6@?A ztSPXBL|Cv{zZ)k-2h)z8o}TtyUu z3~98!fwKVUaoynxjnC)kqo-Fxlk*bHf=+KlvG2f&g~q7HtBam*&HPKM?MhuWzdo)qBoUFUqHgaTQY1U>!}*l`b6aNZ|T|{$8%FNjfkNp zdhW5ag!qwhX15(J%wdYduB}og)`pP2kf!-hSsbh?5ke$acGUpVFquCxJ!;ViF!6<4 z6k2dY&@h*~@|e8) zSx5}aB`}P+m&1J|j9M0|lL(MwIDzx@U$Koz*Lw)`=!%XHMC(Z5Lxby0`2{Hr_!lGo zMsU)nCXl<$1?FGiNozvab=vfGSOD!tkaIL)u6^6O2}csIB!pR(rJwRN3(+VU&tS~F z9x~J&6i*lGMDi0|+N!{)mabNI$$wj3RyVFOJ7d+Ef|0(7e~^-Sg78GlWe$y56X7=4z7#3VTe#57i{^f|Er+tEUm9$UrEy=hMB36^yxpaVF3a9i0t^8PV1cpd$O@#4JXjgy(W|Dg%%! z1_mwqB^wr{XDrqCBa)gWMe}X2fBs2@g-T%UfLEgj$8OTi7T8mzFn5w@K55?c`UQn( z@(@ZvxBngJq_W?c4b-%}v3K(`)q_v2Whp89`TuK#`sHL*m(GVS90slc6poKCJ3Vf4Ovah2BYU zg55{!uVw7@OfEz$sz!zG{#dIvUY>z*CK0maDaSB#FeM%9u6?;J5tx^93o}nz8o-`#Je?>I-yPbjKi4 zX#C{l45|tYT*>@&lSg;-Z$Ni47s6%{FTOd6KLF*_(J zO(@CZRkSi!NpUX|%FOoFb#x}`av(&Bhc0GZAAFzBI`-$RIUg}ZqY+Y1<6_8%LX=2R zVrJvO(NfImBgVq=VOp?&uBzJmhWj#c|;4GvufLxM+FQjMs?$Ej9BtE4dy#AA%42>HV~LGn?Xc`kYp z&6Je?<;v@;I)BiAGW-kRD3RsBqzOw;+fw6a!gXne9MIE=)4+zkN23vNDx(&5A5aNM zG8jdYV;TmaxYM_)ror|^CK2E}FGmv!Aqs@|)Jfq6DnH}r&c?bu+s}L zbhtvIC>^7micb&zbX=QCbjhyK8mdA1gR80KK#$7_2XGX8?@R8WER!U{nTVP|QhtJ> zzkLRlxs3qJ5JyFMQPJ?m%C^?+w?^~7(y+5fu4N;>NY1Ra_wL&9p7f)`Z`^HuymszH zKncR`7qeuJeZX*$)As$72FV)YeLGslLFx_JY;RJPaI*=ftGtiZnYtqY_-k^(G(bGG2LDY$q$HSqGRTrsEH z02T(B{-_*@5sB3}>CCjNcfNjYKoHEV_D!UXg}$k)*P2H!n!Od}h_)Rdw5Q0n>pGiM zN*UvqcRf-c1W2}Lmv~OoU|-I)(6`@WWf?pE^AuD!AG*^(nvM;wj6OgGgD14vXe|j( z%*2cyi&rA-v*z34Q}DJ7SBIj7QDH)QXU02AnZ{~B}y!I^b|QilSeCtB$RgV`8-%;cANB3MkzQn z?6zN@iem@cM+t-uU;rrZw7KyJX=)UsupiqQ)Cs7$sH*S=ik@bEtbI z9r(hT>A$$zJ(H{-h1L&FS3*Sr>hs8-Nu2$4Nl%eSAn0S?8^)iCGARaOJ1$5@3NB_o z2{}81PejGt6hby_UgihJ+Vd`O@R_@}&(O@&HU0=--tD}5JD%($~LF54=Zl$`!h3mCH#NnUJpX##SkyO>u(bDdo zcN{kfbY0{s^z%LouHc@Es~>RS-#yKL)0e8`s4E;=GH&9$J8s_&5~(sJ)Lf_z%Huk8 zJ?q*3s*pYLO+al2QpJk?{=0hoj+>z|!fv3gH-|APx7ghZ5U}c$MA3KF;KvGiUsy_8 zQ$br}xQA8ZB93dLehyi1+r-TSdL1(G%DDmc*H}?wWgBFt{^SoT&Ev$VGxZ|t;H<`C`@PMXHCYpf3_;X9-%vtK3>27h7Cg$ zLhwMeMtwAgk`03|4!&L+*>hmfY80zQ3*c@~rG8x!uqDO$Xb5bht?Mb>dy{~1n=CK< z*={q~uo0f@cz}BM_u86VZz7UDpjO?CNE&9AZ3rP0pE@A*O}+>{a3YCdGy!wFy4CEW zHb2{Y=~MNArYaZ^iFq`KmDHQ4JY_8Pw3$W6u^#s7=cc4F(+43E`r;&I_jOnKC11@z z58BVbkV2@97Z7~a3J2wWa3lE+dJf)$D9`)Ysss0jBZL|y2!yp<)87EVP)8d}Ovxws z0Vo%f8jM1x3XtqJAfZR;rs5u(3FthrhBpvMH53%wjxsia7C0w>JN}!dWZ_^*7KEB8 zy3#7T_^>m}f+!83px+Nl!o0(LY174=xlLX0-Rvb+nZZZWdt&j{4zY=8$)Eh=tei^? z4hwl%*{-`FYP{wO9Sf})ND+K|W*vL~un=YG^W51pR6BHN30g^vHOXOd-{hgR-|dxIy;%QG(^;4))s0CJ@f z1P}1E@xeUOFM-!^sxC*rjIAF6y^15ko{KgTZ5Cl&HP+0`khVZ4wFWnx*ktHbqn$6uV;pab{D5}+>oIx4p8U~qtn@(lgcko?naI2&7-s7bcXAMx-5d0 zxzBn+6U>U*sNzhZsH{O%58ks<3v0>cr`pPgZWo>u%z_$25FA=qAPAB|--bSOtLfX5 z4`^^tRQ>XCe~X!ET&rk5XSAP4_t*VNJ zrVaEW;QzXfwJ@k)OEvtPNxSFZls3l_k7{cy`H}1OHsF7S;4XK(xZ#_yXPz}a28 zYTqr~XzC+Z^sp{Tl*n)Dpml9JlGw~wj1vka;zSHGO>kdzL1tU@E8FO$jqe4Sv`V$= z$ylZ_8H}_mT*gqUawOe{!SwP?x}_9)1@Xh(Jh;;}z3%(Ys*R+^u4dk$KUDrEu4;itfUN%Gl$>+#)6OAhthAm&4HUky;DiB_ZM2QRpKY#COQ%g0xWreCiA(XC*qgWohA{S;1~NEZ}) zR29or5RXnlK*OMv;AE1H!je{PABVy#2sc*c=wB2fl9Yu(G5Jiw9k08A4#qlUWk4k$ zD!?d1v+;-u9mVb{FWLapt*_*`uR|EMVyEQ1TZ?>1)FaFQve&(LzCs2{ROSpWVgv?^ z1WcgDjuPN)fx0XvUcc=&+jYqM&n)x9)6@Jf4yCggZ&p@T|MFb(no+Li>0P^yjVR>$>6>xV1;qEdx(H($jM<-+jCYOEoP2b?cwyD>vQW?}CP+;9?{lfi6> zrANhsWE`R9+K?eg>MPFhn00D}gZ_#;5v@pY0|Y2!_iPAhVLq=m{Q12>ewK$tqv6b} zAX%~`sX$zgPX~eXq+01&x8ICw@)-u2P%*jSC z0N1kvtKsr)>KvVJ?6tnhjC8YggYKD6E;ix!7-JX!SO}*-zK4T&ChuUBj5EP0es)^A zwDXVI8`jGft0LH{pX&5l`L2DsH68KJQpPM zWryzc<%h41uejvC-{k)9{==U0H+s`oiK~QV7j*{nn%WzCdo!TnDrV&D4Ce|Eo;#%Y zd@APRnxbEfm5Kij_NODR=(yTjI9}ez9z8szKm6J;3sH7QOf--=8}T%P;6QI1WXdP? zt(>`_RD>$=pBp^eZD9Gu@yth=ohJ(ex>U7`1}9M1;rqm;^mC69TMCNR1$!irx&4ui z-R?5?xop5H*}+^#fr(0ZO7kc~;lPlf-@)N6iW$pe)NyZpk!+@OiB~%=!9HL4iO1u& zqL7~QAKs}~^Yd5`%=bzh+H925HY;K=CWE%Qu814DVsBqww6xuF`J>w%$X%S@&Q9ej z8*T-fb^217N(Y`0w#e2{0JEiM~Pw)ah zwL?Xf$*I*Gx;k{^O@@clBN>243GAt+hVK8CcW9>vA^5m!3zRB~0R^nA)TjvSd(J<2 zX_J}as8RcG8O6j4Wv2B!0%dnEk(4!X$UtVEctItox>GQ_e9Bc`^sksUk!pU}A9nx(MH8h#Lf{{1 zm^|UZw<>wx#cap6hUB3&*cP62waZ3PFkQB3qHi>q9Vj)EV^3_XXbtJ-O%inE=*Scg zU3D?W;_r^QGJp{2{ja1tr1F8=vXjJGE{cD81t39Zq$U2QS*5|{|($JhKckU#`-iKN5#ANssaA||#8cHy)w{kdA7 zO~m=k60sTl)kOf5bnu46l~CUa?aJ{fLTmsx(5ej|r{?}npy-UC^-*MT?Vt3Kv?}r1 zf7-pSRoG_PEgRBmfg04FbQZLebFbU;a8W5aNC4-F{y+4;lptUkJvsWVfo(r=mJN5p zB24$Dw=<_%If$u+R%%W_k}oLwxeXB1Br|R5fSX4w7j@)@^Hu=xl6DdEr;oE;3UP5x zIg?d`i(Wp((qbCK>kZnN?e6~J_QKqPXYldP^qsb9&idSmz_*4EfUe@$`ugc>BVS_i z5$^gStLEti)bj^?IjfmU{owfrK;@%tchS$f{7V|wb4zH9s>|6-h7MhV< z4y|f@XT*(0@IqX1yrRZ>fDMX$6cff&E+#vTxM4fb3`Pv1_)c=9d0>A(`qi zSW!eooO2{W@tI0bf$|AFK20^G3VhK;F~V?)q@G^!v(sV8NaL!U%Qe(Ry351>aDVW7 zN6d;M!ePssM!myxez!w&>2Z{Z;E9Y>btIicVUSq+6i}3h=3B!Gmk?2yY(+bn)Dhs+ z>da^K3}qac&(lGF`8WYX!+&MRlAdWscs99os8yydxMmlU$!*wTe`y#LZo#viT3v3K$w=3dsj=L4d0%J5H0Yl;LH#uN>KwUE~I%T28v@qvS z$Chfd>syB7Htnk4TKyCi_QIl?3s_Avt|ol*1y!=U^fES&0LPL+6%OPf+%hzT>1?#$ zVh$%~BsdKMT%F{sznNRV3&~N3%Ln=CjITrzUdpk2+=9BPIRb12sUR;Jux>*(8w?Yl zP|%UD@uCfJ{;(etl&1%L|Kl63$JmM;zt2_drtdwo332Rnx4hSfn)<*WeZjB7qrJsP zOBGbP1|NgF;pN)}uA6bMEj6z>fK*dlVk>9jtT@`rMNy3hg>J z*LbCbYPnkN2h}{!UwEkOd=q1h^X^U7jsmy7^C#uM7Zq6GkQrU^9Wgu;@}*f;Q4Pdg zxDF)Tv3P5&{^SLoJQlOGhKh=i5k5q{c~m=6j6~T<1-3xB3kK#^N&xegT0TmTa2)ew zDarlidqyr#55#WsBpn@5_<_Q7h+sI;03cm_$jQ8uDqxY>?Q#YR-sWQp_lK91ExED>m-mpIk zc~gN(-{5Np6f`IrIL!h?pA>&4E-@evkYS`d-pyQp+nKF&G}0DdJ(~2~NNR$fGX&wd zK}sDOBu!Krt^%r=&5)v!> zRa^pLzhkG2sT{_aWj?kX%<0L>>*P0IP^)Q2{Rwo_JgdhfagisH|;(4de_^Z~apo51T{Xh`muB#4> zUvtCel{2+_)O@6|le3|flsRVH>)}b-zbJ%U zqyy3E2SPSt5iVTnBaU3PY>%cAGMF;BU{xrSP!0J%KrYEE@y3UrFkenj4*oEPXJ<;k znAok5Qq0*VeeUPS7QsRo3$d(ZP8I$h9C4zg^(~t;o2>q7T9eNHqVlr%dEJ0v)EwPQd{lGavgkX{*}d|c)h!`oIwxQCqNJW(#Zln$9I*cJBZYP! zl=MoP9MzS~7lXDPl^XDYGJj>s6>$p~wmD_w#KFNi{BCSNqA@cfH~Yaj3AfJKiT8F` z^4cT|69c~BX69^B3cw5Z>+?X zw+cf9#mJm*XZCu!K4Z=cS!;?(%p~vO_;@_tRhw33^H+p)EQ%6LBK9^#r2FH3K6L$N zS!9{1i6OI24nY}I`H++$=ABdCk$C8{(3(b8H$p!C)bk2J3!3XLVf!@X#~q|!-?%Y+ z;7{AT;Dsi7d8iW1;vhnU{b2->UjW7St^=7*(Nm0HPrv%IFoiYP2tQc9WCYwkGj9~m z+qN4@#luv@OH=X+=1$$F1ppg=X)sGVQoNbl9y>%H2epH^JdASZg5LMr#st_e1e%Tz zHr#RT*+e-3P1Ar&5}Iiz#>TgZIX(4RTCVFpl+R8Dj3PgFxVNdud_kLQe?iYeW6@fV zXgqdLj}e!Rm)pB)JD(Y&&(h*8v}h%*%bvc>wXE*OQQ1JJm9$}8EF9Iehpr{?CBn-Js%>l?#%F=f% zM979&^g5)ZM1Wa~Ui}Q6&e2JcD?PStoZXft5pO+&NCv0uxQUuJbpO9OFmzPB_=6y8 z>W3fSmCGL+2>AFSy|~^Q{U05hjgJqfjOW-~JQN8N!$?r;3+fXO;`yGr^!5ELK0o_v(`aa=Vj+X3C3&jK6-D{6WP8K}=tRmSA`y~4c@#`0L-~$q%z{WMki-S; zxKc~xaxi(UCuH?Uy8`92qDXP!Cr)-9CCX}=a`)--dGWoe`MaE_AQ215UW`rI9-Ww> zCDzPA8eQ!kPGT~Fy|k(u;C}iEUqP2Qhsw`D`iekB_*$E69A18GFnICdtF!*xqL0$~ zj}y%`c$Jy!@&#^4Y=v&uE8Ijl05+vjqtpr8L@F4^_k9WsdYLS+Og^mIRx3k4SUtVS83*`69<6=pmnDc}= zbU`3%NH=+Z(wb!yS%#_GBIhe>!_{8UX0S{y?Y@Lq(llaiSZEj$;W#9?Vy%bxB+(HO zpE`ApZNlwQE$w*8vYljUvrw}?3t@uU0Fd2@4!E}C5Cd^XH#wLZv-FgX@f<~OwHXWOJSa9Ht7k?Deh z1HOucwaM1RWyD(2@In57xtwQ~>GfHWho{tt+k<+fYItEn8j4r>G551Vx2NwolZQw{~kHs>Yh=|2-ACs!xzBwwg?OX*m zG&=KW@9?Yws~em)0B*OzpBB3u?@kzA*;SqmMPVmdiHb3Vt4Flqm*+Tg*69Ny4Wr zpLcoqhi3s6eXOXFOGCDx`yObsQLt!U`WuwI-ev>>f7-rFjBWdN5+|<_hLhdnqWR|~ zdt{cvG}Q4_UE_Bces9TNy`ucP6SXKBggk_AggPRiX_Ay_2S<}E=b5&jWV=;PgyB;t zza-nITvxZqh7e9#A^b3(l(|jvxz??gycHSYcP!N+B4UFa_)@n0E^5uHEkwo1)hL%B z$45Ir4Rfy|gwS@&Ob8qYLx@jaDOaD{dv-D1|J@+~rM2GFDUB41FSkWQO=%W`$W2bN zDRhtmHfXDoN^tEJ=a7&3IGG+MvDR>Ze4HWJtwAXgDd3rhnKhvwL^j=dHML;x9?TLa zw)&q7M4k^B=PtzOaPA8{s+E^@= zN9BX_{53vb-VPr1}R{Rj6vewj|yexmP~s6(}WzTRdPENW>TSFcmt$C(Q^)?8Un)*&oeA-E{-(@`4JA-8lS__t}STW#*Y?buF2fjwSme+L^`i3#le>|ZK%T`cm zO5sr%+(>7H5+aCL5{Pca79|wt%peZqIOhwa`q3b+r73sTrvI&ZF`M}KU#QTMc)@Xz z>g|3woD5IBU+p1HHP2brpX#}F92-XV;I}Py;pCR=IKRaYiM>Mdo~=m$v(Y$_3PK7udkd9kvcX*;qRd2@lHTa2_XqZVCC+=F zkB{X1n?iW@U!=QatIuiWj0x)C!b6_3ct@afnH-So57~E{h5)7Nni63nqbEqM`gbVQ z0HrcW$98|*^NKAJJnOi2#6f*UQ7(s__4c`I6IXti+*BbqU*S&JTI$+by?dgSkr8%h zVMJDl-bp*Is)&gq{C`Jn8cCj6^u)hI>fKc4CQ^QaSTZFSC+1v&v9pp=Q+lb9(r&;o zU5dJ&C+K&3$>jJ4Kkwo6&ywDFYOiu|vW+9IQ*VR1h>^=GtyxG)NYt}hW)j+20WXrJ zS$FeliZ5!vOJ{#S9@1vSw_+D{Hkj}t{FP06gocRTbJgD!j3=!jL)0&C4wdsRan-g9 z84YTf$&x?+vwmKcWximbmb zeSyMBJ7Yy`N_9H z;iE$G&;%?dlxYhR9Eu;s6SgxR6r^&1b4W|p$2GM9GeP}-)0CHD^_@!N1|-0bBo)On zs}!tbU{~M4&**=Q)Yg|lgHkDD1~hvO=h5_b4F#)8siOcD;swXcQe z>W-^JR{2m@no-cZ78o`bT|cAWSb!v7A93B}1ZzP$2;a<>26@~4&yV2Es=RY6wpmoT zoO8F0$#MAk?Q*+|>0eiPJ-Yo*@z~Djr$e!mX*5#KKJ=NHAzd2F?+NMiIc4Y)Fel0I8I z27hi|e@(g9mM^Qx@gOdb;cdP&riSyFvQ7Fj*Y0?281smepxFjsogPozEwzdlw36!QE!uHJyqpG~QDvLCVV+kG6 zSo6GjU?6hflU++3cG(#7_selexJJqqVxc$7yZh0aX4su-k-tpQ#9sDjRJiXuSytxA zo#2R2qEI(kLdS+OYR4-YSy-+z>?0kV*SdLvIENg`)!R=kTBgQK3FlBSd#_q!KD_ld5t97J>9> zj~Qp$(_k>=MoCmvN7QHS=eibJqCmG_bZggkl!&~yAGQw1Mikcjta@-8pnoK`^vQwQ zHxc_7km_UbMjB~F{9dt3iCA<;W3Mr{-{pQZi7oQndT&SX@`5J>0XdBQv^(L4`96vv{{C+Ucq|dF90WzjMQm z-mP~-GrQ{|M06f?Q#k87ZhIOP1ww*p0V4zhhq^?$N%zDi`?HF*jxzoJd5zR_J-S~X zvqp(Ce6`5iex`--;g-&z-MB}S`4gNc?s^^I0eHLmd74@T4S4)T!84j{gHyTZ{mzdX z%|{LDS)SFWJp2>nlr8rm7w@8!N}~6zz`N{dzjp>tqrpC(xlY=67ay(G#f{<7^oj-U zGv*wVceG5K^+*shGIHB-Y+bFf%WueUQPk>FUqMeix8)-Ku5;dvjH7KUz&9`TA=rIo z`SKh_M*7p8h4kQ#m#bC2%TB^eK=+YAZ9M{3R9*6tYHJG!AwedLhdnOHW>cJ;>h$~^ zj$c-{x`%r+AGbloB%$!RdxulgmZL-05go2H?1r9;vyN#EsTd-K!3W#*tS%34d+obZ z_c1EjzRc-QjqkMI>V{o<8w6Hbp#>+T_+}QEm}@Z7VZR$GrX6pH$4gRt%cc1p6@3Of zRj7>@IEyDAy3$SlEKMUN3r3OtmwuHv7Q2Zud6OJs5wqw3`vL8f?kp??k@9nkB_PTj zmVd?J2-2mly~a3j3s@pZSlA#-Fr1i^SVj;bo}e5rYug-*Yf~q#ONdco(2*GWFS>yz zx|PEQr4EZ(CoViU&2d(rwQ(YHOrIjs#UneIcinK-WsB&K3-UZ^V-Dr>M6!>Kc0&|k zChLVU4wpOh<9#Ku@~o&_%GD3(tGEI6Hj|V{7i~T&l0;@vyH6QWk$~AutrcWYeb#R+ zEefXVoD>a;Q~Au7r&1sDiHj{_+oqLh^l1=FmRS#FBEx=_9(dyxm%B>Or)lEC7TxX< z7dA`Apq)$D$-ZBvhbB$@S6&Ug?>IEFr}nrSj&QT5CiuQ`JWL2EFN?_+X8~!2cW1}m zri%@f4_x5a+Sob=lW92-jve^;tAsYo65A|_q0t5dUT(58_&lds)>%JQ|DIriMOM|f z><7`o2NIA(d=?ys$vbF{D_>C|V$)2JT#h1Z{ULc-y_!6sEy&+JC6VmMaGz_%XyNK!KT&Gs?z61{hxR0HEHIZK6bj5;>*%vYa{*^mQq-p>1WAAK@Jd znNyhHYc>CM#{$=&PDReVvzCw!Z6c;<)%a8a^Bd*bpEZ+=$s;w~*4@mYwB!&DSy;Vk6_#8uXAu+IL0uB^|{p5&4 zFO!9!1w zH#G+V;Cfhi^_B)3{7m%6UFuBoeb;SWyLRo{zXQ99>-fzaF^N^BToSb^vYV_UaXNUK z)g;KPm>w92+pDkp<=gsSH%rj*bpBLF5h6s15+Z^;8PSdp0E{vSj3Dq{oQYo`-~pVF zow?CRGB8wSn1L&S*(NtR?Xs!qFwpnB=X_tMEvt^-(cD9E4jVXd;mE@l>%YPdh7eVokxJMw_a1PBlyKvIdp%e@8?Y`CE~>Df6U zkx1P&7D3BRLGooII(qHTVTydk^X1Q;>AZM81?>tPvLA=ZaXdC*!|P@@87?Fh*bRB(|a%N2q8f_ zr`Dh9nTK>n76r8hu_H*3l`oK}OyM*rVnWumuvmjUdX^21i7}?b>9EIOeFlw-NVw8X zi~RVwlSwJC7jeVhd{2q*Uj_S^UuvvaWC(b0&R}GS3o-(a-{){II8!@bhX%7Dg3^(t zB_tY3N=2)ObL<*$u``}hH(rBUDmr!eCGygl2@%V+*;M>gT*e`h7?v9la~^?Af=H@N z!QljnMLiy1^@5%xyz`#eea(T8q68a^s_} zoHh%CvN{qxWY@iORnq*ixD&Edt*2&ZWo0%0CuOFXRf!U}&B)z8Fm1O>TSijF<42=j zl=@RA({6D+e>1@Q*?G28H#ZJ$Z1_9g-Fx55C%u;Kpm-iHwY5o1d}70yz@zTdr-p;2 zh48Yfs;ip+JaI%0;yJ!a&I=^uW1C!b5(wXK)buEhiYTIrIycG2X|srSRo1}5Jz)J~ z@EB*ben+)I%;|C7F?jLg$Bz`3KXrf7grsZd;7cJOMwTJoH2eDOJrCjC<$LKQLc-`a2j~+ZyAejH&2Q89@EJ&s^ zG_>_WjFk4H@cTmG$Z+e9xqk}6v$}8<%kDElF0oG|xz}<1K3-t6HV~y`UP{W!sQ1Iu zs~mIPf?N0!4o-~1*p?Z)lqL77iz|BD>lThb=JnP5o!`yyo-ugwsDUV)uYqUY(H95zF)Ps%0|D(ItCp)tFd6mt!^P>aX#a$NtvKW%a(J z1X`5SK0!2y1dK-YZEVN(j}c(qMAGr+Fgv|(X?fM-IMNZ45)GszBp)gvM)=Uu6x`ni zmt`xz50Q9sSLh#NoDFF3dE9?X)%!Yq?~&s_lXJwzRKTWuqB963fStW^XaddGVjwOC zOoyz&|VKb^~+ zGrLIj@$vET>c{Jtk8dB2@~|)8bf<9f9KQauqa(Eb&iUvU-~=;>V176D4illMdbd6gJB3`!eC6j4PB zjz3@#xdk!IU_=dhwu3bXGhB*V6(dWfoOv2ePeX-c3kwSi3ksk4UqSjFvRrDbJhC7oL7Iz<8Q!u-oW zeQ7Vd?TJF4w<0%Gm8qnrk)7w;_&2IpFyb&Y%Zh|M*fP*1$$Krc-mm)Y@zj1RJoQCX zq1xtXLGw$V)vV%6`%jv0v~nh6_EvR5)aNO48-z}|wa;z)<1)f^R-h zdt0VBwIYpg%xuTA+i&(&=2e-QnM?lo^gMaoRJ-&bSPC(X@;^DfnumoM$#oaw+N18@ z?CXlT>#n-jzPYvY`N&+N&o8~u*~9h8Q8Y%?Gx6NSGfNMWIKlZ(W1z@-A?e1Iz^M>7I@9oIcuW?P-lSzZ+7o{WYv z>C%h-2@3r*AB-5q9Ivgd`1TOySumrIU|UEc_X}VcM_0(r+DzQs zy?OO`ISz-JUNL2;CfBv;lYLAWaiW${3m;oMVbI%Oxpx@ZD9Se`Fb~q$=lqcRM|pK7dl?n_y&>6bm`RAb%Ohj+odZC}VEoX6;4(nckkK|xmRb&WgzQVRNZvO|2C1Os!bWME z>M&qMt6j379VDzjaXW0XF%=e?ZHuyT4dFeUz}>j60mM%{2QNB)g+T;dC8&Po~Zu7$n1H}x@`oVX)gk?y(Qg8#?1#qdDUCj!oiNbF@S6{h zXPdMG%2GZ{k1Eu?#OiT51eP|alk>?#BBwh-ZCiN#@$JVEXh%gy+noT*SEK|MmK;jPc&U)0bPB-NI7OHN)T^d z4ZcozHa^Vw8OYgJ$%;(}Amt-QO9zV4US=AgOccJ;n;(xFy0)kI{?K<)S3~1 zCgHF=2Jj$2fdT~F1%wFRi&%|L8lJHfN_F27N)Wgsf&?s{s#f2>glJLE@7QBtEp!Vu~eK01O&m= z8D)0rMuIb22D4Tc6m}eSJ-77Q(D9tbkEuro>CyP=KJJ^262xK>2E-v>Gyy{Z6qtl^ zELE_c+Ma-47srPXn?r7Xd^t4Xl1^U`Esgt6-KxR+Z= zi(BeLbN)Cmmz=9tR@1+xt#F_M463_~jze(|f9*Wg|9`Kq9k|u|c%B6|HZ;bjFfI`q zw`Ev?`YXCMKu9hzg=)w(kuNpT?2{Sz^dfL)&KI>y7tUdCHD=~5`a;I}9M@gv&cZ?#kN*kkliEuTlD!Lso{xUJbKD5VY=)zdup$JQ*a3cXyB+ zABXF>oh6o8WrXDId~1z-|9X1$9N&bEo*~^4hAa&lNOqCIh+{9=P+s5P-@;pZu*4X~ z`6e;ol`p%R+i9Vqypg7qmUNw@cd5WA9bpj@Bf1h%5D^=!q zWts~L9SF`6|4&Hi0VJq`Pzbr&>`7g9*IiZDxk%-E3Grh~@Up{>K^X=;;+wLIW^^nwN3$3WSb26HlIFA-hG8%~{$vbxK z+qY_HvL9bVy5w$t-D$I*Gi|m$!879clsj+dzmD#|W5#T)YbuJZjF{(Uy`E`#jn#(qzuW_<4P~;4IT5VY-tKvZr2t86{5>6gB_ZyZ1Rc!u z`uMwCC3(cEkXJUoV(=&XXXRhsLm5-1>glWkIj>Oe%Lw;(3o=)zL1luxziRJX zX;;o?=9pW5)j%m_x6!kR8CX0Y3j3)48x*3!uq?;V?s*?*l=E5X>FMaR%3s&NVL~IRL}p?CZg8L1emmu2){FlF4`8&ues`W^RYW*ka+v!-ozW zIC~ip5N%CJ0Hh-TegzPyIFtiwo05?c5h+l#OrjJFY8bo5c37dvfYLZP6$UT^tr%2^j?)VKTM7p8-4P92@(&tW{I&|s;mTT~9$U4k;t2_gVoqU|dpiExkNC>c>FK$`~C-moR3m4Z8b7}4%-tLy*m9xtVV_%L9v1`K?X zU>M|92fgS*EZO=03w(k3J0DV*Q%y9}Pj_Ylft!kCody(AOIkqFH^>YjP$pVf+M zul7>@1<+t3#W*^F=Lh?i8j$Wk*X?8e@6Gxvn!4+*y5-AYKjZiQ%^PZKFLZM=xg#5P zKz~Vds%NLyF=G**Kt#ajcnL5vV?N0X@_A2jjA@J)c{i_Ky?XR{AJz2{!N^;gpfX4u za-U^o({2WU-jm0V{KSzMu&+s^17ek%gj!d1W@bk4^HHUWO()m=sue8}7>k14V7^BX zxLX8368Cc9dqR#vium5MF3u{lF=EAw3thCvq?(KrP+%$*pG$VkfbqwJRAziDCmi~Y z2-`38w#cp9w{G9u!MO=bxkW>MO0b-Zi?jB zE?l{Cf(tVx_> zP}^-5M#dr^aM$zNAhg!`jh4Z!0ETcGn!#4YRMELNY!ygI!vBS%IYC{Uq5Wk}F2#$|{%U09jKA*~6ZkP?3yl!1m=FViM*?(aNY zb~pHYcPA$&2PY=(z&Eg1!&O8f;+f7vK*kuR+m=3v)}GF&>KIUvh);y!D$neZo9^)+ z3VKxgUCHNIq^vo8OAHUTN&MK1vLg$vl8t@lr*QH$TCG-}RcFY;;8+q#F5#q-N*YNd zn@J>-X(W}l1a3ZNnr4>V^)2C?~L8v*7qU%OeQ16kB=5tI^*8vHD5YeR;@I6 z5#29?){pDtqBn^WBS?`U3e#yPlmeV($m85u@(G>&T>?9)1Ja!7VdpiGvle6}KvjsX z)-Y>0!BiWGQ{?7oR;* z;6w0j$Mze1&lfy+@#DrDW%VzkKn;oLF?l#n?&;+I3!M*Q{8?jg{%h+dfva6^dZsYL zzaO_Z$CCe*>{`E>Ybba8t$&?0v3-ZmmFlt6tmkKEUCz$wMZA;J2_-lcNYLDFS@TAN z!LwT-K)M8-TO;TfKKm@GDq}z2z3Tt&EGeuh!~A89`m63_xcwxKTm+hLH}N4K%aES+ z;bn3*%-{2x;>lW^;7U9=9DCIXo{B&_+_sT}bir|TE^Mqwm*%-;=c?6lCDw0L&$qgs z%5vu(0J2F%)U>cEXyOSKg29Q+JJ@6Dl4!@r;QaUJJ};J~S(y-+qpteF$cSz?agjk% z*c=BGXv}4nCAq%mmfXF14-?jwzjyl<=EC&%PQr2fryd5d=Ir7*wN4r-B%9B3dzk&d z^=ZMpR~XgFg~kpp_hS^aMX&E?lsZy9bh|~}y;lNB-?e>aMAI|$}%&j;Pao)!N8EjK|I3QmaTFQ48BS|W?94uriq8o zwCC}$(xiqXt+%YZ$n9&6#y&gzDPA!#rw!iTMhbY^NKVsd_A#VT?K^u>Ct>LBW=Ij+ z!~K~~-lf`=e<$U9FweWoKL2QQV|1z8>}_?D>e+pwJ-OqF_*eBOfE=UlE6MoUwyx6N zg)w^>Z%CZi0*YDd9@T+xBWsYci7eh7a}S5FNwHT?$4=feyLBDOCyit80Hv`hhtJ$G3%J|p$5V79l(mz^Co5;9 z8?_}WNzR9Ko&hV?*i?<~_SRRM9;=jgboeJvuHfrWn!Ck1vmBfo9A;mKl7{g;l$eoZ zqc204YZObvDB`exZrx0{`h@%u&v*6b;C>Z(d%SS;zys@dx0=2Xiu8}`UV(setRPmiEV*v|?blexMm zRCxG%YdDm!GEOTo6wBL)u=LeyZ;pUVY%n}#;FcthlWPC3!?`G6%*0A%D-s?n^sFa? z6v(5UKk8C^UCVGti*`aHE{>R!b|$3}a1n;)bOmnhHxmN<Xi7^Eie$ok$3_Lldt zW6y_-?qTUqwCh$e*&A@0w3YFSdzkzplV^G{1_Q*jKW<$jdlk&Z#U4DaMk@UJAiWv7 z&5n#olR<;Fws99BmJ}shEIVNPv2)a*nUJl;|NA}+Eo4$_?1BDpMW*UH%bT zkkJ+jF&D)3xi==>mg0TZe9FSwVWVhPaIE6lxSDZ}FcKr_D?AH5iwF}HgdMj}eMz#p zSI}nF(4<$~)gn_Y)U88;iV>Se;k$_a#_^I!s$wdvWZ`!7GhV~;=(1T;EW)D4^R=w9CZw35Zb!1{wZxOJ!EO9A? zXomJOw0lg@?&4OID6p+aZuP%*OLslY=gj;NoZ|IZ+Q~Mmb{A68djm+7VFQw+6iXw3 zk+F*UhzGE}Um9NqbyH$x&z9uyln{Dd!?p-hSwBHU`MxZB2zhzqFP*n={GRipe%(6O zxRwbzAt?y@-_0~!5V7;tL_XN&Seny8;J|z8JeipOG5X(nouyed*`Yja-plamOjW;4 z%OCAIM41uP`2HWtfwnWp(0(hgQhK3wgEd`36D zU8jaz8&+FD?l0UdSgsYN!clcL=`kQaITN^ke5#Ju90eEDeP?R^lUK-?;p?;?C#ha$Vw6R?D49ntNF{9R-z6{rJ zi0#IsJgo{$4^MmxQMRMdKg+_1!XhF`#A^{t*7-2MZDoh|Eekb_j>_)BeUM&9TjZPT z9qcw3ljQ-YGWRS-iyxge0+&1x{A~VaV^;|=_#L0uv_D{>%nX?_+G28#q_prDpgk&) z`!vp#eI))Ta~=J=XWNbq-qI|XY)?0`hTU>I8#ZOXO%P~INX{YAbsGHi@e2QJ?T=<~ zuGFLOs+&HK(q7CJG57Bne}fbHzIsL|SUenn(Bk;BT*CVMWw4Ax3*KU+oxMT60RpKy z$fm^i_yj&WoN79xNZWZ42^;gus_W*Ri~2iAH2Op$gb1-NK>rL zC>p}-nyl$#;cz36kylAJBndaG1zq(DZV@FZt8k+Yh+X*@Zf2_P`eWN}6-}7@qrdK? ztFu>5X1}xKK$(xBniu1NVMmFB;tSL3(JGY&Jn%_*vXQya(t%Ea36c`qd*0(d=Ps<4 z{NkhLIMFrnix z_n^6qhWjT)nB@Q0IVME>uV#CCS?6t=g}K@!qZoeacyG zCNDW7o04D{d9uhZ#VU^5&g)0zx9Q;ebsFu96!2i;Yb$qKEaAEwE~CE8|Eeh0(`URn z)+OKOPYF#Sv>b`2g(h~d;%Q@wp>o})(h~_4GVkk#o?M7brmSANVOa%P0%=XTY3}2(f<(`R8h^ z$jn(MliHmVejok({N83h{d6Y~p+bcT-fyKin(hPXR2=|Gpx~+EXGbXM4JDpJ?)RCo1G6=SV_e4v>}?-R~)8BmayIxk&-NHhSbe z<@1@#_ufCt*m;ZMNW_T|q)3W=c_45|Q_iZSMeu2jCX}cl%DtYlTs*~0 z4r37v4jIf42J`y2e){0CkMz_#o)z1D4;i}etrcVL0-^WVtuWzC^_=3D7)UuAr=+He*9TAF~Gl98aF3SpYAMmf$J`nJ*J+9fpOF zwf!o-FMl1t(evlNUoY3Y&HS0Z#$Cj`yu7@;yyyl4cB^Ohw6=`aavyG5C#7M#W}Tx- zz|YfdBo(IbmIkJ?xzs||8rn_1CH#s|N;QsEu|}g*e9oc{#gIfc+Ys1hh;Uu-@1&PA zU#;>!#vi3uP5f}HM7L;3M%bUszoTj-lq3sTk*t=pA6cx>Rja|(YPxzBgrSi5-5;0p z`;RUvJ`27FXI4$H9dz;8W-1v3F9|a46yJIV=YB2DxqqZ_4l}q!ym{VGj;{eSj-&kZ zBN5^pS^A#Wx$hq}&S4aFMZ%Xn~e07L;F|GYjf ziGV6fU3@e!V+kQ62fIR@M^69C`L$8I8&4OiJSH%qLXd?Eg&woZ0kn~Sq*uW!K)4Gr z^{c$@{%K4GM9qCw8u(`Hhk=mE$7i*kALZrJVMA>W95`^tx=u_UR22tUc}wP7i< z`?x!87e9E*7{3-%)8>psGCHRAsp+uxo&8e9}{7b$x-9O#&+;(_H_ zR$06qJryeoT2!A>zmlWSyPb`ga?EcDNRTcR!h4Alwj;qn>c1~@I+S=OM+KOLT zwPrlP$BYmSq=v=Sb|fS%LqeMYR?%t;@Q zK@)3~U>v|EQ2!I!r0&LgyU+BvA|rG0q^C1~9i~yZZ`*&-9_-w|rfIkJSMN;!3sQcQ zea6}{7xU0+){c&jLQ;;2<)?o5P!XvLfQ{KJ1Oh{G?R@$WYMfS;xaIwaj&>N-19!8)`-{le zZ$ESCvo<`g#XM_fUv$n-v!aF-?Pe)8f9G?sjl?zY5U(HmZu*v%mK7}mh5#AqY@=O_ z^4a3~PMTyw4vsMk(@!W_ZaFM;r>leH(rvA70VA2C&R676?MezK-{|krB2;Jsw2&ru(yZLavq5lKhy*^{XZ-Ca)q#FGE4Pe822Jq0S9U5yq1831at5sU}kKna2i5F8DC z{u4bVW@V5bzm@S&yrx{+!H+*&*EWZqV;raT7w7F}GM-mExW_^GC3T*G?X})bE;>I^ z>EX?{$a&D`Xz1wM&Qay2hvD(h8eWqsMi<0m82N2~ugZjimavAnz5FVA0uTJ;V%rgO z)O~3h3&ZsO=Y7<0I)jiGpDj-%ixH2V;O979{CNK+wJ= z{o+|_ORq?ayyE`B^9FeM@Q>3eL%TUSi4kMW=l4I$e7=vMjqk=EbMYz)!A*Bx!SdRy zxnLF<#`nyMn<-hiy80W z6|SZ``mOf7nIQG`uy-in7}oLDYfyFk-AMcY%HS1&puJZg?E7!mN-AxFK6D@Bz;jY* zjC`)hlKs|~Ry0v^BqrRyHSE150Z5uhogXt+rbr#JkeHW~@g*a%z9Dne6cTK0m);yA zPOfP7HVs|st}c!R(v2~;F43e(o^$6Mt}w^D`REZwj(*_a-i-ztD?!fi93zAtRT5|6 zAm+(@>rwkmtv5?h$|L?P+m-y3oMu>2_P<+Yp=_&ZeNS5YT!yjX@uq(Tv+^R;_1qtW zg$9@OYWVB@;TwNT41?)v^5_4yk`Nz{!_pG}wvcFO8esp_qCNybqi}xp_zrok&jDv@mFN)~lrLT3RcNJ4$(}_BXL@ z;>kK(e?vjc&&#al=bOB+eFBv8;c4WMm9O{K8Xd(G_e zyl6(OVYkt2q>@WCX$_{t#+ykEHJje$i`YL}(zfHAfTe|WQ~j0Et)dR{q6!#b*lZg| zDJ$l*uUOF+regvjyry8p0<-hu)J_By_dR5>SR>#tE@ylk4b2Ayf=b&$H_aeksAH5V zFhTuI3T+{@Q}?3zlRDq?mt&3fOZWI&VIb}G1qjeJ*jPPTZ@6=?r$r-4S#5&-G57WL zB3DRJNdir4hao0xrE2ub4p*72cz=M4tdG0!|BH2Qli3jzTrFHz)FfM=@MR3Fjpi%_ z>1ARYk>L9yyY6n^`|AG+@B@3Yz#;^FTXaLm~yQGpRia}v9M+E|bNF)+OkQ^##Z83ku)s$DX zv1P=ZPRnr;ZqhJtmMaJp)HdLOh6AaW%2Nq7hJLQ6p3KmGv&Hm0#_Zm-Qa=^xa!xhJ z{RsQt>TxQMmz~w8K}kmYr`x4a*6(3jv|KdN%=BnSedB%4RUha0bcg)GX<7Y$$?3lG zBkvFJ#`6XIeajvUn+L+W$UeC}|$Q2vr(ye!X6E#zihe>5L)tfxUt*muj zBFo(qQ7bVHs-a~+%p8Gd9M^8HFeA+QzIp>la*dF4o?gaA1_Z6oxu0yxyyG2@lC_zh zrUDAmj1DF9qW2oh32=JR0n-T*Vnkq>hzIRbKr!1k%_|t1h6<3ZrhOkniISSWmTdxJ zqY|X$0!XlMy0(8TMrr~4eY7<=%H2scZ z<(08T-CS)S4CaCp(Xn#Gwh0#oKA6P2YJ-bJpnVcGTe6%9u|E5`kHcA(%eb1GvSVA#po zXylo@VUHAb?#)1DpvpXvAd@-U8Y$*DOV}}FvzZ#4&5NPN-*LU--rYkEhlZJGh7}jm z%*iqyoOcA^Q|k(nxngx29o4Ma=~Z|Rz>e>^#Gb2Si|c;%3BY>9II9?Ay}L?ay4&Q( zW|I^zm_T$V2r>s6F&KbVgbZU#;vDDlmT&vsoM-FwLytDi;OcRD@5i{>dtMVi#m(%G zY0H7f@*7mtUsqPdq)|J*w#x%~_I170zTboQ^gR21pQZTrJa@G|FSq1=vOY7L3SU#Z zjPOc?NdNUP02taze`+(}$~E=5UkrsW{rKZMPs``=D=~3?sIPpj+nE|1Z}n?I8DY=l gz>u8!{h5Swffu3W5;A&k5C6s7kxmpOKOfbJfCAdH2LJ#7 literal 0 HcmV?d00001 diff --git a/modules/catalyst_support.py b/modules/catalyst_support.py index a5ca529c..6c1f77de 100644 --- a/modules/catalyst_support.py +++ b/modules/catalyst_support.py @@ -1,16 +1,54 @@ # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/modules/catalyst_support.py,v 1.34 2005/01/02 04:15:51 zhen Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/modules/catalyst_support.py,v 1.35 2005/04/04 17:48:32 rocket Exp $ -import sys,string,os,types,re,traceback +import sys,string,os,types,re,traceback,md5 + + +# a function to turn a string of non-printable characters into a string of +# hex characters +def hexify(str): + hexStr = string.hexdigits + r = '' + for ch in str: + i = ord(ch) + r = r + hexStr[(i >> 4) & 0xF] + hexStr[i & 0xF] + return r +# hexify() + +# A function to calculate the md5 sum of a file +def calc_md5(file): + m = md5.new() + f = open(file, 'r') + for line in f.readlines(): + m.update(line) + f.close() + md5sum = hexify(m.digest()) + print "MD5 (%s) = %s" % (file, md5sum) + return md5sum +# calc_md5 + +def read_from_clst(file): + line = '' + myline = '' + try: + myf=open(file,"r") + except: + raise CatalystError, "Could not open file "+file + for line in myf.readlines(): + line = string.replace(line, "\n", "") # drop newline + myline = myline + line + myf.close() + return myline +# read_from_clst # these should never be touched required_build_targets=["generic_target","generic_stage_target"] # new build types should be added here -valid_build_targets=["stage1_target","stage2_target","stage3_target","grp_target", +valid_build_targets=["stage1_target","stage2_target","stage3_target","stage4_target","grp_target", "livecd_stage1_target","livecd_stage2_target","embedded_target", - "tinderbox_target","snapshot_target","netboot"] + "tinderbox_target","snapshot_target","netboot_target"] required_config_file_values=["storedir","sharedir","distdir","portdir"] valid_config_file_values=required_config_file_values[:] @@ -23,6 +61,7 @@ valid_config_file_values.append("AUTORESUME") valid_config_file_values.append("options") valid_config_file_values.append("DEBUG") valid_config_file_values.append("VERBOSE") +valid_config_file_values.append("PURGE") verbosity=1 diff --git a/modules/embedded_target.py b/modules/embedded_target.py index a4d0d45c..03d20e48 100644 --- a/modules/embedded_target.py +++ b/modules/embedded_target.py @@ -1,6 +1,6 @@ # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/modules/embedded_target.py,v 1.8 2005/01/13 00:04:49 zhen Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/modules/embedded_target.py,v 1.9 2005/04/04 17:48:32 rocket Exp $ """ This class works like a 'stage3'. A stage2 tarball is unpacked, but instead @@ -22,58 +22,19 @@ class embedded_target(generic_stage_target): def __init__(self,spec,addlargs): self.required_values=[] self.valid_values=[] - self.valid_values.extend(["embedded/empty","embedded/rm","embedded/unmerge","embedded/fs-prepare","embedded/fs-finish","embedded/mergeroot","embedded/packages","embedded/use","embedded/fs-type","boot/kernel"]) + self.valid_values.extend(["embedded/empty","embedded/rm","embedded/unmerge","embedded/fs-prepare","embedded/fs-finish","embedded/mergeroot","embedded/packages","embedded/use","embedded/fs-type","embedded/runscript","boot/kernel"]) if addlargs.has_key("embedded/fs-type"): self.valid_values.append("embedded/fs-ops") - # this kernel code is also from livecd stage2 + self.set_build_kernel_vars(addlargs) - if addlargs.has_key("boot/kernel"): - if type(addlargs["boot/kernel"]) == types.StringType: - loopy=[addlargs["boot/kernel"]] - else: - loopy=addlargs["boot/kernel"] - - for x in loopy: - self.required_values.append("boot/kernel/"+x+"/sources") - self.required_values.append("boot/kernel/"+x+"/config") - self.valid_values.append("boot/kernel/"+x+"/extraversion") - self.valid_values.append("boot/kernel/"+x+"/packages") - self.valid_values.append("boot/kernel/"+x+"/use") - self.valid_values.append("boot/kernel/"+x+"/gk_kernargs") - self.valid_values.append("boot/kernel/"+x+"/gk_action") - - generic_stage_target.__init__(self,spec,addlargs) + generic_stage_target.__init__(self,spec,addlargs) self.settings["image_path"]=self.settings["storedir"]+"/builds/"+self.settings["target_subpath"]+"/image" - - # taken from livecd-stage3 code - def unmerge(self): - print "Unmerging packages" - if self.settings.has_key("embedded/unmerge"): - if type(self.settings["embedded/unmerge"])==types.StringType: - self.settings["embedded/unmerge"]=[self.settings["embedded/unmerge"]] - myunmerge=self.settings["embedded/unmerge"][:] - - for x in range(0,len(myunmerge)): - myunmerge[x]="'"+myunmerge[x]+"'" - myunmerge=string.join(myunmerge) - # before cleaning unmerge stuff - cmd("/bin/bash "+self.settings["sharedir"]+"/targets/"+self.settings["target"]+"/unmerge.sh "+myunmerge,"unmerge script failed.") - - def clean(self): - if self.settings.has_key("embedded/rm"): - if type(self.settings["embedded/rm"])==types.StringType: - self.settings["embedded/rm"]=[self.settings["embedded/rm"]] - print "Removing directories from image" - for x in self.settings["embedded/rm"]: - print "Removing "+x - os.system("rm -rf "+self.settings["chroot_path"]+"/tmp/mergeroot"+x) - def build_fs(self): try: if self.settings.has_key("embedded/fs-type"): - cmd("/bin/bash "+self.settings["sharedir"]+"/targets/embedded/embedded.sh package","filesystem packaging failed") + cmd("/bin/bash "+self.settings["controller_file"]+" package","filesystem packaging failed") except CatalystError: self.unbind() raise CatalystError, "embedded filesystem creation aborting due to error." @@ -95,101 +56,28 @@ class embedded_target(generic_stage_target): self.unbind() raise CatalystError, "embedded post filesystem creation script aborting due to error" - def build_kernel(self): - mynames=self.settings["boot/kernel"] - if type(mynames)==types.StringType: - mynames=[mynames] - args=[] - args.append(`len(mynames)`) - - for kname in mynames: - args.append(kname) - args.append(self.settings["boot/kernel/"+kname+"/sources"]) - try: - if not os.path.exists(self.settings["boot/kernel/"+kname+"/config"]): - self.unbind() - raise CatalystError, "Can't find kernel config: " \ - +self.settings["boot/kernel/"+kname+"/config"] - - except TypeError: - raise CatalystError, "Required value boot/kernel/config not specified" - - if self.settings.has_key("boot/kernel/"+kname+"/extraversion"): - args.append(self.settings["boot/kernel/"+kname+"/extraversion"]) - else: - args.append("NULL_VALUE") - if self.settings.has_key("boot/kernel/"+kname+"/gk_action"): - args.append(self.settings["boot/kernel/"+kname+"/gk_action"]) - - for extra in ["use","packages","gk_kernargs"]: - if self.settings.has_key("boot/kernel/"+kname+"/"+extra): - myex=self.settings["boot/kernel/"+kname+"/"+extra] - if type(myex)==types.ListType: - myex=string.join(myex) - try: - myf=open(self.settings["chroot_path"]+"/var/tmp/"+kname+"."+extra,"w") - except: - self.unbind() - raise CatalystError,"Couldn't create file /var/tmp/"+kname+"."+extra+" in chroot." - if extra=="use": - myf.write("export USE=\""+myex+"\"\n") - if extra=="gk_kernargs": - myf.write("export clst_embedded_gk_kernargs=\""+myex+"\"\n") - else: - myf.write(myex+"\n") - myf.close() - try: - cmd("cp "+self.settings["boot/kernel/"+kname+"/config"]+" "+ \ - self.settings["chroot_path"]+"/var/tmp/"+kname+".config", \ - "Couldn't copy kernel config: "+self.settings["boot/kernel/"+kname+"/config"]) - - except CatalystError: - self.unbind() - - # If we need to pass special options to the bootloader - # for this kernel put them into the environment. - if self.settings.has_key("boot/kernel/"+kname+"/kernelopts"): - myopts=self.settings["boot/kernel/"+kname+"/kernelopts"] - - if type(myopts) != types.StringType: - myopts = string.join(myopts) - os.putenv(kname+"_kernelopts", myopts) - - else: - os.putenv(kname+"_kernelopts", "") - - # execute the script that builds the kernel - cmd("/bin/bash "+self.settings["sharedir"]+"/targets/embedded/embedded.sh kernel "+list_bashify(args), - "Runscript kernel build failed") - - def run_local(self): - mypackages=list_bashify(self.settings["embedded/packages"]) - print "Merging embedded image" - try: - cmd("/bin/bash "+self.settings["sharedir"]+"/targets/embedded/embedded.sh run") - except CatalystError: - self.unbind() - raise CatalystError, "Embedded build aborted due to error." - - if self.settings.has_key("boot/kernel"): - self.build_kernel() - - self.unmerge() - self.clean() - - self.pre_build_fs() - self.build_fs() - self.post_build_fs() - def set_action_sequence(self): - self.settings["action_sequence"]=["dir_setup","unpack_and_bind","chroot_setup",\ - "setup_environment","run_local","unbind","capture"] - + self.settings["action_sequence"]=["dir_setup","unpack","unpack_snapshot",\ + "config_profile_link","setup_confdir","bind","chroot_setup",\ + "setup_environment","build_packages","build_kernel","unmerge","unbind",\ + "clear_autoresume","remove","empty","clean","pre_build_fs","build_fs","post_build_fs"] + def set_use(self): self.settings["use"]=self.settings["embedded/use"] + def set_stage_path(self): self.settings["stage_path"]=self.settings["chroot_path"]+"/tmp/mergeroot" print "embedded stage path is "+self.settings["stage_path"] + + def set_root_path(self): + self.settings["root_path"]="/tmp/mergeroot" + print "embedded root path is "+self.settings["root_path"] + def set_dest_path(self): + self.settings["destpath"]=self.settings["chroot_path"]+self.settings["root_path"] + + def set_target_path(self): + self.settings["target_path"]=self.settings["storedir"]+"/builds/"+self.settings["target_subpath"] + def register(foo): foo.update({"embedded":embedded_target}) return foo diff --git a/modules/generic_stage_target.py b/modules/generic_stage_target.py index e7c7561d..fb72812b 100644 --- a/modules/generic_stage_target.py +++ b/modules/generic_stage_target.py @@ -1,6 +1,6 @@ # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/modules/generic_stage_target.py,v 1.24 2005/03/24 15:37:55 wolf31o2 Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/modules/generic_stage_target.py,v 1.25 2005/04/04 17:48:32 rocket Exp $ """ This class does all of the chroot setup, copying of files, etc. It is @@ -26,7 +26,7 @@ class generic_stage_target(generic_target): # map the mainarch we are running under to the mainarches we support for # building stages and LiveCDs. (for example, on amd64, we can build stages for # x86 or amd64. - targetmap={ + targetmap={ "x86" : ["x86"], "amd64" : ["x86","amd64"], "sparc64" : ["sparc","sparc64"], @@ -41,7 +41,7 @@ class generic_stage_target(generic_target): "arm" : ["arm"] } - machinemap={ + machinemap={ "i386" : "x86", "i486" : "x86", "i586" : "x86", @@ -63,7 +63,7 @@ class generic_stage_target(generic_target): "armeb" : "arm", "armv5b" : "arm" } - + mymachine=os.uname()[4] if not machinemap.has_key(mymachine): raise CatalystError, "Unknown machine type "+mymachine @@ -87,6 +87,7 @@ class generic_stage_target(generic_target): # call arch constructor, pass our settings self.arch=self.subarchmap[self.settings["subarch"]](self.settings) + print "Using target:",self.settings["target"] # self.settings["mainarch"] should now be set by our arch constructor, so we print # a nice informational message: if self.settings["mainarch"]==self.settings["hostarch"]: @@ -104,13 +105,22 @@ class generic_stage_target(generic_target): # define all of our core variables self.set_target_profile() self.set_target_subpath() + + # set paths self.set_snapshot_path() self.set_target_path() self.set_source_path() self.set_chroot_path() + self.set_root_path() + self.set_dest_path() + self.set_stage_path() + + self.set_controller_file() self.set_action_sequence() self.set_use() - self.set_stage_path() + self.set_cleanables() + self.set_spec_prefix() + self.set_iso_volume_id() # this next line checks to make sure that the specified variables exist on disk. file_locate(self.settings,["source_path","snapshot_path","distdir"],expand=0) @@ -145,6 +155,9 @@ class generic_stage_target(generic_target): # for the chroot: os.environ["CCACHE_DIR"]="/var/tmp/ccache" + def set_spec_prefix(self): + self.settings["spec_prefix"]=self.settings["target"] + def set_target_profile(self): self.settings["target_profile"]=self.settings["profile"] @@ -157,26 +170,54 @@ class generic_stage_target(generic_target): def set_source_path(self): self.settings["source_path"]=self.settings["storedir"]+"/builds/"+self.settings["source_subpath"]+".tar.bz2" + if os.path.isfile(self.settings["source_path"]): + if os.path.exists(self.settings["source_path"]): + self.settings["source_path_md5sum"]=calc_md5(self.settings["source_path"]) + def set_dest_path(self): + self.settings["destpath"]=self.settings["chroot_path"] + + def set_cleanables(self): + self.settings["cleanables"]=["/etc/resolv.conf","/var/tmp/*","/tmp/*","/root/*",\ + "/usr/portage"] + def set_snapshot_path(self): self.settings["snapshot_path"]=self.settings["storedir"]+"/snapshots/portage-"+self.settings["snapshot"]+".tar.bz2" + if os.path.exists(self.settings["snapshot_path"]): + self.settings["snapshot_path_md5sum"]=calc_md5(self.settings["snapshot_path"]) def set_chroot_path(self): self.settings["chroot_path"]=self.settings["storedir"]+"/tmp/"+self.settings["target_subpath"] - + + def set_controller_file(self): + self.settings["controller_file"]=self.settings["sharedir"]+"/targets/"+self.settings["target"]+"/"+self.settings["target"]+"-controller.sh" + def set_iso_volume_id(self): + if self.settings.has_key(self.settings["spec_prefix"]+"/volid"): + self.settings["iso_volume_id"] = string.join(self.settings[self.settings["spec_prefix"]+"/volid"]) + if len(self.settings["iso_volume_id"])>32: + raise CatalystError,"ISO VOLUME ID: volid must not exceed 32 characters." + else: + self.settings["iso_volume_id"] = "catalyst " + self.settings["snapshot"] + def set_action_sequence(self): #Default action sequence for run method - self.settings["action_sequence"]=["dir_setup","unpack_and_bind","chroot_setup",\ - "setup_environment","run_local","preclean","unbind","clean","capture"] + self.settings["action_sequence"]=["dir_setup","unpack","unpack_snapshot",\ + "config_profile_link","setup_confdir","bind","chroot_setup",\ + "setup_environment","run_local","preclean","unbind","clear_autoresume","clean","capture"] def set_use(self): pass def set_stage_path(self): self.settings["stage_path"]=self.settings["chroot_path"] + def set_mounts(self): pass - + + def set_root_path(self): + # ROOT= variable for emerges + self.settings["root_path"]="/" + def mount_safety_check(self): mypath=self.settings["chroot_path"] @@ -208,50 +249,116 @@ class generic_stage_target(generic_target): raise CatalystError, "Unable to auto-unbind "+x def dir_setup(self): - print "Setting up directories..." - self.mount_safety_check() + if self.settings.has_key("AUTORESUME") \ + and os.path.exists(self.settings["chroot_path"]+"/tmp/.clst_dir_setup"): + print "Resume point detected, skipping dir_setup operation..." + else: + print "Setting up directories..." + self.mount_safety_check() - if os.path.exists(self.settings["chroot_path"]): - cmd("rm -rf "+self.settings["chroot_path"],\ - "Could not remove existing directory: "+self.settings["chroot_path"]) + if os.path.exists(self.settings["chroot_path"]): + cmd("rm -rf "+self.settings["chroot_path"],\ + "Could not remove existing directory: "+self.settings["chroot_path"]) - if not os.path.exists(self.settings["chroot_path"]+"/tmp"): - os.makedirs(self.settings["chroot_path"]+"/tmp",1777) + if not os.path.exists(self.settings["chroot_path"]+"/tmp"): + os.makedirs(self.settings["chroot_path"]+"/tmp",1777) - if not os.path.exists(self.settings["chroot_path"]): - os.makedirs(self.settings["chroot_path"],0755) + if not os.path.exists(self.settings["chroot_path"]): + os.makedirs(self.settings["chroot_path"],0755) - if self.settings.has_key("PKGCACHE"): - if not os.path.exists(self.settings["pkgcache_path"]): - os.makedirs(self.settings["pkgcache_path"],0755) + if self.settings.has_key("PKGCACHE"): + if not os.path.exists(self.settings["pkgcache_path"]): + os.makedirs(self.settings["pkgcache_path"],0755) + touch(self.settings["chroot_path"]+"/tmp/.clst_dir_setup") - def unpack_and_bind(self): - print "Unpacking stage tarball..." - cmd("tar xjpf "+self.settings["source_path"]+" -C "+self.settings["chroot_path"],\ - "Error unpacking tarball") - - if os.path.exists(self.settings["chroot_path"]+"/usr/portage"): - print "Cleaning up existing portage tree snapshot..." - cmd("rm -rf "+self.settings["chroot_path"]+"/usr/portage",\ - "Error removing existing snapshot directory.") + def unpack(self): + if os.path.exists(self.settings["chroot_path"]+"/tmp/.clst_unpack"): + clst_unpack_md5sum=read_from_clst(self.settings["chroot_path"]+"/tmp/.clst_unpack") + + if self.settings.has_key("AUTORESUME") \ + and os.path.exists(self.settings["chroot_path"]+"/tmp/.clst_unpack") \ + and self.settings["source_path_md5sum"] != clst_unpack_md5sum: + print "InValid Resume point detected, cleaning up ..." + os.remove(self.settings["chroot_path"]+"/tmp/.clst_dir_setup") + os.remove(self.settings["chroot_path"]+"/tmp/.clst_unpack") + self.dir_setup() + if self.settings.has_key("AUTORESUME") \ + and os.path.exists(self.settings["chroot_path"]+"/tmp/.clst_unpack") \ + and self.settings["source_path_md5sum"] == clst_unpack_md5sum: + print "Valid Resume point detected, skipping unpack ..." + else: + print "Unpacking ..." + if not os.path.exists(self.settings["chroot_path"]): + os.makedirs(self.settings["chroot_path"]) + + cmd("tar xjpf "+self.settings["source_path"]+" -C "+self.settings["chroot_path"],\ + "Error unpacking ") + + if self.settings.has_key("source_path_md5sum"): + myf=open(self.settings["chroot_path"]+"/tmp/.clst_unpack","w") + myf.write(self.settings["source_path_md5sum"]) + myf.close() + + def unpack_snapshot(self): + if os.path.exists(self.settings["chroot_path"]+"/tmp/.clst_unpack_portage"): + clst_unpack_portage_md5sum=read_from_clst(self.settings["chroot_path"]+"/tmp/.clst_unpack_portage") - print "Unpacking portage tree snapshot..." - cmd("tar xjpf "+self.settings["snapshot_path"]+" -C "+\ - self.settings["chroot_path"]+"/usr","Error unpacking snapshot") + if self.settings.has_key("AUTORESUME") \ + and os.path.exists(self.settings["chroot_path"]+"/usr/portage/") \ + and os.path.exists(self.settings["chroot_path"]+"/tmp/.clst_unpack_portage") \ + and self.settings["snapshot_path_md5sum"] == clst_unpack_portage_md5sum: + print "Valid Resume point detected, skipping unpack of portage tree..." + else: + if os.path.exists(self.settings["chroot_path"]+"/usr/portage"): + print "Cleaning up existing portage tree ..." + cmd("rm -rf "+self.settings["chroot_path"]+"/usr/portage",\ + "Error removing existing snapshot directory.") - print "Configuring profile link..." - cmd("rm -f "+self.settings["chroot_path"]+"/etc/make.profile",\ - "Error zapping profile link") - cmd("ln -sf ../usr/portage/profiles/"+self.settings["target_profile"]+\ - " "+self.settings["chroot_path"]+"/etc/make.profile","Error creating profile link") - - if self.settings.has_key("portage_confdir"): + print "Unpacking portage tree ..." + cmd("tar xjpf "+self.settings["snapshot_path"]+" -C "+\ + self.settings["chroot_path"]+"/usr","Error unpacking snapshot") + + print "Setting snapshot autoresume point" + myf=open(self.settings["chroot_path"]+"/tmp/.clst_unpack_portage","w") + myf.write(self.settings["snapshot_path_md5sum"]) + myf.close() + + def config_profile_link(self): + print "Configuring profile link..." + cmd("rm -f "+self.settings["chroot_path"]+"/etc/make.profile",\ + "Error zapping profile link") + cmd("ln -sf ../usr/portage/profiles/"+self.settings["target_profile"]+\ + " "+self.settings["chroot_path"]+"/etc/make.profile","Error creating profile link") + + def setup_confdir(self): + if self.settings.has_key("portage_confdir"): print "Configuring /etc/portage..." cmd("rm -rf "+self.settings["chroot_path"]+"/etc/portage","Error zapping /etc/portage") cmd("cp -R "+self.settings["portage_confdir"]+"/ "+self.settings["chroot_path"]+\ "/etc/portage","Error copying /etc/portage") + + def portage_overlay(self): + # copy over the portage overlays + # Always copy over the overlay incase it has changed + if self.settings.has_key("portage_overlay"): + if type(self.settings["portage_overlay"])==types.StringType: + self.settings[self.settings["portage_overlay"]]=[self.settings["portage_overlay"]] + + for x in self.settings["portage_overlay"]: + if os.path.exists(x): + print "Copying overlay dir " +x + cmd("mkdir -p "+self.settings["chroot_path"]+x) + cmd("cp -R "+x+"/* "+self.settings["chroot_path"]+x) + def root_overlay(self): + # copy over the root_overlay + # Always copy over the overlay incase it has changed + if self.settings.has_key(self.settings["spec_prefix"]+"/root_overlay"): + print "Copying root overlay ..." + cmd("rsync -a "+self.settings[self.settings["spec_prefix"]+"/root_overlay"]+"/* "+\ + self.settings["chroot_path"], self.settings["spec_prefix"]+"/root_overlay copy failed.") + def bind(self): for x in self.mounts: if not os.path.exists(self.settings["chroot_path"]+x): os.makedirs(self.settings["chroot_path"]+x,0755) @@ -264,7 +371,7 @@ class generic_stage_target(generic_target): if retval!=0: self.unbind() raise CatalystError,"Couldn't bind mount "+src - + def unbind(self): ouch=0 mypath=self.settings["chroot_path"] @@ -295,74 +402,110 @@ class generic_stage_target(generic_target): raise CatalystError,"Couldn't umount one or more bind-mounts; aborting for safety." def chroot_setup(self): - print "Setting up chroot..." - cmd("cp /etc/resolv.conf "+self.settings["chroot_path"]+"/etc",\ - "Could not copy resolv.conf into place.") - - # copy over the envscript, if applicable - if self.settings.has_key("ENVSCRIPT"): - if not os.path.exists(self.settings["ENVSCRIPT"]): - raise CatalystError, "Can't find envscript "+self.settings["ENVSCRIPT"] - cmd("cp "+self.settings["ENVSCRIPT"]+" "+self.settings["chroot_path"]+"/tmp/envscript",\ - "Could not copy envscript into place.") - - # copy over /etc/hosts from the host in case there are any specialties in there - if os.path.exists("/etc/hosts"): - cmd("mv "+self.settings["chroot_path"]+"/etc/hosts "+self.settings["chroot_path"]+\ - "/etc/hosts.bck", "Could not backup /etc/hosts") - cmd("cp /etc/hosts "+self.settings["chroot_path"]+"/etc/hosts", "Could not copy /etc/hosts") - - # modify and write out make.conf (for the chroot) - cmd("rm -f "+self.settings["chroot_path"]+"/etc/make.conf") - myf=open(self.settings["chroot_path"]+"/etc/make.conf","w") - myf.write("# These settings were set by the catalyst build script that automatically built this stage\n") - myf.write("# Please consult /etc/make.conf.example for a more detailed example\n") - myf.write('CFLAGS="'+self.settings["CFLAGS"]+'"\n') - myf.write('CHOST="'+self.settings["CHOST"]+'"\n') - # figure out what our USE vars are for building - myusevars=[] - if self.settings.has_key("HOSTUSE"): - myusevars.extend(self.settings["HOSTUSE"]) - - if self.settings.has_key("use"): - myusevars.extend(self.settings["use"]) - myf.write('USE="'+string.join(myusevars)+'"\n') - - if self.settings.has_key("CXXFLAGS"): - myf.write('CXXFLAGS="'+self.settings["CXXFLAGS"]+'"\n') - - else: - myf.write('CXXFLAGS="${CFLAGS}"\n') - myf.close() + print "Setting up chroot..." + cmd("cp /etc/resolv.conf "+self.settings["chroot_path"]+"/etc",\ + "Could not copy resolv.conf into place.") + + # copy over the envscript, if applicable + if self.settings.has_key("ENVSCRIPT"): + if not os.path.exists(self.settings["ENVSCRIPT"]): + raise CatalystError, "Can't find envscript "+self.settings["ENVSCRIPT"] + cmd("cp "+self.settings["ENVSCRIPT"]+" "+self.settings["chroot_path"]+"/tmp/envscript",\ + "Could not copy envscript into place.") + + # copy over /etc/hosts from the host in case there are any specialties in there + if os.path.exists("/etc/hosts"): + cmd("mv "+self.settings["chroot_path"]+"/etc/hosts "+self.settings["chroot_path"]+\ + "/etc/hosts.bck", "Could not backup /etc/hosts") + cmd("cp /etc/hosts "+self.settings["chroot_path"]+"/etc/hosts", "Could not copy /etc/hosts") + + # modify and write out make.conf (for the chroot) + cmd("rm -f "+self.settings["chroot_path"]+"/etc/make.conf") + myf=open(self.settings["chroot_path"]+"/etc/make.conf","w") + myf.write("# These settings were set by the catalyst build script that automatically built this stage\n") + myf.write("# Please consult /etc/make.conf.example for a more detailed example\n") + myf.write('CFLAGS="'+self.settings["CFLAGS"]+'"\n') + myf.write('CHOST="'+self.settings["CHOST"]+'"\n') + # figure out what our USE vars are for building + myusevars=[] + if self.settings.has_key("HOSTUSE"): + myusevars.extend(self.settings["HOSTUSE"]) + + if self.settings.has_key("use"): + myusevars.extend(self.settings["use"]) + myf.write('USE="'+string.join(myusevars)+'"\n') + + if self.settings.has_key("CXXFLAGS"): + myf.write('CXXFLAGS="'+self.settings["CXXFLAGS"]+'"\n') + + if self.settings.has_key("portage_overlay"): + if type(self.settings["portage_overlay"])==types.StringType: + self.settings[self.settings["portage_overlay"]]=[self.settings["portage_overlay"]] + + myf.write('PORTDIR_OVERLAY="'+string.join(self.settings["portage_overlay"])+'"\n') + else: + myf.write('CXXFLAGS="${CFLAGS}"\n') + myf.close() def clean(self): - destpath=self.settings["chroot_path"] - - cleanables=["/etc/resolv.conf","/var/tmp/*","/tmp/*","/root/*","/usr/portage"] - - if self.settings["target"]=="stage1": - destpath+="/tmp/stage1root" - # this next stuff can eventually be integrated into the python - # and glibc ebuilds themselves (USE="build"): - cleanables.extend(["/usr/share/gettext","/usr/lib/python2.2/test",\ - "/usr/lib/python2.2/encodings","/usr/lib/python2.2/email",\ - "/usr/lib/python2.2/lib-tk","/usr/share/zoneinfo"]) - - for x in cleanables: - print "Cleaning chroot: "+x+"..." - cmd("rm -rf "+destpath+x,"Couldn't clean "+x) + for x in self.settings["cleanables"]: + print "Cleaning chroot: "+x+"... " + cmd("rm -rf "+self.settings["destpath"]+x,"Couldn't clean "+x) # put /etc/hosts back into place - cmd("mv -f "+self.settings["chroot_path"]+"/etc/hosts.bck "+self.settings["chroot_path"]+\ - "/etc/hosts", "Could not replace /etc/hosts") - - cmd("/bin/bash "+self.settings["sharedir"]+"/targets/"+self.settings["target"]+\ - "/"+self.settings["target"]+".sh clean","clean script failed.") + if os.path.exists("/etc/hosts.bck"): + cmd("mv -f "+self.settings["chroot_path"]+"/etc/hosts.bck "+self.settings["chroot_path"]+\ + "/etc/hosts", "Could not replace /etc/hosts") + + if os.path.exists(self.settings["controller_file"]): + cmd("/bin/bash "+self.settings["controller_file"]+" clean","clean script failed.") + + def empty(self): + if self.settings.has_key(self.settings["spec_prefix"]+"/empty"): + if type(self.settings[self.settings["spec_prefix"]+"/empty"])==types.StringType: + self.settings[self.settings["spec_prefix"]+"/empty"]=[self.settings[self.settings["spec_prefix"]+"/empty"]] + for x in self.settings[self.settings["spec_prefix"]+"/empty"]: + myemp=self.settings["destpath"]+x + if not os.path.isdir(myemp): + print x,"not a directory or does not exist, skipping 'empty' operation." + continue + print "Emptying directory",x + # stat the dir, delete the dir, recreate the dir and set + # the proper perms and ownership + mystat=os.stat(myemp) + shutil.rmtree(myemp) + os.makedirs(myemp,0755) + os.chown(myemp,mystat[ST_UID],mystat[ST_GID]) + os.chmod(myemp,mystat[ST_MODE]) + + def remove(self): + if self.settings.has_key(self.settings["spec_prefix"]+"/rm"): + if type(self.settings[self.settings["spec_prefix"]+"/rm"])==types.StringType: + self.settings[self.settings["spec_prefix"]+"/rm"]=[self.settings[self.settings["spec_prefix"]+"/rm"]] + for x in self.settings[self.settings["spec_prefix"]+"/rm"]: + # we're going to shell out for all these cleaning operations, + # so we get easy glob handling + print "livecd: removing "+x + os.system("rm -rf "+self.settings["chroot_path"]+x) + try: + if os.path.exists(self.settings["controller_file"]): + cmd("/bin/bash "+self.settings["controller_file"]+" clean",\ + "Clean runscript failed.") + except: + self.unbind() + raise + + def clear_autoresume(self): + # clean resume points since they are no longer needed + if self.settings.has_key("AUTORESUME"): + print "Removing AutoResume Points: ..." + cmd("rm -f "+self.settings["chroot_path"]+"/tmp/.clst*",\ + "Couldn't remove resume points") def preclean(self): try: - cmd("/bin/bash "+self.settings["sharedir"]+"/targets/"+self.settings["target"]+\ - "/"+self.settings["target"]+".sh preclean","preclean script failed.") + if os.path.exists(self.settings["controller_file"]): + cmd("/bin/bash "+self.settings["controller_file"]+" preclean","preclean script failed.") except: self.unbind() @@ -378,11 +521,6 @@ class generic_stage_target(generic_target): if not os.path.exists(mypath): os.makedirs(mypath) - # clean resume points since they are no longer needed - if self.settings.has_key("AUTORESUME"): - cmd("rm -f "+self.settings["chroot_path"]+"/tmp/.clst*",\ - "Couldn't remove resume points") - print "Creating stage tarball..." cmd("tar cjf "+self.settings["target_path"]+" -C "+self.settings["stage_path"]+\ @@ -390,8 +528,8 @@ class generic_stage_target(generic_target): def run_local(self): try: - cmd("/bin/bash "+self.settings["sharedir"]+"/targets/"+self.settings["target"]+\ - "/"+self.settings["target"]+".sh run","build script failed") + if os.path.exists(self.settings["controller_file"]): + cmd("/bin/bash "+self.settings["controller_file"]+" run","run script failed.") except CatalystError: self.unbind() @@ -410,15 +548,166 @@ class generic_stage_target(generic_target): elif type(self.settings[x])==types.ListType: os.environ[varname]=string.join(self.settings[x]) + def purge(self): + if self.settings.has_key("PKGCACHE"): + print "purging the pkgcache ..." + + myemp=self.settings["pkgcache_path"] + if not os.path.isdir(myemp): + print myemp,"not a directory or does not exist, skipping 'pkgcache purge' operation." + else: + print "Emptying directory",myemp + # stat the dir, delete the dir, recreate the dir and set + # the proper perms and ownership + mystat=os.stat(myemp) + shutil.rmtree(myemp) + os.makedirs(myemp,0755) + def run(self): for x in self.settings["action_sequence"]: print "Running action sequence: "+x - if x == 'chroot_setup': - try: - self.chroot_setup() - except: - self.unbind() - raise - else: + try: apply(getattr(self,x)) + except: + self.unbind() + raise + #if x == 'chroot_setup': + # try: + # self.chroot_setup() + # except: + # self.unbind() + # raise + #else: + # apply(getattr(self,x)) + + def unmerge(self): + if self.settings.has_key("AUTORESUME") \ + and os.path.exists(self.settings["chroot_path"]+"/tmp/.clst_unmerge"): + print "Resume point detected, skipping unmerge operation..." + else: + if self.settings.has_key(self.settings["spec_prefix"]+"/unmerge"): + print "has key unmerge" + if type(self.settings[self.settings["spec_prefix"]+"/unmerge"])==types.StringType: + self.settings[self.settings["spec_prefix"]+"/unmerge"]=[self.settings[self.settings["spec_prefix"]+"/unmerge"]] + print "key is a string" + myunmerge=self.settings[self.settings["spec_prefix"]+"/unmerge"][:] + + for x in range(0,len(myunmerge)): + #surround args with quotes for passing to bash, + #allows things like "<" to remain intact + myunmerge[x]="'"+myunmerge[x]+"'" + myunmerge=string.join(myunmerge) + + #before cleaning, unmerge stuff: + try: + cmd("/bin/bash "+self.settings["sharedir"]+"/targets/" \ + +self.settings["target"]+"/unmerge.sh "+myunmerge,"Unmerge script failed.") + print "unmerge shell script" + except CatalystError: + self.unbind() + raise + touch(self.settings["chroot_path"]+"/tmp/.clst_unmerge") + + def target_setup(self): + cmd("/bin/bash "+self.settings["controller_file"]+" cdfs","CDFS script failed.") + + def setup_overlay(self): + if self.settings.has_key(self.settings["spec_prefix"]+"/overlay"): + cmd("rsync -a "+self.settings[self.settings["spec_prefix"]+"/overlay"]+"/* "+\ + self.settings["target_path"], self.settings["spec_prefix"]+"overlay copy failed.") + + # clean up the resume points + if self.settings.has_key("AUTORESUME"): + cmd("rm -f "+self.settings["chroot_path"]+"/tmp/.clst*",\ + "Couldn't remove resume points") + + def create_iso(self): + # create the ISO - this is the preferred method (the iso scripts do not always work) + if self.settings.has_key(self.settings["spec_prefix"]+"/iso"): + cmd("/bin/bash "+self.settings["controller_file"]+" iso "+\ + self.settings[self.settings["spec_prefix"]+"/iso"],"ISO creation script failed.") + def build_packages(self): + + if self.settings.has_key("AUTORESUME") \ + and os.path.exists(self.settings["chroot_path"]+"/tmp/.clst_build_packages"): + print "Resume point detected, skipping build_packages operation..." + else: + mypack=list_bashify(self.settings[self.settings["spec_prefix"]+"/packages"]) + try: + cmd("/bin/bash "+self.settings["controller_file"]+\ + " build_packages "+mypack) + touch(self.settings["chroot_path"]+"/tmp/.clst_build_packages") + except CatalystError: + self.unbind() + raise CatalystError,self.settings["spec_prefix"] + "build aborting due to error." + + def build_kernel(self): + if self.settings.has_key("boot/kernel"): + try: + mynames=self.settings["boot/kernel"] + if type(mynames)==types.StringType: + mynames=[mynames] + + for kname in mynames: + try: + if not os.path.exists(self.settings["boot/kernel/"+kname+"/config"]): + self.unbind() + raise CatalystError, "Can't find kernel config: " \ + +self.settings["boot/kernel/"+kname+"/config"] + + except TypeError: + raise CatalystError, "Required value boot/kernel/config not specified" + + try: + cmd("cp "+self.settings["boot/kernel/"+kname+"/config"]+" "+ \ + self.settings["chroot_path"]+"/var/tmp/"+kname+".config", \ + "Couldn't copy kernel config: "+self.settings["boot/kernel/"+kname+"/config"]) + + except CatalystError: + self.unbind() + + # If we need to pass special options to the bootloader + # for this kernel put them into the environment. + if self.settings.has_key("boot/kernel/"+kname+"/kernelopts"): + myopts=self.settings["boot/kernel/"+kname+"/kernelopts"] + + if type(myopts) != types.StringType: + myopts = string.join(myopts) + os.putenv(kname+"_kernelopts", myopts) + + else: + os.putenv(kname+"_kernelopts", "") + + if not self.settings.has_key("boot/kernel/"+kname+"/extraversion"): + self.settings["boot/kernel/"+kname+"/extraversion"]="NULL_VALUE" + + os.putenv("clst_kextraversion", self.settings["boot/kernel/"+kname+"/extraversion"]) + + # execute the script that builds the kernel + cmd("/bin/bash "+self.settings["controller_file"]+" kernel "+kname,\ + "Runscript kernel build failed") + + except CatalystError: + self.unbind() + raise CatalystError,"build aborting due to kernel build error." + + def set_build_kernel_vars(self,addlargs): + + if not addlargs.has_key("boot/kernel"): + raise CatalystError, "Required value boot/kernel not specified." + + if type(addlargs["boot/kernel"]) == types.StringType: + loopy=[addlargs["boot/kernel"]] + else: + loopy=addlargs["boot/kernel"] + + for x in loopy: + self.required_values.append("boot/kernel/"+x+"/sources") + self.required_values.append("boot/kernel/"+x+"/config") + self.valid_values.append("boot/kernel/"+x+"/extraversion") + self.valid_values.append("boot/kernel/"+x+"/packages") + self.valid_values.append("boot/kernel/"+x+"/use") + self.valid_values.append("boot/kernel/"+x+"/gk_kernargs") + self.valid_values.append("boot/kernel/"+x+"/gk_action") + diff --git a/modules/grp_target.py b/modules/grp_target.py index 91be65e3..01255038 100644 --- a/modules/grp_target.py +++ b/modules/grp_target.py @@ -1,6 +1,6 @@ # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/modules/grp_target.py,v 1.6 2005/01/04 21:13:43 wolf31o2 Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/modules/grp_target.py,v 1.7 2005/04/04 17:48:32 rocket Exp $ """ The builder class for GRP (Gentoo Reference Platform) builds. @@ -37,8 +37,7 @@ class grp_target(generic_stage_target): # example call: "grp.sh run pkgset cd1 xmms vim sys-apps/gleep" mypackages=list_bashify(self.settings["grp/"+pkgset+"/packages"]) try: - cmd("/bin/bash "+self.settings["sharedir"]+\ - "/targets/grp/grp.sh run "+self.settings["grp/"+pkgset+"/type"]\ + cmd("/bin/bash "+self.settings["controller_file"]+" run "+self.settings["grp/"+pkgset+"/type"]\ +" "+pkgset+" "+mypackages) except CatalystError: @@ -46,8 +45,11 @@ class grp_target(generic_stage_target): raise CatalystError,"GRP build aborting due to error." def set_action_sequence(self): - self.settings["action_sequence"]=["dir_setup","unpack_and_bind","chroot_setup",\ - "setup_environment","run_local","unbind"] + self.settings["action_sequence"]=["dir_setup","unpack","unpack_snapshot",\ + "config_profile_link","setup_confdir","bind","chroot_setup",\ + "setup_environment","run_local","unmerge","unbind",\ + "remove","empty"] + def set_use(self): self.settings["use"]=self.settings["grp/use"] diff --git a/modules/livecd_stage1_target.py b/modules/livecd_stage1_target.py index 00ba8f59..af7966de 100644 --- a/modules/livecd_stage1_target.py +++ b/modules/livecd_stage1_target.py @@ -1,6 +1,6 @@ # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/modules/livecd_stage1_target.py,v 1.6 2005/01/04 21:13:43 wolf31o2 Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/modules/livecd_stage1_target.py,v 1.7 2005/04/04 17:48:32 rocket Exp $ """ Builder class for LiveCD stage1. @@ -15,22 +15,19 @@ class livecd_stage1_target(generic_stage_target): self.valid_values=self.required_values[:] generic_stage_target.__init__(self,spec,addlargs) - def run_local(self): - mypack=list_bashify(self.settings["livecd/packages"]) - try: - cmd("/bin/bash "+self.settings["sharedir"]+\ - "/targets/livecd-stage1/livecd-stage1.sh run "+mypack) - - except CatalystError: - self.unbind() - raise CatalystError,"LiveCD stage1 build aborting due to error." def set_action_sequence(self): - self.settings["action_sequence"]=["dir_setup","unpack_and_bind","chroot_setup",\ - "setup_environment","run_local","preclean","unbind","clean"] + self.settings["action_sequence"]=["dir_setup","unpack","unpack_snapshot",\ + "config_profile_link","setup_confdir","portage_overlay",\ + "bind","chroot_setup","setup_environment","build_packages",\ + "preclean","clear_autoresume","unmerge","unbind",\ + "remove","empty","clean"] + def set_use(self): self.settings["use"]=self.settings["livecd/use"] + def set_spec_prefix(self): + self.settings["spec_prefix"]="livecd" def register(foo): foo.update({"livecd-stage1":livecd_stage1_target}) return foo diff --git a/modules/livecd_stage2_target.py b/modules/livecd_stage2_target.py index ec6da48c..5cf46afe 100644 --- a/modules/livecd_stage2_target.py +++ b/modules/livecd_stage2_target.py @@ -1,6 +1,6 @@ # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/modules/livecd_stage2_target.py,v 1.30 2005/03/09 00:22:05 wolf31o2 Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/modules/livecd_stage2_target.py,v 1.31 2005/04/04 17:48:33 rocket Exp $ """ Builder class for a LiveCD stage2 build. @@ -12,309 +12,61 @@ from generic_stage_target import * class livecd_stage2_target(generic_stage_target): def __init__(self,spec,addlargs): - self.required_values=["boot/kernel","livecd/cdfstype",\ - "livecd/archscript","livecd/runscript"] + self.required_values=["boot/kernel","livecd/cdfstype"] self.valid_values=[] - if not addlargs.has_key("boot/kernel"): - raise CatalystError, "Required value boot/kernel not specified." - - if type(addlargs["boot/kernel"]) == types.StringType: - loopy=[addlargs["boot/kernel"]] - - else: - loopy=addlargs["boot/kernel"] - - for x in loopy: - self.required_values.append("boot/kernel/"+x+"/sources") - self.required_values.append("boot/kernel/"+x+"/config") - self.valid_values.append("boot/kernel/"+x+"/extraversion") - self.valid_values.append("boot/kernel/"+x+"/packages") - self.valid_values.append("boot/kernel/"+x+"/use") - self.valid_values.append("boot/kernel/"+x+"/gk_kernargs") - self.valid_values.append("boot/kernel/"+x+"/postconf") - + self.set_build_kernel_vars(addlargs) self.valid_values.extend(self.required_values) self.valid_values.extend(["livecd/cdtar","livecd/empty","livecd/rm",\ "livecd/unmerge","livecd/iso","livecd/gk_mainargs","livecd/type",\ "livecd/motd","livecd/overlay","livecd/modblacklist","livecd/splash_theme",\ "livecd/rcadd","livecd/rcdel","livecd/fsscript","livecd/xinitrc",\ "livecd/root_overlay","livecd/devmanager","livecd/splash_type",\ - "gamecd/conf"]) + "gamecd/conf","portage_overlay"]) generic_stage_target.__init__(self,spec,addlargs) - self.set_cdroot_path() - file_locate(self.settings, ["livecd/cdtar","livecd/archscript","livecd/runscript"]) + file_locate(self.settings, ["livecd/cdtar","controller_file"]) if self.settings.has_key("portage_confdir"): file_locate(self.settings,["portage_confdir"],expand=0) - if self.settings.has_key("livecd/volid"): - self.volumeid = string.join(self.settings["livecd/volid"]) - if len(self.volumeid)>32: - raise CatalystError,"ISO volume id must not exceed 32 characters." - os.putenv("iso_volume_id",self.volumeid); - - def unpack_and_bind(self): - if not os.path.exists(self.settings["chroot_path"]): - os.makedirs(self.settings["chroot_path"]) - - print "Copying livecd-stage1 result to new livecd-stage2 work directory..." - cmd("rsync -a --delete "+self.settings["source_path"]+"/* "+self.settings["chroot_path"],\ - "Error copying initial livecd-stage2") - - if os.path.exists(self.settings["chroot_path"]+"/usr/portage"): - print "Cleaning up existing portage tree snapshot..." - cmd("rm -rf "+self.settings["chroot_path"]+"/usr/portage",\ - "Error removing existing snapshot directory.") - - print "Unpacking portage tree snapshot..." - cmd("tar xjpf "+self.settings["snapshot_path"]+" -C "+\ - self.settings["chroot_path"]+"/usr","Error unpacking snapshot") - - print "Configuring profile link..." - cmd("rm -f "+self.settings["chroot_path"]+"/etc/make.profile","Error zapping profile link") - cmd("ln -sf ../usr/portage/profiles/"+self.settings["target_profile"]+" " - +self.settings["chroot_path"]+"/etc/make.profile","Error creating profile link") - - if self.settings.has_key("portage_confdir"): - print "Configuring /etc/portage..." - cmd("rm -rf "+self.settings["chroot_path"]+"/etc/portage","Error zapping /etc/portage") - cmd("cp -R "+self.settings["portage_confdir"]+"/ "+self.settings["chroot_path"]+\ - "/etc/portage","Error copying /etc/portage") - - for x in self.mounts: - if not os.path.exists(self.settings["chroot_path"]+x): - os.makedirs(self.settings["chroot_path"]+x,0755) - if not os.path.exists(self.mountmap[x]): - os.makedirs(self.mountmap[x],0755) - src=self.mountmap[x] - retval=os.system("mount --bind "+src+" "+self.settings["chroot_path"]+x) - if retval!=0: - self.unbind() - raise CatalystError,"Couldn't bind mount "+src - def set_target_path(self): - pass - #self.settings["target_path"]=self.settings["storedir"]+"/builds/"+self.settings["target_subpath"] + self.settings["target_path"]=self.settings["storedir"]+"/builds/"+self.settings["target_subpath"] def set_source_path(self): self.settings["source_path"]=self.settings["storedir"]+"/tmp/"+self.settings["source_subpath"] - def set_cdroot_path(self): - self.settings["cdroot_path"]=self.settings["storedir"]+"/builds/"+self.settings["target_subpath"] - - def dir_setup(self): - print "Setting up directories..." - self.mount_safety_check() - - if not os.path.exists(self.settings["chroot_path"]+"/tmp"): - os.makedirs(self.settings["chroot_path"]+"/tmp") - - if not os.path.exists(self.settings["chroot_path"]): - os.makedirs(self.settings["chroot_path"]) + def set_spec_prefix(self): + self.settings["spec_prefix"]="livecd" - if self.settings.has_key("PKGCACHE"): - if not os.path.exists(self.settings["pkgcache_path"]): - os.makedirs(self.settings["pkgcache_path"]) - - def unmerge(self): - if self.settings.has_key("AUTORESUME") \ - and os.path.exists(self.settings["chroot_path"]+"/tmp/.clst_unmerge"): - print "Resume point detected, skipping unmerge operation..." + def unpack(self): + if self.settings.has_key("AUTORESUME") \ + and os.path.exists(self.settings["chroot_path"]+"/tmp/.clst_unpack"): + print "Resume point detected, skipping unpack operation..." else: - if self.settings.has_key("livecd/unmerge"): - if type(self.settings["livecd/unmerge"])==types.StringType: - self.settings["livecd/unmerge"]=[self.settings["livecd/unmerge"]] - myunmerge=self.settings["livecd/unmerge"][:] - - for x in range(0,len(myunmerge)): - #surround args with quotes for passing to bash, - #allows things like "<" to remain intact - myunmerge[x]="'"+myunmerge[x]+"'" - myunmerge=string.join(myunmerge) - #before cleaning, unmerge stuff: - - try: - cmd("/bin/bash "+self.settings["sharedir"]+"/targets/" - +self.settings["target"]+"/unmerge.sh "+myunmerge,"Unmerge script failed.") - - except CatalystError: - self.unbind() - raise - touch(self.settings["chroot_path"]+"/tmp/.clst_unmerge") - - def clean(self): - if self.settings.has_key("livecd/empty"): - - if type(self.settings["livecd/empty"])==types.StringType: - self.settings["livecd/empty"]=[self.settings["livecd/empty"]] - - for x in self.settings["livecd/empty"]: - myemp=self.settings["chroot_path"]+x - if not os.path.isdir(myemp): - print x,"not a directory or does not exist, skipping 'empty' operation." - continue - print "Emptying directory",x - # stat the dir, delete the dir, recreate the dir and set - # the proper perms and ownership - mystat=os.stat(myemp) - shutil.rmtree(myemp) - os.makedirs(myemp,0755) - os.chown(myemp,mystat[ST_UID],mystat[ST_GID]) - os.chmod(myemp,mystat[ST_MODE]) - - if self.settings.has_key("livecd/rm"): - - if type(self.settings["livecd/rm"])==types.StringType: - self.settings["livecd/rm"]=[self.settings["livecd/rm"]] - - for x in self.settings["livecd/rm"]: - # we're going to shell out for all these cleaning operations, - # so we get easy glob handling - print "livecd: removing "+x - os.system("rm -rf "+self.settings["chroot_path"]+x) - - try: - cmd("/bin/bash "+self.settings["livecd/runscript"]+" clean",\ - "Clean runscript failed.") - except: - self.unbind() - raise - - def preclean(self): - try: - cmd("/bin/bash "+self.settings["livecd/runscript"]+" preclean",\ - "Preclean runscript failed.") - - except: - self.unbind() - raise - - def cdroot_setup(self): - cmd("/bin/bash "+self.settings["livecd/runscript"]+" cdfs","CDFS runscript failed.") - - if self.settings.has_key("livecd/overlay"): - cmd("rsync -a "+self.settings["livecd/overlay"]+"/* "+\ - self.settings["cdroot_path"],"LiveCD overlay copy failed.") - - # clean up the resume points - if self.settings.has_key("AUTORESUME"): - cmd("rm -f "+self.settings["chroot_path"]+"/tmp/.clst*",\ - "Couldn't remove resume points") - - # create the ISO - this is the preferred method (the iso scripts do not always work) - if self.settings.has_key("livecd/iso"): - cmd("/bin/bash "+self.settings["livecd/runscript"]+" iso "+\ - self.settings["livecd/iso"],"ISO creation runscript failed.") - - print "livecd-stage2: complete!" - - def build_kernel(self): - mynames=self.settings["boot/kernel"] - if type(mynames)==types.StringType: - mynames=[mynames] - args=[] - args.append(`len(mynames)`) - - for kname in mynames: - args.append(kname) - args.append(self.settings["boot/kernel/"+kname+"/sources"]) - try: - if not os.path.exists(self.settings["boot/kernel/"+kname+"/config"]): - self.unbind() - raise CatalystError, "Can't find kernel config: " \ - +self.settings["boot/kernel/"+kname+"/config"] - - except TypeError: - raise CatalystError, "Required value boot/kernel/config not specified" - - """ - We must support multiple configs for the same kernel, - so we must manually edit the EXTRAVERSION on the kernel to allow them to coexist. - The extraversion field gets appended to the current EXTRAVERSION - in the kernel Makefile. Examples of this usage are UP vs SMP kernels, - and on PPC64 we need a seperate pSeries, iSeries, and PPC970 (G5) kernels, - all compiled off the same source, without having to release a seperate - livecd for each (since other than the kernel, they are all binary compatible) - """ - if self.settings.has_key("boot/kernel/"+kname+"/extraversion"): - # extraversion is now an optional parameter, so that don't need to - # worry about it unless they have to - args.append(self.settings["boot/kernel/"+kname+"/extraversion"]) - - else: - # this value will be detected on the bash side and indicate - # that EXTRAVERSION processing - # should be skipped - args.append("NULL_VALUE") - - # write out /var/tmp/kname.(use|packages) files, used for kernel USE - # and extra packages settings - for extra in ["use","packages","postconf","gk_kernargs"]: - if self.settings.has_key("boot/kernel/"+kname+"/"+extra): - myex=self.settings["boot/kernel/"+kname+"/"+extra] - if type(myex)==types.ListType: - myex=string.join(myex) - try: - myf=open(self.settings["chroot_path"]+"/var/tmp/"+kname+"."+extra,"w") - except: - self.unbind() - raise CatalystError,"Couldn't create file /var/tmp/"+kname+"."+extra+" in chroot." - # write out to the file - if extra=="use": - myf.write("export USE=\""+myex+"\"\n") - if extra=="gk_kernargs": - myf.write("export clst_livecd_gk_kernargs=\""+myex+"\"\n") - else: - myf.write(myex+"\n") - myf.close() - try: - cmd("cp "+self.settings["boot/kernel/"+kname+"/config"]+" "+ \ - self.settings["chroot_path"]+"/var/tmp/"+kname+".config", \ - "Couldn't copy kernel config: "+self.settings["boot/kernel/"+kname+"/config"]) - - except CatalystError: - self.unbind() - - # If we need to pass special options to the bootloader - # for this kernel put them into the environment. - if self.settings.has_key("boot/kernel/"+kname+"/kernelopts"): - myopts=self.settings["boot/kernel/"+kname+"/kernelopts"] + + if not os.path.exists(self.settings["chroot_path"]): + os.makedirs(self.settings["chroot_path"]) - if type(myopts) != types.StringType: - myopts = string.join(myopts) - os.putenv(kname+"_kernelopts", myopts) + print "Copying livecd-stage1 result to new livecd-stage2 work directory..." + cmd("rsync -a --delete "+self.settings["source_path"]+"/* "+self.settings["chroot_path"],\ + "Error copying initial livecd-stage2") + touch(self.settings["chroot_path"]+"/tmp/.clst_unpack") - else: - os.putenv(kname+"_kernelopts", "") - - # execute the script that builds the kernel - cmd("/bin/bash "+self.settings["livecd/runscript"]+" kernel "+list_bashify(args),\ - "Runscript kernel build failed") + # Create the dir_setup autoresume point as the rsync --delete probably deleted it + touch(self.settings["chroot_path"]+"/tmp/.clst_dir_setup") + def run_local(self): - # first clean up any existing cdroot stuff - if os.path.exists(self.settings["cdroot_path"]): + # first clean up any existing target stuff + if os.path.exists(self.settings["target_path"]): print "cleaning previous livecd-stage2 build" - cmd("rm -rf "+self.settings["cdroot_path"], - "Could not remove existing directory: "+self.settings["cdroot_path"]) + cmd("rm -rf "+self.settings["target_path"], + "Could not remove existing directory: "+self.settings["target_path"]) - if not os.path.exists(self.settings["cdroot_path"]): - os.makedirs(self.settings["cdroot_path"]) + if not os.path.exists(self.settings["target_path"]): + os.makedirs(self.settings["target_path"]) - # the runscripts do the real building, so execute them now - # this is the part that we want to resume on since it is the most time consuming - try: - self.build_kernel() - - cmd("/bin/bash "+self.settings["livecd/runscript"]+" bootloader",\ - "Bootloader runscript failed.") - - except CatalystError: - self.unbind() - raise CatalystError,"Runscript aborting due to error." - # what modules do we want to blacklist? if self.settings.has_key("livecd/modblacklist"): try: @@ -327,14 +79,22 @@ class livecd_stage2_target(generic_stage_target): myf.write("\n"+x) myf.close() - # copy over the livecd/root_overlay - if self.settings.has_key("livecd/root_overlay"): - cmd("rsync -a "+self.settings["livecd/root_overlay"]+"/* "+\ - self.settings["chroot_path"], "livecd/root_overlay copy failed.") + def bootloader(self): + try: + cmd("/bin/bash "+self.settings["controller_file"]+" bootloader",\ + "Bootloader runscript failed.") + + except CatalystError: + self.unbind() + raise CatalystError,"Runscript aborting due to error." + def set_action_sequence(self): - self.settings["action_sequence"]=["dir_setup","unpack_and_bind","chroot_setup",\ - "setup_environment","run_local","preclean","unmerge",\ - "unbind","clean","cdroot_setup"] + self.settings["action_sequence"]=["dir_setup","unpack","unpack_snapshot",\ + "config_profile_link","setup_confdir","portage_overlay",\ + "bind","chroot_setup","setup_environment","run_local",\ + "root_overlay","build_kernel","bootloader","clear_autoresume",\ + "unmerge","unbind","remove","empty","target_setup",\ + "setup_overlay","create_iso"] def register(foo): foo.update({"livecd-stage2":livecd_stage2_target}) diff --git a/modules/netboot.py b/modules/netboot.py deleted file mode 100644 index 2471a9e8..00000000 --- a/modules/netboot.py +++ /dev/null @@ -1,151 +0,0 @@ -# Copyright 1999-2004 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/modules/Attic/netboot.py,v 1.9 2005/01/04 21:13:43 wolf31o2 Exp $ - -""" -Builder class for a netboot build. -""" - -import os,string,types -from catalyst_support import * -from generic_stage_target import * - -class netboot_target(generic_stage_target): - def __init__(self,spec,addlargs): - self.valid_values = [ - "netboot/kernel/sources", - "netboot/kernel/config", - "netboot/kernel/prebuilt", - - "netboot/busybox_config", - - "netboot/extra_files", - "netboot/packages" - ] - self.required_values=[] - - try: - if addlargs.has_key("netboot/packages"): - if type(addlargs["netboot/packages"]) == types.StringType: - loopy=[addlargs["netboot/packages"]] - else: - loopy=addlargs["netboot/packages"] - - for x in loopy: - self.required_values.append("netboot/packages/"+x+"/files") - except: - raise CatalystError,"configuration error in netboot/packages." - - generic_stage_target.__init__(self,spec,addlargs) - - if addlargs.has_key("netboot/busybox_config"): - file_locate(self.settings, ["netboot/busybox_config"]) - - if addlargs.has_key("netboot/kernel/sources"): - file_locate(self.settings, ["netboot/kernel/config"]) - elif addlargs.has_key("netboot/kernel/prebuilt"): - file_locate(self.settings, ["netboot/kernel/prebuilt"]) - else: - raise CatalystError,"you must define netboot/kernel/config or netboot/kernel/prebuilt" - - # unless the user wants specific CFLAGS/CXXFLAGS, let's use -Os - for envvar in "CFLAGS", "CXXFLAGS": - if not os.environ.has_key(envvar) and not addlargs.has_key(envvar): - self.settings[envvar] = "-Os -pipe" - - def set_target_path(self): - self.settings["target_path"]=self.settings["storedir"]+"/builds/"+self.settings["target_subpath"] - - def run_local(self): - # setup our chroot - try: - cmd("/bin/bash "+self.settings["sharedir"]+\ - "/targets/netboot/netboot.sh setup") - except CatalystError: - self.unbind() - raise CatalystError,"couldn't setup netboot env." - - # build packages - if self.settings.has_key("netboot/packages"): - mypack=list_bashify(self.settings["netboot/packages"]) - try: - cmd("/bin/bash "+self.settings["sharedir"]+\ - "/targets/netboot/netboot.sh packages "+mypack) - except CatalystError: - self.unbind() - raise CatalystError,"netboot build aborting due to error." - - # build busybox - if self.settings.has_key("netboot/busybox_config"): - mycmd = self.settings["netboot/busybox_config"] - else: - mycmd = "" - try: - cmd("/bin/bash "+self.settings["sharedir"]+\ - "/targets/netboot/netboot.sh busybox "+ mycmd) - except CatalystError: - self.unbind() - raise CatalystError,"netboot build aborting due to error." - - # build kernel - if self.settings.has_key("netboot/kernel/prebuilt"): - mycmd = "kernel-prebuilt " + \ - self.settings["netboot/kernel/prebuilt"] - else: - mycmd = "kernel-sources " + \ - self.settings["netboot/kernel/sources"] + " " + \ - self.settings["netboot/kernel/config"] - try: - cmd("/bin/bash "+self.settings["sharedir"]+\ - "/targets/netboot/netboot.sh kernel " + mycmd) - except CatalystError: - self.unbind() - raise CatalystError,"netboot build aborting due to error." - - # create image - myfiles=[] - if self.settings.has_key("netboot/packages"): - if type(self.settings["netboot/packages"]) == types.StringType: - loopy=[self.settings["netboot/packages"]] - else: - loopy=self.settings["netboot/packages"] - - for x in loopy: - print x, self.settings["netboot/packages/"+x+"/files"] - if type(self.settings["netboot/packages/"+x+"/files"]) == types.ListType: - myfiles.extend(self.settings["netboot/packages/"+x+"/files"]) - else: - myfiles.append(self.settings["netboot/packages/"+x+"/files"]) - - if self.settings.has_key("netboot/extra_files"): - if type(self.settings["netboot/extra_files"]) == types.ListType: - myfiles.extend(self.settings["netboot/extra_files"]) - else: - myfiles.append(self.settings["netboot/extra_files"]) - - try: - cmd("/bin/bash "+self.settings["sharedir"]+\ - "/targets/netboot/netboot.sh image " + list_bashify(myfiles)) - except CatalystError: - self.unbind() - raise CatalystError,"netboot build aborting due to error." - - # finish it all up - try: - cmd("/bin/bash "+self.settings["sharedir"]+\ - "/targets/netboot/netboot.sh finish") - except CatalystError: - self.unbind() - raise CatalystError,"netboot build aborting due to error." - - # end - print "netboot: build finished !" - - - def set_action_sequence(self): - self.settings["action_sequence"]=["dir_setup","unpack_and_bind","chroot_setup",\ - "setup_environment","run_local","unbind"] - -def register(foo): - foo.update({"netboot":netboot_target}) - return foo diff --git a/modules/netboot_target.py b/modules/netboot_target.py new file mode 100644 index 00000000..a48f2f51 --- /dev/null +++ b/modules/netboot_target.py @@ -0,0 +1,140 @@ +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo/src/catalyst/modules/netboot_target.py,v 1.1 2005/04/04 17:48:33 rocket Exp $ + +""" +Builder class for a netboot build. +""" + +import os,string,types +from catalyst_support import * +from generic_stage_target import * + +class netboot_target(generic_stage_target): + def __init__(self,spec,addlargs): + self.valid_values = [ + "netboot/kernel/sources", + "netboot/kernel/config", + "netboot/kernel/prebuilt", + + "netboot/busybox_config", + + "netboot/extra_files", + "netboot/packages" + ] + self.required_values=[] + + try: + if addlargs.has_key("netboot/packages"): + if type(addlargs["netboot/packages"]) == types.StringType: + loopy=[addlargs["netboot/packages"]] + else: + loopy=addlargs["netboot/packages"] + + # for x in loopy: + # self.required_values.append("netboot/packages/"+x+"/files") + except: + raise CatalystError,"configuration error in netboot/packages." + + + + self.set_build_kernel_vars(addlargs) + + generic_stage_target.__init__(self,spec,addlargs) + if addlargs.has_key("netboot/busybox_config"): + file_locate(self.settings, ["netboot/busybox_config"]) + + # Custom Kernel Tarball --- use that instead ... + + # unless the user wants specific CFLAGS/CXXFLAGS, let's use -Os + + for envvar in "CFLAGS", "CXXFLAGS": + if not os.environ.has_key(envvar) and not addlargs.has_key(envvar): + self.settings[envvar] = "-Os -pipe" + + def set_target_path(self): + self.settings["target_path"]=self.settings["storedir"]+"/builds/"+self.settings["target_subpath"] + +# def set_root_path(self): +# # ROOT= variable for emerges +# self.settings["root_path"]="/tmp/image" + + def set_dest_path(self): + #destpath=self.settings["chroot_path"]+self.settings["root_path"] + destpath=self.settings["chroot_path"]+"/tmp/image" + +# def build_packages(self): +# # build packages +# if self.settings.has_key("netboot/packages"): +# mypack=list_bashify(self.settings["netboot/packages"]) +# try: +# cmd("/bin/bash "+self.settings["controller_file"]+" packages "+mypack) +# except CatalystError: +# self.unbind() +# raise CatalystError,"netboot build aborting due to error." + + def build_busybox(self): + # build busybox + if self.settings.has_key("netboot/busybox_config"): + mycmd = self.settings["netboot/busybox_config"] + else: + mycmd = "" + try: + cmd("/bin/bash "+self.settings["controller_file"]+" busybox "+ mycmd) + except CatalystError: + self.unbind() + raise CatalystError,"netboot build aborting due to error." + + + def copy_files_to_image(self): + # create image + myfiles=[] + if self.settings.has_key("netboot/packages"): + if type(self.settings["netboot/packages"]) == types.StringType: + loopy=[self.settings["netboot/packages"]] + else: + loopy=self.settings["netboot/packages"] + + for x in loopy: + if self.settings.has_key("netboot/packages/"+x+"/files"): + if type(self.settings["netboot/packages/"+x+"/files"]) == types.ListType: + myfiles.extend(self.settings["netboot/packages/"+x+"/files"]) + else: + myfiles.append(self.settings["netboot/packages/"+x+"/files"]) + + if self.settings.has_key("netboot/extra_files"): + if type(self.settings["netboot/extra_files"]) == types.ListType: + myfiles.extend(self.settings["netboot/extra_files"]) + else: + myfiles.append(self.settings["netboot/extra_files"]) + + try: + cmd("/bin/bash "+self.settings["controller_file"]+\ + " image " + list_bashify(myfiles)) + except CatalystError: + self.unbind() + raise CatalystError,"netboot build aborting due to error." + + + def create_netboot_files(self): + # finish it all up + try: + cmd("/bin/bash "+self.settings["controller_file"]+" finish") + except CatalystError: + self.unbind() + raise CatalystError,"netboot build aborting due to error." + + # end + print "netboot: build finished !" + + + def set_action_sequence(self): + self.settings["action_sequence"]=["dir_setup","unpack","unpack_snapshot", + "config_profile_link","setup_confdir","bind","chroot_setup",\ + "setup_environment","build_packages","build_busybox",\ + "build_kernel","copy_files_to_image","clear_autoresume",\ + "clean","create_netboot_files","unbind"] + +def register(foo): + foo.update({"netboot":netboot_target}) + return foo diff --git a/modules/snapshot_target.py b/modules/snapshot_target.py index 3e926876..37a11393 100644 --- a/modules/snapshot_target.py +++ b/modules/snapshot_target.py @@ -1,6 +1,6 @@ # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/modules/snapshot_target.py,v 1.7 2005/02/28 23:21:09 wolf31o2 Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/modules/snapshot_target.py,v 1.8 2005/04/04 17:48:33 rocket Exp $ """ Builder class for snapshots. diff --git a/modules/stage1_target.py b/modules/stage1_target.py index 2c0e39c5..93f8278c 100644 --- a/modules/stage1_target.py +++ b/modules/stage1_target.py @@ -1,6 +1,6 @@ # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/modules/stage1_target.py,v 1.6 2005/01/04 21:13:43 wolf31o2 Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/modules/stage1_target.py,v 1.7 2005/04/04 17:48:33 rocket Exp $ """ Builder class for a stage1 installation tarball build. @@ -16,8 +16,17 @@ class stage1_target(generic_stage_target): generic_stage_target.__init__(self,spec,addlargs) def set_stage_path(self): - self.settings["stage_path"]=self.settings["chroot_path"]+"/tmp/stage1root" + self.settings["stage_path"]=self.settings["chroot_path"]+self.settings["root_path"] print "stage1 stage path is "+self.settings["stage_path"] + def set_root_path(self): + # ROOT= variable for emerges + self.settings["root_path"]="/tmp/stage1root" + print "stage1 root path is "+self.settings["root_path"] + def set_dest_path(self): + self.settings["destpath"]=self.settings["chroot_path"]+self.settings["root_path"] + def set_cleanables(self): + generic_stage_target.set_cleanables(self) + self.settings["cleanables"].extend(["/usr/share/gettext","/usr/lib/python2.2/test", "/usr/lib/python2.2/encodings","/usr/lib/python2.2/email", "/usr/lib/python2.2/lib-tk","/usr/share/zoneinfo"]) def register(foo): foo.update({"stage1":stage1_target}) diff --git a/modules/stage4_target.py b/modules/stage4_target.py new file mode 100644 index 00000000..ec7d5624 --- /dev/null +++ b/modules/stage4_target.py @@ -0,0 +1,32 @@ +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo/src/catalyst/modules/stage4_target.py,v 1.1 2005/04/04 17:48:33 rocket Exp $ + +""" +Builder class for LiveCD stage1. +""" + +from catalyst_support import * +from generic_stage_target import * + +class stage4_target(generic_stage_target): + def __init__(self,spec,addlargs): + self.required_values=["stage4/packages","stage4/use"] + self.valid_values=self.required_values[:] + self.valid_values.append("stage4/root_overlay") + generic_stage_target.__init__(self,spec,addlargs) + + def set_use(self): + self.settings["use"]=self.settings["stage4/use"] + + def set_action_sequence(self): + self.settings["action_sequence"]=["dir_setup","unpack","unpack_snapshot",\ + "config_profile_link","setup_confdir","portage_overlay",\ + "bind","chroot_setup","setup_environment",\ + "root_overlay","build_packages","preclean","clear_autoresume",\ + "unmerge","unbind","remove","empty","clean","capture"] + + +def register(foo): + foo.update({"stage4":stage4_target}) + return foo diff --git a/modules/tinderbox_target.py b/modules/tinderbox_target.py index a0a372dc..2fb87f89 100644 --- a/modules/tinderbox_target.py +++ b/modules/tinderbox_target.py @@ -1,6 +1,6 @@ # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/modules/tinderbox_target.py,v 1.6 2005/01/04 21:13:43 wolf31o2 Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/modules/tinderbox_target.py,v 1.7 2005/04/04 17:48:33 rocket Exp $ """ builder class for the tinderbox target @@ -19,9 +19,9 @@ class tinderbox_target(generic_stage_target): # tinderbox # example call: "grp.sh run xmms vim sys-apps/gleep" try: - cmd("/bin/bash "+self.settings["sharedir"]+\ - "/targets/tinderbox/tinderbox.sh run "+\ - list_bashify(self.settings["tinderbox/packages"])) + if os.path.exists(self.settings["controller_file"]): + cmd("/bin/bash "+self.settings["controller_file"]+" run "+\ + list_bashify(self.settings["tinderbox/packages"]),"run script failed.") except CatalystError: self.unbind() diff --git a/targets/embedded/embedded-chroot.sh b/targets/embedded/embedded-chroot.sh index 3e970fe9..f2bb5a5b 100755 --- a/targets/embedded/embedded-chroot.sh +++ b/targets/embedded/embedded-chroot.sh @@ -1,45 +1,17 @@ #!/bin/bash # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/embedded/embedded-chroot.sh,v 1.13 2005/01/28 18:37:23 wolf31o2 Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/embedded/embedded-chroot.sh,v 1.14 2005/04/04 17:48:33 rocket Exp $ -portage_version=`/usr/lib/portage/bin/portageq best_version / sys-apps/portage \ - | cut -d/ -f2 | cut -d- -f2,3` -if [ `echo ${portage_version} | cut -d- -f1 | cut -d. -f3` -lt 51 ] -then - echo "ERROR: Your portage version is too low in your seed stage. Portage version" - echo "2.0.51 or greater is required." - exit 1 -fi +. /tmp/chroot-functions.sh -/usr/sbin/env-update -source /etc/profile +check_portage_version -[ -f /tmp/envscript ] && source /tmp/envscript +update_env_settings -if [ -n "${clst_CCACHE}" ] -then - export clst_myfeatures="${clst_myfeatures} ccache" - emerge --oneshot --nodeps -b -k ccache || exit 1 -fi +setup_myfeatures +setup_myemergeopts -if [ -n "${clst_DISTCC}" ] -then - export clst_myfeatures="${clst_myfeatures} distcc" - export DISTCC_HOSTS="${clst_distcc_hosts}" - - USE="-gtk -gnome" emerge --oneshot --nodeps -b -k distcc || exit 1 -fi - -if [ -n "${clst_PKGCACHE}" ] -then - export clst_myemergeopts="--usepkg --buildpkg --newuse" -fi - -if [ -n "${clst_FETCH}" ] -then - export clst_myemergeopts="${clst_myemergeopts} -f" -fi # setup the environment export FEATURES="${clst_myfeatures}" @@ -47,22 +19,6 @@ export CONFIG_PROTECT="-*" export clst_myemergeopts="${clst_myemergeopts} -O" export USE="${clst_embedded_use}" -if [ ! -d "/tmp/mergeroot" ] -then - install -d /tmp/mergeroot -fi - ## START BUILD -if [ "${clst_VERBOSE}" ] -then - ROOT=/tmp/mergeroot emerge ${clst_myemergeopts} -vp ${clst_embedded_packages} || exit 1 - echo "Press any key within 15 seconds to pause the build..." - read -s -t 15 -n 1 - if [ $? -eq 0 ] - then - echo "Press any key to continue..." - read -s -n 1 - fi -fi -ROOT=/tmp/mergeroot emerge ${clst_myemergeopts} ${clst_embedded_packages} || exit 1 +run_emerge "${clst_embedded_packages}" diff --git a/targets/embedded/embedded-controller.sh b/targets/embedded/embedded-controller.sh new file mode 100755 index 00000000..fc4a2dd1 --- /dev/null +++ b/targets/embedded/embedded-controller.sh @@ -0,0 +1,49 @@ +#!/bin/bash +# Copyright 1999-2003 Gentoo Technologies, Inc. +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/embedded/embedded-controller.sh,v 1.1 2005/04/04 17:48:33 rocket Exp $ + +. ${clst_sharedir}/targets/support/functions.sh +. ${clst_sharedir}/targets/support/filesystem-functions.sh +case $1 in + enter) + ;; + + build_packages) + shift + export clst_packages="$*" + exec_in_chroot ${clst_sharedir}/targets/${clst_target}/${clst_target}-chroot.sh + ;; + + preclean) + ;; + + package) + export root_fs_path="${clst_chroot_path}/tmp/mergeroot" + install -d ${clst_image_path} + + ${clst_sharedir}/targets/embedded/embedded-fs-runscript.sh ${clst_embedded_fs_type} || exit 1 + imagesize=`du -sk ${clst_image_path}/root.img | cut -f1` + echo "Created ${clst_embedded_fs_type} image at ${clst_image_path}/root.img" + echo "Image size: ${imagesize}k" + + ;; + + kernel) + shift + export clst_kname="$1" + exec_in_chroot ${clst_sharedir}/targets/support/pre-kmerge.sh + exec_in_chroot ${clst_sharedir}/targets/support/kmerge.sh + exec_in_chroot ${clst_sharedir}/targets/support/post-kmerge.sh + extract_kernels ${clst_target_path}/kernels + + ;; + + clean) + ;; + + *) + ;; + +esac +exit 0 diff --git a/targets/embedded/embedded-preclean-chroot.sh b/targets/embedded/embedded-preclean-chroot.sh index 50929b19..de04db30 100755 --- a/targets/embedded/embedded-preclean-chroot.sh +++ b/targets/embedded/embedded-preclean-chroot.sh @@ -1,7 +1,8 @@ #!/bin/bash # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/embedded/embedded-preclean-chroot.sh,v 1.4 2004/10/15 02:46:58 zhen Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/embedded/embedded-preclean-chroot.sh,v 1.5 2005/04/04 17:48:33 rocket Exp $ -/usr/sbin/env-update -source /etc/profile + +. /tmp/chroot-functions.sh +update_env_settings diff --git a/targets/embedded/embedded.sh b/targets/embedded/embedded.sh deleted file mode 100644 index 7c098c15..00000000 --- a/targets/embedded/embedded.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/bash -# Copyright 1999-2003 Gentoo Technologies, Inc. -# Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/embedded/Attic/embedded.sh,v 1.7 2005/01/10 01:16:07 zhen Exp $ - -case $1 in - enter) - ${clst_CHROOT} ${clst_chroot_path} - ;; - - run) - cp ${clst_sharedir}/targets/embedded/embedded-chroot.sh ${clst_chroot_path}/tmp - ${clst_CHROOT} ${clst_chroot_path} /tmp/embedded-chroot.sh || exit 1 - rm -f ${clst_chroot_path}/tmp/embedded-chroot.sh - ;; - - preclean) - # currently this doesn't do much - cp ${clst_sharedir}/targets/embedded/embedded-preclean-chroot.sh ${clst_chroot_path} - ${clst_CHROOT} ${clst_chroot_path} /tmp/embedded-preclean-chroot.sh || exit 1 - rm -rf ${clst_chroot_path}/tmp/embedded-preclean-chroot.sh - ;; - package) - export root_fs_path="${clst_chroot_path}/tmp/mergeroot" - install -d ${clst_image_path} - ${clst_sharedir}/targets/embedded/embedded-fs-runscript.sh ${clst_embedded_fs_type} || exit 1 - imagesize=`du -sk ${clst_image_path}/root_fs | cut -f1` - echo "Created ${clst_embedded_fs_type} image at ${clst_image_path}/root_fs" - echo "Image size: ${imagesize}k" - ;; - - # almost the same code as livecd-stage2 - kernel) - shift - numkernels="$1" - cp -a ${clst_sharedir}/livecd/runscript-support/pre-kmerge.sh ${clst_chroot_path}/tmp - ${clst_CHROOT} ${clst_chroot_path} /tmp/pre-kmerge.sh || exit 1 - rm -f ${clst_chroot_path}/tmp/pre-kmerge.sh - cp -a ${clst_sharedir}/targets/embedded/kmerge.sh ${clst_chroot_path}/tmp - count=0 - while [ ${count} -lt ${numkernels} ] - do - sleep 30 - - shift - export clst_kname="$1" - shift - export clst_ksource="$1" - shift - export clst_kextversion="$1" - shift - export clst_gk_action="$1" - echo "exporting clst_gk_action as:${1}" - shift - ${clst_CHROOT} ${clst_chroot_path} /tmp/kmerge.sh || exit 1 - count=$(( ${count} + 1 )) - done - rm -f ${clst_chroot_path}/tmp/pre-kmerge.sh - cp -a ${clst_sharedir}/livecd/runscript-support/post-kmerge.sh ${clst_chroot_path}/tmp - ${clst_CHROOT} ${clst_chroot_path} /tmp/post-kmerge.sh || exit 1 - ;; - *) - exit 1 - ;; - -esac -exit 0 diff --git a/targets/embedded/kmerge.sh b/targets/embedded/kmerge.sh deleted file mode 100644 index 7f4ffa26..00000000 --- a/targets/embedded/kmerge.sh +++ /dev/null @@ -1,84 +0,0 @@ -#!/bin/bash -# Copyright 1999-2004 Gentoo Technologies, Inc. -# Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/embedded/Attic/kmerge.sh,v 1.1 2005/01/10 01:16:07 zhen Exp $ - -die() { - echo "$1" - exit 1 -} - -# Script to build each kernel, kernel-related packages -/usr/sbin/env-update -source /etc/profile - -[ -n "${clst_ENVSCRIPT}" ] && source /tmp/envscript -export CONFIG_PROTECT="-*" -rm -f /usr/src/linux - -#set the timezone for the kernel build -rm /etc/localtime -ln -s /usr/share/zoneinfo/UTC /etc/localtime - -[ -e "/var/tmp/${clst_kname}.use" ] && export USE="$( cat /var/tmp/${clst_kname}.use )" || unset USE -[ -e "/var/tmp/${clst_kname}.gk_kernargs" ] && source /var/tmp/${clst_kname}.gk_kernargs -# Don't use pkgcache here, as the kernel source may get emerge with different USE variables -# (and thus different patches enabled/disabled.) Also, there's no real benefit in using the -# pkgcache for kernel source ebuilds. - -emerge "${clst_ksource}" || exit 1 -[ ! -e /usr/src/linux ] && die "Can't find required directory /usr/src/linux" - -#if catalyst has set NULL_VALUE, extraversion wasn't specified so we skip this part -if [ "${clst_kextversion}" != "NULL_VALUE" ] -then - sed -i -e "s:EXTRAVERSION \(=.*\):EXTRAVERSION \1-${clst_kextversion}:" /usr/src/linux/Makefile -fi - -if [ -n "${clst_CCACHE}" ] -then - #enable ccache for genkernel - export PATH="/usr/lib/ccache/bin:${PATH}" -fi - -# grep out the kernel version so that we can do our modules magic -VER=`grep ^VERSION\ \= /usr/src/linux/Makefile | awk '{ print $3 };'` -PAT=`grep ^PATCHLEVEL\ \= /usr/src/linux/Makefile | awk '{ print $3 };'` -SUB=`grep ^SUBLEVEL\ \= /usr/src/linux/Makefile | awk '{ print $3 };'` -EXV=`grep ^EXTRAVERSION\ \= /usr/src/linux/Makefile | sed -e "s/EXTRAVERSION =//" -e "s/ //g"` -clst_fudgeuname=${VER}.${PAT}.${SUB}${EXV} - -# now we merge any kernel-dependent packages -if [ -e "/var/tmp/${clst_kname}.packages" ] -then - for x in $( cat /var/tmp/${clst_kname}.packages ) - do - # we don't want to use the pkgcache for these since the results - # are kernel-dependent. - clst_kernel_merge="${clst_kernel_merge} ${x}" - done -fi - -echo "genkernel action is set to: ${clst_gk_action}" - -if [ -n "${clst_livecd_bootsplash}" ] -then - genkernel --debuglevel=4 --bootsplash=${clst_livecd_bootsplash} \ - --callback="emerge ${clst_kernel_merge}" ${clst_livecd_gk_mainargs} \ - ${clst_embedded_gk_kernargs} --kerneldir=/usr/src/linux \ - --kernel-config=/var/tmp/${clst_kname}.config \ - --minkernpackage=/tmp/binaries/${clst_kname}.tar.bz2 \ - ${clst_gk_action} || exit 1 -else - genkernel --debuglevel=4 --callback="emerge ${clst_kernel_merge}" \ - ${clst_embedded_gk_mainargs} ${clst_embedded_gk_kernargs} \ - --kerneldir=/usr/src/linux --kernel-config=/var/tmp/${clst_kname}.config \ - --minkernpackage=/tmp/binaries/${clst_kname}.tar.bz2 \ - ${clst_gk_action} || exit 1 -fi - -/sbin/modules-update --assume-kernel=${clst_fudgeuname} - -#now the unmerge... (wipe db entry) -emerge -C "${clst_ksource}" -unset USE diff --git a/targets/grp/grp-chroot.sh b/targets/grp/grp-chroot.sh index 4a79a078..c9f5d0f8 100755 --- a/targets/grp/grp-chroot.sh +++ b/targets/grp/grp-chroot.sh @@ -1,43 +1,25 @@ #!/bin/bash # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/grp/grp-chroot.sh,v 1.14 2005/01/28 18:37:23 wolf31o2 Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/grp/grp-chroot.sh,v 1.15 2005/04/04 17:48:33 rocket Exp $ + +. /tmp/chroot-functions.sh # check portage version in seed stage -portage_version=`/usr/lib/portage/bin/portageq best_version / sys-apps/portage \ - | cut -d/ -f2 | cut -d- -f2,3` -if [ `echo ${portage_version} | cut -d- -f1 | cut -d. -f3` -lt 51 ] -then - echo "ERROR: Your portage version is too low in your seed stage. Portage version" - echo "2.0.51 or greater is required." - exit 1 -fi +check_portage_version -/usr/sbin/env-update -source /etc/profile +update_env_settings [ -f /tmp/envscript ] && source /tmp/envscript -if [ -n "${clst_CCACHE}" ] -then - export clst_myfeatures="${clst_myfeatures} ccache" - emerge --oneshot --nodeps -b -k ccache || exit 1 -fi - -if [ -n "${clst_DISTCC}" ] -then - export clst_myfeatures="${clst_myfeatures} distcc" - export DISTCC_HOSTS="${clst_distcc_hosts}" - - USE="-gnome -gtk" emerge --oneshot --nodeps -b -k distcc || exit 1 -fi +setup_myfeatures # setup the environment export FEATURES="${clst_myfeatures}" export CONFIG_PROTECT="-*" ## START BUILD -USE="build" emerge portage +setup_portage #turn off auto-use: export USE_ORDER="env:pkg:conf:defaults" diff --git a/targets/grp/grp-controller.sh b/targets/grp/grp-controller.sh new file mode 100755 index 00000000..1465621b --- /dev/null +++ b/targets/grp/grp-controller.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/grp/grp-controller.sh,v 1.1 2005/04/04 17:48:33 rocket Exp $ +. ${clst_sharedir}/targets/support/functions.sh + +case $1 in + enter) + ${clst_CHROOT} ${clst_chroot_path} + ;; + run) + shift + export clst_grp_type=$1 + shift + export clst_grp_target=$1 + shift + + export clst_grp_packages="$*" + exec_in_chroot ${clst_sharedir}/targets/grp/grp-chroot.sh + ;; + + preclean) + exec_in_chroot ${clst_sharedir}/targets/grp/grp-preclean-chroot.sh + exit 0 + ;; + + clean) + exit 0 + ;; + + *) + exit 1 + ;; + +esac +exit 0 diff --git a/targets/grp/grp-preclean-chroot.sh b/targets/grp/grp-preclean-chroot.sh index 550dd6e4..f55630df 100755 --- a/targets/grp/grp-preclean-chroot.sh +++ b/targets/grp/grp-preclean-chroot.sh @@ -1,7 +1,10 @@ #!/bin/bash # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/grp/grp-preclean-chroot.sh,v 1.6 2005/01/29 14:54:31 wolf31o2 Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/grp/grp-preclean-chroot.sh,v 1.7 2005/04/04 17:48:33 rocket Exp $ -/usr/sbin/env-update -source /etc/profile + +. /tmp/chroot-functions.sh +update_env_settings + +gconftool-2 --shutdown diff --git a/targets/grp/grp.sh b/targets/grp/grp.sh deleted file mode 100755 index c25ebd08..00000000 --- a/targets/grp/grp.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash -# Copyright 1999-2004 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/grp/Attic/grp.sh,v 1.22 2005/03/05 05:12:58 wolf31o2 Exp $ - -case $1 in - enter) - ${clst_CHROOT} ${clst_chroot_path} - ;; - run) - shift - export clst_grp_type=$1 - shift - export clst_grp_target=$1 - shift - - cp ${clst_sharedir}/targets/grp/grp-chroot.sh ${clst_chroot_path}/tmp - clst_grp_packages="$*" ${clst_CHROOT} ${clst_chroot_path} /tmp/grp-chroot.sh || exit 1 - rm -f ${clst_chroot_path}/tmp/grp-chroot.sh - ;; - - preclean) - if [ `pidof gconfd-2` ] - then - gconftool-2 --shutdown - fi - #cp ${clst_sharedir}/targets/grp/grp-preclean-chroot.sh ${clst_chroot_path}/tmp - #${clst_CHROOT} ${clst_chroot_path} /tmp/grp-preclean-chroot.sh || exit 1 - #rm -f ${clst_chroot_path}/tmp/grp-preclean-chroot.sh - exit 0 - ;; - - clean) - exit 0 - ;; - - *) - exit 1 - ;; - -esac -exit 0 diff --git a/targets/livecd-stage1/livecd-stage1-chroot.sh b/targets/livecd-stage1/livecd-stage1-chroot.sh index 768fce0c..fffe66c6 100755 --- a/targets/livecd-stage1/livecd-stage1-chroot.sh +++ b/targets/livecd-stage1/livecd-stage1-chroot.sh @@ -1,67 +1,25 @@ #!/bin/bash # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/livecd-stage1/livecd-stage1-chroot.sh,v 1.15 2005/03/07 21:14:42 wolf31o2 Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/livecd-stage1/livecd-stage1-chroot.sh,v 1.16 2005/04/04 17:48:33 rocket Exp $ -portage_version=`/usr/lib/portage/bin/portageq best_version / sys-apps/portage \ - | cut -d/ -f2 | cut -d- -f2,3` -if [ `echo ${portage_version} | cut -d- -f1 | cut -d. -f3` -lt 51 ] -then - echo "ERROR: Your portage version is too low in your seed stage. Portage version" - echo "2.0.51 or greater is required." - exit 1 -fi +. /tmp/chroot-functions.sh -/usr/sbin/env-update -source /etc/profile +check_portage_version +update_env_settings -[ -f /tmp/envscript ] && source /tmp/envscript - -if [ -n "${clst_CCACHE}" ] -then - export clst_myfeatures="${clst_myfeatures} ccache" - emerge --oneshot --nodeps -b -k ccache || exit 1 -fi - -if [ -n "${clst_DISTCC}" ] -then - export clst_myfeatures="${clst_myfeatures} distcc" - export DISTCC_HOSTS="${clst_distcc_hosts}" - - USE="-gnome -gtk" emerge --oneshot --nodeps -b -k distcc || exit 1 -fi - -if [ -n "${clst_PKGCACHE}" ] -then - export clst_emergeopts="--usepkg --buildpkg --newuse" -else - export clst_emergeopts="" -fi - -if [ -n "${clst_FETCH}" ] -then - export clst_emergeopts="${clst_emergeopts} -f" -fi +setup_myfeatures +setup_myemergeopts ## setup the environment + export FEATURES="${clst_myfeatures}" export CONFIG_PROTECT="-*" ## START BUILD -USE="build" emerge portage +setup_portage + #turn off auto-use: export USE_ORDER="env:pkg:conf:defaults" -if [ "${clst_VERBOSE}" ] -then - emerge ${clst_emergeopts} -vp ${clst_packages} - echo "Press any key within 15 seconds to pause the build..." - read -s -t 15 -n 1 - if [ $? -eq 0 ] - then - echo "Press any key to continue..." - read -s -n 1 - fi -fi - -emerge ${clst_emergeopts} ${clst_packages} +run_emerge "${clst_packages}" diff --git a/targets/livecd-stage1/livecd-stage1-controller.sh b/targets/livecd-stage1/livecd-stage1-controller.sh new file mode 100755 index 00000000..c729a517 --- /dev/null +++ b/targets/livecd-stage1/livecd-stage1-controller.sh @@ -0,0 +1,75 @@ +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/livecd-stage1/livecd-stage1-controller.sh,v 1.1 2005/04/04 17:48:33 rocket Exp $ + +. ${clst_sharedir}/targets/support/functions.sh + +## START RUNSCRIPT + +case $1 in + preclean) + # move over the motd (if applicable) + if [ -n "${clst_livecd_motd}" ] + then + cp -a ${clst_livecd_motd} ${clst_chroot_path}/etc/motd + else + cp -a ${clst_sharedir}/livecd/files/generic.motd.txt \ + ${clst_sharedir}/livecd/files/universal.motd.txt \ + ${clst_sharedir}/livecd/files/minimal.motd.txt \ + ${clst_sharedir}/livecd/files/environmental.motd.txt \ + ${clst_sharedir}/livecd/files/gamecd.motd.txt \ + ${clst_chroot_path}/etc + fi + + # move over the xinitrc (if applicable) + if [ -n "${clst_livecd_xinitrc}" ] + then + cp -a ${clst_livecd_xinitrc} ${clst_chroot_path}/etc/X11/xinit/xinitrc + fi + + # move over the environment + cp ${clst_sharedir}/livecd/files/livecd-bash_profile \ + ${clst_chroot_path}/root/.bash_profile + touch ${clst_chroot_path}/root/.bashrc + cp ${clst_sharedir}/livecd/files/livecd-local.start \ + ${clst_chroot_path}/etc/conf.d/local.start + cp ${clst_sharedir}/livecd/files/mkvardb \ + ${clst_chroot_path}/tmp + mkdir -p /usr/share/faces + cp ${clst_sharedir}/livecd/files/gentoo.png \ + ${clst_chroot_path}/usr/share/faces + + # touch /etc/startx if our livecd/type requires it + if [ "${clst_livecd_type}" = "gentoo-release-environmental" ] \ + || [ "${clst_livecd_type}" = "gentoo-gamecd" ] + then + touch ${clst_chroot_path}/etc/startx + fi + + # now, finalize and tweak the livecd fs (inside of the chroot) + exec_in_chroot ${clst_sharedir}/targets/support/livecdfs-update.sh + + # execute gamecdfs-update.sh if we're a gamecd + if [ "${clst_livecd_type}" = "gentoo-gamecd" ] + then + exec_in_chroot ${clst_sharedir}/targets/support/gamecdfs-update.sh + fi + + # if the user has their own fs update script, execute it + if [ -n "${clst_livecd_fsscript}" ] + then + exec_in_chroot ${clst_livecd_fsscript} + fi + ;; + + build_packages) + shift + export clst_packages="$*" + exec_in_chroot ${clst_sharedir}/targets/${clst_target}/${clst_target}-chroot.sh + ;; + + clean) + find ${clst_chroot_path}/usr/lib -iname "*.pyc" -exec rm -f {} \; + ;; +esac +exit 0 diff --git a/targets/livecd-stage1/livecd-stage1-preclean-chroot.sh b/targets/livecd-stage1/livecd-stage1-preclean-chroot.sh index 224fa500..356ddb54 100755 --- a/targets/livecd-stage1/livecd-stage1-preclean-chroot.sh +++ b/targets/livecd-stage1/livecd-stage1-preclean-chroot.sh @@ -1,7 +1,7 @@ #!/bin/bash -# Copyright 1999-2004 Gentoo Foundation +# Copyright 1999-2005 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/livecd-stage1/livecd-stage1-preclean-chroot.sh,v 1.6 2005/01/29 14:54:31 wolf31o2 Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/livecd-stage1/livecd-stage1-preclean-chroot.sh,v 1.7 2005/04/04 17:48:33 rocket Exp $ -/usr/sbin/env-update -source /etc/profile +. /tmp/chroot-functions.sh +update_env_settings diff --git a/targets/livecd-stage1/livecd-stage1.sh b/targets/livecd-stage1/livecd-stage1.sh deleted file mode 100755 index fb98751a..00000000 --- a/targets/livecd-stage1/livecd-stage1.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash -# Copyright 1999-2004 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/livecd-stage1/Attic/livecd-stage1.sh,v 1.22 2005/03/24 14:17:29 wolf31o2 Exp $ - -case $1 in - enter) - ${clst_CHROOT} ${clst_chroot_path} - ;; - run) - shift - - cp ${clst_sharedir}/targets/livecd-stage1/livecd-stage1-chroot.sh ${clst_chroot_path}/tmp - clst_packages="$*" ${clst_CHROOT} ${clst_chroot_path} /tmp/livecd-stage1-chroot.sh || exit 1 - rm -f ${clst_chroot_path}/tmp/livecd-stage1-chroot.sh - ;; - - preclean) - GCONFD_RUNNING="`pidof gconfd-2`" - if [ -n "${GCONFD_RUNNING}" ] - then - kill -9 ${GCONFD_RUNNING} - #gconftool-2 --shutdown - fi - #cp ${clst_sharedir}/targets/livecd-stage1/livecd-stage1-preclean-chroot.sh ${clst_chroot_path}/tmp - #${clst_CHROOT} ${clst_chroot_path} /tmp/livecd-stage1-preclean-chroot.sh || exit 1 - #rm -f ${clst_chroot_path}/tmp/livecd-stage1-preclean-chroot.sh - exit 0 - ;; - - clean) - exit 0 - ;; - - *) - exit 1 - ;; - -esac -exit 0 diff --git a/targets/livecd-stage2/livecd-stage2-bootloader.sh b/targets/livecd-stage2/livecd-stage2-bootloader.sh new file mode 100755 index 00000000..4a326ff5 --- /dev/null +++ b/targets/livecd-stage2/livecd-stage2-bootloader.sh @@ -0,0 +1,189 @@ +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/livecd-stage2/Attic/livecd-stage2-bootloader.sh,v 1.1 2005/04/04 17:48:33 rocket Exp $ +. ${clst_sharedir}/targets/support/functions.sh +. ${clst_sharedir}/targets/support/filesystem-functions.sh +#. ${clst_sharedir}/targets/${clst_target}/${clst_mainarch}-archscript.sh + +#source ${clst_livecd_archscript} +## START RUNSCRIPT +extract_cdtar +extract_kernels ${clst_target_path}/boot +check_dev_manager +check_filesystem_type + +default_append_line="initrd=${x}.igz root=/dev/ram0 init=/linuxrc acpi=off ${cmdline_opts} ${custom_kopts} cdroot" + +case ${clst_mainarch} in + alpha) + acfg=${clst_target_path}/etc/aboot.conf + bctr=0 + for x in ${clst_boot_kernel} + do + echo -n "${bctr}:/boot/${x} " >> ${acfg} + echo -n "initrd=/boot/${x}.igz root=/dev/ram0 " >> ${acfg} + echo "init=/linuxrc ${cmdline_opts} cdroot" >> ${acfg} + ((bctr=${bctr}+1)) + done + ;; + + arm) + ;; + hppa) + icfg=${clst_target_path}/boot/palo.conf + kmsg=${clst_target_path}/boot/kernels.msg + hmsg=${clst_target_path}/boot/help.msg + echo "--commandline=0/${first} initrd=${x}.igz root=/dev/ram0 init=/linuxrc ${cmdline_opts}" >> ${icfg} + echo "--bootloader=boot/iplboot" >> ${icfg} + echo "--ramdisk=boot/${x}.igz" >> ${icfg} + +# for x in $clst_boot_kernel +# do +# +# eval custom_kopts=\$${x}_kernelopts +# echo "APPENDING CUSTOM KERNEL ARGS: ${custom_kopts}" +# echo >> $icfg +# echo "label $x" >> $icfg +# echo " kernel $x" >> $icfg +# echo " append initrd=$x.igz root=/dev/ram0 init=/linuxrc ${cmdline_opts} ${custom_kopts} cdroot vga=0x317 splash=silent" >> $icfg +# echo >> $icfg +# echo " $x" >> $kmsg +# echo "label $x-nofb" >> $icfg +# echo " kernel $x" >> $icfg +# echo " append initrd=$x.igz root=/dev/ram0 init=/linuxrc ${cmdline_opts} ${custom_kopts} cdroot" >> $icfg +# echo >> $icfg +# echo " ${x}-nofb" >> $kmsg +# done + ;; + ppc) + # PPC requirements: + # ----------------- + # The specs indicate the kernels to be build. We need to put + # those kernels and the corresponding initrd.img.gz(s) in the + # /boot directory. This directory contains a message boot.msg + # containing some info to be displayed on boot, a configuration + # (yaboot.conf) specifying the boot options (kernel/initrd + # combinations). The boot directory also contains a file called + # yaboot, which normally gets copied from the live environment. + # For now we supply a prebuilt file, prebuilt configuration + # and prebuilt boot message. This can be enhanced later on + # but the following suffices for now: + ;; + sparc*) + scfg=${clst_target_path}/boot/silo.conf + echo "default=\"help\"" > ${scfg} + echo "message=\"/boot/boot.msg\"" >> ${scfg} + + for x in ${clst_boot_kernel} + do + echo >> ${icfg} + echo "image=\"/boot/${x}\"" >> ${scfg} + echo -e "\tlabel=\"${x}\"" >> ${scfg} + echo -e "\tappend=\"initrd=/boot/${x}.igz root=/dev/ram0 init=/linuxrc ${cmdline_opts} cdroot\"" >> ${scfg} + + done + + echo "image=\"cat /boot/silo.conf\"" >> ${scfg} + echo -e "label=\"config\"" >> ${scfg} + echo "image=\"cat /boot/video.msg\"" >> ${scfg} + echo -e "label=\"video\"" >> ${scfg} + echo "image=\"cat /boot/help.msg\"" >> ${scfg} + echo -e "label=\"help\"" >> ${scfg} + ;; + x86) + if [ -e ${clst_target_path}/boot/isolinux.bin ] + then + # the rest of this function sets up the config file for isolinux + icfg=${clst_target_path}/boot/isolinux.cfg + kmsg=${clst_target_path}/boot/kernels.msg + hmsg=${clst_target_path}/boot/help.msg + echo "default ${first}" > ${icfg} + echo "timeout 150" >> ${icfg} + echo "prompt 1" >> ${icfg} + echo "display boot.msg" >> ${icfg} + echo "F1 kernels.msg" >> ${icfg} + echo "F2 help.msg" >> ${icfg} + + echo "Available kernels:" > ${kmsg} + cp ${clst_sharedir}/livecd/files/x86-help.msg ${hmsg} + + for x in ${clst_boot_kernel} + do + + eval custom_kopts=\$${x}_kernelopts + echo "APPENDING CUSTOM KERNEL ARGS: ${custom_kopts}" + echo >> ${icfg} + echo "label ${x}" >> ${icfg} + echo " kernel ${x}" >> ${icfg} + if [ "${clst_livecd_splash_type}" == "gensplash" -a -n "${clst_livecd_splash_theme}" ] + then + echo " append ${default_append_line} vga=791 dokeymap splash=silent,theme:${clst_livecd_splash_theme}" >> ${icfg} + else + echo " append ${default_append_line} vga=791 dokeymap splash=silent" >> ${icfg} + fi + + echo >> ${icfg} + echo " ${x}" >> ${kmsg} + echo "label ${x}-nofb" >> ${icfg} + echo " kernel ${x}" >> ${icfg} + echo " append ${default_append_line} " >> ${icfg} + echo >> ${icfg} + echo " ${x}-nofb" >> ${kmsg} + done + + if [ -f ${clst_target_path}/boot/memtest86 ] + then + echo >> $icfg + echo " memtest86" >> $kmsg + echo " title memtest86" >> $icfg + echo " kernel memtest86" >> $icfg + fi + fi + + if [ -e ${clst_target_path}/boot/grub/stage2_eltorito ] + then + icfg=${clst_target_path}/boot/grub/grub.conf + hmsg=${clst_target_path}/boot/grub/help.msg + echo "default 1" > ${icfg} + echo "timeout 150" >> ${icfg} + echo >> ${icfg} + echo "title help" >> ${icfg} + echo "cat /boot/grub/help.msg" >> ${icfg} + for x in ${clst_boot_kernel} + do + eval custom_kopts=\$${x}_kernelopts + echo "APPENDING CUSTOM KERNEL ARGS: ${custom_kopts}" + echo >> ${icfg} + echo "title ${x}" >> ${icfg} + + if [ "${clst_livecd_splash_type}" == "gensplash" -a -n "${clst_livecd_splash_theme}" ] + then + echo "kernel /boot/${x} ${default_append_line} vga=791 dokeymap splash=silent,theme:${clst_livecd_splash_theme}" >> ${icfg} + else + echo "kernel /boot/${x} ${default_append_line} vga=791 dokeymap splash=silent" >> ${icfg} + fi + + if [ -e ${clst_target_path}/boot/${x}.igz ] + then + echo "initrd /boot/${x}.igz" >> ${icfg} + fi + + echo >> ${icfg} + echo "title ${x} [ No FrameBuffer ]" >> ${icfg} + echo "kernel ${x} /boot/${x} ${default_append_line}" >> ${icfg} + if [ -e ${clst_target_path}/boot/${x}.igz ] + then + echo "initrd /boot/${x}.igz" >> ${icfg} + fi + done + + if [ -f ${clst_target_path}/boot/memtest86 ] + then + echo >> ${icfg} + echo "title memtest86" >> ${icfg} + echo "kernel /boot/memtest86" >> ${icfg} + fi + fi + ;; +esac +exit 0 diff --git a/targets/livecd-stage2/livecd-stage2-cdfs.sh b/targets/livecd-stage2/livecd-stage2-cdfs.sh new file mode 100755 index 00000000..528b8e50 --- /dev/null +++ b/targets/livecd-stage2/livecd-stage2-cdfs.sh @@ -0,0 +1,34 @@ +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/livecd-stage2/Attic/livecd-stage2-cdfs.sh,v 1.1 2005/04/04 17:48:33 rocket Exp $ +. ${clst_sharedir}/targets/support/functions.sh +. ${clst_sharedir}/targets/support/filesystem-functions.sh +#. ${clst_sharedir}/targets/${clst_target}/${clst_mainarch}-archscript.sh + +#source ${clst_livecd_archscript} +## START RUNSCRIPT + +loopret=1 +case ${clst_livecd_cdfstype} in + normal) + create_normal_loop + loopret=$? + ;; + zisofs) + create_zisofs + loopret=$? + ;; + noloop) + create_noloop + loopret=$? + ;; + gcloop) + create_gcloop + loopret=$? + ;; + squashfs) + create_squashfs + loopret=$? + ;; +esac +exit $loopret diff --git a/targets/livecd-stage2/livecd-stage2-controller.sh b/targets/livecd-stage2/livecd-stage2-controller.sh new file mode 100755 index 00000000..0a8b3f64 --- /dev/null +++ b/targets/livecd-stage2/livecd-stage2-controller.sh @@ -0,0 +1,101 @@ +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/livecd-stage2/livecd-stage2-controller.sh,v 1.1 2005/04/04 17:48:33 rocket Exp $ +. ${clst_sharedir}/targets/support/functions.sh +. ${clst_sharedir}/targets/support/filesystem-functions.sh + +#source ${clst_livecd_archscript} +## START RUNSCRIPT + +case $1 in + kernel) + shift + export clst_kname="$1" + + + exec_in_chroot ${clst_sharedir}/targets/support/pre-kmerge.sh + exec_in_chroot ${clst_sharedir}/targets/support/kmerge.sh + exec_in_chroot ${clst_sharedir}/targets/support/post-kmerge.sh + + extract_modules ${clst_chroot_path} ${clst_kname} + #16:12 <@solar> kernel_name=foo + #16:13 <@solar> eval clst_boot_kernel_${kernel_name}_config=bar + #16:13 <@solar> eval echo \$clst_boot_kernel_${kernel_name}_config + ;; + + preclean) + # move over the motd (if applicable) + if [ -n "${clst_livecd_motd}" ] + then + cp -a ${clst_livecd_motd} ${clst_chroot_path}/etc/motd + else + cp -a ${clst_sharedir}/livecd/files/generic.motd.txt \ + ${clst_sharedir}/livecd/files/universal.motd.txt \ + ${clst_sharedir}/livecd/files/minimal.motd.txt \ + ${clst_sharedir}/livecd/files/environmental.motd.txt \ + ${clst_sharedir}/livecd/files/gamecd.motd.txt \ + ${clst_chroot_path}/etc + fi + + # move over the xinitrc (if applicable) + if [ -n "${clst_livecd_xinitrc}" ] + then + cp -a ${clst_livecd_xinitrc} ${clst_chroot_path}/etc/X11/xinit/xinitrc + fi + + # move over the environment + cp ${clst_sharedir}/livecd/files/livecd-bash_profile \ + ${clst_chroot_path}/root/.bash_profile + touch ${clst_chroot_path}/root/.bashrc + cp ${clst_sharedir}/livecd/files/livecd-local.start \ + ${clst_chroot_path}/etc/conf.d/local.start + cp ${clst_sharedir}/livecd/files/mkvardb \ + ${clst_chroot_path}/tmp + mkdir -p /usr/share/faces + cp ${clst_sharedir}/livecd/files/gentoo.png \ + ${clst_chroot_path}/usr/share/faces + + # touch /etc/startx if our livecd/type requires it + if [ "${clst_livecd_type}" = "gentoo-release-environmental" ] \ + || [ "${clst_livecd_type}" = "gentoo-gamecd" ] + then + touch ${clst_chroot_path}/etc/startx + fi + + # now, finalize and tweak the livecd fs (inside of the chroot) + exec_in_chroot ${clst_sharedir}/targets/support/livecdfs-update.sh + + # execute gamecdfs-update.sh if we're a gamecd + if [ "${clst_livecd_type}" = "gentoo-gamecd" ] + then + exec_in_chroot ${clst_sharedir}/targets/support/gamecdfs-update.sh + fi + + # if the user has their own fs update script, execute it + if [ -n "${clst_livecd_fsscript}" ] + then + exec_in_chroot ${clst_livecd_fsscript} + fi + ;; + + clean) + find ${clst_chroot_path}/usr/lib -iname "*.pyc" -exec rm -f {} \; + ;; + + bootloader) + # Here is where we poke in our identifier + touch ${clst_target_path}/livecd + + ${clst_sharedir}/targets/livecd-stage2/livecd-stage2-bootloader.sh + ;; + + cdfs) + ${clst_sharedir}/targets/livecd-stage2/livecd-stage2-cdfs.sh + ;; + + iso) + shift + ${clst_sharedir}/targets/livecd-stage2/livecd-stage2-iso.sh $1 + ;; +esac +exit 0 diff --git a/targets/livecd-stage2/livecd-stage2-iso.sh b/targets/livecd-stage2/livecd-stage2-iso.sh new file mode 100755 index 00000000..0db179cf --- /dev/null +++ b/targets/livecd-stage2/livecd-stage2-iso.sh @@ -0,0 +1,93 @@ +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/livecd-stage2/Attic/livecd-stage2-iso.sh,v 1.1 2005/04/04 17:48:33 rocket Exp $ +. ${clst_sharedir}/targets/support/functions.sh +. ${clst_sharedir}/targets/support/filesystem-functions.sh +#. ${clst_sharedir}/targets/${clst_target}/${clst_mainarch}-archscript.sh + +#source ${clst_livecd_archscript} +## START RUNSCRIPT + +case ${clst_mainarch} in + alpha) + # this is for the livecd-final target, and calls the proper + # command to build the iso file + case ${clst_livecd_cdfstype} in + zisofs) + mkisofs -J -R -l -z -V "${clst_iso_volume_id}" -o ${1} ${clst_target_path} || die "Cannot make ISO image" + ;; + *) + mkisofs -J -R -l -V "${clst_iso_volume_id}" -o ${1} ${clst_target_path} || die "Cannot make ISO image" + ;; + esac + isomarkboot ${1} /boot/bootlx + ;; + + arm) + ;; + hppa) + #this is for the livecd-stage2 target, and calls the proper command to build the iso file + mkisofs -J -R -l -V "${clst_iso_volume_id}" -o ${1} ${clst_target_path} || die "Cannot make ISO image" + palo -f boot/palo.conf -C ${1} + + ;; + ppc) + # The name of the iso should be retrieved from the specs. For now, asssume GentooPPC_2004.0 + mkisofs -J -r -l -netatalk -hfs -probe -map ${clst_target_path}/boot/map.hfs -part -no-desktop -hfs-iso_volume_id \ + "${clst_iso_volume_id}" -hfs-bless ${clst_target_path}/boot -V "${clst_iso_volume_id}" -o ${1} ${clst_target_path} + ;; + sparc) + # this is for the livecd-final target, and calls the proper + # command to build the iso file + mkisofs -J -R -l -V "${clst_iso_volume_id}" -o ${1} -G ${clst_target_path}/boot/isofs.b -B ... ${clst_target_path} \ + || die "Cannot make ISO image" + + ;; + sparc64) + # Old silo + patched mkisofs fubar magic + # Only silo 1.2.x seems to work for most hardware + # Seems silo 1.3.x+ breaks on newer machines + # when booting from CD (current as of silo 1.4.8) + mv ${clst_target_path}/boot/mkisofs.sparc.fu /tmp + /tmp/mkisofs.sparc.fu -o ${1} -D -r -pad -quiet -S 'boot/cd.b' -B '/boot/second.b' \ + -s '/boot/silo.conf' -abstract 'Gentoo Linux Sparc' -copyright 'Gentoo Foundation' \ + -P 'Gentoo Linux Sparc' -p 'Gentoo Linux Sparc' -V "${clst_iso_volume_id}" \ + -A 'G entoo Linux Sparc' ${clst_target_path} || die "Cannot make ISO image" + rm /tmp/mkisofs.sparc.fu + + ;; + + x86) + #this is for the livecd-stage2 target, and calls the proper command + # to build the iso file + # + if [ -e ${clst_target_path}/boot/isolinux.bin ] + then + case ${clst_livecd_cdfstype} in + zisofs) + mkisofs -J -R -l -V "${clst_iso_volume_id}" -o ${1} -b boot/isolinux.bin -c boot/boot.cat -no-emul-boot \ + -boot-load-size 4 -boot-info-table -z ${clst_target_path} || die "Cannot make ISO image" + ;; + *) + mkisofs -J -R -l -V "${clst_iso_volume_id}" -o ${1} -b boot/isolinux.bin -c boot/boot.cat -no-emul-boot \ + -boot-load-size 4 -boot-info-table ${clst_target_path} || die "Cannot make ISO image" + ;; + esac + fi + + if [ -e ${clst_target_path}/boot/grub/stage2_eltorito ] + then + case ${clst_livecd_cdfstype} in + zisofs) + mkisofs -J -R -l -V "${clst_iso_volume_id}" -o ${1} -b boot/grub/stage2_eltorito -c boot/boot.cat -no-emul-boot \ + -boot-load-size 4 -boot-info-table -z ${clst_target_path} || die "Cannot make ISO image" + ;; + *) + mkisofs -J -R -l -V "${clst_iso_volume_id}" -o ${1} -b boot/grub/stage2_eltorito -c boot/boot.cat -no-emul-boot \ + -boot-load-size 4 -boot-info-table ${clst_target_path} || die "Cannot make ISO image" + ;; + esac + fi + ;; +esac +exit 0 diff --git a/targets/livecd-stage2/unmerge.sh b/targets/livecd-stage2/unmerge.sh index ab51c1cd..c9d26075 100644 --- a/targets/livecd-stage2/unmerge.sh +++ b/targets/livecd-stage2/unmerge.sh @@ -1,10 +1,11 @@ # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/livecd-stage2/Attic/unmerge.sh,v 1.7 2005/03/02 02:14:34 wolf31o2 Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/livecd-stage2/Attic/unmerge.sh,v 1.8 2005/04/04 17:48:33 rocket Exp $ ${clst_CHROOT} ${clst_chroot_path} /bin/bash << EOF EMERGE_WARNING_DELAY=0 emerge -C $* EOF + if [ -d /usr/livecd/profiles ] then mkdir -p /usr/portage/profiles diff --git a/targets/netboot/netboot-busybox.sh b/targets/netboot/netboot-busybox.sh deleted file mode 100644 index a379f8c5..00000000 --- a/targets/netboot/netboot-busybox.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -# Copyright 1999-2004 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/netboot/Attic/netboot-busybox.sh,v 1.5 2005/01/26 21:59:40 wolf31o2 Exp $ - -/usr/sbin/env-update -source /etc/profile - -[ -f /tmp/envscript ] && source /tmp/envscript - -# setup our environment -export FEATURES="${clst_myfeatures}" -export CONFIG_PROTECT="-*" -export USE_ORDER="env:pkg:conf:defaults" - -# Use the catalyst config -export USE="netboot make-busybox-symlinks" - -if [ ! -z "${1}" ] -then - export USE="${USE} savedconfig" - # Do not use package for busybox since the config can change - ROOT=${IMAGE_PATH} emerge --nodeps busybox || exit 1 -else - ROOT=${IMAGE_PATH} emerge --nodeps ${clst_myemergeopts} busybox || exit 1 - -fi - diff --git a/targets/netboot/netboot-combine.sh b/targets/netboot/netboot-combine.sh index bf7f6599..a417af58 100644 --- a/targets/netboot/netboot-combine.sh +++ b/targets/netboot/netboot-combine.sh @@ -1,12 +1,19 @@ #!/bin/bash # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/netboot/netboot-combine.sh,v 1.2 2005/01/11 15:22:41 zhen Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/netboot/netboot-combine.sh,v 1.3 2005/04/04 17:48:33 rocket Exp $ -/usr/sbin/env-update -source /etc/profile +. ${clst_sharedir}/targets/support/chroot-functions.sh +. ${clst_sharedir}/targets/support/functions.sh +. ${clst_sharedir}/targets/support/filesystem-functions.sh -[ -f /tmp/envscript ] && source /tmp/envscript +update_env_settings +check_portage_version +setup_myfeatures +setup_myemergeopts + +# setup our environment +export FEATURES="${clst_myfeatures}" # First install the boot package that we need booter="" @@ -18,57 +25,81 @@ case ${clst_mainarch} in x86) booter=netboot;; *) exit 1;; esac -if [ ! -z "${booter}" ] ; then - emerge -k -b ${booter} || exit 1 -fi +#if [ ! -z "${booter}" ] ; then +# run_emerge ${booter} || exit 1 +#fi + +extract_kernels ${clst_chroot_path}/tmp # Then generate the netboot image ! :D -case ${clst_mainarch} in - alpha) - make \ - -C /usr/src/linux \ - INITRD=/initrd.gz \ - HPATH="/usr/src/linux/include" \ - vmlinux bootpfile \ - || exit 1 - cp /usr/src/linux/arch/alpha/boot/bootpfile /netboot.alpha || exit 1 - ;; - arm) - cp /kernel /netboot.arm || exit 1 - cat /initrd.gz >> /netboot.arm || exit 1 - #make \ - # -C /usr/src/linux \ - # INITRD=/initrd.gz \ - # bootpImage \ - # || exit 1 - ;; - hppa) - # We have to remove the previous image because the file is considered - # as a tape by palo and then not truncated but rewritten. - rm -f /netboot.hppa +for kname in ${clst_boot_kernel} +do + + mkdir -p ${clst_chroot_path}/tmp/staging/initrd-${kname} + cp -r ${clst_chroot_path}/tmp/image ${clst_chroot_path}/tmp/staging/initrd-${kname} + extract_modules ${clst_chroot_path}/tmp/staging/initrd-${kname} ${kname} + create_normal_loop ${clst_chroot_path}/tmp/staging/initrd-${kname} ${clst_target_path} initrd-${kname}.igz + rm -r ${clst_chroot_path}/tmp/staging/initrd-${kname} + + + + case ${clst_mainarch} in + alpha) + # Until aboot is patched this is broken currently. + # please use catalyst 1.1.5 or older - palo \ - -k /kernel \ - -r /initrd.gz \ - -s /netboot.hppa \ - -f foo \ - -b /usr/share/palo/iplboot \ - -c "0/vmlinux root=/dev/ram0 initrd=/initrd" \ - || exit 1 - ;; - sparc*) - elftoaout -o /netboot.${clst_mainarch} /usr/src/linux/vmlinux - piggy=${clst_mainarch/sparc/piggyback} - ${piggy} /netboot.${clst_mainarch} /usr/src/linux/System.map initrd.gz - ;; - x86) - mknbi-linux \ - -k /kernel \ - -r /initrd.gz \ - -o /netboot.x86 \ - -x \ - -a "root=/dev/ram0 initrd=/initrd" \ - || exit 1 - ;; - *) exit 1;; -esac + #TEST TEST TEST TEST + #http://lists.debian.org/debian-alpha/2004/07/msg00094.html + #make \ + # -C /usr/src/linux \ + # INITRD=/initrd.gz \ + # HPATH="/usr/src/linux/include" \ + # vmlinux bootpfile \ + # || exit 1 + #cp /usr/src/linux/arch/alpha/boot/bootpfile /netboot.alpha || exit 1 + ;; + arm) + #TEST TEST TEST TEST + cp /${clst_chroot_path}/tmp/${kname} /netboot-${kname}.arm || exit 1 + cat /${clst_target_path}/initrd-${kname}.igz >> /${clst_target_path}/netboot-${kname}.arm || exit 1 + #make \ + # -C /usr/src/linux \ + # INITRD=/initrd.gz \ + # bootpImage \ + # || exit 1 + ;; + hppa) + # We have to remove the previous image because the file is considered + # as a tape by palo and then not truncated but rewritten. + #TEST TEST TEST TEST + rm -f /netboot-${kname}.hppa + + palo \ + -k /${clst_chroot_path}/tmp/${kname} \ + -r /${clst_target_path}/initrd-${kname}.igz \ + -s /${clst_target_path}/netboot-${kname}.hppa \ + -f foo \ + -b /usr/share/palo/iplboot \ + -c "0/vmlinux root=/dev/ram0 ${cmdline_opts}" \ + || exit 1 + ;; + sparc*) + #TEST TEST TEST TEST + #elftoaout -o /netboot-${kname}.${clst_mainarch} /usr/src/linux/vmlinux + #elftoaout -o /netboot-${kname}.${clst_mainarch} /${kname} + #piggy=${clst_mainarch/sparc/piggyback} + #${piggy} /netboot-${kname}.${clst_mainarch} /usr/src/linux/System.map /initrd-${kname}.igz + ;; + x86) + + mknbi-linux \ + -k /${clst_chroot_path}/tmp/${kname} \ + -r /${clst_target_path}/initrd-${kname}.igz \ + -o /${clst_target_path}/netboot-${kname}.x86 \ + -x \ + -a "root=/dev/ram0 ${cmdline_opts}" \ + || exit 1 + ;; + *) exit 1;; + esac +done diff --git a/targets/netboot/netboot-image.sh b/targets/netboot/netboot-image.sh index 02e2a23e..4cf3d280 100644 --- a/targets/netboot/netboot-image.sh +++ b/targets/netboot/netboot-image.sh @@ -1,126 +1,17 @@ #!/bin/bash # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/netboot/netboot-image.sh,v 1.4 2005/01/11 15:22:41 zhen Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/netboot/netboot-image.sh,v 1.5 2005/04/04 17:48:33 rocket Exp $ -/usr/sbin/env-update -source /etc/profile +. /tmp/chroot-functions.sh -if [ -f /tmp/envscript ] -then - source /tmp/envscript - rm -f /tmp/envscript -fi +update_env_settings -#IMAGE_PATH=$1 -#shift -#TARBALL=$1 -#shift -if [ -z "${IMAGE_PATH}" ] -then - echo "IMAGE_PATH not specified !" - exit 1 -fi - -# Install the netboot base system -ROOT=${IMAGE_PATH} emerge -k -b --nodeps netboot-base || exit 1 - -# Copy libs of a executable in the chroot -function copy_libs() { - - # Check if it's a dynamix exec - ldd ${1} > /dev/null 2>&1 || return - - for lib in `ldd ${1} | awk '{ print $3 }'` - do - if [ -e ${lib} ] - then - if [ ! -e ${IMAGE_PATH}/${lib} ] - then - copy_file ${lib} - [ -e "${IMAGE_PATH}/${lib}" ] && strip -R .comment -R .note ${IMAGE_PATH}/${lib} || echo "WARNING : Cannot strip lib ${IMAGE_PATH}/${lib} !" - fi - else - echo "WARNING : Some library was not found for ${lib} !" - fi - done - -} - - -function copy_symlink() { - - STACK=${2} - [ "${STACK}" = "" ] && STACK=16 || STACK=$((${STACK} - 1 )) - - if [ ${STACK} -le 0 ] - then - echo "WARNING : ${TARGET} : too many levels of symbolic links !" - return - fi - - [ ! -e ${IMAGE_PATH}/`dirname ${1}` ] && mkdir -p ${IMAGE_PATH}/`dirname ${1}` - [ ! -e ${IMAGE_PATH}/${1} ] && cp -vfdp ${1} ${IMAGE_PATH}/${1} - - TARGET=`readlink -f ${1}` - if [ -h ${TARGET} ] - then - copy_symlink ${TARGET} ${STACK} - else - copy_file ${TARGET} - fi - - -} - -function copy_file() { - - f="${1}" - - if [ ! -e "${f}" ] - then - echo "WARNING : File not found : ${f}" - continue - fi - - [ ! -e ${IMAGE_PATH}/`dirname ${f}` ] && mkdir -p ${IMAGE_PATH}/`dirname ${f}` - [ ! -e ${IMAGE_PATH}/${f} ] && cp -vfdp ${f} ${IMAGE_PATH}/${f} - if [ -x ${f} -a ! -h ${f} ] - then - copy_libs ${f} - strip -R .comment -R .note ${IMAGE_PATH}/${f} > /dev/null 2>&1 - elif [ -h ${f} ] - then - copy_symlink ${f} - fi -} - - -# Copy the files needed in the chroot - -copy_libs ${IMAGE_PATH}/bin/busybox - -FILES="${@}" -for f in ${FILES} -do +echo "copying files to ${clst_root_path}" +clst_files="/bin/busybox ${clst_files} " +for f in ${clst_files} +do copy_file ${f} done - -# Copy the kernel modules over -if [ -d ${GK_BINARIES}/lib ] ; then - cp -r ${GK_BINARIES}/lib ${IMAGE_PATH}/ || exit 1 -fi - -# Prune portage stuff -cd ${IMAGE_PATH} -rm -r var/db var/cache - -# Create the ramdisk -emerge -k -b genext2fs -IMAGE_SIZE=$(du -s -k ${IMAGE_PATH} | cut -f1) -IMAGE_SIZE=$((IMAGE_SIZE + 500)) -IMAGE_INODES=$(find ${IMAGE_PATH} | wc -l) -IMAGE_INODES=$((IMAGE_INODES + 100)) -genext2fs -q -d "${IMAGE_PATH}" -b ${IMAGE_SIZE} -i ${IMAGE_INODES} /initrd || exit 1 -gzip -9f /initrd || exit 1 +echo "done copying files" diff --git a/targets/netboot/netboot-kernel.sh b/targets/netboot/netboot-kernel.sh deleted file mode 100644 index 0a329d22..00000000 --- a/targets/netboot/netboot-kernel.sh +++ /dev/null @@ -1,76 +0,0 @@ -#!/bin/bash -# Copyright 1999-2004 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/netboot/Attic/netboot-kernel.sh,v 1.6 2005/01/26 21:59:40 wolf31o2 Exp $ - -/usr/sbin/env-update -source /etc/profile - -[ -f /tmp/envscript ] && source /tmp/envscript - -# setup our environment -export FEATURES="${clst_myfeatures}" -export CONFIG_PROTECT="-*" -export USE_ORDER="env:pkg:conf:defaults" - -mkdir -p ${GK_BINARIES} -BUILD_KERNEL=1 -CONFIG_MD5_EQUAL=0 - -GK_PKGDIR="$(portageq envvar PKGDIR)/All/genkernel" - -if [ -e "${GK_PKGDIR}/config-md5" -a "`md5sum ${CONFIG}`" = "$(< ${GK_PKGDIR}/config-md5)" ] -then - CONFIG_MD5_EQUAL=1 - echo "Using the cached kernel since your .config didn't changed." -fi - -if [ -n "${clst_KERNCACHE}" -a ${CONFIG_MD5_EQUAL} -eq 1 ] -then - mkdir -p ${GK_PKGDIR} - if [ -f ${GK_PKGDIR}/kernel ] && [ -d ${GK_PKGDIR}/lib ] - then - cp -r ${GK_PKGDIR}/lib ${GK_BINARIES}/ || exit 1 - cp ${GK_PKGDIR}/kernel ${GK_BINARIES}/ || exit 1 - BUILD_KERNEL=0 - fi -fi - -if [ ${BUILD_KERNEL} -eq 1 ] -then - # setup genkernel - emerge ${clst_myemergeopts} genkernel || exit 1 - - # Build the kernel ! - emerge ${clst_myemergeopts} ${SOURCES} || exit 1 - - genkernel \ - --no-mountboot \ - --kerneldir=/usr/src/linux \ - --kernel-config=${CONFIG} \ - --module-prefix=${GK_BINARIES} \ - --minkernpackage=${GK_BINARIES}/kernel.tar.bz2 \ - kernel || exit 1 - - # DO NOT STRIP MODULES !!! It makes them unloadable ! - - - kernname="$(tar -tjf ${GK_BINARIES}/kernel.tar.bz2)" - tar -jxf ${GK_BINARIES}/kernel.tar.bz2 -C ${GK_BINARIES} - mv ${GK_BINARIES}/{${kernname},kernel} || exit 1 - - if [ -n "${clst_KERNCACHE}" ] - then - case ${clst_mainarch} in - alpha|arm|sparc);; - *) - cp -r ${GK_BINARIES}/lib ${GK_PKGDIR}/ || exit 1 - cp ${GK_BINARIES}/kernel ${GK_PKGDIR}/ || exit 1 - ;; - esac - fi - - md5sum "${CONFIG}" > "${GK_PKGDIR}/config-md5" -fi - -cp ${GK_BINARIES}/kernel / || exit 1 diff --git a/targets/netboot/netboot-packages.sh b/targets/netboot/netboot-packages.sh deleted file mode 100644 index ea321751..00000000 --- a/targets/netboot/netboot-packages.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash -# Copyright 1999-2004 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/netboot/Attic/netboot-packages.sh,v 1.6 2005/01/28 18:37:23 wolf31o2 Exp $ - -portage_version=`/usr/lib/portage/bin/portageq best_version / sys-apps/portage \ - | cut -d/ -f2 | cut -d- -f2,3` -if [ `echo ${portage_version} | cut -d- -f1 | cut -d. -f3` -lt 51 ] -then - echo "ERROR: Your portage version is too low in your seed stage. Portage version" - echo "2.0.51 or greater is required." - exit 1 -fi - -/usr/sbin/env-update -source /etc/profile - -[ -f /tmp/envscript ] && source /tmp/envscript - -# setup our environment -export FEATURES="${clst_myfeatures}" -export CONFIG_PROTECT="-*" -export USE_ORDER="env:pkg:conf:defaults" - -if [ "${clst_FETCH}" ] -then - export clst_myemergeopts="${clst_myemergeopts} -f" -fi - -# START BUILD -if [ "${clst_VERBOSE}" ] -then - emerge ${clst_myemergeopts} -vp ${clst_packages} - echo "Press any key within 15 seconds to pause the build..." - read -s -t 15 -n 1 - if [ $? -eq 0 ] - then - echo "Press any key to continue..." - read -s -n 1 - fi -fi - -emerge ${clst_myemergeopts} ${clst_packages} diff --git a/targets/netboot/netboot-setup.sh b/targets/netboot/netboot-setup.sh deleted file mode 100644 index a37b24a7..00000000 --- a/targets/netboot/netboot-setup.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -# Copyright 1999-2004 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/netboot/Attic/netboot-setup.sh,v 1.1 2004/10/11 14:28:27 zhen Exp $ - -/usr/sbin/env-update -source /etc/profile - -[ -f /tmp/envscript ] && source /tmp/envscript - -if [ -n "${clst_CCACHE}" ] -then - emerge -b -k --oneshot --nodeps ccache || exit 1 -fi - -if [ -n "${clst_DISTCC}" ] -then - USE="-gtk -gnome" emerge -b -k --oneshot --nodeps distcc || exit 1 -fi - -mkdir -p ${IMAGE_PATH} diff --git a/targets/netboot/netboot.sh b/targets/netboot/netboot.sh deleted file mode 100644 index fafc5d06..00000000 --- a/targets/netboot/netboot.sh +++ /dev/null @@ -1,93 +0,0 @@ -#!/bin/bash -# Copyright 1999-2004 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/netboot/Attic/netboot.sh,v 1.6 2005/01/11 15:22:41 zhen Exp $ - -export GK_BINARIES=/var/tmp/gk_binaries -export IMAGE_PATH=/tmp/image - -if [ -n "${clst_CCACHE}" ] -then - export clst_myfeatures="${clst_myfeatures} ccache" -fi -if [ -n "${clst_DISTCC}" ] -then - export clst_myfeatures="${clst_myfeatures} distcc" - export DISTCC_HOSTS="${clst_distcc_hosts}" -fi -if [ -n "${clst_PKGCACHE}" ] -then - export clst_myemergeopts="${clst_myemergeopts} --usepkg --buildpkg --newuse" -fi - -scriptdir=${clst_sharedir}/targets/netboot - -cmd=$1 -shift -case ${cmd} in - - setup) - cp ${scriptdir}/netboot-setup.sh ${clst_chroot_path}/tmp - ${clst_CHROOT} ${clst_chroot_path} /tmp/netboot-setup.sh || exit 1 - rm -f ${clst_chroot_path}/tmp/netboot-setup.sh - ;; - - packages) - cp ${scriptdir}/netboot-packages.sh ${clst_chroot_path}/tmp - clst_packages="$*" ${clst_CHROOT} ${clst_chroot_path} /tmp/netboot-packages.sh || exit 1 - rm -f ${clst_chroot_path}/tmp/netboot-packages.sh - ;; - - busybox) - # Custom busybox config support - if [ ! -z "${1}" ] - then - mkdir -p ${clst_chroot_path}/etc/busybox/${clst_CHOST} - cp -v ${1} ${clst_chroot_path}/etc/busybox/${clst_CHOST}/busybox.config - fi - - cp ${scriptdir}/netboot-busybox.sh ${clst_chroot_path}/tmp - ${clst_CHROOT} ${clst_chroot_path} /tmp/netboot-busybox.sh "${1}" || exit 1 - rm -f ${clst_chroot_path}/tmp/netboot-busybox.sh - ;; - - kernel) - KERNEL_TYPE=${1} - SOURCES=${2} - CONFIG=${3} - if [ "${KERNEL_TYPE}" == "kernel-sources" ] - then - cp ${scriptdir}/netboot-kernel.sh ${clst_chroot_path}/tmp - cp ${CONFIG} ${clst_chroot_path}/var/tmp/kernel.config || die - env SOURCES=${SOURCES} CONFIG=/var/tmp/kernel.config \ - ${clst_CHROOT} ${clst_chroot_path} /tmp/netboot-kernel.sh || exit 1 - rm -f ${clst_chroot_path}/tmp/netboot-kernel.sh - else - cp ${clst_netboot_kernel_prebuilt} ${clst_chroot_path}/kernel - fi - ;; - - image) - cp ${scriptdir}/netboot-image.sh ${clst_chroot_path}/tmp - ${clst_CHROOT} ${clst_chroot_path} /tmp/netboot-image.sh "$@" || exit 1 - rm -f ${clst_chroot_path}/tmp/netboot-image.sh - ;; - - finish) - cp ${scriptdir}/netboot-combine.sh ${clst_chroot_path}/tmp - ${clst_CHROOT} ${clst_chroot_path} /tmp/netboot-combine.sh || exit 1 - rm -f ${clst_chroot_path}/tmp/netboot-combine.sh - - mkdir -p ${clst_target_path} - cp \ - ${clst_chroot_path}/{initrd.gz,kernel,netboot.$clst_mainarch} \ - ${clst_target_path} || exit 1 - ;; - - clean) - exit 0;; - *) - exit 1;; -esac - -exit 0 diff --git a/targets/stage1/build.py b/targets/stage1/build.py index ae64e0d7..9bebfc25 100755 --- a/targets/stage1/build.py +++ b/targets/stage1/build.py @@ -1,9 +1,9 @@ #!/usr/bin/python # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/stage1/build.py,v 1.1 2004/08/02 23:23:34 zhen Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/stage1/build.py,v 1.2 2005/04/04 17:48:33 rocket Exp $ -import portage +import portage,sys # this loads files from the profiles ... # wrap it here to take care of the different @@ -32,4 +32,4 @@ for idx in range(0, len(pkgs)): buildpkgs[bidx] = buildpkgs[bidx][1:] except: pass -for b in buildpkgs: print b +for b in buildpkgs: sys.stdout.write(b+" ") diff --git a/targets/stage1/stage1-chroot.sh b/targets/stage1/stage1-chroot.sh index 5dbe1460..20b85653 100755 --- a/targets/stage1/stage1-chroot.sh +++ b/targets/stage1/stage1-chroot.sh @@ -1,75 +1,23 @@ #!/bin/bash # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/stage1/stage1-chroot.sh,v 1.29 2005/02/28 23:21:09 wolf31o2 Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/stage1/stage1-chroot.sh,v 1.30 2005/04/04 17:48:33 rocket Exp $ -portage_version=`/usr/lib/portage/bin/portageq best_version / sys-apps/portage \ - | cut -d/ -f2 | cut -d- -f2,3` -if [ `echo ${portage_version} | cut -d- -f1 | cut -d. -f3` -lt 51 ] -then - echo "ERROR: Your portage version is too low in your seed stage. Portage version" - echo "2.0.51 or greater is required." - exit 1 -fi +. /tmp/chroot-functions.sh +check_portage_version -/usr/sbin/env-update -source /etc/profile +update_env_settings -if [ -x /usr/bin/gcc-config ] -then - gcc_current=`gcc-config -c` - gcc-config 3 && source /etc/profile - gcc-config ${gcc_current} && source /etc/profile -fi +setup_gcc -[ -f /tmp/envscript ] && source /tmp/envscript - -if [ -n "${clst_CCACHE}" ] -then - export clst_myfeatures="${clst_myfeatures} ccache" - emerge --oneshot --nodeps -b -k ccache || exit 1 -fi - -if [ -n "${clst_DISTCC}" ] -then - export clst_myfeatures="${clst_myfeatures} distcc" - export DISTCC_HOSTS="${clst_distcc_hosts}" - - USE="-gtk -gnome" emerge --oneshot --nodeps -b -k distcc || exit 1 -fi - -if [ -n "${clst_PKGCACHE}" ] -then - export clst_myemergeopts="${clst_myemergeopts} --usepkg --buildpkg --newuse" -fi - -if [ -n "${clst_FETCH}" ] -then - export clst_myemergeopts="${clst_myemergeopts} -f" -fi +setup_myfeatures +setup_myemergeopts # setup our environment -export FEATURES="${clst_myfeatures}" -export ROOT=${1} -install -d ${ROOT} - -## START BUILD export clst_buildpkgs="$(/tmp/build.py)" -STAGE1_USE="$(portageq envvar STAGE1_USE)" - -# duplicate line to below - why is this here?? -#USE="-* build ${STAGE1_USE}" emerge ${clst_myemergeopts} --noreplace ${clst_buildpkgs} || exit 1 - -if [ -n "${clst_VERBOSE}" ] -then - USE="-* build" emerge ${clst_myemergeopts} -vp --noreplace ${clst_buildpkgs} || exit 1 - echo "Press any key within 15 seconds to pause the build..." - read -s -t 15 -n 1 - if [ $? -eq 0 ] - then - echo "Press any key to continue..." - read -s -n 1 - fi -fi +export STAGE1_USE="$(portageq envvar STAGE1_USE)" +export USE="-* build ${STAGE1_USE}" +export FEATURES="${clst_myfeatures}" -USE="-* build ${STAGE1_USE}" emerge ${clst_myemergeopts} --noreplace ${clst_buildpkgs} || exit 1 +## START BUILD +run_emerge "--noreplace ${clst_buildpkgs}" diff --git a/targets/stage1/stage1-controller.sh b/targets/stage1/stage1-controller.sh new file mode 100755 index 00000000..65dcee1b --- /dev/null +++ b/targets/stage1/stage1-controller.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/stage1/stage1-controller.sh,v 1.1 2005/04/04 17:48:33 rocket Exp $ +. ${clst_sharedir}/targets/support/functions.sh + +case $1 in + enter) + ;; + + run) + cp ${clst_sharedir}/targets/stage1/build.py ${clst_chroot_path}/tmp + + # set up "ROOT in chroot" dir + install -d ${clst_chroot_path}/${clst_root_path}/etc + + # set up make.conf and make.profile link in "ROOT in chroot": + copy_to_chroot ${clst_chroot_path}/etc/make.conf /${clst_root_path}/etc + copy_to_chroot ${clst_chroot_path}/etc/make.profile /${clst_root_path}/etc + + # enter chroot, execute our build script + exec_in_chroot ${clst_sharedir}/targets/${clst_target}/${clst_target}-chroot.sh || exit 1 + ;; + + preclean) + exec_in_chroot ${clst_sharedir}/targets/${clst_target}/${clst_target}-preclean-chroot.sh /tmp/stage1root || exit 1 + + ;; + + clean) + # clean out man, info and doc files + rm -rf usr/share/{man,doc,info}/* + # zap all .pyc and .pyo files + find -iname "*.py[co]" -exec rm -f {} \; + # cleanup all .a files except libgcc.a, *_nonshared.a and /usr/lib/portage/bin/*.a + find -iname "*.a" | grep -v 'libgcc.a' | grep -v 'nonshared.a' | grep -v '/usr/lib/portage/bin/' | grep -v 'libgcc_eh.a' | xargs rm -f + ;; + + *) + exit 1 + ;; + +esac +exit 0 + diff --git a/targets/stage1/stage1-preclean2-chroot.sh b/targets/stage1/stage1-preclean-chroot.sh similarity index 66% rename from targets/stage1/stage1-preclean2-chroot.sh rename to targets/stage1/stage1-preclean-chroot.sh index f763525b..081bf98d 100755 --- a/targets/stage1/stage1-preclean2-chroot.sh +++ b/targets/stage1/stage1-preclean-chroot.sh @@ -1,15 +1,17 @@ #!/bin/bash # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/stage1/Attic/stage1-preclean2-chroot.sh,v 1.10 2005/03/03 13:59:56 wolf31o2 Exp $ - +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/stage1/stage1-preclean-chroot.sh,v 1.1 2005/04/04 17:48:33 rocket Exp $ + +. /tmp/chroot-functions.sh + # now, some finishing touches to initialize gcc-config.... unset ROOT if [ -x /usr/bin/gcc-config ] then mythang=$( cd /etc/env.d/gcc; ls ${clst_CHOST}-* | head -n 1 ) - gcc-config ${mythang}; /usr/sbin/env-update; source /etc/profile + gcc-config ${mythang}; update_env_settings fi # stage1 is not going to have anything in zoneinfo, so save our Factory timezone @@ -21,4 +23,4 @@ else fi # this cleans out /var/db, but leaves behind files portage needs for removal -#find /var/db/pkg -type f | grep -v '\(COUNTER\|CONTENTS\|SLOT\|ebuild\)' | xargs rm -f +#find /var/db/pkg -type f | grep -v '\(COUNTER\|CONTENTS\|ebuild\)' | xargs rm -f diff --git a/targets/stage1/stage1.sh b/targets/stage1/stage1.sh deleted file mode 100755 index 53336de8..00000000 --- a/targets/stage1/stage1.sh +++ /dev/null @@ -1,72 +0,0 @@ -#!/bin/bash -# Copyright 1999-2004 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/stage1/Attic/stage1.sh,v 1.17 2005/01/05 20:18:05 wolf31o2 Exp $ - -case $1 in - enter) - ${clst_CHROOT} ${clst_chroot_path} /bin/bash - ;; - - run) - cp ${clst_sharedir}/targets/stage1/stage1-chroot.sh ${clst_chroot_path}/tmp - cp ${clst_sharedir}/targets/stage1/build.py ${clst_chroot_path}/tmp - - # set up "ROOT in chroot" dir - install -d ${clst_chroot_path}/tmp/stage1root/etc - - # set up make.conf and make.profile link in "ROOT in chroot": - cp ${clst_chroot_path}/etc/make.conf ${clst_chroot_path}/tmp/stage1root/etc - cp -a ${clst_chroot_path}/etc/make.profile ${clst_chroot_path}/tmp/stage1root/etc - - # enter chroot, execute our build script - ${clst_CHROOT} ${clst_chroot_path} /tmp/stage1-chroot.sh /tmp/stage1root || exit 1 - ;; - - preclean) - #preclean runs with bind mounts active -- for running any commands inside chroot - - #first we cleanup after ourselves - #cp ${clst_sharedir}/targets/stage1/stage1-preclean1-chroot.sh ${clst_chroot_path}/tmp - #${clst_CHROOT} ${clst_chroot_path} /tmp/stage1-preclean1-chroot.sh || exit 1 - #rm -f ${clst_chroot_path}/tmp/stage1-preclean1-chroot.sh - - #second we do the gcc magic - cp ${clst_sharedir}/targets/stage1/stage1-preclean2-chroot.sh ${clst_chroot_path}/tmp/stage1root/tmp - ${clst_CHROOT} ${clst_chroot_path}/tmp/stage1root /tmp/stage1-preclean2-chroot.sh || exit 1 - rm -f ${clst_chroot_path}/tmp/stage1root/tmp/stage1-preclean2-chroot.sh - ;; - - clean) - #clean runs after preclean with bind mounts unmounted - #keepers="virtual/os-headers sys-devel/binutils sys-devel/gcc sys-apps/baselayout virtual/libc virtual/kernel" - # set everything to uid 999 (nouser) - #cd ${clst_chroot_path}/tmp/stage1root - #install -d var/db/pkg2 - - #for x in $keepers - #do - # category=${x%%/*} - # package=${x##*/} - # [ "`ls var/db/pkg/${x}* 2>/dev/null`" = "" ] && continue - # install -d var/db/pkg2/${category} - # mv var/db/pkg/${category}/${package}* var/db/pkg2/${category} - #done - #rm -rf var/db/pkg - #mv var/db/pkg2 var/db/pkg - - # clean out man, info and doc files - rm -rf usr/share/{man,doc,info}/* - # zap all .pyc and .pyo files - find -iname "*.py[co]" -exec rm -f {} \; - # cleanup all .a files except libgcc.a, *_nonshared.a and /usr/lib/portage/bin/*.a - find -iname "*.a" | grep -v 'libgcc.a' | grep -v 'nonshared.a' | grep -v '/usr/lib/portage/bin/' | grep -v 'libgcc_eh.a' | xargs rm -f - ;; - -*) - exit 1 - ;; - -esac -exit 0 - diff --git a/targets/stage2/stage2-chroot.sh b/targets/stage2/stage2-chroot.sh index 866348e9..32a443ac 100755 --- a/targets/stage2/stage2-chroot.sh +++ b/targets/stage2/stage2-chroot.sh @@ -1,42 +1,19 @@ #!/bin/sh # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/stage2/stage2-chroot.sh,v 1.10 2005/01/11 14:10:19 wolf31o2 Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/stage2/stage2-chroot.sh,v 1.11 2005/04/04 17:48:33 rocket Exp $ -/usr/sbin/env-update -source /etc/profile +. /tmp/chroot-functions.sh -[ -f /tmp/envscript ] && source /tmp/envscript +update_env_settings -if [ -n "${clst_CCACHE}" ] -then - export clst_myfeatures="${clst_myfeatures} ccache" - emerge -b -k --oneshot --nodeps ccache || exit 1 -fi - -if [ -n "${clst_DISTCC}" ] -then - export clst_myfeatures="${clst_myfeatures} distcc" - export DISTCC_HOSTS="${clst_distcc_hosts}" - - USE="-gnome -gtk" emerge -b -k --oneshot --nodeps distcc || exit 1 -fi - -if [ -n "${clst_PKGCACHE}" ] -then - export bootstrap_opts="-r" -fi - -if [ -n "${clst_FETCH}" ] -then - export bootstrap_opts="-f" -fi - -GRP_STAGE23_USE="$(portageq envvar GRP_STAGE23_USE)" +setup_myfeatures +setup_myemergeopts ## setup the environment export FEATURES="${clst_myfeatures}" +GRP_STAGE23_USE="$(portageq envvar GRP_STAGE23_USE)" ## START BUILD /usr/portage/scripts/bootstrap.sh ${bootstrap_opts} || exit 1 diff --git a/targets/stage2/stage2-controller.sh b/targets/stage2/stage2-controller.sh new file mode 100755 index 00000000..248e3ba2 --- /dev/null +++ b/targets/stage2/stage2-controller.sh @@ -0,0 +1,35 @@ +#!/bin/bash +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/stage2/stage2-controller.sh,v 1.1 2005/04/04 17:48:33 rocket Exp $ +. ${clst_sharedir}/targets/support/functions.sh + + +# Only put commands in this section that you want every target to execute. +# This is a global default file and will affect every target +case $1 in + enter) + ${clst_CHROOT} ${clst_chroot_path} + ;; + + run) + shift + export clst_packages="$*" + exec_in_chroot ${clst_sharedir}/targets/${clst_target}/${clst_target}-chroot.sh + ;; + + preclean) + exec_in_chroot ${clst_sharedir}/targets/${clst_target}/${clst_target}-preclean-chroot.sh ${clst_root_path} + ;; + + clean) + exit 0 + ;; + + *) + exit 1 + ;; + +esac + +exit 0 diff --git a/targets/stage2/stage2-preclean-chroot.sh b/targets/stage2/stage2-preclean-chroot.sh index 4d33ea18..e06e625e 100755 --- a/targets/stage2/stage2-preclean-chroot.sh +++ b/targets/stage2/stage2-preclean-chroot.sh @@ -1,10 +1,10 @@ #!/bin/bash # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/stage2/stage2-preclean-chroot.sh,v 1.4 2004/10/15 02:46:58 zhen Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/stage2/stage2-preclean-chroot.sh,v 1.5 2005/04/04 17:48:33 rocket Exp $ -/usr/sbin/env-update -source /etc/profile +. /tmp/chroot-functions.sh +update_env_settings export CONFIG_PROTECT="-*" diff --git a/targets/stage2/stage2.sh b/targets/stage2/stage2.sh deleted file mode 100755 index af60de67..00000000 --- a/targets/stage2/stage2.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash -# Copyright 1999-2004 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/stage2/Attic/stage2.sh,v 1.16 2004/10/15 02:46:58 zhen Exp $ - -case $1 in - enter) - ${clst_CHROOT} ${clst_chroot_path} - ;; - - run) - cp ${clst_sharedir}/targets/stage2/stage2-chroot.sh ${clst_chroot_path}/tmp - ${clst_CHROOT} ${clst_chroot_path} /tmp/stage2-chroot.sh || exit 1 - rm -f ${clst_chroot_path}/tmp/stage2-chroot.sh - ;; - - preclean) - cp ${clst_sharedir}/targets/stage2/stage2-preclean-chroot.sh ${clst_chroot_path}/tmp - ${clst_CHROOT} ${clst_chroot_path} /tmp/stage2-preclean-chroot.sh || exit 1 - rm -f ${clst_chroot_path}/tmp/stage2-preclean-chroot.sh - ;; - - clean) - exit 0 - ;; - - *) - exit 1 - ;; - -esac -exit 0 diff --git a/targets/stage3/stage3-chroot.sh b/targets/stage3/stage3-chroot.sh index 2d3eb3ee..585e83e5 100755 --- a/targets/stage3/stage3-chroot.sh +++ b/targets/stage3/stage3-chroot.sh @@ -1,68 +1,28 @@ #!/bin/bash # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/stage3/stage3-chroot.sh,v 1.17 2005/01/28 18:37:23 wolf31o2 Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/stage3/stage3-chroot.sh,v 1.18 2005/04/04 17:48:33 rocket Exp $ -portage_version=`/usr/lib/portage/bin/portageq best_version / sys-apps/portage \ - | cut -d/ -f2 | cut -d- -f2,3` -if [ `echo ${portage_version} | cut -d- -f1 | cut -d. -f3` -lt 51 ] -then - echo "ERROR: Your portage version is too low in your seed stage. Portage version" - echo "2.0.51 or greater is required." - exit 1 -fi +. /tmp/chroot-functions.sh +check_portage_version -/usr/sbin/env-update -source /etc/profile +update_env_settings -[ -f /tmp/envscript ] && source /tmp/envscript +setup_myfeatures +setup_myemergeopts -if [ -n "${clst_CCACHE}" ] -then - export clst_myfeatures="${clst_myfeatures} ccache" - emerge --oneshot --nodeps -b -k ccache || exit 1 -fi - -if [ -n "${clst_DISTCC}" ] -then - export clst_myfeatures="${clst_myfeatures} distcc" - export DISTCC_HOSTS="${clst_distcc_hosts}" - - USE="-gnome -gtk" emerge --oneshot --nodeps -b -k distcc || exit 1 -fi - -if [ -n "${clst_PKGCACHE}" ] -then - export clst_myemergeopts="${clst_myemergeopts} --usepkg --buildpkg --newuse" -fi - -if [ -n "${clst_FETCH}" ] -then - export clst_myemergeopts="${clst_myemergeopts} -f" -fi - -GRP_STAGE23_USE="$(portageq envvar GRP_STAGE23_USE)" # setup the build environment export FEATURES="${clst_myfeatures}" export USE="-* ${clst_HOSTUSE} ${GRP_STAGE23_USE}" export CONFIG_PROTECT="-*" +export GRP_STAGE23_USE="$(portageq envvar GRP_STAGE23_USE)" + ## START BUILD # portage needs to be merged manually with USE="build" set to avoid frying our # make.conf. emerge system could merge it otherwise. -USE="build" emerge portage -if [ -n "${clst_VERBOSE}" ] -then - emerge -e ${clst_myemergeopts} -vp system || exit 1 - echo "Press any key within 15 seconds to pause the build..." - read -s -t 15 -n 1 - if [ $? -eq 0 ] - then - echo "Press any key to continue..." - read -s -n 1 - fi -fi +setup_portage -emerge -e ${clst_myemergeopts} system || exit 1 +run_emerge "-e system" diff --git a/targets/stage3/stage3-controller.sh b/targets/stage3/stage3-controller.sh new file mode 100755 index 00000000..1eb25548 --- /dev/null +++ b/targets/stage3/stage3-controller.sh @@ -0,0 +1,35 @@ +#!/bin/bash +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/stage3/stage3-controller.sh,v 1.1 2005/04/04 17:48:33 rocket Exp $ +. ${clst_sharedir}/targets/support/functions.sh + + +# Only put commands in this section that you want every target to execute. +# This is a global default file and will affect every target +case $1 in + enter) + ${clst_CHROOT} ${clst_chroot_path} + ;; + + run) + shift + export clst_packages="$*" + exec_in_chroot ${clst_sharedir}/targets/${clst_target}/${clst_target}-chroot.sh + ;; + + preclean) + exec_in_chroot ${clst_sharedir}/targets/${clst_target}/${clst_target}-preclean-chroot.sh ${clst_root_path} + ;; + + clean) + exit 0 + ;; + + *) + exit 1 + ;; + +esac + +exit 0 diff --git a/targets/stage3/stage3-preclean-chroot.sh b/targets/stage3/stage3-preclean-chroot.sh index 116c7fa3..63b962ae 100755 --- a/targets/stage3/stage3-preclean-chroot.sh +++ b/targets/stage3/stage3-preclean-chroot.sh @@ -1,10 +1,10 @@ #!/bin/bash # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/stage3/stage3-preclean-chroot.sh,v 1.4 2004/10/15 02:46:58 zhen Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/stage3/stage3-preclean-chroot.sh,v 1.5 2005/04/04 17:48:33 rocket Exp $ -/usr/sbin/env-update -source /etc/profile +. /tmp/chroot-functions.sh +update_env_settings export CONFIG_PROTECT="-*" diff --git a/targets/stage3/stage3.sh b/targets/stage3/stage3.sh deleted file mode 100755 index 69828824..00000000 --- a/targets/stage3/stage3.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash -# Copyright 1999-2004 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/stage3/Attic/stage3.sh,v 1.16 2004/10/15 02:46:58 zhen Exp $ - -case $1 in - enter) - ${clst_CHROOT} ${clst_chroot_path} - ;; - - run) - cp ${clst_sharedir}/targets/stage3/stage3-chroot.sh ${clst_chroot_path}/tmp - ${clst_CHROOT} ${clst_chroot_path} /tmp/stage3-chroot.sh || exit 1 - rm -f ${clst_chroot_path}/tmp/stage3-chroot.sh - ;; - - preclean) - cp ${clst_sharedir}/targets/stage3/stage3-preclean-chroot.sh ${clst_chroot_path}/tmp - ${clst_CHROOT} ${clst_chroot_path} /tmp/stage3-preclean-chroot.sh || exit 1 - rm -rf ${clst_chroot_path}/tmp/stage3-preclean-chroot.sh - ;; - - clean) - exit 0 - ;; - - *) - exit 1 - ;; - -esac -exit 0 diff --git a/targets/stage4/stage4-chroot.sh b/targets/stage4/stage4-chroot.sh new file mode 100755 index 00000000..07e81afc --- /dev/null +++ b/targets/stage4/stage4-chroot.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +. /tmp/chroot-functions.sh + +check_portage_version +update_env_settings + +setup_myfeatures +setup_myemergeopts + +## setup the environment +export FEATURES="${clst_myfeatures}" +export CONFIG_PROTECT="-*" + +## START BUILD +setup_portage +#turn off auto-use: +export USE_ORDER="env:pkg:conf:defaults" + +run_emerge "${clst_packages}" diff --git a/targets/stage4/stage4-controller.sh b/targets/stage4/stage4-controller.sh new file mode 100755 index 00000000..1d5730db --- /dev/null +++ b/targets/stage4/stage4-controller.sh @@ -0,0 +1,35 @@ +#!/bin/bash +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/stage4/stage4-controller.sh,v 1.1 2005/04/04 17:48:33 rocket Exp $ +. ${clst_sharedir}/targets/support/functions.sh + + +# Only put commands in this section that you want every target to execute. +# This is a global default file and will affect every target +case $1 in + enter) + ${clst_CHROOT} ${clst_chroot_path} + ;; + + build_packages) + shift + export clst_packages="$*" + exec_in_chroot ${clst_sharedir}/targets/${clst_target}/${clst_target}-chroot.sh + ;; + + preclean) + exec_in_chroot ${clst_sharedir}/targets/${clst_target}/${clst_target}-preclean-chroot.sh ${clst_root_path} + ;; + + clean) + exit 0 + ;; + + *) + exit 1 + ;; + +esac + +exit 0 diff --git a/targets/stage4/stage4-preclean-chroot.sh b/targets/stage4/stage4-preclean-chroot.sh new file mode 100755 index 00000000..c1f0a6c1 --- /dev/null +++ b/targets/stage4/stage4-preclean-chroot.sh @@ -0,0 +1,6 @@ +#!/bin/bash +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +. /tmp/chroot-functions.sh +#update_env_settings diff --git a/targets/support/chroot-functions.sh b/targets/support/chroot-functions.sh new file mode 100755 index 00000000..b6ab09b2 --- /dev/null +++ b/targets/support/chroot-functions.sh @@ -0,0 +1,201 @@ +check_portage_version(){ + portage_version=`/usr/lib/portage/bin/portageq best_version / sys-apps/portage \ + | cut -d/ -f2 | cut -d- -f2,3` + if [ -n ${portage_version} -a `echo ${portage_version} | cut -d- -f1 | cut -d. -f3` -lt '51' ] + then + echo "ERROR: Your portage version is too low in your seed stage. Portage version" + echo "2.0.51 or greater is required." + exit 1 + fi +} + +#check_genkernel_version(){ +# genkernel_version=`/usr/lib/portage/bin/portageq best_version / sys-kernel/genkernel \ +# | cut -d/ -f2 | cut -d- -f2,3` +# if [ -n ${genkernel_version} -a `echo ${genkernel_version} | cut -d- -f1 | cut -d. -f3` -lt '3' ] +# then +# echo "ERROR: Your genkernel version is too low in your seed stage. genkernel version" +# echo "XXXXXXXXXXXXXXX or greater is required." +# exit 1 +# fi +#} + +setup_myfeatures(){ + + if [ -n "${clst_CCACHE}" ] + then + export clst_myfeatures="${clst_myfeatures} ccache" + if [ "${clst_AUTORESUME}" = "1" -a -e /tmp/.clst_ccache ] + then + echo "CCACHE Autoresume point found not emerging ccache" + else + emerge --oneshot --nodeps -b -k ccache && touch /tmp/.clst_ccache || exit 1 + touch /tmp/.clst_ccache + fi + fi + + if [ -n "${clst_DISTCC}" ] + then + export clst_myfeatures="${clst_myfeatures} distcc" + export DISTCC_HOSTS="${clst_distcc_hosts}" + if [ "${clst_AUTORESUME}" = "1" -a -e /tmp/.clst_distcc ] + then + echo "DISTCC Autoresume point found not emerging distcc" + else + USE="-gtk -gnome" emerge --oneshot --nodeps -b -k distcc && touch /tmp/.clst_distcc || exit 1 + fi + fi +} + +setup_myemergeopts(){ + if [ -n "${clst_PKGCACHE}" ] + then + export clst_myemergeopts="--usepkg --buildpkg --newuse" + export bootstrap_opts="-r" + fi + + if [ -n "${clst_FETCH}" ] + then + export clst_myemergeopts="${clst_myemergeopts} -f" + export bootstrap_opts="-f" + fi +} + + +setup_portage(){ + # portage needs to be merged manually with USE="build" set to avoid frying our + # make.conf. emerge system could merge it otherwise. + + if [ "${clst_AUTORESUME}" = "1" -a -e /tmp/.clst_portage ] + then + echo "Portage Autoresume point found not emerging portage" + else + USE="build" emerge portage && touch /tmp/.clst_portage || exit 1 + fi +} + +setup_gcc(){ + if [ -x /usr/bin/gcc-config ] + then + gcc_current=`gcc-config -c` + gcc-config 3 && source /etc/profile + gcc-config ${gcc_current} && source /etc/profile + fi +} + +update_env_settings(){ + /usr/sbin/env-update + source /etc/profile + [ -f /tmp/envscript ] && source /tmp/envscript +} + +die() { + echo "$1" + exit 1 +} + +make_destpath() { + if [ "${1}" = "" ] + then + export ROOT=/ + else + export ROOT=${1} + if [ ! -d ${ROOT} ] + then + install -d ${ROOT} + fi + fi + echo "ROOT=${ROOT} emerge ...." +} + +run_emerge() { + + # Sets up the ROOT= parameter + # with no options ROOT=/ + make_destpath ${clst_root_path} + + if [ -n "${clst_VERBOSE}" ] + then + emerge ${clst_myemergeopts} -vpt $@ || exit 3 + echo "Press any key within 15 seconds to pause the build..." + read -s -t 15 -n 1 + if [ $? -eq 0 ] + then + echo "Press any key to continue..." + read -s -n 1 + fi + fi + emerge ${clst_myemergeopts} $@ || exit 1 +} + +# Functions +# Copy libs of a executable in the chroot +function copy_libs() { + + # Check if it's a dynamix exec + + ldd ${1} > /dev/null 2>&1 || return + + for lib in `ldd ${1} | awk '{ print $3 }'` + do + echo ${lib} + if [ -e ${lib} ] + then + if [ ! -e ${clst_root_path}/${lib} ] + then + copy_file ${lib} + [ -e "${clst_root_path}/${lib}" ] && strip -R .comment -R .note ${clst_root_path}/${lib} || echo "WARNING : Cannot strip lib ${clst_root_path}/${lib} !" + fi + else + echo "WARNING : Some library was not found for ${lib} !" + fi + done + +} + +function copy_symlink() { + + STACK=${2} + [ "${STACK}" = "" ] && STACK=16 || STACK=$((${STACK} - 1 )) + + if [ ${STACK} -le 0 ] + then + echo "WARNING : ${TARGET} : too many levels of symbolic links !" + return + fi + + [ ! -e ${clst_root_path}/`dirname ${1}` ] && mkdir -p ${clst_root_path}/`dirname ${1}` + [ ! -e ${clst_root_path}/${1} ] && cp -vfdp ${1} ${clst_root_path}/${1} + + TARGET=`readlink -f ${1}` + if [ -h ${TARGET} ] + then + copy_symlink ${TARGET} ${STACK} + else + copy_file ${TARGET} + fi + } + +function copy_file() { + + f="${1}" + + if [ ! -e "${f}" ] + then + echo "WARNING : File not found : ${f}" + continue + fi + + [ ! -e ${clst_root_path}/`dirname ${f}` ] && mkdir -p ${clst_root_path}/`dirname ${f}` + [ ! -e ${clst_root_path}/${f} ] && cp -vfdp ${f} ${clst_root_path}/${f} + if [ -x ${f} -a ! -h ${f} ] + then + copy_libs ${f} + strip -R .comment -R .note ${clst_root_path}/${f} > /dev/null 2>&1 + elif [ -h ${f} ] + then + copy_symlink ${f} + fi +} + + diff --git a/targets/support/filesystem-functions.sh b/targets/support/filesystem-functions.sh new file mode 100755 index 00000000..2236bc11 --- /dev/null +++ b/targets/support/filesystem-functions.sh @@ -0,0 +1,63 @@ +# Dont forget to update functions.sh check_looptype + + +create_normal_loop() { + export source_path="${clst_chroot_path}" + export destination_path="${clst_target_path}" + export loopname="livecd.loop" + + #We get genkernel-built kernels and initrds in place, create the loopback fs on + #$clst_target_path, mount it, copy our bootable filesystem over, umount it, and + #we then have a ready-to-burn ISO tree at $clst_target_path. + + echo "Calculating size of loopback filesystem..." + loopsize=`du -ks ${source_path} | cut -f1` + [ "${loopsize}" = "0" ] && loopsize=1 + # Add 4MB for filesystem slop + loopsize=`expr ${loopsize} + 4096` + echo "Creating loopback file..." + dd if=/dev/zero of=${destination_path}/${loopname} bs=1k count=${loopsize} || die "${loopname} creation failure" + mke2fs -m 0 -F -q ${destination_path}/${loopname} || die "Couldn't create ext2 filesystem" + install -d ${destination_path}/loopmount + sync; sync; sleep 3 #try to work around 2.6.0+ loopback bug + mount -t ext2 -o loop ${destination_path}/${loopname} ${destination_path}/loopmount || die "Couldn't mount loopback ext2 filesystem" + sync; sync; sleep 3 #try to work around 2.6.0+ loopback bug + echo "cp -a ${source_path}/* ${destination_path}/loopmount" + cp -a ${source_path}/* ${destination_path}/loopmount + [ $? -ne 0 ] && { umount ${destination_path}/${loopname}; die "Couldn't copy files to loopback ext2 filesystem"; } + umount ${destination_path}/loopmount || die "Couldn't unmount loopback ext2 filesystem" + rm -rf ${destination_path}/loopmount + #now, $clst_target_path should contain a proper bootable image for our iso, including + #boot loader and loopback filesystem. +} + + + +create_zisofs() { + rm -rf "${clst_target_path}/zisofs" > /dev/null 2>&1 + echo "Creating zisofs..." + mkzftree -z 9 -p2 "${clst_chroot_path}" "${clst_target_path}/zisofs" || die "Could not run mkzftree, did you emerge zisofs" + +} + +create_noloop() { + echo "Copying files for image (no loop)..." + cp -a "${clst_chroot_path}"/* "${clst_target_path}" || die "Could not copy files to image (no loop)" + +} + +create_gcloop() { + echo "Creating gcloop..." + create_normal_loop + compress_gcloop_ucl -b 131072 -c 10 "${clst_target_path}/livecd.loop" "${clst_target_path}/livecd.gcloop" || die "compress_gcloop_ucl failed, did you emerge gcloop?" + rm -f "${clst_target_path}/livecd.loop" + # only a gcloop image should exist in target path + +} + +create_squashfs() { + echo "Creating squashfs..." + mksquashfs "${clst_chroot_path}" "${clst_target_path}/livecd.squashfs" -noappend || die "mksquashfs failed, did you emerge squashfs-tools?" + +} + diff --git a/targets/support/functions.sh b/targets/support/functions.sh new file mode 100755 index 00000000..6a3201ae --- /dev/null +++ b/targets/support/functions.sh @@ -0,0 +1,147 @@ +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +copy_to_chroot(){ + local file_name=$(basename ${1}) + if [ "${2}" != "" ] + then + echo "copying ${file_name} to ${clst_chroot_path}/${2}" + cp -a ${1} ${clst_chroot_path}/${2} + else + echo "copying ${file_name} to ${clst_chroot_path}/tmp" + cp -a ${1} ${clst_chroot_path}/tmp + fi +} + +delete_from_chroot(){ + echo "removing ${clst_chroot_path}/${1} from the chroot" + rm -f ${clst_chroot_path}/${1} +} + +exec_in_chroot(){ +# Takes the full path to the source file as its argument +# copies the file to the /tmp directory of the chroot +# and executes it. + + local file_name=$(basename ${1}) + cp -a ${1} ${clst_chroot_path}/tmp + chmod 755 ${clst_chroot_path}/tmp/${file_name} + + if [ "${2}" != "" ] + then + chroot_path=${clst_chroot_path}/${2} + else + chroot_path=${clst_chroot_path} + fi + + mkdir -p ${chroot_path}/tmp + cp -a ${1} ${chroot_path}/tmp/${file_name} + chmod 755 ${chroot_path}/tmp/${file_name} + copy_to_chroot ${clst_sharedir}/targets/support/chroot-functions.sh /${2}/tmp + echo "Running ${file_name} in chroot ${chroot_path}" + ${clst_CHROOT} ${chroot_path} /tmp/${file_name} || exit 1 + + rm -f ${chroot_path}/tmp/${file_name} + delete_from_chroot /${2}/tmp/chroot-functions.sh + +} + +#return codes +die() { + echo "$1" + exit 1 +} + +extract_cdtar() { + # Create a filesystem tree for the ISO at + # $clst_target_path. We extract the "cdtar" to this directory, + # which will normally contains a pre-built binary + # boot-loader/filesystem skeleton for the ISO. + + cdtar=${clst_livecd_cdtar} + [ -z "${cdtar}" ] && die "Required key livecd/cdtar not defined, exiting" + tar xjpf ${cdtar} -C ${clst_target_path} || die "Couldn't extract cdtar ${cdtar}" +} + +extract_kernels() { + #$1 = Destination + #${clst_target_path}/kernel is often a good choice for ${1} + + # Takes the relative desination dir for the kernel as an arguement + # i.e boot or isolinux + [ -z "$clst_boot_kernel" ] && die "Required key boot/kernel not defined, exiting" + # install the kernels built in kmerge.sh + for x in ${clst_boot_kernel} + do + + first=${first:-""} + kbinary="${clst_chroot_path}/usr/portage/packages/gk_binaries/${x}-kernel-initrd-${clst_version_stamp}.tar.bz2" + if [ -z "${first}" ] + then + # grab name of first kernel + export first="${x}" + fi + + [ ! -e "${kbinary}" ] && die "Can't find kernel tarball at ${kbinary}" + mkdir -p ${1}/ + tar xjf ${kbinary} -C ${1}/ + + + + # change config name from "config-*" to "gentoo", for example + #mv ${1}/config-* ${1}/${x}-config + rm ${1}/config-* + + # change kernel name from "kernel" to "gentoo", for example + mv ${1}/kernel-* ${1}/${x} + + # change initrd name from "initrd" to "gentoo.igz", for example + if [ -e ${1}/initrd-* ] + then + mv ${1}/initrd-* ${1}/${x}.igz + fi + + if [ -e ${1}/initramfs-* ] + then + mv ${1}/initramfs-* ${1}/${x}.igz + fi + done +} + +extract_modules() { + #$1 = Destination + #$2 = kname + kbinary="${clst_chroot_path}/usr/portage/packages/gk_binaries/${2}-modules-${clst_version_stamp}.tar.bz2" + + [ ! -e "${kbinary}" ] && die "Can't find kernel tarball at ${kbinary}" + mkdir -p ${1}/ + tar xjf ${kbinary} -C ${1}/ lib +} + +check_dev_manager(){ + # figure out what device manager we are using and handle it accordingly + if [ "${clst_livecd_devmanager}" == "udev" ] + then + cmdline_opts="${cmdline_opts} udev nodevfs" + else + cmdline_opts="${cmdline_opts} noudev devfs" + fi +} + +check_filesystem_type(){ + case ${clst_livecd_cdfstype} in + normal) + cmdline_opts="${cmdline_opts} looptype=normal loop=/livecd.loop" + ;; + zisofs) + cmdline_opts="${cmdline_opts} looptype=zisofs loop=/zisofs" + ;; + noloop) + ;; + gcloop) + cmdline_opts="${cmdline_opts} looptype=gcloop loop=/livecd.gcloop" + ;; + squashfs) + cmdline_opts="${cmdline_opts} looptype=squashfs loop=/livecd.squashfs" + ;; + esac +} diff --git a/targets/support/gamecdfs-update.sh b/targets/support/gamecdfs-update.sh new file mode 100755 index 00000000..b456f86d --- /dev/null +++ b/targets/support/gamecdfs-update.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +# we grab our configuration +source "${clst_gamecd_conf}" || exit 1 + +# here we replace out game information into several files +sed -i -e "s:livecd:gamecd:" /etc/hosts +sed -i -e "s:##GAME_NAME:${GAME_NAME}:" /etc/motd + +# here we setup our xinitrc +echo "exec ${GAME_EXECUTABLE}" > /etc/X11/xinit/xinitrc + +# we add spind to default here since we don't want the CD to spin down +rc-update add spind default diff --git a/targets/support/kmerge.sh b/targets/support/kmerge.sh new file mode 100755 index 00000000..07feef0c --- /dev/null +++ b/targets/support/kmerge.sh @@ -0,0 +1,237 @@ +#!/bin/bash +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +source /tmp/chroot-functions.sh + +PKGDIR=/usr/portage/packages/gk_binaries/${clst_kname}/ebuilds + +setup_gk_args() { + # default genkernel args + GK_ARGS="${clst_livecd_gk_mainargs} \ + ${clst_kernel_gk_kernargs} \ + --no-mountboot \ + --no-install \ + --kerneldir=/usr/src/linux \ + --kernel-config=/var/tmp/${clst_kname}.config \ + --modulespackage=/usr/portage/packages/gk_binaries/${clst_kname}-modules-${clst_version_stamp}.tar.bz2 \ + --minkernpackage=/usr/portage/packages/gk_binaries/${clst_kname}-kernel-initrd-${clst_version_stamp}.tar.bz2 \ + --kerncache=/usr/portage/packages/gk_binaries/${clst_kname}-kerncache-${clst_version_stamp}.tar.bz2 all" + # extra genkernel options that we have to test for + if [ "${clst_livecd_splash_type}" == "bootsplash" -a -n "${clst_livecd_splash_theme}" ] + then + GK_ARGS="${GK_ARGS} --bootsplash=${clst_livecd_splash_theme}" + fi + + if [ "${clst_livecd_splash_type}" == "gensplash" -a -n "${clst_livecd_splash_theme}" ] + then + GK_ARGS="${GK_ARGS} --gensplash=${clst_livecd_splash_theme}" + fi + + if [ -n "${clst_CCACHE}" ] + then + GK_ARGS="${GK_ARGS} --kernel-cc=/usr/lib/ccache/bin/gcc --utils-cc=/usr/lib/ccache/bin/gcc" + fi + + if [ "${clst_livecd_devmanager}" == "udev" ] + then + GK_ARGS="${GK_ARGS} --udev" + else + GK_ARGS="${GK_ARGS} --no-udev" + fi +} + +genkernel_compile(){ + + setup_gk_args + + eval "clst_kernel_postconf=\$clst_boot_kernel_${clst_kname}_postconf" + eval "clst_kernel_merge=\$clst_boot_kernel_${clst_kname}_packages" + export clst_kernel_postconf + export clst_kernel_merge + # build with genkernel using the set options + # callback and postconf are put here to avoid escaping issues + if [ -n "${clst_KERNCACHE}" ] + then + if [ "$clst_kernel_postconf" != "" \ + -a "$clst_kernel_merge" != "" ] + then + genkernel --callback="PKGDIR=${PKGDIR} emerge -kb ${clst_kernel_merge}" \ + --postconf="PKGDIR=${PKGDIR} emerge -kb ${clst_kernel_postconf}" \ + ${GK_ARGS} || exit 1 + elif [ "$clst_kernel_merge" != "" ] + then + genkernel --callback="PKGDIR=${PKGDIR} emerge -kb ${clst_kernel_merge}" \ + ${GK_ARGS} || exit 1 + elif [ "$clst_kernel_postconf" != "" ] + then + genkernel --postconf="PKGDIR=${PKGDIR} emerge -kb ${clst_kernel_postconf}" \ + ${GK_ARGS} || exit 1 + else + echo "genkernel" + genkernel ${GK_ARGS} || exit 1 + fi + else + if [ "$clst_kernel_postconf" != "" \ + -a "$clst_kernel_merge" != "" ] + then + genkernel --callback="emerge ${clst_kernel_merge}" \ + --postconf="emerge ${clst_kernel_postconf}" \ + ${GK_ARGS} || exit 1 + elif [ "$clst_kernel_merge" != "" ] + then + genkernel --callback="emerge ${clst_kernel_merge}" \ + ${GK_ARGS} || exit 1 + elif [ "$clst_kernel_postconf" != "" ] + then + genkernel --postconf="emerge ${clst_kernel_postconf}" \ + ${GK_ARGS} || exit 1 + else + echo "genkernel" + genkernel ${GK_ARGS} || exit 1 + fi + fi + md5sum /var/tmp/${clst_kname}.config|awk '{print $1}' > /usr/portage/packages/gk_binaries/${clst_kname}/${clst_kname}-${clst_version_stamp}.CONFIG +} + +build_kernel() { + genkernel_compile +} + + + +# Script to build each kernel, kernel-related packages +/usr/sbin/env-update +source /etc/profile + +setup_myfeatures +setup_myemergeopts + +[ -n "${clst_ENVSCRIPT}" ] && source /tmp/envscript +export CONFIG_PROTECT="-*" + +#set the timezone for the kernel build +rm /etc/localtime +ln -s /usr/share/zoneinfo/UTC /etc/localtime + +eval "clst_kernel_use=\$clst_boot_kernel_${clst_kname}_use" +export USE=$clst_kernel_use + +eval "clst_kernel_gk_kernargs=\$clst_boot_kernel_${clst_kname}_gk_kernargs" +eval "clst_ksource=\$clst_boot_kernel_${clst_kname}_sources" + + + +# Don't use pkgcache here, as the kernel source may get emerge with different USE variables +# (and thus different patches enabled/disabled.) Also, there's no real benefit in using the +# pkgcache for kernel source ebuilds. + +USE_MATCH=0 +if [ -e /usr/portage/packages/gk_binaries/${clst_kname}/${clst_kname}-${clst_version_stamp}.USE ] +then + + STR1=$(for i in `cat /usr/portage/packages/gk_binaries/${clst_kname}/${clst_kname}-${clst_version_stamp}.USE`; do echo $i; done|sort) + STR2=$(for i in ${clst_kernel_use}; do echo $i; done|sort) + if [ "${STR1}" = "${STR2}" ] + then + #echo "USE Flags match" + USE_MATCH=1 + else + if [ -n "${clst_KERNCACHE}" ] + then + [ -d /usr/portage/packages/gk_binaries/${clst_kname}/ebuilds ] && \ + rm -r /usr/portage/packages/gk_binaries/${clst_kname}/ebuilds + [ -e /usr/portage/packages/gk_binaries/${clst_kname}/usr/src/linux/.config ] && \ + rm /usr/portage/packages/gk_binaries/${clst_kname}/usr/src/linux/.config + fi + fi +fi + +EXTRAVERSION_MATCH=0 +if [ -e /usr/portage/packages/gk_binaries/${clst_kname}/${clst_kname}-${clst_version_stamp}.EXTRAVERSION ] +then + STR1=`cat /usr/portage/packages/gk_binaries/${clst_kname}/${clst_kname}-${clst_version_stamp}.EXTRAVERSION` + STR2=${clst_kextraversion} + if [ "${STR1}" = "${STR2}" ] + then + if [ -n "${clst_KERNCACHE}" ] + then + #echo "EXTRAVERSION match" + EXTRAVERSION_MATCH=1 + fi + + fi +fi + +CONFIG_MATCH=0 +if [ -e /usr/portage/packages/gk_binaries/${clst_kname}/${clst_kname}-${clst_version_stamp}.CONFIG ] +then + STR1=`cat /usr/portage/packages/gk_binaries/${clst_kname}/${clst_kname}-${clst_version_stamp}.CONFIG` + STR2=`md5sum /var/tmp/${clst_kname}.config|awk '{print $1}'` + if [ "${STR1}" = "${STR2}" ] + then + if [ -n "${clst_KERNCACHE}" ] + then + echo "CONFIG match" + CONFIG_MATCH=1 + fi + + fi +fi + +if [ "${USE_MATCH}" = "0" -o "${EXTRAVERSION_MATCH}" = "0" -o "${CONFIG_MATCH}" = "0" ] +then + echo "Cleaning up ${clst_kname} kernel install ..." + echo "This may take some time ..." + if [ -d /usr/portage/packages/gk_binaries/${clst_kname}/ ] + then + rm -r /usr/portage/packages/gk_binaries/${clst_kname}/ || exit 1 + fi +fi + +mkdir -p /usr/portage/packages/gk_binaries/${clst_kname} + +if [ -n "${clst_KERNCACHE}" ] +then + ROOT=/usr/portage/packages/gk_binaries/${clst_kname} PKGDIR=${PKGDIR} USE="${USE} symlink build" emerge -ukb "${clst_ksource}" || exit 1 + KERNELVERSION=`/usr/lib/portage/bin/portageq best_visible / "${clst_ksource}"` + if [ ! -e /etc/portage/profile/package.provided ] + then + mkdir -p /etc/portage/profile + echo "${KERNELVERSION}" > /etc/portage/profile/package.provided + else + if ( ! grep -q "^${KERNELVERSION}" /etc/portage/profile/package.provided ) + then + echo "${KERNELVERSION}" >> /etc/portage/profile/package.provided + fi + fi + [ -d /usr/src/linux ] && rm /usr/src/linux + ln -s /usr/portage/packages/gk_binaries/${clst_kname}/usr/src/linux /usr/src/linux +else + USE="${USE} symlink build" emerge "${clst_ksource}" || exit 1 +fi + +#if catalyst has set NULL_VALUE, extraversion wasn't specified so we skip this part +if [ "${EXTRAVERSION_MATCH}" != "1" ] +then + if [ "${clst_kextraversion}" != "NULL_VALUE" ] + then + echo "Setting extraversion to ${clst_kextraversion}" + sed -i -e "s:EXTRAVERSION \(=.*\):EXTRAVERSION \1-${clst_kextraversion}:" /usr/src/linux/Makefile + fi + echo ${clst_kextraversion} > /usr/portage/packages/gk_binaries/${clst_kname}/${clst_kname}-${clst_version_stamp}.EXTRAVERSION +fi + + +build_kernel +# grep out the kernel version so that we can do our modules magic +VER=`grep ^VERSION\ \= /usr/src/linux/Makefile | awk '{ print $3 };'` +PAT=`grep ^PATCHLEVEL\ \= /usr/src/linux/Makefile | awk '{ print $3 };'` +SUB=`grep ^SUBLEVEL\ \= /usr/src/linux/Makefile | awk '{ print $3 };'` +EXV=`grep ^EXTRAVERSION\ \= /usr/src/linux/Makefile | sed -e "s/EXTRAVERSION =//" -e "s/ //g"` +clst_fudgeuname=${VER}.${PAT}.${SUB}${EXV} + +/sbin/modules-update --assume-kernel=${clst_fudgeuname} + +unset USE +echo ${clst_kernel_use} > /usr/portage/packages/gk_binaries/${clst_kname}/${clst_kname}-${clst_version_stamp}.USE diff --git a/targets/support/livecdfs-update.sh b/targets/support/livecdfs-update.sh new file mode 100755 index 00000000..f6621e86 --- /dev/null +++ b/targets/support/livecdfs-update.sh @@ -0,0 +1,211 @@ +#!/bin/bash +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/support/livecdfs-update.sh,v 1.1 2005/04/04 17:48:33 rocket Exp $ + +/usr/sbin/env-update +source /etc/profile + +# allow root logins to the livecd by default +if [ -e /etc/sshd/sshd_config ] +then + sed -i 's:^#PermitRootLogin\ yes:PermitRootLogin\ yes:' /etc/ssh/sshd_config +fi + +# turn off udev tarball +sed -i 's:RC_DEVICE_TARBALL="yes":RC_DEVICE_TARBALL="no":' /etc/conf.d/rc + +# turn bashlogin shells to actual login shells +sed -i 's:exec -l /bin/bash:exec -l /bin/bash -l:' /bin/bashlogin + +# default programs that we always want to start +rc-update del iptables default +rc-update del netmount default +rc-update add autoconfig default +rc-update del keymaps +rc-update del serial +rc-update del consolefont +rc-update add modules default +rc-update add pwgen default +[ -e /etc/init.d/bootsplash ] && rc-update add bootsplash default +[ -e /etc/init.d/splash ] && rc-update add splash default +[ -e /etc/init.d/sysklogd ] && rc-update add sysklogd default +[ -e /etc/init.d/metalog ] && rc-update add metalog default +[ -e /etc/init.d/syslog-ng ] && rc-update add syslog-ng default +[ -e /etc/init.d/alsasound ] && rc-update add alsasound default +[ -e /etc/init.d/hdparm ] && rc-update add hdparm default + +# Comment out current getty settings +sed -i -e '/^c[0-9]/ s/^/#/' /etc/inittab + +# Add our own getty settings +for x in 1 2 3 4 5 6 +do + echo "c${x}:12345:respawn:/sbin/agetty -nl /bin/bashlogin 38400 tty${x} linux" >> /etc/inittab +done + +# perform any rcadd then any rcdel +if [ -n "${clst_livecd_rcadd}" ] || [ -n "${clst_livecd_rcdel}" ] +then + if [ -n "${clst_livecd_rcadd}" ] + then + for x in ${clst_livecd_rcadd} + do + rc-update add "${x%%:*}" "${x##*:}" + done + fi + + if [ -n "${clst_livecd_rcdel}" ] + then + for x in ${clst_livecd_rcdel} + do + rc-update del "${x%%:*}" "${x##*:}" + done + fi +fi + +# clean up the time and set to GMT +rm -rf /etc/localtime +cp /usr/share/zoneinfo/GMT /etc/localtime + +# setup the hostname +echo "livecd" > /etc/hostname +echo "gentoo" > /etc/dnsdomainname +#sed -i 's:localhost:livecd.gentoo localhost:' /etc/hosts +echo "127.0.0.1 livecd.gentoo livecd localhost" > /etc/hosts + +# setup sudoers +sed -i '/NOPASSWD: ALL/ s/^# //' /etc/sudoers + +# setup dhcp on all detected ethernet devices +echo "iface_eth0=\"dhcp\""> /etc/conf.d/net +echo "iface_eth1=\"dhcp\"" >> /etc/conf.d/net +echo "iface_eth2=\"dhcp\"" >> /etc/conf.d/net +echo "iface_eth3=\"dhcp\"" >> /etc/conf.d/net +echo "iface_eth4=\"dhcp\"" >> /etc/conf.d/net + +# setup links for ethernet devices +cd /etc/init.d +ln -sf net.eth0 net.eth1 +ln -sf net.eth0 net.eth2 +ln -sf net.eth0 net.eth3 +ln -sf net.eth0 net.eth4 + +# add this for hwsetup/mkx86config +mkdir -p /etc/sysconfig + +# fstab tweaks +echo "tmpfs / tmpfs defaults 0 0" > /etc/fstab +echo "tmpfs /lib/firmware tmpfs defaults 0 0" >> /etc/fstab +# if /usr/lib/X11/xkb/compiled then make it tmpfs +if [ -d /usr/lib/X11/xkb/compiled ] +then + echo "tmpfs /usr/lib/X11/xkb/compiled tmpfs defaults 0 0" >> /etc/fstab +fi + +# devfs tweaks +sed -i '/dev-state/ s:^:#:' /etc/devfsd.conf + +# tweak the livecd fstab so that users know not to edit it +# http://bugs.gentoo.org/show_bug.cgi?id=60887 +mv /etc/fstab /etc/fstab.old +echo "####################################################" >> /etc/fstab +echo "## ATTENTION: THIS IS THE FSTAB ON THE LIVECD ##" >> /etc/fstab +echo "## PLEASE EDIT THE FSTAB at /mnt/gentoo/etc/fstab ##" >> /etc/fstab +echo "####################################################" >> /etc/fstab +cat /etc/fstab.old >> /etc/fstab +rm /etc/fstab.old + +# add some helpful aliases +echo "alias cp='cp -i'" >> /etc/profile +echo "alias mv='mv -i'" >> /etc/profile +echo "alias rm='rm -i'" >> /etc/profile +echo "alias ls='ls --color=auto'" >> /etc/profile +echo "alias grep='grep --color=auto'" >> /etc/profile + +# make sure we have the latest pci and hotplug ids +if [ -d /usr/share/hwdata ] +then + [ -f /usr/share/hwdata/pci.ids ] && rm -f /usr/share/hwdata/pci.ids + [ -f /usr/share/hwdata/usb.ids ] && rm -f /usr/share/hwdata/usb.ids + ln -s /usr/share/misc/pci.ids /usr/share/hwdata/pci.ids + ln -s /usr/share/misc/usb.ids /usr/share/hwdata/usb.ids +fi + +# setup opengl in /etc (if configured) +[ -x /usr/sbin/openglify ] && /usr/sbin/openglify + +# touch /etc/asound.state if alsa is configured +[ -d /proc/asound/card0 ] && touch /etc/asound.state + +# tweak the motd for gentoo releases +if [ "${clst_livecd_type}" = "gentoo-release-universal" ] +then + cat /etc/generic.motd.txt /etc/universal.motd.txt \ + /etc/minimal.motd.txt > /etc/motd + sed -i 's:^##GREETING:Welcome to the Gentoo Linux Universal Installation CD!:' /etc/motd +fi + +if [ "${clst_livecd_type}" = "gentoo-release-minimal" ] +then + cat /etc/generic.motd.txt /etc/minimal.motd.txt > /etc/motd + sed -i 's:^##GREETING:Welcome to the Gentoo Linux Minimal Installation CD!:' /etc/motd +fi + +if [ "${clst_livecd_type}" = "gentoo-release-environmental" ] +then + cat /etc/generic.motd.txt /etc/universal.motd.txt \ + /etc/minimal.motd.txt /etc/environmental.motd.txt > /etc/motd + sed -i 's:^##GREETING:Welcome to the Gentoo Linux LiveCD Environment!:' /etc/motd +fi + +if [ "${clst_livecd_type}" = "gentoo-gamecd" ] +then + cat /etc/generic.motd.txt /etc/gamecd.motd.txt > /etc/motd + sed -i 's:^##GREETING:Welcome to the Gentoo Linux ##GAME_NAME GameCD!:' /etc/motd +fi + +rm -f /etc/generic.motd.txt /etc/universal.motd.txt /etc/minimal.motd.txt /etc/environmental.motd.txt /etc/gamecd.motd.txt + +# setup splash/bootsplash (if called for) +if [ "${clst_livecd_splash_type}" == "bootsplash" -a -n "${clst_livecd_splash_theme}" ] +then + if [ -d /etc/bootsplash/${clst_livecd_splash_theme} ] + then + sed -i 's:BOOTSPLASH_THEME=\"gentoo\":BOOTSPLASH_THEME=\"${clst_livecd_splash_theme}\":' /etc/conf.d/bootsplash + rm /etc/bootsplash/default + ln -s "/etc/bootsplash/${clst_livecd_splash_theme}" /etc/bootsplash/default + else + echo "Error, cannot setup bootsplash theme ${clst_livecd_splash_theme}" + exit 1 + fi + +elif [ "${clst_livecd_splash_type}" == "gensplash" -a -n "${clst_livecd_splash_theme}" ] +then + if [ -d /etc/splash/${clst_livecd_splash_theme} ] + then + sed -i 's:# SPLASH_THEME="gentoo":SPLASH_THEME=\"${clst_livecd_splash_theme}\":' /etc/conf.d/splash + rm /etc/splash/default + ln -s /etc/splash/${clst_livecd_splash_theme} /etc/splash/default + else + echo "Error, cannot setup splash theme ${clst_livecd_splash_theme}" + exit 1 + fi +fi + +# Create firmware directory if it does not exist +[ ! -d /lib/firmware ] && mkdir -p /lib/firmware + +# tar up the firmware so that it does not get clobbered by the livecd mounts +if [ -n "$(ls /lib/firmware)" ] +then + cd /lib/firmware + if [ -n "$(ls /usr/lib/hotplug/firmware)" ] + then + cp /usr/lib/hotplug/firmware/* /lib/firmware + fi + tar cvjpf /lib/firmware.tar.bz2 . + rm -f /lib/firmware/* + mkdir -p /usr/lib/hotplug + ln -sf /lib/firmware /usr/lib/hotplug/firmware +fi diff --git a/targets/stage1/stage1-preclean1-chroot.sh b/targets/support/post-kmerge.sh similarity index 55% rename from targets/stage1/stage1-preclean1-chroot.sh rename to targets/support/post-kmerge.sh index ecb2bc95..a89e13e5 100755 --- a/targets/stage1/stage1-preclean1-chroot.sh +++ b/targets/support/post-kmerge.sh @@ -1,7 +1,9 @@ #!/bin/bash # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/stage1/Attic/stage1-preclean1-chroot.sh,v 1.4 2004/10/15 02:46:58 zhen Exp $ /usr/sbin/env-update source /etc/profile + +/sbin/depscan.sh +find /lib/modules -name modules.dep -exec touch {} \; diff --git a/targets/support/pre-kmerge.sh b/targets/support/pre-kmerge.sh new file mode 100755 index 00000000..2a435332 --- /dev/null +++ b/targets/support/pre-kmerge.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +/usr/sbin/env-update +source /etc/profile + + + +#if [ "${clst_AUTORESUME}" = "1" -a -e /tmp/.clst_genkernel -a -e "/usr/bin/genkernel" ] +#then +# echo "Autoresume point found not emerging genkernel" +#else +# emerge --oneshot --nodeps -b -k genkernel && touch /tmp/.clst_genkernel || exit 1 +#fi + +CONFIG_PROTECT="-*" USE="livecd" emerge --oneshot --nodeps -u genkernel + +install -d /usr/portage/packages/gk_binaries + +sed -i 's/uchi-hcd/uhci-hcd/' /usr/share/genkernel/x86/modules_load + +if [ "${clst_livecd_type}" = "gentoo-release-minimal" -o \ + "${clst_livecd_type}" = "gentoo-release-universal" ]; then + sed -i 's/initramfs_data.cpio.gz /initramfs_data.cpio.gz -r 1024x768 /'\ + /usr/share/genkernel/genkernel +fi diff --git a/targets/tinderbox/tinderbox-chroot.sh b/targets/tinderbox/tinderbox-chroot.sh index 3bbe96ab..8fec85a7 100755 --- a/targets/tinderbox/tinderbox-chroot.sh +++ b/targets/tinderbox/tinderbox-chroot.sh @@ -1,36 +1,25 @@ #!/bin/bash # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/tinderbox/tinderbox-chroot.sh,v 1.10 2005/01/28 18:37:23 wolf31o2 Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/tinderbox/tinderbox-chroot.sh,v 1.11 2005/04/04 17:48:33 rocket Exp $ -/usr/sbin/env-update -source /etc/profile +. /tmp/chroot-functions.sh -[ -f /tmp/envscript ] && source /tmp/envscript +update_env_settings -if [ -n "${clst_CCACHE}" ] -then - export clst_myfeatures="${clst_myfeatures} ccache" - emerge --oneshot --nodeps -b -k ccache || exit 1 -fi - -if [ -n "${clst_DISTCC}" ] -then - export clst_myfeatures="${clst_myfeatures} distcc" - export DISTCC_HOSTS="${clst_distcc_hosts}" - - USE="-gnome -gtk" emerge --oneshot --nodeps -b -k distcc || exit 1 -fi +setup_myfeatures # setup the environment export FEATURES="${clst_myfeatures}" export CONFIG_PROTECT="-*" # START THE BUILD -USE="build" emerge portage +setup_portage + #turn off auto-use: export USE_ORDER="env:pkg:conf:defaults" #back up pristine system + rsync -avx --exclude "/root/" --exclude "/tmp/" --exclude "/usr/portage/" / /tmp/rsync-bak/ for x in ${clst_tinderbox_packages} diff --git a/targets/tinderbox/tinderbox-controller.sh b/targets/tinderbox/tinderbox-controller.sh new file mode 100755 index 00000000..e75cac51 --- /dev/null +++ b/targets/tinderbox/tinderbox-controller.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/tinderbox/tinderbox-controller.sh,v 1.1 2005/04/04 17:48:33 rocket Exp $ + +. ${clst_sharedir}/targets/support/functions.sh + +case $1 in + run) + shift + exec_in_chroot ${clst_sharedir}/targets/tinderbox/tinderbox-chroot.sh + ;; + + preclean) + #exec_in_chroot ${clst_sharedir}/targets/grp/tinderbox-preclean-chroot.sh + delete_from_chroot /tmp/chroot-functions.sh + exit 0 + ;; + + clean) + exit 0 + ;; + + *) + exit 1 + ;; + +esac + +exit 0 diff --git a/targets/tinderbox/tinderbox-preclean-chroot.sh b/targets/tinderbox/tinderbox-preclean-chroot.sh index baf300d1..af84b091 100755 --- a/targets/tinderbox/tinderbox-preclean-chroot.sh +++ b/targets/tinderbox/tinderbox-preclean-chroot.sh @@ -1,7 +1,7 @@ #!/bin/bash # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/tinderbox/tinderbox-preclean-chroot.sh,v 1.4 2004/10/15 02:46:58 zhen Exp $ +# $Header: /var/cvsroot/gentoo/src/catalyst/targets/tinderbox/tinderbox-preclean-chroot.sh,v 1.5 2005/04/04 17:48:33 rocket Exp $ -/usr/sbin/env-update -source /etc/profile +. /tmp/chroot-functions.sh +update_env_settings diff --git a/targets/tinderbox/tinderbox.sh b/targets/tinderbox/tinderbox.sh deleted file mode 100755 index d49cd749..00000000 --- a/targets/tinderbox/tinderbox.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -# Copyright 1999-2004 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo/src/catalyst/targets/tinderbox/Attic/tinderbox.sh,v 1.10 2004/10/15 02:46:58 zhen Exp $ - -case $1 in - run) - shift - - cp ${clst_sharedir}/targets/tinderbox/tinderbox-chroot.sh ${clst_chroot_path}/tmp - clst_tinderbox_packages="$*" ${clst_CHROOT} ${clst_chroot_path} /tmp/tinderbox-chroot.sh || exit 1 - rm -f ${clst_chroot_path}/tmp/tinderbox-chroot.sh - ;; - - preclean) - #cp ${clst_sharedir}/targets/grp/tinderbox-preclean-chroot.sh ${clst_chroot_path}/tmp - #${clst_CHROOT} ${clst_chroot_path} /tmp/tinderbox-preclean-chroot.sh || exit 1 - #rm -f ${clst_chroot_path}/tmp/tinderbox-preclean-chroot.sh - exit 0 - ;; - - clean) - exit 0 - ;; - - *) - exit 1 - ;; - -esac -exit 0 -- 2.26.2