From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-21.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 37D40C433E0 for ; Wed, 24 Feb 2021 17:01:21 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id DDE9364F0C for ; Wed, 24 Feb 2021 17:01:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235987AbhBXRBA (ORCPT ); Wed, 24 Feb 2021 12:01:00 -0500 Received: from mail.kernel.org ([198.145.29.99]:47282 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235671AbhBXQ7v (ORCPT ); Wed, 24 Feb 2021 11:59:51 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 39D2F64F04; Wed, 24 Feb 2021 16:59:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1614185948; bh=RC1Hqie9FwhCmTUkinEjd6H+PMv8wRNj93LvgGULsrg=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=t0jQJFORVOhuV4CQ7J5GV5hOKjgFDp/Alqkk4FiVkeFCWvT3UFn85c3EKWCd4lQek DPNnaKEks+BP277ldAh7ifITHplT7xUMziRfAFSfhXFJLIHdAyMx2dFlM/GKn0NyHW 1MeQe1GFPHSmuVZHysfnhME2f7LsV8g6UVZ19beCZedWTQW2IFXCOAAJMEpCDRv200 OU8oztSCnfpEfEs265sT3ujHfHZz3qlq+/9bNvXsE4e1LlM9/gF10NRBAUjOVe4apz KL+SfkhJd1x2aenwNu8aIgZN762xBQcuKYcgGSVz6Hnn8Ni7HjjLIU4MfFap0ViRB0 wT3VwTlZ7Zvqw== Date: Wed, 24 Feb 2021 18:58:51 +0200 From: Jarkko Sakkinen To: Sumit Garg Cc: Jerome Forissier , "open list:SECURITY SUBSYSTEM" , Daniel Thompson , op-tee@lists.trustedfirmware.org, Jonathan Corbet , James Bottomley , Janne Karhunen , Linux Doc Mailing List , James Morris , Mimi Zohar , Linux Kernel Mailing List , David Howells , Luke Hinds , "open list:ASYMMETRIC KEYS" , Jarkko Sakkinen , Casey Schaufler , linux-integrity@vger.kernel.org, linux-arm-kernel , "Serge E. Hallyn" , dave.hansen@intel.com Subject: Re: [PATCH v8 2/4] KEYS: trusted: Introduce TEE based Trusted Keys Message-ID: References: <1486cfe8-bc30-1266-12bd-0049f2b64820@forissier.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: Precedence: bulk List-ID: X-Mailing-List: keyrings@vger.kernel.org On Mon, Feb 22, 2021 at 12:45:18PM +0530, Sumit Garg wrote: > On Tue, 16 Feb 2021 at 12:59, Jarkko Sakkinen wrote: > > > > On Mon, Feb 15, 2021 at 06:37:00PM +0530, Sumit Garg wrote: > > > On Fri, 12 Feb 2021 at 05:04, Jarkko Sakkinen wrote: > > > > > > > > On Mon, Jan 25, 2021 at 02:47:38PM +0530, Sumit Garg wrote: > > > > > Hi Jarkko, > > > > > > > > > > On Fri, 22 Jan 2021 at 23:42, Jarkko Sakkinen wrote: > > > > > > > > > > > > On Thu, Jan 21, 2021 at 05:23:45PM +0100, Jerome Forissier wrote: > > > > > > > > > > > > > > > > > > > > > On 1/21/21 4:24 PM, Jarkko Sakkinen wrote: > > > > > > > > On Thu, Jan 21, 2021 at 05:07:42PM +0200, Jarkko Sakkinen wrote: > > > > > > > >> On Thu, Jan 21, 2021 at 09:44:07AM +0100, Jerome Forissier wrote: > > > > > > > >>> > > > > > > > >>> > > > > > > > >>> On 1/21/21 1:02 AM, Jarkko Sakkinen via OP-TEE wrote: > > > > > > > >>>> On Wed, Jan 20, 2021 at 12:53:28PM +0530, Sumit Garg wrote: > > > > > > > >>>>> On Wed, 20 Jan 2021 at 07:01, Jarkko Sakkinen wrote: > > > > > > > >>>>>> > > > > > > > >>>>>> On Tue, Jan 19, 2021 at 12:30:42PM +0200, Jarkko Sakkinen wrote: > > > > > > > >>>>>>> On Fri, Jan 15, 2021 at 11:32:31AM +0530, Sumit Garg wrote: > > > > > > > >>>>>>>> On Thu, 14 Jan 2021 at 07:35, Jarkko Sakkinen wrote: > > > > > > > >>>>>>>>> > > > > > > > >>>>>>>>> On Wed, Jan 13, 2021 at 04:47:00PM +0530, Sumit Garg wrote: > > > > > > > >>>>>>>>>> Hi Jarkko, > > > > > > > >>>>>>>>>> > > > > > > > >>>>>>>>>> On Mon, 11 Jan 2021 at 22:05, Jarkko Sakkinen wrote: > > > > > > > >>>>>>>>>>> > > > > > > > >>>>>>>>>>> On Tue, Nov 03, 2020 at 09:31:44PM +0530, Sumit Garg wrote: > > > > > > > >>>>>>>>>>>> Add support for TEE based trusted keys where TEE provides the functionality > > > > > > > >>>>>>>>>>>> to seal and unseal trusted keys using hardware unique key. > > > > > > > >>>>>>>>>>>> > > > > > > > >>>>>>>>>>>> Refer to Documentation/tee.txt for detailed information about TEE. > > > > > > > >>>>>>>>>>>> > > > > > > > >>>>>>>>>>>> Signed-off-by: Sumit Garg > > > > > > > >>>>>>>>>>> > > > > > > > >>>>>>>>>>> I haven't yet got QEMU environment working with aarch64, this produces > > > > > > > >>>>>>>>>>> just a blank screen: > > > > > > > >>>>>>>>>>> > > > > > > > >>>>>>>>>>> ./output/host/usr/bin/qemu-system-aarch64 -M virt -cpu cortex-a53 -smp 1 -kernel output/images/Image -initrd output/images/rootfs.cpio -serial stdio > > > > > > > >>>>>>>>>>> > > > > > > > >>>>>>>>>>> My BuildRoot fork for TPM and keyring testing is located over here: > > > > > > > >>>>>>>>>>> > > > > > > > >>>>>>>>>>> https://git.kernel.org/pub/scm/linux/kernel/git/jarkko/buildroot-tpmdd.git/ > > > > > > > >>>>>>>>>>> > > > > > > > >>>>>>>>>>> The "ARM version" is at this point in aarch64 branch. Over time I will > > > > > > > >>>>>>>>>>> define tpmdd-x86_64 and tpmdd-aarch64 boards and everything will be then > > > > > > > >>>>>>>>>>> in the master branch. > > > > > > > >>>>>>>>>>> > > > > > > > >>>>>>>>>>> To create identical images you just need to > > > > > > > >>>>>>>>>>> > > > > > > > >>>>>>>>>>> $ make tpmdd_defconfig && make > > > > > > > >>>>>>>>>>> > > > > > > > >>>>>>>>>>> Can you check if you see anything obviously wrong? I'm eager to test this > > > > > > > >>>>>>>>>>> patch set, and in bigger picture I really need to have ready to run > > > > > > > >>>>>>>>>>> aarch64 environment available. > > > > > > > >>>>>>>>>> > > > > > > > >>>>>>>>>> I would rather suggest you to follow steps listed here [1] as to test > > > > > > > >>>>>>>>>> this feature on Qemu aarch64 we need to build firmwares such as TF-A, > > > > > > > >>>>>>>>>> OP-TEE, UEFI etc. which are all integrated into OP-TEE Qemu build > > > > > > > >>>>>>>>>> system [2]. And then it would be easier to migrate them to your > > > > > > > >>>>>>>>>> buildroot environment as well. > > > > > > > >>>>>>>>>> > > > > > > > >>>>>>>>>> [1] https://lists.trustedfirmware.org/pipermail/op-tee/2020-May/000027.html > > > > > > > >>>>>>>>>> [2] https://optee.readthedocs.io/en/latest/building/devices/qemu.html#qemu-v8 > > > > > > > >>>>>>>>>> > > > > > > > >>>>>>>>>> -Sumit > > > > > > > >>>>>>>>> > > > > > > > >>>>>>>>> Can you provide 'keyctl_change'? Otherwise, the steps are easy to follow. > > > > > > > >>>>>>>>> > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> $ cat keyctl_change > > > > > > > >>>>>>>> diff --git a/common.mk b/common.mk > > > > > > > >>>>>>>> index aeb7b41..663e528 100644 > > > > > > > >>>>>>>> --- a/common.mk > > > > > > > >>>>>>>> +++ b/common.mk > > > > > > > >>>>>>>> @@ -229,6 +229,7 @@ BR2_PACKAGE_OPTEE_TEST_SDK ?= $(OPTEE_OS_TA_DEV_KIT_DIR) > > > > > > > >>>>>>>> BR2_PACKAGE_OPTEE_TEST_SITE ?= $(OPTEE_TEST_PATH) > > > > > > > >>>>>>>> BR2_PACKAGE_STRACE ?= y > > > > > > > >>>>>>>> BR2_TARGET_GENERIC_GETTY_PORT ?= $(if > > > > > > > >>>>>>>> $(CFG_NW_CONSOLE_UART),ttyAMA$(CFG_NW_CONSOLE_UART),ttyAMA0) > > > > > > > >>>>>>>> +BR2_PACKAGE_KEYUTILS := y > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> # All BR2_* variables from the makefile or the environment are appended to > > > > > > > >>>>>>>> # ../out-br/extra.conf. All values are quoted "..." except y and n. > > > > > > > >>>>>>>> diff --git a/kconfigs/qemu.conf b/kconfigs/qemu.conf > > > > > > > >>>>>>>> index 368c18a..832ab74 100644 > > > > > > > >>>>>>>> --- a/kconfigs/qemu.conf > > > > > > > >>>>>>>> +++ b/kconfigs/qemu.conf > > > > > > > >>>>>>>> @@ -20,3 +20,5 @@ CONFIG_9P_FS=y > > > > > > > >>>>>>>> CONFIG_9P_FS_POSIX_ACL=y > > > > > > > >>>>>>>> CONFIG_HW_RANDOM=y > > > > > > > >>>>>>>> CONFIG_HW_RANDOM_VIRTIO=y > > > > > > > >>>>>>>> +CONFIG_TRUSTED_KEYS=y > > > > > > > >>>>>>>> +CONFIG_ENCRYPTED_KEYS=y > > > > > > > >>>>>>>> > > > > > > > >>>>>>>>> After I've successfully tested 2/4, I'd suggest that you roll out one more > > > > > > > >>>>>>>>> version and CC the documentation patch to Elaine and Mini, and clearly > > > > > > > >>>>>>>>> remark in the commit message that TEE is a standard, with a link to the > > > > > > > >>>>>>>>> specification. > > > > > > > >>>>>>>>> > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> Sure, I will roll out the next version after your testing. > > > > > > > >>>>>>> > > > > > > > >>>>>>> Thanks, I'll try this at instant, and give my feedback. > > > > > > > >>>>>> > > > > > > > >>>>>> I bump into this: > > > > > > > >>>>>> > > > > > > > >>>>>> $ make run-only > > > > > > > >>>>>> ln -sf /home/jarkko/devel/tpm/optee/build/../out-br/images/rootfs.cpio.gz /home/jarkko/devel/tpm/optee/build/../out/bin/ > > > > > > > >>>>>> ln: failed to create symbolic link '/home/jarkko/devel/tpm/optee/build/../out/bin/': No such file or directory > > > > > > > >>>>>> make: *** [Makefile:194: run-only] Error 1 > > > > > > > >>>>>> > > > > > > > >>>>> > > > > > > > >>>>> Could you check if the following directory tree is built after > > > > > > > >>>>> executing the below command? > > > > > > > >>>>> > > > > > > > >>>>> $ make -j`nproc` > > > > > > > >>>>> CFG_IN_TREE_EARLY_TAS=trusted_keys/f04a0fe7-1f5d-4b9b-abf7-619b85b4ce8c > > > > > > > >>>>> > > > > > > > >>>>> $ tree out/bin/ > > > > > > > >>>>> out/bin/ > > > > > > > >>>>> ├── bl1.bin -> /home/sumit/build/optee/build/../trusted-firmware-a/build/qemu/release/bl1.bin > > > > > > > >>>>> ├── bl2.bin -> /home/sumit/build/optee/build/../trusted-firmware-a/build/qemu/release/bl2.bin > > > > > > > >>>>> ├── bl31.bin -> > > > > > > > >>>>> /home/sumit/build/optee/build/../trusted-firmware-a/build/qemu/release/bl31.bin > > > > > > > >>>>> ├── bl32.bin -> > > > > > > > >>>>> /home/sumit/build/optee/build/../optee_os/out/arm/core/tee-header_v2.bin > > > > > > > >>>>> ├── bl32_extra1.bin -> > > > > > > > >>>>> /home/sumit/build/optee/build/../optee_os/out/arm/core/tee-pager_v2.bin > > > > > > > >>>>> ├── bl32_extra2.bin -> > > > > > > > >>>>> /home/sumit/build/optee/build/../optee_os/out/arm/core/tee-pageable_v2.bin > > > > > > > >>>>> ├── bl33.bin -> > > > > > > > >>>>> /home/sumit/build/optee/build/../edk2/Build/ArmVirtQemuKernel-AARCH64/RELEASE_GCC49/FV/QEMU_EFI.fd > > > > > > > >>>>> ├── Image -> /home/sumit/build/optee/build/../linux/arch/arm64/boot/Image > > > > > > > >>>>> └── rootfs.cpio.gz -> > > > > > > > >>>>> /home/sumit/build/optee/build/../out-br/images/rootfs.cpio.gz > > > > > > > >>>>> > > > > > > > >>>>> 0 directories, 9 files > > > > > > > >>>>> > > > > > > > >>>>> -Sumit > > > > > > > >>>> > > > > > > > >>>> I actually spotted a build error that was unnoticed last time: > > > > > > > >>>> > > > > > > > >>>> make[2]: Entering directory '/home/jarkko/devel/tpm/optee/edk2/BaseTools/Tests' > > > > > > > >>>> /bin/sh: 1: python: not found > > > > > > > >>>> > > > > > > > >>>> I'd prefer not to install Python2. It has been EOL over a year. > > > > > > > >>> > > > > > > > >>> AFAIK, everything should build fine with Python3. On my Ubuntu 20.04 > > > > > > > >>> machine, this is accomplished by installing package "python-is-python3" > > > > > > > >>> (after uninstalling "python-is-python2" if need be). > > > > > > > >>> > > > > > > > >>> $ ls -l /usr/bin/python > > > > > > > >>> lrwxrwxrwx 1 root root 7 Apr 15 2020 /usr/bin/python -> python3 > > > > > > > >> > > > > > > > >> Right, just found about this in unrelated context :-) [*] > > > > > > > >> > > > > > > > >> Hope this will work out... > > > > > > > >> > > > > > > > >> [*] https://github.com/surge-synthesizer/surge/pull/3655 > > > > > > > > > > > > > > > > Now I get > > > > > > > > > > > > > > > > Traceback (most recent call last): > > > > > > > > File "/home/jarkko/Projects/tpm/optee/edk2/BaseTools/Tests/RunTests.py", line 36, in > > > > > > > > allTests = GetAllTestsSuite() > > > > > > > > File "/home/jarkko/Projects/tpm/optee/edk2/BaseTools/Tests/RunTests.py", line 33, in GetAllTestsSuite > > > > > > > > return unittest.TestSuite([GetCTestSuite(), GetPythonTestSuite()]) > > > > > > > > File "/home/jarkko/Projects/tpm/optee/edk2/BaseTools/Tests/RunTests.py", line 25, in GetCTestSuite > > > > > > > > import CToolsTests > > > > > > > > File "/home/jarkko/Projects/tpm/optee/edk2/BaseTools/Tests/CToolsTests.py", line 22, in > > > > > > > > import TianoCompress > > > > > > > > File "/home/jarkko/Projects/tpm/optee/edk2/BaseTools/Tests/TianoCompress.py", line 69, in > > > > > > > > TheTestSuite = TestTools.MakeTheTestSuite(locals()) > > > > > > > > File "/home/jarkko/Projects/tpm/optee/edk2/BaseTools/Tests/TestTools.py", line 43, in MakeTheTestSuite > > > > > > > > for name, item in localItems.iteritems(): > > > > > > > > AttributeError: 'dict' object has no attribute 'iteritems' > > > > > > > > > > > > > > Right. Same here after removing all traces of Python2 from my system :-/ > > > > > > > > > > > > > > A couple of fixes are needed: > > > > > > > 1. EDK2 needs to be upgraded to tag or later [1] > > > > > > > 2. The PYTHON3_ENABLE environment variable needs to be set to TRUE [2] > > > > > > > > > > > > > > [1] https://github.com/OP-TEE/manifest/pull/177 > > > > > > > [2] https://github.com/OP-TEE/build/pull/450 > > > > > > > > > > > > BTW, Is to *really* impossible to test this with plain BuildRoot. It's > > > > > > obvious that this forks BR internally. > > > > > > > > > > > > I mean even if I get this working once, this will feels like a clumsy way > > > > > > to test Aarch64 regularly. I use BuildRoot extensively for x86 testing. And > > > > > > it would be nice to be able to start doing regular ARM testing. > > > > > > > > > > The main reason to guide you towards the OP-TEE build system is that > > > > > you will be able to build all the firmwares (TF-A, OP-TEE, edk2 etc.) > > > > > from source. If you don't need to rebuild those then I have prepared a > > > > > flash firmware binary blob for your testing (attached flash.bin). So > > > > > Qemu cmdline will look like: > > > > > > > > > > $ qemu-system-aarch64 -nographic -s -machine virt,secure=on -cpu > > > > > cortex-a57 -kernel out/bin/Image -no-acpi -append > > > > > 'console=ttyAMA0,38400 keep_bootcon root=/dev/vda2' -initrd > > > > > out/bin/rootfs.cpio.gz -smp 2 -m 1024 -bios flash.bin -d unimp > > > > > > > > I spentt couple of days to try to get this running. > > > > > > > > Here's the log: > > > > > > > > ❯ ./qemu.sh > > > > NOTICE: Booting Trusted Firmware > > > > NOTICE: BL1: v2.3():v2.3 > > > > NOTICE: BL1: Built : 13:28:04, Jan 25 2021 > > > > NOTICE: BL1: Booting BL2 > > > > NOTICE: BL2: v2.3():v2.3 > > > > NOTICE: BL2: Built : 13:28:06, Jan 25 2021 > > > > NOTICE: BL1: Booting BL31 > > > > NOTICE: BL31: v2.3():v2.3 > > > > NOTICE: BL31: Built : 13:28:08, Jan 25 2021 > > > > UEFI firmware (version built at 18:49:27 on Nov 18 2019) > > > > pflash_write: Write to buffer emulation is flawed > > > > pflash_write: Write to buffer emulation is flawed > > > > EFI stub: Booting Linux Kernel... > > > > EFI stub: Using DTB from configuration table > > > > EFI stub: Exiting boot services and installing virtual address map... > > > > Booting Linux on physical CPU 0x0000000000 [0x411fd070] > > > > Linux version 5.11.0-rc5 (jarkko@suppilovahvero) (aarch64-buildroot-linux-uclibc-gcc.br_real (Buildroot 2021.02-rc1-10-ga72c90b972) 9.3.0, GNU ld (GNU Binutils) 2.35.2) #1 SMP Thu Feb 11 22:04:53 EET 2021 > > > > Machine model: linux,dummy-virt > > > > efi: EFI v2.70 by EDK II > > > > efi: SMBIOS=0x7f520000 SMBIOS 3.0=0x7f500000 MEMATTR=0x7e59b018 MEMRESERVE=0x7c143f18 > > > > Zone ranges: > > > > DMA [mem 0x0000000040000000-0x000000007fffffff] > > > > DMA32 empty > > > > Normal empty > > > > Movable zone start for each node > > > > Early memory node ranges > > > > node 0: [mem 0x0000000040000000-0x0000000041ffffff] > > > > node 0: [mem 0x0000000042200000-0x000000007be3ffff] > > > > node 0: [mem 0x000000007be40000-0x000000007c13ffff] > > > > node 0: [mem 0x000000007c140000-0x000000007f41ffff] > > > > node 0: [mem 0x000000007f420000-0x000000007f4affff] > > > > node 0: [mem 0x000000007f4b0000-0x000000007f4cffff] > > > > node 0: [mem 0x000000007f4d0000-0x000000007f5dffff] > > > > node 0: [mem 0x000000007f5e0000-0x000000007fffffff] > > > > Zeroed struct page in unavailable ranges: 864 pages > > > > Initmem setup node 0 [mem 0x0000000040000000-0x000000007fffffff] > > > > psci: probing for conduit method from DT. > > > > psci: PSCIv1.1 detected in firmware. > > > > psci: Using standard PSCI v0.2 function IDs > > > > psci: Trusted OS migration not required > > > > psci: SMC Calling Convention v1.2 > > > > percpu: Embedded 21 pages/cpu s48024 r8192 d29800 u86016 > > > > Detected PIPT I-cache on CPU0 > > > > CPU features: detected: ARM erratum 832075 > > > > CPU features: detected: Spectre-v2 > > > > CPU features: detected: ARM errata 1165522, 1319367, or 1530923 > > > > Built 1 zonelists, mobility grouping on. Total pages: 257536 > > > > Kernel command line: root=/dev/vda rw console=ttyAMA0,115200 > > > > Dentry cache hash table entries: 131072 (order: 8, 1048576 bytes, linear) > > > > Inode-cache hash table entries: 65536 (order: 7, 524288 bytes, linear) > > > > mem auto-init: stack:off, heap alloc:off, heap free:off > > > > Memory: 1011284K/1046528K available (6592K kernel code, 804K rwdata, 1460K rodata, 1088K init, 321K bss, 35244K reserved, 0K cma-reserved) > > > > SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 > > > > rcu: Hierarchical RCU implementation. > > > > rcu: RCU restricting CPUs from NR_CPUS=256 to nr_cpu_ids=1. > > > > rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies. > > > > rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1 > > > > NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0 > > > > GICv2m: range[mem 0x08020000-0x08020fff], SPI[80:143] > > > > random: get_random_bytes called from start_kernel+0x340/0x53c with crng_init=0 > > > > arch_timer: cp15 timer(s) running at 62.50MHz (virt). > > > > clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x1cd42e208c, max_idle_ns: 881590405314 ns > > > > sched_clock: 56 bits at 62MHz, resolution 16ns, wraps every 4398046511096ns > > > > Console: colour dummy device 80x25 > > > > Calibrating delay loop (skipped), value calculated using timer frequency.. 125.00 BogoMIPS (lpj=250000) > > > > pid_max: default: 32768 minimum: 301 > > > > Mount-cache hash table entries: 2048 (order: 2, 16384 bytes, linear) > > > > Mountpoint-cache hash table entries: 2048 (order: 2, 16384 bytes, linear) > > > > rcu: Hierarchical SRCU implementation. > > > > Remapping and enabling EFI services. > > > > smp: Bringing up secondary CPUs ... > > > > smp: Brought up 1 node, 1 CPU > > > > SMP: Total of 1 processors activated. > > > > CPU features: detected: 32-bit EL0 Support > > > > CPU features: detected: CRC32 instructions > > > > CPU: All CPU(s) started at EL1 > > > > alternatives: patching kernel code > > > > devtmpfs: initialized > > > > clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns > > > > futex hash table entries: 256 (order: 2, 16384 bytes, linear) > > > > SMBIOS 3.0.0 present. > > > > DMI: QEMU QEMU Virtual Machine, BIOS 0.0.0 02/06/2015 > > > > NET: Registered protocol family 16 > > > > DMA: preallocated 128 KiB GFP_KERNEL pool for atomic allocations > > > > DMA: preallocated 128 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations > > > > DMA: preallocated 128 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations > > > > hw-breakpoint: found 6 breakpoint and 4 watchpoint registers. > > > > ASID allocator initialised with 65536 entries > > > > Serial: AMBA PL011 UART driver > > > > 9000000.pl011: ttyAMA0 at MMIO 0x9000000 (irq = 46, base_baud = 0) is a PL011 rev1 > > > > printk: console [ttyAMA0] enabled > > > > iommu: Default domain type: Translated > > > > vgaarb: loaded > > > > SCSI subsystem initialized > > > > Registered efivars operations > > > > clocksource: Switched to clocksource arch_sys_counter > > > > NET: Registered protocol family 2 > > > > tcp_listen_portaddr_hash hash table entries: 512 (order: 1, 8192 bytes, linear) > > > > TCP established hash table entries: 8192 (order: 4, 65536 bytes, linear) > > > > TCP bind hash table entries: 8192 (order: 5, 131072 bytes, linear) > > > > TCP: Hash tables configured (established 8192 bind 8192) > > > > UDP hash table entries: 512 (order: 2, 16384 bytes, linear) > > > > UDP-Lite hash table entries: 512 (order: 2, 16384 bytes, linear) > > > > NET: Registered protocol family 1 > > > > PCI: CLS 0 bytes, default 64 > > > > hw perfevents: enabled with armv8_pmuv3 PMU driver, 5 counters available > > > > workingset: timestamp_bits=62 max_order=18 bucket_order=0 > > > > fuse: init (API version 7.33) > > > > Block layer SCSI generic (bsg) driver version 0.4 loaded (major 251) > > > > io scheduler mq-deadline registered > > > > io scheduler kyber registered > > > > pci-host-generic 4010000000.pcie: host bridge /pcie@10000000 ranges: > > > > pci-host-generic 4010000000.pcie: IO 0x003eff0000..0x003effffff -> 0x0000000000 > > > > pci-host-generic 4010000000.pcie: MEM 0x0010000000..0x003efeffff -> 0x0010000000 > > > > pci-host-generic 4010000000.pcie: MEM 0x8000000000..0xffffffffff -> 0x8000000000 > > > > pci-host-generic 4010000000.pcie: Memory resource size exceeds max for 32 bits > > > > pci-host-generic 4010000000.pcie: ECAM at [mem 0x4010000000-0x401fffffff] for [bus 00-ff] > > > > pci-host-generic 4010000000.pcie: PCI host bridge to bus 0000:00 > > > > pci_bus 0000:00: root bus resource [bus 00-ff] > > > > pci_bus 0000:00: root bus resource [io 0x0000-0xffff] > > > > pci_bus 0000:00: root bus resource [mem 0x10000000-0x3efeffff] > > > > pci_bus 0000:00: root bus resource [mem 0x8000000000-0xffffffffff] > > > > pci 0000:00:00.0: [1b36:0008] type 00 class 0x060000 > > > > pci 0000:00:01.0: [1af4:1000] type 00 class 0x020000 > > > > pci 0000:00:01.0: reg 0x10: [io 0x0080-0x009f] > > > > pci 0000:00:01.0: reg 0x14: [mem 0x10001000-0x10001fff] > > > > pci 0000:00:01.0: reg 0x20: [mem 0x8000000000-0x8000003fff 64bit pref] > > > > pci 0000:00:01.0: reg 0x30: [mem 0xfffc0000-0xffffffff pref] > > > > pci 0000:00:02.0: [1af4:1001] type 00 class 0x010000 > > > > pci 0000:00:02.0: reg 0x10: [io 0x0000-0x007f] > > > > pci 0000:00:02.0: reg 0x14: [mem 0x10000000-0x10000fff] > > > > pci 0000:00:02.0: reg 0x20: [mem 0x8000004000-0x8000007fff 64bit pref] > > > > pci 0000:00:01.0: BAR 6: assigned [mem 0x10000000-0x1003ffff pref] > > > > pci 0000:00:01.0: BAR 4: assigned [mem 0x8000000000-0x8000003fff 64bit pref] > > > > pci 0000:00:02.0: BAR 4: assigned [mem 0x8000004000-0x8000007fff 64bit pref] > > > > pci 0000:00:01.0: BAR 1: assigned [mem 0x10040000-0x10040fff] > > > > pci 0000:00:02.0: BAR 1: assigned [mem 0x10041000-0x10041fff] > > > > pci 0000:00:02.0: BAR 0: assigned [io 0x1000-0x107f] > > > > pci 0000:00:01.0: BAR 0: assigned [io 0x1080-0x109f] > > > > virtio-pci 0000:00:01.0: enabling device (0000 -> 0003) > > > > virtio-pci 0000:00:02.0: enabling device (0000 -> 0003) > > > > cacheinfo: Unable to detect cache hierarchy for CPU 0 > > > > virtio_blk virtio1: [vda] 122880 512-byte logical blocks (62.9 MB/60.0 MiB) > > > > SMCCC: SOC_ID: ARCH_FEATURES(ARCH_SOC_ID) returned error: fffffffffffffffd > > > > NET: Registered protocol family 10 > > > > Segment Routing with IPv6 > > > > sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver > > > > NET: Registered protocol family 17 > > > > NET: Registered protocol family 15 > > > > NET: Registered protocol family 40 > > > > registered taskstats version 1 > > > > EXT4-fs (vda): recovery complete > > > > EXT4-fs (vda): mounted filesystem with ordered data mode. Opts: (null). Quota mode: disabled. > > > > VFS: Mounted root (ext4 filesystem) on device 254:0. > > > > devtmpfs: mounted > > > > Freeing unused kernel memory: 1088K > > > > Run /sbin/init as init process > > > > mount: you must be root > > > > mount: you must be root > > > > mkdir: can't create directory '/dev/pts': Permission denied > > > > mkdir: can't create directory '/dev/shm': Permission denied > > > > mount: you must be root > > > > hostname: sethostname: Operation not permitted > > > > Starting syslogd: OK > > > > Starting klogd: OK > > > > Running sysctl: OK > > > > Initializing random number generator: OK > > > > Saving random seed: random: dd: uninitialized urandom read (512 bytes read) > > > > OK > > > > Starting network: ip: RTNETLINK answers: Operation not permitted > > > > ip: SIOCSIFFLAGS: Operation not permitted > > > > sed: /proc/mounts: No such file or directory > > > > Waiting for interface eth0 to appear............... timeout! > > > > run-parts: /etc/network/if-pre-up.d/wait_iface: exit status 1 > > > > FAIL > > > > can't open /dev/ttyAMA0: Permission denied > > > > can't open /dev/ttyAMA0: Permission denied > > > > can't open /dev/ttyAMA0: Permission denied > > > > can't open /dev/ttyAMA0: Permission denied > > > > > > > > And it continues... > > > > > > > > The qemu command I got did not work "as it is" and because I'm neither too > > > > proficient with qemu nor aarch64, it took a while to get something usable. > > > > This is my current qemu command: > > > > > > > > qemu-system-aarch64 -nographic -s -machine virt,secure=on -cpu cortex-a57 \ > > > > -kernel ~/Projects/tpm/buildroot/output/images/Image \ > > > > -no-acpi \ > > > > -append 'root=/dev/vda rw console=ttyAMA0,115200 ' \ > > > > -drive file=~/Projects/tpm/buildroot/output/images/rootfs.ext4,format=raw \ > > > > -smp 1 \ > > > > -monitor telnet:127.0.0.1:55555,server,nowait \ > > > > -m 1024 -bios ~/Projects/tpm/fw/aarch64-fw.bin -d unimp > > > > > > > > Then I start QEMU monitor from another terminal with: > > > > > > > > socat tcp-connect:127.0.0.1:55555 file:`tty`,raw,echo=0 > > > > > > > > So... what could be the issue with permissions? > > > > > > > > > > It mostly sounds like an issue with your buildroot filesystem. > > > > > > Can you try with this [1] init ramdisk instead? > > > > > > -initrd rootfs.cpio.gz > > > > > > [1] https://people.linaro.org/~sumit.garg/rootfs.cpio.gz > > > > > > -Sumit > > > > That does not include my LKM's. > > > > You can give a try with my kernel image [1] which has required built > in kernel modules. Also, you should be able to build a similar kernel > image. > > [1] https://people.linaro.org/~sumit.garg/Image It comes down to that I need to be able to build my own kernel and user space. I need to be able to build my own kernel. There's been some bugs that I've reported back to BuildRoot with the latest kernel tree and also with binutils [*]. I'll retry once they are fixed, and try to find out what it causing the problem. [*] https://bugs.busybox.net/show_bug.cgi?id=13546 /Jarkko From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jarkko Sakkinen To: op-tee@lists.trustedfirmware.org Subject: Re: [PATCH v8 2/4] KEYS: trusted: Introduce TEE based Trusted Keys Date: Wed, 24 Feb 2021 18:58:51 +0200 Message-ID: In-Reply-To: < > MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1725252144775717918==" List-Id: --===============1725252144775717918== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable On Mon, Feb 22, 2021 at 12:45:18PM +0530, Sumit Garg wrote: > On Tue, 16 Feb 2021 at 12:59, Jarkko Sakkinen wrote: > > > > On Mon, Feb 15, 2021 at 06:37:00PM +0530, Sumit Garg wrote: > > > On Fri, 12 Feb 2021 at 05:04, Jarkko Sakkinen wro= te: > > > > > > > > On Mon, Jan 25, 2021 at 02:47:38PM +0530, Sumit Garg wrote: > > > > > Hi Jarkko, > > > > > > > > > > On Fri, 22 Jan 2021 at 23:42, Jarkko Sakkinen = wrote: > > > > > > > > > > > > On Thu, Jan 21, 2021 at 05:23:45PM +0100, Jerome Forissier wrote: > > > > > > > > > > > > > > > > > > > > > On 1/21/21 4:24 PM, Jarkko Sakkinen wrote: > > > > > > > > On Thu, Jan 21, 2021 at 05:07:42PM +0200, Jarkko Sakkinen wro= te: > > > > > > > >> On Thu, Jan 21, 2021 at 09:44:07AM +0100, Jerome Forissier w= rote: > > > > > > > >>> > > > > > > > >>> > > > > > > > >>> On 1/21/21 1:02 AM, Jarkko Sakkinen via OP-TEE wrote: > > > > > > > >>>> On Wed, Jan 20, 2021 at 12:53:28PM +0530, Sumit Garg wrote: > > > > > > > >>>>> On Wed, 20 Jan 2021 at 07:01, Jarkko Sakkinen wrote: > > > > > > > >>>>>> > > > > > > > >>>>>> On Tue, Jan 19, 2021 at 12:30:42PM +0200, Jarkko Sakkine= n wrote: > > > > > > > >>>>>>> On Fri, Jan 15, 2021 at 11:32:31AM +0530, Sumit Garg wr= ote: > > > > > > > >>>>>>>> On Thu, 14 Jan 2021 at 07:35, Jarkko Sakkinen wrote: > > > > > > > >>>>>>>>> > > > > > > > >>>>>>>>> On Wed, Jan 13, 2021 at 04:47:00PM +0530, Sumit Garg = wrote: > > > > > > > >>>>>>>>>> Hi Jarkko, > > > > > > > >>>>>>>>>> > > > > > > > >>>>>>>>>> On Mon, 11 Jan 2021 at 22:05, Jarkko Sakkinen wrote: > > > > > > > >>>>>>>>>>> > > > > > > > >>>>>>>>>>> On Tue, Nov 03, 2020 at 09:31:44PM +0530, Sumit Gar= g wrote: > > > > > > > >>>>>>>>>>>> Add support for TEE based trusted keys where TEE p= rovides the functionality > > > > > > > >>>>>>>>>>>> to seal and unseal trusted keys using hardware uni= que key. > > > > > > > >>>>>>>>>>>> > > > > > > > >>>>>>>>>>>> Refer to Documentation/tee.txt for detailed inform= ation about TEE. > > > > > > > >>>>>>>>>>>> > > > > > > > >>>>>>>>>>>> Signed-off-by: Sumit Garg > > > > > > > >>>>>>>>>>> > > > > > > > >>>>>>>>>>> I haven't yet got QEMU environment working with aar= ch64, this produces > > > > > > > >>>>>>>>>>> just a blank screen: > > > > > > > >>>>>>>>>>> > > > > > > > >>>>>>>>>>> ./output/host/usr/bin/qemu-system-aarch64 -M virt -= cpu cortex-a53 -smp 1 -kernel output/images/Image -initrd output/images/rootf= s.cpio -serial stdio > > > > > > > >>>>>>>>>>> > > > > > > > >>>>>>>>>>> My BuildRoot fork for TPM and keyring testing is lo= cated over here: > > > > > > > >>>>>>>>>>> > > > > > > > >>>>>>>>>>> https://git.kernel.org/pub/scm/linux/kernel/git/jar= kko/buildroot-tpmdd.git/ > > > > > > > >>>>>>>>>>> > > > > > > > >>>>>>>>>>> The "ARM version" is at this point in aarch64 branc= h. Over time I will > > > > > > > >>>>>>>>>>> define tpmdd-x86_64 and tpmdd-aarch64 boards and ev= erything will be then > > > > > > > >>>>>>>>>>> in the master branch. > > > > > > > >>>>>>>>>>> > > > > > > > >>>>>>>>>>> To create identical images you just need to > > > > > > > >>>>>>>>>>> > > > > > > > >>>>>>>>>>> $ make tpmdd_defconfig && make > > > > > > > >>>>>>>>>>> > > > > > > > >>>>>>>>>>> Can you check if you see anything obviously wrong? = I'm eager to test this > > > > > > > >>>>>>>>>>> patch set, and in bigger picture I really need to h= ave ready to run > > > > > > > >>>>>>>>>>> aarch64 environment available. > > > > > > > >>>>>>>>>> > > > > > > > >>>>>>>>>> I would rather suggest you to follow steps listed he= re [1] as to test > > > > > > > >>>>>>>>>> this feature on Qemu aarch64 we need to build firmwa= res such as TF-A, > > > > > > > >>>>>>>>>> OP-TEE, UEFI etc. which are all integrated into OP-T= EE Qemu build > > > > > > > >>>>>>>>>> system [2]. And then it would be easier to migrate t= hem to your > > > > > > > >>>>>>>>>> buildroot environment as well. > > > > > > > >>>>>>>>>> > > > > > > > >>>>>>>>>> [1] https://lists.trustedfirmware.org/pipermail/op-t= ee/2020-May/000027.html > > > > > > > >>>>>>>>>> [2] https://optee.readthedocs.io/en/latest/building/= devices/qemu.html#qemu-v8 > > > > > > > >>>>>>>>>> > > > > > > > >>>>>>>>>> -Sumit > > > > > > > >>>>>>>>> > > > > > > > >>>>>>>>> Can you provide 'keyctl_change'? Otherwise, the steps= are easy to follow. > > > > > > > >>>>>>>>> > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> $ cat keyctl_change > > > > > > > >>>>>>>> diff --git a/common.mk b/common.mk > > > > > > > >>>>>>>> index aeb7b41..663e528 100644 > > > > > > > >>>>>>>> --- a/common.mk > > > > > > > >>>>>>>> +++ b/common.mk > > > > > > > >>>>>>>> @@ -229,6 +229,7 @@ BR2_PACKAGE_OPTEE_TEST_SDK ?=3D $(= OPTEE_OS_TA_DEV_KIT_DIR) > > > > > > > >>>>>>>> BR2_PACKAGE_OPTEE_TEST_SITE ?=3D $(OPTEE_TEST_PATH) > > > > > > > >>>>>>>> BR2_PACKAGE_STRACE ?=3D y > > > > > > > >>>>>>>> BR2_TARGET_GENERIC_GETTY_PORT ?=3D $(if > > > > > > > >>>>>>>> $(CFG_NW_CONSOLE_UART),ttyAMA$(CFG_NW_CONSOLE_UART),tt= yAMA0) > > > > > > > >>>>>>>> +BR2_PACKAGE_KEYUTILS :=3D y > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> # All BR2_* variables from the makefile or the enviro= nment are appended to > > > > > > > >>>>>>>> # ../out-br/extra.conf. All values are quoted "..." e= xcept y and n. > > > > > > > >>>>>>>> diff --git a/kconfigs/qemu.conf b/kconfigs/qemu.conf > > > > > > > >>>>>>>> index 368c18a..832ab74 100644 > > > > > > > >>>>>>>> --- a/kconfigs/qemu.conf > > > > > > > >>>>>>>> +++ b/kconfigs/qemu.conf > > > > > > > >>>>>>>> @@ -20,3 +20,5 @@ CONFIG_9P_FS=3Dy > > > > > > > >>>>>>>> CONFIG_9P_FS_POSIX_ACL=3Dy > > > > > > > >>>>>>>> CONFIG_HW_RANDOM=3Dy > > > > > > > >>>>>>>> CONFIG_HW_RANDOM_VIRTIO=3Dy > > > > > > > >>>>>>>> +CONFIG_TRUSTED_KEYS=3Dy > > > > > > > >>>>>>>> +CONFIG_ENCRYPTED_KEYS=3Dy > > > > > > > >>>>>>>> > > > > > > > >>>>>>>>> After I've successfully tested 2/4, I'd suggest that = you roll out one more > > > > > > > >>>>>>>>> version and CC the documentation patch to Elaine and = Mini, and clearly > > > > > > > >>>>>>>>> remark in the commit message that TEE is a standard, = with a link to the > > > > > > > >>>>>>>>> specification. > > > > > > > >>>>>>>>> > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> Sure, I will roll out the next version after your test= ing. > > > > > > > >>>>>>> > > > > > > > >>>>>>> Thanks, I'll try this at instant, and give my feedback. > > > > > > > >>>>>> > > > > > > > >>>>>> I bump into this: > > > > > > > >>>>>> > > > > > > > >>>>>> $ make run-only > > > > > > > >>>>>> ln -sf /home/jarkko/devel/tpm/optee/build/../out-br/imag= es/rootfs.cpio.gz /home/jarkko/devel/tpm/optee/build/../out/bin/ > > > > > > > >>>>>> ln: failed to create symbolic link '/home/jarkko/devel/t= pm/optee/build/../out/bin/': No such file or directory > > > > > > > >>>>>> make: *** [Makefile:194: run-only] Error 1 > > > > > > > >>>>>> > > > > > > > >>>>> > > > > > > > >>>>> Could you check if the following directory tree is built = after > > > > > > > >>>>> executing the below command? > > > > > > > >>>>> > > > > > > > >>>>> $ make -j`nproc` > > > > > > > >>>>> CFG_IN_TREE_EARLY_TAS=3Dtrusted_keys/f04a0fe7-1f5d-4b9b-a= bf7-619b85b4ce8c > > > > > > > >>>>> > > > > > > > >>>>> $ tree out/bin/ > > > > > > > >>>>> out/bin/ > > > > > > > >>>>> =E2=94=9C=E2=94=80=E2=94=80 bl1.bin -> /home/sumit/build/= optee/build/../trusted-firmware-a/build/qemu/release/bl1.bin > > > > > > > >>>>> =E2=94=9C=E2=94=80=E2=94=80 bl2.bin -> /home/sumit/build/= optee/build/../trusted-firmware-a/build/qemu/release/bl2.bin > > > > > > > >>>>> =E2=94=9C=E2=94=80=E2=94=80 bl31.bin -> > > > > > > > >>>>> /home/sumit/build/optee/build/../trusted-firmware-a/build= /qemu/release/bl31.bin > > > > > > > >>>>> =E2=94=9C=E2=94=80=E2=94=80 bl32.bin -> > > > > > > > >>>>> /home/sumit/build/optee/build/../optee_os/out/arm/core/te= e-header_v2.bin > > > > > > > >>>>> =E2=94=9C=E2=94=80=E2=94=80 bl32_extra1.bin -> > > > > > > > >>>>> /home/sumit/build/optee/build/../optee_os/out/arm/core/te= e-pager_v2.bin > > > > > > > >>>>> =E2=94=9C=E2=94=80=E2=94=80 bl32_extra2.bin -> > > > > > > > >>>>> /home/sumit/build/optee/build/../optee_os/out/arm/core/te= e-pageable_v2.bin > > > > > > > >>>>> =E2=94=9C=E2=94=80=E2=94=80 bl33.bin -> > > > > > > > >>>>> /home/sumit/build/optee/build/../edk2/Build/ArmVirtQemuKe= rnel-AARCH64/RELEASE_GCC49/FV/QEMU_EFI.fd > > > > > > > >>>>> =E2=94=9C=E2=94=80=E2=94=80 Image -> /home/sumit/build/op= tee/build/../linux/arch/arm64/boot/Image > > > > > > > >>>>> =E2=94=94=E2=94=80=E2=94=80 rootfs.cpio.gz -> > > > > > > > >>>>> /home/sumit/build/optee/build/../out-br/images/rootfs.cpi= o.gz > > > > > > > >>>>> > > > > > > > >>>>> 0 directories, 9 files > > > > > > > >>>>> > > > > > > > >>>>> -Sumit > > > > > > > >>>> > > > > > > > >>>> I actually spotted a build error that was unnoticed last t= ime: > > > > > > > >>>> > > > > > > > >>>> make[2]: Entering directory '/home/jarkko/devel/tpm/optee/= edk2/BaseTools/Tests' > > > > > > > >>>> /bin/sh: 1: python: not found > > > > > > > >>>> > > > > > > > >>>> I'd prefer not to install Python2. It has been EOL over a = year. > > > > > > > >>> > > > > > > > >>> AFAIK, everything should build fine with Python3. On my Ubu= ntu 20.04 > > > > > > > >>> machine, this is accomplished by installing package "python= -is-python3" > > > > > > > >>> (after uninstalling "python-is-python2" if need be). > > > > > > > >>> > > > > > > > >>> $ ls -l /usr/bin/python > > > > > > > >>> lrwxrwxrwx 1 root root 7 Apr 15 2020 /usr/bin/python -> py= thon3 > > > > > > > >> > > > > > > > >> Right, just found about this in unrelated context :-) [*] > > > > > > > >> > > > > > > > >> Hope this will work out... > > > > > > > >> > > > > > > > >> [*] https://github.com/surge-synthesizer/surge/pull/3655 > > > > > > > > > > > > > > > > Now I get > > > > > > > > > > > > > > > > Traceback (most recent call last): > > > > > > > > File "/home/jarkko/Projects/tpm/optee/edk2/BaseTools/Tests/= RunTests.py", line 36, in > > > > > > > > allTests =3D GetAllTestsSuite() > > > > > > > > File "/home/jarkko/Projects/tpm/optee/edk2/BaseTools/Tests/= RunTests.py", line 33, in GetAllTestsSuite > > > > > > > > return unittest.TestSuite([GetCTestSuite(), GetPythonTest= Suite()]) > > > > > > > > File "/home/jarkko/Projects/tpm/optee/edk2/BaseTools/Tests/= RunTests.py", line 25, in GetCTestSuite > > > > > > > > import CToolsTests > > > > > > > > File "/home/jarkko/Projects/tpm/optee/edk2/BaseTools/Tests/= CToolsTests.py", line 22, in > > > > > > > > import TianoCompress > > > > > > > > File "/home/jarkko/Projects/tpm/optee/edk2/BaseTools/Tests/= TianoCompress.py", line 69, in > > > > > > > > TheTestSuite =3D TestTools.MakeTheTestSuite(locals()) > > > > > > > > File "/home/jarkko/Projects/tpm/optee/edk2/BaseTools/Tests/= TestTools.py", line 43, in MakeTheTestSuite > > > > > > > > for name, item in localItems.iteritems(): > > > > > > > > AttributeError: 'dict' object has no attribute 'iteritems' > > > > > > > > > > > > > > Right. Same here after removing all traces of Python2 from my s= ystem :-/ > > > > > > > > > > > > > > A couple of fixes are needed: > > > > > > > 1. EDK2 needs to be upgraded to tag or later [1] > > > > > > > 2. The PYTHON3_ENABLE environment variable needs to be set to T= RUE [2] > > > > > > > > > > > > > > [1] https://github.com/OP-TEE/manifest/pull/177 > > > > > > > [2] https://github.com/OP-TEE/build/pull/450 > > > > > > > > > > > > BTW, Is to *really* impossible to test this with plain BuildRoot.= It's > > > > > > obvious that this forks BR internally. > > > > > > > > > > > > I mean even if I get this working once, this will feels like a cl= umsy way > > > > > > to test Aarch64 regularly. I use BuildRoot extensively for x86 te= sting. And > > > > > > it would be nice to be able to start doing regular ARM testing. > > > > > > > > > > The main reason to guide you towards the OP-TEE build system is that > > > > > you will be able to build all the firmwares (TF-A, OP-TEE, edk2 etc= .) > > > > > from source. If you don't need to rebuild those then I have prepare= d a > > > > > flash firmware binary blob for your testing (attached flash.bin). So > > > > > Qemu cmdline will look like: > > > > > > > > > > $ qemu-system-aarch64 -nographic -s -machine virt,secure=3Don -cpu > > > > > cortex-a57 -kernel out/bin/Image -no-acpi -append > > > > > 'console=3DttyAMA0,38400 keep_bootcon root=3D/dev/vda2' -initrd > > > > > out/bin/rootfs.cpio.gz -smp 2 -m 1024 -bios flash.bin -d unimp > > > > > > > > I spentt couple of days to try to get this running. > > > > > > > > Here's the log: > > > > > > > > =E2=9D=AF ./qemu.sh > > > > NOTICE: Booting Trusted Firmware > > > > NOTICE: BL1: v2.3():v2.3 > > > > NOTICE: BL1: Built : 13:28:04, Jan 25 2021 > > > > NOTICE: BL1: Booting BL2 > > > > NOTICE: BL2: v2.3():v2.3 > > > > NOTICE: BL2: Built : 13:28:06, Jan 25 2021 > > > > NOTICE: BL1: Booting BL31 > > > > NOTICE: BL31: v2.3():v2.3 > > > > NOTICE: BL31: Built : 13:28:08, Jan 25 2021 > > > > UEFI firmware (version built at 18:49:27 on Nov 18 2019) > > > > pflash_write: Write to buffer emulation is flawed > > > > pflash_write: Write to buffer emulation is flawed > > > > EFI stub: Booting Linux Kernel... > > > > EFI stub: Using DTB from configuration table > > > > EFI stub: Exiting boot services and installing virtual address map... > > > > Booting Linux on physical CPU 0x0000000000 [0x411fd070] > > > > Linux version 5.11.0-rc5 (jarkko(a)suppilovahvero) (aarch64-buildroot= -linux-uclibc-gcc.br_real (Buildroot 2021.02-rc1-10-ga72c90b972) 9.3.0, GNU l= d (GNU Binutils) 2.35.2) #1 SMP Thu Feb 11 22:04:53 EET 2021 > > > > Machine model: linux,dummy-virt > > > > efi: EFI v2.70 by EDK II > > > > efi: SMBIOS=3D0x7f520000 SMBIOS 3.0=3D0x7f500000 MEMATTR=3D0x7e59b018= MEMRESERVE=3D0x7c143f18 > > > > Zone ranges: > > > > DMA [mem 0x0000000040000000-0x000000007fffffff] > > > > DMA32 empty > > > > Normal empty > > > > Movable zone start for each node > > > > Early memory node ranges > > > > node 0: [mem 0x0000000040000000-0x0000000041ffffff] > > > > node 0: [mem 0x0000000042200000-0x000000007be3ffff] > > > > node 0: [mem 0x000000007be40000-0x000000007c13ffff] > > > > node 0: [mem 0x000000007c140000-0x000000007f41ffff] > > > > node 0: [mem 0x000000007f420000-0x000000007f4affff] > > > > node 0: [mem 0x000000007f4b0000-0x000000007f4cffff] > > > > node 0: [mem 0x000000007f4d0000-0x000000007f5dffff] > > > > node 0: [mem 0x000000007f5e0000-0x000000007fffffff] > > > > Zeroed struct page in unavailable ranges: 864 pages > > > > Initmem setup node 0 [mem 0x0000000040000000-0x000000007fffffff] > > > > psci: probing for conduit method from DT. > > > > psci: PSCIv1.1 detected in firmware. > > > > psci: Using standard PSCI v0.2 function IDs > > > > psci: Trusted OS migration not required > > > > psci: SMC Calling Convention v1.2 > > > > percpu: Embedded 21 pages/cpu s48024 r8192 d29800 u86016 > > > > Detected PIPT I-cache on CPU0 > > > > CPU features: detected: ARM erratum 832075 > > > > CPU features: detected: Spectre-v2 > > > > CPU features: detected: ARM errata 1165522, 1319367, or 1530923 > > > > Built 1 zonelists, mobility grouping on. Total pages: 257536 > > > > Kernel command line: root=3D/dev/vda rw console=3DttyAMA0,115200 > > > > Dentry cache hash table entries: 131072 (order: 8, 1048576 bytes, lin= ear) > > > > Inode-cache hash table entries: 65536 (order: 7, 524288 bytes, linear) > > > > mem auto-init: stack:off, heap alloc:off, heap free:off > > > > Memory: 1011284K/1046528K available (6592K kernel code, 804K rwdata, = 1460K rodata, 1088K init, 321K bss, 35244K reserved, 0K cma-reserved) > > > > SLUB: HWalign=3D64, Order=3D0-3, MinObjects=3D0, CPUs=3D1, Nodes=3D1 > > > > rcu: Hierarchical RCU implementation. > > > > rcu: RCU restricting CPUs from NR_CPUS=3D256 to nr_cpu_ids=3D1. > > > > rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies. > > > > rcu: Adjusting geometry for rcu_fanout_leaf=3D16, nr_cpu_ids=3D1 > > > > NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0 > > > > GICv2m: range[mem 0x08020000-0x08020fff], SPI[80:143] > > > > random: get_random_bytes called from start_kernel+0x340/0x53c with cr= ng_init=3D0 > > > > arch_timer: cp15 timer(s) running at 62.50MHz (virt). > > > > clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x1= cd42e208c, max_idle_ns: 881590405314 ns > > > > sched_clock: 56 bits at 62MHz, resolution 16ns, wraps every 439804651= 1096ns > > > > Console: colour dummy device 80x25 > > > > Calibrating delay loop (skipped), value calculated using timer freque= ncy.. 125.00 BogoMIPS (lpj=3D250000) > > > > pid_max: default: 32768 minimum: 301 > > > > Mount-cache hash table entries: 2048 (order: 2, 16384 bytes, linear) > > > > Mountpoint-cache hash table entries: 2048 (order: 2, 16384 bytes, lin= ear) > > > > rcu: Hierarchical SRCU implementation. > > > > Remapping and enabling EFI services. > > > > smp: Bringing up secondary CPUs ... > > > > smp: Brought up 1 node, 1 CPU > > > > SMP: Total of 1 processors activated. > > > > CPU features: detected: 32-bit EL0 Support > > > > CPU features: detected: CRC32 instructions > > > > CPU: All CPU(s) started at EL1 > > > > alternatives: patching kernel code > > > > devtmpfs: initialized > > > > clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_id= le_ns: 7645041785100000 ns > > > > futex hash table entries: 256 (order: 2, 16384 bytes, linear) > > > > SMBIOS 3.0.0 present. > > > > DMI: QEMU QEMU Virtual Machine, BIOS 0.0.0 02/06/2015 > > > > NET: Registered protocol family 16 > > > > DMA: preallocated 128 KiB GFP_KERNEL pool for atomic allocations > > > > DMA: preallocated 128 KiB GFP_KERNEL|GFP_DMA pool for atomic allocati= ons > > > > DMA: preallocated 128 KiB GFP_KERNEL|GFP_DMA32 pool for atomic alloca= tions > > > > hw-breakpoint: found 6 breakpoint and 4 watchpoint registers. > > > > ASID allocator initialised with 65536 entries > > > > Serial: AMBA PL011 UART driver > > > > 9000000.pl011: ttyAMA0 at MMIO 0x9000000 (irq =3D 46, base_baud =3D 0= ) is a PL011 rev1 > > > > printk: console [ttyAMA0] enabled > > > > iommu: Default domain type: Translated > > > > vgaarb: loaded > > > > SCSI subsystem initialized > > > > Registered efivars operations > > > > clocksource: Switched to clocksource arch_sys_counter > > > > NET: Registered protocol family 2 > > > > tcp_listen_portaddr_hash hash table entries: 512 (order: 1, 8192 byte= s, linear) > > > > TCP established hash table entries: 8192 (order: 4, 65536 bytes, line= ar) > > > > TCP bind hash table entries: 8192 (order: 5, 131072 bytes, linear) > > > > TCP: Hash tables configured (established 8192 bind 8192) > > > > UDP hash table entries: 512 (order: 2, 16384 bytes, linear) > > > > UDP-Lite hash table entries: 512 (order: 2, 16384 bytes, linear) > > > > NET: Registered protocol family 1 > > > > PCI: CLS 0 bytes, default 64 > > > > hw perfevents: enabled with armv8_pmuv3 PMU driver, 5 counters availa= ble > > > > workingset: timestamp_bits=3D62 max_order=3D18 bucket_order=3D0 > > > > fuse: init (API version 7.33) > > > > Block layer SCSI generic (bsg) driver version 0.4 loaded (major 251) > > > > io scheduler mq-deadline registered > > > > io scheduler kyber registered > > > > pci-host-generic 4010000000.pcie: host bridge /pcie(a)10000000 ranges: > > > > pci-host-generic 4010000000.pcie: IO 0x003eff0000..0x003effffff= -> 0x0000000000 > > > > pci-host-generic 4010000000.pcie: MEM 0x0010000000..0x003efeffff= -> 0x0010000000 > > > > pci-host-generic 4010000000.pcie: MEM 0x8000000000..0xffffffffff= -> 0x8000000000 > > > > pci-host-generic 4010000000.pcie: Memory resource size exceeds max fo= r 32 bits > > > > pci-host-generic 4010000000.pcie: ECAM at [mem 0x4010000000-0x401ffff= fff] for [bus 00-ff] > > > > pci-host-generic 4010000000.pcie: PCI host bridge to bus 0000:00 > > > > pci_bus 0000:00: root bus resource [bus 00-ff] > > > > pci_bus 0000:00: root bus resource [io 0x0000-0xffff] > > > > pci_bus 0000:00: root bus resource [mem 0x10000000-0x3efeffff] > > > > pci_bus 0000:00: root bus resource [mem 0x8000000000-0xffffffffff] > > > > pci 0000:00:00.0: [1b36:0008] type 00 class 0x060000 > > > > pci 0000:00:01.0: [1af4:1000] type 00 class 0x020000 > > > > pci 0000:00:01.0: reg 0x10: [io 0x0080-0x009f] > > > > pci 0000:00:01.0: reg 0x14: [mem 0x10001000-0x10001fff] > > > > pci 0000:00:01.0: reg 0x20: [mem 0x8000000000-0x8000003fff 64bit pref] > > > > pci 0000:00:01.0: reg 0x30: [mem 0xfffc0000-0xffffffff pref] > > > > pci 0000:00:02.0: [1af4:1001] type 00 class 0x010000 > > > > pci 0000:00:02.0: reg 0x10: [io 0x0000-0x007f] > > > > pci 0000:00:02.0: reg 0x14: [mem 0x10000000-0x10000fff] > > > > pci 0000:00:02.0: reg 0x20: [mem 0x8000004000-0x8000007fff 64bit pref] > > > > pci 0000:00:01.0: BAR 6: assigned [mem 0x10000000-0x1003ffff pref] > > > > pci 0000:00:01.0: BAR 4: assigned [mem 0x8000000000-0x8000003fff 64bi= t pref] > > > > pci 0000:00:02.0: BAR 4: assigned [mem 0x8000004000-0x8000007fff 64bi= t pref] > > > > pci 0000:00:01.0: BAR 1: assigned [mem 0x10040000-0x10040fff] > > > > pci 0000:00:02.0: BAR 1: assigned [mem 0x10041000-0x10041fff] > > > > pci 0000:00:02.0: BAR 0: assigned [io 0x1000-0x107f] > > > > pci 0000:00:01.0: BAR 0: assigned [io 0x1080-0x109f] > > > > virtio-pci 0000:00:01.0: enabling device (0000 -> 0003) > > > > virtio-pci 0000:00:02.0: enabling device (0000 -> 0003) > > > > cacheinfo: Unable to detect cache hierarchy for CPU 0 > > > > virtio_blk virtio1: [vda] 122880 512-byte logical blocks (62.9 MB/60.= 0 MiB) > > > > SMCCC: SOC_ID: ARCH_FEATURES(ARCH_SOC_ID) returned error: fffffffffff= ffffd > > > > NET: Registered protocol family 10 > > > > Segment Routing with IPv6 > > > > sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver > > > > NET: Registered protocol family 17 > > > > NET: Registered protocol family 15 > > > > NET: Registered protocol family 40 > > > > registered taskstats version 1 > > > > EXT4-fs (vda): recovery complete > > > > EXT4-fs (vda): mounted filesystem with ordered data mode. Opts: (null= ). Quota mode: disabled. > > > > VFS: Mounted root (ext4 filesystem) on device 254:0. > > > > devtmpfs: mounted > > > > Freeing unused kernel memory: 1088K > > > > Run /sbin/init as init process > > > > mount: you must be root > > > > mount: you must be root > > > > mkdir: can't create directory '/dev/pts': Permission denied > > > > mkdir: can't create directory '/dev/shm': Permission denied > > > > mount: you must be root > > > > hostname: sethostname: Operation not permitted > > > > Starting syslogd: OK > > > > Starting klogd: OK > > > > Running sysctl: OK > > > > Initializing random number generator: OK > > > > Saving random seed: random: dd: uninitialized urandom read (512 bytes= read) > > > > OK > > > > Starting network: ip: RTNETLINK answers: Operation not permitted > > > > ip: SIOCSIFFLAGS: Operation not permitted > > > > sed: /proc/mounts: No such file or directory > > > > Waiting for interface eth0 to appear............... timeout! > > > > run-parts: /etc/network/if-pre-up.d/wait_iface: exit status 1 > > > > FAIL > > > > can't open /dev/ttyAMA0: Permission denied > > > > can't open /dev/ttyAMA0: Permission denied > > > > can't open /dev/ttyAMA0: Permission denied > > > > can't open /dev/ttyAMA0: Permission denied > > > > > > > > And it continues... > > > > > > > > The qemu command I got did not work "as it is" and because I'm neithe= r too > > > > proficient with qemu nor aarch64, it took a while to get something us= able. > > > > This is my current qemu command: > > > > > > > > qemu-system-aarch64 -nographic -s -machine virt,secure=3Don -cpu cort= ex-a57 \ > > > > -kernel ~/Projects/tpm/buildroot/output/images/Im= age \ > > > > -no-acpi \ > > > > -append 'root=3D/dev/vda rw console=3DttyAMA0,115= 200 ' \ > > > > -drive file=3D~/Projects/tpm/buildroot/output/ima= ges/rootfs.ext4,format=3Draw \ > > > > -smp 1 \ > > > > -monitor telnet:127.0.0.1:55555,server,nowait \ > > > > -m 1024 -bios ~/Projects/tpm/fw/aarch64-fw.bin -d= unimp > > > > > > > > Then I start QEMU monitor from another terminal with: > > > > > > > > socat tcp-connect:127.0.0.1:55555 file:`tty`,raw,echo=3D0 > > > > > > > > So... what could be the issue with permissions? > > > > > > > > > > It mostly sounds like an issue with your buildroot filesystem. > > > > > > Can you try with this [1] init ramdisk instead? > > > > > > -initrd rootfs.cpio.gz > > > > > > [1] https://people.linaro.org/~sumit.garg/rootfs.cpio.gz > > > > > > -Sumit > > > > That does not include my LKM's. > > >=20 > You can give a try with my kernel image [1] which has required built > in kernel modules. Also, you should be able to build a similar kernel > image. >=20 > [1] https://people.linaro.org/~sumit.garg/Image It comes down to that I need to be able to build my own kernel and user space. I need to be able to build my own kernel. There's been some bugs that I've reported back to BuildRoot with the latest kernel tree and also with binutils [*]. I'll retry once they are fixed, and try to find out what it causing the problem. [*] https://bugs.busybox.net/show_bug.cgi?id=3D13546 /Jarkko --===============1725252144775717918==-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-19.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7AA11C433DB for ; Wed, 24 Feb 2021 17:00:52 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 09E3E64F0E for ; Wed, 24 Feb 2021 17:00:51 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 09E3E64F0E Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References:Message-ID: Subject:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=R558Rept7qy1lcKTY/oWL6F1UZODDP9Z+fLn80Oha+A=; b=xJJxp+/RXz+rEcs8MLkIDXG8J TOXxh00Mbj4oxzXU1C4K5RQWc/kGSAkvkvP6N56D3cqE3dvjdGyr4vLDkY7DKG/H4bO6pTvaaAkMK HNX2Pvyrad8o3xR55ZNXPvr/WTGhNwWTA64rRJpuJdaHt1aCGX6FSjjWJ6vzsRFIOaRqOimcIE2xC NHUgFa6jPdGIk7b3kNx79Ej1rGN+KA4h8B/0Qb6WlA3/bQaF9aYZvPsVB8sSXAUUBEQfxl4GH11jF GsBOTrJhjaIFPEASn2SZIAvzwgPzp2dZIakPrBRJe25FLbEXOIiAoOmSxgrJvUhiLb6L+fiilzhE8 JB7m+DLFw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1lExVK-0007KV-0l; Wed, 24 Feb 2021 16:59:14 +0000 Received: from mail.kernel.org ([198.145.29.99]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1lExVF-0007Jh-Kr for linux-arm-kernel@lists.infradead.org; Wed, 24 Feb 2021 16:59:11 +0000 Received: by mail.kernel.org (Postfix) with ESMTPSA id 39D2F64F04; Wed, 24 Feb 2021 16:59:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1614185948; bh=RC1Hqie9FwhCmTUkinEjd6H+PMv8wRNj93LvgGULsrg=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=t0jQJFORVOhuV4CQ7J5GV5hOKjgFDp/Alqkk4FiVkeFCWvT3UFn85c3EKWCd4lQek DPNnaKEks+BP277ldAh7ifITHplT7xUMziRfAFSfhXFJLIHdAyMx2dFlM/GKn0NyHW 1MeQe1GFPHSmuVZHysfnhME2f7LsV8g6UVZ19beCZedWTQW2IFXCOAAJMEpCDRv200 OU8oztSCnfpEfEs265sT3ujHfHZz3qlq+/9bNvXsE4e1LlM9/gF10NRBAUjOVe4apz KL+SfkhJd1x2aenwNu8aIgZN762xBQcuKYcgGSVz6Hnn8Ni7HjjLIU4MfFap0ViRB0 wT3VwTlZ7Zvqw== Date: Wed, 24 Feb 2021 18:58:51 +0200 From: Jarkko Sakkinen To: Sumit Garg Subject: Re: [PATCH v8 2/4] KEYS: trusted: Introduce TEE based Trusted Keys Message-ID: References: <1486cfe8-bc30-1266-12bd-0049f2b64820@forissier.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210224_115909_938821_8024E0C4 X-CRM114-Status: GOOD ( 45.85 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: dave.hansen@intel.com, Daniel Thompson , Jerome Forissier , Jonathan Corbet , James Bottomley , Janne Karhunen , Linux Doc Mailing List , James Morris , Mimi Zohar , Linux Kernel Mailing List , David Howells , Casey Schaufler , "open list:SECURITY SUBSYSTEM" , op-tee@lists.trustedfirmware.org, "open list:ASYMMETRIC KEYS" , Jarkko Sakkinen , Luke Hinds , linux-integrity@vger.kernel.org, linux-arm-kernel , "Serge E. Hallyn" Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gTW9uLCBGZWIgMjIsIDIwMjEgYXQgMTI6NDU6MThQTSArMDUzMCwgU3VtaXQgR2FyZyB3cm90 ZToKPiBPbiBUdWUsIDE2IEZlYiAyMDIxIGF0IDEyOjU5LCBKYXJra28gU2Fra2luZW4gPGphcmtr b0BrZXJuZWwub3JnPiB3cm90ZToKPiA+Cj4gPiBPbiBNb24sIEZlYiAxNSwgMjAyMSBhdCAwNjoz NzowMFBNICswNTMwLCBTdW1pdCBHYXJnIHdyb3RlOgo+ID4gPiBPbiBGcmksIDEyIEZlYiAyMDIx IGF0IDA1OjA0LCBKYXJra28gU2Fra2luZW4gPGphcmtrb0BrZXJuZWwub3JnPiB3cm90ZToKPiA+ ID4gPgo+ID4gPiA+IE9uIE1vbiwgSmFuIDI1LCAyMDIxIGF0IDAyOjQ3OjM4UE0gKzA1MzAsIFN1 bWl0IEdhcmcgd3JvdGU6Cj4gPiA+ID4gPiBIaSBKYXJra28sCj4gPiA+ID4gPgo+ID4gPiA+ID4g T24gRnJpLCAyMiBKYW4gMjAyMSBhdCAyMzo0MiwgSmFya2tvIFNha2tpbmVuIDxqYXJra29Aa2Vy bmVsLm9yZz4gd3JvdGU6Cj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+IE9uIFRodSwgSmFuIDIxLCAy MDIxIGF0IDA1OjIzOjQ1UE0gKzAxMDAsIEplcm9tZSBGb3Jpc3NpZXIgd3JvdGU6Cj4gPiA+ID4g PiA+ID4KPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+IE9uIDEvMjEvMjEgNDoyNCBQTSwgSmFy a2tvIFNha2tpbmVuIHdyb3RlOgo+ID4gPiA+ID4gPiA+ID4gT24gVGh1LCBKYW4gMjEsIDIwMjEg YXQgMDU6MDc6NDJQTSArMDIwMCwgSmFya2tvIFNha2tpbmVuIHdyb3RlOgo+ID4gPiA+ID4gPiA+ ID4+IE9uIFRodSwgSmFuIDIxLCAyMDIxIGF0IDA5OjQ0OjA3QU0gKzAxMDAsIEplcm9tZSBGb3Jp c3NpZXIgd3JvdGU6Cj4gPiA+ID4gPiA+ID4gPj4+Cj4gPiA+ID4gPiA+ID4gPj4+Cj4gPiA+ID4g PiA+ID4gPj4+IE9uIDEvMjEvMjEgMTowMiBBTSwgSmFya2tvIFNha2tpbmVuIHZpYSBPUC1URUUg d3JvdGU6Cj4gPiA+ID4gPiA+ID4gPj4+PiBPbiBXZWQsIEphbiAyMCwgMjAyMSBhdCAxMjo1Mzoy OFBNICswNTMwLCBTdW1pdCBHYXJnIHdyb3RlOgo+ID4gPiA+ID4gPiA+ID4+Pj4+IE9uIFdlZCwg MjAgSmFuIDIwMjEgYXQgMDc6MDEsIEphcmtrbyBTYWtraW5lbiA8amFya2tvQGtlcm5lbC5vcmc+ IHdyb3RlOgo+ID4gPiA+ID4gPiA+ID4+Pj4+Pgo+ID4gPiA+ID4gPiA+ID4+Pj4+PiBPbiBUdWUs IEphbiAxOSwgMjAyMSBhdCAxMjozMDo0MlBNICswMjAwLCBKYXJra28gU2Fra2luZW4gd3JvdGU6 Cj4gPiA+ID4gPiA+ID4gPj4+Pj4+PiBPbiBGcmksIEphbiAxNSwgMjAyMSBhdCAxMTozMjozMUFN ICswNTMwLCBTdW1pdCBHYXJnIHdyb3RlOgo+ID4gPiA+ID4gPiA+ID4+Pj4+Pj4+IE9uIFRodSwg MTQgSmFuIDIwMjEgYXQgMDc6MzUsIEphcmtrbyBTYWtraW5lbiA8amFya2tvQGtlcm5lbC5vcmc+ IHdyb3RlOgo+ID4gPiA+ID4gPiA+ID4+Pj4+Pj4+Pgo+ID4gPiA+ID4gPiA+ID4+Pj4+Pj4+PiBP biBXZWQsIEphbiAxMywgMjAyMSBhdCAwNDo0NzowMFBNICswNTMwLCBTdW1pdCBHYXJnIHdyb3Rl Ogo+ID4gPiA+ID4gPiA+ID4+Pj4+Pj4+Pj4gSGkgSmFya2tvLAo+ID4gPiA+ID4gPiA+ID4+Pj4+ Pj4+Pj4KPiA+ID4gPiA+ID4gPiA+Pj4+Pj4+Pj4+IE9uIE1vbiwgMTEgSmFuIDIwMjEgYXQgMjI6 MDUsIEphcmtrbyBTYWtraW5lbiA8amFya2tvQGtlcm5lbC5vcmc+IHdyb3RlOgo+ID4gPiA+ID4g PiA+ID4+Pj4+Pj4+Pj4+Cj4gPiA+ID4gPiA+ID4gPj4+Pj4+Pj4+Pj4gT24gVHVlLCBOb3YgMDMs IDIwMjAgYXQgMDk6MzE6NDRQTSArMDUzMCwgU3VtaXQgR2FyZyB3cm90ZToKPiA+ID4gPiA+ID4g PiA+Pj4+Pj4+Pj4+Pj4gQWRkIHN1cHBvcnQgZm9yIFRFRSBiYXNlZCB0cnVzdGVkIGtleXMgd2hl cmUgVEVFIHByb3ZpZGVzIHRoZSBmdW5jdGlvbmFsaXR5Cj4gPiA+ID4gPiA+ID4gPj4+Pj4+Pj4+ Pj4+IHRvIHNlYWwgYW5kIHVuc2VhbCB0cnVzdGVkIGtleXMgdXNpbmcgaGFyZHdhcmUgdW5pcXVl IGtleS4KPiA+ID4gPiA+ID4gPiA+Pj4+Pj4+Pj4+Pj4KPiA+ID4gPiA+ID4gPiA+Pj4+Pj4+Pj4+ Pj4gUmVmZXIgdG8gRG9jdW1lbnRhdGlvbi90ZWUudHh0IGZvciBkZXRhaWxlZCBpbmZvcm1hdGlv biBhYm91dCBURUUuCj4gPiA+ID4gPiA+ID4gPj4+Pj4+Pj4+Pj4+Cj4gPiA+ID4gPiA+ID4gPj4+ Pj4+Pj4+Pj4+IFNpZ25lZC1vZmYtYnk6IFN1bWl0IEdhcmcgPHN1bWl0LmdhcmdAbGluYXJvLm9y Zz4KPiA+ID4gPiA+ID4gPiA+Pj4+Pj4+Pj4+Pgo+ID4gPiA+ID4gPiA+ID4+Pj4+Pj4+Pj4+IEkg aGF2ZW4ndCB5ZXQgZ290IFFFTVUgZW52aXJvbm1lbnQgd29ya2luZyB3aXRoIGFhcmNoNjQsIHRo aXMgcHJvZHVjZXMKPiA+ID4gPiA+ID4gPiA+Pj4+Pj4+Pj4+PiBqdXN0IGEgYmxhbmsgc2NyZWVu Ogo+ID4gPiA+ID4gPiA+ID4+Pj4+Pj4+Pj4+Cj4gPiA+ID4gPiA+ID4gPj4+Pj4+Pj4+Pj4gLi9v dXRwdXQvaG9zdC91c3IvYmluL3FlbXUtc3lzdGVtLWFhcmNoNjQgLU0gdmlydCAtY3B1IGNvcnRl eC1hNTMgLXNtcCAxIC1rZXJuZWwgb3V0cHV0L2ltYWdlcy9JbWFnZSAtaW5pdHJkIG91dHB1dC9p bWFnZXMvcm9vdGZzLmNwaW8gLXNlcmlhbCBzdGRpbwo+ID4gPiA+ID4gPiA+ID4+Pj4+Pj4+Pj4+ Cj4gPiA+ID4gPiA+ID4gPj4+Pj4+Pj4+Pj4gTXkgQnVpbGRSb290IGZvcmsgZm9yIFRQTSBhbmQg a2V5cmluZyB0ZXN0aW5nIGlzIGxvY2F0ZWQgb3ZlciBoZXJlOgo+ID4gPiA+ID4gPiA+ID4+Pj4+ Pj4+Pj4+Cj4gPiA+ID4gPiA+ID4gPj4+Pj4+Pj4+Pj4gaHR0cHM6Ly9naXQua2VybmVsLm9yZy9w dWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvamFya2tvL2J1aWxkcm9vdC10cG1kZC5naXQvCj4gPiA+ ID4gPiA+ID4gPj4+Pj4+Pj4+Pj4KPiA+ID4gPiA+ID4gPiA+Pj4+Pj4+Pj4+PiBUaGUgIkFSTSB2 ZXJzaW9uIiBpcyBhdCB0aGlzIHBvaW50IGluIGFhcmNoNjQgYnJhbmNoLiBPdmVyIHRpbWUgSSB3 aWxsCj4gPiA+ID4gPiA+ID4gPj4+Pj4+Pj4+Pj4gZGVmaW5lIHRwbWRkLXg4Nl82NCBhbmQgdHBt ZGQtYWFyY2g2NCBib2FyZHMgYW5kIGV2ZXJ5dGhpbmcgd2lsbCBiZSB0aGVuCj4gPiA+ID4gPiA+ ID4gPj4+Pj4+Pj4+Pj4gaW4gdGhlIG1hc3RlciBicmFuY2guCj4gPiA+ID4gPiA+ID4gPj4+Pj4+ Pj4+Pj4KPiA+ID4gPiA+ID4gPiA+Pj4+Pj4+Pj4+PiBUbyBjcmVhdGUgaWRlbnRpY2FsIGltYWdl cyB5b3UganVzdCBuZWVkIHRvCj4gPiA+ID4gPiA+ID4gPj4+Pj4+Pj4+Pj4KPiA+ID4gPiA+ID4g PiA+Pj4+Pj4+Pj4+PiAkIG1ha2UgdHBtZGRfZGVmY29uZmlnICYmIG1ha2UKPiA+ID4gPiA+ID4g PiA+Pj4+Pj4+Pj4+Pgo+ID4gPiA+ID4gPiA+ID4+Pj4+Pj4+Pj4+IENhbiB5b3UgY2hlY2sgaWYg eW91IHNlZSBhbnl0aGluZyBvYnZpb3VzbHkgd3Jvbmc/IEknbSBlYWdlciB0byB0ZXN0IHRoaXMK PiA+ID4gPiA+ID4gPiA+Pj4+Pj4+Pj4+PiBwYXRjaCBzZXQsIGFuZCBpbiBiaWdnZXIgcGljdHVy ZSBJIHJlYWxseSBuZWVkIHRvIGhhdmUgcmVhZHkgdG8gcnVuCj4gPiA+ID4gPiA+ID4gPj4+Pj4+ Pj4+Pj4gYWFyY2g2NCBlbnZpcm9ubWVudCBhdmFpbGFibGUuCj4gPiA+ID4gPiA+ID4gPj4+Pj4+ Pj4+Pgo+ID4gPiA+ID4gPiA+ID4+Pj4+Pj4+Pj4gSSB3b3VsZCByYXRoZXIgc3VnZ2VzdCB5b3Ug dG8gZm9sbG93IHN0ZXBzIGxpc3RlZCBoZXJlIFsxXSBhcyB0byB0ZXN0Cj4gPiA+ID4gPiA+ID4g Pj4+Pj4+Pj4+PiB0aGlzIGZlYXR1cmUgb24gUWVtdSBhYXJjaDY0IHdlIG5lZWQgdG8gYnVpbGQg ZmlybXdhcmVzIHN1Y2ggYXMgVEYtQSwKPiA+ID4gPiA+ID4gPiA+Pj4+Pj4+Pj4+IE9QLVRFRSwg VUVGSSBldGMuIHdoaWNoIGFyZSBhbGwgaW50ZWdyYXRlZCBpbnRvIE9QLVRFRSBRZW11IGJ1aWxk Cj4gPiA+ID4gPiA+ID4gPj4+Pj4+Pj4+PiBzeXN0ZW0gWzJdLiBBbmQgdGhlbiBpdCB3b3VsZCBi ZSBlYXNpZXIgdG8gbWlncmF0ZSB0aGVtIHRvIHlvdXIKPiA+ID4gPiA+ID4gPiA+Pj4+Pj4+Pj4+ IGJ1aWxkcm9vdCBlbnZpcm9ubWVudCBhcyB3ZWxsLgo+ID4gPiA+ID4gPiA+ID4+Pj4+Pj4+Pj4K PiA+ID4gPiA+ID4gPiA+Pj4+Pj4+Pj4+IFsxXSBodHRwczovL2xpc3RzLnRydXN0ZWRmaXJtd2Fy ZS5vcmcvcGlwZXJtYWlsL29wLXRlZS8yMDIwLU1heS8wMDAwMjcuaHRtbAo+ID4gPiA+ID4gPiA+ ID4+Pj4+Pj4+Pj4gWzJdIGh0dHBzOi8vb3B0ZWUucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L2J1 aWxkaW5nL2RldmljZXMvcWVtdS5odG1sI3FlbXUtdjgKPiA+ID4gPiA+ID4gPiA+Pj4+Pj4+Pj4+ Cj4gPiA+ID4gPiA+ID4gPj4+Pj4+Pj4+PiAtU3VtaXQKPiA+ID4gPiA+ID4gPiA+Pj4+Pj4+Pj4K PiA+ID4gPiA+ID4gPiA+Pj4+Pj4+Pj4gQ2FuIHlvdSBwcm92aWRlICdrZXljdGxfY2hhbmdlJz8g T3RoZXJ3aXNlLCB0aGUgc3RlcHMgYXJlIGVhc3kgdG8gZm9sbG93Lgo+ID4gPiA+ID4gPiA+ID4+ Pj4+Pj4+Pgo+ID4gPiA+ID4gPiA+ID4+Pj4+Pj4+Cj4gPiA+ID4gPiA+ID4gPj4+Pj4+Pj4gJCBj YXQga2V5Y3RsX2NoYW5nZQo+ID4gPiA+ID4gPiA+ID4+Pj4+Pj4+IGRpZmYgLS1naXQgYS9jb21t b24ubWsgYi9jb21tb24ubWsKPiA+ID4gPiA+ID4gPiA+Pj4+Pj4+PiBpbmRleCBhZWI3YjQxLi42 NjNlNTI4IDEwMDY0NAo+ID4gPiA+ID4gPiA+ID4+Pj4+Pj4+IC0tLSBhL2NvbW1vbi5tawo+ID4g PiA+ID4gPiA+ID4+Pj4+Pj4+ICsrKyBiL2NvbW1vbi5tawo+ID4gPiA+ID4gPiA+ID4+Pj4+Pj4+ IEBAIC0yMjksNiArMjI5LDcgQEAgQlIyX1BBQ0tBR0VfT1BURUVfVEVTVF9TREsgPz0gJChPUFRF RV9PU19UQV9ERVZfS0lUX0RJUikKPiA+ID4gPiA+ID4gPiA+Pj4+Pj4+PiAgQlIyX1BBQ0tBR0Vf T1BURUVfVEVTVF9TSVRFID89ICQoT1BURUVfVEVTVF9QQVRIKQo+ID4gPiA+ID4gPiA+ID4+Pj4+ Pj4+ICBCUjJfUEFDS0FHRV9TVFJBQ0UgPz0geQo+ID4gPiA+ID4gPiA+ID4+Pj4+Pj4+ICBCUjJf VEFSR0VUX0dFTkVSSUNfR0VUVFlfUE9SVCA/PSAkKGlmCj4gPiA+ID4gPiA+ID4gPj4+Pj4+Pj4g JChDRkdfTldfQ09OU09MRV9VQVJUKSx0dHlBTUEkKENGR19OV19DT05TT0xFX1VBUlQpLHR0eUFN QTApCj4gPiA+ID4gPiA+ID4gPj4+Pj4+Pj4gK0JSMl9QQUNLQUdFX0tFWVVUSUxTIDo9IHkKPiA+ ID4gPiA+ID4gPiA+Pj4+Pj4+Pgo+ID4gPiA+ID4gPiA+ID4+Pj4+Pj4+ICAjIEFsbCBCUjJfKiB2 YXJpYWJsZXMgZnJvbSB0aGUgbWFrZWZpbGUgb3IgdGhlIGVudmlyb25tZW50IGFyZSBhcHBlbmRl ZCB0bwo+ID4gPiA+ID4gPiA+ID4+Pj4+Pj4+ICAjIC4uL291dC1ici9leHRyYS5jb25mLiBBbGwg dmFsdWVzIGFyZSBxdW90ZWQgIi4uLiIgZXhjZXB0IHkgYW5kIG4uCj4gPiA+ID4gPiA+ID4gPj4+ Pj4+Pj4gZGlmZiAtLWdpdCBhL2tjb25maWdzL3FlbXUuY29uZiBiL2tjb25maWdzL3FlbXUuY29u Zgo+ID4gPiA+ID4gPiA+ID4+Pj4+Pj4+IGluZGV4IDM2OGMxOGEuLjgzMmFiNzQgMTAwNjQ0Cj4g PiA+ID4gPiA+ID4gPj4+Pj4+Pj4gLS0tIGEva2NvbmZpZ3MvcWVtdS5jb25mCj4gPiA+ID4gPiA+ ID4gPj4+Pj4+Pj4gKysrIGIva2NvbmZpZ3MvcWVtdS5jb25mCj4gPiA+ID4gPiA+ID4gPj4+Pj4+ Pj4gQEAgLTIwLDMgKzIwLDUgQEAgQ09ORklHXzlQX0ZTPXkKPiA+ID4gPiA+ID4gPiA+Pj4+Pj4+ PiAgQ09ORklHXzlQX0ZTX1BPU0lYX0FDTD15Cj4gPiA+ID4gPiA+ID4gPj4+Pj4+Pj4gIENPTkZJ R19IV19SQU5ET009eQo+ID4gPiA+ID4gPiA+ID4+Pj4+Pj4+ICBDT05GSUdfSFdfUkFORE9NX1ZJ UlRJTz15Cj4gPiA+ID4gPiA+ID4gPj4+Pj4+Pj4gK0NPTkZJR19UUlVTVEVEX0tFWVM9eQo+ID4g PiA+ID4gPiA+ID4+Pj4+Pj4+ICtDT05GSUdfRU5DUllQVEVEX0tFWVM9eQo+ID4gPiA+ID4gPiA+ ID4+Pj4+Pj4+Cj4gPiA+ID4gPiA+ID4gPj4+Pj4+Pj4+IEFmdGVyIEkndmUgc3VjY2Vzc2Z1bGx5 IHRlc3RlZCAyLzQsIEknZCBzdWdnZXN0IHRoYXQgeW91IHJvbGwgb3V0IG9uZSBtb3JlCj4gPiA+ ID4gPiA+ID4gPj4+Pj4+Pj4+IHZlcnNpb24gYW5kIENDIHRoZSBkb2N1bWVudGF0aW9uIHBhdGNo IHRvIEVsYWluZSBhbmQgTWluaSwgYW5kIGNsZWFybHkKPiA+ID4gPiA+ID4gPiA+Pj4+Pj4+Pj4g cmVtYXJrIGluIHRoZSBjb21taXQgbWVzc2FnZSB0aGF0IFRFRSBpcyBhIHN0YW5kYXJkLCB3aXRo IGEgbGluayB0byB0aGUKPiA+ID4gPiA+ID4gPiA+Pj4+Pj4+Pj4gc3BlY2lmaWNhdGlvbi4KPiA+ ID4gPiA+ID4gPiA+Pj4+Pj4+Pj4KPiA+ID4gPiA+ID4gPiA+Pj4+Pj4+Pgo+ID4gPiA+ID4gPiA+ ID4+Pj4+Pj4+IFN1cmUsIEkgd2lsbCByb2xsIG91dCB0aGUgbmV4dCB2ZXJzaW9uIGFmdGVyIHlv dXIgdGVzdGluZy4KPiA+ID4gPiA+ID4gPiA+Pj4+Pj4+Cj4gPiA+ID4gPiA+ID4gPj4+Pj4+PiBU aGFua3MsIEknbGwgdHJ5IHRoaXMgYXQgaW5zdGFudCwgYW5kIGdpdmUgbXkgZmVlZGJhY2suCj4g PiA+ID4gPiA+ID4gPj4+Pj4+Cj4gPiA+ID4gPiA+ID4gPj4+Pj4+IEkgYnVtcCBpbnRvIHRoaXM6 Cj4gPiA+ID4gPiA+ID4gPj4+Pj4+Cj4gPiA+ID4gPiA+ID4gPj4+Pj4+ICQgbWFrZSBydW4tb25s eQo+ID4gPiA+ID4gPiA+ID4+Pj4+PiBsbiAtc2YgL2hvbWUvamFya2tvL2RldmVsL3RwbS9vcHRl ZS9idWlsZC8uLi9vdXQtYnIvaW1hZ2VzL3Jvb3Rmcy5jcGlvLmd6IC9ob21lL2phcmtrby9kZXZl bC90cG0vb3B0ZWUvYnVpbGQvLi4vb3V0L2Jpbi8KPiA+ID4gPiA+ID4gPiA+Pj4+Pj4gbG46IGZh aWxlZCB0byBjcmVhdGUgc3ltYm9saWMgbGluayAnL2hvbWUvamFya2tvL2RldmVsL3RwbS9vcHRl ZS9idWlsZC8uLi9vdXQvYmluLyc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKPiA+ID4gPiA+ ID4gPiA+Pj4+Pj4gbWFrZTogKioqIFtNYWtlZmlsZToxOTQ6IHJ1bi1vbmx5XSBFcnJvciAxCj4g PiA+ID4gPiA+ID4gPj4+Pj4+Cj4gPiA+ID4gPiA+ID4gPj4+Pj4KPiA+ID4gPiA+ID4gPiA+Pj4+ PiBDb3VsZCB5b3UgY2hlY2sgaWYgdGhlIGZvbGxvd2luZyBkaXJlY3RvcnkgdHJlZSBpcyBidWls dCBhZnRlcgo+ID4gPiA+ID4gPiA+ID4+Pj4+IGV4ZWN1dGluZyB0aGUgYmVsb3cgY29tbWFuZD8K PiA+ID4gPiA+ID4gPiA+Pj4+Pgo+ID4gPiA+ID4gPiA+ID4+Pj4+ICQgbWFrZSAtamBucHJvY2AK PiA+ID4gPiA+ID4gPiA+Pj4+PiBDRkdfSU5fVFJFRV9FQVJMWV9UQVM9dHJ1c3RlZF9rZXlzL2Yw NGEwZmU3LTFmNWQtNGI5Yi1hYmY3LTYxOWI4NWI0Y2U4Ywo+ID4gPiA+ID4gPiA+ID4+Pj4+Cj4g PiA+ID4gPiA+ID4gPj4+Pj4gJCB0cmVlIG91dC9iaW4vCj4gPiA+ID4gPiA+ID4gPj4+Pj4gb3V0 L2Jpbi8KPiA+ID4gPiA+ID4gPiA+Pj4+PiDilJzilIDilIAgYmwxLmJpbiAtPiAvaG9tZS9zdW1p dC9idWlsZC9vcHRlZS9idWlsZC8uLi90cnVzdGVkLWZpcm13YXJlLWEvYnVpbGQvcWVtdS9yZWxl YXNlL2JsMS5iaW4KPiA+ID4gPiA+ID4gPiA+Pj4+PiDilJzilIDilIAgYmwyLmJpbiAtPiAvaG9t ZS9zdW1pdC9idWlsZC9vcHRlZS9idWlsZC8uLi90cnVzdGVkLWZpcm13YXJlLWEvYnVpbGQvcWVt dS9yZWxlYXNlL2JsMi5iaW4KPiA+ID4gPiA+ID4gPiA+Pj4+PiDilJzilIDilIAgYmwzMS5iaW4g LT4KPiA+ID4gPiA+ID4gPiA+Pj4+PiAvaG9tZS9zdW1pdC9idWlsZC9vcHRlZS9idWlsZC8uLi90 cnVzdGVkLWZpcm13YXJlLWEvYnVpbGQvcWVtdS9yZWxlYXNlL2JsMzEuYmluCj4gPiA+ID4gPiA+ ID4gPj4+Pj4g4pSc4pSA4pSAIGJsMzIuYmluIC0+Cj4gPiA+ID4gPiA+ID4gPj4+Pj4gL2hvbWUv c3VtaXQvYnVpbGQvb3B0ZWUvYnVpbGQvLi4vb3B0ZWVfb3Mvb3V0L2FybS9jb3JlL3RlZS1oZWFk ZXJfdjIuYmluCj4gPiA+ID4gPiA+ID4gPj4+Pj4g4pSc4pSA4pSAIGJsMzJfZXh0cmExLmJpbiAt Pgo+ID4gPiA+ID4gPiA+ID4+Pj4+IC9ob21lL3N1bWl0L2J1aWxkL29wdGVlL2J1aWxkLy4uL29w dGVlX29zL291dC9hcm0vY29yZS90ZWUtcGFnZXJfdjIuYmluCj4gPiA+ID4gPiA+ID4gPj4+Pj4g 4pSc4pSA4pSAIGJsMzJfZXh0cmEyLmJpbiAtPgo+ID4gPiA+ID4gPiA+ID4+Pj4+IC9ob21lL3N1 bWl0L2J1aWxkL29wdGVlL2J1aWxkLy4uL29wdGVlX29zL291dC9hcm0vY29yZS90ZWUtcGFnZWFi bGVfdjIuYmluCj4gPiA+ID4gPiA+ID4gPj4+Pj4g4pSc4pSA4pSAIGJsMzMuYmluIC0+Cj4gPiA+ ID4gPiA+ID4gPj4+Pj4gL2hvbWUvc3VtaXQvYnVpbGQvb3B0ZWUvYnVpbGQvLi4vZWRrMi9CdWls ZC9Bcm1WaXJ0UWVtdUtlcm5lbC1BQVJDSDY0L1JFTEVBU0VfR0NDNDkvRlYvUUVNVV9FRkkuZmQK PiA+ID4gPiA+ID4gPiA+Pj4+PiDilJzilIDilIAgSW1hZ2UgLT4gL2hvbWUvc3VtaXQvYnVpbGQv b3B0ZWUvYnVpbGQvLi4vbGludXgvYXJjaC9hcm02NC9ib290L0ltYWdlCj4gPiA+ID4gPiA+ID4g Pj4+Pj4g4pSU4pSA4pSAIHJvb3Rmcy5jcGlvLmd6IC0+Cj4gPiA+ID4gPiA+ID4gPj4+Pj4gL2hv bWUvc3VtaXQvYnVpbGQvb3B0ZWUvYnVpbGQvLi4vb3V0LWJyL2ltYWdlcy9yb290ZnMuY3Bpby5n ego+ID4gPiA+ID4gPiA+ID4+Pj4+Cj4gPiA+ID4gPiA+ID4gPj4+Pj4gMCBkaXJlY3Rvcmllcywg OSBmaWxlcwo+ID4gPiA+ID4gPiA+ID4+Pj4+Cj4gPiA+ID4gPiA+ID4gPj4+Pj4gLVN1bWl0Cj4g PiA+ID4gPiA+ID4gPj4+Pgo+ID4gPiA+ID4gPiA+ID4+Pj4gSSBhY3R1YWxseSBzcG90dGVkIGEg YnVpbGQgZXJyb3IgdGhhdCB3YXMgdW5ub3RpY2VkIGxhc3QgdGltZToKPiA+ID4gPiA+ID4gPiA+ Pj4+Cj4gPiA+ID4gPiA+ID4gPj4+PiBtYWtlWzJdOiBFbnRlcmluZyBkaXJlY3RvcnkgJy9ob21l L2phcmtrby9kZXZlbC90cG0vb3B0ZWUvZWRrMi9CYXNlVG9vbHMvVGVzdHMnCj4gPiA+ID4gPiA+ ID4gPj4+PiAvYmluL3NoOiAxOiBweXRob246IG5vdCBmb3VuZAo+ID4gPiA+ID4gPiA+ID4+Pj4K PiA+ID4gPiA+ID4gPiA+Pj4+IEknZCBwcmVmZXIgbm90IHRvIGluc3RhbGwgUHl0aG9uMi4gSXQg aGFzIGJlZW4gRU9MIG92ZXIgYSB5ZWFyLgo+ID4gPiA+ID4gPiA+ID4+Pgo+ID4gPiA+ID4gPiA+ ID4+PiBBRkFJSywgZXZlcnl0aGluZyBzaG91bGQgYnVpbGQgZmluZSB3aXRoIFB5dGhvbjMuIE9u IG15IFVidW50dSAyMC4wNAo+ID4gPiA+ID4gPiA+ID4+PiBtYWNoaW5lLCB0aGlzIGlzIGFjY29t cGxpc2hlZCBieSBpbnN0YWxsaW5nIHBhY2thZ2UgInB5dGhvbi1pcy1weXRob24zIgo+ID4gPiA+ ID4gPiA+ID4+PiAoYWZ0ZXIgdW5pbnN0YWxsaW5nICJweXRob24taXMtcHl0aG9uMiIgaWYgbmVl ZCBiZSkuCj4gPiA+ID4gPiA+ID4gPj4+Cj4gPiA+ID4gPiA+ID4gPj4+ICQgbHMgLWwgL3Vzci9i aW4vcHl0aG9uCj4gPiA+ID4gPiA+ID4gPj4+IGxyd3hyd3hyd3ggMSByb290IHJvb3QgNyBBcHIg MTUgIDIwMjAgL3Vzci9iaW4vcHl0aG9uIC0+IHB5dGhvbjMKPiA+ID4gPiA+ID4gPiA+Pgo+ID4g PiA+ID4gPiA+ID4+IFJpZ2h0LCBqdXN0IGZvdW5kIGFib3V0IHRoaXMgaW4gdW5yZWxhdGVkIGNv bnRleHQgOi0pIFsqXQo+ID4gPiA+ID4gPiA+ID4+Cj4gPiA+ID4gPiA+ID4gPj4gSG9wZSB0aGlz IHdpbGwgd29yayBvdXQuLi4KPiA+ID4gPiA+ID4gPiA+Pgo+ID4gPiA+ID4gPiA+ID4+IFsqXSBo dHRwczovL2dpdGh1Yi5jb20vc3VyZ2Utc3ludGhlc2l6ZXIvc3VyZ2UvcHVsbC8zNjU1Cj4gPiA+ ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gTm93IEkgZ2V0Cj4gPiA+ID4gPiA+ID4gPgo+ID4g PiA+ID4gPiA+ID4gVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgo+ID4gPiA+ID4g PiA+ID4gICBGaWxlICIvaG9tZS9qYXJra28vUHJvamVjdHMvdHBtL29wdGVlL2VkazIvQmFzZVRv b2xzL1Rlc3RzL1J1blRlc3RzLnB5IiwgbGluZSAzNiwgaW4gPG1vZHVsZT4KPiA+ID4gPiA+ID4g PiA+ICAgICBhbGxUZXN0cyA9IEdldEFsbFRlc3RzU3VpdGUoKQo+ID4gPiA+ID4gPiA+ID4gICBG aWxlICIvaG9tZS9qYXJra28vUHJvamVjdHMvdHBtL29wdGVlL2VkazIvQmFzZVRvb2xzL1Rlc3Rz L1J1blRlc3RzLnB5IiwgbGluZSAzMywgaW4gR2V0QWxsVGVzdHNTdWl0ZQo+ID4gPiA+ID4gPiA+ ID4gICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoW0dldENUZXN0U3VpdGUoKSwgR2V0UHl0 aG9uVGVzdFN1aXRlKCldKQo+ID4gPiA+ID4gPiA+ID4gICBGaWxlICIvaG9tZS9qYXJra28vUHJv amVjdHMvdHBtL29wdGVlL2VkazIvQmFzZVRvb2xzL1Rlc3RzL1J1blRlc3RzLnB5IiwgbGluZSAy NSwgaW4gR2V0Q1Rlc3RTdWl0ZQo+ID4gPiA+ID4gPiA+ID4gICAgIGltcG9ydCBDVG9vbHNUZXN0 cwo+ID4gPiA+ID4gPiA+ID4gICBGaWxlICIvaG9tZS9qYXJra28vUHJvamVjdHMvdHBtL29wdGVl L2VkazIvQmFzZVRvb2xzL1Rlc3RzL0NUb29sc1Rlc3RzLnB5IiwgbGluZSAyMiwgaW4gPG1vZHVs ZT4KPiA+ID4gPiA+ID4gPiA+ICAgICBpbXBvcnQgVGlhbm9Db21wcmVzcwo+ID4gPiA+ID4gPiA+ ID4gICBGaWxlICIvaG9tZS9qYXJra28vUHJvamVjdHMvdHBtL29wdGVlL2VkazIvQmFzZVRvb2xz L1Rlc3RzL1RpYW5vQ29tcHJlc3MucHkiLCBsaW5lIDY5LCBpbiA8bW9kdWxlPgo+ID4gPiA+ID4g PiA+ID4gICAgIFRoZVRlc3RTdWl0ZSA9IFRlc3RUb29scy5NYWtlVGhlVGVzdFN1aXRlKGxvY2Fs cygpKQo+ID4gPiA+ID4gPiA+ID4gICBGaWxlICIvaG9tZS9qYXJra28vUHJvamVjdHMvdHBtL29w dGVlL2VkazIvQmFzZVRvb2xzL1Rlc3RzL1Rlc3RUb29scy5weSIsIGxpbmUgNDMsIGluIE1ha2VU aGVUZXN0U3VpdGUKPiA+ID4gPiA+ID4gPiA+ICAgICBmb3IgbmFtZSwgaXRlbSBpbiBsb2NhbEl0 ZW1zLml0ZXJpdGVtcygpOgo+ID4gPiA+ID4gPiA+ID4gQXR0cmlidXRlRXJyb3I6ICdkaWN0JyBv YmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnaXRlcml0ZW1zJwo+ID4gPiA+ID4gPiA+Cj4gPiA+ID4g PiA+ID4gUmlnaHQuIFNhbWUgaGVyZSBhZnRlciByZW1vdmluZyBhbGwgdHJhY2VzIG9mIFB5dGhv bjIgZnJvbSBteSBzeXN0ZW0gOi0vCj4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiBBIGNvdXBs ZSBvZiBmaXhlcyBhcmUgbmVlZGVkOgo+ID4gPiA+ID4gPiA+IDEuIEVESzIgbmVlZHMgdG8gYmUg dXBncmFkZWQgdG8gdGFnIG9yIGxhdGVyIFsxXQo+ID4gPiA+ID4gPiA+IDIuIFRoZSBQWVRIT04z X0VOQUJMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuZWVkcyB0byBiZSBzZXQgdG8gVFJVRSBbMl0K PiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+IFsxXSBodHRwczovL2dpdGh1Yi5jb20vT1AtVEVF L21hbmlmZXN0L3B1bGwvMTc3Cj4gPiA+ID4gPiA+ID4gWzJdIGh0dHBzOi8vZ2l0aHViLmNvbS9P UC1URUUvYnVpbGQvcHVsbC80NTAKPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gQlRXLCBJcyB0byAq cmVhbGx5KiBpbXBvc3NpYmxlIHRvIHRlc3QgdGhpcyB3aXRoIHBsYWluIEJ1aWxkUm9vdC4gIEl0 J3MKPiA+ID4gPiA+ID4gb2J2aW91cyB0aGF0IHRoaXMgZm9ya3MgQlIgaW50ZXJuYWxseS4KPiA+ ID4gPiA+ID4KPiA+ID4gPiA+ID4gSSBtZWFuIGV2ZW4gaWYgSSBnZXQgdGhpcyB3b3JraW5nIG9u Y2UsIHRoaXMgd2lsbCBmZWVscyBsaWtlIGEgY2x1bXN5IHdheQo+ID4gPiA+ID4gPiB0byB0ZXN0 IEFhcmNoNjQgcmVndWxhcmx5LiBJIHVzZSBCdWlsZFJvb3QgZXh0ZW5zaXZlbHkgZm9yIHg4NiB0 ZXN0aW5nLiBBbmQKPiA+ID4gPiA+ID4gaXQgd291bGQgYmUgbmljZSB0byBiZSBhYmxlIHRvIHN0 YXJ0IGRvaW5nIHJlZ3VsYXIgQVJNIHRlc3RpbmcuCj4gPiA+ID4gPgo+ID4gPiA+ID4gVGhlIG1h aW4gcmVhc29uIHRvIGd1aWRlIHlvdSB0b3dhcmRzIHRoZSBPUC1URUUgYnVpbGQgc3lzdGVtIGlz IHRoYXQKPiA+ID4gPiA+IHlvdSB3aWxsIGJlIGFibGUgdG8gYnVpbGQgYWxsIHRoZSBmaXJtd2Fy ZXMgKFRGLUEsIE9QLVRFRSwgZWRrMiBldGMuKQo+ID4gPiA+ID4gZnJvbSBzb3VyY2UuIElmIHlv dSBkb24ndCBuZWVkIHRvIHJlYnVpbGQgdGhvc2UgdGhlbiBJIGhhdmUgcHJlcGFyZWQgYQo+ID4g PiA+ID4gZmxhc2ggZmlybXdhcmUgYmluYXJ5IGJsb2IgZm9yIHlvdXIgdGVzdGluZyAoYXR0YWNo ZWQgZmxhc2guYmluKS4gU28KPiA+ID4gPiA+IFFlbXUgY21kbGluZSB3aWxsIGxvb2sgbGlrZToK PiA+ID4gPiA+Cj4gPiA+ID4gPiAkIHFlbXUtc3lzdGVtLWFhcmNoNjQgLW5vZ3JhcGhpYyAtcyAt bWFjaGluZSB2aXJ0LHNlY3VyZT1vbiAtY3B1Cj4gPiA+ID4gPiBjb3J0ZXgtYTU3IC1rZXJuZWwg b3V0L2Jpbi9JbWFnZSAtbm8tYWNwaSAtYXBwZW5kCj4gPiA+ID4gPiAnY29uc29sZT10dHlBTUEw LDM4NDAwIGtlZXBfYm9vdGNvbiByb290PS9kZXYvdmRhMicgLWluaXRyZAo+ID4gPiA+ID4gb3V0 L2Jpbi9yb290ZnMuY3Bpby5neiAtc21wIDIgLW0gMTAyNCAtYmlvcyBmbGFzaC5iaW4gLWQgdW5p bXAKPiA+ID4gPgo+ID4gPiA+IEkgc3BlbnR0IGNvdXBsZSBvZiBkYXlzIHRvIHRyeSB0byBnZXQg dGhpcyBydW5uaW5nLgo+ID4gPiA+Cj4gPiA+ID4gSGVyZSdzIHRoZSBsb2c6Cj4gPiA+ID4KPiA+ ID4gPiDina8gLi9xZW11LnNoCj4gPiA+ID4gTk9USUNFOiAgQm9vdGluZyBUcnVzdGVkIEZpcm13 YXJlCj4gPiA+ID4gTk9USUNFOiAgQkwxOiB2Mi4zKCk6djIuMwo+ID4gPiA+IE5PVElDRTogIEJM MTogQnVpbHQgOiAxMzoyODowNCwgSmFuIDI1IDIwMjEKPiA+ID4gPiBOT1RJQ0U6ICBCTDE6IEJv b3RpbmcgQkwyCj4gPiA+ID4gTk9USUNFOiAgQkwyOiB2Mi4zKCk6djIuMwo+ID4gPiA+IE5PVElD RTogIEJMMjogQnVpbHQgOiAxMzoyODowNiwgSmFuIDI1IDIwMjEKPiA+ID4gPiBOT1RJQ0U6ICBC TDE6IEJvb3RpbmcgQkwzMQo+ID4gPiA+IE5PVElDRTogIEJMMzE6IHYyLjMoKTp2Mi4zCj4gPiA+ ID4gTk9USUNFOiAgQkwzMTogQnVpbHQgOiAxMzoyODowOCwgSmFuIDI1IDIwMjEKPiA+ID4gPiBV RUZJIGZpcm13YXJlICh2ZXJzaW9uICBidWlsdCBhdCAxODo0OToyNyBvbiBOb3YgMTggMjAxOSkK PiA+ID4gPiBwZmxhc2hfd3JpdGU6IFdyaXRlIHRvIGJ1ZmZlciBlbXVsYXRpb24gaXMgZmxhd2Vk Cj4gPiA+ID4gcGZsYXNoX3dyaXRlOiBXcml0ZSB0byBidWZmZXIgZW11bGF0aW9uIGlzIGZsYXdl ZAo+ID4gPiA+IEVGSSBzdHViOiBCb290aW5nIExpbnV4IEtlcm5lbC4uLgo+ID4gPiA+IEVGSSBz dHViOiBVc2luZyBEVEIgZnJvbSBjb25maWd1cmF0aW9uIHRhYmxlCj4gPiA+ID4gRUZJIHN0dWI6 IEV4aXRpbmcgYm9vdCBzZXJ2aWNlcyBhbmQgaW5zdGFsbGluZyB2aXJ0dWFsIGFkZHJlc3MgbWFw Li4uCj4gPiA+ID4gQm9vdGluZyBMaW51eCBvbiBwaHlzaWNhbCBDUFUgMHgwMDAwMDAwMDAwIFsw eDQxMWZkMDcwXQo+ID4gPiA+IExpbnV4IHZlcnNpb24gNS4xMS4wLXJjNSAoamFya2tvQHN1cHBp bG92YWh2ZXJvKSAoYWFyY2g2NC1idWlsZHJvb3QtbGludXgtdWNsaWJjLWdjYy5icl9yZWFsIChC dWlsZHJvb3QgMjAyMS4wMi1yYzEtMTAtZ2E3MmM5MGI5NzIpIDkuMy4wLCBHTlUgbGQgKEdOVSBC aW51dGlscykgMi4zNS4yKSAjMSBTTVAgVGh1IEZlYiAxMSAyMjowNDo1MyBFRVQgMjAyMQo+ID4g PiA+IE1hY2hpbmUgbW9kZWw6IGxpbnV4LGR1bW15LXZpcnQKPiA+ID4gPiBlZmk6IEVGSSB2Mi43 MCBieSBFREsgSUkKPiA+ID4gPiBlZmk6IFNNQklPUz0weDdmNTIwMDAwIFNNQklPUyAzLjA9MHg3 ZjUwMDAwMCBNRU1BVFRSPTB4N2U1OWIwMTggTUVNUkVTRVJWRT0weDdjMTQzZjE4Cj4gPiA+ID4g Wm9uZSByYW5nZXM6Cj4gPiA+ID4gICBETUEgICAgICBbbWVtIDB4MDAwMDAwMDA0MDAwMDAwMC0w eDAwMDAwMDAwN2ZmZmZmZmZdCj4gPiA+ID4gICBETUEzMiAgICBlbXB0eQo+ID4gPiA+ICAgTm9y bWFsICAgZW1wdHkKPiA+ID4gPiBNb3ZhYmxlIHpvbmUgc3RhcnQgZm9yIGVhY2ggbm9kZQo+ID4g PiA+IEVhcmx5IG1lbW9yeSBub2RlIHJhbmdlcwo+ID4gPiA+ICAgbm9kZSAgIDA6IFttZW0gMHgw MDAwMDAwMDQwMDAwMDAwLTB4MDAwMDAwMDA0MWZmZmZmZl0KPiA+ID4gPiAgIG5vZGUgICAwOiBb bWVtIDB4MDAwMDAwMDA0MjIwMDAwMC0weDAwMDAwMDAwN2JlM2ZmZmZdCj4gPiA+ID4gICBub2Rl ICAgMDogW21lbSAweDAwMDAwMDAwN2JlNDAwMDAtMHgwMDAwMDAwMDdjMTNmZmZmXQo+ID4gPiA+ ICAgbm9kZSAgIDA6IFttZW0gMHgwMDAwMDAwMDdjMTQwMDAwLTB4MDAwMDAwMDA3ZjQxZmZmZl0K PiA+ID4gPiAgIG5vZGUgICAwOiBbbWVtIDB4MDAwMDAwMDA3ZjQyMDAwMC0weDAwMDAwMDAwN2Y0 YWZmZmZdCj4gPiA+ID4gICBub2RlICAgMDogW21lbSAweDAwMDAwMDAwN2Y0YjAwMDAtMHgwMDAw MDAwMDdmNGNmZmZmXQo+ID4gPiA+ICAgbm9kZSAgIDA6IFttZW0gMHgwMDAwMDAwMDdmNGQwMDAw LTB4MDAwMDAwMDA3ZjVkZmZmZl0KPiA+ID4gPiAgIG5vZGUgICAwOiBbbWVtIDB4MDAwMDAwMDA3 ZjVlMDAwMC0weDAwMDAwMDAwN2ZmZmZmZmZdCj4gPiA+ID4gWmVyb2VkIHN0cnVjdCBwYWdlIGlu IHVuYXZhaWxhYmxlIHJhbmdlczogODY0IHBhZ2VzCj4gPiA+ID4gSW5pdG1lbSBzZXR1cCBub2Rl IDAgW21lbSAweDAwMDAwMDAwNDAwMDAwMDAtMHgwMDAwMDAwMDdmZmZmZmZmXQo+ID4gPiA+IHBz Y2k6IHByb2JpbmcgZm9yIGNvbmR1aXQgbWV0aG9kIGZyb20gRFQuCj4gPiA+ID4gcHNjaTogUFND SXYxLjEgZGV0ZWN0ZWQgaW4gZmlybXdhcmUuCj4gPiA+ID4gcHNjaTogVXNpbmcgc3RhbmRhcmQg UFNDSSB2MC4yIGZ1bmN0aW9uIElEcwo+ID4gPiA+IHBzY2k6IFRydXN0ZWQgT1MgbWlncmF0aW9u IG5vdCByZXF1aXJlZAo+ID4gPiA+IHBzY2k6IFNNQyBDYWxsaW5nIENvbnZlbnRpb24gdjEuMgo+ ID4gPiA+IHBlcmNwdTogRW1iZWRkZWQgMjEgcGFnZXMvY3B1IHM0ODAyNCByODE5MiBkMjk4MDAg dTg2MDE2Cj4gPiA+ID4gRGV0ZWN0ZWQgUElQVCBJLWNhY2hlIG9uIENQVTAKPiA+ID4gPiBDUFUg ZmVhdHVyZXM6IGRldGVjdGVkOiBBUk0gZXJyYXR1bSA4MzIwNzUKPiA+ID4gPiBDUFUgZmVhdHVy ZXM6IGRldGVjdGVkOiBTcGVjdHJlLXYyCj4gPiA+ID4gQ1BVIGZlYXR1cmVzOiBkZXRlY3RlZDog QVJNIGVycmF0YSAxMTY1NTIyLCAxMzE5MzY3LCBvciAxNTMwOTIzCj4gPiA+ID4gQnVpbHQgMSB6 b25lbGlzdHMsIG1vYmlsaXR5IGdyb3VwaW5nIG9uLiAgVG90YWwgcGFnZXM6IDI1NzUzNgo+ID4g PiA+IEtlcm5lbCBjb21tYW5kIGxpbmU6IHJvb3Q9L2Rldi92ZGEgcncgY29uc29sZT10dHlBTUEw LDExNTIwMAo+ID4gPiA+IERlbnRyeSBjYWNoZSBoYXNoIHRhYmxlIGVudHJpZXM6IDEzMTA3MiAo b3JkZXI6IDgsIDEwNDg1NzYgYnl0ZXMsIGxpbmVhcikKPiA+ID4gPiBJbm9kZS1jYWNoZSBoYXNo IHRhYmxlIGVudHJpZXM6IDY1NTM2IChvcmRlcjogNywgNTI0Mjg4IGJ5dGVzLCBsaW5lYXIpCj4g PiA+ID4gbWVtIGF1dG8taW5pdDogc3RhY2s6b2ZmLCBoZWFwIGFsbG9jOm9mZiwgaGVhcCBmcmVl Om9mZgo+ID4gPiA+IE1lbW9yeTogMTAxMTI4NEsvMTA0NjUyOEsgYXZhaWxhYmxlICg2NTkySyBr ZXJuZWwgY29kZSwgODA0SyByd2RhdGEsIDE0NjBLIHJvZGF0YSwgMTA4OEsgaW5pdCwgMzIxSyBi c3MsIDM1MjQ0SyByZXNlcnZlZCwgMEsgY21hLXJlc2VydmVkKQo+ID4gPiA+IFNMVUI6IEhXYWxp Z249NjQsIE9yZGVyPTAtMywgTWluT2JqZWN0cz0wLCBDUFVzPTEsIE5vZGVzPTEKPiA+ID4gPiBy Y3U6IEhpZXJhcmNoaWNhbCBSQ1UgaW1wbGVtZW50YXRpb24uCj4gPiA+ID4gcmN1OiAgICBSQ1Ug cmVzdHJpY3RpbmcgQ1BVcyBmcm9tIE5SX0NQVVM9MjU2IHRvIG5yX2NwdV9pZHM9MS4KPiA+ID4g PiByY3U6IFJDVSBjYWxjdWxhdGVkIHZhbHVlIG9mIHNjaGVkdWxlci1lbmxpc3RtZW50IGRlbGF5 IGlzIDI1IGppZmZpZXMuCj4gPiA+ID4gcmN1OiBBZGp1c3RpbmcgZ2VvbWV0cnkgZm9yIHJjdV9m YW5vdXRfbGVhZj0xNiwgbnJfY3B1X2lkcz0xCj4gPiA+ID4gTlJfSVJRUzogNjQsIG5yX2lycXM6 IDY0LCBwcmVhbGxvY2F0ZWQgaXJxczogMAo+ID4gPiA+IEdJQ3YybTogcmFuZ2VbbWVtIDB4MDgw MjAwMDAtMHgwODAyMGZmZl0sIFNQSVs4MDoxNDNdCj4gPiA+ID4gcmFuZG9tOiBnZXRfcmFuZG9t X2J5dGVzIGNhbGxlZCBmcm9tIHN0YXJ0X2tlcm5lbCsweDM0MC8weDUzYyB3aXRoIGNybmdfaW5p dD0wCj4gPiA+ID4gYXJjaF90aW1lcjogY3AxNSB0aW1lcihzKSBydW5uaW5nIGF0IDYyLjUwTUh6 ICh2aXJ0KS4KPiA+ID4gPiBjbG9ja3NvdXJjZTogYXJjaF9zeXNfY291bnRlcjogbWFzazogMHhm ZmZmZmZmZmZmZmZmZiBtYXhfY3ljbGVzOiAweDFjZDQyZTIwOGMsIG1heF9pZGxlX25zOiA4ODE1 OTA0MDUzMTQgbnMKPiA+ID4gPiBzY2hlZF9jbG9jazogNTYgYml0cyBhdCA2Mk1IeiwgcmVzb2x1 dGlvbiAxNm5zLCB3cmFwcyBldmVyeSA0Mzk4MDQ2NTExMDk2bnMKPiA+ID4gPiBDb25zb2xlOiBj b2xvdXIgZHVtbXkgZGV2aWNlIDgweDI1Cj4gPiA+ID4gQ2FsaWJyYXRpbmcgZGVsYXkgbG9vcCAo c2tpcHBlZCksIHZhbHVlIGNhbGN1bGF0ZWQgdXNpbmcgdGltZXIgZnJlcXVlbmN5Li4gMTI1LjAw IEJvZ29NSVBTIChscGo9MjUwMDAwKQo+ID4gPiA+IHBpZF9tYXg6IGRlZmF1bHQ6IDMyNzY4IG1p bmltdW06IDMwMQo+ID4gPiA+IE1vdW50LWNhY2hlIGhhc2ggdGFibGUgZW50cmllczogMjA0OCAo b3JkZXI6IDIsIDE2Mzg0IGJ5dGVzLCBsaW5lYXIpCj4gPiA+ID4gTW91bnRwb2ludC1jYWNoZSBo YXNoIHRhYmxlIGVudHJpZXM6IDIwNDggKG9yZGVyOiAyLCAxNjM4NCBieXRlcywgbGluZWFyKQo+ ID4gPiA+IHJjdTogSGllcmFyY2hpY2FsIFNSQ1UgaW1wbGVtZW50YXRpb24uCj4gPiA+ID4gUmVt YXBwaW5nIGFuZCBlbmFibGluZyBFRkkgc2VydmljZXMuCj4gPiA+ID4gc21wOiBCcmluZ2luZyB1 cCBzZWNvbmRhcnkgQ1BVcyAuLi4KPiA+ID4gPiBzbXA6IEJyb3VnaHQgdXAgMSBub2RlLCAxIENQ VQo+ID4gPiA+IFNNUDogVG90YWwgb2YgMSBwcm9jZXNzb3JzIGFjdGl2YXRlZC4KPiA+ID4gPiBD UFUgZmVhdHVyZXM6IGRldGVjdGVkOiAzMi1iaXQgRUwwIFN1cHBvcnQKPiA+ID4gPiBDUFUgZmVh dHVyZXM6IGRldGVjdGVkOiBDUkMzMiBpbnN0cnVjdGlvbnMKPiA+ID4gPiBDUFU6IEFsbCBDUFUo cykgc3RhcnRlZCBhdCBFTDEKPiA+ID4gPiBhbHRlcm5hdGl2ZXM6IHBhdGNoaW5nIGtlcm5lbCBj b2RlCj4gPiA+ID4gZGV2dG1wZnM6IGluaXRpYWxpemVkCj4gPiA+ID4gY2xvY2tzb3VyY2U6IGpp ZmZpZXM6IG1hc2s6IDB4ZmZmZmZmZmYgbWF4X2N5Y2xlczogMHhmZmZmZmZmZiwgbWF4X2lkbGVf bnM6IDc2NDUwNDE3ODUxMDAwMDAgbnMKPiA+ID4gPiBmdXRleCBoYXNoIHRhYmxlIGVudHJpZXM6 IDI1NiAob3JkZXI6IDIsIDE2Mzg0IGJ5dGVzLCBsaW5lYXIpCj4gPiA+ID4gU01CSU9TIDMuMC4w IHByZXNlbnQuCj4gPiA+ID4gRE1JOiBRRU1VIFFFTVUgVmlydHVhbCBNYWNoaW5lLCBCSU9TIDAu MC4wIDAyLzA2LzIwMTUKPiA+ID4gPiBORVQ6IFJlZ2lzdGVyZWQgcHJvdG9jb2wgZmFtaWx5IDE2 Cj4gPiA+ID4gRE1BOiBwcmVhbGxvY2F0ZWQgMTI4IEtpQiBHRlBfS0VSTkVMIHBvb2wgZm9yIGF0 b21pYyBhbGxvY2F0aW9ucwo+ID4gPiA+IERNQTogcHJlYWxsb2NhdGVkIDEyOCBLaUIgR0ZQX0tF Uk5FTHxHRlBfRE1BIHBvb2wgZm9yIGF0b21pYyBhbGxvY2F0aW9ucwo+ID4gPiA+IERNQTogcHJl YWxsb2NhdGVkIDEyOCBLaUIgR0ZQX0tFUk5FTHxHRlBfRE1BMzIgcG9vbCBmb3IgYXRvbWljIGFs bG9jYXRpb25zCj4gPiA+ID4gaHctYnJlYWtwb2ludDogZm91bmQgNiBicmVha3BvaW50IGFuZCA0 IHdhdGNocG9pbnQgcmVnaXN0ZXJzLgo+ID4gPiA+IEFTSUQgYWxsb2NhdG9yIGluaXRpYWxpc2Vk IHdpdGggNjU1MzYgZW50cmllcwo+ID4gPiA+IFNlcmlhbDogQU1CQSBQTDAxMSBVQVJUIGRyaXZl cgo+ID4gPiA+IDkwMDAwMDAucGwwMTE6IHR0eUFNQTAgYXQgTU1JTyAweDkwMDAwMDAgKGlycSA9 IDQ2LCBiYXNlX2JhdWQgPSAwKSBpcyBhIFBMMDExIHJldjEKPiA+ID4gPiBwcmludGs6IGNvbnNv bGUgW3R0eUFNQTBdIGVuYWJsZWQKPiA+ID4gPiBpb21tdTogRGVmYXVsdCBkb21haW4gdHlwZTog VHJhbnNsYXRlZAo+ID4gPiA+IHZnYWFyYjogbG9hZGVkCj4gPiA+ID4gU0NTSSBzdWJzeXN0ZW0g aW5pdGlhbGl6ZWQKPiA+ID4gPiBSZWdpc3RlcmVkIGVmaXZhcnMgb3BlcmF0aW9ucwo+ID4gPiA+ IGNsb2Nrc291cmNlOiBTd2l0Y2hlZCB0byBjbG9ja3NvdXJjZSBhcmNoX3N5c19jb3VudGVyCj4g PiA+ID4gTkVUOiBSZWdpc3RlcmVkIHByb3RvY29sIGZhbWlseSAyCj4gPiA+ID4gdGNwX2xpc3Rl bl9wb3J0YWRkcl9oYXNoIGhhc2ggdGFibGUgZW50cmllczogNTEyIChvcmRlcjogMSwgODE5MiBi eXRlcywgbGluZWFyKQo+ID4gPiA+IFRDUCBlc3RhYmxpc2hlZCBoYXNoIHRhYmxlIGVudHJpZXM6 IDgxOTIgKG9yZGVyOiA0LCA2NTUzNiBieXRlcywgbGluZWFyKQo+ID4gPiA+IFRDUCBiaW5kIGhh c2ggdGFibGUgZW50cmllczogODE5MiAob3JkZXI6IDUsIDEzMTA3MiBieXRlcywgbGluZWFyKQo+ ID4gPiA+IFRDUDogSGFzaCB0YWJsZXMgY29uZmlndXJlZCAoZXN0YWJsaXNoZWQgODE5MiBiaW5k IDgxOTIpCj4gPiA+ID4gVURQIGhhc2ggdGFibGUgZW50cmllczogNTEyIChvcmRlcjogMiwgMTYz ODQgYnl0ZXMsIGxpbmVhcikKPiA+ID4gPiBVRFAtTGl0ZSBoYXNoIHRhYmxlIGVudHJpZXM6IDUx MiAob3JkZXI6IDIsIDE2Mzg0IGJ5dGVzLCBsaW5lYXIpCj4gPiA+ID4gTkVUOiBSZWdpc3RlcmVk IHByb3RvY29sIGZhbWlseSAxCj4gPiA+ID4gUENJOiBDTFMgMCBieXRlcywgZGVmYXVsdCA2NAo+ ID4gPiA+IGh3IHBlcmZldmVudHM6IGVuYWJsZWQgd2l0aCBhcm12OF9wbXV2MyBQTVUgZHJpdmVy LCA1IGNvdW50ZXJzIGF2YWlsYWJsZQo+ID4gPiA+IHdvcmtpbmdzZXQ6IHRpbWVzdGFtcF9iaXRz PTYyIG1heF9vcmRlcj0xOCBidWNrZXRfb3JkZXI9MAo+ID4gPiA+IGZ1c2U6IGluaXQgKEFQSSB2 ZXJzaW9uIDcuMzMpCj4gPiA+ID4gQmxvY2sgbGF5ZXIgU0NTSSBnZW5lcmljIChic2cpIGRyaXZl ciB2ZXJzaW9uIDAuNCBsb2FkZWQgKG1ham9yIDI1MSkKPiA+ID4gPiBpbyBzY2hlZHVsZXIgbXEt ZGVhZGxpbmUgcmVnaXN0ZXJlZAo+ID4gPiA+IGlvIHNjaGVkdWxlciBreWJlciByZWdpc3RlcmVk Cj4gPiA+ID4gcGNpLWhvc3QtZ2VuZXJpYyA0MDEwMDAwMDAwLnBjaWU6IGhvc3QgYnJpZGdlIC9w Y2llQDEwMDAwMDAwIHJhbmdlczoKPiA+ID4gPiBwY2ktaG9zdC1nZW5lcmljIDQwMTAwMDAwMDAu cGNpZTogICAgICAgSU8gMHgwMDNlZmYwMDAwLi4weDAwM2VmZmZmZmYgLT4gMHgwMDAwMDAwMDAw Cj4gPiA+ID4gcGNpLWhvc3QtZ2VuZXJpYyA0MDEwMDAwMDAwLnBjaWU6ICAgICAgTUVNIDB4MDAx MDAwMDAwMC4uMHgwMDNlZmVmZmZmIC0+IDB4MDAxMDAwMDAwMAo+ID4gPiA+IHBjaS1ob3N0LWdl bmVyaWMgNDAxMDAwMDAwMC5wY2llOiAgICAgIE1FTSAweDgwMDAwMDAwMDAuLjB4ZmZmZmZmZmZm ZiAtPiAweDgwMDAwMDAwMDAKPiA+ID4gPiBwY2ktaG9zdC1nZW5lcmljIDQwMTAwMDAwMDAucGNp ZTogTWVtb3J5IHJlc291cmNlIHNpemUgZXhjZWVkcyBtYXggZm9yIDMyIGJpdHMKPiA+ID4gPiBw Y2ktaG9zdC1nZW5lcmljIDQwMTAwMDAwMDAucGNpZTogRUNBTSBhdCBbbWVtIDB4NDAxMDAwMDAw MC0weDQwMWZmZmZmZmZdIGZvciBbYnVzIDAwLWZmXQo+ID4gPiA+IHBjaS1ob3N0LWdlbmVyaWMg NDAxMDAwMDAwMC5wY2llOiBQQ0kgaG9zdCBicmlkZ2UgdG8gYnVzIDAwMDA6MDAKPiA+ID4gPiBw Y2lfYnVzIDAwMDA6MDA6IHJvb3QgYnVzIHJlc291cmNlIFtidXMgMDAtZmZdCj4gPiA+ID4gcGNp X2J1cyAwMDAwOjAwOiByb290IGJ1cyByZXNvdXJjZSBbaW8gIDB4MDAwMC0weGZmZmZdCj4gPiA+ ID4gcGNpX2J1cyAwMDAwOjAwOiByb290IGJ1cyByZXNvdXJjZSBbbWVtIDB4MTAwMDAwMDAtMHgz ZWZlZmZmZl0KPiA+ID4gPiBwY2lfYnVzIDAwMDA6MDA6IHJvb3QgYnVzIHJlc291cmNlIFttZW0g MHg4MDAwMDAwMDAwLTB4ZmZmZmZmZmZmZl0KPiA+ID4gPiBwY2kgMDAwMDowMDowMC4wOiBbMWIz NjowMDA4XSB0eXBlIDAwIGNsYXNzIDB4MDYwMDAwCj4gPiA+ID4gcGNpIDAwMDA6MDA6MDEuMDog WzFhZjQ6MTAwMF0gdHlwZSAwMCBjbGFzcyAweDAyMDAwMAo+ID4gPiA+IHBjaSAwMDAwOjAwOjAx LjA6IHJlZyAweDEwOiBbaW8gIDB4MDA4MC0weDAwOWZdCj4gPiA+ID4gcGNpIDAwMDA6MDA6MDEu MDogcmVnIDB4MTQ6IFttZW0gMHgxMDAwMTAwMC0weDEwMDAxZmZmXQo+ID4gPiA+IHBjaSAwMDAw OjAwOjAxLjA6IHJlZyAweDIwOiBbbWVtIDB4ODAwMDAwMDAwMC0weDgwMDAwMDNmZmYgNjRiaXQg cHJlZl0KPiA+ID4gPiBwY2kgMDAwMDowMDowMS4wOiByZWcgMHgzMDogW21lbSAweGZmZmMwMDAw LTB4ZmZmZmZmZmYgcHJlZl0KPiA+ID4gPiBwY2kgMDAwMDowMDowMi4wOiBbMWFmNDoxMDAxXSB0 eXBlIDAwIGNsYXNzIDB4MDEwMDAwCj4gPiA+ID4gcGNpIDAwMDA6MDA6MDIuMDogcmVnIDB4MTA6 IFtpbyAgMHgwMDAwLTB4MDA3Zl0KPiA+ID4gPiBwY2kgMDAwMDowMDowMi4wOiByZWcgMHgxNDog W21lbSAweDEwMDAwMDAwLTB4MTAwMDBmZmZdCj4gPiA+ID4gcGNpIDAwMDA6MDA6MDIuMDogcmVn IDB4MjA6IFttZW0gMHg4MDAwMDA0MDAwLTB4ODAwMDAwN2ZmZiA2NGJpdCBwcmVmXQo+ID4gPiA+ IHBjaSAwMDAwOjAwOjAxLjA6IEJBUiA2OiBhc3NpZ25lZCBbbWVtIDB4MTAwMDAwMDAtMHgxMDAz ZmZmZiBwcmVmXQo+ID4gPiA+IHBjaSAwMDAwOjAwOjAxLjA6IEJBUiA0OiBhc3NpZ25lZCBbbWVt IDB4ODAwMDAwMDAwMC0weDgwMDAwMDNmZmYgNjRiaXQgcHJlZl0KPiA+ID4gPiBwY2kgMDAwMDow MDowMi4wOiBCQVIgNDogYXNzaWduZWQgW21lbSAweDgwMDAwMDQwMDAtMHg4MDAwMDA3ZmZmIDY0 Yml0IHByZWZdCj4gPiA+ID4gcGNpIDAwMDA6MDA6MDEuMDogQkFSIDE6IGFzc2lnbmVkIFttZW0g MHgxMDA0MDAwMC0weDEwMDQwZmZmXQo+ID4gPiA+IHBjaSAwMDAwOjAwOjAyLjA6IEJBUiAxOiBh c3NpZ25lZCBbbWVtIDB4MTAwNDEwMDAtMHgxMDA0MWZmZl0KPiA+ID4gPiBwY2kgMDAwMDowMDow Mi4wOiBCQVIgMDogYXNzaWduZWQgW2lvICAweDEwMDAtMHgxMDdmXQo+ID4gPiA+IHBjaSAwMDAw OjAwOjAxLjA6IEJBUiAwOiBhc3NpZ25lZCBbaW8gIDB4MTA4MC0weDEwOWZdCj4gPiA+ID4gdmly dGlvLXBjaSAwMDAwOjAwOjAxLjA6IGVuYWJsaW5nIGRldmljZSAoMDAwMCAtPiAwMDAzKQo+ID4g PiA+IHZpcnRpby1wY2kgMDAwMDowMDowMi4wOiBlbmFibGluZyBkZXZpY2UgKDAwMDAgLT4gMDAw MykKPiA+ID4gPiBjYWNoZWluZm86IFVuYWJsZSB0byBkZXRlY3QgY2FjaGUgaGllcmFyY2h5IGZv ciBDUFUgMAo+ID4gPiA+IHZpcnRpb19ibGsgdmlydGlvMTogW3ZkYV0gMTIyODgwIDUxMi1ieXRl IGxvZ2ljYWwgYmxvY2tzICg2Mi45IE1CLzYwLjAgTWlCKQo+ID4gPiA+IFNNQ0NDOiBTT0NfSUQ6 IEFSQ0hfRkVBVFVSRVMoQVJDSF9TT0NfSUQpIHJldHVybmVkIGVycm9yOiBmZmZmZmZmZmZmZmZm ZmZkCj4gPiA+ID4gTkVUOiBSZWdpc3RlcmVkIHByb3RvY29sIGZhbWlseSAxMAo+ID4gPiA+IFNl Z21lbnQgUm91dGluZyB3aXRoIElQdjYKPiA+ID4gPiBzaXQ6IElQdjYsIElQdjQgYW5kIE1QTFMg b3ZlciBJUHY0IHR1bm5lbGluZyBkcml2ZXIKPiA+ID4gPiBORVQ6IFJlZ2lzdGVyZWQgcHJvdG9j b2wgZmFtaWx5IDE3Cj4gPiA+ID4gTkVUOiBSZWdpc3RlcmVkIHByb3RvY29sIGZhbWlseSAxNQo+ ID4gPiA+IE5FVDogUmVnaXN0ZXJlZCBwcm90b2NvbCBmYW1pbHkgNDAKPiA+ID4gPiByZWdpc3Rl cmVkIHRhc2tzdGF0cyB2ZXJzaW9uIDEKPiA+ID4gPiBFWFQ0LWZzICh2ZGEpOiByZWNvdmVyeSBj b21wbGV0ZQo+ID4gPiA+IEVYVDQtZnMgKHZkYSk6IG1vdW50ZWQgZmlsZXN5c3RlbSB3aXRoIG9y ZGVyZWQgZGF0YSBtb2RlLiBPcHRzOiAobnVsbCkuIFF1b3RhIG1vZGU6IGRpc2FibGVkLgo+ID4g PiA+IFZGUzogTW91bnRlZCByb290IChleHQ0IGZpbGVzeXN0ZW0pIG9uIGRldmljZSAyNTQ6MC4K PiA+ID4gPiBkZXZ0bXBmczogbW91bnRlZAo+ID4gPiA+IEZyZWVpbmcgdW51c2VkIGtlcm5lbCBt ZW1vcnk6IDEwODhLCj4gPiA+ID4gUnVuIC9zYmluL2luaXQgYXMgaW5pdCBwcm9jZXNzCj4gPiA+ ID4gbW91bnQ6IHlvdSBtdXN0IGJlIHJvb3QKPiA+ID4gPiBtb3VudDogeW91IG11c3QgYmUgcm9v dAo+ID4gPiA+IG1rZGlyOiBjYW4ndCBjcmVhdGUgZGlyZWN0b3J5ICcvZGV2L3B0cyc6IFBlcm1p c3Npb24gZGVuaWVkCj4gPiA+ID4gbWtkaXI6IGNhbid0IGNyZWF0ZSBkaXJlY3RvcnkgJy9kZXYv c2htJzogUGVybWlzc2lvbiBkZW5pZWQKPiA+ID4gPiBtb3VudDogeW91IG11c3QgYmUgcm9vdAo+ ID4gPiA+IGhvc3RuYW1lOiBzZXRob3N0bmFtZTogT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQKPiA+ ID4gPiBTdGFydGluZyBzeXNsb2dkOiBPSwo+ID4gPiA+IFN0YXJ0aW5nIGtsb2dkOiBPSwo+ID4g PiA+IFJ1bm5pbmcgc3lzY3RsOiBPSwo+ID4gPiA+IEluaXRpYWxpemluZyByYW5kb20gbnVtYmVy IGdlbmVyYXRvcjogT0sKPiA+ID4gPiBTYXZpbmcgcmFuZG9tIHNlZWQ6IHJhbmRvbTogZGQ6IHVu aW5pdGlhbGl6ZWQgdXJhbmRvbSByZWFkICg1MTIgYnl0ZXMgcmVhZCkKPiA+ID4gPiBPSwo+ID4g PiA+IFN0YXJ0aW5nIG5ldHdvcms6IGlwOiBSVE5FVExJTksgYW5zd2VyczogT3BlcmF0aW9uIG5v dCBwZXJtaXR0ZWQKPiA+ID4gPiBpcDogU0lPQ1NJRkZMQUdTOiBPcGVyYXRpb24gbm90IHBlcm1p dHRlZAo+ID4gPiA+IHNlZDogL3Byb2MvbW91bnRzOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5 Cj4gPiA+ID4gV2FpdGluZyBmb3IgaW50ZXJmYWNlIGV0aDAgdG8gYXBwZWFyLi4uLi4uLi4uLi4u Li4uIHRpbWVvdXQhCj4gPiA+ID4gcnVuLXBhcnRzOiAvZXRjL25ldHdvcmsvaWYtcHJlLXVwLmQv d2FpdF9pZmFjZTogZXhpdCBzdGF0dXMgMQo+ID4gPiA+IEZBSUwKPiA+ID4gPiBjYW4ndCBvcGVu IC9kZXYvdHR5QU1BMDogUGVybWlzc2lvbiBkZW5pZWQKPiA+ID4gPiBjYW4ndCBvcGVuIC9kZXYv dHR5QU1BMDogUGVybWlzc2lvbiBkZW5pZWQKPiA+ID4gPiBjYW4ndCBvcGVuIC9kZXYvdHR5QU1B MDogUGVybWlzc2lvbiBkZW5pZWQKPiA+ID4gPiBjYW4ndCBvcGVuIC9kZXYvdHR5QU1BMDogUGVy bWlzc2lvbiBkZW5pZWQKPiA+ID4gPgo+ID4gPiA+IEFuZCBpdCBjb250aW51ZXMuLi4KPiA+ID4g Pgo+ID4gPiA+IFRoZSBxZW11IGNvbW1hbmQgSSBnb3QgZGlkIG5vdCB3b3JrICJhcyBpdCBpcyIg YW5kIGJlY2F1c2UgSSdtIG5laXRoZXIgdG9vCj4gPiA+ID4gcHJvZmljaWVudCB3aXRoIHFlbXUg bm9yIGFhcmNoNjQsIGl0IHRvb2sgYSB3aGlsZSB0byBnZXQgc29tZXRoaW5nIHVzYWJsZS4KPiA+ ID4gPiBUaGlzIGlzIG15IGN1cnJlbnQgcWVtdSBjb21tYW5kOgo+ID4gPiA+Cj4gPiA+ID4gcWVt dS1zeXN0ZW0tYWFyY2g2NCAtbm9ncmFwaGljIC1zIC1tYWNoaW5lIHZpcnQsc2VjdXJlPW9uIC1j cHUgY29ydGV4LWE1NyBcCj4gPiA+ID4gICAgICAgICAgICAgICAgICAgICAta2VybmVsIH4vUHJv amVjdHMvdHBtL2J1aWxkcm9vdC9vdXRwdXQvaW1hZ2VzL0ltYWdlIFwKPiA+ID4gPiAgICAgICAg ICAgICAgICAgICAgIC1uby1hY3BpIFwKPiA+ID4gPiAgICAgICAgICAgICAgICAgICAgIC1hcHBl bmQgJ3Jvb3Q9L2Rldi92ZGEgcncgY29uc29sZT10dHlBTUEwLDExNTIwMCAnIFwKPiA+ID4gPiAg ICAgICAgICAgICAgICAgICAgIC1kcml2ZSBmaWxlPX4vUHJvamVjdHMvdHBtL2J1aWxkcm9vdC9v dXRwdXQvaW1hZ2VzL3Jvb3Rmcy5leHQ0LGZvcm1hdD1yYXcgXAo+ID4gPiA+ICAgICAgICAgICAg ICAgICAgICAgLXNtcCAxIFwKPiA+ID4gPiAgICAgICAgICAgICAgICAgICAgIC1tb25pdG9yIHRl bG5ldDoxMjcuMC4wLjE6NTU1NTUsc2VydmVyLG5vd2FpdCBcCj4gPiA+ID4gICAgICAgICAgICAg ICAgICAgICAtbSAxMDI0IC1iaW9zIH4vUHJvamVjdHMvdHBtL2Z3L2FhcmNoNjQtZncuYmluIC1k IHVuaW1wCj4gPiA+ID4KPiA+ID4gPiBUaGVuIEkgc3RhcnQgUUVNVSBtb25pdG9yIGZyb20gYW5v dGhlciB0ZXJtaW5hbCB3aXRoOgo+ID4gPiA+Cj4gPiA+ID4gc29jYXQgdGNwLWNvbm5lY3Q6MTI3 LjAuMC4xOjU1NTU1IGZpbGU6YHR0eWAscmF3LGVjaG89MAo+ID4gPiA+Cj4gPiA+ID4gU28uLi4g d2hhdCBjb3VsZCBiZSB0aGUgaXNzdWUgd2l0aCBwZXJtaXNzaW9ucz8KPiA+ID4gPgo+ID4gPgo+ ID4gPiBJdCBtb3N0bHkgc291bmRzIGxpa2UgYW4gaXNzdWUgd2l0aCB5b3VyIGJ1aWxkcm9vdCBm aWxlc3lzdGVtLgo+ID4gPgo+ID4gPiBDYW4geW91IHRyeSB3aXRoIHRoaXMgWzFdIGluaXQgcmFt ZGlzayBpbnN0ZWFkPwo+ID4gPgo+ID4gPiAtaW5pdHJkIHJvb3Rmcy5jcGlvLmd6Cj4gPiA+Cj4g PiA+IFsxXSBodHRwczovL3Blb3BsZS5saW5hcm8ub3JnL35zdW1pdC5nYXJnL3Jvb3Rmcy5jcGlv Lmd6Cj4gPiA+Cj4gPiA+IC1TdW1pdAo+ID4KPiA+IFRoYXQgZG9lcyBub3QgaW5jbHVkZSBteSBM S00ncy4KPiA+Cj4gCj4gWW91IGNhbiBnaXZlIGEgdHJ5IHdpdGggbXkga2VybmVsIGltYWdlIFsx XSB3aGljaCBoYXMgcmVxdWlyZWQgYnVpbHQKPiBpbiBrZXJuZWwgbW9kdWxlcy4gQWxzbywgeW91 IHNob3VsZCBiZSBhYmxlIHRvIGJ1aWxkIGEgc2ltaWxhciBrZXJuZWwKPiBpbWFnZS4KPiAKPiBb MV0gaHR0cHM6Ly9wZW9wbGUubGluYXJvLm9yZy9+c3VtaXQuZ2FyZy9JbWFnZQoKSXQgY29tZXMg ZG93biB0byB0aGF0IEkgbmVlZCB0byBiZSBhYmxlIHRvIGJ1aWxkIG15IG93biBrZXJuZWwgYW5k IHVzZXIKc3BhY2UuCgpJIG5lZWQgdG8gYmUgYWJsZSB0byBidWlsZCBteSBvd24ga2VybmVsLiBU aGVyZSdzIGJlZW4gc29tZSBidWdzIHRoYXQgSSd2ZQpyZXBvcnRlZCBiYWNrIHRvIEJ1aWxkUm9v dCB3aXRoIHRoZSBsYXRlc3Qga2VybmVsIHRyZWUgYW5kIGFsc28gd2l0aApiaW51dGlscyBbKl0u CgpJJ2xsIHJldHJ5IG9uY2UgdGhleSBhcmUgZml4ZWQsIGFuZCB0cnkgdG8gZmluZCBvdXQgd2hh dCBpdCBjYXVzaW5nIHRoZQpwcm9ibGVtLgoKWypdIGh0dHBzOi8vYnVncy5idXN5Ym94Lm5ldC9z aG93X2J1Zy5jZ2k/aWQ9MTM1NDYKCi9KYXJra28KCl9fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4 LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK