From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by gabe.freedesktop.org (Postfix) with ESMTPS id 2C24A6E03A for ; Thu, 22 Oct 2020 10:10:01 +0000 (UTC) Date: Thu, 22 Oct 2020 13:09:56 +0300 From: Petri Latvala Message-ID: <20201022100956.GP7444@platvala-desk.ger.corp.intel.com> References: <20201022095907.34225-1-zbigniew.kempczynski@intel.com> <20201022095907.34225-7-zbigniew.kempczynski@intel.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20201022095907.34225-7-zbigniew.kempczynski@intel.com> Subject: Re: [igt-dev] [PATCH i-g-t 06/24] lib/intel_allocator: Add intel_allocator core List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" To: Zbigniew =?utf-8?Q?Kempczy=C5=84ski?= Cc: igt-dev@lists.freedesktop.org, Chris Wilson List-ID: T24gVGh1LCBPY3QgMjIsIDIwMjAgYXQgMTE6NTg6NDlBTSArMDIwMCwgWmJpZ25pZXcgS2VtcGN6 ecWEc2tpIHdyb3RlOgo+IFNpZ25lZC1vZmYtYnk6IFpiaWduaWV3IEtlbXBjennFhHNraSA8emJp Z25pZXcua2VtcGN6eW5za2lAaW50ZWwuY29tPgo+IFNpZ25lZC1vZmYtYnk6IERvbWluaWsgR3J6 ZWdvcnplayA8ZG9taW5pay5ncnplZ29yemVrQGludGVsLmNvbT4KPiBDYzogQ2hyaXMgV2lsc29u IDxjaHJpc0BjaHJpcy13aWxzb24uY28udWs+Cj4gQ2M6IFBldHJpIExhdHZhbGEgPHBldHJpLmxh dHZhbGFAaW50ZWwuY29tPgo+IC0tLQo+ICAuLi4vaWd0LWdwdS10b29scy9pZ3QtZ3B1LXRvb2xz LWRvY3MueG1sICAgICAgfCAgIDEgKwo+ICBsaWIvaWd0X2NvcmUuYyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgIDIgKwo+ICBsaWIvaW50ZWxfYWxsb2NhdG9yLmMgICAgICAgICAg ICAgICAgICAgICAgICAgfCA5MzkgKysrKysrKysrKysrKysrKysrCj4gIGxpYi9pbnRlbF9hbGxv Y2F0b3IuaCAgICAgICAgICAgICAgICAgICAgICAgICB8IDEzNiArKysKPiAgbGliL2ludGVsX2Fs bG9jYXRvcl9tc2djaGFubmVsLmMgICAgICAgICAgICAgIHwgMTgyICsrKysKPiAgbGliL2ludGVs X2FsbG9jYXRvcl9tc2djaGFubmVsLmggICAgICAgICAgICAgIHwgMTQwICsrKwo+ICBsaWIvaW50 ZWxfYWxsb2NhdG9yX3NpbXBsZS5jICAgICAgICAgICAgICAgICAgfCAgIDIgLQo+ICBsaWIvbWVz b24uYnVpbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDQgKwo+ICA4IGZpbGVz IGNoYW5nZWQsIDE0MDQgaW5zZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkKPiAgY3JlYXRlIG1v ZGUgMTAwNjQ0IGxpYi9pbnRlbF9hbGxvY2F0b3IuYwo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgbGli L2ludGVsX2FsbG9jYXRvci5oCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWIvaW50ZWxfYWxsb2Nh dG9yX21zZ2NoYW5uZWwuYwo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgbGliL2ludGVsX2FsbG9jYXRv cl9tc2djaGFubmVsLmgKPiAKPiBkaWZmIC0tZ2l0IGEvZG9jcy9yZWZlcmVuY2UvaWd0LWdwdS10 b29scy9pZ3QtZ3B1LXRvb2xzLWRvY3MueG1sIGIvZG9jcy9yZWZlcmVuY2UvaWd0LWdwdS10b29s cy9pZ3QtZ3B1LXRvb2xzLWRvY3MueG1sCj4gaW5kZXggYmY1YWM1NDIuLjE5MmQxZGY3IDEwMDY0 NAo+IC0tLSBhL2RvY3MvcmVmZXJlbmNlL2lndC1ncHUtdG9vbHMvaWd0LWdwdS10b29scy1kb2Nz LnhtbAo+ICsrKyBiL2RvY3MvcmVmZXJlbmNlL2lndC1ncHUtdG9vbHMvaWd0LWdwdS10b29scy1k b2NzLnhtbAo+IEBAIC00Myw2ICs0Myw3IEBACj4gICAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwv aWd0X3ZjNC54bWwiLz4KPiAgICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9pZ3RfdmdlbS54bWwi Lz4KPiAgICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9pZ3RfeDg2LnhtbCIvPgo+ICsgICAgPHhp OmluY2x1ZGUgaHJlZj0ieG1sL2ludGVsX2FsbG9jYXRvci54bWwiLz4KPiAgICAgIDx4aTppbmNs dWRlIGhyZWY9InhtbC9pbnRlbF9iYXRjaGJ1ZmZlci54bWwiLz4KPiAgICAgIDx4aTppbmNsdWRl IGhyZWY9InhtbC9pbnRlbF9idWZvcHMueG1sIi8+Cj4gICAgICA8eGk6aW5jbHVkZSBocmVmPSJ4 bWwvaW50ZWxfY2hpcHNldC54bWwiLz4KPiBkaWZmIC0tZ2l0IGEvbGliL2lndF9jb3JlLmMgYi9s aWIvaWd0X2NvcmUuYwo+IGluZGV4IDFmNzI1ZDAwLi44NjY1M2FiYyAxMDA2NDQKPiAtLS0gYS9s aWIvaWd0X2NvcmUuYwo+ICsrKyBiL2xpYi9pZ3RfY29yZS5jCj4gQEAgLTE0MTQsNiArMTQxNCw4 IEBAIHN0YXRpYyB2b2lkIGV4aXRfc3VidGVzdChjb25zdCBjaGFyICpyZXN1bHQpCj4gIAl9Cj4g IAludW1fdGVzdF9jaGlsZHJlbiA9IDA7Cj4gIAo+ICsJaW50ZWxfYWxsb2NhdG9yX2luaXQoKTsK PiArCj4gIAlpZiAoIWluX2R5bmFtaWNfc3VidGVzdCkKPiAgCQlfaWd0X2R5bmFtaWNfdGVzdHNf ZXhlY3V0ZWQgPSAtMTsKPiAgCgpKdXN0IGRyaXZlLWJ5IGNvbW1lbnRpbmcgZm9yIG90aGVycyB0 aGF0IG1pZ2h0IGJlIGFzIGNvbmZ1c2VkIGFib3V0CnRoaXMgYXMgSSB3YXM6IGludGVsX2FsbG9j YXRvcl9pbml0IGNhbGwgaXMgb25seSBhZGRlZCB0byBleGl0X3N1YnRlc3QKYmVjYXVzZSB0aGUg Zmlyc3QgY2FsbCB0byBpdCBpcyBhbHJlYWR5IGRvbmUgaW4gYW4gaWd0X2NvbnN0cnVjdG9yCmJs b2NrLgoKLS0gClBldHJpIExhdHZhbGEKCgoKCj4gZGlmZiAtLWdpdCBhL2xpYi9pbnRlbF9hbGxv Y2F0b3IuYyBiL2xpYi9pbnRlbF9hbGxvY2F0b3IuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4g aW5kZXggMDAwMDAwMDAuLmIwYWUxZDhiCj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2xpYi9pbnRl bF9hbGxvY2F0b3IuYwo+IEBAIC0wLDAgKzEsOTM5IEBACj4gKy8qCj4gKyAqIENvcHlyaWdodCDC qSAyMDIwIEludGVsIENvcnBvcmF0aW9uCj4gKyAqCj4gKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5 IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCj4gKyAq IGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVz ICh0aGUgIlNvZnR3YXJlIiksCj4gKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQg cmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KPiArICogdGhlIHJpZ2h0 cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1Ymxp Y2Vuc2UsCj4gKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBw ZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQo+ICsgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8g ZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+ICsgKgo+ICsgKiBU aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5j bHVkaW5nIHRoZSBuZXh0Cj4gKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxs IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKPiArICogU29mdHdhcmUuCj4g KyAqCj4gKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJB TlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQg Tk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+ICsgKiBG SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4g Tk8gRVZFTlQgU0hBTEwKPiArICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUg TElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiArICogTElBQklMSVRZLCBX SEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJ TkcKPiArICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUg T1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUwo+ICsgKiBJTiBUSEUgU09GVFdBUkUuCj4gKyAq Cj4gKyAqLwo+ICsKPiArI2luY2x1ZGUgPHN5cy90eXBlcy5oPgo+ICsjaW5jbHVkZSA8c3lzL3N0 YXQuaD4KPiArI2luY2x1ZGUgPHN5cy9pcGMuaD4KPiArI2luY2x1ZGUgPHN5cy9tc2cuaD4KPiAr I2luY2x1ZGUgPGZjbnRsLmg+Cj4gKyNpbmNsdWRlIDxwdGhyZWFkLmg+Cj4gKyNpbmNsdWRlIDxz aWduYWwuaD4KPiArI2luY2x1ZGUgPHN0ZGxpYi5oPgo+ICsjaW5jbHVkZSA8dW5pc3RkLmg+Cj4g KyNpbmNsdWRlICJpZ3QuaCIKPiArI2luY2x1ZGUgImlndF9tYXAuaCIKPiArI2luY2x1ZGUgImlu dGVsX2FsbG9jYXRvci5oIgo+ICsjaW5jbHVkZSAiaW50ZWxfYWxsb2NhdG9yX21zZ2NoYW5uZWwu aCIKPiArCj4gKy8vI2RlZmluZSBBTExPQ0RCRwo+ICsjaWZkZWYgQUxMT0NEQkcKPiArI2RlZmlu ZSBhbGxvY19pbmZvIGlndF9pbmZvCj4gKyNkZWZpbmUgYWxsb2NfZGVidWcgaWd0X2RlYnVnCj4g K3N0YXRpYyBjb25zdCBjaGFyICpyZXF0eXBlX3N0cltdID0gewo+ICsJW1JFUV9TVE9QXQkJPSAi c3RvcCIsCj4gKwlbUkVRX09QRU5dCQk9ICJvcGVuIiwKPiArCVtSRVFfQ0xPU0VdCQk9ICJjbG9z ZSIsCj4gKwlbUkVRX1JFTU9WRV9IQU5ETEVdCT0gInJlbW92ZSBoYW5kbGUiLAo+ICsJW1JFUV9B RERSRVNTX1JBTkdFXQk9ICJhZGRyZXNzIHJhbmdlIiwKPiArCVtSRVFfQUxMT0NdCQk9ICJhbGxv YyIsCj4gKwlbUkVRX0ZSRUVdCQk9ICJmcmVlIiwKPiArCVtSRVFfSVNfQUxMT0NBVEVEXQk9ICJp cyBhbGxvY2F0ZWQiLAo+ICsJW1JFUV9SRVNFUlZFXQkJPSAicmVzZXJ2ZSIsCj4gKwlbUkVRX1VO UkVTRVJWRV0JCT0gInVucmVzZXJ2ZSIsCj4gKwlbUkVRX1JFU0VSVkVfSUZfTk9UX0FMTE9DQVRF RF0gPSAicmVzZXJ2ZS1pbmEiLAo+ICsJW1JFUV9JU19SRVNFUlZFRF0JPSAiaXMgcmVzZXJ2ZWQi LAo+ICt9Owo+ICtzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKnJlcXN0cihlbnVtIHJlcXR5cGUg cmVxdWVzdF90eXBlKQo+ICt7Cj4gKwlpZ3RfYXNzZXJ0KHJlcXVlc3RfdHlwZSA+PSBSRVFfU1RP UCAmJiByZXF1ZXN0X3R5cGUgPD0gUkVRX0lTX1JFU0VSVkVEKTsKPiArCXJldHVybiByZXF0eXBl X3N0cltyZXF1ZXN0X3R5cGVdOwo+ICt9Cj4gKyNlbHNlCj4gKyNkZWZpbmUgYWxsb2NfaW5mbygu Li4pIHt9Cj4gKyNkZWZpbmUgYWxsb2NfZGVidWcoLi4uKSB7fQo+ICsjZW5kaWYKPiArCj4gK3N0 cnVjdCBpbnRlbF9hbGxvY2F0b3IgKmludGVsX2FsbG9jYXRvcl9yYW5kb21fY3JlYXRlKGludCBm ZCwgdWludDMyX3QgY3R4KTsKPiArc3RydWN0IGludGVsX2FsbG9jYXRvciAqaW50ZWxfYWxsb2Nh dG9yX3NpbXBsZV9jcmVhdGUoaW50IGZkLCB1aW50MzJfdCBjdHgpOwo+ICsKPiArc3RhdGljIHN0 cnVjdCBpZ3RfbWFwICphbGxvY2F0b3JzX21hcDsKPiArc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBt YXBfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwo+ICtzdGF0aWMgYm9vbCBtdWx0 aXByb2Nlc3M7Cj4gK3N0YXRpYyBwdGhyZWFkX3QgYWxsb2NhdG9yX3RocmVhZDsKPiArCj4gK3N0 YXRpYyBib29sIHdhcm5faWZfbm90X2VtcHR5Owo+ICsKPiArLyogRm9yIGFsbG9jYXRvciBwdXJw b3NlcyB3ZSBuZWVkIHRvIHRyYWNrIHBpZC90aWQgKi8KPiArc3RhdGljIHBpZF90IGFsbG9jYXRv cl9waWQgPSAtMTsKPiArZXh0ZXJuIHBpZF90IGNoaWxkX3BpZDsKPiArZXh0ZXJuIF9fdGhyZWFk IHBpZF90IGNoaWxkX3RpZDsKPiArCj4gK3N0YXRpYyBzdHJ1Y3QgbXNnX2NoYW5uZWwgKmNoYW5u ZWw7Cj4gKwo+ICtzdGF0aWMgaW50IHNlbmRfYWxsb2Nfc3RvcChzdHJ1Y3QgbXNnX2NoYW5uZWwg Km1zZ2NoYW4pCj4gK3sKPiArCXN0cnVjdCBhbGxvY19yZXEgcmVxID0gezB9Owo+ICsKPiArCXJl cS5yZXF1ZXN0X3R5cGUgPSBSRVFfU1RPUDsKPiArCj4gKwlyZXR1cm4gbXNnY2hhbi0+c2VuZF9y ZXEobXNnY2hhbiwgJnJlcSk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgc2VuZF9yZXEoc3RydWN0 IG1zZ19jaGFubmVsICptc2djaGFuLCBwaWRfdCB0aWQsCj4gKwkJICAgIHN0cnVjdCBhbGxvY19y ZXEgKnJlcXVlc3QpCj4gK3sKPiArCXJlcXVlc3QtPnRpZCA9IHRpZDsKPiArCXJldHVybiBtc2dj aGFuLT5zZW5kX3JlcShtc2djaGFuLCByZXF1ZXN0KTsKPiArfQo+ICsKPiArc3RhdGljIGludCBy ZWN2X3JlcShzdHJ1Y3QgbXNnX2NoYW5uZWwgKm1zZ2NoYW4sIHN0cnVjdCBhbGxvY19yZXEgKnJl cXVlc3QpCj4gK3sKPiArCXJldHVybiBtc2djaGFuLT5yZWN2X3JlcShtc2djaGFuLCByZXF1ZXN0 KTsKPiArfQo+ICsKPiArc3RhdGljIGludCBzZW5kX3Jlc3Aoc3RydWN0IG1zZ19jaGFubmVsICpt c2djaGFuLAo+ICsJCSAgICAgcGlkX3QgdGlkLCBzdHJ1Y3QgYWxsb2NfcmVzcCAqcmVzcG9uc2Up Cj4gK3sKPiArCXJlc3BvbnNlLT50aWQgPSB0aWQ7Cj4gKwlyZXR1cm4gbXNnY2hhbi0+c2VuZF9y ZXNwKG1zZ2NoYW4sIHJlc3BvbnNlKTsKPiArfQo+ICsKPiArc3RhdGljIGludCByZWN2X3Jlc3Ao c3RydWN0IG1zZ19jaGFubmVsICptc2djaGFuLAo+ICsJCSAgICAgcGlkX3QgdGlkLCBzdHJ1Y3Qg YWxsb2NfcmVzcCAqcmVzcG9uc2UpCj4gK3sKPiArCXJlc3BvbnNlLT50aWQgPSB0aWQ7Cj4gKwly ZXR1cm4gbXNnY2hhbi0+cmVjdl9yZXNwKG1zZ2NoYW4sIHJlc3BvbnNlKTsKPiArfQo+ICsKPiAr c3RhdGljIHN0cnVjdCBpbnRlbF9hbGxvY2F0b3IgKmludGVsX2FsbG9jYXRvcl9jcmVhdGUoaW50 IGZkLCB1aW50MzJfdCBjdHgsCj4gKwkJCQkJCSAgICAgIHVpbnQ4X3QgYWxsb2NhdG9yX3R5cGUp Cj4gK3sKPiArCXN0cnVjdCBpbnRlbF9hbGxvY2F0b3IgKmlhbDsKPiArCj4gKwlzd2l0Y2ggKGFs bG9jYXRvcl90eXBlKSB7Cj4gKwljYXNlIElOVEVMX0FMTE9DQVRPUl9OT05FOgo+ICsJCWlndF9h c3NlcnRfZihhbGxvY2F0b3JfdHlwZSAhPSBJTlRFTF9BTExPQ0FUT1JfTk9ORSwKPiArCQkJICAg ICAiQnVnLCB0cnlpbmcgdG8gdXNlIGFsbG9jYXRvciB3aXRoIHJlbG9jYXRpb25zIik7Cj4gKwkJ YnJlYWs7Cj4gKwljYXNlIElOVEVMX0FMTE9DQVRPUl9SQU5ET006Cj4gKwkJaWFsID0gaW50ZWxf YWxsb2NhdG9yX3JhbmRvbV9jcmVhdGUoZmQsIGN0eCk7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIElO VEVMX0FMTE9DQVRPUl9TSU1QTEU6Cj4gKwkJaWFsID0gaW50ZWxfYWxsb2NhdG9yX3NpbXBsZV9j cmVhdGUoZmQsIGN0eCk7Cj4gKwkJYnJlYWs7Cj4gKwlkZWZhdWx0Ogo+ICsJCWlndF9hc3NlcnRf ZihpYWwsICJBbGxvY2F0b3IgdHlwZSAlZCBub3QgaW1wbGVtZW50ZWRcbiIsCj4gKwkJCSAgICAg YWxsb2NhdG9yX3R5cGUpOwo+ICsJCWJyZWFrOwo+ICsJfQo+ICsKPiArCWlhbC0+dHlwZSA9IGFs bG9jYXRvcl90eXBlOwo+ICsJYXRvbWljX2ZldGNoX2FkZCgmaWFsLT5yZWZjb3VudCwgMSk7Cj4g KwlwdGhyZWFkX211dGV4X2luaXQoJmlhbC0+bXV0ZXgsIE5VTEwpOwo+ICsKPiArCWlndF9tYXBf YWRkKGFsbG9jYXRvcnNfbWFwLCBpYWwsIGlhbCk7Cj4gKwo+ICsJcmV0dXJuIGlhbDsKPiArfQo+ ICsKPiArc3RhdGljIHZvaWQgaW50ZWxfYWxsb2NhdG9yX2Rlc3Ryb3koc3RydWN0IGludGVsX2Fs bG9jYXRvciAqaWFsKQo+ICt7Cj4gKwlhbGxvY19pbmZvKCJEZXN0cm95aW5nIGFsbG9jYXRvciAo ZW1wdHk6ICVkKVxuIiwKPiArCQkgICBpYWwtPmlzX2VtcHR5KGlhbCkpOwo+ICsKPiArCWlhbC0+ ZGVzdHJveShpYWwpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgc3RydWN0IGludGVsX2FsbG9jYXRvciAq X19hbGxvY2F0b3JfZ2V0KGludCBmZCwgdWludDMyX3QgY3R4KQo+ICt7Cj4gKwlzdHJ1Y3QgaW50 ZWxfYWxsb2NhdG9yICppYWwsIGlhbHMgPSB7IC5mZCA9IGZkLCAuY3R4ID0gY3R4IH07Cj4gKwlp bnQgcmVmY291bnQ7Cj4gKwo+ICsJaWFsID0gaWd0X21hcF9maW5kKGFsbG9jYXRvcnNfbWFwLCAm aWFscyk7Cj4gKwlpZiAoIWlhbCkKPiArCQlnb3RvIG91dF9nZXQ7Cj4gKwo+ICsJcmVmY291bnQg PSBhdG9taWNfZmV0Y2hfYWRkKCZpYWwtPnJlZmNvdW50LCAxKTsKPiArCWlndF9hc3NlcnQocmVm Y291bnQgPiAwKTsKPiArCj4gK291dF9nZXQ6Cj4gKwo+ICsJcmV0dXJuIGlhbDsKPiArfQo+ICsK PiArc3RhdGljIGJvb2wgX19hbGxvY2F0b3JfcHV0KHN0cnVjdCBpbnRlbF9hbGxvY2F0b3IgKmlh bCkKPiArewo+ICsJc3RydWN0IGludGVsX2FsbG9jYXRvciBpYWxzID0geyAuZmQgPSBpYWwtPmZk LCAuY3R4ID0gaWFsLT5jdHggfTsKPiArCWJvb2wgcmVsZWFzZWQgPSBmYWxzZTsKPiArCWludCBy ZWZjb3VudDsKPiArCj4gKwlpYWwgPSBpZ3RfbWFwX2ZpbmQoYWxsb2NhdG9yc19tYXAsICZpYWxz KTsKPiArCWlndF9hc3NlcnQoaWFsKTsKPiArCj4gKwlyZWZjb3VudCA9IGF0b21pY19mZXRjaF9z dWIoJmlhbC0+cmVmY291bnQsIDEpOwo+ICsJYWxsb2NfZGVidWcoIlJlZmNvdW50OiAlZFxuIiwg cmVmY291bnQpOwo+ICsJaWd0X2Fzc2VydChyZWZjb3VudCA+PSAxKTsKPiArCWlmIChyZWZjb3Vu dCA9PSAxKSB7Cj4gKwkJaWd0X21hcF9kZWwoYWxsb2NhdG9yc19tYXAsIGlhbCk7Cj4gKwo+ICsJ CWlmICghaWFsLT5pc19lbXB0eShpYWwpICYmIHdhcm5faWZfbm90X2VtcHR5KQo+ICsJCQlpZ3Rf d2FybigiQWxsb2NhdG9yIG5vdCBjbGVhciBiZWZvcmUgZGVzdHJveSFcbiIpOwo+ICsKPiArCQly ZWxlYXNlZCA9IHRydWU7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIHJlbGVhc2VkOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgc3RydWN0IGludGVsX2FsbG9jYXRvciAqYWxsb2NhdG9yX29wZW4oaW50IGZkLCB1 aW50MzJfdCBjdHgsCj4gKwkJCQkJICAgICAgdWludDhfdCBhbGxvY2F0b3JfdHlwZSkKPiArewo+ ICsJc3RydWN0IGludGVsX2FsbG9jYXRvciAqaWFsOwo+ICsKPiArCXB0aHJlYWRfbXV0ZXhfbG9j aygmbWFwX211dGV4KTsKPiArCj4gKwlpYWwgPSBfX2FsbG9jYXRvcl9nZXQoZmQsIGN0eCk7Cj4g KwlpZiAoaWFsKSB7Cj4gKwkJaWYgKGlhbC0+dHlwZSAhPSBhbGxvY2F0b3JfdHlwZSkKPiArCQkJ cHRocmVhZF9tdXRleF91bmxvY2soJm1hcF9tdXRleCk7Cj4gKwkJaWd0X2Fzc2VydF9mKGlhbC0+ dHlwZSA9PSBhbGxvY2F0b3JfdHlwZSwKPiArCQkJICAgICAiQWxsb2NhdG9yIG11c3QgYmUgc2Ft ZSB0eXBlIGZvciBmZC9jdHhcbiIpOwo+ICsJfSBlbHNlIHsKPiArCQlhbGxvY19kZWJ1ZygiQWxs b2NhdG9yIGZkOiAlZCwgY3R4OiAldSBub3QgZm91bmQsIGNyZWF0aW5nIG9uZVxuIiwKPiArCQkJ ICAgIGZkLCBjdHgpOwo+ICsJCWlhbCA9IGludGVsX2FsbG9jYXRvcl9jcmVhdGUoZmQsIGN0eCwg YWxsb2NhdG9yX3R5cGUpOwo+ICsJfQo+ICsKPiArCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtYXBf bXV0ZXgpOwo+ICsKPiArCXJldHVybiBpYWw7Cj4gK30KPiArCj4gK3N0YXRpYyBib29sIGFsbG9j YXRvcl9jbG9zZSh1aW50NjRfdCBhbGxvY2F0b3JfaGFuZGxlKQo+ICt7Cj4gKwlzdHJ1Y3QgaW50 ZWxfYWxsb2NhdG9yICppYWwgPSBmcm9tX3VzZXJfcG9pbnRlcihhbGxvY2F0b3JfaGFuZGxlKTsK PiArCWJvb2wgcmVsZWFzZWQsIGlzX2VtcHR5ID0gZmFsc2U7Cj4gKwo+ICsJaWd0X2Fzc2VydChp YWwpOwo+ICsKPiArCXB0aHJlYWRfbXV0ZXhfbG9jaygmbWFwX211dGV4KTsKPiArCj4gKwlyZWxl YXNlZCA9IF9fYWxsb2NhdG9yX3B1dChpYWwpOwo+ICsJaWYgKHJlbGVhc2VkKSB7Cj4gKwkJaXNf ZW1wdHkgPSBpYWwtPmlzX2VtcHR5KGlhbCk7Cj4gKwkJaW50ZWxfYWxsb2NhdG9yX2Rlc3Ryb3ko aWFsKTsKPiArCX0KPiArCj4gKwlwdGhyZWFkX211dGV4X3VubG9jaygmbWFwX211dGV4KTsKPiAr Cj4gKwlyZXR1cm4gaXNfZW1wdHk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgc2VuZF9yZXFfcmVj dl9yZXNwKHN0cnVjdCBtc2dfY2hhbm5lbCAqbXNnY2hhbiwKPiArCQkJICAgICAgc3RydWN0IGFs bG9jX3JlcSAqcmVxdWVzdCwKPiArCQkJICAgICAgc3RydWN0IGFsbG9jX3Jlc3AgKnJlc3BvbnNl KQo+ICt7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCXJldCA9IHNlbmRfcmVxKG1zZ2NoYW4sIGNoaWxk X3RpZCwgcmVxdWVzdCk7Cj4gKwlpZiAocmV0IDwgMCkgewo+ICsJCWlndF93YXJuKCJFcnJvciBz ZW5kaW5nIHJlcXVlc3QgW3R5cGU6ICVkXTogZXJyID0gJWQgWyVzXVxuIiwKPiArCQkJIHJlcXVl c3QtPnJlcXVlc3RfdHlwZSwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7Cj4gKwo+ICsJCXJldHVy biByZXQ7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gcmVjdl9yZXNwKG1zZ2NoYW4sIGNoaWxkX3RpZCwg cmVzcG9uc2UpOwo+ICsJaWYgKHJldCA8IDApCj4gKwkJaWd0X3dhcm4oIkVycm9yIHJlY2Vpdmlu ZyByZXNwb25zZSBbdHlwZTogJWRdOiBlcnIgPSAlZCBbJXNdXG4iLAo+ICsJCQkgcmVxdWVzdC0+ cmVxdWVzdF90eXBlLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKPiArCj4gKwkvKgo+ICsJICog VGhpcyBpcyBtYWluIGFzc3VtcHRpb24gLSB3ZSByZWNlaXZlIG1lc3NhZ2Ugd2hpY2ggc2l6ZSBt dXN0IGJlID4gMC4KPiArCSAqIElmIHRoaXMgaXMgZnVsZmlsbGVkIHdlIHJldHVybiAwIGFzIGEg c3VjY2Vzcy4KPiArCSAqLwo+ICsJaWYgKHJldCA+IDApCj4gKwkJcmV0ID0gMDsKPiArCj4gKwly ZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGhhbmRsZV9yZXF1ZXN0KHN0cnVjdCBh bGxvY19yZXEgKnJlcSwgc3RydWN0IGFsbG9jX3Jlc3AgKnJlc3ApCj4gK3sKPiArCWJvb2wgc2Ft ZV9wcm9jZXNzID0gY2hpbGRfcGlkID09IC0xOwo+ICsJaW50IHJldDsKPiArCj4gKwltZW1zZXQo cmVzcCwgMCwgc2l6ZW9mKCpyZXNwKSk7Cj4gKwo+ICsJaWYgKHNhbWVfcHJvY2Vzcykgewo+ICsJ CXN0cnVjdCBpbnRlbF9hbGxvY2F0b3IgKmlhbDsKPiArCQl1aW50NjRfdCBzdGFydCwgZW5kLCBz aXplOwo+ICsJCWJvb2wgYWxsb2NhdGVkLCByZXNlcnZlZCwgdW5yZXNlcnZlZDsKPiArCj4gKwkJ LyogTXV0ZXggb25seSB3b3JrIG9uIGFsbG9jYXRvciBpbnN0YW5jZSwgbm90IHN0b3Avb3Blbi9j bG9zZSAqLwo+ICsJCWlmIChyZXEtPnJlcXVlc3RfdHlwZSA+IFJFUV9DTE9TRSkgewo+ICsJCQlp YWwgPSBmcm9tX3VzZXJfcG9pbnRlcihyZXEtPmFsbG9jYXRvcl9oYW5kbGUpOwo+ICsJCQlpZ3Rf YXNzZXJ0KGlhbCk7Cj4gKwo+ICsJCQlwdGhyZWFkX211dGV4X2xvY2soJmlhbC0+bXV0ZXgpOwo+ ICsJCX0KPiArCj4gKwkJc3dpdGNoIChyZXEtPnJlcXVlc3RfdHlwZSkgewo+ICsJCWNhc2UgUkVR X1NUT1A6Cj4gKwkJCWFsbG9jX2luZm8oIjxzdG9wPlxuIik7Cj4gKwkJCWJyZWFrOwo+ICsKPiAr CQljYXNlIFJFUV9PUEVOOgo+ICsJCQlpYWwgPSBhbGxvY2F0b3Jfb3BlbihyZXEtPm9wZW4uZmQs IHJlcS0+b3Blbi5jdHgsCj4gKwkJCQkJICAgICByZXEtPm9wZW4uYWxsb2NhdG9yX3R5cGUpOwo+ ICsJCQlpZ3RfYXNzZXJ0KGlhbCk7Cj4gKwo+ICsJCQlyZXNwLT5yZXNwb25zZV90eXBlID0gUkVT UF9PUEVOOwo+ICsJCQlyZXNwLT5vcGVuLmFsbG9jYXRvcl9oYW5kbGUgPSB0b191c2VyX3BvaW50 ZXIoaWFsKTsKPiArCQkJYWxsb2NfaW5mbygiPG9wZW4+IFt0aWQ6ICVsZF0gZmQ6ICVkLCBjdHg6 ICV1LCBhbGxvY190eXBlOiAldSwgIgo+ICsJCQkJICAgImFobmQ6ICVwLCByZWZjbnQ6ICVkXG4i LAo+ICsJCQkJICAgKGxvbmcpIHJlcS0+dGlkLCByZXEtPm9wZW4uZmQsIHJlcS0+b3Blbi5jdHgs Cj4gKwkJCQkgICByZXEtPm9wZW4uYWxsb2NhdG9yX3R5cGUsIGlhbCwKPiArCQkJCSAgIGF0b21p Y19sb2FkKCZpYWwtPnJlZmNvdW50KSk7Cj4gKwkJCWJyZWFrOwo+ICsKPiArCQljYXNlIFJFUV9D TE9TRToKPiArCQkJaWFsID0gZnJvbV91c2VyX3BvaW50ZXIocmVxLT5hbGxvY2F0b3JfaGFuZGxl KTsKPiArCQkJaWd0X2Fzc2VydChpYWwpOwo+ICsKPiArCQkJcmVzcC0+cmVzcG9uc2VfdHlwZSA9 IFJFU1BfQ0xPU0U7Cj4gKwkJCXJldCA9IGF0b21pY19sb2FkKCZpYWwtPnJlZmNvdW50KTsKPiAr CQkJcmVzcC0+Y2xvc2UuaXNfZW1wdHkgPSBhbGxvY2F0b3JfY2xvc2UocmVxLT5hbGxvY2F0b3Jf aGFuZGxlKTsKPiArCQkJYWxsb2NfaW5mbygiPGNsb3NlPiBbdGlkOiAlbGRdIGFobmQ6ICVwLCBp c19lbXB0eTogJWQsIHJlZmNudDogJWRcbiIsCj4gKwkJCQkgICAobG9uZykgcmVxLT50aWQsIGlh bCwgcmVzcC0+Y2xvc2UuaXNfZW1wdHksIHJldCk7Cj4gKwkJCWJyZWFrOwo+ICsKPiArCQljYXNl IFJFUV9BRERSRVNTX1JBTkdFOgo+ICsJCQlyZXNwLT5yZXNwb25zZV90eXBlID0gUkVTUF9BRERS RVNTX1JBTkdFOwo+ICsJCQlpYWwtPmdldF9hZGRyZXNzX3JhbmdlKGlhbCwgJnN0YXJ0LCAmZW5k KTsKPiArCQkJcmVzcC0+YWRkcmVzc19yYW5nZS5zdGFydCA9IHN0YXJ0Owo+ICsJCQlyZXNwLT5h ZGRyZXNzX3JhbmdlLmVuZCA9IGVuZDsKPiArCQkJYWxsb2NfaW5mbygiPGFkZHJlc3MgcmFuZ2U+ IFt0aWQ6ICVsZF0gc3RhcnQ6ICUiIFBSSXg2NAo+ICsJCQkJICAgIiwgZW5kOiAlIiBQUklkNjQg IlxuIiwgKGxvbmcpIHJlcS0+dGlkLAo+ICsJCQkJICAgc3RhcnQsIGVuZCk7Cj4gKwkJCWJyZWFr Owo+ICsKPiArCQljYXNlIFJFUV9BTExPQzoKPiArCQkJcmVzcC0+cmVzcG9uc2VfdHlwZSA9IFJF U1BfQUxMT0M7Cj4gKwkJCXJlc3AtPmFsbG9jLm9mZnNldCA9IGlhbC0+YWxsb2MoaWFsLAo+ICsJ CQkJCQkJcmVxLT5hbGxvYy5oYW5kbGUsCj4gKwkJCQkJCQlyZXEtPmFsbG9jLnNpemUsCj4gKwkJ CQkJCQlyZXEtPmFsbG9jLmFsaWdubWVudCk7Cj4gKwkJCWFsbG9jX2luZm8oIjxhbGxvYz4gW3Rp ZDogJWxkXSBoYW5kbGU6ICV1LCBvZmZzZXQ6ICUiIFBSSXg2NAo+ICsJCQkJICAgIiwgYWxpZ25t ZW50OiAlIiBQUkl4NjQgIlxuIiwKPiArCQkJCSAgIChsb25nKSByZXEtPnRpZCwgcmVxLT5hbGxv Yy5oYW5kbGUsCj4gKwkJCQkgICByZXNwLT5hbGxvYy5vZmZzZXQsIHJlcS0+YWxsb2MuYWxpZ25t ZW50KTsKPiArCQkJYnJlYWs7Cj4gKwo+ICsJCWNhc2UgUkVRX0ZSRUU6Cj4gKwkJCXJlc3AtPnJl c3BvbnNlX3R5cGUgPSBSRVNQX0ZSRUU7Cj4gKwkJCXJlc3AtPmZyZWUuZnJlZWQgPSBpYWwtPmZy ZWUoaWFsLCByZXEtPmZyZWUuaGFuZGxlKTsKPiArCQkJYWxsb2NfaW5mbygiPGZyZWU+IFt0aWQ6 ICVsZF0gaGFuZGxlOiAldSwgZnJlZWQ6ICVkXG4iLAo+ICsJCQkJICAgKGxvbmcpIHJlcS0+dGlk LCByZXEtPmZyZWUuaGFuZGxlLCByZXNwLT5mcmVlLmZyZWVkKTsKPiArCQkJYnJlYWs7Cj4gKwo+ ICsJCWNhc2UgUkVRX0lTX0FMTE9DQVRFRDoKPiArCQkJcmVzcC0+cmVzcG9uc2VfdHlwZSA9IFJF U1BfSVNfQUxMT0NBVEVEOwo+ICsJCQlhbGxvY2F0ZWQgPSBpYWwtPmlzX2FsbG9jYXRlZChpYWws Cj4gKwkJCQkJCSAgICAgIHJlcS0+aXNfYWxsb2NhdGVkLmhhbmRsZSwKPiArCQkJCQkJICAgICAg cmVxLT5pc19hbGxvY2F0ZWQuc2l6ZSwKPiArCQkJCQkJICAgICAgcmVxLT5pc19hbGxvY2F0ZWQu b2Zmc2V0KTsKPiArCQkJcmVzcC0+aXNfYWxsb2NhdGVkLmFsbG9jYXRlZCA9IGFsbG9jYXRlZDsK PiArCQkJYWxsb2NfaW5mbygiPGlzIGFsbG9jYXRlZD4gW3RpZDogJWxkXSBvZmZzZXQ6ICUiIFBS SXg2NAo+ICsJCQkJICAgIiwgYWxsb2NhdGVkOiAlZFxuIiwgKGxvbmcpIHJlcS0+dGlkLAo+ICsJ CQkJICAgcmVxLT5pc19hbGxvY2F0ZWQub2Zmc2V0LCBhbGxvY2F0ZWQpOwo+ICsJCQlicmVhazsK PiArCj4gKwkJY2FzZSBSRVFfUkVTRVJWRToKPiArCQkJcmVzcC0+cmVzcG9uc2VfdHlwZSA9IFJF U1BfUkVTRVJWRTsKPiArCQkJcmVzZXJ2ZWQgPSBpYWwtPnJlc2VydmUoaWFsLAo+ICsJCQkJCQly ZXEtPnJlc2VydmUuaGFuZGxlLAo+ICsJCQkJCQlyZXEtPnJlc2VydmUuc3RhcnQsCj4gKwkJCQkJ CXJlcS0+cmVzZXJ2ZS5lbmQpOwo+ICsJCQlyZXNwLT5yZXNlcnZlLnJlc2VydmVkID0gcmVzZXJ2 ZWQ7Cj4gKwkJCWFsbG9jX2luZm8oIjxyZXNlcnZlPiBbdGlkOiAlbGRdIGhhbmRsZTogJXUsIHN0 YXJ0OiAlIiBQUkl4NjQKPiArCQkJCSAgICIsIGVuZDogJSIgUFJJeDY0ICIsIHJlc2VydmVkOiAl ZFxuIiwKPiArCQkJCSAgIChsb25nKSByZXEtPnRpZCwgcmVxLT5yZXNlcnZlLmhhbmRsZSwKPiAr CQkJCSAgIHJlcS0+cmVzZXJ2ZS5zdGFydCwgcmVxLT5yZXNlcnZlLmVuZCwgcmVzZXJ2ZWQpOwo+ ICsJCQlicmVhazsKPiArCj4gKwkJY2FzZSBSRVFfVU5SRVNFUlZFOgo+ICsJCQlyZXNwLT5yZXNw b25zZV90eXBlID0gUkVTUF9VTlJFU0VSVkU7Cj4gKwkJCXVucmVzZXJ2ZWQgPSBpYWwtPnVucmVz ZXJ2ZShpYWwsCj4gKwkJCQkJCSAgICByZXEtPnVucmVzZXJ2ZS5oYW5kbGUsCj4gKwkJCQkJCSAg ICByZXEtPnVucmVzZXJ2ZS5zdGFydCwKPiArCQkJCQkJICAgIHJlcS0+dW5yZXNlcnZlLmVuZCk7 Cj4gKwkJCXJlc3AtPnVucmVzZXJ2ZS51bnJlc2VydmVkID0gdW5yZXNlcnZlZDsKPiArCQkJYWxs b2NfaW5mbygiPHVucmVzZXJ2ZT4gW3RpZDogJWxkXSBoYW5kbGU6ICV1LCBzdGFydDogJSIgUFJJ eDY0Cj4gKwkJCQkgICAiLCBlbmQ6ICUiIFBSSXg2NCAiLCB1bnJlc2VydmVkOiAlZFxuIiwKPiAr CQkJCSAgIChsb25nKSByZXEtPnRpZCwgcmVxLT51bnJlc2VydmUuaGFuZGxlLAo+ICsJCQkJICAg cmVxLT51bnJlc2VydmUuc3RhcnQsIHJlcS0+dW5yZXNlcnZlLmVuZCwKPiArCQkJCSAgIHVucmVz ZXJ2ZWQpOwo+ICsJCQlicmVhazsKPiArCj4gKwkJY2FzZSBSRVFfSVNfUkVTRVJWRUQ6Cj4gKwkJ CXJlc3AtPnJlc3BvbnNlX3R5cGUgPSBSRVNQX0lTX1JFU0VSVkVEOwo+ICsJCQlyZXNlcnZlZCA9 IGlhbC0+aXNfcmVzZXJ2ZWQoaWFsLAo+ICsJCQkJCQkgICAgcmVxLT5pc19yZXNlcnZlZC5zdGFy dCwKPiArCQkJCQkJICAgIHJlcS0+aXNfcmVzZXJ2ZWQuZW5kKTsKPiArCQkJcmVzcC0+aXNfcmVz ZXJ2ZWQucmVzZXJ2ZWQgPSByZXNlcnZlZDsKPiArCQkJYWxsb2NfaW5mbygiPGlzIHJlc2VydmVk PiBbdGlkOiAlbGRdIHN0YXJ0OiAlIiBQUkl4NjQKPiArCQkJCSAgICIsIGVuZDogJSIgUFJJeDY0 ICIsIHJlc2VydmVkOiAlZFxuIiwKPiArCQkJCSAgIChsb25nKSByZXEtPnRpZCwgcmVxLT5pc19y ZXNlcnZlZC5zdGFydCwKPiArCQkJCSAgIHJlcS0+aXNfcmVzZXJ2ZWQuZW5kLCByZXNlcnZlZCk7 Cj4gKwkJCWJyZWFrOwo+ICsKPiArCQljYXNlIFJFUV9SRVNFUlZFX0lGX05PVF9BTExPQ0FURUQ6 Cj4gKwkJCXJlc3AtPnJlc3BvbnNlX3R5cGUgPSBSRVNQX1JFU0VSVkVfSUZfTk9UX0FMTE9DQVRF RDsKPiArCQkJc2l6ZSA9IERFQ0FOT05JQ0FMKHJlcS0+cmVzZXJ2ZS5lbmQpIC0gREVDQU5PTklD QUwocmVxLT5yZXNlcnZlLnN0YXJ0KTsKPiArCj4gKwkJCWFsbG9jYXRlZCA9IGlhbC0+aXNfYWxs b2NhdGVkKGlhbCwgcmVxLT5yZXNlcnZlLmhhbmRsZSwKPiArCQkJCQkJICAgICAgc2l6ZSwgcmVx LT5yZXNlcnZlLnN0YXJ0KTsKPiArCQkJaWYgKGFsbG9jYXRlZCkgewo+ICsJCQkJcmVzcC0+cmVz ZXJ2ZV9pZl9ub3RfYWxsb2NhdGVkLmFsbG9jYXRlZCA9IGFsbG9jYXRlZDsKPiArCQkJCWFsbG9j X2luZm8oIjxyZXNlcnZlIGlmIG5vdCBhbGxvY2F0ZWQ+IFt0aWQ6ICVsZF0gaGFuZGxlOiAldSAi Cj4gKwkJCQkJICAgInNpemU6ICVseCwgc3RhcnQ6ICUiIFBSSXg2NAo+ICsJCQkJCSAgICIsIGVu ZDogJSIgUFJJeDY0ICIsIGFsbG9jYXRlZDogJWQsIHJlc2VydmVkOiAlZFxuIiwKPiArCQkJCQkg ICAobG9uZykgcmVxLT50aWQsIHJlcS0+cmVzZXJ2ZS5oYW5kbGUsCj4gKwkJCQkJICAgKGxvbmcp IHNpemUsIHJlcS0+cmVzZXJ2ZS5zdGFydCwKPiArCQkJCQkgICByZXEtPnJlc2VydmUuZW5kLCBh bGxvY2F0ZWQsIGZhbHNlKTsKPiArCQkJCWJyZWFrOwo+ICsJCQl9Cj4gKwo+ICsJCQlyZXNlcnZl ZCA9IGlhbC0+cmVzZXJ2ZShpYWwsCj4gKwkJCQkJCXJlcS0+cmVzZXJ2ZS5oYW5kbGUsCj4gKwkJ CQkJCXJlcS0+cmVzZXJ2ZS5zdGFydCwKPiArCQkJCQkJcmVxLT5yZXNlcnZlLmVuZCk7Cj4gKwkJ CXJlc3AtPnJlc2VydmVfaWZfbm90X2FsbG9jYXRlZC5yZXNlcnZlZCA9IHJlc2VydmVkOwo+ICsJ CQlhbGxvY19pbmZvKCI8cmVzZXJ2ZSBpZiBub3QgYWxsb2NhdGVkPiBbdGlkOiAlbGRdIGhhbmRs ZTogJXUiCj4gKwkJCQkgICAiLCBzdGFydDogJSIgUFJJeDY0Cj4gKwkJCQkgICAiLCBlbmQ6ICUi IFBSSXg2NCAiLCBhbGxvY2F0ZWQ6ICVkLCByZXNlcnZlZDogJWRcbiIsCj4gKwkJCQkgICAobG9u ZykgcmVxLT50aWQsIHJlcS0+cmVzZXJ2ZS5oYW5kbGUsCj4gKwkJCQkgICByZXEtPnJlc2VydmUu c3RhcnQsIHJlcS0+cmVzZXJ2ZS5lbmQsCj4gKwkJCQkgICBmYWxzZSwgcmVzZXJ2ZWQpOwo+ICsJ CQlicmVhazsKPiArCj4gKwkJfQo+ICsKPiArCQlpZiAocmVxLT5yZXF1ZXN0X3R5cGUgPiBSRVFf Q0xPU0UpCj4gKwkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZpYWwtPm11dGV4KTsKPiArCj4gKwkJ cmV0dXJuIDA7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gc2VuZF9yZXFfcmVjdl9yZXNwKGNoYW5uZWws IHJlcSwgcmVzcCk7Cj4gKwo+ICsJaWYgKHJldCA8IDApCj4gKwkJZXhpdCgwKTsKPiArCj4gKwly ZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBraWxsX2NoaWxkcmVuKGludCBzaWcp Cj4gK3sKPiArCXNpZ25hbChzaWcsIFNJR19JR04pOwo+ICsJa2lsbCgtZ2V0cGdycCgpLCBzaWcp Owo+ICsJc2lnbmFsKHNpZywgU0lHX0RGTCk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkICphbGxv Y2F0b3JfdGhyZWFkX2xvb3Aodm9pZCAqZGF0YSkKPiArewo+ICsJc3RydWN0IGFsbG9jX3JlcSBy ZXE7Cj4gKwlzdHJ1Y3QgYWxsb2NfcmVzcCByZXNwOwo+ICsJaW50IHJldDsKPiArCSh2b2lkKSBk YXRhOwo+ICsKPiArCWFsbG9jX2luZm8oIkFsbG9jYXRvciBwaWQ6ICVsZCwgdGlkOiAlbGRcbiIs Cj4gKwkJICAgKGxvbmcpIGFsbG9jYXRvcl9waWQsIChsb25nKSBnZXR0aWQoKSk7Cj4gKwlhbGxv Y19pbmZvKCJFbnRlcmluZyBhbGxvY2F0b3IgbG9vcFxuIik7Cj4gKwo+ICsJd2hpbGUgKDEpIHsK PiArCQlyZXQgPSByZWN2X3JlcShjaGFubmVsLCAmcmVxKTsKPiArCj4gKwkJaWYgKHJldCA9PSAt MSkgewo+ICsJCQlpZ3Rfd2FybigiRXJyb3IgcmVjZWl2aW5nIHJlcXVlc3QgaW4gdGhyZWFkLCBy ZXQgPSAlZCBbJXNdXG4iLAo+ICsJCQkJIHJldCwgc3RyZXJyb3IoZXJybm8pKTsKPiArCQkJa2ls bF9jaGlsZHJlbihTSUdJTlQpOwo+ICsJCQlyZXR1cm4gKHZvaWQgKikgLTE7Cj4gKwkJfQo+ICsK PiArCQkvKiBGYWtlIG1lc3NhZ2UgdG8gc3RvcCB0aGUgdGhyZWFkICovCj4gKwkJaWYgKHJlcS5y ZXF1ZXN0X3R5cGUgPT0gUkVRX1NUT1ApIHsKPiArCQkJYWxsb2NfaW5mbygiPHN0b3AgcmVxdWVz dD5cbiIpOwo+ICsJCQlicmVhazsKPiArCQl9Cj4gKwo+ICsJCXJldCA9IGhhbmRsZV9yZXF1ZXN0 KCZyZXEsICZyZXNwKTsKPiArCQlpZiAocmV0KSB7Cj4gKwkJCWlndF93YXJuKCJFcnJvciBoYW5k bGluZyByZXF1ZXN0IGluIHRocmVhZCwgcmV0ID0gJWQgWyVzXVxuIiwKPiArCQkJCSByZXQsIHN0 cmVycm9yKGVycm5vKSk7Cj4gKwkJCWJyZWFrOwo+ICsJCX0KPiArCj4gKwkJcmV0ID0gc2VuZF9y ZXNwKGNoYW5uZWwsIHJlcS50aWQsICZyZXNwKTsKPiArCQlpZiAocmV0KSB7Cj4gKwkJCWlndF93 YXJuKCJFcnJvciBzZW5kaW5nIHJlc3BvbnNlIGluIHRocmVhZCwgcmV0ID0gJWQgWyVzXVxuIiwK PiArCQkJCSByZXQsIHN0cmVycm9yKGVycm5vKSk7Cj4gKwo+ICsJCQlraWxsX2NoaWxkcmVuKFNJ R0lOVCk7Cj4gKwkJCXJldHVybiAodm9pZCAqKSAtMTsKPiArCQl9Cj4gKwl9Cj4gKwo+ICsJcmV0 dXJuIE5VTEw7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBpbnRlbF9hbGxvY2F0b3JfbXVsdGlwcm9j ZXNzX3N0YXJ0Ogo+ICsgKgo+ICsgKiBGdW5jdGlvbiB0dXJucyBvbiBpbnRlbF9hbGxvY2F0b3Ig bXVsdGlwcm9jZXNzIG1vZGUgd2hhdCBtZWFucwo+ICsgKiBhbGwgYWxsb2NhdGlvbnMgZnJvbSBj aGlsZHJlbiBwcm9jZXNzZXMgYXJlIHBlcmZvcm1lZCBpbiBhIHNlcGFyYXRlIHRocmVhZAo+ICsg KiB3aXRoaW4gbWFpbiBpZ3QgcHJvY2Vzcy4gQ2hpbGRyZW4gYXJlIGF3YXJlIG9mIHRoZSBzaXR1 YXRpb24gYW5kIHVzZQo+ICsgKiBzb21lIGludGVycHJvY2VzcyBjb21tdW5pY2F0aW9uIGNoYW5u ZWwgdG8gc2VuZC9yZWNlaXZlIG1lc3NhZ2VzCj4gKyAqIChvcGVuLCBjbG9zZSwgYWxsb2MsIGZy ZWUsIC4uLikgdG8vZnJvbSBhbGxvY2F0b3IgdGhyZWFkLgo+ICsgKgo+ICsgKiBNdXN0IGJlIHVz ZWQgd2hlbiB5b3Ugd2FudCB0byB1c2UgYW4gYWxsb2NhdG9yIGluIG5vbiBzaW5nbGUtcHJvY2Vz cyBjb2RlLgo+ICsgKiBBbGwgYWxsb2NhdGlvbnMgaW4gdGhyZWFkcyBzcGF3bmVkIGluIG1haW4g aWd0IHByb2Nlc3MgYXJlIGhhbmRsZWQgYnkKPiArICogbXV0ZXhpbmcsIG5vdCBieSBzZW5kaW5n L3JlY2VpdmluZyBtZXNzYWdlcyB0by9mcm9tIGFsbG9jYXRvciB0aHJlYWQuCj4gKyAqCj4gKyAq IE5vdGUuIFRoaXMgZGVzdHJveXMgYWxsIHByZXZpb3VzbHkgY3JlYXRlZCBhbGxvY2F0b3JzIGFu ZCB0aGVpcnMgY29udGVudC4KPiArICovCj4gK3ZvaWQgaW50ZWxfYWxsb2NhdG9yX211bHRpcHJv Y2Vzc19zdGFydCh2b2lkKQo+ICt7Cj4gKwlhbGxvY19pbmZvKCJhbGxvY2F0b3IgbXVsdGlwcm9j ZXNzIHN0YXJ0XG4iKTsKPiArCj4gKwlpbnRlbF9hbGxvY2F0b3JfaW5pdCgpOwo+ICsKPiArCW11 bHRpcHJvY2VzcyA9IHRydWU7Cj4gKwljaGFubmVsLT5pbml0KGNoYW5uZWwpOwo+ICsKPiArCXB0 aHJlYWRfY3JlYXRlKCZhbGxvY2F0b3JfdGhyZWFkLCBOVUxMLAo+ICsJCSAgICAgICBhbGxvY2F0 b3JfdGhyZWFkX2xvb3AsIE5VTEwpOwo+ICt9Cj4gKwo+ICsvKioKPiArICogaW50ZWxfYWxsb2Nh dG9yX211bHRpcHJvY2Vzc19zdG9wOgo+ICsgKgo+ICsgKiBGdW5jdGlvbiB0dXJucyBvZmYgaW50 ZWxfYWxsb2NhdG9yIG11bHRpcHJvY2VzcyBtb2RlIHdoYXQgbWVhbnMgbWVhbnMKPiArICogc3Rv cHBpbmcgYWxsb2NhdG9yIHRocmVhZCBhbmQgZGVpbml0aWFsaXppbmcgaXRzIGRhdGEuCj4gKyAq Lwo+ICt2b2lkIGludGVsX2FsbG9jYXRvcl9tdWx0aXByb2Nlc3Nfc3RvcCh2b2lkKQo+ICt7Cj4g KwlhbGxvY19pbmZvKCJhbGxvY2F0b3IgbXVsdGlwcm9jZXNzIHN0b3BcbiIpOwo+ICsKPiArCWlm IChtdWx0aXByb2Nlc3MpIHsKPiArCQlzZW5kX2FsbG9jX3N0b3AoY2hhbm5lbCk7Cj4gKwkJLyog RGVpbml0LCB0aGlzIHNob3VsZCBzdG9wIGFsbCBibG9ja2VkIHN5c2NhbGxzLCBpZiBhbnkgKi8K PiArCQljaGFubmVsLT5kZWluaXQoY2hhbm5lbCk7Cj4gKwkJcHRocmVhZF9qb2luKGFsbG9jYXRv cl90aHJlYWQsIE5VTEwpOwo+ICsJCS8qIEJ1dCB3ZSdyZSBub3Qgc3VyZSBkb2VzIGNoaWxkIHdp bGwgc3R1Y2sgKi8KPiArCQlraWxsX2NoaWxkcmVuKFNJR0lOVCk7Cj4gKwkJaWd0X3dhaXRjaGls ZHJlbl90aW1lb3V0KDUsICJTdG9wcGluZyBjaGlsZHJlbiIpOwo+ICsJCW11bHRpcHJvY2VzcyA9 IGZhbHNlOwo+ICsJfQo+ICt9Cj4gKwo+ICsvKioKPiArICogaW50ZWxfYWxsb2NhdG9yX29wZW46 Cj4gKyAqIEBmZDogaTkxNSBkZXNjcmlwdG9yCj4gKyAqIEBjdHg6IGNvbnRleHQKPiArICogQGFs bG9jYXRvcl90eXBlOiBvbmUgb2YgSU5URUxfQUxMT0NBVE9SXyogZGVmaW5lCj4gKyAqCj4gKyAq IEZ1bmN0aW9uIG9wZW5zIGFuIGFsbG9jYXRvciBpbnN0YW5jZSBmb3IgZ2l2ZW4gQGZkIGFuZCBA Y3R4IGFuZCByZXR1cm5zCj4gKyAqIGl0cyBoYW5kbGUuIElmIHRoZSBhbGxvY2F0b3IgZm9yIHN1 Y2ggcGFpciBkb2Vzbid0IGV4aXN0IGl0IGlzIGNyZWF0ZWQKPiArICogd2l0aCByZWZjb3VudCA9 IDEuIFBhcmFsbGVsIG9wZW5zIHJldHVybnMgc2FtZSBoYW5kbGUgYnVtcGluZyBpdHMgcmVmY291 bnQuCj4gKyAqCj4gKyAqIFJldHVybnM6IHVuaXF1ZSBoYW5kbGUgdG8gdGhlIGN1cnJlbnRseSBv cGVuZWQgYWxsb2NhdG9yLgo+ICsgKi8KPiArdWludDY0X3QgaW50ZWxfYWxsb2NhdG9yX29wZW4o aW50IGZkLCB1aW50MzJfdCBjdHgsIHVpbnQ4X3QgYWxsb2NhdG9yX3R5cGUpCj4gK3sKPiArCXN0 cnVjdCBhbGxvY19yZXEgcmVxID0geyAucmVxdWVzdF90eXBlID0gUkVRX09QRU4sCj4gKwkJCQkg Lm9wZW4uZmQgPSBmZCwKPiArCQkJCSAub3Blbi5jdHggPSBjdHgsCj4gKwkJCQkgLm9wZW4uYWxs b2NhdG9yX3R5cGUgPSBhbGxvY2F0b3JfdHlwZSB9Owo+ICsJc3RydWN0IGFsbG9jX3Jlc3AgcmVz cDsKPiArCj4gKwkvKiBHZXQgY2hpbGRfdGlkIG9ubHkgb25jZSBhdCBvcGVuKCkgKi8KPiArCWlm IChjaGlsZF90aWQgPT0gLTEpCj4gKwkJY2hpbGRfdGlkID0gZ2V0dGlkKCk7Cj4gKwo+ICsJaWd0 X2Fzc2VydChoYW5kbGVfcmVxdWVzdCgmcmVxLCAmcmVzcCkgPT0gMCk7Cj4gKwlpZ3RfYXNzZXJ0 KHJlc3Aub3Blbi5hbGxvY2F0b3JfaGFuZGxlKTsKPiArCWlndF9hc3NlcnQocmVzcC5yZXNwb25z ZV90eXBlID09IFJFU1BfT1BFTik7Cj4gKwo+ICsJcmV0dXJuIHJlc3Aub3Blbi5hbGxvY2F0b3Jf aGFuZGxlOwo+ICt9Cj4gKwo+ICsvKioKPiArICogaW50ZWxfYWxsb2NhdG9yX2Nsb3NlOgo+ICsg KiBAYWxsb2NhdG9yX2hhbmRsZTogaGFuZGxlIHRvIHRoZSBhbGxvY2F0b3IgdGhhdCB3aWxsIGJl IGNsb3NlZAo+ICsgKgo+ICsgKiBGdW5jdGlvbiBkZWNyZWFzZXMgYW4gYWxsb2NhdG9yIHJlZmNv dW50IGZvciB0aGUgZ2l2ZW4gQGhhbmRsZS4KPiArICogV2hlbiByZWZjb3VudCByZWFjaGVzIHpl cm8gYWxsb2NhdG9yIGlzIGNsb3NlZCAoZGVzdHJveWVkKSBhbmQgYWxsCj4gKyAqIGFsbG9jYXRl ZCAvIHJlc2VydmVkIGFyZWFzIGFyZSBmcmVlZC4KPiArICoKPiArICogUmV0dXJuczogdHJ1ZSBp ZiBjbG9zZWQgYWxsb2NhdG9yIHdhcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLgo+ICsgKi8KPiAr Ym9vbCBpbnRlbF9hbGxvY2F0b3JfY2xvc2UodWludDY0X3QgYWxsb2NhdG9yX2hhbmRsZSkKPiAr ewo+ICsJc3RydWN0IGFsbG9jX3JlcSByZXEgPSB7IC5yZXF1ZXN0X3R5cGUgPSBSRVFfQ0xPU0Us Cj4gKwkJCQkgLmFsbG9jYXRvcl9oYW5kbGUgPSBhbGxvY2F0b3JfaGFuZGxlIH07Cj4gKwlzdHJ1 Y3QgYWxsb2NfcmVzcCByZXNwOwo+ICsKPiArCWlndF9hc3NlcnQoaGFuZGxlX3JlcXVlc3QoJnJl cSwgJnJlc3ApID09IDApOwo+ICsJaWd0X2Fzc2VydChyZXNwLnJlc3BvbnNlX3R5cGUgPT0gUkVT UF9DTE9TRSk7Cj4gKwo+ICsJcmV0dXJuIHJlc3AuY2xvc2UuaXNfZW1wdHk7Cj4gK30KPiArCj4g Ky8qKgo+ICsgKiBpbnRlbF9hbGxvY2F0b3JfZ2V0X2FkZHJlc3NfcmFuZ2U6Cj4gKyAqIEBhbGxv Y2F0b3JfaGFuZGxlOiBoYW5kbGUgdG8gYW4gYWxsb2NhdG9yCj4gKyAqIEBzdGFydHA6IHBvaW50 ZXIgdG8gdGhlIHZhcmlhYmxlIHdoZXJlIGZ1bmN0aW9uIHdyaXRlcyBzdGFydGluZyBvZmZzZXQK PiArICogQGVuZHA6IHBvaW50ZXIgdG8gdGhlIHZhcmlhYmxlIHdoZXJlIGZ1bmN0aW9uIHdyaXRl cyBlbmRpbmcgb2Zmc2V0Cj4gKyAqCj4gKyAqIEZ1bmN0aW9uIGZpbGxzIEBzdGFydHAsIEBlbmRw IHdpdGggcmVzcGVjdGl2ZWx5LCBzdGFydGluZyBhbmQgZW5kaW5nIG9mZnNldAo+ICsgKiBvZiB0 aGUgYWxsb2NhdG9yIHdvcmtpbmcgdmlydHVhbCBhZGRyZXNzIHNwYWNlIHJhbmdlLgo+ICsgKgo+ ICsgKiBOb3RlLiBBbGxvY2F0b3JzIHdvcmtpbmcgcmFuZ2VzIGNhbiBkaWZmZXIgZGVwZW5kaW5n IG9uIHRoZSBkZXZpY2Ugb3IKPiArICogdGhlIGFsbG9jYXRvciB0eXBlIHNvIGJlZm9yZSByZXNl cnZpbmcgYSBzcGVjaWZpYyBvZmZzZXQgYSBnb29kIHByYWN0aXNlCj4gKyAqIGlzIHRvIGVuc3Vy ZSB0aGF0IGFkZHJlc3MgaXMgYmV0d2VlbiBhY2NlcHRlZCByYW5nZS4KPiArICovCj4gK3ZvaWQg aW50ZWxfYWxsb2NhdG9yX2dldF9hZGRyZXNzX3JhbmdlKHVpbnQ2NF90IGFsbG9jYXRvcl9oYW5k bGUsCj4gKwkJCQkgICAgICAgdWludDY0X3QgKnN0YXJ0cCwgdWludDY0X3QgKmVuZHApCj4gK3sK PiArCXN0cnVjdCBhbGxvY19yZXEgcmVxID0geyAucmVxdWVzdF90eXBlID0gUkVRX0FERFJFU1Nf UkFOR0UsCj4gKwkJCQkgLmFsbG9jYXRvcl9oYW5kbGUgPSBhbGxvY2F0b3JfaGFuZGxlIH07Cj4g KwlzdHJ1Y3QgYWxsb2NfcmVzcCByZXNwOwo+ICsKPiArCWlndF9hc3NlcnQoaGFuZGxlX3JlcXVl c3QoJnJlcSwgJnJlc3ApID09IDApOwo+ICsJaWd0X2Fzc2VydChyZXNwLnJlc3BvbnNlX3R5cGUg PT0gUkVTUF9BRERSRVNTX1JBTkdFKTsKPiArCj4gKwlpZiAoc3RhcnRwKQo+ICsJCSpzdGFydHAg PSByZXNwLmFkZHJlc3NfcmFuZ2Uuc3RhcnQ7Cj4gKwo+ICsJaWYgKGVuZHApCj4gKwkJKmVuZHAg PSByZXNwLmFkZHJlc3NfcmFuZ2UuZW5kOwo+ICt9Cj4gKwo+ICsvKioKPiArICogaW50ZWxfYWxs b2NhdG9yX2FsbG9jOgo+ICsgKiBAYWxsb2NhdG9yX2hhbmRsZTogaGFuZGxlIHRvIGFuIGFsbG9j YXRvcgo+ICsgKiBAaGFuZGxlOiBoYW5kbGUgdG8gYW4gb2JqZWN0Cj4gKyAqIEBzaXplOiBzaXpl IG9mIGFuIG9iamVjdAo+ICsgKiBAYWxpZ25tZW50OiBkZXRlcm1pbmVzIG9iamVjdCBhbGlnbm1l bnQKPiArICoKPiArICogRnVuY3Rpb24gZmluZHMgYW5kIHJldHVybnMgdGhlIG1vc3Qgc3VpdGFi bGUgb2Zmc2V0IHdpdGggZ2l2ZW4gQGFsaWdubWVudAo+ICsgKiBmb3IgYW4gb2JqZWN0IHdpdGgg QHNpemUgaWRlbnRpZmllZCBieSB0aGUgQGhhbmRsZS4KPiArICoKPiArICogUmV0dXJuczogY3Vy cmVudGx5IGFzc2lnbmVkIGFkZHJlc3MgZm9yIGEgZ2l2ZW4gb2JqZWN0LiBJZiBhbiBvYmplY3Qg d2FzCj4gKyAqIGFscmVhZHkgYWxsb2NhdGVkIHJldHVybnMgc2FtZSBhZGRyZXNzLgo+ICsgKi8K PiArdWludDY0X3QgaW50ZWxfYWxsb2NhdG9yX2FsbG9jKHVpbnQ2NF90IGFsbG9jYXRvcl9oYW5k bGUsIHVpbnQzMl90IGhhbmRsZSwKPiArCQkJICAgICAgIHVpbnQ2NF90IHNpemUsIHVpbnQ2NF90 IGFsaWdubWVudCkKPiArewo+ICsJc3RydWN0IGFsbG9jX3JlcSByZXEgPSB7IC5yZXF1ZXN0X3R5 cGUgPSBSRVFfQUxMT0MsCj4gKwkJCQkgLmFsbG9jYXRvcl9oYW5kbGUgPSBhbGxvY2F0b3JfaGFu ZGxlLAo+ICsJCQkJIC5hbGxvYy5oYW5kbGUgPSBoYW5kbGUsCj4gKwkJCQkgLmFsbG9jLnNpemUg PSBzaXplLAo+ICsJCQkJIC5hbGxvYy5hbGlnbm1lbnQgPSBhbGlnbm1lbnQgfTsKPiArCXN0cnVj dCBhbGxvY19yZXNwIHJlc3A7Cj4gKwo+ICsJaWd0X2Fzc2VydChoYW5kbGVfcmVxdWVzdCgmcmVx LCAmcmVzcCkgPT0gMCk7Cj4gKwlpZ3RfYXNzZXJ0KHJlc3AucmVzcG9uc2VfdHlwZSA9PSBSRVNQ X0FMTE9DKTsKPiArCj4gKwlyZXR1cm4gcmVzcC5hbGxvYy5vZmZzZXQ7Cj4gK30KPiArCj4gKy8q Kgo+ICsgKiBpbnRlbF9hbGxvY2F0b3JfZnJlZToKPiArICogQGFsbG9jYXRvcl9oYW5kbGU6IGhh bmRsZSB0byBhbiBhbGxvY2F0b3IKPiArICogQGhhbmRsZTogaGFuZGxlIHRvIGFuIG9iamVjdCB0 byBiZSBmcmVlZAo+ICsgKgo+ICsgKiBGdW5jdGlvbiBmcmVlIG9iamVjdCBpZGVudGlmaWVkIGJ5 IHRoZSBAaGFuZGxlIGluIGFsbG9jYXRvciB3aGF0IG1ha2VzIGl0Cj4gKyAqIG9mZnNldCBhZ2Fp biBhbGxvY2FibGUuCj4gKyAqCj4gKyAqIE5vdGUuIFJlc2VydmVkIG9iamVjdHMgY2FuIG9ubHkg YmUgZnJlZWQgYnkgYW4gI2ludGVsX2FsbG9jYXRvcl91bnJlc2VydmUKPiArICogZnVuY3Rpb24u Cj4gKyAqCj4gKyAqIFJldHVybnM6IHRydWUgaWYgdGhlIG9iamVjdCB3YXMgc3VjY2Vzc2Z1bGx5 IGZyZWVkLCBvdGhlcndpc2UgZmFsc2UuCj4gKyAqLwo+ICtib29sIGludGVsX2FsbG9jYXRvcl9m cmVlKHVpbnQ2NF90IGFsbG9jYXRvcl9oYW5kbGUsIHVpbnQzMl90IGhhbmRsZSkKPiArewo+ICsJ c3RydWN0IGFsbG9jX3JlcSByZXEgPSB7IC5yZXF1ZXN0X3R5cGUgPSBSRVFfRlJFRSwKPiArCQkJ CSAuYWxsb2NhdG9yX2hhbmRsZSA9IGFsbG9jYXRvcl9oYW5kbGUsCj4gKwkJCQkgLmZyZWUuaGFu ZGxlID0gaGFuZGxlIH07Cj4gKwlzdHJ1Y3QgYWxsb2NfcmVzcCByZXNwOwo+ICsKPiArCWlndF9h c3NlcnQoaGFuZGxlX3JlcXVlc3QoJnJlcSwgJnJlc3ApID09IDApOwo+ICsJaWd0X2Fzc2VydChy ZXNwLnJlc3BvbnNlX3R5cGUgPT0gUkVTUF9GUkVFKTsKPiArCj4gKwlyZXR1cm4gcmVzcC5mcmVl LmZyZWVkOwo+ICt9Cj4gKwo+ICsvKioKPiArICogaW50ZWxfYWxsb2NhdG9yX2lzX2FsbG9jYXRl ZDoKPiArICogQGFsbG9jYXRvcl9oYW5kbGU6IGhhbmRsZSB0byBhbiBhbGxvY2F0b3IKPiArICog QGhhbmRsZTogaGFuZGxlIHRvIGFuIG9iamVjdAo+ICsgKiBAc2l6ZTogc2l6ZSBvZiBhbiBvYmpl Y3QKPiArICogQG9mZnNldDogYWRkcmVzcyBvZiBhbiBvYmplY3QKPiArICoKPiArICogRnVuY3Rp b24gY2hlY2tzIHdoZXRoZXIgdGhlIG9iamVjdCBpZGVudGlmaWVkIGJ5IHRoZSBAaGFuZGxlIGFu ZCBAc2l6ZQo+ICsgKiBpcyBhbGxvY2F0ZWQgYXQgdGhlIEBvZmZzZXQuCj4gKyAqCj4gKyAqIFJl dHVybnM6IHRydWUgaWYgdGhlIG9iamVjdCBpcyBjdXJyZW50bHkgYWxsb2NhdGVkIGF0IHRoZSBA b2Zmc2V0LAo+ICsgKiBvdGhlcndpc2UgZmFsc2UuCj4gKyAqLwo+ICtib29sIGludGVsX2FsbG9j YXRvcl9pc19hbGxvY2F0ZWQodWludDY0X3QgYWxsb2NhdG9yX2hhbmRsZSwgdWludDMyX3QgaGFu ZGxlLAo+ICsJCQkJICB1aW50NjRfdCBzaXplLCB1aW50NjRfdCBvZmZzZXQpCj4gK3sKPiArCXN0 cnVjdCBhbGxvY19yZXEgcmVxID0geyAucmVxdWVzdF90eXBlID0gUkVRX0lTX0FMTE9DQVRFRCwK PiArCQkJCSAuYWxsb2NhdG9yX2hhbmRsZSA9IGFsbG9jYXRvcl9oYW5kbGUsCj4gKwkJCQkgLmlz X2FsbG9jYXRlZC5oYW5kbGUgPSBoYW5kbGUsCj4gKwkJCQkgLmlzX2FsbG9jYXRlZC5zaXplID0g c2l6ZSwKPiArCQkJCSAuaXNfYWxsb2NhdGVkLm9mZnNldCA9IG9mZnNldCB9Owo+ICsJc3RydWN0 IGFsbG9jX3Jlc3AgcmVzcDsKPiArCj4gKwlpZ3RfYXNzZXJ0KGhhbmRsZV9yZXF1ZXN0KCZyZXEs ICZyZXNwKSA9PSAwKTsKPiArCWlndF9hc3NlcnQocmVzcC5yZXNwb25zZV90eXBlID09IFJFU1Bf SVNfQUxMT0NBVEVEKTsKPiArCj4gKwlyZXR1cm4gcmVzcC5pc19hbGxvY2F0ZWQuYWxsb2NhdGVk Owo+ICt9Cj4gKwo+ICsvKioKPiArICogaW50ZWxfYWxsb2NhdG9yX3Jlc2VydmU6Cj4gKyAqIEBh bGxvY2F0b3JfaGFuZGxlOiBoYW5kbGUgdG8gYW4gYWxsb2NhdG9yCj4gKyAqIEBoYW5kbGU6IGhh bmRsZSB0byBhbiBvYmplY3QKPiArICogQHNpemU6IHNpemUgb2YgYW4gb2JqZWN0Cj4gKyAqIEBv ZmZzZXQ6IGFkZHJlc3Mgb2YgYW4gb2JqZWN0Cj4gKyAqCj4gKyAqIEZ1bmN0aW9uIHJlc2VydmVz IHNwYWNlIHRoYXQgc3RhcnRzIGF0IHRoZSBAb2Zmc2V0IGFuZCBoYXMgQHNpemUuCj4gKyAqIE9w dGlvbmFsbHkgd2UgY2FuIHBhc3MgQGhhbmRsZSB0byBtYXJrIHRoYXQgc3BhY2UgaXMgZm9yIGEg c3BlY2lmaWMKPiArICogb2JqZWN0LCBvdGhlcndpc2UgcGFzcyAtMS4KPiArICoKPiArICogTm90 ZS4gUmVzZXJ2ZWQgc3BhY2UgaXMgaWRlbnRpZmllZCBieSBvZmZzZXQgYW5kIHNpemUsIG5vdCBh IGhhbmRsZS4KPiArICogU28gYW4gb2JqZWN0IGNhbiBoYXZlIG11bHRpcGxlIHJlc2VydmVkIHNw YWNlcyB3aXRoIGl0cyBoYW5kbGUuCj4gKyAqCj4gKyAqIFJldHVybnM6IHRydWUgaWYgc3BhY2Ug aXMgc3VjY2Vzc2Z1bGx5IHJlc2VydmVkLCBvdGhlcndpc2UgZmFsc2UuCj4gKyAqLwo+ICtib29s IGludGVsX2FsbG9jYXRvcl9yZXNlcnZlKHVpbnQ2NF90IGFsbG9jYXRvcl9oYW5kbGUsIHVpbnQz Ml90IGhhbmRsZSwKPiArCQkJICAgICB1aW50NjRfdCBzaXplLCB1aW50NjRfdCBvZmZzZXQpCj4g K3sKPiArCXN0cnVjdCBhbGxvY19yZXEgcmVxID0geyAucmVxdWVzdF90eXBlID0gUkVRX1JFU0VS VkUsCj4gKwkJCQkgLmFsbG9jYXRvcl9oYW5kbGUgPSBhbGxvY2F0b3JfaGFuZGxlLAo+ICsJCQkJ IC5yZXNlcnZlLmhhbmRsZSA9IGhhbmRsZSwKPiArCQkJCSAucmVzZXJ2ZS5zdGFydCA9IG9mZnNl dCwKPiArCQkJCSAucmVzZXJ2ZS5lbmQgPSBvZmZzZXQgKyBzaXplIH07Cj4gKwlzdHJ1Y3QgYWxs b2NfcmVzcCByZXNwOwo+ICsKPiArCWlndF9hc3NlcnQoaGFuZGxlX3JlcXVlc3QoJnJlcSwgJnJl c3ApID09IDApOwo+ICsJaWd0X2Fzc2VydChyZXNwLnJlc3BvbnNlX3R5cGUgPT0gUkVTUF9SRVNF UlZFKTsKPiArCj4gKwlyZXR1cm4gcmVzcC5yZXNlcnZlLnJlc2VydmVkOwo+ICt9Cj4gKwo+ICsv KioKPiArICogaW50ZWxfYWxsb2NhdG9yX3VucmVzZXJ2ZToKPiArICogQGFsbG9jYXRvcl9oYW5k bGU6IGhhbmRsZSB0byBhbiBhbGxvY2F0b3IKPiArICogQGhhbmRsZTogaGFuZGxlIHRvIGFuIG9i amVjdAo+ICsgKiBAc2l6ZTogc2l6ZSBvZiBhbiBvYmplY3QKPiArICogQG9mZnNldDogYWRkcmVz cyBvZiBhbiBvYmplY3QKPiArICoKPiArICogRnVuY3Rpb24gdW5yZXNlcnZlcyBzcGFjZSB0aGF0 IHN0YXJ0cyBhdCB0aGUgQG9mZnNldCwgQHNpemUgYW5kIEBoYW5kbGUuCj4gKyAqCj4gKyAqIE5v dGUuIEBoYW5kbGUsIEBzaXplIGFuZCBAb2Zmc2V0IGhhdmUgdG8gbWF0Y2ggdGhvc2UgdXNlZCBp biByZXNlcnZhdGlvbi4KPiArICogaS5lLiBjaGVjayB3aXRoIHRoZSBzYW1lIG9mZnNldCBidXQg ZXZlbiBzbWFsbGVyIHNpemUgd2lsbCBmYWlsLgo+ICsgKgo+ICsgKiBSZXR1cm5zOiB0cnVlIGlm IHRoZSBzcGFjZSBpcyBzdWNjZXNzZnVsbHkgdW5yZXNlcnZlZCwgb3RoZXJ3aXNlIGZhbHNlLgo+ ICsgKi8KPiArYm9vbCBpbnRlbF9hbGxvY2F0b3JfdW5yZXNlcnZlKHVpbnQ2NF90IGFsbG9jYXRv cl9oYW5kbGUsIHVpbnQzMl90IGhhbmRsZSwKPiArCQkJICAgICAgIHVpbnQ2NF90IHNpemUsIHVp bnQ2NF90IG9mZnNldCkKPiArewo+ICsJc3RydWN0IGFsbG9jX3JlcSByZXEgPSB7IC5yZXF1ZXN0 X3R5cGUgPSBSRVFfVU5SRVNFUlZFLAo+ICsJCQkJIC5hbGxvY2F0b3JfaGFuZGxlID0gYWxsb2Nh dG9yX2hhbmRsZSwKPiArCQkJCSAudW5yZXNlcnZlLmhhbmRsZSA9IGhhbmRsZSwKPiArCQkJCSAu dW5yZXNlcnZlLnN0YXJ0ID0gb2Zmc2V0LAo+ICsJCQkJIC51bnJlc2VydmUuZW5kID0gb2Zmc2V0 ICsgc2l6ZSB9Owo+ICsJc3RydWN0IGFsbG9jX3Jlc3AgcmVzcDsKPiArCj4gKwlpZ3RfYXNzZXJ0 KGhhbmRsZV9yZXF1ZXN0KCZyZXEsICZyZXNwKSA9PSAwKTsKPiArCWlndF9hc3NlcnQocmVzcC5y ZXNwb25zZV90eXBlID09IFJFU1BfVU5SRVNFUlZFKTsKPiArCj4gKwlyZXR1cm4gcmVzcC51bnJl c2VydmUudW5yZXNlcnZlZDsKPiArfQo+ICsKPiArLyoqCj4gKyAqIGludGVsX2FsbG9jYXRvcl9p c19yZXNlcnZlZDoKPiArICogQGFsbG9jYXRvcl9oYW5kbGU6IGhhbmRsZSB0byBhbiBhbGxvY2F0 b3IKPiArICogQHNpemU6IHNpemUgb2YgYW4gb2JqZWN0Cj4gKyAqIEBvZmZzZXQ6IGFkZHJlc3Mg b2YgYW4gb2JqZWN0Cj4gKyAqCj4gKyAqIEZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIHNwYWNlIHN0 YXJ0aW5nIGF0IHRoZSBAb2Zmc2V0IGFuZCBAc2l6ZSBpcwo+ICsgKiBjdXJyZW50bHkgdW5kZXIg cmVzZXJ2YXRpb24uCj4gKyAqCj4gKyAqIE5vdGUuIEBzaXplIGFuZCBAb2Zmc2V0IGhhdmUgdG8g bWF0Y2ggdGhvc2UgdXNlZCBpbiByZXNlcnZhdGlvbiwKPiArICogaS5lLiBjaGVjayB3aXRoIHRo ZSBzYW1lIG9mZnNldCBidXQgZXZlbiBzbWFsbGVyIHNpemUgd2lsbCBmYWlsLgo+ICsgKgo+ICsg KiBSZXR1cm5zOiB0cnVlIGlmIHNwYWNlIGlzIHJlc2VydmVkLCBvdGh3ZXJpc2UgZmFsc2UuCj4g KyAqLwo+ICtib29sIGludGVsX2FsbG9jYXRvcl9pc19yZXNlcnZlZCh1aW50NjRfdCBhbGxvY2F0 b3JfaGFuZGxlLAo+ICsJCQkJIHVpbnQ2NF90IHNpemUsIHVpbnQ2NF90IG9mZnNldCkKPiArewo+ ICsJc3RydWN0IGFsbG9jX3JlcSByZXEgPSB7IC5yZXF1ZXN0X3R5cGUgPSBSRVFfSVNfUkVTRVJW RUQsCj4gKwkJCQkgLmFsbG9jYXRvcl9oYW5kbGUgPSBhbGxvY2F0b3JfaGFuZGxlLAo+ICsJCQkJ IC5pc19yZXNlcnZlZC5zdGFydCA9IG9mZnNldCwKPiArCQkJCSAuaXNfcmVzZXJ2ZWQuZW5kID0g b2Zmc2V0ICsgc2l6ZSB9Owo+ICsJc3RydWN0IGFsbG9jX3Jlc3AgcmVzcDsKPiArCj4gKwlpZ3Rf YXNzZXJ0KGhhbmRsZV9yZXF1ZXN0KCZyZXEsICZyZXNwKSA9PSAwKTsKPiArCWlndF9hc3NlcnQo cmVzcC5yZXNwb25zZV90eXBlID09IFJFU1BfSVNfUkVTRVJWRUQpOwo+ICsKPiArCXJldHVybiBy ZXNwLmlzX3Jlc2VydmVkLnJlc2VydmVkOwo+ICt9Cj4gKwo+ICsvKioKPiArICogaW50ZWxfYWxs b2NhdG9yX3Jlc2VydmVfaWZfbm90X2FsbG9jYXRlZDoKPiArICogQGFsbG9jYXRvcl9oYW5kbGU6 IGhhbmRsZSB0byBhbiBhbGxvY2F0b3IKPiArICogQGhhbmRsZTogaGFuZGxlIHRvIGFuIG9iamVj dAo+ICsgKiBAc2l6ZTogc2l6ZSBvZiBhbiBvYmplY3QKPiArICogQG9mZnNldDogYWRkcmVzcyBv ZiBhbiBvYmplY3QKPiArICogQGlzX2FsbG9jYXRlZHA6IGlmIG5vdCBOVUxMIGZ1bmN0aW9uIHdy aXRlcyB0aGVyZSBvYmplY3QgYWxsb2NhdGlvbiBzdGF0dXMKPiArICogKHRydWUvZmFsc2UpCj4g KyAqCj4gKyAqIEZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIHRoZSBvYmplY3QgaWRlbnRpZmllZCBi eSB0aGUgQGhhbmRsZSBhbmQgQHNpemUKPiArICogaXMgYWxsb2NhdGVkIGF0IHRoZSBAb2Zmc2V0 IGFuZCB3cml0ZXMgdGhlIHJlc3VsdCB0byBAaXNfYWxsb2NhdGVkcC4KPiArICogSWYgaXQncyBu b3QgaXQgcmVzZXJ2ZXMgaXQgYXQgdGhlIGdpdmVuIEBvZmZzZXQuCj4gKyAqCj4gKyAqIFJldHVy bnM6IHRydWUgaWYgdGhlIHNwYWNlIGZvciBhbiBvYmplY3Qgd2FzIHJlc2VydmVkLCBvdGhlcndp c2UgZmFsc2UuCj4gKyAqLwo+ICtib29sIGludGVsX2FsbG9jYXRvcl9yZXNlcnZlX2lmX25vdF9h bGxvY2F0ZWQodWludDY0X3QgYWxsb2NhdG9yX2hhbmRsZSwKPiArCQkJCQkgICAgICB1aW50MzJf dCBoYW5kbGUsCj4gKwkJCQkJICAgICAgdWludDY0X3Qgc2l6ZSwgdWludDY0X3Qgb2Zmc2V0LAo+ ICsJCQkJCSAgICAgIGJvb2wgKmlzX2FsbG9jYXRlZHApCj4gK3sKPiArCXN0cnVjdCBhbGxvY19y ZXEgcmVxID0geyAucmVxdWVzdF90eXBlID0gUkVRX1JFU0VSVkVfSUZfTk9UX0FMTE9DQVRFRCwK PiArCQkJCSAuYWxsb2NhdG9yX2hhbmRsZSA9IGFsbG9jYXRvcl9oYW5kbGUsCj4gKwkJCQkgLnJl c2VydmUuaGFuZGxlID0gaGFuZGxlLAo+ICsJCQkJIC5yZXNlcnZlLnN0YXJ0ID0gb2Zmc2V0LAo+ ICsJCQkJIC5yZXNlcnZlLmVuZCA9IG9mZnNldCArIHNpemUgfTsKPiArCXN0cnVjdCBhbGxvY19y ZXNwIHJlc3A7Cj4gKwo+ICsJaWd0X2Fzc2VydChoYW5kbGVfcmVxdWVzdCgmcmVxLCAmcmVzcCkg PT0gMCk7Cj4gKwlpZ3RfYXNzZXJ0KHJlc3AucmVzcG9uc2VfdHlwZSA9PSBSRVNQX1JFU0VSVkVf SUZfTk9UX0FMTE9DQVRFRCk7Cj4gKwo+ICsJaWYgKGlzX2FsbG9jYXRlZHApCj4gKwkJKmlzX2Fs bG9jYXRlZHAgPSByZXNwLnJlc2VydmVfaWZfbm90X2FsbG9jYXRlZC5hbGxvY2F0ZWQ7Cj4gKwo+ ICsJcmV0dXJuIHJlc3AucmVzZXJ2ZV9pZl9ub3RfYWxsb2NhdGVkLnJlc2VydmVkOwo+ICt9Cj4g Kwo+ICsvKioKPiArICogaW50ZWxfYWxsb2NhdG9yX3ByaW50Ogo+ICsgKiBAYWxsb2NhdG9yX2hh bmRsZTogaGFuZGxlIHRvIGFuIGFsbG9jYXRvcgo+ICsgKgo+ICsgKiBGdW5jdGlvbiBwcmludHMg c3RhdGlzdGljcyBhbmQgY29udGVudCBvZiB0aGUgYWxsb2NhdG9yLgo+ICsgKiBNYWlubHkgZm9y IGRlYnVnZ2luZyBwdXJwb3Nlcy4KPiArICoKPiArICogTm90ZS4gUHJpbnRpbmcgcG9zc2libGUg b25seSBpbiB0aGUgbWFpbiBwcm9jZXNzLgo+ICsgKiovCj4gK3ZvaWQgaW50ZWxfYWxsb2NhdG9y X3ByaW50KHVpbnQ2NF90IGFsbG9jYXRvcl9oYW5kbGUpCj4gK3sKPiArCWJvb2wgc2FtZV9wcm9j ZXNzOwo+ICsKPiArCWlndF9hc3NlcnQoYWxsb2NhdG9yX2hhbmRsZSk7Cj4gKwo+ICsJc2FtZV9w cm9jZXNzID0gY2hpbGRfcGlkID09IC0xOwo+ICsKPiArCWlmICghbXVsdGlwcm9jZXNzIHx8IHNh bWVfcHJvY2Vzcykgewo+ICsJCXN0cnVjdCBpbnRlbF9hbGxvY2F0b3IgKmlhbCA9IGZyb21fdXNl cl9wb2ludGVyKGFsbG9jYXRvcl9oYW5kbGUpOwo+ICsJCXB0aHJlYWRfbXV0ZXhfbG9jaygmbWFw X211dGV4KTsKPiArCQlpYWwtPnByaW50KGlhbCwgdHJ1ZSk7Cj4gKwkJcHRocmVhZF9tdXRleF91 bmxvY2soJm1hcF9tdXRleCk7Cj4gKwl9IGVsc2Ugewo+ICsJCWlndF93YXJuKCJQcmludCBzdGF0 cyBpcyBpbiBtYWluIHByb2Nlc3Mgb25seVxuIik7Cj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyBi b29sIGVxdWFsX2FsbG9jYXRvcnMoY29uc3Qgdm9pZCAqa2V5MSwgY29uc3Qgdm9pZCAqa2V5MikK PiArewo+ICsJY29uc3Qgc3RydWN0IGludGVsX2FsbG9jYXRvciAqYTEgPSBrZXkxLCAqYTIgPSBr ZXkyOwo+ICsKPiArCWFsbG9jX2RlYnVnKCJhMTogPGZkOiAlZCwgY3R4OiAldT4sIGEyIDxmZDog JWQsIGN0eDogJXU+XG4iLAo+ICsJCSAgIGExLT5mZCwgYTEtPmN0eCwgYTItPmZkLCBhMi0+Y3R4 KTsKPiArCj4gKwlyZXR1cm4gYTEtPmZkID09IGEyLT5mZCAmJiBhMS0+Y3R4ID09IGEyLT5jdHg7 Cj4gK30KPiArCj4gKy8qICAyXjYzICsgMl42MSAtIDJeNTcgKyAyXjU0IC0gMl41MSAtIDJeMTgg KyAxICovCj4gKyNkZWZpbmUgR09MREVOX1JBVElPX1BSSU1FXzY0IDB4OWUzN2ZmZmZmZmZjMDAw MVVMCj4gKwo+ICtzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGhhc2hfYWxsb2NhdG9ycyhjb25zdCB2 b2lkICp2YWwsIHVuc2lnbmVkIGludCBiaXRzKQo+ICt7Cj4gKwl1aW50NjRfdCBoYXNoID0gKChz dHJ1Y3QgaW50ZWxfYWxsb2NhdG9yICopIHZhbCktPmZkOwo+ICsKPiArCWhhc2ggPSBoYXNoICog R09MREVOX1JBVElPX1BSSU1FXzY0Owo+ICsJcmV0dXJuIGhhc2ggPj4gKDY0IC0gYml0cyk7Cj4g K30KPiArCj4gK3N0YXRpYyB2b2lkIF9fZnJlZV9hbGxvY2F0b3JzKHZvaWQpCj4gK3sKPiArCXN0 cnVjdCBpZ3RfbWFwX2VudHJ5ICpwb3M7Cj4gKwlzdHJ1Y3QgaW50ZWxfYWxsb2NhdG9yICppYWw7 Cj4gKwlpbnQgaTsKPiArCj4gKwlpZiAoYWxsb2NhdG9yc19tYXApIHsKPiArCQlpZ3RfbWFwX2Zv cl9lYWNoKGFsbG9jYXRvcnNfbWFwLCBpLCBwb3MpIHsKPiArCQkJaWFsID0gcG9zLT52YWx1ZTsK PiArCQkJaWFsLT5kZXN0cm95KGlhbCk7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCWlndF9tYXBfZnJl ZShhbGxvY2F0b3JzX21hcCk7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBpbnRlbF9hbGxvY2F0b3Jf aW5pdDoKPiArICoKPiArICogRnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGFsbG9jYXRvcnMgaW5m cmFzdHJ1Y3R1cmUuIFRoZSBzZWNvbmQgY2FsbCB3aWxsCj4gKyAqIG92ZXJyaWRlIGN1cnJlbnQg aW5mcmEgYW5kIGRlc3Ryb3kgZXhpc3RpbmcgdGhlcmUgYWxsb2NhdG9ycy4gSXQgaXMgY2FsbGVk Cj4gKyAqIGluIGlndF9jb25zdHJ1Y3Rvci4KPiArICoqLwo+ICt2b2lkIGludGVsX2FsbG9jYXRv cl9pbml0KHZvaWQpCj4gK3sKPiArCWFsbG9jX2luZm8oIlByZXBhcmUgYW4gYWxsb2NhdG9yIGlu ZnJhc3RydWN0dXJlXG4iKTsKPiArCj4gKwlhbGxvY2F0b3JfcGlkID0gZ2V0cGlkKCk7Cj4gKwlh bGxvY19pbmZvKCJBbGxvY2F0b3IgcGlkOiAlbGRcbiIsIChsb25nKSBhbGxvY2F0b3JfcGlkKTsK PiArCj4gKwlpZiAoYWxsb2NhdG9yc19tYXApIHsKPiArCQlfX2ZyZWVfYWxsb2NhdG9ycygpOwo+ ICsJCWZyZWUoYWxsb2NhdG9yc19tYXApOwo+ICsJfQo+ICsKPiArCWFsbG9jYXRvcnNfbWFwID0g Y2FsbG9jKHNpemVvZigqYWxsb2NhdG9yc19tYXApLCAxKTsKPiArCWlndF9hc3NlcnQoYWxsb2Nh dG9yc19tYXApOwo+ICsKPiArCWlndF9tYXBfaW5pdChhbGxvY2F0b3JzX21hcCwgZXF1YWxfYWxs b2NhdG9ycywgaGFzaF9hbGxvY2F0b3JzLCA4KTsKPiArCj4gKwljaGFubmVsID0gaW50ZWxfYWxs b2NhdG9yX2dldF9tc2djaGFubmVsKENIQU5ORUxfU1lTVklQQ19NU0dRVUVVRSk7Cj4gK30KPiAr Cj4gK2lndF9jb25zdHJ1Y3RvciB7Cj4gKwlpbnRlbF9hbGxvY2F0b3JfaW5pdCgpOwo+ICt9Cj4g ZGlmZiAtLWdpdCBhL2xpYi9pbnRlbF9hbGxvY2F0b3IuaCBiL2xpYi9pbnRlbF9hbGxvY2F0b3Iu aAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAuLmYzNzQ3YThiCj4gLS0t IC9kZXYvbnVsbAo+ICsrKyBiL2xpYi9pbnRlbF9hbGxvY2F0b3IuaAo+IEBAIC0wLDAgKzEsMTM2 IEBACj4gKyNpZm5kZWYgX19JTlRFTF9BTExPQ0FUT1JfSF9fCj4gKyNkZWZpbmUgX19JTlRFTF9B TExPQ0FUT1JfSF9fCj4gKwo+ICsjaW5jbHVkZSA8c3RkaW50Lmg+Cj4gKyNpbmNsdWRlIDxzdGRi b29sLmg+Cj4gKyNpbmNsdWRlIDxwdGhyZWFkLmg+Cj4gKyNpbmNsdWRlIDxzdGRpbnQuaD4KPiAr I2luY2x1ZGUgPHN0ZGF0b21pYy5oPgo+ICsKPiArLyoqCj4gKyAqIFNFQ1RJT046aW50ZWxfYWxs b2NhdG9yCj4gKyAqIEBzaG9ydF9kZXNjcmlwdGlvbjogaWd0IGltcGxlbWVudGF0aW9uIG9mIGFs bG9jYXRvcgo+ICsgKiBAdGl0bGU6IEludGVsIGFsbG9jYXRvcgo+ICsgKiBAaW5jbHVkZTogaW50 ZWxfYWxsb2NhdG9yLmgKPiArICoKPiArICogIyBJbnRlbCBhbGxvY2F0b3IKPiArICoKPiArICog U2luY2UgR1BVIGRldmljZXMgZHJpdmVyIGhhcyBhYmFuZG9uZWQgcmVsb2NhdGlvbnMgZm9yIG5l d2VyIGdlbmVyYXRpb25zLAo+ICsgKiB3ZSBhcmUgZmFjaW5nIHRoZSBuZWVkIHRvIG1hbmFnZSBh ZGRyZXNzZXMgaW4gdXNlcnNwYWNlLiBJbnRlbCBhbGxvY2F0b3IKPiArICogc3VwcGx5IG91dCBv ZiB0aGUgYm94IG1lY2hhbmlzbXMgcHJvdmlkaW5nIGNvcnJlY3QgdmlydHVhbCBhZGRyZXNzZXMu Cj4gKyAqIFNwZWNpZmljYWxseSwgaW50ZWxfYWxsb2NhdG9yIGlzIGEgbXVsdGktdGhyZWFkaW5n IGluZnJhc3RydWN0dXJlIHdyYXBwaW5nCj4gKyAqIGEgcHJvcGVyIHNpbmdsZS10aHJlYWQgYWxs b2NhdG9yLCB0aGF0IGNhbiBiZSB0aGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Cj4gKyAqCj4gKyAq ICAqIElOVEVMX0FMTE9DQVRPUl9TSU1QTEUgLSBwb3J0ZWQgZnJvbSBNZXNhLCBsaXN0LWJhc2Vk LCBzaW1wbGUgYWxsb2NhdG9yCj4gKyAqICAqIElOVEVMX0FMTE9DQVRPUl9SQU5ET00gLSBzdGF0 ZWxlc3MgYWxsb2NhdG9yLCB0aGF0IHByb3ZpZGVzIHJhbmRvbSBhZGRyZXNzZXMKPiArICogIChz b21ldGltZSBpbiB0aGUgZnV0dXJlIHRoZSBsaXN0IGNhbiBncm93KQo+ICsgKgo+ICsgKiBVc2Fn ZSBleGFtcGxlOgo+ICsgKgo+ICsgKiB8WzwhLS0gbGFuZ3VhZ2U9ImMiIC0tPgo+ICsgKiBzdHJ1 Y3Qgb2JqZWN0IHsKPiArICogCXVpbnQzMl90IGhhbmRsZTsKPiArICogCXVpbnQ2NF90IG9mZnNl dDsKPiArICogCXVpbnQ2NF90IHNpemU7Cj4gKyAqIH07Cj4gKyAqCj4gKyAqIHN0cnVjdCBvYmpl Y3Qgb2JqMSwgb2JqMjsKPiArICogdWludDY0X3QgYWhuZCwgc3RhcnRwLCBlbmRwOwo+ICsgKiBp bnQgZmQgPSAtMTsKPiArICoKPiArICogZmQgPSBkcm1fb3Blbl9kcml2ZXIoRFJJVkVSX0lOVEVM KTsKPiArICogYWhuZCA9IGludGVsX2FsbG9jYXRvcl9vcGVuKGZkLCAwLCBJTlRFTF9BTExPQ0FU T1JfU0lNUExFKTsKPiArICoKPiArICogb2JqMS5oYW5kbGUgPSBnZW1fY3JlYXRlKDQwOTYpOwo+ ICsgKiBvYmoyLmhhbmRsZSA9IGdlbV9jcmVhdGUoNDA5Nik7Cj4gKyAqCj4gKyAqIC8vIFJlc2Vy dmUgaG9sZSBmb3IgYW4gb2JqZWN0IGluIGdpdmVuIGFkZHJlc3MuCj4gKyAqIC8vIEluIHRoaXMg ZXhhbXBsZSB0aGUgZmlyc3QgcG9zc2libGUgYWRkcmVzcy4KPiArICogaW50ZWxfYWxsb2NhdG9y X2dldF9hZGRyZXNzX3JhbmdlKGFobmQsICZzdGFydHAsICZlbmRwKTsKPiArICogb2JqMS5vZmZz ZXQgPSBzdGFydHA7Cj4gKyAqIGlndF9hc3NlcnQoaW50ZWxfYWxsb2NhdG9yX3Jlc2VydmUoYWhu ZCwgb2JqMS5oYW5kbGUsIDQwOTYsIHN0YXJ0cCkpOwo+ICsgKgo+ICsgKiAvLyBHZXQgdGhlIG1v c3Qgc3VpdGFibGUgb2Zmc2V0IGZvciB0aGUgb2JqZWN0LiBQcmVmZXJlZCB3YXkuCj4gKyAqIG9i ajIub2Zmc2V0ID0gaW50ZWxfYWxsb2NhdG9yX2FsbG9jKGFobmQsIG9iajIuaGFuZGxlLCA0MDk2 LCAxIDw8IDEzKTsKPiArICoKPiArICogIC4uLgo+ICsgKgo+ICsgKiAvLyBSZXNlcnZlZCBhZGRy ZXNzZXMgY2FuIGJlIG9ubHkgZnJlZWQgYnkgdW5yZXNlcnZlLgo+ICsgKiBpbnRlbF9hbGxvY2F0 b3JfdW5yZXNlcnZlKGFobmQsIG9iajEuaGFuZGxlLCA0MDk2LCBvYmoxLm9mZnNldCk7Cj4gKyAq IGludGVsX2FsbG9jYXRvcl9mcmVlKGFobmQsIG9iajIuaGFuZGxlKTsKPiArICoKPiArICogZ2Vt X2Nsb3NlKG9iajEuaGFuZGxlKTsKPiArICogZ2VtX2Nsb3NlKG9iajIuaGFuZGxlKTsKPiArICog XXwKPiArICoKPiArICovCj4gKwo+ICtzdHJ1Y3QgaW50ZWxfYWxsb2NhdG9yIHsKPiArCWludCBm ZDsKPiArCXVpbnQzMl90IGN0eDsKPiArCXVpbnQ4X3QgdHlwZTsKPiArCV9BdG9taWMoaW50MzJf dCkgcmVmY291bnQ7Cj4gKwlwdGhyZWFkX211dGV4X3QgbXV0ZXg7Cj4gKwo+ICsJLyogYWxsb2Nh dG9yJ3MgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KPiArCXZvaWQgKnByaXY7Cj4gKwo+ICsJdm9pZCAo KmdldF9hZGRyZXNzX3JhbmdlKShzdHJ1Y3QgaW50ZWxfYWxsb2NhdG9yICppYWwsCj4gKwkJCQkg IHVpbnQ2NF90ICpzdGFydHAsIHVpbnQ2NF90ICplbmRwKTsKPiArCXVpbnQ2NF90ICgqYWxsb2Mp KHN0cnVjdCBpbnRlbF9hbGxvY2F0b3IgKmlhbCwgdWludDMyX3QgaGFuZGxlLAo+ICsJCQkgIHVp bnQ2NF90IHNpemUsIHVpbnQ2NF90IGFsaWdubWVudCk7Cj4gKwlib29sICgqaXNfYWxsb2NhdGVk KSAoc3RydWN0IGludGVsX2FsbG9jYXRvciAqaWFsLCB1aW50MzJfdCBoYW5kbGUsCj4gKwkJCSAg ICAgIHVpbnQ2NF90IHNpemUsIHVpbnQ2NF90IGFsaWdubWVudCk7Cj4gKwlib29sICgqcmVzZXJ2 ZSkoc3RydWN0IGludGVsX2FsbG9jYXRvciAqaWFsLAo+ICsJCQl1aW50MzJfdCBoYW5kbGUsIHVp bnQ2NF90IHN0YXJ0LCB1aW50NjRfdCBzaXplKTsKPiArCWJvb2wgKCp1bnJlc2VydmUpKHN0cnVj dCBpbnRlbF9hbGxvY2F0b3IgKmlhbCwKPiArCQkJICB1aW50MzJfdCBoYW5kbGUsIHVpbnQ2NF90 IHN0YXJ0LCB1aW50NjRfdCBzaXplKTsKPiArCWJvb2wgKCppc19yZXNlcnZlZCkgKHN0cnVjdCBp bnRlbF9hbGxvY2F0b3IgKmlhbCwKPiArCQkJICAgICB1aW50NjRfdCBzdGFydCwgdWludDY0X3Qg c2l6ZSk7Cj4gKwlib29sICgqZnJlZSkoc3RydWN0IGludGVsX2FsbG9jYXRvciAqaWFsLCB1aW50 MzJfdCBoYW5kbGUpOwo+ICsKPiArCXZvaWQgKCpkZXN0cm95KShzdHJ1Y3QgaW50ZWxfYWxsb2Nh dG9yICppYWwpOwo+ICsKPiArCWJvb2wgKCppc19lbXB0eSkoc3RydWN0IGludGVsX2FsbG9jYXRv ciAqaWFsKTsKPiArCj4gKwl2b2lkICgqcHJpbnQpKHN0cnVjdCBpbnRlbF9hbGxvY2F0b3IgKmlh bCwgYm9vbCBmdWxsKTsKPiArfTsKPiArCj4gK3ZvaWQgaW50ZWxfYWxsb2NhdG9yX2luaXQodm9p ZCk7Cj4gK3ZvaWQgaW50ZWxfYWxsb2NhdG9yX211bHRpcHJvY2Vzc19zdGFydCh2b2lkKTsKPiAr dm9pZCBpbnRlbF9hbGxvY2F0b3JfbXVsdGlwcm9jZXNzX3N0b3Aodm9pZCk7Cj4gKwo+ICt1aW50 NjRfdCBpbnRlbF9hbGxvY2F0b3Jfb3BlbihpbnQgZmQsIHVpbnQzMl90IGN0eCwgdWludDhfdCBh bGxvY2F0b3JfdHlwZSk7Cj4gK2Jvb2wgaW50ZWxfYWxsb2NhdG9yX2Nsb3NlKHVpbnQ2NF90IGFs bG9jYXRvcl9oYW5kbGUpOwo+ICt2b2lkIGludGVsX2FsbG9jYXRvcl9nZXRfYWRkcmVzc19yYW5n ZSh1aW50NjRfdCBhbGxvY2F0b3JfaGFuZGxlLAo+ICsJCQkJICAgICAgIHVpbnQ2NF90ICpzdGFy dHAsIHVpbnQ2NF90ICplbmRwKTsKPiArdWludDY0X3QgaW50ZWxfYWxsb2NhdG9yX2FsbG9jKHVp bnQ2NF90IGFsbG9jYXRvcl9oYW5kbGUsIHVpbnQzMl90IGhhbmRsZSwKPiArCQkJICAgICAgIHVp bnQ2NF90IHNpemUsIHVpbnQ2NF90IGFsaWdubWVudCk7Cj4gK2Jvb2wgaW50ZWxfYWxsb2NhdG9y X2ZyZWUodWludDY0X3QgYWxsb2NhdG9yX2hhbmRsZSwgdWludDMyX3QgaGFuZGxlKTsKPiArYm9v bCBpbnRlbF9hbGxvY2F0b3JfaXNfYWxsb2NhdGVkKHVpbnQ2NF90IGFsbG9jYXRvcl9oYW5kbGUs IHVpbnQzMl90IGhhbmRsZSwKPiArCQkJCSAgdWludDY0X3Qgc2l6ZSwgdWludDY0X3Qgb2Zmc2V0 KTsKPiArYm9vbCBpbnRlbF9hbGxvY2F0b3JfcmVzZXJ2ZSh1aW50NjRfdCBhbGxvY2F0b3JfaGFu ZGxlLCB1aW50MzJfdCBoYW5kbGUsCj4gKwkJCSAgICAgdWludDY0X3Qgc2l6ZSwgdWludDY0X3Qg b2Zmc2V0KTsKPiArYm9vbCBpbnRlbF9hbGxvY2F0b3JfdW5yZXNlcnZlKHVpbnQ2NF90IGFsbG9j YXRvcl9oYW5kbGUsIHVpbnQzMl90IGhhbmRsZSwKPiArCQkJICAgICAgIHVpbnQ2NF90IHNpemUs IHVpbnQ2NF90IG9mZnNldCk7Cj4gK2Jvb2wgaW50ZWxfYWxsb2NhdG9yX2lzX3Jlc2VydmVkKHVp bnQ2NF90IGFsbG9jYXRvcl9oYW5kbGUsCj4gKwkJCQkgdWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90 IHNpemUpOwo+ICtib29sIGludGVsX2FsbG9jYXRvcl9yZXNlcnZlX2lmX25vdF9hbGxvY2F0ZWQo dWludDY0X3QgYWxsb2NhdG9yX2hhbmRsZSwKPiArCQkJCQkgICAgICB1aW50MzJfdCBoYW5kbGUs Cj4gKwkJCQkJICAgICAgdWludDY0X3Qgc2l6ZSwgdWludDY0X3Qgb2Zmc2V0LAo+ICsJCQkJCSAg ICAgIGJvb2wgKmlzX2FsbG9jYXRlZHApOwo+ICsKPiArdm9pZCBpbnRlbF9hbGxvY2F0b3JfcHJp bnQodWludDY0X3QgYWxsb2NhdG9yX2hhbmRsZSk7Cj4gKwo+ICsjZGVmaW5lIElOVEVMX0FMTE9D QVRPUl9OT05FICAgMAo+ICsjZGVmaW5lIElOVEVMX0FMTE9DQVRPUl9SQU5ET00gMQo+ICsjZGVm aW5lIElOVEVMX0FMTE9DQVRPUl9TSU1QTEUgMgo+ICsKPiArc3RhdGljIGlubGluZSB1aW50NjRf dCBDQU5PTklDQUwodWludDY0X3QgYWRkcmVzcykKPiArewo+ICsJcmV0dXJuIChpbnQ2NF90KShh ZGRyZXNzIDw8IDE2KSA+PiAxNjsKPiArfQo+ICsKPiArI2RlZmluZSBERUNBTk9OSUNBTChvZmZz ZXQpIChvZmZzZXQgJiAoKDF1bGwgPDwgNDgpIC0gMSkpCj4gKwo+ICsjZW5kaWYKPiBkaWZmIC0t Z2l0IGEvbGliL2ludGVsX2FsbG9jYXRvcl9tc2djaGFubmVsLmMgYi9saWIvaW50ZWxfYWxsb2Nh dG9yX21zZ2NoYW5uZWwuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAu LjA4NGE5NzdkCj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2xpYi9pbnRlbF9hbGxvY2F0b3JfbXNn Y2hhbm5lbC5jCj4gQEAgLTAsMCArMSwxODIgQEAKPiArI2luY2x1ZGUgPHN5cy90eXBlcy5oPgo+ ICsjaW5jbHVkZSA8c3lzL2lwYy5oPgo+ICsjaW5jbHVkZSA8c3lzL21zZy5oPgo+ICsjaW5jbHVk ZSA8c3lzL3N0YXQuaD4KPiArI2luY2x1ZGUgPGZjbnRsLmg+Cj4gKyNpbmNsdWRlICJpZ3QuaCIK PiArI2luY2x1ZGUgImludGVsX2FsbG9jYXRvcl9tc2djaGFubmVsLmgiCj4gKwo+ICtleHRlcm4g X190aHJlYWQgcGlkX3QgY2hpbGRfdGlkOwo+ICsKPiArLyogLS0tLS0gU1lTVklQQyBNU0dRVUVV RSAtLS0tLSAqLwo+ICsKPiArI2RlZmluZSBGVE9LX0lHVF9BTExPQ0FUT1JfS0VZICIvdG1wL2ln dC5hbGxvY2F0b3Iua2V5Igo+ICsjZGVmaW5lIEZUT0tfSUdUX0FMTE9DQVRPUl9QUk9KSUQgMjAy MAo+ICsKPiArI2RlZmluZSBBTExPQ0FUT1JfUkVRVUVTVCAxCj4gKwo+ICtzdHJ1Y3QgbXNncXVl dWVfZGF0YSB7Cj4gKwlrZXlfdCBrZXk7Cj4gKwlpbnQgcXVldWU7Cj4gK307Cj4gKwo+ICtzdHJ1 Y3QgbXNncXVldWVfYnVmIHsKPiArICAgICAgIGxvbmcgbXR5cGU7Cj4gKyAgICAgICB1bmlvbiB7 Cj4gKwkgICAgICAgc3RydWN0IGFsbG9jX3JlcSByZXF1ZXN0Owo+ICsJICAgICAgIHN0cnVjdCBh bGxvY19yZXNwIHJlc3BvbnNlOwo+ICsgICAgICAgfSBkYXRhOwo+ICt9Owo+ICsKPiArc3RhdGlj IHZvaWQgbXNncXVldWVfaW5pdChzdHJ1Y3QgbXNnX2NoYW5uZWwgKmNoYW5uZWwpCj4gK3sKPiAr CXN0cnVjdCBtc2dxdWV1ZV9kYXRhICptc2dkYXRhOwo+ICsJc3RydWN0IG1zcWlkX2RzIHFzdGF0 Owo+ICsJa2V5X3Qga2V5Owo+ICsJaW50IGZkLCBxdWV1ZTsKPiArCj4gKwlpZ3RfZGVidWcoIklu aXQgbXNncXVldWVcbiIpOwo+ICsKPiArCS8qIENyZWF0ZSBmdG9rIGtleSBvbmx5IGlmIG5vdCBl eGlzdHMgKi8KPiArCWZkID0gb3BlbihGVE9LX0lHVF9BTExPQ0FUT1JfS0VZLCBPX0NSRUFUIHwg T19FWENMIHwgT19XUk9OTFksIDA2MDApOwo+ICsJaWd0X2Fzc2VydChmZCA+PSAwIHx8IGVycm5v ID09IEVFWElTVCk7Cj4gKwlpZiAoZmQgPj0gMCkKPiArCQljbG9zZShmZCk7Cj4gKwo+ICsJa2V5 ID0gZnRvayhGVE9LX0lHVF9BTExPQ0FUT1JfS0VZLCBGVE9LX0lHVF9BTExPQ0FUT1JfUFJPSklE KTsKPiArCWlndF9hc3NlcnQoa2V5ICE9IC0xKTsKPiArCWlndF9kZWJ1ZygiUXVldWUga2V5OiAl eFxuIiwgKGludCkga2V5KTsKPiArCj4gKwlxdWV1ZSA9IG1zZ2dldChrZXksIDApOwo+ICsJaWYg KHF1ZXVlICE9IC0xKSB7Cj4gKwkJaWd0X2Fzc2VydChtc2djdGwocXVldWUsIElQQ19TVEFULCAm cXN0YXQpID09IDApOwo+ICsJCWlndF9kZWJ1Zygib2xkIG1lc3NhZ2VzOiAlbHVcbiIsIHFzdGF0 Lm1zZ19xbnVtKTsKPiArCQlpZ3RfYXNzZXJ0KG1zZ2N0bChxdWV1ZSwgSVBDX1JNSUQsIE5VTEwp ID09IDApOwo+ICsJfQo+ICsKPiArCXF1ZXVlID0gbXNnZ2V0KGtleSwgSVBDX0NSRUFUKTsKPiAr CWlndF9kZWJ1ZygibXNnIHF1ZXVlOiAlZFxuIiwgcXVldWUpOwo+ICsKPiArCW1zZ2RhdGEgPSBj YWxsb2MoMSwgc2l6ZW9mKCptc2dkYXRhKSk7Cj4gKwlpZ3RfYXNzZXJ0KG1zZ2RhdGEpOwo+ICsJ bXNnZGF0YS0+a2V5ID0ga2V5Owo+ICsJbXNnZGF0YS0+cXVldWUgPSBxdWV1ZTsKPiArCWNoYW5u ZWwtPnByaXYgPSBtc2dkYXRhOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBtc2dxdWV1ZV9kZWlu aXQoc3RydWN0IG1zZ19jaGFubmVsICpjaGFubmVsKQo+ICt7Cj4gKwlzdHJ1Y3QgbXNncXVldWVf ZGF0YSAqbXNnZGF0YSA9IGNoYW5uZWwtPnByaXY7Cj4gKwo+ICsJaWd0X2RlYnVnKCJEZWluaXQg bXNncXVldWVcbiIpOwo+ICsJbXNnY3RsKG1zZ2RhdGEtPnF1ZXVlLCBJUENfUk1JRCwgTlVMTCk7 Cj4gKwlmcmVlKGNoYW5uZWwtPnByaXYpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IG1zZ3F1ZXVl X3NlbmRfcmVxKHN0cnVjdCBtc2dfY2hhbm5lbCAqY2hhbm5lbCwKPiArCQkJICAgICBzdHJ1Y3Qg YWxsb2NfcmVxICpyZXF1ZXN0KQo+ICt7Cj4gKwlzdHJ1Y3QgbXNncXVldWVfZGF0YSAqbXNnZGF0 YSA9IGNoYW5uZWwtPnByaXY7Cj4gKwlzdHJ1Y3QgbXNncXVldWVfYnVmIGJ1ZiA9IHswfTsKPiAr CWludCByZXQ7Cj4gKwo+ICsJYnVmLm10eXBlID0gQUxMT0NBVE9SX1JFUVVFU1Q7Cj4gKwlidWYu ZGF0YS5yZXF1ZXN0LnJlcXVlc3RfdHlwZSA9IDE7Cj4gKwltZW1jcHkoJmJ1Zi5kYXRhLnJlcXVl c3QsIHJlcXVlc3QsIHNpemVvZigqcmVxdWVzdCkpOwo+ICsKPiArcmV0cnk6Cj4gKwlyZXQgPSBt c2dzbmQobXNnZGF0YS0+cXVldWUsICZidWYsIHNpemVvZihidWYpIC0gc2l6ZW9mKGxvbmcpLCAw KTsKPiArCWlmIChyZXQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpCj4gKwkJZ290byByZXRyeTsK PiArCj4gKwlpZiAocmV0ID09IC0xKQo+ICsJCWlndF93YXJuKCJFcnJvcjogJXNcbiIsIHN0cmVy cm9yKGVycm5vKSk7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludCBt c2dxdWV1ZV9yZWN2X3JlcShzdHJ1Y3QgbXNnX2NoYW5uZWwgKmNoYW5uZWwsCj4gKwkJCSAgICAg c3RydWN0IGFsbG9jX3JlcSAqcmVxdWVzdCkKPiArewo+ICsJc3RydWN0IG1zZ3F1ZXVlX2RhdGEg Km1zZ2RhdGEgPSBjaGFubmVsLT5wcml2Owo+ICsJc3RydWN0IG1zZ3F1ZXVlX2J1ZiBidWYgPSB7 MH07Cj4gKwlpbnQgcmV0LCBzaXplID0gc2l6ZW9mKGJ1ZikgLSBzaXplb2YobG9uZyk7Cj4gKwo+ ICtyZXRyeToKPiArCXJldCA9IG1zZ3Jjdihtc2dkYXRhLT5xdWV1ZSwgJmJ1Ziwgc2l6ZSwgQUxM T0NBVE9SX1JFUVVFU1QsIDApOwo+ICsJaWYgKHJldCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUikK PiArCQlnb3RvIHJldHJ5Owo+ICsKPiArCWlmIChyZXQgPT0gc2l6ZSkKPiArCQltZW1jcHkocmVx dWVzdCwgJmJ1Zi5kYXRhLnJlcXVlc3QsIHNpemVvZigqcmVxdWVzdCkpOwo+ICsJZWxzZSBpZiAo cmV0ID09IC0xKQo+ICsJCWlndF93YXJuKCJFcnJvcjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7 Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludCBtc2dxdWV1ZV9zZW5k X3Jlc3Aoc3RydWN0IG1zZ19jaGFubmVsICpjaGFubmVsLAo+ICsJCQkgICAgICBzdHJ1Y3QgYWxs b2NfcmVzcCAqcmVzcG9uc2UpCj4gK3sKPiArCXN0cnVjdCBtc2dxdWV1ZV9kYXRhICptc2dkYXRh ID0gY2hhbm5lbC0+cHJpdjsKPiArCXN0cnVjdCBtc2dxdWV1ZV9idWYgYnVmID0gezB9Owo+ICsJ aW50IHJldDsKPiArCj4gKwlidWYubXR5cGUgPSByZXNwb25zZS0+dGlkOwo+ICsJbWVtY3B5KCZi dWYuZGF0YS5yZXNwb25zZSwgcmVzcG9uc2UsIHNpemVvZigqcmVzcG9uc2UpKTsKPiArCj4gK3Jl dHJ5Ogo+ICsJcmV0ID0gbXNnc25kKG1zZ2RhdGEtPnF1ZXVlLCAmYnVmLCBzaXplb2YoYnVmKSAt IHNpemVvZihsb25nKSwgMCk7Cj4gKwlpZiAocmV0ID09IC0xICYmIGVycm5vID09IEVJTlRSKQo+ ICsJCWdvdG8gcmV0cnk7Cj4gKwo+ICsJaWYgKHJldCA9PSAtMSkKPiArCQlpZ3Rfd2FybigiRXJy b3I6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiAr Cj4gK3N0YXRpYyBpbnQgbXNncXVldWVfcmVjdl9yZXNwKHN0cnVjdCBtc2dfY2hhbm5lbCAqY2hh bm5lbCwKPiArCQkJICAgICAgc3RydWN0IGFsbG9jX3Jlc3AgKnJlc3BvbnNlKQo+ICt7Cj4gKwlz dHJ1Y3QgbXNncXVldWVfZGF0YSAqbXNnZGF0YSA9IGNoYW5uZWwtPnByaXY7Cj4gKwlzdHJ1Y3Qg bXNncXVldWVfYnVmIGJ1ZiA9IHswfTsKPiArCWludCByZXQsIHNpemUgPSBzaXplb2YoYnVmKSAt IHNpemVvZihsb25nKTsKPiArCj4gK3JldHJ5Ogo+ICsJcmV0ID0gbXNncmN2KG1zZ2RhdGEtPnF1 ZXVlLCAmYnVmLCBzaXplb2YoYnVmKSAtIHNpemVvZihsb25nKSwKPiArCQkgICAgIHJlc3BvbnNl LT50aWQsIDApOwo+ICsJaWYgKHJldCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUikKPiArCQlnb3Rv IHJldHJ5Owo+ICsKPiArCWlmIChyZXQgPT0gc2l6ZSkKPiArCQltZW1jcHkocmVzcG9uc2UsICZi dWYuZGF0YS5yZXNwb25zZSwgc2l6ZW9mKCpyZXNwb25zZSkpOwo+ICsJZWxzZSBpZiAocmV0ID09 IC0xKQo+ICsJCWlndF93YXJuKCJFcnJvcjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Cj4gKwo+ ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIHN0cnVjdCBtc2dfY2hhbm5lbCBtc2dx dWV1ZV9jaGFubmVsID0gewo+ICsJLnByaXYgPSBOVUxMLAo+ICsJLmluaXQgPSBtc2dxdWV1ZV9p bml0LAo+ICsJLmRlaW5pdCA9IG1zZ3F1ZXVlX2RlaW5pdCwKPiArCS5zZW5kX3JlcSA9IG1zZ3F1 ZXVlX3NlbmRfcmVxLAo+ICsJLnJlY3ZfcmVxID0gbXNncXVldWVfcmVjdl9yZXEsCj4gKwkuc2Vu ZF9yZXNwID0gbXNncXVldWVfc2VuZF9yZXNwLAo+ICsJLnJlY3ZfcmVzcCA9IG1zZ3F1ZXVlX3Jl Y3ZfcmVzcCwKPiArfTsKPiArCj4gK3N0cnVjdCBtc2dfY2hhbm5lbCAqaW50ZWxfYWxsb2NhdG9y X2dldF9tc2djaGFubmVsKGVudW0gbXNnX2NoYW5uZWxfdHlwZSB0eXBlKQo+ICt7Cj4gKwlzdHJ1 Y3QgbXNnX2NoYW5uZWwgKmNoYW5uZWwgPSBOVUxMOwo+ICsKPiArCXN3aXRjaCAodHlwZSkgewo+ ICsJY2FzZSBDSEFOTkVMX1NZU1ZJUENfTVNHUVVFVUU6Cj4gKwkJY2hhbm5lbCA9ICZtc2dxdWV1 ZV9jaGFubmVsOwo+ICsJfQo+ICsKPiArCWlndF9hc3NlcnQoY2hhbm5lbCk7Cj4gKwo+ICsJcmV0 dXJuIGNoYW5uZWw7Cj4gK30KPiBkaWZmIC0tZ2l0IGEvbGliL2ludGVsX2FsbG9jYXRvcl9tc2dj aGFubmVsLmggYi9saWIvaW50ZWxfYWxsb2NhdG9yX21zZ2NoYW5uZWwuaAo+IG5ldyBmaWxlIG1v ZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAuLmFiNDZkOWVhCj4gLS0tIC9kZXYvbnVsbAo+ICsr KyBiL2xpYi9pbnRlbF9hbGxvY2F0b3JfbXNnY2hhbm5lbC5oCj4gQEAgLTAsMCArMSwxNDAgQEAK PiArI2lmbmRlZiBfX0lOVEVMX0FMTE9DQVRPUl9NU0dDSEFOTkVMX0hfXwo+ICsjZGVmaW5lIF9f SU5URUxfQUxMT0NBVE9SX01TR0NIQU5ORUxfSF9fCj4gKwo+ICsjaW5jbHVkZSA8c3lzL3R5cGVz Lmg+Cj4gKyNpbmNsdWRlIDx1bmlzdGQuaD4KPiArI2luY2x1ZGUgPHN0ZGludC5oPgo+ICsKPiAr ZW51bSByZXF0eXBlIHsKPiArCVJFUV9TVE9QLAo+ICsJUkVRX09QRU4sCj4gKwlSRVFfQ0xPU0Us Cj4gKwlSRVFfQUREUkVTU19SQU5HRSwKPiArCVJFUV9BTExPQywKPiArCVJFUV9GUkVFLAo+ICsJ UkVRX0lTX0FMTE9DQVRFRCwKPiArCVJFUV9SRVNFUlZFLAo+ICsJUkVRX1VOUkVTRVJWRSwKPiAr CVJFUV9SRVNFUlZFX0lGX05PVF9BTExPQ0FURUQsCj4gKwlSRVFfSVNfUkVTRVJWRUQsCj4gK307 Cj4gKwo+ICtlbnVtIHJlc3B0eXBlIHsKPiArCVJFU1BfT1BFTiwKPiArCVJFU1BfQ0xPU0UsCj4g KwlSRVNQX0FERFJFU1NfUkFOR0UsCj4gKwlSRVNQX0FMTE9DLAo+ICsJUkVTUF9GUkVFLAo+ICsJ UkVTUF9JU19BTExPQ0FURUQsCj4gKwlSRVNQX1JFU0VSVkUsCj4gKwlSRVNQX1VOUkVTRVJWRSwK PiArCVJFU1BfSVNfUkVTRVJWRUQsCj4gKwlSRVNQX1JFU0VSVkVfSUZfTk9UX0FMTE9DQVRFRCwK PiArfTsKPiArCj4gK3N0cnVjdCBhbGxvY19yZXEgewo+ICsJZW51bSByZXF0eXBlIHJlcXVlc3Rf dHlwZTsKPiArCj4gKwkvKiBDb21tb24gKi8KPiArCXBpZF90IHRpZDsKPiArCXVpbnQ2NF90IGFs bG9jYXRvcl9oYW5kbGU7Cj4gKwo+ICsJdW5pb24gewo+ICsJCXN0cnVjdCB7Cj4gKwkJCWludCBm ZDsKPiArCQkJdWludDMyX3QgY3R4Owo+ICsJCQl1aW50OF90IGFsbG9jYXRvcl90eXBlOwo+ICsJ CX0gb3BlbjsKPiArCj4gKwkJc3RydWN0IHsKPiArCQkJdWludDMyX3QgaGFuZGxlOwo+ICsJCQl1 aW50NjRfdCBzaXplOwo+ICsJCQl1aW50NjRfdCBhbGlnbm1lbnQ7Cj4gKwkJfSBhbGxvYzsKPiAr Cj4gKwkJc3RydWN0IHsKPiArCQkJdWludDMyX3QgaGFuZGxlOwo+ICsJCX0gZnJlZTsKPiArCj4g KwkJc3RydWN0IHsKPiArCQkJdWludDMyX3QgaGFuZGxlOwo+ICsJCQl1aW50NjRfdCBzaXplOwo+ ICsJCQl1aW50NjRfdCBvZmZzZXQ7Cj4gKwkJfSBpc19hbGxvY2F0ZWQ7Cj4gKwo+ICsJCXN0cnVj dCB7Cj4gKwkJCXVpbnQzMl90IGhhbmRsZTsKPiArCQkJdWludDY0X3Qgc3RhcnQ7Cj4gKwkJCXVp bnQ2NF90IGVuZDsKPiArCQl9IHJlc2VydmUsIHVucmVzZXJ2ZTsKPiArCj4gKwkJc3RydWN0IHsK PiArCQkJdWludDY0X3Qgc3RhcnQ7Cj4gKwkJCXVpbnQ2NF90IGVuZDsKPiArCQl9IGlzX3Jlc2Vy dmVkOwo+ICsKPiArCX07Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgYWxsb2NfcmVzcCB7Cj4gKwllbnVt IHJlc3B0eXBlIHJlc3BvbnNlX3R5cGU7Cj4gKwlwaWRfdCB0aWQ7Cj4gKwo+ICsJdW5pb24gewo+ ICsJCXN0cnVjdCB7Cj4gKwkJCXVpbnQ2NF90IGFsbG9jYXRvcl9oYW5kbGU7Cj4gKwkJfSBvcGVu Owo+ICsKPiArCQlzdHJ1Y3Qgewo+ICsJCQlib29sIGlzX2VtcHR5Owo+ICsJCX0gY2xvc2U7Cj4g Kwo+ICsJCXN0cnVjdCB7Cj4gKwkJCXVpbnQ2NF90IHN0YXJ0Owo+ICsJCQl1aW50NjRfdCBlbmQ7 Cj4gKwkJfSBhZGRyZXNzX3JhbmdlOwo+ICsKPiArCQlzdHJ1Y3Qgewo+ICsJCQl1aW50NjRfdCBv ZmZzZXQ7Cj4gKwkJfSBhbGxvYzsKPiArCj4gKwkJc3RydWN0IHsKPiArCQkJYm9vbCBmcmVlZDsK PiArCQl9IGZyZWU7Cj4gKwo+ICsJCXN0cnVjdCB7Cj4gKwkJCWJvb2wgYWxsb2NhdGVkOwo+ICsJ CX0gaXNfYWxsb2NhdGVkOwo+ICsKPiArCQlzdHJ1Y3Qgewo+ICsJCQlib29sIHJlc2VydmVkOwo+ ICsJCX0gcmVzZXJ2ZSwgaXNfcmVzZXJ2ZWQ7Cj4gKwo+ICsJCXN0cnVjdCB7Cj4gKwkJCWJvb2wg dW5yZXNlcnZlZDsKPiArCQl9IHVucmVzZXJ2ZTsKPiArCj4gKwkJc3RydWN0IHsKPiArCQkJYm9v bCBhbGxvY2F0ZWQ7Cj4gKwkJCWJvb2wgcmVzZXJ2ZWQ7Cj4gKwkJfSByZXNlcnZlX2lmX25vdF9h bGxvY2F0ZWQ7Cj4gKwl9Owo+ICt9Owo+ICsKPiArc3RydWN0IG1zZ19jaGFubmVsIHsKPiArCXZv aWQgKnByaXY7Cj4gKwl2b2lkICgqaW5pdCkoc3RydWN0IG1zZ19jaGFubmVsICpjaGFubmVsKTsK PiArCXZvaWQgKCpkZWluaXQpKHN0cnVjdCBtc2dfY2hhbm5lbCAqY2hhbm5lbCk7Cj4gKwlpbnQg KCpzZW5kX3JlcSkoc3RydWN0IG1zZ19jaGFubmVsICpjaGFubmVsLCBzdHJ1Y3QgYWxsb2NfcmVx ICpyZXF1ZXN0KTsKPiArCWludCAoKnJlY3ZfcmVxKShzdHJ1Y3QgbXNnX2NoYW5uZWwgKmNoYW5u ZWwsIHN0cnVjdCBhbGxvY19yZXEgKnJlcXVlc3QpOwo+ICsJaW50ICgqc2VuZF9yZXNwKShzdHJ1 Y3QgbXNnX2NoYW5uZWwgKmNoYW5uZWwsIHN0cnVjdCBhbGxvY19yZXNwICpyZXNwb25zZSk7Cj4g KwlpbnQgKCpyZWN2X3Jlc3ApKHN0cnVjdCBtc2dfY2hhbm5lbCAqY2hhbm5lbCwgc3RydWN0IGFs bG9jX3Jlc3AgKnJlc3BvbnNlKTsKPiArfTsKPiArCj4gK2VudW0gbXNnX2NoYW5uZWxfdHlwZSB7 Cj4gKwlDSEFOTkVMX1NZU1ZJUENfTVNHUVVFVUUKPiArfTsKPiArCj4gK3N0cnVjdCBtc2dfY2hh bm5lbCAqaW50ZWxfYWxsb2NhdG9yX2dldF9tc2djaGFubmVsKGVudW0gbXNnX2NoYW5uZWxfdHlw ZSB0eXBlKTsKPiArCj4gKyNlbmRpZgo+IGRpZmYgLS1naXQgYS9saWIvaW50ZWxfYWxsb2NhdG9y X3NpbXBsZS5jIGIvbGliL2ludGVsX2FsbG9jYXRvcl9zaW1wbGUuYwo+IGluZGV4IDFmNTJkYjNm Li4xZDBlMTE3ZCAxMDA2NDQKPiAtLS0gYS9saWIvaW50ZWxfYWxsb2NhdG9yX3NpbXBsZS5jCj4g KysrIGIvbGliL2ludGVsX2FsbG9jYXRvcl9zaW1wbGUuYwo+IEBAIC04Miw4ICs4Miw2IEBAIHN0 cnVjdCBpbnRlbF9hbGxvY2F0b3JfcmVjb3JkIHsKPiAgI2RlZmluZSBzaW1wbGVfdm1hX2ZvcmVh Y2hfaG9sZV9zYWZlX3JldihfaG9sZSwgX2hlYXAsIF90bXApIFwKPiAgCWlndF9saXN0X2Zvcl9l YWNoX2VudHJ5X3NhZmVfcmV2ZXJzZShfaG9sZSwgX3RtcCwgICYoX2hlYXApLT5ob2xlcywgbGlu aykKPiAgCj4gLSNkZWZpbmUgREVDQU5PTklDQUwob2Zmc2V0KSAob2Zmc2V0ICYgKCgxdWxsIDw8 IDQ4KSAtIDEpKQo+IC0KPiAgc3RhdGljIHVpbnQ2NF90IGdldF9iaWFzKGludCBmZCkKPiAgewo+ ICAJKHZvaWQpIGZkOwo+IGRpZmYgLS1naXQgYS9saWIvbWVzb24uYnVpbGQgYi9saWIvbWVzb24u YnVpbGQKPiBpbmRleCA0ODRkM2M3Yi4uN2EzMjJhNDQgMTAwNjQ0Cj4gLS0tIGEvbGliL21lc29u LmJ1aWxkCj4gKysrIGIvbGliL21lc29uLmJ1aWxkCj4gQEAgLTMyLDYgKzMyLDEwIEBAIGxpYl9z b3VyY2VzID0gWwo+ICAJJ2lndF92Z2VtLmMnLAo+ICAJJ2lndF94ODYuYycsCj4gIAknaW5zdGRv bmUuYycsCj4gKwknaW50ZWxfYWxsb2NhdG9yLmMnLAo+ICsJJ2ludGVsX2FsbG9jYXRvcl9tc2dj aGFubmVsLmMnLAo+ICsJJ2ludGVsX2FsbG9jYXRvcl9yYW5kb20uYycsCj4gKwknaW50ZWxfYWxs b2NhdG9yX3NpbXBsZS5jJywKPiAgCSdpbnRlbF9iYXRjaGJ1ZmZlci5jJywKPiAgCSdpbnRlbF9i dWZvcHMuYycsCj4gIAknaW50ZWxfY2hpcHNldC5jJywKPiAtLSAKPiAyLjI2LjAKPiAKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KaWd0LWRldiBtYWlsaW5n IGxpc3QKaWd0LWRldkBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVz a3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pZ3QtZGV2Cg==