From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Koenig, Christian" Subject: Re: [PATCH 6/8] drm/amdgpu: meld together VM fragment and huge page handling Date: Fri, 9 Nov 2018 12:13:02 +0000 Message-ID: References: <20180912085445.3245-1-christian.koenig@amd.com> <20180912085445.3245-6-christian.koenig@amd.com> <363ce01b-c6f1-21bc-329e-bbb4ec568ba8@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <363ce01b-c6f1-21bc-329e-bbb4ec568ba8-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> Content-Language: en-US Content-ID: 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" , "Liu, Aaron" QWRkaW5nIEFhcm9uIHdobyBpbml0aWFsbHkgcmVwb3J0ZWQgdGhlIHByb2JsZW0gd2l0aCB0aGlz IHBhdGNoIGFuZCANCnN1c3BlbmQvcmVzdW1lLg0KDQpBbSAwOC4xMS4xOCB1bSAyMDozNSBzY2hy aWViIFNhbXVlbCBQaXRvaXNldDoNCj4gT24gMTEvOC8xOCA1OjUwIFBNLCBDaHJpc3RpYW4gS8O2 bmlnIHdyb3RlOg0KPj4gSGkgU2FtdWVsLA0KPj4NCj4+IHllYWgsIHRoYXQgaXMgYSBrbm93biBp c3N1ZSBhbmQgSSB3YXMgYWxyZWFkeSBsb29raW5nIGludG8gdGhhdCBhbGwgDQo+PiBkYXkgdG9k YXkuIFByb2JsZW0gaXMgdGhhdCBJIGNhbid0IHJlcHJvZHVjZSBpdCByZWxpYWJsZS4NCj4+DQo+ PiBEbyB5b3UgaGF2ZSBhbnkgaGludCBob3cgdG8gdHJpZ2dlciB0aGF0PyBFLmcuIG1lbW9yeSBl eGhhdXN0aW9uIG1heWJlPw0KPg0KPiBIaSBDaHJpc3RpYW4sDQo+DQo+IEdvb2QgdG8gaGVhciB0 aGF0IHlvdSBhcmUgYWxyZWFkeSB3b3JraW5nIG9uLg0KPg0KPiBUaGUgR1BVIGhhbmcgd2l0aCBS aXNlIG9mIFRvbWIgUmFpZGVyIGlzIHJlbGlhYmxlIG9uIG15IHNpZGUuIEl0IA0KPiBhbHdheXMg aGFuZ3Mgd2hpbGUgbG9hZGluZyB0aGUgYmVuY2htYXJrLiBJIHVzZSB0aGUgVWx0cmEgSGlnaCBw cmVzZXQuDQo+DQo+IERvIHlvdSBoYXZlIGFjY2VzcyB0byB0aGF0IGdhbWU/IEFzIG1lbnRpb25l ZCwgRjEgMjAxNyBpcyBhbHNvIA0KPiBhZmZlY3RlZCBidXQgSSB1c2VkIFJvVFIgZHVyaW5nIG15 IGJpc2VjdC4NCg0KSSB3YXMgYWJsZSB0byByZXByb2R1Y2UgdGhlIHByb2JsZW0gd2l0aCBhIG1l bW9yeSBzdHJlc3MgdGVzdCwgYnV0IHN0aWxsIA0KaGF2ZSBub3QgdGhlIHNsaWdodGVzdCBpZGVh IHdoYXQgaXMgZ29pbmcgd3JvbmcgaGVyZS4NCg0KR29pbmcgdG8gaW52ZXN0aWdhdGUgZnVydGhl ciwNCkNocmlzdGlhbi4NCg0KPg0KPiBUaGFua3MuDQo+DQo+Pg0KPj4gVGhhbmtzLA0KPj4gQ2hy aXN0aWFuLg0KPj4NCj4+IEFtIDA4LjExLjE4IHVtIDE3OjE3IHNjaHJpZWIgU2FtdWVsIFBpdG9p c2V0Og0KPj4+IEhpLA0KPj4+DQo+Pj4gVGhpcyBjaGFuZ2UgaW50cm9kdWNlcyBHUFUgaGFuZ3Mg d2l0aCBGMSAyMDE3IGFuZCBSaXNlIG9mIFRvbWIgDQo+Pj4gUmFpZGVyIG9uIFJBRFYvR0ZYOS4g SSBiaXNlY3RlZCB0aGUgaXNzdWUuDQo+Pj4NCj4+PiBDYW4geW91IGhhdmUgYSBsb29rPw0KPj4+ DQo+Pj4gVGhhbmtzIQ0KPj4+DQo+Pj4gT24gOS8xMi8xOCAxMDo1NCBBTSwgQ2hyaXN0aWFuIEvD tm5pZyB3cm90ZToNCj4+Pj4gVGhpcyBvcHRpbWl6ZXMgdGhlIGdlbmVyYXRpbmcgb2YgUFRFcyBi eSB3YWxraW5nIHRoZSBoaWVyYXJjaHkgb25seSANCj4+Pj4gb25jZQ0KPj4+PiBmb3IgYSByYW5n ZSBhbmQgbWFraW5nIGNoYW5nZXMgYXMgbmVjZXNzYXJ5Lg0KPj4+Pg0KPj4+PiBJdCBhbGxvd3Mg Zm9yIGJvdGggaHVnZSAoMk1CKSBhcyB3ZWxsIGdpYW50ICgxR0IpIHBhZ2VzIHRvIGJlIHVzZWQg b24NCj4+Pj4gVmVnYSBhbmQgUmF2ZW4uDQo+Pj4+DQo+Pj4+IFNpZ25lZC1vZmYtYnk6IENocmlz dGlhbiBLw7ZuaWcgPGNocmlzdGlhbi5rb2VuaWdAYW1kLmNvbT4NCj4+Pj4gUmV2aWV3ZWQtYnk6 IEZlbGl4IEt1ZWhsaW5nIDxGZWxpeC5LdWVobGluZ0BhbWQuY29tPg0KPj4+PiBBY2tlZC1ieTog SnVud2VpIFpoYW5nIDxKZXJyeS5aaGFuZ0BhbWQuY29tPg0KPj4+PiAtLS0NCj4+Pj4gwqAgZHJp dmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3ZtLmMgfCAyNjcgDQo+Pj4+ICsrKysrKysr KysrKysrKysrKy0tLS0tLS0tLS0tLS0tLQ0KPj4+PiDCoCAxIGZpbGUgY2hhbmdlZCwgMTQ3IGlu c2VydGlvbnMoKyksIDEyMCBkZWxldGlvbnMoLSkNCj4+Pj4NCj4+Pj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV92bS5jIA0KPj4+PiBiL2RyaXZlcnMvZ3B1 L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV92bS5jDQo+Pj4+IGluZGV4IDc0N2I2ZmY2ZmVhNy4uMzI4 MzI1MzI0YTFkIDEwMDY0NA0KPj4+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9h bWRncHVfdm0uYw0KPj4+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVf dm0uYw0KPj4+PiBAQCAtMTQ4OCw0NiArMTQ4OCw3NiBAQCBpbnQgYW1kZ3B1X3ZtX3VwZGF0ZV9k aXJlY3RvcmllcyhzdHJ1Y3QgDQo+Pj4+IGFtZGdwdV9kZXZpY2UgKmFkZXYsDQo+Pj4+IMKgIH0N Cj4+Pj4gwqAgwqAgLyoqDQo+Pj4+IC0gKiBhbWRncHVfdm1faGFuZGxlX2h1Z2VfcGFnZXMgLSBo YW5kbGUgdXBkYXRpbmcgdGhlIFBEIHdpdGggaHVnZSANCj4+Pj4gcGFnZXMNCj4+Pj4gKyAqIGFt ZGdwdV92bV91cGRhdGVfaHVnZSAtIGZpZ3VyZSBvdXQgcGFyYW1ldGVycyBmb3IgUFRFIHVwZGF0 ZXMNCj4+Pj4gwqDCoCAqDQo+Pj4+IC0gKiBAcDogc2VlIGFtZGdwdV9wdGVfdXBkYXRlX3BhcmFt cyBkZWZpbml0aW9uDQo+Pj4+IC0gKiBAZW50cnk6IHZtX3B0IGVudHJ5IHRvIGNoZWNrDQo+Pj4+ IC0gKiBAcGFyZW50OiBwYXJlbnQgZW50cnkNCj4+Pj4gLSAqIEBucHRlczogbnVtYmVyIG9mIFBU RXMgdXBkYXRlZCB3aXRoIHRoaXMgb3BlcmF0aW9uDQo+Pj4+IC0gKiBAZHN0OiBkZXN0aW5hdGlv biBhZGRyZXNzIHdoZXJlIHRoZSBQVEVzIHNob3VsZCBwb2ludCB0bw0KPj4+PiAtICogQGZsYWdz OiBhY2Nlc3MgZmxhZ3MgZnJvIHRoZSBQVEVzDQo+Pj4+IC0gKg0KPj4+PiAtICogQ2hlY2sgaWYg d2UgY2FuIHVwZGF0ZSB0aGUgUEQgd2l0aCBhIGh1Z2UgcGFnZS4NCj4+Pj4gKyAqIE1ha2Ugc3Vy ZSB0byBzZXQgdGhlIHJpZ2h0IGZsYWdzIGZvciB0aGUgUFRFcyBhdCB0aGUgZGVzaXJlZCANCj4+ Pj4gbGV2ZWwuDQo+Pj4+IMKgwqAgKi8NCj4+Pj4gLXN0YXRpYyB2b2lkIGFtZGdwdV92bV9oYW5k bGVfaHVnZV9wYWdlcyhzdHJ1Y3QgDQo+Pj4+IGFtZGdwdV9wdGVfdXBkYXRlX3BhcmFtcyAqcCwN Cj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0cnVjdCBhbWRn cHVfdm1fcHQgKmVudHJ5LA0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgc3RydWN0IGFtZGdwdV92bV9wdCAqcGFyZW50LA0KPj4+PiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgbnB0ZXMsIHVpbnQ2NF90IGRzdCwNCj4+ Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVpbnQ2NF90IGZsYWdz KQ0KPj4+PiAtew0KPj4+PiAtwqDCoMKgIHVpbnQ2NF90IHBkZTsNCj4+Pj4gK3N0YXRpYyB2b2lk IGFtZGdwdV92bV91cGRhdGVfaHVnZShzdHJ1Y3QgYW1kZ3B1X3B0ZV91cGRhdGVfcGFyYW1zIA0K Pj4+PiAqcGFyYW1zLA0KPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBz dHJ1Y3QgYW1kZ3B1X2JvICpibywgdW5zaWduZWQgbGV2ZWwsDQo+Pj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVpbnQ2NF90IHBlLCB1aW50NjRfdCBhZGRyLA0KPj4+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBjb3VudCwgdWludDMy X3QgaW5jciwNCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdWludDY0 X3QgZmxhZ3MpDQo+Pj4+IMKgIC3CoMKgwqAgLyogSW4gdGhlIGNhc2Ugb2YgYSBtaXhlZCBQVCB0 aGUgUERFIG11c3QgcG9pbnQgdG8gaXQqLw0KPj4+PiAtwqDCoMKgIGlmIChwLT5hZGV2LT5hc2lj X3R5cGUgPj0gQ0hJUF9WRUdBMTAgJiYgIXAtPnNyYyAmJg0KPj4+PiAtwqDCoMKgwqDCoMKgwqAg bnB0ZXMgPT0gQU1ER1BVX1ZNX1BURV9DT1VOVChwLT5hZGV2KSkgew0KPj4+PiAtwqDCoMKgwqDC oMKgwqAgLyogU2V0IHRoZSBodWdlIHBhZ2UgZmxhZyB0byBzdG9wIHNjYW5uaW5nIGF0IHRoaXMg UERFICovDQo+Pj4+ICt7DQo+Pj4+ICvCoMKgwqAgaWYgKGxldmVsICE9IEFNREdQVV9WTV9QVEIp IHsNCj4+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIGZsYWdzIHw9IEFNREdQVV9QREVfUFRFOw0KPj4+ PiArwqDCoMKgwqDCoMKgwqAgYW1kZ3B1X2dtY19nZXRfdm1fcGRlKHBhcmFtcy0+YWRldiwgbGV2 ZWwsICZhZGRyLCAmZmxhZ3MpOw0KPj4+PiDCoMKgwqDCoMKgIH0NCj4+Pj4gwqAgLcKgwqDCoCBp ZiAoIShmbGFncyAmIEFNREdQVV9QREVfUFRFKSkgew0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgaWYg KGVudHJ5LT5odWdlKSB7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC8qIEFkZCB0aGUg ZW50cnkgdG8gdGhlIHJlbG9jYXRlZCBsaXN0IHRvIHVwZGF0ZSBpdC4gKi8NCj4+Pj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgZW50cnktPmh1Z2UgPSBmYWxzZTsNCj4+Pj4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgYW1kZ3B1X3ZtX2JvX3JlbG9jYXRlZCgmZW50cnktPmJhc2UpOw0KPj4+PiAt wqDCoMKgwqDCoMKgwqAgfQ0KPj4+PiArwqDCoMKgIGFtZGdwdV92bV91cGRhdGVfZnVuYyhwYXJh bXMsIGJvLCBwZSwgYWRkciwgY291bnQsIGluY3IsIGZsYWdzKTsNCj4+Pj4gK30NCj4+Pj4gKw0K Pj4+PiArLyoqDQo+Pj4+ICsgKiBhbWRncHVfdm1fZnJhZ21lbnQgLSBnZXQgZnJhZ21lbnQgZm9y IFBURXMNCj4+Pj4gKyAqDQo+Pj4+ICsgKiBAcGFyYW1zOiBzZWUgYW1kZ3B1X3B0ZV91cGRhdGVf cGFyYW1zIGRlZmluaXRpb24NCj4+Pj4gKyAqIEBzdGFydDogZmlyc3QgUFRFIHRvIGhhbmRsZQ0K Pj4+PiArICogQGVuZDogbGFzdCBQVEUgdG8gaGFuZGxlDQo+Pj4+ICsgKiBAZmxhZ3M6IGh3IG1h cHBpbmcgZmxhZ3MNCj4+Pj4gKyAqIEBmcmFnOiByZXN1bHRpbmcgZnJhZ21lbnQgc2l6ZQ0KPj4+ PiArICogQGZyYWdfZW5kOiBlbmQgb2YgdGhpcyBmcmFnbWVudA0KPj4+PiArICoNCj4+Pj4gKyAq IFJldHVybnMgdGhlIGZpcnN0IHBvc3NpYmxlIGZyYWdtZW50IGZvciB0aGUgc3RhcnQgYW5kIGVu ZCBhZGRyZXNzLg0KPj4+PiArICovDQo+Pj4+ICtzdGF0aWMgdm9pZCBhbWRncHVfdm1fZnJhZ21l bnQoc3RydWN0IGFtZGdwdV9wdGVfdXBkYXRlX3BhcmFtcyANCj4+Pj4gKnBhcmFtcywNCj4+Pj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1aW50NjRfdCBzdGFydCwgdWlu dDY0X3QgZW5kLCB1aW50NjRfdCBmbGFncywNCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBpbnQgKmZyYWcsIHVpbnQ2NF90ICpmcmFnX2VuZCkNCj4+ Pj4gK3sNCj4+Pj4gK8KgwqDCoCAvKioNCj4+Pj4gK8KgwqDCoMKgICogVGhlIE1DIEwxIFRMQiBz dXBwb3J0cyB2YXJpYWJsZSBzaXplZCBwYWdlcywgYmFzZWQgb24gYSANCj4+Pj4gZnJhZ21lbnQN Cj4+Pj4gK8KgwqDCoMKgICogZmllbGQgaW4gdGhlIFBURS4gV2hlbiB0aGlzIGZpZWxkIGlzIHNl dCB0byBhIG5vbi16ZXJvIA0KPj4+PiB2YWx1ZSwgcGFnZQ0KPj4+PiArwqDCoMKgwqAgKiBncmFu dWxhcml0eSBpcyBpbmNyZWFzZWQgZnJvbSA0S0IgdG8gKDEgPDwgKDEyICsgZnJhZykpLiANCj4+ Pj4gVGhlIFBURQ0KPj4+PiArwqDCoMKgwqAgKiBmbGFncyBhcmUgY29uc2lkZXJlZCB2YWxpZCBm b3IgYWxsIFBURXMgd2l0aGluIHRoZSBmcmFnbWVudCANCj4+Pj4gcmFuZ2UNCj4+Pj4gK8KgwqDC oMKgICogYW5kIGNvcnJlc3BvbmRpbmcgbWFwcGluZ3MgYXJlIGFzc3VtZWQgdG8gYmUgcGh5c2lj YWxseSANCj4+Pj4gY29udGlndW91cy4NCj4+Pj4gK8KgwqDCoMKgICoNCj4+Pj4gK8KgwqDCoMKg ICogVGhlIEwxIFRMQiBjYW4gc3RvcmUgYSBzaW5nbGUgUFRFIGZvciB0aGUgd2hvbGUgZnJhZ21l bnQsDQo+Pj4+ICvCoMKgwqDCoCAqIHNpZ25pZmljYW50bHkgaW5jcmVhc2luZyB0aGUgc3BhY2Ug YXZhaWxhYmxlIGZvciB0cmFuc2xhdGlvbg0KPj4+PiArwqDCoMKgwqAgKiBjYWNoaW5nLiBUaGlz IGxlYWRzIHRvIGxhcmdlIGltcHJvdmVtZW50cyBpbiB0aHJvdWdocHV0IA0KPj4+PiB3aGVuIHRo ZQ0KPj4+PiArwqDCoMKgwqAgKiBUTEIgaXMgdW5kZXIgcHJlc3N1cmUuDQo+Pj4+ICvCoMKgwqDC oCAqDQo+Pj4+ICvCoMKgwqDCoCAqIFRoZSBMMiBUTEIgZGlzdHJpYnV0ZXMgc21hbGwgYW5kIGxh cmdlIGZyYWdtZW50cyBpbnRvIHR3bw0KPj4+PiArwqDCoMKgwqAgKiBhc3ltbWV0cmljIHBhcnRp dGlvbnMuIFRoZSBsYXJnZSBmcmFnbWVudCBjYWNoZSBpcyANCj4+Pj4gc2lnbmlmaWNhbnRseQ0K Pj4+PiArwqDCoMKgwqAgKiBsYXJnZXIuIFRodXMsIHdlIHRyeSB0byB1c2UgbGFyZ2UgZnJhZ21l bnRzIHdoZXJldmVyIHBvc3NpYmxlLg0KPj4+PiArwqDCoMKgwqAgKiBVc2Vyc3BhY2UgY2FuIHN1 cHBvcnQgdGhpcyBieSBhbGlnbmluZyB2aXJ0dWFsIGJhc2UgYWRkcmVzcyANCj4+Pj4gYW5kDQo+ Pj4+ICvCoMKgwqDCoCAqIGFsbG9jYXRpb24gc2l6ZSB0byB0aGUgZnJhZ21lbnQgc2l6ZS4NCj4+ Pj4gK8KgwqDCoMKgICovDQo+Pj4+ICvCoMKgwqAgdW5zaWduZWQgbWF4X2ZyYWcgPSBwYXJhbXMt PmFkZXYtPnZtX21hbmFnZXIuZnJhZ21lbnRfc2l6ZTsNCj4+Pj4gKw0KPj4+PiArwqDCoMKgIC8q IHN5c3RlbSBwYWdlcyBhcmUgbm9uIGNvbnRpbnVvdXNseSAqLw0KPj4+PiArwqDCoMKgIGlmIChw YXJhbXMtPnNyYyB8fCAhKGZsYWdzICYgQU1ER1BVX1BURV9WQUxJRCkpIHsNCj4+Pj4gK8KgwqDC oMKgwqDCoMKgICpmcmFnID0gMDsNCj4+Pj4gK8KgwqDCoMKgwqDCoMKgICpmcmFnX2VuZCA9IGVu ZDsNCj4+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybjsNCj4+Pj4gwqDCoMKgwqDCoCB9DQo+ Pj4+IMKgIC3CoMKgwqAgZW50cnktPmh1Z2UgPSB0cnVlOw0KPj4+PiAtwqDCoMKgIGFtZGdwdV9n bWNfZ2V0X3ZtX3BkZShwLT5hZGV2LCBBTURHUFVfVk1fUERCMCwgJmRzdCwgJmZsYWdzKTsNCj4+ Pj4gLQ0KPj4+PiAtwqDCoMKgIHBkZSA9IChlbnRyeSAtIHBhcmVudC0+ZW50cmllcykgKiA4Ow0K Pj4+PiAtwqDCoMKgIGFtZGdwdV92bV91cGRhdGVfZnVuYyhwLCBwYXJlbnQtPmJhc2UuYm8sIHBk ZSwgZHN0LCAxLCAwLCBmbGFncyk7DQo+Pj4+ICvCoMKgwqAgLyogVGhpcyBpbnRlbnRpb25hbGx5 IHdyYXBzIGFyb3VuZCBpZiBubyBiaXQgaXMgc2V0ICovDQo+Pj4+ICvCoMKgwqAgKmZyYWcgPSBt aW4oKHVuc2lnbmVkKWZmcyhzdGFydCkgLSAxLCAodW5zaWduZWQpZmxzNjQoZW5kIC0gDQo+Pj4+ IHN0YXJ0KSAtIDEpOw0KPj4+PiArwqDCoMKgIGlmICgqZnJhZyA+PSBtYXhfZnJhZykgew0KPj4+ PiArwqDCoMKgwqDCoMKgwqAgKmZyYWcgPSBtYXhfZnJhZzsNCj4+Pj4gK8KgwqDCoMKgwqDCoMKg ICpmcmFnX2VuZCA9IGVuZCAmIH4oKDFVTEwgPDwgbWF4X2ZyYWcpIC0gMSk7DQo+Pj4+ICvCoMKg wqAgfSBlbHNlIHsNCj4+Pj4gK8KgwqDCoMKgwqDCoMKgICpmcmFnX2VuZCA9IHN0YXJ0ICsgKDEg PDwgKmZyYWcpOw0KPj4+PiArwqDCoMKgIH0NCj4+Pj4gwqAgfQ0KPj4+PiDCoCDCoCAvKioNCj4+ Pj4gQEAgLTE1NDUsMTA4ICsxNTc1LDEwNSBAQCBzdGF0aWMgdm9pZCANCj4+Pj4gYW1kZ3B1X3Zt X2hhbmRsZV9odWdlX3BhZ2VzKHN0cnVjdCBhbWRncHVfcHRlX3VwZGF0ZV9wYXJhbXMgKnAsDQo+ Pj4+IMKgwqAgKiAwIGZvciBzdWNjZXNzLCAtRUlOVkFMIGZvciBmYWlsdXJlLg0KPj4+PiDCoMKg ICovDQo+Pj4+IMKgIHN0YXRpYyBpbnQgYW1kZ3B1X3ZtX3VwZGF0ZV9wdGVzKHN0cnVjdCBhbWRn cHVfcHRlX3VwZGF0ZV9wYXJhbXMgDQo+Pj4+ICpwYXJhbXMsDQo+Pj4+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVpbnQ2NF90IHN0YXJ0LCB1aW50NjRfdCBlbmQsDQo+Pj4+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVpbnQ2NF90IGRzdCwgdWludDY0 X3QgZmxhZ3MpDQo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1aW50NjRf dCBzdGFydCwgdWludDY0X3QgZW5kLA0KPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgdWludDY0X3QgZHN0LCB1aW50NjRfdCBmbGFncykNCj4+Pj4gwqAgew0KPj4+PiDCoMKg wqDCoMKgIHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2ID0gcGFyYW1zLT5hZGV2Ow0KPj4+PiAt wqDCoMKgIGNvbnN0IHVpbnQ2NF90IG1hc2sgPSBBTURHUFVfVk1fUFRFX0NPVU5UKGFkZXYpIC0g MTsNCj4+Pj4gwqDCoMKgwqDCoCBzdHJ1Y3QgYW1kZ3B1X3ZtX3B0X2N1cnNvciBjdXJzb3I7DQo+ Pj4+ICvCoMKgwqAgdWludDY0X3QgZnJhZ19zdGFydCA9IHN0YXJ0LCBmcmFnX2VuZDsNCj4+Pj4g K8KgwqDCoCB1bnNpZ25lZCBpbnQgZnJhZzsNCj4+Pj4gwqAgLcKgwqDCoCAvKiB3YWxrIG92ZXIg dGhlIGFkZHJlc3Mgc3BhY2UgYW5kIHVwZGF0ZSB0aGUgcGFnZSB0YWJsZXMgKi8NCj4+Pj4gLcKg wqDCoCBmb3JfZWFjaF9hbWRncHVfdm1fcHRfbGVhZihhZGV2LCBwYXJhbXMtPnZtLCBzdGFydCwg ZW5kIC0gMSwgDQo+Pj4+IGN1cnNvcikgew0KPj4+PiArwqDCoMKgIC8qIGZpZ3VyZSBvdXQgdGhl IGluaXRpYWwgZnJhZ21lbnQgKi8NCj4+Pj4gK8KgwqDCoCBhbWRncHVfdm1fZnJhZ21lbnQocGFy YW1zLCBmcmFnX3N0YXJ0LCBlbmQsIGZsYWdzLCAmZnJhZywgDQo+Pj4+ICZmcmFnX2VuZCk7DQo+ Pj4+ICsNCj4+Pj4gK8KgwqDCoCAvKiB3YWxrIG92ZXIgdGhlIGFkZHJlc3Mgc3BhY2UgYW5kIHVw ZGF0ZSB0aGUgUFRzICovDQo+Pj4+ICvCoMKgwqAgYW1kZ3B1X3ZtX3B0X3N0YXJ0KGFkZXYsIHBh cmFtcy0+dm0sIHN0YXJ0LCAmY3Vyc29yKTsNCj4+Pj4gK8KgwqDCoCB3aGlsZSAoY3Vyc29yLnBm biA8IGVuZCkgew0KPj4+PiDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IGFtZGdwdV9ibyAqcHQg PSBjdXJzb3IuZW50cnktPmJhc2UuYm87DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCB1aW50NjRfdCBw ZV9zdGFydDsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIG5wdGVzOw0KPj4+PiArwqDC oMKgwqDCoMKgwqAgdW5zaWduZWQgc2hpZnQsIHBhcmVudF9zaGlmdCwgbnVtX2VudHJpZXM7DQo+ Pj4+ICvCoMKgwqDCoMKgwqDCoCB1aW50NjRfdCBpbmNyLCBlbnRyeV9lbmQsIHBlX3N0YXJ0Ow0K Pj4+PiDCoCAtwqDCoMKgwqDCoMKgwqAgaWYgKCFwdCB8fCBjdXJzb3IubGV2ZWwgIT0gQU1ER1BV X1ZNX1BUQikNCj4+Pj4gK8KgwqDCoMKgwqDCoMKgIGlmICghcHQpDQo+Pj4+IMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHJldHVybiAtRU5PRU5UOw0KPj4+PiDCoCAtwqDCoMKgwqDCoMKgwqAg aWYgKChjdXJzb3IucGZuICYgfm1hc2spID09IChlbmQgJiB+bWFzaykpDQo+Pj4+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgIG5wdGVzID0gZW5kIC0gY3Vyc29yLnBmbjsNCj4+Pj4gLcKgwqDCoMKg wqDCoMKgIGVsc2UNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbnB0ZXMgPSBBTURHUFVf Vk1fUFRFX0NPVU5UKGFkZXYpIC0gKGN1cnNvci5wZm4gJiBtYXNrKTsNCj4+Pj4gLQ0KPj4+PiAt wqDCoMKgwqDCoMKgwqAgYW1kZ3B1X3ZtX2hhbmRsZV9odWdlX3BhZ2VzKHBhcmFtcywgY3Vyc29y LmVudHJ5LCANCj4+Pj4gY3Vyc29yLnBhcmVudCwNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbnB0ZXMsIGRzdCwgZmxhZ3MpOw0KPj4+PiAtwqDC oMKgwqDCoMKgwqAgLyogV2UgZG9uJ3QgbmVlZCB0byB1cGRhdGUgUFRFcyBmb3IgaHVnZSBwYWdl cyAqLw0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgaWYgKGN1cnNvci5lbnRyeS0+aHVnZSkgew0KPj4+ PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBkc3QgKz0gbnB0ZXMgKiBBTURHUFVfR1BVX1BBR0Vf U0laRTsNCj4+Pj4gK8KgwqDCoMKgwqDCoMKgIC8qIFRoZSByb290IGxldmVsIGNhbid0IGJlIGEg aHVnZSBwYWdlICovDQo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAoY3Vyc29yLmxldmVsID09IGFk ZXYtPnZtX21hbmFnZXIucm9vdF9sZXZlbCkgew0KPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBpZiAoIWFtZGdwdV92bV9wdF9kZXNjZW5kYW50KGFkZXYsICZjdXJzb3IpKQ0KPj4+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiAtRU5PRU5UOw0KPj4+PiDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBjb250aW51ZTsNCj4+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIH0N Cj4+Pj4gwqAgLcKgwqDCoMKgwqDCoMKgIHBlX3N0YXJ0ID0gKGN1cnNvci5wZm4gJiBtYXNrKSAq IDg7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCBhbWRncHVfdm1fdXBkYXRlX2Z1bmMocGFyYW1zLCBw dCwgcGVfc3RhcnQsIGRzdCwgbnB0ZXMsDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgQU1ER1BVX0dQVV9QQUdFX1NJWkUsIGZsYWdzKTsNCj4+Pj4gLcKg wqDCoMKgwqDCoMKgIGRzdCArPSBucHRlcyAqIEFNREdQVV9HUFVfUEFHRV9TSVpFOw0KPj4+PiAt wqDCoMKgIH0NCj4+Pj4gLQ0KPj4+PiAtwqDCoMKgIHJldHVybiAwOw0KPj4+PiAtfQ0KPj4+PiAr wqDCoMKgwqDCoMKgwqAgLyogRmlyc3QgY2hlY2sgaWYgdGhlIGVudHJ5IGlzIGFscmVhZHkgaGFu ZGxlZCAqLw0KPj4+PiArwqDCoMKgwqDCoMKgwqAgaWYgKGN1cnNvci5wZm4gPCBmcmFnX3N0YXJ0 KSB7DQo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGN1cnNvci5lbnRyeS0+aHVnZSA9IHRy dWU7DQo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGFtZGdwdV92bV9wdF9uZXh0KGFkZXYs ICZjdXJzb3IpOw0KPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb250aW51ZTsNCj4+Pj4g K8KgwqDCoMKgwqDCoMKgIH0NCj4+Pj4gwqAgLS8qDQo+Pj4+IC0gKiBhbWRncHVfdm1fZnJhZ19w dGVzIC0gYWRkIGZyYWdtZW50IGluZm9ybWF0aW9uIHRvIFBURXMNCj4+Pj4gLSAqDQo+Pj4+IC0g KiBAcGFyYW1zOiBzZWUgYW1kZ3B1X3B0ZV91cGRhdGVfcGFyYW1zIGRlZmluaXRpb24NCj4+Pj4g LSAqIEB2bTogcmVxdWVzdGVkIHZtDQo+Pj4+IC0gKiBAc3RhcnQ6IGZpcnN0IFBURSB0byBoYW5k bGUNCj4+Pj4gLSAqIEBlbmQ6IGxhc3QgUFRFIHRvIGhhbmRsZQ0KPj4+PiAtICogQGRzdDogYWRk ciB0aG9zZSBQVEVzIHNob3VsZCBwb2ludCB0bw0KPj4+PiAtICogQGZsYWdzOiBodyBtYXBwaW5n IGZsYWdzDQo+Pj4+IC0gKg0KPj4+PiAtICogUmV0dXJuczoNCj4+Pj4gLSAqIDAgZm9yIHN1Y2Nl c3MsIC1FSU5WQUwgZm9yIGZhaWx1cmUuDQo+Pj4+IC0gKi8NCj4+Pj4gLXN0YXRpYyBpbnQgYW1k Z3B1X3ZtX2ZyYWdfcHRlcyhzdHJ1Y3QgYW1kZ3B1X3B0ZV91cGRhdGVfcGFyYW1zIA0KPj4+PiAq cGFyYW1zLA0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVpbnQ2NF90IHN0 YXJ0LCB1aW50NjRfdCBlbmQsDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg dWludDY0X3QgZHN0LCB1aW50NjRfdCBmbGFncykNCj4+Pj4gLXsNCj4+Pj4gLcKgwqDCoCAvKioN Cj4+Pj4gLcKgwqDCoMKgICogVGhlIE1DIEwxIFRMQiBzdXBwb3J0cyB2YXJpYWJsZSBzaXplZCBw YWdlcywgYmFzZWQgb24gYSANCj4+Pj4gZnJhZ21lbnQNCj4+Pj4gLcKgwqDCoMKgICogZmllbGQg aW4gdGhlIFBURS4gV2hlbiB0aGlzIGZpZWxkIGlzIHNldCB0byBhIG5vbi16ZXJvIA0KPj4+PiB2 YWx1ZSwgcGFnZQ0KPj4+PiAtwqDCoMKgwqAgKiBncmFudWxhcml0eSBpcyBpbmNyZWFzZWQgZnJv bSA0S0IgdG8gKDEgPDwgKDEyICsgZnJhZykpLiANCj4+Pj4gVGhlIFBURQ0KPj4+PiAtwqDCoMKg wqAgKiBmbGFncyBhcmUgY29uc2lkZXJlZCB2YWxpZCBmb3IgYWxsIFBURXMgd2l0aGluIHRoZSBm cmFnbWVudCANCj4+Pj4gcmFuZ2UNCj4+Pj4gLcKgwqDCoMKgICogYW5kIGNvcnJlc3BvbmRpbmcg bWFwcGluZ3MgYXJlIGFzc3VtZWQgdG8gYmUgcGh5c2ljYWxseSANCj4+Pj4gY29udGlndW91cy4N Cj4+Pj4gLcKgwqDCoMKgICoNCj4+Pj4gLcKgwqDCoMKgICogVGhlIEwxIFRMQiBjYW4gc3RvcmUg YSBzaW5nbGUgUFRFIGZvciB0aGUgd2hvbGUgZnJhZ21lbnQsDQo+Pj4+IC3CoMKgwqDCoCAqIHNp Z25pZmljYW50bHkgaW5jcmVhc2luZyB0aGUgc3BhY2UgYXZhaWxhYmxlIGZvciB0cmFuc2xhdGlv bg0KPj4+PiAtwqDCoMKgwqAgKiBjYWNoaW5nLiBUaGlzIGxlYWRzIHRvIGxhcmdlIGltcHJvdmVt ZW50cyBpbiB0aHJvdWdocHV0IA0KPj4+PiB3aGVuIHRoZQ0KPj4+PiAtwqDCoMKgwqAgKiBUTEIg aXMgdW5kZXIgcHJlc3N1cmUuDQo+Pj4+IC3CoMKgwqDCoCAqDQo+Pj4+IC3CoMKgwqDCoCAqIFRo ZSBMMiBUTEIgZGlzdHJpYnV0ZXMgc21hbGwgYW5kIGxhcmdlIGZyYWdtZW50cyBpbnRvIHR3bw0K Pj4+PiAtwqDCoMKgwqAgKiBhc3ltbWV0cmljIHBhcnRpdGlvbnMuIFRoZSBsYXJnZSBmcmFnbWVu dCBjYWNoZSBpcyANCj4+Pj4gc2lnbmlmaWNhbnRseQ0KPj4+PiAtwqDCoMKgwqAgKiBsYXJnZXIu IFRodXMsIHdlIHRyeSB0byB1c2UgbGFyZ2UgZnJhZ21lbnRzIHdoZXJldmVyIHBvc3NpYmxlLg0K Pj4+PiAtwqDCoMKgwqAgKiBVc2Vyc3BhY2UgY2FuIHN1cHBvcnQgdGhpcyBieSBhbGlnbmluZyB2 aXJ0dWFsIGJhc2UgYWRkcmVzcyANCj4+Pj4gYW5kDQo+Pj4+IC3CoMKgwqDCoCAqIGFsbG9jYXRp b24gc2l6ZSB0byB0aGUgZnJhZ21lbnQgc2l6ZS4NCj4+Pj4gLcKgwqDCoMKgICovDQo+Pj4+IC3C oMKgwqAgdW5zaWduZWQgbWF4X2ZyYWcgPSBwYXJhbXMtPmFkZXYtPnZtX21hbmFnZXIuZnJhZ21l bnRfc2l6ZTsNCj4+Pj4gLcKgwqDCoCBpbnQgcjsNCj4+Pj4gK8KgwqDCoMKgwqDCoMKgIC8qIElm IGl0IGlzbid0IGFscmVhZHkgaGFuZGxlZCBpdCBjYW4ndCBiZSBhIGh1Z2UgcGFnZSAqLw0KPj4+ PiArwqDCoMKgwqDCoMKgwqAgaWYgKGN1cnNvci5lbnRyeS0+aHVnZSkgew0KPj4+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCAvKiBBZGQgdGhlIGVudHJ5IHRvIHRoZSByZWxvY2F0ZWQgbGlzdCB0 byB1cGRhdGUgaXQuICovDQo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGN1cnNvci5lbnRy eS0+aHVnZSA9IGZhbHNlOw0KPj4+PiArIGFtZGdwdV92bV9ib19yZWxvY2F0ZWQoJmN1cnNvci5l bnRyeS0+YmFzZSk7DQo+Pj4+ICvCoMKgwqDCoMKgwqDCoCB9DQo+Pj4+IMKgIC3CoMKgwqAgLyog c3lzdGVtIHBhZ2VzIGFyZSBub24gY29udGludW91c2x5ICovDQo+Pj4+IC3CoMKgwqAgaWYgKHBh cmFtcy0+c3JjIHx8ICEoZmxhZ3MgJiBBTURHUFVfUFRFX1ZBTElEKSkNCj4+Pj4gLcKgwqDCoMKg wqDCoMKgIHJldHVybiBhbWRncHVfdm1fdXBkYXRlX3B0ZXMocGFyYW1zLCBzdGFydCwgZW5kLCBk c3QsIGZsYWdzKTsNCj4+Pj4gLQ0KPj4+PiAtwqDCoMKgIHdoaWxlIChzdGFydCAhPSBlbmQpIHsN Cj4+Pj4gLcKgwqDCoMKgwqDCoMKgIHVpbnQ2NF90IGZyYWdfZmxhZ3MsIGZyYWdfZW5kOw0KPj4+ PiAtwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgZnJhZzsNCj4+Pj4gLQ0KPj4+PiAtwqDCoMKgwqDC oMKgwqAgLyogVGhpcyBpbnRlbnRpb25hbGx5IHdyYXBzIGFyb3VuZCBpZiBubyBiaXQgaXMgc2V0 ICovDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCBmcmFnID0gbWluKCh1bnNpZ25lZClmZnMoc3RhcnQp IC0gMSwNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHVuc2lnbmVkKWZsczY0 KGVuZCAtIHN0YXJ0KSAtIDEpOw0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgaWYgKGZyYWcgPj0gbWF4 X2ZyYWcpIHsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZnJhZ19mbGFncyA9IEFNREdQ VV9QVEVfRlJBRyhtYXhfZnJhZyk7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZyYWdf ZW5kID0gZW5kICYgfigoMVVMTCA8PCBtYXhfZnJhZykgLSAxKTsNCj4+Pj4gLcKgwqDCoMKgwqDC oMKgIH0gZWxzZSB7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZyYWdfZmxhZ3MgPSBB TURHUFVfUFRFX0ZSQUcoZnJhZyk7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZyYWdf ZW5kID0gc3RhcnQgKyAoMSA8PCBmcmFnKTsNCj4+Pj4gK8KgwqDCoMKgwqDCoMKgIHNoaWZ0ID0g YW1kZ3B1X3ZtX2xldmVsX3NoaWZ0KGFkZXYsIGN1cnNvci5sZXZlbCk7DQo+Pj4+ICvCoMKgwqDC oMKgwqDCoCBwYXJlbnRfc2hpZnQgPSBhbWRncHVfdm1fbGV2ZWxfc2hpZnQoYWRldiwgY3Vyc29y LmxldmVsIC0gMSk7DQo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAoYWRldi0+YXNpY190eXBlIDwg Q0hJUF9WRUdBMTApIHsNCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLyogTm8gaHVnZSBw YWdlIHN1cHBvcnQgYmVmb3JlIEdNQyB2OSAqLw0KPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBpZiAoY3Vyc29yLmxldmVsICE9IEFNREdQVV9WTV9QVEIpIHsNCj4+Pj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoIWFtZGdwdV92bV9wdF9kZXNjZW5kYW50KGFkZXYsICZj dXJzb3IpKQ0KPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0 dXJuIC1FTk9FTlQ7DQo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29udGlu dWU7DQo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0NCj4+Pj4gK8KgwqDCoMKgwqDCoMKg IH0gZWxzZSBpZiAoZnJhZyA8IHNoaWZ0KSB7DQo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IC8qIFdlIGNhbid0IHVzZSB0aGlzIGxldmVsIHdoZW4gdGhlIGZyYWdtZW50IHNpemUgaXMNCj4+ Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIHNtYWxsZXIgdGhhbiB0aGUgYWRkcmVzcyBz aGlmdC4gR28gdG8gdGhlIG5leHQNCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIGNo aWxkIGVudHJ5IGFuZCB0cnkgYWdhaW4uDQo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg Ki8NCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKCFhbWRncHVfdm1fcHRfZGVzY2Vu ZGFudChhZGV2LCAmY3Vyc29yKSkNCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCByZXR1cm4gLUVOT0VOVDsNCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29udGludWU7 DQo+Pj4+ICvCoMKgwqDCoMKgwqDCoCB9IGVsc2UgaWYgKGZyYWcgPj0gcGFyZW50X3NoaWZ0KSB7 DQo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC8qIElmIHRoZSBmcmFnbWVudCBzaXplIGlz IGV2ZW4gbGFyZ2VyIHRoYW4gdGhlIHBhcmVudA0KPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICogc2hpZnQgd2Ugc2hvdWxkIGdvIHVwIG9uZSBsZXZlbCBhbmQgY2hlY2sgaXQgYWdhaW4u DQo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKi8NCj4+Pj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgaWYgKCFhbWRncHVfdm1fcHRfYW5jZXN0b3IoJmN1cnNvcikpDQo+Pj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FTk9FTlQ7DQo+Pj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGNvbnRpbnVlOw0KPj4+PiDCoMKgwqDCoMKgwqDCoMKgwqAgfQ0KPj4+ PiDCoCAtwqDCoMKgwqDCoMKgwqAgciA9IGFtZGdwdV92bV91cGRhdGVfcHRlcyhwYXJhbXMsIHN0 YXJ0LCBmcmFnX2VuZCwgZHN0LA0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGZsYWdzIHwgZnJhZ19mbGFncyk7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCBp ZiAocikNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHI7DQo+Pj4+ICvCoMKg wqDCoMKgwqDCoCAvKiBMb29rcyBnb29kIHNvIGZhciwgY2FsY3VsYXRlIHBhcmFtZXRlcnMgZm9y IHRoZSB1cGRhdGUgKi8NCj4+Pj4gK8KgwqDCoMKgwqDCoMKgIGluY3IgPSBBTURHUFVfR1BVX1BB R0VfU0laRSA8PCBzaGlmdDsNCj4+Pj4gK8KgwqDCoMKgwqDCoMKgIG51bV9lbnRyaWVzID0gYW1k Z3B1X3ZtX251bV9lbnRyaWVzKGFkZXYsIGN1cnNvci5sZXZlbCk7DQo+Pj4+ICvCoMKgwqDCoMKg wqDCoCBwZV9zdGFydCA9ICgoY3Vyc29yLnBmbiA+PiBzaGlmdCkgJiAobnVtX2VudHJpZXMgLSAx KSkgKiA4Ow0KPj4+PiArwqDCoMKgwqDCoMKgwqAgZW50cnlfZW5kID0gbnVtX2VudHJpZXMgPDwg c2hpZnQ7DQo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBlbnRyeV9lbmQgKz0gY3Vyc29yLnBmbiAmIH4o ZW50cnlfZW5kIC0gMSk7DQo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBlbnRyeV9lbmQgPSBtaW4oZW50 cnlfZW5kLCBlbmQpOw0KPj4+PiArDQo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBkbyB7DQo+Pj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVpbnQ2NF90IHVwZF9lbmQgPSBtaW4oZW50cnlfZW5kLCBm cmFnX2VuZCk7DQo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIG5wdGVzID0g KHVwZF9lbmQgLSBmcmFnX3N0YXJ0KSA+PiBzaGlmdDsNCj4+Pj4gKw0KPj4+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBhbWRncHVfdm1fdXBkYXRlX2h1Z2UocGFyYW1zLCBwdCwgY3Vyc29yLmxl dmVsLA0KPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgcGVfc3RhcnQsIGRzdCwgbnB0ZXMsIGluY3IsDQo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmbGFncyB8IEFNREdQVV9QVEVfRlJB RyhmcmFnKSk7DQo+Pj4+ICsNCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGVfc3RhcnQg Kz0gbnB0ZXMgKiA4Ow0KPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBkc3QgKz0gbnB0ZXMg KiBBTURHUFVfR1BVX1BBR0VfU0laRSA8PCBzaGlmdDsNCj4+Pj4gKw0KPj4+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBmcmFnX3N0YXJ0ID0gdXBkX2VuZDsNCj4+Pj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgaWYgKGZyYWdfc3RhcnQgPj0gZnJhZ19lbmQpIHsNCj4+Pj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCAvKiBmaWd1cmUgb3V0IHRoZSBuZXh0IGZyYWdtZW50ICovDQo+ Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYW1kZ3B1X3ZtX2ZyYWdtZW50KHBh cmFtcywgZnJhZ19zdGFydCwgZW5kLA0KPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmbGFncywgJmZyYWcsICZmcmFnX2VuZCk7DQo+Pj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKGZyYWcgPCBzaGlmdCkNCj4+Pj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOw0KPj4+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCB9DQo+Pj4+ICvCoMKgwqDCoMKgwqDCoCB9IHdoaWxlIChmcmFn X3N0YXJ0IDwgZW50cnlfZW5kKTsNCj4+Pj4gwqAgLcKgwqDCoMKgwqDCoMKgIGRzdCArPSAoZnJh Z19lbmQgLSBzdGFydCkgKiBBTURHUFVfR1BVX1BBR0VfU0laRTsNCj4+Pj4gLcKgwqDCoMKgwqDC oMKgIHN0YXJ0ID0gZnJhZ19lbmQ7DQo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAoZnJhZyA+PSBz aGlmdCkNCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYW1kZ3B1X3ZtX3B0X25leHQoYWRl diwgJmN1cnNvcik7DQo+Pj4+IMKgwqDCoMKgwqAgfQ0KPj4+PiDCoCDCoMKgwqDCoMKgIHJldHVy biAwOw0KPj4+PiBAQCAtMTcwOCw4ICsxNzM1LDggQEAgc3RhdGljIGludCBhbWRncHVfdm1fYm9f dXBkYXRlX21hcHBpbmcoc3RydWN0IA0KPj4+PiBhbWRncHVfZGV2aWNlICphZGV2LA0KPj4+PiDC oCDCoMKgwqDCoMKgwqDCoMKgwqAgcGFyYW1zLmZ1bmMgPSBhbWRncHVfdm1fY3B1X3NldF9wdGVz Ow0KPj4+PiDCoMKgwqDCoMKgwqDCoMKgwqAgcGFyYW1zLnBhZ2VzX2FkZHIgPSBwYWdlc19hZGRy Ow0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgcmV0dXJuIGFtZGdwdV92bV9mcmFnX3B0ZXMoJnBhcmFt cywgc3RhcnQsIGxhc3QgKyAxLA0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgYWRkciwgZmxhZ3MpOw0KPj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJu IGFtZGdwdV92bV91cGRhdGVfcHRlcygmcGFyYW1zLCBzdGFydCwgbGFzdCArIDEsDQo+Pj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYWRkciwgZmxh Z3MpOw0KPj4+PiDCoMKgwqDCoMKgIH0NCj4+Pj4gwqAgwqDCoMKgwqDCoCByaW5nID0gY29udGFp bmVyX29mKHZtLT5lbnRpdHkucnEtPnNjaGVkLCBzdHJ1Y3QgDQo+Pj4+IGFtZGdwdV9yaW5nLCBz Y2hlZCk7DQo+Pj4+IEBAIC0xNzg4LDcgKzE4MTUsNyBAQCBzdGF0aWMgaW50IGFtZGdwdV92bV9i b191cGRhdGVfbWFwcGluZyhzdHJ1Y3QgDQo+Pj4+IGFtZGdwdV9kZXZpY2UgKmFkZXYsDQo+Pj4+ IMKgwqDCoMKgwqAgaWYgKHIpDQo+Pj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIGVycm9yX2Zy ZWU7DQo+Pj4+IMKgIC3CoMKgwqAgciA9IGFtZGdwdV92bV9mcmFnX3B0ZXMoJnBhcmFtcywgc3Rh cnQsIGxhc3QgKyAxLCBhZGRyLCBmbGFncyk7DQo+Pj4+ICvCoMKgwqAgciA9IGFtZGdwdV92bV91 cGRhdGVfcHRlcygmcGFyYW1zLCBzdGFydCwgbGFzdCArIDEsIGFkZHIsIGZsYWdzKTsNCj4+Pj4g wqDCoMKgwqDCoCBpZiAocikNCj4+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gZXJyb3JfZnJl ZTsNCj4+Pj4NCj4+DQoNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCmFtZC1nZnggbWFpbGluZyBsaXN0CmFtZC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3Jn Cmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vYW1kLWdmeAo=