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 Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 44C6CC433F5 for ; Mon, 23 May 2022 13:23:25 +0000 (UTC) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 18B6983F6A; Mon, 23 May 2022 15:23:23 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=konsulko.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=konsulko.com header.i=@konsulko.com header.b="QONqkS6k"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 1819580885; Mon, 23 May 2022 15:23:21 +0200 (CEST) Received: from mail-qv1-xf2c.google.com (mail-qv1-xf2c.google.com [IPv6:2607:f8b0:4864:20::f2c]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id CAB72840FD for ; Mon, 23 May 2022 15:23:15 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=konsulko.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=trini@konsulko.com Received: by mail-qv1-xf2c.google.com with SMTP id e17so12054956qvj.11 for ; Mon, 23 May 2022 06:23:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=konsulko.com; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to; bh=EKk8nIiGTg99KyiMPiCzzgFBTZgxhdmvHfAg3BTE34A=; b=QONqkS6kRY6MnqjUOw3BGL3GHJzhf9i0sjSafRF+LbIoiPBSQzj5uaLS30vif52pU5 dcm9SlnWlSzZ/JUokbtleWua7XcpyesOJQzNunhKGQIIAvJWBCN9tP+/MZRK5sljZ1nM bpqIP/MY2VQrieVTZnLJvdvwhjrQMfF7XBcXk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=EKk8nIiGTg99KyiMPiCzzgFBTZgxhdmvHfAg3BTE34A=; b=SNITFnmf45cvz94vjqYyeTy4t/RFXWmZA+djMwmEyVEOa1B/nu36pw+qsyq44cnVYx m7nLWXTBne45euyDZFIQ5q+Lkg4Em+yB8GtSK9RW1B4604oU6FuUr9qY/OIUs2EUsBRf FjaaamAkocAvecCwlF2D7VYnm0ybLgJIg0yK6mmkWE/P0gOzwoRj4mvic5Fk5SXXEt3C Z12bVPzbNtKyAmc6WONp2VpmeZexMWAvjUorN17ZeZt2oA3gfmDyPxqQnour8aX7BdoN UZQt475xirPYYqp+oIVXnYvfPXr5KXouOemGh35hVg2i1nkDez9xpw7BxlFJyYBSl/7z 8DBA== X-Gm-Message-State: AOAM530aZ0q2LLzB9lcWJSwhWzS/ybGgrMZ3/HvBELwgWiODh2kyBVQh horjIqpatou2hrln7iX74GeXmg== X-Google-Smtp-Source: ABdhPJwvIoxWh7HEL5MCRkmTTpEulWl/LTiOMrsNaQ77+KKf6juviMePdtHbqn69978U5ULVZm+SPA== X-Received: by 2002:a05:6214:2245:b0:461:bc38:1f7d with SMTP id c5-20020a056214224500b00461bc381f7dmr17127337qvc.63.1653312194446; Mon, 23 May 2022 06:23:14 -0700 (PDT) Received: from bill-the-cat (2603-6081-7b00-25fd-0000-0000-0000-1003.res6.spectrum.com. [2603:6081:7b00:25fd::1003]) by smtp.gmail.com with ESMTPSA id o79-20020a37a552000000b006a34bdb0c36sm4433603qke.31.2022.05.23.06.23.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 May 2022 06:23:13 -0700 (PDT) Date: Mon, 23 May 2022 09:23:11 -0400 From: Tom Rini To: Neil Armstrong Cc: Peter Hoyes , "u-boot@lists.denx.de" , "bmeng.cn@gmail.com" , "sjg@chromium.org" , "kory.maincent@bootlin.com" , Andre Przywara , Diego Sueiro Subject: Re: [PATCH] cmd: pxe_utils: Check fdtcontroladdr in label_boot Message-ID: <20220523132311.GL13239@bill-the-cat> References: <20211014084004.3173835-1-peter.hoyes@arm.com> <20220518155253.GF3901321@bill-the-cat> <17defab5-a104-3fe9-c87a-0ba18dae799e@baylibre.com> <5736e298-d2c1-7e34-1db8-5ddd5fb6e4bf@baylibre.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="mPOSj6iWmtyhwOMz" Content-Disposition: inline In-Reply-To: <5736e298-d2c1-7e34-1db8-5ddd5fb6e4bf@baylibre.com> X-Clacks-Overhead: GNU Terry Pratchett X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.5 at phobos.denx.de X-Virus-Status: Clean --mPOSj6iWmtyhwOMz Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Mon, May 23, 2022 at 09:25:55AM +0200, Neil Armstrong wrote: > Hi, >=20 > On 19/05/2022 14:58, Peter Hoyes wrote: > > On 18/05/2022 19:15, Neil Armstrong wrote: > > > On 18/05/2022 17:52, Tom Rini wrote: > > > > On Wed, May 18, 2022 at 10:40:12AM +0200, Neil Armstrong wrote: > > > > > Hi, > > > > >=20 > > > > > On 14/10/2021 10:40, Peter Hoyes wrote: > > > > > > From: Peter Hoyes > > > > > >=20 > > > > > > If using OF_CONTROL, fdtcontroladdr is set to the fdt used to c= onfigure > > > > > > U-Boot. When using PXE, if no fdt is defined in the menu file, = and > > > > > > there is no fdt at fdt_addr, add fall back on fdtcontroladdr to= o. > > > > > >=20 > > > > > > We are developing board support for the Armv8r64 FVP using > > > > > > config_distro_bootcmd. We are also using OF_BOARD and would lik= e the > > > > > > PXE boot option to default to the fdt provided by board_fdt_blo= b_setup. > > > > > >=20 > > > > > > Signed-off-by: Peter Hoyes > > > > > > --- > > > > > > =A0=A0 cmd/pxe_utils.c | 8 +++++++- > > > > > > =A0=A0 1 file changed, 7 insertions(+), 1 deletion(-) > > > > > >=20 > > > > > > diff --git a/cmd/pxe_utils.c b/cmd/pxe_utils.c > > > > > > index 067c24e5ff..8f8e69ca97 100644 > > > > > > --- a/cmd/pxe_utils.c > > > > > > +++ b/cmd/pxe_utils.c > > > > > > @@ -556,7 +556,10 @@ static int label_boot(struct cmd_tbl *cmdt= p, struct pxe_label *label) > > > > > > =A0=A0=A0=A0=A0=A0=A0 * Scenario 2: If there is an fdt_addr spe= cified, pass it along to > > > > > > =A0=A0=A0=A0=A0=A0=A0 * bootm, and adjust argc appropriately. > > > > > > =A0=A0=A0=A0=A0=A0=A0 * > > > > > > -=A0=A0=A0=A0 * Scenario 3: fdt blob is not available. > > > > > > +=A0=A0=A0=A0 * Scenario 3: If there is an fdtcontroladdr speci= fied, pass it along to > > > > > > +=A0=A0=A0=A0 * bootm, and adjust argc appropriately. > > > > > > +=A0=A0=A0=A0 * > > > > > > +=A0=A0=A0=A0 * Scenario 4: fdt blob is not available. > > > > > > =A0=A0=A0=A0=A0=A0=A0 */ > > > > > > =A0=A0=A0=A0=A0=A0 bootm_argv[3] =3D env_get("fdt_addr_r"); > > > > > > @@ -646,6 +649,9 @@ static int label_boot(struct cmd_tbl *cmdtp= , struct pxe_label *label) > > > > > > =A0=A0=A0=A0=A0=A0 if (!bootm_argv[3]) > > > > > > =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 bootm_argv[3] =3D env_get("fdt_a= ddr"); > > > > > > +=A0=A0=A0 if (!bootm_argv[3]) > > > > > > +=A0=A0=A0=A0=A0=A0=A0 bootm_argv[3] =3D env_get("fdtcontroladd= r"); > > > > > > + > > > > > > =A0=A0=A0=A0=A0=A0 if (bootm_argv[3]) { > > > > > > =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (!bootm_argv[2]) > > > > > > =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 bootm_argv[2] =3D "-= "; > > > > >=20 > > > > > This change makes a regression when using a FIT image as kernel i= mage within an extlinux.conf > > > > >=20 > > > > > Before this change, when a DT wasn't specified, the DT in the FIT= image was selected, > > > > > not the u-boot DT is selected. > > > > >=20 > > > > > While it should work because the U-Boot DT should work in Linux, = it's not always the case. > > > > >=20 > > > > > Before: > > > > > Found /extlinux/extlinux.conf > > > > > Retrieving file: /extlinux/extlinux.conf > > > > > 1:=A0=A0=A0 Yocto > > > > > Retrieving file: /fitImage > > > > > append: root=3DPARTUUID=3Dfd26d57f-02 rootwait console=3DttyAML0,= 115200 > > > > > ## Loading kernel from FIT Image at 08080000 ... > > > > > =A0=A0=A0 Using 'conf-amlogic_meson-gxl-s905x-libretech-cc.dtb' c= onfiguration > > > > > =A0=A0=A0 Trying 'kernel-1' kernel subimage > > > > > =A0=A0=A0=A0=A0 Description:=A0 Linux kernel > > > > > =A0=A0=A0=A0=A0 Type:=A0=A0=A0=A0=A0=A0=A0=A0 Kernel Image > > > > > =A0=A0=A0=A0=A0 Compression:=A0 gzip compressed > > > > > =A0=A0=A0=A0=A0 Data Start:=A0=A0 0x08080120 > > > > > =A0=A0=A0=A0=A0 Data Size:=A0=A0=A0 9926956 Bytes =3D 9.5 MiB > > > > > =A0=A0=A0=A0=A0 Architecture: AArch64 > > > > > =A0=A0=A0=A0=A0 OS:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 Linux > > > > > =A0=A0=A0=A0=A0 Load Address: 0x01080000 > > > > > =A0=A0=A0=A0=A0 Entry Point:=A0 0x01080000 > > > > > =A0=A0=A0=A0=A0 Hash algo:=A0=A0=A0 sha256 > > > > > =A0=A0=A0=A0=A0 Hash value: 5181a76e4e7a728e24cd8569f8e48c543ac25= 9bf4d66591a3dc5e166d709429e > > > > > =A0=A0=A0 Verifying Hash Integrity ... sha256+ OK > > > > > ## Loading fdt from FIT Image at 08080000 ... > > > > > =A0=A0=A0 Using 'conf-amlogic_meson-gxl-s905x-libretech-cc.dtb' c= onfiguration > > > > > =A0=A0=A0 Trying 'fdt-amlogic_meson-gxl-s905x-libretech-cc.dtb' f= dt subimage > > > > > =A0=A0=A0=A0=A0 Description:=A0 Flattened Device Tree blob > > > > > =A0=A0=A0=A0=A0 Type:=A0=A0=A0=A0=A0=A0=A0=A0 Flat Device Tree > > > > > =A0=A0=A0=A0=A0 Compression:=A0 uncompressed > > > > > =A0=A0=A0=A0=A0 Data Start:=A0=A0 0x089f7b78 > > > > > =A0=A0=A0=A0=A0 Data Size:=A0=A0=A0 29092 Bytes =3D 28.4 KiB > > > > > =A0=A0=A0=A0=A0 Architecture: AArch64 > > > > > =A0=A0=A0=A0=A0 Hash algo:=A0=A0=A0 sha256 > > > > > =A0=A0=A0=A0=A0 Hash value: 72e5e4fcbb4aa59042377720e5636132ba790= d85b6c3f6442446acc63f48cf67 > > > > > =A0=A0=A0 Verifying Hash Integrity ... sha256+ OK > > > > > =A0=A0=A0 Booting using the fdt blob at 0x89f7b78 > > > > > =A0=A0=A0 Uncompressing Kernel Image > > > > > =A0=A0=A0 Loading Device Tree to 000000007bf2f000, end 000000007b= f391a3 ... OK > > > > >=20 > > > > >=20 > > > > > After: > > > > > Found /extlinux/extlinux.conf > > > > > Retrieving file: /extlinux/extlinux.conf > > > > > 1:=A0=A0=A0 Yocto > > > > > Retrieving file: /fitImage > > > > > append: root=3DPARTUUID=3Dfd26d57f-02 rootwait console=3DttyAML0,= 115200 > > > > > ## Loading kernel from FIT Image at 08080000 ... > > > > > =A0=A0=A0 Using 'conf-amlogic_meson-gxl-s905x-libretech-cc.dtb' c= onfiguration > > > > > =A0=A0=A0 Trying 'kernel-1' kernel subimage > > > > > =A0=A0=A0=A0=A0 Description:=A0 Linux kernel > > > > > =A0=A0=A0=A0=A0 Type:=A0=A0=A0=A0=A0=A0=A0=A0 Kernel Image > > > > > =A0=A0=A0=A0=A0 Compression:=A0 gzip compressed > > > > > =A0=A0=A0=A0=A0 Data Start:=A0=A0 0x08080120 > > > > > =A0=A0=A0=A0=A0 Data Size:=A0=A0=A0 9926956 Bytes =3D 9.5 MiB > > > > > =A0=A0=A0=A0=A0 Architecture: AArch64 > > > > > =A0=A0=A0=A0=A0 OS:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 Linux > > > > > =A0=A0=A0=A0=A0 Load Address: 0x01080000 > > > > > =A0=A0=A0=A0=A0 Entry Point:=A0 0x01080000 > > > > > =A0=A0=A0=A0=A0 Hash algo:=A0=A0=A0 sha256 > > > > > =A0=A0=A0=A0=A0 Hash value: 5181a76e4e7a728e24cd8569f8e48c543ac25= 9bf4d66591a3dc5e166d709429e > > > > > =A0=A0=A0 Verifying Hash Integrity ... sha256+ OK > > > > > ## Flattened Device Tree blob at 7bf40210 > > > > > =A0=A0=A0 Booting using the fdt blob at 0x7bf40210 > > > > > =A0=A0=A0 Uncompressing Kernel Image > > > > > =A0=A0=A0 Loading Device Tree to 000000007bf2c000, end 000000007b= f38ba7 ... OK > > > > >=20 > > > > >=20 > > > > > Note this is the "best in town" boot method in Yocto/OE when usin= g WIC, FIT Image and > > > > > generating extlinux.conf from the WIC "bootimg-partition" plugin. > > > > >=20 > > > > > So this change will regress all platforms using this scheme. > > > > >=20 > > > > > In case we only want the FIT image and not DTB, the fdtdir is omm= ited at: > > > > > https://github.com/openembedded/openembedded-core/blob/9015dec932= 33c7d45fd0c9885ff5d4ec23ad377d/scripts/lib/wic/plugins/source/bootimg-parti= tion.py#L150 > > > >=20 > > > > Well this is certainly tricky.=A0 Do we be "boring" and say that the > > > > built-in device tree should be used, or "boring" and say that the d= istro > > > > provided device tree should be used.=A0 I assume that in the OE cas= e we're > > > > not always going to be booting U-Boot that was built, so updating t= he > > > > logic there to have the correct dtb isn't right either. > > > >=20 > > >=20 > > > I'm not against this logic, it should definitely be aligned on EFI an= d permit > > > using built-in DT, but the logic breaks fitImage loading via extlinux= , because > > > now we have no way to say "use the fitImage DT". > > >=20 > > > This change should have been elsewhere, like in the non-FIT bootm pat= h when > > > no DT was supplied and DT is mandatory for the platform. > > >=20 > > > Or by passing a keyword like fdt-built-in or ftdfile=3Dbuiltin. > >=20 > > I agree the correct logic should be: > >=20 > > =A0* Use the extlinux.conf fdt file, if defined > > =A0* Use a FIT fdt, if available > > =A0* Use fdtcontroladdr, as a last resort > >=20 > > , so FIT images was an oversight. > >=20 > > >=20 > > > =3D=3D><=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > > diff --git a/boot/pxe_utils.c b/boot/pxe_utils.c > > > index 0c24becae3..22040c2340 100644 > > > --- a/boot/pxe_utils.c > > > +++ b/boot/pxe_utils.c > > > @@ -682,7 +682,7 @@ static int label_boot(struct pxe_context *ctx, st= ruct pxe_label *label) > > > =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= fdtfile =3D fdtfilefree; > > > =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 } > > >=20 > > > -=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (fdtfile) { > > > +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (strcmp(fdtfile, "buil= tin") && fdtfile) { > > > =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= int err =3D get_relfile_envaddr(ctx, fdtfile, > > > "fdt_addr_r", NULL); > > >=20 > > > @@ -724,7 +724,7 @@ static int label_boot(struct pxe_context *ctx, st= ruct pxe_label *label) > > > =A0=A0=A0=A0=A0=A0=A0 if (!bootm_argv[3]) > > > =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 bootm_argv[3] =3D env_g= et("fdt_addr"); > > >=20 > > > -=A0=A0=A0=A0=A0=A0 if (!bootm_argv[3]) > > > +=A0=A0=A0=A0=A0=A0 if (!strcmp(fdtfile, "builtin")) > > > =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 bootm_argv[3] =3D env_g= et("fdtcontroladdr"); > > >=20 > > > =A0=A0=A0=A0=A0=A0=A0 if (bootm_argv[3]) { > > > =3D=3D><=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > >=20 > > > Or by checking the image format before using fdtcontroladdr like: > > >=20 > > > =3D=3D><=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > > diff --git a/boot/pxe_utils.c b/boot/pxe_utils.c > > > index 0c24becae3..f4f6369de6 100644 > > > --- a/boot/pxe_utils.c > > > +++ b/boot/pxe_utils.c > > > @@ -724,7 +724,7 @@ static int label_boot(struct pxe_context *ctx, st= ruct pxe_label *label) > > > =A0=A0=A0=A0=A0=A0=A0 if (!bootm_argv[3]) > > > =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 bootm_argv[3] =3D env_g= et("fdt_addr"); > > >=20 > > > -=A0=A0=A0=A0=A0=A0 if (!bootm_argv[3]) > > > +=A0=A0=A0=A0=A0=A0 if (genimg_get_format(buf) !=3D IMAGE_FORMAT_FIT = && !bootm_argv[3]) > > > =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 bootm_argv[3] =3D env_g= et("fdtcontroladdr"); > > >=20 > > > =A0=A0=A0=A0=A0=A0=A0 if (bootm_argv[3]) { > > > =3D=3D><=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > >=20 > > > Neil > >=20 > > Your second diff above seems like the least invasive way of achieving t= his behavior. > >=20 > > I did wonder whether it would make sense to add a global 'fdtcontroladd= r' fallback for bootm (i.e. in boot_get_fdt in image-fdt.c), so that: > >=20 > > =A0=A0 bootm $kernel_addr_r > >=20 > > falls back to $fdtcontroladdr (if valid) as a last resort. Then we coul= d remove the branch in pxe_utils, and the FIT logic would happen in the rig= ht order. It looks like bootefi already does something similar, but I guess= modifying the bootm behavior would affect a lot of existing boards. >=20 > Probably, but I think getting back fit image working would be the priorit= y. >=20 > Tom, should I send the last change ? Yes please, thanks! --=20 Tom --mPOSj6iWmtyhwOMz Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQGzBAABCgAdFiEEGjx/cOCPqxcHgJu/FHw5/5Y0tywFAmKLirQACgkQFHw5/5Y0 tyyv/QwApSw/hIZrLNlA4AFxDTa9VmvB5MpI8YZUD9aZnZYQR2IAwb3SW6URgzo+ shYOl6i02hzSRoa//OrxWHW+QYGWcMQdvHOF31a1Vo4Tl12YYEs0pMnHkcgnZZlt 7QPrTRY8K4qgMNkD4gBkYZjdop2vPqagyp1hpg/yWBZXnGEeviC8ZSldcJt9ka1S GQAVFoyF/OAVomx28ko+/kGFnDaZzYgr4dpWvl1PSjCRfFKeVRLF5WB7SZcqv72B 1PTZT+EuR5OaEQ7Bme2xTy9Crt5OVhaGJvi73Ec0GN2FeSn7nX0WH4DjNud42Oq2 xRynpDlVzkyTF8yp4khvDdSYxesy0JvKwU5T1sqnH3JYhbP0lCjvzArfGDA5hvEt SPIk7jsTyBvirm+iAY3lNIHBbbmtljkvKh/LQ5MXJLZTBYom/W05wlUgI4dJGNif sN7vGf5VKtx2aefHPL1QjrnJIsHewohgUurhZU4zPFZpzcSIwkYq1+Sat+9vK3Gy 4DZdIge9 =RbHH -----END PGP SIGNATURE----- --mPOSj6iWmtyhwOMz--