From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on sa.local.altlinux.org X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM autolearn=ham autolearn_force=no version=3.4.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ya.ru; s=mail; t=1576700687; bh=UFQM5E6tXGDWcRc7FrvADmWzEYd2TrRq3yYHTc4pJ3w=; h=Subject:From:To:Date:Message-ID; b=KbQo8ofkPosF577wpDXJLunzR8bWUcYyflatjRQcewflg1p1zy4nwViC896NG5D7b OomfJBH86fhhx2KgMCkMXHVvz1P4Uwloqiad+QY82P4Nh6r26dgYIrz9KX8Awvr+gq a2bf75fz6vNKgj1ubXpHuNKhMWe+CvMOULsyXwFw= Authentication-Results: mxback5q.mail.yandex.net; dkim=pass header.i=@ya.ru To: devel-distro@lists.altlinux.org From: =?UTF-8?B?0JDQvdGC0L7QvSDQnNC40LTRjtC60L7Qsg==?= Message-ID: <787760a2-a690-2868-bb52-9bd46a722aa3@ya.ru> Date: Thu, 19 Dec 2019 03:24:45 +0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------A1FCB4F734D5A2EC97FD6110" Content-Language: ru Subject: [devel-distro] =?utf-8?b?dGFyMmZzOiDQtNC+0LHQsNCy0LvQtdC90LAg0L8=?= =?utf-8?b?0L7QtNC00LXRgNC20LrQsCBncnViLWVmaQ==?= X-BeenThere: devel-distro@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: Distributions development List-Id: Distributions development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 18 Dec 2019 20:24:51 -0000 Archived-At: List-Archive: This is a multi-part message in MIME format. --------------A1FCB4F734D5A2EC97FD6110 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Доброго времени суток! Пару дней назад добавил в tar2fs из комплекта mkimage-profiles поддержку grub-efi. До этого она была в зачаточном состоянии. Для того, чтобы собрать vm/target.img с grub-efi, необходимо вызвать цель /use/efi/grub. которая установит EFI_BOOTLOADER в grub-efi. Изменения: 1. tar2fs для BOOTLOADER=grub-efi создаёт таблицу разделов GPT. Но, оказывается, можно и msdos оставить, тоже должно грузиться 2. Создаётся раздел EFI размером 256 МБ 3. Для того, чтобы грузилось без записей в nvram, установка производится командой: grub-install --target= --removable 4. Для x86_64 устанавливается ещё и 32-битный EFI загрузчик 5. sed'ом исправляется initrd16 на inirdefi для grub-efi и наоборот для grub-pc. Это изменение необходимо, чтобы получать рабочий конфиг для grub-pc на системах с EFI и для grub-efi на системах без EFI. 6. Можно собирать также и для aarch64. Моя сборка зависла на этапе загрузки initrd, так что grub, вероятно, получился рабочий. А x86_64 сборки успешно грузятся в режиме EFI. Во вложении как патч, так и сам tar2fs, так как tar2fs может использоваться и отдельно от mkimage-profiles. -- С уважением, Антон Мидюков --------------A1FCB4F734D5A2EC97FD6110 Content-Type: text/x-patch; name="0001-tar2fs-add-support-efi.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="0001-tar2fs-add-support-efi.patch" >>From bf7b18bbfc96943b3b777d6a9553528792dbeca6 Mon Sep 17 00:00:00 2001 From: Anton Midyukov Date: Tue, 17 Dec 2019 15:03:11 +0700 Subject: [PATCH] tar2fs: add support efi --- bin/tar2fs | 91 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 81 insertions(+), 10 deletions(-) diff --git a/bin/tar2fs b/bin/tar2fs index 8436ee20c2..d110bc6579 100755 --- a/bin/tar2fs +++ b/bin/tar2fs @@ -30,6 +30,8 @@ CUR_BOUNDARY=0 # align first partition at 1MB for performance (+1) BOOTFSTYPE= BOOTPART= +EFIPARTFSTYPE= +EFIPART= BOOTLOADER="$5" @@ -50,7 +52,14 @@ ppc*) ROOTPART="2" ;; *) - ROOTPART="1" + if [ "$BOOTLOADER" == grub-efi ]; then + EFIPART="1" + EFIPARTSIZEM="256" + EFIPARTFSTYPE="fat" + ROOTPART="2" + else + ROOTPART="1" + fi BLOCKDEV="/dev/sda" ;; esac @@ -82,9 +91,14 @@ mkpart() { CUR_BOUNDARY="$(($start + $1))" local end="$CUR_BOUNDARY"MiB else - local end="-1s" # last sector of the image + local end="$OFFSET"MiB # last sector of the image fi - parting mkpart primary ext2 "$start"MiB "$end" + if [ -n "$2" ]; then + CUR_FS="$2" + else + CUR_FS=ext2 + fi + parting mkpart primary "$CUR_FS" "$start"MiB "$end" } # a tarball containing chroot with a kernel @@ -118,7 +132,8 @@ ROOTFSTYPE="${4:-ext4}" ROOTDEV="$BLOCKDEV$ROOTPART" # last preparations... -MKFS="mkfs.$ROOTFSTYPE ${BOOTFSTYPE:+mkfs.$BOOTFSTYPE}" +MKFS="mkfs.$ROOTFSTYPE ${BOOTFSTYPE:+mkfs.$BOOTFSTYPE} \ + ${EFIPARTFSTYPE:+mkfs.$EFIPARTFSTYPE}" for i in losetup sfdisk parted kpartx $MKFS; do if ! type -t "$i" >&/dev/null; then fatal "$i required but not found in host system" @@ -129,15 +144,20 @@ LOOPDEV="$(losetup --find)" # would be sad about non-binary megabytes too ROOTFS="$WORKDIR/chroot" BOOTFS= +EFIPARTFS= if [ -n "$BOOTPART" ]; then BOOTFS="$ROOTFS/boot" fi +if [ -n "$EFIPART" ]; then + EFIPARTFS="$ROOTFS/boot/efi" +fi exit_handler() { rc=$? cd / if [ -n "$ROOTFS" ]; then - umount ${BOOTFS:+"$BOOTFS"} "$ROOTFS"{/dev,/proc,/sys,} + umount ${EFIPARTFS:+"$EFIPARTFS"} ${BOOTFS:+"$BOOTFS"} \ + "$ROOTFS"{/dev,/proc,/sys,} if [ -n "$LOOPDEV" ]; then kpartx -d -s "$LOOPDEV" || { @@ -157,12 +177,15 @@ trap exit_handler EXIT ERR # prepare disk image and a filesystem inside it rm -f -- "$IMG" - -OFFSET="$(($CUR_BOUNDARY + $BOOTLOADERPARTSIZEM + $BOOTSIZEM + $ROOTSIZEM - 1))" +OFFSET="$(($CUR_BOUNDARY + $EFIPARTSIZEM + $BOOTLOADERPARTSIZEM + $BOOTSIZEM + $ROOTSIZEM - 1))" dd if=/dev/zero of="$IMG" conv=notrunc bs=$MB count=1 seek="$OFFSET" losetup "$LOOPDEV" "$IMG" -parting mklabel msdos +if [ "$BOOTLOADER" == grub-efi ]; then + parting mklabel gpt +else + parting mklabel msdos +fi if [ -n "$BOOTLOADERPART" ] && [ -n "$BOOTLOADERPARTSIZEM" ]; then case "$ARCH" in @@ -175,6 +198,14 @@ if [ -n "$BOOTLOADERPART" ] && [ -n "$BOOTLOADERPARTSIZEM" ]; then esac fi +if [ -n "$EFIPART" ]; then + EFIDEV="$EFIDEV$EFIPART" + parting mkpart fat32 2048s ${EFIPARTSIZEM}M + CUR_BOUNDARY="$(($CUR_BOUNDARY + $EFIPARTSIZEM))" + parting set 1 boot on + parting set 1 esp on +fi + if [ -n "$BOOTPART" ]; then BOOTDEV="$BLOCKDEV$BOOTPART" mkpart "$BOOTSIZEM" @@ -197,6 +228,11 @@ if [ -n "$BOOTLOADERPART" ] && [ -n "$BOOTLOADERPARTSIZEM" ]; then LOOPBOOTLOADER="/dev/mapper/$(basename "$LOOPDEV")p$BOOTLOADERPART" fi +if [ -n "$EFIPART" ]; then + LOOPEFI="/dev/mapper/$(basename "$LOOPDEV")p$EFIPART" + mkfs.fat -F32 "$LOOPEFI" +fi + ROOTUUID="$(blkid -s UUID -o value -c /dev/null "$LOOPROOT")" if [ -n "$ROOTUUID" ]; then ROOTDEV="UUID=$ROOTUUID" @@ -206,11 +242,18 @@ fi if [ -n "$BOOTPART" ]; then BOOTUUID="$(blkid -s UUID -o value -c /dev/null "$LOOPBOOT")" - if [ -n "$ROOTUUID" ]; then + if [ -n "$BOOTUUID" ]; then BOOTDEV="UUID=$BOOTUUID" fi fi +if [ -n "$EFIPART" ]; then + EFIUUID="$(blkid -s UUID -o value -c /dev/null "$LOOPEFI")" + if [ -n "$EFIUUID" ]; then + EFIDEV="UUID=$EFIUUID" + fi +fi + # mount and populate it mkdir -pm755 "$ROOTFS" mount "$LOOPROOT" "$ROOTFS" @@ -220,6 +263,11 @@ if [ -n "$BOOTPART" ]; then mount "$LOOPBOOT" "$BOOTFS" fi +if [ -n "$EFIPART" ]; then + mkdir -pm751 "$EFIPARTFS" + mount "$LOOPEFI" "$EFIPARTFS" +fi + tar -C "$ROOTFS" --numeric-owner -xf "$TAR" for i in /dev /proc /sys; do mount --bind "$i" "$ROOTFS$i"; done @@ -234,6 +282,9 @@ fi if [ -n "$BOOTPART" ]; then echo "$BOOTDEV /boot $BOOTFSTYPE defaults 1 2" >> "$ROOTFS/etc/fstab" fi +if [ -n "$EFIPART" ]; then + echo "$EFIDEV /boot/efi vfat umask=0,quiet,showexec,iocharset=utf8,codepage=866 1 2" >> "$ROOTFS/etc/fstab" +fi # Query ARCH in chroot and redefine arch-dependent variable ARCH="$(chroot "$ROOTFS" rpm --eval '%_host_cpu')" @@ -323,13 +374,33 @@ image=/boot/vmlinuz ;; grub-efi) chroot "$ROOTFS" grub-mkconfig -o /boot/grub/grub.cfg - chroot "$ROOTFS" grub-install + case "$ARCH" in + *86) + chroot "$ROOTFS" grub-install --target=i386-efi --removable + sed -i 's/initrd16/initrdefi/g' "$ROOTFS/boot/grub/grub.cfg" + sed -i 's/linux16/linuxefi/g' "$ROOTFS/boot/grub/grub.cfg" + ;; + x86_64) + chroot "$ROOTFS" grub-install --target=i386-efi --removable + chroot "$ROOTFS" grub-install --target=x86_64-efi --removable + sed -i 's/initrd16/initrdefi/g' "$ROOTFS/boot/grub/grub.cfg" + sed -i 's/linux16/linuxefi/g' "$ROOTFS/boot/grub/grub.cfg" + ;; + aarch64) + chroot "$ROOTFS" grub-install --target=arm64-efi --removable + ;; + armh) + chroot "$ROOTFS" grub-install --target=arm-efi --removable + ;; + esac ;; grub) chroot "$ROOTFS" grub-mkconfig -o /boot/grub/grub.cfg case "$ARCH" in *86*) chroot "$ROOTFS" grub-install --target=i386-pc "$LOOPDEV" + sed -i 's/initrdefi/initrd16/g' "$ROOTFS/boot/grub/grub.cfg" + sed -i 's/linuxefi/linux16/g' "$ROOTFS/boot/grub/grub.cfg" ;; ppc*) [ -z "$LOOPBOOTLOADER" ] || -- 2.24.1 --------------A1FCB4F734D5A2EC97FD6110 Content-Type: text/plain; charset=UTF-8; name="tar2fs" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="tar2fs" IyEvYmluL2Jhc2ggLWV4CiMgdXNhZ2U6CiMgdGFyMmZzIGNocm9vdC50YXIgaW1hZ2UucmF3 IFtzaXplX2luX2J5dGVzIFtmc3R5cGVdXQoKLiBzaGVsbC1lcnJvcgpleHBvcnQgTEFORz1D CgppZiBbICQjIC1sdCAyIF07IHRoZW4KCWZhdGFsICJlcnJvcjogdGFyMmZzIG5lZWRzIGF0 IGxlYXN0IHR3byBhcmd1bWVudHMiCmZpCgojIHRoaXMgbmVlZHMgZW52X2tlZXAgc3VkbyBz ZXR1cCB0byBhY3R1YWxseSB3b3JrCmlmIFsgLW4gIiRHTE9CQUxfQlVJTERESVIiIF07IHRo ZW4KCVdPUktESVI9IiRHTE9CQUxfQlVJTERESVIvdm1yb290IgplbHNlCglXT1JLRElSPSIk KG1rdGVtcCAtLXRtcGRpciAtZCB2bXJvb3QtWFhYWFgpIgpmaQoKWyAtbiAiJFdPUktESVIi IF0gfHwgZmF0YWwgImNvdWxkbid0IGNvbWUgdXAgd2l0aCBzdWl0YWJsZSBXT1JLRElSIgoK WyAtbiAiJEdMT0JBTF9ERUJVRyIgXSB8fCBtZXNzYWdlICJXT1JLRElSOiAkV09SS0RJUiIK Ck1CPTEwNDg1NzYJCSMgYSBwYXJ0ZWQncyAibWVnYWJ5dGUiIGluIGJ5dGVzIGlzICpicm9r ZW4qCgpTSVpFX0ZBQ1RPUj0yCQkjIG11bHRpcGx5IHRoZSBzaXplcyBmb3VuZCBieSB0aGlz IHZhbHVlCkJPT1RfU0laRV9GQUNUT1I9MgkjIG11bHRpcGx5IC9ib290IHNpemUgYnkgdGhp cyB2YWx1ZSBhZGRpdGlvbmFsbHkKQk9PVExPQURFUlBBUlRTSVpFTT0wCSMgUFJlUCBwYXJ0 aXRpb24gc2l6ZSAocHBjKikKCkNVUl9CT1VOREFSWT0wCQkjIGFsaWduIGZpcnN0IHBhcnRp dGlvbiBhdCAxTUIgZm9yIHBlcmZvcm1hbmNlICgrMSkKCkJPT1RGU1RZUEU9CkJPT1RQQVJU PQpFRklQQVJURlNUWVBFPQpFRklQQVJUPQoKQk9PVExPQURFUj0iJDUiCgpBUkNIPSIkKGFy Y2gpIgkJIyBOQjogc3VkbyA9PiBubyBHTE9CQUxfIHdpbGwgZG8gZWl0aGVyOyBtaW5kIHFl bXUtKgoKY2FzZSAiJEFSQ0giIGluCmUyaykKCUJPT1RGU1RZUEU9ImV4dDIiICAgICAgICMg ZmlybXdhcmUga25vd3MgaXQKCUJMT0NLREVWPSIvZGV2L3NkYSIgICAgICMgLi4uaG9wZWZ1 bGx5Li4uCglCT09UUEFSVD0iMSIKCVJPT1RQQVJUPSIyIgoJOzsKcHBjKikKCUJPT1RGU1RZ UEU9ImV4dDQiCglCTE9DS0RFVj0iL2Rldi9zZGEiCglCT09UTE9BREVSUEFSVD0iMSIKCUJP T1RMT0FERVJQQVJUU0laRU09IjgiCglST09UUEFSVD0iMiIKCTs7CiopCglpZiBbICIkQk9P VExPQURFUiIgPT0gZ3J1Yi1lZmkgXTsgdGhlbgoJCUVGSVBBUlQ9IjEiCgkJRUZJUEFSVFNJ WkVNPSIyNTYiCgkJRUZJUEFSVEZTVFlQRT0iZmF0IgoJCVJPT1RQQVJUPSIyIgoJZWxzZQoJ CVJPT1RQQVJUPSIxIgoJZmkKCUJMT0NLREVWPSIvZGV2L3NkYSIKCTs7CmVzYWMKCiMgZmln dXJlIG91dCB0aGUgcGFydCB0YWtlbiBieSAvYm9vdCBpbiB0aGUgZ2l2ZW4gdGFyYmFsbApi b290X3NpemUoKSB7CglpZiBbIC1uICIkQk9PVFBBUlQiIF07IHRoZW4KCQl0YXIgdHZmICIk MSIgXAoJCXwgYXdrICcgXAoJCQlCRUdJTiB7IHN1bT0wIH0KCQkJL14tLiogXC5cL2Jvb3Rc Ly8geyBzdW09c3VtKyQzIH0KCQkJRU5EIHsgcHJpbnQgc3VtIH0nCgllbHNlCgkJZWNobyAi MCIKCWZpCn0KCiMgcGFydGVkIHdyYXBwZXIgZm9yIGNvbnZlbmllbmNlCnBhcnRpbmcoKSB7 IHBhcnRlZCAiJExPT1BERVYiIC0tYWxpZ24gb3B0aW1hbCAtLXNjcmlwdCAtLSAiJEAiOyB9 CgojIHVuZm9ydHVuYXRlbHkgcGFydGVkIGlzIGluc2FuZSBlbm91Z2ggdG8gbHVtcCBhbGln bm1lbnQgY29udHJvbHMKIyBpbnRvIHVuaXQgY29udHJvbHMgc28gY3JlYXRpbmcgYWRqYWNl bnQgcGFydGl0aW9ucyBzaXplZCBpbiBNaUIKIyBpcyBub3QgYXMgc3RyYWlnaHRmb3J3YXJk IGFzIGl0IG1pZ2h0IGJlLi4uIHRodXMgIisxIiBwYWRkaW5nOwojIHNlZSBhbHNvIGh0dHA6 Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9wYXJ0ZWQvbWFudWFsL3BhcnRlZC5odG1sI3VuaXQK bWtwYXJ0KCkgewoJIyBhIGJpdCBkaWZmZXJlbnQgc3RhcnQvZW5kIHNlbWFudGljcyB0byBo YW5kbGUgZW5kIG9mIGRldmljZSB0b28KCWxvY2FsIHN0YXJ0PSIkKCgkQ1VSX0JPVU5EQVJZ ICsgMSkpIgkjIHllcywgd2UgbG9zZSBhIG1lZ2FieXRlCglpZiBbIC1uICIkMSIgXTsgdGhl bgoJCUNVUl9CT1VOREFSWT0iJCgoJHN0YXJ0ICsgJDEpKSIKCQlsb2NhbCBlbmQ9IiRDVVJf Qk9VTkRBUlkiTWlCCgllbHNlCgkJbG9jYWwgZW5kPSIkT0ZGU0VUIk1pQgkjIGxhc3Qgc2Vj dG9yIG9mIHRoZSBpbWFnZQoJZmkKCWlmIFsgLW4gIiQyIiBdOyB0aGVuCgkJQ1VSX0ZTPSIk MiIKCWVsc2UKCQlDVVJfRlM9ZXh0MgoJZmkKCXBhcnRpbmcgbWtwYXJ0IHByaW1hcnkgIiRD VVJfRlMiICIkc3RhcnQiTWlCICIkZW5kIgp9CgojIGEgdGFyYmFsbCBjb250YWluaW5nIGNo cm9vdCB3aXRoIGEga2VybmVsClRBUj0iJDEiClsgLXMgIiRUQVIiIF0gfHwgZmF0YWwgInNv dXJjZSB0YXJiYWxsIGRvZXNuJ3QgcmVhbGx5IGV4aXN0IgoKIyBhIHBhdGggdG8gdGhlIGlt YWdlIHRvIGJlIGdlbmVyYXRlZApJTUc9IiQyIgpbIC1kICIkKGRpcm5hbWUgIiRJTUciKSIg XSB8fCBmYXRhbCAidGFyZ2V0IGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0IgoKIyAwIG1lYW5z IGF1dG87IGlmIGEgdmFsdWUgaXMgc3BlY2lmaWVkIGl0IGhvbGRzIChubyAvYm9vdCBzdWJ0 cmFjdGVkKQpST09UU0laRT0iJDMiClsgLW4gIiRST09UU0laRSIgLWEgIiRST09UU0laRSIg IT0gMCBdIHx8IHVuc2V0IFJPT1RTSVpFCgojIGltYWdlIHNpemUgaW4gYnl0ZXMKVEFSU0la RT0iJChzdGF0IC1MYyAlcyAiJFRBUiIpIgojIC9ib290IHNpemUgaW4gdGhhdCB0YXJiYWxs CkJPT1RTSVpFPSIkKGJvb3Rfc2l6ZSAiJFRBUiIpIgpERUZTSVpFPSIkKCgkU0laRV9GQUNU T1IgKiAoJFRBUlNJWkUgLSAkQk9PVFNJWkUpKSkiCSMgKGV4YWN0IHNpemVzKQpST09UU0la RT0iJCgoJHtST09UU0laRTotJERFRlNJWkV9ICsgJE1CIC0gMSkpIgkjIGZvciBjZWlsIHJv dW5kaW5nIHRvIE1CCiMgaW1hZ2UgYW5kIC9ib290IHNpemVzIGluIG1lZ2FieXRlcwpST09U U0laRU09IiQoKCRST09UU0laRSAvICRNQikpIgpCT09UU0laRU09IiQoKCgkU0laRV9GQUNU T1IgKiAkQk9PVF9TSVpFX0ZBQ1RPUiAqICRCT09UU0laRSArICRNQiAtIDEpIC8gJE1CKSki CgojIHRlc3RlZCB0byB3b3JrOiBleHRbMjM0XSwgamZzCiMgTkI6IHhmcyBkb2Vzbid0IGhh dmUgYSBzcGFyZSBzZWN0b3IgZm9yIHRoZSBib290bG9hZGVyClJPT1RGU1RZUEU9IiR7NDot ZXh0NH0iCgojIHNpbmdsZSByb290IHBhcnRpdGlvbiBoYXJkd2lyZWQgc28gZmFyLAojIGFk ZCBhbm90aGVyIGltYWdlIGZvciBob21lL2RhdGEvc3dhcCBpZiBuZWVkZWQKUk9PVERFVj0i JEJMT0NLREVWJFJPT1RQQVJUIgoKIyBsYXN0IHByZXBhcmF0aW9ucy4uLgpNS0ZTPSJta2Zz LiRST09URlNUWVBFICR7Qk9PVEZTVFlQRTorbWtmcy4kQk9PVEZTVFlQRX0gXAogICR7RUZJ UEFSVEZTVFlQRTorbWtmcy4kRUZJUEFSVEZTVFlQRX0iCmZvciBpIGluIGxvc2V0dXAgc2Zk aXNrIHBhcnRlZCBrcGFydHggJE1LRlM7IGRvCglpZiAhIHR5cGUgLXQgIiRpIiA+Ji9kZXYv bnVsbDsgdGhlbgoJCWZhdGFsICIkaSByZXF1aXJlZCBidXQgbm90IGZvdW5kIGluIGhvc3Qg c3lzdGVtIgoJZmkKZG9uZQoKTE9PUERFVj0iJChsb3NldHVwIC0tZmluZCkiCSMgd291bGQg YmUgc2FkIGFib3V0IG5vbi1iaW5hcnkgbWVnYWJ5dGVzIHRvbwpST09URlM9IiRXT1JLRElS L2Nocm9vdCIKCkJPT1RGUz0KRUZJUEFSVEZTPQppZiBbIC1uICIkQk9PVFBBUlQiIF07IHRo ZW4KCUJPT1RGUz0iJFJPT1RGUy9ib290IgpmaQppZiBbIC1uICIkRUZJUEFSVCIgXTsgdGhl bgoJRUZJUEFSVEZTPSIkUk9PVEZTL2Jvb3QvZWZpIgpmaQoKZXhpdF9oYW5kbGVyKCkgewoJ cmM9JD8KCWNkIC8KCWlmIFsgLW4gIiRST09URlMiIF07IHRoZW4KCQl1bW91bnQgJHtFRklQ QVJURlM6KyIkRUZJUEFSVEZTIn0gJHtCT09URlM6KyIkQk9PVEZTIn0gXAoJCSAgIiRST09U RlMiey9kZXYsL3Byb2MsL3N5cyx9CgoJCWlmIFsgLW4gIiRMT09QREVWIiBdOyB0aGVuCgkJ CWtwYXJ0eCAtZCAtcyAiJExPT1BERVYiIHx8IHsKCQkJCXNsZWVwIDEwCgkJCQlrcGFydHgg LWQgLXMgLXYgIiRMT09QREVWIgoJCQl9CgkJCWxvc2V0dXAgLS1kZXRhY2ggIiRMT09QREVW IgoJCWZpCgkJcm0gLXIgLS0gIiRST09URlMiCgkJcm1kaXIgLS0gIiRXT1JLRElSIgoJZmkK CWV4aXQgJHJjCn0KCiMgaGFuZGxlIC1lIGluIHNoZWJhbmcgYXMgd2VsbAp0cmFwIGV4aXRf aGFuZGxlciBFWElUIEVSUgoKIyBwcmVwYXJlIGRpc2sgaW1hZ2UgYW5kIGEgZmlsZXN5c3Rl bSBpbnNpZGUgaXQKcm0gLWYgLS0gIiRJTUciCk9GRlNFVD0iJCgoJENVUl9CT1VOREFSWSAr ICRFRklQQVJUU0laRU0gKyAkQk9PVExPQURFUlBBUlRTSVpFTSArICRCT09UU0laRU0gKyAk Uk9PVFNJWkVNIC0gMSkpIgpkZCBpZj0vZGV2L3plcm8gb2Y9IiRJTUciIGNvbnY9bm90cnVu YyBicz0kTUIgY291bnQ9MSBzZWVrPSIkT0ZGU0VUIgpsb3NldHVwICIkTE9PUERFViIgIiRJ TUciCgppZiBbICIkQk9PVExPQURFUiIgPT0gZ3J1Yi1lZmkgXTsgdGhlbgoJcGFydGluZyBt a2xhYmVsIGdwdAplbHNlCglwYXJ0aW5nIG1rbGFiZWwgbXNkb3MKZmkKCmlmIFsgLW4gIiRC T09UTE9BREVSUEFSVCIgXSAmJiBbIC1uICIkQk9PVExPQURFUlBBUlRTSVpFTSIgXTsgdGhl bgoJY2FzZSAiJEFSQ0giIGluCgkJcHBjKikKCQkJcGFydGluZyBta3BhcnQgcHJpbWFyeSBl eHQyIDIwNDhzICR7Qk9PVExPQURFUlBBUlRTSVpFTX1NCgkJCUNVUl9CT1VOREFSWT0iJCgo JENVUl9CT1VOREFSWSArICRCT09UTE9BREVSUEFSVFNJWkVNKSkiCgkJCXBhcnRpbmcgc2V0 IDEgcHJlcCBvbgoJCQlwYXJ0aW5nIHNldCAxIGJvb3Qgb24KCQkJOzsKCWVzYWMKZmkKCmlm IFsgLW4gIiRFRklQQVJUIiBdOyB0aGVuCglFRklERVY9IiRFRklERVYkRUZJUEFSVCIKCXBh cnRpbmcgbWtwYXJ0IGZhdDMyIDIwNDhzICR7RUZJUEFSVFNJWkVNfU0KCUNVUl9CT1VOREFS WT0iJCgoJENVUl9CT1VOREFSWSArICRFRklQQVJUU0laRU0pKSIKCXBhcnRpbmcgc2V0IDEg Ym9vdCBvbgoJcGFydGluZyBzZXQgMSBlc3Agb24KZmkKCmlmIFsgLW4gIiRCT09UUEFSVCIg XTsgdGhlbgoJQk9PVERFVj0iJEJMT0NLREVWJEJPT1RQQVJUIgoJbWtwYXJ0ICIkQk9PVFNJ WkVNIgpmaQoKIyBub3QgUk9PVFNJWkVNIGJ1dCAidGhlIHJlc3QiOyBzb21ld2hhdCBub24t dHJpdmlhbCBhcml0aG1ldGljcyBsdXJrIGluIHBhcnRlZApta3BhcnQKCmtwYXJ0eCAtYSAt cyAiJExPT1BERVYiCkxPT1BST09UPSIvZGV2L21hcHBlci8kKGJhc2VuYW1lICIkTE9PUERF ViIpcCRST09UUEFSVCIKCm1rZnMuIiRST09URlNUWVBFIiAiJExPT1BST09UIgoKaWYgWyAt biAiJEJPT1RQQVJUIiBdOyB0aGVuCglMT09QQk9PVD0iL2Rldi9tYXBwZXIvJChiYXNlbmFt ZSAiJExPT1BERVYiKXAkQk9PVFBBUlQiCglta2ZzLiIkQk9PVEZTVFlQRSIgIiRMT09QQk9P VCIKZmkKCmlmIFsgLW4gIiRCT09UTE9BREVSUEFSVCIgXSAmJiBbIC1uICIkQk9PVExPQURF UlBBUlRTSVpFTSIgXTsgdGhlbgoJTE9PUEJPT1RMT0FERVI9Ii9kZXYvbWFwcGVyLyQoYmFz ZW5hbWUgIiRMT09QREVWIilwJEJPT1RMT0FERVJQQVJUIgpmaQoKaWYgWyAtbiAiJEVGSVBB UlQiIF07IHRoZW4KCUxPT1BFRkk9Ii9kZXYvbWFwcGVyLyQoYmFzZW5hbWUgIiRMT09QREVW IilwJEVGSVBBUlQiCglta2ZzLmZhdCAtRjMyICIkTE9PUEVGSSIKZmkKClJPT1RVVUlEPSIk KGJsa2lkIC1zIFVVSUQgLW8gdmFsdWUgLWMgL2Rldi9udWxsICIkTE9PUFJPT1QiKSIKaWYg WyAtbiAiJFJPT1RVVUlEIiBdOyB0aGVuCiAgICAgICBST09UREVWPSJVVUlEPSRST09UVVVJ RCIKZWxzZQogICAgICAgUk9PVERFVj0iJExPT1BST09UIgpmaQoKaWYgWyAtbiAiJEJPT1RQ QVJUIiBdOyB0aGVuCglCT09UVVVJRD0iJChibGtpZCAtcyBVVUlEIC1vIHZhbHVlIC1jIC9k ZXYvbnVsbCAiJExPT1BCT09UIikiCglpZiBbIC1uICIkQk9PVFVVSUQiIF07IHRoZW4KCQlC T09UREVWPSJVVUlEPSRCT09UVVVJRCIKCWZpCmZpCgppZiBbIC1uICIkRUZJUEFSVCIgXTsg dGhlbgoJRUZJVVVJRD0iJChibGtpZCAtcyBVVUlEIC1vIHZhbHVlIC1jIC9kZXYvbnVsbCAi JExPT1BFRkkiKSIKCWlmIFsgLW4gIiRFRklVVUlEIiBdOyB0aGVuCgkJRUZJREVWPSJVVUlE PSRFRklVVUlEIgoJZmkKZmkKCiMgbW91bnQgYW5kIHBvcHVsYXRlIGl0Cm1rZGlyIC1wbTc1 NSAiJFJPT1RGUyIKbW91bnQgIiRMT09QUk9PVCIgIiRST09URlMiCgppZiBbIC1uICIkQk9P VFBBUlQiIF07IHRoZW4KCW1rZGlyIC1wbTcwMCAiJEJPT1RGUyIKCW1vdW50ICIkTE9PUEJP T1QiICIkQk9PVEZTIgpmaQoKaWYgWyAtbiAiJEVGSVBBUlQiIF07IHRoZW4KCW1rZGlyIC1w bTc1MSAiJEVGSVBBUlRGUyIKCW1vdW50ICIkTE9PUEVGSSIgIiRFRklQQVJURlMiCmZpCgp0 YXIgLUMgIiRST09URlMiIC0tbnVtZXJpYy1vd25lciAteGYgIiRUQVIiCmZvciBpIGluIC9k ZXYgL3Byb2MgL3N5czsgZG8gbW91bnQgLS1iaW5kICIkaSIgIiRST09URlMkaSI7IGRvbmUK CiMgbG9vcCBkZXZpY2Ugc28gbGlsbyBjb3VsZCB3b3JrLi4uCmlmIGdyZXAgLXFlICJbWzpz cGFjZTpdXS9bWzpzcGFjZTpdXSIgIiRST09URlMvZXRjL2ZzdGFiIjsgdGhlbiBcCglzZWQg LWkgInMvTEFCRUw9Uk9PVC8kUk9PVERFVi8iICIkUk9PVEZTL2V0Yy9mc3RhYiIKZWxzZQoJ ZWNobyAiJFJPT1RERVYgLyAkUk9PVEZTVFlQRSByZWxhdGltZSAxIDEiID4+ICIkUk9PVEZT L2V0Yy9mc3RhYiIKZmkKCiMgdGFyZ2V0IGRldmljZSBhdCBvbmNlCmlmIFsgLW4gIiRCT09U UEFSVCIgXTsgdGhlbgoJZWNobyAiJEJPT1RERVYgL2Jvb3QgJEJPT1RGU1RZUEUgZGVmYXVs dHMgMSAyIiA+PiAiJFJPT1RGUy9ldGMvZnN0YWIiCmZpCmlmIFsgLW4gIiRFRklQQVJUIiBd OyB0aGVuCgllY2hvICIkRUZJREVWIC9ib290L2VmaSB2ZmF0IHVtYXNrPTAscXVpZXQsc2hv d2V4ZWMsaW9jaGFyc2V0PXV0ZjgsY29kZXBhZ2U9ODY2IDEgMiIgPj4gIiRST09URlMvZXRj L2ZzdGFiIgpmaQoKIyBRdWVyeSBBUkNIIGluIGNocm9vdCBhbmQgcmVkZWZpbmUgYXJjaC1k ZXBlbmRlbnQgdmFyaWFibGUKQVJDSD0iJChjaHJvb3QgIiRST09URlMiIHJwbSAtLWV2YWwg JyVfaG9zdF9jcHUnKSIKCiMgTkI6IGRvbid0IHN0aWNrIEJPT1RGUyBoZXJlLCBpdCBoYXMg c2xpZ2h0bHkgZGlmZmVyZW50IHNlbWFudGljcwpwdXNoZCAkUk9PVEZTL2Jvb3QKCiMgNC45 Ljc2LWVsYnJ1cy1kZWYtYWx0MS4xMS4xIC0+IGRlZgpnZXRfbGFiZWwoKSB7IGVjaG8gIiR7 MSMgKn0iIHwgc2VkIC1yICdzLC4qZWxicnVzLShbMC05YS16XSspLS4qJCxcMSwnOyB9CgpL VkVSU0lPTlM9CktWRVJTSU9OUz0iJChjaHJvb3QgIiRST09URlMiIHJwbSAtcWEgJ2tlcm5l bC1pbWFnZSonIFwKICAgICAgICAgICAgLS1xZiAnJXtpbnN0YWxsdGltZX0gJXt2ZXJzaW9u fS0le25hbWV9LSV7cmVsZWFzZX1cbicgXAogICAgICAgIHwgc29ydCAtbiBcCiAgICAgICAg fCBjdXQgLWYgMiAtZCAnICcgXAogICAgICAgIHwgc2VkICdzL2tlcm5lbC1pbWFnZS0vLycp IgpbIC1uICIkS1ZFUlNJT05TIiBdIHx8IGZhdGFsICJ1bmFibGUgdG8gZGVkdWNlIGtlcm5l bCB2ZXJzaW9uIgpybSAtZiAub3JpZ3ZlcgoKIyBjbGVhbiBmc3RhYgpzZWQgLWkgIi9MQUJF TD1ST09UL2QiICIkUk9PVEZTL2V0Yy9mc3RhYiIKIyAuLi50YXJnZXQgZGV2aWNlIHRvbwpz ZWQgLWkgInMsJExPT1BST09ULCRST09UREVWLCIgIiRST09URlMvZXRjL2ZzdGFiIgoKZWNo byAiKiogS1ZFUlNJT05TPVskS1ZFUlNJT05TXSIgPiYyCgppZiBbICJgZWNobyAkS1ZFUlNJ T05TIHwgd2MgLXdgIiA9IDEgXTsgdGhlbiAjIDIrIGxhYmVscwoJZWNobyAtZSAiZGVmYXVs dD1gZ2V0X2xhYmVsICRLVkVSU0lPTlNgXG4iID4+IGJvb3QuY29uZgpmaQoKIyBGSVhNRTog cmVsaWVzIG9uIHBhcnRpY3VsYXIgKGN1cnJlbnQpIGtlcm5lbCBwYWNrYWdlIG5hbWluZyBz Y2hlbWUKZm9yIHYgaW4gJEtWRVJTSU9OUzsgZG8KCWw9ImBnZXRfbGFiZWwgIiR2ImAiCglj YXQgPj4gYm9vdC5jb25mIDw8RU9GCmxhYmVsPSRsCglwYXJ0aXRpb249MAoJaW1hZ2U9L2lt YWdlLSR2Cglpbml0cmQ9L2luaXRyZC0kdi5pbWcKCWNtZGxpbmU9Y29uc29sZT10dHlTMCwx MTUyMDAgY29uc29sZT10dHkwIGNvbnNvbGVibGFuaz0wIGhhcmRyZXNldCByb290PVVVSUQ9 JFJPT1RVVUlECgpFT0YKZG9uZQoKZWNobyAiKiogc3RhcnQgb2YgYm9vdC5jb25mIgpjYXQg Ym9vdC5jb25mCmVjaG8gIioqIGVuZCBvZiBib290LmNvbmYiCgpwb3BkCgojIFNldHVwIGJv b3Rsb2FkZXIKY2FzZSAiJEJPT1RMT0FERVIiIGluCnVib290KQoJRVhUTElOVVhfQ09ORj0i JFJPT1RGUy9ib290L2V4dGxpbnV4L2V4dGxpbnV4LmNvbmYiCglzZWQgLWkgInMvTEFCRUw9 Uk9PVC8kUk9PVERFVi9nIiAiJEVYVExJTlVYX0NPTkYiCgk7OwpsaWxvKQoJIyBjb25maWd1 cmUgYW5kIGluc3RhbGwgYm9vdGxvYWRlcgoJUkVHRVhQPSdeLio6IChbMC05XSspIGN5bGlu ZGVycywgKFswLTldKykgaGVhZHMsIChbMC05XSspIHNlY3RvcnMvdHJhY2sqJCcKCXNldCAt LSAkKHNmZGlzayAtZyAiJExPT1BERVYiIHwgZ3JlcCAtRSAiJFJFR0VYUCIgfCBzZWQgLXIg InNAJFJFR0VYUEBcMSBcMiBcM0AiKQoKCUxJTE9fQ09NTU9OPSJsYmEzMgpkZWxheT0xCnZn YT0wCmltYWdlPS9ib290L3ZtbGludXoKICBpbml0cmQ9L2Jvb3QvaW5pdHJkLmltZwogIGFw cGVuZD1cInJvb3Q9JFJPT1RERVYgcm9vdGRlbGF5PTMgY29uc29sZT10dHkxIGNvbnNvbGU9 dHR5UzAsMTE1MjAwbjhcIgogIGxhYmVsPWxpbnV4IgoKCWNhdCA+ICIkUk9PVEZTIi9ldGMv bGlsby1sb29wLmNvbmYgPDwtRU9GCglib290PSRMT09QREVWCglkaXNrPSRMT09QREVWCgkg IGJpb3M9MHg4MAoJICBjeWxpbmRlcnM9JDEKCSAgaGVhZHM9JDIKCSAgc2VjdG9ycz0kMwoJ ICBwYXJ0aXRpb249JExPT1BST09UCgkgIHN0YXJ0PTYzCgkkTElMT19DT01NT04KCUVPRgoK CWNocm9vdCAiJFJPT1RGUyIgbGlsbyAtQyAvZXRjL2xpbG8tbG9vcC5jb25mCgoJY2F0ID4g IiRST09URlMiL2V0Yy9saWxvLmNvbmYgPDwtRU9GCglib290PSRCTE9DS0RFVgoJJExJTE9f Q09NTU9OCglFT0YKCTs7CmdydWItZWZpKQoJY2hyb290ICIkUk9PVEZTIiBncnViLW1rY29u ZmlnIC1vIC9ib290L2dydWIvZ3J1Yi5jZmcKCWNhc2UgIiRBUkNIIiBpbgoJCSo4NikKCQkJ Y2hyb290ICIkUk9PVEZTIiBncnViLWluc3RhbGwgLS10YXJnZXQ9aTM4Ni1lZmkgLS1yZW1v dmFibGUKCQkJc2VkIC1pICdzL2luaXRyZDE2L2luaXRyZGVmaS9nJyAiJFJPT1RGUy9ib290 L2dydWIvZ3J1Yi5jZmciCgkJCXNlZCAtaSAncy9saW51eDE2L2xpbnV4ZWZpL2cnICIkUk9P VEZTL2Jvb3QvZ3J1Yi9ncnViLmNmZyIKCQk7OwoJCXg4Nl82NCkKCQkJY2hyb290ICIkUk9P VEZTIiBncnViLWluc3RhbGwgLS10YXJnZXQ9aTM4Ni1lZmkgLS1yZW1vdmFibGUKCQkJY2hy b290ICIkUk9PVEZTIiBncnViLWluc3RhbGwgLS10YXJnZXQ9eDg2XzY0LWVmaSAtLXJlbW92 YWJsZQoJCQlzZWQgLWkgJ3MvaW5pdHJkMTYvaW5pdHJkZWZpL2cnICIkUk9PVEZTL2Jvb3Qv Z3J1Yi9ncnViLmNmZyIKCQkJc2VkIC1pICdzL2xpbnV4MTYvbGludXhlZmkvZycgIiRST09U RlMvYm9vdC9ncnViL2dydWIuY2ZnIgoJCTs7CgkJYWFyY2g2NCkKCQkJY2hyb290ICIkUk9P VEZTIiBncnViLWluc3RhbGwgLS10YXJnZXQ9YXJtNjQtZWZpIC0tcmVtb3ZhYmxlCgkJOzsK CQlhcm1oKQoJCQljaHJvb3QgIiRST09URlMiIGdydWItaW5zdGFsbCAtLXRhcmdldD1hcm0t ZWZpIC0tcmVtb3ZhYmxlCgkJOzsKCWVzYWMKCTs7CmdydWIpCgljaHJvb3QgIiRST09URlMi IGdydWItbWtjb25maWcgLW8gL2Jvb3QvZ3J1Yi9ncnViLmNmZwoJY2FzZSAiJEFSQ0giIGlu CgkJKjg2KikKCQkJY2hyb290ICIkUk9PVEZTIiBncnViLWluc3RhbGwgLS10YXJnZXQ9aTM4 Ni1wYyAiJExPT1BERVYiCgkJCXNlZCAtaSAncy9pbml0cmRlZmkvaW5pdHJkMTYvZycgIiRS T09URlMvYm9vdC9ncnViL2dydWIuY2ZnIgoJCQlzZWQgLWkgJ3MvbGludXhlZmkvbGludXgx Ni9nJyAiJFJPT1RGUy9ib290L2dydWIvZ3J1Yi5jZmciCgkJCTs7CgkJcHBjKikKCQkJWyAt eiAiJExPT1BCT09UTE9BREVSIiBdIHx8CgkJCQljaHJvb3QgIiRST09URlMiIGdydWItaW5z dGFsbCAtLXRhcmdldD1wb3dlcnBjLWllZWUxMjc1IFwKCQkJCS0tbm8tbnZyYW0gIiRMT09Q Qk9PVExPQURFUiIKCQkJOzsKCWVzYWMKCTs7CmVzYWMKCmlmIFsgLW4gIiRTVURPX1VTRVIi IF07IHRoZW4KCWNob3duICIkU1VET19VU0VSOiQoaWQgLWcgIiRTVURPX1VTRVIiKSIgIiRJ TUciIHx8OgpmaQojIG1heWJlIHFlbXUgaW50ZXJwcmV0ZXIgd2FzIGNvcGllZCB0byBjaHJv b3Q7CiMgdGhpcyBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LCByZW1vdmUKcm0gLXJmICIkUk9P VEZTIi8uaG9zdCB8fDoK --------------A1FCB4F734D5A2EC97FD6110--