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=-11.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_2 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 69926C4363A for ; Fri, 30 Oct 2020 10:27:39 +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 991E520704 for ; Fri, 30 Oct 2020 10:27:36 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="ng/Cqr57" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 991E520704 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=bootlin.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mtd-bounces+linux-mtd=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:MIME-Version:References:In-Reply-To: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=ESXqsQIol2KcIKy9RgoQYQd1mdaUexuszAOom8htPEQ=; b=ng/Cqr57egmzUPeiZGsIubVJn bq8u66w8Qvtx2A16nFXynE8HTRKkeANuTcLL5gZt/KMcnInFQBbiMsKr9jtoGgYMAw25XnOqxhmId mmWspJ7Sl8yLR7Tr4p1moGDBAPUXv3+AXxCLJpJA1ixXOrt8OnvMLYbRVXbu4Nl9+hXiCQl6f6vb+ 84vgtAT/emSJT2HIkJAjkTuLCC6fRCNfC+p+n/3YI9/+iymvUhGK8Fq+jGI3EsY2yK05PFfJa54BJ m1aZ8eAB2yKe2tNlHN5Gjx+yielBYXFHCxU2prdIaVKOAh42IZAMogsEOt/mQxB5lmJ+y3AIfZKkG h4qqrmpGQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kYRcV-0005fc-34; Fri, 30 Oct 2020 10:26:55 +0000 Received: from relay6-d.mail.gandi.net ([217.70.183.198]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kYRcJ-0005dh-7Q; Fri, 30 Oct 2020 10:26:45 +0000 X-Originating-IP: 91.224.148.103 Received: from xps13 (unknown [91.224.148.103]) (Authenticated sender: miquel.raynal@bootlin.com) by relay6-d.mail.gandi.net (Postfix) with ESMTPSA id DE32AC0014; Fri, 30 Oct 2020 10:26:37 +0000 (UTC) Date: Fri, 30 Oct 2020 11:26:35 +0100 From: Miquel Raynal To: =?UTF-8?B?6LW15Luq5bOw?= Subject: Re: [PATCH v13 2/8] mtd: rawnand: rockchip: NFC drivers for RK3308, RK2928 and others Message-ID: <20201030112635.162bb709@xps13> In-Reply-To: <20201030181152443876127@rock-chips.com> References: <20201028095326.15562-1-yifeng.zhao@rock-chips.com> <20201028095326.15562-3-yifeng.zhao@rock-chips.com> <20201028114826.6cd6b841@xps13> <20201030181152443876127@rock-chips.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.4 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201030_062643_586125_029F1A58 X-CRM114-Status: GOOD ( 33.92 ) X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devicetree , vigneshr , richard , linux-kernel , linux-rockchip , robh+dt , linux-mtd , linux-arm-kernel , =?UTF-8?B?SGVpa29TdMO8Ym5lcg==?= 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 SGkg6LW15Luq5bOwLAoK6LW15Luq5bOwIDx5aWZlbmcuemhhb0Byb2NrLWNoaXBzLmNvbT4gd3Jv dGUgb24gRnJpLCAzMCBPY3QgMjAyMCAxODoxMjo1MgorMDgwMDoKCj4gSGkgTWlxdWVsLAo+IAo+ ID5IaSBZaWZlbmcsCj4gPgo+ID5BIGZldyBtb3JlIGNvbW1lbnRzIGJlbG93LCBidXQgb3ZlcmFs bCBsb29rcyBiZXR0ZXIuCj4gPgo+ID5ZaWZlbmcgWmhhbyA8eWlmZW5nLnpoYW9Acm9jay1jaGlw cy5jb20+IHdyb3RlIG9uIFdlZCwgMjggT2N0IDIwMjAKPiA+MTc6NTM6MjQgKzA4MDA6Cj4gPiAg Cj4gPj4gVGhpcyBkcml2ZXIgc3VwcG9ydHMgUm9ja2NoaXAgTkZDIChOQU5EIEZsYXNoIENvbnRy b2xsZXIpIGZvdW5kIG9uIFJLMzMwOCwKPiA+PiBSSzI5MjgsIFJLUFgzMCwgUlYxMTA4IGFuZCBv dGhlciBTT0NzLiBUaGUgZHJpdmVyIGhhcyBiZWVuIHRlc3RlZCB1c2luZwo+ID4+IDgtYml0IE5B TkQgaW50ZXJmYWNlIG9uIHRoZSBBUk0gYmFzZWQgUkszMzA4IHBsYXRmb3JtLgo+ID4+Cj4gPj4g U3VwcG9ydCBSb2NrY2hpcCBTb0NzIGFuZCBORkMgdmVyc2lvbnM6Cj4gPj4gLSBQWDMwIGFuZCBS SzMzMjYoTkZDdjkwMCkuCj4gPj4gRUNDOiAxNi80MC82MC83MCBiaXRzLzFLQi4KPiA+PiBDTE9D SzogYWhiIGFuZCBuZmMuCj4gPj4gLSBSSzMzMDggYW5kIFJWMTEwOChORkN2ODAwKS4KPiA+PiBF Q0M6IDE2IGJpdHMvMUtCLgo+ID4+IENMT0NLOiBhaGIgYW5kIG5mYy4KPiA+PiAtIFJLMzAzNiBh bmQgUkszMTI4KE5GQ3Y2MjIpLgo+ID4+IEVDQzogMTYvMjQvNDAvNjAgYml0cy8xS0IuCj4gPj4g Q0xPQ0s6IGFoYiBhbmQgbmZjLgo+ID4+IC0gUkszMDY2LCBSSzMxODggYW5kIFJLMjkyOChORkN2 NjAwKS4KPiA+PiBFQ0M6IDE2LzI0LzQwLzYwIGJpdHMvMUtCLgo+ID4+IENMT0NLOiBhaGIuCj4g Pj4KPiA+PiBTdXBwb3J0ZWQgZmVhdHVyZXM6Cj4gPj4gLSBSZWFkIGZ1bGwgcGFnZSBkYXRhIGJ5 IERNQS4KPiA+PiAtIFN1cHBvcnQgSFcgRUNDKG9uZSBzdGVwIGlzIDFLQikuCj4gPj4gLSBTdXBw b3J0IDIgLSAzMksgcGFnZSBzaXplLgo+ID4+IC0gU3VwcG9ydCA4IENTKGRlcGVuZCBvbiBTb0Nz KQo+ID4+Cj4gPj4gTGltaXRhdGlvbnM6Cj4gPj4gLSBObyBzdXBwb3J0IGZvciB0aGUgZWNjIHN0 ZXAgc2l6ZSBpcyA1MTIuCj4gPj4gLSBVbnRlc3RlZCBvbiBzb21lIFNvQ3MuCj4gPj4gLSBObyBz dXBwb3J0IGZvciBzdWJwYWdlcy4KPiA+PiAtIE5vIHN1cHBvcnQgZm9yIHRoZSBidWlsdGluIHJh bmRvbWl6ZXIuCj4gPj4gLSBUaGUgb3JpZ2luYWwgYmFkIGJsb2NrIG1hc2sgaXMgbm90IHN1cHBv cnRlZC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlCj4gPj7CoMKgIHRoZSBCQlQoYmFkIGJsb2Nr IHRhYmxlKS4KPiA+Pgo+ID4+IFNpZ25lZC1vZmYtYnk6IFlpZmVuZyBaaGFvIDx5aWZlbmcuemhh b0Byb2NrLWNoaXBzLmNvbT4KPiA+PiAtLS0KPiA+Pgo+ID4+IENoYW5nZXMgaW4gdjEzOgo+ID4+ IC0gVGhlIG5mYy0+YnVmZmVyIHdpbGwgcmVhbGxvYyB3aGlsZSB0aGUgcGFnZSBzaXplIG9mIHRo ZSBzZWNvbmQgbXRkCj4gPj7CoMKgIGlzIGxhcmdlIHRoYW4gdGhlIGZpcnN0IG9uZS4KPiA+PiAt IEZpeCBjb2Rpbmcgc3R5bGUuCj4gPj4gLSBGaXggc29tZSBjb21tZW50cy4KPiA+Pgo+ID4+IENo YW5nZXMgaW4gdjEyOiBOb25lCj4gPj4gQ2hhbmdlcyBpbiB2MTE6Cj4gPj4gLSBGaXggY29tcGls ZSBlcnJvci4KPiA+Pgo+ID4+IENoYW5nZXMgaW4gdjEwOgo+ID4+IC0gRml4IGNvbXBpbGUgZXJy b3Igb24gbWFzdGVyIHY1LjktcmM3Lgo+ID4+Cj4gPj4gQ2hhbmdlcyBpbiB2OToKPiA+PiAtIFRo ZSBuZmMtPmJ1ZmZlciB3aWxsIHJlYWxsb2Mgd2hpbGUgdGhlIHBhZ2Ugc2l6ZSBvZiB0aGUgc2Vj b25kIG10ZAo+ID4+wqDCoCBpcyBsYXJnZSB0aGFuIHRoZSBmaXJzdCBvbmUKPiA+PiAtIEZpeCBj b2Rpbmcgc3R5bGUuCj4gPj4gLSBSZW1vdmUgc3RydWN0IHJrX25mY19jbGsuCj4gPj4gLSBQcmVw ZW5kIHNvbWUgZnVuY3Rpb24gd2l0aCBya19uZmNfLgo+ID4+IC0gUmVwbGFjZSBmdW5jdGlvbiBy ZWFkbF9wb2xsX3RpbWVvdXRfYXRvbWljIHdpdGggcmVhZGxfcmVsYXhlZF9wb2xsX3RpbWVvdXQu Cj4gPj4gLSBSZW1vdmUgZnVuY3Rpb24gcmtfbmZjX3JlYWRfYnl0ZSBhbmQgcmtfbmZjX3dyaXRl X2J5dGUuCj4gPj4gLSBEb24ndCBzZWxlY3QgdGhlIGRpZSBpZiAnY2hlY2tfb25seSA9PSB0cnVl JyBpbiBmdW5jdGlvbiBya19uZmNfZXhlY19vcC4KPiA+PiAtIE1vZGlmeSBmdW5jdGlvbiBya19u ZmNfd3JpdGVfcGFnZSBhbmQgcmtfbmZjX3dyaXRlX3BhZ2VfcmF3Lgo+ID4+Cj4gPj4gQ2hhbmdl cyBpbiB2ODogTm9uZQo+ID4+IENoYW5nZXMgaW4gdjc6Cj4gPj4gLSBSZWJhc2UgdG8gbGludXgt bmV4dC4KPiA+PiAtIEZpeCBjb2Rpbmcgc3R5bGUuCj4gPj4gLSBSZXNlcnZlZCA0IGJ5dGVzIGF0 IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9vYiBhcmVhLgo+ID4+IC0gUGFnZSByYXcgcmVhZCBhbmQg d3JpdGUgaW5jbHVkZWQgZWNjIGRhdGEuCj4gPj4KPiA+PiBDaGFuZ2VzIGluIHY2Ogo+ID4+IC0g VGhlIG10ZC0+bmFtZSBzZXQgYnkgTkFORCBsYWJlbCBwcm9wZXJ0eS4KPiA+PiAtIEFkZCBzb21l IGNvbW1lbnRzLgo+ID4+IC0gRml4IGNvbXBpbGUgZXJyb3IuCj4gPj4KPiA+PiBDaGFuZ2VzIGlu IHY1Ogo+ID4+IC0gQWRkIGJvb3QgYmxvY2tzIHN1cHBvcnTCoCB3aXRoIGRpZmZlcmVudCBFQ0Mg Zm9yIGJvb3RST00uCj4gPj4gLSBSZW5hbWUgcm9ja2NoaXAtbmFuZC5jIHRvIHJvY2tjaGlwLW5h bmQtY29udHJvbGxlci5jLgo+ID4+IC0gVW5pZmljYXRpb24gb2Ygb3RoZXIgdmFyaWFibGUgbmFt ZXMuCj4gPj4gLSBSZW1vdmUgc29tZSBjb21wYXRpYmxlIGRlZmluZS4KPiA+Pgo+ID4+IENoYW5n ZXMgaW4gdjQ6Cj4gPj4gLSBEZWZpbmUgcGxhdGZvcm0gZGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSBy ZWdpc3RlciBvZmZzZXRzLgo+ID4+IC0gVGhlIGNvbXBhdGlibGUgZGVmaW5lIHdpdGggcmt4eF9u ZmMuCj4gPj4gLSBVc2UgU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMgdG8gZGVmaW5lIFBNX09QUy4K PiA+PiAtIFVzZSBleGVjX29wIGluc3RlYWQgb2YgbGVnYWN5IGhvb2tzLgo+ID4+Cj4gPj4gQ2hh bmdlcyBpbiB2MzogTm9uZQo+ID4+IENoYW5nZXMgaW4gdjI6Cj4gPj4gLSBGaXggY29tcGlsZSBl cnJvci4KPiA+PiAtIEluY2x1ZGUgaGVhZGVyIGZpbGVzIHNvcnRlZCBieSBmaWxlIG5hbWUuCj4g Pj4KPiA+PsKgIGRyaXZlcnMvbXRkL25hbmQvcmF3L0tjb25maWfCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHzCoMKgIDEyICsKPiA+PsKgIGRyaXZlcnMvbXRkL25hbmQvcmF3L01h a2VmaWxlwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDCoCAxICsKPiA+PsKg IC4uLi9tdGQvbmFuZC9yYXcvcm9ja2NoaXAtbmFuZC1jb250cm9sbGVyLmPCoMKgIHwgMTQ2MCAr KysrKysrKysrKysrKysrKwo+ID4+wqAgMyBmaWxlcyBjaGFuZ2VkLCAxNDczIGluc2VydGlvbnMo KykKPiA+PsKgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL210ZC9uYW5kL3Jhdy9yb2NrY2hp cC1uYW5kLWNvbnRyb2xsZXIuYwo+ID4+Cj4gPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25h bmQvcmF3L0tjb25maWcgYi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9LY29uZmlnCj4gPj4gaW5kZXgg NmM0NmYyNWI1N2UyLi4yY2M1MzNlNGUyMzkgMTAwNjQ0Cj4gPj4gLS0tIGEvZHJpdmVycy9tdGQv bmFuZC9yYXcvS2NvbmZpZwo+ID4+ICsrKyBiL2RyaXZlcnMvbXRkL25hbmQvcmF3L0tjb25maWcK PiA+PiBAQCAtNDYyLDYgKzQ2MiwxOCBAQCBjb25maWcgTVREX05BTkRfQVJBU0FOCj4gPj7CoCDC oCBFbmFibGVzIHRoZSBkcml2ZXIgZm9yIHRoZSBBcmFzYW4gTkFORCBmbGFzaCBjb250cm9sbGVy IG9uCj4gPj7CoCDCoCBaeW5xIFVsdHJhc2NhbGUrIE1QU29DLgo+ID4+wqAKPiA+PiArY29uZmln IE1URF9OQU5EX1JPQ0tDSElQCj4gPj4gKwl0cmlzdGF0ZSAiUm9ja2NoaXAgTkFORCBjb250cm9s bGVyIgo+ID4+ICsJZGVwZW5kcyBvbiBBUkNIX1JPQ0tDSElQICYmIEhBU19JT01FTQo+ID4+ICsJ aGVscAo+ID4+ICsJwqAgRW5hYmxlcyBzdXBwb3J0IGZvciBOQU5EIGNvbnRyb2xsZXIgb24gUm9j a2NoaXAgU29Dcy4KPiA+PiArCcKgIFRoZXJlIGFyZSBmb3VyIGRpZmZlcmVudCB2ZXJzaW9ucyBv ZiBOQU5EIEZMQVNIIENvbnRyb2xsZXJzLAo+ID4+ICsJwqAgaW5jbHVkaW5nOgo+ID4+ICsJwqDC oMKgIE5GQyB2NjAwOiBSSzI5MjgsIFJLMzA2NiwgUkszMTg4Cj4gPj4gKwnCoMKgwqAgTkZDIHY2 MjI6IFJLMzAzNiwgUkszMTI4Cj4gPj4gKwnCoMKgwqAgTkZDIHY4MDA6IFJLMzMwOCwgUlYxMTA4 Cj4gPj4gKwnCoMKgwqAgTkZDIHY5MDA6IFBYMzAsIFJLMzMyNgo+ID4+ICsKPiA+PsKgIGNvbW1l bnQgIk1pc2MiCj4gPj7CoAo+ID4+wqAgY29uZmlnIE1URF9TTV9DT01NT04KPiA+PiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9tdGQvbmFuZC9yYXcvTWFrZWZpbGUgYi9kcml2ZXJzL210ZC9uYW5kL3Jh dy9NYWtlZmlsZQo+ID4+IGluZGV4IDI5MzBmNWI5MDE1ZC4uOTYwYzliZTI1MjA0IDEwMDY0NAo+ ID4+IC0tLSBhL2RyaXZlcnMvbXRkL25hbmQvcmF3L01ha2VmaWxlCj4gPj4gKysrIGIvZHJpdmVy cy9tdGQvbmFuZC9yYXcvTWFrZWZpbGUKPiA+PiBAQCAtNTgsNiArNTgsNyBAQCBvYmotJChDT05G SUdfTVREX05BTkRfU1RNMzJfRk1DMikJKz0gc3RtMzJfZm1jMl9uYW5kLm8KPiA+PsKgIG9iai0k KENPTkZJR19NVERfTkFORF9NRVNPTikJKz0gbWVzb25fbmFuZC5vCj4gPj7CoCBvYmotJChDT05G SUdfTVREX05BTkRfQ0FERU5DRSkJKz0gY2FkZW5jZS1uYW5kLWNvbnRyb2xsZXIubwo+ID4+wqAg b2JqLSQoQ09ORklHX01URF9OQU5EX0FSQVNBTikJKz0gYXJhc2FuLW5hbmQtY29udHJvbGxlci5v Cj4gPj4gK29iai0kKENPTkZJR19NVERfTkFORF9ST0NLQ0hJUCkJKz0gcm9ja2NoaXAtbmFuZC1j b250cm9sbGVyLm8KPiA+PsKgCj4gPj7CoCBuYW5kLW9ianMgOj0gbmFuZF9iYXNlLm8gbmFuZF9s ZWdhY3kubyBuYW5kX2JidC5vIG5hbmRfdGltaW5ncy5vIG5hbmRfaWRzLm8KPiA+PsKgIG5hbmQt b2JqcyArPSBuYW5kX29uZmkubwo+ID4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3Jh dy9yb2NrY2hpcC1uYW5kLWNvbnRyb2xsZXIuYyBiL2RyaXZlcnMvbXRkL25hbmQvcmF3L3JvY2tj aGlwLW5hbmQtY29udHJvbGxlci5jCj4gPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+PiBpbmRl eCAwMDAwMDAwMDAwMDAuLjJlOTZmZDMxNDM0Ngo+ID4+IC0tLSAvZGV2L251bGwKPiA+PiArKysg Yi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9yb2NrY2hpcC1uYW5kLWNvbnRyb2xsZXIuYwo+ID4+IEBA IC0wLDAgKzEsMTQ2MCBAQAo+ID4+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIu MCBPUiBNSVQKPiA+PiArLyoKPiA+PiArICogUm9ja2NoaXAgTkFORCBGbGFzaCBjb250cm9sbGVy IGRyaXZlci4KPiA+PiArICogQ29weXJpZ2h0IChDKSAyMDIwIFJvY2tjaGlwIEluYy4KPiA+PiAr ICogQXV0aG9yOiBZaWZlbmcgWmhhbyA8eWlmZW5nLnpoYW9Acm9jay1jaGlwcy5jb20+Cj4gPj4g KyAqLwo+ID4+ICsKPiA+PiArI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgo+ID4+ICsjaW5jbHVkZSA8 bGludXgvZGVsYXkuaD4KPiA+PiArI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Cj4gPj4g KyNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KPiA+PiArI2luY2x1ZGUgPGxpbnV4L2ludGVy cnVwdC5oPgo+ID4+ICsjaW5jbHVkZSA8bGludXgvaW9wb2xsLmg+Cj4gPj4gKyNpbmNsdWRlIDxs aW51eC9tb2R1bGUuaD4KPiA+PiArI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KPiA+PiArI2lu Y2x1ZGUgPGxpbnV4L210ZC9yYXduYW5kLmg+Cj4gPj4gKyNpbmNsdWRlIDxsaW51eC9vZi5oPgo+ ID4+ICsjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Cj4gPj4gKyNpbmNsdWRlIDxsaW51eC9w bGF0Zm9ybV9kZXZpY2UuaD4KPiA+PiArI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KPiA+PiArCj4g Pj4gKy8qCj4gPj4gKyAqIE5GQyBQYWdlIERhdGEgTGF5b3V0Ogo+ID4+ICsgKgkxMDI0IEJ5dGVz IERhdGEgKyA0Qnl0ZXMgc3lzIGRhdGEgKyAyOEJ5dGVzfjEyNEJ5dGVzIGVjYyArCj4gPj4gKyAq CTEwMjQgQnl0ZXMgRGF0YSArIDRCeXRlcyBzeXMgZGF0YSArIDI4Qnl0ZXN+MTI0Qnl0ZXMgZWNj ICsKPiA+PiArICoJLi4uLi4uCj4gPj4gKyAqIE5BTkQgUGFnZSBEYXRhIExheW91dDoKPiA+PiAr ICoJMTAyNCAqIG4gRGF0YSArIG0gQnl0ZXMgb29iCj4gPj4gKyAqIE9yaWdpbmFsIEJhZCBCbG9j ayBNYXNrIExvY2F0aW9uOgo+ID4+ICsgKglGaXJzdCBieXRlIG9mIG9vYihzcGFyZSkuCj4gPj4g KyAqIG5hbmRfY2hpcC0+b29iX3BvaSBkYXRhIGxheW91dDoKPiA+PiArICoJNEJ5dGVzIHN5cyBk YXRhICsgLi4uLiArIDRCeXRlcyBzeXMgZGF0YSArIGVjYyBkYXRhLgo+ID4+ICsgKi8KPiA+PiAr Cj4gPj4gKy8qIE5BTkQgY29udHJvbGxlciByZWdpc3RlciBkZWZpbml0aW9uICovCj4gPj4gKyNk ZWZpbmUgTkZDX1JFQUQJKDApCj4gPj4gKyNkZWZpbmUgTkZDX1dSSVRFCSgxKQo+ID4+ICsKPiA+ PiArI2RlZmluZSBORkNfRk1DVEwJKDB4MDApCj4gPj4gKyNkZWZpbmXCoMKgIEZNQ1RMX0NFX1NF TF9NCTB4RkYKPiA+PiArI2RlZmluZcKgwqAgRk1DVExfQ0VfU0VMKHgpCSgxIDw8ICh4KSkKPiA+ PiArI2RlZmluZcKgwqAgRk1DVExfV1AJQklUKDgpCj4gPj4gKyNkZWZpbmXCoMKgIEZNQ1RMX1JE WQlCSVQoOSkKPiA+PiArCj4gPj4gKyNkZWZpbmUgTkZDX0ZNV0FJVAkoMHgwNCkKPiA+PiArI2Rl ZmluZcKgwqAgRkxDVExfUlNUCUJJVCgwKQo+ID4+ICsjZGVmaW5lwqDCoCBGTENUTF9XUgkoMSkJ LyogMDogcmVhZCwgMTogd3JpdGUgKi8KPiA+PiArI2RlZmluZcKgwqAgRkxDVExfWEZFUl9TVAlC SVQoMikKPiA+PiArI2RlZmluZcKgwqAgRkxDVExfWEZFUl9FTglCSVQoMykKPiA+PiArI2RlZmlu ZcKgwqAgRkxDVExfQUNPUlJFQ1QJQklUKDEwKSAvKiBBdXRvIGNvcnJlY3QgZXJyb3IgYml0cy4g Ki8KPiA+PiArI2RlZmluZcKgwqAgRkxDVExfWEZFUl9SRUFEWQlCSVQoMjApCj4gPj4gKyNkZWZp bmXCoMKgIEZMQ1RMX1hGRVJfU0VDVE9SCSgyMikKPiA+PiArI2RlZmluZcKgwqAgRkxDVExfVE9H X0ZJWAlCSVQoMjkpCj4gPj4gKwo+ID4+ICsjZGVmaW5lwqDCoCBCQ0hDVExfQkFOS19NCSg3IDw8 IDUpCj4gPj4gKyNkZWZpbmXCoMKgIEJDSENUTF9CQU5LCSg1KQo+ID4+ICsKPiA+PiArI2RlZmlu ZcKgwqAgRE1BX1NUCUJJVCgwKQo+ID4+ICsjZGVmaW5lwqDCoCBETUFfV1IJKDEpCS8qIDA6IHdy aXRlLCAxOiByZWFkICovCj4gPj4gKyNkZWZpbmXCoMKgIERNQV9FTglCSVQoMikKPiA+PiArI2Rl ZmluZcKgwqAgRE1BX0FIQl9TSVpFCSgzKQkvKiAwOiAxLCAxOiAyLCAyOiA0ICovCj4gPj4gKyNk ZWZpbmXCoMKgIERNQV9CVVJTVF9TSVpFCSg2KQkvKiAwOiAxLCAzOiA0LCA1OiA4LCA3OiAxNiAq Lwo+ID4+ICsjZGVmaW5lwqDCoCBETUFfSU5DX05VTQkoOSkJLyogMSAtIDE2ICovCj4gPj4gKwo+ ID4+ICsjZGVmaW5lIEVDQ19FUlJfQ05UKHgsIGUpICgoKCh4KSA+PiAoZSkubG93KSAmIChlKS5s b3dfbWFzaykgfFwKPiA+PiArCcKgICgoKHgpID4+IChlKS5oaWdoKSAmIChlKS5oaWdoX21hc2sp IDw8IChlKS5sb3dfYm4pCj4gPj4gKyNkZWZpbmXCoMKgIElOVF9ETUEJQklUKDApCj4gPj4gKyNk ZWZpbmUgTkZDX0JBTksJKDB4ODAwKQo+ID4+ICsjZGVmaW5lIE5GQ19CQU5LX1NURVAJKDB4MTAw KQo+ID4+ICsjZGVmaW5lwqDCoCBCQU5LX0RBVEEJKDB4MDApCj4gPj4gKyNkZWZpbmXCoMKgIEJB TktfQUREUgkoMHgwNCkKPiA+PiArI2RlZmluZcKgwqAgQkFOS19DTUQJKDB4MDgpCj4gPj4gKyNk ZWZpbmUgTkZDX1NSQU0wCSgweDEwMDApCj4gPj4gKyNkZWZpbmUgTkZDX1NSQU0xCSgweDE0MDAp Cj4gPj4gKyNkZWZpbmUgTkZDX1NSQU1fU0laRQkoMHg0MDApCj4gPj4gKyNkZWZpbmUgTkZDX1RJ TUVPVVQJKDUwMDAwMCkKPiA+PiArI2RlZmluZSBORkNfTUFYX09PQl9QRVJfU1RFUAkxMjgKPiA+ PiArI2RlZmluZSBORkNfTUlOX09PQl9QRVJfU1RFUAk2NAo+ID4+ICsjZGVmaW5lIE1BWF9EQVRB X1NJWkUJMHhGRkZDCj4gPj4gKyNkZWZpbmUgTUFYX0FERFJFU1NfQ1lDCTYKPiA+PiArI2RlZmlu ZSBORkNfRUNDX01BWF9NT0RFUwk0Cj4gPj4gKyNkZWZpbmUgTkZDX01BWF9OU0VMUwkoOCkgLyog U29tZSBTb2NzIG9ubHkgaGF2ZSAxIG9yIDIgQ1NzLiAqLwo+ID4+ICsjZGVmaW5lIE5GQ19TWVNf REFUQV9TSVpFCSg0KSAvKiA0IGJ5dGVzIHN5cyBkYXRhIGluIG9vYiBwcmUgMTAyNCBkYXRhLiov Cj4gPj4gKyNkZWZpbmUgUktfREVGQVVMVF9DTE9DS19SQVRFCSgxNTAgKiAxMDAwICogMTAwMCkg LyogMTUwIE1oeiAqLwo+ID4+ICsjZGVmaW5lIEFDQ1RJTUlORyhjc3J3LCByd3B3LCByd2NzKQko KGNzcncpIDw8IDEyIHwgKHJ3cHcpIDw8IDUgfCAocndjcykpCj4gPj4gKwo+ID4+ICtlbnVtIG5m Y190eXBlIHsKPiA+PiArCU5GQ19WNiwKPiA+PiArCU5GQ19WOCwKPiA+PiArCU5GQ19WOSwKPiA+ PiArfTsKPiA+PiArCj4gPj4gKy8qKgo+ID4+ICsgKiBzdHJ1Y3QgcmtfZWNjX2NudF9zdGF0dXM6 IHJlcHJlc2VudCBhIGVjYyBzdGF0dXMgZGF0YS4KPiA+PiArICogQGVycl9mbGFnX2JpdDogZXJy b3IgZmxhZyBiaXQgaW5kZXggYXQgcmVnaXN0ZXIuCj4gPj4gKyAqIEBsb3c6IGVjYyBjb3VudCBs b3cgYml0IGluZGV4IGF0IHJlZ2lzdGVyLgo+ID4+ICsgKiBAbG93X21hc2s6IG1hc2sgYml0Lgo+ ID4+ICsgKiBAbG93X2JuOiBlY2MgY291bnQgbG93IGJpdCBudW1iZXIuCj4gPj4gKyAqIEBoaWdo OiBlY2MgY291bnQgaGlnaCBiaXQgaW5kZXggYXQgcmVnaXN0ZXIuCj4gPj4gKyAqIEBoaWdoX21h c2s6IG1hc2sgYml0Cj4gPj4gKyAqLwo+ID4+ICtzdHJ1Y3QgZWNjX2NudF9zdGF0dXMgewo+ID4+ ICsJdTggZXJyX2ZsYWdfYml0Owo+ID4+ICsJdTggbG93Owo+ID4+ICsJdTggbG93X21hc2s7Cj4g Pj4gKwl1OCBsb3dfYm47Cj4gPj4gKwl1OCBoaWdoOwo+ID4+ICsJdTggaGlnaF9tYXNrOwo+ID4+ ICt9Owo+ID4+ICsKPiA+PiArLyoKPiA+PiArICogQHR5cGU6IG5mYyB2ZXJzaW9uCj4gPj4gKyAq IEBlY2Nfc3RyZW5ndGhzOiBlY2Mgc3RyZW5ndGhzCj4gPj4gKyAqIEBlY2NfY2ZnczogZWNjIGNv bmZpZyB2YWx1ZXMKPiA+PiArICogQGZsY3RsX29mZjogRkxDVEwgcmVnaXN0ZXIgb2Zmc2V0Cj4g Pj4gKyAqIEBiY2hjdGxfb2ZmOiBCQ0hDVEwgcmVnaXN0ZXIgb2Zmc2V0Cj4gPj4gKyAqIEBkbWFf ZGF0YV9idWZfb2ZmOiBETUFfREFUQV9CVUYgcmVnaXN0ZXIgb2Zmc2V0Cj4gPj4gKyAqIEBkbWFf b29iX2J1Zl9vZmY6IERNQV9PT0JfQlVGIHJlZ2lzdGVyIG9mZnNldAo+ID4+ICsgKiBAZG1hX2Nm Z19vZmY6IERNQV9DRkcgcmVnaXN0ZXIgb2Zmc2V0Cj4gPj4gKyAqIEBkbWFfc3Rfb2ZmOiBETUFf U1QgcmVnaXN0ZXIgb2Zmc2V0Cj4gPj4gKyAqIEBiY2hfc3Rfb2ZmOiBCQ0dfU1QgcmVnaXN0ZXIg b2Zmc2V0Cj4gPj4gKyAqIEByYW5kbXpfb2ZmOiBSQU5ETVogcmVnaXN0ZXIgb2Zmc2V0Cj4gPj4g KyAqIEBpbnRfZW5fb2ZmOiBpbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyIG9mZnNldAo+ID4+ICsg KiBAaW50X2Nscl9vZmY6IGludGVycnVwdCBjbGVhbiByZWdpc3RlciBvZmZzZXQKPiA+PiArICog QGludF9zdF9vZmY6IGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgb2Zmc2V0Cj4gPj4gKyAqIEBv b2IwX29mZjogb29iMCByZWdpc3RlciBvZmZzZXQKPiA+PiArICogQG9vYjFfb2ZmOiBvb2IxIHJl Z2lzdGVyIG9mZnNldAo+ID4+ICsgKiBAZWNjMDogcmVwcmVzZW50IEVDQzAgc3RhdHVzIGRhdGEK PiA+PiArICogQGVjYzE6IHJlcHJlc2VudCBFQ0MxIHN0YXR1cyBkYXRhCj4gPj4gKyAqLwo+ID4+ ICtzdHJ1Y3QgbmZjX2NmZyB7Cj4gPj4gKwllbnVtIG5mY190eXBlIHR5cGU7Cj4gPj4gKwl1OCBl Y2Nfc3RyZW5ndGhzW05GQ19FQ0NfTUFYX01PREVTXTsKPiA+PiArCXUzMiBlY2NfY2Znc1tORkNf RUNDX01BWF9NT0RFU107Cj4gPj4gKwl1MzIgZmxjdGxfb2ZmOwo+ID4+ICsJdTMyIGJjaGN0bF9v ZmY7Cj4gPj4gKwl1MzIgZG1hX2NmZ19vZmY7Cj4gPj4gKwl1MzIgZG1hX2RhdGFfYnVmX29mZjsK PiA+PiArCXUzMiBkbWFfb29iX2J1Zl9vZmY7Cj4gPj4gKwl1MzIgZG1hX3N0X29mZjsKPiA+PiAr CXUzMiBiY2hfc3Rfb2ZmOwo+ID4+ICsJdTMyIHJhbmRtel9vZmY7Cj4gPj4gKwl1MzIgaW50X2Vu X29mZjsKPiA+PiArCXUzMiBpbnRfY2xyX29mZjsKPiA+PiArCXUzMiBpbnRfc3Rfb2ZmOwo+ID4+ ICsJdTMyIG9vYjBfb2ZmOwo+ID4+ICsJdTMyIG9vYjFfb2ZmOwo+ID4+ICsJc3RydWN0IGVjY19j bnRfc3RhdHVzIGVjYzA7Cj4gPj4gKwlzdHJ1Y3QgZWNjX2NudF9zdGF0dXMgZWNjMTsKPiA+PiAr fTsKPiA+PiArCj4gPj4gK3N0cnVjdCBya19uZmNfbmFuZF9jaGlwIHsKPiA+PiArCXN0cnVjdCBs aXN0X2hlYWQgbm9kZTsKPiA+PiArCXN0cnVjdCBuYW5kX2NoaXAgY2hpcDsKPiA+PiArCj4gPj4g Kwl1MTYgc3BhcmVfcGVyX3NlY3RvcjsKPiA+PiArCXUxNiBvb2JfYnVmX3Blcl9zZWN0b3I7Cj4g Pj4gKwl1MTYgYm9vdF9ibGtzOwo+ID4+ICsJdTE2IGJvb3RfZWNjOwo+ID4+ICsJdTE2IG1ldGFk YXRhX3NpemU7Cj4gPj4gKwo+ID4+ICsJdTggbnNlbHM7Cj4gPj4gKwl1OCBzZWxzWzBdOwo+ID4+ ICsJLyogTm90aGluZyBhZnRlciB0aGlzIGZpZWxkLiAqLwo+ID4+ICt9Owo+ID4+ICsKPiA+PiAr c3RydWN0IHJrX25mYyB7Cj4gPj4gKwlzdHJ1Y3QgbmFuZF9jb250cm9sbGVyIGNvbnRyb2xsZXI7 Cj4gPj4gKwljb25zdCBzdHJ1Y3QgbmZjX2NmZyAqY2ZnOwo+ID4+ICsJc3RydWN0IGRldmljZSAq ZGV2Owo+ID4+ICsKPiA+PiArCXN0cnVjdCBjbGsgKm5mY19jbGs7Cj4gPj4gKwlzdHJ1Y3QgY2xr ICphaGJfY2xrOwo+ID4+ICsJdm9pZCBfX2lvbWVtICpyZWdzOwo+ID4+ICsKPiA+PiArCXUzMiBz ZWxlY3RlZF9iYW5rOwo+ID4+ICsJdTMyIGJhbmRfb2Zmc2V0Owo+ID4+ICsJdTMyIGN1cl9jbGs7 Cj4gPj4gKwo+ID4+ICsJc3RydWN0IGNvbXBsZXRpb24gZG9uZTsKPiA+PiArCXN0cnVjdCBsaXN0 X2hlYWQgY2hpcHM7Cj4gPj4gKwo+ID4+ICsJdTggKmJ1ZmZlcjsKPiA+PiArCXU4ICpwYWdlX2J1 ZjsKPiA+PiArCXUzMiAqb29iX2J1ZjsKPiA+PiArCXUzMiBidWZmZXJfc2l6ZTsKPiA+PiArCXUz MiBvb2JfYnVmX3NpemU7Cj4gPj4gKwo+ID4+ICsJdW5zaWduZWQgbG9uZyBhc3NpZ25lZF9jczsK PiA+PiArfTsKPiA+PiArCj4gPj4gK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJrX25mY19uYW5kX2No aXAgKnJrX25mY190b19ya25hbmQoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCkKPiA+PiArewo+ID4+ ICsJcmV0dXJuIGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCwgY2hp cCk7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyBpbmxpbmUgdTggKnJrX25mY19idWZfdG9f ZGF0YV9wdHIoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgY29uc3QgdTggKnAsIGludCBpKQo+ID4+ ICt7Cj4gPj4gKwlyZXR1cm4gKHU4ICopcCArIGkgKiBjaGlwLT5lY2Muc2l6ZTsKPiA+PiArfQo+ ID4+ICsKPiA+PiArc3RhdGljIGlubGluZSB1OCAqcmtfbmZjX2J1Zl90b19vb2JfcHRyKHN0cnVj dCBuYW5kX2NoaXAgKmNoaXAsIGludCBpKQo+ID4+ICt7Cj4gPj4gKwl1OCAqcG9pOwo+ID4+ICsK PiA+PiArCXBvaSA9IGNoaXAtPm9vYl9wb2kgKyBpICogTkZDX1NZU19EQVRBX1NJWkU7Cj4gPj4g Kwo+ID4+ICsJcmV0dXJuIHBvaTsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGlubGluZSB1 OCAqcmtfbmZjX2J1Zl90b19vb2JfZWNjX3B0cihzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQg aSkKPiA+PiArewo+ID4+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZCA9IHJrX25m Y190b19ya25hbmQoY2hpcCk7Cj4gPj4gKwl1OCAqcG9pOwo+ID4+ICsKPiA+PiArCXBvaSA9IGNo aXAtPm9vYl9wb2kgKyBya25hbmQtPm1ldGFkYXRhX3NpemUgKwo+ID4+ICsJwqDCoMKgwqDCoCBj aGlwLT5lY2MuYnl0ZXMgKiBpOwo+ID4+ICsKPiA+PiArCXJldHVybiBwb2k7Cj4gPj4gK30KPiA+ PiArCj4gPj4gK3N0YXRpYyBpbmxpbmUgaW50IHJrX25mY19kYXRhX2xlbihzdHJ1Y3QgbmFuZF9j aGlwICpjaGlwKQo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCAqcmtuYW5k ID0gcmtfbmZjX3RvX3JrbmFuZChjaGlwKTsKPiA+PiArCj4gPj4gKwlyZXR1cm4gY2hpcC0+ZWNj LnNpemUgKyBya25hbmQtPnNwYXJlX3Blcl9zZWN0b3I7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0 YXRpYyBpbmxpbmUgdTggKnJrX25mY19kYXRhX3B0cihzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLMKg IGludCBpKQo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBuYW5kX2dldF9jb250 cm9sbGVyX2RhdGEoY2hpcCk7Cj4gPj4gKwo+ID4+ICsJcmV0dXJuIG5mYy0+YnVmZmVyICsgaSAq IHJrX25mY19kYXRhX2xlbihjaGlwKTsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGlubGlu ZSB1OCAqcmtfbmZjX29vYl9wdHIoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgaW50IGkpCj4gPj4g K3sKPiA+PiArCXN0cnVjdCBya19uZmMgKm5mYyA9IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShj aGlwKTsKPiA+PiArCj4gPj4gKwlyZXR1cm4gbmZjLT5idWZmZXIgKyBpICogcmtfbmZjX2RhdGFf bGVuKGNoaXApICsgY2hpcC0+ZWNjLnNpemU7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyB2 b2lkIHJrX25mY19zZWxlY3RfY2hpcChzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQgY3MpCj4g Pj4gK3sKPiA+PiArCXN0cnVjdCBya19uZmMgKm5mYyA9IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0 YShjaGlwKTsKPiA+PiArCXN0cnVjdCBya19uZmNfbmFuZF9jaGlwICpya25hbmQgPSBya19uZmNf dG9fcmtuYW5kKGNoaXApOwo+ID4+ICsJdTMyIHZhbDsKPiA+PiArCj4gPj4gKwlpZiAoY3MgPCAw KSB7Cj4gPj4gKwluZmMtPnNlbGVjdGVkX2JhbmsgPSAtMTsKPiA+PiArCS8qIERlc2VsZWN0IHRo ZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGFyZ2V0LiAqLwo+ID4+ICsJdmFsID0gcmVhZGxfcmVsYXhl ZChuZmMtPnJlZ3MgKyBORkNfRk1DVEwpOwo+ID4+ICsJdmFsICY9IH5GTUNUTF9DRV9TRUxfTTsK PiA+PiArCXdyaXRlbCh2YWwsIG5mYy0+cmVncyArIE5GQ19GTUNUTCk7Cj4gPj4gKwlyZXR1cm47 Cj4gPj4gKwl9Cj4gPj4gKwo+ID4+ICsJbmZjLT5zZWxlY3RlZF9iYW5rID0gcmtuYW5kLT5zZWxz W2NzXTsKPiA+PiArCW5mYy0+YmFuZF9vZmZzZXQgPSBORkNfQkFOSyArIG5mYy0+c2VsZWN0ZWRf YmFuayAqIE5GQ19CQU5LX1NURVA7Cj4gPj4gKwo+ID4+ICsJdmFsID0gcmVhZGxfcmVsYXhlZChu ZmMtPnJlZ3MgKyBORkNfRk1DVEwpOwo+ID4+ICsJdmFsICY9IH5GTUNUTF9DRV9TRUxfTTsKPiA+ PiArCXZhbCB8PSBGTUNUTF9DRV9TRUwobmZjLT5zZWxlY3RlZF9iYW5rKTsKPiA+PiArCj4gPj4g Kwl3cml0ZWwodmFsLCBuZmMtPnJlZ3MgKyBORkNfRk1DVEwpOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ ICtzdGF0aWMgaW5saW5lIGludCBya19uZmNfd2FpdF9pb3JlYWR5KHN0cnVjdCBya19uZmMgKm5m YykKPiA+PiArewo+ID4+ICsJaW50IHJjOwo+ID4+ICsJdTMyIHZhbDsKPiA+PiArCj4gPj4gKwly YyA9IHJlYWRsX3JlbGF4ZWRfcG9sbF90aW1lb3V0KG5mYy0+cmVncyArIE5GQ19GTUNUTCwgdmFs LAo+ID4+ICsJdmFsICYgRk1DVExfUkRZLCAxMCwgTkZDX1RJTUVPVVQpOwo+ID4+ICsKPiA+PiAr CXJldHVybiByYzsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIHZvaWQgcmtfbmZjX3JlYWRf YnVmKHN0cnVjdCBya19uZmMgKm5mYywgdTggKmJ1ZiwgaW50IGxlbikKPiA+PiArewo+ID4+ICsJ aW50IGk7Cj4gPj4gKwo+ID4+ICsJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQo+ID4+ICsJYnVm W2ldID0gcmVhZGJfcmVsYXhlZChuZmMtPnJlZ3MgKyBuZmMtPmJhbmRfb2Zmc2V0ICsKPiA+PiAr CcKgwqDCoMKgwqDCoCBCQU5LX0RBVEEpOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgdm9p ZCBya19uZmNfd3JpdGVfYnVmKHN0cnVjdCBya19uZmMgKm5mYywgY29uc3QgdTggKmJ1ZiwgaW50 IGxlbikKPiA+PiArewo+ID4+ICsJaW50IGk7Cj4gPj4gKwo+ID4+ICsJZm9yIChpID0gMDsgaSA8 IGxlbjsgaSsrKQo+ID4+ICsJd3JpdGViKGJ1ZltpXSwgbmZjLT5yZWdzICsgbmZjLT5iYW5kX29m ZnNldCArIEJBTktfREFUQSk7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyBpbnQgcmtfbmZj X2NtZChzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAo+ID4+ICsJwqDCoMKgwqDCoCBjb25zdCBzdHJ1 Y3QgbmFuZF9zdWJvcCAqc3Vib3ApCj4gPj4gK3sKPiA+PiArCXN0cnVjdCBya19uZmMgKm5mYyA9 IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShjaGlwKTsKPiA+PiArCXVuc2lnbmVkIGludCBpLCBq LCByZW1haW5pbmcsIHN0YXJ0Owo+ID4+ICsJaW50IHJlZ19vZmZzZXQgPSBuZmMtPmJhbmRfb2Zm c2V0Owo+ID4+ICsJdTggKmluYnVmID0gTlVMTDsKPiA+PiArCWNvbnN0IHU4ICpvdXRidWY7Cj4g Pj4gKwl1MzIgY250ID0gMDsKPiA+PiArCWludCByZXQgPSAwOwo+ID4+ICsKPiA+PiArCWZvciAo aSA9IDA7IGkgPCBzdWJvcC0+bmluc3RyczsgaSsrKSB7Cj4gPj4gKwljb25zdCBzdHJ1Y3QgbmFu ZF9vcF9pbnN0ciAqaW5zdHIgPSAmc3Vib3AtPmluc3Ryc1tpXTsKPiA+PiArCj4gPj4gKwlzd2l0 Y2ggKGluc3RyLT50eXBlKSB7Cj4gPj4gKwljYXNlIE5BTkRfT1BfQ01EX0lOU1RSOgo+ID4+ICsJ d3JpdGViKGluc3RyLT5jdHguY21kLm9wY29kZSwKPiA+PiArCcKgwqDCoMKgwqDCoCBuZmMtPnJl Z3MgKyByZWdfb2Zmc2V0ICsgQkFOS19DTUQpOwo+ID4+ICsJYnJlYWs7Cj4gPj4gKwo+ID4+ICsJ Y2FzZSBOQU5EX09QX0FERFJfSU5TVFI6Cj4gPj4gKwlyZW1haW5pbmcgPSBuYW5kX3N1Ym9wX2dl dF9udW1fYWRkcl9jeWMoc3Vib3AsIGkpOwo+ID4+ICsJc3RhcnQgPSBuYW5kX3N1Ym9wX2dldF9h ZGRyX3N0YXJ0X29mZihzdWJvcCwgaSk7Cj4gPj4gKwo+ID4+ICsJZm9yIChqID0gMDsgaiA8IDgg JiYgaiArIHN0YXJ0IDwgcmVtYWluaW5nOyBqKyspCj4gPj4gKwl3cml0ZWIoaW5zdHItPmN0eC5h ZGRyLmFkZHJzW2ogKyBzdGFydF0sCj4gPj4gKwnCoMKgwqDCoMKgwqAgbmZjLT5yZWdzICsgcmVn X29mZnNldCArIEJBTktfQUREUik7Cj4gPj4gKwlicmVhazsKPiA+PiArCj4gPj4gKwljYXNlIE5B TkRfT1BfREFUQV9JTl9JTlNUUjoKPiA+PiArCWNhc2UgTkFORF9PUF9EQVRBX09VVF9JTlNUUjoK PiA+PiArCXN0YXJ0ID0gbmFuZF9zdWJvcF9nZXRfZGF0YV9zdGFydF9vZmYoc3Vib3AsIGkpOwo+ ID4+ICsJY250ID0gbmFuZF9zdWJvcF9nZXRfZGF0YV9sZW4oc3Vib3AsIGkpOwo+ID4+ICsKPiA+ PiArCWlmIChpbnN0ci0+dHlwZSA9PSBOQU5EX09QX0RBVEFfT1VUX0lOU1RSKSB7Cj4gPj4gKwlv dXRidWYgPSBpbnN0ci0+Y3R4LmRhdGEuYnVmLm91dCArIHN0YXJ0Owo+ID4+ICsJcmtfbmZjX3dy aXRlX2J1ZihuZmMsIG91dGJ1ZiwgY250KTsKPiA+PiArCX0gZWxzZSB7Cj4gPj4gKwlpbmJ1ZiA9 IGluc3RyLT5jdHguZGF0YS5idWYuaW4gKyBzdGFydDsKPiA+PiArCXJrX25mY19yZWFkX2J1Zihu ZmMsIGluYnVmLCBjbnQpOwo+ID4+ICsJfQo+ID4+ICsJYnJlYWs7Cj4gPj4gKwo+ID4+ICsJY2Fz ZSBOQU5EX09QX1dBSVRSRFlfSU5TVFI6Cj4gPj4gKwlpZiAocmtfbmZjX3dhaXRfaW9yZWFkeShu ZmMpIDwgMCkgewo+ID4+ICsJcmV0ID0gLUVUSU1FRE9VVDsKPiA+PiArCWRldl9lcnIobmZjLT5k ZXYsICJJTyBub3QgcmVhZHlcbiIpOwo+ID4+ICsJfQo+ID4+ICsJYnJlYWs7Cj4gPj4gKwl9Cj4g Pj4gKwl9Cj4gPj4gKwo+ID4+ICsJcmV0dXJuIHJldDsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3Rh dGljIGNvbnN0IHN0cnVjdCBuYW5kX29wX3BhcnNlciBya19uZmNfb3BfcGFyc2VyID0gTkFORF9P UF9QQVJTRVIoCj4gPj4gKwlOQU5EX09QX1BBUlNFUl9QQVRURVJOKAo+ID4+ICsJcmtfbmZjX2Nt ZCwKPiA+PiArCU5BTkRfT1BfUEFSU0VSX1BBVF9DTURfRUxFTSh0cnVlKSwKPiA+PiArCU5BTkRf T1BfUEFSU0VSX1BBVF9BRERSX0VMRU0odHJ1ZSwgTUFYX0FERFJFU1NfQ1lDKSwKPiA+PiArCU5B TkRfT1BfUEFSU0VSX1BBVF9DTURfRUxFTSh0cnVlKSwKPiA+PiArCU5BTkRfT1BfUEFSU0VSX1BB VF9XQUlUUkRZX0VMRU0odHJ1ZSksCj4gPj4gKwlOQU5EX09QX1BBUlNFUl9QQVRfREFUQV9JTl9F TEVNKHRydWUsIE1BWF9EQVRBX1NJWkUpKSwKPiA+PiArCU5BTkRfT1BfUEFSU0VSX1BBVFRFUk4o Cj4gPj4gKwlya19uZmNfY21kLAo+ID4+ICsJTkFORF9PUF9QQVJTRVJfUEFUX0NNRF9FTEVNKHRy dWUpLAo+ID4+ICsJTkFORF9PUF9QQVJTRVJfUEFUX0FERFJfRUxFTSh0cnVlLCBNQVhfQUREUkVT U19DWUMpLAo+ID4+ICsJTkFORF9PUF9QQVJTRVJfUEFUX0RBVEFfT1VUX0VMRU0odHJ1ZSwgTUFY X0RBVEFfU0laRSksCj4gPj4gKwlOQU5EX09QX1BBUlNFUl9QQVRfQ01EX0VMRU0odHJ1ZSksCj4g Pj4gKwlOQU5EX09QX1BBUlNFUl9QQVRfV0FJVFJEWV9FTEVNKHRydWUpKSwKPiA+PiArKTsKPiA+ PiArCj4gPj4gK3N0YXRpYyBpbnQgcmtfbmZjX2V4ZWNfb3Aoc3RydWN0IG5hbmRfY2hpcCAqY2hp cCwKPiA+PiArCcKgIGNvbnN0IHN0cnVjdCBuYW5kX29wZXJhdGlvbiAqb3AsCj4gPj4gKwnCoCBi b29sIGNoZWNrX29ubHkpCj4gPj4gK3sKPiA+PiArCWlmICghY2hlY2tfb25seSkKPiA+PiArCXJr X25mY19zZWxlY3RfY2hpcChjaGlwLCBvcC0+Y3MpOwo+ID4+ICsKPiA+PiArCXJldHVybiBuYW5k X29wX3BhcnNlcl9leGVjX29wKGNoaXAsICZya19uZmNfb3BfcGFyc2VyLCBvcCwKPiA+PiArCcKg wqDCoMKgwqAgY2hlY2tfb25seSk7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyBpbnQgcmtf bmZjX3NldHVwX2RhdGFfaW50ZXJmYWNlKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIGludCBjc2xp bmUsCj4gPj4gKwnCoMKgwqDCoMKgwqAgY29uc3Qgc3RydWN0IG5hbmRfaW50ZXJmYWNlX2NvbmZp ZyAqY29uZikgIAo+ID4KPiA+UGxlYXNlIGhhdmUgYSBsb29rIGF0IHRoZSByZWNlbnQgY2hhbmdl cyBpbiB0aGUgY29yZSwgdGhpcyBoZWxwZXIKPiA+c2hvdWxkIGJlIG5hbWVkICJzZXR1cF9pbnRl cmZhY2UiLgo+ID4gIAo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBuYW5kX2dl dF9jb250cm9sbGVyX2RhdGEoY2hpcCk7Cj4gPj4gKwljb25zdCBzdHJ1Y3QgbmFuZF9zZHJfdGlt aW5ncyAqdGltaW5nczsKPiA+PiArCXUzMiByYXRlLCB0YzJydywgdHJ3cHcsIHRydzJjOwo+ID4+ ICsJdTMyIHRlbXA7Cj4gPj4gKwo+ID4+ICsJaWYgKGNzbGluZSA9PSBOQU5EX0RBVEFfSUZBQ0Vf Q0hFQ0tfT05MWSkKPiA+PiArCXJldHVybiAwOwo+ID4+ICsKPiA+PiArCXRpbWluZ3MgPSBuYW5k X2dldF9zZHJfdGltaW5ncyhjb25mKTsKPiA+PiArCWlmIChJU19FUlIodGltaW5ncykpCj4gPj4g KwlyZXR1cm4gLUVPUE5PVFNVUFA7Cj4gPj4gKwo+ID4+ICsJaWYgKElTX0VSUihuZmMtPm5mY19j bGspKQo+ID4+ICsJcmF0ZSA9IGNsa19nZXRfcmF0ZShuZmMtPmFoYl9jbGspOwo+ID4+ICsJZWxz ZQo+ID4+ICsJcmF0ZSA9IGNsa19nZXRfcmF0ZShuZmMtPm5mY19jbGspOwo+ID4+ICsKPiA+PiAr CS8qIFR1cm4gY2xvY2sgcmF0ZSBpbnRvIGtIei4gKi8KPiA+PiArCXJhdGUgLz0gMTAwMDsKPiA+ PiArCj4gPj4gKwl0YzJydyA9IDE7Cj4gPj4gKwl0cncyYyA9IDE7Cj4gPj4gKwo+ID4+ICsJdHJ3 cHcgPSBtYXgodGltaW5ncy0+dFdDX21pbiwgdGltaW5ncy0+dFJDX21pbikgLyAxMDAwOwo+ID4+ ICsJdHJ3cHcgPSBESVZfUk9VTkRfVVAodHJ3cHcgKiByYXRlLCAxMDAwMDAwKTsKPiA+PiArCj4g Pj4gKwl0ZW1wID0gdGltaW5ncy0+dFJFQV9tYXggLyAxMDAwOwo+ID4+ICsJdGVtcCA9IERJVl9S T1VORF9VUCh0ZW1wICogcmF0ZSwgMTAwMDAwMCk7Cj4gPj4gKwo+ID4+ICsJaWYgKHRyd3B3IDwg dGVtcCkKPiA+PiArCXRyd3B3ID0gdGVtcDsKPiA+PiArCj4gPj4gKwkvKgo+ID4+ICsJKiBBQ0NP TjogYWNjZXNzIHRpbWluZyBjb250cm9sIHJlZ2lzdGVyCj4gPj4gKwkqIC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiA+PiArCSogMzE6MTg6IHJlc2VydmVkCj4gPj4gKwkq IDE3OjEyOiBjc3J3LCBjbG9jayBjeWNsZXMgZnJvbSB0aGUgZmFsbGluZyBlZGdlIG9mIENTbiB0 byB0aGUKPiA+PiArCSrCoMKgIGZhbGxpbmcgZWRnZSBvZiBSRG4gb3IgV1JuCj4gPj4gKwkqIDEx OjExOiByZXNlcnZlZAo+ID4+ICsJKiAxMDowNTogcndwdywgdGhlIHdpZHRoIG9mIFJEbiBvciBX Um4gaW4gcHJvY2Vzc29yIGNsb2NrIGN5Y2xlcwo+ID4+ICsJKiAwNDowMDogcndjcywgY2xvY2sg Y3ljbGVzIGZyb20gdGhlIHJpc2luZyBlZGdlIG9mIFJEbiBvciBXUm4gdG8gdGhlCj4gPj4gKwkq wqDCoCByaXNpbmcgZWRnZSBvZiBDU24KPiA+PiArCSovCj4gPj4gKwl0ZW1wID0gQUNDVElNSU5H KHRjMnJ3LCB0cndwdywgdHJ3MmMpOwo+ID4+ICsJd3JpdGVsKHRlbXAsIG5mYy0+cmVncyArIE5G Q19GTVdBSVQpOyAgCj4gPgo+ID5Zb3Ugc2hvdWxkIHNhdmUgdGhlIGNoaXAncyB0aW1pbmcgY29u ZmlndXJhdGlvbiBpbnN0ZWFkIG9mIHdyaXRpbmcgaXQKPiA+aGVyZSwgYW5kIHNldHRpbmcgdGhl IHJlZ2lzdGVyIHZhbHVlIGR1cmluZyBjaGlwIHNlbGVjdGlvbi4gVGhpcyB3YXkKPiA+eW91IG1h eSBoYW5kbGUgc2V2ZXJhbCBjaGlwcyB3aXRoIGRpZmZlcmVudCB0aW1pbmcKPiA+Y29uc3RyYWlu dHMvY29uZmlndXJhdGlvbnMuCj4gPiAgCj4gPj4gKwo+ID4+ICsJcmV0dXJuIDA7Cj4gPj4gK30K PiA+PiArCj4gPj4gK3N0YXRpYyBpbnQgcmtfbmZjX2h3X2VjY19zZXR1cChzdHJ1Y3QgbmFuZF9j aGlwICpjaGlwLAo+ID4+ICsJwqDCoMKgwqDCoMKgIHN0cnVjdCBuYW5kX2VjY19jdHJsICplY2Ms Cj4gPj4gKwnCoMKgwqDCoMKgwqAgdWludDMyX3Qgc3RyZW5ndGgpCj4gPj4gK3sKPiA+PiArCXN0 cnVjdCBya19uZmMgKm5mYyA9IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShjaGlwKTsKPiA+PiAr CXUzMiByZWcsIGk7Cj4gPj4gKwo+ID4+ICsJZm9yIChpID0gMDsgaSA8IE5GQ19FQ0NfTUFYX01P REVTOyBpKyspIHsKPiA+PiArCWlmIChlY2MtPnN0cmVuZ3RoID09IG5mYy0+Y2ZnLT5lY2Nfc3Ry ZW5ndGhzW2ldKSB7Cj4gPj4gKwlyZWcgPSBuZmMtPmNmZy0+ZWNjX2NmZ3NbaV07Cj4gPj4gKwli cmVhazsKPiA+PiArCX0KPiA+PiArCX0KPiA+PiArCj4gPj4gKwlpZiAoaSA+PSBORkNfRUNDX01B WF9NT0RFUykKPiA+PiArCXJldHVybiAtRUlOVkFMOwo+ID4+ICsKPiA+PiArCXdyaXRlbChyZWcs IG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5iY2hjdGxfb2ZmKTsgIAo+ID4KPiA+U2FtZSBoZXJlLCBp ZiB5b3UgaGFuZGxlIGRpZmZlcmVudCBjaGlwcywgdGhleSBtYXkgdXNlIGRpZmZlcmVudCBFQ0MK PiA+Y29uZmlndXJhdGlvbnMsIHRoaXMgc2hvdWxkIGJlIGhhbmRsZWQuCj4gPiAgCj4gPj4gKwo+ ID4+ICsJcmV0dXJuIDA7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyB2b2lkIHJrX25mY194 ZmVyX3N0YXJ0KHN0cnVjdCBya19uZmMgKm5mYywgdTggcncsIHU4IG5fS0IsCj4gPj4gKwnCoMKg wqDCoMKgIGRtYV9hZGRyX3QgZG1hX2RhdGEsIGRtYV9hZGRyX3QgZG1hX29vYikKPiA+PiArewo+ ID4+ICsJdTMyIGRtYV9yZWcsIGZsX3JlZywgYmNoX3JlZzsKPiA+PiArCj4gPj4gKwlkbWFfcmVn ID0gRE1BX1NUIHwgKCghcncpIDw8IERNQV9XUikgfCBETUFfRU4gfCAoMiA8PCBETUFfQUhCX1NJ WkUpIHwKPiA+PiArCcKgwqDCoMKgwqAgKDcgPDwgRE1BX0JVUlNUX1NJWkUpIHwgKDE2IDw8IERN QV9JTkNfTlVNKTsKPiA+PiArCj4gPj4gKwlmbF9yZWcgPSAocncgPDwgRkxDVExfV1IpIHwgRkxD VExfWEZFUl9FTiB8IEZMQ1RMX0FDT1JSRUNUIHwKPiA+PiArCShuX0tCIDw8IEZMQ1RMX1hGRVJf U0VDVE9SKSB8IEZMQ1RMX1RPR19GSVg7Cj4gPj4gKwo+ID4+ICsJaWYgKG5mYy0+Y2ZnLT50eXBl ID09IE5GQ19WNiB8fCBuZmMtPmNmZy0+dHlwZSA9PSBORkNfVjgpIHsKPiA+PiArCWJjaF9yZWcg PSByZWFkbF9yZWxheGVkKG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5iY2hjdGxfb2ZmKTsKPiA+PiAr CWJjaF9yZWcgPSAoYmNoX3JlZyAmICh+QkNIQ1RMX0JBTktfTSkpIHwKPiA+PiArCcKgIChuZmMt PnNlbGVjdGVkX2JhbmsgPDwgQkNIQ1RMX0JBTkspOwo+ID4+ICsJd3JpdGVsKGJjaF9yZWcsIG5m Yy0+cmVncyArIG5mYy0+Y2ZnLT5iY2hjdGxfb2ZmKTsKPiA+PiArCX0KPiA+PiArCj4gPj4gKwl3 cml0ZWwoZG1hX3JlZywgbmZjLT5yZWdzICsgbmZjLT5jZmctPmRtYV9jZmdfb2ZmKTsKPiA+PiAr CXdyaXRlbCgodTMyKWRtYV9kYXRhLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ZG1hX2RhdGFfYnVm X29mZik7Cj4gPj4gKwl3cml0ZWwoKHUzMilkbWFfb29iLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ ZG1hX29vYl9idWZfb2ZmKTsKPiA+PiArCXdyaXRlbChmbF9yZWcsIG5mYy0+cmVncyArIG5mYy0+ Y2ZnLT5mbGN0bF9vZmYpOwo+ID4+ICsJZmxfcmVnIHw9IEZMQ1RMX1hGRVJfU1Q7Cj4gPj4gKwl3 cml0ZWwoZmxfcmVnLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ZmxjdGxfb2ZmKTsKPiA+PiArfQo+ ID4+ICsKPiA+PiArc3RhdGljIGludCBya19uZmNfd2FpdF9mb3JfeGZlcl9kb25lKHN0cnVjdCBy a19uZmMgKm5mYykKPiA+PiArewo+ID4+ICsJdm9pZCBfX2lvbWVtICpwdHI7Cj4gPj4gKwlpbnQg cmV0ID0gMDsKPiA+PiArCXUzMiByZWc7Cj4gPj4gKwo+ID4+ICsJcHRyID0gbmZjLT5yZWdzICsg bmZjLT5jZmctPmZsY3RsX29mZjsKPiA+PiArCj4gPj4gKwlyZXQgPSByZWFkbF9yZWxheGVkX3Bv bGxfdGltZW91dChwdHIsIHJlZywKPiA+PiArCXJlZyAmIEZMQ1RMX1hGRVJfUkVBRFksCj4gPj4g KwkxMCwgTkZDX1RJTUVPVVQpOwo+ID4+ICsKPiA+PiArCXJldHVybiByZXQ7Cj4gPj4gK30KPiA+ PiArCj4gPj4gK3N0YXRpYyBpbnQgcmtfbmZjX3dyaXRlX3BhZ2VfcmF3KHN0cnVjdCBuYW5kX2No aXAgKmNoaXAsIGNvbnN0IHU4ICpidWYsCj4gPj4gKwlpbnQgb29iX29uLCBpbnQgcGFnZSkKPiA+ PiArewo+ID4+ICsJc3RydWN0IG10ZF9pbmZvICptdGQgPSBuYW5kX3RvX210ZChjaGlwKTsKPiA+ PiArCXN0cnVjdCBya19uZmMgKm5mYyA9IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShjaGlwKTsK PiA+PiArCXN0cnVjdCBuYW5kX2VjY19jdHJsICplY2MgPSAmY2hpcC0+ZWNjOwo+ID4+ICsJaW50 IHJldCA9IDA7Cj4gPj4gKwl1MzIgaTsKPiA+PiArCj4gPj4gKwlpZiAoIWJ1ZikKPiA+PiArCW1l bXNldChuZmMtPmJ1ZmZlciwgMHhmZiwgbXRkLT53cml0ZXNpemUgKyBtdGQtPm9vYnNpemUpOwo+ ID4+ICsKPiA+PiArCWZvciAoaSA9IDA7IGkgPCBlY2MtPnN0ZXBzOyBpKyspIHsKPiA+PiArCS8q IENvcHkgZGF0YSB0byBuZmMgYnVmZmVyLiAqLwo+ID4+ICsJaWYgKGJ1ZikKPiA+PiArCW1lbWNw eShya19uZmNfZGF0YV9wdHIoY2hpcCwgaSksCj4gPj4gKwnCoMKgwqDCoMKgwqAgcmtfbmZjX2J1 Zl90b19kYXRhX3B0cihjaGlwLCBidWYsIGkpLAo+ID4+ICsJwqDCoMKgwqDCoMKgIGVjYy0+c2l6 ZSk7Cj4gPj4gKwkvKgo+ID4+ICsJKiBUaGUgZmlyc3QgZm91ciBieXRlcyBvZiBPT0IgYXJlIHJl c2VydmVkIGZvciB0aGUKPiA+PiArCSogYm9vdCBST00uIEluIHNvbWUgZGVidWdnaW5nIGNhc2Vz LCBzdWNoIGFzIHdpdGggYQo+ID4+ICsJKiByZWFkLCBlcmFzZSBhbmQgd3JpdGUgYmFjayB0ZXN0 IHRoZXNlIDQgYnl0ZXMgc3RvcmVkCj4gPj4gKwkqIGluIE9PQiBhbHNvIG5lZWQgdG8gYmUgd3Jp dHRlbiBiYWNrLgo+ID4+ICsJKi8gIAo+ID4KPiA+VGhlIGNvbnRyb2xsZXIgZHJpdmVyIHNob3Vs ZCBub3QgYXJiaXRyYXRlIHRoaXMuIElmIHlvdSBkb24ndCB3YW50IHRvCj4gPmV4cG9zZSB0aGVz ZSBieXRlcywgdGhleSBzaG91bGQgbm90IGFwcGVhciAiZnJlZSIgaW4gdGhlIE9PQiBsYXlvdXQs Cj4gPmJ1dCBhIHJhdyBhY2Nlc3MgKm11c3QqIGJ1dCBhYmxlIHRvIGFkZHJlc3MgdGhlIGVudGly ZSBwYWdlL29vYi4gIAo+IAo+IEkgZG9uJ3QgaGF2ZSBhIHNvbHV0aW9uIHRvIGZpeCBpdC4KPiBU aGUgZnVuY3Rpb27CoG5hbmRfYmxvY2tfYmFkIGRldGVjdCBiYWQgYmxvY2sgbGlrZSBpdDoKPiDC oCDCoMKgYmFkID0gY2hpcC0+b29iX3BvaVtjaGlwLT5iYWRibG9ja3Bvc107IC8vY2hpcC0+YmFk YmxvY2twb3MgPSAwIGZvciBsYXJnZSBwYWdlIE5BTkQgRmxhc2guCj4gU2/CoGNoaXAtPm9vYl9w b2lbMF0gaXMgYmFkIG1hc2tlci4KPiAKPiBUaGUgb29iIGRhdGEgbGF5b3V0IGZvciByayBuZmMg aXM6Cj4gwqBQQTAgUEExIFBBMiBQQTMgfCBCQk0gT09CMSBPT0IyIE9PQjMgfCAuLi4KPiBvcgo+ IMKgMHhGRiAweEZGIDB4RkYgMHhGRiB8IEJCTSBPT0IxIE9PQjIgT09CMyB8IC4uLgo+IAo+IFRo ZSBjb2RlIGhlcmUganVzdCB0byBzd2FwIHRoZSBmaXJzdCA0IGJ5dGVzIHdpdGggdGhlIGxhc3Qg NCBieXRlcyBhbmQgd2l0aG91dCBkcm9wZWQgYW55IMKgZGF0YS4KPiBhbmQgdGhlIGNoaXAtPm9v Yl9wb2kgZGF0YSBsYXlvdXQ6Cj4gQkJNIE9PQjEgT09CMiBPT0IzfC4uLi4uLnzCoFBBMCBQQTEg UEEyIFBBM8KgCj4gCj4gVGhlIE9PQiBsYXlvdXQgZnJlZSBhbHJlYWR5IHJlc2VydmVkIHRoaXMg NCBieXRlczoKPiBvb2JfcmVnaW9uLT5vZmZzZXQgPSBORkNfU1lTX0RBVEFfU0laRSArIDI7Cj4g Cj4gPj4gKwlpZiAoIWkpCj4gPj4gKwltZW1jcHkocmtfbmZjX29vYl9wdHIoY2hpcCwgaSksCj4g Pj4gKwnCoMKgwqDCoMKgwqAgcmtfbmZjX2J1Zl90b19vb2JfcHRyKGNoaXAsIGVjYy0+c3RlcHMg LSAxKSwKPiA+PiArCcKgwqDCoMKgwqDCoCBORkNfU1lTX0RBVEFfU0laRSk7Cj4gPj4gKwllbHNl Cj4gPj4gKwltZW1jcHkocmtfbmZjX29vYl9wdHIoY2hpcCwgaSksCj4gPj4gKwnCoMKgwqDCoMKg wqAgcmtfbmZjX2J1Zl90b19vb2JfcHRyKGNoaXAsIGkgLSAxKSwKPiA+PiArCcKgwqDCoMKgwqDC oCBORkNfU1lTX0RBVEFfU0laRSk7Cj4gPj4gKwkvKiBDb3B5IEVDQyBkYXRhIHRvIHRoZSBORkMg YnVmZmVyLiAqLwo+ID4+ICsJbWVtY3B5KHJrX25mY19vb2JfcHRyKGNoaXAsIGkpICsgTkZDX1NZ U19EQVRBX1NJWkUsCj4gPj4gKwnCoMKgwqDCoMKgwqAgcmtfbmZjX2J1Zl90b19vb2JfZWNjX3B0 cihjaGlwLCBpKSwKPiA+PiArCcKgwqDCoMKgwqDCoCBlY2MtPmJ5dGVzKTsKPiA+PiArCX0KPiA+ PiArCj4gPj4gKwluYW5kX3Byb2dfcGFnZV9iZWdpbl9vcChjaGlwLCBwYWdlLCAwLCBOVUxMLCAw KTsKPiA+PiArCXJrX25mY193cml0ZV9idWYobmZjLCBidWYsIG10ZC0+d3JpdGVzaXplICsgbXRk LT5vb2JzaXplKTsKPiA+PiArCXJldCA9IG5hbmRfcHJvZ19wYWdlX2VuZF9vcChjaGlwKTsKPiA+ PiArCj4gPj4gKwkvKgo+ID4+ICsJKiBEZXNlbGVjdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRh cmdldCBhZnRlciB0aGUgb3BzIGlzIGRvbmUKPiA+PiArCSogdG8gcmVkdWNlIHRoZSBwb3dlciBj b25zdW1wdGlvbi4KPiA+PiArCSovCj4gPj4gKwlya19uZmNfc2VsZWN0X2NoaXAoY2hpcCwgLTEp Owo+ID4+ICsKPiA+PiArCXJldHVybiByZXQ7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyBp bnQgcmtfbmZjX3dyaXRlX29vYihzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQgcGFnZSkKPiA+ PiArewo+ID4+ICsJcmV0dXJuIHJrX25mY193cml0ZV9wYWdlX3JhdyhjaGlwLCBOVUxMLCAxLCBw YWdlKTsgIAo+ID4KPiA+Tm90IHN1cmUgdGhpcyBpcyByZWxldmFudC4gWW91IHNob3VsZCBub3Qg ZG8gdGhhdCwgSSBndWVzcyB0aGUgY29yZQo+ID53aWxsIGF1dG9tYXRpY2FsbHkgdGFrZSBjYXJl IG9mIGl0Lgo+ID4gIAo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgaW50IHJrX25mY193cml0 ZV9wYWdlX2h3ZWNjKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIGNvbnN0IHU4ICpidWYsCj4gPj4g KwnCoMKgIGludCBvb2Jfb24sIGludCBwYWdlKQo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgbXRkX2lu Zm8gKm10ZCA9IG5hbmRfdG9fbXRkKGNoaXApOwo+ID4+ICsJc3RydWN0IHJrX25mYyAqbmZjID0g bmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ID4+ICsJc3RydWN0IHJrX25mY19uYW5k X2NoaXAgKnJrbmFuZCA9IHJrX25mY190b19ya25hbmQoY2hpcCk7Cj4gPj4gKwlzdHJ1Y3QgbmFu ZF9lY2NfY3RybCAqZWNjID0gJmNoaXAtPmVjYzsKPiA+PiArCWludCBvb2Jfc3RlcCA9IChlY2Mt PmJ5dGVzID4gNjApID8gTkZDX01BWF9PT0JfUEVSX1NURVAgOgo+ID4+ICsJTkZDX01JTl9PT0Jf UEVSX1NURVA7Cj4gPj4gKwlpbnQgcGFnZXNfcGVyX2JsayA9IG10ZC0+ZXJhc2VzaXplIC8gbXRk LT53cml0ZXNpemU7Cj4gPj4gKwlpbnQgcmV0ID0gMCwgaSwgYm9vdF9yb21fbW9kZSA9IDA7Cj4g Pj4gKwlkbWFfYWRkcl90IGRtYV9kYXRhLCBkbWFfb29iOwo+ID4+ICsJdTMyIHJlZzsKPiA+PiAr CXU4ICpvb2I7Cj4gPj4gKwo+ID4+ICsJbmFuZF9wcm9nX3BhZ2VfYmVnaW5fb3AoY2hpcCwgcGFn ZSwgMCwgTlVMTCwgMCk7Cj4gPj4gKwo+ID4+ICsJbWVtY3B5KG5mYy0+cGFnZV9idWYsIGJ1Ziwg bXRkLT53cml0ZXNpemUpOwo+ID4+ICsKPiA+PiArCS8qCj4gPj4gKwkqIFRoZSBmaXJzdCBibG9j a3MgKDQsIDggb3IgMTYgZGVwZW5kaW5nIG9uIHRoZSBkZXZpY2UpIGFyZSB1c2VkCj4gPj4gKwkq IGJ5IHRoZSBib290IFJPTSBhbmQgdGhlIGZpcnN0IDMyIGJpdHMgb2YgT09CIG5lZWQgdG8gbGlu ayB0bwo+ID4+ICsJKiB0aGUgbmV4dCBwYWdlIGFkZHJlc3MgaW4gdGhlIHNhbWUgYmxvY2suIFdl IGNhbid0IGRpcmVjdGx5IGNvcHkKPiA+PiArCSogT09CIGRhdGEgZnJvbSB0aGUgTVREIGZyYW1l d29yaywgYmVjYXVzZSB0aGlzIHBhZ2UgYWRkcmVzcwo+ID4+ICsJKiBjb25mbGljdHMgZm9yIGV4 YW1wbGUgd2l0aCB0aGUgYmFkIGJsb2NrIG1hcmtlciAoQkJNKSwKPiA+PiArCSogc28gd2Ugc2hp ZnQgYWxsIE9PQiBkYXRhIGluY2x1ZGluZyB0aGUgQkJNIHdpdGggNCBieXRlIHBvc2l0aW9ucy4K PiA+PiArCSogQXMgYSBjb25zZXF1ZW5jZSB0aGUgT09CIHNpemUgYXZhaWxhYmxlIHRvIHRoZSBN VEQgZnJhbWV3b3JrIGlzCj4gPj4gKwkqIGFsc28gcmVkdWNlZCB3aXRoIDQgYnl0ZXMuCj4gPj4g KwkqCj4gPj4gKwkqwqDCoMKgIFBBMCBQQTEgUEEyIFBBMyB8IEJCTSBPT0IxIE9PQjIgT09CMyB8 IC4uLgo+ID4+ICsJKgo+ID4+ICsJKiBJZiBhIE5BTkQgaXMgbm90IGEgYm9vdCBtZWRpdW0gb3Ig dGhlIHBhZ2UgaXMgbm90IGEgYm9vdCBibG9jaywKPiA+PiArCSogdGhlIGZpcnN0IDQgYnl0ZXMg YXJlIGxlZnQgdW50b3VjaGVkIGJ5IHdyaXRpbmcgMHhGRiB0byB0aGVtLgo+ID4+ICsJKgo+ID4+ ICsJKsKgwqAgMHhGRiAweEZGIDB4RkYgMHhGRiB8IEJCTSBPT0IxIE9PQjIgT09CMyB8IC4uLgo+ ID4+ICsJKgo+ID4+ICsJKiBDb25maWd1cmUgdGhlIEVDQyBhbGdvcml0aG0gc3VwcG9ydGVkIGJ5 IHRoZSBib290IFJPTS4KPiA+PiArCSovCj4gPj4gKwlpZiAoKHBhZ2UgPCBwYWdlc19wZXJfYmxr ICogcmtuYW5kLT5ib290X2Jsa3MpICYmCj4gPj4gKwnCoMKgwqAgKGNoaXAtPm9wdGlvbnMgJiBO QU5EX0lTX0JPT1RfTUVESVVNKSkgewo+ID4+ICsJYm9vdF9yb21fbW9kZSA9IDE7Cj4gPj4gKwlp ZiAocmtuYW5kLT5ib290X2VjYyAhPSBlY2MtPnN0cmVuZ3RoKQo+ID4+ICsJcmtfbmZjX2h3X2Vj Y19zZXR1cChjaGlwLCBlY2MsCj4gPj4gKwnCoMKgwqAgcmtuYW5kLT5ib290X2VjYyk7Cj4gPj4g Kwl9Cj4gPj4gKwo+ID4+ICsJZm9yIChpID0gMDsgaSA8IGVjYy0+c3RlcHM7IGkrKykgewo+ID4+ ICsJaWYgKCFpKSB7Cj4gPj4gKwlyZWcgPSAweEZGRkZGRkZGOwo+ID4+ICsJfSBlbHNlIHsKPiA+ PiArCW9vYiA9IGNoaXAtPm9vYl9wb2kgKyAoaSAtIDEpICogTkZDX1NZU19EQVRBX1NJWkU7Cj4g Pj4gKwlyZWcgPSBvb2JbMF0gfCBvb2JbMV0gPDwgOCB8IG9vYlsyXSA8PCAxNiB8Cj4gPj4gKwnC oMKgwqDCoMKgIG9vYlszXSA8PCAyNDsKPiA+PiArCX0KPiA+PiArCWlmICghaSAmJiBib290X3Jv bV9tb2RlKQo+ID4+ICsJcmVnID0gKHBhZ2UgJiAocGFnZXNfcGVyX2JsayAtIDEpKSAqIDQ7Cj4g Pj4gKwo+ID4+ICsJaWYgKG5mYy0+Y2ZnLT50eXBlID09IE5GQ19WOSkKPiA+PiArCW5mYy0+b29i X2J1ZltpXSA9IHJlZzsKPiA+PiArCWVsc2UKPiA+PiArCW5mYy0+b29iX2J1ZltpICogKG9vYl9z dGVwIC8gNCldID0gcmVnOwo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCWRtYV9kYXRhID0gZG1hX21h cF9zaW5nbGUobmZjLT5kZXYsICh2b2lkICopbmZjLT5wYWdlX2J1ZiwKPiA+PiArCcKgIG10ZC0+ d3JpdGVzaXplLCBETUFfVE9fREVWSUNFKTsKPiA+PiArCWRtYV9vb2IgPSBkbWFfbWFwX3Npbmds ZShuZmMtPmRldiwgbmZjLT5vb2JfYnVmLAo+ID4+ICsJZWNjLT5zdGVwcyAqIG9vYl9zdGVwLAo+ ID4+ICsJRE1BX1RPX0RFVklDRSk7Cj4gPj4gKwo+ID4+ICsJcmVpbml0X2NvbXBsZXRpb24oJm5m Yy0+ZG9uZSk7Cj4gPj4gKwl3cml0ZWwoSU5UX0RNQSwgbmZjLT5yZWdzICsgbmZjLT5jZmctPmlu dF9lbl9vZmYpOwo+ID4+ICsKPiA+PiArCXJrX25mY194ZmVyX3N0YXJ0KG5mYywgTkZDX1dSSVRF LCBlY2MtPnN0ZXBzLCBkbWFfZGF0YSwKPiA+PiArCcKgIGRtYV9vb2IpOwo+ID4+ICsJcmV0ID0g d2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZuZmMtPmRvbmUsCj4gPj4gKwnCoCBtc2Vjc190 b19qaWZmaWVzKDEwMCkpOwo+ID4+ICsJaWYgKCFyZXQpCj4gPj4gKwlkZXZfd2FybihuZmMtPmRl diwgIndyaXRlOiB3YWl0IGRtYSBkb25lIHRpbWVvdXQuXG4iKTsKPiA+PiArCS8qCj4gPj4gKwkq IFdoZXRoZXIgdGhlIERNQSB0cmFuc2ZlciBpcyBjb21wbGV0ZWQgb3Igbm90LiBUaGUgZHJpdmVy Cj4gPj4gKwkqIG5lZWRzIHRvIGNoZWNrIHRoZSBORkNgcyBzdGF0dXMgcmVnaXN0ZXIgdG8gc2Vl IGlmIHRoZSBkYXRhCj4gPj4gKwkqIHRyYW5zZmVyIHdhcyBjb21wbGV0ZWQuCj4gPj4gKwkqLwo+ ID4+ICsJcmV0ID0gcmtfbmZjX3dhaXRfZm9yX3hmZXJfZG9uZShuZmMpOwo+ID4+ICsKPiA+PiAr CWRtYV91bm1hcF9zaW5nbGUobmZjLT5kZXYsIGRtYV9kYXRhLCBtdGQtPndyaXRlc2l6ZSwKPiA+ PiArCURNQV9UT19ERVZJQ0UpOwo+ID4+ICsJZG1hX3VubWFwX3NpbmdsZShuZmMtPmRldiwgZG1h X29vYiwgZWNjLT5zdGVwcyAqIG9vYl9zdGVwLAo+ID4+ICsJRE1BX1RPX0RFVklDRSk7Cj4gPj4g Kwo+ID4+ICsJaWYgKGJvb3Rfcm9tX21vZGUgJiYgcmtuYW5kLT5ib290X2VjYyAhPSBlY2MtPnN0 cmVuZ3RoKQo+ID4+ICsJcmtfbmZjX2h3X2VjY19zZXR1cChjaGlwLCBlY2MsIGVjYy0+c3RyZW5n dGgpOwo+ID4+ICsKPiA+PiArCWlmIChyZXQpIHsKPiA+PiArCXJldCA9IC1FSU87Cj4gPj4gKwlk ZXZfZXJyKG5mYy0+ZGV2LAo+ID4+ICsJIndyaXRlOiB3YWl0IHRyYW5zZmVyIGRvbmUgdGltZW91 dC5cbiIpOwo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCWlmIChyZXQpCj4gPj4gKwlyZXR1cm4gcmV0 Owo+ID4+ICsKPiA+PiArCXJldCA9IG5hbmRfcHJvZ19wYWdlX2VuZF9vcChjaGlwKTsKPiA+PiAr Cj4gPj4gKwkvKgo+ID4+ICsJKiBEZXNlbGVjdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRhcmdl dCBhZnRlciB0aGUgb3BzIGlzIGRvbmUKPiA+PiArCSogdG8gcmVkdWNlIHRoZSBwb3dlciBjb25z dW1wdGlvbi4KPiA+PiArCSovICAKPiA+Cj4gPklmIHlvdSBmb3JjZSB0aGlzIGRlc2VsZWN0aW9u LCB5b3VyIHNob3VsZCBwcm9iYWJseSBkbyBpdCBldmVuIGluIGNhc2UKPiA+b2YgZXJyb3I/Cj4g PiAgCj4gPj4gKwlya19uZmNfc2VsZWN0X2NoaXAoY2hpcCwgLTEpOwo+ID4+ICsKPiA+PiArCXJl dHVybiByZXQ7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyBpbnQgcmtfbmZjX3JlYWRfcGFn ZV9yYXcoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgdTggKmJ1ZiwgaW50IG9vYl9vbiwKPiA+PiAr CWludCBwYWdlKQo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9f bXRkKGNoaXApOwo+ID4+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxl cl9kYXRhKGNoaXApOwo+ID4+ICsJc3RydWN0IG5hbmRfZWNjX2N0cmwgKmVjYyA9ICZjaGlwLT5l Y2M7Cj4gPj4gKwlpbnQgaTsKPiA+PiArCj4gPj4gKwluYW5kX3JlYWRfcGFnZV9vcChjaGlwLCBw YWdlLCAwLCBOVUxMLCAwKTsKPiA+PiArCXJrX25mY19yZWFkX2J1ZihuZmMsIG5mYy0+YnVmZmVy LCBtdGQtPndyaXRlc2l6ZSArIG10ZC0+b29ic2l6ZSk7Cj4gPj4gKwo+ID4+ICsJLyoKPiA+PiAr CSogRGVzZWxlY3QgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0YXJnZXQgYWZ0ZXIgdGhlIG9wcyBp cyBkb25lCj4gPj4gKwkqIHRvIHJlZHVjZSB0aGUgcG93ZXIgY29uc3VtcHRpb24uCj4gPj4gKwkq Lwo+ID4+ICsJcmtfbmZjX3NlbGVjdF9jaGlwKGNoaXAsIC0xKTsKPiA+PiArCj4gPj4gKwlmb3Ig KGkgPSAwOyBpIDwgZWNjLT5zdGVwczsgaSsrKSB7Cj4gPj4gKwkvKgo+ID4+ICsJKiBUaGUgZmly c3QgZm91ciBieXRlcyBvZiBPT0IgYXJlIHJlc2VydmVkIGZvciB0aGUKPiA+PiArCSogYm9vdCBS T00uIEluIHNvbWUgZGVidWdnaW5nIGNhc2VzLCBzdWNoIGFzIHdpdGggYSByZWFkLAo+ID4+ICsJ KiBlcmFzZSBhbmQgd3JpdGUgYmFjayB0ZXN0LCB0aGVzZSA0IGJ5dGVzIGFsc28gbXVzdCBiZQo+ ID4+ICsJKiBzYXZlZCBzb21ld2hlcmUsIG90aGVyd2lzZSB0aGlzIGluZm9ybWF0aW9uIHdpbGwg YmUKPiA+PiArCSogbG9zdCBkdXJpbmcgYSB3cml0ZSBiYWNrLiAgCj4gPgo+ID5EaXR0bwo+ID4g IAo+ID4+ICsJKi8KPiA+PiArCWlmICghaSkKPiA+PiArCW1lbWNweShya19uZmNfYnVmX3RvX29v Yl9wdHIoY2hpcCwgZWNjLT5zdGVwcyAtIDEpLAo+ID4+ICsJwqDCoMKgwqDCoMKgIHJrX25mY19v b2JfcHRyKGNoaXAsIGkpLAo+ID4+ICsJwqDCoMKgwqDCoMKgIE5GQ19TWVNfREFUQV9TSVpFKTsK PiA+PiArCWVsc2UKPiA+PiArCW1lbWNweShya19uZmNfYnVmX3RvX29vYl9wdHIoY2hpcCwgaSAt IDEpLAo+ID4+ICsJwqDCoMKgwqDCoMKgIHJrX25mY19vb2JfcHRyKGNoaXAsIGkpLAo+ID4+ICsJ wqDCoMKgwqDCoMKgIE5GQ19TWVNfREFUQV9TSVpFKTsKPiA+PiArCS8qIENvcHkgRUNDIGRhdGEg ZnJvbSB0aGUgTkZDIGJ1ZmZlci4gKi8KPiA+PiArCW1lbWNweShya19uZmNfYnVmX3RvX29vYl9l Y2NfcHRyKGNoaXAsIGkpLAo+ID4+ICsJwqDCoMKgwqDCoMKgIHJrX25mY19vb2JfcHRyKGNoaXAs IGkpICsgTkZDX1NZU19EQVRBX1NJWkUsCj4gPj4gKwnCoMKgwqDCoMKgwqAgZWNjLT5ieXRlcyk7 Cj4gPj4gKwkvKiBDb3B5IGRhdGEgZnJvbSB0aGUgTkZDIGJ1ZmZlci4gKi8KPiA+PiArCWlmIChi dWYpCj4gPj4gKwltZW1jcHkocmtfbmZjX2J1Zl90b19kYXRhX3B0cihjaGlwLCBidWYsIGkpLAo+ ID4+ICsJwqDCoMKgwqDCoMKgIHJrX25mY19kYXRhX3B0cihjaGlwLCBpKSwKPiA+PiArCcKgwqDC oMKgwqDCoCBlY2MtPnNpemUpOwo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCXJldHVybiAwOwo+ID4+ ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgaW50IHJrX25mY19yZWFkX29vYihzdHJ1Y3QgbmFuZF9j aGlwICpjaGlwLCBpbnQgcGFnZSkKPiA+PiArewo+ID4+ICsJcmV0dXJuIHJrX25mY19yZWFkX3Bh Z2VfcmF3KGNoaXAsIE5VTEwsIDEsIHBhZ2UpOyAgCj4gPgo+ID5EaXR0bwo+ID4gIAo+ID4+ICt9 Cj4gPj4gKwo+ID4+ICtzdGF0aWMgaW50IHJrX25mY19yZWFkX3BhZ2VfaHdlY2Moc3RydWN0IG5h bmRfY2hpcCAqY2hpcCwgdTggKmJ1ZiwgaW50IG9vYl9vbiwKPiA+PiArCcKgIGludCBwYWdlKQo+ ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKGNoaXApOwo+ ID4+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXAp Owo+ID4+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZCA9IHJrX25mY190b19ya25h bmQoY2hpcCk7Cj4gPj4gKwlzdHJ1Y3QgbmFuZF9lY2NfY3RybCAqZWNjID0gJmNoaXAtPmVjYzsK PiA+PiArCWludCBvb2Jfc3RlcCA9IChlY2MtPmJ5dGVzID4gNjApID8gTkZDX01BWF9PT0JfUEVS X1NURVAgOgo+ID4+ICsJTkZDX01JTl9PT0JfUEVSX1NURVA7Cj4gPj4gKwlpbnQgcGFnZXNfcGVy X2JsayA9IG10ZC0+ZXJhc2VzaXplIC8gbXRkLT53cml0ZXNpemU7Cj4gPj4gKwlkbWFfYWRkcl90 IGRtYV9kYXRhLCBkbWFfb29iOwo+ID4+ICsJaW50IHJldCA9IDAsIGksIGJvb3Rfcm9tX21vZGUg PSAwOwo+ID4+ICsJaW50IGJpdGZsaXBzID0gMCwgYmNoX3N0Owo+ID4+ICsJdTggKm9vYjsKPiA+ PiArCXUzMiB0bXA7Cj4gPj4gKwo+ID4+ICsJbmFuZF9yZWFkX3BhZ2Vfb3AoY2hpcCwgcGFnZSwg MCwgTlVMTCwgMCk7Cj4gPj4gKwo+ID4+ICsJZG1hX2RhdGEgPSBkbWFfbWFwX3NpbmdsZShuZmMt PmRldiwgbmZjLT5wYWdlX2J1ZiwKPiA+PiArCcKgIG10ZC0+d3JpdGVzaXplLAo+ID4+ICsJwqAg RE1BX0ZST01fREVWSUNFKTsKPiA+PiArCWRtYV9vb2IgPSBkbWFfbWFwX3NpbmdsZShuZmMtPmRl diwgbmZjLT5vb2JfYnVmLAo+ID4+ICsJZWNjLT5zdGVwcyAqIG9vYl9zdGVwLAo+ID4+ICsJRE1B X0ZST01fREVWSUNFKTsKPiA+PiArCj4gPj4gKwkvKgo+ID4+ICsJKiBUaGUgZmlyc3QgYmxvY2tz ICg0LCA4IG9yIDE2IGRlcGVuZGluZyBvbiB0aGUgZGV2aWNlKQo+ID4+ICsJKiBhcmUgdXNlZCBi eSB0aGUgYm9vdCBST00uCj4gPj4gKwkqIENvbmZpZ3VyZSB0aGUgRUNDIGFsZ29yaXRobSBzdXBw b3J0ZWQgYnkgdGhlIGJvb3QgUk9NLgo+ID4+ICsJKi8KPiA+PiArCWlmICgocGFnZSA8IHBhZ2Vz X3Blcl9ibGsgKiBya25hbmQtPmJvb3RfYmxrcykgJiYKPiA+PiArCcKgwqDCoCAoY2hpcC0+b3B0 aW9ucyAmIE5BTkRfSVNfQk9PVF9NRURJVU0pKSB7Cj4gPj4gKwlib290X3JvbV9tb2RlID0gMTsK PiA+PiArCWlmIChya25hbmQtPmJvb3RfZWNjICE9IGVjYy0+c3RyZW5ndGgpCj4gPj4gKwlya19u ZmNfaHdfZWNjX3NldHVwKGNoaXAsIGVjYywKPiA+PiArCcKgwqDCoCBya25hbmQtPmJvb3RfZWNj KTsKPiA+PiArCX0KPiA+PiArCj4gPj4gKwlyZWluaXRfY29tcGxldGlvbigmbmZjLT5kb25lKTsK PiA+PiArCXdyaXRlbChJTlRfRE1BLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+aW50X2VuX29mZik7 Cj4gPj4gKwlya19uZmNfeGZlcl9zdGFydChuZmMsIE5GQ19SRUFELCBlY2MtPnN0ZXBzLCBkbWFf ZGF0YSwKPiA+PiArCcKgIGRtYV9vb2IpOwo+ID4+ICsJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlv bl90aW1lb3V0KCZuZmMtPmRvbmUsCj4gPj4gKwnCoCBtc2Vjc190b19qaWZmaWVzKDEwMCkpOwo+ ID4+ICsJaWYgKCFyZXQpCj4gPj4gKwlkZXZfd2FybihuZmMtPmRldiwgInJlYWQ6IHdhaXQgZG1h IGRvbmUgdGltZW91dC5cbiIpOwo+ID4+ICsJLyoKPiA+PiArCSogV2hldGhlciB0aGUgRE1BIHRy YW5zZmVyIGlzIGNvbXBsZXRlZCBvciBub3QuIFRoZSBkcml2ZXIKPiA+PiArCSogbmVlZHMgdG8g Y2hlY2sgdGhlIE5GQ2BzIHN0YXR1cyByZWdpc3RlciB0byBzZWUgaWYgdGhlIGRhdGEKPiA+PiAr CSogdHJhbnNmZXIgd2FzIGNvbXBsZXRlZC4KPiA+PiArCSovCj4gPj4gKwlyZXQgPSBya19uZmNf d2FpdF9mb3JfeGZlcl9kb25lKG5mYyk7Cj4gPj4gKwlkbWFfdW5tYXBfc2luZ2xlKG5mYy0+ZGV2 LCBkbWFfZGF0YSwgbXRkLT53cml0ZXNpemUsCj4gPj4gKwlETUFfRlJPTV9ERVZJQ0UpOwo+ID4+ ICsJZG1hX3VubWFwX3NpbmdsZShuZmMtPmRldiwgZG1hX29vYiwgZWNjLT5zdGVwcyAqIG9vYl9z dGVwLAo+ID4+ICsJRE1BX0ZST01fREVWSUNFKTsKPiA+PiArCj4gPj4gKwlpZiAocmV0KSB7Cj4g Pj4gKwliaXRmbGlwcyA9IC1FSU87Cj4gPj4gKwlkZXZfZXJyKG5mYy0+ZGV2LAo+ID4+ICsJInJl YWQ6IHdhaXQgdHJhbnNmZXIgZG9uZSB0aW1lb3V0LlxuIik7Cj4gPj4gKwlnb3RvIG91dDsKPiA+ PiArCX0KPiA+PiArCj4gPj4gKwlmb3IgKGkgPSAxOyBpIDwgZWNjLT5zdGVwczsgaSsrKSB7Cj4g Pj4gKwlvb2IgPSBjaGlwLT5vb2JfcG9pICsgKGkgLSAxKSAqIE5GQ19TWVNfREFUQV9TSVpFOwo+ ID4+ICsJaWYgKG5mYy0+Y2ZnLT50eXBlID09IE5GQ19WOSkKPiA+PiArCXRtcCA9IG5mYy0+b29i X2J1ZltpXTsKPiA+PiArCWVsc2UKPiA+PiArCXRtcCA9IG5mYy0+b29iX2J1ZltpICogKG9vYl9z dGVwIC8gNCldOwo+ID4+ICsJKm9vYisrID0gKHU4KXRtcDsKPiA+PiArCSpvb2IrKyA9ICh1OCko dG1wID4+IDgpOwo+ID4+ICsJKm9vYisrID0gKHU4KSh0bXAgPj4gMTYpOwo+ID4+ICsJKm9vYisr ID0gKHU4KSh0bXAgPj4gMjQpOwo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCWZvciAoaSA9IDA7IGkg PCAoZWNjLT5zdGVwcyAvIDIpOyBpKyspIHsKPiA+PiArCWJjaF9zdCA9IHJlYWRsX3JlbGF4ZWQo bmZjLT5yZWdzICsKPiA+PiArCcKgwqDCoMKgwqDCoCBuZmMtPmNmZy0+YmNoX3N0X29mZiArIGkg KiA0KTsKPiA+PiArCWlmIChiY2hfc3QgJiBCSVQobmZjLT5jZmctPmVjYzAuZXJyX2ZsYWdfYml0 KSB8fAo+ID4+ICsJwqDCoMKgIGJjaF9zdCAmIEJJVChuZmMtPmNmZy0+ZWNjMS5lcnJfZmxhZ19i aXQpKSB7Cj4gPj4gKwltdGQtPmVjY19zdGF0cy5mYWlsZWQrKzsKPiA+PiArCWJpdGZsaXBzID0g MDsKPiA+PiArCX0gZWxzZSB7Cj4gPj4gKwlyZXQgPSBFQ0NfRVJSX0NOVChiY2hfc3QsIG5mYy0+ Y2ZnLT5lY2MwKTsKPiA+PiArCW10ZC0+ZWNjX3N0YXRzLmNvcnJlY3RlZCArPSByZXQ7Cj4gPj4g KwliaXRmbGlwcyA9IG1heF90KHUzMiwgYml0ZmxpcHMsIHJldCk7Cj4gPj4gKwo+ID4+ICsJcmV0 ID0gRUNDX0VSUl9DTlQoYmNoX3N0LCBuZmMtPmNmZy0+ZWNjMSk7Cj4gPj4gKwltdGQtPmVjY19z dGF0cy5jb3JyZWN0ZWQgKz0gcmV0Owo+ID4+ICsJYml0ZmxpcHMgPSBtYXhfdCh1MzIsIGJpdGZs aXBzLCByZXQpOwo+ID4+ICsJfQo+ID4+ICsJfQo+ID4+ICtvdXQ6Cj4gPj4gKwltZW1jcHkoYnVm LCBuZmMtPnBhZ2VfYnVmLCBtdGQtPndyaXRlc2l6ZSk7Cj4gPj4gKwo+ID4+ICsJaWYgKGJvb3Rf cm9tX21vZGUgJiYgcmtuYW5kLT5ib290X2VjYyAhPSBlY2MtPnN0cmVuZ3RoKQo+ID4+ICsJcmtf bmZjX2h3X2VjY19zZXR1cChjaGlwLCBlY2MsIGVjYy0+c3RyZW5ndGgpOwo+ID4+ICsKPiA+PiAr CWlmIChiaXRmbGlwcyA+IGVjYy0+c3RyZW5ndGgpCj4gPj4gKwlkZXZfZXJyKG5mYy0+ZGV2LCAi cmVhZCBwYWdlOiAleCBlY2MgZXJyb3IhXG4iLCBwYWdlKTsKPiA+PiArCj4gPj4gKwkvKgo+ID4+ ICsJKiBEZXNlbGVjdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRhcmdldCBhZnRlciB0aGUgb3Bz IGlzIGRvbmUKPiA+PiArCSogdG8gcmVkdWNlIHRoZSBwb3dlciBjb25zdW1wdGlvbi4KPiA+PiAr CSovCj4gPj4gKwlya19uZmNfc2VsZWN0X2NoaXAoY2hpcCwgLTEpOwo+ID4+ICsKPiA+PiArCXJl dHVybiBiaXRmbGlwczsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGlubGluZSB2b2lkIHJr X25mY19od19pbml0KHN0cnVjdCBya19uZmMgKm5mYykKPiA+PiArewo+ID4+ICsJLyogRGlzYWJs ZSBmbGFzaCB3cC4gKi8KPiA+PiArCXdyaXRlbChGTUNUTF9XUCwgbmZjLT5yZWdzICsgTkZDX0ZN Q1RMKTsKPiA+PiArCS8qIENvbmZpZyBkZWZhdWx0IHRpbWluZyA0MG5zIGF0IDE1MCBNaHogbmZj IGNsb2NrLiAqLwo+ID4+ICsJd3JpdGVsKDB4MTA4MSwgbmZjLT5yZWdzICsgTkZDX0ZNV0FJVCk7 Cj4gPj4gKwkvKiBEaXNhYmxlIHJhbmRvbWl6ZXIgYW5kIERNQS4gKi8KPiA+PiArCXdyaXRlbCgw LCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+cmFuZG16X29mZik7Cj4gPj4gKwl3cml0ZWwoMCwgbmZj LT5yZWdzICsgbmZjLT5jZmctPmRtYV9jZmdfb2ZmKTsKPiA+PiArCXdyaXRlbChGTENUTF9SU1Qs IG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5mbGN0bF9vZmYpOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtz dGF0aWMgaXJxcmV0dXJuX3QgcmtfbmZjX2lycShpbnQgaXJxLCB2b2lkICppZCkKPiA+PiArewo+ ID4+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gaWQ7Cj4gPj4gKwl1MzIgc3RhLCBpZW47Cj4gPj4g Kwo+ID4+ICsJc3RhID0gcmVhZGxfcmVsYXhlZChuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+aW50X3N0 X29mZik7Cj4gPj4gKwlpZW4gPSByZWFkbF9yZWxheGVkKG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5p bnRfZW5fb2ZmKTsKPiA+PiArCj4gPj4gKwlpZiAoIShzdGEgJiBpZW4pKQo+ID4+ICsJcmV0dXJu IElSUV9OT05FOwo+ID4+ICsKPiA+PiArCXdyaXRlbChzdGEsIG5mYy0+cmVncyArIG5mYy0+Y2Zn LT5pbnRfY2xyX29mZik7Cj4gPj4gKwl3cml0ZWwofnN0YSAmIGllbiwgbmZjLT5yZWdzICsgbmZj LT5jZmctPmludF9lbl9vZmYpOwo+ID4+ICsKPiA+PiArCWNvbXBsZXRlKCZuZmMtPmRvbmUpOwo+ ID4+ICsKPiA+PiArCXJldHVybiBJUlFfSEFORExFRDsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3Rh dGljIGludCBya19uZmNfZW5hYmxlX2Nsa3Moc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgcmtf bmZjICpuZmMpCj4gPj4gK3sKPiA+PiArCWludCByZXQ7Cj4gPj4gKwo+ID4+ICsJaWYgKCFJU19F UlIobmZjLT5uZmNfY2xrKSkgewo+ID4+ICsJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKG5mYy0+ bmZjX2Nsayk7Cj4gPj4gKwlpZiAocmV0KSB7Cj4gPj4gKwlkZXZfZXJyKGRldiwgImZhaWxlZCB0 byBlbmFibGUgbmZjIGNsa1xuIik7Cj4gPj4gKwlyZXR1cm4gcmV0Owo+ID4+ICsJfQo+ID4+ICsJ fQo+ID4+ICsKPiA+PiArCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShuZmMtPmFoYl9jbGspOwo+ ID4+ICsJaWYgKHJldCkgewo+ID4+ICsJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZW5hYmxlIGFo YiBjbGtcbiIpOwo+ID4+ICsJaWYgKCFJU19FUlIobmZjLT5uZmNfY2xrKSkKPiA+PiArCWNsa19k aXNhYmxlX3VucHJlcGFyZShuZmMtPm5mY19jbGspOwo+ID4+ICsJcmV0dXJuIHJldDsKPiA+PiAr CX0KPiA+PiArCj4gPj4gKwlyZXR1cm4gMDsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIHZv aWQgcmtfbmZjX2Rpc2FibGVfY2xrcyhzdHJ1Y3QgcmtfbmZjICpuZmMpCj4gPj4gK3sKPiA+PiAr CWlmICghSVNfRVJSKG5mYy0+bmZjX2NsaykpCj4gPj4gKwljbGtfZGlzYWJsZV91bnByZXBhcmUo bmZjLT5uZmNfY2xrKTsKPiA+PiArCWNsa19kaXNhYmxlX3VucHJlcGFyZShuZmMtPmFoYl9jbGsp Owo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgaW50IHJrX25mY19vb2JsYXlvdXRfZnJlZShz dHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IHNlY3Rpb24sCj4gPj4gKwlzdHJ1Y3QgbXRkX29vYl9y ZWdpb24gKm9vYl9yZWdpb24pCj4gPj4gK3sKPiA+PiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAg PSBtdGRfdG9fbmFuZChtdGQpOwo+ID4+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFu ZCA9IHJrX25mY190b19ya25hbmQoY2hpcCk7Cj4gPj4gKwo+ID4+ICsJaWYgKHNlY3Rpb24pCj4g Pj4gKwlyZXR1cm4gLUVSQU5HRTsKPiA+PiArCj4gPj4gKwkvKgo+ID4+ICsJKiBUaGUgYmVnaW5u aW5nIG9mIHRoZSBPT0IgYXJlYSBzdG9yZXMgdGhlIHJlc2VydmVkIGRhdGEgZm9yIHRoZSBORkMs Cj4gPj4gKwkqIHRoZSBzaXplIG9mIHRoZSByZXNlcnZlZCBkYXRhIGlzIE5GQ19TWVNfREFUQV9T SVpFIGJ5dGVzLgo+ID4+ICsJKi8KPiA+PiArCW9vYl9yZWdpb24tPmxlbmd0aCA9IHJrbmFuZC0+ bWV0YWRhdGFfc2l6ZSAtIE5GQ19TWVNfREFUQV9TSVpFIC0gMjsKPiA+PiArCW9vYl9yZWdpb24t Pm9mZnNldCA9IE5GQ19TWVNfREFUQV9TSVpFICsgMjsKPiA+PiArCj4gPj4gKwlyZXR1cm4gMDsK PiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGludCBya19uZmNfb29ibGF5b3V0X2VjYyhzdHJ1 Y3QgbXRkX2luZm8gKm10ZCwgaW50IHNlY3Rpb24sCj4gPj4gKwlzdHJ1Y3QgbXRkX29vYl9yZWdp b24gKm9vYl9yZWdpb24pCj4gPj4gK3sKPiA+PiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBt dGRfdG9fbmFuZChtdGQpOwo+ID4+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZCA9 IHJrX25mY190b19ya25hbmQoY2hpcCk7Cj4gPj4gKwo+ID4+ICsJaWYgKHNlY3Rpb24pCj4gPj4g KwlyZXR1cm4gLUVSQU5HRTsKPiA+PiArCj4gPj4gKwlvb2JfcmVnaW9uLT5sZW5ndGggPSBtdGQt Pm9vYnNpemUgLSBya25hbmQtPm1ldGFkYXRhX3NpemU7Cj4gPj4gKwlvb2JfcmVnaW9uLT5vZmZz ZXQgPSBya25hbmQtPm1ldGFkYXRhX3NpemU7Cj4gPj4gKwo+ID4+ICsJcmV0dXJuIDA7Cj4gPj4g K30KPiA+PiArCj4gPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRkX29vYmxheW91dF9vcHMgcmtf bmZjX29vYmxheW91dF9vcHMgPSB7Cj4gPj4gKwkuZnJlZSA9IHJrX25mY19vb2JsYXlvdXRfZnJl ZSwKPiA+PiArCS5lY2MgPSBya19uZmNfb29ibGF5b3V0X2VjYywKPiA+PiArfTsKPiA+PiArCj4g Pj4gK3N0YXRpYyBpbnQgcmtfbmZjX2VjY19pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0 IG10ZF9pbmZvICptdGQpCj4gPj4gK3sKPiA+PiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBt dGRfdG9fbmFuZChtdGQpOwo+ID4+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29u dHJvbGxlcl9kYXRhKGNoaXApOwo+ID4+ICsJc3RydWN0IG5hbmRfZWNjX2N0cmwgKmVjYyA9ICZj aGlwLT5lY2M7Cj4gPj4gKwljb25zdCB1OCAqc3RyZW5ndGhzID0gbmZjLT5jZmctPmVjY19zdHJl bmd0aHM7Cj4gPj4gKwl1OCBtYXhfc3RyZW5ndGgsIG5mY19tYXhfc3RyZW5ndGg7Cj4gPj4gKwlp bnQgaTsKPiA+PiArCj4gPj4gKwluZmNfbWF4X3N0cmVuZ3RoID0gbmZjLT5jZmctPmVjY19zdHJl bmd0aHNbMF07Cj4gPj4gKwkvKiBJZiBvcHRpb25hbCBkdCBzZXR0aW5ncyBub3QgcHJlc2VudC4g Ki8KPiA+PiArCWlmICghZWNjLT5zaXplIHx8ICFlY2MtPnN0cmVuZ3RoIHx8Cj4gPj4gKwnCoMKg wqAgZWNjLT5zdHJlbmd0aCA+IG5mY19tYXhfc3RyZW5ndGgpIHsKPiA+PiArCWNoaXAtPmVjYy5z aXplID0gMTAyNDsKPiA+PiArCWVjYy0+c3RlcHMgPSBtdGQtPndyaXRlc2l6ZSAvIGVjYy0+c2l6 ZTsKPiA+PiArCj4gPj4gKwkvKgo+ID4+ICsJKiBIVyBFQ0MgYWx3YXlzIHJlcXVlc3RzIHRoZSBu dW1iZXIgb2YgRUNDIGJ5dGVzIHBlciAxMDI0IGJ5dGUKPiA+PiArCSogYmxvY2tzLiBUaGUgZmly c3QgNCBPT0IgYnl0ZXMgYXJlIHJlc2VydmVkIGZvciBzeXMgZGF0YS4KPiA+PiArCSovCj4gPj4g KwltYXhfc3RyZW5ndGggPSAoKG10ZC0+b29ic2l6ZSAvIGVjYy0+c3RlcHMpIC0gNCkgKiA4IC8K PiA+PiArCWZscyg4ICogMTAyNCk7Cj4gPj4gKwlpZiAobWF4X3N0cmVuZ3RoID4gbmZjX21heF9z dHJlbmd0aCkKPiA+PiArCW1heF9zdHJlbmd0aCA9IG5mY19tYXhfc3RyZW5ndGg7Cj4gPj4gKwo+ ID4+ICsJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewo+ID4+ICsJaWYgKG1heF9zdHJlbmd0aCA+ PSBzdHJlbmd0aHNbaV0pCj4gPj4gKwlicmVhazsKPiA+PiArCX0KPiA+PiArCj4gPj4gKwlpZiAo aSA+PSA0KSB7Cj4gPj4gKwlkZXZfZXJyKG5mYy0+ZGV2LCAiVW5zdXBwb3J0ZWQgRUNDIHN0cmVu Z3RoXG4iKTsKPiA+PiArCXJldHVybiAtRU9QTk9UU1VQUDsKPiA+PiArCX0KPiA+PiArCj4gPj4g KwllY2MtPnN0cmVuZ3RoID0gc3RyZW5ndGhzW2ldOwo+ID4+ICsJfQo+ID4+ICsJZWNjLT5zdGVw cyA9IG10ZC0+d3JpdGVzaXplIC8gZWNjLT5zaXplOwo+ID4+ICsJZWNjLT5ieXRlcyA9IERJVl9S T1VORF9VUChlY2MtPnN0cmVuZ3RoICogZmxzKDggKiAxMDI0KSwgOCk7ICAKPiA+Cj4gPkhlcmUg eW91IGFzc3VtZSAxMDI0IEVDQyBzdGVwIHNpemUsIHRoaXMgaXMgd3JvbmcuIEVpdGhlciB0aGUK PiA+Y29udHJvbGxlciBvbmx5IHN1cHBvcnRzIDEwMjQgYnl0ZXMgb3IgeW91IG9mZmljaWFsbHkg c3RhdGUgc29tZXdoZXJlCj4gPnRoYXQgeW91IGRvbid0IHN1cHBvcnQgbW9yZSBFQ0Mgc3RlcCBz aXplcyB5ZXQuCj4gPiAgCj4gPj4gKwkvKiBIVyBFQ0MgYWx3YXlzIHdvcmsgd2l0aCBldmVuIG51 bWJlcnMgb2YgRUNDIGJ5dGVzLiAqLwo+ID4+ICsJZWNjLT5ieXRlcyA9IEFMSUdOKGVjYy0+Ynl0 ZXMsIDIpOyAgCj4gPgo+ID5TaG91bGRuJ3QgeW91IGVuc3VyZSB0aGUgbnVtYmVyIG9mIGJ5dGVz IGlzIHJvdW5kZWQgdXAgPyAgCj4gCj4gVGhlIFY2IGFuZMKgVjkgY29udHJvbGxlciBzdXBwb3J0 cyBERFIgbW9kZSwgc28gRUNDIGJ5dGVzIG5lZWQgdG8gYmUgYWxpZ25lZCB0byBhbiBldmVuIG51 bWJlciBpZiBlbmFibGUgRERSIG1vZGUuCj4gVGhpcyBkcml2ZXJzIG5vIHN1cHBvcnQgZGRyIG1v ZGUgbm9377yMSSB3aWxsIGRyb3AgdGhpcyBjb2RlLgo+IAoKSSB0aGluayB5b3VyIGFwcHJvYWNo IGlzIGZpbmUsIEkganVzdCBtaXN1bmRlcnN0b29kIGl0IGJlY2F1c2Ugb2YgdGhlCmNvbW1lbnQu CgpNYXliZSB5b3UgY291bGQ6Ci0gQ3JlYXRlIGEgaGVscGVyIGZvciB0aGF0Ci0gQ29ycmVjdCB0 aGUgY29tbWVudCB0byBjbGVhcmx5IGV4cGxhaW4gd2hhdCB5b3UgZG8gKHlvdXIgZXhwbGFuYXRp b24KICBoZXJlIGlzIHZlcnkgY2xlYXIgdG8gbWUpCi0gSW5jbHVkZSB0aGUgY29tbWVudCBpbiB0 aGUgaGVscGVyLCBub3QgaW4gZWFjaCBmdW5jdGlvbgotIENhbGwgdGhlIGhlbHBlciBpbiBldmVy eSBmdW5jdGlvbiBhY2Nlc3NpbmcgdGhpcyBhcmVhIHVubGVzcyB0aGUKICBibG9jayBpcyByZXNl cnZlZCBmb3IgdGhlIGJvb3Ryb20/CgpUaGFua3MsCk1pcXXDqGwKCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51eCBNVEQgZGlzY3Vzc2lv biBtYWlsaW5nIGxpc3QKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5m by9saW51eC1tdGQvCg== 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=-11.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_2 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 368AAC4363A for ; Fri, 30 Oct 2020 10:27:03 +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 70A9D221EB for ; Fri, 30 Oct 2020 10:27:02 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="K/iTPUIk" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 70A9D221EB Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=bootlin.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-rockchip-bounces+linux-rockchip=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:MIME-Version:References:In-Reply-To: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=teaq4qz2TQ2kr8v+vSy2uW/8E+0VwPTXbmiMH/VDd+8=; b=K/iTPUIkc2qXvVzadtg7EOAOY 9WqXkknkXybbs19oCKqaWithC48kE0Cebgahr5WSXcahIbIlLqXOBGp318v6xcJFa6uBieAa6LohL hbmxGrzMruJxZi2XG5dOuPuADuHP0bPOWw1h2wkWAMsqz8pFOzgCqivcK7JVuTTnO90+tV8J8BhZ4 gFZzNbxVruZpFS9nPSY5TSKIeHp8lWFYmYTOOTQgKPc6d0YfqJGC1w/ss74FSdA0k/RFmsZVbdmHw VZGzlMnASF9l3qxe0QYdZHUXIGHruhqR6EWREWzmpJOC6uJ3QCECW35IknJQP85vHgywO8ks0f/FC iG6gieTFw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kYRcW-0005gU-Am; Fri, 30 Oct 2020 10:26:56 +0000 Received: from relay6-d.mail.gandi.net ([217.70.183.198]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kYRcJ-0005dh-7Q; Fri, 30 Oct 2020 10:26:45 +0000 X-Originating-IP: 91.224.148.103 Received: from xps13 (unknown [91.224.148.103]) (Authenticated sender: miquel.raynal@bootlin.com) by relay6-d.mail.gandi.net (Postfix) with ESMTPSA id DE32AC0014; Fri, 30 Oct 2020 10:26:37 +0000 (UTC) Date: Fri, 30 Oct 2020 11:26:35 +0100 From: Miquel Raynal To: =?UTF-8?B?6LW15Luq5bOw?= Subject: Re: [PATCH v13 2/8] mtd: rawnand: rockchip: NFC drivers for RK3308, RK2928 and others Message-ID: <20201030112635.162bb709@xps13> In-Reply-To: <20201030181152443876127@rock-chips.com> References: <20201028095326.15562-1-yifeng.zhao@rock-chips.com> <20201028095326.15562-3-yifeng.zhao@rock-chips.com> <20201028114826.6cd6b841@xps13> <20201030181152443876127@rock-chips.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.4 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201030_062643_586125_029F1A58 X-CRM114-Status: GOOD ( 33.92 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devicetree , vigneshr , richard , linux-kernel , linux-rockchip , robh+dt , linux-mtd , linux-arm-kernel , =?UTF-8?B?SGVpa29TdMO8Ym5lcg==?= Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org SGkg6LW15Luq5bOwLAoK6LW15Luq5bOwIDx5aWZlbmcuemhhb0Byb2NrLWNoaXBzLmNvbT4gd3Jv dGUgb24gRnJpLCAzMCBPY3QgMjAyMCAxODoxMjo1MgorMDgwMDoKCj4gSGkgTWlxdWVsLAo+IAo+ ID5IaSBZaWZlbmcsCj4gPgo+ID5BIGZldyBtb3JlIGNvbW1lbnRzIGJlbG93LCBidXQgb3ZlcmFs bCBsb29rcyBiZXR0ZXIuCj4gPgo+ID5ZaWZlbmcgWmhhbyA8eWlmZW5nLnpoYW9Acm9jay1jaGlw cy5jb20+IHdyb3RlIG9uIFdlZCwgMjggT2N0IDIwMjAKPiA+MTc6NTM6MjQgKzA4MDA6Cj4gPiAg Cj4gPj4gVGhpcyBkcml2ZXIgc3VwcG9ydHMgUm9ja2NoaXAgTkZDIChOQU5EIEZsYXNoIENvbnRy b2xsZXIpIGZvdW5kIG9uIFJLMzMwOCwKPiA+PiBSSzI5MjgsIFJLUFgzMCwgUlYxMTA4IGFuZCBv dGhlciBTT0NzLiBUaGUgZHJpdmVyIGhhcyBiZWVuIHRlc3RlZCB1c2luZwo+ID4+IDgtYml0IE5B TkQgaW50ZXJmYWNlIG9uIHRoZSBBUk0gYmFzZWQgUkszMzA4IHBsYXRmb3JtLgo+ID4+Cj4gPj4g U3VwcG9ydCBSb2NrY2hpcCBTb0NzIGFuZCBORkMgdmVyc2lvbnM6Cj4gPj4gLSBQWDMwIGFuZCBS SzMzMjYoTkZDdjkwMCkuCj4gPj4gRUNDOiAxNi80MC82MC83MCBiaXRzLzFLQi4KPiA+PiBDTE9D SzogYWhiIGFuZCBuZmMuCj4gPj4gLSBSSzMzMDggYW5kIFJWMTEwOChORkN2ODAwKS4KPiA+PiBF Q0M6IDE2IGJpdHMvMUtCLgo+ID4+IENMT0NLOiBhaGIgYW5kIG5mYy4KPiA+PiAtIFJLMzAzNiBh bmQgUkszMTI4KE5GQ3Y2MjIpLgo+ID4+IEVDQzogMTYvMjQvNDAvNjAgYml0cy8xS0IuCj4gPj4g Q0xPQ0s6IGFoYiBhbmQgbmZjLgo+ID4+IC0gUkszMDY2LCBSSzMxODggYW5kIFJLMjkyOChORkN2 NjAwKS4KPiA+PiBFQ0M6IDE2LzI0LzQwLzYwIGJpdHMvMUtCLgo+ID4+IENMT0NLOiBhaGIuCj4g Pj4KPiA+PiBTdXBwb3J0ZWQgZmVhdHVyZXM6Cj4gPj4gLSBSZWFkIGZ1bGwgcGFnZSBkYXRhIGJ5 IERNQS4KPiA+PiAtIFN1cHBvcnQgSFcgRUNDKG9uZSBzdGVwIGlzIDFLQikuCj4gPj4gLSBTdXBw b3J0IDIgLSAzMksgcGFnZSBzaXplLgo+ID4+IC0gU3VwcG9ydCA4IENTKGRlcGVuZCBvbiBTb0Nz KQo+ID4+Cj4gPj4gTGltaXRhdGlvbnM6Cj4gPj4gLSBObyBzdXBwb3J0IGZvciB0aGUgZWNjIHN0 ZXAgc2l6ZSBpcyA1MTIuCj4gPj4gLSBVbnRlc3RlZCBvbiBzb21lIFNvQ3MuCj4gPj4gLSBObyBz dXBwb3J0IGZvciBzdWJwYWdlcy4KPiA+PiAtIE5vIHN1cHBvcnQgZm9yIHRoZSBidWlsdGluIHJh bmRvbWl6ZXIuCj4gPj4gLSBUaGUgb3JpZ2luYWwgYmFkIGJsb2NrIG1hc2sgaXMgbm90IHN1cHBv cnRlZC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlCj4gPj7CoMKgIHRoZSBCQlQoYmFkIGJsb2Nr IHRhYmxlKS4KPiA+Pgo+ID4+IFNpZ25lZC1vZmYtYnk6IFlpZmVuZyBaaGFvIDx5aWZlbmcuemhh b0Byb2NrLWNoaXBzLmNvbT4KPiA+PiAtLS0KPiA+Pgo+ID4+IENoYW5nZXMgaW4gdjEzOgo+ID4+ IC0gVGhlIG5mYy0+YnVmZmVyIHdpbGwgcmVhbGxvYyB3aGlsZSB0aGUgcGFnZSBzaXplIG9mIHRo ZSBzZWNvbmQgbXRkCj4gPj7CoMKgIGlzIGxhcmdlIHRoYW4gdGhlIGZpcnN0IG9uZS4KPiA+PiAt IEZpeCBjb2Rpbmcgc3R5bGUuCj4gPj4gLSBGaXggc29tZSBjb21tZW50cy4KPiA+Pgo+ID4+IENo YW5nZXMgaW4gdjEyOiBOb25lCj4gPj4gQ2hhbmdlcyBpbiB2MTE6Cj4gPj4gLSBGaXggY29tcGls ZSBlcnJvci4KPiA+Pgo+ID4+IENoYW5nZXMgaW4gdjEwOgo+ID4+IC0gRml4IGNvbXBpbGUgZXJy b3Igb24gbWFzdGVyIHY1LjktcmM3Lgo+ID4+Cj4gPj4gQ2hhbmdlcyBpbiB2OToKPiA+PiAtIFRo ZSBuZmMtPmJ1ZmZlciB3aWxsIHJlYWxsb2Mgd2hpbGUgdGhlIHBhZ2Ugc2l6ZSBvZiB0aGUgc2Vj b25kIG10ZAo+ID4+wqDCoCBpcyBsYXJnZSB0aGFuIHRoZSBmaXJzdCBvbmUKPiA+PiAtIEZpeCBj b2Rpbmcgc3R5bGUuCj4gPj4gLSBSZW1vdmUgc3RydWN0IHJrX25mY19jbGsuCj4gPj4gLSBQcmVw ZW5kIHNvbWUgZnVuY3Rpb24gd2l0aCBya19uZmNfLgo+ID4+IC0gUmVwbGFjZSBmdW5jdGlvbiBy ZWFkbF9wb2xsX3RpbWVvdXRfYXRvbWljIHdpdGggcmVhZGxfcmVsYXhlZF9wb2xsX3RpbWVvdXQu Cj4gPj4gLSBSZW1vdmUgZnVuY3Rpb24gcmtfbmZjX3JlYWRfYnl0ZSBhbmQgcmtfbmZjX3dyaXRl X2J5dGUuCj4gPj4gLSBEb24ndCBzZWxlY3QgdGhlIGRpZSBpZiAnY2hlY2tfb25seSA9PSB0cnVl JyBpbiBmdW5jdGlvbiBya19uZmNfZXhlY19vcC4KPiA+PiAtIE1vZGlmeSBmdW5jdGlvbiBya19u ZmNfd3JpdGVfcGFnZSBhbmQgcmtfbmZjX3dyaXRlX3BhZ2VfcmF3Lgo+ID4+Cj4gPj4gQ2hhbmdl cyBpbiB2ODogTm9uZQo+ID4+IENoYW5nZXMgaW4gdjc6Cj4gPj4gLSBSZWJhc2UgdG8gbGludXgt bmV4dC4KPiA+PiAtIEZpeCBjb2Rpbmcgc3R5bGUuCj4gPj4gLSBSZXNlcnZlZCA0IGJ5dGVzIGF0 IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9vYiBhcmVhLgo+ID4+IC0gUGFnZSByYXcgcmVhZCBhbmQg d3JpdGUgaW5jbHVkZWQgZWNjIGRhdGEuCj4gPj4KPiA+PiBDaGFuZ2VzIGluIHY2Ogo+ID4+IC0g VGhlIG10ZC0+bmFtZSBzZXQgYnkgTkFORCBsYWJlbCBwcm9wZXJ0eS4KPiA+PiAtIEFkZCBzb21l IGNvbW1lbnRzLgo+ID4+IC0gRml4IGNvbXBpbGUgZXJyb3IuCj4gPj4KPiA+PiBDaGFuZ2VzIGlu IHY1Ogo+ID4+IC0gQWRkIGJvb3QgYmxvY2tzIHN1cHBvcnTCoCB3aXRoIGRpZmZlcmVudCBFQ0Mg Zm9yIGJvb3RST00uCj4gPj4gLSBSZW5hbWUgcm9ja2NoaXAtbmFuZC5jIHRvIHJvY2tjaGlwLW5h bmQtY29udHJvbGxlci5jLgo+ID4+IC0gVW5pZmljYXRpb24gb2Ygb3RoZXIgdmFyaWFibGUgbmFt ZXMuCj4gPj4gLSBSZW1vdmUgc29tZSBjb21wYXRpYmxlIGRlZmluZS4KPiA+Pgo+ID4+IENoYW5n ZXMgaW4gdjQ6Cj4gPj4gLSBEZWZpbmUgcGxhdGZvcm0gZGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSBy ZWdpc3RlciBvZmZzZXRzLgo+ID4+IC0gVGhlIGNvbXBhdGlibGUgZGVmaW5lIHdpdGggcmt4eF9u ZmMuCj4gPj4gLSBVc2UgU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMgdG8gZGVmaW5lIFBNX09QUy4K PiA+PiAtIFVzZSBleGVjX29wIGluc3RlYWQgb2YgbGVnYWN5IGhvb2tzLgo+ID4+Cj4gPj4gQ2hh bmdlcyBpbiB2MzogTm9uZQo+ID4+IENoYW5nZXMgaW4gdjI6Cj4gPj4gLSBGaXggY29tcGlsZSBl cnJvci4KPiA+PiAtIEluY2x1ZGUgaGVhZGVyIGZpbGVzIHNvcnRlZCBieSBmaWxlIG5hbWUuCj4g Pj4KPiA+PsKgIGRyaXZlcnMvbXRkL25hbmQvcmF3L0tjb25maWfCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHzCoMKgIDEyICsKPiA+PsKgIGRyaXZlcnMvbXRkL25hbmQvcmF3L01h a2VmaWxlwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDCoCAxICsKPiA+PsKg IC4uLi9tdGQvbmFuZC9yYXcvcm9ja2NoaXAtbmFuZC1jb250cm9sbGVyLmPCoMKgIHwgMTQ2MCAr KysrKysrKysrKysrKysrKwo+ID4+wqAgMyBmaWxlcyBjaGFuZ2VkLCAxNDczIGluc2VydGlvbnMo KykKPiA+PsKgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL210ZC9uYW5kL3Jhdy9yb2NrY2hp cC1uYW5kLWNvbnRyb2xsZXIuYwo+ID4+Cj4gPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25h bmQvcmF3L0tjb25maWcgYi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9LY29uZmlnCj4gPj4gaW5kZXgg NmM0NmYyNWI1N2UyLi4yY2M1MzNlNGUyMzkgMTAwNjQ0Cj4gPj4gLS0tIGEvZHJpdmVycy9tdGQv bmFuZC9yYXcvS2NvbmZpZwo+ID4+ICsrKyBiL2RyaXZlcnMvbXRkL25hbmQvcmF3L0tjb25maWcK PiA+PiBAQCAtNDYyLDYgKzQ2MiwxOCBAQCBjb25maWcgTVREX05BTkRfQVJBU0FOCj4gPj7CoCDC oCBFbmFibGVzIHRoZSBkcml2ZXIgZm9yIHRoZSBBcmFzYW4gTkFORCBmbGFzaCBjb250cm9sbGVy IG9uCj4gPj7CoCDCoCBaeW5xIFVsdHJhc2NhbGUrIE1QU29DLgo+ID4+wqAKPiA+PiArY29uZmln IE1URF9OQU5EX1JPQ0tDSElQCj4gPj4gKwl0cmlzdGF0ZSAiUm9ja2NoaXAgTkFORCBjb250cm9s bGVyIgo+ID4+ICsJZGVwZW5kcyBvbiBBUkNIX1JPQ0tDSElQICYmIEhBU19JT01FTQo+ID4+ICsJ aGVscAo+ID4+ICsJwqAgRW5hYmxlcyBzdXBwb3J0IGZvciBOQU5EIGNvbnRyb2xsZXIgb24gUm9j a2NoaXAgU29Dcy4KPiA+PiArCcKgIFRoZXJlIGFyZSBmb3VyIGRpZmZlcmVudCB2ZXJzaW9ucyBv ZiBOQU5EIEZMQVNIIENvbnRyb2xsZXJzLAo+ID4+ICsJwqAgaW5jbHVkaW5nOgo+ID4+ICsJwqDC oMKgIE5GQyB2NjAwOiBSSzI5MjgsIFJLMzA2NiwgUkszMTg4Cj4gPj4gKwnCoMKgwqAgTkZDIHY2 MjI6IFJLMzAzNiwgUkszMTI4Cj4gPj4gKwnCoMKgwqAgTkZDIHY4MDA6IFJLMzMwOCwgUlYxMTA4 Cj4gPj4gKwnCoMKgwqAgTkZDIHY5MDA6IFBYMzAsIFJLMzMyNgo+ID4+ICsKPiA+PsKgIGNvbW1l bnQgIk1pc2MiCj4gPj7CoAo+ID4+wqAgY29uZmlnIE1URF9TTV9DT01NT04KPiA+PiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9tdGQvbmFuZC9yYXcvTWFrZWZpbGUgYi9kcml2ZXJzL210ZC9uYW5kL3Jh dy9NYWtlZmlsZQo+ID4+IGluZGV4IDI5MzBmNWI5MDE1ZC4uOTYwYzliZTI1MjA0IDEwMDY0NAo+ ID4+IC0tLSBhL2RyaXZlcnMvbXRkL25hbmQvcmF3L01ha2VmaWxlCj4gPj4gKysrIGIvZHJpdmVy cy9tdGQvbmFuZC9yYXcvTWFrZWZpbGUKPiA+PiBAQCAtNTgsNiArNTgsNyBAQCBvYmotJChDT05G SUdfTVREX05BTkRfU1RNMzJfRk1DMikJKz0gc3RtMzJfZm1jMl9uYW5kLm8KPiA+PsKgIG9iai0k KENPTkZJR19NVERfTkFORF9NRVNPTikJKz0gbWVzb25fbmFuZC5vCj4gPj7CoCBvYmotJChDT05G SUdfTVREX05BTkRfQ0FERU5DRSkJKz0gY2FkZW5jZS1uYW5kLWNvbnRyb2xsZXIubwo+ID4+wqAg b2JqLSQoQ09ORklHX01URF9OQU5EX0FSQVNBTikJKz0gYXJhc2FuLW5hbmQtY29udHJvbGxlci5v Cj4gPj4gK29iai0kKENPTkZJR19NVERfTkFORF9ST0NLQ0hJUCkJKz0gcm9ja2NoaXAtbmFuZC1j b250cm9sbGVyLm8KPiA+PsKgCj4gPj7CoCBuYW5kLW9ianMgOj0gbmFuZF9iYXNlLm8gbmFuZF9s ZWdhY3kubyBuYW5kX2JidC5vIG5hbmRfdGltaW5ncy5vIG5hbmRfaWRzLm8KPiA+PsKgIG5hbmQt b2JqcyArPSBuYW5kX29uZmkubwo+ID4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3Jh dy9yb2NrY2hpcC1uYW5kLWNvbnRyb2xsZXIuYyBiL2RyaXZlcnMvbXRkL25hbmQvcmF3L3JvY2tj aGlwLW5hbmQtY29udHJvbGxlci5jCj4gPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+PiBpbmRl eCAwMDAwMDAwMDAwMDAuLjJlOTZmZDMxNDM0Ngo+ID4+IC0tLSAvZGV2L251bGwKPiA+PiArKysg Yi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9yb2NrY2hpcC1uYW5kLWNvbnRyb2xsZXIuYwo+ID4+IEBA IC0wLDAgKzEsMTQ2MCBAQAo+ID4+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIu MCBPUiBNSVQKPiA+PiArLyoKPiA+PiArICogUm9ja2NoaXAgTkFORCBGbGFzaCBjb250cm9sbGVy IGRyaXZlci4KPiA+PiArICogQ29weXJpZ2h0IChDKSAyMDIwIFJvY2tjaGlwIEluYy4KPiA+PiAr ICogQXV0aG9yOiBZaWZlbmcgWmhhbyA8eWlmZW5nLnpoYW9Acm9jay1jaGlwcy5jb20+Cj4gPj4g KyAqLwo+ID4+ICsKPiA+PiArI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgo+ID4+ICsjaW5jbHVkZSA8 bGludXgvZGVsYXkuaD4KPiA+PiArI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Cj4gPj4g KyNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KPiA+PiArI2luY2x1ZGUgPGxpbnV4L2ludGVy cnVwdC5oPgo+ID4+ICsjaW5jbHVkZSA8bGludXgvaW9wb2xsLmg+Cj4gPj4gKyNpbmNsdWRlIDxs aW51eC9tb2R1bGUuaD4KPiA+PiArI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KPiA+PiArI2lu Y2x1ZGUgPGxpbnV4L210ZC9yYXduYW5kLmg+Cj4gPj4gKyNpbmNsdWRlIDxsaW51eC9vZi5oPgo+ ID4+ICsjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Cj4gPj4gKyNpbmNsdWRlIDxsaW51eC9w bGF0Zm9ybV9kZXZpY2UuaD4KPiA+PiArI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KPiA+PiArCj4g Pj4gKy8qCj4gPj4gKyAqIE5GQyBQYWdlIERhdGEgTGF5b3V0Ogo+ID4+ICsgKgkxMDI0IEJ5dGVz IERhdGEgKyA0Qnl0ZXMgc3lzIGRhdGEgKyAyOEJ5dGVzfjEyNEJ5dGVzIGVjYyArCj4gPj4gKyAq CTEwMjQgQnl0ZXMgRGF0YSArIDRCeXRlcyBzeXMgZGF0YSArIDI4Qnl0ZXN+MTI0Qnl0ZXMgZWNj ICsKPiA+PiArICoJLi4uLi4uCj4gPj4gKyAqIE5BTkQgUGFnZSBEYXRhIExheW91dDoKPiA+PiAr ICoJMTAyNCAqIG4gRGF0YSArIG0gQnl0ZXMgb29iCj4gPj4gKyAqIE9yaWdpbmFsIEJhZCBCbG9j ayBNYXNrIExvY2F0aW9uOgo+ID4+ICsgKglGaXJzdCBieXRlIG9mIG9vYihzcGFyZSkuCj4gPj4g KyAqIG5hbmRfY2hpcC0+b29iX3BvaSBkYXRhIGxheW91dDoKPiA+PiArICoJNEJ5dGVzIHN5cyBk YXRhICsgLi4uLiArIDRCeXRlcyBzeXMgZGF0YSArIGVjYyBkYXRhLgo+ID4+ICsgKi8KPiA+PiAr Cj4gPj4gKy8qIE5BTkQgY29udHJvbGxlciByZWdpc3RlciBkZWZpbml0aW9uICovCj4gPj4gKyNk ZWZpbmUgTkZDX1JFQUQJKDApCj4gPj4gKyNkZWZpbmUgTkZDX1dSSVRFCSgxKQo+ID4+ICsKPiA+ PiArI2RlZmluZSBORkNfRk1DVEwJKDB4MDApCj4gPj4gKyNkZWZpbmXCoMKgIEZNQ1RMX0NFX1NF TF9NCTB4RkYKPiA+PiArI2RlZmluZcKgwqAgRk1DVExfQ0VfU0VMKHgpCSgxIDw8ICh4KSkKPiA+ PiArI2RlZmluZcKgwqAgRk1DVExfV1AJQklUKDgpCj4gPj4gKyNkZWZpbmXCoMKgIEZNQ1RMX1JE WQlCSVQoOSkKPiA+PiArCj4gPj4gKyNkZWZpbmUgTkZDX0ZNV0FJVAkoMHgwNCkKPiA+PiArI2Rl ZmluZcKgwqAgRkxDVExfUlNUCUJJVCgwKQo+ID4+ICsjZGVmaW5lwqDCoCBGTENUTF9XUgkoMSkJ LyogMDogcmVhZCwgMTogd3JpdGUgKi8KPiA+PiArI2RlZmluZcKgwqAgRkxDVExfWEZFUl9TVAlC SVQoMikKPiA+PiArI2RlZmluZcKgwqAgRkxDVExfWEZFUl9FTglCSVQoMykKPiA+PiArI2RlZmlu ZcKgwqAgRkxDVExfQUNPUlJFQ1QJQklUKDEwKSAvKiBBdXRvIGNvcnJlY3QgZXJyb3IgYml0cy4g Ki8KPiA+PiArI2RlZmluZcKgwqAgRkxDVExfWEZFUl9SRUFEWQlCSVQoMjApCj4gPj4gKyNkZWZp bmXCoMKgIEZMQ1RMX1hGRVJfU0VDVE9SCSgyMikKPiA+PiArI2RlZmluZcKgwqAgRkxDVExfVE9H X0ZJWAlCSVQoMjkpCj4gPj4gKwo+ID4+ICsjZGVmaW5lwqDCoCBCQ0hDVExfQkFOS19NCSg3IDw8 IDUpCj4gPj4gKyNkZWZpbmXCoMKgIEJDSENUTF9CQU5LCSg1KQo+ID4+ICsKPiA+PiArI2RlZmlu ZcKgwqAgRE1BX1NUCUJJVCgwKQo+ID4+ICsjZGVmaW5lwqDCoCBETUFfV1IJKDEpCS8qIDA6IHdy aXRlLCAxOiByZWFkICovCj4gPj4gKyNkZWZpbmXCoMKgIERNQV9FTglCSVQoMikKPiA+PiArI2Rl ZmluZcKgwqAgRE1BX0FIQl9TSVpFCSgzKQkvKiAwOiAxLCAxOiAyLCAyOiA0ICovCj4gPj4gKyNk ZWZpbmXCoMKgIERNQV9CVVJTVF9TSVpFCSg2KQkvKiAwOiAxLCAzOiA0LCA1OiA4LCA3OiAxNiAq Lwo+ID4+ICsjZGVmaW5lwqDCoCBETUFfSU5DX05VTQkoOSkJLyogMSAtIDE2ICovCj4gPj4gKwo+ ID4+ICsjZGVmaW5lIEVDQ19FUlJfQ05UKHgsIGUpICgoKCh4KSA+PiAoZSkubG93KSAmIChlKS5s b3dfbWFzaykgfFwKPiA+PiArCcKgICgoKHgpID4+IChlKS5oaWdoKSAmIChlKS5oaWdoX21hc2sp IDw8IChlKS5sb3dfYm4pCj4gPj4gKyNkZWZpbmXCoMKgIElOVF9ETUEJQklUKDApCj4gPj4gKyNk ZWZpbmUgTkZDX0JBTksJKDB4ODAwKQo+ID4+ICsjZGVmaW5lIE5GQ19CQU5LX1NURVAJKDB4MTAw KQo+ID4+ICsjZGVmaW5lwqDCoCBCQU5LX0RBVEEJKDB4MDApCj4gPj4gKyNkZWZpbmXCoMKgIEJB TktfQUREUgkoMHgwNCkKPiA+PiArI2RlZmluZcKgwqAgQkFOS19DTUQJKDB4MDgpCj4gPj4gKyNk ZWZpbmUgTkZDX1NSQU0wCSgweDEwMDApCj4gPj4gKyNkZWZpbmUgTkZDX1NSQU0xCSgweDE0MDAp Cj4gPj4gKyNkZWZpbmUgTkZDX1NSQU1fU0laRQkoMHg0MDApCj4gPj4gKyNkZWZpbmUgTkZDX1RJ TUVPVVQJKDUwMDAwMCkKPiA+PiArI2RlZmluZSBORkNfTUFYX09PQl9QRVJfU1RFUAkxMjgKPiA+ PiArI2RlZmluZSBORkNfTUlOX09PQl9QRVJfU1RFUAk2NAo+ID4+ICsjZGVmaW5lIE1BWF9EQVRB X1NJWkUJMHhGRkZDCj4gPj4gKyNkZWZpbmUgTUFYX0FERFJFU1NfQ1lDCTYKPiA+PiArI2RlZmlu ZSBORkNfRUNDX01BWF9NT0RFUwk0Cj4gPj4gKyNkZWZpbmUgTkZDX01BWF9OU0VMUwkoOCkgLyog U29tZSBTb2NzIG9ubHkgaGF2ZSAxIG9yIDIgQ1NzLiAqLwo+ID4+ICsjZGVmaW5lIE5GQ19TWVNf REFUQV9TSVpFCSg0KSAvKiA0IGJ5dGVzIHN5cyBkYXRhIGluIG9vYiBwcmUgMTAyNCBkYXRhLiov Cj4gPj4gKyNkZWZpbmUgUktfREVGQVVMVF9DTE9DS19SQVRFCSgxNTAgKiAxMDAwICogMTAwMCkg LyogMTUwIE1oeiAqLwo+ID4+ICsjZGVmaW5lIEFDQ1RJTUlORyhjc3J3LCByd3B3LCByd2NzKQko KGNzcncpIDw8IDEyIHwgKHJ3cHcpIDw8IDUgfCAocndjcykpCj4gPj4gKwo+ID4+ICtlbnVtIG5m Y190eXBlIHsKPiA+PiArCU5GQ19WNiwKPiA+PiArCU5GQ19WOCwKPiA+PiArCU5GQ19WOSwKPiA+ PiArfTsKPiA+PiArCj4gPj4gKy8qKgo+ID4+ICsgKiBzdHJ1Y3QgcmtfZWNjX2NudF9zdGF0dXM6 IHJlcHJlc2VudCBhIGVjYyBzdGF0dXMgZGF0YS4KPiA+PiArICogQGVycl9mbGFnX2JpdDogZXJy b3IgZmxhZyBiaXQgaW5kZXggYXQgcmVnaXN0ZXIuCj4gPj4gKyAqIEBsb3c6IGVjYyBjb3VudCBs b3cgYml0IGluZGV4IGF0IHJlZ2lzdGVyLgo+ID4+ICsgKiBAbG93X21hc2s6IG1hc2sgYml0Lgo+ ID4+ICsgKiBAbG93X2JuOiBlY2MgY291bnQgbG93IGJpdCBudW1iZXIuCj4gPj4gKyAqIEBoaWdo OiBlY2MgY291bnQgaGlnaCBiaXQgaW5kZXggYXQgcmVnaXN0ZXIuCj4gPj4gKyAqIEBoaWdoX21h c2s6IG1hc2sgYml0Cj4gPj4gKyAqLwo+ID4+ICtzdHJ1Y3QgZWNjX2NudF9zdGF0dXMgewo+ID4+ ICsJdTggZXJyX2ZsYWdfYml0Owo+ID4+ICsJdTggbG93Owo+ID4+ICsJdTggbG93X21hc2s7Cj4g Pj4gKwl1OCBsb3dfYm47Cj4gPj4gKwl1OCBoaWdoOwo+ID4+ICsJdTggaGlnaF9tYXNrOwo+ID4+ ICt9Owo+ID4+ICsKPiA+PiArLyoKPiA+PiArICogQHR5cGU6IG5mYyB2ZXJzaW9uCj4gPj4gKyAq IEBlY2Nfc3RyZW5ndGhzOiBlY2Mgc3RyZW5ndGhzCj4gPj4gKyAqIEBlY2NfY2ZnczogZWNjIGNv bmZpZyB2YWx1ZXMKPiA+PiArICogQGZsY3RsX29mZjogRkxDVEwgcmVnaXN0ZXIgb2Zmc2V0Cj4g Pj4gKyAqIEBiY2hjdGxfb2ZmOiBCQ0hDVEwgcmVnaXN0ZXIgb2Zmc2V0Cj4gPj4gKyAqIEBkbWFf ZGF0YV9idWZfb2ZmOiBETUFfREFUQV9CVUYgcmVnaXN0ZXIgb2Zmc2V0Cj4gPj4gKyAqIEBkbWFf b29iX2J1Zl9vZmY6IERNQV9PT0JfQlVGIHJlZ2lzdGVyIG9mZnNldAo+ID4+ICsgKiBAZG1hX2Nm Z19vZmY6IERNQV9DRkcgcmVnaXN0ZXIgb2Zmc2V0Cj4gPj4gKyAqIEBkbWFfc3Rfb2ZmOiBETUFf U1QgcmVnaXN0ZXIgb2Zmc2V0Cj4gPj4gKyAqIEBiY2hfc3Rfb2ZmOiBCQ0dfU1QgcmVnaXN0ZXIg b2Zmc2V0Cj4gPj4gKyAqIEByYW5kbXpfb2ZmOiBSQU5ETVogcmVnaXN0ZXIgb2Zmc2V0Cj4gPj4g KyAqIEBpbnRfZW5fb2ZmOiBpbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyIG9mZnNldAo+ID4+ICsg KiBAaW50X2Nscl9vZmY6IGludGVycnVwdCBjbGVhbiByZWdpc3RlciBvZmZzZXQKPiA+PiArICog QGludF9zdF9vZmY6IGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgb2Zmc2V0Cj4gPj4gKyAqIEBv b2IwX29mZjogb29iMCByZWdpc3RlciBvZmZzZXQKPiA+PiArICogQG9vYjFfb2ZmOiBvb2IxIHJl Z2lzdGVyIG9mZnNldAo+ID4+ICsgKiBAZWNjMDogcmVwcmVzZW50IEVDQzAgc3RhdHVzIGRhdGEK PiA+PiArICogQGVjYzE6IHJlcHJlc2VudCBFQ0MxIHN0YXR1cyBkYXRhCj4gPj4gKyAqLwo+ID4+ ICtzdHJ1Y3QgbmZjX2NmZyB7Cj4gPj4gKwllbnVtIG5mY190eXBlIHR5cGU7Cj4gPj4gKwl1OCBl Y2Nfc3RyZW5ndGhzW05GQ19FQ0NfTUFYX01PREVTXTsKPiA+PiArCXUzMiBlY2NfY2Znc1tORkNf RUNDX01BWF9NT0RFU107Cj4gPj4gKwl1MzIgZmxjdGxfb2ZmOwo+ID4+ICsJdTMyIGJjaGN0bF9v ZmY7Cj4gPj4gKwl1MzIgZG1hX2NmZ19vZmY7Cj4gPj4gKwl1MzIgZG1hX2RhdGFfYnVmX29mZjsK PiA+PiArCXUzMiBkbWFfb29iX2J1Zl9vZmY7Cj4gPj4gKwl1MzIgZG1hX3N0X29mZjsKPiA+PiAr CXUzMiBiY2hfc3Rfb2ZmOwo+ID4+ICsJdTMyIHJhbmRtel9vZmY7Cj4gPj4gKwl1MzIgaW50X2Vu X29mZjsKPiA+PiArCXUzMiBpbnRfY2xyX29mZjsKPiA+PiArCXUzMiBpbnRfc3Rfb2ZmOwo+ID4+ ICsJdTMyIG9vYjBfb2ZmOwo+ID4+ICsJdTMyIG9vYjFfb2ZmOwo+ID4+ICsJc3RydWN0IGVjY19j bnRfc3RhdHVzIGVjYzA7Cj4gPj4gKwlzdHJ1Y3QgZWNjX2NudF9zdGF0dXMgZWNjMTsKPiA+PiAr fTsKPiA+PiArCj4gPj4gK3N0cnVjdCBya19uZmNfbmFuZF9jaGlwIHsKPiA+PiArCXN0cnVjdCBs aXN0X2hlYWQgbm9kZTsKPiA+PiArCXN0cnVjdCBuYW5kX2NoaXAgY2hpcDsKPiA+PiArCj4gPj4g Kwl1MTYgc3BhcmVfcGVyX3NlY3RvcjsKPiA+PiArCXUxNiBvb2JfYnVmX3Blcl9zZWN0b3I7Cj4g Pj4gKwl1MTYgYm9vdF9ibGtzOwo+ID4+ICsJdTE2IGJvb3RfZWNjOwo+ID4+ICsJdTE2IG1ldGFk YXRhX3NpemU7Cj4gPj4gKwo+ID4+ICsJdTggbnNlbHM7Cj4gPj4gKwl1OCBzZWxzWzBdOwo+ID4+ ICsJLyogTm90aGluZyBhZnRlciB0aGlzIGZpZWxkLiAqLwo+ID4+ICt9Owo+ID4+ICsKPiA+PiAr c3RydWN0IHJrX25mYyB7Cj4gPj4gKwlzdHJ1Y3QgbmFuZF9jb250cm9sbGVyIGNvbnRyb2xsZXI7 Cj4gPj4gKwljb25zdCBzdHJ1Y3QgbmZjX2NmZyAqY2ZnOwo+ID4+ICsJc3RydWN0IGRldmljZSAq ZGV2Owo+ID4+ICsKPiA+PiArCXN0cnVjdCBjbGsgKm5mY19jbGs7Cj4gPj4gKwlzdHJ1Y3QgY2xr ICphaGJfY2xrOwo+ID4+ICsJdm9pZCBfX2lvbWVtICpyZWdzOwo+ID4+ICsKPiA+PiArCXUzMiBz ZWxlY3RlZF9iYW5rOwo+ID4+ICsJdTMyIGJhbmRfb2Zmc2V0Owo+ID4+ICsJdTMyIGN1cl9jbGs7 Cj4gPj4gKwo+ID4+ICsJc3RydWN0IGNvbXBsZXRpb24gZG9uZTsKPiA+PiArCXN0cnVjdCBsaXN0 X2hlYWQgY2hpcHM7Cj4gPj4gKwo+ID4+ICsJdTggKmJ1ZmZlcjsKPiA+PiArCXU4ICpwYWdlX2J1 ZjsKPiA+PiArCXUzMiAqb29iX2J1ZjsKPiA+PiArCXUzMiBidWZmZXJfc2l6ZTsKPiA+PiArCXUz MiBvb2JfYnVmX3NpemU7Cj4gPj4gKwo+ID4+ICsJdW5zaWduZWQgbG9uZyBhc3NpZ25lZF9jczsK PiA+PiArfTsKPiA+PiArCj4gPj4gK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJrX25mY19uYW5kX2No aXAgKnJrX25mY190b19ya25hbmQoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCkKPiA+PiArewo+ID4+ ICsJcmV0dXJuIGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCwgY2hp cCk7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyBpbmxpbmUgdTggKnJrX25mY19idWZfdG9f ZGF0YV9wdHIoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgY29uc3QgdTggKnAsIGludCBpKQo+ID4+ ICt7Cj4gPj4gKwlyZXR1cm4gKHU4ICopcCArIGkgKiBjaGlwLT5lY2Muc2l6ZTsKPiA+PiArfQo+ ID4+ICsKPiA+PiArc3RhdGljIGlubGluZSB1OCAqcmtfbmZjX2J1Zl90b19vb2JfcHRyKHN0cnVj dCBuYW5kX2NoaXAgKmNoaXAsIGludCBpKQo+ID4+ICt7Cj4gPj4gKwl1OCAqcG9pOwo+ID4+ICsK PiA+PiArCXBvaSA9IGNoaXAtPm9vYl9wb2kgKyBpICogTkZDX1NZU19EQVRBX1NJWkU7Cj4gPj4g Kwo+ID4+ICsJcmV0dXJuIHBvaTsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGlubGluZSB1 OCAqcmtfbmZjX2J1Zl90b19vb2JfZWNjX3B0cihzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQg aSkKPiA+PiArewo+ID4+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZCA9IHJrX25m Y190b19ya25hbmQoY2hpcCk7Cj4gPj4gKwl1OCAqcG9pOwo+ID4+ICsKPiA+PiArCXBvaSA9IGNo aXAtPm9vYl9wb2kgKyBya25hbmQtPm1ldGFkYXRhX3NpemUgKwo+ID4+ICsJwqDCoMKgwqDCoCBj aGlwLT5lY2MuYnl0ZXMgKiBpOwo+ID4+ICsKPiA+PiArCXJldHVybiBwb2k7Cj4gPj4gK30KPiA+ PiArCj4gPj4gK3N0YXRpYyBpbmxpbmUgaW50IHJrX25mY19kYXRhX2xlbihzdHJ1Y3QgbmFuZF9j aGlwICpjaGlwKQo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCAqcmtuYW5k ID0gcmtfbmZjX3RvX3JrbmFuZChjaGlwKTsKPiA+PiArCj4gPj4gKwlyZXR1cm4gY2hpcC0+ZWNj LnNpemUgKyBya25hbmQtPnNwYXJlX3Blcl9zZWN0b3I7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0 YXRpYyBpbmxpbmUgdTggKnJrX25mY19kYXRhX3B0cihzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLMKg IGludCBpKQo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBuYW5kX2dldF9jb250 cm9sbGVyX2RhdGEoY2hpcCk7Cj4gPj4gKwo+ID4+ICsJcmV0dXJuIG5mYy0+YnVmZmVyICsgaSAq IHJrX25mY19kYXRhX2xlbihjaGlwKTsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGlubGlu ZSB1OCAqcmtfbmZjX29vYl9wdHIoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgaW50IGkpCj4gPj4g K3sKPiA+PiArCXN0cnVjdCBya19uZmMgKm5mYyA9IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShj aGlwKTsKPiA+PiArCj4gPj4gKwlyZXR1cm4gbmZjLT5idWZmZXIgKyBpICogcmtfbmZjX2RhdGFf bGVuKGNoaXApICsgY2hpcC0+ZWNjLnNpemU7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyB2 b2lkIHJrX25mY19zZWxlY3RfY2hpcChzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQgY3MpCj4g Pj4gK3sKPiA+PiArCXN0cnVjdCBya19uZmMgKm5mYyA9IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0 YShjaGlwKTsKPiA+PiArCXN0cnVjdCBya19uZmNfbmFuZF9jaGlwICpya25hbmQgPSBya19uZmNf dG9fcmtuYW5kKGNoaXApOwo+ID4+ICsJdTMyIHZhbDsKPiA+PiArCj4gPj4gKwlpZiAoY3MgPCAw KSB7Cj4gPj4gKwluZmMtPnNlbGVjdGVkX2JhbmsgPSAtMTsKPiA+PiArCS8qIERlc2VsZWN0IHRo ZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGFyZ2V0LiAqLwo+ID4+ICsJdmFsID0gcmVhZGxfcmVsYXhl ZChuZmMtPnJlZ3MgKyBORkNfRk1DVEwpOwo+ID4+ICsJdmFsICY9IH5GTUNUTF9DRV9TRUxfTTsK PiA+PiArCXdyaXRlbCh2YWwsIG5mYy0+cmVncyArIE5GQ19GTUNUTCk7Cj4gPj4gKwlyZXR1cm47 Cj4gPj4gKwl9Cj4gPj4gKwo+ID4+ICsJbmZjLT5zZWxlY3RlZF9iYW5rID0gcmtuYW5kLT5zZWxz W2NzXTsKPiA+PiArCW5mYy0+YmFuZF9vZmZzZXQgPSBORkNfQkFOSyArIG5mYy0+c2VsZWN0ZWRf YmFuayAqIE5GQ19CQU5LX1NURVA7Cj4gPj4gKwo+ID4+ICsJdmFsID0gcmVhZGxfcmVsYXhlZChu ZmMtPnJlZ3MgKyBORkNfRk1DVEwpOwo+ID4+ICsJdmFsICY9IH5GTUNUTF9DRV9TRUxfTTsKPiA+ PiArCXZhbCB8PSBGTUNUTF9DRV9TRUwobmZjLT5zZWxlY3RlZF9iYW5rKTsKPiA+PiArCj4gPj4g Kwl3cml0ZWwodmFsLCBuZmMtPnJlZ3MgKyBORkNfRk1DVEwpOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ ICtzdGF0aWMgaW5saW5lIGludCBya19uZmNfd2FpdF9pb3JlYWR5KHN0cnVjdCBya19uZmMgKm5m YykKPiA+PiArewo+ID4+ICsJaW50IHJjOwo+ID4+ICsJdTMyIHZhbDsKPiA+PiArCj4gPj4gKwly YyA9IHJlYWRsX3JlbGF4ZWRfcG9sbF90aW1lb3V0KG5mYy0+cmVncyArIE5GQ19GTUNUTCwgdmFs LAo+ID4+ICsJdmFsICYgRk1DVExfUkRZLCAxMCwgTkZDX1RJTUVPVVQpOwo+ID4+ICsKPiA+PiAr CXJldHVybiByYzsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIHZvaWQgcmtfbmZjX3JlYWRf YnVmKHN0cnVjdCBya19uZmMgKm5mYywgdTggKmJ1ZiwgaW50IGxlbikKPiA+PiArewo+ID4+ICsJ aW50IGk7Cj4gPj4gKwo+ID4+ICsJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQo+ID4+ICsJYnVm W2ldID0gcmVhZGJfcmVsYXhlZChuZmMtPnJlZ3MgKyBuZmMtPmJhbmRfb2Zmc2V0ICsKPiA+PiAr CcKgwqDCoMKgwqDCoCBCQU5LX0RBVEEpOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgdm9p ZCBya19uZmNfd3JpdGVfYnVmKHN0cnVjdCBya19uZmMgKm5mYywgY29uc3QgdTggKmJ1ZiwgaW50 IGxlbikKPiA+PiArewo+ID4+ICsJaW50IGk7Cj4gPj4gKwo+ID4+ICsJZm9yIChpID0gMDsgaSA8 IGxlbjsgaSsrKQo+ID4+ICsJd3JpdGViKGJ1ZltpXSwgbmZjLT5yZWdzICsgbmZjLT5iYW5kX29m ZnNldCArIEJBTktfREFUQSk7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyBpbnQgcmtfbmZj X2NtZChzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAo+ID4+ICsJwqDCoMKgwqDCoCBjb25zdCBzdHJ1 Y3QgbmFuZF9zdWJvcCAqc3Vib3ApCj4gPj4gK3sKPiA+PiArCXN0cnVjdCBya19uZmMgKm5mYyA9 IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShjaGlwKTsKPiA+PiArCXVuc2lnbmVkIGludCBpLCBq LCByZW1haW5pbmcsIHN0YXJ0Owo+ID4+ICsJaW50IHJlZ19vZmZzZXQgPSBuZmMtPmJhbmRfb2Zm c2V0Owo+ID4+ICsJdTggKmluYnVmID0gTlVMTDsKPiA+PiArCWNvbnN0IHU4ICpvdXRidWY7Cj4g Pj4gKwl1MzIgY250ID0gMDsKPiA+PiArCWludCByZXQgPSAwOwo+ID4+ICsKPiA+PiArCWZvciAo aSA9IDA7IGkgPCBzdWJvcC0+bmluc3RyczsgaSsrKSB7Cj4gPj4gKwljb25zdCBzdHJ1Y3QgbmFu ZF9vcF9pbnN0ciAqaW5zdHIgPSAmc3Vib3AtPmluc3Ryc1tpXTsKPiA+PiArCj4gPj4gKwlzd2l0 Y2ggKGluc3RyLT50eXBlKSB7Cj4gPj4gKwljYXNlIE5BTkRfT1BfQ01EX0lOU1RSOgo+ID4+ICsJ d3JpdGViKGluc3RyLT5jdHguY21kLm9wY29kZSwKPiA+PiArCcKgwqDCoMKgwqDCoCBuZmMtPnJl Z3MgKyByZWdfb2Zmc2V0ICsgQkFOS19DTUQpOwo+ID4+ICsJYnJlYWs7Cj4gPj4gKwo+ID4+ICsJ Y2FzZSBOQU5EX09QX0FERFJfSU5TVFI6Cj4gPj4gKwlyZW1haW5pbmcgPSBuYW5kX3N1Ym9wX2dl dF9udW1fYWRkcl9jeWMoc3Vib3AsIGkpOwo+ID4+ICsJc3RhcnQgPSBuYW5kX3N1Ym9wX2dldF9h ZGRyX3N0YXJ0X29mZihzdWJvcCwgaSk7Cj4gPj4gKwo+ID4+ICsJZm9yIChqID0gMDsgaiA8IDgg JiYgaiArIHN0YXJ0IDwgcmVtYWluaW5nOyBqKyspCj4gPj4gKwl3cml0ZWIoaW5zdHItPmN0eC5h ZGRyLmFkZHJzW2ogKyBzdGFydF0sCj4gPj4gKwnCoMKgwqDCoMKgwqAgbmZjLT5yZWdzICsgcmVn X29mZnNldCArIEJBTktfQUREUik7Cj4gPj4gKwlicmVhazsKPiA+PiArCj4gPj4gKwljYXNlIE5B TkRfT1BfREFUQV9JTl9JTlNUUjoKPiA+PiArCWNhc2UgTkFORF9PUF9EQVRBX09VVF9JTlNUUjoK PiA+PiArCXN0YXJ0ID0gbmFuZF9zdWJvcF9nZXRfZGF0YV9zdGFydF9vZmYoc3Vib3AsIGkpOwo+ ID4+ICsJY250ID0gbmFuZF9zdWJvcF9nZXRfZGF0YV9sZW4oc3Vib3AsIGkpOwo+ID4+ICsKPiA+ PiArCWlmIChpbnN0ci0+dHlwZSA9PSBOQU5EX09QX0RBVEFfT1VUX0lOU1RSKSB7Cj4gPj4gKwlv dXRidWYgPSBpbnN0ci0+Y3R4LmRhdGEuYnVmLm91dCArIHN0YXJ0Owo+ID4+ICsJcmtfbmZjX3dy aXRlX2J1ZihuZmMsIG91dGJ1ZiwgY250KTsKPiA+PiArCX0gZWxzZSB7Cj4gPj4gKwlpbmJ1ZiA9 IGluc3RyLT5jdHguZGF0YS5idWYuaW4gKyBzdGFydDsKPiA+PiArCXJrX25mY19yZWFkX2J1Zihu ZmMsIGluYnVmLCBjbnQpOwo+ID4+ICsJfQo+ID4+ICsJYnJlYWs7Cj4gPj4gKwo+ID4+ICsJY2Fz ZSBOQU5EX09QX1dBSVRSRFlfSU5TVFI6Cj4gPj4gKwlpZiAocmtfbmZjX3dhaXRfaW9yZWFkeShu ZmMpIDwgMCkgewo+ID4+ICsJcmV0ID0gLUVUSU1FRE9VVDsKPiA+PiArCWRldl9lcnIobmZjLT5k ZXYsICJJTyBub3QgcmVhZHlcbiIpOwo+ID4+ICsJfQo+ID4+ICsJYnJlYWs7Cj4gPj4gKwl9Cj4g Pj4gKwl9Cj4gPj4gKwo+ID4+ICsJcmV0dXJuIHJldDsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3Rh dGljIGNvbnN0IHN0cnVjdCBuYW5kX29wX3BhcnNlciBya19uZmNfb3BfcGFyc2VyID0gTkFORF9P UF9QQVJTRVIoCj4gPj4gKwlOQU5EX09QX1BBUlNFUl9QQVRURVJOKAo+ID4+ICsJcmtfbmZjX2Nt ZCwKPiA+PiArCU5BTkRfT1BfUEFSU0VSX1BBVF9DTURfRUxFTSh0cnVlKSwKPiA+PiArCU5BTkRf T1BfUEFSU0VSX1BBVF9BRERSX0VMRU0odHJ1ZSwgTUFYX0FERFJFU1NfQ1lDKSwKPiA+PiArCU5B TkRfT1BfUEFSU0VSX1BBVF9DTURfRUxFTSh0cnVlKSwKPiA+PiArCU5BTkRfT1BfUEFSU0VSX1BB VF9XQUlUUkRZX0VMRU0odHJ1ZSksCj4gPj4gKwlOQU5EX09QX1BBUlNFUl9QQVRfREFUQV9JTl9F TEVNKHRydWUsIE1BWF9EQVRBX1NJWkUpKSwKPiA+PiArCU5BTkRfT1BfUEFSU0VSX1BBVFRFUk4o Cj4gPj4gKwlya19uZmNfY21kLAo+ID4+ICsJTkFORF9PUF9QQVJTRVJfUEFUX0NNRF9FTEVNKHRy dWUpLAo+ID4+ICsJTkFORF9PUF9QQVJTRVJfUEFUX0FERFJfRUxFTSh0cnVlLCBNQVhfQUREUkVT U19DWUMpLAo+ID4+ICsJTkFORF9PUF9QQVJTRVJfUEFUX0RBVEFfT1VUX0VMRU0odHJ1ZSwgTUFY X0RBVEFfU0laRSksCj4gPj4gKwlOQU5EX09QX1BBUlNFUl9QQVRfQ01EX0VMRU0odHJ1ZSksCj4g Pj4gKwlOQU5EX09QX1BBUlNFUl9QQVRfV0FJVFJEWV9FTEVNKHRydWUpKSwKPiA+PiArKTsKPiA+ PiArCj4gPj4gK3N0YXRpYyBpbnQgcmtfbmZjX2V4ZWNfb3Aoc3RydWN0IG5hbmRfY2hpcCAqY2hp cCwKPiA+PiArCcKgIGNvbnN0IHN0cnVjdCBuYW5kX29wZXJhdGlvbiAqb3AsCj4gPj4gKwnCoCBi b29sIGNoZWNrX29ubHkpCj4gPj4gK3sKPiA+PiArCWlmICghY2hlY2tfb25seSkKPiA+PiArCXJr X25mY19zZWxlY3RfY2hpcChjaGlwLCBvcC0+Y3MpOwo+ID4+ICsKPiA+PiArCXJldHVybiBuYW5k X29wX3BhcnNlcl9leGVjX29wKGNoaXAsICZya19uZmNfb3BfcGFyc2VyLCBvcCwKPiA+PiArCcKg wqDCoMKgwqAgY2hlY2tfb25seSk7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyBpbnQgcmtf bmZjX3NldHVwX2RhdGFfaW50ZXJmYWNlKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIGludCBjc2xp bmUsCj4gPj4gKwnCoMKgwqDCoMKgwqAgY29uc3Qgc3RydWN0IG5hbmRfaW50ZXJmYWNlX2NvbmZp ZyAqY29uZikgIAo+ID4KPiA+UGxlYXNlIGhhdmUgYSBsb29rIGF0IHRoZSByZWNlbnQgY2hhbmdl cyBpbiB0aGUgY29yZSwgdGhpcyBoZWxwZXIKPiA+c2hvdWxkIGJlIG5hbWVkICJzZXR1cF9pbnRl cmZhY2UiLgo+ID4gIAo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBuYW5kX2dl dF9jb250cm9sbGVyX2RhdGEoY2hpcCk7Cj4gPj4gKwljb25zdCBzdHJ1Y3QgbmFuZF9zZHJfdGlt aW5ncyAqdGltaW5nczsKPiA+PiArCXUzMiByYXRlLCB0YzJydywgdHJ3cHcsIHRydzJjOwo+ID4+ ICsJdTMyIHRlbXA7Cj4gPj4gKwo+ID4+ICsJaWYgKGNzbGluZSA9PSBOQU5EX0RBVEFfSUZBQ0Vf Q0hFQ0tfT05MWSkKPiA+PiArCXJldHVybiAwOwo+ID4+ICsKPiA+PiArCXRpbWluZ3MgPSBuYW5k X2dldF9zZHJfdGltaW5ncyhjb25mKTsKPiA+PiArCWlmIChJU19FUlIodGltaW5ncykpCj4gPj4g KwlyZXR1cm4gLUVPUE5PVFNVUFA7Cj4gPj4gKwo+ID4+ICsJaWYgKElTX0VSUihuZmMtPm5mY19j bGspKQo+ID4+ICsJcmF0ZSA9IGNsa19nZXRfcmF0ZShuZmMtPmFoYl9jbGspOwo+ID4+ICsJZWxz ZQo+ID4+ICsJcmF0ZSA9IGNsa19nZXRfcmF0ZShuZmMtPm5mY19jbGspOwo+ID4+ICsKPiA+PiAr CS8qIFR1cm4gY2xvY2sgcmF0ZSBpbnRvIGtIei4gKi8KPiA+PiArCXJhdGUgLz0gMTAwMDsKPiA+ PiArCj4gPj4gKwl0YzJydyA9IDE7Cj4gPj4gKwl0cncyYyA9IDE7Cj4gPj4gKwo+ID4+ICsJdHJ3 cHcgPSBtYXgodGltaW5ncy0+dFdDX21pbiwgdGltaW5ncy0+dFJDX21pbikgLyAxMDAwOwo+ID4+ ICsJdHJ3cHcgPSBESVZfUk9VTkRfVVAodHJ3cHcgKiByYXRlLCAxMDAwMDAwKTsKPiA+PiArCj4g Pj4gKwl0ZW1wID0gdGltaW5ncy0+dFJFQV9tYXggLyAxMDAwOwo+ID4+ICsJdGVtcCA9IERJVl9S T1VORF9VUCh0ZW1wICogcmF0ZSwgMTAwMDAwMCk7Cj4gPj4gKwo+ID4+ICsJaWYgKHRyd3B3IDwg dGVtcCkKPiA+PiArCXRyd3B3ID0gdGVtcDsKPiA+PiArCj4gPj4gKwkvKgo+ID4+ICsJKiBBQ0NP TjogYWNjZXNzIHRpbWluZyBjb250cm9sIHJlZ2lzdGVyCj4gPj4gKwkqIC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiA+PiArCSogMzE6MTg6IHJlc2VydmVkCj4gPj4gKwkq IDE3OjEyOiBjc3J3LCBjbG9jayBjeWNsZXMgZnJvbSB0aGUgZmFsbGluZyBlZGdlIG9mIENTbiB0 byB0aGUKPiA+PiArCSrCoMKgIGZhbGxpbmcgZWRnZSBvZiBSRG4gb3IgV1JuCj4gPj4gKwkqIDEx OjExOiByZXNlcnZlZAo+ID4+ICsJKiAxMDowNTogcndwdywgdGhlIHdpZHRoIG9mIFJEbiBvciBX Um4gaW4gcHJvY2Vzc29yIGNsb2NrIGN5Y2xlcwo+ID4+ICsJKiAwNDowMDogcndjcywgY2xvY2sg Y3ljbGVzIGZyb20gdGhlIHJpc2luZyBlZGdlIG9mIFJEbiBvciBXUm4gdG8gdGhlCj4gPj4gKwkq wqDCoCByaXNpbmcgZWRnZSBvZiBDU24KPiA+PiArCSovCj4gPj4gKwl0ZW1wID0gQUNDVElNSU5H KHRjMnJ3LCB0cndwdywgdHJ3MmMpOwo+ID4+ICsJd3JpdGVsKHRlbXAsIG5mYy0+cmVncyArIE5G Q19GTVdBSVQpOyAgCj4gPgo+ID5Zb3Ugc2hvdWxkIHNhdmUgdGhlIGNoaXAncyB0aW1pbmcgY29u ZmlndXJhdGlvbiBpbnN0ZWFkIG9mIHdyaXRpbmcgaXQKPiA+aGVyZSwgYW5kIHNldHRpbmcgdGhl IHJlZ2lzdGVyIHZhbHVlIGR1cmluZyBjaGlwIHNlbGVjdGlvbi4gVGhpcyB3YXkKPiA+eW91IG1h eSBoYW5kbGUgc2V2ZXJhbCBjaGlwcyB3aXRoIGRpZmZlcmVudCB0aW1pbmcKPiA+Y29uc3RyYWlu dHMvY29uZmlndXJhdGlvbnMuCj4gPiAgCj4gPj4gKwo+ID4+ICsJcmV0dXJuIDA7Cj4gPj4gK30K PiA+PiArCj4gPj4gK3N0YXRpYyBpbnQgcmtfbmZjX2h3X2VjY19zZXR1cChzdHJ1Y3QgbmFuZF9j aGlwICpjaGlwLAo+ID4+ICsJwqDCoMKgwqDCoMKgIHN0cnVjdCBuYW5kX2VjY19jdHJsICplY2Ms Cj4gPj4gKwnCoMKgwqDCoMKgwqAgdWludDMyX3Qgc3RyZW5ndGgpCj4gPj4gK3sKPiA+PiArCXN0 cnVjdCBya19uZmMgKm5mYyA9IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShjaGlwKTsKPiA+PiAr CXUzMiByZWcsIGk7Cj4gPj4gKwo+ID4+ICsJZm9yIChpID0gMDsgaSA8IE5GQ19FQ0NfTUFYX01P REVTOyBpKyspIHsKPiA+PiArCWlmIChlY2MtPnN0cmVuZ3RoID09IG5mYy0+Y2ZnLT5lY2Nfc3Ry ZW5ndGhzW2ldKSB7Cj4gPj4gKwlyZWcgPSBuZmMtPmNmZy0+ZWNjX2NmZ3NbaV07Cj4gPj4gKwli cmVhazsKPiA+PiArCX0KPiA+PiArCX0KPiA+PiArCj4gPj4gKwlpZiAoaSA+PSBORkNfRUNDX01B WF9NT0RFUykKPiA+PiArCXJldHVybiAtRUlOVkFMOwo+ID4+ICsKPiA+PiArCXdyaXRlbChyZWcs IG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5iY2hjdGxfb2ZmKTsgIAo+ID4KPiA+U2FtZSBoZXJlLCBp ZiB5b3UgaGFuZGxlIGRpZmZlcmVudCBjaGlwcywgdGhleSBtYXkgdXNlIGRpZmZlcmVudCBFQ0MK PiA+Y29uZmlndXJhdGlvbnMsIHRoaXMgc2hvdWxkIGJlIGhhbmRsZWQuCj4gPiAgCj4gPj4gKwo+ ID4+ICsJcmV0dXJuIDA7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyB2b2lkIHJrX25mY194 ZmVyX3N0YXJ0KHN0cnVjdCBya19uZmMgKm5mYywgdTggcncsIHU4IG5fS0IsCj4gPj4gKwnCoMKg wqDCoMKgIGRtYV9hZGRyX3QgZG1hX2RhdGEsIGRtYV9hZGRyX3QgZG1hX29vYikKPiA+PiArewo+ ID4+ICsJdTMyIGRtYV9yZWcsIGZsX3JlZywgYmNoX3JlZzsKPiA+PiArCj4gPj4gKwlkbWFfcmVn ID0gRE1BX1NUIHwgKCghcncpIDw8IERNQV9XUikgfCBETUFfRU4gfCAoMiA8PCBETUFfQUhCX1NJ WkUpIHwKPiA+PiArCcKgwqDCoMKgwqAgKDcgPDwgRE1BX0JVUlNUX1NJWkUpIHwgKDE2IDw8IERN QV9JTkNfTlVNKTsKPiA+PiArCj4gPj4gKwlmbF9yZWcgPSAocncgPDwgRkxDVExfV1IpIHwgRkxD VExfWEZFUl9FTiB8IEZMQ1RMX0FDT1JSRUNUIHwKPiA+PiArCShuX0tCIDw8IEZMQ1RMX1hGRVJf U0VDVE9SKSB8IEZMQ1RMX1RPR19GSVg7Cj4gPj4gKwo+ID4+ICsJaWYgKG5mYy0+Y2ZnLT50eXBl ID09IE5GQ19WNiB8fCBuZmMtPmNmZy0+dHlwZSA9PSBORkNfVjgpIHsKPiA+PiArCWJjaF9yZWcg PSByZWFkbF9yZWxheGVkKG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5iY2hjdGxfb2ZmKTsKPiA+PiAr CWJjaF9yZWcgPSAoYmNoX3JlZyAmICh+QkNIQ1RMX0JBTktfTSkpIHwKPiA+PiArCcKgIChuZmMt PnNlbGVjdGVkX2JhbmsgPDwgQkNIQ1RMX0JBTkspOwo+ID4+ICsJd3JpdGVsKGJjaF9yZWcsIG5m Yy0+cmVncyArIG5mYy0+Y2ZnLT5iY2hjdGxfb2ZmKTsKPiA+PiArCX0KPiA+PiArCj4gPj4gKwl3 cml0ZWwoZG1hX3JlZywgbmZjLT5yZWdzICsgbmZjLT5jZmctPmRtYV9jZmdfb2ZmKTsKPiA+PiAr CXdyaXRlbCgodTMyKWRtYV9kYXRhLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ZG1hX2RhdGFfYnVm X29mZik7Cj4gPj4gKwl3cml0ZWwoKHUzMilkbWFfb29iLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ ZG1hX29vYl9idWZfb2ZmKTsKPiA+PiArCXdyaXRlbChmbF9yZWcsIG5mYy0+cmVncyArIG5mYy0+ Y2ZnLT5mbGN0bF9vZmYpOwo+ID4+ICsJZmxfcmVnIHw9IEZMQ1RMX1hGRVJfU1Q7Cj4gPj4gKwl3 cml0ZWwoZmxfcmVnLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ZmxjdGxfb2ZmKTsKPiA+PiArfQo+ ID4+ICsKPiA+PiArc3RhdGljIGludCBya19uZmNfd2FpdF9mb3JfeGZlcl9kb25lKHN0cnVjdCBy a19uZmMgKm5mYykKPiA+PiArewo+ID4+ICsJdm9pZCBfX2lvbWVtICpwdHI7Cj4gPj4gKwlpbnQg cmV0ID0gMDsKPiA+PiArCXUzMiByZWc7Cj4gPj4gKwo+ID4+ICsJcHRyID0gbmZjLT5yZWdzICsg bmZjLT5jZmctPmZsY3RsX29mZjsKPiA+PiArCj4gPj4gKwlyZXQgPSByZWFkbF9yZWxheGVkX3Bv bGxfdGltZW91dChwdHIsIHJlZywKPiA+PiArCXJlZyAmIEZMQ1RMX1hGRVJfUkVBRFksCj4gPj4g KwkxMCwgTkZDX1RJTUVPVVQpOwo+ID4+ICsKPiA+PiArCXJldHVybiByZXQ7Cj4gPj4gK30KPiA+ PiArCj4gPj4gK3N0YXRpYyBpbnQgcmtfbmZjX3dyaXRlX3BhZ2VfcmF3KHN0cnVjdCBuYW5kX2No aXAgKmNoaXAsIGNvbnN0IHU4ICpidWYsCj4gPj4gKwlpbnQgb29iX29uLCBpbnQgcGFnZSkKPiA+ PiArewo+ID4+ICsJc3RydWN0IG10ZF9pbmZvICptdGQgPSBuYW5kX3RvX210ZChjaGlwKTsKPiA+ PiArCXN0cnVjdCBya19uZmMgKm5mYyA9IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShjaGlwKTsK PiA+PiArCXN0cnVjdCBuYW5kX2VjY19jdHJsICplY2MgPSAmY2hpcC0+ZWNjOwo+ID4+ICsJaW50 IHJldCA9IDA7Cj4gPj4gKwl1MzIgaTsKPiA+PiArCj4gPj4gKwlpZiAoIWJ1ZikKPiA+PiArCW1l bXNldChuZmMtPmJ1ZmZlciwgMHhmZiwgbXRkLT53cml0ZXNpemUgKyBtdGQtPm9vYnNpemUpOwo+ ID4+ICsKPiA+PiArCWZvciAoaSA9IDA7IGkgPCBlY2MtPnN0ZXBzOyBpKyspIHsKPiA+PiArCS8q IENvcHkgZGF0YSB0byBuZmMgYnVmZmVyLiAqLwo+ID4+ICsJaWYgKGJ1ZikKPiA+PiArCW1lbWNw eShya19uZmNfZGF0YV9wdHIoY2hpcCwgaSksCj4gPj4gKwnCoMKgwqDCoMKgwqAgcmtfbmZjX2J1 Zl90b19kYXRhX3B0cihjaGlwLCBidWYsIGkpLAo+ID4+ICsJwqDCoMKgwqDCoMKgIGVjYy0+c2l6 ZSk7Cj4gPj4gKwkvKgo+ID4+ICsJKiBUaGUgZmlyc3QgZm91ciBieXRlcyBvZiBPT0IgYXJlIHJl c2VydmVkIGZvciB0aGUKPiA+PiArCSogYm9vdCBST00uIEluIHNvbWUgZGVidWdnaW5nIGNhc2Vz LCBzdWNoIGFzIHdpdGggYQo+ID4+ICsJKiByZWFkLCBlcmFzZSBhbmQgd3JpdGUgYmFjayB0ZXN0 IHRoZXNlIDQgYnl0ZXMgc3RvcmVkCj4gPj4gKwkqIGluIE9PQiBhbHNvIG5lZWQgdG8gYmUgd3Jp dHRlbiBiYWNrLgo+ID4+ICsJKi8gIAo+ID4KPiA+VGhlIGNvbnRyb2xsZXIgZHJpdmVyIHNob3Vs ZCBub3QgYXJiaXRyYXRlIHRoaXMuIElmIHlvdSBkb24ndCB3YW50IHRvCj4gPmV4cG9zZSB0aGVz ZSBieXRlcywgdGhleSBzaG91bGQgbm90IGFwcGVhciAiZnJlZSIgaW4gdGhlIE9PQiBsYXlvdXQs Cj4gPmJ1dCBhIHJhdyBhY2Nlc3MgKm11c3QqIGJ1dCBhYmxlIHRvIGFkZHJlc3MgdGhlIGVudGly ZSBwYWdlL29vYi4gIAo+IAo+IEkgZG9uJ3QgaGF2ZSBhIHNvbHV0aW9uIHRvIGZpeCBpdC4KPiBU aGUgZnVuY3Rpb27CoG5hbmRfYmxvY2tfYmFkIGRldGVjdCBiYWQgYmxvY2sgbGlrZSBpdDoKPiDC oCDCoMKgYmFkID0gY2hpcC0+b29iX3BvaVtjaGlwLT5iYWRibG9ja3Bvc107IC8vY2hpcC0+YmFk YmxvY2twb3MgPSAwIGZvciBsYXJnZSBwYWdlIE5BTkQgRmxhc2guCj4gU2/CoGNoaXAtPm9vYl9w b2lbMF0gaXMgYmFkIG1hc2tlci4KPiAKPiBUaGUgb29iIGRhdGEgbGF5b3V0IGZvciByayBuZmMg aXM6Cj4gwqBQQTAgUEExIFBBMiBQQTMgfCBCQk0gT09CMSBPT0IyIE9PQjMgfCAuLi4KPiBvcgo+ IMKgMHhGRiAweEZGIDB4RkYgMHhGRiB8IEJCTSBPT0IxIE9PQjIgT09CMyB8IC4uLgo+IAo+IFRo ZSBjb2RlIGhlcmUganVzdCB0byBzd2FwIHRoZSBmaXJzdCA0IGJ5dGVzIHdpdGggdGhlIGxhc3Qg NCBieXRlcyBhbmQgd2l0aG91dCBkcm9wZWQgYW55IMKgZGF0YS4KPiBhbmQgdGhlIGNoaXAtPm9v Yl9wb2kgZGF0YSBsYXlvdXQ6Cj4gQkJNIE9PQjEgT09CMiBPT0IzfC4uLi4uLnzCoFBBMCBQQTEg UEEyIFBBM8KgCj4gCj4gVGhlIE9PQiBsYXlvdXQgZnJlZSBhbHJlYWR5IHJlc2VydmVkIHRoaXMg NCBieXRlczoKPiBvb2JfcmVnaW9uLT5vZmZzZXQgPSBORkNfU1lTX0RBVEFfU0laRSArIDI7Cj4g Cj4gPj4gKwlpZiAoIWkpCj4gPj4gKwltZW1jcHkocmtfbmZjX29vYl9wdHIoY2hpcCwgaSksCj4g Pj4gKwnCoMKgwqDCoMKgwqAgcmtfbmZjX2J1Zl90b19vb2JfcHRyKGNoaXAsIGVjYy0+c3RlcHMg LSAxKSwKPiA+PiArCcKgwqDCoMKgwqDCoCBORkNfU1lTX0RBVEFfU0laRSk7Cj4gPj4gKwllbHNl Cj4gPj4gKwltZW1jcHkocmtfbmZjX29vYl9wdHIoY2hpcCwgaSksCj4gPj4gKwnCoMKgwqDCoMKg wqAgcmtfbmZjX2J1Zl90b19vb2JfcHRyKGNoaXAsIGkgLSAxKSwKPiA+PiArCcKgwqDCoMKgwqDC oCBORkNfU1lTX0RBVEFfU0laRSk7Cj4gPj4gKwkvKiBDb3B5IEVDQyBkYXRhIHRvIHRoZSBORkMg YnVmZmVyLiAqLwo+ID4+ICsJbWVtY3B5KHJrX25mY19vb2JfcHRyKGNoaXAsIGkpICsgTkZDX1NZ U19EQVRBX1NJWkUsCj4gPj4gKwnCoMKgwqDCoMKgwqAgcmtfbmZjX2J1Zl90b19vb2JfZWNjX3B0 cihjaGlwLCBpKSwKPiA+PiArCcKgwqDCoMKgwqDCoCBlY2MtPmJ5dGVzKTsKPiA+PiArCX0KPiA+ PiArCj4gPj4gKwluYW5kX3Byb2dfcGFnZV9iZWdpbl9vcChjaGlwLCBwYWdlLCAwLCBOVUxMLCAw KTsKPiA+PiArCXJrX25mY193cml0ZV9idWYobmZjLCBidWYsIG10ZC0+d3JpdGVzaXplICsgbXRk LT5vb2JzaXplKTsKPiA+PiArCXJldCA9IG5hbmRfcHJvZ19wYWdlX2VuZF9vcChjaGlwKTsKPiA+ PiArCj4gPj4gKwkvKgo+ID4+ICsJKiBEZXNlbGVjdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRh cmdldCBhZnRlciB0aGUgb3BzIGlzIGRvbmUKPiA+PiArCSogdG8gcmVkdWNlIHRoZSBwb3dlciBj b25zdW1wdGlvbi4KPiA+PiArCSovCj4gPj4gKwlya19uZmNfc2VsZWN0X2NoaXAoY2hpcCwgLTEp Owo+ID4+ICsKPiA+PiArCXJldHVybiByZXQ7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyBp bnQgcmtfbmZjX3dyaXRlX29vYihzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQgcGFnZSkKPiA+ PiArewo+ID4+ICsJcmV0dXJuIHJrX25mY193cml0ZV9wYWdlX3JhdyhjaGlwLCBOVUxMLCAxLCBw YWdlKTsgIAo+ID4KPiA+Tm90IHN1cmUgdGhpcyBpcyByZWxldmFudC4gWW91IHNob3VsZCBub3Qg ZG8gdGhhdCwgSSBndWVzcyB0aGUgY29yZQo+ID53aWxsIGF1dG9tYXRpY2FsbHkgdGFrZSBjYXJl IG9mIGl0Lgo+ID4gIAo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgaW50IHJrX25mY193cml0 ZV9wYWdlX2h3ZWNjKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIGNvbnN0IHU4ICpidWYsCj4gPj4g KwnCoMKgIGludCBvb2Jfb24sIGludCBwYWdlKQo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgbXRkX2lu Zm8gKm10ZCA9IG5hbmRfdG9fbXRkKGNoaXApOwo+ID4+ICsJc3RydWN0IHJrX25mYyAqbmZjID0g bmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ID4+ICsJc3RydWN0IHJrX25mY19uYW5k X2NoaXAgKnJrbmFuZCA9IHJrX25mY190b19ya25hbmQoY2hpcCk7Cj4gPj4gKwlzdHJ1Y3QgbmFu ZF9lY2NfY3RybCAqZWNjID0gJmNoaXAtPmVjYzsKPiA+PiArCWludCBvb2Jfc3RlcCA9IChlY2Mt PmJ5dGVzID4gNjApID8gTkZDX01BWF9PT0JfUEVSX1NURVAgOgo+ID4+ICsJTkZDX01JTl9PT0Jf UEVSX1NURVA7Cj4gPj4gKwlpbnQgcGFnZXNfcGVyX2JsayA9IG10ZC0+ZXJhc2VzaXplIC8gbXRk LT53cml0ZXNpemU7Cj4gPj4gKwlpbnQgcmV0ID0gMCwgaSwgYm9vdF9yb21fbW9kZSA9IDA7Cj4g Pj4gKwlkbWFfYWRkcl90IGRtYV9kYXRhLCBkbWFfb29iOwo+ID4+ICsJdTMyIHJlZzsKPiA+PiAr CXU4ICpvb2I7Cj4gPj4gKwo+ID4+ICsJbmFuZF9wcm9nX3BhZ2VfYmVnaW5fb3AoY2hpcCwgcGFn ZSwgMCwgTlVMTCwgMCk7Cj4gPj4gKwo+ID4+ICsJbWVtY3B5KG5mYy0+cGFnZV9idWYsIGJ1Ziwg bXRkLT53cml0ZXNpemUpOwo+ID4+ICsKPiA+PiArCS8qCj4gPj4gKwkqIFRoZSBmaXJzdCBibG9j a3MgKDQsIDggb3IgMTYgZGVwZW5kaW5nIG9uIHRoZSBkZXZpY2UpIGFyZSB1c2VkCj4gPj4gKwkq IGJ5IHRoZSBib290IFJPTSBhbmQgdGhlIGZpcnN0IDMyIGJpdHMgb2YgT09CIG5lZWQgdG8gbGlu ayB0bwo+ID4+ICsJKiB0aGUgbmV4dCBwYWdlIGFkZHJlc3MgaW4gdGhlIHNhbWUgYmxvY2suIFdl IGNhbid0IGRpcmVjdGx5IGNvcHkKPiA+PiArCSogT09CIGRhdGEgZnJvbSB0aGUgTVREIGZyYW1l d29yaywgYmVjYXVzZSB0aGlzIHBhZ2UgYWRkcmVzcwo+ID4+ICsJKiBjb25mbGljdHMgZm9yIGV4 YW1wbGUgd2l0aCB0aGUgYmFkIGJsb2NrIG1hcmtlciAoQkJNKSwKPiA+PiArCSogc28gd2Ugc2hp ZnQgYWxsIE9PQiBkYXRhIGluY2x1ZGluZyB0aGUgQkJNIHdpdGggNCBieXRlIHBvc2l0aW9ucy4K PiA+PiArCSogQXMgYSBjb25zZXF1ZW5jZSB0aGUgT09CIHNpemUgYXZhaWxhYmxlIHRvIHRoZSBN VEQgZnJhbWV3b3JrIGlzCj4gPj4gKwkqIGFsc28gcmVkdWNlZCB3aXRoIDQgYnl0ZXMuCj4gPj4g KwkqCj4gPj4gKwkqwqDCoMKgIFBBMCBQQTEgUEEyIFBBMyB8IEJCTSBPT0IxIE9PQjIgT09CMyB8 IC4uLgo+ID4+ICsJKgo+ID4+ICsJKiBJZiBhIE5BTkQgaXMgbm90IGEgYm9vdCBtZWRpdW0gb3Ig dGhlIHBhZ2UgaXMgbm90IGEgYm9vdCBibG9jaywKPiA+PiArCSogdGhlIGZpcnN0IDQgYnl0ZXMg YXJlIGxlZnQgdW50b3VjaGVkIGJ5IHdyaXRpbmcgMHhGRiB0byB0aGVtLgo+ID4+ICsJKgo+ID4+ ICsJKsKgwqAgMHhGRiAweEZGIDB4RkYgMHhGRiB8IEJCTSBPT0IxIE9PQjIgT09CMyB8IC4uLgo+ ID4+ICsJKgo+ID4+ICsJKiBDb25maWd1cmUgdGhlIEVDQyBhbGdvcml0aG0gc3VwcG9ydGVkIGJ5 IHRoZSBib290IFJPTS4KPiA+PiArCSovCj4gPj4gKwlpZiAoKHBhZ2UgPCBwYWdlc19wZXJfYmxr ICogcmtuYW5kLT5ib290X2Jsa3MpICYmCj4gPj4gKwnCoMKgwqAgKGNoaXAtPm9wdGlvbnMgJiBO QU5EX0lTX0JPT1RfTUVESVVNKSkgewo+ID4+ICsJYm9vdF9yb21fbW9kZSA9IDE7Cj4gPj4gKwlp ZiAocmtuYW5kLT5ib290X2VjYyAhPSBlY2MtPnN0cmVuZ3RoKQo+ID4+ICsJcmtfbmZjX2h3X2Vj Y19zZXR1cChjaGlwLCBlY2MsCj4gPj4gKwnCoMKgwqAgcmtuYW5kLT5ib290X2VjYyk7Cj4gPj4g Kwl9Cj4gPj4gKwo+ID4+ICsJZm9yIChpID0gMDsgaSA8IGVjYy0+c3RlcHM7IGkrKykgewo+ID4+ ICsJaWYgKCFpKSB7Cj4gPj4gKwlyZWcgPSAweEZGRkZGRkZGOwo+ID4+ICsJfSBlbHNlIHsKPiA+ PiArCW9vYiA9IGNoaXAtPm9vYl9wb2kgKyAoaSAtIDEpICogTkZDX1NZU19EQVRBX1NJWkU7Cj4g Pj4gKwlyZWcgPSBvb2JbMF0gfCBvb2JbMV0gPDwgOCB8IG9vYlsyXSA8PCAxNiB8Cj4gPj4gKwnC oMKgwqDCoMKgIG9vYlszXSA8PCAyNDsKPiA+PiArCX0KPiA+PiArCWlmICghaSAmJiBib290X3Jv bV9tb2RlKQo+ID4+ICsJcmVnID0gKHBhZ2UgJiAocGFnZXNfcGVyX2JsayAtIDEpKSAqIDQ7Cj4g Pj4gKwo+ID4+ICsJaWYgKG5mYy0+Y2ZnLT50eXBlID09IE5GQ19WOSkKPiA+PiArCW5mYy0+b29i X2J1ZltpXSA9IHJlZzsKPiA+PiArCWVsc2UKPiA+PiArCW5mYy0+b29iX2J1ZltpICogKG9vYl9z dGVwIC8gNCldID0gcmVnOwo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCWRtYV9kYXRhID0gZG1hX21h cF9zaW5nbGUobmZjLT5kZXYsICh2b2lkICopbmZjLT5wYWdlX2J1ZiwKPiA+PiArCcKgIG10ZC0+ d3JpdGVzaXplLCBETUFfVE9fREVWSUNFKTsKPiA+PiArCWRtYV9vb2IgPSBkbWFfbWFwX3Npbmds ZShuZmMtPmRldiwgbmZjLT5vb2JfYnVmLAo+ID4+ICsJZWNjLT5zdGVwcyAqIG9vYl9zdGVwLAo+ ID4+ICsJRE1BX1RPX0RFVklDRSk7Cj4gPj4gKwo+ID4+ICsJcmVpbml0X2NvbXBsZXRpb24oJm5m Yy0+ZG9uZSk7Cj4gPj4gKwl3cml0ZWwoSU5UX0RNQSwgbmZjLT5yZWdzICsgbmZjLT5jZmctPmlu dF9lbl9vZmYpOwo+ID4+ICsKPiA+PiArCXJrX25mY194ZmVyX3N0YXJ0KG5mYywgTkZDX1dSSVRF LCBlY2MtPnN0ZXBzLCBkbWFfZGF0YSwKPiA+PiArCcKgIGRtYV9vb2IpOwo+ID4+ICsJcmV0ID0g d2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZuZmMtPmRvbmUsCj4gPj4gKwnCoCBtc2Vjc190 b19qaWZmaWVzKDEwMCkpOwo+ID4+ICsJaWYgKCFyZXQpCj4gPj4gKwlkZXZfd2FybihuZmMtPmRl diwgIndyaXRlOiB3YWl0IGRtYSBkb25lIHRpbWVvdXQuXG4iKTsKPiA+PiArCS8qCj4gPj4gKwkq IFdoZXRoZXIgdGhlIERNQSB0cmFuc2ZlciBpcyBjb21wbGV0ZWQgb3Igbm90LiBUaGUgZHJpdmVy Cj4gPj4gKwkqIG5lZWRzIHRvIGNoZWNrIHRoZSBORkNgcyBzdGF0dXMgcmVnaXN0ZXIgdG8gc2Vl IGlmIHRoZSBkYXRhCj4gPj4gKwkqIHRyYW5zZmVyIHdhcyBjb21wbGV0ZWQuCj4gPj4gKwkqLwo+ ID4+ICsJcmV0ID0gcmtfbmZjX3dhaXRfZm9yX3hmZXJfZG9uZShuZmMpOwo+ID4+ICsKPiA+PiAr CWRtYV91bm1hcF9zaW5nbGUobmZjLT5kZXYsIGRtYV9kYXRhLCBtdGQtPndyaXRlc2l6ZSwKPiA+ PiArCURNQV9UT19ERVZJQ0UpOwo+ID4+ICsJZG1hX3VubWFwX3NpbmdsZShuZmMtPmRldiwgZG1h X29vYiwgZWNjLT5zdGVwcyAqIG9vYl9zdGVwLAo+ID4+ICsJRE1BX1RPX0RFVklDRSk7Cj4gPj4g Kwo+ID4+ICsJaWYgKGJvb3Rfcm9tX21vZGUgJiYgcmtuYW5kLT5ib290X2VjYyAhPSBlY2MtPnN0 cmVuZ3RoKQo+ID4+ICsJcmtfbmZjX2h3X2VjY19zZXR1cChjaGlwLCBlY2MsIGVjYy0+c3RyZW5n dGgpOwo+ID4+ICsKPiA+PiArCWlmIChyZXQpIHsKPiA+PiArCXJldCA9IC1FSU87Cj4gPj4gKwlk ZXZfZXJyKG5mYy0+ZGV2LAo+ID4+ICsJIndyaXRlOiB3YWl0IHRyYW5zZmVyIGRvbmUgdGltZW91 dC5cbiIpOwo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCWlmIChyZXQpCj4gPj4gKwlyZXR1cm4gcmV0 Owo+ID4+ICsKPiA+PiArCXJldCA9IG5hbmRfcHJvZ19wYWdlX2VuZF9vcChjaGlwKTsKPiA+PiAr Cj4gPj4gKwkvKgo+ID4+ICsJKiBEZXNlbGVjdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRhcmdl dCBhZnRlciB0aGUgb3BzIGlzIGRvbmUKPiA+PiArCSogdG8gcmVkdWNlIHRoZSBwb3dlciBjb25z dW1wdGlvbi4KPiA+PiArCSovICAKPiA+Cj4gPklmIHlvdSBmb3JjZSB0aGlzIGRlc2VsZWN0aW9u LCB5b3VyIHNob3VsZCBwcm9iYWJseSBkbyBpdCBldmVuIGluIGNhc2UKPiA+b2YgZXJyb3I/Cj4g PiAgCj4gPj4gKwlya19uZmNfc2VsZWN0X2NoaXAoY2hpcCwgLTEpOwo+ID4+ICsKPiA+PiArCXJl dHVybiByZXQ7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyBpbnQgcmtfbmZjX3JlYWRfcGFn ZV9yYXcoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgdTggKmJ1ZiwgaW50IG9vYl9vbiwKPiA+PiAr CWludCBwYWdlKQo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9f bXRkKGNoaXApOwo+ID4+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxl cl9kYXRhKGNoaXApOwo+ID4+ICsJc3RydWN0IG5hbmRfZWNjX2N0cmwgKmVjYyA9ICZjaGlwLT5l Y2M7Cj4gPj4gKwlpbnQgaTsKPiA+PiArCj4gPj4gKwluYW5kX3JlYWRfcGFnZV9vcChjaGlwLCBw YWdlLCAwLCBOVUxMLCAwKTsKPiA+PiArCXJrX25mY19yZWFkX2J1ZihuZmMsIG5mYy0+YnVmZmVy LCBtdGQtPndyaXRlc2l6ZSArIG10ZC0+b29ic2l6ZSk7Cj4gPj4gKwo+ID4+ICsJLyoKPiA+PiAr CSogRGVzZWxlY3QgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0YXJnZXQgYWZ0ZXIgdGhlIG9wcyBp cyBkb25lCj4gPj4gKwkqIHRvIHJlZHVjZSB0aGUgcG93ZXIgY29uc3VtcHRpb24uCj4gPj4gKwkq Lwo+ID4+ICsJcmtfbmZjX3NlbGVjdF9jaGlwKGNoaXAsIC0xKTsKPiA+PiArCj4gPj4gKwlmb3Ig KGkgPSAwOyBpIDwgZWNjLT5zdGVwczsgaSsrKSB7Cj4gPj4gKwkvKgo+ID4+ICsJKiBUaGUgZmly c3QgZm91ciBieXRlcyBvZiBPT0IgYXJlIHJlc2VydmVkIGZvciB0aGUKPiA+PiArCSogYm9vdCBS T00uIEluIHNvbWUgZGVidWdnaW5nIGNhc2VzLCBzdWNoIGFzIHdpdGggYSByZWFkLAo+ID4+ICsJ KiBlcmFzZSBhbmQgd3JpdGUgYmFjayB0ZXN0LCB0aGVzZSA0IGJ5dGVzIGFsc28gbXVzdCBiZQo+ ID4+ICsJKiBzYXZlZCBzb21ld2hlcmUsIG90aGVyd2lzZSB0aGlzIGluZm9ybWF0aW9uIHdpbGwg YmUKPiA+PiArCSogbG9zdCBkdXJpbmcgYSB3cml0ZSBiYWNrLiAgCj4gPgo+ID5EaXR0bwo+ID4g IAo+ID4+ICsJKi8KPiA+PiArCWlmICghaSkKPiA+PiArCW1lbWNweShya19uZmNfYnVmX3RvX29v Yl9wdHIoY2hpcCwgZWNjLT5zdGVwcyAtIDEpLAo+ID4+ICsJwqDCoMKgwqDCoMKgIHJrX25mY19v b2JfcHRyKGNoaXAsIGkpLAo+ID4+ICsJwqDCoMKgwqDCoMKgIE5GQ19TWVNfREFUQV9TSVpFKTsK PiA+PiArCWVsc2UKPiA+PiArCW1lbWNweShya19uZmNfYnVmX3RvX29vYl9wdHIoY2hpcCwgaSAt IDEpLAo+ID4+ICsJwqDCoMKgwqDCoMKgIHJrX25mY19vb2JfcHRyKGNoaXAsIGkpLAo+ID4+ICsJ wqDCoMKgwqDCoMKgIE5GQ19TWVNfREFUQV9TSVpFKTsKPiA+PiArCS8qIENvcHkgRUNDIGRhdGEg ZnJvbSB0aGUgTkZDIGJ1ZmZlci4gKi8KPiA+PiArCW1lbWNweShya19uZmNfYnVmX3RvX29vYl9l Y2NfcHRyKGNoaXAsIGkpLAo+ID4+ICsJwqDCoMKgwqDCoMKgIHJrX25mY19vb2JfcHRyKGNoaXAs IGkpICsgTkZDX1NZU19EQVRBX1NJWkUsCj4gPj4gKwnCoMKgwqDCoMKgwqAgZWNjLT5ieXRlcyk7 Cj4gPj4gKwkvKiBDb3B5IGRhdGEgZnJvbSB0aGUgTkZDIGJ1ZmZlci4gKi8KPiA+PiArCWlmIChi dWYpCj4gPj4gKwltZW1jcHkocmtfbmZjX2J1Zl90b19kYXRhX3B0cihjaGlwLCBidWYsIGkpLAo+ ID4+ICsJwqDCoMKgwqDCoMKgIHJrX25mY19kYXRhX3B0cihjaGlwLCBpKSwKPiA+PiArCcKgwqDC oMKgwqDCoCBlY2MtPnNpemUpOwo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCXJldHVybiAwOwo+ID4+ ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgaW50IHJrX25mY19yZWFkX29vYihzdHJ1Y3QgbmFuZF9j aGlwICpjaGlwLCBpbnQgcGFnZSkKPiA+PiArewo+ID4+ICsJcmV0dXJuIHJrX25mY19yZWFkX3Bh Z2VfcmF3KGNoaXAsIE5VTEwsIDEsIHBhZ2UpOyAgCj4gPgo+ID5EaXR0bwo+ID4gIAo+ID4+ICt9 Cj4gPj4gKwo+ID4+ICtzdGF0aWMgaW50IHJrX25mY19yZWFkX3BhZ2VfaHdlY2Moc3RydWN0IG5h bmRfY2hpcCAqY2hpcCwgdTggKmJ1ZiwgaW50IG9vYl9vbiwKPiA+PiArCcKgIGludCBwYWdlKQo+ ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKGNoaXApOwo+ ID4+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXAp Owo+ID4+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZCA9IHJrX25mY190b19ya25h bmQoY2hpcCk7Cj4gPj4gKwlzdHJ1Y3QgbmFuZF9lY2NfY3RybCAqZWNjID0gJmNoaXAtPmVjYzsK PiA+PiArCWludCBvb2Jfc3RlcCA9IChlY2MtPmJ5dGVzID4gNjApID8gTkZDX01BWF9PT0JfUEVS X1NURVAgOgo+ID4+ICsJTkZDX01JTl9PT0JfUEVSX1NURVA7Cj4gPj4gKwlpbnQgcGFnZXNfcGVy X2JsayA9IG10ZC0+ZXJhc2VzaXplIC8gbXRkLT53cml0ZXNpemU7Cj4gPj4gKwlkbWFfYWRkcl90 IGRtYV9kYXRhLCBkbWFfb29iOwo+ID4+ICsJaW50IHJldCA9IDAsIGksIGJvb3Rfcm9tX21vZGUg PSAwOwo+ID4+ICsJaW50IGJpdGZsaXBzID0gMCwgYmNoX3N0Owo+ID4+ICsJdTggKm9vYjsKPiA+ PiArCXUzMiB0bXA7Cj4gPj4gKwo+ID4+ICsJbmFuZF9yZWFkX3BhZ2Vfb3AoY2hpcCwgcGFnZSwg MCwgTlVMTCwgMCk7Cj4gPj4gKwo+ID4+ICsJZG1hX2RhdGEgPSBkbWFfbWFwX3NpbmdsZShuZmMt PmRldiwgbmZjLT5wYWdlX2J1ZiwKPiA+PiArCcKgIG10ZC0+d3JpdGVzaXplLAo+ID4+ICsJwqAg RE1BX0ZST01fREVWSUNFKTsKPiA+PiArCWRtYV9vb2IgPSBkbWFfbWFwX3NpbmdsZShuZmMtPmRl diwgbmZjLT5vb2JfYnVmLAo+ID4+ICsJZWNjLT5zdGVwcyAqIG9vYl9zdGVwLAo+ID4+ICsJRE1B X0ZST01fREVWSUNFKTsKPiA+PiArCj4gPj4gKwkvKgo+ID4+ICsJKiBUaGUgZmlyc3QgYmxvY2tz ICg0LCA4IG9yIDE2IGRlcGVuZGluZyBvbiB0aGUgZGV2aWNlKQo+ID4+ICsJKiBhcmUgdXNlZCBi eSB0aGUgYm9vdCBST00uCj4gPj4gKwkqIENvbmZpZ3VyZSB0aGUgRUNDIGFsZ29yaXRobSBzdXBw b3J0ZWQgYnkgdGhlIGJvb3QgUk9NLgo+ID4+ICsJKi8KPiA+PiArCWlmICgocGFnZSA8IHBhZ2Vz X3Blcl9ibGsgKiBya25hbmQtPmJvb3RfYmxrcykgJiYKPiA+PiArCcKgwqDCoCAoY2hpcC0+b3B0 aW9ucyAmIE5BTkRfSVNfQk9PVF9NRURJVU0pKSB7Cj4gPj4gKwlib290X3JvbV9tb2RlID0gMTsK PiA+PiArCWlmIChya25hbmQtPmJvb3RfZWNjICE9IGVjYy0+c3RyZW5ndGgpCj4gPj4gKwlya19u ZmNfaHdfZWNjX3NldHVwKGNoaXAsIGVjYywKPiA+PiArCcKgwqDCoCBya25hbmQtPmJvb3RfZWNj KTsKPiA+PiArCX0KPiA+PiArCj4gPj4gKwlyZWluaXRfY29tcGxldGlvbigmbmZjLT5kb25lKTsK PiA+PiArCXdyaXRlbChJTlRfRE1BLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+aW50X2VuX29mZik7 Cj4gPj4gKwlya19uZmNfeGZlcl9zdGFydChuZmMsIE5GQ19SRUFELCBlY2MtPnN0ZXBzLCBkbWFf ZGF0YSwKPiA+PiArCcKgIGRtYV9vb2IpOwo+ID4+ICsJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlv bl90aW1lb3V0KCZuZmMtPmRvbmUsCj4gPj4gKwnCoCBtc2Vjc190b19qaWZmaWVzKDEwMCkpOwo+ ID4+ICsJaWYgKCFyZXQpCj4gPj4gKwlkZXZfd2FybihuZmMtPmRldiwgInJlYWQ6IHdhaXQgZG1h IGRvbmUgdGltZW91dC5cbiIpOwo+ID4+ICsJLyoKPiA+PiArCSogV2hldGhlciB0aGUgRE1BIHRy YW5zZmVyIGlzIGNvbXBsZXRlZCBvciBub3QuIFRoZSBkcml2ZXIKPiA+PiArCSogbmVlZHMgdG8g Y2hlY2sgdGhlIE5GQ2BzIHN0YXR1cyByZWdpc3RlciB0byBzZWUgaWYgdGhlIGRhdGEKPiA+PiAr CSogdHJhbnNmZXIgd2FzIGNvbXBsZXRlZC4KPiA+PiArCSovCj4gPj4gKwlyZXQgPSBya19uZmNf d2FpdF9mb3JfeGZlcl9kb25lKG5mYyk7Cj4gPj4gKwlkbWFfdW5tYXBfc2luZ2xlKG5mYy0+ZGV2 LCBkbWFfZGF0YSwgbXRkLT53cml0ZXNpemUsCj4gPj4gKwlETUFfRlJPTV9ERVZJQ0UpOwo+ID4+ ICsJZG1hX3VubWFwX3NpbmdsZShuZmMtPmRldiwgZG1hX29vYiwgZWNjLT5zdGVwcyAqIG9vYl9z dGVwLAo+ID4+ICsJRE1BX0ZST01fREVWSUNFKTsKPiA+PiArCj4gPj4gKwlpZiAocmV0KSB7Cj4g Pj4gKwliaXRmbGlwcyA9IC1FSU87Cj4gPj4gKwlkZXZfZXJyKG5mYy0+ZGV2LAo+ID4+ICsJInJl YWQ6IHdhaXQgdHJhbnNmZXIgZG9uZSB0aW1lb3V0LlxuIik7Cj4gPj4gKwlnb3RvIG91dDsKPiA+ PiArCX0KPiA+PiArCj4gPj4gKwlmb3IgKGkgPSAxOyBpIDwgZWNjLT5zdGVwczsgaSsrKSB7Cj4g Pj4gKwlvb2IgPSBjaGlwLT5vb2JfcG9pICsgKGkgLSAxKSAqIE5GQ19TWVNfREFUQV9TSVpFOwo+ ID4+ICsJaWYgKG5mYy0+Y2ZnLT50eXBlID09IE5GQ19WOSkKPiA+PiArCXRtcCA9IG5mYy0+b29i X2J1ZltpXTsKPiA+PiArCWVsc2UKPiA+PiArCXRtcCA9IG5mYy0+b29iX2J1ZltpICogKG9vYl9z dGVwIC8gNCldOwo+ID4+ICsJKm9vYisrID0gKHU4KXRtcDsKPiA+PiArCSpvb2IrKyA9ICh1OCko dG1wID4+IDgpOwo+ID4+ICsJKm9vYisrID0gKHU4KSh0bXAgPj4gMTYpOwo+ID4+ICsJKm9vYisr ID0gKHU4KSh0bXAgPj4gMjQpOwo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCWZvciAoaSA9IDA7IGkg PCAoZWNjLT5zdGVwcyAvIDIpOyBpKyspIHsKPiA+PiArCWJjaF9zdCA9IHJlYWRsX3JlbGF4ZWQo bmZjLT5yZWdzICsKPiA+PiArCcKgwqDCoMKgwqDCoCBuZmMtPmNmZy0+YmNoX3N0X29mZiArIGkg KiA0KTsKPiA+PiArCWlmIChiY2hfc3QgJiBCSVQobmZjLT5jZmctPmVjYzAuZXJyX2ZsYWdfYml0 KSB8fAo+ID4+ICsJwqDCoMKgIGJjaF9zdCAmIEJJVChuZmMtPmNmZy0+ZWNjMS5lcnJfZmxhZ19i aXQpKSB7Cj4gPj4gKwltdGQtPmVjY19zdGF0cy5mYWlsZWQrKzsKPiA+PiArCWJpdGZsaXBzID0g MDsKPiA+PiArCX0gZWxzZSB7Cj4gPj4gKwlyZXQgPSBFQ0NfRVJSX0NOVChiY2hfc3QsIG5mYy0+ Y2ZnLT5lY2MwKTsKPiA+PiArCW10ZC0+ZWNjX3N0YXRzLmNvcnJlY3RlZCArPSByZXQ7Cj4gPj4g KwliaXRmbGlwcyA9IG1heF90KHUzMiwgYml0ZmxpcHMsIHJldCk7Cj4gPj4gKwo+ID4+ICsJcmV0 ID0gRUNDX0VSUl9DTlQoYmNoX3N0LCBuZmMtPmNmZy0+ZWNjMSk7Cj4gPj4gKwltdGQtPmVjY19z dGF0cy5jb3JyZWN0ZWQgKz0gcmV0Owo+ID4+ICsJYml0ZmxpcHMgPSBtYXhfdCh1MzIsIGJpdGZs aXBzLCByZXQpOwo+ID4+ICsJfQo+ID4+ICsJfQo+ID4+ICtvdXQ6Cj4gPj4gKwltZW1jcHkoYnVm LCBuZmMtPnBhZ2VfYnVmLCBtdGQtPndyaXRlc2l6ZSk7Cj4gPj4gKwo+ID4+ICsJaWYgKGJvb3Rf cm9tX21vZGUgJiYgcmtuYW5kLT5ib290X2VjYyAhPSBlY2MtPnN0cmVuZ3RoKQo+ID4+ICsJcmtf bmZjX2h3X2VjY19zZXR1cChjaGlwLCBlY2MsIGVjYy0+c3RyZW5ndGgpOwo+ID4+ICsKPiA+PiAr CWlmIChiaXRmbGlwcyA+IGVjYy0+c3RyZW5ndGgpCj4gPj4gKwlkZXZfZXJyKG5mYy0+ZGV2LCAi cmVhZCBwYWdlOiAleCBlY2MgZXJyb3IhXG4iLCBwYWdlKTsKPiA+PiArCj4gPj4gKwkvKgo+ID4+ ICsJKiBEZXNlbGVjdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRhcmdldCBhZnRlciB0aGUgb3Bz IGlzIGRvbmUKPiA+PiArCSogdG8gcmVkdWNlIHRoZSBwb3dlciBjb25zdW1wdGlvbi4KPiA+PiAr CSovCj4gPj4gKwlya19uZmNfc2VsZWN0X2NoaXAoY2hpcCwgLTEpOwo+ID4+ICsKPiA+PiArCXJl dHVybiBiaXRmbGlwczsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGlubGluZSB2b2lkIHJr X25mY19od19pbml0KHN0cnVjdCBya19uZmMgKm5mYykKPiA+PiArewo+ID4+ICsJLyogRGlzYWJs ZSBmbGFzaCB3cC4gKi8KPiA+PiArCXdyaXRlbChGTUNUTF9XUCwgbmZjLT5yZWdzICsgTkZDX0ZN Q1RMKTsKPiA+PiArCS8qIENvbmZpZyBkZWZhdWx0IHRpbWluZyA0MG5zIGF0IDE1MCBNaHogbmZj IGNsb2NrLiAqLwo+ID4+ICsJd3JpdGVsKDB4MTA4MSwgbmZjLT5yZWdzICsgTkZDX0ZNV0FJVCk7 Cj4gPj4gKwkvKiBEaXNhYmxlIHJhbmRvbWl6ZXIgYW5kIERNQS4gKi8KPiA+PiArCXdyaXRlbCgw LCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+cmFuZG16X29mZik7Cj4gPj4gKwl3cml0ZWwoMCwgbmZj LT5yZWdzICsgbmZjLT5jZmctPmRtYV9jZmdfb2ZmKTsKPiA+PiArCXdyaXRlbChGTENUTF9SU1Qs IG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5mbGN0bF9vZmYpOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtz dGF0aWMgaXJxcmV0dXJuX3QgcmtfbmZjX2lycShpbnQgaXJxLCB2b2lkICppZCkKPiA+PiArewo+ ID4+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gaWQ7Cj4gPj4gKwl1MzIgc3RhLCBpZW47Cj4gPj4g Kwo+ID4+ICsJc3RhID0gcmVhZGxfcmVsYXhlZChuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+aW50X3N0 X29mZik7Cj4gPj4gKwlpZW4gPSByZWFkbF9yZWxheGVkKG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5p bnRfZW5fb2ZmKTsKPiA+PiArCj4gPj4gKwlpZiAoIShzdGEgJiBpZW4pKQo+ID4+ICsJcmV0dXJu IElSUV9OT05FOwo+ID4+ICsKPiA+PiArCXdyaXRlbChzdGEsIG5mYy0+cmVncyArIG5mYy0+Y2Zn LT5pbnRfY2xyX29mZik7Cj4gPj4gKwl3cml0ZWwofnN0YSAmIGllbiwgbmZjLT5yZWdzICsgbmZj LT5jZmctPmludF9lbl9vZmYpOwo+ID4+ICsKPiA+PiArCWNvbXBsZXRlKCZuZmMtPmRvbmUpOwo+ ID4+ICsKPiA+PiArCXJldHVybiBJUlFfSEFORExFRDsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3Rh dGljIGludCBya19uZmNfZW5hYmxlX2Nsa3Moc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgcmtf bmZjICpuZmMpCj4gPj4gK3sKPiA+PiArCWludCByZXQ7Cj4gPj4gKwo+ID4+ICsJaWYgKCFJU19F UlIobmZjLT5uZmNfY2xrKSkgewo+ID4+ICsJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKG5mYy0+ bmZjX2Nsayk7Cj4gPj4gKwlpZiAocmV0KSB7Cj4gPj4gKwlkZXZfZXJyKGRldiwgImZhaWxlZCB0 byBlbmFibGUgbmZjIGNsa1xuIik7Cj4gPj4gKwlyZXR1cm4gcmV0Owo+ID4+ICsJfQo+ID4+ICsJ fQo+ID4+ICsKPiA+PiArCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShuZmMtPmFoYl9jbGspOwo+ ID4+ICsJaWYgKHJldCkgewo+ID4+ICsJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZW5hYmxlIGFo YiBjbGtcbiIpOwo+ID4+ICsJaWYgKCFJU19FUlIobmZjLT5uZmNfY2xrKSkKPiA+PiArCWNsa19k aXNhYmxlX3VucHJlcGFyZShuZmMtPm5mY19jbGspOwo+ID4+ICsJcmV0dXJuIHJldDsKPiA+PiAr CX0KPiA+PiArCj4gPj4gKwlyZXR1cm4gMDsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIHZv aWQgcmtfbmZjX2Rpc2FibGVfY2xrcyhzdHJ1Y3QgcmtfbmZjICpuZmMpCj4gPj4gK3sKPiA+PiAr CWlmICghSVNfRVJSKG5mYy0+bmZjX2NsaykpCj4gPj4gKwljbGtfZGlzYWJsZV91bnByZXBhcmUo bmZjLT5uZmNfY2xrKTsKPiA+PiArCWNsa19kaXNhYmxlX3VucHJlcGFyZShuZmMtPmFoYl9jbGsp Owo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgaW50IHJrX25mY19vb2JsYXlvdXRfZnJlZShz dHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IHNlY3Rpb24sCj4gPj4gKwlzdHJ1Y3QgbXRkX29vYl9y ZWdpb24gKm9vYl9yZWdpb24pCj4gPj4gK3sKPiA+PiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAg PSBtdGRfdG9fbmFuZChtdGQpOwo+ID4+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFu ZCA9IHJrX25mY190b19ya25hbmQoY2hpcCk7Cj4gPj4gKwo+ID4+ICsJaWYgKHNlY3Rpb24pCj4g Pj4gKwlyZXR1cm4gLUVSQU5HRTsKPiA+PiArCj4gPj4gKwkvKgo+ID4+ICsJKiBUaGUgYmVnaW5u aW5nIG9mIHRoZSBPT0IgYXJlYSBzdG9yZXMgdGhlIHJlc2VydmVkIGRhdGEgZm9yIHRoZSBORkMs Cj4gPj4gKwkqIHRoZSBzaXplIG9mIHRoZSByZXNlcnZlZCBkYXRhIGlzIE5GQ19TWVNfREFUQV9T SVpFIGJ5dGVzLgo+ID4+ICsJKi8KPiA+PiArCW9vYl9yZWdpb24tPmxlbmd0aCA9IHJrbmFuZC0+ bWV0YWRhdGFfc2l6ZSAtIE5GQ19TWVNfREFUQV9TSVpFIC0gMjsKPiA+PiArCW9vYl9yZWdpb24t Pm9mZnNldCA9IE5GQ19TWVNfREFUQV9TSVpFICsgMjsKPiA+PiArCj4gPj4gKwlyZXR1cm4gMDsK PiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGludCBya19uZmNfb29ibGF5b3V0X2VjYyhzdHJ1 Y3QgbXRkX2luZm8gKm10ZCwgaW50IHNlY3Rpb24sCj4gPj4gKwlzdHJ1Y3QgbXRkX29vYl9yZWdp b24gKm9vYl9yZWdpb24pCj4gPj4gK3sKPiA+PiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBt dGRfdG9fbmFuZChtdGQpOwo+ID4+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZCA9 IHJrX25mY190b19ya25hbmQoY2hpcCk7Cj4gPj4gKwo+ID4+ICsJaWYgKHNlY3Rpb24pCj4gPj4g KwlyZXR1cm4gLUVSQU5HRTsKPiA+PiArCj4gPj4gKwlvb2JfcmVnaW9uLT5sZW5ndGggPSBtdGQt Pm9vYnNpemUgLSBya25hbmQtPm1ldGFkYXRhX3NpemU7Cj4gPj4gKwlvb2JfcmVnaW9uLT5vZmZz ZXQgPSBya25hbmQtPm1ldGFkYXRhX3NpemU7Cj4gPj4gKwo+ID4+ICsJcmV0dXJuIDA7Cj4gPj4g K30KPiA+PiArCj4gPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRkX29vYmxheW91dF9vcHMgcmtf bmZjX29vYmxheW91dF9vcHMgPSB7Cj4gPj4gKwkuZnJlZSA9IHJrX25mY19vb2JsYXlvdXRfZnJl ZSwKPiA+PiArCS5lY2MgPSBya19uZmNfb29ibGF5b3V0X2VjYywKPiA+PiArfTsKPiA+PiArCj4g Pj4gK3N0YXRpYyBpbnQgcmtfbmZjX2VjY19pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0 IG10ZF9pbmZvICptdGQpCj4gPj4gK3sKPiA+PiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBt dGRfdG9fbmFuZChtdGQpOwo+ID4+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29u dHJvbGxlcl9kYXRhKGNoaXApOwo+ID4+ICsJc3RydWN0IG5hbmRfZWNjX2N0cmwgKmVjYyA9ICZj aGlwLT5lY2M7Cj4gPj4gKwljb25zdCB1OCAqc3RyZW5ndGhzID0gbmZjLT5jZmctPmVjY19zdHJl bmd0aHM7Cj4gPj4gKwl1OCBtYXhfc3RyZW5ndGgsIG5mY19tYXhfc3RyZW5ndGg7Cj4gPj4gKwlp bnQgaTsKPiA+PiArCj4gPj4gKwluZmNfbWF4X3N0cmVuZ3RoID0gbmZjLT5jZmctPmVjY19zdHJl bmd0aHNbMF07Cj4gPj4gKwkvKiBJZiBvcHRpb25hbCBkdCBzZXR0aW5ncyBub3QgcHJlc2VudC4g Ki8KPiA+PiArCWlmICghZWNjLT5zaXplIHx8ICFlY2MtPnN0cmVuZ3RoIHx8Cj4gPj4gKwnCoMKg wqAgZWNjLT5zdHJlbmd0aCA+IG5mY19tYXhfc3RyZW5ndGgpIHsKPiA+PiArCWNoaXAtPmVjYy5z aXplID0gMTAyNDsKPiA+PiArCWVjYy0+c3RlcHMgPSBtdGQtPndyaXRlc2l6ZSAvIGVjYy0+c2l6 ZTsKPiA+PiArCj4gPj4gKwkvKgo+ID4+ICsJKiBIVyBFQ0MgYWx3YXlzIHJlcXVlc3RzIHRoZSBu dW1iZXIgb2YgRUNDIGJ5dGVzIHBlciAxMDI0IGJ5dGUKPiA+PiArCSogYmxvY2tzLiBUaGUgZmly c3QgNCBPT0IgYnl0ZXMgYXJlIHJlc2VydmVkIGZvciBzeXMgZGF0YS4KPiA+PiArCSovCj4gPj4g KwltYXhfc3RyZW5ndGggPSAoKG10ZC0+b29ic2l6ZSAvIGVjYy0+c3RlcHMpIC0gNCkgKiA4IC8K PiA+PiArCWZscyg4ICogMTAyNCk7Cj4gPj4gKwlpZiAobWF4X3N0cmVuZ3RoID4gbmZjX21heF9z dHJlbmd0aCkKPiA+PiArCW1heF9zdHJlbmd0aCA9IG5mY19tYXhfc3RyZW5ndGg7Cj4gPj4gKwo+ ID4+ICsJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewo+ID4+ICsJaWYgKG1heF9zdHJlbmd0aCA+ PSBzdHJlbmd0aHNbaV0pCj4gPj4gKwlicmVhazsKPiA+PiArCX0KPiA+PiArCj4gPj4gKwlpZiAo aSA+PSA0KSB7Cj4gPj4gKwlkZXZfZXJyKG5mYy0+ZGV2LCAiVW5zdXBwb3J0ZWQgRUNDIHN0cmVu Z3RoXG4iKTsKPiA+PiArCXJldHVybiAtRU9QTk9UU1VQUDsKPiA+PiArCX0KPiA+PiArCj4gPj4g KwllY2MtPnN0cmVuZ3RoID0gc3RyZW5ndGhzW2ldOwo+ID4+ICsJfQo+ID4+ICsJZWNjLT5zdGVw cyA9IG10ZC0+d3JpdGVzaXplIC8gZWNjLT5zaXplOwo+ID4+ICsJZWNjLT5ieXRlcyA9IERJVl9S T1VORF9VUChlY2MtPnN0cmVuZ3RoICogZmxzKDggKiAxMDI0KSwgOCk7ICAKPiA+Cj4gPkhlcmUg eW91IGFzc3VtZSAxMDI0IEVDQyBzdGVwIHNpemUsIHRoaXMgaXMgd3JvbmcuIEVpdGhlciB0aGUK PiA+Y29udHJvbGxlciBvbmx5IHN1cHBvcnRzIDEwMjQgYnl0ZXMgb3IgeW91IG9mZmljaWFsbHkg c3RhdGUgc29tZXdoZXJlCj4gPnRoYXQgeW91IGRvbid0IHN1cHBvcnQgbW9yZSBFQ0Mgc3RlcCBz aXplcyB5ZXQuCj4gPiAgCj4gPj4gKwkvKiBIVyBFQ0MgYWx3YXlzIHdvcmsgd2l0aCBldmVuIG51 bWJlcnMgb2YgRUNDIGJ5dGVzLiAqLwo+ID4+ICsJZWNjLT5ieXRlcyA9IEFMSUdOKGVjYy0+Ynl0 ZXMsIDIpOyAgCj4gPgo+ID5TaG91bGRuJ3QgeW91IGVuc3VyZSB0aGUgbnVtYmVyIG9mIGJ5dGVz IGlzIHJvdW5kZWQgdXAgPyAgCj4gCj4gVGhlIFY2IGFuZMKgVjkgY29udHJvbGxlciBzdXBwb3J0 cyBERFIgbW9kZSwgc28gRUNDIGJ5dGVzIG5lZWQgdG8gYmUgYWxpZ25lZCB0byBhbiBldmVuIG51 bWJlciBpZiBlbmFibGUgRERSIG1vZGUuCj4gVGhpcyBkcml2ZXJzIG5vIHN1cHBvcnQgZGRyIG1v ZGUgbm9377yMSSB3aWxsIGRyb3AgdGhpcyBjb2RlLgo+IAoKSSB0aGluayB5b3VyIGFwcHJvYWNo IGlzIGZpbmUsIEkganVzdCBtaXN1bmRlcnN0b29kIGl0IGJlY2F1c2Ugb2YgdGhlCmNvbW1lbnQu CgpNYXliZSB5b3UgY291bGQ6Ci0gQ3JlYXRlIGEgaGVscGVyIGZvciB0aGF0Ci0gQ29ycmVjdCB0 aGUgY29tbWVudCB0byBjbGVhcmx5IGV4cGxhaW4gd2hhdCB5b3UgZG8gKHlvdXIgZXhwbGFuYXRp b24KICBoZXJlIGlzIHZlcnkgY2xlYXIgdG8gbWUpCi0gSW5jbHVkZSB0aGUgY29tbWVudCBpbiB0 aGUgaGVscGVyLCBub3QgaW4gZWFjaCBmdW5jdGlvbgotIENhbGwgdGhlIGhlbHBlciBpbiBldmVy eSBmdW5jdGlvbiBhY2Nlc3NpbmcgdGhpcyBhcmVhIHVubGVzcyB0aGUKICBibG9jayBpcyByZXNl cnZlZCBmb3IgdGhlIGJvb3Ryb20/CgpUaGFua3MsCk1pcXXDqGwKCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkxpbnV4LXJvY2tjaGlwIG1haWxpbmcgbGlz dApMaW51eC1yb2NrY2hpcEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRl YWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtcm9ja2NoaXAK 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=-11.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_2 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 9F76AC4363A for ; Fri, 30 Oct 2020 10:27:24 +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 0101E20825 for ; Fri, 30 Oct 2020 10:27:23 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="q5P49Wrr" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0101E20825 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=bootlin.com 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:MIME-Version:References:In-Reply-To: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=tc229AGj5k2GwQXZ0gGJF65Dym1A5Ymy0soqZ4Hjdvw=; b=q5P49WrrO2ZblL1DE+SuVBW7u krEE7WOifW5/vNwmiUvvLwhmv0wvo+m60uYUXJks8ld7UqcHNp3HOeqdSRukYPWY8EYF03t1Ya/kX iZcRzFGG0Udj4zLTE/o+xHfWP2MOmj0ND93/Zqmy720w1knc5CFCDB+7dG4CoKlhyu0cs6fwYanU/ gZ9YNl7RgT/deyDJpcXVE5QtJKoUvHjeRBhY7RJPgbEapqqRNF3JPec6CRTjz/075iA5RH4pmp57V zInMWe5nqjmtS8lwfhrsNsrciHrbYPziLMNLcy5XqseScXBgH2d9E6KId3He/sHKY2iFqWvZqnm95 NznpUnhew==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kYRcO-0005ey-4O; Fri, 30 Oct 2020 10:26:48 +0000 Received: from relay6-d.mail.gandi.net ([217.70.183.198]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kYRcJ-0005dh-7Q; Fri, 30 Oct 2020 10:26:45 +0000 X-Originating-IP: 91.224.148.103 Received: from xps13 (unknown [91.224.148.103]) (Authenticated sender: miquel.raynal@bootlin.com) by relay6-d.mail.gandi.net (Postfix) with ESMTPSA id DE32AC0014; Fri, 30 Oct 2020 10:26:37 +0000 (UTC) Date: Fri, 30 Oct 2020 11:26:35 +0100 From: Miquel Raynal To: =?UTF-8?B?6LW15Luq5bOw?= Subject: Re: [PATCH v13 2/8] mtd: rawnand: rockchip: NFC drivers for RK3308, RK2928 and others Message-ID: <20201030112635.162bb709@xps13> In-Reply-To: <20201030181152443876127@rock-chips.com> References: <20201028095326.15562-1-yifeng.zhao@rock-chips.com> <20201028095326.15562-3-yifeng.zhao@rock-chips.com> <20201028114826.6cd6b841@xps13> <20201030181152443876127@rock-chips.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.4 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201030_062643_586125_029F1A58 X-CRM114-Status: GOOD ( 33.92 ) 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: devicetree , vigneshr , richard , linux-kernel , linux-rockchip , robh+dt , linux-mtd , linux-arm-kernel , =?UTF-8?B?SGVpa29TdMO8Ym5lcg==?= 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 SGkg6LW15Luq5bOwLAoK6LW15Luq5bOwIDx5aWZlbmcuemhhb0Byb2NrLWNoaXBzLmNvbT4gd3Jv dGUgb24gRnJpLCAzMCBPY3QgMjAyMCAxODoxMjo1MgorMDgwMDoKCj4gSGkgTWlxdWVsLAo+IAo+ ID5IaSBZaWZlbmcsCj4gPgo+ID5BIGZldyBtb3JlIGNvbW1lbnRzIGJlbG93LCBidXQgb3ZlcmFs bCBsb29rcyBiZXR0ZXIuCj4gPgo+ID5ZaWZlbmcgWmhhbyA8eWlmZW5nLnpoYW9Acm9jay1jaGlw cy5jb20+IHdyb3RlIG9uIFdlZCwgMjggT2N0IDIwMjAKPiA+MTc6NTM6MjQgKzA4MDA6Cj4gPiAg Cj4gPj4gVGhpcyBkcml2ZXIgc3VwcG9ydHMgUm9ja2NoaXAgTkZDIChOQU5EIEZsYXNoIENvbnRy b2xsZXIpIGZvdW5kIG9uIFJLMzMwOCwKPiA+PiBSSzI5MjgsIFJLUFgzMCwgUlYxMTA4IGFuZCBv dGhlciBTT0NzLiBUaGUgZHJpdmVyIGhhcyBiZWVuIHRlc3RlZCB1c2luZwo+ID4+IDgtYml0IE5B TkQgaW50ZXJmYWNlIG9uIHRoZSBBUk0gYmFzZWQgUkszMzA4IHBsYXRmb3JtLgo+ID4+Cj4gPj4g U3VwcG9ydCBSb2NrY2hpcCBTb0NzIGFuZCBORkMgdmVyc2lvbnM6Cj4gPj4gLSBQWDMwIGFuZCBS SzMzMjYoTkZDdjkwMCkuCj4gPj4gRUNDOiAxNi80MC82MC83MCBiaXRzLzFLQi4KPiA+PiBDTE9D SzogYWhiIGFuZCBuZmMuCj4gPj4gLSBSSzMzMDggYW5kIFJWMTEwOChORkN2ODAwKS4KPiA+PiBF Q0M6IDE2IGJpdHMvMUtCLgo+ID4+IENMT0NLOiBhaGIgYW5kIG5mYy4KPiA+PiAtIFJLMzAzNiBh bmQgUkszMTI4KE5GQ3Y2MjIpLgo+ID4+IEVDQzogMTYvMjQvNDAvNjAgYml0cy8xS0IuCj4gPj4g Q0xPQ0s6IGFoYiBhbmQgbmZjLgo+ID4+IC0gUkszMDY2LCBSSzMxODggYW5kIFJLMjkyOChORkN2 NjAwKS4KPiA+PiBFQ0M6IDE2LzI0LzQwLzYwIGJpdHMvMUtCLgo+ID4+IENMT0NLOiBhaGIuCj4g Pj4KPiA+PiBTdXBwb3J0ZWQgZmVhdHVyZXM6Cj4gPj4gLSBSZWFkIGZ1bGwgcGFnZSBkYXRhIGJ5 IERNQS4KPiA+PiAtIFN1cHBvcnQgSFcgRUNDKG9uZSBzdGVwIGlzIDFLQikuCj4gPj4gLSBTdXBw b3J0IDIgLSAzMksgcGFnZSBzaXplLgo+ID4+IC0gU3VwcG9ydCA4IENTKGRlcGVuZCBvbiBTb0Nz KQo+ID4+Cj4gPj4gTGltaXRhdGlvbnM6Cj4gPj4gLSBObyBzdXBwb3J0IGZvciB0aGUgZWNjIHN0 ZXAgc2l6ZSBpcyA1MTIuCj4gPj4gLSBVbnRlc3RlZCBvbiBzb21lIFNvQ3MuCj4gPj4gLSBObyBz dXBwb3J0IGZvciBzdWJwYWdlcy4KPiA+PiAtIE5vIHN1cHBvcnQgZm9yIHRoZSBidWlsdGluIHJh bmRvbWl6ZXIuCj4gPj4gLSBUaGUgb3JpZ2luYWwgYmFkIGJsb2NrIG1hc2sgaXMgbm90IHN1cHBv cnRlZC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlCj4gPj7CoMKgIHRoZSBCQlQoYmFkIGJsb2Nr IHRhYmxlKS4KPiA+Pgo+ID4+IFNpZ25lZC1vZmYtYnk6IFlpZmVuZyBaaGFvIDx5aWZlbmcuemhh b0Byb2NrLWNoaXBzLmNvbT4KPiA+PiAtLS0KPiA+Pgo+ID4+IENoYW5nZXMgaW4gdjEzOgo+ID4+ IC0gVGhlIG5mYy0+YnVmZmVyIHdpbGwgcmVhbGxvYyB3aGlsZSB0aGUgcGFnZSBzaXplIG9mIHRo ZSBzZWNvbmQgbXRkCj4gPj7CoMKgIGlzIGxhcmdlIHRoYW4gdGhlIGZpcnN0IG9uZS4KPiA+PiAt IEZpeCBjb2Rpbmcgc3R5bGUuCj4gPj4gLSBGaXggc29tZSBjb21tZW50cy4KPiA+Pgo+ID4+IENo YW5nZXMgaW4gdjEyOiBOb25lCj4gPj4gQ2hhbmdlcyBpbiB2MTE6Cj4gPj4gLSBGaXggY29tcGls ZSBlcnJvci4KPiA+Pgo+ID4+IENoYW5nZXMgaW4gdjEwOgo+ID4+IC0gRml4IGNvbXBpbGUgZXJy b3Igb24gbWFzdGVyIHY1LjktcmM3Lgo+ID4+Cj4gPj4gQ2hhbmdlcyBpbiB2OToKPiA+PiAtIFRo ZSBuZmMtPmJ1ZmZlciB3aWxsIHJlYWxsb2Mgd2hpbGUgdGhlIHBhZ2Ugc2l6ZSBvZiB0aGUgc2Vj b25kIG10ZAo+ID4+wqDCoCBpcyBsYXJnZSB0aGFuIHRoZSBmaXJzdCBvbmUKPiA+PiAtIEZpeCBj b2Rpbmcgc3R5bGUuCj4gPj4gLSBSZW1vdmUgc3RydWN0IHJrX25mY19jbGsuCj4gPj4gLSBQcmVw ZW5kIHNvbWUgZnVuY3Rpb24gd2l0aCBya19uZmNfLgo+ID4+IC0gUmVwbGFjZSBmdW5jdGlvbiBy ZWFkbF9wb2xsX3RpbWVvdXRfYXRvbWljIHdpdGggcmVhZGxfcmVsYXhlZF9wb2xsX3RpbWVvdXQu Cj4gPj4gLSBSZW1vdmUgZnVuY3Rpb24gcmtfbmZjX3JlYWRfYnl0ZSBhbmQgcmtfbmZjX3dyaXRl X2J5dGUuCj4gPj4gLSBEb24ndCBzZWxlY3QgdGhlIGRpZSBpZiAnY2hlY2tfb25seSA9PSB0cnVl JyBpbiBmdW5jdGlvbiBya19uZmNfZXhlY19vcC4KPiA+PiAtIE1vZGlmeSBmdW5jdGlvbiBya19u ZmNfd3JpdGVfcGFnZSBhbmQgcmtfbmZjX3dyaXRlX3BhZ2VfcmF3Lgo+ID4+Cj4gPj4gQ2hhbmdl cyBpbiB2ODogTm9uZQo+ID4+IENoYW5nZXMgaW4gdjc6Cj4gPj4gLSBSZWJhc2UgdG8gbGludXgt bmV4dC4KPiA+PiAtIEZpeCBjb2Rpbmcgc3R5bGUuCj4gPj4gLSBSZXNlcnZlZCA0IGJ5dGVzIGF0 IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9vYiBhcmVhLgo+ID4+IC0gUGFnZSByYXcgcmVhZCBhbmQg d3JpdGUgaW5jbHVkZWQgZWNjIGRhdGEuCj4gPj4KPiA+PiBDaGFuZ2VzIGluIHY2Ogo+ID4+IC0g VGhlIG10ZC0+bmFtZSBzZXQgYnkgTkFORCBsYWJlbCBwcm9wZXJ0eS4KPiA+PiAtIEFkZCBzb21l IGNvbW1lbnRzLgo+ID4+IC0gRml4IGNvbXBpbGUgZXJyb3IuCj4gPj4KPiA+PiBDaGFuZ2VzIGlu IHY1Ogo+ID4+IC0gQWRkIGJvb3QgYmxvY2tzIHN1cHBvcnTCoCB3aXRoIGRpZmZlcmVudCBFQ0Mg Zm9yIGJvb3RST00uCj4gPj4gLSBSZW5hbWUgcm9ja2NoaXAtbmFuZC5jIHRvIHJvY2tjaGlwLW5h bmQtY29udHJvbGxlci5jLgo+ID4+IC0gVW5pZmljYXRpb24gb2Ygb3RoZXIgdmFyaWFibGUgbmFt ZXMuCj4gPj4gLSBSZW1vdmUgc29tZSBjb21wYXRpYmxlIGRlZmluZS4KPiA+Pgo+ID4+IENoYW5n ZXMgaW4gdjQ6Cj4gPj4gLSBEZWZpbmUgcGxhdGZvcm0gZGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSBy ZWdpc3RlciBvZmZzZXRzLgo+ID4+IC0gVGhlIGNvbXBhdGlibGUgZGVmaW5lIHdpdGggcmt4eF9u ZmMuCj4gPj4gLSBVc2UgU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMgdG8gZGVmaW5lIFBNX09QUy4K PiA+PiAtIFVzZSBleGVjX29wIGluc3RlYWQgb2YgbGVnYWN5IGhvb2tzLgo+ID4+Cj4gPj4gQ2hh bmdlcyBpbiB2MzogTm9uZQo+ID4+IENoYW5nZXMgaW4gdjI6Cj4gPj4gLSBGaXggY29tcGlsZSBl cnJvci4KPiA+PiAtIEluY2x1ZGUgaGVhZGVyIGZpbGVzIHNvcnRlZCBieSBmaWxlIG5hbWUuCj4g Pj4KPiA+PsKgIGRyaXZlcnMvbXRkL25hbmQvcmF3L0tjb25maWfCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHzCoMKgIDEyICsKPiA+PsKgIGRyaXZlcnMvbXRkL25hbmQvcmF3L01h a2VmaWxlwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDCoCAxICsKPiA+PsKg IC4uLi9tdGQvbmFuZC9yYXcvcm9ja2NoaXAtbmFuZC1jb250cm9sbGVyLmPCoMKgIHwgMTQ2MCAr KysrKysrKysrKysrKysrKwo+ID4+wqAgMyBmaWxlcyBjaGFuZ2VkLCAxNDczIGluc2VydGlvbnMo KykKPiA+PsKgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL210ZC9uYW5kL3Jhdy9yb2NrY2hp cC1uYW5kLWNvbnRyb2xsZXIuYwo+ID4+Cj4gPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25h bmQvcmF3L0tjb25maWcgYi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9LY29uZmlnCj4gPj4gaW5kZXgg NmM0NmYyNWI1N2UyLi4yY2M1MzNlNGUyMzkgMTAwNjQ0Cj4gPj4gLS0tIGEvZHJpdmVycy9tdGQv bmFuZC9yYXcvS2NvbmZpZwo+ID4+ICsrKyBiL2RyaXZlcnMvbXRkL25hbmQvcmF3L0tjb25maWcK PiA+PiBAQCAtNDYyLDYgKzQ2MiwxOCBAQCBjb25maWcgTVREX05BTkRfQVJBU0FOCj4gPj7CoCDC oCBFbmFibGVzIHRoZSBkcml2ZXIgZm9yIHRoZSBBcmFzYW4gTkFORCBmbGFzaCBjb250cm9sbGVy IG9uCj4gPj7CoCDCoCBaeW5xIFVsdHJhc2NhbGUrIE1QU29DLgo+ID4+wqAKPiA+PiArY29uZmln IE1URF9OQU5EX1JPQ0tDSElQCj4gPj4gKwl0cmlzdGF0ZSAiUm9ja2NoaXAgTkFORCBjb250cm9s bGVyIgo+ID4+ICsJZGVwZW5kcyBvbiBBUkNIX1JPQ0tDSElQICYmIEhBU19JT01FTQo+ID4+ICsJ aGVscAo+ID4+ICsJwqAgRW5hYmxlcyBzdXBwb3J0IGZvciBOQU5EIGNvbnRyb2xsZXIgb24gUm9j a2NoaXAgU29Dcy4KPiA+PiArCcKgIFRoZXJlIGFyZSBmb3VyIGRpZmZlcmVudCB2ZXJzaW9ucyBv ZiBOQU5EIEZMQVNIIENvbnRyb2xsZXJzLAo+ID4+ICsJwqAgaW5jbHVkaW5nOgo+ID4+ICsJwqDC oMKgIE5GQyB2NjAwOiBSSzI5MjgsIFJLMzA2NiwgUkszMTg4Cj4gPj4gKwnCoMKgwqAgTkZDIHY2 MjI6IFJLMzAzNiwgUkszMTI4Cj4gPj4gKwnCoMKgwqAgTkZDIHY4MDA6IFJLMzMwOCwgUlYxMTA4 Cj4gPj4gKwnCoMKgwqAgTkZDIHY5MDA6IFBYMzAsIFJLMzMyNgo+ID4+ICsKPiA+PsKgIGNvbW1l bnQgIk1pc2MiCj4gPj7CoAo+ID4+wqAgY29uZmlnIE1URF9TTV9DT01NT04KPiA+PiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9tdGQvbmFuZC9yYXcvTWFrZWZpbGUgYi9kcml2ZXJzL210ZC9uYW5kL3Jh dy9NYWtlZmlsZQo+ID4+IGluZGV4IDI5MzBmNWI5MDE1ZC4uOTYwYzliZTI1MjA0IDEwMDY0NAo+ ID4+IC0tLSBhL2RyaXZlcnMvbXRkL25hbmQvcmF3L01ha2VmaWxlCj4gPj4gKysrIGIvZHJpdmVy cy9tdGQvbmFuZC9yYXcvTWFrZWZpbGUKPiA+PiBAQCAtNTgsNiArNTgsNyBAQCBvYmotJChDT05G SUdfTVREX05BTkRfU1RNMzJfRk1DMikJKz0gc3RtMzJfZm1jMl9uYW5kLm8KPiA+PsKgIG9iai0k KENPTkZJR19NVERfTkFORF9NRVNPTikJKz0gbWVzb25fbmFuZC5vCj4gPj7CoCBvYmotJChDT05G SUdfTVREX05BTkRfQ0FERU5DRSkJKz0gY2FkZW5jZS1uYW5kLWNvbnRyb2xsZXIubwo+ID4+wqAg b2JqLSQoQ09ORklHX01URF9OQU5EX0FSQVNBTikJKz0gYXJhc2FuLW5hbmQtY29udHJvbGxlci5v Cj4gPj4gK29iai0kKENPTkZJR19NVERfTkFORF9ST0NLQ0hJUCkJKz0gcm9ja2NoaXAtbmFuZC1j b250cm9sbGVyLm8KPiA+PsKgCj4gPj7CoCBuYW5kLW9ianMgOj0gbmFuZF9iYXNlLm8gbmFuZF9s ZWdhY3kubyBuYW5kX2JidC5vIG5hbmRfdGltaW5ncy5vIG5hbmRfaWRzLm8KPiA+PsKgIG5hbmQt b2JqcyArPSBuYW5kX29uZmkubwo+ID4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3Jh dy9yb2NrY2hpcC1uYW5kLWNvbnRyb2xsZXIuYyBiL2RyaXZlcnMvbXRkL25hbmQvcmF3L3JvY2tj aGlwLW5hbmQtY29udHJvbGxlci5jCj4gPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+PiBpbmRl eCAwMDAwMDAwMDAwMDAuLjJlOTZmZDMxNDM0Ngo+ID4+IC0tLSAvZGV2L251bGwKPiA+PiArKysg Yi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9yb2NrY2hpcC1uYW5kLWNvbnRyb2xsZXIuYwo+ID4+IEBA IC0wLDAgKzEsMTQ2MCBAQAo+ID4+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIu MCBPUiBNSVQKPiA+PiArLyoKPiA+PiArICogUm9ja2NoaXAgTkFORCBGbGFzaCBjb250cm9sbGVy IGRyaXZlci4KPiA+PiArICogQ29weXJpZ2h0IChDKSAyMDIwIFJvY2tjaGlwIEluYy4KPiA+PiAr ICogQXV0aG9yOiBZaWZlbmcgWmhhbyA8eWlmZW5nLnpoYW9Acm9jay1jaGlwcy5jb20+Cj4gPj4g KyAqLwo+ID4+ICsKPiA+PiArI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgo+ID4+ICsjaW5jbHVkZSA8 bGludXgvZGVsYXkuaD4KPiA+PiArI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Cj4gPj4g KyNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KPiA+PiArI2luY2x1ZGUgPGxpbnV4L2ludGVy cnVwdC5oPgo+ID4+ICsjaW5jbHVkZSA8bGludXgvaW9wb2xsLmg+Cj4gPj4gKyNpbmNsdWRlIDxs aW51eC9tb2R1bGUuaD4KPiA+PiArI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KPiA+PiArI2lu Y2x1ZGUgPGxpbnV4L210ZC9yYXduYW5kLmg+Cj4gPj4gKyNpbmNsdWRlIDxsaW51eC9vZi5oPgo+ ID4+ICsjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Cj4gPj4gKyNpbmNsdWRlIDxsaW51eC9w bGF0Zm9ybV9kZXZpY2UuaD4KPiA+PiArI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KPiA+PiArCj4g Pj4gKy8qCj4gPj4gKyAqIE5GQyBQYWdlIERhdGEgTGF5b3V0Ogo+ID4+ICsgKgkxMDI0IEJ5dGVz IERhdGEgKyA0Qnl0ZXMgc3lzIGRhdGEgKyAyOEJ5dGVzfjEyNEJ5dGVzIGVjYyArCj4gPj4gKyAq CTEwMjQgQnl0ZXMgRGF0YSArIDRCeXRlcyBzeXMgZGF0YSArIDI4Qnl0ZXN+MTI0Qnl0ZXMgZWNj ICsKPiA+PiArICoJLi4uLi4uCj4gPj4gKyAqIE5BTkQgUGFnZSBEYXRhIExheW91dDoKPiA+PiAr ICoJMTAyNCAqIG4gRGF0YSArIG0gQnl0ZXMgb29iCj4gPj4gKyAqIE9yaWdpbmFsIEJhZCBCbG9j ayBNYXNrIExvY2F0aW9uOgo+ID4+ICsgKglGaXJzdCBieXRlIG9mIG9vYihzcGFyZSkuCj4gPj4g KyAqIG5hbmRfY2hpcC0+b29iX3BvaSBkYXRhIGxheW91dDoKPiA+PiArICoJNEJ5dGVzIHN5cyBk YXRhICsgLi4uLiArIDRCeXRlcyBzeXMgZGF0YSArIGVjYyBkYXRhLgo+ID4+ICsgKi8KPiA+PiAr Cj4gPj4gKy8qIE5BTkQgY29udHJvbGxlciByZWdpc3RlciBkZWZpbml0aW9uICovCj4gPj4gKyNk ZWZpbmUgTkZDX1JFQUQJKDApCj4gPj4gKyNkZWZpbmUgTkZDX1dSSVRFCSgxKQo+ID4+ICsKPiA+ PiArI2RlZmluZSBORkNfRk1DVEwJKDB4MDApCj4gPj4gKyNkZWZpbmXCoMKgIEZNQ1RMX0NFX1NF TF9NCTB4RkYKPiA+PiArI2RlZmluZcKgwqAgRk1DVExfQ0VfU0VMKHgpCSgxIDw8ICh4KSkKPiA+ PiArI2RlZmluZcKgwqAgRk1DVExfV1AJQklUKDgpCj4gPj4gKyNkZWZpbmXCoMKgIEZNQ1RMX1JE WQlCSVQoOSkKPiA+PiArCj4gPj4gKyNkZWZpbmUgTkZDX0ZNV0FJVAkoMHgwNCkKPiA+PiArI2Rl ZmluZcKgwqAgRkxDVExfUlNUCUJJVCgwKQo+ID4+ICsjZGVmaW5lwqDCoCBGTENUTF9XUgkoMSkJ LyogMDogcmVhZCwgMTogd3JpdGUgKi8KPiA+PiArI2RlZmluZcKgwqAgRkxDVExfWEZFUl9TVAlC SVQoMikKPiA+PiArI2RlZmluZcKgwqAgRkxDVExfWEZFUl9FTglCSVQoMykKPiA+PiArI2RlZmlu ZcKgwqAgRkxDVExfQUNPUlJFQ1QJQklUKDEwKSAvKiBBdXRvIGNvcnJlY3QgZXJyb3IgYml0cy4g Ki8KPiA+PiArI2RlZmluZcKgwqAgRkxDVExfWEZFUl9SRUFEWQlCSVQoMjApCj4gPj4gKyNkZWZp bmXCoMKgIEZMQ1RMX1hGRVJfU0VDVE9SCSgyMikKPiA+PiArI2RlZmluZcKgwqAgRkxDVExfVE9H X0ZJWAlCSVQoMjkpCj4gPj4gKwo+ID4+ICsjZGVmaW5lwqDCoCBCQ0hDVExfQkFOS19NCSg3IDw8 IDUpCj4gPj4gKyNkZWZpbmXCoMKgIEJDSENUTF9CQU5LCSg1KQo+ID4+ICsKPiA+PiArI2RlZmlu ZcKgwqAgRE1BX1NUCUJJVCgwKQo+ID4+ICsjZGVmaW5lwqDCoCBETUFfV1IJKDEpCS8qIDA6IHdy aXRlLCAxOiByZWFkICovCj4gPj4gKyNkZWZpbmXCoMKgIERNQV9FTglCSVQoMikKPiA+PiArI2Rl ZmluZcKgwqAgRE1BX0FIQl9TSVpFCSgzKQkvKiAwOiAxLCAxOiAyLCAyOiA0ICovCj4gPj4gKyNk ZWZpbmXCoMKgIERNQV9CVVJTVF9TSVpFCSg2KQkvKiAwOiAxLCAzOiA0LCA1OiA4LCA3OiAxNiAq Lwo+ID4+ICsjZGVmaW5lwqDCoCBETUFfSU5DX05VTQkoOSkJLyogMSAtIDE2ICovCj4gPj4gKwo+ ID4+ICsjZGVmaW5lIEVDQ19FUlJfQ05UKHgsIGUpICgoKCh4KSA+PiAoZSkubG93KSAmIChlKS5s b3dfbWFzaykgfFwKPiA+PiArCcKgICgoKHgpID4+IChlKS5oaWdoKSAmIChlKS5oaWdoX21hc2sp IDw8IChlKS5sb3dfYm4pCj4gPj4gKyNkZWZpbmXCoMKgIElOVF9ETUEJQklUKDApCj4gPj4gKyNk ZWZpbmUgTkZDX0JBTksJKDB4ODAwKQo+ID4+ICsjZGVmaW5lIE5GQ19CQU5LX1NURVAJKDB4MTAw KQo+ID4+ICsjZGVmaW5lwqDCoCBCQU5LX0RBVEEJKDB4MDApCj4gPj4gKyNkZWZpbmXCoMKgIEJB TktfQUREUgkoMHgwNCkKPiA+PiArI2RlZmluZcKgwqAgQkFOS19DTUQJKDB4MDgpCj4gPj4gKyNk ZWZpbmUgTkZDX1NSQU0wCSgweDEwMDApCj4gPj4gKyNkZWZpbmUgTkZDX1NSQU0xCSgweDE0MDAp Cj4gPj4gKyNkZWZpbmUgTkZDX1NSQU1fU0laRQkoMHg0MDApCj4gPj4gKyNkZWZpbmUgTkZDX1RJ TUVPVVQJKDUwMDAwMCkKPiA+PiArI2RlZmluZSBORkNfTUFYX09PQl9QRVJfU1RFUAkxMjgKPiA+ PiArI2RlZmluZSBORkNfTUlOX09PQl9QRVJfU1RFUAk2NAo+ID4+ICsjZGVmaW5lIE1BWF9EQVRB X1NJWkUJMHhGRkZDCj4gPj4gKyNkZWZpbmUgTUFYX0FERFJFU1NfQ1lDCTYKPiA+PiArI2RlZmlu ZSBORkNfRUNDX01BWF9NT0RFUwk0Cj4gPj4gKyNkZWZpbmUgTkZDX01BWF9OU0VMUwkoOCkgLyog U29tZSBTb2NzIG9ubHkgaGF2ZSAxIG9yIDIgQ1NzLiAqLwo+ID4+ICsjZGVmaW5lIE5GQ19TWVNf REFUQV9TSVpFCSg0KSAvKiA0IGJ5dGVzIHN5cyBkYXRhIGluIG9vYiBwcmUgMTAyNCBkYXRhLiov Cj4gPj4gKyNkZWZpbmUgUktfREVGQVVMVF9DTE9DS19SQVRFCSgxNTAgKiAxMDAwICogMTAwMCkg LyogMTUwIE1oeiAqLwo+ID4+ICsjZGVmaW5lIEFDQ1RJTUlORyhjc3J3LCByd3B3LCByd2NzKQko KGNzcncpIDw8IDEyIHwgKHJ3cHcpIDw8IDUgfCAocndjcykpCj4gPj4gKwo+ID4+ICtlbnVtIG5m Y190eXBlIHsKPiA+PiArCU5GQ19WNiwKPiA+PiArCU5GQ19WOCwKPiA+PiArCU5GQ19WOSwKPiA+ PiArfTsKPiA+PiArCj4gPj4gKy8qKgo+ID4+ICsgKiBzdHJ1Y3QgcmtfZWNjX2NudF9zdGF0dXM6 IHJlcHJlc2VudCBhIGVjYyBzdGF0dXMgZGF0YS4KPiA+PiArICogQGVycl9mbGFnX2JpdDogZXJy b3IgZmxhZyBiaXQgaW5kZXggYXQgcmVnaXN0ZXIuCj4gPj4gKyAqIEBsb3c6IGVjYyBjb3VudCBs b3cgYml0IGluZGV4IGF0IHJlZ2lzdGVyLgo+ID4+ICsgKiBAbG93X21hc2s6IG1hc2sgYml0Lgo+ ID4+ICsgKiBAbG93X2JuOiBlY2MgY291bnQgbG93IGJpdCBudW1iZXIuCj4gPj4gKyAqIEBoaWdo OiBlY2MgY291bnQgaGlnaCBiaXQgaW5kZXggYXQgcmVnaXN0ZXIuCj4gPj4gKyAqIEBoaWdoX21h c2s6IG1hc2sgYml0Cj4gPj4gKyAqLwo+ID4+ICtzdHJ1Y3QgZWNjX2NudF9zdGF0dXMgewo+ID4+ ICsJdTggZXJyX2ZsYWdfYml0Owo+ID4+ICsJdTggbG93Owo+ID4+ICsJdTggbG93X21hc2s7Cj4g Pj4gKwl1OCBsb3dfYm47Cj4gPj4gKwl1OCBoaWdoOwo+ID4+ICsJdTggaGlnaF9tYXNrOwo+ID4+ ICt9Owo+ID4+ICsKPiA+PiArLyoKPiA+PiArICogQHR5cGU6IG5mYyB2ZXJzaW9uCj4gPj4gKyAq IEBlY2Nfc3RyZW5ndGhzOiBlY2Mgc3RyZW5ndGhzCj4gPj4gKyAqIEBlY2NfY2ZnczogZWNjIGNv bmZpZyB2YWx1ZXMKPiA+PiArICogQGZsY3RsX29mZjogRkxDVEwgcmVnaXN0ZXIgb2Zmc2V0Cj4g Pj4gKyAqIEBiY2hjdGxfb2ZmOiBCQ0hDVEwgcmVnaXN0ZXIgb2Zmc2V0Cj4gPj4gKyAqIEBkbWFf ZGF0YV9idWZfb2ZmOiBETUFfREFUQV9CVUYgcmVnaXN0ZXIgb2Zmc2V0Cj4gPj4gKyAqIEBkbWFf b29iX2J1Zl9vZmY6IERNQV9PT0JfQlVGIHJlZ2lzdGVyIG9mZnNldAo+ID4+ICsgKiBAZG1hX2Nm Z19vZmY6IERNQV9DRkcgcmVnaXN0ZXIgb2Zmc2V0Cj4gPj4gKyAqIEBkbWFfc3Rfb2ZmOiBETUFf U1QgcmVnaXN0ZXIgb2Zmc2V0Cj4gPj4gKyAqIEBiY2hfc3Rfb2ZmOiBCQ0dfU1QgcmVnaXN0ZXIg b2Zmc2V0Cj4gPj4gKyAqIEByYW5kbXpfb2ZmOiBSQU5ETVogcmVnaXN0ZXIgb2Zmc2V0Cj4gPj4g KyAqIEBpbnRfZW5fb2ZmOiBpbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyIG9mZnNldAo+ID4+ICsg KiBAaW50X2Nscl9vZmY6IGludGVycnVwdCBjbGVhbiByZWdpc3RlciBvZmZzZXQKPiA+PiArICog QGludF9zdF9vZmY6IGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgb2Zmc2V0Cj4gPj4gKyAqIEBv b2IwX29mZjogb29iMCByZWdpc3RlciBvZmZzZXQKPiA+PiArICogQG9vYjFfb2ZmOiBvb2IxIHJl Z2lzdGVyIG9mZnNldAo+ID4+ICsgKiBAZWNjMDogcmVwcmVzZW50IEVDQzAgc3RhdHVzIGRhdGEK PiA+PiArICogQGVjYzE6IHJlcHJlc2VudCBFQ0MxIHN0YXR1cyBkYXRhCj4gPj4gKyAqLwo+ID4+ ICtzdHJ1Y3QgbmZjX2NmZyB7Cj4gPj4gKwllbnVtIG5mY190eXBlIHR5cGU7Cj4gPj4gKwl1OCBl Y2Nfc3RyZW5ndGhzW05GQ19FQ0NfTUFYX01PREVTXTsKPiA+PiArCXUzMiBlY2NfY2Znc1tORkNf RUNDX01BWF9NT0RFU107Cj4gPj4gKwl1MzIgZmxjdGxfb2ZmOwo+ID4+ICsJdTMyIGJjaGN0bF9v ZmY7Cj4gPj4gKwl1MzIgZG1hX2NmZ19vZmY7Cj4gPj4gKwl1MzIgZG1hX2RhdGFfYnVmX29mZjsK PiA+PiArCXUzMiBkbWFfb29iX2J1Zl9vZmY7Cj4gPj4gKwl1MzIgZG1hX3N0X29mZjsKPiA+PiAr CXUzMiBiY2hfc3Rfb2ZmOwo+ID4+ICsJdTMyIHJhbmRtel9vZmY7Cj4gPj4gKwl1MzIgaW50X2Vu X29mZjsKPiA+PiArCXUzMiBpbnRfY2xyX29mZjsKPiA+PiArCXUzMiBpbnRfc3Rfb2ZmOwo+ID4+ ICsJdTMyIG9vYjBfb2ZmOwo+ID4+ICsJdTMyIG9vYjFfb2ZmOwo+ID4+ICsJc3RydWN0IGVjY19j bnRfc3RhdHVzIGVjYzA7Cj4gPj4gKwlzdHJ1Y3QgZWNjX2NudF9zdGF0dXMgZWNjMTsKPiA+PiAr fTsKPiA+PiArCj4gPj4gK3N0cnVjdCBya19uZmNfbmFuZF9jaGlwIHsKPiA+PiArCXN0cnVjdCBs aXN0X2hlYWQgbm9kZTsKPiA+PiArCXN0cnVjdCBuYW5kX2NoaXAgY2hpcDsKPiA+PiArCj4gPj4g Kwl1MTYgc3BhcmVfcGVyX3NlY3RvcjsKPiA+PiArCXUxNiBvb2JfYnVmX3Blcl9zZWN0b3I7Cj4g Pj4gKwl1MTYgYm9vdF9ibGtzOwo+ID4+ICsJdTE2IGJvb3RfZWNjOwo+ID4+ICsJdTE2IG1ldGFk YXRhX3NpemU7Cj4gPj4gKwo+ID4+ICsJdTggbnNlbHM7Cj4gPj4gKwl1OCBzZWxzWzBdOwo+ID4+ ICsJLyogTm90aGluZyBhZnRlciB0aGlzIGZpZWxkLiAqLwo+ID4+ICt9Owo+ID4+ICsKPiA+PiAr c3RydWN0IHJrX25mYyB7Cj4gPj4gKwlzdHJ1Y3QgbmFuZF9jb250cm9sbGVyIGNvbnRyb2xsZXI7 Cj4gPj4gKwljb25zdCBzdHJ1Y3QgbmZjX2NmZyAqY2ZnOwo+ID4+ICsJc3RydWN0IGRldmljZSAq ZGV2Owo+ID4+ICsKPiA+PiArCXN0cnVjdCBjbGsgKm5mY19jbGs7Cj4gPj4gKwlzdHJ1Y3QgY2xr ICphaGJfY2xrOwo+ID4+ICsJdm9pZCBfX2lvbWVtICpyZWdzOwo+ID4+ICsKPiA+PiArCXUzMiBz ZWxlY3RlZF9iYW5rOwo+ID4+ICsJdTMyIGJhbmRfb2Zmc2V0Owo+ID4+ICsJdTMyIGN1cl9jbGs7 Cj4gPj4gKwo+ID4+ICsJc3RydWN0IGNvbXBsZXRpb24gZG9uZTsKPiA+PiArCXN0cnVjdCBsaXN0 X2hlYWQgY2hpcHM7Cj4gPj4gKwo+ID4+ICsJdTggKmJ1ZmZlcjsKPiA+PiArCXU4ICpwYWdlX2J1 ZjsKPiA+PiArCXUzMiAqb29iX2J1ZjsKPiA+PiArCXUzMiBidWZmZXJfc2l6ZTsKPiA+PiArCXUz MiBvb2JfYnVmX3NpemU7Cj4gPj4gKwo+ID4+ICsJdW5zaWduZWQgbG9uZyBhc3NpZ25lZF9jczsK PiA+PiArfTsKPiA+PiArCj4gPj4gK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJrX25mY19uYW5kX2No aXAgKnJrX25mY190b19ya25hbmQoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCkKPiA+PiArewo+ID4+ ICsJcmV0dXJuIGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCwgY2hp cCk7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyBpbmxpbmUgdTggKnJrX25mY19idWZfdG9f ZGF0YV9wdHIoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgY29uc3QgdTggKnAsIGludCBpKQo+ID4+ ICt7Cj4gPj4gKwlyZXR1cm4gKHU4ICopcCArIGkgKiBjaGlwLT5lY2Muc2l6ZTsKPiA+PiArfQo+ ID4+ICsKPiA+PiArc3RhdGljIGlubGluZSB1OCAqcmtfbmZjX2J1Zl90b19vb2JfcHRyKHN0cnVj dCBuYW5kX2NoaXAgKmNoaXAsIGludCBpKQo+ID4+ICt7Cj4gPj4gKwl1OCAqcG9pOwo+ID4+ICsK PiA+PiArCXBvaSA9IGNoaXAtPm9vYl9wb2kgKyBpICogTkZDX1NZU19EQVRBX1NJWkU7Cj4gPj4g Kwo+ID4+ICsJcmV0dXJuIHBvaTsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGlubGluZSB1 OCAqcmtfbmZjX2J1Zl90b19vb2JfZWNjX3B0cihzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQg aSkKPiA+PiArewo+ID4+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZCA9IHJrX25m Y190b19ya25hbmQoY2hpcCk7Cj4gPj4gKwl1OCAqcG9pOwo+ID4+ICsKPiA+PiArCXBvaSA9IGNo aXAtPm9vYl9wb2kgKyBya25hbmQtPm1ldGFkYXRhX3NpemUgKwo+ID4+ICsJwqDCoMKgwqDCoCBj aGlwLT5lY2MuYnl0ZXMgKiBpOwo+ID4+ICsKPiA+PiArCXJldHVybiBwb2k7Cj4gPj4gK30KPiA+ PiArCj4gPj4gK3N0YXRpYyBpbmxpbmUgaW50IHJrX25mY19kYXRhX2xlbihzdHJ1Y3QgbmFuZF9j aGlwICpjaGlwKQo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCAqcmtuYW5k ID0gcmtfbmZjX3RvX3JrbmFuZChjaGlwKTsKPiA+PiArCj4gPj4gKwlyZXR1cm4gY2hpcC0+ZWNj LnNpemUgKyBya25hbmQtPnNwYXJlX3Blcl9zZWN0b3I7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0 YXRpYyBpbmxpbmUgdTggKnJrX25mY19kYXRhX3B0cihzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLMKg IGludCBpKQo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBuYW5kX2dldF9jb250 cm9sbGVyX2RhdGEoY2hpcCk7Cj4gPj4gKwo+ID4+ICsJcmV0dXJuIG5mYy0+YnVmZmVyICsgaSAq IHJrX25mY19kYXRhX2xlbihjaGlwKTsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGlubGlu ZSB1OCAqcmtfbmZjX29vYl9wdHIoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgaW50IGkpCj4gPj4g K3sKPiA+PiArCXN0cnVjdCBya19uZmMgKm5mYyA9IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShj aGlwKTsKPiA+PiArCj4gPj4gKwlyZXR1cm4gbmZjLT5idWZmZXIgKyBpICogcmtfbmZjX2RhdGFf bGVuKGNoaXApICsgY2hpcC0+ZWNjLnNpemU7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyB2 b2lkIHJrX25mY19zZWxlY3RfY2hpcChzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQgY3MpCj4g Pj4gK3sKPiA+PiArCXN0cnVjdCBya19uZmMgKm5mYyA9IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0 YShjaGlwKTsKPiA+PiArCXN0cnVjdCBya19uZmNfbmFuZF9jaGlwICpya25hbmQgPSBya19uZmNf dG9fcmtuYW5kKGNoaXApOwo+ID4+ICsJdTMyIHZhbDsKPiA+PiArCj4gPj4gKwlpZiAoY3MgPCAw KSB7Cj4gPj4gKwluZmMtPnNlbGVjdGVkX2JhbmsgPSAtMTsKPiA+PiArCS8qIERlc2VsZWN0IHRo ZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGFyZ2V0LiAqLwo+ID4+ICsJdmFsID0gcmVhZGxfcmVsYXhl ZChuZmMtPnJlZ3MgKyBORkNfRk1DVEwpOwo+ID4+ICsJdmFsICY9IH5GTUNUTF9DRV9TRUxfTTsK PiA+PiArCXdyaXRlbCh2YWwsIG5mYy0+cmVncyArIE5GQ19GTUNUTCk7Cj4gPj4gKwlyZXR1cm47 Cj4gPj4gKwl9Cj4gPj4gKwo+ID4+ICsJbmZjLT5zZWxlY3RlZF9iYW5rID0gcmtuYW5kLT5zZWxz W2NzXTsKPiA+PiArCW5mYy0+YmFuZF9vZmZzZXQgPSBORkNfQkFOSyArIG5mYy0+c2VsZWN0ZWRf YmFuayAqIE5GQ19CQU5LX1NURVA7Cj4gPj4gKwo+ID4+ICsJdmFsID0gcmVhZGxfcmVsYXhlZChu ZmMtPnJlZ3MgKyBORkNfRk1DVEwpOwo+ID4+ICsJdmFsICY9IH5GTUNUTF9DRV9TRUxfTTsKPiA+ PiArCXZhbCB8PSBGTUNUTF9DRV9TRUwobmZjLT5zZWxlY3RlZF9iYW5rKTsKPiA+PiArCj4gPj4g Kwl3cml0ZWwodmFsLCBuZmMtPnJlZ3MgKyBORkNfRk1DVEwpOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ ICtzdGF0aWMgaW5saW5lIGludCBya19uZmNfd2FpdF9pb3JlYWR5KHN0cnVjdCBya19uZmMgKm5m YykKPiA+PiArewo+ID4+ICsJaW50IHJjOwo+ID4+ICsJdTMyIHZhbDsKPiA+PiArCj4gPj4gKwly YyA9IHJlYWRsX3JlbGF4ZWRfcG9sbF90aW1lb3V0KG5mYy0+cmVncyArIE5GQ19GTUNUTCwgdmFs LAo+ID4+ICsJdmFsICYgRk1DVExfUkRZLCAxMCwgTkZDX1RJTUVPVVQpOwo+ID4+ICsKPiA+PiAr CXJldHVybiByYzsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIHZvaWQgcmtfbmZjX3JlYWRf YnVmKHN0cnVjdCBya19uZmMgKm5mYywgdTggKmJ1ZiwgaW50IGxlbikKPiA+PiArewo+ID4+ICsJ aW50IGk7Cj4gPj4gKwo+ID4+ICsJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQo+ID4+ICsJYnVm W2ldID0gcmVhZGJfcmVsYXhlZChuZmMtPnJlZ3MgKyBuZmMtPmJhbmRfb2Zmc2V0ICsKPiA+PiAr CcKgwqDCoMKgwqDCoCBCQU5LX0RBVEEpOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgdm9p ZCBya19uZmNfd3JpdGVfYnVmKHN0cnVjdCBya19uZmMgKm5mYywgY29uc3QgdTggKmJ1ZiwgaW50 IGxlbikKPiA+PiArewo+ID4+ICsJaW50IGk7Cj4gPj4gKwo+ID4+ICsJZm9yIChpID0gMDsgaSA8 IGxlbjsgaSsrKQo+ID4+ICsJd3JpdGViKGJ1ZltpXSwgbmZjLT5yZWdzICsgbmZjLT5iYW5kX29m ZnNldCArIEJBTktfREFUQSk7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyBpbnQgcmtfbmZj X2NtZChzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAo+ID4+ICsJwqDCoMKgwqDCoCBjb25zdCBzdHJ1 Y3QgbmFuZF9zdWJvcCAqc3Vib3ApCj4gPj4gK3sKPiA+PiArCXN0cnVjdCBya19uZmMgKm5mYyA9 IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShjaGlwKTsKPiA+PiArCXVuc2lnbmVkIGludCBpLCBq LCByZW1haW5pbmcsIHN0YXJ0Owo+ID4+ICsJaW50IHJlZ19vZmZzZXQgPSBuZmMtPmJhbmRfb2Zm c2V0Owo+ID4+ICsJdTggKmluYnVmID0gTlVMTDsKPiA+PiArCWNvbnN0IHU4ICpvdXRidWY7Cj4g Pj4gKwl1MzIgY250ID0gMDsKPiA+PiArCWludCByZXQgPSAwOwo+ID4+ICsKPiA+PiArCWZvciAo aSA9IDA7IGkgPCBzdWJvcC0+bmluc3RyczsgaSsrKSB7Cj4gPj4gKwljb25zdCBzdHJ1Y3QgbmFu ZF9vcF9pbnN0ciAqaW5zdHIgPSAmc3Vib3AtPmluc3Ryc1tpXTsKPiA+PiArCj4gPj4gKwlzd2l0 Y2ggKGluc3RyLT50eXBlKSB7Cj4gPj4gKwljYXNlIE5BTkRfT1BfQ01EX0lOU1RSOgo+ID4+ICsJ d3JpdGViKGluc3RyLT5jdHguY21kLm9wY29kZSwKPiA+PiArCcKgwqDCoMKgwqDCoCBuZmMtPnJl Z3MgKyByZWdfb2Zmc2V0ICsgQkFOS19DTUQpOwo+ID4+ICsJYnJlYWs7Cj4gPj4gKwo+ID4+ICsJ Y2FzZSBOQU5EX09QX0FERFJfSU5TVFI6Cj4gPj4gKwlyZW1haW5pbmcgPSBuYW5kX3N1Ym9wX2dl dF9udW1fYWRkcl9jeWMoc3Vib3AsIGkpOwo+ID4+ICsJc3RhcnQgPSBuYW5kX3N1Ym9wX2dldF9h ZGRyX3N0YXJ0X29mZihzdWJvcCwgaSk7Cj4gPj4gKwo+ID4+ICsJZm9yIChqID0gMDsgaiA8IDgg JiYgaiArIHN0YXJ0IDwgcmVtYWluaW5nOyBqKyspCj4gPj4gKwl3cml0ZWIoaW5zdHItPmN0eC5h ZGRyLmFkZHJzW2ogKyBzdGFydF0sCj4gPj4gKwnCoMKgwqDCoMKgwqAgbmZjLT5yZWdzICsgcmVn X29mZnNldCArIEJBTktfQUREUik7Cj4gPj4gKwlicmVhazsKPiA+PiArCj4gPj4gKwljYXNlIE5B TkRfT1BfREFUQV9JTl9JTlNUUjoKPiA+PiArCWNhc2UgTkFORF9PUF9EQVRBX09VVF9JTlNUUjoK PiA+PiArCXN0YXJ0ID0gbmFuZF9zdWJvcF9nZXRfZGF0YV9zdGFydF9vZmYoc3Vib3AsIGkpOwo+ ID4+ICsJY250ID0gbmFuZF9zdWJvcF9nZXRfZGF0YV9sZW4oc3Vib3AsIGkpOwo+ID4+ICsKPiA+ PiArCWlmIChpbnN0ci0+dHlwZSA9PSBOQU5EX09QX0RBVEFfT1VUX0lOU1RSKSB7Cj4gPj4gKwlv dXRidWYgPSBpbnN0ci0+Y3R4LmRhdGEuYnVmLm91dCArIHN0YXJ0Owo+ID4+ICsJcmtfbmZjX3dy aXRlX2J1ZihuZmMsIG91dGJ1ZiwgY250KTsKPiA+PiArCX0gZWxzZSB7Cj4gPj4gKwlpbmJ1ZiA9 IGluc3RyLT5jdHguZGF0YS5idWYuaW4gKyBzdGFydDsKPiA+PiArCXJrX25mY19yZWFkX2J1Zihu ZmMsIGluYnVmLCBjbnQpOwo+ID4+ICsJfQo+ID4+ICsJYnJlYWs7Cj4gPj4gKwo+ID4+ICsJY2Fz ZSBOQU5EX09QX1dBSVRSRFlfSU5TVFI6Cj4gPj4gKwlpZiAocmtfbmZjX3dhaXRfaW9yZWFkeShu ZmMpIDwgMCkgewo+ID4+ICsJcmV0ID0gLUVUSU1FRE9VVDsKPiA+PiArCWRldl9lcnIobmZjLT5k ZXYsICJJTyBub3QgcmVhZHlcbiIpOwo+ID4+ICsJfQo+ID4+ICsJYnJlYWs7Cj4gPj4gKwl9Cj4g Pj4gKwl9Cj4gPj4gKwo+ID4+ICsJcmV0dXJuIHJldDsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3Rh dGljIGNvbnN0IHN0cnVjdCBuYW5kX29wX3BhcnNlciBya19uZmNfb3BfcGFyc2VyID0gTkFORF9P UF9QQVJTRVIoCj4gPj4gKwlOQU5EX09QX1BBUlNFUl9QQVRURVJOKAo+ID4+ICsJcmtfbmZjX2Nt ZCwKPiA+PiArCU5BTkRfT1BfUEFSU0VSX1BBVF9DTURfRUxFTSh0cnVlKSwKPiA+PiArCU5BTkRf T1BfUEFSU0VSX1BBVF9BRERSX0VMRU0odHJ1ZSwgTUFYX0FERFJFU1NfQ1lDKSwKPiA+PiArCU5B TkRfT1BfUEFSU0VSX1BBVF9DTURfRUxFTSh0cnVlKSwKPiA+PiArCU5BTkRfT1BfUEFSU0VSX1BB VF9XQUlUUkRZX0VMRU0odHJ1ZSksCj4gPj4gKwlOQU5EX09QX1BBUlNFUl9QQVRfREFUQV9JTl9F TEVNKHRydWUsIE1BWF9EQVRBX1NJWkUpKSwKPiA+PiArCU5BTkRfT1BfUEFSU0VSX1BBVFRFUk4o Cj4gPj4gKwlya19uZmNfY21kLAo+ID4+ICsJTkFORF9PUF9QQVJTRVJfUEFUX0NNRF9FTEVNKHRy dWUpLAo+ID4+ICsJTkFORF9PUF9QQVJTRVJfUEFUX0FERFJfRUxFTSh0cnVlLCBNQVhfQUREUkVT U19DWUMpLAo+ID4+ICsJTkFORF9PUF9QQVJTRVJfUEFUX0RBVEFfT1VUX0VMRU0odHJ1ZSwgTUFY X0RBVEFfU0laRSksCj4gPj4gKwlOQU5EX09QX1BBUlNFUl9QQVRfQ01EX0VMRU0odHJ1ZSksCj4g Pj4gKwlOQU5EX09QX1BBUlNFUl9QQVRfV0FJVFJEWV9FTEVNKHRydWUpKSwKPiA+PiArKTsKPiA+ PiArCj4gPj4gK3N0YXRpYyBpbnQgcmtfbmZjX2V4ZWNfb3Aoc3RydWN0IG5hbmRfY2hpcCAqY2hp cCwKPiA+PiArCcKgIGNvbnN0IHN0cnVjdCBuYW5kX29wZXJhdGlvbiAqb3AsCj4gPj4gKwnCoCBi b29sIGNoZWNrX29ubHkpCj4gPj4gK3sKPiA+PiArCWlmICghY2hlY2tfb25seSkKPiA+PiArCXJr X25mY19zZWxlY3RfY2hpcChjaGlwLCBvcC0+Y3MpOwo+ID4+ICsKPiA+PiArCXJldHVybiBuYW5k X29wX3BhcnNlcl9leGVjX29wKGNoaXAsICZya19uZmNfb3BfcGFyc2VyLCBvcCwKPiA+PiArCcKg wqDCoMKgwqAgY2hlY2tfb25seSk7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyBpbnQgcmtf bmZjX3NldHVwX2RhdGFfaW50ZXJmYWNlKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIGludCBjc2xp bmUsCj4gPj4gKwnCoMKgwqDCoMKgwqAgY29uc3Qgc3RydWN0IG5hbmRfaW50ZXJmYWNlX2NvbmZp ZyAqY29uZikgIAo+ID4KPiA+UGxlYXNlIGhhdmUgYSBsb29rIGF0IHRoZSByZWNlbnQgY2hhbmdl cyBpbiB0aGUgY29yZSwgdGhpcyBoZWxwZXIKPiA+c2hvdWxkIGJlIG5hbWVkICJzZXR1cF9pbnRl cmZhY2UiLgo+ID4gIAo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBuYW5kX2dl dF9jb250cm9sbGVyX2RhdGEoY2hpcCk7Cj4gPj4gKwljb25zdCBzdHJ1Y3QgbmFuZF9zZHJfdGlt aW5ncyAqdGltaW5nczsKPiA+PiArCXUzMiByYXRlLCB0YzJydywgdHJ3cHcsIHRydzJjOwo+ID4+ ICsJdTMyIHRlbXA7Cj4gPj4gKwo+ID4+ICsJaWYgKGNzbGluZSA9PSBOQU5EX0RBVEFfSUZBQ0Vf Q0hFQ0tfT05MWSkKPiA+PiArCXJldHVybiAwOwo+ID4+ICsKPiA+PiArCXRpbWluZ3MgPSBuYW5k X2dldF9zZHJfdGltaW5ncyhjb25mKTsKPiA+PiArCWlmIChJU19FUlIodGltaW5ncykpCj4gPj4g KwlyZXR1cm4gLUVPUE5PVFNVUFA7Cj4gPj4gKwo+ID4+ICsJaWYgKElTX0VSUihuZmMtPm5mY19j bGspKQo+ID4+ICsJcmF0ZSA9IGNsa19nZXRfcmF0ZShuZmMtPmFoYl9jbGspOwo+ID4+ICsJZWxz ZQo+ID4+ICsJcmF0ZSA9IGNsa19nZXRfcmF0ZShuZmMtPm5mY19jbGspOwo+ID4+ICsKPiA+PiAr CS8qIFR1cm4gY2xvY2sgcmF0ZSBpbnRvIGtIei4gKi8KPiA+PiArCXJhdGUgLz0gMTAwMDsKPiA+ PiArCj4gPj4gKwl0YzJydyA9IDE7Cj4gPj4gKwl0cncyYyA9IDE7Cj4gPj4gKwo+ID4+ICsJdHJ3 cHcgPSBtYXgodGltaW5ncy0+dFdDX21pbiwgdGltaW5ncy0+dFJDX21pbikgLyAxMDAwOwo+ID4+ ICsJdHJ3cHcgPSBESVZfUk9VTkRfVVAodHJ3cHcgKiByYXRlLCAxMDAwMDAwKTsKPiA+PiArCj4g Pj4gKwl0ZW1wID0gdGltaW5ncy0+dFJFQV9tYXggLyAxMDAwOwo+ID4+ICsJdGVtcCA9IERJVl9S T1VORF9VUCh0ZW1wICogcmF0ZSwgMTAwMDAwMCk7Cj4gPj4gKwo+ID4+ICsJaWYgKHRyd3B3IDwg dGVtcCkKPiA+PiArCXRyd3B3ID0gdGVtcDsKPiA+PiArCj4gPj4gKwkvKgo+ID4+ICsJKiBBQ0NP TjogYWNjZXNzIHRpbWluZyBjb250cm9sIHJlZ2lzdGVyCj4gPj4gKwkqIC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiA+PiArCSogMzE6MTg6IHJlc2VydmVkCj4gPj4gKwkq IDE3OjEyOiBjc3J3LCBjbG9jayBjeWNsZXMgZnJvbSB0aGUgZmFsbGluZyBlZGdlIG9mIENTbiB0 byB0aGUKPiA+PiArCSrCoMKgIGZhbGxpbmcgZWRnZSBvZiBSRG4gb3IgV1JuCj4gPj4gKwkqIDEx OjExOiByZXNlcnZlZAo+ID4+ICsJKiAxMDowNTogcndwdywgdGhlIHdpZHRoIG9mIFJEbiBvciBX Um4gaW4gcHJvY2Vzc29yIGNsb2NrIGN5Y2xlcwo+ID4+ICsJKiAwNDowMDogcndjcywgY2xvY2sg Y3ljbGVzIGZyb20gdGhlIHJpc2luZyBlZGdlIG9mIFJEbiBvciBXUm4gdG8gdGhlCj4gPj4gKwkq wqDCoCByaXNpbmcgZWRnZSBvZiBDU24KPiA+PiArCSovCj4gPj4gKwl0ZW1wID0gQUNDVElNSU5H KHRjMnJ3LCB0cndwdywgdHJ3MmMpOwo+ID4+ICsJd3JpdGVsKHRlbXAsIG5mYy0+cmVncyArIE5G Q19GTVdBSVQpOyAgCj4gPgo+ID5Zb3Ugc2hvdWxkIHNhdmUgdGhlIGNoaXAncyB0aW1pbmcgY29u ZmlndXJhdGlvbiBpbnN0ZWFkIG9mIHdyaXRpbmcgaXQKPiA+aGVyZSwgYW5kIHNldHRpbmcgdGhl IHJlZ2lzdGVyIHZhbHVlIGR1cmluZyBjaGlwIHNlbGVjdGlvbi4gVGhpcyB3YXkKPiA+eW91IG1h eSBoYW5kbGUgc2V2ZXJhbCBjaGlwcyB3aXRoIGRpZmZlcmVudCB0aW1pbmcKPiA+Y29uc3RyYWlu dHMvY29uZmlndXJhdGlvbnMuCj4gPiAgCj4gPj4gKwo+ID4+ICsJcmV0dXJuIDA7Cj4gPj4gK30K PiA+PiArCj4gPj4gK3N0YXRpYyBpbnQgcmtfbmZjX2h3X2VjY19zZXR1cChzdHJ1Y3QgbmFuZF9j aGlwICpjaGlwLAo+ID4+ICsJwqDCoMKgwqDCoMKgIHN0cnVjdCBuYW5kX2VjY19jdHJsICplY2Ms Cj4gPj4gKwnCoMKgwqDCoMKgwqAgdWludDMyX3Qgc3RyZW5ndGgpCj4gPj4gK3sKPiA+PiArCXN0 cnVjdCBya19uZmMgKm5mYyA9IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShjaGlwKTsKPiA+PiAr CXUzMiByZWcsIGk7Cj4gPj4gKwo+ID4+ICsJZm9yIChpID0gMDsgaSA8IE5GQ19FQ0NfTUFYX01P REVTOyBpKyspIHsKPiA+PiArCWlmIChlY2MtPnN0cmVuZ3RoID09IG5mYy0+Y2ZnLT5lY2Nfc3Ry ZW5ndGhzW2ldKSB7Cj4gPj4gKwlyZWcgPSBuZmMtPmNmZy0+ZWNjX2NmZ3NbaV07Cj4gPj4gKwli cmVhazsKPiA+PiArCX0KPiA+PiArCX0KPiA+PiArCj4gPj4gKwlpZiAoaSA+PSBORkNfRUNDX01B WF9NT0RFUykKPiA+PiArCXJldHVybiAtRUlOVkFMOwo+ID4+ICsKPiA+PiArCXdyaXRlbChyZWcs IG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5iY2hjdGxfb2ZmKTsgIAo+ID4KPiA+U2FtZSBoZXJlLCBp ZiB5b3UgaGFuZGxlIGRpZmZlcmVudCBjaGlwcywgdGhleSBtYXkgdXNlIGRpZmZlcmVudCBFQ0MK PiA+Y29uZmlndXJhdGlvbnMsIHRoaXMgc2hvdWxkIGJlIGhhbmRsZWQuCj4gPiAgCj4gPj4gKwo+ ID4+ICsJcmV0dXJuIDA7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyB2b2lkIHJrX25mY194 ZmVyX3N0YXJ0KHN0cnVjdCBya19uZmMgKm5mYywgdTggcncsIHU4IG5fS0IsCj4gPj4gKwnCoMKg wqDCoMKgIGRtYV9hZGRyX3QgZG1hX2RhdGEsIGRtYV9hZGRyX3QgZG1hX29vYikKPiA+PiArewo+ ID4+ICsJdTMyIGRtYV9yZWcsIGZsX3JlZywgYmNoX3JlZzsKPiA+PiArCj4gPj4gKwlkbWFfcmVn ID0gRE1BX1NUIHwgKCghcncpIDw8IERNQV9XUikgfCBETUFfRU4gfCAoMiA8PCBETUFfQUhCX1NJ WkUpIHwKPiA+PiArCcKgwqDCoMKgwqAgKDcgPDwgRE1BX0JVUlNUX1NJWkUpIHwgKDE2IDw8IERN QV9JTkNfTlVNKTsKPiA+PiArCj4gPj4gKwlmbF9yZWcgPSAocncgPDwgRkxDVExfV1IpIHwgRkxD VExfWEZFUl9FTiB8IEZMQ1RMX0FDT1JSRUNUIHwKPiA+PiArCShuX0tCIDw8IEZMQ1RMX1hGRVJf U0VDVE9SKSB8IEZMQ1RMX1RPR19GSVg7Cj4gPj4gKwo+ID4+ICsJaWYgKG5mYy0+Y2ZnLT50eXBl ID09IE5GQ19WNiB8fCBuZmMtPmNmZy0+dHlwZSA9PSBORkNfVjgpIHsKPiA+PiArCWJjaF9yZWcg PSByZWFkbF9yZWxheGVkKG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5iY2hjdGxfb2ZmKTsKPiA+PiAr CWJjaF9yZWcgPSAoYmNoX3JlZyAmICh+QkNIQ1RMX0JBTktfTSkpIHwKPiA+PiArCcKgIChuZmMt PnNlbGVjdGVkX2JhbmsgPDwgQkNIQ1RMX0JBTkspOwo+ID4+ICsJd3JpdGVsKGJjaF9yZWcsIG5m Yy0+cmVncyArIG5mYy0+Y2ZnLT5iY2hjdGxfb2ZmKTsKPiA+PiArCX0KPiA+PiArCj4gPj4gKwl3 cml0ZWwoZG1hX3JlZywgbmZjLT5yZWdzICsgbmZjLT5jZmctPmRtYV9jZmdfb2ZmKTsKPiA+PiAr CXdyaXRlbCgodTMyKWRtYV9kYXRhLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ZG1hX2RhdGFfYnVm X29mZik7Cj4gPj4gKwl3cml0ZWwoKHUzMilkbWFfb29iLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ ZG1hX29vYl9idWZfb2ZmKTsKPiA+PiArCXdyaXRlbChmbF9yZWcsIG5mYy0+cmVncyArIG5mYy0+ Y2ZnLT5mbGN0bF9vZmYpOwo+ID4+ICsJZmxfcmVnIHw9IEZMQ1RMX1hGRVJfU1Q7Cj4gPj4gKwl3 cml0ZWwoZmxfcmVnLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ZmxjdGxfb2ZmKTsKPiA+PiArfQo+ ID4+ICsKPiA+PiArc3RhdGljIGludCBya19uZmNfd2FpdF9mb3JfeGZlcl9kb25lKHN0cnVjdCBy a19uZmMgKm5mYykKPiA+PiArewo+ID4+ICsJdm9pZCBfX2lvbWVtICpwdHI7Cj4gPj4gKwlpbnQg cmV0ID0gMDsKPiA+PiArCXUzMiByZWc7Cj4gPj4gKwo+ID4+ICsJcHRyID0gbmZjLT5yZWdzICsg bmZjLT5jZmctPmZsY3RsX29mZjsKPiA+PiArCj4gPj4gKwlyZXQgPSByZWFkbF9yZWxheGVkX3Bv bGxfdGltZW91dChwdHIsIHJlZywKPiA+PiArCXJlZyAmIEZMQ1RMX1hGRVJfUkVBRFksCj4gPj4g KwkxMCwgTkZDX1RJTUVPVVQpOwo+ID4+ICsKPiA+PiArCXJldHVybiByZXQ7Cj4gPj4gK30KPiA+ PiArCj4gPj4gK3N0YXRpYyBpbnQgcmtfbmZjX3dyaXRlX3BhZ2VfcmF3KHN0cnVjdCBuYW5kX2No aXAgKmNoaXAsIGNvbnN0IHU4ICpidWYsCj4gPj4gKwlpbnQgb29iX29uLCBpbnQgcGFnZSkKPiA+ PiArewo+ID4+ICsJc3RydWN0IG10ZF9pbmZvICptdGQgPSBuYW5kX3RvX210ZChjaGlwKTsKPiA+ PiArCXN0cnVjdCBya19uZmMgKm5mYyA9IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShjaGlwKTsK PiA+PiArCXN0cnVjdCBuYW5kX2VjY19jdHJsICplY2MgPSAmY2hpcC0+ZWNjOwo+ID4+ICsJaW50 IHJldCA9IDA7Cj4gPj4gKwl1MzIgaTsKPiA+PiArCj4gPj4gKwlpZiAoIWJ1ZikKPiA+PiArCW1l bXNldChuZmMtPmJ1ZmZlciwgMHhmZiwgbXRkLT53cml0ZXNpemUgKyBtdGQtPm9vYnNpemUpOwo+ ID4+ICsKPiA+PiArCWZvciAoaSA9IDA7IGkgPCBlY2MtPnN0ZXBzOyBpKyspIHsKPiA+PiArCS8q IENvcHkgZGF0YSB0byBuZmMgYnVmZmVyLiAqLwo+ID4+ICsJaWYgKGJ1ZikKPiA+PiArCW1lbWNw eShya19uZmNfZGF0YV9wdHIoY2hpcCwgaSksCj4gPj4gKwnCoMKgwqDCoMKgwqAgcmtfbmZjX2J1 Zl90b19kYXRhX3B0cihjaGlwLCBidWYsIGkpLAo+ID4+ICsJwqDCoMKgwqDCoMKgIGVjYy0+c2l6 ZSk7Cj4gPj4gKwkvKgo+ID4+ICsJKiBUaGUgZmlyc3QgZm91ciBieXRlcyBvZiBPT0IgYXJlIHJl c2VydmVkIGZvciB0aGUKPiA+PiArCSogYm9vdCBST00uIEluIHNvbWUgZGVidWdnaW5nIGNhc2Vz LCBzdWNoIGFzIHdpdGggYQo+ID4+ICsJKiByZWFkLCBlcmFzZSBhbmQgd3JpdGUgYmFjayB0ZXN0 IHRoZXNlIDQgYnl0ZXMgc3RvcmVkCj4gPj4gKwkqIGluIE9PQiBhbHNvIG5lZWQgdG8gYmUgd3Jp dHRlbiBiYWNrLgo+ID4+ICsJKi8gIAo+ID4KPiA+VGhlIGNvbnRyb2xsZXIgZHJpdmVyIHNob3Vs ZCBub3QgYXJiaXRyYXRlIHRoaXMuIElmIHlvdSBkb24ndCB3YW50IHRvCj4gPmV4cG9zZSB0aGVz ZSBieXRlcywgdGhleSBzaG91bGQgbm90IGFwcGVhciAiZnJlZSIgaW4gdGhlIE9PQiBsYXlvdXQs Cj4gPmJ1dCBhIHJhdyBhY2Nlc3MgKm11c3QqIGJ1dCBhYmxlIHRvIGFkZHJlc3MgdGhlIGVudGly ZSBwYWdlL29vYi4gIAo+IAo+IEkgZG9uJ3QgaGF2ZSBhIHNvbHV0aW9uIHRvIGZpeCBpdC4KPiBU aGUgZnVuY3Rpb27CoG5hbmRfYmxvY2tfYmFkIGRldGVjdCBiYWQgYmxvY2sgbGlrZSBpdDoKPiDC oCDCoMKgYmFkID0gY2hpcC0+b29iX3BvaVtjaGlwLT5iYWRibG9ja3Bvc107IC8vY2hpcC0+YmFk YmxvY2twb3MgPSAwIGZvciBsYXJnZSBwYWdlIE5BTkQgRmxhc2guCj4gU2/CoGNoaXAtPm9vYl9w b2lbMF0gaXMgYmFkIG1hc2tlci4KPiAKPiBUaGUgb29iIGRhdGEgbGF5b3V0IGZvciByayBuZmMg aXM6Cj4gwqBQQTAgUEExIFBBMiBQQTMgfCBCQk0gT09CMSBPT0IyIE9PQjMgfCAuLi4KPiBvcgo+ IMKgMHhGRiAweEZGIDB4RkYgMHhGRiB8IEJCTSBPT0IxIE9PQjIgT09CMyB8IC4uLgo+IAo+IFRo ZSBjb2RlIGhlcmUganVzdCB0byBzd2FwIHRoZSBmaXJzdCA0IGJ5dGVzIHdpdGggdGhlIGxhc3Qg NCBieXRlcyBhbmQgd2l0aG91dCBkcm9wZWQgYW55IMKgZGF0YS4KPiBhbmQgdGhlIGNoaXAtPm9v Yl9wb2kgZGF0YSBsYXlvdXQ6Cj4gQkJNIE9PQjEgT09CMiBPT0IzfC4uLi4uLnzCoFBBMCBQQTEg UEEyIFBBM8KgCj4gCj4gVGhlIE9PQiBsYXlvdXQgZnJlZSBhbHJlYWR5IHJlc2VydmVkIHRoaXMg NCBieXRlczoKPiBvb2JfcmVnaW9uLT5vZmZzZXQgPSBORkNfU1lTX0RBVEFfU0laRSArIDI7Cj4g Cj4gPj4gKwlpZiAoIWkpCj4gPj4gKwltZW1jcHkocmtfbmZjX29vYl9wdHIoY2hpcCwgaSksCj4g Pj4gKwnCoMKgwqDCoMKgwqAgcmtfbmZjX2J1Zl90b19vb2JfcHRyKGNoaXAsIGVjYy0+c3RlcHMg LSAxKSwKPiA+PiArCcKgwqDCoMKgwqDCoCBORkNfU1lTX0RBVEFfU0laRSk7Cj4gPj4gKwllbHNl Cj4gPj4gKwltZW1jcHkocmtfbmZjX29vYl9wdHIoY2hpcCwgaSksCj4gPj4gKwnCoMKgwqDCoMKg wqAgcmtfbmZjX2J1Zl90b19vb2JfcHRyKGNoaXAsIGkgLSAxKSwKPiA+PiArCcKgwqDCoMKgwqDC oCBORkNfU1lTX0RBVEFfU0laRSk7Cj4gPj4gKwkvKiBDb3B5IEVDQyBkYXRhIHRvIHRoZSBORkMg YnVmZmVyLiAqLwo+ID4+ICsJbWVtY3B5KHJrX25mY19vb2JfcHRyKGNoaXAsIGkpICsgTkZDX1NZ U19EQVRBX1NJWkUsCj4gPj4gKwnCoMKgwqDCoMKgwqAgcmtfbmZjX2J1Zl90b19vb2JfZWNjX3B0 cihjaGlwLCBpKSwKPiA+PiArCcKgwqDCoMKgwqDCoCBlY2MtPmJ5dGVzKTsKPiA+PiArCX0KPiA+ PiArCj4gPj4gKwluYW5kX3Byb2dfcGFnZV9iZWdpbl9vcChjaGlwLCBwYWdlLCAwLCBOVUxMLCAw KTsKPiA+PiArCXJrX25mY193cml0ZV9idWYobmZjLCBidWYsIG10ZC0+d3JpdGVzaXplICsgbXRk LT5vb2JzaXplKTsKPiA+PiArCXJldCA9IG5hbmRfcHJvZ19wYWdlX2VuZF9vcChjaGlwKTsKPiA+ PiArCj4gPj4gKwkvKgo+ID4+ICsJKiBEZXNlbGVjdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRh cmdldCBhZnRlciB0aGUgb3BzIGlzIGRvbmUKPiA+PiArCSogdG8gcmVkdWNlIHRoZSBwb3dlciBj b25zdW1wdGlvbi4KPiA+PiArCSovCj4gPj4gKwlya19uZmNfc2VsZWN0X2NoaXAoY2hpcCwgLTEp Owo+ID4+ICsKPiA+PiArCXJldHVybiByZXQ7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyBp bnQgcmtfbmZjX3dyaXRlX29vYihzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQgcGFnZSkKPiA+ PiArewo+ID4+ICsJcmV0dXJuIHJrX25mY193cml0ZV9wYWdlX3JhdyhjaGlwLCBOVUxMLCAxLCBw YWdlKTsgIAo+ID4KPiA+Tm90IHN1cmUgdGhpcyBpcyByZWxldmFudC4gWW91IHNob3VsZCBub3Qg ZG8gdGhhdCwgSSBndWVzcyB0aGUgY29yZQo+ID53aWxsIGF1dG9tYXRpY2FsbHkgdGFrZSBjYXJl IG9mIGl0Lgo+ID4gIAo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgaW50IHJrX25mY193cml0 ZV9wYWdlX2h3ZWNjKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIGNvbnN0IHU4ICpidWYsCj4gPj4g KwnCoMKgIGludCBvb2Jfb24sIGludCBwYWdlKQo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgbXRkX2lu Zm8gKm10ZCA9IG5hbmRfdG9fbXRkKGNoaXApOwo+ID4+ICsJc3RydWN0IHJrX25mYyAqbmZjID0g bmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ID4+ICsJc3RydWN0IHJrX25mY19uYW5k X2NoaXAgKnJrbmFuZCA9IHJrX25mY190b19ya25hbmQoY2hpcCk7Cj4gPj4gKwlzdHJ1Y3QgbmFu ZF9lY2NfY3RybCAqZWNjID0gJmNoaXAtPmVjYzsKPiA+PiArCWludCBvb2Jfc3RlcCA9IChlY2Mt PmJ5dGVzID4gNjApID8gTkZDX01BWF9PT0JfUEVSX1NURVAgOgo+ID4+ICsJTkZDX01JTl9PT0Jf UEVSX1NURVA7Cj4gPj4gKwlpbnQgcGFnZXNfcGVyX2JsayA9IG10ZC0+ZXJhc2VzaXplIC8gbXRk LT53cml0ZXNpemU7Cj4gPj4gKwlpbnQgcmV0ID0gMCwgaSwgYm9vdF9yb21fbW9kZSA9IDA7Cj4g Pj4gKwlkbWFfYWRkcl90IGRtYV9kYXRhLCBkbWFfb29iOwo+ID4+ICsJdTMyIHJlZzsKPiA+PiAr CXU4ICpvb2I7Cj4gPj4gKwo+ID4+ICsJbmFuZF9wcm9nX3BhZ2VfYmVnaW5fb3AoY2hpcCwgcGFn ZSwgMCwgTlVMTCwgMCk7Cj4gPj4gKwo+ID4+ICsJbWVtY3B5KG5mYy0+cGFnZV9idWYsIGJ1Ziwg bXRkLT53cml0ZXNpemUpOwo+ID4+ICsKPiA+PiArCS8qCj4gPj4gKwkqIFRoZSBmaXJzdCBibG9j a3MgKDQsIDggb3IgMTYgZGVwZW5kaW5nIG9uIHRoZSBkZXZpY2UpIGFyZSB1c2VkCj4gPj4gKwkq IGJ5IHRoZSBib290IFJPTSBhbmQgdGhlIGZpcnN0IDMyIGJpdHMgb2YgT09CIG5lZWQgdG8gbGlu ayB0bwo+ID4+ICsJKiB0aGUgbmV4dCBwYWdlIGFkZHJlc3MgaW4gdGhlIHNhbWUgYmxvY2suIFdl IGNhbid0IGRpcmVjdGx5IGNvcHkKPiA+PiArCSogT09CIGRhdGEgZnJvbSB0aGUgTVREIGZyYW1l d29yaywgYmVjYXVzZSB0aGlzIHBhZ2UgYWRkcmVzcwo+ID4+ICsJKiBjb25mbGljdHMgZm9yIGV4 YW1wbGUgd2l0aCB0aGUgYmFkIGJsb2NrIG1hcmtlciAoQkJNKSwKPiA+PiArCSogc28gd2Ugc2hp ZnQgYWxsIE9PQiBkYXRhIGluY2x1ZGluZyB0aGUgQkJNIHdpdGggNCBieXRlIHBvc2l0aW9ucy4K PiA+PiArCSogQXMgYSBjb25zZXF1ZW5jZSB0aGUgT09CIHNpemUgYXZhaWxhYmxlIHRvIHRoZSBN VEQgZnJhbWV3b3JrIGlzCj4gPj4gKwkqIGFsc28gcmVkdWNlZCB3aXRoIDQgYnl0ZXMuCj4gPj4g KwkqCj4gPj4gKwkqwqDCoMKgIFBBMCBQQTEgUEEyIFBBMyB8IEJCTSBPT0IxIE9PQjIgT09CMyB8 IC4uLgo+ID4+ICsJKgo+ID4+ICsJKiBJZiBhIE5BTkQgaXMgbm90IGEgYm9vdCBtZWRpdW0gb3Ig dGhlIHBhZ2UgaXMgbm90IGEgYm9vdCBibG9jaywKPiA+PiArCSogdGhlIGZpcnN0IDQgYnl0ZXMg YXJlIGxlZnQgdW50b3VjaGVkIGJ5IHdyaXRpbmcgMHhGRiB0byB0aGVtLgo+ID4+ICsJKgo+ID4+ ICsJKsKgwqAgMHhGRiAweEZGIDB4RkYgMHhGRiB8IEJCTSBPT0IxIE9PQjIgT09CMyB8IC4uLgo+ ID4+ICsJKgo+ID4+ICsJKiBDb25maWd1cmUgdGhlIEVDQyBhbGdvcml0aG0gc3VwcG9ydGVkIGJ5 IHRoZSBib290IFJPTS4KPiA+PiArCSovCj4gPj4gKwlpZiAoKHBhZ2UgPCBwYWdlc19wZXJfYmxr ICogcmtuYW5kLT5ib290X2Jsa3MpICYmCj4gPj4gKwnCoMKgwqAgKGNoaXAtPm9wdGlvbnMgJiBO QU5EX0lTX0JPT1RfTUVESVVNKSkgewo+ID4+ICsJYm9vdF9yb21fbW9kZSA9IDE7Cj4gPj4gKwlp ZiAocmtuYW5kLT5ib290X2VjYyAhPSBlY2MtPnN0cmVuZ3RoKQo+ID4+ICsJcmtfbmZjX2h3X2Vj Y19zZXR1cChjaGlwLCBlY2MsCj4gPj4gKwnCoMKgwqAgcmtuYW5kLT5ib290X2VjYyk7Cj4gPj4g Kwl9Cj4gPj4gKwo+ID4+ICsJZm9yIChpID0gMDsgaSA8IGVjYy0+c3RlcHM7IGkrKykgewo+ID4+ ICsJaWYgKCFpKSB7Cj4gPj4gKwlyZWcgPSAweEZGRkZGRkZGOwo+ID4+ICsJfSBlbHNlIHsKPiA+ PiArCW9vYiA9IGNoaXAtPm9vYl9wb2kgKyAoaSAtIDEpICogTkZDX1NZU19EQVRBX1NJWkU7Cj4g Pj4gKwlyZWcgPSBvb2JbMF0gfCBvb2JbMV0gPDwgOCB8IG9vYlsyXSA8PCAxNiB8Cj4gPj4gKwnC oMKgwqDCoMKgIG9vYlszXSA8PCAyNDsKPiA+PiArCX0KPiA+PiArCWlmICghaSAmJiBib290X3Jv bV9tb2RlKQo+ID4+ICsJcmVnID0gKHBhZ2UgJiAocGFnZXNfcGVyX2JsayAtIDEpKSAqIDQ7Cj4g Pj4gKwo+ID4+ICsJaWYgKG5mYy0+Y2ZnLT50eXBlID09IE5GQ19WOSkKPiA+PiArCW5mYy0+b29i X2J1ZltpXSA9IHJlZzsKPiA+PiArCWVsc2UKPiA+PiArCW5mYy0+b29iX2J1ZltpICogKG9vYl9z dGVwIC8gNCldID0gcmVnOwo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCWRtYV9kYXRhID0gZG1hX21h cF9zaW5nbGUobmZjLT5kZXYsICh2b2lkICopbmZjLT5wYWdlX2J1ZiwKPiA+PiArCcKgIG10ZC0+ d3JpdGVzaXplLCBETUFfVE9fREVWSUNFKTsKPiA+PiArCWRtYV9vb2IgPSBkbWFfbWFwX3Npbmds ZShuZmMtPmRldiwgbmZjLT5vb2JfYnVmLAo+ID4+ICsJZWNjLT5zdGVwcyAqIG9vYl9zdGVwLAo+ ID4+ICsJRE1BX1RPX0RFVklDRSk7Cj4gPj4gKwo+ID4+ICsJcmVpbml0X2NvbXBsZXRpb24oJm5m Yy0+ZG9uZSk7Cj4gPj4gKwl3cml0ZWwoSU5UX0RNQSwgbmZjLT5yZWdzICsgbmZjLT5jZmctPmlu dF9lbl9vZmYpOwo+ID4+ICsKPiA+PiArCXJrX25mY194ZmVyX3N0YXJ0KG5mYywgTkZDX1dSSVRF LCBlY2MtPnN0ZXBzLCBkbWFfZGF0YSwKPiA+PiArCcKgIGRtYV9vb2IpOwo+ID4+ICsJcmV0ID0g d2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZuZmMtPmRvbmUsCj4gPj4gKwnCoCBtc2Vjc190 b19qaWZmaWVzKDEwMCkpOwo+ID4+ICsJaWYgKCFyZXQpCj4gPj4gKwlkZXZfd2FybihuZmMtPmRl diwgIndyaXRlOiB3YWl0IGRtYSBkb25lIHRpbWVvdXQuXG4iKTsKPiA+PiArCS8qCj4gPj4gKwkq IFdoZXRoZXIgdGhlIERNQSB0cmFuc2ZlciBpcyBjb21wbGV0ZWQgb3Igbm90LiBUaGUgZHJpdmVy Cj4gPj4gKwkqIG5lZWRzIHRvIGNoZWNrIHRoZSBORkNgcyBzdGF0dXMgcmVnaXN0ZXIgdG8gc2Vl IGlmIHRoZSBkYXRhCj4gPj4gKwkqIHRyYW5zZmVyIHdhcyBjb21wbGV0ZWQuCj4gPj4gKwkqLwo+ ID4+ICsJcmV0ID0gcmtfbmZjX3dhaXRfZm9yX3hmZXJfZG9uZShuZmMpOwo+ID4+ICsKPiA+PiAr CWRtYV91bm1hcF9zaW5nbGUobmZjLT5kZXYsIGRtYV9kYXRhLCBtdGQtPndyaXRlc2l6ZSwKPiA+ PiArCURNQV9UT19ERVZJQ0UpOwo+ID4+ICsJZG1hX3VubWFwX3NpbmdsZShuZmMtPmRldiwgZG1h X29vYiwgZWNjLT5zdGVwcyAqIG9vYl9zdGVwLAo+ID4+ICsJRE1BX1RPX0RFVklDRSk7Cj4gPj4g Kwo+ID4+ICsJaWYgKGJvb3Rfcm9tX21vZGUgJiYgcmtuYW5kLT5ib290X2VjYyAhPSBlY2MtPnN0 cmVuZ3RoKQo+ID4+ICsJcmtfbmZjX2h3X2VjY19zZXR1cChjaGlwLCBlY2MsIGVjYy0+c3RyZW5n dGgpOwo+ID4+ICsKPiA+PiArCWlmIChyZXQpIHsKPiA+PiArCXJldCA9IC1FSU87Cj4gPj4gKwlk ZXZfZXJyKG5mYy0+ZGV2LAo+ID4+ICsJIndyaXRlOiB3YWl0IHRyYW5zZmVyIGRvbmUgdGltZW91 dC5cbiIpOwo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCWlmIChyZXQpCj4gPj4gKwlyZXR1cm4gcmV0 Owo+ID4+ICsKPiA+PiArCXJldCA9IG5hbmRfcHJvZ19wYWdlX2VuZF9vcChjaGlwKTsKPiA+PiAr Cj4gPj4gKwkvKgo+ID4+ICsJKiBEZXNlbGVjdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRhcmdl dCBhZnRlciB0aGUgb3BzIGlzIGRvbmUKPiA+PiArCSogdG8gcmVkdWNlIHRoZSBwb3dlciBjb25z dW1wdGlvbi4KPiA+PiArCSovICAKPiA+Cj4gPklmIHlvdSBmb3JjZSB0aGlzIGRlc2VsZWN0aW9u LCB5b3VyIHNob3VsZCBwcm9iYWJseSBkbyBpdCBldmVuIGluIGNhc2UKPiA+b2YgZXJyb3I/Cj4g PiAgCj4gPj4gKwlya19uZmNfc2VsZWN0X2NoaXAoY2hpcCwgLTEpOwo+ID4+ICsKPiA+PiArCXJl dHVybiByZXQ7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyBpbnQgcmtfbmZjX3JlYWRfcGFn ZV9yYXcoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgdTggKmJ1ZiwgaW50IG9vYl9vbiwKPiA+PiAr CWludCBwYWdlKQo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9f bXRkKGNoaXApOwo+ID4+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxl cl9kYXRhKGNoaXApOwo+ID4+ICsJc3RydWN0IG5hbmRfZWNjX2N0cmwgKmVjYyA9ICZjaGlwLT5l Y2M7Cj4gPj4gKwlpbnQgaTsKPiA+PiArCj4gPj4gKwluYW5kX3JlYWRfcGFnZV9vcChjaGlwLCBw YWdlLCAwLCBOVUxMLCAwKTsKPiA+PiArCXJrX25mY19yZWFkX2J1ZihuZmMsIG5mYy0+YnVmZmVy LCBtdGQtPndyaXRlc2l6ZSArIG10ZC0+b29ic2l6ZSk7Cj4gPj4gKwo+ID4+ICsJLyoKPiA+PiAr CSogRGVzZWxlY3QgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0YXJnZXQgYWZ0ZXIgdGhlIG9wcyBp cyBkb25lCj4gPj4gKwkqIHRvIHJlZHVjZSB0aGUgcG93ZXIgY29uc3VtcHRpb24uCj4gPj4gKwkq Lwo+ID4+ICsJcmtfbmZjX3NlbGVjdF9jaGlwKGNoaXAsIC0xKTsKPiA+PiArCj4gPj4gKwlmb3Ig KGkgPSAwOyBpIDwgZWNjLT5zdGVwczsgaSsrKSB7Cj4gPj4gKwkvKgo+ID4+ICsJKiBUaGUgZmly c3QgZm91ciBieXRlcyBvZiBPT0IgYXJlIHJlc2VydmVkIGZvciB0aGUKPiA+PiArCSogYm9vdCBS T00uIEluIHNvbWUgZGVidWdnaW5nIGNhc2VzLCBzdWNoIGFzIHdpdGggYSByZWFkLAo+ID4+ICsJ KiBlcmFzZSBhbmQgd3JpdGUgYmFjayB0ZXN0LCB0aGVzZSA0IGJ5dGVzIGFsc28gbXVzdCBiZQo+ ID4+ICsJKiBzYXZlZCBzb21ld2hlcmUsIG90aGVyd2lzZSB0aGlzIGluZm9ybWF0aW9uIHdpbGwg YmUKPiA+PiArCSogbG9zdCBkdXJpbmcgYSB3cml0ZSBiYWNrLiAgCj4gPgo+ID5EaXR0bwo+ID4g IAo+ID4+ICsJKi8KPiA+PiArCWlmICghaSkKPiA+PiArCW1lbWNweShya19uZmNfYnVmX3RvX29v Yl9wdHIoY2hpcCwgZWNjLT5zdGVwcyAtIDEpLAo+ID4+ICsJwqDCoMKgwqDCoMKgIHJrX25mY19v b2JfcHRyKGNoaXAsIGkpLAo+ID4+ICsJwqDCoMKgwqDCoMKgIE5GQ19TWVNfREFUQV9TSVpFKTsK PiA+PiArCWVsc2UKPiA+PiArCW1lbWNweShya19uZmNfYnVmX3RvX29vYl9wdHIoY2hpcCwgaSAt IDEpLAo+ID4+ICsJwqDCoMKgwqDCoMKgIHJrX25mY19vb2JfcHRyKGNoaXAsIGkpLAo+ID4+ICsJ wqDCoMKgwqDCoMKgIE5GQ19TWVNfREFUQV9TSVpFKTsKPiA+PiArCS8qIENvcHkgRUNDIGRhdGEg ZnJvbSB0aGUgTkZDIGJ1ZmZlci4gKi8KPiA+PiArCW1lbWNweShya19uZmNfYnVmX3RvX29vYl9l Y2NfcHRyKGNoaXAsIGkpLAo+ID4+ICsJwqDCoMKgwqDCoMKgIHJrX25mY19vb2JfcHRyKGNoaXAs IGkpICsgTkZDX1NZU19EQVRBX1NJWkUsCj4gPj4gKwnCoMKgwqDCoMKgwqAgZWNjLT5ieXRlcyk7 Cj4gPj4gKwkvKiBDb3B5IGRhdGEgZnJvbSB0aGUgTkZDIGJ1ZmZlci4gKi8KPiA+PiArCWlmIChi dWYpCj4gPj4gKwltZW1jcHkocmtfbmZjX2J1Zl90b19kYXRhX3B0cihjaGlwLCBidWYsIGkpLAo+ ID4+ICsJwqDCoMKgwqDCoMKgIHJrX25mY19kYXRhX3B0cihjaGlwLCBpKSwKPiA+PiArCcKgwqDC oMKgwqDCoCBlY2MtPnNpemUpOwo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCXJldHVybiAwOwo+ID4+ ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgaW50IHJrX25mY19yZWFkX29vYihzdHJ1Y3QgbmFuZF9j aGlwICpjaGlwLCBpbnQgcGFnZSkKPiA+PiArewo+ID4+ICsJcmV0dXJuIHJrX25mY19yZWFkX3Bh Z2VfcmF3KGNoaXAsIE5VTEwsIDEsIHBhZ2UpOyAgCj4gPgo+ID5EaXR0bwo+ID4gIAo+ID4+ICt9 Cj4gPj4gKwo+ID4+ICtzdGF0aWMgaW50IHJrX25mY19yZWFkX3BhZ2VfaHdlY2Moc3RydWN0IG5h bmRfY2hpcCAqY2hpcCwgdTggKmJ1ZiwgaW50IG9vYl9vbiwKPiA+PiArCcKgIGludCBwYWdlKQo+ ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKGNoaXApOwo+ ID4+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXAp Owo+ID4+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZCA9IHJrX25mY190b19ya25h bmQoY2hpcCk7Cj4gPj4gKwlzdHJ1Y3QgbmFuZF9lY2NfY3RybCAqZWNjID0gJmNoaXAtPmVjYzsK PiA+PiArCWludCBvb2Jfc3RlcCA9IChlY2MtPmJ5dGVzID4gNjApID8gTkZDX01BWF9PT0JfUEVS X1NURVAgOgo+ID4+ICsJTkZDX01JTl9PT0JfUEVSX1NURVA7Cj4gPj4gKwlpbnQgcGFnZXNfcGVy X2JsayA9IG10ZC0+ZXJhc2VzaXplIC8gbXRkLT53cml0ZXNpemU7Cj4gPj4gKwlkbWFfYWRkcl90 IGRtYV9kYXRhLCBkbWFfb29iOwo+ID4+ICsJaW50IHJldCA9IDAsIGksIGJvb3Rfcm9tX21vZGUg PSAwOwo+ID4+ICsJaW50IGJpdGZsaXBzID0gMCwgYmNoX3N0Owo+ID4+ICsJdTggKm9vYjsKPiA+ PiArCXUzMiB0bXA7Cj4gPj4gKwo+ID4+ICsJbmFuZF9yZWFkX3BhZ2Vfb3AoY2hpcCwgcGFnZSwg MCwgTlVMTCwgMCk7Cj4gPj4gKwo+ID4+ICsJZG1hX2RhdGEgPSBkbWFfbWFwX3NpbmdsZShuZmMt PmRldiwgbmZjLT5wYWdlX2J1ZiwKPiA+PiArCcKgIG10ZC0+d3JpdGVzaXplLAo+ID4+ICsJwqAg RE1BX0ZST01fREVWSUNFKTsKPiA+PiArCWRtYV9vb2IgPSBkbWFfbWFwX3NpbmdsZShuZmMtPmRl diwgbmZjLT5vb2JfYnVmLAo+ID4+ICsJZWNjLT5zdGVwcyAqIG9vYl9zdGVwLAo+ID4+ICsJRE1B X0ZST01fREVWSUNFKTsKPiA+PiArCj4gPj4gKwkvKgo+ID4+ICsJKiBUaGUgZmlyc3QgYmxvY2tz ICg0LCA4IG9yIDE2IGRlcGVuZGluZyBvbiB0aGUgZGV2aWNlKQo+ID4+ICsJKiBhcmUgdXNlZCBi eSB0aGUgYm9vdCBST00uCj4gPj4gKwkqIENvbmZpZ3VyZSB0aGUgRUNDIGFsZ29yaXRobSBzdXBw b3J0ZWQgYnkgdGhlIGJvb3QgUk9NLgo+ID4+ICsJKi8KPiA+PiArCWlmICgocGFnZSA8IHBhZ2Vz X3Blcl9ibGsgKiBya25hbmQtPmJvb3RfYmxrcykgJiYKPiA+PiArCcKgwqDCoCAoY2hpcC0+b3B0 aW9ucyAmIE5BTkRfSVNfQk9PVF9NRURJVU0pKSB7Cj4gPj4gKwlib290X3JvbV9tb2RlID0gMTsK PiA+PiArCWlmIChya25hbmQtPmJvb3RfZWNjICE9IGVjYy0+c3RyZW5ndGgpCj4gPj4gKwlya19u ZmNfaHdfZWNjX3NldHVwKGNoaXAsIGVjYywKPiA+PiArCcKgwqDCoCBya25hbmQtPmJvb3RfZWNj KTsKPiA+PiArCX0KPiA+PiArCj4gPj4gKwlyZWluaXRfY29tcGxldGlvbigmbmZjLT5kb25lKTsK PiA+PiArCXdyaXRlbChJTlRfRE1BLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+aW50X2VuX29mZik7 Cj4gPj4gKwlya19uZmNfeGZlcl9zdGFydChuZmMsIE5GQ19SRUFELCBlY2MtPnN0ZXBzLCBkbWFf ZGF0YSwKPiA+PiArCcKgIGRtYV9vb2IpOwo+ID4+ICsJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlv bl90aW1lb3V0KCZuZmMtPmRvbmUsCj4gPj4gKwnCoCBtc2Vjc190b19qaWZmaWVzKDEwMCkpOwo+ ID4+ICsJaWYgKCFyZXQpCj4gPj4gKwlkZXZfd2FybihuZmMtPmRldiwgInJlYWQ6IHdhaXQgZG1h IGRvbmUgdGltZW91dC5cbiIpOwo+ID4+ICsJLyoKPiA+PiArCSogV2hldGhlciB0aGUgRE1BIHRy YW5zZmVyIGlzIGNvbXBsZXRlZCBvciBub3QuIFRoZSBkcml2ZXIKPiA+PiArCSogbmVlZHMgdG8g Y2hlY2sgdGhlIE5GQ2BzIHN0YXR1cyByZWdpc3RlciB0byBzZWUgaWYgdGhlIGRhdGEKPiA+PiAr CSogdHJhbnNmZXIgd2FzIGNvbXBsZXRlZC4KPiA+PiArCSovCj4gPj4gKwlyZXQgPSBya19uZmNf d2FpdF9mb3JfeGZlcl9kb25lKG5mYyk7Cj4gPj4gKwlkbWFfdW5tYXBfc2luZ2xlKG5mYy0+ZGV2 LCBkbWFfZGF0YSwgbXRkLT53cml0ZXNpemUsCj4gPj4gKwlETUFfRlJPTV9ERVZJQ0UpOwo+ID4+ ICsJZG1hX3VubWFwX3NpbmdsZShuZmMtPmRldiwgZG1hX29vYiwgZWNjLT5zdGVwcyAqIG9vYl9z dGVwLAo+ID4+ICsJRE1BX0ZST01fREVWSUNFKTsKPiA+PiArCj4gPj4gKwlpZiAocmV0KSB7Cj4g Pj4gKwliaXRmbGlwcyA9IC1FSU87Cj4gPj4gKwlkZXZfZXJyKG5mYy0+ZGV2LAo+ID4+ICsJInJl YWQ6IHdhaXQgdHJhbnNmZXIgZG9uZSB0aW1lb3V0LlxuIik7Cj4gPj4gKwlnb3RvIG91dDsKPiA+ PiArCX0KPiA+PiArCj4gPj4gKwlmb3IgKGkgPSAxOyBpIDwgZWNjLT5zdGVwczsgaSsrKSB7Cj4g Pj4gKwlvb2IgPSBjaGlwLT5vb2JfcG9pICsgKGkgLSAxKSAqIE5GQ19TWVNfREFUQV9TSVpFOwo+ ID4+ICsJaWYgKG5mYy0+Y2ZnLT50eXBlID09IE5GQ19WOSkKPiA+PiArCXRtcCA9IG5mYy0+b29i X2J1ZltpXTsKPiA+PiArCWVsc2UKPiA+PiArCXRtcCA9IG5mYy0+b29iX2J1ZltpICogKG9vYl9z dGVwIC8gNCldOwo+ID4+ICsJKm9vYisrID0gKHU4KXRtcDsKPiA+PiArCSpvb2IrKyA9ICh1OCko dG1wID4+IDgpOwo+ID4+ICsJKm9vYisrID0gKHU4KSh0bXAgPj4gMTYpOwo+ID4+ICsJKm9vYisr ID0gKHU4KSh0bXAgPj4gMjQpOwo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCWZvciAoaSA9IDA7IGkg PCAoZWNjLT5zdGVwcyAvIDIpOyBpKyspIHsKPiA+PiArCWJjaF9zdCA9IHJlYWRsX3JlbGF4ZWQo bmZjLT5yZWdzICsKPiA+PiArCcKgwqDCoMKgwqDCoCBuZmMtPmNmZy0+YmNoX3N0X29mZiArIGkg KiA0KTsKPiA+PiArCWlmIChiY2hfc3QgJiBCSVQobmZjLT5jZmctPmVjYzAuZXJyX2ZsYWdfYml0 KSB8fAo+ID4+ICsJwqDCoMKgIGJjaF9zdCAmIEJJVChuZmMtPmNmZy0+ZWNjMS5lcnJfZmxhZ19i aXQpKSB7Cj4gPj4gKwltdGQtPmVjY19zdGF0cy5mYWlsZWQrKzsKPiA+PiArCWJpdGZsaXBzID0g MDsKPiA+PiArCX0gZWxzZSB7Cj4gPj4gKwlyZXQgPSBFQ0NfRVJSX0NOVChiY2hfc3QsIG5mYy0+ Y2ZnLT5lY2MwKTsKPiA+PiArCW10ZC0+ZWNjX3N0YXRzLmNvcnJlY3RlZCArPSByZXQ7Cj4gPj4g KwliaXRmbGlwcyA9IG1heF90KHUzMiwgYml0ZmxpcHMsIHJldCk7Cj4gPj4gKwo+ID4+ICsJcmV0 ID0gRUNDX0VSUl9DTlQoYmNoX3N0LCBuZmMtPmNmZy0+ZWNjMSk7Cj4gPj4gKwltdGQtPmVjY19z dGF0cy5jb3JyZWN0ZWQgKz0gcmV0Owo+ID4+ICsJYml0ZmxpcHMgPSBtYXhfdCh1MzIsIGJpdGZs aXBzLCByZXQpOwo+ID4+ICsJfQo+ID4+ICsJfQo+ID4+ICtvdXQ6Cj4gPj4gKwltZW1jcHkoYnVm LCBuZmMtPnBhZ2VfYnVmLCBtdGQtPndyaXRlc2l6ZSk7Cj4gPj4gKwo+ID4+ICsJaWYgKGJvb3Rf cm9tX21vZGUgJiYgcmtuYW5kLT5ib290X2VjYyAhPSBlY2MtPnN0cmVuZ3RoKQo+ID4+ICsJcmtf bmZjX2h3X2VjY19zZXR1cChjaGlwLCBlY2MsIGVjYy0+c3RyZW5ndGgpOwo+ID4+ICsKPiA+PiAr CWlmIChiaXRmbGlwcyA+IGVjYy0+c3RyZW5ndGgpCj4gPj4gKwlkZXZfZXJyKG5mYy0+ZGV2LCAi cmVhZCBwYWdlOiAleCBlY2MgZXJyb3IhXG4iLCBwYWdlKTsKPiA+PiArCj4gPj4gKwkvKgo+ID4+ ICsJKiBEZXNlbGVjdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRhcmdldCBhZnRlciB0aGUgb3Bz IGlzIGRvbmUKPiA+PiArCSogdG8gcmVkdWNlIHRoZSBwb3dlciBjb25zdW1wdGlvbi4KPiA+PiAr CSovCj4gPj4gKwlya19uZmNfc2VsZWN0X2NoaXAoY2hpcCwgLTEpOwo+ID4+ICsKPiA+PiArCXJl dHVybiBiaXRmbGlwczsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGlubGluZSB2b2lkIHJr X25mY19od19pbml0KHN0cnVjdCBya19uZmMgKm5mYykKPiA+PiArewo+ID4+ICsJLyogRGlzYWJs ZSBmbGFzaCB3cC4gKi8KPiA+PiArCXdyaXRlbChGTUNUTF9XUCwgbmZjLT5yZWdzICsgTkZDX0ZN Q1RMKTsKPiA+PiArCS8qIENvbmZpZyBkZWZhdWx0IHRpbWluZyA0MG5zIGF0IDE1MCBNaHogbmZj IGNsb2NrLiAqLwo+ID4+ICsJd3JpdGVsKDB4MTA4MSwgbmZjLT5yZWdzICsgTkZDX0ZNV0FJVCk7 Cj4gPj4gKwkvKiBEaXNhYmxlIHJhbmRvbWl6ZXIgYW5kIERNQS4gKi8KPiA+PiArCXdyaXRlbCgw LCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+cmFuZG16X29mZik7Cj4gPj4gKwl3cml0ZWwoMCwgbmZj LT5yZWdzICsgbmZjLT5jZmctPmRtYV9jZmdfb2ZmKTsKPiA+PiArCXdyaXRlbChGTENUTF9SU1Qs IG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5mbGN0bF9vZmYpOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtz dGF0aWMgaXJxcmV0dXJuX3QgcmtfbmZjX2lycShpbnQgaXJxLCB2b2lkICppZCkKPiA+PiArewo+ ID4+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gaWQ7Cj4gPj4gKwl1MzIgc3RhLCBpZW47Cj4gPj4g Kwo+ID4+ICsJc3RhID0gcmVhZGxfcmVsYXhlZChuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+aW50X3N0 X29mZik7Cj4gPj4gKwlpZW4gPSByZWFkbF9yZWxheGVkKG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5p bnRfZW5fb2ZmKTsKPiA+PiArCj4gPj4gKwlpZiAoIShzdGEgJiBpZW4pKQo+ID4+ICsJcmV0dXJu IElSUV9OT05FOwo+ID4+ICsKPiA+PiArCXdyaXRlbChzdGEsIG5mYy0+cmVncyArIG5mYy0+Y2Zn LT5pbnRfY2xyX29mZik7Cj4gPj4gKwl3cml0ZWwofnN0YSAmIGllbiwgbmZjLT5yZWdzICsgbmZj LT5jZmctPmludF9lbl9vZmYpOwo+ID4+ICsKPiA+PiArCWNvbXBsZXRlKCZuZmMtPmRvbmUpOwo+ ID4+ICsKPiA+PiArCXJldHVybiBJUlFfSEFORExFRDsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3Rh dGljIGludCBya19uZmNfZW5hYmxlX2Nsa3Moc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgcmtf bmZjICpuZmMpCj4gPj4gK3sKPiA+PiArCWludCByZXQ7Cj4gPj4gKwo+ID4+ICsJaWYgKCFJU19F UlIobmZjLT5uZmNfY2xrKSkgewo+ID4+ICsJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKG5mYy0+ bmZjX2Nsayk7Cj4gPj4gKwlpZiAocmV0KSB7Cj4gPj4gKwlkZXZfZXJyKGRldiwgImZhaWxlZCB0 byBlbmFibGUgbmZjIGNsa1xuIik7Cj4gPj4gKwlyZXR1cm4gcmV0Owo+ID4+ICsJfQo+ID4+ICsJ fQo+ID4+ICsKPiA+PiArCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShuZmMtPmFoYl9jbGspOwo+ ID4+ICsJaWYgKHJldCkgewo+ID4+ICsJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZW5hYmxlIGFo YiBjbGtcbiIpOwo+ID4+ICsJaWYgKCFJU19FUlIobmZjLT5uZmNfY2xrKSkKPiA+PiArCWNsa19k aXNhYmxlX3VucHJlcGFyZShuZmMtPm5mY19jbGspOwo+ID4+ICsJcmV0dXJuIHJldDsKPiA+PiAr CX0KPiA+PiArCj4gPj4gKwlyZXR1cm4gMDsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIHZv aWQgcmtfbmZjX2Rpc2FibGVfY2xrcyhzdHJ1Y3QgcmtfbmZjICpuZmMpCj4gPj4gK3sKPiA+PiAr CWlmICghSVNfRVJSKG5mYy0+bmZjX2NsaykpCj4gPj4gKwljbGtfZGlzYWJsZV91bnByZXBhcmUo bmZjLT5uZmNfY2xrKTsKPiA+PiArCWNsa19kaXNhYmxlX3VucHJlcGFyZShuZmMtPmFoYl9jbGsp Owo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgaW50IHJrX25mY19vb2JsYXlvdXRfZnJlZShz dHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IHNlY3Rpb24sCj4gPj4gKwlzdHJ1Y3QgbXRkX29vYl9y ZWdpb24gKm9vYl9yZWdpb24pCj4gPj4gK3sKPiA+PiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAg PSBtdGRfdG9fbmFuZChtdGQpOwo+ID4+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFu ZCA9IHJrX25mY190b19ya25hbmQoY2hpcCk7Cj4gPj4gKwo+ID4+ICsJaWYgKHNlY3Rpb24pCj4g Pj4gKwlyZXR1cm4gLUVSQU5HRTsKPiA+PiArCj4gPj4gKwkvKgo+ID4+ICsJKiBUaGUgYmVnaW5u aW5nIG9mIHRoZSBPT0IgYXJlYSBzdG9yZXMgdGhlIHJlc2VydmVkIGRhdGEgZm9yIHRoZSBORkMs Cj4gPj4gKwkqIHRoZSBzaXplIG9mIHRoZSByZXNlcnZlZCBkYXRhIGlzIE5GQ19TWVNfREFUQV9T SVpFIGJ5dGVzLgo+ID4+ICsJKi8KPiA+PiArCW9vYl9yZWdpb24tPmxlbmd0aCA9IHJrbmFuZC0+ bWV0YWRhdGFfc2l6ZSAtIE5GQ19TWVNfREFUQV9TSVpFIC0gMjsKPiA+PiArCW9vYl9yZWdpb24t Pm9mZnNldCA9IE5GQ19TWVNfREFUQV9TSVpFICsgMjsKPiA+PiArCj4gPj4gKwlyZXR1cm4gMDsK PiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGludCBya19uZmNfb29ibGF5b3V0X2VjYyhzdHJ1 Y3QgbXRkX2luZm8gKm10ZCwgaW50IHNlY3Rpb24sCj4gPj4gKwlzdHJ1Y3QgbXRkX29vYl9yZWdp b24gKm9vYl9yZWdpb24pCj4gPj4gK3sKPiA+PiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBt dGRfdG9fbmFuZChtdGQpOwo+ID4+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZCA9 IHJrX25mY190b19ya25hbmQoY2hpcCk7Cj4gPj4gKwo+ID4+ICsJaWYgKHNlY3Rpb24pCj4gPj4g KwlyZXR1cm4gLUVSQU5HRTsKPiA+PiArCj4gPj4gKwlvb2JfcmVnaW9uLT5sZW5ndGggPSBtdGQt Pm9vYnNpemUgLSBya25hbmQtPm1ldGFkYXRhX3NpemU7Cj4gPj4gKwlvb2JfcmVnaW9uLT5vZmZz ZXQgPSBya25hbmQtPm1ldGFkYXRhX3NpemU7Cj4gPj4gKwo+ID4+ICsJcmV0dXJuIDA7Cj4gPj4g K30KPiA+PiArCj4gPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRkX29vYmxheW91dF9vcHMgcmtf bmZjX29vYmxheW91dF9vcHMgPSB7Cj4gPj4gKwkuZnJlZSA9IHJrX25mY19vb2JsYXlvdXRfZnJl ZSwKPiA+PiArCS5lY2MgPSBya19uZmNfb29ibGF5b3V0X2VjYywKPiA+PiArfTsKPiA+PiArCj4g Pj4gK3N0YXRpYyBpbnQgcmtfbmZjX2VjY19pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0 IG10ZF9pbmZvICptdGQpCj4gPj4gK3sKPiA+PiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBt dGRfdG9fbmFuZChtdGQpOwo+ID4+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29u dHJvbGxlcl9kYXRhKGNoaXApOwo+ID4+ICsJc3RydWN0IG5hbmRfZWNjX2N0cmwgKmVjYyA9ICZj aGlwLT5lY2M7Cj4gPj4gKwljb25zdCB1OCAqc3RyZW5ndGhzID0gbmZjLT5jZmctPmVjY19zdHJl bmd0aHM7Cj4gPj4gKwl1OCBtYXhfc3RyZW5ndGgsIG5mY19tYXhfc3RyZW5ndGg7Cj4gPj4gKwlp bnQgaTsKPiA+PiArCj4gPj4gKwluZmNfbWF4X3N0cmVuZ3RoID0gbmZjLT5jZmctPmVjY19zdHJl bmd0aHNbMF07Cj4gPj4gKwkvKiBJZiBvcHRpb25hbCBkdCBzZXR0aW5ncyBub3QgcHJlc2VudC4g Ki8KPiA+PiArCWlmICghZWNjLT5zaXplIHx8ICFlY2MtPnN0cmVuZ3RoIHx8Cj4gPj4gKwnCoMKg wqAgZWNjLT5zdHJlbmd0aCA+IG5mY19tYXhfc3RyZW5ndGgpIHsKPiA+PiArCWNoaXAtPmVjYy5z aXplID0gMTAyNDsKPiA+PiArCWVjYy0+c3RlcHMgPSBtdGQtPndyaXRlc2l6ZSAvIGVjYy0+c2l6 ZTsKPiA+PiArCj4gPj4gKwkvKgo+ID4+ICsJKiBIVyBFQ0MgYWx3YXlzIHJlcXVlc3RzIHRoZSBu dW1iZXIgb2YgRUNDIGJ5dGVzIHBlciAxMDI0IGJ5dGUKPiA+PiArCSogYmxvY2tzLiBUaGUgZmly c3QgNCBPT0IgYnl0ZXMgYXJlIHJlc2VydmVkIGZvciBzeXMgZGF0YS4KPiA+PiArCSovCj4gPj4g KwltYXhfc3RyZW5ndGggPSAoKG10ZC0+b29ic2l6ZSAvIGVjYy0+c3RlcHMpIC0gNCkgKiA4IC8K PiA+PiArCWZscyg4ICogMTAyNCk7Cj4gPj4gKwlpZiAobWF4X3N0cmVuZ3RoID4gbmZjX21heF9z dHJlbmd0aCkKPiA+PiArCW1heF9zdHJlbmd0aCA9IG5mY19tYXhfc3RyZW5ndGg7Cj4gPj4gKwo+ ID4+ICsJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewo+ID4+ICsJaWYgKG1heF9zdHJlbmd0aCA+ PSBzdHJlbmd0aHNbaV0pCj4gPj4gKwlicmVhazsKPiA+PiArCX0KPiA+PiArCj4gPj4gKwlpZiAo aSA+PSA0KSB7Cj4gPj4gKwlkZXZfZXJyKG5mYy0+ZGV2LCAiVW5zdXBwb3J0ZWQgRUNDIHN0cmVu Z3RoXG4iKTsKPiA+PiArCXJldHVybiAtRU9QTk9UU1VQUDsKPiA+PiArCX0KPiA+PiArCj4gPj4g KwllY2MtPnN0cmVuZ3RoID0gc3RyZW5ndGhzW2ldOwo+ID4+ICsJfQo+ID4+ICsJZWNjLT5zdGVw cyA9IG10ZC0+d3JpdGVzaXplIC8gZWNjLT5zaXplOwo+ID4+ICsJZWNjLT5ieXRlcyA9IERJVl9S T1VORF9VUChlY2MtPnN0cmVuZ3RoICogZmxzKDggKiAxMDI0KSwgOCk7ICAKPiA+Cj4gPkhlcmUg eW91IGFzc3VtZSAxMDI0IEVDQyBzdGVwIHNpemUsIHRoaXMgaXMgd3JvbmcuIEVpdGhlciB0aGUK PiA+Y29udHJvbGxlciBvbmx5IHN1cHBvcnRzIDEwMjQgYnl0ZXMgb3IgeW91IG9mZmljaWFsbHkg c3RhdGUgc29tZXdoZXJlCj4gPnRoYXQgeW91IGRvbid0IHN1cHBvcnQgbW9yZSBFQ0Mgc3RlcCBz aXplcyB5ZXQuCj4gPiAgCj4gPj4gKwkvKiBIVyBFQ0MgYWx3YXlzIHdvcmsgd2l0aCBldmVuIG51 bWJlcnMgb2YgRUNDIGJ5dGVzLiAqLwo+ID4+ICsJZWNjLT5ieXRlcyA9IEFMSUdOKGVjYy0+Ynl0 ZXMsIDIpOyAgCj4gPgo+ID5TaG91bGRuJ3QgeW91IGVuc3VyZSB0aGUgbnVtYmVyIG9mIGJ5dGVz IGlzIHJvdW5kZWQgdXAgPyAgCj4gCj4gVGhlIFY2IGFuZMKgVjkgY29udHJvbGxlciBzdXBwb3J0 cyBERFIgbW9kZSwgc28gRUNDIGJ5dGVzIG5lZWQgdG8gYmUgYWxpZ25lZCB0byBhbiBldmVuIG51 bWJlciBpZiBlbmFibGUgRERSIG1vZGUuCj4gVGhpcyBkcml2ZXJzIG5vIHN1cHBvcnQgZGRyIG1v ZGUgbm9377yMSSB3aWxsIGRyb3AgdGhpcyBjb2RlLgo+IAoKSSB0aGluayB5b3VyIGFwcHJvYWNo IGlzIGZpbmUsIEkganVzdCBtaXN1bmRlcnN0b29kIGl0IGJlY2F1c2Ugb2YgdGhlCmNvbW1lbnQu CgpNYXliZSB5b3UgY291bGQ6Ci0gQ3JlYXRlIGEgaGVscGVyIGZvciB0aGF0Ci0gQ29ycmVjdCB0 aGUgY29tbWVudCB0byBjbGVhcmx5IGV4cGxhaW4gd2hhdCB5b3UgZG8gKHlvdXIgZXhwbGFuYXRp b24KICBoZXJlIGlzIHZlcnkgY2xlYXIgdG8gbWUpCi0gSW5jbHVkZSB0aGUgY29tbWVudCBpbiB0 aGUgaGVscGVyLCBub3QgaW4gZWFjaCBmdW5jdGlvbgotIENhbGwgdGhlIGhlbHBlciBpbiBldmVy eSBmdW5jdGlvbiBhY2Nlc3NpbmcgdGhpcyBhcmVhIHVubGVzcyB0aGUKICBibG9jayBpcyByZXNl cnZlZCBmb3IgdGhlIGJvb3Ryb20/CgpUaGFua3MsCk1pcXXDqGwKCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBs aXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5m cmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK 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=-11.2 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_2 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 D103CC4363A for ; Fri, 30 Oct 2020 10:26:47 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5074520825 for ; Fri, 30 Oct 2020 10:26:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726102AbgJ3K0q convert rfc822-to-8bit (ORCPT ); Fri, 30 Oct 2020 06:26:46 -0400 Received: from relay6-d.mail.gandi.net ([217.70.183.198]:54379 "EHLO relay6-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725905AbgJ3K0p (ORCPT ); Fri, 30 Oct 2020 06:26:45 -0400 X-Originating-IP: 91.224.148.103 Received: from xps13 (unknown [91.224.148.103]) (Authenticated sender: miquel.raynal@bootlin.com) by relay6-d.mail.gandi.net (Postfix) with ESMTPSA id DE32AC0014; Fri, 30 Oct 2020 10:26:37 +0000 (UTC) Date: Fri, 30 Oct 2020 11:26:35 +0100 From: Miquel Raynal To: =?UTF-8?B?6LW15Luq5bOw?= Cc: richard , vigneshr , robh+dt , devicetree , linux-mtd , =?UTF-8?B?SGVpa29TdMO8Ym5lcg==?= , linux-rockchip , linux-arm-kernel , linux-kernel Subject: Re: [PATCH v13 2/8] mtd: rawnand: rockchip: NFC drivers for RK3308, RK2928 and others Message-ID: <20201030112635.162bb709@xps13> In-Reply-To: <20201030181152443876127@rock-chips.com> References: <20201028095326.15562-1-yifeng.zhao@rock-chips.com> <20201028095326.15562-3-yifeng.zhao@rock-chips.com> <20201028114826.6cd6b841@xps13> <20201030181152443876127@rock-chips.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.4 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Hi 赵仪峰, 赵仪峰 wrote on Fri, 30 Oct 2020 18:12:52 +0800: > Hi Miquel, > > >Hi Yifeng, > > > >A few more comments below, but overall looks better. > > > >Yifeng Zhao wrote on Wed, 28 Oct 2020 > >17:53:24 +0800: > > > >> This driver supports Rockchip NFC (NAND Flash Controller) found on RK3308, > >> RK2928, RKPX30, RV1108 and other SOCs. The driver has been tested using > >> 8-bit NAND interface on the ARM based RK3308 platform. > >> > >> Support Rockchip SoCs and NFC versions: > >> - PX30 and RK3326(NFCv900). > >> ECC: 16/40/60/70 bits/1KB. > >> CLOCK: ahb and nfc. > >> - RK3308 and RV1108(NFCv800). > >> ECC: 16 bits/1KB. > >> CLOCK: ahb and nfc. > >> - RK3036 and RK3128(NFCv622). > >> ECC: 16/24/40/60 bits/1KB. > >> CLOCK: ahb and nfc. > >> - RK3066, RK3188 and RK2928(NFCv600). > >> ECC: 16/24/40/60 bits/1KB. > >> CLOCK: ahb. > >> > >> Supported features: > >> - Read full page data by DMA. > >> - Support HW ECC(one step is 1KB). > >> - Support 2 - 32K page size. > >> - Support 8 CS(depend on SoCs) > >> > >> Limitations: > >> - No support for the ecc step size is 512. > >> - Untested on some SoCs. > >> - No support for subpages. > >> - No support for the builtin randomizer. > >> - The original bad block mask is not supported. It is recommended to use > >>   the BBT(bad block table). > >> > >> Signed-off-by: Yifeng Zhao > >> --- > >> > >> Changes in v13: > >> - The nfc->buffer will realloc while the page size of the second mtd > >>   is large than the first one. > >> - Fix coding style. > >> - Fix some comments. > >> > >> Changes in v12: None > >> Changes in v11: > >> - Fix compile error. > >> > >> Changes in v10: > >> - Fix compile error on master v5.9-rc7. > >> > >> Changes in v9: > >> - The nfc->buffer will realloc while the page size of the second mtd > >>   is large than the first one > >> - Fix coding style. > >> - Remove struct rk_nfc_clk. > >> - Prepend some function with rk_nfc_. > >> - Replace function readl_poll_timeout_atomic with readl_relaxed_poll_timeout. > >> - Remove function rk_nfc_read_byte and rk_nfc_write_byte. > >> - Don't select the die if 'check_only == true' in function rk_nfc_exec_op. > >> - Modify function rk_nfc_write_page and rk_nfc_write_page_raw. > >> > >> Changes in v8: None > >> Changes in v7: > >> - Rebase to linux-next. > >> - Fix coding style. > >> - Reserved 4 bytes at the beginning of the oob area. > >> - Page raw read and write included ecc data. > >> > >> Changes in v6: > >> - The mtd->name set by NAND label property. > >> - Add some comments. > >> - Fix compile error. > >> > >> Changes in v5: > >> - Add boot blocks support  with different ECC for bootROM. > >> - Rename rockchip-nand.c to rockchip-nand-controller.c. > >> - Unification of other variable names. > >> - Remove some compatible define. > >> > >> Changes in v4: > >> - Define platform data structure for the register offsets. > >> - The compatible define with rkxx_nfc. > >> - Use SET_SYSTEM_SLEEP_PM_OPS to define PM_OPS. > >> - Use exec_op instead of legacy hooks. > >> > >> Changes in v3: None > >> Changes in v2: > >> - Fix compile error. > >> - Include header files sorted by file name. > >> > >>  drivers/mtd/nand/raw/Kconfig                  |   12 + > >>  drivers/mtd/nand/raw/Makefile                 |    1 + > >>  .../mtd/nand/raw/rockchip-nand-controller.c   | 1460 +++++++++++++++++ > >>  3 files changed, 1473 insertions(+) > >>  create mode 100644 drivers/mtd/nand/raw/rockchip-nand-controller.c > >> > >> diff --git a/drivers/mtd/nand/raw/Kconfig b/drivers/mtd/nand/raw/Kconfig > >> index 6c46f25b57e2..2cc533e4e239 100644 > >> --- a/drivers/mtd/nand/raw/Kconfig > >> +++ b/drivers/mtd/nand/raw/Kconfig > >> @@ -462,6 +462,18 @@ config MTD_NAND_ARASAN > >>    Enables the driver for the Arasan NAND flash controller on > >>    Zynq Ultrascale+ MPSoC. > >>  > >> +config MTD_NAND_ROCKCHIP > >> + tristate "Rockchip NAND controller" > >> + depends on ARCH_ROCKCHIP && HAS_IOMEM > >> + help > >> +   Enables support for NAND controller on Rockchip SoCs. > >> +   There are four different versions of NAND FLASH Controllers, > >> +   including: > >> +     NFC v600: RK2928, RK3066, RK3188 > >> +     NFC v622: RK3036, RK3128 > >> +     NFC v800: RK3308, RV1108 > >> +     NFC v900: PX30, RK3326 > >> + > >>  comment "Misc" > >>  > >>  config MTD_SM_COMMON > >> diff --git a/drivers/mtd/nand/raw/Makefile b/drivers/mtd/nand/raw/Makefile > >> index 2930f5b9015d..960c9be25204 100644 > >> --- a/drivers/mtd/nand/raw/Makefile > >> +++ b/drivers/mtd/nand/raw/Makefile > >> @@ -58,6 +58,7 @@ obj-$(CONFIG_MTD_NAND_STM32_FMC2) += stm32_fmc2_nand.o > >>  obj-$(CONFIG_MTD_NAND_MESON) += meson_nand.o > >>  obj-$(CONFIG_MTD_NAND_CADENCE) += cadence-nand-controller.o > >>  obj-$(CONFIG_MTD_NAND_ARASAN) += arasan-nand-controller.o > >> +obj-$(CONFIG_MTD_NAND_ROCKCHIP) += rockchip-nand-controller.o > >>  > >>  nand-objs := nand_base.o nand_legacy.o nand_bbt.o nand_timings.o nand_ids.o > >>  nand-objs += nand_onfi.o > >> diff --git a/drivers/mtd/nand/raw/rockchip-nand-controller.c b/drivers/mtd/nand/raw/rockchip-nand-controller.c > >> new file mode 100644 > >> index 000000000000..2e96fd314346 > >> --- /dev/null > >> +++ b/drivers/mtd/nand/raw/rockchip-nand-controller.c > >> @@ -0,0 +1,1460 @@ > >> +// SPDX-License-Identifier: GPL-2.0 OR MIT > >> +/* > >> + * Rockchip NAND Flash controller driver. > >> + * Copyright (C) 2020 Rockchip Inc. > >> + * Author: Yifeng Zhao > >> + */ > >> + > >> +#include > >> +#include > >> +#include > >> +#include > >> +#include > >> +#include > >> +#include > >> +#include > >> +#include > >> +#include > >> +#include > >> +#include > >> +#include > >> + > >> +/* > >> + * NFC Page Data Layout: > >> + * 1024 Bytes Data + 4Bytes sys data + 28Bytes~124Bytes ecc + > >> + * 1024 Bytes Data + 4Bytes sys data + 28Bytes~124Bytes ecc + > >> + * ...... > >> + * NAND Page Data Layout: > >> + * 1024 * n Data + m Bytes oob > >> + * Original Bad Block Mask Location: > >> + * First byte of oob(spare). > >> + * nand_chip->oob_poi data layout: > >> + * 4Bytes sys data + .... + 4Bytes sys data + ecc data. > >> + */ > >> + > >> +/* NAND controller register definition */ > >> +#define NFC_READ (0) > >> +#define NFC_WRITE (1) > >> + > >> +#define NFC_FMCTL (0x00) > >> +#define   FMCTL_CE_SEL_M 0xFF > >> +#define   FMCTL_CE_SEL(x) (1 << (x)) > >> +#define   FMCTL_WP BIT(8) > >> +#define   FMCTL_RDY BIT(9) > >> + > >> +#define NFC_FMWAIT (0x04) > >> +#define   FLCTL_RST BIT(0) > >> +#define   FLCTL_WR (1) /* 0: read, 1: write */ > >> +#define   FLCTL_XFER_ST BIT(2) > >> +#define   FLCTL_XFER_EN BIT(3) > >> +#define   FLCTL_ACORRECT BIT(10) /* Auto correct error bits. */ > >> +#define   FLCTL_XFER_READY BIT(20) > >> +#define   FLCTL_XFER_SECTOR (22) > >> +#define   FLCTL_TOG_FIX BIT(29) > >> + > >> +#define   BCHCTL_BANK_M (7 << 5) > >> +#define   BCHCTL_BANK (5) > >> + > >> +#define   DMA_ST BIT(0) > >> +#define   DMA_WR (1) /* 0: write, 1: read */ > >> +#define   DMA_EN BIT(2) > >> +#define   DMA_AHB_SIZE (3) /* 0: 1, 1: 2, 2: 4 */ > >> +#define   DMA_BURST_SIZE (6) /* 0: 1, 3: 4, 5: 8, 7: 16 */ > >> +#define   DMA_INC_NUM (9) /* 1 - 16 */ > >> + > >> +#define ECC_ERR_CNT(x, e) ((((x) >> (e).low) & (e).low_mask) |\ > >> +   (((x) >> (e).high) & (e).high_mask) << (e).low_bn) > >> +#define   INT_DMA BIT(0) > >> +#define NFC_BANK (0x800) > >> +#define NFC_BANK_STEP (0x100) > >> +#define   BANK_DATA (0x00) > >> +#define   BANK_ADDR (0x04) > >> +#define   BANK_CMD (0x08) > >> +#define NFC_SRAM0 (0x1000) > >> +#define NFC_SRAM1 (0x1400) > >> +#define NFC_SRAM_SIZE (0x400) > >> +#define NFC_TIMEOUT (500000) > >> +#define NFC_MAX_OOB_PER_STEP 128 > >> +#define NFC_MIN_OOB_PER_STEP 64 > >> +#define MAX_DATA_SIZE 0xFFFC > >> +#define MAX_ADDRESS_CYC 6 > >> +#define NFC_ECC_MAX_MODES 4 > >> +#define NFC_MAX_NSELS (8) /* Some Socs only have 1 or 2 CSs. */ > >> +#define NFC_SYS_DATA_SIZE (4) /* 4 bytes sys data in oob pre 1024 data.*/ > >> +#define RK_DEFAULT_CLOCK_RATE (150 * 1000 * 1000) /* 150 Mhz */ > >> +#define ACCTIMING(csrw, rwpw, rwcs) ((csrw) << 12 | (rwpw) << 5 | (rwcs)) > >> + > >> +enum nfc_type { > >> + NFC_V6, > >> + NFC_V8, > >> + NFC_V9, > >> +}; > >> + > >> +/** > >> + * struct rk_ecc_cnt_status: represent a ecc status data. > >> + * @err_flag_bit: error flag bit index at register. > >> + * @low: ecc count low bit index at register. > >> + * @low_mask: mask bit. > >> + * @low_bn: ecc count low bit number. > >> + * @high: ecc count high bit index at register. > >> + * @high_mask: mask bit > >> + */ > >> +struct ecc_cnt_status { > >> + u8 err_flag_bit; > >> + u8 low; > >> + u8 low_mask; > >> + u8 low_bn; > >> + u8 high; > >> + u8 high_mask; > >> +}; > >> + > >> +/* > >> + * @type: nfc version > >> + * @ecc_strengths: ecc strengths > >> + * @ecc_cfgs: ecc config values > >> + * @flctl_off: FLCTL register offset > >> + * @bchctl_off: BCHCTL register offset > >> + * @dma_data_buf_off: DMA_DATA_BUF register offset > >> + * @dma_oob_buf_off: DMA_OOB_BUF register offset > >> + * @dma_cfg_off: DMA_CFG register offset > >> + * @dma_st_off: DMA_ST register offset > >> + * @bch_st_off: BCG_ST register offset > >> + * @randmz_off: RANDMZ register offset > >> + * @int_en_off: interrupt enable register offset > >> + * @int_clr_off: interrupt clean register offset > >> + * @int_st_off: interrupt status register offset > >> + * @oob0_off: oob0 register offset > >> + * @oob1_off: oob1 register offset > >> + * @ecc0: represent ECC0 status data > >> + * @ecc1: represent ECC1 status data > >> + */ > >> +struct nfc_cfg { > >> + enum nfc_type type; > >> + u8 ecc_strengths[NFC_ECC_MAX_MODES]; > >> + u32 ecc_cfgs[NFC_ECC_MAX_MODES]; > >> + u32 flctl_off; > >> + u32 bchctl_off; > >> + u32 dma_cfg_off; > >> + u32 dma_data_buf_off; > >> + u32 dma_oob_buf_off; > >> + u32 dma_st_off; > >> + u32 bch_st_off; > >> + u32 randmz_off; > >> + u32 int_en_off; > >> + u32 int_clr_off; > >> + u32 int_st_off; > >> + u32 oob0_off; > >> + u32 oob1_off; > >> + struct ecc_cnt_status ecc0; > >> + struct ecc_cnt_status ecc1; > >> +}; > >> + > >> +struct rk_nfc_nand_chip { > >> + struct list_head node; > >> + struct nand_chip chip; > >> + > >> + u16 spare_per_sector; > >> + u16 oob_buf_per_sector; > >> + u16 boot_blks; > >> + u16 boot_ecc; > >> + u16 metadata_size; > >> + > >> + u8 nsels; > >> + u8 sels[0]; > >> + /* Nothing after this field. */ > >> +}; > >> + > >> +struct rk_nfc { > >> + struct nand_controller controller; > >> + const struct nfc_cfg *cfg; > >> + struct device *dev; > >> + > >> + struct clk *nfc_clk; > >> + struct clk *ahb_clk; > >> + void __iomem *regs; > >> + > >> + u32 selected_bank; > >> + u32 band_offset; > >> + u32 cur_clk; > >> + > >> + struct completion done; > >> + struct list_head chips; > >> + > >> + u8 *buffer; > >> + u8 *page_buf; > >> + u32 *oob_buf; > >> + u32 buffer_size; > >> + u32 oob_buf_size; > >> + > >> + unsigned long assigned_cs; > >> +}; > >> + > >> +static inline struct rk_nfc_nand_chip *rk_nfc_to_rknand(struct nand_chip *chip) > >> +{ > >> + return container_of(chip, struct rk_nfc_nand_chip, chip); > >> +} > >> + > >> +static inline u8 *rk_nfc_buf_to_data_ptr(struct nand_chip *chip, const u8 *p, int i) > >> +{ > >> + return (u8 *)p + i * chip->ecc.size; > >> +} > >> + > >> +static inline u8 *rk_nfc_buf_to_oob_ptr(struct nand_chip *chip, int i) > >> +{ > >> + u8 *poi; > >> + > >> + poi = chip->oob_poi + i * NFC_SYS_DATA_SIZE; > >> + > >> + return poi; > >> +} > >> + > >> +static inline u8 *rk_nfc_buf_to_oob_ecc_ptr(struct nand_chip *chip, int i) > >> +{ > >> + struct rk_nfc_nand_chip *rknand = rk_nfc_to_rknand(chip); > >> + u8 *poi; > >> + > >> + poi = chip->oob_poi + rknand->metadata_size + > >> +       chip->ecc.bytes * i; > >> + > >> + return poi; > >> +} > >> + > >> +static inline int rk_nfc_data_len(struct nand_chip *chip) > >> +{ > >> + struct rk_nfc_nand_chip *rknand = rk_nfc_to_rknand(chip); > >> + > >> + return chip->ecc.size + rknand->spare_per_sector; > >> +} > >> + > >> +static inline u8 *rk_nfc_data_ptr(struct nand_chip *chip,  int i) > >> +{ > >> + struct rk_nfc *nfc = nand_get_controller_data(chip); > >> + > >> + return nfc->buffer + i * rk_nfc_data_len(chip); > >> +} > >> + > >> +static inline u8 *rk_nfc_oob_ptr(struct nand_chip *chip, int i) > >> +{ > >> + struct rk_nfc *nfc = nand_get_controller_data(chip); > >> + > >> + return nfc->buffer + i * rk_nfc_data_len(chip) + chip->ecc.size; > >> +} > >> + > >> +static void rk_nfc_select_chip(struct nand_chip *chip, int cs) > >> +{ > >> + struct rk_nfc *nfc = nand_get_controller_data(chip); > >> + struct rk_nfc_nand_chip *rknand = rk_nfc_to_rknand(chip); > >> + u32 val; > >> + > >> + if (cs < 0) { > >> + nfc->selected_bank = -1; > >> + /* Deselect the currently selected target. */ > >> + val = readl_relaxed(nfc->regs + NFC_FMCTL); > >> + val &= ~FMCTL_CE_SEL_M; > >> + writel(val, nfc->regs + NFC_FMCTL); > >> + return; > >> + } > >> + > >> + nfc->selected_bank = rknand->sels[cs]; > >> + nfc->band_offset = NFC_BANK + nfc->selected_bank * NFC_BANK_STEP; > >> + > >> + val = readl_relaxed(nfc->regs + NFC_FMCTL); > >> + val &= ~FMCTL_CE_SEL_M; > >> + val |= FMCTL_CE_SEL(nfc->selected_bank); > >> + > >> + writel(val, nfc->regs + NFC_FMCTL); > >> +} > >> + > >> +static inline int rk_nfc_wait_ioready(struct rk_nfc *nfc) > >> +{ > >> + int rc; > >> + u32 val; > >> + > >> + rc = readl_relaxed_poll_timeout(nfc->regs + NFC_FMCTL, val, > >> + val & FMCTL_RDY, 10, NFC_TIMEOUT); > >> + > >> + return rc; > >> +} > >> + > >> +static void rk_nfc_read_buf(struct rk_nfc *nfc, u8 *buf, int len) > >> +{ > >> + int i; > >> + > >> + for (i = 0; i < len; i++) > >> + buf[i] = readb_relaxed(nfc->regs + nfc->band_offset + > >> +        BANK_DATA); > >> +} > >> + > >> +static void rk_nfc_write_buf(struct rk_nfc *nfc, const u8 *buf, int len) > >> +{ > >> + int i; > >> + > >> + for (i = 0; i < len; i++) > >> + writeb(buf[i], nfc->regs + nfc->band_offset + BANK_DATA); > >> +} > >> + > >> +static int rk_nfc_cmd(struct nand_chip *chip, > >> +       const struct nand_subop *subop) > >> +{ > >> + struct rk_nfc *nfc = nand_get_controller_data(chip); > >> + unsigned int i, j, remaining, start; > >> + int reg_offset = nfc->band_offset; > >> + u8 *inbuf = NULL; > >> + const u8 *outbuf; > >> + u32 cnt = 0; > >> + int ret = 0; > >> + > >> + for (i = 0; i < subop->ninstrs; i++) { > >> + const struct nand_op_instr *instr = &subop->instrs[i]; > >> + > >> + switch (instr->type) { > >> + case NAND_OP_CMD_INSTR: > >> + writeb(instr->ctx.cmd.opcode, > >> +        nfc->regs + reg_offset + BANK_CMD); > >> + break; > >> + > >> + case NAND_OP_ADDR_INSTR: > >> + remaining = nand_subop_get_num_addr_cyc(subop, i); > >> + start = nand_subop_get_addr_start_off(subop, i); > >> + > >> + for (j = 0; j < 8 && j + start < remaining; j++) > >> + writeb(instr->ctx.addr.addrs[j + start], > >> +        nfc->regs + reg_offset + BANK_ADDR); > >> + break; > >> + > >> + case NAND_OP_DATA_IN_INSTR: > >> + case NAND_OP_DATA_OUT_INSTR: > >> + start = nand_subop_get_data_start_off(subop, i); > >> + cnt = nand_subop_get_data_len(subop, i); > >> + > >> + if (instr->type == NAND_OP_DATA_OUT_INSTR) { > >> + outbuf = instr->ctx.data.buf.out + start; > >> + rk_nfc_write_buf(nfc, outbuf, cnt); > >> + } else { > >> + inbuf = instr->ctx.data.buf.in + start; > >> + rk_nfc_read_buf(nfc, inbuf, cnt); > >> + } > >> + break; > >> + > >> + case NAND_OP_WAITRDY_INSTR: > >> + if (rk_nfc_wait_ioready(nfc) < 0) { > >> + ret = -ETIMEDOUT; > >> + dev_err(nfc->dev, "IO not ready\n"); > >> + } > >> + break; > >> + } > >> + } > >> + > >> + return ret; > >> +} > >> + > >> +static const struct nand_op_parser rk_nfc_op_parser = NAND_OP_PARSER( > >> + NAND_OP_PARSER_PATTERN( > >> + rk_nfc_cmd, > >> + NAND_OP_PARSER_PAT_CMD_ELEM(true), > >> + NAND_OP_PARSER_PAT_ADDR_ELEM(true, MAX_ADDRESS_CYC), > >> + NAND_OP_PARSER_PAT_CMD_ELEM(true), > >> + NAND_OP_PARSER_PAT_WAITRDY_ELEM(true), > >> + NAND_OP_PARSER_PAT_DATA_IN_ELEM(true, MAX_DATA_SIZE)), > >> + NAND_OP_PARSER_PATTERN( > >> + rk_nfc_cmd, > >> + NAND_OP_PARSER_PAT_CMD_ELEM(true), > >> + NAND_OP_PARSER_PAT_ADDR_ELEM(true, MAX_ADDRESS_CYC), > >> + NAND_OP_PARSER_PAT_DATA_OUT_ELEM(true, MAX_DATA_SIZE), > >> + NAND_OP_PARSER_PAT_CMD_ELEM(true), > >> + NAND_OP_PARSER_PAT_WAITRDY_ELEM(true)), > >> +); > >> + > >> +static int rk_nfc_exec_op(struct nand_chip *chip, > >> +   const struct nand_operation *op, > >> +   bool check_only) > >> +{ > >> + if (!check_only) > >> + rk_nfc_select_chip(chip, op->cs); > >> + > >> + return nand_op_parser_exec_op(chip, &rk_nfc_op_parser, op, > >> +       check_only); > >> +} > >> + > >> +static int rk_nfc_setup_data_interface(struct nand_chip *chip, int csline, > >> +        const struct nand_interface_config *conf) > > > >Please have a look at the recent changes in the core, this helper > >should be named "setup_interface". > > > >> +{ > >> + struct rk_nfc *nfc = nand_get_controller_data(chip); > >> + const struct nand_sdr_timings *timings; > >> + u32 rate, tc2rw, trwpw, trw2c; > >> + u32 temp; > >> + > >> + if (csline == NAND_DATA_IFACE_CHECK_ONLY) > >> + return 0; > >> + > >> + timings = nand_get_sdr_timings(conf); > >> + if (IS_ERR(timings)) > >> + return -EOPNOTSUPP; > >> + > >> + if (IS_ERR(nfc->nfc_clk)) > >> + rate = clk_get_rate(nfc->ahb_clk); > >> + else > >> + rate = clk_get_rate(nfc->nfc_clk); > >> + > >> + /* Turn clock rate into kHz. */ > >> + rate /= 1000; > >> + > >> + tc2rw = 1; > >> + trw2c = 1; > >> + > >> + trwpw = max(timings->tWC_min, timings->tRC_min) / 1000; > >> + trwpw = DIV_ROUND_UP(trwpw * rate, 1000000); > >> + > >> + temp = timings->tREA_max / 1000; > >> + temp = DIV_ROUND_UP(temp * rate, 1000000); > >> + > >> + if (trwpw < temp) > >> + trwpw = temp; > >> + > >> + /* > >> + * ACCON: access timing control register > >> + * ------------------------------------- > >> + * 31:18: reserved > >> + * 17:12: csrw, clock cycles from the falling edge of CSn to the > >> + *   falling edge of RDn or WRn > >> + * 11:11: reserved > >> + * 10:05: rwpw, the width of RDn or WRn in processor clock cycles > >> + * 04:00: rwcs, clock cycles from the rising edge of RDn or WRn to the > >> + *   rising edge of CSn > >> + */ > >> + temp = ACCTIMING(tc2rw, trwpw, trw2c); > >> + writel(temp, nfc->regs + NFC_FMWAIT); > > > >You should save the chip's timing configuration instead of writing it > >here, and setting the register value during chip selection. This way > >you may handle several chips with different timing > >constraints/configurations. > > > >> + > >> + return 0; > >> +} > >> + > >> +static int rk_nfc_hw_ecc_setup(struct nand_chip *chip, > >> +        struct nand_ecc_ctrl *ecc, > >> +        uint32_t strength) > >> +{ > >> + struct rk_nfc *nfc = nand_get_controller_data(chip); > >> + u32 reg, i; > >> + > >> + for (i = 0; i < NFC_ECC_MAX_MODES; i++) { > >> + if (ecc->strength == nfc->cfg->ecc_strengths[i]) { > >> + reg = nfc->cfg->ecc_cfgs[i]; > >> + break; > >> + } > >> + } > >> + > >> + if (i >= NFC_ECC_MAX_MODES) > >> + return -EINVAL; > >> + > >> + writel(reg, nfc->regs + nfc->cfg->bchctl_off); > > > >Same here, if you handle different chips, they may use different ECC > >configurations, this should be handled. > > > >> + > >> + return 0; > >> +} > >> + > >> +static void rk_nfc_xfer_start(struct rk_nfc *nfc, u8 rw, u8 n_KB, > >> +       dma_addr_t dma_data, dma_addr_t dma_oob) > >> +{ > >> + u32 dma_reg, fl_reg, bch_reg; > >> + > >> + dma_reg = DMA_ST | ((!rw) << DMA_WR) | DMA_EN | (2 << DMA_AHB_SIZE) | > >> +       (7 << DMA_BURST_SIZE) | (16 << DMA_INC_NUM); > >> + > >> + fl_reg = (rw << FLCTL_WR) | FLCTL_XFER_EN | FLCTL_ACORRECT | > >> + (n_KB << FLCTL_XFER_SECTOR) | FLCTL_TOG_FIX; > >> + > >> + if (nfc->cfg->type == NFC_V6 || nfc->cfg->type == NFC_V8) { > >> + bch_reg = readl_relaxed(nfc->regs + nfc->cfg->bchctl_off); > >> + bch_reg = (bch_reg & (~BCHCTL_BANK_M)) | > >> +   (nfc->selected_bank << BCHCTL_BANK); > >> + writel(bch_reg, nfc->regs + nfc->cfg->bchctl_off); > >> + } > >> + > >> + writel(dma_reg, nfc->regs + nfc->cfg->dma_cfg_off); > >> + writel((u32)dma_data, nfc->regs + nfc->cfg->dma_data_buf_off); > >> + writel((u32)dma_oob, nfc->regs + nfc->cfg->dma_oob_buf_off); > >> + writel(fl_reg, nfc->regs + nfc->cfg->flctl_off); > >> + fl_reg |= FLCTL_XFER_ST; > >> + writel(fl_reg, nfc->regs + nfc->cfg->flctl_off); > >> +} > >> + > >> +static int rk_nfc_wait_for_xfer_done(struct rk_nfc *nfc) > >> +{ > >> + void __iomem *ptr; > >> + int ret = 0; > >> + u32 reg; > >> + > >> + ptr = nfc->regs + nfc->cfg->flctl_off; > >> + > >> + ret = readl_relaxed_poll_timeout(ptr, reg, > >> + reg & FLCTL_XFER_READY, > >> + 10, NFC_TIMEOUT); > >> + > >> + return ret; > >> +} > >> + > >> +static int rk_nfc_write_page_raw(struct nand_chip *chip, const u8 *buf, > >> + int oob_on, int page) > >> +{ > >> + struct mtd_info *mtd = nand_to_mtd(chip); > >> + struct rk_nfc *nfc = nand_get_controller_data(chip); > >> + struct nand_ecc_ctrl *ecc = &chip->ecc; > >> + int ret = 0; > >> + u32 i; > >> + > >> + if (!buf) > >> + memset(nfc->buffer, 0xff, mtd->writesize + mtd->oobsize); > >> + > >> + for (i = 0; i < ecc->steps; i++) { > >> + /* Copy data to nfc buffer. */ > >> + if (buf) > >> + memcpy(rk_nfc_data_ptr(chip, i), > >> +        rk_nfc_buf_to_data_ptr(chip, buf, i), > >> +        ecc->size); > >> + /* > >> + * The first four bytes of OOB are reserved for the > >> + * boot ROM. In some debugging cases, such as with a > >> + * read, erase and write back test these 4 bytes stored > >> + * in OOB also need to be written back. > >> + */ > > > >The controller driver should not arbitrate this. If you don't want to > >expose these bytes, they should not appear "free" in the OOB layout, > >but a raw access *must* but able to address the entire page/oob. > > I don't have a solution to fix it. > The function nand_block_bad detect bad block like it: >     bad = chip->oob_poi[chip->badblockpos]; //chip->badblockpos = 0 for large page NAND Flash. > So chip->oob_poi[0] is bad masker. > > The oob data layout for rk nfc is: >  PA0 PA1 PA2 PA3 | BBM OOB1 OOB2 OOB3 | ... > or >  0xFF 0xFF 0xFF 0xFF | BBM OOB1 OOB2 OOB3 | ... > > The code here just to swap the first 4 bytes with the last 4 bytes and without droped any  data. > and the chip->oob_poi data layout: > BBM OOB1 OOB2 OOB3|......| PA0 PA1 PA2 PA3  > > The OOB layout free already reserved this 4 bytes: > oob_region->offset = NFC_SYS_DATA_SIZE + 2; > > >> + if (!i) > >> + memcpy(rk_nfc_oob_ptr(chip, i), > >> +        rk_nfc_buf_to_oob_ptr(chip, ecc->steps - 1), > >> +        NFC_SYS_DATA_SIZE); > >> + else > >> + memcpy(rk_nfc_oob_ptr(chip, i), > >> +        rk_nfc_buf_to_oob_ptr(chip, i - 1), > >> +        NFC_SYS_DATA_SIZE); > >> + /* Copy ECC data to the NFC buffer. */ > >> + memcpy(rk_nfc_oob_ptr(chip, i) + NFC_SYS_DATA_SIZE, > >> +        rk_nfc_buf_to_oob_ecc_ptr(chip, i), > >> +        ecc->bytes); > >> + } > >> + > >> + nand_prog_page_begin_op(chip, page, 0, NULL, 0); > >> + rk_nfc_write_buf(nfc, buf, mtd->writesize + mtd->oobsize); > >> + ret = nand_prog_page_end_op(chip); > >> + > >> + /* > >> + * Deselect the currently selected target after the ops is done > >> + * to reduce the power consumption. > >> + */ > >> + rk_nfc_select_chip(chip, -1); > >> + > >> + return ret; > >> +} > >> + > >> +static int rk_nfc_write_oob(struct nand_chip *chip, int page) > >> +{ > >> + return rk_nfc_write_page_raw(chip, NULL, 1, page); > > > >Not sure this is relevant. You should not do that, I guess the core > >will automatically take care of it. > > > >> +} > >> + > >> +static int rk_nfc_write_page_hwecc(struct nand_chip *chip, const u8 *buf, > >> +    int oob_on, int page) > >> +{ > >> + struct mtd_info *mtd = nand_to_mtd(chip); > >> + struct rk_nfc *nfc = nand_get_controller_data(chip); > >> + struct rk_nfc_nand_chip *rknand = rk_nfc_to_rknand(chip); > >> + struct nand_ecc_ctrl *ecc = &chip->ecc; > >> + int oob_step = (ecc->bytes > 60) ? NFC_MAX_OOB_PER_STEP : > >> + NFC_MIN_OOB_PER_STEP; > >> + int pages_per_blk = mtd->erasesize / mtd->writesize; > >> + int ret = 0, i, boot_rom_mode = 0; > >> + dma_addr_t dma_data, dma_oob; > >> + u32 reg; > >> + u8 *oob; > >> + > >> + nand_prog_page_begin_op(chip, page, 0, NULL, 0); > >> + > >> + memcpy(nfc->page_buf, buf, mtd->writesize); > >> + > >> + /* > >> + * The first blocks (4, 8 or 16 depending on the device) are used > >> + * by the boot ROM and the first 32 bits of OOB need to link to > >> + * the next page address in the same block. We can't directly copy > >> + * OOB data from the MTD framework, because this page address > >> + * conflicts for example with the bad block marker (BBM), > >> + * so we shift all OOB data including the BBM with 4 byte positions. > >> + * As a consequence the OOB size available to the MTD framework is > >> + * also reduced with 4 bytes. > >> + * > >> + *    PA0 PA1 PA2 PA3 | BBM OOB1 OOB2 OOB3 | ... > >> + * > >> + * If a NAND is not a boot medium or the page is not a boot block, > >> + * the first 4 bytes are left untouched by writing 0xFF to them. > >> + * > >> + *   0xFF 0xFF 0xFF 0xFF | BBM OOB1 OOB2 OOB3 | ... > >> + * > >> + * Configure the ECC algorithm supported by the boot ROM. > >> + */ > >> + if ((page < pages_per_blk * rknand->boot_blks) && > >> +     (chip->options & NAND_IS_BOOT_MEDIUM)) { > >> + boot_rom_mode = 1; > >> + if (rknand->boot_ecc != ecc->strength) > >> + rk_nfc_hw_ecc_setup(chip, ecc, > >> +     rknand->boot_ecc); > >> + } > >> + > >> + for (i = 0; i < ecc->steps; i++) { > >> + if (!i) { > >> + reg = 0xFFFFFFFF; > >> + } else { > >> + oob = chip->oob_poi + (i - 1) * NFC_SYS_DATA_SIZE; > >> + reg = oob[0] | oob[1] << 8 | oob[2] << 16 | > >> +       oob[3] << 24; > >> + } > >> + if (!i && boot_rom_mode) > >> + reg = (page & (pages_per_blk - 1)) * 4; > >> + > >> + if (nfc->cfg->type == NFC_V9) > >> + nfc->oob_buf[i] = reg; > >> + else > >> + nfc->oob_buf[i * (oob_step / 4)] = reg; > >> + } > >> + > >> + dma_data = dma_map_single(nfc->dev, (void *)nfc->page_buf, > >> +   mtd->writesize, DMA_TO_DEVICE); > >> + dma_oob = dma_map_single(nfc->dev, nfc->oob_buf, > >> + ecc->steps * oob_step, > >> + DMA_TO_DEVICE); > >> + > >> + reinit_completion(&nfc->done); > >> + writel(INT_DMA, nfc->regs + nfc->cfg->int_en_off); > >> + > >> + rk_nfc_xfer_start(nfc, NFC_WRITE, ecc->steps, dma_data, > >> +   dma_oob); > >> + ret = wait_for_completion_timeout(&nfc->done, > >> +   msecs_to_jiffies(100)); > >> + if (!ret) > >> + dev_warn(nfc->dev, "write: wait dma done timeout.\n"); > >> + /* > >> + * Whether the DMA transfer is completed or not. The driver > >> + * needs to check the NFC`s status register to see if the data > >> + * transfer was completed. > >> + */ > >> + ret = rk_nfc_wait_for_xfer_done(nfc); > >> + > >> + dma_unmap_single(nfc->dev, dma_data, mtd->writesize, > >> + DMA_TO_DEVICE); > >> + dma_unmap_single(nfc->dev, dma_oob, ecc->steps * oob_step, > >> + DMA_TO_DEVICE); > >> + > >> + if (boot_rom_mode && rknand->boot_ecc != ecc->strength) > >> + rk_nfc_hw_ecc_setup(chip, ecc, ecc->strength); > >> + > >> + if (ret) { > >> + ret = -EIO; > >> + dev_err(nfc->dev, > >> + "write: wait transfer done timeout.\n"); > >> + } > >> + > >> + if (ret) > >> + return ret; > >> + > >> + ret = nand_prog_page_end_op(chip); > >> + > >> + /* > >> + * Deselect the currently selected target after the ops is done > >> + * to reduce the power consumption. > >> + */ > > > >If you force this deselection, your should probably do it even in case > >of error? > > > >> + rk_nfc_select_chip(chip, -1); > >> + > >> + return ret; > >> +} > >> + > >> +static int rk_nfc_read_page_raw(struct nand_chip *chip, u8 *buf, int oob_on, > >> + int page) > >> +{ > >> + struct mtd_info *mtd = nand_to_mtd(chip); > >> + struct rk_nfc *nfc = nand_get_controller_data(chip); > >> + struct nand_ecc_ctrl *ecc = &chip->ecc; > >> + int i; > >> + > >> + nand_read_page_op(chip, page, 0, NULL, 0); > >> + rk_nfc_read_buf(nfc, nfc->buffer, mtd->writesize + mtd->oobsize); > >> + > >> + /* > >> + * Deselect the currently selected target after the ops is done > >> + * to reduce the power consumption. > >> + */ > >> + rk_nfc_select_chip(chip, -1); > >> + > >> + for (i = 0; i < ecc->steps; i++) { > >> + /* > >> + * The first four bytes of OOB are reserved for the > >> + * boot ROM. In some debugging cases, such as with a read, > >> + * erase and write back test, these 4 bytes also must be > >> + * saved somewhere, otherwise this information will be > >> + * lost during a write back. > > > >Ditto > > > >> + */ > >> + if (!i) > >> + memcpy(rk_nfc_buf_to_oob_ptr(chip, ecc->steps - 1), > >> +        rk_nfc_oob_ptr(chip, i), > >> +        NFC_SYS_DATA_SIZE); > >> + else > >> + memcpy(rk_nfc_buf_to_oob_ptr(chip, i - 1), > >> +        rk_nfc_oob_ptr(chip, i), > >> +        NFC_SYS_DATA_SIZE); > >> + /* Copy ECC data from the NFC buffer. */ > >> + memcpy(rk_nfc_buf_to_oob_ecc_ptr(chip, i), > >> +        rk_nfc_oob_ptr(chip, i) + NFC_SYS_DATA_SIZE, > >> +        ecc->bytes); > >> + /* Copy data from the NFC buffer. */ > >> + if (buf) > >> + memcpy(rk_nfc_buf_to_data_ptr(chip, buf, i), > >> +        rk_nfc_data_ptr(chip, i), > >> +        ecc->size); > >> + } > >> + > >> + return 0; > >> +} > >> + > >> +static int rk_nfc_read_oob(struct nand_chip *chip, int page) > >> +{ > >> + return rk_nfc_read_page_raw(chip, NULL, 1, page); > > > >Ditto > > > >> +} > >> + > >> +static int rk_nfc_read_page_hwecc(struct nand_chip *chip, u8 *buf, int oob_on, > >> +   int page) > >> +{ > >> + struct mtd_info *mtd = nand_to_mtd(chip); > >> + struct rk_nfc *nfc = nand_get_controller_data(chip); > >> + struct rk_nfc_nand_chip *rknand = rk_nfc_to_rknand(chip); > >> + struct nand_ecc_ctrl *ecc = &chip->ecc; > >> + int oob_step = (ecc->bytes > 60) ? NFC_MAX_OOB_PER_STEP : > >> + NFC_MIN_OOB_PER_STEP; > >> + int pages_per_blk = mtd->erasesize / mtd->writesize; > >> + dma_addr_t dma_data, dma_oob; > >> + int ret = 0, i, boot_rom_mode = 0; > >> + int bitflips = 0, bch_st; > >> + u8 *oob; > >> + u32 tmp; > >> + > >> + nand_read_page_op(chip, page, 0, NULL, 0); > >> + > >> + dma_data = dma_map_single(nfc->dev, nfc->page_buf, > >> +   mtd->writesize, > >> +   DMA_FROM_DEVICE); > >> + dma_oob = dma_map_single(nfc->dev, nfc->oob_buf, > >> + ecc->steps * oob_step, > >> + DMA_FROM_DEVICE); > >> + > >> + /* > >> + * The first blocks (4, 8 or 16 depending on the device) > >> + * are used by the boot ROM. > >> + * Configure the ECC algorithm supported by the boot ROM. > >> + */ > >> + if ((page < pages_per_blk * rknand->boot_blks) && > >> +     (chip->options & NAND_IS_BOOT_MEDIUM)) { > >> + boot_rom_mode = 1; > >> + if (rknand->boot_ecc != ecc->strength) > >> + rk_nfc_hw_ecc_setup(chip, ecc, > >> +     rknand->boot_ecc); > >> + } > >> + > >> + reinit_completion(&nfc->done); > >> + writel(INT_DMA, nfc->regs + nfc->cfg->int_en_off); > >> + rk_nfc_xfer_start(nfc, NFC_READ, ecc->steps, dma_data, > >> +   dma_oob); > >> + ret = wait_for_completion_timeout(&nfc->done, > >> +   msecs_to_jiffies(100)); > >> + if (!ret) > >> + dev_warn(nfc->dev, "read: wait dma done timeout.\n"); > >> + /* > >> + * Whether the DMA transfer is completed or not. The driver > >> + * needs to check the NFC`s status register to see if the data > >> + * transfer was completed. > >> + */ > >> + ret = rk_nfc_wait_for_xfer_done(nfc); > >> + dma_unmap_single(nfc->dev, dma_data, mtd->writesize, > >> + DMA_FROM_DEVICE); > >> + dma_unmap_single(nfc->dev, dma_oob, ecc->steps * oob_step, > >> + DMA_FROM_DEVICE); > >> + > >> + if (ret) { > >> + bitflips = -EIO; > >> + dev_err(nfc->dev, > >> + "read: wait transfer done timeout.\n"); > >> + goto out; > >> + } > >> + > >> + for (i = 1; i < ecc->steps; i++) { > >> + oob = chip->oob_poi + (i - 1) * NFC_SYS_DATA_SIZE; > >> + if (nfc->cfg->type == NFC_V9) > >> + tmp = nfc->oob_buf[i]; > >> + else > >> + tmp = nfc->oob_buf[i * (oob_step / 4)]; > >> + *oob++ = (u8)tmp; > >> + *oob++ = (u8)(tmp >> 8); > >> + *oob++ = (u8)(tmp >> 16); > >> + *oob++ = (u8)(tmp >> 24); > >> + } > >> + > >> + for (i = 0; i < (ecc->steps / 2); i++) { > >> + bch_st = readl_relaxed(nfc->regs + > >> +        nfc->cfg->bch_st_off + i * 4); > >> + if (bch_st & BIT(nfc->cfg->ecc0.err_flag_bit) || > >> +     bch_st & BIT(nfc->cfg->ecc1.err_flag_bit)) { > >> + mtd->ecc_stats.failed++; > >> + bitflips = 0; > >> + } else { > >> + ret = ECC_ERR_CNT(bch_st, nfc->cfg->ecc0); > >> + mtd->ecc_stats.corrected += ret; > >> + bitflips = max_t(u32, bitflips, ret); > >> + > >> + ret = ECC_ERR_CNT(bch_st, nfc->cfg->ecc1); > >> + mtd->ecc_stats.corrected += ret; > >> + bitflips = max_t(u32, bitflips, ret); > >> + } > >> + } > >> +out: > >> + memcpy(buf, nfc->page_buf, mtd->writesize); > >> + > >> + if (boot_rom_mode && rknand->boot_ecc != ecc->strength) > >> + rk_nfc_hw_ecc_setup(chip, ecc, ecc->strength); > >> + > >> + if (bitflips > ecc->strength) > >> + dev_err(nfc->dev, "read page: %x ecc error!\n", page); > >> + > >> + /* > >> + * Deselect the currently selected target after the ops is done > >> + * to reduce the power consumption. > >> + */ > >> + rk_nfc_select_chip(chip, -1); > >> + > >> + return bitflips; > >> +} > >> + > >> +static inline void rk_nfc_hw_init(struct rk_nfc *nfc) > >> +{ > >> + /* Disable flash wp. */ > >> + writel(FMCTL_WP, nfc->regs + NFC_FMCTL); > >> + /* Config default timing 40ns at 150 Mhz nfc clock. */ > >> + writel(0x1081, nfc->regs + NFC_FMWAIT); > >> + /* Disable randomizer and DMA. */ > >> + writel(0, nfc->regs + nfc->cfg->randmz_off); > >> + writel(0, nfc->regs + nfc->cfg->dma_cfg_off); > >> + writel(FLCTL_RST, nfc->regs + nfc->cfg->flctl_off); > >> +} > >> + > >> +static irqreturn_t rk_nfc_irq(int irq, void *id) > >> +{ > >> + struct rk_nfc *nfc = id; > >> + u32 sta, ien; > >> + > >> + sta = readl_relaxed(nfc->regs + nfc->cfg->int_st_off); > >> + ien = readl_relaxed(nfc->regs + nfc->cfg->int_en_off); > >> + > >> + if (!(sta & ien)) > >> + return IRQ_NONE; > >> + > >> + writel(sta, nfc->regs + nfc->cfg->int_clr_off); > >> + writel(~sta & ien, nfc->regs + nfc->cfg->int_en_off); > >> + > >> + complete(&nfc->done); > >> + > >> + return IRQ_HANDLED; > >> +} > >> + > >> +static int rk_nfc_enable_clks(struct device *dev, struct rk_nfc *nfc) > >> +{ > >> + int ret; > >> + > >> + if (!IS_ERR(nfc->nfc_clk)) { > >> + ret = clk_prepare_enable(nfc->nfc_clk); > >> + if (ret) { > >> + dev_err(dev, "failed to enable nfc clk\n"); > >> + return ret; > >> + } > >> + } > >> + > >> + ret = clk_prepare_enable(nfc->ahb_clk); > >> + if (ret) { > >> + dev_err(dev, "failed to enable ahb clk\n"); > >> + if (!IS_ERR(nfc->nfc_clk)) > >> + clk_disable_unprepare(nfc->nfc_clk); > >> + return ret; > >> + } > >> + > >> + return 0; > >> +} > >> + > >> +static void rk_nfc_disable_clks(struct rk_nfc *nfc) > >> +{ > >> + if (!IS_ERR(nfc->nfc_clk)) > >> + clk_disable_unprepare(nfc->nfc_clk); > >> + clk_disable_unprepare(nfc->ahb_clk); > >> +} > >> + > >> +static int rk_nfc_ooblayout_free(struct mtd_info *mtd, int section, > >> + struct mtd_oob_region *oob_region) > >> +{ > >> + struct nand_chip *chip = mtd_to_nand(mtd); > >> + struct rk_nfc_nand_chip *rknand = rk_nfc_to_rknand(chip); > >> + > >> + if (section) > >> + return -ERANGE; > >> + > >> + /* > >> + * The beginning of the OOB area stores the reserved data for the NFC, > >> + * the size of the reserved data is NFC_SYS_DATA_SIZE bytes. > >> + */ > >> + oob_region->length = rknand->metadata_size - NFC_SYS_DATA_SIZE - 2; > >> + oob_region->offset = NFC_SYS_DATA_SIZE + 2; > >> + > >> + return 0; > >> +} > >> + > >> +static int rk_nfc_ooblayout_ecc(struct mtd_info *mtd, int section, > >> + struct mtd_oob_region *oob_region) > >> +{ > >> + struct nand_chip *chip = mtd_to_nand(mtd); > >> + struct rk_nfc_nand_chip *rknand = rk_nfc_to_rknand(chip); > >> + > >> + if (section) > >> + return -ERANGE; > >> + > >> + oob_region->length = mtd->oobsize - rknand->metadata_size; > >> + oob_region->offset = rknand->metadata_size; > >> + > >> + return 0; > >> +} > >> + > >> +static const struct mtd_ooblayout_ops rk_nfc_ooblayout_ops = { > >> + .free = rk_nfc_ooblayout_free, > >> + .ecc = rk_nfc_ooblayout_ecc, > >> +}; > >> + > >> +static int rk_nfc_ecc_init(struct device *dev, struct mtd_info *mtd) > >> +{ > >> + struct nand_chip *chip = mtd_to_nand(mtd); > >> + struct rk_nfc *nfc = nand_get_controller_data(chip); > >> + struct nand_ecc_ctrl *ecc = &chip->ecc; > >> + const u8 *strengths = nfc->cfg->ecc_strengths; > >> + u8 max_strength, nfc_max_strength; > >> + int i; > >> + > >> + nfc_max_strength = nfc->cfg->ecc_strengths[0]; > >> + /* If optional dt settings not present. */ > >> + if (!ecc->size || !ecc->strength || > >> +     ecc->strength > nfc_max_strength) { > >> + chip->ecc.size = 1024; > >> + ecc->steps = mtd->writesize / ecc->size; > >> + > >> + /* > >> + * HW ECC always requests the number of ECC bytes per 1024 byte > >> + * blocks. The first 4 OOB bytes are reserved for sys data. > >> + */ > >> + max_strength = ((mtd->oobsize / ecc->steps) - 4) * 8 / > >> + fls(8 * 1024); > >> + if (max_strength > nfc_max_strength) > >> + max_strength = nfc_max_strength; > >> + > >> + for (i = 0; i < 4; i++) { > >> + if (max_strength >= strengths[i]) > >> + break; > >> + } > >> + > >> + if (i >= 4) { > >> + dev_err(nfc->dev, "Unsupported ECC strength\n"); > >> + return -EOPNOTSUPP; > >> + } > >> + > >> + ecc->strength = strengths[i]; > >> + } > >> + ecc->steps = mtd->writesize / ecc->size; > >> + ecc->bytes = DIV_ROUND_UP(ecc->strength * fls(8 * 1024), 8); > > > >Here you assume 1024 ECC step size, this is wrong. Either the > >controller only supports 1024 bytes or you officially state somewhere > >that you don't support more ECC step sizes yet. > > > >> + /* HW ECC always work with even numbers of ECC bytes. */ > >> + ecc->bytes = ALIGN(ecc->bytes, 2); > > > >Shouldn't you ensure the number of bytes is rounded up ? > > The V6 and V9 controller supports DDR mode, so ECC bytes need to be aligned to an even number if enable DDR mode. > This drivers no support ddr mode now,I will drop this code. > I think your approach is fine, I just misunderstood it because of the comment. Maybe you could: - Create a helper for that - Correct the comment to clearly explain what you do (your explanation here is very clear to me) - Include the comment in the helper, not in each function - Call the helper in every function accessing this area unless the block is reserved for the bootrom? Thanks, Miquèl