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 EC5D2C38A2D for ; Tue, 25 Oct 2022 12:59:33 +0000 (UTC) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id E70CD84D54; Tue, 25 Oct 2022 14:59:31 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=sancloud.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=sancloud.onmicrosoft.com header.i=@sancloud.onmicrosoft.com header.b="fe5PIhbS"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id ACA6084D58; Tue, 25 Oct 2022 14:59:30 +0200 (CEST) Received: from GBR01-LO2-obe.outbound.protection.outlook.com (mail-lo2gbr01on2119.outbound.protection.outlook.com [40.107.10.119]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 1276884D44 for ; Tue, 25 Oct 2022 14:59:27 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=sancloud.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=paul.barker@sancloud.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Gz4hNNKX6zjCdaMZqpTpnpHyiw1R2/AN0EN689MJ+acTeGgwf6d4gRY0GEd4mm/IlewS9QTPQ2wNxX18J30PvbdGeTYS0AgnBm+THUqclyAtbTZZdyPQmoH+MMGLYvetJPh0vJ3RalmQoeOGKvqJ0+8T8EsKVtCIBXj2sVId9J/rwYDbnbKkrbgPENHOgcGztAhkZHevtuAmojUNtW+KA+N/c2Dp0C0GZ49ksg7hkS5bLUzV959rUZrzMFgN+26Ykp6x5+qBOy8Fju/m7OenBoMHPMZuZ712K52wweyru1BQRE+vh3k5knASPXw8H0Cm0We8XZe3RJMjK8sTiNp1mQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=vIubnsoVlPUTHFKkNpLn/KjGXODEyn6xacKtTJauMQ0=; b=OqmH/kjWnNFORauK2hU7zfu5UNOcO+zugaAcDI/8tZ456FpwX3Lv3+TsOMN9LOQiw82DPmnOMlqUfgaFvE0u8w+1xQeg3t88JtAXtidxZHNRL3odKCVaWUVSAZW7sV8EyE6k5cp0/aoDmmX/Idb8rkl0mjWrhGHMBh4wmeVpjwgSh0h1VpZ6Il1T9fdwoBH7gWGIt9QezHuNPzgqQyWrGs1yR/cBVh6gTo3DtLmb7ba4cq4UT/T4riSA065v/sgVhEzKkQCIJVD5iiFJEmEZjJUC8kjr8LpgSw1h41r8MUUHDrfZW/d8DmSv3MpMp2gYDNYmfh12ohNqtbmgCZCtqA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=sancloud.com; dmarc=pass action=none header.from=sancloud.com; dkim=pass header.d=sancloud.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sancloud.onmicrosoft.com; s=selector2-sancloud-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=vIubnsoVlPUTHFKkNpLn/KjGXODEyn6xacKtTJauMQ0=; b=fe5PIhbSL0rYgBh2PxlOp73K2OnzHvXEdFgJiIzonWWQt6GbZbVlP2K3GHmx2FI/owQYEmtneXhkcNLBJKr3Yq73kwIWiUoCQezhoTjNVIE+YE0L8APeyCuTQ9VcNnMD6axQVCF0Bhv5Mo3hAAj++wj8k0ZDTvdrX2lqPm014zo= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=sancloud.com; Received: from CWXP123MB2248.GBRP123.PROD.OUTLOOK.COM (2603:10a6:401:7e::18) by CWLP123MB3377.GBRP123.PROD.OUTLOOK.COM (2603:10a6:400:6a::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5746.26; Tue, 25 Oct 2022 12:59:25 +0000 Received: from CWXP123MB2248.GBRP123.PROD.OUTLOOK.COM ([fe80::749c:2fc:9577:b905]) by CWXP123MB2248.GBRP123.PROD.OUTLOOK.COM ([fe80::749c:2fc:9577:b905%3]) with mapi id 15.20.5746.023; Tue, 25 Oct 2022 12:59:25 +0000 Message-ID: Date: Tue, 25 Oct 2022 13:59:24 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.4.0 To: Simon Glass Cc: u-boot@lists.denx.de References: <20221015091909.3957290-1-paul.barker@sancloud.com> <20221015091909.3957290-2-paul.barker@sancloud.com> From: Paul Barker Subject: Re: [PATCH 1/2] dm: core: Fix iteration over driver_info records In-Reply-To: Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="------------62Nw090KvrzuS1q1r2u0ZRgN" X-ClientProxiedBy: LO2P265CA0462.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:a2::18) To CWXP123MB2248.GBRP123.PROD.OUTLOOK.COM (2603:10a6:401:7e::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CWXP123MB2248:EE_|CWLP123MB3377:EE_ X-MS-Office365-Filtering-Correlation-Id: 1567fa4f-f792-45da-55de-08dab688be6e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 23NKM4cV/HIxiIwM9lAhEVbJbRdb/lRbB8MLp2LHfMymyNJ6gTuncfqSxsxxYx8hF3FhDFq/P8PEAQQvDv0tN5+t5MGJPMVmp7ldjbVgGal+WZXdBwQm+cvrNPPQaPZQxc9JD0IKU66oIJUEgnzm72RdBPEYx/RBdAGE69U1KnT0Aa/f3JBRL5iD6Ad6jQb2MdJyGg9KOKPHl4pScUa5i/oAKQj38cNCW+kRHQ+y3tN1tXMLcPfUnf0Ey2iY7QC5qwWfeSncpc5aGEkYzgDPqnUOxpsY3lSg9y15HtVjTIo4Ecxn6MpyEIPv8sGciSQzjvGj9XdAtHQJyZgWjegbrVC55kEcGcJXo8eu2I/EcFbuZA4XERzoXwCHHNyEDfv1BIln/ZSjMSndMsaMheB44GMGPqOt7pWLveBdBZE6T/hXzK7fu2nUtYz4dp87mnbe4AALAwUY4xBLzy7etNAfv5r03hwhWLe0E5cgh/WgP2uKclRhtaIV9z9QiNqCDCtqxlPnKfP1UrXeceuN9x1+7TC4epegYB4jEUjq2LbyZAOht2cXpTVzHskNWhNedUMoYIsZjJVHGNrOEek5fglWL6WZALQZszjk1EMY8kPeaG2XiVaa0cCTsE+dP/0FpKDOElbGZLTVpWVXy+FLtS4GGdBuv/2sa5B3VfIyhuvlmMX+rtr4fKjLxkNQl1qVAgd0jjoa9DMAbAcOrlkS+xq3DYVlDrAzQ+e1uUVZD4OsS/X5tYmy2wb6WGx0yRD/BsUvwa2MGz2PGSJu1drXyVPWco34tU0JVVWGPjszKRzyBhtCCWg/lqZwrcPaBTbJJvy31SGzydXSvoZIjL/LP2uaq1Buk12GxCbGwKJaRP6ipoo= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:CWXP123MB2248.GBRP123.PROD.OUTLOOK.COM; PTR:; CAT:NONE; SFS:(13230022)(376002)(136003)(39830400003)(346002)(366004)(396003)(451199015)(83380400001)(86362001)(21480400003)(38100700002)(66946007)(38350700002)(66476007)(31696002)(5660300002)(8936002)(235185007)(66556008)(4326008)(44832011)(8676002)(53546011)(52116002)(2906002)(6506007)(33964004)(26005)(2616005)(6512007)(6916009)(966005)(478600001)(6486002)(316002)(186003)(41300700001)(31686004)(36756003)(45980500001)(43740500002); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?b2RacThjMDh0N1lmN0ZNcVpreDdRRlN5MXBtcTB4S1JOekgwQVQvRXZIdHBY?= =?utf-8?B?Wm10eEVlMk5FRU05QnBOOG9JWXVGQ3NWSVljUXlqWFdHTVErMFVYNzlZT0ps?= =?utf-8?B?RUhGNWpUcHk0NnNLMVNTZXNDNEV2OXB0UitYQ0Q3SGFESVZ0SzNhWnJ6Qkov?= =?utf-8?B?ZGl6Z01uaStwblFpd2x0ZVowbDA4Qi95cjlNOXNRUkJUUHN1bkRlNGZzdkJB?= =?utf-8?B?Ujc2amY2YzlLdDdTemltRGNNOUJINEY0U0pOcFdIK1NXc2JqMG9QaHFXN1RO?= =?utf-8?B?VDk1VUJNUm52ZGl1b0ZIanA5amxQYjJlU29vYVh3cGd2dFp6NThWaVhDdEdK?= =?utf-8?B?cWhBYmlwU2RibEVIcy9BcStYanptUHdvWjByMDljS29DcWVaVitoYVZTeXhj?= =?utf-8?B?NmpSWWlSRTMvOTFXbkVyNUJZRklXa2ZLK1JsemFtYk5BNXgvVHB6QWYzeW9k?= =?utf-8?B?ajdqTWVpcXFjRFZzY0JBQjdqYWpqWm96TnhVdHhSYkxIUzlBV3U2SVAvY0x1?= =?utf-8?B?M0JqaStFVmxDU3FUZk9QZEV3TExIS3FYSmg1UXZnQ1Y1QWY3cHVXVVRWSmt3?= =?utf-8?B?VlMrbGRWYzlTTFB4R2NaYjdnOU8zWFhQMGxwd0NseVhXUTNuWXc4NE04YTJq?= =?utf-8?B?UHJyUlpVV29YK3pRUmJMSHY5bWdqTHoyUDYrZ3lDMHV6dWJTcW1uSkdvVEk3?= =?utf-8?B?ank4TmJoZnA3QS80WEl6c2w0OC9KTmZubGcxbXdSV2poeU1oYVY3WjRHYnd1?= =?utf-8?B?TVNmMXlxa2NoU09VRDIxU1FOaE9KSzM2QU95N3JvUytSQW40RlEzaERDK1lN?= =?utf-8?B?M1k3dGVBVEhCRTMvNjlZbGNKVVBQSStiSHhxc0kxM2VFYUFXSGJzRXRvMVk5?= =?utf-8?B?dUpWVnJEcHU2WEtOQURrMThoN3VMZW9TZzZ3WXgyVEVEUXJKL1IzK29LaVQ3?= =?utf-8?B?UHFGT3k3ZXVqMlJqb2FiZFo0OHlGTTJIa1NETjNqZVV5WG5kK2JjODRYdUtI?= =?utf-8?B?b3gwTUZJRCttcTZiK0dZWmhMQnNWdGQ0QjFoZ3lvZGpYMHNjNVhWUjVMcmNp?= =?utf-8?B?YTR6RWZ6Y1ZtMzMzSXBTVDg4MmpXd2xJU1k4dzZIWXdWYWJRODlnVmRIMXFn?= =?utf-8?B?ZFF1WHgwSGFwaEI0U2xaSFRCeWhOaG5FazRTMVBFWDNtS3A3aks5VFVTdGxq?= =?utf-8?B?WWhYMDdlSTI2VTU2Uko3SVVwL0FINENBU3RsVW5RdUtHaWp3Wml5dEFvdUdH?= =?utf-8?B?M3NGZUFJRk56QkQrbFFyd2VMaEZUY3BDQW9zV0l2NU9QOHYyTlZEaFc2RjQ3?= =?utf-8?B?VkZtL0pQY2VxZzJYL24wZ3IwTTFQRktWekhpMmd2MTZnZ1RpWVZjMTg0S1Z5?= =?utf-8?B?eEZ2MmpselRKbjFLOTN1VTVteUdFOUgyam8yb3lQL0FvU0ZWeWhzL00rTDF4?= =?utf-8?B?c2tMdXBCNGdCK2lzbzdQQzhtUlBGaDkzR1ZLM2xaUjlLU1BVVmROb1BOckNC?= =?utf-8?B?Tkh0b0pVS3l3SzhXTkhnYXM4S1QzMHdpK2JqNnNnc2ZoM3Y5ejJQSEVMVGhl?= =?utf-8?B?Q3pUT050VitOcjlQVU9zQUJQeDFJcnJmL1BHSE15eU1XV1dSNEZZVEtBY0kw?= =?utf-8?B?RVZDMTJQKzRiTTgyWlB0M2lrVlFOdEsxb3YxZHY2bWhqMkVhajBsOEZDdGU2?= =?utf-8?B?R3hwMU9PcGtJSjRBaVl3L2tjbWtybVlmcmRGT0lHRlM1MWMzSXZycGswY0FE?= =?utf-8?B?bHVLQVBkS29tVHBxMWd4T1lma2VlWXdVYmJEYzJ0SjViUUdETVIyZVBZeXhT?= =?utf-8?B?MFFiQVJBYTVZdm1Nc2ZMYUtzd1FSUzhtS2N1emF6U2U3QWsxNUkzdnJUaE1E?= =?utf-8?B?VFc0aEVZUXRYZ3BGUDhMK25lM3lmSDRpOEt5OEZHVXdONjFqa1NGUEhvRUpx?= =?utf-8?B?QkpEeEM4RmhuVE91emYyRlFDNjZZY1RSMEZGUFVwQ2NKM003QXFabGRObnVE?= =?utf-8?B?WHdvS294c2xZb2hPNG8yb2lrdkRWd3lkVDRLVi93K1VNb0plT2tvdWNlT1Fw?= =?utf-8?B?bnAyZnYxZXh1SFZsMjN6aGNJVUp3Vmh5VjlzbTErTWNPaWlmMFFLOGFjTSt2?= =?utf-8?B?Vld0VjYxWWZ6U3FkMVRYN2s3QjkvTURrWVZMY1pqcC9CSkFmKzlHbm1EVGU4?= =?utf-8?B?dGc9PQ==?= X-OriginatorOrg: sancloud.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1567fa4f-f792-45da-55de-08dab688be6e X-MS-Exchange-CrossTenant-AuthSource: CWXP123MB2248.GBRP123.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Oct 2022 12:59:25.4305 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 840be37c-244a-450e-9bcc-2064862de1f4 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 4IVbA0XhbQYr2nSKQpoSHazwI1ohFBLMpWgI7wl/vvthuZRXjW1n9Flso0x97yJ3P7aYytY5FERMK4IINaLJSPU7WTP0ugp21/APDZKlPfE= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CWLP123MB3377 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.6 at phobos.denx.de X-Virus-Status: Clean --------------62Nw090KvrzuS1q1r2u0ZRgN Content-Type: multipart/mixed; boundary="------------lKiHASygXpgoA5RT2nAu0aZY"; protected-headers="v1" From: Paul Barker To: Simon Glass Cc: u-boot@lists.denx.de Message-ID: Subject: Re: [PATCH 1/2] dm: core: Fix iteration over driver_info records References: <20221015091909.3957290-1-paul.barker@sancloud.com> <20221015091909.3957290-2-paul.barker@sancloud.com> In-Reply-To: --------------lKiHASygXpgoA5RT2nAu0aZY Content-Type: multipart/mixed; boundary="------------B4GMZ4w0VP4BAtnMWWo8YViN" --------------B4GMZ4w0VP4BAtnMWWo8YViN Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On 15/10/2022 18:53, Simon Glass wrote: > Hi Paul, >=20 > On Sat, 15 Oct 2022 at 03:19, Paul Barker wr= ote: >> >> We should only perform additional iteration steps when needed to >> initialize the parent of a device. Other binding errors (such as a >> missing driver) should not lead to additional iteration steps. >> >> Unnecessary iteration steps can cause issues when memory is tightly >> constrained (such as in the TPL/SPL) since device_bind_by_name() >> unconditionally allocates memory for a struct udevice. On the SanCloud= >> BBE this led to boot failure caused by memory exhaustion in the SPL >> when booting from SPI flash. >> >> Signed-off-by: Paul Barker >> --- >> drivers/core/lists.c | 17 ++++++----------- >> 1 file changed, 6 insertions(+), 11 deletions(-) >=20 > Are you able to construct a test for this? See test/dm/core.c or test-f= dt.c I can't see how to construct a test case for this issue. What I observed was the SPL crashing during the pre-relocation lists_bind_drivers() call due to exhaustion of the available memory. On the AM335x SoC this is 64k of on-board SRAM which is available before main DRAM is initialised. I can't see how to reproduce this issue within the u-boot test framework as significantly more memory is available when running the u-boot sandbox and so memory exhaustion does not occur. If there are other side effects than memory leaking here then I'm not familiar enough with the u-boot device model to spot them. Each call to bind_drivers_pass() calls device_bind_by_name() for every driver_info record, with no way of checking whether a particular driver_info record has already been handled by a previous call to bind_drivers_pass(). This leaks memory as each call to device_bind_by_name() allocates a new device object. >=20 > Also, I think bind_drivers_pass() needs a function comment that > describes in detail what is going on. Agreed, I'll see what I can add when I revisit this. >=20 > Would it be possible to achieve the same effect while keeping that > function the same as now? See below. >=20 >> >> diff --git a/drivers/core/lists.c b/drivers/core/lists.c >> index c49695b24f00..82d479564121 100644 >> --- a/drivers/core/lists.c >> +++ b/drivers/core/lists.c >> @@ -51,13 +51,13 @@ struct uclass_driver *lists_uclass_lookup(enum ucl= ass_id id) >> return NULL; >> } >> >> -static int bind_drivers_pass(struct udevice *parent, bool pre_reloc_o= nly) >> +static bool bind_drivers_pass(struct udevice *parent, bool pre_reloc_= only, >> + int *result) >> { >> struct driver_info *info =3D >> ll_entry_start(struct driver_info, driver_info); >> const int n_ents =3D ll_entry_count(struct driver_info, driver= _info); >> bool missing_parent =3D false; >> - int result =3D 0; >> int idx; >> >> /* >> @@ -98,12 +98,12 @@ static int bind_drivers_pass(struct udevice *paren= t, bool pre_reloc_only) >> drt->dev =3D dev; >> } else if (ret !=3D -EPERM) { >> dm_warn("No match for driver '%s'\n", entry->n= ame); >> - if (!result || ret !=3D -ENOENT) >> - result =3D ret; >> + if (!*result || ret !=3D -ENOENT) >> + *result =3D ret; >> } >> } >> >> - return result ? result : missing_parent ? -EAGAIN : 0; >> + return missing_parent; >> } >> >> int lists_bind_drivers(struct udevice *parent, bool pre_reloc_only) >> @@ -117,13 +117,8 @@ int lists_bind_drivers(struct udevice *parent, bo= ol pre_reloc_only) >> * always succeed on the first pass. >> */ >> for (pass =3D 0; pass < 10; pass++) { >> - int ret; >> - >> - ret =3D bind_drivers_pass(parent, pre_reloc_only); >> - if (!ret) >> + if (!bind_drivers_pass(parent, pre_reloc_only, &result= )) >> break; >> - if (ret !=3D -EAGAIN && !result) >> - result =3D ret; >=20 > If there were something like this, could we drop the other changes? >=20 > if (ret) { > if (ret =3D=3D -EAGAIN) > continue; > else if (!result) >=20 > result =3D ret; > } I don't think this works exactly, as we want to break when (ret =3D=3D -EAGAIN) instead of continue. However I have a variant which I think is working which I can send as a v2. >=20 >> } >> >> return result; >> -- >> 2.25.1 >> --=20 Paul Barker Principal Software Engineer SanCloud Ltd e: paul.barker@sancloud.com w: https://sancloud.com/ --------------B4GMZ4w0VP4BAtnMWWo8YViN Content-Type: application/pgp-keys; name="OpenPGP_0xA67255DFCCE62ECD.asc" Content-Disposition: attachment; filename="OpenPGP_0xA67255DFCCE62ECD.asc" Content-Description: OpenPGP public key Content-Transfer-Encoding: quoted-printable -----BEGIN PGP PUBLIC KEY BLOCK----- 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 =3DsH2a -----END PGP PUBLIC KEY BLOCK----- --------------B4GMZ4w0VP4BAtnMWWo8YViN-- --------------lKiHASygXpgoA5RT2nAu0aZY-- --------------62Nw090KvrzuS1q1r2u0ZRgN Content-Type: application/pgp-signature; name="OpenPGP_signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="OpenPGP_signature" -----BEGIN PGP SIGNATURE----- wnsEABYIACMWIQS7m7rT1+CktY3YG1PYN3IfEvob6gUCY1fdrAUDAAAAAAAKCRDYN3IfEvob6r5u AP9P+0RkPuF4Dyb0UVNyvzr9wu8QHAQteHbGFSbZ9NwhHQD+JhJSPI97hDFdRSjExcQeKvzKaJwc BqD+hHuqDXF10wg= =AY7f -----END PGP SIGNATURE----- --------------62Nw090KvrzuS1q1r2u0ZRgN--