From mboxrd@z Thu Jan 1 00:00:00 1970 From: Eric Engestrom Subject: Re: [PATCH libdrm] tests/modetest: Add modetest_atomic tool Date: Mon, 23 Jul 2018 17:30:00 +0100 Message-ID: <20180723163000.GA2117@intel.com> References: <20180720113329.9789-1-benjamin.gaignard@linaro.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by gabe.freedesktop.org (Postfix) with ESMTPS id 192666E4BA for ; Mon, 23 Jul 2018 16:30:03 +0000 (UTC) Content-Disposition: inline In-Reply-To: <20180720113329.9789-1-benjamin.gaignard@linaro.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Benjamin Gaignard Cc: dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org T24gRnJpZGF5LCAyMDE4LTA3LTIwIDEzOjMzOjI5ICswMjAwLCBCZW5qYW1pbiBHYWlnbmFyZCB3 cm90ZToKPiBUaGlzIGlzIGEgbW9kZXRlc3QgbGlrZSB0b29sIGJ1dCB1c2luZyBhdG9taWMgQVBJ Lgo+IAo+IFdpdGggbW9kZXRlc3RfYXRvbWljIGl0IGlzIG1hbmRhdG9yeSB0byBzcGVjaWZ5IGEg bW9kZSAoIi1zIikKPiBhbmQgYSBwbGFuZSAoIi1QIikgdG8gZGlzcGxheSBhIHBhdHRlcm4gb24g c2NyZWVuLgo+IAo+ICItdiIgZG9lcyBhIGxvb3Agc3dhcHBpbmcgYmV0d2VlbiB0d28gZnJhbWVi dWZmZXJzIGZvciBlYWNoCj4gYWN0aXZlIHBsYW5lcy4KPiAKPiBtb2RldGVzdF9hdG9taWMgZG9l c24ndCBvZmZlciBjdXJzb3Igc3VwcG9ydAo+IAo+IFNpZ25lZC1vZmYtYnk6IEJlbmphbWluIEdh aWduYXJkIDxiZW5qYW1pbi5nYWlnbmFyZEBsaW5hcm8ub3JnPgo+IC0tLQo+IAo+IFRoZSBjb2Rl IGlzIGJhc2VkIG9uIG1vZGV0ZXN0IGFuZCBrZWVwIG1vc3Qgb2YgaXQgaW5mcmFzdHJ1Y3R1cmUK PiBsaWtlIGFyZ3VtZW50cyBwYXJzaW5nLCBmaW5kaW5nIHByb3BlcnRpZXMgaWQgZnJvbSB0aGVp ciBuYW1lLAo+IHJlc291cmNlcyBkdW1waW5nIG9yIHRoZSBnZW5lcmFsIHdheSBvZiB3b3JraW5n LiAKPiBJdCBkdXBsaWNhdGVzIG1vZGV0ZXN0IGNvZGUgYnV0IGFkZGluZyBjb21waWxhdGlvbiBm bGFncyBvciAKPiBjb25kaXRpb25hbCB0ZXN0cyBldmVyeXdoZXJlIGluIG1vZGV0ZXN0IHdvdWxk IGhhdmUgbWFkZSBpdCAKPiBtb3JlIGNvbXBsZXggYW5kIHVucmVhZGFibGUuCgpJIGRvbid0IGhh dmUgYW4gb3BpbmlvbiBvbiB3aGV0aGVyIGR1cGxpY2F0aW5nIHRoZSB0ZXN0IGlzIHRoZSByaWdo dAp0aGluZywgYnV0IGlmIHlvdSBkbywgcGxlYXNlIGFsc28gZHVwbGljYXRlIHRoZSBsaW5lcyBp bgp0ZXN0cy9tb2RldGVzdC9tZXNvbi5idWlsZCA6KQoKPiAKPiBDcmVhdGluZyBtb2RldGVzdF9h dG9taWMgY291bGQgYWxsb3cgdG8gdGVzdCBhdG9taWMgQVBJIHdpdGhvdXQKPiBuZWVkIHRvIHVz ZSAiYmlnIiBmcmFtZXdvcmtzIGxpa2Ugd2VzdG9uLCBkcm1faHdjb21wb3NlciBvciBpZ3QKPiB3 aXRoIGFsbCB0aGVpciBkZXBlbmRlbmNpZXMuCj4ga21zY3ViZSBjb3VsZCBhbHNvIGJlIHVzZWQg dG8gdGVzdCBhdG9taWMgQVBJIGJ1dCBpdCBuZWVkIEVHTC4KPiAKPiBJdCBoYXZlIGJlZW4gdGVz dGVkIChvbmx5KSBvbiBzdG0gZHJpdmVyIHdpdGggb25lIG9yIHR3byBwbGFuZXMKPiBhY3RpdmVk Lgo+IAo+ICB0ZXN0cy9tb2RldGVzdC9NYWtlZmlsZS5hbSAgICAgICB8ICAgMTMgKy0KPiAgdGVz dHMvbW9kZXRlc3QvTWFrZWZpbGUuc291cmNlcyAgfCAgICA3ICsKPiAgdGVzdHMvbW9kZXRlc3Qv bW9kZXRlc3RfYXRvbWljLmMgfCAxNTQ2ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrCj4gIDMgZmlsZXMgY2hhbmdlZCwgMTU2NCBpbnNlcnRpb25zKCspLCAyIGRlbGV0aW9u cygtKQo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgdGVzdHMvbW9kZXRlc3QvbW9kZXRlc3RfYXRvbWlj LmMKPiAKPiBkaWZmIC0tZ2l0IGEvdGVzdHMvbW9kZXRlc3QvTWFrZWZpbGUuYW0gYi90ZXN0cy9t b2RldGVzdC9NYWtlZmlsZS5hbQo+IGluZGV4IDRiMjk2YzgzLi44ZjY5N2JiMyAxMDA2NDQKPiAt LS0gYS90ZXN0cy9tb2RldGVzdC9NYWtlZmlsZS5hbQo+ICsrKyBiL3Rlc3RzL21vZGV0ZXN0L01h a2VmaWxlLmFtCj4gQEAgLTEwLDEwICsxMCwxMiBAQCBBTV9DRkxBR1MgKz0gXAo+ICAKPiAgaWYg SEFWRV9JTlNUQUxMX1RFU1RTCj4gIGJpbl9QUk9HUkFNUyA9IFwKPiAtCW1vZGV0ZXN0Cj4gKwlt b2RldGVzdCBcCj4gKwltb2RldGVzdF9hdG9taWMKPiAgZWxzZQo+ICBub2luc3RfUFJPR1JBTVMg PSBcCj4gLQltb2RldGVzdAo+ICsJbW9kZXRlc3QgXAo+ICsJbW9kZXRlc3RfYXRvbWljCj4gIGVu ZGlmCj4gIAo+ICBtb2RldGVzdF9TT1VSQ0VTID0gJChNT0RFVEVTVF9GSUxFUykKPiBAQCAtMjIs MyArMjQsMTAgQEAgbW9kZXRlc3RfTERBREQgPSBcCj4gIAkkKHRvcF9idWlsZGRpcikvbGliZHJt LmxhIFwKPiAgCSQodG9wX2J1aWxkZGlyKS90ZXN0cy91dGlsL2xpYnV0aWwubGEgXAo+ICAJJChD QUlST19MSUJTKQo+ICsKPiArbW9kZXRlc3RfYXRvbWljX1NPVVJDRVMgPSAkKE1PREVURVNUX0FU T01JQ19GSUxFUykKPiArCj4gK21vZGV0ZXN0X2F0b21pY19MREFERCA9IFwKPiArCSQodG9wX2J1 aWxkZGlyKS9saWJkcm0ubGEgXAo+ICsJJCh0b3BfYnVpbGRkaXIpL3Rlc3RzL3V0aWwvbGlidXRp bC5sYSBcCj4gKwkkKENBSVJPX0xJQlMpCj4gZGlmZiAtLWdpdCBhL3Rlc3RzL21vZGV0ZXN0L01h a2VmaWxlLnNvdXJjZXMgYi90ZXN0cy9tb2RldGVzdC9NYWtlZmlsZS5zb3VyY2VzCj4gaW5kZXgg Mzk5YWYwZGYuLjBhMWRmNGMwIDEwMDY0NAo+IC0tLSBhL3Rlc3RzL21vZGV0ZXN0L01ha2VmaWxl LnNvdXJjZXMKPiArKysgYi90ZXN0cy9tb2RldGVzdC9NYWtlZmlsZS5zb3VyY2VzCj4gQEAgLTQs MyArNCwxMCBAQCBNT0RFVEVTVF9GSUxFUyA6PSBcCj4gIAljdXJzb3IuYyBcCj4gIAljdXJzb3Iu aCBcCj4gIAltb2RldGVzdC5jCj4gKwo+ICtNT0RFVEVTVF9BVE9NSUNfRklMRVMgOj0gXAo+ICsJ YnVmZmVycy5jIFwKPiArCWJ1ZmZlcnMuaCBcCj4gKwljdXJzb3IuYyBcCj4gKwljdXJzb3IuaCBc Cj4gKwltb2RldGVzdF9hdG9taWMuYwo+IGRpZmYgLS1naXQgYS90ZXN0cy9tb2RldGVzdC9tb2Rl dGVzdF9hdG9taWMuYyBiL3Rlc3RzL21vZGV0ZXN0L21vZGV0ZXN0X2F0b21pYy5jCj4gbmV3IGZp bGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMC4uOGM4Nzc4NjAKPiAtLS0gL2Rldi9udWxs Cj4gKysrIGIvdGVzdHMvbW9kZXRlc3QvbW9kZXRlc3RfYXRvbWljLmMKPiBAQCAtMCwwICsxLDE1 NDYgQEAKPiArLyoKPiArICogRFJNIGJhc2VkIG1vZGUgc2V0dGluZyB0ZXN0IHByb2dyYW0KPiAr ICogQ29weXJpZ2h0IDIwMDggVHVuZ3N0ZW4gR3JhcGhpY3MKPiArICogICBKYWtvYiBCb3JuZWNy YW50eiA8amFrb2JAdHVuZ3N0ZW5ncmFwaGljcy5jb20+Cj4gKyAqIENvcHlyaWdodCAyMDA4IElu dGVsIENvcnBvcmF0aW9uCj4gKyAqICAgSmVzc2UgQmFybmVzIDxqZXNzZS5iYXJuZXNAaW50ZWwu Y29tPgo+ICsgKgo+ICsgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNo YXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQo+ICsgKiBjb3B5IG9mIHRoaXMgc29mdHdh cmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAo+ ICsgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRp bmcgd2l0aG91dCBsaW1pdGF0aW9uCj4gKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2Rp ZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAo+ICsgKiBhbmQvb3Ig c2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hv bSB0aGUKPiArICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRo ZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiArICoKPiArICogVGhlIGFib3ZlIGNvcHlyaWdodCBu b3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KPiAr ICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4g KyAqCj4gKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJB TlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQg Tk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+ICsgKiBG SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBO TyBFVkVOVCBTSEFMTCBUSEUKPiArICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBM SUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+ICsgKiBMSUFCSUxJVFksIFdI RVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lO Rwo+ICsgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBP UiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCj4gKyAqIElOIFRIRSBTT0ZUV0FSRS4KPiArICov Cj4gKwo+ICsvKgo+ICsgKiBUaGlzIGZhaXJseSBzaW1wbGUgdGVzdCBwcm9ncmFtIGR1bXBzIG91 dHB1dCBpbiBhIHNpbWlsYXIgZm9ybWF0IHRvIHRoZQo+ICsgKiAieHJhbmRyIiB0b29sIGV2ZXJ5 b25lIGtub3dzICYgbG92ZXMuICBJdCdzIG5lY2Vzc2FyaWx5IHNsaWdodGx5IGRpZmZlcmVudAo+ ICsgKiBzaW5jZSB0aGUga2VybmVsIHNlcGFyYXRlcyBvdXRwdXRzIGludG8gZW5jb2RlciBhbmQg Y29ubmVjdG9yIHN0cnVjdHVyZXMsCj4gKyAqIGVhY2ggd2l0aCB0aGVpciBvd24gdW5pcXVlIElE LiAgVGhlIHByb2dyYW0gYWxzbyBhbGxvd3MgdGVzdCB0ZXN0aW5nIG9mIHRoZQo+ICsgKiBtZW1v cnkgbWFuYWdlbWVudCBhbmQgbW9kZSBzZXR0aW5nIEFQSXMgYnkgYWxsb3dpbmcgdGhlIHVzZXIg dG8gc3BlY2lmeSBhCj4gKyAqIGNvbm5lY3RvciBhbmQgbW9kZSB0byB1c2UgZm9yIG1vZGUgc2V0 dGluZy4gIElmIGFsbCB3b3JrcyBhcyBleHBlY3RlZCwgYQo+ICsgKiBibHVlIGJhY2tncm91bmQg c2hvdWxkIGJlIHBhaW50ZWQgb24gdGhlIG1vbml0b3IgYXR0YWNoZWQgdG8gdGhlIHNwZWNpZmll ZAo+ICsgKiBjb25uZWN0b3IgYWZ0ZXIgdGhlIHNlbGVjdGVkIG1vZGUgaXMgc2V0Lgo+ICsgKgo+ ICsgKiBUT0RPOiB1c2UgY2Fpcm8gdG8gd3JpdGUgdGhlIG1vZGUgaW5mbyBvbiB0aGUgc2VsZWN0 ZWQgb3V0cHV0IG9uY2UKPiArICogICAgICAgdGhlIG1vZGUgaGFzIGJlZW4gcHJvZ3JhbW1lZCwg YWxvbmcgd2l0aCBwb3NzaWJsZSB0ZXN0IHBhdHRlcm5zLgo+ICsgKi8KPiArCj4gKyNpZmRlZiBI QVZFX0NPTkZJR19ICj4gKyNpbmNsdWRlICJjb25maWcuaCIKPiArI2VuZGlmCj4gKwo+ICsjaW5j bHVkZSA8YXNzZXJ0Lmg+Cj4gKyNpbmNsdWRlIDxjdHlwZS5oPgo+ICsjaW5jbHVkZSA8c3RkYm9v bC5oPgo+ICsjaW5jbHVkZSA8c3RkaW8uaD4KPiArI2luY2x1ZGUgPHN0ZGxpYi5oPgo+ICsjaW5j bHVkZSA8c3RkaW50Lmg+Cj4gKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgo+ICsjaW5jbHVkZSA8dW5p c3RkLmg+Cj4gKyNpbmNsdWRlIDxzdHJpbmcuaD4KPiArI2luY2x1ZGUgPHN0cmluZ3MuaD4KPiAr I2luY2x1ZGUgPGVycm5vLmg+Cj4gKyNpbmNsdWRlIDxwb2xsLmg+Cj4gKyNpbmNsdWRlIDxzeXMv dGltZS5oPgo+ICsjaWZkZWYgSEFWRV9TWVNfU0VMRUNUX0gKPiArI2luY2x1ZGUgPHN5cy9zZWxl Y3QuaD4KPiArI2VuZGlmCj4gKwo+ICsjaW5jbHVkZSAieGY4NmRybS5oIgo+ICsjaW5jbHVkZSAi eGY4NmRybU1vZGUuaCIKPiArI2luY2x1ZGUgImRybV9mb3VyY2MuaCIKPiArCj4gKyNpbmNsdWRl ICJ1dGlsL2NvbW1vbi5oIgo+ICsjaW5jbHVkZSAidXRpbC9mb3JtYXQuaCIKPiArI2luY2x1ZGUg InV0aWwva21zLmgiCj4gKyNpbmNsdWRlICJ1dGlsL3BhdHRlcm4uaCIKPiArCj4gKyNpbmNsdWRl ICJidWZmZXJzLmgiCj4gKwo+ICtzdHJ1Y3QgY3J0YyB7Cj4gKwlkcm1Nb2RlQ3J0YyAqY3J0YzsK PiArCWRybU1vZGVPYmplY3RQcm9wZXJ0aWVzICpwcm9wczsKPiArCWRybU1vZGVQcm9wZXJ0eVJl cyAqKnByb3BzX2luZm87Cj4gKwlkcm1Nb2RlTW9kZUluZm8gKm1vZGU7Cj4gK307Cj4gKwo+ICtz dHJ1Y3QgZW5jb2RlciB7Cj4gKwlkcm1Nb2RlRW5jb2RlciAqZW5jb2RlcjsKPiArfTsKPiArCj4g K3N0cnVjdCBjb25uZWN0b3Igewo+ICsJZHJtTW9kZUNvbm5lY3RvciAqY29ubmVjdG9yOwo+ICsJ ZHJtTW9kZU9iamVjdFByb3BlcnRpZXMgKnByb3BzOwo+ICsJZHJtTW9kZVByb3BlcnR5UmVzICoq cHJvcHNfaW5mbzsKPiArCWNoYXIgKm5hbWU7Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgZmIgewo+ICsJ ZHJtTW9kZUZCICpmYjsKPiArfTsKPiArCj4gK3N0cnVjdCBwbGFuZSB7Cj4gKwlkcm1Nb2RlUGxh bmUgKnBsYW5lOwo+ICsJZHJtTW9kZU9iamVjdFByb3BlcnRpZXMgKnByb3BzOwo+ICsJZHJtTW9k ZVByb3BlcnR5UmVzICoqcHJvcHNfaW5mbzsKPiArfTsKPiArCj4gK3N0cnVjdCByZXNvdXJjZXMg ewo+ICsJZHJtTW9kZVJlcyAqcmVzOwo+ICsJZHJtTW9kZVBsYW5lUmVzICpwbGFuZV9yZXM7Cj4g Kwo+ICsJc3RydWN0IGNydGMgKmNydGNzOwo+ICsJc3RydWN0IGVuY29kZXIgKmVuY29kZXJzOwo+ ICsJc3RydWN0IGNvbm5lY3RvciAqY29ubmVjdG9yczsKPiArCXN0cnVjdCBmYiAqZmJzOwo+ICsJ c3RydWN0IHBsYW5lICpwbGFuZXM7Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgZGV2aWNlIHsKPiArCWlu dCBmZDsKPiArCj4gKwlzdHJ1Y3QgcmVzb3VyY2VzICpyZXNvdXJjZXM7Cj4gKwlkcm1Nb2RlQXRv bWljUmVxICpyZXE7Cj4gK307Cj4gKwo+ICtzdGF0aWMgaW5saW5lIGludDY0X3QgVTY0Mkk2NCh1 aW50NjRfdCB2YWwpCj4gK3sKPiArCXJldHVybiAoaW50NjRfdCkqKChpbnQ2NF90ICopJnZhbCk7 Cj4gK30KPiArCj4gKyNkZWZpbmUgYml0X25hbWVfZm4ocmVzKQkJCQkJXAo+ICtjb25zdCBjaGFy ICogcmVzIyNfc3RyKGludCB0eXBlKSB7CQkJCVwKPiArCXVuc2lnbmVkIGludCBpOwkJCQkJCVwK PiArCWNvbnN0IGNoYXIgKnNlcCA9ICIiOwkJCQkJXAo+ICsJZm9yIChpID0gMDsgaSA8IEFSUkFZ X1NJWkUocmVzIyNfbmFtZXMpOyBpKyspIHsJCVwKPiArCQlpZiAodHlwZSAmICgxIDw8IGkpKSB7 CQkJCVwKPiArCQkJcHJpbnRmKCIlcyVzIiwgc2VwLCByZXMjI19uYW1lc1tpXSk7CVwKPiArCQkJ c2VwID0gIiwgIjsJCQkJXAo+ICsJCX0JCQkJCQlcCj4gKwl9CQkJCQkJCVwKPiArCXJldHVybiBO VUxMOwkJCQkJCVwKPiArfQo+ICsKPiArc3RhdGljIGNvbnN0IGNoYXIgKm1vZGVfdHlwZV9uYW1l c1tdID0gewo+ICsJImJ1aWx0aW4iLAo+ICsJImNsb2NrX2MiLAo+ICsJImNydGNfYyIsCj4gKwki cHJlZmVycmVkIiwKPiArCSJkZWZhdWx0IiwKPiArCSJ1c2VyZGVmIiwKPiArCSJkcml2ZXIiLAo+ ICt9Owo+ICsKPiArc3RhdGljIGJpdF9uYW1lX2ZuKG1vZGVfdHlwZSkKPiArCj4gK3N0YXRpYyBj b25zdCBjaGFyICptb2RlX2ZsYWdfbmFtZXNbXSA9IHsKPiArCSJwaHN5bmMiLAo+ICsJIm5oc3lu YyIsCj4gKwkicHZzeW5jIiwKPiArCSJudnN5bmMiLAo+ICsJImludGVybGFjZSIsCj4gKwkiZGJs c2NhbiIsCj4gKwkiY3N5bmMiLAo+ICsJInBjc3luYyIsCj4gKwkibmNzeW5jIiwKPiArCSJoc2tl dyIsCj4gKwkiYmNhc3QiLAo+ICsJInBpeG11eCIsCj4gKwkiZGJsY2xrIiwKPiArCSJjbGtkaXYy Igo+ICt9Owo+ICsKPiArc3RhdGljIGJpdF9uYW1lX2ZuKG1vZGVfZmxhZykKPiArCj4gK3N0YXRp YyB2b2lkIGR1bXBfZm91cmNjKHVpbnQzMl90IGZvdXJjYykKPiArewo+ICsJcHJpbnRmKCIgJWMl YyVjJWMiLAo+ICsJCWZvdXJjYywKPiArCQlmb3VyY2MgPj4gOCwKPiArCQlmb3VyY2MgPj4gMTYs Cj4gKwkJZm91cmNjID4+IDI0KTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgZHVtcF9lbmNvZGVy cyhzdHJ1Y3QgZGV2aWNlICpkZXYpCj4gK3sKPiArCWRybU1vZGVFbmNvZGVyICplbmNvZGVyOwo+ ICsJaW50IGk7Cj4gKwo+ICsJcHJpbnRmKCJFbmNvZGVyczpcbiIpOwo+ICsJcHJpbnRmKCJpZFx0 Y3J0Y1x0dHlwZVx0cG9zc2libGUgY3J0Y3NcdHBvc3NpYmxlIGNsb25lc1x0XG4iKTsKPiArCWZv ciAoaSA9IDA7IGkgPCBkZXYtPnJlc291cmNlcy0+cmVzLT5jb3VudF9lbmNvZGVyczsgaSsrKSB7 Cj4gKwkJZW5jb2RlciA9IGRldi0+cmVzb3VyY2VzLT5lbmNvZGVyc1tpXS5lbmNvZGVyOwo+ICsJ CWlmICghZW5jb2RlcikKPiArCQkJY29udGludWU7Cj4gKwo+ICsJCXByaW50ZigiJWRcdCVkXHQl c1x0MHglMDh4XHQweCUwOHhcbiIsCj4gKwkJICAgICAgIGVuY29kZXItPmVuY29kZXJfaWQsCj4g KwkJICAgICAgIGVuY29kZXItPmNydGNfaWQsCj4gKwkJICAgICAgIHV0aWxfbG9va3VwX2VuY29k ZXJfdHlwZV9uYW1lKGVuY29kZXItPmVuY29kZXJfdHlwZSksCj4gKwkJICAgICAgIGVuY29kZXIt PnBvc3NpYmxlX2NydGNzLAo+ICsJCSAgICAgICBlbmNvZGVyLT5wb3NzaWJsZV9jbG9uZXMpOwo+ ICsJfQo+ICsJcHJpbnRmKCJcbiIpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBkdW1wX21vZGUo ZHJtTW9kZU1vZGVJbmZvICptb2RlKQo+ICt7Cj4gKwlwcmludGYoIiAgJXMgJWQgJWQgJWQgJWQg JWQgJWQgJWQgJWQgJWQgJWQiLAo+ICsJICAgICAgIG1vZGUtPm5hbWUsCj4gKwkgICAgICAgbW9k ZS0+dnJlZnJlc2gsCj4gKwkgICAgICAgbW9kZS0+aGRpc3BsYXksCj4gKwkgICAgICAgbW9kZS0+ aHN5bmNfc3RhcnQsCj4gKwkgICAgICAgbW9kZS0+aHN5bmNfZW5kLAo+ICsJICAgICAgIG1vZGUt Pmh0b3RhbCwKPiArCSAgICAgICBtb2RlLT52ZGlzcGxheSwKPiArCSAgICAgICBtb2RlLT52c3lu Y19zdGFydCwKPiArCSAgICAgICBtb2RlLT52c3luY19lbmQsCj4gKwkgICAgICAgbW9kZS0+dnRv dGFsLAo+ICsJICAgICAgIG1vZGUtPmNsb2NrKTsKPiArCj4gKwlwcmludGYoIiBmbGFnczogIik7 Cj4gKwltb2RlX2ZsYWdfc3RyKG1vZGUtPmZsYWdzKTsKPiArCXByaW50ZigiOyB0eXBlOiAiKTsK PiArCW1vZGVfdHlwZV9zdHIobW9kZS0+dHlwZSk7Cj4gKwlwcmludGYoIlxuIik7Cj4gK30KPiAr Cj4gK3N0YXRpYyB2b2lkIGR1bXBfYmxvYihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVpbnQzMl90IGJs b2JfaWQpCj4gK3sKPiArCXVpbnQzMl90IGk7Cj4gKwl1bnNpZ25lZCBjaGFyICpibG9iX2RhdGE7 Cj4gKwlkcm1Nb2RlUHJvcGVydHlCbG9iUHRyIGJsb2I7Cj4gKwo+ICsJYmxvYiA9IGRybU1vZGVH ZXRQcm9wZXJ0eUJsb2IoZGV2LT5mZCwgYmxvYl9pZCk7Cj4gKwlpZiAoIWJsb2IpIHsKPiArCQlw cmludGYoIlxuIik7Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsKPiArCWJsb2JfZGF0YSA9IGJsb2It PmRhdGE7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IGJsb2ItPmxlbmd0aDsgaSsrKSB7Cj4gKwkJ aWYgKGkgJSAxNiA9PSAwKQo+ICsJCQlwcmludGYoIlxuXHRcdFx0Iik7Cj4gKwkJcHJpbnRmKCIl LjJoaHgiLCBibG9iX2RhdGFbaV0pOwo+ICsJfQo+ICsJcHJpbnRmKCJcbiIpOwo+ICsKPiArCWRy bU1vZGVGcmVlUHJvcGVydHlCbG9iKGJsb2IpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBkdW1w X3Byb3Aoc3RydWN0IGRldmljZSAqZGV2LCBkcm1Nb2RlUHJvcGVydHlQdHIgcHJvcCwKPiArCQkg ICAgICB1aW50MzJfdCBwcm9wX2lkLCB1aW50NjRfdCB2YWx1ZSkKPiArewo+ICsJaW50IGk7Cj4g KwlwcmludGYoIlx0JWQiLCBwcm9wX2lkKTsKPiArCWlmICghcHJvcCkgewo+ICsJCXByaW50Zigi XG4iKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJcHJpbnRmKCIgJXM6XG4iLCBwcm9wLT5u YW1lKTsKPiArCj4gKwlwcmludGYoIlx0XHRmbGFnczoiKTsKPiArCWlmIChwcm9wLT5mbGFncyAm IERSTV9NT0RFX1BST1BfUEVORElORykKPiArCQlwcmludGYoIiBwZW5kaW5nIik7Cj4gKwlpZiAo cHJvcC0+ZmxhZ3MgJiBEUk1fTU9ERV9QUk9QX0lNTVVUQUJMRSkKPiArCQlwcmludGYoIiBpbW11 dGFibGUiKTsKPiArCWlmIChkcm1fcHJvcGVydHlfdHlwZV9pcyhwcm9wLCBEUk1fTU9ERV9QUk9Q X1NJR05FRF9SQU5HRSkpCj4gKwkJcHJpbnRmKCIgc2lnbmVkIHJhbmdlIik7Cj4gKwlpZiAoZHJt X3Byb3BlcnR5X3R5cGVfaXMocHJvcCwgRFJNX01PREVfUFJPUF9SQU5HRSkpCj4gKwkJcHJpbnRm KCIgcmFuZ2UiKTsKPiArCWlmIChkcm1fcHJvcGVydHlfdHlwZV9pcyhwcm9wLCBEUk1fTU9ERV9Q Uk9QX0VOVU0pKQo+ICsJCXByaW50ZigiIGVudW0iKTsKPiArCWlmIChkcm1fcHJvcGVydHlfdHlw ZV9pcyhwcm9wLCBEUk1fTU9ERV9QUk9QX0JJVE1BU0spKQo+ICsJCXByaW50ZigiIGJpdG1hc2si KTsKPiArCWlmIChkcm1fcHJvcGVydHlfdHlwZV9pcyhwcm9wLCBEUk1fTU9ERV9QUk9QX0JMT0Ip KQo+ICsJCXByaW50ZigiIGJsb2IiKTsKPiArCWlmIChkcm1fcHJvcGVydHlfdHlwZV9pcyhwcm9w LCBEUk1fTU9ERV9QUk9QX09CSkVDVCkpCj4gKwkJcHJpbnRmKCIgb2JqZWN0Iik7Cj4gKwlwcmlu dGYoIlxuIik7Cj4gKwo+ICsJaWYgKGRybV9wcm9wZXJ0eV90eXBlX2lzKHByb3AsIERSTV9NT0RF X1BST1BfU0lHTkVEX1JBTkdFKSkgewo+ICsJCXByaW50ZigiXHRcdHZhbHVlczoiKTsKPiArCQlm b3IgKGkgPSAwOyBpIDwgcHJvcC0+Y291bnRfdmFsdWVzOyBpKyspCj4gKwkJCXByaW50ZigiICUi UFJJZDY0LCBVNjQySTY0KHByb3AtPnZhbHVlc1tpXSkpOwo+ICsJCXByaW50ZigiXG4iKTsKPiAr CX0KPiArCj4gKwlpZiAoZHJtX3Byb3BlcnR5X3R5cGVfaXMocHJvcCwgRFJNX01PREVfUFJPUF9S QU5HRSkpIHsKPiArCQlwcmludGYoIlx0XHR2YWx1ZXM6Iik7Cj4gKwkJZm9yIChpID0gMDsgaSA8 IHByb3AtPmNvdW50X3ZhbHVlczsgaSsrKQo+ICsJCQlwcmludGYoIiAlIlBSSXU2NCwgcHJvcC0+ dmFsdWVzW2ldKTsKPiArCQlwcmludGYoIlxuIik7Cj4gKwl9Cj4gKwo+ICsJaWYgKGRybV9wcm9w ZXJ0eV90eXBlX2lzKHByb3AsIERSTV9NT0RFX1BST1BfRU5VTSkpIHsKPiArCQlwcmludGYoIlx0 XHRlbnVtczoiKTsKPiArCQlmb3IgKGkgPSAwOyBpIDwgcHJvcC0+Y291bnRfZW51bXM7IGkrKykK PiArCQkJcHJpbnRmKCIgJXM9JWxsdSIsIHByb3AtPmVudW1zW2ldLm5hbWUsCj4gKwkJCSAgICAg ICBwcm9wLT5lbnVtc1tpXS52YWx1ZSk7Cj4gKwkJcHJpbnRmKCJcbiIpOwo+ICsJfSBlbHNlIGlm IChkcm1fcHJvcGVydHlfdHlwZV9pcyhwcm9wLCBEUk1fTU9ERV9QUk9QX0JJVE1BU0spKSB7Cj4g KwkJcHJpbnRmKCJcdFx0dmFsdWVzOiIpOwo+ICsJCWZvciAoaSA9IDA7IGkgPCBwcm9wLT5jb3Vu dF9lbnVtczsgaSsrKQo+ICsJCQlwcmludGYoIiAlcz0weCVsbHgiLCBwcm9wLT5lbnVtc1tpXS5u YW1lLAo+ICsJCQkgICAgICAgKDFMTCA8PCBwcm9wLT5lbnVtc1tpXS52YWx1ZSkpOwo+ICsJCXBy aW50ZigiXG4iKTsKPiArCX0gZWxzZSB7Cj4gKwkJYXNzZXJ0KHByb3AtPmNvdW50X2VudW1zID09 IDApOwo+ICsJfQo+ICsKPiArCWlmIChkcm1fcHJvcGVydHlfdHlwZV9pcyhwcm9wLCBEUk1fTU9E RV9QUk9QX0JMT0IpKSB7Cj4gKwkJcHJpbnRmKCJcdFx0YmxvYnM6XG4iKTsKPiArCQlmb3IgKGkg PSAwOyBpIDwgcHJvcC0+Y291bnRfYmxvYnM7IGkrKykKPiArCQkJZHVtcF9ibG9iKGRldiwgcHJv cC0+YmxvYl9pZHNbaV0pOwo+ICsJCXByaW50ZigiXG4iKTsKPiArCX0gZWxzZSB7Cj4gKwkJYXNz ZXJ0KHByb3AtPmNvdW50X2Jsb2JzID09IDApOwo+ICsJfQo+ICsKPiArCXByaW50ZigiXHRcdHZh bHVlOiIpOwo+ICsJaWYgKGRybV9wcm9wZXJ0eV90eXBlX2lzKHByb3AsIERSTV9NT0RFX1BST1Bf QkxPQikpCj4gKwkJZHVtcF9ibG9iKGRldiwgdmFsdWUpOwo+ICsJZWxzZSBpZiAoZHJtX3Byb3Bl cnR5X3R5cGVfaXMocHJvcCwgRFJNX01PREVfUFJPUF9TSUdORURfUkFOR0UpKQo+ICsJCXByaW50 ZigiICUiUFJJZDY0IlxuIiwgdmFsdWUpOwo+ICsJZWxzZQo+ICsJCXByaW50ZigiICUiUFJJdTY0 IlxuIiwgdmFsdWUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBkdW1wX2Nvbm5lY3RvcnMoc3Ry dWN0IGRldmljZSAqZGV2KQo+ICt7Cj4gKwlpbnQgaSwgajsKPiArCj4gKwlwcmludGYoIkNvbm5l Y3RvcnM6XG4iKTsKPiArCXByaW50ZigiaWRcdGVuY29kZXJcdHN0YXR1c1x0XHRuYW1lXHRcdHNp emUgKG1tKVx0bW9kZXNcdGVuY29kZXJzXG4iKTsKPiArCWZvciAoaSA9IDA7IGkgPCBkZXYtPnJl c291cmNlcy0+cmVzLT5jb3VudF9jb25uZWN0b3JzOyBpKyspIHsKPiArCQlzdHJ1Y3QgY29ubmVj dG9yICpfY29ubmVjdG9yID0gJmRldi0+cmVzb3VyY2VzLT5jb25uZWN0b3JzW2ldOwo+ICsJCWRy bU1vZGVDb25uZWN0b3IgKmNvbm5lY3RvciA9IF9jb25uZWN0b3ItPmNvbm5lY3RvcjsKPiArCQlp ZiAoIWNvbm5lY3RvcikKPiArCQkJY29udGludWU7Cj4gKwo+ICsJCXByaW50ZigiJWRcdCVkXHQl c1x0JS0xNXNcdCVkeCVkXHRcdCVkXHQiLAo+ICsJCSAgICAgICBjb25uZWN0b3ItPmNvbm5lY3Rv cl9pZCwKPiArCQkgICAgICAgY29ubmVjdG9yLT5lbmNvZGVyX2lkLAo+ICsJCSAgICAgICB1dGls X2xvb2t1cF9jb25uZWN0b3Jfc3RhdHVzX25hbWUoY29ubmVjdG9yLT5jb25uZWN0aW9uKSwKPiAr CQkgICAgICAgX2Nvbm5lY3Rvci0+bmFtZSwKPiArCQkgICAgICAgY29ubmVjdG9yLT5tbVdpZHRo LCBjb25uZWN0b3ItPm1tSGVpZ2h0LAo+ICsJCSAgICAgICBjb25uZWN0b3ItPmNvdW50X21vZGVz KTsKPiArCj4gKwkJZm9yIChqID0gMDsgaiA8IGNvbm5lY3Rvci0+Y291bnRfZW5jb2RlcnM7IGor KykKPiArCQkJcHJpbnRmKCIlcyVkIiwgaiA+IDAgPyAiLCAiIDogIiIsIGNvbm5lY3Rvci0+ZW5j b2RlcnNbal0pOwo+ICsJCXByaW50ZigiXG4iKTsKPiArCj4gKwkJaWYgKGNvbm5lY3Rvci0+Y291 bnRfbW9kZXMpIHsKPiArCQkJcHJpbnRmKCIgIG1vZGVzOlxuIik7Cj4gKwkJCXByaW50ZigiXHRu YW1lIHJlZnJlc2ggKEh6KSBoZGlzcCBoc3MgaHNlIGh0b3QgdmRpc3AgIgo+ICsJCQkgICAgICAg InZzcyB2c2UgdnRvdClcbiIpOwo+ICsJCQlmb3IgKGogPSAwOyBqIDwgY29ubmVjdG9yLT5jb3Vu dF9tb2RlczsgaisrKQo+ICsJCQkJZHVtcF9tb2RlKCZjb25uZWN0b3ItPm1vZGVzW2pdKTsKPiAr CQl9Cj4gKwo+ICsJCWlmIChfY29ubmVjdG9yLT5wcm9wcykgewo+ICsJCQlwcmludGYoIiAgcHJv cHM6XG4iKTsKPiArCQkJZm9yIChqID0gMDsgaiA8IChpbnQpX2Nvbm5lY3Rvci0+cHJvcHMtPmNv dW50X3Byb3BzOyBqKyspCj4gKwkJCQlkdW1wX3Byb3AoZGV2LCBfY29ubmVjdG9yLT5wcm9wc19p bmZvW2pdLAo+ICsJCQkJCSAgX2Nvbm5lY3Rvci0+cHJvcHMtPnByb3BzW2pdLAo+ICsJCQkJCSAg X2Nvbm5lY3Rvci0+cHJvcHMtPnByb3BfdmFsdWVzW2pdKTsKPiArCQl9Cj4gKwl9Cj4gKwlwcmlu dGYoIlxuIik7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGR1bXBfY3J0Y3Moc3RydWN0IGRldmlj ZSAqZGV2KQo+ICt7Cj4gKwlpbnQgaTsKPiArCXVpbnQzMl90IGo7Cj4gKwo+ICsJcHJpbnRmKCJD UlRDczpcbiIpOwo+ICsJcHJpbnRmKCJpZFx0ZmJcdHBvc1x0c2l6ZVxuIik7Cj4gKwlmb3IgKGkg PSAwOyBpIDwgZGV2LT5yZXNvdXJjZXMtPnJlcy0+Y291bnRfY3J0Y3M7IGkrKykgewo+ICsJCXN0 cnVjdCBjcnRjICpfY3J0YyA9ICZkZXYtPnJlc291cmNlcy0+Y3J0Y3NbaV07Cj4gKwkJZHJtTW9k ZUNydGMgKmNydGMgPSBfY3J0Yy0+Y3J0YzsKPiArCQlpZiAoIWNydGMpCj4gKwkJCWNvbnRpbnVl Owo+ICsKPiArCQlwcmludGYoIiVkXHQlZFx0KCVkLCVkKVx0KCVkeCVkKVxuIiwKPiArCQkgICAg ICAgY3J0Yy0+Y3J0Y19pZCwKPiArCQkgICAgICAgY3J0Yy0+YnVmZmVyX2lkLAo+ICsJCSAgICAg ICBjcnRjLT54LCBjcnRjLT55LAo+ICsJCSAgICAgICBjcnRjLT53aWR0aCwgY3J0Yy0+aGVpZ2h0 KTsKPiArCQlkdW1wX21vZGUoJmNydGMtPm1vZGUpOwo+ICsKPiArCQlpZiAoX2NydGMtPnByb3Bz KSB7Cj4gKwkJCXByaW50ZigiICBwcm9wczpcbiIpOwo+ICsJCQlmb3IgKGogPSAwOyBqIDwgX2Ny dGMtPnByb3BzLT5jb3VudF9wcm9wczsgaisrKQo+ICsJCQkJZHVtcF9wcm9wKGRldiwgX2NydGMt PnByb3BzX2luZm9bal0sCj4gKwkJCQkJICBfY3J0Yy0+cHJvcHMtPnByb3BzW2pdLAo+ICsJCQkJ CSAgX2NydGMtPnByb3BzLT5wcm9wX3ZhbHVlc1tqXSk7Cj4gKwkJfSBlbHNlIHsKPiArCQkJcHJp bnRmKCIgIG5vIHByb3BlcnRpZXMgZm91bmRcbiIpOwo+ICsJCX0KPiArCX0KPiArCXByaW50Zigi XG4iKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgZHVtcF9mcmFtZWJ1ZmZlcnMoc3RydWN0IGRl dmljZSAqZGV2KQo+ICt7Cj4gKwlkcm1Nb2RlRkIgKmZiOwo+ICsJaW50IGk7Cj4gKwo+ICsJcHJp bnRmKCJGcmFtZSBidWZmZXJzOlxuIik7Cj4gKwlwcmludGYoImlkXHRzaXplXHRwaXRjaFxuIik7 Cj4gKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5yZXNvdXJjZXMtPnJlcy0+Y291bnRfZmJzOyBpKysp IHsKPiArCQlmYiA9IGRldi0+cmVzb3VyY2VzLT5mYnNbaV0uZmI7Cj4gKwkJaWYgKCFmYikKPiAr CQkJY29udGludWU7Cj4gKwo+ICsJCXByaW50ZigiJXVcdCgldXgldSlcdCV1XG4iLAo+ICsJCSAg ICAgICBmYi0+ZmJfaWQsCj4gKwkJICAgICAgIGZiLT53aWR0aCwgZmItPmhlaWdodCwKPiArCQkg ICAgICAgZmItPnBpdGNoKTsKPiArCX0KPiArCXByaW50ZigiXG4iKTsKPiArfQo+ICsKPiArc3Rh dGljIHZvaWQgZHVtcF9wbGFuZXMoc3RydWN0IGRldmljZSAqZGV2KQo+ICt7Cj4gKwl1bnNpZ25l ZCBpbnQgaSwgajsKPiArCj4gKwlwcmludGYoIlBsYW5lczpcbiIpOwo+ICsJcHJpbnRmKCJpZFx0 Y3J0Y1x0ZmJcdENSVEMgeCx5XHR4LHlcdGdhbW1hIHNpemVcdHBvc3NpYmxlIGNydGNzXG4iKTsK PiArCj4gKwlpZiAoIWRldi0+cmVzb3VyY2VzLT5wbGFuZV9yZXMpCj4gKwkJcmV0dXJuOwo+ICsK PiArCWZvciAoaSA9IDA7IGkgPCBkZXYtPnJlc291cmNlcy0+cGxhbmVfcmVzLT5jb3VudF9wbGFu ZXM7IGkrKykgewo+ICsJCXN0cnVjdCBwbGFuZSAqcGxhbmUgPSAmZGV2LT5yZXNvdXJjZXMtPnBs YW5lc1tpXTsKPiArCQlkcm1Nb2RlUGxhbmUgKm92ciA9IHBsYW5lLT5wbGFuZTsKPiArCQlpZiAo IW92cikKPiArCQkJY29udGludWU7Cj4gKwo+ICsJCXByaW50ZigiJWRcdCVkXHQlZFx0JWQsJWRc dFx0JWQsJWRcdCUtOGRcdDB4JTA4eFxuIiwKPiArCQkgICAgICAgb3ZyLT5wbGFuZV9pZCwgb3Zy LT5jcnRjX2lkLCBvdnItPmZiX2lkLAo+ICsJCSAgICAgICBvdnItPmNydGNfeCwgb3ZyLT5jcnRj X3ksIG92ci0+eCwgb3ZyLT55LAo+ICsJCSAgICAgICBvdnItPmdhbW1hX3NpemUsIG92ci0+cG9z c2libGVfY3J0Y3MpOwo+ICsKPiArCQlpZiAoIW92ci0+Y291bnRfZm9ybWF0cykKPiArCQkJY29u dGludWU7Cj4gKwo+ICsJCXByaW50ZigiICBmb3JtYXRzOiIpOwo+ICsJCWZvciAoaiA9IDA7IGog PCBvdnItPmNvdW50X2Zvcm1hdHM7IGorKykKPiArCQkJZHVtcF9mb3VyY2Mob3ZyLT5mb3JtYXRz W2pdKTsKPiArCQlwcmludGYoIlxuIik7Cj4gKwo+ICsJCWlmIChwbGFuZS0+cHJvcHMpIHsKPiAr CQkJcHJpbnRmKCIgIHByb3BzOlxuIik7Cj4gKwkJCWZvciAoaiA9IDA7IGogPCBwbGFuZS0+cHJv cHMtPmNvdW50X3Byb3BzOyBqKyspCj4gKwkJCQlkdW1wX3Byb3AoZGV2LCBwbGFuZS0+cHJvcHNf aW5mb1tqXSwKPiArCQkJCQkgIHBsYW5lLT5wcm9wcy0+cHJvcHNbal0sCj4gKwkJCQkJICBwbGFu ZS0+cHJvcHMtPnByb3BfdmFsdWVzW2pdKTsKPiArCQl9IGVsc2Ugewo+ICsJCQlwcmludGYoIiAg bm8gcHJvcGVydGllcyBmb3VuZFxuIik7Cj4gKwkJfQo+ICsJfQo+ICsJcHJpbnRmKCJcbiIpOwo+ ICsKPiArCXJldHVybjsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgZnJlZV9yZXNvdXJjZXMoc3Ry dWN0IHJlc291cmNlcyAqcmVzKQo+ICt7Cj4gKwlpbnQgaTsKPiArCj4gKwlpZiAoIXJlcykKPiAr CQlyZXR1cm47Cj4gKwo+ICsjZGVmaW5lIGZyZWVfcmVzb3VyY2UoX3JlcywgX19yZXMsIHR5cGUs IFR5cGUpCQkJCQlcCj4gKwlkbyB7CQkJCQkJCQkJXAo+ICsJCWlmICghKF9yZXMpLT50eXBlIyNz KQkJCQkJCVwKPiArCQkJYnJlYWs7CQkJCQkJCVwKPiArCQlmb3IgKGkgPSAwOyBpIDwgKGludCko X3JlcyktPl9fcmVzLT5jb3VudF8jI3R5cGUjI3M7ICsraSkgewlcCj4gKwkJCWlmICghKF9yZXMp LT50eXBlIyNzW2ldLnR5cGUpCQkJCVwKPiArCQkJCWJyZWFrOwkJCQkJCVwKPiArCQkJZHJtTW9k ZUZyZWUjI1R5cGUoKF9yZXMpLT50eXBlIyNzW2ldLnR5cGUpOwkJXAo+ICsJCX0JCQkJCQkJCVwK PiArCQlmcmVlKChfcmVzKS0+dHlwZSMjcyk7CQkJCQkJXAo+ICsJfSB3aGlsZSAoMCkKPiArCj4g KyNkZWZpbmUgZnJlZV9wcm9wZXJ0aWVzKF9yZXMsIF9fcmVzLCB0eXBlKQkJCQkJXAo+ICsJZG8g ewkJCQkJCQkJCVwKPiArCQlmb3IgKGkgPSAwOyBpIDwgKGludCkoX3JlcyktPl9fcmVzLT5jb3Vu dF8jI3R5cGUjI3M7ICsraSkgewlcCj4gKwkJCWRybU1vZGVGcmVlT2JqZWN0UHJvcGVydGllcyhy ZXMtPnR5cGUjI3NbaV0ucHJvcHMpOwlcCj4gKwkJCWZyZWUocmVzLT50eXBlIyNzW2ldLnByb3Bz X2luZm8pOwkJCVwKPiArCQl9CQkJCQkJCQlcCj4gKwl9IHdoaWxlICgwKQo+ICsKPiArCWlmIChy ZXMtPnJlcykgewo+ICsJCWZyZWVfcHJvcGVydGllcyhyZXMsIHJlcywgY3J0Yyk7Cj4gKwo+ICsJ CWZyZWVfcmVzb3VyY2UocmVzLCByZXMsIGNydGMsIENydGMpOwo+ICsJCWZyZWVfcmVzb3VyY2Uo cmVzLCByZXMsIGVuY29kZXIsIEVuY29kZXIpOwo+ICsKPiArCQlmb3IgKGkgPSAwOyBpIDwgcmVz LT5yZXMtPmNvdW50X2Nvbm5lY3RvcnM7IGkrKykKPiArCQkJZnJlZShyZXMtPmNvbm5lY3RvcnNb aV0ubmFtZSk7Cj4gKwo+ICsJCWZyZWVfcmVzb3VyY2UocmVzLCByZXMsIGNvbm5lY3RvciwgQ29u bmVjdG9yKTsKPiArCQlmcmVlX3Jlc291cmNlKHJlcywgcmVzLCBmYiwgRkIpOwo+ICsKPiArCQlk cm1Nb2RlRnJlZVJlc291cmNlcyhyZXMtPnJlcyk7Cj4gKwl9Cj4gKwo+ICsJaWYgKHJlcy0+cGxh bmVfcmVzKSB7Cj4gKwkJZnJlZV9wcm9wZXJ0aWVzKHJlcywgcGxhbmVfcmVzLCBwbGFuZSk7Cj4g Kwo+ICsJCWZyZWVfcmVzb3VyY2UocmVzLCBwbGFuZV9yZXMsIHBsYW5lLCBQbGFuZSk7Cj4gKwo+ ICsJCWRybU1vZGVGcmVlUGxhbmVSZXNvdXJjZXMocmVzLT5wbGFuZV9yZXMpOwo+ICsJfQo+ICsK PiArCWZyZWUocmVzKTsKPiArfQo+ICsKPiArc3RhdGljIHN0cnVjdCByZXNvdXJjZXMgKmdldF9y ZXNvdXJjZXMoc3RydWN0IGRldmljZSAqZGV2KQo+ICt7Cj4gKwlzdHJ1Y3QgcmVzb3VyY2VzICpy ZXM7Cj4gKwlpbnQgaTsKPiArCj4gKwlyZXMgPSBjYWxsb2MoMSwgc2l6ZW9mKCpyZXMpKTsKPiAr CWlmIChyZXMgPT0gMCkKPiArCQlyZXR1cm4gTlVMTDsKPiArCj4gKwlkcm1TZXRDbGllbnRDYXAo ZGV2LT5mZCwgRFJNX0NMSUVOVF9DQVBfVU5JVkVSU0FMX1BMQU5FUywgMSk7Cj4gKwo+ICsJcmVz LT5yZXMgPSBkcm1Nb2RlR2V0UmVzb3VyY2VzKGRldi0+ZmQpOwo+ICsJaWYgKCFyZXMtPnJlcykg ewo+ICsJCWZwcmludGYoc3RkZXJyLCAiZHJtTW9kZUdldFJlc291cmNlcyBmYWlsZWQ6ICVzXG4i LAo+ICsJCQlzdHJlcnJvcihlcnJubykpOwo+ICsJCWdvdG8gZXJyb3I7Cj4gKwl9Cj4gKwo+ICsJ cmVzLT5jcnRjcyA9IGNhbGxvYyhyZXMtPnJlcy0+Y291bnRfY3J0Y3MsIHNpemVvZigqcmVzLT5j cnRjcykpOwo+ICsJcmVzLT5lbmNvZGVycyA9IGNhbGxvYyhyZXMtPnJlcy0+Y291bnRfZW5jb2Rl cnMsIHNpemVvZigqcmVzLT5lbmNvZGVycykpOwo+ICsJcmVzLT5jb25uZWN0b3JzID0gY2FsbG9j KHJlcy0+cmVzLT5jb3VudF9jb25uZWN0b3JzLCBzaXplb2YoKnJlcy0+Y29ubmVjdG9ycykpOwo+ ICsJcmVzLT5mYnMgPSBjYWxsb2MocmVzLT5yZXMtPmNvdW50X2Zicywgc2l6ZW9mKCpyZXMtPmZi cykpOwo+ICsKPiArCWlmICghcmVzLT5jcnRjcyB8fCAhcmVzLT5lbmNvZGVycyB8fCAhcmVzLT5j b25uZWN0b3JzIHx8ICFyZXMtPmZicykKPiArCQlnb3RvIGVycm9yOwo+ICsKPiArI2RlZmluZSBn ZXRfcmVzb3VyY2UoX3JlcywgX19yZXMsIHR5cGUsIFR5cGUpCQkJCQlcCj4gKwlkbyB7CQkJCQkJ CQkJXAo+ICsJCWZvciAoaSA9IDA7IGkgPCAoaW50KShfcmVzKS0+X19yZXMtPmNvdW50XyMjdHlw ZSMjczsgKytpKSB7CVwKPiArCQkJKF9yZXMpLT50eXBlIyNzW2ldLnR5cGUgPQkJCQlcCj4gKwkJ CQlkcm1Nb2RlR2V0IyNUeXBlKGRldi0+ZmQsIChfcmVzKS0+X19yZXMtPnR5cGUjI3NbaV0pOyBc Cj4gKwkJCWlmICghKF9yZXMpLT50eXBlIyNzW2ldLnR5cGUpCQkJCVwKPiArCQkJCWZwcmludGYo c3RkZXJyLCAiY291bGQgbm90IGdldCAlcyAlaTogJXNcbiIsCVwKPiArCQkJCQkjdHlwZSwgKF9y ZXMpLT5fX3Jlcy0+dHlwZSMjc1tpXSwJXAo+ICsJCQkJCXN0cmVycm9yKGVycm5vKSk7CQkJXAo+ ICsJCX0JCQkJCQkJCVwKPiArCX0gd2hpbGUgKDApCj4gKwo+ICsJZ2V0X3Jlc291cmNlKHJlcywg cmVzLCBjcnRjLCBDcnRjKTsKPiArCWdldF9yZXNvdXJjZShyZXMsIHJlcywgZW5jb2RlciwgRW5j b2Rlcik7Cj4gKwlnZXRfcmVzb3VyY2UocmVzLCByZXMsIGNvbm5lY3RvciwgQ29ubmVjdG9yKTsK PiArCWdldF9yZXNvdXJjZShyZXMsIHJlcywgZmIsIEZCKTsKPiArCj4gKwkvKiBTZXQgdGhlIG5h bWUgb2YgYWxsIGNvbm5lY3RvcnMgYmFzZWQgb24gdGhlIHR5cGUgbmFtZSBhbmQgdGhlIHBlci10 eXBlIElELiAqLwo+ICsJZm9yIChpID0gMDsgaSA8IHJlcy0+cmVzLT5jb3VudF9jb25uZWN0b3Jz OyBpKyspIHsKPiArCQlzdHJ1Y3QgY29ubmVjdG9yICpjb25uZWN0b3IgPSAmcmVzLT5jb25uZWN0 b3JzW2ldOwo+ICsJCWRybU1vZGVDb25uZWN0b3IgKmNvbm4gPSBjb25uZWN0b3ItPmNvbm5lY3Rv cjsKPiArCQlpbnQgbnVtOwo+ICsKPiArCQludW0gPSBhc3ByaW50ZigmY29ubmVjdG9yLT5uYW1l LCAiJXMtJXUiLAo+ICsJCQkgdXRpbF9sb29rdXBfY29ubmVjdG9yX3R5cGVfbmFtZShjb25uLT5j b25uZWN0b3JfdHlwZSksCj4gKwkJCSBjb25uLT5jb25uZWN0b3JfdHlwZV9pZCk7Cj4gKwkJaWYg KG51bSA8IDApCj4gKwkJCWdvdG8gZXJyb3I7Cj4gKwl9Cj4gKwo+ICsjZGVmaW5lIGdldF9wcm9w ZXJ0aWVzKF9yZXMsIF9fcmVzLCB0eXBlLCBUeXBlKQkJCQkJXAo+ICsJZG8gewkJCQkJCQkJCVwK PiArCQlmb3IgKGkgPSAwOyBpIDwgKGludCkoX3JlcyktPl9fcmVzLT5jb3VudF8jI3R5cGUjI3M7 ICsraSkgewlcCj4gKwkJCXN0cnVjdCB0eXBlICpvYmogPSAmcmVzLT50eXBlIyNzW2ldOwkJCVwK PiArCQkJdW5zaWduZWQgaW50IGo7CQkJCQkJXAo+ICsJCQlvYmotPnByb3BzID0JCQkJCQlcCj4g KwkJCQlkcm1Nb2RlT2JqZWN0R2V0UHJvcGVydGllcyhkZXYtPmZkLCBvYmotPnR5cGUtPnR5cGUj I19pZCwgXAo+ICsJCQkJCQkJICAgRFJNX01PREVfT0JKRUNUXyMjVHlwZSk7IFwKPiArCQkJaWYg KCFvYmotPnByb3BzKSB7CQkJCQlcCj4gKwkJCQlmcHJpbnRmKHN0ZGVyciwJCQkJCVwKPiArCQkJ CQkiY291bGQgbm90IGdldCAlcyAlaSBwcm9wZXJ0aWVzOiAlc1xuIiwgXAo+ICsJCQkJCSN0eXBl LCBvYmotPnR5cGUtPnR5cGUjI19pZCwJCVwKPiArCQkJCQlzdHJlcnJvcihlcnJubykpOwkJCVwK PiArCQkJCWNvbnRpbnVlOwkJCQkJXAo+ICsJCQl9CQkJCQkJCVwKPiArCQkJb2JqLT5wcm9wc19p bmZvID0gY2FsbG9jKG9iai0+cHJvcHMtPmNvdW50X3Byb3BzLAlcCj4gKwkJCQkJCSBzaXplb2Yo Km9iai0+cHJvcHNfaW5mbykpOwlcCj4gKwkJCWlmICghb2JqLT5wcm9wc19pbmZvKQkJCQkJXAo+ ICsJCQkJY29udGludWU7CQkJCQlcCj4gKwkJCWZvciAoaiA9IDA7IGogPCBvYmotPnByb3BzLT5j b3VudF9wcm9wczsgKytqKQkJXAo+ICsJCQkJb2JqLT5wcm9wc19pbmZvW2pdID0JCQkJXAo+ICsJ CQkJCWRybU1vZGVHZXRQcm9wZXJ0eShkZXYtPmZkLCBvYmotPnByb3BzLT5wcm9wc1tqXSk7IFwK PiArCQl9CQkJCQkJCQlcCj4gKwl9IHdoaWxlICgwKQo+ICsKPiArCWdldF9wcm9wZXJ0aWVzKHJl cywgcmVzLCBjcnRjLCBDUlRDKTsKPiArCWdldF9wcm9wZXJ0aWVzKHJlcywgcmVzLCBjb25uZWN0 b3IsIENPTk5FQ1RPUik7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IHJlcy0+cmVzLT5jb3VudF9j cnRjczsgKytpKQo+ICsJCXJlcy0+Y3J0Y3NbaV0ubW9kZSA9ICZyZXMtPmNydGNzW2ldLmNydGMt Pm1vZGU7Cj4gKwo+ICsJcmVzLT5wbGFuZV9yZXMgPSBkcm1Nb2RlR2V0UGxhbmVSZXNvdXJjZXMo ZGV2LT5mZCk7Cj4gKwlpZiAoIXJlcy0+cGxhbmVfcmVzKSB7Cj4gKwkJZnByaW50ZihzdGRlcnIs ICJkcm1Nb2RlR2V0UGxhbmVSZXNvdXJjZXMgZmFpbGVkOiAlc1xuIiwKPiArCQkJc3RyZXJyb3Io ZXJybm8pKTsKPiArCQlyZXR1cm4gcmVzOwo+ICsJfQo+ICsKPiArCXJlcy0+cGxhbmVzID0gY2Fs bG9jKHJlcy0+cGxhbmVfcmVzLT5jb3VudF9wbGFuZXMsIHNpemVvZigqcmVzLT5wbGFuZXMpKTsK PiArCWlmICghcmVzLT5wbGFuZXMpCj4gKwkJZ290byBlcnJvcjsKPiArCj4gKwlnZXRfcmVzb3Vy Y2UocmVzLCBwbGFuZV9yZXMsIHBsYW5lLCBQbGFuZSk7Cj4gKwlnZXRfcHJvcGVydGllcyhyZXMs IHBsYW5lX3JlcywgcGxhbmUsIFBMQU5FKTsKPiArCj4gKwlyZXR1cm4gcmVzOwo+ICsKPiArZXJy b3I6Cj4gKwlmcmVlX3Jlc291cmNlcyhyZXMpOwo+ICsJcmV0dXJuIE5VTEw7Cj4gK30KPiArCj4g K3N0YXRpYyBpbnQgZ2V0X2NydGNfaW5kZXgoc3RydWN0IGRldmljZSAqZGV2LCB1aW50MzJfdCBp ZCkKPiArewo+ICsJaW50IGk7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IGRldi0+cmVzb3VyY2Vz LT5yZXMtPmNvdW50X2NydGNzOyArK2kpIHsKPiArCQlkcm1Nb2RlQ3J0YyAqY3J0YyA9IGRldi0+ cmVzb3VyY2VzLT5jcnRjc1tpXS5jcnRjOwo+ICsJCWlmIChjcnRjICYmIGNydGMtPmNydGNfaWQg PT0gaWQpCj4gKwkJCXJldHVybiBpOwo+ICsJfQo+ICsKPiArCXJldHVybiAtMTsKPiArfQo+ICsK PiArc3RhdGljIGRybU1vZGVDb25uZWN0b3IgKmdldF9jb25uZWN0b3JfYnlfbmFtZShzdHJ1Y3Qg ZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUpCj4gK3sKPiArCXN0cnVjdCBjb25uZWN0b3Ig KmNvbm5lY3RvcjsKPiArCWludCBpOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBkZXYtPnJlc291 cmNlcy0+cmVzLT5jb3VudF9jb25uZWN0b3JzOyBpKyspIHsKPiArCQljb25uZWN0b3IgPSAmZGV2 LT5yZXNvdXJjZXMtPmNvbm5lY3RvcnNbaV07Cj4gKwo+ICsJCWlmIChzdHJjbXAoY29ubmVjdG9y LT5uYW1lLCBuYW1lKSA9PSAwKQo+ICsJCQlyZXR1cm4gY29ubmVjdG9yLT5jb25uZWN0b3I7Cj4g Kwl9Cj4gKwo+ICsJcmV0dXJuIE5VTEw7Cj4gK30KPiArCj4gK3N0YXRpYyBkcm1Nb2RlQ29ubmVj dG9yICpnZXRfY29ubmVjdG9yX2J5X2lkKHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDMyX3QgaWQp Cj4gK3sKPiArCWRybU1vZGVDb25uZWN0b3IgKmNvbm5lY3RvcjsKPiArCWludCBpOwo+ICsKPiAr CWZvciAoaSA9IDA7IGkgPCBkZXYtPnJlc291cmNlcy0+cmVzLT5jb3VudF9jb25uZWN0b3JzOyBp KyspIHsKPiArCQljb25uZWN0b3IgPSBkZXYtPnJlc291cmNlcy0+Y29ubmVjdG9yc1tpXS5jb25u ZWN0b3I7Cj4gKwkJaWYgKGNvbm5lY3RvciAmJiBjb25uZWN0b3ItPmNvbm5lY3Rvcl9pZCA9PSBp ZCkKPiArCQkJcmV0dXJuIGNvbm5lY3RvcjsKPiArCX0KPiArCj4gKwlyZXR1cm4gTlVMTDsKPiAr fQo+ICsKPiArc3RhdGljIGRybU1vZGVFbmNvZGVyICpnZXRfZW5jb2Rlcl9ieV9pZChzdHJ1Y3Qg ZGV2aWNlICpkZXYsIHVpbnQzMl90IGlkKQo+ICt7Cj4gKwlkcm1Nb2RlRW5jb2RlciAqZW5jb2Rl cjsKPiArCWludCBpOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBkZXYtPnJlc291cmNlcy0+cmVz LT5jb3VudF9lbmNvZGVyczsgaSsrKSB7Cj4gKwkJZW5jb2RlciA9IGRldi0+cmVzb3VyY2VzLT5l bmNvZGVyc1tpXS5lbmNvZGVyOwo+ICsJCWlmIChlbmNvZGVyICYmIGVuY29kZXItPmVuY29kZXJf aWQgPT0gaWQpCj4gKwkJCXJldHVybiBlbmNvZGVyOwo+ICsJfQo+ICsKPiArCXJldHVybiBOVUxM Owo+ICt9Cj4gKwo+ICsvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICsgKiBQaXBlcyBhbmQgcGxh bmVzCj4gKyAqLwo+ICsKPiArLyoKPiArICogTW9kZSBzZXR0aW5nIHdpdGggdGhlIGtlcm5lbCBp bnRlcmZhY2VzIGlzIGEgYml0IG9mIGEgY2hvcmUuCj4gKyAqIEZpcnN0IHlvdSBoYXZlIHRvIGZp bmQgdGhlIGNvbm5lY3RvciBpbiBxdWVzdGlvbiBhbmQgbWFrZSBzdXJlIHRoZQo+ICsgKiByZXF1 ZXN0ZWQgbW9kZSBpcyBhdmFpbGFibGUuCj4gKyAqIFRoZW4geW91IG5lZWQgdG8gZmluZCB0aGUg ZW5jb2RlciBhdHRhY2hlZCB0byB0aGF0IGNvbm5lY3RvciBzbyB5b3UKPiArICogY2FuIGJpbmQg aXQgd2l0aCBhIGZyZWUgY3J0Yy4KPiArICovCj4gK3N0cnVjdCBwaXBlX2FyZyB7Cj4gKwljb25z dCBjaGFyICoqY29uczsKPiArCXVpbnQzMl90ICpjb25faWRzOwo+ICsJdW5zaWduZWQgaW50IG51 bV9jb25zOwo+ICsJdWludDMyX3QgY3J0Y19pZDsKPiArCWNoYXIgbW9kZV9zdHJbNjRdOwo+ICsJ Y2hhciBmb3JtYXRfc3RyWzVdOwo+ICsJdW5zaWduZWQgaW50IHZyZWZyZXNoOwo+ICsJdW5zaWdu ZWQgaW50IGZvdXJjYzsKPiArCWRybU1vZGVNb2RlSW5mbyAqbW9kZTsKPiArCXN0cnVjdCBjcnRj ICpjcnRjOwo+ICsJdW5zaWduZWQgaW50IGZiX2lkWzJdLCBjdXJyZW50X2ZiX2lkOwo+ICsJc3Ry dWN0IHRpbWV2YWwgc3RhcnQ7Cj4gKwo+ICsJaW50IHN3YXBfY291bnQ7Cj4gK307Cj4gKwo+ICtz dHJ1Y3QgcGxhbmVfYXJnIHsKPiArCXVpbnQzMl90IHBsYW5lX2lkOyAgLyogdGhlIGlkIG9mIHBs YW5lIHRvIHVzZSAqLwo+ICsJdWludDMyX3QgY3J0Y19pZDsgIC8qIHRoZSBpZCBvZiBDUlRDIHRv IGJpbmQgdG8gKi8KPiArCWJvb2wgaGFzX3Bvc2l0aW9uOwo+ICsJaW50MzJfdCB4LCB5Owo+ICsJ dWludDMyX3QgdywgaDsKPiArCWRvdWJsZSBzY2FsZTsKPiArCXVuc2lnbmVkIGludCBmYl9pZDsK PiArCXVuc2lnbmVkIGludCBvbGRfZmJfaWQ7Cj4gKwlzdHJ1Y3QgYm8gKmJvOwo+ICsJc3RydWN0 IGJvICpvbGRfYm87Cj4gKwljaGFyIGZvcm1hdF9zdHJbNV07IC8qIG5lZWQgdG8gbGVhdmUgcm9v bSBmb3IgdGVybWluYXRpbmcgXDAgKi8KPiArCXVuc2lnbmVkIGludCBmb3VyY2M7Cj4gK307Cj4g Kwo+ICtzdGF0aWMgZHJtTW9kZU1vZGVJbmZvICoKPiArY29ubmVjdG9yX2ZpbmRfbW9kZShzdHJ1 Y3QgZGV2aWNlICpkZXYsIHVpbnQzMl90IGNvbl9pZCwgY29uc3QgY2hhciAqbW9kZV9zdHIsCj4g KyAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IHZyZWZyZXNoKQo+ICt7Cj4gKwlkcm1Nb2RlQ29u bmVjdG9yICpjb25uZWN0b3I7Cj4gKwlkcm1Nb2RlTW9kZUluZm8gKm1vZGU7Cj4gKwlpbnQgaTsK PiArCj4gKwljb25uZWN0b3IgPSBnZXRfY29ubmVjdG9yX2J5X2lkKGRldiwgY29uX2lkKTsKPiAr CWlmICghY29ubmVjdG9yIHx8ICFjb25uZWN0b3ItPmNvdW50X21vZGVzKQo+ICsJCXJldHVybiBO VUxMOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBjb25uZWN0b3ItPmNvdW50X21vZGVzOyBpKysp IHsKPiArCQltb2RlID0gJmNvbm5lY3Rvci0+bW9kZXNbaV07Cj4gKwkJaWYgKCFzdHJjbXAobW9k ZS0+bmFtZSwgbW9kZV9zdHIpKSB7Cj4gKwkJCS8qIElmIHRoZSB2ZXJ0aWNhbCByZWZyZXNoIGZy ZXF1ZW5jeSBpcyBub3Qgc3BlY2lmaWVkIHRoZW4gcmV0dXJuIHRoZQo+ICsJCQkgKiBmaXJzdCBt b2RlIHRoYXQgbWF0Y2ggd2l0aCB0aGUgbmFtZS4gRWxzZSwgcmV0dXJuIHRoZSBtb2RlIHRoYXQg bWF0Y2gKPiArCQkJICogdGhlIG5hbWUgYW5kIHRoZSBzcGVjaWZpZWQgdmVydGljYWwgcmVmcmVz aCBmcmVxdWVuY3kuCj4gKwkJCSAqLwo+ICsJCQlpZiAodnJlZnJlc2ggPT0gMCkKPiArCQkJCXJl dHVybiBtb2RlOwo+ICsJCQllbHNlIGlmIChtb2RlLT52cmVmcmVzaCA9PSB2cmVmcmVzaCkKPiAr CQkJCXJldHVybiBtb2RlOwo+ICsJCX0KPiArCX0KPiArCj4gKwlyZXR1cm4gTlVMTDsKPiArfQo+ ICsKPiArc3RhdGljIHN0cnVjdCBjcnRjICpwaXBlX2ZpbmRfY3J0YyhzdHJ1Y3QgZGV2aWNlICpk ZXYsIHN0cnVjdCBwaXBlX2FyZyAqcGlwZSkKPiArewo+ICsJdWludDMyX3QgcG9zc2libGVfY3J0 Y3MgPSB+MDsKPiArCXVpbnQzMl90IGFjdGl2ZV9jcnRjcyA9IDA7Cj4gKwl1bnNpZ25lZCBpbnQg Y3J0Y19pZHg7Cj4gKwl1bnNpZ25lZCBpbnQgaTsKPiArCWludCBqOwo+ICsKPiArCWZvciAoaSA9 IDA7IGkgPCBwaXBlLT5udW1fY29uczsgKytpKSB7Cj4gKwkJdWludDMyX3QgY3J0Y3NfZm9yX2Nv bm5lY3RvciA9IDA7Cj4gKwkJZHJtTW9kZUNvbm5lY3RvciAqY29ubmVjdG9yOwo+ICsJCWRybU1v ZGVFbmNvZGVyICplbmNvZGVyOwo+ICsJCWludCBpZHg7Cj4gKwo+ICsJCWNvbm5lY3RvciA9IGdl dF9jb25uZWN0b3JfYnlfaWQoZGV2LCBwaXBlLT5jb25faWRzW2ldKTsKPiArCQlpZiAoIWNvbm5l Y3RvcikKPiArCQkJcmV0dXJuIE5VTEw7Cj4gKwo+ICsJCWZvciAoaiA9IDA7IGogPCBjb25uZWN0 b3ItPmNvdW50X2VuY29kZXJzOyArK2opIHsKPiArCQkJZW5jb2RlciA9IGdldF9lbmNvZGVyX2J5 X2lkKGRldiwgY29ubmVjdG9yLT5lbmNvZGVyc1tqXSk7Cj4gKwkJCWlmICghZW5jb2RlcikKPiAr CQkJCWNvbnRpbnVlOwo+ICsKPiArCQkJY3J0Y3NfZm9yX2Nvbm5lY3RvciB8PSBlbmNvZGVyLT5w b3NzaWJsZV9jcnRjczsKPiArCj4gKwkJCWlkeCA9IGdldF9jcnRjX2luZGV4KGRldiwgZW5jb2Rl ci0+Y3J0Y19pZCk7Cj4gKwkJCWlmIChpZHggPj0gMCkKPiArCQkJCWFjdGl2ZV9jcnRjcyB8PSAx IDw8IGlkeDsKPiArCQl9Cj4gKwo+ICsJCXBvc3NpYmxlX2NydGNzICY9IGNydGNzX2Zvcl9jb25u ZWN0b3I7Cj4gKwl9Cj4gKwo+ICsJaWYgKCFwb3NzaWJsZV9jcnRjcykKPiArCQlyZXR1cm4gTlVM TDsKPiArCj4gKwkvKiBSZXR1cm4gdGhlIGZpcnN0IHBvc3NpYmxlIGFuZCBhY3RpdmUgQ1JUQyBp ZiBvbmUgZXhpc3RzLCBvciB0aGUgZmlyc3QKPiArCSAqIHBvc3NpYmxlIENSVEMgb3RoZXJ3aXNl Lgo+ICsJICovCj4gKwlpZiAocG9zc2libGVfY3J0Y3MgJiBhY3RpdmVfY3J0Y3MpCj4gKwkJY3J0 Y19pZHggPSBmZnMocG9zc2libGVfY3J0Y3MgJiBhY3RpdmVfY3J0Y3MpOwo+ICsJZWxzZQo+ICsJ CWNydGNfaWR4ID0gZmZzKHBvc3NpYmxlX2NydGNzKTsKPiArCj4gKwlyZXR1cm4gJmRldi0+cmVz b3VyY2VzLT5jcnRjc1tjcnRjX2lkeCAtIDFdOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHBpcGVf ZmluZF9jcnRjX2FuZF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBpcGVfYXJnICpw aXBlKQo+ICt7Cj4gKwlkcm1Nb2RlTW9kZUluZm8gKm1vZGUgPSBOVUxMOwo+ICsJaW50IGk7Cj4g Kwo+ICsJcGlwZS0+bW9kZSA9IE5VTEw7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IChpbnQpcGlw ZS0+bnVtX2NvbnM7IGkrKykgewo+ICsJCW1vZGUgPSBjb25uZWN0b3JfZmluZF9tb2RlKGRldiwg cGlwZS0+Y29uX2lkc1tpXSwKPiArCQkJCQkgICBwaXBlLT5tb2RlX3N0ciwgcGlwZS0+dnJlZnJl c2gpOwo+ICsJCWlmIChtb2RlID09IE5VTEwpIHsKPiArCQkJZnByaW50ZihzdGRlcnIsCj4gKwkJ CQkiZmFpbGVkIHRvIGZpbmQgbW9kZSBcIiVzXCIgZm9yIGNvbm5lY3RvciAlc1xuIiwKPiArCQkJ CXBpcGUtPm1vZGVfc3RyLCBwaXBlLT5jb25zW2ldKTsKPiArCQkJcmV0dXJuIC1FSU5WQUw7Cj4g KwkJfQo+ICsJfQo+ICsKPiArCS8qIElmIHRoZSBDUlRDIElEIHdhcyBzcGVjaWZpZWQsIGdldCB0 aGUgY29ycmVzcG9uZGluZyBDUlRDLiBPdGhlcndpc2UKPiArCSAqIGxvY2F0ZSBhIENSVEMgdGhh dCBjYW4gYmUgYXR0YWNoZWQgdG8gYWxsIHRoZSBjb25uZWN0b3JzLgo+ICsJICovCj4gKwlpZiAo cGlwZS0+Y3J0Y19pZCAhPSAodWludDMyX3QpLTEpIHsKPiArCQlmb3IgKGkgPSAwOyBpIDwgZGV2 LT5yZXNvdXJjZXMtPnJlcy0+Y291bnRfY3J0Y3M7IGkrKykgewo+ICsJCQlzdHJ1Y3QgY3J0YyAq Y3J0YyA9ICZkZXYtPnJlc291cmNlcy0+Y3J0Y3NbaV07Cj4gKwo+ICsJCQlpZiAocGlwZS0+Y3J0 Y19pZCA9PSBjcnRjLT5jcnRjLT5jcnRjX2lkKSB7Cj4gKwkJCQlwaXBlLT5jcnRjID0gY3J0YzsK PiArCQkJCWJyZWFrOwo+ICsJCQl9Cj4gKwkJfQo+ICsJfSBlbHNlIHsKPiArCQlwaXBlLT5jcnRj ID0gcGlwZV9maW5kX2NydGMoZGV2LCBwaXBlKTsKPiArCX0KPiArCj4gKwlpZiAoIXBpcGUtPmNy dGMpIHsKPiArCQlmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBmaW5kIENSVEMgZm9yIHBpcGVc biIpOwo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsJfQo+ICsKPiArCXBpcGUtPm1vZGUgPSBtb2Rl Owo+ICsJcGlwZS0+Y3J0Yy0+bW9kZSA9IG1vZGU7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiAr Cj4gKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gKyAqIFByb3BlcnRpZXMKPiArICovCj4gKwo+ ICtzdHJ1Y3QgcHJvcGVydHlfYXJnIHsKPiArCXVpbnQzMl90IG9ial9pZDsKPiArCXVpbnQzMl90 IG9ial90eXBlOwo+ICsJY2hhciBuYW1lW0RSTV9QUk9QX05BTUVfTEVOKzFdOwo+ICsJdWludDMy X3QgcHJvcF9pZDsKPiArCXVpbnQ2NF90IHZhbHVlOwo+ICt9Owo+ICsKPiArc3RhdGljIHZvaWQg c2V0X3Byb3BlcnR5KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHByb3BlcnR5X2FyZyAqcCkK PiArewo+ICsJZHJtTW9kZU9iamVjdFByb3BlcnRpZXMgKnByb3BzID0gTlVMTDsKPiArCWRybU1v ZGVQcm9wZXJ0eVJlcyAqKnByb3BzX2luZm8gPSBOVUxMOwo+ICsJY29uc3QgY2hhciAqb2JqX3R5 cGU7Cj4gKwlpbnQgcmV0Owo+ICsJaW50IGk7Cj4gKwo+ICsJcC0+b2JqX3R5cGUgPSAwOwo+ICsJ cC0+cHJvcF9pZCA9IDA7Cj4gKwo+ICsjZGVmaW5lIGZpbmRfb2JqZWN0KF9yZXMsIF9fcmVzLCB0 eXBlLCBUeXBlKQkJCQkJXAo+ICsJZG8gewkJCQkJCQkJCVwKPiArCQlmb3IgKGkgPSAwOyBpIDwg KGludCkoX3JlcyktPl9fcmVzLT5jb3VudF8jI3R5cGUjI3M7ICsraSkgewlcCj4gKwkJCXN0cnVj dCB0eXBlICpvYmogPSAmKF9yZXMpLT50eXBlIyNzW2ldOwkJCVwKPiArCQkJaWYgKG9iai0+dHlw ZS0+dHlwZSMjX2lkICE9IHAtPm9ial9pZCkJCQlcCj4gKwkJCQljb250aW51ZTsJCQkJCVwKPiAr CQkJcC0+b2JqX3R5cGUgPSBEUk1fTU9ERV9PQkpFQ1RfIyNUeXBlOwkJCVwKPiArCQkJb2JqX3R5 cGUgPSAjVHlwZTsJCQkJCVwKPiArCQkJcHJvcHMgPSBvYmotPnByb3BzOwkJCQkJXAo+ICsJCQlw cm9wc19pbmZvID0gb2JqLT5wcm9wc19pbmZvOwkJCQlcCj4gKwkJfQkJCQkJCQkJXAo+ICsJfSB3 aGlsZSgwKQkJCQkJCQkJXAo+ICsKPiArCWZpbmRfb2JqZWN0KGRldi0+cmVzb3VyY2VzLCByZXMs IGNydGMsIENSVEMpOwo+ICsJaWYgKHAtPm9ial90eXBlID09IDApCj4gKwkJZmluZF9vYmplY3Qo ZGV2LT5yZXNvdXJjZXMsIHJlcywgY29ubmVjdG9yLCBDT05ORUNUT1IpOwo+ICsJaWYgKHAtPm9i al90eXBlID09IDApCj4gKwkJZmluZF9vYmplY3QoZGV2LT5yZXNvdXJjZXMsIHBsYW5lX3Jlcywg cGxhbmUsIFBMQU5FKTsKPiArCWlmIChwLT5vYmpfdHlwZSA9PSAwKSB7Cj4gKwkJZnByaW50Zihz dGRlcnIsICJPYmplY3QgJWkgbm90IGZvdW5kLCBjYW4ndCBzZXQgcHJvcGVydHlcbiIsCj4gKwkJ CXAtPm9ial9pZCk7Cj4gKwkJCXJldHVybjsKPiArCX0KPiArCj4gKwlpZiAoIXByb3BzKSB7Cj4g KwkJZnByaW50ZihzdGRlcnIsICIlcyAlaSBoYXMgbm8gcHJvcGVydGllc1xuIiwKPiArCQkJb2Jq X3R5cGUsIHAtPm9ial9pZCk7Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsKPiArCWZvciAoaSA9IDA7 IGkgPCAoaW50KXByb3BzLT5jb3VudF9wcm9wczsgKytpKSB7Cj4gKwkJaWYgKCFwcm9wc19pbmZv W2ldKQo+ICsJCQljb250aW51ZTsKPiArCQlpZiAoc3RyY21wKHByb3BzX2luZm9baV0tPm5hbWUs IHAtPm5hbWUpID09IDApCj4gKwkJCWJyZWFrOwo+ICsJfQo+ICsKPiArCWlmIChpID09IChpbnQp cHJvcHMtPmNvdW50X3Byb3BzKSB7Cj4gKwkJZnByaW50ZihzdGRlcnIsICIlcyAlaSBoYXMgbm8g JXMgcHJvcGVydHlcbiIsCj4gKwkJCW9ial90eXBlLCBwLT5vYmpfaWQsIHAtPm5hbWUpOwo+ICsJ CXJldHVybjsKPiArCX0KPiArCj4gKwlwLT5wcm9wX2lkID0gcHJvcHMtPnByb3BzW2ldOwo+ICsK PiArCXJldCA9IGRybU1vZGVBdG9taWNBZGRQcm9wZXJ0eShkZXYtPnJlcSwgcC0+b2JqX2lkLCBw LT5wcm9wX2lkLCBwLT52YWx1ZSk7Cj4gKwlpZiAocmV0IDwgMCkKPiArCQlmcHJpbnRmKHN0ZGVy ciwgImZhaWxlZCB0byBzZXQgJXMgJWkgcHJvcGVydHkgJXMgdG8gJSIgUFJJdTY0ICI6ICVzXG4i LAo+ICsJCQlvYmpfdHlwZSwgcC0+b2JqX2lkLCBwLT5uYW1lLCBwLT52YWx1ZSwgc3RyZXJyb3Io ZXJybm8pKTsKPiArfQo+ICsKPiArLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KPiArCj4gKy8qc3Rh dGljIGJvb2wgZm9ybWF0X3N1cHBvcnQoY29uc3QgZHJtTW9kZVBsYW5lUHRyIG92ciwgdWludDMy X3QgZm10KQo+ICt7Cj4gKwl1bnNpZ25lZCBpbnQgaTsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwg b3ZyLT5jb3VudF9mb3JtYXRzOyArK2kpIHsKPiArCQlpZiAob3ZyLT5mb3JtYXRzW2ldID09IGZt dCkKPiArCQkJcmV0dXJuIHRydWU7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIGZhbHNlOwo+ICt9Ki8K PiArCj4gK3N0YXRpYyB2b2lkIGFkZF9wcm9wZXJ0eShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVpbnQz Ml90IG9ial9pZCwKPiArCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQ2NF90IHZhbHVl KQo+ICt7Cj4gKwlzdHJ1Y3QgcHJvcGVydHlfYXJnIHA7Cj4gKwo+ICsJcC5vYmpfaWQgPSBvYmpf aWQ7Cj4gKwlzdHJjcHkocC5uYW1lLCBuYW1lKTsKPiArCXAudmFsdWUgPSB2YWx1ZTsKPiArCj4g KwlzZXRfcHJvcGVydHkoZGV2LCAmcCk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgc2V0X3BsYW5l KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBsYW5lX2FyZyAqcCwKPiArCQkgICAgIGludCBw YXR0ZXJuLCBib29sIHVwZGF0ZSkKPiArewo+ICsJdWludDMyX3QgaGFuZGxlc1s0XSA9IHswfSwg cGl0Y2hlc1s0XSA9IHswfSwgb2Zmc2V0c1s0XSA9IHswfTsKPiArCXN0cnVjdCBibyAqcGxhbmVf Ym87Cj4gKwlpbnQgY3J0Y194LCBjcnRjX3ksIGNydGNfdywgY3J0Y19oOwo+ICsJc3RydWN0IGNy dGMgKmNydGMgPSBOVUxMOwo+ICsJdW5zaWduZWQgaW50IGk7Cj4gKwl1bnNpZ25lZCBpbnQgb2xk X2ZiX2lkOwo+ICsKPiArCS8qIEZpbmQgYW4gdW51c2VkIHBsYW5lIHdoaWNoIGNhbiBiZSBjb25u ZWN0ZWQgdG8gb3VyIENSVEMuIEZpbmQgdGhlCj4gKwkgKiBDUlRDIGluZGV4IGZpcnN0LCB0aGVu IGl0ZXJhdGUgb3ZlciBhdmFpbGFibGUgcGxhbmVzLgo+ICsJICovCj4gKwlmb3IgKGkgPSAwOyBp IDwgKHVuc2lnbmVkIGludClkZXYtPnJlc291cmNlcy0+cmVzLT5jb3VudF9jcnRjczsgaSsrKSB7 Cj4gKwkJaWYgKHAtPmNydGNfaWQgPT0gZGV2LT5yZXNvdXJjZXMtPnJlcy0+Y3J0Y3NbaV0pIHsK PiArCQkJY3J0YyA9ICZkZXYtPnJlc291cmNlcy0+Y3J0Y3NbaV07Cj4gKwkJCWJyZWFrOwo+ICsJ CX0KPiArCX0KPiArCj4gKwlpZiAoIWNydGMpIHsKPiArCQlmcHJpbnRmKHN0ZGVyciwgIkNSVEMg JXUgbm90IGZvdW5kXG4iLCBwLT5jcnRjX2lkKTsKPiArCQlyZXR1cm4gLTE7Cj4gKwl9Cj4gKwo+ ICsJaWYgKCF1cGRhdGUpCj4gKwkJZnByaW50ZihzdGRlcnIsICJ0ZXN0aW5nICVkeCVkQCVzIG9u IHBsYW5lICV1LCBjcnRjICV1XG4iLAo+ICsJCQlwLT53LCBwLT5oLCBwLT5mb3JtYXRfc3RyLCBw LT5wbGFuZV9pZCwgcC0+Y3J0Y19pZCk7Cj4gKwo+ICsJcGxhbmVfYm8gPSBwLT5vbGRfYm87Cj4g KwlwLT5vbGRfYm8gPSBwLT5ibzsKPiArCj4gKwlpZiAoIXBsYW5lX2JvKSB7Cj4gKwkJcGxhbmVf Ym8gPSBib19jcmVhdGUoZGV2LT5mZCwgcC0+Zm91cmNjLCBwLT53LCBwLT5oLAo+ICsJCQkJICAg ICBoYW5kbGVzLCBwaXRjaGVzLCBvZmZzZXRzLCBwYXR0ZXJuKTsKPiArCj4gKwkJaWYgKHBsYW5l X2JvID09IE5VTEwpCj4gKwkJCXJldHVybiAtMTsKPiArCj4gKwkJaWYgKGRybU1vZGVBZGRGQjIo ZGV2LT5mZCwgcC0+dywgcC0+aCwgcC0+Zm91cmNjLAo+ICsJCQloYW5kbGVzLCBwaXRjaGVzLCBv ZmZzZXRzLCAmcC0+ZmJfaWQsIDApKSB7Cj4gKwkJCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRv IGFkZCBmYjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Cj4gKwkJCXJldHVybiAtMTsKPiArCQl9 Cj4gKwl9Cj4gKwo+ICsJcC0+Ym8gPSBwbGFuZV9ibzsKPiArCj4gKwlvbGRfZmJfaWQgPSBwLT5m Yl9pZDsKPiArCXAtPm9sZF9mYl9pZCA9IG9sZF9mYl9pZDsKPiArCj4gKwljcnRjX3cgPSBwLT53 ICogcC0+c2NhbGU7Cj4gKwljcnRjX2ggPSBwLT5oICogcC0+c2NhbGU7Cj4gKwlpZiAoIXAtPmhh c19wb3NpdGlvbikgewo+ICsJCS8qIERlZmF1bHQgdG8gdGhlIG1pZGRsZSBvZiB0aGUgc2NyZWVu ICovCj4gKwkJY3J0Y194ID0gKGNydGMtPm1vZGUtPmhkaXNwbGF5IC0gY3J0Y193KSAvIDI7Cj4g KwkJY3J0Y195ID0gKGNydGMtPm1vZGUtPnZkaXNwbGF5IC0gY3J0Y19oKSAvIDI7Cj4gKwl9IGVs c2Ugewo+ICsJCWNydGNfeCA9IHAtPng7Cj4gKwkJY3J0Y195ID0gcC0+eTsKPiArCX0KPiArCj4g KwlhZGRfcHJvcGVydHkoZGV2LCBwLT5wbGFuZV9pZCwgIkZCX0lEIiwgcC0+ZmJfaWQpOwo+ICsJ YWRkX3Byb3BlcnR5KGRldiwgcC0+cGxhbmVfaWQsICJDUlRDX0lEIiwgcC0+Y3J0Y19pZCk7Cj4g KwlhZGRfcHJvcGVydHkoZGV2LCBwLT5wbGFuZV9pZCwgIlNSQ19YIiwgMCk7Cj4gKwlhZGRfcHJv cGVydHkoZGV2LCBwLT5wbGFuZV9pZCwgIlNSQ19ZIiwgMCk7Cj4gKwlhZGRfcHJvcGVydHkoZGV2 LCBwLT5wbGFuZV9pZCwgIlNSQ19XIiwgcC0+dyA8PCAxNik7Cj4gKwlhZGRfcHJvcGVydHkoZGV2 LCBwLT5wbGFuZV9pZCwgIlNSQ19IIiwgcC0+aCA8PCAxNik7Cj4gKwlhZGRfcHJvcGVydHkoZGV2 LCBwLT5wbGFuZV9pZCwgIkNSVENfWCIsIGNydGNfeCk7Cj4gKwlhZGRfcHJvcGVydHkoZGV2LCBw LT5wbGFuZV9pZCwgIkNSVENfWSIsIGNydGNfeSk7Cj4gKwlhZGRfcHJvcGVydHkoZGV2LCBwLT5w bGFuZV9pZCwgIkNSVENfVyIsIGNydGNfdyk7Cj4gKwlhZGRfcHJvcGVydHkoZGV2LCBwLT5wbGFu ZV9pZCwgIkNSVENfSCIsIGNydGNfaCk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0 YXRpYyB2b2lkIHNldF9wbGFuZXMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGxhbmVfYXJn ICpwLAo+ICsJCSAgICAgICB1bnNpZ25lZCBpbnQgY291bnQsIGJvb2wgdXBkYXRlKQo+ICt7Cj4g Kwl1bnNpZ25lZCBpbnQgaSwgcGF0dGVybiA9IFVUSUxfUEFUVEVSTl9TTVBURTsKPiArCj4gKwkv KiBzZXQgdXAgcGxhbmVzICovCj4gKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewo+ICsJ CWlmIChpID4gMCkKPiArCQkJcGF0dGVybiA9IFVUSUxfUEFUVEVSTl9USUxFUzsKPiArCj4gKwkJ aWYgKHNldF9wbGFuZShkZXYsICZwW2ldLCBwYXR0ZXJuLCB1cGRhdGUpKQo+ICsJCQlyZXR1cm47 Cj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGNsZWFyX3BsYW5lcyhzdHJ1Y3QgZGV2aWNl ICpkZXYsIHN0cnVjdCBwbGFuZV9hcmcgKnAsIHVuc2lnbmVkIGludCBjb3VudCkKPiArewo+ICsJ dW5zaWduZWQgaW50IGk7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKPiAr CQlhZGRfcHJvcGVydHkoZGV2LCBwW2ldLnBsYW5lX2lkLCAiRkJfSUQiLCAwKTsKPiArCQlhZGRf cHJvcGVydHkoZGV2LCBwW2ldLnBsYW5lX2lkLCAiQ1JUQ19JRCIsIDApOwo+ICsJCWFkZF9wcm9w ZXJ0eShkZXYsIHBbaV0ucGxhbmVfaWQsICJTUkNfWCIsIDApOwo+ICsJCWFkZF9wcm9wZXJ0eShk ZXYsIHBbaV0ucGxhbmVfaWQsICJTUkNfWSIsIDApOwo+ICsJCWFkZF9wcm9wZXJ0eShkZXYsIHBb aV0ucGxhbmVfaWQsICJTUkNfVyIsIDApOwo+ICsJCWFkZF9wcm9wZXJ0eShkZXYsIHBbaV0ucGxh bmVfaWQsICJTUkNfSCIsIDApOwo+ICsJCWFkZF9wcm9wZXJ0eShkZXYsIHBbaV0ucGxhbmVfaWQs ICJDUlRDX1giLCAwKTsKPiArCQlhZGRfcHJvcGVydHkoZGV2LCBwW2ldLnBsYW5lX2lkLCAiQ1JU Q19ZIiwgMCk7Cj4gKwkJYWRkX3Byb3BlcnR5KGRldiwgcFtpXS5wbGFuZV9pZCwgIkNSVENfVyIs IDApOwo+ICsJCWFkZF9wcm9wZXJ0eShkZXYsIHBbaV0ucGxhbmVfaWQsICJDUlRDX0giLCAwKTsK PiArCX0KPiArfQo+ICsKPiArc3RhdGljIHZvaWQgY2xlYXJfRkIoc3RydWN0IGRldmljZSAqZGV2 LCBzdHJ1Y3QgcGxhbmVfYXJnICpwLCB1bnNpZ25lZCBpbnQgY291bnQpCj4gK3sKPiArCXVuc2ln bmVkIGludCBpOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Cj4gKwkJaWYg KHBbaV0uZmJfaWQpIHsKPiArCQkJZHJtTW9kZVJtRkIoZGV2LT5mZCwgcFtpXS5mYl9pZCk7Cj4g KwkJCXBbaV0uZmJfaWQgPSAwOwo+ICsJCX0KPiArCQlpZiAocFtpXS5vbGRfZmJfaWQpIHsKPiAr CQkJZHJtTW9kZVJtRkIoZGV2LT5mZCwgcFtpXS5vbGRfZmJfaWQpOwo+ICsJCQlwW2ldLm9sZF9m Yl9pZCA9IDA7Cj4gKwkJfQo+ICsJCWlmIChwW2ldLmJvKSB7Cj4gKwkJCWJvX2Rlc3Ryb3kocFtp XS5ibyk7Cj4gKwkJCXBbaV0uYm8gPSBOVUxMOwo+ICsJCX0KPiArCQlpZiAocFtpXS5vbGRfYm8p IHsKPiArCQkJYm9fZGVzdHJveShwW2ldLm9sZF9ibyk7Cj4gKwkJCXBbaV0ub2xkX2JvID0gTlVM TDsKPiArCQl9Cj4gKwo+ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBzZXRfbW9kZShzdHJ1 Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwaXBlX2FyZyAqcGlwZXMsIHVuc2lnbmVkIGludCBjb3Vu dCkKPiArewo+ICsJdW5zaWduZWQgaW50IGk7Cj4gKwl1bnNpZ25lZCBpbnQgajsKPiArCWludCBy ZXQ7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKPiArCQlzdHJ1Y3QgcGlw ZV9hcmcgKnBpcGUgPSAmcGlwZXNbaV07Cj4gKwo+ICsJCXJldCA9IHBpcGVfZmluZF9jcnRjX2Fu ZF9tb2RlKGRldiwgcGlwZSk7Cj4gKwkJaWYgKHJldCA8IDApCj4gKwkJCWNvbnRpbnVlOwo+ICsJ fQo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Cj4gKwkJc3RydWN0IHBpcGVf YXJnICpwaXBlID0gJnBpcGVzW2ldOwo+ICsJCXVpbnQzMl90IGJsb2JfaWQ7Cj4gKwo+ICsJCWlm IChwaXBlLT5tb2RlID09IE5VTEwpCj4gKwkJCWNvbnRpbnVlOwo+ICsKPiArCQlwcmludGYoInNl dHRpbmcgbW9kZSAlcy0lZEh6QCVzIG9uIGNvbm5lY3RvcnMgIiwKPiArCQkgICAgICAgcGlwZS0+ bW9kZV9zdHIsIHBpcGUtPm1vZGUtPnZyZWZyZXNoLCBwaXBlLT5mb3JtYXRfc3RyKTsKPiArCQlm b3IgKGogPSAwOyBqIDwgcGlwZS0+bnVtX2NvbnM7ICsraikgewo+ICsJCQlwcmludGYoIiVzLCAi LCBwaXBlLT5jb25zW2pdKTsKPiArCQkJYWRkX3Byb3BlcnR5KGRldiwgcGlwZS0+Y29uX2lkc1tq XSwgIkNSVENfSUQiLCBwaXBlLT5jcnRjLT5jcnRjLT5jcnRjX2lkKTsKPiArCQl9Cj4gKwkJcHJp bnRmKCJjcnRjICVkXG4iLCBwaXBlLT5jcnRjLT5jcnRjLT5jcnRjX2lkKTsKPiArCj4gKwkJZHJt TW9kZUNyZWF0ZVByb3BlcnR5QmxvYihkZXYtPmZkLCBwaXBlLT5tb2RlLCBzaXplb2YoKnBpcGUt Pm1vZGUpLCAmYmxvYl9pZCk7Cj4gKwkJYWRkX3Byb3BlcnR5KGRldiwgcGlwZS0+Y3J0Yy0+Y3J0 Yy0+Y3J0Y19pZCwgIk1PREVfSUQiLCBibG9iX2lkKTsKPiArCQlhZGRfcHJvcGVydHkoZGV2LCBw aXBlLT5jcnRjLT5jcnRjLT5jcnRjX2lkLCAiQUNUSVZFIiwgMSk7Cj4gKwl9Cj4gK30KPiArCj4g K3N0YXRpYyB2b2lkIGNsZWFyX21vZGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGlwZV9h cmcgKnBpcGVzLCB1bnNpZ25lZCBpbnQgY291bnQpCj4gK3sKPiArCXVuc2lnbmVkIGludCBpOwo+ ICsJdW5zaWduZWQgaW50IGo7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsK PiArCQlzdHJ1Y3QgcGlwZV9hcmcgKnBpcGUgPSAmcGlwZXNbaV07Cj4gKwo+ICsJCWlmIChwaXBl LT5tb2RlID09IE5VTEwpCj4gKwkJCWNvbnRpbnVlOwo+ICsKPiArCQlmb3IgKGogPSAwOyBqIDwg cGlwZS0+bnVtX2NvbnM7ICsraikKPiArCQkJYWRkX3Byb3BlcnR5KGRldiwgcGlwZS0+Y29uX2lk c1tqXSwgIkNSVENfSUQiLDApOwo+ICsKPiArCQlhZGRfcHJvcGVydHkoZGV2LCBwaXBlLT5jcnRj LT5jcnRjLT5jcnRjX2lkLCAiTU9ERV9JRCIsIDApOwo+ICsJCWFkZF9wcm9wZXJ0eShkZXYsIHBp cGUtPmNydGMtPmNydGMtPmNydGNfaWQsICJBQ1RJVkUiLCAwKTsKPiArCX0KPiArCj4gK30KPiAr Cj4gKyNkZWZpbmUgbWluKGEsIGIpCSgoYSkgPCAoYikgPyAoYSkgOiAoYikpCj4gKwo+ICtzdGF0 aWMgaW50IHBhcnNlX2Nvbm5lY3RvcihzdHJ1Y3QgcGlwZV9hcmcgKnBpcGUsIGNvbnN0IGNoYXIg KmFyZykKPiArewo+ICsJdW5zaWduZWQgaW50IGxlbjsKPiArCXVuc2lnbmVkIGludCBpOwo+ICsJ Y29uc3QgY2hhciAqcDsKPiArCWNoYXIgKmVuZHA7Cj4gKwo+ICsJcGlwZS0+dnJlZnJlc2ggPSAw Owo+ICsJcGlwZS0+Y3J0Y19pZCA9ICh1aW50MzJfdCktMTsKPiArCXN0cmNweShwaXBlLT5mb3Jt YXRfc3RyLCAiWFIyNCIpOwo+ICsKPiArCS8qIENvdW50IHRoZSBudW1iZXIgb2YgY29ubmVjdG9y cyBhbmQgYWxsb2NhdGUgdGhlbS4gKi8KPiArCXBpcGUtPm51bV9jb25zID0gMTsKPiArCWZvciAo cCA9IGFyZzsgKnAgJiYgKnAgIT0gJzonICYmICpwICE9ICdAJzsgKytwKSB7Cj4gKwkJaWYgKCpw ID09ICcsJykKPiArCQkJcGlwZS0+bnVtX2NvbnMrKzsKPiArCX0KPiArCj4gKwlwaXBlLT5jb25f aWRzID0gY2FsbG9jKHBpcGUtPm51bV9jb25zLCBzaXplb2YoKnBpcGUtPmNvbl9pZHMpKTsKPiAr CXBpcGUtPmNvbnMgPSBjYWxsb2MocGlwZS0+bnVtX2NvbnMsIHNpemVvZigqcGlwZS0+Y29ucykp Owo+ICsJaWYgKHBpcGUtPmNvbl9pZHMgPT0gTlVMTCB8fCBwaXBlLT5jb25zID09IE5VTEwpCj4g KwkJcmV0dXJuIC0xOwo+ICsKPiArCS8qIFBhcnNlIHRoZSBjb25uZWN0b3JzLiAqLwo+ICsJZm9y IChpID0gMCwgcCA9IGFyZzsgaSA8IHBpcGUtPm51bV9jb25zOyArK2ksIHAgPSBlbmRwICsgMSkg ewo+ICsJCWVuZHAgPSBzdHJwYnJrKHAsICIsQDoiKTsKPiArCQlpZiAoIWVuZHApCj4gKwkJCWJy ZWFrOwo+ICsKPiArCQlwaXBlLT5jb25zW2ldID0gc3RybmR1cChwLCBlbmRwIC0gcCk7Cj4gKwo+ ICsJCWlmICgqZW5kcCAhPSAnLCcpCj4gKwkJCWJyZWFrOwo+ICsJfQo+ICsKPiArCWlmIChpICE9 IHBpcGUtPm51bV9jb25zIC0gMSkKPiArCQlyZXR1cm4gLTE7Cj4gKwo+ICsJLyogUGFyc2UgdGhl IHJlbWFpbmluZyBwYXJhbWV0ZXJzLiAqLwo+ICsJaWYgKCplbmRwID09ICdAJykgewo+ICsJCWFy ZyA9IGVuZHAgKyAxOwo+ICsJCXBpcGUtPmNydGNfaWQgPSBzdHJ0b3VsKGFyZywgJmVuZHAsIDEw KTsKPiArCX0KPiArCWlmICgqZW5kcCAhPSAnOicpCj4gKwkJcmV0dXJuIC0xOwo+ICsKPiArCWFy ZyA9IGVuZHAgKyAxOwo+ICsKPiArCS8qIFNlYXJjaCBmb3IgdGhlIHZlcnRpY2FsIHJlZnJlc2gg b3IgdGhlIGZvcm1hdC4gKi8KPiArCXAgPSBzdHJwYnJrKGFyZywgIi1AIik7Cj4gKwlpZiAocCA9 PSBOVUxMKQo+ICsJCXAgPSBhcmcgKyBzdHJsZW4oYXJnKTsKPiArCWxlbiA9IG1pbihzaXplb2Yg cGlwZS0+bW9kZV9zdHIgLSAxLCAodW5zaWduZWQgaW50KShwIC0gYXJnKSk7Cj4gKwlzdHJuY3B5 KHBpcGUtPm1vZGVfc3RyLCBhcmcsIGxlbik7Cj4gKwlwaXBlLT5tb2RlX3N0cltsZW5dID0gJ1ww JzsKPiArCj4gKwlpZiAoKnAgPT0gJy0nKSB7Cj4gKwkJcGlwZS0+dnJlZnJlc2ggPSBzdHJ0b3Vs KHAgKyAxLCAmZW5kcCwgMTApOwo+ICsJCXAgPSBlbmRwOwo+ICsJfQo+ICsKPiArCWlmICgqcCA9 PSAnQCcpIHsKPiArCQlzdHJuY3B5KHBpcGUtPmZvcm1hdF9zdHIsIHAgKyAxLCA0KTsKPiArCQlw aXBlLT5mb3JtYXRfc3RyWzRdID0gJ1wwJzsKPiArCX0KPiArCj4gKwlwaXBlLT5mb3VyY2MgPSB1 dGlsX2Zvcm1hdF9mb3VyY2MocGlwZS0+Zm9ybWF0X3N0cik7Cj4gKwlpZiAocGlwZS0+Zm91cmNj ID09IDApICB7Cj4gKwkJZnByaW50ZihzdGRlcnIsICJ1bmtub3duIGZvcm1hdCAlc1xuIiwgcGlw ZS0+Zm9ybWF0X3N0cik7Cj4gKwkJcmV0dXJuIC0xOwo+ICsJfQo+ICsKPiArCXJldHVybiAwOwo+ ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHBhcnNlX3BsYW5lKHN0cnVjdCBwbGFuZV9hcmcgKnBsYW5l LCBjb25zdCBjaGFyICpwKQo+ICt7Cj4gKwljaGFyICplbmQ7Cj4gKwo+ICsJcGxhbmUtPnBsYW5l X2lkID0gc3RydG91bChwLCAmZW5kLCAxMCk7Cj4gKwlpZiAoKmVuZCAhPSAnQCcpCj4gKwkJcmV0 dXJuIC1FSU5WQUw7Cj4gKwo+ICsJcCA9IGVuZCArIDE7Cj4gKwlwbGFuZS0+Y3J0Y19pZCA9IHN0 cnRvdWwocCwgJmVuZCwgMTApOwo+ICsJaWYgKCplbmQgIT0gJzonKQo+ICsJCXJldHVybiAtRUlO VkFMOwo+ICsKPiArCXAgPSBlbmQgKyAxOwo+ICsJcGxhbmUtPncgPSBzdHJ0b3VsKHAsICZlbmQs IDEwKTsKPiArCWlmICgqZW5kICE9ICd4JykKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4gKwlw ID0gZW5kICsgMTsKPiArCXBsYW5lLT5oID0gc3RydG91bChwLCAmZW5kLCAxMCk7Cj4gKwo+ICsJ aWYgKCplbmQgPT0gJysnIHx8ICplbmQgPT0gJy0nKSB7Cj4gKwkJcGxhbmUtPnggPSBzdHJ0b2wo ZW5kLCAmZW5kLCAxMCk7Cj4gKwkJaWYgKCplbmQgIT0gJysnICYmICplbmQgIT0gJy0nKQo+ICsJ CQlyZXR1cm4gLUVJTlZBTDsKPiArCQlwbGFuZS0+eSA9IHN0cnRvbChlbmQsICZlbmQsIDEwKTsK PiArCj4gKwkJcGxhbmUtPmhhc19wb3NpdGlvbiA9IHRydWU7Cj4gKwl9Cj4gKwo+ICsJaWYgKCpl bmQgPT0gJyonKSB7Cj4gKwkJcCA9IGVuZCArIDE7Cj4gKwkJcGxhbmUtPnNjYWxlID0gc3RydG9k KHAsICZlbmQpOwo+ICsJCWlmIChwbGFuZS0+c2NhbGUgPD0gMC4wKQo+ICsJCQlyZXR1cm4gLUVJ TlZBTDsKPiArCX0gZWxzZSB7Cj4gKwkJcGxhbmUtPnNjYWxlID0gMS4wOwo+ICsJfQo+ICsKPiAr CWlmICgqZW5kID09ICdAJykgewo+ICsJCXAgPSBlbmQgKyAxOwo+ICsJCWlmIChzdHJsZW4ocCkg IT0gNCkKPiArCQkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJCXN0cmNweShwbGFuZS0+Zm9ybWF0 X3N0ciwgcCk7Cj4gKwl9IGVsc2Ugewo+ICsJCXN0cmNweShwbGFuZS0+Zm9ybWF0X3N0ciwgIlhS MjQiKTsKPiArCX0KPiArCj4gKwlwbGFuZS0+Zm91cmNjID0gdXRpbF9mb3JtYXRfZm91cmNjKHBs YW5lLT5mb3JtYXRfc3RyKTsKPiArCWlmIChwbGFuZS0+Zm91cmNjID09IDApIHsKPiArCQlmcHJp bnRmKHN0ZGVyciwgInVua25vd24gZm9ybWF0ICVzXG4iLCBwbGFuZS0+Zm9ybWF0X3N0cik7Cj4g KwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0 YXRpYyBpbnQgcGFyc2VfcHJvcGVydHkoc3RydWN0IHByb3BlcnR5X2FyZyAqcCwgY29uc3QgY2hh ciAqYXJnKQo+ICt7Cj4gKwlpZiAoc3NjYW5mKGFyZywgIiVkOiUzMlteOl06JSIgU0NOdTY0LCAm cC0+b2JqX2lkLCBwLT5uYW1lLCAmcC0+dmFsdWUpICE9IDMpCj4gKwkJcmV0dXJuIC0xOwo+ICsK PiArCXAtPm9ial90eXBlID0gMDsKPiArCXAtPm5hbWVbRFJNX1BST1BfTkFNRV9MRU5dID0gJ1ww JzsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgdXNhZ2UoY2hhciAq bmFtZSkKPiArewo+ICsJZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgWy1jRGRlZk1QcHNDdndd XG4iLCBuYW1lKTsKPiArCj4gKwlmcHJpbnRmKHN0ZGVyciwgIlxuIFF1ZXJ5IG9wdGlvbnM6XG5c biIpOwo+ICsJZnByaW50ZihzdGRlcnIsICJcdC1jXHRsaXN0IGNvbm5lY3RvcnNcbiIpOwo+ICsJ ZnByaW50ZihzdGRlcnIsICJcdC1lXHRsaXN0IGVuY29kZXJzXG4iKTsKPiArCWZwcmludGYoc3Rk ZXJyLCAiXHQtZlx0bGlzdCBmcmFtZWJ1ZmZlcnNcbiIpOwo+ICsJZnByaW50ZihzdGRlcnIsICJc dC1wXHRsaXN0IENSVENzIGFuZCBwbGFuZXMgKHBpcGVzKVxuIik7Cj4gKwo+ICsJZnByaW50Zihz dGRlcnIsICJcbiBUZXN0IG9wdGlvbnM6XG5cbiIpOwo+ICsJZnByaW50ZihzdGRlcnIsICJcdC1Q IDxwbGFuZV9pZD5APGNydGNfaWQ+Ojx3Png8aD5bKzx4Pis8eT5dWyo8c2NhbGU+XVtAPGZvcm1h dD5dXHRzZXQgYSBwbGFuZVxuIik7Cj4gKwlmcHJpbnRmKHN0ZGVyciwgIlx0LXMgPGNvbm5lY3Rv cl9pZD5bLDxjb25uZWN0b3JfaWQ+XVtAPGNydGNfaWQ+XTo8bW9kZT5bLTx2cmVmcmVzaD5dW0A8 Zm9ybWF0Pl1cdHNldCBhIG1vZGVcbiIpOwo+ICsJZnByaW50ZihzdGRlcnIsICJcdC12XHR0ZXN0 IGxvb3BcbiIpOwo+ICsJZnByaW50ZihzdGRlcnIsICJcdC13IDxvYmpfaWQ+Ojxwcm9wX25hbWU+ Ojx2YWx1ZT5cdHNldCBwcm9wZXJ0eVxuIik7Cj4gKwo+ICsJZnByaW50ZihzdGRlcnIsICJcbiBH ZW5lcmljIG9wdGlvbnM6XG5cbiIpOwo+ICsJZnByaW50ZihzdGRlcnIsICJcdC1kXHRkcm9wIG1h c3RlciBhZnRlciBtb2RlIHNldFxuIik7Cj4gKwlmcHJpbnRmKHN0ZGVyciwgIlx0LU0gbW9kdWxl XHR1c2UgdGhlIGdpdmVuIGRyaXZlclxuIik7Cj4gKwlmcHJpbnRmKHN0ZGVyciwgIlx0LUQgZGV2 aWNlXHR1c2UgdGhlIGdpdmVuIGRldmljZVxuIik7Cj4gKwo+ICsJZnByaW50ZihzdGRlcnIsICJc blx0RGVmYXVsdCBpcyB0byBkdW1wIGFsbCBpbmZvLlxuIik7Cj4gKwlleGl0KDApOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgaW50IHBpcGVfcmVzb2x2ZV9jb25uZWN0b3JzKHN0cnVjdCBkZXZpY2UgKmRl diwgc3RydWN0IHBpcGVfYXJnICpwaXBlKQo+ICt7Cj4gKwlkcm1Nb2RlQ29ubmVjdG9yICpjb25u ZWN0b3I7Cj4gKwl1bnNpZ25lZCBpbnQgaTsKPiArCXVpbnQzMl90IGlkOwo+ICsJY2hhciAqZW5k cDsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgcGlwZS0+bnVtX2NvbnM7IGkrKykgewo+ICsJCWlk ID0gc3RydG91bChwaXBlLT5jb25zW2ldLCAmZW5kcCwgMTApOwo+ICsJCWlmIChlbmRwID09IHBp cGUtPmNvbnNbaV0pIHsKPiArCQkJY29ubmVjdG9yID0gZ2V0X2Nvbm5lY3Rvcl9ieV9uYW1lKGRl diwgcGlwZS0+Y29uc1tpXSk7Cj4gKwkJCWlmICghY29ubmVjdG9yKSB7Cj4gKwkJCQlmcHJpbnRm KHN0ZGVyciwgIm5vIGNvbm5lY3RvciBuYW1lZCAnJXMnXG4iLAo+ICsJCQkJCXBpcGUtPmNvbnNb aV0pOwo+ICsJCQkJcmV0dXJuIC1FTk9ERVY7Cj4gKwkJCX0KPiArCj4gKwkJCWlkID0gY29ubmVj dG9yLT5jb25uZWN0b3JfaWQ7Cj4gKwkJfQo+ICsKPiArCQlwaXBlLT5jb25faWRzW2ldID0gaWQ7 Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBjaGFyIG9wdHN0cltd ID0gImNkRDplZk06UDpwczp2dzoiOwo+ICsKPiAraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiph cmd2KQo+ICt7Cj4gKwlzdHJ1Y3QgZGV2aWNlIGRldjsKPiArCj4gKwlpbnQgYzsKPiArCWludCBl bmNvZGVycyA9IDAsIGNvbm5lY3RvcnMgPSAwLCBjcnRjcyA9IDAsIHBsYW5lcyA9IDAsIGZyYW1l YnVmZmVycyA9IDA7Cj4gKwlpbnQgZHJvcF9tYXN0ZXIgPSAwOwo+ICsJaW50IHRlc3RfbG9vcCA9 IDA7Cj4gKwljaGFyICpkZXZpY2UgPSBOVUxMOwo+ICsJY2hhciAqbW9kdWxlID0gTlVMTDsKPiAr CXVuc2lnbmVkIGludCBpOwo+ICsJdW5zaWduZWQgaW50IGNvdW50ID0gMCwgcGxhbmVfY291bnQg PSAwOwo+ICsJdW5zaWduZWQgaW50IHByb3BfY291bnQgPSAwOwo+ICsJc3RydWN0IHBpcGVfYXJn ICpwaXBlX2FyZ3MgPSBOVUxMOwo+ICsJc3RydWN0IHBsYW5lX2FyZyAqcGxhbmVfYXJncyA9IE5V TEw7Cj4gKwlzdHJ1Y3QgcHJvcGVydHlfYXJnICpwcm9wX2FyZ3MgPSBOVUxMOwo+ICsJdW5zaWdu ZWQgaW50IGFyZ3MgPSAwOwo+ICsJaW50IHJldDsKPiArCj4gKwltZW1zZXQoJmRldiwgMCwgc2l6 ZW9mIGRldik7Cj4gKwo+ICsJb3B0ZXJyID0gMDsKPiArCXdoaWxlICgoYyA9IGdldG9wdChhcmdj LCBhcmd2LCBvcHRzdHIpKSAhPSAtMSkgewo+ICsJCWFyZ3MrKzsKPiArCj4gKwkJc3dpdGNoIChj KSB7Cj4gKwkJY2FzZSAnYyc6Cj4gKwkJCWNvbm5lY3RvcnMgPSAxOwo+ICsJCQlicmVhazsKPiAr CQljYXNlICdEJzoKPiArCQkJZGV2aWNlID0gb3B0YXJnOwo+ICsJCQlhcmdzLS07Cj4gKwkJCWJy ZWFrOwo+ICsJCWNhc2UgJ2QnOgo+ICsJCQlkcm9wX21hc3RlciA9IDE7Cj4gKwkJCWJyZWFrOwo+ ICsJCWNhc2UgJ2UnOgo+ICsJCQllbmNvZGVycyA9IDE7Cj4gKwkJCWJyZWFrOwo+ICsJCWNhc2Ug J2YnOgo+ICsJCQlmcmFtZWJ1ZmZlcnMgPSAxOwo+ICsJCQlicmVhazsKPiArCQljYXNlICdNJzoK PiArCQkJbW9kdWxlID0gb3B0YXJnOwo+ICsJCQkvKiBQcmVzZXJ2ZSB0aGUgZGVmYXVsdCBiZWhh dmlvdXIgb2YgZHVtcGluZyBhbGwgaW5mb3JtYXRpb24uICovCj4gKwkJCWFyZ3MtLTsKPiArCQkJ YnJlYWs7Cj4gKwkJY2FzZSAnUCc6Cj4gKwkJCXBsYW5lX2FyZ3MgPSByZWFsbG9jKHBsYW5lX2Fy Z3MsCj4gKwkJCQkJICAgICAocGxhbmVfY291bnQgKyAxKSAqIHNpemVvZiAqcGxhbmVfYXJncyk7 Cj4gKwkJCWlmIChwbGFuZV9hcmdzID09IE5VTEwpIHsKPiArCQkJCWZwcmludGYoc3RkZXJyLCAi bWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKPiArCQkJCXJldHVybiAxOwo+ICsJCQl9Cj4g KwkJCW1lbXNldCgmcGxhbmVfYXJnc1twbGFuZV9jb3VudF0sIDAsIHNpemVvZigqcGxhbmVfYXJn cykpOwo+ICsKPiArCQkJaWYgKHBhcnNlX3BsYW5lKCZwbGFuZV9hcmdzW3BsYW5lX2NvdW50XSwg b3B0YXJnKSA8IDApCj4gKwkJCQl1c2FnZShhcmd2WzBdKTsKPiArCj4gKwkJCXBsYW5lX2NvdW50 Kys7Cj4gKwkJCWJyZWFrOwo+ICsJCWNhc2UgJ3AnOgo+ICsJCQljcnRjcyA9IDE7Cj4gKwkJCXBs YW5lcyA9IDE7Cj4gKwkJCWJyZWFrOwo+ICsJCWNhc2UgJ3MnOgo+ICsJCQlwaXBlX2FyZ3MgPSBy ZWFsbG9jKHBpcGVfYXJncywKPiArCQkJCQkgICAgKGNvdW50ICsgMSkgKiBzaXplb2YgKnBpcGVf YXJncyk7Cj4gKwkJCWlmIChwaXBlX2FyZ3MgPT0gTlVMTCkgewo+ICsJCQkJZnByaW50ZihzdGRl cnIsICJtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwo+ICsJCQkJcmV0dXJuIDE7Cj4gKwkJ CX0KPiArCQkJbWVtc2V0KCZwaXBlX2FyZ3NbY291bnRdLCAwLCBzaXplb2YoKnBpcGVfYXJncykp Owo+ICsKPiArCQkJaWYgKHBhcnNlX2Nvbm5lY3RvcigmcGlwZV9hcmdzW2NvdW50XSwgb3B0YXJn KSA8IDApCj4gKwkJCQl1c2FnZShhcmd2WzBdKTsKPiArCj4gKwkJCWNvdW50Kys7Cj4gKwkJCWJy ZWFrOwo+ICsJCWNhc2UgJ3YnOgo+ICsJCQl0ZXN0X2xvb3AgPSAxOwo+ICsJCQlicmVhazsKPiAr CQljYXNlICd3JzoKPiArCQkJcHJvcF9hcmdzID0gcmVhbGxvYyhwcm9wX2FyZ3MsCj4gKwkJCQkJ ICAgKHByb3BfY291bnQgKyAxKSAqIHNpemVvZiAqcHJvcF9hcmdzKTsKPiArCQkJaWYgKHByb3Bf YXJncyA9PSBOVUxMKSB7Cj4gKwkJCQlmcHJpbnRmKHN0ZGVyciwgIm1lbW9yeSBhbGxvY2F0aW9u IGZhaWxlZFxuIik7Cj4gKwkJCQlyZXR1cm4gMTsKPiArCQkJfQo+ICsJCQltZW1zZXQoJnByb3Bf YXJnc1twcm9wX2NvdW50XSwgMCwgc2l6ZW9mKCpwcm9wX2FyZ3MpKTsKPiArCj4gKwkJCWlmIChw YXJzZV9wcm9wZXJ0eSgmcHJvcF9hcmdzW3Byb3BfY291bnRdLCBvcHRhcmcpIDwgMCkKPiArCQkJ CXVzYWdlKGFyZ3ZbMF0pOwo+ICsKPiArCQkJcHJvcF9jb3VudCsrOwo+ICsJCQlicmVhazsKPiAr CQlkZWZhdWx0Ogo+ICsJCQl1c2FnZShhcmd2WzBdKTsKPiArCQkJYnJlYWs7Cj4gKwkJfQo+ICsJ fQo+ICsKPiArCWlmICghYXJncykKPiArCQllbmNvZGVycyA9IGNvbm5lY3RvcnMgPSBjcnRjcyA9 IHBsYW5lcyA9IGZyYW1lYnVmZmVycyA9IDE7Cj4gKwo+ICsJZGV2LmZkID0gdXRpbF9vcGVuKGRl dmljZSwgbW9kdWxlKTsKPiArCWlmIChkZXYuZmQgPCAwKQo+ICsJCXJldHVybiAtMTsKPiArCj4g KwlyZXQgPSBkcm1TZXRDbGllbnRDYXAoZGV2LmZkLCBEUk1fQ0xJRU5UX0NBUF9BVE9NSUMsIDEp Owo+ICsJaWYgKHJldCkgewo+ICsJCWZwcmludGYoc3RkZXJyLCAibm8gYXRvbWljIG1vZGVzZXR0 aW5nIHN1cHBvcnQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwo+ICsJCWRybUNsb3NlKGRldi5m ZCk7Cj4gKwkJcmV0dXJuIC0xOwo+ICsJfQo+ICsKPiArCWRldi5yZXNvdXJjZXMgPSBnZXRfcmVz b3VyY2VzKCZkZXYpOwo+ICsJaWYgKCFkZXYucmVzb3VyY2VzKSB7Cj4gKwkJZHJtQ2xvc2UoZGV2 LmZkKTsKPiArCQlyZXR1cm4gMTsKPiArCX0KPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7 IGkrKykgewo+ICsJCWlmIChwaXBlX3Jlc29sdmVfY29ubmVjdG9ycygmZGV2LCAmcGlwZV9hcmdz W2ldKSA8IDApIHsKPiArCQkJZnJlZV9yZXNvdXJjZXMoZGV2LnJlc291cmNlcyk7Cj4gKwkJCWRy bUNsb3NlKGRldi5mZCk7Cj4gKwkJCXJldHVybiAxOwo+ICsJCX0KPiArCX0KPiArCj4gKyNkZWZp bmUgZHVtcF9yZXNvdXJjZShkZXYsIHJlcykgaWYgKHJlcykgZHVtcF8jI3JlcyhkZXYpCj4gKwo+ ICsJZHVtcF9yZXNvdXJjZSgmZGV2LCBlbmNvZGVycyk7Cj4gKwlkdW1wX3Jlc291cmNlKCZkZXYs IGNvbm5lY3RvcnMpOwo+ICsJZHVtcF9yZXNvdXJjZSgmZGV2LCBjcnRjcyk7Cj4gKwlkdW1wX3Jl c291cmNlKCZkZXYsIHBsYW5lcyk7Cj4gKwlkdW1wX3Jlc291cmNlKCZkZXYsIGZyYW1lYnVmZmVy cyk7Cj4gKwo+ICsJZGV2LnJlcSA9IGRybU1vZGVBdG9taWNBbGxvYygpOwo+ICsKPiArCWZvciAo aSA9IDA7IGkgPCBwcm9wX2NvdW50OyArK2kpCj4gKwkJc2V0X3Byb3BlcnR5KCZkZXYsICZwcm9w X2FyZ3NbaV0pOwo+ICsKPiArCWlmIChjb3VudCAmJiBwbGFuZV9jb3VudCkgewo+ICsJCXVpbnQ2 NF90IGNhcCA9IDA7Cj4gKwo+ICsJCXJldCA9IGRybUdldENhcChkZXYuZmQsIERSTV9DQVBfRFVN Ql9CVUZGRVIsICZjYXApOwo+ICsJCWlmIChyZXQgfHwgY2FwID09IDApIHsKPiArCQkJZnByaW50 ZihzdGRlcnIsICJkcml2ZXIgZG9lc24ndCBzdXBwb3J0IHRoZSBkdW1iIGJ1ZmZlciBBUElcbiIp Owo+ICsJCQlkcm1Nb2RlQXRvbWljRnJlZShkZXYucmVxKTsKPiArCQkJcmV0dXJuIDE7Cj4gKwkJ fQo+ICsKPiArCQlzZXRfbW9kZSgmZGV2LCBwaXBlX2FyZ3MsIGNvdW50KTsKPiArCQlzZXRfcGxh bmVzKCZkZXYsIHBsYW5lX2FyZ3MsIHBsYW5lX2NvdW50LCBmYWxzZSk7Cj4gKwo+ICsJCXJldCA9 IGRybU1vZGVBdG9taWNDb21taXQoZGV2LmZkLCBkZXYucmVxLCBEUk1fTU9ERV9BVE9NSUNfQUxM T1dfTU9ERVNFVCwgTlVMTCk7Cj4gKwkJaWYgKHJldCkgewo+ICsJCQlmcHJpbnRmKHN0ZGVyciwg IkF0b21pYyBDb21taXQgZmFpbGVkIFsxXVxuIik7Cj4gKwkJCXJldHVybiAxOwo+ICsJCX0KPiAr Cj4gKwkJZ2V0dGltZW9mZGF5KCZwaXBlX2FyZ3MtPnN0YXJ0LCBOVUxMKTsKPiArCQlwaXBlX2Fy Z3MtPnN3YXBfY291bnQgPSAwOwo+ICsKPiArCQl3aGlsZSAodGVzdF9sb29wKSB7Cj4gKwkJCWRy bU1vZGVBdG9taWNGcmVlKGRldi5yZXEpOwo+ICsJCQlkZXYucmVxID0gZHJtTW9kZUF0b21pY0Fs bG9jKCk7Cj4gKwkJCXNldF9wbGFuZXMoJmRldiwgcGxhbmVfYXJncywgcGxhbmVfY291bnQsIHRy dWUpOwo+ICsKPiArCQkJcmV0ID0gZHJtTW9kZUF0b21pY0NvbW1pdChkZXYuZmQsIGRldi5yZXEs IERSTV9NT0RFX0FUT01JQ19BTExPV19NT0RFU0VULCBOVUxMKTsKPiArCQkJaWYgKHJldCkgewo+ ICsJCQkJZnByaW50ZihzdGRlcnIsICJBdG9taWMgQ29tbWl0IGZhaWxlZCBbMl1cbiIpOwo+ICsJ CQkJcmV0dXJuIDE7Cj4gKwkJCX0KPiArCj4gKwkJCXBpcGVfYXJncy0+c3dhcF9jb3VudCsrOwo+ ICsJCQlpZiAocGlwZV9hcmdzLT5zd2FwX2NvdW50ID09IDYwKSB7Cj4gKwkJCQlzdHJ1Y3QgdGlt ZXZhbCBlbmQ7Cj4gKwkJCQlkb3VibGUgdDsKPiArCj4gKwkJCQlnZXR0aW1lb2ZkYXkoJmVuZCwg TlVMTCk7Cj4gKwkJCQl0ID0gZW5kLnR2X3NlYyArIGVuZC50dl91c2VjICogMWUtNiAtCj4gKwkJ CQkgICAgKHBpcGVfYXJncy0+c3RhcnQudHZfc2VjICsgcGlwZV9hcmdzLT5zdGFydC50dl91c2Vj ICogMWUtNik7Cj4gKwkJCQlmcHJpbnRmKHN0ZGVyciwgImZyZXE6ICUuMDJmSHpcbiIsIHBpcGVf YXJncy0+c3dhcF9jb3VudCAvIHQpOwo+ICsJCQkJcGlwZV9hcmdzLT5zd2FwX2NvdW50ID0gMDsK PiArCQkJCXBpcGVfYXJncy0+c3RhcnQgPSBlbmQ7Cj4gKwkJCX0KPiArCQl9Cj4gKwo+ICsJCWlm IChkcm9wX21hc3RlcikKPiArCQkJZHJtRHJvcE1hc3RlcihkZXYuZmQpOwo+ICsKPiArCQlnZXRj aGFyKCk7Cj4gKwo+ICsJCWRybU1vZGVBdG9taWNGcmVlKGRldi5yZXEpOwo+ICsJCWRldi5yZXEg PSBkcm1Nb2RlQXRvbWljQWxsb2MoKTsKPiArCj4gKwkJY2xlYXJfbW9kZSgmZGV2LCBwaXBlX2Fy Z3MsIGNvdW50KTsKPiArCQljbGVhcl9wbGFuZXMoJmRldiwgcGxhbmVfYXJncywgcGxhbmVfY291 bnQpOwo+ICsJCXJldCA9IGRybU1vZGVBdG9taWNDb21taXQoZGV2LmZkLCBkZXYucmVxLCBEUk1f TU9ERV9BVE9NSUNfQUxMT1dfTU9ERVNFVCwgTlVMTCk7Cj4gKwkJaWYgKHJldCkgewo+ICsJCQlm cHJpbnRmKHN0ZGVyciwgIkF0b21pYyBDb21taXQgZmFpbGVkXG4iKTsKPiArCQkJcmV0dXJuIDE7 Cj4gKwkJfQo+ICsKPiArCQljbGVhcl9GQigmZGV2LCBwbGFuZV9hcmdzLCBwbGFuZV9jb3VudCk7 Cj4gKwl9Cj4gKwo+ICsJZHJtTW9kZUF0b21pY0ZyZWUoZGV2LnJlcSk7Cj4gKwlmcmVlX3Jlc291 cmNlcyhkZXYucmVzb3VyY2VzKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+IC0tIAo+IDIuMTUu MAo+IAo+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCj4g ZHJpLWRldmVsIG1haWxpbmcgbGlzdAo+IGRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcK PiBodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZl bApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2 ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9s aXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK