From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Koenig, Christian" Subject: Re: [PATCH 2/2] drm/amdgpu: use ring buffer for fault handling on GMC 9 Date: Fri, 1 Feb 2019 17:06:27 +0000 Message-ID: <53b36000-a3fc-372a-bf8b-161fd8635398@amd.com> References: <20190124125256.9900-1-christian.koenig@amd.com> <20190124125256.9900-2-christian.koenig@amd.com> <39534cbd-d199-8a3d-2a8b-51f9d09e06e0@amd.com> <540f3688-6382-2cd1-f24c-aa378e7f596f@gmail.com> <1ca341ae-1502-6c02-bac4-6bb36d687083@amd.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1ca341ae-1502-6c02-bac4-6bb36d687083-5C7GfCeVMHo@public.gmane.org> Content-Language: en-US Content-ID: <8598CF081C644F4896BE055499557C79-asWib9pRmPqcE4WynfumptQqCkab/8FMAL8bYrjMMd8@public.gmane.org> 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: "Kuehling, Felix" , "amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org" Cc: "Yang, Philip" QW0gMDEuMDIuMTkgdW0gMTc6NDIgc2NocmllYiBLdWVobGluZywgRmVsaXg6DQo+IE9uIDIwMTkt MDItMDEgODoyMyBhLm0uLCBDaHJpc3RpYW4gS8O2bmlnIHdyb3RlOg0KPj4gSGkgRmVsaXgsDQo+ Pg0KPj4gQW0gMzEuMDEuMTkgdW0gMjI6Mzggc2NocmllYiBLdWVobGluZywgRmVsaXg6DQo+Pj4g SSBkb24ndCBzZWUgaG93IHRoaXMgc29sdmVzIGFueXRoaW5nLiBZb3UnbGwgc3RpbGwgbmVlZCB0 byByZW1vdmUNCj4+PiBlbnRyaWVzIGZyb20gdGhpcyBmYXVsdCByaW5nIGJ1ZmZlci4gT3RoZXJ3 aXNlIHlvdSdsbCBpZ25vcmUgZmF1bHRzIGZvcg0KPj4+IGFkZHJlc3NlcyB0aGF0IGhhdmUgZmF1 bHRlZCByZWNlbnRseSwgYWx0aG91Z2ggaXQgbWF5IGJlIGEgbmV3IGZhdWx0Lg0KPj4+DQo+Pj4g QWxzbywgdGhpcyByZWludHJvZHVjZXMgaW50ZXJydXB0IHN0b3JtcyBhbmQgcmVwZWF0ZWQgcHJv Y2Vzc2luZyBvZiB0aGUNCj4+PiBzYW1lIGZhdWx0IGluIGNhc2VzIHdoZXJlIHdlIGhhdmUgbW9y ZSB0aGFuIDY0IGRpc3RpbmN0IGFkZHJlc3Nlcw0KPj4+IGZhdWx0aW5nIGF0IG9uY2UuDQo+PiBZ ZWFoLCB0aGlzIGlzIG5vdCBtZWFudCB0byBiZSBhIHBlcmZlY3Qgc29sdXRpb24uIEl0IGp1c3Qg d29ya3MgZm9yIG5vdy4NCj4+DQo+PiBLZXkgcG9pbnQgaXMgdGhhdCBmcm9tIG15IGV4cGVyaWVu Y2UgdGhlIGhhcmR3YXJlIG5ldmVyIGZhdWx0cyBtb3JlDQo+PiB0aGFuIDI2IGRpZmZlcmVudCBh ZGRyZXNzZXMgYXQgdGhlIHNhbWUgdGltZSAoYW5kIG5vdCB0aGUgc2xpZ2h0ZXN0DQo+PiBpZGVh IHdoZXJlIHRoaXMgcmVzdHJpY3Rpb24gY29tZXMgZnJvbSkuDQo+IFRoYXQgY291bGQgYmUgc3Bl Y2lmaWMgdG8gdGhlIHRlc3QgeW91J3JlIHJ1bm5pbmcuIElmIGl0IG9ubHkgdXNlcyAyNiBvcg0K PiBsZXNzIHBhZ2VzIHBlciBkcmF3IG9wZXJhdGlvbiwgeW91IHdvbid0IGdldCBtb3JlIGFkZHJl c3NlcyBmYXVsdGluZyBhdA0KPiB0aGUgc2FtZSB0aW1lLiBJJ20gYWxtb3N0IGNlcnRhaW4gY29t cHV0ZSBhcHBzIGNhbiBjcmVhdGUgbW9yZQ0KPiBvdXRzdGFuZGluZyBwYWdlIGZhdWx0cyB3aXRo IGxhcmdlIGRhdGEgc2V0cy4NCg0KTXkgdGVzdCB1c2VzIGEgY29tcHV0ZSBzdWJtaXNzaW9uIHdo aWNoIGNsZWFycyBhIDRNQiBiaWcgdGV4dHVyZSBhbmQgc28gDQpjYXVzZXMgZXhhY3RseSAxMDI0 IGRpZmZlcmVudCBmYXVsdHMuDQoNCkl0IHdhcyBhY3R1YWxseSBvbmUgb2YgeW91ciBjb21tZW50 cyB3aGljaCBwdXNoZWQgbWUgdG93YXJkcyB0aGlzIHNvbHV0aW9uLg0KDQpTaW5jZSB0aGUgaGFy ZHdhcmUgaXMgb25seSBsaW1pdGVkIGNhcGFibGUgb2Ygc3dpdGNoaW5nIHRvIG90aGVyIHRocmVh ZHMgDQp0aGUgbnVtYmVyIG9mIGZhdWx0cyB5b3UgY2FuIGhhdmUgaW4gdGhlIGhhcmR3YXJlIHF1 ZXVlIGlzIGFjdHVhbGx5IA0KcXVpdGUgbGltaXRlZC4NCg0KQnV0IEkgdG90YWxseSBhZ3JlZSB0 aGF0IDY0IGlzIG1vc3QgbGlrZWx5IG5vdCBzdWZmaWNpZW50LiBUaGUgcmVhbCANCnZhbHVlIGlz IHByb2JhYmx5IHNvbWV0aGluZyBiZXR3ZWVuIDI1NiBhbmQgMTAyNC4NCg0KPj4gU28gd2l0aCA2 NCBkaXN0aW5jdCBhZGRyZXNzZXMgd2Ugc2hvdWxkIGJlIG9uIHRoZSBzYWZlIHNpZGUuDQo+IEkg dGhpbmsgUGhpbGlwIGhhcyBzZWVuIG1vcmUgZmF1bHRzIGF0IHRoZSBzYW1lIHRpbWUgd2l0aCBo aXMgdGVzdHMuDQo+IFBoaWxpcCwgY2FuIHlvdSBjb25maXJtLg0KPg0KPg0KPj4gV2hhdCBjYW4g b2J2aW91c2x5IGhhcHBlbiBpcyB0aGF0IGhhcmR3YXJlIGZhdWx0cyBhZGRyZXNzIEEsIHdlIHNl cnZlDQo+PiB0aGF0IG9uZSwgT1MgZXZpY3RzIHBhZ2UgYXQgYWRkcmVzcyBBLCBidXQgYWRkcmVz cyBBIGlzIHN0aWxsIGluIHRoZQ0KPj4gZmF1bHQgaGFuZGxpbmcgYW5kIHdlIG5ldmVyIG5vdGlj ZSB0aGF0IGl0IGlzIGZhdWx0ZWQgb25jZSBtb3JlLg0KPiBFeGFjdGx5LiBUaGF0J3MgbXkgY29u Y2Vybi4NCg0KWWVhaCwgYnV0IHRoYXQncyBoYW5kbGUgYWJsZS4gSW4gb3RoZXIgd29yZHMgd2hl biB0aGUgT1MgaXMgaW52YWxpZGF0aW5nIA0KYSBwYWdlIHdlIG5lZWQgdG8gZmx1c2ggdGhlIFRM QiBhbnl3YXksIGZsdXNoaW5nIHRob3NlIGxvY2t1cCBlbnRyaWVzIG9uIA0KdG9wIGlzIHRyaXZp YWwuDQoNCj4+PiBJIHRoaW5rIHRoZSBzb2x1dGlvbiBzaG91bGQgYmUgZGlmZmVyZW50LiBXZSBk byBuZWVkIGEgd2F5IHRvIGlnbm9yZQ0KPj4+IGR1cGxpY2F0ZSBmYXVsdHMgZm9yIHRoZSBzYW1l IGFkZHJlc3MuIFRoZSBwcm9ibGVtIHlvdSByYW4gaW50byB3YXMgdGhhdA0KPj4+IGFmdGVyIGNs ZWFyaW5nIGFuIGVudHJ5LCB5b3UgZ2V0IGFkZGl0aW9uYWwgaW50ZXJydXB0cyBmb3IgdGhlIHNh bWUNCj4+PiBhZGRyZXNzLiBUaGlzIGNvdWxkIGJlIGhhbmRsZWQgYnkga2VlcGluZyB0cmFjayBv ZiB0aGUgYWdlIG9mIElIIHJpbmcNCj4+PiBlbnRyaWVzLiBBZnRlciB3ZSB1cGRhdGUgdGhlIHBh Z2UgdGFibGUgYW5kIGZsdXNoIFRMQnMsIHRoZXJlIG1heSBzdGlsbA0KPj4+IGJlIHN0YWxlIGVu dHJpZXMgaW4gdGhlIElIIHJpbmcuIEJ1dCBubyBuZXcgaW50ZXJydXB0cyBzaG91bGQgYmUNCj4+ PiBnZW5lcmF0ZWQgKHVudGlsIHRoYXQgUFRFIGlzIGludmFsaWRhdGVkIGFnYWluKS4gU28gd2Ug Y2FuIGNoZWNrIHRoZQ0KPj4+IGN1cnJlbnQgSUggd3B0ci4gV2hlbiBJSCBwcm9jZXNzaW5nIChy cHRyKSBoYXMgY2F1Z2h0IHVwIHRvIHRoYXQgdmFsdWUsDQo+Pj4gYWxsIHRoZSBzdGFsZSByZXRy eSBpbnRlcnJ1cHRzIGhhdmUgYmVlbiBmbHVzaGVkLCBhbmQgd2UgY2FuIHJlbW92ZSB0aGUNCj4+ PiBlbnRyeSBmcm9tIHRoZSBoYXNoIHRhYmxlIChvciByaW5nIGJ1ZmZlcikuIEFueSBzdWJzZXF1 ZW50IGludGVycnVwdHMNCj4+PiBmb3IgdGhlIHNhbWUgYWRkcmVzcyBhcmUgbmV3IGFuZCBzaG91 bGQgYmUgaGFuZGxlZCBhZ2Fpbi4NCj4+IFRoYXQncyB3aGF0IEkgdGhvdWdodCBpbml0aWFsbHkg YXMgd2VsbCwgYnV0IHRoZSBwcm9ibGVtIGlzIHRoaXMgaGFzDQo+PiBhYnNvbHV0ZWx5IG5vdGhp bmcgdG9kbyB3aXRoIHRoZSBJSCByaW5nIGJ1ZmZlciBzaXplLg0KPj4NCj4+IFNlZSB0aGUgSUgg cmluZyBpcyBvbmx5IDMyIGVudHJpZXMsIGJ1dCBpbiBteSB0ZXN0cyBJJ3ZlIHNvbWV0aW1lcyBn b3QNCj4+PiAyMDAgc3RhbGUgZmF1bHRzIGZyb20gdGhlIGhhcmR3YXJlLg0KPj4gVGhlIGV4cGxh bmF0aW9uIGlzIHRoYXQgSSByZWNlbnRseSBsZWFybmVkIGZyb20gdGhlIGhhcmR3YXJlIGd1eXMg dGhhdA0KPj4gdGhlIFZBIGZpZm8gb2YgdGhlIFNETUEgaXMgMjU2IGVudHJpZXMgbG9uZyEgQW5k IEkgc3VzcGVjdCB0aGF0IHRoZQ0KPj4gR0ZYIGZpZm8gaXMgbm90IHNob3J0ZXIuDQo+Pg0KPj4g VG8gbWFrZSB0aGUgc2l0dWF0aW9uIGV2ZW4gd29yc2UgSSBoYXZlIGEgbmljZSBsb2cgd2hlcmUg YSByZW5kZXJpbmcNCj4+IG9wZXJhdGlvbiBjb21wbGV0ZWQgKHdpdGggaW50ZXJydXB0IGFuZCBl dmVyeXRoaW5nIGZpbmlzaGVkKSwNCj4+IGFjY29yZGluZyB0byB0aGUgcmVnaXN0ZXJzIHRoZSBH RlggYmxvY2sgaXMgY29tcGxldGVseSBpZGxlIGFuZCB5b3UNCj4+IGFyZSBzdGlsbCBnZXR0aW5n IGh1bmRyZWRzIG9mIHN0YWxlIGZhdWx0cyBmb3IgdGhpcyBvcGVyYXRpb24uDQo+Pg0KPj4gTmlj ZSBpc24ndCBpdD8gU28gd2UgY2FuIGNlcnRhaW5seSBub3QgdGllIHRoaXMgdG8gdGhlIFZNIG9y IHdlIGFyZQ0KPj4gZ29pbmcgdG8gbmVlZCBzb21lIGdyYWNlIHBlcmlvZCBiZWZvcmUgZGVzdHJv eWluZyBWTXMgb3Igc29tZXRoaW5nDQo+PiBsaWtlIHRoaXMuDQo+IERhbW4uIFRoZXJlIGlzIHRo ZSBhc3BlY3Qgb2YgaG93IHRvIGhhbmRsZSBWTSBkZXN0cnVjdGlvbi4gQnV0IGFsc28gdGhlDQo+ IHF1ZXN0aW9uIG9mIHdoZW4gdG8gcmVtb3ZlIGVudHJpZXMgZnJvbSB0aGUgaGFzaCB0YWJsZSBv ciBhIHJpbmcgYnVmZmVyLg0KPiBXZSBrbm93IHdoZW4gd2UgaW52YWxpZGF0ZSBwYWdlIHRhYmxl IGVudHJpZXMsIHNvIHRoYXQgY291bGQgYmUgYSBnb29kDQo+IHRpbWUgdG8gcmVtb3ZlIGVudHJp ZXMgYW5kIGFsbG93IG5ldyBwYWdlIGZhdWx0cyBmb3IgdGhlIGFkZHJlc3MgaW4NCj4gcXVlc3Rp b24uIEJ1dCBsZXRzIHRha2UgYSBzdGVwIGJhY2sgaGVyZS4NCj4NCj4gVGhlIGNvbnNlcXVlbmNl IG9mIHRob3NlIHVucHJlZGljdGFibGUgc3RhbGUgcGFnZSBmYXVsdHMgaXMsIGFuDQo+IGludGVy cnVwdCBtZWFucyB0aGF0IHRoZXJlIG1heSBvciBtYXkgbm90IGJlIGEgdmFsaWQgcmVhc29uIHRv IHVwZGF0ZQ0KPiB0aGUgcGFnZSB0YWJsZS4gV2hldGhlciBvciBub3QgdGhlIGRyaXZlciBuZWVk cyB0byBkbyBhbnl0aGluZyB3aWxsIG5lZWQNCj4gdG8gYmUgZGV0ZXJtaW5lZCBub3QganVzdCBi YXNlZCBvbiB0aGUgaW50ZXJydXB0LCBidXQgYmFzZWQgb24gdGhlDQo+IGRyaXZlcidzIGtub3ds ZWRnZSBvZiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcGFnZSB0YWJsZS4NCg0KV2VsbCB0byBi ZSBob25lc3QgSSBkb24ndCB0aGluayB0aGlzIGlzIGV2ZW4gbmVjZXNzYXJ5Lg0KDQpTZWUgb24g dGhlIENQVSBzaWRlIGl0IGlzIHBlcmZlY3RseSB2YWxpZCB0byBnZXQgbXVsdGlwbGUgZmF1bHRz IGZvciB0aGUgDQpzYW1lIGFkZHJlc3MuIFNvIHRoZSBmYXVsdCBoYW5kbGluZyBvbiB0aGUgT1Mg aXMgcGVyZmVjdGx5IGNhcGFibGUgb2YgDQpoYW5kbGluZyB0aGlzLg0KDQpUaGlzIG1lYW5zIHRo YXQgYXMgbG9uZyBhcyB3ZSBjb2RlIHRoZSBkcml2ZXIgaW4gdGhlIHNhbWUgd2F5IGhhbmRsaW5n IA0KdGhlIHNhbWUgZmF1bHQgdHdpY2UgaXMganVzdCBhIG1hdHRlciBvZiBpbXByb3ZpbmcgcGVy Zm9ybWFuY2UuDQoNCkluIG90aGVyIHdvcmRzIHdoZW4gd2UgaGF2ZSAxIG1pbGxpb24gZmF1bHRz IGFuZCBoYW5kbGUgbWF5YmUgMTAwIHR3aWNlIA0KSSBob25lc3RseSBkb24ndCBjYXJlIHRoYXQg d2Ugd3JpdGUgdGhlIHNhbWUgdmFsdWUgdG8gYSBQVEUgbXVsdGlwbGUgDQp0aW1lcyA6KQ0KDQo+ IElmIHRoZXJlIGlzIGENCj4gdmFsaWQgZW50cnkgd2l0aCB0aGUgcmlnaHQgcGVybWlzc2lvbnMs IHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuDQo+IFRoZSBkcml2ZXIgd2lsbCBuZWVkIHRv IHRyYWNrIGVub3VnaCBpbmZvcm1hdGlvbiB0byBtYWtlIHRoYXQNCj4gZGV0ZXJtaW5hdGlvbiBx dWlja2x5LiBJZiB3ZSBjYW4gZG8gdGhhdCwgd2UgcHJvYmFibHkgZG9uJ3QgbmVlZCBhIGhhc2gN Cj4gdGFibGUgb3IgYSByaW5nIGJ1ZmZlci4NCj4NCj4gV2UgZG8gbmVlZCBhIGZhc3QgcGF0aCB0 byBpZ25vcmUgcmVkdW5kYW50IGludGVycnVwdHMgdG8gaGFuZGxlIHRoZQ0KPiBpbnRlcnJ1cHQg c3Rvcm0uIFRoZSBoYXNoIHRhYmxlIG1heSBub3QgYmUgdGhlIHJpZ2h0IGFwcHJvYWNoLiBUaGUg cmluZw0KPiBidWZmZXIgeW91IGFkZGVkIGlzIGRlZmluaXRlbHkgbm90IHRoZSByaWdodCBhcHBy b2FjaC4NCg0KV2VsbCB0aGUgcmluZyBidWZmZXIgaXMgY2VydGFpbmx5IG5vdCBpZGVhbCwgYnV0 IHdvcmtzIGZvciBub3cuDQoNCj4gQSBxdWljayBsb29rdXAgb2YNCj4gdGhlIHN0YXRlIG9mIHRo ZSBwYWdlIHRhYmxlIGF0IGEgZ2l2ZW4gYWRkcmVzcyBzZWVtcyBsaWtlIHRoZSByaWdodA0KPiBh cHByb2FjaC4gVGhlIHBhZ2UgdGFibGUgaW4gVlJBTSBpcyB0b28gc2xvdyB0byBhY2Nlc3MuIFdl J2xsIG5lZWQgdG8NCj4gc2hhZG93IHRoZSB2YWxpZCBhbmQgcGVybWlzc2lvbnMgYml0cyBvZiBh bGwgYWxsb2NhdGVkIFBUcyBpbiB0aGUNCj4gZHJpdmVyLiBXaGVuIHdlIGFkZCBwYWdlIG1pZ3Jh dGlvbiwgd2UnbGwgYWxzbyBuZWVkIHRvIHRyYWNrIGluZm9ybWF0aW9uDQo+IGFib3V0IHRoZSBs b2NhdGlvbiBvZiB0aGUgbWFwcGVkIG1lbW9yeSAoc2FtZSBHUFUsIHJlbW90ZSBHUFUsIHN5c3Rl bQ0KPiBtZW1vcnkpLiBJIHRoaW5rIG9uZSBieXRlIHBlciBQVEUgc2hvdWxkIGNvdmVyIGl0Lg0K Pg0KPiBGb3IgaGFuZGxpbmcgVk0gdGVhcmRvd24sIHdlIG5lZWQgdG8gaWdub3JlIHBhZ2UgZmF1 bHRzIGZyb20gVk1zIHRoYXQNCj4gZG9uJ3QgZXhpc3QgYW55IG1vcmUuIFdlIG1heSBuZWVkIHNv bWUgbWVjaGFuaXNtIHRvIGF2b2lkIHJldXNlIG9mDQo+IFBBU0lEcyB1bnRpbCB3ZSBjYW4gYmUg c3VyZSB0aGVyZSB3aWxsIGJlIG5vIG1vcmUgc3RhbGUgcGFnZSBmYXVsdHMgZnJvbQ0KPiB0aGF0 IFBBU0lELiBUaGVuIHdlIGNhbiBzaW1wbHkgaWdub3JlIHBhZ2UgZmF1bHRzIHdpdGggUEFTSURz IHRoYXQNCj4gYXJlbid0IGFsbG9jYXRlZC4gSSBkb24ndCBoYXZlIGEgZ29vZCBpZGVhIGhvdyBs b25nIHdlIG5lZWQgdG8NCj4gcXVhcmFudGluZSBQQVNJRHMgYWZ0ZXIgZGVzdHJveWluZyBWTXMg eWV0LiBXZSdsbCBuZWVkIHRvIGZpbmQgc29tZQ0KPiByZWFzb25hYmxlIGNyaXRlcmlhIGJhc2Vk IG9uIHRoZSBudW1iZXIgb2YgSVJRcyBoYW5kbGVkLCBvciBtYXliZQ0KPiB0aW1lLWJhc2VkLg0K DQpJIHRoaW5rIG5vdCByZXVzaW5nIHRoZSBzYW1lIFBBU0lEIGZvciBtYXliZSAxMG1zIHNob3Vs ZCBiZSBzdWZmaWNpZW50Lg0KDQpSZWdhcmRzLA0KQ2hyaXN0aWFuLg0KDQo+DQo+IFJlZ2FyZHMs DQo+ICAgwqAgRmVsaXgNCj4NCj4NCj4+IFJlZ2FyZHMsDQo+PiBDaHJpc3RpYW4uDQo+Pg0KPj4+ IFJlZ2FyZHMsDQo+Pj4gIMKgIMKgIEZlbGl4DQo+Pj4NCj4+PiBPbiAyMDE5LTAxLTI0IDc6NTIg YS5tLiwgQ2hyaXN0aWFuIEvDtm5pZyB3cm90ZToNCj4+Pj4gRnVydGhlciB0ZXN0aW5nIHNob3dl ZCB0aGF0IHRoZSBpZGVhIHdpdGggdGhlIGNoYXNoIGRvZXNuJ3Qgd29yayBhcw0KPj4+PiBleHBl Y3RlZC4NCj4+Pj4gRXNwZWNpYWxseSB3ZSBjYW4ndCBwcmVkaWN0IHdoZW4gd2UgY2FuIHJlbW92 ZSB0aGUgZW50cmllcyBmcm9tIHRoZQ0KPj4+PiBoYXNoIGFnYWluLg0KPj4+Pg0KPj4+PiBTbyBy ZXBsYWNlIHRoZSBjaGFzaCB3aXRoIGEgc2ltcGxlIHJpbmcgYnVmZmVyIGZvciBub3cgdG8gZmls dGVyIG91dA0KPj4+PiB0aGUNCj4+Pj4gYWxyZWFkeSBoYW5kbGVkIGZhdWx0cy4gQXMgbG9uZyBh cyB3ZSBzZWUgbGVzcyB0aGFuIDY0IGRpc3RpbmN0DQo+Pj4+IGFkZHJlc3NlcyB3ZQ0KPj4+PiBz dGlsbCByZXBvcnQgdGhlbSBvbmx5IG9uY2UgdG8gdGhlIGZvbGxvd2luZyBoYW5kbGluZy4NCj4+ Pj4NCj4+Pj4gU2lnbmVkLW9mZi1ieTogQ2hyaXN0aWFuIEvDtm5pZyA8Y2hyaXN0aWFuLmtvZW5p Z0BhbWQuY29tPg0KPj4+PiAtLS0NCj4+Pj4gIMKgwqAgZHJpdmVycy9ncHUvZHJtL0tjb25maWfC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqAgMiAtDQo+Pj4+ICDCoMKg IGRyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgfMKgwqAgMSAtDQo+Pj4+ICDCoMKgIGRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdw dV9nbWMuaMKgwqAgfMKgwqAgOCArDQo+Pj4+ICDCoMKgIGRyaXZlcnMvZ3B1L2RybS9hbWQvYW1k Z3B1L2FtZGdwdV92bS5jwqDCoMKgIHwgMTA1IC0tLS0NCj4+Pj4gIMKgwqAgZHJpdmVycy9ncHUv ZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3ZtLmjCoMKgwqAgfMKgIDE0IC0NCj4+Pj4gIMKgwqAgZHJp dmVycy9ncHUvZHJtL2FtZC9hbWRncHUvZ21jX3Y5XzAuY8KgwqDCoMKgIHzCoCA0MCArLQ0KPj4+ PiAgwqDCoCBkcml2ZXJzL2dwdS9kcm0vYW1kL2luY2x1ZGUvbGludXgvY2hhc2guaCB8IDM2NiAt LS0tLS0tLS0tLS0tDQo+Pj4+ICDCoMKgIGRyaXZlcnMvZ3B1L2RybS9hbWQvbGliL0tjb25maWfC oMKgwqDCoMKgwqDCoMKgwqDCoCB8wqAgMjggLQ0KPj4+PiAgwqDCoCBkcml2ZXJzL2dwdS9kcm0v YW1kL2xpYi9NYWtlZmlsZcKgwqDCoMKgwqDCoMKgwqDCoCB8wqAgMzIgLS0NCj4+Pj4gIMKgwqAg ZHJpdmVycy9ncHUvZHJtL2FtZC9saWIvY2hhc2guY8KgwqDCoMKgwqDCoMKgwqDCoMKgIHwgNjM4 DQo+Pj4+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCj4+Pj4gIMKgwqAgMTAgZmlsZXMgY2hhbmdl ZCwgMTYgaW5zZXJ0aW9ucygrKSwgMTIxOCBkZWxldGlvbnMoLSkNCj4+Pj4gIMKgwqAgZGVsZXRl IG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9hbWQvaW5jbHVkZS9saW51eC9jaGFzaC5oDQo+ Pj4+ICDCoMKgIGRlbGV0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vYW1kL2xpYi9LY29u ZmlnDQo+Pj4+ICDCoMKgIGRlbGV0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vYW1kL2xp Yi9NYWtlZmlsZQ0KPj4+PiAgwqDCoCBkZWxldGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJt L2FtZC9saWIvY2hhc2guYw0KPj4+Pg0KPj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJt L0tjb25maWcgYi9kcml2ZXJzL2dwdS9kcm0vS2NvbmZpZw0KPj4+PiBpbmRleCA0Mzg1ZjAwZTFk MDUuLjk4YjAzM2U2NzVkYiAxMDA2NDQNCj4+Pj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL0tjb25m aWcNCj4+Pj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL0tjb25maWcNCj4+Pj4gQEAgLTIyOSw4ICsy MjksNiBAQCBjb25maWcgRFJNX0FNREdQVQ0KPj4+PiAgwqDCoCDCoMKgIHNvdXJjZSAiZHJpdmVy cy9ncHUvZHJtL2FtZC9hbWRncHUvS2NvbmZpZyINCj4+Pj4gIMKgwqAgLXNvdXJjZSAiZHJpdmVy cy9ncHUvZHJtL2FtZC9saWIvS2NvbmZpZyINCj4+Pj4gLQ0KPj4+PiAgwqDCoCBzb3VyY2UgImRy aXZlcnMvZ3B1L2RybS9ub3V2ZWF1L0tjb25maWciDQo+Pj4+ICDCoMKgIMKgwqAgc291cmNlICJk cml2ZXJzL2dwdS9kcm0vaTkxNS9LY29uZmlnIg0KPj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlDQo+Pj4+IGluZGV4IDdm M2JlMzUwNjA1Ny4uYWM2MjEzNTc1NjkxIDEwMDY0NA0KPj4+PiAtLS0gYS9kcml2ZXJzL2dwdS9k cm0vTWFrZWZpbGUNCj4+Pj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlDQo+Pj4+IEBA IC01Niw3ICs1Niw2IEBAIG9iai0kKENPTkZJR19EUk1fVFRNKcKgwqDCoCArPSB0dG0vDQo+Pj4+ ICDCoMKgIG9iai0kKENPTkZJR19EUk1fU0NIRUQpwqDCoMKgICs9IHNjaGVkdWxlci8NCj4+Pj4g IMKgwqAgb2JqLSQoQ09ORklHX0RSTV9UREZYKcKgwqDCoCArPSB0ZGZ4Lw0KPj4+PiAgwqDCoCBv YmotJChDT05GSUdfRFJNX1IxMjgpwqDCoMKgICs9IHIxMjgvDQo+Pj4+IC1vYmotecKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgKz0gYW1kL2xpYi8NCj4+Pj4gIMKgwqAgb2JqLSQoQ09ORklHX0hTQV9B TUQpICs9IGFtZC9hbWRrZmQvDQo+Pj4+ICDCoMKgIG9iai0kKENPTkZJR19EUk1fUkFERU9OKSs9 IHJhZGVvbi8NCj4+Pj4gIMKgwqAgb2JqLSQoQ09ORklHX0RSTV9BTURHUFUpKz0gYW1kL2FtZGdw dS8NCj4+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9n bWMuaA0KPj4+PiBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9nbWMuaA0KPj4+ PiBpbmRleCA4MWU2MDcwZDI1NWIuLjgzYzQxNWViNDBmNCAxMDA2NDQNCj4+Pj4gLS0tIGEvZHJp dmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2dtYy5oDQo+Pj4+ICsrKyBiL2RyaXZlcnMv Z3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9nbWMuaA0KPj4+PiBAQCAtNDMsNiArNDMsMTEgQEAN Cj4+Pj4gIMKgwqDCoCAqLw0KPj4+PiAgwqDCoCAjZGVmaW5lIEFNREdQVV9HTUNfSE9MRV9NQVNL wqDCoMKgIDB4MDAwMGZmZmZmZmZmZmZmZlVMTA0KPj4+PiAgwqDCoCArLyoNCj4+Pj4gKyAqIE51 bWJlciBvZiBlbnRyaWVzIGZvciB0aGUgbG9nIG9mIHJlY2VudCBWTSBmYXVsdHMNCj4+Pj4gKyAq Lw0KPj4+PiArI2RlZmluZSBBTURHUFVfR01DX05VTV9WTV9GQVVMVFPCoMKgwqAgNjQNCj4+Pj4g Kw0KPj4+PiAgwqDCoCBzdHJ1Y3QgZmlybXdhcmU7DQo+Pj4+ICDCoMKgIMKgwqAgLyoNCj4+Pj4g QEAgLTE0Nyw2ICsxNTIsOSBAQCBzdHJ1Y3QgYW1kZ3B1X2dtYyB7DQo+Pj4+ICDCoMKgwqDCoMKg wqAgc3RydWN0IGtmZF92bV9mYXVsdF9pbmZvICp2bV9mYXVsdF9pbmZvOw0KPj4+PiAgwqDCoMKg wqDCoMKgIGF0b21pY190wqDCoMKgwqDCoMKgwqAgdm1fZmF1bHRfaW5mb191cGRhdGVkOw0KPj4+ PiAgwqDCoCArwqDCoMKgIHVpbnQ2NF90wqDCoMKgwqDCoMKgwqAgdm1fZmF1bHRzW0FNREdQVV9H TUNfTlVNX1ZNX0ZBVUxUU107DQo+Pj4+ICvCoMKgwqAgaW50wqDCoMKgwqDCoMKgwqDCoMKgwqDC oCB2bV9mYXVsdF9pZHg7DQo+Pj4+ICsNCj4+Pj4gIMKgwqDCoMKgwqDCoCBjb25zdCBzdHJ1Y3Qg YW1kZ3B1X2dtY19mdW5jc8KgwqDCoCAqZ21jX2Z1bmNzOw0KPj4+PiAgwqDCoCDCoMKgwqDCoMKg wqAgc3RydWN0IGFtZGdwdV94Z21pIHhnbWk7DQo+Pj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdm0uYw0KPj4+PiBiL2RyaXZlcnMvZ3B1L2RybS9hbWQv YW1kZ3B1L2FtZGdwdV92bS5jDQo+Pj4+IGluZGV4IDBiYzZmNTUzZGMwOC4uMzA0MWQ3MmM1NDc4 IDEwMDY0NA0KPj4+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdm0u Yw0KPj4+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdm0uYw0KPj4+ PiBAQCAtMjk3MiwyMiArMjk3Miw2IEBAIHZvaWQgYW1kZ3B1X3ZtX2FkanVzdF9zaXplKHN0cnVj dA0KPj4+PiBhbWRncHVfZGV2aWNlICphZGV2LCB1aW50MzJfdCBtaW5fdm1fc2l6ZSwNCj4+Pj4g IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYWRldi0+dm1fbWFuYWdlci5mcmFnbWVudF9zaXplKTsN Cj4+Pj4gIMKgwqAgfQ0KPj4+PiAgwqDCoCAtc3RhdGljIHN0cnVjdCBhbWRncHVfcmV0cnlmYXVs dF9oYXNodGFibGUgKmluaXRfZmF1bHRfaGFzaCh2b2lkKQ0KPj4+PiAtew0KPj4+PiAtwqDCoMKg IHN0cnVjdCBhbWRncHVfcmV0cnlmYXVsdF9oYXNodGFibGUgKmZhdWx0X2hhc2g7DQo+Pj4+IC0N Cj4+Pj4gLcKgwqDCoCBmYXVsdF9oYXNoID0ga21hbGxvYyhzaXplb2YoKmZhdWx0X2hhc2gpLCBH RlBfS0VSTkVMKTsNCj4+Pj4gLcKgwqDCoCBpZiAoIWZhdWx0X2hhc2gpDQo+Pj4+IC3CoMKgwqDC oMKgwqDCoCByZXR1cm4gZmF1bHRfaGFzaDsNCj4+Pj4gLQ0KPj4+PiAtwqDCoMKgIElOSVRfQ0hB U0hfVEFCTEUoZmF1bHRfaGFzaC0+aGFzaCwNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg QU1ER1BVX1BBR0VGQVVMVF9IQVNIX0JJVFMsIDgsIDApOw0KPj4+PiAtwqDCoMKgIHNwaW5fbG9j a19pbml0KCZmYXVsdF9oYXNoLT5sb2NrKTsNCj4+Pj4gLcKgwqDCoCBmYXVsdF9oYXNoLT5jb3Vu dCA9IDA7DQo+Pj4+IC0NCj4+Pj4gLcKgwqDCoCByZXR1cm4gZmF1bHRfaGFzaDsNCj4+Pj4gLX0N Cj4+Pj4gLQ0KPj4+PiAgwqDCoCAvKioNCj4+Pj4gIMKgwqDCoCAqIGFtZGdwdV92bV9pbml0IC0g aW5pdGlhbGl6ZSBhIHZtIGluc3RhbmNlDQo+Pj4+ICDCoMKgwqAgKg0KPj4+PiBAQCAtMzA4MCwx MiArMzA2NCw2IEBAIGludCBhbWRncHVfdm1faW5pdChzdHJ1Y3QgYW1kZ3B1X2RldmljZQ0KPj4+ PiAqYWRldiwgc3RydWN0IGFtZGdwdV92bSAqdm0sDQo+Pj4+ICDCoMKgwqDCoMKgwqDCoMKgwqDC oCB2bS0+cGFzaWQgPSBwYXNpZDsNCj4+Pj4gIMKgwqDCoMKgwqDCoCB9DQo+Pj4+ICDCoMKgIC3C oMKgwqAgdm0tPmZhdWx0X2hhc2ggPSBpbml0X2ZhdWx0X2hhc2goKTsNCj4+Pj4gLcKgwqDCoCBp ZiAoIXZtLT5mYXVsdF9oYXNoKSB7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCByID0gLUVOT01FTTsN Cj4+Pj4gLcKgwqDCoMKgwqDCoMKgIGdvdG8gZXJyb3JfZnJlZV9yb290Ow0KPj4+PiAtwqDCoMKg IH0NCj4+Pj4gLQ0KPj4+PiAgwqDCoMKgwqDCoMKgIElOSVRfS0ZJRk8odm0tPmZhdWx0cyk7DQo+ Pj4+ICDCoMKgIMKgwqDCoMKgwqDCoCByZXR1cm4gMDsNCj4+Pj4gQEAgLTMyNDEsMTUgKzMyMTks MTAgQEAgdm9pZCBhbWRncHVfdm1fZmluaShzdHJ1Y3QgYW1kZ3B1X2RldmljZQ0KPj4+PiAqYWRl diwgc3RydWN0IGFtZGdwdV92bSAqdm0pDQo+Pj4+ICDCoMKgwqDCoMKgwqAgc3RydWN0IGFtZGdw dV9ib192YV9tYXBwaW5nICptYXBwaW5nLCAqdG1wOw0KPj4+PiAgwqDCoMKgwqDCoMKgIGJvb2wg cHJ0X2ZpbmlfbmVlZGVkID0gISFhZGV2LT5nbWMuZ21jX2Z1bmNzLT5zZXRfcHJ0Ow0KPj4+PiAg wqDCoMKgwqDCoMKgIHN0cnVjdCBhbWRncHVfYm8gKnJvb3Q7DQo+Pj4+IC3CoMKgwqAgdTY0IGZh dWx0Ow0KPj4+PiAgwqDCoMKgwqDCoMKgIGludCBpLCByOw0KPj4+PiAgwqDCoCDCoMKgwqDCoMKg wqAgYW1kZ3B1X2FtZGtmZF9ncHV2bV9kZXN0cm95X2NiKGFkZXYsIHZtKTsNCj4+Pj4gIMKgwqAg LcKgwqDCoCAvKiBDbGVhciBwZW5kaW5nIHBhZ2UgZmF1bHRzIGZyb20gSUggd2hlbiB0aGUgVk0g aXMNCj4+Pj4gZGVzdHJveWVkICovDQo+Pj4+IC3CoMKgwqAgd2hpbGUgKGtmaWZvX2dldCgmdm0t PmZhdWx0cywgJmZhdWx0KSkNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIGFtZGdwdV92bV9jbGVhcl9m YXVsdCh2bS0+ZmF1bHRfaGFzaCwgZmF1bHQpOw0KPj4+PiAtDQo+Pj4+ICDCoMKgwqDCoMKgwqAg aWYgKHZtLT5wYXNpZCkgew0KPj4+PiAgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgbG9u ZyBmbGFnczsNCj4+Pj4gIMKgwqAgQEAgLTMyNTgsOSArMzIzMSw2IEBAIHZvaWQgYW1kZ3B1X3Zt X2Zpbmkoc3RydWN0IGFtZGdwdV9kZXZpY2UNCj4+Pj4gKmFkZXYsIHN0cnVjdCBhbWRncHVfdm0g KnZtKQ0KPj4+PiBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGV2LT52bV9tYW5hZ2VyLnBhc2lk X2xvY2ssIGZsYWdzKTsNCj4+Pj4gIMKgwqDCoMKgwqDCoCB9DQo+Pj4+ICDCoMKgIC3CoMKgwqAg a2ZyZWUodm0tPmZhdWx0X2hhc2gpOw0KPj4+PiAtwqDCoMKgIHZtLT5mYXVsdF9oYXNoID0gTlVM TDsNCj4+Pj4gLQ0KPj4+PiAgwqDCoMKgwqDCoMKgIGRybV9zY2hlZF9lbnRpdHlfZGVzdHJveSgm dm0tPmVudGl0eSk7DQo+Pj4+ICDCoMKgIMKgwqDCoMKgwqDCoCBpZiAoIVJCX0VNUFRZX1JPT1Qo JnZtLT52YS5yYl9yb290KSkgew0KPj4+PiBAQCAtMzQyNiw3OCArMzM5NiwzIEBAIHZvaWQgYW1k Z3B1X3ZtX3NldF90YXNrX2luZm8oc3RydWN0IGFtZGdwdV92bQ0KPj4+PiAqdm0pDQo+Pj4+ICDC oMKgwqDCoMKgwqDCoMKgwqDCoCB9DQo+Pj4+ICDCoMKgwqDCoMKgwqAgfQ0KPj4+PiAgwqDCoCB9 DQo+Pj4+IC0NCj4+Pj4gLS8qKg0KPj4+PiAtICogYW1kZ3B1X3ZtX2FkZF9mYXVsdCAtIEFkZCBh IHBhZ2UgZmF1bHQgcmVjb3JkIHRvIGZhdWx0IGhhc2ggdGFibGUNCj4+Pj4gLSAqDQo+Pj4+IC0g KiBAZmF1bHRfaGFzaDogZmF1bHQgaGFzaCB0YWJsZQ0KPj4+PiAtICogQGtleTogNjQtYml0IGVu Y29kaW5nIG9mIFBBU0lEIGFuZCBhZGRyZXNzDQo+Pj4+IC0gKg0KPj4+PiAtICogVGhpcyBzaG91 bGQgYmUgY2FsbGVkIHdoZW4gYSByZXRyeSBwYWdlIGZhdWx0IGludGVycnVwdCBpcw0KPj4+PiAt ICogcmVjZWl2ZWQuIElmIHRoaXMgaXMgYSBuZXcgcGFnZSBmYXVsdCwgaXQgd2lsbCBiZSBhZGRl ZCB0byBhIGhhc2gNCj4+Pj4gLSAqIHRhYmxlLiBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB3 aGV0aGVyIHRoaXMgaXMgYSBuZXcgZmF1bHQsIG9yDQo+Pj4+IC0gKiBhIGZhdWx0IHRoYXQgd2Fz IGFscmVhZHkga25vd24gYW5kIGlzIGFscmVhZHkgYmVpbmcgaGFuZGxlZC4NCj4+Pj4gLSAqDQo+ Pj4+IC0gKiBJZiB0aGVyZSBhcmUgdG9vIG1hbnkgcGVuZGluZyBwYWdlIGZhdWx0cywgdGhpcyB3 aWxsIGZhaWwuIFJldHJ5DQo+Pj4+IC0gKiBpbnRlcnJ1cHRzIHNob3VsZCBiZSBpZ25vcmVkIGlu IHRoaXMgY2FzZSB1bnRpbCB0aGVyZSBpcyBlbm91Z2gNCj4+Pj4gLSAqIGZyZWUgc3BhY2UuDQo+ Pj4+IC0gKg0KPj4+PiAtICogUmV0dXJucyAwIGlmIHRoZSBmYXVsdCB3YXMgYWRkZWQsIDEgaWYg dGhlIGZhdWx0IHdhcyBhbHJlYWR5IGtub3duLA0KPj4+PiAtICogLUVOT1NQQyBpZiB0aGVyZSBh cmUgdG9vIG1hbnkgcGVuZGluZyBmYXVsdHMuDQo+Pj4+IC0gKi8NCj4+Pj4gLWludCBhbWRncHVf dm1fYWRkX2ZhdWx0KHN0cnVjdCBhbWRncHVfcmV0cnlmYXVsdF9oYXNodGFibGUNCj4+Pj4gKmZh dWx0X2hhc2gsIHU2NCBrZXkpDQo+Pj4+IC17DQo+Pj4+IC3CoMKgwqAgdW5zaWduZWQgbG9uZyBm bGFnczsNCj4+Pj4gLcKgwqDCoCBpbnQgciA9IC1FTk9TUEM7DQo+Pj4+IC0NCj4+Pj4gLcKgwqDC oCBpZiAoV0FSTl9PTl9PTkNFKCFmYXVsdF9oYXNoKSkNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIC8q IFNob3VsZCBiZSBhbGxvY2F0ZWQgaW4gYW1kZ3B1X3ZtX2luaXQNCj4+Pj4gLcKgwqDCoMKgwqDC oMKgwqAgKi8NCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybiByOw0KPj4+PiAtDQo+Pj4+IC3C oMKgwqAgc3Bpbl9sb2NrX2lycXNhdmUoJmZhdWx0X2hhc2gtPmxvY2ssIGZsYWdzKTsNCj4+Pj4g LQ0KPj4+PiAtwqDCoMKgIC8qIE9ubHkgbGV0IHRoZSBoYXNoIHRhYmxlIGZpbGwgdXAgdG8gNTAl IGZvciBiZXN0IHBlcmZvcm1hbmNlICovDQo+Pj4+IC3CoMKgwqAgaWYgKGZhdWx0X2hhc2gtPmNv dW50ID49ICgxIDw8IChBTURHUFVfUEFHRUZBVUxUX0hBU0hfQklUUy0xKSkpDQo+Pj4+IC3CoMKg wqDCoMKgwqDCoCBnb3RvIHVubG9ja19vdXQ7DQo+Pj4+IC0NCj4+Pj4gLcKgwqDCoCByID0gY2hh c2hfdGFibGVfY29weV9pbigmZmF1bHRfaGFzaC0+aGFzaCwga2V5LCBOVUxMKTsNCj4+Pj4gLcKg wqDCoCBpZiAoIXIpDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCBmYXVsdF9oYXNoLT5jb3VudCsrOw0K Pj4+PiAtDQo+Pj4+IC3CoMKgwqAgLyogY2hhc2hfdGFibGVfY29weV9pbiBzaG91bGQgbmV2ZXIg ZmFpbCB1bmxlc3Mgd2UncmUgbG9zaW5nDQo+Pj4+IGNvdW50ICovDQo+Pj4+IC3CoMKgwqAgV0FS Tl9PTl9PTkNFKHIgPCAwKTsNCj4+Pj4gLQ0KPj4+PiAtdW5sb2NrX291dDoNCj4+Pj4gLcKgwqDC oCBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmYXVsdF9oYXNoLT5sb2NrLCBmbGFncyk7DQo+Pj4+ IC3CoMKgwqAgcmV0dXJuIHI7DQo+Pj4+IC19DQo+Pj4+IC0NCj4+Pj4gLS8qKg0KPj4+PiAtICog YW1kZ3B1X3ZtX2NsZWFyX2ZhdWx0IC0gUmVtb3ZlIGEgcGFnZSBmYXVsdCByZWNvcmQNCj4+Pj4g LSAqDQo+Pj4+IC0gKiBAZmF1bHRfaGFzaDogZmF1bHQgaGFzaCB0YWJsZQ0KPj4+PiAtICogQGtl eTogNjQtYml0IGVuY29kaW5nIG9mIFBBU0lEIGFuZCBhZGRyZXNzDQo+Pj4+IC0gKg0KPj4+PiAt ICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYSBwYWdlIGZhdWx0IGhhcyBiZWVuIGhhbmRs ZWQuIEFueQ0KPj4+PiAtICogZnV0dXJlIGludGVycnVwdCB3aXRoIHRoaXMga2V5IHdpbGwgYmUg cHJvY2Vzc2VkIGFzIGEgbmV3DQo+Pj4+IC0gKiBwYWdlIGZhdWx0Lg0KPj4+PiAtICovDQo+Pj4+ IC12b2lkIGFtZGdwdV92bV9jbGVhcl9mYXVsdChzdHJ1Y3QgYW1kZ3B1X3JldHJ5ZmF1bHRfaGFz aHRhYmxlDQo+Pj4+ICpmYXVsdF9oYXNoLCB1NjQga2V5KQ0KPj4+PiAtew0KPj4+PiAtwqDCoMKg IHVuc2lnbmVkIGxvbmcgZmxhZ3M7DQo+Pj4+IC3CoMKgwqAgaW50IHI7DQo+Pj4+IC0NCj4+Pj4g LcKgwqDCoCBpZiAoIWZhdWx0X2hhc2gpDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm47DQo+ Pj4+IC0NCj4+Pj4gLcKgwqDCoCBzcGluX2xvY2tfaXJxc2F2ZSgmZmF1bHRfaGFzaC0+bG9jaywg ZmxhZ3MpOw0KPj4+PiAtDQo+Pj4+IC3CoMKgwqAgciA9IGNoYXNoX3RhYmxlX3JlbW92ZSgmZmF1 bHRfaGFzaC0+aGFzaCwga2V5LCBOVUxMKTsNCj4+Pj4gLcKgwqDCoCBpZiAoIVdBUk5fT05fT05D RShyIDwgMCkpIHsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIGZhdWx0X2hhc2gtPmNvdW50LS07DQo+ Pj4+IC3CoMKgwqDCoMKgwqDCoCBXQVJOX09OX09OQ0UoZmF1bHRfaGFzaC0+Y291bnQgPCAwKTsN Cj4+Pj4gLcKgwqDCoCB9DQo+Pj4+IC0NCj4+Pj4gLcKgwqDCoCBzcGluX3VubG9ja19pcnFyZXN0 b3JlKCZmYXVsdF9oYXNoLT5sb2NrLCBmbGFncyk7DQo+Pj4+IC19DQo+Pj4+IGRpZmYgLS1naXQg YS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdm0uaA0KPj4+PiBiL2RyaXZlcnMv Z3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV92bS5oDQo+Pj4+IGluZGV4IDgxZmY4MTc3ZjA5Mi4u N2M0OTIzNWI2MDY0IDEwMDY0NA0KPj4+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdw dS9hbWRncHVfdm0uaA0KPj4+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRn cHVfdm0uaA0KPj4+PiBAQCAtMzAsNyArMzAsNiBAQA0KPj4+PiAgwqDCoCAjaW5jbHVkZSA8ZHJt L2dwdV9zY2hlZHVsZXIuaD4NCj4+Pj4gIMKgwqAgI2luY2x1ZGUgPGRybS9kcm1fZmlsZS5oPg0K Pj4+PiAgwqDCoCAjaW5jbHVkZSA8ZHJtL3R0bS90dG1fYm9fZHJpdmVyLmg+DQo+Pj4+IC0jaW5j bHVkZSA8bGludXgvY2hhc2guaD4NCj4+Pj4gIMKgwqAgwqDCoCAjaW5jbHVkZSAiYW1kZ3B1X3N5 bmMuaCINCj4+Pj4gIMKgwqAgI2luY2x1ZGUgImFtZGdwdV9yaW5nLmgiDQo+Pj4+IEBAIC0xNzks MTMgKzE3OCw2IEBAIHN0cnVjdCBhbWRncHVfdGFza19pbmZvIHsNCj4+Pj4gIMKgwqDCoMKgwqDC oCBwaWRfdMKgwqDCoCB0Z2lkOw0KPj4+PiAgwqDCoCB9Ow0KPj4+PiAgwqDCoCAtI2RlZmluZSBB TURHUFVfUEFHRUZBVUxUX0hBU0hfQklUUyA4DQo+Pj4+IC1zdHJ1Y3QgYW1kZ3B1X3JldHJ5ZmF1 bHRfaGFzaHRhYmxlIHsNCj4+Pj4gLcKgwqDCoCBERUNMQVJFX0NIQVNIX1RBQkxFKGhhc2gsIEFN REdQVV9QQUdFRkFVTFRfSEFTSF9CSVRTLCA4LCAwKTsNCj4+Pj4gLcKgwqDCoCBzcGlubG9ja190 wqDCoMKgIGxvY2s7DQo+Pj4+IC3CoMKgwqAgaW50wqDCoMKgwqDCoMKgwqAgY291bnQ7DQo+Pj4+ IC19Ow0KPj4+PiAtDQo+Pj4+ICDCoMKgIHN0cnVjdCBhbWRncHVfdm0gew0KPj4+PiAgwqDCoMKg wqDCoMKgIC8qIHRyZWUgb2YgdmlydHVhbCBhZGRyZXNzZXMgbWFwcGVkICovDQo+Pj4+ICDCoMKg wqDCoMKgwqAgc3RydWN0IHJiX3Jvb3RfY2FjaGVkwqDCoMKgIHZhOw0KPj4+PiBAQCAtMjQ1LDcg KzIzNyw2IEBAIHN0cnVjdCBhbWRncHVfdm0gew0KPj4+PiAgwqDCoMKgwqDCoMKgIHN0cnVjdCB0 dG1fbHJ1X2J1bGtfbW92ZSBscnVfYnVsa19tb3ZlOw0KPj4+PiAgwqDCoMKgwqDCoMKgIC8qIG1h cmsgd2hldGhlciBjYW4gZG8gdGhlIGJ1bGsgbW92ZSAqLw0KPj4+PiAgwqDCoMKgwqDCoMKgIGJv b2zCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJ1bGtfbW92ZWFibGU7DQo+Pj4+IC3CoMKgwqAgc3Ry dWN0IGFtZGdwdV9yZXRyeWZhdWx0X2hhc2h0YWJsZSAqZmF1bHRfaGFzaDsNCj4+Pj4gIMKgwqAg fTsNCj4+Pj4gIMKgwqAgwqDCoCBzdHJ1Y3QgYW1kZ3B1X3ZtX21hbmFnZXIgew0KPj4+PiBAQCAt MzU4LDExICszNDksNiBAQCB2b2lkIGFtZGdwdV92bV9zZXRfdGFza19pbmZvKHN0cnVjdCBhbWRn cHVfdm0NCj4+Pj4gKnZtKTsNCj4+Pj4gIMKgwqAgwqDCoCB2b2lkIGFtZGdwdV92bV9tb3ZlX3Rv X2xydV90YWlsKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LA0KPj4+PiAgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0cnVjdCBhbWRncHVfdm0gKnZtKTsNCj4+Pj4gLQ0K Pj4+PiAtaW50IGFtZGdwdV92bV9hZGRfZmF1bHQoc3RydWN0IGFtZGdwdV9yZXRyeWZhdWx0X2hh c2h0YWJsZQ0KPj4+PiAqZmF1bHRfaGFzaCwgdTY0IGtleSk7DQo+Pj4+IC0NCj4+Pj4gLXZvaWQg YW1kZ3B1X3ZtX2NsZWFyX2ZhdWx0KHN0cnVjdCBhbWRncHVfcmV0cnlmYXVsdF9oYXNodGFibGUN Cj4+Pj4gKmZhdWx0X2hhc2gsIHU2NCBrZXkpOw0KPj4+PiAtDQo+Pj4+ICDCoMKgIHZvaWQgYW1k Z3B1X3ZtX2RlbF9mcm9tX2xydV9ub3RpZnkoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyk7 DQo+Pj4+ICDCoMKgIMKgwqAgI2VuZGlmDQo+Pj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9k cm0vYW1kL2FtZGdwdS9nbWNfdjlfMC5jDQo+Pj4+IGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRn cHUvZ21jX3Y5XzAuYw0KPj4+PiBpbmRleCA5YzA4MmY5YWVhMWEuLjk2NGU3ODk5MDhkNSAxMDA2 NDQNCj4+Pj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvZ21jX3Y5XzAuYw0KPj4+ PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9nbWNfdjlfMC5jDQo+Pj4+IEBAIC0y NTUsNDggKzI1NSwyNCBAQCBzdGF0aWMgYm9vbCBnbWNfdjlfMF9wcmVzY3JlZW5faXYoc3RydWN0 DQo+Pj4+IGFtZGdwdV9kZXZpY2UgKmFkZXYsDQo+Pj4+ICDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHN0cnVjdCBhbWRncHVfaXZfZW50cnkgKmVudHJ5LA0KPj4+PiAg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1aW50NjRfdCBhZGRyKQ0K Pj4+PiAgwqDCoCB7DQo+Pj4+IC3CoMKgwqAgc3RydWN0IGFtZGdwdV92bSAqdm07DQo+Pj4+ICvC oMKgwqAgdW5zaWduZWQgaTsNCj4+Pj4gIMKgwqDCoMKgwqDCoCB1NjQga2V5Ow0KPj4+PiAtwqDC oMKgIGludCByOw0KPj4+PiAgwqDCoCDCoMKgwqDCoMKgwqAgLyogTm8gUEFTSUQsIGNhbid0IGlk ZW50aWZ5IGZhdWx0aW5nIHByb2Nlc3MgKi8NCj4+Pj4gIMKgwqDCoMKgwqDCoCBpZiAoIWVudHJ5 LT5wYXNpZCkNCj4+Pj4gIMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiB0cnVlOw0KPj4+PiAg wqDCoCAtwqDCoMKgIC8qIE5vdCBhIHJldHJ5IGZhdWx0ICovDQo+Pj4+IC3CoMKgwqAgaWYgKCEo ZW50cnktPnNyY19kYXRhWzFdICYgMHg4MCkpDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm4g dHJ1ZTsNCj4+Pj4gLQ0KPj4+PiAtwqDCoMKgIC8qIFRyYWNrIHJldHJ5IGZhdWx0cyBpbiBwZXIt Vk0gZmF1bHQgRklGTy4gKi8NCj4+Pj4gLcKgwqDCoCBzcGluX2xvY2soJmFkZXYtPnZtX21hbmFn ZXIucGFzaWRfbG9jayk7DQo+Pj4+IC3CoMKgwqAgdm0gPSBpZHJfZmluZCgmYWRldi0+dm1fbWFu YWdlci5wYXNpZF9pZHIsIGVudHJ5LT5wYXNpZCk7DQo+Pj4+IC3CoMKgwqAgaWYgKCF2bSkgew0K Pj4+PiAtwqDCoMKgwqDCoMKgwqAgLyogVk0gbm90IGZvdW5kLCBwcm9jZXNzIGl0IG5vcm1hbGx5 ICovDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCBzcGluX3VubG9jaygmYWRldi0+dm1fbWFuYWdlci5w YXNpZF9sb2NrKTsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybiB0cnVlOw0KPj4+PiAtwqDC oMKgIH0NCj4+Pj4gLQ0KPj4+PiAgwqDCoMKgwqDCoMKgIGtleSA9IEFNREdQVV9WTV9GQVVMVChl bnRyeS0+cGFzaWQsIGFkZHIpOw0KPj4+PiAtwqDCoMKgIHIgPSBhbWRncHVfdm1fYWRkX2ZhdWx0 KHZtLT5mYXVsdF9oYXNoLCBrZXkpOw0KPj4+PiAgwqDCoCAtwqDCoMKgIC8qIEhhc2ggdGFibGUg aXMgZnVsbCBvciB0aGUgZmF1bHQgaXMgYWxyZWFkeSBiZWluZyBwcm9jZXNzZWQsDQo+Pj4+IC3C oMKgwqDCoCAqIGlnbm9yZSBmdXJ0aGVyIHBhZ2UgZmF1bHRzDQo+Pj4+IC3CoMKgwqDCoCAqLw0K Pj4+PiAtwqDCoMKgIGlmIChyICE9IDApIHsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIHNwaW5fdW5s b2NrKCZhZGV2LT52bV9tYW5hZ2VyLnBhc2lkX2xvY2spOw0KPj4+PiAtwqDCoMKgwqDCoMKgwqAg cmV0dXJuIGZhbHNlOw0KPj4+PiAtwqDCoMKgIH0NCj4+Pj4gLcKgwqDCoCAvKiBObyBsb2NraW5n IHJlcXVpcmVkIHdpdGggc2luZ2xlIHdyaXRlciBhbmQgc2luZ2xlIHJlYWRlciAqLw0KPj4+PiAt wqDCoMKgIHIgPSBrZmlmb19wdXQoJnZtLT5mYXVsdHMsIGtleSk7DQo+Pj4+IC3CoMKgwqAgaWYg KCFyKSB7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCAvKiBGSUZPIGlzIGZ1bGwuIElnbm9yZSBpdCB1 bnRpbCB0aGVyZSBpcyBzcGFjZSAqLw0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgYW1kZ3B1X3ZtX2Ns ZWFyX2ZhdWx0KHZtLT5mYXVsdF9oYXNoLCBrZXkpOw0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgc3Bp bl91bmxvY2soJmFkZXYtPnZtX21hbmFnZXIucGFzaWRfbG9jayk7DQo+Pj4+IC3CoMKgwqDCoMKg wqDCoCByZXR1cm4gZmFsc2U7DQo+Pj4+ICvCoMKgwqAgLyogVHJhY2sgdGhlIGxhc3QgTiBmYXVs dHMgYW5kIGRvbid0IHJlcG9ydCB0aGVtIGFnYWluIG9uIHJldHJ5ICovDQo+Pj4+ICvCoMKgwqAg Zm9yIChpID0gMDsgaSA8IEFNREdQVV9HTUNfTlVNX1ZNX0ZBVUxUUzsgKytpKSB7DQo+Pj4+ICvC oMKgwqDCoMKgwqDCoCBpZiAoYWRldi0+Z21jLnZtX2ZhdWx0c1tpXSA9PSBrZXkpDQo+Pj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiBmYWxzZTsNCj4+Pj4gIMKgwqDCoMKgwqDCoCB9 DQo+Pj4+ICDCoMKgIC3CoMKgwqAgc3Bpbl91bmxvY2soJmFkZXYtPnZtX21hbmFnZXIucGFzaWRf bG9jayk7DQo+Pj4+ICDCoMKgwqDCoMKgwqAgLyogSXQncyB0aGUgZmlyc3QgZmF1bHQgZm9yIHRo aXMgYWRkcmVzcywgcHJvY2VzcyBpdCBub3JtYWxseSAqLw0KPj4+PiArwqDCoMKgIGFkZXYtPmdt Yy52bV9mYXVsdHNbYWRldi0+Z21jLnZtX2ZhdWx0X2lkeCsrXSA9IGtleTsNCj4+Pj4gK8KgwqDC oCBhZGV2LT5nbWMudm1fZmF1bHRfaWR4ICU9IEFNREdQVV9HTUNfTlVNX1ZNX0ZBVUxUUzsNCj4+ Pj4gIMKgwqDCoMKgwqDCoCByZXR1cm4gdHJ1ZTsNCj4+Pj4gIMKgwqAgfQ0KPj4+PiAgwqDCoCBA QCAtMzEyLDcgKzI4OCw3IEBAIHN0YXRpYyBpbnQgZ21jX3Y5XzBfcHJvY2Vzc19pbnRlcnJ1cHQo c3RydWN0DQo+Pj4+IGFtZGdwdV9kZXZpY2UgKmFkZXYsDQo+Pj4+ICDCoMKgwqDCoMKgwqAgYWRk ciA9ICh1NjQpZW50cnktPnNyY19kYXRhWzBdIDw8IDEyOw0KPj4+PiAgwqDCoMKgwqDCoMKgIGFk ZHIgfD0gKCh1NjQpZW50cnktPnNyY19kYXRhWzFdICYgMHhmKSA8PCA0NDsNCj4+Pj4gIMKgwqAg LcKgwqDCoCBpZiAoIWdtY192OV8wX3ByZXNjcmVlbl9pdihhZGV2LCBlbnRyeSwgYWRkcikpDQo+ Pj4+ICvCoMKgwqAgaWYgKHJldHJ5X2ZhdWx0ICYmICFnbWNfdjlfMF9wcmVzY3JlZW5faXYoYWRl diwgZW50cnksIGFkZHIpKQ0KPj4+PiAgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIDE7IC8q IFRoaXMgYWxzbyBwcmV2ZW50cyBzZW5kaW5nIGl0IHRvIEtGRCAqLw0KPj4+PiAgwqDCoCDCoMKg wqDCoMKgwqAgaWYgKCFhbWRncHVfc3Jpb3ZfdmYoYWRldikpIHsNCj4+Pj4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS9hbWQvaW5jbHVkZS9saW51eC9jaGFzaC5oDQo+Pj4+IGIvZHJpdmVy cy9ncHUvZHJtL2FtZC9pbmNsdWRlL2xpbnV4L2NoYXNoLmgNCj4+Pj4gZGVsZXRlZCBmaWxlIG1v ZGUgMTAwNjQ0DQo+Pj4+IGluZGV4IDZkYzE1OTkyNGVkMS4uMDAwMDAwMDAwMDAwDQo+Pj4+IC0t LSBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvaW5jbHVkZS9saW51eC9jaGFzaC5oDQo+Pj4+ICsrKyAv ZGV2L251bGwNCj4+Pj4gQEAgLTEsMzY2ICswLDAgQEANCj4+Pj4gLS8qDQo+Pj4+IC0gKiBDb3B5 cmlnaHQgMjAxNyBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuDQo+Pj4+IC0gKg0KPj4+PiAt ICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBw ZXJzb24NCj4+Pj4gb2J0YWluaW5nIGENCj4+Pj4gLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBh bmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUNCj4+Pj4gIlNvZnR3YXJlIiks DQo+Pj4+IC0gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBp bmNsdWRpbmcgd2l0aG91dA0KPj4+PiBsaW1pdGF0aW9uDQo+Pj4+IC0gKiB0aGUgcmlnaHRzIHRv IHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwNCj4+Pj4gc3Vi bGljZW5zZSwNCj4+Pj4gLSAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFu ZCB0byBwZXJtaXQgcGVyc29ucyB0bw0KPj4+PiB3aG9tIHRoZQ0KPj4+PiAtICogU29mdHdhcmUg aXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcNCj4+Pj4gY29u ZGl0aW9uczoNCj4+Pj4gLSAqDQo+Pj4+IC0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBh bmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQ0KPj4+PiBpbmNsdWRlZCBpbg0KPj4+ PiAtICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUu DQo+Pj4+IC0gKg0KPj4+PiAtICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJ VEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsDQo+Pj4+IEVYUFJFU1MgT1INCj4+Pj4gLSAqIElN UExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YNCj4+ Pj4gTUVSQ0hBTlRBQklMSVRZLA0KPj4+PiAtICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV UlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC7CoCBJTiBOTw0KPj4+PiBFVkVOVCBTSEFMTA0KPj4+ PiAtICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1Ig QU5ZIENMQUlNLA0KPj4+PiBEQU1BR0VTIE9SDQo+Pj4+IC0gKiBPVEhFUiBMSUFCSUxJVFksIFdI RVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SDQo+Pj4+IE9USEVSV0lTRSwN Cj4+Pj4gLSAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUg U09GVFdBUkUgT1IgVEhFDQo+Pj4+IFVTRSBPUg0KPj4+PiAtICogT1RIRVIgREVBTElOR1MgSU4g VEhFIFNPRlRXQVJFLg0KPj4+PiAtICoNCj4+Pj4gLSAqLw0KPj4+PiAtDQo+Pj4+IC0jaWZuZGVm IF9MSU5VWF9DSEFTSF9IDQo+Pj4+IC0jZGVmaW5lIF9MSU5VWF9DSEFTSF9IDQo+Pj4+IC0NCj4+ Pj4gLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPg0KPj4+PiAtI2luY2x1ZGUgPGxpbnV4L2hhc2gu aD4NCj4+Pj4gLSNpbmNsdWRlIDxsaW51eC9idWcuaD4NCj4+Pj4gLSNpbmNsdWRlIDxhc20vYml0 c3BlcmxvbmcuaD4NCj4+Pj4gLQ0KPj4+PiAtI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzINCj4+Pj4g LSMgZGVmaW5lIF9DSEFTSF9MT05HX1NISUZUIDUNCj4+Pj4gLSNlbGlmIEJJVFNfUEVSX0xPTkcg PT0gNjQNCj4+Pj4gLSMgZGVmaW5lIF9DSEFTSF9MT05HX1NISUZUIDYNCj4+Pj4gLSNlbHNlDQo+ Pj4+IC0jIGVycm9yICJVbmV4cGVjdGVkIEJJVFNfUEVSX0xPTkciDQo+Pj4+IC0jZW5kaWYNCj4+ Pj4gLQ0KPj4+PiAtc3RydWN0IF9fY2hhc2hfdGFibGUgew0KPj4+PiAtwqDCoMKgIHU4IGJpdHM7 DQo+Pj4+IC3CoMKgwqAgdTgga2V5X3NpemU7DQo+Pj4+IC3CoMKgwqAgdW5zaWduZWQgaW50IHZh bHVlX3NpemU7DQo+Pj4+IC3CoMKgwqAgdTMyIHNpemVfbWFzazsNCj4+Pj4gLcKgwqDCoCB1bnNp Z25lZCBsb25nICpvY2N1cF9iaXRtYXAsICp2YWxpZF9iaXRtYXA7DQo+Pj4+IC3CoMKgwqAgdW5p b24gew0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgdTMyICprZXlzMzI7DQo+Pj4+IC3CoMKgwqDCoMKg wqDCoCB1NjQgKmtleXM2NDsNCj4+Pj4gLcKgwqDCoCB9Ow0KPj4+PiAtwqDCoMKgIHU4ICp2YWx1 ZXM7DQo+Pj4+IC0NCj4+Pj4gLSNpZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMNCj4+Pj4gLcKgwqDC oCB1NjQgaGl0cywgaGl0c19zdGVwcywgaGl0c190aW1lX25zOw0KPj4+PiAtwqDCoMKgIHU2NCBt aXNzLCBtaXNzX3N0ZXBzLCBtaXNzX3RpbWVfbnM7DQo+Pj4+IC3CoMKgwqAgdTY0IHJlbG9jcywg cmVsb2NfZGlzdDsNCj4+Pj4gLSNlbmRpZg0KPj4+PiAtfTsNCj4+Pj4gLQ0KPj4+PiAtI2RlZmlu ZSBfX0NIQVNIX0JJVE1BUF9TSVpFKGJpdHMpwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IFwNCj4+Pj4gLcKgwqDCoCAoKCgxIDw8IChiaXRzKSkgKyBCSVRTX1BFUl9MT05HIC0gMSkgLyBC SVRTX1BFUl9MT05HKQ0KPj4+PiAtI2RlZmluZSBfX0NIQVNIX0FSUkFZX1NJWkUoYml0cywgc2l6 ZSnCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXA0KPj4+PiAtwqDCoMKgICgoKChzaXpl KSA8PCAoYml0cykpICsgc2l6ZW9mKGxvbmcpIC0gMSkgLyBzaXplb2YobG9uZykpDQo+Pj4+IC0N Cj4+Pj4gLSNkZWZpbmUgX19DSEFTSF9EQVRBX1NJWkUoYml0cywga2V5X3NpemUsIHZhbHVlX3Np emUpwqDCoMKgIFwNCj4+Pj4gLcKgwqDCoCAoX19DSEFTSF9CSVRNQVBfU0laRShiaXRzKSAqIDIg K8KgwqDCoMKgwqDCoMKgIFwNCj4+Pj4gLcKgwqDCoMKgIF9fQ0hBU0hfQVJSQVlfU0laRShiaXRz LCBrZXlfc2l6ZSkgK8KgwqDCoMKgwqDCoMKgIFwNCj4+Pj4gLcKgwqDCoMKgIF9fQ0hBU0hfQVJS QVlfU0laRShiaXRzLCB2YWx1ZV9zaXplKSkNCj4+Pj4gLQ0KPj4+PiAtI2RlZmluZSBTVFJVQ1Rf Q0hBU0hfVEFCTEUoYml0cywga2V5X3NpemUsIHZhbHVlX3NpemUpwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBcDQo+Pj4+IC3CoMKgwqAgc3RydWN0IHvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXA0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgc3RydWN0 IF9fY2hhc2hfdGFibGUgdGFibGU7wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwNCj4+ Pj4gLcKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgZGF0YcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIFwNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgW19fQ0hB U0hfREFUQV9TSVpFKGJpdHMsIGtleV9zaXplLCB2YWx1ZV9zaXplKV07XA0KPj4+PiAtwqDCoMKg IH0NCj4+Pj4gLQ0KPj4+PiAtLyoqDQo+Pj4+IC0gKiBzdHJ1Y3QgY2hhc2hfdGFibGUgLSBEeW5h bWljYWxseSBhbGxvY2F0ZWQgY2xvc2VkIGhhc2ggdGFibGUNCj4+Pj4gLSAqDQo+Pj4+IC0gKiBV c2UgdGhpcyBzdHJ1Y3QgZm9yIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBoYXNoIHRhYmxlcyAodXNp bmcNCj4+Pj4gLSAqIGNoYXNoX3RhYmxlX2FsbG9jIGFuZCBjaGFzaF90YWJsZV9mcmVlKSwgd2hl cmUgdGhlIHNpemUgaXMNCj4+Pj4gLSAqIGRldGVybWluZWQgYXQgcnVudGltZS4NCj4+Pj4gLSAq Lw0KPj4+PiAtc3RydWN0IGNoYXNoX3RhYmxlIHsNCj4+Pj4gLcKgwqDCoCBzdHJ1Y3QgX19jaGFz aF90YWJsZSB0YWJsZTsNCj4+Pj4gLcKgwqDCoCB1bnNpZ25lZCBsb25nICpkYXRhOw0KPj4+PiAt fTsNCj4+Pj4gLQ0KPj4+PiAtLyoqDQo+Pj4+IC0gKiBERUNMQVJFX0NIQVNIX1RBQkxFIC0gbWFj cm8gdG8gZGVjbGFyZSBhIGNsb3NlZCBoYXNoIHRhYmxlDQo+Pj4+IC0gKiBAdGFibGU6IG5hbWUg b2YgdGhlIGRlY2xhcmVkIGhhc2ggdGFibGUNCj4+Pj4gLSAqIEBidHM6IFRhYmxlIHNpemUgd2ls bCBiZSAyXmJpdHMgZW50cmllcw0KPj4+PiAtICogQGtleV9zejogU2l6ZSBvZiBoYXNoIGtleXMg aW4gYnl0ZXMsIDQgb3IgOA0KPj4+PiAtICogQHZhbF9zejogU2l6ZSBvZiBkYXRhIHZhbHVlcyBp biBieXRlcywgY2FuIGJlIDANCj4+Pj4gLSAqDQo+Pj4+IC0gKiBUaGlzIGRlY2xhcmVzIHRoZSBo YXNoIHRhYmxlIHZhcmlhYmxlIHdpdGggYSBzdGF0aWMgc2l6ZS4NCj4+Pj4gLSAqDQo+Pj4+IC0g KiBUaGUgY2xvc2VkIGhhc2ggdGFibGUgc3RvcmVzIGtleS12YWx1ZSBwYWlycyB3aXRoIGxvdyBt ZW1vcnkgYW5kDQo+Pj4+IC0gKiBsb29rdXAgb3ZlcmhlYWQuIEluIG9wZXJhdGlvbiBpdCBwZXJm b3JtcyBubyBkeW5hbWljIG1lbW9yeQ0KPj4+PiAtICogbWFuYWdlbWVudC4gVGhlIGRhdGEgYmVp bmcgc3RvcmVkIGRvZXMgbm90IHJlcXVpcmUgYW55DQo+Pj4+IC0gKiBsaXN0X2hlYWRzLiBUaGUg aGFzaCB0YWJsZSBwZXJmb3JtcyBiZXN0IHdpdGggc21hbGwgQHZhbF9zeiBhbmQgYXMNCj4+Pj4g LSAqIGxvbmcgYXMgc29tZSBzcGFjZSAoYWJvdXQgNTAlKSBpcyBsZWZ0IGZyZWUgaW4gdGhlIHRh YmxlLiBCdXQgdGhlDQo+Pj4+IC0gKiB0YWJsZSBjYW4gc3RpbGwgd29yayByZWFzb25hYmx5IGVm ZmljaWVudGx5IGV2ZW4gd2hlbiBmaWxsZWQgdXAgdG8NCj4+Pj4gLSAqIGFib3V0IDkwJS4gSWYg YmlnZ2VyIGRhdGEgaXRlbXMgbmVlZCB0byBiZSBzdG9yZWQgYW5kIGxvb2tlZCB1cCwNCj4+Pj4g LSAqIHN0b3JlIHRoZSBwb2ludGVyIHRvIGl0IGFzIHZhbHVlIGluIHRoZSBoYXNoIHRhYmxlLg0K Pj4+PiAtICoNCj4+Pj4gLSAqIEB2YWxfc3ogbWF5IGJlIDAuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3 aGVuIGFsbCB0aGUgc3RvcmVkDQo+Pj4+IC0gKiBpbmZvcm1hdGlvbiBpcyBjb250YWluZWQgaW4g dGhlIGtleSBpdHNlbGYgYW5kIHRoZSBmYWN0IHRoYXQgaXQgaXMNCj4+Pj4gLSAqIGluIHRoZSBo YXNoIHRhYmxlIChvciBub3QpLg0KPj4+PiAtICovDQo+Pj4+IC0jZGVmaW5lIERFQ0xBUkVfQ0hB U0hfVEFCTEUodGFibGUsIGJ0cywga2V5X3N6LCB2YWxfc3opwqDCoMKgwqDCoMKgwqAgXA0KPj4+ PiAtwqDCoMKgIFNUUlVDVF9DSEFTSF9UQUJMRShidHMsIGtleV9zeiwgdmFsX3N6KSB0YWJsZQ0K Pj4+PiAtDQo+Pj4+IC0jaWZkZWYgQ09ORklHX0NIQVNIX1NUQVRTDQo+Pj4+IC0jZGVmaW5lIF9f Q0hBU0hfU1RBVFNfSU5JVChwcmVmaXgpLMKgwqDCoMKgwqDCoMKgIFwNCj4+Pj4gLcKgwqDCoMKg wqDCoMKgIHByZWZpeC5oaXRzID0gMCzCoMKgwqDCoMKgwqDCoCBcDQo+Pj4+IC3CoMKgwqDCoMKg wqDCoCBwcmVmaXguaGl0c19zdGVwcyA9IDAswqDCoMKgwqDCoMKgwqAgXA0KPj4+PiAtwqDCoMKg wqDCoMKgwqAgcHJlZml4LmhpdHNfdGltZV9ucyA9IDAswqDCoMKgIFwNCj4+Pj4gLcKgwqDCoMKg wqDCoMKgIHByZWZpeC5taXNzID0gMCzCoMKgwqDCoMKgwqDCoCBcDQo+Pj4+IC3CoMKgwqDCoMKg wqDCoCBwcmVmaXgubWlzc19zdGVwcyA9IDAswqDCoMKgwqDCoMKgwqAgXA0KPj4+PiAtwqDCoMKg wqDCoMKgwqAgcHJlZml4Lm1pc3NfdGltZV9ucyA9IDAswqDCoMKgIFwNCj4+Pj4gLcKgwqDCoMKg wqDCoMKgIHByZWZpeC5yZWxvY3MgPSAwLMKgwqDCoMKgwqDCoMKgIFwNCj4+Pj4gLcKgwqDCoMKg wqDCoMKgIHByZWZpeC5yZWxvY19kaXN0ID0gMA0KPj4+PiAtI2Vsc2UNCj4+Pj4gLSNkZWZpbmUg X19DSEFTSF9TVEFUU19JTklUKHByZWZpeCkNCj4+Pj4gLSNlbmRpZg0KPj4+PiAtDQo+Pj4+IC0j ZGVmaW5lIF9fQ0hBU0hfVEFCTEVfSU5JVChwcmVmaXgsIGRhdGEsIGJ0cywga2V5X3N6LCB2YWxf c3opwqDCoMKgIFwNCj4+Pj4gLcKgwqDCoCBwcmVmaXguYml0cyA9IChidHMpLMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIHByZWZp eC5rZXlfc2l6ZSA9IChrZXlfc3opLMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXA0KPj4+PiAtwqDC oMKgwqDCoMKgwqAgcHJlZml4LnZhbHVlX3NpemUgPSAodmFsX3N6KSzCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIFwNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIHByZWZpeC5zaXplX21hc2sgPSAoKDEgPDwg YnRzKSAtIDEpLMKgwqDCoMKgwqDCoMKgIFwNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIHByZWZpeC5v Y2N1cF9iaXRtYXAgPSAmZGF0YVswXSzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwNCj4+Pj4gLcKg wqDCoMKgwqDCoMKgIHByZWZpeC52YWxpZF9iaXRtYXAgPSAmZGF0YcKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgXA0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBbX19DSEFTSF9CSVRNQVBfU0la RShidHMpXSzCoMKgwqDCoMKgwqDCoCBcDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCBwcmVmaXgua2V5 czY0ID0gKHU2NCAqKSZkYXRhwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcDQo+Pj4+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgIFtfX0NIQVNIX0JJVE1BUF9TSVpFKGJ0cykgKiAyXSzCoMKgwqDCoMKg wqDCoCBcDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCBwcmVmaXgudmFsdWVzID0gKHU4ICopJmRhdGHC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgW19f Q0hBU0hfQklUTUFQX1NJWkUoYnRzKSAqIDIgK8KgwqDCoMKgwqDCoMKgIFwNCj4+Pj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBfX0NIQVNIX0FSUkFZX1NJWkUoYnRzLCBrZXlfc3opXcKgwqDC oCBcDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCBfX0NIQVNIX1NUQVRTX0lOSVQocHJlZml4KQ0KPj4+ PiAtDQo+Pj4+IC0vKioNCj4+Pj4gLSAqIERFRklORV9DSEFTSF9UQUJMRSAtIG1hY3JvIHRvIGRl ZmluZSBhbmQgaW5pdGlhbGl6ZSBhIGNsb3NlZA0KPj4+PiBoYXNoIHRhYmxlDQo+Pj4+IC0gKiBA dGJsOiBuYW1lIG9mIHRoZSBkZWNsYXJlZCBoYXNoIHRhYmxlDQo+Pj4+IC0gKiBAYnRzOiBUYWJs ZSBzaXplIHdpbGwgYmUgMl5iaXRzIGVudHJpZXMNCj4+Pj4gLSAqIEBrZXlfc3o6IFNpemUgb2Yg aGFzaCBrZXlzIGluIGJ5dGVzLCA0IG9yIDgNCj4+Pj4gLSAqIEB2YWxfc3o6IFNpemUgb2YgZGF0 YSB2YWx1ZXMgaW4gYnl0ZXMsIGNhbiBiZSAwDQo+Pj4+IC0gKg0KPj4+PiAtICogTm90ZTogdGhl IG1hY3JvIGNhbiBiZSB1c2VkIGZvciBnbG9iYWwgYW5kIGxvY2FsIGhhc2ggdGFibGUNCj4+Pj4g dmFyaWFibGVzLg0KPj4+PiAtICovDQo+Pj4+IC0jZGVmaW5lIERFRklORV9DSEFTSF9UQUJMRSh0 YmwsIGJ0cywga2V5X3N6LCB2YWxfc3opwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcDQo+Pj4+IC3C oMKgwqAgREVDTEFSRV9DSEFTSF9UQUJMRSh0YmwsIGJ0cywga2V5X3N6LCB2YWxfc3opID0geyBc DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCAudGFibGUgPSB7wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIF9f Q0hBU0hfVEFCTEVfSU5JVCgsICh0YmwpLmRhdGEsIGJ0cywga2V5X3N6LCB2YWxfc3opIFwNCj4+ Pj4gLcKgwqDCoMKgwqDCoMKgIH0swqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIFwNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIC5kYXRhID0gezB9wqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcDQo+Pj4+IC3CoMKg wqAgfQ0KPj4+PiAtDQo+Pj4+IC0vKioNCj4+Pj4gLSAqIElOSVRfQ0hBU0hfVEFCTEUgLSBJbml0 aWFsaXplIGEgaGFzaCB0YWJsZSBkZWNsYXJlZCBieQ0KPj4+PiBERUNMQVJFX0NIQVNIX1RBQkxF DQo+Pj4+IC0gKiBAdGJsOiBuYW1lIG9mIHRoZSBkZWNsYXJlZCBoYXNoIHRhYmxlDQo+Pj4+IC0g KiBAYnRzOiBUYWJsZSBzaXplIHdpbGwgYmUgMl5iaXRzIGVudHJpZXMNCj4+Pj4gLSAqIEBrZXlf c3o6IFNpemUgb2YgaGFzaCBrZXlzIGluIGJ5dGVzLCA0IG9yIDgNCj4+Pj4gLSAqIEB2YWxfc3o6 IFNpemUgb2YgZGF0YSB2YWx1ZXMgaW4gYnl0ZXMsIGNhbiBiZSAwDQo+Pj4+IC0gKi8NCj4+Pj4g LSNkZWZpbmUgSU5JVF9DSEFTSF9UQUJMRSh0YmwsIGJ0cywga2V5X3N6LCB2YWxfc3opIFwNCj4+ Pj4gLcKgwqDCoCBfX0NIQVNIX1RBQkxFX0lOSVQoKCh0YmwpLnRhYmxlKSwgKHRibCkuZGF0YSwg YnRzLCBrZXlfc3osIHZhbF9zeikNCj4+Pj4gLQ0KPj4+PiAtaW50IGNoYXNoX3RhYmxlX2FsbG9j KHN0cnVjdCBjaGFzaF90YWJsZSAqdGFibGUsIHU4IGJpdHMsIHU4IGtleV9zaXplLA0KPj4+PiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgaW50IHZhbHVlX3NpemUsIGdmcF90 IGdmcF9tYXNrKTsNCj4+Pj4gLXZvaWQgY2hhc2hfdGFibGVfZnJlZShzdHJ1Y3QgY2hhc2hfdGFi bGUgKnRhYmxlKTsNCj4+Pj4gLQ0KPj4+PiAtLyoqDQo+Pj4+IC0gKiBjaGFzaF90YWJsZV9kdW1w X3N0YXRzIC0gRHVtcCBzdGF0aXN0aWNzIG9mIGEgY2xvc2VkIGhhc2ggdGFibGUNCj4+Pj4gLSAq IEB0Ymw6IFBvaW50ZXIgdG8gdGhlIHRhYmxlIHN0cnVjdHVyZQ0KPj4+PiAtICoNCj4+Pj4gLSAq IER1bXBzIHNvbWUgcGVyZm9ybWFuY2Ugc3RhdGlzdGljcyBvZiB0aGUgdGFibGUgZ2F0aGVyZWQg aW4NCj4+Pj4gb3BlcmF0aW9uDQo+Pj4+IC0gKiBpbiB0aGUga2VybmVsIGxvZyB1c2luZyBwcl9k ZWJ1Zy4gSWYgQ09ORklHX0RZTkFNSUNfREVCVUcgaXMNCj4+Pj4gZW5hYmxlZCwNCj4+Pj4gLSAq IHVzZXIgbXVzdCB0dXJuIG9uIG1lc3NhZ2VzIGZvciBjaGFzaC5jIChmaWxlIGNoYXNoLmMgK3Ap Lg0KPj4+PiAtICovDQo+Pj4+IC0jaWZkZWYgQ09ORklHX0NIQVNIX1NUQVRTDQo+Pj4+IC0jZGVm aW5lIGNoYXNoX3RhYmxlX2R1bXBfc3RhdHModGJsKQ0KPj4+PiBfX2NoYXNoX3RhYmxlX2R1bXBf c3RhdHMoJigqdGJsKS50YWJsZSkNCj4+Pj4gLQ0KPj4+PiAtdm9pZCBfX2NoYXNoX3RhYmxlX2R1 bXBfc3RhdHMoc3RydWN0IF9fY2hhc2hfdGFibGUgKnRhYmxlKTsNCj4+Pj4gLSNlbHNlDQo+Pj4+ IC0jZGVmaW5lIGNoYXNoX3RhYmxlX2R1bXBfc3RhdHModGJsKQ0KPj4+PiAtI2VuZGlmDQo+Pj4+ IC0NCj4+Pj4gLS8qKg0KPj4+PiAtICogY2hhc2hfdGFibGVfcmVzZXRfc3RhdHMgLSBSZXNldCBz dGF0aXN0aWNzIG9mIGEgY2xvc2VkIGhhc2ggdGFibGUNCj4+Pj4gLSAqIEB0Ymw6IFBvaW50ZXIg dG8gdGhlIHRhYmxlIHN0cnVjdHVyZQ0KPj4+PiAtICovDQo+Pj4+IC0jaWZkZWYgQ09ORklHX0NI QVNIX1NUQVRTDQo+Pj4+IC0jZGVmaW5lIGNoYXNoX3RhYmxlX3Jlc2V0X3N0YXRzKHRibCkNCj4+ Pj4gX19jaGFzaF90YWJsZV9yZXNldF9zdGF0cygmKCp0YmwpLnRhYmxlKQ0KPj4+PiAtDQo+Pj4+ IC1zdGF0aWMgaW5saW5lIHZvaWQgX19jaGFzaF90YWJsZV9yZXNldF9zdGF0cyhzdHJ1Y3QgX19j aGFzaF90YWJsZQ0KPj4+PiAqdGFibGUpDQo+Pj4+IC17DQo+Pj4+IC3CoMKgwqAgKHZvaWQpdGFi bGUgX19DSEFTSF9TVEFUU19JTklUKCgqdGFibGUpKTsNCj4+Pj4gLX0NCj4+Pj4gLSNlbHNlDQo+ Pj4+IC0jZGVmaW5lIGNoYXNoX3RhYmxlX3Jlc2V0X3N0YXRzKHRibCkNCj4+Pj4gLSNlbmRpZg0K Pj4+PiAtDQo+Pj4+IC0vKioNCj4+Pj4gLSAqIGNoYXNoX3RhYmxlX2NvcHlfaW4gLSBDb3B5IGEg bmV3IHZhbHVlIGludG8gdGhlIGhhc2ggdGFibGUNCj4+Pj4gLSAqIEB0Ymw6IFBvaW50ZXIgdG8g dGhlIHRhYmxlIHN0cnVjdHVyZQ0KPj4+PiAtICogQGtleTogS2V5IG9mIHRoZSBlbnRyeSB0byBh ZGQgb3IgdXBkYXRlDQo+Pj4+IC0gKiBAdmFsdWU6IFBvaW50ZXIgdG8gdmFsdWUgdG8gY29weSwg bWF5IGJlIE5VTEwNCj4+Pj4gLSAqDQo+Pj4+IC0gKiBJZiBAa2V5IGFscmVhZHkgaGFzIGFuIGVu dHJ5LCBpdHMgdmFsdWUgaXMgcmVwbGFjZWQuIE90aGVyd2lzZSBhDQo+Pj4+IC0gKiBuZXcgZW50 cnkgaXMgYWRkZWQuIElmIEB2YWx1ZSBpcyBOVUxMLCB0aGUgdmFsdWUgaXMgbGVmdCB1bmNoYW5n ZWQNCj4+Pj4gLSAqIG9yIHVuaW5pdGlhbGl6ZWQuIFJldHVybnMgMSBpZiBhbiBlbnRyeSBhbHJl YWR5IGV4aXN0ZWQsIDAgaWYgYSBuZXcNCj4+Pj4gLSAqIGVudHJ5IHdhcyBhZGRlZCBvciAlLUVO T01FTSBpZiB0aGVyZSB3YXMgbm8gZnJlZSBzcGFjZSBpbiB0aGUNCj4+Pj4gLSAqIHRhYmxlLg0K Pj4+PiAtICovDQo+Pj4+IC0jZGVmaW5lIGNoYXNoX3RhYmxlX2NvcHlfaW4odGJsLCBrZXksIHZh bHVlKcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXA0KPj4+PiAtwqDCoMKgIF9fY2hhc2hfdGFibGVf Y29weV9pbigmKCp0YmwpLnRhYmxlLCBrZXksIHZhbHVlKQ0KPj4+PiAtDQo+Pj4+IC1pbnQgX19j aGFzaF90YWJsZV9jb3B5X2luKHN0cnVjdCBfX2NoYXNoX3RhYmxlICp0YWJsZSwgdTY0IGtleSwN Cj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnN0IHZvaWQgKnZhbHVlKTsNCj4+ Pj4gLQ0KPj4+PiAtLyoqDQo+Pj4+IC0gKiBjaGFzaF90YWJsZV9jb3B5X291dCAtIENvcHkgYSB2 YWx1ZSBvdXQgb2YgdGhlIGhhc2ggdGFibGUNCj4+Pj4gLSAqIEB0Ymw6IFBvaW50ZXIgdG8gdGhl IHRhYmxlIHN0cnVjdHVyZQ0KPj4+PiAtICogQGtleTogS2V5IG9mIHRoZSBlbnRyeSB0byBmaW5k DQo+Pj4+IC0gKiBAdmFsdWU6IFBvaW50ZXIgdG8gdmFsdWUgdG8gY29weSwgbWF5IGJlIE5VTEwN Cj4+Pj4gLSAqDQo+Pj4+IC0gKiBJZiBAdmFsdWUgaXMgbm90IE5VTEwgYW5kIHRoZSB0YWJsZSBo YXMgYSBub24tMCB2YWx1ZV9zaXplLCB0aGUNCj4+Pj4gLSAqIHZhbHVlIGF0IEBrZXkgaXMgY29w aWVkIHRvIEB2YWx1ZS4gUmV0dXJucyB0aGUgc2xvdCBpbmRleCBvZiB0aGUNCj4+Pj4gLSAqIGVu dHJ5IG9yICUtRUlOVkFMIGlmIEBrZXkgd2FzIG5vdCBmb3VuZC4NCj4+Pj4gLSAqLw0KPj4+PiAt I2RlZmluZSBjaGFzaF90YWJsZV9jb3B5X291dCh0YmwsIGtleSwgdmFsdWUpwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBcDQo+Pj4+IC3CoMKgwqAgX19jaGFzaF90YWJsZV9jb3B5X291dCgmKCp0Ymwp LnRhYmxlLCBrZXksIHZhbHVlLCBmYWxzZSkNCj4+Pj4gLQ0KPj4+PiAtaW50IF9fY2hhc2hfdGFi bGVfY29weV9vdXQoc3RydWN0IF9fY2hhc2hfdGFibGUgKnRhYmxlLCB1NjQga2V5LA0KPj4+PiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB2b2lkICp2YWx1ZSwgYm9vbCByZW1vdmUpOw0K Pj4+PiAtDQo+Pj4+IC0vKioNCj4+Pj4gLSAqIGNoYXNoX3RhYmxlX3JlbW92ZSAtIFJlbW92ZSBh biBlbnRyeSBmcm9tIHRoZSBoYXNoIHRhYmxlDQo+Pj4+IC0gKiBAdGJsOiBQb2ludGVyIHRvIHRo ZSB0YWJsZSBzdHJ1Y3R1cmUNCj4+Pj4gLSAqIEBrZXk6IEtleSBvZiB0aGUgZW50cnkgdG8gZmlu ZA0KPj4+PiAtICogQHZhbHVlOiBQb2ludGVyIHRvIHZhbHVlIHRvIGNvcHksIG1heSBiZSBOVUxM DQo+Pj4+IC0gKg0KPj4+PiAtICogSWYgQHZhbHVlIGlzIG5vdCBOVUxMIGFuZCB0aGUgdGFibGUg aGFzIGEgbm9uLTAgdmFsdWVfc2l6ZSwgdGhlDQo+Pj4+IC0gKiB2YWx1ZSBhdCBAa2V5IGlzIGNv cGllZCB0byBAdmFsdWUuIFRoZSBlbnRyeSBpcyByZW1vdmVkIGZyb20gdGhlDQo+Pj4+IC0gKiB0 YWJsZS4gUmV0dXJucyB0aGUgc2xvdCBpbmRleCBvZiB0aGUgcmVtb3ZlZCBlbnRyeSBvciAlLUVJ TlZBTCBpZg0KPj4+PiAtICogQGtleSB3YXMgbm90IGZvdW5kLg0KPj4+PiAtICovDQo+Pj4+IC0j ZGVmaW5lIGNoYXNoX3RhYmxlX3JlbW92ZSh0YmwsIGtleSwgdmFsdWUpwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBcDQo+Pj4+IC3CoMKgwqAgX19jaGFzaF90YWJsZV9jb3B5X291dCgmKCp0YmwpLnRh YmxlLCBrZXksIHZhbHVlLCB0cnVlKQ0KPj4+PiAtDQo+Pj4+IC0vKg0KPj4+PiAtICogTG93IGxl dmVsIGl0ZXJhdG9yIEFQSSB1c2VkIGludGVybmFsbHkgYnkgdGhlIGFib3ZlIGZ1bmN0aW9ucy4N Cj4+Pj4gLSAqLw0KPj4+PiAtc3RydWN0IGNoYXNoX2l0ZXIgew0KPj4+PiAtwqDCoMKgIHN0cnVj dCBfX2NoYXNoX3RhYmxlICp0YWJsZTsNCj4+Pj4gLcKgwqDCoCB1bnNpZ25lZCBsb25nIG1hc2s7 DQo+Pj4+IC3CoMKgwqAgaW50IHNsb3Q7DQo+Pj4+IC19Ow0KPj4+PiAtDQo+Pj4+IC0vKioNCj4+ Pj4gLSAqIENIQVNIX0lURVJfSU5JVCAtIEluaXRpYWxpemUgYSBoYXNoIHRhYmxlIGl0ZXJhdG9y DQo+Pj4+IC0gKiBAdGJsOiBQb2ludGVyIHRvIGhhc2ggdGFibGUgdG8gaXRlcmF0ZSBvdmVyDQo+ Pj4+IC0gKiBAczogSW5pdGlhbCBzbG90IG51bWJlcg0KPj4+PiAtICovDQo+Pj4+IC0jZGVmaW5l IENIQVNIX0lURVJfSU5JVCh0YWJsZSwgcykge8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXA0KPj4+ PiAtwqDCoMKgwqDCoMKgwqAgdGFibGUswqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgXA0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgMVVMIDw8ICgocykgJiAoQklUU19QRVJfTE9O RyAtIDEpKSzCoMKgwqAgXA0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgc8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwNCj4+Pj4gLcKgwqDCoCB9DQo+Pj4+IC0vKioNCj4+Pj4g LSAqIENIQVNIX0lURVJfU0VUIC0gU2V0IGhhc2ggdGFibGUgaXRlcmF0b3IgdG8gbmV3IHNsb3QN Cj4+Pj4gLSAqIEBpdGVyOiBJdGVyYXRvcg0KPj4+PiAtICogQHM6IFNsb3QgbnVtYmVyDQo+Pj4+ IC0gKi8NCj4+Pj4gLSNkZWZpbmUgQ0hBU0hfSVRFUl9TRVQoaXRlciwgcynCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcDQo+Pj4+IC3CoMKgwqAgKGl0ZXIpLm1hc2sgPSAx VUwgPDwgKChzKSAmIChCSVRTX1BFUl9MT05HIC0gMSkpLMKgwqDCoCBcDQo+Pj4+IC3CoMKgwqAg KGl0ZXIpLnNsb3QgPSAocykNCj4+Pj4gLS8qKg0KPj4+PiAtICogQ0hBU0hfSVRFUl9JTkMgLSBJ bmNyZW1lbnQgaGFzaCB0YWJsZSBpdGVyYXRvcg0KPj4+PiAtICogQHRhYmxlOiBIYXNoIHRhYmxl IHRvIGl0ZXJhdGUgb3Zlcg0KPj4+PiAtICoNCj4+Pj4gLSAqIFdyYXBzIGFyb3VuZCBhdCB0aGUg ZW5kLg0KPj4+PiAtICovDQo+Pj4+IC0jZGVmaW5lIENIQVNIX0lURVJfSU5DKGl0ZXIpIGRvIHvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcDQo+Pj4+IC3CoMKgwqDCoMKg wqDCoCAoaXRlcikubWFzayA9IChpdGVyKS5tYXNrIDw8IDEgfMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgXA0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoaXRlcikubWFzayA+PiAoQklUU19Q RVJfTE9ORyAtIDEpOyBcDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCAoaXRlcikuc2xvdCA9ICgoaXRl cikuc2xvdCArIDEpICYgKGl0ZXIpLnRhYmxlLT5zaXplX21hc2s7IFwNCj4+Pj4gLcKgwqDCoCB9 IHdoaWxlICgwKQ0KPj4+PiAtDQo+Pj4+IC1zdGF0aWMgaW5saW5lIGJvb2wgY2hhc2hfaXRlcl9p c192YWxpZChjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQ0KPj4+PiAtew0KPj4+PiAtwqDC oMKgIEJVR19PTigodW5zaWduZWQpaXRlci5zbG90ID49ICgxIDw8IGl0ZXIudGFibGUtPmJpdHMp KTsNCj4+Pj4gLcKgwqDCoCByZXR1cm4gISEoaXRlci50YWJsZS0+dmFsaWRfYml0bWFwW2l0ZXIu c2xvdCA+Pg0KPj4+PiBfQ0hBU0hfTE9OR19TSElGVF0gJg0KPj4+PiAtwqDCoMKgwqDCoMKgwqDC oMKgIGl0ZXIubWFzayk7DQo+Pj4+IC19DQo+Pj4+IC1zdGF0aWMgaW5saW5lIGJvb2wgY2hhc2hf aXRlcl9pc19lbXB0eShjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQ0KPj4+PiAtew0KPj4+ PiAtwqDCoMKgIEJVR19PTigodW5zaWduZWQpaXRlci5zbG90ID49ICgxIDw8IGl0ZXIudGFibGUt PmJpdHMpKTsNCj4+Pj4gLcKgwqDCoCByZXR1cm4gIShpdGVyLnRhYmxlLT5vY2N1cF9iaXRtYXBb aXRlci5zbG90ID4+DQo+Pj4+IF9DSEFTSF9MT05HX1NISUZUXSAmDQo+Pj4+IC3CoMKgwqDCoMKg wqDCoMKgIGl0ZXIubWFzayk7DQo+Pj4+IC19DQo+Pj4+IC0NCj4+Pj4gLXN0YXRpYyBpbmxpbmUg dm9pZCBjaGFzaF9pdGVyX3NldF92YWxpZChjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQ0K Pj4+PiAtew0KPj4+PiAtwqDCoMKgIEJVR19PTigodW5zaWduZWQpaXRlci5zbG90ID49ICgxIDw8 IGl0ZXIudGFibGUtPmJpdHMpKTsNCj4+Pj4gLcKgwqDCoCBpdGVyLnRhYmxlLT52YWxpZF9iaXRt YXBbaXRlci5zbG90ID4+IF9DSEFTSF9MT05HX1NISUZUXSB8PQ0KPj4+PiBpdGVyLm1hc2s7DQo+ Pj4+IC3CoMKgwqAgaXRlci50YWJsZS0+b2NjdXBfYml0bWFwW2l0ZXIuc2xvdCA+PiBfQ0hBU0hf TE9OR19TSElGVF0gfD0NCj4+Pj4gaXRlci5tYXNrOw0KPj4+PiAtfQ0KPj4+PiAtc3RhdGljIGlu bGluZSB2b2lkIGNoYXNoX2l0ZXJfc2V0X2ludmFsaWQoY29uc3Qgc3RydWN0IGNoYXNoX2l0ZXIN Cj4+Pj4gaXRlcikNCj4+Pj4gLXsNCj4+Pj4gLcKgwqDCoCBCVUdfT04oKHVuc2lnbmVkKWl0ZXIu c2xvdCA+PSAoMSA8PCBpdGVyLnRhYmxlLT5iaXRzKSk7DQo+Pj4+IC3CoMKgwqAgaXRlci50YWJs ZS0+dmFsaWRfYml0bWFwW2l0ZXIuc2xvdCA+PiBfQ0hBU0hfTE9OR19TSElGVF0gJj0NCj4+Pj4g fml0ZXIubWFzazsNCj4+Pj4gLX0NCj4+Pj4gLXN0YXRpYyBpbmxpbmUgdm9pZCBjaGFzaF9pdGVy X3NldF9lbXB0eShjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQ0KPj4+PiAtew0KPj4+PiAt wqDCoMKgIEJVR19PTigodW5zaWduZWQpaXRlci5zbG90ID49ICgxIDw8IGl0ZXIudGFibGUtPmJp dHMpKTsNCj4+Pj4gLcKgwqDCoCBpdGVyLnRhYmxlLT5vY2N1cF9iaXRtYXBbaXRlci5zbG90ID4+ IF9DSEFTSF9MT05HX1NISUZUXSAmPQ0KPj4+PiB+aXRlci5tYXNrOw0KPj4+PiAtfQ0KPj4+PiAt DQo+Pj4+IC1zdGF0aWMgaW5saW5lIHUzMiBjaGFzaF9pdGVyX2tleTMyKGNvbnN0IHN0cnVjdCBj aGFzaF9pdGVyIGl0ZXIpDQo+Pj4+IC17DQo+Pj4+IC3CoMKgwqAgQlVHX09OKGl0ZXIudGFibGUt PmtleV9zaXplICE9IDQpOw0KPj4+PiAtwqDCoMKgIEJVR19PTigodW5zaWduZWQpaXRlci5zbG90 ID49ICgxIDw8IGl0ZXIudGFibGUtPmJpdHMpKTsNCj4+Pj4gLcKgwqDCoCByZXR1cm4gaXRlci50 YWJsZS0+a2V5czMyW2l0ZXIuc2xvdF07DQo+Pj4+IC19DQo+Pj4+IC1zdGF0aWMgaW5saW5lIHU2 NCBjaGFzaF9pdGVyX2tleTY0KGNvbnN0IHN0cnVjdCBjaGFzaF9pdGVyIGl0ZXIpDQo+Pj4+IC17 DQo+Pj4+IC3CoMKgwqAgQlVHX09OKGl0ZXIudGFibGUtPmtleV9zaXplICE9IDgpOw0KPj4+PiAt wqDCoMKgIEJVR19PTigodW5zaWduZWQpaXRlci5zbG90ID49ICgxIDw8IGl0ZXIudGFibGUtPmJp dHMpKTsNCj4+Pj4gLcKgwqDCoCByZXR1cm4gaXRlci50YWJsZS0+a2V5czY0W2l0ZXIuc2xvdF07 DQo+Pj4+IC19DQo+Pj4+IC1zdGF0aWMgaW5saW5lIHU2NCBjaGFzaF9pdGVyX2tleShjb25zdCBz dHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQ0KPj4+PiAtew0KPj4+PiAtwqDCoMKgIEJVR19PTigodW5z aWduZWQpaXRlci5zbG90ID49ICgxIDw8IGl0ZXIudGFibGUtPmJpdHMpKTsNCj4+Pj4gLcKgwqDC oCByZXR1cm4gKGl0ZXIudGFibGUtPmtleV9zaXplID09IDQpID8NCj4+Pj4gLcKgwqDCoMKgwqDC oMKgIGl0ZXIudGFibGUtPmtleXMzMltpdGVyLnNsb3RdIDogaXRlci50YWJsZS0+a2V5czY0W2l0 ZXIuc2xvdF07DQo+Pj4+IC19DQo+Pj4+IC0NCj4+Pj4gLXN0YXRpYyBpbmxpbmUgdTMyIGNoYXNo X2l0ZXJfaGFzaDMyKGNvbnN0IHN0cnVjdCBjaGFzaF9pdGVyIGl0ZXIpDQo+Pj4+IC17DQo+Pj4+ IC3CoMKgwqAgQlVHX09OKGl0ZXIudGFibGUtPmtleV9zaXplICE9IDQpOw0KPj4+PiAtwqDCoMKg IHJldHVybiBoYXNoXzMyKGNoYXNoX2l0ZXJfa2V5MzIoaXRlciksIGl0ZXIudGFibGUtPmJpdHMp Ow0KPj4+PiAtfQ0KPj4+PiAtDQo+Pj4+IC1zdGF0aWMgaW5saW5lIHUzMiBjaGFzaF9pdGVyX2hh c2g2NChjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQ0KPj4+PiAtew0KPj4+PiAtwqDCoMKg IEJVR19PTihpdGVyLnRhYmxlLT5rZXlfc2l6ZSAhPSA4KTsNCj4+Pj4gLcKgwqDCoCByZXR1cm4g aGFzaF82NChjaGFzaF9pdGVyX2tleTY0KGl0ZXIpLCBpdGVyLnRhYmxlLT5iaXRzKTsNCj4+Pj4g LX0NCj4+Pj4gLQ0KPj4+PiAtc3RhdGljIGlubGluZSB1MzIgY2hhc2hfaXRlcl9oYXNoKGNvbnN0 IHN0cnVjdCBjaGFzaF9pdGVyIGl0ZXIpDQo+Pj4+IC17DQo+Pj4+IC3CoMKgwqAgcmV0dXJuIChp dGVyLnRhYmxlLT5rZXlfc2l6ZSA9PSA0KSA/DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCBoYXNoXzMy KGNoYXNoX2l0ZXJfa2V5MzIoaXRlciksIGl0ZXIudGFibGUtPmJpdHMpIDoNCj4+Pj4gLcKgwqDC oMKgwqDCoMKgIGhhc2hfNjQoY2hhc2hfaXRlcl9rZXk2NChpdGVyKSwgaXRlci50YWJsZS0+Yml0 cyk7DQo+Pj4+IC19DQo+Pj4+IC0NCj4+Pj4gLXN0YXRpYyBpbmxpbmUgdm9pZCAqY2hhc2hfaXRl cl92YWx1ZShjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQ0KPj4+PiAtew0KPj4+PiAtwqDC oMKgIEJVR19PTigodW5zaWduZWQpaXRlci5zbG90ID49ICgxIDw8IGl0ZXIudGFibGUtPmJpdHMp KTsNCj4+Pj4gLcKgwqDCoCByZXR1cm4gaXRlci50YWJsZS0+dmFsdWVzICsNCj4+Pj4gLcKgwqDC oMKgwqDCoMKgICgodW5zaWduZWQgbG9uZylpdGVyLnNsb3QgKiBpdGVyLnRhYmxlLT52YWx1ZV9z aXplKTsNCj4+Pj4gLX0NCj4+Pj4gLQ0KPj4+PiAtI2VuZGlmIC8qIF9MSU5VWF9DSEFTSF9IICov DQo+Pj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2xpYi9LY29uZmlnDQo+Pj4+ IGIvZHJpdmVycy9ncHUvZHJtL2FtZC9saWIvS2NvbmZpZw0KPj4+PiBkZWxldGVkIGZpbGUgbW9k ZSAxMDA2NDQNCj4+Pj4gaW5kZXggNzc2ZWYzNDM0YzEwLi4wMDAwMDAwMDAwMDANCj4+Pj4gLS0t IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9saWIvS2NvbmZpZw0KPj4+PiArKysgL2Rldi9udWxsDQo+ Pj4+IEBAIC0xLDI4ICswLDAgQEANCj4+Pj4gLW1lbnUgIkFNRCBMaWJyYXJ5IHJvdXRpbmVzIg0K Pj4+PiAtDQo+Pj4+IC0jDQo+Pj4+IC0jIENsb3NlZCBoYXNoIHRhYmxlDQo+Pj4+IC0jDQo+Pj4+ IC1jb25maWcgQ0hBU0gNCj4+Pj4gLcKgwqDCoCB0cmlzdGF0ZQ0KPj4+PiAtwqDCoMKgIGRlZmF1 bHQgRFJNX0FNREdQVQ0KPj4+PiAtwqDCoMKgIGhlbHANCj4+Pj4gLcKgwqDCoMKgIFN0YXRpY2Fs bHkgc2l6ZWQgY2xvc2VkIGhhc2ggdGFibGUgaW1wbGVtZW50YXRpb24gd2l0aCBsb3cNCj4+Pj4g LcKgwqDCoMKgIG1lbW9yeSBhbmQgQ1BVIG92ZXJoZWFkLg0KPj4+PiAtDQo+Pj4+IC1jb25maWcg Q0hBU0hfU1RBVFMNCj4+Pj4gLcKgwqDCoCBib29sICJDbG9zZWQgaGFzaCB0YWJsZSBwZXJmb3Jt YW5jZSBzdGF0aXN0aWNzIg0KPj4+PiAtwqDCoMKgIGRlcGVuZHMgb24gQ0hBU0gNCj4+Pj4gLcKg wqDCoCBkZWZhdWx0IG4NCj4+Pj4gLcKgwqDCoCBoZWxwDQo+Pj4+IC3CoMKgwqDCoCBFbmFibGUg Y29sbGVjdGlvbiBvZiBwZXJmb3JtYW5jZSBzdGF0aXN0aWNzIGZvciBjbG9zZWQgaGFzaA0KPj4+ PiB0YWJsZXMuDQo+Pj4+IC0NCj4+Pj4gLWNvbmZpZyBDSEFTSF9TRUxGVEVTVA0KPj4+PiAtwqDC oMKgIGJvb2wgIkNsb3NlZCBoYXNoIHRhYmxlIHNlbGYgdGVzdCINCj4+Pj4gLcKgwqDCoCBkZXBl bmRzIG9uIENIQVNIDQo+Pj4+IC3CoMKgwqAgZGVmYXVsdCBuDQo+Pj4+IC3CoMKgwqAgaGVscA0K Pj4+PiAtwqDCoMKgwqAgUnVucyBhIHNlbGZ0ZXN0IGR1cmluZyBtb2R1bGUgbG9hZC4gU2V2ZXJh bCBtb2R1bGUgcGFyYW1ldGVycw0KPj4+PiAtwqDCoMKgwqAgYXJlIGF2YWlsYWJsZSB0byBtb2Rp ZnkgdGhlIGJlaGF2aW91ciBvZiB0aGUgdGVzdC4NCj4+Pj4gLQ0KPj4+PiAtZW5kbWVudQ0KPj4+ PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9saWIvTWFrZWZpbGUNCj4+Pj4gYi9k cml2ZXJzL2dwdS9kcm0vYW1kL2xpYi9NYWtlZmlsZQ0KPj4+PiBkZWxldGVkIGZpbGUgbW9kZSAx MDA2NDQNCj4+Pj4gaW5kZXggNjkwMjQzMDAxZTFhLi4wMDAwMDAwMDAwMDANCj4+Pj4gLS0tIGEv ZHJpdmVycy9ncHUvZHJtL2FtZC9saWIvTWFrZWZpbGUNCj4+Pj4gKysrIC9kZXYvbnVsbA0KPj4+ PiBAQCAtMSwzMiArMCwwIEBADQo+Pj4+IC0jDQo+Pj4+IC0jIENvcHlyaWdodCAyMDE3IEFkdmFu Y2VkIE1pY3JvIERldmljZXMsIEluYy4NCj4+Pj4gLSMNCj4+Pj4gLSMgUGVybWlzc2lvbiBpcyBo ZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24NCj4+Pj4gb2J0YWlu aW5nIGENCj4+Pj4gLSMgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3Vt ZW50YXRpb24gZmlsZXMgKHRoZQ0KPj4+PiAiU29mdHdhcmUiKSwNCj4+Pj4gLSMgdG8gZGVhbCBp biB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQNCj4+ Pj4gbGltaXRhdGlvbg0KPj4+PiAtIyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBt ZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwNCj4+Pj4gc3VibGljZW5zZSwNCj4+Pj4gLSMgYW5k L29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRv IHdob20NCj4+Pj4gdGhlDQo+Pj4+IC0jIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywg c3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQo+Pj4+IC0jDQo+Pj4+IC0jIFRo ZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxs IGJlDQo+Pj4+IGluY2x1ZGVkIGluDQo+Pj4+IC0jIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwg cG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KPj4+PiAtIw0KPj4+PiAtIyBUSEUgU09GVFdBUkUg SVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwNCj4+Pj4g RVhQUkVTUyBPUg0KPj4+PiAtIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRP IFRIRSBXQVJSQU5USUVTIE9GDQo+Pj4+IE1FUkNIQU5UQUJJTElUWSwNCj4+Pj4gLSMgRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC7CoCBJTiBOTw0K Pj4+PiBFVkVOVCBTSEFMTA0KPj4+PiAtIyBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRI T1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sDQo+Pj4+IERBTUFHRVMgT1INCj4+Pj4gLSMg T1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBP Ug0KPj4+PiBPVEhFUldJU0UsDQo+Pj4+IC0jIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENP Tk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFDQo+Pj4+IFVTRSBPUg0KPj4+PiAtIyBP VEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuDQo+Pj4+IC0jDQo+Pj4+IC0jDQo+Pj4+IC0j IE1ha2VmaWxlIGZvciBBTUQgbGlicmFyeSByb3V0aW5lcywgd2hpY2ggYXJlIHVzZWQgYnkgQU1E IGRyaXZlcg0KPj4+PiAtIyBjb21wb25lbnRzLg0KPj4+PiAtIw0KPj4+PiAtIyBUaGlzIGlzIGZv ciBjb21tb24gbGlicmFyeSByb3V0aW5lcyB0aGF0IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBBTUQN Cj4+Pj4gLSMgZHJpdmVyIGNvbXBvbmVudHMgb3IgbGF0ZXIgbW92ZWQgdG8ga2VybmVsL2xpYiBm b3Igc2hhcmluZyB3aXRoDQo+Pj4+IC0jIG90aGVyIGRyaXZlcnMuDQo+Pj4+IC0NCj4+Pj4gLWNj ZmxhZ3MteSA6PSAtSSQoc3JjKS8uLi9pbmNsdWRlDQo+Pj4+IC0NCj4+Pj4gLW9iai0kKENPTkZJ R19DSEFTSCkgKz0gY2hhc2gubw0KPj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2Ft ZC9saWIvY2hhc2guYw0KPj4+PiBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvbGliL2NoYXNoLmMNCj4+ Pj4gZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0DQo+Pj4+IGluZGV4IGI4ZTQ1ZjM1NmExYy4uMDAw MDAwMDAwMDAwDQo+Pj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvbGliL2NoYXNoLmMNCj4+ Pj4gKysrIC9kZXYvbnVsbA0KPj4+PiBAQCAtMSw2MzggKzAsMCBAQA0KPj4+PiAtLyoNCj4+Pj4g LSAqIENvcHlyaWdodCAyMDE3IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4NCj4+Pj4gLSAq DQo+Pj4+IC0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwg dG8gYW55IHBlcnNvbg0KPj4+PiBvYnRhaW5pbmcgYQ0KPj4+PiAtICogY29weSBvZiB0aGlzIHNv ZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQ0KPj4+PiAiU29m dHdhcmUiKSwNCj4+Pj4gLSAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJp Y3Rpb24sIGluY2x1ZGluZyB3aXRob3V0DQo+Pj4+IGxpbWl0YXRpb24NCj4+Pj4gLSAqIHRoZSBy aWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLA0K Pj4+PiBzdWJsaWNlbnNlLA0KPj4+PiAtICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0 d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvDQo+Pj4+IHdob20gdGhlDQo+Pj4+IC0gKiBT b2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZw0K Pj4+PiBjb25kaXRpb25zOg0KPj4+PiAtICoNCj4+Pj4gLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQg bm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlDQo+Pj4+IGluY2x1ZGVk IGluDQo+Pj4+IC0gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBT b2Z0d2FyZS4NCj4+Pj4gLSAqDQo+Pj4+IC0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFT IElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwNCj4+Pj4gRVhQUkVTUyBPUg0KPj4+ PiAtICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElF UyBPRg0KPj4+PiBNRVJDSEFOVEFCSUxJVFksDQo+Pj4+IC0gKiBGSVRORVNTIEZPUiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULsKgIElOIE5PDQo+Pj4+IEVWRU5UIFNI QUxMDQo+Pj4+IC0gKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElB QkxFIEZPUiBBTlkgQ0xBSU0sDQo+Pj4+IERBTUFHRVMgT1INCj4+Pj4gLSAqIE9USEVSIExJQUJJ TElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1INCj4+Pj4gT1RI RVJXSVNFLA0KPj4+PiAtICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBX SVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUNCj4+Pj4gVVNFIE9SDQo+Pj4+IC0gKiBPVEhFUiBERUFM SU5HUyBJTiBUSEUgU09GVFdBUkUuDQo+Pj4+IC0gKg0KPj4+PiAtICovDQo+Pj4+IC0NCj4+Pj4g LSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPg0KPj4+PiAtI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4N Cj4+Pj4gLSNpbmNsdWRlIDxsaW51eC9idWcuaD4NCj4+Pj4gLSNpbmNsdWRlIDxsaW51eC9zbGFi Lmg+DQo+Pj4+IC0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+DQo+Pj4+IC0jaW5jbHVkZSA8bGlu dXgvc2NoZWQvY2xvY2suaD4NCj4+Pj4gLSNpbmNsdWRlIDxhc20vZGl2NjQuaD4NCj4+Pj4gLSNp bmNsdWRlIDxsaW51eC9jaGFzaC5oPg0KPj4+PiAtDQo+Pj4+IC0vKioNCj4+Pj4gLSAqIGNoYXNo X3RhYmxlX2FsbG9jIC0gQWxsb2NhdGUgY2xvc2VkIGhhc2ggdGFibGUNCj4+Pj4gLSAqIEB0YWJs ZTogUG9pbnRlciB0byB0aGUgdGFibGUgc3RydWN0dXJlDQo+Pj4+IC0gKiBAYml0czogVGFibGUg c2l6ZSB3aWxsIGJlIDJeYml0cyBlbnRyaWVzDQo+Pj4+IC0gKiBAa2V5X3NpemU6IFNpemUgb2Yg aGFzaCBrZXlzIGluIGJ5dGVzLCA0IG9yIDgNCj4+Pj4gLSAqIEB2YWx1ZV9zaXplOiBTaXplIG9m IGRhdGEgdmFsdWVzIGluIGJ5dGVzLCBjYW4gYmUgMA0KPj4+PiAtICovDQo+Pj4+IC1pbnQgY2hh c2hfdGFibGVfYWxsb2Moc3RydWN0IGNoYXNoX3RhYmxlICp0YWJsZSwgdTggYml0cywgdTgga2V5 X3NpemUsDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBpbnQgdmFs dWVfc2l6ZSwgZ2ZwX3QgZ2ZwX21hc2spDQo+Pj4+IC17DQo+Pj4+IC3CoMKgwqAgaWYgKGJpdHMg PiAzMSkNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybiAtRUlOVkFMOw0KPj4+PiAtDQo+Pj4+ IC3CoMKgwqAgaWYgKGtleV9zaXplICE9IDQgJiYga2V5X3NpemUgIT0gOCkNCj4+Pj4gLcKgwqDC oMKgwqDCoMKgIHJldHVybiAtRUlOVkFMOw0KPj4+PiAtDQo+Pj4+IC3CoMKgwqAgdGFibGUtPmRh dGEgPSBrY2FsbG9jKF9fQ0hBU0hfREFUQV9TSVpFKGJpdHMsIGtleV9zaXplLA0KPj4+PiB2YWx1 ZV9zaXplKSwNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc2l6ZW9mKGxvbmcp LCBnZnBfbWFzayk7DQo+Pj4+IC3CoMKgwqAgaWYgKCF0YWJsZS0+ZGF0YSkNCj4+Pj4gLcKgwqDC oMKgwqDCoMKgIHJldHVybiAtRU5PTUVNOw0KPj4+PiAtDQo+Pj4+IC3CoMKgwqAgX19DSEFTSF9U QUJMRV9JTklUKHRhYmxlLT50YWJsZSwgdGFibGUtPmRhdGEsDQo+Pj4+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGJpdHMsIGtleV9zaXplLCB2YWx1ZV9zaXplKTsNCj4+Pj4gLQ0KPj4+ PiAtwqDCoMKgIHJldHVybiAwOw0KPj4+PiAtfQ0KPj4+PiAtRVhQT1JUX1NZTUJPTChjaGFzaF90 YWJsZV9hbGxvYyk7DQo+Pj4+IC0NCj4+Pj4gLS8qKg0KPj4+PiAtICogY2hhc2hfdGFibGVfZnJl ZSAtIEZyZWUgY2xvc2VkIGhhc2ggdGFibGUNCj4+Pj4gLSAqIEB0YWJsZTogUG9pbnRlciB0byB0 aGUgdGFibGUgc3RydWN0dXJlDQo+Pj4+IC0gKi8NCj4+Pj4gLXZvaWQgY2hhc2hfdGFibGVfZnJl ZShzdHJ1Y3QgY2hhc2hfdGFibGUgKnRhYmxlKQ0KPj4+PiAtew0KPj4+PiAtwqDCoMKgIGtmcmVl KHRhYmxlLT5kYXRhKTsNCj4+Pj4gLX0NCj4+Pj4gLUVYUE9SVF9TWU1CT0woY2hhc2hfdGFibGVf ZnJlZSk7DQo+Pj4+IC0NCj4+Pj4gLSNpZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMNCj4+Pj4gLQ0K Pj4+PiAtI2RlZmluZSBESVZfRlJBQyhub20sIGRlbm9tLCBxdW90LCBmcmFjLCBmcmFjX2RpZ2l0 cykgZG8ge8KgwqDCoMKgwqDCoMKgIFwNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIHU2NCBfX25vbSA9 IChub20pO8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwNCj4+Pj4gLcKg wqDCoMKgwqDCoMKgIHU2NCBfX2Rlbm9tID0gKGRlbm9tKTvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBcDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCB1NjQgX19xdW90LCBfX2Zy YWM7wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXA0KPj4+PiAtwqDCoMKg wqDCoMKgwqAgdTMyIF9fcmVtO8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgXA0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCB3 aGlsZSAoX19kZW5vbSA+PiAzMikge8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIFwNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgX19ub23CoMKgID4+PSAxO8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwNCj4+Pj4gLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgX19kZW5vbSA+Pj0gMTvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBcDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCB9wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIF9fcXVv dCA9IF9fbm9tO8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg XA0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgX19yZW3CoCA9IGRvX2RpdihfX3F1b3QsIF9fZGVub20p O8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXA0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgX19mcmFjID0g X19yZW0gKiAoZnJhY19kaWdpdHMpICsgKF9fZGVub20gPj4gMSk7wqDCoMKgIFwNCj4+Pj4gLcKg wqDCoMKgwqDCoMKgIGRvX2RpdihfX2ZyYWMsIF9fZGVub20pO8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBcDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCAocXVvdCkgPSBfX3F1b3Q7wqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXA0KPj4+PiAtwqDCoMKgwqDCoMKgwqAg KGZyYWMpID0gX19mcmFjO8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwN Cj4+Pj4gLcKgwqDCoCB9IHdoaWxlICgwKQ0KPj4+PiAtDQo+Pj4+IC12b2lkIF9fY2hhc2hfdGFi bGVfZHVtcF9zdGF0cyhzdHJ1Y3QgX19jaGFzaF90YWJsZSAqdGFibGUpDQo+Pj4+IC17DQo+Pj4+ IC3CoMKgwqAgc3RydWN0IGNoYXNoX2l0ZXIgaXRlciA9IENIQVNIX0lURVJfSU5JVCh0YWJsZSwg MCk7DQo+Pj4+IC3CoMKgwqAgdTMyIGZpbGxlZCA9IDAsIGVtcHR5ID0gMCwgdG9tYnN0b25lcyA9 IDA7DQo+Pj4+IC3CoMKgwqAgdTY0IHF1b3QxLCBxdW90MjsNCj4+Pj4gLcKgwqDCoCB1MzIgZnJh YzEsIGZyYWMyOw0KPj4+PiAtDQo+Pj4+IC3CoMKgwqAgZG8gew0KPj4+PiAtwqDCoMKgwqDCoMKg wqAgaWYgKGNoYXNoX2l0ZXJfaXNfdmFsaWQoaXRlcikpDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgIGZpbGxlZCsrOw0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgZWxzZSBpZiAoY2hhc2hfaXRl cl9pc19lbXB0eShpdGVyKSkNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZW1wdHkrKzsN Cj4+Pj4gLcKgwqDCoMKgwqDCoMKgIGVsc2UNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg dG9tYnN0b25lcysrOw0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgQ0hBU0hfSVRFUl9JTkMoaXRlcik7 DQo+Pj4+IC3CoMKgwqAgfSB3aGlsZSAoaXRlci5zbG90KTsNCj4+Pj4gLQ0KPj4+PiAtwqDCoMKg IHByX2RlYnVnKCJjaGFzaDoga2V5IHNpemUgJXUsIHZhbHVlIHNpemUgJXVcbiIsDQo+Pj4+IC3C oMKgwqDCoMKgwqDCoMKgIHRhYmxlLT5rZXlfc2l6ZSwgdGFibGUtPnZhbHVlX3NpemUpOw0KPj4+ PiAtwqDCoMKgIHByX2RlYnVnKCLCoCBTbG90cyB0b3RhbC9maWxsZWQvZW1wdHkvdG9tYnN0b25l czogJXUgLyAldSAvICV1IC8NCj4+Pj4gJXVcbiIsDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgIDEg PDwgdGFibGUtPmJpdHMsIGZpbGxlZCwgZW1wdHksIHRvbWJzdG9uZXMpOw0KPj4+PiAtwqDCoMKg IGlmICh0YWJsZS0+aGl0cyA+IDApIHsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIERJVl9GUkFDKHRh YmxlLT5oaXRzX3N0ZXBzLCB0YWJsZS0+aGl0cywgcXVvdDEsIGZyYWMxLCAxMDAwKTsNCj4+Pj4g LcKgwqDCoMKgwqDCoMKgIERJVl9GUkFDKHRhYmxlLT5oaXRzICogMTAwMCwgdGFibGUtPmhpdHNf dGltZV9ucywNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBxdW90MiwgZnJhYzIsIDEw MDApOw0KPj4+PiAtwqDCoMKgIH0gZWxzZSB7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCBxdW90MSA9 IHF1b3QyID0gMDsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIGZyYWMxID0gZnJhYzIgPSAwOw0KPj4+ PiAtwqDCoMKgIH0NCj4+Pj4gLcKgwqDCoCBwcl9kZWJ1ZygiwqAgSGl0c8KgwqAgKGF2Zy5jb3N0 LCByYXRlKTogJWxsdSAoJWxsdS4lMDN1LCAlbGx1LiUwM3UNCj4+Pj4gTS9zKVxuIiwNCj4+Pj4g LcKgwqDCoMKgwqDCoMKgwqAgdGFibGUtPmhpdHMsIHF1b3QxLCBmcmFjMSwgcXVvdDIsIGZyYWMy KTsNCj4+Pj4gLcKgwqDCoCBpZiAodGFibGUtPm1pc3MgPiAwKSB7DQo+Pj4+IC3CoMKgwqDCoMKg wqDCoCBESVZfRlJBQyh0YWJsZS0+bWlzc19zdGVwcywgdGFibGUtPm1pc3MsIHF1b3QxLCBmcmFj MSwgMTAwMCk7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCBESVZfRlJBQyh0YWJsZS0+bWlzcyAqIDEw MDAsIHRhYmxlLT5taXNzX3RpbWVfbnMsDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg cXVvdDIsIGZyYWMyLCAxMDAwKTsNCj4+Pj4gLcKgwqDCoCB9IGVsc2Ugew0KPj4+PiAtwqDCoMKg wqDCoMKgwqAgcXVvdDEgPSBxdW90MiA9IDA7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCBmcmFjMSA9 IGZyYWMyID0gMDsNCj4+Pj4gLcKgwqDCoCB9DQo+Pj4+IC3CoMKgwqAgcHJfZGVidWcoIsKgIE1p c3NlcyAoYXZnLmNvc3QsIHJhdGUpOiAlbGx1ICglbGx1LiUwM3UsICVsbHUuJTAzdQ0KPj4+PiBN L3MpXG4iLA0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoCB0YWJsZS0+bWlzcywgcXVvdDEsIGZyYWMx LCBxdW90MiwgZnJhYzIpOw0KPj4+PiAtwqDCoMKgIGlmICh0YWJsZS0+aGl0cyArIHRhYmxlLT5t aXNzID4gMCkgew0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgRElWX0ZSQUModGFibGUtPmhpdHNfc3Rl cHMgKyB0YWJsZS0+bWlzc19zdGVwcywNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB0 YWJsZS0+aGl0cyArIHRhYmxlLT5taXNzLCBxdW90MSwgZnJhYzEsIDEwMDApOw0KPj4+PiAtwqDC oMKgwqDCoMKgwqAgRElWX0ZSQUMoKHRhYmxlLT5oaXRzICsgdGFibGUtPm1pc3MpICogMTAwMCwN Cj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAodGFibGUtPmhpdHNfdGltZV9ucyArIHRh YmxlLT5taXNzX3RpbWVfbnMpLA0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHF1b3Qy LCBmcmFjMiwgMTAwMCk7DQo+Pj4+IC3CoMKgwqAgfSBlbHNlIHsNCj4+Pj4gLcKgwqDCoMKgwqDC oMKgIHF1b3QxID0gcXVvdDIgPSAwOw0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgZnJhYzEgPSBmcmFj MiA9IDA7DQo+Pj4+IC3CoMKgwqAgfQ0KPj4+PiAtwqDCoMKgIHByX2RlYnVnKCLCoCBUb3RhbMKg IChhdmcuY29zdCwgcmF0ZSk6ICVsbHUgKCVsbHUuJTAzdSwgJWxsdS4lMDN1DQo+Pj4+IE0vcylc biIsDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgIHRhYmxlLT5oaXRzICsgdGFibGUtPm1pc3MsIHF1 b3QxLCBmcmFjMSwgcXVvdDIsIGZyYWMyKTsNCj4+Pj4gLcKgwqDCoCBpZiAodGFibGUtPnJlbG9j cyA+IDApIHsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIERJVl9GUkFDKHRhYmxlLT5oaXRzICsgdGFi bGUtPm1pc3MsIHRhYmxlLT5yZWxvY3MsDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg cXVvdDEsIGZyYWMxLCAxMDAwKTsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIERJVl9GUkFDKHRhYmxl LT5yZWxvY19kaXN0LCB0YWJsZS0+cmVsb2NzLCBxdW90MiwgZnJhYzIsDQo+Pj4+IDEwMDApOw0K Pj4+PiAtwqDCoMKgwqDCoMKgwqAgcHJfZGVidWcoIsKgIFJlbG9jYXRpb25zIChmcmVxLCBhdmcu ZGlzdCk6ICVsbHUNCj4+Pj4gKDE6JWxsdS4lMDN1LCAlbGx1LiUwM3UpXG4iLA0KPj4+PiAtwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIHRhYmxlLT5yZWxvY3MsIHF1b3QxLCBmcmFjMSwgcXVvdDIs IGZyYWMyKTsNCj4+Pj4gLcKgwqDCoCB9IGVsc2Ugew0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgcHJf ZGVidWcoIsKgIE5vIHJlbG9jYXRpb25zXG4iKTsNCj4+Pj4gLcKgwqDCoCB9DQo+Pj4+IC19DQo+ Pj4+IC1FWFBPUlRfU1lNQk9MKF9fY2hhc2hfdGFibGVfZHVtcF9zdGF0cyk7DQo+Pj4+IC0NCj4+ Pj4gLSN1bmRlZiBESVZfRlJBQw0KPj4+PiAtI2VuZGlmDQo+Pj4+IC0NCj4+Pj4gLSNkZWZpbmUg Q0hBU0hfSU5DKHRhYmxlLCBhKSAoKGEpID0gKChhKSArIDEpICYgKHRhYmxlKS0+c2l6ZV9tYXNr KQ0KPj4+PiAtI2RlZmluZSBDSEFTSF9BREQodGFibGUsIGEsIGIpICgoKGEpICsgKGIpKSAmICh0 YWJsZSktPnNpemVfbWFzaykNCj4+Pj4gLSNkZWZpbmUgQ0hBU0hfU1VCKHRhYmxlLCBhLCBiKSAo KChhKSAtIChiKSkgJiAodGFibGUpLT5zaXplX21hc2spDQo+Pj4+IC0jZGVmaW5lIENIQVNIX0lO X1JBTkdFKHRhYmxlLCBzbG90LCBmaXJzdCwgbGFzdCkgXA0KPj4+PiAtwqDCoMKgIChDSEFTSF9T VUIodGFibGUsIHNsb3QsIGZpcnN0KSA8PSBDSEFTSF9TVUIodGFibGUsIGxhc3QsIGZpcnN0KSkN Cj4+Pj4gLQ0KPj4+PiAtLyojZGVmaW5lIENIQVNIX0RFQlVHIFVuY29tbWVudCB0aGlzIHRvIGVu YWJsZSB2ZXJib3NlIGRlYnVnIG91dHB1dCovDQo+Pj4+IC0jaWZkZWYgQ0hBU0hfREVCVUcNCj4+ Pj4gLXN0YXRpYyB2b2lkIGNoYXNoX3RhYmxlX2R1bXAoc3RydWN0IF9fY2hhc2hfdGFibGUgKnRh YmxlKQ0KPj4+PiAtew0KPj4+PiAtwqDCoMKgIHN0cnVjdCBjaGFzaF9pdGVyIGl0ZXIgPSBDSEFT SF9JVEVSX0lOSVQodGFibGUsIDApOw0KPj4+PiAtDQo+Pj4+IC3CoMKgwqAgZG8gew0KPj4+PiAt wqDCoMKgwqDCoMKgwqAgaWYgKChpdGVyLnNsb3QgJiAzKSA9PSAwKQ0KPj4+PiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBwcl9kZWJ1ZygiJTA0eDogIiwgaXRlci5zbG90KTsNCj4+Pj4gLQ0KPj4+ PiAtwqDCoMKgwqDCoMKgwqAgaWYgKGNoYXNoX2l0ZXJfaXNfdmFsaWQoaXRlcikpDQo+Pj4+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgIHByX2RlYnVnKCJbJTAxNmxseF0gIiwgY2hhc2hfaXRlcl9r ZXkoaXRlcikpOw0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgZWxzZSBpZiAoY2hhc2hfaXRlcl9pc19l bXB0eShpdGVyKSkNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHJfZGVidWcoIlvCoMKg wqAgPGVtcHR5PsKgwqDCoMKgIF0gIik7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCBlbHNlDQo+Pj4+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHByX2RlYnVnKCJbwqAgPHRvbWJzdG9uZT7CoMKgIF0g Iik7DQo+Pj4+IC0NCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIGlmICgoaXRlci5zbG90ICYgMykgPT0g MykNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHJfZGVidWcoIlxuIik7DQo+Pj4+IC0N Cj4+Pj4gLcKgwqDCoMKgwqDCoMKgIENIQVNIX0lURVJfSU5DKGl0ZXIpOw0KPj4+PiAtwqDCoMKg IH0gd2hpbGUgKGl0ZXIuc2xvdCk7DQo+Pj4+IC0NCj4+Pj4gLcKgwqDCoCBpZiAoKGl0ZXIuc2xv dCAmIDMpICE9IDApDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCBwcl9kZWJ1ZygiXG4iKTsNCj4+Pj4g LX0NCj4+Pj4gLQ0KPj4+PiAtc3RhdGljIGludCBjaGFzaF90YWJsZV9jaGVjayhzdHJ1Y3QgX19j aGFzaF90YWJsZSAqdGFibGUpDQo+Pj4+IC17DQo+Pj4+IC3CoMKgwqAgdTMyIGhhc2g7DQo+Pj4+ IC3CoMKgwqAgc3RydWN0IGNoYXNoX2l0ZXIgaXRlciA9IENIQVNIX0lURVJfSU5JVCh0YWJsZSwg MCk7DQo+Pj4+IC3CoMKgwqAgc3RydWN0IGNoYXNoX2l0ZXIgY3VyID0gQ0hBU0hfSVRFUl9JTklU KHRhYmxlLCAwKTsNCj4+Pj4gLQ0KPj4+PiAtwqDCoMKgIGRvIHsNCj4+Pj4gLcKgwqDCoMKgwqDC oMKgIGlmICghY2hhc2hfaXRlcl9pc192YWxpZChpdGVyKSkgew0KPj4+PiAtwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBDSEFTSF9JVEVSX0lOQyhpdGVyKTsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgY29udGludWU7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCB9DQo+Pj4+IC0NCj4+Pj4gLcKg wqDCoMKgwqDCoMKgIGhhc2ggPSBjaGFzaF9pdGVyX2hhc2goaXRlcik7DQo+Pj4+IC3CoMKgwqDC oMKgwqDCoCBDSEFTSF9JVEVSX1NFVChjdXIsIGhhc2gpOw0KPj4+PiAtwqDCoMKgwqDCoMKgwqAg d2hpbGUgKGN1ci5zbG90ICE9IGl0ZXIuc2xvdCkgew0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBpZiAoY2hhc2hfaXRlcl9pc19lbXB0eShjdXIpKSB7DQo+Pj4+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgcHJfZXJyKCJQYXRoIHRvIGVsZW1lbnQgYXQgJXggd2l0aCBoYXNo ICV4IGJyb2tlbg0KPj4+PiBhdCBzbG90ICV4XG4iLA0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaXRlci5zbG90LCBoYXNoLCBjdXIuc2xvdCk7DQo+ Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY2hhc2hfdGFibGVfZHVtcCh0YWJs ZSk7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FSU5WQUw7 DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0NCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgQ0hBU0hfSVRFUl9JTkMoY3VyKTsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIH0NCj4+Pj4g LQ0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgQ0hBU0hfSVRFUl9JTkMoaXRlcik7DQo+Pj4+IC3CoMKg wqAgfSB3aGlsZSAoaXRlci5zbG90KTsNCj4+Pj4gLQ0KPj4+PiAtwqDCoMKgIHJldHVybiAwOw0K Pj4+PiAtfQ0KPj4+PiAtI2VuZGlmDQo+Pj4+IC0NCj4+Pj4gLXN0YXRpYyB2b2lkIGNoYXNoX2l0 ZXJfcmVsb2NhdGUoc3RydWN0IGNoYXNoX2l0ZXIgZHN0LCBzdHJ1Y3QNCj4+Pj4gY2hhc2hfaXRl ciBzcmMpDQo+Pj4+IC17DQo+Pj4+IC3CoMKgwqAgQlVHX09OKHNyYy50YWJsZSA9PSBkc3QudGFi bGUgJiYgc3JjLnNsb3QgPT0gZHN0LnNsb3QpOw0KPj4+PiAtwqDCoMKgIEJVR19PTihzcmMudGFi bGUtPmtleV9zaXplICE9IGRzdC50YWJsZS0+a2V5X3NpemUpOw0KPj4+PiAtwqDCoMKgIEJVR19P TihzcmMudGFibGUtPnZhbHVlX3NpemUgIT0gZHN0LnRhYmxlLT52YWx1ZV9zaXplKTsNCj4+Pj4g LQ0KPj4+PiAtwqDCoMKgIGlmIChkc3QudGFibGUtPmtleV9zaXplID09IDQpDQo+Pj4+IC3CoMKg wqDCoMKgwqDCoCBkc3QudGFibGUtPmtleXMzMltkc3Quc2xvdF0gPSBzcmMudGFibGUtPmtleXMz MltzcmMuc2xvdF07DQo+Pj4+IC3CoMKgwqAgZWxzZQ0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgZHN0 LnRhYmxlLT5rZXlzNjRbZHN0LnNsb3RdID0gc3JjLnRhYmxlLT5rZXlzNjRbc3JjLnNsb3RdOw0K Pj4+PiAtDQo+Pj4+IC3CoMKgwqAgaWYgKGRzdC50YWJsZS0+dmFsdWVfc2l6ZSkNCj4+Pj4gLcKg wqDCoMKgwqDCoMKgIG1lbWNweShjaGFzaF9pdGVyX3ZhbHVlKGRzdCksIGNoYXNoX2l0ZXJfdmFs dWUoc3JjKSwNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZHN0LnRhYmxlLT52 YWx1ZV9zaXplKTsNCj4+Pj4gLQ0KPj4+PiAtwqDCoMKgIGNoYXNoX2l0ZXJfc2V0X3ZhbGlkKGRz dCk7DQo+Pj4+IC3CoMKgwqAgY2hhc2hfaXRlcl9zZXRfaW52YWxpZChzcmMpOw0KPj4+PiAtDQo+ Pj4+IC0jaWZkZWYgQ09ORklHX0NIQVNIX1NUQVRTDQo+Pj4+IC3CoMKgwqAgaWYgKHNyYy50YWJs ZSA9PSBkc3QudGFibGUpIHsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIGRzdC50YWJsZS0+cmVsb2Nz Kys7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCBkc3QudGFibGUtPnJlbG9jX2Rpc3QgKz0NCj4+Pj4g LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQ0hBU0hfU1VCKGRzdC50YWJsZSwgc3JjLnNsb3QsIGRz dC5zbG90KTsNCj4+Pj4gLcKgwqDCoCB9DQo+Pj4+IC0jZW5kaWYNCj4+Pj4gLX0NCj4+Pj4gLQ0K Pj4+PiAtLyoqDQo+Pj4+IC0gKiBfX2NoYXNoX3RhYmxlX2ZpbmQgLSBIZWxwZXIgZm9yIGxvb2tp bmcgdXAgYSBoYXNoIHRhYmxlIGVudHJ5DQo+Pj4+IC0gKiBAaXRlcjogUG9pbnRlciB0byBoYXNo IHRhYmxlIGl0ZXJhdG9yDQo+Pj4+IC0gKiBAa2V5OiBLZXkgb2YgdGhlIGVudHJ5IHRvIGZpbmQN Cj4+Pj4gLSAqIEBmb3JfcmVtb3ZhbDogc2V0IHRvIHRydWUgaWYgdGhlIGVsZW1lbnQgd2lsbCBi ZSByZW1vdmVkIHNvb24NCj4+Pj4gLSAqDQo+Pj4+IC0gKiBTZWFyY2hlcyBmb3IgYW4gZW50cnkg aW4gdGhlIGhhc2ggdGFibGUgd2l0aCBhIGdpdmVuIGtleS4gaXRlciBtdXN0DQo+Pj4+IC0gKiBi ZSBpbml0aWFsaXplZCBieSB0aGUgY2FsbGVyIHRvIHBvaW50IHRvIHRoZSBob21lIHBvc2l0aW9u IG9mIHRoZQ0KPj4+PiAtICogaHlwb3RoZXRpY2FsIGVudHJ5LCBpLmUuIGl0IG11c3QgYmUgaW5p dGlhbGl6ZWQgd2l0aCB0aGUgaGFzaCB0YWJsZQ0KPj4+PiAtICogYW5kIHRoZSBrZXkncyBoYXNo IGFzIHRoZSBpbml0aWFsIHNsb3QgZm9yIHRoZSBzZWFyY2guDQo+Pj4+IC0gKg0KPj4+PiAtICog VGhpcyBmdW5jdGlvbiBhbHNvIGRvZXMgc29tZSBsb2NhbCBjbGVhbi11cCB0byBzcGVlZCB1cCBm dXR1cmUNCj4+Pj4gLSAqIGxvb2stdXBzIGJ5IHJlbG9jYXRpbmcgZW50cmllcyB0byBiZXR0ZXIg c2xvdHMgYW5kIHJlbW92aW5nDQo+Pj4+IC0gKiB0b21ic3RvbmVzIHRoYXQgYXJlIG5vIGxvbmdl ciBuZWVkZWQuDQo+Pj4+IC0gKg0KPj4+PiAtICogSWYgQGZvcl9yZW1vdmFsIGlzIHRydWUsIHRo ZSBmdW5jdGlvbiBhdm9pZHMgcmVsb2NhdGluZyB0aGUgZW50cnkNCj4+Pj4gLSAqIHRoYXQgaXMg YmVpbmcgcmV0dXJuZWQuDQo+Pj4+IC0gKg0KPj4+PiAtICogUmV0dXJucyAwIGlmIHRoZSBzZWFy Y2ggaXMgc3VjY2Vzc2Z1bC4gSW4gdGhpcyBjYXNlIGl0ZXIgaXMgdXBkYXRlZA0KPj4+PiAtICog dG8gcG9pbnQgdG8gdGhlIGZvdW5kIGVudHJ5LiBPdGhlcndpc2UgJS1FSU5WQUwgaXMgcmV0dXJu ZWQgYW5kIHRoZQ0KPj4+PiAtICogaXRlciBpcyB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBmaXJz dCBhdmFpbGFibGUgc2xvdCBmb3IgdGhlIGdpdmVuDQo+Pj4+IC0gKiBrZXkuIElmIHRoZSB0YWJs ZSBpcyBmdWxsLCB0aGUgc2xvdCBpcyBzZXQgdG8gLTEuDQo+Pj4+IC0gKi8NCj4+Pj4gLXN0YXRp YyBpbnQgY2hhc2hfdGFibGVfZmluZChzdHJ1Y3QgY2hhc2hfaXRlciAqaXRlciwgdTY0IGtleSwN Cj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBib29sIGZvcl9yZW1vdmFsKQ0K Pj4+PiAtew0KPj4+PiAtI2lmZGVmIENPTkZJR19DSEFTSF9TVEFUUw0KPj4+PiAtwqDCoMKgIHU2 NCB0czEgPSBsb2NhbF9jbG9jaygpOw0KPj4+PiAtI2VuZGlmDQo+Pj4+IC3CoMKgwqAgdTMyIGhh c2ggPSBpdGVyLT5zbG90Ow0KPj4+PiAtwqDCoMKgIHN0cnVjdCBjaGFzaF9pdGVyIGZpcnN0X3Jl ZHVuZGFudCA9DQo+Pj4+IENIQVNIX0lURVJfSU5JVChpdGVyLT50YWJsZSwgLTEpOw0KPj4+PiAt wqDCoMKgIGludCBmaXJzdF9hdmFpbCA9IChmb3JfcmVtb3ZhbCA/IC0yIDogLTEpOw0KPj4+PiAt DQo+Pj4+IC3CoMKgwqAgd2hpbGUgKCFjaGFzaF9pdGVyX2lzX3ZhbGlkKCppdGVyKSB8fCBjaGFz aF9pdGVyX2tleSgqaXRlcikgIT0NCj4+Pj4ga2V5KSB7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCBp ZiAoY2hhc2hfaXRlcl9pc19lbXB0eSgqaXRlcikpIHsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgLyogRm91bmQgYW4gZW1wdHkgc2xvdCwgd2hpY2ggZW5kcyB0aGUNCj4+Pj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCAqIHNlYXJjaC4gQ2xlYW4gdXAgYW55IHByZWNlZGluZyB0b21i c3RvbmVzDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiB0aGF0IGFyZSBubyBsb25n ZXIgbmVlZGVkIGJlY2F1c2UgdGhleSBsZWFkDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgKiB0byBuby13aGVyZQ0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICovDQo+Pj4+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmICgoaW50KWZpcnN0X3JlZHVuZGFudC5zbG90IDwg MCkNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIG5vdF9mb3VuZDsN Cj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgd2hpbGUgKGZpcnN0X3JlZHVuZGFudC5zbG90 ICE9IGl0ZXItPnNsb3QpIHsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBp ZiAoIWNoYXNoX2l0ZXJfaXNfdmFsaWQoZmlyc3RfcmVkdW5kYW50KSkNCj4+Pj4gLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNoYXNoX2l0ZXJfc2V0X2VtcHR5KGZpcnN0 X3JlZHVuZGFudCk7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQ0hBU0hf SVRFUl9JTkMoZmlyc3RfcmVkdW5kYW50KTsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg fQ0KPj4+PiAtI2lmZGVmIENIQVNIX0RFQlVHDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGNoYXNoX3RhYmxlX2NoZWNrKGl0ZXItPnRhYmxlKTsNCj4+Pj4gLSNlbmRpZg0KPj4+PiAtwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIG5vdF9mb3VuZDsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKg IH0gZWxzZSBpZiAoIWNoYXNoX2l0ZXJfaXNfdmFsaWQoKml0ZXIpKSB7DQo+Pj4+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgIC8qIEZvdW5kIGEgdG9tYnN0b25lLiBSZW1lbWJlciBpdCBhcyBjYW5k aWRhdGUNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIGZvciByZWxvY2F0aW5nIHRo ZSBlbnRyeSB3ZSdyZSBsb29raW5nIGZvcg0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg ICogb3IgZm9yIGFkZGluZyBhIG5ldyBlbnRyeSB3aXRoIHRoZSBnaXZlbiBrZXkNCj4+Pj4gLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqLw0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBp ZiAoZmlyc3RfYXZhaWwgPT0gLTEpDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgZmlyc3RfYXZhaWwgPSBpdGVyLT5zbG90Ow0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCAvKiBPciBtYXJrIGl0IGFzIHRoZSBzdGFydCBvZiBhIHNlcmllcyBvZg0KPj4+PiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgICogcG90ZW50aWFsbHkgcmVkdW5kYW50IHRvbWJzdG9uZXMNCj4+ Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqLw0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBlbHNlIGlmIChmaXJzdF9yZWR1bmRhbnQuc2xvdCA9PSAtMSkNCj4+Pj4gLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBDSEFTSF9JVEVSX1NFVChmaXJzdF9yZWR1bmRhbnQsIGl0 ZXItPnNsb3QpOw0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgfSBlbHNlIGlmIChmaXJzdF9yZWR1bmRh bnQuc2xvdCA+PSAwKSB7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC8qIEZvdW5kIGEg dmFsaWQsIG9jY3VwaWVkIHNsb3Qgd2l0aCBhDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgKiBwcmVjZWRpbmcgc2VyaWVzIG9mIHRvbWJzdG9uZXMuIFJlbG9jYXRlIGl0DQo+Pj4+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiB0byBhIGJldHRlciBwb3NpdGlvbiB0aGF0IG5vIGxv bmdlciBkZXBlbmRzDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiBvbiB0aG9zZSB0 b21ic3RvbmVzDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKi8NCj4+Pj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgdTMyIGN1cl9oYXNoID0gY2hhc2hfaXRlcl9oYXNoKCppdGVyKTsN Cj4+Pj4gLQ0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoIUNIQVNIX0lOX1JBTkdF KGl0ZXItPnRhYmxlLCBjdXJfaGFzaCwNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgZmlyc3RfcmVkdW5kYW50LnNsb3QgKyAxLA0KPj4+PiAtwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpdGVyLT5zbG90KSkg ew0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC8qIFRoaXMgZW50cnkgaGFz IGEgaGFzaCBhdCBvciBiZWZvcmUNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICogdGhlIGZpcnN0IHRvbWJzdG9uZSB3ZSBmb3VuZC4gV2UNCj4+Pj4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgICogY2FuIHJlbG9jYXRlIGl0IHRvIHRoYXQgdG9tYnN0b25l DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIGFuZCBhZHZhbmNlIHRv IHRoZSBuZXh0IHRvbWJzdG9uZQ0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgKi8NCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjaGFzaF9pdGVyX3Jl bG9jYXRlKGZpcnN0X3JlZHVuZGFudCwgKml0ZXIpOw0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGRvIHsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIENIQVNIX0lURVJfSU5DKGZpcnN0X3JlZHVuZGFudCk7DQo+Pj4+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgfSB3aGlsZSAoY2hhc2hfaXRlcl9pc192YWxpZChmaXJzdF9y ZWR1bmRhbnQpKTsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfSBlbHNlIGlmIChjdXJf aGFzaCAhPSBpdGVyLT5zbG90KSB7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgLyogUmVsb2NhdGUgZW50cnkgdG8gaXRzIGhvbWUgcG9zaXRpb24NCj4+Pj4gLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogb3IgYXMgY2xvc2UgYXMgcG9zc2libGUgc28gaXQg bm8NCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogbG9uZ2VyIGRlcGVu ZHMgb24gYW55IHByZWNlZGluZw0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgKiB0b21ic3RvbmVzDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAq Lw0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0cnVjdCBjaGFzaF9pdGVy IG5ld19pdGVyID0NCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IENIQVNIX0lURVJfSU5JVChpdGVyLT50YWJsZSwgY3VyX2hhc2gpOw0KPj4+PiAtDQo+Pj4+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgd2hpbGUgKG5ld19pdGVyLnNsb3QgIT0gaXRl ci0+c2xvdCAmJg0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgY2hhc2hfaXRlcl9pc192YWxpZChuZXdfaXRlcikpDQo+Pj4+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBDSEFTSF9JVEVSX0lOQyhuZXdfaXRlcik7DQo+Pj4+ IC0NCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAobmV3X2l0ZXIuc2xv dCAhPSBpdGVyLT5zbG90KQ0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgY2hhc2hfaXRlcl9yZWxvY2F0ZShuZXdfaXRlciwgKml0ZXIpOw0KPj4+PiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB9DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCB9DQo+Pj4+IC0NCj4+Pj4g LcKgwqDCoMKgwqDCoMKgIENIQVNIX0lURVJfSU5DKCppdGVyKTsNCj4+Pj4gLcKgwqDCoMKgwqDC oMKgIGlmIChpdGVyLT5zbG90ID09IGhhc2gpIHsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgaXRlci0+c2xvdCA9IC0xOw0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIG5v dF9mb3VuZDsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIH0NCj4+Pj4gLcKgwqDCoCB9DQo+Pj4+IC0N Cj4+Pj4gLSNpZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMNCj4+Pj4gLcKgwqDCoCBpdGVyLT50YWJs ZS0+aGl0cysrOw0KPj4+PiAtwqDCoMKgIGl0ZXItPnRhYmxlLT5oaXRzX3N0ZXBzICs9IENIQVNI X1NVQihpdGVyLT50YWJsZSwgaXRlci0+c2xvdCwNCj4+Pj4gaGFzaCkgKyAxOw0KPj4+PiAtI2Vu ZGlmDQo+Pj4+IC0NCj4+Pj4gLcKgwqDCoCBpZiAoZmlyc3RfYXZhaWwgPj0gMCkgew0KPj4+PiAt wqDCoMKgwqDCoMKgwqAgQ0hBU0hfSVRFUl9TRVQoZmlyc3RfcmVkdW5kYW50LCBmaXJzdF9hdmFp bCk7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCBjaGFzaF9pdGVyX3JlbG9jYXRlKGZpcnN0X3JlZHVu ZGFudCwgKml0ZXIpOw0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgaXRlci0+c2xvdCA9IGZpcnN0X3Jl ZHVuZGFudC5zbG90Ow0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgaXRlci0+bWFzayA9IGZpcnN0X3Jl ZHVuZGFudC5tYXNrOw0KPj4+PiAtwqDCoMKgIH0NCj4+Pj4gLQ0KPj4+PiAtI2lmZGVmIENPTkZJ R19DSEFTSF9TVEFUUw0KPj4+PiAtwqDCoMKgIGl0ZXItPnRhYmxlLT5oaXRzX3RpbWVfbnMgKz0g bG9jYWxfY2xvY2soKSAtIHRzMTsNCj4+Pj4gLSNlbmRpZg0KPj4+PiAtDQo+Pj4+IC3CoMKgwqAg cmV0dXJuIDA7DQo+Pj4+IC0NCj4+Pj4gLW5vdF9mb3VuZDoNCj4+Pj4gLSNpZmRlZiBDT05GSUdf Q0hBU0hfU1RBVFMNCj4+Pj4gLcKgwqDCoCBpdGVyLT50YWJsZS0+bWlzcysrOw0KPj4+PiAtwqDC oMKgIGl0ZXItPnRhYmxlLT5taXNzX3N0ZXBzICs9IChpdGVyLT5zbG90IDwgMCkgPw0KPj4+PiAt wqDCoMKgwqDCoMKgwqAgKDEgPDwgaXRlci0+dGFibGUtPmJpdHMpIDoNCj4+Pj4gLcKgwqDCoMKg wqDCoMKgIENIQVNIX1NVQihpdGVyLT50YWJsZSwgaXRlci0+c2xvdCwgaGFzaCkgKyAxOw0KPj4+ PiAtI2VuZGlmDQo+Pj4+IC0NCj4+Pj4gLcKgwqDCoCBpZiAoZmlyc3RfYXZhaWwgPj0gMCkNCj4+ Pj4gLcKgwqDCoMKgwqDCoMKgIENIQVNIX0lURVJfU0VUKCppdGVyLCBmaXJzdF9hdmFpbCk7DQo+ Pj4+IC0NCj4+Pj4gLSNpZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMNCj4+Pj4gLcKgwqDCoCBpdGVy LT50YWJsZS0+bWlzc190aW1lX25zICs9IGxvY2FsX2Nsb2NrKCkgLSB0czE7DQo+Pj4+IC0jZW5k aWYNCj4+Pj4gLQ0KPj4+PiAtwqDCoMKgIHJldHVybiAtRUlOVkFMOw0KPj4+PiAtfQ0KPj4+PiAt DQo+Pj4+IC1pbnQgX19jaGFzaF90YWJsZV9jb3B5X2luKHN0cnVjdCBfX2NoYXNoX3RhYmxlICp0 YWJsZSwgdTY0IGtleSwNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnN0IHZv aWQgKnZhbHVlKQ0KPj4+PiAtew0KPj4+PiAtwqDCoMKgIHUzMiBoYXNoID0gKHRhYmxlLT5rZXlf c2l6ZSA9PSA0KSA/DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCBoYXNoXzMyKGtleSwgdGFibGUtPmJp dHMpIDogaGFzaF82NChrZXksIHRhYmxlLT5iaXRzKTsNCj4+Pj4gLcKgwqDCoCBzdHJ1Y3QgY2hh c2hfaXRlciBpdGVyID0gQ0hBU0hfSVRFUl9JTklUKHRhYmxlLCBoYXNoKTsNCj4+Pj4gLcKgwqDC oCBpbnQgciA9IGNoYXNoX3RhYmxlX2ZpbmQoJml0ZXIsIGtleSwgZmFsc2UpOw0KPj4+PiAtDQo+ Pj4+IC3CoMKgwqAgLyogRm91bmQgYW4gZXhpc3RpbmcgZW50cnkgKi8NCj4+Pj4gLcKgwqDCoCBp ZiAoIXIpIHsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIGlmICh2YWx1ZSAmJiB0YWJsZS0+dmFsdWVf c2l6ZSkNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbWVtY3B5KGNoYXNoX2l0ZXJfdmFs dWUoaXRlciksIHZhbHVlLA0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHRhYmxlLT52YWx1ZV9zaXplKTsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybiAxOw0K Pj4+PiAtwqDCoMKgIH0NCj4+Pj4gLQ0KPj4+PiAtwqDCoMKgIC8qIElzIHRoZXJlIGEgcGxhY2Ug dG8gYWRkIGEgbmV3IGVudHJ5PyAqLw0KPj4+PiAtwqDCoMKgIGlmIChpdGVyLnNsb3QgPCAwKSB7 DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCBwcl9lcnIoIkhhc2ggdGFibGUgb3ZlcmZsb3dcbiIpOw0K Pj4+PiAtwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FTk9NRU07DQo+Pj4+IC3CoMKgwqAgfQ0KPj4+ PiAtDQo+Pj4+IC3CoMKgwqAgY2hhc2hfaXRlcl9zZXRfdmFsaWQoaXRlcik7DQo+Pj4+IC0NCj4+ Pj4gLcKgwqDCoCBpZiAodGFibGUtPmtleV9zaXplID09IDQpDQo+Pj4+IC3CoMKgwqDCoMKgwqDC oCB0YWJsZS0+a2V5czMyW2l0ZXIuc2xvdF0gPSBrZXk7DQo+Pj4+IC3CoMKgwqAgZWxzZQ0KPj4+ PiAtwqDCoMKgwqDCoMKgwqAgdGFibGUtPmtleXM2NFtpdGVyLnNsb3RdID0ga2V5Ow0KPj4+PiAt wqDCoMKgIGlmICh2YWx1ZSAmJiB0YWJsZS0+dmFsdWVfc2l6ZSkNCj4+Pj4gLcKgwqDCoMKgwqDC oMKgIG1lbWNweShjaGFzaF9pdGVyX3ZhbHVlKGl0ZXIpLCB2YWx1ZSwgdGFibGUtPnZhbHVlX3Np emUpOw0KPj4+PiAtDQo+Pj4+IC3CoMKgwqAgcmV0dXJuIDA7DQo+Pj4+IC19DQo+Pj4+IC1FWFBP UlRfU1lNQk9MKF9fY2hhc2hfdGFibGVfY29weV9pbik7DQo+Pj4+IC0NCj4+Pj4gLWludCBfX2No YXNoX3RhYmxlX2NvcHlfb3V0KHN0cnVjdCBfX2NoYXNoX3RhYmxlICp0YWJsZSwgdTY0IGtleSwN Cj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdm9pZCAqdmFsdWUsIGJvb2wgcmVt b3ZlKQ0KPj4+PiAtew0KPj4+PiAtwqDCoMKgIHUzMiBoYXNoID0gKHRhYmxlLT5rZXlfc2l6ZSA9 PSA0KSA/DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCBoYXNoXzMyKGtleSwgdGFibGUtPmJpdHMpIDog aGFzaF82NChrZXksIHRhYmxlLT5iaXRzKTsNCj4+Pj4gLcKgwqDCoCBzdHJ1Y3QgY2hhc2hfaXRl ciBpdGVyID0gQ0hBU0hfSVRFUl9JTklUKHRhYmxlLCBoYXNoKTsNCj4+Pj4gLcKgwqDCoCBpbnQg ciA9IGNoYXNoX3RhYmxlX2ZpbmQoJml0ZXIsIGtleSwgcmVtb3ZlKTsNCj4+Pj4gLQ0KPj4+PiAt wqDCoMKgIGlmIChyIDwgMCkNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybiByOw0KPj4+PiAt DQo+Pj4+IC3CoMKgwqAgaWYgKHZhbHVlICYmIHRhYmxlLT52YWx1ZV9zaXplKQ0KPj4+PiAtwqDC oMKgwqDCoMKgwqAgbWVtY3B5KHZhbHVlLCBjaGFzaF9pdGVyX3ZhbHVlKGl0ZXIpLCB0YWJsZS0+ dmFsdWVfc2l6ZSk7DQo+Pj4+IC0NCj4+Pj4gLcKgwqDCoCBpZiAocmVtb3ZlKQ0KPj4+PiAtwqDC oMKgwqDCoMKgwqAgY2hhc2hfaXRlcl9zZXRfaW52YWxpZChpdGVyKTsNCj4+Pj4gLQ0KPj4+PiAt wqDCoMKgIHJldHVybiBpdGVyLnNsb3Q7DQo+Pj4+IC19DQo+Pj4+IC1FWFBPUlRfU1lNQk9MKF9f Y2hhc2hfdGFibGVfY29weV9vdXQpOw0KPj4+PiAtDQo+Pj4+IC0jaWZkZWYgQ09ORklHX0NIQVNI X1NFTEZURVNUDQo+Pj4+IC0vKioNCj4+Pj4gLSAqIGNoYXNoX3NlbGZfdGVzdCAtIFJ1biBhIHNl bGYtdGVzdCBvZiB0aGUgaGFzaCB0YWJsZSBpbXBsZW1lbnRhdGlvbg0KPj4+PiAtICogQGJpdHM6 IFRhYmxlIHNpemUgd2lsbCBiZSAyXmJpdHMgZW50cmllcw0KPj4+PiAtICogQGtleV9zaXplOiBT aXplIG9mIGhhc2gga2V5cyBpbiBieXRlcywgNCBvciA4DQo+Pj4+IC0gKiBAbWluX2ZpbGw6IE1p bmltdW0gZmlsbCBsZXZlbCBkdXJpbmcgdGhlIHRlc3QNCj4+Pj4gLSAqIEBtYXhfZmlsbDogTWF4 aW11bSBmaWxsIGxldmVsIGR1cmluZyB0aGUgdGVzdA0KPj4+PiAtICogQGl0ZXJhdGlvbnM6IE51 bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMNCj4+Pj4gLSAqDQo+Pj4+IC0gKiBUaGUgdGVzdCBhZGRz IGFuZCByZW1vdmVzIGVudHJpZXMgZnJvbSBhIGhhc2ggdGFibGUsIGN5Y2xpbmcgdGhlDQo+Pj4+ IC0gKiBmaWxsIGxldmVsIGJldHdlZW4gbWluX2ZpbGwgYW5kIG1heF9maWxsIGVudHJpZXMuIEFs c28gdGVzdHMgbG9va3VwDQo+Pj4+IC0gKiBhbmQgdmFsdWUgcmV0cmlldmFsLg0KPj4+PiAtICov DQo+Pj4+IC1zdGF0aWMgaW50IF9faW5pdCBjaGFzaF9zZWxmX3Rlc3QodTggYml0cywgdTgga2V5 X3NpemUsDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGludCBtaW5f ZmlsbCwgaW50IG1heF9maWxsLA0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCB1NjQgaXRlcmF0aW9ucykNCj4+Pj4gLXsNCj4+Pj4gLcKgwqDCoCBzdHJ1Y3QgY2hhc2hf dGFibGUgdGFibGU7DQo+Pj4+IC3CoMKgwqAgaW50IHJldDsNCj4+Pj4gLcKgwqDCoCB1NjQgYWRk X2NvdW50LCBybXZfY291bnQ7DQo+Pj4+IC3CoMKgwqAgdTY0IHZhbHVlOw0KPj4+PiAtDQo+Pj4+ IC3CoMKgwqAgaWYgKGtleV9zaXplID09IDQgJiYgaXRlcmF0aW9ucyA+IDB4ZmZmZmZmZmYpDQo+ Pj4+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVJTlZBTDsNCj4+Pj4gLcKgwqDCoCBpZiAobWlu X2ZpbGwgPj0gbWF4X2ZpbGwpDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVJTlZBTDsN Cj4+Pj4gLQ0KPj4+PiAtwqDCoMKgIHJldCA9IGNoYXNoX3RhYmxlX2FsbG9jKCZ0YWJsZSwgYml0 cywga2V5X3NpemUsIHNpemVvZih1NjQpLA0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIEdGUF9LRVJORUwpOw0KPj4+PiAtwqDCoMKgIGlmIChyZXQpIHsNCj4+Pj4gLcKgwqDC oMKgwqDCoMKgIHByX2VycigiY2hhc2hfdGFibGVfYWxsb2MgZmFpbGVkOiAlZFxuIiwgcmV0KTsN Cj4+Pj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybiByZXQ7DQo+Pj4+IC3CoMKgwqAgfQ0KPj4+PiAt DQo+Pj4+IC3CoMKgwqAgZm9yIChhZGRfY291bnQgPSAwLCBybXZfY291bnQgPSAwOyBhZGRfY291 bnQgPCBpdGVyYXRpb25zOw0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoCBhZGRfY291bnQrKykgew0K Pj4+PiAtwqDCoMKgwqDCoMKgwqAgLyogV2hlbiB3ZSBoaXQgdGhlIG1heF9maWxsIGxldmVsLCBy ZW1vdmUgZW50cmllcyBkb3duDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgICogdG8gbWluX2ZpbGwN Cj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqAgKi8NCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIGlmIChhZGRf Y291bnQgLSBybXZfY291bnQgPT0gbWF4X2ZpbGwpIHsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgdTY0IGZpbmRfY291bnQgPSBybXZfY291bnQ7DQo+Pj4+IC0NCj4+Pj4gLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgLyogRmlyc3QgdHJ5IHRvIGZpbmQgYWxsIGVudHJpZXMgdGhhdCB3ZSdy ZQ0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogYWJvdXQgdG8gcmVtb3ZlLCBjb25m aXJtIHRoZWlyIHZhbHVlLCB0ZXN0DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiB3 cml0aW5nIHRoZW0gYmFjayBhIHNlY29uZCB0aW1lLg0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgICovDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZvciAoOyBhZGRfY291bnQg LSBmaW5kX2NvdW50ID4gbWluX2ZpbGw7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBmaW5kX2NvdW50KyspIHsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCByZXQgPSBjaGFzaF90YWJsZV9jb3B5X291dCgmdGFibGUsIGZpbmRfY291bnQsDQo+Pj4+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgJnZhbHVlKTsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAo cmV0IDwgMCkgew0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg cHJfZXJyKCJjaGFzaF90YWJsZV9jb3B5X291dCBmYWlsZWQ6ICVkXG4iLA0KPj4+PiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXQpOw0KPj4+ PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZ290byBvdXQ7DQo+Pj4+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQ0KPj4+PiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGlmICh2YWx1ZSAhPSB+ZmluZF9jb3VudCkgew0KPj4+PiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHJfZXJyKCJXcm9uZyB2YWx1ZSByZXRy aWV2ZWQgZm9yIGtleSAweCVsbHgsDQo+Pj4+IGV4cGVjdGVkIDB4JWxseCBnb3QgMHglbGx4XG4i LA0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBmaW5kX2NvdW50LCB+ZmluZF9jb3VudCwgdmFsdWUpOw0KPj4+PiAtI2lmZGVmIENIQVNI X0RFQlVHDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjaGFz aF90YWJsZV9kdW1wKCZ0YWJsZS50YWJsZSk7DQo+Pj4+IC0jZW5kaWYNCj4+Pj4gLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldCA9IC1FRkFVTFQ7DQo+Pj4+IC3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIG91dDsNCj4+Pj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgcmV0ID0gY2hhc2hfdGFibGVfY29weV9pbigmdGFibGUsIGZpbmRfY291bnQsDQo+ Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgICZ2YWx1ZSk7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYg KHJldCAhPSAxKSB7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBwcl9lcnIoImNvcHlfaW4gc2Vjb25kIHRpbWUgcmV0dXJuZWQgJWQsDQo+Pj4+IGV4cGVjdGVk IDFcbiIsDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHJldCk7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCByZXQgPSAtRUZBVUxUOw0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgZ290byBvdXQ7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg fQ0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgIC8qIFJlbW92ZSB0aGVtIHVudGlsIHdlIGhpdCBtaW5fZmlsbCBsZXZlbCAqLw0KPj4+ PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmb3IgKDsgYWRkX2NvdW50IC0gcm12X2NvdW50ID4g bWluX2ZpbGw7IHJtdl9jb3VudCsrKSB7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgcmV0ID0gY2hhc2hfdGFibGVfcmVtb3ZlKCZ0YWJsZSwgcm12X2NvdW50LA0KPj4+PiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg TlVMTCk7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKHJldCA8IDAp IHsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHByX2Vycigi Y2hhc2hfdGFibGVfcmVtb3ZlIGZhaWxlZDogJWRcbiIsDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldCk7DQo+Pj4+IC3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIG91dDsNCj4+Pj4gLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0N Cj4+Pj4gLcKgwqDCoMKgwqDCoMKgIH0NCj4+Pj4gLQ0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgLyog QWRkIGEgbmV3IHZhbHVlICovDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCB2YWx1ZSA9IH5hZGRfY291 bnQ7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCByZXQgPSBjaGFzaF90YWJsZV9jb3B5X2luKCZ0YWJs ZSwgYWRkX2NvdW50LCAmdmFsdWUpOw0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgaWYgKHJldCAhPSAw KSB7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHByX2VycigiY29weV9pbiBmaXJzdCB0 aW1lIHJldHVybmVkICVkLCBleHBlY3RlZCAwXG4iLA0KPj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHJldCk7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJl dCA9IC1FRkFVTFQ7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gb3V0Ow0KPj4+ PiAtwqDCoMKgwqDCoMKgwqAgfQ0KPj4+PiAtwqDCoMKgIH0NCj4+Pj4gLQ0KPj4+PiAtwqDCoMKg IGNoYXNoX3RhYmxlX2R1bXBfc3RhdHMoJnRhYmxlKTsNCj4+Pj4gLcKgwqDCoCBjaGFzaF90YWJs ZV9yZXNldF9zdGF0cygmdGFibGUpOw0KPj4+PiAtDQo+Pj4+IC1vdXQ6DQo+Pj4+IC3CoMKgwqAg Y2hhc2hfdGFibGVfZnJlZSgmdGFibGUpOw0KPj4+PiAtwqDCoMKgIHJldHVybiByZXQ7DQo+Pj4+ IC19DQo+Pj4+IC0NCj4+Pj4gLXN0YXRpYyB1bnNpZ25lZCBpbnQgY2hhc2hfdGVzdF9iaXRzID0g MTA7DQo+Pj4+IC1NT0RVTEVfUEFSTV9ERVNDKHRlc3RfYml0cywNCj4+Pj4gLcKgwqDCoMKgwqDC oMKgwqAgIlNlbGZ0ZXN0IG51bWJlciBvZiBoYXNoIGJpdHMgKFs0Li4yMF0sIGRlZmF1bHQ9MTAp Iik7DQo+Pj4+IC1tb2R1bGVfcGFyYW1fbmFtZWQodGVzdF9iaXRzLCBjaGFzaF90ZXN0X2JpdHMs IHVpbnQsIDA0NDQpOw0KPj4+PiAtDQo+Pj4+IC1zdGF0aWMgdW5zaWduZWQgaW50IGNoYXNoX3Rl c3Rfa2V5c2l6ZSA9IDg7DQo+Pj4+IC1NT0RVTEVfUEFSTV9ERVNDKHRlc3Rfa2V5c2l6ZSwgIlNl bGZ0ZXN0IGtleXNpemUgKDQgb3IgOCwNCj4+Pj4gZGVmYXVsdD04KSIpOw0KPj4+PiAtbW9kdWxl X3BhcmFtX25hbWVkKHRlc3Rfa2V5c2l6ZSwgY2hhc2hfdGVzdF9rZXlzaXplLCB1aW50LCAwNDQ0 KTsNCj4+Pj4gLQ0KPj4+PiAtc3RhdGljIHVuc2lnbmVkIGludCBjaGFzaF90ZXN0X21pbmZpbGw7 DQo+Pj4+IC1NT0RVTEVfUEFSTV9ERVNDKHRlc3RfbWluZmlsbCwgIlNlbGZ0ZXN0IG1pbmltdW0g I2VudHJpZXMNCj4+Pj4gKGRlZmF1bHQ9NTAlKSIpOw0KPj4+PiAtbW9kdWxlX3BhcmFtX25hbWVk KHRlc3RfbWluZmlsbCwgY2hhc2hfdGVzdF9taW5maWxsLCB1aW50LCAwNDQ0KTsNCj4+Pj4gLQ0K Pj4+PiAtc3RhdGljIHVuc2lnbmVkIGludCBjaGFzaF90ZXN0X21heGZpbGw7DQo+Pj4+IC1NT0RV TEVfUEFSTV9ERVNDKHRlc3RfbWF4ZmlsbCwgIlNlbGZ0ZXN0IG1heGltdW0gI2VudHJpZXMNCj4+ Pj4gKGRlZmF1bHQ9ODAlKSIpOw0KPj4+PiAtbW9kdWxlX3BhcmFtX25hbWVkKHRlc3RfbWF4Zmls bCwgY2hhc2hfdGVzdF9tYXhmaWxsLCB1aW50LCAwNDQ0KTsNCj4+Pj4gLQ0KPj4+PiAtc3RhdGlj IHVuc2lnbmVkIGxvbmcgY2hhc2hfdGVzdF9pdGVyczsNCj4+Pj4gLU1PRFVMRV9QQVJNX0RFU0Mo dGVzdF9pdGVycywgIlNlbGZ0ZXN0IGl0ZXJhdGlvbnMgKGRlZmF1bHQ9MTAwMCB4DQo+Pj4+ICNl bnRyaWVzKSIpOw0KPj4+PiAtbW9kdWxlX3BhcmFtX25hbWVkKHRlc3RfaXRlcnMsIGNoYXNoX3Rl c3RfaXRlcnMsIHVsb25nLCAwNDQ0KTsNCj4+Pj4gLQ0KPj4+PiAtc3RhdGljIGludCBfX2luaXQg Y2hhc2hfaW5pdCh2b2lkKQ0KPj4+PiAtew0KPj4+PiAtwqDCoMKgIGludCByZXQ7DQo+Pj4+IC3C oMKgwqAgdTY0IHRzMV9uczsNCj4+Pj4gLQ0KPj4+PiAtwqDCoMKgIC8qIFNraXAgc2VsZiB0ZXN0 IG9uIHVzZXIgZXJyb3JzICovDQo+Pj4+IC3CoMKgwqAgaWYgKGNoYXNoX3Rlc3RfYml0cyA8IDQg fHwgY2hhc2hfdGVzdF9iaXRzID4gMjApIHsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIHByX2Vycigi Y2hhc2g6IHRlc3RfYml0cyBvdXQgb2YgcmFuZ2UgWzQuLjIwXS5cbiIpOw0KPj4+PiAtwqDCoMKg wqDCoMKgwqAgcmV0dXJuIDA7DQo+Pj4+IC3CoMKgwqAgfQ0KPj4+PiAtwqDCoMKgIGlmIChjaGFz aF90ZXN0X2tleXNpemUgIT0gNCAmJiBjaGFzaF90ZXN0X2tleXNpemUgIT0gOCkgew0KPj4+PiAt wqDCoMKgwqDCoMKgwqAgcHJfZXJyKCJjaGFzaDogdGVzdF9rZXlzaXplIGludmFsaWQuIE11c3Qg YmUgNCBvciA4LlxuIik7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm4gMDsNCj4+Pj4gLcKg wqDCoCB9DQo+Pj4+IC0NCj4+Pj4gLcKgwqDCoCBpZiAoIWNoYXNoX3Rlc3RfbWluZmlsbCkNCj4+ Pj4gLcKgwqDCoMKgwqDCoMKgIGNoYXNoX3Rlc3RfbWluZmlsbCA9ICgxIDw8IGNoYXNoX3Rlc3Rf Yml0cykgLyAyOw0KPj4+PiAtwqDCoMKgIGlmICghY2hhc2hfdGVzdF9tYXhmaWxsKQ0KPj4+PiAt wqDCoMKgwqDCoMKgwqAgY2hhc2hfdGVzdF9tYXhmaWxsID0gKDEgPDwgY2hhc2hfdGVzdF9iaXRz KSAqIDQgLyA1Ow0KPj4+PiAtwqDCoMKgIGlmICghY2hhc2hfdGVzdF9pdGVycykNCj4+Pj4gLcKg wqDCoMKgwqDCoMKgIGNoYXNoX3Rlc3RfaXRlcnMgPSAoMSA8PCBjaGFzaF90ZXN0X2JpdHMpICog MTAwMDsNCj4+Pj4gLQ0KPj4+PiAtwqDCoMKgIGlmIChjaGFzaF90ZXN0X21pbmZpbGwgPj0gKDEg PDwgY2hhc2hfdGVzdF9iaXRzKSkgew0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgcHJfZXJyKCJjaGFz aDogdGVzdF9taW5maWxsIHRvbyBiaWcuIE11c3QgYmUgPCB0YWJsZQ0KPj4+PiBzaXplLlxuIik7 DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm4gMDsNCj4+Pj4gLcKgwqDCoCB9DQo+Pj4+IC3C oMKgwqAgaWYgKGNoYXNoX3Rlc3RfbWF4ZmlsbCA+PSAoMSA8PCBjaGFzaF90ZXN0X2JpdHMpKSB7 DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCBwcl9lcnIoImNoYXNoOiB0ZXN0X21heGZpbGwgdG9vIGJp Zy4gTXVzdCBiZSA8IHRhYmxlDQo+Pj4+IHNpemUuXG4iKTsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKg IHJldHVybiAwOw0KPj4+PiAtwqDCoMKgIH0NCj4+Pj4gLcKgwqDCoCBpZiAoY2hhc2hfdGVzdF9t aW5maWxsID49IGNoYXNoX3Rlc3RfbWF4ZmlsbCkgew0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgcHJf ZXJyKCJjaGFzaDogdGVzdF9taW5maWxsIG11c3QgYmUgPCB0ZXN0X21heGZpbGwuXG4iKTsNCj4+ Pj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybiAwOw0KPj4+PiAtwqDCoMKgIH0NCj4+Pj4gLcKgwqDC oCBpZiAoY2hhc2hfdGVzdF9rZXlzaXplID09IDQgJiYgY2hhc2hfdGVzdF9pdGVycyA+IDB4ZmZm ZmZmZmYpIHsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKgIHByX2VycigiY2hhc2g6IHRlc3RfaXRlcnMg bXVzdCBiZSA8IDRHIGZvciA0IGJ5dGUga2V5cy5cbiIpOw0KPj4+PiAtwqDCoMKgwqDCoMKgwqAg cmV0dXJuIDA7DQo+Pj4+IC3CoMKgwqAgfQ0KPj4+PiAtDQo+Pj4+IC3CoMKgwqAgdHMxX25zID0g bG9jYWxfY2xvY2soKTsNCj4+Pj4gLcKgwqDCoCByZXQgPSBjaGFzaF9zZWxmX3Rlc3QoY2hhc2hf dGVzdF9iaXRzLCBjaGFzaF90ZXN0X2tleXNpemUsDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGNoYXNoX3Rlc3RfbWluZmlsbCwgY2hhc2hfdGVzdF9tYXhmaWxsLA0K Pj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjaGFzaF90ZXN0X2l0ZXJz KTsNCj4+Pj4gLcKgwqDCoCBpZiAoIXJldCkgew0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgdTY0IHRz X2RlbHRhX3VzID0gbG9jYWxfY2xvY2soKSAtIHRzMV9uczsNCj4+Pj4gLcKgwqDCoMKgwqDCoMKg IHU2NCBpdGVyc19wZXJfc2Vjb25kID0gKHU2NCljaGFzaF90ZXN0X2l0ZXJzICogMTAwMDAwMDsN Cj4+Pj4gLQ0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgZG9fZGl2KHRzX2RlbHRhX3VzLCAxMDAwKTsN Cj4+Pj4gLcKgwqDCoMKgwqDCoMKgIGRvX2RpdihpdGVyc19wZXJfc2Vjb25kLCB0c19kZWx0YV91 cyk7DQo+Pj4+IC3CoMKgwqDCoMKgwqDCoCBwcl9pbmZvKCJjaGFzaDogc2VsZiB0ZXN0IHRvb2sg JWxsdSB1cywgJWxsdSBpdGVyYXRpb25zL3NcbiIsDQo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHRzX2RlbHRhX3VzLCBpdGVyc19wZXJfc2Vjb25kKTsNCj4+Pj4gLcKgwqDCoCB9IGVsc2Ug ew0KPj4+PiAtwqDCoMKgwqDCoMKgwqAgcHJfZXJyKCJjaGFzaDogc2VsZiB0ZXN0IGZhaWxlZDog JWRcbiIsIHJldCk7DQo+Pj4+IC3CoMKgwqAgfQ0KPj4+PiAtDQo+Pj4+IC3CoMKgwqAgcmV0dXJu IHJldDsNCj4+Pj4gLX0NCj4+Pj4gLQ0KPj4+PiAtbW9kdWxlX2luaXQoY2hhc2hfaW5pdCk7DQo+ Pj4+IC0NCj4+Pj4gLSNlbmRpZiAvKiBDT05GSUdfQ0hBU0hfU0VMRlRFU1QgKi8NCj4+Pj4gLQ0K Pj4+PiAtTU9EVUxFX0RFU0NSSVBUSU9OKCJDbG9zZWQgaGFzaCB0YWJsZSIpOw0KPj4+PiAtTU9E VUxFX0xJQ0VOU0UoIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiKTsNCg0KX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KYW1kLWdmeCBtYWlsaW5nIGxpc3QK YW1kLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5v cmcvbWFpbG1hbi9saXN0aW5mby9hbWQtZ2Z4Cg==