From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from relay7-d.mail.gandi.net (relay7-d.mail.gandi.net [217.70.183.200]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 73D3C1EB41 for ; Thu, 7 Mar 2024 17:19:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.200 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709831985; cv=none; b=Pu7zzSdUjFSv7KQurJEZh85CcIoN45Fr+aauVPWR6iGyzewVMF/uqzlDdawsTesMhtRODDb4KZlk2BTE0uFTKDFX2V3Q7n36eJy/hR6bGaIZCvIXyJLBF01dlS5xIyASI7IycdhfcjdRstOxX4cvvf3VNxHQ+3LMPzAQZAVci0A= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709831985; c=relaxed/simple; bh=UYN3fJKqIzd0UJvMQfudjlaLr1S5s1O0o0j/Q8krGjg=; h=Date:From:To:Cc:Subject:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=vGO44ek1/sVK+qhWBqoelWHr+2/NyD1Z27hxZXD7y2IpscwcdHjiQ0wR9quz0OARtITwBUBFQvRuh2APMIohXDtoSehnqYt3BVqHfHWFAl5SThOuMODKFDrA2ctGK45vvL9w5xBBanOxG2eSNeBV7yd9TgyEMx6yM8cPCQ+1g2I= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=V+B/vQUL; arc=none smtp.client-ip=217.70.183.200 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="V+B/vQUL" Received: by mail.gandi.net (Postfix) with ESMTPSA id EF46120009; Thu, 7 Mar 2024 17:19:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1709831975; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=AsvVKkm2Eq4sRDhn6wHLtPPoTtBKjkIYcjnZcnmXCvA=; b=V+B/vQULtwzwIAJB97EDZWe0axXUQ0UUXt33krajqUQ61dmdA0J9cZ2N5rsmnddecE0/XU W+BHhFz7Cz6A6AlcNludhWK+0nDLms0G/PHTNIwWODqTcBFuYOysu2iX8tMeXgfxVBN2xD RrznmU/nqiJzHXkIti0Cq5nZU92grRupdftwPuvIwNrGx0xwA1wf8K01zzH/uUes8l0yle urURw8u8uhMwfopUpuu9+33hg5fwYNZO6kOseTI8vQquU2UYJRdm9a3m0stB2vRBHjIn9P 1VDDCSqTJHBeVXRvFoQ/vX2HvbxvEw+E70QSwSGgo1zUCMTfuXmZLHJlYpqLYw== Date: Thu, 7 Mar 2024 18:19:31 +0100 From: Miquel Raynal To: Alexander Dahl Cc: linux-mtd@lists.infradead.org, Richard Weinberger , Vignesh Raghavendra , linux-kernel@vger.kernel.org Subject: Re: mtd: nand: raw: Possible bug in nand_onfi_detect()? Message-ID: <20240307181931.440c9c3f@xps-13> In-Reply-To: <20240307-pantry-deceit-78ce20f47899@thorsis.com> References: <20240306-shaky-bunion-d28b65ea97d7@thorsis.com> <20240306164831.29eed907@xps-13> <20240307-pantry-deceit-78ce20f47899@thorsis.com> Organization: Bootlin X-Mailer: Claws Mail 4.1.1 (GTK 3.24.38; x86_64-pc-linux-gnu) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-GND-Sasl: miquel.raynal@bootlin.com Hi Alexander, ada@thorsis.com wrote on Thu, 7 Mar 2024 17:02:16 +0100: > Hello Miquel, >=20 > thanks for looking into this, see my remarks below. >=20 > Am Wed, Mar 06, 2024 at 04:48:31PM +0100 schrieb Miquel Raynal: > > Hi Alexander, > >=20 > > ada@thorsis.com wrote on Wed, 6 Mar 2024 15:36:04 +0100: > > =20 > > > Hello everyone, > > >=20 > > > I think I found a bug in nand_onfi_detect() which was introduced with > > > commit c27842e7e11f ("mtd: rawnand: onfi: Adapt the parameter page > > > read to constraint controllers") back in 2020. =20 > >=20 > > Interesting. I don't think this patch did broke anything, as > > constrained controllers would just not support the read_data_op() call > > anyway. > >=20 > > That being said, I don't see why the atmel controller would > > refuse this operation, as it is supposed to support all > > operations without limitation. This is one of the three issues > > you have, that probably needs fixing. =20 >=20 > I found a flaw in my debug messages hiding the underlying issue for > this. I'm afraid this is another bug introduced by you with commit > 9f820fc0651c ("mtd: rawnand: Check the data only read pattern only > once"). See this line in rawnand_check_data_only_read_support(): >=20 > if (!nand_read_data_op(chip, NULL, SZ_512, true, true)) >=20 > This leads to nand_read_data_op() returning -EINVAL, because it checks > if its second argument is non-NULL. Ah, finally. Yes, this makes more sense. I was already notified in private of something there, I think the contributor (I cannot find the original mail) told me he would get back on it and did not, but I am unable to find the thread again in my mailer. Anyhow, this is ringing a bell, and I am pretty convinced about the bug raised now. Can you please propose a fix? You can propose two fixes actually, one for the NULL value and another one for mtd->writesize being unset at this stage. IIRC the original reporter told me about bitflips in his parameter page (which cannot be generated on demand, and this is rather uncommon). > I guess not only the atmel nand controller is affected here, but _all_ > nand controllers? The flag can never be set, and so use_datain is > false here? >=20 > > > Background on how I found this: I'm currently struggling getting raw > > > nand flash access to fly with an at91 sam9x60 SoC and a S34ML02G1 > > > Spansion SLC raw NAND flash on a custom board. The setup is > > > comparable to the sam9x60 curiosity board and can be reproduced with > > > that one. > > >=20 > > > NAND flash on sam9x60 curiosity board works fine with what is in > > > mainline Linux kernel. However after removing the line 'rb-gpios =3D > > > <&pioD 5 GPIO_ACTIVE_HIGH>;' from at91-sam9x60_curiosity.dts all data > > > read from the flash appears to be zeros only. (I did not add that > > > line to the dts of my custom board first, this is how I stumbled over > > > this.) > > >=20 > > > I have no explanation for that behaviour, it should work without R/B# > > > by reading the status register, maybe we investigate that > > > in depth later. =20 > >=20 > > I don't see why at a first look. The default is "no RB" if no property > > is given in the DT so it should work. =20 >=20 > Correct, nand_soft_waitrdy() is used in that case. >=20 > > Tracing the wait ready function calls might help. =20 >=20 > Did that already. On each call here the status register read contains > E0h and nand_soft_waitrdy() returns without error, because the > NAND_STATUS_READY flag is set. It just looks fine, although it is > not afterwards. Strange. Just to be sure, how are you testing? Please make a single page read (minimal length with mtd_debug or any length with nanddump) to be sure you're not affected by the continuous reads bugs (also mine). > > > However those all zeros data reads happens when > > > reading the ONFI param page as well es data read from OOB/spare area > > > later and I bet it's the same with usual data. =20 > >=20 > > Reading data without observing tWB + tR may lead to this. =20 >=20 > I already suspected some timing issue. Deeper investigation will have > to wait until we soldered some wires to the chip and connect a logic > analyzer however. At least that's the plan, but this will have to > wait some days until after I finished some other tasks. Sure. >=20 > > > This read error reveals a bug in nand_onfi_detect(). After setting > > > up some things there's this for loop: > > >=20 > > > for (i =3D 0; i < ONFI_PARAM_PAGES; i++) { > > >=20 > > > For i =3D 0 nand_read_param_page_op() is called and in my case all ze= ros > > > are returned and thus the CRC calculated does not match the all zeros > > > CRC read. So the usual break on successful reading the first page is > > > skipped and for reading the second page nand_change_read_column_op() > > > is called. I think that one always fails on this line: > > >=20 > > > if (offset_in_page + len > mtd->writesize + mtd->oobsize) { > > >=20 > > > Those variables contain the following values: > > >=20 > > > offset_in_page: 256 > > > len: 256 > > > mtd->writesize: 0 > > > mtd->oobsize: 0 =20 > >=20 > > Indeed. We probably need some kind of extra check that does not perform > > the if clause above if !mtd->writesize. > > =20 > > > The condition is true and nand_change_read_column_op() returns with > > > -EINVAL, because mtd->writesize and mtd->oobsize are not set yet in > > > that code path. Those are probably initialized later, maybe with > > > parameters read from that ONFI param page? > > >=20 > > > Returning with error from nand_change_read_column_op() leads to > > > jumping out of nand_onfi_detect() early, and no ONFI param page is > > > evaluated at all, although the second or third page could be intact. > > >=20 > > > I guess this would also fail with any other reason for not matching > > > CRCs in the first page, but I have not faulty NAND flash chip to > > > confirm that. =20 > >=20 > > Thanks for the whole report, it is interesting and should lead to fixes: > > - why does the controller refuses the datain op? =20 >=20 > See above. >=20 > > - why nand_soft_waitrdy is not enough? =20 >=20 > I don't know. That's one reason I asked here. >=20 > > - changing the condition in nand_change_read_column_op() > >=20 > > Can you take care of these? =20 >=20 > The last one probably after in depth reading of the code again, unsure > for the other two. First one is "easy" now I guess? For the middle one we need more investigation of course. Thanks for the debugging and sorry for the troubles. Miqu=C3=A8l 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id C0188C54798 for ; Thu, 7 Mar 2024 17:19:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Subject:Cc: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=MMkvCOz6GK3iLz+Vv/xZrG06U2OmFL/VJHX+DvXyfpw=; b=dOvCVQLUPA3tgH kNn98ZGZEbT5jR/rzIiT+3Y1f24cTPLBkr3/pFAfwVrV2eWP46P7O9Ew+oGXidAokGHQDEQgZ/LPT LALlf9G0iNYqmvYCNgGe12CUj7h5sXR4rvZVAmNNoaNH0enqkr9i3tHgid4xAc4DcFJ/ZjVGSA0Zg /O/QNuUgHtNUEIhtlXPLPfIRsF0xkB76i7nV3Q4qfvDo/+tUekOUejQI7yP5sJ/4Siq92wm5Sie3f E4QJqSaNXFitfqs0f5Un0G89jtGK5vj4pwyitk1XqdZLWJdVOUAgVhjZTWT1VyA7tzOKTn4Wt0heK km2t0SaJ7/TLryZvQV6A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1riHPG-00000005epH-0QIk; Thu, 07 Mar 2024 17:19:46 +0000 Received: from relay7-d.mail.gandi.net ([2001:4b98:dc4:8::227]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1riHPC-00000005eoa-0U7s for linux-mtd@lists.infradead.org; Thu, 07 Mar 2024 17:19:43 +0000 Received: by mail.gandi.net (Postfix) with ESMTPSA id EF46120009; Thu, 7 Mar 2024 17:19:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1709831975; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=AsvVKkm2Eq4sRDhn6wHLtPPoTtBKjkIYcjnZcnmXCvA=; b=V+B/vQULtwzwIAJB97EDZWe0axXUQ0UUXt33krajqUQ61dmdA0J9cZ2N5rsmnddecE0/XU W+BHhFz7Cz6A6AlcNludhWK+0nDLms0G/PHTNIwWODqTcBFuYOysu2iX8tMeXgfxVBN2xD RrznmU/nqiJzHXkIti0Cq5nZU92grRupdftwPuvIwNrGx0xwA1wf8K01zzH/uUes8l0yle urURw8u8uhMwfopUpuu9+33hg5fwYNZO6kOseTI8vQquU2UYJRdm9a3m0stB2vRBHjIn9P 1VDDCSqTJHBeVXRvFoQ/vX2HvbxvEw+E70QSwSGgo1zUCMTfuXmZLHJlYpqLYw== Date: Thu, 7 Mar 2024 18:19:31 +0100 From: Miquel Raynal To: Alexander Dahl Cc: linux-mtd@lists.infradead.org, Richard Weinberger , Vignesh Raghavendra , linux-kernel@vger.kernel.org Subject: Re: mtd: nand: raw: Possible bug in nand_onfi_detect()? Message-ID: <20240307181931.440c9c3f@xps-13> In-Reply-To: <20240307-pantry-deceit-78ce20f47899@thorsis.com> References: <20240306-shaky-bunion-d28b65ea97d7@thorsis.com> <20240306164831.29eed907@xps-13> <20240307-pantry-deceit-78ce20f47899@thorsis.com> Organization: Bootlin X-Mailer: Claws Mail 4.1.1 (GTK 3.24.38; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-GND-Sasl: miquel.raynal@bootlin.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240307_091942_468184_21563D42 X-CRM114-Status: GOOD ( 56.61 ) X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org SGkgQWxleGFuZGVyLAoKYWRhQHRob3JzaXMuY29tIHdyb3RlIG9uIFRodSwgNyBNYXIgMjAyNCAx NzowMjoxNiArMDEwMDoKCj4gSGVsbG8gTWlxdWVsLAo+IAo+IHRoYW5rcyBmb3IgbG9va2luZyBp bnRvIHRoaXMsIHNlZSBteSByZW1hcmtzIGJlbG93Lgo+IAo+IEFtIFdlZCwgTWFyIDA2LCAyMDI0 IGF0IDA0OjQ4OjMxUE0gKzAxMDAgc2NocmllYiBNaXF1ZWwgUmF5bmFsOgo+ID4gSGkgQWxleGFu ZGVyLAo+ID4gCj4gPiBhZGFAdGhvcnNpcy5jb20gd3JvdGUgb24gV2VkLCA2IE1hciAyMDI0IDE1 OjM2OjA0ICswMTAwOgo+ID4gICAKPiA+ID4gSGVsbG8gZXZlcnlvbmUsCj4gPiA+IAo+ID4gPiBJ IHRoaW5rIEkgZm91bmQgYSBidWcgaW4gbmFuZF9vbmZpX2RldGVjdCgpIHdoaWNoIHdhcyBpbnRy b2R1Y2VkIHdpdGgKPiA+ID4gY29tbWl0IGMyNzg0MmU3ZTExZiAoIm10ZDogcmF3bmFuZDogb25m aTogQWRhcHQgdGhlIHBhcmFtZXRlciBwYWdlCj4gPiA+IHJlYWQgdG8gY29uc3RyYWludCBjb250 cm9sbGVycyIpIGJhY2sgaW4gMjAyMC4gIAo+ID4gCj4gPiBJbnRlcmVzdGluZy4gSSBkb24ndCB0 aGluayB0aGlzIHBhdGNoIGRpZCBicm9rZSBhbnl0aGluZywgYXMKPiA+IGNvbnN0cmFpbmVkIGNv bnRyb2xsZXJzIHdvdWxkIGp1c3Qgbm90IHN1cHBvcnQgdGhlIHJlYWRfZGF0YV9vcCgpIGNhbGwK PiA+IGFueXdheS4KPiA+IAo+ID4gVGhhdCBiZWluZyBzYWlkLCBJIGRvbid0IHNlZSB3aHkgdGhl IGF0bWVsIGNvbnRyb2xsZXIgd291bGQKPiA+IHJlZnVzZSB0aGlzIG9wZXJhdGlvbiwgYXMgaXQg aXMgc3VwcG9zZWQgdG8gc3VwcG9ydCBhbGwKPiA+IG9wZXJhdGlvbnMgd2l0aG91dCBsaW1pdGF0 aW9uLiBUaGlzIGlzIG9uZSBvZiB0aGUgdGhyZWUgaXNzdWVzCj4gPiB5b3UgaGF2ZSwgdGhhdCBw cm9iYWJseSBuZWVkcyBmaXhpbmcuICAKPiAKPiBJIGZvdW5kIGEgZmxhdyBpbiBteSBkZWJ1ZyBt ZXNzYWdlcyBoaWRpbmcgdGhlIHVuZGVybHlpbmcgaXNzdWUgZm9yCj4gdGhpcy4gIEknbSBhZnJh aWQgdGhpcyBpcyBhbm90aGVyIGJ1ZyBpbnRyb2R1Y2VkIGJ5IHlvdSB3aXRoIGNvbW1pdAo+IDlm ODIwZmMwNjUxYyAoIm10ZDogcmF3bmFuZDogQ2hlY2sgdGhlIGRhdGEgb25seSByZWFkIHBhdHRl cm4gb25seQo+IG9uY2UiKS4gIFNlZSB0aGlzIGxpbmUgaW4gcmF3bmFuZF9jaGVja19kYXRhX29u bHlfcmVhZF9zdXBwb3J0KCk6Cj4gCj4gICAgIGlmICghbmFuZF9yZWFkX2RhdGFfb3AoY2hpcCwg TlVMTCwgU1pfNTEyLCB0cnVlLCB0cnVlKSkKPiAKPiBUaGlzIGxlYWRzIHRvIG5hbmRfcmVhZF9k YXRhX29wKCkgcmV0dXJuaW5nIC1FSU5WQUwsIGJlY2F1c2UgaXQgY2hlY2tzCj4gaWYgaXRzIHNl Y29uZCBhcmd1bWVudCBpcyBub24tTlVMTC4KCkFoLCBmaW5hbGx5LiBZZXMsIHRoaXMgbWFrZXMg bW9yZSBzZW5zZS4gSSB3YXMgYWxyZWFkeSBub3RpZmllZCBpbgpwcml2YXRlIG9mIHNvbWV0aGlu ZyB0aGVyZSwgSSB0aGluayB0aGUgY29udHJpYnV0b3IgKEkgY2Fubm90IGZpbmQgdGhlCm9yaWdp bmFsIG1haWwpIHRvbGQgbWUgaGUgd291bGQgZ2V0IGJhY2sgb24gaXQgYW5kIGRpZCBub3QsIGJ1 dCBJIGFtCnVuYWJsZSB0byBmaW5kIHRoZSB0aHJlYWQgYWdhaW4gaW4gbXkgbWFpbGVyLiBBbnlo b3csIHRoaXMgaXMgcmluZ2luZyBhCmJlbGwsIGFuZCBJIGFtIHByZXR0eSBjb252aW5jZWQgYWJv dXQgdGhlIGJ1ZyByYWlzZWQgbm93LiBDYW4geW91CnBsZWFzZSBwcm9wb3NlIGEgZml4PwoKWW91 IGNhbiBwcm9wb3NlIHR3byBmaXhlcyBhY3R1YWxseSwgb25lIGZvciB0aGUgTlVMTCB2YWx1ZSBh bmQgYW5vdGhlcgpvbmUgZm9yIG10ZC0+d3JpdGVzaXplIGJlaW5nIHVuc2V0IGF0IHRoaXMgc3Rh Z2UuCgpJSVJDIHRoZSBvcmlnaW5hbCByZXBvcnRlciB0b2xkIG1lIGFib3V0IGJpdGZsaXBzIGlu IGhpcyBwYXJhbWV0ZXIgcGFnZQood2hpY2ggY2Fubm90IGJlIGdlbmVyYXRlZCBvbiBkZW1hbmQs IGFuZCB0aGlzIGlzIHJhdGhlciB1bmNvbW1vbikuCgo+IEkgZ3Vlc3Mgbm90IG9ubHkgdGhlIGF0 bWVsIG5hbmQgY29udHJvbGxlciBpcyBhZmZlY3RlZCBoZXJlLCBidXQgX2FsbF8KPiBuYW5kIGNv bnRyb2xsZXJzPyAgVGhlIGZsYWcgY2FuIG5ldmVyIGJlIHNldCwgYW5kIHNvIHVzZV9kYXRhaW4g aXMKPiBmYWxzZSBoZXJlPwo+IAo+ID4gPiBCYWNrZ3JvdW5kIG9uIGhvdyBJIGZvdW5kIHRoaXM6 IEknbSBjdXJyZW50bHkgc3RydWdnbGluZyBnZXR0aW5nIHJhdwo+ID4gPiBuYW5kIGZsYXNoIGFj Y2VzcyB0byBmbHkgd2l0aCBhbiBhdDkxIHNhbTl4NjAgU29DIGFuZCBhIFMzNE1MMDJHMQo+ID4g PiBTcGFuc2lvbiBTTEMgcmF3IE5BTkQgZmxhc2ggb24gYSBjdXN0b20gYm9hcmQuICBUaGUgc2V0 dXAgaXMKPiA+ID4gY29tcGFyYWJsZSB0byB0aGUgc2FtOXg2MCBjdXJpb3NpdHkgYm9hcmQgYW5k IGNhbiBiZSByZXByb2R1Y2VkIHdpdGgKPiA+ID4gdGhhdCBvbmUuCj4gPiA+IAo+ID4gPiBOQU5E IGZsYXNoIG9uIHNhbTl4NjAgY3VyaW9zaXR5IGJvYXJkIHdvcmtzIGZpbmUgd2l0aCB3aGF0IGlz IGluCj4gPiA+IG1haW5saW5lIExpbnV4IGtlcm5lbC4gIEhvd2V2ZXIgYWZ0ZXIgcmVtb3Zpbmcg dGhlIGxpbmUgJ3JiLWdwaW9zID0KPiA+ID4gPCZwaW9EIDUgR1BJT19BQ1RJVkVfSElHSD47JyBm cm9tIGF0OTEtc2FtOXg2MF9jdXJpb3NpdHkuZHRzIGFsbCBkYXRhCj4gPiA+IHJlYWQgZnJvbSB0 aGUgZmxhc2ggYXBwZWFycyB0byBiZSB6ZXJvcyBvbmx5LiAgKEkgZGlkIG5vdCBhZGQgdGhhdAo+ ID4gPiBsaW5lIHRvIHRoZSBkdHMgb2YgbXkgY3VzdG9tIGJvYXJkIGZpcnN0LCB0aGlzIGlzIGhv dyBJIHN0dW1ibGVkIG92ZXIKPiA+ID4gdGhpcy4pCj4gPiA+IAo+ID4gPiBJIGhhdmUgbm8gZXhw bGFuYXRpb24gZm9yIHRoYXQgYmVoYXZpb3VyLCBpdCBzaG91bGQgd29yayB3aXRob3V0IFIvQiMK PiA+ID4gYnkgcmVhZGluZyB0aGUgc3RhdHVzIHJlZ2lzdGVyLCBtYXliZSB3ZSBpbnZlc3RpZ2F0 ZSB0aGF0Cj4gPiA+IGluIGRlcHRoIGxhdGVyLiAgCj4gPiAKPiA+IEkgZG9uJ3Qgc2VlIHdoeSBh dCBhIGZpcnN0IGxvb2suIFRoZSBkZWZhdWx0IGlzICJubyBSQiIgaWYgbm8gcHJvcGVydHkKPiA+ IGlzIGdpdmVuIGluIHRoZSBEVCBzbyBpdCBzaG91bGQgd29yay4gIAo+IAo+IENvcnJlY3QsIG5h bmRfc29mdF93YWl0cmR5KCkgaXMgdXNlZCBpbiB0aGF0IGNhc2UuCj4gCj4gPiBUcmFjaW5nIHRo ZSB3YWl0IHJlYWR5IGZ1bmN0aW9uIGNhbGxzIG1pZ2h0IGhlbHAuICAKPiAKPiBEaWQgdGhhdCBh bHJlYWR5LiAgT24gZWFjaCBjYWxsIGhlcmUgdGhlIHN0YXR1cyByZWdpc3RlciByZWFkIGNvbnRh aW5zCj4gRTBoIGFuZCBuYW5kX3NvZnRfd2FpdHJkeSgpIHJldHVybnMgd2l0aG91dCBlcnJvciwg YmVjYXVzZSB0aGUKPiBOQU5EX1NUQVRVU19SRUFEWSBmbGFnIGlzIHNldC4gIEl0IGp1c3QgbG9v a3MgZmluZSwgYWx0aG91Z2ggaXQgaXMKPiBub3QgYWZ0ZXJ3YXJkcy4KClN0cmFuZ2UuIEp1c3Qg dG8gYmUgc3VyZSwgaG93IGFyZSB5b3UgdGVzdGluZz8gUGxlYXNlIG1ha2UgYSBzaW5nbGUKcGFn ZSByZWFkIChtaW5pbWFsIGxlbmd0aCB3aXRoIG10ZF9kZWJ1ZyBvciBhbnkgbGVuZ3RoIHdpdGgg bmFuZGR1bXApIHRvCmJlIHN1cmUgeW91J3JlIG5vdCBhZmZlY3RlZCBieSB0aGUgY29udGludW91 cyByZWFkcyBidWdzIChhbHNvIG1pbmUpLgoKPiA+ID4gIEhvd2V2ZXIgdGhvc2UgYWxsIHplcm9z IGRhdGEgcmVhZHMgaGFwcGVucyB3aGVuCj4gPiA+IHJlYWRpbmcgdGhlIE9ORkkgcGFyYW0gcGFn ZSBhcyB3ZWxsIGVzIGRhdGEgcmVhZCBmcm9tIE9PQi9zcGFyZSBhcmVhCj4gPiA+IGxhdGVyIGFu ZCBJIGJldCBpdCdzIHRoZSBzYW1lIHdpdGggdXN1YWwgZGF0YS4gIAo+ID4gCj4gPiBSZWFkaW5n IGRhdGEgd2l0aG91dCBvYnNlcnZpbmcgdFdCICsgdFIgbWF5IGxlYWQgdG8gdGhpcy4gIAo+IAo+ IEkgYWxyZWFkeSBzdXNwZWN0ZWQgc29tZSB0aW1pbmcgaXNzdWUuICBEZWVwZXIgaW52ZXN0aWdh dGlvbiB3aWxsIGhhdmUKPiB0byB3YWl0IHVudGlsIHdlIHNvbGRlcmVkIHNvbWUgd2lyZXMgdG8g dGhlIGNoaXAgYW5kIGNvbm5lY3QgYSBsb2dpYwo+IGFuYWx5emVyIGhvd2V2ZXIuICBBdCBsZWFz dCB0aGF0J3MgdGhlIHBsYW4sIGJ1dCB0aGlzIHdpbGwgaGF2ZSB0bwo+IHdhaXQgc29tZSBkYXlz IHVudGlsIGFmdGVyIEkgZmluaXNoZWQgc29tZSBvdGhlciB0YXNrcy4KClN1cmUuCgo+IAo+ID4g PiBUaGlzIHJlYWQgZXJyb3IgcmV2ZWFscyBhIGJ1ZyBpbiBuYW5kX29uZmlfZGV0ZWN0KCkuICBB ZnRlciBzZXR0aW5nCj4gPiA+IHVwIHNvbWUgdGhpbmdzIHRoZXJlJ3MgdGhpcyBmb3IgbG9vcDoK PiA+ID4gCj4gPiA+ICAgICBmb3IgKGkgPSAwOyBpIDwgT05GSV9QQVJBTV9QQUdFUzsgaSsrKSB7 Cj4gPiA+IAo+ID4gPiBGb3IgaSA9IDAgbmFuZF9yZWFkX3BhcmFtX3BhZ2Vfb3AoKSBpcyBjYWxs ZWQgYW5kIGluIG15IGNhc2UgYWxsIHplcm9zCj4gPiA+IGFyZSByZXR1cm5lZCBhbmQgdGh1cyB0 aGUgQ1JDIGNhbGN1bGF0ZWQgZG9lcyBub3QgbWF0Y2ggdGhlIGFsbCB6ZXJvcwo+ID4gPiBDUkMg cmVhZC4gIFNvIHRoZSB1c3VhbCBicmVhayBvbiBzdWNjZXNzZnVsIHJlYWRpbmcgdGhlIGZpcnN0 IHBhZ2UgaXMKPiA+ID4gc2tpcHBlZCBhbmQgZm9yIHJlYWRpbmcgdGhlIHNlY29uZCBwYWdlIG5h bmRfY2hhbmdlX3JlYWRfY29sdW1uX29wKCkKPiA+ID4gaXMgY2FsbGVkLiAgSSB0aGluayB0aGF0 IG9uZSBhbHdheXMgZmFpbHMgb24gdGhpcyBsaW5lOgo+ID4gPiAKPiA+ID4gICAgIGlmIChvZmZz ZXRfaW5fcGFnZSArIGxlbiA+IG10ZC0+d3JpdGVzaXplICsgbXRkLT5vb2JzaXplKSB7Cj4gPiA+ IAo+ID4gPiBUaG9zZSB2YXJpYWJsZXMgY29udGFpbiB0aGUgZm9sbG93aW5nIHZhbHVlczoKPiA+ ID4gCj4gPiA+ICAgICBvZmZzZXRfaW5fcGFnZTogMjU2Cj4gPiA+ICAgICBsZW46IDI1Ngo+ID4g PiAgICAgbXRkLT53cml0ZXNpemU6IDAKPiA+ID4gICAgIG10ZC0+b29ic2l6ZTogMCAgCj4gPiAK PiA+IEluZGVlZC4gV2UgcHJvYmFibHkgbmVlZCBzb21lIGtpbmQgb2YgZXh0cmEgY2hlY2sgdGhh dCBkb2VzIG5vdCBwZXJmb3JtCj4gPiB0aGUgaWYgY2xhdXNlIGFib3ZlIGlmICFtdGQtPndyaXRl c2l6ZS4KPiA+ICAgCj4gPiA+IFRoZSBjb25kaXRpb24gaXMgdHJ1ZSBhbmQgbmFuZF9jaGFuZ2Vf cmVhZF9jb2x1bW5fb3AoKSByZXR1cm5zIHdpdGgKPiA+ID4gLUVJTlZBTCwgYmVjYXVzZSBtdGQt PndyaXRlc2l6ZSBhbmQgbXRkLT5vb2JzaXplIGFyZSBub3Qgc2V0IHlldCBpbgo+ID4gPiB0aGF0 IGNvZGUgcGF0aC4gIFRob3NlIGFyZSBwcm9iYWJseSBpbml0aWFsaXplZCBsYXRlciwgbWF5YmUg d2l0aAo+ID4gPiBwYXJhbWV0ZXJzIHJlYWQgZnJvbSB0aGF0IE9ORkkgcGFyYW0gcGFnZT8KPiA+ ID4gCj4gPiA+IFJldHVybmluZyB3aXRoIGVycm9yIGZyb20gbmFuZF9jaGFuZ2VfcmVhZF9jb2x1 bW5fb3AoKSBsZWFkcyB0bwo+ID4gPiBqdW1waW5nIG91dCBvZiBuYW5kX29uZmlfZGV0ZWN0KCkg ZWFybHksIGFuZCBubyBPTkZJIHBhcmFtIHBhZ2UgaXMKPiA+ID4gZXZhbHVhdGVkIGF0IGFsbCwg YWx0aG91Z2ggdGhlIHNlY29uZCBvciB0aGlyZCBwYWdlIGNvdWxkIGJlIGludGFjdC4KPiA+ID4g Cj4gPiA+IEkgZ3Vlc3MgdGhpcyB3b3VsZCBhbHNvIGZhaWwgd2l0aCBhbnkgb3RoZXIgcmVhc29u IGZvciBub3QgbWF0Y2hpbmcKPiA+ID4gQ1JDcyBpbiB0aGUgZmlyc3QgcGFnZSwgYnV0IEkgaGF2 ZSBub3QgZmF1bHR5IE5BTkQgZmxhc2ggY2hpcCB0bwo+ID4gPiBjb25maXJtIHRoYXQuICAKPiA+ IAo+ID4gVGhhbmtzIGZvciB0aGUgd2hvbGUgcmVwb3J0LCBpdCBpcyBpbnRlcmVzdGluZyBhbmQg c2hvdWxkIGxlYWQgdG8gZml4ZXM6Cj4gPiAtIHdoeSBkb2VzIHRoZSBjb250cm9sbGVyIHJlZnVz ZXMgdGhlIGRhdGFpbiBvcD8gIAo+IAo+IFNlZSBhYm92ZS4KPiAKPiA+IC0gd2h5IG5hbmRfc29m dF93YWl0cmR5IGlzIG5vdCBlbm91Z2g/ICAKPiAKPiBJIGRvbid0IGtub3cuICBUaGF0J3Mgb25l IHJlYXNvbiBJIGFza2VkIGhlcmUuCj4gCj4gPiAtIGNoYW5naW5nIHRoZSBjb25kaXRpb24gaW4g bmFuZF9jaGFuZ2VfcmVhZF9jb2x1bW5fb3AoKQo+ID4gCj4gPiBDYW4geW91IHRha2UgY2FyZSBv ZiB0aGVzZT8gIAo+IAo+IFRoZSBsYXN0IG9uZSBwcm9iYWJseSBhZnRlciBpbiBkZXB0aCByZWFk aW5nIG9mIHRoZSBjb2RlIGFnYWluLCB1bnN1cmUKPiBmb3IgdGhlIG90aGVyIHR3by4KCkZpcnN0 IG9uZSBpcyAiZWFzeSIgbm93IEkgZ3Vlc3M/CgpGb3IgdGhlIG1pZGRsZSBvbmUgd2UgbmVlZCBt b3JlIGludmVzdGlnYXRpb24gb2YgY291cnNlLgoKVGhhbmtzIGZvciB0aGUgZGVidWdnaW5nIGFu ZCBzb3JyeSBmb3IgdGhlIHRyb3VibGVzLgoKTWlxdcOobAoKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkxpbnV4IE1URCBkaXNjdXNzaW9uIG1h aWxpbmcgbGlzdApodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xp bnV4LW10ZC8K