From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Andrushchenko Subject: Re: [PATCH 6/8] xen/gntdev: Implement dma-buf export functionality Date: Thu, 31 May 2018 17:32:41 +0300 Message-ID: References: <20180525153331.31188-1-andr2000@gmail.com> <20180525153331.31188-7-andr2000@gmail.com> <20180530231006.GA2929@downor-Z87X-UD5H> <072fb651-52db-05bd-d110-ada904bcac3d@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1fOOdE-0006af-0h for xen-devel@lists.xenproject.org; Thu, 31 May 2018 14:32:48 +0000 Received: by mail-lf0-x243.google.com with SMTP id o9-v6so10079367lfk.1 for ; Thu, 31 May 2018 07:32:45 -0700 (PDT) In-Reply-To: <072fb651-52db-05bd-d110-ada904bcac3d@gmail.com> Content-Language: en-US List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: Dongwon Kim Cc: jgross@suse.com, Oleksandr Andrushchenko , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, daniel.vetter@intel.com, xen-devel@lists.xenproject.org, boris.ostrovsky@oracle.com, matthew.d.roper@intel.com, linux-media@vger.kernel.org List-Id: xen-devel@lists.xenproject.org T24gMDUvMzEvMjAxOCAwODo1NSBBTSwgT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gd3JvdGU6Cj4g T24gMDUvMzEvMjAxOCAwMjoxMCBBTSwgRG9uZ3dvbiBLaW0gd3JvdGU6Cj4+IE9uIEZyaSwgTWF5 IDI1LCAyMDE4IGF0IDA2OjMzOjI5UE0gKzAzMDAsIE9sZWtzYW5kciBBbmRydXNoY2hlbmtvIHdy b3RlOgo+Pj4gRnJvbTogT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gPG9sZWtzYW5kcl9hbmRydXNo Y2hlbmtvQGVwYW0uY29tPgo+Pj4KPj4+IDEuIENyZWF0ZSBhIGRtYS1idWYgZnJvbSBncmFudCBy ZWZlcmVuY2VzIHByb3ZpZGVkIGJ5IHRoZSBmb3JlaWduCj4+PiDCoMKgwqAgZG9tYWluLiBCeSBk ZWZhdWx0IGRtYS1idWYgaXMgYmFja2VkIGJ5IHN5c3RlbSBtZW1vcnkgcGFnZXMsIGJ1dAo+Pj4g wqDCoMKgIGJ5IHByb3ZpZGluZyBHTlRERVZfRE1BX0ZMQUdfWFhYIGZsYWdzIGl0IGNhbiBhbHNv IGJlIGNyZWF0ZWQKPj4+IMKgwqDCoCBhcyBhIERNQSB3cml0ZS1jb21iaW5lL2NvaGVyZW50IGJ1 ZmZlciwgZS5nLiBhbGxvY2F0ZWQgd2l0aAo+Pj4gwqDCoMKgIGNvcnJlc3BvbmRpbmcgZG1hX2Fs bG9jX3h4eCBBUEkuCj4+PiDCoMKgwqAgRXhwb3J0IHRoZSByZXN1bHRpbmcgYnVmZmVyIGFzIGEg bmV3IGRtYS1idWYuCj4+Pgo+Pj4gMi4gSW1wbGVtZW50IHdhaXRpbmcgZm9yIHRoZSBkbWEtYnVm IHRvIGJlIHJlbGVhc2VkOiBibG9jayB1bnRpbCB0aGUKPj4+IMKgwqDCoCBkbWEtYnVmIHdpdGgg dGhlIGZpbGUgZGVzY3JpcHRvciBwcm92aWRlZCBpcyByZWxlYXNlZC4KPj4+IMKgwqDCoCBJZiB3 aXRoaW4gdGhlIHRpbWUtb3V0IHByb3ZpZGVkIHRoZSBidWZmZXIgaXMgbm90IHJlbGVhc2VkIHRo ZW4KPj4+IMKgwqDCoCAtRVRJTUVET1VUIGVycm9yIGlzIHJldHVybmVkLiBJZiB0aGUgYnVmZmVy IHdpdGggdGhlIGZpbGUgCj4+PiBkZXNjcmlwdG9yCj4+PiDCoMKgwqAgZG9lcyBub3QgZXhpc3Qg b3IgaGFzIGFscmVhZHkgYmVlbiByZWxlYXNlZCwgdGhlbiAtRU5PRU5UIGlzIAo+Pj4gcmV0dXJu ZWQuCj4+PiDCoMKgwqAgRm9yIHZhbGlkIGZpbGUgZGVzY3JpcHRvcnMgdGhpcyBtdXN0IG5vdCBi ZSB0cmVhdGVkIGFzIGVycm9yLgo+Pj4KPj4+IFNpZ25lZC1vZmYtYnk6IE9sZWtzYW5kciBBbmRy dXNoY2hlbmtvIAo+Pj4gPG9sZWtzYW5kcl9hbmRydXNoY2hlbmtvQGVwYW0uY29tPgo+Pj4gLS0t Cj4+PiDCoCBkcml2ZXJzL3hlbi9nbnRkZXYuYyB8IDQ3OCAKPj4+ICsrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKy0KPj4+IMKgIDEgZmlsZSBjaGFuZ2VkLCA0NzYgaW5z ZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkKPj4+Cj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy94 ZW4vZ250ZGV2LmMgYi9kcml2ZXJzL3hlbi9nbnRkZXYuYwo+Pj4gaW5kZXggOWU0NTA2MjJhZjFh Li41MmFiYzZjZDU4NDYgMTAwNjQ0Cj4+PiAtLS0gYS9kcml2ZXJzL3hlbi9nbnRkZXYuYwo+Pj4g KysrIGIvZHJpdmVycy94ZW4vZ250ZGV2LmMKPj4+IEBAIC00LDYgKzQsOCBAQAo+Pj4gwqDCoCAq IERldmljZSBmb3IgYWNjZXNzaW5nIChpbiB1c2VyLXNwYWNlKSBwYWdlcyB0aGF0IGhhdmUgYmVl biAKPj4+IGdyYW50ZWQgYnkgb3RoZXIKPj4+IMKgwqAgKiBkb21haW5zLgo+Pj4gwqDCoCAqCj4+ PiArICogRE1BIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBkcml2ZXJzL2dwdS9k cm0vZHJtX3ByaW1lLmMuCj4+PiArICoKPj4+IMKgwqAgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAw NywgRCBHIE11cnJheS4KPj4+IMKgwqAgKsKgwqDCoMKgwqDCoMKgwqDCoMKgIChjKSAyMDA5IEdl cmQgSG9mZm1hbm4gPGtyYXhlbEByZWRoYXQuY29tPgo+Pj4gwqDCoCAqwqDCoMKgwqDCoMKgwqDC oMKgwqAgKGMpIDIwMTggT2xla3NhbmRyIEFuZHJ1c2hjaGVua28sIEVQQU0gU3lzdGVtcyBJbmMu Cj4+PiBAQCAtNDEsNiArNDMsOSBAQAo+Pj4gwqAgI2lmZGVmIENPTkZJR19YRU5fR1JBTlRfRE1B X0FMTE9DCj4+PiDCoCAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Cj4+PiDCoCAjZW5kaWYK Pj4+ICsjaWZkZWYgQ09ORklHX1hFTl9HTlRERVZfRE1BQlVGCj4+PiArI2luY2x1ZGUgPGxpbnV4 L2RtYS1idWYuaD4KPj4+ICsjZW5kaWYKPj4+IMKgIMKgICNpbmNsdWRlIDx4ZW4veGVuLmg+Cj4+ PiDCoCAjaW5jbHVkZSA8eGVuL2dyYW50X3RhYmxlLmg+Cj4+PiBAQCAtODEsNiArODYsMTcgQEAg c3RydWN0IGdudGRldl9wcml2IHsKPj4+IMKgwqDCoMKgwqAgLyogRGV2aWNlIGZvciB3aGljaCBE TUEgbWVtb3J5IGlzIGFsbG9jYXRlZC4gKi8KPj4+IMKgwqDCoMKgwqAgc3RydWN0IGRldmljZSAq ZG1hX2RldjsKPj4+IMKgICNlbmRpZgo+Pj4gKwo+Pj4gKyNpZmRlZiBDT05GSUdfWEVOX0dOVERF Vl9ETUFCVUYKPj4+ICvCoMKgwqAgLyogUHJpdmF0ZSBkYXRhIG9mIHRoZSBoeXBlciBETUEgYnVm ZmVycy4gKi8KPj4+ICsKPj4+ICvCoMKgwqAgLyogTGlzdCBvZiBleHBvcnRlZCBETUEgYnVmZmVy cy4gKi8KPj4+ICvCoMKgwqAgc3RydWN0IGxpc3RfaGVhZCBkbWFidWZfZXhwX2xpc3Q7Cj4+PiAr wqDCoMKgIC8qIExpc3Qgb2Ygd2FpdCBvYmplY3RzLiAqLwo+Pj4gK8KgwqDCoCBzdHJ1Y3QgbGlz dF9oZWFkIGRtYWJ1Zl9leHBfd2FpdF9saXN0Owo+Pj4gK8KgwqDCoCAvKiBUaGlzIGlzIHRoZSBs b2NrIHdoaWNoIHByb3RlY3RzIGRtYV9idWZfeHh4IGxpc3RzLiAqLwo+Pj4gK8KgwqDCoCBzdHJ1 Y3QgbXV0ZXggZG1hYnVmX2xvY2s7Cj4+PiArI2VuZGlmCj4+PiDCoCB9Owo+Pj4gwqAgwqAgc3Ry dWN0IHVubWFwX25vdGlmeSB7Cj4+PiBAQCAtMTI1LDEyICsxNDEsMzggQEAgc3RydWN0IGdyYW50 X21hcCB7Cj4+PiDCoCDCoCAjaWZkZWYgQ09ORklHX1hFTl9HTlRERVZfRE1BQlVGCj4+PiDCoCBz dHJ1Y3QgeGVuX2RtYWJ1ZiB7Cj4+PiArwqDCoMKgIHN0cnVjdCBnbnRkZXZfcHJpdiAqcHJpdjsK Pj4+ICvCoMKgwqAgc3RydWN0IGRtYV9idWYgKmRtYWJ1ZjsKPj4+ICvCoMKgwqAgc3RydWN0IGxp c3RfaGVhZCBuZXh0Owo+Pj4gK8KgwqDCoCBpbnQgZmQ7Cj4+PiArCj4+PiDCoMKgwqDCoMKgIHVu aW9uIHsKPj4+ICvCoMKgwqDCoMKgwqDCoCBzdHJ1Y3Qgewo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqAgLyogRXhwb3J0ZWQgYnVmZmVycyBhcmUgcmVmZXJlbmNlIGNvdW50ZWQuICovCj4+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3Qga3JlZiByZWZjb3VudDsKPj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHN0cnVjdCBncmFudF9tYXAgKm1hcDsKPj4+ICvCoMKgwqDCoMKgwqDC oCB9IGV4cDsKPj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3Qgewo+Pj4gwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgLyogR3JhbnRlZCByZWZlcmVuY2VzIG9mIHRoZSBpbXBvcnRlZCBidWZm ZXIuICovCj4+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBncmFudF9yZWZfdCAqcmVmczsK Pj4+IMKgwqDCoMKgwqDCoMKgwqDCoCB9IGltcDsKPj4+IMKgwqDCoMKgwqAgfSB1Owo+Pj4gKwo+ Pj4gK8KgwqDCoCAvKiBOdW1iZXIgb2YgcGFnZXMgdGhpcyBidWZmZXIgaGFzLiAqLwo+Pj4gK8Kg wqDCoCBpbnQgbnJfcGFnZXM7Cj4+PiArwqDCoMKgIC8qIFBhZ2VzIG9mIHRoaXMgYnVmZmVyLiAq Lwo+Pj4gK8KgwqDCoCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzOwo+Pj4gK307Cj4+PiArCj4+PiArc3Ry dWN0IHhlbl9kbWFidWZfd2FpdF9vYmogewo+Pj4gK8KgwqDCoCBzdHJ1Y3QgbGlzdF9oZWFkIG5l eHQ7Cj4+PiArwqDCoMKgIHN0cnVjdCB4ZW5fZG1hYnVmICp4ZW5fZG1hYnVmOwo+Pj4gK8KgwqDC oCBzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0aW9uOwo+Pj4gK307Cj4+PiArCj4+PiArc3RydWN0 IHhlbl9kbWFidWZfYXR0YWNobWVudCB7Cj4+PiArwqDCoMKgIHN0cnVjdCBzZ190YWJsZSAqc2d0 Owo+Pj4gK8KgwqDCoCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXI7Cj4+PiDCoCB9Owo+Pj4g wqAgI2VuZGlmCj4+PiDCoCBAQCAtMzIwLDYgKzM2MiwxNiBAQCBzdGF0aWMgdm9pZCBnbnRkZXZf cHV0X21hcChzdHJ1Y3QgZ250ZGV2X3ByaXYgCj4+PiAqcHJpdiwgc3RydWN0IGdyYW50X21hcCAq bWFwKQo+Pj4gwqDCoMKgwqDCoCBnbnRkZXZfZnJlZV9tYXAobWFwKTsKPj4+IMKgIH0KPj4+IMKg ICsjaWZkZWYgQ09ORklHX1hFTl9HTlRERVZfRE1BQlVGCj4+PiArc3RhdGljIHZvaWQgZ250ZGV2 X3JlbW92ZV9tYXAoc3RydWN0IGdudGRldl9wcml2ICpwcml2LCBzdHJ1Y3QgCj4+PiBncmFudF9t YXAgKm1hcCkKPj4+ICt7Cj4+PiArwqDCoMKgIG11dGV4X2xvY2soJnByaXYtPmxvY2spOwo+Pj4g K8KgwqDCoCBsaXN0X2RlbCgmbWFwLT5uZXh0KTsKPj4+ICvCoMKgwqAgZ250ZGV2X3B1dF9tYXAo TlVMTCAvKiBhbHJlYWR5IHJlbW92ZWQgKi8sIG1hcCk7Cj4+PiArwqDCoMKgIG11dGV4X3VubG9j aygmcHJpdi0+bG9jayk7Cj4+PiArfQo+Pj4gKyNlbmRpZgo+Pj4gKwo+Pj4gwqAgLyogCj4+PiAt LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0gKi8KPj4+IMKgIMKgIHN0YXRpYyBpbnQgZmluZF9ncmFudF9wdGVzKHB0ZV90ICpw dGUsIHBndGFibGVfdCB0b2tlbiwKPj4+IEBAIC02MjgsNiArNjgwLDEyIEBAIHN0YXRpYyBpbnQg Z250ZGV2X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgCj4+PiBzdHJ1Y3QgZmlsZSAqZmxpcCkK Pj4+IMKgwqDCoMKgwqAgSU5JVF9MSVNUX0hFQUQoJnByaXYtPmZyZWVhYmxlX21hcHMpOwo+Pj4g wqDCoMKgwqDCoCBtdXRleF9pbml0KCZwcml2LT5sb2NrKTsKPj4+IMKgICsjaWZkZWYgQ09ORklH X1hFTl9HTlRERVZfRE1BQlVGCj4+PiArwqDCoMKgIG11dGV4X2luaXQoJnByaXYtPmRtYWJ1Zl9s b2NrKTsKPj4+ICvCoMKgwqAgSU5JVF9MSVNUX0hFQUQoJnByaXYtPmRtYWJ1Zl9leHBfbGlzdCk7 Cj4+PiArwqDCoMKgIElOSVRfTElTVF9IRUFEKCZwcml2LT5kbWFidWZfZXhwX3dhaXRfbGlzdCk7 Cj4+PiArI2VuZGlmCj4+PiArCj4+PiDCoMKgwqDCoMKgIGlmICh1c2VfcHRlbW9kKSB7Cj4+PiDC oMKgwqDCoMKgwqDCoMKgwqAgcHJpdi0+bW0gPSBnZXRfdGFza19tbShjdXJyZW50KTsKPj4+IMKg wqDCoMKgwqDCoMKgwqDCoCBpZiAoIXByaXYtPm1tKSB7Cj4+PiBAQCAtMTA1MywxNyArMTExMSw0 MzMgQEAgc3RhdGljIGxvbmcgZ250ZGV2X2lvY3RsX2dyYW50X2NvcHkoc3RydWN0IAo+Pj4gZ250 ZGV2X3ByaXYgKnByaXYsIHZvaWQgX191c2VyICp1KQo+Pj4gwqAgLyogRE1BIGJ1ZmZlciBleHBv cnQgCj4+PiBzdXBwb3J0LsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICovCj4+PiDCoCAvKiAKPj4+ IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLSAqLwo+Pj4gwqAgKy8qIAo+Pj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCj4+PiArLyogSW1wbGVt ZW50YXRpb24gb2Ygd2FpdCBmb3IgZXhwb3J0ZWQgRE1BIGJ1ZmZlciB0byBiZSAKPj4+IHJlbGVh c2VkLsKgwqDCoMKgICovCj4+PiArLyogCj4+PiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KPj4+ICsKPj4+ICtzdGF0 aWMgdm9pZCBkbWFidWZfZXhwX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpOwo+Pj4gKwo+Pj4g K3N0YXRpYyBzdHJ1Y3QgeGVuX2RtYWJ1Zl93YWl0X29iaiAqCj4+PiArZG1hYnVmX2V4cF93YWl0 X29ial9uZXcoc3RydWN0IGdudGRldl9wcml2ICpwcml2LAo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqAgc3RydWN0IHhlbl9kbWFidWYgKnhlbl9kbWFidWYpCj4+PiArewo+Pj4gK8KgwqDCoCBz dHJ1Y3QgeGVuX2RtYWJ1Zl93YWl0X29iaiAqb2JqOwo+Pj4gKwo+Pj4gK8KgwqDCoCBvYmogPSBr emFsbG9jKHNpemVvZigqb2JqKSwgR0ZQX0tFUk5FTCk7Cj4+PiArwqDCoMKgIGlmICghb2JqKQo+ Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwo+Pj4gKwo+Pj4gK8Kg wqDCoCBpbml0X2NvbXBsZXRpb24oJm9iai0+Y29tcGxldGlvbik7Cj4+PiArwqDCoMKgIG9iai0+ eGVuX2RtYWJ1ZiA9IHhlbl9kbWFidWY7Cj4+PiArCj4+PiArwqDCoMKgIG11dGV4X2xvY2soJnBy aXYtPmRtYWJ1Zl9sb2NrKTsKPj4+ICvCoMKgwqAgbGlzdF9hZGQoJm9iai0+bmV4dCwgJnByaXYt PmRtYWJ1Zl9leHBfd2FpdF9saXN0KTsKPj4+ICvCoMKgwqAgLyogUHV0IG91ciByZWZlcmVuY2Ug YW5kIHdhaXQgZm9yIHhlbl9kbWFidWYncyByZWxlYXNlIHRvIGZpcmUuICovCj4+PiArwqDCoMKg IGtyZWZfcHV0KCZ4ZW5fZG1hYnVmLT51LmV4cC5yZWZjb3VudCwgZG1hYnVmX2V4cF9yZWxlYXNl KTsKPj4+ICvCoMKgwqAgbXV0ZXhfdW5sb2NrKCZwcml2LT5kbWFidWZfbG9jayk7Cj4+PiArwqDC oMKgIHJldHVybiBvYmo7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyB2b2lkIGRtYWJ1Zl9leHBf d2FpdF9vYmpfZnJlZShzdHJ1Y3QgZ250ZGV2X3ByaXYgKnByaXYsCj4+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3QgeGVuX2RtYWJ1Zl93YWl0X29iaiAq b2JqKQo+Pj4gK3sKPj4+ICvCoMKgwqAgc3RydWN0IHhlbl9kbWFidWZfd2FpdF9vYmogKmN1cl9v YmosICpxOwo+Pj4gKwo+Pj4gK8KgwqDCoCBtdXRleF9sb2NrKCZwcml2LT5kbWFidWZfbG9jayk7 Cj4+PiArwqDCoMKgIGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjdXJfb2JqLCBxLCAKPj4+ICZw cml2LT5kbWFidWZfZXhwX3dhaXRfbGlzdCwgbmV4dCkKPj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAo Y3VyX29iaiA9PSBvYmopIHsKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxpc3RfZGVsKCZv YmotPm5leHQpOwo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAga2ZyZWUob2JqKTsKPj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+Pj4gK8KgwqDCoMKgwqDCoMKgIH0KPj4+ICvC oMKgwqAgbXV0ZXhfdW5sb2NrKCZwcml2LT5kbWFidWZfbG9jayk7Cj4+PiArfQo+Pj4gKwo+Pj4g K3N0YXRpYyBpbnQgZG1hYnVmX2V4cF93YWl0X29ial93YWl0KHN0cnVjdCB4ZW5fZG1hYnVmX3dh aXRfb2JqICpvYmosCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg dTMyIHdhaXRfdG9fbXMpCj4+PiArewo+Pj4gK8KgwqDCoCBpZiAod2FpdF9mb3JfY29tcGxldGlv bl90aW1lb3V0KCZvYmotPmNvbXBsZXRpb24sCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBt c2Vjc190b19qaWZmaWVzKHdhaXRfdG9fbXMpKSA8PSAwKQo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJl dHVybiAtRVRJTUVET1VUOwo+Pj4gKwo+Pj4gK8KgwqDCoCByZXR1cm4gMDsKPj4+ICt9Cj4+PiAr Cj4+PiArc3RhdGljIHZvaWQgZG1hYnVmX2V4cF93YWl0X29ial9zaWduYWwoc3RydWN0IGdudGRl dl9wcml2ICpwcml2LAo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHN0cnVjdCB4ZW5fZG1hYnVmICp4ZW5fZG1hYnVmKQo+Pj4gK3sKPj4+ICvCoMKgwqAg c3RydWN0IHhlbl9kbWFidWZfd2FpdF9vYmogKm9iaiwgKnE7Cj4+PiArCj4+PiArwqDCoMKgIGxp c3RfZm9yX2VhY2hfZW50cnlfc2FmZShvYmosIHEsICZwcml2LT5kbWFidWZfZXhwX3dhaXRfbGlz dCwgCj4+PiBuZXh0KQo+Pj4gK8KgwqDCoMKgwqDCoMKgIGlmIChvYmotPnhlbl9kbWFidWYgPT0g eGVuX2RtYWJ1Zikgewo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHJfZGVidWcoIkZvdW5k IHhlbl9kbWFidWYgaW4gdGhlIHdhaXQgbGlzdCwgd2FrZVxuIik7Cj4+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBjb21wbGV0ZV9hbGwoJm9iai0+Y29tcGxldGlvbik7Cj4+PiArwqDCoMKgwqDC oMKgwqAgfQo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgc3RydWN0IHhlbl9kbWFidWYgKgo+Pj4g K2RtYWJ1Zl9leHBfd2FpdF9vYmpfZ2V0X2J5X2ZkKHN0cnVjdCBnbnRkZXZfcHJpdiAqcHJpdiwg aW50IGZkKQo+Pj4gK3sKPj4+ICvCoMKgwqAgc3RydWN0IHhlbl9kbWFidWYgKnEsICp4ZW5fZG1h YnVmLCAqcmV0ID0gRVJSX1BUUigtRU5PRU5UKTsKPj4+ICsKPj4+ICvCoMKgwqAgbXV0ZXhfbG9j aygmcHJpdi0+ZG1hYnVmX2xvY2spOwo+Pj4gK8KgwqDCoCBsaXN0X2Zvcl9lYWNoX2VudHJ5X3Nh ZmUoeGVuX2RtYWJ1ZiwgcSwgJnByaXYtPmRtYWJ1Zl9leHBfbGlzdCwgCj4+PiBuZXh0KQo+Pj4g K8KgwqDCoMKgwqDCoMKgIGlmICh4ZW5fZG1hYnVmLT5mZCA9PSBmZCkgewo+Pj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqAgcHJfZGVidWcoIkZvdW5kIHhlbl9kbWFidWYgaW4gdGhlIHdhaXQgbGlz dFxuIik7Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBrcmVmX2dldCgmeGVuX2RtYWJ1Zi0+ dS5leHAucmVmY291bnQpOwo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0ID0geGVuX2Rt YWJ1ZjsKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+Pj4gK8KgwqDCoMKgwqDC oMKgIH0KPj4+ICvCoMKgwqAgbXV0ZXhfdW5sb2NrKCZwcml2LT5kbWFidWZfbG9jayk7Cj4+PiAr wqDCoMKgIHJldHVybiByZXQ7Cj4+PiArfQo+Pj4gKwo+Pj4gwqAgc3RhdGljIGludCBkbWFidWZf ZXhwX3dhaXRfcmVsZWFzZWQoc3RydWN0IGdudGRldl9wcml2ICpwcml2LCBpbnQgZmQsCj4+PiDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW50IHdhaXRfdG9fbXMp Cj4+PiDCoCB7Cj4+PiAtwqDCoMKgIHJldHVybiAtRVRJTUVET1VUOwo+Pj4gK8KgwqDCoCBzdHJ1 Y3QgeGVuX2RtYWJ1ZiAqeGVuX2RtYWJ1ZjsKPj4+ICvCoMKgwqAgc3RydWN0IHhlbl9kbWFidWZf d2FpdF9vYmogKm9iajsKPj4+ICvCoMKgwqAgaW50IHJldDsKPj4+ICsKPj4+ICvCoMKgwqAgcHJf ZGVidWcoIldpbGwgd2FpdCBmb3IgZG1hLWJ1ZiB3aXRoIGZkICVkXG4iLCBmZCk7Cj4+PiArwqDC oMKgIC8qCj4+PiArwqDCoMKgwqAgKiBUcnkgdG8gZmluZCB0aGUgRE1BIGJ1ZmZlcjogaWYgbm90 IGZvdW5kIG1lYW5zIHRoYXQKPj4+ICvCoMKgwqDCoCAqIGVpdGhlciB0aGUgYnVmZmVyIGhhcyBh bHJlYWR5IGJlZW4gcmVsZWFzZWQgb3IgZmlsZSBkZXNjcmlwdG9yCj4+PiArwqDCoMKgwqAgKiBw cm92aWRlZCBpcyB3cm9uZy4KPj4+ICvCoMKgwqDCoCAqLwo+Pj4gK8KgwqDCoCB4ZW5fZG1hYnVm ID0gZG1hYnVmX2V4cF93YWl0X29ial9nZXRfYnlfZmQocHJpdiwgZmQpOwo+Pj4gK8KgwqDCoCBp ZiAoSVNfRVJSKHhlbl9kbWFidWYpKQo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBQVFJfRVJS KHhlbl9kbWFidWYpOwo+Pj4gKwo+Pj4gK8KgwqDCoCAvKgo+Pj4gK8KgwqDCoMKgICogeGVuX2Rt YWJ1ZiBzdGlsbCBleGlzdHMgYW5kIGlzIHJlZmVyZW5jZSBjb3VudCBsb2NrZWQgYnkgdXMgCj4+ PiBub3csCj4+PiArwqDCoMKgwqAgKiBzbyBwcmVwYXJlIHRvIHdhaXQ6IGFsbG9jYXRlIHdhaXQg b2JqZWN0IGFuZCBhZGQgaXQgdG8gdGhlIAo+Pj4gd2FpdCBsaXN0LAo+Pj4gK8KgwqDCoMKgICog c28gd2UgY2FuIGZpbmQgaXQgb24gcmVsZWFzZS4KPj4+ICvCoMKgwqDCoCAqLwo+Pj4gK8KgwqDC oCBvYmogPSBkbWFidWZfZXhwX3dhaXRfb2JqX25ldyhwcml2LCB4ZW5fZG1hYnVmKTsKPj4+ICvC oMKgwqAgaWYgKElTX0VSUihvYmopKSB7Cj4+PiArwqDCoMKgwqDCoMKgwqAgcHJfZXJyKCJGYWls ZWQgdG8gc2V0dXAgd2FpdCBvYmplY3QsIHJldCAlbGRcbiIsIAo+Pj4gUFRSX0VSUihvYmopKTsK Pj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gUFRSX0VSUihvYmopOwo+Pj4gK8KgwqDCoCB9Cj4+ PiArCj4+PiArwqDCoMKgIHJldCA9IGRtYWJ1Zl9leHBfd2FpdF9vYmpfd2FpdChvYmosIHdhaXRf dG9fbXMpOwo+Pj4gK8KgwqDCoCBkbWFidWZfZXhwX3dhaXRfb2JqX2ZyZWUocHJpdiwgb2JqKTsK Pj4+ICvCoMKgwqAgcmV0dXJuIHJldDsKPj4+ICt9Cj4+PiArCj4+PiArLyogCj4+PiAtLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0gKi8KPj4+ICsvKiBETUEgYnVmZmVyIGV4cG9ydCAKPj4+IHN1cHBvcnQuwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgKi8KPj4+ICsvKiAKPj4+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwo+Pj4gKwo+Pj4gK3N0YXRp YyBzdHJ1Y3Qgc2dfdGFibGUgKgo+Pj4gK2RtYWJ1Zl9wYWdlc190b19zZ3Qoc3RydWN0IHBhZ2Ug KipwYWdlcywgdW5zaWduZWQgaW50IG5yX3BhZ2VzKQo+Pj4gK3sKPj4+ICvCoMKgwqAgc3RydWN0 IHNnX3RhYmxlICpzZ3Q7Cj4+PiArwqDCoMKgIGludCByZXQ7Cj4+PiArCj4+PiArwqDCoMKgIHNn dCA9IGttYWxsb2Moc2l6ZW9mKCpzZ3QpLCBHRlBfS0VSTkVMKTsKPj4+ICvCoMKgwqAgaWYgKCFz Z3QpIHsKPj4+ICvCoMKgwqDCoMKgwqDCoCByZXQgPSAtRU5PTUVNOwo+Pj4gK8KgwqDCoMKgwqDC oMKgIGdvdG8gb3V0Owo+Pj4gK8KgwqDCoCB9Cj4+PiArCj4+PiArwqDCoMKgIHJldCA9IHNnX2Fs bG9jX3RhYmxlX2Zyb21fcGFnZXMoc2d0LCBwYWdlcywgbnJfcGFnZXMsIDAsCj4+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbnJfcGFnZXMgPDwgUEFHRV9TSElGVCwK Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBHRlBfS0VSTkVMKTsK Pj4+ICvCoMKgwqAgaWYgKHJldCkKPj4+ICvCoMKgwqDCoMKgwqDCoCBnb3RvIG91dDsKPj4+ICsK Pj4+ICvCoMKgwqAgcmV0dXJuIHNndDsKPj4+ICsKPj4+ICtvdXQ6Cj4+PiArwqDCoMKgIGtmcmVl KHNndCk7Cj4+PiArwqDCoMKgIHJldHVybiBFUlJfUFRSKHJldCk7Cj4+PiArfQo+Pj4gKwo+Pj4g K3N0YXRpYyBpbnQgZG1hYnVmX2V4cF9vcHNfYXR0YWNoKHN0cnVjdCBkbWFfYnVmICpkbWFfYnVm LAo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0cnVjdCBkZXZpY2UgKnRh cmdldF9kZXYsCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IGRt YV9idWZfYXR0YWNobWVudCAqYXR0YWNoKQo+Pj4gK3sKPj4+ICvCoMKgwqAgc3RydWN0IHhlbl9k bWFidWZfYXR0YWNobWVudCAqeGVuX2RtYWJ1Zl9hdHRhY2g7Cj4+PiArCj4+PiArwqDCoMKgIHhl bl9kbWFidWZfYXR0YWNoID0ga3phbGxvYyhzaXplb2YoKnhlbl9kbWFidWZfYXR0YWNoKSwgCj4+ PiBHRlBfS0VSTkVMKTsKPj4+ICvCoMKgwqAgaWYgKCF4ZW5fZG1hYnVmX2F0dGFjaCkKPj4+ICvC oMKgwqDCoMKgwqDCoCByZXR1cm4gLUVOT01FTTsKPj4+ICsKPj4+ICvCoMKgwqAgeGVuX2RtYWJ1 Zl9hdHRhY2gtPmRpciA9IERNQV9OT05FOwo+Pj4gK8KgwqDCoCBhdHRhY2gtPnByaXYgPSB4ZW5f ZG1hYnVmX2F0dGFjaDsKPj4+ICvCoMKgwqAgLyogTWlnaHQgbmVlZCB0byBwaW4gdGhlIHBhZ2Vz IG9mIHRoZSBidWZmZXIgbm93LiAqLwo+Pj4gK8KgwqDCoCByZXR1cm4gMDsKPj4+ICt9Cj4+PiAr Cj4+PiArc3RhdGljIHZvaWQgZG1hYnVmX2V4cF9vcHNfZGV0YWNoKHN0cnVjdCBkbWFfYnVmICpk bWFfYnVmLAo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IGRt YV9idWZfYXR0YWNobWVudCAqYXR0YWNoKQo+Pj4gK3sKPj4+ICvCoMKgwqAgc3RydWN0IHhlbl9k bWFidWZfYXR0YWNobWVudCAqeGVuX2RtYWJ1Zl9hdHRhY2ggPSBhdHRhY2gtPnByaXY7Cj4+PiAr Cj4+PiArwqDCoMKgIGlmICh4ZW5fZG1hYnVmX2F0dGFjaCkgewo+Pj4gK8KgwqDCoMKgwqDCoMKg IHN0cnVjdCBzZ190YWJsZSAqc2d0ID0geGVuX2RtYWJ1Zl9hdHRhY2gtPnNndDsKPj4+ICsKPj4+ ICvCoMKgwqDCoMKgwqDCoCBpZiAoc2d0KSB7Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBp ZiAoeGVuX2RtYWJ1Zl9hdHRhY2gtPmRpciAhPSBETUFfTk9ORSkKPj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgZG1hX3VubWFwX3NnX2F0dHJzKGF0dGFjaC0+ZGV2LCBzZ3QtPnNn bCwKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHNndC0+bmVudHMsCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB4ZW5fZG1hYnVmX2F0dGFjaC0+ZGlyLAo+Pj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgRE1BX0FUVFJfU0tJUF9D UFVfU1lOQyk7Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzZ19mcmVlX3RhYmxlKHNndCk7 Cj4+PiArwqDCoMKgwqDCoMKgwqAgfQo+Pj4gKwo+Pj4gK8KgwqDCoMKgwqDCoMKgIGtmcmVlKHNn dCk7Cj4+PiArwqDCoMKgwqDCoMKgwqAga2ZyZWUoeGVuX2RtYWJ1Zl9hdHRhY2gpOwo+Pj4gK8Kg wqDCoMKgwqDCoMKgIGF0dGFjaC0+cHJpdiA9IE5VTEw7Cj4+PiArwqDCoMKgIH0KPj4+ICvCoMKg wqAgLyogTWlnaHQgbmVlZCB0byB1bnBpbiB0aGUgcGFnZXMgb2YgdGhlIGJ1ZmZlciBub3cuICov Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBzdHJ1Y3Qgc2dfdGFibGUgKgo+Pj4gK2RtYWJ1Zl9l eHBfb3BzX21hcF9kbWFfYnVmKHN0cnVjdCBkbWFfYnVmX2F0dGFjaG1lbnQgKmF0dGFjaCwKPj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRp cikKPj4+ICt7Cj4+PiArwqDCoMKgIHN0cnVjdCB4ZW5fZG1hYnVmX2F0dGFjaG1lbnQgKnhlbl9k bWFidWZfYXR0YWNoID0gYXR0YWNoLT5wcml2Owo+Pj4gK8KgwqDCoCBzdHJ1Y3QgeGVuX2RtYWJ1 ZiAqeGVuX2RtYWJ1ZiA9IGF0dGFjaC0+ZG1hYnVmLT5wcml2Owo+Pj4gK8KgwqDCoCBzdHJ1Y3Qg c2dfdGFibGUgKnNndDsKPj4+ICsKPj4+ICvCoMKgwqAgcHJfZGVidWcoIk1hcHBpbmcgJWQgcGFn ZXMgZm9yIGRldiAlcFxuIiwgeGVuX2RtYWJ1Zi0+bnJfcGFnZXMsCj4+PiArwqDCoMKgwqDCoMKg wqDCoCBhdHRhY2gtPmRldik7Cj4+PiArCj4+PiArwqDCoMKgIGlmIChXQVJOX09OKGRpciA9PSBE TUFfTk9ORSB8fCAheGVuX2RtYWJ1Zl9hdHRhY2gpKQo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVy biBFUlJfUFRSKC1FSU5WQUwpOwo+Pj4gKwo+Pj4gK8KgwqDCoCAvKiBSZXR1cm4gdGhlIGNhY2hl ZCBtYXBwaW5nIHdoZW4gcG9zc2libGUuICovCj4+PiArwqDCoMKgIGlmICh4ZW5fZG1hYnVmX2F0 dGFjaC0+ZGlyID09IGRpcikKPj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4geGVuX2RtYWJ1Zl9h dHRhY2gtPnNndDsKPj4gbWF5IG5lZWQgdG8gY2hlY2sgeGVuX2RtYWJ1Zl9hdHRhY2gtPnNndCA9 PSBOVUxMIChpLmUuIGZpcnN0IHRpbWUgCj4+IG1hcHBpbmcpPwo+PiBBbHNvLCBJIGFtIG5vdCBz dXJlIGlmIHRoaXMgbWVjaGFuaXNtIG9mIHJldXNpbmcgcHJldmlvdXNseSBnZW5lcmF0ZWQgCj4+ IHNndAo+PiBmb3Igb3RoZXIgbWFwcGluZ3MgaXMgdW5pdmVyc2FsbHkgb2sgZm9yIGFueSB1c2Ut Y2FzZXMuLi4gSSBkb24ndCAKPj4ga25vdyBpZgo+PiBpdCBpcyBhY2NlcHRhYmxlIGFzIHBlciB0 aGUgc3BlY2lmaWNhdGlvbi4KPiBXZWxsLCBJIHdhcyBub3Qgc3VyZSBhYm91dCB0aGlzIHBpZWNl IG9mIGNvZGUgYXMgd2VsbCwKPiBzbyBJJ2xsIHByb2JhYmx5IGFsbG9jYXRlIGEgbmV3IHNndCBl YWNoIHRpbWUgYW5kIGRvIG5vdCByZXVzZSBpdAo+IGFzIG5vdwpUaGUgc2d0IHJldHVybmVkIGZv ciB0aGUgc2FtZSBhdHRhY2htZW50LCBzbyBpdCBpcyBvayB0byByZXR1cm4gdGhpcyAKY2FjaGVk IG9uZQphcyB3ZSBhbHNvIGNoZWNrIHRoYXQgdGhlIGRpcmVjdGlvbiBoYXMgbm90IGNoYW5nZWQK U28sIEknbGwgbGVhdmUgaXQgYXMgaXMKPj4+ICsKPj4+ICvCoMKgwqAgLyoKPj4+ICvCoMKgwqDC oCAqIFR3byBtYXBwaW5ncyB3aXRoIGRpZmZlcmVudCBkaXJlY3Rpb25zIGZvciB0aGUgc2FtZSAK Pj4+IGF0dGFjaG1lbnQgYXJlCj4+PiArwqDCoMKgwqAgKiBub3QgYWxsb3dlZC4KPj4+ICvCoMKg wqDCoCAqLwo+Pj4gK8KgwqDCoCBpZiAoV0FSTl9PTih4ZW5fZG1hYnVmX2F0dGFjaC0+ZGlyICE9 IERNQV9OT05FKSkKPj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gRVJSX1BUUigtRUJVU1kpOwo+ Pj4gKwo+Pj4gK8KgwqDCoCBzZ3QgPSBkbWFidWZfcGFnZXNfdG9fc2d0KHhlbl9kbWFidWYtPnBh Z2VzLCAKPj4+IHhlbl9kbWFidWYtPm5yX3BhZ2VzKTsKPj4+ICvCoMKgwqAgaWYgKCFJU19FUlIo c2d0KSkgewo+Pj4gK8KgwqDCoMKgwqDCoMKgIGlmICghZG1hX21hcF9zZ19hdHRycyhhdHRhY2gt PmRldiwgc2d0LT5zZ2wsIHNndC0+bmVudHMsIGRpciwKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgRE1BX0FUVFJfU0tJUF9DUFVfU1lOQykpIHsKPj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNnX2ZyZWVfdGFibGUoc2d0KTsKPj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGtmcmVlKHNndCk7Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzZ3Qg PSBFUlJfUFRSKC1FTk9NRU0pOwo+Pj4gK8KgwqDCoMKgwqDCoMKgIH0gZWxzZSB7Cj4+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCB4ZW5fZG1hYnVmX2F0dGFjaC0+c2d0ID0gc2d0Owo+Pj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqAgeGVuX2RtYWJ1Zl9hdHRhY2gtPmRpciA9IGRpcjsKPj4+ICvC oMKgwqDCoMKgwqDCoCB9Cj4+PiArwqDCoMKgIH0KPj4+ICvCoMKgwqAgaWYgKElTX0VSUihzZ3Qp KQo+Pj4gK8KgwqDCoMKgwqDCoMKgIHByX2VycigiRmFpbGVkIHRvIG1hcCBzZyB0YWJsZSBmb3Ig ZGV2ICVwXG4iLCBhdHRhY2gtPmRldik7Cj4+PiArwqDCoMKgIHJldHVybiBzZ3Q7Cj4+PiArfQo+ Pj4gKwo+Pj4gK3N0YXRpYyB2b2lkIGRtYWJ1Zl9leHBfb3BzX3VubWFwX2RtYV9idWYoc3RydWN0 IGRtYV9idWZfYXR0YWNobWVudCAKPj4+ICphdHRhY2gsCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3Qgc2dfdGFibGUgKnNndCwKPj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9u IGRpcikKPj4+ICt7Cj4+PiArwqDCoMKgIC8qIE5vdCBpbXBsZW1lbnRlZC4gVGhlIHVubWFwIGlz IGRvbmUgYXQgCj4+PiBkbWFidWZfZXhwX29wc19kZXRhY2goKS4gKi8KPj4gTm90IHN1cmUgaWYg aXQncyBvayB0byBkbyBub3RoaW5nIGhlcmUgYmVjYXVzZSB0aGUgc3BlYyBzYXlzIHRoaXMgCj4+ IGZ1bmN0aW9uIGlzCj4+IG1hbmRhdG9yeSBhbmQgaXQgc2hvdWxkIHVubWFwIGFuZCAicmVsZWFz ZSIgJnNnX3RhYmxlIGFzc29jaWF0ZWQgd2l0aCAKPj4gaXQuCj4+Cj4+IMKgwqDCoMKgLyoqCj4+ IMKgwqDCoMKgICogQHVubWFwX2RtYV9idWY6Cj4+IMKgwqDCoMKgICoKPj4gwqDCoMKgwqAgKiBU aGlzIGlzIGNhbGxlZCBieSBkbWFfYnVmX3VubWFwX2F0dGFjaG1lbnQoKSBhbmQgc2hvdWxkIHVu bWFwIGFuZAo+PiDCoMKgwqDCoCAqIHJlbGVhc2UgdGhlICZzZ190YWJsZSBhbGxvY2F0ZWQgaW4g QG1hcF9kbWFfYnVmLCBhbmQgaXQgaXMgCj4+IG1hbmRhdG9yeS4KPj4gwqDCoMKgwqAgKiBJdCBz aG91bGQgYWxzbyB1bnBpbiB0aGUgYmFja2luZyBzdG9yYWdlIGlmIHRoaXMgaXMgdGhlIGxhc3Qg Cj4+IG1hcHBpbmcKPj4gwqDCoMKgwqAgKiBvZiB0aGUgRE1BIGJ1ZmZlciwgaXQgdGhlIGV4cG9y dGVyIHN1cHBvcnRzIGJhY2tpbmcgc3RvcmFnZQo+PiDCoMKgwqDCoCAqIG1pZ3JhdGlvbi4KPj4g wqDCoMKgwqAgKi8KPiBZZXMsIGFzIEkgc2F5IGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUgZG1hLWJ1 ZiBoYW5kbGluZyBpcyBEUk0gUFJJTUUKPiBiYXNlZCwgc28gSSBoYXZlIHRoZSB3b3JrZmxvdyBq dXN0IGxpa2UgaW4gdGhlcmUuCj4gRG8geW91IHRoaW5rIHdlIGhhdmUgdG8gYmUgbW9yZSBzdHJp Y3QgYW5kIHJld29yayB0aGlzPwo+Cj4gRGFuaWVsLCB3aGF0IGRvIHlvdSB0aGluaz8KSSBzZWUg b3RoZXIgZHJpdmVycyBpbiB0aGUga2VybmVsIGRvIHRoZSBzYW1lLiBJIHRoaW5rIHRoYXQgKnNo b3VsZCoKaW4gdGhlIGRtYS1idWYgZG9jdW1lbnRhdGlvbiBkb2VzIGFsbG93IHRoYXQuClNvLCBJ J2xsIGxlYXZlIGl0IGFzIGlzIGZvciBub3cKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIHZvaWQg ZG1hYnVmX2V4cF9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQo+Pj4gK3sKPj4+ICvCoMKgwqAg c3RydWN0IHhlbl9kbWFidWYgKnhlbl9kbWFidWYgPQo+Pj4gK8KgwqDCoMKgwqDCoMKgIGNvbnRh aW5lcl9vZihrcmVmLCBzdHJ1Y3QgeGVuX2RtYWJ1ZiwgdS5leHAucmVmY291bnQpOwo+Pj4gKwo+ Pj4gK8KgwqDCoCBkbWFidWZfZXhwX3dhaXRfb2JqX3NpZ25hbCh4ZW5fZG1hYnVmLT5wcml2LCB4 ZW5fZG1hYnVmKTsKPj4+ICvCoMKgwqAgbGlzdF9kZWwoJnhlbl9kbWFidWYtPm5leHQpOwo+Pj4g K8KgwqDCoCBrZnJlZSh4ZW5fZG1hYnVmKTsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIHZvaWQg ZG1hYnVmX2V4cF9vcHNfcmVsZWFzZShzdHJ1Y3QgZG1hX2J1ZiAqZG1hX2J1ZikKPj4+ICt7Cj4+ PiArwqDCoMKgIHN0cnVjdCB4ZW5fZG1hYnVmICp4ZW5fZG1hYnVmID0gZG1hX2J1Zi0+cHJpdjsK Pj4+ICvCoMKgwqAgc3RydWN0IGdudGRldl9wcml2ICpwcml2ID0geGVuX2RtYWJ1Zi0+cHJpdjsK Pj4+ICsKPj4+ICvCoMKgwqAgZ250ZGV2X3JlbW92ZV9tYXAocHJpdiwgeGVuX2RtYWJ1Zi0+dS5l eHAubWFwKTsKPj4+ICvCoMKgwqAgbXV0ZXhfbG9jaygmcHJpdi0+ZG1hYnVmX2xvY2spOwo+Pj4g K8KgwqDCoCBrcmVmX3B1dCgmeGVuX2RtYWJ1Zi0+dS5leHAucmVmY291bnQsIGRtYWJ1Zl9leHBf cmVsZWFzZSk7Cj4+PiArwqDCoMKgIG11dGV4X3VubG9jaygmcHJpdi0+ZG1hYnVmX2xvY2spOwo+ Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgdm9pZCAqZG1hYnVmX2V4cF9vcHNfa21hcF9hdG9taWMo c3RydWN0IGRtYV9idWYgKmRtYV9idWYsCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgdW5zaWduZWQgbG9uZyBwYWdlX251bSkKPj4+ICt7Cj4+PiArwqDCoMKgIC8q IE5vdCBpbXBsZW1lbnRlZC4gKi8KPj4+ICvCoMKgwqAgcmV0dXJuIE5VTEw7Cj4+PiArfQo+Pj4g Kwo+Pj4gK3N0YXRpYyB2b2lkIGRtYWJ1Zl9leHBfb3BzX2t1bm1hcF9hdG9taWMoc3RydWN0IGRt YV9idWYgKmRtYV9idWYsCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCB1bnNpZ25lZCBsb25nIHBhZ2VfbnVtLCB2b2lkICphZGRyKQo+Pj4gK3sKPj4+ICvCoMKg wqAgLyogTm90IGltcGxlbWVudGVkLiAqLwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgdm9pZCAq ZG1hYnVmX2V4cF9vcHNfa21hcChzdHJ1Y3QgZG1hX2J1ZiAqZG1hX2J1ZiwKPj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBsb25nIHBhZ2VfbnVtKQo+Pj4gK3sK Pj4+ICvCoMKgwqAgLyogTm90IGltcGxlbWVudGVkLiAqLwo+Pj4gK8KgwqDCoCByZXR1cm4gTlVM TDsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIHZvaWQgZG1hYnVmX2V4cF9vcHNfa3VubWFwKHN0 cnVjdCBkbWFfYnVmICpkbWFfYnVmLAo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgdW5zaWduZWQgbG9uZyBwYWdlX251bSwgdm9pZCAqYWRkcikKPj4+ICt7Cj4+PiArwqDC oMKgIC8qIE5vdCBpbXBsZW1lbnRlZC4gKi8KPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIGludCBk bWFidWZfZXhwX29wc19tbWFwKHN0cnVjdCBkbWFfYnVmICpkbWFfYnVmLAo+Pj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkK Pj4+ICt7Cj4+PiArwqDCoMKgIC8qIE5vdCBpbXBsZW1lbnRlZC4gKi8KPj4+ICvCoMKgwqAgcmV0 dXJuIDA7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZG1hX2J1Zl9vcHMg ZG1hYnVmX2V4cF9vcHMgPcKgIHsKPj4+ICvCoMKgwqAgLmF0dGFjaCA9IGRtYWJ1Zl9leHBfb3Bz X2F0dGFjaCwKPj4+ICvCoMKgwqAgLmRldGFjaCA9IGRtYWJ1Zl9leHBfb3BzX2RldGFjaCwKPj4+ ICvCoMKgwqAgLm1hcF9kbWFfYnVmID0gZG1hYnVmX2V4cF9vcHNfbWFwX2RtYV9idWYsCj4+PiAr wqDCoMKgIC51bm1hcF9kbWFfYnVmID0gZG1hYnVmX2V4cF9vcHNfdW5tYXBfZG1hX2J1ZiwKPj4+ ICvCoMKgwqAgLnJlbGVhc2UgPSBkbWFidWZfZXhwX29wc19yZWxlYXNlLAo+Pj4gK8KgwqDCoCAu bWFwID0gZG1hYnVmX2V4cF9vcHNfa21hcCwKPj4+ICvCoMKgwqAgLm1hcF9hdG9taWMgPSBkbWFi dWZfZXhwX29wc19rbWFwX2F0b21pYywKPj4+ICvCoMKgwqAgLnVubWFwID0gZG1hYnVmX2V4cF9v cHNfa3VubWFwLAo+Pj4gK8KgwqDCoCAudW5tYXBfYXRvbWljID0gZG1hYnVmX2V4cF9vcHNfa3Vu bWFwX2F0b21pYywKPj4+ICvCoMKgwqAgLm1tYXAgPSBkbWFidWZfZXhwX29wc19tbWFwLAo+Pj4g K307Cj4+PiArCj4+PiArc3RhdGljIGludCBkbWFidWZfZXhwb3J0KHN0cnVjdCBnbnRkZXZfcHJp diAqcHJpdiwgc3RydWN0IGdyYW50X21hcCAKPj4+ICptYXAsCj4+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGludCAqZmQpCj4+PiArewo+Pj4gK8KgwqDCoCBERUZJTkVfRE1BX0JVRl9FWFBP UlRfSU5GTyhleHBfaW5mbyk7Cj4+PiArwqDCoMKgIHN0cnVjdCB4ZW5fZG1hYnVmICp4ZW5fZG1h YnVmOwo+Pj4gK8KgwqDCoCBpbnQgcmV0ID0gMDsKPj4+ICsKPj4+ICvCoMKgwqAgeGVuX2RtYWJ1 ZiA9IGt6YWxsb2Moc2l6ZW9mKCp4ZW5fZG1hYnVmKSwgR0ZQX0tFUk5FTCk7Cj4+PiArwqDCoMKg IGlmICgheGVuX2RtYWJ1ZikKPj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVOT01FTTsKPj4+ ICsKPj4+ICvCoMKgwqAga3JlZl9pbml0KCZ4ZW5fZG1hYnVmLT51LmV4cC5yZWZjb3VudCk7Cj4+ PiArCj4+PiArwqDCoMKgIHhlbl9kbWFidWYtPnByaXYgPSBwcml2Owo+Pj4gK8KgwqDCoCB4ZW5f ZG1hYnVmLT5ucl9wYWdlcyA9IG1hcC0+Y291bnQ7Cj4+PiArwqDCoMKgIHhlbl9kbWFidWYtPnBh Z2VzID0gbWFwLT5wYWdlczsKPj4+ICvCoMKgwqAgeGVuX2RtYWJ1Zi0+dS5leHAubWFwID0gbWFw Owo+Pj4gKwo+Pj4gK8KgwqDCoCBleHBfaW5mby5leHBfbmFtZSA9IEtCVUlMRF9NT0ROQU1FOwo+ Pj4gK8KgwqDCoCBpZiAobWFwLT5kbWFfZGV2LT5kcml2ZXIgJiYgbWFwLT5kbWFfZGV2LT5kcml2 ZXItPm93bmVyKQo+Pj4gK8KgwqDCoMKgwqDCoMKgIGV4cF9pbmZvLm93bmVyID0gbWFwLT5kbWFf ZGV2LT5kcml2ZXItPm93bmVyOwo+Pj4gK8KgwqDCoCBlbHNlCj4+PiArwqDCoMKgwqDCoMKgwqAg ZXhwX2luZm8ub3duZXIgPSBUSElTX01PRFVMRTsKPj4+ICvCoMKgwqAgZXhwX2luZm8ub3BzID0g JmRtYWJ1Zl9leHBfb3BzOwo+Pj4gK8KgwqDCoCBleHBfaW5mby5zaXplID0gbWFwLT5jb3VudCA8 PCBQQUdFX1NISUZUOwo+Pj4gK8KgwqDCoCBleHBfaW5mby5mbGFncyA9IE9fUkRXUjsKPj4+ICvC oMKgwqAgZXhwX2luZm8ucHJpdiA9IHhlbl9kbWFidWY7Cj4+PiArCj4+PiArwqDCoMKgIHhlbl9k bWFidWYtPmRtYWJ1ZiA9IGRtYV9idWZfZXhwb3J0KCZleHBfaW5mbyk7Cj4+PiArwqDCoMKgIGlm IChJU19FUlIoeGVuX2RtYWJ1Zi0+ZG1hYnVmKSkgewo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldCA9 IFBUUl9FUlIoeGVuX2RtYWJ1Zi0+ZG1hYnVmKTsKPj4+ICvCoMKgwqDCoMKgwqDCoCB4ZW5fZG1h YnVmLT5kbWFidWYgPSBOVUxMOwo+Pj4gK8KgwqDCoMKgwqDCoMKgIGdvdG8gZmFpbDsKPj4+ICvC oMKgwqAgfQo+Pj4gKwo+Pj4gK8KgwqDCoCByZXQgPSBkbWFfYnVmX2ZkKHhlbl9kbWFidWYtPmRt YWJ1ZiwgT19DTE9FWEVDKTsKPj4+ICvCoMKgwqAgaWYgKHJldCA8IDApCj4+PiArwqDCoMKgwqDC oMKgwqAgZ290byBmYWlsOwo+Pj4gKwo+Pj4gK8KgwqDCoCB4ZW5fZG1hYnVmLT5mZCA9IHJldDsK Pj4+ICvCoMKgwqAgKmZkID0gcmV0Owo+Pj4gKwo+Pj4gK8KgwqDCoCBwcl9kZWJ1ZygiRXhwb3J0 aW5nIERNQSBidWZmZXIgd2l0aCBmZCAlZFxuIiwgcmV0KTsKPj4+ICsKPj4+ICvCoMKgwqAgbXV0 ZXhfbG9jaygmcHJpdi0+ZG1hYnVmX2xvY2spOwo+Pj4gK8KgwqDCoCBsaXN0X2FkZCgmeGVuX2Rt YWJ1Zi0+bmV4dCwgJnByaXYtPmRtYWJ1Zl9leHBfbGlzdCk7Cj4+PiArwqDCoMKgIG11dGV4X3Vu bG9jaygmcHJpdi0+ZG1hYnVmX2xvY2spOwo+Pj4gK8KgwqDCoCByZXR1cm4gMDsKPj4+ICsKPj4+ ICtmYWlsOgo+Pj4gK8KgwqDCoCBpZiAoeGVuX2RtYWJ1Zi0+ZG1hYnVmKQo+Pj4gK8KgwqDCoMKg wqDCoMKgIGRtYV9idWZfcHV0KHhlbl9kbWFidWYtPmRtYWJ1Zik7Cj4+PiArwqDCoMKgIGtmcmVl KHhlbl9kbWFidWYpOwo+Pj4gK8KgwqDCoCByZXR1cm4gcmV0Owo+Pj4gK30KPj4+ICsKPj4+ICtz dGF0aWMgc3RydWN0IGdyYW50X21hcCAqCj4+PiArZG1hYnVmX2V4cF9hbGxvY19iYWNraW5nX3N0 b3JhZ2Uoc3RydWN0IGdudGRldl9wcml2ICpwcml2LCBpbnQgCj4+PiBkbWFidWZfZmxhZ3MsCj4+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW50IGNvdW50KQo+Pj4gK3sKPj4+ ICvCoMKgwqAgc3RydWN0IGdyYW50X21hcCAqbWFwOwo+Pj4gKwo+Pj4gK8KgwqDCoCBpZiAodW5s aWtlbHkoY291bnQgPD0gMCkpCj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIEVSUl9QVFIoLUVJ TlZBTCk7Cj4+PiArCj4+PiArwqDCoMKgIGlmICgoZG1hYnVmX2ZsYWdzICYgR05UREVWX0RNQV9G TEFHX1dDKSAmJgo+Pj4gK8KgwqDCoMKgwqDCoMKgIChkbWFidWZfZmxhZ3MgJiBHTlRERVZfRE1B X0ZMQUdfQ09IRVJFTlQpKSB7Cj4+PiArwqDCoMKgwqDCoMKgwqAgcHJfZXJyKCJXcm9uZyBkbWEt YnVmIGZsYWdzOiBlaXRoZXIgV0Mgb3IgY29oZXJlbnQsIG5vdCAKPj4+IGJvdGhcbiIpOwo+Pj4g K8KgwqDCoMKgwqDCoMKgIHJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwo+Pj4gK8KgwqDCoCB9Cj4+ PiArCj4+PiArwqDCoMKgIG1hcCA9IGdudGRldl9hbGxvY19tYXAocHJpdiwgY291bnQsIGRtYWJ1 Zl9mbGFncyk7Cj4+PiArwqDCoMKgIGlmICghbWFwKQo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVy biBFUlJfUFRSKC1FTk9NRU0pOwo+Pj4gKwo+Pj4gK8KgwqDCoCBpZiAodW5saWtlbHkoYXRvbWlj X2FkZF9yZXR1cm4oY291bnQsICZwYWdlc19tYXBwZWQpID4gbGltaXQpKSB7Cj4+PiArwqDCoMKg wqDCoMKgwqAgcHJfZXJyKCJjYW4ndCBtYXA6IG92ZXIgbGltaXRcbiIpOwo+Pj4gK8KgwqDCoMKg wqDCoMKgIGdudGRldl9wdXRfbWFwKE5VTEwsIG1hcCk7Cj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0 dXJuIEVSUl9QVFIoLUVOT01FTSk7Cj4+PiArwqDCoMKgIH0KPj4+ICvCoMKgwqAgcmV0dXJuIG1h cDsKPj4+IMKgIH0KPj4gV2hlbiBhbmQgaG93IHdvdWxkIHRoaXMgYWxsb2NhdGlvbiBiZSBmcmVl ZD8gSSBkb24ndCBzZWUgYW55IGlvY3RsIAo+PiBmb3IgZnJlZWluZyB1cAo+PiBzaGFyZWQgcGFn ZXMuCj4gb24geGVuX2RtYWJ1Zi5yZWxlYXNlIGNhbGxiYWNrIHdoaWNoIGlzIHJlZmNvdW50ZWQK Pj4+IMKgIMKgIHN0YXRpYyBpbnQgZG1hYnVmX2V4cF9mcm9tX3JlZnMoc3RydWN0IGdudGRldl9w cml2ICpwcml2LCBpbnQgCj4+PiBmbGFncywKPj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgaW50IGNvdW50LCB1MzIgZG9taWQsIHUzMiAqcmVmcywgdTMyICpmZCkKPj4+IMKg IHsKPj4+ICvCoMKgwqAgc3RydWN0IGdyYW50X21hcCAqbWFwOwo+Pj4gK8KgwqDCoCBpbnQgaSwg cmV0Owo+Pj4gKwo+Pj4gwqDCoMKgwqDCoCAqZmQgPSAtMTsKPj4+IC3CoMKgwqAgcmV0dXJuIC1F SU5WQUw7Cj4+PiArCj4+PiArwqDCoMKgIGlmICh1c2VfcHRlbW9kKSB7Cj4+PiArwqDCoMKgwqDC oMKgwqAgcHJfZXJyKCJDYW5ub3QgcHJvdmlkZSBkbWEtYnVmOiB1c2VfcHRlbW9kZSAlZFxuIiwK Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVzZV9wdGVtb2QpOwo+Pj4gK8KgwqDC oMKgwqDCoMKgIHJldHVybiAtRUlOVkFMOwo+Pj4gK8KgwqDCoCB9Cj4+PiArCj4+PiArwqDCoMKg IG1hcCA9IGRtYWJ1Zl9leHBfYWxsb2NfYmFja2luZ19zdG9yYWdlKHByaXYsIGZsYWdzLCBjb3Vu dCk7Cj4+PiArwqDCoMKgIGlmIChJU19FUlIobWFwKSkKPj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1 cm4gUFRSX0VSUihtYXApOwo+Pj4gKwo+Pj4gK8KgwqDCoCBmb3IgKGkgPSAwOyBpIDwgY291bnQ7 IGkrKykgewo+Pj4gK8KgwqDCoMKgwqDCoMKgIG1hcC0+Z3JhbnRzW2ldLmRvbWlkID0gZG9taWQ7 Cj4+PiArwqDCoMKgwqDCoMKgwqAgbWFwLT5ncmFudHNbaV0ucmVmID0gcmVmc1tpXTsKPj4+ICvC oMKgwqAgfQo+Pj4gKwo+Pj4gK8KgwqDCoCBtdXRleF9sb2NrKCZwcml2LT5sb2NrKTsKPj4+ICvC oMKgwqAgZ250ZGV2X2FkZF9tYXAocHJpdiwgbWFwKTsKPj4+ICvCoMKgwqAgbXV0ZXhfdW5sb2Nr KCZwcml2LT5sb2NrKTsKPj4+ICsKPj4+ICvCoMKgwqAgbWFwLT5mbGFncyB8PSBHTlRNQVBfaG9z dF9tYXA7Cj4+PiArI2lmIGRlZmluZWQoQ09ORklHX1g4NikKPj4+ICvCoMKgwqAgbWFwLT5mbGFn cyB8PSBHTlRNQVBfZGV2aWNlX21hcDsKPj4+ICsjZW5kaWYKPj4+ICsKPj4+ICvCoMKgwqAgcmV0 ID0gbWFwX2dyYW50X3BhZ2VzKG1hcCk7Cj4+PiArwqDCoMKgIGlmIChyZXQgPCAwKQo+Pj4gK8Kg wqDCoMKgwqDCoMKgIGdvdG8gb3V0Owo+Pj4gKwo+Pj4gK8KgwqDCoCByZXQgPSBkbWFidWZfZXhw b3J0KHByaXYsIG1hcCwgZmQpOwo+Pj4gK8KgwqDCoCBpZiAocmV0IDwgMCkKPj4+ICvCoMKgwqDC oMKgwqDCoCBnb3RvIG91dDsKPj4+ICsKPj4+ICvCoMKgwqAgcmV0dXJuIDA7Cj4+PiArCj4+PiAr b3V0Ogo+Pj4gK8KgwqDCoCBnbnRkZXZfcmVtb3ZlX21hcChwcml2LCBtYXApOwo+Pj4gK8KgwqDC oCByZXR1cm4gcmV0Owo+Pj4gwqAgfQo+Pj4gwqAgwqAgLyogCj4+PiAtLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KPj4+ IC0tIAo+Pj4gMi4xNy4wCj4+Pgo+CgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KWGVuLWRldmVsIG1haWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVu cHJvamVjdC5vcmcKaHR0cHM6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9tYWlsbWFuL2xpc3RpbmZv L3hlbi1kZXZlbA==