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=-7.2 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,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 EAF9CC38A2A for ; Thu, 7 May 2020 15:46:32 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id B454F2082E for ; Thu, 7 May 2020 15:46:32 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="DRhpAcS+" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B454F2082E 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=bombadil.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=mTh14PYbSjJyBpYdxnkC/d5MgrOf3bHTkEEyAJFnikA=; b=DRhpAcS+tcGwcc 1XOnjRkmMWAH6EK1d8iPD1GTk4J3HiPoDutf+Jz3R5EmUCGxz9+0FmXLwmxIuSOkYkIH1zdG7Z8kg qA+eg3XABybKLFlDFjveMQNTf0M4OTPirNWq6ovXIPBHr2e8rIgmAwM1Mstg/j5WAp6R8/9XUOXPh qjTnZRijclfeTWyN7ye2/06ThIJ8DSsTlcCgs9N4LKo/mRDZljZa1FNQTCwBG5OqJfj9wg4RjVxeh wIjSums3LyofyBYLSNQYUtcRwHsxOx9XZ6lq3eyeeDZjMcbTJtzxFY3Ux6ISSXwUaUHYNmP6sumOQ YnijLdWNVD8p43/3EuJQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jWiiz-0002bV-9d; Thu, 07 May 2020 15:46:13 +0000 Received: from relay1-d.mail.gandi.net ([217.70.183.193]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jWiis-0002Re-HE for linux-mtd@lists.infradead.org; Thu, 07 May 2020 15:46:10 +0000 X-Originating-IP: 91.224.148.103 Received: from xps13 (unknown [91.224.148.103]) (Authenticated sender: miquel.raynal@bootlin.com) by relay1-d.mail.gandi.net (Postfix) with ESMTPSA id 9A00E24000D; Thu, 7 May 2020 15:46:00 +0000 (UTC) Date: Thu, 7 May 2020 17:45:59 +0200 From: Miquel Raynal To: Boris Brezillon Subject: Re: [PATCH v3 7/8] mtd: rawnand: arasan: Add new Arasan NAND controller Message-ID: <20200507174559.58b57452@xps13> In-Reply-To: <20200507145127.71615ed8@collabora.com> References: <20200507110034.14736-1-miquel.raynal@bootlin.com> <20200507110034.14736-8-miquel.raynal@bootlin.com> <20200507145127.71615ed8@collabora.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-20200507_084606_851970_DBAC1453 X-CRM114-Status: GOOD ( 25.87 ) 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: Mark Rutland , devicetree@vger.kernel.org, Michal Simek , Vignesh Raghavendra , Tudor Ambarus , Richard Weinberger , Rob Herring , linux-mtd@lists.infradead.org, Thomas Petazzoni , Naga Sureshkumar Relli 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 SGkgQm9yaXMsCgpCb3JpcyBCcmV6aWxsb24gPGJvcmlzLmJyZXppbGxvbkBjb2xsYWJvcmEuY29t PiB3cm90ZSBvbiBUaHUsIDcgTWF5CjIwMjAgMTQ6NTE6MjcgKzAyMDA6Cgo+IE9uIFRodSwgIDcg TWF5IDIwMjAgMTM6MDA6MzMgKzAyMDAKPiBNaXF1ZWwgUmF5bmFsIDxtaXF1ZWwucmF5bmFsQGJv b3RsaW4uY29tPiB3cm90ZToKPiAKPiAKPiA+ICsvKioKPiA+ICsgKiBzdHJ1Y3QgYXJhc2FuX25m YyAtIERlZmluZXMgdGhlIEFyYXNhbiBOQU5EIGZsYXNoIGNvbnRyb2xsZXIgZHJpdmVyIGluc3Rh bmNlCj4gPiArICogQGRldjoJCVBvaW50ZXIgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUKPiA+ICsg KiBAYmFzZToJCVJlbWFwcGVkIHJlZ2lzdGVyIGFyZWEKPiA+ICsgKiBAY29udHJvbGxlcl9jbGs6 CQlQb2ludGVyIHRvIHRoZSBzeXN0ZW0gY2xvY2sKPiA+ICsgKiBAYnVzX2NsazoJCVBvaW50ZXIg dG8gdGhlIGZsYXNoIGNsb2NrCj4gPiArICogQGNvbnRyb2xsZXI6CQlCYXNlIGNvbnRyb2xsZXIg c3RydWN0dXJlCj4gPiArICogQGNoaXBzOgkJTGlzdCBvZiBhbGwgTkFORCBjaGlwcyBhdHRhY2hl ZCB0byB0aGUgY29udHJvbGxlcgo+ID4gKyAqIEBhc3NpZ25lZF9jczoJQml0bWFzayBkZXNjcmli aW5nIGFscmVhZHkgYXNzaWduZWQgQ1MgbGluZXMKPiA+ICsgKiBAY3VyX2NsazoJCUN1cnJlbnQg Y2xvY2sgcmF0ZQo+ID4gKyAqIEBiZjoJCQlBcnJheSBvZiBiaXRmbGlwcyByZWFkIGluIGVhY2gg RUNDIHN0ZXAKPiA+ICsgKi8KPiA+ICtzdHJ1Y3QgYXJhc2FuX25mYyB7Cj4gPiArCXN0cnVjdCBk ZXZpY2UgKmRldjsKPiA+ICsJdm9pZCBfX2lvbWVtICpiYXNlOwo+ID4gKwlzdHJ1Y3QgY2xrICpj b250cm9sbGVyX2NsazsKPiA+ICsJc3RydWN0IGNsayAqYnVzX2NsazsKPiA+ICsJc3RydWN0IG5h bmRfY29udHJvbGxlciBjb250cm9sbGVyOwo+ID4gKwlzdHJ1Y3QgbGlzdF9oZWFkIGNoaXBzOwo+ ID4gKwl1bnNpZ25lZCBsb25nIGFzc2lnbmVkX2NzOwo+ID4gKwl1bnNpZ25lZCBpbnQgY3VyX2Ns azsKPiA+ICsJdTggKmJmOyAgCj4gCj4gTG9va3MgbGlrZSB0aGlzIGZpZWxkIGlzIG5ldmVyIHVz ZWQuCgpZZXMsIGl0IGlzIGEgbGVmdCBvdmVyIG9mIGEgcHJldmlvdXMgaW1wbGVtZW50YXRpb24s IEknbGwgZHJvcCBpdC4KCj4gCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgc3RydWN0IGFuYW5k ICp0b19hbmFuZChzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kKQo+ID4gK3sKPiA+ICsJcmV0dXJuIGNv bnRhaW5lcl9vZihuYW5kLCBzdHJ1Y3QgYW5hbmQsIGNoaXApOwo+ID4gK30KPiA+ICsKPiA+ICtz dGF0aWMgc3RydWN0IGFyYXNhbl9uZmMgKnRvX2FuZmMoc3RydWN0IG5hbmRfY29udHJvbGxlciAq Y3RybCkKPiA+ICt7Cj4gPiArCXJldHVybiBjb250YWluZXJfb2YoY3RybCwgc3RydWN0IGFyYXNh bl9uZmMsIGNvbnRyb2xsZXIpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBhbmZjX2Rp c2FibGVfaW50KHN0cnVjdCBhcmFzYW5fbmZjICpuZmMsIHUzMiBtYXNrKQo+ID4gK3sKPiA+ICsJ bWFzayAmPSB+RVZFTlRfTUFTSzsKPiA+ICsJbWFzayAmPSBFVkVOVF9NQVNLOwo+ID4gKwl3cml0 ZWxfcmVsYXhlZChtYXNrLCBuZmMtPmJhc2UgKyBJTlRSX1NJR19FTl9SRUcpOwo+ID4gK30KPiA+ ICsKPiA+ICtzdGF0aWMgaW50IGFuZmNfd2FpdF9mb3JfZXZlbnQoc3RydWN0IGFyYXNhbl9uZmMg Km5mYywgdW5zaWduZWQgaW50IGV2ZW50KQo+ID4gK3sKPiA+ICsJdTMyIHZhbDsKPiA+ICsJaW50 IHJldDsKPiA+ICsKPiA+ICsJcmV0ID0gcmVhZGxfcmVsYXhlZF9wb2xsX3RpbWVvdXQobmZjLT5i YXNlICsgSU5UUl9TVFNfUkVHLCB2YWwsCj4gPiArCQkJCQkgdmFsICYgZXZlbnQsIDAsCj4gPiAr CQkJCQkgQU5GQ19ERkxUX1RJTUVPVVRfVVMpOwo+ID4gKwlpZiAocmV0KSB7Cj4gPiArCQlkZXZf ZXJyKG5mYy0+ZGV2LCAiVGltZW91dCB3YWl0aW5nIGZvciBldmVudCAweCV4XG4iLCBldmVudCk7 Cj4gPiArCQlyZXR1cm4gLUVUSU1FRE9VVDsKPiA+ICsJfQo+ID4gKwo+ID4gKwl3cml0ZWxfcmVs YXhlZChldmVudCwgbmZjLT5iYXNlICsgSU5UUl9TVFNfUkVHKTsKPiA+ICsKPiA+ICsJcmV0dXJu IDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgYW5mY193YWl0X2Zvcl9yYihzdHJ1Y3Qg YXJhc2FuX25mYyAqbmZjLCBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAo+ID4gKwkJCSAgICB1bnNp Z25lZCBpbnQgdGltZW91dF9tcykKPiA+ICt7Cj4gPiArCXN0cnVjdCBhbmFuZCAqYW5hbmQgPSB0 b19hbmFuZChjaGlwKTsKPiA+ICsJdTMyIHZhbDsKPiA+ICsJaW50IHJldDsKPiA+ICsKPiA+ICsJ cmV0ID0gcmVhZGxfcmVsYXhlZF9wb2xsX3RpbWVvdXQobmZjLT5iYXNlICsgUkVBRFlfU1RTX1JF RywgdmFsLAo+ID4gKwkJCQkJIHZhbCAmIEJJVChhbmFuZC0+cmIpLAo+ID4gKwkJCQkJIDAsIHRp bWVvdXRfbXMgKiAxMDAwKTsgIAo+IAo+IFlvdSBkb24ndCBoYXZlIGFuIGludGVycnVwdCBvbiBS L0IgdHJhbnNpdGlvbj8gSWYgY2FuLCB0aGF0IHdvdWxkCj4gcHJvYmFibHkgYmUgYmV0dGVyIHRv IHVzZSBpbnRlcnJ1cHRzIHRoYW4gcG9sbGluZyB0aGUgc3RhdHVzIHJlZy4KCk5vLCB0aGVyZSBh cmUgaW50ZXJydXB0cyBmb3IgdGhlIG90aGVyIHNpZ25hbHMsIGJ1dCBub25lIGZvciBSQi4KCkhl cmUgaXMgdGhlIGV4aGF1c3RpdmUgbGlzdCBvZiBhdmFpbGFibGUgaW50ZXJydXB0czoKaHR0cHM6 Ly93d3cueGlsaW54LmNvbS9odG1sX2RvY3MvcmVnaXN0ZXJzL3VnMTA4Ny91ZzEwODctenlucS11 bHRyYXNjYWxlLXJlZ2lzdGVycy5odG1sCgo+IAo+ID4gKwlpZiAocmV0KSB7Cj4gPiArCQlkZXZf ZXJyKG5mYy0+ZGV2LCAiVGltZW91dCB3YWl0aW5nIGZvciBSL0IgMHgleFxuIiwKPiA+ICsJCQly ZWFkbF9yZWxheGVkKG5mYy0+YmFzZSArIFJFQURZX1NUU19SRUcpKTsKPiA+ICsJCXJldHVybiAt RVRJTUVET1VUOwo+ID4gKwl9Cj4gPiArCj4gPiArCXJldHVybiAwOwo+ID4gK30KPiA+ICsKPiA+ ICtzdGF0aWMgdm9pZCBhbmZjX3RyaWdnZXJfb3Aoc3RydWN0IGFyYXNhbl9uZmMgKm5mYywgc3Ry dWN0IGFuZmNfb3AgKm5mY19vcCkKPiA+ICt7Cj4gPiArCXdyaXRlbF9yZWxheGVkKG5mY19vcC0+ cGt0X3JlZywgbmZjLT5iYXNlICsgUEtUX1JFRyk7Cj4gPiArCXdyaXRlbF9yZWxheGVkKG5mY19v cC0+YWRkcjFfcmVnLCBuZmMtPmJhc2UgKyBNRU1fQUREUjFfUkVHKTsKPiA+ICsJd3JpdGVsX3Jl bGF4ZWQobmZjX29wLT5hZGRyMl9yZWcsIG5mYy0+YmFzZSArIE1FTV9BRERSMl9SRUcpOwo+ID4g Kwl3cml0ZWxfcmVsYXhlZChuZmNfb3AtPmNtZF9yZWcsIG5mYy0+YmFzZSArIENNRF9SRUcpOwo+ ID4gKwl3cml0ZWxfcmVsYXhlZChuZmNfb3AtPnByb2dfcmVnLCBuZmMtPmJhc2UgKyBQUk9HX1JF Ryk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgYW5mY19sZW5fdG9fc3RlcHMoc3RydWN0 IG5hbmRfY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IGxlbikKPiA+ICt7Cj4gPiArCXVuc2lnbmVk IGludCBzdGVwcyA9IDEsIHBrdHNpemUgPSBsZW47Cj4gPiArCj4gPiArCXdoaWxlIChwa3RzaXpl ID4gQU5GQ19NQVhfUEtUX1NJWkUpIHsKPiA+ICsJCXN0ZXBzICo9IDI7Cj4gPiArCQlwa3RzaXpl ID0gRElWX1JPVU5EX1VQKGxlbiwgc3RlcHMpOyAgCj4gCj4gSG0sIEknbSBub3Qgc3VyZSB0aGF0 J3MgcmlnaHQuIFdoYXQgaGFwcGVucyBpZiBzdGVwcyAqIHBrc2l6ZSBpcyBiaWdnZXIKPiB0aGFu IHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIERBVEEgY3ljbGVzPyBOb3QgYWxsIG9wZXJhdGlvbnMg YWNjZXB0IHRvCj4gaGF2ZSBtb3JlIGRhdGEgcmVhZC93cml0dGVuIHRoYW4gcmVxdWVzdGVkLgo+ IAo+IEknZCByYXRoZXIgaGF2ZSBzb21ldGhpbmcgdGhhdCBkb2VzOgo+IAo+IHN0YXRpYyB2b2lk IGFuZmNfbGVuX3RvX3N0ZXBzKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBs ZW4sCj4gCQkJICAgICAgdW5zaWduZWQgaW50ICpwa3RzaXplLAo+IAkJCSAgICAgIHVuc2lnbmVk IGludCAqbnBrdHMpCj4gewo+IAlpZiAobGVuIDw9IEFORkNfTUFYX1BLVF9TSVpFKSB7Cj4gCQkq cGt0c2l6ZSA9IGxlbjsKPiAJCSpucGt0cyA9IDE7Cj4gCQlyZXR1cm47Cj4gCX0KPiAKPiAJZm9y ICgqbnBrdHMgPSAyOyAqbnBrdHMgPCBBTkZDX01BWF9OVU1fUEtUUzsgKm5wa3RzICo9IDIpIHsK PiAJCSpwa3RzaXplID0gbGVuIC8gKm5wa3RzOwo+IAkJaWYgKCpwa3RzaXplIDw9IEFORkNfTUFY X1BLVF9TSVpFKQo+IAkJCWJyZWFrOwo+IAl9Cj4gfQo+IAo+IEFuZCB0aGVuLCBmcm9tIHRoZSBj YWxsIHNpemUsIHlvdSB0cmlnZ2VyIG5ldyBEQVRBX09VVC9JTiBvcGVyYXRpb24gaWYKPiBsZW4g PiBwa3RzaXplICogbnBrdHMuCgpUaGF0J3Mgc29tZXRoaW5nIEkgY2Fubm90IGRvIHdpdGggdGhp cyBjb250cm9sbGVyLCB1bmZvcnR1bmF0ZWx5Li4uIEl0CmRvZXMgbm90IHN1cHBvcnQgcmVhZC93 cml0ZSBvbmx5IHBhdHRlcm5zLiBTZWUgYmVsb3cuCgo+IAo+ID4gKwl9Cj4gPiArCj4gPiArCXJl dHVybiBzdGVwczsgIAo+IAo+IEkgZ3Vlc3MgeW91IGhhdmUgYSBsaW1pdCBvbiBzdGVwcy4gSXQn cyBwcm9iYWJseSB3b3J0aCBjaGVja2luZwo+IHRoYXQgc3RlcHMgaXMgaW4gYm91bmRzLgoKVGhl IHVwcGVyIGxpbWl0IGlzIDIwNDgsIEknbSBub3Qgc3VyZSBpdCBpcyByZWxldmFudCB0byBhZGQg YSBjaGVjawpoZXJlPwo+IAo+ID4gK30KPiA+ICsKPiA+ICsvKiBOQU5EIGZyYW1ld29yayAtPmV4 ZWNfb3AoKSBob29rcyBhbmQgcmVsYXRlZCBoZWxwZXJzICovCj4gPiArc3RhdGljIHZvaWQgYW5m Y19wYXJzZV9pbnN0cnVjdGlvbnMoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKPiA+ICsJCQkJICAg IGNvbnN0IHN0cnVjdCBuYW5kX3N1Ym9wICpzdWJvcCwKPiA+ICsJCQkJICAgIHN0cnVjdCBhbmZj X29wICpuZmNfb3ApCj4gPiArewo+ID4gKwlzdHJ1Y3QgYW5hbmQgKmFuYW5kID0gdG9fYW5hbmQo Y2hpcCk7Cj4gPiArCWNvbnN0IHN0cnVjdCBuYW5kX29wX2luc3RyICppbnN0ciA9IE5VTEw7Cj4g PiArCWJvb2wgZmlyc3RfY21kID0gdHJ1ZTsKPiA+ICsJdW5zaWduZWQgaW50IG9wX2lkOwo+ID4g KwlpbnQgaTsKPiA+ICsKPiA+ICsJbWVtc2V0KG5mY19vcCwgMCwgc2l6ZW9mKCpuZmNfb3ApKTsK PiA+ICsJbmZjX29wLT5hZGRyMl9yZWcgPSBBRERSMl9DUyhhbmFuZC0+Y3MpOwo+ID4gKwluZmNf b3AtPmNtZF9yZWcgPSBDTURfUEFHRV9TSVpFKGFuYW5kLT5wYWdlX3N6KTsKPiA+ICsKPiA+ICsJ Zm9yIChvcF9pZCA9IDA7IG9wX2lkIDwgc3Vib3AtPm5pbnN0cnM7IG9wX2lkKyspIHsKPiA+ICsJ CXVuc2lnbmVkIGludCBvZmZzZXQsIG5hZGRycywgcGt0c2l6ZTsKPiA+ICsJCWNvbnN0IHU4ICph ZGRyczsKPiA+ICsJCXU4ICpidWY7Cj4gPiArCj4gPiArCQlpbnN0ciA9ICZzdWJvcC0+aW5zdHJz W29wX2lkXTsKPiA+ICsKPiA+ICsJCXN3aXRjaCAoaW5zdHItPnR5cGUpIHsKPiA+ICsJCWNhc2Ug TkFORF9PUF9DTURfSU5TVFI6Cj4gPiArCQkJaWYgKGZpcnN0X2NtZCkKPiA+ICsJCQkJbmZjX29w LT5jbWRfcmVnIHw9IENNRF8xKGluc3RyLT5jdHguY21kLm9wY29kZSk7Cj4gPiArCQkJZWxzZQo+ ID4gKwkJCQluZmNfb3AtPmNtZF9yZWcgfD0gQ01EXzIoaW5zdHItPmN0eC5jbWQub3Bjb2RlKTsK PiA+ICsKPiA+ICsJCQlmaXJzdF9jbWQgPSBmYWxzZTsKPiA+ICsJCQlicmVhazsKPiA+ICsKPiA+ ICsJCWNhc2UgTkFORF9PUF9BRERSX0lOU1RSOgo+ID4gKwkJCW9mZnNldCA9IG5hbmRfc3Vib3Bf Z2V0X2FkZHJfc3RhcnRfb2ZmKHN1Ym9wLCBvcF9pZCk7Cj4gPiArCQkJbmFkZHJzID0gbmFuZF9z dWJvcF9nZXRfbnVtX2FkZHJfY3ljKHN1Ym9wLCBvcF9pZCk7Cj4gPiArCQkJYWRkcnMgPSAmaW5z dHItPmN0eC5hZGRyLmFkZHJzW29mZnNldF07Cj4gPiArCQkJbmZjX29wLT5jbWRfcmVnIHw9IENN RF9OQUREUlMobmFkZHJzKTsKPiA+ICsKPiA+ICsJCQlmb3IgKGkgPSAwOyBpIDwgbWluKEFORkNf TUFYX0FERFJfQ1lDLCBuYWRkcnMpOyBpKyspIHsKPiA+ICsJCQkJaWYgKGkgPCA0KQo+ID4gKwkJ CQkJbmZjX29wLT5hZGRyMV9yZWcgfD0gKHUzMilhZGRyc1tpXSA8PCBpICogODsKPiA+ICsJCQkJ ZWxzZQo+ID4gKwkJCQkJbmZjX29wLT5hZGRyMl9yZWcgfD0gYWRkcnNbaV07Cj4gPiArCQkJfQo+ ID4gKwo+ID4gKwkJCWJyZWFrOwo+ID4gKwkJY2FzZSBOQU5EX09QX0RBVEFfSU5fSU5TVFI6Cj4g PiArCQkJbmZjX29wLT5yZWFkID0gdHJ1ZTsKPiA+ICsJCQlmYWxsdGhyb3VnaDsKPiA+ICsJCWNh c2UgTkFORF9PUF9EQVRBX09VVF9JTlNUUjoKPiA+ICsJCQlvZmZzZXQgPSBuYW5kX3N1Ym9wX2dl dF9kYXRhX3N0YXJ0X29mZihzdWJvcCwgb3BfaWQpOwo+ID4gKwkJCWJ1ZiA9IGluc3RyLT5jdHgu ZGF0YS5idWYuaW47Cj4gPiArCQkJbmZjX29wLT5idWYgPSAmYnVmW29mZnNldF07Cj4gPiArCQkJ bmZjX29wLT5sZW4gPSBuYW5kX3N1Ym9wX2dldF9kYXRhX2xlbihzdWJvcCwgb3BfaWQpOwo+ID4g KwkJCW5mY19vcC0+c3RlcHMgPSBhbmZjX2xlbl90b19zdGVwcyhjaGlwLCBuZmNfb3AtPmxlbik7 Cj4gPiArCQkJcGt0c2l6ZSA9IERJVl9ST1VORF9VUChuZmNfb3AtPmxlbiwgbmZjX29wLT5zdGVw cyk7Cj4gPiArCQkJbmZjX29wLT5wa3RfcmVnIHw9IFBLVF9TSVpFKHJvdW5kX3VwKHBrdHNpemUs IDQpKSB8ICAKPiAKPiBIbSwgcGt0c2l6ZSBoYXMgdG8gYmUgYWxpZ25lZCBvbiA0PyBBZ2Fpbiwg dGhhdCdzIG5vdCBncmVhdCBzaW5jZSB5b3UKPiBhZGp1c3QgdGhlIHNpemUgd2l0aG91dCBsZXR0 aW5nIHRoZSBjb3JlIGtub3cgeW91IGRpZCB0aGF0LgoKTW1taCBwcm9iYWJseSBub3QsIEkgd2ls bCB0ZXN0IHRoYXQuCgpCdXQgYSBGSUZPIHJlYWQgaXMgNCBieXRlcyBsb25nIHNvIGFueXdheSwg aXQgd2lsbCBwcm9iYWJseSByZWFkL3dyaXRlCm1vcmUgbm8gbWF0dGVyIHdoYXQgSSByZXF1ZXN0 IChhbmQgbW92ZSB0aGUgU1JBTSBwb2ludGVyKS4KCj4gCj4gPiArCQkJCQkgICBQS1RfU1RFUFMo bmZjX29wLT5zdGVwcyk7Cj4gPiArCQkJYnJlYWs7Cj4gPiArCQljYXNlIE5BTkRfT1BfV0FJVFJE WV9JTlNUUjoKPiA+ICsJCQluZmNfb3AtPnJkeV90aW1lb3V0X21zID0gaW5zdHItPmN0eC53YWl0 cmR5LnRpbWVvdXRfbXM7Cj4gPiArCQkJYnJlYWs7Cj4gPiArCQl9Cj4gPiArCX0KPiA+ICt9Cj4g PiArCj4gPiArc3RhdGljIGludCBhbmZjX3J3X3Bpb19vcChzdHJ1Y3QgYXJhc2FuX25mYyAqbmZj LCBzdHJ1Y3QgYW5mY19vcCAqbmZjX29wKQo+ID4gK3sKPiA+ICsJdW5zaWduZWQgaW50IGR3b3Jk cyA9IChuZmNfb3AtPmxlbiAvIDQpIC8gbmZjX29wLT5zdGVwczsKPiA+ICsJdW5zaWduZWQgaW50 IGxhc3RfbGVuID0gbmZjX29wLT5sZW4gJSA0Owo+ID4gKwl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBk aXI7Cj4gPiArCXU4ICpidWYgPSBuZmNfb3AtPmJ1ZjsKPiA+ICsJaW50IHJldCwgaTsKPiA+ICsK PiA+ICsJZm9yIChpID0gMDsgaSA8IG5mY19vcC0+c3RlcHM7IGkrKykgewo+ID4gKwkJZGlyID0g bmZjX29wLT5yZWFkID8gUkVBRF9SRUFEWSA6IFdSSVRFX1JFQURZOwo+ID4gKwkJcmV0ID0gYW5m Y193YWl0X2Zvcl9ldmVudChuZmMsIGRpcik7Cj4gPiArCQlpZiAocmV0KSB7Cj4gPiArCQkJZGV2 X2VycihuZmMtPmRldiwgIlBJTyAlcyByZWFkeSBzaWduYWwgbm90IHJlY2VpdmVkXG4iLAo+ID4g KwkJCQluZmNfb3AtPnJlYWQgPyAiUmVhZCIgOiAiV3JpdGUiKTsKPiA+ICsJCQlyZXR1cm4gcmV0 Owo+ID4gKwkJfQo+ID4gKwo+ID4gKwkJb2Zmc2V0ID0gaSAqIChkd29yZHMgKiA0KTsKPiA+ICsJ CWlmIChuZmNfb3AtPnJlYWQpCj4gPiArCQkJaW9yZWFkMzJfcmVwKG5mYy0+YmFzZSArIERBVEFf UE9SVF9SRUcsICZidWZbb2Zmc2V0XSwKPiA+ICsJCQkJICAgICBkd29yZHMpOwo+ID4gKwkJZWxz ZQo+ID4gKwkJCWlvd3JpdGUzMl9yZXAobmZjLT5iYXNlICsgREFUQV9QT1JUX1JFRywgJmJ1Zltv ZmZzZXRdLAo+ID4gKwkJCQkgICAgICBkd29yZHMpOwo+ID4gKwl9Cj4gPiArCj4gPiArCWlmIChs YXN0X2xlbikgewo+ID4gKwkJdTMyIHJlbWFpbmRlcjsKPiA+ICsKPiA+ICsJCW9mZnNldCA9IG5m Y19vcC0+bGVuIC0gbGFzdF9sZW47Cj4gPiArCj4gPiArCQlpZiAobmZjX29wLT5yZWFkKSB7Cj4g PiArCQkJcmVtYWluZGVyID0gcmVhZGxfcmVsYXhlZChuZmMtPmJhc2UgKyBEQVRBX1BPUlRfUkVH KTsKPiA+ICsJCQltZW1jcHkoJmJ1ZltvZmZzZXRdLCAmcmVtYWluZGVyLCBsYXN0X2xlbik7Cj4g PiArCQl9IGVsc2Ugewo+ID4gKwkJCW1lbWNweSgmcmVtYWluZGVyLCAmYnVmW29mZnNldF0sIGxh c3RfbGVuKTsKPiA+ICsJCQl3cml0ZWxfcmVsYXhlZChyZW1haW5kZXIsIG5mYy0+YmFzZSArIERB VEFfUE9SVF9SRUcpOwo+ID4gKwkJfQo+ID4gKwl9Cj4gPiArCj4gPiArCXJldHVybiBhbmZjX3dh aXRfZm9yX2V2ZW50KG5mYywgWEZFUl9DT01QTEVURSk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRp YyBpbnQgYW5mY19taXNjX2RhdGFfdHlwZV9leGVjKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsCj4g PiArCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmFuZF9zdWJvcCAqc3Vib3AsCj4gPiArCQkJCSAgICB1 MzIgcHJvZ19yZWcpCj4gPiArewo+ID4gKwlzdHJ1Y3QgYXJhc2FuX25mYyAqbmZjID0gdG9fYW5m YyhjaGlwLT5jb250cm9sbGVyKTsKPiA+ICsJc3RydWN0IGFuZmNfb3AgbmZjX29wID0ge307Cj4g PiArCWludCByZXQ7Cj4gPiArCj4gPiArCWFuZmNfcGFyc2VfaW5zdHJ1Y3Rpb25zKGNoaXAsIHN1 Ym9wLCAmbmZjX29wKTsKPiA+ICsJbmZjX29wLnByb2dfcmVnID0gcHJvZ19yZWc7Cj4gPiArCWFu ZmNfdHJpZ2dlcl9vcChuZmMsICZuZmNfb3ApOwo+ID4gKwo+ID4gKwlpZiAobmZjX29wLnJkeV90 aW1lb3V0X21zKSB7Cj4gPiArCQlyZXQgPSBhbmZjX3dhaXRfZm9yX3JiKG5mYywgY2hpcCwgbmZj X29wLnJkeV90aW1lb3V0X21zKTsKPiA+ICsJCWlmIChyZXQpCj4gPiArCQkJcmV0dXJuIHJldDsK PiA+ICsJfQo+ID4gKwo+ID4gKwlyZXR1cm4gYW5mY19yd19waW9fb3AobmZjLCAmbmZjX29wKTsK PiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBhbmZjX3BhcmFtX3JlYWRfdHlwZV9leGVjKHN0 cnVjdCBuYW5kX2NoaXAgKmNoaXAsCj4gPiArCQkJCSAgICAgY29uc3Qgc3RydWN0IG5hbmRfc3Vi b3AgKnN1Ym9wKQo+ID4gK3sKPiA+ICsJcmV0dXJuIGFuZmNfbWlzY19kYXRhX3R5cGVfZXhlYyhj aGlwLCBzdWJvcCwgUFJPR19SRFBBUkFNKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBh bmZjX2RhdGFfcmVhZF90eXBlX2V4ZWMoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKPiA+ICsJCQkJ ICAgIGNvbnN0IHN0cnVjdCBuYW5kX3N1Ym9wICpzdWJvcCkKPiA+ICt7Cj4gPiArCXJldHVybiBh bmZjX21pc2NfZGF0YV90eXBlX2V4ZWMoY2hpcCwgc3Vib3AsIFBST0dfUEdSRCk7Cj4gPiArfQo+ ID4gKwo+ID4gK3N0YXRpYyBpbnQgYW5mY19wYXJhbV93cml0ZV90eXBlX2V4ZWMoc3RydWN0IG5h bmRfY2hpcCAqY2hpcCwKPiA+ICsJCQkJICAgICAgY29uc3Qgc3RydWN0IG5hbmRfc3Vib3AgKnN1 Ym9wKQo+ID4gK3sKPiA+ICsJcmV0dXJuIGFuZmNfbWlzY19kYXRhX3R5cGVfZXhlYyhjaGlwLCBz dWJvcCwgUFJPR19TRVRfRkVBVFVSRSk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgYW5m Y19kYXRhX3dyaXRlX3R5cGVfZXhlYyhzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAo+ID4gKwkJCQkg ICAgIGNvbnN0IHN0cnVjdCBuYW5kX3N1Ym9wICpzdWJvcCkKPiA+ICt7Cj4gPiArCXJldHVybiBh bmZjX21pc2NfZGF0YV90eXBlX2V4ZWMoY2hpcCwgc3Vib3AsIFBST0dfUEdQUk9HKTsKPiA+ICt9 Cj4gPiArCj4gPiArc3RhdGljIGludCBhbmZjX21pc2NfemVyb2xlbl90eXBlX2V4ZWMoc3RydWN0 IG5hbmRfY2hpcCAqY2hpcCwKPiA+ICsJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuYW5kX3N1Ym9w ICpzdWJvcCwKPiA+ICsJCQkJICAgICAgIHUzMiBwcm9nX3JlZykKPiA+ICt7Cj4gPiArCXN0cnVj dCBhcmFzYW5fbmZjICpuZmMgPSB0b19hbmZjKGNoaXAtPmNvbnRyb2xsZXIpOwo+ID4gKwlzdHJ1 Y3QgYW5mY19vcCBuZmNfb3AgPSB7fTsKPiA+ICsJaW50IHJldDsKPiA+ICsKPiA+ICsJYW5mY19w YXJzZV9pbnN0cnVjdGlvbnMoY2hpcCwgc3Vib3AsICZuZmNfb3ApOwo+ID4gKwluZmNfb3AucHJv Z19yZWcgPSBwcm9nX3JlZzsKPiA+ICsJYW5mY190cmlnZ2VyX29wKG5mYywgJm5mY19vcCk7Cj4g PiArCj4gPiArCXJldCA9IGFuZmNfd2FpdF9mb3JfZXZlbnQobmZjLCBYRkVSX0NPTVBMRVRFKTsK PiA+ICsJaWYgKHJldCkKPiA+ICsJCXJldHVybiByZXQ7Cj4gPiArCj4gPiArCWlmIChuZmNfb3Au cmR5X3RpbWVvdXRfbXMpCj4gPiArCQlyZXQgPSBhbmZjX3dhaXRfZm9yX3JiKG5mYywgY2hpcCwg bmZjX29wLnJkeV90aW1lb3V0X21zKTsKPiA+ICsKPiA+ICsJcmV0dXJuIHJldDsKPiA+ICt9Cj4g PiArCj4gPiArc3RhdGljIGludCBhbmZjX3N0YXR1c190eXBlX2V4ZWMoc3RydWN0IG5hbmRfY2hp cCAqY2hpcCwKPiA+ICsJCQkJIGNvbnN0IHN0cnVjdCBuYW5kX3N1Ym9wICpzdWJvcCkKPiA+ICt7 Cj4gPiArCXN0cnVjdCBhcmFzYW5fbmZjICpuZmMgPSB0b19hbmZjKGNoaXAtPmNvbnRyb2xsZXIp Owo+ID4gKwl1MzIgdG1wOwo+ID4gKwlpbnQgcmV0Owo+ID4gKwo+ID4gKwkvKgo+ID4gKwkgKiBU aGlzIGNvbnRyb2xsZXIgZG9lcyBub3QgYWxsb3cgdG8gcHJvY2VlZCB3aXRoIGEgQ01EK0RBVEFf SU4gY3ljbGUKPiA+ICsJICogbWFudWFsbHkgb24gdGhlIGJ1cyBieSByZWFkaW5nIGRhdGEgZnJv bSB0aGUgZGF0YSByZWdpc3Rlci4gSW5zdGVhZCwKPiA+ICsJICogdGhlIGNvbnRyb2xsZXIgYWJz dHJhY3QgdGhlIHN0YXR1cyByZWFkIG9wZXJhdGlvbiB3aXRoIGl0cyBvd24gc3RhdHVzCj4gPiAr CSAqIHJlZ2lzdGVyIGFmdGVyIG9yZGVyaW5nIGEgcmVhZCBzdGF0dXMgb3BlcmF0aW9uLiBIZW5j ZSwgdGhlIGZvbGxvd2luZwo+ID4gKwkgKiBoYWNrLgo+ID4gKwkgKi8KPiA+ICsJaWYgKHN1Ym9w LT5pbnN0cnNbMF0uY3R4LmNtZC5vcGNvZGUgIT0gTkFORF9DTURfU1RBVFVTKQo+ID4gKwkJcmV0 dXJuIC1FTk9UU1VQUDsKPiA+ICsKPiA+ICsJcmV0ID0gYW5mY19taXNjX3plcm9sZW5fdHlwZV9l eGVjKGNoaXAsIHN1Ym9wLCBQUk9HX1NUQVRVUyk7Cj4gPiArCWlmIChyZXQpCj4gPiArCQlyZXR1 cm4gcmV0Owo+ID4gKwo+ID4gKwl0bXAgPSByZWFkbF9yZWxheGVkKG5mYy0+YmFzZSArIEZMQVNI X1NUU19SRUcpOwo+ID4gKwltZW1jcHkoc3Vib3AtPmluc3Ryc1sxXS5jdHguZGF0YS5idWYuaW4s ICZ0bXAsIDEpOwo+ID4gKwo+ID4gKwlyZXR1cm4gMDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGlj IGludCBhbmZjX3Jlc2V0X3R5cGVfZXhlYyhzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAo+ID4gKwkJ CQljb25zdCBzdHJ1Y3QgbmFuZF9zdWJvcCAqc3Vib3ApCj4gPiArewo+ID4gKwlyZXR1cm4gYW5m Y19taXNjX3plcm9sZW5fdHlwZV9leGVjKGNoaXAsIHN1Ym9wLCBQUk9HX1JTVCk7Cj4gPiArfQo+ ID4gKwo+ID4gK3N0YXRpYyBpbnQgYW5mY19lcmFzZV90eXBlX2V4ZWMoc3RydWN0IG5hbmRfY2hp cCAqY2hpcCwKPiA+ICsJCQkJY29uc3Qgc3RydWN0IG5hbmRfc3Vib3AgKnN1Ym9wKQo+ID4gK3sK PiA+ICsJcmV0dXJuIGFuZmNfbWlzY196ZXJvbGVuX3R5cGVfZXhlYyhjaGlwLCBzdWJvcCwgUFJP R19FUkFTRSk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgYW5mY193YWl0X3R5cGVfZXhl YyhzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAo+ID4gKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmFu ZF9zdWJvcCAqc3Vib3ApCj4gPiArewo+ID4gKwlzdHJ1Y3QgYXJhc2FuX25mYyAqbmZjID0gdG9f YW5mYyhjaGlwLT5jb250cm9sbGVyKTsKPiA+ICsJc3RydWN0IGFuZmNfb3AgbmZjX29wID0ge307 Cj4gPiArCj4gPiArCWFuZmNfcGFyc2VfaW5zdHJ1Y3Rpb25zKGNoaXAsIHN1Ym9wLCAmbmZjX29w KTsKPiA+ICsKPiA+ICsJcmV0dXJuIGFuZmNfd2FpdF9mb3JfcmIobmZjLCBjaGlwLCBuZmNfb3Au cmR5X3RpbWVvdXRfbXMpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgY29uc3Qgc3RydWN0IG5h bmRfb3BfcGFyc2VyIGFuZmNfb3BfcGFyc2VyID0gTkFORF9PUF9QQVJTRVIoCj4gPiArCU5BTkRf T1BfUEFSU0VSX1BBVFRFUk4oCj4gPiArCQlhbmZjX3BhcmFtX3JlYWRfdHlwZV9leGVjLAo+ID4g KwkJTkFORF9PUF9QQVJTRVJfUEFUX0NNRF9FTEVNKGZhbHNlKSwKPiA+ICsJCU5BTkRfT1BfUEFS U0VSX1BBVF9BRERSX0VMRU0oZmFsc2UsIEFORkNfTUFYX0FERFJfQ1lDKSwKPiA+ICsJCU5BTkRf T1BfUEFSU0VSX1BBVF9XQUlUUkRZX0VMRU0odHJ1ZSksCj4gPiArCQlOQU5EX09QX1BBUlNFUl9Q QVRfREFUQV9JTl9FTEVNKGZhbHNlLCBBTkZDX01BWF9DSFVOS19TSVpFKSksCj4gPiArCU5BTkRf T1BfUEFSU0VSX1BBVFRFUk4oCj4gPiArCQlhbmZjX3BhcmFtX3dyaXRlX3R5cGVfZXhlYywKPiA+ ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9DTURfRUxFTShmYWxzZSksCj4gPiArCQlOQU5EX09QX1BB UlNFUl9QQVRfQUREUl9FTEVNKGZhbHNlLCBBTkZDX01BWF9BRERSX0NZQyksCj4gPiArCQlOQU5E X09QX1BBUlNFUl9QQVRfREFUQV9PVVRfRUxFTShmYWxzZSwgQU5GQ19NQVhfUEFSQU1fU0laRSkp LAo+ID4gKwlOQU5EX09QX1BBUlNFUl9QQVRURVJOKAo+ID4gKwkJYW5mY19kYXRhX3JlYWRfdHlw ZV9leGVjLAo+ID4gKwkJTkFORF9PUF9QQVJTRVJfUEFUX0NNRF9FTEVNKGZhbHNlKSwKPiA+ICsJ CU5BTkRfT1BfUEFSU0VSX1BBVF9BRERSX0VMRU0oZmFsc2UsIEFORkNfTUFYX0FERFJfQ1lDKSwK PiA+ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9DTURfRUxFTShmYWxzZSksCj4gPiArCQlOQU5EX09Q X1BBUlNFUl9QQVRfV0FJVFJEWV9FTEVNKHRydWUpLAo+ID4gKwkJTkFORF9PUF9QQVJTRVJfUEFU X0RBVEFfSU5fRUxFTShmYWxzZSwgQU5GQ19NQVhfQ0hVTktfU0laRSkpLAo+ID4gKwlOQU5EX09Q X1BBUlNFUl9QQVRURVJOKAo+ID4gKwkJYW5mY19kYXRhX3dyaXRlX3R5cGVfZXhlYywKPiA+ICsJ CU5BTkRfT1BfUEFSU0VSX1BBVF9DTURfRUxFTShmYWxzZSksCj4gPiArCQlOQU5EX09QX1BBUlNF Ul9QQVRfQUREUl9FTEVNKGZhbHNlLCBBTkZDX01BWF9BRERSX0NZQyksCj4gPiArCQlOQU5EX09Q X1BBUlNFUl9QQVRfREFUQV9PVVRfRUxFTShmYWxzZSwgQU5GQ19NQVhfQ0hVTktfU0laRSksCj4g PiArCQlOQU5EX09QX1BBUlNFUl9QQVRfQ01EX0VMRU0oZmFsc2UpKSwKPiA+ICsJTkFORF9PUF9Q QVJTRVJfUEFUVEVSTigKPiA+ICsJCWFuZmNfcmVzZXRfdHlwZV9leGVjLAo+ID4gKwkJTkFORF9P UF9QQVJTRVJfUEFUX0NNRF9FTEVNKGZhbHNlKSwKPiA+ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9X QUlUUkRZX0VMRU0oZmFsc2UpKSwKPiA+ICsJTkFORF9PUF9QQVJTRVJfUEFUVEVSTigKPiA+ICsJ CWFuZmNfZXJhc2VfdHlwZV9leGVjLAo+ID4gKwkJTkFORF9PUF9QQVJTRVJfUEFUX0NNRF9FTEVN KGZhbHNlKSwKPiA+ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9BRERSX0VMRU0oZmFsc2UsIEFORkNf TUFYX0FERFJfQ1lDKSwKPiA+ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9DTURfRUxFTShmYWxzZSks Cj4gPiArCQlOQU5EX09QX1BBUlNFUl9QQVRfV0FJVFJEWV9FTEVNKGZhbHNlKSksCj4gPiArCU5B TkRfT1BfUEFSU0VSX1BBVFRFUk4oCj4gPiArCQlhbmZjX3N0YXR1c190eXBlX2V4ZWMsCj4gPiAr CQlOQU5EX09QX1BBUlNFUl9QQVRfQ01EX0VMRU0oZmFsc2UpLAo+ID4gKwkJTkFORF9PUF9QQVJT RVJfUEFUX0RBVEFfSU5fRUxFTShmYWxzZSwgQU5GQ19NQVhfQ0hVTktfU0laRSkpLAo+ID4gKwlO QU5EX09QX1BBUlNFUl9QQVRURVJOKAo+ID4gKwkJYW5mY193YWl0X3R5cGVfZXhlYywKPiA+ICsJ CU5BTkRfT1BfUEFSU0VSX1BBVF9XQUlUUkRZX0VMRU0oZmFsc2UpKSwKPiA+ICsJKTsKPiA+ICsg IAo+IAo+IE9rYXksIG5vIERBVEEtb25seSBwYXR0ZXJucywgc28gbXkgc3VnZ2VzdGlvbiB0byBz cGxpdCBub24tYWxpZ25lZCBkYXRhCj4gcmVhZHMgZG9lc24ndCB3b3JrLiBJJ2Qgc3VnZ2VzdCB0 byBkZXNjcmliZSBkYXRhLWxlbmd0aHMKPiBjb25zdHJhaW50cyByYXRoZXIgdGhhbiBhdXRvbWF0 aWNhbGx5IGFkanVzdGluZyB0aGUgZGF0YSBsZW5ndGggdG8KPiBzb21ldGhpbmcgYmlnZ2VyIHdo ZW4gd2UgY2FuJ3QgZG8gZXhhY3RseSB0aGUgbnVtYmVyIG9mIHJlcXVlc3RlZCBEQVRBCj4gY3lj bGVzLgoKV2VsbCwgd2UgKm11c3QqIGFkanVzdCB0aGUgZGF0YSBsZW5ndGggYXV0b21hdGljYWxs eS4gQnV0IHRoZSBiZWxvdwpjaGFuZ2UgaXMgaW50ZXJlc3RpbmcgYW5kIHNob3VsZCBiZSBleHRl bmRlZCBhbmQgdGhlbiB0aGlzIGNvbnRyb2xsZXIKdXBkYXRlZCAoc2VlIHRoZSBuZXh0IHNlbnRl bmNlKS4KCj4gSSBzdGFydGVkIGRvaW5nIHNvbWV0aGluZyBzaW1pbGFyIGhlcmUgWzFdLCBleGNl cHQgeW91J2QgbmVlZAo+IG11Y2ggbW9yZSBmaW5lZC1ncmFpbmVkIGNvbnN0cmFpbnRzLCBzbyBt YXliZSB3ZSBzaG91bGQgYWRkIGFuIG9wdGlvbmFsCj4gY2hlY2sgaG9vayB0byBkYXRhIHBhdHRl cm5zLgoKV2UgY291bGQgZGVzY3JpYmUgYSAicm91bmRfdXAiIGxpbWl0YXRpb24gdG9vLiBUaGF0 J3MgZGVmaW5pdGVseQpzb21ldGhpbmcgdGhhdCB3ZSBjYW4gYWRkIGluIHRoaXMgZHJpdmVyIG9u IHRvcCBvZiBbMV0uCgpXb3VsZCBhcHBseSB0byBNYXJ2ZWxsIE5GQyBhcyB3ZWxsIGZvciBpbnN0 YW5jZS4KCj4gPiArc3RhdGljIGludCBhbmZjX3NlbGVjdF90YXJnZXQoc3RydWN0IG5hbmRfY2hp cCAqY2hpcCwgaW50IHRhcmdldCkKPiA+ICt7Cj4gPiArCXN0cnVjdCBhbmFuZCAqYW5hbmQgPSB0 b19hbmFuZChjaGlwKTsKPiA+ICsJc3RydWN0IGFyYXNhbl9uZmMgKm5mYyA9IHRvX2FuZmMoY2hp cC0+Y29udHJvbGxlcik7Cj4gPiArCWludCByZXQ7Cj4gPiArCj4gPiArCS8qIFVwZGF0ZSB0aGUg Y29udHJvbGxlciB0aW1pbmdzIGFuZCB0aGUgcG90ZW50aWFsIEVDQyBjb25maWd1cmF0aW9uICov Cj4gPiArCXdyaXRlbF9yZWxheGVkKGFuYW5kLT50aW1pbmdzLCBuZmMtPmJhc2UgKyBEQVRBX0lO VEVSRkFDRV9SRUcpOwo+ID4gKwo+ID4gKwkvKiBVcGRhdGUgY2xvY2sgZnJlcXVlbmN5ICovCj4g PiArCWlmIChuZmMtPmN1cl9jbGsgIT0gYW5hbmQtPmNsaykgewo+ID4gKwkJY2xrX2Rpc2FibGVf dW5wcmVwYXJlKG5mYy0+Y29udHJvbGxlcl9jbGspOwo+ID4gKwkJcmV0ID0gY2xrX3NldF9yYXRl KG5mYy0+Y29udHJvbGxlcl9jbGssIGFuYW5kLT5jbGspOwo+ID4gKwkJaWYgKHJldCkgewo+ID4g KwkJCWRldl9lcnIobmZjLT5kZXYsICJGYWlsZWQgdG8gY2hhbmdlIGNsb2NrIHJhdGVcbiIpOwo+ ID4gKwkJCXJldHVybiByZXQ7Cj4gPiArCQl9Cj4gPiArCj4gPiArCQlyZXQgPSBjbGtfcHJlcGFy ZV9lbmFibGUobmZjLT5jb250cm9sbGVyX2Nsayk7Cj4gPiArCQlpZiAocmV0KSB7Cj4gPiArCQkJ ZGV2X2VycihuZmMtPmRldiwKPiA+ICsJCQkJIkZhaWxlZCB0byByZS1lbmFibGUgdGhlIGNvbnRy b2xsZXIgY2xvY2tcbiIpOwo+ID4gKwkJCXJldHVybiByZXQ7Cj4gPiArCQl9Cj4gPiArCj4gPiAr CQluZmMtPmN1cl9jbGsgPSBhbmFuZC0+Y2xrOwo+ID4gKwl9Cj4gPiArCj4gPiArCXJldHVybiAw Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IGFuZmNfZXhlY19vcChzdHJ1Y3QgbmFuZF9j aGlwICpjaGlwLAo+ID4gKwkJCWNvbnN0IHN0cnVjdCBuYW5kX29wZXJhdGlvbiAqb3AsCj4gPiAr CQkJYm9vbCBjaGVja19vbmx5KQo+ID4gK3sKPiA+ICsJaW50IHJldDsKPiA+ICsKPiA+ICsJaWYg KCFjaGVja19vbmx5KSB7Cj4gPiArCQlyZXQgPSBhbmZjX3NlbGVjdF90YXJnZXQoY2hpcCwgb3At PmNzKTsKPiA+ICsJCWlmIChyZXQpCj4gPiArCQkJcmV0dXJuIHJldDsKPiA+ICsJfSAgCj4gCj4g R2l2ZW4geW91IGRvIG9ubHkgb25lIHRoaW5nIGluIHRoZSBjaGVja19vbmx5IGNhc2UsIEknZCBk bzoKPiAKPiAJaWYgKGNoZWNrX29ubHkpCj4gCQluYW5kX29wX3BhcnNlcl9leGVjX29wKGNoaXAs ICZhbmZjX29wX3BhcnNlciwgb3AsIHRydWUpOwo+IAo+IAlyZXQgPSBhbmZjX3NlbGVjdF90YXJn ZXQoY2hpcCwgb3AtPmNzKTsKPiAJaWYgKHJldCkKPiAJCXJldHVybiByZXQ7Cj4gCj4gCS4uLgoK b2sKCj4gPiArCj4gPiArCXJldHVybiBuYW5kX29wX3BhcnNlcl9leGVjX29wKGNoaXAsICZhbmZj X29wX3BhcnNlciwgb3AsIGNoZWNrX29ubHkpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50 IGFuZmNfc2V0dXBfZGF0YV9pbnRlcmZhY2Uoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgaW50IHRh cmdldCwKPiA+ICsJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmFuZF9kYXRhX2ludGVyZmFjZSAqY29u ZikKPiA+ICt7Cj4gPiArCXN0cnVjdCBhbmFuZCAqYW5hbmQgPSB0b19hbmFuZChjaGlwKTsKPiA+ ICsJc3RydWN0IGFyYXNhbl9uZmMgKm5mYyA9IHRvX2FuZmMoY2hpcC0+Y29udHJvbGxlcik7Cj4g PiArCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBuZmMtPmRldi0+b2Zfbm9kZTsKPiA+ICsKPiA+ ICsJaWYgKHRhcmdldCA8IDApCj4gPiArCQlyZXR1cm4gMDsKPiA+ICsKPiA+ICsJYW5hbmQtPnRp bWluZ3MgPSBESUZBQ0VfU0RSIHwgRElGQUNFX1NEUl9NT0RFKGNvbmYtPnRpbWluZ3MubW9kZSk7 Cj4gPiArCWFuYW5kLT5jbGsgPSBBTkZDX1hMTlhfU0RSX0RGTFRfQ09SRV9DTEs7Cj4gPiArCj4g PiArCS8qCj4gPiArCSAqIER1ZSB0byBhIGhhcmR3YXJlIGJ1ZyBpbiB0aGUgWnlucU1QIFNvQywg U0RSIHRpbWluZyBtb2RlcyAwLTEgd29yawo+ID4gKwkgKiB3aXRoIGYgPiA5ME1IeiAoZGVmYXVs dCBjbG9jayBpcyAxMDBNSHopIGJ1dCBzaWduYWxzIGFyZSB1bnN0YWJsZQo+ID4gKwkgKiB3aXRo IGhpZ2hlciBtb2Rlcy4gSGVuY2Ugd2UgZGVjcmVhc2UgYSBsaXR0bGUgYml0IHRoZSBjbG9jayBy YXRlIHRvCj4gPiArCSAqIDgwTUh6IHdoZW4gdXNpbmcgbW9kZXMgMi01IHdpdGggdGhpcyBTb0Mu Cj4gPiArCSAqLwo+ID4gKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJ4bG54LHp5 bnFtcC1uYW5kLWNvbnRyb2xsZXIiKSAmJgo+ID4gKwkgICAgY29uZi0+dGltaW5ncy5tb2RlID49 IDIpCj4gPiArCQlhbmFuZC0+Y2xrID0gQU5GQ19YTE5YX1NEUl9IU19DT1JFX0NMSzsKPiA+ICsK PiA+ICsJcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgYW5mY19hdHRhY2hf Y2hpcChzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwKQo+ID4gK3sKPiA+ICsJc3RydWN0IGFuYW5kICph bmFuZCA9IHRvX2FuYW5kKGNoaXApOwo+ID4gKwlzdHJ1Y3QgYXJhc2FuX25mYyAqbmZjID0gdG9f YW5mYyhjaGlwLT5jb250cm9sbGVyKTsKPiA+ICsJc3RydWN0IG10ZF9pbmZvICptdGQgPSBuYW5k X3RvX210ZChjaGlwKTsKPiA+ICsJaW50IHJldCA9IDA7Cj4gPiArCj4gPiArCWlmIChtdGQtPndy aXRlc2l6ZSA8PSBTWl81MTIpCj4gPiArCQlhbmFuZC0+Y2FkZHJfY3ljbGVzID0gMTsKPiA+ICsJ ZWxzZQo+ID4gKwkJYW5hbmQtPmNhZGRyX2N5Y2xlcyA9IDI7Cj4gPiArCj4gPiArCWlmIChjaGlw LT5vcHRpb25zICYgTkFORF9ST1dfQUREUl8zKQo+ID4gKwkJYW5hbmQtPnJhZGRyX2N5Y2xlcyA9 IDM7Cj4gPiArCWVsc2UKPiA+ICsJCWFuYW5kLT5yYWRkcl9jeWNsZXMgPSAyOwo+ID4gKwo+ID4g Kwlzd2l0Y2ggKG10ZC0+d3JpdGVzaXplKSB7Cj4gPiArCWNhc2UgNTEyOgo+ID4gKwkJYW5hbmQt PnBhZ2Vfc3ogPSAwOwo+ID4gKwkJYnJlYWs7Cj4gPiArCWNhc2UgMTAyNDoKPiA+ICsJCWFuYW5k LT5wYWdlX3N6ID0gNTsKPiA+ICsJCWJyZWFrOwo+ID4gKwljYXNlIDIwNDg6Cj4gPiArCQlhbmFu ZC0+cGFnZV9zeiA9IDE7Cj4gPiArCQlicmVhazsKPiA+ICsJY2FzZSA0MDk2Ogo+ID4gKwkJYW5h bmQtPnBhZ2Vfc3ogPSAyOwo+ID4gKwkJYnJlYWs7Cj4gPiArCWNhc2UgODE5MjoKPiA+ICsJCWFu YW5kLT5wYWdlX3N6ID0gMzsKPiA+ICsJCWJyZWFrOwo+ID4gKwljYXNlIDE2Mzg0Ogo+ID4gKwkJ YW5hbmQtPnBhZ2Vfc3ogPSA0Owo+ID4gKwkJYnJlYWs7Cj4gPiArCWRlZmF1bHQ6Cj4gPiArCQly ZXR1cm4gLUVJTlZBTDsKPiA+ICsJfQo+ID4gKwo+ID4gKwkvKiBUaGVzZSBob29rcyBhcmUgdmFs aWQgZm9yIGFsbCBFQ0MgcHJvdmlkZXJzICovCj4gPiArCWNoaXAtPmVjYy5yZWFkX3BhZ2VfcmF3 ID0gbmFuZF9tb25vbGl0aGljX3JlYWRfcGFnZV9yYXc7Cj4gPiArCWNoaXAtPmVjYy53cml0ZV9w YWdlX3JhdyA9IG5hbmRfbW9ub2xpdGhpY193cml0ZV9wYWdlX3JhdzsKPiA+ICsKPiA+ICsJc3dp dGNoIChjaGlwLT5lY2MubW9kZSkgewo+ID4gKwljYXNlIE5BTkRfRUNDX05PTkU6Cj4gPiArCWNh c2UgTkFORF9FQ0NfU09GVDoKPiA+ICsJY2FzZSBOQU5EX0VDQ19PTl9ESUU6Cj4gPiArCQlicmVh azsKPiA+ICsJY2FzZSBOQU5EX0VDQ19IVzoKPiA+ICsJZGVmYXVsdDoKPiA+ICsJCWRldl9lcnIo bmZjLT5kZXYsICJVbnN1cHBvcnRlZCBFQ0MgbW9kZTogJWRcbiIsCj4gPiArCQkJY2hpcC0+ZWNj Lm1vZGUpOwo+ID4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gPiArCX0KPiA+ICsKPiA+ICsJcmV0dXJu IHJldDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBuYW5kX2NvbnRyb2xs ZXJfb3BzIGFuZmNfb3BzID0gewo+ID4gKwkuZXhlY19vcCA9IGFuZmNfZXhlY19vcCwKPiA+ICsJ LnNldHVwX2RhdGFfaW50ZXJmYWNlID0gYW5mY19zZXR1cF9kYXRhX2ludGVyZmFjZSwKPiA+ICsJ LmF0dGFjaF9jaGlwID0gYW5mY19hdHRhY2hfY2hpcCwKPiA+ICt9Owo+ID4gKwo+ID4gK3N0YXRp YyBpbnQgYW5mY19jaGlwX2luaXQoc3RydWN0IGFyYXNhbl9uZmMgKm5mYywgc3RydWN0IGRldmlj ZV9ub2RlICpucCkKPiA+ICt7Cj4gPiArCXN0cnVjdCBhbmFuZCAqYW5hbmQ7Cj4gPiArCXN0cnVj dCBuYW5kX2NoaXAgKmNoaXA7Cj4gPiArCXN0cnVjdCBtdGRfaW5mbyAqbXRkOwo+ID4gKwlpbnQg Y3MsIHJiLCByZXQ7Cj4gPiArCj4gPiArCWFuYW5kID0gZGV2bV9remFsbG9jKG5mYy0+ZGV2LCBz aXplb2YoKmFuYW5kKSwgR0ZQX0tFUk5FTCk7Cj4gPiArCWlmICghYW5hbmQpCj4gPiArCQlyZXR1 cm4gLUVOT01FTTsKPiA+ICsKPiA+ICsJLyogT25seSBvbmUgQ1MgY2FuIGJlIGFzc2VydGVkIGF0 IGEgdGltZSAqLyAgCj4gCj4gWW91IG1lYW4gdGhlIGNvbnRyb2xsZXIgb25seSBoYXMgb25lIENT PyBDYXVzZSB0aGF0IGNvbW1lbnQgZG9lc24ndAo+IG1ha2UgbXVjaCBzZW5zZS4KCkkgZG9uJ3Qg cmVtZW1iZXIgd2h5IEkgd3JvdGUgdGhhdC4gVGhlIGNvbnRyb2xsZXIgaGFzIDIgQ1MgKGJvdGgK dGVzdGVkKSwgSSdsbCBkcm9wIHRoZSBjb21tZW50IGFuZCB0aGUgbGltaXRhdGlvbi4KCj4gCj4g PiArCWlmIChvZl9wcm9wZXJ0eV9jb3VudF9lbGVtc19vZl9zaXplKG5wLCAicmVnIiwgc2l6ZW9m KHUzMikpICE9IDEpIHsKPiA+ICsJCWRldl9lcnIobmZjLT5kZXYsICJJbnZhbGlkIHJlZyBwcm9w ZXJ0eVxuIik7Cj4gPiArCQlyZXR1cm4gLUVJTlZBTDsKPiA+ICsJfSAgCj4gCj4gSXQncyBvbmx5 IGEgU1cgbGltaXRhdGlvbi4gSWYgeW91ciBjb250cm9sbGVyIGhhcyBzZXZlcmFsIENTIHBpbnMK PiAod2hpY2ggc2VlbXMgdG8gYmUgdGhlIGNhc2Ugc2luY2UgeW91IGhhdmUgYSBsaXN0IG9mIGNo aXBzKSwgaXQgY2FuCj4gaGFuZGxlIG11bHRpLUNTIGNoaXBzIHRvby4gSSdtIHBlcmZlY3RseSBm aW5lIHdpdGggdGhlIGxpbWl0YXRpb24KPiBpdHNlbGYsIGJ1dCB0aGUgY29tbWVudCBzaG91bGQg cmVmbGVjdCB0aGUgcmVhbGl0eS4gQW5kIGlmIHlvdSB3YW50IHRvCj4gc3VwcG9ydCBtdWx0aS1D UyBjaGlwcywgeW91IGp1c3QgaGF2ZSB0byBkZWZpbmUgYW4gYXJyYXkgb2YgQ1MvUkIgaW4KPiBh bmFuZC4KPiAKPiA+ICsKPiA+ICsJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyZWci LCAmY3MpOwo+ID4gKwlpZiAocmV0KQo+ID4gKwkJcmV0dXJuIHJldDsKPiA+ICsKPiA+ICsJcmV0 ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJuYW5kLXJiIiwgJnJiKTsKPiA+ICsJaWYgKHJl dCkKPiA+ICsJCXJldHVybiByZXQ7Cj4gPiArCj4gPiArCWlmIChjcyA+PSBBTkZDX01BWF9DUyB8 fCByYiA+PSBBTkZDX01BWF9DUykgewo+ID4gKwkJZGV2X2VycihuZmMtPmRldiwgIldyb25nIENT ICVkIG9yIFJCICVkXG4iLCBjcywgcmIpOwo+ID4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gPiArCX0K PiA+ICsKPiA+ICsJaWYgKHRlc3RfYW5kX3NldF9iaXQoY3MsICZuZmMtPmFzc2lnbmVkX2NzKSkg ewo+ID4gKwkJZGV2X2VycihuZmMtPmRldiwgIkFscmVhZHkgYXNzaWduZWQgQ1MgJWRcbiIsIGNz KTsKPiA+ICsJCXJldHVybiAtRUlOVkFMOwo+ID4gKwl9Cj4gPiArCj4gPiArCWFuYW5kLT5jcyA9 IGNzOwo+ID4gKwlhbmFuZC0+cmIgPSByYjsKPiA+ICsKPiA+ICsJY2hpcCA9ICZhbmFuZC0+Y2hp cDsKPiA+ICsJbXRkID0gbmFuZF90b19tdGQoY2hpcCk7Cj4gPiArCW10ZC0+ZGV2LnBhcmVudCA9 IG5mYy0+ZGV2Owo+ID4gKwljaGlwLT5jb250cm9sbGVyID0gJm5mYy0+Y29udHJvbGxlcjsKPiA+ ICsJY2hpcC0+b3B0aW9ucyA9IE5BTkRfQlVTV0lEVEhfQVVUTyB8IE5BTkRfTk9fU1VCUEFHRV9X UklURSB8Cj4gPiArCQkJTkFORF9VU0VTX0RNQTsKPiA+ICsKPiA+ICsJbmFuZF9zZXRfZmxhc2hf bm9kZShjaGlwLCBucCk7Cj4gPiArCWlmICghbXRkLT5uYW1lKSB7Cj4gPiArCQlkZXZfZXJyKG5m Yy0+ZGV2LCAiTkFORCBsYWJlbCBwcm9wZXJ0eSBpcyBtYW5kYXRvcnlcbiIpOwo+ID4gKwkJcmV0 dXJuIC1FSU5WQUw7Cj4gPiArCX0KPiA+ICsKPiA+ICsJcmV0ID0gbmFuZF9zY2FuKGNoaXAsIDEp Owo+ID4gKwlpZiAocmV0KSB7Cj4gPiArCQlkZXZfZXJyKG5mYy0+ZGV2LCAiU2NhbiBvcGVyYXRp b24gZmFpbGVkXG4iKTsKPiA+ICsJCXJldHVybiByZXQ7Cj4gPiArCX0KPiA+ICsKPiA+ICsJcmV0 ID0gbXRkX2RldmljZV9yZWdpc3RlcihtdGQsIE5VTEwsIDApOwo+ID4gKwlpZiAocmV0KSB7Cj4g PiArCQluYW5kX3JlbGVhc2UoY2hpcCk7ICAKPiAKPiAJCW5hbmRfY2xlYW51cChjaGlwKTsKCkNy YXAKCj4gCj4gPiArCQlyZXR1cm4gcmV0Owo+ID4gKwl9Cj4gPiArCj4gPiArCWxpc3RfYWRkX3Rh aWwoJmFuYW5kLT5ub2RlLCAmbmZjLT5jaGlwcyk7Cj4gPiArCj4gPiArCXJldHVybiAwOwo+ID4g K30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBhbmZjX2NoaXBzX2NsZWFudXAoc3RydWN0IGFyYXNh bl9uZmMgKm5mYykKPiA+ICt7Cj4gPiArCXN0cnVjdCBhbmFuZCAqYW5hbmQsICp0bXA7Cj4gPiAr Cj4gPiArCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhbmFuZCwgdG1wLCAmbmZjLT5jaGlwcywg bm9kZSkgewo+ID4gKwkJbmFuZF9yZWxlYXNlKCZhbmFuZC0+Y2hpcCk7Cj4gPiArCQlsaXN0X2Rl bCgmYW5hbmQtPm5vZGUpOwo+ID4gKwl9Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgYW5m Y19jaGlwc19pbml0KHN0cnVjdCBhcmFzYW5fbmZjICpuZmMpCj4gPiArewo+ID4gKwlzdHJ1Y3Qg ZGV2aWNlX25vZGUgKm5wID0gbmZjLT5kZXYtPm9mX25vZGUsICpuYW5kX25wOwo+ID4gKwlpbnQg bmNoaXBzID0gb2ZfZ2V0X2NoaWxkX2NvdW50KG5wKTsKPiA+ICsJaW50IHJldDsKPiA+ICsKPiA+ ICsJaWYgKCFuY2hpcHMgfHwgbmNoaXBzID4gQU5GQ19NQVhfQ1MpIHsKPiA+ICsJCWRldl9lcnIo bmZjLT5kZXYsICJJbmNvcnJlY3QgbnVtYmVyIG9mIE5BTkQgY2hpcHMgKCVkKVxuIiwKPiA+ICsJ CQluY2hpcHMpOwo+ID4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gPiArCX0KPiA+ICsKPiA+ICsJZm9y X2VhY2hfY2hpbGRfb2Zfbm9kZShucCwgbmFuZF9ucCkgewo+ID4gKwkJcmV0ID0gYW5mY19jaGlw X2luaXQobmZjLCBuYW5kX25wKTsKPiA+ICsJCWlmIChyZXQpIHsKPiA+ICsJCQlvZl9ub2RlX3B1 dChuYW5kX25wKTsKPiA+ICsJCQlhbmZjX2NoaXBzX2NsZWFudXAobmZjKTsKPiA+ICsJCQlicmVh azsKPiA+ICsJCX0KPiA+ICsJfQo+ID4gKwo+ID4gKwlyZXR1cm4gcmV0Owo+ID4gK30KPiA+ICsK PiA+ICtzdGF0aWMgdm9pZCBhbmZjX3Jlc2V0KHN0cnVjdCBhcmFzYW5fbmZjICpuZmMpCj4gPiAr ewo+ID4gKwlhbmZjX2Rpc2FibGVfaW50KG5mYywgRVZFTlRfTUFTSyk7Cj4gPiArCj4gPiArCS8q IEVuYWJsZSBhbGwgaW50ZXJydXB0IHN0YXR1cyAqLwo+ID4gKwl3cml0ZWxfcmVsYXhlZChFVkVO VF9NQVNLLCBuZmMtPmJhc2UgKyBJTlRSX1NUU19FTl9SRUcpOyAgCj4gCj4gVGhhdCBkb2Vzbid0 IHNvdW5kcyBsaWtlIGEgZ29vZCBpZGVhLiBJbnRlcnJ1cHRzIHNob3VsZCBiZSBlbmFibGVkIG9u bHkKPiB3aGVuIHlvdSBuZWVkIHRvIHdhaXQgb24gc3BlY2lmaWMgZXZlbnRzLgoKSSBhbSBub3Qg ZW5hYmxpbmcgdGhlIGludGVycnVwdCAic2lnbmFscyIgYnV0IGp1c3QgdGhlIGludGVycnVwdAoi c3RhdHVzIi4gSSdsbCBtYWtlIGl0IG1vcmUgY2xlYXIgYnkgZGlzYWJsaW5nIGFsbCBpbnRlcnJ1 cHQgc2lnbmFscwpmaXJzdC4KCj4gWzFdaHR0cHM6Ly9naXRodWIuY29tL2JicmV6aWxsb24vbGlu dXgvY29tbWl0LzAyYzBjZTYzYmUyZDQzZjIwN2JkZWNhZmQ1NTVjNDJlZmRhY2VjZTIKCgoKClRo YW5rcywKTWlxdcOobAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCkxpbnV4IE1URCBkaXNjdXNzaW9uIG1haWxpbmcgbGlzdApodHRwOi8vbGlz dHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LW10ZC8K