From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?Q?Christian_K=c3=b6nig?= Subject: Re: [PATCH 6/8] drm/amdgpu: meld together VM fragment and huge page handling Date: Thu, 8 Nov 2018 17:50:31 +0100 Message-ID: References: <20180912085445.3245-1-christian.koenig@amd.com> <20180912085445.3245-6-christian.koenig@amd.com> Reply-To: christian.koenig-5C7GfCeVMHo@public.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: Content-Language: en-US List-Id: Discussion list for AMD gfx List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: amd-gfx-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "amd-gfx" To: Samuel Pitoiset , amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org SGkgU2FtdWVsLAoKeWVhaCwgdGhhdCBpcyBhIGtub3duIGlzc3VlIGFuZCBJIHdhcyBhbHJlYWR5 IGxvb2tpbmcgaW50byB0aGF0IGFsbCBkYXkgCnRvZGF5LiBQcm9ibGVtIGlzIHRoYXQgSSBjYW4n dCByZXByb2R1Y2UgaXQgcmVsaWFibGUuCgpEbyB5b3UgaGF2ZSBhbnkgaGludCBob3cgdG8gdHJp Z2dlciB0aGF0PyBFLmcuIG1lbW9yeSBleGhhdXN0aW9uIG1heWJlPwoKVGhhbmtzLApDaHJpc3Rp YW4uCgpBbSAwOC4xMS4xOCB1bSAxNzoxNyBzY2hyaWViIFNhbXVlbCBQaXRvaXNldDoKPiBIaSwK Pgo+IFRoaXMgY2hhbmdlIGludHJvZHVjZXMgR1BVIGhhbmdzIHdpdGggRjEgMjAxNyBhbmQgUmlz ZSBvZiBUb21iIFJhaWRlciAKPiBvbiBSQURWL0dGWDkuIEkgYmlzZWN0ZWQgdGhlIGlzc3VlLgo+ Cj4gQ2FuIHlvdSBoYXZlIGEgbG9vaz8KPgo+IFRoYW5rcyEKPgo+IE9uIDkvMTIvMTggMTA6NTQg QU0sIENocmlzdGlhbiBLw7ZuaWcgd3JvdGU6Cj4+IFRoaXMgb3B0aW1pemVzIHRoZSBnZW5lcmF0 aW5nIG9mIFBURXMgYnkgd2Fsa2luZyB0aGUgaGllcmFyY2h5IG9ubHkgb25jZQo+PiBmb3IgYSBy YW5nZSBhbmQgbWFraW5nIGNoYW5nZXMgYXMgbmVjZXNzYXJ5Lgo+Pgo+PiBJdCBhbGxvd3MgZm9y IGJvdGggaHVnZSAoMk1CKSBhcyB3ZWxsIGdpYW50ICgxR0IpIHBhZ2VzIHRvIGJlIHVzZWQgb24K Pj4gVmVnYSBhbmQgUmF2ZW4uCj4+Cj4+IFNpZ25lZC1vZmYtYnk6IENocmlzdGlhbiBLw7ZuaWcg PGNocmlzdGlhbi5rb2VuaWdAYW1kLmNvbT4KPj4gUmV2aWV3ZWQtYnk6IEZlbGl4IEt1ZWhsaW5n IDxGZWxpeC5LdWVobGluZ0BhbWQuY29tPgo+PiBBY2tlZC1ieTogSnVud2VpIFpoYW5nIDxKZXJy eS5aaGFuZ0BhbWQuY29tPgo+PiAtLS0KPj4gwqAgZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUv YW1kZ3B1X3ZtLmMgfCAyNjcgCj4+ICsrKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLQo+ PiDCoCAxIGZpbGUgY2hhbmdlZCwgMTQ3IGluc2VydGlvbnMoKyksIDEyMCBkZWxldGlvbnMoLSkK Pj4KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV92bS5j IAo+PiBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV92bS5jCj4+IGluZGV4IDc0 N2I2ZmY2ZmVhNy4uMzI4MzI1MzI0YTFkIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0v YW1kL2FtZGdwdS9hbWRncHVfdm0uYwo+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdw dS9hbWRncHVfdm0uYwo+PiBAQCAtMTQ4OCw0NiArMTQ4OCw3NiBAQCBpbnQgYW1kZ3B1X3ZtX3Vw ZGF0ZV9kaXJlY3RvcmllcyhzdHJ1Y3QgCj4+IGFtZGdwdV9kZXZpY2UgKmFkZXYsCj4+IMKgIH0K Pj4gwqAgwqAgLyoqCj4+IC0gKiBhbWRncHVfdm1faGFuZGxlX2h1Z2VfcGFnZXMgLSBoYW5kbGUg dXBkYXRpbmcgdGhlIFBEIHdpdGggaHVnZSBwYWdlcwo+PiArICogYW1kZ3B1X3ZtX3VwZGF0ZV9o dWdlIC0gZmlndXJlIG91dCBwYXJhbWV0ZXJzIGZvciBQVEUgdXBkYXRlcwo+PiDCoMKgICoKPj4g LSAqIEBwOiBzZWUgYW1kZ3B1X3B0ZV91cGRhdGVfcGFyYW1zIGRlZmluaXRpb24KPj4gLSAqIEBl bnRyeTogdm1fcHQgZW50cnkgdG8gY2hlY2sKPj4gLSAqIEBwYXJlbnQ6IHBhcmVudCBlbnRyeQo+ PiAtICogQG5wdGVzOiBudW1iZXIgb2YgUFRFcyB1cGRhdGVkIHdpdGggdGhpcyBvcGVyYXRpb24K Pj4gLSAqIEBkc3Q6IGRlc3RpbmF0aW9uIGFkZHJlc3Mgd2hlcmUgdGhlIFBURXMgc2hvdWxkIHBv aW50IHRvCj4+IC0gKiBAZmxhZ3M6IGFjY2VzcyBmbGFncyBmcm8gdGhlIFBURXMKPj4gLSAqCj4+ IC0gKiBDaGVjayBpZiB3ZSBjYW4gdXBkYXRlIHRoZSBQRCB3aXRoIGEgaHVnZSBwYWdlLgo+PiAr ICogTWFrZSBzdXJlIHRvIHNldCB0aGUgcmlnaHQgZmxhZ3MgZm9yIHRoZSBQVEVzIGF0IHRoZSBk ZXNpcmVkIGxldmVsLgo+PiDCoMKgICovCj4+IC1zdGF0aWMgdm9pZCBhbWRncHVfdm1faGFuZGxl X2h1Z2VfcGFnZXMoc3RydWN0IAo+PiBhbWRncHVfcHRlX3VwZGF0ZV9wYXJhbXMgKnAsCj4+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3QgYW1kZ3B1X3ZtX3B0 ICplbnRyeSwKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0cnVj dCBhbWRncHVfdm1fcHQgKnBhcmVudCwKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHVuc2lnbmVkIG5wdGVzLCB1aW50NjRfdCBkc3QsCj4+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1aW50NjRfdCBmbGFncykKPj4gLXsKPj4gLcKgwqDC oCB1aW50NjRfdCBwZGU7Cj4+ICtzdGF0aWMgdm9pZCBhbWRncHVfdm1fdXBkYXRlX2h1Z2Uoc3Ry dWN0IGFtZGdwdV9wdGVfdXBkYXRlX3BhcmFtcyAKPj4gKnBhcmFtcywKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IGFtZGdwdV9ibyAqYm8sIHVuc2lnbmVkIGxl dmVsLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1aW50NjRfdCBwZSwg dWludDY0X3QgYWRkciwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5z aWduZWQgY291bnQsIHVpbnQzMl90IGluY3IsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHVpbnQ2NF90IGZsYWdzKQo+PiDCoCAtwqDCoMKgIC8qIEluIHRoZSBjYXNlIG9m IGEgbWl4ZWQgUFQgdGhlIFBERSBtdXN0IHBvaW50IHRvIGl0Ki8KPj4gLcKgwqDCoCBpZiAocC0+ YWRldi0+YXNpY190eXBlID49IENISVBfVkVHQTEwICYmICFwLT5zcmMgJiYKPj4gLcKgwqDCoMKg wqDCoMKgIG5wdGVzID09IEFNREdQVV9WTV9QVEVfQ09VTlQocC0+YWRldikpIHsKPj4gLcKgwqDC oMKgwqDCoMKgIC8qIFNldCB0aGUgaHVnZSBwYWdlIGZsYWcgdG8gc3RvcCBzY2FubmluZyBhdCB0 aGlzIFBERSAqLwo+PiArewo+PiArwqDCoMKgIGlmIChsZXZlbCAhPSBBTURHUFVfVk1fUFRCKSB7 Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBmbGFncyB8PSBBTURHUFVfUERFX1BURTsKPj4gK8KgwqDC oMKgwqDCoMKgIGFtZGdwdV9nbWNfZ2V0X3ZtX3BkZShwYXJhbXMtPmFkZXYsIGxldmVsLCAmYWRk ciwgJmZsYWdzKTsKPj4gwqDCoMKgwqDCoCB9Cj4+IMKgIC3CoMKgwqAgaWYgKCEoZmxhZ3MgJiBB TURHUFVfUERFX1BURSkpIHsKPj4gLcKgwqDCoMKgwqDCoMKgIGlmIChlbnRyeS0+aHVnZSkgewo+ PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAvKiBBZGQgdGhlIGVudHJ5IHRvIHRoZSByZWxvY2F0 ZWQgbGlzdCB0byB1cGRhdGUgaXQuICovCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVudHJ5 LT5odWdlID0gZmFsc2U7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGFtZGdwdV92bV9ib19y ZWxvY2F0ZWQoJmVudHJ5LT5iYXNlKTsKPj4gLcKgwqDCoMKgwqDCoMKgIH0KPj4gK8KgwqDCoCBh bWRncHVfdm1fdXBkYXRlX2Z1bmMocGFyYW1zLCBibywgcGUsIGFkZHIsIGNvdW50LCBpbmNyLCBm bGFncyk7Cj4+ICt9Cj4+ICsKPj4gKy8qKgo+PiArICogYW1kZ3B1X3ZtX2ZyYWdtZW50IC0gZ2V0 IGZyYWdtZW50IGZvciBQVEVzCj4+ICsgKgo+PiArICogQHBhcmFtczogc2VlIGFtZGdwdV9wdGVf dXBkYXRlX3BhcmFtcyBkZWZpbml0aW9uCj4+ICsgKiBAc3RhcnQ6IGZpcnN0IFBURSB0byBoYW5k bGUKPj4gKyAqIEBlbmQ6IGxhc3QgUFRFIHRvIGhhbmRsZQo+PiArICogQGZsYWdzOiBodyBtYXBw aW5nIGZsYWdzCj4+ICsgKiBAZnJhZzogcmVzdWx0aW5nIGZyYWdtZW50IHNpemUKPj4gKyAqIEBm cmFnX2VuZDogZW5kIG9mIHRoaXMgZnJhZ21lbnQKPj4gKyAqCj4+ICsgKiBSZXR1cm5zIHRoZSBm aXJzdCBwb3NzaWJsZSBmcmFnbWVudCBmb3IgdGhlIHN0YXJ0IGFuZCBlbmQgYWRkcmVzcy4KPj4g KyAqLwo+PiArc3RhdGljIHZvaWQgYW1kZ3B1X3ZtX2ZyYWdtZW50KHN0cnVjdCBhbWRncHVfcHRl X3VwZGF0ZV9wYXJhbXMgKnBhcmFtcywKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCB1aW50NjRfdCBzdGFydCwgdWludDY0X3QgZW5kLCB1aW50NjRfdCBmbGFncywKPj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBpbnQgKmZyYWcs IHVpbnQ2NF90ICpmcmFnX2VuZCkKPj4gK3sKPj4gK8KgwqDCoCAvKioKPj4gK8KgwqDCoMKgICog VGhlIE1DIEwxIFRMQiBzdXBwb3J0cyB2YXJpYWJsZSBzaXplZCBwYWdlcywgYmFzZWQgb24gYSBm cmFnbWVudAo+PiArwqDCoMKgwqAgKiBmaWVsZCBpbiB0aGUgUFRFLiBXaGVuIHRoaXMgZmllbGQg aXMgc2V0IHRvIGEgbm9uLXplcm8gdmFsdWUsIAo+PiBwYWdlCj4+ICvCoMKgwqDCoCAqIGdyYW51 bGFyaXR5IGlzIGluY3JlYXNlZCBmcm9tIDRLQiB0byAoMSA8PCAoMTIgKyBmcmFnKSkuIFRoZSBQ VEUKPj4gK8KgwqDCoMKgICogZmxhZ3MgYXJlIGNvbnNpZGVyZWQgdmFsaWQgZm9yIGFsbCBQVEVz IHdpdGhpbiB0aGUgZnJhZ21lbnQgCj4+IHJhbmdlCj4+ICvCoMKgwqDCoCAqIGFuZCBjb3JyZXNw b25kaW5nIG1hcHBpbmdzIGFyZSBhc3N1bWVkIHRvIGJlIHBoeXNpY2FsbHkgCj4+IGNvbnRpZ3Vv dXMuCj4+ICvCoMKgwqDCoCAqCj4+ICvCoMKgwqDCoCAqIFRoZSBMMSBUTEIgY2FuIHN0b3JlIGEg c2luZ2xlIFBURSBmb3IgdGhlIHdob2xlIGZyYWdtZW50LAo+PiArwqDCoMKgwqAgKiBzaWduaWZp Y2FudGx5IGluY3JlYXNpbmcgdGhlIHNwYWNlIGF2YWlsYWJsZSBmb3IgdHJhbnNsYXRpb24KPj4g K8KgwqDCoMKgICogY2FjaGluZy4gVGhpcyBsZWFkcyB0byBsYXJnZSBpbXByb3ZlbWVudHMgaW4g dGhyb3VnaHB1dCB3aGVuIHRoZQo+PiArwqDCoMKgwqAgKiBUTEIgaXMgdW5kZXIgcHJlc3N1cmUu Cj4+ICvCoMKgwqDCoCAqCj4+ICvCoMKgwqDCoCAqIFRoZSBMMiBUTEIgZGlzdHJpYnV0ZXMgc21h bGwgYW5kIGxhcmdlIGZyYWdtZW50cyBpbnRvIHR3bwo+PiArwqDCoMKgwqAgKiBhc3ltbWV0cmlj IHBhcnRpdGlvbnMuIFRoZSBsYXJnZSBmcmFnbWVudCBjYWNoZSBpcyBzaWduaWZpY2FudGx5Cj4+ ICvCoMKgwqDCoCAqIGxhcmdlci4gVGh1cywgd2UgdHJ5IHRvIHVzZSBsYXJnZSBmcmFnbWVudHMg d2hlcmV2ZXIgcG9zc2libGUuCj4+ICvCoMKgwqDCoCAqIFVzZXJzcGFjZSBjYW4gc3VwcG9ydCB0 aGlzIGJ5IGFsaWduaW5nIHZpcnR1YWwgYmFzZSBhZGRyZXNzIGFuZAo+PiArwqDCoMKgwqAgKiBh bGxvY2F0aW9uIHNpemUgdG8gdGhlIGZyYWdtZW50IHNpemUuCj4+ICvCoMKgwqDCoCAqLwo+PiAr wqDCoMKgIHVuc2lnbmVkIG1heF9mcmFnID0gcGFyYW1zLT5hZGV2LT52bV9tYW5hZ2VyLmZyYWdt ZW50X3NpemU7Cj4+ICsKPj4gK8KgwqDCoCAvKiBzeXN0ZW0gcGFnZXMgYXJlIG5vbiBjb250aW51 b3VzbHkgKi8KPj4gK8KgwqDCoCBpZiAocGFyYW1zLT5zcmMgfHwgIShmbGFncyAmIEFNREdQVV9Q VEVfVkFMSUQpKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCAqZnJhZyA9IDA7Cj4+ICvCoMKgwqDCoMKg wqDCoCAqZnJhZ19lbmQgPSBlbmQ7Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm47Cj4+IMKg wqDCoMKgwqAgfQo+PiDCoCAtwqDCoMKgIGVudHJ5LT5odWdlID0gdHJ1ZTsKPj4gLcKgwqDCoCBh bWRncHVfZ21jX2dldF92bV9wZGUocC0+YWRldiwgQU1ER1BVX1ZNX1BEQjAsICZkc3QsICZmbGFn cyk7Cj4+IC0KPj4gLcKgwqDCoCBwZGUgPSAoZW50cnkgLSBwYXJlbnQtPmVudHJpZXMpICogODsK Pj4gLcKgwqDCoCBhbWRncHVfdm1fdXBkYXRlX2Z1bmMocCwgcGFyZW50LT5iYXNlLmJvLCBwZGUs IGRzdCwgMSwgMCwgZmxhZ3MpOwo+PiArwqDCoMKgIC8qIFRoaXMgaW50ZW50aW9uYWxseSB3cmFw cyBhcm91bmQgaWYgbm8gYml0IGlzIHNldCAqLwo+PiArwqDCoMKgICpmcmFnID0gbWluKCh1bnNp Z25lZClmZnMoc3RhcnQpIC0gMSwgKHVuc2lnbmVkKWZsczY0KGVuZCAtIAo+PiBzdGFydCkgLSAx KTsKPj4gK8KgwqDCoCBpZiAoKmZyYWcgPj0gbWF4X2ZyYWcpIHsKPj4gK8KgwqDCoMKgwqDCoMKg ICpmcmFnID0gbWF4X2ZyYWc7Cj4+ICvCoMKgwqDCoMKgwqDCoCAqZnJhZ19lbmQgPSBlbmQgJiB+ KCgxVUxMIDw8IG1heF9mcmFnKSAtIDEpOwo+PiArwqDCoMKgIH0gZWxzZSB7Cj4+ICvCoMKgwqDC oMKgwqDCoCAqZnJhZ19lbmQgPSBzdGFydCArICgxIDw8ICpmcmFnKTsKPj4gK8KgwqDCoCB9Cj4+ IMKgIH0KPj4gwqAgwqAgLyoqCj4+IEBAIC0xNTQ1LDEwOCArMTU3NSwxMDUgQEAgc3RhdGljIHZv aWQgCj4+IGFtZGdwdV92bV9oYW5kbGVfaHVnZV9wYWdlcyhzdHJ1Y3QgYW1kZ3B1X3B0ZV91cGRh dGVfcGFyYW1zICpwLAo+PiDCoMKgICogMCBmb3Igc3VjY2VzcywgLUVJTlZBTCBmb3IgZmFpbHVy ZS4KPj4gwqDCoCAqLwo+PiDCoCBzdGF0aWMgaW50IGFtZGdwdV92bV91cGRhdGVfcHRlcyhzdHJ1 Y3QgYW1kZ3B1X3B0ZV91cGRhdGVfcGFyYW1zIAo+PiAqcGFyYW1zLAo+PiAtwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1aW50NjRfdCBzdGFydCwgdWludDY0X3QgZW5kLAo+PiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1aW50NjRfdCBkc3QsIHVpbnQ2NF90 IGZsYWdzKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdWludDY0X3Qgc3Rh cnQsIHVpbnQ2NF90IGVuZCwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVp bnQ2NF90IGRzdCwgdWludDY0X3QgZmxhZ3MpCj4+IMKgIHsKPj4gwqDCoMKgwqDCoCBzdHJ1Y3Qg YW1kZ3B1X2RldmljZSAqYWRldiA9IHBhcmFtcy0+YWRldjsKPj4gLcKgwqDCoCBjb25zdCB1aW50 NjRfdCBtYXNrID0gQU1ER1BVX1ZNX1BURV9DT1VOVChhZGV2KSAtIDE7Cj4+IMKgwqDCoMKgwqAg c3RydWN0IGFtZGdwdV92bV9wdF9jdXJzb3IgY3Vyc29yOwo+PiArwqDCoMKgIHVpbnQ2NF90IGZy YWdfc3RhcnQgPSBzdGFydCwgZnJhZ19lbmQ7Cj4+ICvCoMKgwqAgdW5zaWduZWQgaW50IGZyYWc7 Cj4+IMKgIC3CoMKgwqAgLyogd2FsayBvdmVyIHRoZSBhZGRyZXNzIHNwYWNlIGFuZCB1cGRhdGUg dGhlIHBhZ2UgdGFibGVzICovCj4+IC3CoMKgwqAgZm9yX2VhY2hfYW1kZ3B1X3ZtX3B0X2xlYWYo YWRldiwgcGFyYW1zLT52bSwgc3RhcnQsIGVuZCAtIDEsIAo+PiBjdXJzb3IpIHsKPj4gK8KgwqDC oCAvKiBmaWd1cmUgb3V0IHRoZSBpbml0aWFsIGZyYWdtZW50ICovCj4+ICvCoMKgwqAgYW1kZ3B1 X3ZtX2ZyYWdtZW50KHBhcmFtcywgZnJhZ19zdGFydCwgZW5kLCBmbGFncywgJmZyYWcsIAo+PiAm ZnJhZ19lbmQpOwo+PiArCj4+ICvCoMKgwqAgLyogd2FsayBvdmVyIHRoZSBhZGRyZXNzIHNwYWNl IGFuZCB1cGRhdGUgdGhlIFBUcyAqLwo+PiArwqDCoMKgIGFtZGdwdV92bV9wdF9zdGFydChhZGV2 LCBwYXJhbXMtPnZtLCBzdGFydCwgJmN1cnNvcik7Cj4+ICvCoMKgwqAgd2hpbGUgKGN1cnNvci5w Zm4gPCBlbmQpIHsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIHN0cnVjdCBhbWRncHVfYm8gKnB0ID0g Y3Vyc29yLmVudHJ5LT5iYXNlLmJvOwo+PiAtwqDCoMKgwqDCoMKgwqAgdWludDY0X3QgcGVfc3Rh cnQ7Cj4+IC3CoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBucHRlczsKPj4gK8KgwqDCoMKgwqDCoMKg IHVuc2lnbmVkIHNoaWZ0LCBwYXJlbnRfc2hpZnQsIG51bV9lbnRyaWVzOwo+PiArwqDCoMKgwqDC oMKgwqAgdWludDY0X3QgaW5jciwgZW50cnlfZW5kLCBwZV9zdGFydDsKPj4gwqAgLcKgwqDCoMKg wqDCoMKgIGlmICghcHQgfHwgY3Vyc29yLmxldmVsICE9IEFNREdQVV9WTV9QVEIpCj4+ICvCoMKg wqDCoMKgwqDCoCBpZiAoIXB0KQo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4g LUVOT0VOVDsKPj4gwqAgLcKgwqDCoMKgwqDCoMKgIGlmICgoY3Vyc29yLnBmbiAmIH5tYXNrKSA9 PSAoZW5kICYgfm1hc2spKQo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBucHRlcyA9IGVuZCAt IGN1cnNvci5wZm47Cj4+IC3CoMKgwqDCoMKgwqDCoCBlbHNlCj4+IC3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgIG5wdGVzID0gQU1ER1BVX1ZNX1BURV9DT1VOVChhZGV2KSAtIChjdXJzb3IucGZuICYg bWFzayk7Cj4+IC0KPj4gLcKgwqDCoMKgwqDCoMKgIGFtZGdwdV92bV9oYW5kbGVfaHVnZV9wYWdl cyhwYXJhbXMsIGN1cnNvci5lbnRyeSwgCj4+IGN1cnNvci5wYXJlbnQsCj4+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG5wdGVzLCBkc3QsIGZsYWdzKTsK Pj4gLcKgwqDCoMKgwqDCoMKgIC8qIFdlIGRvbid0IG5lZWQgdG8gdXBkYXRlIFBURXMgZm9yIGh1 Z2UgcGFnZXMgKi8KPj4gLcKgwqDCoMKgwqDCoMKgIGlmIChjdXJzb3IuZW50cnktPmh1Z2UpIHsK Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZHN0ICs9IG5wdGVzICogQU1ER1BVX0dQVV9QQUdF X1NJWkU7Cj4+ICvCoMKgwqDCoMKgwqDCoCAvKiBUaGUgcm9vdCBsZXZlbCBjYW4ndCBiZSBhIGh1 Z2UgcGFnZSAqLwo+PiArwqDCoMKgwqDCoMKgwqAgaWYgKGN1cnNvci5sZXZlbCA9PSBhZGV2LT52 bV9tYW5hZ2VyLnJvb3RfbGV2ZWwpIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKCFh bWRncHVfdm1fcHRfZGVzY2VuZGFudChhZGV2LCAmY3Vyc29yKSkKPj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVOT0VOVDsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgY29udGludWU7Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4+IMKgIC3CoMKgwqDCoMKg wqDCoCBwZV9zdGFydCA9IChjdXJzb3IucGZuICYgbWFzaykgKiA4Owo+PiAtwqDCoMKgwqDCoMKg wqAgYW1kZ3B1X3ZtX3VwZGF0ZV9mdW5jKHBhcmFtcywgcHQsIHBlX3N0YXJ0LCBkc3QsIG5wdGVz LAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEFNREdQVV9H UFVfUEFHRV9TSVpFLCBmbGFncyk7Cj4+IC3CoMKgwqDCoMKgwqDCoCBkc3QgKz0gbnB0ZXMgKiBB TURHUFVfR1BVX1BBR0VfU0laRTsKPj4gLcKgwqDCoCB9Cj4+IC0KPj4gLcKgwqDCoCByZXR1cm4g MDsKPj4gLX0KPj4gK8KgwqDCoMKgwqDCoMKgIC8qIEZpcnN0IGNoZWNrIGlmIHRoZSBlbnRyeSBp cyBhbHJlYWR5IGhhbmRsZWQgKi8KPj4gK8KgwqDCoMKgwqDCoMKgIGlmIChjdXJzb3IucGZuIDwg ZnJhZ19zdGFydCkgewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjdXJzb3IuZW50cnktPmh1 Z2UgPSB0cnVlOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBhbWRncHVfdm1fcHRfbmV4dChh ZGV2LCAmY3Vyc29yKTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29udGludWU7Cj4+ICvC oMKgwqDCoMKgwqDCoCB9Cj4+IMKgIC0vKgo+PiAtICogYW1kZ3B1X3ZtX2ZyYWdfcHRlcyAtIGFk ZCBmcmFnbWVudCBpbmZvcm1hdGlvbiB0byBQVEVzCj4+IC0gKgo+PiAtICogQHBhcmFtczogc2Vl IGFtZGdwdV9wdGVfdXBkYXRlX3BhcmFtcyBkZWZpbml0aW9uCj4+IC0gKiBAdm06IHJlcXVlc3Rl ZCB2bQo+PiAtICogQHN0YXJ0OiBmaXJzdCBQVEUgdG8gaGFuZGxlCj4+IC0gKiBAZW5kOiBsYXN0 IFBURSB0byBoYW5kbGUKPj4gLSAqIEBkc3Q6IGFkZHIgdGhvc2UgUFRFcyBzaG91bGQgcG9pbnQg dG8KPj4gLSAqIEBmbGFnczogaHcgbWFwcGluZyBmbGFncwo+PiAtICoKPj4gLSAqIFJldHVybnM6 Cj4+IC0gKiAwIGZvciBzdWNjZXNzLCAtRUlOVkFMIGZvciBmYWlsdXJlLgo+PiAtICovCj4+IC1z dGF0aWMgaW50IGFtZGdwdV92bV9mcmFnX3B0ZXMoc3RydWN0IGFtZGdwdV9wdGVfdXBkYXRlX3Bh cmFtc8KgwqDCoCAKPj4gKnBhcmFtcywKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCB1aW50NjRfdCBzdGFydCwgdWludDY0X3QgZW5kLAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHVpbnQ2NF90IGRzdCwgdWludDY0X3QgZmxhZ3MpCj4+IC17Cj4+IC3CoMKgwqAg LyoqCj4+IC3CoMKgwqDCoCAqIFRoZSBNQyBMMSBUTEIgc3VwcG9ydHMgdmFyaWFibGUgc2l6ZWQg cGFnZXMsIGJhc2VkIG9uIGEgZnJhZ21lbnQKPj4gLcKgwqDCoMKgICogZmllbGQgaW4gdGhlIFBU RS4gV2hlbiB0aGlzIGZpZWxkIGlzIHNldCB0byBhIG5vbi16ZXJvIHZhbHVlLCAKPj4gcGFnZQo+ PiAtwqDCoMKgwqAgKiBncmFudWxhcml0eSBpcyBpbmNyZWFzZWQgZnJvbSA0S0IgdG8gKDEgPDwg KDEyICsgZnJhZykpLiBUaGUgUFRFCj4+IC3CoMKgwqDCoCAqIGZsYWdzIGFyZSBjb25zaWRlcmVk IHZhbGlkIGZvciBhbGwgUFRFcyB3aXRoaW4gdGhlIGZyYWdtZW50IAo+PiByYW5nZQo+PiAtwqDC oMKgwqAgKiBhbmQgY29ycmVzcG9uZGluZyBtYXBwaW5ncyBhcmUgYXNzdW1lZCB0byBiZSBwaHlz aWNhbGx5IAo+PiBjb250aWd1b3VzLgo+PiAtwqDCoMKgwqAgKgo+PiAtwqDCoMKgwqAgKiBUaGUg TDEgVExCIGNhbiBzdG9yZSBhIHNpbmdsZSBQVEUgZm9yIHRoZSB3aG9sZSBmcmFnbWVudCwKPj4g LcKgwqDCoMKgICogc2lnbmlmaWNhbnRseSBpbmNyZWFzaW5nIHRoZSBzcGFjZSBhdmFpbGFibGUg Zm9yIHRyYW5zbGF0aW9uCj4+IC3CoMKgwqDCoCAqIGNhY2hpbmcuIFRoaXMgbGVhZHMgdG8gbGFy Z2UgaW1wcm92ZW1lbnRzIGluIHRocm91Z2hwdXQgd2hlbiB0aGUKPj4gLcKgwqDCoMKgICogVExC IGlzIHVuZGVyIHByZXNzdXJlLgo+PiAtwqDCoMKgwqAgKgo+PiAtwqDCoMKgwqAgKiBUaGUgTDIg VExCIGRpc3RyaWJ1dGVzIHNtYWxsIGFuZCBsYXJnZSBmcmFnbWVudHMgaW50byB0d28KPj4gLcKg wqDCoMKgICogYXN5bW1ldHJpYyBwYXJ0aXRpb25zLiBUaGUgbGFyZ2UgZnJhZ21lbnQgY2FjaGUg aXMgc2lnbmlmaWNhbnRseQo+PiAtwqDCoMKgwqAgKiBsYXJnZXIuIFRodXMsIHdlIHRyeSB0byB1 c2UgbGFyZ2UgZnJhZ21lbnRzIHdoZXJldmVyIHBvc3NpYmxlLgo+PiAtwqDCoMKgwqAgKiBVc2Vy c3BhY2UgY2FuIHN1cHBvcnQgdGhpcyBieSBhbGlnbmluZyB2aXJ0dWFsIGJhc2UgYWRkcmVzcyBh bmQKPj4gLcKgwqDCoMKgICogYWxsb2NhdGlvbiBzaXplIHRvIHRoZSBmcmFnbWVudCBzaXplLgo+ PiAtwqDCoMKgwqAgKi8KPj4gLcKgwqDCoCB1bnNpZ25lZCBtYXhfZnJhZyA9IHBhcmFtcy0+YWRl di0+dm1fbWFuYWdlci5mcmFnbWVudF9zaXplOwo+PiAtwqDCoMKgIGludCByOwo+PiArwqDCoMKg wqDCoMKgwqAgLyogSWYgaXQgaXNuJ3QgYWxyZWFkeSBoYW5kbGVkIGl0IGNhbid0IGJlIGEgaHVn ZSBwYWdlICovCj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAoY3Vyc29yLmVudHJ5LT5odWdlKSB7Cj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC8qIEFkZCB0aGUgZW50cnkgdG8gdGhlIHJlbG9jYXRl ZCBsaXN0IHRvIHVwZGF0ZSBpdC4gKi8KPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY3Vyc29y LmVudHJ5LT5odWdlID0gZmFsc2U7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGFtZGdwdV92 bV9ib19yZWxvY2F0ZWQoJmN1cnNvci5lbnRyeS0+YmFzZSk7Cj4+ICvCoMKgwqDCoMKgwqDCoCB9 Cj4+IMKgIC3CoMKgwqAgLyogc3lzdGVtIHBhZ2VzIGFyZSBub24gY29udGludW91c2x5ICovCj4+ IC3CoMKgwqAgaWYgKHBhcmFtcy0+c3JjIHx8ICEoZmxhZ3MgJiBBTURHUFVfUFRFX1ZBTElEKSkK Pj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybiBhbWRncHVfdm1fdXBkYXRlX3B0ZXMocGFyYW1zLCBz dGFydCwgZW5kLCBkc3QsIGZsYWdzKTsKPj4gLQo+PiAtwqDCoMKgIHdoaWxlIChzdGFydCAhPSBl bmQpIHsKPj4gLcKgwqDCoMKgwqDCoMKgIHVpbnQ2NF90IGZyYWdfZmxhZ3MsIGZyYWdfZW5kOwo+ PiAtwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgZnJhZzsKPj4gLQo+PiAtwqDCoMKgwqDCoMKgwqAg LyogVGhpcyBpbnRlbnRpb25hbGx5IHdyYXBzIGFyb3VuZCBpZiBubyBiaXQgaXMgc2V0ICovCj4+ IC3CoMKgwqDCoMKgwqDCoCBmcmFnID0gbWluKCh1bnNpZ25lZClmZnMoc3RhcnQpIC0gMSwKPj4g LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHVuc2lnbmVkKWZsczY0KGVuZCAtIHN0YXJ0 KSAtIDEpOwo+PiAtwqDCoMKgwqDCoMKgwqAgaWYgKGZyYWcgPj0gbWF4X2ZyYWcpIHsKPj4gLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgZnJhZ19mbGFncyA9IEFNREdQVV9QVEVfRlJBRyhtYXhfZnJh Zyk7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZyYWdfZW5kID0gZW5kICYgfigoMVVMTCA8 PCBtYXhfZnJhZykgLSAxKTsKPj4gLcKgwqDCoMKgwqDCoMKgIH0gZWxzZSB7Cj4+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGZyYWdfZmxhZ3MgPSBBTURHUFVfUFRFX0ZSQUcoZnJhZyk7Cj4+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZyYWdfZW5kID0gc3RhcnQgKyAoMSA8PCBmcmFnKTsKPj4g K8KgwqDCoMKgwqDCoMKgIHNoaWZ0ID0gYW1kZ3B1X3ZtX2xldmVsX3NoaWZ0KGFkZXYsIGN1cnNv ci5sZXZlbCk7Cj4+ICvCoMKgwqDCoMKgwqDCoCBwYXJlbnRfc2hpZnQgPSBhbWRncHVfdm1fbGV2 ZWxfc2hpZnQoYWRldiwgY3Vyc29yLmxldmVsIC0gMSk7Cj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAo YWRldi0+YXNpY190eXBlIDwgQ0hJUF9WRUdBMTApIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqAgLyogTm8gaHVnZSBwYWdlIHN1cHBvcnQgYmVmb3JlIEdNQyB2OSAqLwo+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBpZiAoY3Vyc29yLmxldmVsICE9IEFNREdQVV9WTV9QVEIpIHsKPj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoIWFtZGdwdV92bV9wdF9kZXNjZW5kYW50 KGFkZXYsICZjdXJzb3IpKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgcmV0dXJuIC1FTk9FTlQ7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29u dGludWU7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPj4gK8KgwqDCoMKgwqDCoMKgIH0g ZWxzZSBpZiAoZnJhZyA8IHNoaWZ0KSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC8qIFdl IGNhbid0IHVzZSB0aGlzIGxldmVsIHdoZW4gdGhlIGZyYWdtZW50IHNpemUgaXMKPj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCAqIHNtYWxsZXIgdGhhbiB0aGUgYWRkcmVzcyBzaGlmdC4gR28g dG8gdGhlIG5leHQKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIGNoaWxkIGVudHJ5IGFu ZCB0cnkgYWdhaW4uCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKi8KPj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqAgaWYgKCFhbWRncHVfdm1fcHRfZGVzY2VuZGFudChhZGV2LCAmY3Vyc29y KSkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVOT0VOVDsKPj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29udGludWU7Cj4+ICvCoMKgwqDCoMKgwqDCoCB9IGVs c2UgaWYgKGZyYWcgPj0gcGFyZW50X3NoaWZ0KSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IC8qIElmIHRoZSBmcmFnbWVudCBzaXplIGlzIGV2ZW4gbGFyZ2VyIHRoYW4gdGhlIHBhcmVudAo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogc2hpZnQgd2Ugc2hvdWxkIGdvIHVwIG9uZSBs ZXZlbCBhbmQgY2hlY2sgaXQgYWdhaW4uCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKi8K Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKCFhbWRncHVfdm1fcHRfYW5jZXN0b3IoJmN1 cnNvcikpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FTk9FTlQ7 Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnRpbnVlOwo+PiDCoMKgwqDCoMKgwqDCoMKg wqAgfQo+PiDCoCAtwqDCoMKgwqDCoMKgwqAgciA9IGFtZGdwdV92bV91cGRhdGVfcHRlcyhwYXJh bXMsIHN0YXJ0LCBmcmFnX2VuZCwgZHN0LAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGZsYWdzIHwgZnJhZ19mbGFncyk7Cj4+IC3CoMKgwqDCoMKgwqDCoCBp ZiAocikKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHI7Cj4+ICvCoMKgwqDCoMKg wqDCoCAvKiBMb29rcyBnb29kIHNvIGZhciwgY2FsY3VsYXRlIHBhcmFtZXRlcnMgZm9yIHRoZSB1 cGRhdGUgKi8KPj4gK8KgwqDCoMKgwqDCoMKgIGluY3IgPSBBTURHUFVfR1BVX1BBR0VfU0laRSA8 PCBzaGlmdDsKPj4gK8KgwqDCoMKgwqDCoMKgIG51bV9lbnRyaWVzID0gYW1kZ3B1X3ZtX251bV9l bnRyaWVzKGFkZXYsIGN1cnNvci5sZXZlbCk7Cj4+ICvCoMKgwqDCoMKgwqDCoCBwZV9zdGFydCA9 ICgoY3Vyc29yLnBmbiA+PiBzaGlmdCkgJiAobnVtX2VudHJpZXMgLSAxKSkgKiA4Owo+PiArwqDC oMKgwqDCoMKgwqAgZW50cnlfZW5kID0gbnVtX2VudHJpZXMgPDwgc2hpZnQ7Cj4+ICvCoMKgwqDC oMKgwqDCoCBlbnRyeV9lbmQgKz0gY3Vyc29yLnBmbiAmIH4oZW50cnlfZW5kIC0gMSk7Cj4+ICvC oMKgwqDCoMKgwqDCoCBlbnRyeV9lbmQgPSBtaW4oZW50cnlfZW5kLCBlbmQpOwo+PiArCj4+ICvC oMKgwqDCoMKgwqDCoCBkbyB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVpbnQ2NF90IHVw ZF9lbmQgPSBtaW4oZW50cnlfZW5kLCBmcmFnX2VuZCk7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHVuc2lnbmVkIG5wdGVzID0gKHVwZF9lbmQgLSBmcmFnX3N0YXJ0KSA+PiBzaGlmdDsKPj4g Kwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBhbWRncHVfdm1fdXBkYXRlX2h1Z2UocGFyYW1z LCBwdCwgY3Vyc29yLmxldmVsLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgcGVfc3RhcnQsIGRzdCwgbnB0ZXMsIGluY3IsCj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmbGFncyB8IEFNREdQ VV9QVEVfRlJBRyhmcmFnKSk7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGVfc3Rh cnQgKz0gbnB0ZXMgKiA4Owo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBkc3QgKz0gbnB0ZXMg KiBBTURHUFVfR1BVX1BBR0VfU0laRSA8PCBzaGlmdDsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBmcmFnX3N0YXJ0ID0gdXBkX2VuZDsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg aWYgKGZyYWdfc3RhcnQgPj0gZnJhZ19lbmQpIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCAvKiBmaWd1cmUgb3V0IHRoZSBuZXh0IGZyYWdtZW50ICovCj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgYW1kZ3B1X3ZtX2ZyYWdtZW50KHBhcmFtcywgZnJhZ19zdGFy dCwgZW5kLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBmbGFncywgJmZyYWcsICZmcmFnX2VuZCk7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgaWYgKGZyYWcgPCBzaGlmdCkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4+ICvC oMKgwqDCoMKgwqDCoCB9IHdoaWxlIChmcmFnX3N0YXJ0IDwgZW50cnlfZW5kKTsKPj4gwqAgLcKg wqDCoMKgwqDCoMKgIGRzdCArPSAoZnJhZ19lbmQgLSBzdGFydCkgKiBBTURHUFVfR1BVX1BBR0Vf U0laRTsKPj4gLcKgwqDCoMKgwqDCoMKgIHN0YXJ0ID0gZnJhZ19lbmQ7Cj4+ICvCoMKgwqDCoMKg wqDCoCBpZiAoZnJhZyA+PSBzaGlmdCkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYW1kZ3B1 X3ZtX3B0X25leHQoYWRldiwgJmN1cnNvcik7Cj4+IMKgwqDCoMKgwqAgfQo+PiDCoCDCoMKgwqDC oMKgIHJldHVybiAwOwo+PiBAQCAtMTcwOCw4ICsxNzM1LDggQEAgc3RhdGljIGludCBhbWRncHVf dm1fYm9fdXBkYXRlX21hcHBpbmcoc3RydWN0IAo+PiBhbWRncHVfZGV2aWNlICphZGV2LAo+PiDC oCDCoMKgwqDCoMKgwqDCoMKgwqAgcGFyYW1zLmZ1bmMgPSBhbWRncHVfdm1fY3B1X3NldF9wdGVz Owo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgcGFyYW1zLnBhZ2VzX2FkZHIgPSBwYWdlc19hZGRyOwo+ PiAtwqDCoMKgwqDCoMKgwqAgcmV0dXJuIGFtZGdwdV92bV9mcmFnX3B0ZXMoJnBhcmFtcywgc3Rh cnQsIGxhc3QgKyAxLAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgYWRkciwgZmxhZ3MpOwo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIGFtZGdwdV92bV91 cGRhdGVfcHRlcygmcGFyYW1zLCBzdGFydCwgbGFzdCArIDEsCj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYWRkciwgZmxhZ3MpOwo+PiDCoMKgwqDC oMKgIH0KPj4gwqAgwqDCoMKgwqDCoCByaW5nID0gY29udGFpbmVyX29mKHZtLT5lbnRpdHkucnEt PnNjaGVkLCBzdHJ1Y3QgYW1kZ3B1X3JpbmcsIAo+PiBzY2hlZCk7Cj4+IEBAIC0xNzg4LDcgKzE4 MTUsNyBAQCBzdGF0aWMgaW50IGFtZGdwdV92bV9ib191cGRhdGVfbWFwcGluZyhzdHJ1Y3QgCj4+ IGFtZGdwdV9kZXZpY2UgKmFkZXYsCj4+IMKgwqDCoMKgwqAgaWYgKHIpCj4+IMKgwqDCoMKgwqDC oMKgwqDCoCBnb3RvIGVycm9yX2ZyZWU7Cj4+IMKgIC3CoMKgwqAgciA9IGFtZGdwdV92bV9mcmFn X3B0ZXMoJnBhcmFtcywgc3RhcnQsIGxhc3QgKyAxLCBhZGRyLCBmbGFncyk7Cj4+ICvCoMKgwqAg ciA9IGFtZGdwdV92bV91cGRhdGVfcHRlcygmcGFyYW1zLCBzdGFydCwgbGFzdCArIDEsIGFkZHIs IGZsYWdzKTsKPj4gwqDCoMKgwqDCoCBpZiAocikKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8g ZXJyb3JfZnJlZTsKPj4KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCmFtZC1nZnggbWFpbGluZyBsaXN0CmFtZC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3Jn Cmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vYW1kLWdmeAo=