From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id E0D1141D9C; Tue, 28 Feb 2023 12:58:48 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id BCC3640EE4; Tue, 28 Feb 2023 12:58:48 +0100 (CET) Received: from frasgout.his.huawei.com (frasgout.his.huawei.com [185.176.79.56]) by mails.dpdk.org (Postfix) with ESMTP id B5E7B4021F for ; Tue, 28 Feb 2023 12:58:46 +0100 (CET) Received: from frapeml500006.china.huawei.com (unknown [172.18.147.200]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4PQwqy6R5zz6J7D2; Tue, 28 Feb 2023 19:58:38 +0800 (CST) Received: from frapeml500007.china.huawei.com (7.182.85.172) by frapeml500006.china.huawei.com (7.182.85.219) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.21; Tue, 28 Feb 2023 12:58:45 +0100 Received: from frapeml500007.china.huawei.com ([7.182.85.172]) by frapeml500007.china.huawei.com ([7.182.85.172]) with mapi id 15.01.2507.021; Tue, 28 Feb 2023 12:58:45 +0100 From: Konstantin Ananyev To: Tomasz Duszynski , Konstantin Ananyev , "dev@dpdk.org" Subject: RE: [EXT] Re: [PATCH v11 1/4] lib: add generic support for reading PMU events Thread-Topic: [EXT] Re: [PATCH v11 1/4] lib: add generic support for reading PMU events Thread-Index: AQHZQi/0WtsdB195/EyIqAkaKgLk/K7YoA2AgAnj+wCAAMG3wIAA2ykAgAAt0VA= Date: Tue, 28 Feb 2023 11:58:44 +0000 Message-ID: <48ff47d1eb994c4fa78640658b752ec6@huawei.com> References: <20230213113156.385482-1-tduszynski@marvell.com> <20230216175502.3164820-1-tduszynski@marvell.com> <20230216175502.3164820-2-tduszynski@marvell.com> <5dfb1803-ae7f-5361-6453-70f767041928@yandex.ru> <2be9393cdbb94b9dad5bb7340ab9bca0@huawei.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.206.138.42] Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-CFilter-Loop: Reflected X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org DQoNCj4gPj4gPj4gQWRkIHN1cHBvcnQgZm9yIHByb2dyYW1taW5nIFBNVSBjb3VudGVycyBhbmQg cmVhZGluZyB0aGVpciB2YWx1ZXMNCj4gPj4gPj4gaW4gcnVudGltZSBieXBhc3Npbmcga2VybmVs IGNvbXBsZXRlbHkuDQo+ID4+ID4+DQo+ID4+ID4+IFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwg aW4gY2FzZXMgd2hlcmUgQ1BVIGNvcmVzIGFyZSBpc29sYXRlZCBpLmUNCj4gPj4gPj4gcnVuIGRl ZGljYXRlZCB0YXNrcy4gSW4gc3VjaCBjYXNlcyBvbmUgY2Fubm90IHVzZSBzdGFuZGFyZCBwZXJm DQo+ID4+ID4+IHV0aWxpdHkgd2l0aG91dCBzYWNyaWZpY2luZyBsYXRlbmN5IGFuZCBwZXJmb3Jt YW5jZS4NCj4gPj4gPj4NCj4gPj4gPj4gU2lnbmVkLW9mZi1ieTogVG9tYXN6IER1c3p5bnNraSA8 dGR1c3p5bnNraUBtYXJ2ZWxsLmNvbT4NCj4gPj4gPj4gQWNrZWQtYnk6IE1vcnRlbiBCcsO4cnVw IDxtYkBzbWFydHNoYXJlc3lzdGVtcy5jb20+DQo+ID4+ID4NCj4gPj4gPkZldyBtb3JlIGNvbW1l bnRzL3F1ZXN0aW9ucyBiZWxvdy4NCj4gPj4gPg0KPiA+PiA+DQo+ID4+ID4+IGRpZmYgLS1naXQg YS9saWIvcG11L3J0ZV9wbXUuYyBiL2xpYi9wbXUvcnRlX3BtdS5jIG5ldyBmaWxlIG1vZGUNCj4g Pj4gPj4gMTAwNjQ0IGluZGV4IDAwMDAwMDAwMDAuLjk1MGY5OTljYjcNCj4gPj4gPj4gLS0tIC9k ZXYvbnVsbA0KPiA+PiA+PiArKysgYi9saWIvcG11L3J0ZV9wbXUuYw0KPiA+PiA+PiBAQCAtMCww ICsxLDQ2MCBAQA0KPiA+PiA+PiArLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNs YXVzZQ0KPiA+PiA+PiArICogQ29weXJpZ2h0KEMpIDIwMjMgTWFydmVsbCBJbnRlcm5hdGlvbmFs IEx0ZC4NCj4gPj4gPj4gKyAqLw0KPiA+PiA+PiArDQo+ID4+ID4+ICsjaW5jbHVkZSA8Y3R5cGUu aD4NCj4gPj4gPj4gKyNpbmNsdWRlIDxkaXJlbnQuaD4NCj4gPj4gPj4gKyNpbmNsdWRlIDxlcnJu by5oPg0KPiA+PiA+PiArI2luY2x1ZGUgPHJlZ2V4Lmg+DQo+ID4+ID4+ICsjaW5jbHVkZSA8c3Rk bGliLmg+DQo+ID4+ID4+ICsjaW5jbHVkZSA8c3RyaW5nLmg+DQo+ID4+ID4+ICsjaW5jbHVkZSA8 c3lzL2lvY3RsLmg+DQo+ID4+ID4+ICsjaW5jbHVkZSA8c3lzL21tYW4uaD4NCj4gPj4gPj4gKyNp bmNsdWRlIDxzeXMvcXVldWUuaD4NCj4gPj4gPj4gKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPg0K PiA+PiA+PiArI2luY2x1ZGUgPHVuaXN0ZC5oPg0KPiA+PiA+PiArDQo+ID4+ID4+ICsjaW5jbHVk ZSA8cnRlX2F0b21pYy5oPg0KPiA+PiA+PiArI2luY2x1ZGUgPHJ0ZV9wZXJfbGNvcmUuaD4NCj4g Pj4gPj4gKyNpbmNsdWRlIDxydGVfcG11Lmg+DQo+ID4+ID4+ICsjaW5jbHVkZSA8cnRlX3NwaW5s b2NrLmg+DQo+ID4+ID4+ICsjaW5jbHVkZSA8cnRlX3RhaWxxLmg+DQo+ID4+ID4+ICsNCj4gPj4g Pj4gKyNpbmNsdWRlICJwbXVfcHJpdmF0ZS5oIg0KPiA+PiA+PiArDQo+ID4+ID4+ICsjZGVmaW5l IEVWRU5UX1NPVVJDRV9ERVZJQ0VTX1BBVEggIi9zeXMvYnVzL2V2ZW50X3NvdXJjZS9kZXZpY2Vz Ig0KPiA+PiA+PiArDQo+ID4+ID4+ICsjZGVmaW5lIEdFTk1BU0tfVUxMKGgsIGwpICgofjBVTEwg LSAoMVVMTCA8PCAobCkpICsgMSkgJiAofjBVTEwgPj4NCj4gPj4gPj4gKygoNjQgLSAxIC0gKGgp KSkpKSAjZGVmaW5lIEZJRUxEX1BSRVAobSwgdikgKCgodWludDY0X3QpKHYpIDw8DQo+ID4+ID4+ ICsoX19idWlsdGluX2Zmc2xsKG0pIC0gMSkpICYgKG0pKQ0KPiA+PiA+PiArDQo+ID4+ID4+ICtS VEVfREVGSU5FX1BFUl9MQ09SRShzdHJ1Y3QgcnRlX3BtdV9ldmVudF9ncm91cCwgX2V2ZW50X2dy b3VwKTsNCj4gPj4gPj4gK3N0cnVjdCBydGVfcG11IHJ0ZV9wbXU7DQo+ID4+ID4+ICsNCj4gPj4g Pj4gKy8qDQo+ID4+ID4+ICsgKiBGb2xsb3dpbmcgX19ydGVfd2VhayBmdW5jdGlvbnMgcHJvdmlk ZSBkZWZhdWx0IG5vLW9wLg0KPiA+PiA+PiArQXJjaGl0ZWN0dXJlcyBzaG91bGQgb3ZlcnJpZGUg dGhlbSBpZg0KPiA+PiA+PiArICogbmVjZXNzYXJ5Lg0KPiA+PiA+PiArICovDQo+ID4+ID4+ICsN Cj4gPj4gPj4gK2ludA0KPiA+PiA+PiArX19ydGVfd2VhayBwbXVfYXJjaF9pbml0KHZvaWQpDQo+ ID4+ID4+ICt7DQo+ID4+ID4+ICsJcmV0dXJuIDA7DQo+ID4+ID4+ICt9DQo+ID4+ID4+ICsNCj4g Pj4gPj4gK3ZvaWQNCj4gPj4gPj4gK19fcnRlX3dlYWsgcG11X2FyY2hfZmluaSh2b2lkKQ0KPiA+ PiA+PiArew0KPiA+PiA+PiArfQ0KPiA+PiA+PiArDQo+ID4+ID4+ICt2b2lkDQo+ID4+ID4+ICtf X3J0ZV93ZWFrIHBtdV9hcmNoX2ZpeHVwX2NvbmZpZyh1aW50NjRfdCBfX3J0ZV91bnVzZWQgY29u ZmlnWzNdKQ0KPiA+PiA+PiAreyB9DQo+ID4+ID4+ICsNCj4gPj4gPj4gK3N0YXRpYyBpbnQNCj4g Pj4gPj4gK2dldF90ZXJtX2Zvcm1hdChjb25zdCBjaGFyICpuYW1lLCBpbnQgKm51bSwgdWludDY0 X3QgKm1hc2spIHsNCj4gPj4gPj4gKwljaGFyIHBhdGhbUEFUSF9NQVhdOw0KPiA+PiA+PiArCWNo YXIgKmNvbmZpZyA9IE5VTEw7DQo+ID4+ID4+ICsJaW50IGhpZ2gsIGxvdywgcmV0Ow0KPiA+PiA+ PiArCUZJTEUgKmZwOw0KPiA+PiA+PiArDQo+ID4+ID4+ICsJKm51bSA9ICptYXNrID0gMDsNCj4g Pj4gPj4gKwlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIEVWRU5UX1NPVVJDRV9ERVZJQ0VT X1BBVEggIi8lcy9mb3JtYXQvJXMiLCBydGVfcG11Lm5hbWUsDQo+ID5uYW1lKTsNCj4gPj4gPj4g KwlmcCA9IGZvcGVuKHBhdGgsICJyIik7DQo+ID4+ID4+ICsJaWYgKGZwID09IE5VTEwpDQo+ID4+ ID4+ICsJCXJldHVybiAtZXJybm87DQo+ID4+ID4+ICsNCj4gPj4gPj4gKwllcnJubyA9IDA7DQo+ ID4+ID4+ICsJcmV0ID0gZnNjYW5mKGZwLCAiJW1bXjpdOiVkLSVkIiwgJmNvbmZpZywgJmxvdywg JmhpZ2gpOw0KPiA+PiA+PiArCWlmIChyZXQgPCAyKSB7DQo+ID4+ID4+ICsJCXJldCA9IC1FTk9E QVRBOw0KPiA+PiA+PiArCQlnb3RvIG91dDsNCj4gPj4gPj4gKwl9DQo+ID4+ID4+ICsJaWYgKGVy cm5vKSB7DQo+ID4+ID4+ICsJCXJldCA9IC1lcnJubzsNCj4gPj4gPj4gKwkJZ290byBvdXQ7DQo+ ID4+ID4+ICsJfQ0KPiA+PiA+PiArDQo+ID4+ID4+ICsJaWYgKHJldCA9PSAyKQ0KPiA+PiA+PiAr CQloaWdoID0gbG93Ow0KPiA+PiA+PiArDQo+ID4+ID4+ICsJKm1hc2sgPSBHRU5NQVNLX1VMTCho aWdoLCBsb3cpOw0KPiA+PiA+PiArCS8qIExhc3QgZGlnaXQgc2hvdWxkIGJlIFswMTJdLiBJZiBs YXN0IGRpZ2l0IGlzIG1pc3NpbmcgMCBpcyBpbXBsaWVkLiAqLw0KPiA+PiA+PiArCSpudW0gPSBj b25maWdbc3RybGVuKGNvbmZpZykgLSAxXTsNCj4gPj4gPj4gKwkqbnVtID0gaXNkaWdpdCgqbnVt KSA/ICpudW0gLSAnMCcgOiAwOw0KPiA+PiA+PiArDQo+ID4+ID4+ICsJcmV0ID0gMDsNCj4gPj4g Pj4gK291dDoNCj4gPj4gPj4gKwlmcmVlKGNvbmZpZyk7DQo+ID4+ID4+ICsJZmNsb3NlKGZwKTsN Cj4gPj4gPj4gKw0KPiA+PiA+PiArCXJldHVybiByZXQ7DQo+ID4+ID4+ICt9DQo+ID4+ID4+ICsN Cj4gPj4gPj4gK3N0YXRpYyBpbnQNCj4gPj4gPj4gK3BhcnNlX2V2ZW50KGNoYXIgKmJ1ZiwgdWlu dDY0X3QgY29uZmlnWzNdKSB7DQo+ID4+ID4+ICsJY2hhciAqdG9rZW4sICp0ZXJtOw0KPiA+PiA+ PiArCWludCBudW0sIHJldCwgdmFsOw0KPiA+PiA+PiArCXVpbnQ2NF90IG1hc2s7DQo+ID4+ID4+ ICsNCj4gPj4gPj4gKwljb25maWdbMF0gPSBjb25maWdbMV0gPSBjb25maWdbMl0gPSAwOw0KPiA+ PiA+PiArDQo+ID4+ID4+ICsJdG9rZW4gPSBzdHJ0b2soYnVmLCAiLCIpOw0KPiA+PiA+PiArCXdo aWxlICh0b2tlbikgew0KPiA+PiA+PiArCQllcnJubyA9IDA7DQo+ID4+ID4+ICsJCS8qIDx0ZXJt Pj08dmFsdWU+ICovDQo+ID4+ID4+ICsJCXJldCA9IHNzY2FuZih0b2tlbiwgIiVtW149XT0laSIs ICZ0ZXJtLCAmdmFsKTsNCj4gPj4gPj4gKwkJaWYgKHJldCA8IDEpDQo+ID4+ID4+ICsJCQlyZXR1 cm4gLUVOT0RBVEE7DQo+ID4+ID4+ICsJCWlmIChlcnJubykNCj4gPj4gPj4gKwkJCXJldHVybiAt ZXJybm87DQo+ID4+ID4+ICsJCWlmIChyZXQgPT0gMSkNCj4gPj4gPj4gKwkJCXZhbCA9IDE7DQo+ ID4+ID4+ICsNCj4gPj4gPj4gKwkJcmV0ID0gZ2V0X3Rlcm1fZm9ybWF0KHRlcm0sICZudW0sICZt YXNrKTsNCj4gPj4gPj4gKwkJZnJlZSh0ZXJtKTsNCj4gPj4gPj4gKwkJaWYgKHJldCkNCj4gPj4g Pj4gKwkJCXJldHVybiByZXQ7DQo+ID4+ID4+ICsNCj4gPj4gPj4gKwkJY29uZmlnW251bV0gfD0g RklFTERfUFJFUChtYXNrLCB2YWwpOw0KPiA+PiA+PiArCQl0b2tlbiA9IHN0cnRvayhOVUxMLCAi LCIpOw0KPiA+PiA+PiArCX0NCj4gPj4gPj4gKw0KPiA+PiA+PiArCXJldHVybiAwOw0KPiA+PiA+ PiArfQ0KPiA+PiA+PiArDQo+ID4+ID4+ICtzdGF0aWMgaW50DQo+ID4+ID4+ICtnZXRfZXZlbnRf Y29uZmlnKGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQ2NF90IGNvbmZpZ1szXSkgew0KPiA+PiA+PiAr CWNoYXIgcGF0aFtQQVRIX01BWF0sIGJ1ZltCVUZTSVpdOw0KPiA+PiA+PiArCUZJTEUgKmZwOw0K PiA+PiA+PiArCWludCByZXQ7DQo+ID4+ID4+ICsNCj4gPj4gPj4gKwlzbnByaW50ZihwYXRoLCBz aXplb2YocGF0aCksIEVWRU5UX1NPVVJDRV9ERVZJQ0VTX1BBVEggIi8lcy9ldmVudHMvJXMiLCBy dGVfcG11Lm5hbWUsDQo+ID5uYW1lKTsNCj4gPj4gPj4gKwlmcCA9IGZvcGVuKHBhdGgsICJyIik7 DQo+ID4+ID4+ICsJaWYgKGZwID09IE5VTEwpDQo+ID4+ID4+ICsJCXJldHVybiAtZXJybm87DQo+ ID4+ID4+ICsNCj4gPj4gPj4gKwlyZXQgPSBmcmVhZChidWYsIDEsIHNpemVvZihidWYpLCBmcCk7 DQo+ID4+ID4+ICsJaWYgKHJldCA9PSAwKSB7DQo+ID4+ID4+ICsJCWZjbG9zZShmcCk7DQo+ID4+ ID4+ICsNCj4gPj4gPj4gKwkJcmV0dXJuIC1FSU5WQUw7DQo+ID4+ID4+ICsJfQ0KPiA+PiA+PiAr CWZjbG9zZShmcCk7DQo+ID4+ID4+ICsJYnVmW3JldF0gPSAnXDAnOw0KPiA+PiA+PiArDQo+ID4+ ID4+ICsJcmV0dXJuIHBhcnNlX2V2ZW50KGJ1ZiwgY29uZmlnKTsNCj4gPj4gPj4gK30NCj4gPj4g Pj4gKw0KPiA+PiA+PiArc3RhdGljIGludA0KPiA+PiA+PiArZG9fcGVyZl9ldmVudF9vcGVuKHVp bnQ2NF90IGNvbmZpZ1szXSwgaW50IGdyb3VwX2ZkKSB7DQo+ID4+ID4+ICsJc3RydWN0IHBlcmZf ZXZlbnRfYXR0ciBhdHRyID0gew0KPiA+PiA+PiArCQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcGVy Zl9ldmVudF9hdHRyKSwNCj4gPj4gPj4gKwkJLnR5cGUgPSBQRVJGX1RZUEVfUkFXLA0KPiA+PiA+ PiArCQkuZXhjbHVkZV9rZXJuZWwgPSAxLA0KPiA+PiA+PiArCQkuZXhjbHVkZV9odiA9IDEsDQo+ ID4+ID4+ICsJCS5kaXNhYmxlZCA9IDEsDQo+ID4+ID4+ICsJfTsNCj4gPj4gPj4gKw0KPiA+PiA+ PiArCXBtdV9hcmNoX2ZpeHVwX2NvbmZpZyhjb25maWcpOw0KPiA+PiA+PiArDQo+ID4+ID4+ICsJ YXR0ci5jb25maWcgPSBjb25maWdbMF07DQo+ID4+ID4+ICsJYXR0ci5jb25maWcxID0gY29uZmln WzFdOw0KPiA+PiA+PiArCWF0dHIuY29uZmlnMiA9IGNvbmZpZ1syXTsNCj4gPj4gPj4gKw0KPiA+ PiA+PiArCXJldHVybiBzeXNjYWxsKFNZU19wZXJmX2V2ZW50X29wZW4sICZhdHRyLCAwLCAtMSwg Z3JvdXBfZmQsIDApOyB9DQo+ID4+ID4+ICsNCj4gPj4gPj4gK3N0YXRpYyBpbnQNCj4gPj4gPj4g K29wZW5fZXZlbnRzKHN0cnVjdCBydGVfcG11X2V2ZW50X2dyb3VwICpncm91cCkgew0KPiA+PiA+ PiArCXN0cnVjdCBydGVfcG11X2V2ZW50ICpldmVudDsNCj4gPj4gPj4gKwl1aW50NjRfdCBjb25m aWdbM107DQo+ID4+ID4+ICsJaW50IG51bSA9IDAsIHJldDsNCj4gPj4gPj4gKw0KPiA+PiA+PiAr CS8qIGdyb3VwIGxlYWRlciBnZXRzIGNyZWF0ZWQgZmlyc3QsIHdpdGggZmQgPSAtMSAqLw0KPiA+ PiA+PiArCWdyb3VwLT5mZHNbMF0gPSAtMTsNCj4gPj4gPj4gKw0KPiA+PiA+PiArCVRBSUxRX0ZP UkVBQ0goZXZlbnQsICZydGVfcG11LmV2ZW50X2xpc3QsIG5leHQpIHsNCj4gPj4gPj4gKwkJcmV0 ID0gZ2V0X2V2ZW50X2NvbmZpZyhldmVudC0+bmFtZSwgY29uZmlnKTsNCj4gPj4gPj4gKwkJaWYg KHJldCkNCj4gPj4gPj4gKwkJCWNvbnRpbnVlOw0KPiA+PiA+PiArDQo+ID4+ID4+ICsJCXJldCA9 IGRvX3BlcmZfZXZlbnRfb3Blbihjb25maWcsIGdyb3VwLT5mZHNbMF0pOw0KPiA+PiA+PiArCQlp ZiAocmV0ID09IC0xKSB7DQo+ID4+ID4+ICsJCQlyZXQgPSAtZXJybm87DQo+ID4+ID4+ICsJCQln b3RvIG91dDsNCj4gPj4gPj4gKwkJfQ0KPiA+PiA+PiArDQo+ID4+ID4+ICsJCWdyb3VwLT5mZHNb ZXZlbnQtPmluZGV4XSA9IHJldDsNCj4gPj4gPj4gKwkJbnVtKys7DQo+ID4+ID4+ICsJfQ0KPiA+ PiA+PiArDQo+ID4+ID4+ICsJcmV0dXJuIDA7DQo+ID4+ID4+ICtvdXQ6DQo+ID4+ID4+ICsJZm9y ICgtLW51bTsgbnVtID49IDA7IG51bS0tKSB7DQo+ID4+ID4+ICsJCWNsb3NlKGdyb3VwLT5mZHNb bnVtXSk7DQo+ID4+ID4+ICsJCWdyb3VwLT5mZHNbbnVtXSA9IC0xOw0KPiA+PiA+PiArCX0NCj4g Pj4gPj4gKw0KPiA+PiA+PiArDQo+ID4+ID4+ICsJcmV0dXJuIHJldDsNCj4gPj4gPj4gK30NCj4g Pj4gPj4gKw0KPiA+PiA+PiArc3RhdGljIGludA0KPiA+PiA+PiArbW1hcF9ldmVudHMoc3RydWN0 IHJ0ZV9wbXVfZXZlbnRfZ3JvdXAgKmdyb3VwKSB7DQo+ID4+ID4+ICsJbG9uZyBwYWdlX3NpemUg PSBzeXNjb25mKF9TQ19QQUdFX1NJWkUpOw0KPiA+PiA+PiArCXVuc2lnbmVkIGludCBpOw0KPiA+ PiA+PiArCXZvaWQgKmFkZHI7DQo+ID4+ID4+ICsJaW50IHJldDsNCj4gPj4gPj4gKw0KPiA+PiA+ PiArCWZvciAoaSA9IDA7IGkgPCBydGVfcG11Lm51bV9ncm91cF9ldmVudHM7IGkrKykgew0KPiA+ PiA+PiArCQlhZGRyID0gbW1hcCgwLCBwYWdlX3NpemUsIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwg Z3JvdXAtPmZkc1tpXSwgMCk7DQo+ID4+ID4+ICsJCWlmIChhZGRyID09IE1BUF9GQUlMRUQpIHsN Cj4gPj4gPj4gKwkJCXJldCA9IC1lcnJubzsNCj4gPj4gPj4gKwkJCWdvdG8gb3V0Ow0KPiA+PiA+ PiArCQl9DQo+ID4+ID4+ICsNCj4gPj4gPj4gKwkJZ3JvdXAtPm1tYXBfcGFnZXNbaV0gPSBhZGRy Ow0KPiA+PiA+PiArCQlpZiAoIWdyb3VwLT5tbWFwX3BhZ2VzW2ldLT5jYXBfdXNlcl9yZHBtYykg ew0KPiA+PiA+PiArCQkJcmV0ID0gLUVQRVJNOw0KPiA+PiA+PiArCQkJZ290byBvdXQ7DQo+ID4+ ID4+ICsJCX0NCj4gPj4gPj4gKwl9DQo+ID4+ID4+ICsNCj4gPj4gPj4gKwlyZXR1cm4gMDsNCj4g Pj4gPj4gK291dDoNCj4gPj4gPj4gKwlmb3IgKDsgaTsgaS0tKSB7DQo+ID4+ID4+ICsJCW11bm1h cChncm91cC0+bW1hcF9wYWdlc1tpIC0gMV0sIHBhZ2Vfc2l6ZSk7DQo+ID4+ID4+ICsJCWdyb3Vw LT5tbWFwX3BhZ2VzW2kgLSAxXSA9IE5VTEw7DQo+ID4+ID4+ICsJfQ0KPiA+PiA+PiArDQo+ID4+ ID4+ICsJcmV0dXJuIHJldDsNCj4gPj4gPj4gK30NCj4gPj4gPj4gKw0KPiA+PiA+PiArc3RhdGlj IHZvaWQNCj4gPj4gPj4gK2NsZWFudXBfZXZlbnRzKHN0cnVjdCBydGVfcG11X2V2ZW50X2dyb3Vw ICpncm91cCkgew0KPiA+PiA+PiArCXVuc2lnbmVkIGludCBpOw0KPiA+PiA+PiArDQo+ID4+ID4+ ICsJaWYgKGdyb3VwLT5mZHNbMF0gIT0gLTEpDQo+ID4+ID4+ICsJCWlvY3RsKGdyb3VwLT5mZHNb MF0sIFBFUkZfRVZFTlRfSU9DX0RJU0FCTEUsDQo+ID4+ID4+ICtQRVJGX0lPQ19GTEFHX0dST1VQ KTsNCj4gPj4gPj4gKw0KPiA+PiA+PiArCWZvciAoaSA9IDA7IGkgPCBydGVfcG11Lm51bV9ncm91 cF9ldmVudHM7IGkrKykgew0KPiA+PiA+PiArCQlpZiAoZ3JvdXAtPm1tYXBfcGFnZXNbaV0pIHsN Cj4gPj4gPj4gKwkJCW11bm1hcChncm91cC0+bW1hcF9wYWdlc1tpXSwgc3lzY29uZihfU0NfUEFH RV9TSVpFKSk7DQo+ID4+ID4+ICsJCQlncm91cC0+bW1hcF9wYWdlc1tpXSA9IE5VTEw7DQo+ID4+ ID4+ICsJCX0NCj4gPj4gPj4gKw0KPiA+PiA+PiArCQlpZiAoZ3JvdXAtPmZkc1tpXSAhPSAtMSkg ew0KPiA+PiA+PiArCQkJY2xvc2UoZ3JvdXAtPmZkc1tpXSk7DQo+ID4+ID4+ICsJCQlncm91cC0+ ZmRzW2ldID0gLTE7DQo+ID4+ID4+ICsJCX0NCj4gPj4gPj4gKwl9DQo+ID4+ID4+ICsNCj4gPj4g Pj4gKwlncm91cC0+ZW5hYmxlZCA9IGZhbHNlOw0KPiA+PiA+PiArfQ0KPiA+PiA+PiArDQo+ID4+ ID4+ICtpbnQNCj4gPj4gPj4gK19fcnRlX3BtdV9lbmFibGVfZ3JvdXAodm9pZCkNCj4gPj4gPj4g K3sNCj4gPj4gPj4gKwlzdHJ1Y3QgcnRlX3BtdV9ldmVudF9ncm91cCAqZ3JvdXAgPSAmUlRFX1BF Ul9MQ09SRShfZXZlbnRfZ3JvdXApOw0KPiA+PiA+PiArCWludCByZXQ7DQo+ID4+ID4+ICsNCj4g Pj4gPj4gKwlpZiAocnRlX3BtdS5udW1fZ3JvdXBfZXZlbnRzID09IDApDQo+ID4+ID4+ICsJCXJl dHVybiAtRU5PREVWOw0KPiA+PiA+PiArDQo+ID4+ID4+ICsJcmV0ID0gb3Blbl9ldmVudHMoZ3Jv dXApOw0KPiA+PiA+PiArCWlmIChyZXQpDQo+ID4+ID4+ICsJCWdvdG8gb3V0Ow0KPiA+PiA+PiAr DQo+ID4+ID4+ICsJcmV0ID0gbW1hcF9ldmVudHMoZ3JvdXApOw0KPiA+PiA+PiArCWlmIChyZXQp DQo+ID4+ID4+ICsJCWdvdG8gb3V0Ow0KPiA+PiA+PiArDQo+ID4+ID4+ICsJaWYgKGlvY3RsKGdy b3VwLT5mZHNbMF0sIFBFUkZfRVZFTlRfSU9DX1JFU0VULCBQRVJGX0lPQ19GTEFHX0dST1VQKSA9 PSAtMSkgew0KPiA+PiA+PiArCQlyZXQgPSAtZXJybm87DQo+ID4+ID4+ICsJCWdvdG8gb3V0Ow0K PiA+PiA+PiArCX0NCj4gPj4gPj4gKw0KPiA+PiA+PiArCWlmIChpb2N0bChncm91cC0+ZmRzWzBd LCBQRVJGX0VWRU5UX0lPQ19FTkFCTEUsIFBFUkZfSU9DX0ZMQUdfR1JPVVApID09IC0xKSB7DQo+ ID4+ID4+ICsJCXJldCA9IC1lcnJubzsNCj4gPj4gPj4gKwkJZ290byBvdXQ7DQo+ID4+ID4+ICsJ fQ0KPiA+PiA+PiArDQo+ID4+ID4+ICsJcnRlX3NwaW5sb2NrX2xvY2soJnJ0ZV9wbXUubG9jayk7 DQo+ID4+ID4+ICsJVEFJTFFfSU5TRVJUX1RBSUwoJnJ0ZV9wbXUuZXZlbnRfZ3JvdXBfbGlzdCwg Z3JvdXAsIG5leHQpOw0KPiA+PiA+DQo+ID4+ID5IbW0uLiBzbyB3ZSBpbnNlcnQgcG9pbnRlciB0 byBUTFMgdmFyaWFibGUgaW50byB0aGUgZ2xvYmFsIGxpc3Q/DQo+ID4+ID5Xb25kZXIgd2hhdCB3 b3VsZCBoYXBwZW4gaWYgdGhhdCB0aHJlYWQgZ2V0IHRlcm1pbmF0ZWQ/DQo+ID4+DQo+ID4+IE5v dGhpbmcgc3BlY2lhbC4gQW55IHBvaW50ZXJzIHRvIHRoYXQgdGhyZWFkLWxvY2FsIGluIHRoYXQg dGhyZWFkIGFyZSBpbnZhbGlkZWQuDQo+ID4+DQo+ID4+ID5DYW4gbWVtb3J5IGZyb20gaXRzIFRM UyBibG9jayBnZXQgcmUtdXNlZCAoYnkgb3RoZXIgdGhyZWFkIG9yIGZvciBvdGhlciBwdXJwb3Nl cyk/DQo+ID4+ID4NCj4gPj4NCj4gPj4gV2h5IHdvdWxkIGFueSBvdGhlciB0aHJlYWQgcmV1c2Ug dGhhdD8NCj4gPj4gRXZlbnR1YWxseSBtYWluIHRocmVhZCB3aWxsIG5lZWQgdGhhdCBkYXRhIHRv IGRvIHRoZSBjbGVhbnVwLg0KPiA+DQo+ID5JIHVuZGVyc3RhbmQgdGhhdCBtYWluIHRocmVhZCB3 b3VsZCBuZWVkIHRvIGFjY2VzcyB0aGF0IGRhdGEuDQo+ID5JIGFtIG5vdCBzdXJlIHRoYXQgaXQg d291bGQgYmUgYWJsZSB0by4NCj4gPkltYWdpbmUgdGhyZWFkIGNhbGxzIHJ0ZV9wbXVfcmVhZCgu Li4pIGFuZCB0aGVuIHRlcm1pbmF0ZXMsIHdoaWxlIHByb2dyYW0gY29udGludWVzIHRvIHJ1bi4N Cj4gPkFzIEkgdW5kZXJzdGFuZCBhZGRyZXNzIG9mIGl0cyBSVEVfUEVSX0xDT1JFKF9ldmVudF9n cm91cCkgd2lsbCBzdGlsbCByZW1haW4gaW4NCj4gPnJ0ZV9wbXUuZXZlbnRfZ3JvdXBfbGlzdCwg ZXZlbiBpZiBpdCBpcyBwcm9iYWJseSBub3QgdmFsaWQgYW55IG1vcmUuDQo+ID4NCj4gDQo+IE9r YXkgZ290IHlvdXIgcG9pbnQuIEluIERQREsgdGhhdCB3aWxsIG5vdCBoYXBwZW4uIFdlIGRvIG5v dCBzcGF3bi9raWxsIGxjb3JlcyBpbiBydW50aW1lLg0KDQpXZWxsLCB5ZXMgdXN1YWxseSBEUERL IGFwcCBkb2Vzbid0IGRvIHRoYXQsIGJ1dCBpbiB0aGVvcnkgdGhlcmUgaXMgYW4gQVBJIHRvIHJl Z2lzdGVyL3VucmVnaXN0ZXINCm5vbi1lYWwgdGhyZWFkcyBhcyBsY29yZXM6IHJ0ZV90aHJlYWRf cmVnaXN0ZXIoKS9ydGVfdGhyZWFkX3VucmVnaXN0ZXIoKS4NCkFsc28gYmVzaWRlcyBvZiBsY29y ZXMgdGhlcmUgYXJlIGNvbnRyb2wgdGhyZWFkcywgc29tZSBob3VzZS1rZWVwaW5nIHRocmVhZHMs IHBsdXMgdXNlciBpcyBmcmVlDQp0byBzcGF3bi9raWxsIGhpcyBvd24gdGhyZWFkcy4NCkFyZSB5 b3Ugc2F5aW5nIHRoYXQgdGhpcyBsaWJyYXJ5IGRvZXNuJ3Qgc3VwcG9ydCBub25lIG9mIHRoZW0/ DQpJZiBzbywgdGhlbiBhdCBsZWFzdCB0aGF0IHNob3VsZCBiZSB2ZXJ5IGNsZWFybHkgZG9jdW1l bnRlZC4NClRob3VnaCBJIHRoaW5rIGEgcHJvcGVyIHdheSBpcyAgaGFuZGxlIHRoaXMgc2l0dWF0 aW9uIHNvbWVob3cgLQ0KZWl0aGVyIHJldHVybiBlcnJvciBhdCBfX3J0ZV9wbXVfZW5hYmxlX2dy b3VwKCksIG9yIGNoYW5nZSB0aGUgY29kZSB0byBhbGxvdyBpdCB0byB3b3JrDQpwcm9wZXJseSBm cm9tIGFueSB0aHJlYWQuIEkgZG9uJ3QgdGhpbmsgaXQgaXMgdGhhdCBoYXJkLg0KDQo+IEluIG90 aGVyIHNjZW5hcmlvcyBzdWNoIGFwcHJvYWNoIHdpbGwgbm90IHdvcmsgYmVjYXVzZSBvbmNlIHRo cmVhZCB0ZXJtaW5hdGVzIGl0J3MgcGVyLXRocmVhZC1kYXRhDQo+IGJlY29tZXMgaW52YWxpZC4N Cj4gDQo+ID4+ID4NCj4gPj4gPj4gKwlydGVfc3BpbmxvY2tfdW5sb2NrKCZydGVfcG11LmxvY2sp Ow0KPiA+PiA+PiArCWdyb3VwLT5lbmFibGVkID0gdHJ1ZTsNCj4gPj4gPj4gKw0KPiA+PiA+PiAr CXJldHVybiAwOw0KPiA+PiA+PiArDQo+ID4+ID4+ICtvdXQ6DQo+ID4+ID4+ICsJY2xlYW51cF9l dmVudHMoZ3JvdXApOw0KPiA+PiA+PiArDQo+ID4+ID4+ICsJcmV0dXJuIHJldDsNCj4gPj4gPj4g K30NCj4gPj4gPj4gKw0KPiA+PiA+PiArc3RhdGljIGludA0KPiA+PiA+PiArc2Nhbl9wbXVzKHZv aWQpDQo+ID4+ID4+ICt7DQo+ID4+ID4+ICsJY2hhciBwYXRoW1BBVEhfTUFYXTsNCj4gPj4gPj4g KwlzdHJ1Y3QgZGlyZW50ICpkZW50Ow0KPiA+PiA+PiArCWNvbnN0IGNoYXIgKm5hbWU7DQo+ID4+ ID4+ICsJRElSICpkaXJwOw0KPiA+PiA+PiArDQo+ID4+ID4+ICsJZGlycCA9IG9wZW5kaXIoRVZF TlRfU09VUkNFX0RFVklDRVNfUEFUSCk7DQo+ID4+ID4+ICsJaWYgKGRpcnAgPT0gTlVMTCkNCj4g Pj4gPj4gKwkJcmV0dXJuIC1lcnJubzsNCj4gPj4gPj4gKw0KPiA+PiA+PiArCXdoaWxlICgoZGVu dCA9IHJlYWRkaXIoZGlycCkpKSB7DQo+ID4+ID4+ICsJCW5hbWUgPSBkZW50LT5kX25hbWU7DQo+ ID4+ID4+ICsJCWlmIChuYW1lWzBdID09ICcuJykNCj4gPj4gPj4gKwkJCWNvbnRpbnVlOw0KPiA+ PiA+PiArDQo+ID4+ID4+ICsJCS8qIHN5c2ZzIGVudHJ5IHNob3VsZCBlaXRoZXIgY29udGFpbiBj cHVzIG9yIGJlIGEgY3B1ICovDQo+ID4+ID4+ICsJCWlmICghc3RyY21wKG5hbWUsICJjcHUiKSkN Cj4gPj4gPj4gKwkJCWJyZWFrOw0KPiA+PiA+PiArDQo+ID4+ID4+ICsJCXNucHJpbnRmKHBhdGgs IHNpemVvZihwYXRoKSwgRVZFTlRfU09VUkNFX0RFVklDRVNfUEFUSCAiLyVzL2NwdXMiLCBuYW1l KTsNCj4gPj4gPj4gKwkJaWYgKGFjY2VzcyhwYXRoLCBGX09LKSA9PSAwKQ0KPiA+PiA+PiArCQkJ YnJlYWs7DQo+ID4+ID4+ICsJfQ0KPiA+PiA+PiArDQo+ID4+ID4+ICsJaWYgKGRlbnQpIHsNCj4g Pj4gPj4gKwkJcnRlX3BtdS5uYW1lID0gc3RyZHVwKG5hbWUpOw0KPiA+PiA+PiArCQlpZiAocnRl X3BtdS5uYW1lID09IE5VTEwpIHsNCj4gPj4gPj4gKwkJCWNsb3NlZGlyKGRpcnApOw0KPiA+PiA+ PiArDQo+ID4+ID4+ICsJCQlyZXR1cm4gLUVOT01FTTsNCj4gPj4gPj4gKwkJfQ0KPiA+PiA+PiAr CX0NCj4gPj4gPj4gKw0KPiA+PiA+PiArCWNsb3NlZGlyKGRpcnApOw0KPiA+PiA+PiArDQo+ID4+ ID4+ICsJcmV0dXJuIHJ0ZV9wbXUubmFtZSA/IDAgOiAtRU5PREVWOyB9DQo+ID4+ID4+ICsNCj4g Pj4gPj4gK3N0YXRpYyBzdHJ1Y3QgcnRlX3BtdV9ldmVudCAqDQo+ID4+ID4+ICtuZXdfZXZlbnQo Y29uc3QgY2hhciAqbmFtZSkNCj4gPj4gPj4gK3sNCj4gPj4gPj4gKwlzdHJ1Y3QgcnRlX3BtdV9l dmVudCAqZXZlbnQ7DQo+ID4+ID4+ICsNCj4gPj4gPj4gKwlldmVudCA9IGNhbGxvYygxLCBzaXpl b2YoKmV2ZW50KSk7DQo+ID4+ID4+ICsJaWYgKGV2ZW50ID09IE5VTEwpDQo+ID4+ID4+ICsJCWdv dG8gb3V0Ow0KPiA+PiA+PiArDQo+ID4+ID4+ICsJZXZlbnQtPm5hbWUgPSBzdHJkdXAobmFtZSk7 DQo+ID4+ID4+ICsJaWYgKGV2ZW50LT5uYW1lID09IE5VTEwpIHsNCj4gPj4gPj4gKwkJZnJlZShl dmVudCk7DQo+ID4+ID4+ICsJCWV2ZW50ID0gTlVMTDsNCj4gPj4gPj4gKwl9DQo+ID4+ID4+ICsN Cj4gPj4gPj4gK291dDoNCj4gPj4gPj4gKwlyZXR1cm4gZXZlbnQ7DQo+ID4+ID4+ICt9DQo+ID4+ ID4+ICsNCj4gPj4gPj4gK3N0YXRpYyB2b2lkDQo+ID4+ID4+ICtmcmVlX2V2ZW50KHN0cnVjdCBy dGVfcG11X2V2ZW50ICpldmVudCkgew0KPiA+PiA+PiArCWZyZWUoZXZlbnQtPm5hbWUpOw0KPiA+ PiA+PiArCWZyZWUoZXZlbnQpOw0KPiA+PiA+PiArfQ0KPiA+PiA+PiArDQo+ID4+ID4+ICtpbnQN Cj4gPj4gPj4gK3J0ZV9wbXVfYWRkX2V2ZW50KGNvbnN0IGNoYXIgKm5hbWUpIHsNCj4gPj4gPj4g KwlzdHJ1Y3QgcnRlX3BtdV9ldmVudCAqZXZlbnQ7DQo+ID4+ID4+ICsJY2hhciBwYXRoW1BBVEhf TUFYXTsNCj4gPj4gPj4gKw0KPiA+PiA+PiArCWlmIChydGVfcG11Lm5hbWUgPT0gTlVMTCkNCj4g Pj4gPj4gKwkJcmV0dXJuIC1FTk9ERVY7DQo+ID4+ID4+ICsNCj4gPj4gPj4gKwlpZiAocnRlX3Bt dS5udW1fZ3JvdXBfZXZlbnRzICsgMSA+PSBNQVhfTlVNX0dST1VQX0VWRU5UUykNCj4gPj4gPj4g KwkJcmV0dXJuIC1FTk9TUEM7DQo+ID4+ID4+ICsNCj4gPj4gPj4gKwlzbnByaW50ZihwYXRoLCBz aXplb2YocGF0aCksIEVWRU5UX1NPVVJDRV9ERVZJQ0VTX1BBVEggIi8lcy9ldmVudHMvJXMiLCBy dGVfcG11Lm5hbWUsDQo+ID5uYW1lKTsNCj4gPj4gPj4gKwlpZiAoYWNjZXNzKHBhdGgsIFJfT0sp KQ0KPiA+PiA+PiArCQlyZXR1cm4gLUVOT0RFVjsNCj4gPj4gPj4gKw0KPiA+PiA+PiArCVRBSUxR X0ZPUkVBQ0goZXZlbnQsICZydGVfcG11LmV2ZW50X2xpc3QsIG5leHQpIHsNCj4gPj4gPj4gKwkJ aWYgKCFzdHJjbXAoZXZlbnQtPm5hbWUsIG5hbWUpKQ0KPiA+PiA+PiArCQkJcmV0dXJuIGV2ZW50 LT5pbmRleDsNCj4gPj4gPj4gKwkJY29udGludWU7DQo+ID4+ID4+ICsJfQ0KPiA+PiA+PiArDQo+ ID4+ID4+ICsJZXZlbnQgPSBuZXdfZXZlbnQobmFtZSk7DQo+ID4+ID4+ICsJaWYgKGV2ZW50ID09 IE5VTEwpDQo+ID4+ID4+ICsJCXJldHVybiAtRU5PTUVNOw0KPiA+PiA+PiArDQo+ID4+ID4+ICsJ ZXZlbnQtPmluZGV4ID0gcnRlX3BtdS5udW1fZ3JvdXBfZXZlbnRzKys7DQo+ID4+ID4+ICsJVEFJ TFFfSU5TRVJUX1RBSUwoJnJ0ZV9wbXUuZXZlbnRfbGlzdCwgZXZlbnQsIG5leHQpOw0KPiA+PiA+ PiArDQo+ID4+ID4+ICsJcmV0dXJuIGV2ZW50LT5pbmRleDsNCj4gPj4gPj4gK30NCj4gPj4gPj4g Kw0KPiA+PiA+PiAraW50DQo+ID4+ID4+ICtydGVfcG11X2luaXQodm9pZCkNCj4gPj4gPj4gK3sN Cj4gPj4gPj4gKwlpbnQgcmV0Ow0KPiA+PiA+PiArDQo+ID4+ID4+ICsJLyogQWxsb3cgY2FsbGlu ZyBpbml0IGZyb20gbXVsdGlwbGUgY29udGV4dHMgd2l0aGluIGEgc2luZ2xlIHRocmVhZC4gVGhp cyBzaW1wbGlmaWVzDQo+ID4+ID4+ICsJICogcmVzb3VyY2UgbWFuYWdlbWVudCBhIGJpdCBlLmcg aW4gY2FzZSBmYXN0LXBhdGggdHJhY2Vwb2ludCBoYXMgYWxyZWFkeSBiZWVuIGVuYWJsZWQNCj4g Pj4gPj4gKwkgKiB2aWEgY29tbWFuZCBsaW5lIGJ1dCBhcHBsaWNhdGlvbiBkb2Vzbid0IGNhcmUg ZW5vdWdoIGFuZCBwZXJmb3JtcyBpbml0L2ZpbmkgYWdhaW4uDQo+ID4+ID4+ICsJICovDQo+ID4+ ID4+ICsJaWYgKHJ0ZV9wbXUuaW5pdGlhbGl6ZWQgIT0gMCkgew0KPiA+PiA+PiArCQlydGVfcG11 LmluaXRpYWxpemVkKys7DQo+ID4+ID4+ICsJCXJldHVybiAwOw0KPiA+PiA+PiArCX0NCj4gPj4g Pj4gKw0KPiA+PiA+PiArCXJldCA9IHNjYW5fcG11cygpOw0KPiA+PiA+PiArCWlmIChyZXQpDQo+ ID4+ID4+ICsJCWdvdG8gb3V0Ow0KPiA+PiA+PiArDQo+ID4+ID4+ICsJcmV0ID0gcG11X2FyY2hf aW5pdCgpOw0KPiA+PiA+PiArCWlmIChyZXQpDQo+ID4+ID4+ICsJCWdvdG8gb3V0Ow0KPiA+PiA+ PiArDQo+ID4+ID4+ICsJVEFJTFFfSU5JVCgmcnRlX3BtdS5ldmVudF9saXN0KTsNCj4gPj4gPj4g KwlUQUlMUV9JTklUKCZydGVfcG11LmV2ZW50X2dyb3VwX2xpc3QpOw0KPiA+PiA+PiArCXJ0ZV9z cGlubG9ja19pbml0KCZydGVfcG11LmxvY2spOw0KPiA+PiA+PiArCXJ0ZV9wbXUuaW5pdGlhbGl6 ZWQgPSAxOw0KPiA+PiA+PiArDQo+ID4+ID4+ICsJcmV0dXJuIDA7DQo+ID4+ID4+ICtvdXQ6DQo+ ID4+ID4+ICsJZnJlZShydGVfcG11Lm5hbWUpOw0KPiA+PiA+PiArCXJ0ZV9wbXUubmFtZSA9IE5V TEw7DQo+ID4+ID4+ICsNCj4gPj4gPj4gKwlyZXR1cm4gcmV0Ow0KPiA+PiA+PiArfQ0KPiA+PiA+ PiArDQo+ID4+ID4+ICt2b2lkDQo+ID4+ID4+ICtydGVfcG11X2Zpbmkodm9pZCkNCj4gPj4gPj4g K3sNCj4gPj4gPj4gKwlzdHJ1Y3QgcnRlX3BtdV9ldmVudF9ncm91cCAqZ3JvdXAsICp0bXBfZ3Jv dXA7DQo+ID4+ID4+ICsJc3RydWN0IHJ0ZV9wbXVfZXZlbnQgKmV2ZW50LCAqdG1wX2V2ZW50Ow0K PiA+PiA+PiArDQo+ID4+ID4+ICsJLyogY2xlYW51cCBvbmNlIGluaXQgY291bnQgZHJvcHMgdG8g emVybyAqLw0KPiA+PiA+PiArCWlmIChydGVfcG11LmluaXRpYWxpemVkID09IDAgfHwgLS1ydGVf cG11LmluaXRpYWxpemVkICE9IDApDQo+ID4+ID4+ICsJCXJldHVybjsNCj4gPj4gPj4gKw0KPiA+ PiA+PiArCVJURV9UQUlMUV9GT1JFQUNIX1NBRkUoZXZlbnQsICZydGVfcG11LmV2ZW50X2xpc3Qs IG5leHQsIHRtcF9ldmVudCkgew0KPiA+PiA+PiArCQlUQUlMUV9SRU1PVkUoJnJ0ZV9wbXUuZXZl bnRfbGlzdCwgZXZlbnQsIG5leHQpOw0KPiA+PiA+PiArCQlmcmVlX2V2ZW50KGV2ZW50KTsNCj4g Pj4gPj4gKwl9DQo+ID4+ID4+ICsNCj4gPj4gPj4gKwlSVEVfVEFJTFFfRk9SRUFDSF9TQUZFKGdy b3VwLCAmcnRlX3BtdS5ldmVudF9ncm91cF9saXN0LCBuZXh0LCB0bXBfZ3JvdXApIHsNCj4gPj4g Pj4gKwkJVEFJTFFfUkVNT1ZFKCZydGVfcG11LmV2ZW50X2dyb3VwX2xpc3QsIGdyb3VwLCBuZXh0 KTsNCj4gPj4gPj4gKwkJY2xlYW51cF9ldmVudHMoZ3JvdXApOw0KPiA+PiA+PiArCX0NCj4gPj4g Pj4gKw0KPiA+PiA+PiArCXBtdV9hcmNoX2ZpbmkoKTsNCj4gPj4gPj4gKwlmcmVlKHJ0ZV9wbXUu bmFtZSk7DQo+ID4+ID4+ICsJcnRlX3BtdS5uYW1lID0gTlVMTDsNCj4gPj4gPj4gKwlydGVfcG11 Lm51bV9ncm91cF9ldmVudHMgPSAwOw0KPiA+PiA+PiArfQ0KPiA+PiA+PiBkaWZmIC0tZ2l0IGEv bGliL3BtdS9ydGVfcG11LmggYi9saWIvcG11L3J0ZV9wbXUuaCBuZXcgZmlsZSBtb2RlDQo+ID4+ ID4+IDEwMDY0NCBpbmRleCAwMDAwMDAwMDAwLi42YjY2NGMzMzM2DQo+ID4+ID4+IC0tLSAvZGV2 L251bGwNCj4gPj4gPj4gKysrIGIvbGliL3BtdS9ydGVfcG11LmgNCj4gPj4gPj4gQEAgLTAsMCAr MSwyMTIgQEANCj4gPj4gPj4gKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1 c2UNCj4gPj4gPj4gKyAqIENvcHlyaWdodChjKSAyMDIzIE1hcnZlbGwNCj4gPj4gPj4gKyAqLw0K PiA+PiA+PiArDQo+ID4+ID4+ICsjaWZuZGVmIF9SVEVfUE1VX0hfDQo+ID4+ID4+ICsjZGVmaW5l IF9SVEVfUE1VX0hfDQo+ID4+ID4+ICsNCj4gPj4gPj4gKy8qKg0KPiA+PiA+PiArICogQGZpbGUN Cj4gPj4gPj4gKyAqDQo+ID4+ID4+ICsgKiBQTVUgZXZlbnQgdHJhY2luZyBvcGVyYXRpb25zDQo+ ID4+ID4+ICsgKg0KPiA+PiA+PiArICogVGhpcyBmaWxlIGRlZmluZXMgZ2VuZXJpYyBBUEkgYW5k IHR5cGVzIG5lY2Vzc2FyeSB0byBzZXR1cCBQTVUNCj4gPj4gPj4gK2FuZA0KPiA+PiA+PiArICog cmVhZCBzZWxlY3RlZCBjb3VudGVycyBpbiBydW50aW1lLg0KPiA+PiA+PiArICovDQo+ID4+ID4+ ICsNCj4gPj4gPj4gKyNpZmRlZiBfX2NwbHVzcGx1cw0KPiA+PiA+PiArZXh0ZXJuICJDIiB7DQo+ ID4+ID4+ICsjZW5kaWYNCj4gPj4gPj4gKw0KPiA+PiA+PiArI2luY2x1ZGUgPGxpbnV4L3BlcmZf ZXZlbnQuaD4NCj4gPj4gPj4gKw0KPiA+PiA+PiArI2luY2x1ZGUgPHJ0ZV9hdG9taWMuaD4NCj4g Pj4gPj4gKyNpbmNsdWRlIDxydGVfYnJhbmNoX3ByZWRpY3Rpb24uaD4gI2luY2x1ZGUgPHJ0ZV9j b21tb24uaD4NCj4gPj4gPj4gKyNpbmNsdWRlIDxydGVfY29tcGF0Lmg+ICNpbmNsdWRlIDxydGVf c3BpbmxvY2suaD4NCj4gPj4gPj4gKw0KPiA+PiA+PiArLyoqIE1heGltdW0gbnVtYmVyIG9mIGV2 ZW50cyBpbiBhIGdyb3VwICovICNkZWZpbmUNCj4gPj4gPj4gK01BWF9OVU1fR1JPVVBfRVZFTlRT IDgNCj4gPj4gPg0KPiA+PiA+Zm9yZ290IFJURV8gcHJlZml4Lg0KPiA+PiA+SW4gZmFjdCwgZG8g eW91IHJlYWxseSBuZWVkIG51bWJlciBvZiBldmVudHMgaW4gZ3JvdXAgdG8gYmUgaGFyZC1jb2Rl ZD8NCj4gPj4gPkNvdWxkbid0IG1tYXBfcGFnZXNbXSBhbmQgZmRzW10gYmUgYWxsb2NhdGVkIGR5 bmFtaWNhbGx5IGJ5IGVuYWJsZV9ncm91cCgpPw0KPiA+PiA+DQo+ID4+DQo+ID4+IDggaXMgcmVh c29uYWJsZSBudW1iZXIgSSB0aGluay4gWDg2L0FSTSBoYXZlIGFjdHVhbGx5IGxlc3MgdGhhdCB0 aGF0ICh3YXMgdGhhdCBzb21ldGhpbmcgbGlrZQ0KPiA+ND8pLg0KPiA+PiBNb3Jlb3ZlciBldmVu dHMgYXJlIHNjaGVkdWxlZCBhcyBhIGdyb3VwIHNvIHRoZXJlIG11c3QgYmUgZW5vdWdoIGh3DQo+ ID4+IGNvdW50ZXJzIGF2YWlsYWJsZSBmb3IgdGhhdCB0byBzdWNjZWVkLiBTbyB0aGlzIG51bWJl ciBzaG91bGQgY292ZXIgY3VycmVudCBuZWVkcy4NCj4gPg0KPiA+SWYgeW91IHRoaW5rIDggd2ls bCBiZSBlbm91Z2ggdG8gY292ZXIgYWxsIHBvc3NpYmxlIGZ1dHVyZSBjYXNlcyAtIEkgYW0gb2sg ZWl0aGVyIHdheS4NCj4gPlN0aWxsIG5lZWQgUlRFXyBwcmVmaXggZm9yIGl0Lg0KPiA+DQo+IA0K PiBPa2F5IHRoYXQgY2FuIGJlIGFkZGVkLg0KPiANCj4gPj4gPj4gKw0KPiA+PiA+PiArLyoqDQo+ ID4+ID4+ICsgKiBBIHN0cnVjdHVyZSBkZXNjcmliaW5nIGEgZ3JvdXAgb2YgZXZlbnRzLg0KPiA+ PiA+PiArICovDQo+ID4+ID4+ICtzdHJ1Y3QgcnRlX3BtdV9ldmVudF9ncm91cCB7DQo+ID4+ID4+ ICsJc3RydWN0IHBlcmZfZXZlbnRfbW1hcF9wYWdlICptbWFwX3BhZ2VzW01BWF9OVU1fR1JPVVBf RVZFTlRTXTsgLyoqPCBhcnJheSBvZiB1c2VyIHBhZ2VzDQo+ID4qLw0KPiA+PiA+PiArCWludCBm ZHNbTUFYX05VTV9HUk9VUF9FVkVOVFNdOyAvKio8IGFycmF5IG9mIGV2ZW50IGRlc2NyaXB0b3Jz ICovDQo+ID4+ID4+ICsJYm9vbCBlbmFibGVkOyAvKio8IHRydWUgaWYgZ3JvdXAgd2FzIGVuYWJs ZWQgb24gcGFydGljdWxhciBsY29yZSAqLw0KPiA+PiA+PiArCVRBSUxRX0VOVFJZKHJ0ZV9wbXVf ZXZlbnRfZ3JvdXApIG5leHQ7IC8qKjwgbGlzdCBlbnRyeSAqLyB9DQo+ID4+ID4+ICtfX3J0ZV9j YWNoZV9hbGlnbmVkOw0KPiA+PiA+PiArDQo+ID4+ID4NCj4gPj4gPkV2ZW4gaWYgd2UnZCBkZWNp ZGUgdG8ga2VlcCBydGVfcG11X3JlYWQoKSBhcyBzdGF0aWMgaW5saW5lIChzdGlsbA0KPiA+PiA+ bm90IHN1cmUgaXQgaXMgYSBnb29kIGlkZWEpLA0KPiA+Pg0KPiA+PiBXZSB3YW50IHRvIHNhdmUg YXMgbXVjaCBjcHUgY3ljbGVzIGFzIHdlIHBvc3NpYmx5IGNhbiBhbmQgaW5saW5pbmcNCj4gPj4g ZG9lcyBoZWxwcyBpbiB0aGF0IG1hdHRlci4NCj4gPg0KPiA+T2ssIHNvIGFza2luZyBzYW1lIHF1 ZXN0aW9uIGZyb20gZGlmZmVyZW50IHRocmVhZDogaG93IG1hbnkgY3ljbGVzIGl0IHdpbGwgc2F2 ZT8NCj4gPldoYXQgaXMgdGhlIGRpZmZlcmVuY2UgaW4gdGVybXMgb2YgcGVyZm9ybWFuY2Ugd2hl biB5b3UgaGF2ZSB0aGlzIGZ1bmN0aW9uIGlubGluZWQgdnMgbm90IGlubGluZWQ/DQo+ID4NCj4g DQo+IE9uIHg4NiBzZXR1cCB3aGljaCBpcyBub3QgdW5kZXIgbG9hZCwgbm8gY3B1c2V0cyBjb25m aWd1cmVkLCBldGMgKmp1c3QqIG5vdCBpbmxpbmluZyBydGVfcG11X3JlYWQoKQ0KPiBkZWNyZWFz ZXMgcGVyZm9ybWFuY2UgYnkgcm91Z2hseSAyNCUgKDQ0IHZzIDU4IGNwdSBjeWNsZXMpLiBBdCBs ZWFzdCB0aGF0IGlzIHJlcG9ydGVkIGJ5DQo+IHRyYWNlX3BlcmZfYXV0b3Rlc3QuDQoNCkZyb20g bXkgcGVyc3BlY3RpdmUgMTQgY3ljbGVzIGlzIG5vdCB0aGF0IG11Y2guLi4NCkNvbnNpZGVyaW5n IHRoYXQgdXNlciB3aWxsIHByb2JhYmx5IG5vdCBjYWxsIGl0IHZlcnkgb2Z0ZW4sIGFuZCBieSBl bmFibGluZyBtZWFzdXJlbWVudHMgaGUNCnByb2JhYmx5IGFscmVhZHkgcHJlcGFyZWQgdG8gZ2V0 IHNvbWUgaGl0LiANCg0KPiANCj4gPj4gPndoeSB0aGVzZSB0d28gc3RydWN0IGJlbG93IChydGVf cG11X2V2ZW50IGFuZCBydGVfcG11KSBoYXZlIHRvIGJlIHB1YmxpYz8NCj4gPj4gPkkgdGhpbmsg Ym90aCBjYW4gYmUgc2FmZWx5IG1vdmVkIGF3YXkgZnJvbSBwdWJsaWMgaGVhZGVycy4NCj4gPj4g Pg0KPiA+Pg0KPiA+PiBzdHJ1Y3QgcnRlX3BtdV9ldmVudCBjYW4gYmUgaGlkZGVuIEkgZ3Vlc3Mu DQo+ID4+IHN0cnVjdCBydGVfcG11IGlzIHVzZWQgaW4gdGhpcyBoZWFkZXIgaGVuY2UgY2Fubm90 IGJlIG1vdmVkIGVsc2V3aGVyZS4NCj4gPg0KPiA+Tm90IHN1cmUgd2h5Pw0KPiA+SXMgdGhhdCBi ZWNhdXNlIHlvdSB1c2UgaXQgaW5zaWRlIHJ0ZV9wbXVfcmVhZCgpPw0KPiA+QnV0IHRoYXQgY2hl Y2sgSSB0aGluayBjYW4gYmUgc2FmZWx5IG1vdmVkIGludG8gX19ydGVfcG11X2VuYWJsZV9ncm91 cCgpIG9yIHByb2JhYmx5IGV2ZW4gaW50bw0KPiA+cnRlX3BtdV9hZGRfZXZlbnQoKS4NCj4gDQo+ IE5vLCB3ZSBzaG91bGQgbm90IGRvIHRoYXQuIE90aGVyd2lzZSB3ZSdsbCBuZWVkIHRvIGNhbGwg ZnVuY3Rpb24uIEV2ZW4gdGhvdWdoIGNoZWNrIHdpbGwgaGFwcGVuDQo+IGVhcmx5IG9uIHN0aWxs IGZ1bmN0aW9uIHByb2xvZ3VlL2VwaWxvZ3VlIHdpbGwgaGFwcGVuLiBUaGlzIHRha2VzIGN5Y2xl cy4NCg0KTm90IG5lY2Vzc2FyeS4gWW91IGNhbiBzdG9yZSB0aGlzIHZhbHVlIGluIHBtdV9ncm91 cCBpdHNlbGYsDQphbmQgYnkgdGhpcyB2YWx1ZSBkZWNpZGUgaXMgcG11IGFuZCBncm91cCBpbml0 aWFsaXplZCwgZXRjLiAgIA0KIA0KPiA+DQo+ID4+ID4NCj4gPj4gPj4gKy8qKg0KPiA+PiA+PiAr ICogQSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhbiBldmVudC4NCj4gPj4gPj4gKyAqLw0KPiA+PiA+ PiArc3RydWN0IHJ0ZV9wbXVfZXZlbnQgew0KPiA+PiA+PiArCWNoYXIgKm5hbWU7IC8qKjwgbmFt ZSBvZiBhbiBldmVudCAqLw0KPiA+PiA+PiArCXVuc2lnbmVkIGludCBpbmRleDsgLyoqPCBldmVu dCBpbmRleCBpbnRvIGZkcy9tbWFwX3BhZ2VzICovDQo+ID4+ID4+ICsJVEFJTFFfRU5UUlkocnRl X3BtdV9ldmVudCkgbmV4dDsgLyoqPCBsaXN0IGVudHJ5ICovIH07DQo+ID4+ID4NCj4gPj4gPj4g Kw0KPiA+PiA+PiArLyoqDQo+ID4+ID4+ICsgKiBBIFBNVSBzdGF0ZSBjb250YWluZXIuDQo+ID4+ ID4+ICsgKi8NCj4gPj4gPj4gK3N0cnVjdCBydGVfcG11IHsNCj4gPj4gPj4gKwljaGFyICpuYW1l OyAvKio8IG5hbWUgb2YgY29yZSBQTVUgbGlzdGVkIHVuZGVyIC9zeXMvYnVzL2V2ZW50X3NvdXJj ZS9kZXZpY2VzICovDQo+ID4+ID4+ICsJcnRlX3NwaW5sb2NrX3QgbG9jazsgLyoqPCBzZXJpYWxp emUgYWNjZXNzIHRvIGV2ZW50IGdyb3VwIGxpc3QgKi8NCj4gPj4gPj4gKwlUQUlMUV9IRUFEKCwg cnRlX3BtdV9ldmVudF9ncm91cCkgZXZlbnRfZ3JvdXBfbGlzdDsgLyoqPCBsaXN0IG9mIGV2ZW50 IGdyb3VwcyAqLw0KPiA+PiA+PiArCXVuc2lnbmVkIGludCBudW1fZ3JvdXBfZXZlbnRzOyAvKio8 IG51bWJlciBvZiBldmVudHMgaW4gYSBncm91cCAqLw0KPiA+PiA+PiArCVRBSUxRX0hFQUQoLCBy dGVfcG11X2V2ZW50KSBldmVudF9saXN0OyAvKio8IGxpc3Qgb2YgbWF0Y2hpbmcgZXZlbnRzICov DQo+ID4+ID4+ICsJdW5zaWduZWQgaW50IGluaXRpYWxpemVkOyAvKio8IGluaXRpYWxpemF0aW9u IGNvdW50ZXIgKi8gfTsNCj4gPj4gPj4gKw0KPiA+PiA+PiArLyoqIGxjb3JlIGV2ZW50IGdyb3Vw ICovDQo+ID4+ID4+ICtSVEVfREVDTEFSRV9QRVJfTENPUkUoc3RydWN0IHJ0ZV9wbXVfZXZlbnRf Z3JvdXAsIF9ldmVudF9ncm91cCk7DQo+ID4+ID4+ICsNCj4gPj4gPj4gKy8qKiBQTVUgc3RhdGUg Y29udGFpbmVyICovDQo+ID4+ID4+ICtleHRlcm4gc3RydWN0IHJ0ZV9wbXUgcnRlX3BtdTsNCj4g Pj4gPj4gKw0KPiA+PiA+PiArLyoqIEVhY2ggYXJjaGl0ZWN0dXJlIHN1cHBvcnRpbmcgUE1VIG5l ZWRzIHRvIHByb3ZpZGUgaXRzIG93bg0KPiA+PiA+PiArdmVyc2lvbiAqLyAjaWZuZGVmIHJ0ZV9w bXVfcG1jX3JlYWQgI2RlZmluZQ0KPiA+PiA+PiArcnRlX3BtdV9wbWNfcmVhZChpbmRleCkgKHsg MDsgfSkgI2VuZGlmDQo+ID4+ID4+ICsNCj4gPj4gPj4gKy8qKg0KPiA+PiA+PiArICogQHdhcm5p bmcNCj4gPj4gPj4gKyAqIEBiIEVYUEVSSU1FTlRBTDogdGhpcyBBUEkgbWF5IGNoYW5nZSB3aXRo b3V0IHByaW9yIG5vdGljZQ0KPiA+PiA+PiArICoNCj4gPj4gPj4gKyAqIFJlYWQgUE1VIGNvdW50 ZXIuDQo+ID4+ID4+ICsgKg0KPiA+PiA+PiArICogQHdhcm5pbmcgVGhpcyBzaG91bGQgYmUgbm90 IGNhbGxlZCBkaXJlY3RseS4NCj4gPj4gPj4gKyAqDQo+ID4+ID4+ICsgKiBAcGFyYW0gcGMNCj4g Pj4gPj4gKyAqICAgUG9pbnRlciB0byB0aGUgbW1hcHBlZCB1c2VyIHBhZ2UuDQo+ID4+ID4+ICsg KiBAcmV0dXJuDQo+ID4+ID4+ICsgKiAgIENvdW50ZXIgdmFsdWUgcmVhZCBmcm9tIGhhcmR3YXJl Lg0KPiA+PiA+PiArICovDQo+ID4+ID4+ICtzdGF0aWMgX19ydGVfYWx3YXlzX2lubGluZSB1aW50 NjRfdCBfX3J0ZV9wbXVfcmVhZF91c2VycGFnZShzdHJ1Y3QNCj4gPj4gPj4gK3BlcmZfZXZlbnRf bW1hcF9wYWdlICpwYykgew0KPiA+PiA+PiArCXVpbnQ2NF90IHdpZHRoLCBvZmZzZXQ7DQo+ID4+ ID4+ICsJdWludDMyX3Qgc2VxLCBpbmRleDsNCj4gPj4gPj4gKwlpbnQ2NF90IHBtYzsNCj4gPj4g Pj4gKw0KPiA+PiA+PiArCWZvciAoOzspIHsNCj4gPj4gPj4gKwkJc2VxID0gcGMtPmxvY2s7DQo+ ID4+ID4+ICsJCXJ0ZV9jb21waWxlcl9iYXJyaWVyKCk7DQo+ID4+ID4+ICsJCWluZGV4ID0gcGMt PmluZGV4Ow0KPiA+PiA+PiArCQlvZmZzZXQgPSBwYy0+b2Zmc2V0Ow0KPiA+PiA+PiArCQl3aWR0 aCA9IHBjLT5wbWNfd2lkdGg7DQo+ID4+ID4+ICsNCj4gPj4gPj4gKwkJLyogaW5kZXggc2V0IHRv IDAgbWVhbnMgdGhhdCBwYXJ0aWN1bGFyIGNvdW50ZXIgY2Fubm90IGJlIHVzZWQgKi8NCj4gPj4g Pj4gKwkJaWYgKGxpa2VseShwYy0+Y2FwX3VzZXJfcmRwbWMgJiYgaW5kZXgpKSB7DQo+ID4+ID4N Cj4gPj4gPkluIG1tYXBfZXZlbnRzKCkgeW91IHJldHVybiBFUEVSTSBpZiBjYXBfdXNlcl9yZHBt YyBpcyBub3QgZW5hYmxlZC4NCj4gPj4gPkRvIHlvdSBuZWVkIGFub3RoZXIgY2hlY2sgaGVyZT8g T3IgdGhpcyBjYXBhYmlsaXR5IGNhbiBiZSBkaXNhYmxlZCBieQ0KPiA+PiA+a2VybmVsIGF0IHJ1 bi10aW1lPw0KPiA+PiA+DQo+ID4+DQo+ID4+IFRoYXQgZXh0cmEgY2hlY2sgaW4gbW1hcF9ldmVu dCgpIG1heSBiZSByZW1vdmVkIGFjdHVhbGx5LiBTb21lIGFyY2hzDQo+ID4+IGFsbG93IGRpc2Fi bGluZyByZWFkaW5nIHJkcG1jIChJIHRoaW5rIHRoYXQgb24geDg2IG9uZSBjYW4gZG8gdGhhdCkg c28gdGhpcyBjaGVjayBuZWVkcyB0byBzdGF5Lg0KPiA+Pg0KPiA+PiA+DQo+ID4+ID4+ICsJCQlw bWMgPSBydGVfcG11X3BtY19yZWFkKGluZGV4IC0gMSk7DQo+ID4+ID4+ICsJCQlwbWMgPDw9IDY0 IC0gd2lkdGg7DQo+ID4+ID4+ICsJCQlwbWMgPj49IDY0IC0gd2lkdGg7DQo+ID4+ID4+ICsJCQlv ZmZzZXQgKz0gcG1jOw0KPiA+PiA+PiArCQl9DQo+ID4+ID4+ICsNCj4gPj4gPj4gKwkJcnRlX2Nv bXBpbGVyX2JhcnJpZXIoKTsNCj4gPj4gPj4gKw0KPiA+PiA+PiArCQlpZiAobGlrZWx5KHBjLT5s b2NrID09IHNlcSkpDQo+ID4+ID4+ICsJCQlyZXR1cm4gb2Zmc2V0Ow0KPiA+PiA+PiArCX0NCj4g Pj4gPj4gKw0KPiA+PiA+PiArCXJldHVybiAwOw0KPiA+PiA+PiArfQ0KPiA+PiA+PiArDQo+ID4+ ID4+ICsvKioNCj4gPj4gPj4gKyAqIEB3YXJuaW5nDQo+ID4+ID4+ICsgKiBAYiBFWFBFUklNRU5U QUw6IHRoaXMgQVBJIG1heSBjaGFuZ2Ugd2l0aG91dCBwcmlvciBub3RpY2UNCj4gPj4gPj4gKyAq DQo+ID4+ID4+ICsgKiBFbmFibGUgZ3JvdXAgb2YgZXZlbnRzIG9uIHRoZSBjYWxsaW5nIGxjb3Jl Lg0KPiA+PiA+PiArICoNCj4gPj4gPj4gKyAqIEB3YXJuaW5nIFRoaXMgc2hvdWxkIGJlIG5vdCBj YWxsZWQgZGlyZWN0bHkuDQo+ID4+ID4NCj4gPj4gPl9fcnRlX2ludGVybmFsID8NCj4gPj4gPg0K PiA+Pg0KPiA+PiBObyB0aGlzIGNhbm5vdCBiZSBpbnRlcm5hbCBiZWNhdXNlIHRoYXQgd2lsbCBt YWtlIGZ1bmN0aW9ucyBjYWxsaW5nIGl0DQo+ID4+IGludGVybmFsIGFzIHdlbGwgaGVuY2UgYXBw cyB3b24ndCBiZSBhYmxlIHRvIHVzZSB0aGF0LiBUaGlzIGhhcw0KPiA+PiBhbHJlYWR5IGJlZW4g YnJvdWdodCB1cCBieSBvbmUgb2YgdGhlIHJldmlld2Vycy4NCj4gPg0KPiA+T2ssIHRoZW4gd2Ug cHJvYmFibHkgY2FuIG1hcmsgaXQgd2l0aCAnIEBpbnRlcm5hbCcgdGFnIGluIGZvcm1hbCBjb21t ZW50cz8NCj4gPg0KPiANCj4gSSBhZGRlZCBhIHdhcm5pbmcgbm90IHRvIGNhbGwgdGhhdCBkaXJl Y3RseS4gU2luY2UgZnVuY3Rpb24gaXMgbm90IGludGVybmFsIChpbiBEUERLIHBhcmxhbmNlKSBw ZXIgc2UNCj4gSSBkb27igJl0IHRoaW5rIHdlIHNob3VsZCBhZGQgbW9yZSBjb25mdXNpb24gdGhh dCBleHRyYSB0YWcuDQoNCldlIGRvaW5nIGl0IGluIG90aGVyIHBsYWNlcywgd2h5IG5vdCB0byBh ZGQgaXQgaGVyZT8gDQogDQo+ID4+DQo+ID4+ID4+ICsgKg0KPiA+PiA+PiArICogQHJldHVybg0K PiA+PiA+PiArICogICAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3 aXNlLg0KPiA+PiA+PiArICovDQo+ID4+ID4+ICtfX3J0ZV9leHBlcmltZW50YWwNCj4gPj4gPj4g K2ludA0KPiA+PiA+PiArX19ydGVfcG11X2VuYWJsZV9ncm91cCh2b2lkKTsNCj4gPj4gPj4gKw0K PiA+PiA+PiArLyoqDQo+ID4+ID4+ICsgKiBAd2FybmluZw0KPiA+PiA+PiArICogQGIgRVhQRVJJ TUVOVEFMOiB0aGlzIEFQSSBtYXkgY2hhbmdlIHdpdGhvdXQgcHJpb3Igbm90aWNlDQo+ID4+ID4+ ICsgKg0KPiA+PiA+PiArICogSW5pdGlhbGl6ZSBQTVUgbGlicmFyeS4NCj4gPj4gPj4gKyAqDQo+ ID4+ID4+ICsgKiBAd2FybmluZyBUaGlzIHNob3VsZCBiZSBub3QgY2FsbGVkIGRpcmVjdGx5Lg0K PiA+PiA+DQo+ID4+ID5IbW0uLiB0aGVuIHdobyBzaG91bGQgY2FsbCBpdD8NCj4gPj4gPklmIGl0 IG5vdCBzdXBwb3NlZCB0byBiZSBjYWxsZWQgZGlyZWN0bHksIHdoeSB0byBkZWNsYXJlIGl0IGhl cmU/DQo+ID4+ID4NCj4gPj4NCj4gPj4gVGhpcyBpcyBpbmxpbmVkIGFuZCBoYXMgb25lIGNhbGxl ciBpLmUgcnRlX3BtdV9yZWFkKCkuDQo+ID4NCj4gPkkgdGhvdWdodCB3ZSBhcmUgdGFsa2luZyBo ZXJlIGFib3V0IHJ0ZV9wbXVfaW5pdCgpLg0KPiA+SSBkb24ndCBzZWUgd2hlcmUgaXQgaXMgaW5s aW5lZCBhbmQgc3RpbGwgbm90IGNsZWFyIHdoeSBpdCBjYW4ndCBiZSBjYWxsZWQgZGlyZWN0bHku DQo+ID4NCj4gDQo+IE5vIHRoaXMgY2Fubm90IGJlIGNhbGxlZCBieSBpbml0IGJlY2F1c2UgZ3Jv dXBzIGFyZSBjb25maWd1cmVkIGluIHJ1bnRpbWUuIFRoYXQgaXMgd2h5DQo+IF9fcnRlX3BtdV9l bmFibGVfZ3JvdXAoKSBpcyBjYWxsZWQgb25jZSBpbiBydGVfcG11X3JlYWQoKS4NCj4gDQo+ICpP dGhlciogY29kZSBzaG91bGQgbm90IGNhbGwgdGhhdCBkaXJlY3RseS4gQW5kIHllcywgdGhhdCBp cyBub3QgaW5saW5lZCAtIG15IG1pc3Rha2UuDQoNCk9uY2UgYWdhaW46IHdlIGFyZSBkaXNjdXNz aW5nIGNvbW1lbnRzIGZvciBydGVfcG11X2luaXQoKSBmdW5jdGlvbi4NCldoeSBpdCBjYW4ndCBi ZSBjYWxsZWQgZGlyZWN0bHk/DQpJbiB0ZXN0X3BtdV9yZWFkKCkgeW91IGRvIGNhbGwgaXQgZGly ZWN0bHkuDQogDQo+ID4+ID4+ICsgKg0KPiA+PiA+PiArICogQHJldHVybg0KPiA+PiA+PiArICog ICAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLg0KPiA+PiA+ PiArICovDQo+ID4+ID4NCj4gPj4gPlByb2JhYmx5IHdvcnRoIHRvIG1lbnRpb24gdGhhdCB0aGlz IGZ1bmN0aW9uIGlzIG5vdCBNVCBzYWZlLg0KPiA+PiA+U2FtZSBmb3IgX2ZpbmlfIGFuZCBhZGRf ZXZlbnQuDQo+ID4+ID5BbHNvIHdvcnRoIHRvIG1lbnRpb24gdGhhdCBhbGwgY29udHJvbC1wYXRo IGZ1bmN0aW9ucw0KPiA+PiA+KGluaXQvZmluaS9hZGRfZXZlbnQpIGFuZCBkYXRhLXBhdGggKHBt dV9yZWFkKSBjYW4ndCBiZSBjYWxsZWQgY29uY3VycmVudGx5Lg0KPiA+PiA+DQo+ID4+DQo+ID4+ IFllcyB0aGV5IGFyZSBtZWFudCB0byBiZSBjYWxsZWQgZnJvbSBtYWluIHRocmVhZC4NCj4gPg0K PiA+T2ssIHRoZW4gcGxlYXNlIGFkZCB0aGF0IGludG8gZm9ybWFsIEFQSSBjb21tZW50cy4NCj4g Pg0KPiA+PiA+PiArX19ydGVfZXhwZXJpbWVudGFsDQo+ID4+ID4+ICtpbnQNCj4gPj4gPj4gK3J0 ZV9wbXVfaW5pdCh2b2lkKTsNCj4gPj4gPj4gKw0K