Received: by 2002:a05:6a10:6744:0:0:0:0 with SMTP id w4csp380179pxu; Fri, 23 Oct 2020 03:21:59 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzEIyiDT5RLJjKQWd3AaqJCiMXO/VclME7PKLCvfWrcG3ZYGieGME4SqzMIzeaw7aAsnBP6 X-Received: by 2002:a50:d2d3:: with SMTP id q19mr1499663edg.22.1603448519642; Fri, 23 Oct 2020 03:21:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1603448519; cv=none; d=google.com; s=arc-20160816; b=AJPGwanNPw4BkjehneyopfeeUkgyL2Y57RsPnilaOhmPlwoihLMd2aryYmVmQJ3Hw2 gTMGekQ197HFX3pzz8HVCI3vr5T/43B5kVmFg3wg/8t3bAwSNdLBoeSlC4jVwclZCcbq K5P/PdvBbZXdUxhPvYMUpPa2OGZQa2uPcQVvyuzI14TaHbmwSFm//hdrckY18LQbZLbB +Iaao+Mv30dn2+3SUzDtsdWa9WfPq36/0OI6ROmeboxMw/vFiMlXjYfnLFguBY8Pgq0q g893sq7l8yiXwGH2xuGsEwNI7Z8C9HnaMxJGOiVX/Mg2f0PCWnRABzQEDK6DXAJastcJ fjiA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:message-id :mime-version:references:subject:cc:to:from:organization:date; bh=PDojOxhV0xgmQsjfMAXFQODKKprHx4R6K4FLwJScWzc=; b=kpTg4Dla+fqRmdRf+l8mxZePTOFeTa4E4TXhfjXrA380+cviVa4w28/nUjmNHE+Eu6 2/aNcpXS+hj7OeQF6ywX+ZFWM1wYwlxQhVlV2/nyf6Ks3JAaQFRV2NExwB2cQmVvQZJM m9A3S3y0bK7jwaR4MEcicJ09jldRpujQflMJ9C22OXelxtcSpfTCDqppgWMmGKVEIMib HY6FL0SwbDXaQv3J1RuIycrYu6IYY3EaW3/4XFpqnOmVwI2YlUiuuV0GJfvVY49t0L+l +bdtYGSonSkGizUv/yztXyo9SfJ09CDFapRnryYyCYD4UMmNlLW6F2JlKCXSMuapF/n8 5m3A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id v8si518635ejx.1.2020.10.23.03.21.37; Fri, 23 Oct 2020 03:21:59 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S462062AbgJWKUX (ORCPT + 99 others); Fri, 23 Oct 2020 06:20:23 -0400 Received: from regular1.263xmail.com ([211.150.70.199]:49478 "EHLO regular1.263xmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S375950AbgJWKUV (ORCPT ); Fri, 23 Oct 2020 06:20:21 -0400 X-Greylist: delayed 482 seconds by postgrey-1.27 at vger.kernel.org; Fri, 23 Oct 2020 06:20:02 EDT Received: from localhost (unknown [192.168.167.32]) by regular1.263xmail.com (Postfix) with ESMTP id DB295FE7; Fri, 23 Oct 2020 18:11:49 +0800 (CST) X-MAIL-GRAY: 0 X-MAIL-DELIVERY: 1 X-ADDR-CHECKED4: 1 X-ANTISPAM-LEVEL: 2 X-SKE-CHECKED: 1 X-ABS-CHECKED: 1 Received: from hp1216 (unknown [58.22.7.114]) by smtp.263.net (postfix) whith ESMTP id P14870T140468894103296S1603447907486247_; Fri, 23 Oct 2020 18:11:48 +0800 (CST) X-IP-DOMAINF: 1 X-UNIQUE-TAG: <56c401b7817373f26c69fd52a32acfcf> X-RL-SENDER: zyf@rock-chips.com X-SENDER: zyf@rock-chips.com X-LOGIN-NAME: zyf@rock-chips.com X-FST-TO: jbx6244@gmail.com X-SENDER-IP: 58.22.7.114 X-ATTACHMENT-NUM: 0 X-DNS-TYPE: 0 X-System-Flag: 0 Date: Fri, 23 Oct 2020 18:11:49 +0800 Organization: =?UTF-8?B?55Ge6Iqv5b6u55S15a2Q?= From: =?UTF-8?B?6LW15Luq5bOw?= To: "Johan Jonker" , "Miquel Raynal" , richard , vigneshr , robh+dt Cc: devicetree , linux-mtd , =?UTF-8?B?SGVpa29TdMO8Ym5lcg==?= , linux-rockchip , linux-arm-kernel , linux-kernel Subject: Re: Re: [PATCH v12 2/8] mtd: rawnand: rockchip: NFC drivers for RK3308, RK2928 and others References: <20201020031733.17883-1-yifeng.zhao@rock-chips.com>, <20201020031733.17883-3-yifeng.zhao@rock-chips.com>, X-Priority: 3 X-Has-Attach: no X-Mailer: Foxmail 7.2.18.111[cn] Mime-Version: 1.0 Message-ID: <2020102314511434035715@rock-chips.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org SGkgwqBNaXF1w6hsIGFuZCBKb2hhbiwKCkkndmUgZml4ZWQgc29tZSBjb21tZW50cywgYnV0IHRo ZXJlIGFyZSBzdGlsbCBhIGZldyBwb2ludHMgSSBjYW5gdCB1bmRlcnN0YW5kLgoKPkhpIFlpZmVu ZywgTWlxdcOobCBhbmQgb3RoZXJzLAo+Cj5JJ3ZlIGNvcGllZCBzb21lIGNvbW1lbnRzIGZyb20g TWlxdcOobCBmcm9tIHZlcnNpb24gOCB0byB0aGlzIG9uZSBoZXJlCj5hbmQgYWRkZWQgc29tZSBt b3JlLiA7KQo+Cj4KPk9uIDEwLzIwLzIwIDU6MTcgQU0sIFlpZmVuZyBaaGFvIHdyb3RlOgo+PiBU aGlzIGRyaXZlciBzdXBwb3J0cyBSb2NrY2hpcCBORkMgKE5BTkQgRmxhc2ggQ29udHJvbGxlcikg Zm91bmQgb24gUkszMzA4LAo+PiBSSzI5MjgsIFJLUFgzMCwgUlYxMTA4IGFuZCBvdGhlciBTT0Nz LiBUaGUgZHJpdmVyIGhhcyBiZWVuIHRlc3RlZCB1c2luZwo+PiA4LWJpdCBOQU5EIGludGVyZmFj ZSBvbiB0aGUgQVJNIGJhc2VkIFJLMzMwOCBwbGF0Zm9ybS4KPj4KPj4gU3VwcG9ydCBSb2NrY2hp cCBTb0NzIGFuZCBORkMgdmVyc2lvbnM6Cj4+IC0gUFgzMCBhbmQgUkszMzI2KE5GQ3Y5MDApLgo+ PiBFQ0M6IDE2LzQwLzYwLzcwIGJpdHMvMUtCLgo+PiBDTE9DSzogYWhiIGFuZCBuZmMuCj4+IC0g UkszMzA4IGFuZCBSVjExMDgoTkZDdjgwMCkuCj4+IEVDQzogMTYgYml0cy8xS0IuCj4+IENMT0NL OiBhaGIgYW5kIG5mYy4KPj4gLSBSSzMwMzYgYW5kIFJLMzEyOChORkN2NjIyKS4KPj4gRUNDOiAx Ni8yNC80MC82MCBiaXRzLzFLQi4KPj4gQ0xPQ0s6IGFoYiBhbmQgbmZjLgo+PiAtIFJLMzA2Niwg UkszMTg4IGFuZCBSSzI5MjgoTkZDdjYwMCkuCj4+IEVDQzogMTYvMjQvNDAvNjAgYml0cy8xS0Iu Cj4+IENMT0NLOiBhaGIuCj4+Cj4+IFN1cHBvcnRlZCBmZWF0dXJlczoKPj4gLSBSZWFkIGZ1bGwg cGFnZSBkYXRhIGJ5IERNQS4KPj4gLSBTdXBwb3J0IEhXIEVDQyhvbmUgc3RlcCBpcyAxS0IpLgo+ PiAtIFN1cHBvcnQgMiAtIDMySyBwYWdlIHNpemUuCj4+IC0gU3VwcG9ydCA4IENTKGRlcGVuZCBv biBTb0NzKQo+Pgo+PiBMaW1pdGF0aW9uczoKPj4gLSBObyBzdXBwb3J0IGZvciB0aGUgZWNjIHN0 ZXAgc2l6ZSBpcyA1MTIuCj4+IC0gVW50ZXN0ZWQgb24gc29tZSBTb0NzLgo+PiAtIE5vIHN1cHBv cnQgZm9yIHN1YnBhZ2VzLgo+PiAtIE5vIHN1cHBvcnQgZm9yIHRoZSBidWlsdGluIHJhbmRvbWl6 ZXIuCj4+IC0gVGhlIG9yaWdpbmFsIGJhZCBibG9jayBtYXNrIGlzIG5vdCBzdXBwb3J0ZWQuIEl0 IGlzIHJlY29tbWVuZGVkIHRvIHVzZQo+PsKgwqAgdGhlIEJCVChiYWQgYmxvY2sgdGFibGUpLgo+ Pgo+PiBTaWduZWQtb2ZmLWJ5OiBZaWZlbmcgWmhhbyA8eWlmZW5nLnpoYW9Acm9jay1jaGlwcy5j b20+Cj4+IC0tLQo+Pgo+PiAobm8gY2hhbmdlcyBzaW5jZSB2MTEpCj4+Cj4+IENoYW5nZXMgaW4g djExOgo+PiAtIEZpeCBjb21waWxlIGVycm9yLgo+Pgo+PiBDaGFuZ2VzIGluIHYxMDoKPj4gLSBG aXggY29tcGlsZSBlcnJvciBvbiBtYXN0ZXIgdjUuOS1yYzcuCj4+Cj4+IENoYW5nZXMgaW4gdjk6 Cj4+IC0gVGhlIG5mYy0+YnVmZmVyIHdpbGwgcmVhbGxvYyB3aGlsZSB0aGUgcGFnZSBzaXplIG9m IHRoZSBzZWNvbmQgbXRkCj4+wqDCoCBpcyBsYXJnZSB0aGFuIHRoZSBmaXJzdCBvbmUKPj4gLSBG aXggY29kaW5nIHN0eWxlLgo+PiAtIFJlbW92ZSBzdHJ1Y3QgcmtfbmZjX2Nsay4KPj4gLSBQcmVw ZW5kIHNvbWUgZnVuY3Rpb24gd2l0aCBya19uZmNfLgo+PiAtIFJlcGxhY2UgZnVuY3Rpb24gcmVh ZGxfcG9sbF90aW1lb3V0X2F0b21pYyB3aXRoCj5yZWFkbF9yZWxheGVkX3BvbGxfdGltZW91dC4K Pj4gLSBSZW1vdmUgZnVuY3Rpb24gcmtfbmZjX3JlYWRfYnl0ZSBhbmQgcmtfbmZjX3dyaXRlX2J5 dGUuCj4+IC0gRG9uJ3Qgc2VsZWN0IHRoZSBkaWUgaWYgJ2NoZWNrX29ubHkgPT0gdHJ1ZScgaW4g ZnVuY3Rpb24gcmtfbmZjX2V4ZWNfb3AuCj4+IC0gTW9kaWZ5IGZ1bmN0aW9uIHJrX25mY193cml0 ZV9wYWdlIGFuZCBya19uZmNfd3JpdGVfcGFnZV9yYXcuCj4+Cj4+IENoYW5nZXMgaW4gdjc6Cj4+ IC0gUmViYXNlIHRvIGxpbnV4LW5leHQuCj4+IC0gRml4IGNvZGluZyBzdHlsZS4KPj4gLSBSZXNl cnZlZCA0IGJ5dGVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9vYiBhcmVhLgo+PiAtIFBhZ2Ug cmF3IHJlYWQgYW5kIHdyaXRlIGluY2x1ZGVkIGVjYyBkYXRhLgo+Pgo+PiBDaGFuZ2VzIGluIHY2 Ogo+PiAtIFRoZSBtdGQtPm5hbWUgc2V0IGJ5IE5BTkQgbGFiZWwgcHJvcGVydHkuCj4+IC0gQWRk IHNvbWUgY29tbWVudHMuCj4+IC0gRml4IGNvbXBpbGUgZXJyb3IuCj4+Cj4+IENoYW5nZXMgaW4g djU6Cj4+IC0gQWRkIGJvb3QgYmxvY2tzIHN1cHBvcnTCoCB3aXRoIGRpZmZlcmVudCBFQ0MgZm9y IGJvb3RST00uCj4+IC0gUmVuYW1lIHJvY2tjaGlwLW5hbmQuYyB0byByb2NrY2hpcC1uYW5kLWNv bnRyb2xsZXIuYy4KPj4gLSBVbmlmaWNhdGlvbiBvZiBvdGhlciB2YXJpYWJsZSBuYW1lcy4KPj4g LSBSZW1vdmUgc29tZSBjb21wYXRpYmxlIGRlZmluZS4KPj4KPj4gQ2hhbmdlcyBpbiB2NDoKPj4g LSBEZWZpbmUgcGxhdGZvcm0gZGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSByZWdpc3RlciBvZmZzZXRz Lgo+PiAtIFRoZSBjb21wYXRpYmxlIGRlZmluZSB3aXRoIHJreHhfbmZjLgo+PiAtIFVzZSBTRVRf U1lTVEVNX1NMRUVQX1BNX09QUyB0byBkZWZpbmUgUE1fT1BTLgo+PiAtIFVzZSBleGVjX29wIGlu c3RlYWQgb2YgbGVnYWN5IGhvb2tzLgo+Pgo+PiBDaGFuZ2VzIGluIHYyOgo+PiAtIEZpeCBjb21w aWxlIGVycm9yLgo+PiAtIEluY2x1ZGUgaGVhZGVyIGZpbGVzIHNvcnRlZCBieSBmaWxlIG5hbWUu Cj4+Cj4+wqAgZHJpdmVycy9tdGQvbmFuZC9yYXcvS2NvbmZpZ8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgfMKgwqAgMTIgKwo+PsKgIGRyaXZlcnMvbXRkL25hbmQvcmF3L01ha2Vm aWxlwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDCoCAxICsKPj7CoCAuLi4v bXRkL25hbmQvcmF3L3JvY2tjaGlwLW5hbmQtY29udHJvbGxlci5jwqDCoCB8IDE0MzkgKysrKysr KysrKysrKysrKysKPj7CoCAzIGZpbGVzIGNoYW5nZWQsIDE0NTIgaW5zZXJ0aW9ucygrKQo+PsKg IGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL210ZC9uYW5kL3Jhdy9yb2NrY2hpcC1uYW5kLWNv bnRyb2xsZXIuYwo+Pgo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9yYXcvS2NvbmZp ZyBiL2RyaXZlcnMvbXRkL25hbmQvcmF3L0tjb25maWcKPj4gaW5kZXggNmM0NmYyNWI1N2UyLi4y Y2M1MzNlNGUyMzkgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvbXRkL25hbmQvcmF3L0tjb25maWcK Pj4gKysrIGIvZHJpdmVycy9tdGQvbmFuZC9yYXcvS2NvbmZpZwo+PiBAQCAtNDYyLDYgKzQ2Miwx OCBAQCBjb25maWcgTVREX05BTkRfQVJBU0FOCj4+wqAgwqAgRW5hYmxlcyB0aGUgZHJpdmVyIGZv ciB0aGUgQXJhc2FuIE5BTkQgZmxhc2ggY29udHJvbGxlciBvbgo+PsKgIMKgIFp5bnEgVWx0cmFz Y2FsZSsgTVBTb0MuCj4+Cj4+ICtjb25maWcgTVREX05BTkRfUk9DS0NISVAKPj4gKwl0cmlzdGF0 ZSAiUm9ja2NoaXAgTkFORCBjb250cm9sbGVyIgo+PiArCWRlcGVuZHMgb24gQVJDSF9ST0NLQ0hJ UCAmJiBIQVNfSU9NRU0KPj4gKwloZWxwCj4+ICsJwqAgRW5hYmxlcyBzdXBwb3J0IGZvciBOQU5E IGNvbnRyb2xsZXIgb24gUm9ja2NoaXAgU29Dcy4KPj4gKwnCoCBUaGVyZSBhcmUgZm91ciBkaWZm ZXJlbnQgdmVyc2lvbnMgb2YgTkFORCBGTEFTSCBDb250cm9sbGVycywKPj4gKwnCoCBpbmNsdWRp bmc6Cj4+ICsJwqDCoMKgIE5GQyB2NjAwOiBSSzI5MjgsIFJLMzA2NiwgUkszMTg4Cj4+ICsJwqDC oMKgIE5GQyB2NjIyOiBSSzMwMzYsIFJLMzEyOAo+PiArCcKgwqDCoCBORkMgdjgwMDogUkszMzA4 LCBSVjExMDgKPj4gKwnCoMKgwqAgTkZDIHY5MDA6IFBYMzAsIFJLMzMyNgo+PiArCj4+wqAgY29t bWVudCAiTWlzYyIKPj4KPj7CoCBjb25maWcgTVREX1NNX0NPTU1PTgo+PiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9tdGQvbmFuZC9yYXcvTWFrZWZpbGUgYi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9NYWtl ZmlsZQo+PiBpbmRleCAyOTMwZjViOTAxNWQuLjk2MGM5YmUyNTIwNCAxMDA2NDQKPj4gLS0tIGEv ZHJpdmVycy9tdGQvbmFuZC9yYXcvTWFrZWZpbGUKPj4gKysrIGIvZHJpdmVycy9tdGQvbmFuZC9y YXcvTWFrZWZpbGUKPj4gQEAgLTU4LDYgKzU4LDcgQEAgb2JqLSQoQ09ORklHX01URF9OQU5EX1NU TTMyX0ZNQzIpCSs9IHN0bTMyX2ZtYzJfbmFuZC5vCj4+wqAgb2JqLSQoQ09ORklHX01URF9OQU5E X01FU09OKQkrPSBtZXNvbl9uYW5kLm8KPj7CoCBvYmotJChDT05GSUdfTVREX05BTkRfQ0FERU5D RSkJKz0gY2FkZW5jZS1uYW5kLWNvbnRyb2xsZXIubwo+PsKgIG9iai0kKENPTkZJR19NVERfTkFO RF9BUkFTQU4pCSs9IGFyYXNhbi1uYW5kLWNvbnRyb2xsZXIubwo+PiArb2JqLSQoQ09ORklHX01U RF9OQU5EX1JPQ0tDSElQKQkrPSByb2NrY2hpcC1uYW5kLWNvbnRyb2xsZXIubwo+Pgo+PsKgIG5h bmQtb2JqcyA6PSBuYW5kX2Jhc2UubyBuYW5kX2xlZ2FjeS5vIG5hbmRfYmJ0Lm8gbmFuZF90aW1p bmdzLm8KPm5hbmRfaWRzLm8KPj7CoCBuYW5kLW9ianMgKz0gbmFuZF9vbmZpLm8KPj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvcmF3L3JvY2tjaGlwLW5hbmQtY29udHJvbGxlci5jCj5i L2RyaXZlcnMvbXRkL25hbmQvcmF3L3JvY2tjaGlwLW5hbmQtY29udHJvbGxlci5jCj4+IG5ldyBm aWxlIG1vZGUgMTAwNjQ0Cj4+IGluZGV4IDAwMDAwMDAwMDAwMC4uY2YyOGM1OTM2MjA5Cj4+IC0t LSAvZGV2L251bGwKPj4gKysrIGIvZHJpdmVycy9tdGQvbmFuZC9yYXcvcm9ja2NoaXAtbmFuZC1j b250cm9sbGVyLmMKPj4gQEAgLTAsMCArMSwxNDM5IEBACj4+ICsvLyBTUERYLUxpY2Vuc2UtSWRl bnRpZmllcjogR1BMLTIuMCBPUiBNSVQKPj4gKy8qCj4+ICsgKiBSb2NrY2hpcCBOQU5EIEZsYXNo IGNvbnRyb2xsZXIgZHJpdmVyLgo+PiArICogQ29weXJpZ2h0IChDKSAyMDIwIFJvY2tjaGlwIElu Yy4KPj4gKyAqIEF1dGhvcjogWWlmZW5nIFpoYW8gPHlpZmVuZy56aGFvQHJvY2stY2hpcHMuY29t Pgo+PiArICovCj4+ICsKPj4gKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KPj4gKyNpbmNsdWRlIDxs aW51eC9kZWxheS5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Cj4+ICsjaW5j bHVkZSA8bGludXgvZG1hZW5naW5lLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+ Cj4+ICsjaW5jbHVkZSA8bGludXgvaW9wb2xsLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvbW9kdWxl Lmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L210 ZC9yYXduYW5kLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvb2YuaD4KPj4gKyNpbmNsdWRlIDxsaW51 eC9vZl9kZXZpY2UuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KPj4g KyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Cj4+ICsKPj4gKy8qCj4+ICsgKiBORkMgUGFnZSBEYXRh IExheW91dDoKPj4gKyAqCTEwMjQgQnl0ZXMgRGF0YSArIDRCeXRlcyBzeXMgZGF0YSArIDI4Qnl0 ZXN+MTI0Qnl0ZXMgZWNjICsKPj4gKyAqCTEwMjQgQnl0ZXMgRGF0YSArIDRCeXRlcyBzeXMgZGF0 YSArIDI4Qnl0ZXN+MTI0Qnl0ZXMgZWNjICsKPj4gKyAqCS4uLi4uLgo+PiArICogTkFORCBQYWdl IERhdGEgTGF5b3V0Ogo+PiArICoJMTAyNCAqIG4gRGF0YSArIG0gQnl0ZXMgb29iCj4+ICsgKiBP cmlnaW5hbCBCYWQgQmxvY2sgTWFzayBMb2NhdGlvbjoKPj4gKyAqCUZpcnN0IGJ5dGUgb2Ygb29i KHNwYXJlKS4KPj4gKyAqIG5hbmRfY2hpcC0+b29iX3BvaSBkYXRhIGxheW91dDoKPj4gKyAqCTRC eXRlcyBzeXMgZGF0YSArIC4uLi4gKyA0Qnl0ZXMgc3lzIGRhdGEgKyBlY2MgZGF0YS4KPj4gKyAq Lwo+PiArCj4+ICsvKiBOQU5EIGNvbnRyb2xsZXIgcmVnaXN0ZXIgZGVmaW5pdGlvbiAqLwo+PiAr I2RlZmluZSBORkNfUkVBRAkoMCkKPj4gKyNkZWZpbmUgTkZDX1dSSVRFCSgxKQo+PiArCj4+ICsj ZGVmaW5lIE5GQ19GTUNUTAkoMHgwMCkKPj4gKyNkZWZpbmXCoMKgIEZNQ1RMX0NFX1NFTF9NCTB4 RkYKPj4gKyNkZWZpbmXCoMKgIEZNQ1RMX0NFX1NFTCh4KQkoMSA8PCAoeCkpCj4+ICsjZGVmaW5l wqDCoCBGTUNUTF9XUAlCSVQoOCkKPj4gKyNkZWZpbmXCoMKgIEZNQ1RMX1JEWQlCSVQoOSkKPj4g Kwo+PiArI2RlZmluZSBORkNfRk1XQUlUCSgweDA0KQo+PiArI2RlZmluZcKgwqAgRkxDVExfUlNU CUJJVCgwKQo+PiArI2RlZmluZcKgwqAgRkxDVExfV1IJKDEpCS8qIDA6IHJlYWQsIDE6IHdyaXRl ICovCj4+ICsjZGVmaW5lwqDCoCBGTENUTF9YRkVSX1NUCUJJVCgyKQo+PiArI2RlZmluZcKgwqAg RkxDVExfWEZFUl9FTglCSVQoMykKPj4gKyNkZWZpbmXCoMKgIEZMQ1RMX0FDT1JSRUNUCUJJVCgx MCkgLyogQXV0byBjb3JyZWN0IGVycm9yIGJpdHMuICovCj4+ICsjZGVmaW5lwqDCoCBGTENUTF9Y RkVSX1JFQURZCUJJVCgyMCkKPj4gKyNkZWZpbmXCoMKgIEZMQ1RMX1hGRVJfU0VDVE9SCSgyMikK Pj4gKyNkZWZpbmXCoMKgIEZMQ1RMX1RPR19GSVgJQklUKDI5KQo+PiArCj4+ICsjZGVmaW5lwqDC oCBCQ0hDVExfQkFOS19NCSg3IDw8IDUpCj4+ICsjZGVmaW5lwqDCoCBCQ0hDVExfQkFOSwkoNSkK Pj4gKwo+PiArI2RlZmluZcKgwqAgRE1BX1NUCUJJVCgwKQo+PiArI2RlZmluZcKgwqAgRE1BX1dS CSgxKQkvKiAwOiB3cml0ZSwgMTogcmVhZCAqLwo+PiArI2RlZmluZcKgwqAgRE1BX0VOCUJJVCgy KQo+PiArI2RlZmluZcKgwqAgRE1BX0FIQl9TSVpFCSgzKQkvKiAwOiAxLCAxOiAyLCAyOiA0ICov Cj4+ICsjZGVmaW5lwqDCoCBETUFfQlVSU1RfU0laRQkoNikJLyogMDogMSwgMzogNCwgNTogOCwg NzogMTYgKi8KPj4gKyNkZWZpbmXCoMKgIERNQV9JTkNfTlVNCSg5KQkvKiAxIC0gMTYgKi8KPj4g Kwo+PiArI2RlZmluZSBFQ0NfRVJSX0NOVCh4LCBlKSAoKCgoeCkgPj4gKGUpLmxvdykgJiAoZSku bG93X21hc2spIHxcCj4+ICsJwqAgKCgoeCkgPj4gKGUpLmhpZ2gpICYgKGUpLmhpZ2hfbWFzaykg PDwgKGUpLmxvd19ibikKPj4gKyNkZWZpbmXCoMKgIElOVF9ETUEJQklUKDApCj4+ICsjZGVmaW5l IE5GQ19CQU5LCSgweDgwMCkKPj4gKyNkZWZpbmUgTkZDX0JBTktfU1RFUAkoMHgxMDApCj4+ICsj ZGVmaW5lwqDCoCBCQU5LX0RBVEEJKDB4MDApCj4+ICsjZGVmaW5lwqDCoCBCQU5LX0FERFIJKDB4 MDQpCj4+ICsjZGVmaW5lwqDCoCBCQU5LX0NNRAkoMHgwOCkKPj4gKyNkZWZpbmUgTkZDX1NSQU0w CSgweDEwMDApCj4+ICsjZGVmaW5lIE5GQ19TUkFNMQkoMHgxNDAwKQo+PiArI2RlZmluZSBORkNf U1JBTV9TSVpFCSgweDQwMCkKPj4gKyNkZWZpbmUgTkZDX1RJTUVPVVQJKDUwMDAwMCkKPj4gKyNk ZWZpbmUgTkZDX01BWF9PT0JfUEVSX1NURVAJMTI4Cj4+ICsjZGVmaW5lIE5GQ19NSU5fT09CX1BF Ul9TVEVQCTY0Cj4+ICsjZGVmaW5lIE1BWF9EQVRBX1NJWkUJMHhGRkZDCj4+ICsjZGVmaW5lIE1B WF9BRERSRVNTX0NZQwk2Cj4+ICsjZGVmaW5lIE5GQ19FQ0NfTUFYX01PREVTCTQKPj4gKyNkZWZp bmUgTkZDX01BWF9OU0VMUwkoOCkgLyogU29tZSBTb2NzIG9ubHkgaGF2ZSAxIG9yIDIgQ1NzLiAq Lwo+PiArI2RlZmluZSBORkNfU1lTX0RBVEFfU0laRQkoNCkgLyogNCBieXRlcyBzeXMgZGF0YSBp biBvb2IgcHJlIDEwMjQKPmRhdGEuKi8KPj4gKyNkZWZpbmUgUktfREVGQVVMVF9DTE9DS19SQVRF CSgxNTAgKiAxMDAwICogMTAwMCkgLyogMTUwIE1oeiAqLwo+PiArI2RlZmluZSBBQ0NUSU1JTkco Y3NydywgcndwdywgcndjcykJKChjc3J3KSA8PCAxMiB8IChyd3B3KSA8PCA1IHwgKHJ3Y3MpKQo+ PiArCj4+ICtlbnVtIG5mY190eXBlIHsKPj4gKwlORkNfVjYsCj4+ICsJTkZDX1Y4LAo+PiArCU5G Q19WOSwKPj4gK307Cj4+ICsKPj4gKy8qKgo+PiArICogc3RydWN0IHJrX2VjY19jbnRfc3RhdHVz OiByZXByZXNlbnQgYSBlY2Mgc3RhdHVzIGRhdGEuCj4+ICsgKiBAZXJyX2ZsYWdfYml0OiBlcnJv ciBmbGFnIGJpdCBpbmRleCBhdCByZWdpc3Rlci4KPj4gKyAqIEBsb3c6IGVjYyBjb3VudCBsb3cg Yml0IGluZGV4IGF0IHJlZ2lzdGVyLgo+PiArICogQGxvd19tYXNrOiBtYXNrIGJpdC4KPj4gKyAq IEBsb3dfYm46IGVjYyBjb3VudCBsb3cgYml0IG51bWJlci4KPj4gKyAqIEBoaWdoOiBlY2MgY291 bnQgaGlnaCBiaXQgaW5kZXggYXQgcmVnaXN0ZXIuCj4+ICsgKiBAaGlnaF9tYXNrOiBtYXNrIGJp dAo+PiArICovCj4+ICtzdHJ1Y3QgZWNjX2NudF9zdGF0dXMgewo+PiArCXU4IGVycl9mbGFnX2Jp dDsKPj4gKwl1OCBsb3c7Cj4+ICsJdTggbG93X21hc2s7Cj4+ICsJdTggbG93X2JuOwo+PiArCXU4 IGhpZ2g7Cj4+ICsJdTggaGlnaF9tYXNrOwo+PiArfTsKPj4gKwo+PiArLyoKPj4gKyAqIEB0eXBl OiBuZmMgdmVyc2lvbgo+PiArICogQGVjY19zdHJlbmd0aHM6IGVjYyBzdHJlbmd0aHMKPj4gKyAq IEBlY2NfY2ZnczogZWNjIGNvbmZpZyB2YWx1ZXMKPj4gKyAqIEBmbGN0bF9vZmY6IEZMQ1RMIHJl Z2lzdGVyIG9mZnNldAo+PiArICogQGJjaGN0bF9vZmY6IEJDSENUTCByZWdpc3RlciBvZmZzZXQK Pj4gKyAqIEBkbWFfZGF0YV9idWZfb2ZmOiBETUFfREFUQV9CVUYgcmVnaXN0ZXIgb2Zmc2V0Cj4+ ICsgKiBAZG1hX29vYl9idWZfb2ZmOiBETUFfT09CX0JVRiByZWdpc3RlciBvZmZzZXQKPj4gKyAq IEBkbWFfY2ZnX29mZjogRE1BX0NGRyByZWdpc3RlciBvZmZzZXQKPj4gKyAqIEBkbWFfc3Rfb2Zm OiBETUFfU1QgcmVnaXN0ZXIgb2Zmc2V0Cj4+ICsgKiBAYmNoX3N0X29mZjogQkNHX1NUIHJlZ2lz dGVyIG9mZnNldAo+PiArICogQHJhbmRtel9vZmY6IFJBTkRNWiByZWdpc3RlciBvZmZzZXQKPj4g KyAqIEBpbnRfZW5fb2ZmOiBpbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyIG9mZnNldAo+PiArICog QGludF9jbHJfb2ZmOiBpbnRlcnJ1cHQgY2xlYW4gcmVnaXN0ZXIgb2Zmc2V0Cj4+ICsgKiBAaW50 X3N0X29mZjogaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciBvZmZzZXQKPj4gKyAqIEBvb2IwX29m Zjogb29iMCByZWdpc3RlciBvZmZzZXQKPj4gKyAqIEBvb2IxX29mZjogb29iMSByZWdpc3RlciBv ZmZzZXQKPj4gKyAqIEBlY2MwOiByZXByZXNlbnQgRUNDMCBzdGF0dXMgZGF0YQo+PiArICogQGVj YzE6IHJlcHJlc2VudCBFQ0MxIHN0YXR1cyBkYXRhCj4+ICsgKi8KPj4gK3N0cnVjdCBuZmNfY2Zn IHsKPj4gKwllbnVtIG5mY190eXBlIHR5cGU7Cj4+ICsJdTggZWNjX3N0cmVuZ3Roc1tORkNfRUND X01BWF9NT0RFU107Cj4+ICsJdTMyIGVjY19jZmdzW05GQ19FQ0NfTUFYX01PREVTXTsKPj4gKwl1 MzIgZmxjdGxfb2ZmOwo+PiArCXUzMiBiY2hjdGxfb2ZmOwo+PiArCXUzMiBkbWFfY2ZnX29mZjsK Pj4gKwl1MzIgZG1hX2RhdGFfYnVmX29mZjsKPj4gKwl1MzIgZG1hX29vYl9idWZfb2ZmOwo+PiAr CXUzMiBkbWFfc3Rfb2ZmOwo+PiArCXUzMiBiY2hfc3Rfb2ZmOwo+PiArCXUzMiByYW5kbXpfb2Zm Owo+PiArCXUzMiBpbnRfZW5fb2ZmOwo+PiArCXUzMiBpbnRfY2xyX29mZjsKPj4gKwl1MzIgaW50 X3N0X29mZjsKPj4gKwl1MzIgb29iMF9vZmY7Cj4+ICsJdTMyIG9vYjFfb2ZmOwo+PiArCXN0cnVj dCBlY2NfY250X3N0YXR1cyBlY2MwOwo+PiArCXN0cnVjdCBlY2NfY250X3N0YXR1cyBlY2MxOwo+ PiArfTsKPj4gKwo+PiArc3RydWN0IHJrX25mY19uYW5kX2NoaXAgewo+PiArCXN0cnVjdCBsaXN0 X2hlYWQgbm9kZTsKPj4gKwlzdHJ1Y3QgbmFuZF9jaGlwIGNoaXA7Cj4+ICsKPj4gKwl1MTYgc3Bh cmVfcGVyX3NlY3RvcjsKPj4gKwl1MTYgb29iX2J1Zl9wZXJfc2VjdG9yOwo+PiArCXUxNiBib290 X2Jsa3M7Cj4+ICsJdTE2IGJvb3RfZWNjOwo+PiArCXUxNiBtZXRhZGF0YV9zaXplOwo+PiArCj4+ ICsJdTggbnNlbHM7Cj4+ICsJdTggc2Vsc1swXTsKPj4gKwkvKiBOb3RoaW5nIGFmdGVyIHRoaXMg ZmllbGQuICovCj4+ICt9Owo+PiArCj4+ICtzdHJ1Y3QgcmtfbmZjIHsKPj4gKwlzdHJ1Y3QgbmFu ZF9jb250cm9sbGVyIGNvbnRyb2xsZXI7Cj4+ICsJY29uc3Qgc3RydWN0IG5mY19jZmcgKmNmZzsK Pj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXY7Cj4+ICsKPj4gKwlzdHJ1Y3QgY2xrICpuZmNfY2xrOwo+ PiArCXN0cnVjdCBjbGsgKmFoYl9jbGs7Cj4+ICsJdm9pZCBfX2lvbWVtICpyZWdzOwo+PiArCj4+ ICsJdTMyIHNlbGVjdGVkX2Jhbms7Cj4+ICsJdTMyIGJhbmRfb2Zmc2V0Owo+PiArCXUzMiBjdXJf Y2xrOwo+PiArCj4+ICsJc3RydWN0IGNvbXBsZXRpb24gZG9uZTsKPj4gKwlzdHJ1Y3QgbGlzdF9o ZWFkIGNoaXBzOwo+PiArCj4+ICsJdTggKmJ1ZmZlcjsKPj4gKwl1OCAqcGFnZV9idWY7Cj4+ICsJ dTMyICpvb2JfYnVmOwo+PiArCXUzMiBidWZmZXJfc2l6ZTsKPj4gKwo+PiArCXVuc2lnbmVkIGxv bmcgYXNzaWduZWRfY3M7Cj4+ICt9Owo+PiArCj4+ICtzdGF0aWMgaW5saW5lIHN0cnVjdCBya19u ZmNfbmFuZF9jaGlwICp0b19ya25hbmQoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCkKRml4ZWQgaXQu 77yMdG9fcmtuYW5kIC0+IHJrX25mY190b19ya25hbmQKPj4gK3sKPj4gKwlyZXR1cm4gY29udGFp bmVyX29mKGNoaXAsIHN0cnVjdCBya19uZmNfbmFuZF9jaGlwLCBjaGlwKTsKPj4gK30KPj4gKwo+ PiArc3RhdGljIGlubGluZSB1OCAqbmFuZF9kYXRhX3B0cihzdHJ1Y3QgbmFuZF9jaGlwICpjaGlw LCBjb25zdCB1OCAqcCwKPmludCBpKQo+Cj5ya19uZmNfYnVmX3RvX2RhdGFfcHRyID8KPkNvbW1l bnQgYnkgTWlxdcOobDoKPlBsZWFzZSBwcmVwZW5kIGFsbCB5b3VyIGZ1bmN0aW9ucyB3aXRoIHJr X25mY18KPgo+Rm9yIHRoZSBmdHJhY2UgZmlsdGVycyBpdCBpcyBuZWVkZWQgdG8gaGF2ZSBhbGwg ZnVuY3Rpb25zIHN0YXJ0IHdpdGgKPnRoZSBzYW1lIHByZWZpeCBpbiBhIG1vZHVsZS4KPgo+Cj4+ ICt7Cj4+ICsJcmV0dXJuICh1OCAqKXAgKyBpICogY2hpcC0+ZWNjLnNpemU7Cj4+ICt9Cj4+ICsK Pj4gK3N0YXRpYyBpbmxpbmUgdTggKm5hbmRfb29iX3B0cihzdHJ1Y3QgbmFuZF9jaGlwICpjaGlw LCBpbnQgaSkKPgo+c2FtZSBoZXJlCj4+ICt7Cj4+ICsJdTggKnBvaTsKPj4gKwo+PiArCXBvaSA9 IGNoaXAtPm9vYl9wb2kgKyBpICogTkZDX1NZU19EQVRBX1NJWkU7Cj4+ICsKPj4gKwlyZXR1cm4g cG9pOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW5saW5lIHU4ICpuYW5kX29vYl9lY2NfcHRyKHN0 cnVjdCBuYW5kX2NoaXAgKmNoaXAsIGludCBpKQo+Cj5zYW1lIGhlcmUKPj4gK3sKPj4gKwlzdHJ1 Y3QgcmtfbmZjX25hbmRfY2hpcCAqcmtuYW5kID0gdG9fcmtuYW5kKGNoaXApOwo+PiArCXU4ICpw b2k7Cj4+ICsKPj4gKwlwb2kgPSBjaGlwLT5vb2JfcG9pICsgcmtuYW5kLT5tZXRhZGF0YV9zaXpl ICsKPj4gKwnCoMKgwqDCoMKgIGNoaXAtPmVjYy5ieXRlcyAqIGk7Cj4+ICsKPj4gKwlyZXR1cm4g cG9pOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW5saW5lIGludCBya19uZmNfZGF0YV9sZW4oc3Ry dWN0IG5hbmRfY2hpcCAqY2hpcCkKPj4gK3sKPj4gKwlzdHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCAq cmtuYW5kID0gdG9fcmtuYW5kKGNoaXApOwo+PiArCj4+ICsJcmV0dXJuIGNoaXAtPmVjYy5zaXpl ICsgcmtuYW5kLT5zcGFyZV9wZXJfc2VjdG9yOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW5saW5l IHU4ICpya19uZmNfZGF0YV9wdHIoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCzCoCBpbnQgaSkKPj4g K3sKPj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBuYW5kX2dldF9jb250cm9sbGVyX2RhdGEoY2hp cCk7Cj4+ICsKPj4gKwlyZXR1cm4gbmZjLT5idWZmZXIgKyBpICogcmtfbmZjX2RhdGFfbGVuKGNo aXApOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW5saW5lIHU4ICpya19uZmNfb29iX3B0cihzdHJ1 Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQgaSkKPj4gK3sKPj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMg PSBuYW5kX2dldF9jb250cm9sbGVyX2RhdGEoY2hpcCk7Cj4+ICsKPj4gKwlyZXR1cm4gbmZjLT5i dWZmZXIgKyBpICogcmtfbmZjX2RhdGFfbGVuKGNoaXApICsgY2hpcC0+ZWNjLnNpemU7Cj4+ICt9 Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIHJrX25mY19zZWxlY3RfY2hpcChzdHJ1Y3QgbmFuZF9jaGlw ICpjaGlwLCBpbnQgY3MpCj4+ICt7Cj4+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRf Y29udHJvbGxlcl9kYXRhKGNoaXApOwo+PiArCXN0cnVjdCBya19uZmNfbmFuZF9jaGlwICpya25h bmQgPSB0b19ya25hbmQoY2hpcCk7Cj4+ICsJdTMyIHZhbDsKPj4gKwo+PiArCWlmIChjcyA8IDAp IHsKPj4gKwluZmMtPnNlbGVjdGVkX2JhbmsgPSAtMTsKPj4gKwkvKiBEZXNlbGVjdCB0aGUgY3Vy cmVudGx5IHNlbGVjdGVkIHRhcmdldC4gKi8KPj4gKwl2YWwgPSByZWFkbF9yZWxheGVkKG5mYy0+ cmVncyArIE5GQ19GTUNUTCk7Cj4+ICsJdmFsICY9IH5GTUNUTF9DRV9TRUxfTTsKPj4gKwl3cml0 ZWwodmFsLCBuZmMtPnJlZ3MgKyBORkNfRk1DVEwpOwo+PiArCXJldHVybjsKPj4gKwl9Cj4+ICsK Pj4gKwluZmMtPnNlbGVjdGVkX2JhbmsgPSBya25hbmQtPnNlbHNbY3NdOwo+PiArCW5mYy0+YmFu ZF9vZmZzZXQgPSBORkNfQkFOSyArIG5mYy0+c2VsZWN0ZWRfYmFuayAqIE5GQ19CQU5LX1NURVA7 Cj4+ICsKPj4gKwl2YWwgPSByZWFkbF9yZWxheGVkKG5mYy0+cmVncyArIE5GQ19GTUNUTCk7Cj4+ ICsJdmFsICY9IH5GTUNUTF9DRV9TRUxfTTsKPj4gKwl2YWwgfD0gRk1DVExfQ0VfU0VMKG5mYy0+ c2VsZWN0ZWRfYmFuayk7Cj4+ICsKPj4gKwl3cml0ZWwodmFsLCBuZmMtPnJlZ3MgKyBORkNfRk1D VEwpOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW5saW5lIGludCBya19uZmNfd2FpdF9pb3JlYWR5 KHN0cnVjdCBya19uZmMgKm5mYykKPj4gK3sKPj4gKwlpbnQgcmM7Cj4+ICsJdTMyIHZhbDsKPj4g Kwo+PiArCXJjID0gcmVhZGxfcmVsYXhlZF9wb2xsX3RpbWVvdXQobmZjLT5yZWdzICsgTkZDX0ZN Q1RMLCB2YWwsCj4+ICsJdmFsICYgRk1DVExfUkRZLCAxMCwgTkZDX1RJTUVPVVQpOwo+PiArCj4+ ICsJcmV0dXJuIHJjOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCBya19uZmNfcmVhZF9idWYo c3RydWN0IHJrX25mYyAqbmZjLCB1OCAqYnVmLCBpbnQgbGVuKQo+PiArewo+PiArCWludCBpOwo+ PiArCj4+ICsJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQo+PiArCWJ1ZltpXSA9IHJlYWRiX3Jl bGF4ZWQobmZjLT5yZWdzICsgbmZjLT5iYW5kX29mZnNldCArCj4+ICsJwqDCoMKgwqDCoMKgIEJB TktfREFUQSk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIHJrX25mY193cml0ZV9idWYoc3Ry dWN0IHJrX25mYyAqbmZjLCBjb25zdCB1OCAqYnVmLCBpbnQgbGVuKQo+PiArewo+PiArCWludCBp Owo+PiArCj4+ICsJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQo+PiArCXdyaXRlYihidWZbaV0s IG5mYy0+cmVncyArIG5mYy0+YmFuZF9vZmZzZXQgKyBCQU5LX0RBVEEpOwo+PiArfQo+PiArCj4+ ICtzdGF0aWMgaW50IHJrX25mY19jbWQoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKPj4gKwnCoMKg wqDCoMKgIGNvbnN0IHN0cnVjdCBuYW5kX3N1Ym9wICpzdWJvcCkKPj4gK3sKPj4gKwlzdHJ1Y3Qg cmtfbmZjICpuZmMgPSBuYW5kX2dldF9jb250cm9sbGVyX2RhdGEoY2hpcCk7Cj4+ICsJdW5zaWdu ZWQgaW50IGksIGosIHJlbWFpbmluZywgc3RhcnQ7Cj4+ICsJaW50IHJlZ19vZmZzZXQgPSBuZmMt PmJhbmRfb2Zmc2V0Owo+PiArCXU4ICppbmJ1ZiA9IE5VTEw7Cj4+ICsJY29uc3QgdTggKm91dGJ1 ZjsKPj4gKwl1MzIgY250ID0gMDsKPj4gKwlpbnQgcmV0ID0gMDsKPj4gKwo+PiArCWZvciAoaSA9 IDA7IGkgPCBzdWJvcC0+bmluc3RyczsgaSsrKSB7Cj4+ICsJY29uc3Qgc3RydWN0IG5hbmRfb3Bf aW5zdHIgKmluc3RyID0gJnN1Ym9wLT5pbnN0cnNbaV07Cj4+ICsKPj4gKwlzd2l0Y2ggKGluc3Ry LT50eXBlKSB7Cj4+ICsJY2FzZSBOQU5EX09QX0NNRF9JTlNUUjoKPj4gKwl3cml0ZWIoaW5zdHIt PmN0eC5jbWQub3Bjb2RlLAo+PiArCcKgwqDCoMKgwqDCoCBuZmMtPnJlZ3MgKyByZWdfb2Zmc2V0 ICsgQkFOS19DTUQpOwo+PiArCWJyZWFrOwo+PiArCj4+ICsJY2FzZSBOQU5EX09QX0FERFJfSU5T VFI6Cj4+ICsJcmVtYWluaW5nID0gbmFuZF9zdWJvcF9nZXRfbnVtX2FkZHJfY3ljKHN1Ym9wLCBp KTsKPj4gKwlzdGFydCA9IG5hbmRfc3Vib3BfZ2V0X2FkZHJfc3RhcnRfb2ZmKHN1Ym9wLCBpKTsK Pj4gKwo+PiArCWZvciAoaiA9IDA7IGogPCA4ICYmIGogKyBzdGFydCA8IHJlbWFpbmluZzsgaisr KQo+PiArCXdyaXRlYihpbnN0ci0+Y3R4LmFkZHIuYWRkcnNbaiArIHN0YXJ0XSwKPj4gKwnCoMKg wqDCoMKgwqAgbmZjLT5yZWdzICsgcmVnX29mZnNldCArIEJBTktfQUREUik7Cj4+ICsJYnJlYWs7 Cj4+ICsKPj4gKwljYXNlIE5BTkRfT1BfREFUQV9JTl9JTlNUUjoKPj4gKwljYXNlIE5BTkRfT1Bf REFUQV9PVVRfSU5TVFI6Cj4+ICsJc3RhcnQgPSBuYW5kX3N1Ym9wX2dldF9kYXRhX3N0YXJ0X29m ZihzdWJvcCwgaSk7Cj4+ICsJY250ID0gbmFuZF9zdWJvcF9nZXRfZGF0YV9sZW4oc3Vib3AsIGkp Owo+PiArCj4+ICsJaWYgKGluc3RyLT50eXBlID09IE5BTkRfT1BfREFUQV9PVVRfSU5TVFIpIHsK Pj4gKwlvdXRidWYgPSBpbnN0ci0+Y3R4LmRhdGEuYnVmLm91dCArIHN0YXJ0Owo+PiArCXJrX25m Y193cml0ZV9idWYobmZjLCBvdXRidWYsIGNudCk7Cj4+ICsJfSBlbHNlIHsKPj4gKwlpbmJ1ZiA9 IGluc3RyLT5jdHguZGF0YS5idWYuaW4gKyBzdGFydDsKPj4gKwlya19uZmNfcmVhZF9idWYobmZj LCBpbmJ1ZiwgY250KTsKPj4gKwl9Cj4+ICsJYnJlYWs7Cj4+ICsKPj4gKwljYXNlIE5BTkRfT1Bf V0FJVFJEWV9JTlNUUjoKPj4gKwlpZiAocmtfbmZjX3dhaXRfaW9yZWFkeShuZmMpIDwgMCkgewo+ PiArCXJldCA9IC1FVElNRURPVVQ7Cj4+ICsJZGV2X2VycihuZmMtPmRldiwgIklPIG5vdCByZWFk eVxuIik7Cj4+ICsJfQo+PiArCWJyZWFrOwo+PiArCX0KPj4gKwl9Cj4+ICsKPj4gKwlyZXR1cm4g cmV0Owo+PiArfQo+PiArCj4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IG5hbmRfb3BfcGFyc2VyIHJr X25mY19vcF9wYXJzZXIgPSBOQU5EX09QX1BBUlNFUigKPj4gKwlOQU5EX09QX1BBUlNFUl9QQVRU RVJOKAo+PiArCXJrX25mY19jbWQsCj4+ICsJTkFORF9PUF9QQVJTRVJfUEFUX0NNRF9FTEVNKHRy dWUpLAo+PiArCU5BTkRfT1BfUEFSU0VSX1BBVF9BRERSX0VMRU0odHJ1ZSwgTUFYX0FERFJFU1Nf Q1lDKSwKPj4gKwlOQU5EX09QX1BBUlNFUl9QQVRfQ01EX0VMRU0odHJ1ZSksCj4+ICsJTkFORF9P UF9QQVJTRVJfUEFUX1dBSVRSRFlfRUxFTSh0cnVlKSwKPj4gKwlOQU5EX09QX1BBUlNFUl9QQVRf REFUQV9JTl9FTEVNKHRydWUsIE1BWF9EQVRBX1NJWkUpKSwKPj4gKwlOQU5EX09QX1BBUlNFUl9Q QVRURVJOKAo+PiArCXJrX25mY19jbWQsCj4+ICsJTkFORF9PUF9QQVJTRVJfUEFUX0NNRF9FTEVN KHRydWUpLAo+PiArCU5BTkRfT1BfUEFSU0VSX1BBVF9BRERSX0VMRU0odHJ1ZSwgTUFYX0FERFJF U1NfQ1lDKSwKPj4gKwlOQU5EX09QX1BBUlNFUl9QQVRfREFUQV9PVVRfRUxFTSh0cnVlLCBNQVhf REFUQV9TSVpFKSwKPj4gKwlOQU5EX09QX1BBUlNFUl9QQVRfQ01EX0VMRU0odHJ1ZSksCj4+ICsJ TkFORF9PUF9QQVJTRVJfUEFUX1dBSVRSRFlfRUxFTSh0cnVlKSksCj4+ICspOwo+PiArCj4+ICtz dGF0aWMgaW50IHJrX25mY19leGVjX29wKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsCj4+ICsJwqAg Y29uc3Qgc3RydWN0IG5hbmRfb3BlcmF0aW9uICpvcCwKPj4gKwnCoCBib29sIGNoZWNrX29ubHkp Cj4+ICt7Cj4+ICsJaWYgKCFjaGVja19vbmx5KQo+PiArCXJrX25mY19zZWxlY3RfY2hpcChjaGlw LCBvcC0+Y3MpOwo+PiArCj4+ICsJcmV0dXJuIG5hbmRfb3BfcGFyc2VyX2V4ZWNfb3AoY2hpcCwg JnJrX25mY19vcF9wYXJzZXIsIG9wLAo+PiArCcKgwqDCoMKgwqAgY2hlY2tfb25seSk7Cj4+ICt9 Cj4+ICsKPj4gK3N0YXRpYyBpbnQgcmtfbmZjX3NldHVwX2RhdGFfaW50ZXJmYWNlKHN0cnVjdCBu YW5kX2NoaXAgKmNoaXAsIGludAo+Y3NsaW5lLAo+PiArCcKgwqDCoMKgwqDCoCBjb25zdCBzdHJ1 Y3QgbmFuZF9pbnRlcmZhY2VfY29uZmlnICpjb25mKQo+PiArewo+PiArCXN0cnVjdCBya19uZmMg Km5mYyA9IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShjaGlwKTsKPj4gKwljb25zdCBzdHJ1Y3Qg bmFuZF9zZHJfdGltaW5ncyAqdGltaW5nczsKPj4gKwl1MzIgcmF0ZSwgdGMycncsIHRyd3B3LCB0 cncyYzsKPj4gKwl1MzIgdGVtcDsKPj4gKwo+PiArCWlmIChjc2xpbmUgPT0gTkFORF9EQVRBX0lG QUNFX0NIRUNLX09OTFkpCj4+ICsJcmV0dXJuIDA7Cj4+ICsKPj4gKwl0aW1pbmdzID0gbmFuZF9n ZXRfc2RyX3RpbWluZ3MoY29uZik7Cj4+ICsJaWYgKElTX0VSUih0aW1pbmdzKSkKPj4gKwlyZXR1 cm4gLUVPUE5PVFNVUFA7Cj4+ICsKPj4gKwlpZiAoSVNfRVJSKG5mYy0+bmZjX2NsaykpCj4+ICsJ cmF0ZSA9IGNsa19nZXRfcmF0ZShuZmMtPmFoYl9jbGspOwo+PiArCWVsc2UKPj4gKwlyYXRlID0g Y2xrX2dldF9yYXRlKG5mYy0+bmZjX2Nsayk7Cj4+ICsKPj4gKwkvKiBUdXJuIGNsb2NrIHJhdGUg aW50byBrSHouICovCj4+ICsJcmF0ZSAvPSAxMDAwOwo+PiArCj4+ICsJdGMycncgPSAxOwo+PiAr CXRydzJjID0gMTsKPj4gKwo+PiArCXRyd3B3ID0gbWF4KHRpbWluZ3MtPnRXQ19taW4sIHRpbWlu Z3MtPnRSQ19taW4pIC8gMTAwMDsKPj4gKwl0cndwdyA9IERJVl9ST1VORF9VUCh0cndwdyAqIHJh dGUsIDEwMDAwMDApOwo+PiArCj4+ICsJdGVtcCA9IHRpbWluZ3MtPnRSRUFfbWF4IC8gMTAwMDsK Pj4gKwl0ZW1wID0gRElWX1JPVU5EX1VQKHRlbXAgKiByYXRlLCAxMDAwMDAwKTsKPj4gKwo+PiAr CWlmICh0cndwdyA8IHRlbXApCj4+ICsJdHJ3cHcgPSB0ZW1wOwo+PiArCj4+ICsJLyoKPj4gKwkq IEFDQ09OOiBhY2Nlc3MgdGltaW5nIGNvbnRyb2wgcmVnaXN0ZXIKPj4gKwkqIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPj4gKwkqIDMxOjE4OiByZXNlcnZlZAo+PiArCSog MTc6MTI6IGNzcncsIGNsb2NrIGN5Y2xlcyBmcm9tIHRoZSBmYWxsaW5nIGVkZ2Ugb2YgQ1NuIHRv IHRoZQo+PiArCSrCoMKgIGZhbGxpbmcgZWRnZSBvZiBSRG4gb3IgV1JuCj4+ICsJKiAxMToxMTog cmVzZXJ2ZWQKPj4gKwkqIDEwOjA1OiByd3B3LCB0aGUgd2lkdGggb2YgUkRuIG9yIFdSbiBpbiBw cm9jZXNzb3IgY2xvY2sgY3ljbGVzCj4+ICsJKiAwNDowMDogcndjcywgY2xvY2sgY3ljbGVzIGZy b20gdGhlIHJpc2luZyBlZGdlIG9mIFJEbiBvciBXUm4gdG8gdGhlCj4+ICsJKsKgwqAgcmlzaW5n IGVkZ2Ugb2YgQ1NuCj4+ICsJKi8KPj4gKwl0ZW1wID0gQUNDVElNSU5HKHRjMnJ3LCB0cndwdywg dHJ3MmMpOwo+PiArCXdyaXRlbCh0ZW1wLCBuZmMtPnJlZ3MgKyBORkNfRk1XQUlUKTsKPj4gKwo+ PiArCXJldHVybiAwOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IHJrX25mY19od19lY2Nfc2V0 dXAoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKPj4gKwnCoMKgwqDCoMKgwqAgc3RydWN0IG5hbmRf ZWNjX2N0cmwgKmVjYywKPj4gKwnCoMKgwqDCoMKgwqAgdWludDMyX3Qgc3RyZW5ndGgpCj4+ICt7 Cj4+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXAp Owo+PiArCXUzMiByZWcsIGk7Cj4+ICsKPj4gKwlmb3IgKGkgPSAwOyBpIDwgTkZDX0VDQ19NQVhf TU9ERVM7IGkrKykgewo+PiArCWlmIChlY2MtPnN0cmVuZ3RoID09IG5mYy0+Y2ZnLT5lY2Nfc3Ry ZW5ndGhzW2ldKSB7Cj4+ICsJcmVnID0gbmZjLT5jZmctPmVjY19jZmdzW2ldOwo+PiArCWJyZWFr Owo+PiArCX0KPj4gKwl9Cj4+ICsKPj4gKwlpZiAoaSA+PSBORkNfRUNDX01BWF9NT0RFUykKPj4g KwlyZXR1cm4gLUVJTlZBTDsKPj4gKwo+PiArCXdyaXRlbChyZWcsIG5mYy0+cmVncyArIG5mYy0+ Y2ZnLT5iY2hjdGxfb2ZmKTsKPj4gKwo+PiArCXJldHVybiAwOwo+PiArfQo+PiArCj4+ICtzdGF0 aWMgdm9pZCBya19uZmNfeGZlcl9zdGFydChzdHJ1Y3QgcmtfbmZjICpuZmMsIHU4IHJ3LCB1OCBu X0tCLAo+PiArCcKgwqDCoMKgwqAgZG1hX2FkZHJfdCBkbWFfZGF0YSwgZG1hX2FkZHJfdCBkbWFf b29iKQo+PiArewo+PiArCXUzMiBkbWFfcmVnLCBmbF9yZWcsIGJjaF9yZWc7Cj4+ICsKPj4gKwlk bWFfcmVnID0gRE1BX1NUIHwgKCghcncpIDw8IERNQV9XUikgfCBETUFfRU4gfCAoMiA8PCBETUFf QUhCX1NJWkUpIHwKPj4gKwnCoMKgwqDCoMKgICg3IDw8IERNQV9CVVJTVF9TSVpFKSB8ICgxNiA8 PCBETUFfSU5DX05VTSk7Cj4+ICsKPj4gKwlmbF9yZWcgPSAocncgPDwgRkxDVExfV1IpIHwgRkxD VExfWEZFUl9FTiB8IEZMQ1RMX0FDT1JSRUNUIHwKPj4gKwkobl9LQiA8PCBGTENUTF9YRkVSX1NF Q1RPUikgfCBGTENUTF9UT0dfRklYOwo+PiArCj4+ICsJaWYgKG5mYy0+Y2ZnLT50eXBlID09IE5G Q19WNiB8fCBuZmMtPmNmZy0+dHlwZSA9PSBORkNfVjgpIHsKPj4gKwliY2hfcmVnID0gcmVhZGxf cmVsYXhlZChuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+YmNoY3RsX29mZik7Cj4+ICsJYmNoX3JlZyA9 IChiY2hfcmVnICYgKH5CQ0hDVExfQkFOS19NKSkgfAo+PiArCcKgIChuZmMtPnNlbGVjdGVkX2Jh bmsgPDwgQkNIQ1RMX0JBTkspOwo+PiArCXdyaXRlbChiY2hfcmVnLCBuZmMtPnJlZ3MgKyBuZmMt PmNmZy0+YmNoY3RsX29mZik7Cj4+ICsJfQo+PiArCj4+ICsJd3JpdGVsKGRtYV9yZWcsIG5mYy0+ cmVncyArIG5mYy0+Y2ZnLT5kbWFfY2ZnX29mZik7Cj4+ICsJd3JpdGVsKCh1MzIpZG1hX2RhdGEs IG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5kbWFfZGF0YV9idWZfb2ZmKTsKPj4gKwl3cml0ZWwoKHUz MilkbWFfb29iLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ZG1hX29vYl9idWZfb2ZmKTsKPj4gKwl3 cml0ZWwoZmxfcmVnLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ZmxjdGxfb2ZmKTsKPj4gKwlmbF9y ZWcgfD0gRkxDVExfWEZFUl9TVDsKPj4gKwl3cml0ZWwoZmxfcmVnLCBuZmMtPnJlZ3MgKyBuZmMt PmNmZy0+ZmxjdGxfb2ZmKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCBya19uZmNfd2FpdF9m b3JfeGZlcl9kb25lKHN0cnVjdCBya19uZmMgKm5mYykKPj4gK3sKPj4gKwl2b2lkIF9faW9tZW0g KnB0cjsKPj4gKwlpbnQgcmV0ID0gMDsKPj4gKwl1MzIgcmVnOwo+PiArCj4+ICsJcHRyID0gbmZj LT5yZWdzICsgbmZjLT5jZmctPmZsY3RsX29mZjsKPj4gKwo+PiArCXJldCA9IHJlYWRsX3JlbGF4 ZWRfcG9sbF90aW1lb3V0KHB0ciwgcmVnLAo+PiArCXJlZyAmIEZMQ1RMX1hGRVJfUkVBRFksCj4+ ICsJMTAsIE5GQ19USU1FT1VUKTsKPj4gKwo+PiArCXJldHVybiByZXQ7Cj4+ICt9Cj4+ICsKPj4g K3N0YXRpYyBpbnQgcmtfbmZjX3dyaXRlX3BhZ2VfcmF3KHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAs IGNvbnN0IHU4ICpidWYsCj4+ICsJaW50IG9vYl9vbiwgaW50IHBhZ2UpCj4+ICt7Cj4+ICsJc3Ry dWN0IG10ZF9pbmZvICptdGQgPSBuYW5kX3RvX210ZChjaGlwKTsKPj4gKwlzdHJ1Y3QgcmtfbmZj ICpuZmMgPSBuYW5kX2dldF9jb250cm9sbGVyX2RhdGEoY2hpcCk7Cj4+ICsJaW50IHJldCA9IDA7 Cj4+ICsJdTMyIGk7Cj4+ICsKPj4gKwlpZiAoIWJ1ZikKPj4gKwltZW1zZXQobmZjLT5idWZmZXIs IDB4ZmYsIG10ZC0+d3JpdGVzaXplICsgbXRkLT5vb2JzaXplKTsKPj4gKwo+PiArCWZvciAoaSA9 IDA7IGkgPCBjaGlwLT5lY2Muc3RlcHM7IGkrKykgewo+PiArCS8qIENvcHkgZGF0YSB0byBuZmMg YnVmZmVyLiAqLwo+PiArCWlmIChidWYpCj4+ICsJbWVtY3B5KHJrX25mY19kYXRhX3B0cihjaGlw LCBpKSwKPj4gKwnCoMKgwqDCoMKgwqAgbmFuZF9kYXRhX3B0cihjaGlwLCBidWYsIGkpLAo+PiAr CcKgwqDCoMKgwqDCoCBjaGlwLT5lY2Muc2l6ZSk7Cj4KPj4gKwkvKgo+PiArCSogVGhlIGZpcnN0 IGZvdXIgYnl0ZXMgb2YgT09CIGFyZSByZXNlcnZlZCBmb3IgdGhlCj4+ICsJKiBib290IFJPTS4g SW4gc29tZSBkZWJ1Z2dpbmcgY2FzZXMsIHN1c2ggYXMgZHVtcAo+Cj5zdWNoIGFzCj4KPj4gKwkq IGRhdGEgYW5kIHdyaXRlIGJhY2ssIHRoZSBsYXN0IGZvdXIgYnl0ZXMgc3RvcmVkCj4+ICsJKiBp biBPT0IgbmVlZCB0byBiZSB3cml0ZSBiYWNrLgo+Cj5zdWNoIGFzIHdpdGggYSByZWFkLCBlcmFz ZSBhbmQgd3JpdGUgYmFjayB0ZXN0Cj50aGVzZSA0IGJ5dGVzIHN0b3JlZCBpbiBPT0IgYWxzbyBu ZWVkIHRvIGJlIHdyaXR0ZW4gYmFjay4KPj4gKwkqLwo+PiArCWlmICghaSkKPj4gKwltZW1jcHko cmtfbmZjX29vYl9wdHIoY2hpcCwgaSksCj4+ICsJwqDCoMKgwqDCoMKgIG5hbmRfb29iX3B0cihj aGlwLCBjaGlwLT5lY2Muc3RlcHMgLSAxKSwKPj4gKwnCoMKgwqDCoMKgwqAgTkZDX1NZU19EQVRB X1NJWkUpOwo+PiArCWVsc2UKPj4gKwltZW1jcHkocmtfbmZjX29vYl9wdHIoY2hpcCwgaSksCj4+ ICsJwqDCoMKgwqDCoMKgIG5hbmRfb29iX3B0cihjaGlwLCBpIC0gMSksCj4+ICsJwqDCoMKgwqDC oMKgIE5GQ19TWVNfREFUQV9TSVpFKTsKPj4gKwkvKiBDb3B5IGVjYyBkYXRhIHRvIG5mYyBidWZm ZXIuICovCj4KPkNvcHkgRUNDIGRhdGEgdG8gdGhlIE5GQyBidWZmZXIuCj4+ICsJbWVtY3B5KHJr X25mY19vb2JfcHRyKGNoaXAsIGkpICsgTkZDX1NZU19EQVRBX1NJWkUsCj4+ICsJwqDCoMKgwqDC oMKgIG5hbmRfb29iX2VjY19wdHIoY2hpcCwgaSksCj4+ICsJwqDCoMKgwqDCoMKgIGNoaXAtPmVj Yy5ieXRlcyk7Cj4+ICsJfQo+PiArCj4+ICsJbmFuZF9wcm9nX3BhZ2VfYmVnaW5fb3AoY2hpcCwg cGFnZSwgMCwgTlVMTCwgMCk7Cj4+ICsJcmtfbmZjX3dyaXRlX2J1ZihuZmMsIGJ1ZiwgbXRkLT53 cml0ZXNpemUgKyBtdGQtPm9vYnNpemUpOwo+PiArCXJldCA9IG5hbmRfcHJvZ19wYWdlX2VuZF9v cChjaGlwKTsKPj4gKwo+PiArCS8qCj4+ICsJKiBEZXNlbGVjdCB0aGUgY3VycmVudGx5IHNlbGVj dGVkIHRhcmdldCBhZnRlciBvcHMgZG9uZSwKPj4gKwkqIG90aGVyd2lzZSB0aGUgTkFORCBmbGFz aCB3aWxsIGhhcyBleHRyYSBwb3dlciBjb25zdW1wdGlvbi4KPgo+d2lsbCBoYXZlCj4KPm9yIHVz ZSBmb3IgZXhhbXBsZToKPgo+RGVzZWxlY3QgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0YXJnZXQg YWZ0ZXIgdGhlIG9wcyBpcyBkb25lCj50byByZWR1Y2UgdGhlIHBvd2VyIGNvbnN1bXB0aW9uLgo+ Cj4+ICsJKi8KPj4gKwlya19uZmNfc2VsZWN0X2NoaXAoY2hpcCwgLTEpOwo+PiArCj4+ICsJcmV0 dXJuIHJldDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCBya19uZmNfd3JpdGVfb29iKHN0cnVj dCBuYW5kX2NoaXAgKmNoaXAsIGludCBwYWdlKQo+PiArewo+PiArCXJldHVybiBya19uZmNfd3Jp dGVfcGFnZV9yYXcoY2hpcCwgTlVMTCwgMSwgcGFnZSk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBp bnQgcmtfbmZjX3dyaXRlX3BhZ2VfaHdlY2Moc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgY29uc3Qg dTggKmJ1ZiwKPj4gKwnCoMKgIGludCBvb2Jfb24sIGludCBwYWdlKQo+PiArewo+PiArCXN0cnVj dCBtdGRfaW5mbyAqbXRkID0gbmFuZF90b19tdGQoY2hpcCk7Cj4+ICsJc3RydWN0IHJrX25mYyAq bmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+PiArCXN0cnVjdCBya19uZmNf bmFuZF9jaGlwICpya25hbmQgPSB0b19ya25hbmQoY2hpcCk7Cj4+ICsJc3RydWN0IG5hbmRfZWNj X2N0cmwgKmVjYyA9ICZjaGlwLT5lY2M7Cj4+ICsJaW50IG9vYl9zdGVwID0gKGVjYy0+Ynl0ZXMg PiA2MCkgPyBORkNfTUFYX09PQl9QRVJfU1RFUCA6Cj4+ICsJTkZDX01JTl9PT0JfUEVSX1NURVA7 Cj4+ICsJaW50IHBhZ2VzX3Blcl9ibGsgPSBtdGQtPmVyYXNlc2l6ZSAvIG10ZC0+d3JpdGVzaXpl Owo+PiArCWludCByZXQgPSAwLCBpLCBib290X3JvbV9tb2RlID0gMDsKPj4gKwlkbWFfYWRkcl90 IGRtYV9kYXRhLCBkbWFfb29iOwo+PiArCXUzMiByZWc7Cj4+ICsJdTggKm9vYjsKPj4gKwo+PiAr CW5hbmRfcHJvZ19wYWdlX2JlZ2luX29wKGNoaXAsIHBhZ2UsIDAsIE5VTEwsIDApOwo+PiArCj4+ ICsJbWVtY3B5KG5mYy0+cGFnZV9idWYsIGJ1ZiwgbXRkLT53cml0ZXNpemUpOwo+PiArCj4+ICsJ LyoKPj4gKwkqIFRoZSBmaXJzdCBibG9ja3MgKDQsIDggb3IgMTYgZGVwZW5kaW5nIG9uIHRoZSBk ZXZpY2UpIGFyZSB1c2VkCj4+ICsJKiBieSB0aGUgYm9vdCBST00gYW5kIHRoZSBmaXJzdCAzMiBi aXRzIG9mIG9vYiBuZWVkIHRvIGxpbmsgdG8KPgo+T09CCj4KPj4gKwkqIHRoZSBuZXh0IHBhZ2Ug YWRkcmVzcyBpbiB0aGUgc2FtZSBibG9jay4KPgo+QWRkIG1vcmUgZXhwbGFuYXRpb24gd2h5Ogo+ Cj5XZSBjYW4ndCBjb3B5IE9PQiBkaXJlY3RseSwKPmJlY2F1c2UgdGhpcyBwYWdlIGFkZHJlc3Mg Y29uZmxpY3RzIHdpdGggdGhlIGJhZCBibG9jayBtYXJrZXIgKEJCTSksCj5zbyB3ZSBzaGlmdCBh bGwgT09CIGluY2x1ZGluZyB0aGUgQkJNIHdpdGggNCBieXRlIHBvc2l0aW9ucy4KPkFzIGNvbnNl cXVlbmNlIHRoZSBPT0Igc2l6ZSB0aGVuIGlzIGFsc28gcmVkdWNlZCB3aXRoIDQgYnl0ZXMuCj4K PlBBMMKgIFBBMcKgIFBBMsKgIFBBM8KgIHwgQkJNIE9PQjEgT09CMiBPT0IzIHwgLi4uCj4KPklm IGEgTkFORCBpcyBub3QgYSBib290IG1lZGl1bSB0aGUgZmlyc3QgNCBieXRlcyBhcmUgbGVmdCB1 bnRvdWNoZWQKPmJ5IHdyaXRpbmcgMHhGRiB0byB0aGVtLgo+Cj4weEZGIDB4RkYgMHhGRiAweEZG IHwgQkJNIE9PQjEgT09CMiBPT0IzIHwgLi4uCj4KPgo+Q291bGQgeW91IGluY2x1ZGUgdGhlIGFi b3ZlIGxheW91dCB0byBtYWtlIHRoaW5ncyBtb3JlIGNsZWFyPwo+Cj4+ICsJKiBDb25maWcgdGhl IEVDQyBhbGdvcml0aG0gc3VwcG9ydGVkIGJ5IHRoZSBib290IFJPTS4KPgo+Y29tbWVudCBieSBN aXF1w6hsOgo+Cj5zL0NvbmZpZy9Db25maWd1cmUvCgptb2RpZmllZCwgcGxlYXNlIGNoZWNrIGFn YWluLi4uCi8qCsKgKiBUaGUgZmlyc3QgYmxvY2tzICg0LCA4IG9yIDE2IGRlcGVuZGluZyBvbiB0 aGUgZGV2aWNlKSBhcmUgdXNlZArCoCogYnkgdGhlIGJvb3QgUk9NIGFuZCB0aGUgZmlyc3QgMzIg Yml0cyBvZiBPT0IgbmVlZCB0byBsaW5rIHRvCsKgKiB0aGUgbmV4dCBwYWdlIGFkZHJlc3MgaW4g dGhlIHNhbWUgYmxvY2suIFdlIGNhbid0IGNvcHkgT09CCsKgKiBkaXJlY3RseSwgYmVjYXVzZSB0 aGlzIHBhZ2UgYWRkcmVzcyBjb25mbGljdHMgd2l0aCB0aGUgYmFkIGJsb2NrCsKgKiBtYXJrZXIg KEJCTSksIHNvIHdlIHNoaWZ0IGFsbCBPT0IgaW5jbHVkaW5nIHRoZSBCQk0gd2l0aCA0IGJ5dGUK wqAqIHBvc2l0aW9ucy4gQXMgY29uc2VxdWVuY2UgdGhlIE9PQiBzaXplIHRoZW4gaXMgYWxzbyBy ZWR1Y2VkIHdpdGgKwqAqIDQgYnl0ZXMuCsKgKiDCoCBQQTAgUEExIFBBMiBQQTMgfCBCQk0gT09C MSBPT0IyIE9PQjMgfCAuLi4KwqAqIElmIGEgTkFORCBpcyBub3QgYSBib290IG1lZGl1bSwgdGhl IGZpcnN0IDQgYnl0ZXMgYXJlIGxlZnQgdW50b3VjaGVkCsKgKiBieSB3cml0aW5nIDB4RkYgdG8g dGhlbS4KwqAqIMKgIDB4RkYgMHhGRiAweEZGIDB4RkYgfCBCQk0gT09CMSBPT0IyIE9PQjMgfCAu Li4KwqAqLwoKPgo+PiArCSovCj4+ICsJaWYgKChwYWdlIDwgcGFnZXNfcGVyX2JsayAqIHJrbmFu ZC0+Ym9vdF9ibGtzKSAmJgo+PiArCcKgwqDCoCAoY2hpcC0+b3B0aW9ucyAmIE5BTkRfSVNfQk9P VF9NRURJVU0pKSB7Cj4+ICsJYm9vdF9yb21fbW9kZSA9IDE7Cj4+ICsJaWYgKHJrbmFuZC0+Ym9v dF9lY2MgIT0gZWNjLT5zdHJlbmd0aCkKPj4gKwlya19uZmNfaHdfZWNjX3NldHVwKGNoaXAsIGVj YywKPj4gKwnCoMKgwqAgcmtuYW5kLT5ib290X2VjYyk7Cj4+ICsJfQo+PiArCj4+ICsJZm9yIChp ID0gMDsgaSA8IGVjYy0+c3RlcHM7IGkrKykgewo+PiArCWlmICghaSkgewo+PiArCXJlZyA9IDB4 RkZGRkZGRkY7Cj4+ICsJfSBlbHNlIHsKPj4gKwlvb2IgPSBjaGlwLT5vb2JfcG9pICsgKGkgLSAx KSAqIE5GQ19TWVNfREFUQV9TSVpFOwo+PiArCXJlZyA9IG9vYlswXSB8IG9vYlsxXSA8PCA4IHwg b29iWzJdIDw8IDE2IHwKPj4gKwnCoMKgwqDCoMKgIG9vYlszXSA8PCAyNDsKPj4gKwl9Cj4+ICsJ aWYgKCFpICYmIGJvb3Rfcm9tX21vZGUpCj4+ICsJcmVnID0gKHBhZ2UgJiAocGFnZXNfcGVyX2Js ayAtIDEpKSAqIDQ7Cj4+ICsKPj4gKwlpZiAobmZjLT5jZmctPnR5cGUgPT0gTkZDX1Y5KQo+PiAr CW5mYy0+b29iX2J1ZltpXSA9IHJlZzsKPj4gKwllbHNlCj4+ICsJbmZjLT5vb2JfYnVmW2kgKiBv b2Jfc3RlcCAvIDRdID0gcmVnOwo+Cj5QbGVhc2UgdXNlIGJyYWNrZXRzLgoKSSBkb24ndCB1bmRl cnN0YW5kIHRoaXMuIENhbiB5b3UgZ2l2ZSBhbiBleGFtcGxlIG9mIGhvdyB0byBtb2RpZnkgaXQ/ Cgo+PiArCX0KPj4gKwo+PiArCWRtYV9kYXRhID0gZG1hX21hcF9zaW5nbGUobmZjLT5kZXYsICh2 b2lkICopbmZjLT5wYWdlX2J1ZiwKPgo+RG8geW91IG5lZWQgdGhpcyBjYXN0PwoKWWVzLCBuZWVk IGRtYV9tYXBfc2luZ2xlIHRvIGdldCBwaHlfYWRkciBhbmQgZG8gY2FjaGUgb3BzLgoKPj4gKwnC oCBtdGQtPndyaXRlc2l6ZSwgRE1BX1RPX0RFVklDRSk7Cj4+ICsJZG1hX29vYiA9IGRtYV9tYXBf c2luZ2xlKG5mYy0+ZGV2LCBuZmMtPm9vYl9idWYsCj4+ICsJZWNjLT5zdGVwcyAqIG9vYl9zdGVw LAo+PiArCURNQV9UT19ERVZJQ0UpOwo+PiArCj4+ICsJcmVpbml0X2NvbXBsZXRpb24oJm5mYy0+ ZG9uZSk7Cj4+ICsJd3JpdGVsKElOVF9ETUEsIG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5pbnRfZW5f b2ZmKTsKPj4gKwo+PiArCXJrX25mY194ZmVyX3N0YXJ0KG5mYywgTkZDX1dSSVRFLCBlY2MtPnN0 ZXBzLCBkbWFfZGF0YSwKPj4gKwnCoCBkbWFfb29iKTsKPj4gKwlyZXQgPSB3YWl0X2Zvcl9jb21w bGV0aW9uX3RpbWVvdXQoJm5mYy0+ZG9uZSwKPj4gKwnCoCBtc2Vjc190b19qaWZmaWVzKDEwMCkp Owo+PiArCWlmICghcmV0KQo+PiArCWRldl93YXJuKG5mYy0+ZGV2LCAid3JpdGU6IHdhaXQgZG1h IGRvbmUgdGltZW91dC5cbiIpOwo+PiArCS8qCj4+ICsJKiBXaGV0aGVyIHRoZSBETUEgdHJhbnNm ZXIgaXMgY29tcGxldGVkIG9yIG5vdC4gVGhlIGRyaXZlcgo+PiArCSogbmVlZHMgdG8gY2hlY2sg dGhlIE5GQ2BzIHN0YXR1cyByZWdpc3RlciB0byBzZWUgaWYgdGhlIGRhdGEKPj4gKwkqIHRyYW5z ZmVyIHdhcyBjb21wbGV0ZWQuCj4+ICsJKi8KPj4gKwlyZXQgPSBya19uZmNfd2FpdF9mb3JfeGZl cl9kb25lKG5mYyk7Cj4+ICsKPj4gKwlkbWFfdW5tYXBfc2luZ2xlKG5mYy0+ZGV2LCBkbWFfZGF0 YSwgbXRkLT53cml0ZXNpemUsCj4+ICsJRE1BX1RPX0RFVklDRSk7Cj4+ICsJZG1hX3VubWFwX3Np bmdsZShuZmMtPmRldiwgZG1hX29vYiwgZWNjLT5zdGVwcyAqIG9vYl9zdGVwLAo+PiArCURNQV9U T19ERVZJQ0UpOwo+PiArCj4+ICsJaWYgKGJvb3Rfcm9tX21vZGUgJiYgcmtuYW5kLT5ib290X2Vj YyAhPSBlY2MtPnN0cmVuZ3RoKQo+PiArCXJrX25mY19od19lY2Nfc2V0dXAoY2hpcCwgZWNjLCBl Y2MtPnN0cmVuZ3RoKTsKPj4gKwo+PiArCWlmIChyZXQpIHsKPj4gKwlyZXQgPSAtRUlPOwo+PiAr CWRldl9lcnIobmZjLT5kZXYsCj4+ICsJIndyaXRlOiB3YWl0IHRyYW5zZmVyIGRvbmUgdGltZW91 dC5cbiIpOwo+PiArCX0KPj4gKwo+PiArCWlmIChyZXQpCj4+ICsJcmV0dXJuIHJldDsKPj4gKwo+ PiArCXJldCA9IG5hbmRfcHJvZ19wYWdlX2VuZF9vcChjaGlwKTsKPj4gKwo+PiArCS8qCj4+ICsJ KiBEZXNlbGVjdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRhcmdldCBhZnRlciBvcHMgZG9uZSwK Pgo+PiArCSogb3RoZXJ3aXNlIHRoZSBOQU5EIGZsYXNoIHdpbGwgaGFzIGV4dHJhIHBvd2VyIGNv bnN1bXB0aW9uLgo+Cj53aWxsIGhhdmUKPgo+b3IgdXNlIGZvciBleGFtcGxlOgo+Cj5EZXNlbGVj dCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRhcmdldCBhZnRlciB0aGUgb3BzIGlzIGRvbmUKPnRv IHJlZHVjZSB0aGUgcG93ZXIgY29uc3VtcHRpb24uCj4+ICsJKi8KPj4gKwlya19uZmNfc2VsZWN0 X2NoaXAoY2hpcCwgLTEpOwo+PiArCj4+ICsJcmV0dXJuIHJldDsKPj4gK30KPj4gKwo+PiArc3Rh dGljIGludCBya19uZmNfcmVhZF9wYWdlX3JhdyhzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCB1OCAq YnVmLCBpbnQKPm9vYl9vbiwKPj4gKwlpbnQgcGFnZSkKPj4gK3sKPj4gKwlzdHJ1Y3QgbXRkX2lu Zm8gKm10ZCA9IG5hbmRfdG9fbXRkKGNoaXApOwo+PiArCXN0cnVjdCBya19uZmMgKm5mYyA9IG5h bmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShjaGlwKTsKPj4gKwlpbnQgaTsKPj4gKwo+PiArCW5hbmRf cmVhZF9wYWdlX29wKGNoaXAsIHBhZ2UsIDAsIE5VTEwsIDApOwo+PiArCXJrX25mY19yZWFkX2J1 ZihuZmMsIG5mYy0+YnVmZmVyLCBtdGQtPndyaXRlc2l6ZSArIG10ZC0+b29ic2l6ZSk7Cj4+ICsK Pj4gKwkvKgo+PiArCSogRGVzZWxlY3QgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0YXJnZXQgYWZ0 ZXIgb3BzIGRvbmUsCj4KPj4gKwkqIG90aGVyd2lzZSB0aGUgTkFORCBmbGFzaCB3aWxsIGhhcyBl eHRyYSBwb3dlciBjb25zdW1wdGlvbi4KPgo+d2lsbCBoYXZlCj4KPm9yIHVzZSBmb3IgZXhhbXBs ZToKPgo+RGVzZWxlY3QgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0YXJnZXQgYWZ0ZXIgdGhlIG9w cyBpcyBkb25lCj50byByZWR1Y2UgdGhlIHBvd2VyIGNvbnN1bXB0aW9uLgo+PiArCSovCj4+ICsJ cmtfbmZjX3NlbGVjdF9jaGlwKGNoaXAsIC0xKTsKPj4gKwo+PiArCWZvciAoaSA9IDA7IGkgPCBj aGlwLT5lY2Muc3RlcHM7IGkrKykgewo+Cj4+ICsJLyoKPj4gKwkqIFRoZSBmaXJzdCBmb3VyIGJ5 dGVzIG9mIE9PQiBhcmUgcmVzZXJ2ZWQgZm9yIHRoZQo+PiArCSogYm9vdCBST00uIEluIHNvbWUg ZGVidWdnaW5nIGNhc2VzLCBzdXNoIGFzIGR1bXAgZGF0YQo+Cj5zdWNoIGFzCj4KPj4gKwkqIGFu ZCB3cml0ZSBiYWNrLCBpdGBzIG5lZWQgdG8gcmVhZCBvdXQgdGhpcyBmb3VyIGJ5dGVzLAo+Cj5z dWNoIGFzIHdpdGggYSByZWFkLCBlcmFzZSBhbmQgd3JpdGUgYmFjayB0ZXN0Cj50aGVzZSA0IGJ5 dGVzIGFsc28gbXVzdCBiZSBzYXZlZCBzb21ld2hlcmUsCj4KPj4gKwkqIG90aGVyd2lzZSB0aGlz IGluZm9ybWF0aW9uIHdpbGwgYmUgbG9zdCBkdXJpbmcgd3JpdGUgYmFjay4KPgo+b3RoZXJ3aXNl IHRoaXMgaW5mb3JtYXRpb24gd2lsbCBiZSBsb3N0IGR1cmluZyBhIHdyaXRlIGJhY2suCj4+ICsJ Ki8KPj4gKwlpZiAoIWkpCj4+ICsJbWVtY3B5KG5hbmRfb29iX3B0cihjaGlwLCBjaGlwLT5lY2Mu c3RlcHMgLSAxKSwKPj4gKwnCoMKgwqDCoMKgwqAgcmtfbmZjX29vYl9wdHIoY2hpcCwgaSksCj4+ ICsJwqDCoMKgwqDCoMKgIE5GQ19TWVNfREFUQV9TSVpFKTsKPj4gKwllbHNlCj4+ICsJbWVtY3B5 KG5hbmRfb29iX3B0cihjaGlwLCBpIC0gMSksCj4+ICsJwqDCoMKgwqDCoMKgIHJrX25mY19vb2Jf cHRyKGNoaXAsIGkpLAo+PiArCcKgwqDCoMKgwqDCoCBORkNfU1lTX0RBVEFfU0laRSk7Cj4KPj4g KwkvKiBDb3B5IGVjYyBkYXRhIGZvcm0gbmZjIGJ1ZmZlci4gKi8KPgo+Q29weSBFQ0MgZGF0YSBm cm9tIHRoZSBORkMgYnVmZmVyLgo+PiArCW1lbWNweShuYW5kX29vYl9lY2NfcHRyKGNoaXAsIGkp LAo+PiArCcKgwqDCoMKgwqDCoCBya19uZmNfb29iX3B0cihjaGlwLCBpKSArIE5GQ19TWVNfREFU QV9TSVpFLAo+PiArCcKgwqDCoMKgwqDCoCBjaGlwLT5lY2MuYnl0ZXMpOwo+Cj4+ICsJLyogQ29w eSBkYXRhIGZvcm0gbmZjIGJ1ZmZlci4gKi8KPgo+Q29weSBkYXRhIGZyb20gdGhlIE5GQyBidWZm ZXIuCj4+ICsJaWYgKGJ1ZikKPj4gKwltZW1jcHkobmFuZF9kYXRhX3B0cihjaGlwLCBidWYsIGkp LAo+PiArCcKgwqDCoMKgwqDCoCBya19uZmNfZGF0YV9wdHIoY2hpcCwgaSksCj4+ICsJwqDCoMKg wqDCoMKgIGNoaXAtPmVjYy5zaXplKTsKPj4gKwl9Cj4+ICsKPj4gKwlyZXR1cm4gMDsKPj4gK30K Pj4gKwo+PiArc3RhdGljIGludCBya19uZmNfcmVhZF9vb2Ioc3RydWN0IG5hbmRfY2hpcCAqY2hp cCwgaW50IHBhZ2UpCj4+ICt7Cj4+ICsJcmV0dXJuIHJrX25mY19yZWFkX3BhZ2VfcmF3KGNoaXAs IE5VTEwsIDEsIHBhZ2UpOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IHJrX25mY19yZWFkX3Bh Z2VfaHdlY2Moc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgdTggKmJ1ZiwKPmludCBvb2Jfb24sCj4+ ICsJwqAgaW50IHBhZ2UpCj4+ICt7Cj4+ICsJc3RydWN0IG10ZF9pbmZvICptdGQgPSBuYW5kX3Rv X210ZChjaGlwKTsKPj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBuYW5kX2dldF9jb250cm9sbGVy X2RhdGEoY2hpcCk7Cj4+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZCA9IHRvX3Jr bmFuZChjaGlwKTsKPj4gKwlzdHJ1Y3QgbmFuZF9lY2NfY3RybCAqZWNjID0gJmNoaXAtPmVjYzsK Pj4gKwlpbnQgb29iX3N0ZXAgPSAoZWNjLT5ieXRlcyA+IDYwKSA/IE5GQ19NQVhfT09CX1BFUl9T VEVQIDoKPj4gKwlORkNfTUlOX09PQl9QRVJfU1RFUDsKPj4gKwlpbnQgcGFnZXNfcGVyX2JsayA9 IG10ZC0+ZXJhc2VzaXplIC8gbXRkLT53cml0ZXNpemU7Cj4+ICsJZG1hX2FkZHJfdCBkbWFfZGF0 YSwgZG1hX29vYjsKPj4gKwlpbnQgcmV0ID0gMCwgaSwgYm9vdF9yb21fbW9kZSA9IDA7Cj4+ICsJ aW50IGJpdGZsaXBzID0gMCwgYmNoX3N0Owo+PiArCXU4ICpvb2I7Cj4+ICsJdTMyIHRtcDsKPj4g Kwo+PiArCW5hbmRfcmVhZF9wYWdlX29wKGNoaXAsIHBhZ2UsIDAsIE5VTEwsIDApOwo+PiArCj4+ ICsJZG1hX2RhdGEgPSBkbWFfbWFwX3NpbmdsZShuZmMtPmRldiwgbmZjLT5wYWdlX2J1ZiwKPj4g KwnCoCBtdGQtPndyaXRlc2l6ZSwKPj4gKwnCoCBETUFfRlJPTV9ERVZJQ0UpOwo+PiArCWRtYV9v b2IgPSBkbWFfbWFwX3NpbmdsZShuZmMtPmRldiwgbmZjLT5vb2JfYnVmLAo+PiArCWVjYy0+c3Rl cHMgKiBvb2Jfc3RlcCwKPj4gKwlETUFfRlJPTV9ERVZJQ0UpOwo+PiArCj4+ICsJLyoKPj4gKwkq IFRoZSBmaXJzdCBibG9ja3MgKDQsIDggb3IgMTYgZGVwZW5kaW5nIG9uIHRoZSBkZXZpY2UpCj4+ ICsJKiBhcmUgdXNlZCBieSB0aGUgYm9vdCBST00uCj4+ICsJKiBDb25maWcgdGhlIEVDQyBhbGdv cml0aG0gc3VwcG9ydGVkIGJ5IHRoZSBib290IFJPTS4KPj4gKwkqLwo+PiArCWlmICgocGFnZSA8 IHBhZ2VzX3Blcl9ibGsgKiBya25hbmQtPmJvb3RfYmxrcykgJiYKPj4gKwnCoMKgwqAgKGNoaXAt Pm9wdGlvbnMgJiBOQU5EX0lTX0JPT1RfTUVESVVNKSkgewo+PiArCWJvb3Rfcm9tX21vZGUgPSAx Owo+PiArCWlmIChya25hbmQtPmJvb3RfZWNjICE9IGVjYy0+c3RyZW5ndGgpCj4+ICsJcmtfbmZj X2h3X2VjY19zZXR1cChjaGlwLCBlY2MsCj4+ICsJwqDCoMKgIHJrbmFuZC0+Ym9vdF9lY2MpOwo+ PiArCX0KPj4gKwo+PiArCXJlaW5pdF9jb21wbGV0aW9uKCZuZmMtPmRvbmUpOwo+PiArCXdyaXRl bChJTlRfRE1BLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+aW50X2VuX29mZik7Cj4+ICsJcmtfbmZj X3hmZXJfc3RhcnQobmZjLCBORkNfUkVBRCwgZWNjLT5zdGVwcywgZG1hX2RhdGEsCj4+ICsJwqAg ZG1hX29vYik7Cj4+ICsJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZuZmMtPmRv bmUsCj4+ICsJwqAgbXNlY3NfdG9famlmZmllcygxMDApKTsKPj4gKwlpZiAoIXJldCkKPj4gKwlk ZXZfd2FybihuZmMtPmRldiwgInJlYWQ6IHdhaXQgZG1hIGRvbmUgdGltZW91dC5cbiIpOwo+PiAr CS8qCj4+ICsJKiBXaGV0aGVyIHRoZSBETUEgdHJhbnNmZXIgaXMgY29tcGxldGVkIG9yIG5vdC4g VGhlIGRyaXZlcgo+PiArCSogbmVlZHMgdG8gY2hlY2sgdGhlIE5GQ2BzIHN0YXR1cyByZWdpc3Rl ciB0byBzZWUgaWYgdGhlIGRhdGEKPj4gKwkqIHRyYW5zZmVyIHdhcyBjb21wbGV0ZWQuCj4+ICsJ Ki8KPj4gKwlyZXQgPSBya19uZmNfd2FpdF9mb3JfeGZlcl9kb25lKG5mYyk7Cj4+ICsJZG1hX3Vu bWFwX3NpbmdsZShuZmMtPmRldiwgZG1hX2RhdGEsIG10ZC0+d3JpdGVzaXplLAo+PiArCURNQV9G Uk9NX0RFVklDRSk7Cj4+ICsJZG1hX3VubWFwX3NpbmdsZShuZmMtPmRldiwgZG1hX29vYiwgZWNj LT5zdGVwcyAqIG9vYl9zdGVwLAo+PiArCURNQV9GUk9NX0RFVklDRSk7Cj4+ICsKPj4gKwlpZiAo cmV0KSB7Cj4+ICsJYml0ZmxpcHMgPSAtRUlPOwo+PiArCWRldl9lcnIobmZjLT5kZXYsCj4+ICsJ InJlYWQ6IHdhaXQgdHJhbnNmZXIgZG9uZSB0aW1lb3V0LlxuIik7Cj4+ICsJZ290byBvdXQ7Cj4+ ICsJfQo+PiArCj4+ICsJZm9yIChpID0gMTsgaSA8IGVjYy0+c3RlcHM7IGkrKykgewo+PiArCW9v YiA9IGNoaXAtPm9vYl9wb2kgKyAoaSAtIDEpICogTkZDX1NZU19EQVRBX1NJWkU7Cj4+ICsJaWYg KG5mYy0+Y2ZnLT50eXBlID09IE5GQ19WOSkKPj4gKwl0bXAgPSBuZmMtPm9vYl9idWZbaV07Cj4+ ICsJZWxzZQo+PiArCXRtcCA9IG5mYy0+b29iX2J1ZltpICogb29iX3N0ZXAgLyA0XTsKPj4gKwkq b29iKysgPSAodTgpdG1wOwo+PiArCSpvb2IrKyA9ICh1OCkodG1wID4+IDgpOwo+PiArCSpvb2Ir KyA9ICh1OCkodG1wID4+IDE2KTsKPj4gKwkqb29iKysgPSAodTgpKHRtcCA+PiAyNCk7Cj4+ICsJ fQo+PiArCj4+ICsJZm9yIChpID0gMDsgaSA8IGVjYy0+c3RlcHMgLyAyOyBpKyspIHsKPgo+QnJh Y2tldHMgaGVyZSBhcyB3ZWxsIHBsZWFzZQoKSSBkb24ndCB1bmRlcnN0YW5kIHRoaXMuIENhbiB5 b3UgZ2l2ZSBhbiBleGFtcGxlIG9mIGhvdyB0byBtb2RpZnkgaXQ/Cgo+PiArCWJjaF9zdCA9IHJl YWRsX3JlbGF4ZWQobmZjLT5yZWdzICsKPj4gKwnCoMKgwqDCoMKgwqAgbmZjLT5jZmctPmJjaF9z dF9vZmYgKyBpICogNCk7Cj4+ICsJaWYgKGJjaF9zdCAmIEJJVChuZmMtPmNmZy0+ZWNjMC5lcnJf ZmxhZ19iaXQpIHx8Cj4+ICsJwqDCoMKgIGJjaF9zdCAmIEJJVChuZmMtPmNmZy0+ZWNjMS5lcnJf ZmxhZ19iaXQpKSB7Cj4+ICsJbXRkLT5lY2Nfc3RhdHMuZmFpbGVkKys7Cj4+ICsJLyogRUNDIGZh aWxlZCwgcmV0dXJuIHRoZSBtaW5pbXVtIG51bWJlciBvZiBlcnJvciBiaXRzICovCj4+ICsJYml0 ZmxpcHMgPSBlY2MtPnN0cmVuZ3RoICsgMTsKPgo+Q291bGQgeW91IGV4cGxhaW4gd2h5Ogo+Cj5i aXRmbGlwcyA9IC0xOwo+Cj5jaGFuZ2VkIHRvOgo+Cj5iaXRmbGlwcyA9IGVjYy0+c3RyZW5ndGgg KyAxOwo+Cj4KPkNvbW1lbnQgYnkgTWlxdcOobDoKPgo+SSB0aGluayB5b3Ugc2hvdWxkIHJldHVy biAwLgo+Cj5UaGVuIHRoZSB1cHBlciBsYXllciB3aWxsIGNoZWNrIGZvciBmYWlsdXJlcy4KPgo+ PiArCX0gZWxzZSB7Cj4+ICsJcmV0ID0gRUNDX0VSUl9DTlQoYmNoX3N0LCBuZmMtPmNmZy0+ZWNj MCk7Cj4+ICsJbXRkLT5lY2Nfc3RhdHMuY29ycmVjdGVkICs9IHJldDsKPj4gKwliaXRmbGlwcyA9 IG1heF90KHUzMiwgYml0ZmxpcHMsIHJldCk7Cj4+ICsKPj4gKwlyZXQgPSBFQ0NfRVJSX0NOVChi Y2hfc3QsIG5mYy0+Y2ZnLT5lY2MxKTsKPj4gKwltdGQtPmVjY19zdGF0cy5jb3JyZWN0ZWQgKz0g cmV0Owo+PiArCWJpdGZsaXBzID0gbWF4X3QodTMyLCBiaXRmbGlwcywgcmV0KTsKPj4gKwl9Cj4+ ICsJfQo+PiArb3V0Ogo+PiArCW1lbWNweShidWYsIG5mYy0+cGFnZV9idWYsIG10ZC0+d3JpdGVz aXplKTsKPj4gKwo+PiArCWlmIChib290X3JvbV9tb2RlICYmIHJrbmFuZC0+Ym9vdF9lY2MgIT0g ZWNjLT5zdHJlbmd0aCkKPj4gKwlya19uZmNfaHdfZWNjX3NldHVwKGNoaXAsIGVjYywgZWNjLT5z dHJlbmd0aCk7Cj4+ICsKPj4gKwlpZiAoYml0ZmxpcHMgPiBlY2MtPnN0cmVuZ3RoKQo+PiArCWRl dl9lcnIobmZjLT5kZXYsICJyZWFkIHBhZ2U6ICV4IGVjYyBlcnJvciFcbiIsIHBhZ2UpOwo+PiAr Cj4+ICsJLyoKPj4gKwkqIERlc2VsZWN0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGFyZ2V0IGFm dGVyIG9wcyBkb25lLAo+Cj4+ICsJKiBvdGhlcndpc2UgdGhlIE5BTkQgZmxhc2ggd2lsbCBoYXMg ZXh0cmEgcG93ZXIgY29uc3VtcHRpb24uCj4KPndpbGwgaGF2ZQo+Cj5vciB1c2UgZm9yIGV4YW1w bGU6Cj4KPkRlc2VsZWN0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGFyZ2V0IGFmdGVyIHRoZSBv cHMgaXMgZG9uZQo+dG8gcmVkdWNlIHRoZSBwb3dlciBjb25zdW1wdGlvbi4KPgo+PiArCSovCj4+ ICsJcmtfbmZjX3NlbGVjdF9jaGlwKGNoaXAsIC0xKTsKPj4gKwo+PiArCXJldHVybiBiaXRmbGlw czsKPj4gK30KPj4gKwo+PiArc3RhdGljIGlubGluZSB2b2lkIHJrX25mY19od19pbml0KHN0cnVj dCBya19uZmMgKm5mYykKPj4gK3sKPj4gKwkvKiBEaXNhYmxlIGZsYXNoIHdwLiAqLwo+PiArCXdy aXRlbChGTUNUTF9XUCwgbmZjLT5yZWdzICsgTkZDX0ZNQ1RMKTsKPj4gKwkvKiBDb25maWcgZGVm YXVsdCB0aW1pbmcgNDBucyBhdCAxNTAgTWh6IG5mYyBjbG9jay4gKi8KPj4gKwl3cml0ZWwoMHgx MDgxLCBuZmMtPnJlZ3MgKyBORkNfRk1XQUlUKTsKPj4gKwkvKiBEaXNhYmxlIHJhbmRvbWl6ZXIg YW5kIERNQS4gKi8KPj4gKwl3cml0ZWwoMCwgbmZjLT5yZWdzICsgbmZjLT5jZmctPnJhbmRtel9v ZmYpOwo+PiArCXdyaXRlbCgwLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ZG1hX2NmZ19vZmYpOwo+ PiArCXdyaXRlbChGTENUTF9SU1QsIG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5mbGN0bF9vZmYpOwo+ PiArfQo+PiArCj4+ICtzdGF0aWMgaXJxcmV0dXJuX3QgcmtfbmZjX2lycShpbnQgaXJxLCB2b2lk ICppZCkKPj4gK3sKPj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBpZDsKPj4gKwl1MzIgc3RhLCBp ZW47Cj4+ICsKPj4gKwlzdGEgPSByZWFkbF9yZWxheGVkKG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5p bnRfc3Rfb2ZmKTsKPj4gKwlpZW4gPSByZWFkbF9yZWxheGVkKG5mYy0+cmVncyArIG5mYy0+Y2Zn LT5pbnRfZW5fb2ZmKTsKPj4gKwo+PiArCWlmICghKHN0YSAmIGllbikpCj4+ICsJcmV0dXJuIElS UV9OT05FOwo+PiArCj4+ICsJd3JpdGVsKHN0YSwgbmZjLT5yZWdzICsgbmZjLT5jZmctPmludF9j bHJfb2ZmKTsKPj4gKwl3cml0ZWwofnN0YSAmIGllbiwgbmZjLT5yZWdzICsgbmZjLT5jZmctPmlu dF9lbl9vZmYpOwo+PiArCj4+ICsJY29tcGxldGUoJm5mYy0+ZG9uZSk7Cj4+ICsKPj4gKwlyZXR1 cm4gSVJRX0hBTkRMRUQ7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgcmtfbmZjX2VuYWJsZV9j bGsoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmtfbmZjICpuZmMpCj4KPkNoYW5nZSBmdW5j dGlvbiBuYW1lLCBiZWNhdXNlIHRoZXJlIGFyZSAyIGNsb2Nrcy4KPgo+X2Nsa3Mgd2l0aCBhbiBz IHRvIGluZm9ybSB0aGF0IHRoZXJlIGFyZSBzZXZlcmFsIG9mIHRoZW0uCj4KPl9jbGsgPT0+PiBf Y2xrcwo+Cj4+ICt7Cj4+ICsJaW50IHJldDsKPj4gKwo+PiArCWlmICghSVNfRVJSKG5mYy0+bmZj X2NsaykpIHsKPj4gKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUobmZjLT5uZmNfY2xrKTsKPj4g KwlpZiAocmV0KSB7Cj4+ICsJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZW5hYmxlIG5mYyBjbGtc biIpOwo+PiArCXJldHVybiByZXQ7Cj4+ICsJfQo+PiArCX0KPj4gKwo+PiArCXJldCA9IGNsa19w cmVwYXJlX2VuYWJsZShuZmMtPmFoYl9jbGspOwo+PiArCWlmIChyZXQpIHsKPj4gKwlkZXZfZXJy KGRldiwgImZhaWxlZCB0byBlbmFibGUgYWhiIGNsa1xuIik7Cj4+ICsJaWYgKCFJU19FUlIobmZj LT5uZmNfY2xrKSkKPj4gKwljbGtfZGlzYWJsZV91bnByZXBhcmUobmZjLT5uZmNfY2xrKTsKPj4g KwlyZXR1cm4gcmV0Owo+PiArCX0KPj4gKwo+PiArCXJldHVybiAwOwo+PiArfQo+PiArCj4+ICtz dGF0aWMgdm9pZCBya19uZmNfZGlzYWJsZV9jbGsoc3RydWN0IHJrX25mYyAqbmZjKQo+Cj5DaGFu Z2UgZnVuY3Rpb24gbmFtZSwgYmVjYXVzZSB0aGVyZSBhcmUgMiBjbG9ja3MuCj4KPmRpdHRvCj4K Pl9jbGsgPT0+PiBfY2xrcwo+Cj4+ICt7Cj4+ICsJaWYgKCFJU19FUlIobmZjLT5uZmNfY2xrKSkK Pj4gKwljbGtfZGlzYWJsZV91bnByZXBhcmUobmZjLT5uZmNfY2xrKTsKPj4gKwljbGtfZGlzYWJs ZV91bnByZXBhcmUobmZjLT5haGJfY2xrKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCBya19u ZmNfb29ibGF5b3V0X2ZyZWUoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBzZWN0aW9uLAo+PiAr CXN0cnVjdCBtdGRfb29iX3JlZ2lvbiAqb29iX3JlZ2lvbikKPj4gK3sKPj4gKwlzdHJ1Y3QgbmFu ZF9jaGlwICpjaGlwID0gbXRkX3RvX25hbmQobXRkKTsKPj4gKwlzdHJ1Y3QgcmtfbmZjX25hbmRf Y2hpcCAqcmtuYW5kID0gdG9fcmtuYW5kKGNoaXApOwo+PiArCj4+ICsJaWYgKHNlY3Rpb24pCj4+ ICsJcmV0dXJuIC1FUkFOR0U7Cj4+ICsKPj4gKwkvKgo+PiArCSogVGhlIGJlZ2lubmluZyBvZiB0 aGUgb29iIGFyZWEgc3RvcmVzIHRoZSByZXNlcnZlZCBkYXRhIGZvciB0aGUgTkZDLAo+Cj5PT0Ig YXJlYQo+Cj4+ICsJKiB0aGUgc2l6ZSBvZiB0aGUgcmVzZXJ2ZWQgZGF0YSBpcyBORkNfU1lTX0RB VEFfU0laRSBieXRlcy4KPj4gKwkqLwo+PiArCW9vYl9yZWdpb24tPmxlbmd0aCA9IHJrbmFuZC0+ bWV0YWRhdGFfc2l6ZSAtIE5GQ19TWVNfREFUQV9TSVpFIC0gMjsKPj4gKwlvb2JfcmVnaW9uLT5v ZmZzZXQgPSBORkNfU1lTX0RBVEFfU0laRSArIDI7Cj4+ICsKPj4gKwlyZXR1cm4gMDsKPj4gK30K Pj4gKwo+PiArc3RhdGljIGludCBya19uZmNfb29ibGF5b3V0X2VjYyhzdHJ1Y3QgbXRkX2luZm8g Km10ZCwgaW50IHNlY3Rpb24sCj4+ICsJc3RydWN0IG10ZF9vb2JfcmVnaW9uICpvb2JfcmVnaW9u KQo+PiArewo+PiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGRfdG9fbmFuZChtdGQpOwo+ PiArCXN0cnVjdCBya19uZmNfbmFuZF9jaGlwICpya25hbmQgPSB0b19ya25hbmQoY2hpcCk7Cj4+ ICsKPj4gKwlpZiAoc2VjdGlvbikKPj4gKwlyZXR1cm4gLUVSQU5HRTsKPj4gKwo+Cj4+ICsJb29i X3JlZ2lvbi0+b2Zmc2V0ID0gcmtuYW5kLT5tZXRhZGF0YV9zaXplOwo+PiArCW9vYl9yZWdpb24t Pmxlbmd0aCA9IG10ZC0+b29ic2l6ZSAtIG9vYl9yZWdpb24tPm9mZnNldDsKPgo+CW9vYl9yZWdp b24tPmxlbmd0aCA9IG10ZC0+b29ic2l6ZSAtIG9vYl9yZWdpb24tPm9mZnNldDsKPglvb2JfcmVn aW9uLT5vZmZzZXQgPSBya25hbmQtPm1ldGFkYXRhX3NpemU7Cj4KPktlZXAgbGVuZ3RoIGFuZCBv ZmZzZXQgaW4gdGhlIHNhbWUgc29ydCBvcmRlciBhcyBpbiBya19uZmNfb29ibGF5b3V0X2ZyZWUo KS4KCm1vZGlmaWVkOgpvb2JfcmVnaW9uLT5sZW5ndGggPSBtdGQtPm9vYnNpemUgLSBya25hbmQt Pm1ldGFkYXRhX3NpemU7Cm9vYl9yZWdpb24tPm9mZnNldCA9IHJrbmFuZC0+bWV0YWRhdGFfc2l6 ZTsKCj4+ICsKPj4gKwlyZXR1cm4gMDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGNvbnN0IHN0cnVj dCBtdGRfb29ibGF5b3V0X29wcyBya19uZmNfb29ibGF5b3V0X29wcyA9IHsKPj4gKwkuZnJlZSA9 IHJrX25mY19vb2JsYXlvdXRfZnJlZSwKPj4gKwkuZWNjID0gcmtfbmZjX29vYmxheW91dF9lY2Ms Cj4+ICt9Owo+PiArCj4+ICtzdGF0aWMgaW50IHJrX25mY19lY2NfaW5pdChzdHJ1Y3QgZGV2aWNl ICpkZXYsIHN0cnVjdCBtdGRfaW5mbyAqbXRkKQo+PiArewo+PiArCXN0cnVjdCBuYW5kX2NoaXAg KmNoaXAgPSBtdGRfdG9fbmFuZChtdGQpOwo+PiArCXN0cnVjdCBya19uZmMgKm5mYyA9IG5hbmRf Z2V0X2NvbnRyb2xsZXJfZGF0YShjaGlwKTsKPj4gKwlzdHJ1Y3QgbmFuZF9lY2NfY3RybCAqZWNj ID0gJmNoaXAtPmVjYzsKPj4gKwljb25zdCB1OCAqc3RyZW5ndGhzID0gbmZjLT5jZmctPmVjY19z dHJlbmd0aHM7Cj4+ICsJdTggbWF4X3N0cmVuZ3RoLCBuZmNfbWF4X3N0cmVuZ3RoOwo+PiArCWlu dCBpOwo+PiArCj4+ICsJbmZjX21heF9zdHJlbmd0aCA9IG5mYy0+Y2ZnLT5lY2Nfc3RyZW5ndGhz WzBdOwo+PiArCS8qIElmIG9wdGlvbmFsIGR0IHNldHRpbmdzIG5vdCBwcmVzZW50LiAqLwo+PiAr CWlmICghZWNjLT5zaXplIHx8ICFlY2MtPnN0cmVuZ3RoIHx8Cj4+ICsJwqDCoMKgIGVjYy0+c3Ry ZW5ndGggPiBuZmNfbWF4X3N0cmVuZ3RoKSB7Cj4+ICsJY2hpcC0+ZWNjLnNpemUgPSAxMDI0Owo+ PiArCWVjYy0+c3RlcHMgPSBtdGQtPndyaXRlc2l6ZSAvIGVjYy0+c2l6ZTsKPj4gKwo+PiArCS8q Cj4+ICsJKiBIVyBFQ0MgYWx3YXlzIHJlcXVlc3RzIHRoZSBudW1iZXIgb2YgRUNDIGJ5dGVzIHBl ciAxMDI0IGJ5dGUKPgo+PiArCSogYmxvY2tzLiA0IEJ5dGVzIGlzIG9vYiBmb3Igc3lzIGRhdGEu Cj4KPlRoZSBmaXJzdCA0IE9PQiBieXRlcyBhcmUgcmVzZXJ2ZWQgZm9yIHN5cyBkYXRhLgo+PiAr CSovCj4+ICsJbWF4X3N0cmVuZ3RoID0gKChtdGQtPm9vYnNpemUgLyBlY2MtPnN0ZXBzKSAtIDQp ICogOCAvCj4+ICsJZmxzKDggKiAxMDI0KTsKPj4gKwlpZiAobWF4X3N0cmVuZ3RoID4gbmZjX21h eF9zdHJlbmd0aCkKPj4gKwltYXhfc3RyZW5ndGggPSBuZmNfbWF4X3N0cmVuZ3RoOwo+PiArCj4+ ICsJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewo+PiArCWlmIChtYXhfc3RyZW5ndGggPj0gc3Ry ZW5ndGhzW2ldKQo+PiArCWJyZWFrOwo+PiArCX0KPj4gKwo+PiArCWlmIChpID49IDQpIHsKPj4g KwlkZXZfZXJyKG5mYy0+ZGV2LCAiVW5zdXBwb3J0ZWQgRUNDIHN0cmVuZ3RoXG4iKTsKPj4gKwly ZXR1cm4gLUVPUE5PVFNVUFA7Cj4+ICsJfQo+PiArCj4+ICsJZWNjLT5zdHJlbmd0aCA9IHN0cmVu Z3Roc1tpXTsKPj4gKwl9Cj4+ICsJZWNjLT5zdGVwcyA9IG10ZC0+d3JpdGVzaXplIC8gZWNjLT5z aXplOwo+PiArCWVjYy0+Ynl0ZXMgPSBESVZfUk9VTkRfVVAoZWNjLT5zdHJlbmd0aCAqIGZscyg4 ICogMTAyNCksIDgpOwo+PiArCS8qIEhXIEVDQyBhbHdheXMgd29yayB3aXRoIGV2ZW4gbnVtYmVy cyBvZiBFQ0MgYnl0ZXMuICovCj4+ICsJZWNjLT5ieXRlcyA9IEFMSUdOKGVjYy0+Ynl0ZXMsIDIp Owo+PiArCj4+ICsJcmtfbmZjX2h3X2VjY19zZXR1cChjaGlwLCBlY2MsIGVjYy0+c3RyZW5ndGgp Owo+PiArCj4+ICsJcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgcmtfbmZjX2F0 dGFjaF9jaGlwKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXApCj4+ICt7Cj4+ICsJc3RydWN0IG10ZF9p bmZvICptdGQgPSBuYW5kX3RvX210ZChjaGlwKTsKPj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBt dGQtPmRldi5wYXJlbnQ7Cj4+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJv bGxlcl9kYXRhKGNoaXApOwo+PiArCXN0cnVjdCBya19uZmNfbmFuZF9jaGlwICpya25hbmQgPSB0 b19ya25hbmQoY2hpcCk7Cj4+ICsJc3RydWN0IG5hbmRfZWNjX2N0cmwgKmVjYyA9ICZjaGlwLT5l Y2M7Cj4+ICsJdTggKnRlbXBfYnVmOwo+PiArCWludCBsZW4sIG9vYl9sZW47Cj4+ICsJaW50IHJl dDsKPj4gKwo+PiArCWlmIChjaGlwLT5vcHRpb25zICYgTkFORF9CVVNXSURUSF8xNikgewo+PiAr CWRldl9lcnIoZGV2LCAiMTYgYml0cyBidXMgd2lkdGggbm90IHN1cHBvcnRlZCIpOwo+PiArCXJl dHVybiAtRUlOVkFMOwo+PiArCX0KPj4gKwo+PiArCWlmIChlY2MtPmVuZ2luZV90eXBlICE9IE5B TkRfRUNDX0VOR0lORV9UWVBFX09OX0hPU1QpCj4+ICsJcmV0dXJuIDA7Cj4+ICsKPj4gKwlyZXQg PSBya19uZmNfZWNjX2luaXQoZGV2LCBtdGQpOwo+PiArCWlmIChyZXQpCj4+ICsJcmV0dXJuIHJl dDsKPj4gKwlya25hbmQtPnNwYXJlX3Blcl9zZWN0b3IgPSBlY2MtPmJ5dGVzICsgTkZDX1NZU19E QVRBX1NJWkU7Cj4+ICsJcmtuYW5kLT5tZXRhZGF0YV9zaXplID0gTkZDX1NZU19EQVRBX1NJWkUg KiBlY2MtPnN0ZXBzOwo+PiArCj4+ICsJaWYgKHJrbmFuZC0+bWV0YWRhdGFfc2l6ZSA8IE5GQ19T WVNfREFUQV9TSVpFICsgMikgewo+PiArCWRldl9lcnIoZGV2LAo+PiArCSJEcml2ZXIgbmVlZHMg YXQgbGVhc3QgJWQgYnl0ZXMgb2YgbWV0YSBkYXRhXG4iLAo+PiArCU5GQ19TWVNfREFUQV9TSVpF ICsgMik7Cj4+ICsJcmV0dXJuIC1FSU87Cj4+ICsJfQo+Cj4+ICsJbGVuID0gbXRkLT53cml0ZXNp emUgKyBtdGQtPm9vYnNpemU7Cj4KPj4gKwo+PiArCS8qIENoZWNrIGJ1ZmZlciBmaXJzdCwgYXZv aWQgZHVwbGljYXRlIGFsbG9jIGJ1ZmZlci4gKi8KPj4gKwlpZiAobmZjLT5idWZmZXIpIHsKPj4g KwlpZiAobGVuID4gbmZjLT5idWZmZXJfc2l6ZSkgewo+Cj5DaGVjayBvbmx5IGZvciBidWZmZXJf c2l6ZS4KPk1heWJlIHNwbGl0IGluIDIuIE9uZSBzaXplIHZhcmlhYmxlIHBlciBidWZmZXIuCj5S ZW9yZGVyIGZsb3csIHNlZSBleGFtcGxlPwo+Cj4+ICsJdGVtcF9idWYgPSBremFsbG9jKGxlbiwg R0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwo+PiArCWlmICghdGVtcF9idWYpCj4+ICsJcmV0dXJuIC1F Tk9NRU07Cj4+ICsJa2ZyZWUobmZjLT5idWZmZXIpOwo+Cj5JcyB0aGVyZSBhIHJlYWxsb2MgZm9y IGtlcm5lbHMgb3IgdXNlIGhlbHBlcj8KPgo+PiArCW5mYy0+YnVmZmVyID0gdGVtcF9idWY7Cj4+ ICsJbmZjLT5idWZmZXJfc2l6ZSA9IGxlbjsKPj4gKwo+PiArCW9vYl9sZW4gPSBlY2MtPnN0ZXBz ICogTkZDX01BWF9PT0JfUEVSX1NURVA7Cj4+ICsJdGVtcF9idWYgPSBremFsbG9jKG9vYl9sZW4s IEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKPj4gKwlpZiAoIXRlbXBfYnVmKQo+PiArCXJldHVybiAt RU5PTUVNOwo+PiArCWtmcmVlKG5mYy0+b29iX2J1Zik7Cj4+ICsJbmZjLT5vb2JfYnVmID0gKHUz MiAqKXRlbXBfYnVmOwo+PiArCX0KPj4gKwlyZXR1cm4gMDsKPj4gKwl9Cj4+ICsKPgo+RXhhbXBs ZToKPgo+Ly8gQ2hlY2sgYW5kIHJlc2l6ZSBleGlzdGluZyBidWZmZXIgc2l6ZXMuCj4KPm5ld19s ZW4gPSBtdGQtPndyaXRlc2l6ZSArIG10ZC0+b29ic2l6ZTsKPgo+aWYgKG5mYy0+YnVmZmVyICYm IG5ld19sZW4gPiBuZmMtPmJ1ZmZlcl9zaXplKSB7Cj7CoCByZXQgPSByZXNpemUoLi4uKTsKPsKg IGlmICghcmV0KQo+wqDCoMKgIHJldHVybiAtRU5PTUVNOwo+wqAgbmZjLT5idWZmZXJfc2l6ZSA9 IG5ld19sZW47Cj59Cj4KPm5ld19vb2JfbGVuID0gZWNjLT5zdGVwcyAqIE5GQ19NQVhfT09CX1BF Ul9TVEVQOwo+Cj5pZiAobmZjLT5vb2JfYnVmICYmIG5ld19vb2JfbGVuID4gbmZjLT5vb2JfYnVm ZmVyX3NpemUpIHsKPsKgIHJldCA9IHJlc2l6ZSguLi4pOwo+wqAgaWYgKCFyZXQpIHsKPsKgwqDC oCBmcmVlKG5mYy0+YnVmZmVyKTsKPsKgwqDCoCByZXR1cm4gLUVOT01FTTsKPsKgIH0KPsKgIG5m Yy0+b29iX2J1ZmZlcl9zaXplID0gbmV3X29vYl9sZW47Cj59Cj4KPi8vIElmIG5vIGJ1ZmZlcnMg ZXhpc3RzIHRoZW4gY3JlYXRlIG5ldyBidWZmZXJzLgo+Cj5pZiAoIW5mYy0+YnVmZmVyKSB7Cj7C oCByZXQgPSBremFsbG9jKC4uLik7Cj7CoCBpZiAoIXJldCkKPsKgwqDCoCByZXR1cm4gLUVOT01F TTsKPsKgIG5mYy0+YnVmZmVyX3NpemUgPSBuZXdfbGVuOwo+fQo+Cj5pZiAoIW5mYy0+b29iX2J1 Zikgewo+wqAgcmV0ID0ga3phbGxvYyguLi4pOwo+wqAgaWYgKCFyZXQpIHsKPsKgwqDCoCBmcmVl KG5mYy0+YnVmZmVyKTsKPsKgwqDCoCByZXR1cm4gLUVOT01FTTsKPsKgIH0KPsKgIG5mYy0+b29i X2J1ZmZlcl9zaXplID0gbmV3X29vYl9sZW47Cj59Cj4KPgo+PiArCW5mYy0+YnVmZmVyID0ga3ph bGxvYyhsZW4sIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKPj4gKwlpZiAoIW5mYy0+YnVmZmVyKQo+ PiArCXJldHVybiAtRU5PTUVNOwo+Cj4KPj4gKwo+PiArCW9vYl9sZW4gPSBlY2MtPnN0ZXBzICog TkZDX01BWF9PT0JfUEVSX1NURVA7Cj4+ICsJbmZjLT5vb2JfYnVmID0ga3phbGxvYyhvb2JfbGVu LCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7Cj4+ICsJaWYgKCFuZmMtPm9vYl9idWYpIHsKPj4gKwlr ZnJlZShuZmMtPmJ1ZmZlcik7Cj4+ICsJbmZjLT5idWZmZXIgPSBOVUxMOwo+Cj4+ICsJbmZjLT5v b2JfYnVmID0gTlVMTDsKPgo+IW5mYy0+b29iX2J1ZiA9PSAobmZjLT5vb2JfYnVmID0gTlVMTCkK Pgo+Q29tbWVudCBmcm9tIE1pcXXDqGw6Cj5JIGRvbid0IHRoaW5rIHRoaXMgaXMgbmVlZGVkCj4K PklmIHNvbWV0aGluZyBpcyBOVUxMIHRoZW4gdGhlcmUncyBubyBuZWVkIHRvIHNldCBpdCB0byBO VUxMIGFnYWluLgo+Cj4+ICsJcmV0dXJuIC1FTk9NRU07Cj4+ICsJfQo+PiArCj4+ICsJbmZjLT5i dWZmZXJfc2l6ZSA9IGxlbjsKPj4gKwluZmMtPnBhZ2VfYnVmID0gbmZjLT5idWZmZXI7Cj4+ICsK Pj4gKwljaGlwLT5lY2Mud3JpdGVfcGFnZV9yYXcgPSBya19uZmNfd3JpdGVfcGFnZV9yYXc7Cj4+ ICsJY2hpcC0+ZWNjLndyaXRlX3BhZ2UgPSBya19uZmNfd3JpdGVfcGFnZV9od2VjYzsKPj4gKwlj aGlwLT5lY2Mud3JpdGVfb29iX3JhdyA9IHJrX25mY193cml0ZV9vb2I7Cj4+ICsJY2hpcC0+ZWNj LndyaXRlX29vYiA9IHJrX25mY193cml0ZV9vb2I7Cj4+ICsKPj4gKwljaGlwLT5lY2MucmVhZF9w YWdlX3JhdyA9IHJrX25mY19yZWFkX3BhZ2VfcmF3Owo+PiArCWNoaXAtPmVjYy5yZWFkX3BhZ2Ug PSBya19uZmNfcmVhZF9wYWdlX2h3ZWNjOwo+PiArCWNoaXAtPmVjYy5yZWFkX29vYl9yYXcgPSBy a19uZmNfcmVhZF9vb2I7Cj4+ICsJY2hpcC0+ZWNjLnJlYWRfb29iID0gcmtfbmZjX3JlYWRfb29i Owo+PiArCj4+ICsJcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg bmFuZF9jb250cm9sbGVyX29wcyBya19uZmNfY29udHJvbGxlcl9vcHMgPSB7Cj4+ICsJLmF0dGFj aF9jaGlwID0gcmtfbmZjX2F0dGFjaF9jaGlwLAo+PiArCS5leGVjX29wID0gcmtfbmZjX2V4ZWNf b3AsCj4+ICsJLnNldHVwX2ludGVyZmFjZSA9IHJrX25mY19zZXR1cF9kYXRhX2ludGVyZmFjZSwK Pj4gK307Cj4+ICsKPj4gK3N0YXRpYyBpbnQgcmtfbmZjX25hbmRfY2hpcF9pbml0KHN0cnVjdCBk ZXZpY2UgKmRldiwgc3RydWN0IHJrX25mYyAqbmZjLAo+PiArCXN0cnVjdCBkZXZpY2Vfbm9kZSAq bnApCj4+ICt7Cj4+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZDsKPj4gKwlzdHJ1 Y3QgbmFuZF9jaGlwICpjaGlwOwo+PiArCXN0cnVjdCBtdGRfaW5mbyAqbXRkOwo+PiArCWludCBu c2VsczsKPj4gKwl1MzIgdG1wOwo+PiArCWludCByZXQ7Cj4+ICsJaW50IGk7Cj4+ICsKPj4gKwlp ZiAoIW9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsICZuc2VscykpCj4+ICsJcmV0dXJuIC1FTk9E RVY7Cj4+ICsJbnNlbHMgLz0gc2l6ZW9mKHUzMik7Cj4+ICsJaWYgKCFuc2VscyB8fCBuc2VscyA+ IE5GQ19NQVhfTlNFTFMpIHsKPj4gKwlkZXZfZXJyKGRldiwgImludmFsaWQgcmVnIHByb3BlcnR5 IHNpemUgJWRcbiIsIG5zZWxzKTsKPj4gKwlyZXR1cm4gLUVJTlZBTDsKPj4gKwl9Cj4+ICsKPj4g Kwlya25hbmQgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnJrbmFuZCkgKyBuc2VscyAqIHNp emVvZih1OCksCj4+ICsJwqDCoMKgwqDCoCBHRlBfS0VSTkVMKTsKPj4gKwlpZiAoIXJrbmFuZCkK Pj4gKwlyZXR1cm4gLUVOT01FTTsKPj4gKwo+PiArCXJrbmFuZC0+bnNlbHMgPSBuc2VsczsKPj4g Kwlmb3IgKGkgPSAwOyBpIDwgbnNlbHM7IGkrKykgewo+PiArCXJldCA9IG9mX3Byb3BlcnR5X3Jl YWRfdTMyX2luZGV4KG5wLCAicmVnIiwgaSwgJnRtcCk7Cj4+ICsJaWYgKHJldCkgewo+PiArCWRl dl9lcnIoZGV2LCAicmVnIHByb3BlcnR5IGZhaWx1cmUgOiAlZFxuIiwgcmV0KTsKPj4gKwlyZXR1 cm4gcmV0Owo+PiArCX0KPj4gKwo+PiArCWlmICh0bXAgPj0gTkZDX01BWF9OU0VMUykgewo+PiAr CWRldl9lcnIoZGV2LCAiaW52YWxpZCBDUzogJXVcbiIsIHRtcCk7Cj4+ICsJcmV0dXJuIC1FSU5W QUw7Cj4+ICsJfQo+PiArCj4+ICsJaWYgKHRlc3RfYW5kX3NldF9iaXQodG1wLCAmbmZjLT5hc3Np Z25lZF9jcykpIHsKPj4gKwlkZXZfZXJyKGRldiwgIkNTICV1IGFscmVhZHkgYXNzaWduZWRcbiIs IHRtcCk7Cj4+ICsJcmV0dXJuIC1FSU5WQUw7Cj4+ICsJfQo+PiArCj4+ICsJcmtuYW5kLT5zZWxz W2ldID0gdG1wOwo+PiArCX0KPj4gKwo+PiArCWNoaXAgPSAmcmtuYW5kLT5jaGlwOwo+PiArCWNo aXAtPmNvbnRyb2xsZXIgPSAmbmZjLT5jb250cm9sbGVyOwo+PiArCj4+ICsJbmFuZF9zZXRfZmxh c2hfbm9kZShjaGlwLCBucCk7Cj4+ICsKPj4gKwluYW5kX3NldF9jb250cm9sbGVyX2RhdGEoY2hp cCwgbmZjKTsKPj4gKwo+PiArCWNoaXAtPm9wdGlvbnMgfD0gTkFORF9VU0VTX0RNQSB8IE5BTkRf Tk9fU1VCUEFHRV9XUklURTsKPj4gKwljaGlwLT5iYnRfb3B0aW9ucyA9IE5BTkRfQkJUX1VTRV9G TEFTSCB8IE5BTkRfQkJUX05PX09PQjsKPj4gKwo+PiArCS8qIFNldCBkZWZhdWx0IG1vZGUgaW4g Y2FzZSBkdCBlbnRyeSBpcyBtaXNzaW5nLiAqLwo+PiArCWNoaXAtPmVjYy5lbmdpbmVfdHlwZSA9 IE5BTkRfRUNDX0VOR0lORV9UWVBFX09OX0hPU1Q7Cj4+ICsKPj4gKwltdGQgPSBuYW5kX3RvX210 ZChjaGlwKTsKPj4gKwltdGQtPm93bmVyID0gVEhJU19NT0RVTEU7Cj4+ICsJbXRkLT5kZXYucGFy ZW50ID0gZGV2Owo+PiArCj4+ICsJaWYgKCFtdGQtPm5hbWUpIHsKPj4gKwlkZXZfZXJyKG5mYy0+ ZGV2LCAiTkFORCBsYWJlbCBwcm9wZXJ0eSBpcyBtYW5kYXRvcnlcbiIpOwo+PiArCXJldHVybiAt RUlOVkFMOwo+PiArCX0KPj4gKwo+PiArCW10ZF9zZXRfb29ibGF5b3V0KG10ZCwgJnJrX25mY19v b2JsYXlvdXRfb3BzKTsKPj4gKwlya19uZmNfaHdfaW5pdChuZmMpOwo+PiArCXJldCA9IG5hbmRf c2NhbihjaGlwLCBuc2Vscyk7Cj4+ICsJaWYgKHJldCkKPj4gKwlyZXR1cm4gcmV0Owo+PiArCj4+ ICsJaWYgKGNoaXAtPm9wdGlvbnMgJiBOQU5EX0lTX0JPT1RfTUVESVVNKSB7Cj4+ICsJcmV0ID0g b2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxib290LWJsa3MiLCAmdG1wKTsKPj4g Kwlya25hbmQtPmJvb3RfYmxrcyA9IHJldCA/IDAgOiB0bXA7Cj4KPkNvbW1lbnQgYnkgTWlxdcOo bDoKPkNhbid0IHlvdSBndWVzcyB0aGlzIGVudHJ5IGtub3dpbmcgdGhlIElQIHZlcnNpb24vU29D IHZlcnNpb24/Cj4KPk5vLCAicm9ja2NoaXAsYm9vdC1ibGtzIiBkZXBlbmRzIG9uIHRoZSBzaXpl IG9mIG11bHRpcGxlIHBhcnRpdGlvbnMKPmFuZCBpcyB1c2VyIGxheW91dCBkZXBlbmRlbnQuCgpU aGUgInJvY2tjaGlwLGJvb3QtYmxrcyIgaXMgbm90IGEgZml4ZWQgbnVtYmVyLCBjYW4gYmUgY29u ZmlndXJlZCB3aXRoIGRpZmZlcmVudCBudW1iZXIgb2YgYmxvY2tzIHRvIHN0b3JlIHRoZSBwcmUg bG9hZGVyCmZvciB0aGUgc2FtZSBTb0MuCgo+PiArCj4+ICsJcmV0ID0gb2ZfcHJvcGVydHlfcmVh ZF91MzIobnAsICJyb2NrY2hpcCxib290LWVjYy1zdHJlbmd0aCIsCj4+ICsJwqDCoCAmdG1wKTsK Pj4gKwlya25hbmQtPmJvb3RfZWNjID0gcmV0ID8gY2hpcC0+ZWNjLnN0cmVuZ3RoIDogdG1wOwo+ PiArCX0KPj4gKwo+PiArCXJldCA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIobXRkLCBOVUxMLCAwKTsK Pj4gKwlpZiAocmV0KSB7Cj4+ICsJZGV2X2VycihkZXYsICJtdGQgcGFyc2UgcGFydGl0aW9uIGVy cm9yXG4iKTsKPj4gKwluYW5kX2NsZWFudXAoY2hpcCk7Cj4+ICsJcmV0dXJuIHJldDsKPj4gKwl9 Cj4+ICsKPj4gKwlsaXN0X2FkZF90YWlsKCZya25hbmQtPm5vZGUsICZuZmMtPmNoaXBzKTsKPj4g Kwo+PiArCXJldHVybiAwOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCBya19uZmNfY2hpcHNf Y2xlYW51cChzdHJ1Y3QgcmtfbmZjICpuZmMpCj4+ICt7Cj4+ICsJc3RydWN0IHJrX25mY19uYW5k X2NoaXAgKnJrbmFuZCwgKnRtcDsKPj4gKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwOwo+PiArCWlu dCByZXQ7Cj4+ICsKPj4gKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmtuYW5kLCB0bXAsICZu ZmMtPmNoaXBzLCBub2RlKSB7Cj4+ICsJY2hpcCA9ICZya25hbmQtPmNoaXA7Cj4+ICsJcmV0ID0g bXRkX2RldmljZV91bnJlZ2lzdGVyKG5hbmRfdG9fbXRkKGNoaXApKTsKPj4gKwlXQVJOX09OKHJl dCk7Cj4+ICsJbmFuZF9jbGVhbnVwKGNoaXApOwo+PiArCWxpc3RfZGVsKCZya25hbmQtPm5vZGUp Owo+PiArCX0KPj4gK30KPj4gKwo+PiArc3RhdGljIGludCBya19uZmNfbmFuZF9jaGlwc19pbml0 KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJrX25mYyAqbmZjKQo+PiArewo+PiArCXN0cnVj dCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGUsICpuYW5kX25wOwo+PiArCWludCBuY2hp cHMgPSBvZl9nZXRfY2hpbGRfY291bnQobnApOwo+PiArCWludCByZXQ7Cj4+ICsKPj4gKwlpZiAo IW5jaGlwcyB8fCBuY2hpcHMgPiBORkNfTUFYX05TRUxTKSB7Cj4+ICsJZGV2X2VycihuZmMtPmRl diwgIkluY29ycmVjdCBudW1iZXIgb2YgTkFORCBjaGlwcyAoJWQpXG4iLAo+PiArCW5jaGlwcyk7 Cj4+ICsJcmV0dXJuIC1FSU5WQUw7Cj4+ICsJfQo+PiArCj4+ICsJZm9yX2VhY2hfY2hpbGRfb2Zf bm9kZShucCwgbmFuZF9ucCkgewo+PiArCXJldCA9IHJrX25mY19uYW5kX2NoaXBfaW5pdChkZXYs IG5mYywgbmFuZF9ucCk7Cj4+ICsJaWYgKHJldCkgewo+PiArCW9mX25vZGVfcHV0KG5hbmRfbnAp Owo+PiArCXJrX25mY19jaGlwc19jbGVhbnVwKG5mYyk7Cj4+ICsJcmV0dXJuIHJldDsKPj4gKwl9 Cj4+ICsJfQo+PiArCj4+ICsJcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBzdHJ1Y3Qg bmZjX2NmZyBuZmNfdjZfY2ZnID0gewo+PiArCS50eXBlCT0gTkZDX1Y2LAo+PiArCS5lY2Nfc3Ry ZW5ndGhzCT0gezYwLCA0MCwgMjQsIDE2fSwKPj4gKwkuZWNjX2NmZ3MJPSB7Cj4+ICsJMHgwMDA0 MDAxMSwgMHgwMDA0MDAwMSwgMHgwMDAwMDAxMSwgMHgwMDAwMDAwMSwKPj4gKwl9LAo+PiArCS5m bGN0bF9vZmYJPSAweDA4LAo+PiArCS5iY2hjdGxfb2ZmCT0gMHgwQywKPj4gKwkuZG1hX2NmZ19v ZmYJPSAweDEwLAo+PiArCS5kbWFfZGF0YV9idWZfb2ZmCT0gMHgxNCwKPj4gKwkuZG1hX29vYl9i dWZfb2ZmCT0gMHgxOCwKPj4gKwkuZG1hX3N0X29mZgk9IDB4MUMsCj4+ICsJLmJjaF9zdF9vZmYJ PSAweDIwLAo+PiArCS5yYW5kbXpfb2ZmCT0gMHgxNTAsCj4+ICsJLmludF9lbl9vZmYJPSAweDE2 QywKPj4gKwkuaW50X2Nscl9vZmYJPSAweDE3MCwKPj4gKwkuaW50X3N0X29mZgk9IDB4MTc0LAo+ PiArCS5vb2IwX29mZgk9IDB4MjAwLAo+PiArCS5vb2IxX29mZgk9IDB4MjMwLAo+PiArCS5lY2Mw CT0gewo+PiArCS5lcnJfZmxhZ19iaXQJPSAyLAo+PiArCS5sb3cJPSAzLAo+PiArCS5sb3dfbWFz awk9IDB4MUYsCj4+ICsJLmxvd19ibgk9IDUsCj4+ICsJLmhpZ2gJPSAyNywKPj4gKwkuaGlnaF9t YXNrCT0gMHgxLAo+PiArCX0sCj4+ICsJLmVjYzEJPSB7Cj4+ICsJLmVycl9mbGFnX2JpdAk9IDE1 LAo+PiArCS5sb3cJPSAxNiwKPj4gKwkubG93X21hc2sJPSAweDFGLAo+PiArCS5sb3dfYm4JPSA1 LAo+PiArCS5oaWdoCT0gMjksCj4+ICsJLmhpZ2hfbWFzawk9IDB4MSwKPj4gKwl9LAo+PiArfTsK Pj4gKwo+PiArc3RhdGljIHN0cnVjdCBuZmNfY2ZnIG5mY192OF9jZmcgPSB7Cj4+ICsJLnR5cGUJ PSBORkNfVjgsCj4+ICsJLmVjY19zdHJlbmd0aHMJPSB7MTYsIDE2LCAxNiwgMTZ9LAo+PiArCS5l Y2NfY2Zncwk9IHsKPj4gKwkweDAwMDAwMDAxLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxLCAweDAw MDAwMDAxLAo+PiArCX0sCj4+ICsJLmZsY3RsX29mZgk9IDB4MDgsCj4+ICsJLmJjaGN0bF9vZmYJ PSAweDBDLAo+PiArCS5kbWFfY2ZnX29mZgk9IDB4MTAsCj4+ICsJLmRtYV9kYXRhX2J1Zl9vZmYJ PSAweDE0LAo+PiArCS5kbWFfb29iX2J1Zl9vZmYJPSAweDE4LAo+PiArCS5kbWFfc3Rfb2ZmCT0g MHgxQywKPj4gKwkuYmNoX3N0X29mZgk9IDB4MjAsCj4+ICsJLnJhbmRtel9vZmYJPSAweDE1MCwK Pj4gKwkuaW50X2VuX29mZgk9IDB4MTZDLAo+PiArCS5pbnRfY2xyX29mZgk9IDB4MTcwLAo+PiAr CS5pbnRfc3Rfb2ZmCT0gMHgxNzQsCj4+ICsJLm9vYjBfb2ZmCT0gMHgyMDAsCj4+ICsJLm9vYjFf b2ZmCT0gMHgyMzAsCj4+ICsJLmVjYzAJPSB7Cj4+ICsJLmVycl9mbGFnX2JpdAk9IDIsCj4+ICsJ Lmxvdwk9IDMsCj4+ICsJLmxvd19tYXNrCT0gMHgxRiwKPj4gKwkubG93X2JuCT0gNSwKPj4gKwku aGlnaAk9IDI3LAo+PiArCS5oaWdoX21hc2sJPSAweDEsCj4+ICsJfSwKPj4gKwkuZWNjMQk9IHsK Pj4gKwkuZXJyX2ZsYWdfYml0CT0gMTUsCj4+ICsJLmxvdwk9IDE2LAo+PiArCS5sb3dfbWFzawk9 IDB4MUYsCj4+ICsJLmxvd19ibgk9IDUsCj4+ICsJLmhpZ2gJPSAyOSwKPj4gKwkuaGlnaF9tYXNr CT0gMHgxLAo+PiArCX0sCj4+ICt9Owo+PiArCj4+ICtzdGF0aWMgc3RydWN0IG5mY19jZmcgbmZj X3Y5X2NmZyA9IHsKPj4gKwkudHlwZQk9IE5GQ19WOSwKPj4gKwkuZWNjX3N0cmVuZ3Rocwk9IHs3 MCwgNjAsIDQwLCAxNn0sCj4+ICsJLmVjY19jZmdzCT0gewo+PiArCTB4MDAwMDAwMDEsIDB4MDYw MDAwMDEsIDB4MDQwMDAwMDEsIDB4MDIwMDAwMDEsCj4+ICsJfSwKPj4gKwkuZmxjdGxfb2ZmCT0g MHgxMCwKPj4gKwkuYmNoY3RsX29mZgk9IDB4MjAsCj4+ICsJLmRtYV9jZmdfb2ZmCT0gMHgzMCwK Pj4gKwkuZG1hX2RhdGFfYnVmX29mZgk9IDB4MzQsCj4+ICsJLmRtYV9vb2JfYnVmX29mZgk9IDB4 MzgsCj4+ICsJLmRtYV9zdF9vZmYJPSAweDNDLAo+PiArCS5iY2hfc3Rfb2ZmCT0gMHgxNTAsCj4+ ICsJLnJhbmRtel9vZmYJPSAweDIwOCwKPj4gKwkuaW50X2VuX29mZgk9IDB4MTIwLAo+PiArCS5p bnRfY2xyX29mZgk9IDB4MTI0LAo+PiArCS5pbnRfc3Rfb2ZmCT0gMHgxMjgsCj4+ICsJLm9vYjBf b2ZmCT0gMHgyMDAsCj4+ICsJLm9vYjFfb2ZmCT0gMHgyMDQsCj4+ICsJLmVjYzAJPSB7Cj4+ICsJ LmVycl9mbGFnX2JpdAk9IDIsCj4+ICsJLmxvdwk9IDMsCj4+ICsJLmxvd19tYXNrCT0gMHg3RiwK Pj4gKwkubG93X2JuCT0gNywKPj4gKwkuaGlnaAk9IDAsCj4+ICsJLmhpZ2hfbWFzawk9IDB4MCwK Pj4gKwl9LAo+PiArCS5lY2MxCT0gewo+PiArCS5lcnJfZmxhZ19iaXQJPSAxOCwKPj4gKwkubG93 CT0gMTksCj4+ICsJLmxvd19tYXNrCT0gMHg3RiwKPj4gKwkubG93X2JuCT0gNywKPj4gKwkuaGln aAk9IDAsCj4+ICsJLmhpZ2hfbWFzawk9IDB4MCwKPj4gKwl9LAo+PiArfTsKPj4gKwo+PiArc3Rh dGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcmtfbmZjX2lkX3RhYmxlW10gPSB7Cj4+ICsJ ewo+PiArCS5jb21wYXRpYmxlID0gInJvY2tjaGlwLHB4MzAtbmZjIiwKPj4gKwkuZGF0YSA9ICZu ZmNfdjlfY2ZnCj4+ICsJfSwKPj4gKwl7Cj4+ICsJLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscmsy OTI4LW5mYyIsCj4+ICsJLmRhdGEgPSAmbmZjX3Y2X2NmZwo+PiArCX0sCj4+ICsJewo+PiArCS5j b21wYXRpYmxlID0gInJvY2tjaGlwLHJ2MTEwOC1uZmMiLAo+PiArCS5kYXRhID0gJm5mY192OF9j ZmcKPj4gKwl9LAo+PiArCXsgLyogc2VudGluZWwgKi8gfQo+PiArfTsKPj4gK01PRFVMRV9ERVZJ Q0VfVEFCTEUob2YsIHJrX25mY19pZF90YWJsZSk7Cj4+ICsKPj4gK3N0YXRpYyBpbnQgcmtfbmZj X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4+ICt7Cj4+ICsJc3RydWN0IGRl dmljZSAqZGV2ID0gJnBkZXYtPmRldjsKPj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmM7Cj4+ICsJaW50 IHJldCwgaXJxOwo+PiArCj4+ICsJbmZjID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpuZmMp LCBHRlBfS0VSTkVMKTsKPj4gKwlpZiAoIW5mYykKPj4gKwlyZXR1cm4gLUVOT01FTTsKPj4gKwo+ PiArCW5hbmRfY29udHJvbGxlcl9pbml0KCZuZmMtPmNvbnRyb2xsZXIpOwo+PiArCUlOSVRfTElT VF9IRUFEKCZuZmMtPmNoaXBzKTsKPj4gKwluZmMtPmNvbnRyb2xsZXIub3BzID0gJnJrX25mY19j b250cm9sbGVyX29wczsKPj4gKwo+PiArCW5mYy0+Y2ZnID0gb2ZfZGV2aWNlX2dldF9tYXRjaF9k YXRhKGRldik7Cj4+ICsJbmZjLT5kZXYgPSBkZXY7Cj4+ICsKPj4gKwlpbml0X2NvbXBsZXRpb24o Jm5mYy0+ZG9uZSk7Cj4+ICsKPj4gKwluZmMtPnJlZ3MgPSBkZXZtX3BsYXRmb3JtX2lvcmVtYXBf cmVzb3VyY2UocGRldiwgMCk7Cj4+ICsJaWYgKElTX0VSUihuZmMtPnJlZ3MpKSB7Cj4+ICsJcmV0 ID0gUFRSX0VSUihuZmMtPnJlZ3MpOwo+PiArCWdvdG8gcmVsZWFzZV9uZmM7Cj4+ICsJfQo+PiAr Cj4+ICsJbmZjLT5uZmNfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgIm5mYyIpOwo+PiArCWlmIChJ U19FUlIobmZjLT5uZmNfY2xrKSkgewo+PiArCWRldl9kYmcoZGV2LCAibm8gbmZjIGNsa1xuIik7 Cj4+ICsJLyogU29tZSBlYXJsaWVyIG1vZGVscywgc3VjaCBhcyByazMwNjYsIGhhdmUgbm8gbmZj IGNsay4gKi8KPj4gKwl9Cj4+ICsKPj4gKwluZmMtPmFoYl9jbGsgPSBkZXZtX2Nsa19nZXQoZGV2 LCAiYWhiIik7Cj4+ICsJaWYgKElTX0VSUihuZmMtPmFoYl9jbGspKSB7Cj4+ICsJZGV2X2Vycihk ZXYsICJubyBhaGIgY2xrXG4iKTsKPj4gKwlyZXQgPSBQVFJfRVJSKG5mYy0+YWhiX2Nsayk7Cj4+ ICsJZ290byByZWxlYXNlX25mYzsKPj4gKwl9Cj4+ICsKPj4gKwlyZXQgPSBya19uZmNfZW5hYmxl X2NsayhkZXYsIG5mYyk7Cj4+ICsJaWYgKHJldCkKPj4gKwlnb3RvIHJlbGVhc2VfbmZjOwo+PiAr Cj4+ICsJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKPj4gKwlpZiAoaXJxIDwgMCkg ewo+PiArCWRldl9lcnIoZGV2LCAibm8gbmZjIGlycSByZXNvdXJjZVxuIik7Cj4+ICsJcmV0ID0g LUVJTlZBTDsKPj4gKwlnb3RvIGNsa19kaXNhYmxlOwo+PiArCX0KPj4gKwo+PiArCXdyaXRlbCgw LCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+aW50X2VuX29mZik7Cj4+ICsJcmV0ID0gZGV2bV9yZXF1 ZXN0X2lycShkZXYsIGlycSwgcmtfbmZjX2lycSwgMHgwLCAicmstbmFuZCIsIG5mYyk7Cj4+ICsJ aWYgKHJldCkgewo+PiArCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgbmZjIGlycVxu Iik7Cj4+ICsJZ290byBjbGtfZGlzYWJsZTsKPj4gKwl9Cj4+ICsKPj4gKwlwbGF0Zm9ybV9zZXRf ZHJ2ZGF0YShwZGV2LCBuZmMpOwo+PiArCj4+ICsJcmV0ID0gcmtfbmZjX25hbmRfY2hpcHNfaW5p dChkZXYsIG5mYyk7Cj4+ICsJaWYgKHJldCkgewo+PiArCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRv IGluaXQgTkFORCBjaGlwc1xuIik7Cj4+ICsJZ290byBjbGtfZGlzYWJsZTsKPj4gKwl9Cj4+ICsJ cmV0dXJuIDA7Cj4+ICsKPj4gK2Nsa19kaXNhYmxlOgo+PiArCXJrX25mY19kaXNhYmxlX2Nsayhu ZmMpOwo+PiArcmVsZWFzZV9uZmM6Cj4+ICsJcmV0dXJuIHJldDsKPj4gK30KPj4gKwo+PiArc3Rh dGljIGludCBya19uZmNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4+ICt7 Cj4+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Cj4+ ICsKPj4gKwlrZnJlZShuZmMtPmJ1ZmZlcik7Cj4+ICsJa2ZyZWUobmZjLT5vb2JfYnVmKTsKPj4g Kwlya19uZmNfY2hpcHNfY2xlYW51cChuZmMpOwo+PiArCXJrX25mY19kaXNhYmxlX2NsayhuZmMp Owo+PiArCj4+ICsJcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgX19tYXliZV91 bnVzZWQgcmtfbmZjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQo+PiArewo+PiArCXN0cnVj dCBya19uZmMgKm5mYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+PiArCj4+ICsJcmtfbmZjX2Rp c2FibGVfY2xrKG5mYyk7Cj4+ICsKPj4gKwlyZXR1cm4gMDsKPj4gK30KPj4gKwo+PiArc3RhdGlj IGludCBfX21heWJlX3VudXNlZCBya19uZmNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKPj4g K3sKPj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPj4gKwlz dHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCAqcmtuYW5kOwo+PiArCXN0cnVjdCBuYW5kX2NoaXAgKmNo aXA7Cj4+ICsJaW50IHJldDsKPj4gKwl1MzIgaTsKPj4gKwo+PiArCXJldCA9IHJrX25mY19lbmFi bGVfY2xrKGRldiwgbmZjKTsKPj4gKwlpZiAocmV0KQo+PiArCXJldHVybiByZXQ7Cj4+ICsKPj4g KwkvKiBSZXNldCBOQU5EIGNoaXAgaWYgVkNDIHdhcyBwb3dlcmVkIG9mZi4gKi8KPj4gKwlsaXN0 X2Zvcl9lYWNoX2VudHJ5KHJrbmFuZCwgJm5mYy0+Y2hpcHMsIG5vZGUpIHsKPj4gKwljaGlwID0g JnJrbmFuZC0+Y2hpcDsKPj4gKwlmb3IgKGkgPSAwOyBpIDwgcmtuYW5kLT5uc2VsczsgaSsrKQo+ PiArCW5hbmRfcmVzZXQoY2hpcCwgaSk7Cj4+ICsJfQo+PiArCj4+ICsJcmV0dXJuIDA7Cj4+ICt9 Cj4+ICsKPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBya19uZmNfcG1fb3BzID0g ewo+PiArCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHJrX25mY19zdXNwZW5kLCBya19uZmNfcmVz dW1lKQo+PiArfTsKPj4gKwo+PiArc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcmtfbmZj X2RyaXZlciA9IHsKPj4gKwkucHJvYmUgPSBya19uZmNfcHJvYmUsCj4+ICsJLnJlbW92ZSA9IHJr X25mY19yZW1vdmUsCj4+ICsJLmRyaXZlciA9IHsKPj4gKwkubmFtZSA9ICJyb2NrY2hpcC1uZmMi LAo+PiArCS5vZl9tYXRjaF90YWJsZSA9IHJrX25mY19pZF90YWJsZSwKPj4gKwkucG0gPSAmcmtf bmZjX3BtX29wcywKPj4gKwl9LAo+PiArfTsKPj4gKwo+PiArbW9kdWxlX3BsYXRmb3JtX2RyaXZl cihya19uZmNfZHJpdmVyKTsKPj4gKwo+PiArTU9EVUxFX0xJQ0VOU0UoIkR1YWwgTUlUL0dQTCIp Owo+PiArTU9EVUxFX0FVVEhPUigiWWlmZW5nIFpoYW8gPHlpZmVuZy56aGFvQHJvY2stY2hpcHMu Y29tPiIpOwo+PiArTU9EVUxFX0RFU0NSSVBUSU9OKCJSb2NrY2hpcCBOYW5kIEZsYXNoIENvbnRy b2xsZXIgRHJpdmVyIik7Cj4+ICtNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnJvY2tjaGlwLW5hbmQt Y29udHJvbGxlciIpOwo+Pgo+Cj4KPg==